From fe21334d3b2a4ca7413a9496427d57980dd43688 Mon Sep 17 00:00:00 2001 From: Hasan Wan Date: Fri, 25 May 2012 16:47:11 +0800 Subject: [PATCH] Updated with Tizen:Base source codes --- BUGS | 22 + COPYING | 674 + CREDITS | 408 + ChangeLog | 1826 + INSTALL | 291 + Makefile.am | 80 + Makefile.in | 822 + NEWS | 1627 + README | 1589 + README.configure | 473 + STANDARDS | 615 + TODO | 160 + Watchdog/BUGS | 2 + Watchdog/COPYING | 674 + Watchdog/CREDITS | 12 + Watchdog/ChangeLog | 463 + Watchdog/INSTALL | 291 + Watchdog/Makefile.am | 61 + Watchdog/Makefile.in | 714 + Watchdog/NEWS | 83 + Watchdog/README | 139 + Watchdog/aclocal.m4 | 7514 ++ Watchdog/compile | 142 + Watchdog/config.guess | 1529 + Watchdog/config.h.in | 84 + Watchdog/config.rpath | 666 + Watchdog/config.sub | 1677 + Watchdog/configure | 19656 ++++ Watchdog/configure.ac | 417 + Watchdog/depcomp | 589 + Watchdog/doc/Makefile.am | 281 + Watchdog/doc/Makefile.in | 617 + Watchdog/doc/README.doc | 139 + Watchdog/doc/devref.doxyconf-html.in | 284 + Watchdog/doc/devref.doxyconf-latex.in | 284 + Watchdog/doc/devref.tex | 120 + Watchdog/doc/fdl.dox | 407 + Watchdog/doc/fdl.pdf | Bin 0 -> 56411 bytes Watchdog/doc/fdl.ps.gz | Bin 0 -> 63642 bytes Watchdog/doc/fdl.tex | 454 + Watchdog/doc/fdl.txt | 397 + Watchdog/doc/gpl.dox | 686 + Watchdog/doc/gpl.pdf | Bin 0 -> 69557 bytes Watchdog/doc/gpl.ps.gz | Bin 0 -> 80241 bytes Watchdog/doc/gpl.tex | 728 + Watchdog/doc/gpl.txt | 674 + Watchdog/doc/pwl-user-0.7-html.tar.gz | Bin 0 -> 69710 bytes Watchdog/doc/pwl-user-0.7.pdf | Bin 0 -> 241944 bytes Watchdog/doc/pwl-user-0.7.ps.gz | Bin 0 -> 174050 bytes Watchdog/doc/pwl.sty | 178 + Watchdog/doc/user.doxyconf-html.in | 255 + Watchdog/doc/user.doxyconf-latex.in | 255 + Watchdog/doc/user.tex | 120 + Watchdog/install-sh | 519 + Watchdog/ltmain.sh | 8406 ++ Watchdog/m4/Makefile.am | 37 + Watchdog/m4/Makefile.in | 406 + Watchdog/m4/lib-ld.m4 | 110 + Watchdog/m4/lib-link.m4 | 553 + Watchdog/m4/libtool.m4 | 7357 ++ Watchdog/m4/ltoptions.m4 | 368 + Watchdog/m4/ltsugar.m4 | 123 + Watchdog/m4/ltversion.m4 | 23 + Watchdog/m4/lt~obsolete.m4 | 92 + Watchdog/missing | 367 + Watchdog/mkinstalldirs | 161 + Watchdog/pwl-config.h.in | 84 + Watchdog/pwl-config.sed | 21 + Watchdog/src/Doubly_Linked_Object.defs.hh | 64 + Watchdog/src/Doubly_Linked_Object.inlines.hh | 69 + Watchdog/src/Doubly_Linked_Object.types.hh | 21 + Watchdog/src/EList.defs.hh | 87 + Watchdog/src/EList.inlines.hh | 112 + Watchdog/src/EList.types.hh | 22 + Watchdog/src/EList_Iterator.defs.hh | 83 + Watchdog/src/EList_Iterator.inlines.hh | 104 + Watchdog/src/EList_Iterator.types.hh | 22 + Watchdog/src/Handler.defs.hh | 90 + Watchdog/src/Handler.inlines.hh | 57 + Watchdog/src/Handler.types.hh | 26 + Watchdog/src/Makefile.am | 150 + Watchdog/src/Makefile.in | 659 + Watchdog/src/Pending_Element.cc | 32 + Watchdog/src/Pending_Element.defs.hh | 75 + Watchdog/src/Pending_Element.inlines.hh | 63 + Watchdog/src/Pending_Element.types.hh | 21 + Watchdog/src/Pending_List.cc | 75 + Watchdog/src/Pending_List.defs.hh | 74 + Watchdog/src/Pending_List.inlines.hh | 65 + Watchdog/src/Pending_List.types.hh | 21 + Watchdog/src/Time.cc | 32 + Watchdog/src/Time.defs.hh | 111 + Watchdog/src/Time.inlines.hh | 144 + Watchdog/src/Time.types.hh | 21 + Watchdog/src/Watchdog.cc | 252 + Watchdog/src/Watchdog.defs.hh | 139 + Watchdog/src/Watchdog.inlines.hh | 80 + Watchdog/src/Watchdog.types.hh | 21 + Watchdog/src/pwl.hh.dist | 1348 + Watchdog/src/pwl_header.hh | 46 + Watchdog/tests/Makefile.am | 72 + Watchdog/tests/Makefile.in | 594 + Watchdog/tests/pwl_test.cc | 144 + Watchdog/tests/pwl_test.hh | 205 + Watchdog/tests/simple1.cc | 71 + Watchdog/tests/valgrind_suppressions | 18 + Watchdog/utils/Makefile.am | 45 + Watchdog/utils/Makefile.in | 390 + Watchdog/utils/build_header.in | 102 + aclocal.m4 | 7556 ++ compile | 142 + config.guess | 1529 + config.h.in | 393 + config.rpath | 666 + config.sub | 1677 + configure | 35459 ++++++++ configure.ac | 1627 + demos/Makefile.am | 31 + demos/Makefile.in | 603 + demos/ppl_lcdd/Makefile.am | 132 + demos/ppl_lcdd/Makefile.in | 840 + demos/ppl_lcdd/examples/1d.ine | 5 + demos/ppl_lcdd/examples/1da.ine | 6 + demos/ppl_lcdd/examples/Makefile.am | 135 + demos/ppl_lcdd/examples/Makefile.in | 558 + 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 | 65 + demos/ppl_lcdd/ppl_lcdd.cc | 1344 + demos/ppl_lpsol/Makefile.am | 310 + demos/ppl_lpsol/Makefile.in | 1021 + demos/ppl_lpsol/dummy.cc | 1 + demos/ppl_lpsol/examples/Makefile.am | 51 + demos/ppl_lpsol/examples/Makefile.in | 475 + 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 | 359 + 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 | 19 + 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 | 22 + demos/ppl_lpsol/examples/sc105.mps | 296 + demos/ppl_lpsol/examples/sc50a.mps | 141 + demos/ppl_lpsol/examples/sc50b.mps | 127 + demos/ppl_lpsol/examples/ship08l.mps | 9547 ++ demos/ppl_lpsol/examples/unboundedmin.mps | 19 + demos/ppl_lpsol/expected_int16 | 973 + demos/ppl_lpsol/expected_int16_a | 181 + demos/ppl_lpsol/expected_int32 | 993 + demos/ppl_lpsol/expected_int32_a | 205 + demos/ppl_lpsol/expected_int64 | 993 + demos/ppl_lpsol/expected_int64_a | 205 + demos/ppl_lpsol/expected_int8 | 177 + demos/ppl_lpsol/expected_int8_a | 159 + demos/ppl_lpsol/expected_mpz | 5109 ++ demos/ppl_lpsol/expected_mpz_a | 3518 + demos/ppl_lpsol/ppl_lpsol.1 | 97 + demos/ppl_lpsol/ppl_lpsol.c | 1393 + depcomp | 589 + doc/Makefile.am | 1637 + doc/Makefile.in | 2150 + doc/README.doc | 164 + doc/definitions.dox | 4679 + doc/devref-language-interface.doxyconf.in | 255 + doc/devref-language-interface.tex | 135 + doc/devref.doxyconf-html.in | 486 + doc/devref.doxyconf-latex.in | 486 + doc/devref.tex | 144 + doc/fdl.dox | 412 + doc/fdl.pdf | Bin 0 -> 56411 bytes doc/fdl.ps.gz | Bin 0 -> 63642 bytes doc/fdl.tex | 454 + doc/fdl.txt | 397 + doc/gpl.dox | 691 + doc/gpl.pdf | Bin 0 -> 69557 bytes doc/gpl.ps.gz | Bin 0 -> 80241 bytes doc/gpl.tex | 728 + doc/gpl.txt | 674 + doc/interfaces-html.sed | 4 + doc/interfaces-latex.sed | 4 + doc/libppl.3 | 225 + doc/libppl_c.3 | 161 + doc/ppl-config.1 | 141 + doc/ppl-user-0.10.2-html.tar.gz | Bin 0 -> 859476 bytes doc/ppl-user-0.10.2.pdf | 89805 +++++++++++++++++++ doc/ppl-user-0.10.2.ps.gz | Bin 0 -> 1193762 bytes doc/ppl-user-c-interface-0.10.2-html.tar.gz | Bin 0 -> 166485 bytes doc/ppl-user-c-interface-0.10.2.pdf | 21645 +++++ doc/ppl-user-c-interface-0.10.2.ps.gz | Bin 0 -> 325241 bytes doc/ppl-user-java-interface-0.10.2-html.tar.gz | Bin 0 -> 166033 bytes doc/ppl-user-java-interface-0.10.2.pdf | 19040 ++++ doc/ppl-user-java-interface-0.10.2.ps.gz | Bin 0 -> 324612 bytes doc/ppl-user-ocaml-interface-0.10.2-html.tar.gz | Bin 0 -> 71090 bytes doc/ppl-user-ocaml-interface-0.10.2.pdf | Bin 0 -> 239601 bytes doc/ppl-user-ocaml-interface-0.10.2.ps.gz | Bin 0 -> 196053 bytes doc/ppl-user-prolog-interface-0.10.2-html.tar.gz | Bin 0 -> 72546 bytes doc/ppl-user-prolog-interface-0.10.2.pdf | Bin 0 -> 257972 bytes doc/ppl-user-prolog-interface-0.10.2.ps.gz | Bin 0 -> 230915 bytes doc/ppl.sty | 178 + doc/user-language-interface.doxyconf.in | 259 + doc/user-language-interface.tex | 135 + doc/user.doxyconf-html.in | 256 + doc/user.doxyconf-latex.in | 256 + doc/user.tex | 144 + install-sh | 519 + instchk.hh | 380 + interfaces/C/C_interface.dox | 1689 + interfaces/C/Makefile.am | 251 + interfaces/C/Makefile.in | 1030 + interfaces/C/ppl_c_header.h | 2489 + interfaces/C/ppl_c_implementation_common.cc | 2054 + interfaces/C/ppl_c_implementation_common.defs.hh | 216 + .../C/ppl_c_implementation_common.inlines.hh | 149 + interfaces/C/ppl_c_version.h.in | 62 + interfaces/C/ppl_interface_generator_c_cc_code.m4 | 1196 + interfaces/C/ppl_interface_generator_c_cc_files.m4 | 67 + interfaces/C/ppl_interface_generator_c_h.m4 | 71 + interfaces/C/ppl_interface_generator_c_h_code.m4 | 744 + interfaces/C/ppl_interface_generator_c_hh_files.m4 | 80 + ...l_interface_generator_c_procedure_generators.m4 | 50 + interfaces/C/tests/Makefile.am | 116 + interfaces/C/tests/Makefile.in | 771 + interfaces/C/tests/formatted_output.c | 63 + interfaces/C/tests/ppl_c_test.cc | 70 + interfaces/C/tests/ppl_c_test.h | 40 + interfaces/C/tests/print_to_buffer.c | 65 + interfaces/C/tests/print_to_buffer.h | 79 + interfaces/Java/Makefile.am | 45 + interfaces/Java/Makefile.in | 652 + interfaces/Java/README.java | 26 + interfaces/Java/jni/Makefile.am | 183 + interfaces/Java/jni/Makefile.in | 818 + ...ppl_interface_generator_java_classes_cc_code.m4 | 1247 + ...pl_interface_generator_java_classes_cc_files.m4 | 71 + interfaces/Java/jni/ppl_java_common.cc | 1242 + interfaces/Java/jni/ppl_java_common.defs.hh | 497 + interfaces/Java/jni/ppl_java_common.inlines.hh | 202 + interfaces/Java/jni/ppl_java_globals.cc | 737 + .../Java/parma_polyhedra_library/By_Reference.java | 52 + .../Java/parma_polyhedra_library/Coefficient.java | 75 + .../parma_polyhedra_library/Complexity_Class.java | 34 + .../Java/parma_polyhedra_library/Congruence.java | 68 + .../parma_polyhedra_library/Congruence_System.java | 43 + .../Java/parma_polyhedra_library/Constraint.java | 77 + .../parma_polyhedra_library/Constraint_System.java | 44 + .../Control_Parameter_Name.java | 30 + .../Control_Parameter_Value.java | 34 + .../Degenerate_Element.java | 32 + .../Domain_Error_Exception.java | 32 + .../Fake_Class_for_Doxygen.java | 1291 + .../Java/parma_polyhedra_library/Generator.java | 141 + .../parma_polyhedra_library/Generator_System.java | 45 + .../parma_polyhedra_library/Generator_Type.java | 36 + .../parma_polyhedra_library/Grid_Generator.java | 101 + .../Grid_Generator_System.java | 45 + .../Grid_Generator_Type.java | 34 + interfaces/Java/parma_polyhedra_library/IO.java | 47 + .../Invalid_Argument_Exception.java | 33 + .../Length_Error_Exception.java | 32 + .../parma_polyhedra_library/Linear_Expression.java | 65 + .../Linear_Expression_Coefficient.java | 48 + .../Linear_Expression_Difference.java | 60 + .../Linear_Expression_Sum.java | 56 + .../Linear_Expression_Times.java | 57 + .../Linear_Expression_Unary_Minus.java | 49 + .../Linear_Expression_Variable.java | 47 + .../Logic_Error_Exception.java | 36 + .../Java/parma_polyhedra_library/MIP_Problem.java | 324 + .../MIP_Problem_Status.java | 34 + .../Java/parma_polyhedra_library/Makefile.am | 207 + .../Java/parma_polyhedra_library/Makefile.in | 633 + .../parma_polyhedra_library/Optimization_Mode.java | 32 + .../Overflow_Error_Exception.java | 35 + .../Java/parma_polyhedra_library/PPL_Object.java | 40 + interfaces/Java/parma_polyhedra_library/Pair.java | 46 + .../Parma_Polyhedra_Library.java | 184 + .../parma_polyhedra_library/Partial_Function.java | 59 + .../parma_polyhedra_library/Poly_Con_Relation.java | 87 + .../parma_polyhedra_library/Poly_Gen_Relation.java | 57 + .../parma_polyhedra_library/Relation_Symbol.java | 38 + .../Java/parma_polyhedra_library/Variable.java | 69 + .../parma_polyhedra_library/Variables_Set.java | 31 + .../ppl_interface_generator_java_classes_java.m4 | 145 + ...l_interface_generator_java_classes_java_code.m4 | 573 + ...nterface_generator_java_procedure_generators.m4 | 46 + interfaces/Java/tests/C_Polyhedron_test1.java | 107 + interfaces/Java/tests/MIP_Problem_test1.java | 278 + interfaces/Java/tests/Makefile.am | 89 + interfaces/Java/tests/Makefile.in | 528 + interfaces/Java/tests/NNC_Polyhedron_test1.java | 88 + interfaces/Java/tests/PPL_Test.java | 91 + .../Java/tests/Parma_Polyhedra_Library_test1.java | 71 + interfaces/Java/tests/Test_Executor.java | 62 + interfaces/Java/tests/Test_Partial_Function.java | 61 + .../ppl_interface_generator_java_test_java.m4 | 104 + .../ppl_interface_generator_java_test_java_code.m4 | 1002 + interfaces/Java/tests/ppl_java_tests_common | 184 + interfaces/Makefile.am | 64 + interfaces/Makefile.in | 637 + interfaces/OCaml/Makefile.am | 301 + interfaces/OCaml/Makefile.in | 1064 + interfaces/OCaml/OCaml_interface.dox | 989 + interfaces/OCaml/README.ocaml | 44 + .../OCaml/ppl_interface_generator_ocaml_cc_code.m4 | 1206 + .../ppl_interface_generator_ocaml_cc_files.m4 | 63 + .../OCaml/ppl_interface_generator_ocaml_hh_code.m4 | 65 + .../ppl_interface_generator_ocaml_hh_files.m4 | 60 + .../OCaml/ppl_interface_generator_ocaml_ml.m4 | 61 + .../OCaml/ppl_interface_generator_ocaml_ml_code.m4 | 548 + .../OCaml/ppl_interface_generator_ocaml_mli.m4 | 59 + .../ppl_interface_generator_ocaml_mli_code.m4 | 482 + ...terface_generator_ocaml_procedure_generators.m4 | 43 + interfaces/OCaml/ppl_ocaml_common.cc | 1238 + interfaces/OCaml/ppl_ocaml_common.defs.hh | 210 + interfaces/OCaml/ppl_ocaml_common.inlines.hh | 128 + interfaces/OCaml/ppl_ocaml_globals.ml | 262 + interfaces/OCaml/ppl_ocaml_globals.mli | 228 + interfaces/OCaml/tests/Makefile.am | 189 + interfaces/OCaml/tests/Makefile.in | 693 + .../tests/ppl_interface_generator_ocaml_test_ml.m4 | 60 + .../ppl_interface_generator_ocaml_test_ml_code.m4 | 886 + interfaces/OCaml/tests/ppl_ocaml_tests_common | 292 + interfaces/OCaml/tests/test1.ml | 472 + interfaces/Prolog/Ciao/Makefile.am | 329 + interfaces/Prolog/Ciao/Makefile.in | 1479 + interfaces/Prolog/Ciao/README.ciao | 4 + interfaces/Prolog/Ciao/ciao_cfli.hh | 340 + interfaces/Prolog/Ciao/ciao_clpq.pl | 55 + interfaces/Prolog/Ciao/ciao_clpq2.pl | 56 + interfaces/Prolog/Ciao/ciao_efli.cc | 98 + interfaces/Prolog/Ciao/ciao_efli.hh | 91 + interfaces/Prolog/Ciao/ciao_pl_check.pl | 175 + .../Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 | 87 + ...face_generator_ciao_prolog_generated_test_pl.m4 | 64 + interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh | 25 + interfaces/Prolog/GNU/Makefile.am | 317 + interfaces/Prolog/GNU/Makefile.in | 1489 + interfaces/Prolog/GNU/README.gprolog | 47 + interfaces/Prolog/GNU/gnu_pl_check.pl | 36 + interfaces/Prolog/GNU/gnu_prolog_generated_test.pl | 36 + interfaces/Prolog/GNU/gp_clpq.pl | 31 + interfaces/Prolog/GNU/gprolog_cfli.hh | 460 + interfaces/Prolog/GNU/gprolog_efli.cc | 81 + interfaces/Prolog/GNU/gprolog_efli.hh | 88 + .../GNU/ppl_interface_generator_gprolog_pl.m4 | 46 + interfaces/Prolog/GNU/ppl_prolog_sysdep.hh | 25 + interfaces/Prolog/Makefile.am | 138 + interfaces/Prolog/Makefile.in | 705 + interfaces/Prolog/Prolog_interface.dox | 1798 + interfaces/Prolog/SICStus/Makefile.am | 347 + interfaces/Prolog/SICStus/Makefile.in | 1499 + .../ppl_interface_generator_sicstus_sd_cc.m4 | 192 + interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh | 25 + interfaces/Prolog/SICStus/ppl_sicstus.pl | 29 + interfaces/Prolog/SICStus/sicstus_cfli.cc | 27 + interfaces/Prolog/SICStus/sicstus_cfli.h | 155 + interfaces/Prolog/SICStus/sicstus_cfli.ic | 299 + interfaces/Prolog/SICStus/sicstus_efli.cc | 106 + interfaces/Prolog/SICStus/sicstus_efli.hh | 91 + interfaces/Prolog/SICStus/sp_clpq.pl | 43 + interfaces/Prolog/SICStus/sp_pl_check.pl | 48 + .../Prolog/SICStus/sp_prolog_generated_test.pl | 48 + interfaces/Prolog/SWI/Makefile.am | 341 + interfaces/Prolog/SWI/Makefile.in | 1530 + interfaces/Prolog/SWI/README.swiprolog | 38 + interfaces/Prolog/SWI/pl_clpq.cc | 47 + interfaces/Prolog/SWI/pl_clpq.pl | 32 + .../SWI/ppl_interface_generator_swiprolog_cc.m4 | 71 + interfaces/Prolog/SWI/ppl_pl.cc | 43 + interfaces/Prolog/SWI/ppl_prolog_sysdep.hh | 25 + interfaces/Prolog/SWI/ppl_swiprolog.pl | 23 + interfaces/Prolog/SWI/swi_cfli.hh | 327 + interfaces/Prolog/SWI/swi_efli.cc | 78 + interfaces/Prolog/SWI/swi_efli.hh | 91 + interfaces/Prolog/SWI/swi_pl_check.pl | 38 + interfaces/Prolog/SWI/swi_prolog_generated_test.pl | 38 + interfaces/Prolog/XSB/Makefile.am | 321 + interfaces/Prolog/XSB/Makefile.in | 1454 + .../Prolog/XSB/ppl_interface_generator_xsb_H.m4 | 46 + .../Prolog/XSB/ppl_interface_generator_xsb_cc.m4 | 118 + .../Prolog/XSB/ppl_interface_generator_xsb_hh.m4 | 38 + ...erface_generator_xsb_prolog_generated_test_P.m4 | 85 + interfaces/Prolog/XSB/ppl_prolog_sysdep.hh | 26 + interfaces/Prolog/XSB/xsb_cfli.hh | 350 + interfaces/Prolog/XSB/xsb_clpq.P | 52 + interfaces/Prolog/XSB/xsb_clpq2.P | 53 + interfaces/Prolog/XSB/xsb_efli.cc | 80 + interfaces/Prolog/XSB/xsb_efli.hh | 88 + interfaces/Prolog/XSB/xsb_pl_check.P | 173 + interfaces/Prolog/YAP/Makefile.am | 285 + interfaces/Prolog/YAP/Makefile.in | 1437 + interfaces/Prolog/YAP/README.yap | 11 + .../Prolog/YAP/ppl_interface_generator_yap_cc.m4 | 137 + interfaces/Prolog/YAP/ppl_prolog_sysdep.hh | 25 + interfaces/Prolog/YAP/ppl_yap.pl | 23 + interfaces/Prolog/YAP/yap_cfli.hh | 348 + interfaces/Prolog/YAP/yap_clpq.pl | 30 + interfaces/Prolog/YAP/yap_clpq2.pl | 30 + interfaces/Prolog/YAP/yap_efli.cc | 94 + interfaces/Prolog/YAP/yap_efli.hh | 90 + interfaces/Prolog/YAP/yap_pl_check.pl | 34 + interfaces/Prolog/YAP/yap_prolog_generated_test.pl | 34 + .../ppl_interface_generator_prolog_cc_code.m4 | 1778 + .../ppl_interface_generator_prolog_cc_files.m4 | 60 + .../Prolog/ppl_interface_generator_prolog_dox.m4 | 372 + .../ppl_interface_generator_prolog_dox_code.m4 | 1153 + .../ppl_interface_generator_prolog_hh_code.m4 | 533 + .../ppl_interface_generator_prolog_hh_files.m4 | 66 + ...erface_generator_prolog_procedure_generators.m4 | 88 + .../ppl_interface_generator_prolog_systems.m4 | 78 + interfaces/Prolog/ppl_prolog_common.cc | 2112 + interfaces/Prolog/ppl_prolog_common.defs.hh | 853 + interfaces/Prolog/ppl_prolog_common.inlines.hh | 87 + interfaces/Prolog/ppl_prolog_sysdep_dox | 240 + interfaces/Prolog/ppl_prolog_sysindep_dox | 608 + interfaces/Prolog/tests/Makefile.am | 86 + interfaces/Prolog/tests/Makefile.in | 509 + interfaces/Prolog/tests/ack.clpq | 5 + interfaces/Prolog/tests/ackn.clpq | 6 + interfaces/Prolog/tests/clpq.pl | 801 + interfaces/Prolog/tests/clpq2.pl | 1121 + interfaces/Prolog/tests/expected_clpq2_int16 | 102 + interfaces/Prolog/tests/expected_clpq2_int16_a | 103 + interfaces/Prolog/tests/expected_clpq2_int32 | 109 + interfaces/Prolog/tests/expected_clpq2_int32_a | 102 + interfaces/Prolog/tests/expected_clpq2_int64 | 109 + interfaces/Prolog/tests/expected_clpq2_int64_a | 109 + interfaces/Prolog/tests/expected_clpq2_int8 | 101 + interfaces/Prolog/tests/expected_clpq2_int8_a | 101 + interfaces/Prolog/tests/expected_clpq2_mpz | 109 + interfaces/Prolog/tests/expected_clpq2_mpz_a | 109 + interfaces/Prolog/tests/expected_clpq_int16 | 35 + interfaces/Prolog/tests/expected_clpq_int16_a | 35 + interfaces/Prolog/tests/expected_clpq_int32 | 35 + interfaces/Prolog/tests/expected_clpq_int32_a | 35 + interfaces/Prolog/tests/expected_clpq_int64 | 35 + interfaces/Prolog/tests/expected_clpq_int64_a | 35 + interfaces/Prolog/tests/expected_clpq_int8 | 29 + interfaces/Prolog/tests/expected_clpq_int8_a | 29 + interfaces/Prolog/tests/expected_clpq_mpz | 35 + interfaces/Prolog/tests/expected_clpq_mpz_a | 35 + interfaces/Prolog/tests/expected_pchk_int16 | 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 | 5 + interfaces/Prolog/tests/expected_pchk_int8_a | 5 + 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 | 3452 + ...interface_generator_prolog_generated_test_pl.m4 | 364 + ...face_generator_prolog_generated_test_pl_code.m4 | 1794 + .../tests/ppl_prolog_generated_test_common.pl | 614 + 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 | 116 + interfaces/marked_pointers.hh | 65 + interfaces/ppl_interface_generator_common.m4 | 924 + interfaces/ppl_interface_generator_common_dat.m4 | 993 + ...erface_generator_common_procedure_generators.m4 | 132 + interfaces/ppl_interface_generator_copyright | 20 + ltmain.sh | 8406 ++ m4/Makefile.am | 64 + m4/Makefile.in | 517 + m4/ac_check_ciao.m4 | 87 + m4/ac_check_classpath.m4 | 63 + m4/ac_check_fpu_control.m4 | 143 + m4/ac_check_gmp.m4 | 182 + m4/ac_check_sicstus_prolog.m4 | 62 + m4/ac_check_swi_prolog.m4 | 88 + m4/ac_check_xsb_prolog.m4 | 49 + m4/ac_cxx_attribute_weak.m4 | 58 + m4/ac_cxx_double_binary_format.m4 | 114 + m4/ac_cxx_double_exact_output.m4 | 140 + m4/ac_cxx_flexible_arrays.m4 | 141 + m4/ac_cxx_float_binary_format.m4 | 103 + m4/ac_cxx_float_exact_output.m4 | 130 + m4/ac_cxx_ieee_inexact_flag.m4 | 132 + m4/ac_cxx_limit_memory.m4 | 116 + m4/ac_cxx_long_double_binary_format.m4 | 331 + m4/ac_cxx_long_double_exact_output.m4 | 253 + m4/ac_cxx_proper_long_double.m4 | 63 + m4/ac_cxx_remainder_bug.m4 | 70 + m4/ac_prog_jar.m4 | 53 + m4/ac_prog_java.m4 | 267 + m4/ac_prog_javac.m4 | 143 + m4/ac_prog_javah.m4 | 50 + m4/ac_text_md5sum.m4 | 37 + m4/lib-ld.m4 | 110 + m4/lib-link.m4 | 553 + m4/lib-prefix.m4 | 153 + m4/libtool.m4 | 7357 ++ m4/ltoptions.m4 | 368 + m4/ltsugar.m4 | 123 + m4/ltversion.m4 | 23 + m4/lt~obsolete.m4 | 92 + m4/m4.m4 | 46 + m4/ppl.m4 | 287 + m4/ppl_c.m4 | 285 + missing | 367 + mkinstalldirs | 161 + packaging/ppl-0.10.2-Makefile.patch | 12 + packaging/ppl-missing-macro.patch | 13 + packaging/ppl.changes | 12 + packaging/ppl.hh | 49 + packaging/ppl.spec | 232 + packaging/ppl.yaml | 88 + packaging/ppl_c.h | 49 + packaging/pwl.hh | 49 + ppl-config.h.in | 393 + ppl-config.sed | 65 + ppl.lsm.in | 31 + src/BDS_Status.idefs.hh | 116 + src/BDS_Status.inlines.hh | 267 + src/BD_Shape.cc | 97 + src/BD_Shape.defs.hh | 2147 + src/BD_Shape.inlines.hh | 886 + src/BD_Shape.templates.hh | 5810 ++ src/BD_Shape.types.hh | 22 + src/BHRZ03_Certificate.cc | 332 + src/BHRZ03_Certificate.defs.hh | 117 + src/BHRZ03_Certificate.inlines.hh | 62 + src/BHRZ03_Certificate.types.hh | 21 + src/BUGS.cc.dist | 24 + src/Bit_Matrix.cc | 243 + src/Bit_Matrix.defs.hh | 179 + src/Bit_Matrix.inlines.hh | 151 + src/Bit_Matrix.types.hh | 21 + src/Bit_Row.cc | 360 + src/Bit_Row.defs.hh | 222 + src/Bit_Row.inlines.hh | 155 + src/Bit_Row.types.hh | 21 + src/Boundary.defs.hh | 746 + src/Box.cc | 76 + src/Box.defs.hh | 2059 + src/Box.inlines.hh | 650 + src/Box.templates.hh | 3881 + src/Box.types.hh | 22 + src/Box_Status.idefs.hh | 114 + src/Box_Status.inlines.hh | 227 + src/COPYING.cc.dist | 676 + src/CREDITS.cc.dist | 410 + src/C_Integer.hh | 175 + src/C_Polyhedron.cc | 99 + src/C_Polyhedron.defs.hh | 279 + src/C_Polyhedron.inlines.hh | 167 + src/C_Polyhedron.types.hh | 21 + src/Checked_Number.cc | 85 + src/Checked_Number.defs.hh | 1077 + src/Checked_Number.inlines.hh | 844 + src/Checked_Number.templates.hh | 147 + src/Checked_Number.types.hh | 27 + src/Coefficient.cc | 64 + src/Coefficient.defs.hh | 60 + src/Coefficient.inlines.hh | 61 + src/Coefficient.types.hh | 99 + src/Coefficient_traits_template.hh | 27 + src/Congruence.cc | 293 + src/Congruence.defs.hh | 479 + src/Congruence.inlines.hh | 238 + src/Congruence.types.hh | 21 + src/Congruence_System.cc | 582 + src/Congruence_System.defs.hh | 501 + src/Congruence_System.inlines.hh | 221 + src/Congruence_System.types.hh | 21 + src/Constraint.cc | 368 + src/Constraint.defs.hh | 563 + src/Constraint.inlines.hh | 379 + src/Constraint.types.hh | 21 + src/Constraint_System.cc | 624 + src/Constraint_System.defs.hh | 406 + src/Constraint_System.inlines.hh | 225 + src/Constraint_System.types.hh | 21 + src/DB_Matrix.defs.hh | 331 + src/DB_Matrix.inlines.hh | 333 + src/DB_Matrix.templates.hh | 316 + src/DB_Matrix.types.hh | 22 + src/DB_Row.defs.hh | 474 + src/DB_Row.inlines.hh | 437 + src/DB_Row.templates.hh | 214 + src/DB_Row.types.hh | 25 + src/Determinate.defs.hh | 325 + src/Determinate.inlines.hh | 309 + src/Determinate.types.hh | 22 + src/Float.cc | 42 + src/Float.defs.hh | 276 + src/Float.inlines.hh | 382 + src/GMP_Integer.defs.hh | 142 + src/GMP_Integer.inlines.hh | 111 + src/GMP_Integer.types.hh | 44 + src/Generator.cc | 410 + src/Generator.defs.hh | 723 + src/Generator.inlines.hh | 399 + src/Generator.types.hh | 21 + src/Generator_System.cc | 1053 + src/Generator_System.defs.hh | 516 + src/Generator_System.inlines.hh | 217 + src/Generator_System.types.hh | 21 + src/Grid.defs.hh | 2784 + src/Grid.inlines.hh | 407 + src/Grid.templates.hh | 615 + src/Grid.types.hh | 21 + src/Grid_Certificate.cc | 114 + src/Grid_Certificate.defs.hh | 103 + src/Grid_Certificate.inlines.hh | 60 + src/Grid_Certificate.types.hh | 21 + src/Grid_Generator.cc | 422 + src/Grid_Generator.defs.hh | 535 + src/Grid_Generator.inlines.hh | 240 + src/Grid_Generator.types.hh | 21 + src/Grid_Generator_System.cc | 377 + src/Grid_Generator_System.defs.hh | 518 + src/Grid_Generator_System.inlines.hh | 284 + src/Grid_Generator_System.types.hh | 21 + src/Grid_Status.cc | 245 + src/Grid_Status.idefs.hh | 167 + src/Grid_Status.inlines.hh | 216 + src/Grid_chdims.cc | 483 + src/Grid_conversion.cc | 478 + src/Grid_nonpublic.cc | 776 + src/Grid_public.cc | 2781 + src/Grid_simplify.cc | 572 + src/Grid_widenings.cc | 534 + src/H79_Certificate.cc | 119 + src/H79_Certificate.defs.hh | 97 + src/H79_Certificate.inlines.hh | 70 + src/H79_Certificate.types.hh | 21 + src/Has_Assign_Or_Swap.hh | 53 + src/Init.cc | 120 + src/Init.defs.hh | 86 + src/Init.inlines.hh | 47 + src/Init.types.hh | 21 + src/Interval.defs.hh | 983 + src/Interval.inlines.hh | 1283 + src/Interval.templates.hh | 241 + src/Interval.types.hh | 22 + src/Interval_Info.defs.hh | 300 + src/Interval_Info.inlines.hh | 121 + src/Interval_Info.types.hh | 25 + src/Interval_Restriction.defs.hh | 873 + src/Linear_Expression.cc | 410 + src/Linear_Expression.defs.hh | 461 + src/Linear_Expression.inlines.hh | 180 + src/Linear_Expression.types.hh | 21 + src/Linear_Row.cc | 228 + src/Linear_Row.defs.hh | 464 + src/Linear_Row.inlines.hh | 290 + src/Linear_Row.types.hh | 21 + src/Linear_System.cc | 920 + src/Linear_System.defs.hh | 516 + src/Linear_System.inlines.hh | 393 + src/Linear_System.types.hh | 21 + src/MIP_Problem.cc | 2171 + src/MIP_Problem.defs.hh | 806 + src/MIP_Problem.inlines.hh | 189 + src/MIP_Problem.templates.hh | 158 + src/MIP_Problem.types.hh | 32 + src/Makefile.am | 513 + src/Makefile.in | 1307 + src/Matrix.cc | 409 + src/Matrix.defs.hh | 367 + src/Matrix.inlines.hh | 218 + src/Matrix.types.hh | 21 + src/NNC_Polyhedron.cc | 92 + src/NNC_Polyhedron.defs.hh | 255 + src/NNC_Polyhedron.inlines.hh | 166 + src/NNC_Polyhedron.types.hh | 21 + src/Numeric_Format.defs.hh | 37 + src/OR_Matrix.defs.hh | 607 + src/OR_Matrix.inlines.hh | 715 + src/OR_Matrix.templates.hh | 123 + src/OR_Matrix.types.hh | 22 + src/Octagonal_Shape.cc | 100 + src/Octagonal_Shape.defs.hh | 2016 + src/Octagonal_Shape.inlines.hh | 816 + src/Octagonal_Shape.templates.hh | 6795 ++ src/Octagonal_Shape.types.hh | 22 + src/Og_Status.idefs.hh | 112 + src/Og_Status.inlines.hh | 225 + src/Partially_Reduced_Product.defs.hh | 1593 + src/Partially_Reduced_Product.inlines.hh | 827 + src/Partially_Reduced_Product.templates.hh | 519 + src/Partially_Reduced_Product.types.hh | 31 + src/Ph_Status.cc | 245 + src/Ph_Status.idefs.hh | 182 + src/Ph_Status.inlines.hh | 216 + src/Pointset_Powerset.cc | 341 + src/Pointset_Powerset.defs.hh | 1449 + src/Pointset_Powerset.inlines.hh | 330 + src/Pointset_Powerset.templates.hh | 1610 + src/Pointset_Powerset.types.hh | 22 + src/Poly_Con_Relation.cc | 77 + src/Poly_Con_Relation.defs.hh | 165 + src/Poly_Con_Relation.inlines.hh | 99 + src/Poly_Con_Relation.types.hh | 21 + src/Poly_Gen_Relation.cc | 65 + src/Poly_Gen_Relation.defs.hh | 138 + src/Poly_Gen_Relation.inlines.hh | 84 + src/Poly_Gen_Relation.types.hh | 21 + src/Polyhedron.defs.hh | 2716 + src/Polyhedron.inlines.hh | 426 + src/Polyhedron.templates.hh | 298 + src/Polyhedron.types.hh | 21 + src/Polyhedron_chdims.cc | 643 + src/Polyhedron_nonpublic.cc | 2269 + src/Polyhedron_public.cc | 3917 + src/Polyhedron_widenings.cc | 855 + src/Powerset.defs.hh | 454 + src/Powerset.inlines.hh | 235 + src/Powerset.templates.hh | 309 + src/Powerset.types.hh | 22 + src/Ptr_Iterator.defs.hh | 171 + src/Ptr_Iterator.inlines.hh | 188 + src/Ptr_Iterator.types.hh | 26 + src/Rational_Box.hh | 38 + src/Rational_Interval.hh | 56 + src/Result.defs.hh | 120 + src/Result.inlines.hh | 42 + src/Rounding_Dir.defs.hh | 87 + src/Rounding_Dir.inlines.hh | 109 + src/Row.cc | 316 + src/Row.defs.hh | 506 + src/Row.inlines.hh | 406 + src/Row.types.hh | 22 + src/Scalar_Products.cc | 160 + src/Scalar_Products.defs.hh | 197 + src/Scalar_Products.inlines.hh | 167 + src/Scalar_Products.types.hh | 23 + src/Slow_Copy.hh | 60 + src/Temp.defs.hh | 160 + src/Temp.inlines.hh | 115 + src/Temp.templates.hh | 33 + src/Topology.hh | 28 + src/Variable.cc | 50 + src/Variable.defs.hh | 148 + src/Variable.inlines.hh | 88 + src/Variable.types.hh | 21 + src/Variables_Set.cc | 90 + src/Variables_Set.defs.hh | 106 + src/Variables_Set.inlines.hh | 74 + src/Variables_Set.types.hh | 21 + src/Widening_Function.defs.hh | 126 + src/Widening_Function.inlines.hh | 74 + src/Widening_Function.types.hh | 25 + src/algorithms.hh | 71 + src/assign_or_swap.hh | 69 + src/c_streambuf.cc | 101 + src/c_streambuf.defs.hh | 123 + src/c_streambuf.inlines.hh | 39 + src/c_streambuf.types.hh | 21 + src/checked.cc | 376 + src/checked.defs.hh | 611 + src/checked.inlines.hh | 621 + src/checked_ext.inlines.hh | 848 + src/checked_float.inlines.hh | 1077 + src/checked_int.inlines.hh | 1574 + src/checked_mpq.inlines.hh | 484 + src/checked_mpz.inlines.hh | 569 + src/checked_numeric_limits.hh | 162 + src/compiler.hh | 79 + src/conversion.cc | 859 + src/distances.defs.hh | 53 + src/distances.inlines.hh | 112 + src/distances.types.hh | 28 + src/fpu-c99.inlines.hh | 99 + src/fpu-ia32.cc | 70 + src/fpu-ia32.inlines.hh | 202 + src/fpu-none.inlines.hh | 74 + src/fpu-sparc.inlines.hh | 76 + src/fpu.defs.hh | 98 + src/fpu.types.hh | 26 + src/globals.cc | 32 + src/globals.defs.hh | 388 + src/globals.inlines.hh | 97 + src/globals.types.hh | 75 + src/initializer.hh | 65 + src/iterator_to_const.defs.hh | 222 + src/iterator_to_const.inlines.hh | 201 + src/iterator_to_const.types.hh | 25 + src/math_utilities.defs.hh | 110 + src/math_utilities.inlines.hh | 120 + src/max_space_dimension.hh | 76 + src/meta_programming.hh | 339 + src/minimize.cc | 401 + src/mp_std_bits.cc | 72 + src/mp_std_bits.defs.hh | 169 + src/mp_std_bits.inlines.hh | 38 + src/namespaces.hh | 185 + src/ppl-config.cc.in | 741 + src/ppl.hh.dist | 76424 ++++++++++++++++ src/ppl_header.hh | 113 + src/simplify.cc | 318 + src/stdiobuf.cc | 78 + src/stdiobuf.defs.hh | 110 + src/stdiobuf.inlines.hh | 35 + src/stdiobuf.types.hh | 21 + src/swapping_sort.icc | 141 + src/version.cc | 105 + src/version.hh.in | 92 + src/wrap.cc | 92 + src/wrap.hh | 59 + tests/BD_Shape/Makefile.am | 303 + tests/BD_Shape/Makefile.in | 1559 + tests/BD_Shape/addconstraints1.cc | 181 + tests/BD_Shape/addspacedims1.cc | 333 + tests/BD_Shape/affinedimension1.cc | 306 + tests/BD_Shape/affineimage1.cc | 442 + tests/BD_Shape/affineimage2.cc | 351 + tests/BD_Shape/affinepreimage1.cc | 454 + tests/BD_Shape/ascii_dump_load1.cc | 246 + tests/BD_Shape/bgp99extrapolation1.cc | 93 + tests/BD_Shape/bhmz05widening1.cc | 343 + tests/BD_Shape/bhz03widening1.cc | 76 + tests/BD_Shape/bounded1.cc | 96 + tests/BD_Shape/boundedaffineimage1.cc | 487 + tests/BD_Shape/boundedaffinepreimage1.cc | 359 + tests/BD_Shape/bounds1.cc | 272 + tests/BD_Shape/cc76extrapolation1.cc | 488 + tests/BD_Shape/cc76narrowing1.cc | 216 + tests/BD_Shape/closure1.cc | 599 + tests/BD_Shape/concatenate1.cc | 203 + tests/BD_Shape/congruences1.cc | 218 + tests/BD_Shape/constrains1.cc | 228 + tests/BD_Shape/constraints1.cc | 196 + tests/BD_Shape/contains1.cc | 183 + tests/BD_Shape/containsintegerpoint1.cc | 137 + tests/BD_Shape/difference1.cc | 278 + tests/BD_Shape/discrete1.cc | 214 + tests/BD_Shape/disjoint1.cc | 195 + tests/BD_Shape/empty1.cc | 206 + tests/BD_Shape/equality1.cc | 131 + tests/BD_Shape/expandspacedim1.cc | 245 + tests/BD_Shape/foldspacedims1.cc | 337 + tests/BD_Shape/frombdshape1.cc | 146 + tests/BD_Shape/frombox1.cc | 374 + tests/BD_Shape/fromgensys1.cc | 155 + tests/BD_Shape/fromgrid1.cc | 222 + tests/BD_Shape/fromoctagonalshape1.cc | 80 + tests/BD_Shape/frompolyhedron1.cc | 64 + tests/BD_Shape/fromspacedim1.cc | 122 + tests/BD_Shape/generalizedaffineimage1.cc | 590 + tests/BD_Shape/generalizedaffineimage2.cc | 517 + tests/BD_Shape/generalizedaffinepreimage1.cc | 476 + tests/BD_Shape/generalizedaffinepreimage2.cc | 609 + tests/BD_Shape/generalizedaffinepreimage3.cc | 173 + tests/BD_Shape/geomcovers1.cc | 71 + tests/BD_Shape/h79widening1.cc | 62 + tests/BD_Shape/intersection1.cc | 364 + tests/BD_Shape/limitedbhmz05extrapolation1.cc | 526 + tests/BD_Shape/limitedcc76extrapolation1.cc | 538 + tests/BD_Shape/limitedh79extrapolation1.cc | 70 + tests/BD_Shape/mapspacedims1.cc | 292 + tests/BD_Shape/max_min1.cc | 780 + tests/BD_Shape/max_min2.cc | 439 + tests/BD_Shape/maxspacedim1.cc | 95 + tests/BD_Shape/membytes1.cc | 240 + tests/BD_Shape/minconstraints1.cc | 94 + tests/BD_Shape/relations1.cc | 470 + tests/BD_Shape/relations2.cc | 444 + tests/BD_Shape/relations3.cc | 461 + tests/BD_Shape/relations4.cc | 435 + tests/BD_Shape/removespacedims1.cc | 387 + tests/BD_Shape/run_tests | 53 + tests/BD_Shape/simplifyusingcontext1.cc | 305 + tests/BD_Shape/timeelapse1.cc | 242 + tests/BD_Shape/unconstrain1.cc | 228 + tests/BD_Shape/universe1.cc | 89 + tests/BD_Shape/upperbound1.cc | 280 + tests/BD_Shape/upperboundifexact1.cc | 375 + tests/BD_Shape/writebdshape1.cc | 126 + tests/Box/Makefile.am | 331 + tests/Box/Makefile.in | 1693 + tests/Box/addconstraints1.cc | 289 + tests/Box/addspacedims1.cc | 332 + tests/Box/affinedimension1.cc | 291 + tests/Box/affineimage1.cc | 428 + tests/Box/affinepreimage1.cc | 177 + tests/Box/ascii_dump_load1.cc | 253 + tests/Box/bgp99extrapolation1.cc | 85 + tests/Box/bhz03widening1.cc | 78 + tests/Box/bounded1.cc | 96 + tests/Box/boundedaffineimage1.cc | 515 + tests/Box/boundedaffinepreimage1.cc | 518 + tests/Box/cc76narrowing1.cc | 206 + tests/Box/cc76widening.cc | 86 + tests/Box/concatenate1.cc | 224 + tests/Box/congruences1.cc | 382 + tests/Box/constrains1.cc | 187 + tests/Box/constraints1.cc | 161 + tests/Box/contains1.cc | 176 + tests/Box/containsintegerpoint1.cc | 219 + tests/Box/difference1.cc | 513 + tests/Box/discrete1.cc | 203 + tests/Box/disjoint1.cc | 188 + tests/Box/empty1.cc | 225 + tests/Box/equality1.cc | 130 + tests/Box/expandspacedim1.cc | 231 + tests/Box/foldspacedims1.cc | 268 + tests/Box/frombdshape1.cc | 87 + tests/Box/frombox1.cc | 160 + tests/Box/fromgensys1.cc | 181 + tests/Box/fromgrid1.cc | 511 + tests/Box/frompartiallyreducedproduct1.cc | 136 + tests/Box/frompolyhedron1.cc | 526 + tests/Box/frompolyhedron2.cc | 141 + tests/Box/fromspacedim1.cc | 110 + tests/Box/generalizedaffineimage1.cc | 604 + tests/Box/generalizedaffineimage2.cc | 608 + tests/Box/generalizedaffinepreimage1.cc | 474 + tests/Box/geomcovers1.cc | 71 + tests/Box/intersection1.cc | 441 + tests/Box/interval1.cc | 206 + tests/Box/limitedcc76extrapolation1.cc | 316 + tests/Box/mapspacedims1.cc | 279 + tests/Box/max_min1.cc | 764 + tests/Box/maxspacedim1.cc | 58 + tests/Box/membytes1.cc | 117 + tests/Box/minconstraints1.cc | 94 + tests/Box/propagateconstraints1.cc | 210 + tests/Box/propagateconstraints2.cc | 449 + tests/Box/refinewithcongruences1.cc | 387 + tests/Box/refinewithconstraint1.cc | 158 + tests/Box/refinewithconstraint2.cc | 80 + tests/Box/refinewithconstraints1.cc | 427 + tests/Box/refinewithconstraints2.cc | 447 + tests/Box/relations1.cc | 464 + tests/Box/relations2.cc | 441 + tests/Box/relations3.cc | 401 + tests/Box/relations4.cc | 488 + tests/Box/removespacedims1.cc | 355 + tests/Box/run_tests | 53 + tests/Box/simplifyusingcontext1.cc | 305 + tests/Box/timeelapse1.cc | 206 + tests/Box/topclosed1.cc | 205 + tests/Box/unconstrain1.cc | 225 + tests/Box/universe1.cc | 86 + tests/Box/upperbound1.cc | 266 + tests/Box/upperboundifexact1.cc | 310 + tests/Box/writebox1.cc | 75 + tests/Grid/Makefile.am | 305 + tests/Grid/Makefile.in | 1914 + tests/Grid/addcongruence1.cc | 155 + tests/Grid/addcongruences1.cc | 443 + tests/Grid/addconstraint1.cc | 280 + tests/Grid/addconstraints1.cc | 453 + tests/Grid/addgenerator1.cc | 358 + tests/Grid/addgenerators1.cc | 292 + tests/Grid/addspacedims1.cc | 531 + tests/Grid/affinedim1.cc | 321 + tests/Grid/affineimage1.cc | 389 + tests/Grid/affineimage2.cc | 397 + tests/Grid/affinepreimage1.cc | 428 + tests/Grid/affinepreimage2.cc | 362 + tests/Grid/approximatepartition1.cc | 101 + tests/Grid/asciidumpload1.cc | 632 + tests/Grid/asciidumpload2.cc | 494 + tests/Grid/asciidumpload3.cc | 123 + tests/Grid/asciidumpload4.cc | 144 + tests/Grid/asciidumpload5.cc | 154 + tests/Grid/asciidumpload6.cc | 144 + tests/Grid/bhz03widening1.cc | 112 + tests/Grid/bounded1.cc | 391 + tests/Grid/boundedaffineimage1.cc | 184 + tests/Grid/boundedaffinepreimage1.cc | 184 + tests/Grid/bounds1.cc | 458 + tests/Grid/certificate1.cc | 228 + tests/Grid/concatenate1.cc | 340 + tests/Grid/congruence1.cc | 458 + tests/Grid/congruences1.cc | 402 + tests/Grid/congruences2.cc | 336 + tests/Grid/constraints1.cc | 353 + tests/Grid/contains1.cc | 213 + tests/Grid/containsintegerpoint1.cc | 289 + tests/Grid/coveringbox1.cc | 346 + tests/Grid/coveringbox2.cc | 846 + tests/Grid/discrete1.cc | 341 + tests/Grid/disjoint1.cc | 254 + tests/Grid/equals1.cc | 285 + tests/Grid/expandspacedim1.cc | 238 + tests/Grid/foldspacedims1.cc | 400 + tests/Grid/frombdshape1.cc | 76 + tests/Grid/frombox1.cc | 76 + tests/Grid/fromgrid1.cc | 101 + tests/Grid/fromoctagonalshape1.cc | 76 + tests/Grid/frompolyhedron1.cc | 342 + tests/Grid/generalizedaffineimage1.cc | 555 + tests/Grid/generalizedaffineimage2.cc | 543 + tests/Grid/generalizedaffineimage3.cc | 376 + tests/Grid/generalizedaffinepreimage1.cc | 539 + tests/Grid/generalizedaffinepreimage2.cc | 320 + tests/Grid/generalizedaffinepreimage3.cc | 461 + tests/Grid/generator1.cc | 485 + tests/Grid/generators1.cc | 470 + tests/Grid/generators2.cc | 55 + tests/Grid/grid1.cc | 838 + tests/Grid/grid2.cc | 633 + tests/Grid/grid3.cc | 274 + tests/Grid/griddifference1.cc | 349 + tests/Grid/intersection1.cc | 520 + tests/Grid/isempty1.cc | 293 + tests/Grid/isuniverse1.cc | 321 + tests/Grid/limitedextrapolation1.cc | 494 + tests/Grid/limitedextrapolation2.cc | 498 + tests/Grid/limitedextrapolation3.cc | 498 + tests/Grid/mapspacedims1.cc | 313 + tests/Grid/maxmin1.cc | 518 + tests/Grid/membytes1.cc | 276 + tests/Grid/mincongruences1.cc | 221 + tests/Grid/mingenerators1.cc | 240 + tests/Grid/outputoperator1.cc | 140 + tests/Grid/outputoperator2.cc | 99 + tests/Grid/outputoperator3.cc | 90 + tests/Grid/partition1.cc | 99 + tests/Grid/powersetdifference1.cc | 314 + tests/Grid/powersetgeometricallycovers1.cc | 180 + tests/Grid/powersetgeometricallyequals1.cc | 113 + tests/Grid/refinewithcongruences1.cc | 210 + tests/Grid/refinewithconstraints1.cc | 207 + tests/Grid/relations1.cc | 366 + tests/Grid/relations2.cc | 423 + tests/Grid/relations3.cc | 462 + tests/Grid/removespacedims1.cc | 349 + tests/Grid/removespacedims2.cc | 279 + tests/Grid/simplifyusingcontext1.cc | 500 + tests/Grid/timeelapse1.cc | 340 + tests/Grid/topclosed1.cc | 336 + tests/Grid/topclosure1.cc | 93 + tests/Grid/unconstrain1.cc | 229 + tests/Grid/upperbound1.cc | 334 + tests/Grid/upperbound2.cc | 340 + tests/Grid/widening1.cc | 597 + tests/Grid/widening2.cc | 485 + tests/Grid/widening3.cc | 314 + tests/Grid/writecongruencesystem.cc | 62 + tests/MIP_Problem/Makefile.am | 108 + tests/MIP_Problem/Makefile.in | 753 + tests/MIP_Problem/ascii_dump_load1.cc | 417 + tests/MIP_Problem/exceptions1.cc | 510 + tests/MIP_Problem/mipproblem1.cc | 1698 + tests/MIP_Problem/mipproblem2.cc | 168 + tests/MIP_Problem/mipproblem3.cc | 899 + tests/Makefile.am | 59 + tests/Makefile.in | 711 + tests/Octagonal_Shape/Makefile.am | 303 + tests/Octagonal_Shape/Makefile.in | 1561 + tests/Octagonal_Shape/addspacedims1.cc | 234 + tests/Octagonal_Shape/affinedimension1.cc | 305 + tests/Octagonal_Shape/affineimage1.cc | 520 + tests/Octagonal_Shape/affineimage2.cc | 553 + tests/Octagonal_Shape/affinepreimage1.cc | 293 + tests/Octagonal_Shape/affinepreimage2.cc | 425 + tests/Octagonal_Shape/ascii_dump_load1.cc | 330 + tests/Octagonal_Shape/bhmz05widening1.cc | 708 + tests/Octagonal_Shape/bhz03widening1.cc | 76 + tests/Octagonal_Shape/bounded1.cc | 130 + tests/Octagonal_Shape/boundedaffineimage1.cc | 604 + tests/Octagonal_Shape/boundedaffinepreimage1.cc | 572 + tests/Octagonal_Shape/bounds1.cc | 311 + tests/Octagonal_Shape/cc76extrapolation1.cc | 519 + tests/Octagonal_Shape/cc76narrowing1.cc | 264 + tests/Octagonal_Shape/chinainit.cc | 75 + tests/Octagonal_Shape/concatenate1.cc | 282 + tests/Octagonal_Shape/congruences1.cc | 249 + tests/Octagonal_Shape/constrains1.cc | 231 + tests/Octagonal_Shape/constraints1.cc | 375 + tests/Octagonal_Shape/contains1.cc | 349 + tests/Octagonal_Shape/containsintegerpoint1.cc | 198 + tests/Octagonal_Shape/difference1.cc | 260 + tests/Octagonal_Shape/discrete1.cc | 212 + tests/Octagonal_Shape/disjoint1.cc | 192 + tests/Octagonal_Shape/empty1.cc | 130 + tests/Octagonal_Shape/expandspacedim1.cc | 294 + tests/Octagonal_Shape/foldspacedims1.cc | 441 + tests/Octagonal_Shape/frombdshape1.cc | 54 + tests/Octagonal_Shape/frombox1.cc | 357 + tests/Octagonal_Shape/fromgensys1.cc | 270 + tests/Octagonal_Shape/fromgrid1.cc | 201 + tests/Octagonal_Shape/fromoctagonalshape1.cc | 132 + tests/Octagonal_Shape/frompolyhedron1.cc | 244 + tests/Octagonal_Shape/fromspacedim1.cc | 122 + tests/Octagonal_Shape/generalizedaffineimage1.cc | 603 + tests/Octagonal_Shape/generalizedaffineimage2.cc | 356 + tests/Octagonal_Shape/generalizedaffineimage3.cc | 595 + tests/Octagonal_Shape/generalizedaffineimage4.cc | 380 + tests/Octagonal_Shape/generalizedaffineimage5.cc | 343 + .../Octagonal_Shape/generalizedaffinepreimage1.cc | 617 + .../Octagonal_Shape/generalizedaffinepreimage2.cc | 622 + .../Octagonal_Shape/generalizedaffinepreimage3.cc | 620 + .../Octagonal_Shape/generalizedaffinepreimage4.cc | 637 + tests/Octagonal_Shape/intersection1.cc | 376 + .../Octagonal_Shape/limitedbhmz05extrapolation1.cc | 339 + tests/Octagonal_Shape/limitedcc76extrapolation1.cc | 660 + tests/Octagonal_Shape/mapspacedims1.cc | 254 + tests/Octagonal_Shape/max_min1.cc | 691 + tests/Octagonal_Shape/max_min2.cc | 310 + tests/Octagonal_Shape/maxspacedim1.cc | 98 + tests/Octagonal_Shape/membytes1.cc | 232 + tests/Octagonal_Shape/minconstraints1.cc | 134 + tests/Octagonal_Shape/relatwithcons1.cc | 595 + tests/Octagonal_Shape/relatwithcons2.cc | 475 + tests/Octagonal_Shape/relatwithcons3.cc | 508 + tests/Octagonal_Shape/relatwithgen1.cc | 495 + tests/Octagonal_Shape/removespacedims1.cc | 374 + tests/Octagonal_Shape/run_tests | 53 + tests/Octagonal_Shape/simplifyusingcontext1.cc | 339 + tests/Octagonal_Shape/timeelapse1.cc | 371 + tests/Octagonal_Shape/unconstrain1.cc | 231 + tests/Octagonal_Shape/universe1.cc | 111 + tests/Octagonal_Shape/upperbound1.cc | 390 + tests/Octagonal_Shape/upperboundifexact1.cc | 386 + tests/Octagonal_Shape/writeoctagon1.cc | 210 + tests/Partial_Function.cc | 80 + tests/Partial_Function.defs.hh | 61 + tests/Partial_Function.inlines.hh | 44 + tests/Partial_Function.types.hh | 25 + tests/Partially_Reduced_Product/Makefile.am | 91 + tests/Partially_Reduced_Product/Makefile.in | 815 + tests/Partially_Reduced_Product/asciidumpload1.cc | 239 + tests/Partially_Reduced_Product/directproduct1.cc | 555 + tests/Partially_Reduced_Product/directproduct2.cc | 471 + tests/Partially_Reduced_Product/directproduct3.cc | 722 + tests/Partially_Reduced_Product/directproduct4.cc | 358 + tests/Partially_Reduced_Product/directproduct5.cc | 601 + tests/Partially_Reduced_Product/directproduct6.cc | 700 + .../partiallyreducedproduct1.cc | 845 + .../partiallyreducedproduct2.cc | 960 + .../partiallyreducedproduct3.cc | 755 + .../partiallyreducedproduct4.cc | 278 + tests/Polyhedron/Makefile.am | 692 + tests/Polyhedron/Makefile.in | 4684 + tests/Polyhedron/addcongruence1.cc | 230 + tests/Polyhedron/addcongruences1.cc | 250 + tests/Polyhedron/addconstraint1.cc | 106 + tests/Polyhedron/addconstraints1.cc | 363 + tests/Polyhedron/addconstraints2.cc | 93 + tests/Polyhedron/addgenerator1.cc | 118 + tests/Polyhedron/addgenerator2.cc | 129 + tests/Polyhedron/addgenerators1.cc | 355 + tests/Polyhedron/addgenerators2.cc | 137 + tests/Polyhedron/addspacedims1.cc | 201 + tests/Polyhedron/addspacedims2.cc | 248 + tests/Polyhedron/affineimage1.cc | 265 + tests/Polyhedron/affineimage2.cc | 74 + tests/Polyhedron/affinepreimage1.cc | 437 + tests/Polyhedron/affinetrans.cc | 81 + tests/Polyhedron/append1.cc | 112 + tests/Polyhedron/append2.cc | 131 + tests/Polyhedron/ascii_dump_load1.cc | 601 + tests/Polyhedron/ascii_dump_load2.cc | 138 + tests/Polyhedron/ascii_dump_load3.cc | 433 + tests/Polyhedron/bgp99extrapolation1.cc | 159 + tests/Polyhedron/bgp99extrapolation2.cc | 255 + tests/Polyhedron/bhrz03widening1.cc | 754 + tests/Polyhedron/bhrz03widening2.cc | 261 + tests/Polyhedron/bhrz03widening3.cc | 646 + tests/Polyhedron/bhz03widening1.cc | 723 + tests/Polyhedron/bounded1.cc | 106 + tests/Polyhedron/boundedaffineimage1.cc | 249 + tests/Polyhedron/boundedaffinepreimage1.cc | 124 + tests/Polyhedron/boundedbhrz03extrapolation1.cc | 152 + tests/Polyhedron/boundedh79extrapolation1.cc | 74 + tests/Polyhedron/bounds1.cc | 64 + tests/Polyhedron/cnncconversion1.cc | 153 + tests/Polyhedron/concatenate1.cc | 283 + tests/Polyhedron/congruences1.cc | 364 + tests/Polyhedron/constrains1.cc | 232 + tests/Polyhedron/constraints1.cc | 165 + tests/Polyhedron/contains1.cc | 114 + tests/Polyhedron/contains2.cc | 176 + tests/Polyhedron/containsintegerpoint1.cc | 175 + tests/Polyhedron/disjoint1.cc | 145 + tests/Polyhedron/disjoint2.cc | 132 + tests/Polyhedron/dualhypercubes.cc | 391 + tests/Polyhedron/empty1.cc | 50 + tests/Polyhedron/equals1.cc | 61 + tests/Polyhedron/exceptions1.cc | 1461 + tests/Polyhedron/exceptions2.cc | 912 + tests/Polyhedron/exceptions3.cc | 234 + tests/Polyhedron/expandspacedim1.cc | 268 + tests/Polyhedron/expandspacedim2.cc | 102 + tests/Polyhedron/foldspacedims1.cc | 336 + tests/Polyhedron/foldspacedims2.cc | 230 + tests/Polyhedron/frombdshape1.cc | 56 + tests/Polyhedron/frombox1.cc | 258 + tests/Polyhedron/frombox2.cc | 111 + tests/Polyhedron/fromgrid1.cc | 201 + tests/Polyhedron/fromoctagonalshape1.cc | 55 + tests/Polyhedron/generalizedaffineimage1.cc | 268 + tests/Polyhedron/generalizedaffineimage2.cc | 559 + tests/Polyhedron/generalizedaffinepreimage1.cc | 123 + tests/Polyhedron/generalizedaffinepreimage2.cc | 63 + tests/Polyhedron/generators1.cc | 234 + tests/Polyhedron/geomcovers1.cc | 60 + tests/Polyhedron/h79widening1.cc | 245 + tests/Polyhedron/h79widening2.cc | 63 + tests/Polyhedron/hybrid.cc | 870 + tests/Polyhedron/intersection1.cc | 517 + tests/Polyhedron/limitedbhrz03extrapolation1.cc | 67 + tests/Polyhedron/limitedh79extrapolation1.cc | 273 + tests/Polyhedron/linearexpression1.cc | 137 + tests/Polyhedron/linearpartition1.cc | 331 + tests/Polyhedron/linearsystem1.cc | 104 + tests/Polyhedron/mapspacedims1.cc | 481 + tests/Polyhedron/matrix1.cc | 71 + tests/Polyhedron/max_min1.cc | 181 + tests/Polyhedron/maxspacedim1.cc | 136 + tests/Polyhedron/mc91.cc | 117 + tests/Polyhedron/membytes1.cc | 291 + tests/Polyhedron/memory1.cc | 219 + tests/Polyhedron/memory2.cc | 258 + tests/Polyhedron/minconstraints1.cc | 77 + tests/Polyhedron/minconstraints2.cc | 70 + tests/Polyhedron/mingenerators1.cc | 85 + tests/Polyhedron/mingenerators2.cc | 48 + tests/Polyhedron/nncminimize1.cc | 379 + tests/Polyhedron/nncminimize2.cc | 80 + tests/Polyhedron/numberinput1.cc | 341 + tests/Polyhedron/onepoint.cc | 56 + tests/Polyhedron/permute.cc | 222 + tests/Polyhedron/polydifference1.cc | 205 + tests/Polyhedron/polydifference2.cc | 175 + tests/Polyhedron/polyhull1.cc | 399 + tests/Polyhedron/polyhull2.cc | 58 + tests/Polyhedron/polyhullifexact1.cc | 464 + tests/Polyhedron/polyhullifexact2.cc | 318 + tests/Polyhedron/randphull1.cc | 198 + tests/Polyhedron/refinewithcongruence1.cc | 105 + tests/Polyhedron/refinewithcongruences1.cc | 336 + tests/Polyhedron/refinewithconstraint1.cc | 108 + tests/Polyhedron/refinewithconstraints1.cc | 322 + tests/Polyhedron/relations1.cc | 484 + tests/Polyhedron/relations2.cc | 226 + tests/Polyhedron/relations3.cc | 316 + tests/Polyhedron/removespacedims1.cc | 298 + tests/Polyhedron/removespacedims2.cc | 66 + tests/Polyhedron/simplifyusingcontext1.cc | 488 + tests/Polyhedron/smm1.cc | 151 + tests/Polyhedron/timeelapse1.cc | 250 + tests/Polyhedron/timeelapse2.cc | 132 + tests/Polyhedron/topclosed1.cc | 95 + tests/Polyhedron/topclosure1.cc | 160 + tests/Polyhedron/unconstrain1.cc | 228 + tests/Polyhedron/universe1.cc | 164 + tests/Polyhedron/universe2.cc | 79 + tests/Polyhedron/variablesset1.cc | 159 + tests/Polyhedron/watchdog1.cc | 129 + tests/Polyhedron/writeconsys1.cc | 82 + tests/Polyhedron/writegensys1.cc | 89 + tests/Polyhedron/writepolyhedron1.cc | 69 + tests/Polyhedron/writepolyhedron2.cc | 66 + tests/Polyhedron/writerelation1.cc | 108 + tests/Polyhedron/writevariable1.cc | 103 + tests/Powerset/Makefile.am | 191 + tests/Powerset/Makefile.in | 1175 + tests/Powerset/addcongruences1.cc | 67 + tests/Powerset/addconstraints1.cc | 65 + tests/Powerset/affinedimension1.cc | 138 + tests/Powerset/affineimage1.cc | 239 + tests/Powerset/affinepreimage1.cc | 171 + tests/Powerset/bounded1.cc | 77 + tests/Powerset/bounds1.cc | 96 + tests/Powerset/closed1.cc | 99 + tests/Powerset/closure1.cc | 58 + tests/Powerset/collapse1.cc | 94 + tests/Powerset/concatenate1.cc | 74 + tests/Powerset/contains1.cc | 108 + tests/Powerset/containsintegerpoint1.cc | 131 + tests/Powerset/difference1.cc | 150 + tests/Powerset/discrete1.cc | 79 + tests/Powerset/disjoint1.cc | 116 + tests/Powerset/disjunct1.cc | 310 + tests/Powerset/empty1.cc | 141 + tests/Powerset/entails1.cc | 72 + tests/Powerset/equals1.cc | 78 + tests/Powerset/frombdshape1.cc | 424 + tests/Powerset/frombox1.cc | 420 + tests/Powerset/fromcongruences1.cc | 77 + tests/Powerset/fromconstraints1.cc | 179 + tests/Powerset/fromgrid1.cc | 434 + tests/Powerset/fromoctagonalshape1.cc | 431 + tests/Powerset/frompolyhedron1.cc | 758 + tests/Powerset/fromspacedimension1.cc | 101 + tests/Powerset/intersection1.cc | 103 + tests/Powerset/maxmin1.cc | 396 + tests/Powerset/meet1.cc | 94 + tests/Powerset/membytes1.cc | 68 + tests/Powerset/powerset1.cc | 177 + tests/Powerset/reduce1.cc | 80 + tests/Powerset/refinewith1.cc | 224 + tests/Powerset/relationwith1.cc | 277 + tests/Powerset/simplifyusingcontext1.cc | 458 + tests/Powerset/size1.cc | 74 + tests/Powerset/spacedims1.cc | 212 + tests/Powerset/universe1.cc | 103 + tests/Powerset/upperbound1.cc | 163 + tests/README | 115 + tests/Random_Number_Generator.defs.hh | 46 + tests/Random_Number_Generator.inlines.hh | 92 + tests/Random_Number_Generator.types.hh | 21 + tests/files.cc | 50 + tests/files.hh | 35 + tests/ppl_test.cc | 429 + tests/ppl_test.hh | 1186 + tests/valgrind_suppressions | 18 + utils/Makefile.am | 60 + utils/Makefile.in | 601 + utils/build_header.in | 102 + utils/cm_cleaner.sh | 37 + utils/cm_splitter.sh | 43 + utils/text2cxxarray.in | 61 + utils/timings.cc | 102 + utils/timings.hh | 31 + 1454 files changed, 774206 insertions(+) create mode 100644 BUGS create mode 100644 COPYING create mode 100644 CREDITS create mode 100644 ChangeLog create mode 100644 INSTALL create mode 100644 Makefile.am create mode 100644 Makefile.in create mode 100644 NEWS create mode 100644 README create mode 100644 README.configure create mode 100644 STANDARDS create mode 100644 TODO create mode 100644 Watchdog/BUGS create mode 100644 Watchdog/COPYING create mode 100644 Watchdog/CREDITS create mode 100644 Watchdog/ChangeLog create mode 100644 Watchdog/INSTALL create mode 100644 Watchdog/Makefile.am create mode 100644 Watchdog/Makefile.in create mode 100644 Watchdog/NEWS create mode 100644 Watchdog/README create mode 100644 Watchdog/aclocal.m4 create mode 100755 Watchdog/compile create mode 100755 Watchdog/config.guess create mode 100644 Watchdog/config.h.in create mode 100755 Watchdog/config.rpath create mode 100755 Watchdog/config.sub create mode 100755 Watchdog/configure create mode 100644 Watchdog/configure.ac create mode 100755 Watchdog/depcomp create mode 100644 Watchdog/doc/Makefile.am create mode 100644 Watchdog/doc/Makefile.in create mode 100644 Watchdog/doc/README.doc create mode 100644 Watchdog/doc/devref.doxyconf-html.in create mode 100644 Watchdog/doc/devref.doxyconf-latex.in create mode 100644 Watchdog/doc/devref.tex create mode 100644 Watchdog/doc/fdl.dox create mode 100644 Watchdog/doc/fdl.pdf create mode 100644 Watchdog/doc/fdl.ps.gz create mode 100644 Watchdog/doc/fdl.tex create mode 100644 Watchdog/doc/fdl.txt create mode 100644 Watchdog/doc/gpl.dox create mode 100644 Watchdog/doc/gpl.pdf create mode 100644 Watchdog/doc/gpl.ps.gz create mode 100644 Watchdog/doc/gpl.tex create mode 100644 Watchdog/doc/gpl.txt create mode 100644 Watchdog/doc/pwl-user-0.7-html.tar.gz create mode 100644 Watchdog/doc/pwl-user-0.7.pdf create mode 100644 Watchdog/doc/pwl-user-0.7.ps.gz create mode 100644 Watchdog/doc/pwl.sty create mode 100644 Watchdog/doc/user.doxyconf-html.in create mode 100644 Watchdog/doc/user.doxyconf-latex.in create mode 100644 Watchdog/doc/user.tex create mode 100755 Watchdog/install-sh create mode 100644 Watchdog/ltmain.sh create mode 100644 Watchdog/m4/Makefile.am create mode 100644 Watchdog/m4/Makefile.in create mode 100644 Watchdog/m4/lib-ld.m4 create mode 100644 Watchdog/m4/lib-link.m4 create mode 100644 Watchdog/m4/libtool.m4 create mode 100644 Watchdog/m4/ltoptions.m4 create mode 100644 Watchdog/m4/ltsugar.m4 create mode 100644 Watchdog/m4/ltversion.m4 create mode 100644 Watchdog/m4/lt~obsolete.m4 create mode 100755 Watchdog/missing create mode 100755 Watchdog/mkinstalldirs create mode 100644 Watchdog/pwl-config.h.in create mode 100644 Watchdog/pwl-config.sed create mode 100644 Watchdog/src/Doubly_Linked_Object.defs.hh create mode 100644 Watchdog/src/Doubly_Linked_Object.inlines.hh create mode 100644 Watchdog/src/Doubly_Linked_Object.types.hh create mode 100644 Watchdog/src/EList.defs.hh create mode 100644 Watchdog/src/EList.inlines.hh create mode 100644 Watchdog/src/EList.types.hh create mode 100644 Watchdog/src/EList_Iterator.defs.hh create mode 100644 Watchdog/src/EList_Iterator.inlines.hh create mode 100644 Watchdog/src/EList_Iterator.types.hh create mode 100644 Watchdog/src/Handler.defs.hh create mode 100644 Watchdog/src/Handler.inlines.hh create mode 100644 Watchdog/src/Handler.types.hh create mode 100644 Watchdog/src/Makefile.am create mode 100644 Watchdog/src/Makefile.in create mode 100644 Watchdog/src/Pending_Element.cc create mode 100644 Watchdog/src/Pending_Element.defs.hh create mode 100644 Watchdog/src/Pending_Element.inlines.hh create mode 100644 Watchdog/src/Pending_Element.types.hh create mode 100644 Watchdog/src/Pending_List.cc create mode 100644 Watchdog/src/Pending_List.defs.hh create mode 100644 Watchdog/src/Pending_List.inlines.hh create mode 100644 Watchdog/src/Pending_List.types.hh create mode 100644 Watchdog/src/Time.cc create mode 100644 Watchdog/src/Time.defs.hh create mode 100644 Watchdog/src/Time.inlines.hh create mode 100644 Watchdog/src/Time.types.hh create mode 100644 Watchdog/src/Watchdog.cc create mode 100644 Watchdog/src/Watchdog.defs.hh create mode 100644 Watchdog/src/Watchdog.inlines.hh create mode 100644 Watchdog/src/Watchdog.types.hh create mode 100644 Watchdog/src/pwl.hh.dist create mode 100644 Watchdog/src/pwl_header.hh create mode 100644 Watchdog/tests/Makefile.am create mode 100644 Watchdog/tests/Makefile.in create mode 100644 Watchdog/tests/pwl_test.cc create mode 100644 Watchdog/tests/pwl_test.hh create mode 100644 Watchdog/tests/simple1.cc create mode 100644 Watchdog/tests/valgrind_suppressions create mode 100644 Watchdog/utils/Makefile.am create mode 100644 Watchdog/utils/Makefile.in create mode 100644 Watchdog/utils/build_header.in create mode 100644 aclocal.m4 create mode 100755 compile create mode 100755 config.guess create mode 100644 config.h.in create mode 100755 config.rpath create mode 100755 config.sub create mode 100755 configure create mode 100644 configure.ac create mode 100644 demos/Makefile.am create mode 100644 demos/Makefile.in create mode 100644 demos/ppl_lcdd/Makefile.am create mode 100644 demos/ppl_lcdd/Makefile.in create mode 100644 demos/ppl_lcdd/examples/1d.ine create mode 100644 demos/ppl_lcdd/examples/1da.ine create mode 100644 demos/ppl_lcdd/examples/Makefile.am create mode 100644 demos/ppl_lcdd/examples/Makefile.in create mode 100644 demos/ppl_lcdd/examples/README create mode 100644 demos/ppl_lcdd/examples/allzero.ine create mode 100644 demos/ppl_lcdd/examples/ccc4.ext create mode 100644 demos/ppl_lcdd/examples/ccc5.ext create mode 100644 demos/ppl_lcdd/examples/ccc6.ext create mode 100644 demos/ppl_lcdd/examples/ccp4.ext create mode 100644 demos/ppl_lcdd/examples/ccp5.ext create mode 100644 demos/ppl_lcdd/examples/ccp6.ext create mode 100644 demos/ppl_lcdd/examples/cp4.ext create mode 100644 demos/ppl_lcdd/examples/cp4.ine create mode 100644 demos/ppl_lcdd/examples/cp5.ext create mode 100644 demos/ppl_lcdd/examples/cp5.ine create mode 100644 demos/ppl_lcdd/examples/cp6.ext create mode 100644 demos/ppl_lcdd/examples/cp6.ine create mode 100644 demos/ppl_lcdd/examples/cp7.ext create mode 100644 demos/ppl_lcdd/examples/cross10.ine create mode 100644 demos/ppl_lcdd/examples/cross12.ine create mode 100644 demos/ppl_lcdd/examples/cross4.ine create mode 100644 demos/ppl_lcdd/examples/cross6.ine create mode 100644 demos/ppl_lcdd/examples/cross8.ine create mode 100644 demos/ppl_lcdd/examples/cube.ext create mode 100644 demos/ppl_lcdd/examples/cube.ine create mode 100644 demos/ppl_lcdd/examples/cube10.ine create mode 100644 demos/ppl_lcdd/examples/cube12.ine create mode 100644 demos/ppl_lcdd/examples/cube3.ine create mode 100644 demos/ppl_lcdd/examples/cube6.ine create mode 100644 demos/ppl_lcdd/examples/cube8.ine create mode 100644 demos/ppl_lcdd/examples/cubetop.ine create mode 100644 demos/ppl_lcdd/examples/cubocta.ine create mode 100644 demos/ppl_lcdd/examples/cut16_11.ext create mode 100644 demos/ppl_lcdd/examples/cut32_16.ext create mode 100644 demos/ppl_lcdd/examples/cyc.ine create mode 100644 demos/ppl_lcdd/examples/cyclic10-4.ext create mode 100644 demos/ppl_lcdd/examples/cyclic12-6.ext create mode 100644 demos/ppl_lcdd/examples/cyclic14-8.ext create mode 100644 demos/ppl_lcdd/examples/cyclic16-10.ext create mode 100644 demos/ppl_lcdd/examples/cyclic17_8.ine create mode 100644 demos/ppl_lcdd/examples/cyclic25_13.ext create mode 100644 demos/ppl_lcdd/examples/dcube10.ext create mode 100644 demos/ppl_lcdd/examples/dcube12.ext create mode 100644 demos/ppl_lcdd/examples/dcube3.ext create mode 100644 demos/ppl_lcdd/examples/dcube6.ext create mode 100644 demos/ppl_lcdd/examples/dcube8.ext create mode 100644 demos/ppl_lcdd/examples/diamond.ine create mode 100644 demos/ppl_lcdd/examples/dodeca_m.ine create mode 100644 demos/ppl_lcdd/examples/ex1.ine create mode 100644 demos/ppl_lcdd/examples/grcubocta.ine create mode 100644 demos/ppl_lcdd/examples/hexocta.ine create mode 100644 demos/ppl_lcdd/examples/icododeca_m.ine create mode 100644 demos/ppl_lcdd/examples/in0.ine create mode 100644 demos/ppl_lcdd/examples/in1.ine create mode 100644 demos/ppl_lcdd/examples/in2.ine create mode 100644 demos/ppl_lcdd/examples/in3.ine create mode 100644 demos/ppl_lcdd/examples/in4.ine create mode 100644 demos/ppl_lcdd/examples/in5.ine create mode 100644 demos/ppl_lcdd/examples/in6.ine create mode 100644 demos/ppl_lcdd/examples/in7.ine create mode 100644 demos/ppl_lcdd/examples/infeas.ine create mode 100644 demos/ppl_lcdd/examples/integralpoints.ine create mode 100644 demos/ppl_lcdd/examples/irbox20-4.ext create mode 100644 demos/ppl_lcdd/examples/irbox200-4.ext create mode 100644 demos/ppl_lcdd/examples/kkd18_4.ine create mode 100644 demos/ppl_lcdd/examples/kkd27_5.ine create mode 100644 demos/ppl_lcdd/examples/kkd38_6.ine create mode 100644 demos/ppl_lcdd/examples/kq20_11_m.ine create mode 100644 demos/ppl_lcdd/examples/metric40_11.ine create mode 100644 demos/ppl_lcdd/examples/metric80_16.ine create mode 100644 demos/ppl_lcdd/examples/mit.ine create mode 100644 demos/ppl_lcdd/examples/mit288-281.ine create mode 100644 demos/ppl_lcdd/examples/mit31-20.ine create mode 100644 demos/ppl_lcdd/examples/mit41-16.ine create mode 100644 demos/ppl_lcdd/examples/mit708-9.ine create mode 100644 demos/ppl_lcdd/examples/mit71-61.ine create mode 100644 demos/ppl_lcdd/examples/mit90-86.ine create mode 100644 demos/ppl_lcdd/examples/mp5.ext create mode 100644 demos/ppl_lcdd/examples/mp5.ine create mode 100644 demos/ppl_lcdd/examples/mp5a.ine create mode 100644 demos/ppl_lcdd/examples/mp6.ine create mode 100644 demos/ppl_lcdd/examples/nonfull.ine create mode 100644 demos/ppl_lcdd/examples/origin.ine create mode 100644 demos/ppl_lcdd/examples/prodst62.ext create mode 100644 demos/ppl_lcdd/examples/project1_m.ine create mode 100644 demos/ppl_lcdd/examples/project1res.ine create mode 100644 demos/ppl_lcdd/examples/project2_m.ine create mode 100644 demos/ppl_lcdd/examples/project2res.ine create mode 100644 demos/ppl_lcdd/examples/rcubocta.ine create mode 100644 demos/ppl_lcdd/examples/redcheck.ext create mode 100644 demos/ppl_lcdd/examples/reg24-5.ext create mode 100644 demos/ppl_lcdd/examples/reg24-5.ine create mode 100644 demos/ppl_lcdd/examples/reg600-5_m.ext create mode 100644 demos/ppl_lcdd/examples/rhomtria_m.ine create mode 100644 demos/ppl_lcdd/examples/sample.ine create mode 100644 demos/ppl_lcdd/examples/sampleh1.ine create mode 100644 demos/ppl_lcdd/examples/sampleh2.ine create mode 100644 demos/ppl_lcdd/examples/sampleh3.ine create mode 100644 demos/ppl_lcdd/examples/sampleh4.ine create mode 100644 demos/ppl_lcdd/examples/sampleh5.ine create mode 100644 demos/ppl_lcdd/examples/sampleh6.ine create mode 100644 demos/ppl_lcdd/examples/sampleh7.ine create mode 100644 demos/ppl_lcdd/examples/sampleh8.ine create mode 100644 demos/ppl_lcdd/examples/samplev1.ext create mode 100644 demos/ppl_lcdd/examples/samplev2.ext create mode 100644 demos/ppl_lcdd/examples/samplev3.ext create mode 100644 demos/ppl_lcdd/examples/trunc10.ine create mode 100644 demos/ppl_lcdd/examples/trunc7.ine create mode 100644 demos/ppl_lcdd/examples/tsp5.ext create mode 100644 demos/ppl_lcdd/examples/tsp5.ine create mode 100644 demos/ppl_lcdd/expected_int16 create mode 100644 demos/ppl_lcdd/expected_int16_a create mode 100644 demos/ppl_lcdd/expected_int32 create mode 100644 demos/ppl_lcdd/expected_int32_a create mode 100644 demos/ppl_lcdd/expected_int64 create mode 100644 demos/ppl_lcdd/expected_int64_a create mode 100644 demos/ppl_lcdd/expected_int8 create mode 100644 demos/ppl_lcdd/expected_int8_a create mode 100644 demos/ppl_lcdd/expected_mpz create mode 100644 demos/ppl_lcdd/expected_mpz_a create mode 100644 demos/ppl_lcdd/ppl_lcdd.1 create mode 100644 demos/ppl_lcdd/ppl_lcdd.cc create mode 100644 demos/ppl_lpsol/Makefile.am create mode 100644 demos/ppl_lpsol/Makefile.in create mode 100644 demos/ppl_lpsol/dummy.cc create mode 100644 demos/ppl_lpsol/examples/Makefile.am create mode 100644 demos/ppl_lpsol/examples/Makefile.in create mode 100644 demos/ppl_lpsol/examples/README create mode 100644 demos/ppl_lpsol/examples/adlittle.mps create mode 100644 demos/ppl_lpsol/examples/afiro.mps create mode 100644 demos/ppl_lpsol/examples/bgprtr.mps create mode 100644 demos/ppl_lpsol/examples/blend.mps create mode 100644 demos/ppl_lpsol/examples/boeing1.mps create mode 100644 demos/ppl_lpsol/examples/boeing2.mps create mode 100644 demos/ppl_lpsol/examples/egout.mps create mode 100644 demos/ppl_lpsol/examples/ex1.mps create mode 100644 demos/ppl_lpsol/examples/ex12.mps create mode 100644 demos/ppl_lpsol/examples/kb2.mps create mode 100644 demos/ppl_lpsol/examples/lseu.mps create mode 100644 demos/ppl_lpsol/examples/markshare1.mps create mode 100644 demos/ppl_lpsol/examples/markshare2.mps create mode 100644 demos/ppl_lpsol/examples/mas74.mps create mode 100644 demos/ppl_lpsol/examples/mas76.mps create mode 100644 demos/ppl_lpsol/examples/mip.mps create mode 100644 demos/ppl_lpsol/examples/modglob.mps create mode 100644 demos/ppl_lpsol/examples/noswot.mps create mode 100644 demos/ppl_lpsol/examples/opt1217.mps create mode 100644 demos/ppl_lpsol/examples/p0033.mps create mode 100644 demos/ppl_lpsol/examples/pk1.mps create mode 100644 demos/ppl_lpsol/examples/rout.mps create mode 100644 demos/ppl_lpsol/examples/sample.mps create mode 100644 demos/ppl_lpsol/examples/sc105.mps create mode 100644 demos/ppl_lpsol/examples/sc50a.mps create mode 100644 demos/ppl_lpsol/examples/sc50b.mps create mode 100644 demos/ppl_lpsol/examples/ship08l.mps create mode 100644 demos/ppl_lpsol/examples/unboundedmin.mps create mode 100644 demos/ppl_lpsol/expected_int16 create mode 100644 demos/ppl_lpsol/expected_int16_a create mode 100644 demos/ppl_lpsol/expected_int32 create mode 100644 demos/ppl_lpsol/expected_int32_a create mode 100644 demos/ppl_lpsol/expected_int64 create mode 100644 demos/ppl_lpsol/expected_int64_a create mode 100644 demos/ppl_lpsol/expected_int8 create mode 100644 demos/ppl_lpsol/expected_int8_a create mode 100644 demos/ppl_lpsol/expected_mpz create mode 100644 demos/ppl_lpsol/expected_mpz_a create mode 100644 demos/ppl_lpsol/ppl_lpsol.1 create mode 100644 demos/ppl_lpsol/ppl_lpsol.c create mode 100755 depcomp create mode 100644 doc/Makefile.am create mode 100644 doc/Makefile.in create mode 100644 doc/README.doc create mode 100644 doc/definitions.dox create mode 100644 doc/devref-language-interface.doxyconf.in create mode 100644 doc/devref-language-interface.tex create mode 100644 doc/devref.doxyconf-html.in create mode 100644 doc/devref.doxyconf-latex.in create mode 100644 doc/devref.tex create mode 100644 doc/fdl.dox create mode 100644 doc/fdl.pdf create mode 100644 doc/fdl.ps.gz create mode 100644 doc/fdl.tex create mode 100644 doc/fdl.txt create mode 100644 doc/gpl.dox create mode 100644 doc/gpl.pdf create mode 100644 doc/gpl.ps.gz create mode 100644 doc/gpl.tex create mode 100644 doc/gpl.txt create mode 100644 doc/interfaces-html.sed create mode 100644 doc/interfaces-latex.sed create mode 100644 doc/libppl.3 create mode 100644 doc/libppl_c.3 create mode 100644 doc/ppl-config.1 create mode 100644 doc/ppl-user-0.10.2-html.tar.gz create mode 100644 doc/ppl-user-0.10.2.pdf create mode 100644 doc/ppl-user-0.10.2.ps.gz create mode 100644 doc/ppl-user-c-interface-0.10.2-html.tar.gz create mode 100644 doc/ppl-user-c-interface-0.10.2.pdf create mode 100644 doc/ppl-user-c-interface-0.10.2.ps.gz create mode 100644 doc/ppl-user-java-interface-0.10.2-html.tar.gz create mode 100644 doc/ppl-user-java-interface-0.10.2.pdf create mode 100644 doc/ppl-user-java-interface-0.10.2.ps.gz create mode 100644 doc/ppl-user-ocaml-interface-0.10.2-html.tar.gz create mode 100644 doc/ppl-user-ocaml-interface-0.10.2.pdf create mode 100644 doc/ppl-user-ocaml-interface-0.10.2.ps.gz create mode 100644 doc/ppl-user-prolog-interface-0.10.2-html.tar.gz create mode 100644 doc/ppl-user-prolog-interface-0.10.2.pdf create mode 100644 doc/ppl-user-prolog-interface-0.10.2.ps.gz create mode 100644 doc/ppl.sty create mode 100644 doc/user-language-interface.doxyconf.in create mode 100644 doc/user-language-interface.tex create mode 100644 doc/user.doxyconf-html.in create mode 100644 doc/user.doxyconf-latex.in create mode 100644 doc/user.tex create mode 100755 install-sh create mode 100644 instchk.hh create mode 100644 interfaces/C/C_interface.dox create mode 100644 interfaces/C/Makefile.am create mode 100644 interfaces/C/Makefile.in create mode 100644 interfaces/C/ppl_c_header.h create mode 100644 interfaces/C/ppl_c_implementation_common.cc create mode 100644 interfaces/C/ppl_c_implementation_common.defs.hh create mode 100644 interfaces/C/ppl_c_implementation_common.inlines.hh create mode 100644 interfaces/C/ppl_c_version.h.in create mode 100644 interfaces/C/ppl_interface_generator_c_cc_code.m4 create mode 100644 interfaces/C/ppl_interface_generator_c_cc_files.m4 create mode 100644 interfaces/C/ppl_interface_generator_c_h.m4 create mode 100644 interfaces/C/ppl_interface_generator_c_h_code.m4 create mode 100644 interfaces/C/ppl_interface_generator_c_hh_files.m4 create mode 100644 interfaces/C/ppl_interface_generator_c_procedure_generators.m4 create mode 100644 interfaces/C/tests/Makefile.am create mode 100644 interfaces/C/tests/Makefile.in create mode 100644 interfaces/C/tests/formatted_output.c create mode 100644 interfaces/C/tests/ppl_c_test.cc create mode 100644 interfaces/C/tests/ppl_c_test.h create mode 100644 interfaces/C/tests/print_to_buffer.c create mode 100644 interfaces/C/tests/print_to_buffer.h create mode 100644 interfaces/Java/Makefile.am create mode 100644 interfaces/Java/Makefile.in create mode 100644 interfaces/Java/README.java create mode 100644 interfaces/Java/jni/Makefile.am create mode 100644 interfaces/Java/jni/Makefile.in create mode 100644 interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4 create mode 100644 interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m4 create mode 100644 interfaces/Java/jni/ppl_java_common.cc create mode 100644 interfaces/Java/jni/ppl_java_common.defs.hh create mode 100644 interfaces/Java/jni/ppl_java_common.inlines.hh create mode 100644 interfaces/Java/jni/ppl_java_globals.cc create mode 100644 interfaces/Java/parma_polyhedra_library/By_Reference.java create mode 100644 interfaces/Java/parma_polyhedra_library/Coefficient.java create mode 100644 interfaces/Java/parma_polyhedra_library/Complexity_Class.java create mode 100644 interfaces/Java/parma_polyhedra_library/Congruence.java create mode 100644 interfaces/Java/parma_polyhedra_library/Congruence_System.java create mode 100644 interfaces/Java/parma_polyhedra_library/Constraint.java create mode 100644 interfaces/Java/parma_polyhedra_library/Constraint_System.java create mode 100644 interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java create mode 100644 interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.java create mode 100644 interfaces/Java/parma_polyhedra_library/Degenerate_Element.java create mode 100644 interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java create mode 100644 interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java create mode 100644 interfaces/Java/parma_polyhedra_library/Generator.java create mode 100644 interfaces/Java/parma_polyhedra_library/Generator_System.java create mode 100644 interfaces/Java/parma_polyhedra_library/Generator_Type.java create mode 100644 interfaces/Java/parma_polyhedra_library/Grid_Generator.java create mode 100644 interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java create mode 100644 interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java create mode 100644 interfaces/Java/parma_polyhedra_library/IO.java create mode 100644 interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.java create mode 100644 interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java create mode 100644 interfaces/Java/parma_polyhedra_library/Linear_Expression.java create mode 100644 interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficient.java create mode 100644 interfaces/Java/parma_polyhedra_library/Linear_Expression_Difference.java create mode 100644 interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java create mode 100644 interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.java create mode 100644 interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Minus.java create mode 100644 interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.java create mode 100644 interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java create mode 100644 interfaces/Java/parma_polyhedra_library/MIP_Problem.java create mode 100644 interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java create mode 100644 interfaces/Java/parma_polyhedra_library/Makefile.am create mode 100644 interfaces/Java/parma_polyhedra_library/Makefile.in create mode 100644 interfaces/Java/parma_polyhedra_library/Optimization_Mode.java create mode 100644 interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.java create mode 100644 interfaces/Java/parma_polyhedra_library/PPL_Object.java create mode 100644 interfaces/Java/parma_polyhedra_library/Pair.java create mode 100644 interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.java create mode 100644 interfaces/Java/parma_polyhedra_library/Partial_Function.java create mode 100644 interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java create mode 100644 interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java create mode 100644 interfaces/Java/parma_polyhedra_library/Relation_Symbol.java create mode 100644 interfaces/Java/parma_polyhedra_library/Variable.java create mode 100644 interfaces/Java/parma_polyhedra_library/Variables_Set.java create mode 100644 interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4 create mode 100644 interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4 create mode 100644 interfaces/Java/ppl_interface_generator_java_procedure_generators.m4 create mode 100644 interfaces/Java/tests/C_Polyhedron_test1.java create mode 100644 interfaces/Java/tests/MIP_Problem_test1.java create mode 100644 interfaces/Java/tests/Makefile.am create mode 100644 interfaces/Java/tests/Makefile.in create mode 100644 interfaces/Java/tests/NNC_Polyhedron_test1.java create mode 100644 interfaces/Java/tests/PPL_Test.java create mode 100644 interfaces/Java/tests/Parma_Polyhedra_Library_test1.java create mode 100644 interfaces/Java/tests/Test_Executor.java create mode 100644 interfaces/Java/tests/Test_Partial_Function.java create mode 100644 interfaces/Java/tests/ppl_interface_generator_java_test_java.m4 create mode 100644 interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4 create mode 100644 interfaces/Java/tests/ppl_java_tests_common create mode 100644 interfaces/Makefile.am create mode 100644 interfaces/Makefile.in create mode 100644 interfaces/OCaml/Makefile.am create mode 100644 interfaces/OCaml/Makefile.in create mode 100644 interfaces/OCaml/OCaml_interface.dox create mode 100644 interfaces/OCaml/README.ocaml create mode 100644 interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 create mode 100644 interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4 create mode 100644 interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4 create mode 100644 interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4 create mode 100644 interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4 create mode 100644 interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4 create mode 100644 interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4 create mode 100644 interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4 create mode 100644 interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4 create mode 100644 interfaces/OCaml/ppl_ocaml_common.cc create mode 100644 interfaces/OCaml/ppl_ocaml_common.defs.hh create mode 100644 interfaces/OCaml/ppl_ocaml_common.inlines.hh create mode 100644 interfaces/OCaml/ppl_ocaml_globals.ml create mode 100644 interfaces/OCaml/ppl_ocaml_globals.mli create mode 100644 interfaces/OCaml/tests/Makefile.am create mode 100644 interfaces/OCaml/tests/Makefile.in create mode 100644 interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4 create mode 100644 interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4 create mode 100644 interfaces/OCaml/tests/ppl_ocaml_tests_common create mode 100644 interfaces/OCaml/tests/test1.ml create mode 100644 interfaces/Prolog/Ciao/Makefile.am create mode 100644 interfaces/Prolog/Ciao/Makefile.in create mode 100644 interfaces/Prolog/Ciao/README.ciao create mode 100644 interfaces/Prolog/Ciao/ciao_cfli.hh create mode 100644 interfaces/Prolog/Ciao/ciao_clpq.pl create mode 100644 interfaces/Prolog/Ciao/ciao_clpq2.pl create mode 100644 interfaces/Prolog/Ciao/ciao_efli.cc create mode 100644 interfaces/Prolog/Ciao/ciao_efli.hh create mode 100644 interfaces/Prolog/Ciao/ciao_pl_check.pl create mode 100644 interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 create mode 100644 interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generated_test_pl.m4 create mode 100644 interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh create mode 100644 interfaces/Prolog/GNU/Makefile.am create mode 100644 interfaces/Prolog/GNU/Makefile.in create mode 100644 interfaces/Prolog/GNU/README.gprolog create mode 100644 interfaces/Prolog/GNU/gnu_pl_check.pl create mode 100644 interfaces/Prolog/GNU/gnu_prolog_generated_test.pl create mode 100644 interfaces/Prolog/GNU/gp_clpq.pl create mode 100644 interfaces/Prolog/GNU/gprolog_cfli.hh create mode 100644 interfaces/Prolog/GNU/gprolog_efli.cc create mode 100644 interfaces/Prolog/GNU/gprolog_efli.hh create mode 100644 interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4 create mode 100644 interfaces/Prolog/GNU/ppl_prolog_sysdep.hh create mode 100644 interfaces/Prolog/Makefile.am create mode 100644 interfaces/Prolog/Makefile.in create mode 100644 interfaces/Prolog/Prolog_interface.dox create mode 100644 interfaces/Prolog/SICStus/Makefile.am create mode 100644 interfaces/Prolog/SICStus/Makefile.in create mode 100644 interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4 create mode 100644 interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh create mode 100644 interfaces/Prolog/SICStus/ppl_sicstus.pl create mode 100644 interfaces/Prolog/SICStus/sicstus_cfli.cc create mode 100644 interfaces/Prolog/SICStus/sicstus_cfli.h create mode 100644 interfaces/Prolog/SICStus/sicstus_cfli.ic create mode 100644 interfaces/Prolog/SICStus/sicstus_efli.cc create mode 100644 interfaces/Prolog/SICStus/sicstus_efli.hh create mode 100644 interfaces/Prolog/SICStus/sp_clpq.pl create mode 100644 interfaces/Prolog/SICStus/sp_pl_check.pl create mode 100644 interfaces/Prolog/SICStus/sp_prolog_generated_test.pl create mode 100644 interfaces/Prolog/SWI/Makefile.am create mode 100644 interfaces/Prolog/SWI/Makefile.in create mode 100644 interfaces/Prolog/SWI/README.swiprolog create mode 100644 interfaces/Prolog/SWI/pl_clpq.cc create mode 100644 interfaces/Prolog/SWI/pl_clpq.pl create mode 100644 interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4 create mode 100644 interfaces/Prolog/SWI/ppl_pl.cc create mode 100644 interfaces/Prolog/SWI/ppl_prolog_sysdep.hh create mode 100644 interfaces/Prolog/SWI/ppl_swiprolog.pl create mode 100644 interfaces/Prolog/SWI/swi_cfli.hh create mode 100644 interfaces/Prolog/SWI/swi_efli.cc create mode 100644 interfaces/Prolog/SWI/swi_efli.hh create mode 100644 interfaces/Prolog/SWI/swi_pl_check.pl create mode 100644 interfaces/Prolog/SWI/swi_prolog_generated_test.pl create mode 100644 interfaces/Prolog/XSB/Makefile.am create mode 100644 interfaces/Prolog/XSB/Makefile.in create mode 100644 interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4 create mode 100644 interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 create mode 100644 interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4 create mode 100644 interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_test_P.m4 create mode 100644 interfaces/Prolog/XSB/ppl_prolog_sysdep.hh create mode 100644 interfaces/Prolog/XSB/xsb_cfli.hh create mode 100644 interfaces/Prolog/XSB/xsb_clpq.P create mode 100644 interfaces/Prolog/XSB/xsb_clpq2.P create mode 100644 interfaces/Prolog/XSB/xsb_efli.cc create mode 100644 interfaces/Prolog/XSB/xsb_efli.hh create mode 100644 interfaces/Prolog/XSB/xsb_pl_check.P create mode 100644 interfaces/Prolog/YAP/Makefile.am create mode 100644 interfaces/Prolog/YAP/Makefile.in create mode 100644 interfaces/Prolog/YAP/README.yap create mode 100644 interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4 create mode 100644 interfaces/Prolog/YAP/ppl_prolog_sysdep.hh create mode 100644 interfaces/Prolog/YAP/ppl_yap.pl create mode 100644 interfaces/Prolog/YAP/yap_cfli.hh create mode 100644 interfaces/Prolog/YAP/yap_clpq.pl create mode 100644 interfaces/Prolog/YAP/yap_clpq2.pl create mode 100644 interfaces/Prolog/YAP/yap_efli.cc create mode 100644 interfaces/Prolog/YAP/yap_efli.hh create mode 100644 interfaces/Prolog/YAP/yap_pl_check.pl create mode 100644 interfaces/Prolog/YAP/yap_prolog_generated_test.pl create mode 100644 interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4 create mode 100644 interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4 create mode 100644 interfaces/Prolog/ppl_interface_generator_prolog_dox.m4 create mode 100644 interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4 create mode 100644 interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4 create mode 100644 interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4 create mode 100644 interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4 create mode 100644 interfaces/Prolog/ppl_interface_generator_prolog_systems.m4 create mode 100644 interfaces/Prolog/ppl_prolog_common.cc create mode 100644 interfaces/Prolog/ppl_prolog_common.defs.hh create mode 100644 interfaces/Prolog/ppl_prolog_common.inlines.hh create mode 100644 interfaces/Prolog/ppl_prolog_sysdep_dox create mode 100644 interfaces/Prolog/ppl_prolog_sysindep_dox create mode 100644 interfaces/Prolog/tests/Makefile.am create mode 100644 interfaces/Prolog/tests/Makefile.in create mode 100644 interfaces/Prolog/tests/ack.clpq create mode 100644 interfaces/Prolog/tests/ackn.clpq create mode 100644 interfaces/Prolog/tests/clpq.pl create mode 100644 interfaces/Prolog/tests/clpq2.pl create mode 100644 interfaces/Prolog/tests/expected_clpq2_int16 create mode 100644 interfaces/Prolog/tests/expected_clpq2_int16_a create mode 100644 interfaces/Prolog/tests/expected_clpq2_int32 create mode 100644 interfaces/Prolog/tests/expected_clpq2_int32_a create mode 100644 interfaces/Prolog/tests/expected_clpq2_int64 create mode 100644 interfaces/Prolog/tests/expected_clpq2_int64_a create mode 100644 interfaces/Prolog/tests/expected_clpq2_int8 create mode 100644 interfaces/Prolog/tests/expected_clpq2_int8_a create mode 100644 interfaces/Prolog/tests/expected_clpq2_mpz create mode 100644 interfaces/Prolog/tests/expected_clpq2_mpz_a create mode 100644 interfaces/Prolog/tests/expected_clpq_int16 create mode 100644 interfaces/Prolog/tests/expected_clpq_int16_a create mode 100644 interfaces/Prolog/tests/expected_clpq_int32 create mode 100644 interfaces/Prolog/tests/expected_clpq_int32_a create mode 100644 interfaces/Prolog/tests/expected_clpq_int64 create mode 100644 interfaces/Prolog/tests/expected_clpq_int64_a create mode 100644 interfaces/Prolog/tests/expected_clpq_int8 create mode 100644 interfaces/Prolog/tests/expected_clpq_int8_a create mode 100644 interfaces/Prolog/tests/expected_clpq_mpz create mode 100644 interfaces/Prolog/tests/expected_clpq_mpz_a create mode 100644 interfaces/Prolog/tests/expected_pchk_int16 create mode 100644 interfaces/Prolog/tests/expected_pchk_int16_a create mode 100644 interfaces/Prolog/tests/expected_pchk_int32 create mode 100644 interfaces/Prolog/tests/expected_pchk_int32_a create mode 100644 interfaces/Prolog/tests/expected_pchk_int64 create mode 100644 interfaces/Prolog/tests/expected_pchk_int64_a create mode 100644 interfaces/Prolog/tests/expected_pchk_int8 create mode 100644 interfaces/Prolog/tests/expected_pchk_int8_a create mode 100644 interfaces/Prolog/tests/expected_pchk_mpz create mode 100644 interfaces/Prolog/tests/expected_pchk_mpz_a create mode 100644 interfaces/Prolog/tests/expected_pgt create mode 100644 interfaces/Prolog/tests/fib.clpq create mode 100644 interfaces/Prolog/tests/mc91.clpq create mode 100644 interfaces/Prolog/tests/pl_check.pl create mode 100644 interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl.m4 create mode 100644 interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4 create mode 100644 interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl create mode 100644 interfaces/Prolog/tests/schedule.clpq create mode 100644 interfaces/Prolog/tests/script_clpq create mode 100644 interfaces/Prolog/tests/script_clpq2 create mode 100644 interfaces/Prolog/tests/script_clpq2_int8 create mode 100644 interfaces/Prolog/tests/smm.clpq create mode 100644 interfaces/Prolog/tests/sumto.clpq create mode 100644 interfaces/Prolog/tests/tak.clpq create mode 100644 interfaces/interfaced_boxes.hh create mode 100644 interfaces/marked_pointers.hh create mode 100644 interfaces/ppl_interface_generator_common.m4 create mode 100644 interfaces/ppl_interface_generator_common_dat.m4 create mode 100644 interfaces/ppl_interface_generator_common_procedure_generators.m4 create mode 100644 interfaces/ppl_interface_generator_copyright create mode 100644 ltmain.sh create mode 100644 m4/Makefile.am create mode 100644 m4/Makefile.in create mode 100644 m4/ac_check_ciao.m4 create mode 100644 m4/ac_check_classpath.m4 create mode 100644 m4/ac_check_fpu_control.m4 create mode 100644 m4/ac_check_gmp.m4 create mode 100644 m4/ac_check_sicstus_prolog.m4 create mode 100644 m4/ac_check_swi_prolog.m4 create mode 100644 m4/ac_check_xsb_prolog.m4 create mode 100644 m4/ac_cxx_attribute_weak.m4 create mode 100644 m4/ac_cxx_double_binary_format.m4 create mode 100644 m4/ac_cxx_double_exact_output.m4 create mode 100644 m4/ac_cxx_flexible_arrays.m4 create mode 100644 m4/ac_cxx_float_binary_format.m4 create mode 100644 m4/ac_cxx_float_exact_output.m4 create mode 100644 m4/ac_cxx_ieee_inexact_flag.m4 create mode 100644 m4/ac_cxx_limit_memory.m4 create mode 100644 m4/ac_cxx_long_double_binary_format.m4 create mode 100644 m4/ac_cxx_long_double_exact_output.m4 create mode 100644 m4/ac_cxx_proper_long_double.m4 create mode 100644 m4/ac_cxx_remainder_bug.m4 create mode 100644 m4/ac_prog_jar.m4 create mode 100644 m4/ac_prog_java.m4 create mode 100644 m4/ac_prog_javac.m4 create mode 100644 m4/ac_prog_javah.m4 create mode 100644 m4/ac_text_md5sum.m4 create mode 100644 m4/lib-ld.m4 create mode 100644 m4/lib-link.m4 create mode 100644 m4/lib-prefix.m4 create mode 100644 m4/libtool.m4 create mode 100644 m4/ltoptions.m4 create mode 100644 m4/ltsugar.m4 create mode 100644 m4/ltversion.m4 create mode 100644 m4/lt~obsolete.m4 create mode 100644 m4/m4.m4 create mode 100644 m4/ppl.m4 create mode 100644 m4/ppl_c.m4 create mode 100755 missing create mode 100755 mkinstalldirs create mode 100644 packaging/ppl-0.10.2-Makefile.patch create mode 100644 packaging/ppl-missing-macro.patch create mode 100644 packaging/ppl.changes create mode 100644 packaging/ppl.hh create mode 100644 packaging/ppl.spec create mode 100644 packaging/ppl.yaml create mode 100644 packaging/ppl_c.h create mode 100644 packaging/pwl.hh create mode 100644 ppl-config.h.in create mode 100644 ppl-config.sed create mode 100644 ppl.lsm.in create mode 100644 src/BDS_Status.idefs.hh create mode 100644 src/BDS_Status.inlines.hh create mode 100644 src/BD_Shape.cc create mode 100644 src/BD_Shape.defs.hh create mode 100644 src/BD_Shape.inlines.hh create mode 100644 src/BD_Shape.templates.hh create mode 100644 src/BD_Shape.types.hh create mode 100644 src/BHRZ03_Certificate.cc create mode 100644 src/BHRZ03_Certificate.defs.hh create mode 100644 src/BHRZ03_Certificate.inlines.hh create mode 100644 src/BHRZ03_Certificate.types.hh create mode 100644 src/BUGS.cc.dist create mode 100644 src/Bit_Matrix.cc create mode 100644 src/Bit_Matrix.defs.hh create mode 100644 src/Bit_Matrix.inlines.hh create mode 100644 src/Bit_Matrix.types.hh create mode 100644 src/Bit_Row.cc create mode 100644 src/Bit_Row.defs.hh create mode 100644 src/Bit_Row.inlines.hh create mode 100644 src/Bit_Row.types.hh create mode 100644 src/Boundary.defs.hh create mode 100644 src/Box.cc create mode 100644 src/Box.defs.hh create mode 100644 src/Box.inlines.hh create mode 100644 src/Box.templates.hh create mode 100644 src/Box.types.hh create mode 100644 src/Box_Status.idefs.hh create mode 100644 src/Box_Status.inlines.hh create mode 100644 src/COPYING.cc.dist create mode 100644 src/CREDITS.cc.dist create mode 100644 src/C_Integer.hh create mode 100644 src/C_Polyhedron.cc create mode 100644 src/C_Polyhedron.defs.hh create mode 100644 src/C_Polyhedron.inlines.hh create mode 100644 src/C_Polyhedron.types.hh create mode 100644 src/Checked_Number.cc create mode 100644 src/Checked_Number.defs.hh create mode 100644 src/Checked_Number.inlines.hh create mode 100644 src/Checked_Number.templates.hh create mode 100644 src/Checked_Number.types.hh create mode 100644 src/Coefficient.cc create mode 100644 src/Coefficient.defs.hh create mode 100644 src/Coefficient.inlines.hh create mode 100644 src/Coefficient.types.hh create mode 100644 src/Coefficient_traits_template.hh create mode 100644 src/Congruence.cc create mode 100644 src/Congruence.defs.hh create mode 100644 src/Congruence.inlines.hh create mode 100644 src/Congruence.types.hh create mode 100644 src/Congruence_System.cc create mode 100644 src/Congruence_System.defs.hh create mode 100644 src/Congruence_System.inlines.hh create mode 100644 src/Congruence_System.types.hh create mode 100644 src/Constraint.cc create mode 100644 src/Constraint.defs.hh create mode 100644 src/Constraint.inlines.hh create mode 100644 src/Constraint.types.hh create mode 100644 src/Constraint_System.cc create mode 100644 src/Constraint_System.defs.hh create mode 100644 src/Constraint_System.inlines.hh create mode 100644 src/Constraint_System.types.hh create mode 100644 src/DB_Matrix.defs.hh create mode 100644 src/DB_Matrix.inlines.hh create mode 100644 src/DB_Matrix.templates.hh create mode 100644 src/DB_Matrix.types.hh create mode 100644 src/DB_Row.defs.hh create mode 100644 src/DB_Row.inlines.hh create mode 100644 src/DB_Row.templates.hh create mode 100644 src/DB_Row.types.hh create mode 100644 src/Determinate.defs.hh create mode 100644 src/Determinate.inlines.hh create mode 100644 src/Determinate.types.hh create mode 100644 src/Float.cc create mode 100644 src/Float.defs.hh create mode 100644 src/Float.inlines.hh create mode 100644 src/GMP_Integer.defs.hh create mode 100644 src/GMP_Integer.inlines.hh create mode 100644 src/GMP_Integer.types.hh create mode 100644 src/Generator.cc create mode 100644 src/Generator.defs.hh create mode 100644 src/Generator.inlines.hh create mode 100644 src/Generator.types.hh create mode 100644 src/Generator_System.cc create mode 100644 src/Generator_System.defs.hh create mode 100644 src/Generator_System.inlines.hh create mode 100644 src/Generator_System.types.hh create mode 100644 src/Grid.defs.hh create mode 100644 src/Grid.inlines.hh create mode 100644 src/Grid.templates.hh create mode 100644 src/Grid.types.hh create mode 100644 src/Grid_Certificate.cc create mode 100644 src/Grid_Certificate.defs.hh create mode 100644 src/Grid_Certificate.inlines.hh create mode 100644 src/Grid_Certificate.types.hh create mode 100644 src/Grid_Generator.cc create mode 100644 src/Grid_Generator.defs.hh create mode 100644 src/Grid_Generator.inlines.hh create mode 100644 src/Grid_Generator.types.hh create mode 100644 src/Grid_Generator_System.cc create mode 100644 src/Grid_Generator_System.defs.hh create mode 100644 src/Grid_Generator_System.inlines.hh create mode 100644 src/Grid_Generator_System.types.hh create mode 100644 src/Grid_Status.cc create mode 100644 src/Grid_Status.idefs.hh create mode 100644 src/Grid_Status.inlines.hh create mode 100644 src/Grid_chdims.cc create mode 100644 src/Grid_conversion.cc create mode 100644 src/Grid_nonpublic.cc create mode 100644 src/Grid_public.cc create mode 100644 src/Grid_simplify.cc create mode 100644 src/Grid_widenings.cc create mode 100644 src/H79_Certificate.cc create mode 100644 src/H79_Certificate.defs.hh create mode 100644 src/H79_Certificate.inlines.hh create mode 100644 src/H79_Certificate.types.hh create mode 100644 src/Has_Assign_Or_Swap.hh create mode 100644 src/Init.cc create mode 100644 src/Init.defs.hh create mode 100644 src/Init.inlines.hh create mode 100644 src/Init.types.hh create mode 100644 src/Interval.defs.hh create mode 100644 src/Interval.inlines.hh create mode 100644 src/Interval.templates.hh create mode 100644 src/Interval.types.hh create mode 100644 src/Interval_Info.defs.hh create mode 100644 src/Interval_Info.inlines.hh create mode 100644 src/Interval_Info.types.hh create mode 100644 src/Interval_Restriction.defs.hh create mode 100644 src/Linear_Expression.cc create mode 100644 src/Linear_Expression.defs.hh create mode 100644 src/Linear_Expression.inlines.hh create mode 100644 src/Linear_Expression.types.hh create mode 100644 src/Linear_Row.cc create mode 100644 src/Linear_Row.defs.hh create mode 100644 src/Linear_Row.inlines.hh create mode 100644 src/Linear_Row.types.hh create mode 100644 src/Linear_System.cc create mode 100644 src/Linear_System.defs.hh create mode 100644 src/Linear_System.inlines.hh create mode 100644 src/Linear_System.types.hh create mode 100644 src/MIP_Problem.cc create mode 100644 src/MIP_Problem.defs.hh create mode 100644 src/MIP_Problem.inlines.hh create mode 100644 src/MIP_Problem.templates.hh create mode 100644 src/MIP_Problem.types.hh create mode 100644 src/Makefile.am create mode 100644 src/Makefile.in create mode 100644 src/Matrix.cc create mode 100644 src/Matrix.defs.hh create mode 100644 src/Matrix.inlines.hh create mode 100644 src/Matrix.types.hh create mode 100644 src/NNC_Polyhedron.cc create mode 100644 src/NNC_Polyhedron.defs.hh create mode 100644 src/NNC_Polyhedron.inlines.hh create mode 100644 src/NNC_Polyhedron.types.hh create mode 100644 src/Numeric_Format.defs.hh create mode 100644 src/OR_Matrix.defs.hh create mode 100644 src/OR_Matrix.inlines.hh create mode 100644 src/OR_Matrix.templates.hh create mode 100644 src/OR_Matrix.types.hh create mode 100644 src/Octagonal_Shape.cc create mode 100644 src/Octagonal_Shape.defs.hh create mode 100644 src/Octagonal_Shape.inlines.hh create mode 100644 src/Octagonal_Shape.templates.hh create mode 100644 src/Octagonal_Shape.types.hh create mode 100644 src/Og_Status.idefs.hh create mode 100644 src/Og_Status.inlines.hh create mode 100644 src/Partially_Reduced_Product.defs.hh create mode 100644 src/Partially_Reduced_Product.inlines.hh create mode 100644 src/Partially_Reduced_Product.templates.hh create mode 100644 src/Partially_Reduced_Product.types.hh create mode 100644 src/Ph_Status.cc create mode 100644 src/Ph_Status.idefs.hh create mode 100644 src/Ph_Status.inlines.hh create mode 100644 src/Pointset_Powerset.cc create mode 100644 src/Pointset_Powerset.defs.hh create mode 100644 src/Pointset_Powerset.inlines.hh create mode 100644 src/Pointset_Powerset.templates.hh create mode 100644 src/Pointset_Powerset.types.hh create mode 100644 src/Poly_Con_Relation.cc create mode 100644 src/Poly_Con_Relation.defs.hh create mode 100644 src/Poly_Con_Relation.inlines.hh create mode 100644 src/Poly_Con_Relation.types.hh create mode 100644 src/Poly_Gen_Relation.cc create mode 100644 src/Poly_Gen_Relation.defs.hh create mode 100644 src/Poly_Gen_Relation.inlines.hh create mode 100644 src/Poly_Gen_Relation.types.hh create mode 100644 src/Polyhedron.defs.hh create mode 100644 src/Polyhedron.inlines.hh create mode 100644 src/Polyhedron.templates.hh create mode 100644 src/Polyhedron.types.hh create mode 100644 src/Polyhedron_chdims.cc create mode 100644 src/Polyhedron_nonpublic.cc create mode 100644 src/Polyhedron_public.cc create mode 100644 src/Polyhedron_widenings.cc create mode 100644 src/Powerset.defs.hh create mode 100644 src/Powerset.inlines.hh create mode 100644 src/Powerset.templates.hh create mode 100644 src/Powerset.types.hh create mode 100644 src/Ptr_Iterator.defs.hh create mode 100644 src/Ptr_Iterator.inlines.hh create mode 100644 src/Ptr_Iterator.types.hh create mode 100644 src/Rational_Box.hh create mode 100644 src/Rational_Interval.hh create mode 100644 src/Result.defs.hh create mode 100644 src/Result.inlines.hh create mode 100644 src/Rounding_Dir.defs.hh create mode 100644 src/Rounding_Dir.inlines.hh create mode 100644 src/Row.cc create mode 100644 src/Row.defs.hh create mode 100644 src/Row.inlines.hh create mode 100644 src/Row.types.hh create mode 100644 src/Scalar_Products.cc create mode 100644 src/Scalar_Products.defs.hh create mode 100644 src/Scalar_Products.inlines.hh create mode 100644 src/Scalar_Products.types.hh create mode 100644 src/Slow_Copy.hh create mode 100644 src/Temp.defs.hh create mode 100644 src/Temp.inlines.hh create mode 100644 src/Temp.templates.hh create mode 100644 src/Topology.hh create mode 100644 src/Variable.cc create mode 100644 src/Variable.defs.hh create mode 100644 src/Variable.inlines.hh create mode 100644 src/Variable.types.hh create mode 100644 src/Variables_Set.cc create mode 100644 src/Variables_Set.defs.hh create mode 100644 src/Variables_Set.inlines.hh create mode 100644 src/Variables_Set.types.hh create mode 100644 src/Widening_Function.defs.hh create mode 100644 src/Widening_Function.inlines.hh create mode 100644 src/Widening_Function.types.hh create mode 100644 src/algorithms.hh create mode 100644 src/assign_or_swap.hh create mode 100644 src/c_streambuf.cc create mode 100644 src/c_streambuf.defs.hh create mode 100644 src/c_streambuf.inlines.hh create mode 100644 src/c_streambuf.types.hh create mode 100644 src/checked.cc create mode 100644 src/checked.defs.hh create mode 100644 src/checked.inlines.hh create mode 100644 src/checked_ext.inlines.hh create mode 100644 src/checked_float.inlines.hh create mode 100644 src/checked_int.inlines.hh create mode 100644 src/checked_mpq.inlines.hh create mode 100644 src/checked_mpz.inlines.hh create mode 100644 src/checked_numeric_limits.hh create mode 100644 src/compiler.hh create mode 100644 src/conversion.cc create mode 100644 src/distances.defs.hh create mode 100644 src/distances.inlines.hh create mode 100644 src/distances.types.hh create mode 100644 src/fpu-c99.inlines.hh create mode 100644 src/fpu-ia32.cc create mode 100644 src/fpu-ia32.inlines.hh create mode 100644 src/fpu-none.inlines.hh create mode 100644 src/fpu-sparc.inlines.hh create mode 100644 src/fpu.defs.hh create mode 100644 src/fpu.types.hh create mode 100644 src/globals.cc create mode 100644 src/globals.defs.hh create mode 100644 src/globals.inlines.hh create mode 100644 src/globals.types.hh create mode 100644 src/initializer.hh create mode 100644 src/iterator_to_const.defs.hh create mode 100644 src/iterator_to_const.inlines.hh create mode 100644 src/iterator_to_const.types.hh create mode 100644 src/math_utilities.defs.hh create mode 100644 src/math_utilities.inlines.hh create mode 100644 src/max_space_dimension.hh create mode 100644 src/meta_programming.hh create mode 100644 src/minimize.cc create mode 100644 src/mp_std_bits.cc create mode 100644 src/mp_std_bits.defs.hh create mode 100644 src/mp_std_bits.inlines.hh create mode 100644 src/namespaces.hh create mode 100644 src/ppl-config.cc.in create mode 100644 src/ppl.hh.dist create mode 100644 src/ppl_header.hh create mode 100644 src/simplify.cc create mode 100644 src/stdiobuf.cc create mode 100644 src/stdiobuf.defs.hh create mode 100644 src/stdiobuf.inlines.hh create mode 100644 src/stdiobuf.types.hh create mode 100644 src/swapping_sort.icc create mode 100644 src/version.cc create mode 100644 src/version.hh.in create mode 100644 src/wrap.cc create mode 100644 src/wrap.hh create mode 100644 tests/BD_Shape/Makefile.am create mode 100644 tests/BD_Shape/Makefile.in create mode 100644 tests/BD_Shape/addconstraints1.cc create mode 100644 tests/BD_Shape/addspacedims1.cc create mode 100644 tests/BD_Shape/affinedimension1.cc create mode 100644 tests/BD_Shape/affineimage1.cc create mode 100644 tests/BD_Shape/affineimage2.cc create mode 100644 tests/BD_Shape/affinepreimage1.cc create mode 100644 tests/BD_Shape/ascii_dump_load1.cc create mode 100644 tests/BD_Shape/bgp99extrapolation1.cc create mode 100644 tests/BD_Shape/bhmz05widening1.cc create mode 100644 tests/BD_Shape/bhz03widening1.cc create mode 100644 tests/BD_Shape/bounded1.cc create mode 100644 tests/BD_Shape/boundedaffineimage1.cc create mode 100644 tests/BD_Shape/boundedaffinepreimage1.cc create mode 100644 tests/BD_Shape/bounds1.cc create mode 100644 tests/BD_Shape/cc76extrapolation1.cc create mode 100644 tests/BD_Shape/cc76narrowing1.cc create mode 100644 tests/BD_Shape/closure1.cc create mode 100644 tests/BD_Shape/concatenate1.cc create mode 100644 tests/BD_Shape/congruences1.cc create mode 100644 tests/BD_Shape/constrains1.cc create mode 100644 tests/BD_Shape/constraints1.cc create mode 100644 tests/BD_Shape/contains1.cc create mode 100644 tests/BD_Shape/containsintegerpoint1.cc create mode 100644 tests/BD_Shape/difference1.cc create mode 100644 tests/BD_Shape/discrete1.cc create mode 100644 tests/BD_Shape/disjoint1.cc create mode 100644 tests/BD_Shape/empty1.cc create mode 100644 tests/BD_Shape/equality1.cc create mode 100644 tests/BD_Shape/expandspacedim1.cc create mode 100644 tests/BD_Shape/foldspacedims1.cc create mode 100644 tests/BD_Shape/frombdshape1.cc create mode 100644 tests/BD_Shape/frombox1.cc create mode 100644 tests/BD_Shape/fromgensys1.cc create mode 100644 tests/BD_Shape/fromgrid1.cc create mode 100644 tests/BD_Shape/fromoctagonalshape1.cc create mode 100644 tests/BD_Shape/frompolyhedron1.cc create mode 100644 tests/BD_Shape/fromspacedim1.cc create mode 100644 tests/BD_Shape/generalizedaffineimage1.cc create mode 100644 tests/BD_Shape/generalizedaffineimage2.cc create mode 100644 tests/BD_Shape/generalizedaffinepreimage1.cc create mode 100644 tests/BD_Shape/generalizedaffinepreimage2.cc create mode 100644 tests/BD_Shape/generalizedaffinepreimage3.cc create mode 100644 tests/BD_Shape/geomcovers1.cc create mode 100644 tests/BD_Shape/h79widening1.cc create mode 100644 tests/BD_Shape/intersection1.cc create mode 100644 tests/BD_Shape/limitedbhmz05extrapolation1.cc create mode 100644 tests/BD_Shape/limitedcc76extrapolation1.cc create mode 100644 tests/BD_Shape/limitedh79extrapolation1.cc create mode 100644 tests/BD_Shape/mapspacedims1.cc create mode 100644 tests/BD_Shape/max_min1.cc create mode 100644 tests/BD_Shape/max_min2.cc create mode 100644 tests/BD_Shape/maxspacedim1.cc create mode 100644 tests/BD_Shape/membytes1.cc create mode 100644 tests/BD_Shape/minconstraints1.cc create mode 100644 tests/BD_Shape/relations1.cc create mode 100644 tests/BD_Shape/relations2.cc create mode 100644 tests/BD_Shape/relations3.cc create mode 100644 tests/BD_Shape/relations4.cc create mode 100644 tests/BD_Shape/removespacedims1.cc create mode 100755 tests/BD_Shape/run_tests create mode 100644 tests/BD_Shape/simplifyusingcontext1.cc create mode 100644 tests/BD_Shape/timeelapse1.cc create mode 100644 tests/BD_Shape/unconstrain1.cc create mode 100644 tests/BD_Shape/universe1.cc create mode 100644 tests/BD_Shape/upperbound1.cc create mode 100644 tests/BD_Shape/upperboundifexact1.cc create mode 100644 tests/BD_Shape/writebdshape1.cc create mode 100644 tests/Box/Makefile.am create mode 100644 tests/Box/Makefile.in create mode 100644 tests/Box/addconstraints1.cc create mode 100644 tests/Box/addspacedims1.cc create mode 100644 tests/Box/affinedimension1.cc create mode 100644 tests/Box/affineimage1.cc create mode 100644 tests/Box/affinepreimage1.cc create mode 100644 tests/Box/ascii_dump_load1.cc create mode 100644 tests/Box/bgp99extrapolation1.cc create mode 100644 tests/Box/bhz03widening1.cc create mode 100644 tests/Box/bounded1.cc create mode 100644 tests/Box/boundedaffineimage1.cc create mode 100644 tests/Box/boundedaffinepreimage1.cc create mode 100644 tests/Box/cc76narrowing1.cc create mode 100644 tests/Box/cc76widening.cc create mode 100644 tests/Box/concatenate1.cc create mode 100644 tests/Box/congruences1.cc create mode 100644 tests/Box/constrains1.cc create mode 100644 tests/Box/constraints1.cc create mode 100644 tests/Box/contains1.cc create mode 100644 tests/Box/containsintegerpoint1.cc create mode 100644 tests/Box/difference1.cc create mode 100644 tests/Box/discrete1.cc create mode 100644 tests/Box/disjoint1.cc create mode 100644 tests/Box/empty1.cc create mode 100644 tests/Box/equality1.cc create mode 100644 tests/Box/expandspacedim1.cc create mode 100644 tests/Box/foldspacedims1.cc create mode 100644 tests/Box/frombdshape1.cc create mode 100644 tests/Box/frombox1.cc create mode 100644 tests/Box/fromgensys1.cc create mode 100644 tests/Box/fromgrid1.cc create mode 100644 tests/Box/frompartiallyreducedproduct1.cc create mode 100644 tests/Box/frompolyhedron1.cc create mode 100644 tests/Box/frompolyhedron2.cc create mode 100644 tests/Box/fromspacedim1.cc create mode 100644 tests/Box/generalizedaffineimage1.cc create mode 100644 tests/Box/generalizedaffineimage2.cc create mode 100644 tests/Box/generalizedaffinepreimage1.cc create mode 100644 tests/Box/geomcovers1.cc create mode 100644 tests/Box/intersection1.cc create mode 100644 tests/Box/interval1.cc create mode 100644 tests/Box/limitedcc76extrapolation1.cc create mode 100644 tests/Box/mapspacedims1.cc create mode 100644 tests/Box/max_min1.cc create mode 100644 tests/Box/maxspacedim1.cc create mode 100644 tests/Box/membytes1.cc create mode 100644 tests/Box/minconstraints1.cc create mode 100644 tests/Box/propagateconstraints1.cc create mode 100644 tests/Box/propagateconstraints2.cc create mode 100644 tests/Box/refinewithcongruences1.cc create mode 100644 tests/Box/refinewithconstraint1.cc create mode 100644 tests/Box/refinewithconstraint2.cc create mode 100644 tests/Box/refinewithconstraints1.cc create mode 100644 tests/Box/refinewithconstraints2.cc create mode 100644 tests/Box/relations1.cc create mode 100644 tests/Box/relations2.cc create mode 100644 tests/Box/relations3.cc create mode 100644 tests/Box/relations4.cc create mode 100644 tests/Box/removespacedims1.cc create mode 100755 tests/Box/run_tests create mode 100644 tests/Box/simplifyusingcontext1.cc create mode 100644 tests/Box/timeelapse1.cc create mode 100644 tests/Box/topclosed1.cc create mode 100644 tests/Box/unconstrain1.cc create mode 100644 tests/Box/universe1.cc create mode 100644 tests/Box/upperbound1.cc create mode 100644 tests/Box/upperboundifexact1.cc create mode 100644 tests/Box/writebox1.cc create mode 100644 tests/Grid/Makefile.am create mode 100644 tests/Grid/Makefile.in create mode 100644 tests/Grid/addcongruence1.cc create mode 100644 tests/Grid/addcongruences1.cc create mode 100644 tests/Grid/addconstraint1.cc create mode 100644 tests/Grid/addconstraints1.cc create mode 100644 tests/Grid/addgenerator1.cc create mode 100644 tests/Grid/addgenerators1.cc create mode 100644 tests/Grid/addspacedims1.cc create mode 100644 tests/Grid/affinedim1.cc create mode 100644 tests/Grid/affineimage1.cc create mode 100644 tests/Grid/affineimage2.cc create mode 100644 tests/Grid/affinepreimage1.cc create mode 100644 tests/Grid/affinepreimage2.cc create mode 100644 tests/Grid/approximatepartition1.cc create mode 100644 tests/Grid/asciidumpload1.cc create mode 100644 tests/Grid/asciidumpload2.cc create mode 100644 tests/Grid/asciidumpload3.cc create mode 100644 tests/Grid/asciidumpload4.cc create mode 100644 tests/Grid/asciidumpload5.cc create mode 100644 tests/Grid/asciidumpload6.cc create mode 100644 tests/Grid/bhz03widening1.cc create mode 100644 tests/Grid/bounded1.cc create mode 100644 tests/Grid/boundedaffineimage1.cc create mode 100644 tests/Grid/boundedaffinepreimage1.cc create mode 100644 tests/Grid/bounds1.cc create mode 100644 tests/Grid/certificate1.cc create mode 100644 tests/Grid/concatenate1.cc create mode 100644 tests/Grid/congruence1.cc create mode 100644 tests/Grid/congruences1.cc create mode 100644 tests/Grid/congruences2.cc create mode 100644 tests/Grid/constraints1.cc create mode 100644 tests/Grid/contains1.cc create mode 100644 tests/Grid/containsintegerpoint1.cc create mode 100644 tests/Grid/coveringbox1.cc create mode 100644 tests/Grid/coveringbox2.cc create mode 100644 tests/Grid/discrete1.cc create mode 100644 tests/Grid/disjoint1.cc create mode 100644 tests/Grid/equals1.cc create mode 100644 tests/Grid/expandspacedim1.cc create mode 100644 tests/Grid/foldspacedims1.cc create mode 100644 tests/Grid/frombdshape1.cc create mode 100644 tests/Grid/frombox1.cc create mode 100644 tests/Grid/fromgrid1.cc create mode 100644 tests/Grid/fromoctagonalshape1.cc create mode 100644 tests/Grid/frompolyhedron1.cc create mode 100644 tests/Grid/generalizedaffineimage1.cc create mode 100644 tests/Grid/generalizedaffineimage2.cc create mode 100644 tests/Grid/generalizedaffineimage3.cc create mode 100644 tests/Grid/generalizedaffinepreimage1.cc create mode 100644 tests/Grid/generalizedaffinepreimage2.cc create mode 100644 tests/Grid/generalizedaffinepreimage3.cc create mode 100644 tests/Grid/generator1.cc create mode 100644 tests/Grid/generators1.cc create mode 100644 tests/Grid/generators2.cc create mode 100644 tests/Grid/grid1.cc create mode 100644 tests/Grid/grid2.cc create mode 100644 tests/Grid/grid3.cc create mode 100644 tests/Grid/griddifference1.cc create mode 100644 tests/Grid/intersection1.cc create mode 100644 tests/Grid/isempty1.cc create mode 100644 tests/Grid/isuniverse1.cc create mode 100644 tests/Grid/limitedextrapolation1.cc create mode 100644 tests/Grid/limitedextrapolation2.cc create mode 100644 tests/Grid/limitedextrapolation3.cc create mode 100644 tests/Grid/mapspacedims1.cc create mode 100644 tests/Grid/maxmin1.cc create mode 100644 tests/Grid/membytes1.cc create mode 100644 tests/Grid/mincongruences1.cc create mode 100644 tests/Grid/mingenerators1.cc create mode 100644 tests/Grid/outputoperator1.cc create mode 100644 tests/Grid/outputoperator2.cc create mode 100644 tests/Grid/outputoperator3.cc create mode 100644 tests/Grid/partition1.cc create mode 100644 tests/Grid/powersetdifference1.cc create mode 100644 tests/Grid/powersetgeometricallycovers1.cc create mode 100644 tests/Grid/powersetgeometricallyequals1.cc create mode 100644 tests/Grid/refinewithcongruences1.cc create mode 100644 tests/Grid/refinewithconstraints1.cc create mode 100644 tests/Grid/relations1.cc create mode 100644 tests/Grid/relations2.cc create mode 100644 tests/Grid/relations3.cc create mode 100644 tests/Grid/removespacedims1.cc create mode 100644 tests/Grid/removespacedims2.cc create mode 100644 tests/Grid/simplifyusingcontext1.cc create mode 100644 tests/Grid/timeelapse1.cc create mode 100644 tests/Grid/topclosed1.cc create mode 100644 tests/Grid/topclosure1.cc create mode 100644 tests/Grid/unconstrain1.cc create mode 100644 tests/Grid/upperbound1.cc create mode 100644 tests/Grid/upperbound2.cc create mode 100644 tests/Grid/widening1.cc create mode 100644 tests/Grid/widening2.cc create mode 100644 tests/Grid/widening3.cc create mode 100644 tests/Grid/writecongruencesystem.cc create mode 100644 tests/MIP_Problem/Makefile.am create mode 100644 tests/MIP_Problem/Makefile.in create mode 100644 tests/MIP_Problem/ascii_dump_load1.cc create mode 100644 tests/MIP_Problem/exceptions1.cc create mode 100644 tests/MIP_Problem/mipproblem1.cc create mode 100644 tests/MIP_Problem/mipproblem2.cc create mode 100644 tests/MIP_Problem/mipproblem3.cc create mode 100644 tests/Makefile.am create mode 100644 tests/Makefile.in create mode 100644 tests/Octagonal_Shape/Makefile.am create mode 100644 tests/Octagonal_Shape/Makefile.in create mode 100644 tests/Octagonal_Shape/addspacedims1.cc create mode 100644 tests/Octagonal_Shape/affinedimension1.cc create mode 100644 tests/Octagonal_Shape/affineimage1.cc create mode 100644 tests/Octagonal_Shape/affineimage2.cc create mode 100644 tests/Octagonal_Shape/affinepreimage1.cc create mode 100644 tests/Octagonal_Shape/affinepreimage2.cc create mode 100644 tests/Octagonal_Shape/ascii_dump_load1.cc create mode 100644 tests/Octagonal_Shape/bhmz05widening1.cc create mode 100644 tests/Octagonal_Shape/bhz03widening1.cc create mode 100644 tests/Octagonal_Shape/bounded1.cc create mode 100644 tests/Octagonal_Shape/boundedaffineimage1.cc create mode 100644 tests/Octagonal_Shape/boundedaffinepreimage1.cc create mode 100644 tests/Octagonal_Shape/bounds1.cc create mode 100644 tests/Octagonal_Shape/cc76extrapolation1.cc create mode 100644 tests/Octagonal_Shape/cc76narrowing1.cc create mode 100644 tests/Octagonal_Shape/chinainit.cc create mode 100644 tests/Octagonal_Shape/concatenate1.cc create mode 100644 tests/Octagonal_Shape/congruences1.cc create mode 100644 tests/Octagonal_Shape/constrains1.cc create mode 100644 tests/Octagonal_Shape/constraints1.cc create mode 100644 tests/Octagonal_Shape/contains1.cc create mode 100644 tests/Octagonal_Shape/containsintegerpoint1.cc create mode 100644 tests/Octagonal_Shape/difference1.cc create mode 100644 tests/Octagonal_Shape/discrete1.cc create mode 100644 tests/Octagonal_Shape/disjoint1.cc create mode 100644 tests/Octagonal_Shape/empty1.cc create mode 100644 tests/Octagonal_Shape/expandspacedim1.cc create mode 100644 tests/Octagonal_Shape/foldspacedims1.cc create mode 100644 tests/Octagonal_Shape/frombdshape1.cc create mode 100644 tests/Octagonal_Shape/frombox1.cc create mode 100644 tests/Octagonal_Shape/fromgensys1.cc create mode 100644 tests/Octagonal_Shape/fromgrid1.cc create mode 100644 tests/Octagonal_Shape/fromoctagonalshape1.cc create mode 100644 tests/Octagonal_Shape/frompolyhedron1.cc create mode 100644 tests/Octagonal_Shape/fromspacedim1.cc create mode 100644 tests/Octagonal_Shape/generalizedaffineimage1.cc create mode 100644 tests/Octagonal_Shape/generalizedaffineimage2.cc create mode 100644 tests/Octagonal_Shape/generalizedaffineimage3.cc create mode 100644 tests/Octagonal_Shape/generalizedaffineimage4.cc create mode 100644 tests/Octagonal_Shape/generalizedaffineimage5.cc create mode 100644 tests/Octagonal_Shape/generalizedaffinepreimage1.cc create mode 100644 tests/Octagonal_Shape/generalizedaffinepreimage2.cc create mode 100644 tests/Octagonal_Shape/generalizedaffinepreimage3.cc create mode 100644 tests/Octagonal_Shape/generalizedaffinepreimage4.cc create mode 100644 tests/Octagonal_Shape/intersection1.cc create mode 100644 tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc create mode 100644 tests/Octagonal_Shape/limitedcc76extrapolation1.cc create mode 100644 tests/Octagonal_Shape/mapspacedims1.cc create mode 100644 tests/Octagonal_Shape/max_min1.cc create mode 100644 tests/Octagonal_Shape/max_min2.cc create mode 100644 tests/Octagonal_Shape/maxspacedim1.cc create mode 100644 tests/Octagonal_Shape/membytes1.cc create mode 100644 tests/Octagonal_Shape/minconstraints1.cc create mode 100644 tests/Octagonal_Shape/relatwithcons1.cc create mode 100644 tests/Octagonal_Shape/relatwithcons2.cc create mode 100644 tests/Octagonal_Shape/relatwithcons3.cc create mode 100644 tests/Octagonal_Shape/relatwithgen1.cc create mode 100644 tests/Octagonal_Shape/removespacedims1.cc create mode 100755 tests/Octagonal_Shape/run_tests create mode 100644 tests/Octagonal_Shape/simplifyusingcontext1.cc create mode 100644 tests/Octagonal_Shape/timeelapse1.cc create mode 100644 tests/Octagonal_Shape/unconstrain1.cc create mode 100644 tests/Octagonal_Shape/universe1.cc create mode 100644 tests/Octagonal_Shape/upperbound1.cc create mode 100644 tests/Octagonal_Shape/upperboundifexact1.cc create mode 100644 tests/Octagonal_Shape/writeoctagon1.cc create mode 100644 tests/Partial_Function.cc create mode 100644 tests/Partial_Function.defs.hh create mode 100644 tests/Partial_Function.inlines.hh create mode 100644 tests/Partial_Function.types.hh create mode 100644 tests/Partially_Reduced_Product/Makefile.am create mode 100644 tests/Partially_Reduced_Product/Makefile.in create mode 100644 tests/Partially_Reduced_Product/asciidumpload1.cc create mode 100644 tests/Partially_Reduced_Product/directproduct1.cc create mode 100644 tests/Partially_Reduced_Product/directproduct2.cc create mode 100644 tests/Partially_Reduced_Product/directproduct3.cc create mode 100644 tests/Partially_Reduced_Product/directproduct4.cc create mode 100644 tests/Partially_Reduced_Product/directproduct5.cc create mode 100644 tests/Partially_Reduced_Product/directproduct6.cc create mode 100644 tests/Partially_Reduced_Product/partiallyreducedproduct1.cc create mode 100644 tests/Partially_Reduced_Product/partiallyreducedproduct2.cc create mode 100644 tests/Partially_Reduced_Product/partiallyreducedproduct3.cc create mode 100644 tests/Partially_Reduced_Product/partiallyreducedproduct4.cc create mode 100644 tests/Polyhedron/Makefile.am create mode 100644 tests/Polyhedron/Makefile.in create mode 100644 tests/Polyhedron/addcongruence1.cc create mode 100644 tests/Polyhedron/addcongruences1.cc create mode 100644 tests/Polyhedron/addconstraint1.cc create mode 100644 tests/Polyhedron/addconstraints1.cc create mode 100644 tests/Polyhedron/addconstraints2.cc create mode 100644 tests/Polyhedron/addgenerator1.cc create mode 100644 tests/Polyhedron/addgenerator2.cc create mode 100644 tests/Polyhedron/addgenerators1.cc create mode 100644 tests/Polyhedron/addgenerators2.cc create mode 100644 tests/Polyhedron/addspacedims1.cc create mode 100644 tests/Polyhedron/addspacedims2.cc create mode 100644 tests/Polyhedron/affineimage1.cc create mode 100644 tests/Polyhedron/affineimage2.cc create mode 100644 tests/Polyhedron/affinepreimage1.cc create mode 100644 tests/Polyhedron/affinetrans.cc create mode 100644 tests/Polyhedron/append1.cc create mode 100644 tests/Polyhedron/append2.cc create mode 100644 tests/Polyhedron/ascii_dump_load1.cc create mode 100644 tests/Polyhedron/ascii_dump_load2.cc create mode 100644 tests/Polyhedron/ascii_dump_load3.cc create mode 100644 tests/Polyhedron/bgp99extrapolation1.cc create mode 100644 tests/Polyhedron/bgp99extrapolation2.cc create mode 100644 tests/Polyhedron/bhrz03widening1.cc create mode 100644 tests/Polyhedron/bhrz03widening2.cc create mode 100644 tests/Polyhedron/bhrz03widening3.cc create mode 100644 tests/Polyhedron/bhz03widening1.cc create mode 100644 tests/Polyhedron/bounded1.cc create mode 100644 tests/Polyhedron/boundedaffineimage1.cc create mode 100644 tests/Polyhedron/boundedaffinepreimage1.cc create mode 100644 tests/Polyhedron/boundedbhrz03extrapolation1.cc create mode 100644 tests/Polyhedron/boundedh79extrapolation1.cc create mode 100644 tests/Polyhedron/bounds1.cc create mode 100644 tests/Polyhedron/cnncconversion1.cc create mode 100644 tests/Polyhedron/concatenate1.cc create mode 100644 tests/Polyhedron/congruences1.cc create mode 100644 tests/Polyhedron/constrains1.cc create mode 100644 tests/Polyhedron/constraints1.cc create mode 100644 tests/Polyhedron/contains1.cc create mode 100644 tests/Polyhedron/contains2.cc create mode 100644 tests/Polyhedron/containsintegerpoint1.cc create mode 100644 tests/Polyhedron/disjoint1.cc create mode 100644 tests/Polyhedron/disjoint2.cc create mode 100644 tests/Polyhedron/dualhypercubes.cc create mode 100644 tests/Polyhedron/empty1.cc create mode 100644 tests/Polyhedron/equals1.cc create mode 100644 tests/Polyhedron/exceptions1.cc create mode 100644 tests/Polyhedron/exceptions2.cc create mode 100644 tests/Polyhedron/exceptions3.cc create mode 100644 tests/Polyhedron/expandspacedim1.cc create mode 100644 tests/Polyhedron/expandspacedim2.cc create mode 100644 tests/Polyhedron/foldspacedims1.cc create mode 100644 tests/Polyhedron/foldspacedims2.cc create mode 100644 tests/Polyhedron/frombdshape1.cc create mode 100644 tests/Polyhedron/frombox1.cc create mode 100644 tests/Polyhedron/frombox2.cc create mode 100644 tests/Polyhedron/fromgrid1.cc create mode 100644 tests/Polyhedron/fromoctagonalshape1.cc create mode 100644 tests/Polyhedron/generalizedaffineimage1.cc create mode 100644 tests/Polyhedron/generalizedaffineimage2.cc create mode 100644 tests/Polyhedron/generalizedaffinepreimage1.cc create mode 100644 tests/Polyhedron/generalizedaffinepreimage2.cc create mode 100644 tests/Polyhedron/generators1.cc create mode 100644 tests/Polyhedron/geomcovers1.cc create mode 100644 tests/Polyhedron/h79widening1.cc create mode 100644 tests/Polyhedron/h79widening2.cc create mode 100644 tests/Polyhedron/hybrid.cc create mode 100644 tests/Polyhedron/intersection1.cc create mode 100644 tests/Polyhedron/limitedbhrz03extrapolation1.cc create mode 100644 tests/Polyhedron/limitedh79extrapolation1.cc create mode 100644 tests/Polyhedron/linearexpression1.cc create mode 100644 tests/Polyhedron/linearpartition1.cc create mode 100644 tests/Polyhedron/linearsystem1.cc create mode 100644 tests/Polyhedron/mapspacedims1.cc create mode 100644 tests/Polyhedron/matrix1.cc create mode 100644 tests/Polyhedron/max_min1.cc create mode 100644 tests/Polyhedron/maxspacedim1.cc create mode 100644 tests/Polyhedron/mc91.cc create mode 100644 tests/Polyhedron/membytes1.cc create mode 100644 tests/Polyhedron/memory1.cc create mode 100644 tests/Polyhedron/memory2.cc create mode 100644 tests/Polyhedron/minconstraints1.cc create mode 100644 tests/Polyhedron/minconstraints2.cc create mode 100644 tests/Polyhedron/mingenerators1.cc create mode 100644 tests/Polyhedron/mingenerators2.cc create mode 100644 tests/Polyhedron/nncminimize1.cc create mode 100644 tests/Polyhedron/nncminimize2.cc create mode 100644 tests/Polyhedron/numberinput1.cc create mode 100644 tests/Polyhedron/onepoint.cc create mode 100644 tests/Polyhedron/permute.cc create mode 100644 tests/Polyhedron/polydifference1.cc create mode 100644 tests/Polyhedron/polydifference2.cc create mode 100644 tests/Polyhedron/polyhull1.cc create mode 100644 tests/Polyhedron/polyhull2.cc create mode 100644 tests/Polyhedron/polyhullifexact1.cc create mode 100644 tests/Polyhedron/polyhullifexact2.cc create mode 100644 tests/Polyhedron/randphull1.cc create mode 100644 tests/Polyhedron/refinewithcongruence1.cc create mode 100644 tests/Polyhedron/refinewithcongruences1.cc create mode 100644 tests/Polyhedron/refinewithconstraint1.cc create mode 100644 tests/Polyhedron/refinewithconstraints1.cc create mode 100644 tests/Polyhedron/relations1.cc create mode 100644 tests/Polyhedron/relations2.cc create mode 100644 tests/Polyhedron/relations3.cc create mode 100644 tests/Polyhedron/removespacedims1.cc create mode 100644 tests/Polyhedron/removespacedims2.cc create mode 100644 tests/Polyhedron/simplifyusingcontext1.cc create mode 100644 tests/Polyhedron/smm1.cc create mode 100644 tests/Polyhedron/timeelapse1.cc create mode 100644 tests/Polyhedron/timeelapse2.cc create mode 100644 tests/Polyhedron/topclosed1.cc create mode 100644 tests/Polyhedron/topclosure1.cc create mode 100644 tests/Polyhedron/unconstrain1.cc create mode 100644 tests/Polyhedron/universe1.cc create mode 100644 tests/Polyhedron/universe2.cc create mode 100644 tests/Polyhedron/variablesset1.cc create mode 100644 tests/Polyhedron/watchdog1.cc create mode 100644 tests/Polyhedron/writeconsys1.cc create mode 100644 tests/Polyhedron/writegensys1.cc create mode 100644 tests/Polyhedron/writepolyhedron1.cc create mode 100644 tests/Polyhedron/writepolyhedron2.cc create mode 100644 tests/Polyhedron/writerelation1.cc create mode 100644 tests/Polyhedron/writevariable1.cc create mode 100644 tests/Powerset/Makefile.am create mode 100644 tests/Powerset/Makefile.in create mode 100644 tests/Powerset/addcongruences1.cc create mode 100644 tests/Powerset/addconstraints1.cc create mode 100644 tests/Powerset/affinedimension1.cc create mode 100644 tests/Powerset/affineimage1.cc create mode 100644 tests/Powerset/affinepreimage1.cc create mode 100644 tests/Powerset/bounded1.cc create mode 100644 tests/Powerset/bounds1.cc create mode 100644 tests/Powerset/closed1.cc create mode 100644 tests/Powerset/closure1.cc create mode 100644 tests/Powerset/collapse1.cc create mode 100644 tests/Powerset/concatenate1.cc create mode 100644 tests/Powerset/contains1.cc create mode 100644 tests/Powerset/containsintegerpoint1.cc create mode 100644 tests/Powerset/difference1.cc create mode 100644 tests/Powerset/discrete1.cc create mode 100644 tests/Powerset/disjoint1.cc create mode 100644 tests/Powerset/disjunct1.cc create mode 100644 tests/Powerset/empty1.cc create mode 100644 tests/Powerset/entails1.cc create mode 100644 tests/Powerset/equals1.cc create mode 100644 tests/Powerset/frombdshape1.cc create mode 100644 tests/Powerset/frombox1.cc create mode 100644 tests/Powerset/fromcongruences1.cc create mode 100644 tests/Powerset/fromconstraints1.cc create mode 100644 tests/Powerset/fromgrid1.cc create mode 100644 tests/Powerset/fromoctagonalshape1.cc create mode 100644 tests/Powerset/frompolyhedron1.cc create mode 100644 tests/Powerset/fromspacedimension1.cc create mode 100644 tests/Powerset/intersection1.cc create mode 100644 tests/Powerset/maxmin1.cc create mode 100644 tests/Powerset/meet1.cc create mode 100644 tests/Powerset/membytes1.cc create mode 100644 tests/Powerset/powerset1.cc create mode 100644 tests/Powerset/reduce1.cc create mode 100644 tests/Powerset/refinewith1.cc create mode 100644 tests/Powerset/relationwith1.cc create mode 100644 tests/Powerset/simplifyusingcontext1.cc create mode 100644 tests/Powerset/size1.cc create mode 100644 tests/Powerset/spacedims1.cc create mode 100644 tests/Powerset/universe1.cc create mode 100644 tests/Powerset/upperbound1.cc create mode 100644 tests/README create mode 100644 tests/Random_Number_Generator.defs.hh create mode 100644 tests/Random_Number_Generator.inlines.hh create mode 100644 tests/Random_Number_Generator.types.hh create mode 100644 tests/files.cc create mode 100644 tests/files.hh create mode 100644 tests/ppl_test.cc create mode 100644 tests/ppl_test.hh create mode 100644 tests/valgrind_suppressions create mode 100644 utils/Makefile.am create mode 100644 utils/Makefile.in create mode 100644 utils/build_header.in create mode 100755 utils/cm_cleaner.sh create mode 100755 utils/cm_splitter.sh create mode 100644 utils/text2cxxarray.in create mode 100644 utils/timings.cc create mode 100644 utils/timings.hh diff --git a/BUGS b/BUGS new file mode 100644 index 0000000..794468e --- /dev/null +++ b/BUGS @@ -0,0 +1,22 @@ + +The PPL developers encourage you to report any bugs you find to +ppl-devel@cs.unipr.it. Here `bug' should be interpreted in its +broadest sense: outright software errors, misfeatures, bad interfaces, +missing or unclear documentation... whatever is a subject for possible +improvement. + +As far as software bugs are concerned, the best reports are those that +are reproducible. Including (or pointing us to) code that exhibits +the reported misbehavior is the best thing you can do to help us fix +the library. Of course, this is not always possible and we will +welcome any kind of bug report. Anyway, you may be interested to read +http://www.chiark.greenend.org.uk/~sgtatham/bugs.html on how to report +bugs effectively. + + +KNOWN BUGS +========== + +All known bugs were resolved before the release. It is likely that +there are still bugs in the released version. Any bugs found after +the release will be listed at http://www.cs.unipr.it/ppl/Bugs/ . diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..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. + 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. + + + Copyright (C) + + 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 . + +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: + + Copyright (C) + 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 +. + + 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 +. diff --git a/CREDITS b/CREDITS new file mode 100644 index 0000000..7316d9b --- /dev/null +++ b/CREDITS @@ -0,0 +1,408 @@ + +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] (University of Parma) + Patricia M. Hill [2] (University of Leeds) + Enea Zaffanella [3] (University of Parma) + + +Former Members of the Core Development Team: +-------------------------------------------- + + Elisa Ricci (former student of the University of Parma, + 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: +--------------------- + + Abramo Bagnara (Opera Unica) rewrote and generalized the + support for checked coefficients. He also + wrote the support for extended numbers and is + currently writing a new implementation of + intervals. He also helps on several other + design and implementation issues. + + 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. + + Katy Dobson [4] (University of Leeds) is working on the + formalization and definition of algorithms for + rational grids and products of grids and + polyhedra. + + Enric Rodriguez Carbonell [5] (Technical University of Catalonia) is + working on the implementation of polynomial spaces. + + Alessandro Zaccagnini [6] (University of Parma) has helped with + the efficient implementation of GCD and LCM + for checked numbers. He is now working on the + definitions of interval arithmetic operations. + Alessandro is always a very valuable source of + mathematical advice. + + +Past Contributors: +------------------ + + Irene Bacchi (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. + + 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. + + Giordano Fracasso (University of Parma) wrote the initial version + of the support for native and checked integer + coefficients. + + Maximiliano Marchesi (former student of the University of Parma) + helped a little to improve the documentation for + bounded differences. + + Elena Mazzi (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 [7] (formerly at the University of Leeds) worked + on the implementation of rational grids. He has + also helped on other implementation issues. + + Andrea Pescetti (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. + + Angela Stazzone (former student of the University of Parma) + worked on the library's documentation. + + Fabio Trabucchi (University of Parma) worked on a development + branch where he added serializers for all the + objects of the PPL. Support for serialization + based on Fabio's work will be available in a + future release of the library. + + Claudio Trento (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) made it possible (by writing the + AC_LIB_LINKFLAGS macro and explaining how + to use it) to allow the use of versions of the + GMP library installed 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. + + 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 hash code 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] is supporting 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]; + +- 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'' [63]; + +- Royal Society International Outgoing Short Visit 2007/R4 + ``Finding and Verifying the Absence of Bugs in Imperative Programs'' [64]; + +- EPSRC (UK) project EP/G025177/1 + ``Geometric Abstractions for Scalable Program Analyzers'' [64]. + +-------- + + [1] http://www.cs.unipr.it/~bagnara/ + [2] http://www.comp.leeds.ac.uk/hill/ + [3] http://www.cs.unipr.it/~zaffanella/ + [4] http://www.comp.leeds.ac.uk/katyd/ + [5] http://www.lsi.upc.edu/~erodri/ + [6] http://www.math.unipr.it/~zaccagni/ + [7] http://www.mundell.ukfsn.org/ + [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://www.cs.unipr.it/ppl/Documentation/chernikova.c +[23] http://www.cs.unipr.it/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.comp.leeds.ac.uk/hill/chiara/WWW/linda.html +[64] http://www.comp.leeds.ac.uk/hill/chiara/WWW/projects.html diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..8137bf8 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,1826 @@ +2009-04-18 Roberto Bagnara + + * PPL 0.10.2 released. + +2009-04-16 Roberto Bagnara + + * fedora/ppl-0.10.1-Makefile.patch, + fedora/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 + + * doc/libppl.3, doc/libppl_c.3: Version numbers fixed. + +2009-04-16 Roberto Bagnara + + * 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 + + * Watchdog/doc/Makefile.am, doc/Makefile.am: Added targets to have + `make -n dist' work as expected. + +2009-04-16 Roberto Bagnara + + * demos/ppl_lcdd/ppl_lcdd.cc: Usage string fixed: ppl_lcdd accepts + at most one input file. + +2009-04-16 Roberto Bagnara + + * 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 + + * doc/definitions.dox: Updated BHZ09b. + +2009-04-15 Roberto Bagnara + + * NEWS, tests/Polyhedron/memory1.cc: Test program + tests/Polyhedron/memory1 disabled on the zSeries s390x platform. + +2009-04-15 Roberto Bagnara + + * NEWS, README, TODO, configure.ac: Updated for PPL 0.10.2. + +2009-04-15 Roberto Bagnara + + * 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 + + * 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 + + * doc/README.doc: Improved. + +2009-04-14 Enea Zaffanella + + * doc/README.doc: Updated to refer to git and to mention possible + names of TeX config files. + +2009-04-14 Roberto Bagnara + + * PPL 0.10.1 released. + +2009-04-13 Roberto Bagnara + + * ChangeLog: Updated. + +2009-04-13 Roberto Bagnara + + * tests/Octagonal_Shape/affineimage1.cc: Disabled test10() on the + Alpha. + +2009-04-12 Roberto Bagnara + + * ChangeLog: Updated. + +2009-04-12 Roberto Bagnara + + * 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 + + * interfaces/C/tests/.gitignore, interfaces/Prolog/XSB/.gitignore, + interfaces/Prolog/YAP/.gitignore: Added missing patterns. Removed + obsolete ones. + +2009-04-11 Roberto Bagnara + + * .gitignore, Watchdog/doc/.gitignore, doc/.gitignore, + interfaces/Prolog/XSB/.gitignore: Added missing patterns. + +2009-04-11 Roberto Bagnara + + * 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 + + * ChangeLog, Watchdog/ChangeLog: Updated. + +2009-04-11 Roberto Bagnara + + * interfaces/Prolog/XSB/Makefile.am: Fixed reference to CLPQ_TESTS. + +2009-04-10 Roberto Bagnara + + * ChangeLog: Updated. + +2009-04-10 Roberto Bagnara + + * src/checked_float.inlines.hh: Only use fmaf(), fma() and fmal() if + they are fast. + +2009-04-10 Roberto Bagnara + + * configure.ac: Version number bumped. + +2009-04-10 Roberto Bagnara + + * 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 + + * CREDITS: Mentioned the AIDA 2007 project. + +2009-04-09 Roberto Bagnara + + * CREDITS: Acknowledge the contribution of HiPEAC. + +2009-04-09 Roberto Bagnara + + * CREDITS: Acknowledge the contribution of INRIA. + +2009-04-09 Roberto Bagnara + + * CREDITS: Acknowledge the contribution of AMD. Fixed mistaked of + previous commit. + +2009-04-09 Roberto Bagnara + + * CREDITS: Acknowledge the contribution of Kenneth MacKenzie. + +2009-04-07 Roberto Bagnara + + * tests/Octagonal_Shape/unconstrain1.cc: Disabled test07() on the + Alpha. + +2009-04-06 Roberto Bagnara + + * ChangeLog, Watchdog/ChangeLog: Updated. + +2009-04-06 Roberto Bagnara + + * 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 + + * configure.ac: Version number bumped. + +2009-04-06 Abramo Bagnara + + * demos/ppl_lcdd/Makefile.am, demos/ppl_lpsol/Makefile.am, + devtools/print_nonascii_lines: Avoid differences generated by + locale. + +2009-04-06 Roberto Bagnara + + * demos/ppl_lcdd/Makefile.am: Set LC_COLLATE=C in addition to + LANG=C. + +2009-04-03 Roberto Bagnara + + * tests/Octagonal_Shape/generalizedaffinepreimage3.cc: Disabled + test04() on the Alpha. + +2009-04-05 Roberto Bagnara + + * tests/Octagonal_Shape/cc76extrapolation1.cc, + tests/Octagonal_Shape/disjoint1.cc: Disabled a couple of tests on + the Alpha. + +2009-04-04 Roberto Bagnara + + * Watchdog/NEWS, Watchdog/README, Watchdog/configure.ac, + Watchdog/src/Makefile.am: Updated for PWL 0.7. + +2009-04-04 Roberto Bagnara + + * README: Updated for PPL 0.10.1. + +2009-04-04 Roberto Bagnara + + * NEWS: More NEWS items added. Tentative release date set to April + 14, 2009. + +2009-04-03 Enea Zaffanella + + * 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 + + * 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 + + * src/Box.templates.hh: Avoid warning of unused variable space_dim. + +2009-04-03 Roberto Bagnara + + * interfaces/C/tests/ppl_c_test.cc: Work around a bug affecting some + versions of . + +2009-04-02 Roberto Bagnara + + * 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 + + * 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 + + * 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 + + * NEWS: Added a couple of items. + +2009-04-02 Enea Zaffanella + + * TODO: We no longer have FIXME's for 0.10.1. + +2009-04-02 Enea Zaffanella + + * src/Grid.templates.hh: Another FIXME postponed to 0.11. + +2009-04-02 Enea Zaffanella + + * src/Box.templates.hh, tests/Box/refinewithconstraint1.cc: A couple + of FIXME postponed to 0.11. + +2009-04-01 Roberto Bagnara + + * src/OR_Matrix.inlines.hh: Code duplication and useless bitwise + manipulation avoided. + +2009-04-01 Roberto Bagnara + + * src/OR_Matrix.defs.hh, src/OR_Matrix.inlines.hh: FIXME resolved. + +2009-04-01 Roberto Bagnara + + * tests/Polyhedron/exceptions2.cc: Disabled test19() on the Alpha. + +2009-04-01 Enea Zaffanella + + * tests/Box/ascii_dump_load1.cc: Adapted test + Box/ascii_dump_load1.cc and FIXME removed. + +2009-04-01 Patricia Hill + + * src/Box.templates.hh: Typo fixed. + +2009-04-01 Patricia Hill + + * src/Box.defs.hh, src/Box.templates.hh, tests/Box/Makefile.am, + tests/Box/limitedcc76extrapolation1.cc: Revised the implementation + for Box::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 + + * tests/Box/empty1.cc: Test adapted and fixme removed. + +2009-04-01 Patricia Hill + + * 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 + + * README, src/Makefile.am: Updated for PPL 0.10.1. + +2009-04-01 Roberto Bagnara + + * TODO: New items for PPL 0.11 added. Other items scheduled for PPL + 0.11. + +2009-03-31 Abramo Bagnara + + * src/DB_Matrix.templates.hh, src/OR_Matrix.templates.hh: Made + ascii_load more restrictive. + +2009-03-31 Roberto Bagnara + + * src/BD_Shape.templates.hh: Indentation fixed. + +2009-03-31 Roberto Bagnara + + * : commit ccc5ce00a303af09a7e37d120695a2c1cbb37834 Author: Roberto + Bagnara Date: Tue Mar 31 17:37:40 2009 +0000 + +2009-03-31 Abramo Bagnara + + * src/Box.inlines.hh: Postponed FIXME. + +2009-03-31 Abramo Bagnara + + * src/Init.cc: Removed FIXME and documented the default value. + +2009-03-31 Abramo Bagnara + + * TODO: Added TODO item. + +2009-03-31 Abramo Bagnara + + * src/Polyhedron_nonpublic.cc: Postponed FIXME. + +2009-03-31 Abramo Bagnara + + * tests/BD_Shape/Makefile.am, tests/Box/Makefile.am, + tests/Octagonal_Shape/Makefile.am: Fixed run_tests make. + +2009-03-31 Patricia Hill + + * 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 + + * tests/Octagonal_Shape/boundedaffineimage1.cc, + tests/Octagonal_Shape/difference1.cc: Disabled some tests on the + Alpha. + +2009-03-30 Roberto Bagnara + + * Watchdog/configure.ac, configure.ac: Version number bumped. The + name of the program is Autoconf. + +2009-03-30 Enea Zaffanella + + * 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 + + * TODO: Added one item for PPL 0.11. + +2009-03-30 Roberto Bagnara + + * tests/Box/relations4.cc: Disable test19() on the Alpha. + +2009-03-30 Roberto Bagnara + + * interfaces/C/tests/Makefile.am: Fixed *_CPPFLAGS variables. + +2009-03-30 Roberto Bagnara + + * interfaces/C/tests/formatted_output.c: Include "ppl_c_test.h" + instead of "ppl_c.h". + +2009-03-30 Roberto Bagnara + + * interfaces/C/tests/ppl_c_test.h: Include "ppl_c.h". + +2009-03-30 Roberto Bagnara + + * configure.ac: Avoid redefining NDEBUG. + +2009-03-30 Enea Zaffanella + + * 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 + + * 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 + + * src/Box.inlines.hh: Obsolete FIXME removed: methods Box::refine_* + were fixed long ago. + +2009-03-30 Roberto Bagnara + + * 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 + + * 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 + + * README.alpha: Warn about the GCC bug affecting exception handling + on the Alpha. + +2009-03-30 Roberto Bagnara + + * TODO: Consider switching to MLGMPIDL for the OCaml interface. + +2009-03-30 Abramo Bagnara + + * 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 + + * 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 + + * interfaces/Java/jni/ppl_java_globals.cc: Added file. + +2009-03-30 Abramo Bagnara + + * interfaces/Java/parma_polyhedra_library/Makefile.am: Added file. + +2009-03-30 Abramo Bagnara + + * interfaces/Java/tests/MIP_Problem_test1.java: Added test. + +2009-03-30 Abramo Bagnara + + * interfaces/Java/parma_polyhedra_library/IO.java, + interfaces/Java/parma_polyhedra_library/Makefile.am: Added java. + +2009-03-30 Abramo Bagnara + + * interfaces/Java/jni/ppl_java_globals.cc: Fix2. + +2009-03-30 Abramo Bagnara + + * interfaces/Java/jni/ppl_java_globals.cc: Fix. + +2009-03-30 Abramo Bagnara + + * interfaces/Java/jni/ppl_java_globals.cc: Added wrap_string. + +2009-03-30 Enea Zaffanella + + * 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 + + * TODO, Watchdog/src/Watchdog.defs.hh: Moved TODO items to their + place. + +2009-03-30 Enea Zaffanella + + * 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 + + * interfaces/OCaml/OCaml_interface.dox, + interfaces/Prolog/Prolog_interface.dox: Improvements to the OCaml + and Prolog interface documentation. + +2009-03-30 Abramo Bagnara + + * 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 + + * 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 + + * tests/BD_Shape/Makefile.am, tests/Box/Makefile.am, + tests/Octagonal_Shape/Makefile.am: Restore parallelized tests. + +2009-03-30 Enea Zaffanella + + * 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 + + * 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 + + * 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 + + * 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 + + * configure.ac: Version number bumped. + +2009-03-29 Roberto Bagnara + + * interfaces/C/tests/Makefile.am: Temporary workaround to force + linking with C++. + +2009-03-29 Enea Zaffanella + + * 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 - 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 + + * tests/MIP_Problem/exceptions1.cc: Disable these tests on the + Alpha. + +2009-03-29 Roberto Bagnara + + * configure.ac: Version number bumped. + +2009-03-29 Roberto Bagnara + + * 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 + + * src/Interval.inlines.hh: Remove unimplemented and unused + functions. + +2009-03-28 Roberto Bagnara + + * 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 + + * configure.ac, src/Bit_Row.inlines.hh: Some systems do not have + . On such systems ffs(3) may be defined in . + +2009-03-28 Roberto Bagnara + + * TODO: Done item removed. + +2009-03-28 Roberto Bagnara + + * ChangeLog, ChangeLog-2001-2008, ChangeLog_2001-2008, + Watchdog/ChangeLog, Watchdog/ChangeLog-2001-2008, + Watchdog/ChangeLog_2001-2008: Change logs updated. + +2009-03-28 Roberto Bagnara + + * Watchdog/configure.ac, configure.ac: Improved the semantics of the + --enable-watchdog configure option. + +2009-03-28 Abramo Bagnara + + * src/Interval.inlines.hh: Removed useless functions. + +2009-03-28 Roberto Bagnara + + * tests/Box/frombox1.cc: Fixed and reactivated test05(). + +2009-03-28 Roberto Bagnara + + * tests/Box/frombox1.cc: Parameterized test05(). + +2009-03-28 Roberto Bagnara + + * src/checked_mpz.inlines.hh: Fixed indentation. + +2009-03-28 Abramo Bagnara + + * src/checked.inlines.hh: These efficiency related FIXME's are not + scheduled for 0.10.1 + +2009-03-28 Abramo Bagnara + + * src/Checked_Number.inlines.hh: Documented ROUND_NOT_NEEDED FIXME. + +2009-03-28 Abramo Bagnara + + * 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 + + * src/checked_mpz.inlines.hh: Avoid unrequested call to + mpz_divisible_p. + +2009-03-28 Roberto Bagnara + + * 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 + + * tests/Box/frombox1.cc: Disabled failing test. + +2009-03-28 Abramo Bagnara + + * src/checked_mpz.inlines.hh: Avoid abuse of mpz_divexact. + +2009-03-28 Roberto Bagnara + + * interfaces/C/tests/Makefile.am: Tweak for MinGW. Force the use of + the C++ compiler for linking. + +2009-03-28 Roberto Bagnara + + * interfaces/C/tests/print_to_buffer.c: Include instead + of . + +2009-03-28 Roberto Bagnara + + * demos/ppl_lpsol/Makefile.am: Allow testing under MinGW. + +2009-03-28 Roberto Bagnara + + * configure.ac: Detect MinGW, defining the HOST_OS_MINGW Automake + conditional. + +2009-03-27 Roberto Bagnara + + * 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 + + * demos/ppl_lcdd/ppl_lcdd.cc: Minor code readability improvements. + +2009-03-27 Roberto Bagnara + + * interfaces/C/ppl_c_header.h, src/wrap.hh: Comments improved. + +2009-03-27 Enea Zaffanella + + * interfaces/C/ppl_c_header.h: A couple of minor corrections. + +2009-03-27 Abramo Bagnara + + * interfaces/C/ppl_c_header.h: Fixed parameter name. + +2009-03-27 Abramo Bagnara + + * interfaces/C/ppl_c_header.h: Moved ppl_io_wrap_string + documentation. + +2009-03-27 Roberto Bagnara + + * demos/ppl_lpsol/ppl_lpsol.1, doc/ppl-config.1: Man pages updated. + +2009-03-27 Roberto Bagnara + + * 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 + + * 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.inlines.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/wrap.hh: Get rid of + pretty_printing stuff. A string wrapping function is made available. + +2009-03-27 Roberto Bagnara + + * 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 + + * ChangeLog, ChangeLog-2001-2008, Watchdog/ChangeLog, + Watchdog/ChangeLog-2001-2008: Renamed and frozen: the + ChangeLog-2001-2008 should never be changed again. + +2009-03-27 Roberto Bagnara + + * ChangeLog, Watchdog/ChangeLog: Updated to 2008-12-31. + +2009-03-27 Abramo Bagnara + + * 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 + + * src/Constraint_System.cc: Missing else branch added. + +2009-03-27 Roberto Bagnara + + * 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 + + * tests/Polyhedron/ascii_dump_load1.cc: Spurious spaces removed. + +2009-03-27 Roberto Bagnara + + * tests/Grid/asciidumpload2.cc: Spurious spaces removed. + +2009-03-27 Roberto Bagnara + + * tests/Polyhedron/memory1.cc, tests/Polyhedron/watchdog1.cc: Fixed + the formatting of do-while loops. + +2009-03-26 Enea Zaffanella + + * 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 + + * 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 + + * 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 + + * NEWS: Report on two bugs fixed in the OCaml interface. + +2009-03-26 Patricia Hill + + * 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 + + * Watchdog/tests/pwl_test.cc, tests/ppl_test.cc: Support systems + that do not define `siginfo_t'. + +2009-03-26 Roberto Bagnara + + * Watchdog/configure.ac, configure.ac: Added checks for the + availability of `siginfo_t'. + +2009-03-26 Roberto Bagnara + + * 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 ). + +2009-03-25 Abramo Bagnara + + * 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 + + * src/fpu-ia32.inlines.hh: Properly use PPL_FPMATH_MAY_USE_387 and + PPL_FPMATH_MAY_USE_SSE. + +2009-03-25 Roberto Bagnara + + * src/fpu-ia32.cc: Depend on PPL_CAN_CONTROL_FPU. + +2009-03-25 Roberto Bagnara + + * configure.ac: Typo fixed. + +2009-03-25 Roberto Bagnara + + * : commit b5d7b09c10aea7c95b9d2693986e2e4e549d3a12 Author: Roberto + Bagnara Date: Wed Mar 25 21:06:01 2009 +0100 + +2009-03-25 Roberto Bagnara + + * 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 + + * 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 + + * TODO: TODO item - Check the configuration dependent documentation for Prolog, done + and removed. + +2009-03-25 Patricia Hill + + * 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 + + * 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 + + * interfaces/C/tests/formatted_output.c: Reduced DIMENSION to 100. + +2009-03-24 Roberto Bagnara + + * 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 + + * interfaces/C/Makefile.am: Fixed file names. + +2009-03-24 Enea Zaffanella + + * NEWS: Mention the bug corrected for method + Octagonal_Shape::affine_image(). + +2009-03-24 Abramo Bagnara + + * interfaces/C/ppl_c_header.h: Fixed comment. + +2009-03-24 Abramo Bagnara + + * interfaces/C/ppl_c_header.h: Fixed indentation. + +2009-03-24 Enea Zaffanella + + * src/Octagonal_Shape.templates.hh: Corrected bug affecting method + Octagonal_Shape::affine_image(). + +2009-03-24 Abramo Bagnara + + * 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/tests/formatted_output.c, + interfaces/C/tests/print_to_buffer.c, + interfaces/C/tests/print_to_buffer.h, src/Makefile.am, + src/c_stream.cc, 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 + + * 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 + + * README.configure, TODO: Explained the `--disable-ppl_lcdd' and + `--disable-ppl_lcdd' configure options. + +2009-03-24 Roberto Bagnara + + * 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 + + * fedora/ppl.spec: Synchronized with the Fedora repository. + +2009-03-24 Roberto Bagnara + + * 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 + + * interfaces/C/tests/formatted_output.c, + interfaces/C/tests/print_to_buffer.c: Build restored. + +2009-03-23 Abramo Bagnara + + * 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 + + * 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 + + * interfaces/C/tests/Makefile.am, interfaces/C/tests/cxxoutput.c, + interfaces/C/tests/formatted_output.c, + interfaces/C/tests/print_to_buffer.cc: Done some cleaning. + +2009-03-23 Roberto Bagnara + + * 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 + + * src/c_stream.cc, src/c_stream.h, src/c_streambuf_format.cc: Better + name. + +2009-03-23 Abramo Bagnara + + * 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 + + * tests/Octagonal_Shape/affineimage1.cc: Added a test. + +2009-03-23 Abramo Bagnara + + * 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 + + * src/OR_Matrix.inlines.hh, src/Octagonal_Shape.inlines.hh, + src/Octagonal_Shape.templates.hh: Readability improvements. + +2009-03-23 Roberto Bagnara + + * 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 + + * src/c_stream.cc, src/c_stream.h: Added ppl_io_ostream_buffer_clear + function. + +2009-03-23 Abramo Bagnara + + * src/c_stream.cc, src/c_stream.h: Added write functions for native + types. + +2009-03-23 Abramo Bagnara + + * 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 + + * 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 + + * src/OR_Matrix.inlines.hh: Obsolete FIXME removed. + +2009-03-23 Roberto Bagnara + + * src/Octagonal_Shape.templates.hh: Little formatting improvement. + +2009-03-23 Enea Zaffanella + + * src/pretty_print.cc, src/pretty_print.hh: Use consistent parameter + names in helper function wrap. + +2009-03-22 Roberto Bagnara + + * demos/ppl_lpsol/expected_mpz_a: Updated to reflect the new way + `ppl_lpsol' is invoked. + +2009-03-22 Roberto Bagnara + + * 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 + + * tests/Polyhedron/linearexpression1.cc: Added a test for + operator-(var, expr) and operator-(expr, var). + +2009-03-22 Roberto Bagnara + + * 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 + + * 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 + + * src/Octagonal_Shape.templates.hh: Dealt with a FIXME related to + variable names. + +2009-03-22 Roberto Bagnara + + * 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 + + * NEWS: Mention the bug fixed with Commit: + 6a6734db48e2ca605dfc27ce5f1a923eb867ed25 + +2009-03-22 Enea Zaffanella + + * + 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 + + * src/Pointset_Ask_Tell.templates.hh: Reworded misleading comment. + +2009-03-22 Roberto Bagnara + + * tests/Polyhedron/linearexpression1.cc, + tests/Polyhedron/linexpression1.cc: Test program renamed. + +2009-03-22 Roberto Bagnara + + * tests/Polyhedron/linexpression1.cc: Rewritted test01(). Added + test02(). + +2009-03-22 Roberto Bagnara + + * .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 + + * src/pretty_print.hh, src/pretty_print.inlines.hh: Destructor of + abstract class Write_Function has to be virtual. + +2009-03-21 Enea Zaffanella + + * 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 + + * src/pretty_print.cc, src/pretty_print.hh: Added a new helper + function for the wrapping of lines. + +2009-03-21 Roberto Bagnara + + * NEWS: Typo fixed. + +2009-03-21 Roberto Bagnara + + * 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 + + * TODO: Selected the items that should be done for 0.10.1: postponed + the others. + +2009-03-21 Roberto Bagnara + + * src/Determinate.inlines.hh: Two non-urgent FIXMEs better + documented. + +2009-03-21 Abramo Bagnara + + * 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 + + * src/stdiobuf.cc: Fixed typo. + +2009-03-21 Roberto Bagnara + + * Watchdog/configure.ac, configure.ac: Minimum Autoconf version + brought back to 2.61. + +2009-03-21 Enea Zaffanella + + * src/Makefile.am: Added files pretty_print.*. + +2009-03-21 Enea Zaffanella + + * 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 + + * configure.ac: Version number bumped. + +2009-03-21 Roberto Bagnara + + * .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 + + * .gitignore: Pattern `*~' added. Patterns sorted. + +2009-03-20 Roberto Bagnara + + * 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 + + * 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 + + * .cvsignore, .gitignore, Watchdog/.cvsignore, Watchdog/.gitignore, + Watchdog/doc/.cvsignore, Watchdog/doc/.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, + demos/ppl_lpsol/.gitignore, demos/ppl_lpsol/examples/.cvsignore, + demos/ppl_lpsol/examples/.gitignore, devtools/.cvsignore, + devtools/.gitignore, doc/.cvsignore, doc/.gitignore, + fedora/.cvsignore, fedora/.gitignore, interfaces/.cvsignore, + interfaces/.gitignore, interfaces/C/.cvsignore, + interfaces/C/.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, + interfaces/Java/parma_polyhedra_library/.gitignore, + interfaces/Java/tests/.cvsignore, interfaces/Java/tests/.gitignore, + interfaces/OCaml/.cvsignore, interfaces/OCaml/.gitignore, + interfaces/OCaml/tests/.cvsignore, + interfaces/OCaml/tests/.gitignore, interfaces/Prolog/.cvsignore, + interfaces/Prolog/.gitignore, interfaces/Prolog/Ciao/.cvsignore, + interfaces/Prolog/Ciao/.gitignore, + interfaces/Prolog/GNU/.cvsignore, interfaces/Prolog/GNU/.gitignore, + interfaces/Prolog/SICStus/.cvsignore, + interfaces/Prolog/SICStus/.gitignore, + interfaces/Prolog/SWI/.cvsignore, interfaces/Prolog/SWI/.gitignore, + interfaces/Prolog/XSB/.cvsignore, interfaces/Prolog/XSB/.gitignore, + interfaces/Prolog/YAP/.cvsignore, interfaces/Prolog/YAP/.gitignore, + interfaces/Prolog/tests/.cvsignore, + interfaces/Prolog/tests/.gitignore, m4/.cvsignore, m4/.gitignore, + src/.cvsignore, src/.gitignore, tests/.cvsignore, tests/.gitignore, + tests/Ask_Tell/.cvsignore, tests/Ask_Tell/.gitignore, + tests/BD_Shape/.cvsignore, tests/BD_Shape/.gitignore, + tests/Box/.cvsignore, tests/Box/.gitignore, tests/Grid/.cvsignore, + tests/Grid/.gitignore, tests/MIP_Problem/.cvsignore, + tests/MIP_Problem/.gitignore, tests/Octagonal_Shape/.cvsignore, + tests/Octagonal_Shape/.gitignore, + tests/Partially_Reduced_Product/.cvsignore, + tests/Partially_Reduced_Product/.gitignore, + tests/Polyhedron/.cvsignore, tests/Polyhedron/.gitignore, + tests/Powerset/.cvsignore, tests/Powerset/.gitignore, + utils/.cvsignore, utils/.gitignore: Replaced .cvsignore with + .gitignore. + +2009-02-21 Abramo Bagnara + + * 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 + + * .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 + + * .cvsignore: Added common ignored patterns. + +2009-02-21 Abramo Bagnara + + * .cvsignore, interfaces/Prolog/.cvsignore: Commented out dangerous + entries. + +2009-02-18 Roberto Bagnara + + * fedora/ppl-0.10-configure.patch, fedora/ppl.spec: Install the + documentation according to the Fedora packaging conventions. + +2009-02-18 Roberto Bagnara + + * fedora/ppl-0.10-bigendian.patch: Put under CVS control. + +2009-02-18 Roberto Bagnara + + * 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 + + * src/Makefile.am: Avoid using GNU Make extensions. + +2009-02-17 Roberto Bagnara + + * src/MIP_Problem.cc: Two FIXMEs resolved. + +2009-02-16 Roberto Bagnara + + * 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 + + * 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 + + * 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 + + * 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 + + * configure.ac: Added missing control operator. + +2009-02-15 Roberto Bagnara + + * src/compiler.hh: Indentation fixed. + +2009-02-15 Roberto Bagnara + + * src/Partially_Reduced_Product.defs.hh: Include + "Partially_Reduced_Product.templates.hh". + +2009-02-15 Roberto Bagnara + + * 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 + + * 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 + + * src/Float.defs.hh: Work around the bug affecting the library on + big-endian architectures. + +2009-02-03 Roberto Bagnara + + * fedora/ppl.spec: Work around the bug affecting PPL 0.10 on + big-endian architectures. + +2009-02-02 Patricia M. Hill + + * 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 + + * 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 + + * 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 + + * 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 + + * tests/Polyhedron/simplifyusingcontext1.cc: Added test that has an + assertion failure for 0-dim empty polyhedra. + +2009-02-01 Patricia M. Hill + + * tests/Grid/Makefile.am, tests/Grid/simplifyusingcontext1.cc: Tests + for simplify_using_context_assign() for Grids. + +2009-02-01 Patricia M. Hill + + * 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 + + * interfaces/OCaml/Makefile.am: The parallel build problem should + now be solved. + +2009-01-28 Enea Zaffanella + + * 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 + + * src/Box.templates.hh: Drafted an implementation for + Box::simplify_using_context_assign(). + +2009-01-28 Enea Zaffanella + + * 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 + + * src/Interval.defs.hh: Added specification for new Interval method template typename Enable_If::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 + + * 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 + + * 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 + + * TODO: Added one urgent item. + +2009-01-26 Enea Zaffanella + + * tests/Polyhedron/simplifyusingcontext1.cc: Test 01 overflows when + using 8bit coefficients and assertions are turned on. + +2009-01-26 Enea Zaffanella + + * 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 + + * configure.ac: Version number bumped. + +2009-01-26 Roberto Bagnara + + * demos/ppl_lpsol/ppl_lpsol.c: Support more versions of GLPK. + +2009-01-26 Roberto Bagnara + + * configure.ac: Fixed copy-and-paste mistake. + +2009-01-26 Enea Zaffanella + + * tests/Polyhedron/polyhullifexact2.cc: Added tests corresponding to + examples in BHZ09. + +2009-01-26 Enea Zaffanella + + * tests/Polyhedron/polyhullifexact1.cc: Added a new test. + +2009-01-26 Enea Zaffanella + + * 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 + + * 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 + + * NEWS: Wording improved. + +2009-01-24 Roberto Bagnara + + * 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 + + * 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 + + * demos/ppl_lpsol/ppl_lpsol.c: Added missing const qualifier. + +2009-01-21 Enea Zaffanella + + * interfaces/OCaml/Makefile.am: Corrected so as to behave correctly + when using parallel builds: the build of .cmx also generates + .o, which is a dependency for the generation of *.a. + +2009-01-20 Roberto Bagnara + + * demos/ppl_lpsol/ppl_lpsol.c: Fixed glpk_message_interceptor() + (thanks to Kenneth MacKenzie). + +2009-01-20 Enea Zaffanella + + * tests/Octagonal_Shape/upperboundifexact1.cc: Added test on (higher + dimensional) hypercubes. + +2009-01-20 Enea Zaffanella + + * 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 + + * 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 + + * tests/BD_Shape/upperboundifexact1.cc: Added a test on hypercubes. + +2009-01-20 Enea Zaffanella + + * 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 + + * tests/BD_Shape/upperboundifexact1.cc: Added another test. + +2009-01-18 Roberto Bagnara + + * TODO: Added one important item for next release. + +2009-01-18 Enea Zaffanella + + * tests/Octagonal_Shape/upperboundifexact1.cc: Tests 1, 3, 4, 9 and + 10 now succeeds. + +2009-01-18 Enea Zaffanella + + * 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 + + * tests/Octagonal_Shape/upperboundifexact1.cc: test10() revised. + +2009-01-16 Patricia M. Hill + + * 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 + + * tests/BD_Shape/upperboundifexact1.cc: Test test09 no longer fails. + +2009-01-13 Enea Zaffanella + + * src/BD_Shape.templates.hh: Corrected implementation of + BHZ09_upper_bound_assign_if_exact(). + +2009-01-12 Patricia M. Hill + + * tests/BD_Shape/upperboundifexact1.cc: Added a test showing a bug + in the new algorithm. + +2009-01-08 Enea Zaffanella + + * 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. diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..8b82ade --- /dev/null +++ b/INSTALL @@ -0,0 +1,291 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, +2006, 2007, 2008 Free Software Foundation, Inc. + + This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +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. + + 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. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + 6. Often, you can also type `make uninstall' to remove the installed + files again. + +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 `..'. + + 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'. + + 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. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +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" + +and if that doesn't work, install pre-built binaries of GCC for HP-UX. + + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot +parse its `' 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" + +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 bug. Until the bug is fixed you can use this workaround: + + CONFIG_SHELL=/bin/bash /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..d2f40fc --- /dev/null +++ b/Makefile.am @@ -0,0 +1,80 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +# Tell aclocal where to find `.m4' files. +ACLOCAL_AMFLAGS = -I m4 + +SUBDIRS = . utils src Watchdog 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 $< >$@ + +ppl-config.h.in: config.h.in $(srcdir)/ppl-config.sed + $(SED) -f $(srcdir)/ppl-config.sed $< >$@ + +DISTCHECK_CONFIGURE_FLAGS = \ +--enable-shared --enable-watchdog + +# 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 \ +README.configure \ +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..316efa6 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,822 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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 = README $(am__configure_deps) $(dist_noinst_HEADERS) \ + $(dist_noinst_SCRIPTS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/config.h.in \ + $(srcdir)/ppl.lsm.in $(top_srcdir)/configure COPYING ChangeLog \ + INSTALL NEWS TODO compile config.guess config.rpath config.sub \ + depcomp install-sh ltmain.sh missing 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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/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 +SCRIPTS = $(dist_noinst_SCRIPTS) +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-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 uninstall-recursive +HEADERS = $(dist_noinst_HEADERS) $(nodist_noinst_HEADERS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + { test ! -d $(distdir) \ + || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr $(distdir); }; } +DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 $(distdir).zip +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ + +# Tell aclocal where to find `.m4' files. +ACLOCAL_AMFLAGS = -I m4 +SUBDIRS = . utils src Watchdog 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 --enable-watchdog + + +# 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 \ +README.configure \ +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: + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \ + cd $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) + +config.h: stamp-h1 + @if test ! -f $@; then \ + rm -f stamp-h1; \ + $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ + else :; fi + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: $(am__configure_deps) + cd $(top_srcdir) && $(AUTOHEADER) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 +ppl.lsm: $(top_builddir)/config.status $(srcdir)/ppl.lsm.in + cd $(top_builddir) && $(SHELL) ./config.status $@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + $(am__remove_distdir) + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + distdir) \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook + -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r $(distdir) +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-lzma: distdir + tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma + $(am__remove_distdir) + +dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lzma*) \ + unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir); chmod a+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst + chmod a-w $(distdir) + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && cd $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck + $(am__remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @cd $(distuninstallcheck_dir) \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile $(SCRIPTS) $(HEADERS) config.h +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -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 + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-exec-am: + +install-html: install-html-recursive + +install-info: install-info-recursive + +install-man: + +install-pdf: install-pdf-recursive + +install-ps: install-ps-recursive + +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: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ + install-strip + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am am--refresh check check-am clean clean-generic \ + clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ + dist-gzip dist-hook dist-lzma dist-shar dist-tarZ 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-recursive uninstall uninstall-am + + +ppl-config.h: config.h $(srcdir)/ppl-config.sed + $(SED) -f $(srcdir)/ppl-config.sed $< >$@ + +ppl-config.h.in: config.h.in $(srcdir)/ppl-config.sed + $(SED) -f $(srcdir)/ppl-config.sed $< >$@ + +# 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..1a4e482 --- /dev/null +++ b/NEWS @@ -0,0 +1,1627 @@ + +Parma Polyhedra Library NEWS -- history of user-visible changes +=============================================================== + + +-------------------------------------------------------------------------- +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::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::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 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 object that is a finite linear partition of + the difference of two grids, we have added the method: + std::pair > + 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 C_Polyhedron(const Box&, From_Bounding_Box), + template NNC_Polyhedron(const Box&, From_Bounding_Box), + template Grid(const Box&, From_Bounding_Box) + + have been removed. Similarly, as boxes can be constructed from other + PPL semantic objects, the method + + template + 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 Grid(const Box&, From_Covering_Box) + + and also the method + + template 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 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 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 + 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::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 + bool check_containment(const PH&, const Polyhedra_Powerset&) + + 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::geometrically_covers() + + and + + bool Polyhedra_Powerset::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 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, 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::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:: + Polyhedra_Powerset(const Polyhedra_Powerset& y) + + and + + Polyhedra_Powerset:: + Polyhedra_Powerset(const Polyhedra_Powerset& 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 from a Polyhedra_Powerset + and the other way around. In the latter case, the topological closure + of the element polyhedra is computed. + +o New explicit constructor Powerset::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::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::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__from_ have been + renamed ppl_new__recycle_, where is either "C" or "NNC", + and 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 + 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..daefe30 --- /dev/null +++ b/README @@ -0,0 +1,1589 @@ +Copyright (C) 2001-2009 Roberto Bagnara +See below for the copying conditions. + + +Parma Polyhedra Library (Release 0.10.2) +======================================== + +This is the release 0.10.2 of the Parma Polyhedra Library: +a C++ library for (not necessarily closed) convex polyhedra +and other numerical abstractions. + +To be more precise, the Parma Polyhedra Library (PPL) can handle: + + + all the convex polyhedra that can be defined as the intersection + of a finite number of (open or closed) hyperspaces, each described + by an equality or a (strict or non-strict) inequality with rational + coefficients; + + + convex polyhedra defined by systems of bounded differences with + a wide choice of integer, rational or floating point coefficients; + + + all grids (or, equivalently, lattices); a grid is defined by a set + of congruence relations with rational coefficients and consists of + the set of all points that satisfy these relations; + + + finite powersets of the above; + + + linear programming problems, solved with an implementation of the + primal simplex algorithm using exact arithmetic. + +The Parma Polyhedra Library is: + + + user friendly: + you write `x + 2*y + 5*z <= 7' when you mean it; + + + fully dynamic: + available virtual memory is the only limitation to the dimension + of anything; + + + written in standard C++: + meant to be portable; + + + exception-safe: + never leaks resources or leaves invalid object fragments around; + + + rather efficient: + and we hope to make it even more so; + + + thoroughly documented: + perhaps not ``literate programming'' but close enough; + + + free software: + distributed under the terms of the GNU General Public License. + +See the file COPYING for licensing information. +See the file INSTALL for generic build and installation instructions. +See the file README.configure for more specific configuration instructions. +See the file NEWS for recent project news. +See the file BUGS for known bugs and how to report new ones. +See the file CREDITS for a list of people, projects and organizations +that made the PPL a reality. +See http://www.cs.unipr.it/ppl/ for more information on the PPL. +For any additional questions you might have, please do not hesitate to +write to ppl-devel@cs.unipr.it. + +Here is the contents of the PPL 0.10 source distribution +(41 directories, 1446 files): + +ppl-0.10.2 +|-- BUGS +|-- COPYING +|-- CREDITS +|-- ChangeLog +|-- INSTALL +|-- Makefile.am +|-- Makefile.in +|-- NEWS +|-- README +|-- README.configure +|-- STANDARDS +|-- TODO +|-- Watchdog +| |-- BUGS +| |-- COPYING +| |-- CREDITS +| |-- ChangeLog +| |-- INSTALL +| |-- Makefile.am +| |-- Makefile.in +| |-- NEWS +| |-- README +| |-- aclocal.m4 +| |-- compile +| |-- config.guess +| |-- config.h.in +| |-- config.rpath +| |-- config.sub +| |-- configure +| |-- configure.ac +| |-- depcomp +| |-- doc +| | |-- Makefile.am +| | |-- Makefile.in +| | |-- README.doc +| | |-- 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 +| | |-- pwl-user-0.5-html.tar.gz +| | |-- pwl-user-0.5.pdf +| | |-- pwl-user-0.5.ps.gz +| | |-- pwl.sty +| | |-- user.doxyconf-html.in +| | |-- user.doxyconf-latex.in +| | `-- user.tex +| |-- install-sh +| |-- ltmain.sh +| |-- m4 +| | |-- Makefile.am +| | |-- Makefile.in +| | |-- lib-ld.m4 +| | |-- lib-link.m4 +| | |-- libtool.m4 +| | |-- ltoptions.m4 +| | |-- ltsugar.m4 +| | |-- ltversion.m4 +| | `-- lt~obsolete.m4 +| |-- missing +| |-- mkinstalldirs +| |-- pwl-config.h.in +| |-- pwl-config.sed +| |-- src +| | |-- Doubly_Linked_Object.defs.hh +| | |-- Doubly_Linked_Object.inlines.hh +| | |-- Doubly_Linked_Object.types.hh +| | |-- EList.defs.hh +| | |-- EList.inlines.hh +| | |-- EList.types.hh +| | |-- EList_Iterator.defs.hh +| | |-- EList_Iterator.inlines.hh +| | |-- EList_Iterator.types.hh +| | |-- Handler.defs.hh +| | |-- Handler.inlines.hh +| | |-- Handler.types.hh +| | |-- Makefile.am +| | |-- Makefile.in +| | |-- Pending_Element.cc +| | |-- Pending_Element.defs.hh +| | |-- Pending_Element.inlines.hh +| | |-- Pending_Element.types.hh +| | |-- Pending_List.cc +| | |-- Pending_List.defs.hh +| | |-- Pending_List.inlines.hh +| | |-- Pending_List.types.hh +| | |-- Time.cc +| | |-- Time.defs.hh +| | |-- Time.inlines.hh +| | |-- Time.types.hh +| | |-- Watchdog.cc +| | |-- Watchdog.defs.hh +| | |-- Watchdog.inlines.hh +| | |-- Watchdog.types.hh +| | |-- pwl.hh.dist +| | `-- pwl_header.hh +| |-- tests +| | |-- Makefile.am +| | |-- Makefile.in +| | |-- pwl_test.cc +| | |-- pwl_test.hh +| | |-- simple1.cc +| | `-- valgrind_suppressions +| `-- utils +| |-- Makefile.am +| |-- Makefile.in +| `-- build_header.in +|-- 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 +| |-- ppl_lpsol.1 +| `-- ppl_lpsol.c +|-- depcomp +|-- doc +| |-- Makefile.am +| |-- Makefile.in +| |-- README.doc +| |-- 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-0.10.2-html.tar.gz +| |-- ppl-user-0.10.2.pdf +| |-- ppl-user-0.10.2.ps.gz +| |-- ppl-user-c-interface-0.10.2-html.tar.gz +| |-- ppl-user-c-interface-0.10.2.pdf +| |-- ppl-user-c-interface-0.10.2.ps.gz +| |-- ppl-user-java-interface-0.10.2-html.tar.gz +| |-- ppl-user-java-interface-0.10.2.pdf +| |-- ppl-user-java-interface-0.10.2.ps.gz +| |-- ppl-user-ocaml-interface-0.10.2-html.tar.gz +| |-- ppl-user-ocaml-interface-0.10.2.pdf +| |-- ppl-user-ocaml-interface-0.10.2.ps.gz +| |-- ppl-user-prolog-interface-0.10.2-html.tar.gz +| |-- ppl-user-prolog-interface-0.10.2.pdf +| |-- ppl-user-prolog-interface-0.10.2.ps.gz +| |-- ppl.sty +| |-- 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_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 +| | |-- ppl_c_test.cc +| | |-- ppl_c_test.h +| | |-- print_to_buffer.c +| | `-- print_to_buffer.h +| |-- 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 +| | | |-- 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 +| | | |-- PPL_Object.java +| | | |-- Pair.java +| | | |-- Parma_Polyhedra_Library.java +| | | |-- Partial_Function.java +| | | |-- Poly_Con_Relation.java +| | | |-- Poly_Gen_Relation.java +| | | |-- Relation_Symbol.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 +| | |-- PPL_Test.java +| | |-- Parma_Polyhedra_Library_test1.java +| | |-- Test_Executor.java +| | |-- Test_Partial_Function.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_interface.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 +| | |-- ppl_prolog_sysdep_dox +| | |-- ppl_prolog_sysindep_dox +| | `-- 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_cxx_attribute_weak.m4 +| |-- ac_cxx_double_binary_format.m4 +| |-- ac_cxx_double_exact_output.m4 +| |-- ac_cxx_flexible_arrays.m4 +| |-- ac_cxx_float_binary_format.m4 +| |-- ac_cxx_float_exact_output.m4 +| |-- ac_cxx_ieee_inexact_flag.m4 +| |-- ac_cxx_limit_memory.m4 +| |-- ac_cxx_long_double_binary_format.m4 +| |-- ac_cxx_long_double_exact_output.m4 +| |-- ac_cxx_proper_long_double.m4 +| |-- ac_cxx_remainder_bug.m4 +| |-- ac_prog_jar.m4 +| |-- ac_prog_java.m4 +| |-- ac_prog_javac.m4 +| |-- ac_prog_javah.m4 +| |-- ac_text_md5sum.m4 +| |-- lib-ld.m4 +| |-- lib-link.m4 +| |-- lib-prefix.m4 +| |-- libtool.m4 +| |-- ltoptions.m4 +| |-- ltsugar.m4 +| |-- ltversion.m4 +| |-- lt~obsolete.m4 +| |-- m4.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 +| |-- 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 +| |-- CREDITS.cc.dist +| |-- C_Integer.hh +| |-- C_Polyhedron.cc +| |-- C_Polyhedron.defs.hh +| |-- C_Polyhedron.inlines.hh +| |-- C_Polyhedron.types.hh +| |-- Checked_Number.cc +| |-- Checked_Number.defs.hh +| |-- Checked_Number.inlines.hh +| |-- Checked_Number.templates.hh +| |-- Checked_Number.types.hh +| |-- Coefficient.cc +| |-- Coefficient.defs.hh +| |-- Coefficient.inlines.hh +| |-- Coefficient.types.hh +| |-- Coefficient_traits_template.hh +| |-- Congruence.cc +| |-- Congruence.defs.hh +| |-- Congruence.inlines.hh +| |-- Congruence.types.hh +| |-- Congruence_System.cc +| |-- Congruence_System.defs.hh +| |-- Congruence_System.inlines.hh +| |-- Congruence_System.types.hh +| |-- Constraint.cc +| |-- Constraint.defs.hh +| |-- Constraint.inlines.hh +| |-- Constraint.types.hh +| |-- Constraint_System.cc +| |-- Constraint_System.defs.hh +| |-- Constraint_System.inlines.hh +| |-- Constraint_System.types.hh +| |-- DB_Matrix.defs.hh +| |-- DB_Matrix.inlines.hh +| |-- DB_Matrix.templates.hh +| |-- DB_Matrix.types.hh +| |-- DB_Row.defs.hh +| |-- DB_Row.inlines.hh +| |-- DB_Row.templates.hh +| |-- DB_Row.types.hh +| |-- Determinate.defs.hh +| |-- Determinate.inlines.hh +| |-- Determinate.types.hh +| |-- Float.cc +| |-- Float.defs.hh +| |-- Float.inlines.hh +| |-- GMP_Integer.defs.hh +| |-- GMP_Integer.inlines.hh +| |-- GMP_Integer.types.hh +| |-- Generator.cc +| |-- Generator.defs.hh +| |-- Generator.inlines.hh +| |-- Generator.types.hh +| |-- Generator_System.cc +| |-- Generator_System.defs.hh +| |-- Generator_System.inlines.hh +| |-- Generator_System.types.hh +| |-- Grid.defs.hh +| |-- Grid.inlines.hh +| |-- Grid.templates.hh +| |-- Grid.types.hh +| |-- Grid_Certificate.cc +| |-- Grid_Certificate.defs.hh +| |-- Grid_Certificate.inlines.hh +| |-- Grid_Certificate.types.hh +| |-- Grid_Generator.cc +| |-- Grid_Generator.defs.hh +| |-- Grid_Generator.inlines.hh +| |-- Grid_Generator.types.hh +| |-- Grid_Generator_System.cc +| |-- Grid_Generator_System.defs.hh +| |-- Grid_Generator_System.inlines.hh +| |-- Grid_Generator_System.types.hh +| |-- Grid_Status.cc +| |-- Grid_Status.idefs.hh +| |-- Grid_Status.inlines.hh +| |-- Grid_chdims.cc +| |-- Grid_conversion.cc +| |-- Grid_nonpublic.cc +| |-- Grid_public.cc +| |-- Grid_simplify.cc +| |-- Grid_widenings.cc +| |-- H79_Certificate.cc +| |-- H79_Certificate.defs.hh +| |-- H79_Certificate.inlines.hh +| |-- H79_Certificate.types.hh +| |-- Has_Assign_Or_Swap.hh +| |-- Init.cc +| |-- Init.defs.hh +| |-- Init.inlines.hh +| |-- Init.types.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 +| |-- Interval_Restriction.defs.hh +| |-- Linear_Expression.cc +| |-- Linear_Expression.defs.hh +| |-- Linear_Expression.inlines.hh +| |-- Linear_Expression.types.hh +| |-- Linear_Row.cc +| |-- Linear_Row.defs.hh +| |-- Linear_Row.inlines.hh +| |-- Linear_Row.types.hh +| |-- Linear_System.cc +| |-- Linear_System.defs.hh +| |-- Linear_System.inlines.hh +| |-- Linear_System.types.hh +| |-- MIP_Problem.cc +| |-- MIP_Problem.defs.hh +| |-- MIP_Problem.inlines.hh +| |-- MIP_Problem.templates.hh +| |-- MIP_Problem.types.hh +| |-- Makefile.am +| |-- Makefile.in +| |-- Matrix.cc +| |-- Matrix.defs.hh +| |-- Matrix.inlines.hh +| |-- Matrix.types.hh +| |-- NNC_Polyhedron.cc +| |-- NNC_Polyhedron.defs.hh +| |-- NNC_Polyhedron.inlines.hh +| |-- NNC_Polyhedron.types.hh +| |-- Numeric_Format.defs.hh +| |-- 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 +| |-- Partially_Reduced_Product.defs.hh +| |-- Partially_Reduced_Product.inlines.hh +| |-- Partially_Reduced_Product.templates.hh +| |-- Partially_Reduced_Product.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_nonpublic.cc +| |-- Polyhedron_public.cc +| |-- Polyhedron_widenings.cc +| |-- Powerset.defs.hh +| |-- Powerset.inlines.hh +| |-- Powerset.templates.hh +| |-- Powerset.types.hh +| |-- Ptr_Iterator.defs.hh +| |-- Ptr_Iterator.inlines.hh +| |-- Ptr_Iterator.types.hh +| |-- Rational_Box.hh +| |-- Rational_Interval.hh +| |-- Result.defs.hh +| |-- Result.inlines.hh +| |-- Rounding_Dir.defs.hh +| |-- Rounding_Dir.inlines.hh +| |-- Row.cc +| |-- Row.defs.hh +| |-- Row.inlines.hh +| |-- Row.types.hh +| |-- Scalar_Products.cc +| |-- Scalar_Products.defs.hh +| |-- Scalar_Products.inlines.hh +| |-- Scalar_Products.types.hh +| |-- Slow_Copy.hh +| |-- Temp.defs.hh +| |-- Temp.inlines.hh +| |-- Temp.templates.hh +| |-- Topology.hh +| |-- Variable.cc +| |-- Variable.defs.hh +| |-- Variable.inlines.hh +| |-- Variable.types.hh +| |-- Variables_Set.cc +| |-- Variables_Set.defs.hh +| |-- Variables_Set.inlines.hh +| |-- Variables_Set.types.hh +| |-- Widening_Function.defs.hh +| |-- Widening_Function.inlines.hh +| |-- Widening_Function.types.hh +| |-- algorithms.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 +| |-- conversion.cc +| |-- 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 +| |-- iterator_to_const.defs.hh +| |-- iterator_to_const.inlines.hh +| |-- iterator_to_const.types.hh +| |-- math_utilities.defs.hh +| |-- math_utilities.inlines.hh +| |-- max_space_dimension.hh +| |-- meta_programming.hh +| |-- minimize.cc +| |-- 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 +| |-- simplify.cc +| |-- stdiobuf.cc +| |-- stdiobuf.defs.hh +| |-- stdiobuf.inlines.hh +| |-- stdiobuf.types.hh +| |-- swapping_sort.icc +| |-- version.cc +| |-- version.hh.in +| |-- wrap.cc +| `-- wrap.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 +| | |-- empty1.cc +| | |-- equality1.cc +| | |-- expandspacedim1.cc +| | |-- foldspacedims1.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 +| | |-- 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 +| | `-- 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 +| | |-- 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 +| | |-- 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 +| | `-- writebox1.cc +| |-- Grid +| | |-- Makefile.am +| | |-- Makefile.in +| | |-- addcongruence1.cc +| | |-- addcongruences1.cc +| | |-- addconstraint1.cc +| | |-- addconstraints1.cc +| | |-- addgenerator1.cc +| | |-- addgenerators1.cc +| | |-- addspacedims1.cc +| | |-- affinedim1.cc +| | |-- affineimage1.cc +| | |-- affineimage2.cc +| | |-- affinepreimage1.cc +| | |-- affinepreimage2.cc +| | |-- 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 +| | |-- coveringbox1.cc +| | |-- coveringbox2.cc +| | |-- discrete1.cc +| | |-- disjoint1.cc +| | |-- equals1.cc +| | |-- expandspacedim1.cc +| | |-- foldspacedims1.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 +| | `-- writecongruencesystem.cc +| |-- MIP_Problem +| | |-- Makefile.am +| | |-- Makefile.in +| | |-- ascii_dump_load1.cc +| | |-- exceptions1.cc +| | |-- mipproblem1.cc +| | |-- mipproblem2.cc +| | `-- mipproblem3.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 +| | |-- empty1.cc +| | |-- expandspacedim1.cc +| | |-- foldspacedims1.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 +| | |-- 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 +| | `-- writeoctagon1.cc +| |-- Partial_Function.cc +| |-- Partial_Function.defs.hh +| |-- Partial_Function.inlines.hh +| |-- Partial_Function.types.hh +| |-- Partially_Reduced_Product +| | |-- Makefile.am +| | |-- Makefile.in +| | |-- asciidumpload1.cc +| | |-- directproduct1.cc +| | |-- directproduct2.cc +| | |-- directproduct3.cc +| | |-- directproduct4.cc +| | |-- directproduct5.cc +| | |-- directproduct6.cc +| | |-- partiallyreducedproduct1.cc +| | |-- partiallyreducedproduct2.cc +| | |-- partiallyreducedproduct3.cc +| | `-- partiallyreducedproduct4.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 +| | |-- dualhypercubes.cc +| | |-- empty1.cc +| | |-- equals1.cc +| | |-- exceptions1.cc +| | |-- exceptions2.cc +| | |-- exceptions3.cc +| | |-- expandspacedim1.cc +| | |-- expandspacedim2.cc +| | |-- foldspacedims1.cc +| | |-- foldspacedims2.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 +| | |-- timeelapse1.cc +| | |-- timeelapse2.cc +| | |-- topclosed1.cc +| | |-- topclosure1.cc +| | |-- unconstrain1.cc +| | |-- universe1.cc +| | |-- universe2.cc +| | |-- variablesset1.cc +| | |-- watchdog1.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 +| |-- 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-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.2 or +any later version published by the Free Software Foundation; with no +Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. +The license is included, in various formats, in the `doc' subdirectory +of each distribution of the PPL in files called `fdl.*'. + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 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 called `gpl.*'. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +If you have not received a copy of one or both the above mentioned +licenses along with the PPL, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . diff --git a/README.configure b/README.configure new file mode 100644 index 0000000..9b97730 --- /dev/null +++ b/README.configure @@ -0,0 +1,473 @@ +Copyright (C) 2001-2009 Roberto Bagnara +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. Configuring for Debugging +8. Programs that Come with the Library +9. Using the CVS 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 compilers, the GMP library installed in a +standard place and provided the user is satisfied with all the options +we chose as defaults), a source distribution of the Parma Polyhedra +Library (PPL) can be unpacked, configured, built and installed with +the following, well-known procedure: + + $ tar jxf ppl-x.y.tar.bz2 + $ ./configure + $ make + $ su + Password: + $ 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 . Then, unless +you have special needs, you can invoke the GMP's configure script with +the options + + --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 +is not standard for your compiler and/or for your linker, you will +have to make sure the configure script of the PPL is invoked with, +among others, the option + + --with-libgmpxx-prefix= + +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 +"/lib:$LD_LIBRARY_PATH" or +"/lib64:$LD_LIBRARY_PATH" is the most commonly used +solution). + + +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 10.1.x. Assuming you have configured GMP with a command like + + CC=icc CXX=icpc /path/to/gmp-4.2.4/configure --enable-cxx \ + --prefix=/opt/intel/cce/10.1.018 + +you can configure the PPL with a command like + + CPPFLAGS=-D_GCC_LIMITS_H_ /path/to/ppl-x.y/configure \ + --with-cxx=icpc --with-cc=icc \ + --with-cxxflags=-pch \ + --with-libgmpxx-prefix=/opt/intel/cce/10.1.018 + +Notice that the `CPPFLAGS=-D_GCC_LIMITS_H_' environment variable +assignment is required in order to overcome a bug in the Intel C/C++ +compiler version 10.1.x. Notice also 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-4.2.4/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-libgmpxx-prefix=/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, + BD_Shape, + Octagonal_Shape, + Octagonal_Shape, + Constraints_Product, + Pointset_Powerset, + Pointset_Powerset, + +plus, if the host architecture supports double precision floating point +numbers conforming to the IEEE 754 standard, + + Double_Box, + BD_Shape, + Octagonal_Shape. + +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'. + +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. 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. + + +8. 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. + + +9. Using the CVS Sources +------------------------ + +If you use the CVS sources, then you need recent versions of Autoconf +Automake and Libtool installed. After a `cvs checkout' or `cvs update' +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-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.2 or +any later version published by the Free Software Foundation; with no +Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. +The license is included, in various formats, in the `doc' subdirectory +of each distribution of the PPL in files called `fdl.*'. + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 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 are called `gpl.*'. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +If you have not received a copy of one or both the above mentioned +licenses along with the PPL, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . diff --git a/STANDARDS b/STANDARDS new file mode 100644 index 0000000..cebaa8a --- /dev/null +++ b/STANDARDS @@ -0,0 +1,615 @@ + +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). + + +Length of source lines +---------------------- + +Avoid, when possible, source lines longer than 78 characters. + + +Trailing whitespace +------------------- + +Always avoid trailing whitespace. +If you use Emacs, then all the trailing whitespace in the current +buffer can be removed by using the command + + M-x delete-trailing-whitespace + +If you keep inserting trailing whitespace when coding, then you may +want to put the following two lines in your .emacs: + +;; Show trailing whitespace. +(setq-default show-trailing-whitespace t) + + +Block closures +-------------- + +Try to make clear what is being closed. For example: + +1) + +namespace Parma_Polyhedra_Library { + +... + +} // namespace Parma_Polyhedra_Library + +2) + +extern "C" { + +... + +} // extern "C" + +3) + +#ifndef PPL_Class_defs_hh + +... + +#endif // !defined(PPL_Class_defs_hh) + + +Namespace indentation +--------------------- + +The entire library is in its own namespace. We sometimes specialize +std::swap() and std::iter_swap(). Other namespaces may be involved +but only in restricted contexts. Therefore, we have unindented +namespace-level declarations, thus saving some precious horizontal +space. For example: + +namespace Parma_Polyhedra_Library { + +non-empty lines here start at column 0; + +} // namespace Parma_Polyhedra_Library + +If you use Emacs, you may want to put the following two lines in your +.emacs: + +;; Disable indentation when in namespace blocks. +(c-set-offset 'innamespace 0) + + +Negation +-------- + +Use `!' to negate a value. + +For example, use + + if (!ph.is_empty()) + std::cout << "ph contains at least one point" << endl; + +instead of + + if (ph.is_empty() == false) + std::cout << "ph contains at least one point" << endl; + + +Comparison with zero +-------------------- + +Be explicit when comparing a value with zero in a conditional context. + +For example, use + + assert(sys.num_rows() != 0); + +instead of + + assert(sys.num_rows()); + + +Standards for Structuring the Source Code in Files +================================================== + +Source code should be organized so as to ensure that: + - the contents of a file are strongly related; + - each file is of manageable size. + +As a rule of thumb, each type (class, struct, class template, etc.) +named `Xtype' that is relevant on its own for the user or the +developer of the library should be provided with a set of source files +whose filenames start with `Xtype'. The source files for such a type +should be named and populated as follows: + +a) Xtype.types.hh +Contains the forward declarations of type names (in particular, the +one for `Xtype') and other useful typedef's. + +b) Xtype.defs.hh +Contains the definition of the type, together with the declaration of +any function that, even though not being formally part of the type, is +nonetheless related to it and should therefore be considered part of +its interface. + +c) Xtype.inlines.hh +Contains the definitions of inline functions. + +d) Xtype.templates.hh +Contains the non-inline definitions of all class template members and +all (member or non-member) function templates that are not fully +specialized. + +e) Xtype.cc +Contains the definitions of non-inline functions, including non-inline +full specializations of templates. + +f) When appropriate, further *.cc files can be used to split huge +source files into more manageable components (e.g., see the files +Polyhedron_public.cc, Polyhedron_nonpublic.cc, Polyhedron_chdims.cc +and Polyhedron_widenings.cc, or even conversion.cc, minimize.cc, etc.). + +Note that: + - all interface functions should be declared in Xtype.defs.hh; + - no function definition should be placed in Xtype.defs.hh; + - bare declarations should not be declared inline (i.e., inline directives + should be placed only in front of the definition of the functions); + - inner classes are usually kept in the same files as the outer class; + - functions having the anonymous namespace scope can be (and usually are) + only declared and defined in file Xtype.cc, regardless of whether or not + the inline directive is specified. + + +Standards for 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), + 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 shorter introduction, + the build tree under test must be configured with the + `--enable-coverage' and `--disable-optimization options' (and possibly + also with --enable-profiling). For example: + + $ configure --enable-coverage --disable-optimization \ + --enable-profiling \ + --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. The `gcov' program produces 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:} diff --git a/TODO b/TODO new file mode 100644 index 0000000..cfbd3be --- /dev/null +++ b/TODO @@ -0,0 +1,160 @@ + +Enhancements for PPL 0.11 +========================= + +- Add the domain of circular linear progressions. +- Finish the domain of intervals. +- Supplement the "preemption" methods of the library allowing for + deterministic mechanisms (e.g., decrementing a counter and throwing + when it reaches zero). This will probably require changing the + current interface based on `abandon_expensive_computations'. +- Get rid of ugly assign functions defined in anonymous namespace of + MIP_Problem.cc replacing it with a more general-purpose approach. +- When the PPL has been configured with + CPPFLAGS="-DPPL_ARM_CAN_CONTROL_FPU=1" make sure the library initialization + procedure checks that the FPU can indeed be controlled, failing if + that is not the case. +- Reconsider the datatype for the units parameter in the Watchdog + constructors: should we prefer an unsigned? +- Rename set_rational_sqrt_precision_parameter to + set_irrational_precision and make it available on all interfaces. +- Intervals are best instantiated with checked numbers with + particular policies: review all the interfaced boxes, + augment the testsuite, and update the documentation. +- DO_TEST_F should not cause the output "failed tests" to appear, + but "tests unexpectedly succeeded". +- Reduce the number of FIXMEs to no more than 20. +- Switch to the latest versions of Autoconf and Automake (in beta test + at the time of writing): they provide features we have been looking + for for years. +- Use the OCaml-Autoconf macros: https://forge.ocamlcore.org/frs/?group_id=69 + (see also + http://rwmj.wordpress.com/2009/03/31/using-autoconf-for-ocaml-projects/). +- Fix the methods Box::refine_with_constraint/s so that they perform + a safe (i.e., always terminating) propagation instead of ignoring the + non-interval constraints. + + +Enhancements for PPL 0.11 or later versions +=========================================== + +- Consider switching to MLGMPIDL for the OCaml interface + (see https://bugzilla.redhat.com/show_bug.cgi?id=491712). +- 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. +- Make the library thread-safe. +- 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://www.cs.unipr.it/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. +- Ensure the tests in tests/MIP_Problem/* cover every line of + code in MIP_Problem.*. +- Define functions rem() and remp() to compute the remainder of division + in the general case, for rem(), and in the case where the second + argument is known to be positive, for remp(). In the implementation + of rem(), if CXX_HAS_REMAINDER_BUG is nonzero, a suitable workaround + should be implemented to circumvent the INT_MIN % -1 bug. + rem() and remp() should be used (with a strong preference to the second, + of course) wherever we now use operator%(). +- 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'. +- 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. +- 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. +- See whether, using the techniques described in + ftp://ftp.ifor.math.ethz.ch/pub/fukuda/reports/polyunion001120.ps.gz + we can implement bool poly_hull_assign_if_exact(PH& p, const PH& q), + temporarily in algorithms.hh, more efficiently. +- Provide optimized implementations of Polyhedron::expand_dimension() + Polyhedron::fold_dimensions(). +- 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. + +- 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. + +Efficiency Issues +================= + +- There must be a more efficient way to implement + bool Polyhedron::is_disjoint_from(const Polyhedron&). +- There must be a more efficient way to compute convex differences. +- We are being rather careless about the creation of temporaries + as far as the classes Linear_Expression, Constraint and Generator + are concerned. +- Provide a better implementation of computing squares in MIP_Problem's + steepest-edge to avoid big numbers. + +Debian packaging +================ + +- Add an interface package for each Prolog as a suitable version of + that Prolog appears in Debian. Control entries for these are in + control.prologs. +- Find out if /usr/lib/pkgconfig entries are required in any packages. +- libppl-dev is very large. Consider moving the docs to libppl-doc + and the other files into libppl. +- Verify the Build-Depends and Build-Depends-Indep settings, as per + the Debian Developers Reference section 5.10.1 point 1. +- Consider renaming libppl-pwl to libpwl. diff --git a/Watchdog/BUGS b/Watchdog/BUGS new file mode 100644 index 0000000..4e96fe8 --- /dev/null +++ b/Watchdog/BUGS @@ -0,0 +1,2 @@ + +Please report any bug you find to bagnara@cs.unipr.it. diff --git a/Watchdog/COPYING b/Watchdog/COPYING new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/Watchdog/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + 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. + + + Copyright (C) + + 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 . + +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: + + Copyright (C) + 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 +. + + 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 +. diff --git a/Watchdog/CREDITS b/Watchdog/CREDITS new file mode 100644 index 0000000..be59266 --- /dev/null +++ b/Watchdog/CREDITS @@ -0,0 +1,12 @@ + +Authors +======= + +The Parma Watchdog Library and its (non-existent) documentation have +been designed, written, debugged and improved by Roberto Bagnara [1] +. + + +-------- + + [1] http://www.cs.unipr.it/~bagnara/ diff --git a/Watchdog/ChangeLog b/Watchdog/ChangeLog new file mode 100644 index 0000000..c5a1efe --- /dev/null +++ b/Watchdog/ChangeLog @@ -0,0 +1,463 @@ +2009-04-18 Roberto Bagnara + + * PPL 0.10.2 released. + +2009-04-16 Roberto Bagnara + + * Watchdog/doc/Makefile.am, doc/Makefile.am: Added targets to have + `make -n dist' work as expected. + +2009-04-16 Roberto Bagnara + + * 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-15 Roberto Bagnara + + * Watchdog/src/Makefile.am, interfaces/C/Makefile.am, + src/Makefile.am: Libtool -version-info updated for PPL 0.10.2. + +2009-04-14 Roberto Bagnara + + * PPL 0.10.1 released. + +2009-04-11 Roberto Bagnara + + * .gitignore, Watchdog/doc/.gitignore, doc/.gitignore, + interfaces/Prolog/XSB/.gitignore: Added missing patterns. + +2009-04-11 Roberto Bagnara + + * ChangeLog, Watchdog/ChangeLog: Updated. + +2009-04-06 Roberto Bagnara + + * ChangeLog, Watchdog/ChangeLog: Updated. + +2009-04-04 Roberto Bagnara + + * Watchdog/NEWS, Watchdog/README, Watchdog/configure.ac, + Watchdog/src/Makefile.am: Updated for PWL 0.7. + +2009-03-30 Roberto Bagnara + + * Watchdog/configure.ac, configure.ac: Version number bumped. The + name of the program is Autoconf. + +2009-03-30 Enea Zaffanella + + * TODO, Watchdog/src/Watchdog.defs.hh: Moved TODO items to their + place. + +2009-03-30 Enea Zaffanella + + * 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-28 Roberto Bagnara + + * ChangeLog, ChangeLog-2001-2008, ChangeLog_2001-2008, + Watchdog/ChangeLog, Watchdog/ChangeLog-2001-2008, + Watchdog/ChangeLog_2001-2008: Change logs updated. + +2009-03-28 Roberto Bagnara + + * Watchdog/configure.ac, configure.ac: Improved the semantics of the + --enable-watchdog configure option. + +2009-03-27 Roberto Bagnara + + * 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 + + * ChangeLog, ChangeLog-2001-2008, Watchdog/ChangeLog, + Watchdog/ChangeLog-2001-2008: Renamed and frozen: the + ChangeLog-2001-2008 should never be changed again. + +2009-03-27 Roberto Bagnara + + * ChangeLog, Watchdog/ChangeLog: Updated to 2008-12-31. + +2009-03-26 Roberto Bagnara + + * Watchdog/tests/pwl_test.cc, tests/ppl_test.cc: Support systems + that do not define `siginfo_t'. + +2009-03-26 Roberto Bagnara + + * Watchdog/configure.ac, configure.ac: Added checks for the + availability of `siginfo_t'. + +2009-03-26 Roberto Bagnara + + * 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 ). + +2009-03-25 Abramo Bagnara + + * 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 + + * src/fpu-ia32.inlines.hh: Properly use PPL_FPMATH_MAY_USE_387 and + PPL_FPMATH_MAY_USE_SSE. + +2009-03-25 Roberto Bagnara + + * src/fpu-ia32.cc: Depend on PPL_CAN_CONTROL_FPU. + +2009-03-25 Roberto Bagnara + + * configure.ac: Typo fixed. + +2009-03-25 Roberto Bagnara + + * : commit b5d7b09c10aea7c95b9d2693986e2e4e549d3a12 Author: Roberto + Bagnara Date: Wed Mar 25 21:06:01 2009 +0100 + +2009-03-25 Roberto Bagnara + + * 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 + + * 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 + + * TODO: TODO item - Check the configuration dependent documentation for Prolog, done + and removed. + +2009-03-25 Patricia Hill + + * 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 + + * 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 + + * interfaces/C/tests/formatted_output.c: Reduced DIMENSION to 100. + +2009-03-24 Roberto Bagnara + + * 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 + + * interfaces/C/Makefile.am: Fixed file names. + +2009-03-24 Enea Zaffanella + + * NEWS: Mention the bug corrected for method + Octagonal_Shape::affine_image(). + +2009-03-24 Abramo Bagnara + + * interfaces/C/ppl_c_header.h: Fixed comment. + +2009-03-24 Abramo Bagnara + + * interfaces/C/ppl_c_header.h: Fixed indentation. + +2009-03-24 Enea Zaffanella + + * src/Octagonal_Shape.templates.hh: Corrected bug affecting method + Octagonal_Shape::affine_image(). + +2009-03-24 Abramo Bagnara + + * 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/tests/formatted_output.c, + interfaces/C/tests/print_to_buffer.c, + interfaces/C/tests/print_to_buffer.h, src/Makefile.am, + src/c_stream.cc, 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 + + * 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 + + * README.configure, TODO: Explained the `--disable-ppl_lcdd' and + `--disable-ppl_lcdd' configure options. + +2009-03-24 Roberto Bagnara + + * 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 + + * fedora/ppl.spec: Synchronized with the Fedora repository. + +2009-03-24 Roberto Bagnara + + * 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 + + * interfaces/C/tests/formatted_output.c, + interfaces/C/tests/print_to_buffer.c: Build restored. + +2009-03-23 Abramo Bagnara + + * 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 + + * 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 + + * interfaces/C/tests/Makefile.am, interfaces/C/tests/cxxoutput.c, + interfaces/C/tests/formatted_output.c, + interfaces/C/tests/print_to_buffer.cc: Done some cleaning. + +2009-03-23 Roberto Bagnara + + * 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 + + * src/c_stream.cc, src/c_stream.h, src/c_streambuf_format.cc: Better + name. + +2009-03-23 Abramo Bagnara + + * 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 + + * tests/Octagonal_Shape/affineimage1.cc: Added a test. + +2009-03-23 Abramo Bagnara + + * 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 + + * src/OR_Matrix.inlines.hh, src/Octagonal_Shape.inlines.hh, + src/Octagonal_Shape.templates.hh: Readability improvements. + +2009-03-23 Roberto Bagnara + + * 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 + + * src/c_stream.cc, src/c_stream.h: Added ppl_io_ostream_buffer_clear + function. + +2009-03-23 Abramo Bagnara + + * src/c_stream.cc, src/c_stream.h: Added write functions for native + types. + +2009-03-23 Abramo Bagnara + + * 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 + + * 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 + + * src/OR_Matrix.inlines.hh: Obsolete FIXME removed. + +2009-03-23 Roberto Bagnara + + * src/Octagonal_Shape.templates.hh: Little formatting improvement. + +2009-03-23 Enea Zaffanella + + * src/pretty_print.cc, src/pretty_print.hh: Use consistent parameter + names in helper function wrap. + +2009-03-22 Roberto Bagnara + + * demos/ppl_lpsol/expected_mpz_a: Updated to reflect the new way + `ppl_lpsol' is invoked. + +2009-03-22 Roberto Bagnara + + * Makefile.am, Watchdog/Makefile.am, Watchdog/pwl-config.sed, + ppl-config.sed: Tightened the machinery used to generate the + configuration headers. + +2009-03-22 Roberto Bagnara + + * .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 Roberto Bagnara + + * Watchdog/configure.ac, configure.ac: Minimum Autoconf version + brought back to 2.61. + +2009-03-21 Roberto Bagnara + + * .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 + + * Watchdog/configure.ac, configure.ac, m4/ac_prog_java.m4, + m4/ac_prog_javac.m4: Avoid using obsolete Autoconf macros. + +2009-02-22 Abramo Bagnara + + * .cvsignore, .gitignore, Watchdog/.cvsignore, Watchdog/.gitignore, + Watchdog/doc/.cvsignore, Watchdog/doc/.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, + demos/ppl_lpsol/.gitignore, demos/ppl_lpsol/examples/.cvsignore, + demos/ppl_lpsol/examples/.gitignore, devtools/.cvsignore, + devtools/.gitignore, doc/.cvsignore, doc/.gitignore, + fedora/.cvsignore, fedora/.gitignore, interfaces/.cvsignore, + interfaces/.gitignore, interfaces/C/.cvsignore, + interfaces/C/.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, + interfaces/Java/parma_polyhedra_library/.gitignore, + interfaces/Java/tests/.cvsignore, interfaces/Java/tests/.gitignore, + interfaces/OCaml/.cvsignore, interfaces/OCaml/.gitignore, + interfaces/OCaml/tests/.cvsignore, + interfaces/OCaml/tests/.gitignore, interfaces/Prolog/.cvsignore, + interfaces/Prolog/.gitignore, interfaces/Prolog/Ciao/.cvsignore, + interfaces/Prolog/Ciao/.gitignore, + interfaces/Prolog/GNU/.cvsignore, interfaces/Prolog/GNU/.gitignore, + interfaces/Prolog/SICStus/.cvsignore, + interfaces/Prolog/SICStus/.gitignore, + interfaces/Prolog/SWI/.cvsignore, interfaces/Prolog/SWI/.gitignore, + interfaces/Prolog/XSB/.cvsignore, interfaces/Prolog/XSB/.gitignore, + interfaces/Prolog/YAP/.cvsignore, interfaces/Prolog/YAP/.gitignore, + interfaces/Prolog/tests/.cvsignore, + interfaces/Prolog/tests/.gitignore, m4/.cvsignore, m4/.gitignore, + src/.cvsignore, src/.gitignore, tests/.cvsignore, tests/.gitignore, + tests/Ask_Tell/.cvsignore, tests/Ask_Tell/.gitignore, + tests/BD_Shape/.cvsignore, tests/BD_Shape/.gitignore, + tests/Box/.cvsignore, tests/Box/.gitignore, tests/Grid/.cvsignore, + tests/Grid/.gitignore, tests/MIP_Problem/.cvsignore, + tests/MIP_Problem/.gitignore, tests/Octagonal_Shape/.cvsignore, + tests/Octagonal_Shape/.gitignore, + tests/Partially_Reduced_Product/.cvsignore, + tests/Partially_Reduced_Product/.gitignore, + tests/Polyhedron/.cvsignore, tests/Polyhedron/.gitignore, + tests/Powerset/.cvsignore, tests/Powerset/.gitignore, + utils/.cvsignore, utils/.gitignore: Replaced .cvsignore with + .gitignore. diff --git a/Watchdog/INSTALL b/Watchdog/INSTALL new file mode 100644 index 0000000..8b82ade --- /dev/null +++ b/Watchdog/INSTALL @@ -0,0 +1,291 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, +2006, 2007, 2008 Free Software Foundation, Inc. + + This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +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. + + 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. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + 6. Often, you can also type `make uninstall' to remove the installed + files again. + +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 `..'. + + 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'. + + 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. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +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" + +and if that doesn't work, install pre-built binaries of GCC for HP-UX. + + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot +parse its `' 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" + +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 bug. Until the bug is fixed you can use this workaround: + + CONFIG_SHELL=/bin/bash /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/Watchdog/Makefile.am b/Watchdog/Makefile.am new file mode 100644 index 0000000..b9b7bb2 --- /dev/null +++ b/Watchdog/Makefile.am @@ -0,0 +1,61 @@ +# Automake source file for the Parma Watchdog Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Watchdog Library (PWL). +# +# The PWL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PWL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . */ + +# Tell aclocal where to find `.m4' files. +ACLOCAL_AMFLAGS = -I m4 + +dist_noinst_SCRIPTS = \ +configure + +if BUILD_WATCHDOG_LIBRARY + +SUBDIRS = . m4 utils src tests doc + +nodist_noinst_HEADERS = \ +pwl-config.h + +pwl-config.h: config.h $(srcdir)/pwl-config.sed + $(SED) -f $(srcdir)/pwl-config.sed $< >$@ + +pwl-config.h.in: config.h.in $(srcdir)/pwl-config.sed + $(SED) -f $(srcdir)/pwl-config.sed $< >$@ + +endif BUILD_WATCHDOG_LIBRARY + +# Kludge: we need to force building `pwl-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)/pwl-config.h + +# Kludge: we need to force building `pwl-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 = \ +pwl-config.h \ +pwl-config.h.in \ +pwl-config.sed \ +BUGS \ +CREDITS + +DISTCLEANFILES = \ +pwl-config.h diff --git a/Watchdog/Makefile.in b/Watchdog/Makefile.in new file mode 100644 index 0000000..500ef77 --- /dev/null +++ b/Watchdog/Makefile.in @@ -0,0 +1,714 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Watchdog Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Watchdog Library (PWL). +# +# The PWL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PWL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . */ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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 = README $(am__configure_deps) $(dist_noinst_SCRIPTS) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/config.h.in $(top_srcdir)/configure COPYING \ + ChangeLog INSTALL NEWS compile config.guess config.rpath \ + config.sub depcomp install-sh ltmain.sh missing mkinstalldirs +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.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)/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 = +SCRIPTS = $(dist_noinst_SCRIPTS) +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-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 uninstall-recursive +HEADERS = $(nodist_noinst_HEADERS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = . m4 utils src tests doc +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + { test ! -d $(distdir) \ + || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr $(distdir); }; } +DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 $(distdir).zip +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VALGRIND = @VALGRIND@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +datadir = @datadir@ +datarootdir = @datarootdir@ +debug_flag = @debug_flag@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# Tell aclocal where to find `.m4' files. +ACLOCAL_AMFLAGS = -I m4 +dist_noinst_SCRIPTS = \ +configure + +@BUILD_WATCHDOG_LIBRARY_TRUE@SUBDIRS = . m4 utils src tests doc +@BUILD_WATCHDOG_LIBRARY_TRUE@nodist_noinst_HEADERS = \ +@BUILD_WATCHDOG_LIBRARY_TRUE@pwl-config.h + + +# Kludge: we need to force building `pwl-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 = \ +pwl-config.h \ +pwl-config.h.in \ +pwl-config.sed \ +BUGS \ +CREDITS + +DISTCLEANFILES = \ +pwl-config.h + +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +am--refresh: + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \ + cd $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) + +config.h: stamp-h1 + @if test ! -f $@; then \ + rm -f stamp-h1; \ + $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ + else :; fi + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: $(am__configure_deps) + cd $(top_srcdir) && $(AUTOHEADER) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + $(am__remove_distdir) + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + distdir) \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook + -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r $(distdir) +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-lzma: distdir + tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma + $(am__remove_distdir) + +dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lzma*) \ + unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir); chmod a+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst + chmod a-w $(distdir) + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && cd $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck + $(am__remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @cd $(distuninstallcheck_dir) \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile $(SCRIPTS) $(HEADERS) config.h +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -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 + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-exec-am: + +install-html: install-html-recursive + +install-info: install-info-recursive + +install-man: + +install-pdf: install-pdf-recursive + +install-ps: install-ps-recursive + +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: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ + install-strip + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am am--refresh check check-am clean clean-generic \ + clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ + dist-gzip dist-hook dist-lzma dist-shar dist-tarZ 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-recursive uninstall uninstall-am + + +@BUILD_WATCHDOG_LIBRARY_TRUE@pwl-config.h: config.h $(srcdir)/pwl-config.sed +@BUILD_WATCHDOG_LIBRARY_TRUE@ $(SED) -f $(srcdir)/pwl-config.sed $< >$@ + +@BUILD_WATCHDOG_LIBRARY_TRUE@pwl-config.h.in: config.h.in $(srcdir)/pwl-config.sed +@BUILD_WATCHDOG_LIBRARY_TRUE@ $(SED) -f $(srcdir)/pwl-config.sed $< >$@ + +# Kludge: we need to force building `pwl-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)/pwl-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/Watchdog/NEWS b/Watchdog/NEWS new file mode 100644 index 0000000..0d73c44 --- /dev/null +++ b/Watchdog/NEWS @@ -0,0 +1,83 @@ + +Parma Watchdog Library NEWS -- history of user-visible changes +============================================================== + + +-------------------------------------------------------------------------- +NEWS for version 0.7 (released on April 14, 2009) +-------------------------------------------------------------------------- + +o Minor configuration improvements. + + +-------------------------------------------------------------------------- +NEWS for version 0.6 (released on November 4, 2008) +-------------------------------------------------------------------------- + +o The Parma Watchdog Library is now released under the terms of the + version 3 (or later) of the GNU General Public License. + +o The `pwl.hh' header file no longer defines macros not prefixed + by "PWL_". + + +-------------------------------------------------------------------------- +NEWS for version 0.5 (released on January 20, 2006) +-------------------------------------------------------------------------- + +o Portability has been improved. + +o The configuration option --enable-optimization now accepts a value + of `zero'. + + +Bugfixes +======== + +o Fixed a bug in Time::operator+=(const Time&) where the resulting + number of microseconds was being erroneously set to the resulting + number of seconds. + + +-------------------------------------------------------------------------- +NEWS for version 0.4 (released on December 24, 2004) +-------------------------------------------------------------------------- + +Bugfixes +======== + +o Fixed a bug that prevented profiling from functioning properly. + + +-------------------------------------------------------------------------- +NEWS for version 0.3 (released on August 18, 2004) +-------------------------------------------------------------------------- + +Bugfixes +======== + +o Fixed a deadlock bug. + + +-------------------------------------------------------------------------- +NEWS for version 0.2 (released on April 28, 2003) +-------------------------------------------------------------------------- + +New Features +============ + +o Added implicit and automatic initialization and finalization of the + library. Explicit initialization and finalization is no longer + necessary nor possible. + +o Portability improvements. + + +-------------------------------------------------------------------------- +NEWS for version 0.1 (released on July 1, 2002) +-------------------------------------------------------------------------- + +New Features +============ + +o The library has been released under the GNU General Public License. diff --git a/Watchdog/README b/Watchdog/README new file mode 100644 index 0000000..4aaf43a --- /dev/null +++ b/Watchdog/README @@ -0,0 +1,139 @@ + +This is the release 0.6 of the Parma Watchdog Library: +a C++ library for software timeouts. + +To be continued... + +See http://www.cs.unipr.it/ppl/ for more information on the PWL. +See the file COPYING for licensing information. +See the file INSTALL for build and installation instructions. +See the file NEWS for recent project news. +See the file BUGS for known bugs and how to report new ones. +See the file CREDITS for a list of people and organizations that +contributed to the PWL. + +Here is the contents of the PWL 0.7 source distribution +(5 directories, 97 files): + +pwl-0.7 +|-- BUGS +|-- COPYING +|-- CREDITS +|-- ChangeLog +|-- INSTALL +|-- Makefile.am +|-- Makefile.in +|-- NEWS +|-- README +|-- aclocal.m4 +|-- compile +|-- config.guess +|-- config.h.in +|-- config.rpath +|-- config.sub +|-- configure +|-- configure.ac +|-- depcomp +|-- doc +| |-- Makefile.am +| |-- Makefile.in +| |-- README.doc +| |-- 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 +| |-- pwl-user-0.7-html.tar.gz +| |-- pwl-user-0.7.pdf +| |-- pwl-user-0.7.ps.gz +| |-- pwl.sty +| |-- user.doxyconf-html.in +| |-- user.doxyconf-latex.in +| `-- user.tex +|-- install-sh +|-- ltmain.sh +|-- m4 +| |-- Makefile.am +| |-- Makefile.in +| |-- lib-ld.m4 +| |-- lib-link.m4 +| |-- libtool.m4 +| |-- ltoptions.m4 +| |-- ltsugar.m4 +| |-- ltversion.m4 +| `-- lt~obsolete.m4 +|-- missing +|-- mkinstalldirs +|-- pwl-config.h.in +|-- pwl-config.sed +|-- src +| |-- Doubly_Linked_Object.defs.hh +| |-- Doubly_Linked_Object.inlines.hh +| |-- Doubly_Linked_Object.types.hh +| |-- EList.defs.hh +| |-- EList.inlines.hh +| |-- EList.types.hh +| |-- EList_Iterator.defs.hh +| |-- EList_Iterator.inlines.hh +| |-- EList_Iterator.types.hh +| |-- Handler.defs.hh +| |-- Handler.inlines.hh +| |-- Handler.types.hh +| |-- Makefile.am +| |-- Makefile.in +| |-- Pending_Element.cc +| |-- Pending_Element.defs.hh +| |-- Pending_Element.inlines.hh +| |-- Pending_Element.types.hh +| |-- Pending_List.cc +| |-- Pending_List.defs.hh +| |-- Pending_List.inlines.hh +| |-- Pending_List.types.hh +| |-- Time.cc +| |-- Time.defs.hh +| |-- Time.inlines.hh +| |-- Time.types.hh +| |-- Watchdog.cc +| |-- Watchdog.defs.hh +| |-- Watchdog.inlines.hh +| |-- Watchdog.types.hh +| |-- pwl.hh.dist +| `-- pwl_header.hh +|-- tests +| |-- Makefile.am +| |-- Makefile.in +| |-- pwl_test.cc +| |-- pwl_test.hh +| |-- simple1.cc +| `-- valgrind_suppressions +`-- utils + |-- Makefile.am + |-- Makefile.in + `-- build_header.in + + +-------- + +Copyright (C) 2001-2009 Roberto Bagnara + +The Parma Watchdog Library is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 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, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. diff --git a/Watchdog/aclocal.m4 b/Watchdog/aclocal.m4 new file mode 100644 index 0000000..ecfd403 --- /dev/null +++ b/Watchdog/aclocal.m4 @@ -0,0 +1,7514 @@ +# generated automatically by aclocal 1.10.1 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 2008 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_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(AC_AUTOCONF_VERSION, [2.63],, +[m4_warning([this file was generated for autoconf 2.63. +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'.])]) + +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- + +# serial 52 AC_PROG_LIBTOOL + + +# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) +# ----------------------------------------------------------- +# If this macro is not defined by Autoconf, define it here. +m4_ifdef([AC_PROVIDE_IFELSE], + [], + [m4_define([AC_PROVIDE_IFELSE], + [m4_ifdef([AC_PROVIDE_$1], + [$2], [$3])])]) + + +# AC_PROG_LIBTOOL +# --------------- +AC_DEFUN([AC_PROG_LIBTOOL], +[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl +dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX +dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. + AC_PROVIDE_IFELSE([AC_PROG_CXX], + [AC_LIBTOOL_CXX], + [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX + ])]) +dnl And a similar setup for Fortran 77 support + AC_PROVIDE_IFELSE([AC_PROG_F77], + [AC_LIBTOOL_F77], + [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 +])]) + +dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. +dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run +dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. + AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [ifdef([AC_PROG_GCJ], + [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([A][M_PROG_GCJ], + [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([LT_AC_PROG_GCJ], + [define([LT_AC_PROG_GCJ], + defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) +])])# AC_PROG_LIBTOOL + + +# _AC_PROG_LIBTOOL +# ---------------- +AC_DEFUN([_AC_PROG_LIBTOOL], +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl +AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl +AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl +AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +# Prevent multiple expansion +define([AC_PROG_LIBTOOL], []) +])# _AC_PROG_LIBTOOL + + +# AC_LIBTOOL_SETUP +# ---------------- +AC_DEFUN([AC_LIBTOOL_SETUP], +[AC_PREREQ(2.50)dnl +AC_REQUIRE([AC_ENABLE_SHARED])dnl +AC_REQUIRE([AC_ENABLE_STATIC])dnl +AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl +AC_REQUIRE([AC_PROG_NM])dnl + +AC_REQUIRE([AC_PROG_LN_S])dnl +AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! +AC_REQUIRE([AC_OBJEXT])dnl +AC_REQUIRE([AC_EXEEXT])dnl +dnl +AC_LIBTOOL_SYS_MAX_CMD_LEN +AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +AC_LIBTOOL_OBJDIR + +AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +_LT_AC_PROG_ECHO_BACKSLASH + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e 1s/^X//' +[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] + +# Same as above, but do not quote variable references. +[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +AC_CHECK_TOOL(AR, ar, false) +AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_CHECK_TOOL(STRIP, strip, :) + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + AC_PATH_MAGIC + fi + ;; +esac + +_LT_REQUIRED_DARWIN_CHECKS + +AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +enable_win32_dll=yes, enable_win32_dll=no) + +AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +AC_ARG_WITH([pic], + [AC_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) +test -z "$pic_mode" && pic_mode=default + +# Use C for the default configuration in the libtool script +tagname= +AC_LIBTOOL_LANG_C_CONFIG +_LT_AC_TAGCONFIG +])# AC_LIBTOOL_SETUP + + +# _LT_AC_SYS_COMPILER +# ------------------- +AC_DEFUN([_LT_AC_SYS_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_AC_SYS_COMPILER + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +AC_DEFUN([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` +]) + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +AC_DEFUN([_LT_COMPILER_BOILERPLATE], +[AC_REQUIRE([LT_AC_PROG_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. +AC_DEFUN([_LT_LINKER_BOILERPLATE], +[AC_REQUIRE([LT_AC_PROG_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 +# -------------------------- +# Check for some things on darwin +AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + + 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. + echo "int foo(void){return 1;}" > conftest.c + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib ${wl}-single_module conftest.c + if test -f libconftest.dylib; then + lt_cv_apple_cc_single_mod=yes + rm -rf libconftest.dylib* + fi + rm conftest.c + 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" + ]) + case $host_os in + rhapsody* | darwin1.[[0123]]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) + # 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" != ":"; then + _lt_dsymutil="~$DSYMUTIL \$lib || :" + else + _lt_dsymutil= + fi + ;; + esac +]) + +# _LT_AC_SYS_LIBPATH_AIX +# ---------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +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 "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_AC_SYS_LIBPATH_AIX + + +# _LT_AC_SHELL_INIT(ARG) +# ---------------------- +AC_DEFUN([_LT_AC_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_AC_SHELL_INIT + + +# _LT_AC_PROG_ECHO_BACKSLASH +# -------------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], +[_LT_AC_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +echo=${ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null 2>&1 && unset CDPATH + +if test -z "$ECHO"; then +if test "X${echo_test_string+set}" != Xset; then +# find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if (echo_test_string=`eval $cmd`) 2>/dev/null && + echo_test_string=`eval $cmd` && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(ECHO) +])])# _LT_AC_PROG_ECHO_BACKSLASH + + +# _LT_AC_LOCK +# ----------- +AC_DEFUN([_LT_AC_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*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*) + libsuff=64 + 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*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + 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* + ;; + +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw* | *-*-pw32*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; + ]) +esac + +need_locks="$enable_libtool_lock" + +])# _LT_AC_LOCK + + +# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], +[AC_REQUIRE([LT_AC_PROG_SED]) +AC_CACHE_CHECK([$1], [$2], + [$2=no + ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + 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:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $rm conftest* +]) + +if test x"[$]$2" = xyes; then + ifelse([$5], , :, [$5]) +else + ifelse([$6], , :, [$6]) +fi +])# AC_LIBTOOL_COMPILER_OPTION + + +# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ------------------------------------------------------------ +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], +[AC_REQUIRE([LT_AC_PROG_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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $rm -r conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + ifelse([$4], , :, [$4]) +else + ifelse([$5], , :, [$5]) +fi +])# AC_LIBTOOL_LINKER_OPTION + + +# AC_LIBTOOL_SYS_MAX_CMD_LEN +# -------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], +[# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + 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 + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + teststring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + 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 +])# AC_LIBTOOL_SYS_MAX_CMD_LEN + + +# _LT_AC_CHECK_DLFCN +# ------------------ +AC_DEFUN([_LT_AC_CHECK_DLFCN], +[AC_CHECK_HEADERS(dlfcn.h)dnl +])# _LT_AC_CHECK_DLFCN + + +# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# --------------------------------------------------------------------- +AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + exit (status); +}] +EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_AC_TRY_DLOPEN_SELF + + +# AC_LIBTOOL_DLOPEN_SELF +# ---------------------- +AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-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_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +])# AC_LIBTOOL_DLOPEN_SELF + + +# AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) +# --------------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler +AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + 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:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* +]) +])# AC_LIBTOOL_PROG_CC_C_O + + +# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) +# ----------------------------------------- +# Check to see if we can do hard links to lock some files if needed +AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], +[AC_REQUIRE([_LT_AC_LOCK])dnl + +hard_links="nottested" +if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS + + +# AC_LIBTOOL_OBJDIR +# ----------------- +AC_DEFUN([AC_LIBTOOL_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +])# AC_LIBTOOL_OBJDIR + + +# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) +# ---------------------------------------------- +# Check hardcoding attributes. +AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_AC_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ + test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \ + test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_AC_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_AC_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_AC_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH + + +# AC_LIBTOOL_SYS_LIB_STRIP +# ------------------------ +AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], +[striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) +fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +])# AC_LIBTOOL_SYS_LIB_STRIP + + +# AC_LIBTOOL_SYS_DYNAMIC_LINKER +# ----------------------------- +# PORTME Fill in your ld.so characteristics +AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +m4_if($1,[],[ +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$lt_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e 's/;/ /g'` + else + lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # 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; } +}'` + sys_lib_search_path_spec=`echo $lt_search_path_spec` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[[4-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + 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 + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[123]]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[[3-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + + # 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;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $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 + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +AC_CACHE_VAL([lt_cv_sys_lib_search_path_spec], +[lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec"]) +sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +AC_CACHE_VAL([lt_cv_sys_lib_dlsearch_path_spec], +[lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec"]) +sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi +])# AC_LIBTOOL_SYS_DYNAMIC_LINKER + + +# _LT_AC_TAGCONFIG +# ---------------- +AC_DEFUN([_LT_AC_TAGCONFIG], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_ARG_WITH([tags], + [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], + [include additional configurations @<:@automatic@:>@])], + [tagnames="$withval"]) + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + AC_MSG_WARN([output file `$ofile' does not exist]) + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) + else + AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) + fi + fi + if test -z "$LTCFLAGS"; then + eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in + "") ;; + *) AC_MSG_ERROR([invalid tag name: $tagname]) + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + AC_MSG_ERROR([tag name \"$tagname\" already exists]) + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_LIBTOOL_LANG_CXX_CONFIG + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + AC_LIBTOOL_LANG_F77_CONFIG + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + AC_LIBTOOL_LANG_GCJ_CONFIG + else + tagname="" + fi + ;; + + RC) + AC_LIBTOOL_LANG_RC_CONFIG + ;; + + *) + AC_MSG_ERROR([Unsupported tag name: $tagname]) + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + AC_MSG_ERROR([unable to update list of available tagged configurations.]) + fi +fi +])# _LT_AC_TAGCONFIG + + +# AC_LIBTOOL_DLOPEN +# ----------------- +# enable checks for dlopen support +AC_DEFUN([AC_LIBTOOL_DLOPEN], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_DLOPEN + + +# AC_LIBTOOL_WIN32_DLL +# -------------------- +# declare package support for building win32 DLLs +AC_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_WIN32_DLL + + +# AC_ENABLE_SHARED([DEFAULT]) +# --------------------------- +# implement the --enable-shared flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_SHARED], +[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([shared], + [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]AC_ENABLE_SHARED_DEFAULT) +])# AC_ENABLE_SHARED + + +# AC_DISABLE_SHARED +# ----------------- +# set the default shared flag to --disable-shared +AC_DEFUN([AC_DISABLE_SHARED], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no) +])# AC_DISABLE_SHARED + + +# AC_ENABLE_STATIC([DEFAULT]) +# --------------------------- +# implement the --enable-static flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_STATIC], +[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([static], + [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]AC_ENABLE_STATIC_DEFAULT) +])# AC_ENABLE_STATIC + + +# AC_DISABLE_STATIC +# ----------------- +# set the default static flag to --disable-static +AC_DEFUN([AC_DISABLE_STATIC], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no) +])# AC_DISABLE_STATIC + + +# AC_ENABLE_FAST_INSTALL([DEFAULT]) +# --------------------------------- +# implement the --enable-fast-install flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_FAST_INSTALL], +[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([fast-install], + [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) +])# AC_ENABLE_FAST_INSTALL + + +# AC_DISABLE_FAST_INSTALL +# ----------------------- +# set the default to --disable-fast-install +AC_DEFUN([AC_DISABLE_FAST_INSTALL], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no) +])# AC_DISABLE_FAST_INSTALL + + +# AC_LIBTOOL_PICMODE([MODE]) +# -------------------------- +# implement the --with-pic flag +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +AC_DEFUN([AC_LIBTOOL_PICMODE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +pic_mode=ifelse($#,1,$1,default) +])# AC_LIBTOOL_PICMODE + + +# AC_PROG_EGREP +# ------------- +# This is predefined starting with Autoconf 2.54, so this conditional +# definition can be removed once we require Autoconf 2.54 or later. +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], +[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], + [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi]) + EGREP=$ac_cv_prog_egrep + AC_SUBST([EGREP]) +])]) + + +# AC_PATH_TOOL_PREFIX +# ------------------- +# find a file program which can recognize shared library +AC_DEFUN([AC_PATH_TOOL_PREFIX], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="ifelse([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&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@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +])# AC_PATH_TOOL_PREFIX + + +# AC_PATH_MAGIC +# ------------- +# find a file program which can recognize a shared library +AC_DEFUN([AC_PATH_MAGIC], +[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# AC_PATH_MAGIC + + +# AC_PROG_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([AC_PROG_LD], +[AC_ARG_WITH([gnu-ld], + [AC_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no]) +AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /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 + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +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 + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +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 Linux ELF. +linux* | k*bsd*-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=unknown + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown +])# AC_DEPLIBS_CHECK_METHOD + + +# AC_PROG_NM +# ---------- +# find the pathname to a BSD-compatible name lister +AC_DEFUN([AC_PROG_NM], +[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi]) +NM="$lt_cv_path_NM" +])# AC_PROG_NM + + +# AC_CHECK_LIBM +# ------------- +# check for math library +AC_DEFUN([AC_CHECK_LIBM], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +])# AC_CHECK_LIBM + + +# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl convenience library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-convenience to the configure arguments. Note that +# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, +# it is assumed to be `libltdl'. LIBLTDL will be prefixed with +# '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/' +# (note the single quotes!). If your package is not flat and you're not +# using automake, define top_builddir and top_srcdir appropriately in +# the Makefiles. +AC_DEFUN([AC_LIBLTDL_CONVENIENCE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_CONVENIENCE + + +# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl installable library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-install to the configure arguments. Note that +# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, +# and an installed libltdl is not found, it is assumed to be `libltdl'. +# LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and top_srcdir +# appropriately in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN([AC_LIBLTDL_INSTALLABLE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, lt_dlinit, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + LTDLINCL= + fi + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_INSTALLABLE + + +# AC_LIBTOOL_CXX +# -------------- +# enable support for C++ libraries +AC_DEFUN([AC_LIBTOOL_CXX], +[AC_REQUIRE([_LT_AC_LANG_CXX]) +])# AC_LIBTOOL_CXX + + +# _LT_AC_LANG_CXX +# --------------- +AC_DEFUN([_LT_AC_LANG_CXX], +[AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([_LT_AC_PROG_CXXCPP]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) +])# _LT_AC_LANG_CXX + +# _LT_AC_PROG_CXXCPP +# ------------------ +AC_DEFUN([_LT_AC_PROG_CXXCPP], +[ +AC_REQUIRE([AC_PROG_CXX]) +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +fi +])# _LT_AC_PROG_CXXCPP + +# AC_LIBTOOL_F77 +# -------------- +# enable support for Fortran 77 libraries +AC_DEFUN([AC_LIBTOOL_F77], +[AC_REQUIRE([_LT_AC_LANG_F77]) +])# AC_LIBTOOL_F77 + + +# _LT_AC_LANG_F77 +# --------------- +AC_DEFUN([_LT_AC_LANG_F77], +[AC_REQUIRE([AC_PROG_F77]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) +])# _LT_AC_LANG_F77 + + +# AC_LIBTOOL_GCJ +# -------------- +# enable support for GCJ libraries +AC_DEFUN([AC_LIBTOOL_GCJ], +[AC_REQUIRE([_LT_AC_LANG_GCJ]) +])# AC_LIBTOOL_GCJ + + +# _LT_AC_LANG_GCJ +# --------------- +AC_DEFUN([_LT_AC_LANG_GCJ], +[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], + [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], + [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], + [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) +])# _LT_AC_LANG_GCJ + + +# AC_LIBTOOL_RC +# ------------- +# enable support for Windows resource files +AC_DEFUN([AC_LIBTOOL_RC], +[AC_REQUIRE([LT_AC_PROG_RC]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) +])# AC_LIBTOOL_RC + + +# AC_LIBTOOL_LANG_C_CONFIG +# ------------------------ +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) +AC_DEFUN([_LT_AC_LANG_C_CONFIG], +[lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF + +# Report which library types will actually be built +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case $host_os in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +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]) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_C_CONFIG + + +# AC_LIBTOOL_LANG_CXX_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) +AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], +[AC_LANG_PUSH(C++) +AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([_LT_AC_PROG_CXXCPP]) + +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(allow_undefined_flag, $1)= +_LT_AC_TAGVAR(always_export_symbols, $1)=no +_LT_AC_TAGVAR(archive_expsym_cmds, $1)= +_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_direct, $1)=no +_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= +_LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_AC_TAGVAR(hardcode_automatic, $1)=no +_LT_AC_TAGVAR(module_cmds, $1)= +_LT_AC_TAGVAR(module_expsym_cmds, $1)= +_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_AC_TAGVAR(no_undefined_flag, $1)= +_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= +_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Dependencies to place before and after the object being linked: +_LT_AC_TAGVAR(predep_objects, $1)= +_LT_AC_TAGVAR(postdep_objects, $1)= +_LT_AC_TAGVAR(predeps, $1)= +_LT_AC_TAGVAR(postdeps, $1)= +_LT_AC_TAGVAR(compiler_lib_search_path, $1)= +_LT_AC_TAGVAR(compiler_lib_search_dirs, $1)= + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# 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_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + $as_unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + $as_unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' +else + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + AC_PROG_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +_LT_AC_TAGVAR(ld_shlibs, $1)=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + 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_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + darwin* | rhapsody*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + if test "$GXX" = yes ; then + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_AC_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_AC_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_AC_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}" + if test "$lt_cv_apple_cc_single_mod" != "yes"; then + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + _LT_AC_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 + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + freebsd[[12]]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + freebsd-elf*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + ;; + gnu*) + ;; + hpux9*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) ;; + *) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + interix[[3-9]]*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + linux* | k*bsd*-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_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc*) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_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; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + m88k*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + openbsd2*) + # C++ shared libraries are fairly broken + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd='echo' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + osf3*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ + $rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_AC_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_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + # So that behaviour is only enabled if SCOABSPATH is set to a + # non-empty value in the environment. Most likely only useful for + # creating official distributions of packages. + # This is a hack until libtool officially supports absolute path + # names for shared libraries. + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +esac +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_AC_TAGVAR(GCC, $1)="$GXX" +_LT_AC_TAGVAR(LD, $1)="$LD" + +AC_LIBTOOL_POSTDEP_PREDEP($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +])# AC_LIBTOOL_LANG_CXX_CONFIG + +# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) +# ------------------------------------ +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <&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_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC*) + # 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_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac +]) +case " $_LT_AC_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac +])# AC_LIBTOOL_POSTDEP_PREDEP + +# AC_LIBTOOL_LANG_F77_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG], [_LT_AC_LANG_F77_CONFIG(F77)]) +AC_DEFUN([_LT_AC_LANG_F77_CONFIG], +[AC_REQUIRE([AC_PROG_F77]) +AC_LANG_PUSH(Fortran 77) + +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(allow_undefined_flag, $1)= +_LT_AC_TAGVAR(always_export_symbols, $1)=no +_LT_AC_TAGVAR(archive_expsym_cmds, $1)= +_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_direct, $1)=no +_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= +_LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(hardcode_automatic, $1)=no +_LT_AC_TAGVAR(module_cmds, $1)= +_LT_AC_TAGVAR(module_expsym_cmds, $1)= +_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_AC_TAGVAR(no_undefined_flag, $1)= +_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= +_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="\ + subroutine t + 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_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${F77-"f77"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) + +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case $host_os in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; +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_AC_TAGVAR(GCC, $1)="$G77" +_LT_AC_TAGVAR(LD, $1)="$LD" + +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_F77_CONFIG + + +# AC_LIBTOOL_LANG_GCJ_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG], [_LT_AC_LANG_GCJ_CONFIG(GCJ)]) +AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG], +[AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# 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_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${GCJ-"gcj"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds + +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_RESTORE +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_GCJ_CONFIG + + +# AC_LIBTOOL_LANG_RC_CONFIG +# ------------------------- +# Ensure that the configuration vars for the Windows resource compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG], [_LT_AC_LANG_RC_CONFIG(RC)]) +AC_DEFUN([_LT_AC_LANG_RC_CONFIG], +[AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${RC-"windres"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_RESTORE +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_RC_CONFIG + + +# AC_LIBTOOL_CONFIG([TAGNAME]) +# ---------------------------- +# If TAGNAME is not passed, then create an initial libtool script +# with a default configuration from the untagged config vars. Otherwise +# add code to config.status for appending the configuration named by +# TAGNAME from the matching tagged config vars. +AC_DEFUN([AC_LIBTOOL_CONFIG], +[# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + _LT_AC_TAGVAR(compiler, $1) \ + _LT_AC_TAGVAR(CC, $1) \ + _LT_AC_TAGVAR(LD, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_static, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) \ + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1) \ + _LT_AC_TAGVAR(thread_safe_flag_spec, $1) \ + _LT_AC_TAGVAR(whole_archive_flag_spec, $1) \ + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) \ + _LT_AC_TAGVAR(old_archive_cmds, $1) \ + _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) \ + _LT_AC_TAGVAR(predep_objects, $1) \ + _LT_AC_TAGVAR(postdep_objects, $1) \ + _LT_AC_TAGVAR(predeps, $1) \ + _LT_AC_TAGVAR(postdeps, $1) \ + _LT_AC_TAGVAR(compiler_lib_search_path, $1) \ + _LT_AC_TAGVAR(compiler_lib_search_dirs, $1) \ + _LT_AC_TAGVAR(archive_cmds, $1) \ + _LT_AC_TAGVAR(archive_expsym_cmds, $1) \ + _LT_AC_TAGVAR(postinstall_cmds, $1) \ + _LT_AC_TAGVAR(postuninstall_cmds, $1) \ + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) \ + _LT_AC_TAGVAR(allow_undefined_flag, $1) \ + _LT_AC_TAGVAR(no_undefined_flag, $1) \ + _LT_AC_TAGVAR(export_symbols_cmds, $1) \ + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) \ + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) \ + _LT_AC_TAGVAR(hardcode_libdir_separator, $1) \ + _LT_AC_TAGVAR(hardcode_automatic, $1) \ + _LT_AC_TAGVAR(module_cmds, $1) \ + _LT_AC_TAGVAR(module_expsym_cmds, $1) \ + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) \ + _LT_AC_TAGVAR(fix_srcfile_path, $1) \ + _LT_AC_TAGVAR(exclude_expsyms, $1) \ + _LT_AC_TAGVAR(include_expsyms, $1); do + + case $var in + _LT_AC_TAGVAR(old_archive_cmds, $1) | \ + _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) | \ + _LT_AC_TAGVAR(archive_cmds, $1) | \ + _LT_AC_TAGVAR(archive_expsym_cmds, $1) | \ + _LT_AC_TAGVAR(module_cmds, $1) | \ + _LT_AC_TAGVAR(module_expsym_cmds, $1) | \ + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) | \ + _LT_AC_TAGVAR(export_symbols_cmds, $1) | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\[$]0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\[$]0 --fallback-echo"[$]/[$]0 --fallback-echo"/'` + ;; + esac + +ifelse([$1], [], + [cfgfile="${ofile}T" + trap "$rm \"$cfgfile\"; exit 1" 1 2 15 + $rm -f "$cfgfile" + AC_MSG_NOTICE([creating $ofile])], + [cfgfile="$ofile"]) + + cat <<__EOF__ >> "$cfgfile" +ifelse([$1], [], +[#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e 1s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG], +[# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) + +# Is the compiler the GNU C compiler? +with_gcc=$_LT_AC_TAGVAR(GCC, $1) + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_[]_LT_AC_TAGVAR(LD, $1) + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) + +# Commands used to build and install a shared archive. +archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) +archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) +module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) + +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_dirs, $1) + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to yes if exported symbols are required. +always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) + +# The commands to list exported symbols. +export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) + +# Symbols that must always be exported. +include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) + +ifelse([$1],[], +[# ### END LIBTOOL CONFIG], +[# ### END LIBTOOL TAG CONFIG: $tagname]) + +__EOF__ + +ifelse([$1],[], [ + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +]) +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi +])# AC_LIBTOOL_CONFIG + + +# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl + +_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI + + +# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +# --------------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], +[AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([LT_AC_PROG_SED]) +AC_REQUIRE([AC_PROG_NM]) +AC_REQUIRE([AC_OBJEXT]) +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +linux* | k*bsd*-gnu) + if test "$host_cpu" = ia64; then + symcode='[[ABCDGIRSTW]]' + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext < $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 < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[[]] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -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 +]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + + +# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) +# --------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], +[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_static, $1)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) + ifelse([$1],[CXX],[ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + 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_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + icpc* | ecpc*) + # Intel C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler. + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + 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_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + hpux9* | hpux10* | hpux11*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + newsos6) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + linux* | k*bsd*-gnu) + case $cc_basename in + icc* | ecc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + esac + ;; + esac + ;; + + osf3* | osf4* | osf5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then + AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], + _LT_AC_TAGVAR(lt_cv_prog_compiler_pic_works, $1), + [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +# +# Check to make sure the static flag actually works. +# +wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\" +AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_AC_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) +]) + + +# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) +# ------------------------------------ +# See if the linker supports building shared libraries. +AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +ifelse([$1],[CXX],[ + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + 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 + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + ;; + *) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + _LT_AC_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] +],[ + runpath_var= + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)= + _LT_AC_TAGVAR(archive_expsym_cmds, $1)= + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown + _LT_AC_TAGVAR(hardcode_automatic, $1)=no + _LT_AC_TAGVAR(module_cmds, $1)= + _LT_AC_TAGVAR(module_expsym_cmds, $1)= + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_AC_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_AC_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_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= + # Just being paranoid about ensuring that cc_basename is set. + _LT_CC_BASENAME([$compiler]) + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + interix[[3-9]]*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | k*bsd*-gnu) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_AC_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; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + *) + tmp_sharedflag='-shared' ;; + esac + _LT_AC_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test $supports_anon_versioning = yes; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + 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 + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|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_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + # see comment about different semantics on the GNU ld section + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + bsdi[[45]]*) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_AC_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_AC_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_AC_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_AC_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}" + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi + ;; + + dgux*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + if test "$GCC" = yes; then + wlarc='${wl}' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + wlarc='' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine 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_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +# +# Do we need to explicitly link libc? +# +case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_AC_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $rm conftest* + 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_AC_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) + then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac + fi + ;; +esac +])# AC_LIBTOOL_PROG_LD_SHLIBS + + +# _LT_AC_FILE_LTDLL_C +# ------------------- +# Be careful that the start marker always follows a newline. +AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ +])# _LT_AC_FILE_LTDLL_C + + +# _LT_AC_TAGVAR(VARNAME, [TAGNAME]) +# --------------------------------- +AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) + + +# old names +AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) +AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) +AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) +AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) +AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) + +# This is just to silence aclocal about the macro not being used +ifelse([AC_DISABLE_FAST_INSTALL]) + +AC_DEFUN([LT_AC_PROG_GCJ], +[AC_CHECK_TOOL(GCJ, gcj, no) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS) +]) + +AC_DEFUN([LT_AC_PROG_RC], +[AC_CHECK_TOOL(RC, windres, no) +]) + + +# Cheap backport of AS_EXECUTABLE_P and required macros +# from Autoconf 2.59; we should not use $as_executable_p directly. + +# _AS_TEST_PREPARE +# ---------------- +m4_ifndef([_AS_TEST_PREPARE], +[m4_defun([_AS_TEST_PREPARE], +[if test -x / >/dev/null 2>&1; then + as_executable_p='test -x' +else + as_executable_p='test -f' +fi +])])# _AS_TEST_PREPARE + +# AS_EXECUTABLE_P +# --------------- +# Check whether a file is executable. +m4_ifndef([AS_EXECUTABLE_P], +[m4_defun([AS_EXECUTABLE_P], +[AS_REQUIRE([_AS_TEST_PREPARE])dnl +$as_executable_p $1[]dnl +])])# AS_EXECUTABLE_P + +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +# LT_AC_PROG_SED +# -------------- +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +AC_DEFUN([LT_AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if AS_EXECUTABLE_P(["$as_dir/$lt_ac_prog$ac_exec_ext"]); then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +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]) +]) + +# Copyright (C) 2002, 2003, 2005, 2006, 2007 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.10' +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.10.1], [], + [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 AC_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.10.1])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(AC_AUTOCONF_VERSION)]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 8 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])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, 2000, 2001, 2002, 2003, 2004, 2005, 2006 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 9 + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], 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'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +#serial 3 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # 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"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 13 + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.60])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], +[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], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [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) +AM_PROG_INSTALL_SH +AM_PROG_INSTALL_STRIP +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl +]) +]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_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, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"} +AC_SUBST(install_sh)]) + +# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 3 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_MKDIR_P +# --------------- +# Check for `mkdir -p'. +AC_DEFUN([AM_PROG_MKDIR_P], +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 3 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006 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]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of `v7', `ustar', or `pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. +AM_MISSING_PROG([AMTAR], [tar]) +m4_if([$1], [v7], + [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /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/lib-ld.m4]) +m4_include([m4/lib-link.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]) diff --git a/Watchdog/compile b/Watchdog/compile new file mode 100755 index 0000000..1b1d232 --- /dev/null +++ b/Watchdog/compile @@ -0,0 +1,142 @@ +#! /bin/sh +# Wrapper for compilers which do not understand `-c -o'. + +scriptversion=2005-05-14.22 + +# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +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 . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; +esac + +ofile= +cfile= +eat= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as `compile cc -o foo foo.c'. + # So we strip `-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no `-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # `.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'` + +# Create the lock directory. +# Note: use `[/.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/Watchdog/config.guess b/Watchdog/config.guess new file mode 100755 index 0000000..f0f0d36 --- /dev/null +++ b/Watchdog/config.guess @@ -0,0 +1,1529 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Free Software Foundation, Inc. + +timestamp='2008-09-28' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner . +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 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@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + 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 __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo 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'` + exit ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* 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 + + 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:*:[456]) + 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 + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep __LP64__ >/dev/null + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:[3456]*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + EM64T | authenticamd | genuineintel) + 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 ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + arm*:Linux:*:*) + 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-gnu + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^CPU/{ + s: ::g + p + }'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^CPU/{ + s: ::g + p + }'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo or32-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-gnu + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^LIBC/{ + s: ::g + p + }'`" + test x"${LIBC}" != x && { + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit + } + test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@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 ;; + 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 + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#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 + 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 +# 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 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/Watchdog/config.h.in b/Watchdog/config.h.in new file mode 100644 index 0000000..ffccb43 --- /dev/null +++ b/Watchdog/config.h.in @@ -0,0 +1,84 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* 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 header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_FENV_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `setitimer' function. */ +#undef HAVE_SETITIMER + +/* Define to 1 if the system has the type `siginfo_t'. */ +#undef HAVE_SIGINFO_T + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#undef LT_OBJDIR + +/* Assertions are disabled when this is defined */ +#undef NDEBUG + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define to 1 if you can safely include both and . */ +#undef TIME_WITH_SYS_TIME + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + + +#ifdef PWL_NDEBUG +# define NDEBUG PWL_NDEBUG +#endif + diff --git a/Watchdog/config.rpath b/Watchdog/config.rpath new file mode 100755 index 0000000..c547c68 --- /dev/null +++ b/Watchdog/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 , 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 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=/' <. Submit a context +# diff and a properly formatted ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ + uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | 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 \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | mt \ + | msp430 \ + | nios | nios2 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | score \ + | sh | sh[1234] | sh[24]a | 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 | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | 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-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | 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-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | 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 + ;; + 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 + ;; + 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) + 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'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + 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 + ;; + 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-/'` + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + 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) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + 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 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tile*) + basic_machine=tile-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 + ;; + 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[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -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 + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/Watchdog/configure b/Watchdog/configure new file mode 100755 index 0000000..fe04510 --- /dev/null +++ b/Watchdog/configure @@ -0,0 +1,19656 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.63 for the Parma Watchdog Library 0.7. +# +# Report bugs to . +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008 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 + + + + +# PATH needs CR +# 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_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 +if (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 + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +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. +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); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# Required to use basename. +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 + + +# Name of the executable. +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'` + +# CDPATH. +$as_unset CDPATH + + +if test "x$CONFIG_SHELL" = x; then + if (eval ":") 2>/dev/null; then + as_have_required=yes +else + as_have_required=no +fi + + if test $as_have_required = yes && (eval ": +(as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=\$LINENO + as_lineno_2=\$LINENO + test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && + test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } +") 2> /dev/null; then + : +else + as_candidate_shells= + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + case $as_dir in + /*) + for as_base in sh bash ksh sh5; do + as_candidate_shells="$as_candidate_shells $as_dir/$as_base" + done;; + esac +done +IFS=$as_save_IFS + + + for as_shell in $as_candidate_shells $SHELL; do + # Try only shells that exist, to save several forks. + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { ("$as_shell") 2> /dev/null <<\_ASEOF +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 + + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { "$as_shell" 2> /dev/null <<\_ASEOF +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_func_return () { + (exit $1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = "$1" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test $exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } + +_ASEOF +}; then + break +fi + +fi + + done + + if test "x$CONFIG_SHELL" != x; then + for as_var in BASH_ENV ENV + do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + done + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + + if test $as_have_required = no; then + echo This script requires a shell more modern than all the + echo shells that I found on your system. Please install a + echo modern shell, or manually run the script under such a + echo shell if you do have one. + { (exit 1); exit 1; } +fi + + +fi + +fi + + + +(eval "as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0") || { + echo No shell found that supports shell functions. + echo Please tell bug-autoconf@gnu.org about your system, + echo including any error possibly output before this message. + echo This can help us improve future autoconf versions. + echo Configuration will now proceed without shell functions. +} + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. 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 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +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 -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +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=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# 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'" + + + + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$lt_ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','` + ;; +esac + +ECHO=${lt_ECHO-echo} +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then + # Yippee, $ECHO works! + : +else + # Restart under the correct shell. + exec $SHELL "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <<_LT_EOF +$* +_LT_EOF + exit 0 +fi + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test -z "$lt_ECHO"; then + if test "X${echo_test_string+set}" != Xset; then + # find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if { echo_test_string=`eval $cmd`; } 2>/dev/null && + { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null + then + break + fi + done + fi + + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : + else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$ECHO" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + ECHO='print -r' + elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} + else + # Try using printf. + ECHO='printf %s\n' + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + ECHO="$CONFIG_SHELL $0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$CONFIG_SHELL $0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do + if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "$0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} + else + # Oops. We lost completely, so just stick with echo. + ECHO=echo + fi + fi + fi + fi + fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +lt_ECHO=$ECHO +if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then + lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" +fi + + + + +exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Identity of this package. +PACKAGE_NAME='the Parma Watchdog Library' +PACKAGE_TARNAME='pwl' +PACKAGE_VERSION='0.7' +PACKAGE_STRING='the Parma Watchdog Library 0.7' +PACKAGE_BUGREPORT='bagnara@cs.unipr.it' + +ac_unique_file="src/Watchdog.cc" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='LTLIBOBJS +LIBOBJS +debug_flag +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +lt_ECHO +RANLIB +AR +OBJDUMP +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +LIBTOOL +EGREP +GREP +CPP +BUILD_WATCHDOG_LIBRARY_FALSE +BUILD_WATCHDOG_LIBRARY_TRUE +VALGRIND_TESTS_ENABLED_FALSE +VALGRIND_TESTS_ENABLED_TRUE +VALGRIND +HAVE_PERL_FALSE +HAVE_PERL_TRUE +PERL +NO_UNDEFINED_FALSE +NO_UNDEFINED_TRUE +CXXCPP +SED +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX +GCC_FALSE +GCC_TRUE +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +ISODATE +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_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +with_cc +with_cxx +enable_dependency_tracking +with_gnu_ld +enable_rpath +enable_debugging +enable_profiling +enable_coverage +enable_assertions +enable_optimization +enable_arch +with_cflags +with_cxxflags +enable_valgrind_tests +enable_watchdog +enable_shared +enable_static +with_pic +enable_fast_install +enable_libtool_lock +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CXX +CXXFLAGS +CCC +CXXCPP +CPP' + + +# 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=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_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + 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_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + 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_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + 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_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + 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_echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + 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_echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2 + { (exit 1); exit 1; }; } ;; + *) $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_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; } +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 + $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + { $as_echo "$as_me: error: working directory cannot be determined" >&2 + { (exit 1); exit 1; }; } +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 + { (exit 1); exit 1; }; } + + +# 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_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 + { (exit 1); exit 1; }; } + 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 Watchdog Library 0.7 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/pwl] + --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 Watchdog Library 0.7:";; + 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] + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --disable-rpath do not hardcode runtime library paths + --enable-debugging compile with debugging information + --enable-profiling compile for profiling + --enable-coverage compile for test coverage + --enable-assertions check run-time assertions + --enable-optimization enable compiler optimizations + --enable-arch=arch optimize for architecture arch + --enable-valgrind-tests run library tests under Valgrind + --enable-watchdog build also the Parma Watchdog Library + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-cc=XXX use XXX as the C compiler + --with-cxx=XXX use XXX as the C++ compiler + --with-gnu-ld assume the C compiler uses GNU ld default=no + --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-pic try to use only PIC/non-PIC objects [default=use + both] + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CXXCPP C++ preprocessor + CPP C preprocessor + +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 . +_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 Watchdog Library configure 0.7 +generated by GNU Autoconf 2.63 + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 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 +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 Watchdog Library $as_me 0.7, which was +generated by GNU Autoconf 2.63. 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) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$ac_configure_args1 '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + ac_configure_args="$ac_configure_args '$ac_arg'" + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: 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 + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + 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:$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= ;; #( + *) $as_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 + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + 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 + cat <<\_ASBOX +## ------------------- ## +## File substitutions. ## +## ------------------- ## +_ASBOX + 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 + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + 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'; { (exit 1); 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 + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + ac_site_file1=$CONFIG_SITE +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 -r "$ac_site_file"; then + { $as_echo "$as_me:$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" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { $as_echo "$as_me:$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:$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:$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:$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:$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:$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:$LINENO: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:$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. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:$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_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + + + + + + + + + + + + + + + + + + + + + + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +# Minimum Autoconf version required. + + +# Make sure the sources are there. + + +# 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_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 +$as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} + { (exit 1); exit 1; }; } +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_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 +$as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} + { (exit 1); exit 1; }; } + +{ $as_echo "$as_me:$LINENO: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if test "${ac_cv_build+set}" = set; 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_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +$as_echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 +$as_echo "$as_me: error: invalid value of canonical build" >&2;} + { (exit 1); exit 1; }; };; +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:$LINENO: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if test "${ac_cv_host+set}" = set; 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_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} + { (exit 1); exit 1; }; } +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 +$as_echo "$as_me: error: invalid value of canonical host" >&2;} + { (exit 1); exit 1; }; };; +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.10' + +# 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:$LINENO: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; 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 { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$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:$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:$LINENO: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + { { $as_echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&5 +$as_echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&2;} + { (exit 1); exit 1; }; } + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + { { $as_echo "$as_me:$LINENO: error: newly created file is older than distributed files! +Check your system clock" >&5 +$as_echo "$as_me: error: newly created file is older than distributed files! +Check your system clock" >&2;} + { (exit 1); exit 1; }; } +fi +{ $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# 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` + +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { $as_echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +{ $as_echo "$as_me:$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 test "${ac_cv_path_mkdir+set}" = set; 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 + { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$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 + + 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. + test -d ./--version && rmdir ./--version + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:$LINENO: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac + +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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AWK+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:$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:$LINENO: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:$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 { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; 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:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:$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 + +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_echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 +$as_echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} + { (exit 1); exit 1; }; } + 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='pwl' + VERSION='0.7' + + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"} + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_STRIP+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:$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:$LINENO: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:$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:$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" + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. + +AMTAR=${AMTAR-"${am_missing_run}tar"} + +am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' + + + + + + + +# Generate a configuration header file. +ac_config_headers="$ac_config_headers config.h" + + +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 abd 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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:$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:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:$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:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:$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:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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:$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:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:$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:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:$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:$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:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } + +# Provide some information about the compiler. +$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.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:$LINENO: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; 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 + +{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +if test -z "$ac_file"; then + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } +fi + +ac_exeext=$ac_cv_exeext + +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } + fi + fi +fi +{ $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +{ $as_echo "$as_me:$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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + +rm -f conftest$ac_cv_exeext +{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if test "${ac_cv_objext+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; 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:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:$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 test "${ac_cv_c_compiler_gnu+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + 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:$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:$LINENO: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +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:$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:$LINENO: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* 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" + 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_c89=$ac_arg +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +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:$LINENO: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:$LINENO: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +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 +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:$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 +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi + + +{ $as_echo "$as_me:$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='\' +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:$LINENO: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; 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'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:$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:$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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifndef __INTEL_COMPILER +choke me +#endif + +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + ICC=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { $as_echo "$as_me:$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 + +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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CXX+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:$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:$LINENO: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:$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:$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:$LINENO: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +{ $as_echo "$as_me:$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 test "${ac_cv_cxx_compiler_gnu+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + 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:$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:$LINENO: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if test "${ac_cv_prog_cxx_g+set}" = set; 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cxx_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CXXFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cxx_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +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:$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:$LINENO: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; 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'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:$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:$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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifndef __INTEL_COMPILER +choke me +#endif + +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + ICPC=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { $as_echo "$as_me:$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 + +{ $as_echo "$as_me:$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 test "${ac_cv_path_SED+set}" = set; 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 + $as_unset ac_script || 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" + { test -f "$ac_path_SED" && $as_test_x "$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 + ac_count=`expr $ac_count + 1` + 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_echo "$as_me:$LINENO: error: no acceptable sed could be found in \$PATH" >&5 +$as_echo "$as_me: error: no acceptable sed could be found in \$PATH" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:$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:$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 test "${ac_cv_prog_CXXCPP+set}" = set; 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 to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:$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 to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +{ $as_echo "$as_me:$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 { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; 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:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; 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 { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$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:$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' + + +# Compilation flags. + +COMP_FLAGS="" +OPT_FLAGS="" + +# Determine the system-dependent aspects of rpath usage and add +# the --disable-rpath configure option. + +# 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 + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:$LINENO: checking for ld used by GCC" >&5 +$as_echo_n "checking for ld used by GCC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:$LINENO: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if test "${acl_cv_path_LD+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break ;; + *) + test "$with_gnu_ld" != yes && break ;; + esac + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$acl_cv_path_LD" +if test -n "$LD"; then + { $as_echo "$as_me:$LINENO: result: $LD" >&5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && { { $as_echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +$as_echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +{ $as_echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if test "${acl_cv_prog_gnu_ld+set}" = set; then + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$acl_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$acl_cv_prog_gnu_ld + + + + + { $as_echo "$as_me:$LINENO: checking for shared library run path origin" >&5 +$as_echo_n "checking for shared library run path origin... " >&6; } +if test "${acl_cv_rpath+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + +fi +{ $as_echo "$as_me:$LINENO: result: $acl_cv_rpath" >&5 +$as_echo "$acl_cv_rpath" >&6; } + wl="$acl_cv_wl" + libext="$acl_cv_libext" + shlibext="$acl_cv_shlibext" + hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + hardcode_direct="$acl_cv_hardcode_direct" + hardcode_minus_L="$acl_cv_hardcode_minus_L" + # Check whether --enable-rpath was given. +if test "${enable_rpath+set}" = set; then + enableval=$enable_rpath; : +else + enable_rpath=yes +fi + + + +enableval=yes +{ $as_echo "$as_me:$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:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + OPT_FLAGS="-g" + ;; +no) + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ;; +*) + { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-debugging, needs yes or no" >&5 +$as_echo "$as_me: error: bad value ${enableval} for --enable-debugging, needs yes or no" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +enableval=no +{ $as_echo "$as_me:$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:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + OPT_FLAGS="-g" + COMP_FLAGS="$COMP_FLAGS -pg -DPWL_PROFILING=1" + ;; +no) + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ;; +*) + { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-profiling, needs yes or no" >&5 +$as_echo "$as_me: error: bad value ${enableval} for --enable-profiling, needs yes or no" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +enableval=no +{ $as_echo "$as_me:$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:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + OPT_FLAGS="-g" + COMP_FLAGS="$COMP_FLAGS -fprofile-arcs -ftest-coverage" + ;; +no) + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ;; +*) + { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-coverage, needs yes or no" >&5 +$as_echo "$as_me: error: bad value ${enableval} for --enable-coverage, needs yes or no" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +enableval=no +{ $as_echo "$as_me:$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:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + ;; +no) + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + +cat >>confdefs.h <<\_ACEOF +#define NDEBUG 1 +_ACEOF + + debug_flag="-DNDEBUG=1" + ;; +*) + { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} --enable-assertions, needs yes or no" >&5 +$as_echo "$as_me: error: bad value ${enableval} --enable-assertions, needs yes or no" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +arch=no +enableval=standard +{ $as_echo "$as_me:$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:$LINENO: result: sspeed" >&5 +$as_echo "sspeed" >&6; } + OPT_FLAGS="$OPT_FLAGS -O3 -fomit-frame-pointer" + arch=yes + ;; +speed) + { $as_echo "$as_me:$LINENO: result: speed" >&5 +$as_echo "speed" >&6; } + OPT_FLAGS="$OPT_FLAGS -O3" + arch=yes + ;; +size) + { $as_echo "$as_me:$LINENO: result: size" >&5 +$as_echo "size" >&6; } + OPT_FLAGS="$OPT_FLAGS -Os" + arch=yes + ;; +standard | yes) + { $as_echo "$as_me:$LINENO: result: standard" >&5 +$as_echo "standard" >&6; } + OPT_FLAGS="$OPT_FLAGS -O2" + ;; +mild) + { $as_echo "$as_me:$LINENO: result: mild" >&5 +$as_echo "mild" >&6; } + OPT_FLAGS="$OPT_FLAGS -O1" + ;; +zero) + { $as_echo "$as_me:$LINENO: result: zero" >&5 +$as_echo "zero" >&6; } + OPT_FLAGS="$OPT_FLAGS -O0" + ;; +no) + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ;; +*) + { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-optimization, needs sspeed, speed, size, standard, mild, zero, yes or no" >&5 +$as_echo "$as_me: error: bad value ${enableval} for --enable-optimization, needs sspeed, speed, size, standard, mild, zero, yes or no" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +enableval=$arch +{ $as_echo "$as_me:$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:$LINENO: result: $m" >&5 +$as_echo "$m" >&6; } + OPT_FLAGS="$OPT_FLAGS -march=$m" + ;; + *) + { $as_echo "$as_me:$LINENO: result: default" >&5 +$as_echo "default" >&6; } + ;; + esac + ;; +no) + { $as_echo "$as_me:$LINENO: result: default" >&5 +$as_echo "default" >&6; } + ;; +*) + { $as_echo "$as_me:$LINENO: result: $enableval" >&5 +$as_echo "$enableval" >&6; } + OPT_FLAGS="$OPT_FLAGS -march=$enableval" + ;; +esac + +CFLAGS="$COMP_FLAGS $OPT_FLAGS $CFLAGS" +CXXFLAGS="$COMP_FLAGS $OPT_FLAGS $CXXFLAGS" + +# System-dependent adjustments. +no_undefined=no + +case "${host_os}" in +cygwin) + no_undefined=yes + ;; +*) + ;; +esac + if test x$no_undefined = xyes; then + NO_UNDEFINED_TRUE= + NO_UNDEFINED_FALSE='#' +else + NO_UNDEFINED_TRUE='#' + NO_UNDEFINED_FALSE= +fi + + + +# Allow additions to C and C++ compilation flags. + + +# Check whether --with-cflags was given. +if test "${with_cflags+set}" = set; then + withval=$with_cflags; CFLAGS="$CFLAGS $with_cflags" +fi + + + +# Check whether --with-cxxflags was given. +if test "${with_cxxflags+set}" = set; then + withval=$with_cxxflags; CXXFLAGS="$CXXFLAGS $with_cxxflags" +fi + + +# 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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_PERL+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:$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:$LINENO: result: $PERL" >&5 +$as_echo "$PERL" >&6; } +else + { $as_echo "$as_me:$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 + + +# Checks for C typedefs, structures, and compiler 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:$LINENO: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if test "${ac_cv_c_const+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset cs; + /* 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. */ + char *t; + 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 saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_c_const=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_c_const=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +cat >>confdefs.h <<\_ACEOF +#define const /**/ +_ACEOF + +fi + + +enableval=no +{ $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_VALGRIND+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_VALGRIND="valgrind" + $as_echo "$as_me:$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:$LINENO: result: $VALGRIND" >&5 +$as_echo "$VALGRIND" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test x"$VALGRIND" = xvalgrind + then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + enable_valgrind_tests=yes + else + { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-valgrind-tests, cannot find Valgrind" >&5 +$as_echo "$as_me: error: bad value ${enableval} for --enable-valgrind-tests, cannot find Valgrind" >&2;} + { (exit 1); exit 1; }; } + fi + ;; +no) + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + enable_valgrind_tests=no + ;; +*) + { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-valgrind-tests, needs yes or no" >&5 +$as_echo "$as_me: error: bad value ${enableval} for --enable-valgrind-tests, needs yes or no" >&2;} + { (exit 1); exit 1; }; } + ;; +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 + + +# setitimer() is a strong requisite for the PWL. + +for ac_func in setitimer +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + have_setitimer=yes +else + have_setitimer=no +fi +done + + +enableval=default +{ $as_echo "$as_me:$LINENO: checking whether to build the Parma Watchdog Library" >&5 +$as_echo_n "checking whether to build the Parma Watchdog Library... " >&6; } +# Check whether --enable-watchdog was given. +if test "${enable_watchdog+set}" = set; then + enableval=$enable_watchdog; +fi + +case "${enableval}" in +yes) + if test x"$have_setitimer" = xyes + then + build_watchdog_library=yes + else + { { $as_echo "$as_me:$LINENO: error: CANNOT BUILD THE WATCHDOG LIBRARY +*** THE SYSTEM DOES NOT PROVIDE THE SETITIMER FUNCTION." >&5 +$as_echo "$as_me: error: CANNOT BUILD THE WATCHDOG LIBRARY +*** THE SYSTEM DOES NOT PROVIDE THE SETITIMER FUNCTION." >&2;} + { (exit 1); exit 1; }; } + fi + ;; +default) + build_watchdog_library=$have_setitimer + ;; +no) + build_watchdog_library=no + ;; +*) + { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-watchdog, needs yes or no" >&5 +$as_echo "$as_me: error: bad value ${enableval} for --enable-watchdog, needs yes or no" >&2;} + { (exit 1); exit 1; }; } + ;; +esac +{ $as_echo "$as_me:$LINENO: result: $build_watchdog_library" >&5 +$as_echo "$build_watchdog_library" >&6; } + if test x"$build_watchdog_library" = xyes; then + BUILD_WATCHDOG_LIBRARY_TRUE= + BUILD_WATCHDOG_LIBRARY_FALSE='#' +else + BUILD_WATCHDOG_LIBRARY_TRUE='#' + BUILD_WATCHDOG_LIBRARY_FALSE= +fi + + +if test x"$build_watchdog_library" = xyes +then + # Checks for header files. + { $as_echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5 +$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } +if test "${ac_cv_header_time+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include + +int +main () +{ +if ((struct tm *) 0) +return 0; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_header_time=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_time=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5 +$as_echo "$ac_cv_header_time" >&6; } +if test $ac_cv_header_time = yes; then + +cat >>confdefs.h <<\_ACEOF +#define TIME_WITH_SYS_TIME 1 +_ACEOF + +fi + + 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:$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 test "${ac_cv_prog_CPP+set}" = set; 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 to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:$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 to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:$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 test "${ac_cv_path_GREP+set}" = set; 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" + { test -f "$ac_path_GREP" && $as_test_x "$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 + ac_count=`expr $ac_count + 1` + 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_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:$LINENO: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if test "${ac_cv_path_EGREP+set}" = set; 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" + { test -f "$ac_path_EGREP" && $as_test_x "$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 + ac_count=`expr $ac_count + 1` + 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_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_header_stdc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#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 +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +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 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + eval "$as_ac_Header=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + +for ac_header in fenv.h sys/time.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$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:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ---------------------------------- ## +## Report this to bagnara@cs.unipr.it ## +## ---------------------------------- ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = 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++. + { $as_echo "$as_me:$LINENO: checking whether getenv is declared" >&5 +$as_echo_n "checking whether getenv is declared... " >&6; } +if test "${ac_cv_have_decl_getenv+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef getenv + (void) getenv; +#endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_getenv=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_getenv=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_getenv" >&5 +$as_echo "$ac_cv_have_decl_getenv" >&6; } +if test "x$ac_cv_have_decl_getenv" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETENV 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETENV 0 +_ACEOF + + +fi + + + + # Checks for typedefs, structures, and compiler characteristics. + { $as_echo "$as_me:$LINENO: checking for siginfo_t" >&5 +$as_echo_n "checking for siginfo_t... " >&6; } +if test "${ac_cv_type_siginfo_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_type_siginfo_t=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include + + +int +main () +{ +if (sizeof (siginfo_t)) + return 0; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include + + +int +main () +{ +if (sizeof ((siginfo_t))) + return 0; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_siginfo_t=yes +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_siginfo_t" >&5 +$as_echo "$ac_cv_type_siginfo_t" >&6; } +if test "x$ac_cv_type_siginfo_t" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_SIGINFO_T 1 +_ACEOF + + +fi + +fi + +# Libtool. +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:$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.2.6' +macro_revision='1.3012' + + + + + + + + + + + + + +ltmain="$ac_aux_dir/ltmain.sh" + +{ $as_echo "$as_me:$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 test "${ac_cv_path_SED+set}" = set; 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 + $as_unset ac_script || 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" + { test -f "$ac_path_SED" && $as_test_x "$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 + ac_count=`expr $ac_count + 1` + 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_echo "$as_me:$LINENO: error: no acceptable sed could be found in \$PATH" >&5 +$as_echo "$as_me: error: no acceptable sed could be found in \$PATH" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:$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//" + + + + + + + + + + + +{ $as_echo "$as_me:$LINENO: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if test "${ac_cv_path_FGREP+set}" = set; 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" + { test -f "$ac_path_FGREP" && $as_test_x "$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 + ac_count=`expr $ac_count + 1` + 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_echo "$as_me:$LINENO: error: no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +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:$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:$LINENO: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if test "${lt_cv_path_LD+set}" = set; 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 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && { { $as_echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +$as_echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +{ $as_echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if test "${lt_cv_prog_gnu_ld+set}" = set; 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 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:$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 test "${lt_cv_path_NM+set}" = set; 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:$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 "$ac_tool_prefix"; then + for ac_prog in "dumpbin -symbols" "link -dump -symbols" + 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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_DUMPBIN+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:$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:$LINENO: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:$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 -symbols" "link -dump -symbols" +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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:$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:$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 + + + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:$LINENO: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if test "${lt_cv_nm_interface+set}" = set; 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:7131: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:7134: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:7137: 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:$LINENO: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +{ $as_echo "$as_me:$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:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if test "${lt_cv_sys_max_cmd_len+set}" = set; 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; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + 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"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ + = "XX$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:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:$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:$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"}, \ + = c,a/b,, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +{ $as_echo "$as_me:$LINENO: result: $xsi_shell" >&5 +$as_echo "$xsi_shell" >&6; } + + +{ $as_echo "$as_me:$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:$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:$LINENO: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if test "${lt_cv_ld_reload_flag+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:$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 + 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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_OBJDUMP+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:$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:$LINENO: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:$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:$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:$LINENO: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if test "${lt_cv_deplibs_check_method+set}" = set; 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. + if ( 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 + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + 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 + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +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 Linux ELF. +linux* | k*bsd*-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:$LINENO: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AR+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + $as_echo "$as_me:$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:$LINENO: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_AR+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_AR="ar" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$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 +else + AR="$ac_cv_prog_AR" +fi + +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru + + + + + + + + + + + +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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_STRIP+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:$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:$LINENO: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:$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:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_RANLIB+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:$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:$LINENO: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:$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:$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 \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# 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:$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 test "${lt_cv_sys_global_symbol_pipe+set}" = set; 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};"\ +" /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 + + # 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:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 + (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +#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. */ +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_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -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:$LINENO: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:$LINENO: result: ok" >&5 +$as_echo "ok" >&6; } +fi + + + + + + + + + + + + + + + + + + + + + + +# 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:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line 8342 "configure"' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*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:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*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:$LINENO: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if test "${lt_cv_cc_needs_belf+set}" = set; 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + lt_cv_cc_needs_belf=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + lt_cv_cc_needs_belf=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + 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:$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 + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + 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" + + + 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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_DSYMUTIL+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:$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:$LINENO: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:$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:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_NMEDIT+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:$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:$LINENO: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:$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:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_LIPO+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:$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:$LINENO: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:$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:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_OTOOL+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:$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:$LINENO: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:$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:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_OTOOL64+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:$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:$LINENO: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:$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:$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:$LINENO: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if test "${lt_cv_apple_cc_single_mod+set}" = set; 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 test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 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:$LINENO: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + { $as_echo "$as_me:$LINENO: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if test "${lt_cv_ld_exported_symbols_list+set}" = set; 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + lt_cv_ld_exported_symbols_list=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + lt_cv_ld_exported_symbols_list=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&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" != ":"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + + +for ac_header in dlfcn.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + eval "$as_ac_Header=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + +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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CXX+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:$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:$LINENO: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:$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:$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:$LINENO: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +{ $as_echo "$as_me:$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 test "${ac_cv_cxx_compiler_gnu+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + 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:$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:$LINENO: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if test "${ac_cv_prog_cxx_g+set}" = set; 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cxx_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CXXFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cxx_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +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:$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:$LINENO: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; 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'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:$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 + + +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:$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 test "${ac_cv_prog_CXXCPP+set}" = set; 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 to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:$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 to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +_lt_caught_CXX_error=yes; } +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 + +else + _lt_caught_CXX_error=yes +fi + + + + +# 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; pic_mode="$withval" +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:$LINENO: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if test "${lt_cv_objdir+set}" = set; 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:$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 + +# Sed substitution that helps us do robust quoting. It backslashifies +# 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' + +# 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 "X$cc_temp" | $Xsed -e 's%.*/%%' -e "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:$LINENO: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if test "${lt_cv_path_MAGIC_CMD+set}" = set; 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@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:$LINENO: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if test "${lt_cv_path_MAGIC_CMD+set}" = set; 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@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:$LINENO: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:$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 + lt_prog_compiler_no_builtin_flag=' -fno-builtin' + + { $as_echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; 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:10428: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:10432: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:$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= + +{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + amigaos*) + 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' + ;; + + 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 + 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) + 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' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl*) + # IBM XL C 8.0/Fortran 10.1 on PPC + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Sun\ F*) + # 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='' + ;; + 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*) + 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:$LINENO: result: $lt_prog_compiler_pic" >&5 +$as_echo "$lt_prog_compiler_pic" >&6; } + + + + + + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:$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 test "${lt_cv_prog_compiler_pic_works+set}" = set; 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:10767: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:10771: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:$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:$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 test "${lt_cv_prog_compiler_static_works+set}" = set; 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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_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:$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:$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 test "${lt_cv_prog_compiler_c_o+set}" = set; 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:10872: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:10876: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:$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 test "${lt_cv_prog_compiler_c_o+set}" = set; 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:10927: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:10931: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:$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:$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:$LINENO: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:$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:$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_flag_spec_ld= + 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 + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + 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.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +_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 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' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + 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) + 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= + 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; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + xl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + 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; $ECHO \"$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*) + # 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= + hardcode_libdir_flag_spec_ld='-rpath $libdir' + archive_cmds='$LD -shared $libobjs $deplibs $compiler_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 $compiler_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 $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_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 $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # 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 $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = no; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + 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 + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|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. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +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 "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +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 "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + 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. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes=yes + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + whole_archive_flag_spec='' + 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=echo + 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 + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld='+b $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 -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_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 $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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. + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + cat >conftest.$ac_ext <<_ACEOF +int foo(void) {} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -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" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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" && $ECHO "X-set_version $verstring" | $Xsed` -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} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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" && $ECHO "X-set_version $verstring" | $Xsed` -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 "X-set_version $verstring" | $Xsed` -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 ${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 ${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:$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:$LINENO: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc=no + else + archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 +$as_echo "$archive_cmds_need_lc" >&6; } + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:$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 + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` + else + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # 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; } +}'` + sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` +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 + 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 + 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.so + # instead of lib.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=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) + 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="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${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 + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[3-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + 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 + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then + shlibpath_overrides_runpath=yes +fi + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + + # 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;/^$/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 + 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 + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + 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 + 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 + 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:$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:$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:$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:$LINENO: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any 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 +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_dl_dlopen=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dl_dlopen=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + { $as_echo "$as_me:$LINENO: checking for shl_load" >&5 +$as_echo_n "checking for shl_load... " >&6; } +if test "${ac_cv_func_shl_load+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define shl_load to an innocuous variant, in case declares shl_load. + For example, HP-UX 11i declares gettimeofday. */ +#define shl_load innocuous_shl_load + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shl_load (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef shl_load + +/* 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 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_shl_load || defined __stub___shl_load +choke me +#endif + +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_func_shl_load=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_shl_load=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 +$as_echo "$ac_cv_func_shl_load" >&6; } +if test "x$ac_cv_func_shl_load" = x""yes; then + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if test "${ac_cv_lib_dld_shl_load+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any 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 +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_dld_shl_load=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dld_shl_load=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$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" = x""yes; then + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + { $as_echo "$as_me:$LINENO: checking for dlopen" >&5 +$as_echo_n "checking for dlopen... " >&6; } +if test "${ac_cv_func_dlopen+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define dlopen to an innocuous variant, in case declares dlopen. + For example, HP-UX 11i declares gettimeofday. */ +#define dlopen innocuous_dlopen + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char dlopen (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef dlopen + +/* 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 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_dlopen || defined __stub___dlopen +choke me +#endif + +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_func_dlopen=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_dlopen=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 +$as_echo "$ac_cv_func_dlopen" >&6; } +if test "x$ac_cv_func_dlopen" = x""yes; then + lt_cv_dlopen="dlopen" +else + { $as_echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any 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 +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_dl_dlopen=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dl_dlopen=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { $as_echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if test "${ac_cv_lib_svld_dlopen+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any 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 +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_svld_dlopen=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_svld_dlopen=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = x""yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { $as_echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if test "${ac_cv_lib_dld_dld_link+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any 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 +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_dld_dld_link=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dld_dld_link=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$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" = x""yes; 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:$LINENO: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if test "${lt_cv_dlopen_self+set}" = set; 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 13727 "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#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 + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:$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:$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 test "${lt_cv_dlopen_self_static+set}" = set; 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 13823 "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#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 + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:$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:$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:$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:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report which library types will actually be built + { $as_echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:$LINENO: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:$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:$LINENO: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:$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:$LINENO: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +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 + +CC="$lt_save_CC" + + +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_flag_spec_ld_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 +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_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + compiler=$CC + compiler_CXX=$CC + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + + 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:$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:$LINENO: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if test "${lt_cv_path_LD+set}" = set; 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 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && { { $as_echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +$as_echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +{ $as_echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if test "${lt_cv_prog_gnu_ld+set}" = set; 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 &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 -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { $as_echo "$as_me:$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. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +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 "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +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 "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + archive_cmds_need_lc_CXX=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach 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*) + # _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' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + whole_archive_flag_spec_CXX='' + link_all_deplibs_CXX=yes + 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=echo + 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 + ;; + + freebsd[12]*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + ld_shlibs_CXX=no + ;; + + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + gnu*) + ;; + + hpux9*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + 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; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + 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" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -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) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + + 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 | $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 | $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 | $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 | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 will 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; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + xl*) + # 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; $ECHO \"$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='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + 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=echo + 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" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -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" && $ECHO "X-set_version $verstring" | $Xsed` -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 "X-set_version $verstring" | $Xsed` -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=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + 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" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${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 "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The 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='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + no_undefined_flag_CXX=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + fi + + hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + 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' + ;; + *) + 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:$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 + +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p in + -L* | -R*) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX="${prev}${p}" + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX="${prev}${p}" + else + postdeps_CXX="${postdeps_CXX} ${prev}${p}" + fi + fi + ;; + + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX="$p" + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX="$p" + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$RM -f confest.$objext + +# PORTME: override above test on systems where it is broken +case $host_os in +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*) + # 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= + +{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + ;; + + amigaos*) + 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= + ;; + 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 + ;; + 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) + 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*) + # IBM XL 8.0 on PPC + 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*) + # 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:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 +$as_echo "$lt_prog_compiler_pic_CXX" >&6; } + + + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { $as_echo "$as_me:$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 test "${lt_cv_prog_compiler_pic_works_CXX+set}" = set; 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:15843: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:15847: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:$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:$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 test "${lt_cv_prog_compiler_static_works_CXX+set}" = set; 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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_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:$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:$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 test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; 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:15942: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:15946: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + { $as_echo "$as_me:$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 test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; 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:15994: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:15998: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:$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:$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:$LINENO: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:$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:$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' + 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 + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + +{ $as_echo "$as_me:$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:$LINENO: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_CXX=no + else + archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 +$as_echo "$archive_cmds_need_lc_CXX" >&6; } + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:$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 + 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 + 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.so + # instead of lib.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=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) + 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="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${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 + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[3-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + 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 + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then + shlibpath_overrides_runpath=yes +fi + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + + # 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;/^$/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 + 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 + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + 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 + 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 + 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:$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:$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:$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 + 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=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_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + +# 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_config_files="$ac_config_files Makefile src/Makefile m4/Makefile doc/Makefile doc/user.doxyconf-latex doc/devref.doxyconf-latex doc/user.doxyconf-html doc/devref.doxyconf-html tests/Makefile utils/Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, 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:$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= ;; #( + *) $as_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 + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:$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= +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. + ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${GCC_TRUE}" && test -z "${GCC_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"GCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"GCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${NO_UNDEFINED_TRUE}" && test -z "${NO_UNDEFINED_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"NO_UNDEFINED\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"NO_UNDEFINED\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${HAVE_PERL_TRUE}" && test -z "${HAVE_PERL_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"HAVE_PERL\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"HAVE_PERL\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${VALGRIND_TESTS_ENABLED_TRUE}" && test -z "${VALGRIND_TESTS_ENABLED_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"VALGRIND_TESTS_ENABLED\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"VALGRIND_TESTS_ENABLED\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${BUILD_WATCHDOG_LIBRARY_TRUE}" && test -z "${BUILD_WATCHDOG_LIBRARY_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_WATCHDOG_LIBRARY\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"BUILD_WATCHDOG_LIBRARY\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi + +: ${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:$LINENO: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF || ac_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} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_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 + + + + +# PATH needs CR +# 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_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 +if (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 + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +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. +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); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# Required to use basename. +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 + + +# Name of the executable. +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'` + +# CDPATH. +$as_unset CDPATH + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. 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 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +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 -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +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=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# 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 + +# 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 Watchdog Library $as_me 0.7, which was +generated by GNU Autoconf 2.63. 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 from templates according to the +current configuration. + +Usage: $0 [OPTION]... [FILE]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, 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 ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_version="\\ +the Parma Watchdog Library config.status 0.7 +configured by $0, generated by GNU Autoconf 2.63, + with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2008 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=$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 ;; + --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"` ;; + esac + CONFIG_FILES="$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 + CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + { $as_echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; };; + --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_echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" + 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 "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`' +macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`' +enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`' +enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`' +pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`' +host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`' +host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`' +host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`' +build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`' +build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`' +build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`' +SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`' +Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`' +GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`' +EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`' +FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`' +LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`' +NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`' +LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`' +ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`' +exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`' +lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`' +reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`' +AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`' +STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`' +RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' +CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`' +compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`' +GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' +objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`' +SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`' +ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`' +need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`' +LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`' +OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`' +libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' +module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`' +fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' +need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`' +version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`' +runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`' +libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`' +soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`' +finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`' +sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`' +old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`' +striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "X$compiler_lib_search_dirs" | $Xsed -e "$delay_single_quote_subst"`' +predep_objects='`$ECHO "X$predep_objects" | $Xsed -e "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "X$postdep_objects" | $Xsed -e "$delay_single_quote_subst"`' +predeps='`$ECHO "X$predeps" | $Xsed -e "$delay_single_quote_subst"`' +postdeps='`$ECHO "X$postdeps" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "X$compiler_lib_search_path" | $Xsed -e "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "X$LD_CXX" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "X$old_archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "X$compiler_CXX" | $Xsed -e "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "X$GCC_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "X$lt_prog_compiler_no_builtin_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "X$lt_prog_compiler_wl_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "X$lt_prog_compiler_pic_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "X$lt_prog_compiler_static_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "X$lt_cv_prog_compiler_c_o_CXX" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "X$archive_cmds_need_lc_CXX" | $Xsed -e "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "X$enable_shared_with_static_runtimes_CXX" | $Xsed -e "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "X$export_dynamic_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "X$whole_archive_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "X$compiler_needs_object_CXX" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "X$old_archive_from_new_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "X$old_archive_from_expsyms_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "X$archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "X$archive_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "X$module_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "X$module_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "X$with_gnu_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "X$allow_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "X$no_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "X$hardcode_libdir_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_ld_CXX='`$ECHO "X$hardcode_libdir_flag_spec_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "X$hardcode_libdir_separator_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "X$hardcode_direct_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "X$hardcode_direct_absolute_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "X$hardcode_minus_L_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "X$hardcode_shlibpath_var_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "X$hardcode_automatic_CXX" | $Xsed -e "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "X$inherit_rpath_CXX" | $Xsed -e "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "X$link_all_deplibs_CXX" | $Xsed -e "$delay_single_quote_subst"`' +fix_srcfile_path_CXX='`$ECHO "X$fix_srcfile_path_CXX" | $Xsed -e "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "X$always_export_symbols_CXX" | $Xsed -e "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "X$export_symbols_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "X$exclude_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "X$include_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "X$prelink_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "X$file_list_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "X$hardcode_action_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "X$compiler_lib_search_dirs_CXX" | $Xsed -e "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "X$predep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "X$postdep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "X$predeps_CXX" | $Xsed -e "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "X$postdeps_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "X$compiler_lib_search_path_CXX" | $Xsed -e "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# Quote evaled strings. +for var in SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +OBJDUMP \ +deplibs_check_method \ +file_magic_cmd \ +AR \ +AR_FLAGS \ +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 \ +SHELL \ +ECHO \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_wl \ +lt_prog_compiler_pic \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +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_flag_spec_ld \ +hardcode_libdir_separator \ +fix_srcfile_path \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +finish_eval \ +old_striplib \ +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_CXX \ +compiler_CXX \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_pic_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_flag_spec_ld_CXX \ +hardcode_libdir_separator_CXX \ +fix_srcfile_path_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 "X\\\\\$\$var"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$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 \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +sys_lib_dlsearch_path_spec \ +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; do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Fix-up fallback echo if it was mangled by the above quoting rules. +case \$lt_ECHO in +*'\\\$0 --fallback-echo"') lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\` + ;; +esac + +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" ;; + "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; + "m4/Makefile") CONFIG_FILES="$CONFIG_FILES m4/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" ;; + "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; + "utils/Makefile") CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;; + + *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason 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= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || +{ + $as_echo "$as_me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +# 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=' ' +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /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 {' >"$tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } +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_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + + 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_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + 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 >>"\$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 +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$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 < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 +$as_echo "$as_me: error: could not setup config files machinery" >&2;} + { (exit 1); exit 1; }; } +_ACEOF + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +}' +fi + +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 >"$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_t=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_t"; then + break + elif $ac_last_try; then + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;} + { (exit 1); exit 1; }; } + 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 +' >$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_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 +$as_echo "$as_me: error: could not setup config headers machinery" >&2;} + { (exit 1); exit 1; }; } +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_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 +$as_echo "$as_me: error: invalid tag $ac_tag" >&2;} + { (exit 1); exit 1; }; };; + :[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="$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_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + ac_file_inputs="$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:$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 >"$tmp/stdin" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } ;; + 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" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + 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_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + 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:$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 "$tmp/subs.awk" >$tmp/out \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:$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 "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 +$as_echo "$as_me: error: could not create -" >&2;} + { (exit 1); exit 1; }; } + 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:$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"" || for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # 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"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_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 + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + 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_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + # 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 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 + +# 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 + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# 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 + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# 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 + +# 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 + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that does not interpret backslashes. +ECHO=$lt_ECHO + +# 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 + +# 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 + +# 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 + +# 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 + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# 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 + +# If ld is used when linking, flag to hardcode \$libdir into a binary +# during linking. This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using 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 + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# 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 + +# 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 '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + case $xsi_shell in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# 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 () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac +} + +# func_basename file +func_basename () +{ + func_basename_result="${1##*/}" +} + +# 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 () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}" +} + +# 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_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}"} +} + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=${1%%=*} + func_opt_split_arg=${1#*=} +} + +# func_lo2o object +func_lo2o () +{ + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=${1%.*}.lo +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=$(( $* )) +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=${#1} +} + +_LT_EOF + ;; + *) # Bourne compatible functions. + cat << \_LT_EOF >> "$cfgfile" + +# 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 () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "X${1}" | $Xsed -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 file +func_basename () +{ + func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +} + + +# 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 "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; + esac +} + +# sed scripts: +my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q' +my_sed_long_arg='1s/^-[^=]*=//' + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` + func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` +} + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'` +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "$@"` +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` +} + +_LT_EOF +esac + +case $lt_shell_append in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$1+=\$2" +} +_LT_EOF + ;; + *) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$1=\$$1\$2" +} + +_LT_EOF + ;; + esac + + + sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + 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 + +# 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 + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_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 + +# If ld is used when linking, flag to hardcode \$libdir into a binary +# during linking. This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to "yes" if using 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 + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# 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 + +# 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 + + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/Watchdog/configure.ac b/Watchdog/configure.ac new file mode 100644 index 0000000..42fb136 --- /dev/null +++ b/Watchdog/configure.ac @@ -0,0 +1,417 @@ +# Autoconf source file for the Parma Watchdog Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Watchdog Library (PWL). +# +# The PWL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PWL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . */ + +# Process this file with Autoconf to produce a configure script. + +# Every other copy of the package version number gets its value from here. +AC_INIT([the Parma Watchdog Library],[0.7],[bagnara@cs.unipr.it],[pwl]) + +# Minimum Autoconf version required. +AC_PREREQ(2.61) + +# Make sure the sources are there. +AC_CONFIG_SRCDIR(src/Watchdog.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 1.7.3]) +AC_SUBST(VERSION) + +# Generate a configuration header file. +AC_CONFIG_HEADER([config.h]) + +ISODATE=`date +%Y-%m-%d` +AC_SUBST(ISODATE) + +AH_BOTTOM([ +#ifdef PWL_NDEBUG +# define NDEBUG PWL_NDEBUG +#endif +]) + +# 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 abd 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 + +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 + +AC_PROG_SED +AC_PROG_CXXCPP +AC_PROG_MAKE_SET +AC_PROG_INSTALL + +# Compilation flags. + +COMP_FLAGS="" +OPT_FLAGS="" + +# Determine the system-dependent aspects of rpath usage and add +# the --disable-rpath configure option. +AC_LIB_RPATH + +enableval=yes +AC_MSG_CHECKING([whether to compile with debug info]) +AC_ARG_ENABLE(debugging, +[ --enable-debugging compile with debugging information]) +case "${enableval}" in +yes) + AC_MSG_RESULT(yes) + OPT_FLAGS="-g" + ;; +no) + AC_MSG_RESULT(no) + ;; +*) + AC_MSG_ERROR([bad value ${enableval} for --enable-debugging, needs yes or no]) + ;; +esac + +enableval=no +AC_MSG_CHECKING([whether to compile for profiling]) +AC_ARG_ENABLE(profiling, +[ --enable-profiling compile for profiling]) +case "${enableval}" in +yes) + AC_MSG_RESULT(yes) + OPT_FLAGS="-g" + COMP_FLAGS="$COMP_FLAGS -pg -DPWL_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, +[ --enable-coverage compile for test coverage]) +case "${enableval}" in +yes) + AC_MSG_RESULT(yes) + OPT_FLAGS="-g" + COMP_FLAGS="$COMP_FLAGS -fprofile-arcs -ftest-coverage" + ;; +no) + AC_MSG_RESULT(no) + ;; +*) + AC_MSG_ERROR([bad value ${enableval} for --enable-coverage, needs yes or no]) + ;; +esac + +enableval=no +AC_MSG_CHECKING([whether to enable checking of run-time assertions]) +AC_ARG_ENABLE(assertions, +[ --enable-assertions check run-time assertions]) +case "${enableval}" in +yes) + AC_MSG_RESULT(yes) + ;; +no) + AC_MSG_RESULT(no) + AC_DEFINE(NDEBUG, 1, [Assertions are disabled when this is defined]) + debug_flag="-DNDEBUG=1" + ;; +*) + AC_MSG_ERROR([bad value ${enableval} --enable-assertions, needs yes or no]) + ;; +esac + +arch=no +enableval=standard +AC_MSG_CHECKING([whether to enable optimizations]) +AC_ARG_ENABLE(optimization, +[ --enable-optimization enable compiler optimizations]) +case "${enableval}" in +sspeed) + AC_MSG_RESULT(sspeed) + OPT_FLAGS="$OPT_FLAGS -O3 -fomit-frame-pointer" + arch=yes + ;; +speed) + AC_MSG_RESULT(speed) + OPT_FLAGS="$OPT_FLAGS -O3" + arch=yes + ;; +size) + AC_MSG_RESULT(size) + OPT_FLAGS="$OPT_FLAGS -Os" + arch=yes + ;; +standard | yes) + AC_MSG_RESULT(standard) + OPT_FLAGS="$OPT_FLAGS -O2" + ;; +mild) + AC_MSG_RESULT(mild) + OPT_FLAGS="$OPT_FLAGS -O1" + ;; +zero) + AC_MSG_RESULT(zero) + OPT_FLAGS="$OPT_FLAGS -O0" + ;; +no) + AC_MSG_RESULT(no) + ;; +*) + AC_MSG_ERROR([bad value ${enableval} for --enable-optimization, needs sspeed, speed, size, standard, mild, zero, yes or no]) + ;; +esac + +enableval=$arch +AC_MSG_CHECKING([for which architecture to optimize]) +AC_ARG_ENABLE(arch, +[ --enable-arch[=arch] optimize for architecture arch]) +case "${enableval}" in +yes) + m=`uname -m` + case $m in + i?86 | k6 | athlon) + AC_MSG_RESULT($m) + OPT_FLAGS="$OPT_FLAGS -march=$m" + ;; + *) + AC_MSG_RESULT(default) + ;; + esac + ;; +no) + AC_MSG_RESULT(default) + ;; +*) + AC_MSG_RESULT($enableval) + OPT_FLAGS="$OPT_FLAGS -march=$enableval" + ;; +esac + +CFLAGS="$COMP_FLAGS $OPT_FLAGS $CFLAGS" +CXXFLAGS="$COMP_FLAGS $OPT_FLAGS $CXXFLAGS" + +# System-dependent adjustments. +no_undefined=no + +case "${host_os}" in +cygwin) + no_undefined=yes + ;; +*) + ;; +esac +AM_CONDITIONAL(NO_UNDEFINED, test x$no_undefined = xyes) + + +# Allow additions to C and C++ compilation flags. + +AC_ARG_WITH(cflags, +[ --with-cflags=xxx add XXX to the options for the C compiler], +CFLAGS="$CFLAGS $with_cflags") + +AC_ARG_WITH(cxxflags, +[ --with-cxxflags=xxx add XXX to the options for the C++ compiler], +CXXFLAGS="$CXXFLAGS $with_cxxflags") + +# Check for Perl. +AC_PATH_PROG([PERL], perl, no) +AC_SUBST([PERL]) +AM_CONDITIONAL(HAVE_PERL, test x"$PERL" != xno) + +# Checks for C typedefs, structures, and compiler characteristics. +AC_LANG(C) +AC_C_CONST + +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) + +# setitimer() is a strong requisite for the PWL. +AC_CHECK_FUNCS([setitimer], [have_setitimer=yes], [have_setitimer=no]) + +enableval=default +AC_MSG_CHECKING([whether to build the Parma Watchdog Library]) +AC_ARG_ENABLE(watchdog, + AS_HELP_STRING([--enable-watchdog], + [build also the Parma Watchdog Library])) +case "${enableval}" in +yes) + if test x"$have_setitimer" = xyes + then + build_watchdog_library=yes + else + AC_MSG_ERROR([CANNOT BUILD THE WATCHDOG LIBRARY +*** THE SYSTEM DOES NOT PROVIDE THE SETITIMER FUNCTION.]) + fi + ;; +default) + build_watchdog_library=$have_setitimer + ;; +no) + build_watchdog_library=no + ;; +*) + AC_MSG_ERROR([bad value ${enableval} for --enable-watchdog, needs yes or no]) + ;; +esac +AC_MSG_RESULT($build_watchdog_library) +AM_CONDITIONAL(BUILD_WATCHDOG_LIBRARY, test x"$build_watchdog_library" = xyes) + +if test x"$build_watchdog_library" = xyes +then + # Checks for header files. + AC_HEADER_TIME + AC_CHECK_HEADERS([fenv.h sys/time.h]) + + # Checks for the availability of C library functions in C++. + AC_CHECK_DECLS([getenv], , , [#include ]) + + # Checks for typedefs, structures, and compiler characteristics. + AC_CHECK_TYPES([siginfo_t], [], [], [[ +#include + ]]) +fi + +# Libtool. +LT_INIT([dlopen]) + +# 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(debug_flag) + +AC_CONFIG_FILES(Makefile + src/Makefile + m4/Makefile + doc/Makefile + doc/user.doxyconf-latex + doc/devref.doxyconf-latex + doc/user.doxyconf-html + doc/devref.doxyconf-html + tests/Makefile + utils/Makefile) +AC_OUTPUT diff --git a/Watchdog/depcomp b/Watchdog/depcomp new file mode 100755 index 0000000..e5f9736 --- /dev/null +++ b/Watchdog/depcomp @@ -0,0 +1,589 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2007-03-29.01 + +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007 Free Software +# Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by `PROGRAMS ARGS'. + object Object file output by `PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputing dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## 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 -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the `deleted header file' problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' ' +' < "$tmpdepfile" | +## Some versions of gcc put a space before the `:'. On the theory +## that the space means something, we add a space to the output as +## well. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like `#:fec' to the end of the + # dependency line. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> $depfile + echo >> $depfile + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> $depfile + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts `$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + 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 -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Intel's C compiler understands `-MD -MF file'. However on + # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # ICC 7.0 will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want: + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + # ICC 7.1 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using \ : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | + sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +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. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + 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 -eq 0; then : + else + 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,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" + # Add `dependent.h:' lines. + sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile" + else + echo "#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. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + # With Tru64 cc, shared objects can also be used to make a + # static library. This mechanism is used in libtool 1.4 series to + # handle both shared and static libraries in a single compilation. + # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. + # + # With libtool 1.5 this exception was removed, and libtool now + # generates 2 separate objects for the 2 libraries. These two + # compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 + tmpdepfile2=$dir$base.o.d # libtool 1.5 + tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 + tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.o.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + tmpdepfile4=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for `:' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. + "$@" $dashmflag | + sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +' < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no + for arg in "$@"; do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix="`echo $object | sed 's/^.*\././'`" + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' ' +' | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E | + sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o, + # because we must use -o when running libtool. + "$@" || exit $? + IFS=" " + for arg + do + case "$arg" in + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" + echo " " >> "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/Watchdog/doc/Makefile.am b/Watchdog/doc/Makefile.am new file mode 100644 index 0000000..7357eb0 --- /dev/null +++ b/Watchdog/doc/Makefile.am @@ -0,0 +1,281 @@ +# Automake source file for the Parma Watchdog Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Watchdog Library (PWL). +# +# The PWL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PWL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Watchdog Library +# site: http://www.cs.unipr.it/pwl/ . + +# All the documentation in docdir. +docdir = @docdir@ +htmldir = $(docdir) +pdfdir = $(docdir) +psdir = $(docdir) +txtdir = $(docdir) + +DOXYGEN = doxygen +INSTALLDOX = ./installdox -q + +# Licenses. + +PDF_LICENSES = \ +gpl.pdf \ +fdl.pdf + +PS_LICENSES = \ +gpl.ps.gz \ +fdl.ps.gz + +TXT_LICENSES = \ +gpl.txt \ +fdl.txt + +# Library Core Manuals (C++ interface) + +USER_CORE_HTML_MANUAL = pwl-user-@VERSION@-html.tar.gz +DEVREF_CORE_HTML_MANUAL = pwl-devref-@VERSION@-html.tar.gz + +USER_CORE_PDF_MANUAL = pwl-user-@VERSION@.pdf +DEVREF_CORE_PDF_MANUAL = pwl-devref-@VERSION@.pdf + +USER_CORE_PS_MANUAL = pwl-user-@VERSION@.ps.gz +DEVREF_CORE_PS_MANUAL = pwl-devref-@VERSION@.ps.gz + +USER_CORE_HTML_DIR = pwl-user-@VERSION@-html +DEVREF_CORE_HTML_DIR = pwl-devref-@VERSION@-html + +HTML_DIRS = $(USER_CORE_HTML_DIR) $(DEVREF_CORE_HTML_DIR) + +DOX_FILES = \ +gpl.dox \ +fdl.dox + +USER_CORE_STUFF = \ +$(DOX_FILES) \ +user.tex \ +pwl.sty \ +../src/pwl_header.hh ../src/pwl_include_files.hh + +DEVREF_CORE_STUFF = \ +$(DOX_FILES) \ +devref.tex \ +pwl.sty \ +$(PWL_SOURCE_FILES) + +##### Distributed documentation ##### + +DIST_HTML_DOCS = $(USER_CORE_HTML_MANUAL) + +DIST_PDF_DOCS = \ +$(PDF_LICENSES) \ +$(USER_CORE_PDF_MANUAL) + +DIST_PS_DOCS = \ +$(PS_LICENSES) \ +$(USER_CORE_PS_MANUAL) + +DIST_TXT_DOCS = \ +$(TXT_LICENSES) + +DIST_DOCS = \ +$(DIST_HTML_DOCS) \ +$(DIST_PDF_DOCS) \ +$(DIST_PS_DOCS) \ +$(DIST_TXT_DOCS) + +NONDIST_MANUALS = \ +$(DEVREF_CORE_HTML_MANUAL) \ +$(DEVREF_CORE_PDF_MANUAL) \ +$(DEVREF_CORE_PS_MANUAL) + +##### Build Targets ##### + +# Do nothing by default. +all: + +user-html: $(USER_CORE_HTML_MANUAL) + +user-pdf: $(USER_CORE_PDF_MANUAL) + +user-ps: $(USER_CORE_PS_MANUAL) + +user: user-html user-pdf user-ps + +devref-html: $(DEVREF_CORE_HTML_MANUAL) + +devref-pdf: $(DEVREF_CORE_PDF_MANUAL) + +devref-ps: $(DEVREF_CORE_PS_MANUAL) + +devref: devref-html devref-pdf devref-ps + +world: user devref + +install-data-local: \ +install-html \ +install-pdf \ +install-ps \ +install-txt + +installdirs-local: \ +installdirs-html \ +installdirs-pdf \ +installdirs-ps \ +installdirs-txt + +uninstall-local: \ +uninstall-html \ +uninstall-pdf \ +uninstall-ps \ +uninstall-txt + +# Installation and uninstallation of HTML documentation. +install-html: + for ball in $(DIST_HTML_DOCS); do \ + test -f $$ball || test -f $(srcdir)/$$ball || $(MAKE) $$ball; \ + dir=`basename $$ball .tar.gz`; \ + $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$dir; \ + gunzip -c `if test -f $$ball; then echo .; else echo $(srcdir); fi`/$$ball | tar xf - ; \ + for file in $$dir/*; do \ + $(INSTALL_DATA) $$file $(DESTDIR)$(htmldir)/$$dir/`basename $$file`; \ + done; \ + done + +installdirs-html: + for ball in $(DIST_HTML_DOCS); do \ + dir=`basename $$ball .tar.gz`; \ + $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$dir; \ + done + +uninstall-html: + for ball in $(DIST_HTML_DOCS); do \ + dir=`basename $$ball .tar.gz`; \ + rm -rf $(DESTDIR)$(htmldir)/$$dir; \ + done + +# Installation and uninstallation of PDF documentation. +install-pdf: + $(mkinstalldirs) $(DESTDIR)$(pdfdir) + for file in $(DIST_PDF_DOCS); do \ + test -f $$file || test -f $(srcdir)/$$file || $(MAKE) $$file; \ + $(INSTALL_DATA) `if test -f $$file; then echo .; else echo $(srcdir); fi`/$$file $(DESTDIR)$(pdfdir)/$$file; \ + done + +installdirs-pdf: + $(mkinstalldirs) $(DESTDIR)$(pdfdir) + +uninstall-pdf: + rm -f $(DESTDIR)$(pdfdir)/*.pdf + +# Installation and uninstallation of PostScript documentation. +install-ps: + $(mkinstalldirs) $(DESTDIR)$(psdir) + for file in $(DIST_PS_DOCS); do \ + test -f $$file || test -f $(srcdir)/$$file || $(MAKE) $$file; \ + $(INSTALL_DATA) `if test -f $$file; then echo .; else echo $(srcdir); fi`/$$file $(DESTDIR)$(psdir)/$$file; \ + done + +installdirs-ps: + $(mkinstalldirs) $(DESTDIR)$(psdir) + +uninstall-ps: + rm -f $(DESTDIR)$(psdir)/*.ps.gz + +# Installation and uninstallation of pure text documentation. +install-txt: + $(mkinstalldirs) $(DESTDIR)$(txtdir) + for file in $(srcdir)/*.txt $(srcdir)/README.doc; do \ + $(INSTALL_DATA) $$file $(DESTDIR)$(txtdir)/`basename $$file`; \ + done + for file in BUGS COPYING CREDITS ChangeLog NEWS README; do \ + $(INSTALL_DATA) $(srcdir)/../$$file $(DESTDIR)$(txtdir)/$$file; \ + done + +installdirs-txt: + $(mkinstalldirs) $(DESTDIR)$(txtdir) + +uninstall-txt: + rm -f $(DESTDIR)$(txtdir)/*.txt $(DESTDIR)$(txtdir)/README.doc + for file in BUGS COPYING CREDITS ChangeLog NEWS README README.configure ; do \ + rm -f $(DESTDIR)$(txtdir)/$$file; \ + done + +PWL_SOURCE_FILES = $(wildcard $(srcdir)/../src/*.hh $(srcdir)/../src/*.cc) + +LATEX_DIRS = \ +user.latex-dir \ +devref.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) $< + +devref.latex-dir: devref.doxyconf-latex $(DEVREF_CORE_STUFF) + rm -rf $@ + $(TEX_ENV) $(DOXYGEN) $< + +pwl-user-@VERSION@.pdf: user.latex-dir + $(TEX_ENV) make -C $< refman.pdf && mv -f $ +# +# This file is part of the Parma Watchdog Library (PWL). +# +# The PWL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PWL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Watchdog Library +# site: http://www.cs.unipr.it/pwl/ . +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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.am $(srcdir)/Makefile.in \ + $(srcdir)/devref.doxyconf-html.in \ + $(srcdir)/devref.doxyconf-latex.in \ + $(srcdir)/user.doxyconf-html.in \ + $(srcdir)/user.doxyconf-latex.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = user.doxyconf-latex devref.doxyconf-latex \ + user.doxyconf-html devref.doxyconf-html +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VALGRIND = @VALGRIND@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +datadir = @datadir@ +datarootdir = @datarootdir@ +debug_flag = @debug_flag@ + +# All the documentation in docdir. +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = $(docdir) +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = $(docdir) +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +txtdir = $(docdir) +DOXYGEN = doxygen +INSTALLDOX = ./installdox -q + +# Licenses. +PDF_LICENSES = \ +gpl.pdf \ +fdl.pdf + +PS_LICENSES = \ +gpl.ps.gz \ +fdl.ps.gz + +TXT_LICENSES = \ +gpl.txt \ +fdl.txt + + +# Library Core Manuals (C++ interface) +USER_CORE_HTML_MANUAL = pwl-user-@VERSION@-html.tar.gz +DEVREF_CORE_HTML_MANUAL = pwl-devref-@VERSION@-html.tar.gz +USER_CORE_PDF_MANUAL = pwl-user-@VERSION@.pdf +DEVREF_CORE_PDF_MANUAL = pwl-devref-@VERSION@.pdf +USER_CORE_PS_MANUAL = pwl-user-@VERSION@.ps.gz +DEVREF_CORE_PS_MANUAL = pwl-devref-@VERSION@.ps.gz +USER_CORE_HTML_DIR = pwl-user-@VERSION@-html +DEVREF_CORE_HTML_DIR = pwl-devref-@VERSION@-html +HTML_DIRS = $(USER_CORE_HTML_DIR) $(DEVREF_CORE_HTML_DIR) +DOX_FILES = \ +gpl.dox \ +fdl.dox + +USER_CORE_STUFF = \ +$(DOX_FILES) \ +user.tex \ +pwl.sty \ +../src/pwl_header.hh ../src/pwl_include_files.hh + +DEVREF_CORE_STUFF = \ +$(DOX_FILES) \ +devref.tex \ +pwl.sty \ +$(PWL_SOURCE_FILES) + + +##### Distributed documentation ##### +DIST_HTML_DOCS = $(USER_CORE_HTML_MANUAL) +DIST_PDF_DOCS = \ +$(PDF_LICENSES) \ +$(USER_CORE_PDF_MANUAL) + +DIST_PS_DOCS = \ +$(PS_LICENSES) \ +$(USER_CORE_PS_MANUAL) + +DIST_TXT_DOCS = \ +$(TXT_LICENSES) + +DIST_DOCS = \ +$(DIST_HTML_DOCS) \ +$(DIST_PDF_DOCS) \ +$(DIST_PS_DOCS) \ +$(DIST_TXT_DOCS) + +NONDIST_MANUALS = \ +$(DEVREF_CORE_HTML_MANUAL) \ +$(DEVREF_CORE_PDF_MANUAL) \ +$(DEVREF_CORE_PS_MANUAL) + +PWL_SOURCE_FILES = $(wildcard $(srcdir)/../src/*.hh $(srcdir)/../src/*.cc) +LATEX_DIRS = \ +user.latex-dir \ +devref.latex-dir + +TEX_ENV = TEXINPUTS=$(abs_srcdir):$(TEXINPUTS) +EXTRA_DIST = \ +$(DIST_DOCS) \ +$(DOX_FILES) \ +user.tex \ +devref.tex \ +gpl.tex \ +fdl.tex \ +pwl.sty \ +README.doc + +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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign doc/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +user.doxyconf-latex: $(top_builddir)/config.status $(srcdir)/user.doxyconf-latex.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +devref.doxyconf-latex: $(top_builddir)/config.status $(srcdir)/devref.doxyconf-latex.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +user.doxyconf-html: $(top_builddir)/config.status $(srcdir)/user.doxyconf-html.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +devref.doxyconf-html: $(top_builddir)/config.status $(srcdir)/devref.doxyconf-html.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: installdirs-local +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-data-local + +install-dvi: install-dvi-am + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool \ + mostlyclean-local + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-local + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-data-local install-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-local maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool \ + mostlyclean-local pdf pdf-am ps ps-am uninstall uninstall-am \ + uninstall-local + + +##### Build Targets ##### + +# Do nothing by default. +all: + +user-html: $(USER_CORE_HTML_MANUAL) + +user-pdf: $(USER_CORE_PDF_MANUAL) + +user-ps: $(USER_CORE_PS_MANUAL) + +user: user-html user-pdf user-ps + +devref-html: $(DEVREF_CORE_HTML_MANUAL) + +devref-pdf: $(DEVREF_CORE_PDF_MANUAL) + +devref-ps: $(DEVREF_CORE_PS_MANUAL) + +devref: devref-html devref-pdf devref-ps + +world: user devref + +install-data-local: \ +install-html \ +install-pdf \ +install-ps \ +install-txt + +installdirs-local: \ +installdirs-html \ +installdirs-pdf \ +installdirs-ps \ +installdirs-txt + +uninstall-local: \ +uninstall-html \ +uninstall-pdf \ +uninstall-ps \ +uninstall-txt + +# Installation and uninstallation of HTML documentation. +install-html: + for ball in $(DIST_HTML_DOCS); do \ + test -f $$ball || test -f $(srcdir)/$$ball || $(MAKE) $$ball; \ + dir=`basename $$ball .tar.gz`; \ + $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$dir; \ + gunzip -c `if test -f $$ball; then echo .; else echo $(srcdir); fi`/$$ball | tar xf - ; \ + for file in $$dir/*; do \ + $(INSTALL_DATA) $$file $(DESTDIR)$(htmldir)/$$dir/`basename $$file`; \ + done; \ + done + +installdirs-html: + for ball in $(DIST_HTML_DOCS); do \ + dir=`basename $$ball .tar.gz`; \ + $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$dir; \ + done + +uninstall-html: + for ball in $(DIST_HTML_DOCS); do \ + dir=`basename $$ball .tar.gz`; \ + rm -rf $(DESTDIR)$(htmldir)/$$dir; \ + done + +# Installation and uninstallation of PDF documentation. +install-pdf: + $(mkinstalldirs) $(DESTDIR)$(pdfdir) + for file in $(DIST_PDF_DOCS); do \ + test -f $$file || test -f $(srcdir)/$$file || $(MAKE) $$file; \ + $(INSTALL_DATA) `if test -f $$file; then echo .; else echo $(srcdir); fi`/$$file $(DESTDIR)$(pdfdir)/$$file; \ + done + +installdirs-pdf: + $(mkinstalldirs) $(DESTDIR)$(pdfdir) + +uninstall-pdf: + rm -f $(DESTDIR)$(pdfdir)/*.pdf + +# Installation and uninstallation of PostScript documentation. +install-ps: + $(mkinstalldirs) $(DESTDIR)$(psdir) + for file in $(DIST_PS_DOCS); do \ + test -f $$file || test -f $(srcdir)/$$file || $(MAKE) $$file; \ + $(INSTALL_DATA) `if test -f $$file; then echo .; else echo $(srcdir); fi`/$$file $(DESTDIR)$(psdir)/$$file; \ + done + +installdirs-ps: + $(mkinstalldirs) $(DESTDIR)$(psdir) + +uninstall-ps: + rm -f $(DESTDIR)$(psdir)/*.ps.gz + +# Installation and uninstallation of pure text documentation. +install-txt: + $(mkinstalldirs) $(DESTDIR)$(txtdir) + for file in $(srcdir)/*.txt $(srcdir)/README.doc; do \ + $(INSTALL_DATA) $$file $(DESTDIR)$(txtdir)/`basename $$file`; \ + done + for file in BUGS COPYING CREDITS ChangeLog NEWS README; do \ + $(INSTALL_DATA) $(srcdir)/../$$file $(DESTDIR)$(txtdir)/$$file; \ + done + +installdirs-txt: + $(mkinstalldirs) $(DESTDIR)$(txtdir) + +uninstall-txt: + rm -f $(DESTDIR)$(txtdir)/*.txt $(DESTDIR)$(txtdir)/README.doc + for file in BUGS COPYING CREDITS ChangeLog NEWS README README.configure ; do \ + rm -f $(DESTDIR)$(txtdir)/$$file; \ + done + +.SECONDARY: $(LATEX_DIRS) + +user.latex-dir: user.doxyconf-latex $(USER_CORE_STUFF) + rm -rf $@ + $(TEX_ENV) $(DOXYGEN) $< + +devref.latex-dir: devref.doxyconf-latex $(DEVREF_CORE_STUFF) + rm -rf $@ + $(TEX_ENV) $(DOXYGEN) $< + +pwl-user-@VERSION@.pdf: user.latex-dir + $(TEX_ENV) make -C $< refman.pdf && mv -f $ +See below for the copying conditions. + +How To Get (More) PWL 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 Watchdog 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 PWL version +X.Y.Z, you will find in the doc subdirectory the following set of user +manuals: + + pwl-user-X.Y.Z.pdf + pwl-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 pwl' which +will print, among other things, something like + + /usr/share/doc/pwl-X.Y.Z + /usr/share/doc/pwl-X.Y.Z/README + /usr/share/doc/pwl-X.Y.Z/pwl-user-X.Y.Z.pdf + /usr/share/doc/pwl-X.Y.Z/pwl-user-X.Y.Z.ps.gz + + +The Documentation You May Download +================================== + +If you are using the latest released version of the library, you will +find all the documentation in all formats at +http://www.cs.unipr.it/pwl/Documentation/ . + + +The Documentation You May Build Yourself +======================================== + +When all else fails (which is the case, for example, when you are +using a CVS version [1]) then you may build the documentation by +yourself. In order to do that, you should have a recent version of +Doxygen [2] and, if you want to build the HTML documentation, a recent +version of Graphviz [3]. When you have all the tools installed and +running, you should follow the following procedure. + +First, you should determine which version of the library you are +working with. The safest way is to go to the top source directory of +the library and to locate the unique line in the file configure.ac +containing the string "AC_INIT". This will look like + + AC_INIT([the Parma Watchdog Library], 0.6.3pre4, pwl-devel@cs.unipr.it, pwl) + +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': + + pwl-KIND-X.Y.Z.pdf + pwl-KIND-X.Y.Z.ps.gz + pwl-KIND-X.Y.Z-html.tar.gz + +For example, the command + + make pwl-user-0.6.3pre4.pdf pwl-devref-0.6.3pre4.pdf + +will build both kinds of manuals in a PDF format. Alternatively, the +command `make world' will build all the available documentation in all +of the above formats. + +-------- + +[1] http://www.cs.unipr.it/pwl/Download/cvs +[2] http://www.doxygen.org/ +[3] http://www.research.att.com/sw/tools/graphviz/ + + +-------- + +Copyright (C) 2001-2009 Roberto Bagnara + +This document describes the Parma Watchdog Library (PWL). + +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 PWL in files called `fdl.*'. + +The PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 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 PWL in +files are called `gpl.*'. + +The PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +If you have not received a copy of one or both the above mentioned +licenses along with the PWL, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Watchdog Library +site: http://www.cs.unipr.it/pwl/ . diff --git a/Watchdog/doc/devref.doxyconf-html.in b/Watchdog/doc/devref.doxyconf-html.in new file mode 100644 index 0000000..14bc4ce --- /dev/null +++ b/Watchdog/doc/devref.doxyconf-html.in @@ -0,0 +1,284 @@ +# Doxyfile 1.5.7.1 + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +DOXYFILE_ENCODING = UTF-8 +PROJECT_NAME = PWL +PROJECT_NUMBER = @VERSION@ +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 = +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = NO +OPTIMIZE_FOR_FORTRAN = NO +OPTIMIZE_OUTPUT_VHDL = NO +BUILTIN_STL_SUPPORT = NO +CPP_CLI_SUPPORT = NO +SIP_SUPPORT = NO +IDL_PROPERTY_SUPPORT = YES +DISTRIBUTE_GROUP_DOC = NO +SUBGROUPING = YES +TYPEDEF_HIDES_STRUCT = NO +SYMBOL_CACHE_SIZE = 0 +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = YES +EXTRACT_PRIVATE = YES +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 +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_GROUP_NAMES = NO +SORT_BY_SCOPE_NAME = 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_DIRECTORIES = NO +SHOW_FILES = YES +SHOW_NAMESPACES = YES +FILE_VERSION_FILTER = +LAYOUT_FILE = +#--------------------------------------------------------------------------- +# 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@/../src/Doubly_Linked_Object.types.hh \ + @srcdir@/../src/Doubly_Linked_Object.defs.hh \ + @srcdir@/../src/Doubly_Linked_Object.inlines.hh \ + @srcdir@/../src/EList.types.hh \ + @srcdir@/../src/EList.defs.hh \ + @srcdir@/../src/EList.inlines.hh \ + @srcdir@/../src/EList_Iterator.types.hh \ + @srcdir@/../src/EList_Iterator.defs.hh \ + @srcdir@/../src/EList_Iterator.inlines.hh \ + @srcdir@/../src/Handler.types.hh \ + @srcdir@/../src/Handler.defs.hh \ + @srcdir@/../src/Handler.inlines.hh \ + @srcdir@/../src/Pending_Element.types.hh \ + @srcdir@/../src/Pending_Element.defs.hh \ + @srcdir@/../src/Pending_Element.inlines.hh \ + @srcdir@/../src/Pending_Element.cc \ + @srcdir@/../src/Pending_List.types.hh \ + @srcdir@/../src/Pending_List.defs.hh \ + @srcdir@/../src/Pending_List.inlines.hh \ + @srcdir@/../src/Pending_List.cc \ + @srcdir@/../src/Time.types.hh \ + @srcdir@/../src/Time.defs.hh \ + @srcdir@/../src/Time.inlines.hh \ + @srcdir@/../src/Time.cc \ + @srcdir@/../src/Watchdog.types.hh \ + @srcdir@/../src/Watchdog.defs.hh \ + @srcdir@/../src/Watchdog.inlines.hh \ + @srcdir@/../src/Watchdog.cc \ + @srcdir@/gpl.dox \ + @srcdir@/fdl.dox +INPUT_ENCODING = UTF-8 +FILE_PATTERNS = *.hh \ + *.cc \ + *.dox +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 +#--------------------------------------------------------------------------- +# 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 = pwl-devref-@VERSION@-html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +HTML_DYNAMIC_SECTIONS = NO +GENERATE_DOCSET = NO +DOCSET_FEEDNAME = "Doxygen generated docs" +DOCSET_BUNDLE_ID = org.doxygen.Project +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 +QHG_LOCATION = +DISABLE_INDEX = NO +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = YES +TREEVIEW_WIDTH = 250 +FORMULA_FONTSIZE = 10 +#--------------------------------------------------------------------------- +# 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 = pwl +LATEX_HEADER = @srcdir@/devref.tex +PDF_HYPERLINKS = YES +USE_PDFLATEX = YES +LATEX_BATCHMODE = YES +LATEX_HIDE_INDICES = NO +#--------------------------------------------------------------------------- +# 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 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 = PWL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +EXPAND_AS_DEFINED = PWL_OUTPUT_DECLARATIONS +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = pwl-devref-@VERSION@-html.tag +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = @PERL@ +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = YES +MSCGEN_PATH = +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = YES +DOT_FONTNAME = FreeSans +DOT_FONTSIZE = 10 +DOT_FONTPATH = +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +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 +DOT_PATH = +DOTFILE_DIRS = +DOT_GRAPH_MAX_NODES = 50 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO diff --git a/Watchdog/doc/devref.doxyconf-latex.in b/Watchdog/doc/devref.doxyconf-latex.in new file mode 100644 index 0000000..fc3ad30 --- /dev/null +++ b/Watchdog/doc/devref.doxyconf-latex.in @@ -0,0 +1,284 @@ +# Doxyfile 1.5.7.1 + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +DOXYFILE_ENCODING = UTF-8 +PROJECT_NAME = PWL +PROJECT_NUMBER = @VERSION@ +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 = +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = NO +OPTIMIZE_FOR_FORTRAN = NO +OPTIMIZE_OUTPUT_VHDL = NO +BUILTIN_STL_SUPPORT = NO +CPP_CLI_SUPPORT = NO +SIP_SUPPORT = NO +IDL_PROPERTY_SUPPORT = YES +DISTRIBUTE_GROUP_DOC = NO +SUBGROUPING = YES +TYPEDEF_HIDES_STRUCT = NO +SYMBOL_CACHE_SIZE = 0 +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = YES +EXTRACT_PRIVATE = YES +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 +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_GROUP_NAMES = NO +SORT_BY_SCOPE_NAME = 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_DIRECTORIES = NO +SHOW_FILES = YES +SHOW_NAMESPACES = YES +FILE_VERSION_FILTER = +LAYOUT_FILE = +#--------------------------------------------------------------------------- +# 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@/../src/Doubly_Linked_Object.types.hh \ + @srcdir@/../src/Doubly_Linked_Object.defs.hh \ + @srcdir@/../src/Doubly_Linked_Object.inlines.hh \ + @srcdir@/../src/EList.types.hh \ + @srcdir@/../src/EList.defs.hh \ + @srcdir@/../src/EList.inlines.hh \ + @srcdir@/../src/EList_Iterator.types.hh \ + @srcdir@/../src/EList_Iterator.defs.hh \ + @srcdir@/../src/EList_Iterator.inlines.hh \ + @srcdir@/../src/Handler.types.hh \ + @srcdir@/../src/Handler.defs.hh \ + @srcdir@/../src/Handler.inlines.hh \ + @srcdir@/../src/Pending_Element.types.hh \ + @srcdir@/../src/Pending_Element.defs.hh \ + @srcdir@/../src/Pending_Element.inlines.hh \ + @srcdir@/../src/Pending_Element.cc \ + @srcdir@/../src/Pending_List.types.hh \ + @srcdir@/../src/Pending_List.defs.hh \ + @srcdir@/../src/Pending_List.inlines.hh \ + @srcdir@/../src/Pending_List.cc \ + @srcdir@/../src/Time.types.hh \ + @srcdir@/../src/Time.defs.hh \ + @srcdir@/../src/Time.inlines.hh \ + @srcdir@/../src/Time.cc \ + @srcdir@/../src/Watchdog.types.hh \ + @srcdir@/../src/Watchdog.defs.hh \ + @srcdir@/../src/Watchdog.inlines.hh \ + @srcdir@/../src/Watchdog.cc \ + @srcdir@/gpl.dox \ + @srcdir@/fdl.dox +INPUT_ENCODING = UTF-8 +FILE_PATTERNS = *.hh \ + *.cc \ + *.dox +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 +#--------------------------------------------------------------------------- +# 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 = NO +HTML_OUTPUT = pwl-devref-@VERSION@-html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +HTML_DYNAMIC_SECTIONS = NO +GENERATE_DOCSET = NO +DOCSET_FEEDNAME = "Doxygen generated docs" +DOCSET_BUNDLE_ID = org.doxygen.Project +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 +QHG_LOCATION = +DISABLE_INDEX = NO +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = YES +TREEVIEW_WIDTH = 250 +FORMULA_FONTSIZE = 10 +#--------------------------------------------------------------------------- +# 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 = pwl +LATEX_HEADER = @srcdir@/devref.tex +PDF_HYPERLINKS = YES +USE_PDFLATEX = YES +LATEX_BATCHMODE = YES +LATEX_HIDE_INDICES = NO +#--------------------------------------------------------------------------- +# 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 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 = PWL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +EXPAND_AS_DEFINED = PWL_OUTPUT_DECLARATIONS +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = @PERL@ +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = YES +MSCGEN_PATH = +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = YES +DOT_FONTNAME = FreeSans +DOT_FONTSIZE = 10 +DOT_FONTPATH = +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +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 +DOT_PATH = +DOTFILE_DIRS = +DOT_GRAPH_MAX_NODES = 50 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO diff --git a/Watchdog/doc/devref.tex b/Watchdog/doc/devref.tex new file mode 100644 index 0000000..8c89107 --- /dev/null +++ b/Watchdog/doc/devref.tex @@ -0,0 +1,120 @@ +% Copyright (C) 2001-2009 Roberto Bagnara +% +% This document describes the Parma Watchdog Library (PWL). +% +% 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 PWL in files called `fdl.*'. +% +% The PWL is free software; you can redistribute it and/or modify it +% under the terms of the GNU General Public License as published by the +% Free Software Foundation; either version 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 PWL in +% files are called `gpl.*'. +% +% The PWL is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +% for more details. +% +% For the most up-to-date information see the Parma Watchdog Library +% site: http://www.cs.unipr.it/pwl/ . + +\documentclass[a4paper]{article} +\nonstopmode +\usepackage{a4wide} +\usepackage{makeidx} +\usepackage{fancyhdr} +\usepackage{graphicx} +\usepackage{float} +\usepackage{alltt} +\usepackage{doxygen} +\usepackage{times} +\ifx\pdfoutput\undefined +\usepackage[ps2pdf, + pagebackref=true, + colorlinks=true, + linkcolor=blue + ]{hyperref} +\usepackage{pspicture} +\else +\usepackage[pdftex, + pagebackref=true, + colorlinks=true, + linkcolor=blue + ]{hyperref} +\fi +\usepackage{pwl} +\makeindex +\setcounter{tocdepth}{1} +\renewcommand{\footrulewidth}{0.4pt} + +\rfoot[\fancyplain{}{\scriptsize The Parma Watchdog Library Developer's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/pwl/} for more information.}]{} +\lfoot[]{\fancyplain{}{\scriptsize The Parma Watchdog Library Developer's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/pwl/} for more information.}} + +\begin{document} +\title{ +The Parma Watchdog Library \\ +Developer's Manual\thanks{This work + has been partly supported by: + University of Parma's FIL scientific research project (ex 60\%) + ``Pure and Applied Mathematics''; + MURST project + ``Automatic Program Certification by Abstract Interpretation''; + MURST project + ``Abstract Interpretation, Type Systems and Control-Flow Analysis''; + MURST project + ``Automatic Aggregate- and Number-Reasoning for Computing: from + Decision Algorithms to Constraint Programming with Multisets, + Sets, and Maps''; + MURST project + ``Constraint Based Verification of Reactive Systems''; + MURST project + ``Abstract Interpretation: Design and Applications''. + } \\ +(version $projectnumber) +} +\author{ +Roberto Bagnara\thanks{bagnara@cs.unipr.it, + Department of Mathematics, University of Parma, Italy.} +} +\maketitle + +\newpage +Copyright \copyright\ 2001--2009 Roberto Bagnara (bagnara@cs.unipr.it). + +This document describes the Parma Watchdog Library (PWL). + +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 PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +\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 PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +For the most up-to-date information see the Parma Watchdog Library +site: +\begin{center} +\href{http://www.cs.unipr.it/pwl/}{\tt http://www.cs.unipr.it/pwl/} +\end{center} + +\pagenumbering{roman} +\tableofcontents +\pagenumbering{arabic} diff --git a/Watchdog/doc/fdl.dox b/Watchdog/doc/fdl.dox new file mode 100644 index 0000000..43fe58b --- /dev/null +++ b/Watchdog/doc/fdl.dox @@ -0,0 +1,407 @@ +/*! \page GFDL GNU Free Documentation License + +\anchor GFDL + +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. +

+ +

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/Watchdog/doc/fdl.pdf b/Watchdog/doc/fdl.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8e6f265165c10cba98d60b635b287ead67b709a3 GIT binary patch literal 56411 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 T{q~1%{^frF#i|8KbUgzAK?!rj literal 0 HcmV?d00001 diff --git a/Watchdog/doc/fdl.tex b/Watchdog/doc/fdl.tex new file mode 100644 index 0000000..fa38f28 --- /dev/null +++ b/Watchdog/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/Watchdog/doc/fdl.txt b/Watchdog/doc/fdl.txt new file mode 100644 index 0000000..4a0fe1c --- /dev/null +++ b/Watchdog/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/Watchdog/doc/gpl.dox b/Watchdog/doc/gpl.dox new file mode 100644 index 0000000..c1122ac --- /dev/null +++ b/Watchdog/doc/gpl.dox @@ -0,0 +1,686 @@ +/*! \page GPL GNU General Public License + +\anchor GPL + +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/Watchdog/doc/gpl.pdf b/Watchdog/doc/gpl.pdf new file mode 100644 index 0000000000000000000000000000000000000000..02473cdbd446e5584f28afac809c371b6a2bb902 GIT binary patch literal 69557 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 literal 0 HcmV?d00001 diff --git a/Watchdog/doc/gpl.ps.gz b/Watchdog/doc/gpl.ps.gz new file mode 100644 index 0000000000000000000000000000000000000000..a39b3f492f892e303525552435e16b2e2e335d21 GIT binary patch literal 80241 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 literal 0 HcmV?d00001 diff --git a/Watchdog/doc/gpl.tex b/Watchdog/doc/gpl.tex new file mode 100644 index 0000000..1e867c3 --- /dev/null +++ b/Watchdog/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} + + + Copyright (C) + + 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} + Copyright (C) + + 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/Watchdog/doc/gpl.txt b/Watchdog/doc/gpl.txt new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/Watchdog/doc/gpl.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + 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. + + + Copyright (C) + + 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 . + +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: + + Copyright (C) + 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 +. + + 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 +. diff --git a/Watchdog/doc/pwl-user-0.7-html.tar.gz b/Watchdog/doc/pwl-user-0.7-html.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..fbe9e46cdbc71362f2c8385e2828e96123f34101 GIT binary patch literal 69710 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 z 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 I69BLT03)oIGynhq literal 0 HcmV?d00001 diff --git a/Watchdog/doc/pwl-user-0.7.pdf b/Watchdog/doc/pwl-user-0.7.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c9ee0117363913ea4f48e180e2df209efdbf6cdd GIT binary patch literal 241944 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

5!IfW2o!udVt`+!Pf{~bF3 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%0AQPpEBb#~18L9+Vlf&#ONE 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

-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 IUE13HAL&lb&;S4c literal 0 HcmV?d00001 diff --git a/Watchdog/doc/pwl-user-0.7.ps.gz b/Watchdog/doc/pwl-user-0.7.ps.gz new file mode 100644 index 0000000000000000000000000000000000000000..6c2b5ae814623f0a36fabf05617bd919d3aafdf1 GIT binary patch literal 174050 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 z

    +
  1. + Constructors of a universe or empty semantic GD with the given + space dimension. +
  2. +
  3. + Operations on a semantic GD that do not depend on the syntactic GDs. +
      +
    • + is_empty(), is_universe(), + is_topologically_closed(), is_discrete(), + is_bounded(), contains_integer_point() + + test for the named properties of the semantic GD. +
    • +
    • + %total_memory_in_bytes(), + %external_memory_in_bytes() + + return the total and external memory size in bytes. +
    • +
    • + OK() + + 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.) +
    • +
    • + space_dimension(), affine_dimension() + + return, respectively, the space and affine dimensions of the GD. +
    • +
    • + add_space_dimensions_and_embed(), + add_space_dimensions_and_project(), + expand_space_dimension(), + remove_space_dimensions(), + fold_space_dimensions(), map_space_dimensions() + + 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. +
    • +
    • + contains(), strictly_contains(), + is_disjoint_from() + + compare the semantic GD with an argument semantic GD of the same class. +
    • +
    • + topological_closure_assign(), + intersection_assign(), + upper_bound_assign(), difference_assign(), + time_elapse_assign(), widening_assign(), + concatenate_assign(), %swap() + + modify the semantic GD, possibly with an argument semantic GD of + the same class. +
    • +
    • + constrains(), bounds_from_above(), + bounds_from_below(), maximize(), + minimize(). + + These find information about the bounds of the semantic GD where + the argument variable or linear expression define the direction + of the bound. +
    • +
    • + affine_image(), affine_preimage(), + generalized_affine_image(), + generalized_affine_preimage(), + bounded_affine_image(), + bounded_affine_preimage(). + + 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. +
    • +
    • + ascii_load(), ascii_dump() + + are the ascii input and output operations. +
    +
  4. +
  5. + Constructors of a semantic GD of one class from a semantic GD of any + other class. + These constructors obey an upward approximation semantics, + 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. +
  6. +
  7. + 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. +
  8. +
  9. + Other interaction between the semantic GDs and constraint GDs +
      +
    • + add_constraint(), add_constraints(), + add_recycled_constraints(), + add_congruence(), add_congruences(), + add_recycled_congruences(). + + 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 add_recycled_constraints() and + add_recycled_congruences(), + the only assumption that can be made on the constraint GD + after return (successful or exceptional) is that + it can be safely destroyed. +
    • +
    • + refine_with_constraint(), + refine_with_constraints(), + refine_with_congruence(), + refine_with_congruences() + + If the argument constraint GD is optimally supported by the + semantic GD, the 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 +
    • +
    • + constraints(), minimized_constraints(), + congruences(), minimized_congruences() + + returns the indicated system of constraint GDs satisfied by + the semantic GD. +
    • +
    • + can_recycle_constraint_systems(), + can_recycle_congruence_systems() + + return true if and only if the semantic GD can recycle the + indicated constraint GD. +
    • +
    • + relation_with() + + 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: + IS_INCLUDED(), SATURATES(), + STRICTLY_INTERSECTS(), IS_DISJOINT() + and NOTHING(). + This operator also can take a polyhedron generator GD as an argument + and returns the relation SUBSUMES() or NOTHING() + that holds between the generator GD and the semantic GD. +
    • +
    +
  10. +
+ + +\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 +upward approximation 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 downward +approximations (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 convex_polys Convex Polyhedra + +In this section we introduce convex polyhedra, +as considered by the library, in more detail. +For more information about the definitions and results stated here see +\ref BRZH02b "[BRZH02b]", +\ref Fuk98 "[Fuk98]", +\ref NW88 "[NW88]", and +\ref Wil93 "[Wil93]". + +\subsection Vectors_Matrices_and_Scalar_Products Vectors, Matrices and Scalar Products + +We denote by \f$\Rset^n\f$ the \f$n\f$-dimensional vector space on the field +of real numbers \f$\Rset\f$, endowed with the standard topology. +The set of all non-negative reals is denoted by \f$\nonnegRset\f$. +For each \f$i \in \{0, \ldots, n-1\}\f$, \f$v_i\f$ denotes +the \f$i\f$-th component of the (column) vector +\f$\vect{v} = (v_0, \ldots, v_{n-1})^\transpose \in \Rset^n\f$. +We denote by \f$\vect{0}\f$ the vector of \f$\Rset^n\f$, +called the origin, 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 scalar product 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 Minkowski's sum 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 +not necessarily closed convex polyhedron +(NNC polyhedron, 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 closed convex polyhedron +(closed polyhedron, 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 universe polyhedron. + +In theoretical terms, +\f$\Pset_n\f$ is a lattice under set inclusion and +\f$\CPset_n\f$ is a sub-lattice 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 bounded +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 polytope. + + +\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 constraint. + +By definition, each polyhedron \f$\cP \in \Pset_n\f$ is the set of solutions +to a constraint system, 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 linear combination of the vectors in \f$S\f$. +Such a combination is said to be +- a positive (or conic) combination, + if \f$\forall j \in \{ 1, \ldots, k \} \itc \lambda_j \in \nonnegRset\f$; +- an affine combination, if \f$\sum_{j = 1}^k \lambda_j = 1\f$; +- a convex 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 point of \f$\cP\f$; +- a vector \f$\vect{c} \in \Rset^n\f$ is called a + closure point 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 ray (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 line 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 +vertex 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 extreme ray +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 generator system 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 generator system 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 not 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 not 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 minimized 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 minimized +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 double description pair (DD pair) +\f$(\cC, \cG)\f$. +The double description method 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, NNC and C. +We shall abuse terminology by referring to the topological kind of +a polyhedron as its topology. + +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 topological-compatibility 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 space dimension 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) dimension-compatibility 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 +affinely independent 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 non-empty NNC polyhedron \f$\cP \in \Pset_n\f$ has +affine dimension \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 rational +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 intersection 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 convex polyhedral hull (or poly-hull) +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 meet and the binary join +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 convex polyhedral difference (or poly-difference) +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 concatenation 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 add_space_dimensions_and_embed +\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 add_space_dimensions_and_project +\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 remove_space_dimensions +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 remove_higher_space_dimensions 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 map_space_dimensions 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 expand_space_dimension 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 fold_space_dimensions 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 image +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 preimage 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 +space dimension preserving. + +The relation \f$\reld{\phi}{\Rset^n}{\Rset^m}\f$ +is said to be an affine relation +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 affine function 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 unprimed 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 primed 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 unaffected 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 affine function +\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 affine image 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 affine preimage 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 bounded affine relation +\f$\phi = (\mathrm{lb} \leq x'_k \leq \mathrm{ub})\f$ +is defined as +\f[ + \forall \vect{v} \in \Rset^n, \vect{w} \in \Rset^n + \itc + (\vect{v}, \vect{w}) \in \phi + \iff + \bigl( + \langle \vect{a}, \vect{v} \rangle + b + \leq w_k + \leq \langle \vect{c}, \vect{v} \rangle + d + \bigr) + \land + \Bigl( + \bigland_{0 \leq i < n, i \neq k} + w_i = v_i + \Bigr). +\f] + +\subsection Generalized_Affine_Relations Generalized Affine Relations. +Similarly, the generalized affine relation +\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 unconstrain computes +the cylindrification \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 time-elapse operator has been defined in +\ref HPR97 "[HPR97]". +Actually, the time-elapse operator provided by the library +is a slight generalization of that one, +since it also works on NNC polyhedra. +For any two NNC polyhedra \f$\cP, \cQ \in \Pset_n\f$, +the time-elapse between \f$\cP\f$ and \f$\cQ\f$, +denoted \f$ \cP \nearrow \cQ\f$, +is the smallest NNC polyhedron containing the set +\f[ + \bigl\{\, + \vect{p} + \lambda \vect{q} \in \Rset^n + \bigm| + \vect{p} \in \cP, \vect{q} \in \cQ, \lambda \in \nonnegRset + \,\bigr\}. +\f] +Note that, if \f$\cP,\cQ \in \CPset_n\f$ are closed polyhedra, +the above set is also a closed polyhedron. +In contrast, when \f$\cQ\f$ is not topologically closed, +the above set might not be an NNC polyhedron. + +\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 meet-preserving 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 enlargement of \f$\cP\f$ if \f$\cR \Sseq \cP\f$. + + - \f$\cR\f$ is a simplification 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 (simplify_using_context) +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$ is disjoint 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$ strictly intersects \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$ is included 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$ saturates \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$ subsumes 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 H79-widening, 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 BHRZ03-widening, +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 p and q, respectively, then the +call q.H79_widening_assign(p) will assign the polyhedron +\f$\cP \widen \cQ\f$ to variable q. 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 p.contains(q)). +Note that, in the above context, a call such as +p.H79_widening_assign(q) 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 widening with tokens \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 potential 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 +extrapolation 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 +limited extrapolation operator, which can be used to implement +the widening ``up to'' 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 bounded 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 interval in \f$\Rset\f$ is a pair of bounds, +called lower and upper. +Each bound can be either (1) closed and bounded, +(2) open and bounded, or +(3) open and unbounded. +If the bound is bounded, 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 interval constraint 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 +box 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 box \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 +CC76-widening 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 bounded difference 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 +bounded difference shape (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 octagonal 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 +octagonal shape (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 bds-hull (resp., oct-hull). + +As far as the representation of the rational inhomogeneous term of +each bounded difference or octagonal constraint is concerned, several +rounding-aware 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 bds-difference and oct-difference +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; +congruence systems and grid generator systems. +We first describe linear congruence relations 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 congruence +\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 linear congruence relation in \f$\Sset^n\f$ +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 +proper; +\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 frequency or modulus and +\f$b\f$ the base value 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 rational grid +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 \f$\cL\f$ is described by \f$\cC\f$ +and that \f$\cC\f$ is a congruence system for \f$\cL\f$. + +The grid domain \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 empty grid, +then we say that \f$\cC\f$ is inconsistent. +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 universe grid. + +In set theoretical terms, +\f$\Gset_n\f$ is a lattice 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 integer 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 grid point of \f$\cL\f$; +- a vector \f$\vect{q} \in \Rset^n\f$, where \f$\vect{q} \neq \vect{0}\f$, + is called a parameter 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 grid line 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 grid generator system 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 minimized 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 minimized 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 double description pair (DD pair) +\f$(\cC, \cG)\f$. +The double description method 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 space dimension 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 non-empty grid \f$\cL \in \Gset_n\f$ has +affine dimension \f$k \in \Nset\f$, denoted by \f$\pdim(\cG) = k\f$, +if the maximum number of affinely independent points in \f$\cG\f$ is +\f$k + 1\f$. +The affine dimension of an empty grid is defined to be 0. +Thus we have \f$0 \leq \pdim(\cG) \leq n\f$. + +\section rational_grid_operations Operations on Rational Grids + +In this section we briefly describe operations on rational grids +that are provided by the library. +These are similar to those described in Section \ref Operations_on_Convex_Polyhedra. + +\subsection Grid_Intersection_and_Join Grid Intersection and Grid Join + +For any pair of grids \f$\cL_1, \cL_2 \in \Gset_n\f$, +the intersection of \f$\cL_1\f$ and \f$\cL_2\f$, +defined as the set intersection \f$\cL_1 \inters \cL_2\f$, +is the largest grid included in both \f$\cL_1\f$ and \f$\cL_2\f$; +similarly, the grid join +of \f$\cL_1\f$ and \f$\cL_2\f$, denoted by \f$\cL_1 \uplus \cL_2\f$, +is the smallest grid that includes both +\f$\cL_1\f$ and \f$\cL_2\f$. + +In theoretical terms, +the intersection and grid join operators defined above +are the binary meet and the binary join +operators on the lattice \f$\Gset_n\f$. + +\subsection Grid_Difference Grid Difference + +For any pair of grids \f$\cL_1, \cL_2 \in \Gset_n\f$, +the grid difference +of \f$\cL_1\f$ and \f$\cL_2\f$ is defined as the smallest +grid containing the set-theoretic difference +of \f$\cL_1\f$ and \f$\cL_2\f$. + +\subsection Grid_Concatenate Concatenating Grids + +Viewing a grid as a set of tuples (its points), it is sometimes +useful to consider the set of tuples obtained by concatenating +an ordered pair of grids. +Formally, the concatenation of the grids +\f$\cL_1 \in \Gset_n\f$ and \f$\cL_2 \in \Gset_m\f$ (taken in this order) +is the grid in \f$\Gset_{n+m}\f$ defined as +\f[ + \Bigl\{\, + (x_0, \ldots, x_{n-1}, y_0, \ldots, y_{m-1})^\transpose + \in \Rset^{n+m} + \Bigm| + (x_0, \ldots, x_{n-1})^\transpose \in \cL_1, + (y_0, \ldots, y_{m-1})^\transpose \in \cL_2 + \,\Bigl\}. +\f] +Another way of seeing it is as follows: first embed grid \f$\cL_1\f$ +into a vector space of dimension \f$n+m\f$ and then add a suitably +renamed-apart version of the congruence relations defining \f$\cL_2\f$. + +\subsection Grid_Add_Space_Dimensions Adding New Dimensions to the Vector Space + +The library provides two operators for adding a number \f$i\f$ of +space dimensions to a grid \f$\cL \in \Gset_n\f$, +therefore transforming it into a new grid in +\f$\Gset_{n+i}\f$. +In both cases, the added dimensions of the vector space +are those having the highest indices. + +The operator add_space_dimensions_and_embed +\e embeds the grid \f$\cL\f$ into the new vector space of +dimension \f$i+n\f$ and returns the grid +defined by all and only the congruences defining \f$\cL\f$ +(the variables corresponding to the added dimensions are unconstrained). +For instance, when starting from a grid \f$\cL \sseq \Rset^2\f$ +and adding a third space dimension, the result will be the grid +\f[ + \bigl\{\, + (x_0, x_1, x_2)^\transpose \in \Rset^3 + \bigm| + (x_0, x_1)^\transpose \in \cL + \,\bigr\}. +\f] + +In contrast, the operator add_space_dimensions_and_project +\e projects the grid \f$\cL\f$ into the new vector space of +dimension \f$i+n\f$ and returns the grid +whose congruence system, besides the congruence relations defining \f$\cL\f$, +will include additional equalities on the added dimensions. +Namely, the corresponding variables are all constrained to be equal to 0. +For instance, when starting from a grid \f$\cL \sseq \Rset^2\f$ +and adding a third space dimension, the result will be the grid +\f[ + \bigl\{\, + (x_0, x_1, 0)^\transpose \in \Rset^3 + \bigm| + (x_0, x_1)^\transpose \in \cL + \,\bigr\}. +\f] + +\subsection Grid_Remove_Space_Dimensions Removing Dimensions from the Vector Space + +The library provides two operators for removing +space dimensions from a grid \f$\cL \in \Gset_n\f$, +therefore transforming it into a new grid in +\f$\Gset_m\f$ where \f$m \leq n\f$. + +Given a set of variables, the operator remove_space_dimensions +removes all the space dimensions specified by the variables in the set. + +Given a space dimension \f$m\f$ less than or equal to that of the grid, +the operator remove_higher_space_dimensions removes +the space dimensions having indices greater than or equal to \f$m\f$. + +\subsection Grid_Map_Space_Dimensions Mapping the Dimensions of the Vector Space + +The operator map_space_dimensions provided by the library +maps the dimensions of the vector space \f$\Rset^n\f$ according +to a partial injective function \f$\pard{\rho}{\{0, \ldots, n-1\}}{\Nset}\f$ +such that +\f[ + \rho\bigl(\{0, \ldots, n-1\}\bigr) = \{0, \ldots, m-1\} +\f] +with \f$m \leq n\f$. +Dimensions corresponding to indices that are not mapped +by \f$\rho\f$ are removed. + +If \f$m = 0\f$, i.e., if the function \f$\rho\f$ is undefined everywhere, +then the operator projects the argument grid \f$\cL \in \Gset_n\f$ +onto the zero-dimension space \f$\Rset^0\f$; +otherwise the result is a grid in \f$\Gset_m\f$ given by +\f[ + \Bigl\{\, + \bigl(v_{\rho^{-1}(0)}, \ldots, v_{\rho^{-1}(m-1)}\bigr)^\transpose + \Bigm| + (v_0, \ldots, v_{n-1})^\transpose \in \cL + \,\Bigr\}. +\f] + +\subsection Grid_Expand_Space_Dimension Expanding One Dimension of the Vector Space to Multiple Dimensions + +The operator expand_space_dimension provided by the library +adds \f$m\f$ new space dimensions to a grid \f$\cL \in \Gset_n\f$, +with \f$n > 0\f$, so that dimensions +\f$n\f$, \f$n+1\f$, \f$\ldots\f$, \f$n+m-1\f$ +of the resulting grid are exact copies of the \f$i\f$-th space dimension +of \f$\cL\f$. More formally, the result is a grid in \f$\Gset_m\f$ given by +\f[ + \sset{ + \vect{u} \in \Rset^{n+m} + }{ + \exists \vect{v}, \vect{w} \in \cL + \st u_i = v_i \\ + \qquad \mathord{} \land \forall j = n, n+1, \ldots, n+m-1 + \itc u_j = w_i \\ + \qquad \mathord{} \land \forall k = 0, \ldots, n-1 + \itc k \neq i \implies u_k = v_k = w_k + }. +\f] + +\subsection Grid_Fold_Space_Dimensions Folding Multiple Dimensions of the Vector Space into One Dimension + +The operator fold_space_dimensions provided by the library, +given a grid \f$\cL \in \Gset_n\f$, with \f$n > 0\f$, +folds a subset \f$J\f$ of the set of space dimensions \f$\{0, \ldots, n-1\}\f$ +into a space dimension \f$i < n\f$, where \f$i \notin J\f$. +Letting \f$m = \card J\f$, the result is given by the grid join +\f[ + \cL_0 \uplus \cdots \uplus \cL_m +\f] +where +\f[ + \cL_m + \defeq + \sset{ + \vect{u} \in \Rset^{n-m} + }{ + \exists \vect{v} \in \cL + \st u_{i'} = v_i \\ + \qquad \mathord{} \land \forall k = 0, \ldots, n-1 + \itc k \neq i \implies u_{k'} = v_k + }, +\f] +for \f$ d = 0 \f$, \f$ \ldots \f$, \f$ m-1 \f$, +\f[ + \cL_d + \defeq + \sset{ + \vect{u} \in \Rset^{n-m} + }{ + \exists \vect{v} \in \cL + \st u_{i'} = v_{j_d} \\ + \qquad \mathord{} \land \forall k = 0, \ldots, n-1 + \itc k \neq i \implies u_{k'} = v_k + } +\f] +and, for \f$ k = 0 \f$, \f$ \ldots \f$, \f$ n-1 \f$, +\f[ + k' + \defeq + k - \card \{\, j \in J \mid k > j \,\}. +\f] + +\subsection Grid_Affine_Transformation Affine Images and Preimages + +As for convex polyhedra (see \ref Single_Update_Affine_Functions +"Single-Update Affine Functions"), +the library provides affine image and preimage operators for grids: +given a variable \f$x_k\f$ and +linear expression \f$\mathrm{expr} = \langle \vect{a}, \vect{x} \rangle + b\f$, +these determine the affine transformation +\f$\fund{\phi = \bigl(x'_k = \langle \vect{a}, \vect{x} \rangle + b\bigr)} + {\Rset^n}{\Rset^n}\f$ +that transforms any point +\f$(v_0, \ldots, v_{n-1})^\transpose\f$ +in a grid \f$\cL\f$ to +\f[ + \Bigl(v_0, \ldots, \bigl(\textstyle{\sum_{i=0}^{n-1}} a_i v_i + b\bigr), + \ldots, v_{n-1}\Bigr)^\transpose. +\f] + +The affine image 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 generalized affine image operator +\f$\fund{\phi = (\mathrm{lhs}', \mathrm{rhs}, f)}{\Rset^n}{\Rset^n}\f$, where +\f$\mathrm{lhs} = \langle \vect{c}, \vect{x} \rangle + d\f$ and +\f$\mathrm{rhs} = \langle \vect{a}, \vect{x} \rangle + b\f$ +are affine expressions and \f$f \in \Qset\f$, is defined as +\f[ + \forall \vect{v} \in \Rset^n, \vect{w} \in \Rset^n + \itc + (\vect{v}, \vect{w}) \in \phi + \iff + \bigl( + \langle \vect{c}, \vect{w} \rangle + d + \equiv_f \langle \vect{a}, \vect{v} \rangle + b + \bigr) + \land + \Bigl( + \bigland_{0 \leq i < n, c_i = 0} + w_i = v_i + \Bigr). +\f] +Note that, when \f$\mathrm{lhs} = x_k\f$ and \f$f = 0\f$, +so that the transfer function is an equality, +then the above operator +is equivalent to the application of the standard affine image +of \f$\cL\f$ with respect to the variable \f$x_k\f$ and the +affine expression \f$\mathrm{rhs}\f$. + +\subsection Grid_Time_Elapse Time-Elapse Operator + +For any two grids \f$\cL_1, \cL_2 \in \Gset_n\f$, +the time-elapse 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, 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$ is disjoint 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$ strictly intersects \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$ is included 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$ saturates \f$\cg\f$ if \f$\cL\f$ is included + 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$ is disjoint from \f$c\f$ if + \f$\cL \inters \cQ = \emptyset\f$. +- \f$\cL\f$ strictly intersects \f$c\f$ if + \f$\cL \inters \cQ \neq \emptyset\f$ and \f$\cL \inters \cQ \subset \cL\f$. +- \f$\cL\f$ is included in \f$c\f$ if \f$\cL \sseq \cQ\f$. +- \f$\cL\f$ saturates \f$c\f$ if \f$\cL\f$ is included + in \f$c\f$ and \f$\mathord{\relsym}\f$ is \f$=\f$. + +A grid \f$\cL\f$ subsumes 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$ subsumes 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$ subsumes 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_Widening Widening Operators + +The library provides grid widening 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 +extrapolation 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 +limited extrapolation operator, which can be used to implement +the widening ``up to'' 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 finite 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 non-redundant +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 Omega-reduction, +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 disjuncts. +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 finite powerset domain 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 +lazy 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 +omega_reduce(), 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 +meet and upper bound 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 add disjunct 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 +collapse 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 powerset meet-preserving + 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 powerset simplification with respect to + \f$\cS_1\f$ if \f$q \leq m\f$. + + - \f$\cS\f$ is a disjunct meet-preserving simplification + 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 (simplify_using_context) +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 not 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$ geometrically covers \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 geometrically equal. + + +\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 +pairwise merge 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 upper_bound_assign() 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 BGP99_extrapolation_assign 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 BGP99_extrapolation_assign 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 +certificate-based widening framework proposed in +\ref BHZ03b "[BHZ03b]". + +A finite convergence certificate 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 +BHZ03_widening_assign\ +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 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 lazy version and an eager version, +the latter having the operator name ending with _and_minimize. +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 fail-first 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 _and_minimize) 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 Pointset_Powerset and +Partially_Reduced_Product +should only be used with the following instantiations +for the disjunct domain template \p PS and component domain +templates \p D1 and \p D2: +C_Polyhedron, +NNC_Polyhedron, +Grid, +Octagonal_Shape, +BD_Shape, +Box. + +\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 +virtual). In practice, this restriction means that the +library types should not be used as public base classes to be +derived from. A user willing to extend the library types, adding new +functionalities, often can do so by using containment instead +of inheritance; even when there is the need to override a +protected 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 i +and the reference p. +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 + +
+ +
[Anc91]
+
+\anchor Anc91 +C. Ancourt. + Génération automatique de codes de transfert pour + multiprocesseurs à mémoires locales. + PhD thesis, Université de Paris VI, Paris, France, March 1991. + +
+ + +
[BA05]
+
+\anchor BA05 +J. M. Bjorndalen and O. Anshus. + Lessons learned in benchmarking - Floating point benchmarks: Can + you trust them? + In Proceedings of the Norsk informatikkonferanse 2005 + (NIK 2005), pages 89-100, Bergen, Norway, 2005. Tapir Akademisk Forlag. + + +
+ + +
[Bag97]
+
+\anchor Bag97 +R. Bagnara. + Data-Flow Analysis for Constraint Logic-Based Languages. + PhD thesis, Dipartimento di Informatica, Università di Pisa, Pisa, + Italy, March 1997. + Printed as Report TD-1/97. + +
+ + +
[Bag98]
+
+\anchor Bag98 +R. Bagnara. + A hierarchy of constraint systems for data-flow analysis of + constraint logic-based languages. + Science of Computer Programming, 30(1-2):119-155, 1998. + + +
+ + +
[BCC+02]
+
+\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. AE. Mogensen, D. A. Schmidt, and I. Hal Sudborough, + editors, The Essence of Computation, Complexity, Analysis, + Transformation. Essays Dedicated to Neil D. Jones [on occasion of his 60th + birthday], volume 2566 of Lecture Notes in Computer Science, pages + 85-108. Springer-Verlag, Berlin, 2002. + +
+ + +
[BDH+05]
+
+\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. + Available at + http://www.comp.leeds.ac.uk/research/pubs/reports.shtml. + + +
+ + +
[BDH+06]
+
+\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 + http://www.comp.leeds.ac.uk/hill/Papers/papers.html. + +
+ + +
[BDH+07]
+
+\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, Logic-based Program Synthesis and + Transformation, 16th International Symposium, volume 4407 of Lecture + Notes in Computer Science, pages 219-235, Venice, Italy, 2007. + Springer-Verlag, Berlin. + + +
+ + +
[BFT00]
+
+\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. + + +
+ + +
[BFT01]
+
+\anchor BFT01 +A. Bemporad, K. Fukuda, and F. D. Torrisi. + Convexity recognition of the union of polyhedra. + Computational Geometry: Theory and Applications, + 18(3):141-154, 2001. + +
+ + +
[BGP99]
+
+\anchor BGP99 +T. Bultan, R. Gerber, and W. Pugh. + Model-checking concurrent systems with unbounded integer variables: + Symbolic representations, approximations, and experimental results. + ACM Transactions on Programming Languages and Systems, + 21(4):747-789, 1999. + + +
+ + +
[BHMZ04]
+
+\anchor BHMZ04 +R. Bagnara, P. M. Hill, E. Mazzi, and E. Zaffanella. + Widening operators for weakly-relational numeric abstractions. + Report arXiv:cs.PL/0412043, 2004. + Extended abstract. Contribution to the International workshop + on “Numerical & Symbolic Abstract Domains” (NSAD'05, Paris, January 21, + 2005). Available at http://arxiv.org/ and + http://www.cs.unipr.it/ppl/. + + +
+ + +
[BHMZ05a]
+
+\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 http://www.cs.unipr.it/Publications/. + + +
+ + +
[BHMZ05b]
+
+\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, Static Analysis: + Proceedings of the 12th International Symposium, volume 3672 of Lecture + Notes in Computer Science, pages 3-18, London, UK, 2005. Springer-Verlag, + Berlin. + +
+ + +
[BHRZ03a]
+
+\anchor BHRZ03a +R. Bagnara, P. M. Hill, E. Ricci, and E. Zaffanella. + Precise widening operators for convex polyhedra. + In R. Cousot, editor, Static Analysis: Proceedings of the 10th + International Symposium, volume 2694 of Lecture Notes in Computer + Science, pages 337-354, San Diego, California, USA, 2003. Springer-Verlag, + Berlin. + + +
+ + +
[BHRZ03b]
+
+\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 http://www.cs.unipr.it/Publications/. + +
+ + +
[BHRZ05]
+
+\anchor BHRZ05 +R. Bagnara, P. M. Hill, E. Ricci, and E. Zaffanella. + Precise widening operators for convex polyhedra. + Science of Computer Programming, 58(1-2):28-56, 2005. + + +
+ + +
[BHZ02a]
+
+\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 http://www.cs.unipr.it/Publications/. + +
+ + +
[BHZ02b]
+
+\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, Proceedings of + the 1st CoLogNet Workshop on Component-based Software Development and + Implementation Technology for Computational Logic Systems, pages 147-153, + Madrid, Spain, 2002. + Published as TR Number CLIP4/02.0, Universidad Politécnica de + Madrid, Facultad de Informática. + + +
+ + +
[BHZ03a]
+
+\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, + Proceedings of the 3rd Workshop on Automated Verification of Critical + Systems, pages 161-176, Southampton, UK, 2003. + Published as TR Number DSSE-TR-2003-2, University of Southampton. + + +
+ + +
[BHZ03b]
+
+\anchor BHZ03b +R. Bagnara, P. M. Hill, and E. Zaffanella. + Widening operators for powerset domains. + In B. Steffen and G. Levi, editors, Verification, Model Checking + and Abstract Interpretation: Proceedings of the 5th International Conference + (VMCAI 2004), volume 2937 of Lecture Notes in Computer Science, pages + 135-148, Venice, Italy, 2003. Springer-Verlag, Berlin. + + +
+ + +
[BHZ04]
+
+\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 http://www.cs.unipr.it/Publications/. + +
+ + +
[BHZ05]
+
+\anchor BHZ05 +R. Bagnara, P. M. Hill, and E. Zaffanella. + Not necessarily closed convex polyhedra and the double description + method. + Formal Aspects of Computing, 17(2):222-257, 2005. + +
+ + +
[BHZ06a]
+
+\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 http://www.cs.unipr.it/Publications/. Also + published as arXiv:cs.MS/0612085, available from + http://arxiv.org/. + + +
+ + +
[BHZ06b]
+
+\anchor BHZ06b +R. Bagnara, P. M. Hill, and E. Zaffanella. + Widening operators for powerset domains. + Software Tools for Technology Transfer, 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]". + + +
+ + +
[BHZ07a]
+
+\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 http://www.cs.unipr.it/Publications/. Also + published as arXiv:cs.CG/0701122, available from + http://arxiv.org/. + + +
+ + +
[BHZ07b]
+
+\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 http://www.cs.unipr.it/Publications/. Also + published as arXiv:0705.4618v2 [cs.DS], available from + http://arxiv.org/. + + +
+ + +
[BHZ07c]
+
+\anchor BHZ07c +R. Bagnara, P. M. Hill, and E. Zaffanella. + Widening operators for powerset domains. + Software Tools for Technology Transfer, 9(3/4):413-414, 2007. + Erratum to \ref BHZ06b "[BHZ06b]" containing all the figures properly + printed. + +
+ + +
[BHZ08a]
+
+\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, Verification, + Model Checking and Abstract Interpretation: Proceedings of the 9th + International Conference (VMCAI 2008), volume 4905 of Lecture Notes in + Computer Science, pages 8-21, San Francisco, USA, 2008. Springer-Verlag, + Berlin. + + +
+ + +
[BHZ08b]
+
+\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. + Science of Computer Programming, 72(1-2):3-21, 2008. + + +
+ + +
[BHZ09a]
+
+\anchor BHZ09a +R. Bagnara, P. M. Hill, and E. Zaffanella. + Applications of polyhedral computations to the analysis and + verification of hardware and software systems. + Theoretical Computer Science, 2009. + To appear. + + +
+ + +
[BHZ09b]
+
+\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 http://www.cs.unipr.it/Publications/. Also + published as arXiv:cs.CG/0904.1783, available from + http://arxiv.org/. + + +
+ + +
[BHZ09c]
+
+\anchor BHZ09c +R. Bagnara, P. M. Hill, and E. Zaffanella. + Weakly-relational shapes for numeric abstractions: Improved + algorithms and proofs of correctness. + Submitted for publication, 2009. + +
+ + +
[BJT99]
+
+\anchor BJT99 +F. Besson, T. P. Jensen, and J.-P. Talpin. + Polyhedral analysis for synchronous languages. + In A. Cortesi and G. Filé, editors, Static Analysis: + Proceedings of the 6th International Symposium, volume 1694 of Lecture + Notes in Computer Science, pages 51-68, Venice, Italy, 1999. + Springer-Verlag, Berlin. + +
+ + +
[BK89]
+
+\anchor BK89 +V. Balasundaram and K. Kennedy. + A technique for summarizing data access and its use in parallelism + enhancing transformations. + In B. Knobe, editor, Proceedings of the ACM SIGPLAN'89 + Conference on Programming Language Design and Implementation (PLDI), volume + 24(7) of ACM SIGPLAN Notices, pages 41-53, Portland, Oregon, USA, + 1989. ACM Press. + +
+ + +
[BRZH02a]
+
+\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, Static Analysis: + Proceedings of the 9th International Symposium, volume 2477 of Lecture + Notes in Computer Science, pages 213-229, Madrid, Spain, 2002. + Springer-Verlag, Berlin. + + +
+ + +
[BRZH02b]
+
+\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 + http://www.cs.unipr.it/Publications/. + +
+ + +
[BRZH02c]
+
+\anchor BRZH02c +R. Bagnara, E. Ricci, E. Zaffanella, and P. M. Hill. + Errata for technical report “Quaderno 286”. + Available at http://www.cs.unipr.it/Publications/, + 2002. + See \ref BRZH02b "[BRZH02b]". + +
+ + +
[CC76]
+
+\anchor CC76 +P. Cousot and R. Cousot. + Static determination of dynamic properties of programs. + In B. Robinet, editor, Proceedings of the Second International + Symposium on Programming, pages 106-130, Paris, France, 1976. Dunod, Paris, + France. + + +
+ + +
[CC79]
+
+\anchor CC79 +P. Cousot and R. Cousot. + Systematic design of program analysis frameworks. + In Proceedings of the Sixth Annual ACM Symposium on Principles + of Programming Languages, pages 269-282, New York, 1979. ACM Press. + + +
+ + +
[CC92]
+
+\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, Proceedings of the 4th + International Symposium on Programming Language Implementation and Logic + Programming, volume 631 of Lecture Notes in Computer Science, pages + 269-295, Leuven, Belgium, 1992. Springer-Verlag, Berlin. + + +
+ + +
[CH78]
+
+\anchor CH78 +P. Cousot and N. Halbwachs. + Automatic discovery of linear restraints among variables of a + program. + In Conference Record of the Fifth Annual ACM Symposium on + Principles of Programming Languages, pages 84-96, Tucson, Arizona, 1978. + ACM Press. + + +
+ + +
[Che64]
+
+\anchor Che64 +N. V. Chernikova. + Algorithm for finding a general formula for the non-negative + solutions of system of linear equations. + U.S.S.R. Computational Mathematics and Mathematical Physics, + 4(4):151-158, 1964. + +
+ + +
[Che65]
+
+\anchor Che65 +N. V. Chernikova. + Algorithm for finding a general formula for the non-negative + solutions of system of linear inequalities. + U.S.S.R. Computational Mathematics and Mathematical Physics, + 5(2):228-233, 1965. + +
+ + +
[Che68]
+
+\anchor Che68 +N. V. Chernikova. + Algorithm for discovering the set of all solutions of a linear + programming problem. + U.S.S.R. Computational Mathematics and Mathematical Physics, + 8(6):282-293, 1968. + +
+ + +
[Dan63]
+
+\anchor Dan63 +G. B. Dantzig. + Linear Programming and Extensions. + Princeton University Press, Princeton, NJ, 1963. + +
+ + +
[FP96]
+
+\anchor FP96 +K. Fukuda and A. Prodon. + Double description method revisited. + In M. Deza, R. Euler, and Y. Manoussakis, editors, Combinatorics + and Computer Science, 8th Franco-Japanese and 4th Franco-Chinese Conference, + Brest, France, July 3-5, 1995, Selected Papers, volume 1120 of Lecture + Notes in Computer Science, pages 91-111. Springer-Verlag, Berlin, 1996. + + +
+ + +
[Fuk98]
+
+\anchor Fuk98 +K. Fukuda. + Polyhedral computation FAQ. + Swiss Federal Institute of Technology, Lausanne and Zurich, + Switzerland, available at + http://www.ifor.math.ethz.ch/~fukuda/polyfaq/polyfaq.html, 1998. + +
+ + +
[GDD+04]
+
+\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, Tools and Algorithms for + the Construction and Analysis of Systems, 10th International Conference, + TACAS 2004, volume 2988 of Lecture Notes in Computer Science, pages + 512-529, Barcelona, Spain, 2004. Springer-Verlag, Berlin. + +
+ + +
[GJ00]
+
+\anchor GJ00 +E. Gawrilow and M. Joswig. + polymake: A framework for analyzing convex polytopes. + In G. Kalai and G. M. Ziegler, editors, Polytopes - + Combinatorics and Computation, pages 43-74. Birkhäuser, 2000. + +
+ + +
[GJ01]
+
+\anchor GJ01 +E. Gawrilow and M. Joswig. + polymake: An approach to modular software design in + computational geometry. + In Proceedings of the 17th Annual Symposium on Computational + Geometry, pages 222-231, Medford, MA, USA, 2001. ACM. + +
+ + +
[GR77]
+
+\anchor GR77 +D. Goldfarb and J. K. Reid. + A practical steepest-edge simplex algorithm. + Mathematical Proramming, 12(1):361-371, 1977. + +
+ + +
[Gra91]
+
+\anchor Gra91 +P. Granger. + Static analysis of linear congruence equalities among variables of a + program. + In S. Abramsky and T. S. E. Maibaum, editors, 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), volume 493 of Lecture Notes in Computer + Science, pages 169-192, Brighton, UK, 1991. Springer-Verlag, Berlin. + +
+ + +
[Gra97]
+
+\anchor Gra97 +P. Granger. + Static analyses of congruence properties on rational numbers + (extended abstract). + In P. Van Hentenryck, editor, Static Analysis: Proceedings of + the 4th International Symposium, volume 1302 of Lecture Notes in + Computer Science, pages 278-292, Paris, France, 1997. Springer-Verlag, + Berlin. + +
+ + +
[Hal79]
+
+\anchor Hal79 +N. Halbwachs. + Détermination Automatique de Relations Linéaires + Vérifiées par les Variables d'un Programme. + Thèse de 3ème cycle d'informatique, + Université scientifique et médicale de Grenoble, Grenoble, France, March + 1979. + +
+ + +
[Hal93]
+
+\anchor Hal93 +N. Halbwachs. + Delay analysis in synchronous programs. + In C. Courcoubetis, editor, Computer Aided Verification: + Proceedings of the 5th International Conference, volume 697 of Lecture + Notes in Computer Science, pages 333-346, Elounda, Greece, 1993. + Springer-Verlag, Berlin. + +
+ + +
[HH95]
+
+\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, + Hybrid Systems II, volume 999 of Lecture Notes in Computer Science, + pages 252-264. Springer-Verlag, Berlin, 1995. + + +
+ + +
[HHL90]
+
+\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. + +
+ + +
[HKP95]
+
+\anchor HKP95 +N. Halbwachs, A. Kerbrat, and Y.-E. Proy. + POLyhedra INtegrated Environment. + Verimag, France, version 1.0 of POLINE edition, September 1995. + Documentation taken from source code. + +
+ + +
[HLW94]
+
+\anchor HLW94 +V. Van Dongen H. Le Verge and D. K. Wilde. + Loop nest synthesis using the polyhedral library. + Publication interne 830, IRISA, Campus de Beaulieu, Rennes, + France, 1994. + +
+ + +
[HMT71]
+
+\anchor HMT71 +L. Henkin, J. D. Monk, and A. Tarski. + Cylindric Algebras: Part I. + North-Holland, Amsterdam, 1971. + +
+ + +
[HPR94]
+
+\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, Static Analysis: Proceedings of the + 1st International Symposium, volume 864 of Lecture Notes in Computer + Science, pages 223-237, Namur, Belgium, 1994. Springer-Verlag, Berlin. + + +
+ + +
[HPR97]
+
+\anchor HPR97 +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. + +
+ + +
[HPWT01]
+
+\anchor HPWT01 +T. A. Henzinger, J. Preussig, and H. Wong-Toi. + Some lessons from the hytech experience. + In Proceedings of the 40th Annual Conference on Decision and + Control, pages 2887-2892. IEEE Computer Society Press, 2001. + + +
+ + +
[Jea02]
+
+\anchor Jea02 +B. Jeannet. + Convex Polyhedra Library, release 1.1.3c edition, March 2002. + Documentation of the “New Polka” library available at + http://www.irisa.fr/prive/Bertrand.Jeannet/newpolka.html. + +
+ + +
[JMSY94]
+
+\anchor JMSY94 +J. Jaffar, M. J. Maher, P. J. Stuckey, and R. H. C. Yap. + Beyond finite domains. + In A. Borning, editor, Principles and Practice of Constraint + Programming: Proceedings of the Second International Workshop, volume 874 of + Lecture Notes in Computer Science, pages 86-94, Rosario, Orcas Island, + Washington, USA, 1994. Springer-Verlag, Berlin. + +
+ + +
[KBB+06]
+
+\anchor KBBetal06 +L. Khachiyan, E. Boros, K. Borys, K. Elbassioni, and V. Gurvich. + Generating all vertices of a polyhedron is hard. + Discrete and Computational Geometry, 2006. + Invited contribution. To appear. + +
+ + +
[Kuh56]
+
+\anchor Kuh56 +H. W. Kuhn. + Solvability and consistency for linear equations and inequalities. + American Mathematical Monthly, 63:217-232, 1956. + +
+ + +
[LeV92]
+
+\anchor LeV92 +H. Le Verge. + A note on Chernikova's algorithm. + Publication interne 635, IRISA, Campus de Beaulieu, Rennes, + France, 1992. + + +
+ + +
[Loe99]
+
+\anchor Loe99 +V. Loechner. + PolyLib: A library for manipulating parameterized polyhedra. + Available at http://icps.u-strasbg.fr/~loechner/polylib/, March + 1999. + Declares itself to be a continuation of \ref Wil93 "[Wil93]". + +
+ + +
[LW97]
+
+\anchor LW97 +V. Loechner and D. K. Wilde. + Parameterized polyhedra and their vertices. + International Journal of Parallel Programming, 25(6):525-549, + 1997. + +
+ + +
[Mas92]
+
+\anchor Mas92 +F. Masdupuy. + Array operations abstraction using semantic analysis of trapezoid + congruences. + In Proceedings of the 6th ACM International Conference on + Supercomputing, pages 226-235, Washington, DC, USA, 1992. ACM Press. + +
+ + +
[Mas93]
+
+\anchor Mas93 +F. Masdupuy. + Array Indices Relational Semantic Analysis Using Rational Cosets + and Trapezoids. + Thèse d'informatique, École Polytechnique, Palaiseau, France, + December 1993. + +
+ + +
[Min01a]
+
+\anchor Min01a +A. Miné. + A new numerical abstract domain based on difference-bound matrices. + In O. Danvy and A. Filinski, editors, Proceedings of the 2nd + Symposium on Programs as Data Objects (PADO 2001), volume 2053 of + Lecture Notes in Computer Science, pages 155-172, Aarhus, Denmark, 2001. + Springer-Verlag, Berlin. + +
+ + +
[Min01b]
+
+\anchor Min01b +A. Miné. + The octagon abstract domain. + In Proceedings of the Eighth Working Conference on Reverse + Engineering (WCRE'01), pages 310-319, Stuttgart, Germany, 2001. IEEE + Computer Society Press. + +
+ + +
[Min02]
+
+\anchor Min02 +A. Miné. + A few graph-based relational numerical abstract domains. + In M. V. Hermenegildo and G. Puebla, editors, Static Analysis: + Proceedings of the 9th International Symposium, volume 2477 of Lecture + Notes in Computer Science, pages 117-132, Madrid, Spain, 2002. + Springer-Verlag, Berlin. + +
+ + +
[Min04]
+
+\anchor Min04 +A. Miné. + Relational abstract domains for the detection of floating-point + run-time errors. + In D. Schmidt, editor, Programming Languages and Systems: + Proceedings of the 13th European Symposium on Programming, volume 2986 of + Lecture Notes in Computer Science, pages 3-17, Barcelona, Spain, 2004. + Springer-Verlag, Berlin. + +
+ + +
[Min05]
+
+\anchor Min05 +A. Miné. + Weakly Relational Numerical Abstract Domains. + PhD thesis, École Polytechnique, Paris, France, March 2005. + +
+ + +
[MRTT53]
+
+\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, Contributions to the + Theory of Games - Volume II, number 28 in Annals of Mathematics Studies, + pages 51-73. Princeton University Press, Princeton, New Jersey, 1953. + +
+ + +
[NF01]
+
+\anchor NF01 +T. Nakanishi and A. Fukuda. + Modulo interval arithmetic and its application to program analysis. + Transactions of Information Processing Society of Japan, + 42(4):829-837, 2001. + +
+ + +
[NJPF99]
+
+\anchor NJPF99 +T. Nakanishi, K. Joe, C. D. Polychronopoulos, and A. Fukuda. + The modulo interval: A simple and practical representation for + program analysis. + In Proceedings of the 1999 International Conference on Parallel + Architectures and Compilation Techniques, pages 91-96, Newport Beach, + California, USA, 1999. IEEE Computer Society. + +
+ + +
[NO77]
+
+\anchor NO77 +G. Nelson and D. C. Oppen. + Fast decision algorithms based on Union and Find. + In Proceedings of the 18th Annual Symposium on Foundations of + Computer Science (FOCS'77), pages 114-119, Providence, RI, USA, 1977. IEEE + Computer Society Press. + The journal version of this paper is \ref NO80 "[NO80]". + +
+ + +
[NO80]
+
+\anchor NO80 +G. Nelson and D. C. Oppen. + Fast decision procedures based on congruence closure. + Journal of the ACM, 27(2):356-364, 1980. + An earlier version of this paper is \ref NO77 "[NO77]". + +
+ + +
[NR00]
+
+\anchor NR00 +S. P. K. Nookala and T. Risset. + A library for Z-polyhedral operations. + Publication interne 1330, IRISA, Campus de Beaulieu, Rennes, + France, 2000. + +
+ + +
[NW88]
+
+\anchor NW88 +G. L. Nemhauser and L. A. Wolsey. + Integer and Combinatorial Optimization. + Wiley Interscience Series in Discrete Mathematics and Optimization. + John Wiley & Sons, 1988. + +
+ + +
[Pra77]
+
+\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. + +
+ + +
[PS98]
+
+\anchor PS98 +C. H. Papadimitriou and K. Steiglitz. + Combinatorial Optimization: Algorithms and Complexity. + Dover Publications, second edition, 1998. + +
+ + +
[QRR96]
+
+\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. + +
+ + +
[QRR97]
+
+\anchor QRR97 +P. Quinton, S. Rajopadhye, and T. Risset. + On manipulating Z-polyhedra using a canonic representation. + Parallel Processing Letters, 7(2):181-194, 1997. + +
+ + +
[QRW00]
+
+\anchor QRW00 +F. Quilleré, S. V. Rajopadhye, and D. Wilde. + Generation of efficient nested loops from polyhedra. + International Journal of Parallel Programming, 28(5):469-498, + 2000. + +
+ + +
[RBL06]
+
+\anchor RBL06 +T. W. Reps, G. Balakrishnan, and J. Lim. + Intermediate-representation recovery from low-level code. + In J. Hatcliff and F. Tip, editors, Proceedings of the 2006 ACM + SIGPLAN Workshop on Partial Evaluation and Semantics-based Program + Manipulation, pages 100-111, Charleston, South Carolina, USA, 2006. ACM + Press. + +
+ + +
[Ric02]
+
+\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. + + +
+ + +
[Sch99]
+
+\anchor Sch99 +A. Schrijver. + Theory of Linear and Integer Programming. + Wiley Interscience Series in Discrete Mathematics and Optimization. + John Wiley & Sons, 1999. + +
+ + +
[Sho81]
+
+\anchor Sho81 +R. E. Shostak. + Deciding linear inequalities by computing loop residues. + Journal of the ACM, 28(4):769-779, 1981. + +
+ + +
[SK07]
+
+\anchor SK07 +A. Simon and A. King. + Taming the wrapping of integer arithmetic. + In H. Riis Nielson and G. Filé, editors, Static Analysis: + Proceedings of the 14th International Symposium, volume 4634 of Lecture + Notes in Computer Science, pages 121-136, Kongens Lyngby, Denmark, 2007. + Springer-Verlag, Berlin. + +
+ + +
[Sri93]
+
+\anchor Sri93 +D. Srivastava. + Subsumption and indexing in constraint query languages with linear + arithmetic constraints. + Annals of Mathematics and Artificial Intelligence, + 8(3-4):315-343, 1993. + + +
+ + +
[SS07]
+
+\anchor SS07 +R. Sen and Y. N. Srikant. + Executable analysis using abstract interpretation with circular + linear progressions. + In Proceedings of the 5th IEEE/ACM International Conference on + Formal Methods and Models for Co-Design (MEMOCODE 2007), pages 39-48, Nice, + France, 2007. IEEE Computer Society Press. + +
+ + +
[SW70]
+
+\anchor SW70 +J. Stoer and C. Witzgall. + Convexity and Optimization in Finite Dimensions I. + Springer-Verlag, Berlin, 1970. + +
+ + +
[War03]
+
+\anchor War03 +H. S. Warren, Jr. + Hacker's Delight. + Addison-Wesley Longman Publishing Co., Inc., Boston, MA, USA, 2003. + +
+ + +
[Wey35]
+
+\anchor Wey35 +H. Weyl. + Elementare theorie der konvexen polyeder. + Commentarii Mathematici Helvetici, 7:290-306, 1935. + English translation in \ref Wey50 "[Wey50]". + +
+ + +
[Wey50]
+
+\anchor Wey50 +H. Weyl. + The elementary theory of convex polyhedra. + In H. W. Kuhn, editor, Contributions to the Theory of Games - + Volume I, number 24 in Annals of Mathematics Studies, pages 3-18. Princeton + University Press, Princeton, New Jersey, 1950. + Translated from \ref Wey35 "[Wey35]" by H. W. Kuhn. + +
+ + +
[Wil93]
+
+\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 Publication interne 785, Rennes, + France, 1993. + + +
+
+ + +\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 linearly independent 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. + +Proposition + +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 rank of \f$A\f$ and is denoted by +\f$\prank(A)\f$. + +Proposition + +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 vertices of \f$\cP\f$; +- \f$R\f$ is the set of all extreme 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). + +Proposition + +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 cone 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 polyhedral cone. + +A polyhedral cone is either pointed, +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 lineality space 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 +corresponding polyhedral cone for \f$\cP\f$. + +The (\f$m+1\f$)'st row +\f$(\vect{0}^\transpose, 1)\f$ +represents the positivity constraint \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 +double description 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 PPL representation of a polyhedra, +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 valid +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 dependent upon them; + the dependent equality is called redundant. + A system containing no redundant equality is called independent. +-# In a system of inequalities, an inequality is said to be redundant + 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 irredundant if + \f$L\f$ is a set of linearly independent lines; and +-# a ray \f$\vect{r}_1\in R\f$ is redundant + 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 face of \f$\cP\f$ and we say that the inequality +represents \f$F\f$. +A face \f$F\f$ is said to be proper 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$ supports +\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 minimal proper face 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 facet (or maximal proper +face) 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$. + +Proposition + +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. + +Proposition + +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 minimal proper face 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 extremal ray + 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 ray space 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$ saturates the inequality + if \f$\langle \vect{a}, \vect{r} \rangle = 0\f$; +- \f$r\f$ verifies the inequality + if \f$\langle \vect{a}, \vect{r} \rangle > 0\f$; +- \f$r\f$ violates 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$ saturates the equality +if \f$\langle \vect{a}, \vect{r} \rangle = 0\f$; +- \f$\vect{r}\f$ does not verify the equality +if \f$\langle \vect{a}, \vect{r} \rangle \neq 0\f$. + +A constraint (i.e., an equality or an inequality) is +satisfied by a ray if the ray saturates or verifies the constraint. + +Proposition + +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 saturation matrix 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 (sat_g), +and one (that is the transposed version of the previous one) having +rows indexed by generators and columns indexed by constraints (sat_c). + +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. + +Proposition + +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 adjacent rays 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 odd 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)]. + +Proposition A +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. + +Lemma 1 +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$. + +Proof +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. + +Lemma 2 +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$. + +Proof +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$. + + +Lemma 3 +For \f$x\f$, \f$y \in \Zset\f$ with \f$y \ne 0\f$, we have +\f[ + x \brem y + = + \begin{cases} + x \brem |y|, & \text{if $x \ge 0$;} \\ + -(|x| \brem |y|), & \text{if $x < 0$.} + \end{cases} +\f] + +Proof +Throughout the proof we write \f$x_0 = |x|\f$ and \f$y_0 = |y|\f$. +First, assume that \f$x \ge 0\f$ and that \f$y < 0\f$. +Let \f$k = \phi(x / y_0) = - \phi(x / y)\f$, by the property above. +We have +\f[ + x \brem y + = + x - (x \bdiv y) y + = + x - (-k) y + = + x - k (-y) + = + x - k y_0. +\f] +Next, assume that \f$x < 0\f$ and that \f$y < 0\f$. +Let \f$k = \phi(x_0 / y_0) = \phi(x / y)\f$. +We have +\f[ + x \brem y + = + x - (x \bdiv y) y + = + x - k y + = + -( -x - k (-y)) + = + -(x_0 - k y_0). +\f] +Finally, assume that \f$x < 0\f$ and that \f$y > 0\f$. +Let \f$k = \phi(x_0 / y) = -\phi(x / y)\f$, again by the property above. +We have +\f[ + x \brem y + = + x - (x \bdiv y) y + = + x - (-k) y + = + -( -x - k y) + = + -(x_0 - k y). +\f] +This completes the proof. + +Lemma 4 +If \f$x\f$, \f$y \in F_b^+\f$ then \f$\gcd(x, y) \in F_b^+\f$. + +Proof +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$. + +Lemma 5 +If \f$x\f$, \f$y \in F_b^+\f$, then \f$x / \gcd(x, y) \in F_b^+\f$. + +Proof +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..0cdc6f4 --- /dev/null +++ b/doc/devref-language-interface.doxyconf.in @@ -0,0 +1,255 @@ +# Doxyfile 1.5.7.1 + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +DOXYFILE_ENCODING = UTF-8 +PROJECT_NAME = "PPL Language Interface" +PROJECT_NUMBER = @VERSION@ +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 = +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = NO +OPTIMIZE_FOR_FORTRAN = NO +OPTIMIZE_OUTPUT_VHDL = NO +BUILTIN_STL_SUPPORT = NO +CPP_CLI_SUPPORT = NO +SIP_SUPPORT = NO +IDL_PROPERTY_SUPPORT = YES +DISTRIBUTE_GROUP_DOC = NO +SUBGROUPING = YES +TYPEDEF_HIDES_STRUCT = NO +SYMBOL_CACHE_SIZE = 0 +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = YES +EXTRACT_PRIVATE = YES +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 +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_GROUP_NAMES = NO +SORT_BY_SCOPE_NAME = 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_DIRECTORIES = NO +SHOW_FILES = YES +SHOW_NAMESPACES = YES +FILE_VERSION_FILTER = +LAYOUT_FILE = +#--------------------------------------------------------------------------- +# 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 = +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 +#--------------------------------------------------------------------------- +# 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 = +HTML_OUTPUT = ppl-devref--@VERSION@-html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +HTML_DYNAMIC_SECTIONS = NO +GENERATE_DOCSET = NO +DOCSET_FEEDNAME = "Doxygen generated docs" +DOCSET_BUNDLE_ID = org.doxygen.Project +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 +QHG_LOCATION = +DISABLE_INDEX = NO +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = YES +TREEVIEW_WIDTH = 250 +FORMULA_FONTSIZE = 10 +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = +LATEX_OUTPUT = devref-.latex-dir +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = YES +PAPER_TYPE = a4wide +EXTRA_PACKAGES = ppl +LATEX_HEADER = devref-.tex +PDF_HYPERLINKS = YES +USE_PDFLATEX = YES +LATEX_BATCHMODE = YES +LATEX_HIDE_INDICES = NO +#--------------------------------------------------------------------------- +# 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 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 \ + PPL_PROTO(protos):=protos +EXPAND_AS_DEFINED = DECLARE_CONVERSIONS \ + CATCH_ALL +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = @PERL@ +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = YES +MSCGEN_PATH = +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = YES +DOT_FONTNAME = FreeSans +DOT_FONTSIZE = 10 +DOT_FONTPATH = +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +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 +DOT_PATH = +DOTFILE_DIRS = +DOT_GRAPH_MAX_NODES = 50 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO diff --git a/doc/devref-language-interface.tex b/doc/devref-language-interface.tex new file mode 100644 index 0000000..691d1ca --- /dev/null +++ b/doc/devref-language-interface.tex @@ -0,0 +1,135 @@ +% Copyright (C) 2001--2009 Roberto Bagnara +% +% This document describes the Parma Polyhedra Library (PPL). +% +% Permission is granted to copy, distribute and/or modify this document +% under the terms of the GNU Free Documentation License, Version 1.2 +% or any later version published by the Free Software Foundation; +% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. +% The license is included, in various formats, in the `doc' subdirectory +% of each distribution of the PPL in files called `fdl.*'. +% +% The PPL is free software; you can redistribute it and/or modify it +% under the terms of the GNU General Public License as published by the +% Free Software Foundation; either version 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 are called `gpl.*'. +% +% The PPL is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +% for more details. +% +% For the most up-to-date information see the Parma Polyhedra Library +% site: http://www.cs.unipr.it/ppl/ . + +\documentclass[a4paper]{article} +\usepackage{a4wide} +\usepackage{makeidx} +\usepackage{fancyhdr} +\usepackage{graphicx} +\usepackage{multicol} +\usepackage{float} +\usepackage{textcomp} +\usepackage{alltt} +\usepackage{times} +\usepackage{ifpdf} +\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} + +\rfoot[\fancyplain{}{\scriptsize The Parma Polyhedra Library Language Interface Developer's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}]{} +\lfoot[]{\fancyplain{}{\scriptsize The Parma Polyhedra Library Language Interface Developer's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}} + +\begin{document} +\title{ +The Parma Polyhedra Library \\ + Language Interface \\ +Developer's Manual\thanks{This work + has been partly supported by: + University of Parma's FIL scientific research project (ex 60\%) + ``Pure and Applied Mathematics''; + MURST project + ``Automatic Program Certification by Abstract Interpretation''; + MURST project + ``Abstract Interpretation, Type Systems and Control-Flow Analysis''; + MURST project + ``Automatic Aggregate- and Number-Reasoning for Computing: from + Decision Algorithms to Constraint Programming with Multisets, + Sets, and Maps''; + MURST project + ``Constraint Based Verification of Reactive Systems''; + MURST project + ``Abstract Interpretation: Design and Applications''; + EPSRC project + ``Numerical Domains for Software Analysis''; + EPSRC project + ``Geometric Abstractions for Scalable Program Analyzers''. + } \\ +(version $projectnumber) +} +\author{ +Roberto Bagnara\thanks{bagnara@cs.unipr.it, + Department of Mathematics, University of Parma, Italy.} \\ +Patricia M. Hill\thanks{hill@comp.leeds.ac.uk, + School of Computing, University of Leeds, U.K.} \\ +Enea Zaffanella\thanks{zaffanella@cs.unipr.it, + Department of Mathematics, University of Parma, Italy.} +} +\maketitle + +\newpage +Copyright \copyright\ 2001--2009 Roberto Bagnara (bagnara@cs.unipr.it). + +This document describes the Parma Polyhedra Library (PPL). + +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.2 +or any later version published by the +\href{http://www.fsf.org}{Free Software Foundation}; +with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. +A copy of the license is included in the section entitled +``\hyperlink{GFDL_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. + +For the most up-to-date information see the Parma Polyhedra Library +site: +\begin{center} +\href{http://www.cs.unipr.it/ppl/}{\tt http://www.cs.unipr.it/ppl/} +\end{center} + +\pagenumbering{roman} +\tableofcontents +\pagenumbering{arabic} diff --git a/doc/devref.doxyconf-html.in b/doc/devref.doxyconf-html.in new file mode 100644 index 0000000..e0a297d --- /dev/null +++ b/doc/devref.doxyconf-html.in @@ -0,0 +1,486 @@ +# Doxyfile 1.5.7.1 + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +DOXYFILE_ENCODING = UTF-8 +PROJECT_NAME = PPL +PROJECT_NUMBER = @VERSION@ +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 = +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = NO +OPTIMIZE_FOR_FORTRAN = NO +OPTIMIZE_OUTPUT_VHDL = NO +BUILTIN_STL_SUPPORT = NO +CPP_CLI_SUPPORT = NO +SIP_SUPPORT = NO +IDL_PROPERTY_SUPPORT = YES +DISTRIBUTE_GROUP_DOC = NO +SUBGROUPING = YES +TYPEDEF_HIDES_STRUCT = NO +SYMBOL_CACHE_SIZE = 0 +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = YES +EXTRACT_PRIVATE = YES +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 +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_GROUP_NAMES = NO +SORT_BY_SCOPE_NAME = 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_DIRECTORIES = NO +SHOW_FILES = YES +SHOW_NAMESPACES = YES +FILE_VERSION_FILTER = +LAYOUT_FILE = +#--------------------------------------------------------------------------- +# 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 \ + @srcdir@/../src/namespaces.hh \ + ../src/version.hh \ + @srcdir@/../src/version.cc \ + @srcdir@/../src/meta_programming.hh \ + @srcdir@/../src/Float.defs.hh \ + @srcdir@/../src/Float.inlines.hh \ + @srcdir@/../src/Float.cc \ + @srcdir@/../src/Checked_Number.types.hh \ + @srcdir@/../src/Checked_Number.defs.hh \ + @srcdir@/../src/Checked_Number.inlines.hh \ + @srcdir@/../src/Checked_Number.cc \ + @srcdir@/../src/GMP_Integer.types.hh \ + @srcdir@/../src/GMP_Integer.defs.hh \ + @srcdir@/../src/GMP_Integer.inlines.hh \ + @srcdir@/../src/Coefficient_traits_template.hh \ + @srcdir@/../src/Coefficient.types.hh \ + @srcdir@/../src/Coefficient.defs.hh \ + @srcdir@/../src/Coefficient.inlines.hh \ + @srcdir@/../src/Coefficient.cc \ + @srcdir@/../src/checked.defs.hh \ + @srcdir@/../src/checked.inlines.hh \ + @srcdir@/../src/checked_float.inlines.hh \ + @srcdir@/../src/checked_int.inlines.hh \ + @srcdir@/../src/checked_mpq.inlines.hh \ + @srcdir@/../src/checked_mpz.inlines.hh \ + @srcdir@/../src/checked.cc \ + @srcdir@/../src/Init.types.hh \ + @srcdir@/../src/Init.defs.hh \ + @srcdir@/../src/Init.inlines.hh \ + @srcdir@/../src/Init.cc \ + @srcdir@/../src/initializer.hh \ + @srcdir@/../src/globals.types.hh \ + @srcdir@/../src/globals.defs.hh \ + @srcdir@/../src/globals.inlines.hh \ + @srcdir@/../src/globals.cc \ + @srcdir@/../src/math_utilities.defs.hh \ + @srcdir@/../src/math_utilities.inlines.hh \ + @srcdir@/../src/distances.types.hh \ + @srcdir@/../src/distances.defs.hh \ + @srcdir@/../src/distances.inlines.hh \ + @srcdir@/../src/stdiobuf.types.hh \ + @srcdir@/../src/stdiobuf.defs.hh \ + @srcdir@/../src/stdiobuf.inlines.hh \ + @srcdir@/../src/stdiobuf.cc \ + @srcdir@/../src/Topology.hh \ + @srcdir@/../src/Row.types.hh \ + @srcdir@/../src/Row.defs.hh \ + @srcdir@/../src/Row.inlines.hh \ + @srcdir@/../src/Row.cc \ + @srcdir@/../src/Matrix.types.hh \ + @srcdir@/../src/Matrix.defs.hh \ + @srcdir@/../src/Matrix.inlines.hh \ + @srcdir@/../src/Matrix.cc \ + @srcdir@/../src/Linear_Row.types.hh \ + @srcdir@/../src/Linear_Row.defs.hh \ + @srcdir@/../src/Linear_Row.inlines.hh \ + @srcdir@/../src/Linear_Row.cc \ + @srcdir@/../src/Linear_System.types.hh \ + @srcdir@/../src/Linear_System.defs.hh \ + @srcdir@/../src/Linear_System.inlines.hh \ + @srcdir@/../src/Linear_System.cc \ + @srcdir@/../src/MIP_Problem.types.hh \ + @srcdir@/../src/MIP_Problem.defs.hh \ + @srcdir@/../src/MIP_Problem.inlines.hh \ + @srcdir@/../src/MIP_Problem.cc \ + @srcdir@/../src/Bit_Row.types.hh \ + @srcdir@/../src/Bit_Row.defs.hh \ + @srcdir@/../src/Bit_Row.inlines.hh \ + @srcdir@/../src/Bit_Row.cc \ + @srcdir@/../src/Bit_Matrix.types.hh \ + @srcdir@/../src/Bit_Matrix.defs.hh \ + @srcdir@/../src/Bit_Matrix.inlines.hh \ + @srcdir@/../src/Bit_Matrix.cc \ + @srcdir@/../src/Variable.types.hh \ + @srcdir@/../src/Variable.defs.hh \ + @srcdir@/../src/Variable.inlines.hh \ + @srcdir@/../src/Variable.cc \ + @srcdir@/../src/Variables_Set.types.hh \ + @srcdir@/../src/Variables_Set.defs.hh \ + @srcdir@/../src/Variables_Set.inlines.hh \ + @srcdir@/../src/Variables_Set.cc \ + @srcdir@/../src/Linear_Expression.types.hh \ + @srcdir@/../src/Linear_Expression.defs.hh \ + @srcdir@/../src/Linear_Expression.inlines.hh \ + @srcdir@/../src/Linear_Expression.cc \ + @srcdir@/../src/Constraint.types.hh \ + @srcdir@/../src/Constraint.defs.hh \ + @srcdir@/../src/Constraint.inlines.hh \ + @srcdir@/../src/Constraint.cc \ + @srcdir@/../src/Congruence.types.hh \ + @srcdir@/../src/Congruence.defs.hh \ + @srcdir@/../src/Congruence.inlines.hh \ + @srcdir@/../src/Congruence.cc \ + @srcdir@/../src/Generator.types.hh \ + @srcdir@/../src/Generator.defs.hh \ + @srcdir@/../src/Generator.inlines.hh \ + @srcdir@/../src/Generator.cc \ + @srcdir@/../src/Grid_Generator.types.hh \ + @srcdir@/../src/Grid_Generator.defs.hh \ + @srcdir@/../src/Grid_Generator.inlines.hh \ + @srcdir@/../src/Grid_Generator.cc \ + @srcdir@/../src/Constraint_System.types.hh \ + @srcdir@/../src/Constraint_System.defs.hh \ + @srcdir@/../src/Constraint_System.inlines.hh \ + @srcdir@/../src/Constraint_System.cc \ + @srcdir@/../src/Congruence_System.types.hh \ + @srcdir@/../src/Congruence_System.defs.hh \ + @srcdir@/../src/Congruence_System.inlines.hh \ + @srcdir@/../src/Congruence_System.cc \ + @srcdir@/../src/Generator_System.defs.hh \ + @srcdir@/../src/Generator_System.types.hh \ + @srcdir@/../src/Generator_System.inlines.hh \ + @srcdir@/../src/Generator_System.cc \ + @srcdir@/../src/Grid_Generator_System.defs.hh \ + @srcdir@/../src/Grid_Generator_System.types.hh \ + @srcdir@/../src/Grid_Generator_System.inlines.hh \ + @srcdir@/../src/Grid_Generator_System.cc \ + @srcdir@/../src/Scalar_Products.types.hh \ + @srcdir@/../src/Scalar_Products.defs.hh \ + @srcdir@/../src/Scalar_Products.inlines.hh \ + @srcdir@/../src/Scalar_Products.cc \ + @srcdir@/../src/Ph_Status.idefs.hh \ + @srcdir@/../src/Ph_Status.inlines.hh \ + @srcdir@/../src/Ph_Status.cc \ + @srcdir@/../src/Polyhedron.types.hh \ + @srcdir@/../src/Polyhedron.defs.hh \ + @srcdir@/../src/Polyhedron.inlines.hh \ + @srcdir@/../src/Polyhedron.templates.hh \ + @srcdir@/../src/Polyhedron_public.cc \ + @srcdir@/../src/Polyhedron_nonpublic.cc \ + @srcdir@/../src/Polyhedron_widenings.cc \ + @srcdir@/../src/Polyhedron_chdims.cc \ + @srcdir@/../src/conversion.cc \ + @srcdir@/../src/minimize.cc \ + @srcdir@/../src/simplify.cc \ + @srcdir@/../src/Grid.types.hh \ + @srcdir@/../src/Grid.defs.hh \ + @srcdir@/../src/Grid.inlines.hh \ + @srcdir@/../src/Grid.templates.hh \ + @srcdir@/../src/Grid_public.cc \ + @srcdir@/../src/Grid_nonpublic.cc \ + @srcdir@/../src/Grid_conversion.cc \ + @srcdir@/../src/Grid_simplify.cc \ + @srcdir@/../src/Grid_widenings.cc \ + @srcdir@/../src/Grid_chdims.cc \ + @srcdir@/../src/Poly_Con_Relation.types.hh \ + @srcdir@/../src/Poly_Con_Relation.defs.hh \ + @srcdir@/../src/Poly_Con_Relation.inlines.hh \ + @srcdir@/../src/Poly_Con_Relation.cc \ + @srcdir@/../src/Poly_Gen_Relation.types.hh \ + @srcdir@/../src/Poly_Gen_Relation.defs.hh \ + @srcdir@/../src/Poly_Gen_Relation.inlines.hh \ + @srcdir@/../src/Poly_Gen_Relation.cc \ + @srcdir@/../src/Interval_Restriction.defs.hh \ + @srcdir@/../src/Interval_Info.types.hh \ + @srcdir@/../src/Interval_Info.defs.hh \ + @srcdir@/../src/Interval_Info.inlines.hh \ + @srcdir@/../src/Interval.types.hh \ + @srcdir@/../src/Interval.defs.hh \ + @srcdir@/../src/Interval.inlines.hh \ + @srcdir@/../src/C_Polyhedron.types.hh \ + @srcdir@/../src/C_Polyhedron.defs.hh \ + @srcdir@/../src/C_Polyhedron.inlines.hh \ + @srcdir@/../src/C_Polyhedron.cc \ + @srcdir@/../src/NNC_Polyhedron.types.hh \ + @srcdir@/../src/NNC_Polyhedron.defs.hh \ + @srcdir@/../src/NNC_Polyhedron.inlines.hh \ + @srcdir@/../src/NNC_Polyhedron.cc \ + @srcdir@/../src/Widening_Function.types.hh \ + @srcdir@/../src/Widening_Function.defs.hh \ + @srcdir@/../src/Widening_Function.inlines.hh \ + @srcdir@/../src/BHRZ03_Certificate.types.hh \ + @srcdir@/../src/BHRZ03_Certificate.defs.hh \ + @srcdir@/../src/BHRZ03_Certificate.inlines.hh \ + @srcdir@/../src/BHRZ03_Certificate.cc \ + @srcdir@/../src/H79_Certificate.types.hh \ + @srcdir@/../src/H79_Certificate.defs.hh \ + @srcdir@/../src/H79_Certificate.inlines.hh \ + @srcdir@/../src/H79_Certificate.cc \ + @srcdir@/../src/Grid_Certificate.types.hh \ + @srcdir@/../src/Grid_Certificate.defs.hh \ + @srcdir@/../src/Grid_Certificate.inlines.hh \ + @srcdir@/../src/Grid_Certificate.cc \ + @srcdir@/../src/Determinate.defs.hh \ + @srcdir@/../src/Determinate.inlines.hh \ + @srcdir@/../src/iterator_to_const.types.hh \ + @srcdir@/../src/iterator_to_const.defs.hh \ + @srcdir@/../src/iterator_to_const.inlines.hh \ + @srcdir@/../src/Powerset.types.hh \ + @srcdir@/../src/Powerset.defs.hh \ + @srcdir@/../src/Powerset.inlines.hh \ + @srcdir@/../src/Powerset.templates.hh \ + @srcdir@/../src/Pointset_Powerset.types.hh \ + @srcdir@/../src/Pointset_Powerset.defs.hh \ + @srcdir@/../src/Pointset_Powerset.inlines.hh \ + @srcdir@/../src/Pointset_Powerset.templates.hh \ + @srcdir@/../src/Pointset_Powerset.cc \ + @srcdir@/../src/Partially_Reduced_Product.types.hh \ + @srcdir@/../src/Partially_Reduced_Product.defs.hh \ + @srcdir@/../src/Partially_Reduced_Product.inlines.hh \ + @srcdir@/../src/Partially_Reduced_Product.templates.hh \ + @srcdir@/../src/algorithms.hh \ + @srcdir@/../src/Box.types.hh \ + @srcdir@/../src/Box.defs.hh \ + @srcdir@/../src/Box.inlines.hh \ + @srcdir@/../src/Box.templates.hh \ + @srcdir@/../src/Box.cc \ + @srcdir@/../src/DB_Row.types.hh \ + @srcdir@/../src/DB_Row.defs.hh \ + @srcdir@/../src/DB_Row.inlines.hh \ + @srcdir@/../src/DB_Row.templates.hh \ + @srcdir@/../src/DB_Matrix.types.hh \ + @srcdir@/../src/DB_Matrix.defs.hh \ + @srcdir@/../src/DB_Matrix.inlines.hh \ + @srcdir@/../src/DB_Matrix.templates.hh \ + @srcdir@/../src/BD_Shape.types.hh \ + @srcdir@/../src/BD_Shape.defs.hh \ + @srcdir@/../src/BD_Shape.inlines.hh \ + @srcdir@/../src/BD_Shape.templates.hh \ + @srcdir@/../src/BD_Shape.cc \ + @srcdir@/../src/OR_Matrix.types.hh \ + @srcdir@/../src/OR_Matrix.defs.hh \ + @srcdir@/../src/OR_Matrix.inlines.hh \ + @srcdir@/../src/OR_Matrix.templates.hh \ + @srcdir@/../src/Octagonal_Shape.types.hh \ + @srcdir@/../src/Octagonal_Shape.defs.hh \ + @srcdir@/../src/Octagonal_Shape.inlines.hh \ + @srcdir@/../src/Octagonal_Shape.templates.hh \ + @srcdir@/../src/Octagonal_Shape.cc \ + @srcdir@/gpl.dox \ + @srcdir@/fdl.dox +INPUT_ENCODING = UTF-8 +FILE_PATTERNS = *.hh \ + *.cc \ + *.dox +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 +#--------------------------------------------------------------------------- +# 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-@VERSION@-html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +HTML_DYNAMIC_SECTIONS = NO +GENERATE_DOCSET = NO +DOCSET_FEEDNAME = "Doxygen generated docs" +DOCSET_BUNDLE_ID = org.doxygen.Project +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 +QHG_LOCATION = +DISABLE_INDEX = NO +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = YES +TREEVIEW_WIDTH = 250 +FORMULA_FONTSIZE = 10 +#--------------------------------------------------------------------------- +# 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 +PDF_HYPERLINKS = YES +USE_PDFLATEX = YES +LATEX_BATCHMODE = YES +LATEX_HIDE_INDICES = NO +#--------------------------------------------------------------------------- +# 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 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 +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = ppl-devref-@VERSION@-html.tag +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = @PERL@ +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = YES +MSCGEN_PATH = +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = YES +DOT_FONTNAME = FreeSans +DOT_FONTSIZE = 10 +DOT_FONTPATH = +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +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 +DOT_PATH = +DOTFILE_DIRS = +DOT_GRAPH_MAX_NODES = 50 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO diff --git a/doc/devref.doxyconf-latex.in b/doc/devref.doxyconf-latex.in new file mode 100644 index 0000000..7c24163 --- /dev/null +++ b/doc/devref.doxyconf-latex.in @@ -0,0 +1,486 @@ +# Doxyfile 1.5.7.1 + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +DOXYFILE_ENCODING = UTF-8 +PROJECT_NAME = PPL +PROJECT_NUMBER = @VERSION@ +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 = +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = NO +OPTIMIZE_FOR_FORTRAN = NO +OPTIMIZE_OUTPUT_VHDL = NO +BUILTIN_STL_SUPPORT = NO +CPP_CLI_SUPPORT = NO +SIP_SUPPORT = NO +IDL_PROPERTY_SUPPORT = YES +DISTRIBUTE_GROUP_DOC = NO +SUBGROUPING = YES +TYPEDEF_HIDES_STRUCT = NO +SYMBOL_CACHE_SIZE = 0 +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = YES +EXTRACT_PRIVATE = YES +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 +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_GROUP_NAMES = NO +SORT_BY_SCOPE_NAME = 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_DIRECTORIES = NO +SHOW_FILES = YES +SHOW_NAMESPACES = YES +FILE_VERSION_FILTER = +LAYOUT_FILE = +#--------------------------------------------------------------------------- +# 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 \ + @srcdir@/../src/namespaces.hh \ + ../src/version.hh \ + @srcdir@/../src/version.cc \ + @srcdir@/../src/meta_programming.hh \ + @srcdir@/../src/Float.defs.hh \ + @srcdir@/../src/Float.inlines.hh \ + @srcdir@/../src/Float.cc \ + @srcdir@/../src/Checked_Number.types.hh \ + @srcdir@/../src/Checked_Number.defs.hh \ + @srcdir@/../src/Checked_Number.inlines.hh \ + @srcdir@/../src/Checked_Number.cc \ + @srcdir@/../src/GMP_Integer.types.hh \ + @srcdir@/../src/GMP_Integer.defs.hh \ + @srcdir@/../src/GMP_Integer.inlines.hh \ + @srcdir@/../src/Coefficient_traits_template.hh \ + @srcdir@/../src/Coefficient.types.hh \ + @srcdir@/../src/Coefficient.defs.hh \ + @srcdir@/../src/Coefficient.inlines.hh \ + @srcdir@/../src/Coefficient.cc \ + @srcdir@/../src/checked.defs.hh \ + @srcdir@/../src/checked.inlines.hh \ + @srcdir@/../src/checked_float.inlines.hh \ + @srcdir@/../src/checked_int.inlines.hh \ + @srcdir@/../src/checked_mpq.inlines.hh \ + @srcdir@/../src/checked_mpz.inlines.hh \ + @srcdir@/../src/checked.cc \ + @srcdir@/../src/Init.types.hh \ + @srcdir@/../src/Init.defs.hh \ + @srcdir@/../src/Init.inlines.hh \ + @srcdir@/../src/Init.cc \ + @srcdir@/../src/initializer.hh \ + @srcdir@/../src/globals.types.hh \ + @srcdir@/../src/globals.defs.hh \ + @srcdir@/../src/globals.inlines.hh \ + @srcdir@/../src/globals.cc \ + @srcdir@/../src/math_utilities.defs.hh \ + @srcdir@/../src/math_utilities.inlines.hh \ + @srcdir@/../src/distances.types.hh \ + @srcdir@/../src/distances.defs.hh \ + @srcdir@/../src/distances.inlines.hh \ + @srcdir@/../src/stdiobuf.types.hh \ + @srcdir@/../src/stdiobuf.defs.hh \ + @srcdir@/../src/stdiobuf.inlines.hh \ + @srcdir@/../src/stdiobuf.cc \ + @srcdir@/../src/Topology.hh \ + @srcdir@/../src/Row.types.hh \ + @srcdir@/../src/Row.defs.hh \ + @srcdir@/../src/Row.inlines.hh \ + @srcdir@/../src/Row.cc \ + @srcdir@/../src/Matrix.types.hh \ + @srcdir@/../src/Matrix.defs.hh \ + @srcdir@/../src/Matrix.inlines.hh \ + @srcdir@/../src/Matrix.cc \ + @srcdir@/../src/Linear_Row.types.hh \ + @srcdir@/../src/Linear_Row.defs.hh \ + @srcdir@/../src/Linear_Row.inlines.hh \ + @srcdir@/../src/Linear_Row.cc \ + @srcdir@/../src/Linear_System.types.hh \ + @srcdir@/../src/Linear_System.defs.hh \ + @srcdir@/../src/Linear_System.inlines.hh \ + @srcdir@/../src/Linear_System.cc \ + @srcdir@/../src/MIP_Problem.types.hh \ + @srcdir@/../src/MIP_Problem.defs.hh \ + @srcdir@/../src/MIP_Problem.inlines.hh \ + @srcdir@/../src/MIP_Problem.cc \ + @srcdir@/../src/Bit_Row.types.hh \ + @srcdir@/../src/Bit_Row.defs.hh \ + @srcdir@/../src/Bit_Row.inlines.hh \ + @srcdir@/../src/Bit_Row.cc \ + @srcdir@/../src/Bit_Matrix.types.hh \ + @srcdir@/../src/Bit_Matrix.defs.hh \ + @srcdir@/../src/Bit_Matrix.inlines.hh \ + @srcdir@/../src/Bit_Matrix.cc \ + @srcdir@/../src/Variable.types.hh \ + @srcdir@/../src/Variable.defs.hh \ + @srcdir@/../src/Variable.inlines.hh \ + @srcdir@/../src/Variable.cc \ + @srcdir@/../src/Variables_Set.types.hh \ + @srcdir@/../src/Variables_Set.defs.hh \ + @srcdir@/../src/Variables_Set.inlines.hh \ + @srcdir@/../src/Variables_Set.cc \ + @srcdir@/../src/Linear_Expression.types.hh \ + @srcdir@/../src/Linear_Expression.defs.hh \ + @srcdir@/../src/Linear_Expression.inlines.hh \ + @srcdir@/../src/Linear_Expression.cc \ + @srcdir@/../src/Constraint.types.hh \ + @srcdir@/../src/Constraint.defs.hh \ + @srcdir@/../src/Constraint.inlines.hh \ + @srcdir@/../src/Constraint.cc \ + @srcdir@/../src/Congruence.types.hh \ + @srcdir@/../src/Congruence.defs.hh \ + @srcdir@/../src/Congruence.inlines.hh \ + @srcdir@/../src/Congruence.cc \ + @srcdir@/../src/Generator.types.hh \ + @srcdir@/../src/Generator.defs.hh \ + @srcdir@/../src/Generator.inlines.hh \ + @srcdir@/../src/Generator.cc \ + @srcdir@/../src/Grid_Generator.types.hh \ + @srcdir@/../src/Grid_Generator.defs.hh \ + @srcdir@/../src/Grid_Generator.inlines.hh \ + @srcdir@/../src/Grid_Generator.cc \ + @srcdir@/../src/Constraint_System.types.hh \ + @srcdir@/../src/Constraint_System.defs.hh \ + @srcdir@/../src/Constraint_System.inlines.hh \ + @srcdir@/../src/Constraint_System.cc \ + @srcdir@/../src/Congruence_System.types.hh \ + @srcdir@/../src/Congruence_System.defs.hh \ + @srcdir@/../src/Congruence_System.inlines.hh \ + @srcdir@/../src/Congruence_System.cc \ + @srcdir@/../src/Generator_System.defs.hh \ + @srcdir@/../src/Generator_System.types.hh \ + @srcdir@/../src/Generator_System.inlines.hh \ + @srcdir@/../src/Generator_System.cc \ + @srcdir@/../src/Grid_Generator_System.defs.hh \ + @srcdir@/../src/Grid_Generator_System.types.hh \ + @srcdir@/../src/Grid_Generator_System.inlines.hh \ + @srcdir@/../src/Grid_Generator_System.cc \ + @srcdir@/../src/Scalar_Products.types.hh \ + @srcdir@/../src/Scalar_Products.defs.hh \ + @srcdir@/../src/Scalar_Products.inlines.hh \ + @srcdir@/../src/Scalar_Products.cc \ + @srcdir@/../src/Ph_Status.idefs.hh \ + @srcdir@/../src/Ph_Status.inlines.hh \ + @srcdir@/../src/Ph_Status.cc \ + @srcdir@/../src/Polyhedron.types.hh \ + @srcdir@/../src/Polyhedron.defs.hh \ + @srcdir@/../src/Polyhedron.inlines.hh \ + @srcdir@/../src/Polyhedron.templates.hh \ + @srcdir@/../src/Polyhedron_public.cc \ + @srcdir@/../src/Polyhedron_nonpublic.cc \ + @srcdir@/../src/Polyhedron_widenings.cc \ + @srcdir@/../src/Polyhedron_chdims.cc \ + @srcdir@/../src/conversion.cc \ + @srcdir@/../src/minimize.cc \ + @srcdir@/../src/simplify.cc \ + @srcdir@/../src/Grid.types.hh \ + @srcdir@/../src/Grid.defs.hh \ + @srcdir@/../src/Grid.inlines.hh \ + @srcdir@/../src/Grid.templates.hh \ + @srcdir@/../src/Grid_public.cc \ + @srcdir@/../src/Grid_nonpublic.cc \ + @srcdir@/../src/Grid_conversion.cc \ + @srcdir@/../src/Grid_simplify.cc \ + @srcdir@/../src/Grid_widenings.cc \ + @srcdir@/../src/Grid_chdims.cc \ + @srcdir@/../src/Poly_Con_Relation.types.hh \ + @srcdir@/../src/Poly_Con_Relation.defs.hh \ + @srcdir@/../src/Poly_Con_Relation.inlines.hh \ + @srcdir@/../src/Poly_Con_Relation.cc \ + @srcdir@/../src/Poly_Gen_Relation.types.hh \ + @srcdir@/../src/Poly_Gen_Relation.defs.hh \ + @srcdir@/../src/Poly_Gen_Relation.inlines.hh \ + @srcdir@/../src/Poly_Gen_Relation.cc \ + @srcdir@/../src/Interval_Restriction.defs.hh \ + @srcdir@/../src/Interval_Info.types.hh \ + @srcdir@/../src/Interval_Info.defs.hh \ + @srcdir@/../src/Interval_Info.inlines.hh \ + @srcdir@/../src/Interval.types.hh \ + @srcdir@/../src/Interval.defs.hh \ + @srcdir@/../src/Interval.inlines.hh \ + @srcdir@/../src/C_Polyhedron.types.hh \ + @srcdir@/../src/C_Polyhedron.defs.hh \ + @srcdir@/../src/C_Polyhedron.inlines.hh \ + @srcdir@/../src/C_Polyhedron.cc \ + @srcdir@/../src/NNC_Polyhedron.types.hh \ + @srcdir@/../src/NNC_Polyhedron.defs.hh \ + @srcdir@/../src/NNC_Polyhedron.inlines.hh \ + @srcdir@/../src/NNC_Polyhedron.cc \ + @srcdir@/../src/Widening_Function.types.hh \ + @srcdir@/../src/Widening_Function.defs.hh \ + @srcdir@/../src/Widening_Function.inlines.hh \ + @srcdir@/../src/BHRZ03_Certificate.types.hh \ + @srcdir@/../src/BHRZ03_Certificate.defs.hh \ + @srcdir@/../src/BHRZ03_Certificate.inlines.hh \ + @srcdir@/../src/BHRZ03_Certificate.cc \ + @srcdir@/../src/H79_Certificate.types.hh \ + @srcdir@/../src/H79_Certificate.defs.hh \ + @srcdir@/../src/H79_Certificate.inlines.hh \ + @srcdir@/../src/H79_Certificate.cc \ + @srcdir@/../src/Grid_Certificate.types.hh \ + @srcdir@/../src/Grid_Certificate.defs.hh \ + @srcdir@/../src/Grid_Certificate.inlines.hh \ + @srcdir@/../src/Grid_Certificate.cc \ + @srcdir@/../src/Determinate.defs.hh \ + @srcdir@/../src/Determinate.inlines.hh \ + @srcdir@/../src/iterator_to_const.types.hh \ + @srcdir@/../src/iterator_to_const.defs.hh \ + @srcdir@/../src/iterator_to_const.inlines.hh \ + @srcdir@/../src/Powerset.types.hh \ + @srcdir@/../src/Powerset.defs.hh \ + @srcdir@/../src/Powerset.inlines.hh \ + @srcdir@/../src/Powerset.templates.hh \ + @srcdir@/../src/Pointset_Powerset.types.hh \ + @srcdir@/../src/Pointset_Powerset.defs.hh \ + @srcdir@/../src/Pointset_Powerset.inlines.hh \ + @srcdir@/../src/Pointset_Powerset.templates.hh \ + @srcdir@/../src/Pointset_Powerset.cc \ + @srcdir@/../src/Partially_Reduced_Product.types.hh \ + @srcdir@/../src/Partially_Reduced_Product.defs.hh \ + @srcdir@/../src/Partially_Reduced_Product.inlines.hh \ + @srcdir@/../src/Partially_Reduced_Product.templates.hh \ + @srcdir@/../src/algorithms.hh \ + @srcdir@/../src/Box.types.hh \ + @srcdir@/../src/Box.defs.hh \ + @srcdir@/../src/Box.inlines.hh \ + @srcdir@/../src/Box.templates.hh \ + @srcdir@/../src/Box.cc \ + @srcdir@/../src/DB_Row.types.hh \ + @srcdir@/../src/DB_Row.defs.hh \ + @srcdir@/../src/DB_Row.inlines.hh \ + @srcdir@/../src/DB_Row.templates.hh \ + @srcdir@/../src/DB_Matrix.types.hh \ + @srcdir@/../src/DB_Matrix.defs.hh \ + @srcdir@/../src/DB_Matrix.inlines.hh \ + @srcdir@/../src/DB_Matrix.templates.hh \ + @srcdir@/../src/BD_Shape.types.hh \ + @srcdir@/../src/BD_Shape.defs.hh \ + @srcdir@/../src/BD_Shape.inlines.hh \ + @srcdir@/../src/BD_Shape.templates.hh \ + @srcdir@/../src/BD_Shape.cc \ + @srcdir@/../src/OR_Matrix.types.hh \ + @srcdir@/../src/OR_Matrix.defs.hh \ + @srcdir@/../src/OR_Matrix.inlines.hh \ + @srcdir@/../src/OR_Matrix.templates.hh \ + @srcdir@/../src/Octagonal_Shape.types.hh \ + @srcdir@/../src/Octagonal_Shape.defs.hh \ + @srcdir@/../src/Octagonal_Shape.inlines.hh \ + @srcdir@/../src/Octagonal_Shape.templates.hh \ + @srcdir@/../src/Octagonal_Shape.cc \ + @srcdir@/gpl.dox \ + @srcdir@/fdl.dox +INPUT_ENCODING = UTF-8 +FILE_PATTERNS = *.hh \ + *.cc \ + *.dox +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 +#--------------------------------------------------------------------------- +# 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 = NO +HTML_OUTPUT = ppl-devref-@VERSION@-html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +HTML_DYNAMIC_SECTIONS = NO +GENERATE_DOCSET = NO +DOCSET_FEEDNAME = "Doxygen generated docs" +DOCSET_BUNDLE_ID = org.doxygen.Project +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 +QHG_LOCATION = +DISABLE_INDEX = NO +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = YES +TREEVIEW_WIDTH = 250 +FORMULA_FONTSIZE = 10 +#--------------------------------------------------------------------------- +# 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 +PDF_HYPERLINKS = YES +USE_PDFLATEX = YES +LATEX_BATCHMODE = YES +LATEX_HIDE_INDICES = NO +#--------------------------------------------------------------------------- +# 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 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 +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = @PERL@ +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = YES +MSCGEN_PATH = +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = YES +DOT_FONTNAME = FreeSans +DOT_FONTSIZE = 10 +DOT_FONTPATH = +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +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 +DOT_PATH = +DOTFILE_DIRS = +DOT_GRAPH_MAX_NODES = 50 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO diff --git a/doc/devref.tex b/doc/devref.tex new file mode 100644 index 0000000..0f350d4 --- /dev/null +++ b/doc/devref.tex @@ -0,0 +1,144 @@ +% Copyright (C) 2001-2009 Roberto Bagnara +% +% This document describes the Parma Polyhedra Library (PPL). +% +% Permission is granted to copy, distribute and/or modify this document +% under the terms of the GNU Free Documentation License, Version 1.2 +% or any later version published by the Free Software Foundation; +% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. +% The license is included, in various formats, in the `doc' subdirectory +% of each distribution of the PPL in files called `fdl.*'. +% +% The PPL is free software; you can redistribute it and/or modify it +% under the terms of the GNU General Public License as published by the +% Free Software Foundation; either version 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 are called `gpl.*'. +% +% The PPL is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +% for more details. +% +% For the most up-to-date information see the Parma Polyhedra Library +% site: http://www.cs.unipr.it/ppl/ . + +\documentclass[a4paper]{article} +\usepackage{a4wide} +\usepackage{makeidx} +\usepackage{fancyhdr} +\usepackage{graphicx} +\usepackage{multicol} +\usepackage{float} +\usepackage{textcomp} +\usepackage{alltt} +\usepackage{times} +\usepackage{ifpdf} +\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} + +\rfoot[\fancyplain{}{\scriptsize The Parma Polyhedra Library Developer's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}]{} +\lfoot[]{\fancyplain{}{\scriptsize The Parma Polyhedra Library Developer's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}} + +\begin{document} +\title{ +The Parma Polyhedra Library \\ +Developer's Manual\thanks{This work + has been partly supported by: + University of Parma's FIL scientific research project (ex 60\%) + ``Pure and Applied Mathematics''; + MURST project + ``Automatic Program Certification by Abstract Interpretation''; + MURST project + ``Abstract Interpretation, Type Systems and Control-Flow Analysis''; + MURST project + ``Automatic Aggregate- and Number-Reasoning for Computing: from + Decision Algorithms to Constraint Programming with Multisets, + Sets, and Maps''; + MURST project + ``Constraint Based Verification of Reactive Systems''; + MURST project + ``Abstract Interpretation: Design and Applications''; + EPSRC project + ``Numerical Domains for Software Analysis''; + EPSRC project + ``Geometric Abstractions for Scalable Program Analyzers''. + } \\ +(version $projectnumber) +} +\author{ +Roberto Bagnara\thanks{bagnara@cs.unipr.it, + Department of Mathematics, University of Parma, Italy.} \\ +Patricia M. Hill\thanks{hill@comp.leeds.ac.uk, + School of Computing, University of Leeds, U.K.} \\ +Enea Zaffanella\thanks{zaffanella@cs.unipr.it, + Department of Mathematics, University of Parma, Italy.} \\ +\ \\ +based on previous work also by \\ +\ \\ +Elisa Ricci \\ +\ \\ +and \\ +\ \\ +Sara Bonini \\ +Andrea Pescetti \\ +Angela Stazzone \\ +Tatiana Zolo +} +\maketitle + +\newpage +Copyright \copyright\ 2001--2009 Roberto Bagnara (bagnara@cs.unipr.it). + +This document describes the Parma Polyhedra Library (PPL). + +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.2 +or any later version published by the +\href{http://www.fsf.org}{Free Software Foundation}; +with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. +A copy of the license is included in the section entitled +``\hyperlink{GFDL_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. + +For the most up-to-date information see the Parma Polyhedra Library +site: +\begin{center} +\href{http://www.cs.unipr.it/ppl/}{\tt http://www.cs.unipr.it/ppl/} +\end{center} + +\pagenumbering{roman} +\tableofcontents +\pagenumbering{arabic} diff --git a/doc/fdl.dox b/doc/fdl.dox new file mode 100644 index 0000000..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 + +
+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. +

+ +

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/fdl.pdf b/doc/fdl.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e15cc5874e22d869acd21b01a1560acfac0bad37 GIT binary patch literal 56411 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 literal 0 HcmV?d00001 diff --git a/doc/fdl.ps.gz b/doc/fdl.ps.gz new file mode 100644 index 0000000000000000000000000000000000000000..d82811ab5a584ebeb9827973cd997685da1e200a GIT binary patch literal 63642 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 T{q~1%{^frF#i|8KbUgzASaozv literal 0 HcmV?d00001 diff --git a/doc/fdl.tex b/doc/fdl.tex new file mode 100644 index 0000000..fa38f28 --- /dev/null +++ b/doc/fdl.tex @@ -0,0 +1,454 @@ +\documentclass[a4paper,12pt]{article} + +\usepackage[english]{babel} + +\begin{document} + + +\title{GNU Free Documentation License} +\date{} +\author{} +\maketitle + + \begin{center} + + Version 1.2, November 2002 + + + Copyright \copyright 2000,2001,2002 Free Software Foundation, Inc. + + \bigskip + + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + + \bigskip + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. +\end{center} + + +\section*{Preamble} + +The purpose of this License is to make a manual, textbook, or other +functional and useful document "free" in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. + +This License is a kind of "copyleft", which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + + +\section{Applicability and Definitions} + +This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The \textbf{"Document"}, below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as \textbf{"you"}. You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. + +A \textbf{"Modified Version"} of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A \textbf{"Secondary Section"} is a named appendix or a front-matter section of +the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall subject +(or to related matters) and contains nothing that could fall directly +within that overall subject. (Thus, if the Document is in part a +textbook of mathematics, a Secondary Section may not explain any +mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The \textbf{"Invariant Sections"} are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. + +The \textbf{"Cover Texts"} are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. + +A \textbf{"Transparent"} copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not "Transparent" is called \textbf{"Opaque"}. + +Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input format, SGML +or XML using a publicly available DTD, and standard-conforming simple +HTML, PostScript or PDF designed for human modification. Examples of +transparent image formats include PNG, XCF and JPG. Opaque formats +include proprietary formats that can be read and edited only by +proprietary word processors, SGML or XML for which the DTD and/or +processing tools are not generally available, and the +machine-generated HTML, PostScript or PDF produced by some word +processors for output purposes only. + +The \textbf{"Title Page"} means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, "Title Page" means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +A section \textbf{"Entitled XYZ"} means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as \textbf{"Acknowledgements"}, +\textbf{"Dedications"}, \textbf{"Endorsements"}, or \textbf{"History"}.) +To \textbf{"Preserve the Title"} +of such a section when you modify the Document means that it remains a +section "Entitled XYZ" according to this definition. + +The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. + + +\section{Verbatim Copying} + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + + +\section{Copying in Quantity} + +If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document's license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. + + +\section{Modifications} + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +\begin{itemize} +\item[A.] + Use in the Title Page (and on the covers, if any) a title distinct + from that of the Document, and from those of previous versions + (which should, if there were any, be listed in the History section + of the Document). You may use the same title as a previous version + if the original publisher of that version gives permission. + +\item[B.] + List on the Title Page, as authors, one or more persons or entities + responsible for authorship of the modifications in the Modified + Version, together with at least five of the principal authors of the + Document (all of its principal authors, if it has fewer than five), + unless they release you from this requirement. + +\item[C.] + State on the Title page the name of the publisher of the + Modified Version, as the publisher. + +\item[D.] + Preserve all the copyright notices of the Document. + +\item[E.] + Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. + +\item[F.] + Include, immediately after the copyright notices, a license notice + giving the public permission to use the Modified Version under the + terms of this License, in the form shown in the Addendum below. + +\item[G.] + Preserve in that license notice the full lists of Invariant Sections + and required Cover Texts given in the Document's license notice. + +\item[H.] + Include an unaltered copy of this License. + +\item[I.] + Preserve the section Entitled "History", Preserve its Title, and add + to it an item stating at least the title, year, new authors, and + publisher of the Modified Version as given on the Title Page. If + there is no section Entitled "History" in the Document, create one + stating the title, year, authors, and publisher of the Document as + given on its Title Page, then add an item describing the Modified + Version as stated in the previous sentence. + +\item[J.] + Preserve the network location, if any, given in the Document for + public access to a Transparent copy of the Document, and likewise + the network locations given in the Document for previous versions + it was based on. These may be placed in the "History" section. + You may omit a network location for a work that was published at + least four years before the Document itself, or if the original + publisher of the version it refers to gives permission. + +\item[K.] + For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the section all + the substance and tone of each of the contributor acknowledgements + and/or dedications given therein. + +\item[L.] + Preserve all the Invariant Sections of the Document, + unaltered in their text and in their titles. Section numbers + or the equivalent are not considered part of the section titles. + +\item[M.] + Delete any section Entitled "Endorsements". Such a section + may not be included in the Modified Version. + +\item[N.] + Do not retitle any existing section to be Entitled "Endorsements" + or to conflict in title with any Invariant Section. + +\item[O.] + Preserve any Warranty Disclaimers. +\end{itemize} + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section Entitled "Endorsements", provided it contains +nothing but endorsements of your Modified Version by various +parties--for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + + +\section{Combining Documents} + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections Entitled "History" +in the various original documents, forming one section Entitled +"History"; likewise combine any sections Entitled "Acknowledgements", +and any sections Entitled "Dedications". You must delete all sections +Entitled "Endorsements". + +\section{Collections of Documents} + +You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. + +You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. + + +\section{Aggregation with Independent Works} + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an "aggregate" if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation's users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document's Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. + + +\section{Translation} + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. + +If a section in the Document is Entitled "Acknowledgements", +"Dedications", or "History", the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. + + +\section{Termination} + +You may not copy, modify, sublicense, or distribute the Document except +as expressly provided for under this License. Any other attempt to +copy, modify, sublicense or distribute the Document is void, and will +automatically terminate your rights under this License. However, +parties who have received copies, or rights, from you under this +License will not have their licenses terminated so long as such +parties remain in full compliance. + + +\section{Future Revisions of this License} + +The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. See +http://www.gnu.org/copyleft/. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. + + +\section*{Addendum: How To Use this License for Your Documents} + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + +\begin{quote} + Copyright \copyright YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.2 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. + A copy of the license is included in the section entitled "GNU + Free Documentation License". +\end{quote} + +If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the "with...Texts." line with this: + +\begin{quote} + with the Invariant Sections being LIST THEIR TITLES, with the + Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. +\end{quote} + +If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. + +\end{document} diff --git a/doc/fdl.txt b/doc/fdl.txt new file mode 100644 index 0000000..4a0fe1c --- /dev/null +++ b/doc/fdl.txt @@ -0,0 +1,397 @@ + GNU Free Documentation License + Version 1.2, November 2002 + + + Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + +0. PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +functional and useful document "free" in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. + +This License is a kind of "copyleft", which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + + +1. APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The "Document", below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as "you". You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. + +A "Modified Version" of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A "Secondary Section" is a named appendix or a front-matter section of +the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall subject +(or to related matters) and contains nothing that could fall directly +within that overall subject. (Thus, if the Document is in part a +textbook of mathematics, a Secondary Section may not explain any +mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The "Invariant Sections" are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. + +The "Cover Texts" are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. + +A "Transparent" copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not "Transparent" is called "Opaque". + +Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input format, SGML +or XML using a publicly available DTD, and standard-conforming simple +HTML, PostScript or PDF designed for human modification. Examples of +transparent image formats include PNG, XCF and JPG. Opaque formats +include proprietary formats that can be read and edited only by +proprietary word processors, SGML or XML for which the DTD and/or +processing tools are not generally available, and the +machine-generated HTML, PostScript or PDF produced by some word +processors for output purposes only. + +The "Title Page" means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, "Title Page" means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +A section "Entitled XYZ" means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as "Acknowledgements", +"Dedications", "Endorsements", or "History".) To "Preserve the Title" +of such a section when you modify the Document means that it remains a +section "Entitled XYZ" according to this definition. + +The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. + + +2. VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + + +3. COPYING IN QUANTITY + +If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document's license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. + + +4. MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +A. Use in the Title Page (and on the covers, if any) a title distinct + from that of the Document, and from those of previous versions + (which should, if there were any, be listed in the History section + of the Document). You may use the same title as a previous version + if the original publisher of that version gives permission. +B. List on the Title Page, as authors, one or more persons or entities + responsible for authorship of the modifications in the Modified + Version, together with at least five of the principal authors of the + Document (all of its principal authors, if it has fewer than five), + unless they release you from this requirement. +C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. +D. Preserve all the copyright notices of the Document. +E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. +F. Include, immediately after the copyright notices, a license notice + giving the public permission to use the Modified Version under the + terms of this License, in the form shown in the Addendum below. +G. Preserve in that license notice the full lists of Invariant Sections + and required Cover Texts given in the Document's license notice. +H. Include an unaltered copy of this License. +I. Preserve the section Entitled "History", Preserve its Title, and add + to it an item stating at least the title, year, new authors, and + publisher of the Modified Version as given on the Title Page. If + there is no section Entitled "History" in the Document, create one + stating the title, year, authors, and publisher of the Document as + given on its Title Page, then add an item describing the Modified + Version as stated in the previous sentence. +J. Preserve the network location, if any, given in the Document for + public access to a Transparent copy of the Document, and likewise + the network locations given in the Document for previous versions + it was based on. These may be placed in the "History" section. + You may omit a network location for a work that was published at + least four years before the Document itself, or if the original + publisher of the version it refers to gives permission. +K. For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the section all + the substance and tone of each of the contributor acknowledgements + and/or dedications given therein. +L. Preserve all the Invariant Sections of the Document, + unaltered in their text and in their titles. Section numbers + or the equivalent are not considered part of the section titles. +M. Delete any section Entitled "Endorsements". Such a section + may not be included in the Modified Version. +N. Do not retitle any existing section to be Entitled "Endorsements" + or to conflict in title with any Invariant Section. +O. Preserve any Warranty Disclaimers. + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section Entitled "Endorsements", provided it contains +nothing but endorsements of your Modified Version by various +parties--for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + + +5. COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections Entitled "History" +in the various original documents, forming one section Entitled +"History"; likewise combine any sections Entitled "Acknowledgements", +and any sections Entitled "Dedications". You must delete all sections +Entitled "Endorsements". + + +6. COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. + +You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. + + +7. AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an "aggregate" if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation's users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document's Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. + + +8. TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. + +If a section in the Document is Entitled "Acknowledgements", +"Dedications", or "History", the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. + + +9. TERMINATION + +You may not copy, modify, sublicense, or distribute the Document except +as expressly provided for under this License. Any other attempt to +copy, modify, sublicense or distribute the Document is void, and will +automatically terminate your rights under this License. However, +parties who have received copies, or rights, from you under this +License will not have their licenses terminated so long as such +parties remain in full compliance. + + +10. FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. See +http://www.gnu.org/copyleft/. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. + + +ADDENDUM: How to use this License for your documents + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + + Copyright (c) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.2 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. + A copy of the license is included in the section entitled "GNU + Free Documentation License". + +If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the "with...Texts." line with this: + + with the Invariant Sections being LIST THEIR TITLES, with the + Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. + +If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. diff --git a/doc/gpl.dox b/doc/gpl.dox new file mode 100644 index 0000000..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 + +

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/gpl.pdf b/doc/gpl.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2c677dcf58a8ec9bba0f1aa60743e17fefd337be GIT binary patch literal 69557 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 literal 0 HcmV?d00001 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} + + + Copyright (C) + + 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} + Copyright (C) + + 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. + 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. + + + Copyright (C) + + 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 . + +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: + + Copyright (C) + 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 +. + + 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 +. 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//"extref{2}=\\ref \\1 \\"\\2\\""/ +s//PPL_HTML_Tag_Documentation_of_Interfaces/ +s//YES/ +s//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//"extref{2}=\\2<\/EM>"/ +s/// +s//NO/ +s//YES/ diff --git a/doc/libppl.3 b/doc/libppl.3 new file mode 100644 index 0000000..c997935 --- /dev/null +++ b/doc/libppl.3 @@ -0,0 +1,225 @@ +.TH libppl "3" "April 2009" "PPL 0.10.2" "libppl overview" + +.SH NAME +libppl \- the C++ interface of the Parma Polyhedra Library +.SH SYNOPSIS +.B #include +.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 0.10.2)" +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 +.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 +.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 0.10.2)", +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 +#include + +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 0.10.2)", +available (in several formats) at +\fBhttp://www.cs.unipr.it/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://www.cs.unipr.it/ppl/\fR . + +.SH AUTHOR +See the file \fBCREDITS\fR in the source distribution or use the command +\fBppl\-config \-\-credits\fR for a list of contributors. + +.SH "REPORTING BUGS" +Report bugs to . + +.SH COPYRIGHT +Copyright (C) 2001\-2009 Roberto Bagnara +.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..9d6b7e1 --- /dev/null +++ b/doc/libppl_c.3 @@ -0,0 +1,161 @@ +.TH libppl_c "3" "April 2009" "PPL 0.10.2" "libppl_c overview" + +.SH NAME +libppl_c \- the C interface of the Parma Polyhedra Library +.SH SYNOPSIS +.B #include +.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 0.10.2)" +and +.IR "The Parma Polyhedra Library C Language Interface User's Manual (version 0.10.2)" +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 +.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 0.10.2)" +and +.IR "The Parma Polyhedra Library C Language Interface User's Manual (version 0.10.2)" +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 0.10.2)" +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 0.10.2)", +available (in several formats) at +\fBhttp://www.cs.unipr.it/ppl/\fR . +.sp +Roberto Bagnara, Patricia M. Hill, and Enea Zaffanella. +.IR "The Parma Polyhedra Library C Language Interface User's Manual (version 0.10.2)", +available (in several formats) at +\fBhttp://www.cs.unipr.it/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://www.cs.unipr.it/ppl/\fR . + +.SH AUTHOR +See the file \fBCREDITS\fR in the source distribution or use the command +\fBppl\-config \-\-credits\fR for a list of contributors. + +.SH "REPORTING BUGS" +Report bugs to . + +.SH COPYRIGHT +Copyright (C) 2001\-2009 Roberto Bagnara +.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..b4633ea --- /dev/null +++ b/doc/ppl-config.1 @@ -0,0 +1,141 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.36. +.TH PPL-CONFIG "1" "April 2009" "ppl-config 0.10.2" "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://www.cs.unipr.it/ppl/\fR. + +.SH AUTHOR +See the file \fBCREDITS\fR in the source distribution or use the command +\fBppl\-config \-\-credits\fR for a list of contributors. + +.SH "REPORTING BUGS" +Report bugs to . +.SH "REPORTING BUGS" +Report bugs to . +.SH COPYRIGHT +Copyright (C) 2001\-2009 Roberto Bagnara +.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 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 0.10.2)", +available (in several formats) at +\fBhttp://www.cs.unipr.it/ppl/\fR . +.sp +Roberto Bagnara, Patricia M. Hill, and Enea Zaffanella. +.IR "The Parma Polyhedra Library C Language Interface User's Manual (version 0.10.2)", +available (in several formats) at +\fBhttp://www.cs.unipr.it/ppl/\fR . +.sp +Roberto Bagnara, Patricia M. Hill, and Enea Zaffanella. +.IR "The Parma Polyhedra Library Java Language Interface User's Manual (version 0.10.2)", +available (in several formats) at +\fBhttp://www.cs.unipr.it/ppl/\fR . +.sp +Roberto Bagnara, Patricia M. Hill, and Enea Zaffanella. +.IR "The Parma Polyhedra Library OCaml Language Interface User's Manual (version 0.10.2)", +available (in several formats) at +\fBhttp://www.cs.unipr.it/ppl/\fR . +.sp +Roberto Bagnara, Patricia M. Hill, and Enea Zaffanella. +.IR "The Parma Polyhedra Library Prolog Language Interface User's Manual (version 0.10.2)", +available (in several formats) at +\fBhttp://www.cs.unipr.it/ppl/\fR . diff --git a/doc/ppl-user-0.10.2-html.tar.gz b/doc/ppl-user-0.10.2-html.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..976b39a8bd0760d7b696c02431bdd2b000a05195 GIT binary patch literal 859476 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�gH)I|byG*?&1ldLtOyulq5cec<5 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

tnMH=8xv9W1dRwtt`P;S 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%0Db-DLTWV)acQw|}X=t9CbrRLmRO?u$fG&I< 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�Uh&>%D5Z^Q7Sd;pt&} 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

CpjcK$jEwGG$F*;O3s8O0D zX_VulDXJpjjdm@l0&rpQIcaZP$Pp~bk+=>;wJ1(-0+s%H<5?jF^2*QVX_Fr0VgnKG zPGFcuz<3%bSRF&^FjfQ1W0c@f9>WEUWiiP5)n)@21j)|N6m3gEl*qYGMBURpX+ z?JcvoAV3w|@J7H(do7~i6W!jVJ*mZXI)WEyn!#Bu5ErNh=XjjObXr0K6kQCwXp5+v zSi(O&93t@P)?-2V*53QhL1!d(g1o%FN^muyBea4B*J6N_S}n;^D4?lw3hstP_!A6>${+*A0rTgDH__c?ipRU(fk?+2fzIPZte`vj-P)g-H>Q5-|n z8VuubOyF>w&|$!p5n^zxGmf<}RT2b=*Aj4F4!jaf)>~~QfWH*F_*oIbCok$2NkHH# zQX>$YAmD_WC0RkuYZ#Q(shXz?Q9MWA`EO?K zWq_YnKaLGX?`W^vP~(`|sWU##!ih$Rl*gLP4wZb;W@l|CO9)lbqOriV7%MOwN|HK2 z3pL9z0)-Q}z~cl>umVd&Wr3NTbrv&}YK6f%4Pk9HgBl-grfcOj8GMRd^lkCw7`1f( z(W<~jKtmX%gD7v5iVT(apN2!oNd*)MqE~ruOCc=KX*wQpMHQ(;qXY(J6Cp(0uohZP zY5~VMnq&z^i)%UH)nk;Fr`0H>rU{%E@R+Qopq+ZJrdxU~1)rcOuB9;cn4?(x53V5( zj5M!>6LfR8Wpob5YJp*alQ_otdcsvR$b7peXvPeTl5E| zRGmM2ENa}8$H&MVf#o|}nYKJn>ljoJSd!*p?k1@t2%ukaHN_IN8pfu;byA_X8w?e) zW~vZ{3JH<)=2f%#GEgggGZlO@=naOZU`4Bp#;Tw_Tb;IG_GOT2Sm1yc1TagW=BoHL61@8iyC@ZMlHs65D9wNc zAlJzQUt3LfixlMqxEhKth)b-L5zBS&dC6iGaa*0?loksycP0i~#X);kRIqm{l%F)H zruj-fxk{~x0v{ofqJ#Y2V##S?gUWl)qO4FdoHi}$!afg-58oW^rM{-~j^xbXMcJZC zxkyv%!loW%Z*Q6@yzU9C?*`@%kB)xHHY^}5z5npS`5%cWsw$d@|B`w?yMcp74J;IBOKlF4zs;5^F!07Io4$g#SWK2s$`trcx4dLv zEmWS9OFdLGwPLls8YX(1YJfQ*&#UX1X33OevgzFwBCL{eVlvC9Eu)}e0t_w2Zm z7eQ67Hl2OACe3G}fcYiQP&oCILQA=f$uV@0o_#j=eUlVj`K!0A<HlV8WOA-$c(Tgf!7jg+y<|?$r z+!%2i;* zZp?jh^SaMFXUh^B0ZIjSZFLxJunekP$JDhMDl#@+t|DtP^6tbl=}Zvuh=Q|5OC^Sg zL=Xd&7_?_^3*I+*-v#OrH{e?YA|Y(4U)2uHcTXUNNQJknjkYekt3r_7Zh{09-8bci zPk6N{ZGmXwR9W)Im=0L&u-?7VB$v64nhXyS$0G(ZJZR5~3=br|<6cb^yqcC1=5e1U z?$b06FBI2`p=rgqL*whv#O;Jw+X*2eImN(E2-XJwH76z7$T@x41{9Po;}Wl0*J%7`xKo+p_Y@5 zaSy63c~Gr#{u5U$ZCkP2S_eQOVim?>^DtP?LG!aCz!8ai4lzpA4qN^^+N3^=5n@XC z_JXSs?~s#5$Qb!x-DqWK2Ew5 zx8E;jf1C2q%j2$jJmvfDx1RcSqGT3IsuTH*-N;H{uVDaVhKQMcW12c3ao$y*Xsx;-04P>BcdRoZ%U~9K+!xmV-{Fw#D<`L0jl;yAS$8G;5NhmDu@PtRJt7=G#bQAv)PcU*QcjRpPe1*Er?Z| z1yKQ^vBq&0h`cDv?U1Vu0TAxWPsF9U%pDCe8tW!~Qap z657xYm?;%dy%rUkilM1$6&zujguhPWI3z<9`T&XxB}rWRO_8M6Z}5ZR;BO4WD7BhI zDNK`qVkEehfS@fw0K3)3SP&#Z$5a`COb&Qou0$ zU+<2$ga41KW<3w*uehLWOk-o?nKNe&A3j`PU%!3(_Vw%6FI%>3&YU@Bv$?XevbeZ7 zD=Q03CJ>Q5d-enm_3wbM1HU@hN{UJovd$kD5)y8EEk7^2j9&8IQxEBTXZPFJxb{RL zm4D!O8;;$X=k<&Vg?mOXR#AFh34+WqsPf;o+S_wU&M#Rqc_ zHmv5iV!1~?--69}?9;s~Kd8U@$Hc5dZ*-`*WQ2fbO*!VpO~2i~7q zowa#Ca(cnpJ`HOdG7sfGvf{p_r_NnFwQWoNTbG{8HcemIY0}L5*S#=mRsUIa-@e^g zuyoJPJ9mAyck^pcje4TCv0vla4YTL=*gYWoRQA#z5104+vd@X>rG}yVYHqK3#&qSQ z2Uc~uSZtY6y0ZSsv3=Ln&NzP0Q|gBeSr4u4a;nFZ9aO}+4a5E8_Px2>xTzS5e_V`-T%yOk5VPS-Td^$l5XD}u^$o~?`h`iKlpKF z=CqgItLyXl<<$rO^Xnnw->tte@F&{`Z)&*ZwwKgz-g9Q9aQ^y34-bCqe8mEGh;Cnb z-S#?1GsT2uQOV_Vr-Vo`h)wb?4rf=NSUA=Z{%IJ@hYtLUknlQg`@80caw>;jr$1ip;>yM6~`O!FGF_HD< znZ~=nDqMDQK*Qz%#Xl!j?pXNKeHVtUhN~riOi|vpoXUCaXZ`z^|4w(wT7lM*xTGax zC;u^$qBJh~PY@K4{}e&tarxg8Kk0+=#^shx{(tta1Fnhl{fDUx6-8`tUIkGR;a2Vv z6$C{#iU?}08ZLJih=znMZkC7xi*<_w5tO({H0$%Jzl(i9`=bmgj{fM+IjM@LW^t^?U&TsA;{kV-7?l+8 z@7}hIh?9gWX?15nLaDt2mYP?4hLuO-Vz8`P?Y1#ox{}F;6B3Qv*@rzJ-Nm1|prX40 zL@47JDK9D~C7hVgy$>RSc`jNDBamh%(y1z#=#Rk(ms7FQzajanu6@kMS-)2~Yp0Dc zu<~-vAe#CjW24ypaGk3_37JeD!jspT70_30;Jw;q1D zKEfnSXNn@j#@7VorFoz(6;o-=YeKJ7u?DLnU4?OzNUVuofd*-hA&z-oH)k( zXyFVcq9m-ptRoINw#VoN%3S=;}B!4USA_9C39VxdunBD-I4;$BEG3MCgp8rMFQUoG6`fwDdMwgA=VY zj+UOrXmDb5#?jK#SPf3B&Ny0n8mGaD(-}ugPseF+#_5bhRL7a1!I_{lj#hu3qQRN+ zF=Nep7CO}a2RrC^(NVN=kphr198J0OER|MHfz#?`8ufZ!G%!vQ69%x}gYty%s$&QL zIcH82WSIJ6y;Q3bVMvW<;a1xDo&W{(R27GPTr-VML8iUxxLn2DjFGUpBZR_0nu;Z9 zig_}Mq3EP4MT-rJ5F(U^2m~UWhGDUoq%agjn16Tz0>u%smdKYXYz?#;Ss6&;4mkks zumcdN3@Bj>r78>j>B<6A5X=X8gjj&UJQO8RF$wW-o|sRGFqlB71}}>;3rP&ke2Q&+ zi8Q)f_qvx(K8`(aNz*KBToz2TfzJdgfN>PY1qdHOX*Ly}h>b|8xhQHNmE=_tJJeAy zcQ&>mTq0x0p8Awwf`@|`!lMZR%BT4vK0-hUL_#QnhqecyG|44G!acn8qmq zfng9#izyrt!8}9+iuo8!Vxn3kdS4i6Q2pCaYyZ6sji87CBq5v+5Hdeho#6ZCh}7*~Ir zsNKS11QQ6DaR;IJG>J16C*WZi$_GU>)7l6E*SCe$VoRdsQT33yGNZb>TZ+Yy02C2C zjL{Q{F(W)iZV*K;&KFG6k6l!LdNotplHT$NF88bky%%4g~jf-w=qXABa1e~cn zL@b6G9#0|ytS-_vhN0CQhE{X@7XDKv%x=2=kU7_9UshX(*K-pM!XiCAJ=0C_e z5OZ^>>rBf#yS}nGx-!wt%Dp58Gxna8+Uxl`qr-sl!L3^jjZ^Qf)VCn=IkrxaY4(eZ zaK;c=Mi`rNIh-xQ9gp2Y-A?{Hqy2Qzf5B(de;li>|G0Ae2OG!#FQxw>%*#Tl|Lx|7 z9&O0+KT0+J?+$=`4+L2JHG1ATyRC(P6uH4Wx^2AzTs;XStzJ@;A8^?2Nms+^fdi!b zyj$LLFxtXTo3%bOZB{1G)U-4x_fEjWOS{h*n$Ectae4Q|=eu8DYVyX{!S>GYdk@BB z&RV`DbNk%`?F)DG+Hrqj7nyUXSlhVWL#E4b5I=c7w%c8?>FBQTlvdF$E+#&XKEvmy zw-{cLtPtSZK%z%g=TSYQ#OuRzAtUg z-di5q)AREp&#oSlG9t%q{T$1!6+_$WztFqoG01MH#fVci*|VDU9|f_`wEqJ{@hbk$ zgH`+=Z`A)Ur2o=N{y)9X(>o2R|GDb@AA$bel8N^3oF9mV2M^kkw~GhIN1i_F=-A^Y zv(5$c0+0I4y)dHrJyG}R%QqWLJAZyaT-&4L*Dknlbku5T>#}!Kp6avsjuAc~)Pw41f_k~x6a>53~O*B(DU?_Tz!aa%7t$Y0#D**(?v?1`zCra^8N zKbn@e%1?nI`^)Q}6@GnY!_#@3hkKl8(B`{zz}|A%<{;3&;HLe~zn+`}kH{QWj4DdC z@sbIBAKm}m)UDsN{c|?=@{XU@DwQ7|e7W6_=f~nNTXh+Aq20M=`d9oA}rRVEfW z_`BgxGEZ;HiMB72oJfnCmo(;a=Ec$zev_Z}juH>FHdq?7#H06=)wi=s_i)-NM!U~w zl_&YHP@wdb;k^lY2_kXE#x2QJJH17Ut-2K(K`%9Pj=?2*CReKC| zpD?JFsGDfb@St3d)eH}+(Loh7-u3l}l$Yo8Nn3jJvb4{{wo4z{DEg*oicJc)azq6$# zz`Q+)=S<2jehn;z4srUMd08E>F}yrSuYLSW{lha8hQeUdQ+ud8aQk%%C~uSOoOX3e zg3K)?M&H0-R&Yg=6qkjE!Xs{fYyJ#a&z+hjA$KUoDl&kB`H}jo4g5NV>YZ#}vIGeo zn0hz)+)Tq4rZ23y=G^VAxLhkPH}u3L0g{k72!*!>Dk^OHLZ4-}{FdW;q@qV%PI2*!a|x4V=X;qf-aDb}~s4 z&D^(gRXf`aW`%RC{YGEmj0tr*((TIN;Z|k)0kalg6&~hn@BO=Pn}odnKsL}rQCwVn zMbA^;ec*42bKMeF>2KK1aR)rx*rZ+2KXSy{b$04qOM~9uj!M+)n%87P-2JJk-3&4& zn{79YSnqBGl;}^st5@iHaoX^3N}sdp#Ngm}!t`m4^L&l=|2_5}=7FCn{tHK|#ec!5 zYW=6t|Nm0)A%DUC$;U!6_`5c#wpC^uHA=2<^k~fDG&V#xn=uPPa14J zvhlFvMZH0tW6vDAs+auBz0BMFIm2d_-sxqs3-xaid2Cv%dke+CW)7I%VPKqo4{is; zEe{HY-MV|(d#Y=W{f~+_T~KNIikrs91n86Lee=nEH}k=%#G!=?vknH|zhGyQ7W4YP7Fs)4y4;BS=l{#XXLrt_m|$`(>{Lfre^);@!`+J|6rtw|KXr& z{TGEA_5Ta$|M!*rZ~m_F@eQc|`W;mK@7Eyzv6h2dJ3Bo-C0QC{7i{a8QzH8|cZx$! zp?6W9g?sXRnPCUhRMVu`)3RhU{{fM2@-otM^vrfX`N}Ken$O!NEn9C(-`GuW-$WrP zhWi6MA3I*UIPS)!=#t(}mRI(gy*=G`+ra71IyGs>opzOfFw*e(qKkV&T8%aw(Q>a( zZfWw$e8BbSePJEvI;4h3+GYC;rdBBedbpz_3%#Eg z>~;!`TjEjX>~q5D*Nvm>(g(ffohE(F= z*L(Rjqca}GI<;F;-1Y=#QR2%@YrdJZHYegfRKBUyq4>=H?!bUk6%zMR$tN7m9&8Z3 zDp=f7j`?4USS0ZnyMJlqT)UMAmpjBfyIoWor^JMwB+*W@! zKO8g*=!}Q_kG*SwuBtlIH*W|bfPjRGdPN1q0Q+(F-sgbW07k%}N)alIt-1S&k&s{# zv{sf)f?(8uJbc7zXFw32ReYmmG>9nBXltnstkTiJLaW%8`lz5N^PiAQfPskSk}%U` ztt_&_&42gZXaC>-eP{pseA7yH?b}o`;kB!t>-6ljh3$Owgy4V7Z>|16j`2bLe+~E# z|F+|Q8{z-x1N`sVospnbj{C-<$u=u^UAaCnLT{m!gGI< zJU>!B6XkErDqE90Oy07n;@Q#>^^2!g3{B)@)lH zT{LKIr^g1ISJ`Pftwq3?+Tej@x%7wp<4PBt` zu3lhwC3UN+s!Gnv+M9J-UZ0&e&)8D+e(sDvO{TLVo9>)9e#(wZHs$~KlcY~ZG;73? z3-+<-+Pk+z20xNB?~kJwOd9a+;_UTv=+rmvtr?UvA#>%;+ma)dYfrr?f5X4-{3l@{ z&7A+Et=0dF59@J{EREi7K%&wlTrhd#S# z!^XLr$Dcg8`boU_j5D|G{iTzWdbZkAJ^m#w$C{d1~H} zXG*TB`0Er}wQ*=ia|fz?`>uQX47}fF7H!=!;o-3_{>#*{e9-Gto*mdF_n|LdtG(@% z$IvMC%+J3+XHX;sJykn#@>fG%T$Mgp?y2l7-x!cPq-4~vjMLtXj@@+#y|}nAH~FTz z|9oX*!O%&gi~7$Ewq8}ZX;k<87pvC2_fDr=-EYus=*&B2q@_>%`}QtAzqO`L4W9h@ znU5CLzSC_*{-xjl$=!Rdo&4$2(>^-u*~{w&h|5j>^OI^;TsXI4a?+*;mi{64tZ3P^ zN4Gq3Jt_N9ulI&6?T|j{^@<5oe)!Taulm?S3zp1N-QFpjKm7XZ9)EfKkJyOC z>-Md!dh)uOF;CQ)(f+#6t{PMG=B%_irDe~}n>BiOyHxvstp7+W;Xk7MAp94N`@ika ze{U=N9~_CF|GaM)C5hyJGY;^-@1WR)-79u&DPP@h$t@3zTadCSZLiAC%B7Wck-qh2 zOV`f#ZC`kM)$-oEd)!&MIXZSnc65BjMH}%f6N{aMu)S`NWcYZnKB*!9f3|M#z(n%Dxd-|`dekM|IytgpLGp^yYvw#(|Js|kKT(jk{cp+J zMvlAm4>`NjURYA}>JK`+zO!QEXBq0^4vX_6OFxZ_Jon@52Xlse=bh7*zZI$f)l^z^rrm%M$$ocHr8 z3%fqm=ife@5TVgoZ+F?-@gLc5X4Pcmt?pFR2f(K=4?f$%$TcfhM^bdg=2MEYPQN{R z+MHc?e|J~E&2(3PbY5gm!R+q6wyqohi@bBvUmaXMy-TbzeaEP$KN=jFwtdW)$lR3Q zkBdfrmhx6+X6ma`qR)KTJ+=1yyicljkN-vItX_3zT)L|FY2)gb#6FPKmAfwLo%6|c zC!JKAjq3K)M_e^vW?QM_Vfh&_z zuKatttd<+PZLa9LI7#N8l@!UX82@b1_x|!wJ1Vw+HRJz=NNe?f5O&c1FWcY$(eD4& zR``EeB)3n`AKtM=osDB?Z%%E zsmM+7?yc#f%p;KSHw|8A#|E^sY)~7CxWjyI8 zcf28GSUOKjzac4oQc~@Py;+acJzU$RA|WaCS#MZsgbx`c1d{EAUcF{#^y%33f%k_Z(g97ZnAD@9!r|9WB5 zQL4rlDp}U_!s3$s@78!C<_PDn_D@5j1#ek+9K#Hbjw&kD)1p^~z5?YX(WxbIqk!=5 zqT$J_!3_^14A0gyy~BA!;-9Ro&M|zA|6ll1lVQqn$$!Qu^A0`#Ne~FY_WVEL^1luJ z|DuDU2U$(Ep9XC|4cdMh^#6tzV2ix}j>R{v-3#!a%L}mSg168RFivg~;tCiK_KmFp zn+ui@KfrjfgqQ-xgC)cnFdi%+_JHwV-`FGYSTQDH#)0u*32_gM2TO>BU_4ktd<5gc z5@IIU7%VZ4g7IJpu@#I5ONh5%JXk^u2IIjJ;xZTymJqAKc(8={4aS2d#B?wo?6^4( z#-F5cOxA#fp*3LPk*om=O$#g+;>2eEXH<$y!ZjvNC}XW)$TOh}ko0j75R005+(kUl z0au8^=`)H7ZOiN+LPHJ^j-e|@Q3KoAKTJunu*?u6e4;7y1MT@*QROkiMS#rLSadan zj7My-cUXg~&fz2UaA2kI1xC(;VQI`f!aZRz!9-FgzHWqJ$U{chFr&p+mP{`JNoh-F z0=KlK(_1jP;|hzdEG;O=|M86QAsS6{>pPEH%8Z3UE9+6=DT0IyJP%n#n)3u|4A~U1 zMRN-msjR#dv}~gtNDy!oaOxCxzEg~IiY@XGVWATtlg(MMG=*yEh^Cg#41N9@4N7$2 zi@+fr7_EHlELO@1-zPppfpxt35jBQ7=;{`RJ~4$qX^HJ&(b55-48{47xJDtuN#LZQN@*FoQgOqMzuVs7 z>kLUneZ#Fp99yA@R+t4$$v`{eUlrZIXsx2*O*z+hbh0|?uh^H-4Qr{apzQNEC-m7t1W#C}) zoKjQ}iygrVW?2wL46uF1nir-mTk2lYjrB?^GZ4^(TW zH4C8p$-oniV-WAyS)l4PaDr>617weDS|6H4p6?SQ5kbfTheX&>2}0fhDH9Yk!do$m zj#f1!Ocr-ih`gM$Dl98dCFSKMEx8?cfer8H6&B0##)%a? z@IgaB4rvcS9Lk%AJO>L8seq7Xy}1vHmB1=@@RWuI@xG6JiWLcbhooZ&(mn``BT94k zEsca5CUR!6u_l3uE0NT|y(JE{A^<6aQ47ylAZwO^@@dV)#gc`%$UTWD3xrUC0mQ@s zs8=G0*E;oB8LmJ%ac4N-1`C{&%<}+96!N8&vaRZ|7Ss~$anCRtP@@_1InV=Sm?wPa zw|PB=MML1yc>$Nw^L*(us}b;L;8YgD#XJG)u~V?bJjHzsAOaN(`9L9jYz_8&q;*2A z{GfQp3jPMUyfH{ZV{vi^Cim(bw zAPkoQi=#{n%K^|4md)N*Il`TvvI3Bn;qHKii_y?cDT{1zc|mzeBI^x?T+__+6%zfLSY2Is4S3)8Z-&8i4z&ujYk`{aG@*_f;?<}fdh#Ya9U3iLlS}O05?~)5Yms@d;su5 zV8l!V$Vlxd5CNyC0m%a&$`SjGn-2~fbAc;uk&-wZCpD}O8*XU=SN8zd!~3Yd@T|qy zfMoMp6DK)=^(h30g&J;lA%-=K32W^GA@%~%DmY23asgG0cnnxC(IyCh^%9IFaAGHL z8{s67-f){paY1aLh?7=R57=9v14#nh_WTzhh6`cCy9@yhv?L%N1c8jTz|I0oPDGqk z9_LyS#2tpw8>mH0NIy&linKeSaZ(#bsMSJ%6heW6(Q0ayQbvI2P?{wIC++kZ<=3@@ z_ck#gM==(_c(|cbX#(Vf3xh&!E3L0|t7NwJc_6UHEX*U{5CelSf`VWJ$%~t9-8i0^ ztwCT@Uk4gNm2*6x2vg2XfVonTIBlQVlu>6vY_o7fh!}$c<3Z5~Ot`(m1wR2ZTN;df z46q1Nkop2y4^)Z(Do2!-tl1s*w$E%EZVglHd)lL1C}BNc8{sH0K`at3n*&_9Sw3Yw^3MlNL z0ios;_JxlyJ{i zH6$^_0bctIV69VI>r{t2qjgoSKBwB(r$wz=lqyc^Va4IK4rtX^sjWk)zI|>8xKfBD zxfxtu*2*Fzmt^1bpZ)D`pR@P=dPzxuW`=tg73RQQM=4F{`T8Fmks=Bb zF>fLf098RVOpwFr7$0I$$Dez)Q}McWt)pbzIP5$;_q0bLnUM}c0I&-oypyW?Yib2- zw7^+V%yZ;C0<$0>3D}j&GU-h_Yibwd?ZB+{(#3Qk8)Q^m5ePleX^hjYEJa{3i@F=j zL^pT^NsKFU9UMbgQmS#f_LpEwM6n%*j(PP2YXJF>fkZ|k1zzBV19ym!c`+7%%67;T znnf}@eM_|2^d2YraFil(nz%XfN^X~UxM+BAN!%>mwQ7X$+>5km$fYL(pc6)HPwhNHYigd)sr3fN$ z1n3ODY^23TQt42zTfc4_t<0U#FU)t1Cgs9<>RdDi67O`&&Um{1a6t;G+B`C8M~!B( zKUZ~@Z}X8!_45=#&TTM53==7zB?W*3fG3Gv`uGWQVXcEnF2)p?Z_X&op*w2W-}Aa5ERu z(EuS#A|!x~6X7Bcz%C8;zC%{e&(@yWbv{Qd)m~}KHHEAPTlkz1D`5)|6$QP9h_W=-r zuv@uPo(Lnob>3Q!9Mh>3hg<1c$1>~shPry#vTh^&%;U)v z(N6dfB5+CoG;F|Rq&yWyMPz9t?WV&GW?}vwa^M;fV`U(oLgoqqBArnIWXb3VF|56n zDtW-wFFW}q*l3`R+;9q+F8pN#BA7;_Qr_M6{cDG6j2BcbfNX9-%(ZIdwF!f1K{zJ_ zk~RnyN&`CJ+`VXeN2txcvDqdJu(S*51Y^VmX9IG9DrSHV8SgO@(PBtFy=XU`Xf&rb z*45NiXPv3Zqn$((M1oaV2FsoHTr)}yJ{WQ=%wi781(tXaw5AZJ$QmF%l55 zA$nz$W-j&Ac^y*)0`G;leGEHow08n_0;k3S+z{-nH=YF|80rnTeVh87s5X>AmK$ZN z%LlY}ER=42wHt2|bFX+@jf&}4IdbEKHstDIY z8Hx->Dq`k)-@QxU=mmRL$Kh~YpJmFUXai_JrfF+l}}m9^AMgBc~M9~P2K6O07b)&mgJ8k`-a zRtKYH8aiybF$g??0MJC4{Iu)Ac}q@!fdV=NsV!pGO5j)CLjq|Ol|nEZd5<_jD=ZNN zc@EhZ!WQyaq?m#P9GoIBhd9uz?!=NWiyav2RIk7!&_Kk2K}5wQj~b!~b^-OS*r5>y z*i*10m5Nqtp}kVTSuw&U$Tq7kHXA#d=aIFHA)D8bS&&^6CXU2uvZ42BQb#5?pk`r7J|8B^1^ z@hj|yWjD-L+H&&7|dx)UEfdd3;7T-^3=cf9i3fzxUZEj_Ao;GoRn_shrL z`dr0v**z|qJ9Xwm+uh&)`aabo-hJk-@9i> z@$?Vx>woE6P1_gKC*C-IUEh08Ts3FKTPuF>=?|8iv-sJ*eePJWLa&>2!I07WtTQ{l z^5cEq`_4N<7yWM66Yu@$5&xIH_w>Q`gQ1tHMN_^#cFlWpZvNfGN7d(heQ@ijQ?_65 z*Rd0RbL*9Q`m*6~JdDr$=$#{PTC(8nAFcYR->S>2e>M2z2mX4}i$iBlco<9b{k<1| zuyD-*lNWvWzrVFz<9X%3`jp*VyXT7Yiw+$9IK6-8#mBx_vl@SIyJh1ZeS6LxuQz?X z;(_Y;(mSt@#;;7+;lZ8Wz^@#4(x{tOy-MF$Q*-hYgYUZV?wRbCqwcwS=)Jyt?#dm8 zUvlgt4<7OuJ#TQuzpqu3*EdXg?&mL@H0$6o-@oC#2VN*|9CPG|$HvWhX4Z!noxAIa zv!?v)A8&m2$H|nG&w97wz~_#<`HW#<=)~fa&Y1VlbC2&M0DVA$zu!IXurb5$TvA=J za@MlL%5Ut`|GY7c*Kc$E!oB)Fc+|W%519SXWh>{5D0+YGYwm}KFIm0g-@?+r?Kg$q z`uxl14_51kulr;9#o0w4F1mH(Q_I+>->-Y_#wYhWc=F_BD~}&=bhvKb|GfO@MOW;* zzR&QwIC;Bk|94nHckC;n|A=Te>3=bXH{m}P&H9hBfd4&&|KEa-0Xh7?T6RvP0KiU$jlJ zT7AoS({xPnuLm7cR5Y)4c=;`_?{)vz2%y@~|6{V7{GZTG{x2~t=>PSs{||jd7l1X!)?`t1h{7j8MX4@jZd&$C2KN_^OKn!}3|I_Z$e@2Xc zLH`}NK+gXQ`hPv;|9ftX|CcsAc|tz@|MC|7_srn+uP*#^DXCh0bkpLui~sa`$sYI@ z+3b|5rH78&{wIe`DVb5bq<-4@yWcZm`jFDnZsd z(2^&IO(N*dVg34*ycn-9JACd#haIxpE)^BK|6!;=dzU_QLDh@DEE#k1b#dGK?xk;5 z_33+8?I~#66-PeB=FS~hUS3|bA1XfoX?1Q{anU&=cKM84dGo$sKLFZF{Xf!m`hSEA z{4e@{To(9$LI1Cy|5woeE9n0f^#2O_e+B)&PU`=)N93)b2l%zt11#wO74-iK`hNxe zzh0pKXOsS)-JJekOGQ;DY6)AFcNt5yV1_%QlkA^hQYcQG_JoNTL`TZIlA$(KXKVA; za+d}s6BfBgJ`zQo@M-Qm1*;VcG>8t=h3}nbg&K^sbWu9Xa3tCwlE%VfV?BuoMIL%u zp@vwZBNsxY{uzxWcF{W_M2IZucbT46sKK!9EDu(2n*=0ukeC}4C}k`)f2rOvj>hGx z9)s2>*^3+&j#zJE+70FU38u33kBfek_e%ra)@c4Uqp-U=6)K+5%6;{xQqzYP4*eYJ9!RPIpvNml-zOCK7OL7vONXn;PGR37g&Ln+1 zo4Sa&qq5U3xj_Y@3P3cCr^wDX)%hG99+ZalRUBh%Foa|$kP#6!iZVeUJW88y+^KH}`Gy`Uu?Ip6;h$Qd zFve+<&V{5VNvV_bVc$tNbXEGsvAmexDw7FO+CRXZ~?X{ z1c8!CF54V7)lHgYCQwNO*aCYCK@y=208-L7h^bAzH)@1x?H!AdTmX|p9#S8nnTNy? zViz^kyI$3g>w<)23_KMZV}0Z@VgWFtlu?u!E2kwHg^99SV-zVc zeJ!YBB+Z*=%qT%auUc(b=#X}=^@c-+q7{TA?G3?^2&LN`%G#A&P%vyc_g*+6ETo;n zdWGO?RGHvZ+Z451PyiAl(z=7PfGhiwI;I)-oi4J~@VI zj=fSMIRI=7y&@P=?17UC!UNL8M{hz}S^`EUeOvCkGZ;o6fT_WzQz;{JkyvdA#X))< zA$xaQJ97m5qcg{@EglMSj}iwILHi_S;&W%%nn@iTN%IN{^9jDX^9i=x{~=kP+CRRu z{{uMHruuKmQvV0MzEJ<&L;WAKH}?N8x?ulv^4b4Cb7TMK#LBZPS8n@ozp{5r>P;-& zRy5x9*}&|I0sqy%;=GEZ|NivxI}Dopn`>TJ@zbW8FWLEqOFk)myyUSyWn~YP9lu@E znybpns)h}HZO#+f<;&}@Ui|0c(o$LZ$+l;+>pouelj$|DJ}{`_w3&VOnt8%wf4}st z;u&KGRK7E~^vt5tr4N*pE-hU;HY7f*bIzd0at(|4vka^`6x z`drcHzHJURrzbd-&3IylKeQwy4jLiw^&+XwGFt zcOHJ(fXZL4EB)?c-(3FM)61`WVtHnV*?*Y)#x*bPc1PW9hdp=3h}U;J=2~>|Kkt5C zzO?6>el`Etv*c2V?yS1EXwg%px6H1ba^chqXEjYNTRZE3%vGZ@XU%Gw)pS$Q=tqjy z?YFd|a?~RuC;Ygq?}BfZZvUfGN=Do?XzoQrp7_&mZydC?f)y8Cx%1J}cDjB2Zk=jc z*{uI}V60__{hz?M1Zvg)!6l*v|Nolze{9Vd)D2A{hldy%n&)K}T0;u0A%)hE_S8J) zy%hvDa=mGsH*(VE@{WxUb&K(3gFRbt|76Gb@p&4?JaSU&k;+?H#W`Ufp41_HvJLQ` zn=^ra$8GLiR5#R}S`SuM9#T~`{ph2savCiS(YThLlIdf|W)3m6)u)0NW)5okW-|VS zmK-BN5uTJopoD#p?2m8xMO$O^$OKJOGc&Vi0B{}DED@6#oisyC!idV)czG4`Co%1IskCt|5#YH?BG9O9ij4&WB0g*r4Q;Ntq$=k8$(nHK&HT z@8(|E{A$yo2fNSw=6$LR3RHJO(0Kc(+T%&MG;Ag<$zsmoURJTC1;j3T;^ze) z$HGF{2a5=9bp0-$73kQTOig}J8U)L9_90>O(ylaS?}>F&TpFQ(M}w?=lQed(9x zulOv>W|Qs(`H&pu7{}@ajtFc&&_0p2qZ}650d<)lg$@Ih!dgjY(NjO9tD`~*rphk8*%A-DiWS+;=_J<^Xkn{f6tfxr`iOyW=N`3nEAO_LwI~4 zCwnfT5OmPxa*d>48vO@oVpa7rQdl?-MER!kP+Niqmrn+Qj0@LMQUzM#X>r9A52)uc zTM0%TD!U-~Uu?V>8iRfP@R`e*6z~+Q6Z^_@e9ef@sq}~)O1r|~=-uV(*FV30cR70f z{oh}Y{`SM$mzUVrbHiKr(pSxG*M-ihkOoY1LR{`L$|KG~UklFH_4W0yFJJAuudbvd zqOKH5$$&B8JANo#EDV_1q6>VBH299isg$XQCC=X(^?14 z^?Fopj?}Y245?Bba)OD%?N8-XhDD8N6uDeSwr}IszMzh1St-`(11yLCxC%YTb*Sq{ z#E-ZgD3=P)3lx#QB(5t#9jdByn?vlTDY*5meKr)HzFWj&nOe-slK3WO<2uKzGsg{R zvJs2BRFnDGC;(}Nf;z@Bd|s3>!67441Cz(>RayOC9t2_4mv*f&`5`9QV$=ma7!?rW zC>_bb#;9+J(|=f)og?9OoTQog3)+Q03`cpOvR3797y)0;3VU#Q6YiO&|H>xwuaWs< z0*LKe{K44BqtWY+bKK%9>kFe5Y91`_FI%4R|NFM}_{EEVsbqF~*1eb9I|WRHR0YZ= zVEDLHX)la4hWru7294BnPcGihvv?B!D-YQF5e#qBp$Yu)?T;^iee>g+|9N@&=Iu{| zFZ^kJ#aq|x1|@{?2U!&=tlUok*M(2O!mt@5N76z*qj6OiHgPV05;nb3mf5x~`hZ)R zi!pmM9T)qyfBEhA3CpgN$sY!4pU$oF8Ugp|>@O$zj&Gg=(<5ff7Zh9kJWQ1W;d2A> ztdK%QSK&d~RW_B@tVUcz)8e&>p|kn(Yxv+StqnT0KA0QvRK^0WM0c*42rPe#-hT!eOrhxnE2 z3PQ9}+xxT{n{8(Ny=@i_tG(7&5ol4hut_BN66 z6k3P1GQWM6FPMeEy2{pGfXQ4IL@MAs3`jt@L!=wIGy)Yq3_L0L_Q3pi8=1Y0mdJbr z2<#`&zgrL-3?1LAJ;TAZH3@lWiZN>yINW!zhBpfYhkpdy9u8O`9sRrC7Fg(QaYHV( z+Xa6}1oqEKMbpob1HLpzJ3*Pqta2QC0=w2UkeIx{CTR_w1(Z`UJyC))fW!QMY7D>N-QZfOV%1j=7jwn(OFZauH)yI@4)?Z!64 zeq=RB9TjQLoq#H$DdEy~1Inr7)b{*fd%PBYzR?Pe(^78tb)Xx#`*OG+R88oen{~9^ zEr6Mos?3B9uzc$jgVqqfHzf_fw9Ek|m99E}xyt>%2^;ST;GqzLI3m(41U3-ZL`06q z-H)2pfNXE#pNLN!?svdpq9&z5#MtY}dh0MD~`JAQM zGl1xs3v%j*Uyf*B1lWKZL=zgbqDx4r5*@Tp3CQ zoE+2{SMo>_;YFU~I5sR5CS}Vi9kHn#At#gj-b$Vf=UJ4p#7(s~IaME49XhGmTr^`X z*6~<2_C1R*3H<4eLT7ybg$A(tsr=-CWpfQv>NB6ZI+Bsp#KXkLHg^LiJxp(dz{+N$ zyFDL!3&%9UZi9jA9WtecBV`$FXS^vGP6xOIapNEf@A|*{e*sU*iycY z`LPre5!UjiJ|$sfhc2uoOzIWn*jk!4+e2v?XVMBhsYRR&%bS?l^=%qyWr#!#CoOMt zJqW6oP)|^x*~C_UBtUE{EQ$c4oDv=QPDDY-IIGx5hXlucqLX$7mepf1RYb2yH$+W8 z37;NEVXp1MN(pu3$w)9)`$SX6i$d28h4fA?FeltP>-GR)X2VOWjyNm8$!e%olfCp( zZEqn|T7X(5xQu-02n|WZ8Bu}~k7y^1f&oIP3;@>H!Q=y>3JB%<9u!!j>q7kr5&ry^G%=aRGa)HH{7c5gdQCF%ma)p*sT`#qh zqJ69lHOFka4~%=qSZpkbK?oLLaUvZ!+6AkYxK7}Qm<0CKOlcj9Sk;ZN>0+|q2Bn$~ z4gPmamnICS9^_s`)2nHDGeuRNWj*I}e%A>Tf55js{Q4x`VIQ9Yg(~f;;rM7K+jk7@y*xsIh>{(2;)RDJkX2MY)Ar z&d6>zpQ{aH)0)ZM&=%h3R;;Z!v((2p&6<9!{_z~qaSu0$ZxaqWyH>;pjhYdu3CR!M zVvUQS+5)Ss*q!2Inyc4r{7`)KkLbzCdeCJ!l|uOr;e=}L`Wlo-%>oiBUxaQkiEKQ& zsS-_{9)<1aBy2&2USzen;f4*`rSkS;VsAbd?r9x)fr`8+aSJDU@dk+nGTf>nfx-o|?TVbP40;Q(V(Q6!r?9xI%GC=nD4kg=Q{AH z-X4DQ1eB=qL_%L{kCV0a6Uhv6H(c%K#O#N5hl;IXbc+<7AH^nEasCjq4B@}~#TVmR z3EOd)XS=@VD`tB>wKZ7HSmTZi#@@y=RvriFZL-1M;wCS6912)J)s~~K@wJt)428fS zpp`UFfUzM*J7pmUP$~zqd?Ti*HYsJUG3J?V9EEye=gg0>aR-SkFl2Gh<(^ zi`-;F%rNo6)%fidB!Lnc_rBPBu_DjG%u$bf8?fwd36nZeA)(-FUg*(sK5Z|egFg$KUP7{P6S z;wUGCR(!=BM@!IF!yt4{E{Z;4rL{+Kbhv+RI%&K6xNy^~sYr*RI;PRm8IbqIWagX4 z1p_#ge#41J7;^##YiT=y@*Uw3;Gr%hUL=LHJ+{?Hz}R#xyn8$Fr-pa`^sFQA9*)T0 zf$a&Kva16_+Xto84KyPzOnD%r7imX^peO{M<2%6s2aD4Wth5<>8!KVFHkZkvmH2*g z;c(YGqaS0Mk$2GJPF>_foLv|9Z};ub2psN2oQ7_wLm)PuA)q7@Ky<0t0N&Lrm5qv$ z0i&v9K;_!#X}yGLcij~;hTWVJ-l`7AVSOxp6WTc;gD#})3hC4*br*ud>|)hon485c z%1s*6n|-cCmomY%1G1F*rg%KolLp;Dgj#`&CBwv)u3L${t*>8+2KG5sABpVfCuO?( zHLzVJpPZb7?mn)AdaO9x#CKefAL`p{ZDSxj1qwAgg8Bz2`T>s}=W z+d8L!E?u*!9IJaR#-fzz2J5f(6OB8--k|MA>9P|E{a!*eBKm_iJ{ zuWgLwv~9=r_RmTe5Wh0@P_eRYg80alhGi*N^Aq5c-oZuNLm##JG>~!c=O; zV#p})TDc7CC6CKjSCTND<5wq&O^p|gS(vUVQ|1skT<3kwGhX278Qfx-&Zf_R z1I937cv?QG9S?1`mo9kmF}zw#-vdjS*3PgSd6XA~nBAzPh$}L*O0829zlK{bwO_=O zIjEo@es9h1kbc!KfiaKMvt|$4G3Mu%G&9e0qOyU{SuS;hl77n<)*QlI>2d4S*r|#Q z6^v$6K7k1a^i@Uz0H^GFCi4vXQwzuiO8hgpdd6o9xR)t$J&pglP-%|$ z<>7$hs6g2ZXd1WTa1j&~H0uaHkW6y8PA#nAih|6{s#$Z*Y-4eS+Z=wT3rbG$yLZM% zE{RvrEG@>@_;99DcyJm&SI^I3Wi-BZc5boM`k=;R{6Ds&KEe_aC53D8%cn57Ieej9 zoM%>X%%zyPy!VexcZF#whl~8AHHPPi!S8Ny?#8pYI`UCN9B^n*+AH^rIs28IW3V=S zdtTNi&1L|K1?a0_%VtYg&IGg=LudHThgtF-lnl&IcMGQ9R9PRc)zo|to2{Z04U4-1 zR`A#ifftroBnc2@e0$!YP;EI>IK=T|jqegjtGPVRTW{33bN*0V=NwmeoxmwqOYNnO zL{rzfDN=X>UN6_7_5DmNCgoOsE?C!D^!>iWZ7uq4-(z9a_cq@s!TODiZ)(aZ$jQk` z>n==jHiO%i`KPGRzI=?suAbuaWO;#?vh}X1QoTQ4?KV_3Y+*SV)Xcu9T~$L}Dr#Q= z@meI5GjW3ICa{ltR3SI-es3v87+O=g z&((@K=zqx2l7;bHbm`z<$uUl1F~jD6W`@=VqxE@Ehvx*w16xI=^|b%gSV2F*w<7EC zyx?KQ${#0N=p(+*T+XC`r<{kAsrP2(HgtO;ewKoT&y5_d)!a!9> z1Ex74E_WH_5oe*V1?Tst`s-g`zS@-Py{-3C-8A=Ls@IOk?Uv52q$HxQ6iUf}G2uIY zC|xc*rnM46Z$jtG*S}tV_qICCwRMwS#4X$C7K32T@!9PC3Nh~~4GS&$)v^v(?s>D8 zm6-0MPj6Uqe9*FQy=|5|W6e#gqAL3#<>|dgY^{@M=KB|?9XHEHjZDIEKQP_PmV1JC zbSkHXg$vr$RD}Oq-xf|obKH45XKS0g$UkQNhOPi~-TiOz*&)<|vUFs3D&E{j z+w}~<`_Dz3%cyhVRO(pzqN(0gE9X86PPw4kVxaW-w}eB9r4_z;+2^iCFWz`o zJ0#Nxo;#h*3!e`#6~h(tc)CJCDB^t{G+pRFtvGiRf#Yr!@}p3uH-{pz*+Lns=~Z?; zQb~e|BDx5kpvOJd?YgPzBZ|XvLuPN$0Hw=p!!7$d|E=wpcLo(;JORkJD!%283B8AD zx>?EjL4|5>o9l(@9p%y+nTm@n#na5B2`*o0ZBJ}ehPXQkVY62710?;*ZFqN%fe-Mc z{1f-)ao{*pINHBnWnWvx%pUcGUF!+wcNq3}QPzC#y}CWQ=+qWAqRyM?y}NA|#pl>@ zT*C+N_W`QvZAP7vg?-i(+OlxZW|T5XckBB7T9#fVPdXem4^&!aGfL*!TkE8(%euOG zvow(IN6JphovkHj^N+&bil?{>xeIG++AyWAnb~JuRo+?(r#Yv5SG};J@-$ z+wT*WT_=-23|IejZk5-_EI*yCx?=oe ztAbrti!N9L&n-JuN%7S_HLL8c>EBMe)DWE=6Ig_9b<}P(aa-%q+ko!2eJq7mNB24w z^8OqI_Z~&>(50i5f3)(CR{rN<<)it%A3J~VM!P3js9eXE)EB-R5HGS7 z7M4(+4kRdAyD-{&+q}zY&o%H?S=h29?4vZ{k4E@YHp2H^_xRpK630k^quqS8n=jfw zJ*b6T(;CuThOHDCKbo?KHD$%xZQ}OSf&CIso2eM8oFhj|@n|U?Eyd5zQtW2Zc<2_c zk^kS`*HrBOVresWbNgKyh0UB6Wp=&$9Kds>8`|3Dk?kv`ZSnu?T?>2@Rl1+PXek8> zr6s(F!t!wYm{(?!TA-yZlxry!ib5$iGntttOPYivrL8EWyhJWwd93ohR8f2(TLss; zq6P$hRjQy|cXa_Rf`H0ZS#{UPy4*Q4nLOI2ZQ4LfZGOK}noR!Z%$f85&Ue1Y`4B`+ zXjMGTXh}7VGXXf$UTYBaF!>>F+D5s*FAejR|+jQ2Y zOSn`FBUjes^d)igAwC*u?Kc@%?<4&r6D#Z!myWQ3|tn8Wlhn zb^2l*IM6~4NcP~B2i-t?K35?IDua_Pg{4$b8U?-19klGvl7}$7Am&J##0Xx^s#zXY zVk(+L7=of%rIHQIl4mm&Ib9)5$3m z3#@};c>$@khI}HcE8|5ZqQo^Z=GK|>;+63tDY>$*uQA_SIIyWptPuX~n60J~=eT%e z0C|lDYZ68b9KxGB6e5T<(=3*}WpGX00{vE$MuR zm)$O+uKCgEe2I5!qkX#2_OcmYKJaQZ3iarI(#@xo@rZBfI%0}YlbBM8VJwZJ6sA&Z z5n&&vB`JhNFcjgjj*BV1wa7}_^j2OpHpq_8)|&NExw})O5MweK;P%{XmvDqi0~iQu zXXrTXB4OsrHz<`*@i9H!w3eVOqIEjHG0UAsYj286cs7fx(xqsz7t7HIgwZ!GZlm|; zm2{vzK=G3b7|N+xn!_oA(=rI6W>q}JW2A~#awLUw0WhM71ybaCl&!Val^D=2_ae)y zS&~O7R;8v0tqSFELai45MmUNhF>KqEZCvla@-A=lvMWZpJWY#42ZPX%pZ-pVGa& zKF*`T69dksxiu;&KZCYUSY_7BtZ37AVHh4m*Q4R=9a93m!^FW;4XXS2BY%dit zRE5(ht)*x+&8yXzT1%ozoWp2}CY5TY<5c88xSg=>`qrRZ?Sr=lJ)JW;)9geQ&WSIK zYmu`Ql*j4p(j~^yl4jmzIb&B~ydRo(3q#rY>bL8$IJIuq-yP7l8$a7l&qipMcm^3t z1Vi8`%JDdft9c6N34|d~0;fooS`BP6uDRKP(GsS4&j7WU^TQd%0qV3Ig21g`bKHS( z;$wG5^E*R3!L3SfT20asWG#oe74jBZyHvn>aH;U!2OFix%jdM~t#au>XCXp2Lw#l~ z%BHubWbW#z1GWEiuYr)`Gh`{wb}%kkrhB6f%`(DVx!xu<=QQt0 z@g8y+A6e&cb;NmaV#m58ldG-W5w16t=#6de(Crc#<)0m+nb=l0iG46ej2m!SEfV!c zaU5)7-iSMhyx65CwG5`0yy~XIMz(ge)@)bW>)kYMOR9_0o?+}}yF58ik9H?kNw>+nXyHk{1j*R}1eVp-zi`~+$MoZ-Dx>;CN@vA2()3XaJn!JW^)G7DAArQXB-svq!~;} z(MlCd;}oJ&s!?HMO0yUvtSo_8#w7g@oaGFDWQDl3hUJw^e1ayc&BD>ns7u#TSe^+? z;wJ`krv@oC?JC^(?gO)8HEqamv3Yx+oYW*a&dY_|fz`xd?%c&hUPdeurvtf;%qq2k zLqO#j=@i;+*LX>WMi>q!v?zulI7Sc{O%aHiN7V#}DyaaN%&cX!*(n}cZA=yqZ9$gi zLU{t*_KPbzKiUzD#?4c3+r_cAj9&-HSKcKx-L5!N72Q@!%`tOYy`aT`&=;v0aj^qr z@OH>GuN#TSYI&+ZqCExZb5e6~8Euta4}!|%Ik2eX&l^cP6J=g$=7g zwuAvS&?|i%E&jSr;iP{-QQ7UjmeQN$+>Q1O5_qSj zZ{$!gulml&&YUg$o+teD4-FCi-HgO$gXfo*lb?0t#*K!ChSR4{I~Z+89uUS3{WTAJ`I1<4Z~9W8umXb`bS_!VTEojV6gyZjL^{6B0)W_tdFO>)cO+EopY}lIS$e<2p&={J#@1iVb?j3O`!B2EE*zS8 z`BJEL{wU3ysDpos%?XZuDE-G#Llm*dpzp>ZV^>}ci$1>elZn0acD(XAyK%s(w+qOSSort7f^sj%MVT@x2MjzL^jN$wz)znc zc1)QPR0oECMpka-fvK7mo%Z~F^B<+i011HB_>U{y{3lV7|0sd=@V}GzA20kwiTwZJ zl;xEG@*gSz{Eyf!@ISKfNc3WRUXVFxTo5w%3y8U6<+k+jG?vPK>Pzy&Q239QpeK() z`>)5G42F+~5%xQS_HX$qs5q$Vv*OT!n>3?0_I?1)cs?_2m#!*$mOW`$)jA#Y)wiLM z*Kys-v5LnJAodTS>+cMhIPeYi#4f?JuKH?$|HQ3Y{|Q3rUjM;$!uqdN_VB-x_*hFQNmGAinyZ&rrBmAqyF za%4XI#*l6QckJ60=%h;n^J+rI)@i=J1A1cHlo!$Ewe=21IQr?X>!a6xHb=v&Atrz7 z3$F*o$DxQh&i?9${nDQ3Yv>;y^4cAHrb6>-2TnM=>cX(9(i=DaRxoT#_*%YtNZdW} z#n7;@d9k~qN76adu0MIHemmah+ttBPVc*eLFID!b_>D-77W97-y*2AUiVFXi`A?xr zY5ga9_}@wV-y!@A6#0KQ_V-PJ)c?N+{8w$zY7~+7x9vOjT_-eyi^smbwcm+2NY{eaie=Lolva{vuS3}kxzib~{zsJ5m;+=(IpD$jqI&{Bd zSJs5cQ4Ynqx+e}lvoF1NA+j_C-iP)yE5x{Abyh z?6!TJ!&Wy^x8u^_U)iEH*$)RtQ$<(fG6tWWem)F7KG?DEW4!R30>Zh*f99tj&Fw?`+V@#;Ge%AlX*RBn|{}g zO&OtzfoWkszZnMaON8#Yu+Z`Chxb8$C_dLnF3 zNW_`)yqPgK9Ojtg;-`gCFTiI)E1|FdJk6YTC@n|(tK%P)Q|$fu9jB*P&#Ek3Ryh|w zQ|nll{?3);f_s;oJ;4PZ-J5VFQnmc2!bB?k_|(vqr{-2~Ua>ashM_ca5ZzHuQ{gX^HD)tzaIz99_z55h}E!mO!3i(nr)T6<^@MQ zUkN2KgMJsYs37RY$cMwAhxTl(*tNHjj}#H>e#z4vHyMH_5B~M+xc|xv+1k_L%73ZGkFq6vAYclG(8zPVR4*PyS`#*Y|Uu=$r#yfFCK z%%FQl)_#7C|8(T}MQQ8i6)f5l|LMPCK6t70%dFzix(^B-DKy_*uysXn-j73= zw)ES&_TZ^6vLo()?k}6JeYJVOt0}!lD{9|Avwq4~FBjbV@ndPPrtF-lI`!SYixuz8U<-DFXA@ z{~-{9p*YsV|6B4(9i2HVBY%Eg7Mz_wGY8I_J2huU1{|N5oO~~yk(`{FpDBGnBq1oA zZ=sD=y;MmfIXNpAxIaXOX*~zIToQ;No(|u)d@3;vrU?tKP^!O;KcKEC+Fqmq`(=X_eiQIU`PhLhDq_FPspm{I9ogn{EN=Ezy;o4wb6{V&EHFwZqMn70q%CUXNjqRGo^00+&GQB z*hYGZzL=KMoAstX>$-NG3OowJkU$Cbrbj2x+GDp6{>Ax2i3*ScGX1?}l^9 z8*jv1*V}FB6Kyn_Y+@3fCx$qQd;my3M%Z26-p>cpTDPS^&C!GK^$rY*QwX=zhKnRO z^Ddj~N4mk#mS@vsK>;a{UO;jroiz|cO8kqvOD}EV4Xf;Bra7;^}S`dDO&`PbE1p!D1MT2lBA2A-_?jmnN!~lkLyNH1n z_J3;SE!zJPDB|A#;gbIk@3H@N*8Xpt%m4T9u^+q}Nc;a9m;Vo1wP8cp>Epyw?2$2x z=ij+Qq1c8GiHo(D*RSst6_qnREX={gjI$p*I&KuLX$bl~{~r5^9%5L-wquUy-~lI> z{Tfl<&=(rG5HHT{_3W8l5pfs82OP>aOoWymlL`Emb3 z&4Yt3Oul?5Q#B0wYpaj?*#D7AC-7@gx%-XJ$A@GXnM@lwF@gF9vl~y5H)yvWz>78B907V440sk zYw>H3{1i00woC#E{(r;(21^ZFT3A(ANqw~?*9OtwmTt4Q5&PluDqZ)neoc@!@6+AjIZOe-g84~gCs<9{5AE+C$Ggo+8;|5II`tjDSYuYQzn&-c) zj29v0q^kXfpEmIy#g&ws|4Jn#@Sg&2_3*#P{?lXs=|1+KfY^I{8v$;;{ilT%+hY20 z1L^d_WU^>=6~2J7crK_xH`Z4r}o6r%Q$+! zakQQ|E`k{R#$i2iN@Sc8zi~KE9HWe5^c#ow#4*V@CVz1##1qFXvKalClDM8;X-H;xx?%VeA~zj0_!ocm>*`~Al8 zn$OE*oMjz%YGiYu&>}bn&LHS$;G_-OU~r`|a?UJJXEHS?q-xW_VE15^iv&rZH_dzG zXsyoqwG_!`qQfWq%I|i`u|!x0CrY;iE|=Xb*_65{gR|K5JUAzun=sLbXQlOgS%BmT zC5jp^6;pN*q7R*SSc4r7Bt^c({k}r z)GSUyj;;=`sI4(88WLYg0FYHs0&G2BNRI+RK?2|hjTIMt z*_}jKHVWMs+08)`{;>sSDM769e+3B8E`T7$TY(%{B1}(FwrE$88_>D3Wi! z+a}U>V^`9ObF@3-MlfjTQsfNCU;p@gIj^*EPGg@lL+{odc&c%8=;Ex?)-;_m z>Sqva%=l3#JGSLIUE8O$$JDHA`%Im*K};AqxA7ud z)Nf8fW{$1=W@#)drzCfHekgR~+au=htEzkCU-=wK0{$mB8T}tPU}^s6$+iFCZTz3D zyzD1(|sQGZk+}Coq6_&>`S3T0}^xx$co^fMF z&V9rGr*G~{MY#oM-dKFiq?`XcVugY7VlQZO#?-v#fzIJ|I zR@S_dEw|x{(x=`T8`^~ipE`5QtBcdeyt-`vu_ee>FK~HHbxm^;bYjncf_DBNcey}t z{sZH*{huWJ&voB}0{hR1lrI|Rei+zd{|63)+_$rTXZG&p`cVD%(3*D+H}XNT;<>Ro z)i!pOtTmyEs6|eH!sr5W0lMdF(@u4t_-5b+mcD-7cP5>>9P}@a^#1$MadTdMD)+VT zx zk81yx%J}cK#{a@z1=(v#G72wzFJsudy~5{gYg)N4wDu3MvLZk9@~1i1&mB-t#_yQ6 zWbHLu27DC0wkkC1m%aaY`6uD)(^lJk_TPQ{e|S**2OwSlpIrN&)mH!i@bNF-n#%Lv zGn?!G?Ke)GxubB%_1}7pj6ds*E4GBEk2v+h>;a2z-1=DWp#viQBbm#8vV6sgDOsma zzID^;vPrj3dTIRLw|>9j8|U2lY47b@o@hGn&4DWh4Oq0F@0qw~;zz&ad+$2qfWUng z{CXeBkAgz4@vKL7T$0cKAN#7;U&Ae7BIf*^@^;`Ud>N-FID@f5XQ7OJ7`c-Hrk86r2{`vhcZYhX+0P zOvUboeKU5&eme1iSk0)>AMd$v*e&3O=quY-o-%sSo|naoi+}syS&!}hfc)&&*H8Q2 zraRyI=fq7~)#-G43p z@?(F^{$0j9x6ZO3UbZYJNspMI{->h5_+Nme`#*hg?EmaG`yV(l?}w?3|I6F!|LN|t zdEu=W=j7Z!tpA>Vg}Zyz3|*YjqsJ#b`;Xo6!c7egGwaWtz%rh=_*;!*8ylZ#+*Th6 zJ#ov7y%qC%o4x#{Ui04`{9eXw`o*$-e|Q!b)Xlpi^!uTGLyPXoJ9X6Nv%!1c9+G|b zc~68NZ_L_w&fI;ketpBXrNhSz{>#!(^_DXSeGti-mQExR+5eGexK5n?BSs)Rg8xC& z{I72LljeV<`5$TiN1FeU=6|I5A8Gzan*VW<_#bJ$$G;ZeqjP+nH2)*b|48#cI^uuS z1pJShqwzm#WVH6G=wcI*u1vo=6?BS&&wTolQHd0kOjCv}1ym63`3i6-pzq0qXFd-) z>REK?`S~``weiEXNx?n(VO3_C(2zrnD23XS1X#wPRoa8lCjupRSk+CTY|`vW7Z;Zo z&ra3(|7P3}7_L0Z1u>X1BDiFdA%>;!lu?Wksj%+>Z3R}y5R8bYl$D4Fdn7=cPV)i| zT8mnzXfacpIx0g8{{k?`F;v7F#VrGh2m_GOo&d}zzTb7I$2^psi~@CZh#YEZ6mfH* zno18V1QZwioqusmKILtmo1REG!Snej_%)(ge zQ;fV$BQNMq14YyqOfd@>#%^L1xG$^?@-6eQ;OscG{&0VE0^Ft6mO(55A;M<_ArES5 z81NwQgqs>n+FjPTUySIewJxXze6W<${uoC-piCIIhSu} z?JLUxhRkY9oFDAkqNl`t9YRP79vQg>H6Evkx^#oMR0u;zk(EMr0PonzY1!-6^F4=a=p(MgcTi-T^jBRNv%92k;`U#ALmzG%yjIhcnDZ!Rw-u-O> z+U>8UE_SXj*i#VLAmnRTE$E=^HPj_%fMdT?rkq@(g6gHMjX#h=7*dx`J1ykQt+j^` zcFqQKOEpc@qM&+dTtG9*FHJqQA8M|BVGPm2a}c3$#(|kj^B_0AZ|#Yv_8*xh2$u{9 zgJIC&M=BQ>fOEeL2XV~0thy^{!101AX>MW@DPCF=aNwhDMG|y5q!PZtf(jeN1sAY9 zg^>ZoW%-Fbam$eHBPP9$@rWPzl?CyA{FYMQa&29S|t zhin}&1qhuT9f43eW1!Nr2K!oSqn+Ae8008E;YN#&5C%i01mR&_L_F+btE(zi!0fe5 zVc~nmxFi4yA|*H7*hS=6?Q2}Jj0|^ymRRa)8BIOtJg*=8<3W#!F1N2KNOs%waD3Kf zb=)FqoF^fQArqvZ+*Rzxcm#E3do-o+T2eZLD0VsqtmXnRh7J6ltGhjFJqVQYC}mo4sel$1C(KveXl;WX6#rAHi;IuIi$%}` z-BlC-2`ydHED)wXa9J~h*!R3n>Eq%P1boiIpfA(mkOd&nxN?XfASorrW0XO$&b zAwSWcZ1aGL!M12fjjWKd;C7+bNhYBuZ8-!J)K$sOUqYyqVbJ9b!Gja-3Q(7MCvMty zv>f7CSQn=Ptc1b`4zB>N1oeGS`zXjOJYcjr$1 zwRicanWB6}#;-DafA*b*bIzT9$GTrW{o}&RuXwOh#fo3`51e`5wYzhBhcDl{{%r8` z=?`UvqjFWylHm4r>(*uJ%P{!OSzoH`xncgF%IAc>SMuG)JMwZ$BKuIm8}&`^N9u9L zm8(Cm20tHi|Nb+3^yt56=N;bS3)hZ)v9TDcxUQ+54Y$NhgeJ?Q@5c>gcJ()|CE zW&a~Wt^I#4dvfdYRPz765!iq3Eoxr)^v#(M{)*|-KOCKtQ*zqJeftj|^40pDZ})uj zl)`V1+c7rdK8uQ`Mlz<4d~bf{z$q`xyDfWozmJ>jtm{_oA6Y+r*s5jWx`K=$!|KbM zVuM!YmYw!u_5*!$a-P3y)9T5813h-F6KnVHd_H^n&VGfPD>5^xzMBy`<(@&qzBaAt z*JI%)PFSZ{OxpOO`DxBFpaVE@kS6OZJ4 z!JPjZdRwT=?SRHKw*yl1He9ebdvYxE-r42ZA613x_c!@_O1|=yJ$v>%Jsi;WukXqW zJ$iMo^MCx&x*lmGKB4yCiOq~kqvi+CU`p$Pqt4?Fz8ku0_79OWe|9MU7Xz0Er0xIz zIsdnrmKbg(QKs3yY4&fL{o57(ObXb(i8(YADq(_c>6QS|93PsW=M;q92czoh_-5px z=Iw?muZ%7ZC^>O1twBZ`Jv3vuh zu|g^ZA%GNNW&Pmfjjs%+NEo+RT1OVvE$EH~>*D9HNiT563(P6C&|1Z{FO{=L06jqz zK%5ih`HHy(ZssS%A4%tzS2xQxR^7T7Q){aiwyo#v>bk1H&qs=)wP78tO|L-5E1;QT zMETCLqz+s5eeDz{anfW% zN)uT?r=}o<+MD}+II(e}xM_$NOos_ve9?!D`Q*_qAktRE2+r$i-bQ{k$WNLnNk zkg8HpWK@9&{lG#HN+Lc)2qYKfgNvXF5=c}+0!1p}+*v=042BPO$ zTEj#l2W>3+B~+p~i82hP@S#ly`!xpGv20>;HldOzWd@W^iog|UW|4*E0G>J8>GmqZ zDg!e!WvZxvrI3=$h-Fk117N~4;lOdW0>stZ4TCWc5jhhw2c@hNmT9jd zOWx=dJVU=c#?{{qVU7)tfkJSXjdRX$X{}dDfnqMB)@gZ!t1TWT384Z5hdCy+PV!_y zCQ-W7leC)0I0VEM=OJ)5UY9(NBzg8iX%EsU=Vhd5BnRggkG^xO1Jz2bxUoS@EqTnE z{s20V$`GG0-XWO}&gG)e#?EYLrHbuJJfe)wM4Q2|D9gq~^4f7>qShDy#iH2u4MGKY zIQwfsphjUyf|-*pCostnp$LK@1tZJs%1uo_Ha1S)yfpRy!f6v_dD^=J)n%Wd>=#Vkxka{x`P6Ok99 zFA+SHsqtErX;vnXj2g6V<(x}}b1(@DA!d<;7v8YMa}eBMk|-$p;U?!HGb|O;K?CYz z8L^9*tY;FMQRGNc8(GNKr@-Ve`IHLiAfOOs4l#wm14!;EFh^}N2uOw?HA7`jDx!ni z96lQrnfG9{a8gCE#A98KrVLlqVu)Nx#d9$CWK?!mil}okK?_46U*g7brNL_$X4}33 zItZvQ2i4e8g-c$@a$!LQNpTiRZ;du$=sZY8b)jb>_Ng>V{D{^jvH?D+Wpf-A$p!WIJ`nE|rc_pPX<2g0upoto5_RIr z8I20(U|v&~9YzJn=$8YLD4NeQmeMr32e^v-Ma6XxSI8uo4x%fax}@#o+6DHTcE}+y zSVgv?;yUQ(%OGG>{lUP|W)v|2lgcKh${A{U<=jNwxLz4#ZDLZK3)G_QL|JPrCg)X9 zQF9T8%tX|@!v?jel@mx@FkS>S+0i=o2M`BuxZ*@XcJAwc<7PhDU${QpZD{Z9buXgd zZ0EttLX-Q~cb)H1tBbJWE^bN=4CB7+ihE(0r+5TR(lLW%C5eht)0Zg@zpN9m+!M9i zZ}`ngmB4ZEL6svwIUtuz_!tngv8Dup^Ru&Ou~%F2*U5DRr6EK^vA58=oHVSswHjSk zBDiv}K>w)5@z^|8=U!~iB^J4yNee3bs548v93f$yMhY9Eb|A|V_foeU8boiQL*J>{ z9uFsbWlYv`3GUjGe$``vvN6ULwq|qIph1*TOo=5~#sg3cms_1qw@w6DFMaTYd^t=o zQ>>>gvq3Wr&Y=^K5_<>m*O370P?e)XP6`~$f!T6mYC>*}wkahcbRuFliLv^oO*$Jz z=geZ{!jKwz$WBM^WjU}4yw&B+ zK&dcgW+;*lL|L2d>DluU!$nz`>BT*J=xe3Krst1MZXBu5uCgQ=G)N({ zb^=v7SL6>1_ zyiCK!L~KG@o(9FQ5{GrH?6p>8Yb;|XbCaYs(Io^QxVA1>xx_M5;;`663~!`!T4{1? zI`n4@8-i9dV;mX@OJG@v!>ZVs5s*_5&XVtnWGz%V1rW%Bge18i0C{&M4(nsN4Kh#x zgvNj}YHz)zPy?+*>C3GX6Pj2u|7flPypvG8L_UX3j!(v>)@YKu&y>?HXrrBn3U>L9(~CIC;GM?SEv zb9c2H>)F3AqBb1RG3Qb=3RnoV050c@(T63Lq1uf_2SiFmmVyE{;cXI;=MXbdis)tb zL^PJbvf7Q+4K>vok_iF?Sf-M5%rLFW4l&FRK)L{O`8+ity=FC%DYDW!1gZ>zXV!WY zk@1w75Sp=tuwR6}-#yS7>>lXMtg@u227yD(SqofPtHF4KCP}6+`;=_XNtE-F7cNh& z(^$Lnt8|7e5Ft9IE!rS#V(5JtXldkt``lZPhFyb`F};_??hC7ZLMB;^5@VuR(*a{~ zakQ&{UENR>Dbb>n5x6(Tf|Dqq9D1BVN2Uibu4ZKI$~J;d3U%;CIOGa!6eQ!^2A6|W z1La;9K0$?jEwY9Yyu+ATh@hka1eDxMZUo7?3~V9nRovH%!&~QcRIG%aT1vq)Va|j{ zV30}b7vg?Vw_3q8Wiar+~esR#X# z)NSJUM>_PDdh`F7r+T%K_^P(tjRPR=W4XnMHZq$G!)#F-%SEX!>%#Hz{*bv%knnkT zY=a34Xe}tKMUF`#XV#09eCEbVP**@&+XsgAu{qc>7c_y9Nu;35?4-io0|iOB*!qRY z*1dr>H|i-GZgVu+J12e6oCRe-I&G!1@e0|l*stZB7StHEFb1>Nk<2wKQ^goBr--;f z(bUZOhP*50@>O_;5N+&E9%+G(!}R(L zqpBJ>%;sJ&2nLx5F^SAnR9tZ3lM2aORni2#POr|hyk?!XE@m#hh|E~wRYosOzzn=p zMIaHgUU#;Qb!NgkbzEeftQ5v8h&DRwDFRGT#-SOz0t8(M_uo<_Ghd9-&Ay=G<#TCIH#rgqu& zOR>>uHx5Iuao=>e!CiydJzVbLz9AU%joj%r4jnq!2q%B09cHHQ*-ntn<8-vwo8EKx z-N%m~AB&w6Cnr;Ttka#myV;KE#Cb@z-`kv;Y|M0V@6HP^nQl++Y(T4b@lLrabKrMQ zHDhe0osH1x#?;-rlhHdRU>bZ(kJ&L!!T{mYZSGRxjwvn?3uiyH{f4=lac~=h|c;tZ>@1OW=)z6L7e<{{T{a4g~DfvbH*X2H^ zXI}MxgY>^>?=5}(|Hmy)ytJ13|A~wGzxB04pZs=f?8)yxb>Fsw@;4_Yu9we#X2<@2 z`qv-aI&tIHZ=L-)_1H~}Jtf$^&;I?F=H^EKZtjzFbJu<4?3dqob?(fKuZ*(86X$-Z zck1Zxy?qOOaAfw@TmNM2f6i{JrelrtzjsVb5qs~oi7~%(E3l&fSL~wxTfs>Gtu$5t zH&XxKzm@cV%gZnS?Mb@0@x1<%w$s(UpZ@l)%N6_my#tT-4tH|zICRsR0?%4X5 zb8j?XscQUg@c*Q-*M|Rd&g3Qi=ce-ijn)6p7aP#`|MwhutGkB&f6HGNBjCP>6L)@U z;&WSnmOlb6BCc#2;E&1uY|Xrd2#M*-~G|2 z!Vhk^{iAc?=XV_X^PAeA_b-3qhF|&4*|T^4%jbS=w0YZK+;#i8$DjDsXMU`4@O_8x zJUhm|{@WwFk3anI!@u?DTVH(P1OM^a-?_Q{g+HG7`k4p#u8E2FeDjIN?|AinFK*km z?E}}D@7?;lFC6>RC+B_ve(`@_X-)6lk+*;CCttq)*+2NuH|~0A^#68^e*fv`{%z#+ zYj3{!=FwNq$y3km{G0#!($n9)jotbG>|G0Z6xG?D%_d6-3j_g8s^YMu0+P#_`%DN+ zAXxD?ffND;FJ#ZmIg^ZRHeq)I308CAQnXmWUoZk9TD(-e1Zpjyzb*nXKv1x1y%&^F zrS>60^@n=vncdt_5)&E|u)7Zl+1Z)1Gw(U?_kHiVd}nOxY`+Y^E7ao=TgIkdChp6~ zI_!>E`_iR>74^lxsr&;~rw<{o*biq=_r2Ed$oyBn!ql^~vx^_3S1gF07L_xiZbM+8 zuzT3B{@97pk?EK3d%bVMJa(PSQufV=wRM(3r5`&FEwqiXo}9Vtz?08x&7Pwj z2?SOszN7Vh?eC@c!;8emn_RA%uO2@B!f?v7cS8AwTPttTZJ^QmkGiiKDo~8ZS~pb< zPP|g`MeJO=V{zqh>d4hs_8D55$=#W=bI3RMo?K*mD1tZW%1Jn z;PfoGV9`@?F}Yw;?)yUzERGwvGe?`elFFSBNlpKkFMF8x#yi3$`X_JyS*3^UKhb}! z_Fv@Ku>J2{`#*yG^b6YmKGCC@?$m#?n)M$Ym9U}FUR}8e53kxEc;q9&GI`e2$cqx+ zJWS8CyjX3u<}BO4zJLAdU;petzg_po>ij(sZx;{UrKZ&^>!18mqh%7fZI9nJZKcI^ zx=&s51Yn7p5u1`c_DFHqE_Gl3F91E&|0}U=`hS@q|JgAAdyD_}mj2(3H%@rHJNYlS z^#4RHd)q!b{m#1{I6P?S-}W_H5>oGKpq6g0n?*hJ$j4(UMhz{G-Ln~vUaAi0U$NFg z!H@bz$@78a8>_9wbKYHY#Y`CYF2 zlrN8DT5YrY+-O@8Idk!xqxSlk^o1KAEwrtvo#h(%r{Co5SY7$c%E~-y(!_t9$p6^o zBF}Lu+W#UoxnTU#LxY$8`tMuvKStR@T`TgbmDxA{pZ)syTzg#HcmTFmEP7_zqtx!x z@iT{ivS7`Mp*5q|yiJdx9@%u~;f#qNT0L*{uYF=c`g821ac@2PbI{2Cs_N97SL%O% z)9^n>p!gTAUJL42>T6-n$OCz=CBJLW6&oM*%%g4y1fGw6Z06p|%A|`%Cr8D_Uln*S z=AP)IiyEI_u_!VwyJCAp)gsI6Xkk_5kbq_L#!skgx98HIq%Tg$k}cE-+cjy=TBlys zRSVg{_zy4l5dV3p4gdL2{LhPF{`V69&EDOCLH-xs4Ib}K|G(Yjf7~h(|3@$TW$Cu@ z{R96z_Rp8;JLi70SD`H**lHfToyth7hOY+xWtse0#*h~yw_KLKY}nG8@wxX{>yAvN zHb2ERW>V99J6`(Lr4>gjKL7fdJm8`A9AMLPzF4@m{)(s_$DB+}#^M*NwywJ*@KE9v zaeQ1%+}2CBdb3=`wl%i7xqn^0erkPQTwKwTLhO?F1=79+xw+)-D<(u1=nE!BSjVhL zsc1B)x~IycXo#pUUiOc=>r#sPOX_Ih))QlypIQXcLHy4tJ*EFy&?f$uLi`W=|K1$` z`Eka7r?ig$*4tv&Xm6HBYqo{XMW0z8L0?ZAwea(Di*@q0QP!99KaWbU9cf$gbbY$* z(6PX2FhiU0eL3XI%yf_i%Px-Gj)QGEVY0o=d(@Jq25f0P)t zb&orB_F&hR(Swgv+itu9^1ry*{|6!yv*IQ$U-?#H1AW3e zvEnw%RLW{S8KrNH&Wm{2X0!daHn&f8ba_Od>^?>tXe^pgZ5_1vaGzV$ zzf%!4br#!_0Uv-3PtdUd6el0ba=EtF52`vK3f9cN^rX1>IO?72F4?)iG+|3PLO2Ki z-&6BH04qwZ^FIIx#sA^?U%kcuA8-D*&=UXKzPNvI#m4eCj%cRQE zkvo%U<&MMsR^0QcLG|rNS_2jLPT!k{4|r{Mn8ZD+|Aii#|1Aow^S>n!n*SXh|LZOO zC$#YY)WL|x?&QC(W&Gb-^TGDtCZj7{S5O#F^gzznI5(v};5tZNy8<<{E54&^ZD8=_p#oj$S6a@}=Tn!9a~K)$x`&+d9+->FFO@U}-Du53{D z$0gTQ9r>ekUlBDuap2K00JtMIMI3uzSLudvmb&*&P5;JP{o(2C2Lge+sg>m?|59_zWPX-+XsGK@^}&M{{^7YxM%GXKX5eKO`dHQN)|3McORB2quLs{76*zK9 zBdA$8>dQr<%~snt`^)z)p4jkqd8S%3pPII*oTs+E8RPo4{G)Z7s2PFiNdxGZPj9T< zd!Nm2uZpl&OUgHqIPdA4;}@oZIV=Bvc;)srUIXRjHLZLu^5*4D zFZ20vVNxMBmuCBd%a%LIf1U+QtNs_v{(p`LfN=cZBd@gKlcr|m%*wu+o}81FNoUWP zn0ajm?MO;Vxt_~NNtu*0Df9uK3>Z4c3q3x=Zxnf;J0<1nDdxiT;DYhA0t}Hetq}Vm zZ7yd|!gEWEdE*=zMIJx)_>*$Vim}5?E?~Y3Ev65yG#{%KK(7z`$IZz3MUre5=QsRr z?99&2Or^7eZHdk_eEzhQ(D9fwx8a%7v~Iq6CA{YIIcP6-k8=dq>iY^X_B&`l`O2nm zGEX@3Qa@CEoxUz5^l(ipBvyd^bIU#}v&NK3%37Ug8 z5GlH-*bz(>(dHcUeu4+d;SzV~5AvtmaJFO#D1?TmDH}kVuNZoqS>!+{l|VMk$7w0S zgP{xvxW7|UR_It~F89DfOwQ82Q^J&%!|fN+ zjF(p8^^%t4Xe|_aJVk!G_$e!+AA$Yt4?9k{9hYjnm8OJMgh})u8yFCX!Q>v_i!eq$>li( zhL0xy`~{d;hr(hv_G8-2nnD-pbdxU$X3jXb{37jmsUONSa@Kn{fl8zekLE5h6Ti~X z?I!OEu-7o{K(pUVD|V)Zl8SVDGMJ7YW`rh4B99T41W}Q&CILy1Gy$_fR(L^!tiuU? znqlOjlEUKd%mmuq2=~M$I2{6M?wCa&)D@N!RT7hMGOKX{l5`0{foGKO0r~xO!oD!J zXUA6Lbfky^0|=fx&~*s_4sen}TCOG`1~g;qE`q3?%-O!tVNk!re9UV=z=}dtvn&9O z5j9ptP}c>8;h~NkP8H`Ho(qHYJ)QcuLu3KVAx&ZhsG8l8vaYg3mgqoa8AgZXLx)py zW9aRcT-E<2kSbW_B^{_b)G^dVo|84KsVpLp@>moFhZ7eT`^&nFS0dKnY?FN&*%IPLdo>-5^LC3-EhpK{90dk6t zSqX{6*eY1jL=B6qh-D7xupLxGhM?u6P&}J|eq)VGi`|B1_|F5>F#;@)FhCjuk*Hu! z21G!Jh!u#I(9BJbI)i$1M??sGU$~`rMz(1z!!kT#7|bJ0A(9wD#ONe41`K3nks#lm zMGVKqorIWYiBaJc3=|bAP?2~M@e1G+02B#HTt^T$weT}O?=IugGw8S4ncl7kiPdFI zgFxnqDc7JzezPn`94Cf6t7@>LdO$`Y_V|n-u?mT}{=Nw{L*lu^p zEeaffKw=aI@GL8+M30i79V-IylUQIShqDlt<^^XkwLR8i)6jz^rsIrX~m4401l7-o41a-2p)H8B93qDeqBHSpy|S{Gg68Ag`% zHhkzLAxb;pTh4#d=w1VRdfi$fT@!(-NDM~iZm9x5EYI*Vt24xeiBNMmNi*{J!$DIA z7_tbc8V5;CFO$X&A#uwpKu9tBVvx#^7VgDbnMPQdpVy|NE8M}@DZRvE1!Ijz2t!>! z8j0+Ko5_kKAT@<)r@*~n!p`2({k$yboTLGnQ?aCKfaPT3I0a4A7>30J~#6GY6)ii(I_(q&0j zRgP2IqTR)1O3fk2xm;Ej7Q8?p4CEBdDuO6+B&Ja{UKAOPxCzK=9M22qRu`SVrV~`VkgD}O>7QV9pvWXzMUsFx zsA!xha=Ph@1c_5vhIKgoMgH)N_3oIl1TZUN5onsOVonpGDkFta1=XCoM5M68xd3~M z%%Cc-#AD104+nN>`Z~i2icBPcC@LB;QIL@Zft3`fa6A#RBxJokJb(S1`!ID@F(oYo zj4GQlz#J1`IYw4=Mbi~*g8LJk)=Pc|muELGZ7=ZBK4SqM=U~ia0tk7r&qoLIL4=Y( zBtf^4?@6V-Mt*^Rtht=N5W3yY)(j9u9(p?T(-VrlG$YeMN@ciIMxj{%l;Fzs?CeZh zEekEZk7-@=@Ans{rlicDKR>xSjYW|+KgIAMT-t;}Oqx-cPy4)DYo?20PrieOZhy-W z^BuW8(pn6J+}J^@MP7ux;~c;dT-o1}lp-x9bl>D)=ow8Unlf4hGjTX$!nv@*`M=J{ z|0^&(l>buzZSwzu(EhJ%IR9^N<^M`<$^T{KAG)_Y^M3_e_W!VK9ik4^Z=kIS@wXoT zU>bF>w$^61{~`a?0j|VDQ71+;Tz+zV#3!o^V}RYhPG2|7Zl7Mc_u|HW;C9V*XePCG zhf%w3cp#oq-{C;S8_%)nyJtNVH*?LxYQ}z3`srUhwsrqkPcGZEy0Us-R%I=dkgfm=3r-*?WJ z>^FAq`pYY}-Z8P_kyoGC`ICQmN_2ng#JJ+Y2Om6r&5BF5ty!~X(_1HWz4GS8r~bx= zhX3UF876q(`)|~e&Hs~n#{AFL{68(q{Xa_g|GMe>zv&NNy?in6|4*mp|M#9pE1X$Rv+Gl5KHL4HUw-dTSFi3rZQBR;tXlcIXZ-Eu&+hv437dgJch zd%IR%yFqVw>?_xw`xoTxd;9-&&53uc-Fw5AZ~X47qo@CDblvWu-t*(-FLYHNx$2j% zzTUO<#MKv1>^^_n4`Ex~-g4TW-&`?%2KiM&HjJIsf+Ivz@&tJXv+H3Fcc?8be zyY}&`AHQp5{p7RuuDxsR!`Jkjef78auE)?|KkQaMzv{6qSO4`_y1xBSr|*9Gl~w2M zd|-6<&8xosZ*ljj4{W{TJLhzr^NVvDY1gI8`x-9C`QMZ;75|qr_Wwv;_J1GU`@gYk zYX8^nzVH5gG4KD6r}_WsJ$+CA{?lK3a_{H1?fBWJ@85jVz=mJx?*7sDZhgL+K1lx>@IiJHCryd_a`e!IQ#xVzwONv9zSXI>UU1w zctTI#ukXCIvSHJOKe%S)%DW$fv7Vlb2EPBOJ^P~PUMFW>^wQfawruI{e*S&;UAXqE z_q?#{fm2WZz+GSZ#Ophs;pgHnN}jrX71??DTOaaos-2g)E1$J1FS+Pp{Iy!V%ez0> z_2HKu{hw#Q`uz2dJb3-Kdp>#5unm_z;+}hR<=fvp;RoZ7o&VqO)}PvN3cGgbf}j4^ z*H?Uztmx``@g4HSLri^S*(;qxod0`MXt;qq2DVb!I_O4W{=vVU+<(eAA#>;d5?1zq zl=;79{%@K8Tju{BoAZD78HlER$gK#yxAa~-fM1q)2=H7}b+9DUf#3O29|1h?N4b!I zg#b?42#$o{X$V{q;sd3L5~=#uyBI4dxPkh17zr?=0(;~1ldZCfaM;DEi;MQr%lgj` zwG);DxA>)ykLnyQZkQOn+x^WyjahwWC@2~t9qPc4n&$fIG9>THBd%#*4kT7 zR364ir!gOE)ZJ7a`!wW}PflW8kZy-`3`|*SiLx?KEu{0rD5^{fiA%%fT%^b5g?jes zE{D4<Gk*$SFdayAI-&ZD1nv+2YlR*Tn6y}2vziRD_PAq#;&-c`E6(s64aaS zQiPG(aCM~F(>n9@wGp`F(sDi8i7-z%^`2>KG*WruL?S3t?{lXxgg~c7h_WeCT&_~& z-X@j23swQ)j*y7{m}4Qb;Fx#mNNpTCQm8ID8HxdYSRqU>fly6>=89}7DbYI8T-?57 zi-wN#_(6)15W@ovltf{Hs3bHs&M@VG`lZ-9bbKRhz0P;vG2)!?l5$3s57AR+i436o z)?f4C8-9z(%8n{3+}y>DKc_k{G9!F2=L1hRdG+^hAIUF-*n3%HbR8*TXlqx6wWyG_ z*B+QfAqcI7VZu;@{;otZ_}cc7i2m&1P^2MWY1!Adui8HKs$zwYY#<|w=v9&;XwDg+ z0S4lOk$^YQQLXlq`Jr;EBKBn!NpZk62Z?5kB*Hzh&JjQ_pC)PzrITVGtE75uxZ-^6 z&Y4-CHnh1gicW&I8GRN-;$EWT>4ZxPVw5x*AsMl=(f2S^+fmS8ypUF+97IZ>z0eRO z(Tr+KjmF1RG1j*}xRI&Y?TmZz!BfqKC@C2C}8NqTETuv#+kc`1P8$mWzMrf>bmjas2~MTAFdL(O`k zLZgoer9!R3oJN;i8T1d4NpnMqP1L1eopy&Oi7k!ESzxJJA8X8bjPJHl1ho)B2^D1w zI;Nbdj^LPqL9oOHVXR~! zpvMtra{r0ZCi85TRYpi9_}7Y2eZT3s5FNw%((q?lA6_Je(#rVw$S`YCqaeIdqcIP z!9;DrNNa`Q4xHtAOf|w9@GYW84@K853gkLPq7zMds8BGRP)-6-G&&@OK{j>m?1G@; zL3UE-CKz`r#sGPNWnz##7v3-xNd(Ji6V{e1GqzuxtRUP;C|bq@f$F3Tj}+ZSLPH9g zMnxzkCd@#%Q4Vg$u%gCI9xaq`2gHRLm$_0%l zS!f-DVNpfTm_^Datp~ObZzLBD7=U_fEn+#*9S5?RHVkyMPAQ6tIBGo2l6#VjLK^4$ z*2ij^Oc)eSu{h~)!l-Zn#uyQUWF7=$PNBSr$%?-9ussY_(VrfvM0^Ks4)PlZA>0nJ za^v>g?$Y|Owf^4C<4FAC^z->GRl`K9;ioB<>C{o1&Y;<&{}1-UiT>W3bDTZ9_M578 z72)`oR#(g z>D;r;h_O*oM<_US^q6tz@I}XzLJ9}tqq$CazOnJM6U(J~ctK8|m4qkeNQzYQTt5@M z6-ruSNY1@v;2TgMIkNM6kMj&JGG@wC5P=g(opY9O?hL_4ByaQVTc2t}``5+KpdM2v ze5|q+CcDcTwTg#I{zi!Xy|aAAB8+yyP%c8CIf}2M;3ml^lwmqI!VxEwc1al^5)g1a~03i{us2mfSS8Q#n%*q8_w$Tom&<_BaoAQ9j zn2>i6>G6Il5SIIcOS;_Aqa!($Y|zRkVIU_8qNW}K6WVLdx!`z52i@3UCBM1C5j&1y zrwB+5gVE72YEl4_ob>{naS}Z3Tc2Zo^)UzwsQ@VlxvjAgk$EMARn7@voRJWS=b8in zVzoxh$10N*&E+I_oHpPdSdOxWn50NCkmRjaDQYPr2`yA(bu84OQ53`iYVWDi8j@DQ zavK~YOlrm=17O1D>_7|F+j2^vSqogUGK-n6$}z79+7yND4M)zft9$2gDtQ zM;jC6EO(4)?$isCcaiQoFoS&uW%r6Vpa*v^G>5s0KGQG*JmdwXvdw7m#>y zU_j8koG@xf1!t6M$q6`c8iHs-oR>spPEla(ocl7J6bng4C8ZX@dm%_JR`(oz89cc| zmFfukD%HkBNoXBsNeWFRk%BSfUF5_u&NR^w370y=Xw9)L{F2dH+{B7g%z0G7&f2IP zp&>XPp_REW!n@{k^_c8)`k#{7Kt~i;vLB&@fMJMBi3$ zr>Ftz6OW1k!}}o|5PB5k*55n5$F%kQK#^o8l1va3w_vG`DJt-a2SJE(K}v6kMoA*s zKP*Y2zc8;P^YgPMnSWBbft}?RsRn^WE;(Ra#zYyaP|J}cD49@!9tF9T8+d4GF&&Ib zIwj?iTqMna18{Db7s2wJC7zPx{^N=Zz@50MRDhFSQO1;!4z(OZ5}mYBlCr4v9Dqv~ z&4N!bHy|SqU_zjb1Q1?w;e+7OlE~4eob!3+8-Y8reRziRvX1okZi0cywJ?>5D2`Dh+(wTp_2yi-Oa%~HZSBG9bcWRq!!{nXEyj{6Q4!*B#Fxn?A? zK+uSTcRCvF1X0FlMQko)YA2y-sy&B7;#@4FVZ>^sY??fpzE!P<-wvd zqfAPt0(A+ExoE4)>eV=@zwmEGI!9t}7H6s%7cttS&mIIbR41JP|0aR7y-S-8K!<%1 z)e)&3l+;9Lf-poILGwg-f-*ymr+ictMfH&qN$Grh8B4^0u~GZPL|$YT(9JL`ajK<3 zcd$0v;!zi@JBTNEXf-pX;-$TOxQ-!7W-X5_B_5*!q-Mqo>0QbccuGF`ljJ`K+BDIr zL~5Z?WO9)3mQIW@7Z@{A3eS~|LJ=fl20fEJ`fo}m>q;}pVQMF7!3ssG*EHhU*Dl1| z=S`&dKFmb=|D|?H^(u_Sqd8}nAWDfrtmmjNnFrWZneMJtN8qZF7Ox9PG>1_`@Y5ifiSJ z25Tb^(Rt?-fR+L+lrX{`2=TH#{_s;=G#JN}BaB!AULweCJYz*;6IePgspFlMFQ=Evm~0J4N;a*n}mpg z3-HdHJZn8Kw;8Jrj}BGSL}mL}_F41%Zy0Zs=|787tQNTuiaXH87;VvWjmRyTl3ZlX z&k_CqWA9p^qpHsJgg^ozKuiRJ!sReQMJ363?DGmqNJyfIE5I0nim%B&=j@Xinaqqc zlY~%(L=doIi_}o0pkOJr)`cmyF0Zv36(d?7)YrnIYoQ|Qt-WZaTr9TUz0b^<%!Irq z8A4s1Su2^D^Z4f9|M?&L@$didZR=XXvJWDFfK^3Wmt;H$Vs%nJ04PuZ5+e#SC*tlq zW^KUdR0AZhN1}v4Tw?%@GNGITG!0~FSf5~T|9SIeM$v&rBS}S~fZZ(~Igzuo#PEe^8@4Jj-}y`K|AZi-3et@EpeglJOVFD(-k-P`5der75;;=D0tiYJk=ivf~3W_<^XpAOc2G1x`oS;#Ivxt$$yc zivJS_g}-UeCj8amqx{a5sK|D_{}xxTz&DK$UuZ6eCfzSio=vj7+gKEmOM3N7-!El+tpsTk(76rD0wL8RQ5A zyaoCB&CShunrB5zJ#y!HeD(Q8Y2pwo(h8jo^_1VI7Fo?pyzY7{1zmyg5%LX_hsDFG zX)a`?6pv3sz9K7D8>2`xlgH{oIb^);h6RIl9Yw-Id{5O7dGX7uV ze8oeapRKyK;=Av@J96a6!Gi}oJ3Bi%I(F{dxoOj;*49?9*IQRtXS3N#N=opvq$nyQ zBLm-bK@xZnza<4~7A>)q96O}rFBMhgrL|-4SL-@Q&%N|mO5M7wXI~qwCs8@A54J&t ztvs-$jc-e>ygWerXMf4i^lGUqMW^rUkUK8+mfhp1x`WN0mTkE|Wt`*rH%iA5@~bKq zmG50pcSk~z3WQ+xl_N3;ERKuWx(6Qh6YKL(6>j+tiw$ zJ$pEn?s#?kH_P`VRUh~$XME*(%SSDkd_0wU&f)rtYi?)fKkxl8f745o_HDnkq2>B* zmgK|rT{BA_cqZxnrRnMQx94^4=={)f>y7Lqzdl$(-+VmT((>0?zq}&t#a9w0q;LHf zXnKVFzW_j3|3#V)`hSqn|8u1O<@hhl(Er0vJn?!Q^*_l<^ncF1Y8{nD7p%E-%arMV zo0y)ydG5Hn_DLnvt2=M(?6h@xllE&nI;n9}mI!q=p?uDVV?GkrrBWAPYe~Mrvf;yj z-aBh=#;)BncCDT1n0iQhVru#ql~amFEB>x=CHr2SQaL^4aP}KJ@31|0B5C*K>HDj9 zjGkRk`e@0&T1T(Vd^h>wy+0mv-k9x^S|6y}I&O5yHZ|#y%pY`QcD*rX>@3$+*~!@_ zWy|Lismjj1YnNJ-tyD(qjZY$+rkH=(pq!*@jZhfY;;;y;2agXhqun8rDJNTr#GoKip zvgCg)w(6HV1lkL)ey%g4Gvk#5=cj3OL0i@&%N3vUf12~V;t{h{E9_nvci}|D0CpG6&E(30HnwiM=rXx(b-gFEhFJk z?m%vBix*ibHTW$!!D7rl%u^lE=SP8}rL|Y&N(3(847gCS%~oAN1ydd@L}V|Lzc4>| zCauurbT1FhrkL|1s^4!Vr38zt#te?%fl$Cok?_ONZ;=b4Zw)}jKj{1NgUt)go6O41 zrMl;VloqNyNJeDr#m!9ROt6Yckx1eAUMHfGb%6|2ZPgM_`cpCy!bkQ6h=)j0H7PjKNy?_ zkJjkwfwVAqY%sUGVFNNkxuOvkg%9@)V)9FE^!czXS-U}@+wBREwnSkXLevLfVSbR) zp*g{rA4osH802TQ(;pZNKO9ahOg`1o(ic#rdBIQ^6Sn4kp@&s0Zaj*Wm{ON(FnsFv zOXO1&f>|rT9~({+Ha}4~;g!tTaEQ%_!XXwO%s5ec>o;-y zG2=w(ZNS6{#EcWAw~Z!FW6U^FdfQ~;G{uY)rMJx{PIJsSFcN2_iL)|hoG5u-W#X(F zjIS}@A{8Bt?R@W(yPC=K8(mZM-N!*RQ^~Nn!L$GH=k@#LAYSKmMUWUC0hN_hNtPr|phX4svo;?_B9y1i z9U?soJS#%6zzUBTjuvEI(14&b2mw(9EXh{IC;%w^P!i5aS$j=5HekpE4YkzZ5MvmI z&badExLz8{tRN!5()fX@P}LPlz%&XPO+$(7p6Q!?<#DFWe54Z3B8AlM){w-pD#Joa zgc`$ZoXCrqi6iw$d$3B<1eK8lUgCI~QvoLf0Y68cR(Kj|Itd{iF;)$=sOeCJ%`hu! z!|=_BnL{R&EG87xrHL%30ga_;1wa7`GQie_QAI`20WI}sOnS>nGna};K{G5iU%Aj` zx08Ie^(Lt@&&n)|WdJIwhE+wPbydfT0whkA1rn#-x81{FA*^nmBIpm;&kPqF28V5) zW>N|`U~UfOWC1`@JQzVv;8;OLm`;I}A;+?6f2=iu45pU%kOk!T4}(T?xEwM;A{GEy z5_C=1NO&2qtCA?P0#dLw;`#o>)&%M%Y~Wg)!=Sr|K|mTdOxWotDyQ&30i?2|$jcl+ zG-6amIOhgo;M%3bG6-Q_*IZ9?@#b}RLhn!(1&L84O%b4kXzZ$>!m5DLuvgF}l@@8K zUr9Eh&Y-=|@}I+z64Q_AJeCjz;l7d%u{|U9L839yNaJ`x75H=H$5^NXj#f47N-+xs z71A;-aty0rv&OLK+>7nN)m!5sw%r+&;w=CqcXr4^08!TzT^9vT;v^aSVM!)c=X8~2 zIE~l(a~Bxo44Tgxp|XM{Rl?4e5oC@Qbw!h88L1rZ3aSdL=&=%7A1;M()=1`94(STw zHNXj^JO(KVr)t>z@*0$Zrp8Kgr6`|m8;0E($7rmC%>WNX7V>!1#OioBpbMDY96NX$ z7AI4ns^mfAKCLKEgakBykC0RwPARt-QfuQmT z_q?GdV#$>7kd;yK5Ec)!0Xu+R*?Zx6&x(x0kc|*l1XySqfMEe-Xa$Ri3RED=65v_f zI3BXRsB``C`V8`-Y&^19902T*M;PHq@XF1&Ig^~mX z32L;UiT#>{5M)$O-L|BME|QaW==J(ME1V5M!=^cP9r;jPCWg#%9%dpvhF6fl0u6D1 z(-~ftG!_U50i99Qeuc*bGFq{K42JOGxm1-~_e8YFn667~$2iB^G5U`G!$xnU;{Q3W zJN`cy|H}X_5&v_J;{P)7-$Wz+@8F56*TysccbOUgUy^*;I9tkFZJ(s4Z=5lsVN`m` zTdlXfrteTv-d$5Nr9Nl6uw&mB}l!5&^yO(|?{FDg6g@g#HUb{bv*Ue~$D&E3E(X zg@UKzssA^J_x~jM?5`J(MSlbIiPHPOO-uiFV#c1LO+U53la`j0y`!jOjVbHCxpCu# zC9f_{Pq(*Z=Z#wS>dfp@7t?fG`RP@G22^)2<>m2dqZ;W3Z|i#pP9L}IOSVj&o>ljt zGwBBjBM=Y$X9Q`){D1fUAAw#VYQ^}K2B2OQSVC#@J`tI#q}we1OS~1yS^NM%2HKYRZ+TiL*WZGskJx# zDLpl-&N}_{&suk9tQq@$-W8=u4;7BGY_3Z`ykY-3PeSwKxc`S6A^*>?ba($>4Cz0c zi2pxV`oA9kop0#>(s|t5an%1&NksppdtUp=vx^Uxod43Z%~h^Tc1cOQx9oZ`bJ}HT z2Qo90%SN@Q*3RN<#wX9XrQ+(h%PT9=?@3D@o0OJS`R(TQQ+`?Y>D(`NtuC!?|KQuy zm+v_A*$30!>$>XdrOb&5Z#?s9^UT%9|5ATs^@OMXk#XOzR{xnVd@gzUMW=5b`%Y`^ z!^a+5Jiq;__6v`0$a&|M8$Ouz!@Iso&-^B%`Gwyvz3`#swaZEic4Thaam!dMe{l20 z)|*arOx%C_MJIk(|M<4s{`i8vFFIk9Yi>W&W_| zO={(8%bWAs_RJo$=<5p}S=VynydD4Z(5AqGkCrZR)=zo-t>SY2iDQ~;6xy^O-qish^j~z^M<)MT79?hA$;AD=v=aE17#7~|o`Eue0dhOreDMHDHX@9|ggv)dM@#qXS@2aC) zo?mw5Ol9i4{I6bEQ+>^>Pp_VN@<&8{)^Uol&uebzWBxG?|lE{^JV~M?EEipx3 z$9=CD7Gy6BIIO+q4GTZiKAlegdBO-C1qH)g3N~F?=%;#GnYjK&U+&Uc9Bs;srLsZB zv==&<;`rH2g(OW2u2!Yp&|9nPeV#@yZm_M|ZZEs;I@}Pl?5E?07-~t`<(E^{&|Tk% zEdy0$o+K^0$y^5`=8-8jtRk_;0a#yP{?L$HVkI`T)J=t3=4nDc3R3=HVJVMJg+p5W zc@)*X7?@+%u>W$pFfSK+d?+t3FSt-ig7}Seayd@7>T1*wMHV)3$0^U@2rg$DXN?Q1 z+z#Y(hHQIWmih;lm_aV$_rWehg+tl%ygp|Wwn=9CygZ{xK?cCM%6e{SV@0S1)e(Cz z%rgdEM$W#7)l^DFE|(W-q+VqBJ24!g@1z6a>sgaEbO?7p$ffQgD~pW~7Vkm_TWo7o zTuwE#$()MV%!tqR1`$rmScMx_jdbkt-JWJ2^qMQc#samKY6^Wd+;v~uKY)l>jn!p_ z0lENa6|z9#G*yrkk!Bd44K5x>Ye$eh!%&Yi)x~(O1JXi4Up;QYoJ$S;N(*`eGyh@_ z#?(YJLGc6vo(602S+<=y1M~At(WlIemd0~F<3Vf4uNsfJxQ_;t3xdrpE=M|SbOnMr zynT%-p^GvE?Q9DYtBXKq6`A89jTo7x5!8_=D45T68fh2JxF}tcWqIi~s za8<8TI3O|K19LVoLsy+;dp5!nq$>)oND3_p5JHIs^8d4UEpRcV@Bhq9Gu;O1qK0sE z(+y|tlXRgXBHd6{%)N`Lre=yRm=Vd=pIF(1v=KsWvO+9VXmzJtww09p+*S!?MVsF_ z(?xdew*TKR<+nRNpZS>1d(N5nectc)c`wiNypI)`PUO(}EFR1>4w?Ol5ELTp{$|sI zodK)y*EQJ3%05S^4J`RSAq|~En<;l_M8a#q-d`UgATr2YiWP^&;gD!F8kbEbK@1X? z#pbd&bQ*k>@`-_H-UGw|tI?;#dh&+!1KptbMfY0-%e(!v#qYo!)+gH@CHX<7mBG-J zVZAHop$039#HJ7#Tq_EL!{O2BBnmuk(CJ(r+scYfp|TmD7_26S6sk3{4DJE#fYljl z(3*dafE~EgdgVK%*JFC{K|42?8xY3hhvP1_z{344u8`IZ8ni-0 z;$g)WkHuvWDI|^++-@s6g-WKt1cUfIBE;j;$SnG&UZwOdQwFTZUsR{xi0%zj6#pL4J$ads5I{ui-H3c|iIXGGp9C+kkPAF6=m=LdEI=rh zM|Z*nYJb_(CpTox1V6O}7nD1j*cklPdVO@qI6wr3i{RFZLqK6zNCd1AV2ZG~Q{buC13p59Egk1R<*eg8e`QQ?N*ocv<;5 zY#*xu@)uGj?2EMT!KBc?2b9x4a82NcvHXI%9YTa*yx(61LAe`5Z^24lT!DC z(ShCW35p7NXjR?JpM!L!I_tX8UGd07ymWR zD`&J!gJUD>0Gx?rJr{uvZ<1PCx>Bd?>lQ3?z)@waIZ$293th@q9YEW(P zYn|zFM%%HK{G(K_e7t=+K%oH6&?BOl6l2O{YAB(>RjHwvq;f8!ROp2Yu6XxOIX4;r zj^z{1s=TVnQv@CSzv92?Ll*x@?-&0Cb?1MiDB{0{i~qWP{EybLE*nh#N4`J*0qrcv z$KuJSNM1Rpgpw&tzXmp<3@(*;%bH{*UD6K2q>7B=lIB%v7|hSg;G7K{l*2ne9PT^- zPL^^|TZ^JlahdkCrqal}*@V-YKVr1)aYD6ztzy?f25K7<$si){{ZU&1^n_|t1?qb=qlcVs$g zZ4!A`_0B_?C}Xx>KCu(`B2wag7idvWqIag)VhFn%f}4cEw)tv!rurG3@osBSn3s18 zcNKaUsaOL5V}wy7wkllZZ>u-{B>yv&K1Aa`l}PKC|51qw3vdI=(eN&nZQ@&JUqvB;ta+FmbCosdbG?t8&?7F1~aVJaS1C_mMeRtx% zHXPx-Obc9=+eVF>oQ6IYY#-Y>MLjro##Oed{KZoVC-v0cOG)i0`$4`+7nDWfq&8BZ(44ubAmL*Hw>61< z9&c>b&2q?2RM*q1(e$n^_t$+S8D;;g%;s3Dt{y>n~)BIDoW1FfR1Ihj#nqo z`s#mMHGGu+-F}~cx;5;<<3w@pON@q5{*hFD)_I6|NXdW zu@`%C=z*ScuqvW`716$mXy1Q&wC{g5a3Ln|ei~)aVr~b}Q=e^w?FaSl4yOg-2fLpe z^pM#>3iAB#{RsNEQC>5z-oFu3JCcA4u0VKz$R8B@hlqInCsmu5p}h{}qUc>Gf)6;D>$s@qChmg@@S(Vxe>u9V4CiNfN&(^P6YMggklcaaap z8XfR#yf^O+b`~D5?>64R2MulB_bVSO;QO5~6EPoWRh{y&XMdC!03KA8Vhs)GN+#Q)`e_P>2od7}oA z|0r{W|EAkG%=F35^ab`0@~Rd~PB_^+nx(!uzYiKSF5bJi3srnd0BFv?d-XcK$Y&2| zu#s@Ez5pe-Le<#Th+XA)!UA*K=m9z<3fH2F|Jg}Na!^-t1_idOcBW#X_L5`D`dh<_ zZjhbSAuN>)({ThkERo2IJLm_DpOPJJsK&7r-2(c<&286V@0QyOy&md#kQ2WB<^Eq#xT2h zUFENLU6YKrG$g7zqAUEmD8AY`w&f9Mm!{CwuPslcfj)2b3@+oV+jJi>{P>vDQ4fr8 zCSNTSw%g~R6VL{y30MLovAL~;C+^%u_H(`LrG{g-FpREXfb7$@1&Iet1`afP zKtbUqY*Y^uzC5Eh#vhknpb0eE=sXL|ujDG$0RQ#)PZ_H5pF-|8|EEC;`~UFr|I_*Z z?tY*DWrjA>ayEzKVEWZ9z~svHeLGhGtQWD@y~L6fk)EDi?BxwXQpX+NfbqX3N*l+- z^MlTn$Ye868IKJy7cDfJ%Y?~Nsg^DGipUluVPY)+#q$wNiQe&B9_lUht5gv*9d3sjgZ>0Jw%v3}mFd2J9v74+p_f!qcsh>X+gx0E)U^qwEOW zh9}{KoWkoXn%-st^nIJ8P3p0jB$jMlA?kkQmM!PE&~R~D_=$~A2q&Zh9*4uhxV5&f zl|0%J!c=;~XKL@zRKnFPIXFt#u8%L%)2pklu9j4?7c_Lqz@kc7t9gC;uEOyxXj*TczGXW1nM@enT#1gu3fo;MWixlAOTbugzqyBoE0?LwWQv(g zE|9v(ttzA8l0?T}qOw?J_Z{HuST5i?%FA+Prk7Kzot4?aQB9^6%(w zMWbtpS6?Zoy85Iyesfk@tr1Y9wiKh6!uCn{wNTSJ(Q%fGz<0#K_Km(!=(U~ZvxDq4 z-yOdmuS(<>I%;WR9#8xAR8W>F@tWvadFA|5Z`rFP#%*O!>!PdnL_drXRedk2x`RrY zxw%NQG@Enw7ru79R&mi1c8gl3%VqMhhh@bt54#n3rC3MRf3<1dX!AX{EcmBOc?Ckd z+!fV%b9^Ho873cLLaAK_cXvaV4;M8&t;wUmxVA+9*tA9GF1b`zbjBWF-wIi-l+3f4 zxqUul;D6#bZq`LWm&06E|;VC0ut!-P3@)B&j@>n`|g?5mB zinw@cfy}&mWpYX7JzcCVdQ6SVEOdfaaY_u19cp@PNxkom+)`(rdqz$T%5C(>P3}+d zhvy|~%`VKi!AhNUDZzxWhk%`)GI{CT2`3J{Jluwt+-Q#A1SA|hNzjyd8a6ql*AtTb zb_Iqn)pou-`P;ZaU|-$OV`t9Up4H}}8kMB`Q~kxQ$7bMVxY6F{N^d?hpR2rk;>bA` zT`jTuANj0{S+jBVjg^<&8h?3rKEc37TaY(`go(-=^?Nn)S^yW%z zgIcmx(j>PXoKo6vk@rU#FJC{?EJ(!9fRy)ZySgH_VX+5+fLRwEX;H%vpL|^da_>a=)ygQUX~6Oo7kAvb6mMvo06OMOejz%mbda@#a(FYPH;_sCRy6v)w4>$@b*E2Oho(_0vyZoEi2a z@JQ5H^NT_Df#*h%B6b_kH=I{CRX6L13E{B!43AaY)t;%^WbY80+iB^z1)k)b*b8K< z&MB_My0$|zYXgPFHr^axM}mbq{a*(SluDm38%a#cVHGbhoEH(Fnr^iGS>(4na+WOL zFcIKK-~PT`HeI@tk!WpvRX@?X{Bq&FL)$ivYuX%lz5?2FEqT-RHipgHS!c%y>r6Ac zd>XGqoG7vm)4|xq&=wV&-6UA%vUL5|v0Y-$M$K&1^Wz0r|Hbpr#e4Hyu{l20|3}ql zS9xvS9Y&mP?0GASGh*agr|(zHxSpJ0yLTQ2y0p%=~V2H zQBx?mWKM@(q?hZf5@M>1tn{H)%NQ#IKLFaNM()AOzFEtR?1&|WoHcNa<5(+rdQopp=- zy|x=A?@V8rmhhJ-%TVwfSl4jMaEXn|-`0p*D4HTxDH2_2q=FAMfQ~ zS&*KAz2th4eaK_RzDymL5Rdk}?a;s3yArsls_#F;DliCwvLxyVNT3LBUq}%W!UYoz zca3=~U?boFAl-+;i?Z_n!0aIcLBz_4&lZTLH~X7spfX(>Cqis5~6E{zPhSzsM8gu@3L8 z(OPsK9`e;Y#7dh@X@TJz)Zw}B%AErf1AG#`@l?r@!fgp37W~3wNBMc>ocywXikWN6C+;qxD@W~}-o|5B{&#%{ zjhD(ZcWjHd9FBKHJIr#M;opPF4gCD$yw?509kLR0eNOC84O;ZeP%h14-@AcVS`L2u zNo8{R)o)IKpZZr;bUt}3AR#N*QtcY2QLo-Lv%|?mFCUMM40gs_prY)1OgTDoT)}Ne zn@@%V7tyG(9ytrK7MW|Vlz%!o&ULp!)_z67`OeqEgDWLxZa~=r8|;q8JQ{v^qQ#7_ zTg+A$0se`VDYN!hHBrd9?zQkYiEx^VVMVlwobYV zoJr1q!*B3}uKVYb1CrN<-Kx(NH+K#z?UNZeTkAQl#j5_9tvkEg!|hLKXtKF|y5-)*UzhTaI$zzkD9LYQa;t46%YI$8@gz2`ZHmK@Yu^_6RD4)| z=w5OVyNhpko-^jtiun6Tx%;6p6{7~^++8o{-%%FNdh2-T zFzw_#yP^Z#MlZT?a44{BQ_GLn`;O}T=bT)t+G~dQU6B}M4!w5hsFHA=JNk_Au#8v{r`s97U7NQ{~xOE|MK2%^5XXcFO+}1B+&X{^48a#Zhbsx(C@APe8+zJosA!*FN^mr zoX+%rFsJ>g;sXWk_l5NAGIe6u^@WG?k)!ZRvbfN8TDGjOb0?>sznynEQ+aI0@*Cm% zIu6+~p`A0-eM$N9sKxyULvel1J#aCP*gh-ZhjrO5aY*8pFza8X=}Q%@;bj{F%`5zt z4(@a1C@}|X_X$y2YT4aB)Oyv~pEJIQ&3`XBZiDTdOxxw@_f|W8a=z=x%`tgQ+rc@W zAu0H}+pQOtMp_J1Y#AH+x#j!$?`NOivEkfn(or~RceNq3Atwj?TzjtsD zwtQ>14lZi*S;d1YN3u62SdQ4i7nof*WBF!g&pR$DrB@GMM8CY4GlbuDFfTJQFRo(H zxuyL6tr2UBw=Q(7p#GqaUvp}A_|A@dBa(*yG>~6C^U9eAZw#8(Zugc4c+tIGHxwU5 zTxyGq;CseQL~_M7w4QK-qzf1>zP`;XVue-O`qHkbYX`}%*6sXhPMrl5RqNYd$$ zJ;=>CoLOD>MwDsI?d5)O`KF7uXXVD4tfwYJPjG@n&IFG+xD?B zTiw=urx|H^e3-%qp2|OzdH3k&I{n-iWv{V?@D}OFX=FAb{Pwz`&g1tL{5e*%P_L~2 z`n;eR-Ln{AJWkb};n@)V2Vn?>pUM9OFjTz%+a!YFv8JU zKbGTP5r#`h9b*I&F1(>LG_O7~PE9HQ5~{Y=Y(0Sl`$)amWYo>~Mw>lP1@2XqFBn7V zsi9tNG&P$W3^D|x^FqstqLhk17i)r#^}MumcJDg`H7lVDkO~ZJP#lMh0-u6 zOatK+N+J|MLnw){^`f?+e5{d5O*2Z0q6vt{L69IZ;Q^t-D}ulwlo7NEM(ZWu=NYFf z{t~OAl<|!;E31iR0bI}*mZB*J#R!xqS(;!;mH|Ny1z{dEk=O=nxGJ8FiFroPc>rK_ z>caC3f#5U_Q?RZ9GZ>|togj_UJb($47Ol6)8^d6}fJTfX8IWWk6vZGxe?STcQ3z%M zfQDflL4o?r03&lL7U&TR^fc@JpO>q`+letT135OeYS-Mgx*1&Zi|!G<#^6J33c*jS)<0IbjY2uom4XAx7ED*KpLsdJuFwkEf2FZ2R zAB{CzK#A7XG>orq=%?!lsN_;Oxl;I4R~fNpajDv?n6_^-TCD0WEm}9>I%esrHtI@R zR#j_MDuq{ZoGM;t3-qgCx1`{1HN_|ePNt{~T8`?*e5fSEi@ za4-rHq~HjHg400?dwQ0^DZxV~c$j28gOgN=x^Kj&bYHA;e0{^f>PD<=&A_UjLn4!3 z#AK8LIF@Em5Wo>$aGp3}$^ryWK_o=c90+>`Px-e@S$$Pn(U}vSxqsUEUl?er`Y$+W zQ2z-=#Qg8(J^wpSqObpOzVgwC#?1fdqp$zq7M2!YED1%+4y~NsyO(#1o2`L@89$!r z@U2!pZ{3;GZoO{$0Fkki(jqqP39z!7B0HXUXrO#q4`}4x*ksp{TdtWoEf+s?%K-T+~ct1L`09XK7*`1 z8hW_d#Q0BioGNjgZfSd2?57_3kH7%(Z2SiR#QKk7{6~!ci18mW{_~HF|I{uJO&#p1 z{o$8+d9@cddsN4mWG@h500N{roiogV7)paIgCI0S5eSVj5bYV9qWeP3nCkF@Uv(oA zd3T_JKC)??d(Ih7N>y=kb-XGil~OiAfZ-YDp#X$10+T=lLU5Qzc^rl*f&d7H21pQt zJcFkgk>B9RLL+glI)va~2jj$8f*4C^O8*}Np{DZxF~k1vxLE(SdHw%5;jeX-|DSt| z^KDH3e{6OA2f_dM)kcTU4d}8e+OKVfq-W|`GbiM5VBfxn9+WG}@273Z%d_0!GuHx< zKDJj3XgAl>Dl}ADux6VIL6vPCuixw?FZs=WPo(e9Eu}|ilUB0pcH_-1jwVXNq$|oF zrnS2~Z<3VlsabrhQ<74FIKFjkPwZ@fmEN(I?|mexD6#SA5WVWUhvTyQqg=G!6I_9* z7R6VrUHaMITVbnA>K82Q;O-V{7AlE!&gkyaPj)oqXY()0R^Z7&=DU&7d2txXrcbby zr|)gG>Z)WnWR>Y%)Njeq9sr=0Xw1!B_w+Bb4!IPm2t>we9vxf`{owV+2%nM1L!**x z&7?<8J9w(TC2;U zQY(j~kgOe!t7mvfBr_G!IoGV;p7+8qK|o+YU`S+QLTseq9sNyntVYdW^gjTiVD0m& z_dyWFAc;J(DfM5Kn3z)6buat;zjglSxubBpH>>ucF)_lnx$2|(goeb&e?a~(%l`+U zXZktzv~myM~}1Bvw> zq!)s75DW1n2qHX&01O2oG|Vy>LF2mJH{==o{LmU4Dr+hkG~a2b`U?Q!afF9x64srD z0!aYiD4xSf8mC}DcpOOTsa$HJ^P+efO*{n5A|yjG41{4AOT!RAKrBVG6oX^JyU0`VbT+y{ zB8s5VL_k9f1kwn@;XJ|<5X6xLjKCN{q7cf1H1SjfUAl-%MJdzfy)F-A_T*57!DyI#^E^2(IiPDsNv-Asy{I- z+Mvc415eWcP0#>=Q4~c$2uZ>?$l$y#C7fhn12yO_Zl0P>EF8rWAObO@V3tT6L19E# zBmkZR0glCB3O5joxOr-N@d&mGLMZ}gVIJZ^3ZM`aAqbcz5SrmZToBKc|Agl!o~95_ zQ;3f`^FLsqsrvr{2K_(an*JZ+`H$v0|It~ZumAq}k=$O5c>Y6@p*#QKwun(^ZDgBm z20z^ExqsM^jEg||$URbiKiondR^eV0sB!;%{%_#hiX-nz_{o;7l&~gEqZy@1?dh9U z{+qOS*BK#J8SbYG?Gz*K*j+qfJ+noQt~i zA%vAIp;rK-*i+eml0@?1>+VzU|46^y(8P&SA|CHa->NBT(?UyN7$vBx2Q*q5KK)`Z=+ zCxX*D-M4q!`IaQ!VXe&rnSY0svblD4X}?*l4eM&|Fm2fXwwp)p_WrhLOa`zKR)*)? z-*eNk^aIN^%R7#&bdZ%RW{*%<4e|Wo5~00mUsmwAENNz&vfC@j<7t|bDbBlb&Jp*Y z9_laoVN~f>)(W*==vZ*&%9SXs6C|6Ro}S*Kz2r!)-;zqwBWm?OY*BgF#ytP|x<3C?-p0*q^HO`aobl`LJbBb#vZeE>shP71 zrNHaIdPY$rkoFuif z`gI$!^43Q(nNvu(vrovJ!dS&)N#Q-|d_S$WNa|gBz(zGVQ@hn-?W)l$!$W4qO3gER zn48ZqTd?ZP1uCK2dDJHC*1HPDP@9xt5fRoSb3DKI`ncoVA0HlEZ?Sc8�*R8qHxd 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�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 z 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 z

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 z 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 literal 0 HcmV?d00001 diff --git a/doc/ppl-user-0.10.2.pdf b/doc/ppl-user-0.10.2.pdf new file mode 100644 index 0000000..8fb0e4b --- /dev/null +++ b/doc/ppl-user-0.10.2.pdf @@ -0,0 +1,89805 @@ +%PDF-1.4 +%ÐÔÅØ +5 0 obj +<< /S /GoTo /D (section.1) >> +endobj +8 0 obj +(\376\377\000G\000e\000n\000e\000r\000a\000l\000\040\000I\000n\000f\000o\000r\000m\000a\000t\000i\000o\000n\000\040\000o\000n\000\040\000t\000h\000e\000\040\000P\000P\000L) +endobj +9 0 obj +<< /S /GoTo /D (subsection.1.1) >> +endobj +12 0 obj +(\376\377\000T\000h\000e\000\040\000M\000a\000i\000n\000\040\000F\000e\000a\000t\000u\000r\000e\000s) +endobj +13 0 obj +<< /S /GoTo /D (subsection.1.2) >> +endobj +16 0 obj +(\376\377\000U\000p\000w\000a\000r\000d\000\040\000A\000p\000p\000r\000o\000x\000i\000m\000a\000t\000i\000o\000n) +endobj +17 0 obj +<< /S /GoTo /D (subsection.1.3) >> +endobj +20 0 obj +(\376\377\000C\000o\000n\000v\000e\000x\000\040\000P\000o\000l\000y\000h\000e\000d\000r\000a) +endobj +21 0 obj +<< /S /GoTo /D (subsection.1.4) >> +endobj +24 0 obj +(\376\377\000R\000e\000p\000r\000e\000s\000e\000n\000t\000a\000t\000i\000o\000n\000s\000\040\000o\000f\000\040\000C\000o\000n\000v\000e\000x\000\040\000P\000o\000l\000y\000h\000e\000d\000r\000a) +endobj +25 0 obj +<< /S /GoTo /D (subsection.1.5) >> +endobj +28 0 obj +(\376\377\000O\000p\000e\000r\000a\000t\000i\000o\000n\000s\000\040\000o\000n\000\040\000C\000o\000n\000v\000e\000x\000\040\000P\000o\000l\000y\000h\000e\000d\000r\000a) +endobj +29 0 obj +<< /S /GoTo /D (subsection.1.6) >> +endobj +32 0 obj +(\376\377\000I\000n\000t\000e\000r\000v\000a\000l\000s\000\040\000a\000n\000d\000\040\000B\000o\000x\000e\000s) +endobj +33 0 obj +<< /S /GoTo /D (subsection.1.7) >> +endobj +36 0 obj +(\376\377\000W\000e\000a\000k\000l\000y\000-\000R\000e\000l\000a\000t\000i\000o\000n\000a\000l\000\040\000S\000h\000a\000p\000e\000s) +endobj +37 0 obj +<< /S /GoTo /D (subsection.1.8) >> +endobj +40 0 obj +(\376\377\000R\000a\000t\000i\000o\000n\000a\000l\000\040\000G\000r\000i\000d\000s) +endobj +41 0 obj +<< /S /GoTo /D (subsection.1.9) >> +endobj +44 0 obj +(\376\377\000O\000p\000e\000r\000a\000t\000i\000o\000n\000s\000\040\000o\000n\000\040\000R\000a\000t\000i\000o\000n\000a\000l\000\040\000G\000r\000i\000d\000s) +endobj +45 0 obj +<< /S /GoTo /D (subsection.1.10) >> +endobj +48 0 obj +(\376\377\000T\000h\000e\000\040\000P\000o\000w\000e\000r\000s\000e\000t\000\040\000C\000o\000n\000s\000t\000r\000u\000c\000t\000i\000o\000n) +endobj +49 0 obj +<< /S /GoTo /D (subsection.1.11) >> +endobj +52 0 obj +(\376\377\000O\000p\000e\000r\000a\000t\000i\000o\000n\000s\000\040\000o\000n\000\040\000t\000h\000e\000\040\000P\000o\000w\000e\000r\000s\000e\000t\000\040\000C\000o\000n\000s\000t\000r\000u\000c\000t\000i\000o\000n) +endobj +53 0 obj +<< /S /GoTo /D (subsection.1.12) >> +endobj +56 0 obj +(\376\377\000T\000h\000e\000\040\000P\000o\000i\000n\000t\000s\000e\000t\000\040\000P\000o\000w\000e\000r\000s\000e\000t\000\040\000D\000o\000m\000a\000i\000n) +endobj +57 0 obj +<< /S /GoTo /D (subsection.1.13) >> +endobj +60 0 obj +(\376\377\000U\000s\000i\000n\000g\000\040\000t\000h\000e\000\040\000L\000i\000b\000r\000a\000r\000y) +endobj +61 0 obj +<< /S /GoTo /D (subsection.1.14) >> +endobj +64 0 obj +(\376\377\000B\000i\000b\000l\000i\000o\000g\000r\000a\000p\000h\000y) +endobj +65 0 obj +<< /S /GoTo /D (section.2) >> +endobj +68 0 obj +(\376\377\000G\000N\000U\000\040\000G\000e\000n\000e\000r\000a\000l\000\040\000P\000u\000b\000l\000i\000c\000\040\000L\000i\000c\000e\000n\000s\000e) +endobj +69 0 obj +<< /S /GoTo /D (section.3) >> +endobj +72 0 obj +(\376\377\000G\000N\000U\000\040\000F\000r\000e\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n\000\040\000L\000i\000c\000e\000n\000s\000e) +endobj +73 0 obj +<< /S /GoTo /D (section.4) >> +endobj +76 0 obj +(\376\377\000D\000e\000p\000r\000e\000c\000a\000t\000e\000d\000\040\000L\000i\000s\000t) +endobj +77 0 obj +<< /S /GoTo /D (section.5) >> +endobj +80 0 obj +(\376\377\000M\000o\000d\000u\000l\000e\000\040\000I\000n\000d\000e\000x) +endobj +81 0 obj +<< /S /GoTo /D (subsection.5.1) >> +endobj +84 0 obj +(\376\377\000M\000o\000d\000u\000l\000e\000s) +endobj +85 0 obj +<< /S /GoTo /D (section.6) >> +endobj +88 0 obj +(\376\377\000N\000a\000m\000e\000s\000p\000a\000c\000e\000\040\000I\000n\000d\000e\000x) +endobj +89 0 obj +<< /S /GoTo /D (subsection.6.1) >> +endobj +92 0 obj +(\376\377\000N\000a\000m\000e\000s\000p\000a\000c\000e\000\040\000L\000i\000s\000t) +endobj +93 0 obj +<< /S /GoTo /D (section.7) >> +endobj +96 0 obj +(\376\377\000C\000l\000a\000s\000s\000\040\000I\000n\000d\000e\000x) +endobj +97 0 obj +<< /S /GoTo /D (subsection.7.1) >> +endobj +100 0 obj +(\376\377\000C\000l\000a\000s\000s\000\040\000H\000i\000e\000r\000a\000r\000c\000h\000y) +endobj +101 0 obj +<< /S /GoTo /D (section.8) >> +endobj +104 0 obj +(\376\377\000C\000l\000a\000s\000s\000\040\000I\000n\000d\000e\000x) +endobj +105 0 obj +<< /S /GoTo /D (subsection.8.1) >> +endobj +108 0 obj +(\376\377\000C\000l\000a\000s\000s\000\040\000L\000i\000s\000t) +endobj +109 0 obj +<< /S /GoTo /D (section.9) >> +endobj +112 0 obj +(\376\377\000M\000o\000d\000u\000l\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) +endobj +113 0 obj +<< /S /GoTo /D (subsection.9.1) >> +endobj +116 0 obj +(\376\377\000C\000+\000+\000\040\000L\000a\000n\000g\000u\000a\000g\000e\000\040\000I\000n\000t\000e\000r\000f\000a\000c\000e) +endobj +117 0 obj +<< /S /GoTo /D (section.10) >> +endobj +120 0 obj +(\376\377\000N\000a\000m\000e\000s\000p\000a\000c\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) +endobj +121 0 obj +<< /S /GoTo /D (subsection.10.1) >> +endobj +124 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000\040\000N\000a\000m\000e\000s\000p\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +125 0 obj +<< /S /GoTo /D (subsection.10.2) >> +endobj +128 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000I\000O\000\137\000O\000p\000e\000r\000a\000t\000o\000r\000s\000\040\000N\000a\000m\000e\000s\000p\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +129 0 obj +<< /S /GoTo /D (subsection.10.3) >> +endobj +132 0 obj +(\376\377\000s\000t\000d\000\040\000N\000a\000m\000e\000s\000p\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +133 0 obj +<< /S /GoTo /D (section.11) >> +endobj +136 0 obj +(\376\377\000C\000l\000a\000s\000s\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) +endobj +137 0 obj +<< /S /GoTo /D (subsection.11.1) >> +endobj +140 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000B\000D\000\137\000S\000h\000a\000p\000e\000<\000\040\000T\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +141 0 obj +<< /S /GoTo /D (subsection.11.2) >> +endobj +144 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000B\000H\000R\000Z\0000\0003\000\137\000C\000e\000r\000t\000i\000f\000i\000c\000a\000t\000e\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +145 0 obj +<< /S /GoTo /D (subsection.11.3) >> +endobj +148 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000B\000H\000R\000Z\0000\0003\000\137\000C\000e\000r\000t\000i\000f\000i\000c\000a\000t\000e\000:\000:\000C\000o\000m\000p\000a\000r\000e\000\040\000S\000t\000r\000u\000c\000t\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +149 0 obj +<< /S /GoTo /D (subsection.11.4) >> +endobj +152 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000B\000o\000x\000<\000\040\000I\000T\000V\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +153 0 obj +<< /S /GoTo /D (subsection.11.5) >> +endobj +156 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000C\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000o\000n\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +157 0 obj +<< /S /GoTo /D (subsection.11.6) >> +endobj +160 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000C\000h\000e\000c\000k\000e\000d\000\137\000N\000u\000m\000b\000e\000r\000<\000\040\000T\000,\000\040\000P\000o\000l\000i\000c\000y\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +161 0 obj +<< /S /GoTo /D (subsection.11.7) >> +endobj +164 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000C\000o\000n\000g\000r\000u\000e\000n\000c\000e\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +165 0 obj +<< /S /GoTo /D (subsection.11.8) >> +endobj +168 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000C\000o\000n\000g\000r\000u\000e\000n\000c\000e\000\137\000S\000y\000s\000t\000e\000m\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +169 0 obj +<< /S /GoTo /D (subsection.11.9) >> +endobj +172 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000C\000o\000n\000g\000r\000u\000e\000n\000c\000e\000\137\000S\000y\000s\000t\000e\000m\000:\000:\000c\000o\000n\000s\000t\000\137\000i\000t\000e\000r\000a\000t\000o\000r\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +173 0 obj +<< /S /GoTo /D (subsection.11.10) >> +endobj +176 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +177 0 obj +<< /S /GoTo /D (subsection.11.11) >> +endobj +180 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t\000\137\000S\000y\000s\000t\000e\000m\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +181 0 obj +<< /S /GoTo /D (subsection.11.12) >> +endobj +184 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t\000\137\000S\000y\000s\000t\000e\000m\000:\000:\000c\000o\000n\000s\000t\000\137\000i\000t\000e\000r\000a\000t\000o\000r\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +185 0 obj +<< /S /GoTo /D (subsection.11.13) >> +endobj +188 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t\000s\000\137\000R\000e\000d\000u\000c\000t\000i\000o\000n\000<\000\040\000D\0001\000,\000\040\000D\0002\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +189 0 obj +<< /S /GoTo /D (subsection.11.14) >> +endobj +192 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000D\000e\000t\000e\000r\000m\000i\000n\000a\000t\000e\000<\000\040\000P\000S\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +193 0 obj +<< /S /GoTo /D (subsection.11.15) >> +endobj +196 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000D\000o\000m\000a\000i\000n\000\137\000P\000r\000o\000d\000u\000c\000t\000<\000\040\000D\0001\000,\000\040\000D\0002\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +197 0 obj +<< /S /GoTo /D (subsection.11.16) >> +endobj +200 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000F\000r\000o\000m\000\137\000C\000o\000v\000e\000r\000i\000n\000g\000\137\000B\000o\000x\000\040\000S\000t\000r\000u\000c\000t\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +201 0 obj +<< /S /GoTo /D (subsection.11.17) >> +endobj +204 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000G\000e\000n\000e\000r\000a\000t\000o\000r\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +205 0 obj +<< /S /GoTo /D (subsection.11.18) >> +endobj +208 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000G\000e\000n\000e\000r\000a\000t\000o\000r\000\137\000S\000y\000s\000t\000e\000m\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +209 0 obj +<< /S /GoTo /D (subsection.11.19) >> +endobj +212 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000G\000e\000n\000e\000r\000a\000t\000o\000r\000\137\000S\000y\000s\000t\000e\000m\000:\000:\000c\000o\000n\000s\000t\000\137\000i\000t\000e\000r\000a\000t\000o\000r\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +213 0 obj +<< /S /GoTo /D (subsection.11.20) >> +endobj +216 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000G\000M\000P\000\137\000I\000n\000t\000e\000g\000e\000r\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +217 0 obj +<< /S /GoTo /D (subsection.11.21) >> +endobj +220 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000G\000r\000i\000d\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +221 0 obj +<< /S /GoTo /D (subsection.11.22) >> +endobj +224 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000G\000r\000i\000d\000\137\000C\000e\000r\000t\000i\000f\000i\000c\000a\000t\000e\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +225 0 obj +<< /S /GoTo /D (subsection.11.23) >> +endobj +228 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000G\000r\000i\000d\000\137\000C\000e\000r\000t\000i\000f\000i\000c\000a\000t\000e\000:\000:\000C\000o\000m\000p\000a\000r\000e\000\040\000S\000t\000r\000u\000c\000t\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +229 0 obj +<< /S /GoTo /D (subsection.11.24) >> +endobj +232 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000G\000r\000i\000d\000\137\000G\000e\000n\000e\000r\000a\000t\000o\000r\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +233 0 obj +<< /S /GoTo /D (subsection.11.25) >> +endobj +236 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000G\000r\000i\000d\000\137\000G\000e\000n\000e\000r\000a\000t\000o\000r\000\137\000S\000y\000s\000t\000e\000m\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +237 0 obj +<< /S /GoTo /D (subsection.11.26) >> +endobj +240 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000G\000r\000i\000d\000\137\000G\000e\000n\000e\000r\000a\000t\000o\000r\000\137\000S\000y\000s\000t\000e\000m\000:\000:\000c\000o\000n\000s\000t\000\137\000i\000t\000e\000r\000a\000t\000o\000r\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +241 0 obj +<< /S /GoTo /D (subsection.11.27) >> +endobj +244 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000H\0007\0009\000\137\000C\000e\000r\000t\000i\000f\000i\000c\000a\000t\000e\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +245 0 obj +<< /S /GoTo /D (subsection.11.28) >> +endobj +248 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000H\0007\0009\000\137\000C\000e\000r\000t\000i\000f\000i\000c\000a\000t\000e\000:\000:\000C\000o\000m\000p\000a\000r\000e\000\040\000S\000t\000r\000u\000c\000t\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +249 0 obj +<< /S /GoTo /D (subsection.11.29) >> +endobj +252 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000I\000n\000t\000e\000r\000v\000a\000l\000<\000\040\000B\000o\000u\000n\000d\000a\000r\000y\000,\000\040\000I\000n\000f\000o\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +253 0 obj +<< /S /GoTo /D (subsection.11.30) >> +endobj +256 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000I\000s\000\137\000C\000h\000e\000c\000k\000e\000d\000<\000\040\000T\000\040\000>\000\040\000S\000t\000r\000u\000c\000t\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +257 0 obj +<< /S /GoTo /D (subsection.11.31) >> +endobj +260 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000I\000s\000\137\000C\000h\000e\000c\000k\000e\000d\000<\000\040\000C\000h\000e\000c\000k\000e\000d\000\137\000N\000u\000m\000b\000e\000r\000<\000\040\000T\000,\000\040\000P\000\040\000>\000\040\000>\000\040\000S\000t\000r\000u\000c\000t\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +261 0 obj +<< /S /GoTo /D (subsection.11.32) >> +endobj +264 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000I\000s\000\137\000N\000a\000t\000i\000v\000e\000\137\000O\000r\000\137\000C\000h\000e\000c\000k\000e\000d\000<\000\040\000T\000\040\000>\000\040\000S\000t\000r\000u\000c\000t\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +265 0 obj +<< /S /GoTo /D (subsection.11.33) >> +endobj +268 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000L\000i\000n\000e\000a\000r\000\137\000E\000x\000p\000r\000e\000s\000s\000i\000o\000n\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +269 0 obj +<< /S /GoTo /D (subsection.11.34) >> +endobj +272 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000M\000I\000P\000\137\000P\000r\000o\000b\000l\000e\000m\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +273 0 obj +<< /S /GoTo /D (subsection.11.35) >> +endobj +276 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000N\000N\000C\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000o\000n\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +277 0 obj +<< /S /GoTo /D (subsection.11.36) >> +endobj +280 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000N\000o\000\137\000R\000e\000d\000u\000c\000t\000i\000o\000n\000<\000\040\000D\0001\000,\000\040\000D\0002\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +281 0 obj +<< /S /GoTo /D (subsection.11.37) >> +endobj +284 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000O\000c\000t\000a\000g\000o\000n\000a\000l\000\137\000S\000h\000a\000p\000e\000<\000\040\000T\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +285 0 obj +<< /S /GoTo /D (subsection.11.38) >> +endobj +288 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000P\000a\000r\000t\000i\000a\000l\000l\000y\000\137\000R\000e\000d\000u\000c\000e\000d\000\137\000P\000r\000o\000d\000u\000c\000t\000<\000\040\000D\0001\000,\000\040\000D\0002\000,\000\040\000R\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +289 0 obj +<< /S /GoTo /D (subsection.11.39) >> +endobj +292 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000P\000o\000i\000n\000t\000s\000e\000t\000\137\000P\000o\000w\000e\000r\000s\000e\000t\000<\000\040\000P\000S\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +293 0 obj +<< /S /GoTo /D (subsection.11.40) >> +endobj +296 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000P\000o\000l\000y\000\137\000C\000o\000n\000\137\000R\000e\000l\000a\000t\000i\000o\000n\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +297 0 obj +<< /S /GoTo /D (subsection.11.41) >> +endobj +300 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000P\000o\000l\000y\000\137\000G\000e\000n\000\137\000R\000e\000l\000a\000t\000i\000o\000n\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +301 0 obj +<< /S /GoTo /D (subsection.11.42) >> +endobj +304 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000P\000o\000l\000y\000h\000e\000d\000r\000o\000n\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +305 0 obj +<< /S /GoTo /D (subsection.11.43) >> +endobj +308 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000P\000o\000w\000e\000r\000s\000e\000t\000<\000\040\000D\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +309 0 obj +<< /S /GoTo /D (subsection.11.44) >> +endobj +312 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000R\000e\000c\000y\000c\000l\000e\000\137\000I\000n\000p\000u\000t\000\040\000S\000t\000r\000u\000c\000t\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +313 0 obj +<< /S /GoTo /D (subsection.11.45) >> +endobj +316 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000S\000m\000a\000s\000h\000\137\000R\000e\000d\000u\000c\000t\000i\000o\000n\000<\000\040\000D\0001\000,\000\040\000D\0002\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +317 0 obj +<< /S /GoTo /D (subsection.11.46) >> +endobj +320 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000T\000h\000r\000o\000w\000a\000b\000l\000e\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +321 0 obj +<< /S /GoTo /D (subsection.11.47) >> +endobj +324 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000V\000a\000r\000i\000a\000b\000l\000e\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +325 0 obj +<< /S /GoTo /D (subsection.11.48) >> +endobj +328 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000V\000a\000r\000i\000a\000b\000l\000e\000:\000:\000C\000o\000m\000p\000a\000r\000e\000\040\000S\000t\000r\000u\000c\000t\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +329 0 obj +<< /S /GoTo /D (subsection.11.49) >> +endobj +332 0 obj +(\376\377\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000:\000:\000V\000a\000r\000i\000a\000b\000l\000e\000s\000\137\000S\000e\000t\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +333 0 obj +<< /S /GoTo /D [334 0 R /Fit ] >> +endobj +336 0 obj << +/Length 1263 +/Filter /FlateDecode +>> +stream +xÚÅWÉvÛ6Ýë+¸é)yŽ‰ Á¡ÝDžR§vkÉ]4Í¢ E* Gúú> Ô`Ënw]ÃÅ»oˆƒy€ƒüÊ÷|?Œ ² ALáK +'æ±êLj±°sø;Þ¬ymàï®i€2F­£Žgˆ¦þð_'z¬pL0C˜å@U ’±Íð7£¬PlLJÁˆÂÙ :àLP™² NRÄ2âÄ<´¡t뎟óyÃÁV{6Ƀ•9&æ(ø*Ii¢$ñÚnN1Ä9I ¨\ ¤ÌÒ¹T+YIïÆ;便Ⱥ>A–ƒ~©å*„íi.ðJ–s]5ÂsüÉgeá,"8䍨ëSfV™õý$×j\GMRðNLYïÿ•†ô›l×>ž «¾¸¯;ïê‰K¢´DBÓ¥ìU-;oă¬*ii’y 7–7S»“åÏ¥ŒxŸ´çm#'%º¢„&¼ÅÃfªz§Ý‹®Z{0EÄÁó<µ4ßnÛF8ýLêÑcÉ㨓µäM“¶nè6w•3\)Y;)Î܀b\ø®š¯Æƒ¯CˆNPš"a(ÃEP-Ÿ>ã` +ë ÙPOµ HV"Ræ0®ƒÑàw× Ø r ÏúJÄ´´HŒ³µ¸ÏHbê$é‡4‘¦åa¤a¶à~y"„IZ„+®t½q«Ýzµj•¶ùc@›Ÿ`P–á#Ê$P_ØÚãۙûîÚÓ®ËÀâõÍ­—ZIÑh ÊÓÊ­(Ñ ®ª…×@µ‹J»-Ó@„÷ÝÍ3üƒmn“Òä~­„›™D³ƒájUK§tÍM/bŸ€à˜43é•f¾:Ä"_u (ý9‚–ûLJц$Ù+’Ôr™L®uk9̽jçŠ/æš”³ ¦Ú jÈn'V܉K›F …¨-òzȟìùßsfíÄÎBvÞ›•0xŽ6ËÎÉ·3«m£U[Çאø×'·:lx½éäÞ9ù+ʱÓΓçseƒ7Lo±Cïx[/¡¯G‡ñƒàéswrÖª^µåj­aR/MÊp¦Ú塕>Ž—¢’wyëy«¤^8C‹ÐÜæ vçÉF»¹ÞÒÓæár[wëZËN誨>³šõaõÊP¶‹”ÙÜ×c'ÒȬ§¸:¡|ÚÉy㮶``kËi¹§+«ûÑÃÅ+te°®âµ[º„ ‘Mç&&Î/£9jgÚ6*®üƒçY.š¥%>¤Ä–òƒh—ÂÜåþ´7Ö(íVl~Ùëô⓺WõÕ¼ãÜB3¤ÈßËÇ=¥¦Ñf¨,Éó÷ƾÃ]Û¶cÚßÉöó¾êк‘+eº$’Ú_(—Âôà¥h¼A.ôØv2߯<òd>8±ëãÁ¢(²ÖÄ^Ïk¶o[ã/—¼ÞWP§¨bÚ!^¡õ—³Þ½‹¶­µÚ•ô´âÖHí±è×Óýù é-Õ·/ž_ÿsL^ýE€GÅ?Æc8˜ +endstream +endobj +334 0 obj << +/Type /Page +/Contents 336 0 R +/Resources 335 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 343 0 R +>> endobj +337 0 obj << +/D [334 0 R /XYZ 90 757.935 null] +>> endobj +338 0 obj << +/D [334 0 R /XYZ 90 733.028 null] +>> endobj +335 0 obj << +/Font << /F50 339 0 R /F23 340 0 R /F37 341 0 R /F38 342 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +372 0 obj << +/Length 1874 +/Filter /FlateDecode +>> +stream +xÚíZKsÛ6¾ëWðVr&¢ð^*;rªÔ±UIn&“ô@K°Å E²$UÇÿ¾»\@Zª%O¦3s"°Àî÷-–™qg0ãmçtÒ99÷#²#_øÆäֈ˜øÜö7&3ã“yvu9é_NÆ֟“w†+˜-x³iJPÖéO:u8ȘÁ›·½ÀϘ.:ŸþdÆ äï f;QhÜ7½ u¤Æ¸ó{‡mÎÄc­™Çf¾§f’gæC™ÜÍk«+ÌåLÏà"¹)ãòa=áðbïÐCY.’ªJòÌê:‚™8|ޕqVËV¸‰ EáTÉò=óˆœÐœ%U S´ uYKêg³“¼¤ò"Ÿ%·T®çZûz™¨~™Íd©»(5ÌKuÎo·Ú¸ùöòš$祔«Eq;ò|ZÔ¥>®›u 0ÿE2•Y%_aÍ7ÿ°8ç¦,«U;·5áÄQgh䪤q-•üoo¾Y,oÒ¤š£­°z£^ÁÙ"‚¸Ì/†.ýÖ1>5]šé7¥q~[ߣiãRIÎq˜,Ck MfXàÏØ)4ï“z¾µ~æ æ ³\3ˆ–$n`ⱜ¢Ò +ù«ÞçežÕݳGV«ÄߜX3%J¾Z]@ƒÅMz7@WS­ä4ž~y¬#ØÔQW¶ÕuÁ=jZ¡ªQ„ÞF) +)yŽ* Oð™MÓå l¾cõIÖ¢KEë¥ +À"©Sòr\8ʸèžòN…šQcæhØM{Š=†ÓÐjûT»{؎8Ç/©ÐО·Í0Ž™Õ ÀÙNP̗ÔkgT(å#ö¡²šž+º,Üh׬ƒÑj=#Í:W±Îeë6bd&Ë8Ýeú!raŠ.+³@…›qEÂM²€¸! ˆŸ" tQ.€—ZdÁ¶'ÉP•@B£h‘t:$'ð >¾6"F±¤T㚺‚[Ê]1(/p.wÑ}î:ž /US5’›@0Ï ©Ec°SM’û$M©t£z/+y»L_)!©¦Ê‡Áä׫ë uë]~TR‹CŸÞhÔ»œ|´"Ñ Ê¥ð›ëW%FYrf¶Ë< +Rà£E‘&D×T8ÆÍö$AÏ|ߝý +Z âtp1˜|TJzž&—ýñXU®FTèÑcˆÓì,Ÿ™“ÁÙõEO5¯Gëqߦ1ÆRÍIñ¯áUüӔ§tC“|#ö5•[Ú;1ܔRg0uœ¤ÕN§kËV°^ä•Ê~–E·Î»ÀiՒd0Àb#ðV:(?'1ª’Z¾Þèúù8AëmdÜavÈ4ٞ'h=óº.^ŸœÜßßÛ:ñƒ¤ï¤(ғ­qšœ˜»¶ãú•uWڜÈoè„ò¯¬®ö²•XƒiE`GŽÄÎXËoƒì1ºmü½Y"·iÛ¾a_ìÉVb ‹\WyZOÇn&Ú'z˜÷±Þ¦Ïe\/KYµG !5œz°ŒïòáFÑa=[vá_;C#öQÌnq­Io\*æ¨ ¨Weþ5YìÚ:»Nþ°úÚêÁ¡V_áÞQV6S*ŽûƒÊ¤·#TÛòžû]£ÿ?uNJ®rÇHqt¯>¯›÷9¾ +Cçÿnì]æ 6¯§Ì{UÀ®³iÙ왖u}ÿ»uÛÜÌÍÅÑÑÅWö@ªPÒg~ªLNæx8•mÌýhõÜàGhÙëŒèhðʬ™2þ’>tG2mh 3°ñ<.v%:Î˱ù72v¨ù–}ߖÉì‘yñ€ãì¤ßü‚‰¢'"ÿ~r=þBñ¿:y9ÿœÂÍï©aŽáÿ^–•¬W›mU—Ëé®¼Þ ƒñãSyÎÉäû ^?Ïx†ø½deO!óiƒ9Éê•õÛóM¾Àãƒ6¨½èÅEŽgÛ!c_WIv×B®> k6ú±g>å ‡P\òÄir“&ù]s oZê#üÈ_ŽóÅS_R­ÃÓ®>³ ;#ùGè#ԃÏÀہ=ð¢Ðt¢}·*l{<§=ÞyiñÐ<úÞšðhß ×U㾑 8k};z‘Tõ¶z—;6sý“†·÷Ψ«{n æ©ÁÞç³e*õ±ôL~ý÷Qü­æö?!~hG<<ô—ý+ˆoGª_A¼Èö¼­»¨ã.®+Yþ„yTút;[j¨àeaë§f2ÈàlAetÀìXî¿m.Öóåa`;Lhë~í°µj VJv\Ýl\·Ømûÿ2ò¿ +endstream +endobj +371 0 obj << +/Type /Page +/Contents 372 0 R +/Resources 370 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 343 0 R +/Annots [ 344 0 R 345 0 R 346 0 R 347 0 R 375 0 R 348 0 R 349 0 R 350 0 R 351 0 R 352 0 R 353 0 R 354 0 R 355 0 R 356 0 R 357 0 R 358 0 R 359 0 R 360 0 R 361 0 R 362 0 R 363 0 R 364 0 R 365 0 R 366 0 R 367 0 R 369 0 R ] +>> endobj +344 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [385.063 672.708 490.947 683.612] +/Subtype/Link/A<> +>> endobj +345 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.426 650.855 322.585 659.702] +/Subtype /Link +/A << /S /GoTo /D (GFDL_GFDL) >> +>> endobj +346 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [231.464 619.218 337.877 630.122] +/Subtype/Link/A<> +>> endobj +347 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [440.112 607.263 513.996 618.167] +/Subtype /Link +/A << /S /GoTo /D (GPL_GPL) >> +>> endobj +375 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 597.365 169.87 606.212] +/Subtype /Link +/A << /S /GoTo /D (GPL_GPL) >> +>> endobj +348 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [219.806 511.219 383.194 521.117] +/Subtype/Link/A<> +>> endobj +349 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 445.415 244.609 454.391] +/Subtype /Link +/A << /S /GoTo /D (section.1) >> +>> endobj +350 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 427.81 204.111 436.657] +/Subtype /Link +/A << /S /GoTo /D (subsection.1.1) >> +>> endobj +351 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 408.129 224.216 419.033] +/Subtype /Link +/A << /S /GoTo /D (subsection.1.2) >> +>> endobj +352 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 390.504 202.04 401.408] +/Subtype /Link +/A << /S /GoTo /D (subsection.1.3) >> +>> endobj +353 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 372.88 278.96 383.784] +/Subtype /Link +/A << /S /GoTo /D (subsection.1.4) >> +>> endobj +354 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 355.256 260.699 366.16] +/Subtype /Link +/A << /S /GoTo /D (subsection.1.5) >> +>> endobj +355 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 339.569 207.588 348.535] +/Subtype /Link +/A << /S /GoTo /D (subsection.1.6) >> +>> endobj +356 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 320.007 234.029 330.911] +/Subtype /Link +/A << /S /GoTo /D (subsection.1.7) >> +>> endobj +357 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 304.44 187.245 313.287] +/Subtype /Link +/A << /S /GoTo /D (subsection.1.8) >> +>> endobj +358 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 284.758 245.904 295.662] +/Subtype /Link +/A << /S /GoTo /D (subsection.1.9) >> +>> endobj +359 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 269.191 237.077 278.038] +/Subtype /Link +/A << /S /GoTo /D (subsection.1.10) >> +>> endobj +360 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 249.509 292.419 260.413] +/Subtype /Link +/A << /S /GoTo /D (subsection.1.11) >> +>> endobj +361 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 233.942 252.3 242.789] +/Subtype /Link +/A << /S /GoTo /D (subsection.1.12) >> +>> endobj +362 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 214.261 199.688 225.165] +/Subtype /Link +/A << /S /GoTo /D (subsection.1.13) >> +>> endobj +363 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 196.636 181.387 207.54] +/Subtype /Link +/A << /S /GoTo /D (subsection.1.14) >> +>> endobj +364 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 171.087 229.087 180.063] +/Subtype /Link +/A << /S /GoTo /D (section.2) >> +>> endobj +365 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 143.5 252.131 152.476] +/Subtype /Link +/A << /S /GoTo /D (section.3) >> +>> endobj +366 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 114.01 173.546 124.889] +/Subtype /Link +/A << /S /GoTo /D (section.4) >> +>> endobj +367 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 88.326 165.446 97.302] +/Subtype /Link +/A << /S /GoTo /D (section.5) >> +>> endobj +369 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +373 0 obj << +/D [371 0 R /XYZ 90 757.935 null] +>> endobj +377 0 obj << +/D [371 0 R /XYZ 90 463.983 null] +>> endobj +370 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +416 0 obj << +/Length 1355 +/Filter /FlateDecode +>> +stream +xÚíZ[s›F~ׯà­Ò¤Zíý¢éôÁrœ8Ml×RûP'à KL(€êèßw  Âá"_҉_„f=»ßùÎwΠ15 ñ¦u2jõÎ81Psctk(hŽÃÈMŒ›öàòbôúb4ì|½3(€r¤o]Ÿsœx´õzÔúڊ¡Ö÷3aÆØmÝ|‚ÆD¿3 Jwë«\ƒb¢scØú³Óµ$÷Ót¢ëtu î¬A +¥†À@Βe0€:]lð'˹®W•MkÜt©>:]ÞUªÖ 9F°ÍøÞð¡¿rTê¢ÄY],“"q]¥M\X®.¬±ÝébížsobË[%˜¼5{hnŸ©5ÍQŽijmCœ½÷NåÍ1Â^ñ„T)s+ ï¥E:ԉÈ4§*ºZnTdŸbÇ£o;°‚ñ¬ÃÚ«NЕxJNÈFœ8‘¦Yĉ"}X¼äcò‡|‚¨” IªOœuꏗ®íEVäø^Þ4VRð6‡Í“ˆÚäÕ«”–7]ZÓMòŠìඣ·痜}…ÔODž"ïoÊË5Ÿ³Uö½i°\¯ª2í•ÏW#±7`Ÿ¬Ž9\…‘íVǨ¡ö—¹¬Ÿ%Túý±ï…‘éDIŸR§B ÔWúNšâҍ…Q`9^T}œ“goŠœ/hŒPŒjâòéƒ@’úA€pŽDšW"R4ð3©³¿Ð¼¶'º¼M{À|¶Å õ‹ÊŠÙö¥©ö¥X-Å=jŠÝm¡g +=”ˆćHÒr$OmÍ×ñâe”Å’èÒUÇïjX4 Œ«2Øèq… æøËh©Ê‘׈c©c”U@Þw5Í«Àù[X*bú‘wý¬¾ƪ¼UÁŒ]א›—C|ø®9ðãKþìÀñ¦fÜGVoŒ™ÄO˜UƒÞ‰r$ÞØ^]á—ÿµCuˆvÈ"k@T¿~–â¹ÐÀ°Iµ©ê£Ñ¼€ 5yT ŠÂ$™ÿl‰K ¬úÕRömJ™~9Å`,…j4KÕnƒÔ¦ OàÊ^4ï¼=ú+´ƒ_:ŒµSX>XÞҚ'ÿ?BS +ìÙ ±ìêSH#@´K‡va²³/FöïøQ9ÛY¯®¯8SìY-ú½ÞÝ݇`é9‹8Qo±˜÷öàËí! +Äf’ÛÌ·®Ÿ=@t<=讟³ï»GãÿYx A +endstream +endobj +415 0 obj << +/Type /Page +/Contents 416 0 R +/Resources 414 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 343 0 R +/Annots [ 368 0 R 380 0 R 381 0 R 382 0 R 383 0 R 384 0 R 385 0 R 386 0 R 387 0 R 388 0 R 389 0 R 390 0 R 391 0 R 392 0 R 393 0 R 394 0 R 395 0 R 396 0 R 397 0 R 398 0 R 399 0 R 400 0 R 401 0 R 402 0 R 403 0 R 404 0 R 405 0 R 406 0 R 407 0 R 408 0 R 409 0 R 410 0 R 411 0 R 413 0 R ] +>> endobj +368 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 721.97 163.723 730.816] +/Subtype /Link +/A << /S /GoTo /D (subsection.5.1) >> +>> endobj +380 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 692.46 180.928 703.339] +/Subtype /Link +/A << /S /GoTo /D (section.6) >> +>> endobj +381 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 674.701 192.764 685.605] +/Subtype /Link +/A << /S /GoTo /D (subsection.6.1) >> +>> endobj +382 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 649.151 155.484 658.127] +/Subtype /Link +/A << /S /GoTo /D (section.7) >> +>> endobj +383 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 629.49 192.714 640.393] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.1) >> +>> endobj +384 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 603.94 155.484 612.916] +/Subtype /Link +/A << /S /GoTo /D (section.8) >> +>> endobj +385 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 586.335 168.435 595.182] +/Subtype /Link +/A << /S /GoTo /D (subsection.8.1) >> +>> endobj +386 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 558.728 206.393 567.705] +/Subtype /Link +/A << /S /GoTo /D (section.9) >> +>> endobj +387 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 539.067 226.298 549.971] +/Subtype /Link +/A << /S /GoTo /D (subsection.9.1) >> +>> endobj +388 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 511.614 221.874 522.493] +/Subtype /Link +/A << /S /GoTo /D (section.10) >> +>> endobj +389 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 493.855 325.674 504.759] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.1) >> +>> endobj +390 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 476.231 385.987 487.135] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.2) >> +>> endobj +391 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 458.607 231.757 469.511] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.3) >> +>> endobj +392 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 433.057 196.43 442.033] +/Subtype /Link +/A << /S /GoTo /D (section.11) >> +>> endobj +393 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 413.395 416.04 424.299] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.1) >> +>> endobj +394 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 395.771 389.902 406.675] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.2) >> +>> endobj +395 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 378.147 434.176 389.05] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.3) >> +>> endobj +396 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 360.522 399.991 371.426] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.4) >> +>> endobj +397 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 342.898 364.449 353.802] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.5) >> +>> endobj +398 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 325.273 474.819 336.177] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.6) >> +>> endobj +399 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 307.649 355.024 318.553] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.7) >> +>> endobj +400 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 290.025 389.345 300.929] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.8) >> +>> endobj +401 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 272.4 449.668 283.304] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.9) >> +>> endobj +402 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 254.776 348.398 265.68] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.10) >> +>> endobj +403 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 237.152 382.719 248.056] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.11) >> +>> endobj +404 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 219.527 443.042 230.431] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.12) >> +>> endobj +405 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 201.903 487.442 212.807] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.13) >> +>> endobj +406 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 184.278 427.108 195.182] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.14) >> +>> endobj +407 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 166.654 464.189 177.558] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.15) >> +>> endobj +408 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 149.03 394.038 159.934] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.16) >> +>> endobj +409 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 131.405 346.715 142.309] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.17) >> +>> endobj +410 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 113.781 381.036 124.685] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.18) >> +>> endobj +411 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 96.157 441.359 107.061] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.19) >> +>> endobj +413 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +417 0 obj << +/D [415 0 R /XYZ 90 757.935 null] +>> endobj +414 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F11 418 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +452 0 obj << +/Length 1422 +/Filter /FlateDecode +>> +stream +xÚíš[sÚFÅßùz+̔õÞ/L§!‰ë4ÆÔо8 k£‰¨ãúÛwe s“Íj éè¶h{öèüAïփÞiãÝ°qò‘OÅ1÷†7ž‚žà0Œ¼áØ»jv/zýá õuøÉ£Hˆ”¹ôñÊw6> 7Ù=ôx9@捦«¯Ð›ýŸ<ˆ’ÞýãYSbb>#oÐø£Ë[)®Ooˆ.˛cpåæ¤@Qê L䬼 0lµlö[ˆ5ƒtøý$z˜èqøŸÃë4H:Óó¾g:?çV§­66Wt£`>/¾^êêx¤;µ¸+ïª-)o‚¼}¸çªÔrkã&‚M ÕÚîmb泍à˜.Ñ 4i8¶ç!¨xÖ¬^@†°2l‡Ìïê4 ¿@ˆGÑ•5@&Ñ¡•D­•´2Ɉ –N§›LgAZòdéÝ(ÛˆñúÞWu›A5PËnŸêX§A–¤u¦’:´r@Âê"ñóLOíÉHߤ÷ÒapÇÞw:£$žg~˜ÕՉ²p;¨š˜S‡Á»»ó›P®fÇ>´Ä9sdé@ÅÅë•ûñ:δ v÷:ÏPé÷6gDù/œ|Dh5¢qjÒZDÄ_ŠS6Rœy–<…ÈwÉ]<6-·8kþ\À:‹o’Š¦9±Åu¿îlyEžÃ–€M=EOÚ}~®=ÿð©œrbæ6¦(Cy“6±H­gs¿;Ñ£o-3¤z\Å[B ˆ=îaE0!wq¥‹Ve]ƒ«äB¯B/ànôÐtBŠ­éMÐÛ Ïó÷“—ù½»éµ©A¶Û)­Û4üi>kˆÉäýŠæ°©» Zíã‰U#Œ1 xs„ó“×F8¯ÛX1À(3LP¬dú¼ÿCµp|µŠ•Ès·9 +UØ ¶Òx/ÈÂÜÍ¿ççiÿ"Ý¡zŒ`œ½ã,›p´V‘=*íf̸‹¶Ä¢(úÆ:HýÿÌR=Ÿ‡IlŸž°à‹M¡2 ÅÒùYßï§ÉuT§àœÉ"ŒpX„!S¯×}Ú]G"ʃ±¢~²&åS/ñ/õØLù|²TŠí8ԍ{Š«Ã¹V DBlà¼hEH—5"`E +pI÷íD”Ñ6žEµXƒ9ÞÖ¨Eµv©Gùá‡Q¤ý³xv—ÕXÛÆ +‡H)v¨e©EÑ6˜óɋµ +†&&Aú«U³Ò¶¨N˜’m °(‡“´0|1*¸ŽêüÇNÈÁ3^¥‰ƒ- +¹¿Z!s4¬‡é•ÿ>%-Y“–Ë¿vÒýB©¤áð?&U5iÌýÎj¼EŽÆâ7Ãjñ¹ùv—¦J’¶/§-^Aã@ SïÇ1+7œ”²y"\n.0›%ëbãϹNj1Ö,ážñ]ß¿@‹•øt¹R Anêæ2ˆéì@/¢èÙ7oñí÷ü}>¶r¿Hš’ >­ßL²lÖ99¹¿¿£9¸‹ÃY +Âìd6‹NÖðmô! +–‹@7‹w¦Ébք±Ù9} óëÃcøÿ §PN¥ +endstream +endobj +451 0 obj << +/Type /Page +/Contents 452 0 R +/Resources 450 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 343 0 R +/Annots [ 412 0 R 419 0 R 420 0 R 421 0 R 422 0 R 423 0 R 424 0 R 425 0 R 426 0 R 427 0 R 428 0 R 429 0 R 453 0 R 430 0 R 431 0 R 432 0 R 433 0 R 434 0 R 435 0 R 436 0 R 454 0 R 437 0 R 438 0 R 439 0 R 440 0 R 441 0 R 442 0 R 443 0 R 444 0 R 445 0 R 446 0 R 447 0 R 449 0 R ] +>> endobj +412 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 719.912 361.519 730.816] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.20) >> +>> endobj +419 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 702.288 325.146 713.192] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.21) >> +>> endobj +420 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 684.664 371.631 695.567] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.22) >> +>> endobj +421 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 667.039 415.904 677.943] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.23) >> +>> endobj +422 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 649.415 369.958 660.319] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.24) >> +>> endobj +423 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 631.79 404.278 642.694] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.25) >> +>> endobj +424 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 614.166 464.601 625.07] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.26) >> +>> endobj +425 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 596.542 370.525 607.446] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.27) >> +>> endobj +426 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 578.917 414.799 589.821] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.28) >> +>> endobj +427 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 561.293 457.744 572.197] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.29) >> +>> endobj +428 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 543.669 422.018 554.573] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.30) >> +>> endobj +429 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 526.044 513.996 536.948] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.31) >> +>> endobj +453 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 516.146 169.232 524.993] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.31) >> +>> endobj +430 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 496.465 468.653 507.369] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.32) >> +>> endobj +431 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 478.84 382.142 489.744] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.33) >> +>> endobj +432 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 461.216 363.342 472.12] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.34) >> +>> endobj +433 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 443.592 378.834 454.496] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.35) >> +>> endobj +434 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 425.967 454.227 436.871] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.36) >> +>> endobj +435 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 408.343 443.148 419.247] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.37) >> +>> endobj +436 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 390.718 513.996 401.622] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.38) >> +>> endobj +454 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 380.821 169.232 389.667] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.38) >> +>> endobj +437 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 361.139 451.227 372.043] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.39) >> +>> endobj +438 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 343.515 385.489 354.418] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.40) >> +>> endobj +439 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 325.89 385.479 336.794] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.41) >> +>> endobj +440 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 308.266 352.822 319.17] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.42) >> +>> endobj +441 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 290.641 410.252 301.545] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.43) >> +>> endobj +442 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 273.017 367.049 283.921] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.44) >> +>> endobj +443 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 255.393 468.623 266.297] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.45) >> +>> endobj +444 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 237.768 349.694 248.672] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.46) >> +>> endobj +445 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 220.144 340.08 231.048] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.47) >> +>> endobj +446 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 202.52 384.353 213.424] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.48) >> +>> endobj +447 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 184.895 361.668 195.799] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.49) >> +>> endobj +449 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +450 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F11 418 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +465 0 obj << +/Length 2576 +/Filter /FlateDecode +>> +stream +xÚÍYI“Û6¾÷¯ÐmØånšÅͳTMì¤ËÇñ¤Ûs±S)Š„$Œ¹($hEùõóÞD©ÙÞâÃ\DÞ¾|€‚Åf,n.¾»»xüC-r?OD²¸[/ò`‘&¡‹pqW-Þzá嵈ïF¶²/jzyÞ®/Eìu}ShÕµ4iŸz+iðúõK¤"leÕóëKµê‹þ@/ï‚8aá҄èi/½¦«dßÒÔÓGhPO)¬»žÚ²oŠVíÆÚÚfº5=Û±‘½*-‘W»vvíP2飷…†…¡ðÊ¢¥ÁJÒ³—»^²Õ²â(My»Nµz 9ś†®‘d½0œX/L–~àj¸µ3Ž}ˆ"þ~]©F¶ÈjĺÐ̲ÔÆÈgW”Ò‡qž÷B +È ‹¶”WøšC´°Æ, 4Y&Þ_†'që&ª®€0¾Û¤dâÜH°7JsJ”( ¼aÜíº€ÓèOœ%câ rÅgo Êà÷|° X'üùVíŽÁƒË0^nAgvÙ¥a¿á|üùæbñÖì{:Gƒ‘¶S6‚"‚`¼Œw;–[ânõ7[‹^΅‰lvu‡†;˜`@[zsˆD ÆÉàe3Ð / È0(À"‡A öI2õ.Di#›‰ÏmÑW{…<Ý:tk}ú©ìš*FD–x{¥·'ª%¤Z±ÛՊء âc¬mU»Á·ÌSÍN¢j^¡©o=¶¥ónÌÂàŽºÛ¨’æv}·é‹¦qÔê¢ÝŒÅFLd8´å¶ïÚndænÁœˆ…Xºmê¶N3ݕ]mh/1‹úZCFÑg·y{ ±¿ê•y¬³ .âHxߓŽLRo»q³µc&DY;]ÂY“ðl;MƒF­ž­9,€Յ)»©éÃ_Þ®èµ*¡¶õ4 j­jÙ RQÊRÀt%µiilÒ žÊd$Ѐ%ûµ ˆ’×o‹+)y[m¨vÄ^4J¨#/>°¬–m+eÅL,Wü6ç¬U‡¦äì„. .††&¨á9 ?pA¤ÐcLM†ŠSæÀ\:˜´X†ÞÞøñlÁ±màvÈZÙH*Öȋk“²{–ÃDw×;NÄ;äL‚©¦³#Hä=kitÊ *w²¤ì¥wt´™× ÏMrß&Úcžæ¨¥jI_ë¢|o2ÇÁcFhÛóp"=2$éaԨ͖‡+Þ6r=Ö4Þoe;W L ézäzEAúŸ‡ê ª²®Ÿ¬é‰…gÔ®îãÔF‚ì¼’Äžïئ~"–ST+MÖ–Èᔸc}ôsl‹Þô󺫡^£—A“'§m Lüe”¬‰ý8gÞ Ÿ5‹ë0“Ò¬:Ë6ì™C¯d[Շ'˜Ðº‘æ÷½ÒŒãM€~æ¶ÓC§J€þ#zÚ ¦ð@\–9d€y9Cu àÁ¡‹Ã ÍøÏÐ íš?æ@ ?¯øÛ @ËK§êßIžtûˆÀ'ÜLÁ‡AiŒè¬‰5”= ÿzê k ?Êbˆ$„»É—92¡æè©mѨ’Y\ +D:…ª‹UÍõAõz´ñÜH¨ ‡S‚.ôºÖ®U£ôÁ›r0]êÐÞiƒÊˆÎôb÷L逵?O[h¦«JNô¦C8›/ý™lgû$Áï£.Ãlrˆ]%¦§id XŒ(¡p^(ënÕŸS×úsPÛX²áqŠÞàœÁ§6}⠕´õC੾0äÈV¥Ü¡I¯‡b-Y‚v +!9tdñž·A ìƾt•ð¸‚"w NÕ¥ ÞZÙº¼ú/`i[´Ší‡Æ1ÝØ~#›CÚZé¥9¾šFERÛÌjY¢=›w ÝëÔðMÁ§Nyk8gö%·dôj÷mÄ ×#ÔsE¡+ÇƜýXzh´Ûb7œr Å4—.ݎh׺hԓgZäõ'$ h𜈲S¬7ÐGcPøf¡L +i£†p WmY•ûüôŠH¼˜TÄ+ÂA?=-ššV‘SaYAïpú^YŽ¦`À§×=&»éû™¿LòSÈÁðû¼ºÛ•_áËu/]tEìÇJ ºWìÉ Y Ï µy}ܼz3sÙôz\ÕæÁø¥*¡´KŸOÕ3ã9Ær"˜hbú6ð)Ø|7i“PËKЀw¦žéÏóôy¦áâŽ>»Mt3áĈÓà •z?R¦¶H‹Á2bG§ÆP<1™ ú£\¦ÇUǎIÌÎ~›t-[1”íZ+ðF[N\Wƒü /l¼áqÆëg KMµ"À +³Ãeè9ÓûÑ&ÃÃ÷Ì+¡hBáéç]Xà®7ÃùÔ2ÎÜUÙÌU…9¤äø,Ú…Åä#¤aU)‡¸áKQ}P%ë&ªÎxj´þyc[Ô~vÿ +t…yì.ÝUã­ø m.Üü·¯Ï8tðÔòÉûÆҒTLñ'ݼ2j¯Hocú‡ã‰Ð…*ÞÎ؅’yì°*âÅC +)MS`³=šBá8õƒÜAáŸ,‹ÄÏSHx…ÑB‘Ÿ„ÉÇî_OVám$íÝ9{ç Î ÎÜ»BÉÍIÛ®0u³òhªÐ»yÆ©q-‚ÄÒÓ°¸£Äì€'l7§¾ŠfèzÀČêihnpqÀ‡}ƒpŠÆÜá-J·‘Ô”ðƒ¹”²îmÓxífº«éÀ´/ Igîw@eµ¶À‚n3Mœ^/󀅟 vg*Øð&GÇû¡–&~²t‡¡Á\(ØnN”fœ™ø©HힳÃ'H±q+x¨±Ý/ g,êŽÌâé¯öÂÓÕ"s&Xºô…pÊ\7\á²á~™\¯^}®dYâ‡iòdùœSѾ{öë-Tð¹+ûeêÔŸ<ÜÞÍP€Š’ºòôé •LDùƒ¯ñ·Õû§RlªŸå~’Dÿúã•I…þ㧭/t|÷û܍F +9ùùN~÷Ÿ‡ˆD_¥·…D'{Îÿ„L2?³ÏýÒü÷O;ˆs?ŽÏïܦÿäÅÁÉ?yÈN.ÚÞ8ü ¢ÃÁþ“غKA܄ŽWªòß.X«o¥d%I³÷ ;úùí(o˜¥~tüïl«õîÉãÇûýÞ/lÕ®÷•~¼ÛՏï›zB%\B9¶DÜ=Çñ9ùƒÐ?·ÿÿ§ß +endstream +endobj +464 0 obj << +/Type /Page +/Contents 465 0 R +/Resources 463 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 343 0 R +/Annots [ 448 0 R 455 0 R 456 0 R 457 0 R 458 0 R 459 0 R 460 0 R 462 0 R ] +>> endobj +448 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.351 641.725 427.818 652.629] +/Subtype /Link +/A << /S /GoTo /D (main_convex_polys) >> +>> endobj +455 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [263.548 288.288 337.122 299.192] +/Subtype /Link +/A << /S /GoTo /D (main_use_of_library) >> +>> endobj +456 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 170.907 190.125 180.805] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +457 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 150.982 202.08 160.88] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +458 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 131.056 187.689 140.954] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +459 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 111.131 229.532 121.029] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +460 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 91.301 169.757 101.487] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +462 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +466 0 obj << +/D [464 0 R /XYZ 90 757.935 null] +>> endobj +6 0 obj << +/D [464 0 R /XYZ 90 733.028 null] +>> endobj +467 0 obj << +/D [464 0 R /XYZ 90 712.582 null] +>> endobj +468 0 obj << +/D [464 0 R /XYZ 90 712.582 null] +>> endobj +10 0 obj << +/D [464 0 R /XYZ 90 712.582 null] +>> endobj +469 0 obj << +/D [464 0 R /XYZ 159.628 279.486 null] +>> endobj +470 0 obj << +/D [464 0 R /XYZ 90 262.759 null] +>> endobj +463 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F11 418 0 R /F65 376 0 R /F23 340 0 R /F72 471 0 R /F31 472 0 R /F10 473 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +487 0 obj << +/Length 2299 +/Filter /FlateDecode +>> +stream +xÚ­YÝsÛ¸÷_Á·J3 €$H&Îô΍›»ëœ›¨}In<Yœ£H…¤¢SÿúÛł$(ÑršÉƒM|.ûñÛ]ˆ{O÷îo~XÞܾU¾—°DIå-7^½H Já-×ÞǙ`b¾œóÙr«ç òÙ¿Ò¼¤ÖÛ¹ g:mõ\Ä3Ý̾c5óç¿-ºùÇòæó€s¸' Ý0b‘zÙîæãoÜ[ÃøOg~{G³jç҇oá}¸ù÷ ·RHë6åßëõ!ÓëLJº‚Ƥ4‚´ð¢4úwâ…Ÿ;iï'¨Ž£Ú‹â Β (&|"»˜‚MÅ"©Îµ5>ƒÌòJìXÅçhÌz”°Pyž@+Q™;ù"r܀“ãúÉ{pИº¿£ÑLç>@~Üïy?Ád:C É-5òs8«F»ióÊrWíuÚ.̶•Ã42±ß¹AgÒ¢*ÓgPcp0pWB $€XW;È°›KÈ7½µÞsDæˆ<€ö–æß!äAì;”9¶vP„-š8.«44n²GiÎ@ÉÉ×xœÙ˜|Y ù~^>½û~ ¢Ám£@ ‹ÿþ쌀!›‹ÙÖ=]Ø,BºªÅa€ÕáFŽ”þY!DõÔõDûÊL+¯Ý`4céuð»Ö{m" N—Ý· °µ¥RÕv¤9ÁM2²;èÚ@­£]ð‰sY7êt“ÕùJŸéì’³†ê–^3&º` +•“¶öúpF@W;ÝÖ]÷Μºo«z*Hr´:ð³¤3ŒËð›0õ©–ËlÌžæ‚Ïœó‚ØÞϛòiHM£H½)!¢Í(±’LgvÕ:ߜŒ©`×6Àö:kíDŒ% ;8 0j, ÒBj€÷mkmý”A4¶¨ßórm- åR,¾br@JG.¸£ÿD£ ííõѾ£UÚz"y†^ Yƒõˆä¿n℩:zà5F€üP ôÈ9ÎÊ"öKÈJMÔ[ƒg©CR;TL ¢nøŒˆîÚáuKJ멼0òמÙD% ±yv#oð2œ`¬ùY¹<ý$镃旣±fÏԄÑ膑o@׏ Ô)mÕ 隍›À…kL°Ã 84kaÓÓÜÎFÂ4„•ºÚ×¹IÆqTM…Õ-¥«¸ê˜›² ¦‡ºÍw“q\t÷Æ>[LFgõfVè´.Nsdä ¼!wþe"”Š\T‘̓žnrdÃe˜rÑ°Mh`‚báÀzÑÞxÚa¿ÇÂÜtGT—†Ã²)þ+§h8$Æúx⨉DŽɋêÓw%M£€ë´Á*җ¾ÕŒÛ :˜°ë˜‹éMÃô.=ÑÀÊî«!f¹-DD£rNy~1y8Ѷ~È2ë(–ÁVÔ{v’>×ènmÓhGg‚ºðÆÆ4³QÍ8µ¦×• ee×÷ZÂhÜ}A@cÓEVàn‡öz-NìŸ ¨ü¿ÃŸP ãaïÔý+æ¦* +Ê((ÂÀÐÊ9¢»/ԆhWÅitKmˆÕé,Ò?<übo~ñø·P[+Ìý®>ÿy!\·Ù§]Õ¿Îwºl K{3^È_x‹°”蝐cUèáiÃ4.§Àš¾í”¬ÒÆ ä ±gȨëdŠ¼ü!^Ýöà.ß~ùZ]®nò°Ýª*¾UŒèzYÛò«ë®äŸx×í*~@‹Eèb ØÛ6϶4A™JZ?‘“°ãfbе¹gvû” Ø2•|Wsˆ«‡¼Xa2LäÁd”˜£Ëµs"Ås{ˆ]0‰GÝyt—pü~œ}— ǵ†›{Iò9à|5DtYòÎC9‰ +‹p"ê)V#œÀ]Æ£‘šƒص÷nhUKË/`çú5|.Ñ\t‡ûÅtG¯#õ’ø.á‡Åø¶rõ…i ÒcÇ9ÿyGÅ,ñ×þºÓýš£XëÐ/OaÂÂ08ê“pÖ»Ôv«â´ÕëÚvÉWuZ[ƒûO£ë¿ÌÃpÖt¿T•‡ Î–Mœá‹ Å#HC¡ÐÒÝË*Ýìw¯kýL¯L¿"Ž˜?<•nÛvÿúööx<²¬aPwïk–··Ðo/_|*"`QOdsY€æ%ðÆsعüÿ‘eå +endstream +endobj +486 0 obj << +/Type /Page +/Contents 487 0 R +/Resources 485 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 343 0 R +/Annots [ 461 0 R 481 0 R 482 0 R 483 0 R 484 0 R ] +>> endobj +461 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 720.63 142.304 730.433] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +481 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.957 624.888 268.261 635.792] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >> +>> endobj +482 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 562.461 247.465 572.264] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +483 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 542.441 337.129 552.339] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +484 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +488 0 obj << +/D [486 0 R /XYZ 90 757.935 null] +>> endobj +489 0 obj << +/D [486 0 R /XYZ 496.074 477.842 null] +>> endobj +490 0 obj << +/D [486 0 R /XYZ 90 461.115 null] +>> endobj +491 0 obj << +/D [486 0 R /XYZ 390.898 361.523 null] +>> endobj +492 0 obj << +/D [486 0 R /XYZ 90 344.795 null] +>> endobj +493 0 obj << +/D [486 0 R /XYZ 338.874 166.557 null] +>> endobj +494 0 obj << +/D [486 0 R /XYZ 90 149.83 null] +>> endobj +485 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R /F72 471 0 R /F11 418 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +502 0 obj << +/Length 2509 +/Filter /FlateDecode +>> +stream +xÚÍZKs㸾ûW°öªbÁHð1“\R»3U›dkSãT3[[”YL(RKRãÑ¿O7 Aš¶eg&ÉÅÄ£Ñèº?@¼;/ðÞ_ýéöêæ]zËb{·;/ ¼$æL +îÝÞGŸ3¾Zó üÛ½Z­… ü¿æeM­w+!}•÷§vÅS_u«uÈeûÑê—Û¯~¸½úíŠÃ>Ç5_™°$”Þöpõñ—À+`üG/`a–z÷šêàE"„oå}¸úÛU`d \YeàÈʃ˜Eaê%"dA,IàOBH½½]ç}\K¿*k•·$÷¶©ïړª·Š!©·æÄ&Y”FÄè‡|»…ÂpXŠmXÚõ-X Ç¾ð·yMEßÝ©í÷ÊRWyוŸ‚@¨‚Fú†ÖmTB¸c¡ßԆGc–šÖŽìhY¿·Û4UÕ ùïK˦;×}¾íË­éž6k­]úq–Ic -“êÞL´dÇLYÖh…²ëZÁÔX¥£O »c׸þæ]êzMÄ, ÐÏz“€(„„'Qf >$ŌKÀ$- ‚ItD,KùÈDò·S]Ö\ŒÃ>kž±4áOëÜ秾©š»r›W¯Ó9ŒäKtŽ¾ÎQÆdƍÎϹ¹WígŒ±KUæ|"m¡4¨ôeAç”E1ÿö:‡!‹¢ä"7Í©.T±.Ê*¾S-f‰×hÉ.ˆŸR>SŽrÁݲ4çE ÿfà¨ð26Û>¿kê×E u`Ÿ©Ñҙ͆ùß?b°ðƒ_嘉§S Ä>.²˜[˜Ôo§¼*ûókŒÆL&OorÚþ“tQ;% KžT/A%¿D½º©× E¹5¥ÂUšÿÂ©_F¯8béc.l39ÿ»ˆ!g!HzQ±ú6öŽc(QáW°·xÎÞNÊDùX0i +U¾(­¬'”À0›BŸšÞdù~Ÿ÷¶e†IÐDý¼5ucH‹²ûgfdàJX, ï塬ò¶:¯bé_ƒF)t—RŽàRF.5} .hc¦xF4v„ï€'ÚŽžÄFKOâÈÎ,×x¦æxæF<é¢È˜”mòµ¤±À  +êºéK@'šÄš€”ɚC΋&Á4­;ê’CÃ_UGáb%¢ËªÂ"Þ|i(ȟ3Mú-Ló:ˆ%Nã×L:Z:É1Å®íù¬×Ƕ9ªö2N‘R}iz¤#Ì"Sõ£è%5äigȉW—1¥y™3 —$ /rÆ«ÍË1›„ÿ¿Ö•Ë֍/±®X(;<ÉÏb“ zSIbˆéM›·gêäU×P«;M««3öΐ)w*†8‡&„ºì ¯-¤ryR«ž§×‘H_•ô4A;šS¤W¸8še¢Á» Ï +èëÍJþɤòN©Y­‡"‹ÕJ›Ñ@³¢i^_¢øòš^5 ÷þ{úBÜ­¸ô?—‰î“èJØxv›c_ >ô”4‚ǘ›vØ骉4E-]5áKU3 +'ÈÀ%¸Sµj­Èî»L†¸ÂÂW˜è3D"šš4ߐŽøG½Y­£8ñÁ +1D”)Dæ߯8\¼Ú‚zßm¿ÃnêT^w4CЇ¥ºþÀ³  ÇØ0«T+îCDrÿã©WCµ`û¯¾Ñw7ªë‰üt¼‡` +ßl–éjmWLƱ]EÒo¾€.Ë Î›q1d2äibÂ-M}…vû’k ãhm°CÄ©%NÆH‡¶ûƇDÍ8><®#HGÿØ«šHr¢͇=4Ÿ^rÐÁ[±'®.uÆLÀ$ǪDg`qœ±f]'Ž°«¹#•¬‰a[XšØ¸¯Î†…·*tyÌü²'úû²ªˆbHÈ­.|Љ…^o$<ÕÝ©„0èóMio‰“é5çÍy)Eôûց˜I›‡drÕVÑJ˜h¸±÷“R¬ ¶ÓyÊ¢ ÏAÞI;FIIä§<ÔËkôC΢èÕÂÔêÑlõå×ù"CÃu}A¶ˆBiÎZæöôÙÊRJ:ûhñJƒCÛªéôÁ2ˆ½U˜\ ­E4°è¼WE›Ù$-j›ûH„!Á-&¸/¹ögãÚîûy]Pc:ìÔÌUaì•As1ߢ¡Ÿ 2²;6ùi`:£øСüŒ£Ž°e½^º­ñJÕÁÉM¢Äÿ@9=‹ýc +p=`O«îË9ˆ‰¥[f’€…#JɋâW'y<ÌX)Ä̀yÐx ,S¹rÆÑÞ +8†7;xƒ´ £‚­áԑ:yms.0‘áÔ÷“sôIè—;ú¢í)5aïµrú`Ԁp£Ï¥ö®±žA>nè$³Ró›G",?‹+ ©1À[:R¦"ã*¯¢xâÅ4{ҋ1ÂÝÁä­Ú¬¿¢†O;“‡’…ƒïé0͝)¯a3Ώ;•‡œÉ ™y´0^M1°ÓðàÓ(e©~év-1bˆOáz’§éL>òbr“Æ€‹“Æ §Ó&¿}Éèt`¥¿i¾èé—Aí[ñǬéêËuQ€q‘û»Cgt‡á}ŽÒ¦ç C†ÌïZ»Ð¬9ÙíòE :ûY’†~ôÏÛR_[D0K¢ÂÍBÂÍBH«³Žæ•™žñ“g6@q"‹àœ 듚hú}sºÛ*>0ˆu¶FÜÕCãQ¦/*3ÅsϚý6#^ò¬)9aQ20ÙæõP_7¦¼¶êتNÕ½*\$0§šÜéË`qÜ¢onγŠ>7ÜÄ,¡$úu³ +Ÿ»‚³É½zö{<œïŒ(õ½Qr>>W¾™-›f”%1áê 9^¯1`5áN|K ˆ‚© ˆ‚þDÁE<ÎÑÒ Z†a;=f¸kº@Þ«aBß9hyi–•†}Ù5•ÞíÍòáÅ»¨·‚N¤a>‰ícfäH8•*ŒÒåŒÛ·WlUꠟÝéœ>tٞN™«×H[ëBü±LvmcÖ ÂÙÇR¬4¦æuƒé'Sˆ‡ø”2J’fÿòlëÏWº’òr€na0ä²}ßßÜÜÜßß³mÇNuylYÙßDºyx,.> endobj +499 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +503 0 obj << +/D [501 0 R /XYZ 90 757.935 null] +>> endobj +506 0 obj << +/D [501 0 R /XYZ 90 79.617 null] +>> endobj +500 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F8 504 0 R /F23 340 0 R /F11 418 0 R /F7 505 0 R /F72 471 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +511 0 obj << +/Length 2428 +/Filter /FlateDecode +>> +stream +xÚÅZYsã8~ϯðÛÚUm†uö¼Íöv×ÎQ3»}êžrÑ2kF×Pr{²¿~²¤Ø²¤jñ‚À€2=ÎèìÓÝ÷w÷C>KHzáìa;Kè, + <6{Ø̾Ìa‹%£”Îvr±ô:ÿYd¥i}\xÁ\Šv¯,žËf±ä,ˆÃy°øíᇻ<Üýyǀ1M7ˆHăYZÜ}ùÎ60þ̞ijƒ^UÌ|Ã3Ÿ}¾ûם”ÑㄆA'#ñ·r~’¥T¢­”‘ñ“¬ +Ùª,5ݲIUVÃtƒBÞ h2K( µ šp·å_ýÉ4Ò½R²ló'Ómöu]©¶1½ö°`t^ٕ¹higª­y>Ždûмתr{-Yä³¥‡OÏÈñÕó‚áº/˶ZWùÓNn”Qòìdc7 ”mŒ^©«¬l›w¦£Ä“•W”ÓȳR6ß yS2!ÞÙU¶¹^¬ãêDµPNOª“rä „ÄçñPcÿ†­ ß3K±é^÷Gt}'4šZ¦ÙWJ½ÔôõÁñe6œ~V•Òjd!`À®†óìYîð¢’ÛJÉcÁ‚ù“Y—Š²¬ZÓ^[ûˆãÆPό$µò5¼ÃÁß*$‰Í°Ç'€;Y,ÎÿYš‘´*[%šxsߟ‹Æ¼&r%Ńëm»b]¡|ßðŸÔïöHì”û‚ ½ƒ‹‰ÆÎî²f¥ü•þØ C E¡{᝵Ê>E‘(f=’p¢ßð$'¨F|i|Õ¶‚hQ=f©Èó§UšWà˜Ÿ'7±Xç:g8ŠM~ ý*Uù$˜pd¸®öåfrÈÈÙ%šÝÄXHˆš`¤|”j¥Ñr‚þ’ùŒøB »×V6Ö>·Î;£,!T¹à¨®ÚlœW xä#ó][\²€x܁ù¶U+òU!‹J=ÁŽWë'|Ê&xD|Hg®Õ¦ü ‚ry Ð' £6žžBÁpöjìÞZúQ&¡#åjF k«Ï쿲 @ú©ÅykµþòãÄépgéN¦Àùû4²8gZÒ4Ž€=D|î„}C˜Ç7Äk‘c҅]´]£ì)Y+HÑÀ®[ ÚË(öæ(àgˆ[Ž®¥©ó…l# ÙÉ°oWa’ø6‚`K`¦pˆÂÈ +ÀÑï«*—f +–èââq‰ŠÁ]cj%óÃNÚeñt¾C+ÿÜgJ—#8Q&«À­AÓÔކ²*—§ÄF°Æ²!îtÎ{ð‚c×1rՅÇ)?¢Œ„,¹éÄv R_Ez©³(ʬ•ù}ÿq…Ä¼¸íy(€Â`þnŒ>ǘßù—Øâ[˜R—ãtàˆMÃÖK-6›ÕHÙÍ +D„X¼žŽi ”–1ŸŒiõŽ1è,'é<’(H†FNô;èw*Ðq%“LJç'ÞGkdzƒùð~è]äЩBJ~“Ïöúºü|š“Ëß¾z¶U¾¹‰ÑA§õ-äOœ¢Úd[¬©’ÀX26¬C`³oõØG«ï­s sߙÆ Hp4Ÿ3›»få£%QŽØuµŒ^oŠÍ˜ÖGT”†êB "AšïËqÔ†Ñr~¢Ì ÆÜÞèУqJC.5%-öÁ)t}IM•O4Ÿc¡¹±ë̜ N*ëÜ€·NU’B‘Âxðbc¦62£1X`6Ðäïu´Á%}éqQeÆ×v­)BqFƒš~Ýôk¹˜#³Ý—)êÞñՐ×q'c¢¨k½B'²=H9NYŽÂ½uÎá×W§×5XÓ¶X*\&ÍÐw¢ë}Rw¨~ÇÜzµUU1éŸ1'œñQÚTuwÃp6_W¸ÂU›ƒ$äü›ÏrQÈޅàÛçã]‰¦ ´½’+`“=Nb}ÚÉ QŠu§£ÓÃFjó¾‚<Ɂ—\$ßÖ¾ÜêJAîιu”ÐÞ}aÕv™sŒÁcºríñÈ­ÄÞº–é5JÓë_O¼Ï]É\ÔÍUÔìöØx€ÄQæ +7¦àÄ©he o"ÿ€xsõ” {œ1ÈI]ˆô`ws\ÈkwOÿÿqèàe¨ 0zì²C2³E™n(Q6=ÜıC–禵¶« fÊ3}!Î"«Mí  ˆ0€²Æj-¿^j€äÌCA¦väÚ<ë*Èm3Ñî^ K$ǏùöJu/Ÿ}‚:¢FJ(D»{ÿ⠞õ2Öñ,Bó¹òÊßXèßV€ã„$‰xl[`*çÒ +Áv‡?#ø)[+áîÌÿÓHõ·EÌ÷{‘rïîÖÑeÝwÇ.€PÂ(ñГ‰ù…Àg)í&ÍÎþ˜¹Ö&Fåe1Ô2´ƒó]ÛÖïïï‡I²/³Z‘¬½“¹þmµG…ù$êˆtŸ`ŠJu·ÿçõÿ?ðj=Ç +endstream +endobj +510 0 obj << +/Type /Page +/Contents 511 0 R +/Resources 509 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 507 0 R +/Annots [ 508 0 R ] +>> endobj +508 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +512 0 obj << +/D [510 0 R /XYZ 90 757.935 null] +>> endobj +513 0 obj << +/D [510 0 R /XYZ 90 733.028 null] +>> endobj +514 0 obj << +/D [510 0 R /XYZ 292.568 631.571 null] +>> endobj +515 0 obj << +/D [510 0 R /XYZ 90 615.161 null] +>> endobj +516 0 obj << +/D [510 0 R /XYZ 90 588.909 null] +>> endobj +517 0 obj << +/D [510 0 R /XYZ 90 569.556 null] +>> endobj +509 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +521 0 obj << +/Length 2510 +/Filter /FlateDecode +>> +stream +xÚÕZKsã6¾ûWè¶R• ’“S6ó¨É&Ùlì9ͤ\Y¬P$—Q´¿~h€)YÖìLmU.âٍ~àënÈtö4£³w7¸¹{+‚YJRÁÅìa3Ké,ŒDœÍÖ³sFØbÉ(¥ó‡­Z,yDç?˼ÄÖۏæJv}³`É\µ‹eÀ¢DÌÅâ÷‡oÞ<Üüû†:c†n“8ˆfÙîæãït¶†ñg”i2ۛU»YÈø³û›ÝP{FêŸ5¢ÞYOH‰YÌBE„þÄydØ»} `ämJH(˜0‹e›åùcQÉõ'Qøczë„MÌàØÌm¹Å#š!I>¦¹îwõšËX˜³% H’ +»³± -læeÝwv´\c£ê»a°ªU#»¼*[2¶ BÄ X¥$ýVÁdÑÇe&þvwMŸuU£m…ójƒ_‰ŸVídÙåöÞ½öEóªT8²µ6Mµ»š,*,šì è¡ñ(’ÅRð@;bëUåR ®@Â(I#«N_”0˜W+åh‡†‘±JÌ}K„¥¡3d_ïe³âù Ⱥn!ˆùg¾3šFJN öŒ™è>ô}gˆx¾S²ÌË'¤ÚmeçZ +)fÎ Êröt=£3øæ†ãlÉiL¬ðö<õ²=ʐ`Ἣô7д;sõ , +;kXÃt]åe×â ±‰?ÙV}“)ôŽÄô‘nqxµàt®]RwêªmóUqÀ5»ªQ`Áˆ²ù}µS'<À¦Z:–#»dT›JÛñs¾V8 +ˆ`å®.Œ‰ÿÌ»ƒ] JØ©Îxt÷y·µ­mžmqŠ§éÔu‘gβ0I×¥5U1Yï1\ž;:œâ®nT–·H‘‚‰¹VKpSKNá‚T3t©gþaÛp·_-–!‹ç«®ì[t£ñî‰`ò¨†'y‡sy‹ûÀXg¥ÐÔ¤†>”ðù FçJÕvtk§'熑áܸ//';êª8”Õ.—.0ªð´ù ®ØkÖÚ`Ñ2“`x"ô9?Òr;ˆjý’§ €2ë›Æ(»ZLݒøÙô âî&èÈfm×&xx`lð‹  ôÓ }¶Ë[ü®@K´*G¸è`ƒ®,žªy‡Ý­ÔWî3žú¨…°®§V¬œèGDóiÔ á5A‚'x‰á«/"}h€AƒVðµæ% &‹:·ð;l¨Üâþqm‘—J6ç÷µ‡¶S–tÕx'¶ˆ#¶<5½*5¦q–ZJD; uQ†s:Á ½|©ßÙYp=Š‡ÆS®/øg­oU⪣Rô­=êa™¥\ÕxSa7õu]5Ý96°1ÎLöç*mJÐë3d +Ýw¯_ÙTbã¶J»Ò8!|˪›PÕwìÖ¥.Ñ0òY‹(‹|ýwt·LÕöjxlº-È Û÷å5nuÃÚKiÐ&³#Ÿ•êöJ•Q<m´“lÊw,·bĘG$¥Áøp_–n®×G.ÒÃ4""ä—RNFIDƒó„Û ”eD°ôEÒ¡OìêjQD L]â± ×É$i±bØKùUúÑ)9›¨ÇÒýJõœPöµs ‹±v&qà ’­bœr$RH»mµÖÓ#úˆÔÝáØù¹8EŸxäú¢O|‚>ÂGè8ô1ko„¹xrãÏ%ô1çö´þV﬚s#%,úª‹!(I<çä9Ë%‰¾¡ƒÝbÕ¤uŠžӁ1ÏXUiÒ¡£s9­ õ‰ž1é°n¬NíäZáHegÐpa0ÆR˜0.§©oL2®—4ªë»OKÓöÈÕnúÂÒ´ëF–”…ú$ÛnOܪsN4„äFq¡ ®ßék@絞F#ï%‹H$ÿÞ7jÈ£.;®Ã}°ÿ2ðÇ$æñe½#LI¾ÈAL8,­ó˜'— l;î/ãö•ðʟï +ç_2*ˆ l|§ßÛ +,,"1 =5J+¡/ë#ý¸ÐhªYèZp4å5¬ZF ¢Ñ3‡°õ±??œÄ!û—^)›Ü(M„½a dÙrg‡d;™Êª¦Q-”k]œ10 MSbp÷_y@Ò†>Qœ{ƒ‹1øÒ1FÁaŠ¼5ÊÑç‘+Œ3F ¢KØÓ·=–Edz ß ÆáX"HNÐ +Ç;ßK§˜;ƒ–©âbfª8èù.ïÜ*„”ƒÅ°–ƒ»œ¼Tvtk^ôŒ9Ö)ºá•‘Àƒ K÷- +]JÄbþK›¢²»=gìý67u¶áµ‚‚Ò”öÂ> endobj +518 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +522 0 obj << +/D [520 0 R /XYZ 90 757.935 null] +>> endobj +523 0 obj << +/D [520 0 R /XYZ 90 703.078 null] +>> endobj +524 0 obj << +/D [520 0 R /XYZ 90 599.569 null] +>> endobj +525 0 obj << +/D [520 0 R /XYZ 90 555.835 null] +>> endobj +519 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R /F72 471 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +533 0 obj << +/Length 3753 +/Filter /FlateDecode +>> +stream +xÚ½ksÛ6ò»…¾UžVé¤3}&éµi.v¯w×v:´DÛ¼R¤JRq|¿þv± R°l'í}ð— ìû˜/®|ñüä‹ó“'ßÄj‘±,–ñâür‘ñE ¦¥Xœo?/“§+Á9_þ¸»ÉÛÍéJj¾üüTêånמŠtÙ¼+·y_65¼Ê¢(^&§¿ž{òõùÉ'Vá a°ê„%J/ÖۓŸå‹ Ì»àLeéâÆ@m‘Tð[-ÎNþ~Â';ÔÞ…ŠY*£E"ãðÆlóìüÍË/Ï¿û×o/_ýæìë/ÏÏ~ášÃŸÀÝ<ùFs…ÔLãZæÛOb²ˆfB¸÷/Ï~ûêåÙ·?ê#8S …K÷M^oXÈ\ òê‡ó/_=?‚R+–Œðìt¥"±<¿.;àt̗ͮhó¾iñI,óªkh~×ˆl±’©`‰\¬„`™¶ŒêóßO_€,—9ýìšêöºØ´(C|¾*j‡Ÿ…¿z™wö+ –ù_í·EÝ»7´E¿ok ß_n¶"M9dâ“:vĞýøÅُß}Lˆ±b±„{=DºRqÂÒ$™²àŒ™L3‡º¿Î{Rûë¦Út4¼(ú›¢¨éÁˆqøˆŒÃ_Ö `Wlóº/׎ÙÝ«íTší ®@Ð1‘&·ÈCÒ8¨EÄT”²sܐÈâåëSn·¹}´a¿+/Ú¼½=5XËJòdy‰4â«þºé,ŽuÞ o®‹Ö΢¶ào+¼Ë×==¶E·¯z÷a]7v|á5Ûݾ/6_Ù_—µ[тt»b]þ¹,Œ±!m¾œCE«–ý-h W˪ܖ}4(1,Ñѫܲ ,Æ÷‹“È©Â9~ª’åÆ~ƒôQŽgÀnð{NO/éK² xlÁGb ØzgËoð±Bx3ª >=ÿªsˆJ;Ú9XY>ȘóÌò#öõXÉÄ.ƒ‘ÉøäD¢d¼4Ha.§Ÿ]ÓuåEuKO]ߖk‹«Ûƒê +ûdÈWÍß욲î»aÎðK‰‰'ˆY%ŽaoDð8ÏD¥’0‘éØ¿°¤…øž²8ˁFú×MÝõeoeïow”†á£’œÌ̅"Ò)_¾j@$øqÄÝठL½~ý 6Y FFÓq°k\ím¹±À›²-Öö%°u×´ö¡oè׊+ §yY4¨é¦¹©=E…/µ …EÁ™N†€ƒ²dû„xq͸H§¼õBÆjÐ 3Þ_€ìM¨’Fø8Iþ/žh=>K;tÇ&̥˟®ËÊÂnôm@.rx1™žG™ÃÈg×ëo†¹ ‹eTu|ºl›mÈg€«µlê½…”Îw ›ýc’²yuÕ´à¶}6¾À,<®\oJ·KxÞïL® 7×åúš&Xrk‘´v­uӒNx³°«}ß­™®³غ‘Õ­!YÆjEv¨íg8*ÊhôEaM (ÐI&é½.¾Üå-hú¾µ}²/ ™‘]6UEâ*ë+û!©HAËîÊþÒ,PUOÁ‚„ËàUeƒ }5GG3ÛBͦ›ç,»™8t|H&¢Ä—s…A³a¼Ô +öÑ@Úb,LmÊK¤ãâX½6ÌPÊ ?5тOîAMìlM³eß9Ì(~zéçK,$¦Ïw»ê–‘6§ŸéFhŽxAcCü>,Gó ÉEÁÈì~Éá÷5ýú ÛbÖ lŽs&$y;œh€´ ÷ÉÉ) =åh›\Ä1©`³¯¬±Þ– %®8ú šB’ìwÎͬ›=„$3I„â¤!Ôxë$&¶>÷(S¿åmÑú§—A;3k9ã’Úl¬ô¿4ߛ—©3é+>>컢µïš™Ä‰É‡]2¹üèTƒÜiÊiÂaÒD³ÎÒ:|çh³§\—œM0©jºÞ(æn nH%W¥¹Ý»—ð‚[ŸI èîƒI/Ÿg»Êf»_‚PÀó¼5åË;BôúóªÞ™íÚ½¿DõM´K™’Åj5Lßô ùIÛlöÆÖf=¬ëlƒÀ\єƒžE<¦êˆàÑ9bîâÖ­jV“d?-í¶Mka6EŸ—èZœF^è`BªWCJ>è.&¤€ér=D#¿6±B±õ ˜»“¥òTµ˜¥O¨¨o¯luÿæùÉâgðóoþý‚Ë‹_-Õð®Æ>òÝ7ûß³ôÑ_½ú) }4ÐuüëŸP¬e•©£bNTIIÈ;£A/™°šùPIÐÉ5Ô}]ýûS¡bÎã³uŽ”t—j5P´¾»Wu:MMÑ.y +BWVPÊu˜Ak͒X}p°(S³ ÚæžÂ_N@å>æž!LÚk{¬6%„£0¯ˆ²¬5UÍ@S·ËזT£ËðK + Sí™`À)zã$z0ÕûíT#žHØe&²SfôBQ96… §‚z ¶Áͬ`ýݸ'¬†@¾.ìA —,ÉfM—œEs5ďDPá-a` +$™p¢&1™½©›zUsu +±¶/q#Ö H¤»£¡ <ð éƆ&ƒÊ!eÊ">gD¼ö¤BÊ± ~«ìeC1àYÂg…Û)rH—5&R 2?·…’ ¤om1"€¤TÊ‹éTõ’x(yh)$Ë| +'˧øÓOâ~>¥É:°ÅY”FcYÄy`'Ütj,Œ`™ìä*ÀÑ À'Z4“j`ÊۀYG,•ÙDre¨qeœ/8Ò«HaÉ&,똆œrÅ"5tAWh+J “˜CŽl²PENSH„ ,5×MµßÖ¦#g^znêÝ »uÌÒ,›1c&™m—ghefÖ y0 È¢²ä(cúřÏÙè[HŒ†Ø»ð0Yµ ó7•I}¨•þ¾c&e2SÊô؎dž¨F±4¡pa%Ðo`xš±òÀdÀÿX&œô±‚§þbؐÑÑ)Q­\¤DurÎ0ñÄ1ĸDÏüÇ´{Ǹc'¸8ÐM§ÐÁ0,dòPê2’3Íg¡ŒªØ„:D`öcx£à…;‡,dY^•¡•UÊR•ùQéåuŽ9÷[S¥" +W¾wô¢øcŸÛW¦€ßÿmƒa‚GËÏ è¸‘§0Vs#Ÿ(]ʒTŽqâPY Ø=^ KÐþ=(j5¦¿¤†óAýP´P4SFu„·˜¾sG4 xýlžÊ‡ìF0ž¼%G†|˜Ó˜s#K&Ü smu¹ÛWT<àD¾^7í´ÅôŽabßQƒ†ÖœpΨ +g +N]’•® õÑ°ïʕrW•kיt𠅝ˆJ/…} +JÍ LÍ;ccF>¤é·nPö-‰ ä'óS6¯¡ÌïÜæ¨Òr‰˜±‰vËH0¬yïŽ:¨£€ÛEs‘ê™#$ÕÂãC-€\ÝRç=STÂa'>Kl׋”ÐÚV•ÞÑFÀ†9Kæ< šD䐠b€%‡êá&x !>Ð ÄrÄñè=Y2Ç̧î:@†Öè>þèûø“ãOÊt,fÉö,góö`i*»YëÀY0¢"+°ðnLGk ¦ t<¦×ö ³¯×dV¯=¨›@’7ý³€dñHÄEY¤ÕçRñÌ-NrdTuܲ4݀ý3°#€Š$@ &E6Š¿šdéX­> &­¢cdAâœÙ=5Á4mŸ SL‰dá݄­DÉÇ£zP¹•ŒpcE ‘×ö²ÉX;÷J"€Ã|Pù³¨ŸÒ,Ž¦ëz’®¢©d‚Q,-1šô —wäÀZü5™á`´/Ÿ±84øû²67Aš›î÷ò#l…¹Öß~ŠùJ$5wõBÜåê#•Y<Ë&,nÒL׊ͽŽÇ,&°XÙ= [š¯ö<†²©C‹ÓÈ_ìãÀRfô>d¥35œXà³p¹æõ`.ƒ8ŽîOOޓêÉJªï ¶¾ÿ–‹_ú}ˆ:XjÂa”¥—u|ˆ—J¦NêžéADÉÿQ2ØރèëÁ\Ý×¹{èȯ"¡…°y=6æÝ©Ï/M1a3˜·;H[Àåíª¼>hͿȫ˕i=w÷_›ò•¤&§93;ZÍÆ$ëòW2Èuâ{òر`ø€b6Sò I±©@œÁào/‚ÚÃÓGoþxÿ0ÍáS m,8îbæ`èñ¡cⳬqÒBçk i–Œg÷:pñ²±'¸N3äxó‘Ø|»½hª`¤lÌÕÙ)¦#OÂ%^ßc%SyGÊfåŬmíùÈgôHÒY“ý³Ð¶ÁNǨý€øpÜ=Ü@JM ð +øª¬ W­š{]m^Ö}È瀙èôÁµX¬Å×®U߅Ï5âùÁÇl‰8:P€•LRgtÓ[ KÇ#Û;)(‰4WøÛ;L™©$IzǞ+Í9]Ž@¿h.øîóú²qð Æ{Ú"ñÒþöÓ¢Ñ!1-@{·À—Ž«1Íå2‡éRM\æQsëIì +[ÃØM|ôaž1Ü¥žr¢—eE&ÖG™)&³Ù]“0ƒ%vm—ª¦s}£€†(ul©ÞÔ«áR¾®?P$JKߣBl•àúïd«Ê8‹eô¡|mvEý'qõÏå¨LýÈyœ£qÖòùy¼ÊòÙûê¹ç…|FÏÿ¯#NY&҇þ[‡ùwí§,€BgLëÈ»NW{† éæq¼ŽßW¦øòÇ®hÇ;Pxù¢Þ»f6„)-k»áj gx:èn›BFx6\l!Ê~_¸ÑßèßO¼V@šøÿèqÝ÷»§OžÜÜÜ°uÇöu¹kYÙ?Ùíª'¶Í¨xr= ¹t=ºDz5\ç9àÿÿ>#½F +endstream +endobj +532 0 obj << +/Type /Page +/Contents 533 0 R +/Resources 531 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 507 0 R +/Annots [ 526 0 R 527 0 R 528 0 R 529 0 R 530 0 R ] +>> endobj +526 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.353 436.025 378.495 446.371] +/Subtype /Link +/A << /S /GoTo /D (main_BRZH02b) >> +>> endobj +527 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [381.484 436.025 415.576 446.371] +/Subtype /Link +/A << /S /GoTo /D (main_Fuk98) >> +>> endobj +528 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [418.565 436.025 453.752 446.371] +/Subtype /Link +/A << /S /GoTo /D (main_NW88) >> +>> endobj +529 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [473.618 436.025 506.753 446.371] +/Subtype /Link +/A << /S /GoTo /D (main_Wil93) >> +>> endobj +530 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +534 0 obj << +/D [532 0 R /XYZ 90 757.935 null] +>> endobj +535 0 obj << +/D [532 0 R /XYZ 90 687.036 null] +>> endobj +14 0 obj << +/D [532 0 R /XYZ 90 682.428 null] +>> endobj +474 0 obj << +/D [532 0 R /XYZ 267.92 509.112 null] +>> endobj +18 0 obj << +/D [532 0 R /XYZ 90 492.385 null] +>> endobj +536 0 obj << +/D [532 0 R /XYZ 508.248 438.62 null] +>> endobj +537 0 obj << +/D [532 0 R /XYZ 90 422.451 null] +>> endobj +543 0 obj << +/D [532 0 R /XYZ 506.258 236.432 null] +>> endobj +544 0 obj << +/D [532 0 R /XYZ 90 219.371 null] +>> endobj +531 0 obj << +/Font << /F63 374 0 R /F65 376 0 R /F50 339 0 R /F72 471 0 R /F31 472 0 R /F10 473 0 R /F11 418 0 R /F6 538 0 R /F23 340 0 R /F8 504 0 R /F78 539 0 R /F7 505 0 R /F13 540 0 R /F75 541 0 R /F1 542 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +553 0 obj << +/Length 3696 +/Filter /FlateDecode +>> +stream +xÚÍ[K“㶾ϯÐ-Re…Å›àº6©µ+NÅI\{]9Ø>p$ΈŽDÊ$åÙù÷éƃ$(h4ë]—}˜´ðèn|ýÂÐÅý‚.þ~óù»›—_j±ÈI®¹^¼»[ät‘iFg‹wÛÅ÷KFäjÍ(¥ËoÊc»bfYveÝ}ÕÔÝjÍ]6wîó‹¦^IºüeÅè²|ïúÞ®8ìwå¶- KdL-ÍêÇw_ÝüíÝÍÏ7 ¶AÌ.«2’ µØn¾ÿ‘.¶ÐÿՂ‘›Åƒ¥:,$ð¹_|{óŸ:=‚¢³#pA¨Vî_7} Ks½ìwE­lY›ëÛ­ÔòñX¶Ç}Q—¸±—_ò)CU$Ë5¬e'Û9’ÌLH1™ …#`lB ‰ *|–˜AÉM xŸØ…&J{¨‰Æµdaüub ŒņnEÄ6XB SlŠÚ±ç¶t ۖ?PÊër뺋.pԏWu_¶]¹A½pCV-¦$ýjFãz7û¦&»[qµtó;Ò]±¿[wÇbSv f¬™¢D« ŒäJý‘$³æÆÀQ¸JÉ #⊠DPÔ۔:j’bÚÓhb×ÀmïÊïqpß +‹–åŠ0jžâ$<¦%«µy³ïPm”^Öî.+eïò lfˇ]Y'NS’s=cBD@X&f—&Sñ¥Ñ, 4±[Àž¿§ð°Å @dßp5RìÑ3XQ—”7ÅÌhñ_-C5ƒ•™šdRŒÒ`:[¾tNÉ<Ïù0_çØPVÀ‘ÖɯðÂ+N}³oîq’ÅZHArEtŸ ŠV¤$ÈÕL,‹=¢‡…âgÖù²oOKŠ¹o ®¡ @2¾êz°SnäSÝÙoûÎÎçé¬Òá2ÎlàÔ~€†ëNh‰K×xØ5ûҍƒI6lúÆÓXdsüSn‹<'rTŠo¼@(ˆØc$# Œ‘½ôlªr0„æ9°u¤‚•-§%“$£,æ´WX°Ú‡cÿèš]Ù'6¨àʀ>M, 6\šQa,Aä`¬µÄÝqBÁNïg\w#ÎW¥‹5—DÈÜM÷Î(ãã)"­pölØäÛÕZR†ÐÅ'挘Ѳ^’ˆº.&x${;`‹þ8A^šwói]‚=슶Ú?ºŽÁˆbÛ³­DV½w}Gϲ•TË&µ-¦ Qr¸±xOÛÙ°]_ýÅ3'×Q™š‚c–-ïì@Ñ욶÷—¾Vwžµ?OS‡SC 0T›XwýÕ;2èC®'BNž*øÌãɽǓ/K¼´ï-°ÜòXPïõ„;¹×“{¯'·@ÇsçÔTÖfÁïëÓáÖâĄyÞËðs?ê$ëك+Ï\¤Cj軎ÔðLä‚ÔÓ5¯ÎŸqbŒˆóòæ€ÌÍ\ +ƒ”ž²Ð4 È91\dqYþ ƒ«7ÁI@FŠìÃ|L°OpœÎ”â(=^’O Ô< ñê/R`ÇáFüj¨æ† +3‚êÿèà¶l«ú¿ñ`EÌ[±¼}t㞷"HH`ô¶?uî†A[îm®Ñ"’ ô| UąP…c,%ŸŒUgÆ{èÁLŒkÄòåm¨Þ3Å­Ÿ·—¶'*Úò…×n +—]ªX»ëŽfˆBn«ÂZYð–AmE¶ì íe×»oî˜"¤)DòÕýý0\îËÄ͝ûf¯ |Þ6ý.Åcˆá¤Ït ž´¬™ÑSË: K šŒÅUݖÏÑm9ºuT{À€G¢G^}V9Ï ØõµóOe_y .õ­ JqëM`Æàæ<ŒOø!’èÑ9ÕÕ/`ÓBbbB&‡œS¸³Mí¯¾¢ÄÐà¤yÎýcDɦ-û +¶é;ÊöнH]Põñ®¤CÇ QÇKޘì@ +l4ÅöktNNõ¶lg$Â'zAQs`º×5U>ë”âCN9p¶;Ý®/TJpž¯ é§Ä‘Ü·ùƒ ÉPÀ™ç‡„ÈA»ŒÍè„*–p^Í~C9D•˜Õ2À>*¦ àþ­Ø¯5¶ïšý¾A¼| õC9³|ðcú‚Êå©;Á]{t݈±ÕÝ£@½-:7ÖÔ®»óo›CQÕ)¤Ô°A¡?ž™îN6e&B4.m--nf°´€i2“Ëïjÿ΍u°á¨}Ü㇎\è}µ±iÎ ŽSu=è»÷—¡Ã%­ÔòPlK43†áÙ»ÒõN¸ƒ_Á|avÔ68õ/ÕÖ%«×ýεœ‚FWB 9Žnõ¦W~pN{„-†‰úƈ¦šL_–‡Ôà<›OaJ0-…ÖfÂÚ}sÄ7¢ ŽØ$z€á©˜xn¼éêpt68œúð=üunžÂõnö%ð¸u}]y,Z÷+b Aã1_nËþ¡D>‚î•.ÀP—Ã^DZÎ}±ºç »1øìÊÒßG,߶÷¾ŽûÍßoß[¢w+“:”›ÇúóAàÏzÓŽ°÷Ûj_õÑ=w±.{º,±ÒSíK7üd’ýñÔ[ïSÐxß³uikijìã]¸˜y6ՃCñ薝¨¿ÛÖ¡iË0ªÞùnðçNû¾CXââY{g¹€¨] +5>Û¾ »qåÛa{]ƒ^¢ã€7}€ØŒÅg±×¡¨«ã Ux·;5BF9Λ +æs^+qiø7£.ÜG{ÚûÙkeÐπ°ü…«AU¾ï±9µŽÊ‚À0äP[>GDãÖÜÈqZY8Ç,þ.žacv³QZîf£è¤ jGYõn¸Û5§ýÖõº0ÍÎ7:{å[÷å² É2ð¾ØoÚ­•`Ëï:wu`Μpé!ž¨ó$×ôd± i [ ÷@lbë2Qyÿ¥õQõ}ã£EŠhîÆ6½·Àøí¶¬m¹Í;`wms˜æ`£Ú²âøb³9µÅ/W­D +|Ø <+W†’c*zËã㉘M`gƒb„ûó:^@xf@ÊC>å͟Óu:j¦¼éNö¡=TÑ'£hð“1ÂO,ãXTœÕ±ðdsþÈ,õŠ##D²éR%üœˆ1Õt/ôEI‹•†Å|ÉÙU|¨Î3àRÙrjÔ}öÎÀ*&~9 „É÷!˜Ú˟¡ Syõ¹ÓûÄ©ѹŒôá§äÆsž'DÏZoÜø>s)dtª[£Äâä1´ ;W|˜6Su–|ÊbX¤ê¯REHð!‰¤ˆ®Úo%¦x=\g úø‡D4dS.‡ÒJγi*Ì~2g·‚±ó'Ήà#L7ø҅P™ýO+¯¾‰pÆHó( _]y¶î ŸCøeكîóä¼lbL=¼æ³sv]u»÷3 ž¢; +:k:DzšOžEu®Ã–À[×FWÐð¬Çϖtõ»I4V£&~Á=xCDªè¸ªDK‡²o«M¨kÑÙÆSn¿[û:¾[™K¥¤z]J6iÁTÎÀ7,>•{t,Á?³© +6¤*˜w}okKWØýç~X`8mé|ø¥ìpUÏ ¤õ¿püPZçßO´Ò¢u#'='­ê¤Ð¦3¼l?Od6^XOõà…ê=zû»»ž žãøÖ õÁ÷ùý•šŽ|ðýOä× ‰RcQ×J7<¾ñ‹“l”H1¯T‰L؜qT?ù܆&:<,«BÉ#—ᩲÑO»‘Œƒi`zúª‰ëå…'M\~Š€‹°ój¸ ~ò9SãŸÃg×ì!:_a½8Ð6î3 ÁT׸í&|ìúòz{”­å´œƒFú'€¾à ¿Ÿ|a¿¾àë¤$ Éå,àx‚`þ=Èç^{FBóP¸x¬®›~¬bª¼+ÝÊ'Ÿžƒûj=K󹎖M£>ç|€G#½¶-ï¥W¢ÁN­'d¯“zDØøjö.á–:“N—tæ²|±žý”t,”TèÍ9/=Qc–~Hëúû”'49õëÔ£ìè-Òíù^ðyIí%:ì%JÔxç.q6TÝh:þG»,ÑÑ»=?ž¾r¼ä~æNj÷óçp>Æ.ï/Ÿæp"N°¨ìxŸd„¬Ñ«î!:ÿ— ÅÌsÿc&ü§Ì¸i˜BcÒÃs‰·eۃñ6~ñ¯ê¶-Zxßueû§•°wßÿ]Ô§PDwˁ[;Ì(Á²;ú\:¿2Éîdÿ[„Ö?±6¤¦7Ù4„ÚõýñÕ˗dӑS][Rõ/ÇýËóZÑTm$É¢8ÌáuÓé$è<Œ>à”ÿÿÐk +endstream +endobj +552 0 obj << +/Type /Page +/Contents 553 0 R +/Resources 551 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 507 0 R +/Annots [ 549 0 R 550 0 R ] +>> endobj +549 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [287.096 424.911 457.668 435.815] +/Subtype /Link +/A << /S /GoTo /D (main_Topologies_and_Topological_compatibility) >> +>> endobj +550 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +554 0 obj << +/D [552 0 R /XYZ 90 757.935 null] +>> endobj +555 0 obj << +/D [552 0 R /XYZ 155.86 687.2 null] +>> endobj +556 0 obj << +/D [552 0 R /XYZ 90 670.613 null] +>> endobj +557 0 obj << +/D [552 0 R /XYZ 90 368.901 null] +>> endobj +558 0 obj << +/D [552 0 R /XYZ 90 363.656 null] +>> endobj +559 0 obj << +/D [552 0 R /XYZ 282.028 281.557 null] +>> endobj +22 0 obj << +/D [552 0 R /XYZ 90 264.97 null] +>> endobj +560 0 obj << +/D [552 0 R /XYZ 325.434 211.206 null] +>> endobj +561 0 obj << +/D [552 0 R /XYZ 90 194.619 null] +>> endobj +551 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F23 340 0 R /F78 539 0 R /F11 418 0 R /F8 504 0 R /F75 541 0 R /F31 472 0 R /F10 473 0 R /F72 471 0 R /F6 538 0 R /F1 542 0 R /F7 505 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +566 0 obj << +/Length 3940 +/Filter /FlateDecode +>> +stream +xÚÕ\[—7~Ÿ_á·Ø,t¿Àas²œ$»YÂa=ûyèñô0žöÄía˜¿%©/R»Úö“ /´iËR©TõÕUC'ï'tòóÉßߜ<úI‹‰#Ns=ys>qtb4#Š³É›³ÉÛ)#r6g”Òé«òj3cvZÖeµ-¶ËuUÏæ\Ñéú<>Ÿ­«™¤Ó3F§å§øîåŒÃ€ÕíEy¶)à•0LMÝì·7¿œüøæädÐ Ë*CŒP“ÅåÉÛßèä Þÿ2¡D8;¹ £.'’ x®&¯Oþ}BÓ-(:Ø„j·psQnʇ³¹Ðrz¾ÞÀɦÅjå©xôcÉO•%–[˜7üpGð”?†Øî{>›K©§çq˜MF1M¨i‡1d!Iœeí€'»H"y²ÎN ø x;à}±1[á!B‚&Œ©vÀÍ +¯6òJ>™ƒ9¹£FËI2¨Ù®H×bŒPëÚÅ^¡‹1§'‚h¦ã Ë8Èōˆ8†j7™Sâœ'H%'s3¹8è¥(M”h¡ѤRš*„Ï^äØdžŒ*ª³8Îd2Œ²²]îYNÂy ¿Õ×á·ú\~g €9”ÊÞ(kLJLì@µ­ëHkV5 e–i26à(¶dÐÀ9m° ™ ̨lF\%aÙϝSQK3w;©AN•íˆbSFÜ^4ªëËÓ²Åu3FéŒA `z§ -ÿ¸.VËí²¬FtSøí©9¨ÖÕ¼Þn–‹müÿ²Úù½?àØdSÖWåb»œqåmš–«Û™VSY‘Y7 +;ãAp[ãFxcޞ­/O—Uj×:êþq½ZÕca6. °*Îö¼Ü"RjËeÇý׈­‚ŒnJÁ° @Á0›% ’ccH‚èkðè¸úRHZ4™ Òg>agçR,AÏ.>·9ºž®· GÔë}þË²_EÙ!1¤ԕ æ6üïÌÒðK¡§geµÞ6ŸOowy FK÷َÔhåÁ)€O-wçá}w2r1ãv +Á…Gfl2J8å{B‡ÌTDÆÌïA~!/‘‡e¨‹Xœ¦ÌÇÙ ý37(ˆ5r§Ê kº5Šw”éN†i¯šßêƼÊq„À?å'Œ$ˆo„ü«íO ü оèÑÁ‡aqa¢¯/B• éõÐöàa8—§,Gaãá.\çS«à…p¹7ýúÏ:@z ´ØÖ­y†¹5L_ꖌ¤œ„8.«Æãm0H°ô<åÓ~TÅ|=²Á‰í7‚Ç ¬ãå[dœŸ!®#˜ˆ~÷OÑø!ÙúØqÉ$z’÷vÆ©ÞÎ8‰Ú­ÒtQUal¹¹UÆ$ã%Nȃ&ÇҎ‹Q#`·QáCÐxFu†»ªy5P³øÓ¨ÀC‰\×ãJštO \÷À¢‹¾–óÍq×Y„:†€0ýö¢À4MX"?£oJ"*ó벩¼þÄX3èoÈIPˆ0º“ h.ÅG—mÖÐç¡<õõú²DÒ¤Öæ@Ž@í‹Ñ¤sTµ0U¦¬…Kí]V°ƒK™Ûõ ›2žo]Ü&GÓ|ò ¾"µ¬·uüªJI¶>ÇTÍA,ÐëãaZ[á˜Ì%µ„*ÝÈh“R¼Z·ž Ã}äåxZ,~,|·Y¯Êøí²Šo¢pà TY`@¢,^-}â˜é‹6ð»^j3¤€%7ö^œÚÏÀ›9€¼tÄ8½!í!î1#±/×ûmåûlè¡8ìÓ«¾äS¯[ )¶WÈ SUKL¾-Äav@ÍШê]w€! Ó=*â+—{Yn‰uƒZSæÏ»§£>­º'ÁÄR:và®B°ÝÄÜՌMqa䡼yŸÂˆzhŒvRöýôÔîfünF7£ï ^¢H`{çm@²C‚c˜oþTO)§/5º͙ c´ ®¾M6ꟾôÄÍtámˆÿ*Uð\ŸÖå&š†³ø‡}¾ù“à]ôàè“B~‹-Ò .¾©¯ŠE‰Žísóí¥:ðí7½¾Z¯Öà#EñX­ëV·!zÒvºFrðÅØæ ­}fýÌ8À±k•ò/©è øÂü†1q°º…!eÒ¹°«òJƒä·äLË£¦ÊõâųœX“ñ–*v{-DÓk»—Õ¶íáxœ¾ŽÝ…iß`2âUô›ÓïsÀ­»´eä~ •Ió"BS¼f3ât¼\  ´]U¨î:–µ¹u%RŒ·¾_r]5ÕÇ7e5H؃‹{|qÂŠÄ`'û‚"ڊdÔ°ö†CÚI7¯S­"aÕX^Ö4áܱ¢ ¬¯¯Ïqoµ/+Œx¢=y;UÐ_*Õ±U;²u1ÒM*mžËv#­-êì¥©¶;L·ƒ¨¥Â´Z:vRJÝg€FOʺq5ïDn¬ T¤„à™ØØ{X¿Þ”Ýp„8C‰Tö³IÒ QôAAbYû&H "¾Žž ª ¢×Ï–$}¨I*IÚê.iË©K“¶y^‰¦nû坈é]«EùX£FcOŠRlx|b½ôxž·ÒÏB“"ýŠôáåÆPq‹×VUƒ6‹0éÙrã[}“kZÅüsY5½d·1Ža΍i‰¯¸³}‚è`"QŒÁT-FŠ +Ÿâ ÏɈï3ÒÆ쌁©Éý8ÞKú4eA‘¾‰l˜e=Væö™3P +e²Ô…Ï®À¡Pž»Ì1¿êiµJ0©Æ¨©*~±µµ)¿;FÜñ]Æ NÊòÿÇ6¦€CÄ}XâÚD#¸üf,±Ùqq•â^ình¼@:~}3%ðuNPiv!'IkL/™”"+eövl!5¹‡æð.l@¹!%QBmçÛò«µD7“üàî¢õDüÇÐìü>?axtðã˜ÖÁG›½%¡&©ŽÌÁò£é ”ûòÈÄ&vÚ:áX£MÃ׏åf;Þäã½ÛL’"7ÎöT!OákÍWË›6¼[Uµn>‡ä–ië8W›²ŽY ?YGiüÕX’âd&w2Ìi §eÑs´! ƒŸÞ6/}!)~¼*–›8"Žd`Þëí² +wü÷ðÈ%v´œBÔÆÝÄm.)÷’å§ß´¾Gî_qB©غÁý¢¤3«¥¼ˆdî•D­C“Á~¨P2Oø¹ÑÖ>¦ª›,ÊÌ6Æ—e³ÁQKºÐyœbRXç¬5Èþ² +ˏ·/ª£xQbÿÿN¶às-xe †ق¯ŠøØm8 s¥Bä”Þÿª"ÿŸFˆÂ4^ˆ …-ôÉ Öö¯,zƒcXòeY+èèU²¤T}Ôjü˜ÕÚÍGÔm؁ ®7eÇ£îÃXë‹0àø}?¥ÎƒÛ>Ù{sG„ÃÞMÍÙž';ÀؼˆÎЫ—íÝ4•ÍLî(Kº×Éý“¶{¤©q9Þ™t»#R 㘸Ój a ¸Á’¥«ýEaŒ3:¥5Þ_ÖrÌÇ·yõuò}IwÖ I1yœ›¯ÆÝ|€4©RêC#)}3žp¢… ØÍÙ2ÔnÎËͲz_Þ6~ám¼KÕ\íö÷΋ØÏ~Ñ"Z)ÙN‰£^ž¢Œ\\éÒGuqÙû’±³â¨{…íµùŸËªÜ}àî5úÃ)ì‹Ð{de“$¶|H'‰íp!%ç¸ ÉÓ_Á…´pÒÙeÚP™ô~½›ÒWØr`¸çëŸý­:?¬.£Õt‰ÁsÕgù’ð¾|ô L–ùq<ŠZé´\í¿˜¦%L–Føò³×îýž“¦:Üa³mj2º5Æà ìÚ蚢¨Þf>iTê#»ÏŒ‡jSŸˆ²-çÛë«U‰L¬à°úK®?#iÂmÒyR#E¯pÁ§;÷æþΫÙÜ´wyÕÁÀÿHzbïRû’‹nïÃßÅ0nî¶ÍÕ·õ¶¼Ä8 εÍú÷óÊnnãI5­ÈŒ+«ºÃ½+—͹`¡xè/÷8fG›dBŽÐ r´Ãb]ëî§éþ9–ZÜià\|c]Âv?M¯°¶œevHéqc-í_ªx¼Çå Úã«ÍrÙºi839½½<]7éÕïжŽ$Æ|pH¾‹Ŏìz°Ô¯ËêƒWصw9nêËïfJM[¸¾$Y&rø·l´ 9òOÙ´¦·º0…rD©Æšvû2`Çæ²Iy¾Lþ²N(ˆŸnŠMÓ¼ðŸºÜ¤4ÿZT×mÌ~t£6uwƒ•Ÿùk{Gý¥×²½¹wöaÒ~ú—ÿ«A*½1g ½Ü\l·W=º¹¹!‹š\WË« Yn]]­elìšœõ7ZºŒú庄¦ Ø;M;üÿÒ€ +endstream +endobj +565 0 obj << +/Type /Page +/Contents 566 0 R +/Resources 564 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 507 0 R +/Annots [ 563 0 R ] +>> endobj +563 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +567 0 obj << +/D [565 0 R /XYZ 90 757.935 null] +>> endobj +569 0 obj << +/D [565 0 R /XYZ 481.318 711.11 null] +>> endobj +570 0 obj << +/D [565 0 R /XYZ 90 694.383 null] +>> endobj +571 0 obj << +/D [565 0 R /XYZ 480.615 441.156 null] +>> endobj +572 0 obj << +/D [565 0 R /XYZ 90 424.095 null] +>> endobj +573 0 obj << +/D [565 0 R /XYZ 213.944 213.872 null] +>> endobj +574 0 obj << +/D [565 0 R /XYZ 90 197.145 null] +>> endobj +564 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F11 418 0 R /F23 340 0 R /F8 504 0 R /F10 473 0 R /F31 472 0 R /F9 568 0 R /F78 539 0 R /F7 505 0 R /F1 542 0 R /F72 471 0 R /F6 538 0 R /F75 541 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +578 0 obj << +/Length 4069 +/Filter /FlateDecode +>> +stream +xÚÍ[ݓã4ß¿"o—©ÛhõaÉ2ÔÕ7PsËP<Nâ™øÖ±ƒí0Ìýõ×ú²$GIf¥îɲ¬H­îV÷¯[¼x\àÅç¯þqÿêÍg‚- +T*÷‹/rA§dq¿]ü°$(»YŒñòmuèoˆ\VCՎåXwíp³¢/»ó¼íڛ /¹!xYýjúîn( hžwÕ¶/¡‹Q—ßütÿå«Þ¿úù:ð‚èuyŽrÆ›ý«~‹-ô¹Àˆrñ¤Gíeðlß¾ú÷+îãÙ(CXp³‡ïwU«V|ó ·J*ŠæЃînVYÁ–Ô d$HÏ¥x{g†¼€ r&Õ•l±v™g—Œ(“˜Œ©…ŒÒei›¦ª­i,׺ö5t°b9ª]èOõh‡—¶c]™g"Òâq“¬ŸÍóGŒi[zYÕh×U¢SϦn«Án+ÚyÁ$¾JlI ÏE)h@_>''ãHHâƾMÌE0’Ù4[Ùn՘Å*ÃÀ7’w *¸ê¡«Û1¹ P$2/Öä2D +7xpª0$ÇüÒ$ «Yá Ø8Η_€!6–!é­ÒG§ÓQPïéûî†Êå±iÎèňb:;¾rvzI$ï{ðWóØtm½IÑ()>‰oO'ˑÈè%ohR‚EÀéœÎŸqÄü‘ùC‰½Kë­¡?>1óÌçôDŠ©,2"˜ÅŠu¿;¯S­[ó´fZÎÌ@³º¡Ü*mÿl¿‚[9ö•yÑvsr܉ƒ#Ê°¸rr¨7-Ž†òeógxvͲJoYµ  `™(Pµ" ÔzÏÏÔ.µµ ¼…z{N¬È(Êhøy&pÒÏhҹяܼ@XW½<)O¦‰|TVÎZ8x -\D²(c×ü@ö~€\v+Ðzý"–·§‹eQB®zâ=×› ª/Š‹^)4³æ˜uų±üÒќ›á„ü£Ok>ÆÞ÷=8Õ³âíÚæٴꇄ$8 =ç³ü*‰ù%g§p ]~Ò ]‚ž@k É"`•’ œY9­º?ꀢŒïXjkDÀÏ7é5@z¬ëM5˜Oi‹æN‹zëóI0e3îºãã.¥ê¨æ/žIhE×ÚRÜvíªÚÆgÓmKfPÀŽ4CÂ=·iaQ ™P ñ(Ë2 YÁªÑœ]¡ÛK ,0&€£@n‘üÚ +HʾֺÈy°)Áõ¡‚¾z4O+Kž²„n ®u;-3 ŠŒ]óÞñŽ»Ò.YöU‚‘&þl´Ý˜š‘£ÌëöŒóŒfC€ Õí0–êôŽ…ÕJXW6«áPj¸ãÜþâsÆ ”yWnaI¸‚ g.ˆå;M¹ò \8gê„qˆ!mL½ézÓ]»­ÛGC„ÍÜ Ðxô±©&Ñ c_*¿š0ïNŸ$‘r€á•Pž¶<^X8iW8.⃤éƒtG‘§þðl7æ6º>øÁY×Gò ÎB~Ñ÷1¿_åû$¿àû2^ünßG¯ø>s¡Ý_t‡ãf§ì¯0ʟ@‚°r +©3wm Î¥–¯£àÓi8 .ºX…Ã8NASǏÌ 5I{f„çÂ̡΅°Àõ”nÀ + lJ6ÙDwŠ¯'„¿NyUpaüBüLÊ8ù@\Ä¿—‹äÿ‘‹wI.ryU‹q‘üQ\”/ÐEþ.Šr‘Ä\ÔÉ4›¥š{tö`âçm’ŸAX›„z†¡W ^˜‚ÊòbùÅhRQ:³¦§TÐO÷<©,K׏Ö&‹ÕÞG}2ÎÙXªÊ\EžA ‹o¹NñM±h2æ\^ÉôÆb<3C`Q¿|8^¶.ðëØWûjFlÊä1¯I/HõéQÒœJ€[¦Š)qŽ¸M]·õ¾þ¯ñéLú骄¡¬¬çûDý6°À`:Îǐå>T¸Mf£™Ç”Æ3疍ùò›onMÃg¢«*ØeapŸI¢«¤kv-¸–/® y’C׌0Hh0•+p’H=BWL:³Ÿ$sºRÆPîm¢ö`ÒÖN~è»CeY6×C5švRÇ$˜ –¯Êâ"¾·y–êw«º¿Õ‰ÎßOÏJAŠ8ñò-ð¬)ûÆE KM?!Ì+.d8ççIðC²0ÇÁDvçqD³âOÈqHŸH2¦°öjLqíÀ!©êÖ)é£<{a6Š_ºsb§ƒAúÀӁÊõ)ΠCȗ˜“álvQ£k®¬žŠŸÕÛ¶S9ÕR¦¹µÛõ0šþÒô +¥z/Ä ùä’Õ'Â"v©ÔI±áT>\ªŒ~0/Ãì‚â 6¿›­ +±×é¢1Z@yÁ£U' >a£¿uÊ»ô”ÿv*oÏL)ÈnŸÎè^ì£Ãì‡8πT¬å‚Î4c–\ .&ÏÞ'åòJº£ðÁœý”ڃΟ ÿ8£¿Aw"ÂN5"|šRՈ ׯrS1‚¤ó›šˆ^sUóa~›N´gäÅ«L¹\X‹$b[“nY-ÎSÎzVÁ¨s”G‰äsɱœÌnºç³§r1 3¢%Ë>Õ·I~Kړ@@n`0/ +„…ŸvÇucQù§Õ°é냂¿/@¿övG§³µ£UËŽ–¢,»Vû0ÅTS`[MÏ­&p­k)°­¥€çq°q“)ÛÀ4‚bêý¼Äþ·é0ÓPÐJ]‰›iCOxi |Ëù%{§<¡œ-â¦]wãÎ@?Ô*DÞ\çõd¶ÜW¥®ÿ‘™©ÿ‘ÌŎ3ø r4á­?üjˆ_wʺ7)_û駾×;…fªX‚-¥ýÑmëí£–Ïò ñ…e(²ÏS!`æਨÈÂHå}’] ô…ϳ^dؾw] +‡uMÅâ _šÇ¦kšj㎈Y€A‘Yl"µL3¹|ªšfõbʗOººE_aLßâGÜå³ýJÑõÕXoÊƌé«áØèà¾;3³ÉƒgRg"^›oµ¿ÉnÍ×®­Ì·wµ¾™Q]¦gJ@ëxúµ›­êí/쭃²+Q0Õê;;n9 ó½«>ØÌÞf Ìàwº”ÇÚjÕÁ´Ìݒt7б?4Õ>žÐ,&—{woz–nûg(¤õ«ˆAV‘·}ù‘Aðö:Â÷\W›ò8T6Rítº¨V{m²cËéHÏMЎU?˜Cd»ÌU¡ þV»cÓ¸Ÿ—½÷Ð[Qm+w=ÕãÎþÜ iËñØë“b§Lˆ¼zPçBUômêʸrÂKÎöÉ Â×Ées„tãÁŒ2j §Z§æµ3”f°²ÊêUÛê ߑÁJuS™ëjZ +˜h´7ÇýÚ/W©=YæsG´jY¢M¡‹ýjŽçIðçé·Ü¢Žû›‚‚T»¦{¬+W­ÒÚd\øŒÔJ|àÀºnêñùÀd°ùÖv ?7…—JèëÀÚL±“‡É¨§2W2 ¿Z˦@u`ðÕ¬ÑM°ê0õ¥ŽœÊv:jêǶë+—®üOŽ®××\0CŒÅb´wÈ.Ïéê”êÑ2=º$p´Êù•ú—ü=ê_؟b"¬œÄåðžYėRé¤ý¼¨ÊÖ¾…Ê;ÙTy3.@@cVÀ!Á ˆ—[‡Fs±v¸zUg†²Søu¾Øí,B#*&Å<-™€rayí e^YÌ57°bm9_sçÜòÊØox’²¹ðIYÍÎÒöî´jäÜä’á ¿©7ö#ŸŸeS¯lþhÎç%:c=›¨²@[c S¢òâ‹ÊU;°3¶0¥=Wàb§ö%ÀÅÞ¼œ@]åâŠh :3]£iՃ«–O©KøC+l“|ù5X£ÀŠN‡E€€þ µõ…w•ÏTO{åõN<¬aƒêªì¡}ðÿMP¯æ‚K*íhS[µ‡UéËýT^—{c/a”wÊI¢=µÑK[*îKU‚zqÅárМ ƛzݗÚvÀK€"ìoF³M[mÝ4€góáGJÙèýœéTøt€/™y}p•v­à?‰’)öõ8ʙ(õß !NÑDéÿÛt^„§^ÙÀïo$^Z[:ìLš²‘k¥ÑÞ)Qõ¸Õî­ ^»›Ìê¡ê{5ºäˆy6öþø2éàp©îÁ»¿÷à`{æ™U”S ƒ˜ó«V`D‹AüZmmžj8å±754÷Ÿì֞͛„pD«Ò¤.I´!=býŸj3š¶ÆÄü³äW­f[;H×Ñ«–‰tT’‰nŒæGž‚z_…«ƒԘ ‹e 9‡…]ù¶…HJœÃ¡ÚŒ‚x8 CE+“  þÅÔÎïwGKvéïÚ, ÄTÓ ë¿50õ©ÖºÝ耡ŠIEfË$…+“žÍ¥_ñ +½ù7údŠ ä–nÝ/  EŒÛ¨ù¦Y–`e·öa[À…‡®i|Œ~ªÆyŽ˜¿Ù ÔøE`šˆôwKýXª+â§?w©«õ ,‰»Á‹Åãa?¬8Æ¡5×°?=Ãœ9¢\"²~˜¡*_æà>)vxæ̜eÈ®¡ÜÇk>ŠMU?f—wb͘<½ï7·d›ê0šöÞ^zm"ÀaéZÖӉ¤Û®tkå±nÁ‡3Kå!~•A­¨œ²,`ÚÄ,qxY6V¹s­Û™Xl¸ˆ9æíüÿ„B¢‚È—þÐýÐg×a +^ îê‚ïôߔú½Õ²»X龚μ|7Tý_T¼jÌ×e{t~D!f‹l†ÚY°èQ…yN€sômUÙMš½[¸Ö¿Ô_7yxå&á,úr˜Ý8>zóæéé mtlëCêñÍáм‰Ø6Û5Q7]tV⠎‰ê”ÕÍùÿ?òxè +endstream +endobj +577 0 obj << +/Type /Page +/Contents 578 0 R +/Resources 576 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 585 0 R +/Annots [ 575 0 R ] +>> endobj +575 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +579 0 obj << +/D [577 0 R /XYZ 90 757.935 null] +>> endobj +580 0 obj << +/D [577 0 R /XYZ 252.896 596.486 null] +>> endobj +581 0 obj << +/D [577 0 R /XYZ 90 580.354 null] +>> endobj +582 0 obj << +/D [577 0 R /XYZ 175.241 487.047 null] +>> endobj +583 0 obj << +/D [577 0 R /XYZ 90 471.718 null] +>> endobj +562 0 obj << +/D [577 0 R /XYZ 198.751 329.788 null] +>> endobj +584 0 obj << +/D [577 0 R /XYZ 90 313.656 null] +>> endobj +576 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F23 340 0 R /F31 472 0 R /F10 473 0 R /F11 418 0 R /F8 504 0 R /F72 471 0 R /F7 505 0 R /F1 542 0 R /F13 540 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +589 0 obj << +/Length 3273 +/Filter /FlateDecode +>> +stream +xÚÕZY“ã¶~Ÿ_¡·H•7Áu%U>’”ídkmË©òú#Q#z$R&©üú4.  iÖGªò"ñ¾ûëðìa†gÿ¸ùìîæöï’Ír”K*gw›YŽg™$HP2»[Ï~œÄK‚1ž[ÚQó²+ë¾è«¦îK*ð¼ÙØÿϛzÁñüý‚àyùÁ>{» 0`÷¼-×m%bNÈ⧻¯nþvwóË :ðŒ˜uE†2&f«ý͏?áÙž5ÈåjödFígœ2øß;»ùæ;pȋÀ/Kęše”!,…eè¥Â,ᅴý¸À^×·Õª©šWuù˱ØUý³¾Ïç+àµo‹ªî;; ¨×îÍ®éŽmiŸš`„}˜ÏûæÐ욇jUìvÏËU³?€ìîwªßÚq…ŸÃ + diIٸװ"P=SˆË|¶$åÂqÔÔ»g+íÊi¢êÝ¿ÓЛ7Ÿ#óõ’r”ã þ9·ßÿ°-X*´æļlõ‚é:Mç+­5<ﷆb9ßU÷mÑ>»Am£¿y_­ËÎ>ٗý¶Ywvl¿ ómћ)H¸hûª~°7m³·W…_0ä\Z³_?T#‰n„íóBŠ¹#ó^ÛÛ±ÚYaáXP–ÇªiÛ²;4õڒ¢Õá~[è™Þï‡o¸jݳ`}#߉/ÁòŒ"’‹Á•rÎôÝ¡X¹ ¿¨öeݍîdm+|áÝ˚NeìÒ¬Y;6Úe<·«ÝÁfPFC—Pˆa c͘ÎQ¡è|=,v:³Ì£s½À…¦K1m\öA B3âŠ@,#~Ž·‹%ñR;‘` %ˆ/wÍ‚gåø²&a¥]q/ÙÑ +Q–Í‚Aï°ÀZëH›JNŒ]Õñ ™ù öIE?š‡ÏSL†¨âW¹H‡¼˜ b)6Î ò·–yªBR´d[Ï"É$‚xë(OñF0’|àíM‚fÁ ͅ‘Ì’©/&ÎLjt^½ê›Ö±v™X›c¬ðS›kfü!I®JuŒB‹¥ Ä8¡Èy†&f«¹õü9 Š16(ë²-€‰ÎŽ0Žl>1!ÃÄ_¢ʈrjND÷?ó“l:œ1à}]¾Ã˜Ö¥ ]µ¯vE»C‘‰}’Ôùïë]Ùé%±éAÿ›{jé{ªºÒ>†8ݗkí%’Ï!kÙ§–¸ðn^¸qr”:0¬oÁ´2õm(³jmÿ!~€ÖŸíÍȤ¦ç ?°Þí]Ÿ +çÍ}égåµiv»F犧!xk×75ޓˆŠX) &;h|H×çbnžCÀÂi{¿ŽÁŒäM¹Œ{ƒ¤¤3AëX:%hWÆH§`@ f“ËkÆá&‚늽¿³Ó°ô'1ÁZ z…#çõ8°’D̑<Ĕ­Ó +F0¤²Áï‹D€“×†Ÿ$fààó™ð!ErPe•XÐ)2Z™Ío9¥u$¢`j"é“ÁX§sÒ ñ1SøIO‰#€#ÆLí²;0ä’@hSø¿œá"Ÿ*ZJ j û¶z½<ÉR“ý×3dgƒP’iRw w¢9c<ûͺW—t)‹3z%í ¬>*óììf`d*Ê<:yPnb±ö“´«ë7¶T`8·2€ˆ"`Åk86åÚ ‘.. ֞X|t—ãÐéü‚éƒÞ÷)•@Ø$"°Cž"´Bä%*Eg&! à²(©>"’Q¤ù„¡IH-¿di²Kv–º’¿ÙÌ@.De‘ÙdÏÎåxãjQÁíƒÈ–à>²%¸÷¶ʌqecôNےÕdl æô%ï’e 'L& é²Q…²«Ÿ50þ‡˜vPI^f_Fæ}Ÿ»¾ÜÛke6EXY\Êd$€X®<€1•{NßÙ ï̯ë;sŠp@Öden_éFXÀ⊘|Çòáþ„|­ÔzŠN¼`^Œsá #{›!•÷çñµ +ƒ< ¥W¶ec­¾ÖQóT5 âëˆF,*Y EÈK”œ½\ÇæaýC¡BÅB½¦K*á‚i¬uß&ѲV €²™ cړ|؄ëf㐂ägH¬{ùv»"ц“àÁx— +å9ø‰Úg`›9÷sÞýïÄlÊ"]êDI’¡Æ(hl,ÑRڂ² ‚ð qR‡á´òE¼^\<3µB¯øhšC ¾zc~_ .Š{[ùù­ åv¹*·ƒ\婇|öӓ4öƒpÅÌíW±ÆiŸØâOœl‚oN$£·OÕhŽ)ƒzâc;IEF¿ÑöóÈöSûrÜ®ø]Ú[Nќê^ø¤íó™Q‹i¸C@úœ†Vœ‘oæõÌ"°OÂ.ãÖqôÀÚþ[M™Ë¨#÷¦CŸ`{«ÅYÆÇD˜î©4LJ­¿.íï(euÑÛb—ܾµ}š]õ»û˜ÚsœîÎNLTûûĎu3J‰jŽ;×QÐÀíyÚÅfœÈ'jÔǁÅÝ{ù$N±T©ÆúìA€©0¾ba©5´ ¢¨«9iÄ@e–AÖS¦Ù&}‡ä dŠ×“Ïâ@£©æ¾°[ô ÁXNŒ]nB«ñ1¶=&;óŠ\õŠðEwºe„Ö樀¦´¶ôY8.Ÿ”ɏÐØÑ4‚ {!á— YÜ0ûí†N,5å÷Næàݛcg²;ܹ)ïVúÑprC+`9Ÿœ8¹¤"Îå]Þ%öŒšMÔ!.eÉ5¸ƒiOÛjeNá¹®¹>Zf»E§?ÆCiÁû²ÖGÝ©¶ø$‹~}î$ … +ƒöø«»WÁI9œda˜Î¿¬-}ænuÜ­˞aw–Ï6taTt*à$,i¢çäD•—Ò—úÒ×£äéxR¢ž'‡a”m¤o’E “§äÄgà†LSLîSÌéÚ6u¶ÆOvÀc³–àtÂÁt}d×ÏbÑNžÜjœræúÛ:UW+7ڝÿìŠW) ¤`òÎʾx¶ÄÝ{žIÄø™¨²¬êéFÐäLÍDw&ñŽº‹ÀZNÁLÅ‚ÖŒÅÃÍ.®nŽÈ+†›]1\}r&†êC²À– +åD½ôüµ?o=F,˜B䀧­‘·ZÜE»w*xkäŸáù¶ï»²ýÓB·÷ÿ*êc±· ½‰`Lê‹?Ì1‰ïÊÒ1i9{œù«¯5(a—Qe®cÜöýáõííÓÓZuèXW‡Uý-Ô·§%˜ª¡Ñ¢‡æÛ¾ñ›”U ÷RžÈÿ¿Í»¶ +endstream +endobj +588 0 obj << +/Type /Page +/Contents 589 0 R +/Resources 587 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 585 0 R +/Annots [ 586 0 R ] +>> endobj +586 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +590 0 obj << +/D [588 0 R /XYZ 90 757.935 null] +>> endobj +591 0 obj << +/D [588 0 R /XYZ 316.33 673.561 null] +>> endobj +592 0 obj << +/D [588 0 R /XYZ 90 656.833 null] +>> endobj +593 0 obj << +/D [588 0 R /XYZ 155.574 392.786 null] +>> endobj +594 0 obj << +/D [588 0 R /XYZ 90 376.059 null] +>> endobj +595 0 obj << +/D [588 0 R /XYZ 90 95.44 null] +>> endobj +587 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F23 340 0 R /F31 472 0 R /F10 473 0 R /F11 418 0 R /F78 539 0 R /F8 504 0 R /F7 505 0 R /F1 542 0 R /F75 541 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +599 0 obj << +/Length 3384 +/Filter /FlateDecode +>> +stream +xÚÍ[[wã¶~÷¯Ð[åӈ‹;ÈÝӇ4mÚ¤mº›¸yIröPe³•H…¤âÕ¿ï .$AA²¼ëääÅ!Ìõ›Lf÷32ûÛ͟ïn^}©ø,K2ÅÔìn3ËÈL+šHFgwëÙshÞ.(!dþï}Ñä]YWíí‚I2¯+ûü‚̹¥d^|°}oo ØŠu“›®TÌ)»ýéî뛿ÞÝü|Cay2£f9©Íålµ»ùá'2[Cÿ×3’ð,=šQ»™`žÛÙw7ïnÈEÒOˆ’žt‘Pâ¨ÿ֐žocôU¯¾”d4™-˜H¸ÈìLŸÃV9¥óo¾ùd¾wßÖµý«|»-ÖvBÍFR˜Nd &66·TÎ=E§Ësivá—·Hçq«. ÛÑû¦h‹ªƒ¥íGûÌÝ ³®É˪³Ýí±íŠýíñ¡h +7z»µî¡è?\ y³•Y"¥†M2éì&Ž:ȑ©¿àÎ +ÛÓô<Ç·U]ÜÒùæ–Éù„°U ·ÉíB(>ÿªós¸É–EQÙVûPã'æ•m¹›»V(ЄBœP&dËMóùÚ6êj{t¸Ÿ€Ñ¸iîÖ°•َπí懣}ZŸßZLÝØWÏul;®›Á[§“†ëÁwÎÐBƚ•eƞpÕÓ¯ń¥ÿÎ̯ô|[.›¼9Ú»{¦Òy{Øï릵¶c´ + ôÜÍAd\Q? +Zü¨)W8Üöuµý(œ¢:얅Ù¼äûý¶,ÜKUwSrü¸î"‡²û1Ä|f…ºDpŽ 9ÚÖ¶Õù§¡5´Ûb + Ù}™Îï¡Ë¨³ý&wóíò£m,Ý,Mñó¡lŒÔ3'õ`‘ý ¾ÌZ_¹y¯±íaõà–mcŠÖ+©`mÿºÀžª¬îíûDÏihS§Xý·•›̵j7u³³n<±ž|¨]9ÏÇÁm¦úåÜÿ“îõ«Ê[@é&o ¯Lh,ŽüeSâÆùÑs¡]5¥7Æú yÆ;`c„#/^䓷Ä}S£ýšt/o:JÎîûâ,¡Y€dBû¾7ÑÛ2è*:;ÿûa»}š™_â¬Ï1>ގöeŸ—®»Þاc1ÇÌÏxºt"3á£Ñ[Ýf*É4Oq´X: ÎùjQ:š žÆ¼‰¬c˜¾¼b‘ItÂÀGœâcj2X)¬DI°IÃMUæ˱ÉhÐg–¡¨1%Je}\G•@¡{µ8^™¢g=ˆ-"’¤Ïá,ƒÃǛ@Ռ¬¤’4ýé„[J°à”cΩYÓ£è{FšF[t¶QŽ-é”Jt±‰2ô©ÏàL0›J ֍©ý‘r&‘Ø”ÔA]Å=å€à¯0á·,Ø|YB\½¿ÇøjÞ­¹Šéà{Y­¶ëµ`Xéz—íbbÌ4Økú1ö«Ç.S/À…ýb˲BP|ê÷¸Æ:NïtwEÑEØÃX"i!z:vd ã4tµg—°š‰Þþ·.c¾fC1fœ¯2‡ôç°»hc(¼â 4>‘é“0rАi, –3¶§žVIñ|ÜKgæ çÕiVÃ\Vsmêò—r³)LŽ]T«â9IL*G† +oØÐm žÖ•¦â‰$ 7á¿Yó]ÿ¢iLvJ1’ØŠlJLN ˆg]nPP¸>§”êqx¹„¨„䢺j~@ZMñ•U¦(æaé''W“ØJ_*¸^@Ë0*P2,ù0˜·O7Â(¦üä}?üùFOï(a\——C9j˜®è}¸r”¦*B2òú”\€;ò2[u]fûlŸ:΅Ñ#VcMÍKûbïíM `3óÁÖýÞ=ԇûòˀ¦§ª2Qà7õg! ÿD‡&/94E‚D#^–ÑúE0WšÐ0«1U>dh ú[ß#~²¥æl€†z D È1†õ^&P`í ÄÚˆ5¸C0|:94‰YV…ÃӋ᠃¸s b‹äæ§p æp¶pKç!àc†j§òS4EÞÖ‚EÊñ­µªwûCg ؎/š¦;ŽTâ=Äî8D;-»~v¦”jK¼¥GóEµ©ïúÁ£xùÐ!Äï‡7E{Øv—*´bÀ2|À2«¼+ª¼ë=Ù3ëØßß*–±áGËLÁÌ<ñbw;úÙU·ð÷‚Ïî°ßn FÁ²kýDx䆑 Ũ¤=IJÐÖ;ð·;û1ÚbsغIkûôG®×ˆ¿”}hÿxc;?DdÄ ¯à<&jÊÏÉÀ2‰¡Æzi_—#⎧SeÆ ã, LÄL:`ŒÒÏç@zÆÐOfáæü@€ípwA!b)xYàÐhԙÃ<:¸ƒÓkS½MòRV>ÉÅ9—°¤.~ßTøà)až4Þ­ÃÖCA☥OZ›x kÓ¿­±‰§UM_VµÐ6Îëšü]3¡åm„SË¼÷”½‰R6$M×íÓÉ4•¿Cÿ0œaÿŽ¥ö.b¢YÂHâêCÄÉIŒ{-ì ù]jb4ƒ/Ü]AÉ`«IˆLv¨\ÁžmQØ Ãwólí3wÏM½ÝÚ{oík‹ã±rÓ´nx±[š„UÉËP‰I2æîSlÂÓñ„ÚQb6O]Ù[lHü>7ÙÙh?kH6 Ÿð„fٖ½.œ'~wZã¬d¯°$S”þ¼¨{ð@4_¯ƒzí¡ìòåöè³Æ*ßëE¾ÏW³»oÚþê$ÕîVž^ΊÈ#còéУ… އ™hU/8ðÓ'™¬p™ìçëuŸÂ~S<ú¼“’ÇÚõd'߃®’^ÔÐñõ“YïMœF÷ +ñet™ +Qp9}uŸ:ÁëƔ*ðV #?Èm—½5Q ÆE¢È ºÑ´‰¤*Ìô´Wal®GL14:òlÖêŽiùèöcüÊ €°3êd…2Õñ¼$¨^¿lÙ^S¶o +à)îRóáޟe-ô˜šfÎܱ'·ÊV/ì¯v÷Ð{ÙÇpš¤rœtJ"Ïm;¿q:Ó +68)Ô.D sÄ +Û5gí¦µÊMU­5|õ5äÖzm¯yãa-O(™ùÖc;q[EOäÜêø>b÷P·Epø´ÄþPÞ?ôû²Zã9åùÛ¿x¹Û[žó,r¬N Ÿ¡¤ {|oÈz?ìæ=8Õ÷6øDÎdRðõ¼wnfXc?¤ïi?¬ó„]T2œáàóLK‡Ë0N¯)¦4zGì·B UɃëí>Ô1êøÅP§³D§|¢wi`­šë§"Ýpä¯jnbÚÔ5EwhŒª)îTC±'j(¸ÖP2{稖½˜ÆGG0¹¹ «ÙÛëÐáˆáý n6PÆHdã¥I3’0b–þ¿>¦ÿ<¢R#·+ÿwÄüψû +˜ÂügCpGÞT~ñä²Ù9 ð6¼0òÏqíú?mÑüáVʹ³õåÕÁ—©÷Ÿ`þ"ayÝ¥—ïŠÂmÒîì3ßúǍ1ÑQ½'Õ¦ã˜óÐuûׯ^=>>&«69Tå¾IÊîÕ~¿}°m²kŠLúI6Þ íꦿ}Ó_O¦üÿ?«‡ã@ +endstream +endobj +598 0 obj << +/Type /Page +/Contents 599 0 R +/Resources 597 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 585 0 R +/Annots [ 596 0 R ] +>> endobj +596 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +600 0 obj << +/D [598 0 R /XYZ 90 757.935 null] +>> endobj +601 0 obj << +/D [598 0 R /XYZ 90 733.028 null] +>> endobj +602 0 obj << +/D [598 0 R /XYZ 317.494 633.271 null] +>> endobj +26 0 obj << +/D [598 0 R /XYZ 90 616.544 null] +>> endobj +603 0 obj << +/D [598 0 R /XYZ 474.355 574.735 null] +>> endobj +604 0 obj << +/D [598 0 R /XYZ 90 558.008 null] +>> endobj +605 0 obj << +/D [598 0 R /XYZ 285.407 452.746 null] +>> endobj +606 0 obj << +/D [598 0 R /XYZ 90 436.019 null] +>> endobj +607 0 obj << +/D [598 0 R /XYZ 409.479 342.712 null] +>> endobj +608 0 obj << +/D [598 0 R /XYZ 90 325.985 null] +>> endobj +609 0 obj << +/D [598 0 R /XYZ 392.938 201.29 null] +>> endobj +610 0 obj << +/D [598 0 R /XYZ 90 184.563 null] +>> endobj +597 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F23 340 0 R /F7 505 0 R /F11 418 0 R /F31 472 0 R /F10 473 0 R /F8 504 0 R /F1 542 0 R /F13 540 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +615 0 obj << +/Length 3873 +/Filter /FlateDecode +>> +stream +xÚå\[—Û¶~ß_¡·j-wv‡æ⓴vgÛ'õ¡%î®b-¥HÚ]»¿¾ƒ I]ÖY»ñéIp„Ë`0óÍPtt1¢£g';;yô#K¬æztv>²tThFg£³ÙèõnO'ŒR:þqU­Ëí|YoN'\Ññ²ׯáFÒñÍ)£ãê}({yÊA`ñᲚ­K_d䘉Ó_Ï~8ùöìä÷ÍÓóÍ©‚B¦W'¯¥£”ÿ0¢DX3ºõRW#É\£ŸO~:¡i×ͺΡZ…®ÿBÝ^VмÐ=®Æåz^¾]TnRŽ§ËõºÚ¬–õl^_©í2^ÃÏ东ͪY(›Í¯ªzÇÏå:V}]O¡p».çu5ƒF9jÆߝ25^®CEs(ëiõ0<Þ^Vu¸ƒâõ)ocäø|½¼rŠ‚QN#VÅá=ŽWQ­ uzôOgOIR ¿ô¿x ýÐôÀy,‘åŒPÁÙWA¢ib aœ@A˜Õ#A4ÓA&ÖÒS:ˆëÑ$*ëYè(¨.ŒÉ݇Ëör¾Žo7«rZ…ÛV±©øfçz± ÷·óÅ"ܽ­2±½á–hm@“`d&ÚôOAÎ$bŒKE£Œ§A€õ ÑZ4ÖÅ谞‚È‚&©˜Šb,­NS¨¦¹÷CÝ+¢­„^ /„Õ"‰Ôv”=µª ¬Bè?ã¼W#»÷ùP!ƒ +ÝVô! cQì ™K‹L¤0»¶DR{À¬{M‰ál„‹d„j} “Í¢TP•é÷Ǭ 5`r;+øÈ9“Ç̙Èæl Îi¸Æ 1Ìô×f¤ +Äz‹ì1â˜ÀÒµÐ6ħñ{pºBZpý5øëÍ<Ž(dp%ÂÅ4ãÀgûú ¤€£ÛÙïöÆû°7]\x¾ïÍj½ü­šn£ºxZƒï¬[»ZŸJˆNxƒô_(ÂZ‡:ßëë´%:ï?¬â 禑˜×ïœQO$ÇeM?àkÙ¸®\ð¼ 7.ªAŸ}`ƒçƑ[>^ž‡¢V#ÈÜ1É!V´J˜­–W«åX ”p­‰%˜‘aíDùx½ZWÛëµÞðЎm¯B™Ómõõ®Q*ÚÞÜ^.7±âl£ž>l¶Õ•38Ê!†mæ³j”ύ ‹d¨|c’z6¡`VýB)¯]löØj¢©Úgeë]ĵE\¡òy=]\ÏbÓ.‚;ÀW.vtÅC@¸¶mà’ëf»,I.Ç/Ê«jñáT«¦Õdˆk‡'AŒ:¿+ûêHš`,‡s®Èã1ããnX +¼s×·Q²úýº\ô_Q×[+:ðæ +ð&¸ŽàͽpàmÛvÊ#·Ð…pÙk\¼»°¦‹£À—¸ð%>=øúR&Õì«ðöGa/ñ©±WD÷ԙ‹…É쨄–LxU]-apÓzoÒôžÏ!+†s•ùÁ¯h‹? àg¾l…ƒ 5VpT1^Ìß®Ëõ÷`ƒ-Ÿ¿ñÁØ¿ÞÞºn-ÃëÆwç>@ùÚ÷^ÅÞ»WÑCºÛ”'pÂ1*À›²%/^| +ö:Caø'“$óJRtÑÀU<‹ùŒ&Ö×DbUl‚æ ‰ÐÃ9¸SXÕ9>YW Æ¿¯ËzWí|Îc,ð 3+š„¯ŠÃI<Ë):æÕ%‚T…í©â +Cu”PeR]ܺñ"ëkbxëñ®P Á¨õ4ß%j]Ä¢ûfǶ¶@ÂÄ +këã¥æ±£ÏæN½¥;x¦ƒâᲩ¶áÆãteû ÊÅsÝ0_z*«Zê–fr«á¦dC˜Z%èµéý2òÝÄÎzè iד}Øq¿ö‹žinVÕtî0²‡¢¢¿ýà®:Ö9Eó:\£ŒvÚò<žNx¿®§Û^Y¢»xð ãAyG™<Ɯ~²¿xŽ­Zkøò*›»‹—¢¹< …(ÇEÁ ên ”¢þŒJ¥ˆæNzÒÄ·>Ño¢®¾7ÐLÚ^`P‚³¹ž^ƹu€ᗠ퓩L1g=ÚæȨ`MMÁÆMÿÓNØдúzaØþ’¼§–§XŠ$™‚µÀúós(cƲýêswâ®Ú۝^î@ÉQùÙyˉ`ð–ÄsnÙpg‡°WF"¡lxçzK r¬ª¸] 1°„{6\™ætæÚFúYìa_ ÐOGö5ÆþïÏQ€¤Y±k&š~èmŠEW@¶H7ï)àaR‘æb#³6ÄFw³'ˆƟº<¤&Z[tÛUz]'pÝT]ìZðDyìO “z=êй{Š‡e6™Pé÷~.®ÁL¶QpßöÀ„qæƒm¨͸Ø&¨QõXÖÛ1Y¶›-DûOµ^Nº|=ÙOGúź•wÙæ§8çWôÐȓݦÍí|SíÙºGY&+ÓüüÐþ‹¸ÛVÔÎý—^†x‘Ñ"É2ïÛgÂr0@DÓ4)ãó,8@å‘TLB‘ i s»Î­–PqÂàÎR6±Xø‚ºhà>‹,M€)Ë ¢:éwš@u¢PŽ*x "ºU KÁŠ¼Uˆ)":g‚ï1‡©JêQ49CG ÙRÒ»#"$6LîN©˜cÇ)§>0N;'Ò3á7Òû~ +ÒÕI‹apïó#œk$îŸPƛ´â9ú)zæàm†úٝ3‡#6ÃÏR}Ăúƒ‡ŽX´ÎìA4èCÇ[ „¢ÿx³jkª‘)”id8fQ¾£øߝžM½Æ6jq&©JXÁ‰ã[äš hvŒE‹o߯Ê°ýXçœÅÝ(‹ê{ÕbȂì$6TÂkðBïå5@›¶5ËÊ#§6°$$á;ˆ ×¢§'‹f· +ZbÃ=”³Ùsš€èœ×ÙÇՃÒi‹[»Ã_íZí}œ¯¼&]»«ºvdÆ7îÅTbWÇ–’jÇáFŠ£±”<æô‰lá­;C¹+UXØ.ñ¬gÆ_ £;8ÙUÀÑR’NÅF7N}‘úŒÃæ'r€/HAí±YÐCôX•2y¦Ïiv¸ð[¦q=y† º´î`K3_ŠšŸæ⻎"ÁŁTTpvuHja8ZïX pVÝ6ÁÆû¦ + =HáíM<ó¶úKÛ}Ç«\Ÿ81Mêòow€‡õ6øC.:Î ‹w=‚ wàûôÝXbo(±! ÂM+ˆ™@zGR$\Ëo˜%YщÌá ¹Å]•è·…Z+()Üæ³7%vœ)5í¾Ã ïoæwüj¶±–ò«¿E’À}ÎÞ;4CL†¦‡-ÑãWÐSœ t÷æJ¤òDw¨Us7|‡¹Ýÿ2â;³{më8s‡Ñ=$Z.Ín†=„NR¬Ó¢±<Ùyj#'øG´€[Ux¸æ>,ŒYvÿèg )/ËMs€¥!i!Q^-7ÍÎÌÜ/˜“ðßë‹ø'¯žŒ^û÷¯Ÿ}óMµ-Tþß=4gÞۂüO$4¨Š™cÿC¢ùïˆn¦  +e}¢’ðþ,˜;©z¿]xÙûO‹ñ?Úþ¹©Ö9Ujuð¼¬Ãá9E=A7H:N‰û”µùÀÑ?WUdÙ»Qs÷÷Ob$ñߐ赸ñr»]=~ôèöö–L7亞¯Öd¾}´Z-õԖ#év +ÏF檅óóÚz7ÃýÿóEü +endstream +endobj +614 0 obj << +/Type /Page +/Contents 615 0 R +/Resources 613 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 585 0 R +/Annots [ 611 0 R 612 0 R ] +>> endobj +611 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [235.653 86.288 290.207 97.192] +/Subtype /Link +/A << /S /GoTo /D (main_GDDetal04) >> +>> endobj +612 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +616 0 obj << +/D [614 0 R /XYZ 90 757.935 null] +>> endobj +617 0 obj << +/D [614 0 R /XYZ 90 586.497 null] +>> endobj +618 0 obj << +/D [614 0 R /XYZ 90 572.671 null] +>> endobj +619 0 obj << +/D [614 0 R /XYZ 90 372.706 null] +>> endobj +620 0 obj << +/D [614 0 R /XYZ 90 358.88 null] +>> endobj +623 0 obj << +/D [614 0 R /XYZ 90 230.65 null] +>> endobj +624 0 obj << +/D [614 0 R /XYZ 90 230.65 null] +>> endobj +625 0 obj << +/D [614 0 R /XYZ 90 216.824 null] +>> endobj +626 0 obj << +/D [614 0 R /XYZ 90 87.285 null] +>> endobj +627 0 obj << +/D [614 0 R /XYZ 90 87.285 null] +>> endobj +613 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F23 340 0 R /F31 472 0 R /F7 505 0 R /F8 504 0 R /F1 542 0 R /F11 418 0 R /F65 376 0 R /F72 471 0 R /F10 473 0 R /F28 621 0 R /F12 622 0 R /F6 538 0 R /F13 540 0 R /F78 539 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +633 0 obj << +/Length 3945 +/Filter /FlateDecode +>> +stream +xÚí\ësÛ6ÿî¿B3÷á¤i„ñ “t&×^2í]Û´Éݗ4mi‰¶Ùèá“ä¸ùïoñ K‘víÜô¦ŸDQ°Xìîo_d2¹˜$“—'{sòø…ä“Œd’ÉɛóI–L”¤D0:y³œ¼ÂålN“$™~wUìòC¹Ýìgs&’évã>¿€‹4™~˜ÑdZüæ1°úxY,w¹½¥Ó)MgïÞ|}ò÷7'ÿ9¡°|2¡v9¡ˆâb²XŸ¼}—L–pÿëIBx¦'7vÔz’2Ÿ«Éë“ïO’£¤3N)j҉öÄ¿˜1-Ëͅ£ð›ëÕ¡¼ZîۗåºØ샽»ÏÃ¥ðoØloqØî܍×WùÂÿVn[wõݦ=ŸÙñã" ÈL&s–žfŽÊ7f ÎÙtkù óÛ¿À&š¿AX–Á?í?Îa?ïÍú?/º» Q¦‰Æú¿]í¶3*¦Êe±t+ž}tŸ‡Š„Uy¶ËwgRLÁÁ¦¥aÜóÇbãåîãÊoµGÕ ‘™¬–~5› J§Ìä4ÉÉRÑ ´#h2‘$S\›’$ZO攤YêFa\ÄI0Èoà¦<\úIÃeç<ËÓæ¥$¢šxÎi6ýÜýA‡d&@E} B@J2M«°8Sڞ”‘(e¹ÆŸî‹ƒûn% >÷^Žà·öaFSΈR¬Zàë.‰‘’W¿?Ã%!k¤Y$Úïn€ +Ž"%4áÑQ$è,©Ì£xJ(ÕôÔ|H÷¡ª'îæ¯ÈÁ3IXÊ¢åÖ~†)ÐøzW?‚²w醉˜ª†P„5’/zN˜µN¸G¼˜ R×â¿vbõÔ}`ÒËÁVÕJo–˜À>ð+Ì¥¤,-6%S$U¢±;'oE¾ÀæƈÖÑG,RD‹Z¼2EF4kËgD‘$i‡ÖvÂÐÉØa&º¿å4=`£¯‚r«frªqÐL¤ou[݁ƒ·@S^.2„ûĦÞïd/ðݚ½W„d!çNÝÀkL}©7ō”~sDskFÁ0ÔÌ2y1ñ`hç LÔÄÖi*[[Œ(J\2Œ ˆó@<ç9ˆ¶þ\‚}26Õغà‡gµmߥ,¦lìŠcæò€½3LFû;˜Ó̍jó®`ǚW'c :EÝE°õikg-¡ ¶&»+%-Wòȁ•㲐qZþ4˜ÚÇÕzLP ÌÄé{DNÁ»KÒÑršÝ“œ¶Š\)%´qoÍÚ ˆq† 0dgRðX(«ýCﲜWÑbì°pðüê³_v÷ +˜%8.ÕqIõ£¡€á´%öȄÔz"c'\÷1’+ o¹ûÇb5̐€ÑUÒúLBÜ +³ïŒœáÿ=d§Ÿ²é`óŸýАíÃÊ, ø%"öîcu ¸ÐÔƆªR´!\€u=Ö՟°þ?„uq_°~ϲ|KXÖÓ$a-ÛüEIAŽS@¡Œ$*4è¢Ä6ùjUåkû=iÌ»›Bt=5àìÁ<‚ *ñ4Ko¥^ƒ©=DDÀ`«Ìþ€>±ðHp#(DR‘0Bš<µàé]|Ž3 H*nÁš¿ ìå ;–4–@%;ž9LÓÛfÆZN +k§&£ "´}?›óÄäð­cô0'T ñŐ̡ªÉ$8X™IL%DrÑvÅBƒÄPÝâpkÿÁ¼FVË üùb³=ûV}j‘ï–%ƒò𱧂e­EyðßL³Ì)‘J£N[óÐÀ—¾¥šƒk!¬U“,­j[U®r[Ý×ËÜß?+ªÔåÕn{µÝ›Ò”«©ÙZ¡+î.|µð‡—'“·ö÷·/¿ü²8ä«$}纪 Mºkn€B¦Me0ó•Á¯ÖùEÅN“ywõË݌êiQ¿U }~n9éùøf¦Òé.ßìÏ _ü¡Xù*é`éï…IÝÚÄ<Ó.1o¯v~L×@šºÂ¸o™‘an} yý~=C$úm¯$&9 2¼A£ˆ ?;jµ5Â>¶SGËÔãlzS8Î9Ýp×U*<¶`´èò¯å2ð€Ås A֍|ݝ££%(ï»yÇ´F ˆæ1ãŒYpØÄb¿9mŠ± ý¦¦a ûXEB\[îëͲÀ|ø cy4øI-VÓàé‚ ÜXq@&Ѷ›-ÜHŽ0X"z€TŸC?1’)Œ?¶n\4¤ÍÀdzð,¤H?…`¦]ÁŒ‹¥2¥“À÷èõPÆ¥+¤ñw›KV˜R%ؑfÜ ^ÁáLßo®O3˜ ˜éæ4Ž¦H›ºVšÝc‚`Àkz Ò¦“ÊÃÖ-•æ¬+5J÷IÍÔÇKGò 2¬ÒœÍ `y{8¸ãFEâLd-y£¨Ã¨i$o§¨—ZXÕ |¼×åº\å»(躩JÔü•Øx&âCla+†0jcêȞÝiiˆ±¹×dˆ–Ɉr`L„8¹Œ(ЬÖjŸõ6¨»žB=)ƒ6©WÖõ; +~<³‰á!ðƒPC ƒ_ÊBðC*»ËÅuhÐÁ¶·v_ Ø箩Ž»fc’¼ie@0‘jFø‹=˜ØÑšô~m‘ǵ֋¦¯ÈItsˆ²Ä«õ 1…Ä#ë·â>h¢¿‡%V3h¥u, +‹»¤éï€Â£}Žc0<^ Ú É#‰8Åü?“4Fr1„äéÉÕ8$§ƒHÎÓ$ùWç(aAFmƒm^¥j|}Zû`ŠÚ VYCÓð՛P`i6TšL¾ÏaìóÒ'8ªŽå3 Sˆi¾¢=x>ec¡r_ì>˜¾j,»›ݔb}ªˆ) N¨vªhxãÂt¨e#²üÓd?€|®Æ¥?‚‚ô£x :qô`}J 9`ˆ9UR+y~n’]aV˝kxq´ ¶9h·l2;ÿÿÂ$¶~+÷ ޅ1Aõ)þ‚ڏŒŽô¾EAûíþÚfÖ*Ç)/²‚p“ÞçÀâėdô]ö!l¤wꀣÝtC0j¬%ºWj׈âêZ_Çîm]N÷Á0ŒŽ1:btÀƒwkÊaAU0jwª´ˆzfAzfáWôÍþ„õÍ&V‡L߬ÁŠ°žz˜® Â3ŠfC­L‚f»Õ!¤´H,ýz—C™†Zú¥¶ŠÐmc ­šŠšƒî$ÿ‘”=¥-Ú —9¼Çh)‘ 5'—T„4ò'G»dxòüù€SÜèY‰%“íÿ¬§²UãÞZWgJ¢»imFšN%ÙH E«v6Þ $¯ª›&Qåªêºêö z·#1i+ÿw9Îá§áÜÝÚÞ:ý=û Ây+=¼Ó¶Æ„ƒwÈ& ´ôIœ¸½®ŽÝW¿ÒóTȗ’fb|gÙùPÔÓ'z1BU_,łûXEŒÅ½FæYÏYk‚ö³YÍ @…¦Âv|>¸¥‹1ñù¦ç×ö<äâàØföY:ryáx¾7‘eöN hU,Ê|åî-ò}»O)õO‡ª£uió¨)rØJ”ŠÍÀ'ÑÙ83(u ÓÿŒê‰ÍLC1eã̓<œ/ͳhÁ²â/‚1NDÓ¶‡`æOçכEOø%AˆE†_n•¥;¦ífõÑÝr?é*23·êÈ,:úu~ؕ¿¡åIÍ½å žÊ{Ž÷e³ÆžÜ+ ´jº&Àz˜{\ ¡îqϵûçïõƒÛq¼ß¯34‡5zópè‰äâ°ï‚g¶Ù>ʛõ…Åém«™÷ôdØCÅÅú~ɽ§À˜þQs»Ý¸˜ ŒcœÕÀ'Bv|^ÃiÙ罕˜¹­ÙU?C'èâ;C…“6¸†§©ÿÁ›3S¯‡ AL$ˆÜ ¥úý¯O0p©ÂàMŽYöÛo¿0ª~ßCî¾Zpƒß+×´g®]Ôþ|¨Èί®Vå·þ™_ª‰«Þ:sÏaܼÚáýj, (ُî¦ÏG›ûËrîW®¶¢T“ªæÜL\¥©íw\&šœ'OkïÆ #÷ùڏ0ŠÅÎ6XÂýKÿn¸tþ!\¸ì= Åˀ©lë_`Çå;ü‡ÎË8¼²}^†„ê<,ÁՑÙ69¿Äù…I +úÌcÆù³K[Lâ”7. ý}¿·åñ½ûq³u·¯÷~´;¾´™p?wrW.îk<Ûþãúl»Ú£UtèUç]Ÿâø¦|ƒBS±ÿ¼‡©ç< ­ÛCÍ~¼˜¦±˜6ûŒøåJZƒÖ«˜¿»ºCÐW‚«½q.e/ ÿ–îÊ%óåt½]+w ¼­úßåþæûr³ô³¹6Uø«iJ-«Ž[Ù,jcóâ…ÅêºzŽœ.‹C±[—ð ˅»•ï÷åÅ´èÐLíë¯ánZšTgÿÆíëkåñ+ߨ¼€!@l¹)–Öþۛ›í¦CQÒ¦(è×íÓ.íö’éÅu¾[îI½…0òE”#…®Àz¯QQ!ˆRé'nѕ£ŠTrÐa¾]Ôç0óh9/ßMIÊš†ˆªÙû̋ºÈÛ/`òNöþr»/µ:îÍö`ùõ~·_,%µÍ|¯”}Ÿ”÷ SÓåÓ®P¾2òï֞¶WÑ{®¦ÿôïP²_þbóיS¿­oòÍu%F!¼7’–H¹¾zû×Eá7évö~R]ýãľ%*€­Âg5.‡«ÓǏonnÈbO®7åՎ”‡Ç€Ç#¶µvMiJO¨N}¬·»úuW¶©Õae‹ÿÿžm¸3 +endstream +endobj +632 0 obj << +/Type /Page +/Contents 633 0 R +/Resources 631 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 585 0 R +/Annots [ 629 0 R 630 0 R ] +>> endobj +629 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [235.653 450.673 290.207 461.577] +/Subtype /Link +/A << /S /GoTo /D (main_GDDetal04) >> +>> endobj +630 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +634 0 obj << +/D [632 0 R /XYZ 90 757.935 null] +>> endobj +635 0 obj << +/D [632 0 R /XYZ 90 733.028 null] +>> endobj +636 0 obj << +/D [632 0 R /XYZ 90 451.669 null] +>> endobj +637 0 obj << +/D [632 0 R /XYZ 90 451.669 null] +>> endobj +638 0 obj << +/D [632 0 R /XYZ 90 437.329 null] +>> endobj +631 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R /F31 472 0 R /F10 473 0 R /F11 418 0 R /F8 504 0 R /F7 505 0 R /F13 540 0 R /F1 542 0 R /F78 539 0 R /F12 622 0 R /F9 568 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +642 0 obj << +/Length 4763 +/Filter /FlateDecode +>> +stream +xÚÕ\[“Û¸±~÷¯Pž¢)¯`Ü/vmU6©l*›sê8Yçi7©âh83,k$-¥ñ¬ÿýi\H (j.Þ8/# + ô_w£‰7 ¼øË«?~xõæ{ÉIåâÃõÂà…’ J®?-áñbE0ÆËÿÛ×mulvÛÃŊ +¼ÜmýçŸàãå§ ‚—õ¯¾íý…›Ï·õU[¹&͗D\üëïþüáÕ/¯LÄM'RL,Öw¯~ú^\Aû Œ˜Ñ‹×ënÁ)ƒÏÍâÇW…é8^‚ÀÑ–ˆ3½P”!,…_Çϔúé»ß-~Z XÕñ¶ú$±ô‹e½>îZÛíÍ÷JGC +Œ„¦ð;7Ö¯¾GÜÁÀŽ™îÿ߈F-Æûž„ÄäqKfc©…DFÑv2$ _¬âðá:•†áˆ«EÔç°Iªå[û!ý‡ê>ÞùÆ0ÁÑdT!ÍX2Û6tcQ7Ž åÍ?ƒ8ŒÉ–ˆRÕu!ã-‚¥‰)†ý!ãaÒJÀ_I¤ïöÁ÷IX¬‘Òd±Šzí®ÃP4‘¤èhºßîÛ殾*ŒÇ ¢çï§ *–UÛT—›úॣqŸxy€ß»–ãη´õ¾­õöš;y:ì«uí»\Á¬ÛCÐø—§ö\Þp Õ:tµ»«š cÝê –ut` +“…• dX/lïR X)Š(S0?ô§ç( +Ã|FQ€¿œdH’DBzþŠD¸ãQ `ž½¢W)¦¦UJ ¦OÎêuj_H±ü˜Y^ƒårëj}럚íUm÷òגq8Du/¯ïBcФÀýéO/VÃ,c]#Ö +õýÊÆ 0ã ã²-ÃàÐrltz0r›…dKI/È7¥#3îv¶¹î¶3cÉáóöX­Í:|K;{‘sªH9FJ™”Ûsm_ÙM "闩ôøiÙ ŸrXŒ­3Å:‘Šd‡ìI§Á´ +Lën»ùìItÚvð¤Û3Íoœ\֖tÀ¶Î»ͅÝKÿe½«¯m/·}·qðKlYÀݎ„½iš0Ou8Ü÷{ÔÙ5l7SÉpšn÷ˆSÖôU›ÃÎ?­wÀצóz3 ͇c ÿ8õ‰!Áø—a@Š"Àëˆ÷ÿÛ5€ìIŽÆ“y"8.¦™Í#‡N(1rÅ%< $üï;µ5àîÓ۞ên¿©TQϬf{S¤Øû…C&Ñ_ƒpŒ )õ}X¶vÍ{Füc|ê+DL‚ÅYa&‰4á ·òRž›§L—Ùð{âÙŽà­í‘æeµp<N”æ<ɓÃ‰£-TÑÜ +“院‡=ŠZ>ŸdFG£S!’:w>M¸®¬äº¶'ñÏߞӞ2)KLêx‰y¸­Û 3½ðtçˆ}ž=G`CyYi*Ñ¿âDƒÅdmàÔ¶ÌC8kl„sˆÔ*6óÿބŽ9 ì¶3ëן3³]õ˶ûýië<ÒÚÿïÊàUà-F¤ ì2$,J—EX‘Àýx ï⧲˜˜،tMX Ì'„'Ö¤àÑ­¢^ï +ÄB/Ú#†‡±Î¥ÑÏ¥V¨Õ‰;o=êôÖJ²ŽÜb¥§æüTX=á‰'rÆÂuÂ$!£“H¢¶KNN•„̉ã 6˜ÇŽ¬×Âàaʘ* +ÞjÒu<§÷gӅeì`ç2 ú8oÈÜÓ£f+[qËþd¶ +!š)+N2¹PIXASó¢‹gšíqÁÌ(¬{YúwI`µgȆ˜á#xĬyðùöfz]o‹þ5Xo +í­· +‘žîx8€#]:ºs¦÷ò"]3¨ü4ÿk„é‘xF­×@¥EQ&ÀR™ LÎÄ>XM<î´©Oró6åevqÚè$伀Ñ9åÄ9FGœotΚí4rr´’Þl×%HèÊÂà÷Û«ºõÿiëñm\XÐ}?Ü_®7à#Ãv-8 Z¸ñœAò)¥`üWn?Y{ùË«C‡붹ìL\— é1ôõ®Û+yÞ% V •Qöºü*"8¤X„ßlêÕ?÷WÕ1Œ÷ÝuLÕ÷÷Ûµ£ +¤ېbÜø‘ÿÒ Á$ Rµ¬ìÇàäئY'‡!|®H˙` gáHùX žØœ5|ºK=;qqdo=Ý}Ï·&<³ÿ÷aËÛCïÿ§v^€¨³Þ.Üo «"ffXœ™-Ú0!eNÎ0J÷ß×%–P$‡sü²h¶èÐäWaӅù²¼MD ¡m~wôÚÉÛY‚ßH–¥ +`›Dd©(>]˜ÂlH’ûÁƇˆFX4î6ü ¡ßóbˆœÉD,S']z¬ÊoKb•~_©Tù#å„\%Gæå˜;^ªæÀ(l;œJoޜᄖøâ}÷ˆyÛb„€˜$Ûø»RБ"Å榅©‚s½‹qv1àÃù1Ð Eå ÅDèc£ …ÕF„mIM‰É¢ …PjLkYݓ«!ŠD1>¥–ˆ$ÀàEg*ñß&S.:=™F”æ*’T +*’î +û]ÉÅ¢Žh‘ ƒDŽ‡S„, .P/,ßC>}Ú®rh!,2†7)ÇH×øÇ®8§T¡M?£ß—þ-XPìø +[D\(YaÀG²Ö+N”‚­XQÌXÑÝ0 ñš&ŽáÊǝü“ìž8ããÆ®ãX3âì¸$&Äfq™OÆÙÃ.J)1$ ÈJçíÚ·›¸‡¡ÅÚ·[ +}Å\›Ðnüþ ?O¾";ï?A 8p‚¼ 'XáߏáDŠoˆ½Òdº,´LŽðÔ£¤pþÎÍœãÀÖ4jV^JÁ½$ñÍÁª˜«Ì‰øX¼6Äñ—ùdv? ¿Å˜-dŠU¤'KK~ÎXŵ©©¥½.ÅW(C®ŸÃ1Çõ[\§\YgFh;F\’2§‹óÅ'TÇÌlF¢:ñtt—:抑²USö-s õ$[D‰ë§Ú"k +9&#S8e:'ÚsF€¥Ü5Nè(¾FàÀ2Æ;Ù2à¸É8¬ÜãÐø§Â<Û¦¾’ßFxà»rèÁ8–uFN»]6 "rȗbJ3\¶z +öâ_ ~úrØ ¼º1ô*V<Ý4ä:FKPÆX +°ãnr´x¼Š»‰¯` £°ú¯*ŸÓo¬ÊYڊÁJí^1 +狎¢‡”³!ò•&Ãà„~’jŠWy¸¸iê ·õa¾)§#gG Kð7;Ü£ 8Ç«ÊÐ,ææ1©ïbȋ¥¯áà1rI†”b*ñ‰ÁüŽž¶ÖÀ{‚ 4H¤Mî«gwɵIòýaWaL¾ÜïMH5D3¤¾>¸ÌìÔV[W=Þ*‚ìEp½üp{ðãÁÏÒ$,³™«ÞÚùú¡Ï]µ#÷·í—¼žB§7ž5"öú`]gìcÒúÏ­+úTª+²9*}wEô ‚ŸQÀ ‘C‡ùŽ»±Éuåq̚%Ò›Ÿ1ÅÅpñ }[Ä\éIÔé4_FDS +rd£·Ò¤›í¢éҞq¢Õï ü 8°0—ìÅù™Le7 ¼np1éõÞxŠ4Jîp9S¢1]Dð}ÆÒ§÷{3åÊî÷–„~Ìʦµwù¢>¯ç²ûÁx™±“L¤J¤ Çw_@ŸÅ‹W$$º°N»H)àb• Ì||>ó*0¬ß~ââ 5¶àÔFÕ$’Ø ¹ðBõ’!e9eƱ o[ {ãÊaKçƒì¿sEµ® ~ë³è®6GuÕ*ÏN‡In£+›€ÏÊt9ôbþ“«Rýæ¿/§aùp¬ù|ÉXHf^æ +žÖ +Ð.ýFO¤ß(¸ßb.ý&¾|úMœL¿™ÓY][µÃç°a/7V¤¢Ëï-vðÀa±â#BIŠšíáXm׶®€Q{qbàɊéêâ?-4Ð5ê5ŠBÄ÷RåJ¾`ôË0ø±­¶‡ë]ëkOà® e˜ž-¿ÜWmè݁¹4‰Ç ørö²o$n´˜ÅiÂð¦ÞZõës•d–âž°ú蜒¹j¶ÇÃØfr´gÃZ÷e—Ì¿¶E’‰éÅ4·Žë¸ÞÏ “¸ {ücØS2’Q¯¹ÙN‘,Î%™ýæ$³'î²úÏí2{®`œØeQ"yD1Œ&zhMHѕ҄&" æIaOЭ5<‚úÒ@ÊtÀ *ö 1«We®Þ¾tuTDVô1w33 Tr‡ÐWµÆÄe'.ü+»[t‚H‘¤Oºé˜ÝÖb„m-àUAҘÕ3ï[žºÅ¬x’˜yí^:lŲŠe×V 2Ã}±aRóä~,æµ ‰ßª!À÷Çå0âß•O åÉÞehDëôN·#©˜KH + »0±9‡ SÓ©‰u6q!¨ bJ(Í6—Ïn®µ& Òœuµá†åÚïð)4›M + 6öžc)Q"¢èÍL•C½ …ZVf¥‹¬–u_µÕfSov7muW˜U¨Xߗ<—¬¸­ ‰9A *¹ƒö3œq1샻´*§!¡6c‘Ü¿: /Ô ˆü ¢‹Ò»ZFçžL*6çNYK2):ô€®²W'<_ȳkyþa­¾8¾xq’ ûÍ÷ù CƒSJc©·ÜA_nëææ6èP ŽÄ&(Ø.XÎÀ˜Âû<Ü Aš+÷$<ÂÇö‡†Þ)Fl¯ËMóË}ôãƒoïLKü1L³i¶ÅrŽæì)¯‚Êj4°ž¨§ÍŽS6ø¨/ŠÆÚQä2ÑË¿^g»Ò#@,rØ¿ÝE¸‹÷öûe >d÷f¥ctoP]μ`¤†Bŏ¥¥4Ñ:÷BŠ"ÒéÍ !\Gû³û£ÿ⍻ÊFÛÞ2²²ø÷‚,;4IŸB“`Ð }v%‹õÓ²Ï<¹exF‘3IÍÃX)¬îmþ§hoςLâr-OLΝø²x‰0ÊZ=JJ\ɹ oçHd<ŠûÍÑW¢Àד¡˜5pO&øe¤’¢éDQ‰nòyøDÛPGÒÓT7»­³´þEH鏼å UFö(1ã£B\Õ^Ꙉ«Rnk†.˜ZÖsáUi³êj^µC áՁ^hδ”õIÑm¿ðϓVJ¹ê™`eóVÈÓ^Uñ¸ë 8aµõ¥}„•¾Üö™p"Â;wlóCí[ªýÞ¾ˆv1GזJ£ :ÒhiDþçÊÒ õ&-ö¢>’¦ ãØ1[—£wªÜ¿rÆÿ÷þàm4¯dË+ëfªÅÀ£gÔ<åý ¹]‰»ëïrëôJ5_)þ–îrÞhʪ‰•È! ëeœÇ…O ½LÍXtÑ(½áԊÏ8¾š"EŸíøŽÊÐßõd„"ɇ`^oêcFá®mnšþD л”ŠÀ±y_~YJ ëÞW­?:*†Úˆ$1îýµ͂§Ö?ÚݹnÚíp¨×ÕäYàÃ:½®º‡ØGdGºj›šœ–C½ÞuNG¢ª¶Á«jüBÀüºR»â’3_©Û½B7‚Xx! WÖ¿à½%¥jïªð5yÅïòúšaøòÏCÝþþBÀRü÷ÿ­¶÷ƒ-ú o9jr1²'cwLïuéWöqÑ=ý;µXÄ·´ÁèEøöxÜ¿}óæáá­è~Ûì[Ôßß$ۖ­Ú†n‡!_älߟ³kë®Ú×æ±\]0Ê÷ÿÿ7ÑÄ +endstream +endobj +641 0 obj << +/Type /Page +/Contents 642 0 R +/Resources 640 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 585 0 R +/Annots [ 639 0 R ] +>> endobj +639 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +643 0 obj << +/D [641 0 R /XYZ 90 757.935 null] +>> endobj +644 0 obj << +/D [641 0 R /XYZ 395.521 512.474 null] +>> endobj +645 0 obj << +/D [641 0 R /XYZ 90 495.747 null] +>> endobj +640 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F78 539 0 R /F8 504 0 R /F11 418 0 R /F7 505 0 R /F10 473 0 R /F13 540 0 R /F72 471 0 R /F23 340 0 R /F31 472 0 R /F1 542 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +651 0 obj << +/Length 3819 +/Filter /FlateDecode +>> +stream +xÚÕ[ےÛ6}Ÿ¯ÐËÖj* €ØñV%®ÄIv“ø2©}p’*JâÌ0ш +Iyì|ý6.$É×MžDR Ðh4ºÏi4ñìj†gOξ¼8»ÿµÈf +)AÅìâr¦ð,qJfëÙË9\ž/Æxþã®lŠ®ª·íù‚r<¯·ö÷1\0<uNð¼|mŸ==§Ð`óæº\7…y$ٜˆó_.¾;ûêâì3Ãã1Ãñ埭nÎ^þ‚gkxþÝ £LÉÙ­iu3c4ƒßÍìÅÙ³3ì‹Îq$:Í܊¾kª›r £ç¤£|^4U±Ü”ZŠû_â½*8â9…~͋¯m‹|&Ê3©p$T6[ij°mH#JÙÌkTlÝøÅ¥àgŒé¶ÔOòyyNøüõ®)ÛtšI戳ìˆL,‰)óeêjۊúËN0â˜÷ƒ=WTƒÑÄ` 1¡üÁîÁde6ï®Ë­U\ÙùÃÄ÷›®Ú^Ùç;g-ƪàïª Ú‹yÛ5Õν[/»¢Úök»|£%™-(ÆHr +B¤¸3‚b½¶c€UÚ¾àb/[é¥oåXö:øsLRËcˆ¾ÑÃi/ :t‚¡2U¦îƒÏ2$ˆ°í.º”Häb¶ðZÁÊñ=]MW’KDý+™û ‰¬Ž‰ gÚêr$¨ûïÇe[6¯´=ký2 +Š.:{µkjýüUµ6«eþsVu9lŠUUn»„² SˆÊA…k‚ƒ]@…°ÓqKþ{rdÄîר¾œˆ³mAʦ—3ðæIµ^‰65<‰6µ}­µ¿Ûz»ø³lj½%˜Ù½J ’"Ì6ìýr¿]uUït+焫Þ÷‚î›®Y‘}àÔ1˜E¤Ÿ;øt°çÖ_Àöؔ‹Ÿvë¢sC}Yï·v½àæ‹K_ŠçåÆƔP2 Cʘ²Ã<©ô¬lN:02zæXÏS Pºˆ¼ ,eìõ6ág¬Dˆeù‚ÕŒ"I©ï»õzßêÐV[Ñ÷[_øØHdíÔ?&Gv3Ú,µ“óG‰­La¡ä0÷k·•ýÎ2$sïŽ °Á¬xä­òƒîêuBø¨ÿj:Žò|èà³Ô +"Á‡é.šHÈ¡ÖúTgåjh²¿Ke`ãh‡T6hd•W*ËßWeêd•­*å cèP@Xêµ\0̑‚Þ÷²ôw81‘¯iÎ3(v§§ÄcB²1Pfb:G ±t°ÌGvÁtHÝ,S«Æ7ŒýQ– +€PÈGr0ØDàFäAyöË1Ò+q’eÃRõn{]Zu÷+Ð&ä0@0´@T ¯; {ì:Žð*Ѭ… öYho ù<¡µÜ;Åümrãhœ¾ðZu8·)(JP6¶ø â†J ¤}0ZiBî`ÐWIW‹ ;ÙÕÞ¦$âÞ&è­)ò,‚Å+Iªfܙ±‚YN|œ{NDî éw„J‚d8ï[cœè’·Û}‚`õ*©o žþ—G`–ì6içž +ߕKxÏÄ>0¥'GùwXùGçOq¼"æð±ù5ðÿ(\¥Š€?e’¿?Ê}þälRÁŒ•„îì +K#¥D â<Íp¬±Í£z…yçú b>}ÿ·çJ!øÉ(@»^€Ó9v]þWæN¦I¡Kàm/GŒ -ù¸ ^'Ïôâ“íô‰ »‰NÛª”8²ê»A–Pi”5I³þDy¹\%W• x eý9;{¾ÅÒžö'«$ñ&4ò Ü-ËU}S¶ö¦ücïŽàôÛF±šNÌ9²?PkÏ÷ý ‘á@öœ€°’"ÂéäTïZÊ>NÂ>â®°s¼|=XF2C_¦ª§1¦ü€ +z_Á¤3jPÌŶ¸qWWá!¦iU÷­5BÔWµ)©–Ñù‚S5ÿ¶³õMìbÓ]ÛÛ¶3AW&Ø® +Ӟy"ԝ[W¿xjW#WˆË,\ @¯7e×T+SuA´1ûÖÔL𾐂®f—²y½Zí›ÆÕbp{Нód‰J°å3ü=Ÿàì`ëƒã¶´ÉŒÐ• tÜÙ®Aµ‘d¬Ù‰uS2lß"p µ5t:èk$®ëÖUŒLg5™A0F1Ÿð&f ü‚Ša +{`$s}|Næ òC-Ÿš_ÖM?ZÛ`XFn:–±tM±m/Kת߼©sbã*:Ñn˜1¤!‘Š‰Q‡ŽÃ^«ƒGZj„whƒË"èbÜM(8D*!ÞIp~@ðüCŒ-QŒ*Sœ wT҃ڲ ó{e3…wÕ\0/Á˜¹ãã7›j»n*SúâÑϝ9œWtr]ô•Luð†à~ˆÇ:&`ÀOƒ™õõÛ <‚—ˆ²aå!„ìö]َUS‰t%hk$&«é„t©Ÿ­ñk®\±ßó'qɞ31÷Ëo¾¿ÈÉ/îU[æ7{iç©Ëu8éY{P-÷·•v¬–Ï·»rÕÙÖ}ÁTÝÇ0Ê0²(™£ûÎ2:¯:íd³,t<ڟó|þµö…usSl†\nÆûˆï¬ôÿI-Ä0C*0ýÁk>ƒ`•á$s:—qUrE¨Xgù8i›,$Óå•^£~ÂÅÖÊþÏíƒ; ËTr“Qœ‡ ›”›Âe~LnùörÛUւ«¬Å·°Ý@í਌Ëìݵ l)X ¬g¤äUÒ%Ñ!âP˜'€.·õ@ÿû“÷?íÃÔzdÁìG$ӓ}yˆ.’d2ÀääÜÙ4#fKÔêͦÖú¾m¤rd9€jš*"{ûOzsÿ8bÂrYòY.I¥¬ìÍýÄådRn =8d6!X{v N¹ O#¡Þ16ƒ+ÌV ·hì÷iŠ3Áåx^™ZL=Ôà›d’az²ü–dIŒ½-ÛúÛí%yˆ>8 2vLe$:–HÀ§¦ªTNÓsۏá$éŽÂÁDó·«}ø-•4Q‚Œ¤Éo©šÉõØ\ e$3‘$p'é” #IC'—Ä{L¸ÒàÜbs¿.ovuga&<¯ûO.Ú{[œÏwEÓU«ý¦îќgʖæ̖¶§¾»/ ‡?ª[ÛǶüÞþsmøØVÌ[Ãõí®X•½ŸòëˆÚÖU9ñ1Mö9ý ©®ªm±±GdxŠQ1ÿ¶³™24´ý(¯Ÿᚿã”4(† c›X +æwq›ã©9ž3ñ385±±ê‹©ÛÒµ²Çèò´jmæ˜Ã…>ýÍ/¾Ú»¶<•6ôåI,¯;cït÷¥í>‘ºÒÑppãâÀ֎2hYš\ <ò‚¾­ñ€ùúŗß<}®ò˜ÌÁf–ó/VÝÞÇßyŸ.ž}©ÍO4M‚ïôÿýW#@}²3ZÁA6Õ²)š7öÆlVÁÌ*Ãm»©®®;{}ÕŒô†ÏÌr ÞïDxXˆÞ§Bé|ÛÊ Q¹.ŠM[Ûf.Sô{ëúqý®/z£,ž뙉ëfklÝ =®»÷ï0ñ"д 1÷ƒÞg6Ê'9àÉW+‡¸?Ì챦×èžKyš% +ìD?X–ÝmY&™Ö'ËY$Tøɸz6I†„½ă·gIžC2ágƒAÞu©}yª¿ ¨ºÏ®€öàù?¬fS½gúô…FÝ[ÆrTK«‰mÙjcÄÊÙ–!_¢@%"*&_Õ[ý9Öô3+íú¦àêJ+¢?l’Rœˆß…ó_»j¡˜œ\r8æ"à,Gëû#}X™}¨cîìN’ðV!—iŽh+fœÂ@^.O®Î9Ag¾…ÆCqÆ#?.T¸›2„ñ[/„ðN í:ø~ä³éBäˆæ§BBXhRÅMÖT5§2·þ?ÔýY‹î¨ºL9Qå}ñ Ýð㔆 ’uÄ°¦ŠúŽØf\a¶«MÝ +~hˆ>fúý!…>犏¾¤Rþ´® ™ú°*î9œT©ù·î„L{«¦h{…ß^'}ÿB;IyèéRþHˆðŽ¦]*D§•6Iê«je€‹ydż9ËxÆ>t¼qPÃïxÙ¿ç°©õÙAn8*þ&('~vÝn=tÁa‡p¥¤Ÿš’ÕæÆ¡á§Ágàóÿ  +n~jËæŸçÀ”½ÿ¾Øî cà¶þÔ}×Ø rŒ@ÝÔ³éÒÄeé&igöû¬¿ú÷™É‡{†+ÒŮÛ=¸ÿöö­Z´ßV»UÝýÝns?P[4kB±²åz…êfH/^ê4±‚ýÿìN!å +endstream +endobj +650 0 obj << +/Type /Page +/Contents 651 0 R +/Resources 649 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 662 0 R +/Annots [ 646 0 R 647 0 R 648 0 R ] +>> endobj +646 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [329.648 328.873 370.375 339.777] +/Subtype /Link +/A << /S /GoTo /D (main_HMT71) >> +>> endobj +647 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.151 180.673 315.118 191.577] +/Subtype /Link +/A << /S /GoTo /D (main_HPR97) >> +>> endobj +648 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +652 0 obj << +/D [650 0 R /XYZ 90 757.935 null] +>> endobj +653 0 obj << +/D [650 0 R /XYZ 199.887 681.531 null] +>> endobj +654 0 obj << +/D [650 0 R /XYZ 90 666.861 null] +>> endobj +655 0 obj << +/D [650 0 R /XYZ 90 562.5 null] +>> endobj +656 0 obj << +/D [650 0 R /XYZ 90 547.93 null] +>> endobj +657 0 obj << +/D [650 0 R /XYZ 175.548 388.57 null] +>> endobj +658 0 obj << +/D [650 0 R /XYZ 90 371.843 null] +>> endobj +659 0 obj << +/D [650 0 R /XYZ 291.462 240.37 null] +>> endobj +660 0 obj << +/D [650 0 R /XYZ 90 223.643 null] +>> endobj +661 0 obj << +/D [650 0 R /XYZ 400.848 106.118 null] +>> endobj +649 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F11 418 0 R /F7 505 0 R /F23 340 0 R /F8 504 0 R /F10 473 0 R /F13 540 0 R /F78 539 0 R /F72 471 0 R /F31 472 0 R /F1 542 0 R /F9 568 0 R /F65 376 0 R /F6 538 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +672 0 obj << +/Length 3431 +/Filter /FlateDecode +>> +stream +xÚÍZYä¶~Ÿ_ÑoÑoJ6¾²ð±žÝ @v†º›3­¸/KjÏN~}ªHŠ:š==Ž×HžZ¢ØdUñ«›tv?£³¿]|y{qý­³‚šëÙíݬ 3£QœÍn—³·<^^1JiöÓÞÖe[í¶ÍåW4ÛmýïWð iöÛ%£™ýàÇn.9LX?®ì².ÝP.3f.ßß~wñÍíů ¶§3æ¶S†¡f‹ÍÅÛ÷t¶„ñïf”ˆ"Ÿ=¸Y›™ä~׳7¯.蓤sA¨V‘tÂ:ê´¶½º©/YžÙÆÖHìoÕöޓûÍv]º¡{»±ÛÖ–Û¥xSmöëê¥|áøG.®¿Ut°5]qI„,üÎ?ØÖOâCú˜"Æ ãn΍ŸÁØ`Bæ݄ÏKH"yœð*±BN˜ÐÏ^á50hòŒûyb¸§Dó)­t¦IaDŽ4¡y>»bDÒÏJ Ɛ‚ÉÙ`ÒÜz¡¾|ù•Øw0!—WŽàve·Ÿ: t'=»R9хr2–Tû…Þq®FÓ&ŒæDê¢gô˜4FI!d7£jüLjiªnÆ´¯/…qrè9^Uk’«¸ïCÕ®<›µmöv Õî'ZÇd1ù”b >4¾‹Ý¶µ—LeR°S;5ÁÌtYÍMÄ]bœ(3B çÙ;&¤ +‹æƒ?J$‹@ü<¥ ”¨~Æ >•qM‘$”ú”¡{A à#(1J‚mH …3BE7Ó:“X¹wvљ•ãÕ'”FŽvwi9™üù°8y|f¢ôï(þ)µ&/ˆ4ñtÈDÔL¡‡øؒ†5ÍPЂɬLș"x´MÍyë F1ÖI\<ê$¾¤u܉:'ü¼T'ý‘M.gñ|êäñ9‡s‘‰E@:hä}ŠKBY”Ê'À” ÙÃÊÖ6±š1¡ib¸ó"j<ºÂI4XդϨ÷Œü–,Y7ågðžÓl³«íÇÂŒÿÜ¿µ?]üwµRªöѿݶ §n=ïl1jè;ªh[{¹Tåzý,Ø[ÿ\pt¿nð˜ûað6e’ĝ x‹”Ü"Ѭ Ùºš×eýè_öµç8iüHéæ€ÚnÒÎEŀ2÷†,x@:Œü<ë±Éº{üÙùðŸûþrL€M¤ӀòÀ}îº ÛŽòånªhºó¿.ÆrœÄPÜ«S®Àº‹±ô¬¤€¶‡Ú)¼”þ§[Á ¼?¬ªÅÊ?Vã™ÇgƒÇgƒG–ۍ"ñnÙ6¬‹ê&ü'¬rèWñqPN‰ p˜üGš£ jŒ5ÀˆP9N\Ø=z e¼Á‚Á#®qðˆkü‡C&~=fGËu³ ÷ðÙFnwá×SÃSíÇæeS-ü£GÁIíšï>8…mÐ=‘Ý×Õ²{þòkø•E OæÙnі÷;°Ï~¼Y•{Û !P×Tgo¬õçv½C¥}ð6q¼ôïK‹$Š¯!îxë&OEà5¬à BÊáȃfrëÜ÷L²LØ +´RCÒ'™:$™¯íÚíwõ<õûÿlDs:s‚ŒÃAFC„/cC„#»¸¢{ œ WvñK°Œy§9hô:Ê!ÏV»õ2ΙÛöÁÚ𥠿!9ËÇj¯ŠÎ¬´+?÷¯ÔL½s'û`Éïí6ØMÕy¾‰M~sØïwM¸]¡‰”úLP&íºðÜÁ¯çÎÐ1wº8åå1¾Vы•ŒsëC…°X=¯Úp†ºËön›Önü·¹Ä”rL€DˆsaFÑëWBçQ~žgUðəùãX4K²âqbgAzHë&a*‡•“˜€^$Ë +üáU?oýQ áU yË՚ª&ÕŽÑ +Xíˆä~HøŽŽ(ɒ ëeO.™6Ù5˜›lžà^‘\è1÷,y^˜À ¸w5ÆGfzãS–m¡…™—B0pÊ=ùwÇgË$És6=]v +hgËKÊ¨ó‹\!ÙM‘Í ëS«û4î…9£ÃJ~¦ü‘qFˆ_Mæ}ƒ  ìwpMå–áh0¬ÍÝc2cµ|.;ƒÝï36Tۂ`0âjšj¾¶>dZz²±zvf=D0)?‚áDææÙ5„éžfº)~`å£|o`ÝíÖ!Nh¦õ„×0à 1ÝfÿE=á&U&–zùw•›eÕü 2uŒ˜¾€sWï6 )pFòÞœ•ÂùrÌ©ÊW>®Æ˜¾âñy¢\;®¦}qÎG|êÆðT5!;-—Ëè…ƶR^œc<Š/YNq(cO{RїBî9r8¾CÓQÐe7{—cª¡;Ÿâ‹ Ä+ÐÈû•øxÓyt?`°«E»FZ +•Â|“’¶IA¬h<©Md•?‰#0ÿ½Ò"ŽDÞᢪW°L'Š³ŒpZ< 'FD_úâDѸgþ¤í\œ#ðè’4M&E‰ ÐÑ¡¥ì’ÈEN£V*‹sb.ΡV÷Ö3Z£å)ԝ‡ð‹î½Ù2[oÛÁÑq:©n#o:„¾mÊõÚÖQ‹·I÷YEùïˆ'E^‰.çãëLÂ(WÛÅú°´Ë”QÖ ›>BÛ¦Zþ‘M²Æbç¾Bþ*]!gúÏ7¨ü¼AåÏ6¨k[bc¶ÃæñzÜ*òç÷ ¶ ÀÞ½]\<¶?<‘סFNÊÖ¦,¬( 4O«¾ÐúŒ…erб½’ZXˆœg/kºÚ@1,Ãs6,Ï3YˆwLœüâDSDÚO‚šP8»·ºTÙãÞÖûu¹µþ[µ]XúÅïóG?8H(RÚJ>;R LUÄ÷H;zBЌ®ÄCu4{;GáDr5)ÕøøÙ×# íëÇö׶BýxÊÀX „ïúÓÿ»Trœ9Ó#§;µcyá=O7zhrò¾Й¬à/—yŽ )_±o?ž’ üÃÌÿÇÔð¤Î™T)Ï{ôﱨ\ÜÒO«Â—ø¿›Õ×q¤©Âª®Jc/‰Q®çNäåb՜n¨à_ÞÂ\S¼Ÿ6?/®tì€XõÒ ·°à|u5wñd6>>?Ñ»è틛ׅyÜg¹2R`—¦ˆ‡åW #Ö,v›ý¡í:fðÅ!¢èîÀÀñ‰uŠ Àþ0oÖ<ÏsJªd¤ +Tô^%n [Ž¬“ýk_™1¬nþpuÓgU¤/ïÁF½KÝÞð\ž½¾Ù˜ŽÁ¤ªõ)¬ƒ]Wh~=Tµƒ*¼•a4ä¹`J±ó:¼;ׄY•bh´1Ж¼ ´Çä©ÈN‡­qêömʍíW¶ïö—™×ˆ@¥k.ªP³qä6¾-‘Œþ«¸æDkþmCgy_‚ ýÑSW ¸4}7Zæ;ˆ_âU‚p›ÂuH}S>wF '0ZØ#2"†è_¾xýO*ž²[FBÀ7ÌSpßÊ7¾‡…ï2–ÛEØÚw滶"²rdÀ`pdÀBè‚hR»~ÊRp-³·ž…2e+“ OoùÔàþ¯ët©ÍKæ«00àÎ]{tÂëZžB'ÇüˆÃê@n:tR™F''¢?ß6…œúhZ’2»?”u¹mýU-}¸âh‹Bìhö¢,Àh6¶ÁÛÃ:”º{® +ᄪÍäΊ j&uúî¡'øÓ+Ü,$eϼÁínn«¡5‚%TaÓHWÜ5rLïëMhߌn”g?ô=ršý½±õ_°™¸ø±ÜðêWþVNw…)Þ Ká>^<Æû žIÏÙ/³îéû wŸg`=sÉN<ÞUÛî?½¾~xx ‹†¶Õ¾&U{½ß¯¯'õŽ׌I,°uý†®CŽ—«º² núkKCùÿ¾µÔ¹ +endstream +endobj +671 0 obj << +/Type /Page +/Contents 672 0 R +/Resources 670 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 662 0 R +/Annots [ 665 0 R 675 0 R 666 0 R 667 0 R 668 0 R 669 0 R ] +>> endobj +665 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [447.267 502.912 513.996 513.816] +/Subtype /Link +/A << /S /GoTo /D (main_Powerset_Meet_Preserving_Simplification) >> +>> endobj +675 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 490.957 234.367 501.861] +/Subtype /Link +/A << /S /GoTo /D (main_Powerset_Meet_Preserving_Simplification) >> +>> endobj +666 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [459.859 163.689 492.835 174.593] +/Subtype /Link +/A << /S /GoTo /D (main_Hal79) >> +>> endobj +667 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.791 151.733 180.758 162.691] +/Subtype /Link +/A << /S /GoTo /D (main_HPR97) >> +>> endobj +668 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [99.388 98.244 148.972 109.201] +/Subtype /Link +/A << /S /GoTo /D (main_BHRZ03a) >> +>> endobj +669 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +673 0 obj << +/D [671 0 R /XYZ 90 757.935 null] +>> endobj +674 0 obj << +/D [671 0 R /XYZ 90 733.028 null] +>> endobj +676 0 obj << +/D [671 0 R /XYZ 90 491.953 null] +>> endobj +677 0 obj << +/D [671 0 R /XYZ 90 491.953 null] +>> endobj +678 0 obj << +/D [671 0 R /XYZ 90 477.955 null] +>> endobj +679 0 obj << +/D [671 0 R /XYZ 130.944 234.768 null] +>> endobj +680 0 obj << +/D [671 0 R /XYZ 90 218.613 null] +>> endobj +681 0 obj << +/D [671 0 R /XYZ 400.439 178.797 null] +>> endobj +682 0 obj << +/D [671 0 R /XYZ 90 128.819 null] +>> endobj +670 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F23 340 0 R /F11 418 0 R /F31 472 0 R /F10 473 0 R /F72 471 0 R /F8 504 0 R /F65 376 0 R /F1 542 0 R /F78 539 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +694 0 obj << +/Length 3588 +/Filter /FlateDecode +>> +stream +xڍZYä¶~Ÿ_ÑoÑ-uR2¯aÇvÇkO` kÃPKìiaÕR¯ŽŸº(QÍØO¼‹d±Ž¯JR‡‡ƒ:üóæíý͛oÒèûy¦‡ûÓ!W~‡ûêðރêí] ”òþs5}1Ö];Üޅ‰òº–˯ +ïÓm <ó™û~º aBót6U_PW{Avûûý÷7_ßß|¼ `{uh»Dû:JååæýïêPAÿ÷åGyvx¤Y—CFP6‡_nÞÝ(÷è‰Ú=Œ|•&|ô·Ýx¾½‹‚Ð{¬+ÓÖí¶"¯£‹týÀƒeÑråhx¼¸^›ÚTÜ9v\þøãWXc]„ +[7®ãf«ÁŎAÔC¶3¤Ê»¿ÍHhìù¡º:}MW“*AÇ¥¦¶‘AüQlP9CíÕãÞ}H¢Y­è蘼µˆO%d“¸VŸx úæ›Ð•ž Êý$Ñ°mñOYˊòU6Ï@=Ý!“ú:ŒíœwûTb=ÏøM%ê$ÇìÐ +¡š'ˉà™,C¸Îv‰Ã’ Íâs€-)°ßm$¿@v†ŽO\’*.<í>OÑ×űÉ£}À™;—ˆS?™÷¹îœ$ó£ }Æ«ÐPY¬÷ã±ÄÏõ¼‰FŽò .n¬Ënô@†ATѼ†Ö…¨oÓìÝEi_E¹%ÿÑÿVçXÿ£‰zhñ™®Ä͍Áàä]ÿX7 oÌKyo9Ä"ƒ è;Ò£R?ÓzóäýËï!ãæ­GÖ~à«ö“(][S÷Iw¸Å þ þìPÏuîýX\¶Ã!kT9±Šj{o¨ë‡ò¬:ú$*ý'*”%³bPrwÝZϑdOÂ®ÃåX³•ÃU§Í™­øÌÖP…~’çkqeÔåÞpñ" ç†Ô®Å28„ŽKW‰¢7Hoèx ¸ő6¦¨œœ!4†Õv¿²«UC}혡c&´³<φÈr¦-wA¸ä kþ=ó¤ü ˆYcœFìÕ¤CüäÞ3B¸¤óCúÇíýc w"•§È”ç›ÂòEö¯>ÜmD1àq?¾ «Z“»wì#1(ð¶66P94ê2rŽ£#Yö”Ž>ÛU… d`…,AaèñšÏ»wC _tàú’IúøŠIÊõÌR‹$PøbCÂÏIÀúg%€:ÝJtÇ( 3áä£9³'¯û€ ¡ÂCXþ¶4BŽØk[*fž Î]€—[²âÃ;x€Ïìßbà㞠+•§éÚÔFaÀ#pÄ@Aô!ƒ¦¶!`chš°ÿ pÅ´ÒI aÏ¥~˜‡4¹3? fsø=«ïv}dé0&a(6N7€yåCwGjل H„ás×T3 …¾Â²/r W?X„À<Úø\²|Ù:þ‚&‡"Pï °k6¬nèbSWf·,Z ­Jukç®ÌÊjCºõ­íÃT<˜½ˆâ³û¥|Q¬µì«,òƒ<žS+~IvåW´Š ¼Mlð‚µûÛ<ô:V¢vØyQ8Oû‘ ?~%E!rß}®/À=¶Óå"´˜*ü|íêväî²»\§9€ Ó0/qÒ'00³ O’3A"p±kÇRÉýì?4¾I¿2c4xÞe(jr=H²œØ ;ÈBp<옑8”WL ´+Ó`ŠÕy±6ðd&ïf‰hS{MŠ-$σâׄTßv6'ËÄÝø¨àk0Ü¥ çEãÐm²JúaϧJ\¤+I9¶²Š®ùd%iÑ/hB´Ó³˜úîÂ5yŒÍICŒš¼v”ÄŸ‡ï¬ÌBìØKh& ÷3p»¨ i;(& ‚E±Q4ˆJʎ]¯h Òßr¹‘¤Š{—×Ö<+$‘`!c¢µ˜ Z)‡X€º]ãE¾NÃÅú»û°’bm\)è §7ûÉsþü,pgé®dâýÛoþXÐßWÙF¾¸Ë—˜%ÔËfÜ䄣æ¢P׏\#P%¸¬ŠkeÑK nÛ¡e”ĨkHf {zsmÀ¦](‘æœg¸©U½Ö-ìä»ò¬.±…kÍȃçæ4X軉3R‘kš¾@]L—õp&k ¥be-zcIm¡ ˜K²¦‹©$TEugÅA3p¶äæm\Ë iÝnjª=Ó%hÅÚ8¥Å><€垠,lYŽ “„8f‡šŽ0„b(\H½•,52®J/ª»’\0F~¤gÜr° QxÑì!œÌóeæKáL®}~¨” ÂÂÒހՎ^ƒÂëx»º(È#Ìs°§^¬ç \§ƒ-×ç“·ÜO¨J´’”%¡$3ýv^wEñ)„¶›Š’};ö•ìg±7Lj§Ë‘d‰œö„Ù¢ÀHuCa.å{€;DÁ0†¬¯XV¦ìœ"{«åÜflj’mrIØhpvó–ëÞ±½rï´SÍÆn{rø*3ZÁ;4±¹Ø!ÌÙq*òó8Íid~”ÍÈÁÓ0£g™FÇáÈFI¨¦¬šC­–õ¬ê8™‰g4¦"ŽÅ‘dD;Qö‹ÙJÛmOÁ¢à£MàИɎ8Ε£(þ¤¨ñÇ §añÎ5ë9VT‚%æ‚¿Þ áÄ~– ý:.|k8 å¬ +Ǚ›@_™óxõlþœ<¿µwLzpü}±ç\Ã<ó“E êÜW,÷ÜAÉå‹ôlŽÉBÃ9©$9Û<]âç:‘^‚µ(_#%ù¨”ä6Ä •I0¿a¸R4?¹˜GÕqs0'#±kîU¸Æߚ€HÝÔËðKy&,w±%!äz¹œXÂPš+Ç*´Q™¬ýŽ>¥åˆOÅOM1ÞچH)æH1SÎü`)ßÓòE¢°±ú¸–Ïz§E?RÎ\¤xÙ“«eâ÷D€h®fÕԗÍݎ/S>Öf‘zDâ¡Efœ«¹b£ÓFçÅNGIª`ˆØñÃXÖ·gu@Fv=s¤þ’ûuÌ:{ˆ•§+ï0vЊ÷Ð?˜µd`Mynk,¦€PWƒ®—}}´‡¬Ûéá=MÿíO?çzyb:ék~o„ÂyZ´bïØËLûY¾ ö…õÑòý[cÁÆvàfÁ4 Êþ ÚÃÈëE¦ÐԐ• Ûç|È»C{‰«x˜|Tà¹d“Z¨Ò³EÑóؔÏRq‚h6F[e{ªMÃICI®×jƒÎ6rM]΃kG“„Üybó‚:³¦G³š¹—l‚FHw8ax K,ô ºÕ˜pÓ#f-Í.†Å+D€X†©ÐH .qKßÐJ›L°ŸUqª¹BJû€°„ÝÍ.dÿsÓËrê¹JÈ8BoZË|÷a±½<,s*IBïäC7“À/y%ý@‘¯üæ÷%|§=Mˆ™vCQŠØ­x ‡0Îï[]l.cI…ô…úŒ\"q›9ÇʬIn}5cºÊ¿%²ëd`Ø:™µyw‚î‹~Xω¢¯}ã +”–ìùŽqÐô»Ø(ï4õò™ZßhÏñ G؉ВVº8´ßµ˜Zý—6¬ŒX"̧ÆéáZ›ˆ37©u܂¤?àßúÁXiWùr$›ršÏë.çÅ :çUxvä¹)¿*¸„ŽÝg™ju•ýrÉâ埃֞ž2A3*‡ô‚Àÿ¹¾ÒéÝl¡¶*º ìåoPÃø:]¼ryØ£ Ò +Qæê\™¡^Ä Û^ýEcû‹YšùyýÕ?ÌìŸe©Ÿk@ýügY‚ßéÝ´ÿæ†8µ¿Ò\ýñæý0瘡ñßÁôC»%À¿‹–Óˆ‰¢ðÞù¹†;•(?” ßûcŽoöá`kÿº¡ï8ËyÑC€hµô<Ž×/Þ¼y||ôËÁŸÚúÚûõøÄâÍóŸT*Aìë™[28؅Í8-t^–,ŸËÿÿSvÄk +endstream +endobj +693 0 obj << +/Type /Page +/Contents 694 0 R +/Resources 692 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 662 0 R +/Annots [ 686 0 R 687 0 R 688 0 R 689 0 R 690 0 R 691 0 R ] +>> endobj +686 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 386.85 138.587 397.754] +/Subtype /Link +/A << /S /GoTo /D (main_BHRZ03a) >> +>> endobj +687 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.089 205.085 416.057 215.989] +/Subtype /Link +/A << /S /GoTo /D (main_HPR97) >> +>> endobj +688 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 157.264 126.971 168.168] +/Subtype /Link +/A << /S /GoTo /D (main_HPR97) >> +>> endobj +689 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.445 115.73 242.088 126.634] +/Subtype /Link +/A << /S /GoTo /D (main_CC76_interval_widening) >> +>> endobj +690 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [302.64 115.73 327.726 126.634] +/Subtype /Link +/A << /S /GoTo /D (main_Intervals_and_Boxes) >> +>> endobj +691 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +695 0 obj << +/D [693 0 R /XYZ 90 757.935 null] +>> endobj +696 0 obj << +/D [693 0 R /XYZ 90 489.974 null] +>> endobj +697 0 obj << +/D [693 0 R /XYZ 90 485.367 null] +>> endobj +698 0 obj << +/D [693 0 R /XYZ 233.411 318.272 null] +>> endobj +699 0 obj << +/D [693 0 R /XYZ 90 301.545 null] +>> endobj +700 0 obj << +/D [693 0 R /XYZ 90 235.661 null] +>> endobj +701 0 obj << +/D [693 0 R /XYZ 90 158.261 null] +>> endobj +702 0 obj << +/D [693 0 R /XYZ 484.168 118.883 null] +>> endobj +692 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R /F8 504 0 R /F11 418 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +709 0 obj << +/Length 4135 +/Filter /FlateDecode +>> +stream +xÚÍ[K“·¾ï¯àÍ܊ˆÅ3¶¥”¥Ø.;NE±”ÊAöa–œ•ÆâÎÐä¬V›_Ÿ`†àc¥ŠË—h4º¿~’ÎÞÎèìû‹ç¯/®¾ÓbV’Rs={}3+éÌhFg³×«Ù›9#úrÁ(¥óÚ¾Þ^2:ÿ`ÿTëÝå‚+¸iWxó¼ûXÃ;AM!笼üõõß¾¾øý‚ÁRtÆÜÔÊ#Ôly{ñæW:[Áûg”ˆ²˜Ý»Q·3É\׳Wÿº 2#¥R<ÐÉ¡Z}@ÝÕwŠ&;§³—DÈ'|ý®†ñZÌ_¾üÉÞðù˜ÃÌóî’Éù‡fe·k?ìî6›nÛãð›n‹7Ëîvs×W}Óµ~\×◶kÛzí>Uk|·ên«¦Ý=±Oz¾¬Öëz…_®»—LÍëð 7ÓÁÖ:ÒZ»÷—\ÁG»E»)dnʯ‚Œ¸Û՞%H3ÜÀD¿Ý֛m½«[Üf3Ds‰³}Ó" OØÈ‘¥¡n„ÄLø-€Ùp7 Ä!‚¥s1B C~ÎLÂ(Q¬&±ò'ä¼²1ßTv3öEw“¡T„)þ÷º»kW9¹à1Ãà„’á€ö'‚0p?zÝ݃,fæԄËaïöD3ŒU¡e"–ŸIiêÈåBi6ÿ¶Z¾C¸]!–UëßÕø¢nืøîª(ƒ?,Gˆ Õ%ËuçÇ1)Ÿ-„) 7åXÚÜâKÓ³WEÂRnŒ#”‹¢¢$J‹ð?ݦ¶Êd˜W¸9¼š‘„—j²œyø7»¬8°&l\iydÍ»öðª¬7 '#Œœÿpƒÿˆ¨ÆÛf—!A"Š‘ŒžÉPm×pôòyÓã +瞧ß^K—†R1Ðu†|P›òñÔïñZ'g/©ˆ¤Ýì3<˜OûÃíu·ÎÐÎx èËâ!2mæW¹p"îa¡¨œ{ÀMϒi¢å O3KâÉA¬¾Ê,%‰Œgý åêô$ Kö³ٜ03Lö6ÃXIʂMk×)‹¤Òm{„xK°õýLlŸ#N2Bõ»Œ´ RDsWeö¦‰ jÂ Ñ –A|Ì¡Ñ¢ÑÍ.¡åÞ¡ZA|Çö¸ÍUj¹(绪Yá]ßáÕÚ.Š°©Ä) Á÷<÷ÈP‹‘©cá‡.z›¿,¶okûÏ›]ÖZBR÷%ÂÂÀ­˜0iÂEV–‰Ä[öä$D$Gs‘Š˜Ö/íEãńËWø²ÍzZrµ‚Ò}JÀxªaËjVBÈÛ,Ê= ØÝY0ANWýo>Àâ•àŽ4]K &gp„D1ìû aáº8“Õ§8ÍÁéܱsC¤6§8­¥œpú$!Mn£Eý +iv:ظŽnô'Š8:”ÉÓSŸ%B£?ɳ†ñ)þ¥†üàÿ܏RŽDfä3€Á,gɘ§(54‡_£h…¸ðB¿; dÒMpIßáÃ(¸r2À½a•¿8$„kÛùO>÷Õ]ß­»·øˆ>žÔºñcÍiZ;=Wí¦‡ Ý7 ӆÀí6'”ƒZ©‰(FZ%£6?ÍNÕ VÛìisê4£<|̪vBXsù'¡Cý!t8™ü/cÄ!öØæi2E9™ñّEê=Aº‡(0̊°(AÛ × Q¢<湖DÒÇ ¨ eA4°  ^~ªû¾ißæ€ |ªèð<Ϻíºl¹sC +í´±Pó]ýû]Ý.ýː${“€ŒÑÁÉÅ)Ò4FĈ_kˆîST’DÀ­³Pgå-…ºŒ‘Ðp |uBJÔæŒ ‡Ýˆ3ý½Å88ÌñÄÙçy3'f§IDž0x F1 Á^gOœNµp숛pðIÌé>d£\ ¶AóώÁ1#jœÆ¹eRÓ´‘¼}¦‚¤Ðèô7¹àŸH1ÐùÅ%+æ¨Ò¤Ø ‡±±aÙt»ÆÇÖ0¹Hnþ[o;—Àu¦¯µ•ddÖö_u>i·a"8ipâœó-œ¬ñfÝÙ¿ÃC.ÊN’ ÍH)8àš²GoٓžZi¿™}àP %ò(pºr%G©Å°‰zeӀZÅhPhJ„PÓhp»­w›®]Yðƒoö|3ñ!Œ÷Ì|UƒÆ[—¢…Çj— a ‹âìòQ83:ñ™Iæ“ƒOu*øä矊9ÊëÉb~ïB¿Ì8Ôf’ŠM`*Ì(”¾#dÀM̕¹G+Á£ï!‘gÏ* þØZƒE‹?J§LåÎèTîrI#!:,{â›ÆÅààÙ$iᲃ…÷Y LÂ%äyyA‡ÍìÀæÀj³ö<;©—f¨Û5§k·¸ Ïµ>AJ0ùòª¹mÖÕvýp ºgÏÛ£Ž籝ùLyü_¼í’aÄ6¼ÕGGûX§Ý›âÂã‰pU¤<™P*›Yw.\A¥öGé)qnP8vÄߧ€¯³€Ã%%ìܨSp£nÔ9p£þ¿pc¤Ø‡›â ÜÈ(Áž÷Gà¦ÜËüNà¦HÔ‚?J=‚xïÄWéxÔ(Úh{8„r"!05æ< Š^ó! j?xÛàèÓ9M…ˆ£ñál*³xðFE¼ñuÛ\è#a'ƒÂ~}`qyrí¯oÂÒ>aÜ'=ŽE¾±öÈVwÛKI½o„‰Dx/Á'Z?¼«WÛ.ø¯l`ÿKµ\èÄmd7 |ñ2£HL^ˆ‘áÎ{ŸLŽ ·Û9lÀçhd—£5X´×lŽÖiڊt6Ì&‡mD(•Éy×®ðUøäë6©ˆNËËüÙ&UÏ°%_T“×õø¦óKíºõ](Ä';®ðâp¯éëÂF褔‰3&vdô#®z[–ÙE(+'å8Ï&âwÏ •O]0™½òØ?„zÂÈbR`/ÊIh¯´ÍFñIRÁê×oºm=XuА‡+ˆ‹Ž†× +bÊð}±jnëv‡m!Lˆ*?Hé”%œé²¥bd¯Ø9p<2TG#C[@JF²&ÜêVÙä„âY&ˆ¦iÎ%'5àONǑ +â F €ëÐý܁ëï ÙK2'ê@æ„IM8-Ž§N”àùÔI&ÕÁAŒuòþ“(Oœ G‹©%H³>¡UpÌñ0ˆ[vÏ8X9Ú +ôÄn¹“¨Û±?DÙ¥cì Q¡@Ð${µóK¹4 +Ì79lûÉ{óašLÒ< •â›U!.p¥à“þ²Ÿ}º$6¯ -cø5î4*Rðâ…Ñ‹}Çüzut³Y7ÃüÈY9´;ÀÝ$(’erD> æCÆ$»³ŸSòž¡pH{¨ú‚Å°O£ø*Ĉع}ë{$þþböÆ}cÙð«ƒm¾BÅDl¥±#Ñý„…ñ€{ÙØ3pŠÍ±¡Ò2WQÚn:ÄÚ¿ñáĔTŸ¡t€wïº5vÆ í„¡ÆkÒhkôÄÖèüÍó/ê¾ZS>Ýߤ"1é×ÐDÆÄÈM¾JÉ81bR•8V~Í÷˜ÇK¡Öå)Qãݛ`´Æ}Ç'`Ÿ;ÿ´†€Äß«L¢Ã¬¨\­ŒÜ¸~Ü»u†zÑÂÇ!àÝEKôû.¸åTXwI‚Sk‚-0ƒ%…­«÷ë‡ÅÏik-Ìüê]µ9¿ã·d¾ã·¤p·Ÿb«/<`oŒ›´úÂ'g[àÚÞÝÖÛféH±ÿ¶d¾ub!(C›n§¯×õ}.7-à*÷ÎDG F¼5‰Ÿkö­°GóºîûÚ÷ÁØp§ÿlÕvـEAÿܵ‚ní>p8‽³ +”áCï?#>ÚÖÒ ÄºW–%—@¨çŠkÃm“þ\9ÿÜߛ»õú!¬Î >ÈÃí˾ó¯ù@Ü ÎUe!³äpº&ú ;\',\á[çèÂ6ÔÃÉõŠ&dÙàf÷Ðö|X⣫Á'$qä8$ts¸û©js;¼®§½Ù.Vuú³[n›ð}г%Ö)[×`~û]Ε¢S'Ê NÔóÔUû[sscÛç‹ypïÏW h•t0À\³ã žZ‚1—dzcs§£üps'CÁÏhîd.͔ô_•åþ+]¸Onî,ÒªFÎêŒì»ç‡ÿùϼ­«-2âh+&àMá*g#åû3·dòÇ´dBM6ŸîK%@Ɂ–LmG±Ü +¢T@  Hd¤¸•6$_CW¦…ª¤+S%Aº«fðf’õ¥ 1´ö-¿åäVñgiд¿ŸâTw]©O6hò³ý1ß é˜^õ_ŽÝlˆ¹Ë'Á¢‚I£«Fã¦]±à}—§šó>©’ìø—›ÑöîÈь¿eõ§Ô*1œwžÓncùc¼÷Ï8ì#µýI6a/-FìÕû¢ç·žGÈoÙ;V{=‰X3Jo8³яëâLâÔ=§ê‘=§O&?ÁË÷I FT´ï/’ÓÀì½vi“¾iÛp‚|G‘”Ñëäï$Bé  …*1†˜olö‚g]vûþxí nM‘ÖΌÊ×ÎxZg?\;“gÔÎìÆ'µ3K(S{çB!æSÇxޘ–i‡à`LíðŒ1ŬǝM,ëôG+¶Íïùß^=ÁÂܗûoQ]£Íõe±ãbܗâì]è ”îÖçlohôy$ÀccVé ŒpÅ3·Œrà•ËÈP“þ—¬;ˆЗ•¾–'±h'“¢{‚8ûÚ壓ÑmËiõ€Ó>®‘bžÙÿÌ9ù¦úŠ#»"ÍÑû…¤‚q P?­1$…ú\ånªO©âˆ3*w)HN¸­ R²âÜßm»ßk«‘%§V ”’iªÐî¥ûiÏöÖ÷¼ A;>þ2íöáß»zûÅ¥RsïÑþ£jïBŠÇ*‚/˜ì†t?È %îç¤.k +ql]ûMâÎÞÏÂÝßíïËUŠ…¿>þX«ï7_^]ÝßߓåŽÜµÍfKšþj³Y_MlËh× P6šéâo»à7­ÍÄ_X§üÿ6aú +endstream +endobj +708 0 obj << +/Type /Page +/Contents 709 0 R +/Resources 707 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 662 0 R +/Annots [ 704 0 R 705 0 R 706 0 R ] +>> endobj +704 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [212.462 394.864 244.342 405.767] +/Subtype /Link +/A << /S /GoTo /D (main_CC76) >> +>> endobj +705 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.855 382.575 194.766 394.53] +/Subtype /Link +/A << /S /GoTo /D (main_BCCetal02) >> +>> endobj +706 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +710 0 obj << +/D [708 0 R /XYZ 90 757.935 null] +>> endobj +30 0 obj << +/D [708 0 R /XYZ 90 733.028 null] +>> endobj +711 0 obj << +/D [708 0 R /XYZ 90 684.604 null] +>> endobj +703 0 obj << +/D [708 0 R /XYZ 90 476.314 null] +>> endobj +712 0 obj << +/D [708 0 R /XYZ 90 476.314 null] +>> endobj +713 0 obj << +/D [708 0 R /XYZ 90 461.744 null] +>> endobj +714 0 obj << +/D [708 0 R /XYZ 434.16 386.061 null] +>> endobj +34 0 obj << +/D [708 0 R /XYZ 90 369.001 null] +>> endobj +715 0 obj << +/D [708 0 R /XYZ 253.525 291.66 null] +>> endobj +716 0 obj << +/D [708 0 R /XYZ 90 276.99 null] +>> endobj +717 0 obj << +/D [708 0 R /XYZ 138.148 128.136 null] +>> endobj +707 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F31 472 0 R /F78 539 0 R /F23 340 0 R /F10 473 0 R /F11 418 0 R /F8 504 0 R /F7 505 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +727 0 obj << +/Length 3312 +/Filter /FlateDecode +>> +stream +xÚ­Zݓ›Èß¿BoÑV­ð|0øê*;÷™\Ö¹õUªâÜ’X‰3P֛¿>ÝÓ=ÀHì®]—1 ÍL÷¯‰Ån!ß]½yõê[«Y”Yeïï™X$VFFÉÅûíâÃRFÉõJ +!–ÿ¸¶fYä«ÇÕÏE•÷eSçÕõJ±¼ÛçÇ¢ƒq*”^*qýëû¯¾yõï+ ۈ…t˚$J´YlW~‹-Ìÿ¸‘ÎÒŃ£:,b¥áZ-î®þ~%žeQéHX3°)fòvÓç» Æ€Wß1YC,V*ŽtœÑß^K³lZxÉ*q³Ç‘\þ§‹MOÜI:YÂƑ1¬äVȉBŒF*5ž@–UÊüLR,l”%:E‚$’™]èÈJKDõŒ,i$TºXM¨òzK¢t›¼Ê™y9Ý9VQªýÎëÞA¥Æ~)ï[Èû ý òŒÝ_*»e§bÎ릚á\*ÉtØ9º–6Y¾š‘@JP¿EX©,[ÞáԎ2Ž¬辞Ùü… ¾šÙ*Žb°üK(³›Ñ‡Tàþgúè÷‰[•u‘·¤ˆMSw}›—u?³ÕJë42R/V _f8ö3þ©£49wÏ@,iaÎÄ +VÄú4̍Œœ¤œÝÂƦZ©$õ>j(§8*;Šá./·4꺮 ºæ ‰šn é@ \7®¥XRN¸Üâ@9lyÏ틖÷(0|*»žŸ<àjÌGYoˍO/¡“ +Þ?X»ü +ÒÈþۜ›0ƒœº)hgÞMõà„b.¤£l Þð5^,]ùŠ&ëf4äc­FOâ’ ’ÉÙhÈÒA Ýlfˆ“a“îä€ÓzÞ¿v¥Ãç~ðv%¢’(D&‹™/¥L@w¦‰4ŠmvîùÓ´j"~»’Qœ™§WGZ&‹ +unEȆÀÝtÅßfã%ƒ¢5!òæž×4fºÑæò ›Ë³~2‚Åï]à)c«çŒ}¹Ãļ)ä^¨*+ ôÊþÿ­ËóñR°$²°Ê„æk2…˜ËKȒiêo¥ +†Y¨š+S0Ԙú>^¯b%|q ˜·É|ø‡)ã_~VFQ‘Ñú³m!¨ "LFڟ€Ÿ8Êt †C.!â|º<6Õã¾Ø¶Í\.I—$ƒï¼»^i+f‘Ÿ ß¾›1©Ô®–O㫞M,Ù4º\ö¹‚î‚ÀŒ« pÿT±c؅„ÖCT9³½…ýã 0âöî†^!o»}ÓöðHÒ¼«8Ž‘-M4uõ>*J,GsvŽ¡ÈŒ‰ôݜçŠHªÝ¸‹U,2÷f€!ÖAÅ;¶E×\xón¨‹¾òõEÛ2&¼3 —Îœ.ÐT]öL^Ÿë¢ ›© ‡÷jÚÙ¨‘ª©/ã:¬–Œ`îé˜[¥ƒ­Pý3 +¶¡’3ý¦¡z´gÐ1ôí€â³>;—‹:UQ,°¤)Åöù[CêÌ\¡tÀQYoxŒ †{¤›usª·d¾t¹WRfy f &toU]CTyM3a²‰axË`Ÿ7¾›®—ëeÃz·w=z¿ç½ëüà»°©Bæ×ÃîpcÄÀÁÁ5—0¼o›Èq +ƒ3ßô~šTðQšÊé2éåÜ}wÌ7¼„sI¸nËCQwäÒp«ÜBÖ/0ªnnœ‰÷ùµ2¤›)Êݞ¹êÊ-ÁÄs‰s†•‡¦ë#rŽ Õˆ€\5tºú Úqÿ€‘z¢¾Ø¿›jéû“ nPVv´9 Ù Q•x½å{ô$>à×!åü±£g}ŢٕАV~Ÿª Îgjù 薗s¦ÅÁ©;¡H¸dWô¼G½©Nd#b^+ëÝ͜vÙG ½=ZÚ¸ší »¦kÈyLj­~{×ù4m–äfôºÐ› {Óeü+ØaLÏ÷øÏV¶ÔJêñƒâf¼w‚ôå†åeg½œ±]Žý㨓™|¥À-Ùs RšL“iæ ÷8Õ%fÒ‰™]VÚìYh®§”c^R"Â8P,hnٕ`ÐÀävqZXb:x¾.w;~ \W$‚¾Cç—Ù½KÝ(x0znb!†µš¶èÑÃy¢h~’—.™±œ9?èNëÕ`CœhîçPԚ3½=˜âx'”¼°ÇÑ"†„Ô ÊÊfDø‡‘yC§vârpã" ®P0*ùšÓ…Dň:ûêó C<¢Â¥¯#HWä¯y:À€¡ËÓá»9C\®ª¢òìÐãN€ +%Š Jaq¢™ä¸óâ¡Ï*@¸²›2ÓQ<¶Üëm·ÚŸª¹£ +m"itÉì\. +A¬Ç…’úäš2ãÙÊôøˆˆoPÈLsÅmé&çI2 Ú¡#„?̃9§Í‘H-Û±^ÁtYï›C³+ê¢9ùå vÂwù Fc!†› lƒ¯0o#’™)“S¶À„0¿)ÚºØÞx—˜d3†šÔ-Ç^b¢X„ô»Ê@Q:Yζ ,?4t‡#e|Äԛ}ãΗXû)ÀT^Vùº*n<&‡Êˆ›žŸ¡ÈøÓ1wvæ‰.{ñaeVL€£X‚%7e7ðƒ¨õ°óX¾œqÖÓ îæÇ>“º=¸ò…›ÁJ¿cÇSýE²QaƒA`+ÇÀMØ[J•å°øú‘®ßýôîZLñ=6Z< ᲙÖP7;€`äº+ƵüÐõ8 „„#*bÚ`&â÷øz(rÔ1 áuÍëäLҕ‡¿ “ǦëJp¨ðUª‘A?ÙNB¢jŽÅöŒG|c&â¶Í!GP®Uꢯ„iìOòאçm²ô´Ç¼…rpBv© +il˜Á¹• ñç€Ã:¾­Ï£[=nàú7:#œæNŸ“Ü0 ¾gñ»CÛÁ*ZhW¯Uè{&ÚªéY¿oN»½[ãëŽOœ~<Xn7û¼…&°î Þ`í_¡KÕà6äCm„Þܼqšx·¿è\C=56?~!]Y¯æíúÒâ àÌÛ÷, ƀ­™2ÌÍP¯!7»XÏ6!VPQx˜a-ªi9û¬•cZ9~ ˜øIj Lõ§¶¦1ÖR²vŠHtC`‘ê;NPÜf•!è?•—xI§âÔ îx#Ž,^š,úUUb.«àJÏ0Q¸<³=p·gŠMÓ"h\©á…ÈW#䄠©{‰Þ0Юv~õ{šAÙ±òBiC×bH@¶«=‰õVœ‚±øÒ@e)¦øSîdqÀª 'þӞKœ‰XöqH,@êÁ0û<ÒdÝô«æØÃúó„;¼d·}Ë»nšÃñÔ»” wû¢&‚'ÒÈୋ/«G¦ñVa§<Ñ#—MáJÁT¸ ’C³…ց_wá W:ÐÃÇж¢™ÜC_‰ð&4>oçâÑN1Œ»&ŸˆO:;ûÌC„x8D€(¡ë¡Öeï›O°$dÑ ¹CÈadž~ù$âó¿¿ëÄ÷ÿ0ð‰×ݸèJ”Oµ0C©6‘œjc1yµ*×mÞ>Ò+“úì_¥ eÿ¶¤r9l2YçaPŽ{<„$.{ïž9Ÿ1Ñ´"Å`õ‚"eˆ±æ3fÁK´;þÛÄϽ ù‡·ß'é¯g¸[P“IÆ@uŽ"qåû¦âÚÐ çŽÀÀ}‘‹Í@®_`$^~xóýOÿ&¿¡ëú‚§Ù£ÈS§Ê#:IgsFòáT±Ê(Ւ¾ JFå`‡¢ªV•¹—øe>•–ùÐÈsಘgʨ Nº–œH +ÞÄÅ·›*ŽŁ +v™ÌaµÁß/šŸÙVÒ9â’Ñ$H]ù6´/+^±¨»S;Dgài-ïÎé +VêÁw}q¤Œá¤šœ5óQ­ãH™x8Û5£ŸutOvŒÙûûáÕÞÌÍÃ$ߘÀòÆTcLáYù=:zxyÖ_ñù‡·o;8ZÅNÎYoÍÝi$w;´þ8³å}éžÏàé 6»k †þ£K€‘Ê£@¯ ÖHvéê–S­õ``0úuÆuwp0듸”编=‘=~®…y(û}àOÏúÞîølVœU‘²›ü£¬;þscò­é¢Ð Na µNƒéÎÿTfÓ(Œ÷™ÿ)sÿ%3Áw{±0YdLø½X¾CÆòöÀ²¿s7ÞþuŒ +±üú¶? §,êOy}òùSŽ?¤~–£Ãw¸}W,$IöqáGÁÿ¾™é±^šDZ Xxß÷Çׯ^=<e “„ª.ôÿ?^D„ +endstream +endobj +726 0 obj << +/Type /Page +/Contents 727 0 R +/Resources 725 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 662 0 R +/Annots [ 720 0 R 721 0 R 722 0 R 724 0 R ] +>> endobj +720 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.191 181.835 208.619 192.739] +/Subtype /Link +/A << /S /GoTo /D (main_CH78) >> +>> endobj +721 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.494 181.835 511.506 192.739] +/Subtype /Link +/A << /S /GoTo /D (main_BHMZ05a) >> +>> endobj +722 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [460.906 140.301 492.786 151.204] +/Subtype /Link +/A << /S /GoTo /D (main_CC76) >> +>> endobj +724 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +728 0 obj << +/D [726 0 R /XYZ 90 757.935 null] +>> endobj +729 0 obj << +/D [726 0 R /XYZ 90 733.028 null] +>> endobj +730 0 obj << +/D [726 0 R /XYZ 121.551 562.157 null] +>> endobj +731 0 obj << +/D [726 0 R /XYZ 90 547.487 null] +>> endobj +732 0 obj << +/D [726 0 R /XYZ 121.272 253.487 null] +>> endobj +733 0 obj << +/D [726 0 R /XYZ 90 238.817 null] +>> endobj +734 0 obj << +/D [726 0 R /XYZ 90 212.545 null] +>> endobj +735 0 obj << +/D [726 0 R /XYZ 90 158.921 null] +>> endobj +736 0 obj << +/D [726 0 R /XYZ 438.959 119.543 null] +>> endobj +725 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F78 539 0 R /F23 340 0 R /F31 472 0 R /F10 473 0 R /F11 418 0 R /F8 504 0 R /F72 471 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +742 0 obj << +/Length 3825 +/Filter /FlateDecode +>> +stream +xÚÝ[[“Û¶~ß_¡·JS/Œ;@{2‰Û¸NÝÇÞNgryஸ»L%J!µÞì¿ïÁ…@‚’{ÒLŸD‘ pp®ß98ċ»^¼¾øúêâù7’- +TH*W·‹/”$HP²¸Z/~X¤W—c¼|_ê]SnV—Tàåë¶^w«Ÿ®¾]pÂf +æ³/Pbî^üíê◠7ñ‚ØI…BŠ‰ÅÍö⇟ðb ÷¿]`Ä +½x´£¶ Nün.¾»À# A…´§Â’RœIáóoŽvˆ—”#Æ ÷ú›†«by¸¯;s¥—]ucæq·+w³nínýpS¹ÛmX +ÞÙ¥ìƒÒO²ow+"–ëuµvO®ŸÜ“ýŸcS_·eû´’b‰V—¬Ë•Tnºe£ã_{çùþõÅâ;Ë_ÿõïÕ¡Ü`ñ“èfËÛ]ëV+݄k[o€#1à€ã§ãÀºênÚzï÷ œÛݺ_ϸZï¶eÝ ám…$åîí+³¦È°øC—ÝÃ~¿k{tx\˜Ö=j«}[uUs°,ô#,½v¨›Žö<5÷Üê/,dIAU)¨…×½›]s×>T͍'©{êÕ6§4€þ½²Yg&'a-û1†7ëÙLÕT­pyÊ [.™dH‚V%¼§€aÄÁüìF`Ö¯4Líxþ#Æ´í^VF×U†LőRE?Ѧnª²u/Åì0ÿÛSËjãù>%‰Š4vüx_ßÜ»7A<Û^'üdզڂ»TeÊüʎ È­™ø›KjØL}LoÔ¯†©üRFXöâÕh‘÷G¶62úoŒèvm?¡ù÷äÞ¥ˆdDQÏV¾’¤Z^Û_¹¼uoÐx;T!Bøà ÝÏY Ži½Ï +3ƒ že¨â¨ÐAu3DCëüˆG†IðB¢B1íVQVW/¼!ßf–R¨`t ºÎ,‘’“ÖU³;ô¢2Ê2UX®(HÆf§;á.f +ŒG{•Y~(EΖÉ÷™U’/zÏ:]ɄB"9g'ƒ«~Œg¨N˜Žù ¾¯2Œ‘ñ¦o³Ö nˆc-88L•ºð·Õ!Ã"Á Ö~Èòµ Eàë%ã¸×¢t&p0£ï²zf´Ñx™™‚#NõÈjZŒÕ Œ¿Ë°#±p·Ümpš/«Òz;͖Ímγƒö&Ò!€cÔ1ó+ÔÅ1uùÌFœM¬Ói5Äâ=b“ݲÖg< +¼œêe D¼&E_ف83@ŠÇ8ëa‡Lˬî¦Ü”m—óS >°üÚ{Ϝ×4! Bç²,¡Î°L· šN}°"Á'ÙА۶@Z kßg$Î` <Ù¨D,0æef†D{Í!‘Ã µ³¤ÇmI;Ï-æ=·F,*t•(.‘wiçøu;€ ê%¸5ҍ̻u‘ ›8‡¸;u““9)Qô”k'2±“Ñ. œÈ>HpÕTHXdc›®:¤°&x„^ÑcžR†G †ì½2Á9ï8ìèô]¹qóñJÓOÅ£èn¼!·X$æKª!à¼õP(æ=À0“NoO4ƒ“»¯R?Xtι¶È7ü&þ1Ï° ëiԗ<Ðó£þun†Cÿ| +wD¨¤F™A?AüdºøL˜:Rã—»OR ›Œxo{÷U“!Ž +2¨A6H@ª×?—S’pàÝ¥ ªq)$W £Á‰OǙ—ö‰0™¯¹Û•6íƒ;‡»“MÂLêDBê´oWÅ¾j3TPã.ôH™F‘¿÷? I2 +I†§!$©8"Á~Kr‰<ìU'S ðI(þˆ®Q…¼ fÇd¢)ŽžÑ›SºA¢µ‰÷ÐX蕥úå¡Üԇ§ ã.cˆë´0'DñÙBTŸ Ä o4¸~ÔéPDƒž\gq5U2É2&H„…4$—¨ˆEàÇpš³% JS®²×y¼!(ÒbXùցŠ_ ÌxʑI }jÃH…äm»[?l²•ˆ®JOjG)ß X&ÇøùWH‚gÄ­A³¯Ë®rìøXnªÜ!„ Ú`KÏ;{Ñ»7H}„ÖË«û‡ ‹I™–*§JHèP#…Î'>X±ó\t&AIÂÎ"|Ecï@¶Á{g¢?òOºSñû"|SA˜CøÊ@5N!üP›Çk32ÔfìíNÁÝòvEÅÒ vwîWbùál¿)ÍûSÜ`¼;ñXEØæ|¡’Ft +iŸŽaÄC8Tlæ +:16ÃV@˜Ù 6řX~Ä@¬u‚å@õOFêi(Àô,pIOƒK]’\Ö3©°‡°܊ +nŸZ/ÕÇÊ¥øT!êY®è¸Ï¸ÊÄ"p6íŠ<åA§Ü՗«$ŸôVMm¼“KÉÛ®Êè¡ÈGÅéùŒÂO +ÃÙC8ÙîOƒõQiÛǺ«²'D¾×ÌyðpäA?çӝÃQn½ùT ÌT¦{Ž¼5ˆšæ¬˜ÒX¿ŽsOÌsOƒÓÔIyÒb; °Ìa€ñdPI´æ¹`Þ±ÇoL €•AQoýFLŒ²å®Ù<¹[ý£ª6²Éù6`fC™ #NfúÍ8€kÙ(jîìüRqÑÈÑ°"Ë\¡«`¨8]ϑŸÎðÃ}éiꀙÝ퓣´t÷¬yՇÊWú ‘â’çŽ/sê„ `óU–F4š­GvGʀX"êÈßÍ8g}Š=‘5‹4 ‡òpšÚäR&ÅU”OÏ8›ON³„ɸöüvºX$Ó#àÁ&Àc˜á/ÙmތN ’õ§@žñÙ³í?pN­Š£eίHðer¼…IJMzGc«‰Ï³C635äž!Á›Ó1žHÌSʒ#ÿWJ•í)=z¢=œŽç„‹ªcňŸŽdXqΧMYŸY—åB·FF[Äߐ¬¿>sNšR4¨>Rl|8k“àÖwÎdUbhƒ°^ªŸwÔqð[\ +ƒÌZzÊ¥§\Š°gj±KñB„èŠ0–©½1Ÿ’SBSÒáÁ¬·T€‚/y•—“ãdÖËè‚)R±Sž£ˆóm:w¢O´Í1üP‰2uOÈDH¬­aÎÆQúØ3Â:BçLYCDÀò?bSλ’¡߀,ºØßrXùÐKZèèìè¬ÌŸ_Ëí~S=뻁„c–†S_Œ!i£5*%ÐÀUГ”)x;*ÈÏå üTÞP|Ñ2çGªÆXñ\ÕXOZ ¢1dÊ#“/å³ÊQ™‘¦,ÚVeS7wNAӒTˆÑ©¹ÝÏWæG.I¾© ¿Jƒ©ÓVZœ'QzNmäw>8!Ñô€f%šK‘ç;œ^fSäˆêÿSÆÌh:9­éÕ±…^î›,AٓŽ·´ØË 9•Œœ.öò$ìDË úÍiä4ƚÝP™/V}¦c¯*wñÑT l©þj—•Áí²q¿Îe›VÔÎúÁ˜-$h„/;¸8¸{×~ºkHêû7‡òƒÏå›ðh·öe;zM§1Æ>ëjßõfΌÀ;’/÷jÒý9[{0á4mÏíQ½ ®L`j×Uë¦àŤkL6·|ë­oæèÛë3SôŠFÙà^دdXQDµsӅA¸m¡܈ +ºà›”! 4Ãl‰Ã¾8ÛKGšªiG\*JŒÙ¥½–KxG!dš.­23x'KfQhHȼ¿Ï½¢ÃT%˜ðaxx´õ"¯)÷ûcfV$Ívz®ò«LæŽk]3¦ô.w°åF™sQð0/Æ)€ã+ü¡êÏS ‚º«“™®.lºkÂȚƪðsÖ7 &tžaþœŽNòíÞ¡»>8T|ìëáhÎÕCÞ¬B»v wűÿpªù*Ô¯n‚OVMûq“2™4z¬kÜìwò„6þš¦Á¶¯Ž3I}K˜»î+×Éa?F,Ôā4ª—Ù¸Q©7®&î)¥¹0ÍÃfch®#Šé‘(”lÕ¢É\<çʙ… ÂDÏ2”éø£³/µÅZÙT¹Ý1k1ÇçQŸÂ*ö™¬J* ¾]PúO̅‹’¸è7\xˆ‡X»E¶`Ä 8ޏPŸÁȸC§'4ÛTŠÙob„óYæDi|¤už9MЙ¢3îÑÙ» +aç?Lg¼FÙ–Û +àìøÀ·õЎtnK#šˆ[Ïßδ&†OµªäDÈÁó>Ei’¯pÇ_?KSÇÔç~ül?z±ó†)D„ˆ¿¹õ¼À›­'éÝnót_­Û²gŽÿ"×üùWWµZfñ,ügÙ<ôy‚Ñ»¾Ÿbpº䃨Q.¿Kóu²Û¤ÛÙýÕ?ÌGÚ"ZÙVŸÞ‡ý‹çÏÑM‡ Ú·¨><ßï7϶vMGá|ì¶Ïû¶»¶êÕÔ|˜êÛGüÿ/Á÷ +endstream +endobj +741 0 obj << +/Type /Page +/Contents 742 0 R +/Resources 740 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 662 0 R +/Annots [ 723 0 R 739 0 R ] +>> endobj +723 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [404.084 695.563 458.091 706.467] +/Subtype /Link +/A << /S /GoTo /D (main_BDHetal05) >> +>> endobj +739 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +743 0 obj << +/D [741 0 R /XYZ 90 757.935 null] +>> endobj +38 0 obj << +/D [741 0 R /XYZ 90 733.028 null] +>> endobj +744 0 obj << +/D [741 0 R /XYZ 505.567 657.182 null] +>> endobj +745 0 obj << +/D [741 0 R /XYZ 90 640.545 null] +>> endobj +746 0 obj << +/D [741 0 R /XYZ 393.496 461.573 null] +>> endobj +747 0 obj << +/D [741 0 R /XYZ 90 444.243 null] +>> endobj +748 0 obj << +/D [741 0 R /XYZ 322.875 245.267 null] +>> endobj +749 0 obj << +/D [741 0 R /XYZ 90 229.293 null] +>> endobj +750 0 obj << +/D [741 0 R /XYZ 222.161 145.895 null] +>> endobj +751 0 obj << +/D [741 0 R /XYZ 90 131.315 null] +>> endobj +740 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F11 418 0 R /F23 340 0 R /F31 472 0 R /F10 473 0 R /F8 504 0 R /F78 539 0 R /F75 541 0 R /F1 542 0 R /F7 505 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +758 0 obj << +/Length 3642 +/Filter /FlateDecode +>> +stream +xÚµ[[sã¶~÷¯ÐL"OV\Ü&³“i²Í¶i’ñîºÓ™î恖h›Y‰THº®ûë{p!P ¤½ôÅA888øÎw`´¸[ Å«‹ï¯/žÿ(è"ÏrAÄâúv‘£…8ã/®7‹wKœ©ËF-ß}ÕÔÅörE8Z¾j«MwùÛõO †i†¨„þÌ„èڋ¿\_üq¡-°é”ËLR¾Xï.Þý†¨ÿi2š«Å£iµ[0Báw»x{ñú9Q((G ‰ŒQµ†Üþžn†¾[¼[q½°Bÿûóe¹î›V7zþ£TA‡Œd‚ ³ØÛ$TÊ$gã4¡G©–?Ûv±dÐPŽ=U{]l·åƖ 7<‰‡§tøè´k›î›ªîƒ@sÂñо¹MȋQ&ó¡EJP‘)9vñm¬·– RP€Èúô¤~•âÃp¤¬¨W°i@qhœ™àcolŒ`¹K€2Ã9_ÐL`'p˜6Ï´¥­‚VÏ´ørùx_¶eBrJ2Œò³%¶AØÞ½pÝóÉ:yËCI‰%QC'¬±+ÐùhWPNڕ„U•¶/Z½FÅ®ìË6eV,#Hž2«œcv•g,G¬nÓú¾‡E$¥µ<4˜ {0š;ú.µbü^,êMby±Ìžl| KòQû_;«›ˆ¼ï‰QD†ýë7JI‹tk¸…-gM`»µ]BeÔ;ã,çü8àñs‡J¶(¢*‹äÎy]M–Çq€ùýø¯$² Fæ-Gfül`£è°’¨Ñ1ló‘Eê؄´™æ쳑MeŒ‰Ù4Jè (AK£]ˆØýèï¶U]&¢2ã¹88£‡ å眄‰<Ä]R¦p´'; +ÀhÐ) ˜Øp(»K"÷3šA +Êe`ý<1 ÏÆaNF-É})3"B¤ Ø!…^Zƒº0‹ôʏ1¢(]~† eD©  u½ÀZŸÄTW¤à2?*Þ$dÓkÔQfDŒp ƒ.VšÀê¬8ãŽ_ߗž»RY—mÑL†Ç7å¼®Z–]Y÷†E'ä@‹ae¹ៗ +-MÇ6o­ rygûuÕP ¨ôd_µ;#šP§¶`ñëUo$ˆ²ÂƕÏŽ„öj4ºm›“ÎŽÿ!RWƒÈÝÃMWöö  †©«úÎVX;ԍ+MT,Ié†Éº iDê¾Õå|Yëûà[Ž¬°"oˆk`>•Ö cF*Æý@…¡QPÓÜôôìjož\óͦªïl‹ÂVéñ‹ÖV­›ÝMUÛ5/Íœà…T¸sØ¯Ýˆ}ãƨÝ75h kÙÌ*›£Ýë¹¢‰t†O\ÛßÉúÍí%áv‘œǃB…]'4¬Šç4„(]6J$ ‰þv›Øà€êÞÕü K‰À¼6¿by•ò6¨‘'q­“tX}rF֍ҧÜ-‚Øqìñõ¬ýŸð·`þ8Ž$FÇAbQ@z$ìpX-¬"—^áñô…%\ÎÞÕHøÏї|sØ–7¾¿¿$jù°Ý¾G¥X 4š’ú˜¾JåýÇ !àãÌì."—}ª_P‘S¿„t²j*Z%ŧJyBHï¾Þ#,VwC3ÂÄÿeE®R“¬È¡}‚ÃJ(b»³Q®áý½+tO»›fkË_%†R!Ÿþ:¹$¥ùÊv´)ë¦×h õKU¸Ä°15ðÉZ½äÌñhNWýÃ~[&ÌMŠ‚À8iè6-;á¢l †xœœ°|àОÕ‚vEåtÔ; ݸ)¤B"lÌ{Ǡ흶^íM"Œ<ÝùSח»ä&¤ž&à Vòv%cófñÈãAä Ô~t®ï±Õ^ð°_á“Gà=åyîÀÑϭ苏]4|bÑh˜©Ê›ã"ãÚu†´â×Æøú\ÃDÑ[s4£«ÌJ%‚&–zDš1†P~\<ÃX}ž +ÌÉxU…)Á™xUHDÏfîÖ @M½}²UöU KÀsÇ&…™š0ŒãVFÌ*Ì{#î³üD N½Â¾›q"¹_ÿc(Í ±NýO¥9È>ðHÈ~Ž¤ÏlZeÆcƒ‚ Ÿ8ùB[ö—œAÓyDDóLØaa¸JLÈYä+÷ÉĄβÞ%ÆT™òYÅOã5@pìÂð™gÿn‡»kv©L¾€)yžrFÎ3½ …«´m¹úÃX–+“èĄÜï`~D†;J(÷ OžëdL8Þڇå™òC§Î\Ià9ôL½çˆÏiò™{ “Ý-°4Á ƒ˜9¾åúó¬mÏ@Ûjr‚Ãð­3*>5 ¹¾ôÁ'ñò„ çþìⅦgb.¦‚†¼}©ø@g¨“„ð +ÎD̶%9bh ½i"ñgñ¯;D˜¼Ã!ŇPÐGé39*¸ÕÃA㔒ߖz\5‡=žc •Mˆ¯hŠòI¬íA‰qgˆxgH0ðjÝlszö•mGrމ^16Áâ ±ÉÖüðˆ5Ȅ¤ _ëÜo¬¹aÈ)Ó§=*a, +Ÿ¡*ÊÏçu†‚Ë&€ýS:}*(?"’/¥½iJ:ҞeóÇmžg ;TÞ©™‰ÉÌ&CJ™ŸZ°Ã}>šçùà£a8̈́õLÐX({âî®Èq“Ñû’hÁã¼?]vÝ8^ÐØl5ÑâÔeè›Þ&^ÉxÌ3¹j¶’ç·‡7‚ÓК„Zâô Ž'¹@=¬9ÎÓۜÄ'–fjÖþm ¹àÐlm Ã0Cº0ãeóp³u©¾—e·n«½?§3'yCü;^Ï<iÚëâf]fsɆ‹’úÏlý¾Ù>ݗ›¶Ð”•0ö¬_ÎdÜ0VDOE|4esÌ­û»)íïÆLñÆX–®Öé|ùЙ£G]UŒRDýÉ!ˆ@Ü|"Êñ—/棜ã$cê€t¢ºÒô^Êä±Y{†(>? dÌgÍ_¥Ş­Íf›ÿ¨hŤ l7àT]éÉþîÊ¢îlÑäáWgÁ,äãÆÜ f l"³†Š}Q¹57zùÒ×z^ &NšúkƒžPES~H`‡sÂd“@w<0άÇOGÞ,LxžºNj 6m~ 0gF ê4öˆµH1,Mߤ §ý6íï ~@ÙÓ¨*ìϺÙ^âå¶\ûÎÍbÃ/,6€u_­Ííø´-»‡mï¾·˜Ò>Ù§NÇ?ÐQá4'2¦¦+í×£0)PÒõ#(YM¸©DŠèîí9£½¬ ÉÀ˻J¿²½ÖömcnAH¼üP™Lº$vrðۖûÖgq\½=KÕïíµø´ØÞ5mÕßï:ûÂN +ëf·èGI +Û<î7Óížé=Çf5Î;9ÃËcÔ9æñž†Û°MÆL¨Æ5 <ÜK¯‚®]ƒ‰Ôm,¥¿‡}Wº~ôœôït¾nŒ-öǜ—ƒ‹Ï0¸·¯*÷=PÖ»ý¶ÜŃí?jÑAm³·H;\qnt°|s‘d¸`RtÓ³Õ@¡Ç~æ/״ݸ/Â%ñ×ù·¦Óþïâí¾X>¿‚yv&‰0¾Xi#EÜTÛªútbF!},å;+%r¹ÆO! +ò‘faˆ=='bŽ9Ð(é«ù š;äWR}þ=6àñ=6“ õt2ÃøE_Tš9MÄcÕÌÜV‡M“%v ÇQ¾uÓ¶Ú7µ½°¦ß—–ͳ]¯Ôm@ˆ(¼¯ú‚ÿWáÎpaõ€1M˜Îµ•\y3R’Í£¤Šé<™58L |ތô©³Ïöª©îÊ%tñæwPJÑÒl«›¶ÐNJ?T®Õ¦´7ä6)4îÂL^]˜˜þ” ŸÔ¹ÿ5üϓ_è‚çç,P¡ÞÔWæ*B»sÿæt5úEóøó0%ýð®l‡7úù—¢~.j®ä¼t7‚X.ʈ»÷A–ß–¥›¤Ù‡ÅPú»þg2&|”¾ª<Úý}ßï¿yþüññ1[wÙC]íÛ¬êŸï÷Ûç‘Ú&³ÆÀS%‰)ŠvoÍp°ªµ1&q ÿÿ¶fB¬ +endstream +endobj +757 0 obj << +/Type /Page +/Contents 758 0 R +/Resources 756 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 770 0 R +/Annots [ 753 0 R 754 0 R 755 0 R ] +>> endobj +753 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 501.948 122.538 513.903] +/Subtype /Link +/A << /S /GoTo /D (main_Sch99) >> +>> endobj +754 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [221.791 501.948 275.798 513.903] +/Subtype /Link +/A << /S /GoTo /D (main_BDHetal05) >> +>> endobj +755 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +759 0 obj << +/D [757 0 R /XYZ 90 757.935 null] +>> endobj +760 0 obj << +/D [757 0 R /XYZ 90 650.945 null] +>> endobj +761 0 obj << +/D [757 0 R /XYZ 90 644.345 null] +>> endobj +763 0 obj << +/D [757 0 R /XYZ 393.867 463.9 null] +>> endobj +764 0 obj << +/D [757 0 R /XYZ 90 446.48 null] +>> endobj +765 0 obj << +/D [757 0 R /XYZ 116.849 329.956 null] +>> endobj +766 0 obj << +/D [757 0 R /XYZ 90 313.229 null] +>> endobj +767 0 obj << +/D [757 0 R /XYZ 353.539 196.012 null] +>> endobj +768 0 obj << +/D [757 0 R /XYZ 90 179.285 null] +>> endobj +769 0 obj << +/D [757 0 R /XYZ 127.27 115.558 null] +>> endobj +756 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F78 539 0 R /F23 340 0 R /F72 471 0 R /F31 472 0 R /F10 473 0 R /F8 504 0 R /F75 541 0 R /F11 418 0 R /F79 762 0 R /F13 540 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +776 0 obj << +/Length 3502 +/Filter /FlateDecode +>> +stream +xÚÝ[YsãÆ~ׯà[Ȋ9;÷±®<8q¼ÇqœµâÛµ‰›´Vÿ>=€8 ¸ôªbçEÀ sôôñuO /îxñæêÏ×W¯¾la‘T.®ï/”$HP²¸Þ,¾_dVk‚1^þsŸ×Y[Te³ZS—UéŸo]g¶õ­7u±±R¶¤lõãõ—W½¾úρ ñ‚¸ „BŠ‰Åíîêûñbý_.0bF/ÕnÁ)ƒçvñíÕ¿®ðÉÅR†°Ýbu¿ÜÏî~À˜–¹_ÖßÊM¾ÏáOyz²rã_ƄŸ»¼lŠnsw+*–Uï vôê £eàŚrĸñ«ø̓(¯iAÐ”U¹Îwûö)1çH‘Žð&ô44Þ6ÑHaÓ}µZ3l–Ô2$‡ÑÞx +‚Å´¥€ƒàz±&ˆ—X”FXÓEDô5‰M ëוݭˆ^ö¼•j¹éyë/UjDY¿ÔŸ»ÖH¨~ðÔn R´áëÄ6"FtŸÀšY‚DTm¾ñ ¼ '¢£E˜°î+ØÂXàÄò(F|Xߛã$Du¿Ã ğ۟Ì p,zʌÑVšn¤¸ó{h·wÙûbwØùFyØÝäµh±f°TEœ:(·ªSÙÏ·§ïOmûdûز蕧õDûª(ÛÆ¿eJBQ nLdJó~E“à‚¶R:a‚'é§ø#¨½¤K’˜‰XÝì ‘e»X^;6Áæâ ûm"MÏ m¯¹îÕé§gQàÆ&÷#m|³­üÏ7ahÜÏ~hüa…Å||Á=d+Š—¿¬ˆXæÇûga¡»}¥dÒj·DŽòãA±”/"ÞǃH$‡ƒÖ3–ýтʤì=œ¦û¼‚çµàâ$œqDÔ¯òdÏZû¿Ù ½s2`ȲY‘e~Ûz‚¶;M ¸© +ìÉ77ys[7áÇ*^|T…aëaMкÞÕ͗µž4«Ãûº²¢òK±qòg§|ò$Þ(@Ƕ¸©³úi%…UΈU„&üh²B‰ÇÒØ»b›è$Ú>ª&Hi·‘àO‹ÀÍo,𮿾à훫Å÷Žhî(þ/¼}øóÞ÷SmŸòM…a=2 Âè¤н Dà×\‡ Ú¼núóŠ‘Á@ô¥]BU”Ï‹ÃŽ²vȚ hÙ3r¹ÏŠÐí, +ôÜ6öti)ÿî=mäµ%Ò Õ±×& Mâ ±±Óþ41ÐPýA3Ѥt„ÒîYÞw‹˜g±ˆ@FDÖÿIãD<IàÕôN¤°g½"xÙ ²9Å_ ÝsN*áÜÀ·qö Óhêx¦h„ðx#Vî³)„`ô!G4Þ×D×b™yèށ Œj}O«Ib•T %ø%2;ñ +Œ{DôaÜûÎĘ85?kïҌ7ï|/§&°[;gÅ ,€kúÈÞçMë;‚×WÝnÞغ–ÞTíCŠEC¤b.aÑŠ=KlV]l>…-jѹ„­s$€ê”Àb®FcÒOikÊÀ”ˆÓÚG¦¿o&:†™(ô°Bó”˜bJ>†Ri1²4?Z2seÔ h”ƒ 04»l»õê$p'¢‡4C8Å +Î)”ÀHSzž!ó²ôrÑÌȂL~Ðd§9'" ŸÎR!Iŀ-™t¶¨ªó¶¸µ8Iˆ+òz׀±ÛYª‘‰vdÉ؟<í›Ó;÷£GœUÝø"O`›ÙÇ’€ù®:³w3Þ¥“ÇZÏlT3DÍ»ÜÈ1/(ErP¯~±Áx³<¡caš’*ðʽé˜1/À\cz‰‰8cÏ^N·Y <ÏSX†A¢_̤`욀6`Ÿ¢Yz„f?/îîrç¯\¦ëà*؃®2ÝÁUèö°ž‡«Ì¥ /ÀCS¸:¶)—âUz^¥L>W96/„W9™Ç«œO¼%Á¦€˜ÒåÓìé25wºàmågœC¯R‰_í@ŠË3<(:Iµ=šÍç[ô8ßb<~e:¨0tD®&H°ï¿­Ê6+ʵ74TYH?±4Ey?õ[y»îMqˆ} —>‚S2Ëi¶Ûl £ïæ<¶k¥.ѓÓn>mž„(š›'Ìó·Y›—èw<=3¹òÝJÈ-‹ý·öýc8Lêáb–ÞpAhxØoó@cÓ[E>i“UA)‹ðešjg½ë>>4ùÝa­ül IM±Éƒ­ïÔ"ª+|Ðzè7ͺÜN˜¦µÏ@³ªa>÷µ6¶Ýwþéì´Íîׂ}·ZÐcu£fŒ±‰2äÑ +’¡²€Žm›Ü3@Ï{ °1¹´ML¸UØc°Å&¹D2àçgl¸8uÿA ?"‚_gfSÄ)ïôB[Û%¶¶æù9³ Ç í}ú·ÙÏ6S’—ã¬^HsZ3g¥Ðßc8‚)Êp}ÅÆ` À:órj|81O92T ·Ç£€Lùä `ãXŒ0yìUlB°»Y=çµððG›ÑúôHvöžÅNÒ³7€€ƒc~¼S¤a#›ÏÊú­‰TË×ö!ýCuO}çû×NkÆRè`ý ÷i8%ô”öü'ç¯øéx(08„žÃ)|–Oi`ÊGÓí,*õáÐ'0ܞģXñà@kÕޑ]'/I à¿uD5m{¼þ6©xÖ Dƒ|,½›X0ÆÌÅ8ëöMxç +Œ£ÒÝzÜ=½†Â6} ÌÔÏ*FÙøoPÙøó¢¦N‹ÚX7æeM\"k.˜Ê+ÁÂ4¹8Ôs!à9§û”^oºk†Dšÿ›ã¥Ç"aŠ„ +_¥ +At)ýÈ_¾Náf4„ÊÔÅ ¤/½)+Àµ½d—ËG‹_²'ß°øÔÞ¼7yîð´í³hß=ÿÌOsWm·•‹9š×FSWP7<ß¹»NK9S C©FBòB‚é,µ½ +ˆ \©ÂZýÃççnÛªÛÛg6 v,OVÝš`&—ícô"ñ‘•ŸZñAՒðŠ exœåó©b c“Iá^w »éÀWˆ½E›Ý¸ŠhA´íòÍ:ÛguH{NÔC開Hb@ +ñÌ}}âô:ßÆWÏôYé8>QFÀøjy ¶O_ˆ5£"«D¾wµm›MI?N*ךéM}Øïw ¸wCï„e6Kô•2‚÷µ®Õ¸ùزuúVùŸG©UUû—¬_9÷'Ë£Ò¤‰hQX×}¨X¤KA$… 0`Ðûºñ„žôSÏÕ׃h£º;¯™;¢_*I(Ü=l󺄸¶Åhr¢3uV6@³ Œ5>‹a'¥ß¯ÏŒÀ£ô™ÿkŸ™¹øL ðkíírœ˜:d¨_³PkÆ´¯¼å»ë!·¥Û¬Éw³M—íŠ,¡›,óÀ‚¿¨f,²³]ò^b«j z‰2¡ØÆÛw# ðWSj·Ž³ˆÅýCùU”›â6oPŸ²·?z0_CwÝö ¸««ïÏ|ǜ‚ˆŽ½€²õÌ4å(ÃP¸ðöØ ÚZ‚)“DΣƒ5'™…‰®p±¯GË"·Ÿõé¸:üÚ)<°ñ“‰í³8lƒéy,¶¡Òñ&O¥îŽv†‘ÒÚe¼T§k…ãTi.·9\mS#ÿ³(<1žÕYzIåÜÉ“)†egexØ9žáòrFG ;>o{KªŠ‹1k +›&¿xÁœ;HO*ÿ „¿±â”„‚w‚v¤`É™j{Ìíç°WT‚©»­³¦µe$$”ü1ÌN¡ cÜÝÌshbƒŸÀ]'¯·¹»J #ìëóm‰“¨ƒ#9Àû°@:k®ah.N»3…!”¦ÃÀèðîLQ8· ¨!¢ûp|‰ ·¡ëd¸»ÛœG†‡j¹ÔÁ‡ õ2¹KÂ帨–ÕÃÛpØ8÷ï¡4Þ}I·}Ce·Ï§¦Íᣝ&Àc4>ðs£=WgOÿýK‚B€_=ó¿¿Ü}‰8`€!„ABðQ|Š—ßØÃÉê]6-wͯ†è/ÿÝäõV`…XùYyèêþ­™:J&€ÍÀˆàÁˆ­nï6éwöó¢{ûû•ÓšÈàhåî€Â‘<´íþõ«Wè¶A‡²Øרh_í÷ÛW#¶Mv Æ ºw×Åð»ªÎ»P.£¦üÿ/®Uz× +endstream +endobj +775 0 obj << +/Type /Page +/Contents 776 0 R +/Resources 774 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 770 0 R +/Annots [ 772 0 R 773 0 R ] +>> endobj +772 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.22 601.178 370.057 612.082] +/Subtype /Link +/A << /S /GoTo /D (main_Operations_on_Convex_Polyhedra) >> +>> endobj +773 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +777 0 obj << +/D [775 0 R /XYZ 90 757.935 null] +>> endobj +778 0 obj << +/D [775 0 R /XYZ 90 733.028 null] +>> endobj +779 0 obj << +/D [775 0 R /XYZ 195.948 674.806 null] +>> endobj +42 0 obj << +/D [775 0 R /XYZ 90 657.762 null] +>> endobj +780 0 obj << +/D [775 0 R /XYZ 371.551 604.331 null] +>> endobj +781 0 obj << +/D [775 0 R /XYZ 90 587.621 null] +>> endobj +782 0 obj << +/D [775 0 R /XYZ 245.118 494.314 null] +>> endobj +783 0 obj << +/D [775 0 R /XYZ 90 477.604 null] +>> endobj +784 0 obj << +/D [775 0 R /XYZ 269.572 425.832 null] +>> endobj +785 0 obj << +/D [775 0 R /XYZ 90 409.122 null] +>> endobj +786 0 obj << +/D [775 0 R /XYZ 418.817 284.643 null] +>> endobj +787 0 obj << +/D [775 0 R /XYZ 90 267.932 null] +>> endobj +774 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F23 340 0 R /F31 472 0 R /F10 473 0 R /F11 418 0 R /F8 504 0 R /F7 505 0 R /F1 542 0 R /F13 540 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +791 0 obj << +/Length 3352 +/Filter /FlateDecode +>> +stream +xÚÝ[KsǾóW *‡€ea4ïeùŠ¥Š"َÄäb;®°$WðbIHùõéyìîÌb@€ãCNûjÌôôóëžž\OðäåÙ_.Ϟ¾lb‘TN.¯&O”$HP2¹\L~ždÎgc<ýqS6E[­ëíùŒ +<]×þúÖ½,–þéeS-,„M)?ÿõòÕÙ÷—g¿Ÿ˜Oˆ›@(¤˜˜ÌWg?ÿŠ' xÿj‚3z²sT« § ®ËÉ»³œá˜YGÌR†°žÙ¦\öb6]”¿`L몾¶l<}Aã…*‚0¥0°ûåkO‘Œ.‘V¤#xCŠvÕré¯êùòvQÚ>-‹ª—|,¿-–𦠜8Y]{Súðƒráß-ªUYo-×^>ý¡X•ËÏçRt“ö¿š¯›¦ÜnÖõ"¬i2S +iÃ&3ŠA wçTL‹¦*Þ/\ÁSnÿp3‡ Û¦¨jǼh×þú>Pº5ğô‡ ›é‹s"¦ëƬ`œ¢ž—Oüãý¼nZ˨{ºjÖ«À‚ì,%£Æ`ERŠ™Q¥§¿€®<1#1ňÀªí[O¡@sF1í´Œˆ†$‘ž†fm`ÔYDUÔA(V±Ý + +/q¦("ܤ"ooªfá=`»)楿íUûÄ?{E hñvÙúû`Rp÷¾‘ "ŠMCLYÒ,0ð &ؓêØÈWt2Ó«ŽL2 )މñÓ¾’†Ã„ˆÃÅåFá0Û$¢y‘CªÜxô&œ4àÞ +„öƂayd64è‰#B˜§»Ì؝e‚ET9ƒ3ˆcsÔÞ¢Aؾþ¢L ƒî\ „qg†RéëtÁa­'3 +R!Gu*Žè”=¶NiN§#}I˜W™7È/P™‹¯3N£ád{əœ@ž#¹ðDI’œQ ÉÁÎ-8ÂFõ©‰,ߖ«õ9ÁÓ;=À—ÿڇyÿ|՜=u11vùÁ¯ð´œ·.¼Â‹w.œì-°jm(ˆÇþžA6YVùì6ÍÚFê»jaó€}Óî,Wkÿ°v}݄oWvJi¦q̋À¼ýbKÒUø•‹ëö®ð—Cq‚Ò‡| +q¦²A238H |”„/S.VTg$$EDaF”•uSÂb ÖÛYˆí¼B§¡(W½«´«ÚåD¸+ü¥.mÒÝEq;ÐeHˆ€ òÀ®2+—ÃBÇKÜÙµe̚‚½Ò>p­2ú% ÒÇ È·<3 L( Gâû„núpŒ¼P‰†Õ¸ô¡¤Ñ—••×53‡¤—$\¶eëoÖWV†&…36“ÊY¢`ÃÁKEÌ,‡h-û´f­ú®ü͙òo‘gÄÊA®ŠÅ?tîà˜Ýf]Җxà¤ÏûfšŽnÃD0éÄ®¶›r^Y€Z[yÿy Æ8ÎÛSJÒB]îpòYù2#Â¥óe£>³ª†ÙÈdR9QH!½É[?C{S„)]D1=–t×=Qˆ®º7-ë> gÎèðî=SàC3=ÒóMu ¾ð[çØ319ÖÀQS0F[B¢Š ð 47Å9“A~Þ pݔE[6ÝhEPq—:n?®s®­€GÊïS”†h’zå8¡1-Æ࣠À­¡CB“!¡½)6›žý~Éã¤æ]ö+Ò½(ŸvŸÞ…„`ÔGÑU±9É·¡^ä²ÿU”!~Bë…öÚv `–íè{’-ÇW#o-ó°ë¦ÀŽæ[Ì%CU‰!ÎQª FºGˀ~#Í"ªbÕäbPišÎ6¶tëÌ®ª?ûQ@ 涞·‚‡l¦èMÍ!Y*z«¼È¤$uÁUKÝϑ¯F÷ˆ# × {‘þ¢ºË3ÿ²Îá ƒ +Á™2ËÝu$$3HÂi׍H µÈCq¥°Á–{½)ü‹V^úì¼½ßô1¥ÍH– ȁƒYâ2XŽ'Oa1)zîä0Z§2FÏÿwZÛg4 +ÉÕàŒñX&Ïsè+V¤FSj«lïLþRK¬àµ7ì.Ä£]ÕÞä²Fó?¸B¡°ŸÝÒö[6“„‹¦Mˆ•õ:¼²‰_fÁ€Z Ù£p.y/ã~’ž,üfX %U +¿ÿv•Qj$kF Þ ñ9 4Å:[L“¬‚¸Â£Ö)ÓtZ¡u·6E +R¤÷¥Wi‹#òЮ—hª­ý¶ `—Úa–rÈ`ÍgW)~Z׳L8êq‡{ 0Á¦À­ÿˆ,6·5üõ-˜Ië?(~g„Iþ¨iz›ÙXo‘ +ñhޏˆÖ}áÚc´ÿ”Íz6”–ÍððÉ~¤–À‘œø.P Gži‹ó]µ-ïi˜VÛª+¶!Hü@Q,¶M,ËëQ »tïˆv-*Û°˜FÚÃeðbF!øèqÔ…÷Qf½Ë,„»"¢5ÝËæÔ§æ ä$0ECdzʈL ¨ËF±~Ô¥Ón¾h£.ì8¼H.âî„4•[&…[×¥9iì´uª#ëÔ{ëÌpƜžÓ +/bSÃj?¿Æs*¦/‘(¯°pxtŒw G-Çüj»ÇÔD‡`7T@Nøàk/f{bà蟊yëßÏ×{øÃwÿ•A$uª8àel×fãÞ&« ·P‡ ݍY{s¸ÝØ}±@êä0¡&~³îªM»/V,‡ƒ*×Eœ¨G‚ëú‹à:|%¤ƒë +‡MvÝaH·2´Ê¾ëÞYørË·ÑfŒaì0ap&¥÷»vÛ*ð|›Óp×ûú©‡öZÆ ®¨sÐ+B9ßd‘ðs9ƺéblu`¬1'aÈ#ˆS?Æ {°u¯wE,äÝù7“Q“@‚Që?ÁðC/n„äÔÊ.ßÔbÅÐN¯žð6£.2Wâ6U¸óØižm¦Ý[ˆŽçJ»""Œ¶¡‘BŽåÇ¿a ”zÏËã(þ!{܉í©£]ÀP&dr 9À©o݅ªœàL,¸#»z‡ZEµdƒ³Ð2=löÕÑìQç:ÍÞ?æú? +Ê Å7‹ÓÔ ðäù©ðäY®Œ×JÐI¾) ´Û§œIŠÀ€M†­—C[à`%ÿðæÀp.+Ók8ñÔ6Gzع‚uœvì@Ç]èѱ˜Ñ;€kÛ±Ð5<ºf”ñ«%*üåPÎ R49r§Õ¡#w”>ÂvÃP¤‹aïX?T¤ÛQnÙËÔèÔoSŸ^£»²‹Sp6lƇù–îï ÜtÇз·ï퉳ÌIP樂Êî: Ýqg¥<èύ뎱Á›î‹µ’sâOp³×/HG)¢Äü‘ÛÁÒR”J¦%òuÛÁچþ@ðßH=Á·c‘åTÄ**™]züÖ_r†J©Û‹ˆº:0Á¡Ã“Œ ¥£œvj¤¶q]FÖe¯²7d…rfBûë²mû¿µŒy¥ÃÁ›Ün²]ÍŸò;ï\Îî)-€|žùσ»û°®êliDœm'§^çzð¶{‘9ß>R™ O úՃF·£â¤»“áŽRÖ½ÎmiÄIæènÿ7¦ñ¿¡$„¢Oý3T÷'¨aBBؖ›Û ¾Ÿ¬˜‹fú.?­—ŸoÊE_÷}gxøç¶lþ|.Ä4èéMQ÷gíÎMØ3úI’¡¼…¶Ð»² ‹ô+û8éîþ~æhTˆjå6=ƒÝÜ´íæâéÓÝn‡æ[t[W›UíÓÍfù4ÛhÕü`çWXõí©ªv *{ªåÿ_ Ùþ +endstream +endobj +790 0 obj << +/Type /Page +/Contents 791 0 R +/Resources 789 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 770 0 R +/Annots [ 788 0 R ] +>> endobj +788 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +792 0 obj << +/D [790 0 R /XYZ 90 757.935 null] +>> endobj +793 0 obj << +/D [790 0 R /XYZ 90 655.345 null] +>> endobj +794 0 obj << +/D [790 0 R /XYZ 90 640.777 null] +>> endobj +795 0 obj << +/D [790 0 R /XYZ 477.494 527.689 null] +>> endobj +796 0 obj << +/D [790 0 R /XYZ 90 510.964 null] +>> endobj +797 0 obj << +/D [790 0 R /XYZ 90 339.338 null] +>> endobj +798 0 obj << +/D [790 0 R /XYZ 90 324.77 null] +>> endobj +799 0 obj << +/D [790 0 R /XYZ 90 191.798 null] +>> endobj +800 0 obj << +/D [790 0 R /XYZ 90 177.23 null] +>> endobj +789 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F23 340 0 R /F31 472 0 R /F7 505 0 R /F1 542 0 R /F8 504 0 R /F11 418 0 R /F10 473 0 R /F65 376 0 R /F28 621 0 R /F12 622 0 R /F6 538 0 R /F13 540 0 R /F78 539 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +806 0 obj << +/Length 4860 +/Filter /FlateDecode +>> +stream +xÚÍ\Ýs#7rß¿‚©<„*/gñ Ìnœ*§*vãäîì½'ß¹ŠGÒx©¡LRÖîýõé03ØäP+Ùñ‹4 Ðh4ºýa³››}óê?ß¿z󵑳ºª0³÷׳šÍ¬á•|ö~5ûqΫúbÁcó?ß7Ûå¾Ýt»‹…Ðl¾éÂÿïýÃå:Ü}³mWØÀh.çB_üãý·¯þëý«_^qÍ¸@ÛÊJ=»º{õã?ØlÏ¿±JÖnöè[Ý͔ð=ûáÕ__±”XÍ +b…¬˜ÑØÇÛfÛào¾餴«Ÿ-¸«´ -¿ ­8›™ª¶Òa+S9+ U¥êØß]he“FèÒmŕVÍuhæ’ye`@]eC«/ã€iQqagÜVLšÐêïL³8fÚ[]§²¤å1ͺÒZ«|Hž5P¼ÿ=Á˜L]UœG6u±‘L©ªºïåï $+ŒÈ2.fSg•sõŒËJ +Ñ÷Ä6„_ßj˜ÿSÛ³Zü‚™8ŽDˆøóšà½™¦û+ы«¬K¸¾Ö â•Í¹®˜r}÷¡áÁ<Î+W^UhÝÆf"Ð,±™¨w hu9ÈÅx€rÈ '—Ëa±š›bŽIªr¢¦(Ê8±P¦Ò)Út¤ê'˜¨sG«`Ïùá|W cû÷_Ž1ª#í'¾…e,r˜þÙþß»ð°#¨—¸³å¡`ç®ú&<ô–"dÊ©bf…Ô$S3‡#±qÚS ÖRŒ«SÆo*ûo˜«æǸ:ôBIª®,“™X| UUŠ©3õ7‘Ӈʌv3,'VCj÷]h–Y¡…4ô˜ã÷¸Þli‘çlàéꐶªµ¤E>4_œ×ÄP¸"Q7ٞ :“%äT‡¼Pê™PÁú º™ÜArÜA‡td£¼¦´ p™× vÂV½ ž0ç*c·Í,žY=ǚGsîN›ss®97/cÎY}ž=WÏ·çvʞ»`Ïùo`¸Ï·ç"ØsþLƒÎ+ƒ®OôÚëIù;êÉHÐÏ¡UÐ| ˜¶Ù*Œ~ k¯ ¯lß۔џ°ùî\›o'›/ϵùrÊæ»ÿ_›ï^Ä櫳l¾<[–ë‰iÛ±ùöˆÍ/Œ¹F} *˜Ž=.»ÕëàßÒf]ÊJYõyRý‡2ë)¶¼VOÂÅ´U'©ßÜ¢¶‘`ŽD¾Ž2¿ÌAe‡&Z=-Õç8è„I?±¥A®¸~oþ•ä¯dCƒk‚ T ~&©Pª +ü(Pø–„#ø™è ³™.’ÕóÿRLÑ#4¬Ð Å7SBåÖä(ÏLa’!”¢QC<ê«kà·èš°/ÿt·¼ibd +vk¸øËö‚»yӆw‡RÉ<˜”*꟯à÷¼®ý÷W›îB1Ð:\Ïüó1<¿ß¬?Ý6«í2Ü"ÌÛ5>ðô*¹¶71Úõý7¯f?úF?´ÝͺYüí~µÜ7áw_]_=ïgO¾~è®Bˆ-ô_Q[¡âl¾¿×íåv¹ýIÚnÀ_ÛUg±<èÝó!¾D…ß{=ÆmQëÈkßVX3ßøÀßf» ·ž;xqƒ¡>P=àþÌoZ,0ª ¯—øÏÂ3x±Ü¶ËËuCm1ƒ˜qPPI‹cj••ÄZÚÊZN)BÖm×,#ÍaaÒ»°™ÐÓ°¡G#Þ@K˜Ÿ0¤=¥/Í°­n ¨)Á6æ’ÜْéÃövT¸‚9…Q×æ*ä>n´/hËõ@Ã%©»…Õ£î^ÊA!ÜEñX5ûf{×vñÅ¥i!e PAG¡Š~N.”’¹ù~»ìv Sw>ŒLyáÐs‚Ѥ¡Ì+"Øqß,€'pè큟“«% j1¶ûHš ¨F‚1™ʄ6“©”´GÈ«EÈßûK_Òu‚ùþ°–ÀÊ/Hë“ÀËÃÅAù*ֆShÑX™.Í[Â#ÆÙÊi8Y»Ž¶†’VÿBŒHÅ1þ9ƒe»ËÆÙ`ûÛå¾Ø»p¿ìP}} +7÷›¶ÛÀ†«4¶G :ÊMéۓ šÞ.ÊÔ³¤Ñná—×&x?!Ra*): xtÒn{’5yO¬‚&•­\ÛÅu +P±àvdf­&µÕÿù;r49î¢ý†Òq0 +(JµN³Œ„suÐËL×Ï{¾-a˚PÌ^{÷P÷¡Ž¿P¡• !ÖU¼¸ädC!¿8@Œ…¯Öeê0í'DqzSÄh¯Âà]®¸sÔ#pþD(ßǒgüRö¦ ‹ñ´§—UåfÖ¤ºü©7M'*ÝgakqÊùĝ%*fT¦8 +›Ì1ë@ŽtfËòH„¨1'êÝ©^ÝFmE®<ì5Œ^π±¤@àžÃ þiˆ¡´7v°á=Þ¿½ÚÜÝ?ìÑ©À;ï|HÉK ¹‰—›ëðþUy sڞRzNíŽêV }þÔcñdS^Ÿëg@¶ˆq³‰˜Mø¬ÑfÓÏÆlöy˜ ]ëÓ^AÒÃ1¯`hP],´Öó¯žô‚Óv»ý²»j^GwÀã”ʍáîáþ~ƒŽ„„Ùâ昼ð'ô„´0.黽Œ½`ªY…í.¾¸t›n±mÖC= >ó´øfmG@»ø ¨Â’ PgšÒyåö0¡épö´^~*hÝ5ûðÄ﵄P€áîP‡¡ãÖÒ#[ç†'C³éI¹&&X£Õ£Þ£Áöa°Eé̤ÕÔh/B²üÝI–GH6$ÛÏåòÅÐۈ9Í=Øÿ¢®Ñ:u rÞ^c´ÊÅ‹«M·kA£Dã}‚'÷#•.â| ]géèPS3ŠAበ÷‡èÐH`&‚‡E˜È?ëÉ˝-° j`½œŠt>…þ|?*msp¶~ : •Øò³äô€æp@2c¢€ ‰\³û˜è Mph ì*|òýTÒ$_¢ke%M¬;™4Ñ)ŒXR<)Á6£"6Zd‹I’t-!)Â[bàúœÅÀ 1°86pY +uIH.¯Fóû㓼íÃÐ6†¡…ÑÄõŽH/G,‰MÛõ:Šã5F epL}ÚÖ£“µÄ,Rt?(YÕc4í;Ê p–S‹QØjγÕMu:.L³í€ö3âFÁƒýÆ'h¿ñA°ßøä˜ý®AŠA1§Fù˜íæ¥íæŸiUαݺ9fM†n¦l’lŸKò¤íÖgÙn}¾íæŒVÈNÚ³Þú ë­OZo,†®Sy¼m¯nƒìµ š™¨ŠA2y +JñEjNµ<œ´&M”Ÿ’ÌÏA•e曍…hïcPÎ ?ä~¹]Þaƒ°ñÊTLÚs ZIrQœ” # Œ·òhQâ°à) |ö>ª0¸èd!dÎŸb>I$ÁÞ­£¸Scnp"#Õ|Õƒ± +·—ñq$¸´x³}hÀ} ÷»O»}CÕ +Þ²v§ÒçYíÁG2¯Ò²E*®–&ÍAJjý„4i +’OQíóGÚ>+}:­"í@õ'rZìŒYåui5=+K̊(¥ÏþÇ @*Äzþ§ëqՃé¬a1e±73ÇAºÒq€'èÈ{yۅûËÜüøw@[5ÕkÒ·¿›Õ/^¶ã÷K äB°ùÃ>ÜDáv£§! O#̇ –+ÐCâ<`¯Ã9Ò¥Ë9 uO"Ô9lõ3ñ³>Ÿ AzjEÿiü¬Oàçb_Ɓù¹ÓøYÙs%Ãåø9Ø!Ž‘!‘§ÇADPT¯ á$ãa½o»›p{ÛºÚWÇ>Û +R8j&Rlë·VJN4ñÊ«èý²í"e°%=¶OÛF ë¯o}œ/üp³]µ`šøn¹o ¹ß7Ûeìëç~¿-uËðXrήæEÝJ_ý³n›ü¤î;Ê9÷•—áTWØq~mæ'2b"T¢þ<õNúh3ց¡ÆøþB*QÆו •:!Äï“ =¼K‚ôªÒÃ㲑u"CìP…8½:§àÐ$¹Ç#‘פöõhœTª%ûJŽ‚SµÌâÊÎ&qe zŒ+/$8{}9ÂX— D·A.ÅÃ.†ÿå.†Gm—u.æ» à*<Ì71<è71\NmbÍÏ o[ðåùax†°æ@f¾[3bR"â-bWO‰!—ŠÅe‘²¾l¥,r³ÆNº˜„.•=¯‡Œ™¯Ê‘Ñ,ÂE€T¸¨7áILžÁUQâ•÷;vûpã-%ädõ ¯É¡ª²õYBs*C¨úšI»ÄªUTZD%°Ø£ë<²8™8©e¦ž³hmC­}&-=b‹Ðë:ü—ÕPbœ ?_îšm¬®\Çzë¬xZϼêß5áÕÕ¦6öUÛt{ÒµCPW&ÙÙI—…®*Æ3PI£€@3j÷Ô‹gªcü ÷¤â‡þ¼ ›ù|ô?›íõŸ’£›Ì ¯¬•§*k‘çEe­ÖÆù6)lßî[ µ"Šða¹¤Ï Å÷œÅêûo|(pÝþ³‰h›,ǟ,¹ÿ¡½k×Ëm ‰`%' ïñ}RxÍ& ïñ79¥ð«¼ì›|“þGËî¥î½w1–Ýc_yÙ½ŸÂ#VÙlÂMoÈäߗÁæ`\€®º…öf€ª¦wà⦟Ëð!tSh[íüQƒpýÏøn +{¨ÆLê-Fsá.-þ‡±Bñ¿ ~àã8Z)JR À_mÆ u‹> +^æhr‹¼—ª.J™üޘ(er°¯¹:(e" /è.ǟTVî|”¹õíŽ(2Bß,[€§"Ÿ’\$­¦â¯Û۝VÆ +ê «¤ÍýÓ9Y>íCæ“'Š³<ıcYî„,ŸFœYª­WOë +¿“Žå•¥H?ãòH–Ñ?®£_Ô/éCLšŸ_ÈuE§ùó‹ïõ‰B.]ÙÓ1b=f[V¤}Óc9æH +ù1`kD*‹Ç9@ÿÁO+ r­§Xvò8ÌBa¹¥(@rPÑxøìÀç&>9£F’túákútúXÞ1ùU€¿’kž¤™^ç¸ ÍË •;êÄ7Ré+¡±z;‚÷ŸÎyÉ/ðC%‘´š­GÊQá•î7!×ړgÔ¾-ù5‰dÐ_ÉMÅF‹xî̋:sxn¼ØvÉÕÉ#¨£µ-¬,ÏN® QK¡©²eBè*òRE¥ù¤Zz¾$%]O¡ªÏ>Cµ"'ߍ³}…ô ILu\Á@O2ËüšüWús£Ø>›gO:¬PЁå±ÙO‡=…Lxzž¦?xƒ\˜ÿ:F¥{~þtðVqL| +Ð1®@2;˜T§;D¨©µ´ÿÞ½»:ü¶¯+¾¾€1ÝcgY$¨yÛ± }ž…û42ZC‘í€RõI1u×Tç•n/ú¹2âè y¤£<-¥êü¸y^CÖ Q1D<}ËÿÝxïKsïÎykëÁ)¡ø†5‘96uŒd¼ˆ3M«Sá pÄʸ!uHÛ®/G%…£¤R? È>’ ՂgÐCÌ}î9ò§¿êYæ#ރ†»ëx8>ü, îÃSø¿ùå<Çý§ £ûžc;íqyüõ>æ¤cøÚx×6ôÂ,ªÿÖIê£þòƒÃæYcô)Ô0l² +íÒíUz7›ë¢ÆÓX«å6–À¸QŽÎ¹ôyOnK[9eN‡Þæ±Ý߆žŠÞ7Wåz¤kêÄ>«+©ë—>ö0h²(cJ> endobj +801 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [205.559 534.63 333.579 545.534] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >> +>> endobj +802 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [229.336 197.96 346.916 208.864] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +803 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +807 0 obj << +/D [805 0 R /XYZ 90 757.935 null] +>> endobj +808 0 obj << +/D [805 0 R /XYZ 90 593.892 null] +>> endobj +809 0 obj << +/D [805 0 R /XYZ 90 579.756 null] +>> endobj +810 0 obj << +/D [805 0 R /XYZ 225.341 257.223 null] +>> endobj +811 0 obj << +/D [805 0 R /XYZ 90 242.987 null] +>> endobj +812 0 obj << +/D [805 0 R /XYZ 150.808 89.441 null] +>> endobj +804 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F23 340 0 R /F10 473 0 R /F7 505 0 R /F8 504 0 R /F1 542 0 R /F78 539 0 R /F31 472 0 R /F13 540 0 R /F11 418 0 R /F12 622 0 R /F9 568 0 R /F72 471 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +817 0 obj << +/Length 3396 +/Filter /FlateDecode +>> +stream +xÚÍ[Y“ã¶~Ÿ_¡—T4qЩM*Nl'Ž“ØëI¥*»~àJÔ c]KRÏ¿O7’Qš½ÊOIht}¢Ig÷3:ûúꋻ«Û¯”˜å$W\ÍîV³œÎ´bDr6»[Î^Íɯo¥tþ¯}YmµÛ6×7\Òùnë~_ڛÅÚ]}]WK $s®®¼ûæêË»«·W ¤3fšh!g‹ÍÕ«él ÷¿™Q"r3{´£6³Œ ø]Ï~¸úþŠNË¡JöÄÆ<½w×ÌÌ«MyóåºØ7¥#ÏmbW#]·_ILFg7<#"ËÝ\_]39‡öµb‹WOî¢}¼f°}wqo÷kgã!iš%5Lj'û֍Ð3Er- PÄh>»a$Ë3O½ÄX0MF2•Ï‚A¿O¬ƒ¸9³‹–â)Š zvûæ±jb¿ØœwŒwV7ó|¾®ÞÔEN17ó}½Cùsµ,÷x×Oi¬¬/…û‹‡rñSµ½wWNÓáyí‰r·vë¥cz+nŸîÇûMîðÄÌ»í}}(·‹ŒŠ`,zÃë~H4ܗ[d´³C0GÓÖEµm}¬ÓÅîç5•t¿[?=”Ëz·…+æ­U?•”sÒ/¦‰âI?öû]ç¸b[­Ñ•Ä¦:ÐLU¯h)3n7‡?Žç'< ×#ðÏ©Ù)¡¼·^ï¸Ùë7U넌—kÝZÍSӖ÷¬.÷uٔÛŖP£!¨”StNÐ ×7†g=¿5ëfçþµE›°â Yo¥€Eóù‹„ÿyN4˜AŒQÒQš ®¤RVé”W€‡„}‚yt¿¹"¡» +T¼pÊÂõFä—! +ég¨Ó +-K¸ Dw~Ý£|•  <sQ˜ôæ˜UáZ͂Ý›Rx&P¨M֗+§3ŠFØá2õžZK”@ Ccwaä${¹!ÃêŽ ·úÂ1ðÈ:Þ´  ±b´ëËÀ±:^<#¹a*§É‰ÌzÙߧ„€3œÂ19 FBäÞfŸA™šêÍÚ_u2ð’:-3Á@Qø”ö‚SƒùX&d€B“c>DsÜdàK3)¼öŠYÔ>,|t¸Ú­×»k.珍5²}†ˆkdÂXÅEÿp.£QG‘Æ¢#„ñhgbˆýºuY5ÿÛ¡HH=‚«z·9f~J3É méÒT«tÐ*„Å|þš‰ÌýKh ðÅ0Å?Iu¡Ö,£^$¢%Y/ó?&&ƒ½Ñó¡}ÑvÁ¾÷¶ÅrÙ;($¼Öi&õCÚ] +»”ðŒMù>¿†”ñ¾BdýŒÁLée}g%åfß> Ê„x8§Í9,-/‡¡™†!£= !:©í‰/ 8,k,J4å¢mŽ©L2’Y‡8¶€M€6ƕGŽ¥ÐÆFymc à¦Ž÷@»•ß ŠðÏ™§q’®˜þ4û{MEœ£Ä²ÐDꍝÞpáõFLê =§7‘¸“zƒãÓjCåIµTüoá~¶p8ÅÁ¸"sÈ)ø(wA=¨U€o¼ÚëuY÷$é¢(%L‹g˜±Ò2&Cüƒ+mÂwTÛÅú°ì*6±ï€ü”ö@®¶IÛ˜³ Œâež ÁäéękÀ”Nb} +ÆFˏeöÍy³Ïϙýž벸æ´ðñ|ȑOG@¬Ûàô¾Dìñ+…þ±¡Òž¸»JUõŒN%hj1 0ïëJ˜¤$Ÿ%>N˜ÐÏazÓ=¸˜ãí¡XW]Ø1dS®Ì/îJÄ¡ïp†!Œ^D”y 3ôç†ä¹œF<ÏtÈl;cá–j(șŒÍ›.—wÔt|,Ð +)†,!Ë@B˜bD(ÓΤnúc§õú\Z? >¹„ì¹ÆBä­Ãd"]H +0*ÑîOœ[dQ)ÑÂ-%ÒªQé@°ežQ_5QÕ@ÆUy®jÀ¦‹š‘“¸Ä\/Òqݐ=£Z€ÕaÀ%{~½À|ŠzAąQÁàÞ¡\ð}ÂiA¤É÷K¼"…= +º3,À~ÔX(J$R‰rl^(+ޟÍf‚ÍÖø©ÜÎÎr[OqC¤!J½ì4:MàtŠŠÁšà§ÄÊ1—V¿Î\Š±“IÂÒª(•J™yŽ‡1‰¨çl>q‚±e”!|-øtâd—»Š üMӌUMç"ØÀ‘Bçò­çÛºC±3eTÃþ–ñYÐ §¦9=Åk†µ‘^ ÍáMsؔMÚeCé©–…<8àLÄ©Û!ÆH×2ÆÐØÉÃ*@ BØ;7jnº®S˒ë gáöAwp‰Î\jN¦óþ˜¹ËÖ¿pâí®õ¥.%¤ Q´éÊ©ƒ`jŸ©cñl„¶f(:lFÔP>®ô´†s!h‚ˆÂ­š:#T¸ØÕ ±Ò€ßÅz×0lž'ÔRr"³3øb<ÆLîñe綵]qWƒÌ÷»m÷¬ÇJL¡ENâQåSmˆYRùÒ¥ÎC¨á%@íšÍ-ÚðòÚ`n•ëéY lphÉmÖãœ(¨œFòø^ä +Adw•‘€þ¡§ïS³ÿ,%nü.Ñ<: q‚Ù›7I.Ú‰€ìÕqq^åA;àN‚"7ó¼"ú¸Iä`î2…é4 ߀ôۚ»,·=ÿ.è?’AûQFéÐ~$ò¬»÷ lÍ¿öBàH†£øæâaWu«m÷ÔßÀFd7 =Zëµ{äf’óu¹jS{t¦wMÙ¼Úì×åtß + ›i:ÿç®-»qEkûÚ´-pà-FÚmîtŒðbQãHÿŠ@cۛceSçÑ-ºµì~p pf©»á‹€ÄÎFbþæ©;Ê,ݟ¡ƒb2× (¦ÍþÐ:ÈÀeá~bU&@Ýe}Îò’>g?¨>ÝGŠ9ZÜwēÆRçᄶ€›9õՀàÄ(ñ.9ñՀ|¿¯xj‡Ó<{߯ä鯴­Í„ò)ߪڃÉÖû¼€] ‡¶'.D/¢³l¤ý9Ä(ê'Ùq\3ÙwÆ&¿©}AšOJ}T}w²LÆÞXbIœ1 ù`ÍÉ磷┏À€<â>™@c¢¼AS†ÜxQ4¥»å¬Êð £³ñ8,ð öÉÖýZM@#“ËáµØú÷SýXWmÙOÔ­µÖ§Ó­“²RE±ÈýWÍïE„ÌOe0 këÖÝ´ëÚ=d¡‡ÛÅ~¿®ñ֔Íÿæ_¬ºù-Yµ[Ķ:”MãßgÏ˜˜ÛxÂd´Z(¾ñVʐœ™K?°²VÉPa +™Ù}BÐ|g‹FõÆ÷A×y wùmoÎáâßMYÿû }èùb{è>ðދ²©ºïÈ ‹¦„cŒï~(K¿I·³ŸfÝ¿¿#Êe¨9FÛz¯¯m»ÿüööññ‘,rØVûšTí-HæöõÁ, D?ɪ‹Ì7»îH¡ÚÂ͍—íˆÿÿî<\ +endstream +endobj +816 0 obj << +/Type /Page +/Contents 817 0 R +/Resources 815 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 770 0 R +/Annots [ 813 0 R 814 0 R ] +>> endobj +813 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [317.366 187.402 371.373 198.306] +/Subtype /Link +/A << /S /GoTo /D (main_BDHetal05) >> +>> endobj +814 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +818 0 obj << +/D [816 0 R /XYZ 90 757.935 null] +>> endobj +819 0 obj << +/D [816 0 R /XYZ 90 733.028 null] +>> endobj +820 0 obj << +/D [816 0 R /XYZ 90 658.282 null] +>> endobj +821 0 obj << +/D [816 0 R /XYZ 90 644.018 null] +>> endobj +822 0 obj << +/D [816 0 R /XYZ 491.236 258.748 null] +>> endobj +823 0 obj << +/D [816 0 R /XYZ 90 242.327 null] +>> endobj +815 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F23 340 0 R /F7 505 0 R /F11 418 0 R /F31 472 0 R /F10 473 0 R /F72 471 0 R /F1 542 0 R /F78 539 0 R /F8 504 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +832 0 obj << +/Length 3989 +/Filter /FlateDecode +>> +stream +xÚÍےãFõ}¾Â<ÅSµÓ«¾JZ*„„Kda‡¢ŠM¨hlG KŽ$g²TñïœÓ7uËíµ—È˸%uŸ>}lµ[e«_ß|róòWŠ¯JR*¦V÷«2[åŠÉèê~»z»¦„f·w4˲õýS}{Çd¶~}˲uK³õs=ŒõdÞþ²ïÆi8n¦¦ïàMžåbÍòÛ¯ï?¿ùìþæÛ +;f+ªw9ɹ\mö7o¿ÎV[xÿù*#¼,VÏzÖ~%‡ßvõææ7Yˆ­Ìli€(_匓LIƒr¨‡Ê`Á)_OOÕdF›~8NõèÞ×fðÜlë®évˆêË_±TJ¢²vא¿0Sò•"eÎ œ¡H‘³Õ%¢–b 8«`Ê—2Ž–@oÁcfVtnA„*Cˆ/"+ç3 õxl'<”~Ü ÍÖ¶mÍèÁN­Æ±Ùuµý>õæØ+×ßáŸzxš©ž‰è‚%à SJJi)?Ný€2¢2 u7U&«~֘áà¡ÙíêÁŒ5Z ª³¸É>ˆêWQ‰À!„dØÜWm{™\€2ˆ ¸Ð”D¸äp"âҌfÛ®ŸÌ`ßo›¯²ŒÕÛ4«½õc=|wËäÚ +8¾|êÛíh¸ÂXN +YÆ\yìõ a ²° ¯P‰¿Óš©G8ž½¤–y0ÎXf³@¡U˂i³”ÀCՎ½yñÍú±F ±Æ«j­Ê²)–K’N©kÔ8.˜Ovz©ã¹[µÄòù©Ù<„¶Í#bðXF-9“Ó|¡–C¿GÑÎc}Ë­rä^‘pT7ƒÇÚ ª¶7¶†vÁñp¨í40؃WÑ(òí±î6vé¶× P…3>9JÑq°Ÿ#‰P vóZ‡\e~Ð`uèªÙ÷µ•BmZàwœêƒQG=;'ŠY{ø[t×\®Õ05›c[ ˆÒVZ+€_ë +iŒ#ëÒ¸„ß[w#Ô4 q0Î ¦m-< (ž6œU`›~ßyè»­"ÉáŒUP'm³oЪ + °œvb9qÏþpgDrXH-ý”]¤ÅËQj$ $i½©:30^\ËÅ֌&°ž½zÅ°_Œó^œˆæhóü‰j’¯ãǃ]ÞÓHù6AòÒëÅTožºäͬªFó J¿š‡eӝ·zøýío^ÿ©Ì¿^˜6ôà’Òõg(Æã!åÀG’ç¸rÇx‘ôZ¼ôêk&M•1¦£ùX™·  »Á)¼߁üîÍ·ÊMíìóvÛ ôª5ïAŽÁm#3´è™#à•]ÜLvûÞ>s}Îáqöïs¿oöNžàÕ»¦n·šÂðððÎüú±hëW³áɓDJMh&Öè§Ú©&-‡æè ÚÄ;T£…Õ›ž¸ŸÄ¡¼3‚eZ‹ì¼%ây¹o?Tàæk;Wk ú®}gf<ØOý†¢š.ð¤é¿ã±AîT­}ę†fc£æÂƬHç8Ò£GÌ Fâ4CmÍzxkÇ¥ÅQ›ÃÍæ8¸HÅÍò‘A(I詍$Ֆ/Î[›™sלˆ\þ œíŠ énãõë/Ì 0­(Êe ðÉ{3±G‡è¶Æ7›`ëŸ×YaI€uÄÇÊÀ> õ‘¡fœ wæößWZq.jŽ‡ÝPy¼»-hZ‚c}W/½‡‘' 5ì;# +Ûfüû±´çÃ:’„~X÷¯2™iaƒñqôªJÅ#¼$˜Aí"ã`«H¬€)¤C“õ¥rÎ>²ÛtV3úiÒ Þ5{•É¥G9»¸qœ) “Â&R–3¿€m0¼ªžÒÜG!<ýހßÍJW;‹¥-#™òýËÌ("^ò9i@ƒ–›år!°ET•L0hRf”òs´]ÒÁ^Ûº¬+NÏ@ĨOEº¾»n9¤·Ûc·k—‚OIÁæäGWWL0x›ftx^¤%RIÂgB]–z©y4¿F\|ÔÊ +ŠŸÂH‰œ5;Eë’@àì&|œ@ô £' 3)囔)‰œËˆa¢D›šû9E @<߶§eSIh!SeÓŠ€¨6¬šB¤H±‚q +¯$ +«y§%áØ~@¦ÊWѤÅY x•@[Ò GT{'(}“Ø +²"€KYl„¯"+;=8È,‹:)A¹-Oµ3‹J€‘ÿ'4("0®èÄ[eDRõA[]ÝȔ¸2É£¡Ã!Ô¸ô“¶)ޞèWãñfyÿ˜Â=gDæâ½¾;#E!Bƒjl0#žÛZJ£œðY$/#ÍU U[VŽeš®·¥…©rBêaŒ-<H¦öPܹ°ýŠªW_)"Àʘt£KÉšUƙ^ô1âú˜†õ­ô_f‹¨ÇāB®u +Ø'ð–`øòÓ%"ÏRj +ÅÑTÌÑÊòâìÁ€@`Έ3?o¢ +0QK/7¯Ð‹‡:óxº×$ æü¸¬XtJyéaü,¥J Às$tNüh‚º.…–?ö_q"½0‹ó!uüKÈ"E¶ÞU>Ð9WÌQ¥–çx—}uDWæÇ;,[š¦`#°¾¡{Ã8šìšØڐTp‹Xmtr]XÚÿ¹Í§¸¶­õƺ@µ¯j[é]Æè!ø9åí¦YZèŠúU* ¯Pù?—M¼;…u—+R€ ¸KUæò +‹#¥üýGæê,òŠ°ÐÞÌ$XdúoRPòâ”1G”`àΕ°ú¹­,¡&Á¬“W ey &¬?Œ­SŽšÂóeL·×Jɂ(šå…¿¿'³v¶Xœƒ÷q"ô×qOþ¾Ü0‡ ك0íä% ¿œc¹òÊpÄbX”â=@Üï‚YžB—4ó•™èHqšƒÉd†ÊdþS*véêÒ쥖`Ö.™•”sÎø*Á‘;NqN©3óRæ® ƒȄŒ€³r)tK!áW€_æ`—¥dI†At0ËD„cÊØ1R2uIYø"]Ä'…”—¹vŠôBì2ŒÔ‚Y»r¯óتSUÍjz9=ùpú3ÈcúÛx”Ê d3î™ÿB햃9××^º­ ߸î=Vx7v–Ég„inž‹áƒ/QÃؕ¬%$̉ñOÊõŠ\lbŠMšºº$sô= ¾‹Ië1“ÞDExߤ䋦ÓcZŒT©Þ—(FçÀð@0»¯ a® +Oé d(ã mQ†ÅM Ì ogµºX/ëo¶†wÒZSä„÷:IٌØ2mA…2®º ù¿H þ›áÌù€`!láOøÚ°%²“‰Ø.æÏÿE†™+žíÁ^Öä%„IåâþÑÙÜ_ßNLL1GWº"]!%ŸûéFK”¯\L®ÔWV¢2ʀ ¯7îÙ¯±—ú\1Äê¦Z›æŽí´‹M;çÑEDM¬«æ‹{7ºg+Üu…CÛl›mz ™Œ/tÏU=W췖Ræ ©Â6š¿®³o!Cb½0js…tˆÈ»”lrA8 ,±dgªù(çô'^XÄ´|.gGÝȶ?Ÿ¨móN ׀¬kJxrH…Eþ¾byìÍSù(L‡’AÇfw©¥óâÉh‡‹†P]2„åÿߏ½™Í7xq_glaRfkß«»Óvþ¾ÂÛOmÔbýÜTÏ¢€D©xŸÅ3ÐE!áÿ(G^÷é«t Ù'w8À(2¶žñ“=¾Ùžk=—‚äÔ#ÞÃ7 «Óõq}r=q¡K,yå > endobj +824 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.24 628.216 230.92 639.12] +/Subtype /Link +/A << /S /GoTo /D (main_Widening_with_Tokens) >> +>> endobj +825 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [448.533 518.895 486.501 529.799] +/Subtype /Link +/A << /S /GoTo /D (main_HPR97) >> +>> endobj +826 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [231.495 389.341 266.135 400.245] +/Subtype /Link +/A << /S /GoTo /D (main_Bag98) >> +>> endobj +827 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [354.01 389.341 392.525 400.245] +/Subtype /Link +/A << /S /GoTo /D (main_BHZ04) >> +>> endobj +828 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [303.467 365.804 428.905 376.335] +/Subtype /Link +/A << /S /GoTo /D (main_pointset_powerset) >> +>> endobj +829 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +833 0 obj << +/D [831 0 R /XYZ 90 757.935 null] +>> endobj +834 0 obj << +/D [831 0 R /XYZ 90 679.042 null] +>> endobj +835 0 obj << +/D [831 0 R /XYZ 90 671.186 null] +>> endobj +836 0 obj << +/D [831 0 R /XYZ 319.418 631.369 null] +>> endobj +837 0 obj << +/D [831 0 R /XYZ 90 615.355 null] +>> endobj +838 0 obj << +/D [831 0 R /XYZ 296.413 474.228 null] +>> endobj +46 0 obj << +/D [831 0 R /XYZ 90 458.214 null] +>> endobj +839 0 obj << +/D [831 0 R /XYZ 90 366.801 null] +>> endobj +840 0 obj << +/D [831 0 R /XYZ 90 366.801 null] +>> endobj +841 0 obj << +/D [831 0 R /XYZ 90 352.943 null] +>> endobj +830 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F23 340 0 R /F7 505 0 R /F72 471 0 R /F11 418 0 R /F8 504 0 R /F12 622 0 R /F9 568 0 R /F13 540 0 R /F28 621 0 R /F6 538 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +852 0 obj << +/Length 2854 +/Filter /FlateDecode +>> +stream +xÚ½[wÛ¶ùÝ¿‚o“Ή`$.LÏÚ¦ÍÖ¦«W»OIÏFK°ÍV"’Šçýú}¸‘ÉJšìA‡ øøî7'÷ N^_|ssqù=O“åœòäæ.Éq"8AŒ’äf“¼]DÈrE0ƋŸÕ}YWÝrE^ԕ}öÊ®–f—/UÛ©ÞÎ~ úv¿Ö+a†`‘-¨\þvóÃÅw7ï/`‚bNf‰”%ëÝÅÛßp²ùŒÒ\&j—d4…ç6¹¾øçžRÁðŒ +š"̙¥âæAµê®nÕ ã¾nì@mÕNUã²ÓØ]~O§Œ!$C’H8ÐìxgAÞe(—ĐȀz€{ à-P&€¢ÚÌн­û¾ÞÅ1!Õ®éŸ@ÈðÙ3j†ïŠ¤)¢Yž¬h†˜çÕ?ê^½œ- $ ‹à‰µ‹¾Ö`lé­})ÜäÏ;µ$ f‹bժ͠ ð­t0ëºZ«¶R›ZG2G |ؖ·mÑ>¹7uÓ»…åðkD¦9âùÀÁmñߧ—q‚G67M[뇗°­”Àu»ýÈ_x©ïìsÀª©—”y5‡€…Zwó ØBPÎ/7õ®(õ†yn(MÁŒZÕ´ªƒ­ÕÆ~¸}²ÏÂ>à՗ÅvûälöÕ¦0¸À÷N½ß+`–}3˜ÁsSv¿ï«uß¡å*crñ‹[´.Ug!֚2½ß­[ª¶å®\ìqˆvUäR ôÖ ÁF‚ÿi¶åºì-b »j™áÅcõ”Õ½…4<ҟkã/êÖY +›J€ƒ¦rªwê¾ø—Ñ õ3 ?‘›L—Ü/EI Pî‘RM˜5qœ /;‡÷X±E½ï›}ï0¼ó²7'dÈ-–‡’63N3€Ñi*¹Øùþ¡p ;?å¾mêõ~çeαã͒,궳3ÅLÜëÚ +Þmi°/q#êñqÇÎÑ1—­‚I¹¸78t/ìÜãƒr€•RåœMíWh³hÚT ¾Îò‡ZçúNÒ˜€ò”~‘hq¨Øøª|–9ïïZ¥i +›ë¢X‡s.zúQÙçm[‚^áôÉÂlÀ$Èbݖ·ÊNXåÀ{U©¶\ۗzB†ò»^¡g^3ïüf…›.Z·-pRËîCi¸¬ŒYÄUÌG§,¹DRé]Üì}©±ø g¼o‹N­¶jœßÚyç… 7 ™š!“(©·¨W1›ƒT€y z+kË`<)æ£" ¯ +?)/Ý!¤ýÚsíð›ÕqQ;Ž¼ž‘ –g5  ‡XÄâÈè.®]¸H¸&YjŽp + +Lý,ÚÉ 4*<ºa~À‘`ò£N£‘m¢©H¹å(ƒJÛô#µB£™ ŽºŠf³‘ ö ñ:9 ­M3èNÙ¸7ے”r2M`"iF Øï"€o(KáÃÉ>ªtvQhZf›§@=ò‰1Ál«ú}[u‡d–Sͦi†²L„¦ù/:a¹@$g (âœð¿-P>%y 7¨È#zâÎÂ8šF2Γ¤_"HFI¸φ»9TGÆÁbÊ»Èlª#òC„Ñ3§ñ³”ŸOOû=rþ°?MXÄÎVTȘáZ@c;x®~µÔ®1†!ä¨ä“<ÁG`H£Â$4Ÿîx¨‚Ö)Œª*H¢… +fbª‚ƒg?ÌS|f1Äø}5÷©½ðZõñ—14934Š2>Ø‹ÙYŠ¤È>%~œ6¡·ÀJ£r„Sʘå E;’-spѝ@ÅÑèÌh’<-9‹GtHPPFE$¢SÑ¿ÞlLfmbº}¼rÈóIÛ<”»c³lf|«È)Ês2 +h•²4/¡àËA]Ï +˜ìxÀ(u’dS¥ŸâMÁæT„¸aÈ£1™9´™'ÈÙ`çædz8æÓa^¬*6ŽÀÍqéBí”ÉytvҜgSi¥Œ"’²°^¹}š•Aú;Fì)ȼ,Ã!‹¿"RD©<ïðóüŠ<ÀIžÛNŸ áÿ¼Ö5¹ð¾!Ð)E2=©'6òᓾ<ïÛp‹: à(äqYÄI¤ÎI|[o·EÓÍE¼îûn*½“%ŸnxˆÔi 慐 så ±›/¦çϪö_u·L»Ã6Äö¶2nj„‚„³|°¸µ%TEOÊi±Ø{T쑺ÐüÚª¾v’²®«•k[dü4 óÓ®ìúå¦;d+GyM¶ ü_Ùd;ÚngF6i*E:ø ö÷áá&¬ñ˪ä—þ«I…zJøvc©Ù2l*˜3CãMΫo=cŽôL‡ÁÕÕ= V5¦_ÀFhUö꜃t±Qf…?ɺVCG㶻Û{×÷þåõEòÖÝ̚Î…ýJÅA“dèÔúlÀ@=>ԝƛòxXã\ ž‹S1l@ŒîÆ0v¬+åwöhËI˜Xo‹®SÝô«€œpWT½î¸è·{UïTßÚW®û4ë¶lL±gKˆ5tÞ+ézŸb–Nϟg·Ά·×“³µF†gO9Œ!h6v¢h&tÄ,]w;GRÛY—È §¤?Xo þðÙ¶z¦ †Ž”žgGrT?øZºCŸ'€ƒöœF¬šì´.Úö­/LNª¢éÐúîÀ+Ӄ‰EvvÆøžÓxlÅÁKЊƒw/s=.OPª¿¿7¢ÙfãÊ>]ˆP;Õ pÐ'5c• +¶ø›j3tÏß÷]oG^àö­w& +Ã@3̧Â-)ìnÀ¶¢÷[s¿¢Ajª|ܼâ< +FüŠÕXpÇQͼՕi'«‚ xòC¼¹.wͶÔp]œ×Á}£¢©=ԗ\œWz± ô’AZÌ]í`þ; +ŠÂg×z„»Ö;ÝÛ`'Û<Ÿ"ãú/õƒÛ‡ð¯ì¤;ŒàÉiªšÇí¢5ãrzÜý‘ ˂hí:^”%úÿÃúP*B¿ˆÖ11@êłӪhF®ï«Ÿ‘äу»ƒuYð<ÅG²·‹³Wš;æq§÷Ñ2*;‡»c̅<Ö¤Ò_\¡ÐÙ7¦ègáòÉ]ƒfš ¿=¬K‡ÍLâë3°v–kwÅNs£c 1)vÞÒëÆzÜ[ïwîõ¥lv—0Psõ*ü'bBL’¼Ãb(GY6T8Mýhc‚K‰¹)X5í2&^˜XK&T·ƒœËþÁ.w+û/â£(ªäSbŬ¹Cy ¹{W¹Â¹Prõö<¬˜î´eŸâ%O#PÞ9ªm-bY©GØ]\ÏñP}‹ç„)Ÿñ4°‰üÄt–õ~_l]/ˆC”4LJLN3µ‹ÝpyxŒh66ÇþÄ%_ÎϺã“B|Êß,ìú4\† ‰¨”þ/Ég6e*‚ráèŸh€J̎´vTÏçx9›þÁƳiåyc6ÿ½Š3äšì³K³Œ…;95†÷ñjŒ¹ï0Í¢Ý[Äƨº‹ÇŸLèƒçãB´<÷ßoþ_o“{%œ00q–M›%¦ç®«hw¾WoŸÔ¦u¯o¦ÍÖ_ÁEÿeÉØÂéÇOE¥íՌu{ÃÅ®®ôçÀ iDuÓÁ¦k¥‘–²??úñÂü hrÝ!!—õä¡ï›———hÝ¡}U6-*û˦Ù^þm² ÉÐ(§áÏ»áß~e¥ÿEctõ€ÿÿ•Õ% +endstream +endobj +851 0 obj << +/Type /Page +/Contents 852 0 R +/Resources 850 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 868 0 R +/Annots [ 845 0 R 864 0 R 846 0 R 847 0 R 865 0 R 848 0 R 866 0 R 849 0 R ] +>> endobj +845 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [496.512 296.226 513.996 307.13] +/Subtype /Link +/A << /S /GoTo /D (main_powerset) >> +>> endobj +864 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 284.271 181.006 295.228] +/Subtype /Link +/A << /S /GoTo /D (main_powerset) >> +>> endobj +846 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [155.703 272.315 287.736 283.219] +/Subtype /Link +/A << /S /GoTo /D (main_Semantic_Geometric_Descriptors) >> +>> endobj +847 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [417.972 254.691 513.996 265.595] +/Subtype /Link +/A << /S /GoTo /D (main_ps_operations) >> +>> endobj +865 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 242.736 164.282 253.64] +/Subtype /Link +/A << /S /GoTo /D (main_ps_operations) >> +>> endobj +848 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [380.712 242.736 513.996 253.64] +/Subtype /Link +/A << /S /GoTo /D (main_Generic_Operations_on_Semantic_Geometric_Descriptors) >> +>> endobj +866 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 230.781 181.684 241.685] +/Subtype /Link +/A << /S /GoTo /D (main_Generic_Operations_on_Semantic_Geometric_Descriptors) >> +>> endobj +849 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +853 0 obj << +/D [851 0 R /XYZ 90 757.935 null] +>> endobj +854 0 obj << +/D [851 0 R /XYZ 90 621.926 null] +>> endobj +50 0 obj << +/D [851 0 R /XYZ 90 616.155 null] +>> endobj +855 0 obj << +/D [851 0 R /XYZ 90 560.234 null] +>> endobj +856 0 obj << +/D [851 0 R /XYZ 90 560.234 null] +>> endobj +857 0 obj << +/D [851 0 R /XYZ 90 545.919 null] +>> endobj +858 0 obj << +/D [851 0 R /XYZ 90 490.66 null] +>> endobj +859 0 obj << +/D [851 0 R /XYZ 90 490.66 null] +>> endobj +860 0 obj << +/D [851 0 R /XYZ 90 476.345 null] +>> endobj +861 0 obj << +/D [851 0 R /XYZ 90 422.417 null] +>> endobj +862 0 obj << +/D [851 0 R /XYZ 90 422.417 null] +>> endobj +863 0 obj << +/D [851 0 R /XYZ 90 408.102 null] +>> endobj +844 0 obj << +/D [851 0 R /XYZ 270.222 357.66 null] +>> endobj +54 0 obj << +/D [851 0 R /XYZ 90 341.188 null] +>> endobj +683 0 obj << +/D [851 0 R /XYZ 122.378 221.979 null] +>> endobj +867 0 obj << +/D [851 0 R /XYZ 90 207.564 null] +>> endobj +850 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F23 340 0 R /F72 471 0 R /F65 376 0 R /F11 418 0 R /F7 505 0 R /F6 538 0 R /F8 504 0 R /F12 622 0 R /F9 568 0 R /F1 542 0 R /F10 473 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +879 0 obj << +/Length 3344 +/Filter /FlateDecode +>> +stream +xÚ­ZY“Û¸~Ÿ_¡·pª,Ùä!ÞÃÙÍnâd'•ªx].ŽÍ0–H-IyvòëӍHÂvü"‘Øhôùu“|u³â«×¯®.^~—¥«’•™ÌVW»UÉWy&˜–buµ]½Mòr-8çÉÕ­¹\K͓7—’'mÝ ½‘KÁ“;Ӎ£ß´‡ªnð:“2‘å廫.¾½ºøõBÀî|%ìn:gyªW›ÃÅÛw|µ…ñVœ¥e±º³«+%Sø߯~¾øûwœóðš'KLµ¹¥'…žTËå(ÞÞ­àŠeùŒ‘s”L‚¤ƒE`™*-ãú-”ÂoéønMg§—B'¿ÕýÐGø]§*cR(àH°R;ÚFøÖLzÆxa<ÛYðiLl·ÈŸ¡ +=WEÚ 9p°€ÛjÀã‚C’Z`ìµä9+åh›¨ZRx"äæ?‘ãŒÃªÏ=ŸŒœO1•‡_D¸×,JŸaS I–z¶•umŽ® ™wÙÀ]QžÍ¾ê.E‘ܘƒi÷@³¥GΜÙN·»È¤D×Ôc´ø ›c–Šåy 9„2¼O½ecñ¦m²ù!&KÍrý”!Ș!,Ô&ʙ0.Z­‹’‰ x“`· 3;EÙDêd__wUw7*9v-2ù±Þšž¦+ú»®·H'íÑtՀƍüÂ5'^ Ø@cT› Ä*ewÿÞÊ佇Å6f³ØÃ!ï}A ׊ρ¨s ¹À _Eö‚5ò©ä“ŠÏ0”•E·E_ Ålǽ-ൠ½ø˜ó²‰’ +(õÇjãÈokðÌÀ 2¡4+²³Tc 3…$b迯î]̀Y(ZHèüy*Ñ3•ÌBT ©Z‹n°LôVWí­C;[>~áÁ_ÌF JQ|?qÅ-ø©wÄ@ •Îñd˜„„(£vìۃ“¡ÏŽ„pÄü¹y+0)¿ïzÆ{O»Vû¾uWÄîÈy‘x®+²,mÒ²\Ď)Ë ?<ÆmþÉæ°DöPh‹ ¸«¢L¾Ê-g¼(ÿï=yé™Ønæ'¸5¿QýQóËX–‰/ B­³t÷èÉU.¿ünŸ}ò/¯x[¤j˜lë]é“à ÂÀŸ¯: 40%a®egFÌsæ× ±ˆÀJ–NŽK¦k·„Rª +RjêRêܲª»»ºw˜õ'Šj7æÓsªÒ ÍrªRgxà,¥¦Lœu}f[—PGïZä/E•—ŠãÜ¿7‡ª,p€U¯¿¡ÿ©æY¤f¬Ç„è›?…íjL-©2g^ çZO¡´Tc–:Nb‡'ƶÚÈ"ûe)ã³#B¤0 5kÁõ"‰V,-,2Taws—ŽB jHqÔì-hvk¼XæjJvéjÒセۖŽW$§ã‘TU$×í©q°Õ֐$œ]$Ôó²«î£¹ :Jý]LL,SrQǙk‚P)YpVNH¹õUÐt¦^$oÞüèp~ •E…õ)›tÎß­PÞ[y¼¯ú¾¾ip Ëu„ ^[Ž°óÛ̏„‘K>e·j! "³ÉYÞaÀ¡7²eja­»îÜ$x±HÖ0ÒvfÀXE㧆J;¸$dwæ¸ø79Ð81Ù ¢}ÍìØÒd„®n-Ÿ÷T}1M=ü߶¡«ÎlN]„(Š§³[úkiéú%0f»ö +&ÖË@ bTÃæ+¤Yî»a‹.¸-í¼Ë×ѝ3Ž{ÂÕcÁÖ¬§½[ Rw¨Yæ+äBPw.€ßVø‚ƒŽ9ø0×Å¢6oÁƒ‰d '›‘€Íõ²¸è!—SÈhA1Ë#nî1æL‹ì)Çýß>À`¶`p¦lTffN© +óóY1ªÆÌ{ôíoCWÛ}ÐHú›‹ +Ï(RmŸ1 ûŒ©ß<Ç؜R—ÿ\‹¦þïØ +ÓÖÈð‘Ár}¥§t֕ÄÕÔ{?k â¥ÈžÖa¿¨íÁóm#9kÜ{*|?Öݸeÿx}±¬÷ß¾zý¦,ßÍÞjžÎ¹vÇ.ÄcTpa{ÆNg–Þ{žÌ…Ðh·h†l!RÈäPmݾǪ«|gglƒÆƒ‘D¨›^¸@ScÜ’Ä"ùb£iÖnS‚”ƒÿUãð!ÞØä¡DTSö¡QSx·£ §`‰!÷–5ì ºå.æA±֐n/jÑ2kÛÄx”*äîvþ‚x”ñN‚šõœ—A–+–¥â/ðÄ\ÍTŠ?4¤/Ç6ù,Ž‘ŠþîjV¥–û(6HÁܸþ¨²bÂ}3ە)Óî#Ó]{èAEç 1?Ó¬®œ²}àÓ¹L6UC ºˆ´€OاËC¯…í‹Ó3¾²'+ƒk…—âÀ”áf– Yi¼é‡ŠlsA#R”A­7¡™^¯­^ÉOíª9ޚDŠßuÈ:‚f ¤m{[(¦õ诔M½á<œJãM¯#)”ÞZizoä,öO±> YåAEã=2-øÂJÔ ‘Ï% FÛÊ2,Oìs¤"0-¸#3°þŽ@䀥^ßÙFŽ{jGIØ4ý©«5‘ÜФëÄÀ•ûЀ¸ ¸„/LóüÁ×-™ã! ­±8'#~àoÒ8.°GðX/@~=¬èè)19@¦Ä²Wò0Õ3‹=D,•F¼ðÁÄ +­œ²æs²Z*ñãÁÏQèã÷5ý|ÃÐŦíðåZÛlÝgÅ#¹ׇÆd7žX‘XC§u;„e6Ø öÑ©ìðøÙÃõÞ=ƒ‰GöõnpïÕà÷³÷ +¶Jä!À»(Èr¦§¨èè饃}¡È-ƈî`ÿ)¢rFT®–o¹žP\nufîi=(Yœ¬›Aʅ;—r­| ‚ä墂œ^y»LßÏßG»¸òʐ–¡$½­onmoVˆF¾ѓFu˜wp"¦_X´±Aæ¯ P<êÊ6ŠpÆ⠘9Œ`ÚR§ ѣϥ¾®@‚' 1LÛÑG1%x<ŸP|ˆ‚áyNKï05X_Ù¾"Ž?R¾H`9}ãe%òÞ cñæ0TjðÇÑaÿ¡œ‡8Øâ’]MnfŠå—ŒYÁJQ<÷CFÿáâÔGPTi­Bc?®Ä,aÛݶûû[³íÜí#¸›ö¦ûݥ։C|?UÍÉ6’ú›aä > endobj +869 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 325.742 126.971 336.646] +/Subtype /Link +/A << /S /GoTo /D (main_BGP99) >> +>> endobj +870 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [289.241 277.921 327.756 288.825] +/Subtype /Link +/A << /S /GoTo /D (main_BHZ04) >> +>> endobj +871 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [222.811 197.467 266.307 208.371] +/Subtype /Link +/A << /S /GoTo /D (main_BHZ03b) >> +>> endobj +876 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +880 0 obj << +/D [878 0 R /XYZ 90 757.935 null] +>> endobj +881 0 obj << +/D [878 0 R /XYZ 90 594.068 null] +>> endobj +882 0 obj << +/D [878 0 R /XYZ 90 594.068 null] +>> endobj +883 0 obj << +/D [878 0 R /XYZ 90 579.498 null] +>> endobj +884 0 obj << +/D [878 0 R /XYZ 90 499.721 null] +>> endobj +885 0 obj << +/D [878 0 R /XYZ 90 499.721 null] +>> endobj +886 0 obj << +/D [878 0 R /XYZ 90 485.151 null] +>> endobj +887 0 obj << +/D [878 0 R /XYZ 90 395.457 null] +>> endobj +888 0 obj << +/D [878 0 R /XYZ 90 395.457 null] +>> endobj +889 0 obj << +/D [878 0 R /XYZ 90 380.887 null] +>> endobj +890 0 obj << +/D [878 0 R /XYZ 90 278.918 null] +>> endobj +891 0 obj << +/D [878 0 R /XYZ 90 278.918 null] +>> endobj +892 0 obj << +/D [878 0 R /XYZ 90 264.347 null] +>> endobj +877 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F23 340 0 R /F72 471 0 R /F7 505 0 R /F11 418 0 R /F10 473 0 R /F65 376 0 R /F8 504 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +900 0 obj << +/Length 3362 +/Filter /FlateDecode +>> +stream +xڝkÛÆñûý +!_Ê,šË7 @Ý6±Ó´qꇵ:1¦H†Kæ¢üúÎk)Râ¥i¿œ–³³3³Ãyó‚Íã&Ø|y÷úýÝË/ÒhSøE¦›÷‡Ml²TùI¨6ï÷›žòUt¿UAxßÛªy¼ß†Ià G˯«]¯ûóý6RAzQpÿñýWw}÷ӝÁFÅ$ó³(ٔ§»ƒÍà_m?*òÍa6qÁo½ùîîŸwÁBºäJº0ò’tÿªö¦A©€ëË/”š¡Æ™Ÿ‡(!þ‘1’`†¡¿ˆB‡ñt¬Ê#Ü# ¼¶©éF…gîUâýÒÕm5XÞÓ¼qèu9Tm# Ž• =šÆôº®†ó}šx/eÞN¨êºnïÃÄ{"}":é·Fkzµ ±)«Ãù +o§­Ùâ6Û$÷³$Úl•ò‹DôR¤ÿ3Joj8‘(`&ª‚§Ð;Œ“öt³g0ÓHÙö½±]Ûì§#¥é‡ê‡ K=ÿ~›ªØ{ÏøႺòìÐr<ó>évðü/$–pÖ +onEˆ§{:¥ÛË{ñûê][k‘? ½£ûÊUi_Ýo“$!6½@ïqË­oì:Roy»v$Îm¨‡V6¼pº@TÒµºQ*líۓ®Dº"À†¾2ûρs{֔ B#"‚èìý£øÇ·_Þ]_óõ—Pk7Fð$3dÙ| =I4½ ôºÖÚj‡f;ºë곸͚8L§ÓUÿTYÃgN 9•{—cŽ©çãe#ïí1wípÄÕ彀òJË ¾[]Õ"bË¿ ¥íÚûfe3c²|0˜lS¬ÙMÜÛR’ºƒåɦ”à FՄžlø¨n„Å0˜S7ð½Vø=é½Y²$-òIá²­\ŠšùÇü’)_’è¹ ²ÉLæÌ–dæhÎOªùªãÉ4ƒ¥›Í_:bT§®oQ¦ŸYysRàëc=ŸÝ6m„ëNNŸŒn,#_ ’{ûê€>€Ð£V_¤¼‚@ͽ 쒽 ÀBì »šZ{_àŽ£qj{¡½7 zmù# ìk~þq´Ó»çȁÒGØ€4ÄÆqZ(t :]Q¯ +½ú÷:ò‡×oþD»7n +©å{ÞÿÇo½Íé7óÓ0fFˆã0öj—cPàôÂ÷[qÛÎ ÷c ºLT¬¸ mÎ]Ƃþspõ´ƒlGMa6Íù]"ÛÁ ãÂ#®QÓ¸ù®­ÏG³ïµœ‚¼[ÿ^u¾C uÒ•©@^½zýæ[Ðõßçò^ë=ʝÙÂâ³µŸñy=ü–í©sÙÕræ©Â؆+ŽrŽàŠ[3uˆo€B¶æ™Ny“¼p‘œö7¢q†~ûn¡ˆ¿\Á ÃùÂé¡Ó¢Ôïú{H›>¿*~»,®{”â/'w_õqð>€oyi5KuY”Ê£n0¤‡Î^pÁaHÐ]; £À›nÃØOG·rÂÁ©‰–Õ'Y­E–ÇÕ,ˆ5Å%ÒÃÊõÞ.d‹ÚJ"à8ܓ=ÀT?ÆÚK†"âFuEaìæ e–E¤ +D°À#8z¸Êx³ÚK-ªdi]ÖFgg—#'£X¹¨˜HV`ä s(f«¥îaçÙ,K›W•bT\ÀžË%ñÞü4V½9±éœl~›v`Œ“Á橤j„i‘c­<ðE ˆ †W¯]t'MŒ³4Ÿ›è‡+Ä.ÎD±¯òìꇡK·tÂ؏’ _ ¡?ñYq;¨¹"ûöÔÕ¤"wDŽ›ŽÒ7ri»Òë÷¸¾I †±o»A\;t1!„È=JȀµ±e_uÂðBŽíž×Vòìho:°ÿ™¬yIJÂÞÂlèÕ1¼›%…°.Ä*¹øjÀ¹hC‰6 Lmí°„ˆ~.•‡L}æ…X ?h¡ç:¿ª¬„ÞÒä­p ôíI4æÖS©Æüæ +iªfXíx˜ÄH7hÙPí +•Wm4—Âæb:ƒÀôØöàÃ'ËÏGeÙÏžæ‰ZvØ–Ú +¹50h†J× ÄhQóŽô³˜'ÀàÞp;/)PC$6úùd—¢]§J¹$!)4HY{æ¥_Ï áô  ª)9Tl°ƒ²“`0屩~ Á¡rÉɹʈÐƞ4ìÀ ½qxË¿;9Ãj˜¡*—âZÅÑ +€UÈ'0àv^»^G’dµ¡ºí²Šs)‰¥Õt_WÄ +¤™ÁYÞ&¥…\ PÜÕxÔBª£O;¦ãNå 7ð“!Ӈ˜`ßîÇKD¬Dš‹ñÂ\?b{Â?@:î(F£¢ “…³ %¹DÓ †ÞçÊ&÷3X‹ŽOÜ J™ Q8Ký,É®,§Yá«B?*2GÑhÿÿ˜~…˜øY­ð1Ïʦ¥N¢6aîS¸7!ÍÛå5T„ ܸIJp‚å 1nA•ãYä$y€›?œª¦:U¿š¹³ ä.65FŠ,Yt=¸Jn+— ‚Õ'~ž§+Q&‚óìsQ\™îÙc;Ö{ÞÝ >T*{œš̂`ÏèGRlßasC4½ßS“™òAGSw Ñüó©áS›ý£Ñ\…žÔG€À©{=¹óÛ +³Ìƒwy +\”+1mÜÐP©”c­Q\*–Ð{­-úl=¹UžP7Œx•¤tOX3WÜyÑ–öœq÷Œ8Ú=;ƒáÈæ±£“É=I`»šzþ¡Û‡WEŒµüD ~'5Àz6Í$.–£E\…\4œL²^ð 7#v §a8ä>0ýïÔ­N’$¬æ +Yéš?A“ͧYdâl2IÝ°0Yæ,ò¢^ò#ˆÃráA1‚Û ê<ò€ ²FäV«YnãMíK,H0Ȭ³'þ¯V3%œs/•Ïª,™ÉA]Å’õŠ›À_H/ò ò<–þî.n#Ë)žŸàîm†#fdªEqaËöýü¼Î²¬Ì)¾i¨‘æ$å©ëÆSv=^rc‡+-¿.¤äW§êñ8ðҍlª?Qė ÓXYV7L&žL]o]ÈYK,QøE1%´ƒ®ê-š‘¨ø6Hoݑ…‘OÑ# Î_Ntõ"â2€]­]­•Åj6ñ",;h¶ZãêÀàs;òÙ+c/¤dV =áËg®ðҌû"Pð´wnæE$š«ÖW-jµ¨`iÂ(Ç~¸mi aˆ_4ޒùBäl @n‰@jܺ3¨$†âlöÌ`}ààq; ƒq–‰¿cåðüªT"Æʵ•€(2Ô¬\NÒ –ìÊ*¿XugOOñóÇBå¼Ð]šPùUšP<í] /ß¡\eïUk9˜{RB°Ç¬V§mÉi#pC0ˆ¡`«”ÆÁž°[œÐË£)?ù×¾22–Âe&oÚ}ALhªÌÉ,¬c·ÔËLŸH«°K*h*Şퟨê®kûLç,17™—oø$“$¸iƒ…&¬ëâ:ü9½¨–η-ËQhÌì-™ì-¹¯½)ež†eE¦"È°¡¯ŠùX-”±Ú7Bá•é,¬øŠ §â̜´cVÃúüð­¡vøáM8±7ü¿Ð‡ ê}Õ4¿»òåÿ>…»8o*‡‘ë°à¦ò“·P¸‰Þ½ûš—:è‹.æ#‡"‚n5\Hç‰æ¾²?âÿÈ÷ã A M§ÃNæ>¤¿gK€”k5š%ác&Ÿƒ,ï1õÔMìSiÆHï½è½ëÎoqZl +NQŠ@z#·qiÇ®kû:Ó()~cNf|ÍyÔ½þç•4÷ ðŸßù¿+ô?+ðÒS¿È¢\þg%)ü$™©SãYò8UˬÁ‡ï¡ü~˜gý»nF7MÂ8¸æ4büñÙD¿›>YòÍ>mÜêoü?6yUžùQ0Eã0t¯^¾|zzòKëMÕõ~5¼ìºúåm²šQQ±ŸMD.£J¯A‡J%4HÿZÿÿ>.èß +endstream +endobj +899 0 obj << +/Type /Page +/Contents 900 0 R +/Resources 898 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 868 0 R +/Annots [ 872 0 R 873 0 R 874 0 R 875 0 R 895 0 R 896 0 R 897 0 R ] +>> endobj +872 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 684.047 211.755 694.951] +/Subtype /Link +/A << /S /GoTo /D (main_pps_bgp99_extrapolation) >> +>> endobj +873 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [319.846 684.047 391.518 694.951] +/Subtype /Link +/A << /S /GoTo /D (main_pps_pairwise_merge) >> +>> endobj +874 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 636.784 132.5 647.13] +/Subtype /Link +/A << /S /GoTo /D (main_BHZ03b) >> +>> endobj +875 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.875 636.784 188.391 647.13] +/Subtype /Link +/A << /S /GoTo /D (main_BHZ04) >> +>> endobj +895 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 606.647 285.096 617.55] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate) >> +>> endobj +896 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [227.126 594.691 292.759 605.595] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate) >> +>> endobj +897 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +901 0 obj << +/D [899 0 R /XYZ 90 757.935 null] +>> endobj +475 0 obj << +/D [899 0 R /XYZ 138.697 550.024 null] +>> endobj +58 0 obj << +/D [899 0 R /XYZ 90 535.354 null] +>> endobj +902 0 obj << +/D [899 0 R /XYZ 90 506.685 null] +>> endobj +903 0 obj << +/D [899 0 R /XYZ 90 506.685 null] +>> endobj +904 0 obj << +/D [899 0 R /XYZ 90 158.973 null] +>> endobj +905 0 obj << +/D [899 0 R /XYZ 90 154.365 null] +>> endobj +898 0 obj << +/Font << /F63 374 0 R /F65 376 0 R /F11 418 0 R /F50 339 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +911 0 obj << +/Length 3279 +/Filter /FlateDecode +>> +stream +xÚÍZY“ܶ~ß_1~‰fc Dð¦|TÙR¬²c[k]~°]k3‹—yh=ùõéF7x-u8©<îF@:›ÓÆÙ¼¸úòöêÉW¡·IDºáæö¸IœMJ¸rs{Øü¼•Bz×;é8ÎöÇV—§ë8Ûñ­Þ7is¹ÞyÒñÝ­'¯½ýæê·W\IXÁÙHÃ1ˆD䛬¸úùWgs€ño6Žð’xso¨ŠïzðÌ7¯®þuåL¥ œ…t®'œ0 éÞ\Ë`«šVW%ˆò8B:¡(c«pTn³ª¨«¾<Í¡*R]¶ÔiÏUŸó‹²ê¨S‹VåĽ%U–õ ½NynU*n‡yº!ò´¹–ñöÔªìfË +´¨·“R$ëq{V:V̋|°Ù·<: (ؼ×Ýy±Ç*Ï«k7€wvî¯%ˆÚ”0`Ö̺Øñ#’$ÜÀú ÉóÓu‚-κ˜?Û‹ÈI@Ÿd¦N•‚ ¥ë‹0Ám647•.»Vuw7Õ=l¡êh†”Sގ¡Lì”OW˜‚gùÁÍ«5&dh&ùœ(æ*„"™¤à(+Â{"ˆ£a¡´étšç—»Ô¡ÏÔá ±ª„Ÿßûp%žKðàî¹ËV¸žˆ ~Þ¡ÕÎK"xñÜÕ¬Ãû‘œ_¨µWøtÑÝø9¶Œ“á˅“á;pè.-Á„`KcàÇ<ñZni®·=èö÷¾ûPÏÄS©¢ÎÓnÍa¼È®/ww¹waè-öu·vä\w“J‘a R`ÛJÑ®ˆ!=WÄQ0îϚñt;ÞâBR¸î¸ÍîSH¬2ö·Ï òËYHc+¬!ü ´ó¯Ièߕ–âûïßÃ1öDÿ†/}Xa!‘ÈwqÙùŽ f yB¢|™ué©*ÓüîÕ9­ÕŠoÇ ì©ÿÁs»"‰ÞÈ!~—ð¾Hb×|ùü­Âú‘éþ/d­þ\ËB‘H¼ÿœÁKÌj Ö + ¡ï ¤dâCX”ñ²¤òõrÿ»ÊºÝËFC¼šôBãZ¦qsíBåÍ/¤¨tõY·ÅSD¶_ÅsÝfyª Õ¬Èê 0³ïÖTRHr77ßR#·ÐƍäV·4ˆ #¿P;¥GY$%¡`ŸmµË B`>E¿¸®—UeÖ¨ŽW:¤³è.µjÀGù{Ö¹¢iuSa~ÖÙjȧªï8ÉJ 9»¡#Ûepàe¹JAH™$dElѾT {P‘Us4À!SP|\'±8 +_9™AÃc4a£æÜì*z‚J3JŒüP#^і£«qޞW¡º„­š¶¶­{YCS¿8X•4ð“­'ÁÍ¢j;j™mò6#4ªí¨àUÓҀQF."jÔjnw"7C|½ÑMקùŠßùRÄþP¯@T)Èi¿.i‘ºIÁ›ỳfyP[OóÉâ­¥J»QS¡Õ?˜›&ñzd·› –!Ã`Dã㓌­”ËcäÎ𠤟`P½î÷¹Î˜CÚ20\ÛÚê:/FŽkzÎtéƒj4"‚â,౩ +0Z %F:KØл{ç&DŒ‚ÌÍ8ܟ*YÑFzcé¾ÅF®²äwÃXà™ý#"º#‚UMwZµ†°(diIÓ ´üÜ_h¼7Ç«‡æuCöÑRH9È+Úœ)Œ‡’ŒàL¥ZÆø;,£K8khm™ú…ô·j4pÉàIî’ ðtVåpê°'Ý."¥RœŸÑøøäüej€#˜.]àHˆGjª«ZƒA(Üx(5…êÎÕá1KP•;ëƒFÄQa°¾nÚýµÿÅqÜL­W, qÅ +&Ë_T¬g€€»Ý³ª1G?¼Tm;¯H‹s›b_õÝŒ?ÚcŸÙ6xþ ŽŠø‚í¢~ Y;5‰ë½uî;“= ªí$êâVú$LR8­ª9z€²´OESª† +s€ÅV6)lŠ²Ì)=!mjI†\jz\Û« à!Ö0½q(3‡•\?VðýÔ¢œSÁgvN˓ñMDúÄÚÒº‡±0#æò'#JÞÛXÖ|×APgç»ÑöyÏ´Æõ‡É°Nz¨ê‡¼óôß˼حiW÷úx>Ø@eçRÿћôâ…X®éE¹…Œ€½,mMZ‡fÛggj¥üÎøh>ÊþIç6 j¿¢. =?ܞ«üÀ4fý€™«~õòIɯÁ{Lxwâ&†:z*Å#´c ÔÞ¦6@ Þ ÔJyØÀ©M„˜,$Á­=¾Âú©áÂL.5bêP‰H‘׉† _¬H„«»Õ™ÊM»åš*…-lïäÂG2Ó7OݵDg6§ìÞыöù» v£j¨ÿVQ¬~phý‰p"¾'˜€\È11hØåªïONªÖÔ HAé[éO„Ç4;´p|/ôéÜ hßLfzàœ¾ۀ(ý5BÊ%K6K³Ðå‰~r£‡üÓüTAú>¼†ÉyÐ(ªƒ>^,Oªå×7‡q·0%ô,ôg›eÌqä1½e@™Ä0­+&©Œ<i\03 +*<Õ¨Ze§žóLÂ\Qç ¸6‚¯t# OÈN}y€¨D·8Õô&WHDü6EÀĈ®ú6ç1¼éŽ Öej&v ’rlðCcªö3O fÞî”ïWU!OJè< [cn¢öD +ìÒ&`;¦`ŽŒ^æ©ËéD¨MÆOCN†²]ÌઉœF¸|DX>è™W + ­¸g)Þ éç¸'Ñ$·D\7²§-FËÚA¬²0èؤ'L_­…#ßì¦íûox§@f?à*×$/‹‰¦Ü¸ZB¯H¹áÐ睅K|ñ\¢R +œ‰¹®šù…ðäb9ØD"‰i‘G œ„•~ò„.3¿ÒØJé1Ùd좫™ç™ŽºÂͺ2É›èp32Ä}ª¨»‹%ýû¿ÕçGÃÝ{"üеåþÂúôÝ+“yÿF疞Ÿ1㳝½ýç“)göë%»§OÍZwÖž1?µb¯Nº\åËíT$ú°EN흲VW‚¡q©0}6Æï>þX›HAàd ÒL•ÕÇQ&½û\·wf¯,ÿwÌÜC ¼&=ñ‚tã÷îoLm¹qºëáY˜þwóÆQìm&ÃÚ®æÂu™4ÖK_¨ná_cunçøžõl˜;w­ìkMVy—oY1¿¬ðÆ硜¼3'øM?⸳®0ÌY„àoõ£}ìšÂSÄÑÓ&Il¿ÁÄÈtƒu; _±¢NfN@Hòé§L*únMvv(CO_ãø¥„Ó٠׏±ŽÚä+ìb¾Â\õъ*àË8;?púʙ*2Ÿƒ ·/°†ÒàáÏ êõ9x9x äàT¦°ÁõǨEìöJ1р6©4§ ‚d8n_uÊ®"‚ó‚Éßr˜Ð0; МÑÇk ,ª‰?R϶À}>àSŠÙcß"{zGE<^*ˆ#¤ ¶À12Åté±3 dºDo}ؚ®¾>†¤°ò½M +_Ž×Gk—u"”áô+×Î ­át·W>/à_ÕM½v©Ð!?ÀFÛ/ÈÝècö¯OÐúal∖ä#G˜Ë'Â!|—–½9’„åæçqþÃF¸“ﯔb%I³×Ûú'™u”WƑðœáKÁ¹ëê§OžÜßߋ¬}©ëFèîI]çOþp2á"Ñ LŽÖ™Šá÷]Â`Á% ûÿ ¡É +endstream +endobj +910 0 obj << +/Type /Page +/Contents 911 0 R +/Resources 909 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 868 0 R +/Annots [ 908 0 R ] +>> endobj +908 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +912 0 obj << +/D [910 0 R /XYZ 90 757.935 null] +>> endobj +913 0 obj << +/D [910 0 R /XYZ 90 618.144 null] +>> endobj +914 0 obj << +/D [910 0 R /XYZ 90 613.536 null] +>> endobj +915 0 obj << +/D [910 0 R /XYZ 475.551 513.321 null] +>> endobj +916 0 obj << +/D [910 0 R /XYZ 90 496.594 null] +>> endobj +909 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R /F11 418 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +925 0 obj << +/Length 3509 +/Filter /FlateDecode +>> +stream +xÚåZIwÛ8¾ûWè4M½‰`,—\æÉ[Vgܱ»§_–DÑÇ©æGùõS……¢dZ±{ޜæ"……ꫯªÑÑbDG¯ŽNnŽŽ/1ŠIð`ts;Šé( ‘œnæ£Ï#ÌO¥Ô;ÉfyV.*µ^Ž™ô6ã¯7oG>„ŠFÓÍGéÑùÍџG „tÄô2$¡£duôù+ÍAþvD‰ˆ£Ñ½nµù\À3]ýzDûӓtoz¾Hó½›e:žŸzµZé7敳:­¾¹ôT“•EýÄ÷Vå¼ÍKӤލJš,±}ÛÅZWcx×­…§Öë|cjÛ©qŸ*×i¥š²ªMqž~¡”éܳb¯ù©“7iu;fÔS‰èvÛ÷’Ž&Œ‘XÚµåÙ¬RÕfH`½Ö”iÀq/ ¹ð ‹Â'iªÛÔ=…Ã(Ü'Í(Ÿ§E³¯{=vtà3¹t?%°N=èW¶Ucgò^ÉI »¯¾É +ü©prZIfÕ6å +ʶ¸AœÁ֚Š¤œ§µyu¢Æt.êÛ´jLë5|ßT®Ú¼ÉÖ Oé•IZ×)TÀÆÛ!¾Àޛ+œÅªÌª±=ø*aD$Ş*ÊDå¦ÁÞfð6C¸µá^À‡®–g㠗5[gˆ@,üVdˆÊo8ñ´ª³¿nªpUø¼Ò‹ª²ÚóbOnË•*’Ô.U•,Í+‹cFi{"a¸8¡D«üd,@TÔºI@c·Ð·°RîÇÞ¥}žü»¬Š9ìQaʪ˜›—ÚÓ¢^¶µÝŸ÷ °LS“§ªÒփ…ÌöŸ¥E²\©ê.+fiSq‘—€-„Òº³ÚëQ¿4zdœ„”ïêñT!ÔdèmÊ_ÀQ[7FÊZýc< `3Þ0f”‘Ègn ®¾Ò9̧6ch“ÆaIïía¯"r| +¹3ݲⶬúwwÔ²T¶S3§TÍǧ$pƒ}¡’~xóÎ ‡@À¦à±ì"á­Õ_1¡q¼»kQŒ´bÑv’‚-EÞ"-¬–q¯iM3•â ¬²oÆT®ÁÈtÍôNÍÓU†+×HFd—U®‡q ÓÐW:àªEæ*Ø¢°óNõ”|úªRpU,» :SšäîM¿i¡òMÖ‰%P™y9,[>ÒpDÙû÷d‘%“Uk߀BU,Z¥+ðg˜P€^)÷{Œ")7Œ‚CtŒ"¦gÙZUM6±º£1 ý`Ww«´@¦I&3Ï7l‰zœ™"û®²Úµî½¾i`Czjߥ¢ÐÑa…ÎonäÊrÛÇt]"sãûÍلcó'# è! z6Ø?ÞÔ—X.]¦–hs†g2†w à­©œž1”¨›tU›‚E8.Ä „¢Ä}½7BÕCOoh ží€y‰ ™iГ$ ÷ܑÆí‚}I|Öõu’1Z÷‚ßÄçi¹Z·ŽX}"Ó°4(^­ab'¤¬GØ_P$6áH9/¶òE‡‚è'jeˆ÷–}zªWoCAf«þ®å èӓS~f¾µë„Ax'°“É2m`¶¾èfA¶î´lëÒÕ|¾µÂ‹´ê†xoe—ª•†)‹ÔÖM]]¦Ã+=sÒ²(2Õ~·bô ZÿaDÛÀÚ«2[ vs‡†ÞÄB»QîÜ0ó²Õ:O‘ l¸…2ldŠõ:M2•OÖmµ.Ñõh!vHL»u…!åÊTh0ÿÐò-ð±M­nÓf3Iª é% +k«>Òd®ó ðÒÕ,Ï5;@©.oãMª×##ôźêfú¨t3='FxY‚#ª/ +©ÞKOíóB‚lÞØZ³ ~c«_à M»vÚ*ÛÅÒ6ŸŽþ‹ûrË úñ9ęÚÒ° ­[8KӛŽœmm/OLJ~ϚÍXjîÄ +ç\lñ«º ×vY ;ú[jS['sM”æW,êtžÒ,· ȐÞ"hÊãj.ï³F¼”I¢ê¬+!F„j´íÚ,ÍÛ,«šå\m¾E@‰ì‡\ÄSؘ¼Õš‡¸ 3:|åá>C$‰ŽkÞ§IӚ8ÝôþP6nlÖê>®Ö*f2E{3ìB!¬@ìB¡Èzµë5¸µ| V5ù]3GŠqÌ6Nʳbñ¿ߜ½v,Ó`˜£]”Ï`A$5˜¶tÞ&˄`Þ;#÷½3È¥5pµ¸cGÝçÒ½¼ÎòÜ5¹t=/ÛbžnåÚòtës×퓺EšŒ¸€¶&ƒˆµÿÚÙø)&¶1ä +YÙŽYî’ET½.hÒo†™tŠ Ë:×½çxÚl† +k êˆqýR4+M[¦lyµE? 4tAKߜ, 耗¸`<ÄS–0N›ñã(¶ð„‰™Fòaص1 u‡Ó¤t^»{÷ÂHmhÍ%`_ ÆL3ËÕ xE7Q9‚¹¹·wˆ;9@fvŸ—M³~y||O˜-ÉqD%¤½;®Ò:ÅèèxÝÎj(áNÔ¤^6«ü`Þþ+ Âm<{È +¤§Aèÿ÷f<Ó ¢Pô­€òX[Š·F@aÇ;#ÀªKût&€Ýœ¬g(Ö€òs[?„†BH•·ƒu¥­¡a¨ÆXrõЏr ~”?Ä>Jiج‡|o˜ƒô0 áF·ÌáÿÌ-ac¯Ô¬ãx­ä§x£>‰dðD¼Á&‡Áƒó‡x Á›•Óð™x~ÔÛ<¼ÓÒx 7nRhiŸmÂ;mÁ†R5lyn{ b- Ò{Ueóú%¦˜¡N‚ ­cUQõ({Hãªh¤qé «Mê!ûHÃÆ;+¸o¢=h÷Š˜çU›Îr“n6*3Ç´2"iwθÍÀM2e†{˜ë˜‰\o +“ZÛÛ±öVŒû±Gb3 ܙðX€’ˆ0ц`¤Ðu¸^ìy½YApµ«¡ÌŸQâ˸“àpý¨ Gð}š·Á¨)”$ŠƒÁ¨ ûب g§• ¢.j²ÙF@„Ü[¸K"ÎYÀ”·gÁ6Ú1a” | „ÏVØ(©Èº³Ëý šð9ñÕO;%‚ï{“‹JâûÇÒYª§ ºJÍÑȘµW_´wí\1³ù– Ì»ÀC/ÛâÌ>õAXYUYá¹C€¹@`6þè”@7®Ò¤\™=·QŠpá ~¢-Ô­Ë|³Lç• ¥XD¤¿§ô]¦ãß`7 H³»:µGð‰;((šªÌMὂ />ú +;¿yýɾ~jÁ°—¶p}Ÿ5?P_Å|«ZúWb`PûPמ!ï(Ï_o³Ie•ò*-WiSm^ÚÃÖeŠú1'm…=r›®×9¦ˆx6Ä;àÛýHì1‹ðTG˜3ŸM˜ô·ŠüÉ%ŒèÜiG‘¯®âø°"}"e7.ߧšµy£t2Zû¨…>,½š¥îҎ;ubócîº^AR¯1¤,%8IÈ 'É2MìÍŒ“”EÒVUªo Gw¤‡€ñÒ¼µÅ¬D7k¿Gšˆ…cNXlН¾Zk3î­Ê0LB?ë³]À¬ÌõÝ#|âh ¬íÁŒNþYˆ×Uù=[õ„‘C«o±ÑP¦Otr7R »4x$(8'ñÖ+Lñ¾çôÒtÛñe]Z`pdzí@ÐøóÇ -SìŸsïòÚîðÐÁ$LÄ{Xä ±èk,†~8 £x{¾Æ"‹)¡Z/;`|}ù‰úÑ(Löƒ6NûAÄêÛø «.íÓÆgXîªÔ™•Y”F]åp&c¼7žƒ¿4PúWϜÆöØ ä÷©ºË7“*Í9¸°- Ñ®mý8DŠ3<{6J'†§¶)î^ØY(áqwd¢ª?²o/“š\½?¦>CCúd‚Èp'@€dÄ·Ÿ;ÿÞ¤Ö¨zó±•Úý솒"6¥]ÑþMmwñ¶{U¨b³ìÅeH ÷euW/˵)é/Áó ÌéC/`ÑßÌckÄXšÎÜýOÒəŽ¢kÀbܘ‘ˆ†;ww×Ó³_(J‚;÷½x¦ûVÝ%O0Þe™ViÊ°±x¨Œç°î˜ñr6lþôœ õèoÿæas6U}Ͼ‘²Z2$ʦ´KìÁö“¾@vï}T'Š5º®HÖƒs;üù‘ÿ´„ЇTMÒxˆ-¤:L"Å;÷L>{tᇽ4¬º´OKXîª,]ø¡=:C¡«¤‹Èg{tM{tEMøbéÂ" +x.Þ?¢Ï·Y xžŽ3´Úå ÁÕ¯­šƒE•¦ˆc}?)Ýý¤½ƒÄ:¼NÄç¥à® ±é#Wý>Ö(VêÅÐyö@&án ‡Ð/ŸsJG„rö^µ³.Ê:HŽl‹a@îÿs +ÿÂ¢§þqÊýa*À¿°DöS€L ‘äö¶¢÷’•²EŠZnÿzdn‡ë´ú£„Ú]ò­ ?‘º:¹Ø€Èd¹£LåÒôðVoçË¢ˆ-Y<Ëæ{£0¿÷7ã&ab«²²ËïþpQöÿ?Féçõ +endstream +endobj +924 0 obj << +/Type /Page +/Contents 925 0 R +/Resources 923 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 868 0 R +/Annots [ 917 0 R 918 0 R 919 0 R 920 0 R 921 0 R 922 0 R ] +>> endobj +917 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [113.91 395 444.67 404.898] +/Subtype/Link/A<> +>> endobj +918 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [113.91 351.164 420.76 361.062] +/Subtype/Link/A<> +>> endobj +919 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [227.347 131.363 330.959 142.267] +/Subtype/Link/A<> +>> endobj +920 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [348.118 131.363 511.506 142.267] +/Subtype/Link/A<> +>> endobj +921 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [211.932 87.528 429.117 98.432] +/Subtype/Link/A<> +>> endobj +922 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +926 0 obj << +/D [924 0 R /XYZ 90 757.935 null] +>> endobj +927 0 obj << +/D [924 0 R /XYZ 118.403 711.11 null] +>> endobj +62 0 obj << +/D [924 0 R /XYZ 90 694.383 null] +>> endobj +928 0 obj << +/D [924 0 R /XYZ 90 666.087 null] +>> endobj +929 0 obj << +/D [924 0 R /XYZ 90 635.194 null] +>> endobj +930 0 obj << +/D [924 0 R /XYZ 90 590.641 null] +>> endobj +842 0 obj << +/D [924 0 R /XYZ 90 558.761 null] +>> endobj +719 0 obj << +/D [924 0 R /XYZ 90 526.88 null] +>> endobj +752 0 obj << +/D [924 0 R /XYZ 90 447.179 null] +>> endobj +931 0 obj << +/D [924 0 R /XYZ 90 392.011 null] +>> endobj +932 0 obj << +/D [924 0 R /XYZ 90 348.175 null] +>> endobj +933 0 obj << +/D [924 0 R /XYZ 90 291.762 null] +>> endobj +934 0 obj << +/D [924 0 R /XYZ 90 259.882 null] +>> endobj +893 0 obj << +/D [924 0 R /XYZ 90 228.121 null] +>> endobj +935 0 obj << +/D [924 0 R /XYZ 90 184.285 null] +>> endobj +738 0 obj << +/D [924 0 R /XYZ 90 128.375 null] +>> endobj +923 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +949 0 obj << +/Length 3365 +/Filter /FlateDecode +>> +stream +xÚÝZKsÛF¾ëWð¶`• Í€o²,;Ž¥”c*ɖ Q.ZQ~}ºgà€%kk“­Ê…¦{óèïëÈ&w6y{òêúäô‘“$LŒ0“ëÛIÂ&‘á¡|r½œ|xÈÕtÆcÁ«ü¦È«»:ݬ¦\Óß®¿Ÿ(.C&#ͪK‰­'×'ÿ9áÐÈ&Ü©£0’z²XŸ|þM–Ðþý„…2‰'÷Vk=QBµ˜ÌO~ì$²I;Éåv’q ;T!Ø¡ü‚š>æ‹ENmÖjQ¿ŽÂN&—-ò&sÚ÷=þ°‡?|´øC­EU"Vðçw: °Ó(¦ƒ0nI›ªxXeË_'ãÈA ,—*" f°mª·:„!{ F\²0ÚY#͇‘]ÓFVƒo´ˆÁÎ1x·‡Ôz 1€I²xg’nõ‰ C;Àˆ›@JÜÝ(ŒLJÃút0‚[ #¸z0‚§Ç`$Cû(’’P=58§€¨H0Oiø×¹=à»Ê +Dpž9ØA™§¤ùÓüŒÖ/8Ü£)€™ü[`vóÌb%}˜‰$òaN ‡Š®èÚÁ äÔÔÌÅä’¸ŽÃL{0C­ÌðɃ>Z˜áÍ#0K€¯û<€™I‚·éLº‚‘àIrñ™õë|“Öm¾ÎÊe –¹Ó¹JÛlˆJIõ§ÒwtMÞþ*sº¶ôý€²´^».*x× §F4DwúÐål +ò¯8`šéMamd@iK‡è£/“îî=š‚öcœÐÄýy®Úvóòôôþþ>\4á¶Ì7u˜·§¶“-,ª›ÓǬCpˆ!’~¸§l0 #x÷ˆêÇmؑ lPÊÕ£•ôT¢+ºv6 ±l.ùÎ5#ª—ðÕkßQË£z9¤zßQ=´³AD•·ÁCfS:T<鹛xÊ"ß3\wT†OÄḈ»ÚÚÙzÓ£6 Æ=nÃþ:þ•iÆg.ü¥ˆgÚ \ÿ£g Ëbâh>1ñ„;‡(:žìÎXÄޣ芮tÆ(wœm$=OkÀ”•—ŠïÝlkµtÔOýXùzSdˆz ×Ö9IJj»YCaµH@`2€g“Ö9àØ\‹¢j²%݉m÷II%Ú#%”J¦Ñ‚E¼GJ(C‚Á뀔¤ˆŽ‘’ßÇ#%ŸbèåŒAƒ:¤(«ñ RŠÁjøÿ…•¤ŒCï±Ø›§,Ö ãO“ÁNÁ_8KÛñ’v¾µ:^Šqv~¯6‹ƒÌ@ÈpæTz³Å1wf‹"—ÜDÎ2.Xfo~ éÍ„`~;£”܏À<«Ä”k`•°ª.ù»¢üî<­ëÊ&u¢O]¸’.VYµ$ëÃ÷áì½ÕSÁeº%écé Ñ`'},v¬Â˜›0  V¡7-M¯ºt¤øCÖÒªi¼Á²™Â$ªúK³ª6ÐQA˜Qº+ÒlUÖf7©ÝClœW·í}ÚŚØòÚîÙ׬¨6L×èÖ 7ïöùDÅÁ5¾2[`·UYn–Nß5ôöíl ™í.þVI@‹´>€pþÐ4#쟰³È'èM-öä*šq-Ip•.ë|I؟oÒ¼$Ç¡ÍÊmM¤4ÐõG÷üÃv}cܟ_¾û N¡'£ ˜f3 Í}ÎZ¦KrqU¦ù¢FpmKbÁDßXJ[l‹¶ëÚ©½+ag×@‚Iò¿ŠžŸÎQÿ™NMšÐ;§&ôh’ku‘67Ž>´KÌQ~™mà »p,lPóÛz[f”ÚÚ· +Oã²rWˆÒš6'­Gh)_EÉqék5Î= îp–[´ +¤ÅýÒ=ì‡ÖŽ8@r†™Û¶­À!g¤Ü¥qù¯ŸEw p1¤÷ȕ¶Y¸†ã@†n!D©ƒ0NnøŒG†ójÛ®Òõ¦¥ÚŽ¶µ:f7Ò±LÔ8:xàpí÷¯çó‹ÙõÇöž‰®ˆ´„< YojÏ@¤ñù\§¿V+üL"& *]­V ±í‚tFñd¯.‹ª~²#¸dÚ7•Å,lIÖ:ÑŒ%·eÖH YwÓ¯, +Àµ™›GVºÂI¼%KË _B’ÇÂ!K–î6jÄXiŒ«j™nôóx0˜ëG7þΰp옸u"[7Ú8¯éH PBù`$êéæ2X4URq +®“p£mmJêƒÚ”ÄšOy›¹·º$ +Ú0Ùùùêüì{{U˜øŒáL°pWrĐɠNeû'2rï¯S%a,ùh +{S +om]zu*gà'M¼‡ÐãÅ+ÉB%ô^‚çûx©g\u_:g𩵌ýÿê”Ö¡”bÅêQCF̹b-…bÃÄÄ(º¢+Ø0ªòbۅ•ñqs®ÍŠ±‡b|´(ƛ!Š±¥G±;; +¶‡Þ]f§EH•Àu²ŸÙ¡ ³4 9ß ³CÕ#™Ý®O2(7aÿXñÞ®W™±d‡øödn/:ý›kLFŽjúy%Uìח"ÿSÆÂÓþ¶Kå¢îˁ¢TNÅã6e˜F”;avÃõٙŠÇ‹ÐÞÇQ®KÿZdÀ£v¶¬¶}^¾ÌšEoº˜ƒë¬]U˱â,øªwNÃô!nvA dþÍ(¬+G)9ñ8ŒbµÇHèâùa³ÿI×µ86ÍÖM÷‰È5ӒyÇ7ƒÖÓ +fK³îZŽ¥¯ fÐ;E“ udÿpaŒO“ WÖ<Œ: Iª°k³G“¨zŒ&û>CšÄ.MŽÌLÓØù)=JšF<§Æ``ñ—UÀh–ES¹‰mv¼6y ÕÁ”fÖÇÕ¾™Õÿο¾„Y]ÍO™á‚Åzæ2ÔÑ>ÌSŒ넷uµþÖ}ˆÊìíSZÿž «úîÑMጇfWI¢,1QfŒVž™aˆj½”_øßËÏ@¥Kù1º ~ˆcÿü@RÆ&¨êëþùíÃØ[üØä A†{ǍƒýsÿŸ³g¶ŠUUEã +Î.¹æhu •®§~ºÔ ln]»l‚‡»d}-)ö…:ÕÖc(•Ì”1V¤;XjeÓ&û÷W˜ +†¬6Ç֞ *R³ÅS©DNk@nYœÅn<ÊMìÜۀ|x·­»{EFo¸m¹É2ò»ùzSご÷ÓÃ\a•@{”PYJ^»»m“9àò»p<ËÈ,;õýMêãۓÉgÛÅo´ï7TGJ_ѳK_`ó¸î¾Ù¡J‡Þျ¿bàuøÁ÷l³é‰Ñ©ÚXÔú`©pí ›øšös.^mɝ¿{¤ìå\¡]~+â+¯Õ—s„+È£îÐzýŠœÿk,ȅÿEdJÛl ’‹½/Ò0’ýº :¾ïùX|ìû´à4ÂÞ÷iq +›%Gôÿ˜±?X&ùf×ÇcHRYòW~ý9òç-ò +[‡þ0’­ö.­÷ƒçoOYÄ8âŸà÷ÿciâ0áñ·þÅÒþ¥^fÂ$’1ý¥R'¡ÖŠ|ĊÖêEÁTÐï¢`ûÏ3SÑ°Éê¡Ÿhº¹íò$ɏc#~IÅ(7Ù×Ý|y…º'Œèfd‹½Q¸ +£~ç„1ϪjZ~n¿>Xk>Øÿ?eí¯ +endstream +endobj +948 0 obj << +/Type /Page +/Contents 949 0 R +/Resources 947 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 868 0 R +/Annots [ 936 0 R 937 0 R 938 0 R 939 0 R 940 0 R 941 0 R 942 0 R 943 0 R 946 0 R ] +>> endobj +936 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [123.594 585.043 340.779 594.941] +/Subtype/Link/A<> +>> endobj +937 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [211.932 508.704 429.117 519.608] +/Subtype/Link/A<> +>> endobj +938 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [113.91 286.164 331.096 296.062] +/Subtype/Link/A<> +>> endobj +939 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [204.862 197.87 422.048 208.774] +/Subtype/Link/A<> +>> endobj +940 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [292.331 186.537 395.942 196.819] +/Subtype/Link/A<> +>> endobj +941 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.646 142.079 426.585 152.983] +/Subtype /Link +/A << /S /GoTo /D (main_BHZ07c) >> +>> endobj +942 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [294.32 98.244 511.506 109.147] +/Subtype/Link/A<> +>> endobj +943 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [365.665 86.288 469.276 97.192] +/Subtype/Link/A<> +>> endobj +946 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +950 0 obj << +/D [948 0 R /XYZ 90 757.935 null] +>> endobj +951 0 obj << +/D [948 0 R /XYZ 90 733.028 null] +>> endobj +685 0 obj << +/D [948 0 R /XYZ 90 681.058 null] +>> endobj +952 0 obj << +/D [948 0 R /XYZ 90 625.267 null] +>> endobj +953 0 obj << +/D [948 0 R /XYZ 90 582.054 null] +>> endobj +954 0 obj << +/D [948 0 R /XYZ 90 549.551 null] +>> endobj +955 0 obj << +/D [948 0 R /XYZ 90 505.716 null] +>> endobj +956 0 obj << +/D [948 0 R /XYZ 90 438.687 null] +>> endobj +894 0 obj << +/D [948 0 R /XYZ 90 382.179 null] +>> endobj +843 0 obj << +/D [948 0 R /XYZ 90 326.388 null] +>> endobj +957 0 obj << +/D [948 0 R /XYZ 90 283.175 null] +>> endobj +958 0 obj << +/D [948 0 R /XYZ 90 250.672 null] +>> endobj +959 0 obj << +/D [948 0 R /XYZ 90 183.549 null] +>> endobj +960 0 obj << +/D [948 0 R /XYZ 90 139.09 null] +>> endobj +947 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +972 0 obj << +/Length 3359 +/Filter /FlateDecode +>> +stream +xÚåZIwÛ8¾ûWè6Ô{…Ä’›ãì‰{ܑ»g^–MÑ'©&©¤Ý¿~ªiJIúuæÍE +K}_U"³õŒÌ^œ=¹9;.øL‡Z01»¹›i2“‚†1£³›ÕìC@CÍ”<Éo‹¼Z×Én3§qp?ÿtózQ.a4£Î#”ž=»9û팂Ì¨2–¡äñ,ݞ}øDf+¿ž‘k5ûj´¶³ˆqx³åÙÏgÄMœœ&ƒ7‹Ø¾÷ӗýdÞÞu;¯OLBPw}ÎQ‹JÖeR' ¦dp=§”®éÊ=_æEaÚU”++{†m\9‹ƒ»9%ИE J‘ࢴŠùvWW¸]_ð'sÝÛ|½im1-ªf_g¶’ëªÎÛÍÖVïªÚR.Ìn/XʈÏ”†:vko3z]Ti›¬«2)l5­Ê¦­“¼l˜š&Qðó>YeuYÙöHH\œ–ÁÓ|—Ôm¾ÍÊÖµ­rû¼JÚl›´yjöI«à—2ÇeÛ5ÕMÞ~äö¹Æ¶¤ÞBœ9ÎùU›÷s0 ¢€"az1—ÁÅ\F02 ŸäEr[ÀÖp¬´îl­Y}žu¥7h±wΔ°PRݝô¦mwÏÏ¿~ý¦M¸/ó]æíùõ¬9…EÁþœŸ2FãjÞ gf)‚‹¢©pb"Øá@͏Ö̳ÁÁFSZp*CMÙp’úßù—ÇD’8ŒU_Ø|!g`šO—Ÿì0ƒ©ÐH‡`uÝT`ïX F3gd´a(¾««í÷n™ˆB‰ÑŽ%õïù—°ª×'·‡ŠÃn‡#Ýjá¨I¨(…m!`7=‰]XxÌ#¼ŒGxI^lºrO^l7àEÙ3×6 ^ù×1·Êʼ\[Õj—ÕI[Õ V¹&ÊwŽð0µ¶iUmlMhO2oœ«0"ª[Ųºk¿&õl>³èæÉ4vV"¬ÚÍ\³ ª +|5¡îÕP0ò,E˜mʪ¨pë{l#ÐÇAmX6wÀ ¶D¼Ë7%Ø<ý‘Ä„ŸG𠏁ڍLéÊ4ì_ {±ßÚiWØsCãª×Žóß½8›}0S1§+FÌlÚ(rS ›ewêIQ¸A7™]ÈGBØè±±ä&=@ð+Nqo­~WÓe«ÓfÈ¢P9a…*ù–!š ¬0¦¾Bí`…±u!(ì¬ŠÖ +cëBP0m…”‚ +]vw.zbÆ?¸ÃÆ\p”Òó(¨ÒƒO¡*ù”Î…0prC‰^•¶åù\]hËo«uõÇ.3bÁS'½ÎŠledÝÒQÕ5¾ß§Ÿ][¶Ê^&`À„¤Ý¶ÿj68«s´ KànŒ«j•¹)_n@‹Ÿ‚µy¹]®n°Þ‹[X¡ÁKÚ¢GÂ%¶Y½³èlÍ[ó\×ó(†ÝË`Ê庱ÚÕ>¥5\èvãSšp?Qé²*“8r™:}Þ¯W—¯ll_!'€Ë ó‘Ë¥áTÅ~ÛS‰ÕPI¤I êJã|'ø)†bʽÍÒvïØÉôù©j3\.ÄAyiE—Õv·oÑ¢PºLs³ )Ç%B&ý9C¸쒵P +8ÆI—‰üy”iÞ¤•køeyñȶàî€ I€Í6 ËwöL,=žog4E²v^ó TòòÏòÄFšL +Ÿ&óhš®Ü³£ ÅV@ö̵MÓìúáJ)—«VÅ=D%µ«¾Ío뤾#ÓÀµ¾Ë X»·9åεÈÚìxÐiüž±|x–`z5Thãà†€0axe aÁbDâ2 lò¦«­:S6Q¥‡o;d÷¦ ÌÖÍ:umÐ¥ššûb×Iw< +I;ë5ցïÂçÁÀ±æ o<­e‹í fÊàI( Ej’!Ìé‚ÿÊ­Ícƒ5èS¦HE +ˆ¬- +Ïõú,<ÿƒ1ríù,lº2OÞ#×Ýþ‚ì™Ó™4FQÿÅn×GÕV՜tÝuæXXyjvÖ×Ĭ5Ñ>Ž:&ÏfXä&Æ¢i›Î0o‡ö‘Íø]G6ƒ’ã6Ã"F}Ыœ‡p–½=N„Ú Nd@SZú<~,A‡…ëPJ9\¿® üw» âGõþ$é¤1.µ³œ9xs¤eê´㑪ϙ)íÀ©¬ñÈ#9³Ð@u¿[ï ºÿ©Œ‹íÐPꋘ £t{ðøó»UØhÕn‚Ä*052ZŸ¾ êÓzš˜{i3*Dšáúx÷‹:+úHû6›d‡!ö·™Ô¬ÔÚc‡TˆÏوö^Mæ@}®Ó¸z—[ru× ]yZÕ50I™5&‹U,÷·Û¼m»Ñ\ªD¬i2 ëŸõplïž_ßh}ú¤XÈ£>LèÒ)ÃiÁ<Íû¹Â\öÍ5ø*¯³²É:-Ë´( -ã4’b‡ñîB03:P8¸å8öý+t´l£K,ÓM]•Õ¾±zER®÷¿›9f„6øÿÈGÁ÷Nƒ+ðŒ5d¹­ØÉBböµ>ϋ<ƈˆ r*¤b+ÝoÚƒˆÔŽqáfÿØ]ç>HÕ@DŽð´a(„IÕ 0NÕ`rËûí®jòýv‚_0‘Äˬž_¬×Ö¨(ËËÎ`÷H@…Žli2*äòH"}ºD,&6Ä©X;•ˆEà¹cÜçaÐ3¦ ¡œØåLežfF"†î4¨Öè~béaÆ()•_"öF^· áÝ0mOsàÂ"iöå +øpk%–; ðÆ©¼A¶ËÊ2[™%» ÿ l„X5K7eþÛ>³º–: Ðì·Û¤Îÿ°× X%mâ^¦éÑËòÖIö +OŸTø9-ãXƒ¤(2p¡[ þ¬Ü`ºŒïÅ*jÙÀ´¶IÃRÓú$´Ï7eu›™8;ÄaL5y Ã1íöò!°`0,å.ï°p1ç`™W¶²|õâúíÅOÿPÚY‡p`ã‹ñ~ø<–{™Æ·†Lþ¸®OlÖ¦»ìܙBORd¬¹,e˜•]¿}úê؍ ă ìãCë /M‰4C؉O![$xOÝYâ2äbt/åvÍ"pXl&f(ñ²G"k,F¢/'¾ö^¹ê?k{-Øû:{͂%ª•v®òíÒ¦ÁƇž¬–°Îx Øwï_ötU†L ïNˆòC*mDÒwyšæF&zÙÃ(Åu²@”ø@åÊ=1ð1¸Ç{“¦ÉoÍ}24”Uk xÉj"2{ Ž—{`µÏ=8xy©F7¬æÚF©Áµ V½1”î®m:ßmî^•Mµ°Ã× ò2«Á¶í‰æŪ²R»v(¼mßë}vkwFËS®–ïH]-å¹Z~pµŽ®º~¾ò؂¸°LkÇ °7¦P¹aT:冩"aD>²¡Ç…A!q—v¬i\2pzÚã’ÞãbwãqÉÀã’ÓÒ*? 9%x€ß¹`L; ^%«:ï»Ü%¹—².˜õð_ée ho¿Zñ!hùå ‘Ú¨—mç'IäƒÖ}Û#Ñ´ñ´QÚÈmt´Ñ´Ñ´š‹ ÐR|ß´¦z«CÐb¼p¸<Àv¦.ˆÑå¶áE>—¨zäò€eu}¼ËÓŋ×&¾ÁûƓe]F՜úž“Î Òñ½ ÷î!ÌÀßa5¡üo»‡8…€o(§qS+C@Êåಌqÿš5¢ö ¤|Ù$x÷Ñ 5T®ÜÓA fÊ~•M¬ØæmP°qª»›äAíÀûÛòGÆxo–ŽµC5¢$°TЋþª³•1 õ7í'fÙwóí„1Ÿ¾˜¦jĔ——R|3‰û|ä@iZAbmHË}©4ÂwƒF÷éµ÷ÁЀw£5DÁ](ËíGÓt_&ÛNÏ~"osã]<%¯!|ÕÅÿD¹÷¾«nó2kRHÍã9ƒ4 z,g`±›Iì¢,,3àé•-Ølwó‰\ýÀ‡&5Äò·AžW”X*q ŽQó¦óÛ[9‰ùP™õA³Îüžî˪óÚÞ@¦nû Ílü¯9¡BMÕ÷þiÎüIÖ*B-¹r’‹5äQÿµb0qš„àà¡Ú9/› 4YýüÂÐt‘H¹·gALÖÔ{#{$ !%¡ù¾õƒGØá0_ª "ìô°Û¬àà”ý ý¥Þ¶ªÝòó²Ï‹ìÿùZ +endstream +endobj +971 0 obj << +/Type /Page +/Contents 972 0 R +/Resources 970 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 984 0 R +/Annots [ 944 0 R 945 0 R 962 0 R 963 0 R 964 0 R 965 0 R 966 0 R 967 0 R 968 0 R 969 0 R ] +>> endobj +944 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [216.63 696.002 433.815 706.906] +/Subtype/Link/A<> +>> endobj +945 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [328.196 684.669 431.808 694.951] +/Subtype/Link/A<> +>> endobj +962 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [371.182 652.166 414.678 663.07] +/Subtype /Link +/A << /S /GoTo /D (main_BHZ06b) >> +>> endobj +963 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [216.63 440.958 433.815 451.862] +/Subtype/Link/A<> +>> endobj +964 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [304.286 429.626 407.897 439.907] +/Subtype/Link/A<> +>> endobj +965 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.831 186.473 224.415 196.819] +/Subtype /Link +/A << /S /GoTo /D (main_BRZH02c) >> +>> endobj +966 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [277.924 186.473 495.109 196.819] +/Subtype/Link/A<> +>> endobj +967 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [188.779 154.592 405.964 164.938] +/Subtype/Link/A<> +>> endobj +968 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [451.334 154.592 501.476 164.938] +/Subtype /Link +/A << /S /GoTo /D (main_BRZH02b) >> +>> endobj +969 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +973 0 obj << +/D [971 0 R /XYZ 90 757.935 null] +>> endobj +974 0 obj << +/D [971 0 R /XYZ 90 733.028 null] +>> endobj +961 0 obj << +/D [971 0 R /XYZ 90 681.681 null] +>> endobj +975 0 obj << +/D [971 0 R /XYZ 90 637.222 null] +>> endobj +976 0 obj << +/D [971 0 R /XYZ 90 569.476 null] +>> endobj +977 0 obj << +/D [971 0 R /XYZ 90 525.76 null] +>> endobj +978 0 obj << +/D [971 0 R /XYZ 90 481.805 null] +>> endobj +979 0 obj << +/D [971 0 R /XYZ 90 426.637 null] +>> endobj +980 0 obj << +/D [971 0 R /XYZ 90 394.134 null] +>> endobj +981 0 obj << +/D [971 0 R /XYZ 90 338.343 null] +>> endobj +982 0 obj << +/D [971 0 R /XYZ 90 282.552 null] +>> endobj +545 0 obj << +/D [971 0 R /XYZ 90 226.762 null] +>> endobj +983 0 obj << +/D [971 0 R /XYZ 90 183.484 null] +>> endobj +718 0 obj << +/D [971 0 R /XYZ 90 151.603 null] +>> endobj +970 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +989 0 obj << +/Length 3560 +/Filter /FlateDecode +>> +stream +xڝZ[sÛ¶~÷¯Ð[©9;ɾ9vìƉS7rNç´é-ÑÇ©T\çן],xµ¬$Ϙàb‹o¯›¬&lrqôúæèøÜÈIäGF˜ÉÍÝ$b“Àp_ >¹YNþö¸ÏÕtÆcÞëô6K‹Uo×S®½Çé?7—Å¥Ïd³Yv©‘zôææèË"›p;¥ü@êÉbsô÷?l²úå„ù2 +'–k3QBÂ3›Ìþ8bnyìà2|Ùhúîߧ§Aôýv3èø\³ÞúJ›f×SιçOgÂhï´ØUEMí8_Rãã ^¤ÖÞü±ª“M\§ ê\&UºÊ©]ÜÑs[¢Œ6ÍtqöX¥¾ïèÉTïaʙW”÷•×xos\úñy ú+Ê@B͒˩‚¯,’d™æ«ªý(žÂLÂö¤ +&3ÎýH;¡Ôë¸BXvúo½¦æIžïâ ÛÆ;™Jæ^9žÇͶ¨Ò݆^‹œž×eš/Òm–TŽ~×Ðíjp«áo6°,šø}œ¯v±íÃ0Öînx̶›Ý½‚‘‘ò¶ñªù’0<…ëørÓ 7Ú­;ØíÿàH­Pq„f‚Šē©rúu™T ÷!Tàšà#†Âšè‰!L÷¦„i‡08üa97Û¸$I!4.⬰0‚ö¢ÈódQ§öŒ`‚vƇt™ä0ö8Ë²°kgŠ·Ìx±¦Ã€½I_«h˜xƒÈ‹o«ºŒ5½¥y”Û2©cü$®3 +±¶óʧçër÷˜ÅÊ®§°kê1ü‰g–,( <Àq]”Õ«=Їs÷U ž‡>Lh‘Ϻù¤"Œ3X,x*˜7£­6³Ñ^ ͙ÛÝ *H&úèÇW”¬dòy”#ÓåD}»eÙ$9I‹hVvM…æ_Ÿ›~¶áìi‹ö¯¸É"ہQ!½p\ƒC5’ƒX˜q¶b,éÀÛÑÌû`µ+§2ÀÝà˜Emõ‘i€‘¡;°¥Îi’/’=K栝õÂ3ç~ÃJvðA4@YZ§É^qú¡ ÷C'Aç@y,„°1„R@\_ U!BK¤}ÃFÁ²F\ ‹+!BÐ(فG¿ÄOxŸ”=ð>žMèƒx 0ÃØKŒ ƒÀ¬URÅú= ÄYF„>*¤ó¬@ŽéÑ:Xèrþ°s#ûLàd7û@±PªçÌ +{jVØج°Æ¬°'f…}ǬÈPŒüVˆÇoèøCaUïøÃÃÇ/÷Y GÆã,΍üÞùakX/pß*ô^ÛgàÁøú[ºÚ':Ã@¢6Bm 9 ~>…IZÀõæß:É+{Ê{‚Tø"l•Õº»ˆ‹¤¦8#ô>å={LýØ|üõ«¦í†¸÷—Nýô>“£˜Ä,_ eçב9_¨fïl¬É½óÝýnSÛ¢ O®óº,–6« À«ž;@0u,“jQ¦[—Åa“Ôë.m:þ5a$K;Xڔû®ÜÌgÉ7Œx”06ÕEқ]A"„<ŽŽ«!u␆Oz² *ä€ùÂé*¾OQâZF‡ÒGÎB°ÝŦ›Ûò=°Ö¾†N Øè²|k²nWˆ_ 18Å®ó)$ф²|QÌ.§sê8Oªd4%æ¡´)·ŒÁ®Fóœ®SšB5¢i`Ÿ!»¶Äª¶ïÑp’Ž1òì²vÙ#Í'gÚÑ!jšó$ƒ,o +YӒ¸®§3Ç[ø0̳׆D¡o¡/LÓË=á]zœ FóíÍ3MäËnŽ~žé2W•0ð¼I>Á.Ùä³µ“6ù„·É'ˆžGòùp=âð)î¢ðçSJËKÙck!#sXu¹”>kîî>ú¾”º¯º<oOº‹J‰½w]dëdiÃ"Û½èüF3`@¤…øøƒæ¼ùCZUMw²LºáoóªN{q´ÇÑ kd5”\AƒCr@Š´XçEV¬§F»ÜžAµ«âدoþb}LxýCiøô?3Ɉið ÐUë*îìÁoáDîâ/ÍÓ_כìÐ1s–.Ò#`¨¾çvM૨.ÎÎìс‡QZM¤o¸ëú¥£Ööèìpš(˜è6V8óIÓ/ +0s¸P°ñçh+ý,½ŠÓÂu|hˆEcߑzƒ`t=N#Ñ´?&ÛʱŸ®Pˆö)^9w Ðò©÷ÌLi‹îÀ°,6qjóAx,­©Uí6›òìŁû +†e™n\,€ó[ŸÅ8¹J&¼KèN­­Ú¸Îëb™dXÎûÔà•0ÁuñÎ n¾(²jPä]Të:(¬e.AF +ø„ª.w‹¦šÈ;§é>1þIïÂÁ¥¿&r÷Vä`E8³2º­”v•P²ßx–XÈ°e™“9 Œ©½y†ˆQã0~à0pp†í*ŸÊ/à>ï\ø°0 £ß`0!kî@˜Ð¡8~Ô_’ïÕÍÅL‹¨qq¹H²® 3ßÆ­@™üŒ[9¬öXŽÆõž‹Kƾ†¬Õã7¸œ ð.b Ê4£«¢¡qåØ.‹ê¡Äöƒ¡ »âš¼M|¿OœU‡¢=¼_1ƒC§dçw—`º½sd‹|» @ð·ÔÌfr@Yòkòyø÷/Ñqu±Å4|f º|ë€ÀCíCì6D…+¼¾‹³8e©O»ÈUy¥TKè«’ 8µ†ì6êÊÀ!BGSÎè £PÔVaiºŸî‹hB É}¢¸&QœGÉY@uº„D~hü^§åýú³TjWµûrˆe/HF…ü'QˆÚú…Hu×®!yx@!ýaƒR0î{î6ŒÞì½<7År—ÙìÒ`É讦 +}™¥»í ) 5mÖÄPAàGJ‚¨ÖºJo• ½ëò±qo*Ü__"Ÿ›—¿ÒYwኩ@àö^)¨ý깡»-$KÐu«³Kۗ€=æ|Pž4~¹€ù"%;B¬Ú: ]%KÐòeóvâŸæ'ù°0þ‚:æÅÇ øþ•D9 +_ÙòŽŽû)Í&t]:–wîù1I—6$À+t˺ÅÛRWŽp¶ h~=K–«Ä‘R¼tÆ qãù÷Õ²-}¸ªGSf">5<‚g.*ÂP¬2nëBÒp8SÞ]Y‡ÏB)ˆEÄØF”qÄ¢,Øݟ)ˆ;ËØzOmõĀ´çµ»SQóË +P¦Š¶z϶lmð«rG7R¨h]åÖMâîÉTôäžL…íŒ1=º;1\Këlöç.`<¹þêž~-3Œ)›ÈØ^>ûÔùƽCX}Û«OÉÕA· +0±½ #´ëùïç7¿D,žâò©å°÷ÛwôtQ&‚6Fi^7N•¾5 +¯†·~RÒí>oÖIaï,e³m‰Õ&‹XT–†ýŽžs4·qâ!å̪ËW´¶xŸŽâÐÜ£8ÊőÈf7` œeŗÝá÷×Aµœ×,\ÄȆþbq{ûwKkDV6Xù3?.T›Ó““k;*Ï>}Ó ›Qß~JÍ11~DE’&Ü_CÁ"²Þã» ZRþâہr‰’ ‡ñêúÖÝD¾£7¨»hÂÙ2]­ëöÊóÓ».·å/ˆÇ¿$D n?øC2ûÃ1Ø©ñ£@†î‡c:ÛªœÊÐïkZTÿMì^›B ½¾OA“Ìvg>ý‚ ªšr¼óµš€Ð։ W´b>߈Àhä$‡ëÝzyø²‹¢zuEåïòt[úi}¼ÝfÇO­lo®üîç4t ÛeÒÔ×ð†ÍýÀg$ÿÿ9þ&“ +endstream +endobj +988 0 obj << +/Type /Page +/Contents 989 0 R +/Resources 987 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 984 0 R +/Annots [ 985 0 R 986 0 R ] +>> endobj +985 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [113.91 333.984 458.396 344.266] +/Subtype/Link/A<> +>> endobj +986 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +990 0 obj << +/D [988 0 R /XYZ 90 757.935 null] +>> endobj +991 0 obj << +/D [988 0 R /XYZ 90 733.028 null] +>> endobj +992 0 obj << +/D [988 0 R /XYZ 90 693.73 null] +>> endobj +737 0 obj << +/D [988 0 R /XYZ 90 627.324 null] +>> endobj +993 0 obj << +/D [988 0 R /XYZ 90 581.432 null] +>> endobj +994 0 obj << +/D [988 0 R /XYZ 90 538.313 null] +>> endobj +995 0 obj << +/D [988 0 R /XYZ 90 494.134 null] +>> endobj +996 0 obj << +/D [988 0 R /XYZ 90 461.88 null] +>> endobj +997 0 obj << +/D [988 0 R /XYZ 90 431.937 null] +>> endobj +546 0 obj << +/D [988 0 R /XYZ 90 374.209 null] +>> endobj +628 0 obj << +/D [988 0 R /XYZ 90 330.996 null] +>> endobj +998 0 obj << +/D [988 0 R /XYZ 90 274.582 null] +>> endobj +999 0 obj << +/D [988 0 R /XYZ 90 231.464 null] +>> endobj +1000 0 obj << +/D [988 0 R /XYZ 90 187.628 null] +>> endobj +1001 0 obj << +/D [988 0 R /XYZ 90 155.15 null] +>> endobj +987 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1008 0 obj << +/Length 3710 +/Filter /FlateDecode +>> +stream +xÚµZÉrÛH½ë+xk0ƄjAañM–dKÖÒImGG» XÂB eÎ×Ofe@Jj;fN¨%Q¨%óåË,°ÉÄM>¼»?8|ïËIäF¾ð'÷_'›>w•à“ûÅä/‡»Ü›Î8cÌy—γ´|¨âÕrʕ³™þ}ÿqâqé2ÀhF\úØzpzðí€C#›p3¤ +Ü@ªI’üõ7›, ýㄹ2 +'OF*ŸxBÂ3›Üüû€Ù鱧)à˾¢ïþõ¡Š£àoóñö­Ã÷Šõ^ñ¸+„j'z3åœ;ît&¼Ð—‹]M•ÂÉ"箉›4¡Þ¸ˆ³)w6µ®©¡üJϤ,ªµ.õÀYUåJWMÚÉô¬`¬1RÅ:Ÿëʊ|aŠiÜ͍.za¿8¯›*NèåvBç…Ùî÷]ÉCxr7Rjg-Ìùd*±ù4wÎtW›äñ 6G/Ò¦¬¦ ø<|ˆÞqÃoOs» Ì9‚lê´~‹óñC9e¢aÀâ¡&Úæ4KMŸ÷š%µœÃ4ª¢·ܹÛ䫲N×9ÍcpVô…û¢‡û÷©€odë\Ó^H_º^ 7ƒK&pŠf6»+”ž+XØ|©“f]Meàhzçºlðô$ãNZPÓq™¯Ö0{ªÝ%©9ðÝ9sO¸ò{s–\:«ødŽ™ˆ„í¸ÁS«´¶õ÷ ƒ‰¶Eœ§çÃ6­ªÔ('¬}F‡««,~xcõ!ðaÞpށDZ¸#kl¨±Þƒ6ÑZÑYœыV$#W¼]ä5j'œ ¼7šræÄɲv÷l»¯\uzuòE*[š§¤4È.qݔ9´}[ãxÒYhê¼Õ™­©z™8FœÒáÕ$ü Ûªô cKÚ +¯âŠ +Y'HFR¥ñÛÌN†Ì>·éÓD¿­ar< +[}Ç5>Tæèò|Ÿø ¸¢Ó/´ÉH:÷K˜«5 µ°O‰¹­$R“¬•ù--¾–•Ý +Ô:éT(0I\$ÊGNjÙJ™Å›ÝÃfÝÐp9J.Ò$ÎFsøP颜ÑØ©4 ¶?®In«ºbå*®’%yD¿¦x‘üIÅ+ÞÌ‘sª²¡î؂ÔÂÈX4¶Ö›"YVeQ®kjà·–·œ[¹cû‘ãr]%åz®c­7öEƒÉFíd;!ÔR¡+<9Üç£Ô€?âNkãæ$£ô€¹BÆsQ1Ÿsû…˜‹-#ÌŦã²øªÉdöƒ˜<7Äļ>ðšaü( oí…XÐ#¥žƒXn!–¶ SŽvÂ’êÃ.֞‡ÝXÀЭBZÔÅ¢”¾ãێӬ\‹x«ÓºSb°‰pÊô<æɯœnĕUs¿Uó³Hý„–ßO¯Å#óôУÿ‡&gšãbAí–ÌάüY‰Ú ~öˆêl;• -7Z–A­)j˪ҍEd”ÀþÆГ"5 ¨D…åk^¥öû1!wìZ¿ä¹þØ-¡]Imù +V>ÚçQÑÔñcFþüÞçi$Z™‹©½_¶ëÈ6_ëª\—é Ú)CçÎöÞÅ0ýÍÔWŽ• ›­÷¬› ƒÎ?Ùu™a6u£óš*çç{40°TÙ7˜ Ô£(¢Â^“áªÑv ,õΒ,þ¬•p9yÞJ„3á{?£ÿ[³Q¯˜8_í þÙeÄ^&ì¾+xǧ.Q¯C圭uVžòÐyÐf Œ'mo¼l›È2 í£í»Œ«µx@´Ó¤ø¡®p…Ô›X<ˆõ}†rÖ5ì„—éÄàc›ØJ&‰®­ÜB×I•®¬+ÜÒ>Ú5st²,Ð#㖇ÀoVeÕ`tÅSF‹|peÀ]š]»‘2`=N +­öØí;;,a3|÷3z­´†à¥6‡ˆï\ŋ´. â”lȁà€Ù¯xô‹›W°ÎCµT2QÉ7xZ><ô]àÂt5T²=dõÐõ甃çvg§Vô¦2\ÍØÿ>BÊCb‡.üýr*Az©Dîhók@?¯c|qÑ¡tN lýž’?.Ìùì³¹Àe×ã‚ ¶î=ï8¼Tà¯è©Ë€`u‡YZ»ç.£‚ ¹à +8¿>¥2]Z¶z§W`ó#È^™Ÿ”ÉçÞ">ô6ñ#n›¶Õ¯U™S©Fdq(Ôý¸DHÿy/k°ÞOt¬ð]ð½Ðm¢o3Oè1NÚ.u_² ê#<€Î+|a‡%ƒÈpM@P'ÊrE…®’Ê‹PAnQd(օ¶U™ý1ñ-td)èiõ¬΄p}¦†¶v³žgiÒ;㕋}ˆ4»óW¡dö°ÏoÏïŽlù8°ø¾Ð-tÇë,Õk+r« Xã>Jjâ½ÆpÀÅïòÕ}À_;à0 º‘Õ<’K‘’Oìóª,m"´Ù¾ûiPQՏé^+ˊ‚Î7oÀo-*“ÒÀ1²£ìs2oLm ·¿¡!Úçñqé‘êy x ø½œ•Y“´Ó=ʁ4€Š^`‡ ÿB2-.ÛZœ9NÈOa€Ð÷°ÀŸ é"×÷øþNñ.kf‰)6õÊ+ÄN5ž]›5Cf*$˜R`;®ã|½=ؚÈw½PÓ_ÙlÅÉþWqݳ¦ü¬)ª]®#ƒ`hŠJìšb`Mû:S„Êm¹ÎãŽî+´ù@ö¤²Yx©Òq6kRÒÑ3B¨X'‡Ek·Ïbe³s´-ƒÞ‡È§Ñq¢÷°40Œ*7N3IºY–‹QC!•OÀ ?ûIú£ô«9|Žv‰ô·\3ª­Z¯5ÄdÂÆ!üÍç{ö²‡SP5â%ˆÈ¹lƒx 6Ò£@˜#öêu ‹´Íp`Ãóªê3z) @3ãËԄ°W¥9KÌ 6¡|)H‘ÃÁ ·øÛhLÜa;áæ +t-ÕmÍ N+܉â÷8Zîª-îâ$¦ŠOš€äŽÇL¦JâÝB±6H&Ù8EE¯ô<ÑIJk6â7Y­†¾˜íKi…Ü E?C$·±/Ž#Â0Àü À-Û8?==m—/]ˆ2†ë…Ü%@†X†„W°çV¿c¿âÕ?3ñrš(„ø²Óuôd<€8»,t³— ±À ÂmF’¦F$üaß6¼Ç’X™öËÔ¤j³×î”ëù^ßî¸òtl2Þ8w! Nl¥ Oh•¾e”´ e.#7OFžG,¦õÊŒb™ÒpׁðɶܔÙc ͞­·äk¸Rìäã4Ã++7öè*óqҖ.ð0UoF1ó²iVoŸžžÜ´JëØýZ‚ïù®ÁÇ4À³®=«ÃB?­prî²É³Ï\‚§ôzáäKº%X®âc庺ûóΨਸ਼†l˜¸RÎǘ܊ñU-hÁÉ9WFÀë¯â¥î÷o¯&{BwÍ:¡0“î‘ɳ¡8Ñ{¹µ¯œÙWŽí¼#ƒ)¬P!„یP¶¯¡›+R“è„—e§†÷¡¬ÉêƒÌ‘ê]Y€N­ú.ÅP _¡¨²í}20‹$]™&Á-8aá†l'nˆÓb…ìÜ ]ÝPoŠ +½sÍ“|K»—®Üf`X +DÑè¤l¿>¼ •Ò¼+5ÉÖ²z¬—úîÚ¸Œ€dñ>‚26`8¹0ð¨ðÜ¥ÛÞ+ S›Ñ6µ±î–¦‡³aôʽ«”Ñhvmn'æÏ"Ï6߂7-ë¸JKÛð{•ÄVȍvÉ ]p ãmÂÈ°^Âæ7]~å.àþ?2͖}\¼{gæR…éË£®™öÐõ}ð×½væ¿hïóÂbŽ¹X#M7±Y#0ÎSÛ6S„”>¡¶MmåÚ¶Ól×è©SÛAæ=ۄT>¬«ïi²t‰ÛЅÆ_%Lfzã,£‚Í~¡ÕÔB*†ñ´#«Åä¬ué˜ö' “ºvˆòûdˆt:~’Ö é§xV൹×Ø\¶¶3D0y ^Í~ |0”|ð3C„nÍ·ÊrnӉMûÿG‚„&Ó}8|ÄÊÓ³ÓY­‘+õŠ#¾zÁîèz©^Ö ü¡a›#%(Žº‹,ÛqÌa³îʌ¼è<ÍR"EíÆAÁdœÉt×Mt…65€eýmÝ^öF聡S½7¸ÜëÓУØlbò…ðòUÜ,m@·-cÊ¡1KtqœÀ2ÛwšÀ063|ùVð#† +€Ö¼x0—#ó¾ÔŸ"ñڙȭ.Q0À)‡Áù(ï‰ ÿ«0}tˆ%C áy ¾ºH'.ñHèì~C¥ªI"ÎÊ*m–ù¾Ý ÓÖ!ä.ñåçs—!3k·/úÒ\w¿Ë^šÉÙì%–í?ŒYV3ˆöÿyJS Ïdü›š¼Âú—šù+ ÖåcŠ1´¥ïRʳ‘ßÒf]í¿>yl«m¦˜ª—-5Þ¤ÖU{ôk…FXÆPvç&¢qæŠöO1ãþõˬu;_ 'Y‡þ=֚ÔîºHW•›6‡«Uv¸«’½QÀ궮Ý4sò²Òmoe)‹ýÿ/L‰.R +endstream +endobj +1007 0 obj << +/Type /Page +/Contents 1008 0 R +/Resources 1006 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 984 0 R +/Annots [ 1002 0 R 1005 0 R ] +>> endobj +1002 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [113.91 238.343 450.648 248.241] +/Subtype/Link/A<> +>> endobj +1005 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1009 0 obj << +/D [1007 0 R /XYZ 90 757.935 null] +>> endobj +1010 0 obj << +/D [1007 0 R /XYZ 90 733.028 null] +>> endobj +684 0 obj << +/D [1007 0 R /XYZ 90 683.115 null] +>> endobj +1011 0 obj << +/D [1007 0 R /XYZ 90 637.94 null] +>> endobj +1012 0 obj << +/D [1007 0 R /XYZ 90 593.387 null] +>> endobj +1013 0 obj << +/D [1007 0 R /XYZ 90 549.551 null] +>> endobj +1014 0 obj << +/D [1007 0 R /XYZ 90 507.653 null] +>> endobj +1015 0 obj << +/D [1007 0 R /XYZ 90 473.835 null] +>> endobj +663 0 obj << +/D [1007 0 R /XYZ 90 441.955 null] +>> endobj +1016 0 obj << +/D [1007 0 R /XYZ 90 412.012 null] +>> endobj +664 0 obj << +/D [1007 0 R /XYZ 90 354.283 null] +>> endobj +1017 0 obj << +/D [1007 0 R /XYZ 90 322.403 null] +>> endobj +1018 0 obj << +/D [1007 0 R /XYZ 90 278.567 null] +>> endobj +1019 0 obj << +/D [1007 0 R /XYZ 90 235.354 null] +>> endobj +1020 0 obj << +/D [1007 0 R /XYZ 90 178.941 null] +>> endobj +1021 0 obj << +/D [1007 0 R /XYZ 90 147.06 null] +>> endobj +1022 0 obj << +/D [1007 0 R /XYZ 90 115.299 null] +>> endobj +1006 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1029 0 obj << +/Length 3583 +/Filter /FlateDecode +>> +stream +xÚ­ZÉrÛH½ë+x3aBµ °ôM–,¼´5’z1v ²$¢l,v¨¿~2+ @BrÛÓ¢ö-_¾ÊÌ¢˜ÝÏÄìÍÑ«›£ãóPÏ? U8»¹›%b…Ò7JÎnV³Ïžôe0_H!„÷*»Í³ò¾J·ë¹4Þãü÷›·³@j_èFsÍu„¥G¯oŽþ<’P(fÒ i"?Òf¶Ü}þ]ÌVPþv&|Ä³o®Õf( ß|v}ôï#ÁËÏ.SÁÌ¡¡y?¿/m’üî&ïzŸ1è_ʤ[èæR%ž?_‘ô ór]Øjn ÁÇç‘t •¯êº^Îcá•ùãûì–ÚŽ¦ÑŒéÚþ2_DFy'4OžÝViõH™»²¢Ä&-²m›§MVÜc‰ò¶i•nlc«ì/;—ÞŠKaε]U)¬:‰4 Þ×¹2^šåémni¸´áS ó˜u©wxˆf°Tkìk8“…”~bø(×M³ýåø8[nk¿]ÔM•Ö·÷þ]uL›UC1È ñÝ꡵Ͳú69Ÿõ1näø9™I!ýp'´—ó… +ïCZ-ט”žL’ŽCÚ;³Ë<­lMYSÛüŽÒMIß[ë »P&öc·B#¼eY€ZFYPIyÇ+Äs¬îÔWoŽfŸ]ýçOó@xYžè1ü`Loo#/Tà'nP¦zÏå}J¢g¡¬”ôʸšÊ0|â¥ÅŠŠÏ¸úyÍ+‹‡'À4hôuÜ­‡eûᚵÍxŠ¯ØÓVM¶´õ”î¨$òÕ+ÄEîxӜ{‹.Û + œ|´T¾Šö`YÞQk§}iå֛ç–Ǹ¬æ 2—»§ºÍÕéP?/a`†ˆ‚îÊ|F„ð#1Ê,Lp ,z^Œäh€HŽ!ËñCZ'êy>RѽÏq[( …ø®Wí¶}œ‡HG £¥wRUé#Ֆ[[¹ó«1¯½ôutI€Åm툓µrÑP.…~¬3¥Ðykÿ*³eAî«Ö8a_(À`,‹bBÔRø¡êwÄ"YZ»‚õ Zjš¿ J„Íš's-¼Ó”ÙG –ÅÀZG® Ëà( +ª»n·Tµ,7Û¶™¼J_ï´å«C Ú{G0šR!| W|r8«× ƤmÕø`¢¦,)g§œøíúd…2Tž Â¹í9´Úºþ r@PéŸU ÷@5qÇÁult×ðæ´è‘:_+ÔoÊ\Ù¼—Œ”w½Ԟì@¹ß‹ØmÐI‚8kÛÔ4€£,¼Á ˜&ÞZ>øn¨ãjÖ.Dk=%báq¿>ù›õmDméèW/²nÞ ,æÏÖ²œ¾h)—eÎM.ôdÑA âÇ<Íj›¶\v^¥€ÄNúvi7·ŽwIðúyù¬Ÿ}ñf…éóò ùƒ^JÈæ` @GØ£Ä GXXXäÕo˜Q^Ñn€×—N™¢gPåªÜ¤YA5·iíÈŠK.Zew8hjÞâ¶l n§XïÃÄ1’‚+þÈË:K Dý×G¾v¥›ý[׉^Fn+ø=Ïò¬¨28V : ÜєUýr°@ä&yšmp0Gqðulƒ ÕMwý¸Ù–uÖn¸aA߉k„‡Jù{–6)¥>Þþa— ãõq9O@ÏÏ>Ònyy£Ý*!$Þ1SÐÕ¾ +Ԉœ$whi‚ì ¯Bèo4¦"6JöUŒ±Þ‹k‰/©ó¯eã˜z;aCÑ©£KZÈ]/3G­‡‹“`p Á4^]GÐUׄ⊓´Z·5gÎl±I«—SîøZ¬oöÏëmâƒÁÆ`ØH ¶EžÞ³–½‚LVüs†CÕº}^µ"_+5T-ªj…A\b©¸\6é½C dvÚ¤CÍÚä:„Oܓ±òw4uˆ\ÿŽkº _g÷k¼*1ý mIJz j…‚½»‘ŽW@”Ù3¢ÜŠ p÷WèH¯ÝÆ{]Üg…µ8P:½zýâIÔÊ öÉq뀡݇ýH¸âºi›æ~Ž–fÃEo,pqAþ$¬K &‹Ð€)ðúõkZ_V²Jxê1|JÀpóøÞ²€•ï˜nҏvt, –ð€…Ý…ï +ïz†ŒóÅBA5¸J1?¤i4ßw4 9VÍã;²ÅYyö™Á©Ú ù¬ürç Ðم~…ã£{ƒ]‘[{›§¨o`#>C¿‘ííÏàºI€#tø¾ +dyh23«Ž™• ½ÄفP²oúÈz‚7ñC=²ê`Ý#âDÞ¢¨Ÿøp/pÕ`œ#[c@u +ɌÃƒBî 0,°çutŠƒŒR+®ø®ªlřë-H½óS„è Ê€)egg¦àü üu™2ŽÆFbd† mʔqlCd‡Õà…v dBý!téÂ$‹m™äÔo췝í.̞ †:88-…’3Ö҉£OnÒ <-žæåúŒ:bÿ_’q²s®°jϹâxyæ#ápDÊ sàmu@”ù™Kþ +•üæÆ<ïOíÓÇo0âŠ÷¤Ž½k÷¼eó×Áü×^¥ì4¡–¥\ù†»¼çF7k@z]v})ºõW\ÿÛ߬«4Ï]¤.$kWeëb¾Øbeëe•m9h •Û¬ËUgiÇ@óê €åŠ³MéÒÒ{‡Gß®¹- 'MoJÚåƒã8æM¸õÅs–ƒŒà.ŒãîPÁx/òµ«å°Î₶0YP/1vŽig>À÷Mº±Ü~AÍI?»«Ê/.&ÂOàFÜDZs’»hO$Ÿ=:2òî*Æ/æO +ЩšÊÜÊ"ŒáÁÂ1Ê°ä +°}W™uhŽwW?T¹ˆ4 +7F[)7%ü[‘!ˆ8ÄZg⍠Y¶ÄØ y cØ¡©M¡ +£B~=òùõö{Å aéCZdõ:£,Á+dxAÁyûЮRÇupŒåªÍ9|Ÿ¡eHï9÷­²f Pw–gØA•¢ÿÜb»ÍâX1ú·åm+|ÉÚtk ‹uŠRRùA°çg UEM±×º-pߋ.ÊÔ=#ôW|M!1wá ݕ®çÛ¹ÆøWZLáV?‰÷ÌÈ@¡£¸àu¬’E¬£Ý%&¿#[#ü8>îÛËóヲ÷%ãù&ÑN¾Èÿ"¦'([Z.9å’3þ❰\WeQnKvÍÍHš ņðÛ#­"âA(ÝtI¢DÀ´ +„v~ÔÔY§Û +(]ʱflÝõ”ŽG%`F¸ú,8/§’ÊnAílÑ°P±9™®èá„-wpZD óÉ>Ü,ÁÓA€„¸Ç#» +ðµ‹Rc/‰öÅ#Ž€º5׆ƒ]ð=|IÑ`?P K×Y³3×jêD ´Ò²¼; (¸qæut·ûd„¸?ÐC›MÇA0€é¹HB.f*ۖUCS¼²érÝ <Òx»ižLŠ,ŠÅ'ëìB +î«c!ÿAFü}÷ÕNÈ~ëÎq“yMätüfÀ×iJ¨½Û­Å’6Ê;w«j±²Ë¬ÎúòûÒqbMù.Ôò[ wÊÁtçY±âÑ'ÁªuN¶z +¬laÇ~¤'ít(º0H!vA,“à¥Ù:Ó3£h,d)J%p§_‹UÿÞ»1w²sC°›à2ȇçO¯_Dс+­?Š’£]à +òv’tî7‘ÆeUº(Z¶²d™¢ÿyu pÑyx¤à—EèÊ>˜eäpõè„vf8nå:PÀ +ÿàR—é Ò=rqªfí^ g·ÝàYýÔ¶K ‹âûpœï«B> endobj +1003 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [113.91 708.58 374.71 718.861] +/Subtype/Link/A<> +>> endobj +1004 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.917 696.56 217.053 706.906] +/Subtype /Link +/A << /S /GoTo /D (main_Wil93) >> +>> endobj +1023 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 158.577 146.887 168.923] +/Subtype /Link +/A << /S /GoTo /D (main_NO80) >> +>> endobj +1024 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.426 126.139 411.403 137.043] +/Subtype /Link +/A << /S /GoTo /D (main_NO77) >> +>> endobj +1026 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1030 0 obj << +/D [1028 0 R /XYZ 90 757.935 null] +>> endobj +1031 0 obj << +/D [1028 0 R /XYZ 90 733.028 null] +>> endobj +1032 0 obj << +/D [1028 0 R /XYZ 90 693.571 null] +>> endobj +1033 0 obj << +/D [1028 0 R /XYZ 90 661.252 null] +>> endobj +1034 0 obj << +/D [1028 0 R /XYZ 90 617.297 null] +>> endobj +1035 0 obj << +/D [1028 0 R /XYZ 90 585.417 null] +>> endobj +1036 0 obj << +/D [1028 0 R /XYZ 90 529.626 null] +>> endobj +1037 0 obj << +/D [1028 0 R /XYZ 90 485.79 null] +>> endobj +1038 0 obj << +/D [1028 0 R /XYZ 90 441.955 null] +>> endobj +1039 0 obj << +/D [1028 0 R /XYZ 90 386.164 null] +>> endobj +1040 0 obj << +/D [1028 0 R /XYZ 90 355.001 null] +>> endobj +1041 0 obj << +/D [1028 0 R /XYZ 90 298.493 null] +>> endobj +1042 0 obj << +/D [1028 0 R /XYZ 90 266.732 null] +>> endobj +1043 0 obj << +/D [1028 0 R /XYZ 90 210.821 null] +>> endobj +1044 0 obj << +/D [1028 0 R /XYZ 90 155.588 null] +>> endobj +1045 0 obj << +/D [1028 0 R /XYZ 90 123.15 null] +>> endobj +1027 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1051 0 obj << +/Length 3573 +/Filter /FlateDecode +>> +stream +xÚµZYwÛ¶~÷¯ÐÓ-uNE×¼9^'¶“ZnsîMû@K°„†"U’ªëüú~ƒ©Å²Ýúœû"€ƒ³}3P0˜ ‚Á»ƒ·7‡g±d~Ëxps7ȂA ?’bp3|õ„/ÂáHAà½5·…©fu¾œEä= »ù0…ò•`6Û]¥D=8½9øã@€ „2JüDEƒÉâàëoÁ` +ú‡Aà«,ÜÛ^‹A(Êb0>øé pÛ žÝ¦ÄÊqÄë~½ú’¦¿Ùµ»A‡gQ°1"¾”Q·Ïwþp$q¦ [ +ïJ/æùªÑ5“órÊô ×ïȕ_†iàUE£ùâÈóiÑóDn¬%BéG"ì;/[= o6÷h‰ãjqkʼ­j“Üöiٚ…ùž·¦*yú­£ˆu)ºéik™ÂÖ°„)ÜÎìÔ´pÝLŒ.'Úrk¤Dê'‘Œ„ð³È]ÞX×F7a‚’ËÓLj}ۯ˼ëö3qÝx÷ÑöV±…~¨æn’Ý-ô.ÆUÙüÈU‘¥©¿Ã¹-^dègA‚=§(•cøç:O’g9®2?Šû[úe(dFw¥ÂÄ»v%&i[Ôc\ú ±öžXTq£Î›®áð_}ÝÏ+ðßV'ŽwÄ'K0®Ï<¯§nÞK½p6ºl݄Žr¥‹¦j¯”*Ÿ–K]2»DèÇQ¸Í­InÖ¥)gŽ\,k½¬ -@_Õ—ع©]‡| Ùãû"µ¬gN?¯ß ¾Ú._¯>íÞ)t|ëe«·ºîؖ$¯aÛ8{^OUäÇYÜqíØ +·ðÞÛRzŸI”òe>…嵩VÜÌâˆö®ÿ¸ÕfV˜öû^õŒ”Ÿ„Y¿ÆŽbø¦T¿W ^GÅ Úù¢á•Ü’V—qx™öaºJ%`¨Âµº²&f8h ·y{RÑùþ¤Ÿîž?¯`u'v'Æ42àôOO 5õº”½F—~º¾Îâç­gìË ç +¸ „Õ¥(ó~ZAêìT{cG½Î¯À¦ùš¯m[ä$7Ã$ì†_›¦ÑVUì}*™¸ÈK³\85I9Qþ7ZVÅÃ\OëÜõÅ$8þd^âv +7—^VuË÷+aï³lûzE bwSç×çã#W?Î˕3l?—f({4¦ÍMíŒàԕou^½rƒ¯uYêŽ3guåtVÅCϖø•lI^Ãn²E†©e QwÙB4–dtêØb;vlQAfÙBÄm¶eƒ-<ǪéÛe’—xÄ42Rzô4‡ÈD:_òXoá£H­O {×Ö ….œºÔÃ0òª‰nšÞB^è~,{³Ï›©dý´ŽyɯAHüˆ7"#‘…k{Áî‰$´ûÜeæPEޗ xž¡©ËMÑ‰!J?qÊúW ډbU“J®=u{Ä`td£ñčp~yª-Cï.uí¼õ³Þ¥¾#]ø5$0ÄPxh^Ës@è[íæ-ªjÙ0ù®®LdÁèx ‹»cë¬&ï1Ω¯± jv°¹ãðÚSµª{BçëžâþŒÛ ’Œ=‚&ØÝ® Ȕ$!²’ÆÙ(ÌÒ® ø­†å€ ےpýö"xÁچ›‚Þ«e’€sp=®kgíNª΂ô6/òoµiæen5? óÑöÁõ¹0 b{ðå.àAòV¬föêÇ]k8š ‡ôÀTÇbԊŠxq?"÷×õ*rÉü8Œw‘‹“8…¥IHoJÞû¼ƊÛSœÐŠ % Œ2K+סõ}U;Øï⃸wñ½UÀrÖðd,å‚0ÀИkGCü_rûøüÝç HÿÑ[Tõ·f^-ÝL%—N[Â| n| 1oæôϼXu˜1uê©Ò –0öè6oô”[÷È/7\öÆxo€ýøQmHs( Î,ŒÅjˆé°-ᎁX ¨´õDW«vÎ=¡T ôªÌo±¶*€ œ^üÜ;VºP‘ɱ7juæùñÚLùo󆶏p ø)ÝÎËug“—¯`æx2ϲ¸¤w6O”‡qµù½ÃÈÑþ< +ýpEÜPüöÀÃí- ¼0¥Îk®;©öDê þ Bžé[©Ø‚Ý:}`ΧêbpÔm Ž²ÁYïBò¡;Áàÿ70ϲ×ðu^¥ây÷ø@,Ý-ÙXòzêJŒoÚü¾"Øø=1SŽÐV8¦QÕ?V¾–sPn)\—!EåËU»T‘¦ôÞLWºÙ'1‘S +ŠÛÕÊ ±$7TZoA«t>ⱤÀ©Aº¶¼OÇ{ .B .€‹$ÉÖYñšËÿ¼I|o©”ÞØ,¬ *€Öµ}Ä=Ú :á I¾`\¾ì8Ñ羆QudÉ&HŒ[+`3«HhÈmü¬!¬nBkDÐ`£{Œ¸6”?!ʕq™;Ž÷ä`g¦`Ì&SÂæ老žJú*ê¹3&ÓIÁIf?4¦¡ˆ?{@ú°ùè@*"$7Iµ]¬Šðtü°XVY-ö9è6jÅ#¾'1¬¶¤ãjá¦cö+?>L‚*ìã… =iWõP%^—î‹ÛÈvUµVc0'Y•H›ÃXµì½xæO€xúÄᮝÃt©Üì±]ŠDȤb×ð‘P[UÎtÙðrd¶ÊÙmçf¨×‰.yýÍ}ÁÕ$ä±}ǔ×"!" ò‹qu]䳎ýn3[ë-z˜Wy¥Údêy Šý4èíĉMc`“@Ò²þö‹6Ët +‰K]Ý6«ÅÒÁ¾(ì²!¤'S«'¹dGÈlA PFÓÖ¹Íêý•áÔTäålå.-÷Ƃ5jèL$-Ñ+\wU~šEÒ‰n½fi® F Ñn¶áÄÓ.èH˜ƒÇ.T#) +Ãîõ ÙÊb?Žv‚0k&Ո ¥ÑH…jí¥Ô |N„”»ñøxü’¥Œ|¦[^*„©Ô%W\ºVzÿ]'–•wÕu«Í7`yrb€ê§Y´2Yµùm¡»ñlløË¥MlÃ-ñcÒò„dD:¼%é$UtÛ§›UÇvŒš˜z‚` æ/'Ìô&BìA”„[Á|Ú#Ôñ¼ÜÃýÕL<E)Å֞Jö‹"»%PÎOOOûHÊR¶-$‘Ž«òN³É²XÈNYry1Áz@¦O}©Ûy5mø\no[çr©¬Ð»D¨i—tWÕL<®F'@³’é$S—§—ŸŽ?œr2:$b{Å2ô“(۔K܅3y4Ve£ÐfP¿2œDuFΨ© µ—ÓíÊÙ^7ó:Û4 bã_<¿$ÁËp{ €,hk+ëD—¿Eåص1Œl¿Ï†6å²7„~Eë\;ÇMë|ùöÌ[/_–b\yF²gJCORô}bð'$Àü}¾ÏÅâº)7ñ8èy¢dŒl¨±?éMN¼‚_ÈÙåuð¼{ ¥ŸôbFÀH)ÅYu›¸³ †ZÛt;,ü‡'# „"Bôæë}>¡ã~ã¸æâAÃSŸhØãy»çö `bCY3‘zGSDœU9²;ÑMBÐTðñˆ y«öÝ¢™³YCãqåÿÈ꼜ønûo+Î8°èÇ &;ÎѾ¬‚zíõëý»ë§\֞B>JáÎO ½ =P÷DÈSҘ°»ï>Uòì J—©Š=}:¥lK¨6ߪxYcxüÚû:Â{]ü©íç#&¾|>0qø)y#³†*îEÈÓrFŒuï‹0oMÑ¥ ùýøù'ƍ»Œ‚Go¯çkü;¾ÊTìò5 ¥ +¨Mzºcð÷m»Bꂔ[Y f­¥o>U…]¶3•ëº,.êiÜjÎéÚÌ.4ëÞØElå5`MÛÚܒf¯Z6…v«•ã,…:Ɏ/áÀ~µOŠ1´wùÂú3FLaûØ$Á~;+$å=¶@z–+÷ZŒÙdÈ4›ÚÀw$ƒ¨_|H¢Ó¸]M ¿­Aw:_‹žŠ$€BHJ tèîÍÜmfëÔOåĬ3íò`vª¶Ï£]Ù¬ö½K‚aÔúO½VDÓ +›™vÊ þµ‰ò¬ »†Éu¹u;µ²cS7NvPïdçUZ#RÏ/Å:™¯²­XGJŏìRí<#!~frankV)øuZq‚@ªµzü]-ÝëSã&ºDE^ +6±á. `eºv™zŸjÎ+X›ƒFŠá5W÷ðÙ²«û7E˜îÆqUs˜†°„æáºÖó[‚ $”û烂ÈqÄ1J€GŽŠ¦bâ’ݝÍÚgriŸ™÷™uøº,ìov㑟ÇYØ_RéGk ¤‘Ût÷͚O/H*Ý>êÖãôã°i÷?[1ÄâþeËþE ý,ÁÂü­ˆ2 +ûìNºÙ}n¼Ó[m/<äó› )°¡f¹êBIBï=›;ïøí„wj9ÖÚ’OömÐÕ>’žDû¥ç?µìçm»|sxxïOUšeí›öp¹,kÌÆ,²5ˆféÇÆU÷/SÞQDÓ¿qoÞÿß{)òF +endstream +endobj +1050 0 obj << +/Type /Page +/Contents 1051 0 R +/Resources 1049 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 984 0 R +/Annots [ 1025 0 R 1046 0 R 1047 0 R 1048 0 R ] +>> endobj +1025 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.77 677.099 290.746 688.003] +/Subtype /Link +/A << /S /GoTo /D (main_NO77) >> +>> endobj +1046 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [273.082 173.354 309.535 184.258] +/Subtype /Link +/A << /S /GoTo /D (main_Wey50) >> +>> endobj +1047 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.932 130.541 405.385 141.445] +/Subtype /Link +/A << /S /GoTo /D (main_Wey35) >> +>> endobj +1048 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1052 0 obj << +/D [1050 0 R /XYZ 90 757.935 null] +>> endobj +547 0 obj << +/D [1050 0 R /XYZ 90 733.028 null] +>> endobj +1053 0 obj << +/D [1050 0 R /XYZ 90 705.479 null] +>> endobj +1054 0 obj << +/D [1050 0 R /XYZ 90 674.621 null] +>> endobj +1055 0 obj << +/D [1050 0 R /XYZ 90 644.481 null] +>> endobj +1056 0 obj << +/D [1050 0 R /XYZ 90 612.905 null] +>> endobj +1057 0 obj << +/D [1050 0 R /XYZ 90 582.167 null] +>> endobj +1058 0 obj << +/D [1050 0 R /XYZ 90 551.308 null] +>> endobj +1059 0 obj << +/D [1050 0 R /XYZ 90 497.138 null] +>> endobj +771 0 obj << +/D [1050 0 R /XYZ 90 465.562 null] +>> endobj +1060 0 obj << +/D [1050 0 R /XYZ 90 434.704 null] +>> endobj +1061 0 obj << +/D [1050 0 R /XYZ 90 404.22 null] +>> endobj +1062 0 obj << +/D [1050 0 R /XYZ 90 351.135 null] +>> endobj +1063 0 obj << +/D [1050 0 R /XYZ 90 318.339 null] +>> endobj +1064 0 obj << +/D [1050 0 R /XYZ 90 263.451 null] +>> endobj +1065 0 obj << +/D [1050 0 R /XYZ 90 233.31 null] +>> endobj +1066 0 obj << +/D [1050 0 R /XYZ 90 202.452 null] +>> endobj +1067 0 obj << +/D [1050 0 R /XYZ 90 170.877 null] +>> endobj +548 0 obj << +/D [1050 0 R /XYZ 90 128.064 null] +>> endobj +1049 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1072 0 obj << +/Length 2907 +/Filter /FlateDecode +>> +stream +xڕْã¶ñ}¾BoKUÍrx›§ØñnÙÙ$›Úq\)¯(QK‘2+úûôâpâøE@£Ñw·¼Ýiçí><|óüðô> w¹›'A²{>îro—&¾þî¹Úýìû·Aì9þþ£ T«ú¢áɧéÐè’Çu©ÚAÁ$ £Ì óý/Ï?<|÷üðëƒwy;ŸpÇ©›†ñ®x+:ýÈ £$0„¡ë%±%Ô÷¼?B)Ð÷ô>ö÷voƒÔÍCAù¯½ïûŽêݵ|4|äoó÷‡©Uñ¼1"?u“@p|Û]ö¾çÜz}ªGÞúŋ½oáÇ_œ¤Ñû^ ¶ÏÝq¼â¹¢Èû½;ÝÔVÅÔß·¥KlFî"÷¾îÌè¯È°xñ¶ÀË\/Î`‰èªÇñòîéé8Ý®?= æöŠ+oÍQ~Xľû )Rý­#ä±£ü&ÎEõg=ŽªbðØñ·N𦢕åJc¯ûÀs¦Q0 ê¼õÌÛá°V¯vGA\›«{ˆ°+§³jGàQ襎`ê¢=éö$|ÐÉùn‹äÚNäU4M·bçª*—•5‘v¢5aäúYÊç>õ{?sTq>4¯éh±\ò\«?n`0¡—#mü9‚æˆN67ê(ô7˃ǮçÁðBÅX$0èÆZÉ®¯º­ä*b;|éP×Ü;}–JBsëÀ3¾çny´" L Ià\ú¢uI {¹œ0G+5èS«ä<©~‹¯¸ß G­âo ¹u“… ¬ºóýñ¡FüªÁ„ú¢OŠÇ#½ÜO– õʜon²¹kǾP1ƒ 4ûc=¬èabEãYô~¢ nGÕVJ(!šá{šŠ¾€Ù,/„óçÐÙ,’÷Ґ_˜-^ˆÀ¦áØ'úŁ!¤°½àé¥ïN}qþ‰A~žeWM|“!@zu.´AwdOˆïµ×H•ð.CŽåØ4QÀõȝŸöÜö¸ù^ä|FÊG÷—ÖÖ7 c¼€W- + Œðpb„‡c+<œñ¡Ÿ‹ YGß©çÁòÉP“p©¸\ôƒËG%¢“ÍбŽ±g|Âí…MýäY¯U JL_|ªÙUÈéƒ|™Óˆ{ëŽx¶C ”“x B¢%RkÞÓ&z #Q•áÑlè6ýÊOµB¬)ºaü‚f\Tñ•A¤}©U€,yˆ˜3ߞcE‚=½:ª¾çhŠ 09ÅQ–/=Èߛ…Î?ˆøti±éÂbÉÇÙûÁÊ+ndá´¢ˆïî %Š¡àz]Œ<º§aPÜØyû¸÷2!GÍ~mqː 0`#agdÙ½°B€`ÃNƒãÀ w*ØD‰fµéq4 ̗—ÀઇS"äzš˜·.wôªTð}.P£RÆeWɈnG)" NJ°ió}q?=®µÛˆŽt‹‹ÔzF³/'‚îÅÄl0`2ñ¸^ªU„5ƢŎ ÁÂôcõ›–c÷ÍV&a¼í(n/,µ2®£V†0ðíiãM҂®•N§U9òÄX5xsLw™2±X¶ŠÝŒh"V³H[ÁB®jàñ±'å…Q¥Ø±½ÆÆ +âh&Ú\+h„”bøºqFóê1Šöÿ#N$‚Œ?ö2ÌpÀstäWÂ0`œ¸ëÞRª~,PŠ„D ˆ—ú =’­!Tùk±¬“ðˆq⸓–¸•« ÃÐá s|ã}ç®ÒGë ß±/IæÒo㪈Û­d/³Ðbã¦qlí9=R8ùOq¾4D¾—³u +K+O7j„lQdR¤ ͲfHÁ1‘G~ÚµVa à£6ç…ö[°XÈ\’„”Ì9O”¿ÂèR ï¦ê À¤×´(‹é¨RÙ-',†ƒiî ÅYv /†‹-gÆh´r„Ƥ<_Æ`Ø-dÂöeÞ塾ï}3™‘SØA€…ì“ءؗ`,¦Qºá|Ñô|{ ›}•Trˆ·¦2¥R’=üÙ8.뗄z|úȃÙ9ÂDœ#Œ¬—‚ñUµàἌq £º ︂ÅPëK¿öÚ[áq¹ê.ÀIRƙ¬u*ôj5#‰`nL€UŽ&m´Ò™sÄ»’ôÄ +"¾v±¿!aœö˜±KäÂÁ0·UŒw±-ÑAŒLkÓçH÷dÊØ{ö;Þ&JfiUFÂHԟ„ü×Rál’4÷ ÏDœÒ‰Ò…èYâ©SB2ÝSÒ Pöl—FêšÈæ5L§R)tjEö",,ã‘äS©a=‚0 ØæRÚ.·7æ÷øБ¾K£bé ¥ õ–öÐ+±ïÀçúæ¹àçzè‹~tOnسÎÊËI*_i>ŠÖŠÆæO7ÌpØå4ñ{¹É0[º#˜½6'‡é6ڎZ4VY¢¹ôj¶õȐO¡ð)À\Ýw€-¢º1”žÄ„°U(p¶¥€²\ûM §‡Ì $w2\˾ã4r_Â&IÖ{\¢0Áü~dP![°9nô±ŒÇ]–¿WiHÛo#{¯[b/ça8‹¼®¿as-6EO9økà%p • çeג¸:”PG á÷Ž‘Ðá1҈úy„©à„dvj…#دœ"6 +ˆ·¹5¡·Èc8S=S ¤8থ'¥£—¬iö8iÄï‰ûYo/SéÌ1t«"{Ô»,Òþ£‚‹TÝz©ÑqX&Ú:9r•%lóȦͧ‰ÅÃO§+>*unŽý¾RSƒ º]i¥Ê}™`î•,yz”Æo¾~€ù'ˆsل»´\ $%¯°àúÍ¢ºôZEO +‡í€J³dã±ÍN®WJÏî +£×€íÀaýØgK}‘êLs×ÖñÔô¸¿Çò‚ó¥ö-²i»4¡ð¢³5ØM¥Gñ ËÿŸL®‘w+Õ·µÅd²–²˜µâøò_Ìõ_ÏIææ~öÿþóLÿ8ÇpÊÍÓ0“?œã܍ãhłO(¿¢?Ë_qŸºæV«ª/L‰tèQ!hò#8ª7{ô<ÿäA¦&Ââë>rÐs}Ï¥’L2¡Ïœõ¿þ‡ïL¯Ÿ¥nè«?|¯×«[îÔêKïêñ ŒdãÏß?rS‹ä8—]æ_CÝðL2yÁÿÿW£Âå +endstream +endobj +1071 0 obj << +/Type /Page +/Contents 1072 0 R +/Resources 1070 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 984 0 R +/Annots [ 1068 0 R 1069 0 R ] +>> endobj +1068 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [297.062 674.352 388.718 685.256] +/Subtype/Link/A<> +>> endobj +1069 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1073 0 obj << +/D [1071 0 R /XYZ 90 757.935 null] +>> endobj +66 0 obj << +/D [1071 0 R /XYZ 90 733.028 null] +>> endobj +1074 0 obj << +/D [1071 0 R /XYZ 90 712.582 null] +>> endobj +379 0 obj << +/D [1071 0 R /XYZ 90 712.582 null] +>> endobj +1075 0 obj << +/D [1071 0 R /XYZ 90 606.87 null] +>> endobj +1070 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1079 0 obj << +/Length 3186 +/Filter /FlateDecode +>> +stream +xڕɖã¶ñÞ_¡[Ôïuk¸ˆ"™ÛdÆvƙÅI·O jÁÍÍ\,+_ŸÚ.ÍO.P +Ô^”·yÚx›nþñxóêûC¸Iwé!8lO›ÔÛÄþæ1ßü² nïƒÈÛþðñgéèJ·ªàÁOñ0÷ߛLW†Aî“íÞ»ýõñǛïo~¿ñá,oãî(ÞÅa´Éʛ_~õ69ÀÜx»0M6ZUnöAm±y¸ù÷· Ó÷wi–Ð Üy‡ˆ }üî?˜”×ßrçͧoß=¾ûôñ‰YÜÔÛÜû]¸Oy¿·»½}oûVö¼ 2½©«nÇû"ïËû>Aøx6Ýì¸g@«Oº•É¾æö[?ÚN`@ÈM}’ugý¾:щ”ùñîìGÊÞÔÍ-\êښ§sÏT…‡`«Š®Æ^¸-µª:fÓµ÷…yƑæe…Bš/²²?«^5Mqå%}Í Èoôlª\¶àÝ°½ Òº}îî`œúÛnÈ΂ªãM.MVWùõuëîEŒç{•ª{îæ7Ž¦¼ÀÇ ýíOmýÔªRXNX“Ä +hU…÷ºò‚Ù¨c!ˆ,É<*øÅsÞ2T9^–P²@Ï1å>ôÂíw +o8Ù*hÍ-Ü^¨ÈóVw‚ÔǗX¹6^îZxU„ÈYºENU9wp¾Õ™iŒ®úɂR]¹s96™Û ÚþaòDC¤±u­ŸlŸn#@lþ«F½XÊÛãm«a°.ëܜ®r,À7“ç„‘Èv{ÙkÙÀ£S[—Ü#‚R¸_®š^PÅtÎß6ª•)R&ÄJòðâ\S͈:á¤êά’hõïƒiMõ4§‰DcƝ_¾Ñmi:Té;Üq°j$ ª bMb!:¥zfÜÐ'J¡µ‹4ŠäŸ*ëyèžãmñû Ø>Z4 5CÑ;L“+ˆÄÀ+‘háL‘eš:;5±JÂ3¦mEÒª-ŒA™œ>µ6‰ç <®­Fáü:îUÁ{="Íj¼…\Å¢·›' R‡ÇaÔô졚½]¶&ßp·Ù½xËWÕ' ù*M[7ŠÔ®)‰ Æ#qd8Ì÷‚!—V 'Ú +浦gšs4Çû”&ëAà3™ÝE‡"çý ÄÖEÀj°Mr´£Óƒ[XQ|¹Ð߃‘G¯ZCÞÃcØàâäÉ®2Õ UP—`¿x™Ø[œD×c²q×\E $^ 5çŽIfÝÊt#+xL⒠¬Ht°‡ ¤³ìe3ôzÕ+Ía²e«'¯0¿’mÓ²Åà'šÅ{Ët2E¸ÌTY1ä¦nœ€w:à{w}kŽ·Èí¸ë³yÂjYê&üeRQÆ3: 6øwëþVlI|àÉ-L!.rÙ8Ao(F¹[8$#úÐÕ¥¬Ëê¡âµõ9£.‚ýŸÔ»i%íEÅ×uȋÅT·{p‘"ˆ&yÌoj3h5ɋÇÐáÉ0˜9ºà”Û¸fu…#˜lD„»À? ï…Ò‰yÂ*m{¦EhˆzšîÃöݚj}ƒgŸdßÏÚ–ƒ‰ÅºÑäµõð4ŸubN£J÷öî–è*Ë÷žídwØ8Ö¡Å\0Øp¹ª{»fÉ(¹ucwò¢ñ’Ó' ¹›]ž=“IЕ¦PW<Þ;ˆ Ä¼n›­!ÍÄeï‰ânÁu‘– ¢@"íYö°)éÉTñ„’žéù¸Q‘ª¸™Ý¼ÂHmME…ö(v¥©`UA1\úÑÑC°œZõ‹Ah 0Úõ›‡“G€evDdO'½0¨¸¶¢W &F–¦Ð#ú´³“îYh±·gªÖcŠV<‰é¸­ê‰³S-ÈXe0ULšØœ—>‰šYûÐsÎÑm™òÌzÂgb ®…$ei„·¢HÃä:gËIrD`ƒ}و1÷Ê­_ʽå=\0‹-œûà I7()Àe§på\£f\dum¥E;hÈ +Ln²ö píå”x$Ûw'Kƒ°w©ij 6Å´ƒW*àªVÂÓÒ. *e³\¤¡ôC¬çŽSÇ lxW w3ˆS±?½.ç.Éy."Q°èÞfî.ÁÏZØÛ»õ’B·Ýʗ<í¡(‡Êäˆ7u®¿¡²ÀQ>„ûh¦:À‘É8ƒýbˆ`DÑvðªÁ,Ï tË-è4” sxÌJî¦+ç¸ÜI."€ãæA„=ªæÖô”s>øéøąkìŸ\hœé99‹êÞ=Œ…î—ç/“…8%‚z…1hΐwSjbà +²”Ð.¥@bk¡çò ØkNP>z-CŽ`݌ˆœ«OÄ@p¼ +n $¨Ÿ ×ù¸÷~ͬ Bª-DÛc;Ïˁ ØÄ,ü¡õaÐÉT'=zÒp?¿« ìÉX0Böi°‰¢œl(”€N{Jªzԓ¶DUš7Ê3 +#g]ÀÀ«¦spi–*kŸæz Šºq¥7+.õ^‰º[šV+K¬‹)gÎ׎íŒß›c«0€µuŽD* sÚyŽ!A3À§ ŽòÁâBåã-ϒ·;¶%6BN]Yz«(É*¦ ×8`ò\ZÐȵSÎ9ï•7&O»C`’†²@šˆòŒ@Öʐ¥ ÊžÕgD1ÇÝ0ûAýF o Þ¬Ñ8q{ßßJ*ӗ³¡ +!ž+ÔPԈ®ö Ȟ%þ×á_¹Óô´ ¶aLìÓK%Œ‰Á»è–å¨ã麢+–lZòyv ʼnÅÅÖ¡Ä3{»Ø9öÉðìS`wNÜakáöHS6…¤ÃˆC­]pb֒ÃܬqQ‡ÕæämÇâÓa<@Қ±tXMþNcpÚ·[ F|‚Ãn€¡¹w””XÓòS²Ë gmÍ:T6ÊèCF/Í9\™;Y6T«BÕê&ÉwBÌØ: WÈ,39Š‡(œ¤µ•.í’BdᢎìM,V¡Fº–¼®bÙ¢þiÍ ŠÛMF›ñ ™’2_`ÏÁ~L„™ÃÅ\ˆ㾊[Ëç ÏXµJÁ̄úvàh+ Y¶&ALd +-@1Æx@Í-Øü|Èôxê +?y¥+«‰m®9`x0Ÿf·¸ut¶ TÛ8o½LÀþ.•O$ +uÀì\ÜSJ›‹`,þý04Ó/©xÑt$—ª4¹v{KîÙHü/×­ÃÔzÞtԏÙæJ뜝l*Ÿ,Òí} êõj­ÆT҃È`”pU-á„Û5 ÀÅ®\Êâ ++é=qŠ->@ì]±Ïäⴜ'߂ åbØbï„ëH$ûv°¬ƒ»Á¸[ð¬'M}[ü¦?׳,KFòù埬¡“¸`Œ€¸ÐP¹”Ì|JI³PöyöéXâÿv pÇ0ÀvÈ,9žp­¸o†¶q÷u]t_,“z»‹Š¤T2xa€qÕ©Õғ@«ãåÖuÂç­\É4¯q‡ÞALi„u_”Zf‰w°OLxU9\>ºkϺ”µ +F+þ8vßjbÉ;bÿ¥ÏDÆûí÷È7v…¾ý<‚~Šœd¼]j0,z°êûÓ² Á»oƒn#/(D/ìÕuu†e‘|Ն±CAv* ýoÃcßzHèL _`söqA4Ã%æzQwVœ¾A¿°Ç;®üZ©Òd,=¼°b& ºáèäeµ Ã!¢©Ð›}èH%èè­ä¬ó˜Îªq ØO¿ž¤ï0¼òxþڔ\)@®zÅK°.0T&sUWq4%f@O(¾yånGÝ_´v)+$UÆ'™—®'•i”Ûî _ì×SÏi7_,‚¬À†ÿ¢Õg(GºÐqÆ‹o:¾%q+(w32ôÐi¹š)~ƒw¨¡¯á}­|à2þҊ=¾,þÃþcù?ŽC²Kýä[ÿÆA߈`×.ÃDþ½¥»(š9dü@†”*È&dX׳Î[eÿ퀢.借á¦Î +GEWƒý‹ú»ÿ²ðv¾·£:¥­Ëh-—ä›=olï_øw“hB¯ŸÄ»Ð `Šè=÷}ó÷W¯.—Ë.ëv M»3ý«¦)^͞mqkßßïb‡äd㝲+÷hxI¶wË÷ÿ†¨H +endstream +endobj +1078 0 obj << +/Type /Page +/Contents 1079 0 R +/Resources 1077 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1084 0 R +/Annots [ 1076 0 R ] +>> endobj +1076 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1080 0 obj << +/D [1078 0 R /XYZ 90 757.935 null] +>> endobj +1081 0 obj << +/D [1078 0 R /XYZ 90 716.197 null] +>> endobj +1082 0 obj << +/D [1078 0 R /XYZ 90 691.872 null] +>> endobj +1083 0 obj << +/D [1078 0 R /XYZ 90 368.726 null] +>> endobj +1077 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1088 0 obj << +/Length 2684 +/Filter /FlateDecode +>> +stream +xڍ˒ã¶ñ>_¡›©*—oRޓ½‰]qlg’ǕÚõ"¡jù2AîDŸnt$%ÊÙ 4€F£ß »—]°ûáá»ç‡7ßgñîà²(Û=Ÿv‡`—g¡ŸFáî¹Ú}ð¢ýc”Þ¿üÊ ÙÊAÔÔyšŽµ*©ý“*e«%tŠ8)¼$ÜÿþüãÃ_Ÿþxa¯`Üiîçqº+›‡¿» +à?î?>»W3«Ù%Q ÿz÷þáŸÁ’Î4¸¢3Šý K‰Î^ £&Jºýdz¤Æ»n¤î»¶Rí ÞwÓPJi„ ÃÜÏ¢„0=ÿßeÔ>u5ý^÷!ì=|¢žjé¯+Ê®š×6J½Ïxöîщ7ô)sªÇÚÌμ~èö!LVљۍ2Ob´À5`DÒï–{‘íétFñà‚¹'ý{°5Ö^}B?A44š¦]@GhpjkÕ(Þtâcòº­ b¦þ€bjºJá 1ã€Ü$ÎYÅÜMc?´è4t AaK*`A°’X…9Öh©ò0Å°àmM½ã…Ym2sꀒ6üA,§­3ÒÑâ)FˆSïE‘°q§–Æ•Ñۍ Ô¯µ3¡§G5N£Ô4OÐï–VÎv÷ +wz¼n¦‘”ŸÚIx­eõbQ³8¡åì ?Ñÿ„È…â Z7£ãZ×ÒÁ¹¹)ÿ˜ø´ð5 Ý{+mˆá¹ñ;kËP-pîë¬hÓ þg"&ô* è₍Ÿ“„­ã8!ÍC¸±Dœ DôâeŽ’†n8ŒÓ,‡5Í!ç‡Ú²ðªŽm7Z<í> ~.H<òªÆs71Ž¥½âJͨêuڐ«·tŒäǙW[!cÇÈàUQ7õÙePÃzyüƒÃhò˜fŒu0XS6ègø5¸ätÇnAŠ&ÄÆ¥šÁ3ª»š[ý4ôݕfñ!Q ã¨ðÎ]ägcæqd<_C#VÆÜcGR‚„Àºˆ©'×V֓^Ø Ú0m‘'J(É=‚K-%Iæ¢ y¹1‘RÕ E©¯P:ç„Púö1ÑH’äÚ8’ÈÜ$& +TvMoÜ´‰&דPÈÒÔ4ÆlÆCf¿ü“xCæäVaŠ0± XÊ LF+(PâþgUž©ÉôÅh¾ÂXH” ‡®¶…Í£#‹0Ju†Â•f2nmû§7»lÒ̦Qù†¯LWšŠ]NŠØÒLšéC“Æ¿îhÊ]2¤´÷M4}:ʳ¨OFº…KK’|1£Rƒ,GŠÐ¥d!É-›x©vÂ͝fovVG5Z8š¶8T& î™ج/ðßè.¶0m[)ÉRVÖy/ôÁ4je³G DqTd-Œ«;«ž“FR\hÁv›¾ýÝ­XFbˆq§ŽCQâ•j(§ò£¶4çƒQÅ“®Œtè¢?ª/7ˆIŸ¢tWf—sÁØQÖX)BAŽ¼÷¦Ú+ÛÌë\Žn3j¶‹MpÉê-§ØN1 –áä÷x¹âÕ` +NªÅpqÑòÏsñ˜sñ§a±¦q3KܯøW\1É+ÞÙDÚßÓ2®¾mGõøNðý³!±©ÿI¼îóÀû‚ìþ—ŽrÕۀÀ9“Þ>÷„Í£¤%ec'c­…­‚¢ @DKi’Ûžx6i6œÛ®î^T)w#…žg al±ÓcþLI;öm没§©ÆPU×rð" 1”päÊ3·QŽ™ü¨Jƒ8Ͻ0ä5'úS\…Æo{úµ®)3kb¼0ºªë#:£€þ-jŽvçðpÈÀ%ANwëk¨j1¬²µ9Ñ3^É)U省µÐ6²UΏg±²žJv, ½é/~;K“æp¤ŒãèN2cVMÃ79MìT ‚Ôáb¸Xë à˜•æÔf#ɚ†{6é&P†aü9*Þpãô8ÅÈ—¬rC,S€E`a¸ƒù÷•¾°Æ >s37ٞ³c…ÎHŒ·Ë9Qw(‰m¥Ò$G€»:"œ'5¤ÊeU’»…èa›Í‚ŠÆÙã—È,â4©•Òe-Ts#3L‚Æ%Û톦À%, ±Ì@ÿEÊy%´¹ ‡…z§™€;rl™OFóá/[Ì؁¿˜€±RÉiýHã,ä¹üjŸ¦#™Ð‡óBN7õ`—ª¡¢&úIH¾¢ÞZ‡2‹5dõšø®™Cl8Œ+ÿzcÕwbÛxÂ1kÎ @/Αüúx™t‘4öv œ/ˆ;s=¥ÕCØØr!g t;Es*^ƒ\—½Jݍ“€æ+·È]¹E\&Ûlʕ×A ¢ª:æû»…Jâe¥¦†g¬JŠ-P…¼eš[ˆ^•S7iJŒØ¤p âÔΐñœ4þ`£ÏÔ1҇R”g‹¢¯ooðЂëêæ@jã-]APÖ#{«ÛƒR‚$å՚:˜´Q¸MR[Ǜ–â Î5a‡Ôc³§0ÛG{Õµ +ˆˆòr³¸2Å6Mݍ ²ì†qýˆ4Ùô;9Ïì±´»çCîĄ̃Ì[\tX°˜5¦M̀Æ̌S‡%.qÔ²-åzt>{Èõ“ð²ô»òeJ¶ºÞºÚ”WU´#ï,,íV%Öä¨Í 9j˜,¹³Ö>—î +ÝÝ.óƒôÆÀa32p ¹< “µ¾H˜-)Ä«WU2Ü8εàfˆªIh°Ò#ÖYéÍɌAëb÷¿{O4[Ûr:“k˜e¢2S£§¾ï†qIâZX[ Ë—¥ÅõÁIÊ/ðÅéŸû⟗W»ü&aª¹öÕ_zë¿_R0?’bÛ?\P-»¸úàQhºW±ua¯MŠå}R+—Ãëh¯y´sx5•<“êðÂUßw÷P 6óüøâáÍG›i-íÀ^,/%ž|}ï2v~àá„&GW!©å\¬Þ¼biGš-˜¿1köulf~ ÖÜO‹œNùÊèõ¬)(†ø¤!ás/]ë§+{c‚®_܁ÕR²KÅ5¹=Ã¹ÒXå®®[†°§sH„»Ýó·Ý»‚Ð毎výʘþ!,¾ô‘Ñ>.fþ!.ÒãbzðÓôúEð e*††É{êêËYVƒ°/ ÇAX~a¡?'%`µ¢l^8ÍÑNs? ü…Ãæÿ^J>$ìÓζþŽ¶é‚Þ°Èý8ˆ`ÈÐ{Çþ›7o^__ýRûS«úÁW㈀oVl»:u&~î8ßÕtƒ´ošh:ÆNoøÿ?ñF-P +endstream +endobj +1087 0 obj << +/Type /Page +/Contents 1088 0 R +/Resources 1086 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1084 0 R +/Annots [ 1085 0 R ] +>> endobj +1085 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1089 0 obj << +/D [1087 0 R /XYZ 90 757.935 null] +>> endobj +1090 0 obj << +/D [1087 0 R /XYZ 90 666.402 null] +>> endobj +1091 0 obj << +/D [1087 0 R /XYZ 90 441.2 null] +>> endobj +1092 0 obj << +/D [1087 0 R /XYZ 90 295.301 null] +>> endobj +1093 0 obj << +/D [1087 0 R /XYZ 90 161.357 null] +>> endobj +1086 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1097 0 obj << +/Length 3228 +/Filter /FlateDecode +>> +stream +xÚ­˒ã¶ñ>_¡[¨ª—$øtNŽ+v­ã¸6Ùñ!µëDB²|hAÒcý}ºÑ >$NìŠsFý~p‚Ýyì¾{úËóÓÛoS±+ü"ÒÝóiW», ý$ +wÏÕî£íQxßýø/T«Œ¬éáýx¬uIët©Ú^ÁC.â܋£ýÏÏß?ýõùéËSï +v¡¥d~&’]Ù<}ü9ØUÿ~ø¢Èw/«Ùő€ßz÷áéOß3XÞ7 ÷ ƒÔE¾Ë"áiB—þE‰}½;·ûxH‚À;~ +’pyî=_. +ïe^g>¸ûV¥4æFË«éݪ–wÚn^{:ÞrÐí™v†‹dí~ͨZÉ^UÛJw„PòY€ˆ/[F•í>L¼r³Ëý8-v‡0ô‹„9-»¶ÒƒîZ ¡'« +_‘{ B{U"Á3ˆE Ð=AŒú2j£Ë!â7]¥?A¤a@aáÆfäévã 1Á†ŽAâ3JY©«å#Xó ÛA–Y‘¬Ù´XÈp6öת<81~ò[ +/IáQVxÿڇ¨è 4`=#¼ží6`F + Ÿtò3Oö„"éçåÒՊ·œÈ-%Íx?¬^ÐñaRkת‰ +!”]£ø ȅ×®?„àÁš• Ìæš:Æawb¶N ¿³Zà¡CÅ.°å¤Õ,ôŽû(ðƁ„Vu󽆉rÀáâ²Ö•øýýX^¯Î÷Þrõy÷Íú!,.ßLB H¯@7@¸¾Ñ³Q¥ZHª"¨þ@T¨8*D…÷/å,Éh%IؾXg0ø"¤=0äù&„1öVªådE  +„§¤Lä2 ©t­åÀ__!»\&QÂî³5քò#…Â?#Åԙ£š/bP'o^‹(rrhÃÅ{ӝlà!`ºÉà´1±åhÙ<竎 ÖBp11‡+æ}Í¢0s .a@ Á'=lXQ«œa¢‘”aè xmhUulUµ—ÝÒIdð›úiž½¯'1ô^u-9XÅMãÈFS»—g™Ûpa/ññ,»[NÍÄZ>©!Y\ü±¹tAÊÚN, Ò钩Q 1 ‹ãÈÁk4¿§•Ãh6C•ú¯ªH™qÁv‘ìáî"¢Š,Აùnˆbï&œ2‚…ßo:ÎôToda Fëöðc4ødÉoùõ~Û3ùU{؈+˜§E URcs ÀÈÓîEá²—,ÂÆÄ{Œ»bwiOtÇ+ÛJØc•¢E\¹]8)ÌV›´´+YÓ9#,›ÛcŒEöbºr—¢¼ˆ+,p¶”Z÷éâ9Ö<#œ,<ÀŒV‚K]йÐËZu0JVTVãþ7÷¿bÿgÛO¡fJÞv-撤㴠¥=k’ÁÔ¿¿!›´æPÛ ØÅt@m—³\Tö_­+®ÚóU¾}­.“\—¿~³!ž¨H]¬LfMÚ5 +ÝÚ¨œq‡³ÍzYŠË©ÛN)æ§ÞõŽqë¡[© TZŽ,Ü&Ð7HÂzíÜCžx¥]§Ìl¾áÄ^bp”-]Qä”×Eá̳¸×3â8=ã6¶é¿N•1lî$IÕh¸ƒ‡õ½‰îC›%¨]ù˜8læW8…P¾võÕi 0lÝX^d{Vÿ­TO×Äsà¶I„súœM"šL"t:¦œ¾4‰hÞæ2àNµáÒ$¢G“àsáý¹è4 ì°W&‘Gd®©‡¼dô¥ÜÔðCô=¹Þ¼hÏ…tmlN¢ £¸M¿)IÙؕ¨[QŠ¥F ˜gòJܛ¯yˆÂÔë¯d&°tù –ï’!N¸ãõڙN‡#-˜ô ¨½F1D‚²&ÀÎëž «áK˜òðiu=ŽSTï^ÂlYŒ¹$SxJsR·B3 ÙrEá\qšÆXÊ5¿ßщu¤V³óN'ïœOäœÄg)‰|JS¯öjë»Áéñæ:eÍ=ñœ1"Q܉(îÀÏwàaíQ6ÇØtq‡ÂK4U¨°"žaqÇ¡ë¶)¼ð&d¾ô¥Ú*"í”lµá!º­ØÉ~Ù[ Ûö]ëÆXQúa9d[… +{uA« ÅWä®â£ã÷ÑkBrôz«mvbç´hJ›º&Õå[C3.V¶¬ï­+™ËÈMdzäÎZ ‹ËÎeŒ7ÞàZp~ïŵjÿ‡ym‘½îó‡ÊqgM³jö«ÂÍÆ`1§…|J ™ëÔa%ÝÖ$·‚‡E>S™£.íNá¬àF +À‹‚pu‡¥?§Õ$°RMîTƒµ8ÔjÏÓ(YÖ`ôÐæ¯#à“•Ùñ9‡*:ѵdš È²”½¹:…y@j»RDÜRÛ]7íÍ\&t kÝð©i ·=®›;§ k©CYhe4HLê¡©«Yg8[[0¤JS=Ò8Î3gxNxôÏ E(6­áܘŠ‰A,¢‰A„mb†jv€¸F×ä„Êí¤êõôM-©ð®µ,™"ƅ³Sೝa´àÖV,ܒK Ñ`üK\™6ðøedmÚJ€¿û$ó|ÖdþÉ\›ßǚ"žc-Òïð{ÙðÊM¦yßtãùò*2KÃ^‡¯Õn¶Ò§ÑPnü–qêdbєâ6ÍíÊvð"w½ÜC©!Ø´X´à³\‰eø‚Á÷]Ú"©ãš¿¦à’Çdœ×·j¨ÉuRkY>éòÝéî‰ ,ÝǓeNHg̙b69cJ±$¡ 6îAºLÎ#ó™æCžIy&³=ÿFø8ºð`'¯…KB•vÖÈCÒâ! ¡tvÉIB“ÑbI®G‘‡œìbŸ7N9vÇ%5.:y°²éñ\ÐM•ÇäºÖƒÆ™ö†×CƒšI{O\4¿„¢wàS eº¡eÖçøÜò<ŸÈýB×ã©ÕR±jÅU/鞸~Áo||ŠOcÙVw”ÖÊÜàf‘§"ïŸßÑ2NÈYF3=»Zé0.PZõ´Å`÷>LõQ³v3tÈÆÊ 1ºc­yÖU1½Ž° P}e6>+]»ßÞÙKäš)]s!¸ìy%ãq´€`™RŸû±ú4—e½r sú¤Þÿ¥~»rúŠhì9ZãGÑïDnË•Ú Oæ H6³ -hœ§ÿÝ«û˜ŒÓPöZš3Qx¹U²TkS¸ÿ7š4÷‹0ÿ½ÿEãþk&õ‹Läü_> UÓ͞]yöµ)MÃñ÷}Wß.ª2Òý‹ÏÑHÃ&üxñ4͇ç¿Ëvtÿ„A™=¼Ÿx +ü0ðm+Ã3æJ1“ÄÙç[ý ÿ+)YÜ7Ì3_lÙû^†áúÕÛ·///~Ùûc«¯Æ×ÃÛëµ~»Û×aûÙDdòcîm]‰6k?T<Èÿ?šù5 +endstream +endobj +1096 0 obj << +/Type /Page +/Contents 1097 0 R +/Resources 1095 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1084 0 R +/Annots [ 1094 0 R ] +>> endobj +1094 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1098 0 obj << +/D [1096 0 R /XYZ 90 757.935 null] +>> endobj +1099 0 obj << +/D [1096 0 R /XYZ 90 461.05 null] +>> endobj +1095 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1103 0 obj << +/Length 3426 +/Filter /FlateDecode +>> +stream +xڍْã¶ñ}¾Bo¡ªv¸¼çÉNb×:¶³ñŽ+•²ý‘ÐYŠ”yìXùúôär’¼ˆ@£Ñh4}AÁáù¾yøêéáí×Y|(ý2‹²ÃÓùP‡< ý4 +Oõág/:>Fià}óÃOÒЭîUÝ÷Ó©1·¿3•n "N +/‰¿>}û𗧇ßBX+8„D;Íý<üý!pùLƒ ŸQìYÊ|~ ç©7è›êÕ©A>òÄ»uýhº–Ǻ3NjÀé_º¹]uµ~ƒÌÞË¥cè¦¾Ò 0Cô1L½ß«fªuÍ#ç¾»òؼȟº¾×íkkÓ>3Ö‡ªPN°ÉÇ0ôËTv£X¦îè¯V¾§^õ÷c–zoÒjZ[Ýȍ“æ¯ig®¨Çß +$‘Þ'd›x¿3K0ÄìBc– á×}9†0Ôôgfs?‹’EôEéýEñOƒî¹÷¾ï꩘0€„_m`-Aú%Hƒ~B°:LW‹w[ˆáÞËÎÈT¼jÕ +mÕÒ®¸3ªöÙ°& Ý]KŠË0 +&Û9ä92oUMsçÞ4 `±uîzl¤3uà.ŽïŒâRWÓØãB ãfÞ¥—®·©¿¾ ,MÄ¢Ádgã…N j=˜çÖrb§ 3ݳ.@H?®¶˜ñá†(¾"qŒ¸cÇ-…ŸÜ«_tÓÀšþñ1ÍJïàÕzÔýÕ´Ì ^.šÕ™+§&”g,ó–óu0Q)¬ÙM§ñ<5Žð‰ >g)çd­êpÏìÕ³†í&Eè}} “WñìËhª©Q^v tz]isŒ,©šQNw‡Bñ… / ÜKҀˆÔßU8B¨é"íl½×gÐ=œ™{tvQAë`÷~3j½¸¯vœÉ‰:C| û³œô_ ˜ã8^M—Ú']©iØpV©Ç½­Y)bz(ˆÕºªZïÞÍwtx ýÝčÏC[†«–¿KX;ò }Gõ>µ5Û(ŒÞIT)&•eM.·€û߀ð²á¦.ÎvP,‘CIq_”ZﭛÝÓm¼Žq‰/ÉÂ×BzÄéªj¢ÈÐÔÀ0tƒ !W +%{0MJ¶ŠãäLaÀ:Ó,´‹F^ož/2‚Õdzd9 %Æ@vÎ*?½âìß/U)¶dþ@ñúµ-—PB/s3ä+hbË_ˆÌozœÌxw=wiÃ㒃²’®ìïKЄ!ÀµCi°îÌI 1=ޚ— K®P_É.’¬âRVˆÀÄCœ!?¨F‘ïQ ’BœqBÍ"cH‡>WÜb‰R#+5g¥Æ[/D8ÉbªgS­!YàÀpg;9ÄÆKRž0›H´ž}5<$W++­ÿ¹²Ï +üµ qB u»Ñ%˜9Ë؜AÂ8š!Å³òb}ÍMTý;£ôzT¦,ŠÞ½j'Ó°ÒÄ%+[âøFº&­‰Á161m…ÄE|Ó´(:€QÉX'coªë­¡àq¾ð‰ë-‘l&‚Ùf"Hx´\™]Õûµåoߣ²í¦ôâëŠÍ¥¹¸3 +bɗ¶¥ùV åÝÚOæö|aH +¹-T0Tý5­|“­Ó «@<dÿÉTTèImöÐÃ-—ºJ)–B÷[­Fæ8·&×l.͎rKáKlIØãÏ+¬Îë훍§·i4gz kXáV._Iüùì¼pÉâ7|PþG½¤RD¡È¼õÝÛøC7âýÇ7ûPîVÉs[ئ§‡9̔rn.þ:Ÿýu¾òE$›Î³YÒÜã}ãRu-÷øó¹@è +´ˆ"¬9¿Þšón]AŠùölN÷M ¿#:|,¦G¾õ†²²#yH§·'Àq‰ÛgEÇ Ûp np lç|Aÿæ°Ç8„™ŸÄh¹Ÿ„á ¥k¬ŸS¬& _ Ö6CÕ(såÎòuNù M2Àg¼ÆÌõìÂõäÌ­‡-6k•ÙˆÙífR1Ïr›`4Lå¾µ’‚†™°q¶¤ [ÒÂO²r}”"¯?Î×dµùG;£ô‹4ýï":Ù£K½1éÿ ô)¤Ì©—Èu^cõ‚ ݸyÅpªÎ¬W Fíø‰hR¯YüiÃm7¤Ì͗<õ”Úù8öF¢`˜Ö¾\(©§Ï7ÊÝÙö?Yá—añÿþïÇþß'óËôŒÿ~š® Tªâ¶$~ÒíšûE×½Zÿi†:XùÃ…ÅýïU;ÙL/ìæ‰(ð? üˆ‹d”¿|ÐZ6É;ûx°­¿âÿ¨R‡ß°È}ðÐ0Dü^ÆñöÅÛ·///~5øÐßzߌoᚾ]‰m³ë0Lü|&2nNø¯=N¡u#ÿÿjâ +endstream +endobj +1102 0 obj << +/Type /Page +/Contents 1103 0 R +/Resources 1101 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1084 0 R +/Annots [ 1100 0 R ] +>> endobj +1100 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1104 0 obj << +/D [1102 0 R /XYZ 90 757.935 null] +>> endobj +1105 0 obj << +/D [1102 0 R /XYZ 90 309.012 null] +>> endobj +1101 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1109 0 obj << +/Length 2997 +/Filter /FlateDecode +>> +stream +xÚ­˒ܶñ¾_1·pª´ ’C2>)/;ŽíRâõ!%ùÀá`4(ñ19šìߧ_ A.¥8U¾,F£Ñèwc6Ú}ØE»oþôôðúo‡dW†åAvOç]íòCf*Þ=vïµTY|ûÓ/2Н¶UÓ··ccjÿ`jÝ &E’Ašî}úþá¯OŸb8+ÚÅD;ËÃ<Évuûðî×hwø÷»(LÊbw'¬v—ª¾Íîç‡>D>ŸYäñÇiXFù.WI2f¶·Ì‹éø;^4Þ\¯¶¿ZSøAïã,ø°Ïw—Ÿún0ðäd†kS=ëOÏü½ïãù(Xuߍ•éL÷AŽ¿áð—wÜï‹0=”»ÇøWÂë{¥²%Ö»Ç,¢ï£,F2iðÖös4£­¬¾Z=h8x4û8è;^éϼEnœ æƒy±X»©½öƒ3>VWtU»5äd½&¶Y·ñ2Ï«ãØ¿p×H®yøú5µ\3ɂ¿èºqfŸ€™ô þ`+R Aܗqàñ­;i+˜¶:iÒ7­4*âΖ ⓴’”/€¡o5h?I8h¾I>“e@8Rƒ¶ŸAb_²LÚò;XÀ™E“¨2ø×ìA85p÷¶#שÁaÑ[Œ7ï§NœVÝ ŬO™½G³á ƒïFi>÷æùýÒóÂÔ>uVO8ƒ£øÑL®šÄÜ/b™FËPk«PÖ[ áЙ 8¯/ Å i«z¼9âÕ0ÜÚë¸ÞÆ^MÃN`6³Xì:ÁQ›«·µ° ØI‚î-ïåÓ$©ÆÉ[œ—.9¤XãsHAÎ!bZt^1£)óL •Ï’’=§ ‰ÍGÅéìQåaVäÌì›ȁ*pgyØõÝãU[È„ƒ±OKËÕédÑJv‚ÛA–¬àÀý>I<”hÖÉùfç3 ÁŒÖÔtaXLŠ*¤Øœ»Ø{[]I È%òÀwÐõãBøZØTq‚ æIð÷3˜`®0çAiJA¾Ïý víÝùÄPCØïóو⵲#ƒûó +_¸œRñ§£B€Ç¦Y¾^쌅0i#;?ôxžxBçØ:nZ w©Ü«˜ÔʐžÎ¸ø +€Jd€°0&2¡Ìúƒ‰èì%NÞ¡D†°£­žZëñ½>E%EŠ• Šqš™ï<8õõ­ÅÔ»qÕY¼ „ó +?ÉÌ)·PûCðW½?ð˜¨0.E†Øð´/U€¢ï¨„•‹n<¢&IKÞùï}Œ®‡‘5Ê$²F)„`3^Qóý8B(˜GÜhžŸVñç…o#Þìۈ2KLvŒÅpl˜‡æy:Ú “qI"rQ’$@ižo6 +JQdúnñ\•Jv7äd©T¬^^—-c¸ë"ŒŠ +€Q ¢P ©°7'´ØTIÝëwCeaJdIܬi„È(z |Y^˜:2»Ž YÄo8è\›€Ù`ùoºº¹¦°>WXؾÂy®ù£;¤–ÐÙ·;Ö·f8ߞ[þõ²lc%ó$Ž±¥Ø ßõèäw=»ºÅ„ƒi>ÍCM”K÷PÄÔº4«¦áÅϦo¦.í ×ÁY…ÊüÒ!¥”*˜,fĘ24‚ù!"á* W±5õ­©¬0Ñ_юŸI9 ºô JiC%lšèíPR”ÚلYA•4¡Q4Ûø@´!‡G¦ã”a_(q¿¡fFƒ6UrOH°o¸&¼Ñ²¸½bñ•åL2‚%ÒtF)璸6›3'^²n2x¨lðvG×J”ª nºy͙W¥ÎÉ_ðkŽŸ)šfm=1õ‘C˜s?>',i¾¡àô(ÜCEá¿]mÄ lšÄA®Ö¸T@,À÷I“9¿uÇŽSƒçp¼v†{«ý°)ž€qd s5™Nf)§¶4ZØ*Î×òÐ$OŒ^ëA¬“ÉxÚbijDª‹þ_„7LõC¯dJ¢£$’W’¨pö[.œ9bá—u„þû"®VÐKÔÔ-–t ²m;Œ¼:šV¯¢[Mu.-½lZêŠ,a~㮾•åb…yáJUÍA:g/á˜x p1åJq!€ˆ²‰÷´Å 5䓿ˆí™¸d^º†vݬv”d°bÛYx.Nß$ÚòŠM{k¥"¤x¿ðÆÉÒÜô…§=Ôksù‚,ÈÛbž9ú™d>õˆà¤z‰&ÒåRÔ¦—zs×ÀÀˈ¹4u%÷r4è©KãAüƳً^‰T’JWœÎ×Á±ä!±•¦sgœNEOšzEOVÆԇɞ š+3ÈQS:DŠN'žs^H]˜¦‹¨°q¡9ˆ¼šÌ@‚b¿êG?ݪ†#¶BWB“-Tܷʔé]~²§¡jõ֏^ ³,L¢¯Ôr­R +ê75–ªUWëé§'ðëñ>.¦CèÇ ÇÝwÝi*ÂþLzÿÿêq|à@—M%ê ·j NòTÒórUKEí=Ÿ$sÐAÓ1:êé¡Ev¿ÐãɁ·NÎ๠>‚uæEŽ¹GA4̬€j¼†¸²›¦ãÕÚû3Åô2joqú²¡ ×Pf_C`“g|Xú†Z<"20l"ÂøtÓ¤LÚzæ…Û0m¿jxËãØ?ҘG¨êNŸ ºMgXsžpÿ™zrC`cø‡4²sîB¼P•¸P•:} ©ÉÑ<‹ø+•4†~ r‘'Qˆ6#”¡ònLUӜ£¦—£nd]z# ¸ŸKI¥Ôº‡Rñôh1õPÊøUz¦÷ ÑsÈ¥è“<ûã‹Eí^ø>œQýrÔ:7â»È™—äY5æȤĩˆvŸ/?'¥q“è€ÌX ±HKMËue)7”ßÛܯ[åÂÔy­$»HÊ­×ɹx5õ†Œ,O<šg’¿òÃTRJ\þ¶žÑ…b°‡>\üt¶þǀC–qñ[ÿ/Àý?À!,ó¤ÿ[ÈÊ0Ë\Òwü-Ê ‚l#Ó¾y¾è“­Ü¶G‹„&¿ ÚþaŸed…«nú «+ï—.F!„}Å)öŸµ–KòÍ>îÜèø™Ço\äa)X"~/ãxýãë×÷û=¬‡ð֙« Íøúzm^/Ķº5þD>™ÒXÛ[í~LÇ·«¹Qðåÿ_u¿E? +endstream +endobj +1108 0 obj << +/Type /Page +/Contents 1109 0 R +/Resources 1107 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1084 0 R +/Annots [ 1106 0 R ] +>> endobj +1106 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1110 0 obj << +/D [1108 0 R /XYZ 90 757.935 null] +>> endobj +1111 0 obj << +/D [1108 0 R /XYZ 90 398.028 null] +>> endobj +1112 0 obj << +/D [1108 0 R /XYZ 90 167.156 null] +>> endobj +1107 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1116 0 obj << +/Length 3374 +/Filter /FlateDecode +>> +stream +xڍ˒ã¶ñ>_¡[¨ª-I™Û&±]~$µ‰Ç‡”퇂FÈò!ƒdÆã¯O¿‚×ñe4 t£ßœx÷²‹w_=üåéáý—…ÚU‡ªH‹ÝÓyWÅ»c‘ò4Ù=v?Féþ1Íãè«ü Ýk[·<ù8?·¦áñw¦Ñý¨aRª¬Œ²|ÿóÓ7_<=üòÀYñ.!ÚùñpTù®é~ü9ޝþÍ.>¨ªÜ½V·ËR¿íîû‡>Ä¿{ÏTâ"ç{&ñaÿ¨’8ú°‡ËÌÓÐÕÓúj¦áépæß¿ {ÀíÇÉî“2ÒuÇðéÆ\î§ñ€<¼ÿ2ƒƒãÝcšTVñ¹_ÔÍ>&Ñd:£8zf5C¿Ïâè¿û$4þycxí–Æ«VŸxó+^j°ŸÞí³¨^4#[w+!áX¬Ûöw†6ûÔQWgµîyól‡N.íÈÖ¼˜8F“äPå"[Þ;Øñâ–Ñ4ÀožFvîÒ 's~chÝ#'¹Š®v¸Ö/û<ª'ÍKÓ¥žx-àRÑ8?ÿG7²æÈO3òHt ^¸HŽÑ¿÷ nž»¶B¼&¹–¯¼÷s«å<Ø-¶t W‹fè®­©ûFóüùáöÄÃkm'ƒ‚ÅÉ«™.c\ÁÁw<iÆÇ}èQAÑOiªà̈́ò½›lݏu3™¡‡¥Œ‘ˆsX¬yà›ÎÚZº>¢€®Mvhy‚*NÛǻ4œÞ¢7¿ÕH%¯r\! xqªáZ¢O‚‘PG=+Ì›R ½zi‘½4/‘Þ‰•ÑœDÄ]‡Ð7¯“±l¯¢N3Šßº±eD‹WEôõ™ ôäDÛä‚5£ÜY®9]ähÏÜÞp+ +#f“%,WøõïãàP¶…B¾ÖPqÚ ¿l ë x½ΆEglÑz+^\ÈҋgΠ‘ˆçŠö´ãçhn0úzA“õ8¨"eæ\Þ¢+(XªðÀœ1ëÚçy$¯ x¸Ã8B×ô¼`ú eœz©O<`4üέ€^2÷'-xËɖy0üÉ%ܬ~±õõBNðۙüMÌU0/—‰‡ì“À ` ã(OU‰Ø+9þ:Xö?¬õ¸öý0ÛF–×øY¨|¸ì4,@X‹ p@\Ì8á½cGdÎÎ5‰7[‘AÀ¥Ÿe& ‹²Ð°•ÆыžÖ‹Ç³º‡¾&‹s}FIƒ;•˜é}ŸÜ.pÙ*ºúì²a`:¬æ1/‘Rëž-°`yù³† ed=ƒJEZ0 (û+kmcI’zˆF/+4@@v'Á´|nM ýÇ©íܚÓ1%¡iã–@•ƒ3ûïá(òÍjˆ1è*UžIš 2'åä¡y(RF•Å¢KIÌ[݂)òH îÐÁ /‹šKÍ.ԑX_l-²LD¦œ¤6xõrKAR"J4L ' TIs^€Ä7ˆoß80½„éîoaúsz‘<6}ÓÎTTóOcÁ4›¶6¹ø ´ ¿RÃá[ÉN¢xg3Áa b* …$&‰G©÷MkN_qr…Ë÷´FþD±DÐŝ1b³Ô§ðÛ՟ŠrJËhݸŠFݶËÊÀV¦­¿Å™™TÑX“Z–€P‡ ]Ô .½_øhxÈní–ÈåYO—ÜÙL’¯’r8D¥‡¤r9y"9ùGÔQ’ÌI©?` ‘QžDIyÞ§”Ò[ΏÒ2gRÍ?.ŠÇFŒËвJÂ2TBŸ§ dº¿QH3,>~¤¹Œ¬~göf]U“3ó.¶á`^)ú¶\)È*p±ßŽ³¦¹Ü8êՃ¸¼ò¹õI„ùä0ü ̂,žâ´&…‚ƒùÃnäëÂ4.mˆŸ$'%_Ýô÷°xù,y\¢,b)eœÀXUyÛ¡h;#¿7Î)˧&¥8¸Çf*ÚÈk¬âÞÚ_e`àMIwźíÝö›iqªÀLÝB$<½É¤ùe6\Ç9 PÀÕõyò; ué³@Xà×ä¦ÏšTŸå¬qè¡«{¨ÈùºDòªmg&ŽhHèmÛþ©Â(ªÀI“ôÎ õ Î#‚eñL<1“»S +#D—Oÿrðƒê­Ž\¼T«þu‹ÊÉ«¨ym°ÇÒ«ÖÒ×ØSmƒõÀȐš§pïQÿ2ëžó´’å Kþ‘s•‹)A#IIk’n‰V` E˒`å2[Œ÷£'ùù;‚À4^#% 4KcZ©!È< QvI¥_ú¬ö(Y-üR(çUgV©½ãr~¢ÈH5OEõhŒ4£Û[J®èÞ(­&Cè0(¬cË+§¹ñ’*u/qKHFI¢•r*•RšÕ?rÖƒZ‚2•Â9ÖöôjN ;†yÖãÙj͔|¸‡±OÐpââ‰rÑâþžâ ·‹_LËt9¤”œû0iÓó!Œ/GW­ j‚€F*CŸ;ðN`à@ᄁÁœ¬Á€2ÈWÃ!е|ð×òYa¯Z>¿—v ,î_Þ8Àÿ <›AçkÔNJ@5Îàï9°§¢5z;úòÚZn„£-y+€¹¼«ØUʹ‡‚4r)TRiïý +UÖ82hkÒnž’©S6ځwF¸œzá®Êí ɝt?t¦‡{aèH3ñ—©Ô¦T„Q?K3°æ¯;0ÆÜyœÉj2ö€ôÛó/0à}Gy +%Ríú“¨&ÅvÅïEO–UK¿%ƒÛÕè×÷ôîØàxœIWÑÕ<0:ώ’Ä<’£,zڗ NŒ‚In@ÒF  ìç 7„’€dpžˆP/u „tºîÇi1@†‡ô¼¾èŸ¾îöšÁsOo¼/·(¸#9ù lx¦§Ûڟ.Õá¶Ùœ¹â“rTmw­Uæ +Ñû®µZ÷sÁ­}ê½ÝµRÛZݾ±buÙ$7Ô¹RÈr3ÙyQÜ6X`»o°pÝú9¿£â0+W1—eåÔ#Æû¤È8š¯i¹½`®•c_ë ½,P—úÕàÉ1⠁‹”"Ä78;ñ‚k,ĎMX„„±×û%€Q³asøb‡ùå²Å7Ê7WGœ^".¶™„"\O¡t 6i»ôÿ` !÷Maök˜.¦¶Ø_2ž  +Þ1%]ìÊj†Ë3µú€Š6Ž"ø Þ8mj*Ñë6oô‹-§8æÉù4–e£Ìï„@a-“*Žï‘J‹: Žäå†æI_íª‰@àÏBÜ=‡%c¾”ŒÏº§ômÚ\σ`‘çq‹c祲\\cV¸œ)ËùE3·µåy`™ivÏÌü)á¦ÂŸ Qƒ$ãÖJæK :(Ìóˆ<÷3ÇBVÜfv™p™ùÖP´†¶Œu`©pÔÉñ(,‘¦œ6b |ÿ“ãdù«ÝjùªúTRxøví§ü”Ä 8t9‘ØEÔGž gJØ`ì¼_û¸•øêéQÁ=$úîQ,QZˆ»aÁô*p¸Սá÷n› ¢È:÷ß?Š°q3zû‚seÚ1C*æžÈ—Ë‚“½h}ÿ€h·[ю^-q¥Õ·„´”+¹ÎÊݕª4¬Ÿsž‘³¦4hºÁ +Ò{ȳÑ¥•]:QK{‰OöݾàpnAF#+?7¾Qß<_Çögݽr%¹4=8óE?՚Óf%ôõ™Êê#–‘ã̕\qäØT”R±³Qãô¤×îkÀ¥R+¸¬VûäËòæÛTqj¥s.‘­ +qì|Àmþ a±:úÛÜ|†m7 +±ÀkfùÊoÑæ¶*ƺ™‚ wÌ㍏}ˆ&*©Á¥/cC¼ä³Zšï±T͔L,݂ØÕØq¹|(ÆÉòÅMب>Ëîm¡ZÙBµt0Ù¶+2¤Ž—H—*%õæ ¡ßIÔue[%Qe› ®×¼<^Á¾©ïÁàåÃ#9ËédÐՖ©²@ìÛÙY—².©~—ËÿVÐ×)~°¥Åy÷?”3ûâ{ŸbqÔHdst© ç»&éÝGãuó5‘8oÖõÔŕŠ·_õÑïþW€³¦¥ ÿ#¥åçdÆƪ ûæÊTþˆ8fâùiв‹Ó]Dñm6€¢ ‘Æ®„†Z[Î<½‘+¹Ô”<(EŸá/æY°§êþ_ynÿ#¨(URþÑ¢Êaס:ªRþ(¯y.’óÝñx¯ÚvR(}Ú·‹>ÙÚu–žmmEI~€L7l}ÿ½îg÷/N˜'Ƈ$>¤¾ìŒ£ïµc’9û´s£oñ—òà¾Iy<¨8…%Ótýóû÷¯¯¯‡f<̽¹Úƒ™Þ_¯íû•Øn¸N’ìpôDή†”ÐF_‰ØQ£òp+ÿÿb“a7 +endstream +endobj +1115 0 obj << +/Type /Page +/Contents 1116 0 R +/Resources 1114 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1084 0 R +/Annots [ 1113 0 R ] +>> endobj +1113 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1117 0 obj << +/D [1115 0 R /XYZ 90 757.935 null] +>> endobj +1118 0 obj << +/D [1115 0 R /XYZ 90 714.318 null] +>> endobj +1119 0 obj << +/D [1115 0 R /XYZ 90 492.922 null] +>> endobj +1114 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1123 0 obj << +/Length 3083 +/Filter /FlateDecode +>> +stream +xڍÉvã6òî¯Ð-Ô{±š;¥¹¹w·3Ûc+ÓÓ/Ɂ"! ¯)RáGùú© àb:Ϩ +µ¡Èîâiá.>^¼ß^¼û‹Íjûñb»_lÜE{«È÷Û|ñ«ã//ýÈu>Þþ"Uª:-xrßí +ñø³ÎTÙ(˜¬ƒpí„ñò÷íO×ۋ?.<8Ë]xD;JVI-²ãů¿»‹à?-ÜU°Y/žiÕqú|‹ÅãÅ.Ü!Ÿ‘;áÓVn1ŸjéEÎ_øGՙ&>âµSí¿‡A8UÍÝàwãdU™ëVW¥ÊeeÉßö xEY•—¯5[d©!~¬êÉK­ÖO‡¶1À´åQZ º9©Lÿæº~–ř‘OuZ¶À¨tpéy«M$Âve®ðÌ$b$R²6X-/ƒï|]zžëT¯:¦g”UËPÀ2t?I8üsf*©A#Œ±5é€ÏK$Yã•zÏг9„¥éiœÒº•cÛJ0¥Y +Â=©£*…gÝÅ+A®zVvCՍ"aD:Àoi0Š»¥ï:]£KÕÈ2 |sÝ´µf|«Ë'†6Õ¾%1Atß(°ÏxÈRÃà˜~ÃõtÊ|¡‹j EÁ»´™73ùdâÉ~°?¶¢5eI|d¦fHšµzéƒå4«Þ¬ñf ÎBé/¦(s†[ó¬ +úm¾ `ÖæûoC¤DÈ_i}Í·¬!¡W,­˜-ð8·’ñØ9Ok•)–˜# q†ƒnÜS@7ÆÙ¾®Ž<-·Aè£"\$«õQ—i[Õg†RV?Ž òpò›¹)üñxŠžÈ”¥Ê0ҌDŒYDqû҉dÅ1龬àh=s;¸´j^³nwæ/{, S +Y“ci.ç±N˜…ŠÂž]Š¢McÏ14ÞŽ%Çé T–Öºc÷°lƸì[AÄW6ˆ‡Š"¸¨F}p䕧ºÊ»Œ¢)`‰ øfÕñ¤‹ 4¼NÂáÊ6ÕB˜µJ'NµŠÇ®@°Ï/8rŠÁhÌXº$O‡|(§Gî0Ø}ÏÖÜpq+[·Â £†'’„ +(Ú’Cý5Nkº¥rÝdeYMV±2«·Ü[ +Ö +‘I'0êóy:ÍòÃwÊêhgô–Ê6QYÑ営±PW©µÐ>}}<ڐêålf• sµG¼¢ÏÚa_ë>ÌtÍÉ̀4ŸµQõN¾)æ„?1¦¤àP»Bu,÷ȵQ·œ€ÿ¬_;2gŠ‚>/ãÈ!;L +.`<ðWÞF÷|Là`ó[9륷§³§q|p;ä¿ùŽ'x•Ê«£3ª—à?\ᆏ¹Aöu†Ù$⎰HÕPÄ(ÞI’è8À+ÿ|Pl\A†éuuËêF†!&»†æÒ§Z‰=-´$vŠM%ìµušë¬åůdŠ±œXNLo&V8?°ó!.¯øKµć; +íœ^y ¹‚( îÍGƒYcÈ©7û Í,-ñà™ä0W¢®GÙÉõfr›ë s̚Jv4ümeÞ@˜löB®ÑÇ®hÓRU]SŒ ŠÀy Â_B2_†ÅsDRÀˆû]F6jбenöù&Ïå{ù¾”ê)¤“Ÿ–à’¤]*ÆÈr%£)à¸Ջ.yJ£þèT™)HÊu‡×¾¼öeí p-øÔ|‹¬æo"箢P`vB–®¨v£þLòur_U›9±M»HL{MÊ ÁB (TÖ26eX]¡ÍÏiÁõäš2.-ØÃ]ä¨I[çë?\ÇéϑtoÜ`á%HËͼþL½ îë +RՑ´“¼vi«²8ÊÎT&ÒNàÍ¢"aÖ_q²«Z[€2·8$íJ‰™4·Fþ —Ù"×ÒÞ +R¡Öj_s­€wÙêZR¯Šž^-¦g+ATò– HøÅÖR%º=9ۏ_í÷Š"õ¶þü ¹ +<±˜ I<Žé:î“qLÅ…!ÝpåK‡ÇFÿq4ˆ¾~b(,8H¦åÂB8ê¦'EFo¡ËoB¼æ•Pîí47à#æ^–u3V6²£ÞµË½çf‚–r$ç%¶ژ#„[¼„Ûs`ÀÆZ£±°ªƒU‚°Æ‚‰5Özø˜©)¾ñ€m0"—OTlÀTq9'%ê‡^7’qcg®ˆÕï+¯qbÞ/b¸ $ ñ†žzjì:[^–Øké$¡‚¦‚’ì—¬ì á+ªó˜É֜‚ál7%½©òƒ€gŠ}/œ)ö8T‹ïËcAË8»“Ú2LjÈ1°Œ‘HÎáz¶6`FÖF„µ6L¬µa<¸ÀE3Ó.ÚÐ ¥?è,SuÉö€¹ÆŽ$5ÝŠºêž¦ ¥O©ÚaÏèHýz—¹6ÔðMK{Ú¦iºìðOñLú /”xö $Rpgê:ÿn\¹A͸´¯ySÜåz›*aE#ßy¼æŽ9\b‘aT àòÚ¤90vø–[À¥y‡ÑW–„|fÄ 4 A)pYkX"Ÿ ñD@„¹3V—´ãà ÐG%£Ê@ éÑêÚǎüà–Aߏ' "Z,£„*šš'”þxÒ5E~ܟx'ˆ \¬ÁdpuÎÞà2ùæý¹6—b|R® A/f3¨øcšç5·âäÊF<ꃡpRÇfÜ[Ëif{ßëxÉ8ˆ#€*Yø> ^•……7dZ|9„›×«Ðœ%SvÇaÓwyþR Ñ@*žØ7՘eÔyk>B4TÇT—ôÔç“Û˜•#TÊ3$Èi`¼ÑÆїñ€øÍ÷êÖÂA׎“ +Õš× …å¡,Æ®˜ +Ù¨ñ$ˆ¥¸E̸ À5–ÓêԊTVÌÄü=TÄ9ÃмKB:3Ù(4/tGý"”–Z&”àC¨"‡‘Õ3áÇ ?”°ÁƾI7“„³{%ØÚ»sÏüŒQ9¦a 0Ži˜ÿÇ1Þÿ×änˆ´Eˆu7œä=Ÿ^~Ÿ ¨Æî ¡1Ó¸š½šÕôN|£²fmkЙioø¬bŸg²CU™¸×l4µC„ïöªÊíj7í“šèßWÆúŒ^ês&~vC Ãõ@»áä2#Ö8ÿºbì¬þ:3.£ßDB ™Î…œ©d¼ïڎ8 “i 処!#l€ôF€‰­6Âõ?eæ‚=g…Øé~m ì¥ðcfþ; m uC×КW7_zø¦Y¦NÐPdjŸ¤¸3•¤ìR| Ê×vÐðÕúo%DzÇØÔ‡™‰ýãß ßÙ÷±3­ÚÔðŸåF{ÃgZw3µŒgÜO£Ÿ'ú¶Þ£œF±ˆ‹BÉ]ðÍQ&Q².Ú7G =K$Î'Ž|#÷ç7ì»Ëê•SF+³óæ*ØW@ʬåÌ]d£LS$èGOª¢,mFe)·ãòO~Ð2AÀÖ¹¦è£þˆ”$¤‰ßÒsGR£þ¨›¬H¡Ìš<µ~Áç[zÈoÏKèaßÐFo?]?\//CÏwnù{{Çß/K2ÞÕÃÃÕíö+ƒ>Ü=ð¶ñàþmy÷ñáêg|¶ôg‹}þÝdÙõÿ¶×·[ÙrýðóÍv{ý#Oß í«ûûÏ7³-âWï?_cíaáj¹A9¡.¥jr”¸¾ß2ö˧ë[†Þ!W(€/7²ýq»„*öjéA©C ðFö|y¸ÙÞÜ~d qŽƒîî¿>Ü|ü´åEŸî>ÿxýðHÿ6`~÷Ÿþû@¼^m¼õ[ÿ{Àü×@¼Ú$ÁZþk Ú¬¢(´ tåÑ[Rˆ72­Š3äŽ:5-È®Nkqø_UÛàG?µ”yoÁgñÆ]yîÊÇ×mñ±G¥DH–ìÛŒþÿ øõÖÉ*p}@¿‡¶=ýëÝ»çççUÖ¬ºRŸê•nßA™õn¤¶‰Ô´`‰%bžü»µ<öén¨ÿÿr-— +endstream +endobj +1122 0 obj << +/Type /Page +/Contents 1123 0 R +/Resources 1121 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1129 0 R +/Annots [ 1120 0 R ] +>> endobj +1120 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1124 0 obj << +/D [1122 0 R /XYZ 90 757.935 null] +>> endobj +1125 0 obj << +/D [1122 0 R /XYZ 90 570.761 null] +>> endobj +1126 0 obj << +/D [1122 0 R /XYZ 90 442.486 null] +>> endobj +1127 0 obj << +/D [1122 0 R /XYZ 90 338.121 null] +>> endobj +1128 0 obj << +/D [1122 0 R /XYZ 90 119.205 null] +>> endobj +1121 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1134 0 obj << +/Length 2619 +/Filter /FlateDecode +>> +stream +xÚ¥Y[—¢H~¯_áÛÀ9ÕA™y²«˜¶Ô­Þ:Ýó€Š%g\ÀvêßoDF$‚Ãìôž}13####ãòE’ê½÷žÞ{º{\Ý=L«çj®c:½Õ¾ç꽁ch¶iôV»ÞWÅT?™¶®<Í×܉³¸ˆR,ϛ4ÙR–l㬌a0´úC¥?P_ýzç­îþ}gÀ^zϲí6°ìÞöx÷õw½·ú¯=]³Üaï"¸Ž½¾iA›ö»ßîô¦ž¶~£§iiºc“ž£ùäa¨Ÿ,s ,Ô¾®¬ž=.U×TFêÑ÷B&È´PAóWâÖ`Ǒ³OÁè…f¾™¦¥ueÄËý(}êñWϋõŠªa[Œæ«7VgJíhþ†6}2 ͵YóÏþ|rº£x>ký-/ ½ Lö_–3ߓ üùx¶žøó'?ª†®U`0';Ð`æ¿ø+)l¥CeÁkèÐWÑ]:6O%LØ7q®¾a+/^0~† Õµ”Ñ£?óñàÈ>!Ž©¿šÃYˆ:Å£ˆišl¹g¼žxz¹–‹ÐÓh„Zv(æ>ê +üð3öä% Ð9‰FDŽñoÂFhš©*V ª8»ôPðe4{4#¼‡²ž™ÐŽ ˜ñCšÀ8 ʛjÇZëÒ8„X™ÁfæÀ$™ØiÉ4F+<™gâM½ñÊõîi̛Ð`†ë¯%ÕPƋpE$<„`›Í¨3÷Æà´º­´£Òa5!‡˜cŠ.LñÀ#_ù܎A€ª-æâÄ7ˆ‚-S3Ü> 6 „€qLª¨JòŒ¤ä{ $Ñ&I“êCè + l¥>4ûšÕwI ?Ç#¹îÐï‚‚HëùL„öá2!ÆÇ7š-!îǣǙGãÙHuuyÁ$ΈL菧À£ÅnZÈ#5øø+°|°u‡ÿ@ÿ>XmùøOÏ+>/f/¸§ØZf¶š†ôfΰ¸/Ï ê¼,&þT$)I \¤ç¯ÞOÜ&û½Ý#´€ !6Ø㑃óž¦=jg>ûuúA¿ŽV\, ©‘†/d\/dY5ª±ݸùäͽ`4Ã5ƒ¾.½±Ï#%¨3$͈Cì9V9=hÚ¾U…xG€)¤ +ÀŠ)-ùLZ‡x~—ò[ˆ˾B#’jÓ@¿æ'ˆº7N€™oº­7­¤+ÔÃà +õ®Þ€ú›f L¡Ù´Kq2j†B–kcç´ž§˜ŽÀ›C ‹WÇë€Wzm¡¨“ŒÕp’`N2,ÊQ˜º‚]cíêÙ:ËÕ_+¾c‘7ÕÆáTEÿú³µ(8?¥yònRÁjÄ3 *äÃõD8Ëð;`Ö +‘‹H[`5î»á à `eJm¸?S0‚ú Ù6ö€á 2ˆU"…ð< Ù+|ùêÓõ¥ð^tx”~ñëˆ%Ž®j&tCؾɟ©®~Vņó©@ Ç]U!Œ·H,idØÔFَ ΏTŠ=^t\¥:ÄØ*»¤Ü¦Qr„ÝÅDÎ T&*Š(ƒ*$(b#\’6ªVsIZW-1<¹ +w›ïÉ.æ…ц(øÓ6ʲ¼¢þ†iï‰jJ®Œ·Ì·xá»Ä8ñ®ÚŠ¤Ä{ä߃uº‚)Únób—dï˜0†RåØêh€¤`R\Ë{J¶"{'¢¹Ô«¶ù¹¨JZY¢4%rt:¥Ôe ‘!Pà ?DõŽyɽmš—1-ÔQF‘ÿ™£*.YjÆí¦ÌÓsw¹§a(tŸ5 _XŽ"TD–x6}lIÆ\y–Qtý’Tš¡@Î²ÈߋèˆÕÅ*ç,Ë’f"^ӎT†•ŠÊò|<]¥“’Me:Nˆ~;ž¢,‰9à#j¶ù 7úhç†PS|‘š4H8ƒŠ¸:ÜߣV yû8¾^RšcöåµzÂW¼)µ+¨þ!uGr +éÄÇ[_Xç:Á”ÉÞ׌á$>ç¨ø…ÎYº‡Ã79Ä%Ÿd…0†¡Ù^ð&⑆óø"ŽÀ!_þ˜–«|äg +Ã]|¥L,f#šË(ˆvªãÀ워>ÀC‚, YE£¤âtËiŒ9Žãœ÷'¿Ὀ1xÙ)/Ëd“òÜY˜¹¯ÉË|âë›u©©’Ó×Y™Îø’öŒ¶‡¤qvN ›=¹1ÿ1úe2Ÿ8Q3¥Ì÷gS.‡d{ ncŸâ#ϘaÕa +h\ÉF…/MLü6ÀoQöÎÄs¶‹‹:ôeÈ$ëŒæ~Éàœ¾²­ª¢áÈϪŠ„Š0IF„Ù}ž¦ya:يt„ù*o-èËÀÀ‚ªøQ…ý -£=y¥±ôº¯…bŽ,0¯)¼´Š +–&ÂæâZß2aÛ ‘ßtÝLEI1…Ll ƒ-Ýhˆ¦Ä;Vrå;¢ìü¹MÏ%>“ ŸÙD>Õ@d2”_轃k¦É +c¯©VyÈÏ)s"ôúµ6þW4“ÆQYÝhƒ1 ‹äýP‰·˜Žò—&Ùm1ðòD\:Zá}9ÄE|©ûsʏ]íÄØç‹"æê§*Ù>L]½7rúA¦£ ]pÈÑl†!‘Ž®³šØCM°}O¾Kʁ;a?•4Ì¢#Oˆ£‰5›"ÿŠ.Ü>˜˜3å"*²˜ãv—Ç¥¼¬Ù …?ٚ5sê`NVxœŸÈÞ´?JÆx¥Õ­ãuÍq‡`±ð#ŽÀÔÆÊßUo©Rt®P–ºmØV‰¥’ùr%Ъa!> œ°'À €ég +ÌƎ@ ìÔ$Чi#0ñVNìó]²¿‚jÃ<’›á©å½ŠjYóÜõœx[ù¶Šù¶ŠýúmU(#‹ å!fïo:uª7™ÖvÙLÇ÷Ù{"Äpû‘ê JxX£>+ÇËɓ·j`¨ÈÀûå[ðŠk‘ˆ 6ó'DTݨНc¢°_êBáê]6Y’Ý吟괻͓K’²g6Ì•Ðá¾ë¼° ñÔoÃ8߅‚ÊïÿHѐrEü=¾U+9žÒD*}©o™ìŽíå‹lýäÀž!ËÇX1ÀÏH¡GÝ(¨aŸ~„5LŒ¸Kÿ¡¼¿&•ŒÇ|ý%iùþæÜ“9,k‰pb$±³ˆ·1i¡p|ü߉Øqô(Íñª ý)EßD¤4¤Ï{CQáÄ)ã˜ÏL—üѓ½Ïw½¯´êPU§Ÿ.—‹öžµ¼xHI£ò¡e0ЧmÁÛÿa@Ucø£ÃÈ¿_Í@Q ¿_lW³myê¿@°„GőËì2O?¡ŠH>ínŠ¨àÛþºŒ‹ŸTÛV¸–¾DÙYþ±„xÁWŲ~ +Ð5°·‰pÁïá1™(W}á@ƒ«ƒ,H CnKíœ%§BKªøiÛñæԆÑ×µúcŠ¢—¾¹€xpúûÿ4®ÜY +endstream +endobj +1133 0 obj << +/Type /Page +/Contents 1134 0 R +/Resources 1132 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1129 0 R +/Annots [ 1130 0 R 1131 0 R ] +>> endobj +1130 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [314.956 92.633 472.963 101.741] +/Subtype/Link/A<> +>> endobj +1131 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1135 0 obj << +/D [1133 0 R /XYZ 90 757.935 null] +>> endobj +1136 0 obj << +/D [1133 0 R /XYZ 90 622.348 null] +>> endobj +1137 0 obj << +/D [1133 0 R /XYZ 90 470.163 null] +>> endobj +1138 0 obj << +/D [1133 0 R /XYZ 90 357.732 null] +>> endobj +1132 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F90 1139 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1145 0 obj << +/Length 2978 +/Filter /FlateDecode +>> +stream +xڝYYsÛ8~÷¯På%R•Eó™<93qÊ3ŽãJÍLÕB$dqCZ£Ñ¿ß¾@‘ +“Mí‹4šÐÇא;{ž¹³wož.®nâ`–:iìdz§Í,ug«Øs"ߛ=å³ßçÁbéGîüÝý'îÜÔ /™kÍ£ŸMÖítÕª¶0“îŠLW ÎÇnÍÃdñçÓ/oŸ.þsáÁšîÌ£5¢•³ +¢Y¶»øýOw–ý—™ëi2;×nú´åìñâîPßÈ=Ó×7ŽXßë²1¬ˆÊsîÕÆÔ»Š¶Ýš…Íóøþ·¿]üx}ÿôù5Án¹“ëŒJĴǽ(ú/¸àƒÈ~y2¹I¥l»©µ|ݘM{Pµ¾”Ý¢)c‡Œž(µpt‰Ûå ·µÎ‹¦­‹u×Ê Ẍ́ +]•kÙF¦kØGe¦Ê ´êæõwö•½œ> +‡¯e –>.MhåDÉʞ€f¯Ù.¢ùqoÀùÀй|7ÂÛÙÁÆfÁumH€áá%·ìäÀ}6ŸÉ¶hbë¦ÿÔs|‰H÷ã'áÝÚàsþ7ÐïRºcàûM@KCê^wIâ—zöMìØñèÆSR> á¶Ê&±¢•~S«êKiaÚc+ŸÝ _oJcj!¿1Mۋ~-ʸ>äe€É ¢P>=^O®úö/]M¥Ç(•¾ÕùsBN<ž¡Õs +âÖ°Û}ï ªëZßö¹´.FbÅJdcëNn"Ûªê™Â ޑÚ·I½²4Ÿ¬öܤz|ê¢cBèxøøöúý›»·ÓFøUzñCF„"ÃÔ:~˜ BF(‘+”ˆ¦ƒGÊ«N!l!N¦üw»6拐` A¬æE6]E¥)Å,”DÙ=$ŒÇaj,²T]”}VNbk!«¡…P… ! ñqÈ|öùð€éTŸßÌ +p1f­Fô¹N(M(t´+‹Ì)ÃÓl™(‹F¸hQ¾ ~Éò9Eó yvÖZÎ/êA†ÎY:ll¤µý¨_a¦L½_¨\ß€Èú›Ér„Ëm?¦|HF^ÂÄÿbö´8™‚É™@v ”ÖÎJ½i_àFWn4Û2ßN+/1Þ¡ Â&ňáGtœôç֌×âëŒGŽ ä]׈\`Ø5º´Æ0q,X# ù9:/RH8vzPÁ©FHäm˳`²:pñfôäm¤ô` !‡Ø-VQ~l ™Š†”]ãt¤L)O™þ«rJc¦å=M$²ï%Tr`Z%3®õäíÿ¶H(¢PúnÆ{H9ÉÇ;!öz'Äb‚edâ4Üv=OË-©ˆÛÍUnzCÅáÌB€Ék©^à4çÔ­W>uùÈ_ŒÈ›“Ahã€î`Ä××H¶¥:öùm‰®’¢&2Ÿödø’°U‘“#‰­±•Á'½Ë ÚÉ"`;q6MéF²1ÃäS:=lGnŸN9üD¯è|d'—m½)²H¦M®E<\ˆêíоŒrsGifOr²kâ~^@ˆ¨óª Ø#\Fl¡Žû·Æo@¡ß’å!ƒ´‡­æ<„ƒB ‘bÃ}ÎC%d%³5¾ É" 8ß6л +kMé«.ñ èÝM8kd†¡.ö’ ‡þ: y8Ü{g'¸d/þ€$Þeƒ?DN­éÝ+ÓßÀpCÇ÷Äj®înº~s{wûô™Å\ßÿ,eÇۛÛûÛ§Û÷?ñè ‚Õ : ·Zf(.@Ûr°}ñ]¶ryA2Ì£A”r´ùJ¤ân'œj‡þ)*Y\1¯ýWIûRetÓÐ_‹¬ó÷1ÈñÓáÈ­)ùYŒ£Q‚…ÂäÌEByœDg¡¯œ'å­»­EÉøoŠ âobd¹¿ÇŽ²m˜X@l÷‡$ˆ]”«Órœe>ùÜp ‚y<câÇFU¶Ç¥$”¤OFÂÓU§’ðß-Øæ]m‹7?‘Ðd~OH|  7x­áö(ß¾úƒ'w7PkyEO1•;zakgÄ'tϺ”ç;yÔ9åaÖ6ðÁ+ w#J×¾{²VÑ,Òì.@“È×Ã/wRX#E//µ‰Àå@”1‘¼ÇÚƒÖ—ÖÜsž.šQi~þ'e 幗üè”ö¿ÉØIWA"ÿMF©E£º BÁnIÕ;%CS!~ÖÊæ~‡¢Á'€äý›=Œßˉa¤Ì9½G¸¹>>X›þ_¥'}½då®?ñ˜“5NWûÚ)Ú+ˆA¥)^èœÞIû¸,o|ãÿcóóÿ/™#6° +endstream +endobj +1144 0 obj << +/Type /Page +/Contents 1145 0 R +/Resources 1143 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1129 0 R +/Annots [ 1140 0 R 1141 0 R 1142 0 R ] +>> endobj +1140 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [152.087 538.456 321.452 548.737] +/Subtype/Link/A<> +>> endobj +1141 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [225.562 484.343 508.501 495.247] +/Subtype/Link/A<> +>> endobj +1142 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1146 0 obj << +/D [1144 0 R /XYZ 90 757.935 null] +>> endobj +70 0 obj << +/D [1144 0 R /XYZ 90 469.649 null] +>> endobj +1147 0 obj << +/D [1144 0 R /XYZ 90 437.72 null] +>> endobj +378 0 obj << +/D [1144 0 R /XYZ 90 437.72 null] +>> endobj +1143 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F90 1139 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1151 0 obj << +/Length 3481 +/Filter /FlateDecode +>> +stream +xڍÉvã6òî¯ÐÓe¨÷l5‘sëô–ΤÏØÉ$“䑐…iŠd¸Äñ|ýÔ¢éL."P(€B퐿zXù«W_Þ_½zŸD«l›%a²º?®2•&Á6ƒÕ}±úً67aì{¾ýžïÛM°÷´æÞÛ:κêUoêŠAߘ\WŽ'~{»lóëý×Wïî¯~» +`MÐqºM£x•Ÿ¯~þÕ_ÿzåo£l¿z$¬ójFð-WwWÿ¸òÝýÆþl¿a´õ“˜÷«Š¢Õ]§ Ø@yªãïú©ÖÛÍÍ.ʼŸ6Aà{õ y®›žÛýIs£sä’×Í(ñpÝò·0]ߚÃ&ô½¡×³‘BÝ~–%*ٌ3¨„\«Lkªd$pá&¶Y,Çmt{6]7r¨ +ÝrÓî²5§žA¥Ú1P‡}oGjé6 wLí5£­?Ái~ñý¸ÞÀ±ÀÓ-®³fœúÈC| G¸wÖªêCU¸èÝcÃP^ƒè˜ +ÏF£‹Äf(@w›ºÄ÷á{¦¿æQm€J»Ä+`ˆáùÞï¸'Ý@pÏ×BIVyraCNâÝÉ&ªâ•Eí[8e©zKÕT}m±jچ°½zԃ¾äy<ò< +o}§…jŸ¸ݞ¹=ÓñWñ§Rg\’ M£«Âü½˜Îàà[`ðÍYõ½–ŽÉry‡_b;6&¶3XI«Ðª”hdÜy9Ü,±¸3›0æ–xåÑÞòZ|½ ­¦™ Ül՝LÃ@ºÉ kï5á4p±ã>q¾jèO5f9¢ƒàú…á¿mâس4p¿"ª,±ÿf-ò?öi3;Y`'G"9 s¼¼€ 4܉ïx + ?R"v3ÒP +þ‘,í ð Ó–ˆ±;f,Ž‹ÉÏå0[4Víÿþ4t×AzW8äÀϳvFQÂ÷ +À÷½ü¿ÉJ2ô¥Ê?Ϧ,9—yÁ˜Cð½Â]4j.Ù½F¢¹—0™²so}Ç®¿“æbÏFè4Ï¢Lš4½fàâùqÀÝ>/ÌR C‡E‘W6*¯;iÅáxÑ]Á­jûKì$ølHZI„°Ò÷lÍp¾è‹ñp”zëû Ø0Œ¯!–¢Fû)õ"$’/Ý!À1–$”@T!“¾iµ*Ô¡”Yó|.A'×@ ”ÈØÉ:ŸÜ=ÖíYÉ2ì~–¢áFçN)1Û½0Á°"$%ÇÀ)ðLÉÛA +)1¼ØxÐÆrÜ¡¨8ÇûJ+ƒI"dSˆ/L?‘:’G‡(æ¦c‡$õbZœ9 &Œ0“³Ð¶€xsáp³„ oÏäØIUÇ!]˜žCõPbøÉ 9³¹ÀX Ô E ùrÚ@rCù„§ÃÔ]Àõ oÚú¡Ug¡g×p„\¦å$áìê³^>eÁ‰Ì.o Ìòx]»Ð%Èx|h´á׬ý»&ƒ?t¯  ¼I®šÁ—š1Æ2¦D‡Üç‰áD’¤šÂ`¡"™ê ¹Ú„cø$}îŸNŠ–Øe;N{—!ËÞ±Éd#×þtÚ;:j0¯îèv‚&­ʤz¸¹Šû”Y? +×<3Kîuö†“æBÛŽÐ<«öóÐPÇqp`rÁ Ì1Oä¬zÐà@Kµ°™ÔBf~O¢N=“æ%B,AÎтpòƒNÿ6Ì"÷tY‘ ›w@ñLmˍ|9ÞHü9—ÐÓìïµÐ -d2–?… +Ï üV]h‰Ùqk?Å£õÎ@B²è¤Îõ`ËG¶ªc·ø¶>5 +G<Ö՘ÎÆ;Xp".$8¥-ݬ¿k°}½'½ûCÎ+|ñ:~âÊ¿Ÿ:ªá‹ÝEœg ÃQ*D ¦©òr Iì1©M½×wo>~ä&ZښT +P&é × ›êX[Š¨ ZÀ;Ä©1ä +Š'ÿˆ>lRÚhç¢%Þ݇Oß0˜Nß-``_‚MÅvMå“>3—~{ÿ–⼘Í"‚P* U(n ÇÕ_¨uv/“àÌûêþxÍo®¹w 1Æ]Þ®ãf’*ï½Û·ïÀ©çÕ{OŸ†³ªv©YÖÃé§{GÎú3¶¥£À€ÕCÒpìÅâ‹Ö(ÇKãлýöƒ”.|óޖL ûúöÖA,ž EmF+@ÿ× Ù¦¼ëªÕÈ­éØq(яÙÚèƀc ©+r‰Y̶'ÛÍÖÍâ1Æã çºëj©eX±Â™|1‹Žòx2ù‰›R=!áaÈX…¨³ÿÍÐëÔe'h”e”†/D"+:N¸.²x1Q(< m1œI&ÀƒX’LBóB&ÃýŒ°L¶] ¹y-P B-‡…Œ ‡\.ºr„[»‹ösè9€ÀêÍÐbT%(twÏêÿóÂN¬¥pÿm ùš»X_s²r´E,ŐƒJ*X‰‡E@Á+`ýD¶½ðµïty”JWS­–± Eµå¹gž-xÊ~[¡Wi], /ÅSrŸêÎpŸÙڙ9”63û±Po!ؤø{Ú¤ àÓK€ù•†ÓüP ¨:¯Z†qmÁ¾˜ ’0š ½Üìü÷~#u|„Ûç’î’ĤՈCz²XÖÁ$aôÞ`îD¾¹~ƒCŽÎÆý\.€ÄÙÔ§› ¤#¾@q…#ž~âIè9Á+€+æIêO’% :8¶­¸Câ ¢( ‡ÉËÌ¥x]6–÷c© Úh«Aåž?8Dªé1jŒAFœºxzahŠS–3Ú0™ +pÔY¿«h[0Sýéßk¹G…;üÈc‘ø5±2=h#hs2çÖ±'ñ-6íåBS^Èh¢‘µ/Q“!„.ìGxá%m|Å,2¾RU `ßxÒlt0W^|\š$"°UPjÙ'µ—ˆO/kЙ^ÖÈûb¢÷׿ܩ„ +btÜ=. +Ù½ß;I»ôÇkƒÞی3ÐÄ +^ÍQ@ZÎ8ڐÔÚ/˜IzXë×ùçŠñàö4^V·ôõ[MymdØ%¥?".ùc Íb ý½G<­ùåã&‰R±¢ã@êkíXÀEC±1êôšûäƙœ[Jãë t¹¬ -zÇEìKøu§.=[—‰ÇZ ´Ì¢ƒnõYm*JM7‚q»£HÐEBä<¯Ý÷‰Úª¬þÝÚõŸxÃäò5:“JfGSä•yÿÚЋHo/Ão!³ƒxþ<æd•S0ˤÊ3ڐlª7&þû`ÖÔc}ˆõ!³d:Ivñ— 4˜%f/¹¾4˜¬®=¦Wiˆ&*€2;N:? °¯Mé¿3zÒ¤þ¸ÌAƅO2JNŠç¦°]'$k׍ЗS-J¼ü©‚SG±EÉx¼»|¢êx¬ýsÒKˆÊG~}±¹‰±"=¾%"a64ØÄÔÃجVp)8¥"¬{É5¼àPz4sÍN’ú;Ô¦˜h©ðÀÉ®<äѨùm‘½™B­[pnv± »›ý'h¦¡dã?¼û痛³r°ï?~b:o¾»ýéã·è_?öo;óÿ$ûmìÿêŸìŸ~’m–F{ùÓOœmãØ}ÆÀµ9ØHºuùtÒXŸ“ZIŒ|ï{0„nðIUƒ}ïD7"åîéŸ5þ6ð·!V9þÖrH>Ùç•mýÿT;û öé6òCâËîûæ‹W¯·y·oÞ´[Ó¿Å}uÁ¶Ù©ƒ`·MG"c¬®í;©80´Íåÿÿa_c +endstream +endobj +1150 0 obj << +/Type /Page +/Contents 1151 0 R +/Resources 1149 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1129 0 R +/Annots [ 1148 0 R ] +>> endobj +1148 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1152 0 obj << +/D [1150 0 R /XYZ 90 757.935 null] +>> endobj +1149 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1156 0 obj << +/Length 3512 +/Filter /FlateDecode +>> +stream +xÚ¥Ûnã¶ò=_á·c‰W¢®î[wÛmÓÓîn±éŠ¶ŠDÇ:•DW—ºùû37J”¬ìY´@SÃá3œ;ãmž6Þ曛×7¯ÞÆÁæ°?Ä*Þ<7o“Äþ>Rþæ¡Øü² vw*ò¶ß¼û‰o۝Ÿnµæ¯¯L>Ժ鳾4 ƒ¾/sÝt8{A´¼ÝoßÝ|ýpóǍ{zŸöˆ’}D›¼¾ùå7oSü»·éæBXõ&TüV›7?Þxîy#oq^ì½8âóþ¼ó}ok†Ý]¦Û:{ÆA²ÍÍyðggMÁà¢ìú¶|Ü)o;ôš'û“æI˃ËÆ®ÝùÑVÈÖº(‡úvw*µÕ%,m+7u­Û¼ÌªJPÌ4¦™MÆÑöEüÝùþþ #çÖàF–…†Ãª4†ƒe=Ž•ÃDÚpuŒ¿ÅÓ+‡ã¶|:õŒÜ˜Ð;A&!0]̓j¼:XÏÈ<ÑeÏeód±yïĹigçsUj9Uoì9õkŽ`½h›µš­ž‹!G~ñ›$ŽUÅ`©¤ãþAî ,=ÓµãŠBæÿFnƋHS”} ’2MÇ  PèŒÞ)7ʜQ#bƒw0œÑ-¤°ÂšÈd$Ž2ªƒbeT‡Eː¤^秦̳J0uÖ -I¾Hš€dAY‡\Ö¢>á/ðÓ·¦:t•muV𕍨Áö8´,^Çú1a'+œ±ðûà ‚=`éw$¢L*¿s«YDIºýÖ |/3)¼ÍX EXË YžësÏ@0˜3ˆU¼ BH7BÜ(ý•Ÿ²æIq´§àËî÷GÆÇ}\æbfnéБeüSeäñžª3<xÜ õ#‰Æ$=øµbÂ11…ƒzèz!Zu†GGSU,þæ«# +¤ ¤ø]Šcít>yÙ`?²‘ìc.íJú6Û´Òdôã9oùch +ËÇxŒ.«_8Pî^ ™ì‘½]¨PËìÏW'9àd*ù©Ÿ+;e¯ ØZ„¤“À:8oûæý‡Ÿïß}ëïßñŽ?íboû廇û‡Ÿ™Ü,bXr¢×¤* „±;ÉG[6Ä,~Œ&ã_½È#M[ÀI1á#CÆCqP„Xצ¡ˆ Âí)C}cÑ­î6I¶í`?ŸáæhÉÊ*ëNWÃë(9ØAmÐ۪䀧jæ{Þ­8qº¹Db bYÚÿÚEѶãÉ)LÂ&`¢Õ %»-øz㞟‘v‰5Ù¾“=YIðhl$0ÒM^™n<ç'ݑ +Yæ*T ‰ñœMåYÛJ¸…ïp›W:kIa)sXï©|¬\\ +ALNÓÁ`ɒ?˜ñ÷—·-8è»ÿ‡Ì #Œ°øpÄÅrüòœ+bᨄÛ×YþûrW„/vEûÔP +°–GóMAН‚»~m(ÕXAš|™8bçCxVà¶uNHxš¾<ʗXÐM§\K—Øj‰ÍÈg#‰”½/ñ öA 'Š„7_H f… A¯µÅìÇÕå&0ê˾Ò<{<™½ [2mÑ1ŸÎ·t%n0#J WdHuÙHR*®6+ù³ì@‚kÏs“àĆTĦ´6JÑ5÷à0ñ@TR…Ô³9°w}·‰Ä^&GaEz8€=8 ΋ +ÅçՄ©*뒣I ™N`õ?XZ4#”¨ 8Yòj0²\ÇÉ9~ѕµÖ¿ÎèÊmᐷ;7e§Dº‘³aöÑÁ5ŸGün<¥ tBÈ1ɵÂÌ㪮öMT¢ª0ùÛÔcDt24'ëÃ!°x†¼ [M0´)uÖ` wVàäç£$q­cp¼° \Fù:‘5†b3՚i†ÎNòﯞ§z^¸âZ‰»ˆÙÌP<>ýâèH§í„’i´l6ϒ$”ÈËV•¬‹6Wâöh$Ƭ3M'ã8KRnQ–÷e葷æç¹¦åe3è ¸¯Þ’ï%)ˊÿf9+¦Hٓ^\ç,S±Ùw๙Š$ßêp]ÒâûsöÇ y~JV’J¬ç÷ÜÊ ÀNœ; çãÜ!S‰ÏœiåBJˆðC2ñ|J´=(zÀ¸²üÞí«¸ Í;0ú6kº3¨‰É󝂞Hˆ/€!{\§Ã,ÿ³…¢‚¾Ïõ, Ä–±ÈÔ<;õIªëɉí6€‚düƒE ÜH‹7s×è^bFZjo“Ûòp!*Õ<ºœJ܇|K€û¤ݒ˨Cénèø²Ì™6O;ñ$PSu¡â`!Me²bKR5¦ybjŠ¬-8ç±ZӛÜTfüƒÜWãœfÀÕ­2ÖÔ¦‰Y=mƒS¦{‚­ÖsLIºX÷æöœz“gŒ"[¡„R‰G‘µÔê¾¾g/ Uÿ¯æv¶&«:X4–ÁHkr&<{n‡BÌrè^Ÿ¹ì¾ƒnxÉHóQ|dß3cFíXI ¸òL'%§ +M%j$[H*À%õ£âCÄ(„Û Œ. 3¨Óó×¥®Ê¥¤9Â* ÎxO$1 V½’fx“ÄÊ;µUåZŠ0š†J}¨Uûw¤gä•t˜Ù4šaϐkò(;ò=Ú´†VŒ ÚÚt0¸jP¢Ås£SÏÌ`ô) ¸æ}%3îÚJπwYõˆàõ›^“ƒ{Ÿ•ÕXü¹m{K tœzØ,⠛ìzv€|¨ž:þÅä£Xhú¡ü­Èç•t­³BâÛPîü²\ |d ¦• ‰Áɼàë¢I£|Ì¢Ž\¶Òæs› ·Ä%¯È¢ƒór×æv.ħrêUb­gÍ!Lls=_æ4nm "‘¨6^ÎŔ Ú4w¼Íé²íöÏ蒄Ò%ùáýW÷oïß|¹;Dۇû÷ï>~¢#rÝE +Ëϴ݂ðº‹N“<õƒ)J̳ˆGÿhû“€AL†¶ ºmwÛÖTh]EÏR é T-N¬šÝ²¤ËÎ{`[Ì8â»Do¨Ñëh;/ƒ»ð½` –Ÿã‚ÎËN“»"ënaä4õá8¢5Ÿ³ ¥k& ûÇ %½UÅf[™Â 5ä™cŽ¥³)'êªÄ·>&¸4Òº +VeùÝZ=:ó8¹ÞkÆ|ϸVJ‰Ñ]N‹þ=Y¢é:s›uâÖdce/sßجœuìöÅ^n19Ûnt Eßv´Þoðíòö½’Ùg®ïà ÝÚ>µ¬þªT4ÃZ8€tƘ ä/÷+vî«}¢F”ŸøM#–w›fy‡{iGüÊ4{’/ª²øí%æ~gSSz]YìhC)&⣥•éqnˆO{¡Aq :’{ñøÈ#©ž{ZG=q3<*ʝp;S&¨’ñMG%¢ð Ù#©PÉE,Ì8¹cä^RrDàš•:™ŠØdҺҍ¼Ûä+¥Þ͌%lÂW!$ð-Lšö™¡Ó ŸzÅÐ¥’›º(llÚA2ét…yÂ¥¾AàOk¹õL}’@z,ôËÈsaáÄ,|!€®ÝvVpiKÈl©pÁöŒÓ±“> cÃM¯XúUttó˜ÜY·uÙuԓšÙÓǝØ«@ý {zý‚=÷µ(ߗT÷b=Ùð¯lþÌ àÓil’0äG˜4æL6ê¥ü†°Ùñã¥3MӞ+{ø¾ p¾~ƒdJv9•gYÍ™¹Ö&•¾›Þ%ÅÁ¥¶GsX88˜p=:c[èIÛ7È1!TŠ¯oJå¹ã3KÀâ­Ç-a€/&yyæ‡SÏ2Çsü é}Æ+4T„äÖ¨] Ü áÊ:8Ûà§sS¡è9aÛwYuÔüäÙò§íš„ ÖÐD‰TÙAź +f&~ù~È[Uh$a¯?HK²>f/ØDð7lâÍ 6á'¡Eù(•µvšc¶ïµÀhÆ'È«LØq«óŸŠµ·ó6à +Mzè˜ Kyû8 þù +ó¢U‰Ám%£ù0oZÓëmuõB<ÿ×ÿkÇçÔ s¦Â0ü*ðõ ù¡?f"øè@=º†hÙl0¨±×¶d@ã«¢'ž RéL kw„ô§6*|QbèÙ¶>vòÄí¬mHÅ-þKH.­WGF ›Øÿ"zKQwUNÞ^E‰Å»ç–¨¼Š–5= ÷\$éØÅH¬óKÒ+>ÆçX~[¥Î#_|°•*¯ÃeÛ=DàTåmØHÀàã/š…Ú6d03Då-+"5ýó» +x­©K ^œæ¨˜êù¤‹6³ÿY÷Øf­Ô-½·ã£<:¼¬'0–]¥KÞ/LÒA,t>j-L2g¿oìèߨБs^?Mö§¬ªžúþüÅ«W—ËeŸwû¡)Ïí¾ì_ÏÕ«…Y̸öý2rKäh»\ò/ T1áÝeýUþòÿ–æC +endstream +endobj +1155 0 obj << +/Type /Page +/Contents 1156 0 R +/Resources 1154 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1129 0 R +/Annots [ 1153 0 R ] +>> endobj +1153 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1157 0 obj << +/D [1155 0 R /XYZ 90 757.935 null] +>> endobj +1154 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1161 0 obj << +/Length 3170 +/Filter /FlateDecode +>> +stream +xÚ­˒Û8îÞ_áêËÊUmµD½wO›çtf:ÉV;»µ5™ƒ,ÑmUdÉÑ#=Þ¯_€%J-ÏL¥r‚‚xIÎêqå¬Þ^½Ø^ݾ ½Ub'¡WÛý*qVQèځpWÛ|õ«å­7"p¬·ï?ð¦Y»±%%^ÕY”U—vE]ê—"“U‹ó¡ãVà®Û¾»z½½úzåÂ;•«ÞDvä«ìxõëoÎ*ü»•c{I¼zRTǕ/6²•Í·µX¸ÁXXî:v­îv„)‡ýºª;ÒDw`ä¾/KMÛv-!ë=¡îªµïXßÖ"°Ò¦H«Ž¦d†*n‰(­rùµ/™ÑË%#ñ"Ø®#dÌïúM2'ª +·¼Úð.7®k'ë®àó$±³þÛ:¬–pãfa@›µ' +_mHÇ7±½H|DZü´x,¬Gh’»*+ûœ¥HYî¾JËN’n`˜Õ§µëXg)m«ÍíÄlçÒ ×ŽËâ»ß!þݒø‰{Ë6åù1i–‘õºêŠ®ÄíàÔõO`:us¾¾q$¸xÞl×p q)“*ãÁ‰4g «éEÇ•f!, Þðê‘ÈR&+eÚvd@jCd>!m‹6*^Xg™6hÞ<¬$ZâÑ¥}w¨›–§HH@ŸúܒÚ³Ççi«Dà¾Î‹ÏŽ#$Óÿ{íº.˜KŠCÆ-=§vOÜÔÓ¹ º¢áG$NÁ*6!ÏÝ^í֙^XÜ(zX©^ÂM ñx€€Ä\ûè 1œ!/f:&.ª®rÖȴ㩺’D< `‡•ƒÎa™©stZÍ ;!·&b(]DݖH{0´d4 +FìLÁjeESÊ0ŒóZÁ78T–Ï ”m*€9‘-"&—mÖ;µkC*Ï4……ÍM C°aàu¨ÝÄ3¯wj”‘~+ê^“ÃÆeõãÝ»µp¬Egçx!Sâc ’Ý:¹ºù‚pÏu¦"3¨×w\«ØèVŸ×a`ñÌünQQM¸;Æ¡#z_7([ɘq–ɶ%råTGuðMZµ'0GØè†#ímrRôÇ3|6ŽÔՇ' €y?ܐ]àËâ .#çR´r²LÌ´„ô¬¥–†s]ª¨.¼šF¤ &Ʋ`ƒš[ý2v¹ðT¥ŒÜ¥­òN |Q{{´“È:¦gšÜ1âT¦-ˆXÔH‹M¼ Ù%)®Âú/\ +ÐD?aYõ‘äŠÕéÂÔÙ¾´Ⴘ¬áú¸Ç£¶qęL{F´v9¹^ +–G …æÜ3kôj¼r'á…R3—4ox(G+Ë=:™VÃÈýlMݏd “r83=â$`7aœ,;’ŽžÜˆ=^ 1‹Dgêú¸÷³)¥äæt¿ƒÀPe¼|àܩ؋¥ì¾%Ó ¬õ@B|²ºê \¡Ïë;¥䶠» ù¶f›ËG]>7£1l5²¨~thúå‚ ÅÎ¥46ŒI¥+`¡¶ñÂĨmH¹ys•éæ“ØÌëqVù;"/¹Þa1ª e2¡DckíÁžp?ý? 6‚õMÜ wYŸÊà°£óÀí•ä{0ËhÆòH—"U[äci±»àVZóý†´?ðlïÏÖ·ÅX¢¼’¥ÄÌSøŽéC<˜1ÜŒ®_W9ä™ìl #¡õÐgf³À@…HS0½ã—TàåzD³¤%ߙ'~–þbú÷£UøþR‰ê»ƒ +k¤5üFv\gÀ`P**‰¬‚6åõŽá…U`gN:øu!Fû‰Ú9š7æÊí´åY7KFžŠî0M_ÜÓD±K 0֝güXUøónÀ,À¦ÍÂà?ë/%¤¢c^mV¦ÅŒƒ]Ù¡bŠª÷ wÓMØ/!`VžnÍ + ¤`³mi4T»8Ø76Ç´ë0¥Àåíàq¾n虞N²¿¯™Pö„Ð×>-±žÜŸ™’)@ñu•§Íyۋõ^ ,¢K©ô TñŠHN–šäTÃ +Pø#aÙQ…¦“Ad1¥$&gZ£’>@œ)…¨>i×`MW2Dn6àøŒˆýðfȇ6՝2Ҋˆ´ñ©•b ƒ-ZCM´yM´ØÂ}$Ü"Á9 +Tn˜IëašìèÑ%ñrC/ž4ôNN >¦q!i\܀[Ê×ÚqP9º|ÃÁǾåûºãÙ\9žŒ±ú¤gw¨î†LøR„R¢Á5,šQi]i@=(è1º:1qmbîÚ0ðCÈó¨çYäšLU.ðd›niÊ8?…'c4W¨ DDdª Zž´œÞrÌîLO}êªw€ õ…lÁå…\4úìïÓã‰Z6.uہŸ+_X-%¯ÑuæÐ@C*ž#Ad`̈`tH™ïNJ8=m–vªµ«|)g+»ó´ÏZ«kìÙÿ3>èöʐÌPë©ÀŽÕ˜¸êÜZãj +¥CZþg¶å ¶-ßÓýM¡l Ƨ´mÓGI8¥S@ö'SÔ³PS:œã6o™]ËüiøF¹òYïçÍÞ;žl¨ÛšãZC$npr.„Ççb¨¶Û’OÇI×zÆs™Äs™|~nô «Üԑ1CÞ !-ë³W¸óOˆR†/FF“+ãiv¶  DúP•g~W%ŸiKI°°ýåÃp‚‰T„á~‘n¦"°§ç¢òypÇ$àl,@›“ÌvÇSŸÀ©™CwhêþñÀ´˜„<ŽÙåR/†e®tLÁfÛ¥ZTøØ3+:ÕÑS©¶«Òœ Û'³#"°ÞmdšŸi0æ)jŠÙìc’0ÝŽ¨Í3¾Â·Úô(—S÷YˆdÒ +ùí¬2”qÇ(Jù4|îwo(;Àë;ɊS¤{ €`Ù¢H«JaéE€¤* ¬ãÎrÌÝkLµi¹gœj#Åþ¸”R˜¢²%ŠtókO)ÿÉ„;†¤áå±Z¾°·Fª®Þ̅Ö%{a8ø qý©Îæ)€n==¥y0ÿƒîö¬ÑÅÝ:tÄ|L—ÄYôÌ[EêÏxZ2lºœ†Æ÷† 9 $ì4Èa¤6x’âNz(ôg=€Œ¯ÑÓ.7¿ØTQH.)ûVjN”÷á[À‚]î^÷¨^èºbÀ½‚ZGF(Pºé\ñŸ×É,š9Ø$Cœ}øâ"iRFé“ñIè€×î_ܽ¿{ÿ–k¡/?Ý¿~¿}X(³.F]áèDßÁ¼ë¸+”[rt}à„æÁ å%âu& `Î$-Ñ4¿jw0ÙW¹¦ãÃ>\¼ — ‰~?œ/sŠ±üqH(á™é§°|Â¥;ÙŠr7Žfƒ%fƒÿ†âÔ¾ƗãÛ}Œ\þ{áFß´|îÿ¸¤uæ­e¤¦âÔ¼Å_k3,úÊ(0÷æÔ's¯U~$"³z8™!.ÃQÀŸp}y2.O¬]10;öeWœJfF Ñ2SM.Õ²€þ£eH‰ORâëÀ–ÓèI}?Ð ¥G ¸dêa”ÙDbfã%ÞðÝj`”GKh†·º].%:A¨ ¼ÍFÕü§¦0¶7þ«ÿ4é˜B;‰¼˜ÿ½ +;|Ó †ßš#×Bëò|y“ê?Wvj÷àà˜¦ùƒÎ}Zõ)['×gß©Ûul!—ƒ”¼IÚٗ•†~ÆÎ\`ÈëƑí9CãíÐu§¿ßÞ>==ÙYk÷Uqj좻=ÊÛYo²k×õíh`2Íc­çEÈcú¼úÿ?õµAI +endstream +endobj +1160 0 obj << +/Type /Page +/Contents 1161 0 R +/Resources 1159 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1129 0 R +/Annots [ 1158 0 R ] +>> endobj +1158 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1162 0 obj << +/D [1160 0 R /XYZ 90 757.935 null] +>> endobj +1159 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1167 0 obj << +/Length 3173 +/Filter /FlateDecode +>> +stream +xڍÉvÜ6ò®¯è§KØïÅmîËÌÉc·m%¶œ‘Ú“7/Ɂ"ÑjŒ¹t¸X£¿Ÿ*T)*£K( …Bílws¿q7.þq¸xý>6Ù.‹ýxs8n2w“ÄÞ.ò½Í¡ÜüæÛW~ä:®¿Òà}·õRGš½k‹±͐²môI¢éq=vƒÈ‰ü퇟.ö‡‹?/<ØÓÝxj(Ù%A´)ê‹ßþp7%ÀÚ¸» K7 +«Þ„~Ïjs{ñÏ ×æ7rüúÁ΍#ⷔǭ9GÑ[ÈQàm3À¤ÿ‘¦uþm빎 ÙpÒ9T}Ú¿=\}¹¾%J_Þ³Ëþòöëçýõá–h͜邖uŠ$¿‰ÂH"ہ8§GÑV•¹_5oz¸SÒxI™F²‚Á@‡¦¢#â ä•ftŒ¦È.ï•``66%áE@R2 +ǞUT;xY tÎUŽ‹Ŏ¶%›R¢‚|—åˆJŽ‹E{–èLpŒüÓ ²§7L C0ڏEoa?ˆn×äp¢QNDU ³1Jø‘Þ$¯¬véõnE5–bUo‘t³Š“ p­›…ÂÌ9w-ª6œ…I¸¸Ž”‹ÁÁÞ"‹!*DºQ9X¢LhM2ÄȄHt4øŽÛ‰îl¤Ö<Ñ•zR𤐋(òLø³•ÃòÑƨ´Á°ýЯº]KÇý€uÜA¹åÿ]^ ´’ÓCߎËIƒác×֌Cɂ~)œß€ï§¬íHL¤“w[ßuFå[òŽs¬ ªõÞµÞð¯ô~~Û~r„wºÆÈjXš‡@e´¡Ù) ­ìN½¯‚q¨­:œÉMo§Å¤ÜmÄg8jxv­d¹ó¨.ùR—»¢úªõÅ#7÷[4D”¹ m¤(miã<ŽçÚqó!vÿß'ìß`ÎóáÃÍþÛ-X1ºb¢õëÕá#§×ïö¿ìáçúÀKÈǗ›Ÿ_àœßàÕGϲÒù·ÏwæG|%0°-ÌÚNkYOP'R3å°£ˆ<•"Í6À^@¢š¼ë³ò¢â I®± +ÛLÍî‘É„ÖÓåÂÜ@a«'Ïsz|Gsi«ó_µ|œ-c"‘ß‹9‰™¡IM°†È=Öè½D9W fÊ1"IF¼Ìïï-mÄ%Á%oMÞѝì’¥Ó@ ÐɱRpEaÙk¤Ú„Ò`q£°¢lžiÆHQ_jéYÉZò"ÓØÄoEÅTOhJM¦mÃi[´Éæ‡-T½Ù®cîÍǶáýÈ@ìmÑm½Z;ªŽ¬~šN÷SˆHòE°­W!èƯ'јi¦¶ +ÃLò[& +”_Êš/oLåЩv1©«»l•ºÃˆ¥ „ÎgåtFb~6Y±Æ>ØZé°äŠß:Iª/¡›ê +ón݋j²I•G>g´«l<©KÞÙîÌx>Î*u¦3¼¥B~“@‡mâjgONü9ÊNÐ5! e2&íÇI@ekÉr绊wBAóÖ=ƒtf“4œ½›bK¨ê…÷‘æʍM +åe§Uh1}Opü ÁTõ‚ S^tÔH‚@HvŒ¶¦vn¤q³óx߅|͖/c©Ü×îx[•Æ–k™ÝÂ&Õ¯c3DiÊ䇅/PLbýØð +ÆÙ,°V-Ì'oã L~º¶‘ÏAQ&å­Ì&䒂åÈ«×X4¯Êþ¹Tµ}Æ̱<å ýM÷AêbÉOUßT·žŠœM\·Îä?ºN{Âó,{˜KÚ6ćS[=ã^j¤|ŠÃ͛ëÛOSšñ|òÀ’9lƒÈéò¦7q&tɯ†.•nàa(s)5to²a¥… Ÿ¶”¿»®_è¨:è¨4 +ö–p8Ùt9µ†Á“œ`ÃÄK?߃3K×¾p˜Q¼ªÞèÀ¶ˆ)è6¸½… ÉÁ$فpœUR!¸+!Ğ:B8£”ÑçŒãûAža:*1ê!² +sØÌ虋˜âÿú1$ºZïiJá…( „X!±( › +8KDæ0IпgO€Ö·5ã´¼±J·qiM&°nÉÄ£¦z«,%KÙS Ês—äGÙ¬Siêе ցËÄ®¶ì2à ZDÎ0ë^ìN²@hδgvQ”AdN¢lª¯îq¶›bói”á',t·9†X;<•Ú ö…Ê$|Yv;{ރŸ I-5>é˜%$»OÏýô©Ç;º•?í;òÏ%¨3î’BRwM͘"³¬ÖÕȺKæã¦VW×ÍH¯Ý”Åàf¶×v9s¨ÕãèóÝY¨ÊfÝU†)à‹ºkÌp³«‹®Øåïnäξ„ñæŸ~.:;§–º­ ‚§þZä>¥æMÔ&ɏgYpGµ&‡œ<@¶yošS­P £¾3%¯d™Îö7Ÿ¯®10¼$+Xé÷zºßës%ÓŠ#¥pI¢R€ãˆ¿,o™ðeÁËOÂ>Pæf°7k{œ÷â<ZÞÛpÐѾWrLžø:€iC%Eˆuô¡Rß´p±ðNßhG¸±®é+QŸ‚« +ō–²¼l.‹Î9ɂޡfDüD.pq‚‰Ó˜{²ä­Èå¹1)ØÚ׋qhk°V¹Ãfª9ƒHuz;ZÐm„r{10áG“˜b­ÉTÅTsj¤ ~¿¨^‹UvKƒSŽükk:Q«l- Š=&Õ®·ø·\ÍëöI¦¿¥¦AªÊõÕZŸÀ\ë§ þ¸Ô—L†ïûFŒ%­ª0 +ðªUŒޔûÀ°f„‚`ðK9øÉ¿¨WŽ£öؔ© É)^bûžËÆÿþëáë͞(Üìÿuuûô+ÐáãC>]½Ý_ßî_P3(c7û¾SŸÿ½Ø¹mƒj5P××P„-܁Ž€EŽù«3Aú¸§]‡2jwSw ðù Çª§ý/aÆÔò? °¨¯ÿù&I²æÜgh5Ò±õûx·ÜÖO ë*cZ0 ˬ_0ºc‚½¬e¥êG•o1ð,;Éi™ÙQ§_è三:“§x&åÇeþh‘Xÿ}˜ïTŠ‚ùj"ÎÑ’öN5?TçÉOeí]%jÝHê´^‚Jv”m{ø½\Éöÿ܁Þø¶Ñ£Ÿñÿ%‘¥T^œíâć%ÅÀiÎ{ýúááawߌ»¶» >à±Çá5“¤~,tӋ“]0‘ÙÍp—6‰Ó]æ¥/ý¯‰þI¼Ë’ åÿ˜DÙ.ŠBÛ0GÀ{É»:çi[=žDÙåú0Pöwï¿B2¡[>8ÿœ7&¶cñ$'sw`Î>f/•ñį—‚pÜ5ýnlä¹ÛÉáõù\­ˆØ¢â…»IÂG}õu«ÓÙ`#E™ÙùÿÌEä& +endstream +endobj +1166 0 obj << +/Type /Page +/Contents 1167 0 R +/Resources 1165 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1169 0 R +/Annots [ 1163 0 R 1164 0 R ] +>> endobj +1163 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [258.676 114.516 428.041 125.42] +/Subtype/Link/A<> +>> endobj +1164 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1168 0 obj << +/D [1166 0 R /XYZ 90 757.935 null] +>> endobj +1165 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1185 0 obj << +/Length 1912 +/Filter /FlateDecode +>> +stream +xÚí˒Û6ìî¯Ð졵g²Z=,ÉڞòØ$›nÒmÖéL'ÍìÐm³Ñ«”×ýú)KŠ’6íôÒÉIē kg9Ö³Ù£õìâiè[±‡^h­·VìXQèځçZëÔz;_.νÀ™?á•\¸«9OXÃSÂ݈ºY¼[¿°–®o;~•Hà#vvµžý6séX®RDväV’ÏÞ¾s¬ð/,Çöã•uP\¹µô|øfÖÝìǙÓ71pF&z°cÐ~W,Ù/Îýe8ÿ°pƒ9—µ( B”[üófÏ q#^Ô5}wbáZ¸ F”Ž(Š]+ê=|>±IÑæ.A0·çAͯ·Dèv}R&m΋†t×OÄ/ŽãñÚð±†VLùÓ±Î]׎}¾ŠÉF$mÆ$0…ŽÞ£€ÐÐ@¨3÷٫óqïЀ>+µV ä‘€ Â*?Rx¦9«*ÊXT[ÒW4`±ŠæDz%̞-<#nLЋ²júöMr[fY‰a8hG¯Œûâ9˜–ׄcEJ¸¤,RJ5 `—D£¨¯:¿Æ=—§Dd$Œ,zg©¼€ñΔ Ùdç¯ µáFSl7d’²<õ‹8EÙ d=W%€©dÛ\7G¢’KñTr½º+·Íaá‚ihhbÙ)Cÿ`N‚¤ÊIτ½œÄýJ_Xu)Ÿm³ú§Ÿ8 ¾ çÞ*PŽôVK†ˆÑiiãÅ>¥ 2äìHôd_–˜¥¸î’9>G*?ÝWI,=×"CçZ¤1½?£OϵHÝèݕcA®EÔÀµýã†tܱ£eTMAÀ÷l7^’Àóµ¨|âEÂo«Î˜ K•U_X¶xXLOŽ +h5”êÖ´õ JÂÖÞ҆t¤­×‹\=óc½£›ý^‰ð–pµî¼ %#rÚ% B:X oP•”:áHÊe €(úÔ¥3²C\Tm3•Ž$†.D3¤ØíB‘:Xd}÷C¨ók[æ­* 7@ÑdzY±¿TmÐô1ó… ¬„)\b˜ =¼(†X…vëžû¸¬Œ]¡Cu"¡„u=€¾zøÚ,xóš˜^=|yewNpÀ :ð·PÄÊ•@(§á¿@’v,#ùˆåU¦Œ ]:8P*YB›Ë¢T͞¡7?pâ“|[¥Ä!yÆYM#ý½¨!`¼ÅÄÍSƒJã¯Ë2Ž†AðtÓC‚> aÊ '¬²p[9S¦y¤e§©9Z‚{ñ_ñjª Íl閉˜g¼à’in±%D¸¨RŽ +„OÍOBŽ†TuÒ 3ÃÛ3ù4»8{†ž‚cfþîEÁuœÏ?)ôËÕhž†«û:7_rõ¿AøÌ wú½áõ³™õV©¼%Órv‹×´ÌŽÐÔ%»¿Éäñòòѓû»=«øå%KÓ{H7˜{ áš{¨+÷¹(D.þà£`g5“!+Ùý¸“"øš×†'”˜Íc'úûŽóϟå!iU6Ú÷e1ºkט¢½æ©˜¶#¦ ä¬)e=>•ý9ߟ“}(†Á€ly‘ð/ €–2Ø}À¿¾õ?»÷wǺṉDý5ÿ0º>˜ž¿(,ÿëXŒ–CgÝÕß}W6ïÉ¡GþJ¿'1„Q$kcÎ-6} –M´L«R!#àMÍå·ø¬§¡—¬hUè÷}ø‚Hdž™×Ã`À˜ï:=ÓÉÞ[fõ=Íì'{ÝUdûŽgžÛ÷MS]^\;©í¶•´EsQUÙÅǁîiuJ¶æ)/e×陟·¾ÿÿŒÀt? +endstream +endobj +1184 0 obj << +/Type /Page +/Contents 1185 0 R +/Resources 1183 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1169 0 R +/Annots [ 1170 0 R 1171 0 R 1172 0 R 1173 0 R 1174 0 R 1175 0 R 1176 0 R 1177 0 R 1182 0 R ] +>> endobj +1170 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 274.03 433.559 284.909] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_b464aec35ab7fb9fe0a8a50e05ad6f99) >> +>> endobj +1171 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 261.941 321.759 272.845] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1172 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 224.525 439.088 235.405] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_c20541d40c7629b278584406ce554eaf) >> +>> endobj +1173 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 212.436 321.759 223.34] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1174 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 175.021 437.434 185.9] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_2626176104b632be36dc614e1d5536ea) >> +>> endobj +1175 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 162.931 321.759 173.835] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1176 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 125.516 477.643 136.395] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_1cb059d74161d8458f18b02e33efe434) >> +>> endobj +1177 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 113.426 321.759 124.33] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1182 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1186 0 obj << +/D [1184 0 R /XYZ 90 757.935 null] +>> endobj +1187 0 obj << +/D [1184 0 R /XYZ 90 622.348 null] +>> endobj +74 0 obj << +/D [1184 0 R /XYZ 90 328.487 null] +>> endobj +1188 0 obj << +/D [1184 0 R /XYZ 90 291.761 null] +>> endobj +1189 0 obj << +/D [1184 0 R /XYZ 90 291.761 null] +>> endobj +1190 0 obj << +/D [1184 0 R /XYZ 90 252.974 null] +>> endobj +1191 0 obj << +/D [1184 0 R /XYZ 90 203.47 null] +>> endobj +1192 0 obj << +/D [1184 0 R /XYZ 90 153.965 null] +>> endobj +1193 0 obj << +/D [1184 0 R /XYZ 90 104.46 null] +>> endobj +1183 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1231 0 obj << +/Length 686 +/Filter /FlateDecode +>> +stream +xÚí˜KsÓ0€ïþ:A|ˆ"ٖ¹QJ3” + §Òñ¨¶âxˆHJ3á×#[vHS¦Ó¤)0Ÿ"o¤}èó®äE ŒŒ“‰18smÀÀµ\0™‚ÏŐXLbpÝs̾EPÜÄ~ET²XË.R!͛É9p° ‘í)õâTRãÝÄøa`%D×j‰=›€(3®oˆ•ü h>XÖ³2àX¶úƒ±ñÙ@‹èQW-eÙ%Úî%Ën¯mk£Æ0 M`cƏêÖÿ±LŠ\ÿÊY#xŸ•s–±\R™¶Ó­IŸJÆ©,¸Øny|C¿uÙ&ÐAÍû·Šæl70‡¢áv444—Œ U·Tˆ4ÉwɎVQƒauì)ᾄE©\ o‹…ÚøŽÁßL„Oãíãa¿Ó¡-D]Úg÷5 +–kÿv!PéGíʆBÒÕ¡çå@wEú—ÙÐ]þ£SAHNÕ-iDŽhVíu*tõèÁî‹ý¶+ ºrtrôd&ÑU£?ޒÄþפû8Žÿ˜v_>/veÓ9,g62*%Gô½Ý°u}`ÿ©ýÚº?«BvaàÙ~ӟ%$ÄÑÑNZwRÃi[:mW¹F¤¾ +Æ_›„ô„~¾¤ù‚Îõ¸‚qW©R×±#ˆ´*ÐìÛê%ø½Ç:²ï }¨Þ6²á/ö=h#«mcϤ,‡ƒÁr¹„‘€‹<-9Lå ,烇 7´`zk%Óöó2+x~š+aVóz°ÿ¿ˆ;R +endstream +endobj +1230 0 obj << +/Type /Page +/Contents 1231 0 R +/Resources 1229 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1169 0 R +/Annots [ 1178 0 R 1179 0 R 1180 0 R 1181 0 R 1198 0 R 1199 0 R 1200 0 R 1201 0 R 1202 0 R 1203 0 R 1204 0 R 1205 0 R 1206 0 R 1207 0 R 1208 0 R 1209 0 R 1210 0 R 1211 0 R 1212 0 R 1213 0 R 1214 0 R 1215 0 R 1216 0 R 1217 0 R 1218 0 R 1219 0 R 1220 0 R 1221 0 R 1228 0 R ] +>> endobj +1178 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 720.047 442.963 730.926] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_8921d611a6be878bd8ad66a9af6f405e) >> +>> endobj +1179 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 707.957 321.759 718.861] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1180 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 672.226 483.172 683.105] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_794dad01f1995c73b887effa026ac32e) >> +>> endobj +1181 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 660.136 321.759 671.04] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1198 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 624.405 450.156 635.284] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_4882da0200ef4201f3adb0f6d7731526) >> +>> endobj +1199 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 612.316 321.759 623.22] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1200 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 576.585 457.937 587.464] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_a8e2f5b70168ac89a3f47639e7d9a4f9) >> +>> endobj +1201 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 564.495 321.759 575.399] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1202 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 528.764 414.729 539.643] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_ccb5584441a7c7c84de73810cc6afbc4) >> +>> endobj +1203 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 516.674 321.759 527.578] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1204 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 480.943 430.221 491.822] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_880be9febc6dab2cdccbec8814c9a952) >> +>> endobj +1205 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 468.854 321.759 479.758] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1206 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 433.123 418.605 444.002] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_726484f44f6e6653f9c0126e94e51ab0) >> +>> endobj +1207 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 421.033 321.759 431.937] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1208 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 385.302 458.813 396.181] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_c587faeb0edfd2582564b9a8fa3335bd) >> +>> endobj +1209 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 373.212 321.759 384.116] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1210 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 337.481 409.2 348.36] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_fa7b390fb34934e419263a5fc694c946) >> +>> endobj +1211 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 325.392 321.759 336.296] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1212 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 289.661 413.075 300.54] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_7704df6970b9563ef9e51793126c0ae2) >> +>> endobj +1213 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 277.571 321.759 288.475] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1214 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 241.84 453.284 252.719] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_2a66994a33d910d0fe8daccc6cc017ed) >> +>> endobj +1215 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 229.75 321.759 240.654] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1216 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 194.019 434.096 204.898] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_1522764599cd8547bfe4ef7e88d8baec) >> +>> endobj +1217 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 181.93 321.759 192.834] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1218 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 146.199 474.305 157.078] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_4d6e94fc9839cd5d455f195f46fc2dcf) >> +>> endobj +1219 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 134.109 321.759 145.013] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1220 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 98.378 425.797 109.257] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_59af9a947f610641fe02639f76cfc90e) >> +>> endobj +1221 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 86.288 321.759 97.192] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1228 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1232 0 obj << +/D [1230 0 R /XYZ 90 757.935 null] +>> endobj +1233 0 obj << +/D [1230 0 R /XYZ 90 699.833 null] +>> endobj +1234 0 obj << +/D [1230 0 R /XYZ 90 652.012 null] +>> endobj +1235 0 obj << +/D [1230 0 R /XYZ 90 604.191 null] +>> endobj +1236 0 obj << +/D [1230 0 R /XYZ 90 556.371 null] +>> endobj +1237 0 obj << +/D [1230 0 R /XYZ 90 508.55 null] +>> endobj +1238 0 obj << +/D [1230 0 R /XYZ 90 460.729 null] +>> endobj +1239 0 obj << +/D [1230 0 R /XYZ 90 412.909 null] +>> endobj +1240 0 obj << +/D [1230 0 R /XYZ 90 365.088 null] +>> endobj +1241 0 obj << +/D [1230 0 R /XYZ 90 317.267 null] +>> endobj +1242 0 obj << +/D [1230 0 R /XYZ 90 269.447 null] +>> endobj +1243 0 obj << +/D [1230 0 R /XYZ 90 221.626 null] +>> endobj +1244 0 obj << +/D [1230 0 R /XYZ 90 173.805 null] +>> endobj +1245 0 obj << +/D [1230 0 R /XYZ 90 125.985 null] +>> endobj +1229 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1291 0 obj << +/Length 691 +/Filter /FlateDecode +>> +stream +xÚí˜Ks›0€ïü +Zs°,ÅëÖW2M“6mܓ›adPS#¨„ëq}iât<±Ë¤”b‘ö¡­VB [/gÖäÈsACÏñÀì +„ø†ÄÁ`–‚ùhj‚F¯Y%lŒXBk–jÙi.kûrv¦Ø…Èõ•Æv!Ôz3³¾YX À­ZâCß% )¬ù%©’ŸÝ0ë¶W¦Ž«žKpa}´qítÕQ–=¢íž±bÁDk[™±þéØóÖçs£ÏmÊå暥‚ƧùBP±‰¢c‘§Q´ª*&âE¹âiL¥Ì3SÕ,ržùflhǔå/ˆ ¤äj:Z#Ýz¶QŸðî“#‚náLaˆ|0ƆÄrÁØî(^híï˚éVÉõ³¾6‚·Eµdã5­óîcyµÕéƒ +’Ö¥ÛñÀ-ïLû¸sÙ%0èuîµ8çµdµéÓ Y3¡QDÓ4ngYPÕg ¯nF,É^X¼˃±ÈøÄY³¢Ã#Ÿú²ñO&VŒ'lO> endobj +1222 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 720.047 433.578 730.926] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_901082d5c6de5ec4b457df69e41bb70c) >> +>> endobj +1223 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 707.957 321.759 718.861] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1224 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 672.226 466.236 683.105] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_a04426c5a10bb84d277c580d8377a8ca) >> +>> endobj +1225 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 660.136 321.759 671.04] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1226 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 624.405 470.111 635.284] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_1773f4a296b1e34a24fc238f84d615c7) >> +>> endobj +1227 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 612.316 321.759 623.22] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1260 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 576.585 471.765 587.464] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_f6ef577d2302b2baac4689f8766cfb2f) >> +>> endobj +1261 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 564.495 321.759 575.399] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1262 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 528.764 475.64 539.643] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_ac2ae1578a08e1613a4e7ddfa0f4b711) >> +>> endobj +1263 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 516.674 321.759 527.578] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1264 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 480.943 482.833 491.822] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_aaf96fa77980ed96433261f5dd4c8f5a) >> +>> endobj +1265 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 468.854 321.759 479.758] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1266 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 433.123 437.603 444.002] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_1c64e09d6022054690f7d2bdf4e02138) >> +>> endobj +1267 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 421.033 321.759 431.937] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1268 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 385.302 435.93 396.181] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_ec640128c6492defc09c4d6ad5d3ea19) >> +>> endobj +1269 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 373.212 321.759 384.116] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1270 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 337.481 443.133 348.36] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_eb30e6558c9efffc62d5765b3bfe5e4f) >> +>> endobj +1271 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 325.392 321.759 336.296] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1272 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 289.661 441.479 300.54] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_304e74729ca34fc67648cbc995e1dfc7) >> +>> endobj +1273 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 277.571 321.759 288.475] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1274 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 241.84 481.688 252.719] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_e6eef0ed4aa8b3690f01f774dd0722fc) >> +>> endobj +1275 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 229.75 321.759 240.654] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1276 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 194.019 439.805 204.898] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_be643d7919aa34a2c1112702878f5536) >> +>> endobj +1277 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 181.93 321.759 192.834] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1278 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 146.199 480.014 157.078] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_7a8abcefdfb125b7c9ef5f96d352c1df) >> +>> endobj +1279 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 134.109 321.759 145.013] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1280 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 98.378 447.008 109.257] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_7e4bbfa6f481ead40e3ca6231e0f69be) >> +>> endobj +1281 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 86.288 321.759 97.192] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1288 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1292 0 obj << +/D [1290 0 R /XYZ 90 757.935 null] +>> endobj +1293 0 obj << +/D [1290 0 R /XYZ 90 733.028 null] +>> endobj +1294 0 obj << +/D [1290 0 R /XYZ 90 699.833 null] +>> endobj +1295 0 obj << +/D [1290 0 R /XYZ 90 652.012 null] +>> endobj +1296 0 obj << +/D [1290 0 R /XYZ 90 604.191 null] +>> endobj +1297 0 obj << +/D [1290 0 R /XYZ 90 556.371 null] +>> endobj +1298 0 obj << +/D [1290 0 R /XYZ 90 508.55 null] +>> endobj +1299 0 obj << +/D [1290 0 R /XYZ 90 460.729 null] +>> endobj +1300 0 obj << +/D [1290 0 R /XYZ 90 412.909 null] +>> endobj +1301 0 obj << +/D [1290 0 R /XYZ 90 365.088 null] +>> endobj +1302 0 obj << +/D [1290 0 R /XYZ 90 317.267 null] +>> endobj +1303 0 obj << +/D [1290 0 R /XYZ 90 269.447 null] +>> endobj +1304 0 obj << +/D [1290 0 R /XYZ 90 221.626 null] +>> endobj +1305 0 obj << +/D [1290 0 R /XYZ 90 173.805 null] +>> endobj +1306 0 obj << +/D [1290 0 R /XYZ 90 125.985 null] +>> endobj +1289 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1339 0 obj << +/Length 1199 +/Filter /FlateDecode +>> +stream +xÚíX[sœ6~ß_ÁSËNj­ÄNg’m;µ4Þö¡N†‘AÞeÂ- êl}€÷Ú©§}èHË÷s$µ•†µ7“WËÉìµcj>òÃі÷š5×!È6ˆ¶Œ´[ݞž6Ö¯ò¨N˜|¿È"öuúiùV³ˆ‰°é‚*)ëˆÙÉOËɗ I¬‘FŸí"×´µ0Ü~ÂZóo5ŒLßÓ©T³ ž‰v3ùe‚[ßð^ °ìØÒîKïXÙؖFËUkýۉvÛ8ý~J°N˔ï§Öód³fQIƒËø®¤åf>ïOO‰§çÙ|N£(h,܄ ‹‚0ÏVeͲUÍ¢ ³8ÿd­mé0xôÛxÑÉ7›Š³T¢÷M¸ªà3,™½¶q/@ÃB>vµ3Bo·AÞ0¶?—RÿuÎ[žòL>ùZ— KYÆ)ÕÇü~$ô®`%åyYcB#”œ)—Mٖÿ̼ÄgeÅBF@«*^eéê*>mmŽU¶ÔlN"ÆùŸ˜11Œƒu$ÿ+ÿ©riÈ 2-Dzá#÷ºK0ÞÑc¥†&°F¹áµk¬®äš<¸1k*òÏYÙ‰+ù¤ò‘ÄŠ +%Mù’JåóA;2Â%® 6ÁiÒº¹xñB*º¤Ùª¦«.J¨ã{î£ +êÌÒü4Çû°*› ¬¦´é´À\ӔU…0r²N‡ìHÁ¥€éYPŽò°ùÆ"9ΔáVÃCÌ×òí®ŒY»:bUXƅHÑü<ÅõÆ”ÿ(ÛOD=/U]@±Ü:UØrݨþ™ +˜çªº”D6Ä¾× ¶äŠ ºtÇßÂ.0掏|>¿xìªzè²^ƒÃKÁ©ÄYQóY^sxș¼[Û ©BI ú€ˆ±¤y +@ĉ ¨ò-kØêNÀÈôLÈpu^sS¡‚óçXCÄ*̇ŠÃV@˖讜įayÄÔ]÷ô^ඥ¼H`_:­¸]è->Ã†¸p=%¶¾9Ü–]NÇٚ•1à²qKP"U^v] ÌëÕ:ÙL[ÿ®­~‘—u»$˹*&±_q6¥I±¦wŒÇ!t™ÍßîßkâՏÁ͚Lâ@H_Ÿã" •tßw˜÷D02,%°Ü¢ÃG.­À;2d¤Ô ž×%»·7Ùw¤öáÀÏ?üŽÍ`ÁJ‹Ò )ß³›ςEÞï þœ˜Ïª»ìöÈtm<2ŽóÈ=Ö£üë¶T€š„t8:.–¿mÑb€¶NͨEÃíZßÁ€!Läy§ÖÁbÍÂÏB.‹×µ:eaðáÝôÁð(±œº–ªèÖpn¶høúæ‰ÐËB6y„Æržšî>¼§ÃØñt␭Œ,8^cþÈÿ +ÍèÐò]Ókÿ#Ø>²mKuh¦ †–.Bi‡*uþëd~­Xùí*¨mÜW4«iÒmfø¡ +îªÝ#A­ØçlíÙãEEFöYSo? ¢ìž¿Äs‘‰;¢ÖœóÙìáá…ª³¸(QÌgE‘ÌžÞ–zZ Á?Â}^ª#~w`Í`2m.=ë%àÿðǎÿ +endstream +endobj +1338 0 obj << +/Type /Page +/Contents 1339 0 R +/Resources 1337 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1169 0 R +/Annots [ 1282 0 R 1283 0 R 1284 0 R 1285 0 R 1286 0 R 1287 0 R 1321 0 R 1322 0 R 1323 0 R 1324 0 R 1325 0 R 1326 0 R 1327 0 R 1328 0 R 1329 0 R 1330 0 R 1331 0 R 1332 0 R 1333 0 R 1336 0 R ] +>> endobj +1282 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 720.047 487.217 730.926] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_2aaf9117efebc52a8b45b787075a9647) >> +>> endobj +1283 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 707.957 321.759 718.861] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1284 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 670.542 454.201 681.421] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_1956a63a72283d208851d3fe2b11989b) >> +>> endobj +1285 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 658.452 321.759 669.356] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1286 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.007 621.037 444.268 631.916] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_97011210c7f0b2efa0f837ef2da6c5b3) >> +>> endobj +1287 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.787 608.947 321.759 619.851] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +1321 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 495.497 513.996 504.473] +/Subtype /Link +/A << /S /GoTo /D (subsection.9.1) >> +>> endobj +1322 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 378.106 221.094 388.985] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library) >> +>> endobj +1323 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 380.008 513.996 388.985] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.1) >> +>> endobj +1324 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 356.188 288.052 367.067] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_1_1IO__Operators) >> +>> endobj +1325 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 346.135 513.996 355.112] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.2) >> +>> endobj +1326 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 322.315 117.901 333.194] +/Subtype /Link +/A << /S /GoTo /D (namespacestd) >> +>> endobj +1327 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 324.337 513.996 333.194] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.3) >> +>> endobj +1328 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 208.729 513.996 217.706] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.1) >> +>> endobj +1329 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 186.812 513.996 195.788] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.2) >> +>> endobj +1330 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 165.013 513.996 173.87] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.3) >> +>> endobj +1331 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 143.096 513.996 151.952] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.4) >> +>> endobj +1332 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 121.058 513.996 130.034] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.6) >> +>> endobj +1333 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 99.14 513.996 108.117] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.7) >> +>> endobj +1336 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1340 0 obj << +/D [1338 0 R /XYZ 90 757.935 null] +>> endobj +1341 0 obj << +/D [1338 0 R /XYZ 90 733.028 null] +>> endobj +1342 0 obj << +/D [1338 0 R /XYZ 90 698.991 null] +>> endobj +1343 0 obj << +/D [1338 0 R /XYZ 90 649.486 null] +>> endobj +78 0 obj << +/D [1338 0 R /XYZ 90 594.253 null] +>> endobj +82 0 obj << +/D [1338 0 R /XYZ 90 562.324 null] +>> endobj +86 0 obj << +/D [1338 0 R /XYZ 90 478.899 null] +>> endobj +90 0 obj << +/D [1338 0 R /XYZ 90 444.096 null] +>> endobj +94 0 obj << +/D [1338 0 R /XYZ 90 307.62 null] +>> endobj +98 0 obj << +/D [1338 0 R /XYZ 90 275.557 null] +>> endobj +1337 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F11 418 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1381 0 obj << +/Length 1098 +/Filter /FlateDecode +>> +stream +xÚÅXKsÚH¾ó+t[©j¦g4Q[{°;Nb‡ÉÉI©dA$±’ˆã¿­`$ò^ôbèþú›~5f5.z'ãÞà\rÃ!ŽdÒß5”"ã©qk*V(¥æéÂKS«Ï5ß~â%hs2·@˜VŸ3Τ)”õ}ü¡÷nÜû·¨PHŠ(.ŒIØ»ýN)~ÿ`PÂm<«BÃfï ã¦÷OVèvï¿£jPÜPŒ*E yd5½$ôܑŨ/çþ4ñÜOÁ¢~Oãh–¬ühâ»7iæ‡èm2«`¹è·}и RWKêá¥Ï€8 ^‹`8œÄQš¹A†Ìfq²hÛ1ÑèfˆtsDi–xA”½¬š1ɐ ew¥úðv8Tj4ïA‹í`6µ‘ê +Qê~ñ§«IÄQ®bpð$J¥ÊAù…Ü¿Ê%;1B˜½^p–!|Æj¤q š­—þý‚Ñ»â9%ÊÞ(} TúÜáDkޒ3·" "/ók€ƒDªC,ð O£›:!˜K@µ5?·F¨­ùN+ó›&Œ³8DgpGEҍs¨3ÀÄæ²9 ¼Úò!$ázˇÃ:q‡ó’ˆÐ=ó¥?ó‹ŸÑÌ=‰íKçLñàÚFë…ÊŒ)k†²žµTŸS·ŒM,fLÀ-yˆµþIœqi2Ê[P¡^EÅa(‚ Œè·`¤MQŠ!Cªsgi M Ç6™´;!ìjä^F™?ó÷0 $F#‡0Ò²G©…~ì¸m`±§~’ß(e“ª¶½‚¦&³;°û9„¼ù—e{ïï ÁódB‹ç½rš3bçÁ+EÇ¢SÊãÂÉ"ÙÔ8oQW÷±æJ›À“xMQ¸%„Y5—ѽń×H—Š ëµnðYl42©:i‹.S÷tîO~åZÛ2‚%¿yK4®âØvU `ãÈ»&@ÑNú ãðDœ{½ +ïÊ\¼#U)Â[LcKÙkOÕ6®Ä–O.6õ4j¦å}íeÁ¶Ùt?'¨Ïg3­d –ê]O´Ž=F$g[F F>‘ï%î»_Ë23¦i5¢¾ÔõMƒi›¯.Gë©èn±¯Õc6öTêÈõó:Þ;ŸƒæĶáÿɤƑlë-G²¦¹øó$ófqä-ܛ¹·¬Ò…¡ê¼}2ÌW œ-õ£Çî±%ò–;BÃSËâtR࿈£¸®ÎR± +,ƒ¥5sATV¯k.Ë׊Ðòåkê'äuº:y½ò¢öÅó7*èÏ\”Ÿ¡W|¤$§bõ9nٍ¿îYJË~맏9Mâ ^ИÖéÆQæY¶d’’U,dƒår1xFߎÕgDm„Üã0Q ã¤2?ˆðcèåCž BþÿìŖâ +endstream +endobj +1380 0 obj << +/Type /Page +/Contents 1381 0 R +/Resources 1379 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1169 0 R +/Annots [ 1334 0 R 1335 0 R 1350 0 R 1351 0 R 1352 0 R 1353 0 R 1354 0 R 1355 0 R 1356 0 R 1357 0 R 1358 0 R 1359 0 R 1360 0 R 1361 0 R 1362 0 R 1363 0 R 1364 0 R 1365 0 R 1366 0 R 1367 0 R 1368 0 R 1369 0 R 1370 0 R 1371 0 R 1372 0 R 1373 0 R 1374 0 R 1375 0 R 1376 0 R 1378 0 R ] +>> endobj +1334 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 721.95 513.996 730.926] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.8) >> +>> endobj +1335 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 700.032 513.996 709.008] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.9) >> +>> endobj +1350 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 678.233 513.996 687.09] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.10) >> +>> endobj +1351 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 656.196 513.996 665.172] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.11) >> +>> endobj +1352 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 634.278 513.996 643.255] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.12) >> +>> endobj +1353 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 612.361 513.996 621.337] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.13) >> +>> endobj +1354 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 590.443 513.996 599.419] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.14) >> +>> endobj +1355 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 568.525 513.996 577.501] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.15) >> +>> endobj +1356 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 546.607 513.996 555.583] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.16) >> +>> endobj +1357 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 524.689 513.996 533.666] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.17) >> +>> endobj +1358 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 502.772 513.996 511.748] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.24) >> +>> endobj +1359 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 480.854 513.996 489.83] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.18) >> +>> endobj +1360 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 458.936 513.996 467.912] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.25) >> +>> endobj +1361 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 437.018 513.996 445.994] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.19) >> +>> endobj +1362 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 415.1 513.996 424.077] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.26) >> +>> endobj +1363 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 393.182 513.996 402.159] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.20) >> +>> endobj +1364 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 371.384 513.996 380.241] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.21) >> +>> endobj +1365 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 349.347 513.996 358.323] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.22) >> +>> endobj +1366 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 327.429 513.996 336.405] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.23) >> +>> endobj +1367 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 305.511 513.996 314.487] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.27) >> +>> endobj +1368 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 283.593 513.996 292.57] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.28) >> +>> endobj +1369 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 261.676 513.996 270.652] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.29) >> +>> endobj +1370 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 239.758 513.996 248.734] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.30) >> +>> endobj +1371 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 217.84 513.996 226.816] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.31) >> +>> endobj +1372 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 196.042 513.996 204.898] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.32) >> +>> endobj +1373 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 174.124 513.996 182.981] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.33) >> +>> endobj +1374 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 152.087 513.996 161.063] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.34) >> +>> endobj +1375 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 130.169 513.996 139.145] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.36) >> +>> endobj +1376 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 108.251 513.996 117.227] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.37) >> +>> endobj +1378 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1382 0 obj << +/D [1380 0 R /XYZ 90 757.935 null] +>> endobj +1379 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1418 0 obj << +/Length 1460 +/Filter /FlateDecode +>> +stream +xÚÍXms£6þî_Á·â™ZÑ BR¦Ó™^Ò{ëõ&MÜûÐ܍‡`Ùfƒ øÿû®Û!6¤—N?! iµû쳫•°3w°ófðj<8{í3G!åSßÏ…áÄ)qÆSç֕Ãåؽˆƒ<·ÍwÉTß¿Œß;a3’Ê©\šÑÁ¯ãÁ߃Ø!¥8.`Ü —ƒÛ/ؙÂø{#¦¤³)g-2øÆÎÍà®T;ü>V•`ÁAA Ÿ[%®†»A¶ &WCŠÝ4Þ.ô4 &¢»,ȶççՄ" +âx;¹ÖÓu¨§“«lH¤›B§0Fœ½&dg'êa$ˆ_ú“r  ¢LÕ3.ɏ¬KZ5®[Äz )Åë5?—èYزy…ßõ›G’H1V/b”UËÚQsFL1$%sF” EDg”ìðä"M¤8(¢4yBAçvD¤¾Ë„\\i!ûjñF÷ÑB¾Œf¸dÉ(eT¸Lâã*ËÜ~z\LúhB”/™K<ò}Áøø±§ÂÂ¥Rœ é³±ÃfÖFg¹n ]âc¤$?º^¹-2({†)%)Ñìëïãô»"prÏK]èl%A¡Û¶ù¾ê¾ÝM›`—)´+òùŒö^(HîÏb^”€ù¤ƒ(Æ ÕýéK'<çˆ>0‘q܋‰]¹Öá6Œõä]²ZG$Á¾t=úÓÒÍ2Èö4¯ÏˆCì”B=ÒÀÃÞ"‹$io7PÄh“FÒʉÈãÅ¢¼J_ï×,5š(»ô­Î´ԍbQ5B#LçUøäEY÷Ö ÄfµSLm’¨Îf%œ¡®~n¢ba[wY¤g¶9Õy˜E+ßùùÎ:„Ï©2^]NnÁªõ°óò0éœVÆ­Õa.;xBÔgÌñ/Fé|^Á9f3m9Ÿ„•OòRý² ËÈÓLžç»'ê疅Pl +„á‚ÔØ·×a6¹ÐpûŒ1 «Šâ!ènGÒ÷KSdž_¦Bv÷°ûÍ7vbwn •¾pÃ=Qåüِr7ÍlÇ°ÔÜ\Êó@ï2:¬ºV›šSDÉÜöҕ΂ÂÈ8 åK—ÜÃJ§ a[Þkðôˆª©cšEZ±i‘‘MuVÚl~Êå·Bå)ÐöÏO—3¸¾6U!´7NÏ;_¥÷mñ ¹bøhü(ܚ«ÿ»ñ§¶êæxÝBØH1̘ç&iQ54dÁŽxkÂ8Íõ2(ã܍òt”BJ„œ9µ¿CÂÝ-0Ôú;,F¥³Fej2!¹ë® ™Çúì¥#wˆÁ•òuò³ðTíÝÜpoÇVûÂ:„°Ä +Ÿ¼8·¬ì[!\,tøµTu:ù¸^ÞA6k/[w\ñCî§ã¡ð\ÃÆÝjã(ܶ½>apéÌZé=b-w7Y°êY&6™ÖüIÖKÈ&¡íÀÏÜҒzb…íÓ2Z®b½R7)7°Ÿydð±þL{:¦bãHÿ¿IÅi2ÏÖåYtœ±q”è k[/ê`¡ŠJâ¿<5µ&7Û¼ÐË&åv’=-g‡¦å]ló¥`Z{íqø¦ìËҘŽOÊåÓ1Ô³>R‚ÉꕛÃu{UÌÔÅë•I¦˜ª[#SÇ%<¶óg®³†’+ë~’µ9Jkd¾Q:Ë£:é`dê7‚¨Üèš)Ö²¯NÝúÍ ßїHn®œ‹¢XŸm6æªêU†¢âlµŠÏÂxÏj¼Y]Ð,Óºˆ\–¯¬hOàÿ0hï' +endstream +endobj +1417 0 obj << +/Type /Page +/Contents 1418 0 R +/Resources 1416 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1420 0 R +/Annots [ 1377 0 R 1383 0 R 1384 0 R 1385 0 R 1386 0 R 1387 0 R 1388 0 R 1389 0 R 1390 0 R 1391 0 R 1392 0 R 1393 0 R 1394 0 R 1395 0 R 1396 0 R 1397 0 R 1398 0 R 1399 0 R 1400 0 R 1401 0 R 1402 0 R 1403 0 R 1404 0 R 1405 0 R 1406 0 R 1407 0 R 1408 0 R 1409 0 R 1410 0 R 1411 0 R 1412 0 R 1415 0 R ] +>> endobj +1377 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 721.95 513.996 730.926] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.38) >> +>> endobj +1383 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 700.032 513.996 709.008] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.40) >> +>> endobj +1384 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 678.114 513.996 687.09] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.41) >> +>> endobj +1385 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 656.196 513.996 665.172] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.42) >> +>> endobj +1386 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 634.398 513.996 643.255] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.5) >> +>> endobj +1387 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 612.361 513.996 621.337] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.35) >> +>> endobj +1388 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 590.562 513.996 599.419] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.43) >> +>> endobj +1389 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 568.644 513.996 577.501] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.43) >> +>> endobj +1390 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 546.607 513.996 555.583] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.39) >> +>> endobj +1391 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 524.809 513.996 533.666] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.44) >> +>> endobj +1392 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 502.891 513.996 511.748] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.45) >> +>> endobj +1393 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 480.854 513.996 489.83] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.46) >> +>> endobj +1394 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 458.936 513.996 467.912] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.47) >> +>> endobj +1395 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 437.018 513.996 445.994] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.48) >> +>> endobj +1396 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 415.1 513.996 424.077] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.49) >> +>> endobj +1397 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 297.709 299.694 308.588] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +1398 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 299.612 513.996 308.588] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.1) >> +>> endobj +1399 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 275.791 315.718 286.671] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate) >> +>> endobj +1400 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 265.739 513.996 274.715] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.2) >> +>> endobj +1401 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 241.918 362.014 252.798] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1BHRZ03__Certificate_1_1Compare) >> +>> endobj +1402 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 231.986 513.996 240.842] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.3) >> +>> endobj +1403 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 208.045 284.202 218.925] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +1404 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 198.113 513.996 206.969] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.4) >> +>> endobj +1405 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 174.172 288.79 185.052] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +1406 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 176.195 513.996 185.052] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.5) >> +>> endobj +1407 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 152.255 364.821 163.134] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +1408 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 142.202 513.996 151.179] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.6) >> +>> endobj +1409 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 118.382 279.196 129.261] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +1410 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 120.285 513.996 129.261] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.7) >> +>> endobj +1411 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 96.464 314.612 107.343] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +1412 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 98.367 513.996 107.343] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.8) >> +>> endobj +1415 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1419 0 obj << +/D [1417 0 R /XYZ 90 757.935 null] +>> endobj +102 0 obj << +/D [1417 0 R /XYZ 90 398.503 null] +>> endobj +106 0 obj << +/D [1417 0 R /XYZ 90 366.44 null] +>> endobj +1416 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1474 0 obj << +/Length 1639 +/Filter /FlateDecode +>> +stream +xÚÅYÝs›8÷_ÁÛái­èI(sә6½öú5“kÒ¹‡¶ã!¶â0µÁܜÿû[!Û1N¯¾b½Úýí§ìÍ<ì½¼¸œ½ÌSH *¼ë[OaO +‚8%ÞõÔû쇈 Gcì_Ì£<Ž(Çþû8/†_¯ßza3 ¼Jb®ÌêàëÁ÷E쑒!—H2îMƒÏ_±7…õ·FL…Þ}IµðÊà:÷® °nûjøe3Çøã.ñ ‘Ì“܊u9$؏²E4¾Rì§óõžfÑø}|“EÙúüü"MfÙJ'=¾Zç…^œŸOÒ$/Æq¡³¨H³R­Jïóˆ1âÁ?O†å}MOÔOÍ~?̏ÎìûÈ^ò’y‰  +oDRÜəÞZx'µ8o؊8ºaVÌ­[RF6wBP‚„ýÁʋ,Š“¢‹Š?·RÏãDG™½×ßWÑ<.Öö)u«@ÐZXϐ jǪ‰‚òh7ÐÓYÕj¶1¡ãÑ˄R… ZÈ«ZøXÕ9:e¸vtJUÃÑ͛¶£›•È’Ր°’}$JŒJ"ÊS;z>þ¨§«I§‰Ùúì!œC+–ªJ‚¿[’vZ +J+Š—ä)äƒ ô_ÒìC<¬HŸµT}«1Óõ] H2ú›­c™ IèlOµ#(î´}]¾Õ£ÒH# +¹_rÕ6S¥zi¢….îÒ©½¿R^sÉÐÜ4q»´{öå4]À›>Ö&Ó¬žÆÚ/5¸ö"N¢Bï0 +‘ ù ‰1ŠW—W»˜0¤$ígÚ7cÚ¿³hi¢„ñ2Șð//ßÛggk³ §-¢iC-Kœ&ÎÖD( ö­«Ô¾•Ù`Qg·ÑD÷±•`;u"ەNÕr¶è+Ž&…)çí0åto˜ +.{Ç);âz…*Ná¶Zȗ©QÌ>FÉÔv÷ñ| ¬[†»q†±á¼h¤f¬÷wÚŝÙ`nÂ<­—zªo].7)ï*†ùj â›*x/ž<éń…Ø'ŠžÆ^YXŒ/šµ)Nfãé?êxÍ\ñÞtº”£ÜãÊ[·_ëdO}Þn¹ž:?ˆÖCÎ}÷´Lë ®òõdžæ+ë-[4ºnÊð µ~|6«Xô²gÈ(ó)f§Vì`ÆÃMÆe³ ãa· ƒ•È’m êŽÁˆÉ)V÷:ߋ1Å ì°c!ûp9~%h¦·Ñ‘¢DçSr“®’i™¨¤, Pçö)*¯¢Û 9ڛµ}k{X€íìÊ<íîÆ&é£1S§Â,‹§bffHútBõá÷W¾ŒÌ㠝ñŒéÄucM „䮆‚­˜bgl"€”Q?©^¶X•®»Vá,¾WkC½ bË„Õë|)2ã²ÏrŸ‘U\²ÁO¶JÇ×tËÈU‚؁¬Ý%Ê/Ò"‚öÀ¬¦Ù´,¬î)Ù¯¡ùã.W4ÿ«Í³#Ê´FÆGd&Ž2ʎB´oÞÄ[£TøÑÂôéí½¡í]™Y"Қâ×°–Î?Qžk+ÔL2z†ÿ‹ž«5mÎLp³ZÓ­™ u3“Ÿý¥æ?CŽJ‡*‚ÓôãJõp6§,¬„Éý¹ÜÐur¹YÚL ˜i.°«]©ÓòޑkïLÝÍ/‚Ÿ¨ŠoAø`¦BÔx­KØTÈFÂ6/Êq\-T¢S(󽀑8D¦1Ì긊æ»Nÿ\ !Ɂ ŽRõäí…é%MgQ,àþ›ÄºÛö"D’}G;JÉæ4à¹Ä ÈñÄm–¤…]NôDçy”Åóµ]07=}Z( +‚Î,`™æy|3_7'y¼§øb}R‡ ŽGâDã×7ùøâNO¾¹Æ®™ET²&¥‡¼ÞÁD!²™ =ëhÖդÝb€Õó"*w·ÝÏaà+…ž_ÃÊo\þ…”d¡ûDÇâ8ùWºJ=V³o^u÷ÎÀÄò’P"†ë¹ç]Q,ÏÏÎîïïÑ$G«$^f(.ΖËùY'lZZp¢Íðô¶Jً4ӕKÃâ"2“jÔbøÿ R4G +endstream +endobj +1473 0 obj << +/Type /Page +/Contents 1474 0 R +/Resources 1472 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1420 0 R +/Annots [ 1413 0 R 1414 0 R 1425 0 R 1426 0 R 1427 0 R 1428 0 R 1429 0 R 1430 0 R 1431 0 R 1432 0 R 1433 0 R 1434 0 R 1435 0 R 1436 0 R 1437 0 R 1438 0 R 1439 0 R 1440 0 R 1441 0 R 1442 0 R 1443 0 R 1444 0 R 1445 0 R 1446 0 R 1447 0 R 1448 0 R 1449 0 R 1450 0 R 1451 0 R 1452 0 R 1453 0 R 1454 0 R 1455 0 R 1456 0 R 1457 0 R 1458 0 R 1459 0 R 1460 0 R 1461 0 R 1462 0 R 1463 0 R 1464 0 R 1465 0 R 1466 0 R 1467 0 R 1468 0 R 1471 0 R ] +>> endobj +1413 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 720.047 381.003 730.926] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator) >> +>> endobj +1414 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 709.994 513.996 718.971] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.9) >> +>> endobj +1425 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 686.174 273.666 697.053] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +1426 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 688.196 513.996 697.053] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.10) >> +>> endobj +1427 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 664.256 309.083 675.135] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +1428 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 666.159 513.996 675.135] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.11) >> +>> endobj +1429 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 642.338 375.473 653.217] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator) >> +>> endobj +1430 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 632.286 513.996 641.262] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.12) >> +>> endobj +1431 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 608.465 378.599 619.344] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraints__Reduction) >> +>> endobj +1432 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 598.413 513.996 607.389] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.13) >> +>> endobj +1433 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 574.592 312.655 585.471] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >> +>> endobj +1434 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 564.54 513.996 573.516] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.14) >> +>> endobj +1435 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 540.719 353.066 551.598] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Domain__Product) >> +>> endobj +1436 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 530.667 513.996 539.643] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.15) >> +>> endobj +1437 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 506.846 317.004 517.725] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1From__Covering__Box) >> +>> endobj +1438 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 508.749 513.996 517.725] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.16) >> +>> endobj +1439 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 484.928 271.993 495.808] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +1440 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 486.831 513.996 495.808] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.17) >> +>> endobj +1441 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 463.011 307.409 473.89] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +1442 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 464.913 513.996 473.89] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.18) >> +>> endobj +1443 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 441.093 373.8 451.972] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator) >> +>> endobj +1444 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 431.041 513.996 440.017] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.19) >> +>> endobj +1445 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 407.22 286.936 418.099] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +1446 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 397.168 513.996 406.144] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.20) >> +>> endobj +1447 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 373.347 248.212 384.226] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +1448 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 375.369 513.996 384.226] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.21) >> +>> endobj +1449 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 351.429 298.005 362.308] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate) >> +>> endobj +1450 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [476.079 351.429 498.554 362.308] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +1451 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 341.377 513.996 350.353] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.22) >> +>> endobj +1452 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 317.556 344.301 328.435] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Grid__Certificate_1_1Compare) >> +>> endobj +1453 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [443.185 317.556 465.66 328.435] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +1454 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 307.504 513.996 316.48] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.23) >> +>> endobj +1455 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 283.683 297.457 294.562] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +1456 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 285.586 513.996 294.562] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.24) >> +>> endobj +1457 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 261.765 332.874 272.644] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +1458 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 263.668 513.996 272.644] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.25) >> +>> endobj +1459 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 239.847 399.264 250.727] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator) >> +>> endobj +1460 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 229.795 513.996 238.771] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.26) >> +>> endobj +1461 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 205.974 295.235 216.854] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate) >> +>> endobj +1462 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 195.922 513.996 204.898] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.27) >> +>> endobj +1463 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 172.102 341.531 182.981] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1H79__Certificate_1_1Compare) >> +>> endobj +1464 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 162.049 513.996 171.025] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.28) >> +>> endobj +1465 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 138.229 349.311 149.108] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >> +>> endobj +1466 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 128.176 513.996 137.152] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.29) >> +>> endobj +1467 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 104.356 304.566 115.235] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >> +>> endobj +1468 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 106.258 513.996 115.235] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.30) >> +>> endobj +1471 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1475 0 obj << +/D [1473 0 R /XYZ 90 757.935 null] +>> endobj +1472 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1535 0 obj << +/Length 1670 +/Filter /FlateDecode +>> +stream +xÚÍYßs›8~Ï_Á[ñô¬è ”¹éÌ5ioÚKR_⻗´ãÁ¶bsÅà\'ÿý­dc›Ø¸zî ±‹öÛýV»€‰ƒßÏÞöÏÎßÌH4púŽÀò)qúcçÁ.õ±{“‰Ôã«l´˜É´ŒÊ8K;]†áQ7À/ýgïúgÿžЍRéò9âÌwF³³‡/؃ü£ƒ¡³¬V͏2¸&ÎýٟgØìk÷ªôå£ø®iç{ˆpæpÊ|½ý^‡`7ÊgѠסØ͒ç©çÑà:æQþ|qñ¡\Nåè«Z'Çʆó÷„ÔÕrŠ(W[¬þª—l½Q&슚ºÁíb6”yƒVÎãâRÏ.èw¸çþ¢áï5mR /àvõ½ðM呗!lÀ†¾UB9ÞzþKœ. …!sº” Ax{ÜB,©eß*ÜŸòN¡ð‚Gà·«C Âü5dÇaåS0ºÆŠü VaK¬®ãTFùàÝÓ<ïÐ•E¡8X·óP9ÿ3öño:’ê=–›Ú¥vû;Û|è +Îñ÷ˆ´ìæCoЫö– 9Û±ÉóV6Áð&~‚À€¡ï~HK9‘ygµDÛ[YUɌÖIÍfq:ÑÂùæ«â!áyN—Àž}“<öÃxˆÄšô”‹EÀííåÆTeÆ¡H³Ò ä\åqò¬£$+*$Õôx–„OZ6ß|M›€!. ùÏ—Ûlp'NjQiâ;!† yٛ (Âb•!®¤W/dîmPÇ|$kN{Õ*ô§qºY`G…šø«’^<–FZN¥pW“´fÀCCðp3Dg²œfÆ}껙!z¥©:­c­kTZz)­znœÍ¢¸•S)a ôè(·Ä:Ê»ŸFe4ÉÒ(ÜO£¹l<ñ8œV¢ý±üÒ´óꆮŠY·ÌnUßÕ~[ Ê}Dìh@) ÀǦ ³ Œ£$yÖԁú¤ §¬‡'þQ²É!ÁCfp× Õǐõx[.Q,6¹¤â…îÜÚ¢n-_ºš) „9ßdJe°ÉiÛ<È i– +¥LßDậŠ€E+Š;—QvŠhqœ–…,ÍõÈRæ hr&ÆJ¸×™Ûª¦éÝ7±ÎC¡hɘº²•ë×Õ7 +¡ÀÚ$»jM ‚(-ã®Í}U·•ÖŸö\êõ®í¡¥q©g¹v>„*Ús™OéCàãe–'“¨l¨æ÷køñÀÄzbÛ/˜Êr)eª§#-Û>¸«©t¬'£kí +À«<Œ×V o8Q ´ÂíwùÁm"S™G¥=~‚-<1l‡Ëƾ­†Q!m¡XÕ.;…ƾ¢1jÃ9?`Yˆ¿·bäGY¿7G’#úŠŠÐ_eÑ«&%±uæ;TUԔ­ƒ•Ðí$ ’­$ {ôEùª›Èñ7-g&‹<ì ¸© [U€[1ëïDîäèy”ÈÁ‡t¾(t9PˆíÄêþØ#>ƒâÁ£?½»½ŸEÅtÇ":yÄ£µõè ý +A×º²­©]÷+Pü­pôpC¿B=bº ˜nêWX€¼08¶_ÑHýP« |z¢V¥?]#³Œ†‰|)Hÿ*¤±5þíX±eøªzE©ª©nÕSFÁrö³£ù¬“ÇûÌ5œÇ3™®¿5­*mkµÎT£ÕÁYÌ£Q«þ)ôä¶^\\f3è<ª`ß1kÃßÆ)<&`bX#ÇñªU-ËÏÓTˆÂ ˜(³²j"A–åc™«/UÎoz÷ÕæZ%<Ýc°ù§!G¼bp/_ÎàÆ ¢_\¬*w-f¾Ò²8˧vF Àæ`7 ‚QÌ ¨ÊƒÊ@õûÎ)mùêïÁxßµw*M* ¿R’@Äh¹|ýZ«¸ŽÒÉ"š…êfþ¨Â¾RæãZvVºÔ…ùˆai3Êr3ŠgóDÖ~Ç4²¬§Šå(s»YŸw}Òe—¥L-Øú +  ·ÿ÷a-÷T?qÀÞ ÎBóûɇsÐ÷¶ì=•g_u|ß5†ÜDéÂ~Q¡öM©‚ºj…€QBHLpIKnmÙWǎþPaã×öKB^¯ö¦e9¿8?_.—hT EÏs—çóyr¾|Vˆ=¾Ròhsálí䄳ÊÃ;øÿͻմ +endstream +endobj +1534 0 obj << +/Type /Page +/Contents 1535 0 R +/Resources 1533 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1420 0 R +/Annots [ 1469 0 R 1470 0 R 1495 0 R 1496 0 R 1497 0 R 1498 0 R 1499 0 R 1500 0 R 1501 0 R 1502 0 R 1503 0 R 1504 0 R 1505 0 R 1506 0 R 1507 0 R 1508 0 R 1509 0 R 1510 0 R 1511 0 R 1512 0 R 1513 0 R 1514 0 R 1515 0 R 1516 0 R 1517 0 R 1518 0 R 1519 0 R 1520 0 R 1521 0 R 1522 0 R 1523 0 R 1524 0 R 1525 0 R 1526 0 R 1527 0 R 1528 0 R 1529 0 R 1530 0 R 1532 0 R ] +>> endobj +1469 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 720.047 412.755 730.926] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked_3_01Checked__Number_3_01T_00_01P_01_4_01_4) >> +>> endobj +1470 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 721.95 513.996 730.926] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.31) >> +>> endobj +1495 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 698.129 354.169 709.008] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +1496 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 700.151 513.996 709.008] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.32) >> +>> endobj +1497 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 676.211 308.366 687.09] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +1498 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 678.233 513.996 687.09] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.33) >> +>> endobj +1499 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 654.293 288.421 665.172] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >> +>> endobj +1500 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 644.241 513.996 653.217] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.34) >> +>> endobj +1501 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 620.42 303.176 631.299] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +1502 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 622.323 513.996 631.299] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.35) >> +>> endobj +1503 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 598.503 344.446 609.382] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1No__Reduction) >> +>> endobj +1504 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 588.45 513.996 597.426] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.36) >> +>> endobj +1505 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 564.63 329.582 575.509] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +1506 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 566.532 513.996 575.509] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.37) >> +>> endobj +1507 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 542.712 416.73 553.591] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +1508 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 532.659 513.996 541.636] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.38) >> +>> endobj +1509 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 508.839 338.912 519.718] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +1510 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 498.786 513.996 507.763] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.39) >> +>> endobj +1511 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 474.966 310 485.845] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +1512 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 464.913 513.996 473.89] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.40) >> +>> endobj +1513 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 441.093 310 451.972] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >> +>> endobj +1514 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 431.041 513.996 440.017] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.41) >> +>> endobj +1515 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 407.22 276.615 418.099] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +1516 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 409.123 513.996 418.099] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.42) >> +>> endobj +1517 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 385.302 295.063 396.181] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >> +>> endobj +1518 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 375.369 513.996 384.226] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.43) >> +>> endobj +1519 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 351.429 289.158 362.308] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >> +>> endobj +1520 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 353.451 513.996 362.308] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.44) >> +>> endobj +1521 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 329.511 354.206 340.39] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Smash__Reduction) >> +>> endobj +1522 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 319.578 513.996 328.435] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.45) >> +>> endobj +1523 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 295.638 273.945 306.517] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Throwable) >> +>> endobj +1524 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 297.541 513.996 306.517] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.46) >> +>> endobj +1525 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 273.72 263.893 284.6] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +1526 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 275.623 513.996 284.6] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.47) >> +>> endobj +1527 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 251.803 310.189 262.682] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Variable_1_1Compare) >> +>> endobj +1528 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 241.75 513.996 250.727] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.48) >> +>> endobj +1529 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 217.93 286.03 228.809] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +1530 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 219.833 513.996 228.809] +/Subtype /Link +/A << /S /GoTo /D (subsection.11.49) >> +>> endobj +1532 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1536 0 obj << +/D [1534 0 R /XYZ 90 757.935 null] +>> endobj +110 0 obj << +/D [1534 0 R /XYZ 90 203.235 null] +>> endobj +1537 0 obj << +/D [1534 0 R /XYZ 90 171.172 null] +>> endobj +114 0 obj << +/D [1534 0 R /XYZ 90 171.172 null] +>> endobj +1533 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1574 0 obj << +/Length 1111 +/Filter /FlateDecode +>> +stream +xÚ՘[Sã6Çßó)üV{–(ºX¾0ÎfÙa—n)¤}pDp×·•„|ûêf“P +lC2Ù'K²|tôÓ9K‚Îԁ·ÁÑx0: ˆƒ8À3¾ubè„#gϊ.ž°b@¢è%£þÚÐw<;'œŒ ÐgÝñu¸ ”®ø»£ý™µ™‡©;Wýxò»x?&2!ýp÷aH@ƒ ~Lª’{.¯ŠŒãï"±5Už¥Ê…å–I ŸçóÀ)ĒgH6š‰%HròAìûÆįfЅГ®k9Ýp[ÙB9+¸éJ»¬¥0êbVÔ9/xÙfåÔ´0ó˜fs^šb­¦²ô(uÁ ž>ZQ)«>Vƒmw=Çw¢RA¾PkÊnrþ=H;?WþÙt«›¿yÚZ\íý½ŸŸ™BÊÊî•ð|êV €Ú¶$œˆªHŽ+ÕÅH‚KŸU÷ÿY‹Á–©5°Á¤×ua\p“£iΓӲžµ›ÆÍ6 l7uþòBòmöic§?ɤ¤4YeS£º}”=s™Q25µÚ$¢-ŠËÆQ²†Hþ<ª¢fbcVGY)­[‰žÜ"óI–²Ö2šðkqÙër¯­Z–[°ú³‰NaÛb‘Ï­·[L¾Mï,+9ÉûûZðFËÛ_®íš2÷0tï-]=ÈÞæáqUÊ@eYÙ&—˦åÅáhŒ±µDLõXÚ9^óã09<Ô®'™<\2%!›2²é¢ìiGzYª”€Ï»MÛ˝ÁÜF¢}›±VãžLEcðØûkÃÈTÔùÿ'µòöàÿ+gÝ®ûRhÎgÔ]|…€7$2ˆ.ywB03ûêt¥Oêꚮø‹¢Ø_yÞµm}8- 6`VfµY;ªë|ôïÛì+rYÂÞHóST‚wcÙXèÑúzHþÿæ +endstream +endobj +1573 0 obj << +/Type /Page +/Contents 1574 0 R +/Resources 1572 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1420 0 R +/Annots [ 1531 0 R 1553 0 R 1554 0 R 1555 0 R 1556 0 R 1557 0 R 1558 0 R 1559 0 R 1560 0 R 1561 0 R 1562 0 R 1563 0 R 1564 0 R 1565 0 R 1566 0 R 1567 0 R 1568 0 R 1569 0 R 1571 0 R ] +>> endobj +1531 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 697.247 325.112 708.151] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >> +>> endobj +1553 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 684.296 427.762 695.2] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked_3_01Checked__Number_3_01T_00_01P_01_4_01_4) >> +>> endobj +1554 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 671.344 371.747 682.248] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +1555 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 658.393 377.356 669.297] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +1556 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 619.539 291.652 630.443] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Throwable) >> +>> endobj +1557 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 580.684 336.554 591.588] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1From__Covering__Box) >> +>> endobj +1558 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 541.83 309.565 552.734] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >> +>> endobj +1559 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 502.976 282.038 513.88] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +1560 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 464.122 326.869 475.025] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Variable_1_1Compare) >> +>> endobj +1561 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 425.267 324.1 436.171] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +1562 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 386.413 324.677 397.317] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +1563 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 347.559 385 358.463] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator) >> +>> endobj +1564 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 308.704 290.357 319.608] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +1565 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 269.85 327.447 280.754] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +1566 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 230.996 322.994 241.9] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +1567 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 192.141 383.317 203.045] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator) >> +>> endobj +1568 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 153.287 288.673 164.191] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +1569 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 114.433 331.303 125.337] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +1571 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1575 0 obj << +/D [1573 0 R /XYZ 90 757.935 null] +>> endobj +1576 0 obj << +/D [1573 0 R /XYZ 90 716.221 null] +>> endobj +1572 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F11 418 0 R /F72 471 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1598 0 obj << +/Length 1000 +/Filter /FlateDecode +>> +stream +xÚݘïsÛ&Çßû¯àݬk ýðív·ä–4mÓóï͒žËØÑMFÂqóß„P,;×u±³:}%úòዞ˜Î;'£Nÿ,ôA“„`4 Qˆ!%Œ¦à¦›@ìõ0B¨{úæ×#u?21_±9·¥ ¡¸œ±Ôãȏº!ñ>Þw~uþî`ýpÕ+`äS.:7Ÿ˜êú÷A?‰Áºjµñõ5םß;¨Vˆ6•R´¡£~ "âCR+÷–Z}Þ½nzT‹OsV–õ#HÎkeWU3¡‡i—É‹üáŽO%Ì&’ɇÁà´s¹â"åãë‡RñÅ`¢TãLž©B¶>º}íŸEÄZyå„À0  ‡Sß +ÿUXœ¦¿Jˆé³ª)<Œº÷¼.1{)+uƒ™½¦Æþ‹œȞӣAÆäÿâ¸70;è<œÉmFÂÑ28—Ùt|΅5Ní§áxÊsý½úÎXÉ|¸q˜.—¯ Ô.¼ð³I- >Ò0kÓxk‹Kf±,¸rPêÇw–E&Ôóáäe‰¼»úùãS.Uv‹I™âûrÝñæÿåÖr:ŽÖ^JÝÃÖ'«ª™Ã§\Vž½_gS.21¯I/7M‰ñËýK%W©:0c9Ú@‡ +ªP,o<¨iO¹|d%vi¶ðïŠ~%2g›×þÖÔÊ^¹/wØ~S6_‰#M•‰1ã+ž3•éaì «ù]Vˆ\§Ǘ«5碰—µ$/  C&¦­6O„í—tâ!šª=Xn‡ž +Ýb®Äµq³ú=‚º_¶¸¡Ç°//†ã¡,&ù)v;¿¹Ì¾ðéãÞ׀±þ©aÝ"Šì®Dßa[7´ö3Íæu´hVöÒ>4;SÀÊߊëyQ:7u•WÏ£%óéÓ °…ªoxÊ˒É,ø¡¨í¬ç³2¸£guDyïÝ"7ÝôÏ0ÞÍ µPëa®;¼ aùq}ÌLHwòf뢛ÌúäÙΨ-üQrù“Gi·ÎV.™X¹ôÙÄà{Ó—e“"h¦Ñeèõ| ðš»bGöpw̱8ÝЋãúˆ¸™¼Sj9è÷×ë5LK¸ÙRÂLõ—˼߶5j¬§2j:iÙ¢ÜÁו‹*£ÝáÿÁœßø +endstream +endobj +1597 0 obj << +/Type /Page +/Contents 1598 0 R +/Resources 1596 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1420 0 R +/Annots [ 1570 0 R 1577 0 R 1578 0 R 1579 0 R 1580 0 R 1581 0 R 1582 0 R 1583 0 R 1584 0 R 1585 0 R 1586 0 R 1587 0 R 1588 0 R 1589 0 R 1590 0 R 1591 0 R 1592 0 R 1593 0 R 1595 0 R ] +>> endobj +1570 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 719.912 391.626 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator) >> +>> endobj +1577 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 681.239 296.982 692.143] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +1578 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 642.566 346.237 653.47] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +1579 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 603.893 406.559 614.797] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator) >> +>> endobj +1580 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 565.22 311.916 576.124] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +1581 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 526.546 331.861 537.45] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate) >> +>> endobj +1582 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 487.873 376.692 498.777] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1BHRZ03__Certificate_1_1Compare) >> +>> endobj +1583 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 449.2 312.483 460.104] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate) >> +>> endobj +1584 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 410.527 357.315 421.431] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1H79__Certificate_1_1Compare) >> +>> endobj +1585 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 371.854 327.437 382.758] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >> +>> endobj +1586 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 333.181 294.78 344.085] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +1587 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 294.508 305.301 305.411] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >> +>> endobj +1588 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 255.834 313.589 266.738] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate) >> +>> endobj +1589 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.544 241.304 273.474 251.209] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +1590 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 217.161 306.407 228.065] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +1591 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 178.488 320.793 189.392] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +1592 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 139.815 267.104 150.719] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +1593 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 101.142 360.28 112.046] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >> +>> endobj +1595 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1599 0 obj << +/D [1597 0 R /XYZ 90 757.935 null] +>> endobj +1596 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F11 418 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1617 0 obj << +/Length 1277 +/Filter /FlateDecode +>> +stream +xÚÕX[s£6~÷¯`¦5³µ,!Ä%ÓéLv³»“47ön’6²M ˆ×ÿ¾’¨MˆãܚìBH‡s¾ïÜ$hÌ h|î¼uúŸløÀw,ÇÍ ®ƒ±1 +«®ÙCÂî‡wï̞E`÷4HçË`NåÛqZÒ|LÅ«çb·ë`óÛè¤óqÔùÞAü/Ð@•Tâcšt®¾A#äó'Ø÷ŒUµ*1l ógl ;t Òð®g¥9š#è{†‹ @Ȗê_[©ÔÑûŒ«áÆLã (Ô¡`>Wš^VK„a‘n'ÁxÀâõ‚†y0>&y¯Þ³Äîþ'„6U €ÈႪŸÿ*—4´–­¾¶Iñô<½æ·-õ›Ïþ'×2<¾Õ±ÅÖrlàB‹làÛ +„CÉTÊJ5 SZAÅk91YAÃ_äKT°Ë#Êy åÌbÑ<79·tZròc* ÷(¶evϲ€cs½, |ôÂ܍‡‹ £mÐz6 îþZdx\ÂcÙñ pI;;¶LCxÍLäugT¢žNU°•]Oÿ…Ñ¿à.2gißI‚…p<ûµH°  <§ÁA*ñe\yÁneÀóAþ²ˆ“ XŒ/i¸œ–K[ZÜëöØ×+ŽJGV‹8Œ€g¡G¢1ÀØކ´ˆ +‰Õ0ËM›t™ ã& +©š-*ddh›«©„– ¦"hÆòÆ Ó@JûT¨±$ˆÒ7Kî–eÎ5,‹Ýc«*¯obbDð+P,Áªà¬{~²_˜ís¶“däû¼3Û;qîAñ#Fü…·Zÿ?ÃG‘îC~¸HVË(ˆãµ¤™†Ü +iAKD<ì>†m5¸l‘jc`ÛÎ#i÷¸Ëx¨I»¢&Ó¶5¨Õ=MÖä‹Í¹+&ÁDGoåś¥òˆò3O¥AÙÚdú8ïMÜ`Ø&âøl3ý*´·húS›© äc08½²> endobj +1594 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 706.961 302.527 717.865] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +1600 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 668.107 318.577 679.01] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +1601 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 629.252 345.685 640.156] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +1602 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 590.398 371.159 601.302] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Smash__Reduction) >> +>> endobj +1603 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 551.544 389.978 562.448] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraints__Reduction) >> +>> endobj +1604 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 512.689 356.763 523.593] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1No__Reduction) >> +>> endobj +1605 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 473.835 419.706 484.739] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +1606 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 434.981 329.645 445.885] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >> +>> endobj +1607 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 396.126 312.788 407.03] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >> +>> endobj +1608 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 357.272 353.764 368.176] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +1609 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 318.418 303.478 329.322] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +1610 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.107 237.655 327.956 248.559] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_1_1IO__Operators) >> +>> endobj +1611 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.107 198.801 173.725 209.705] +/Subtype /Link +/A << /S /GoTo /D (namespacestd) >> +>> endobj +1612 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.731 119.015 251.782 128.942] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_ge19dfe022c51c874d905e2a7c81c18f1) >> +>> endobj +1614 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1618 0 obj << +/D [1616 0 R /XYZ 90 757.935 null] +>> endobj +1619 0 obj << +/D [1616 0 R /XYZ 90 254.726 null] +>> endobj +1620 0 obj << +/D [1616 0 R /XYZ 90 137.012 null] +>> endobj +1615 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F11 418 0 R /F72 471 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1662 0 obj << +/Length 1365 +/Filter /FlateDecode +>> +stream +xÚÝY[s¢H~÷WP³ 5+6—æ’·DIÊ£FÑ­ÙdŠ"Ú*5.`R™©ýï{Úo!AÔìÃ>Ñ\üÎ9ß9ýõéqSq7•+»R»ÖÎMMÖ8{™ˆÓ5IIJÄÙcîž7EI¨J!¾þù³P•1â[n0]ºSÂîšAB¢‰;¢·†®è¼¦ +ßí/Ë®ü]‘À +â¤*ÖE]ÁÜȯÜGÜžᐨ˜÷¼úÊçTYëœëWî*(õm{ŠÑ–§ÒDU18]VD¤aæîƒ,ã•ùìwÜ}ƒó¿ÉBr@җԩhšz×[}Fƒév[ÎÐêõ›¶sÛlwzûXô# í<Í®µk]æ pOS©{²,jªÌU%U4$ƒygÏRÒ|/#6 –þ#IÇá„]“ì;ð‡ žà ñ±b®õ;$U37€$ÝPÏNRÏ6é '¹4MæM‘õD óO ýÿÀؕe ¦Â_æ1vba™&ÿH—Ö,ÁxÅ\“ì3Æ vXªªX(/fï²ëOøFÅ|Èî&áT2xþÈsçìK؜¸1Iìãԟ0xhÌ2LæáÂ'AÂƁ»¨R:€ÐÑÄiqij0‰OÈèم"/‘Ÿ>˟ŽÍç%«á8‰¼`ÊÆ£0H\/XßQñ{R_UL\UýLëÜt•Y1™Ä;ûÚˤ—2‹ ¦HÂàҀ¼ŸÄI +¨¥ÕàF¾ëtÃùˌŒ#×iy‘½\\Œ=(¡Cq ª ˜æTQ–9 ȘÝy°¢ *â§ÑʓyÊ7µ·M2éfÕ¾`—JwœxÁD®=Ž?N†Î˱Oü0zqÎ),›Ì2stuÌ®/ ù¯8§rPïX××ÍzÓjێý­kzÀ2Nŕj♠+ݝ{n¼Ç/ˆµ7OY \ÿµÀlrNö$gD]¯àh\^yÒFӂ‹DnBgÊ¡Ò£˜ïçˆæ iè‘x9Oòôý×[¨†¨j&pû´€Þ51¬;ÐeÞ^¶ö¬ð¼í·" NK0eó2˜f.æf –` ÖXD[†nÊ)$|èXwã¡24;m«Œ£’¤R|À]~ñk~­óòÛ*˜Œ«cØ/ úN³}Ýl7íoejOÁZqúnò¹ê4tb×­Ž `þÏvUC- ªÛ:.¦bìüpº¾stH¨¤ðPôËv‰¨t].Šª>´¾Ýsí¯GçŠN®µFsèüeõhÑ9ïDœ;—½~"Q Ôÿ2 °TóàÛN£ èù…ù¦¥AëSÐ\•‚ƒ4‹²tŒïªª!÷ïz‚†x› +W)dõ¨DÀlk3±h¯¤òUTL¤%]Û>œEÆËáú§4߷ݼFíŸCvàÐ)Kº²Û1wúÝ8öçYó»LF¡OâÝVØMaê䌌ñ?è.<Û渑—Ì|’x£¬cöËdÕæ~ÜÞäý¾W“ +Ê·.ƒ1윆íÃÓÿ:{5Ùí†ÓH‹åàºÈzëíÉp˜©A·Œ2)K· ñh¡*ñMxreh½ª@€:ØÒ¡«ÞÆ6L7•iŒÕ°Åå¿$¯Á€z?ðD>;×DS‡ û¯›"ÎN€ÖǶë˜ÒÛ,†ôï»Ä$ú]À˜O§Õ­,³³€„Ñ…"Ñæð—¬Á+Iª +L´>É(Xd?¸lô•n;ñ–¿’¡‹ +’áÕÊßY’,.jµççgq‹ËÀ[D¢—Ô‹yíõt dB_ƒ¬·Ñ~­ ࡟3Łÿ\ïhL +endstream +endobj +1661 0 obj << +/Type /Page +/Contents 1662 0 R +/Resources 1660 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1676 0 R +/Annots [ 1613 0 R 1622 0 R 1623 0 R 1624 0 R 1625 0 R 1626 0 R 1627 0 R 1628 0 R 1629 0 R 1630 0 R 1631 0 R 1667 0 R 1632 0 R 1633 0 R 1634 0 R 1635 0 R 1668 0 R 1636 0 R 1637 0 R 1638 0 R 1669 0 R 1639 0 R 1640 0 R 1670 0 R 1641 0 R 1642 0 R 1643 0 R 1671 0 R 1644 0 R 1645 0 R 1646 0 R 1647 0 R 1672 0 R 1648 0 R 1649 0 R 1650 0 R 1651 0 R 1673 0 R 1652 0 R 1674 0 R 1653 0 R 1654 0 R 1655 0 R 1656 0 R 1657 0 R 1658 0 R 1675 0 R 1659 0 R ] +>> endobj +1613 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.731 720.889 251.225 730.816] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g8458e58a5e857de11c35ce3076a70ab8) >> +>> endobj +1622 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.731 682.286 264.505 692.213] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gbadfeba0a415d210cdd6d7309365e800) >> +>> endobj +1623 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.731 643.683 243.105 653.611] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g7a529f51bfebdd4b3e69c866dced9bc1) >> +>> endobj +1624 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.731 594.121 213.038 604.049] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g79bd3696a302bb721ef8168fa5d650fb) >> +>> endobj +1625 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.012 512.747 348.737 523.651] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +1626 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.012 474.145 360.902 485.048] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +1627 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [264.455 435.542 421.554 446.446] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +1628 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 355.144 277.077 366.048] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_ga88e9b9cb2588cbf5914695fc14e69a8) >> +>> endobj +1629 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 339.33 288.972 350.233] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a896b8890edb38e9960c455aa178e508ba) >> +>> endobj +1630 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [292.743 339.33 429.25 350.233] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8b30277f972f730fe26f6cfc39098cc77) >> +>> endobj +1631 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.021 339.33 513.996 350.233] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8e704947d33ff1b60a2475950d5f18ec3) >> +>> endobj +1667 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 327.374 176.774 338.278] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8e704947d33ff1b60a2475950d5f18ec3) >> +>> endobj +1632 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.763 327.374 318.292 338.278] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a89f5dce9506b72773425c0504845d8e4e) >> +>> endobj +1633 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 311.56 252.44 322.464] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8d5e386c6a05c9656eac42fe9e2cdd8b5) >> +>> endobj +1634 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.018 311.56 411.442 322.464] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8c77955fc77a169347da8820b46c3247b) >> +>> endobj +1635 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.021 311.56 513.996 322.464] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a86c817c11198882f3864d8ace4ec326dd) >> +>> endobj +1668 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 299.605 176.774 310.509] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a86c817c11198882f3864d8ace4ec326dd) >> +>> endobj +1636 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.763 299.605 324.379 310.509] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a80d808c2d0d6514c33e06445d7aa34270) >> +>> endobj +1637 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 283.79 326.043 294.694] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8bd640c30f757e4ecccd08ac527536ca6) >> +>> endobj +1638 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [359.975 283.79 513.996 294.694] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8a7ce2ad16ee907ff9d31eeb1cda41834) >> +>> endobj +1669 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 271.835 170.398 282.739] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8a7ce2ad16ee907ff9d31eeb1cda41834) >> +>> endobj +1639 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.718 271.835 380.11 282.739] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8979f37a289d4cb316643f1dcc07ec7cd) >> +>> endobj +1640 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [385.429 271.835 513.996 282.739] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a805e540f453fd070a4e4c0fdd887f4b7a) >> +>> endobj +1670 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 260.597 193.651 270.784] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a805e540f453fd070a4e4c0fdd887f4b7a) >> +>> endobj +1641 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 244.065 267.035 254.969] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a89606fc251d767040929d3e2645dbb446) >> +>> endobj +1642 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [275.224 244.065 470.211 254.969] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8e0c660bfcbcd3d10c3e764e22f41d0a1) >> +>> endobj +1643 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [478.4 244.065 513.996 254.969] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8057025d0ff550a2226a0a1273c84b4f6) >> +>> endobj +1671 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 232.11 257.172 243.014] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8057025d0ff550a2226a0a1273c84b4f6) >> +>> endobj +1644 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [260.161 232.11 449.051 243.014] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8a1bf7bec2cb0d949e45c3cd0e25874a6) >> +>> endobj +1645 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 216.296 298.925 227.2] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a85912e00d1de38a643d48af1f0e5dd35f) >> +>> endobj +1646 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [303.901 216.296 473.424 227.2] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8fda2f32e2fc3f61357ce0d9d7813f5fc) >> +>> endobj +1647 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [478.4 216.296 513.996 227.2] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8930a62d56d7231cdb1ed57e1d3eff0f7) >> +>> endobj +1672 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 204.341 282.636 215.245] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8930a62d56d7231cdb1ed57e1d3eff0f7) >> +>> endobj +1648 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [285.625 204.341 472.314 215.245] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8bd1bad185f4622d07b171767dafc78b6) >> +>> endobj +1649 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 188.526 292.997 199.43] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8a0f28596ac7d4a43766fab174c28ccab) >> +>> endobj +1650 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [297.914 188.526 473.484 199.43] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8261922c7bb53bf71459671df868e55da) >> +>> endobj +1651 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [478.4 188.526 513.996 199.43] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a80905d51325862cb4db00635875efcff8) >> +>> endobj +1673 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 176.571 346.018 187.475] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a80905d51325862cb4db00635875efcff8) >> +>> endobj +1652 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [385.429 176.571 513.996 187.475] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8202263943c451b9fdfe003b2bc8d0b1f) >> +>> endobj +1674 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 165.333 250.846 175.52] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8202263943c451b9fdfe003b2bc8d0b1f) >> +>> endobj +1653 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 148.801 307.792 159.705] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8fdd3365de1a07c7f7bdd1dc330bba8f4) >> +>> endobj +1654 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.154 110.199 312.793 121.103] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +1655 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.796 110.199 511.506 121.103] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg25ea3a289eadef732f4c7fd823387fb2beee33de6f8542b0228161d044640eaa) >> +>> endobj +1656 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 98.244 279.717 109.147] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg25ea3a289eadef732f4c7fd823387fb2a57b0c1a34eced57ca8437eea92a4328) >> +>> endobj +1657 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [282.543 98.244 473.247 109.147] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg25ea3a289eadef732f4c7fd823387fb20f182c5824807f7bc66d2d2033810feb) >> +>> endobj +1658 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [478.4 98.244 513.996 109.147] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg25ea3a289eadef732f4c7fd823387fb2eafcc7ca16bda73dc6b0f7deaf9470dd) >> +>> endobj +1675 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 86.288 301.595 97.192] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg25ea3a289eadef732f4c7fd823387fb2eafcc7ca16bda73dc6b0f7deaf9470dd) >> +>> endobj +1659 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1663 0 obj << +/D [1661 0 R /XYZ 90 757.935 null] +>> endobj +1664 0 obj << +/D [1661 0 R /XYZ 90 661.674 null] +>> endobj +1665 0 obj << +/D [1661 0 R /XYZ 90 529.692 null] +>> endobj +1666 0 obj << +/D [1661 0 R /XYZ 90 373.992 null] +>> endobj +1660 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1739 0 obj << +/Length 1400 +/Filter /FlateDecode +>> +stream +xÚÅXYs›H~ׯ jÊшá&oŠ9º"áT²NŠB0–Èr(€âõºö¿o3’%d¶Rå'˜aèëûº›F¦‚,¼o¼s­KCldŠ!¸·‚- ¦‘®`Á …ÑFXjbY–Åó³3©©è²ØõÓ韶ê¤%Éoý€.-S5EC—¾»W Çmül`Ð" ¸’ª›ÈTu!H7ße!„ý+AFªm wÕ©DЮ±0n|jÈÜÂúµ²ØT ,64j1Vl$[‚©¨H6tfõ([¤a”N™‰a”K` Ê(K ¶w›åìÆÏ£r–2 +Ø:Ȓù¢ô«£¨òd—)­K]^‹\SQ¡)pU‘Í£÷MQô ÂMS‡X’t‘ð}ž|Êã4ªNh†&%¬ƒm‰ï ³ø~FÂÜ÷ºÑ$÷óû·o/}:%)Éý’xNL’–uETÌà Z®ûÏÎhìÔäŠovÉ´fØBcd눽 +œÞÐýZ·šbðߓq¯ã®!lª NC¶¦1u£4äg·|"i²8•0:É+{JÎ]R”l'(Ùa¡|-ä© {C6"qEMo|ŸL²ø©à=‚G‡xá#àé:ã±ç~h÷&ÀMSÕ,󩃑ç|¢\SpÚÝ£5Èϡ׋4Âû‘Ó–0Æ¢ëŒNs…Bq„' +Ÿ‰ÈAoúj¸»×‹Ó²rIZ–bEÅÜ×Ê0ՐñþxœCˆ«ûOTÞ{ç±_u= EÙW[wjiÒw6 +¥Á¼Y©º€ƒ,~ízv×;ô†]çKg«RîÝÐT{¿—ãN%–TK«éШx7uŠ½ x›÷–,¢c/7ãÓ/;¬dþX‰²É˜>Ÿ®¶ÂWcø)}WÈ_"È#¦i;ؐjŠ†TÍfbÜ% ƒ,çwí›tâY+›[¤]Ÿ/—ðß .ÿ¦ê’p¿žŸ¡U 0!¸Ü½1E´‹õ}Ȝ¹7°¶TñCnÌ¢Àé b²£´ãÓ!Ÿ­`ìcàWìl5âÓ§~FÔ=&„ž†G ÷¸’:´eψÌØ]¥Ó˜°¡_úŋ×Óò~N üˆpLU¶×ðSVøAf()íE,ÃÏ5¬cV½ºÿpãíá°ëÑš«×k_ Fl[~š +UÈõÿÇòOô³É’ÓÛv٠˪¼{õ|åû>ó;ý¥ùøYöGéiö¯ò°þÃʀR€­cÿWUÿ¥ÀbÙ&”Wö' *ˆ¾Ìa÷Ùt]üOI×EžU=?]PÓûo².¯ù‘GXF +<ˆ •š¦s’yö·°¼ûH ¾f/¶L¤Êʲ6ÏÊrþ¶Õº»»CAi4ÏQT¶æó¸µÝ^Ö¤@µ4WBVْNJó˜|[ñÿ½Ç;î +endstream +endobj +1738 0 obj << +/Type /Page +/Contents 1739 0 R +/Resources 1737 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1676 0 R +/Annots [ 1714 0 R 1715 0 R 1716 0 R 1717 0 R 1718 0 R 1719 0 R 1720 0 R 1721 0 R 1722 0 R 1723 0 R 1724 0 R 1725 0 R 1741 0 R 1726 0 R 1742 0 R 1727 0 R 1728 0 R 1729 0 R 1743 0 R 1730 0 R 1731 0 R 1732 0 R 1744 0 R 1733 0 R 1745 0 R 1734 0 R 1735 0 R 1736 0 R ] +>> endobj +1714 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [140.67 696.002 337.141 706.906] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g616fcdc7600a3a11a8a9152e75730899) >> +>> endobj +1715 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [349.176 696.002 511.506 706.906] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg616fcdc7600a3a11a8a9152e757308990edf84fcb94023ff4a7183bf3f8dace5) >> +>> endobj +1716 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 684.047 260.748 694.951] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg616fcdc7600a3a11a8a9152e75730899c7753e1dd51e1b7b3fdfafa9f8332370) >> +>> endobj +1717 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 645.192 321.36 656.096] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +1718 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 629.252 282.885 640.156] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312ae556cc08f48e769b9c15bea83d5d883a1) >> +>> endobj +1719 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [318.122 629.252 511.506 640.156] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312aed8db7109fb4bb50360b05800dd245416) >> +>> endobj +1720 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 617.297 260.241 628.201] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312ae3e4424ce8e7ebe86e125541b561fc300) >> +>> endobj +1721 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [263.229 617.297 478.192 628.201] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312ae079e4b80f17b0095497103a52cffa3ab) >> +>> endobj +1722 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 601.357 304.464 612.261] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312ae94cf20719046117aece5acba61dcae4d) >> +>> endobj +1723 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [307.453 601.357 478.839 612.261] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312ae8191bdbdcd041a9859ed465d16062ab1) >> +>> endobj +1724 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.926 562.503 358.474 573.406] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +1725 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.021 562.503 513.996 573.406] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg113f1e845cba6b1c3c5705d0e14f1cc171c9b0459dc8ba8cc0c8178b6cf4f017) >> +>> endobj +1741 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 550.547 285.356 561.451] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg113f1e845cba6b1c3c5705d0e14f1cc171c9b0459dc8ba8cc0c8178b6cf4f017) >> +>> endobj +1726 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [350.003 550.547 513.996 561.451] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg113f1e845cba6b1c3c5705d0e14f1cc1b39e3c667ce455313f8ff578722af2e9) >> +>> endobj +1742 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 538.592 180.102 549.496] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg113f1e845cba6b1c3c5705d0e14f1cc1b39e3c667ce455313f8ff578722af2e9) >> +>> endobj +1727 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.09 538.592 386.925 549.496] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg113f1e845cba6b1c3c5705d0e14f1cc140409716eac06f7ee5c44a200d3702f0) >> +>> endobj +1728 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.481 499.738 363.362 510.642] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gac82e7e0179442ef589f2fc61302d654) >> +>> endobj +1729 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.021 499.738 513.996 510.642] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_ggac82e7e0179442ef589f2fc61302d654324bf568397fdfc332a4c06e7a4facf5) >> +>> endobj +1743 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 487.783 222.143 498.687] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_ggac82e7e0179442ef589f2fc61302d654324bf568397fdfc332a4c06e7a4facf5) >> +>> endobj +1730 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [225.132 487.783 412.907 498.687] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_ggac82e7e0179442ef589f2fc61302d6540e1a601a53491f60c89282fde55b5352) >> +>> endobj +1731 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.818 448.928 366.69 459.832] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gdf9d6f17d8974c81e3499f170e7762a2) >> +>> endobj +1732 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.021 448.928 513.996 459.832] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_ggdf9d6f17d8974c81e3499f170e7762a253f4353b82f1a10a08b1e756bb7c84ad) >> +>> endobj +1744 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 436.973 286.532 447.877] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_ggdf9d6f17d8974c81e3499f170e7762a253f4353b82f1a10a08b1e756bb7c84ad) >> +>> endobj +1733 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [306.845 436.973 513.996 447.877] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_ggdf9d6f17d8974c81e3499f170e7762a2b2bc77b49f9450faf5b5f8ca5374421d) >> +>> endobj +1745 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 425.018 162.558 435.922] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_ggdf9d6f17d8974c81e3499f170e7762a2b2bc77b49f9450faf5b5f8ca5374421d) >> +>> endobj +1734 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.546 425.018 406.63 435.922] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_ggdf9d6f17d8974c81e3499f170e7762a278fc3e83d58f3eb97a8041b600870a05) >> +>> endobj +1735 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [219.892 344.256 469.663 355.16] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g00a906832c41c42a70a5c9d194e07a7d) >> +>> endobj +1736 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1740 0 obj << +/D [1738 0 R /XYZ 90 757.935 null] +>> endobj +1746 0 obj << +/D [1738 0 R /XYZ 90 363.229 null] +>> endobj +1747 0 obj << +/D [1738 0 R /XYZ 90 306.936 null] +>> endobj +1748 0 obj << +/D [1738 0 R /XYZ 90 218.655 null] +>> endobj +1621 0 obj << +/D [1738 0 R /XYZ 90 196.344 null] +>> endobj +1749 0 obj << +/D [1738 0 R /XYZ 90 196.344 null] +>> endobj +1677 0 obj << +/D [1738 0 R /XYZ 90 159.058 null] +>> endobj +1750 0 obj << +/D [1738 0 R /XYZ 90 144.487 null] +>> endobj +1678 0 obj << +/D [1738 0 R /XYZ 90 111.296 null] +>> endobj +1737 0 obj << +/Font << /F63 374 0 R /F72 471 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1778 0 obj << +/Length 2073 +/Filter /FlateDecode +>> +stream +xÚ½XÝsÛ¸×_ÁI*ÍE0I é>å%ãÔ_çè2s“Üh( +’Ø£H•¤âsþúîbŠ”hKm§}°¿ýÀ²lëãàçéàâƒàVÄ"á +kº´"Û +„Ã|×±¦ ëë0bÎhìض=¼úé§ÑØõíáMœ¯vñJÒè:¯e¹Œ††BŒ~Ÿ~L¦ƒ8ŶÅÕXÀ}+Ù ¾þn[  ²lÆ£ÐzR«6–çrh3ëóà—ý*B—3[ø Bæ2®Qþe!¿Ù¶›kt7³/“ÇÏ×÷w³ÇɗkìЌ‹(/>øv‹µm€ ×#ÎÓµæRʑ뿧UZäDÉw›¹,©_,©­×ûC©ó}äøCYâ6FÇu$ã¸Ëœ¨#ˆwR"¼±™c3÷Íi1Þцª.Ó|Eý¤Èë8͛ñiè‡Lod­%ò[';‚ áÂZµæ¶[ĸ™q¾ècŽ"B³fsŠÉBæE ð9HîûTD«ªHÒ¸– š¬ ¢·ãöݧûGšFTÇó×w÷o•&Æ>gŽ‚>ù‚P”²ÚʤN•£(ÝeÏ#áÙh,܀\‰ûb¸,ÊM\cßWŽƒ´Žm‘V}j‰|îžÆà&oØêôéÉó³#ÕÇ͋zMúo®ùfûv߃ÐÐ`({ÎôY4Æ61Ô¦¶Æží°ÀçZ{ÚõÛ@~žLGG¯õlþ"ÛeÃÍ9ó€m 1\cÅó‡,‹·=L=ÞîXÁ4ޖRSúN8{ùQåxb¿¢qLÝ`¢^£)ÌFÁ9šâ"Rœx®_ÔÔyILNj˜ç:§ä4ã>#‡n§ãXÁKÁöH\$íÅå6 ÷,Çp)Ú¥äશ¾”çX×q#0/ï˜0ä2…ÈSÒ W $¡ð˜„] ó¢á6°?¾Ùe<ˆþwt»óÀ Eøä—À#.þà ì.¤Ã_qðÈ ÏýWŸá€O°(à¡þ ÷#æû‡?Öx<Þn=4×[ÿà·Ëš_+YþuéZ#¿óylbdlý‘>ž) 3ØÃÏÒ$Ù–éý} ê¿=^' ·›šy]×Ûˋ‹§§'–Tl—§Û’¥õÅv›][¥ÅŁ¸aÒ<áÍۄfúg=Š# ÿ}œm³ +endstream +endobj +1777 0 obj << +/Type /Page +/Contents 1778 0 R +/Resources 1776 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1676 0 R +/Annots [ 1773 0 R 1774 0 R 1775 0 R ] +>> endobj +1773 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [131.844 334.133 188.471 345.037] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +1774 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.339 302.253 267.719 313.157] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +1775 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1779 0 obj << +/D [1777 0 R /XYZ 90 757.935 null] +>> endobj +1780 0 obj << +/D [1777 0 R /XYZ 90 733.028 null] +>> endobj +1679 0 obj << +/D [1777 0 R /XYZ 90 705.341 null] +>> endobj +1781 0 obj << +/D [1777 0 R /XYZ 90 690.771 null] +>> endobj +1782 0 obj << +/D [1777 0 R /XYZ 90 562.471 null] +>> endobj +1680 0 obj << +/D [1777 0 R /XYZ 90 537.28 null] +>> endobj +1783 0 obj << +/D [1777 0 R /XYZ 90 537.28 null] +>> endobj +1681 0 obj << +/D [1777 0 R /XYZ 90 501.897 null] +>> endobj +1784 0 obj << +/D [1777 0 R /XYZ 90 487.326 null] +>> endobj +1682 0 obj << +/D [1777 0 R /XYZ 90 452.078 null] +>> endobj +1785 0 obj << +/D [1777 0 R /XYZ 90 437.507 null] +>> endobj +1786 0 obj << +/D [1777 0 R /XYZ 90 240.858 null] +>> endobj +1683 0 obj << +/D [1777 0 R /XYZ 90 216.643 null] +>> endobj +1787 0 obj << +/D [1777 0 R /XYZ 90 216.643 null] +>> endobj +1684 0 obj << +/D [1777 0 R /XYZ 107.713 139.716 null] +>> endobj +1685 0 obj << +/D [1777 0 R /XYZ 107.713 123.775 null] +>> endobj +1686 0 obj << +/D [1777 0 R /XYZ 107.713 107.835 null] +>> endobj +1687 0 obj << +/D [1777 0 R /XYZ 107.713 91.895 null] +>> endobj +1776 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R /F95 1788 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1792 0 obj << +/Length 1588 +/Filter /FlateDecode +>> +stream +xÚ½X[sÚ8~çWømaÚ(òE¾ä­ $C咝ݶã1X!žúB})›þú=¶$c±!›Ù—`;¶Îw>}çӑ°´–°tÛù8ï\Þèªd!KWtiþ(YX2tE–æ®ôµk!¹w!cŒ»×ïÞõ.‚»wN¸Îœ5ewÃ0¥ñ£³ÊoMC5ººÑû>ÿÔÌ;?;2DÁ’\ŒJ d¨DZ¯ß±äÂóOFªeJÛâ­@Ò~}iÖùÒÁ!®"µH©,c¤`M2a0¸öxP„ß]Þ\ùHU¥êðŸâíùOb›,¥.»‹i’ù)»öþҞLºÿ8«í¨¡ºà.d‚,M€ºk%#S•Ï8ÏìbIбN(>‹²Ðcd›ì HûíÛúZìnÔSHw¾†ý–,„íRhÇB1x¼Â®íÑp¼˜ÙÃñÍp<œÿՄUÆ&RdU€q×=ÒuR/ççW~_¢ú†±z)G›…1Ý@4L¥OóZùN’4' â× níûŒð0˜ÞÜW6g«”`áæd¢üš=ˆ!-•©ÿoµÊ☺mÐq…ü’ûÉÝÉÔc¤é%õ“(ñþ/ÎYà:ç“ûÙYœ[2wÂá”oŽ&ñß¹æÁö¨÷TÜý0nB©éH3J;G¸B²`IãW‘È®Wž}ý0·gó©½nBeÂÒUªõ: +{ü¤^¸f ã(“þ#änÅ$i ¯5d1êsÜ>ئy¸û&|º—Dì³ õÜڒ«ñ7£f|¤: ¨ûC¿Ÿÿ6²D‘­Raî.~ºíɹ¬ê%âQ¾¶>9=-_6….¹o¶L.|ˆ:'° µ]„ü2w/boÄ†ÝÓ[ŽitßoœK‚peA홠þ;4bu +"7ó3N`ô(VÎÒI·eÆY¼CîF‹»“ÄgÁfi,#(Joã?—ˆ`:S“<À!ÂÙâcëìªÈÜUÆ,[¦1,Ò¯fÉ~âu¶(A¨ÃœD®¡"ͪXOޒì¨N84JqEÑ©äòut³/ÓܪçùÂވ:p£]«ÉÏ̉ÅÚ O/E{ÂêύŸ´‰™Ú«:p÷1[ Çç·*†Ú™ÿbßګː›q¸i©(ØÔõaf¯éqZKX`¬Ob5ës›™¨ÈЕ·Êú¬6ã„t¸ýtï§}ûú~4iôh_ s—WC݈?ïøØK"VÑ{;ã¢÷ÕLˆ«)H&F¹?FRø™‚PÙX“ÜXœ8pìIî!‘ÿüDÝرï¼eìÄÏWWÓ|sµb÷½˜E«ÅÏ@ºÂ÷µâmN¹Sp±(ä>õñÚôéS@SoUÝÃ8Å«û¤Ö“ÃȲ p‚tÍb1 4Š¯jŸ¾0/ŠŒò91& +]ØÛbÜ·û\ˆfb —íC‘p©«B¡.ãJ©‚'&8lù%H ËG: ¹”t»Ä¬zC±KfѨ0#ƒ('¦a¾˜Å»#yæbù±‹«3T ¤ªJÝ*w9o¡œwͦA½–g©OqhâR¿âwÔ­û„Ïë¼Z„z*5­žÄ„Q}xþüqül7¾ïüöü:žÁñIëÔØ +8è6YÖ֔f&B±ê…”ºÔ½bé­|6†¢T]ÑÚe FÃ$ g¹šF›¼(¡¢÷ɨž@x— +&¥éǼK=ß»útMõ> ò^v0NíghQöÚU—‰ƒÅl™-OŠ~ºw‘7²®ÅxK嬱lr‰zpn”…••.Nh-“÷|ÒEï÷æuû‰öí*¶žlœm3Só`4i>ÑÐ m•$@ƒhÒÛQW^NèÞé×þ°n"K6O=.N|¯½jò³ib!B´=À“œ®\¯üV–W3Õ²›EBã?ò>’Kq䄙ã³ëo˜`1keya”3ÿdnI3Jy’,³’¸úœ “TðÊ°§Wqé Oiº¹º¼Ün·h• É&F^z¹Ùø—‡³TüÅ()—ú ŠéÎ!ùÜøÿêuæ} +endstream +endobj +1791 0 obj << +/Type /Page +/Contents 1792 0 R +/Resources 1790 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1676 0 R +/Annots [ 1789 0 R ] +>> endobj +1789 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1793 0 obj << +/D [1791 0 R /XYZ 90 757.935 null] +>> endobj +1688 0 obj << +/D [1791 0 R /XYZ 107.713 723.065 null] +>> endobj +1689 0 obj << +/D [1791 0 R /XYZ 107.713 707.125 null] +>> endobj +1690 0 obj << +/D [1791 0 R /XYZ 107.713 691.185 null] +>> endobj +1691 0 obj << +/D [1791 0 R /XYZ 107.713 675.245 null] +>> endobj +1692 0 obj << +/D [1791 0 R /XYZ 107.713 659.304 null] +>> endobj +1693 0 obj << +/D [1791 0 R /XYZ 107.713 643.364 null] +>> endobj +1694 0 obj << +/D [1791 0 R /XYZ 107.713 627.424 null] +>> endobj +1695 0 obj << +/D [1791 0 R /XYZ 107.713 611.484 null] +>> endobj +1696 0 obj << +/D [1791 0 R /XYZ 107.713 595.544 null] +>> endobj +1697 0 obj << +/D [1791 0 R /XYZ 107.713 579.603 null] +>> endobj +1698 0 obj << +/D [1791 0 R /XYZ 107.713 563.663 null] +>> endobj +1699 0 obj << +/D [1791 0 R /XYZ 107.713 547.723 null] +>> endobj +1700 0 obj << +/D [1791 0 R /XYZ 107.713 531.783 null] +>> endobj +1701 0 obj << +/D [1791 0 R /XYZ 107.713 515.842 null] +>> endobj +1702 0 obj << +/D [1791 0 R /XYZ 107.713 499.902 null] +>> endobj +1703 0 obj << +/D [1791 0 R /XYZ 107.713 483.962 null] +>> endobj +1704 0 obj << +/D [1791 0 R /XYZ 107.713 468.022 null] +>> endobj +1705 0 obj << +/D [1791 0 R /XYZ 107.713 452.082 null] +>> endobj +1706 0 obj << +/D [1791 0 R /XYZ 107.713 436.141 null] +>> endobj +1707 0 obj << +/D [1791 0 R /XYZ 107.713 420.201 null] +>> endobj +1708 0 obj << +/D [1791 0 R /XYZ 107.713 404.261 null] +>> endobj +1709 0 obj << +/D [1791 0 R /XYZ 90 392.141 null] +>> endobj +1794 0 obj << +/D [1791 0 R /XYZ 90 377.571 null] +>> endobj +1710 0 obj << +/D [1791 0 R /XYZ 107.713 300.778 null] +>> endobj +1711 0 obj << +/D [1791 0 R /XYZ 107.713 284.838 null] +>> endobj +1712 0 obj << +/D [1791 0 R /XYZ 107.713 268.897 null] +>> endobj +1713 0 obj << +/D [1791 0 R /XYZ 107.713 252.957 null] +>> endobj +1751 0 obj << +/D [1791 0 R /XYZ 90 240.838 null] +>> endobj +1795 0 obj << +/D [1791 0 R /XYZ 90 226.267 null] +>> endobj +1752 0 obj << +/D [1791 0 R /XYZ 107.713 149.474 null] +>> endobj +1753 0 obj << +/D [1791 0 R /XYZ 107.713 133.534 null] +>> endobj +1754 0 obj << +/D [1791 0 R /XYZ 90 121.414 null] +>> endobj +1790 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F23 340 0 R /F8 504 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1800 0 obj << +/Length 1450 +/Filter /FlateDecode +>> +stream +xÚÅX[wÚ8~çWømÍé¢H¶åKÞhJ³t¹5m»mG1JðÖX®mBÓ_¿#KL—³{vŸ@²ôÍ7£ofdcãÁÀÆuãõ¤qñÖµ®å“{#À†çD-bLfÆg3@¤Ù"cóêÕ«fË¢Øì±äaɸu“‚g÷,”Cß³=Óõ›_'ïIã{ƒ€l•zȳ©.Ÿ¿bcóï ŒìÀ7V媅áX6üÆƸñ¾2´l„]ºfˆäh–v'ŸŠÓª¿IÚM_J1/Z!Ëu©O!`‰XDՉ„uß]j‘©6QSʸ[²;•¥¥ZÆK,ÀT„R‘ð¤PTa2Ü=&˜»“XjP<¥QÈâX?«¹*×ò9“Ë#HOzÔQͲæh{ðéD'ÑM6¶Iûé`ÈwUEˆ‹¼€ìË +÷ü¬¦E´ˆ~ªfÙ3~<-F"Ï£»X Gl¨™ ü™Ñïºý.v‡‡k"FÔ^ŸB?Jv\ˆtSË Fñ¼à³#URÁÕ$Ño<Ž…<¬é°'Ñy& lÁÀÞ' ï|aô»£é(kßp֋é¸`Å2?[ËdÍ5q_õ®Ã!/Ùƒ¾IÞ\7ŒÏåe¼4\‹›~œ‹øQæ ߛ¯û¥fo(þc©ÝÞvÚãîë^gZ2½‘ qÃþá*ì!b­U7™W¥W;Z;êerÏYÈcuWÖ´w;x=¼¼é¼9—žKé©ôîÄ2™KŒ +³Æn8šÈÌ8“ ÿ‰s˜Ýœizëû–,NUKÕ,eNíO#B ¬ÛÂØÝ$OuÓø£X0[kûAGI¡0e*@I³`kûú+I É¡ثĒ9¸*KF–½s¡´°U9üc{ï9©Ö*÷ +¨®Dú>S†Þ¢¦*jC$‚#Àà +DÍ¥¬˜«Ò{=Y”ébu°êòGã™æ\/ŠäuˆØÚ{Ǽ—¬¦‘ÈðÔÀìgGµ…Qž†ÆQÞàs@oVIIÁ7»I-³w¿¸>d¶êǃò£HÑEgûú£ Rg§4Œ$})~=¬Ô¯¿tèH•ƒÛœg¿È^¢ëGŸ%ëwyªºÛäkÉB±€ô”'>Ú ˆ1¯Zšòì›Qýû]¶$ºÅ—ø²7™=/ŠôòâbµZ¡0GË$J3i_> endobj +1796 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.841 275.498 249.291 285.426] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >> +>> endobj +1797 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1801 0 obj << +/D [1799 0 R /XYZ 90 757.935 null] +>> endobj +1802 0 obj << +/D [1799 0 R /XYZ 90 733.028 null] +>> endobj +1755 0 obj << +/D [1799 0 R /XYZ 107.713 662.787 null] +>> endobj +1756 0 obj << +/D [1799 0 R /XYZ 107.713 647.266 null] +>> endobj +1757 0 obj << +/D [1799 0 R /XYZ 107.713 631.745 null] +>> endobj +1758 0 obj << +/D [1799 0 R /XYZ 107.713 616.224 null] +>> endobj +1759 0 obj << +/D [1799 0 R /XYZ 107.713 600.703 null] +>> endobj +1760 0 obj << +/D [1799 0 R /XYZ 107.713 585.182 null] +>> endobj +1761 0 obj << +/D [1799 0 R /XYZ 90 574.11 null] +>> endobj +1803 0 obj << +/D [1799 0 R /XYZ 90 559.728 null] +>> endobj +1762 0 obj << +/D [1799 0 R /XYZ 107.713 483.983 null] +>> endobj +1763 0 obj << +/D [1799 0 R /XYZ 107.713 468.462 null] +>> endobj +1764 0 obj << +/D [1799 0 R /XYZ 107.713 452.941 null] +>> endobj +1765 0 obj << +/D [1799 0 R /XYZ 90 441.869 null] +>> endobj +1804 0 obj << +/D [1799 0 R /XYZ 90 427.487 null] +>> endobj +1766 0 obj << +/D [1799 0 R /XYZ 107.713 351.742 null] +>> endobj +1767 0 obj << +/D [1799 0 R /XYZ 107.713 336.221 null] +>> endobj +1768 0 obj << +/D [1799 0 R /XYZ 90 325.149 null] +>> endobj +1805 0 obj << +/D [1799 0 R /XYZ 90 310.767 null] +>> endobj +1769 0 obj << +/D [1799 0 R /XYZ 107.713 235.998 null] +>> endobj +1770 0 obj << +/D [1799 0 R /XYZ 107.713 220.477 null] +>> endobj +1771 0 obj << +/D [1799 0 R /XYZ 107.713 204.956 null] +>> endobj +1806 0 obj << +/D [1799 0 R /XYZ 90 188.417 null] +>> endobj +1772 0 obj << +/D [1799 0 R /XYZ 90 166.105 null] +>> endobj +1807 0 obj << +/D [1799 0 R /XYZ 90 166.105 null] +>> endobj +1798 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F95 1788 0 R /F23 340 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1823 0 obj << +/Length 1582 +/Filter /FlateDecode +>> +stream +xÚÍÛnÛ6ôÝ_¡·ÉÀL“ÔÅR1X»fèÖ¥Yëí¥- Ffl®2¥Ir\÷ëwHʗºI†¸ÃžDòðܯ  ~<›Æiä$OyLo‚œ“”‘„³`:ޅŒG<¡á¥Xɶ…t۟ªb½’ºª4eɄ‡i>ü0ýeðb:ø{À€> ˜¥—LÈ$J‚b5x÷s8ÿ% $ʳ`co­‚˜Gð-ƒ·ƒßt_¶„ÉÆ#BÓÄÉVuKÙó47CFꙷߛ}®ÄG¥Ö-UëVu¥tçQìoTî+Œ*iÊ!KÂO…¬Q;½§ zî6¥CNÃ۞…BBJ³lÁD™ÛJÝ®Ù:6ÝRx–)«ëF4[cG0ˆ1’'¨íF•¥1þ$ld·n´[•îš +Vóµä ´TÒ* kQ×¥*¬ÃŒ‘’,жêºÜ:øõÖ#7Ր'ÀÏj·#—… e·Æ:ù˜ +énÀ,\G,T°ÐY 1µ’ž¬@ÑÀX'6q&ÑRŸÅ<¼Yë}êƝ:ùà UŸ¥;r Èƒ8ج»ïEì)ükµXȶC×É¢sãýÚYE6­ì™ÔU¹]Êy#ŒþqÜïANèÕnÛN®\Yð7¶]# "[4Z6¢«šƒÈÀ´ûn–ªXº%ºˆöd7Ê« ô' ×u¥‰MUŸkGE`DIž§\&iœ;©/«N>9B:ÈN–‘ ÍAՌÐ$rHS+ËAdf4àtxnóVlÝƆ/\– }x†Åò½$†=ðMS­¢‚«ˆ,%P¥;ZB—Ûù1jш²”ˆ!Ŝœòå… ï+”Vp¿Åt8áH} `Ô¹%Ê+[#zgù,Ù£³³Àž•V¡Ñõ.H V徟eS!W-wiŒTœÉÛ優ª#ÃQ4É—ƺ“È©Sź„䌩Õ€¶p^Ù*]AWxd$p+w‰‡b1LB¡Þf)qå4…Åq!«¯½ƒeJ?±’¤ç¼» †+‚ß á‚ @ +@ªRu'‹­·Ú¿meÝoó„Å$ŠSn…AkcQ0ŠrÂóh×2¥÷ô̞šåj© ò‰gžaHéʦI³³+Óx|½™½ÚÏö#voä x—eOpdÙä«áf4É÷SՆ_§š»ª Ôª÷”r-燶 í%Ùí€oÄ ËÑÒ½ÔíÅ%%q”Äœ¤¾ý¿ç<9À ލºÇf i8¼±×Œ/_Ï^×X[ÈÇd JQŒ1×Ç$c'ʏ®5›,¬×ݸZwðÙÕ^ņñ"š’&2ÝóßZԐ"'Å=®á’,G„%(æóòü|††Žµ†y·•ÛÙó¥,>ÕA½S‚ÛÜãì[°_0¶§_F å9`YV?œÈ H;û {Äf—ëÕ5øòKšN¢,»fÔs'±ïW'èARæo?uŸ~Åé|F,g&ª³ô +Ö®aÌ^7÷(¿[€ÂÄãÝüO;àQ¹ŠÃ“Ëʺö-ðÆ·q UºQ¦à¶–¾Ã®êRšÞ÷f3šº•Ú·f˜±·¦Õ{ä<ô›ž79{´Ñ¦¾7Ú¶a†­GÚìÖ[ÉMÅíÑDruõ ++™ÐSŒFëßÌ‰à ¬fÏ+ãmyÀ³gÕ§3R'Œ•1"¬s¡îô}# £æ¶(åì¥iGÿG=âcÐEÕ9Â5œÃÓ¦Bÿ¼òo³>Êo!ò}‘¸§ÿ7FxeŸÆ³ŸÌ۶ũò †èŸÜf4'0°ãŠeòíÂû!ý (ÏÞºwôyTþú£Ü¶ ó0?Ôûø/W +lXöП\þçVJò Œ[îçV’“ďjý8~eùÃè[?û1ötS¥ûgìz-p050°üí"0˜˜ æiÙýVú\rš} üêW3_&{ò²lB"Êý”²ìºúÉx¼ÙlHђµVuCT7®ërü帹G\1é‰ô-xUùˆÒp¸²O¦/ìÿl0Z +endstream +endobj +1822 0 obj << +/Type /Page +/Contents 1823 0 R +/Resources 1821 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1676 0 R +/Annots [ 1808 0 R 1809 0 R 1810 0 R 1811 0 R 1812 0 R 1813 0 R 1814 0 R 1815 0 R 1816 0 R 1817 0 R 1818 0 R 1820 0 R ] +>> endobj +1808 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.107 456.05 216.873 466.954] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_1_1IO__Operators) >> +>> endobj +1809 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 376.264 187.464 386.191] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >> +>> endobj +1810 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 363.053 316.68 373.24] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked_3_01Checked__Number_3_01T_00_01P_01_4_01_4) >> +>> endobj +1811 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 350.361 234.098 360.288] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +1812 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 337.409 210.149 347.337] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +1813 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 299.636 180.57 308.483] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Throwable) >> +>> endobj +1814 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 258.724 225.471 269.628] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1From__Covering__Box) >> +>> endobj +1815 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 219.87 198.482 230.774] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >> +>> endobj +1816 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 183.073 170.956 191.92] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +1817 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 142.162 213.018 153.066] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +1818 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 103.307 213.595 114.211] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +1820 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1824 0 obj << +/D [1822 0 R /XYZ 90 757.935 null] +>> endobj +118 0 obj << +/D [1822 0 R /XYZ 90 591.842 null] +>> endobj +1347 0 obj << +/D [1822 0 R /XYZ 90 555.116 null] +>> endobj +122 0 obj << +/D [1822 0 R /XYZ 90 555.116 null] +>> endobj +1825 0 obj << +/D [1822 0 R /XYZ 90 473.121 null] +>> endobj +1826 0 obj << +/D [1822 0 R /XYZ 90 394.261 null] +>> endobj +1821 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F11 418 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1848 0 obj << +/Length 903 +/Filter /FlateDecode +>> +stream +xÚÍXÙRÛ0}ÏWè {†(’÷ðLÙZ˜Ò>âˆà©íÙ!ð÷՚ÄéB§1Mž´XÖ½çèÜ« @à´s4ìôNôa?p0|}ÂCßÁ`8·FÛ]Œ²6Fa9‰¶ƒ¬iöúHnjğÒ#ìÕî:>²®HN«’$T5¯ée6Ž,Zˆ.z‘g…Ⱦ^t> ;OÌý@K»~C×IÞ¹½G`Ìû/‚n?s9*žãò27Ï¤1ü®”Ø|´‚ £znBÊóÀ;Çñ¥;æ?pÛõ9Ú$#U¥?ÙD{z-‡pÇÓ¢ªI‹º1ÁzÙ; q/Oxá80ðÐÅìcíÄ¡b+K J˜ªÓ§ÉÒZÓ:Õ½|€é÷} ¾a·¾k ;.Œ¢Áøúǜøšf¤N§Å¦ µf˜í†–™TöŒh=§T7ˆ*J­?Ûó-3ŽãƘD.}K,Ò6Ù:¥e¤ž²ø浪iޒ`*5™’ȃ*'"L…9‰››íj'Àÿ3j÷§0 ö^PûF"&“dÓj¦”µ2fVpécÂf"1n* +÷MQ$ [[UÂò;dÌ%F!ˆ­ +ž¥ãø†<··³Áßà¢%–€×rAIòœÖ”53ÀòŸMCcNŽÎ®¿!7>¦¬NïrRÓÖ¶O¶‡¬g*³„9% “²ëÁT›”{ª>OÇ´H‹‰æ²\UÆ[²³°ß.…‡mÈ=ÛyöäùÇå.Ÿß~‘Ív€5áu‹tHe´%í75µ£¸r½¬Q'XÙ&_åz–’QF«ø†n~ÒJ¨êñÁAEëæ>÷lLí™ÛÐXñ²ÝSÍåù °)w¬­Mþ2}¡:Î žg< ZwÈGêèÃkXõ T(‰a½ æ‹ÔSªÂÅ­ÚÉÙn›ÛޛN¯ã}ßäÞÂÝ"n!S5¯âeDùǬ$úVÑ_]½‰ýñ)ààèoߞÌÛRû¡éw3¿}=»¤&X®w4ã•n6žÎ¾T”í‰[¬Þ.I1#Ù2àŸÅT”U‹mAŒ #2´».ü 5RVȾSû(ÞùüqB9ü“ô÷±®Ëƒ^o>ŸÃ¤‚³"-Lë^Yf½}k¨1×I¸˜dRù”Q“¡yg.MEpþ¯5ۄ +endstream +endobj +1847 0 obj << +/Type /Page +/Contents 1848 0 R +/Resources 1846 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1850 0 R +/Annots [ 1819 0 R 1827 0 R 1828 0 R 1829 0 R 1830 0 R 1831 0 R 1832 0 R 1833 0 R 1834 0 R 1835 0 R 1836 0 R 1837 0 R 1838 0 R 1839 0 R 1840 0 R 1841 0 R 1842 0 R 1843 0 R 1845 0 R ] +>> endobj +1819 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 709.048 179.274 717.895] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +1827 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 668.197 216.365 679.101] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +1828 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 629.403 211.912 640.307] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +1829 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 592.667 177.591 601.513] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +1830 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 551.815 220.22 562.719] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +1831 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 513.021 185.9 523.925] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +1832 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 474.228 235.154 485.131] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +1833 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 436.41 200.833 446.338] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +1834 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 397.616 220.778 407.544] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate) >> +>> endobj +1835 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 358.822 201.401 368.75] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate) >> +>> endobj +1836 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 319.052 216.355 329.956] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >> +>> endobj +1837 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 280.258 183.698 291.162] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +1838 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 242.44 192.544 252.368] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +1839 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 203.646 194.218 213.574] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >> +>> endobj +1840 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 164.852 202.507 174.78] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate) >> +>> endobj +1841 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.544 149.286 273.474 159.191] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +1842 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 125.082 195.324 135.986] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +1843 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 86.288 209.71 97.192] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +1845 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1849 0 obj << +/D [1847 0 R /XYZ 90 757.935 null] +>> endobj +1846 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1869 0 obj << +/Length 1101 +/Filter /FlateDecode +>> +stream +xÚ՘]“Ú6†ïùº«= Bþ6½kºÍNÓ$¥»dz±É0 ÐԖ\K@误dI¬ñf“BËöʶl÷9GG¬׃WÓÁèu1§a +¦K0F K˜„˜àÎ  üa€ò&~€<ÜTx6ñCäñr¿&Eƒgoé¼ÁÍÞ† òÞ㊈/ˆy¼!KÒøA‚,Îc/ üOÓ7ƒŸ¦ƒ?ò í7É`%`Q î>!P¨ö7Áhœƒ]ûUâ0R×Ü~ «¡m5e!ȕ¦4֚‚p Q²0‚(MŒ®ŒŒK{CDÜÐÒ +Y”\ÂÞsæÇÈÛ­û³i«­~?N<Î`«è1—F¯Ôa< C˜Æ¡ºF0#ãÐÇ0LŽŒ€»a‚´XûBƒjV–ØMû‰v庡Å7ú?âáºb˜gù•2u‚–ød-?3Iš­&.ÿ±¦ìX“Î[ÂHC/Ÿõ—.ÄBй{ÕøQæ!•éƒ¶Þâò¢È^ñÏg"õD.Tð!o(aë}Mh!1[•Äï²T®f·k\“3¡™ó +œÜ‚.uMÓ¥MKf®Ú‰¶ÃK+ÿU…`Å.Ï€q\™Õ#©5ýœôÞVX¬g7¤Ø,$U•úD½Ó5.éuߦ˜:¯õoiAl«\“nmp´M‘knóeɛÞÆ牱ªÿ³‰Å+LÙEiþșªqÊ )þgLç:÷ϑî{~¨ùõŠº²þ/ð<}é3iÃÝHŠËroВByj¼<°…P»zÝ|P÷Éð¥Å¸ãæÏ]j¶äÅE¡]µq;¥/¤¡k’¤ª¹îv˜Yj;ZÚyd~”•É^w·&ìÞX‰¥ýXª5GA–â1cbS«®;K5[%^¼¸,|¢–ŒeZljä7`k‹›Ëdòöa8˜äG/ܧS<-Á½PÈ;+Ý¥Þ×]zºŸp½;ؑFyú¼äF8ßé}ªÒLdH·Pº«E8ǂ ÍBwKÊg3ÃL¸žüˆ*חâDUfª`ƞ{sHÍÚ:Ù¥&.ŠíúÝd¦÷ž:œ+%ñD`ØцA}‚`¶¢ M¦/ÏÛö¿ù¾7+7ÍMI燲š<6"{g;è=ÆDc‹lêg±ç*i×FwÂ8Ê[ìÉ8ÿ:n[™m¡‘™ü:ü‚V„ •@3ýëÉG6Û6ÊäŠ=ÁVÞO"½¥™„j»ÝW›\ÊVVÊý¹ÖÁãodmÿŒ+U®ùS¸Ú£,†Ž3ßÏ%c˜$qo\ÚuPåæw8gNè>Ò|§sÆfÞ;Ì6ÇG” ­6¥ªÆa<# ªWô‡‘JÐ[âbd”ýÜÝ/:咎¿AžÁ…êUëïZÊúûÑh·ÛÁ…€FëR9ªërô0ù:VTx³ƒ‘C¤*Þ\ÕXa]ƒŽã¡øÿ õ¾ +endstream +endobj +1868 0 obj << +/Type /Page +/Contents 1869 0 R +/Resources 1867 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1850 0 R +/Annots [ 1844 0 R 1851 0 R 1852 0 R 1853 0 R 1854 0 R 1855 0 R 1856 0 R 1857 0 R 1858 0 R 1859 0 R 1860 0 R 1861 0 R 1862 0 R 1863 0 R 1864 0 R 1866 0 R ] +>> endobj +1844 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 698.126 156.022 706.972] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +1851 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 659.405 168.495 668.251] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >> +>> endobj +1852 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 620.684 154.368 629.53] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +1853 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 579.905 180.928 590.809] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +1854 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 541.184 208.036 552.088] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +1855 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 503.439 210.268 513.367] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Smash__Reduction) >> +>> endobj +1856 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 464.718 229.087 474.646] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraints__Reduction) >> +>> endobj +1857 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 425.997 195.872 435.925] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1No__Reduction) >> +>> endobj +1858 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 386.3 247.189 397.204] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +1859 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 348.555 205.835 358.482] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Domain__Product) >> +>> endobj +1860 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 310.915 187.005 319.761] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >> +>> endobj +1861 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 272.194 174.034 281.04] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >> +>> endobj +1862 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 232.391 211.124 242.319] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +1863 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 192.694 192.395 203.598] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +1864 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.012 112.125 237.655 123.029] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +1866 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1870 0 obj << +/D [1868 0 R /XYZ 90 757.935 null] +>> endobj +1871 0 obj << +/D [1868 0 R /XYZ 90 129.129 null] +>> endobj +1867 0 obj << +/Font << /F63 374 0 R /F72 471 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1930 0 obj << +/Length 1403 +/Filter /FlateDecode +>> +stream +xÚÅX[w›8~÷¯àmáœ5‘¸š}slœ¥µÎ6Mztˆ­$œrq7ëöì_ k;±ìîö‰ëŒ¾ù4Ò|À=p€»èœ³‘&s†hh’Æ÷œ8]ƒ¢*A.˜s7<"ºÀ»|˜'!r ðY¼zÄóhmvÑÞļ|³ ¨£«ƒC¶Ù>®ö&GŒÒÂf'¨šXöÔG–=²l+¸n=¶m^ G ·¦7;‚¬òµu2@îø ®ãá!6µïÛ­Q ®äšÚï[Û­+ôÑôèVï´6&¼¡þpH¯­£nVn儢hãdÀÄg7Ÿ¹?=?*ò&püª¦cÿÒ4Àt´6&‰b³dµO]FÏÒ5Ñ¥UÀP4ÔZý¬…BFs¼!©è÷¥ºñϞ¸U£Im†º¼]£]¡G*lQDwqSn—å,#ºr»ø†ué¥ÂèϨ&ýL%j#Â<*\F³¦F'‹eYÖô<¥Òª’Î{Ù2q†Qþ̃ÔÛ_okó*O§ö ë™n“%[¦îѦDÊó–ù ’æKQ¼ÙÉW…®–ª¦ØHWÛ4‡æð§fX3,/æÍ3&¹¶Eá$úïTóërmˆiÖ?à”*EŒÌ'»êø5ùÆ>Om‹l~[ÉaNÜgeúísò’2¥ó>g'ŸjM§˜€ÊzK½™•µ|güÊYñp\eòWÉ]Ÿª¦Ç¦ï£àÏÖJ¤²s<ªt uSJbkE~Ší…gö!˜Þñ8¶«Í–Ï#8i¶™CXNÜTêɯÚUüªd”HÎÎÉ"®¶‰¿£r…qX»ždE:´AP7®3&ŒþÚv&V\•û±ù¡J§Ž|«2<ցDùõþ*±×ëi“Z“H¤%‘Mí¢ÀËy֝QBOjœ¼ß8‹2J¢olϙds|D §?kb}¬—å´]X“þ‡ƒöGVy¯܈¹îo‘ÀÙ4@C%ºÈÍ31A>ÑËgëŒþõý°“©=2û¾u>6Qå)$ò8i1!ÌÑ9Væðh?/,/Ç è,¿êôÿQþëŽc^PT¾b¿Þz³ø+U $gÅnZ#è`ï­ýç¦ß¬‰†.÷êÞ¹jˆjÓÈ ”n¥Sò¤>°¸Mçœ=nµÏ§ÎT•¯#ž„é²iúÞ|¥®p^¬“ˆˆùE¡+“Òæãf`‘}暻÷´û¨nà…=]”D>UxËrñÇÙÙÓӓ8+Äe-r1*Ï‹øìyrà ™A}íd-œ“,_wšÉËä…sáÿ_x³Ð +endstream +endobj +1929 0 obj << +/Type /Page +/Contents 1930 0 R +/Resources 1928 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1850 0 R +/Annots [ 1865 0 R 1872 0 R 1873 0 R 1874 0 R 1875 0 R 1876 0 R 1877 0 R 1878 0 R 1879 0 R 1880 0 R 1881 0 R 1882 0 R 1883 0 R 1884 0 R 1885 0 R 1886 0 R 1887 0 R 1888 0 R 1889 0 R 1890 0 R 1891 0 R 1892 0 R 1893 0 R 1894 0 R 1895 0 R 1896 0 R 1897 0 R 1933 0 R 1898 0 R 1899 0 R 1900 0 R 1901 0 R 1902 0 R 1903 0 R 1934 0 R 1904 0 R 1905 0 R 1906 0 R 1907 0 R 1908 0 R 1909 0 R 1910 0 R 1911 0 R 1912 0 R 1913 0 R 1914 0 R 1915 0 R 1916 0 R 1917 0 R 1935 0 R 1918 0 R 1919 0 R 1920 0 R 1921 0 R 1922 0 R 1923 0 R 1924 0 R 1927 0 R ] +>> endobj +1865 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.012 719.912 249.819 730.816] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +1872 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [264.455 681.058 310.472 691.962] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +1873 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 600.669 165.994 611.199] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_ga88e9b9cb2588cbf5914695fc14e69a8) >> +>> endobj +1874 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 584.729 177.89 595.259] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a896b8890edb38e9960c455aa178e508ba) >> +>> endobj +1875 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.879 584.729 206.303 595.259] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8b30277f972f730fe26f6cfc39098cc77) >> +>> endobj +1876 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [209.292 584.729 236.739 595.259] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8e704947d33ff1b60a2475950d5f18ec3) >> +>> endobj +1877 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [239.728 584.729 267.175 595.259] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a89f5dce9506b72773425c0504845d8e4e) >> +>> endobj +1878 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 569.132 141.357 579.319] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8d5e386c6a05c9656eac42fe9e2cdd8b5) >> +>> endobj +1879 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.346 569.132 170.687 579.319] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8c77955fc77a169347da8820b46c3247b) >> +>> endobj +1880 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [173.676 569.132 201.123 579.319] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a86c817c11198882f3864d8ace4ec326dd) >> +>> endobj +1881 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.112 569.132 237.646 579.319] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a80d808c2d0d6514c33e06445d7aa34270) >> +>> endobj +1882 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 553.192 214.961 563.379] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8bd640c30f757e4ecccd08ac527536ca6) >> +>> endobj +1883 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.95 553.192 312.066 563.379] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8a7ce2ad16ee907ff9d31eeb1cda41834) >> +>> endobj +1884 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [315.055 553.192 408.364 563.379] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8979f37a289d4cb316643f1dcc07ec7cd) >> +>> endobj +1885 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.353 553.192 503.268 563.379] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a805e540f453fd070a4e4c0fdd887f4b7a) >> +>> endobj +1886 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 537.252 155.953 547.438] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a89606fc251d767040929d3e2645dbb446) >> +>> endobj +1887 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.941 537.252 242.846 547.438] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8e0c660bfcbcd3d10c3e764e22f41d0a1) >> +>> endobj +1888 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [245.835 537.252 308.301 547.438] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8057025d0ff550a2226a0a1273c84b4f6) >> +>> endobj +1889 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [311.289 537.252 389.097 547.438] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8a1bf7bec2cb0d949e45c3cd0e25874a6) >> +>> endobj +1890 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 521.312 187.843 531.498] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a85912e00d1de38a643d48af1f0e5dd35f) >> +>> endobj +1891 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.831 521.312 249.272 531.498] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8fda2f32e2fc3f61357ce0d9d7813f5fc) >> +>> endobj +1892 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.261 521.312 340.191 531.498] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8930a62d56d7231cdb1ed57e1d3eff0f7) >> +>> endobj +1893 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [343.179 521.312 418.785 531.498] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8bd1bad185f4622d07b171767dafc78b6) >> +>> endobj +1894 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 505.028 181.915 515.558] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8a0f28596ac7d4a43766fab174c28ccab) >> +>> endobj +1895 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.031 505.028 252.519 515.558] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8261922c7bb53bf71459671df868e55da) >> +>> endobj +1896 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [258.636 505.028 409.948 515.558] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a80905d51325862cb4db00635875efcff8) >> +>> endobj +1897 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [416.064 505.028 513.996 515.558] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8202263943c451b9fdfe003b2bc8d0b1f) >> +>> endobj +1933 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 493.416 170.398 503.603] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8202263943c451b9fdfe003b2bc8d0b1f) >> +>> endobj +1898 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 477.132 196.709 487.663] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8fdd3365de1a07c7f7bdd1dc330bba8f4) >> +>> endobj +1899 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.3 437.904 200.857 448.808] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +1900 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [214.153 437.904 286.78 448.808] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg25ea3a289eadef732f4c7fd823387fb2beee33de6f8542b0228161d044640eaa) >> +>> endobj +1901 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [292.531 437.904 347.256 448.808] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg25ea3a289eadef732f4c7fd823387fb2a57b0c1a34eced57ca8437eea92a4328) >> +>> endobj +1902 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [353.007 437.904 432.628 448.808] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg25ea3a289eadef732f4c7fd823387fb20f182c5824807f7bc66d2d2033810feb) >> +>> endobj +1903 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [443.63 437.904 513.996 448.808] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg25ea3a289eadef732f4c7fd823387fb2eafcc7ca16bda73dc6b0f7deaf9470dd) >> +>> endobj +1934 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 426.323 155.743 436.853] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg25ea3a289eadef732f4c7fd823387fb2eafcc7ca16bda73dc6b0f7deaf9470dd) >> +>> endobj +1904 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 387.095 223.927 397.999] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g616fcdc7600a3a11a8a9152e75730899) >> +>> endobj +1905 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [231.698 387.095 282.945 397.999] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg616fcdc7600a3a11a8a9152e757308990edf84fcb94023ff4a7183bf3f8dace5) >> +>> endobj +1906 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [285.934 387.095 321.69 397.999] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg616fcdc7600a3a11a8a9152e75730899c7753e1dd51e1b7b3fdfafa9f8332370) >> +>> endobj +1907 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 348.241 210.278 359.145] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +1908 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 332.674 171.803 343.204] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312ae556cc08f48e769b9c15bea83d5d883a1) >> +>> endobj +1909 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.792 332.674 257.093 343.204] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312aed8db7109fb4bb50360b05800dd245416) >> +>> endobj +1910 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [260.082 332.674 295.329 343.204] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312ae3e4424ce8e7ebe86e125541b561fc300) >> +>> endobj +1911 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [298.318 332.674 402.198 343.204] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312ae079e4b80f17b0095497103a52cffa3ab) >> +>> endobj +1912 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 316.734 193.382 327.264] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312ae94cf20719046117aece5acba61dcae4d) >> +>> endobj +1913 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.371 316.734 256.675 327.264] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312ae8191bdbdcd041a9859ed465d16062ab1) >> +>> endobj +1914 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.448 277.506 214.914 288.41] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +1915 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [224.506 277.506 360.535 288.41] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg113f1e845cba6b1c3c5705d0e14f1cc171c9b0459dc8ba8cc0c8178b6cf4f017) >> +>> endobj +1916 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [364.434 277.506 478.227 288.41] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg113f1e845cba6b1c3c5705d0e14f1cc1b39e3c667ce455313f8ff578722af2e9) >> +>> endobj +1917 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [482.126 277.506 513.996 288.41] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg113f1e845cba6b1c3c5705d0e14f1cc140409716eac06f7ee5c44a200d3702f0) >> +>> endobj +1935 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 265.924 180.102 276.455] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gg113f1e845cba6b1c3c5705d0e14f1cc140409716eac06f7ee5c44a200d3702f0) >> +>> endobj +1918 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 226.696 221.336 237.6] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gac82e7e0179442ef589f2fc61302d654) >> +>> endobj +1919 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [229.107 226.696 301.924 237.6] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_ggac82e7e0179442ef589f2fc61302d654324bf568397fdfc332a4c06e7a4facf5) >> +>> endobj +1920 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.912 226.696 381.604 237.6] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_ggac82e7e0179442ef589f2fc61302d6540e1a601a53491f60c89282fde55b5352) >> +>> endobj +1921 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.99 188.216 225.779 198.746] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gdf9d6f17d8974c81e3499f170e7762a2) >> +>> endobj +1922 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [232.454 188.216 369.659 198.746] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_ggdf9d6f17d8974c81e3499f170e7762a253f4353b82f1a10a08b1e756bb7c84ad) >> +>> endobj +1923 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [372.099 188.216 511.506 198.746] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_ggdf9d6f17d8974c81e3499f170e7762a2b2bc77b49f9450faf5b5f8ca5374421d) >> +>> endobj +1924 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 176.261 243.912 186.791] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_ggdf9d6f17d8974c81e3499f170e7762a278fc3e83d58f3eb97a8041b600870a05) >> +>> endobj +1927 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1931 0 obj << +/D [1929 0 R /XYZ 90 757.935 null] +>> endobj +1932 0 obj << +/D [1929 0 R /XYZ 90 619.269 null] +>> endobj +1928 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1956 0 obj << +/Length 1253 +/Filter /FlateDecode +>> +stream +xÚíYMsÛ6½ëWðVj¦‚‚àGÉԝ¦iGu”““á@d³–H$­¸¿¾  EY¶%ÛR’N‘ »x»ûvAbçÒÁÎ/ƒ7ÓÁø, NŒâÀ œé‰±18Ó¹sáŒÈpD0ÆîdH°ËåŠ'“¡‡Ýby{%æ’'ﳙäòv8òvÿà+Q•<íí¹X9$‘+r5DB?òݐ?Oß ~žþ°;Dëe! +)sÒÕàâ3væ0þÎÁˆÆ‘³Ö³VŽïQø_:ð£{ð(Âk÷pÖäiy¥ÕZ¹ñÃB$@>œ‘ç¡À +~ò<֓q.F hò*»ÌÅ܊}¿5ñ\ԍ„éÅê+{«N_æÍj&Ìu±Øš7™¼o/n”—°«lE;Myµ‘µ ðŽÉ«£–å'EM«ûîQ“bè1÷&S7§Oiè +e†Ñ|r_ș¨ùéÔÚ¾±àK4ëV]zÅu*ŽÏ¼M®e©+lÖÁ˜>€ï–!ò'#¶úKñQàq<¸9U:Õžà§µÅ»ªe–_š)E^ó,ïîÿÓ>˜ñ<òû‚ßØLqÿîu²'h£u"‹&ŸƒµÉ¢‰²ñÔñAÔÛ¼q6ùhØg®±Á´bn&U…•âõChò oü¡»%ƒqœÙr‘!ua¯;5e‘åuºTN´ëB^[wʶF¤õòvȘ{<ªßÏgRTu!ERÂ@èü÷-ù©Ì໶3Q֖ÜvBžÕ_fÿðº+¾»jÇWΓEÙ$©"Q).‹e²ØÙ¡¿ö¿vút¶C»aÙt /…DÇóL +­/©oKñ4„—›tÓ Ÿ®WI“Ë6ï f0ϤýQÛ»ýã¯:¼Çüd÷w:fèiĊ¶%€Cë&âÁY:ŒlqWbzRÏ8òßN9Ì3$*ó‡ºMøµ*…œïïWÞmÛÄÿ}§'EˆFÄÎáù|ó¶û|¶mÏ=Ò[·Å,UnžèŠ¦ZÞÚJÓþ7•~vhÜD(ÂäèC#ûD–d¹ÞËè|¶-•¼ûÁ4RÓÀ~æŠë¼õ’(ƒè"!Ýe”x­3ՅŽ2 +moß«êÑV”i±QF "Øš!hlçüËy¡›.·-žµJ‹‚«ïD}Š˜ß‰n¬…ÒbU65·Ù»¥7½µÂÌk*£]‡ºZ¡ê=tz (?< «8d€+WÅí²_#þSÑl'ûLfܝ[-$/ë”YÅhò`¢ÚÞ±‡hÜÅ_ºÞÝ…,~^Ÿ¡è•ã'¹è5º·Ùk]r?{iŒ¼€îÌÞÖ#f/C’­—½– +ùº¼êèù$²é•H¯Ÿ…ìöG +¨_1‰öýF¡¿MÀÖûÐÈ|›`1bÌxcÚÍôÁ[®Ì둉ýºÒÞö>±|¬„üA çy×Ãn›oÓô ¢GžÚR‰¡¢ØÒÙîìÚ±W¿ tÝÙK¢Qܽ%ºªëò§ñx½^£´BMž•eõ¸,—ãûW6V¼{Õ´°oÙW@Z–TapÅïÿJ#Ÿ¥ +endstream +endobj +1955 0 obj << +/Type /Page +/Contents 1956 0 R +/Resources 1954 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1850 0 R +/Annots [ 1925 0 R 1926 0 R 1936 0 R 1937 0 R 1938 0 R 1939 0 R 1940 0 R 1941 0 R 1942 0 R 1943 0 R 1944 0 R 1945 0 R 1946 0 R 1947 0 R 1948 0 R 1949 0 R 1953 0 R ] +>> endobj +1925 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.376 697.247 211.773 708.151] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_0adf6106892886dc859985042b8a7433) >> +>> endobj +1926 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.376 658.393 212.331 669.297] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_f9dd9190c5f29dbbfa3d6e442dea7e7d) >> +>> endobj +1936 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.376 619.539 220.38 630.443] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_5604f97d216583cdf012a50d2f8cdbde) >> +>> endobj +1937 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.376 580.684 205.128 591.588] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_f127b16b1a8e300aa97caca515284b6f) >> +>> endobj +1938 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [164.54 542.204 195.713 552.734] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_99e9dc5df3cf7c0ab581e602d1176e41) >> +>> endobj +1939 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [164.54 503.349 193.641 513.88] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_ee4e9b54e65780ac3010fda40ea235a6) >> +>> endobj +1940 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 464.122 226.677 475.025] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_63bd7c7767faf3c219f9c2762095e2dd) >> +>> endobj +1941 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 425.267 243.822 436.171] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_6c841f33162c2419bd53a078e6c788ee) >> +>> endobj +1942 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 386.413 264.305 397.317] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_ce0cdceaa0c7eea84cc1c38cf5bea680) >> +>> endobj +1943 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.172 347.559 346.955 358.463] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_9c118832fed4c0b9b40547578459dad4) >> +>> endobj +1944 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 308.704 246.592 319.608] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_d31eeb0067d6cad2eb2ea5ab5bd0a2b2) >> +>> endobj +1945 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.334 269.85 370.297 280.754] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_74074a5ed3718745a4d82bacd5b381ed) >> +>> endobj +1946 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [260.315 230.996 436.672 241.9] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_3e6dcd6f5d8e3ea263c9205b21a83e48) >> +>> endobj +1947 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 169.227 262.631 180.131] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_6a54c55d8b52ef353df7cefdfa632d8d) >> +>> endobj +1948 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 130.373 206.582 141.277] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_5e801a56c2c3dcec13d2d87adf07ac47) >> +>> endobj +1949 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 91.519 204.012 102.423] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_19b0ebdb3476fe1feb0f51d9328fd384) >> +>> endobj +1953 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +1957 0 obj << +/D [1955 0 R /XYZ 90 757.935 null] +>> endobj +1958 0 obj << +/D [1955 0 R /XYZ 90 716.221 null] +>> endobj +1959 0 obj << +/D [1955 0 R /XYZ 90 716.221 null] +>> endobj +1960 0 obj << +/D [1955 0 R /XYZ 90 677.486 null] +>> endobj +1961 0 obj << +/D [1955 0 R /XYZ 90 638.632 null] +>> endobj +1962 0 obj << +/D [1955 0 R /XYZ 90 599.778 null] +>> endobj +1963 0 obj << +/D [1955 0 R /XYZ 90 560.923 null] +>> endobj +1964 0 obj << +/D [1955 0 R /XYZ 90 405.506 null] +>> endobj +1965 0 obj << +/D [1955 0 R /XYZ 90 366.652 null] +>> endobj +1966 0 obj << +/D [1955 0 R /XYZ 90 327.798 null] +>> endobj +1967 0 obj << +/D [1955 0 R /XYZ 90 288.943 null] +>> endobj +1968 0 obj << +/D [1955 0 R /XYZ 90 250.089 null] +>> endobj +1969 0 obj << +/D [1955 0 R /XYZ 90 188.321 null] +>> endobj +1970 0 obj << +/D [1955 0 R /XYZ 90 149.466 null] +>> endobj +1954 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F23 340 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2004 0 obj << +/Length 1625 +/Filter /FlateDecode +>> +stream +xÚíZIsÓH¾ûWèÄØU¸Ý-ukIQsH¨ÀL‚9¥Rìv¢B‹iIYøõóz‘lËrC 3ÀI¶ÔÝoùÞ.aëÒÂÖËÞ_ãÞèÈu¬®íZã™`Ës b6±ÆSë}Ÿ`DC‚1îŸ îG"Â³ûyrwŧ" +ÿŽ/D$îC›áþI”òbM¸þ{Îg\ ˆß發E<êÓ¾Gǯz‡ãÞç>°E]æ!ÏaÖ$í½ÿˆ­)Üeaä¾u£V¥µ¸&ÖÛޛ62´¯J&϶|É¥R&bû–g;»LËõ¦â"æ…沼⒣ÑÃKÛ¨ƒ|ۃ3Ն8ãÂú·Ñ¤Ô›&y:¯Ê¨ŒóLo^¡é1„=Vo.`]U %ö&¾õCBJ­!°4>Ø6k"•'.Ï_ö¬÷C†¥â‹*)·¯U’$QQij»•ÕæÙÌ°¹¿¾»‹ŠÙ'`#锷¥(ÛF.µ¥¸(i•˜‡·¥Ê]/!´àUÿœGÂ@‘Ï4îâà€ Ï jDFȵíz4ËÁº“§úÐ4Ϊb4O*C.Î>`lgqi,=úšE™”uGpAlì8÷ƒk ¼Èód#šµ",æ|GÉÂs^V"+:pq ¢8g”¢âЀZ 5¾7ÓªŽ²©Ñ}–êG]’‹n³ „<Ø,bsV–—õi#;¢ рyÄ ½»/çU6³ËðE,æÑq6 ¸-}ˆ‹‚…Ul"ivOãG±ŽUè ×2aà~anŠe}ÍqÌ|Êïñ{â¸È%ãOã.Œ‰‹­—<í8…"ê;õ‚óÓw'/Âã—'§ç‡‡¹.ò‚†ào8½_²Ü˜n\<™I¬v³*›‚ þÃbȵÊØñtKèA$þ²Ñb¾ôãæô6ð T*ÞCÁvVƒ!õhZPa~oZ8’ög{ÖÃETY_f|‹"„*n¢$,>‹2œ È0Ü!ñB•Wrñ¨úqî s1p¼¾a IÿJWšu«*¸I³:;ë5Z}§ø\Eú´åS‡÷I”LªDm(ö§ÿ‡bÁËð«1˜€F¦m­·o±Þ·¼ü¿C³köÆ)ϔÎË»9Xþ…j!ŒÂfç>âȊŸDúr%¯á‰ŒÚ¦9o×0S. "*y{wl0j8ß[(~žóÙÀf*ØNbž•a)"ȄÊpC!GÕ4Þë"ëÇ|á"ÿ^ú^ò1m¶²Ù•×¬îË|eƒbºá†]}û&.¯ÖÄû ?{S~žñŸB÷dov¿‹“JÅ-­ÄýM:í8LýºÝGmÑjØKYÁÖAýþxÝ]IŸ6S•ÛŽrš!ǯŸïØg1Œ|èù¿_ O£ÛP»¾c°o0âqZ¥‹ÅÐmÁŠY_7±Ëõ¥I©fÍ´Ö ßރ,x^™B/‚ìYCÇGŒº5ÓÉJv?s¨frQ´šùçy +C\ÔüUÙD%ùNZXQt ío@ZmñPàa"·øˆºa•<'2*ûsØÒ:ÛC”6íܳf2¸Xá"æ»ÍI`,”:šù1ÑW3Dj=´;Èð®û³¡¶2,bÈõ@ZÒ23À<Ì¢‹„‡ÇÆÉ ä/v8²}{E‚nkÔFNÐHu\„'€ž ïzŒžŠðùŸ|R`ÚRô +ùÀAl¡ég")ZÍ hL:d y„ݧy ˜®%¯:„S×í?y²yºñ-Š}¶UºF“5è$V€£1±–IԃÂ-#ÓhÕá¯åä`…d!8‡ØŸtœ«<ê,OU—2uíOnŸ®eqГ~v·)­¡ï!X â¿ýý·¿ÿÊþîþ—-í&Ÿ§ àÑ}ž`·vú_+É»¿þÇ;½»ƒt?g’¿ÔïîÁ…D˜‹þï1¨þÙãúûë×W•þ?P.x t“úÀ6MG5®›¨3Ý¥fJpVÖ ÿ®|Ûð®àâ9˜7Ì?QVÕ͍º~ßÖt^Aè²õÛá¡V÷–×}¥–ì“UÿzÝSò‚_"KÜø÷UYÎF£››4)P•Åsâr4Ÿ'£õp¸t +t‘^sH3zMsÑôõ3ùB³\›õþÿê@:º +endstream +endobj +2003 0 obj << +/Type /Page +/Contents 2004 0 R +/Resources 2002 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1850 0 R +/Annots [ 1950 0 R 1951 0 R 1952 0 R 1975 0 R 1976 0 R 1977 0 R 1978 0 R 1979 0 R 1980 0 R 1981 0 R 1982 0 R 1983 0 R 1984 0 R 1985 0 R 1986 0 R 1987 0 R 1988 0 R 1989 0 R 1990 0 R 1991 0 R 1992 0 R 1993 0 R 1994 0 R 1995 0 R 1996 0 R 2001 0 R ] +>> endobj +1950 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 696.002 141.367 706.906] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_ga88e9b9cb2588cbf5914695fc14e69a8) >> +>> endobj +1951 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.865 696.002 174.293 706.906] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_4bef34d0d723e765fc4ae7dbd2d195b5) >> +>> endobj +1952 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.109 696.002 205.565 706.906] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_ga88e9b9cb2588cbf5914695fc14e69a8) >> +>> endobj +1975 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 657.148 175.399 668.052] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_215d809846aabbfafa5754ce051d1603) >> +>> endobj +1976 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.215 657.148 206.671 668.052] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_ga88e9b9cb2588cbf5914695fc14e69a8) >> +>> endobj +1977 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 618.293 173.467 629.197] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +1978 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [173.965 618.293 204.181 629.197] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_56eb4e32ec57658bc9e7823cd42ecbae) >> +>> endobj +1979 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.997 618.293 267.553 629.197] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +1980 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 579.813 170.776 590.343] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_03ed91fbbeb6d32952c5d2a30bfd3830) >> +>> endobj +1981 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 540.958 165.237 551.489] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_05dd6b345e96427a50b45f9756e302ab) >> +>> endobj +1982 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.376 501.73 291.044 512.634] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_03c487cbbb8731e1c7c9131a7a1faeae) >> +>> endobj +1983 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 462.876 288.633 473.78] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_fbd401e5de5c3b3b7bcef22ffbfd6fb3) >> +>> endobj +1984 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 424.022 179.554 434.926] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +1985 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.052 424.022 250.676 434.926] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_20874a85120477d5cf11da451870d497) >> +>> endobj +1986 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.933 385.541 322.077 396.071] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_93c37cc32a1f50c36ec15d67fdbec3aa) >> +>> endobj +1987 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.933 346.687 319.317 357.217] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_66438955854cf73ddaf27a40a69fec7b) >> +>> endobj +1988 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.58 307.459 192.286 318.363] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_31f5a518ab35f859aafd220bc3e38dfd) >> +>> endobj +1989 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 268.605 179.554 279.509] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +1990 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.052 268.605 272.803 279.509] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_ca6003248d614d68c07f5330b468a242) >> +>> endobj +1991 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.772 181.959 272.333 192.146] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +1992 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [353.217 181.959 448.778 192.146] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +1993 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.772 147.09 272.333 157.277] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +1994 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [353.217 147.09 448.778 157.277] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +1995 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.772 112.221 272.333 122.407] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +1996 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [353.217 112.221 448.778 122.407] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +2001 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2005 0 obj << +/D [2003 0 R /XYZ 90 757.935 null] +>> endobj +2006 0 obj << +/D [2003 0 R /XYZ 90 715.095 null] +>> endobj +2007 0 obj << +/D [2003 0 R /XYZ 90 676.241 null] +>> endobj +2008 0 obj << +/D [2003 0 R /XYZ 90 637.387 null] +>> endobj +2009 0 obj << +/D [2003 0 R /XYZ 90 598.532 null] +>> endobj +2010 0 obj << +/D [2003 0 R /XYZ 90 559.678 null] +>> endobj +2011 0 obj << +/D [2003 0 R /XYZ 90 520.824 null] +>> endobj +2012 0 obj << +/D [2003 0 R /XYZ 90 443.115 null] +>> endobj +2013 0 obj << +/D [2003 0 R /XYZ 90 404.261 null] +>> endobj +2014 0 obj << +/D [2003 0 R /XYZ 90 365.407 null] +>> endobj +2015 0 obj << +/D [2003 0 R /XYZ 90 326.552 null] +>> endobj +2016 0 obj << +/D [2003 0 R /XYZ 90 287.698 null] +>> endobj +2017 0 obj << +/D [2003 0 R /XYZ 90 208.275 null] +>> endobj +2019 0 obj << +/D [2003 0 R /XYZ 90 173.272 null] +>> endobj +2020 0 obj << +/D [2003 0 R /XYZ 90 138.402 null] +>> endobj +2002 0 obj << +/Font << /F63 374 0 R /F72 471 0 R /F50 339 0 R /F65 376 0 R /F35 2018 0 R /F11 418 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2039 0 obj << +/Length 1816 +/Filter /FlateDecode +>> +stream +xÚíZY“œ6~Ÿ_Á“Ô=ZI [®T9¾ÊŽ½É‹í¢4Œv‡,˜=üëÓBâšeöòúH²Otôùµº%°uhaëùä·ýÉÎ3îX +8åÖþ`Ëã1J¬ý…õÁ&‘éŒ`Œí½)Á¶(V"ܛRlgÉÙR. +¾Šç…(Φ3Ê°ýF¬d™‹Hê×wò@SâÛ2UŸˆçú®í±é§ý—“§û“Ï|`‹Ôt™‡<‡YÑjòá¶ðý¥…‘øÖI=je¹Ôgb½Ÿü1ÁFܗ…áž,„xˆÃ :s¦úH©&ßÌ«'y(ð0Q“|är:êÁ•\剨¤š°ó xëÆQ¹nÐ |¨G Vâˆù¼]é,—)èF«eŸèçýØè¤#䂸Û,ökK­vF(CÜcÐ (`FÚ§©˜'2|q gқáˆút ÁD£84Vy÷üœN)¤•êE¾U<¥Ì>žfËðm>^ÊèHùŠ\l(z@>pë4ýpD¤škF€ÎÎË@ò»H/àS™vw¯"Yƒ®]Îí{÷¶ˆý•ÂƒõÙ¥ÒµšlŒ~KÒ=Pc­™b.1ϲd„ňb÷´”ÓêQƒ^H:Á5øBEX-E:²,°ÈݖðGÌp”¥e5ʽS•~5}g0‰ ¬¡$ïV’ƒX~pý;èßAÿûB?‘efE(?¯E2²&dzÛÇ=´ð;Üßáþ÷?÷[öz— /pnó9L8òûuu<ã½i¾®fo×<ôŠosYˆ*+Êó¢g¹J§ðû?SPY0î»ô¸á9È÷¼o6ön-l—‹àXc¸Â f÷f¸š©¢õ¸®yãÅÈڌÃNÆo€£Ñ 4sÏeÇáb½Ê‡û›êõkà”Õbw7+«BŠÕ´žs¯4!€‚½0§CûöÁd°T]€%‚6 :´!â9j¿A$=Rê…j6ëÖAVèF +¶>6NÚ|‹”ÝÁâJ‘Æêh”úÎ(w < bžûƒ!ÿF060ÿ>(¡ÈåôÇ1HÝ-û#ˆzìë^Œ?ŠSb×L2±Ø„ p‚ó‚À)¯!¦Þ¯ 1˜åÀnÌêíŠx7AV3ò @¶mût ¨6ÌNM"ýZ®²æ ï}üŐ~‘–¹Œª8Kõû³uZ¿Ýí¨×‚ò¦‚ ›Ü¾{Ž-é#Çá—-Ù!x Ê7M>·À) öªvœ°Ÿ {àÏ£M?ðo%-e]*]e•HBÃHœ†ó³J–£J¢(è²Ù.GÕÙ5§ C24t³ŸŽ”£ÚgÂjô§qs +â:×ösvõ5·dƒ^pێaòšŽuӍòÆMGOè`+O+uåÂ`{¸Š¿Ï¨G`º34êfiöu>®.Œ/S×@JŸ#Ïsog¾õ˜i• £D”eSyŽ(ùréñš†T·]AwºpI)vQî©-?ÿol¹EÒÍŽ:êÀ  í@Řݿ¦µE«¨}qŠÆ›u¹ÛnOfÚ-rK bȲÈT=©¯‘ømÚgÝó :ñ±3v˜û4iÆèò¶Ê8‘ó!æ"]di(•9NaS,ûõP”­òu%Î篗åï,@XžA­L›âô‘6PžÅ©2¿>øÍôS˜lY*ÆO#™w t6ÿòit¥S.Uꃍ\HKXïʾ½´"+*1¥ÃYFE¬IW(®‹Ç5¸Ø_šdA¦U\˜vÒ¿ìËö lDӆL#cµlF¤ÍohÄOñÐAkþ©á¿)& ÿY´^;¢‘ á™õ§¶Â÷0-E¡IÓ ”ö’æÎÑüÁöêµIÌ%Aìî‚{¥±p;p÷]¨§}eºú'ã0ïdµ.R£3Ñq.¢Ö ÜŒÓÃVï`Ý´}¯‹íí½Ò à c6jÔÕ§§MLˆÝ2M¨N ÇñB–º7N¡æ\ cø æY}~ +MM¦išðE#©(at] ÍÞ)¼¥‡Ãj'":ÒC²C"U˜én3ŠB¤Õ™î>YŠªÌd‡ÜbêªË•FÈ^.£‰¸®ýøþ}ÕplrE¡?¯ËÚo¡Uû-ôϕe×qÒ|Ö 8­ósV_ã¸̖²ýÉ®]È<+ªþB‡¥î¸£í,§•dّnéòºÖP6LöL0 ›ÑpˆIÄ¿êO4ÍO3ªˆõú eŒ¹A`OiYù½ym_¿þú³”Å/ÊçŒ#¿©ºlÑsýP û± +šB(Àö{Ùq-ّմ~Wõø%¾‡ÜÂsYUùîÎÎÉÉ ŠJ´Nã¼@qµ“çÉÎù½®· +„íãí ìÓFü‹ôÿ…Œ4 +endstream +endobj +2038 0 obj << +/Type /Page +/Contents 2039 0 R +/Resources 2037 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1850 0 R +/Annots [ 1997 0 R 1998 0 R 1999 0 R 2000 0 R 2022 0 R 2023 0 R 2024 0 R 2025 0 R 2026 0 R 2027 0 R 2028 0 R 2029 0 R 2030 0 R 2031 0 R 2032 0 R 2033 0 R 2034 0 R 2035 0 R 2036 0 R ] +>> endobj +1997 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.772 708.674 272.333 718.861] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +1998 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [353.217 708.674 448.778 718.861] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +1999 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.772 674.475 272.333 684.662] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +2000 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [353.217 674.475 448.778 684.662] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +2022 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.772 640.276 272.333 650.463] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +2023 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [353.217 640.276 448.778 650.463] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +2024 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.484 571.504 272.045 582.408] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +2025 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [391.209 571.504 439.139 582.408] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_9bfba21dd2d808e2eabd2348e92cb96a) >> +>> endobj +2026 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.183 513.412 269.744 524.316] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +2027 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [377.225 513.412 419.615 524.316] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_3504c6384a7e40501e2cfc49ba870ad5) >> +>> endobj +2028 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [272.771 423.458 350.579 434.471] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +2029 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [280.813 389.259 358.62 400.272] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +2030 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 367.015 202.902 378.028] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +2031 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 356.726 202.902 367.739] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +2032 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 346.437 202.902 357.451] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +2033 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 336.148 202.902 347.162] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +2034 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 282.562 182.234 293.466] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Throwable) >> +>> endobj +2035 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [219.892 282.562 358.581 293.466] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g00a906832c41c42a70a5c9d194e07a7d) >> +>> endobj +2036 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2040 0 obj << +/D [2038 0 R /XYZ 90 757.935 null] +>> endobj +2041 0 obj << +/D [2038 0 R /XYZ 90 733.028 null] +>> endobj +2042 0 obj << +/D [2038 0 R /XYZ 90 699.987 null] +>> endobj +2043 0 obj << +/D [2038 0 R /XYZ 90 665.788 null] +>> endobj +2044 0 obj << +/D [2038 0 R /XYZ 90 597.868 null] +>> endobj +2045 0 obj << +/D [2038 0 R /XYZ 90 541.798 null] +>> endobj +2046 0 obj << +/D [2038 0 R /XYZ 90 449.821 null] +>> endobj +2047 0 obj << +/D [2038 0 R /XYZ 90 415.861 null] +>> endobj +2048 0 obj << +/D [2038 0 R /XYZ 90 381.662 null] +>> endobj +2049 0 obj << +/D [2038 0 R /XYZ 90 371 null] +>> endobj +2050 0 obj << +/D [2038 0 R /XYZ 90 360.711 null] +>> endobj +2051 0 obj << +/D [2038 0 R /XYZ 90 350.422 null] +>> endobj +2052 0 obj << +/D [2038 0 R /XYZ 90 300.865 null] +>> endobj +2053 0 obj << +/D [2038 0 R /XYZ 90 246.515 null] +>> endobj +2054 0 obj << +/D [2038 0 R /XYZ 90 188.417 null] +>> endobj +1971 0 obj << +/D [2038 0 R /XYZ 90 166.105 null] +>> endobj +2055 0 obj << +/D [2038 0 R /XYZ 90 166.105 null] +>> endobj +1972 0 obj << +/D [2038 0 R /XYZ 90 89.441 null] +>> endobj +2037 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F35 2018 0 R /F11 418 0 R /F72 471 0 R /F23 340 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2062 0 obj << +/Length 2039 +/Filter /FlateDecode +>> +stream +xÚ½X[Û¶~÷¯ÐS+5—¤îûÖsÚÛ[¶É(‚V¢m"²¤HTÜô×w†Yòz/(z΃a’"‡3Ãof>’z;z?¬þs·ºz^F²˜ÇÞÝÖ˨—ÄŒDœyw•÷Þg”ðõ†QJýÛ5£~ÑŠüvÍ©ßÖ_ö¢ê‹ügyßý—ëë›×ùëNô…jûa½áõ-bèŠR˜î±ýš¥¾hpˆÑ$ü$^¸ûqõýÝêӊVÔcZ‹(!Iyåaõþõ*ÿÑ£$ÈRï¨g¼ð_{oW¿­è“ñ€Ð8š,b„OV}F«ZY Ÿµq*×&´cSÉf—o×<òÛ>¿½ýوøƒF~ ­U¢™*…½“՚¼—M-ñÁ̌èlæÆMÝ°„Ä<4 Þ +e«öÖ¥¯nߙFo2½C[Ù CëVêlí¤rq?¨¾(•l+ÿ¾„uIÛ8»hÐjÚ¢kec%6ãá^¸3?j‡öM¯lû^”ªþ²Ž#Ÿ ¥`ý¨»½Ô+™ïþCÛ¶?˜_Œª=ÀÆeQƒ3¤ìŠF*YÔò¯uß(yd½ ÷ÿ “­ª ,v¢·c£Í\nØQ¹ÝÚÆm"·˜‘ýÎBóÍ+ï½þދ.ò~›É2F²(6–sw,sTL`Ղ¨¿/œ×…°Î™ˆ«Ï²£¸L±¸šCö 8aY¸@xðÏnMÓ 0ÏükkfÈí,#)^„v;Õ#úçhwž”jƓ{Vvâ9éۇr²ßnä± S}(F8s8ƒáΠ§µÁÿÁ̃xkëQ }²0ވR xßtU{’ýAÎFS&2YèQ¤ÄÉЇIï¢Y³È·»cV˜ƒÙžÆ¿”#txÒ)è©ïþAO=õ]þ‚MxsôÅ2í‡6(&½ž‡m7æå^”s@ïŸàgÏ“ˆ$ÙKpog.ÀõÛ(z)fÈ×ë>[¦„Ó 5?©V¶‡nTØ7Mĉ[<À¼q0(ß°*?—aøF¨±Ç3ÂÔ§ø—ajÔ])80ßR™¿VBŸ™4ˆÇχý$ðÙR. ögRÒ RÐò¥œÍ™ Ó3>Ío à.Á\6ˆÂYRpø›½üÓr!ëâ¾/OÅуTŒÊ¼Œlh]Š:>õÊ%ãR0˜wEKç"”‡,!<­óÆf»Jk™EK-煪»`HH²”9”<t‘rþ ³ò{ð,›²gL³Ý“}ú¦|gdë€õŽå:ŸÆÂ%ø¾mÕT7˱Ö‡Gˆ]S(Üf÷B§r ÉËðZ›‰«G%šö ›Ó‡–Zsv–²ŒÏð¹›y˜šÍMü]p¶n¹yÝ'G$;qKÑ<æ°eDßl/ˆOIfO‰OH–Mûk;)×3-à—ii_ÐÀpµýØ^Ú1%a4%¢›_ïò_¾ýýÂÆ! , ݼoŒÄÁ€Go,LcØ~øjÁ-hÌÀƒxð‹´æà±I2ŒIòeÚ¸h ޝÂg,YÙT±Ï3`H<"”Û¸ýþÏRtZµëÅړŒEÔ³”$…ìùƒª®¯e³!7AI­ò¢ßÖ¡8.uYhÚlÂÊݾo1)]¼„®èh̞r€!NðY»^Søk„=¥$ãé a,œ­}lŽ‘›zG„§‚°4ùŸ_j ©‰‡Ò·ešuíø*Ô׫vTðg9×rŸ)ñAÐ5ï<û¨‰r5N¥ЦW–ÈO²{À]•s»köœGç4jÄ•DŽø(· Xâû¢Ë'9øo^ì`ö\¬þþÕЗv9rƒ <ÕC½@6¼U^Aí/LH1ÀQõ¢²—;h¶Œzôs?¨Ë^^‹f§E¶àDÙ²fEÍf>àè'çÙPÇq¨ PL°tBEmÅz§d-•åÅó;í¬4NEõØ#é)ºn¢åî¢ƒÚ gwÃ%yDµeR +2BáÜÀ°(8E a6^¾ +¸’sÃwb({Ù=ÂKÿÿȟx@4‰Bó0„ܯÚF˜|FÁóŒ‚#–ûB 4Áÿõ:Š|·~¡3NšéŒ*+®i•[y@be3ïölq¶é8ÖÇüƒÜíí&†.›ä}NlÑA2qq|'‰³Ô¿iÌðV/Õ<:dÌp֎€ÿ=l¢Yw‚¼²–qºáá©{[ÂoÓM;{·[eFn®^›†s‡é%6¶†Ñíl,…>Î f©ÞÅü•µ—°×puD¤PXü×h'°#-´p{¨ñPW*L,ž\ f23¢C ÷²ÜŸÉӏiøÑ؈;œlDqúhá;PÆqgW—…UKƒo^0¥½‡²±]”¥á[ p‹ƒ½T¿Bß»ð·7CW ›“ +ËY%>ÈIý¼„s÷µgºˆûóGÙÒK_ú&«ßb!Ɓ/%PÌ[l”‘(:'Þ·:CA]µ]WXM×VWÓyÀw¡†ý_Šftük‚±©?]"à) ³­uÓ[áŒ4–}ô\맕æ'}83GöJu×WWÇ㑔ÙõDª+ÊÕÃò8“©;™„L ú0{Œš.äÜÿÛ)O¡ +endstream +endobj +2061 0 obj << +/Type /Page +/Contents 2062 0 R +/Resources 2060 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2071 0 R +/Annots [ 2056 0 R 2065 0 R 2057 0 R 2058 0 R 2059 0 R ] +>> endobj +2056 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.893 684.664 513.996 695.567] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_6c841f33162c2419bd53a078e6c788ee) >> +>> endobj +2065 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 672.708 155.753 683.612] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_6c841f33162c2419bd53a078e6c788ee) >> +>> endobj +2057 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [325.473 605.265 424.869 616.169] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_63bd7c7767faf3c219f9c2762095e2dd) >> +>> endobj +2058 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [156.932 246.556 206.516 257.459] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_1_1IO__Operators_9ccf426c9d89537e0351aac50a333e95) >> +>> endobj +2059 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2063 0 obj << +/D [2061 0 R /XYZ 90 757.935 null] +>> endobj +2064 0 obj << +/D [2061 0 R /XYZ 90 733.028 null] +>> endobj +1973 0 obj << +/D [2061 0 R /XYZ 267.991 675.861 null] +>> endobj +2066 0 obj << +/D [2061 0 R /XYZ 90 659.134 null] +>> endobj +1974 0 obj << +/D [2061 0 R /XYZ 484.685 596.463 null] +>> endobj +2067 0 obj << +/D [2061 0 R /XYZ 90 579.736 null] +>> endobj +2021 0 obj << +/D [2061 0 R /XYZ 199.727 517.064 null] +>> endobj +2068 0 obj << +/D [2061 0 R /XYZ 90 502.394 null] +>> endobj +1348 0 obj << +/D [2061 0 R /XYZ 90 350.985 null] +>> endobj +126 0 obj << +/D [2061 0 R /XYZ 90 346.377 null] +>> endobj +2069 0 obj << +/D [2061 0 R /XYZ 90 265.529 null] +>> endobj +2070 0 obj << +/D [2061 0 R /XYZ 90 197.28 null] +>> endobj +2060 0 obj << +/Font << /F63 374 0 R /F65 376 0 R /F50 339 0 R /F72 471 0 R /F95 1788 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2078 0 obj << +/Length 1840 +/Filter /FlateDecode +>> +stream +xÚ­XMsÛ6¾ëWpzh¥i Á5í¡Í›Lúé&î)Éhh +¶9/E²Y×íô¿w(’’\7ӃM»Ïî>» n¼Z|}µ¸x‡AF²˜ÇÁÕMÑ ‰œW»àݒQ®ÖŒRºÔÝnµæ‚.Ì÷R·y!qúFÞHµbéRÖv)I#¾L’Õ‡«oÿ»Züº`p ˜•-’„"(ö‹wh°ƒõo8"Kƒ{»kD<„g¼]ü¼ NÏùõAB²„2£7£a<  +o¬ò½.ëÛÕ:åëƒÎfz™«}¾½lª‡;¹SùöûòZåêa³yýÓö§Vª¼k”þ˜pñRÐ>k†ç€™D¤ žs¿btÙô•ÃG÷7+.–ï)壛Fá`ßèG½–š¬Ö!|úºö/•Û_4û¶’+&–¿;™e×ç]ÙÔú™?¤¸ÃQ®-ÔsŒæy½¡YŒz ®C@¾1C•—u·}û ;¹ÿ× Ï/ñA±¨À ëŒDè¢iÞSA M®åmY›1ü±g^‘õî°h€Ÿ2ÆPJ„R%óý¶ìÐÏJ}e¥7}ç$~òž…Qý‰gþNz*‚H³©§º;éÀ2©n]d¾yµÞY0/ 槃c‚²Û^OSaß{ï^K零˯«œ¡G;Cîœï¯îJí|ž×ÓowM-»0ªªÆÄÖ½Þ|¬ÓŸ– øòO몌pÑØßøþõ¾m”‹ ¼ªp`0¶pWÛ»·O*œ‚K›Ùî=øÙ©tùý,iÉ8梣ä'ífãzþCu}¬ÿ_/æ2;ä„eb ?N¸#À—}]˜D_¼hŠ~/ëÎf¥×G$Œ²ñ·„ès³p¶ZGœ›P£.ÔVz”‹6›{•·Ûñ÷˜6ƒÍôHþ§h$˜r0TdŒd™§UáEQÆð‰ÝjOðe_ëò¶–»²؛1¿¿„2Ùɶ»;!\„$Òÿw¹ßß*ycГJÉÝÖ­Òݶ*k¹­d}{òDþˆiøßiZcx…"&,âSdϪÁcBù Ր×)îr»Ö,!1wÿKWVeç˜äf‹Cy±Ùd&ZZ +fÖÜàÓ¨­§Kã$2á“yn@(ñ)ä¢2Øú,Me)I(2<©à§"pôåH,J´àuÓ¹Óks5#ë`g‰o_C0%³‹1Âþ€èG™?'ÝC V³å³yŒR¨¦ºÁ]Kf»ÍE¼úá7¡€æҐdt(ãûö-âtl)ôÜ<ù§DŠI +¿Aگ祅$ɆPnæÀx¨ðÁ§h”¤Q4#OKPšKßUø˼’{ ™ G÷zÝønЯÐ`ãÃ9q£t²®f]ÊPäà²-–ŒbÖ¦—0ƖÓLšÿjü’±ô©?ÚÙçޘdI˜º\ÂE4+Êã²*¦e¦‡² +“_ ø|¶^8ÿ!¯û¼ò혠®rè¡­¦ÄÜ¿‡ +E—o¥ÿé-ûàGß!¹ôe&èpI»ëºvsqqO +Múºl)»‹¶­.Ž™d$…E$„Œ~TÃUÀt +–&Žðÿj‘žZ +endstream +endobj +2077 0 obj << +/Type /Page +/Contents 2078 0 R +/Resources 2076 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2071 0 R +/Annots [ 2073 0 R 2074 0 R 2075 0 R ] +>> endobj +2073 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.669 620.713 211.204 631.617] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library) >> +>> endobj +2074 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [247.033 177.306 284.891 188.21] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_9a28ec8161898b61530de9bbb4a3251d) >> +>> endobj +2075 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2079 0 obj << +/D [2077 0 R /XYZ 90 757.935 null] +>> endobj +2080 0 obj << +/D [2077 0 R /XYZ 90 554.929 null] +>> endobj +2072 0 obj << +/D [2077 0 R /XYZ 90 531.337 null] +>> endobj +2081 0 obj << +/D [2077 0 R /XYZ 90 531.337 null] +>> endobj +1349 0 obj << +/D [2077 0 R /XYZ 90 324.955 null] +>> endobj +130 0 obj << +/D [2077 0 R /XYZ 90 320.347 null] +>> endobj +2082 0 obj << +/D [2077 0 R /XYZ 90 261.811 null] +>> endobj +2076 0 obj << +/Font << /F63 374 0 R /F65 376 0 R /F50 339 0 R /F95 1788 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2109 0 obj << +/Length 1702 +/Filter /FlateDecode +>> +stream +xÚÍYiÛ6ýî_! @j1—‡¨c‘È)6ͱÍ:mƒ$0d‰^ ÕqÝ_ß¡DʗìõnÝl¿X‡ÉÇá¼yÃ!…[?÷ÎF½“—3\äZÔ2FSÃņmÄ)1Fñ©OÈ`H9îŸG^Q4·©_Å")½2L“ÁB­¾í ¾Œ^õ.G½¯=ØØ 5·‘͸áǽO_°ÀûWFÌuŒyÝ*6LÊà7½_{xÃ.b"fZTFÂ_F0ÞcØӀär^ƒ`cHa®ÔÑH£\î{y썯÷Óh1Aî_‡“Ü˧§g㛙—‰ܳKC6w¾†}Ö54¡»L7uÁ 4´M~ډbê&+S \Úqy¥hÞ¼S‘ˆÓ‰¯¬æx…é!µäbn¤—ÝòEÓy’VI ‚æ!§ÊûWCÕï +é ¤Lä+°àbb#‹š ÞaâGU  d¥%§¹[N[łØ»Tƒ,‹ÐlցÃ8r,kÛm+Sumdf EÄUt]M¢Ð×Þ³Íþ"EÄ: +7F,d2é.Š,…Ÿ)åk}ŒOCáTX ¦½i!5‘ß*q¼¯ÛÊ¿ýTÔþýŒ1õCß±ì=žx…XƒÞ¼ž¼´©Z–Y!˜eRð¾‰\Sy4St% ‹\϶F®ïä@Í]•I-Ë»ù Úޟ툈(XÌ®K…Ÿ×¼P]¤‚ª0*ÑöoÄ£š¨Ü%‡¹w¯_ßnŒ~/÷ÍóŸ1ÇB:ä¯RHGÂ3éàdÉDª¢¦Ôa2KãTæ§[ù#‘VÊí¥È㝽Ä×ʋÂ2ÔBN1 “[ÅYs9»¸éæiSDÌE2[˜ nnk荈'õýË*ñe>šž¾ÕI9 ö3î~Žƒ*Î614Kïû`]¹cÞw²û{–Ú­eÚf®e'f"ÇÖ)©(ƒÓS_äyÓp cdñ6ÇyJƒ/nί®šÛFXYs)–Ë®"½FtÝD×Aæ(gö™ÈÂmê-gaÑa…2€´@÷Ô2dZXû󱸭ݜe.<%Š'ÅãðÝáL¹$’G¡Ù>€fú0–‰ã"Bäx,gy˜”ÿ±x¯åE‡K¡"–y å@eÓ$ñâ"JœCóC U2yo£…–ÝFWš‰Ü+S…֊ñP@³6hž=ëP–ÜP°?LõлZõwÄ$M£C$¥^°Wòa‡ä¯a,)s‹ô§ùÀäý4î +XM¶_í6ekjD­v‹îV;4“óò”YcDPùuo&‹=>äeš\K‰õ@^üDI€¶%TǼþÛK‚ÆÔBtj…a öQöÄ2dE&&Àì¸Ú‡x¾ŸÖVòÑbÀ9Ä"ì5徦¬ò¤èͶWõ[æ•Ø¥ÍV+¡*›ŠÊ‡Z¶˜VÑÓ®i8°ïlç1õ¢¢م°hE…X>¡!á÷UÆȶùþ¬ÚRV±ˆÓ|1.¿EW!»CjeZzÑXõ “ñdQnl†ŽŸ‡5‘ëukm‰"栋Yµ³X´ËðVÁÛ¯þôý* õ®¥ÑÌf²‡6Mç±ë$Îa%°¿+×uHÂn$Oþ'”?œçØK¼åÆhÝÄ ;ÖãÖK”YÈáü°õŠFÇåþ%ræ³±Ÿâ{§6ŽŒ'a9híÐʨi[‚¬AÀ¶}$"ÕÝ®=-µVƒ!s7Õô\:*¯|(¡Š§ªP/Šð6‘G‹êÅÍÜ˔3vB÷Ú»éeP¶ËJ À¹¯ÞWÏ »ÈÞ+°Š‚ñÔÛyBõOªxܶ*žã§ûï¢Î"·"‘µ¦_FBz§ øÏ0 žx{õÛåû›Ë{g²$ PÐÆOgUë!X%á7yÈ 9DŸž¨gå¢=àؑJŠLø¡<Ñ©£È<}ÀÙúâ‡XDl›àU ï fēÅÀâý;˜=Oã,jֈ°\Œ›3æ0­Ýóo?ŽÏß½¹~}ùÇÕèã¿áù®û<æý4[ ý¥,Dîüæ‡yÖ ‚;ð;Dýýˆ…×fŽúüÀ]ÄùæñÞµt€ün õ‡ƒæQ}=h>"ÿQ²*†ßxI¥KIî7 %ò¢Ý÷c1•®T¥ïÐ´63ûÓÐw¿ô꺴—86b¸]§fe™žœÌçsäd“å(,O²,:ÙÎV+(°Ø-ÈT‹ àvÁ†—q½{Yçüÿ€zgÌ +endstream +endobj +2108 0 obj << +/Type /Page +/Contents 2109 0 R +/Resources 2107 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2071 0 R +/Annots [ 2084 0 R 2085 0 R 2086 0 R 2087 0 R 2088 0 R 2089 0 R 2090 0 R 2091 0 R 2092 0 R 2093 0 R 2094 0 R 2095 0 R 2096 0 R 2097 0 R 2098 0 R 2099 0 R 2100 0 R 2101 0 R 2102 0 R 2106 0 R ] +>> endobj +2084 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.857 593.151 243.473 604.055] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_cfed8bc19e046453778c9d99d84df283) >> +>> endobj +2085 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.279 554.297 155.464 565.201] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +2086 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [155.962 554.297 221.894 565.201] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_12dc6df3a06f4c97c6bb2264bbad05ac) >> +>> endobj +2087 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 473.534 181.845 484.438] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_edabe8ecd0866b972e97709e17f94681) >> +>> endobj +2088 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 434.68 181.845 445.584] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_82b35fc075e1e9542d4cc5cff2e236f8) >> +>> endobj +2089 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 395.826 154.727 406.729] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_93c1c491c0035f6c38b9ee036184aa7e) >> +>> endobj +2090 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 357.345 176.505 367.875] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_1a6088f536e9340145630576cfd6e6b9) >> +>> endobj +2091 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.408 342.35 450.955 352.256] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_82b35fc075e1e9542d4cc5cff2e236f8) >> +>> endobj +2092 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 307.158 191.718 318.062] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +2093 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 307.158 288.852 318.062] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_033967c42f02b6029fc4d6153eb8072a) >> +>> endobj +2094 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 268.304 191.718 279.208] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +2095 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 268.304 303.079 279.208] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_25c5ef784f17646705c76a5be6c724a3) >> +>> endobj +2096 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.635 229.823 188.679 240.353] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_e0a1b4b4a344cad01c58e8e006a7ff16) >> +>> endobj +2097 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 154.042 170.255 164.946] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_ab3964a5c29992e6476852c9d246fe6f) >> +>> endobj +2098 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.071 154.042 239.714 164.946] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +2099 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [323.878 154.042 409.266 164.946] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g616fcdc7600a3a11a8a9152e75730899) >> +>> endobj +2100 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 119.173 170.255 130.076] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_3825b4905d72422089bf28d3c95c2964) >> +>> endobj +2101 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.592 119.173 242.753 130.076] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2102 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [260.317 119.173 335.783 130.076] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +2106 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2110 0 obj << +/D [2108 0 R /XYZ 90 757.935 null] +>> endobj +134 0 obj << +/D [2108 0 R /XYZ 90 733.028 null] +>> endobj +478 0 obj << +/D [2108 0 R /XYZ 90 712.582 null] +>> endobj +138 0 obj << +/D [2108 0 R /XYZ 90 712.582 null] +>> endobj +2112 0 obj << +/D [2108 0 R /XYZ 90 610.222 null] +>> endobj +2113 0 obj << +/D [2108 0 R /XYZ 90 610.222 null] +>> endobj +2114 0 obj << +/D [2108 0 R /XYZ 90 573.39 null] +>> endobj +2115 0 obj << +/D [2108 0 R /XYZ 90 492.508 null] +>> endobj +2116 0 obj << +/D [2108 0 R /XYZ 90 492.508 null] +>> endobj +2118 0 obj << +/D [2108 0 R /XYZ 90 453.773 null] +>> endobj +2119 0 obj << +/D [2108 0 R /XYZ 90 414.919 null] +>> endobj +2121 0 obj << +/D [2108 0 R /XYZ 90 376.065 null] +>> endobj +2122 0 obj << +/D [2108 0 R /XYZ 90 326.251 null] +>> endobj +2123 0 obj << +/D [2108 0 R /XYZ 90 287.397 null] +>> endobj +2107 0 obj << +/Font << /F63 374 0 R /F21 2111 0 R /F50 339 0 R /F65 376 0 R /F11 418 0 R /F72 471 0 R /F99 2117 0 R /F98 2120 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2168 0 obj << +/Length 1716 +/Filter /FlateDecode +>> +stream +xÚåZms›Fþ®_Á'Wš‰Î÷Âq6™©—I'n¬Ì4g4XBS ( Ëê¯ïH(z±b'ÓO’бìíóìîsw`cl`ãuë¬×:}e1ÃAŽE-£72l‹ N‰Ñ_ڄ ÒéŒqû²Cpۍgnÿ²Cq;œ.'Þ0vûïü›Ø—OŸž½è_MÜÈë|í½=}EȚYâ˜H86<4³ú[>¤òd‚5‹= ƋÏ·Y8ŸºIÒéRŽÁ˜CÛÞ,šº©—_ù荼¸Cì¶ à’po Gšl½ìµþi°‚ ’Eƒ $ใYëËWl áú[#“Yd£f†I|N«ÖŸ-¬"‹×#Ìñº—D î”!lñÜÛkJyöøâ¾ì&‰¼ÉF¦UF/-撅|[£™¦³æŠ% qÛ*--#/pg**Ÿ4MŒ•¨·òØÄc¤¯7§Ø€¶E.°ÇájŠëì(§i|éçs<ƒ$­±Ÿ #z›L#&â˜|‚u"Y¼ æ'=ÓVž×X(ƒr²ìX¼ý¤ÞuŠYû<̼áí;?]ösvj"1¨Œ{öûûÏýó—ï^þõ¦÷ÂD*7­b (pı,3‹?¡6¦)¿*•Ïæþt¨RÂÍ?d̽øÖMý[Of÷“üò ïõæ ×ÍJ$¶»KlÄy ýf<êžeÂB‰9MB1³[:srÞ5d¡ÎŽBQÆK“[]9Bn› °6ä÷þyBš¶{³ çiµàª0韭§ÅþPßÇàŸ¹4ÖA$çõ0úÿ,bßi+‡}¤î8 ÜékYËA›Ö²z֪鳐Ɩ°‹TÅÆI˜4PÜb'ŠË™6T(À¡öCW¨ 9^,c)3P”|̐Çï‘★뤹è„Q®ÁŸÝ£è5>~¹wEbÈ1U]è x⏃™U(Z㥯9CgͪÜ=\IkŒ™F¿Ïñª¼L|l§ rºÜÚqƒ¡Vþ#Ë!Mr¯0(xt£f9ôa†‰]?)à¦þÍԓÜS/Z,ìŒV1kè¤Ès›mɖm«ãd‘íáFu4©½û;²ãjáF‰sPãdÈÅ^/üt¢ÝµÚ óšNöÑXºIé@Rn!bn#©®ÙÒõ­ûŠ4¸Æ kڔ@b¥ +¶©¼]i!“šUB¾ð’4ž² B¶´€•ÙÊQD—Y¡ºL ^g†/¼Ù§ +Ý«y0;©I±JuUM|æŸïCuá"ú£åÆb¶f'¼ÚÖ2ù¡*ºäG_Ê«í÷dÕ%r^¿¼³šÕå¡u㣗ÎãUü6y]Õ¹åÿ·Þ l6™¿ùW/LÃÄƚ¬&¶ é(Ž‘×°^$îPÉ$Æ÷N´{àéŽäæKƒ‡‡5ÇA¬fV–E¬‰ou–át$°st=á+6ÂÒ&]þªԋ~²~¾’­lÒ·±qÄVPl]ƒG¨´Í¡ ؏Ìc†AÕÐ0›Ï_jã7(oK¾…¦,¹»ŸÎä zÄ5uÈäˆq I$øÝ»6¶ùÃ7óæÿë û¤]déÇQqµMdçqq¥Œ!b‹{àÚpÒ֔–ű×!hn¾«aٙÔÙñUâÕ 9‚Ùêå¹×Í͍uëeg³¿âÛ­Œ+0Äp‰ø$M£§§§‹Å 4ü(F~zEÓÓouâš«ëÒȨPG³0VÓ÷¸˜ü£Íøÿ÷:Ÿt +endstream +endobj +2167 0 obj << +/Type /Page +/Contents 2168 0 R +/Resources 2166 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2071 0 R +/Annots [ 2103 0 R 2104 0 R 2105 0 R 2127 0 R 2128 0 R 2129 0 R 2130 0 R 2131 0 R 2132 0 R 2133 0 R 2134 0 R 2135 0 R 2136 0 R 2137 0 R 2138 0 R 2139 0 R 2140 0 R 2141 0 R 2142 0 R 2143 0 R 2144 0 R 2145 0 R 2146 0 R 2147 0 R 2148 0 R 2149 0 R 2150 0 R 2151 0 R 2152 0 R 2153 0 R 2154 0 R 2155 0 R 2156 0 R 2157 0 R 2158 0 R 2159 0 R 2160 0 R 2161 0 R 2162 0 R 2165 0 R ] +>> endobj +2103 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 707.957 170.255 718.861] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_fad498a5802a7928442fd0d4b8c6183f) >> +>> endobj +2104 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.428 707.957 241.589 718.861] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2105 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [284.612 707.957 360.078 718.861] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +2127 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 673.088 170.255 683.992] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_128b2fafec11e096e41f78710ba2ff0a) >> +>> endobj +2128 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.592 673.088 275.419 683.992] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +2129 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 638.219 170.255 649.123] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_15b3e8152862a6b98ecf1c4f4a142634) >> +>> endobj +2130 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.592 638.219 282.045 649.123] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +2131 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 603.349 170.255 614.253] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_dbf2609849c95cfb7277df1edc69534f) >> +>> endobj +2132 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.592 603.349 273.736 614.253] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +2133 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 568.48 170.255 579.384] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_faa5d6b3c1b3b83161b619c28c5f9936) >> +>> endobj +2134 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.592 568.48 245.522 579.384] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +2135 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.715 568.48 344.181 579.384] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +2136 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 521.656 170.255 532.56] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_a07f93a685253eb04edab43b5ebd27b2) >> +>> endobj +2137 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [214.222 521.656 232.822 532.56] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +2138 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [249.383 521.656 282.11 532.56] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >> +>> endobj +2139 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [347.546 521.656 423.012 532.56] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +2140 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 474.831 170.255 485.735] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_25a2d683973c6c6901e47c4fe90cf2b1) >> +>> endobj +2141 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.592 474.831 217.846 485.735] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +2142 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [247.126 474.831 322.592 485.735] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +2143 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 428.007 170.255 438.911] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_df78023ac662762ffc808902b970597b) >> +>> endobj +2144 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.591 428.007 279.86 438.911] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +2145 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [350.861 428.007 426.327 438.911] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +2146 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 381.183 170.255 392.086] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2147 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.995 381.183 221.801 392.086] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_bee6d42dd6f94979bcc7fb3d51102864) >> +>> endobj +2148 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [249.138 381.183 294.299 392.086] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2149 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 344.321 167.466 355.225] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_9bf45a32e428970068f654258dd7fb0c) >> +>> endobj +2150 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.281 344.321 216.442 355.225] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2151 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 307.459 178.004 318.363] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_a78a6abbbb3c425992ca644f732e69e8) >> +>> endobj +2152 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 234.044 190.738 244.948] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +2153 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.236 234.044 261.85 244.948] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_8101d965bc32e4ab1df6aa445730769b) >> +>> endobj +2154 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 197.182 190.738 208.086] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +2155 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.236 197.182 262.159 208.086] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_d09a9ccc89ace499a888b6b1a1f4ce44) >> +>> endobj +2156 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [329.225 183.558 390.082 193.463] +/Subtype /Link +/A << /S /GoTo /D (main_Affine_Independence_and_Affine_Dimension) >> +>> endobj +2157 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 160.32 202.922 171.224] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +2158 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.42 160.32 248.58 171.224] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_1e645f35cbeedf3341428988157f71ab) >> +>> endobj +2159 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 123.459 202.922 134.362] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +2160 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.42 123.459 296.181 134.362] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_24fbe68af11e373092f23f59b6cfd3e1) >> +>> endobj +2161 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 86.597 209.547 97.501] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +2162 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.045 86.597 261.831 97.501] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_c7f89b09f6755cdcd97daa3a92522b00) >> +>> endobj +2165 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2169 0 obj << +/D [2167 0 R /XYZ 90 757.935 null] +>> endobj +2170 0 obj << +/D [2167 0 R /XYZ 90 398.283 null] +>> endobj +2171 0 obj << +/D [2167 0 R /XYZ 90 361.422 null] +>> endobj +2172 0 obj << +/D [2167 0 R /XYZ 90 324.56 null] +>> endobj +2173 0 obj << +/D [2167 0 R /XYZ 90 249.122 null] +>> endobj +2174 0 obj << +/D [2167 0 R /XYZ 90 214.283 null] +>> endobj +2176 0 obj << +/D [2167 0 R /XYZ 90 177.421 null] +>> endobj +2177 0 obj << +/D [2167 0 R /XYZ 90 140.559 null] +>> endobj +2178 0 obj << +/D [2167 0 R /XYZ 90 103.698 null] +>> endobj +2166 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F35 2018 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R /F23 340 0 R /F97 2175 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2230 0 obj << +/Length 1756 +/Filter /FlateDecode +>> +stream +xÚíZKsÛ6¾ëWð”J3ŒA™Nq“Ì´éŒk»§$£¡%Hb+‘ +IYQ}(‘õ°ÅÄ±ë‹ Càbß~X€ÀÎÈÁÎû֛›Öù;9IzÎÍБØAœçfà|l‚H§K0ÆíËÁí ™½ËÅíx²«Aô>„·I,_¿~ókïzÌTçóÍoçï)‰%ÒEBú0i.õg3¤23ÁˆºÅ€›Ƌ¿’p1 Ò´Ó¥ƒ0IÛj:›™2=Wj¨’ñÛ*êC—Œ·}¬E¶ÞÞ´¾´HÁɽÁ0oÚúø;èÿÍÁˆ1‹|ÔÔq)ƒçĹnýÙÂÖ³›ÏÜӂ:>hë¹¹¶.¨ MAÂ7Z_©lžDVïÀ<Òeš©©iÇCóü„9V_æÁ$̖Ð&¦·G£d®m²Ò ÓOS50·Kã7)˚H‰(¥…ç`<³Þå¥Q.òð*€Ù8L͘ŠMCd1åÝå‘ów—‚×¥®@ V—R$‰kU¡”oÑaIF6>Wï[ÎÇ.p^¬Lï]|MûcFá4üW zeߕ_µµÃ+ŽN³Zë6B‘ç§K’®ØŒ±àyŒ…kô&¦opø!8ôÕz«‡áՀÈڀSF‘ï²&vù¤´³±™6«B¡©²–uÂiÝ"Û3§ +ü@ÚaiÙ{ —QðF’K#5Hë0 ÉCØ#C–û¹õû!kzÇÛ¿‹·ñ<¤½aO{ÁmÜ!¼}§ÿ¨]x,£p‡Ìa¤‚¤÷öë,Qijý¼)ë•ÒÓÀS.à´ +ðí€0 î­"ЭÇ,AÅ Ð2^Y +‹£ÉҴ৚˜ äÓÕ +¬:<…eË<S“ŽËÛ±åÝ<¸}g׏0ª¤Hq é)ÔˆÀË]!‰ß$ oÕ$îPÞ^<0’g F‹Å ®k­ÇZ΋”7EËÆ4øš¯Ó›o3"AŸq}zÐ +}·Ïöd”j¨SB/iýPEY­Àt>ëE{%ñc$I#ipÖÉß(<Ár=^涆|•;k>}@Áî‘@Œ²Ã $]¿’@‚Ø‚†M h T²ë#.xC…JIÔÌřiÀî [®U۞ã~8“k&Yg2üSÊd=WiY»²™!MSeó™žÒÓSæš,Æa_Cl +1ÆÄÖ¯bý µëŸ)ïôcŽ`ü7·ätLæÅ*™ð›Îæ™ܓ@,™¿ÈcÈÙþåü½ŠTdqR»ŒN¥úB?/ôs +ý¬Š4{Ž2‹Ã(3ÍÅX™÷jl!\Â֒߫h3ÂcBqøÚÉ;Õ)\ˆ9òˆ°d(N"CIW§[,!ÙQd"“! :– ]êAa Ü«0î%Ã#%Q#I“¡~£– ½‚ µ³¾S5EücèŒUé oÓÞMgÜmŠÎX•ip á]t–GÑÙÖ$;él½/ÚCeËoCe|/•¹™,Œ4\è*ê…8Ž#^%ŽÇ­¢^hç…vD;®žÂ>;¦zú^Å‘¹¾ÛÔ©(äa„QzÂAhùCéVÊ/Ÿè)|5å+Ÿ§¥|I²ï7Е´e(Ž˜ÿ°³L"1«UTœŠ 4KÂ~6Yö^ ôxP*‚ÐÙJê Ñ°B|`QÆɦ˜)L{ƒ0ý[uþÑ懅y¾°ª/<lß%ه!ìµR^ôŠÞ“²„‡°{èûËÎë—1ÐÓEõ®Ô$È6«ô°Iìè^~àáð»ÐC’ Ü.Ásö`µ&2Î7†ØßÆñdF£âó[¶Pª®Ò#ÌGLò¦@UÆTUÅÜêDL…6+]¨þ¼UÉÝo–´<Šˆë?]hÙ+3õÐ5¼f>El•´!_Ð|;QàjT#vkñ÷D–`ˆPv Îڏ,ØO?²šßÉ?+\ô§í¢œ¶¬›6iËCtUjf-ؘr·ÁZË7|Ÿ»‚Ï©D*4ƒÈ<‹c›¼ì¼¾g™Ã)Œ5u¢:B}hnÞ%©úVöÿ6ðèÎzØøªaÞ¼tíùyŽyç:¿[ ¸ð@æ;lÛô¡£¹M^pÐeÎ=ÉÔjvYÜaïØûiùEvóÏ_©J~êpÞ¶ÆüDóü‚®½Ìä.Œ¨†êtX{­ +ðËþqŠÖï­ÜÇk}‰õ^ÝúgÙìõùùb±@ýÿf +³óÙlr^qۆՄ¸H¬„ aÍç8YöAç4_$¶üÿÈj§c +endstream +endobj +2229 0 obj << +/Type /Page +/Contents 2230 0 R +/Resources 2228 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2071 0 R +/Annots [ 2163 0 R 2164 0 R 2187 0 R 2188 0 R 2189 0 R 2190 0 R 2191 0 R 2192 0 R 2193 0 R 2194 0 R 2195 0 R 2196 0 R 2197 0 R 2198 0 R 2199 0 R 2200 0 R 2201 0 R 2202 0 R 2203 0 R 2204 0 R 2205 0 R 2206 0 R 2207 0 R 2208 0 R 2209 0 R 2210 0 R 2211 0 R 2212 0 R 2213 0 R 2214 0 R 2215 0 R 2216 0 R 2217 0 R 2218 0 R 2219 0 R 2220 0 R 2221 0 R 2222 0 R 2223 0 R 2224 0 R 2225 0 R 2227 0 R ] +>> endobj +2163 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 696.998 209.547 707.902] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +2164 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.045 696.998 309.432 707.902] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_8f0bdfca2a6993bfa08358319d589ab6) >> +>> endobj +2187 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 649.178 228.895 660.081] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_79a586ca093d218e5603380ac0475717) >> +>> endobj +2188 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.232 649.178 333.482 660.081] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +2189 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 614.308 229.503 625.212] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_641b55dd6c26bce06bd8041b38aec873) >> +>> endobj +2190 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.84 614.308 334.089 625.212] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +2191 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.98 579.439 187.264 590.343] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_a7b3a5c12ea008b78eed88a621c1fab1) >> +>> endobj +2192 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.963 579.439 293.213 590.343] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +2193 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [325.131 579.439 371.148 590.343] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +2194 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.711 579.439 455.727 590.343] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +2195 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.98 521.656 187.264 532.56] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_e61fdcc22d1e0fe43b94194f2eadaa1a) >> +>> endobj +2196 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.963 521.656 293.213 532.56] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +2197 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [325.131 521.656 371.148 532.56] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +2198 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.711 521.656 455.727 532.56] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +2199 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.235 509.701 220.058 520.604] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +2200 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.717 463.872 186.348 474.776] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_33daeddebffc6eb847edd92c3ba045dc) >> +>> endobj +2201 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.523 463.872 293.772 474.776] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +2202 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.35 463.872 373.367 474.776] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +2203 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [410.82 463.872 456.837 474.776] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +2204 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.717 406.089 186.348 416.993] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_1d00782cbab77286295552af7dba7ed8) >> +>> endobj +2205 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.523 406.089 293.772 416.993] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +2206 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.35 406.089 373.367 416.993] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +2207 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [410.82 406.089 456.837 416.993] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +2208 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.581 394.134 218.404 405.038] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +2209 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 348.306 180.496 359.21] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_6a3dd351c33d66250d2b4ac639768f07) >> +>> endobj +2210 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.834 348.306 252.994 359.21] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2211 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 313.437 213.153 324.34] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_8a87935278cb7b1290301e96cb82fcb1) >> +>> endobj +2212 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.49 313.437 285.651 324.34] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2213 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 278.567 213.163 289.471] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_5e972fbb672e9b2faec34b949c9a2918) >> +>> endobj +2214 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.501 278.567 285.661 289.471] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2215 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 243.698 205.692 254.602] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +2216 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.19 243.698 261.312 254.602] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_75188bcee0bfc88a4c8571acc04a1826) >> +>> endobj +2217 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.65 243.698 332.156 254.602] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +2218 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 208.829 205.692 219.733] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +2219 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.19 208.829 261.312 219.733] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_4aef1a4f6e9bed5d473e98320401e0e5) >> +>> endobj +2220 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.65 208.829 338.781 219.733] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +2221 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 173.96 205.682 184.864] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >> +>> endobj +2222 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.18 173.96 261.302 184.864] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_16f61fdba7e14a67990a84e93be00efb) >> +>> endobj +2223 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.64 173.96 330.462 184.864] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +2224 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 139.09 183.824 149.994] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_caa538c9c00b2f69301365d916bb49e8) >> +>> endobj +2225 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 102.602 192.272 113.133] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_620d5cdb01b8b20848ca01f4e4c05b4f) >> +>> endobj +2227 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2231 0 obj << +/D [2229 0 R /XYZ 90 757.935 null] +>> endobj +2232 0 obj << +/D [2229 0 R /XYZ 90 714.099 null] +>> endobj +2233 0 obj << +/D [2229 0 R /XYZ 90 156.191 null] +>> endobj +2234 0 obj << +/D [2229 0 R /XYZ 90 119.329 null] +>> endobj +2228 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R /F50 339 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2281 0 obj << +/Length 1520 +/Filter /FlateDecode +>> +stream +xÚíš]â6†ïù¹Ú‚TŒ?â|¬ªJN¥Ý®:Ý¡½Ù]¡>çñëcllM-lýÒ¹v7³|ä;Ô±†÷–-×!ˆSb 'ÖÇ.!ˆôúcܽíÜ ²Y0ºíQÜMãՃ˜dÁè×hœÙêõë«ëÑÝC0½Ï÷ƒB6ª%¾\߃F‹Z(‹ÔZ&QÛ6Ôá#¸)ðã×jxRöú”c¨Ì§]1›ÇA.Ê'ĽÈzÄëŠ$„G®Ïx×#ªÊÎÏÃǁZ°E +op¹Ðn8ë|üŒ­ <kaÄ 3E©™eSß±u×ù½ƒµg÷}çxÓjâ"jpÁÕÌqKë?QÊ sÌ{ÖÇ>‡ŒÓ4Öϕ}ÙTú¡(¡ºÉÑ$’a&r±]úùæ>¤ôC˜&2¯3߃—ZéØÊHJ‘c«Or|ZÚøAä‹,‘:|£4Ã*ÇD"ωz• i¦Pt_Z$“ò"MâUy?oûþÆÛ¶‹/fc£d7‹$Ìá iÒ£…ïíÁ÷é$º_me=›‹¼}HB¸m^ðșý4Ëb)Mž†2˜LF•îíô6±ÜSћ'+yŒ©v?M&õ"Lç«zîXS–¼=¿†U؞Z,Vòt+:r%s1«7ZKe ¢ + µüUËXþš%Pü& +•ÝaC†Èzm}&¡cÀu햄®ÎÔd4‹’hý-.€]s=¿EåšÂd¦þjzXOTò*œE–ý²6ÚߦÊGŒ¯SìiSªÅÆÏãjݤ¬~h@‡Øˆsvî$Ìåȁ9ù t'ÝýÅéÂпÉÐ÷e›:tUVY\j¤\Äù i;&Œ­L£»2"°Év¦Âʗõ©OÖWmµ8z*Ø´"Mî#žg<·”1ì#[çïnkle"T±Y…±8´ýb|£|5¶ß¬f®¹wFîÑ#'DÎõN’«Ëö“õ‹Rýߕê0Èö©ÔAÄ]$ë¿&Y'Ë¿·c–‰²•ÿIÔ¦m±–6D“B*ïÓìÜìÒ$¾,¢e‹$¯ìÙõ@#ÿÄÁȵ½õê£q8ˆ°cׇÜbZžMÇÚ_ž+ñ,U0˜Új’û-bÔÙîèºÅÛ;ö¾Ú1¬fÛݱˆ‹âMÇ(‚1£ E=AðJA(ÄB=ºº.ËÈâ_o‚M}¥vôUkÐRŸ`0XµÁQ͛5Ψ©0»bÙ¸Çá#b¶Å±OÏt3Jfó|ÕãÏ=žàadS¿íUæöû5Ñ{rZ=!¯öE뚵nûˆœ¯ïÐr會|—yúÌ!÷!ÿКîÜýÏfúÿ¤[sâ°¼ÕDz?¤È¾S€K³‡•,½§ZªªD¶Þ!ÃHT\ Î0ªï„QβgYæê]§pàÚ^⹈­S¡‡<Ÿ¿ Q(Ñ"‰æŠòÁ|v7É6j!6r«JîÍI¢YšUçàá,P{t;þÿîv0M +endstream +endobj +2280 0 obj << +/Type /Page +/Contents 2281 0 R +/Resources 2279 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2071 0 R +/Annots [ 2226 0 R 2247 0 R 2248 0 R 2249 0 R 2250 0 R 2251 0 R 2252 0 R 2253 0 R 2254 0 R 2255 0 R 2256 0 R 2257 0 R 2258 0 R 2259 0 R 2260 0 R 2261 0 R 2262 0 R 2263 0 R 2264 0 R 2265 0 R 2266 0 R 2267 0 R 2268 0 R 2269 0 R 2270 0 R 2271 0 R 2272 0 R 2273 0 R 2274 0 R 2275 0 R 2278 0 R ] +>> endobj +2226 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 708.587 189.901 719.117] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_242d9bf0b5b215d4aa771e9f8595baea) >> +>> endobj +2247 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 671.864 241.935 682.768] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_54f33edf5fdf4c6f606136b882be9f1d) >> +>> endobj +2248 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 635.889 193.229 646.419] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_8c73e2c464d5e93dc55862d00d5478f8) >> +>> endobj +2249 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 599.166 238.459 610.07] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_396bd79b5d57d54685d9c1b9d970c00e) >> +>> endobj +2250 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 563.191 187.689 573.721] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_d369744c43a49ebac904bc3e17de0478) >> +>> endobj +2251 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.505 563.191 226.693 573.721] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +2252 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 528.578 161.677 539.108] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_29212d49685544d8a3c71993bd30f467) >> +>> endobj +2253 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 456.573 205.752 467.103] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_20814dec69b3a6602b70a9ad50db9b2a) >> +>> endobj +2254 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.089 456.573 276.595 467.103] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +2255 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 421.96 267.938 432.49] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_b464aec35ab7fb9fe0a8a50e05ad6f99) >> +>> endobj +2256 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [295.275 421.96 338.781 432.49] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +2257 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 386.974 212.377 397.877] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_cf4dc2de16f4a54ca03daa6ac1d31ce2) >> +>> endobj +2258 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [239.714 386.974 289.846 397.877] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +2259 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 352.361 274.563 363.265] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_c20541d40c7629b278584406ce554eaf) >> +>> endobj +2260 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [301.9 352.361 352.032 363.265] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +2261 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 317.748 209.627 328.652] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_28b268e37d25a0cfa2b5bf39e85c758d) >> +>> endobj +2262 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.964 317.748 314.791 328.652] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +2263 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 283.135 248.202 294.039] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_535090b407c713681228d6ab2b835e36) >> +>> endobj +2264 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.018 283.135 329.845 294.039] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +2265 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 248.522 271.813 259.426] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_2626176104b632be36dc614e1d5536ea) >> +>> endobj +2266 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [299.15 248.522 376.977 259.426] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +2267 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 213.909 310.388 224.813] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_1cb059d74161d8458f18b02e33efe434) >> +>> endobj +2268 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [314.204 213.909 392.031 224.813] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +2269 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 179.296 216.252 190.2] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_0cc08ca5d72d5cf465eb7812ffbb156a) >> +>> endobj +2270 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.59 179.296 328.042 190.2] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +2271 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 144.683 278.438 155.587] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_8921d611a6be878bd8ad66a9af6f405e) >> +>> endobj +2272 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [305.776 144.683 390.228 155.587] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +2273 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [182.95 132.183 356.194 142.089] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_0cc08ca5d72d5cf465eb7812ffbb156a) >> +>> endobj +2274 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 99.112 254.827 110.016] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_a85819690f928a46e3f437bfe629e976) >> +>> endobj +2275 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [258.643 99.112 343.096 110.016] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +2278 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2282 0 obj << +/D [2280 0 R /XYZ 90 757.935 null] +>> endobj +2283 0 obj << +/D [2280 0 R /XYZ 90 725.186 null] +>> endobj +2284 0 obj << +/D [2280 0 R /XYZ 90 688.837 null] +>> endobj +2285 0 obj << +/D [2280 0 R /XYZ 90 652.488 null] +>> endobj +2286 0 obj << +/D [2280 0 R /XYZ 90 616.139 null] +>> endobj +2287 0 obj << +/D [2280 0 R /XYZ 90 545.177 null] +>> endobj +2279 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2339 0 obj << +/Length 2137 +/Filter /FlateDecode +>> +stream +xÚíZ[oã¸~ϯðÓ¬ Ô /¢$m&³Sì¥Àì&ۗ™… Øt"Ԗ\INÆûë{Iɖ-_+“l1/q,Sä9<ßù΅¤½»íýóìòæìüƒ/zŠ(Ÿû½›IOÑ^à3"9ë݌{ŸúŒ62Jiÿã€Ñ~œÏâèã€Ó~6]ÞëqG?'·yœ//..ßG×÷ñ\~¿ùñückÓ2å‘@…°¨™õ¯vHceF ÷ª7-s(„¬üýÐ WÓ¸(C.)L¦x_ÏæÓ¸Ôöɯz¢ó û:Á£@ Ù9NyöýÍÙÏÌB{Ìì† HëŽfgŸ~§½1<ÿ±G‰eͨYÏã>§½ë³_ΨÛÙ]ŸfÇ%]—šćÆ £¾•þ3ç҈S½×û4”`ƒÛ,›ºç(_~çýՌ@Õâñ8ÊõhÀd9šêq4ÊÒ»|ŠQœŽ£Y’&³ä½9=¾ü™JºsúþU=St½,J=k›âÝ讀iXã·êóüCÀ{!¨î{¨:çÄ÷Xoš+éw©ï㍖£^?.œ™åÚ[#žò+;;}·tµ/6–c Äê7ÿk0Ñ¿E0/J\Pô«Íqë—÷Ú>Ï"èëb1-“ôÎþvùÞþTȃk¸ùìÐr‘§8t[|HÖ­¤˜ÄÓB·;ž$¡`w(쎲£“‰0Òþ“¥Ó¥ý¯úÉÊ ÿ¬dvœ;€'”ˁ”}Òj£•­0VÆâŒ(î‡éƒ!ˆd¼ª¹þL)Ouô˜”÷h»¢Ìã$-w!ӌØ?åÕÞIލNAæo…v;ۏQ6w{ŸMª'¸<ú^%†ñ• lél?j±;’«”Ùº)ínmX¹°žØã6[¤cí2`Ó!áá$Æ7ìvÂ¥J­£4”Ä«A +E›'Ÿµ¬÷I›Óq &՘§!NI(ðìKBÎÑÅiÛ3 ÐáËcnmýM¼…$”uLݵ±¢ ”~ÄÁè¤ù‚Háµð¨1õL¬q0ð̯@oE'ü¶7?/ó£1Wc¡Ixîµ$m { ‚¯_3Á¨x](vC~/ŠHß'"¬nð’ìWtB/‘>’µZ{àþ©ýŠ[ñ |ãÁc!ý.r‘Ö¬øôjäßÆÔ£I|;m ½ ÐR~Jø½ÊfóE‰6B3ïÔŒ–Ó$ç šr—I¶¥Žj‚œBž¤º°±G$­C>zº•Þ•s=*:™ý,æ1ÁBp€çL§…“{Ëc(aaí1qÞæ1>aÞZ%$qErgmÖ0β&©Oœ<Ûû2ä€}å‡Í2è•\À Ià‡_ÙŽàà†+ѵn¯~Ê,ºÕÑڒz܍sH/ØïÒópœf‡s„„©NÐ'oú®Úð }£ÒÊ<(t9¨´¬×à£ÚkŠåþZ +nm0ā®À 6Jü†}ZTð"\ob`X\ùØÞ@«…(!åðÂ)ð–ìÔ¹ #Õy6ÓDv‡Np²õîæ–k-Oq¤ъ=PÆuR! °UBS¡Äl¶°Üfí©Ö )UÔï¢/ÐûY-¾#‰¯ê1˖Y$Y¹ÂSñæÎäqx;ÜvmÁÚQÝÖ×ÿ¼7¼NêºÅ|®óÈo’çÞ +܊Y<…ÉÅÂË÷×uÅXB´ÝŽž‹t?&™§Sÿ˜ Câ)Õnãñ s!û“‚~xÀ)âˑ€…d4½®”8°ü`ƒçv#ž ˆDl2‰466¿Ä£òM"öl0)WPs%¬ö™ÑÄ>mB  åºé60ïsùPåìBH (¬˜sJ<±7À†ÝÇ>õúɀõK«S5ĚJ;M[½Vq˜÷*š–ùBïšhKÛÕ±±…Ár`Ùü1)ÚvPaÓÀlԎ»“ñà{%{u¼¾äÓ¼O2 Þe­†Q.±1jZÉߪµã…{j´Ý2L£½ ½/h( Zt®Ð×Os„ðˆ€”»£ Q$³ù4™,£E{ç)¥åŸ# Wþü*⯎=NIkéVtïÑD™i]ç®a¥ó _%Ý6ïnâË;ۆa7ùyCÛ7Äe}C”µÚÏÆ +Rå‰ã!=ô¼£{‹s~C~èê°½”M¶¯e­Œë?2ð¯C€-Ò Þh/Ó»¼Otr,!ŽMA @¦ê(™Åwz»É|ÒÁ’ª:XÂì"µÏxÿ€Cãš?'©Žóèû/ó\E[÷f~gùc¾>÷U¦k½F‰NË{ÃeqqaVu½d¨ßÌ! l¦twsí¢iu˜fPÅe–ÿm{Î,Õ¸+H,ǒ C§;‚£ |'¹ÊëÆ'9×£ãî³9&6¯:µÅ'ÄôþÙ²3hϜ)á>ï&Ÿä¼Vψs·m÷NÀÉ"uî†ßfñ|nÑàËÃ<79B`*œÓ3zµ„àßÙÆڍí²daV5ÉÂæèk57 %Ê®¾o—-¢†©‘ q–.R†5œ·1-dÂÁ³;w°PÐÙHá«5ʾfh¥,xe‰€nP–Pêeáš) mRÎýtʒSÖæ-n?4;òwuIÛ'*€Àl¯ÅKŒªž»ž^EƏæêS>s×R>V—âíWw3Þ~ù ’šï0Lº°ù¯8]ÄÓA>àT:_ù%x¡Uƒ”@I]ëʶV³ÿôªÿ~:3.±’—…«’ú¾,çç珏dTEšÌs’”çóùô¼±mZCáLViÏ$Ë­`³,¯x83YÙÜÿÿˆèÑ +endstream +endobj +2338 0 obj << +/Type /Page +/Contents 2339 0 R +/Resources 2337 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2341 0 R +/Annots [ 2276 0 R 2277 0 R 2295 0 R 2296 0 R 2297 0 R 2298 0 R 2299 0 R 2300 0 R 2301 0 R 2302 0 R 2303 0 R 2304 0 R 2305 0 R 2306 0 R 2307 0 R 2308 0 R 2309 0 R 2310 0 R 2311 0 R 2312 0 R 2313 0 R 2314 0 R 2315 0 R 2316 0 R 2317 0 R 2318 0 R 2319 0 R 2320 0 R 2321 0 R 2322 0 R 2323 0 R 2324 0 R 2325 0 R 2326 0 R 2327 0 R 2328 0 R 2329 0 R 2330 0 R 2336 0 R ] +>> endobj +2276 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 708.953 317.013 719.857] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_794dad01f1995c73b887effa026ac32e) >> +>> endobj +2277 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [320.829 708.953 405.282 719.857] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +2295 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 663.499 236.745 674.029] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_8ede75fbd470fa30f11d4c02672883f5) >> +>> endobj +2296 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [264.082 663.499 307.588 674.029] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +2297 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 628.256 243.37 639.16] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_ce010a880cb8574335f1be294907de89) >> +>> endobj +2298 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.708 628.256 320.839 639.16] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +2299 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 593.387 240.62 604.291] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_8e13e7d3536de2745bc9e58a25b75b77) >> +>> endobj +2300 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.957 593.387 345.785 604.291] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +2301 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 558.517 247.246 569.421] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_35f19d0e7190c5a18aebc9ced95d554e) >> +>> endobj +2302 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.583 558.517 359.035 569.421] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +2303 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 524.022 193.577 534.552] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_668cbd7cea86f47c4e2b303468083712) >> +>> endobj +2304 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.393 524.022 232.581 534.552] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +2305 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.059 511.02 248.845 520.925] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +2306 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 478.194 193.577 488.724] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_93728c0f0afcd949c391940be93455a8) >> +>> endobj +2307 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [220.915 478.194 277.691 488.724] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +2308 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.892 465.192 252.677 475.097] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +2309 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 431.992 223.465 442.896] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_86dd59c40a3c9867c2979ff24ba342c2) >> +>> endobj +2310 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [250.802 431.992 295.962 442.896] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2311 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 397.123 285.651 408.027] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_4882da0200ef4201f3adb0f6d7731526) >> +>> endobj +2312 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [312.988 397.123 358.148 408.027] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2313 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 362.253 229.552 373.157] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_0442c5079b3de8dcac61c224ee7a2e6f) >> +>> endobj +2314 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.89 362.253 302.05 373.157] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2315 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 327.384 291.739 338.288] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_a8e2f5b70168ac89a3f47639e7d9a4f9) >> +>> endobj +2316 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [319.076 327.384 364.236 338.288] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2317 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 292.515 266.673 303.419] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_4b7615a8ec5120dc083f368ecfe2d1da) >> +>> endobj +2318 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.01 292.515 339.17 303.419] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2319 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 246.687 217.109 257.591] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_894e92407922be006a76577cf47b8589) >> +>> endobj +2320 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [244.446 246.687 289.606 257.591] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2321 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 211.818 271.126 222.722] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_84a9c57aa31433a277d9be6b0077065a) >> +>> endobj +2322 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [298.463 211.818 343.623 222.722] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2323 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [214.863 199.189 326.259 209.095] +/Subtype /Link +/A << /S /GoTo /D (main_Meet_Preserving_Simplification) >> +>> endobj +2324 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.984 165.989 201.742 176.893] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_4e04c3a6c835332c31dfbb928b31144e) >> +>> endobj +2325 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.442 165.989 243.629 176.893] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +2326 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.079 165.989 371.329 176.893] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +2327 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [221.562 141.406 267.759 151.311] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >> +>> endobj +2328 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.288 108.206 212.768 119.11] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_07cc48290e435dfb739fb565ff1aa3fa) >> +>> endobj +2329 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.771 108.206 252.959 119.11] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +2330 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [297.896 108.206 375.145 119.11] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +2336 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2340 0 obj << +/D [2338 0 R /XYZ 90 757.935 null] +>> endobj +2337 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2404 0 obj << +/Length 2728 +/Filter /FlateDecode +>> +stream +xÚí[[sÛÆ~ç¯à“ ΄«½ïÂÓt¦v“4i2ãÆjjg8 I˜’ @VÕ_ß³»¸ @vœ¤@rqöì¹|çÛ ðünŽçßÌ^]Ï®¾–lî#_R9¿¾ûx®$A‚’ùõfþÎ#‘Å’`Œ½7 ‚½ Ù«7 Š½ýöé>Ü$Áêûè& ’§—/_ýeõö>8„‹Ÿ®¿»úššXâs¤| Z©tM=Œ(/\wÈða¢hð§! ¯·Aš.–T`æS/ܶAºo~ oÃdA´ÆkøJùLxš‘³¯®g?ÏHÁsb­!RÐïz7{÷žoàûïæ1Ì£mµ›sÊຝ¿ý}†s˶¯ÖҊÎ5h+¹Õ–ƒºp«(CX +§õŸÓ4º‹Þ”xÙÞ Ò÷k1'Å(ßcÌrKˆZ#Ž$.ÝG©kÓ躘T¬ÛfnÜÉ]n€¿™ÍßYe‚[c/èÆ¡Sï,˜òÂh˜À¸3ÿ +nÌù“ûێa(¸Ujòa<Äp¬³Þ}®çíC¼Î¢}ì>í‚Ã!Šï܇A7Û°£oÂ(â¼ 'hÙÑ9шPZ´‰bðX³ï†Õàùù’QŽ¦sÈ)ä ß=š„úOnP«,Äizבy:ܸ/nž:TÕ•z†FJ§• ­‹FA¼é±@Ò/ÛlÂx¿‹â ÛwɐŒªt j¸½}½úZàZ–.)†Ž‚¤Îqæ=¥¢<@烅šhs"85÷îÂ8L‚môßp³“S‘›|Áyw”Úü.p¯LïŸ BÀyUp4çF-¿/8ö¾8¡šÏjvÀ¡«·O»›ý¶K—$ܦO»/¶ýz§ÙéÑ~Åa¬¾WçÁÒª—â‹@|å°ò"\aÌ*lCéõ>,-µŽÂ8[eIeé˗V…Ub0Òá£i^‹‡/ÝÇ¡±(üó×Gø!Ä@OŠ9‚?ÅzàÏGTM¾Tuø³6ÑÌ~Չ_\!Œýz¨³ôxŒ²{×kŽYiw=‰ÔР…Ô¥,‡ ×À TÝ%‘\T˜·Ê+pé¹0í*-EaHãÁpn#] $™Ä«Z¡QÄ»Ê%òšD@EPŒÖi Y³"s&lØH©ʷ˲ò«²ŒÑ´¬Ì¶7ú¬d™dcpèBƒš˜çjšlR¾÷x:+w؁j_¿˚ —L +„…ÌkƒÎ«JÎb\ˆÂMÛ®L8h±÷±ûÍÉr Ÿú8ôéP + ŒìyO”BLê0ž^Šñ Æ8N<0ñÌÍx´7ÏlVÆý!`u²^lïÓ˜ÏÂ|#¥Ä|Óþ¤jp>¨§ñý‹ä>}ócéÆb›`r +,S1wè¦Ó›¯º±(±&“ëá°ØôÚÀâÜîz +‹Mƒ&W²Æ`1øÄ/Ó‚® ‡ŽÈ K`È'p¸Ù-ÌýpÉh“û.3A”0Qjfb˜ÓÓèÃäoì ]Ú?JF†Š´Ï›Ôùb4Ä)E?. +C­éTŒêU?ãHè„A)Ù%¤×ô9Žô*)†Ð+PI9DzMûó–6ê˜(9Àðs'ÀmÐ¥’÷`‚å4Xë&èšN;gõðKc±W¥N΃e {–Ëì5 Zö›‡FP`Áé0µ4²(°$r¨)Eèô¡…pê§åÁªP$cÍ&ÂÀŠŠäLŸÉ|ª +Q©S@2íƒd:ÉGK¥¬1tC}ÐSÐa@:1šchLΤÃÍÀz€jƌ5Я2²¡Ã q.÷t˜3îÝìÍÊÿ˜åÓúloðà%×x«ÌCƒXe½ØÞ¬ZLõ<ñÇôXŒ¢ÇGý~þKĬ‡L‰àXh݄c贍à ÷,K€O2¹9ƒ"M5,32€ÃÐ0O׺Ê¥àNPn°F" ҌÔWm·7åªv‘j'mÕEy‘_ °oá—#&ᢑ—®ûæ¢?U×mºFÈ\÷=¦¼£^øHQuɤ¡QÈ³Õ UÕkc@P +¤uÄRŸÍwB»ä^ùÁ?í¼Š§Àã}y‘JQ¦l“çÍ9Ϋ<LJø”;…§‡›.Úxd­Ú3jЍàɺ³öPŸž±ù;ª=Œ‹Þ%q!&Zo4 +]§ÝSÆ{VÆå¤êø­•qÞ^wVqד+ãœW%È´n-“s~F %5U‚Ø…ÐÇÁœ`ƒisÐH\Vƒ +YŠƒ‘GÕ ¾$#jÝF6 )"’~âbD ðºCzK¹´çûbΤ¶3ð‹ŠQ)‹Ú͊gmŸW|èILVŒÌÂX´ W4‡4\«ºwÄJiV?Íw„ÙOca”R$9é£ð÷Rx=Ñ +FíØSkÝ0}Øfî3`§½®÷»ÃCæN‡å댃ö^:{wYé&ÌÃ0îTH§ÉF8â\W9£ê:ÍeSåYsyfÐCLÅûÃ~»¿‹ÖÁvµÞîӇd(šÏFCüù/Œ@eµáÚrn†œG¢·[@jtžO´Oðˆ9À8‰G^¿V2çh@Â@]·´û‘!f!EAbÓS˜G7­ú¥ÒG‚uœ$mØŠlUm²Ã—£Cº‡9®R}k¿r3ž]ºÓ§Yb\z÷<@£ˆ›|¼cªöÚ3§2˜ê—3ľsKö!ÔGe̔§WqÐÜ1QkG$¤ß:ߐsê*j²§C»ÜãßfaRñ†\ +PÝ:D5¸dÍiوÍ&BÏË}“×1M ·/÷ˆ2÷…RÕÀícfŽ¤YÇoÄÛå'7­05`øˆ˜¥íß$ßù?ZœB‹IJí«¿þð/,VL=À1ŸO•úcÖXŠ0U¿Ñ¬q.].írDçâ Q)>ÑFÆ/›&æçb² ?‹õÑ.ÊÂÍ*Ï—É [ ¯™ö¯M“$ˆâlõö)Š0üÆÆ:ÎKá#îËiIŸ•–#†E3+¿Ý™UZá٠ˇ0­6œà¦<° žKøʦÍð¦ÌhâR¯ØÜá7OùÖ6Í÷¾ÂøvoµX» µ=ïÓ\?ë+WºÀ¹öQܑŒ ðF™랝ÍjG肬ؙ‡ÌÕ¢yŽ?ȧsnSƐ¶^ì²×`»mr:ìsM{q‚pƒI6͋ŸÏÜӗ QáOu࿜uÆA’ìÍbþã'¨†G™Ñ~Ô¬=ö]P»Èf’ÀÔ:ÝÛµ³BäÓÈëÂÇolD&» ÿX¼[»È9Ùl݇¤aò‡…^?ñC±j`ŒðÁˆ +“êBŒÌ{±fhhHŒ½·a1|7²ϋ»¿ÍlÐTúšÃk¬:~Ÿe‡—WWh¢‡8:$(Ê®‡íÕñü¨&´:RbÒÓ*¶Û'ùð#“³;›Ö¨mÿÿèz®P +endstream +endobj +2403 0 obj << +/Type /Page +/Contents 2404 0 R +/Resources 2402 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2341 0 R +/Annots [ 2331 0 R 2332 0 R 2333 0 R 2334 0 R 2335 0 R 2355 0 R 2356 0 R 2357 0 R 2358 0 R 2359 0 R 2360 0 R 2361 0 R 2362 0 R 2363 0 R 2364 0 R 2407 0 R 2365 0 R 2366 0 R 2367 0 R 2368 0 R 2369 0 R 2370 0 R 2371 0 R 2372 0 R 2373 0 R 2374 0 R 2408 0 R 2375 0 R 2376 0 R 2377 0 R 2378 0 R 2379 0 R 2409 0 R 2380 0 R 2381 0 R 2382 0 R 2383 0 R 2384 0 R 2385 0 R 2386 0 R 2387 0 R 2388 0 R 2389 0 R 2390 0 R 2391 0 R 2392 0 R 2393 0 R 2394 0 R 2395 0 R 2396 0 R 2397 0 R 2398 0 R 2399 0 R 2401 0 R ] +>> endobj +2331 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.657 720.235 275.748 730.141] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >> +>> endobj +2332 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.443 687.272 250.099 698.176] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_e0ba85e8cab7e4e95ec001bde5bdd99d) >> +>> endobj +2333 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.258 687.272 289.446 698.176] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +2334 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [307.772 687.272 379.512 698.176] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +2335 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [436.747 687.272 513.996 698.176] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +2355 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.43 661.717 403.696 673.882] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +2356 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.091 629.962 250.748 640.866] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_0acf1147e3f81830606dec4cc8faddd4) >> +>> endobj +2357 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [280.068 629.962 357.317 640.866] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +2358 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [384.405 629.962 456.145 640.866] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +2359 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 618.007 202.344 628.911] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +2360 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [356.462 605.616 409.185 616.572] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +2361 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.207 572.652 266.586 583.556] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_988ff507806fa8126649f463ef6a1f31) >> +>> endobj +2362 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.509 572.652 309.697 583.556] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +2363 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [336.494 572.652 408.234 583.556] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +2364 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.703 572.652 513.996 583.556] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +2407 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 560.697 171.361 571.601] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +2365 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.141 547.097 414.324 559.262] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +2366 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.017 515.342 265.396 526.246] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_79acafbe4f67eb7e2710287bcd60db96) >> +>> endobj +2367 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [298.568 515.342 375.818 526.246] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +2368 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [407.239 515.342 478.979 526.246] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +2369 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.616 503.387 225.866 514.291] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +2370 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.012 490.996 414.183 501.952] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +2371 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.933 458.033 239.984 468.936] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_cda762f8c081fed2862260211618fce0) >> +>> endobj +2372 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [245.633 458.033 280.82 468.936] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +2373 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.855 458.033 405.104 468.936] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +2374 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.703 458.033 513.996 468.936] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +2408 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 446.077 171.361 456.981] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +2375 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [347.257 432.477 432.092 445.635] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +2376 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.436 399.52 251.209 410.424] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_178a6a88143f44b43939d36024af6162) >> +>> endobj +2377 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.361 399.52 290.549 410.424] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +2378 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.719 399.52 409.969 410.424] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +2379 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.703 399.52 513.996 410.424] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +2409 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 387.565 171.361 398.469] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +2380 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.114 373.964 456.992 387.122] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +2381 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 341.007 224.57 351.911] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_5a66e6f883c7310ddbc312f78bb0970f) >> +>> endobj +2382 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.908 341.007 297.068 351.911] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2383 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.542 328.615 347.869 338.521] +/Subtype /Link +/A << /S /GoTo /D (main_Time_Elapse_Operator) >> +>> endobj +2384 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 306.611 255.564 317.515] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_d80989353ea3738abdb6b605d27cc8fa) >> +>> endobj +2385 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 270.696 257.637 281.6] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_9507085c5b0efd13c80f08a22b0f5529) >> +>> endobj +2386 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [284.974 270.696 330.134 281.6] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2387 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.542 258.305 378.454 268.21] +/Subtype /Link +/A << /S /GoTo /D (main_CC76_extrapolation) >> +>> endobj +2388 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.706 224.345 260.243 235.249] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_24d2b69146ab1b2216e437468a818cea) >> +>> endobj +2389 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [292.792 224.345 337.952 235.249] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2390 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.542 199.998 378.454 209.904] +/Subtype /Link +/A << /S /GoTo /D (main_CC76_extrapolation) >> +>> endobj +2391 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 177.994 257.786 188.898] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_1a02b17cbccf348192f3e7f776b3b3fd) >> +>> endobj +2392 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [285.123 177.994 330.284 188.898] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2393 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.542 165.603 375.773 175.508] +/Subtype /Link +/A << /S /GoTo /D (main_BHMZ05_widening) >> +>> endobj +2394 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.698 143.598 308.942 154.502] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_eda87d46bc3b54b420a475934e0e1cb6) >> +>> endobj +2395 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [341.477 143.598 386.637 154.502] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2396 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [436.169 143.598 513.996 154.502] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +2397 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [231.489 119.252 302.72 129.157] +/Subtype /Link +/A << /S /GoTo /D (main_BHMZ05_widening) >> +>> endobj +2398 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 86.288 245.911 97.192] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_df3cfc56df68bc8063e6e9eb3d0ad3f1) >> +>> endobj +2399 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [273.248 86.288 318.408 97.192] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2401 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2405 0 obj << +/D [2403 0 R /XYZ 90 757.935 null] +>> endobj +2410 0 obj << +/D [2403 0 R /XYZ 90 323.475 null] +>> endobj +2402 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R /F50 339 0 R /F97 2175 0 R /F38 342 0 R /F98 2120 0 R /F34 2406 0 R /F23 340 0 R /F35 2018 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2462 0 obj << +/Length 2142 +/Filter /FlateDecode +>> +stream +xÚÍZms£8þî_Á§9\5V$MÝmÕNæ²/wS57Îí—Ù-Š€œpËÛNÖÿþZ`Àø%±3³óÒH­î§»Ÿ`ãÞÀƳ÷·³«Ç28âuŒÛ•Á±á:1JŒÛÈøb‚È|A0Ææ§9ÁfP¦ÿiN±™'›•ÿïø® ÊÍ»wï?øˇ óßn¾º!¤7,á6r¹“ªQÿ®E3Œ¨Ý +ÜNŒÁ±X+ðݱ®“ ªæ Ê0 Æ©)Ò" j¡¯|+QΉgŠ,„K.·˜éÙrÈÙ?ogÌŒ‚ ¢¬Á\ä¼a:ûò6"¸þ³‘‹yRR©aS ~c9ûÏ 7–ÿ*K»Ôð@[ÇVÚÚ .ºÔBØaZëï«*¾Ï@o›ÙfëErÞ{̦ˆÒ®òWŒ­Æ¬/„Ü»~ˆ+-3˜Ÿ2ÄÛ{툌TøT#Ÿ;Å¥ ¶×¥pOºÔVÖpŽò)”ǨA%Q#®³Å¡iú‰ýèñÃÖ«‡pdrŒÎPÇj’ ’¬O%¿Fà€µ¬ÃÙîŒY1¸¡ Œ<ê•dÕ´Š½Hùö"ïO³‹@F£Ù „!£®CiÓ°Õ?X¶<ì ÎE© *Cù×¥2[´ úöq(ò '\@}evÃÅ?Šô1µ„›uªn¨]fKõ> >æQ¼ÚŒ¬ð!N$På÷^9íîÿHĦ¡©Õ–E#xà<›]²¦QäWrV?j•­|¨–¾\}´¯ÄìÓìFñëÍt}IO â6(RU8¡·ãÅéJ\@[‡’Låß'móíº0g º•ª‘Ëò¤¹ûþÃRÐó‘Ð`|e]yþ¼Ä$At¿Š«‹2ÿ€ð¯ãlú՜½ãºÎ­ ¢\4ÂY^÷Ñx¿nQp½¿ÜKàÊJÔ"ƒ¿×f”g¡àvE'ÚoÏ6Údás°¤K){B{C´7nWƒ[¶ü. ’ÈÆÀŽÛz®ˆB$7° y&Š)±Am~É´VŠ4—áô(ÿ‰ w¦Q Ê8¸KDå/ÅdŠ|Sçþð‡jDç¹Ïj¨–£Nò«ªaܧbÛŸ±aûþxˆïDy²[Î)6r)¤Üí,uBg{½¢ézRåc†8±¹Òm¤èRÐôö­‚G1|ªzG¶Y/½eOº.ñN†ë©D‡1¢žrw¡e‡§t/ئ°öå—RÌb=9ê"Ûæ£÷rƒ‘œÁKp}Öí|R=QYÇAâ·}b=>zs7ÚÔ`j›×ÓðžÅ3“Î~ÝuB)Vp~*v!¡×–LÀnPŒa;†êN7²KRtò Ã&ão7”‡-SèåiÙUÏ?=Әß:]魘Bòà‘ŸŸ¢cêñG™  Ñ¶±ùö°Z¯ÜG]ël19É°94ÿGvǔ¼ˆÅ>Tõ Ûa€U“‹<€k‚ʸ¹Û—®`ɝ ‹¿,ÉÉ ¹ÑqAd­ WüftDN.¢·Ïñ^ÏAÚ Q&Ûæê`T眀æÈÚ¦ñþ2§ +žƒ\Þ «}bH ·ŽƒÊ>Œ©ñver=(˜¶…k6—r0lrÿú.i§·™m9ú͑4vûÙÆ> Vzҗfš5ïÏS³å³°C;6â¶ÝÖ±z]fcàÀäqºN¥—ÞûØQkYKµ²(yA/Þê +=''y@o—æyr¤¥ 2h$B©Ñ&L„n7â+µ_læñwDŽ§òډŸ©Ï…`ѐ(›þ0‹qÄZ8ß> 9XÚùSûY–>m¾ÍÒ'ÿ­Dù7ù^¦j7O³uKätÇPn]ˆ‘ü¤J¿¼YX@Ɨ¢¨^ÙïF{ô¯™Ší­¾XŸ…»î÷¡®‹wWWOOO(¬Ð:‹‹ÅõUQ$W»ÁÖEö«Ý «–¥y)ÚTSµ€Æöÿ?¿”Œ) +endstream +endobj +2461 0 obj << +/Type /Page +/Contents 2462 0 R +/Resources 2460 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2341 0 R +/Annots [ 2400 0 R 2464 0 R 2423 0 R 2424 0 R 2425 0 R 2426 0 R 2427 0 R 2428 0 R 2429 0 R 2430 0 R 2431 0 R 2432 0 R 2433 0 R 2434 0 R 2435 0 R 2436 0 R 2437 0 R 2438 0 R 2439 0 R 2440 0 R 2441 0 R 2442 0 R 2443 0 R 2444 0 R 2445 0 R 2446 0 R 2447 0 R 2448 0 R 2449 0 R 2450 0 R 2451 0 R 2452 0 R 2453 0 R 2454 0 R 2455 0 R 2456 0 R 2457 0 R 2459 0 R ] +>> endobj +2400 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [488.091 720.235 513.996 730.141] +/Subtype /Link +/A << /S /GoTo /D (main_CC76_extrapolation) >> +>> endobj +2464 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.268 709.277 189.266 719.182] +/Subtype /Link +/A << /S /GoTo /D (main_CC76_extrapolation) >> +>> endobj +2423 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.576 687.036 292.328 697.939] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_2af430cd70ac416ca0907312b65812e6) >> +>> endobj +2424 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [322.618 687.036 367.778 697.939] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2425 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.662 687.036 491.489 697.939] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +2426 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.622 662.452 310.533 672.357] +/Subtype /Link +/A << /S /GoTo /D (main_CC76_extrapolation) >> +>> endobj +2427 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 629.252 236.197 640.156] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_5d71f71f50ba04fe5f810acf0cf1e294) >> +>> endobj +2428 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [263.534 629.252 308.695 640.156] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2429 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.542 616.624 357.84 626.529] +/Subtype /Link +/A << /S /GoTo /D (main_H79_widening) >> +>> endobj +2430 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 594.383 214.06 605.287] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_00b832cc0784b7b30f4d4a2f738a3032) >> +>> endobj +2431 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.398 594.383 286.558 605.287] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2432 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.221 557.521 284.876 568.425] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_ccbd8986577794cea90edef63e859ab1) >> +>> endobj +2433 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [312.455 557.521 357.615 568.425] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2434 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [399.095 557.521 476.922 568.425] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +2435 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [232.902 532.938 286.2 542.843] +/Subtype /Link +/A << /S /GoTo /D (main_H79_widening) >> +>> endobj +2436 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 461.192 289.866 472.096] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_9c0703b2311336754e28a7f739b7e685) >> +>> endobj +2437 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [293.681 461.192 359.324 472.096] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +2438 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 426.323 290.971 437.227] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_fa8a10ff4b09f8a87e3c558a39f5888e) >> +>> endobj +2439 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.787 426.323 360.43 437.227] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +2440 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 391.454 224.003 402.357] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_b0a670aeef72d808d620bbc33a5e8cd7) >> +>> endobj +2441 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.34 391.454 296.5 402.357] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2442 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [219.695 378.825 272.49 388.731] +/Subtype /Link +/A << /S /GoTo /D (main_Concatenating_Polyhedra) >> +>> endobj +2443 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 356.584 254.15 367.488] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_f8cd5fb701a14bc509872aeb3617b0b4) >> +>> endobj +2444 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.487 356.584 338.263 367.488] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +2445 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 321.715 284.585 332.619] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_b054f67fb31ea4e860dd7c24c0b56676) >> +>> endobj +2446 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.401 321.715 354.044 332.619] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +2447 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 274.891 241.726 285.795] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_c65231748a66ac5c074502cc8e652e10) >> +>> endobj +2448 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [349.617 262.262 407.658 272.168] +/Subtype /Link +/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >> +>> endobj +2449 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 240.021 249.318 250.925] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_0badc932380dcb7f72ea50ca922d9d4b) >> +>> endobj +2450 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.134 240.021 288.321 250.925] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +2451 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [305.875 240.021 371.519 250.925] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +2452 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 205.152 240.62 216.056] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_bb521f4ff8e2e40318bd06b0ff4d7617) >> +>> endobj +2453 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.958 205.152 324.734 216.056] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +2454 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [390.537 205.152 425.724 216.056] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +2455 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 126.382 203.075 137.286] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +2456 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.573 126.382 296.324 137.286] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_e68d61763922cee018cbba3834b2085c) >> +>> endobj +2457 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.636 87.528 287.856 98.432] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_e748c3f5082b158453fbb3ccf57c8f70) >> +>> endobj +2459 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2463 0 obj << +/D [2461 0 R /XYZ 90 757.935 null] +>> endobj +2465 0 obj << +/D [2461 0 R /XYZ 90 611.484 null] +>> endobj +2466 0 obj << +/D [2461 0 R /XYZ 90 145.356 null] +>> endobj +2467 0 obj << +/D [2461 0 R /XYZ 90 145.356 null] +>> endobj +2468 0 obj << +/D [2461 0 R /XYZ 90 106.621 null] +>> endobj +2460 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F35 2018 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2521 0 obj << +/Length 1668 +/Filter /FlateDecode +>> +stream +xÚíšIsÛ6€ïúìÅ¡f*+x’²¸3Išº¶zJ2Z‚mN$R%©:ú÷} Aj§¤ÄñÒè1EAxÛ÷`ïÚÃÞﭗÝÖñiÀ<t@¯{åiìɀ A‰×x}BiwÆØ?kì‡é(익)ö“áôÆ Ò°÷>ºLÃtzròòuïâ&›öçîÛãSBæÄÍ‘Ô +&-¤>/‡,ÌL0¢¼Ð]#C#ÂD5à·m^ Ã,kw¨À LSߌÆÃ07å›sseÒ6Q¾‰ûðJj&|%¬È֛nëŸ)Ø#…5„DæíZ?coïßz1Pæ¶5ò8eðwè]´þjagÙ必¥%õ¬6àÅj©FXy’2„Q.úÜä“4Μnbn4ÃóÚ_…Ã̙yA&ˆ$œT£¢xõÃ<Š¯K­ó›0¯ž"g›A2 +£¸|î‡qœ¸i›Ißô§ý¡3Y?‰³l&|Ÿg¨0Ö&mOžsLG¤‰ò: «võ‰R± ÃûØeY+î—s^&ÉЍ±ÞH¯[΋ÑnɽÔôí²ìR{°Êëtb½Ú˦YnFÙòöWŸ°Àð¬ÕaÙ¤œz‘æü)¸É`ƒ‹–r¦£b"ð:œ!"œ~§idâÁ¢é–\Jęõ(˜§ŠÞM.ÝîÆdlÒ0OÒ/6¹«¿f!óø™[ö"‡¸@fKZÔ (ÂtˆR-hED ¢£¯¿ÎeÐ÷« 8â÷¢ÁLÄÑt×léÐ@ .¥Ë¶_¾ä¹ë҅!¨Iuº\•æ ãAùÄÃiù_­NÁ%R ”ûõ×5ò% +(­X±«B„®—0Ý ¤–yYe±{È‘{zùúb·ì$’@õYJÏsc+™Óþt÷ó(©¬»àE þàˆqíòòèC’›U̘̽ S÷PfdF—P+‹ç«j.´3 $ô& ë“HKLÊ0äAdyU¡ = (fã¨Dœ«ÕŸP²–4›¸¶uw@¦‘â´):’!UÄ1”.áôÉòÁÉIeЄ£RøÑn\[×Íp°Y?o„-¬\Ն²n\³’ìn1Cä !÷JÊËA¶h‘‹…ùÏI>ž¸Àµ¶/ÚkBˆ¿_ËRÕý¦–則óîuù—^—GŠÝsU{ÂÌ·i wϗ}Ê2Ô|[û+Ëñ³6ƒª·uÞÄ +"¢ºÚß<.Z(ðDùì¢};N”D˜4†a‡P‚° ûð„cêÃV-†Ql´7ˆ`«g7j°OÚÄ¿Ž—ca³Q¦ÿêÆô¿Øc 3è}˜JC‚R¬£¢1C¡Ýd–¢Öz`7αÿæk›¢z¢ÞY2ŒÊçºó@d©l§ªS9móÂCv¦Fu˜ÐHÐ%ÓïÂ'ÛBò»ùôè {§-É´ðKãÒϓ láãëÞë(]W'Qº3¨mÃ/`Á  ~•Œ ­1Ù±Üæ¿Ê¨v]”÷üGC“YVLïÖRf;`1ù­1ñ²RB¡×?œÏÐÄÕÞسAƒ’¦ŒšÄö¸±‘ºß€eÂ9p™4sY*„ypg\^er€ò(w 倈f¤iÁ¶ - KRZn¥²R»Qš~*Э*ˆÝ± ê5bt,;ÿÚÑsY«¤”ÆxÍ7ªø†3ƒ³•BªÉB¶-¦¿Nw¥?0ŸHv`ÿSfÿãé·ñͤ?Œ&Œ·RÝ5Õ%’˜7BB¥«T—r_ªKĚ¡¾0ӌêRî@u{êúm­¶ú N3~š^»Î¤ýPJ…RÛPJ¥˜!Â÷>»P‡>úÀÛ§ÄÛ¹øÐEºèՈꏧCÌö"Ø!aGùt+´aüÝB섃-І½Î +´æûC[‰-О›©†¶i´RŠšäûù/¿ÇÙ#ËÖjž]1\GÜ{—Ô +˜¦¥ JHP ‚1ÒÚ˜‘5 õm#67jWJlî,ï½|“4PÅ%È/’F!°ÌP^͵§ŒÕ- nUÄΊ[é(t«‹¹åGw;·üðwfÒgm!ü¬>$š„ÃÙáÑ¿V”I³(q#~6ZP»Ãl¦JˆR³/^õô®UØn¶^Ôf¸îGnò||r||{{‹úšÄÑ8EQ~<W‹Òœ> endobj +2458 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.636 696.002 294.481 706.906] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_8c89ddcd2fc4311af0e358477630d7d9) >> +>> endobj +2480 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 615.239 180.54 626.143] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_c91aac77237c2405df039c4fcfa08ab0) >> +>> endobj +2481 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.877 615.239 253.037 626.143] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2482 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.336 615.239 366.497 626.143] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2483 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.349 495.243 226.034 506.147] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_5049b85730d6720536be440753b11ed8) >> +>> endobj +2484 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.176 495.243 366.336 506.147] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2485 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 444.434 178.239 455.338] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_cdc537f0aa5117fe3749d3c50b7dc4fd) >> +>> endobj +2486 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [205.576 444.434 250.736 455.338] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2487 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [319.035 444.434 364.196 455.338] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2488 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.625 393.624 245.522 404.528] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_f4b0f891a6911d7784216f537fa3e473) >> +>> endobj +2489 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [250.848 393.624 325.229 404.528] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +2490 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 381.669 159.071 392.573] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2491 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [227.37 381.669 272.53 392.573] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2492 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [316.66 381.669 376.217 392.573] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +2493 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.625 330.86 245.522 341.763] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_221657648a7e456dba61589e37765cd4) >> +>> endobj +2494 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [250.848 330.86 325.229 341.763] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +2495 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 318.904 159.071 329.808] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2496 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [229.339 318.904 274.499 329.808] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2497 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [320.223 318.904 379.78 329.808] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +2498 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.92 256.14 243.605 267.044] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_47a21a1c8a88c306877d15d4dbc697b4) >> +>> endobj +2499 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [249.226 256.14 323.607 267.044] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +2500 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 244.185 159.071 255.089] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2501 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [227.37 244.185 272.53 255.089] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2502 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [316.66 244.185 376.217 255.089] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +2503 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.92 193.375 243.605 204.279] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_e5c66812ab981ee2d1ab96ce218a7782) >> +>> endobj +2504 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [249.226 193.375 323.607 204.279] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +2505 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 181.42 159.071 192.324] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2506 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [229.339 181.42 274.499 192.324] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2507 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [320.223 181.42 379.78 192.324] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +2508 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [136.138 118.655 242.189 129.559] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_d0a9267e420144cacfb867076d00a803) >> +>> endobj +2509 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [248.028 118.655 322.409 129.559] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +2510 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 106.7 159.071 117.604] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2511 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [227.37 106.7 272.53 117.604] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2512 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [316.66 106.7 376.217 117.604] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +2518 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2522 0 obj << +/D [2520 0 R /XYZ 90 757.935 null] +>> endobj +2523 0 obj << +/D [2520 0 R /XYZ 90 715.095 null] +>> endobj +2524 0 obj << +/D [2520 0 R /XYZ 90 634.213 null] +>> endobj +2525 0 obj << +/D [2520 0 R /XYZ 90 553.451 null] +>> endobj +2519 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F72 471 0 R /F65 376 0 R /F50 339 0 R /F35 2018 0 R /F98 2120 0 R /F38 342 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2543 0 obj << +/Length 3267 +/Filter /FlateDecode +>> +stream +xÚÍZÝsÛ6÷_¡§œ<ÁH|0½ÞL“´éÇM®É=%-Á‰dIªŽû×ßâ“ Iδ}±h\`»¿ýí‚xq·À‹ï/^¾»¸úŽg‹œòÅ»ÛE‚Ä(Y¼Û,Þ/ AärE0ÆË7—/Ën_^¿¹¤xÙì¶jӕ×?U7]Ù=¼xñòõõÛmÙªË_ßýpõ!±¤È‘($Lj¤þˉf&ÑÜx—Q ’1?àßç$¼Ú•}¹¢ ƒ°‚.վݕƒ²w~Q·ª»$r©ê5ÜEƖ’k‘ß¾»ø킀¼ ÆL ó®÷ïŋ ÜÿaQÊܛQûEN3øÝ-Þ^ü÷;Ëû5g8Z5Gy&–/‹Ì®þ¥Ì,Ç¿g^¨˜è—$ÊyáU¼nÆ$°Öq(Ïçf$qĤ’ZU—{åí&°¶›ýï¹ý™‘à '<^És„ ™med”áœÃAcväMÓìœUôîtwn›~ùþbñ~•³l¹»®êÓº®7U?”°Á×à Õ]ÙӍÿ€>*qùj«ÖŸ´×«Íõûð™xO"ÿ¤°‘ óÇƞì5E”g£“kãÙΗß~T½ ]¿ivÕú’°åC*œ`_e^œ²`<Õ³î27;¤§Z7u?Óz•1‰¤$Îòܾ? ícúç"\œT#NØ©—0evR--"ù³ÏÚé +qZ¥÷+*å“T ä/PžU!ˆxöpÉìÌñµƒz¿4‡zSÕwׯ«nîÆZ·Må÷WžÄ­Ëgþʼn'ҍZŸBÞQ›p̎h6ªµ²O®õQÀŸW9GYÊ=¾€ÆIĄ8ƒ£„gOEœxÍh 9o[µ®Ê]õ Îã(Í)£/÷ÃæŋþÞzÓLxñCŠÓñ:c£+B °0L\cäӁQ¿VCYíÔÆFÏkÕ¯»ªªÆÀÈ\s© Lš „9E®ÃŽÛ– ÚH ƒ•Ÿ£ÚY°ÇzäÚªH€Dœ+ÆyU ü$Üdà ²ˆûË +:ÏúýØT·—”-¡RP!môzéÈoљ wkÙê!‚c6n™ypJsŠ§Q‘Š+½ƒ'çS_>WyRk¹Û5Z½ûÞ®î¶éÜ¢½"ʨ¯ÙôºRõ`ovªíTÿ–ÆOÍÍ­}Vú!ýÐUëÁتê}}hM!… ÎÆÜÔ´ ¬ ¼è®rP•IÈ9\ÄPµ@,'`ñ¦W›„ÆàÆTlŽ¨IÒï•þóÙ¾Þz'Õÿb#ØK‹Z`¿£«€í*PMê¢2®¨Ô²Œ»ôɽ «SÕË×o{ÍÒxæ¶ÄöÛ¦4þ¡ËU–Sçc ×E¯Ö½ÙB7o»fï°(<•3l·ûÊa•&D׃ýoؖáÊ pö4×ep‚Ú=ݖ»ÛUߖk;ïTÂz[v Xu€·‘Ì"ÙøŒZº‹7Òîˆv®0÷̓«É}WVõЇțPã~ŽPš °ßÞڜN±#(#t´9æ‰(ŠÂ̑?‚!¸ +|Íð6N°"Æ̨*1—Æ|1ôÓ<ø÷$ÀÕ§dÜ#Åhº´ !ÿ‚53ĀMFkÆ8‰°ÅXX>mºIŒÿ +ÁÂýc׃¸ßhϼ¢ª·Í¾¹Sµj¾QÞQâ3 +yˆ"šv&`«?ýÖ¡m¡LJí¯ÈQ‚fŽ·„çÆ瞸Cy ,½«Ö>,“1A£ë“ª”‡i½…'wÝÁðŽYüâ§aÛÙÅdî#3œ†º©WÍ­‡€É’çqlþU¿Ê]5Tª7:—ðJgŠÒÓðIyç\y‚N«Õ…\p{^íÛkÕ*COl)lq>ÐD ¡7l›ÍsK2}XÚqã$îýÎõ‚ò^^éFT®è®›Á>šz%^i·ªp¥,äâ ~÷Õι˜.¤W½·Z=5éZµCÈk¯UØ Þ?£êDoŸ@zÇÝêÇ-<´¶µÞ9_³ì\3p˜,âßÌ÷ËMGg¸r P¹÷·e´¼«6(sì¹¥D˜ºvk™,O)綅†±±«n…?6 ¡@$פ—«\»Á‘~…J€…Á_=®¬ )ÐPÚ|}®ôUª“&´²»T‹#2ž%‡c™Ï"9þœÙó¸uÓÃହ¯öR»IFÆú´¹>¦Øzð¯3s Ý$(¼×Y"˳˜€êëfօîíýþ°ÞÚ+É©¸øXŠ~‘ieì E1Õökë}8µãѱÁø\7ø‘–˜úè테êP.þ‹{šåRˆžÅ<ñ$ŸŒüßóx}®‚‹ÙW 6çžÇsÇÐáŽËyµmü°ïsŸ¸”ßØJǞ"˜g“ö›ç´ã4^|5æÊùG ©¹ù¨ÖnzG +¸«àÎ2²3×aÓ¸Õ%Øs‰1›9릳ý›u²b%à&Q+å‘4_áDfu"%3¼jÊ$tëϞ hão&DžŒ#”½˜òȱڱÏZÛ[1›ªß½½»Þ6½òÇ£9ø¯4Þt³*QPf£Bf_ÖA•¦3äÊIŒ2Éb{íšÆ3º¾ñ‡±¡O¬9¾Ùõgiƒš³k{Îv¬èðÔÛQԓܫORºï´q=§¬jûýŒ¯üÏTˆÇ][óTïښÆBýd6ü‚¡OECÊʒd§óoufMÒORµ'^rÆ»è¹Ièì[žh :¸˜ð<¡KtŠA’Q·oð¼ð]Å1lÆK\Òο\åD>õÃUÿaê½ ‚ˆ±|V‡LÜ¿“ãSø×ôÛþû}öá|òç²>øZ"®û;6æ0Ò'üþÈà­òj5û´ðW?^˜(×K$àÜȦ¶Ãо¸ºº¿¿GëêªíP5\µíîêñ‡R)$Gã>Üzïß7]8GÒÈXMíÿÉ1Až +endstream +endobj +2542 0 obj << +/Type /Page +/Contents 2543 0 R +/Resources 2541 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2341 0 R +/Annots [ 2513 0 R 2514 0 R 2515 0 R 2516 0 R 2517 0 R 2534 0 R 2535 0 R 2536 0 R 2545 0 R 2537 0 R 2538 0 R 2539 0 R 2540 0 R ] +>> endobj +2513 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [136.138 695.785 242.189 706.688] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_8d6c186583503c4394603550b50edf59) >> +>> endobj +2514 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [248.028 695.785 322.409 706.688] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +2515 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 683.829 159.071 694.733] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2516 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [229.339 683.829 274.499 694.733] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2517 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [320.223 683.829 379.78 694.733] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +2534 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [136.742 622.622 159.108 633.526] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_f6351727d099ad178db8b8e742507f4c) >> +>> endobj +2535 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.751 622.622 321.994 633.526] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2536 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.784 622.622 513.996 633.526] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2545 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 610.667 140.251 621.571] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2537 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [110.861 304.723 170.418 315.627] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +2538 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [305.722 127.823 349.228 138.727] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +2539 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.725 86.288 193.232 97.192] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +2540 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2544 0 obj << +/D [2542 0 R /XYZ 90 757.935 null] +>> endobj +2546 0 obj << +/D [2542 0 R /XYZ 90 574.827 null] +>> endobj +2547 0 obj << +/D [2542 0 R /XYZ 90 524.106 null] +>> endobj +2541 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F35 2018 0 R /F72 471 0 R /F98 2120 0 R /F38 342 0 R /F65 376 0 R /F23 340 0 R /F10 473 0 R /F8 504 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2554 0 obj << +/Length 2424 +/Filter /FlateDecode +>> +stream +xÚÕY[sÛ6~÷¯àS+ïV0.¤if6‰»“nÛdc·³$£¡$ÊæF"Y’Š-ÿúIP´ì(ÓÝé‹)Â8·ï\ˆƒ«ÿp"Rý…üÇh/®?Žš’c2ˆë›ë¤ƒ{±D:fS†•Clύ`‡P×Ò{½–b‰¸¢A$b_â´#ðGþ¶E1ÌrðÓìʼ9`UÏa[¨»ŽuÎýÔf¹y6¸v/ì¦2)ʤJ²ºñ}³¶dÜS=e!bê>àÔ îë¾cô¹º×(Ž4a0e’Ã-(ÄÆæ߯AH*h@€‘h’ïҬ]ÇÙL[&ˤH²e£=M´*󍷏O¹M·µÝÛÈՊ(¯¬FÞB¬¿kx¼È³ª.cm/ Þ5ìòùmýŠŒ¼9{/›(YÚlÉFBI§Sr"$؁<ÝaÂ…hþ÷¤~È1]}EF=t7ézmäŸ[Ó$iccËH5ÄSસ­‚¶Å©1-‚ÇEQæ·éê¶e + ºB6"ç;ó¬âU²¶¿Ó«,/Û8Ië® pBjƒÅÜPÿZÄÛÊ[œõk‘:Œb¸­@µ·}¥]9‚«|½ÎO)ƍ£Á’ O¨=“ʬèÛ§}‡\³Ýhñ «¸050ÀXjÑëP—…²ÉðAÞG"}@žÙ“òÕàè"¯ªt¾¶o)¸{ å²Ý¶N+m•Æ˜¢;RÊ7f<ϵðŸôŸV·K—²ckƒOZ_q™Æs­¡}©`öÀûx¡„è²Ò>¯Ý=Ïú†#Ai؞r÷ “ÒÊ»L iÖw^“1ÛºtcݶÝžØ+]ãʁ¸ó­ê‰‡7]eW†rJ2}¡)"!…Ìîڌ_­¦O§4t·úBXŸõ­óorŒÒî4-Ù£ Çhï4-miûWìCŽ¾™…¤NšÓ¹ #4l÷û(‰VÍîÖç.])8Å&Æó¥ýç\§Òmº^ú¹øùË GYB-r›0[åéb;O\ka¼õᖆ É.ßî§_ˆâæ"Âïυ! + eGdQï*Ւ™ÀÊ|7±÷«vœ‹z+'•ËWô Ê Q…lKB$•ÍÆ]қ]Ø3´Å՘-* ‘”‚ñ­¡|öyâû\ilÓS»‰Üç«Þ¦Ý1'íŽ9éîy’›¦<½|f(çð¢j7 ÜEG¡ªIRLÚúè"m& ú&E¯ú:¯ìbÏ+ô‚œx…fCk)«T•‹:]˜W¨*7–ïÊ,:4ˆì éÁ {ð/Æúû õӎ°LÁDhÖ ëT¿€_«‡l»™µ[ª±[DMlÉ¿+ìá&¸­ÛñÝ_ÈÞԋ0&Á»®’,)Á?fçë¤ëǔÏÊ[Ñÿ1m[ 敊ˆ<þ†¿üüê×ó·ç#ŒB$íÍ8çÖ#z—fë4K\Îî;hâ’Ûb.ÒúÃHj´ÃÏ÷+êmÖ«TK×a»˜„«wƒÒÛ«m®®Šd‘ê.ÊåÖªˆ®½rÆGÛ ŒdJ=4"Dz!aYýîK¼¾9¡Ý ÍtszŸÞ׫€j©êbÊ  æ“¼Çp\#F›´õ5Ô:¯º¦Åmõ;1O¶©½Ÿ®*•¾ÃÞ'eˆò/Z;UíhØLâ#úCђ¹Æµëq\/6´s5K!!˜?ŠL*!Ä{ú'‚=)Ç°Sg^&a'üRì„õÞYcוPeôüMr× ÚŒîŠ-<€9pÿ0l’ÿŸŒ™zè›qôÐ7ãŽÅWc8Ž¡&Rƒ ’½Ã^ŽàMa¢Ç·i½›½è¾'yŒ%xd§ýE»a섉è`&“ˆt_’þñóo³¯zóãù^]þ6ÂO2IqL²KSFÂM=©ó-;_—Ë4u­P¡]y7]ô*6Î'£“Õ Rš†+­ÛAYo jf0Uoò›,ýl0üžI¤ <òs¾û|ßMn€WˆóppÕ7ú–:Rí« UójãÕ¼üÅø×Zx{ïŸâlë>Sê˜qèØö—PH€›š/!P ãÉE’X!d÷ë_¦aì}c“Pˆã6Œ®ëºxrvvssƒ /8.J”ÖgE±>Ûûþ÷eè Z&+؛¼lç`z ×{ÙôÿÅ¡r¤ +endstream +endobj +2553 0 obj << +/Type /Page +/Contents 2554 0 R +/Resources 2552 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2341 0 R +/Annots [ 2550 0 R 2551 0 R ] +>> endobj +2550 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [293.433 661.717 336.939 672.621] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +2551 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2555 0 obj << +/D [2553 0 R /XYZ 90 757.935 null] +>> endobj +2556 0 obj << +/D [2553 0 R /XYZ 90 309.035 null] +>> endobj +2125 0 obj << +/D [2553 0 R /XYZ 90 285.794 null] +>> endobj +2557 0 obj << +/D [2553 0 R /XYZ 90 285.794 null] +>> endobj +2126 0 obj << +/D [2553 0 R /XYZ 90 165.868 null] +>> endobj +2558 0 obj << +/D [2553 0 R /XYZ 90 152.113 null] +>> endobj +2179 0 obj << +/D [2553 0 R /XYZ 240.245 89.441 null] +>> endobj +2552 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F23 340 0 R /F8 504 0 R /F65 376 0 R /F7 505 0 R /F31 472 0 R /F72 471 0 R /F95 1788 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2563 0 obj << +/Length 1913 +/Filter /FlateDecode +>> +stream +xÚíYÝoÛ6÷_¡§Íf†"%ۀ¦_h×nYã+Ò"PlÚfKš$7ñ¿£HɒCËI¶`{è“)út¼ÏßOØ[xØ{=8› N^ æI$ÞdîIì‚ N‰7™y—CB Æxx>"xåëèê|Dñ0]m—j–GWïâë<Ê·§§g/®.–Q¦F_&oO^ÒbK¤¡× Içd‚õk‚‰ƒ‡D„ñšàçcž¯¢¢)ÇÀLÒ¡Zg«¨Tf烚«|D¡J¦°HƇa¨Y^N pÁ©¬ÁÀ¹Óõàò öf°ÿÖȁ27ÕÚó)ƒß•w1ø}€{-K‚ï,‹(bÖºe-à]ʼn|Bûl"ú²&(·™J¢5èŅtZ’ÃÀï5%ƒ#YÃñ°l,@8 ”í£ƒ¡ÀSzT¶FúûDåXsñÆ4þ7ÓKnÝp(b©hËá XŠˆú"ÎÁ¢O•ŽmZ 4ö}6üŒ9ž¦IQêGؗ] #Ã£Â6²|t +°ì5|‡Çw†Bò.E@“l<|d²¥"øa4–¡?|žBx©Û¸Ü^™¬½ËX2$X£à´yÁuBˆ„l"ò'KÁ»8e£Ç³_?ÕÂà™Ö ç¿½?÷ò7“OŽÃ “‚ a#®ó +i#Ñeœ¬âDîÒ^Ýf«x—_Ì{·ÞÄ2q$Ùª×Ï6ñjf-2?:HTþuDù0*cýóuDøP¡ÿÞd7&Gfö­,ËÓÛx ´ib¶Ò¹Kl°FÐ=ov$äH»‘1"‘²Šj#µ5âd©jYµë´x•ûŒ@/6k•”f'¶ +Ƌ$ÍÕ 9,Á]±Âï ©ÿ„hJÁ°N4¥íØt%¬${`Lt ÷Âmç,—¸! +å£0Ië¿Ã$“0>ƒÐæ{ £ÿÏ£8)¯.¶xÂø҅ÐÖ@ù´pˆ"*åS%!Жp¿«Ž ;{qaó<µê”uD-!šŒ4&(\â†ùŒì«ÝÍt?µ _EšÔj„Œ“¥Êã²Ø4‹¦v9‹!׊#é/TKþP)›hϏ ³D”ƒðŠö;ÉùUª¼8í0Ø1ê֘j ° æ´-[녮 Ñ&=Ÿé8wN£Ò8 öZN;…);n¬HËeTâ(Wf+IK{¸nó…í?¼x—åuºIfjf¨gñ\ã3tŸºóìŠmé-ç°?ó¢N<µƒöДËt³XÖ²U°ZÁ4d`A7-ב…Ûe¤qÇðiµÌãk½½)•-ezøÑ ÙïvZt½þòvª2]}æq؁ø©8åìô4NF>(­âÙU”ÛúÑÊi°d²ÌSmа%cl»’À÷Þµpîàˆ +¹kM’¦0<#ýC[qd¶o–ñtiþŠ-¥£j#ì£Õjkö‹M–¥yåýx½5TÚ)Dw°çê³Öc¸µÇÒ5œï*¤Ðõ@°€}MH;å”+§ÿ‡rºÈ7.Ž–Sðtè»zº(Üקþë•êlàG[VGAzË©5Aa*!>Ð]>q \ý‰A8=E…[ô—8è’i׸㖄Ç@´"][‹¨•Òjm֔‹ëÚvÑ\­¶Gûò1ӗî„ñ Nþs8y­•GešoÎ),mîæ<ä÷ºýÒG5çúÒ/ƒ%½Íù¢¶€³7 ùx¸¯õ}zs YË]%x-º¼«¢ºêŠZz^wq²Ø£Ïl¨ÙúŒ1MLŸÆuKpW +awÃÐ{©1fTÔPÊwrµ¡´‘J젔· ÔŒÙÝ°sã+˜L>ÔÔá—2È ƒ¾8$ÿ¸ÓäOÒiVè9X”vF"U£XÁõ:«(¶s¯Ûû†Òüf©¾À8±Ú¤s‚uð ¬á,ÿX?1Z·õÒC2ŒR'^CÚ Üx#[º¿pښ¾Šßgú‚Ÿ[mPïô¬Ò¾é«6ZоöXCP*|²Ãàòæë/T"ýÇT˜:;ó ˆîûäՄƒÞ>s×>&üêf)|#¬]=\8 }lè÷‹ÁÑ®ìmŠª U­)Àÿrm¾Y¦…2ËýY®–c–*Khn´°0SUÝaá¹2^¤‰]™šÆº¨Õ$Κ— 0•Øû~³Ýùtg<ôT‡ ß8K\ôYp(Ä;LAÁî3H\8c¼5ÖtÅx‡a7ÆõÔW¹N¤´¡†ë0Ä5ÞÇ«Ò<êÒÐ!luðT™™˜qÖáH + ÷¬Ë¶xXÄ6…pÿ󩡆÷ýzZ}5…³4PÌWSp"çûÃÎsTúícýæÑóð±Pù÷#Ýx™ç÷Q²‰Vf­1ØLÂòÝ].ÑQ3ÚªîHJY%fzõê—AeƝ¼$ÔwÀ‹–e™žœÜÜÜ i6Iœå(.O²lur·hqÑsé†É<Íí,ÍU}¿…MóçŽýÿ—qöœ +endstream +endobj +2562 0 obj << +/Type /Page +/Contents 2563 0 R +/Resources 2561 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2570 0 R +/Annots [ 2559 0 R 2560 0 R ] +>> endobj +2559 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [311.022 541.129 393.606 570.194] +/Subtype /Link +/A << /S /GoTo /D (main_Bounded_Difference_Shapes) >> +>> endobj +2560 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2564 0 obj << +/D [2562 0 R /XYZ 90 757.935 null] +>> endobj +2565 0 obj << +/D [2562 0 R /XYZ 90 733.028 null] +>> endobj +2180 0 obj << +/D [2562 0 R /XYZ 240.245 663.906 null] +>> endobj +2566 0 obj << +/D [2562 0 R /XYZ 90 647.709 null] +>> endobj +2181 0 obj << +/D [2562 0 R /XYZ 90 468.538 null] +>> endobj +2567 0 obj << +/D [2562 0 R /XYZ 90 454.498 null] +>> endobj +2182 0 obj << +/D [2562 0 R /XYZ 90 341.896 null] +>> endobj +2568 0 obj << +/D [2562 0 R /XYZ 90 327.856 null] +>> endobj +2183 0 obj << +/D [2562 0 R /XYZ 90 202.019 null] +>> endobj +2569 0 obj << +/D [2562 0 R /XYZ 90 187.978 null] +>> endobj +2184 0 obj << +/D [2562 0 R /XYZ 107.534 89.441 null] +>> endobj +2561 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2574 0 obj << +/Length 1737 +/Filter /FlateDecode +>> +stream +xÚíY[oÛ6~÷¯ÐÓ&3CŠ¤D[¥7´k×lq](¶b ³%O’çßïP$%і/md}²Džsxnß' {3{/ãÁًzÉ0½ñ­'±…ñ€xã©÷Ñ'‘áˆ`ŒýË!Á~\,ãëËa€ý|q?O¦E|ý&½)ââþüüâÙõÕ<^%ÃOã×g/é¨%’¡H +0ZkýY‹8– F³ãÊ­À“cž.ⲎŽA™ üd¹ZÄU¢WþLn“bH„ŸdXŠ$徐Jåàùxðì‘:’Üä┼S]{ +GÁ¡ +¨uóɞH5=ÒqfPêÿ9žäYY©[æ_䛾` DDtÔKj%Nˆ? ;R+ŽÊ´„ä®D47¹2¶éÓĐ`MŽXDý§9_²I«ûkÝÔ»úø652i6ô˜ÑÊ%ˆÜøÅH:J ›ºýõ÷×Oß½½|óü¯Wã=zE¡hÂÉ"=*Á¤šù˜f‹4Kà˜! €d³Z¤“´ú¤÷qÜuš`P)§#ˆ$Óû/Öébjf\¬.ž]é‹|]™‹[Gà&ß º°Ñe0ž×e 4ôÓlžiUêåJÿúå*žÑiºL²2Í3ýOm©´­żÕ~£ZÜ®ôc,òÓR/4{—¹.ôÈ_É$-“­ Õ<®¬Ÿ“Åzštü´Çëä×»™ÏÛU‘„q*`ÔgÀ°‚)ϝí­·Î¡´°ÓaNwª½³ÍI/‘PMíè`é\é‹" ”IV¥ÙL¯TV¦Ix•›Mv³ôö¹‡GÆôˆp$BÑ×?ûœfœ·N§¶k`­¡6L ÚÒY–ÉԈ•['‰³êm¾Ô·ëÒJέè +fy–/SSõ½ösH¸_ûrÿpŽÃ®$™Ã´Úïç›I²ª †¿0Á²­­²šžŸ/’lVͯ“¢È‹CQ‹E¢¨Z‘îßA Qøé­ú¥:(jÁt›Zët›úº­g¾°q.ÛA»é&A¬²:~“$Q“D)6¶©¿Œ7ér½Ô«ñb¡=UYQÿ6žà™ÁÖ& + ·õŒ×¨wKRÀbòÌåEò¡x‘Ø¥¤ŸyîÈCPW’c'b(F†ò&ÇV?ò½tÎßÒ M‹…AÀÝÔ½,RӃ} N)ŠÂÆÁ™’íAô…8ê :‡œž†èB²“…àG#úGò@@Z0ÿv$Ww¡œ9PN,XbʉÅXÜB9q¡Ü˜êŠjc€å̪Ç.–w­mÛ±XNºXnOX j,Ç–“,ÛJ; Ì;sþ[Á88ȘÀòC¬ìàð«hcÎ[ ¡þ»Éæ|<ƒYHü ®ãÅʄ“_àýû~ïC,Žd¢££÷mF€"ÒHäe‡€^ê²)Nz!zPzë¨å4}¤Øøö›®Gf?’#á?™üܹ•83,h¢Ê%³@Rªb9ðFjL+ƒ‹ ‚;^¬™†j­Kƒà¶¦A­(sŒÃ­1ƒT´æº´¨µN5”v•ZW--êº[Ó¢žw’Ôὁyš¤{bïëxÔ b‡$õàÁI“±ý4=:i +¸¬I“ú5A‘M/Âe·ávi +;¯Ôí$v‹!Þ~6r“c¹aLêÆaL}~YðÅ Êh |ÆÔÄdû›R($âÔOJõ§$8“:*”®þ”ā-r¶ÕA—êtŠ6˜[Ëô­!úæ}™?9÷M­½³µ­3…ÑŸ•*&þØÇH}^Sx L‰«$1‡Ô'ûdzW¿ ê4µþxæ²i“0¯ªÕùÙÙÝÝš”h¥«¥ÕÙjµ8Û-¥ŽHeû}åê®vl =fú-ƒÅe\õÅÿ?µ;! +endstream +endobj +2573 0 obj << +/Type /Page +/Contents 2574 0 R +/Resources 2572 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2570 0 R +/Annots [ 2571 0 R ] +>> endobj +2571 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2575 0 obj << +/D [2573 0 R /XYZ 90 757.935 null] +>> endobj +2576 0 obj << +/D [2573 0 R /XYZ 90 733.028 null] +>> endobj +2185 0 obj << +/D [2573 0 R /XYZ 90 527.358 null] +>> endobj +2577 0 obj << +/D [2573 0 R /XYZ 90 512.82 null] +>> endobj +2186 0 obj << +/D [2573 0 R /XYZ 90 309.486 null] +>> endobj +2578 0 obj << +/D [2573 0 R /XYZ 90 294.948 null] +>> endobj +2572 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2582 0 obj << +/Length 1746 +/Filter /FlateDecode +>> +stream +xÚíZYÛ6~÷¯ÐSk1—§(ºEr¢9€4Ù>¥!Ût¬V‡+Éq¶¿¾CQ§-{µX/û²¦´ôÌpŽo擌/v^ž^®^ºÌQH¹Ôu®×ŽÂŽt ”8×+çӘD&S‚1¿Ÿ<öÓȟ¿ŸPCçãè·>ëYÊvEãYÄJß¾ÓÑ,*Œ{¹‹—yÄöêy²ÜE:ÎýâX⧔#ÆU[N¥¼:è±¥BœÐs1€£‚ØrC~³Õ±8óz#"\äI~6$ª‹$ ­´ûåF˜¹gs©£¶ÏtðÆòœé_Ìf‹d¯²ù´Á”I‰°`Îä(QFt]¤TÍýEbÎ÷Õü)3î,ð2‰³Ü^¾ bí§ó߶6 ³¬øÖ%ÚÖJŽ<¯>6_ë9µ‡¨KªM ‘X‰V¯ÝߖÊ\ě#~ +â¬úl7 +ÜÚ8¥T!¡Ìq%r¡ÆŠ/|Ðù.³>Á q¯Î‹<Ýé¡´ãÚÚ`mmõã•]$qxcWð¯c‚#Úä@ãs*J8("©K5ë4‰JÍ&hÂMTA b+”vQ†#L/cÖcGÊ«ç› ë³Ž!UïAøTèqØ)…øsª`!pKh~ñm©·²YçˍnyHbAà–p­ˆ,_ÍfpJÉê‡Ájî§_ +´9°¦c·HÕç¿Þ¤É„Šñ>>,NÑceÒ Çõoä%\ßU––ñ^pvS‰Ó ^&Ñ0wjÔSjSÊ0r ÀÙ ´¡˜>BñwÅ X¼¿ +azGö†Â° µgaXü/a¸˜”[ Ø¥òR<„$»¼‹G¾$ó³K°×„œaÆÈY&¨©ÈƒAؽ0ØSHºü,·µöB0.8ÎpŽüoAü£+àIՅàÔ²ÓP 4¦jâ46xŸ‘iϽ†¬¤ËÀ”P¡»O„4áu=d»í<îÑV("/¥aÕ¯ ï@ƒÍŒS‚9àz39¡ØE=¢¹áñ¬ÓˆŠpA¨ëÑn¸Nv'(1N†t§rçPŽSt3FŸnN ʙÞÄ0µ½É,lo2« +ð:@eª‘\§ZFdVcœävð’ß4†«P[xð*¢•Ô-Ò\ØYèé2•ÂýmÒE.BUè]¨ +ä(ÍAlUï7ÁrSâ€G‹Ñ§›X~V"{¾)P ©69[\}5­Ëwéʪq)Úîr½:ߔ1RÊ-[2µ +K0¤ÎuzǶìA¡ÝHêÀàʛÁ¶:[Xàœ]k!Ӟ+ó¤šsìg…¤«Ê5‹?õ2¯÷öDUIX»—& ?œµãc 2¥ SyÒA +yÍ#¿ÚA1Ì6©Ÿ'¥’õ°ä¸Å>«ëÈÀÕ-2~dßJÇIÄ`!(ëØBîv~wÂè"рÇFøs'©*ϳä`cej÷ÄçKS@÷q\þÏÆåրL%Œ åã_×½½¢=†ÜÇLèþMULòºKJ6NÒ>Inúß)wÑìP´íÄ ¸é–p·ì–°êtË'=º 1€ZgÇÒ¿¯Ê€M»„jO‹Çje'&W ¦DϨy—^kì‘ãí™'ϘÙoДcvñn£î ’™fÔ&¦uê…z]6ª]œ'»å¦lև@P~}Ê("²ûւ?䣲s,푤“4q’¤ ~’¤)ug’æÒc +ÅOQ(&é ’æ^JÃI’¦4T$Ÿ"i²1j(I{R24Š¡ïW±*Ö¿Òq{pêS*$¼N¢/}êÚ~ÉWDÊCJò;±?6€ýµHÑÑ?:€þS³Gþ÷Pü¯ž[}û±M‚¸l3ûNu_—.è•wšÖRíCÃ*'Þ TP·¶aä“bh¶€ê÷¾ô“=ÒÏïž~þHÄð#ÞÐ߈¿ [¡æ%óÊ߆…Dõ»6ö½‰ 9ÊËjæ¨Þ^ƒ‡½ø=ÓéèáeJ¿óã6o½,Z¤M&€G1¢¦ SÐxüQëòöd9Õꍥ¥½Ä“ˆ5Oï6y¾]]í÷{´ÌÐ.¶) +ò«í6¼:ŽPK +á¨é½ë*$Q’ÖïßáfTüòúÿ_· D +endstream +endobj +2581 0 obj << +/Type /Page +/Contents 2582 0 R +/Resources 2580 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2570 0 R +/Annots [ 2579 0 R ] +>> endobj +2579 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2583 0 obj << +/D [2581 0 R /XYZ 90 757.935 null] +>> endobj +2584 0 obj << +/D [2581 0 R /XYZ 90 733.028 null] +>> endobj +2235 0 obj << +/D [2581 0 R /XYZ 90 716.221 null] +>> endobj +2585 0 obj << +/D [2581 0 R /XYZ 90 716.221 null] +>> endobj +2236 0 obj << +/D [2581 0 R /XYZ 90 611.589 null] +>> endobj +2586 0 obj << +/D [2581 0 R /XYZ 90 597.034 null] +>> endobj +2237 0 obj << +/D [2581 0 R /XYZ 90 494.44 null] +>> endobj +2587 0 obj << +/D [2581 0 R /XYZ 90 479.885 null] +>> endobj +2238 0 obj << +/D [2581 0 R /XYZ 211.842 234.629 null] +>> endobj +2588 0 obj << +/D [2581 0 R /XYZ 90 219.92 null] +>> endobj +2580 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2592 0 obj << +/Length 1983 +/Filter /FlateDecode +>> +stream +xÚíZKsã6¾ûW𔕪F0žàlåd&•ÇVM2ÞÊa2å¢%Èb–"µ$÷קAð)zx4›|±Aìn4Ýߧ|wõõíÕõ›鐆Áí2Ð8!A‚’àv¼Ÿ‚ÈtF0Ɠ·S‚'Q¾ŽîÞN)ždÉÓÊ,òèî§ø>ò§››¯¿½{·Š6fúáö‡ë7„ôÄÍ‘Ô +”VRÿé– 4Œ(oÜzdhD˜h|uLÂ7ITÓ„i:1ëM•ÆÍüb–&Ÿ51馤fb¢‰yõúöê¿W¤à€TÞIÐ;__½ÿ€ƒÌÿ`Ä`3ÕªuÀ)ƒÿIðîêç+\{÷=¬ÅÀJHX )C8ÎÚb»¹[Tú›¯ßÜ{‹jÄ:ï¬ê},Lš­ã4*³ÜMdK÷¿lV€àܬ·k÷ôǔŠI”l͗;ºΜ²áˆãÚÀuô1¶b†¯…ý×xˆË|[Âp!È$Í¢¸67JµýiòäFñáÄõÙFI‘í,lL=gǒ"åpˇÎÎX³_W&uZ;Ýñÿ¢2Î`†akö|nÌ¢x„Lã$qÜ÷ +„iüš…›u»€éM§¥ÚõŸÍ“¬ØæÃÏíüãÊ䵯ÂÀÙ$lOÄ|ÜäþQºÝJn¢ùÊNG\ö…`Æ8¤lC‚ -º˜õ…ڍ‘þqŒB +Ž¦)Rç˜×çfc=VÜ Þ9,¢ÄlÑ=[ÊÅÍMœN9%ñâ.ʶk:t†iÚÝ©<³[xLÛøÛ÷(§ˆàÏ^„ÛÈ®ÖÐA¦ŸKÙ¬ù cæS†´j唫¸8®,oòB {/À£³8gë Äã}âN\Ïà ³$¹v¯~¿ô˜©PHÄ%¬b흇à"\Ë';T6À=‚’Ý[cÎöIN³Òɽ϶éÂÞ,;»Ì³µE÷ٔˆXøc^yT¬fmµZB’ñå21ª]í¹)·yê´ªîü +B ³õ¬Mþ©os)ÕÊåu¾´/fñl1mèeúA3¦ 9Lþ#üÁ#M!Þ9¯ÜÄ,K7Ú¦e¶…\´@žR+ D 0 ° +$¦« †DWʦäïC ©'ô‘ÕÕhÂúicÒh &r¦¼ØDÀv»kà'ÒæŽû,Kœ´OCUa~T ´ú,§áƒ†t ‡ôۇ£ê_2‹`ãê>®âùªÎ +pÛÉó¨0;ȟè‘K1½ð„KK?Óã'0=‚ûûý”Ü £È6¦˜äM´C/×BéQbmE‹]ÑU-¶ƒ¶`ÚW0«é¶`†ÂK~ Ý}·6Jöa¶«½#{öi„ìfÃÔ7ÏdiC¨ð`Êfú šql™ýÎ×909 yˆu:›ªÕ¯û¨ZøBÕþFTMS5=JÕ¨>ŸªI²O¤ô‘ê…ÞéTͧAk`çS5ÐÐP55FÕB©Î¤j¯jžF7áQ}gÒ>xò© Îw¾t(¤ðŠ֐{„BÑé"êÔ +H¯) x¡€/ð9°…­‘û×4AÄx“ƒ„P¾¥> ªuMkQ­ ­k§ñO¨’ÉúÂ@_è_Å@ôt ¢p¥ÎëéÒaO—…asOšž.Ј~OW‹¦§ Ø«e_éõtí“û°éØÂLÕхÿmGwçóñŽ.?( ±ßѵ‚{] ·j'_…Ö -]Uñt)ø Óÿ{3}Ëüä%¬´W:ÚÔÕãM]žÒÔe#]]=ÖÕ=NômW—œÒԕ‡zºú@OW^€æÛfìQššîe‡zºáÿ³§ÛÞâÝß\…@&ˆ:õ'WÕO¬ÀŒp SõØ„†ÈwŠë[‹Š,¯ïkïþ]˜üS¹Þ=ÿ+J·QâƖ4»äº‚ÓLjZJ…,HƓwÆԛt;ûOЌ~te¶³—(‰X÷Ѫ,77×׏h^ mor—×›Mr½ŸüzR Ðu¸lÄ:ËÛr “몎íùÿOU:êl +endstream +endobj +2591 0 obj << +/Type /Page +/Contents 2592 0 R +/Resources 2590 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2570 0 R +/Annots [ 2589 0 R ] +>> endobj +2589 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2593 0 obj << +/D [2591 0 R /XYZ 90 757.935 null] +>> endobj +2239 0 obj << +/D [2591 0 R /XYZ 192.853 604.83 null] +>> endobj +2594 0 obj << +/D [2591 0 R /XYZ 90 589.416 null] +>> endobj +2240 0 obj << +/D [2591 0 R /XYZ 211.842 359.287 null] +>> endobj +2595 0 obj << +/D [2591 0 R /XYZ 90 345.253 null] +>> endobj +2241 0 obj << +/D [2591 0 R /XYZ 192.853 89.441 null] +>> endobj +2590 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2599 0 obj << +/Length 1412 +/Filter /FlateDecode +>> +stream +xÚíšK“ÚFÇï| +80;ï•ÊÁŽí*'®rÖää¸(-hA‰ˆ¤5æÛ§¥Ñ±BbÍâ²×>­¤mzºÿÝóSK€¥ƒWƒgÓÁÕKɃŒ¤Ò™Þ:;J$(q¦ çýDFc‚1¾L__½$dÏ-1)£aÑÜë/Ö¤±2ÁˆòÒ`Úâà ÂDiðkŸ‡ç›$£1œ:ô֛ÀM={åÚ»õâÑC/œÃ%e˜š¹¼˜þð‚’«!R°î|=xÿ; ¸þÚÁˆA2ÛÜjípÊàoà¼ü9ÀÊR†°µ²ˆ!U¨›–ÞO\Ä íÒBä¦4Hw/tא—À¬UI¡‘¦SJŠ  J‹›( +¬·óz#©ygdËvõˆ&!Åd2ÂÔõÃ$³tÆLcd˜vÆàLj¢cÁ,Imotd  <-¿`ÿd Œh(]e¸kqÁ¯]@vÄ&fs´æû™D¼–ì½~è}°†ïŽ‰àп ’°Dþk/½‹­À‡Žâu½ÓøÎkqJau\uškcuÅ=ˆÂ`gà_ù§é~ªe²Î³–882ºZ!]ùIoû]s˜”@ÒÈù®2ª"Ê¡RRá Pc¢a'*”R$ˆ±yñiîmRª5i|¸vÒì6àËÔ-¤‹ÉÄG?º¿˜¹ñòní…éA4¸ ^QfºŠ£ÃmØ¡>§è$ñéƒÄÏjß‘H«NÝ5â5Ôܸ@ý‡¼Psì‡óh½qSÿ&ðP˶Ó ?pãL€+ÖÀ´¾ ¦¹Pí˜Vˆ +փi†iә·s1M©ìÁôÞ²G8Mê]r§“4öçi°› R+ØÚ4I]m˼²§s›dÌļÜÌô‘[ö‘»vq ݽäf!·unñtÁ]¶Q¥Û1ŒK´¤„q + fPz‹qýã_-ÆÍ1NAçVŒS$YçÌ +Gæ€â™³³(®2¤“âÙª¤‹xi­Àp?™-üäŸÈÓ +ã’ÃΠƥµ¼Í½¢õC1n$"Ä|ÏW +<Åӟ¿;Ø¡úØ¡[Øa›²gWiÎâòÒoŠ¼ñO½\}T8§Ñ& +¢å®Áæ¢âóÆ>¤±jå7Áý׀Ã>àĸÀªà´2(a={…³k¢„´­÷sˆNô§ =D§º‹~c%fB4ÇêÐn_–ÙTf[?]µ²ûyvÃÄUœ·ÒS@IE¥ù—ä'Å$—×ÊOÛÉ«¢oã"Ùâú* +~¸´'7^ºõ¼°‡YrBыÌRÍøæµÔ÷P 1z(ñg·0*g¡ßò; +r‘;T!„FR˜®B»c>íÂ-X`ÖNKòƒ–_5-—0“åß@§%t¯Ê3_¶æÁ±¸.áAŠrÙþÖà›Ãe©u .á°V¤Ô¸á¿x|9 ˜0¥k0>w$ÄËú‘ékæñRd÷-ºKã—g!S*$Ë“7‘I¿!d¾ò¾3dBÂ^ì¦åCE;1 ôGéxÙ:^îñäqÇK œ| +Óå²Ò¹…–ÙW°ä@à{Ã¥:u¸ÌR2g—O”•]uüÊ®:õ7ùo P1]üöA$/µ-b\‰WÅiÉ+{Z@˞ü•xñÏ#!†Åžyã†wnPSâcæʋ‹B¸ˆQö*/Ûßh4f€ÅwžW$i3û×)~äÚÖñfoO÷¾áZ¥éfruµÝnÑ> endobj +2596 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2600 0 obj << +/D [2598 0 R /XYZ 90 757.935 null] +>> endobj +2601 0 obj << +/D [2598 0 R /XYZ 90 733.028 null] +>> endobj +2242 0 obj << +/D [2598 0 R /XYZ 90 642.023 null] +>> endobj +2602 0 obj << +/D [2598 0 R /XYZ 90 628.017 null] +>> endobj +2243 0 obj << +/D [2598 0 R /XYZ 90 531.507 null] +>> endobj +2603 0 obj << +/D [2598 0 R /XYZ 90 517.5 null] +>> endobj +2244 0 obj << +/D [2598 0 R /XYZ 90 420.991 null] +>> endobj +2604 0 obj << +/D [2598 0 R /XYZ 90 406.984 null] +>> endobj +2245 0 obj << +/D [2598 0 R /XYZ 90 310.474 null] +>> endobj +2605 0 obj << +/D [2598 0 R /XYZ 90 296.467 null] +>> endobj +2246 0 obj << +/D [2598 0 R /XYZ 90 199.958 null] +>> endobj +2606 0 obj << +/D [2598 0 R /XYZ 90 185.951 null] +>> endobj +2288 0 obj << +/D [2598 0 R /XYZ 90 89.441 null] +>> endobj +2597 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2612 0 obj << +/Length 1664 +/Filter /FlateDecode +>> +stream +xÚíYَ£F}÷Wð”ØR\];”Eš5Êd›ÌtòÒµhC»Q0ÀÓq¾>· X +㥷É(ʓ±]Üýžs« +;+;ßNžŸOÎ^Kæ(¤$•Îùµ£°ãJ‚%Îyà\L Ad6'ãéÛÁS?_û—ogOÓx{¹ùCt•ûùv±xþòòýŸ…³çoÎ^ÒKG®ò@i%õëz‰¥™`Dy³à|D†B„‰fÁ7Ç$¼ˆý¢˜Í©À LÑi¸Îb¿ ë_ޅ×a>#Þ4L–𓫘˜*¦EN^Oþœ‚REC¸È½Ëõäâvøýƒgn«Uk‡SŸ±ó~òËŒ,eKÑE1ðɄ·l,ÜõÜ㠏 +ØÈU³ Üfa⯵¯ ¥`°ž‰¥à²Yq•¦q-íAEàyˆ»Gj §u¼8g‡ ·"±X,Ó¤(s?J +½Ö™3—"ɝ9D_ “‰ß±À¿éñóÈ¿ŠéJô¤rXîÒFìG?3ž!ÚV8È$u­U˜å}‘L‚+­¥QGIø¡^(poá\äb6»HBWë߅å&¯Êeˆ{mnË|ŽÈ¤ “fQt]›ê'Aý&ñ¶~‚¿vUŽ(“;Ñ°5`Ä»nŒŠ^0t:B£)Jêwi?’’¨xJÌFŒàHymFʛ¨3‚!Õz‰ªþnt¼9eQêÂAR]½òê¯e˜•½°^î„XUBjðL£ –ø0>%HyKµjzK @¡'Ž©×©—sƒ£Š"Œ¥ ¤mw›’ÒÀZÃ_õõÅàï/F€–@vm½±‰÷«¸‚ÙÝz£b½„J¿\GI´ŽþïϲÊëo¦÷Ñ,;…fé)4K ”‡goa>!˪Oϲî¿É²´·Iœ1òÂ0ŠÀÄ0«yõڏ‹±#ŒgÌõNÛ8ڑÎÃbˆà¤ÜΤ8✟<ÏöížÄÀÍ£ÿ÷ßè’Gšˆú€xòB<ÁÑ+}Vš¯Ì¡é»Ý’ã`p¶ò2Ìê#Ø¥¯-¯:Ëᑪ{†æÍ¡ ÎEeï³ÚìŸÒæè·9ÍhüÚ'ԅê—ý£{ÑÏY˜ûeš–û*€å\Ýac£”ü|Ï)è}Î)fD6™.àáø‰…ø'w¬Vù¦¾Ÿ¥¬¿Gg)ΐç¶:—««¬­èƒ‡)""ÕÙ˽¦©Æ£1 D» 4®ØMƒawDÒ<Õé,$/)&kl:õØšMJò$³ÅêõU±›.¬ŠÛ3]ÂJ~îüNù~‡n¢Þcœý»ý-NÍï ô`H ØGêzϳ ¤î'xN÷<…ývoç²OW‡,Q{…VBÌ, k'ʧ¡øá­¨„^…0œx)Z]†‚g)võe¨PH>(ÿ·z·¢¹Æ|mȦþj6ðõ—_‹0ÿr&ÄԀʏ~²ñãÆ?jQо-©c¤/ˆ5úšé¼jÏþpš§ïëRg/ñ`ZÄmeܔe¶8;»½½EËm’(ËQTžeY|¶Û=)ÐôÝ-â5ÔEeØ:ÍÃæ6 ~\WƒÈNüÿüoÓû +endstream +endobj +2611 0 obj << +/Type /Page +/Contents 2612 0 R +/Resources 2610 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2570 0 R +/Annots [ 2607 0 R 2608 0 R 2609 0 R ] +>> endobj +2607 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 272.362 138.508 283.241] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000023) >> +>> endobj +2608 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 252.272 314.566 283.241] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +2609 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2613 0 obj << +/D [2611 0 R /XYZ 90 757.935 null] +>> endobj +2614 0 obj << +/D [2611 0 R /XYZ 90 733.028 null] +>> endobj +2289 0 obj << +/D [2611 0 R /XYZ 90 644.917 null] +>> endobj +2615 0 obj << +/D [2611 0 R /XYZ 90 631.171 null] +>> endobj +1194 0 obj << +/D [2611 0 R /XYZ 90 486.475 null] +>> endobj +2616 0 obj << +/D [2611 0 R /XYZ 90 472.729 null] +>> endobj +2290 0 obj << +/D [2611 0 R /XYZ 90 247.883 null] +>> endobj +2617 0 obj << +/D [2611 0 R /XYZ 90 234.137 null] +>> endobj +1195 0 obj << +/D [2611 0 R /XYZ 90 89.441 null] +>> endobj +2610 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2623 0 obj << +/Length 1707 +/Filter /FlateDecode +>> +stream +xÚÕYY£F~÷¯à)±¥¸§º›¶¢H{FÙ\›Gy˜¬, ̼çק ›Ó؞Ñx’Í“MÓt]_U}غ³°õíäårrõV0K!%¨°–·––qJ¬¥oÝL Ad6'ãéûÁS7Ûº«÷3Š§I´ß~æ®~י›í‹—¯W×7 f—ï®ÞÒ9–(Iå€ÐêÔ¯õ–žd‚µë ˑ3"Œ×¾9w«ÈÍóٜr ‡): ¶iä^ùÜٌ8Ó ö`I*ƧÊ.œ¼YNþœ8[¤ò—H‚\o;¹ùˆ-ÖßY10æ¾ÚµµlÊà7²®'¿LðIÏR†°à­gCD÷µ†‡–;6Èc§œ:ÚªÞPìÓ v·`˜À|ԕ#ÒFcԗ I)êë$‰ôiOAâ zbÇT' qRõÒ͆ÅÂõýÕ¼Üf͙¢caÍÁ÷Š›8xI|—íJ ¬ÜØ_mÃ8܆ üŽ9† y¡/_5{õõZ¼âñPÛhyw#**dãÊ ƒ˜=Ýs@G‡ÒzÓMGa|Ô9îlœS†‘MÁ*‰$@µÿ…ïô»úÇKÒ2t{}•ÜÖ«Ac@ZÒNldÛMÀŠD[lŒƒò}¸>&3onTÓ¨ƒë8 ³m¤ÒH߄ùˆŠtªÙó•i¢Æw…³ ßEªJAËƒàÍ)ä£Qqlümò²®²|Ñ{¾=§⠉„ÍA˜³®;O Íœ6;j½*ë(¬Í5d@àŸ6‰Aaåz&}ŠI>ö aÒµƒêgoÝ(FbÁ(b²)T¡AäAB€Ö·17 p bû™àÓÓÆq‚°ãô{ó—¤E˜ÄŒ•j G^ø‹EÏl<ýäF¡¿r³»Ý6ˆ‹S!TµµÜdɌòé}<›3j—F&‚Í 8—ÈÙm •ÏK¡'K€HrvºpèaMHÝ,ÐÇú!¸"ÏÃØK¶©[„ë(€ôc6&ÙX¹¡ +ÒJ>B˜6Ð+AM¨|º® }3N Zˆó֍jdå»4M²"0[ï@{ùÚ쫺Xõ×O¶n£PJ‚Ý¦ðáv6†r,û°{¤šwxn©Á8òú ï:Ì£C¬›JáZšð$ñÀÊï€l%XÝ2 úºÙôsdn‘dyOQPô´²ýHÂ*»,ú$ÇyV’#‘Êè9’Ó¶†Oe OB_Ÿød¢CÄ9¢Ó)GˆŽÃ/Ktò" ù1rc;m{ŒãI!m]ÈG´sUÎÅ8‹(c†äð!É):½°o$èC¹ð6‚ÛFêå—!6ëdûu]ñ¡˜Ci‡÷ŒÓñ¨ß4.iÇã)3ËK1žfәÎO)ÔNyY6C»Ž=ZÙ¢­)›aœô#È8#ÝBߺ£H¯­ÍfCmæ‚Øü<¨»,UM¡\ibU®Ī+Œatš‡P¼öU†9H0ÙO¯ð.N²sÛ«ÕCz5yÐ<Käû³îÕ² !à}•\zqfº !©ºHC&îÇcÅ^Ýê:stÐÐÜq§í ®žÁŸsîY>WR![Ðó¸j{ëîûæfWŽGª4=C²0«æOíûäB¢þÿ}_^¬ïÛÏÕ÷ÅÙ÷ÅA+§h®žöÁÛÉâd8¢&^ùÏÍóÝ6ÕÃFHMÆáŽçÆúÏÚ<´uýæñQ@3g:GX4èÛ¥‰‘ï< ôùí.22­M0ƒ†*ÿ€&€Ž®¹Ÿ•3Oólžò·Õ<ì[P½Ta'tP:èâ¹{Ô¡ôAR à‡µbøÁI8ŸÎC¿7UߙÀ)Éó‰+Ĺ=(äïËà–LÉ\ÖTI_š±†¾ø5²/gœO @tã]顚}|*‚>ÔLŽ0*¿½•ÄÁÔâvB¥-ûêÿ}¯ÇÇ­¾%?amQØEº¸ºº¿¿G^Žvq˜f(,®Ò4º:eçHSÙr[ƹšó'YP÷XÜVÓ®ÿÿ§ÿ= +endstream +endobj +2622 0 obj << +/Type /Page +/Contents 2623 0 R +/Resources 2621 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2628 0 R +/Annots [ 2618 0 R 2619 0 R 2620 0 R ] +>> endobj +2618 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 524.436 138.508 535.315] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000024) >> +>> endobj +2619 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 504.346 314.566 535.315] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +2620 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2624 0 obj << +/D [2622 0 R /XYZ 90 757.935 null] +>> endobj +2625 0 obj << +/D [2622 0 R /XYZ 90 733.028 null] +>> endobj +2291 0 obj << +/D [2622 0 R /XYZ 90 496.525 null] +>> endobj +2626 0 obj << +/D [2622 0 R /XYZ 90 482.16 null] +>> endobj +2292 0 obj << +/D [2622 0 R /XYZ 90 315.213 null] +>> endobj +2627 0 obj << +/D [2622 0 R /XYZ 90 300.848 null] +>> endobj +1196 0 obj << +/D [2622 0 R /XYZ 90 89.441 null] +>> endobj +2621 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2636 0 obj << +/Length 1619 +/Filter /FlateDecode +>> +stream +xÚåY[›F~÷¯à©µ¥xv. ÃXU¥\«¦·4»U6‘5kÆ6*ðnÝ_ß30ƒY³I¼R¢¼‡9·ïœó `gå`ç§Ñ³«ÑÅ+9IzÎÕґØAœç*p®Ç„ 2™Œñø̈́à±Êb53¡xœF»µ25ÿ5¼ÉT¶›Íž½˜_®ÕFOÞ_½¾xEÈÁ²DºHH”–«þP‰´4Œ¨[ \õ¬!a¼øqh…ç‘Êóɔr ‹I:Öñ&R…®®¼ÕKMˆ?ÖÉ. ÉøXr³äèåÕèÈÀ*Ø!e4¸@ô.âÑõ{ìpýµƒgîJ©Øq)ƒcä\Žþᓑ¥ a7‘E QlÃ[Ô{î»  +ØèÊZ Ømt¢bpÌü7”F¤ÉFo,«%nÒ4ªVû<ä € ¥¶ÏtB‘ç4ÝÄb/0›© ˜O˜3e’"Œ=g +±—Üæa‘&y‘©0)ò¹J‚y&aþg‘òs\JT§Ï÷ÂóË])«.W™!ù” äRQ²È{Lõ•û´*be×[}Jj¡ë0‰ÂD¿¯9>Kâ®÷ò Êž-ƒbm}:ð¸º&=z¡b±ïuÍoi$.rݽH‘vôäJ—Õñ&Ý&ª“ \N(C-š:´ÆúÆ4 “U¥‘¶ðaJ‹&d˜õ˜î"éï#V¬Ã>Û¡%Ù ¡²öëâídiÊ(ER9¥pùÈ[]l¡‡ðq’ϺO·òç#%$ÅG˜³êÙ¥ŠrÝc£ˆ‰= B3@¥ bílƖXg:ßF¤¡$4”b7ñø€wœ@¢ý¶s¶Ì¡‰:ëø׬#ïõ“¢æà‰6| û5yººžÅZYÏîÂ(²8²ÂPÝ:È;Ø9ÄÔÖüËzS„iò‘®É¦mäE0›Aá¸x|«¢0˜«lµuRœòXr$iãp–øß%àŠ(sz xç±sàÝCÞë6êi5aᕼה¼Ête{‚ë9t&‹4Þ¨"¼‰ôs“Ó¬OH6óü~eMM“P‘WUu€‹us‡{Üm7w $‹žu¸X·K$Ií½à«¨®¯|»Ù¤YQ7ª›]§Üž½°r娫úVƒ*ÔÁ“aÙÊ҉·Çàt1´êNgy¡79Y(cA?@ہ€’6>/µ¶OvMp®K{ŸVfÿžÖ¤(M:Nþ „DH+S*í>¾úc£3U¤Y»Òë–Úu&ˆ[ºM=Ñ&Bä#BrñÏ'BòíZ±˜Û-"̇YÑÇP!¼ËA*ä?„ +ÑQ!Á¡ÒR!þER¡#Ýiß ÐÖ9á©ežTmV ×꣧ç*…â&ƟʊH›,œ$Eþ×KŠH›û=€ DÇpª±ÖbDû[=€r}Ä%y + L Ÿ q½¥%$r=ò¥«]ÛßL/ Þʶ5@1C¬“ÓO`‚äLDÈ¯Ÿ Š³1A÷ÜL}QL°—÷u°ø·iKªêžÐ’g'ûÄ1ËÊc„ÚŽhþ©<ßƛŠ½1BìNÊÜY¨¤úscŠU°¼0P½Ènjy»I­Š|»€Ý}¾ÜFVAVµñ´ª¿ )é'd’±ËÌ(±K˜,™cã@Øv„GÊì¨íp›\-uÑ@RÓËwݎ1Ì×mÜË´ùß4]§J×Å}t2:Dכ-ö­ÉrՊ¢ì€¿S¬xC¬½­÷±vŸŸ‘µCÛ[eۃ÷gÇo,íýAšN|¨q±Þb•÷»Hýó½²ÄP¬‚ÝûʲÀ0öÀAH‡¡‹ÉÁPióýaš©|k~T¤ëáqDîRöwPñƒ]Ī·…šQHöVÒðoèȏAQWùÀì¡MŸÞ ã“A|‹wOt?}ëÄ0lP„|ä—ÅÝFž²þC¿•ß‰@—‡¤nZ}'âqîvöoÌ´4Ý˞Öí«:µ=¬:ù+×Ù÷ÎÇ6:¿©d«¢¦=ܚ¥û1‘ùvfªÙ²øfUžýãÔÿ~©vr½Äˆ5|r]›ÙÅÅÝÝZäh›„› …ÅÅf]cê``xMëYŠPnPÓL×5ãr´Åÿáù'é +endstream +endobj +2635 0 obj << +/Type /Page +/Contents 2636 0 R +/Resources 2634 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2628 0 R +/Annots [ 2629 0 R 2630 0 R 2631 0 R 2632 0 R 2633 0 R ] +>> endobj +2629 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 528.286 138.508 539.165] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000025) >> +>> endobj +2630 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 508.197 314.566 539.165] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +2631 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 218.324 138.508 229.203] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000026) >> +>> endobj +2632 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 198.234 314.566 229.203] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +2633 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2637 0 obj << +/D [2635 0 R /XYZ 90 757.935 null] +>> endobj +2638 0 obj << +/D [2635 0 R /XYZ 90 733.028 null] +>> endobj +1197 0 obj << +/D [2635 0 R /XYZ 90 500.832 null] +>> endobj +2639 0 obj << +/D [2635 0 R /XYZ 90 486.55 null] +>> endobj +2293 0 obj << +/D [2635 0 R /XYZ 90 190.87 null] +>> endobj +2640 0 obj << +/D [2635 0 R /XYZ 90 176.588 null] +>> endobj +2634 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2649 0 obj << +/Length 1827 +/Filter /FlateDecode +>> +stream +xÚíY[›H~÷¯àiKquÝ¡¬ÕJ“d2Ê\³“^íC&²Ê¦ºƒ8==¿~NQLÛÝJ²ó’—n(ŠSçúïÜ8ø~öüzvõJ²@!%© ®o…ƒH$( ®“à]H"óÁ‡o懺Üé՛9Åa‘ÝoMRêÕOéºÔåýrùüåêíVïÍüýõW¯9KG‘ŠáÐFê?ݖÁÉ#ÊÛ ×2"L´þuI‹LWÕ|AaŠ†f·ÏtmÜÊoæƔs‡&ßÀR¤˜•´"gß]Ï>ÌHÁi¼!"Á¹›ÝìÝ{$°þC€cîš]»€Sÿ³àíìß3ì=‹ôp¬Æ<ˆ¨DDr§ìwl̾N‹¼Z6JŒ¥\½RâØÐEX KB8U,—i>ç8ü¨³4Yéòö°3y=xõJàc— +¤hçómYÌ©ïòù‚ ¦7ÎÇôX{·£ý+¿cÌ| ŽõãHŝØz›VnÏàh!N»pê<™C"¤0i÷ln'åÄy—Xº4Nù$Û+ðè"Í7Ån¯ët™gð0ŠÃ¢œ:Œa$ÉcN‹º=E^ë4¯Ü‘ÚîŒSDÁ²”NØy[\¶Ù¼Û¦›­»L}–æEí. +ȄÎ²{w[öû¢¬Mân×~¹ÞzQÏ_ú}Mé5—I±µÐD‰,˜B’‘`Á1Š¥ìk1D™/ôº­•ÓŒ9d>;WÆP-¼Ëú~or½µ$“E-1"=.LV5CQ$Ûë¢Èœ´Oƒ#‚ä8;¥:¡Hʳª[_t–K$«…OE¤O9N’j±Ú¥yºKÿôAý ;*Ÿ%/ºÍ«·÷„Ì-ãÔÀå1â±<Éì±½4îëZ©!(¦]…¼Kó,ÍÍû‰2YЈ!G`_„$õ(÷Ülµ ÕÇ9¡±iÏe¨+PoË[¼¿}? ÞÁó(´N;ṟàí/|ÓªÞAülވZÛÃþÍÖ¹•{æÊ ÖKS²:ÍoÝmS]ð¼©./§4õ¡Ì]$ñ°Îí{~€]ÕÜè¬2Nc8µ»}›€Zdt°·ˆÐ>ê Àé<„¨áú~.EˆFeìç1B@²‘£‰Ö¬—fïÚåF[ šnQc¦ZÔ[cÎÄtþÖ©þKÑöé"YúÉØ®¦m·ô›ÆîøuoJ]e5΃ID„ ›FDþE1z)£—QueøÑâ`‘&Nâ'£"‘—Pñˆ1<€Š±ø¨è³Æ'Þý&3$èQñ P½E‚ý_¡2 î¡Ðõm’xêb‚e1p³d`Yä˒@×È_©ê¨A݂ćCj)ßGûGg–-¶J KêÄïÀ4§øšԗç)”%u¬³ èé°6)Ôä‹|†C Õ¦|"_Žt Üü¢²KôуÆæ½C¯4Otí®îÒ,sWk¿ò¼ápv[1Tµi × œEÜkNÂ.^°VLQr†m¶Èϑ- õ¸‚,WVáëÚÛfðV¾T©cÈ°TwÚw¨uט6¶×7µ{>Ҁ¾’ŽºÎשèëTôe¦¢'¥á-‹Ò¥MäøÝòlœä൫rÕ28pµ®ªÃnï) Ü·¸¡ÂöKkÿÒN'Æ­Ӑ‹‘¸ Juá9ìÝ©*¬]¯êæyKw–±Ö¶å§ýCÇ{݆&>°Öj+4¡·´‚’húJߘ6–‰®TXX¿÷0ñŽ&¾N­ÏÔzŸ=0Â>en•a}&²FEÖb…ˆTC²v:·Æ±Ÿ[ÇðÝswë¹rŠ¹N"Îïù†4ÕñÀGƒ5Ž=ÒÅÑ``…õø⣁UµëôlJ13‰/ §{†¡£q÷ïR1RJ~Q-þÉ/ˆ<"“ ""$¨:‹(Áéˆj~Ât,ùY„“™: à7Æ/A ê!ÐåÐ:š› cëÔ¨«Ý¥õvÕOYýp7x<9¦ + ðÓ·õ qRöÙpD´É¬Áïuÿ©ÚiO·Sà¾éÒÜ>²wBN¦#K‡Ç€|}î-Z8wÊ¦:jíùëâ'-Lw€­ß˜òhXMœ°ܝb…xOÌ?u|"›l™ãäˌ¶g‡˜TD?ܘq íØZ¼öÎMëø¸¾èügC ~">šÓÛ¼(ǃáøû›ŒÁ©ñc?¿5ŸÛÀ^‰TÄbÿAS(p1YüÆ6s‹Bþ¶…!wë±ÈÝ@”ÿ˜ zü¬óƒÎúâv¼ ¬:´v0e‹Ò{³ï*βÿíՏ³&Ñz}I!Ö̶®÷Ë««»»;´©Ð!O÷%Jë«ý>»:ò‘ÂQÔ ¹ih=(¶+ÊÖ÷9,îšuâÿ¿‘.Ê +endstream +endobj +2648 0 obj << +/Type /Page +/Contents 2649 0 R +/Resources 2647 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2628 0 R +/Annots [ 2641 0 R 2642 0 R 2643 0 R 2644 0 R 2645 0 R 2646 0 R ] +>> endobj +2641 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.616 620.655 327.1 631.559] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_0cc08ca5d72d5cf465eb7812ffbb156a) >> +>> endobj +2642 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 584.279 138.508 595.158] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000027) >> +>> endobj +2643 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 564.19 314.566 595.158] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +2644 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 219.431 138.508 230.31] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000028) >> +>> endobj +2645 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 199.341 314.566 230.31] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +2646 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2650 0 obj << +/D [2648 0 R /XYZ 90 757.935 null] +>> endobj +1246 0 obj << +/D [2648 0 R /XYZ 90 683.228 null] +>> endobj +2651 0 obj << +/D [2648 0 R /XYZ 90 668.855 null] +>> endobj +2294 0 obj << +/D [2648 0 R /XYZ 90 556.318 null] +>> endobj +2652 0 obj << +/D [2648 0 R /XYZ 90 541.944 null] +>> endobj +1247 0 obj << +/D [2648 0 R /XYZ 90 318.38 null] +>> endobj +2653 0 obj << +/D [2648 0 R /XYZ 90 304.006 null] +>> endobj +2342 0 obj << +/D [2648 0 R /XYZ 90 191.469 null] +>> endobj +2654 0 obj << +/D [2648 0 R /XYZ 90 177.096 null] +>> endobj +2647 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2659 0 obj << +/Length 1600 +/Filter /FlateDecode +>> +stream +xÚí™[oâFÇßù~jAZ†¹_PՇM7«î¶Òv“ö%»B8Á*Ö6¡|ûžñŒ sIBV•š'l3>sæÌùŸßÌ÷Þ·Þ^·z—’Iep}(I $¸7mBét Ƹý©Cp;L§áàS‡âöl²G£4üߦaºê÷ßþ2¸‡ó¨óõúC ³Äp¤Œ†N «?¹&µž F”— ®lD˜(ü|ÌÂÅ$̲N— + Æ mGÓù$Ì#÷äst¥¢ÛQ2„GÊ0Ñ6ʚl½»n}k°‚RDC(¤ ßá´uó#xþ!ÀˆÁ`–E«iÀ)ƒßIpÕú£…}dñÞkƒ0恢ɝ³ïþFó<ž%Y¿pbÛJï҈́j¤° º áLdù¨ß“Çí‡paz¿˜FI^3Ø»x3¤ZÅ|œÎ:T´—‰ R|çbL7½ç1Y¾ñcæçaÓ=ŽŒ®¬æã8smj=Ãè9&e£0¹>‡‚< cçö–]¡‘¦|gØ`U#.«$ S?Û£âAt»q2œMçaßN"ԐAМ#YÐeiÅ×@ Q児—¹´›£šCf°CiÙÄ«1ä«y”„Sð“+Ҙô}‚šƒYO¯²þÁjtœÁç)Ô$ùAÅBÏÌ’,DŽ1~ÈûZ8ú}'JÈ+šDƒ®mS¡ÒFAº“uº/ã|<€l¹ONÃv¢¿`‹ r·[ÿàú¯KI*´N™á}ƒ‹2•¯S^†Ô×4­rþ&N&q}mÈÐ.Ñ,á:¦~4f‘¯Ua©ƒ¹»•»›ÝUê(Ôà6Hѝ¡Ôz'r¥’o>sfSpw—ýE¶Ê ÓëÜÎÉ(•ºº³õJ©u)«ZîV ¢"”ŸP7ȱºÁ©Ú ­ÚV×2c@ -@Ô _EÝ+^ ¹IÕ;§á $i^i¶C³ Zž¨GHðIô‚hJ;!Mô2¯ôú¯ÑË/v²#»¬£ô¢X"£èzmԄ¯ZÕy>¾EXñ'm·òݕûa|i$ÈÎàêÄȝý¯ðe4böP¥¨¿ä¼±ÃƒµÐºtc´¶~4˜*Ðö?;'ö÷Öÿç&àòb3 Š¶ÂìUQmóaÅûåDٛíM›mé7mqi̚°RdHŠR‡Ò9~ã8†×õ ¿Bîȝ Ô'QŽr$•l¤Ã/H9"°l$…Òˆ°ƒ˜£)±‹¹Ââs8G1FBä\­ë&ï»æAbÖ´qïIµf]ì/ûQ L㦯i£…´Zå<„é‹£Š0^¤em§u9¶È‹þZ48ÝÙ¯é½ÿLñù}+¸) ;D´WÐÅ(-†¡UM«¾eó9SˆrrŽó}…4©$fni”Í£aî‡3s¿Ù<,ª¢ak}5„$øΜÔK¾Bf½zK4ªÛa–A µH¬ÂXz³˜¬Ù Tf˜ºµ.zN\NÇ&5°ÖE9&Ҝ…š¬¹GP³XŽ¸YªUÁí­Üîqã†øŽîÒìꐜ`òÅ VŸýÁš“³•}ç½ûÝ,Zä×g;\ߓÛßE¥†¶úÔÏ¢ÅgPèËÎ0ÓþC³0H¾•eŸl³”ñ·%fÜ­g»e|úcGˆ¶ãïaKªu‰°¦@&Uø0²Ÿˆm¡ö‡WQYOÝÈþÊ«­"~k‰V@íJÞã<Ÿ÷{½år‰†Z$ñ> endobj +2655 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.4 184.234 212.124 195.138] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +2656 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2660 0 obj << +/D [2658 0 R /XYZ 90 757.935 null] +>> endobj +2343 0 obj << +/D [2658 0 R /XYZ 90 698.567 null] +>> endobj +2661 0 obj << +/D [2658 0 R /XYZ 90 684.802 null] +>> endobj +2344 0 obj << +/D [2658 0 R /XYZ 90 551.762 null] +>> endobj +2662 0 obj << +/D [2658 0 R /XYZ 90 537.998 null] +>> endobj +2345 0 obj << +/D [2658 0 R /XYZ 90 404.958 null] +>> endobj +2663 0 obj << +/D [2658 0 R /XYZ 90 391.194 null] +>> endobj +2346 0 obj << +/D [2658 0 R /XYZ 90 246.198 null] +>> endobj +2664 0 obj << +/D [2658 0 R /XYZ 90 232.434 null] +>> endobj +2347 0 obj << +/D [2658 0 R /XYZ 90 89.441 null] +>> endobj +2657 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2672 0 obj << +/Length 1532 +/Filter /FlateDecode +>> +stream +xÚíYÛrÛ6}×Wð©%g*w’šNg’æ2MoiìæÅñhh ¶ÙòV’²ª~}/¢DQNâØyð“IZìžÝ=±umaëõäùÙää•d–|I¥uveùØr%A‚ëliÛ„ âL ÆØ~ëlyÌß:Ûi´¹QË<˜ÿ^æA¾™Íž¿˜ŸÞ™r.Îޜ¼"dË,ñ9r}­¬~o¦ôV&QÞL8°á#ÂD3á‡c~Œ‚¢p¦T`0æS[ÅY”ÊŒ¼SW*wˆg«dC®Ï„í{ÚääåÙäŸ +Ø"ÂE.¬»ˆ'çØZÂø #Á¬«Y±Å)ƒ¿‘u:ùc‚G‘¥ a):dC¬·l<܏Üã°|ä~3¡Üd* bŒ,±t=Ó“Rä¶hßêԧᲶø9•@1FÂåcÁô–ò~ʉDLk + úBŽ¢‡Ël¶JiR”y&¦>`«!óú^WJ‡Áe¤Šù©ª‡¿1–}±]lÂG¢-è2_ªù–yµðÆ3^׿µI=©g˜ ’fÒy˜D`íÂLx*X£à" •oê>³U© ô%¦vySå`bÊ9¿®ëúÝë‰uˆ½pˆ°7°Ä2?`LA¦IýSÊÕLj§WÆÚk9.xnf!qä{´…ê&,¢¡ðˆÛ²X‡å‰ WE¦¥Sy[¦]XÕ@¡J§ñ®ú[dÁ¢þß2ŒUR@4ŀKº ¥Çûù›ê‰Ö”yКÂíW×@n{þ»Pj¸-µïLá…×I˜\›×ÊmýA­¢º¸ ¦}\.%çw€•ƒ•!¿ƒzyÝ)Î)ÅTó'8…Žª¸¤Ty1ëý¼3Óï ¹ ót´9¶,ô\ö™lû¿Á¬hºQ§º0©Ömªœƒzî:Œ"ótYOí¹1AÁ\D€F*^þ»P™î‘ƒÃï*©(—³Çöm…Ëy_¯Àÿryô;PòÔ¡Â^W»v8ԛœ"q)o<,̂-àÓðŒ3`  Ló?Ó»ú)Mê!“2wœŽô„÷!¤aà]ª,]þlP˜F%ÜXy¿Q!½¥©±*ßa2· ˆK·ßü¹ŠÓÛííõšh¯T¤‡< ¥ …žÂÓ'…0…ÍTP"P›sC¿ƒJ?¶W•à9ºWíÀ=´Y•Ç6«‰Á†-s3a3`‚#³ó<º› wÚMP"û»‰g‚ňRqŽ¨Çî‰g𖜩¦»„¶ü¿ï† `°ûÐ˞A²ÂT"Ïuw2Ó³dÝM8¦ºÂûêE&ÉW¼¼Þvnïnzj5Hä”@óÃö{Èٗ%r~ˆÈ±”ÈÛ%/Ó4ª­}.‰Kq”ÄÙC‘ø*b‡I‡ÿ©etJCF€Ñù1B÷’Ñ}ªIñ‰ÐŸÐß©r•ë£ö.£ïz²uzbæ§WAT¨—0¯Ûr]XŠt€Ô$Ú´¼}øôÖ¥ŒVn)Žgì=‰Õ#‰Õ´»ç§}c³ÛÏÔ •™[ψ×ò@²z.$ëTžá°ýÌÄñ[ÚܶvÇòzà'O¥óôH ?é÷LåA™æÅÎ1ðÀ $„ðZ¶Ý¾ló/(ۜûƒj!\PmwT.(¢^tç/mñó®Úõ­Åøñ¥·ôûºît—›Õ ÒÕ] Q$1­u_6“Hø'ÉC¼köG=’Wp~o7¼U.¥ûIÎïçÚÖ,⠊T—·SóPß¼ì_w®’q­'Rs%½÷=Ç1ËcjïÝQí}hM‘OŠø¨Š¸ûÙNz€…wׯvÕ×:ðDBâ™W­Óxß¹…~«7qš™ë׆šÍkÍÏæåÏBåß:BØu«þ$« ê¨ïV›‚­pÛiÒ¤œ)è¤ÖDö·Õ<ýl6Ž¿ÄsÃm{ܔe6;9Y¯×hQ è¿,Gay’eÑÉ~mY!u}x•æƱ8ÍÛÍ; ƕlïáÿ?R¥v} +endstream +endobj +2671 0 obj << +/Type /Page +/Contents 2672 0 R +/Resources 2670 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2628 0 R +/Annots [ 2665 0 R 2666 0 R 2667 0 R 2668 0 R 2669 0 R ] +>> endobj +2665 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.573 690.333 216.297 701.237] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +2666 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [448.024 589.072 483.212 620.041] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +2667 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 273.218 138.508 284.098] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000029) >> +>> endobj +2668 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 253.129 314.566 284.098] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +2669 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2673 0 obj << +/D [2671 0 R /XYZ 90 757.935 null] +>> endobj +2674 0 obj << +/D [2671 0 R /XYZ 90 733.028 null] +>> endobj +2348 0 obj << +/D [2671 0 R /XYZ 90 568.997 null] +>> endobj +2675 0 obj << +/D [2671 0 R /XYZ 90 554.427 null] +>> endobj +1248 0 obj << +/D [2671 0 R /XYZ 90 450.809 null] +>> endobj +2676 0 obj << +/D [2671 0 R /XYZ 90 436.239 null] +>> endobj +2349 0 obj << +/D [2671 0 R /XYZ 90 244.162 null] +>> endobj +2677 0 obj << +/D [2671 0 R /XYZ 90 229.592 null] +>> endobj +1249 0 obj << +/D [2671 0 R /XYZ 90 126.821 null] +>> endobj +2670 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2685 0 obj << +/Length 1979 +/Filter /FlateDecode +>> +stream +xÚíZÙnÛF}÷W𩕀j<û"´º¤Eº¦‰Û—4id•H–¤b«_ß;¸VŠty±)j8s÷sî¥ppààë‹Ï¯..¿’,0ÈH*ƒ«u`p $A‚’àj¼œ‚ÈtF0ƓgS‚'a¶ ϦO’ÍþÆ®²pñ]ô: ³ý|þù—‹7aj§¯®¾¹üŠÎ¶Äp¤Œ†CË]?öKz'Œ(¯\ìaa¢^ð驾؄y>Qa3C'v›nÂÂú;ÏíÚfS¢'6^Â-e˜˜㶼xruñû]p@Jk…œ»Ü^¼|…ƒÜÿ&Àˆ2·åªmÀ)ƒÿ›àÅÅOø¨e)CXŠÖ²ˆ!&*óµ„÷5×Îcnj2rS/(ö©Ã-(ƹ5%è„%?jKŠ(VõŠ×I²q»éG’£AàŽÕÇ¢À™ “c¢÷l1ŸïÒÔf‹™[̘¦HbÌ`#D­Ý.^- \¢ëxÂå6Š£môG,¿b—IœþãQ5Ä +;å̜ +sy*ÌÛ->ð+Œè¯P͂ýÈù˜-€~¤Z#ú†Ö”Ö‹^Fñ&Ší+¿PàÎB°Š@`X0ªB2°|à³ÒœU‰Žö„àˆêŽ˜HÁ‘эÅM”@%âmH7•ßòm¸ÙØÖm/ü¸²ÁÁñu%[½¾˜rà(ÆH(~L™ÞÑcÒÏ88AúôÒè-€n­;#Ž +Ï c®±k1è_cä­` *kã=Œ‰÷µŸ­î–¾;ÞÙ涨3yíJD†|ìi)¨.0ýGö´ªØÙº>ñ?œ½Ž~‡x@ïu8"m×q )ÖouÜfju´FRœjÚSÇ˨¤êNQ£õ¾iv4Ù|ÀÇv9‹…«ö®ø« !!ÿƒ­ŽëðÌ¡™'Q0‚ÁjsŒÀmÀ„G¦ ÊÖÚb–f6·ÙpÓˆ@—~´Ñ]”kÆ睐ˆÈs)Ѥۨ¸ñ¢¤©-»îŽ{»KŒH[™!†n£Ìá§ë1Ÿl·[éPܔ³Û¡”‚6 ¥Ün\e›€¦ƒÑBƒÇä[–ƒ†ÍD遣Mp€Lmß;ŒÓLŽc”`ÌÕ0|⦠G1Î1ì£M=¸ŸÒÃ8'y‘¤É&¹Þ÷ Î}I‘ù%- zŸS àTý$B2(ìì@šw9 T_ Ê6Ð EK-چÉíø؁ £âÄD°ÃJL™ÀÉpíJ`lÛ¡ «œŒ¶áuI*d Œ¿¸Êa….&îC‘€"mGfcš0hê%P>$á“o˜|¸f‹'wÕ<Ï}©FÁj$Hcë9Sƒfdpè‰--°Œ ÓEFE>Ÿ—¢,üÙÝWå#G jcЕ“mÔØÒl«¾-c7(ë…9$BS>Éeèä›ïØëÈ ÄÖy¥ƒé}ê@$ælÝ!áʎ:€üì`wOizžY&ïö†‘߉–ýžp'©By€õìP¨ ¢Dg2ÙéGvñª×Mªl½‹+@t··aš–TÅ}xã”èå[ßw€ åvMÂõ ]þœ Îï™Ê‡¯pæ +ßj2è罎Lå z;¶R2)[½Ð|½ ’åè#û6Ÿq¬êí*(ÁÆ;çáO]¤,×oûK—ò.p–¢Åtõ  =Bðš Ttç™3™…êc +þc þÃÏ@Q?œ +1©øÐ÷a¼ 7mKâ_Îg­éBkà’8ði_ùyÍ~ ê«oý ìV^¢v㑛¢H痗···h™£]¥ŠŠË4Ý\Þg@]€A´cí؁l›d ۃ›Û’cß³ÿŸD–> endobj +2678 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 578.982 138.508 589.861] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000030) >> +>> endobj +2679 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 558.893 314.566 589.861] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +2680 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.275 248.929 293.971 259.833] +/Subtype /Link +/A << /S /GoTo /D (main_Meet_Preserving_Simplification) >> +>> endobj +2681 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.332 98.244 235.598 109.147] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >> +>> endobj +2682 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2686 0 obj << +/D [2684 0 R /XYZ 90 757.935 null] +>> endobj +2687 0 obj << +/D [2684 0 R /XYZ 90 733.028 null] +>> endobj +2350 0 obj << +/D [2684 0 R /XYZ 90 551.083 null] +>> endobj +2688 0 obj << +/D [2684 0 R /XYZ 90 536.721 null] +>> endobj +2351 0 obj << +/D [2684 0 R /XYZ 90 426.311 null] +>> endobj +2689 0 obj << +/D [2684 0 R /XYZ 90 411.948 null] +>> endobj +2352 0 obj << +/D [2684 0 R /XYZ 90 311.491 null] +>> endobj +2690 0 obj << +/D [2684 0 R /XYZ 90 297.129 null] +>> endobj +2353 0 obj << +/D [2684 0 R /XYZ 90 172.761 null] +>> endobj +2691 0 obj << +/D [2684 0 R /XYZ 90 158.399 null] +>> endobj +2683 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2698 0 obj << +/Length 1845 +/Filter /FlateDecode +>> +stream +xÚíZ[oÛ6~÷¯ÐÓf3Í;)£°vm®º&ÛKVŠMÇÂlٓ•¤é¯ß¡HÝlYq¯E±<ŽêÜxøï“‚ƒ«¯{ÏÏ{£W’! +%•Áù<q $A‚’à|\ô Ad0$ãþ»Áý(]E“wŠûëåÝÂÌÒhò6¾L£ôn<~þËälmÌàÃù›Ñ+BjfIȑ +58Í­>sKž F” Î[l„ˆ0Q,øé> /–Ñv;RÁXHûfµYF™qWޛ¹ID÷M2…KŠ3ч­ÍÞËóÞ?=fp@òr…8ž®zp0ƒëoŒds›¯Zœ2ø\g½ß{ؗ,±ÆMÀ^*‰¨†€©@’‡ÎùˏS³ÉàÖ6\™Øf³ñ8Nº'ZƳI”^Aᓬ«!­Ö}éÚ&v Ã]â¹?Ñu×\ &dqËN¥w¬Ë)^š·ýgÍ~2à~#}[àƒŽp!ÅÍEëívœB: ‹EQ2sk(k‹©¥`×X[Z(Ô¥³l±Þë,5.úY U¶Û>´÷CF)bZÀîjwâdº^m¢,.tÑ]­É+†´.+ç1d7Œx®ÅéN֙oRßÍEte/ïWHK„¥óÕpΧá©B/ö:™™ÔW,§íü:™f¥áò*ÚlâäÊý©Á[6•ru﬐չ‹“œMÖý7ªåp¶›‡¡odéOX ¯ÜnÌ4¶wš™»py×&0 Fè}ã\ {㼙¯DZK@l oÌ£ƒ´Œbˆ…M^ö™"€<\/ª¶×—Û,ή³£di°ë£Tý*€~¶ +`ߪ + ^ÈGŠ€jN<©€'ð…U€jªòª"°låÑ +X »x4lhÕ@• +È->FPŒëÏ!žÝçº-z NäN»¡®L¨¼Œ?ÀŠB´Ÿ³ch¿eÂZ=ö3Öo`s¡%'gw«Ëõò (oKÍr{·j«ŽB„ìZ/DäpHTÀŸÚDŐ Òp§–]ڂÔ| |m!$RŠ„×FB ¬Ù×ÕäýÀA + Ê鱧èAý è1$œAÂ+¤ô̗ö}³SÅÚaQPûë‰D@åÿ6Î.  À 3‚#æô>yC÷ä ³ç#?O;£^7Ž!4 ®˜ýâ¼H*¦ýy õ4€g¸íÑ ¬‡cR[… û#·VÕ BòvjrÄù΁j>Ýçp @Ñ k$aK»ñƒ_Í˧üùSýºËʔEOy U^Ó*„´9å‰ÆmÒ6ìf´®jÙ7)>A˜ÈڔöÏ +Z@»ä—å~:Æî@ÒñL ³NµE+~VGÎFXкù݄•HØ> endobj +2692 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.151 531.827 244.345 542.73] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >> +>> endobj +2693 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [326.612 301.759 384.189 314.677] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +2695 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2699 0 obj << +/D [2697 0 R /XYZ 90 757.935 null] +>> endobj +2354 0 obj << +/D [2697 0 R /XYZ 90 606.552 null] +>> endobj +2700 0 obj << +/D [2697 0 R /XYZ 90 591.982 null] +>> endobj +2411 0 obj << +/D [2697 0 R /XYZ 90 377.764 null] +>> endobj +2701 0 obj << +/D [2697 0 R /XYZ 90 363.193 null] +>> endobj +2412 0 obj << +/D [2697 0 R /XYZ 90 133.035 null] +>> endobj +2696 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R /F8 504 0 R /F13 540 0 R /F7 505 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2708 0 obj << +/Length 2038 +/Filter /FlateDecode +>> +stream +xÚíZ[oãD~ϯð8™Îý,»+- -ÛÂKYEÞÄi,'ØnK÷×sÆיÄN„›Ô§&éäÜæ\¾Ï'8¸ pðzôõÍèê•dAFRÜ,ƒ% ”7‹à6$‘ñ„`ŒÃ·c‚Ã(ÛD³·cŠÃíúi/²hö]ò!‹²§éôëof׫hßß¼¹zEˆ#–Ž”Ñ ´”úyuÄÓL0¢¼9pÓ#à ÂDsàËS^¬£<O¨À ÌÐ0ÞìÖQWŸ¼‹—q6&:ŒÓ9|¤8!ÁÄʽ¼ý:" ¤ ‡PHâùftû øüM€oËS›€S×Áõè‡>ZÊ–¢ -bˆÓ:¾Ecâ¡ëšƒ>v,z`#7́âi§Ñ<#ËÞ`* Ñ4Ç¢I)Rm¸ìÝo“E-ñ¯¤Å ŏ9ã©î³~‰DLˆ`A4B {áÅe:½‹Ó8‹ÖÉÇx1‹–?cLÓx–l¢;ˆ7"ü <ߦyQ½ý.Iã(›½ümWeKž'Û´ú×'•2#\»¹FRÊFÝz•÷e)ED·î%„AFÂՃðÙõÓæÃvÝ#Ü@U*Ú|/‹×ùÓ¦/v +¢÷ÅW>Áé`´BT?tŽÚZésÔ0dˆjmé÷“!ÚFâJê3®0ASÒºMÒ5Øñ¾:(°{á„„©† +I¨òò _™w)T9“<,¶Õ÷¨k—HÈÎÌzŒàÈèֆb•ä=ú!ª¢+—bW:ë̱/·ËõB …õÅõ?&ŪҚÅù.žmà¯(ͳ¬jaÙ]ÝËÞ½·åÁh9¦6×mö7rªô«¿Wµ°«WÚ½+Ž7‡ÉMX ‘QL×ÉM—x“Y¸¯ù © †»ChL¤ +¯ª£ÚO"¢͋ œaR9­2|\ÅY_÷aÐIUmO¯/Šƒµç’&ÇªÈ‚í¶‰ Z‘lk² +bY7yUÈåk3ÛE¼¨Þ|xê­Št]·¼=»˜@ZŠÎ~ÿ¾¼œn B¤¡ŸrUôºuÃt(â,Ÿz:A^µ Yl†F|v¯ßùŠ>èB]#¼YÕsw/‹êÕ*JëpäÉ¢þ¯Ÿ–eÜÆD„Гª~´ï­gä¤V ^C6ûa2”A7>0³ï"+/ÅøªOH#ÚuóNsr·º`„ü|`²ì4^:¼ümאָ秂uÔt£#/Ói’Ž9`²Â\Íîî7qZsß ¦s?ÛZÇˈ“0é륜Bå²3z)=ÕK%âX¹¥mu.°ÙÆp’@±nvÖuË~ÛS³Ô†8舾6èšÝÜf}r0`cy¼ÉY1̑âÅɗfÓ'ûȄq)˜û,©sT'^‘%óâDMd™A:'àŒ2ÌÔeÏP÷߅º5¼kp ©ïO– EYٌ?D{Dq „흝–ÖÍ*s\²Ù£XHÔaœEœn7IÛ>PbÝÞÄ=åÉ.[7¬iˤ2l›Æö®$îsg‚$9 ¯Ósð:“ Âk¼.öð:b¯[xÆ/Ôä¹ô»U +ƒ²Î}*0»ˆz ÌnMP>f·6´˜Ýš`1{c˜ÝÜýâ,Ì΀¨ñ®³ 6ÅëÃv†„ÖƒÃ°] !8§<ü¬à» Ÿ ¿¢üç+*Û` _qUv¢œB?¨&ï† Û4Ô¼L¢-i +Ad š°Óìš6@A£ý®ÓL×âÎ<›0š“çy&aPBÿ-„¡žÇ𰤐0<ؒhæVù T´bg +AhèØin[tùnyŸÎ‹Ód£2÷¿B6ÚâPLa8wð±UNÏÊÚèޅوïEm“çÇ^¹¹#” «ZwÜoÿ#ùÕ£$ VýÓôª,œKð+ÚG¯8–^ÚÀ‰uÊŽ÷MijR—AY±cP¯HÉO pœ­ýç]Ú´hÄ^Õ᠆`±;ÿµ‡k®²,®¬ïa$áb™Þâ‡d±I¾^ç¡Áê»´Hú1rŸŸB­n ›µÖµ©~!-–òBPŸ~âaú)OóO`‡Nº]„wbƒˆ-ž>âɟ‰ç‰xÂywÕ¢àf6ödïª* wPìÜU‹wš•Bª¸ìá8-už> endobj +2694 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [336.679 678.378 395.172 690.857] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +2703 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [337.382 460.959 394.782 473.876] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +2704 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [342.723 231.428 400.608 243.907] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +2705 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2709 0 obj << +/D [2707 0 R /XYZ 90 757.935 null] +>> endobj +2710 0 obj << +/D [2707 0 R /XYZ 90 733.028 null] +>> endobj +2413 0 obj << +/D [2707 0 R /XYZ 90 536.391 null] +>> endobj +2711 0 obj << +/D [2707 0 R /XYZ 90 522.393 null] +>> endobj +2414 0 obj << +/D [2707 0 R /XYZ 90 305.582 null] +>> endobj +2712 0 obj << +/D [2707 0 R /XYZ 90 291.583 null] +>> endobj +2415 0 obj << +/D [2707 0 R /XYZ 90 89.441 null] +>> endobj +2706 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F8 504 0 R /F13 540 0 R /F7 505 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2720 0 obj << +/Length 2001 +/Filter /FlateDecode +>> +stream +xÚíZIâF¾ó+|J@Š«k¯2Y¤,3‘²H“™N.3#äÓmlǘét~}^Uy+04ˆÒŠú€ÀæùíÛg·¾}s=ºz)Y¡HR\/ƒJ$( ®ÁÛ1!ˆLB‚1¿š<ŽËu<{5¡xœ¯î’EÏ~Joʸ|˜N¿ùnöæ..’Éûë®^ÒcK"ŽT¤A¨åú…#ñ$Œ(o®xDˆ0Ñ|õ‡oWñf3 ©ÀÀ,¢ãd]¬â*qg^'ˤœ=N²9œRœ‰1ÁÔð½¸ý1"ÀĺC(¤@ð|=zû 8ÿC€kî-Õ:à”Á÷*x3úe„º–2„¥è\‹â¢öoÕ¨¸oºæ óèÈ£† z(’,^[cù /C”D9S·Þü`bŸ§ Çñ¬LÐüh&èÇRASÞóÆtz“o³E²˜…†4™Â@)ƒ"‰:ñòÆ4Kfé:¾Ï1JÆï°À¿™ä‰Ë4¾YÕæDÂÓ#BH맸2¼ÝêûÙ$”Jçy¶©œ˜ŸÒ,‰Ëً? —“›Mšgî¯O†DÒ鮖V7³Ä\¹/–™]Ö\HnëÖíMãOŽ9ăøþ< шJÒÓI@æ›'Öûó4ɪYUÆiµ™N­¦3§Z¿\4)Õr]$Y¾N³¸Ê‡4aÝzå˚¢ÏT¶fݖ©Ó,Ï“ð!ƒiKìŠªGåéJ¦­ªoÓlQxïî†L¤ ¡…D! ßö‚¯!H·™ilZŽ«Ü]GûjpQ§˜ h4º¥©îÒ̀œ*DG”8¡u}P-Æùr@>´&Ô òÉ)òeCtŸVwN2Ùɼr*€ œ+îlbŒ\Û.oëþýúûQðÖÖ=ÀQÇË cWðŽO™@ë5é~õREŠi—ºPƑÝ9çMíµzwtÉÎm3GÐç-_·þiÊÄ;œ +pCHhü²åØìaHÚféƏ;}i-+¥ŽÄ +ñ3H#†™Ñ“É&Š”;Bí§2Q´[ó#¬ï8†„ÖÀO’Z>*íD +{TÔ¾AÐnÀ"¥ƒ0BT‰¦ B#}^"0\&a^0LωBÃI Wò@¼ì‡2¶>kc€vRÓë=!WC ¡h"˜5öŠzLÃ"P%åfê]ßññ;©F +Cà æÍ´Þ%ž¢¶£·Yp}W¯XL…5sӞÙ ØnîàæÁ}W ýNI™¦$?ߑî)ÖâCIÁ÷&â!¥™I!±§t¶]'¥ ˆ=„þæ+¹Ê’÷Iý¿í)iv{ȂdBÄ4q“õ¸µF};¶'ØñâoǶ(þœ6}v’ü°c Å=;q Ø<_¯óÌNS8‡=Ž–hÙü¨šËza2WÄٝ¯Í6?;³-…g¶ùß7{Ó©“Í) Ïï,‘&]ãUíJ»±ÜB$²Ê©G˜06,mmnWU¿ZVÛÚéĘûHÁcX +¼QÃIñç<)Œ +YëQgÀ¦ZL§i6á R¼J³¸¬-8¼ÂÝk¥ó>l’|˜.‡Æ¿Qúð¾æq—fëlHaQ°\ÿJ@Šýe‚PŽÔIe¿×šÚë/nØì賎°›é÷*t—%¬yœy» UÓäâþì ™ÅܑŸMçín·ŽË:¯)ÄÒ$t˜fPWô׶=7ÍbБ„ÁV'õÌñ…bäp*ۋò:Çc÷µ)âù®:m›Úw 4(;4xÎ>ÉPÔ!54°ÁC`>$Ã)"°Äz8]>ãô§„ÓkÐÚÀuØêOë0šzí4¸®¡6°Y«ƒ°4„ÍP:\©á:¿˜ÜFP³Ê÷Þö°t†”ìß,ВÌ¡­iFOæÒ¶À#À<²Øà¿æJð‰Œ‡Øìâr¬àrs«O^—ôꐋÛé@(ì* 4ÇÑp/•ãnë=§•ô4:h*Xhn¼qšázg…¿OæJAoN‚æò\h¢€šŠ?™×œ0 kÂNBæ +I®N@æ "/…Ìa=Adî†-øÀœEɘåésú Ìÿ#`Nž‘ù32ÿdÛí34ÿ?Asù ͟ 4Wÿ"4’ Có1rü} €æ†ãah>xÂûÄzá:÷¤Y,¥ò#ðyIтs KžØ—°›d[0ä2Ç + bÍá1›èÓu«üŽˆ|ìv kMÄë©®«= ð”AùÅФ¹Ñb‹yÍrpà1/Õì2y{ý¨]D Í¶3°ÙRL_ÚVíJrØȗÐå„7¤ê¿o’ê>I²¡ÎAC—y†Üo¶M‡÷C%‘îîÏ< pq¨Ÿ²î3 +ð@DOû¾|–øI˜V^<§Ž¸]s»F¼{ã‘AéGe÷. %Fô©¯pYèáU`í^¾³Í¿2»¨éâõaÓÆÝa}›ÕüºIÊO'BŒë¢þ9ζÍBjzäà +Ð`;r12½Ê­›v~“4Uä,û=h~ý8²¾í¿ª ìëÚwwUUL¯®îïïÑ|ƒ¶YZ”(­®ŠbuµŸ?=.¤¿£-›-d7¡H38¹¶XpÏÿ±W÷’ +endstream +endobj +2719 0 obj << +/Type /Page +/Contents 2720 0 R +/Resources 2718 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2702 0 R +/Annots [ 2713 0 R 2714 0 R 2715 0 R 2717 0 R ] +>> endobj +2713 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.059 677.099 422.924 691.814] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +2714 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.333 405.417 425.662 420.133] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +2715 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.526 158.925 322.446 169.828] +/Subtype /Link +/A << /S /GoTo /D (main_Time_Elapse_Operator) >> +>> endobj +2717 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2721 0 obj << +/D [2719 0 R /XYZ 90 757.935 null] +>> endobj +2722 0 obj << +/D [2719 0 R /XYZ 90 733.028 null] +>> endobj +2416 0 obj << +/D [2719 0 R /XYZ 90 493.377 null] +>> endobj +2723 0 obj << +/D [2719 0 R /XYZ 90 478.806 null] +>> endobj +2417 0 obj << +/D [2719 0 R /XYZ 90 221.695 null] +>> endobj +2724 0 obj << +/D [2719 0 R /XYZ 90 207.125 null] +>> endobj +2418 0 obj << +/D [2719 0 R /XYZ 90 104.354 null] +>> endobj +2718 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F7 505 0 R /F8 504 0 R /F13 540 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2734 0 obj << +/Length 1597 +/Filter /FlateDecode +>> +stream +xÚíZ[oÛ6~÷¯ÐÓfëDۀ´ëeÝ +t÷²´›‰…Ú’*Ëuóïw(êêȲ½&@VøÉ}txxÎw>~dŒ[;¯Ï&ƒ³—sRõœÉ£°ã{ JœÉ̹‚ÈÈ%ãá»Áà ]WïFãÅÝ\ÏÒàêÏð: Ò»ñøÙoWó Ñ£“7g/ i¸%Š#_I˜4÷ú³5iÍL0¢¼4˜tøPˆ0QüºÏÃóE°Z\*08St¨—É"È´y¯ot:"r¨£) ùœ‰!ÁÌø¼˜ >¸ÁÉÓ!|äÃÄÓåàò#vf0þÆÁˆÁj6¹ÕÒá”Áç¹ü5À½©¥ aOÔ©E qYä7+C¼¿tÉa>֗=ˆ‘«Ò »Kt,aeܓ¹„5qOõ&“"NJƒ/¦ôq8³¿ P$Æ{Ðœ¹+xHü/øV6ÆãçÏ}ïÊ5vŽË$C>‘Ž ^”(J¡¿fiÄý0Ž®8ámd‘ò <£UfûVæ1D¥·âLíøw0Æ°J´ |YÍq×á‚#‹×Ü৑+{ëÈ,YϬ9m™KDj¨|À¶M¶f8ù´‚_²+ðÊä—¢é£5îp!òeˆ N ª’Vè¹ £EéÖPà†¡K•yàyÓü…ó¼ôodqW:8T™ÝOG+ +Ž”¬Ó1WPqLj£‚šR½Z/ +´Å7ös/“uF·E\óKQémÁUï_ œËÜÀàÝÕ#"†M\ïXz*,¯u¶Ñ:êX'¥>ÂÔ;`¡ä¨…Ѭ«l’¾¿…Ú–—VñQk-[0q°›¢J,<¿R°b¦ÓÕ¸å vÔn%‰|¬ aÁ¡5^hŨ`¡Õu^2ÆEYµ ³ë‚Niµ—ªYc¹^e])$°MT½q­KXDYš®Íî2)1>DR„ì*@+oÐQxÌ´T7IaWæ€ó}VuÕ¹!_@oœÜ óćIFP;ûôf>¦å£_FT@±Ãàz¡í÷«,NmÁ׶Ù`4Z/¯­Gn› Ƴ§Yá¢vÅŸ ‚tN`n6„°±õÊ †›¹m*CèR´7› Iw‡7ó&œé¨2߄ټd§* ŽÆžéEpWêé< +?¯µ¡ÌþÎá¨Ðo7΋¯S×áȦQõŠWÙl<xrHl°gWAz»^ê(ëm&ÀNÜÉ<MI6ŶÞtQ3EÌ{pfî!,¯°dSaiѳ³Ö½‚lºadh˜ †:v;À4ìe.¬‹ÙêE#솝âÄÃHø¬WIx•EOl 6Ÿì‹MvÇö;°@ýܵfØË}qxˆµ°5Žw ÛR:»æÒêæCD¯ ѶCz„õ CAö)^¹¥xw¨Z)[ªVú}ª–bü¸·=t*Z€¼Ç÷)ZÞT´j$-‡\ LDƒ(hZîºíÐ<Ø÷Uí7§Ð9Á5@Ð3óšç8”vÎdZUœ49ªãò$ÉO’ü$É_’7˜oWú`•¸¾Œ9/ÕWIwE{ÜèTGÓV3—'v‚üxâæ¾?ÒbÊf %kî<=(Äj¨eQ&Abø"86ê"„Ó‰ç|â§Ï:ðø­Àxà!JuߒC¤÷:V5›¸>L‡ßtKç!ü¾¥´fî +^°å—äÏ^¿ý‹ê¬ã[×äecþ×r#¼ëá<â yíb×ùS½!'{Ô¸¿OŒû‡ˆqzй$ȇ£™Uãâ{RãënµÑtl'qáRLõՓ¡Üc8c€ù +œœ(ÀùI€œ«éI!~ +‘<@$êx…HžÌ‘ˆò‰X¥bûWP‘‡þ(#ÿ1Dâ_2YüC(ÐX¼LfË;sEcT[ñXÊ6ûXh7ûð÷J§?Žô‘}~Dë¼/ QôŸZ5÷<ù Ff‹·ˆsàôB—8·+ûä”ý1Ès[Çk!Ã̳,Ÿm64]¡u&) +³3袳ûjx!Õ*ä¦</ã²aƒËünê^þÿËûÝê +endstream +endobj +2733 0 obj << +/Type /Page +/Contents 2734 0 R +/Resources 2732 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2702 0 R +/Annots [ 2716 0 R 2725 0 R 2726 0 R 2727 0 R 2728 0 R 2729 0 R 2731 0 R ] +>> endobj +2716 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.526 690.333 355.512 701.237] +/Subtype /Link +/A << /S /GoTo /D (main_CC76_extrapolation) >> +>> endobj +2725 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.659 618.736 268.34 629.64] +/Subtype /Link +/A << /S /GoTo /D (main_Widening_with_Tokens) >> +>> endobj +2726 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.526 489.44 355.512 500.344] +/Subtype /Link +/A << /S /GoTo /D (main_CC76_extrapolation) >> +>> endobj +2727 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.659 385.962 268.34 396.866] +/Subtype /Link +/A << /S /GoTo /D (main_Widening_with_Tokens) >> +>> endobj +2728 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.526 268.621 355.661 279.525] +/Subtype /Link +/A << /S /GoTo /D (main_BHMZ05_widening) >> +>> endobj +2729 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.659 197.025 268.34 207.928] +/Subtype /Link +/A << /S /GoTo /D (main_Widening_with_Tokens) >> +>> endobj +2731 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2735 0 obj << +/D [2733 0 R /XYZ 90 757.935 null] +>> endobj +2736 0 obj << +/D [2733 0 R /XYZ 90 733.028 null] +>> endobj +2419 0 obj << +/D [2733 0 R /XYZ 90 564.165 null] +>> endobj +2737 0 obj << +/D [2733 0 R /XYZ 90 549.595 null] +>> endobj +2420 0 obj << +/D [2733 0 R /XYZ 90 331.392 null] +>> endobj +2738 0 obj << +/D [2733 0 R /XYZ 90 316.821 null] +>> endobj +2421 0 obj << +/D [2733 0 R /XYZ 90 142.454 null] +>> endobj +2732 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F23 340 0 R /F65 376 0 R /F50 339 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2746 0 obj << +/Length 2269 +/Filter /FlateDecode +>> +stream +xÚíZ[oÛ6~÷¯ÐÓ&3ëDۀ¶[wº%{YWŠÍ$Âdɕäºþ÷;¼èf˲‹¸Cú‰¢ύßùì=xØûaòüfrõ2`^„¢€Þͽa/ ”x7KïµO"ÓÁû¯¦ûq±Šo_M)öót÷¨–E|ûkrWÄÅn>þÝíõc¼VÓ77?_½$¤#–D…‘„EÔ¯í”ÞÊ#Êë 72"D˜¨'|{J‹4.ËéŒ + Â"ê«Õ:+eGþT÷ª˜é«lC!gÂ'˜k™“ïo&o'Ä`wˆ…°ðb5yý{KÿÙȁ5[3kåqÊàoê]Oþ˜àQ×R†p Z×"†DíߪVñÐtÉa=6æ=БGõ„j·VY¼ËX(}) +(u&A\†õŒw:öy²´Ÿ” 2BŒŒ&‚^9Ë4“tLûž;æó4Y%•ZÞÎôTlˆ„‘7ƒ¥"áÂñüÇßþÆâV½¯ŠxC ’<»…J2°šcÿ,ð"ÏÊJ¿ÄF + +òPœ0’ð6bÆODˆ°ÆÈ/ìŒHôg̈́݀Žx›_ÁF ß˜ˆýú±ˆ“¬º½Þ•Ÿvxp)kÉFÖ¢XM"E{«m²:&‘Dôb¢¯–V튢 +H#ëŒÙ€N!¡É’j} 1šdüÆÍ=IëB< B (”­"°›…€I’6˼N²4ÉÔ;QàÎÄYȐvA»“ÛÙ?­ÖE>%BoAá+ iaäWÊ>ªÜ¤•}Îïõ_i>j$³V<8,ûó‡‰÷ÚL´©>Û&K•%ك›lqËMYä«õ¦2›À +¿ÛÙ¿qZæöIe÷y±Ð¿w«æ¥SjÑäS7ɼˆ†=H™žC” ÖL©ãÊf Ça¸l ìç¸pð^‚Þ%$…Ü1Fyø§©}°þƒ‡ugðßa¦"Lèaªõlá(’¤U3²°?"Í$Ôóú^R͈àˆ…ÌþÀ.Àz¥ŠrÞûy+¦¿)% +±†9í,ځÎz*Fˆã¶žY¯<ÿîºö™õþÕKØUÓ%ØÞÀõjSVC¶kLoöѝs>äIYRG©Î’žÿH’à㻿ç7؀°•ë8 ɺùyÌs„!ÚªpS§Wé`Ó¥WmugwÀÀ¦¬=PåÎýM¿—³fßÖ?ðœ°ÅjfM!]0µò o·aþ½É‹aÐ4&’¡ìE3‹ Ó«æÚ²-€Oӕèøvº[Ž['0ėêÁۖâXœjÂOt%…çw%c”šžC©)†t‚nѲjçÓgƃ°•l%¨ƒøÕaþOÁ/¨»-šj§­‰»~ÖÕ΍ՕQ¿²f@bÎGá.ìòœf½ëp‹°-`€ç€6=Çè>o7‹nUáôIóҍÝíŽ×\ý]o™ÒD¨Ûš÷ë,t]‹{²0ÓËñZ‹Q—åÛìÓáÛ®r ěémt‰xw‹ô©Ö&„$ÆÙ€ðɼF|^£Kç ¯¡ÐKàBÁ?ÅK$ÃpœÛ@Ñë³M8YÉx\(ѵ§æ›îôá÷¼RóÑ^"Aúæ3ÍP€klÍ2/cù0ºˆK÷toø|ëê@÷ªˆ˯ô{Ôþ26U°éž¯(à;o“pØYA{ “85W*Î*§dn‡@¼r«ºåׅ¤›Ús@bZ xK²ÖLSÉ)„—ÚÇ£5Ä„¼Kò^œJ?©´±ö…†Ãj­ÍfL7-…ŠË#'"—IÁ–õZ£^ÖjxèZ +v¬ÖÚg{³›¢Pƛ0·g›4¶Ù'MYº?=Ä8 È+ôÝ·T‹bÊBÜâN­öìáÐø6Àõ#ð-ð`}Üo¯ÌÿQ¿ƒ¿©»k˜·Ð‡D[„ Üàî{dx›æfy‡“iÓv-eéo°©sl½MÌa¬ØйH6\¤·öŒÊ$Ú;°~ +šƒæ°s +Ñ|ìžôY¾Vv‰VˆÚåv•ìµ_]²†É07†éÝ2Ø£,¸kRX¿IaŸoPFV>zƒB.|ƒbvÄðý •¢×©H>Ú©è“a|ê¶PŒ_E†õw*BŠ÷'nçœ !C¿±Q ] hÓ×¢P˜Ù[“ž!gܙÐÏw&ÿóÉþ?ëú¬_žû¿:æt Œ€!”^û?:"BBð½Œ|¥3Jó5÷Z6ûêX›}ù«TŗS³ï¿ÅÙ&NÛÃZ›œEi  b¤+«kKt+r­jZËþõê§_&f·úv©õcU­çWWÛí-J´É’u’ê +âuu˜¼)ºZ4Bl_Š­òº.$ºb­LQ;ðÿV={A +endstream +endobj +2745 0 obj << +/Type /Page +/Contents 2746 0 R +/Resources 2744 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2702 0 R +/Annots [ 2730 0 R 2739 0 R 2740 0 R 2741 0 R 2742 0 R 2743 0 R ] +>> endobj +2730 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.008 678.378 276.143 689.281] +/Subtype /Link +/A << /S /GoTo /D (main_BHMZ05_widening) >> +>> endobj +2739 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.659 579.381 268.34 590.285] +/Subtype /Link +/A << /S /GoTo /D (main_Widening_with_Tokens) >> +>> endobj +2740 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.011 450.685 513.996 461.589] +/Subtype /Link +/A << /S /GoTo /D (main_CC76_extrapolation) >> +>> endobj +2741 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.062 187.442 276.047 198.345] +/Subtype /Link +/A << /S /GoTo /D (main_CC76_extrapolation) >> +>> endobj +2742 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.659 88.445 268.34 99.349] +/Subtype /Link +/A << /S /GoTo /D (main_Widening_with_Tokens) >> +>> endobj +2743 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2747 0 obj << +/D [2745 0 R /XYZ 90 757.935 null] +>> endobj +2748 0 obj << +/D [2745 0 R /XYZ 90 733.028 null] +>> endobj +2422 0 obj << +/D [2745 0 R /XYZ 90 513.406 null] +>> endobj +2749 0 obj << +/D [2745 0 R /XYZ 90 498.886 null] +>> endobj +2469 0 obj << +/D [2745 0 R /XYZ 90 262.061 null] +>> endobj +2751 0 obj << +/D [2745 0 R /XYZ 90 247.54 null] +>> endobj +2744 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F23 340 0 R /F65 376 0 R /F50 339 0 R /F72 471 0 R /F106 2750 0 R /F8 504 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2759 0 obj << +/Length 2313 +/Filter /FlateDecode +>> +stream +xÚíZ[Û¸~÷¯ÐS+1‡WQœ^€dwgÛm ¤™éS604g,¬-9’œÉô×÷P¤¨‹åËn&ÀÈËX¢¨ÃÃÃs¾ï#58x pðãìÍÝìê&bB*¢Qp÷(Ȉ AIp—ïCB™/Æ8|;'8LÊm²|;§8,6Ïk–ÉòŸÙ}™”Ï××o¾_Þ®“ž¸ûéꆐžY¢8’*†A«¶]#Œ(o;ÜMØPˆ0Ñvøë9 ßm’ªš/¨À`LÑPow›¤Ö¶å~ÐåœÄ¡ÎWÐ$9!ÁÂ؜ýp7û8#`¤ ‡HÂÀ«íìý¤ÐþS€ƒÙ<5½¶§ ~7Áíìß3ìB‹†8VcH!qëíŸWzWgE^]7NŒ­\Ý(џiŒ$VÁ‚@“ÖDU§××Y>ç8ü”l²t™”û­ÎëÁ«û1HQôuYÌ©Ÿrˆ’âaö`ƒLûÞsAöQþcæV¢ïG*&mŸzU¶Ï`hʐò}^MH0?Ð󄅸g ÉÓ D"F|Ö­¦Ü űôfJmçžfº +d‘å«b»Kêì~Ó<aQã3’‰~ž^0æªÈë$Ë+k41ýƒãÅ8†%&ý%.³UmS8ËõÇ=¬sý<Dˆ&ÊaÁŠi~U›h¦žC‚»¢®Ûº8¬·˜C’³S% …Á•_æçÎ“-ÄHH5YÀü‰O08F|\>¼)²Ôü2ô9ó“àcFŽN¡¡ˆcuÊûA4®¯ÿ&ÕráS^6\̧,Õy–?.§²ÇÜ®êÏX`ȇÊ-ò©9qp—gÇ•©sƒÔÎÄl!aöQ•LpdáÑÕùB@Öís3eNáK ¨¨ñe0¨D\zتwǸÀ£Ã_& +Æñ©†',2JÙù!ÈT±SïÈû,ß@Y~˜¨ø ’Ĥ€Du)ðºYyÇRu1 ŽhÌ.@[zm#Hß$;",uµß¸d+쯁»} ™éüZkÇ †ËGnjï~œï›è‹6™\ãžßëúIë|bvÆÇò%Èd0½#d¡¸[Ñ)B1Kî +xs„­ FŒ#XXfò¿yÃA``­Ëˉ~° =ǎò5LÓÙë$nەJj;+(ŽAE©ØWùv_ÕS$0_v÷ºM…†š PçL,bÄ‹èK r,üƒ°AQ€.SNÀ¶*êÁ±Ð€Kæý|m——7ª+٘;îŠ,‡µ³  ›ÆÄuõ Õ´~2J))³ÄÊx^ÕEi«Û +ƒÖ|¿½·¹­0hK ƒYÙ¦3P¿˜ Ò "@wCÖ aWÚö•uTÚÚ֔ñX8nq‘Hv»Íóåì«×ÝÕë’¼CuêMòì:êÕ:Ï>îµÁÉӅÃ1àŸÔÍo¿ä…´/Q“â×äú¤ø¥ëäwƒW1❠²ÒլˤtTˆÔm%"JDñ%"“bZ" +ÈvR‘ šÐˆÆâiDؖ1rRN FžÔˆ 󺥿@#n²mVëÔëDiD‰êD£#õçºLv¬,k'¥F¸=9Á¨¯qF£Ó‚‘cvF0 +,O +F\'•bŒd؛ãwæ²Zª—·Ïd§mž‹Æˆv„ÙnƆÛqD»ƒ 7Ú)} +p‹Å}ºà†Ñ‰¢òq¡JÏÕNSªñ%J•\¢TAØDhtªÛ4þ}»pÎùdþh 'F™¥8F¹‘¦ÑP\ûð(瘗N©FcÀªÐ&á­Åûg;Z²© +Û¢ó‡¢\5¼e‡,*çÑʧˆóµU.ƒ˜0 ûuf«úBFš'nžmÝގ¢¨á£þFü® 7h«œîQ&›MÇÉÍE#9*¯ÀŽF3!_bÐ?q9ÍÒ˜ŽrñMÞþä­ìççQyË`§Ø‰7êÈÁþ®W¦ÁiJ»µ‘ü(e›²m_å93—ƱoBý›Pÿ¿êçN©À{^¤_ ôs.¾HëS…"à‘I­}E­a9©%#s¶HϜËîóD§õÅóZNÂï—0¯ð®Nœ GgD±q‚œ9Žbñ+d’v’äÁ<”»d¥—~m«%¤ÍR<¥Ý)±º4‘žÐ æp ŸyÛi·y1áH)ÔÂø„3M« £PU¢;7ݞ«š\7?JyÇ^¦¤š‹&@Ո«ŠM:’@ŨÓÀ~ü3‡´‘//Ž¶—ó¢§xÏ[=ŠǨ1$ry‡OÌ’@Ï=“$îÅn¶àþ)k4,QŽêâVx›ËµeLÇ®qË®ð {\ëf7Yžj#,>·Û Ûh­Ö“^Àò½r㯳ÕÚ½â^MµÑڎñ•ÛМاÌ´ñ°Îl¸€³‹=x”Ú›Æ}Ð¥ù8\ÙÆÆ9!üàpé²G †ë^îó–¦MDzØ?Žßê圭—hñÝH¯Ö4,džoLԊrjBôMÀëWN åa“ºNÊîHÿ¡,¶£0å1±÷êÐ3Ópǀ”ÚΌ 4kÛõSêA›S[´!ÿ ðÖyK'êºCVö:ùò†ÜõHZï³2eü«ÑÄú_8\ê6ß$ŽÍŸ 4‡]<·1ŽU‹“ÄmÂãƒ/R ¨eéáOp¦÷;œÏzŠdhv¶QØÜD፰Æ;ê~t­aŽá¦¢Ã³e>CözM-¤êé<º=#ì0t¸]B&¸oSÖ~Z4'!Þ’O‘ß΃°û`ÿJ\P u BÚ¢Ÿ„Lz¢î{¹3¤ñ?¤DæÿâKÿ¥ùÿ(±nž`B($څñDòÖàŠQTTöÖé*{óŸJ—œ>9~ùW’ï“M'N춱¬šÃÓÐjÏn: ¨òV·[;³_‚öê³F,tþ’X"†=ñ­ëzw}uõôô„VÚçÙ®DY}©«CöìYÝ}3~(cn‹VJgæ4iÛ8¡qüÿÇH$ +endstream +endobj +2758 0 obj << +/Type /Page +/Contents 2759 0 R +/Resources 2757 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2702 0 R +/Annots [ 2752 0 R 2753 0 R 2754 0 R 2755 0 R 2756 0 R ] +>> endobj +2752 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.526 621.557 334.073 632.461] +/Subtype /Link +/A << /S /GoTo /D (main_H79_widening) >> +>> endobj +2753 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.659 552.563 268.34 563.467] +/Subtype /Link +/A << /S /GoTo /D (main_Widening_with_Tokens) >> +>> endobj +2754 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.224 427.32 256.77 438.224] +/Subtype /Link +/A << /S /GoTo /D (main_H79_widening) >> +>> endobj +2755 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.659 331.174 268.34 342.078] +/Subtype /Link +/A << /S /GoTo /D (main_Widening_with_Tokens) >> +>> endobj +2756 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2760 0 obj << +/D [2758 0 R /XYZ 90 757.935 null] +>> endobj +2470 0 obj << +/D [2758 0 R /XYZ 90 683.993 null] +>> endobj +2761 0 obj << +/D [2758 0 R /XYZ 90 669.757 null] +>> endobj +2471 0 obj << +/D [2758 0 R /XYZ 90 501.711 null] +>> endobj +2762 0 obj << +/D [2758 0 R /XYZ 90 487.475 null] +>> endobj +2472 0 obj << +/D [2758 0 R /XYZ 90 280.322 null] +>> endobj +2763 0 obj << +/D [2758 0 R /XYZ 90 266.086 null] +>> endobj +2473 0 obj << +/D [2758 0 R /XYZ 90 89.441 null] +>> endobj +2757 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R /F72 471 0 R /F31 472 0 R /F7 505 0 R /F1 542 0 R /F8 504 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2772 0 obj << +/Length 2137 +/Filter /FlateDecode +>> +stream +xÚíYÛnãF}÷Wð)+Q»»Éîf+A€M&@v˜{ó2´H[L$R!©ñøï÷ô…7‰’¼;°y0ÄK±ºëTÕ©ª6 üxõæîêæ­ M´ä2¸{4 ”dDpÜ¥Á‡c„]Ï¥töîšÑYRm“å»kNgåæy¥U²üG~_%Õóbñæûåí:Ùe×ï~ºyËØ@-ÓQ:Æ¢Vë·Nd´2£„G­À݄MX(Zï.iøÛ&©ëë9Ê4ŸeÛÝ&i2÷ä}öU×,žeÅ +TŠ£Òè¼úáîê÷+54`¡ˆÂ«íՇ4Hñü§€’Ö©Þ|ë.€ÿ¤Ì¼pQz³í}æßæþQ^(-‹È3x ¬Ü½õ±™Ú¦Ú¼óÃÁ\‰¤°¦øER4YU/Fß÷zFŽd1QTטP |0ÂQ©Â.Kï:sö°Ùï¾|8&â”ø0¥$ŠŒŠˆX U"&{„p3҅û§|³1WzvïśuYûËub2öS^<¶¯Úùã:«w“ifpÿlÁ¯Û‡Nk3¹ xÿk¿þ:_­ý'þÓ4û…R^Xϛ}=»Ç‰û©ŸkpŸ5›ŽÓÒÂ¥ñA¹ÇŽRw“æf]0¸aïÚ=´›Ão»¸n÷‰‹OF<©òä~ӊWû¢pXÁªÜ?¿ +é0 +회qŸT^wb±ÆÅ +ïš*ɋv›pé„EÖ% +åè÷}²q—Ö÷ø¥ +9{k@·áŽ‡9´&0Ó`«ÌË +÷«Æ™€»‡ªÜzmk¿‚IG›ß|˜œÇ$d¼Á’‘ qî„C6¢2¢»‚úÞ ¨t£@p–Ș–A>÷Öñ FŠϽ”ãlÑÞY´ÛÏ+ÿ¶ÃÜÛÞYVeõ~Ó¸4áŠù›û @>Ýg$åêÉ0q#dnÌÍ&ãX´¼Ì¨“ŒGÆD +r`ÕÑ7(PP¤ºúôùTx©fˆúPξ9ÖÊô°ÖÒ¾$ ÁŽI,dÆÂQa¹7v¥` 5åWM"ª/úu $<ÆL¡02¡è‹ÚˆP-–„Æ VNZ~>ƒctŒã1‚‚„2:®©C«œ®ˆ ¿M„"Ì0›0B÷ƒ YL4&ÄI$€%ŒÇã1þ[D&¨œl²TŒ†[Ÿk²8ÒF·ˆVã—ôˆœR´ÅÑ9cFKOí~1iƒsÄ ß]Âe±‘¯q¿%Fˆü±è›?Kò-‘œnqÁI\ÊKÃNí©iG^švz_Mt¢PÀ󄊈¸Éåb#Ê_ֈ¢EŽQ‹`ßåg\vAÉ]DèèºM FÔ@QÖ e¾W3s\õèº÷?^ìfz?£ÄŒÚ:/€æc‚àZ¥^°[ö_íÖ”Ä ì%(Kxp¤Åm'ðµG9ùÍä^V¶×¹wCY¥èG…˜o£9 "ÉF}ôŸWÙÎ öòԇ§Q¼Ü¨Õ¤‹Å&+›õ2«*4:gZj%·ì[ꪴML +c5C#ˆ_é{6<ûÔ>z²´´ß¤Nt•ìk/쿒£ü°#†—)ˆë†WY–ºç]or"Æ9!¸H¹h›|^̝†cÚ<<=e"º|!S¥„IA˜îèk˜PãZ¢ÿÀZŠh’ÌÜØû$›±¡£ûZb4~ÑqC¬ Õú,–ž(ô#è,Î>L֛ŸÍ!V;Ä,o3ÿx’÷ÑIÄý CS.ï³ee÷#|°§FHF¤Š_¯„›`¾xSߏvá-MÚn½ëÒë]¶ÊÍÈ؞ôàœç, ,úu&æ~ÄSi*%‘BÔ­ã\u9]ž~¾fŒµŸ,O÷æ`ÊC¸*+LE»²ðÕÔùÌ©3‡vF:0î<бi¸õ«Õ1¨ (Xò&Ùäé2©÷Øusi"ÈôTàÂֈ‰žƒñJGÇ ®ºJÃ> endobj +2764 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.334 491.517 236.659 502.421] +/Subtype /Link +/A << /S /GoTo /D (main_Concatenating_Polyhedra) >> +>> endobj +2765 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.635 434.58 256.157 444.478] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_e68d61763922cee018cbba3834b2085c) >> +>> endobj +2766 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.708 318.519 250.895 347.585] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +2767 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [448.024 272.915 483.212 303.883] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +2769 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2773 0 obj << +/D [2771 0 R /XYZ 90 757.935 null] +>> endobj +2774 0 obj << +/D [2771 0 R /XYZ 90 733.028 null] +>> endobj +2474 0 obj << +/D [2771 0 R /XYZ 90 556.444 null] +>> endobj +2775 0 obj << +/D [2771 0 R /XYZ 90 541.874 null] +>> endobj +2475 0 obj << +/D [2771 0 R /XYZ 90 425.614 null] +>> endobj +2776 0 obj << +/D [2771 0 R /XYZ 90 411.043 null] +>> endobj +2476 0 obj << +/D [2771 0 R /XYZ 90 252.84 null] +>> endobj +2777 0 obj << +/D [2771 0 R /XYZ 90 238.27 null] +>> endobj +2477 0 obj << +/D [2771 0 R /XYZ 90 134.652 null] +>> endobj +2770 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F31 472 0 R /F7 505 0 R /F1 542 0 R /F8 504 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2787 0 obj << +/Length 2554 +/Filter /FlateDecode +>> +stream +xÚµZK“Û6¾Ï¯Ð)+ÕZ<Ô¦rH6În6©rìÙ½8.‡„fS¤BRÏ¿ßQò#—`£ûëwcðâa?Ý|wsûR°EŒbAÅân·ˆñ"qJwÙâí’DVk‚1^¾Z¼Lê}²}µ¢xYϏ2«“í/ù}ÔϛÍ÷ÿܾyLrõîîçۗ„ŒÈ’8@aÁ¦Õoõgg‚ úw1"Œ÷ ¾»Dá‡"išÕšr Äbº”ûC‘´R?y-w²^‘h)Ë…ãK‚CEóæÇ»›?oÁ ÒÁÁCÂÆéþæí;¼ÈàùÏ ŒHóÔ­Ú/Êà·X¼¹ùíÏBK‚[hC¢Ç·íY<= +`?6‡ðÄý‚öù Ëd¯$܋¥`ˆEó`rĄ¥xž7"~&kƤÚ<)¶/eÚæUé³ +ºçìzv?(ºUž9»€á®Õ—‹5`),\¬A17êø £f D›•PÄ6gÕÀ‚beF4…ßà9›Í>9l›C’Êm–ïeÙd`ç Ëß1Ç)ܵúÖ n÷æ½KÌG»P†QdyØÁfÀ€#LúU°#1‹Æ´Ö‰‘ˆ˜ ðÛ¼,òR¾Óp<úÃÊ ðÞnåk BçmÏŽ¥U÷Õn²”Η2m«Zßw éË$M«:ËËóIew¯=½~0.ÿú§›ÅÛîõAƒ§×îFæ989ðŠœ´ÖűX$3ë´.ÐʺÙ8_[*ŽjH„BEs:QÏèQ +ßDƒžîzŒü"¸dšïž-Hð²ióRûì"/“ôq¢¤,(Ö4D< +'<´N(Nmœ~¥ö81XõfTFÝ PWjՇ<“6wUQT+ʗOƒ€ñc•5è È ’Å!˜³LÄ´S•u,ßW@% 6?&ÍØnŸ·i•Uû$/•³uæß½×nwjØëì‰Z¶ÇÌøÔq$jce}”šŠT8Ĕ”ÁD´LÊL]„˪,žõ£þU‘zUËC-Y¶2ÓosP7ÖÔZ¸'¬;ñõ»´ZkôEŽ$z·q¸Ì[³}O P&ÿÔÙýŠ(#"ËFÛ PŒ©&Že&ǘ–2Sø¢Õš‡¢³žS¼DŒB,z(f”tŠ"¡ÅtHÚT€aƒ +æ²þÜè·÷Rÿ¦IQt8º{¹«jó\£ ÆúúÆ8WŒ—˜"Áˆ+þ¿ô2©þêˆV¯¼|¡-TzŠB#L?ÐþÛËЁÃK–ÉP<ÄÃqY•òLÀî θ¿…¨»ÕZÐ/L¨è¿Ê›[Ayµ?ÇÂÔV•!Ús÷ÉÇm^~M·v…úùþ¸ïSȗÇ!v%­•½|hÜô4Ðù›HoTÿ +QOeaˆ·ü…þuß}£þñ™þ"[_‰$ h* ‡$;[CuæõðÀ…öh¼V‘Ó_sbÞ{w¥Qtv×±®aÏÊç¹ÊCëU¹gªö@*ÀÆËï|ürÅôH)œ—C¬Õ·¹¯üæ#¬ ï½\ò±ÛG¡‚ÁG +ìŒÆbÂeäÊËGÕ%ö5( +ƒ 7‘Ÿ™3QO !è (Cò‡ðÁSuA'ˆm“ñ‡Ïª¨c1¤´ÁÂj`ÖQx1¤B³õvn"„5*®ä&¯A(fm¿ì7ˆ 8!=J¿&åøô( wŸ`:Z•hu¿uî¤h|00p”0:C—O)¬ +¨i%ø¨êdF!‹V_w• ü:²v/|NJ0ô–¨Qgä²ÈÆY8«¤Ù¤¬Ì®²„$c¸Iô­¿àfTUŶê*0…Z]W ô”¡0Oëü~`Þ|ÙêRÉ×׬ ‹ Ožt¾]å¯pH[rŸ$H‡¡²VŒ$ªÓòuC“&š;P ‰'cúŽ=Þf›CøádvŽ¼Y³sEñ‹`QŒˆN}{fëÙI”`6v~w ÍF~<@䆡Š^lªzg •«âîÿÔÌ,©ó侐žiàÐ!†~HjŸ@ Yφ(ÀOÊåP Ø:ÛÞ/%¿4#:,š™<¬)DXJ¸;€ø¡–`‘Þ:‘­Eöþ¨j¤Õ¡sW¯G ¤U ñêP•ÎÌÂ#fLÆ*ÔàÖøPî1fkˆ¹yxâ$Ð ü%# »3 Ãݹ‰,¥6+ßÙ©Ž*£Œ!΀s-´ýÒ¾©€â°È!ðÉìîÖ†½5ÔYÊ>­úÏÊC¡Þb'ò”Çý½¬]‹0<4~ÓγyÅ1ɜºzûñc*]ƒõi:‹Gñ¡Í6H,Ё~HŠ<Û&õÃðlç$¢‘"kÝՕs¬òªy+¦Nà¦WÝ_¶S³˜ù|fpÝô͛WˆÆ&F€²|h·²®«Y“!Ù +ÐAJˆn|£~“¬3ôSÔBÚµ¸³±HЁ~)ûîˆö—Î`Up=E¦_§É±1+5Xpá€åRë`*R-”™v°»éÇ*Å_°LÍ$@ۑ tî“ü5žtœ÷K¨M퐭¯1äg1Yöu5uŽqçM?˜ùìÅvøÚ>捿²Øhh°Ål@.p¦•¸¹µœÒß8Žs/Á.)==™@ÄæUDò°//"×#»{ötÄ6›ú{J!?ӋqúuzïU$£:‚þÓ†ãOĹët:ÛG_-`$¢àÊîi­Ú+·.å"°H_S_Òq¶™?ÜÐþ© +Dí¡£*~¦ÞÀ ÅW?6àœÉȍï”·¹à2âxá=ˆ‰m*þ,QºôÎFP\½Óúê±Üøªz˜]"H.°XÖ}g䱘f:9#ÇVñé.rÉÏ}-¸G8ӝ_àv~ì/ìü¦þohžíüÔa.=íüÅ/û×(©…˜íüœ­½½Ÿ:)àŸÐûí”ëU…íþT§€£ÙíŸ9FV·ãN°Ù¾‘æ±ï ™@‹ÙÞ¬­¶÷r»ë,L˜™pÍ¡„ Ù¤G¼Ð{¯lUsEëùÅ="àB>™,½Täj®h=w”æ²AÉxrk@斌¢–é¼ô‡ièø¬÷Ìt…ÔßNÿFD(&ѵÿÓýç 썼8ëÿ|áºlr{!sà»7%ú«Þ¯ô­q.}óßFÖ[q¾4Pþš”ÇþÄC¬9*³ùü#jNՐôìÇbZ²÷‹þê?ºÎ´ü’(„´oK¶=lnoŸžžPÚ c™j”··‡Cq{ZhŽ¨@ íD¾o,öÝI¡6x¸ONkÿÿovgƒ +endstream +endobj +2786 0 obj << +/Type /Page +/Contents 2787 0 R +/Resources 2785 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2778 0 R +/Annots [ 2768 0 R 2779 0 R 2780 0 R 2781 0 R 2784 0 R ] +>> endobj +2768 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [322.376 678.378 385.519 689.281] +/Subtype /Link +/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >> +>> endobj +2779 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 383.594 239.856 394.498] +/Subtype /Link +/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >> +>> endobj +2780 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.639 189.301 300.161 199.582] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape_e68d61763922cee018cbba3834b2085c) >> +>> endobj +2781 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.144 149.136 182.164 160.04] +/Subtype /Link +/A << /S /GoTo /D (main_expand_space_dimension) >> +>> endobj +2784 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2788 0 obj << +/D [2786 0 R /XYZ 90 757.935 null] +>> endobj +2789 0 obj << +/D [2786 0 R /XYZ 90 733.028 null] +>> endobj +2478 0 obj << +/D [2786 0 R /XYZ 244.439 386.747 null] +>> endobj +2790 0 obj << +/D [2786 0 R /XYZ 90 370.02 null] +>> endobj +2479 0 obj << +/D [2786 0 R /XYZ 400.69 152.289 null] +>> endobj +2791 0 obj << +/D [2786 0 R /XYZ 90 135.562 null] +>> endobj +2785 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F8 504 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2796 0 obj << +/Length 2765 +/Filter /FlateDecode +>> +stream +xÚÝZYsãÆ~ׯ`ü`“UâhN  ÍºÊ{Èe;q6»Jò o© r´D–h\‰ÿ>=N®£u9y` {º{º¿>xòa‚'ߟ½¸>»¸ +Ø$BQ@ƒÉõý$Â$(™\/'7SB™Í ÆxúfFð4Î7ñí›ÅÓl½_©eßþ%¹Ëã|yùâÕí»U¼U³÷×?^\Ò"K"Žd¢†êŸí”ÎÊ#Ê« ×"LT¾£ðrÅlNbªÍv—ÊŽ¼U÷*Ÿ‘pªÒ IÎĔàPÓ<{}}öë2xBŒ:„D^lÎnÞãÉÆœ`Ä@š3k3á”Áu=ywö÷3ìT‹UFc>‘4@$à–[§Ûx£J•—†‘>¥‹«H´¥ ‘ÄÑdW,¨%Sf·wêö^ËÖKµìй¸¸õ‹‹ZŸ×+§šB•ö&»wÿÖzÈ?8…¼ýþlrcÞÿsFž“øn­: ¹ ÙÝ¿Õ¢t{°Èò\Û,]&é;TfîZ/½îv™lTZ$YZtçÞ¹÷÷F¼g=ù:ú™;çD ˆ;sþçÇtº¤íꄑ駵¤0BāI†E}]¹9•80V‹SM‰K;'):‚™ª(“4.Ý\ª·¡;C‹î…·[•›É¨'VÇâæ,@‘$P +xd¥{ý¸P[ý×Ï47­E¹¼¼LÒÇ Øu²¼ó;´<¦ã¶£¥â<ÓÊ}iYĦɽõkÚfŸ DIý—_0fÎùÛüq…¤šS®@±fNgi*QHe5Ië^¯YoÎ ¥bò .k.V±AGÙgØBšÃrZ©‡>¸f£Ï5Á¨åZ€$Lð†ÖœBŒuA9ì~ÔLÞ%;bŸ{ô"–bÔ>xøSKبEŽ«¥þ÷GÏö…ˆã Ù>Ê}FA[!cÊtÌó8¢QÉ´”±“[•ÎÄke4L@Yí V¸½^e…³£Mü˜lv;îµ/ó&qªŽ­ÓÃscåÜ,}zDýº‹×v¢¥Ç¨¢ñϳÐð/]z´I)Â<µÃ®Ãiš•–G§ÎÚÜ©ÜIâƒ0€ ú­ôüìQÕ*S:jý¾qº×·í¤ˆÖOBÌß2{ím®òâ#\ ¢èt« yÍsœ«á Q¯x˜ƒ‚®BŠ¨ÎEÚ6™¤ídðÐ0 ÜBö\´gµëÌu€Ê'‘§nžò° +•¦ðA Ò%Wý”UáßÇj¨ šL ÜoU +™>l ¼•Ž()u€»fIP£·¥%øߔiC¤eôh™ÖYùڏ„¸I!¾SÇå%öªŽÊ!ì#]WZdK·¿`áGª¢"-ʁ¨ßT‚7Iº†4á½ÇjænæœHs5óߪr—W…Gl/ŒÎïWiv«õ—u=’{â +:øéXàg("½ìƒ€ï?øð +gZ‡¯GuˆoAÍ¥N ¤Ÿ²ÞÔý(‘¼ªév‹UåÙ±o¯mcÊãl€³=n¯ûÑL켆 /¼AhoþGd,MïZcGå< 2B֝Ý8@«òYH-H©ðä*OTºtVö]º¬cÜÃÕ.]¸Bž^e S[ÙÚP[†Ì §*è,ùº]s°¤³ô7eÌX°‰M‚;Лie7wY¶¶Ôl›åz (ãÆÁ­[›×ÇZJ|Bò‘–RkQã¡©‹Oæûk;£[CâGEϽ:4z)îœK>=MF AŽF(¹ :½x:Ô> ÆÚg,µ)Ãö^Im+ÌÁ]å>½ŠðÚønîxÁ™CµC¾‰.6’e ñ°¶†2ß©ú©±ÓäÞa|å}YºÞÛ;o©* éf£@¤ÁçiÓ%³žw/^½«BN@Y/üœ•ê(ô2(K›VÌï#Ï&Þw;yCÝ#ªv‹âRç¯Xç¯N˜¤ê)ƅ:ïiÇ&¾ëj÷»Ñ&æ5¯÷P´øŒ ›õº @87–§–~¸à¨Ì‡öˆ~A8æCù£„ü‘õuÍhí¦—¥m‰ÇKùk{©ڛéiÆ|òb0Üò$à¡ÅáFÀ×RÚ¬mz` QT儆&k•UBžõ áÁ$8@˜Òßñ¨bjÃZøÅÖòS°¶Þæ›Üf^°…²,¤‹ ەÛ]uP™.Å]hþWž”¦‘r“5읈éci«~ÈÕ*Ö:‰1cޒB•iwVù²h µt™·ŸI!bÕ{i D†ƒžÏªX·« >€`¥rÜzæôs˜­hǎ,€C¹··[W±eé3Ÿ@P¡‰h<ÌIÖF0ã š™‘–Ô™W8X°iT §•vëíÆ.M4,ÒÖ ò¶…ÊÕXéxì K{oZã„Z¯Îc(tm¡cšêƇ/í׍ +~ϬÏsGH?$&ÊèöL¼^;<¡‚ZW“íIÚ6Λlþξ¯\ÈúÊI°7†°/™Ò ê! ÉÆ0¬±h—Ò Z#şžÛçvJGSz]Ž!o0‚¼"åzyCBÆòyÚ +;‹éiJÌDü_çóÇbL;¡çÿ3 ý“wFÒotêS~v^/ž4¯Z±þ@yýi¦rZZ±OPOc˜#þ1Y°À~´’Ùûsݞ +&x”itãGQ!Ü$–µ59›Ž/ÊD÷Jãüv™eœ.Ôm\ɇÔNÒPþr¥uY-«ôšÂ²‚ð.fý¼3Ç&žf¾hò ô˜)n¾0šÐ!X’éëGˆÎKXڒ¯zÜÉbïUðÃÑFzk)/H$E=#?¡ ‘œVñ€Ù2d(„5©Õ)šðwÛ#ù”"žÒÂzB{/øE<Ûñôm¶3Gl·¯’ÜW¦’¶›/“Ü¿ ž®Z#T—²K_Ìîl ֆμñêæ%s÷S"àéÍ©Jåùž—Êß\‡Ý(󋵏ŠdØ;ú @„°ƒ³]軲n:‚ëF2ý4,™n-マn÷+&$š¶ð€h»CvL´Sh&me£–ñÂhZ@*­Ü;].šëv›gÉƕÑz(sÒëS*sM«#ö.S¡l퐟"šSæP¢¸,¡°ì9ðPnd=kÇ`oØ §5ìꢭûI\ÿ³Î FÂS¿ê4_q¢ú;:ºehJðÞ÷“ot‘«_ÝcuþjÝ!¬}øG¡òot?¥¨}Ñ}a}´ª—ë# Œ4ÂiOE6wz§ª#x+ÙÇIu÷әQeïÞxքUYn//.Т@P os””Ûíúâð㽑¬‰ÜW(²Éª6u’ÂàÆóI"èÿ?¾;õR +endstream +endobj +2795 0 obj << +/Type /Page +/Contents 2796 0 R +/Resources 2794 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2778 0 R +/Annots [ 2782 0 R 2783 0 R 2792 0 R 2793 0 R ] +>> endobj +2782 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.502 704.958 241.69 734.024] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +2783 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.635 631.459 163.823 642.363] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +2792 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [486.549 568.006 513.996 578.91] +/Subtype /Link +/A << /S /GoTo /D (main_fold_space_dimensions) >> +>> endobj +2793 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2797 0 obj << +/D [2795 0 R /XYZ 90 757.935 null] +>> endobj +2124 0 obj << +/D [2795 0 R /XYZ 213.427 559.204 null] +>> endobj +2798 0 obj << +/D [2795 0 R /XYZ 90 542.477 null] +>> endobj +2799 0 obj << +/D [2795 0 R /XYZ 90 463.701 null] +>> endobj +2526 0 obj << +/D [2795 0 R /XYZ 90 440.767 null] +>> endobj +2800 0 obj << +/D [2795 0 R /XYZ 90 440.767 null] +>> endobj +2527 0 obj << +/D [2795 0 R /XYZ 491.351 376.058 null] +>> endobj +2801 0 obj << +/D [2795 0 R /XYZ 90 359.331 null] +>> endobj +2528 0 obj << +/D [2795 0 R /XYZ 203.822 272.749 null] +>> endobj +2802 0 obj << +/D [2795 0 R /XYZ 90 256.022 null] +>> endobj +2529 0 obj << +/D [2795 0 R /XYZ 485.373 193.35 null] +>> endobj +2803 0 obj << +/D [2795 0 R /XYZ 90 176.623 null] +>> endobj +2794 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R /F8 504 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2807 0 obj << +/Length 1778 +/Filter /FlateDecode +>> +stream +xÚíZmoÛ6þî_¡O› Ô _E²+¬/Ö½ k³Oma(6Óµ%O’›äßï(Q²$Ӗ³5Rø“Dú|º;Ÿ{¨>8øiôübtöcȍtHÃàâ*Ð8!A‚’àb¼‚ÈdJ0Æãó Áã([E³ó ÅãtywmY4û5¾Ì¢ìîéÓç/go¯£µ™|¸x}ö#!-µDs$µ‚‡–ZŸU"'Œ(¯.<:4"LÔßix±Œò|2¥ƒ2MÇfµ^F…©fޘ+“Mˆ›dS’31&X[£W£¿FÔà€”áIxð|5z÷ ˜`ÄÀ››RjpÊຠގþávh2„Cá|¼vÖ,âÌ̋8MªazU]‹ú÷h½ÎÒÛxmebçZ¾6óø=ÆÔ,ª‰Ë;Ñz2ÅqÎêÐÀó*¡ŽyD"Íh-ƒ¬D0¥D#&E0…_CnùÛËådÊÏÓÕzS”fåÕL”™êfm²«4[Y³ìp“ÇÉÇêöó„ +‹£Ë¥qÿ²Ûkq·vqmæŸl¾™Åì÷ÍêÒdž„`„!Š^Ruœ‚¥ãz›T +¢ûd2L_Ý&Y4êgÓÊaF b„ƒÃiáVê<]Æó ã;TÀúy¹ßXf»¸ºÇü a`!©Þޔi±ŒeÕÄ"΋¨LY;º4ō1‰gÁ õ´1êÖc”FB6Q²ðiŒPMÖÜ )±9YilB&f‘fJó"͌û-Jܵ›Òv*uÞDž»&Eê3JAÄHƒ$Ù1®¹`› òtWå”I‰˜ ÝE/²ñ(‡¬I­ü»jÓíWÍâDÖâWÑ2÷éd6Y“!)¬vçÆ¥Š&Hâ°»7v0®zØagJì°7;&dl-³3>ìm>ìT™9p­àÃÞ˜Âjß=$¶UÄfµ¤{ñŠP¨µK¥ðð£Wø4a)ު܈#áªwQÀ] ¤†$¥‡jsÇæ$ZÙã¤)®Õ艽0ŸHÚ ;>ƀVåžl­ºLÓe¥­*ì rÎjМ!ˆ?&.9F˜îîø÷Xà£2GÙ5–CdFµRÇÀº.Äqd*žû’ƒP”d=͓¾©´è +(ÞÃˎ†Ô/my$ ¶g’Ö`1>@ë7 ‡¡X +‡üSÇ;xëQÁ¡Ž‘ƒÖ»7TH(ÕM‹}ÎÓj,p>Ün,¿÷Ëï[*¼ÞÃ>i¯J÷ܯjã¾fã7é&Y¨Î^րÞQ*)’[Pj@¿kAö®«·Jyíå! M³±‹Õ{tSŒ¸bÿL·lé&¨›ê@!> +(½Mœw™±¸¼øàA~HH(¦€W)ʝlÊÊiò^¥ïE;aá,u÷¿EÉuT –&9æPsɲöïå’Š‹ÜR—Tˆ‡j€K†2á!.)–ªO!BúâD“O4ù«¥É¢E“íú4¹45s6·ŽØvè8rÇ-KúRûr¦v¹³Ç ðE=ؼiŸxÔØrKwA¸«Ð“û`Æqw­!‡Ù1@·.é£ÇáÒc¡¶ÜW(lKMòëƒL1;È ŒwɯUg6óe¼0Q²C{Kú×ñ‹ñT÷xÏþƒSg·>óS[µúô—IrOú +¦ùáS@çQ{’tˆ·‰Œ„Šå‡pµ(Ëå! ‡Fî ›pÔÑòKzy ®½,] ÿ•‹SN¢ýÒ°ï%î ÝgCt[Žâ»°¿‡ø.iïñcøî!nGŽâvölǹìÿr×lëûq7ô þ%¸›¼7wÐ5Rîr7J¸s nڎÁ°åœÑ8€Å=ìÁzÐ1A’ÒŽ’’X#[̍RÒ07û[íHŸPÀTI:À+ËÜìxs“…Šbn;®•úöÓ+¨Œ4;â8ÆV®!§v7vwõ‡DZ8µÅ…êšøšXÜ©Qòå%'y(â‡Ò})~‘SÓÄÛ4ÿGӄvN…ò!›&R¶ß6ÂÈ€b>‘´%Àw|Mð‰Ðk±m«¸¦ hÛn¬ÒRéƧ~É©_rꗜú%¤_"õ×}¦'6üøÙðéT}êü‡½‘æûÔþg®PÉ5”™#¿r­¿n ¤˜r_· +À\ÑÏ®sKáíWÃnX6\ Ý·ÃÕàÏÜdßN€`äMÓz-·ÍìÏV•Éò& agÀV²UMì!büÖçdåÙ§ ¾ûeTpk¯m²í+õë¢X?=;»¹¹Aóm’x¡¸8[¯—g°õ¼& ’«ºÝ¾JëDŒ›‡eŽîÄÿoùíSý +endstream +endobj +2806 0 obj << +/Type /Page +/Contents 2807 0 R +/Resources 2805 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2778 0 R +/Annots [ 2804 0 R ] +>> endobj +2804 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2808 0 obj << +/D [2806 0 R /XYZ 90 757.935 null] +>> endobj +2530 0 obj << +/D [2806 0 R /XYZ 125.554 616.702 null] +>> endobj +2809 0 obj << +/D [2806 0 R /XYZ 90 600.329 null] +>> endobj +2531 0 obj << +/D [2806 0 R /XYZ 438.998 466.543 null] +>> endobj +2810 0 obj << +/D [2806 0 R /XYZ 90 450.17 null] +>> endobj +2532 0 obj << +/D [2806 0 R /XYZ 125.554 239.601 null] +>> endobj +2811 0 obj << +/D [2806 0 R /XYZ 90 223.227 null] +>> endobj +2533 0 obj << +/D [2806 0 R /XYZ 438.998 89.441 null] +>> endobj +2805 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F65 376 0 R /F95 1788 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2817 0 obj << +/Length 1992 +/Filter /FlateDecode +>> +stream +xÚíZíÛ¶ÿî¿BÀ€Íz<¾Šä-(°¤ÍÚ®ÒäúeI`èlޝP[ò$¹Ž÷×÷¡HɒL˾¦V,ŸLÉÔÃçõÇß# +GŽþ>y~;¹~³H#Ó8º½4ŽdL $º]Fo§„ :»"ãé«ÁÓ¤X'óW3Š§ùjÿh–E2ÿ>½+’bsóü›×ÿÂlþÂUúcºH*3»¢O_¬’²tÃ×æÞ3¢¦&[˜Z2Ç° +ž½¿ýnòõíäߪáˆÔª‰$Ñb=yûGK¸ÿ]„Ó*ÚÕ³Ö§ ~Wћɏâ.(0I£Î¬ƒ»ìâ#î¢HàxÌ]1¬Ï¸ ¶¢ÆÜ¥;Eš–N©¥©·³´è+âiYå…ñÿÁþ¿bšl6Eþ!]'Ušgî¯üÞý•Vî:ͪ<¤“×R9€Ö“JYÃjq…©¶Àë±D®ÀJÑn¨ÅÖdÂf®[¡uyÁ©Å>þœ^†aDD«÷}²*Cë0ŠØ!sÈ®b—–Ægb QzÒ«ÞÛG_;€ fáüi/­?›z®ŸÛ[©¯ùrc5…2K_‡û€C"rv„Xý”•PátPA”@L¤èWÐßVÀ"¸¾PãO­Véî$…qƒ)îóbmÕ²—ÛàÔ ™QH£"MîVÆ?e-¶¿–ò¸Q—vœ¦ÀnD,{MϨ庝)\S Áôµðä†QIÈû¹ñÊRŽÓ}1Ø! ¿<§„w,³“÷â÷C&q2‰ÏÈô™zÈ$þ¨ÈÄ;Èĸ “½S#“xdºn5³w<8Ùáœì­:‰àׁ“]N˜BŸ€Mä­7uãCO¢аXëOŒNC¾Þ`$Ñý¾X¾˜jåºAí®¬sÀí)ùè„@¥¡§?ðþ½…<4®®u¶â­ó¡ov©©)’xÐß ›é“‰£lˆÇfÀ¥f +Àø´†z +¥Å¹ë\¥ø¹vYtû+šF’ +1ÖHy'$>ç=Ö+C©Î6êr/锏 lŠ7VH(ÕO‹SÆÓaJÏ:n½ÀòŒõ'^˜>©ÖìlÿL»»ã%ý³—ÛA¥‚úòÀ¦ÝëªõdÃËûm²eG6ù„²éYÙcïèEïX¬ëEX˜Ÿæ•¿è•ÿƒ¾RøLÜÿo‰{˜¹“ÏÔýc¨»]¬OÝkU ¯s祂½ô¼½g–%¢¹=er—}>0B¦ÒÀ†qºSû"”6ÀèñÎЏÉS0é° Œ¤_˜±Ã~"° +Rv‚ÏsvÅÓì7qö8HEGXœ¥Û÷übYrž.Är—Ô€¬YôùãÅӜ’‚‡™bgxUG‘¼JǗÛr‚WِËie‹1Û¿p‰e7)Ÿ=bùŸ8¥ùxæC©ÍÇ>½±¨—¬Òÿ‚KØHZáeµ¼¹©³2ÀØrD, 9Õùb»6YՁb€¹ØT^ŽÆwuÈýŃÉLa-õOùz€‰÷ùj•[ ܵxiÑ}enê³ôæ0Ü¢B Á½WÞQ*ú³ÞÖGd›Í +=>¶‘r IÝQ•Ãk”ü¯|p fˆ ] ÙŒÛmˆ©{þÁ´„sq¼b'þŽÓÎÇ!]š¬õi¾±q€ ëCÂý|ûSš-VÛe`÷RèYˆÒuá·‹áÙ»ŠGKóJímµ›]´aîëMªP7ŸJœJ•hÔ¢òÿØï5ŠÿáÆëzNYØôí6ß}|ø{ý诲ŸðÊaiÍ ¤ä ‰ðÁʫij “@C‹C˜²ã@ö"_¢Q5†Ÿž@W¯_øåIýÅ ¸ò@þA„€E O…^Ùµuâ/›Bq—¾ZÜÅO¥)þbÓÎÇI¶m`wLŸîe /@>“-Ž"÷Æìi|ï,û9jFÿ˜Ô©wÐjº… +«jss}½ÛíТDÛ,Ý(­®!'¯¨#Â&[!m™­ó†ë¥™¥z5$öãþÿÙúu +endstream +endobj +2816 0 obj << +/Type /Page +/Contents 2817 0 R +/Resources 2815 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2778 0 R +/Annots [ 2812 0 R 2814 0 R ] +>> endobj +2812 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 138.284 177.053 149.188] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1BHRZ03__Certificate_1_1Compare) >> +>> endobj +2814 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2818 0 obj << +/D [2816 0 R /XYZ 90 757.935 null] +>> endobj +2819 0 obj << +/D [2816 0 R /XYZ 90 733.028 null] +>> endobj +2548 0 obj << +/D [2816 0 R /XYZ 125.554 527.964 null] +>> endobj +2820 0 obj << +/D [2816 0 R /XYZ 90 511.237 null] +>> endobj +2549 0 obj << +/D [2816 0 R /XYZ 438.998 377.451 null] +>> endobj +2821 0 obj << +/D [2816 0 R /XYZ 90 360.724 null] +>> endobj +906 0 obj << +/D [2816 0 R /XYZ 90 262.331 null] +>> endobj +142 0 obj << +/D [2816 0 R /XYZ 90 255.731 null] +>> endobj +2822 0 obj << +/D [2816 0 R /XYZ 90 157.258 null] +>> endobj +2815 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F13 540 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2836 0 obj << +/Length 1532 +/Filter /FlateDecode +>> +stream +xÚÕXے›8}÷W𔅪X–äÇL2Éf“­ÙÉìËΤR –m*àuùï·uájÆ3¹mí>¸,@´ººO­…­×³7³Å¥ïZqŸúÖÍÚâØ +|‚%ÖÍʺµ AԙŒ±}ålGå.útåPlçéq+Veôé]r_Fåq¹|ñæú/ì~ºeÜaLã¨Μ2l_¤QUéáµX‹Ò!¡-²X(ˆUˆóñæíìÕÍìˌ€kØ"Ê ÀeV¼›Ý~ÄÖ +0ryhÔ¬åQþSëÃì>uö™ëjŸ&±öè½Ø݃Kj|¹Ïâ:ɳJ¹ÓØ[\2Ü3F|乡5§ùÁ;JÙàC¹1Á\¿žY·s0N¢ÔæIWî0Ãð##«GµBðÈ÷¤GҏZsâ!îyÚ£—bíÓZÇCHu¹ë°'ÄF“Vˆwޘ9ù™ñ*7Íà srڕɻ<›2ò¬Ø~fLKgî Ü®Ø×Â$o½5 Ÿæø …e!ñXoâqD‰¨Š­ž3ð„`´3¾ngHQð¿±5O5÷ìø}{TxR?ºÅ%íKˆ<Ÿ7{w‡]¬÷w°p˜6s~FùQ6®þŸ\ï&…’쑤•ÿbZu©ñ­vÓV¹ò=©€kt‰›îÐü)Tÿg¨ŸF®ßð…òÔq[Tº`8ï½â†(º¢Âî±zÈÇmQÕÛ¤š VÄL3éÔۧѸ Çc¶ÆcLíÔCn@¥vÆÏsûHªÌ©Gëqk0¯Óaˆ%öRÔQ’Š•vJ=.“B%æ)ù`iPÙçvæ€òúÛ!Ìւl£Ùc¸´àéºÔãC²Y’môU^ˆ2’Ô؎YzAäÓ®Ï>°xŒÊIߓi­ûJ…†vë; äa”Õ‰önhaðâö†ë2Ú ‡2û El^~Ö·+c#2Ëh›¡½rýÌØéWMpUAœxŠ’2”4(¹rB”•0Êl•ï¢$C#½9ÌŒ8÷ajäæïy-–g5*”æR ̨~éUCî>¼ù„{ã͗ó· 9Éÿ{3Wo‡~²t©¯t­ÉQ³"T|Ü§¢™Ð`*¯† 3§œÚ¿fúðDÄûè<~þöá©=#Ž²^Ưc~8W$ùZÿßç'¼Ò/([ž¾ ø°jtÏï:L@\kîBásÖ£æ@6up1”ÇûÈê¨!…1 h;-¡ÈÖíòo;ä-—ºõ¨c1Ôu}mޛOUÍĉñ™i ¬‡ƒ\æ´!ÓãfÒÇAÓ8NzÕ¸ûú1†Üô#»ÿ™BnvâZÔûRæWV z 4í¶­ÑèÍp$7ۖC&†F¶0>?5 Ÿ·mmZÐzAk 9öô-ȶžõa`b% +‘­ºöa >l5£¨·`p‚0 'Âav +aàéŒÛXsÌ«vQšŠ–ɣ칊/û(5wss¯IƒM)`ÿ{ïLxD| aû£ 8ÄÂno”µRT…€Ô“­CSQztü¦µÎ]† + }…Õ¨«xž‡(õxòã È«SC” 摯 ÙÙW*ÜP5ùWçµÄÞ A•+Q¶ÏÛD¶59”û×¾Â7ÝÅ%ê’²•1Yãr&;èÍ+=Sêî\sí: +f‚]|È\¥H£ N8«‘&QË:«uÍ6wԔ¢‰Ì´'ÙIi¸.óÝÈ£už¦:̶Þ$JéHNt¹bœ?™EŠ¶ÛÁ“ñ—<41 Ÿú!O}Àƒ$ñ!5À ýqÄØ®+Y²_9ƒŒ¹4]K_üY‰ò©0 V-gÙ­L—¯ZÜ1£² ý1èƒhD„Žì³ÕŒ~›©´ïü%a€\ÜVж®‹åbq8P\¡}–%Jê·8Uq=+phêh²Íƒ]^šð“ nîT® 1þÿž?lï +endstream +endobj +2835 0 obj << +/Type /Page +/Contents 2836 0 R +/Resources 2834 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2778 0 R +/Annots [ 2813 0 R 2823 0 R 2824 0 R 2825 0 R 2826 0 R 2827 0 R 2828 0 R 2829 0 R 2830 0 R 2831 0 R 2832 0 R 2833 0 R ] +>> endobj +2813 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 697.621 198.921 708.151] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate_67b4e0eba7692bced073431cd3cc22ae) >> +>> endobj +2823 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 658.393 198.921 669.297] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate_5ebec8f5ff32009c4cf98dead90f4a3c) >> +>> endobj +2824 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [226.258 658.393 274.188 669.297] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +2825 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 619.539 198.921 630.443] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate_f2ec3c62388f9aef1414a527e82cd1a7) >> +>> endobj +2826 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [226.258 619.539 311.268 630.443] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate) >> +>> endobj +2827 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 581.058 206.669 591.588] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate_97b2101d371edae52746a53cf34e4b67) >> +>> endobj +2828 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 541.83 163.215 552.734] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate_35ea0c10995c89f8a11a2e8bb5dc7f17) >> +>> endobj +2829 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.552 541.83 275.562 552.734] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate) >> +>> endobj +2830 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 502.976 163.215 513.88] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate_6ab41afc79135511037718442fcad4d4) >> +>> endobj +2831 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.552 502.976 238.482 513.88] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +2832 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 335.293 191.727 346.197] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate) >> +>> endobj +2833 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2837 0 obj << +/D [2835 0 R /XYZ 90 757.935 null] +>> endobj +2838 0 obj << +/D [2835 0 R /XYZ 90 716.221 null] +>> endobj +2839 0 obj << +/D [2835 0 R /XYZ 90 716.221 null] +>> endobj +2840 0 obj << +/D [2835 0 R /XYZ 90 677.486 null] +>> endobj +2841 0 obj << +/D [2835 0 R /XYZ 90 638.632 null] +>> endobj +2842 0 obj << +/D [2835 0 R /XYZ 90 599.778 null] +>> endobj +2843 0 obj << +/D [2835 0 R /XYZ 90 522.069 null] +>> endobj +2844 0 obj << +/D [2835 0 R /XYZ 90 465.656 null] +>> endobj +2845 0 obj << +/D [2835 0 R /XYZ 90 321.719 null] +>> endobj +2846 0 obj << +/D [2835 0 R /XYZ 90 299.407 null] +>> endobj +2847 0 obj << +/D [2835 0 R /XYZ 90 299.407 null] +>> endobj +1421 0 obj << +/D [2835 0 R /XYZ 90 115.733 null] +>> endobj +2834 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F23 340 0 R /F99 2117 0 R /F95 1788 0 R /F8 504 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2869 0 obj << +/Length 1653 +/Filter /FlateDecode +>> +stream +xÚíXÛnÛF}×W(’@¸Þ —£(иM›´A][ÍC“À ÈµE„"U’²â¿ï썺Q²œ*Aú`sIŽggΞ™]ìÜ9Øùyôb<:{2'AIHCg|ë$؉B‚8%Î8wÞ¹„ æùcì^z»i3Ko.=ŠÝº|˜Š¼Io~+&MÚ<œŸ¿øåê/Ìn.DÓï1¦Yډóó‹z6OÄ®ð|ʱ{Ý5‹¬Óã+q+ô»*ƒ×cŸ¤Þ‡ñëÑOãÑß#~b‡(¿x„"Ɲl6z÷;9<í`ĒØY*«™P×Ò¹ý1Â[s„™$œS;IÊù™dÄI?I9֓d‘ëËy9Œ¢8ŠŸ0”‘ö@M^ž½äx-¾µ¥bA¢mСëê.-õ°nrÑ՝¹«ôU{ªÇÙº»-ҟ‚é¯>…Á¡…Ԅ䛢ÊÊEnœ"d͒3A̱6ün ò΃ù¼DÓéã(Ckö½ÁY'£ŸD( L…$6¼\LÊ"ÓÓz#f­¿\TYWÔU«Èc³¿P¢€ÅOŠB›ý÷”òß8ï$ÝI]—æ¹d`sg¨x¥,T¤ç¢I»ºy9†?²"mä» ¼êC ÑjîÙ§ç&£'Ä|PÎïÀj£U$#êÄÉ0‘” (&›Ô\‰nÑè(F¬¬F–®É5¬ C¬MH VH¬Qq«=J«Üòº|Ð#xµû‰ B1íéôi_қZƒ¬ž‰VÃMÄm­Ö§‚MPFöW°±~5 =¡Û¤5Šш8~ÀáÁJ„12ô£èÒ¢fæ?Š6kŠ¹d÷€Hà/"½ ÷ÆÓB†+ î¤¨@ õxވ¼P¼R·¹ •0–©¼°Þx²æŠ¼«ôµwƛ®ègËi‘MõÐ:±hUp}9¦…¥Øc$u–úý\¤ü‡†… B:©¦µ¢3|¨ óæVý÷ÄÔ³¼Î3Qué +VòIgAGM¯U½¥*2æŝ¨¤ŠØ\ß6õÌþVX´²¬=ÊÝeŸD Rœo®æ^Ü8âV-÷‰Ûº*oGß°‘8îÉ]!k³ø ‡XÃ%I¢jÙVÝØø6¡ƒçÆäÕø퐝|·nlã0krQ¦­ öØK¨+fóRSv§(Á4ˆÃÉà"«j“ÑJd¢mÓ¦°••50ÔhuÑÖ>P8b³<õ¸ûÕ£Y—Vw¥8T’ƒÿlIæ»%yìEœÚÉÊp`¹0KÒPbÍ+ Æͽ\,iy#:(ÈO¨iý2W`ú ¿•–†[F’”ö šÒ°µ 'õ§ã +KŽM™`_¹ýѝ@uÝ)þènÖ°¯ڋâ¾õ! .E:){Üœ¸aѵ@_t'`:v½-ÙHžÍº}œv6©‹*ê}— è…ïö »Md†‡»ˆ=9õI«ÅíCÿ”r8«÷J³‹üp"Û¯–H/ÀîFG»E¸b§¯~Bz¯û’+r71P'ÜW‰â±ŽñóND¿$Á"K€»©‘‹Ø´¢¹Qszzúód¯9ÚÕ`óûÏmÐjÈg¶ftZΩQ–ÔÁMu”üD2óJ ƒhˆåý¶çã#; ¿›j°vž*m‚¡Ž¶G\݀ÂÕuÂuQ©ªÂ·QÖKY eð©Õº}›6q„yÿå[¨tƒÛ¶ÅI²¢®O“ØýæÚ, é”qòð·"%.z|ƒÐÞ½1”‘ÝPX#Di¨¹5€ } zÌç@>‹ ¬_(›C‡i:Àj\u÷†Š +“Þ&LsÒ,Ó[ÓZè-9¢6@gÈ£ð„Ò°˜Ïÿ—…ÊNöˉƒ§É€YY€am}«4®ëš·°–;º{!ÿËè“è]`8ø ]{]0.>* +8J¶Ú3jQqØ' +$> endobj +2848 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 609.131 175.937 620.035] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1BHRZ03__Certificate_1_1Compare_98c515b16e12424b273eaff073b31f3b) >> +>> endobj +2849 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.274 609.131 288.285 620.035] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate) >> +>> endobj +2850 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [330.018 609.131 415.028 620.035] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate) >> +>> endobj +2851 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.367 322.866 219.683 333.77] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_cbf26ad2a67dbfbd24eb9c89448a793b) >> +>> endobj +2852 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [166.762 242.104 216.096 253.007] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_9e6044d3d1b8cd66b7e150763a0cce2a) >> +>> endobj +2853 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [219.912 242.104 255.099 253.007] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +2854 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 203.623 182.144 214.153] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_d02ce2da26b1d9dcd0d45042b9f5c3e5) >> +>> endobj +2855 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.959 203.623 221.147 214.153] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +2856 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 164.395 205.586 175.299] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_1d8eb71bd67ae50436968e7323bbeb7e) >> +>> endobj +2857 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [209.402 164.395 275.045 175.299] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +2858 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [343.896 164.395 389.913 175.299] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +2859 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [408.125 164.395 454.141 175.299] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +2860 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 114.582 205.835 125.486] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_a7961325727c376428ef2f9431e0c204) >> +>> endobj +2861 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [209.651 114.582 275.294 125.486] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +2862 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [344.145 114.582 390.162 125.486] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +2863 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [408.374 114.582 454.391 125.486] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +2866 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2870 0 obj << +/D [2868 0 R /XYZ 90 757.935 null] +>> endobj +146 0 obj << +/D [2868 0 R /XYZ 90 733.028 null] +>> endobj +2871 0 obj << +/D [2868 0 R /XYZ 90 628.105 null] +>> endobj +2872 0 obj << +/D [2868 0 R /XYZ 90 628.105 null] +>> endobj +2873 0 obj << +/D [2868 0 R /XYZ 90 571.811 null] +>> endobj +480 0 obj << +/D [2868 0 R /XYZ 90 446.913 null] +>> endobj +150 0 obj << +/D [2868 0 R /XYZ 90 440.312 null] +>> endobj +2874 0 obj << +/D [2868 0 R /XYZ 90 339.937 null] +>> endobj +2875 0 obj << +/D [2868 0 R /XYZ 90 339.937 null] +>> endobj +2876 0 obj << +/D [2868 0 R /XYZ 90 261.077 null] +>> endobj +2867 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R /F11 418 0 R /F72 471 0 R /F21 2111 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2918 0 obj << +/Length 1648 +/Filter /FlateDecode +>> +stream +xÚÍZms›8þî_Á§ž©e €L{3mšvÒëK.q{×i; ÁŠÃÔ¼à$¾_+$ÀØ؉}Iœ-––Õ>ûòìb¬M4¬½ë½õ†o™©¹ÈeÓFš‹5›D ¢ÆÚwdõc¬Ÿô Öý,ò½“¾õd:¿äãÌ÷>„癟Í^'7ýŸ£÷÷„,H$Œ!Ê,x^)ð…\Òz(ÁȨ¾vH1` ®×ü¾FˆéV+§~ž÷Åú¨ï:Ò©_pyç”_ð¬OÇÜr uà ¦Ú;õþéƒ5RZƒÚÈ6©D½ï?±6†ûï5ŒL×Ñ®ËU‘f&\§ÚYïÏV–]w--NqKo†,ÓÑlqìHõ-Õiö }²‰Rìô]Oû> €ÊaçEæ‡qáÍó‚G·o&êmykƒúú¦þ‘~³xI®¼ßچæÀY`’˜ehb!ÇråQNy1Ëb……//¹Ô´üœ\,<P¡ºÔª¼9æ?06â0žHÄ]wáiÄ¢È$¬‚VšÊ/èÂ* 1°ªZS\†¹\ÓÖ<žÔ¾ƒ:Ú¹߀¸ÂÕ†‰b?~Q‡Qø/{ûE²Öã^u,dgÏÀ¦‰ˆc+`ÙÀN²™È0Û¦ÚöPpÒ­ã²VH®MÓ¬oQ=¹ #¿Xƒ  dßr°÷qlEæþ ¼[`n¬AL`澑e2\cWh#%ÙÜËÁ>^1Oùݐ-’Ÿzjo{çó‚?jÎ-.)5QÀÂä§0–W©V éz£T^}³4¬ä|Þ¶à&ÖÞ1¥È ö®v7°¹(X7Ïâ'‚ùî@G~ì î>ÿmě8p™»0*ûx»Ö]™ÞÛ +Ü«² Çê»5`úy†Þx¥›ˆÿÊÂ’"é0 kkÓåÅøà àYÖa?Š«qðà¯ÎåǬoÚ:Oå%çqù:‰kgX…ÖuE÷O©  ÕãB[š9 +Ê}UŸå{»Ã˜6b Kº7˜Ýý0q\dßÊ»¶B9Í uxà´{’U=Ôr´iÿ'tLd×AÝé0.:gëü0Ëk®Ö’2»v¯$å™_$Jšë,*o"ÜÌN^¼èx XÊ4éŽa›±{¯aŸóÂãQZÌ7:Åna}èÏr¾\~ϓ›:Ðå $‘úRjB©þ\UhTÒô¼½e%š—ž!ÅTçÛlãæ8­)؜Յà˜PÉíê@e> ü\©ô*ÏÃIêÆÙµŸª. Vá ¯vµ4Yž_™qƈ™t[n¦F†]®Å_‡ wyp•Î©ýñ,òêUùKü|³3½)њðX÷Ž¦\¦Kð¯0¿üòéøëÑéÙÑV.FÀÅ p1E__ÏÂé¸Ý±ÍâðJŒ%ø*Ãg+~Q»á +ãËS„b¨R·|©¨ïj[lÛ?KÅ[Z¾ûÃv1O¯ÁdÍîgó>a¶qïa¥SIàÃbîÉYp‡° µîå«Oß¼ÃÏO>ý}<ú¶ºj|û¹ ñqû’t>š8ìBô@£Üd#×ÆDl6ÀšªT ÁËìÁÚ¬3lèóÜ¥}KC´i DÜÅ~•ý>ƒf^=·o ¶12öܾ·Å!È¥*«Ü¯?-½_`¢]5Àš—KGn‰²pÜåW+¢šrûô\ÌNÎÐ[S–°;Ï®€”^q‘¸T-™¥×¾Œ€Î¹Ò2mq19´YÍ<ç]Ü\jG"‚¡ÿpLCÖãf´Í“þ*¿ù=—•ºb\H ¢åºq‡‘}L”!Ó®a +ºè.¸yCwwh!ì'Ô-!{ÊaÁy0åÞqœÎ: 4®Ñü¡—D3 D°í ¸Ð€î²ÝÐË6a|ãdI¶ óÉSN9Ƌ¹„ªäXïŽQŠ *0&ëà¢k¦9˯ÂlƒîôŽo«7Ý ¸äkùÛê"JU8ªCž”É"e““ê—òOõóùÇ(7¿‰FK™ñ£ϪI¸úJˆâY^׌D±¨¡þÀCñªc'û¥UŸþè•ökô%ŽL\ç¸Ë¢H†ÃëëkäØzš¡°¦ét¸JÁ¤@gÙ$ʋŠÓGIVs᦬‹+öÿðçn +endstream +endobj +2917 0 obj << +/Type /Page +/Contents 2918 0 R +/Resources 2916 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2877 0 R +/Annots [ 2864 0 R 2865 0 R 2882 0 R 2883 0 R 2884 0 R 2885 0 R 2886 0 R 2887 0 R 2888 0 R 2889 0 R 2890 0 R 2891 0 R 2892 0 R 2893 0 R 2894 0 R 2895 0 R 2896 0 R 2897 0 R 2898 0 R 2899 0 R 2900 0 R 2901 0 R 2902 0 R 2903 0 R 2904 0 R 2905 0 R 2906 0 R 2907 0 R 2908 0 R 2909 0 R 2910 0 R 2911 0 R 2915 0 R ] +>> endobj +2864 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 707.055 191.737 717.959] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +2865 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.236 707.055 237.396 717.959] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_b76731fc33f60619d339fd146af90e7f) >> +>> endobj +2882 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 668.389 191.737 679.293] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +2883 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.236 668.389 284.996 679.293] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_ac61a0c0f3a687ef1d79d9014238554c) >> +>> endobj +2884 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 629.724 198.363 640.628] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +2885 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.861 629.724 250.646 640.628] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_319084c6ac93db482a8742a58e2e01f3) >> +>> endobj +2886 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 591.058 198.363 601.962] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +2887 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.861 591.058 298.247 601.962] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_5f1ce9b2af5f6ba550cd9080ff83077c) >> +>> endobj +2888 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 552.392 191.718 563.296] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +2889 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 552.392 288.852 563.296] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_e627d4ce07125a5bf6dbe4c4464bfacf) >> +>> endobj +2890 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 513.726 191.718 524.63] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +2891 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 513.726 303.079 524.63] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_dcd50fc4fa1b8e5533d7af0513d1a833) >> +>> endobj +2892 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 475.061 181.845 485.965] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_818b1050a44c6fb4d635a6fc088eeeca) >> +>> endobj +2893 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 436.395 181.845 447.299] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_84d340c4e2a8a35e81d0fb91ff2c466e) >> +>> endobj +2894 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 397.729 154.727 408.633] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_c72c231542712976d1f9223d0537f5d5) >> +>> endobj +2895 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 359.063 176.864 369.967] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_beb3e0b3cafb96de2ab53e985c574bb7) >> +>> endobj +2896 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 284.504 143.695 295.408] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_b4b097033191e38bbb59add2ebba3e70) >> +>> endobj +2897 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.511 284.504 213.154 295.408] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +2898 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [297.317 284.504 382.706 295.408] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g616fcdc7600a3a11a8a9152e75730899) >> +>> endobj +2899 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 249.823 143.695 260.727] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_cddbfcdd0e7dd70c2258493ef67d0911) >> +>> endobj +2900 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.032 249.823 189.632 260.727] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +2901 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.196 249.823 282.662 260.727] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +2902 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 203.188 143.695 214.092] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_91546e88fe3474f55bc6f0eceffa7251) >> +>> endobj +2903 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.032 203.188 189.632 214.092] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +2904 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [271.939 203.188 347.405 214.092] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +2905 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 168.507 143.695 179.411] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_3f2210364b954a8d532905d09bcb7149) >> +>> endobj +2906 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.032 168.507 248.859 179.411] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +2907 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 133.826 143.695 144.73] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_7fff251a8cd2ecd8b928175af94d7069) >> +>> endobj +2908 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.032 133.826 248.859 144.73] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +2909 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.388 133.826 330.333 144.73] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >> +>> endobj +2910 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 99.146 143.695 110.049] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_7ded037fa4c26b2e12565d3aa2c6b70b) >> +>> endobj +2911 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.032 99.146 247.176 110.049] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +2915 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2919 0 obj << +/D [2917 0 R /XYZ 90 757.935 null] +>> endobj +2920 0 obj << +/D [2917 0 R /XYZ 90 726.054 null] +>> endobj +2921 0 obj << +/D [2917 0 R /XYZ 90 687.388 null] +>> endobj +2922 0 obj << +/D [2917 0 R /XYZ 90 648.723 null] +>> endobj +2923 0 obj << +/D [2917 0 R /XYZ 90 610.057 null] +>> endobj +2924 0 obj << +/D [2917 0 R /XYZ 90 571.391 null] +>> endobj +2925 0 obj << +/D [2917 0 R /XYZ 90 532.725 null] +>> endobj +2926 0 obj << +/D [2917 0 R /XYZ 90 494.06 null] +>> endobj +2927 0 obj << +/D [2917 0 R /XYZ 90 455.394 null] +>> endobj +2928 0 obj << +/D [2917 0 R /XYZ 90 416.728 null] +>> endobj +2929 0 obj << +/D [2917 0 R /XYZ 90 378.062 null] +>> endobj +2916 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R /F98 2120 0 R /F35 2018 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2975 0 obj << +/Length 1810 +/Filter /FlateDecode +>> +stream +xÚíZ]s›F}ׯàɕf¬õî²lÚt&ŽS;vmµÓL’Ñ`´–™J@YÑ¿ï]X@èËQìL›ƒa¹ì=ç܏]¡ÓÖq¯uôÖ6 „Mm£wglp› F‰Ñۄ «Ó%ãöU‡à¶ÝþU‡âv8šÝËAìöÏýÛ؍g/^‡_:Ÿ{ïŽÞ²`‘Ø6b¶ïË þ’©¼”`DËg½?¬P‚Ë1¿®0bŠbÄ둛$.e¸Ýëږãhä¦2¿r-ïdÜ!N[\„9ਥŒ¶ÞôZÿ´˜ÁÉÐ`q“Þ¸õñ36pý‘)cš5á82nZ¿·°FvÕ1CœáÅyŽl°À EÛùô?Qʲé̟Wó‰‡zbק-ãc—+ôr \V.~ {a¤úfÃÓjØ© dì¦aÜ¿™%©7™:&‡ë­\K¯CX{ædÿ,ˆ&i“™Ád<žÁ´Hͯüxô–SÃP@)ŠnŠl‹]ÀD0-Åã‰?hNÝüp Îg'qÇäméÁ ü`˜_Jï5ÛIîYvÞåÇ¡Ò²ò]Í[ù¯þO´ªØÂD'ÈvìBVC=¦2YP/G F÷ænV¸ïRÌv8œ$ˆó´ä¿ƒal›ÁMÂÍíS#P”º~°œOnšˆY%ÐRSÆSHŠÇ¥<(¶È¤Î†”÷¿ˆ"Kl•ù,G´/½Ô†;Ú"˜ Wbm,Au¥|m, ÛZLÊFIÉAè¥k‚‰±í‚Iyºe0A[F±ÐÛÏLà¿«zˆŒ#ÝwDÕ#̦Ï# ž\aÖc{ +Œ*ž§§¸Ò˂0h,ÍÑýᦠ+¿Y%9•¼zÿ¡¿;û»v™+ُ´×‹µsÏëœ[&bŒ„F÷+ÚHöؤÊí̅gáü4öOÊv='<#óCíûRuž“9Œ÷»l –åöwXBOH~<Ô0UoÒ57¯¦Ý,¾Ì]«¯Z³q€eSù%˜o¥qX• µû+Å8õÝÑhÖ¿–ƒ‰'ý«8„“tm9V+È õ¸Á%¢'"”3,?³ +t*†9”J×ÖèŠÝƒA´&³nŽÇ.u0b¦Y-¼{ÉÆ{«ÅQAÓâÞ@Ɨ¾Ÿç邸zè + ±ùvÔ ÚóŠâKP¶çL}°>φQ¾Ëóò+²üª7ᄃc"aiÇ{g 4ŒevÊ—{3å4s* ˜æV-ÎJ.>al6pj!Ïs߽ߴ¦¡&pZVh7hLë B¹3k°¢öòÊžhÍj/>x˜øaÐõ3nêߎ¤pÇüo „¹ZCA¬@ŸØ,"-™‡l·¶,Ñ+èM¦Ùön´J!+ŸÞ³0xîÌÍԍ’º)Cd¶ùNlOýô¾qóo'ºW((rö&Ð-ôIŸ^Ÿsb+[ò™N™B!/ +ñ…ßJÓo'—Âë’"ƒ»:üOÂüø>Ô.7«ï`ԔW/&²hK(úªOÙüLC‘ëÉ~ùäªPÊâ¢(aIúع–é$žCW§°ºá]ސ^™R³ùæ§2ðFa¢j鲀‰ã€òø>$L#\âP¥!“éœÇž‚O÷®C™ò—OOkÎ_mbDÌ2à|+è6Û¿k¢:d,ö^5}­FX]¤³ŸµAzñÔO¤ª/‡‹-YM¾kËPAME]è |„N; ‚óÌ:6±È¶¶ªÝ·a8ZŒŸô3´¿•*UVðªª2'r³LtRRE,§+(šõFµZ9tï%´kQs‹5Æ® rŠ¸I÷Hê$ðUòyPM°ŒùƒßGó›Ð™ÿÎ+¿–Ó0 +GáÐ÷²]U‚åàÓ_Étj¶Ÿ«QËÑÍ;ŸÉm"Ó­[$ˆÁçVÊÀO¼X¦ò)»ÿ–:2óÆc FëßÙN¶ŠØò3 â3 n:úÃ*‹!fÕ6>ô¾âXk·øýDÿ«¿­Êÿù#‘ñOÆÚÚ¡ 7˜?6) µ¢lþ1Œh¾|ëš7²ÐOîÙßFqö[+ƒy>_âpdÎ’¿OÓèÅÑÑt:E^‚ —F1òÓ£(-/Á¬ ñÒÈ]Uã0Öîû\»jXåðÿË5Š +endstream +endobj +2974 0 obj << +/Type /Page +/Contents 2975 0 R +/Resources 2973 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2877 0 R +/Annots [ 2912 0 R 2913 0 R 2914 0 R 2936 0 R 2937 0 R 2938 0 R 2939 0 R 2940 0 R 2941 0 R 2942 0 R 2943 0 R 2944 0 R 2945 0 R 2946 0 R 2947 0 R 2948 0 R 2949 0 R 2950 0 R 2951 0 R 2952 0 R 2953 0 R 2954 0 R 2955 0 R 2956 0 R 2957 0 R 2958 0 R 2959 0 R 2960 0 R 2961 0 R 2962 0 R 2963 0 R 2964 0 R 2965 0 R 2966 0 R 2967 0 R 2968 0 R 2969 0 R 2972 0 R ] +>> endobj +2912 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 708.953 143.695 719.857] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_9de293fc5ed59d0122ccd78839b1a668) >> +>> endobj +2913 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.032 708.953 247.176 719.857] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +2914 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [269.263 708.953 329.207 719.857] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >> +>> endobj +2936 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 674.084 143.695 684.988] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_04732c1c89db2f6d76b3b9479ec2fb99) >> +>> endobj +2937 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.032 674.084 255.485 684.988] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +2938 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 663.125 143.695 674.029] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_ddca3baab772ce17fb5133b0c4e60c33) >> +>> endobj +2939 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.032 663.125 255.485 674.029] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +2940 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.995 663.125 341.94 674.029] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >> +>> endobj +2941 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 640.211 143.695 651.115] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_7e3ffa1dd9894e6418bd153a4cd2de12) >> +>> endobj +2942 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [182.829 640.211 227.989 651.115] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +2943 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [306.685 640.211 382.151 651.115] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +2944 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 581.432 143.695 592.336] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_db355a57fc1949b2ef9627d45be5f9bc) >> +>> endobj +2945 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.809 581.432 248.077 592.336] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +2946 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [310.195 581.432 385.661 592.336] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +2947 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 534.607 143.695 545.511] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_f623edfed6d4816ac5573f42a6a1e801) >> +>> endobj +2948 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.032 534.607 218.962 545.511] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +2949 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [242.155 534.607 317.621 545.511] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +2950 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 499.738 143.695 510.642] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_5c02cdac1cee4eda75e568ef9f550da9) >> +>> endobj +2951 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.032 499.738 191.286 510.642] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +2952 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [214.479 499.738 289.945 510.642] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +2953 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 452.914 143.695 463.817] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_2f516cd923f94296daf57c8ace328af9) >> +>> endobj +2954 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [187.365 452.914 298.786 463.817] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +2955 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [438.53 452.914 513.996 463.817] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +2956 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 406.089 143.695 416.993] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +2957 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.435 406.089 195.241 416.993] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_c8a2f81fc1c5b99600d406300792119f) >> +>> endobj +2958 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [222.578 406.089 241.178 416.993] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +2959 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 369.227 167.466 380.131] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_df00a3a6522cd0b27a52ba3e2ab5c8ab) >> +>> endobj +2960 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.281 369.227 189.881 380.131] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +2961 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 295.812 190.738 306.716] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +2962 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.236 295.812 261.85 306.716] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_286412c3f05e82abdf69c5e5562ff949) >> +>> endobj +2963 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 258.95 190.738 269.854] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +2964 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.236 258.95 262.159 269.854] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_7e1a00f36570e89ee95817d898587743) >> +>> endobj +2965 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [329.225 245.326 390.082 255.231] +/Subtype /Link +/A << /S /GoTo /D (main_Affine_Independence_and_Affine_Dimension) >> +>> endobj +2966 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 222.089 183.824 232.993] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_c86971c152fbb8d2d486d7396ad6b142) >> +>> endobj +2967 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 185.6 192.272 196.131] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_901382835b88fb9969d88eea101ae7cf) >> +>> endobj +2968 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 148.365 241.935 159.269] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_339a341a2f7d60de83e4feb3e8986558) >> +>> endobj +2969 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 111.877 189.901 122.407] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_70638e55ff0529f6f481db703645be05) >> +>> endobj +2972 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +2976 0 obj << +/D [2974 0 R /XYZ 90 757.935 null] +>> endobj +2977 0 obj << +/D [2974 0 R /XYZ 90 423.19 null] +>> endobj +2978 0 obj << +/D [2974 0 R /XYZ 90 386.328 null] +>> endobj +2979 0 obj << +/D [2974 0 R /XYZ 90 310.891 null] +>> endobj +2980 0 obj << +/D [2974 0 R /XYZ 90 276.051 null] +>> endobj +2981 0 obj << +/D [2974 0 R /XYZ 90 239.189 null] +>> endobj +2982 0 obj << +/D [2974 0 R /XYZ 90 202.328 null] +>> endobj +2983 0 obj << +/D [2974 0 R /XYZ 90 165.466 null] +>> endobj +2984 0 obj << +/D [2974 0 R /XYZ 90 128.604 null] +>> endobj +2973 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F35 2018 0 R /F99 2117 0 R /F97 2175 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3038 0 obj << +/Length 1692 +/Filter /FlateDecode +>> +stream +xÚíZËrÛ6Ýë+¸JÉ @‚L§‹d’L“tê:j6IFCKÄ–•¤,»_ß €¤(‰’h™ŽS¶ø888µ™†µw½WÃÞà­mjòljkéæaͱ b”hÉöE'YFŸ`ŒõKƒ`ÝO#tiP¬'áݜORô1¸NýôîåËWÉ­ñmø~𖐚EbۈÙø“VE6œŒhUà×áç+ŠàªÌ/{Œ˜^Yâuèg™Ñ§ ëCã:¡ŸsõäŠOyjWçñy„¹ÐP&ŒöÞ {ÿô˜Á‘Ù`rL¦£Þ—oX›Àó÷F¦çj+Y*Ò,jÂo¨}êýÑÃEfq=à ×ã$²¡†CM„m¦ÂýJ©r_ÖÓ¾ôäü:IÂ⹈']É¢-A6ºN–ñ„O¶ë‹·_1ÃðGT»ÇIœåÅÊßÁ[‡j.Ä%²M‘m­OLäYŽ +ñŠçË4Ί̳Zi#bÚeæótÉU¡M“&`•…‚©ŠÈ'ê"‰Ã;u¯dmÏ«Õ¶äÒÊÅWŒÍ†8,dc· +cdû¨¢(⫟2ÅÍ-jLÕ:eÝÚ'ŒP¨Ö‡äyÄzh¿B_å~g£ ئÏx:Z$p÷Xýì>Û~.sYĒ«ßûY^FU0ƒL¶…õ™à:àùPfý©Áå©lžÎß[_ÿlB€·ÿ:äMÕo ÊàýCàdôi೉Œ øÜøiƒâ"Ó%Û 2,Æd¹ä€ n€(̎®Ëº€(L³¤š°î‡/ +Ʉ™ .àËك¯F< Ä]Âä=zÄ£+³bÄÇ«‰|¤EéÑ*ÈçûXGÏ;¯K87rًqÇP”–òy1ÄSÃtô¢!Å»yN‚xV?ÏWœ7õ<1:^›®wÚ°S…Á +ÝUŒhÌœØ2ךjÜà‚ÊOĖMÙ@aËýÿakÔ"„]#¶fyàªehˁ#šX‘ÒxÖD ¸6µÞZŽ‰h߇@ë*hgžúy’6"ë ,%šb®ˆ«ÈÓ6qوV~fóA˜YGÀÕZsÉÕ@6š¦I4ò¯Ѧñ?AA[øéèÍí"åY¶ àIRîC‘ç§È8´ê¸‹¬a96M ‹éITxýʕÐi¤  Ћ͐Sé Xi'òš‡‰í«3ŸŒ¢/VG€è¹O½`,RÖ7šÄÕ#ÿ6ˆ‚w¨Ð$^ô GÑ' +Uèkò‹M„ŸŠ! ¦ã€ï®-¤Ál¹Å-±6–X,ÂÁFÚ¶ZM`õãTF¦Iq¢6JÒJñÂÃHkÙÉÿZDÁµ +endstream +endobj +3037 0 obj << +/Type /Page +/Contents 3038 0 R +/Resources 3036 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2877 0 R +/Annots [ 2970 0 R 2971 0 R 2993 0 R 2994 0 R 2995 0 R 2996 0 R 2997 0 R 2998 0 R 2999 0 R 3000 0 R 3001 0 R 3002 0 R 3003 0 R 3004 0 R 3005 0 R 3006 0 R 3007 0 R 3008 0 R 3009 0 R 3010 0 R 3011 0 R 3012 0 R 3013 0 R 3014 0 R 3015 0 R 3016 0 R 3017 0 R 3018 0 R 3019 0 R 3020 0 R 3021 0 R 3022 0 R 3023 0 R 3024 0 R 3025 0 R 3026 0 R 3027 0 R 3028 0 R 3029 0 R 3030 0 R 3031 0 R 3032 0 R 3035 0 R ] +>> endobj +2970 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 720.286 193.229 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_bd6b88d6fd6e0259faa544106b08aeaa) >> +>> endobj +2971 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 683.05 238.459 693.954] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_055f3030915a1b7de0cc50761d9a3245) >> +>> endobj +2993 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 646.562 187.689 657.093] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_573ac186b0da77408bcb80531ca0090c) >> +>> endobj +2994 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.505 646.562 226.693 657.093] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +2995 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 611.319 205.692 622.223] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +2996 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.19 611.319 261.312 622.223] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_8e45baf04a16a09cfa25bac864515832) >> +>> endobj +2997 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.65 611.319 332.156 622.223] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +2998 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 576.45 205.692 587.354] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +2999 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.19 576.45 261.312 587.354] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_3c8e578089e8420dc286b27411fde2fd) >> +>> endobj +3000 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.65 576.45 338.781 587.354] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +3001 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 541.581 205.682 552.485] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >> +>> endobj +3002 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.18 541.581 261.302 552.485] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_36e39f75a5b973533a044d606444db4f) >> +>> endobj +3003 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.64 541.581 330.462 552.485] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +3004 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 506.712 228.895 517.616] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_ce7b6bb6c1aabdf57f1643e88a834aac) >> +>> endobj +3005 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.232 506.712 333.482 517.616] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +3006 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 471.843 229.503 482.746] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_bb6e0e38bda55fc988819da21f2689eb) >> +>> endobj +3007 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.84 471.843 334.089 482.746] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +3008 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.98 436.973 187.264 447.877] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_40ab06947d065a171792da1ce6ed2505) >> +>> endobj +3009 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.963 436.973 293.213 447.877] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +3010 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [325.131 436.973 371.148 447.877] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +3011 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.711 436.973 455.727 447.877] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +3012 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.98 379.19 187.264 390.094] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_90cc17398be6745eb507339397381d7a) >> +>> endobj +3013 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.963 379.19 293.213 390.094] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +3014 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [325.131 379.19 371.148 390.094] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +3015 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.711 379.19 455.727 390.094] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +3016 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.235 367.235 220.058 378.139] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +3017 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.717 321.407 186.348 332.311] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_1039be5680ea8eceb903367e1e7aa13f) >> +>> endobj +3018 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.523 321.407 293.772 332.311] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +3019 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.35 321.407 373.367 332.311] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +3020 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [410.82 321.407 456.837 332.311] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +3021 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.717 263.623 186.348 274.527] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_9ffb692c7f3bd8af9b81135e38b38dd7) >> +>> endobj +3022 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.523 263.623 293.772 274.527] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +3023 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.35 263.623 373.367 274.527] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +3024 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [410.82 263.623 456.837 274.527] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +3025 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.581 251.668 218.404 262.572] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +3026 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 206.214 180.496 216.744] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_84a324ad469ad76c235789823cf4e0f4) >> +>> endobj +3027 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.834 206.214 226.434 216.744] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3028 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 170.971 213.153 181.875] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_94dd083371c61a3f54521caed75e2820) >> +>> endobj +3029 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.49 170.971 259.091 181.875] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3030 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 136.102 213.163 147.005] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_2ebf93b52454102cd99eaa211ad6ff71) >> +>> endobj +3031 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.501 136.102 259.101 147.005] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3032 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 101.606 161.677 112.136] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_2f964d43c2798bde1924e82d88971ea2) >> +>> endobj +3035 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3039 0 obj << +/D [3037 0 R /XYZ 90 757.935 null] +>> endobj +3040 0 obj << +/D [3037 0 R /XYZ 90 733.028 null] +>> endobj +3041 0 obj << +/D [3037 0 R /XYZ 90 700.151 null] +>> endobj +3042 0 obj << +/D [3037 0 R /XYZ 90 118.333 null] +>> endobj +3036 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3095 0 obj << +/Length 1565 +/Filter /FlateDecode +>> +stream +xÚíš[oÛ6€ßý+ôÔIÀL“IQÅ0`í–aÝd×—´0d‰q„Ù’*ÉIýïw¨›/‘'QgËK$Ñ yxø /ؘØøuðn<Ûp‘+¨0Ɔ‹ GÄ)1Ɓqn‚˜5$cóÔ"Øô҅79µ(6ãùêR©7ù#œ¦^ºzûö]üÍú2þ0:!d£E"â‚AEƒ?”U¶:%ѦÂoãO-­P¨‚›:?îiÄvëïç^–YCʱ9¶\jªE2÷rU–|T*µˆ4UäC‘K¸„ +Ýèà—ñàë€@3Ø …6¸ƒ›þbpþ”00²]i\µ£6<çÆÙ௮4{Ûó¦æ fˆ8¶!\˜ÃËaœ%ž¯†?‡ ea•âŸ–²gz ؼ +£YYþ§ZL¡¬x?YF~ÿQé ¿ôòª’·ª^â ¼XÕ?Wš©¦°stÂñ¦Œ6bÜR‚\"K ?SÊ·þÅ8r åª`$ ªß´6ÓY¥ÖE-ݟ¤ÌS/ŒòÝvtÏ˜ã¢FwCï;yãC3dë—õjH! ª9£H0b E.§å +‚J^ùðã¤R\|Q—èî-ÂÍZ˜]¾Ñ®k#°«šN¿¬±Õ³ƒm*äñÎÄd«,W‹®N+õci(Š>\w£bc$¡×ª¨i·ÈʐÀ²‘ä2ÌZ¤8i¬ µªvDC* ”V9ýs”õÒä¬Ôy+OY?@5óÛ:—aÔ2;’!Λ)ôÛ&Ìãÿ KŽƒˆk÷í“Råk]¬ü¹:¬½->.O䕧—Á¨c–.‹tãA®©£‘7þ¬'†â–Ù¡.¤<‡LŽsÛälB¯5|eêë2¼òæªþ¾Ý¶NwD!œ ڀâÏÚ¨ÆÈá÷ńQÄØãQ’õ‚I§Ç™õž—V¯rPºü ÀÛ@¦Õ +Dìû2+ *eßiÏn¨º ÎPõ +ÎуӋ·IËH¬&×a~yÄ+°*8ý©Îü¦eV„ƒ$wî¼àJ-Û1+å´àiCjÁXxê=–ûá@8GŽû4í:ê@,:Ó^Œ¸¸OÚûqlH¥ù£"r¬é,í@cºèè-ڝ.¾X„€PÈûÌ;öÑpôikÞÂ÷F4iñÙòE"ÄÊ>½E’Ɖ7³À çê5»87/âtÿB7I-ÆMP˜Þ͟yy³ÏGmÛ$XÇÏJ µ)r`xÌk +²tî‚Qñ÷”F¶#ž%(A=¢´Œ~î¾þdBL/ ½é¼51@íéC¢Ðûx‘,splÛ.ÈÙ;]Á_ÍÃ(HCDüÒ?ìÈ¥kÅmSL1êö±©Ê_Àê¸_J_Æ·,Q~^ '.Ÿ™>ºÔ¯Ô šó˖Õ3HHdؕ—îY=7}rfzYΊ½ä¢Âþ6ZÎ×òÜÔːJ°¦p¹|Ö=g&!?“OløÏ-SÈ&gª=öæñdª&]ª ãàÌé6ÎÄÆ¡›Ùc—÷a1ºmº×-ÛÐÂjÛ¨GUd*·j˂ÒjtQc5Y›Ù82¶Î6õ uE¨ç;NŶ[ÖؚŸ–!Җ6Vì/®ml+ÆmÚØÞ­<©%|ö󬏷zÝt…ˆ«ÒL×+&¥†`d»7.j«Z=h“µªkŸÕ–HŠ>æfk›µ¤Ð‘NA*=5‡ƒ7%Õ©‹Eÿ'KQÐz,„„ÛÔYµ´ÂÑÚ +@”ôºŽZ&‰J'ÓxÇF9Ò²…7‡èT9¢)Œ±Îspu7]×2êƑ0ù(ý/ð“iÓ8žß•ÅIx1QzòÍóó's÷ržÅȼ›WܹÃq@©åmGîB|`¥rÆ5$§ÅÒ*]TÇÓ§õ]Çò³ºðX~À0ýÎâÜÌêûuÑқ[Íø¯tS/ê Ýňê¡!HPÁEž©:Å)GöQ¿ý>(pYË ‰2²×p^æyòv4º¾¾F~†€ì$Ea>J’ùèæ-¾VCë‹Í¢r§÷†ÂE‘L¡]ýÿ ›6 +endstream +endobj +3094 0 obj << +/Type /Page +/Contents 3095 0 R +/Resources 3093 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2877 0 R +/Annots [ 3033 0 R 3034 0 R 3056 0 R 3057 0 R 3058 0 R 3059 0 R 3060 0 R 3061 0 R 3062 0 R 3063 0 R 3064 0 R 3065 0 R 3066 0 R 3067 0 R 3068 0 R 3069 0 R 3070 0 R 3071 0 R 3072 0 R 3073 0 R 3074 0 R 3075 0 R 3076 0 R 3077 0 R 3078 0 R 3079 0 R 3080 0 R 3081 0 R 3082 0 R 3083 0 R 3084 0 R 3085 0 R 3086 0 R 3087 0 R 3088 0 R 3089 0 R 3092 0 R ] +>> endobj +3033 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 671.777 205.752 682.308] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_c5eb33b72a86a33d7ae4685d376b50a6) >> +>> endobj +3034 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.089 671.777 276.595 682.308] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +3056 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 636.534 209.627 647.438] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_acf7b2a7e0bb5007ce8cd9506d06137d) >> +>> endobj +3057 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.964 636.534 314.791 647.438] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +3058 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 601.665 248.202 612.569] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_a366a38561684a64bc0a042702534a07) >> +>> endobj +3059 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.018 601.665 329.845 612.569] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +3060 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 566.796 212.377 577.7] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_b85f80c281c840eedb4f228757b8515a) >> +>> endobj +3061 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [239.714 566.796 289.846 577.7] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +3062 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 531.927 216.252 542.831] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_92ef9a99d160f55e3fc44a4bd1ae78f2) >> +>> endobj +3063 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.59 531.927 328.042 542.831] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +3064 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 497.058 254.827 507.961] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_736577ec65f40b0637f13486e64f051a) >> +>> endobj +3065 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [258.643 497.058 343.096 507.961] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +3066 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 462.562 236.745 473.092] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_e862a635387c2458da51889c20465f0c) >> +>> endobj +3067 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [264.082 462.562 307.588 473.092] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +3068 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 427.319 240.62 438.223] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_6d2f7819b7359865679b24e683231303) >> +>> endobj +3069 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.957 427.319 345.785 438.223] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +3070 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 392.45 243.37 403.354] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_944e2c41213d3ea40e74930a90de97bf) >> +>> endobj +3071 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.708 392.45 320.839 403.354] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +3072 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 357.581 247.246 368.484] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_22f9ceb879f1c8d892f60fb3d9577d81) >> +>> endobj +3073 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.583 357.581 359.035 368.484] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +3074 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 322.711 230.598 333.615] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_685232ed211cce61f5d27727d979df94) >> +>> endobj +3075 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.935 322.711 301.442 333.615] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +3076 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 287.842 234.474 298.746] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_a18b052380a4cbb9db236d690f932eda) >> +>> endobj +3077 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [261.811 287.842 339.638 298.746] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +3078 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 253.346 193.577 263.877] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_87e906459b095e23114ee8f0025086cb) >> +>> endobj +3079 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.393 253.346 232.581 263.877] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +3080 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.059 240.345 248.845 250.25] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +3081 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 207.518 193.577 218.049] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_4b050985a103d89eaa5627c16f4f4257) >> +>> endobj +3082 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [220.915 207.518 277.691 218.049] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +3083 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.892 194.516 252.677 204.422] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +3084 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 161.317 223.465 172.22] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_3daaa36a6bf749e0b4d66ce57878e2d0) >> +>> endobj +3085 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [250.802 161.317 269.402 172.22] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3086 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 126.447 229.552 137.351] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_e70fafb10013762e436a434564d7e931) >> +>> endobj +3087 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.89 126.447 275.49 137.351] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3088 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 91.578 266.673 102.482] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_d9dba7a094763a47be44e246c1120fa7) >> +>> endobj +3089 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.01 91.578 312.61 102.482] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3092 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3096 0 obj << +/D [3094 0 R /XYZ 90 757.935 null] +>> endobj +3093 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3165 0 obj << +/Length 2752 +/Filter /FlateDecode +>> +stream +xÚí[moÛÈþî_¡O©œÖû¾Ü -Ð;\Š^¯@š¸÷%9´LÛD%Q¥(;î¯ïÌrI‰ß±MÍË¢–³3³³Ï33KÒÉÄNþ|õýÍÕõ-&–XÍõäæ~béÄhFg“›»É‡)cDÎæŒR:};ct¦ëpñvÆé4Y½ @_pê+Aaø×pA¨VÞø{ÐÔÍQU+¦ûíTu×n“ýæ.¿šÜç°öH ±$P¦pÀGJ…÷’:$‰¦A1&{Œwù˜Šf\&Y1(„IOå0M(ÜäǼ4H ¥å€x—Ûaä| +—Ùw³¹ bg¹AÅï°hñÃ&òffIƒ™–Æä3Í3ù9ffé>êõWaJ:feûÌqÖÊiË +q7}ŽwQÃdh31JO`¿«l.ï>\ígµ'³BhÏJ\@·EäõE¶Ï\1bJÀ§ô»ÿ#çª"dòa® +žÄwþ7Ü*éƒß3ïÜ(Ôå.¾Ÿq5…½†ûl‘¯m]üH]&›]Ö-ÏãKýîW/p?k´µî2N4˜6gœ£sÿä´òÞk 8@±­`q5; ò`„^(BDÂ¥sˆ„×÷¸¦ä°©.‰ýŠ.-±¯ˆ¶¬k‹+"J£Ï 6f-ÜúhãÝÑv›$«îÈØÅïñýËb¿‹7 ˆ%€z¦¦Ÿ²¯-êT=ê¬n‰:KtÀF‚¹„…Ƃ*ë(ÊæÛ<wQúÞD•÷0¨Á—a'§…›#–qØ>̎eHé‘ç8{ÌÝçµÝFËÌû 6i˜D)b¥ì hc=—Ò %7ì ¡/Š‘­Ttà®É\FZø!6– +¬ˆ!®SLÃv`,®B~Õ£ä8ÙËL©3÷bŸC¶b?ð+a§¡Ã} –M´ˆ×áCt"Kæû¯UÎô—c ÒÍ8¼]Þ“<áa:I@¯šñiÏfÆ9Ž7Q˜.~ü´M#؂§qŒ’_åر=–ýC•F-ãh“-²4Œ³Ýë×nÖÅÜ-d@¤`¬¢ßéiäùÏ£}´IÖñ&̒ô§2“M„^AdŠ. w…há4¡X3º@î©! GÉõ!¹Ç@mõ?*:®Ë#Ճà]‡Ðøçdñ–æ\—Cv©Ç•#ý!ÁÆlÛ¹íÑ+x¿ßø½†—×ávë@¿<…g kàªô0Œl˜œYƒƒó’ÚÌgå8`j”¨âDžS ½+aÑ!¶K§áÂíKƒ¢$¥J#Y8Šò&”…ÌÕ|fâÀ)LdFC+¡kh¸ÐX8ðÀ†ÖKXÛX8g/`á :`¡ìß`¤C†¶¦Cœ‰q²p+Ì ÀBeª€ÅÁÙ~£uâÞو[%†³ÑÍð¸å¼÷èõ<à^.q ¿tâÌ~hÆ´àVy9Æ­ÊÌ ¸%°}£¾áÖX¸´1}ˆ6Q®âGw‹þŒ‹êà +ÖQFˆé»h媄Åû—õmY¼UtI£Õîeý]Þèé+Ã`ò l²:*b(õ¡âÍÖ8mÉք!֌Ԃ,¨¶ `Ò*–Á¥ô’ŠP=¾¾”Eª¥¥9¶PփÓ0 ×}ƒÕĨÛ¹„€—“¬NËX°ÖTzV¥’O3e¦ŠJEëV+\×ß$ Ù¨÷]P)-9Ԟó£QdåìôÚK”G!)UŒDkxáªíi©-”¡ði¡Pc×{ÔP˖=jJXÀË6µkGWæ,eé¼ß=%­Æ€š´´¢œ5”H[+gŸ}‡«Á9Át*Ž©Ì€ÊOZžeu\Y؜JrøÉ«ãÍ2¹ë¤•0³e«$G¨-'ü¸Mp€K°K?R›UkÞÎm¹¬Öâ*À9‡QÑª +PXIFë>*Àñž +N3X¨íɲkÜ}í´Pω%OsÀsÈG.cÈMx…pÎÆD~ ZZӂ¨ÀŽ­MÎ ¨N…P äç›.nÀÜ€?T¹eæc ÌXäU} ’¶`8$ÓèÉtñ„–°súËèÁ‹Ø·;DÁn÷tA@Ä¡góe‰@ #‚Ï-$uPюÕÈ[fß ® Ä°S!‡ô!ZW»:FöÑJ)éÇwªÖô÷êé( }܍“±ç0ÔØ® Œ“)Õv…›´ž±+ے±ë#,M Ÿ°—xY$젅KØÑ+ ; lNØáÎZÂC‡'앎/c ç'-½Ùº.käê´¥AÙéM›üÑ#TIŽ„šu!l: ì^{à7ˆŸ™³(8g¤ÌXIq~fŒ7 D%ù€“$Õˆšé>@D) ¶¤»ΰÿ»¨XOX…¨œÁÖž„ééÅ«­ œ×'­³“¦þØöH…ª+å)„ªb¤óM’ÿÐ}Z1ﬣ }FZ" u`¤êÃHM C1’míyù­•pN+áâ R +™?b8(uÄÑôðöêy˜ h’áM½H†ƒ^­nµ*ÿ<ñ­‡c=º?™÷ëo: Öú؛ëÄMµVœ6E{Ó90lœgÞTPo:‹zÓYø¦³èk: Zl—|t-oæjm­dו~ïê¶4à0Nvx|iÑÔ7&ö``KËXH"4p• º‹:Æ^”À'}mKK º”ù¡åQKà#岁.,1ü¢æŠíì¼f­wV´[ˆyàíOV› úÖÁv¯ƒï§@˜3ŽÐšà'4Ÿ×š9y4¸”É1Ï2‰§-KÇ.:Ê5ît)dÑA#÷àÓàÃO8ÿ¸GHÕúxšRz¤ÇÓh­J€I›[ÛBÊÖaDul­D€Y«%Bî•ü³³Dò@A8ºV”‚‡P( (3„‚Ä…Ð'Á< ÀêÒSK/ËX¸Q "!åÊ=:µl!¡¹œSnB2¯ùÿ˜B€<^‘V.b—’®¾UàEŖ¹Œ +YÚ¸'¶†ÒQp¼"çёlQc¾¸’Åëh»f»ûöÖJË[+±ö«¬|[Å}.“õvŸåOšù‚º×ÕóÜÕM^º²ç(Ú4½W` ƒ•£Y8à)1~ƛ焯@àPj´tÊEÄ6Y%ñ2\-–«d·Oûùì`„bÊ~á`„4fvd®£r4ÙG¢³Ûwûމ¨¿õ‰ Ƃ¡/}:„EՀ‚@ ùk´ +_þð'¥7Ŷyë:y)äù×â%ڙoÓº7ió/ÿØEéïðmoäßÂ;° Wì EEéá¹I@f C\HäÎx{*·ìŸ“â¿¿^9çôÅæ»8¼Yö˜eÛ×××ÏÏÏd¹#ûM¼MIœ]o·«ëZQ±šA¶wxÕè>IsÅÖIZ¾¿×.©®øÿ?qU¶0 +endstream +endobj +3164 0 obj << +/Type /Page +/Contents 3165 0 R +/Resources 3163 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2877 0 R +/Annots [ 3090 0 R 3091 0 R 3114 0 R 3115 0 R 3116 0 R 3117 0 R 3118 0 R 3119 0 R 3120 0 R 3121 0 R 3122 0 R 3123 0 R 3124 0 R 3125 0 R 3126 0 R 3127 0 R 3128 0 R 3129 0 R 3130 0 R 3131 0 R 3132 0 R 3133 0 R 3167 0 R 3134 0 R 3135 0 R 3136 0 R 3137 0 R 3138 0 R 3139 0 R 3140 0 R 3141 0 R 3142 0 R 3143 0 R 3144 0 R 3145 0 R 3146 0 R 3147 0 R 3148 0 R 3168 0 R 3149 0 R 3150 0 R 3151 0 R 3152 0 R 3153 0 R 3169 0 R 3154 0 R 3155 0 R 3156 0 R 3157 0 R 3158 0 R 3162 0 R ] +>> endobj +3090 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 687.211 217.109 698.115] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_161c87c94b78fd1111365e185d0a3ae7) >> +>> endobj +3091 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [244.446 687.211 263.046 698.115] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3114 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 652.694 271.126 663.598] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_fb683aefdda7a1c5dcf92ee2a03daf81) >> +>> endobj +3115 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [298.463 652.694 317.063 663.598] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3116 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [214.863 640.242 326.259 650.147] +/Subtype /Link +/A << /S /GoTo /D (main_Meet_Preserving_Simplification) >> +>> endobj +3117 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.984 607.218 201.742 618.122] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_06c2ce3f0789aba0294da43628b50226) >> +>> endobj +3118 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.442 607.218 243.629 618.122] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +3119 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.079 607.218 371.329 618.122] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +3120 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [223.306 582.81 269.939 592.716] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >> +>> endobj +3121 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.288 549.786 212.768 560.69] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_e1509738a054a1ffeb070a35c41db257) >> +>> endobj +3122 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.771 549.786 252.959 560.69] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +3123 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [297.896 549.786 375.145 560.69] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +3124 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [220.401 525.379 277.928 535.284] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >> +>> endobj +3125 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.443 492.355 250.099 503.259] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_bd266a7d827fb77e09de63dfea2f9d58) >> +>> endobj +3126 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.258 492.355 289.446 503.259] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +3127 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [307.772 492.355 379.512 503.259] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +3128 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [436.747 492.355 513.996 503.259] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +3129 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [344.304 466.738 439.335 478.903] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +3130 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.207 434.923 266.586 445.827] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_17182f3f0d9242d5821ba59b2773ae55) >> +>> endobj +3131 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.509 434.923 309.697 445.827] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +3132 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [336.494 434.923 408.234 445.827] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +3133 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.703 434.923 513.996 445.827] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +3167 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 422.968 171.361 433.872] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +3134 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [381.237 410.516 480.87 421.472] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +3135 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.091 377.492 250.748 388.396] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_ace7b1f85601837554656295b9c90dce) >> +>> endobj +3136 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [280.068 377.492 357.317 388.396] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +3137 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [384.405 377.492 456.145 388.396] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +3138 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 365.537 202.344 376.441] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +3139 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [350.005 353.085 446.071 364.041] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +3140 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.017 320.061 265.396 330.964] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_e8b96392adb007f1c59758cba8cbc886) >> +>> endobj +3141 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [298.568 320.061 375.818 330.964] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +3142 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [407.239 320.061 478.979 330.964] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +3143 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.616 308.105 225.866 319.009] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +3144 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.222 295.653 466.67 306.609] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +3145 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.933 262.629 239.984 273.533] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_fd20bc6142cb1206b51b0b449ebf4273) >> +>> endobj +3146 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [245.633 262.629 280.82 273.533] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +3147 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.855 262.629 405.104 273.533] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +3148 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.703 262.629 513.996 273.533] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +3168 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 250.674 171.361 261.578] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +3149 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [347.257 237.013 432.092 250.171] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +3150 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.436 203.995 251.209 214.899] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_3d107d8f8a78a3925031545c8e1d1a73) >> +>> endobj +3151 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.361 203.995 290.549 214.899] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +3152 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.719 203.995 409.969 214.899] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +3153 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.703 203.995 513.996 214.899] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +3169 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 192.04 171.361 202.944] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +3154 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.114 178.378 456.992 191.536] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +3155 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 145.36 224.57 156.264] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_6d5097ef9a821f98cb97571eb52a49aa) >> +>> endobj +3156 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.908 145.36 270.508 156.264] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3157 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.542 132.908 347.869 142.813] +/Subtype /Link +/A << /S /GoTo /D (main_Time_Elapse_Operator) >> +>> endobj +3158 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 110.843 255.564 121.747] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_96038eb89649898faa9a4355206b72d3) >> +>> endobj +3162 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3166 0 obj << +/D [3164 0 R /XYZ 90 757.935 null] +>> endobj +3170 0 obj << +/D [3164 0 R /XYZ 90 127.768 null] +>> endobj +3163 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R /F50 339 0 R /F97 2175 0 R /F38 342 0 R /F98 2120 0 R /F34 2406 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3220 0 obj << +/Length 2107 +/Filter /FlateDecode +>> +stream +xÚíZYsã¸~ׯàӆªÁHð˜JRµëS»ÉTMÆξÌl©h²¸+!)kôïÓ8x +’e[“¸*y°Å£Ùh ¿þº$¶,lýuöÃÝìêÆs¬…õ¬»•bË÷b”Xw‰õÙ&¹óÁÛçÛQ•EˏsŠíb³_󤊖O﫨ڿÿCñuþëÝÏW7„ 4ÏCÌsa<©ðJd4(Áˆv?ÝýbÐBAw2>¢Ä [‰ëMT×óeؾ›‡ÔæY¹‰®®|â+^ÍI`ó<†K!aL4Jg¹›ýkF@ ¶ˆ\ æ#ßaVœÍ>ÿŠ­®ÿla䄁µ“R™åR~7Öíì3¬WW˜á¡ÄG<áSa)s¿PÊäðísÖçƒ5”+&úž°©zÐÆ}’Rb>××¾·Ü¥ ÏÓüa Oò©6!÷3yݜV§ý8}ú»ýÜcö;µ„Û\ Âå:t¥0AX1í‰/;Jj´ . +ÒÊ4åŸ0GFö¿W7>µx@.(->³„¢iœ~/'­=ÞjÀ0<ç(ðô2.òpеNk%3ÜÒ iLUsÇ·y½Ý4ê¼X©ß¸ÈÊm~Ѧü“¾\´¾4¹áž7;Îsà I ¿’‹Í1ʃv2{ƒ†œn dtmïâ6 &.øš GbD>å0OÈõú‰µ/Í4örO× '|4Ò„ÕC¥Ù—<2íæŸ^EMQô20€†ŠÏ+¤`#L X5d:ôßlˆwSՊ1­êÆx¸¶97|‰‹ˆïü?xÿ׃÷Y îÍä6†ÈÅä›å6仺zín;ö‰tŒ˜Ø@,À~κY4¥õy®£ybtø Áƒ¯õœãڛ4Kž,¥Å|N˜ýµ©¢²nN‹ü˜?áÁsü b&ÂåޟN`Ÿ¡æZˆTQš7ËÛ} Éè4®¥FÿBT1ü¥Q"RÍ TÍYYÍ]f¢FäÇõ¿9pyÈoâ†à·VàèºIh\xÜ&¼×¹nº@bE—ê¶|ü~¯~£M]¨#ž¯ +iM,YU<Õ¬‹š«»ÒSjp…žEš́&%ô»”›ˆpÑ +AÿK¶¬i–Ô²¨“Ì®E’¯*ªÞk©Í¦gyPÊ8) \î`äçp¹ÿ—‹Vìe4L| *xXÑ°±>#ªª˜S¤üM ùÜhh9k]Aá2×\P¸1B.‘mÙ¨Xƒ#ÎeŽŒ¸Áu($þÅ-#¾C=‚L ¼ëúãDüp¼Ìý+5ʔoãKØ°)j}ý~BRrŽèáÀðYt$#·,7i,oקc§‡ÖhKa(“P~2×SÃàÙ=ׅïÍ6¥ú–!ZjùiöøP$éj?!ӌC,9¬6»û¿‹c›Ç]}[F1?ì}u‰±~ÉP’dY‹Q—Ikl½„Zr)fŸ‹÷£:íNËRôS¦ç³W|’ÔøR ÍF‡ñÌ^±Ól. ”Zó~Þ:ä:1Ȩ'.+6mÚ>“~ÅDh¤_®®8­3Œ\Ç¿dq}ÔÕeUü |;Î&ÿ1g¸®skƒ¤àZ8/š2´÷›§0ð8ˆñ7ƒH!@š<‡¿·–Þ5n9WÕ£çؑøq•äy=º^óFË’.4ÛrõŒ˜CÚèUÕ ³ ÈwBjGm!î‹Švƒð9ÔE¾ßesYrÊQe?±ZeqG¹ž=ד¼o í Ê«{EŠ’E{/‹¥„®áÝÀªr=iSÞCúÈs-iQaÜ©r˜A­ây—(‡G[»´Y?eÈhæ  ã²»ê)Ï£— Ċg… „Gñpô+¢ + B ÿI£{€Õò–Iþ»¦XÞóå،ä5iú“T¥;TssU—¬yu¶[^“.!iˆ†«å¢NèÖ^ÍȜëbZãvO»R•ÌôÞ]ëãuôÈ'ÊMi<`@ª^Ÿ¦Ó6D,„]øâJ?¯àÞÞk†²¹©š4Ú,Û&Ã0F‡ÁéW €é‹Þ9dQùLÒ9n»"”rç¯yS؍Ê)l§P=è§Ë,E>q¬“[¿Ã_´ åäʔjzJv5ðÏ`iìWÐÕE҇Úm-E%?ñâó)j”0L? +‚Šª¹+ +‰“f}ãæàZ±Ĥ±G¡x²Gè*Œ¸(S~ U$%ã†`¥9±,ò¸ ob|Šü~æ1ª F‘þۆgË dÕwAd­ Ûý¯•#bpž¼{†Æx}M½$ÊDã_ŸŒº«® À!”{‡Ó4%<ùa',w *0¡ó4¨ÜӘšî‡Q ?€„é:ˆ0GwcbÇ?ÖÜ¿½ß´Ç捲S›X´²¢Â§>Œ©Õ /eš9ïë¹lù,ìˆ÷5. +]·ÍcͶʧÀÁÓl›=E/ƒ7/j¾eÛ¨ +²<ٜ±ç0ý&Ê $“œùITû ”e ¸W}d-!cz1îÖãª'ÓíÜÇö3uª¿3S'ÿ¬yõñ¶³n7\óm›…sT^õ‹†‘ø@L½]8PþÞòjf¿[íÑßf2šz{ ÔYîvŽÖMS¾¿ºÚív(®Ñ6OË +¥ÍUYn®á=Ðð;%«¶ ɊŠ·ä3¹_=ö¬ÿ¿~™¸ +endstream +endobj +3219 0 obj << +/Type /Page +/Contents 3220 0 R +/Resources 3218 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3226 0 R +/Annots [ 3159 0 R 3160 0 R 3161 0 R 3182 0 R 3183 0 R 3184 0 R 3185 0 R 3186 0 R 3187 0 R 3188 0 R 3189 0 R 3190 0 R 3191 0 R 3192 0 R 3193 0 R 3223 0 R 3194 0 R 3195 0 R 3196 0 R 3197 0 R 3198 0 R 3199 0 R 3200 0 R 3201 0 R 3202 0 R 3203 0 R 3204 0 R 3205 0 R 3206 0 R 3207 0 R 3208 0 R 3209 0 R 3210 0 R 3211 0 R 3212 0 R 3213 0 R 3214 0 R 3217 0 R ] +>> endobj +3159 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 719.912 242.294 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_6df8193213c66dcf70814c097d7b2fcb) >> +>> endobj +3160 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [269.632 719.912 288.232 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3161 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.542 707.284 363.328 717.189] +/Subtype /Link +/A << /S /GoTo /D (main_CC76_extrapolation) >> +>> endobj +3182 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 673.088 242.294 683.992] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_fb9fe84fabd3625d37c47e517034d88b) >> +>> endobj +3183 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [269.632 673.088 288.232 683.992] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3184 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.542 660.46 363.328 670.365] +/Subtype /Link +/A << /S /GoTo /D (main_CC76_extrapolation) >> +>> endobj +3185 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 638.219 214.06 649.123] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_6919ec5aef8459ad9c65bc36e8100d58) >> +>> endobj +3186 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.398 638.219 259.998 649.123] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3187 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.942 601.357 290.693 612.261] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_f5edabe0fbfa14196208041ded356c65) >> +>> endobj +3188 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [317.714 601.357 336.314 612.261] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3189 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [376.957 601.357 454.784 612.261] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +3190 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.622 576.773 310.533 586.679] +/Subtype /Link +/A << /S /GoTo /D (main_CC76_extrapolation) >> +>> endobj +3191 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 543.574 245.911 554.477] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_e1186868176c9fb31d7293bc2fe55e52) >> +>> endobj +3192 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [273.248 543.574 291.848 554.477] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3193 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [488.091 530.945 513.996 540.851] +/Subtype /Link +/A << /S /GoTo /D (main_CC76_extrapolation) >> +>> endobj +3223 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.268 519.986 189.266 529.892] +/Subtype /Link +/A << /S /GoTo /D (main_CC76_extrapolation) >> +>> endobj +3194 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 459.199 289.866 470.103] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_ba476c1ff2b0f1cd58f6e76b981cafac) >> +>> endobj +3195 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [293.681 459.199 359.324 470.103] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +3196 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 424.33 290.971 435.234] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_4aa52c6b939cf0076740afb33dd454e5) >> +>> endobj +3197 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.787 424.33 360.43 435.234] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +3198 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 389.461 224.003 400.365] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_070e05c80af78d7c91bee958b9848080) >> +>> endobj +3199 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.34 389.461 269.94 400.365] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3200 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 343.633 254.15 354.537] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_8ed22a325737be112cad6864b2a7ef59) >> +>> endobj +3201 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.487 343.633 338.263 354.537] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +3202 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 308.764 284.585 319.668] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_929caef76be87459ac964105f4c75cf4) >> +>> endobj +3203 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.401 308.764 354.044 319.668] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +3204 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 261.939 241.726 272.843] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_597f9740fbc8534391d2c8cb6381660c) >> +>> endobj +3205 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [349.617 249.311 407.658 259.216] +/Subtype /Link +/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >> +>> endobj +3206 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 227.07 249.318 237.974] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_0cb0abcc152d2d7c95a116efd3ea989a) >> +>> endobj +3207 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.134 227.07 288.321 237.974] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +3208 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [305.875 227.07 371.519 237.974] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +3209 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 192.201 240.62 203.105] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_d4d12fdbf775bc0ad0bb248bbaa19370) >> +>> endobj +3210 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.958 192.201 324.734 203.105] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +3211 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [390.537 192.201 425.724 203.105] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +3212 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 113.431 203.075 124.335] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +3213 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.573 113.431 296.324 124.335] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_4e6787c98290a49ce80b90c008aac5a8) >> +>> endobj +3214 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [293.198 98.81 309.133 108.715] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3217 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3221 0 obj << +/D [3219 0 R /XYZ 90 757.935 null] +>> endobj +3222 0 obj << +/D [3219 0 R /XYZ 90 655.319 null] +>> endobj +3224 0 obj << +/D [3219 0 R /XYZ 90 132.405 null] +>> endobj +3225 0 obj << +/D [3219 0 R /XYZ 90 132.405 null] +>> endobj +3218 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F23 340 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R /F35 2018 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3280 0 obj << +/Length 1620 +/Filter /FlateDecode +>> +stream +xÚíšÝs›FÀßõWÐfªó}'éCÒ¸Ó´M]GíK’Ñél3 ª­ÿ¾{p K 5Ž#'~È¡ÕÞîÞîïv1عt°óKïù w|ê3G!åSß\8 +;O ÄŒ·.!ˆ{}‚1vÏ<‚Ý0‹Ãá™G±›NæWzœ…ÃߣY˜ÍONž§7ÞûÁ«ãSB–4ßGÂç°^©ði%²²(Áˆ6¿þÙ …‚nd~Ú¢„©ZâÅ$Ìs¯Ovž¢®Ž§“°Ð՝s}¡3HW'#¸¥ˆà¨2J{/½O=j°CÊhˆL8£¸÷ö=vÆpÿ•ƒSÒ¹.¥b‡SÿOœ7½¿zØF/GXà;}ętÊöEeî;JE¹|ý;çm_@Ìó",¢Qeõ‡4Xc[vi¥µ€Q{[ ÈW ó-J°*ɺŽíEƺ†ÔÍn…I癿ZšçÚŽÖûÓY2*¢´ŽîÊ&bØŽW¶6¡†^§…¾ ]Ó(Ìô\b€ã·ÂV½º• $Ô¶s²´/@*ÀÄØ'÷›L-êC¿ô’b!GĹ¼ô hZdÐhšOuÒĺ©€•\"*Ú + /)¢RÀ¤„uhwŠýð%)†ÁøàÞ!pÇ£]öó¯Ç0‚p<2Ì0,yâ1@Äþ(ÛÖ×!U²½±{è È‹ñÉI +ͯãJûÑnÜؐèŠ#Ÿ-ªýikK†/:ƒ› –äwVÈ|¦‚Ü{?I·{5s…¨¿VÍΊéÌ&µ }9£˜ðƒGîgÌ)‡”ÏO‚sÕµÝñ]^ Ä;2žPìs4rL]˜¹Šh%:̆ãf63qÁÜyĽL֏Kó “¿[uº/®ôè£yÊ¡ÇÃ׳²KiIUŠb ¿6¦*ôZ‹d®Âã»/o +˜†š…†gé$ª&ÈMéL} ­ßšÏf©&3—[dVj-Ê> + JWCßU¤` îå´=ô‘gÆÌ=_À¦´Z~žÎ`|O.‡?GÙ¦~oe;sŠÀÎÁäN½HcàT=ñ7ǯøëròšæ2µ×„ ´÷Pbåò֖ªäì±­‹k­“ m%:xõś X“O{×Ô2~xÄÀ °yvÙÂÜÿ e"($‡j§²„ fÄG,e,ûw…eCýøV¬I_vø´¤¥ä2㲋ˌÊN.«eNܛ]\6εqÙx\¶{k¤e˨rŠxŠ7|#ËoÈú7 ¶ÝÇ`ãZGdÄé®øèéáÿ€á@í6#®ž&ÑX‡É*Õ7 „ïé +0oE˜‹ÛH‚}‘ ÖNô••H‡•º‘NÖOÓÇNû{봛*ڏ£¦_#Bvq”|EŽb†¸:Ìç­‹~¤íÒöàh¿Óü¬WÖ?6Ïß ÏÉÞ}±üFúb'R æN† F˜&Q1ï„5Èß-¬!PØï€5Œ8·`-0ßÖRtÀzi¥Öf¥.XK$åÁ>„~à±¾‡Æxý­IDä®/MÖ/IúP«@«ê5Tó0¨~?ePÃö¬ü³Z‡öcýjõѾ‰Z}ø;×ÙO7ožaÌÂÉâÙÆ¿F•Îò(µäÆÈ˸†àP|£µu²òì£S_ýÖ+9¼°—Hhd§âUQLOŽ¯¯¯Ñ(G³$šf(*Ž§ÓÉñmz.iã&h”\ÔO_â4k^탛qhޘAëñÿºmn* +endstream +endobj +3279 0 obj << +/Type /Page +/Contents 3280 0 R +/Resources 3278 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3226 0 R +/Annots [ 3215 0 R 3216 0 R 3239 0 R 3240 0 R 3241 0 R 3242 0 R 3243 0 R 3244 0 R 3245 0 R 3246 0 R 3247 0 R 3248 0 R 3249 0 R 3250 0 R 3251 0 R 3252 0 R 3253 0 R 3254 0 R 3255 0 R 3256 0 R 3257 0 R 3258 0 R 3259 0 R 3260 0 R 3261 0 R 3262 0 R 3263 0 R 3264 0 R 3265 0 R 3266 0 R 3267 0 R 3268 0 R 3269 0 R 3270 0 R 3271 0 R 3277 0 R ] +>> endobj +3215 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.636 719.912 287.856 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_5659d55fb93c1fe31b82a674e2630c13) >> +>> endobj +3216 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.636 681.058 294.481 691.962] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_1d20ad17015746b2d9e0290631fc175b) >> +>> endobj +3239 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 600.295 180.54 611.199] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_5b6323dfa423ea57b8d845237d9b576d) >> +>> endobj +3240 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.877 600.295 226.477 611.199] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3241 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [305.287 600.295 323.887 611.199] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3242 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 480.299 178.239 491.203] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_025c54a0d06e882346b74c0624ee6e71) >> +>> endobj +3243 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [205.576 480.299 224.176 491.203] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3244 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [302.985 480.299 321.586 491.203] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3245 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.349 429.49 226.034 440.394] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_1915597423b1aa0dbed55312b2308efd) >> +>> endobj +3246 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.176 429.49 339.776 440.394] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3247 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.625 378.68 245.522 389.584] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_8653fd3779f7a28930872b1f885f25ee) >> +>> endobj +3248 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [250.848 378.68 325.229 389.584] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3249 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 366.725 132.511 377.629] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3250 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [211.32 366.725 229.92 377.629] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3251 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [284.561 366.725 344.117 377.629] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3252 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.625 315.916 245.522 326.82] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_6592baa6045a08fe1eb0ba33e8ed2942) >> +>> endobj +3253 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [250.848 315.916 325.229 326.82] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3254 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 303.96 132.511 314.864] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3255 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.42 303.96 234.02 314.864] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3256 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [291.979 303.96 351.535 314.864] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3257 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.92 241.196 243.605 252.1] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_2d20e2dc8d4d0fbbdf87bd01a51dc01e) >> +>> endobj +3258 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [249.226 241.196 323.607 252.1] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3259 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 229.241 132.511 240.145] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3260 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [211.32 229.241 229.92 240.145] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3261 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [284.561 229.241 344.117 240.145] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3262 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.92 178.431 243.605 189.335] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_438eaa92ba7d9f7d8ec085fe9b00ec0b) >> +>> endobj +3263 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [249.226 178.431 323.607 189.335] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3264 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 166.476 132.511 177.38] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3265 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.42 166.476 234.02 177.38] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3266 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [291.979 166.476 351.535 177.38] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3267 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [136.138 103.711 242.189 114.615] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_852ebcee0de832c12a87ad15d37570a2) >> +>> endobj +3268 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [248.028 103.711 322.409 114.615] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3269 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 91.756 132.511 102.66] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3270 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [211.32 91.756 229.92 102.66] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3271 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [284.561 91.756 344.117 102.66] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3277 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3281 0 obj << +/D [3279 0 R /XYZ 90 757.935 null] +>> endobj +3282 0 obj << +/D [3279 0 R /XYZ 90 733.028 null] +>> endobj +3283 0 obj << +/D [3279 0 R /XYZ 90 700.151 null] +>> endobj +3284 0 obj << +/D [3279 0 R /XYZ 90 619.269 null] +>> endobj +3285 0 obj << +/D [3279 0 R /XYZ 90 538.507 null] +>> endobj +3278 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F35 2018 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3301 0 obj << +/Length 2413 +/Filter /FlateDecode +>> +stream +xÚÕYmsܶþ®_ÁOîÝL N›[–3Nǵ•L3²ç†ºƒ$Ö<’!y‘îßwA$A‘'MZ§ÓOä‘ËöÙÝgwq8¸ pðýÉˋ“ÓׂIAEpqHD‚ NIp± .„ p¹"ãÅû%Á‹¤Ú%ë÷KŠEv¸UÛ*Y¿M¯ª¤:<þ²¸_~¾øáô5!DÄEëµ +ÿjD¼E F´xsñ˄ +"¸“ùnF “Nâ,Kêz¹¢/.–’.Ԯ̒F™'Ôµª–$^¨|$áñ‚P¬•žœ_œüvB@ H‹PÄx°Ù\~ÆÁžÿ`ÄdܵR» ¤ ®Yðñä'Ø";¾¶HG4ˆa¿†Þ/•ÇAD‚Û]»rß(»ñæV;a­þ;NÃÜÙùÖH°8àHFQ‹„@4"Á +#)…õ¢‘ò×LJ §—Ú¦u“´ˆèÕ¯Ts§Tn‘æƒ/C'n÷º#$h'äÛ %„#!;™Ã„ŽÀ*ûµ¾™÷ô5ǃHX‘˜¢‹`ØJȟ(垒ö£@ÃD£PtÑÓ¸p1àòPÆ£hö4A¸ÇQ§éPª<Ù)ŠÖ¡h~}cÝ<‰!·Žtùám‹pŠB"G 2†E ‡pCä6䮊"³¸èˆ¯nlèøþ$¸\…œ-²uš˜æisX»YCz¥7¹‡¨•ÿ„9žÕ¸8»U›/šIÔvýn¿»‚Dô½2J{@<ùîAÞSDs>Žãpq~ߨ|Û-´~_défI¸ 7Ÿ§À³qxA©gÕ2l}¤—ÚyÝÌY½bj”§åÙ=ÄÂø¸A—+FãÇ àq)ÿtKÁÁ+ó;ã>û|›æ7ëWi5amÙ6u¾ÕÒ}Ö2*Ϛ]‰'ÞÄí2~ÚÁíÈvküoéV‹SH2Émc¶‰(‘ ÙWªѓªEôZ-FýŠH‰Ht2D€»~Ûñ¼RM’fjkL|¥êM•–MZ´f‚Î ʘ¨^ ³áˆ뀠Çè‹Ê ß{*¡G‹püX?Ô5L›¾úÃmt…1ýmœ_¥ŽQ$™î ³÷¼hìÚ¨ºNª4;˜›¬¨ÕÖÌ´.VE•ª¼q¾»]闪ªÔ‚ö&Sȹèèãn•YÖ R<à»öq´(®þZ—­H¥ÊJÕ°pm~ë¤l…ê%Yì’úÖü*«b»wß×SpÇPÛû†$Ÿ@ +bŸuþ0Ȁ6XË c^êäjoÊÊ÷•‹}~¿Ð¤è$SÀ®ú}Iù"ÉjKbR ‰GE¬3Ø!}ebP±1&Z/é0té=,¬!¢”=ˆŸç£¡ÁÖÕw·ªšL9‚bBŽÃö9™H´½©ËÄQÛ6Ý©¼ÖYïÙ҉^÷È"}gÈ"T–Q^ä[ lº"]°“ J4'må­t›’À‹‰GÀ¤B·[à‚}3±ékðƒunª};M ƒ¡ûˆkó‘J_}‹ú7ɦ®j°õvÛíïÁÞVŒ‘Á’N£N‘ÄJyv0@R îcÌ5ð‚æ^ë©Äú)ÕÙ<ï³É<¿0¥r&Óáó©L×Z‹Ø6³ÐXw0P#vI権ޗeQ5õ”'CvÅù¹¿äJ7¤:DA 4RáÌ[ãPªšdßYq“n´{[€r›‘i®ÝÕZå–={7Õ#ÙÞAõ·þ2Bظƒpv.+†2³ªñ|»~e¿š†nÌ-Ý"7Ö'íL³ßõ†Îð ¡|öÈ?…oFp@K/‘ˆ"‹ŠøOPqˆÿïQ‰‹ž +ó-ÀBÏÛá(R_)èbt“ ‹ +°¡¥Oiw vª¹-ڊ-èb_w‚‰‘RIû}e®Ö²ú+Ñr¸èšéÁ&F°I›Àý†úìnƒ}À$®1Qþ§3¤ÈíÍVé$ú]ã­²¢ÔN²eìÉÒ¶»Î;]*Ìׂ3}là>ò­7ñ?ê‚aEF¡êòÁ@Aí@qÖ5t~.*žu£…÷øU±ió5™6ŒÖnP92{DPš}lö³‡”s³G$~ì,6ê©óN æ3=2qDŒ=:r)ŽíÖÀ즵^çe×H¬W–ë t„”úa¥Q³Ã7÷—ŽxߢïwëN]=µŠâþ¬ëo Ý\?à z¬-2o§Ø•« +Âc}ž©¶ <ܪ„v¸Óü%í†p62GÐ'ïïçwo~9ÿðñ|BS¡¸ùÝÈx( C¡Ë4ÏÒ\MlR÷e–nÒæóÔIeý6üå>Ͷ~ï¸ÏӞD*Çå.!¥šC×áÏôþu©6©>uÅx¶=†0ðºt +—Ý6a ¬ëç3§žÿ ÍXêaÎænîÄ<âFÅî ÕY—›óYÏôÂiH œ=— ª è©ô£ êÛÑö<ãVv+›\{ábtÎ$Êå5|ìüTwsc_É»ˆNl*4n׿îDÌ^5çAð5SÅbb}‚W syäN¿"¹3&æÉ]’ãäN–ñŸ@îÞ:3ä2=%}÷Øɚ%wm½&wsÆÝþœÞ%02ÆìØ&W!Ä$å£S‘ÿΘÏ&xZW<9:õ©…ýAŠ­ú 8S÷úÿ›³¾÷÷ôÆŲ?.ì>˜ZA»†O./Þýº>ûéÇ÷oÏÿùæâ× }1C"O)tT ¦Ù†)‰ß ÿTÁ$áèf®RGíaµôcœ/ü&:±¡¥íðS—þ‡+w’”ÞäE¥¶>÷ÿ\1$[üÔÿ–ÛÿÁXEžÅößzý/ oõ}{zIiº¬4?mjš?Ãhðm¼Ý÷I¾w³©ÎDžÝ@ƒ‘ŽRí&¤[m¼ø¨ÜØ`,û¸»¿Ÿ´^ì÷«O5îÜxÛ4åóÓÓ»»;´©oY¡´9-Ëìô!µ´¨ï’kGÏ»¢ê¦lx8˜‹†øÿkïI† +endstream +endobj +3300 0 obj << +/Type /Page +/Contents 3301 0 R +/Resources 3299 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3226 0 R +/Annots [ 3272 0 R 3273 0 R 3274 0 R 3275 0 R 3276 0 R 3294 0 R 3295 0 R 3296 0 R 3297 0 R 3298 0 R ] +>> endobj +3272 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [136.138 684.047 242.189 694.951] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_4b5e1306956d46f1ee477428b451b44b) >> +>> endobj +3273 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [248.028 684.047 322.409 694.951] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3274 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 672.092 132.511 682.996] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3275 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.42 672.092 234.02 682.996] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3276 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [291.979 672.092 351.535 682.996] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3294 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [99.148 535.716 117.749 546.62] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3295 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.986 476.677 125.586 487.461] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3296 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.17 355.938 213.77 366.842] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3297 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.732 343.983 218.288 354.887] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +3298 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3302 0 obj << +/D [3300 0 R /XYZ 90 757.935 null] +>> endobj +3303 0 obj << +/D [3300 0 R /XYZ 90 622.816 null] +>> endobj +3304 0 obj << +/D [3300 0 R /XYZ 90 572.096 null] +>> endobj +3305 0 obj << +/D [3300 0 R /XYZ 90 330.409 null] +>> endobj +2930 0 obj << +/D [3300 0 R /XYZ 90 308.097 null] +>> endobj +3306 0 obj << +/D [3300 0 R /XYZ 90 308.097 null] +>> endobj +2931 0 obj << +/D [3300 0 R /XYZ 90 189.252 null] +>> endobj +3307 0 obj << +/D [3300 0 R /XYZ 90 174.681 null] +>> endobj +2932 0 obj << +/D [3300 0 R /XYZ 240.245 112.01 null] +>> endobj +3299 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F72 471 0 R /F98 2120 0 R /F38 342 0 R /F65 376 0 R /F50 339 0 R /F35 2018 0 R /F95 1788 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3314 0 obj << +/Length 1662 +/Filter /FlateDecode +>> +stream +xÚíY[oÛ6~÷¯ÐÓf3ËH‰Æ6 -Ú¢]»f­7¬H‹@‘i[˜-i’ÜÄÿ~‡"usäKRdíCž,Ñäáwnßá¡°³p°órðt:8{!˜#‘T8Ó¹#±ã ‚8%Îtæ\ AîhL0ÆÃóÁà [—ç#Š‡Éj»T³,¸|]eA¶Lž&7£ÏÓ×g/iI$B .\دø³™Òٔ`Dë ¯¦õH¡0×s~Ý#„ÉjƳUç£1åx8I:Tëtʌ¼Ws•ˆ?TqC’pH(ÑBϧƒÄ`‡”ÖàòwÂõàâ3vf0þÚÁˆIß¹.g­—2ø]9 ðAËR†°àeEÌZ·¨ÞÖݓÈ%ô¢[«^lSkPLør9=ŠäakºH4{Ç<„=rOpÊ.û!ÌóÄé ÷ÅçX¯tÆ ê°ƒá%·N8»à{ŒÅ‘Ð%Ò;»DÐCŠtLdÀŒ©+†Ÿ0Çaç…yíééÔ §ƒœf-Y?˜’wgxn=cÛ#ÃEn“ï?Æ®dÃg „˜º‰Ší¥ÉÝۂ}<¿^Ö úv€©´¶É/vFG"´ùä÷u˜H†U'Lž½{{þæù߯¦{öâyMœ‚ËHÏv ͧuš\Dñ*Š¨. õÕMºŠÂ¨ølÖqÜZ7ö€ŒÁÞcâ!F+—?ÝD«™e·Àüè(QٗåàˆôϗáC½…þ{“^›ì˜ÙUiš%7Ñæ&±Jæ}°ÁžGwœÙAȑôjC"cD"eѵ5ât©*¬Ús^é=¨äãÅf­âŒDVÁh'™š¡Ëcpx è·Í¨î2ªr÷0*GÄ=œ9yÄ;ÆVǪ)“@&ÞÁlï쳇’8‡¹µ’´ö %™têΠ²@á¬É鼉¨”§¤½Gz¨!çÝHíɯ«’’áaž%V¢Šç¼¥#dQÆy\ˆÙðl¥vš5èNbùŒ².ԉUƒŒb ø¨Èw¦AhgdZ~$ùá è7µ}?JÑAYŸvü˜]ð€§.ä +íädW¡²|ÒÐê\ÛaNÛØZ º ¢µ±Ÿ€ÆÂmœÏ¥Ók;m2‚ƒßqc9µX…™dÊ ÅIa7×GÆlaώï_œ‹r¬®¨ye–ìDGÛ.°¢YÅ}f‘Î<Õ0{\J6‹eõ\²jÉҐ6‚yݼ\–m—æ#§Ž×"‹®ôð¦P¶JÉ ¤3²œ¡’𓠧eÏïP4¤èoEÑâÁ)h—cÝd…Ûp¥._Åé¦è &kÏ6ëußAŽaäºü>ìßK÷”@3*éÑãTͤ™ +˔ +Aä¢3å¬ïsäcr֗àjðÜ#ë?²þ÷ÆúûÜ©†$ÑP8°·“åû|Æ8´†¢í4½i¹Ê` +]ù6.‚°ˆÂ`µÚVçÚ^s•A/՗>Ųê(’Xí=Ë%º9n'ó&,’,ï-p:E×Ö7Ù©oâ±¾}ã䥊U€ëŽ—7 +5Ý-ú˛ÏÅÃu rVž^’Nì@•ú1Êwµ>¥šUûÛ%—YHð¯!#•¹¹r-x·$ÛÐÓöüԆ_Y›à}¦>aL㒔´€mԅjN؝´3ìÛÚ »Ô¸Zµ³AåÖÔ§µj'¼öÖN0¼\áwcñTëî/¡¢je ®ešç7¡JõíÍݪ§l`åÅl2‰â‘ 5!XE³Ë ³÷/ZBãJꤜ.³Dsíµ=PDó»fç¢GWÔòH³º²¥©ª_õLó›&º–ör³É*ÖÛ}xìü»‡cçï»ù€Ó'¾ªùø +ʗú\/ïNù3äCØû‘óÿ?ÎÿÊ®‰µ¡èš|æ7¯vBëvôÍTBq;D;îmÙ¯ÔîG{½_cÚý+|¨:þ©ß`Ëo¯ ”@ÒUÌ·W.ç»­ó¹N/ͱöµ"Yój™Ö¼ü™«ìÇçC›«oƒxS6vÜPži«²¦¹ÆH‘6}Ҙã>(e•4šýãTO¿ ʘjðêk^Ö|Ó[E:9;»¾¾FaŽ6q”f(*ÎÒtuvە-)ún»2¯|·N2U]À ùtËþÿQ n +endstream +endobj +3313 0 obj << +/Type /Page +/Contents 3314 0 R +/Resources 3312 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3226 0 R +/Annots [ 3309 0 R 3310 0 R 3311 0 R ] +>> endobj +3309 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [313.87 539.432 391.845 568.498] +/Subtype /Link +/A << /S /GoTo /D (main_intervals) >> +>> endobj +3310 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [313.87 397.701 391.845 426.767] +/Subtype /Link +/A << /S /GoTo /D (main_intervals) >> +>> endobj +3311 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3315 0 obj << +/D [3313 0 R /XYZ 90 757.935 null] +>> endobj +3316 0 obj << +/D [3313 0 R /XYZ 90 733.028 null] +>> endobj +2933 0 obj << +/D [3313 0 R /XYZ 240.245 663.906 null] +>> endobj +3317 0 obj << +/D [3313 0 R /XYZ 90 647.451 null] +>> endobj +2934 0 obj << +/D [3313 0 R /XYZ 90 520.018 null] +>> endobj +3318 0 obj << +/D [3313 0 R /XYZ 90 505.719 null] +>> endobj +2935 0 obj << +/D [3313 0 R /XYZ 90 362.95 null] +>> endobj +3319 0 obj << +/D [3313 0 R /XYZ 90 348.651 null] +>> endobj +2985 0 obj << +/D [3313 0 R /XYZ 90 219.938 null] +>> endobj +3320 0 obj << +/D [3313 0 R /XYZ 90 205.639 null] +>> endobj +3312 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3324 0 obj << +/Length 2115 +/Filter /FlateDecode +>> +stream +xÚíZoÛÄ~ŸOáWHdoÿÛ{¤´è ¥U©"ŸãK,;Ø×|{f½ë‰ã䎖èÇ«ØëõìÌìÌó̎ƒ¥ƒoFW³ÑÅ É…”¤Ò™Ý; +;®$HPâÌÎÛ1!ˆO¦c<¾™<ö³µ?¿™P^§I±Û„‰¿£=ÛŸz®@„{ƒ©' ¢ëà|*N0…ˆtq¢³Î HºrHێŒ6¥õ¿bËÐÖï€ÿ·$>ìDž´°’&Ël«ac~ۊOÌ2{yŽÁž²‚eÞgC´v-(@윎 ‚Órå8 ƒ2ÿƒXë{(™sä ö8솄&%ÔÑÅ1ì"Är'º,íàíœÀ‘†!œ!ÏSŽbˆ„ÈåC y<ǐ'Ljs8æ!Šã>Jy +£sû”‚:eÌqÄ=ï1ÇFù=6œp•åNÖáN‚O“§ÇYÙȓºôIlîžh:pÑÈ<®…Ý'*7둾Ò;_µÇëSÌNé&Ì~§H<–ݹGZì·x|õõüvåoúüL0.D@ V»®Ï¹:êZùò¤ŒÞ +‚!ìÕ3îG +µ+‚]ʈ¢ð=€ÖÜt±…+¸_¿Ô/ô¬Áá<%ë´ø¢i PšPºyýòÍ÷¯_]?{9ŸÚZ +‰JµWK½~uóòù/׳7=k +…\W~¬c-”PB¹ÇNµ¦ä¸áãî)¶…MW_ßöéÅRMñUïÜ)â…ÀQž«úË,ƨYY_4e–¾+5e¬Sfõà†ÕŽhõ@·yi³^Â7?Èû$]GšËáx™B©²ZC…#„¨*œƒ•%”"Gí£Ôa_;Æ/»¬¶7W®å6¨à`²Ç±–‚û¨à °ëœtYü“YÁ;—È´ ûÿü±Ä@oƒ¾}@A£‹¿ãü@½²|:ñ5bÀöáCª–àªAvÀ¨É’4(ú)†¸¼}¼„­:ƒ<ˆ)&ÎãÈëæ£J7@åNþ¥Ì þ3¤UÙ¢¸ ¦®¢.S³Ñõ>žAJ–­ž^ûÀTѯÖÿUЏIpP=B‘ÆÄ#Pá2ò7tßô:ôä7V©Ý}ÓÖ·`˜•_ŠòL@PðnÏV›¥÷»jôa$.kê°Íªß*Ñ …mÁƒ‘¥ÍVŸÂHWžÀÈæ¼ñìû7óAô’ÞG@ª Ü1ùµñÆÆlP~㪠„jkº°gÒuö¡æG`Oñ|³0÷Ã0§ÏzŒ«! $û0§Wªð,7K>¬Ò<¬Õñ û;eL”ihU,ÛMzÈÌBÝòÔ dò¢GòMDº-j¦0Ý=4ÎhxF¡³K£º=‰Åøº¿ˆ‘ç᱆ÉÚUQÞêJñ¡XïìƺîÎ2©½”ÔWúBØoåQ\˜qœpQö—š‰²Ý†×LÛ †ƒdJ)xW¹]ü97dë¾ÚþßB$¸‚xçþ+¤ü¬%‘ráÜnþg›(¯þ`óîF•f{[Q€¹µ<`n~ÊÃìÓ P±ÍíW~²­* ÈæSWÖô™1҅©é4IâñmZ#e¿9ÕÕw£Ò¾ÊJ†kYÅæòââáá9Ú&Ñ&CQq±ÙćíȖG·rŸÚÎà:ͪwƒë²ƒ{àÿ?„B‚ +endstream +endobj +3323 0 obj << +/Type /Page +/Contents 3324 0 R +/Resources 3322 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3226 0 R +/Annots [ 3321 0 R ] +>> endobj +3321 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3325 0 obj << +/D [3323 0 R /XYZ 90 757.935 null] +>> endobj +2986 0 obj << +/D [3323 0 R /XYZ 90 672.604 null] +>> endobj +3326 0 obj << +/D [3323 0 R /XYZ 90 658.687 null] +>> endobj +2987 0 obj << +/D [3323 0 R /XYZ 90 541.171 null] +>> endobj +3327 0 obj << +/D [3323 0 R /XYZ 90 527.254 null] +>> endobj +2988 0 obj << +/D [3323 0 R /XYZ 90 395.251 null] +>> endobj +3328 0 obj << +/D [3323 0 R /XYZ 90 381.334 null] +>> endobj +2989 0 obj << +/D [3323 0 R /XYZ 126.015 294.752 null] +>> endobj +3329 0 obj << +/D [3323 0 R /XYZ 90 278.679 null] +>> endobj +2990 0 obj << +/D [3323 0 R /XYZ 126.015 192.097 null] +>> endobj +3330 0 obj << +/D [3323 0 R /XYZ 90 176.023 null] +>> endobj +2991 0 obj << +/D [3323 0 R /XYZ 107.534 89.441 null] +>> endobj +3322 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3334 0 obj << +/Length 1888 +/Filter /FlateDecode +>> +stream +xÚíZێÛÈ}×Wð)‘€¨§ïÍ$Öã ¼±×¯²ˆá5ŽÄ‘ˆP¤BR;ž¿O5Ù¼ªÅ¹x&Ø ~’šlVWÕé:ušö6öÞL^,&g¯%ó4ҒJoqíiì)I Ä[¬½ÏSBŸÍ Æxz9#xd»`y9£xšÆ·ÛpËwÑUd·çç/Ò¯³/‹Ï^Ò±H¤DBrX¯4øçjJoQ‚m&¼]üâ°Ba +næüõ„¦ëqç³9xº˜i: wû8(ÂêÊÇð:Ìfğ†É +.i"ü)¡Ì¼ZLþ=!`{¤Ì†PH1á­v“Ï_°·†ë?z1í{7嬝Ç)ƒÏØûyò÷ Í,eKÑfQD˜MoQ»x¼Ïa=6–Að‘7±·û0 vœÜù” a<ŸºIøc±g©îÀ^·°_ƒß‹¿ò¦ þW,ð*Mò¢¾É¢µyڛ3®‡u烒?T–µèû§üÆô~ëÁԋò§Ù\œ)À~ŠÛeµMûù-¬«æÇ\"ÕÖÐ_쌞1Dš<_~x÷é§ïßþðnyñáýå»Wÿ|»øärœÂ. Mp,â° òÛð>GI%!D)!Êðë>ŽVQñ¥zNàÎss†1⾂+$¡ÀËç_¢xm+3¨>® Zæ UQ%›j\lmÁn,nCÏF’4þo2‡_;UèN‘PÜz&úž1E«•Í—|ÄqXî•ž2Eºž:Ü´˜ÏÆÝHÊzÆ!/C6+ÕÇ*,IwQÛËñŒL7)PňkÛ”œ.¶¡Ó¤R§öVÏɥߠ$ÆÍa&6è(·%£p0é—L´IÒ,\#ÇîÂðARøŽ?#ßqq’ïL}Œó…þѤaÄ;¦Vtî%©>¡|¸ÖÛ´¹i¤ó£‹^µB~ +ª9‡Fŵg¤s@¼Íâ :}¡NçºOç¾®Ã( LâÛåÇp}X…ëåe¹ƒS®ΐ÷á%1`Qð”_¸ +î#_²‡#qwËYïÆÌ7ö;ê8?üôi¼Õø I_>W§¡ÂGÌ{§Ù×Û©f՞²÷²Î¦ê9N GŠ²!dw7"J%ð´¢i^öÍlãñxãÁ ô$Š•aãñ•v³R¼I3ÓXòjɛmš‡õ¢f£Ìˆ˜–›¥¼½NCëb’Õ¥jÆ*4ù27ª& +7ÒÄÊ÷á*úcZM¸na@h„ñ@œö0¡‘R²—ÜaùÙ)Ç=©àïÃÝ J¨_’U¥I5z™®Ê~”— pÐÛ(< $Õ±ƒÈÝ­MiÄ }L÷òtkwh·Ÿ^¥i\Ù{ô‰ŽBµŸèz+žh0GÈ´’ù3Øý ¡Hòþ.1âsà ²(¸ŠC r˜®~ 2—ÿ Q¿ÇV5mä®úgñÖSK\N¦Ò©RCuˆêcX²$wÙ5Ò¬It‘B‡M Ž֌®-ã%–µÒ¤&3¸u¼„QÆäQ6ú+€ŽoèQÞI†£æÇ(©ž¥ÝLJ±möPûÌáGÚo)¶Qîr‚!MzÞ¶‡¥Nh9ª ½Ù±ê‘WÀL{SÀùyïáÖH¿ û”¡ Ýn®¼XŸŸC”C¢âh½ 2+”ûÞôüÖé&¶Å6Kg %n’Hàpò8DJ&î´»|¬l_[GàgÞ0Zz퀊€ðþ}°"Æjƒ>¤!/ ã@ÂöX”>'‹rršE1w°(á7"c./Ò¤g\õ†rGÒ*…Ó¸ÏØ´ÚqÁȜcЙ屻Ë÷ ×êXÈò”@µU:šÛ /ꪷc§€Ð IãçÊ%/oõÒS,œPË÷u=EU3l_ëe6X{}›ÆëF^…ÅMºÍ'Úþñ-ŒÖ#ÿVmªP 1:Lq_A›óïI˜ÒM˜%LúhÂ$Oėí;S„Ùƒ¤$Lò¼åFd8zH¡Ç€ð—º}¿2däy”m [ôŠ“,)4i#ñ*²$=¶dßÙò÷͖PmI݆Ýl ;ˆ·§òó¼ÏÛt?)]š×^\ºéÓÑ%{¾âìÒek]Z¦ø®óùi¾T +ùpvùVù/ÝP€:àò›Sâò¥¶C^òÿ-Â|þ_&„fA‘fc| @6^nœâ²#¾žV\ ‰>·¶üoå¦É³ƒ+ T($øHZªûJK’þ.-݀Œá $ؕc8eé?„'›Ì ÿæü¤‰ß9”ÿnOÀAÅ|ûï¡‘¼Î­õåÒ¼6de‡5[UCKYÕày˜ýq&ÄÔÖÌû 9˜ß?k–ø͘ +³ö%Fæ?¦¾Ñl΀CdÙ¿¼úÛß&en[‰¯à Il‹b~vvssƒV9:$Ñ>CQq¶ßÇgǪc¥|ï_¹®Yk—ÖPD \ܕLp”ÿÿÍ ÙH +endstream +endobj +3333 0 obj << +/Type /Page +/Contents 3334 0 R +/Resources 3332 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3226 0 R +/Annots [ 3331 0 R ] +>> endobj +3331 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3335 0 obj << +/D [3333 0 R /XYZ 90 757.935 null] +>> endobj +3336 0 obj << +/D [3333 0 R /XYZ 90 733.028 null] +>> endobj +2992 0 obj << +/D [3333 0 R /XYZ 126.015 663.906 null] +>> endobj +3337 0 obj << +/D [3333 0 R /XYZ 90 647.679 null] +>> endobj +3338 0 obj << +/D [3333 0 R /XYZ 90 545.493 null] +>> endobj +3043 0 obj << +/D [3333 0 R /XYZ 90 522.558 null] +>> endobj +3339 0 obj << +/D [3333 0 R /XYZ 90 522.558 null] +>> endobj +3044 0 obj << +/D [3333 0 R /XYZ 90 423.304 null] +>> endobj +3340 0 obj << +/D [3333 0 R /XYZ 90 409.233 null] +>> endobj +3045 0 obj << +/D [3333 0 R /XYZ 90 312.016 null] +>> endobj +3341 0 obj << +/D [3333 0 R /XYZ 90 297.946 null] +>> endobj +3046 0 obj << +/D [3333 0 R /XYZ 90 200.729 null] +>> endobj +3342 0 obj << +/D [3333 0 R /XYZ 90 186.658 null] +>> endobj +3047 0 obj << +/D [3333 0 R /XYZ 90 89.441 null] +>> endobj +3332 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3346 0 obj << +/Length 1721 +/Filter /FlateDecode +>> +stream +xÚíZKoÛF¾ëWðÔJ@´Þ÷rÕ¢‡IÐ6ÒDí% Z¢"¶|¨$Ùýõåò-R‘ _¬%½œ™Ç÷ÍHÄÎ;/'O—“«’9iI¥³Ü8;J$(q–kçݔÄgs‚1ž¾ž<õÒÈ»~=£xš„w[zׯ‚›ÔKÉíìýò§«„´$)‘ô¿·[:J F´Þðãò÷)¶àzÏ#B˜®v< ½,›Í©ÀÓåLÓ©íB/÷í7þÆOgĝúñ +ni"Ü)¡Ü<_NþžƒRxC(¤˜pVÑäÝ{ì¬áþOFL»Î¡Ø9œ2ø ·“_'ø¤g)CXŠÆ³ˆ!Qz7¯,<>»Òˆzʁ`"¯žßíü؋à`‚ãwJX*qҝ Z˼I’ÐÊûÏY@‘KôÉ,èhIp &§ìî¸b±¸Iöñ:»ž›Îœ)…°`Îœ¯EˆM‘ +ItíÝ$æp͟2SþÀ¯’8Ëíå« ö½ôúùíΦO–IlÿõµE‹ö‰G®Ë*k|óØÀ¹]De}&ÐH¬D«×îoKeñæˆï‚8«Þۍ·6Î)ÕHhs\…$TXñÀ?ߧq6$˜!îÖ5–§{@(í¸¶6ØX[½xmIÞÙüëX…àP¤òØ!§T”e\DÒ/ÕlÒ$*5›  4Q-ˆ­PڅŽ0m¼ŒÙ€yi·VœoƒlÈ:†š DfTEß ìœBü9¤ôœB(my~»òw9äM¶è<Üé搋n iEdùz±€SB9~ôÂ`}í¥ö‘ç=k:vkt}þå6MfTLñ‰`qŠî+“®—pzu ×w•¥e¼×œÝTâ<ˆWI´óòà&ôÑ@©Í)ÃHà(Çí ±|Dâ/‰oü°€âÃ¥PX»ô¦÷Da÷\–Pz…ÅW‰ÂEÀ ž|%U—‚à³1X ÌÔå0XlƒÕ¶Ä—½O7±¼¬„ö|[. RßälqõÑp—î«¡+«ú¥h·ÏýõiVÆHkÙåäJªs?½'/»ÐKÒn¤Æ(|B9k8¸4?,pή}!Ón,ó¤jtìg…¤ëÊ57ú«¼Þ;U­`-/=€~×;kÇ?ÆdJ[ Éh2G¤‘«Ý#ÅÐܤ^ž”>J6ç%Ç'쳺¬¬‡¸' düȾµ'Q?€… ¬ãÁr·ó»F‰DèáO¤ªò±_þßúåV‡ »ÐÇØp3Èí6äsÌöoªª`2Åk–Tlš¤Cƒ$A¸á¿1w«¢¸{¢-ƒà†-ánɖ°ê°å“݄@­³cé?Te0NKBúÚÓ¢Á±ZÙH bZ ´šGpé¶Á9ÐÎс~ò„™ÃÍ9vaïu§‘ìÈäУ61­S/ô7%Qíã<Ù¯¶%Y÷ ||Î(°«êŒiîC~UvzL{œÒŽ¦41:¥ >:¥i}ï)MÒ㊏ÍPLѳ¦4y) £Sšîi¨¦4>6¥©Æ¨s§´'åˆF1/V/ý¸Ý9 ) +­®ÔCêÚ~É߈´‹´âgÿDdÆ?vÆøךŠhþ£gÌdzÙãøP`ݸzöc—qÉ3‡­ŸúC®$èU÷j×RßÆ*[Þ TPsÛyÓ'ÅÀ¶’Û×}?ÇÏ®_æøɾ’ñ³{âþû6øˆ¸ç¾nS¼fÇVÌ-_³ Á{zmªÊô€åeÕV?) ½ø-óÓogÐV•'ûŋ÷^Øüi> endobj +3343 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3347 0 obj << +/D [3345 0 R /XYZ 90 757.935 null] +>> endobj +3348 0 obj << +/D [3345 0 R /XYZ 90 733.028 null] +>> endobj +3048 0 obj << +/D [3345 0 R /XYZ 90 637.302 null] +>> endobj +3349 0 obj << +/D [3345 0 R /XYZ 90 622.87 null] +>> endobj +3049 0 obj << +/D [3345 0 R /XYZ 90 521.639 null] +>> endobj +3350 0 obj << +/D [3345 0 R /XYZ 90 507.208 null] +>> endobj +3050 0 obj << +/D [3345 0 R /XYZ 211.842 264.816 null] +>> endobj +3351 0 obj << +/D [3345 0 R /XYZ 90 250.229 null] +>> endobj +3344 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3356 0 obj << +/Length 1986 +/Filter /FlateDecode +>> +stream +xÚíZKsÛ6¾ûWðÔJ3Œ'¸’I2éc&mÜöd<´Yl)R%©:î¯ï‚à[¤ŽÒK}±@Ü]ìûó +{wö^_<¿¾¸|å3O#íSß»^z{Ò'HPâ]/¼÷BŸÎÆxòvJð$H×ÁÍÛ)œ$zX™EÜüÞ¦Aúpuõ<ù4ýxýýå+BZ‰ï#ásàWüÖé0%ÑúÀ›ëߨP8‚ë3ߍaº:ñ" +²l:£O®§šNÌz¹q;¿˜¥I§DML<‡-M„š*,ы—×] ƒ=RhCH$™ðæë‹÷±·€ýï=Œ˜VÞ}qjíqÊà3òÞ]ü|KÍⶆµèÈ  ó$eû‰{Wð®^º|%pÛ&°bÕÅ~_™n¡õd| +×á?A&°ÃÀBÙv>7f‘=ƒGB&÷a¹/n{tÞÅfávóU¹½IÂ8wË$ußÍ£$Û¦ÝïíþýÊÀ®Ó~ûVŒú,]Ii>mRwªs8¤t}•Ôó•É0Ïì ތq‚˜z®§E©Ÿl»IÍz»vöû{JÅ$ˆ¶õÔÖqˆÇȧқQæbŽÐËOs³±Ë®:ï64ºÆRHb ²è–,ùâê*Œ§ ¢pq¤wÛµ í³¡@šV¿^¥‰½Â}ìî.4Ê)bGè“cR +â…;C;q:—²:óc6Ä iUÓÉWav˜YZÓ"„»g ÑYϓõüñ6r–Õ3°`°ð+Mðf9 ¥B>çR€‡UgàXNÛàÏìRYÿ ,lÞÓõå8ÉÝÛd/l`ÙÝeš¬Ý*¸M¦D€ÃÂól€5Áa¦*ºË ÊÌsFòUŸ{jòm;®ª1‡!.kÍBÝÄC—ÓH©šþ³Aå IÛd&S'€"ƒAPïš1Y@Èn¾a×Áï¨)ÄåՎ™eîVÛ8O¶Šh ®À ĸ‘@_7e1¤ËҘWåe·pI8¡ûª”^;Vþ°1q°ä—áZèÃRѽµ!Âê·I9z.á)º÷Gv †CÁÓ{kxGWWë0¶Δ…AJ„Áy:.ñ <‡ln˓f“ÃØéÍK¶¾g™+ŽšO¾rüºéÝV-®v#¿{7…¨O¯ž)è^$f yŠÎCSÔÆô‚›À—Uøu8P +bÈsqX q€ž®I_%çc„!+rQ½°E«Ò ‚¾U_qæâP3}Õ3—3Õ@ûe‚×*~Æòã`bp'gDBq/©þRäÁlˆ.ĨljFº5#]I“µ »^ ’k‰âè¡ìQ†*—Rü<õµ-FÙ†6E¬m—‡Ä`â#°]uñ¢uñ*¶MäÚû¨Àµ†º èf±OÏq}0U;Èl–­îý*œ¯Ê,  /b}· +²2©»žÖöT±Ý–±ü¶Ä¶aÙæeâm$1ÒÚïö‘e&…L›ôø^Ò:®Bªc¥±®tBy«m¬*W‘åÜÚØÖÈT©®PBâ>oËóU]¸Çl{û‡™çõÙ«jh×ÈÙ¬Zú¦wَ~@¿P¨9(š@æa²—2Gu$¡jGG1´äi'¥š’å‘þq@DÇÌI¨z)wTBÀrGÀ…‰0ÌùE,¸u$låwlɑG$ÊKy]¢´p‰Òš½W©ÂºÝ¤w²’õ §Šu ôÑ@”8ÏÿLœGôé@œ éùG-ýbHFz·¯û9©:€![—b’WeÒ.±ž Ӄ¸Ú’}ÒE)¶‹º^ÚW/‹íº^úbühZ4ãÁ0ÌúÜ°gŸFÀ=¦Ýæ‰( R-å1‡šql‘}ï¿9^²CÒkt2T+_‚jÆjÊøÓ±r «)Äè~¬á{XÍÒ{4Vƒ»ëýX­Ãq«QÀ<_«©q¬¦G±´¡'c5Iv‘”CR-ç;« qPãØéX 8TXMa5_ª±Ú³¨Q¤kª×&nwOC,…D‚óÞ¿]:Ì:I¼†eÏ=‚¡ê4µj¨Ž—?aÀÿ7ô‰ë¾5pÕDŒO9ˆ\ê“zµfÊa%*ԕí8J ­dÒïv¸Ÿ AÙ}‚ Oôhºÿʒ *h×ouiw¨Ë|¿Š“j¨ @¢=ÔÕ¢êÂ6´ì+­¡®}r_V#[Ø)FºðYt{ߏtÁ ü¨$ÄîH×nt1DU¯s­#fºàýÔVÿ³¡¾x‚ú_ê[è'Ï!¤½ÒÑ©®Ÿêjÿ˜©.ëê±±îa¤oǺ䘩®Ü7ÔÕ{†ºò 8ßNcâüãÈðAð±o¨ëÿ—CÝ:ˆû¿ï€®‰:öç=ÅÏy@ Ú@[ڊL )÷jë[ÛYø^>VøÝ=– Þ=üš™ô멀Tïž +âm¹µÅÌî×iÓ\õ1¢Q!Û#ãÉ;cÊKº›ýéU«\•mä%J¶Ñÿ*Ï7W——÷÷÷hž¡mnR旛Mt¹›ûZTG.«þa¤uµ…ÍuQÆvôÿ/FȄ! +endstream +endobj +3355 0 obj << +/Type /Page +/Contents 3356 0 R +/Resources 3354 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3352 0 R +/Annots [ 3353 0 R ] +>> endobj +3353 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3357 0 obj << +/D [3355 0 R /XYZ 90 757.935 null] +>> endobj +3051 0 obj << +/D [3355 0 R /XYZ 192.853 628.477 null] +>> endobj +3358 0 obj << +/D [3355 0 R /XYZ 90 612.598 null] +>> endobj +3052 0 obj << +/D [3355 0 R /XYZ 211.842 371.627 null] +>> endobj +3359 0 obj << +/D [3355 0 R /XYZ 90 357.128 null] +>> endobj +3053 0 obj << +/D [3355 0 R /XYZ 192.853 89.441 null] +>> endobj +3354 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3364 0 obj << +/Length 1570 +/Filter /FlateDecode +>> +stream +xÚí™[sÛD€ßý+ôö Þìýâa˜¡¶C™Ò^B'£XJ"°%#)Mýï9ÒênÉr§´À“mi}ö\¿s´Â僝W“gËÉÙKɃŒ¤ÒY^9;J$(q–žs>%ñٜ`Œ§ofOÝxã^¼™Q<Ö»ߋ݋Ÿ‚Ë؍w‹Å³èãìýòõÙKB‰”HHû念KZ›Œhµà‡åo=R(,Á՚ï„0S®x¾v“d6§O—3C§þf»vSß^yë_ùñŒè©®à’!BO •™Ðɋåä¯ 1Ø!¹7„BŠ gµ™œ¿ÇŽ×_;1£»|ÕÆá”ÁçÚy7ùe‚z–2„¥¨=‹"¤poZª¸o¼†…†ò èÈ+ÛÓÝÖÝ X&(ð§4H’ƒî¤ÈpY®¸Œ¢µ÷à, H2u0 Z;¤¬ÁúÞ-O,«(LÝ L²•ÎœiŒ ÓÎœoDˆß±À°,ImrôëÏ9‚%q§Éâ¯ì +#Ú+Tµ`×#‚#›¥qÄÚeM´Ë›ò˜D¼öØy®ƒÐo +ÜX8'°T_’P°ùÞúémlýÛÌו±i|ë÷¥°;®1¸²ºº¡g¿Dázg¿Á­üß´iªàà-YۊY]íÞɨͤé%4²ãþ–(Œª2åL)¡Ð Ԝhˆbθ@¥´yñqåoÓ¢µhý¹ÒN6 Ëԝ¤Þb„3Ž§Üuà]¸ñõíÆӎ6-½ (NK½—7q4£bz¶½ßv,Eµó?ö¸B#.«ÌÊbº/ƒ@J©ƒþl ‰ „{ؓ€—æA¸Š6[7 .×>ê)ð²ACÚ2ƒ—múÒ'¤/Wrˆ¾²ˆà—kÝÆo&ïø%j ¿\›Qürqú&i¬Òõîb^ðWAÂkÓæoUmy`¢±=Ô§1c±…1+Ž4_"Œé½`\æPå¸!4Kt=Ó<Í¸Ê ƒN†fùéÑLÆج?36w&cö„l¦œ±™#¬Äˆê°9“÷P6 ðÃYcÇAœNïç ¹ð‚ä(ӊÏ`´3®ú›,‡&kÄ)2@Ahµ€|Ӄ%‡¨ú*¢ÆD«%dBû[Â7pS‘i÷Ã͹it+01ß)ŒÒrÒ]oó,‚oÜu9Å$·Ûm§~1Þ\îꂵAˎèãëâ¬þí«‰sޜI«¨—½h~ëmtÐßd6ööõ9ñŸû|ú\2Òè.Þ5 ÞÛï¼T±Z%=Úi(asº†QƆ^ºÎâÐj_O§ZvÕoí!âõ{”´ÍÑS¶9–ë'ésÉ¡&@`?} Ñ%ît RÜ|捎ª§Ix†Q’æՋÄtäYG!\Ÿ e½¬Ï„íӎÂí*1ÐÚ óÆï±Yã[Ù Vå R"R$E§Õµ¦¤»›`uS}‘NY£´%ztO´ìÝnWE½ûn[j»>öÕvþJÜ ‘QL¯´…ABðNq@YŠ¼ý?ËþcMÈþø5ñã¯gBL »vÃ[w]SþC& +j"h/b”údTF0R@ù¿óËqÀZö§S~ûq’‡¶Ö—hªê\»IÓíâììîî­tÛéÙv»>Û/–†ˆ¾ª„\AåŠm¢ò ;áâÆÍÊxÏÿAy7‡ +endstream +endobj +3363 0 obj << +/Type /Page +/Contents 3364 0 R +/Resources 3362 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3352 0 R +/Annots [ 3360 0 R 3361 0 R ] +>> endobj +3360 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [238.223 259.422 256.823 270.326] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3361 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3365 0 obj << +/D [3363 0 R /XYZ 90 757.935 null] +>> endobj +3366 0 obj << +/D [3363 0 R /XYZ 90 733.028 null] +>> endobj +3054 0 obj << +/D [3363 0 R /XYZ 90 640.528 null] +>> endobj +3367 0 obj << +/D [3363 0 R /XYZ 90 626.387 null] +>> endobj +3055 0 obj << +/D [3363 0 R /XYZ 90 528.382 null] +>> endobj +3368 0 obj << +/D [3363 0 R /XYZ 90 514.241 null] +>> endobj +3097 0 obj << +/D [3363 0 R /XYZ 90 416.236 null] +>> endobj +3369 0 obj << +/D [3363 0 R /XYZ 90 402.095 null] +>> endobj +3098 0 obj << +/D [3363 0 R /XYZ 90 252.839 null] +>> endobj +3370 0 obj << +/D [3363 0 R /XYZ 90 238.697 null] +>> endobj +3099 0 obj << +/D [3363 0 R /XYZ 90 89.441 null] +>> endobj +3362 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3374 0 obj << +/Length 1603 +/Filter /FlateDecode +>> +stream +xÚíY[›F~÷¯à©ÅR=;wf¬ªR%UoRÚ¸íC­XÀ»¨68€wãß30€Á{7Nµy1fæܾsÎ7vnìü0y¶˜\½”ÌÑHK*ÅÒÑØñ$A‚g:o\BŸÎÆØ}5%Øõ³µýjJ±›®vwQ˜ù׿Ä7™Ÿíæógé‡é»ÅOW/ Ù[‘H‰„ä ¯\ðÛjJG(Áˆ6~\ü9° +…)¸™óݑE˜®g<_ùy>QÝÅTS7ZoV~U#¿GË(›åFICšåê™E'/“÷Ë`‡”Þò˜p‚õäÍ;ì„0þ“ƒÓÊy(g­N\WÎëÉo<êYÊ–¢õ,bˆHëÞ¢VñÐx5ó èÈۋÝ&Jü5XƱóNF½I§E=ãބ>ÃjÅ' ¦Ä(ŒTYÏÒ¢,õ˜âOÌç~^W¡vÁ* +¯gægƄ¥œˆÔ†$H“¼Èü8),tÞbŸ7ƒ×¯w9D©zôU%|´§÷o- òý¢ºÑÖ'vŽèºAQZOz'«8‰ÞUޛ8#ÒCKøWÈ¡ò…ïÃÐê_ÜYÄX'r5GXɾú‰„#Λ)Eړ“ïy(]‘Fo1¦IœÜVh\")Uë!Ì4åH«¿Å]<¤*$›&Í$Tfwž½ Ì¨`:ÀrÈ ‹sȤ"Êòygv¡.ò°†p(„Ý÷ãÞ]‡2D[SGV»úÆN`G!šÎèhÞ"ÂÝUOÖþ®;5‹‚ò±Áÿ¸$ƒ¶N°`zñ!ˆ6E êœíöÈÕ +yÎç€7ŽÝ{‡×~v»]GI1æ- xºuK–N©p°Èô.Ã)ò$»p¸I?? ‡RÔCØS§RE¶©âgQ¥{ƒí98t'AºÞøE|³Š¾1…›fC²¨‡4§…y͔4);y%ѯ.0X?J‘¼[ü,Ü*È<ÜÅÁ­€IjŸ¥‡µ¿ZY”åÛÍ&͊(´ ÛõJ 4ƒ*íÓ5 ‡òN½.ÿšJî365c>šM{ð{)ÅuÓĨlþ5Ø®KP›{ºúEõ$ð“êύ}ií‡Íëƒ00üDh ´ÈNÛMjEäÛ ˆò|¹]YY¥ ä2w!ë¦Ä-uôíó,*¶™}×Å\[Íã®ÄXP›(h9Ƨe°ëœô—QÀ0‚Ч¦Öíl}èGÀî^F‡C}èÐïÒ(¥Gè ¸1:J`8RX³æ“ Œ1D˜ŽÔ#T–Cz,‡©3WS„q/˜Ø·Ù¶â²5k)ûGuû¼÷x˜¹0¤¼Ffp; •F‹s˜ 9¹D`½cÌ%¨ðŒYáéé +Ïq£¦ßo¹Õ}ô~›¦so~üUTž=ÿxìØë{¶[!ª2|SHIØ ]‚©Q¹-­þ–.Œã)£¬vEÀú/E;Ä'¡Œò#´2‡ªK€ÒC„ñ}ÚQ +Eì­=ÁÆÁy¦:,Ĭz”…0N± Ä\ž”ÕV‘ÊJˆ¯ZRÞ-Z—¤€MîWêK¿ú|úU~¢aÞq+CAH Ê¡-ww‹õѝ‹b Tû:×Á.ñ =kì@€@抽ÛA~kv'ìÌî%à÷JýG6/ÖÑmdc@%é^ùÓۗDÚhóy·/ÁŽ´/€Ò—i_œŠ“»fÉ8œ(jÞkX üñ†å©# ‹ÖÈ£¤µûf#Ò·5ŒSØ@ÉqÎý‰7̏épúÿu ,O(‹ÿ@y¬Ó=¦½ …çg´·Ë(CG5ÇV_ºÛ©»žÎ6º‘!%Þ¥Îå[‡6'؏ˆœ’+ïDe‡ÒH›À=âP¼ÿP*ÐWû°üðŠRÀ”ýð'4‚÷¢óÊÈ7UÏÞÖe¯ºµµ¯ºù#²¯§B¸Ö)¿úÉÖ Ö%åÞ,ð*O4Í Fæs¨)ÖÁ¯£ÈYYö·SÿûyR:·Õ—(±öüû®(6󫫇‡äh›Ä› ÅÅÕf³º:„äÞ*°µðšE–æp³ü8‘fQX\û†$øÿ'™[ +endstream +endobj +3373 0 obj << +/Type /Page +/Contents 3374 0 R +/Resources 3372 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3352 0 R +/Annots [ 3371 0 R ] +>> endobj +3371 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3375 0 obj << +/D [3373 0 R /XYZ 90 757.935 null] +>> endobj +3376 0 obj << +/D [3373 0 R /XYZ 90 733.028 null] +>> endobj +3100 0 obj << +/D [3373 0 R /XYZ 90 528.165 null] +>> endobj +3377 0 obj << +/D [3373 0 R /XYZ 90 513.847 null] +>> endobj +3101 0 obj << +/D [3373 0 R /XYZ 90 359.634 null] +>> endobj +3378 0 obj << +/D [3373 0 R /XYZ 90 345.316 null] +>> endobj +3102 0 obj << +/D [3373 0 R /XYZ 90 191.103 null] +>> endobj +3379 0 obj << +/D [3373 0 R /XYZ 90 176.785 null] +>> endobj +3372 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3383 0 obj << +/Length 1369 +/Filter /FlateDecode +>> +stream +xÚí˜[oãD€ßó+ü¶D&sñÜ"Ä¤Ba¥O$ˆ@Xkß}œ›U•äY9mŒ8Ô2¹Ð|×U…$ÖޘÀçVEYÅÓi’!ö£eßFÅÃ:5Yµ§prÁñn¶9Ò´ ÙlQäåþ& ƌ3?¹·Q¦»Ö‡! +qå3—Š]ûB¤U§¶Z$¥•ÙۚJRÞ +EYÜ£‡H¤1ieæ½z @CÕé)Œ5>NÀ÷":N²yž®¢*¹[šoà£T~^ômÆ0ä”Ýd'“gU”d¥Ý2ªå½1 )¢àÙZ§ËH>k[nunÉ|aW¦Y^ه*!–Ë'ûZ®W«¼¨Ll_ïÜrµpªî ëš‡8OÁtï½Ú‡à#•È#áLû#âîgIö0ª—¾Â›5†HíçYc2ÄZo6õlß«ETY™yä–îÜ?¥Qlì +÷UFü¥œ`0ªËÉzewÕ~=Ÿ›²¼_/‰…ÝËÔÞ¶=¹…©Ö…3¯I +¬µ–ÃJM¾‰&ˆ¹Ÿï2º7mcSVÐYÏ'£r¡Î%aŠ—[ð"Ðsô­Z‚=g£A͆ úîi«§•É¢ÂÎ%;‚[Y׉Ä-C!ï¢þX»—'±Õù¯O +†p(OŠzWñÂQ2D Ù¾ŽéÔÀ2š™Û±ëbŐÒYÝ$ÕâZò æÚõæ¸Y³¯o>e÷ßç7ÞmY÷˜˜¥l‹YNúšƒ E;Î^'Ù2ÉÌMO‡@Q¤„h*MPçÍo¥9@ɎkÏw“`;0yo…Bх½Ê­ÊÂŵç(aò$O8JÈKG Cz îa’PAOA¯Á?‰Ðõš«Wè‰ÊÿðVsº”£G-œ›|{Ô>¸M… ۝û¾.[îß7ìډh}¶ûJ"$´®Rù™NÍØ;iPÄ9Gy=yaÒHIyru7cFÃöÞ1£ò”P$¡é{)O¾Pþè®”—Ÿ€òå ˜¿½z*!m´¯kŸlÑYöØ +PÒúl¸§PΘ…§ãÞù˜ô`J!¾3òöu£a›ÑOŽþÉ/ê KG~ñ*ò“ð—ƒC3ô· ù ŸA=ëW“Ÿœ üDÿoÈ´¼ùëدÐʱ_í³Ÿ~aÿgÇþ½ëÏÑ¿÷¹—ùÈ«¶¿[{L¬Âð|>`ZãvßÚÞCzH‡F´Â9IOÏIzŒT‹ú–Êà¤g»A9JzhS%úP¿W0ç%=t”>ðõ êOAý˓Ì)¨ï‚qxq ã†&êÔ{ãæžLHK¦ÜM<׈óð š.뻫½îµe¯}u¶/ÐÿÅ×ç¾1~Ž²usÛå öX«‚n°u°ˆQ}‹^Ã0C`ÿÊç¤õìO¯}úqÔDwk/Q1ܵñ¢ªVÓÉd³Ù y‰ÖY²*PRMV«åäy íh ÈNI×iÞ¦"É`1êê~ÿ¿ $!1 +endstream +endobj +3382 0 obj << +/Type /Page +/Contents 3383 0 R +/Resources 3381 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3352 0 R +/Annots [ 3380 0 R ] +>> endobj +3380 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3384 0 obj << +/D [3382 0 R /XYZ 90 757.935 null] +>> endobj +3103 0 obj << +/D [3382 0 R /XYZ 90 624.575 null] +>> endobj +3385 0 obj << +/D [3382 0 R /XYZ 90 610.004 null] +>> endobj +3104 0 obj << +/D [3382 0 R /XYZ 90 467.557 null] +>> endobj +3386 0 obj << +/D [3382 0 R /XYZ 90 452.987 null] +>> endobj +3105 0 obj << +/D [3382 0 R /XYZ 90 310.539 null] +>> endobj +3387 0 obj << +/D [3382 0 R /XYZ 90 295.969 null] +>> endobj +3106 0 obj << +/D [3382 0 R /XYZ 90 149.497 null] +>> endobj +3381 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3393 0 obj << +/Length 1442 +/Filter /FlateDecode +>> +stream +xÚíYIoÛF¾ëWðÔR@5š}‚$AÓpc5Çh‰–‰J$KRVüïûFÜ%j±-Eá“Hêqæ­ß÷Þ;s;{oǽáɃŒ¤Òß:;J$(qÆ3çÊ%ñþ€`ŒÝ‹>Á®—,½ÉEŸb7Z<Üù³Ä›|n/yÞFßû×ãOÄ4V$R"!9ì·YðM.Òڔ`D+ßÆ_;V¡ ‚+™_÷,ÂL)ñná¥i@vÇ}C]/¼Ìϟ|ñoý¤O´ë‡SxdˆÐ.¡Æ.Ú{?îýÓ#° vÈÆB!ń3]ö®®±3ƒçŸŒ˜ÑÎz#µt8eð»p.{öðAÏR†°µg ÷f¥Š»Æk4ìAG^ٞ=Ä~è-Á2¡Ø*Œ$5ýɪ”¸·Á‚Y¾æ“Sìçò`*Ø]å‘\¢éÞrÇh”ÇúÆ4ô'+ï ˜fHå F1YÙÝd…ódeS£H oX`x˜fùí»êÿÉåC +aËÿ”ëaD+k%2Š–šLçi·É´²ö"…Ls!PRSR +]á"ýë\Pà†à€2Š°b`—‚óü…¿Ò"ó³»âbÇÈ ìØÖD:Ôoí•ÉëêÍ¢|¹¤pwþmÚË„OÕcÖ±3GFWöfwAçÎ ™Jmª·,¿-ˆÆȀs’›Š†:Éü$µ^¯—i…“h¤ˆ] aÁZ>i¼ÑRD©¬tïõ~鶛B`•ú³üê6JÚ]úavØXf“Ž´­}ÿ}êÇYYü(KM]i6 K8vï½E0›xÉ|e•9d?$!¦¶?‰úT¸ë°È¹ÛŽôà±ÚeÏI‰8®„¼pÖUWi¥NHð +}½¤Ñ,ãSðè §Ñ2ö²àfᣎPʑTÒ€m0µ…ÿüñŸ±uc¨„%ktßç¬]ÿvͧ⿀klŽ´]÷÷š=ÿã D±7ÿV ¥nÀæ/³}Ðßú» ó p«§êñfBB|z +ân «â‹ˆ_ê¾»›•Ø–Ê­]4â²"© +“¶Ý'ÖÉ}ázjògQØQä†)qB•Óó‘eIÎJ´á²½ 8Ä»8 å»(à°»¯!ü•O +ǪáIŒ@(R9#è6#ˆWFø/2Bz„ŽNÐJC Ö0Û5 @¿hÌنb( ˜§ m;‡­‘àj[ûv» 4RÏw'àÖüM@`…þÁ³0_Jõ"ÓÂáa¡9Ž÷煉HҘWžxîì0K{ü0ÍûfÑ’QW9¦`À%çhóÒõ¡‘=§Ë-Hü4ö§YaN”ÿ¦±gÏu!ïëJëò$ƒ|'$í +VÈ°*a~éCj×KÓ`á¼vc©ÍjQ+³ë£·“=?dü1HkmÇ @vuÎé§ðÜ#ÁŠ(µð°lL¼‚¸ÖÁb±Åvu=ú³ÿÙ9X;ú-*ëNÎöÑTP4aTxÏ;æèšŸ«éړÛßY¤Y}êg–ÍçØËF˜éâó +0„|+Ë.,‚Yº)nK¾Éo ÒÉo 1N~î á~üà WÞ¢îúïíRP&•û0²,N#¨y¨¤K¿ÄÓܲ¿òê÷ÞƵ¾D+ÄpUÞwY†Ãõz¦)Z…Aœ  Æñb¸›WU Á¨I¥êÿ–QÙi!<\v´}àÿ§}êÙ +endstream +endobj +3392 0 obj << +/Type /Page +/Contents 3393 0 R +/Resources 3391 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3352 0 R +/Annots [ 3388 0 R 3390 0 R ] +>> endobj +3388 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.4 207.205 212.124 218.109] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +3390 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3394 0 obj << +/D [3392 0 R /XYZ 90 757.935 null] +>> endobj +3395 0 obj << +/D [3392 0 R /XYZ 90 733.028 null] +>> endobj +3107 0 obj << +/D [3392 0 R /XYZ 90 592.061 null] +>> endobj +3396 0 obj << +/D [3392 0 R /XYZ 90 577.49 null] +>> endobj +3108 0 obj << +/D [3392 0 R /XYZ 90 431.018 null] +>> endobj +3397 0 obj << +/D [3392 0 R /XYZ 90 416.448 null] +>> endobj +3109 0 obj << +/D [3392 0 R /XYZ 90 269.976 null] +>> endobj +3398 0 obj << +/D [3392 0 R /XYZ 90 255.405 null] +>> endobj +3110 0 obj << +/D [3392 0 R /XYZ 90 98.98 null] +>> endobj +3391 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3404 0 obj << +/Length 1682 +/Filter /FlateDecode +>> +stream +xÚíZYoÛF~ׯàSKÕzïC( +4E$m4Qóâ-Ñ6[‰TIʊÿ}g¹!ˆGcì¿ìé2˜¾Rì'‹ÛëpžÓߢ‹4HoÇãgɧáÇÉ별lq$R"!9ìW0üё´6%њàÕä} +$¸¦ùif*Š_A– GT`24Ô—«E‡îÍÛð2L‡Dûa<ƒW†í†-ÓÁóÉàŸ6Ø#…5„BŠ o¶œÄÞÞ¿ö0bF{›‚jéqÊàsá½ü1À½–¥ a)Ë"†¨*͛W"ÞU^¡a}y­{~» +ã`i••|=%G\©ödJW7ÖùI4w< +®́P`ÊŒÆYŸì-sŒÇëx–ÄYžQl‰½“q¦¼8ÁˆÒ!°À ’÷6l‚4 +.a6}–¯¿sÛ±íZ #kó'Ӌpºµg8ïQKÄ`g\ïMJ¢mÆ ž¦´":âpûèÞ":c …$$“K‚d¹Zç!äÄÔϯ‹Ø¸ÐN¯ÊûràñgC"ü[ØbžF0¦³ ’¸ü 낒úÉ¥“¶\ÇZ5*aÖ¡GF×å×QÖ¡ …e“ì›(¿v¤a¶ +gù°6OµŠY˜+éŠÏlÌÊïæÑ2Œ3Ð&ë‰bŒ¤æmÿÊHѱ)¾mɯ¬/êøûÁàQtGñ•{,Ķ Pj½(ƒ tºkWÑäü³’CfeÈÔ4¨åםàQL-$ƒPHÒ¿(“€%ÓlÜú}ç•D#EÀvaA{³c‹CKfCcujM*£eU:Z_/œ¯í²öueè ¤ÝD‹…[]”¤-1ú-B™0—¥I”“çù§Y¸²Ir?s˜&”²|>,qìß‹h> Ò«5ȟ÷E€#Mc”4Ráo +…•u%'§Hœ"3%”Š&Ê܆µÁGØs¹ØÌt߹䵫$._9—©~<² +‚wa¨àtñÀAæ2•pfåíL÷æ.Æ +;üßÑ[@!–ªýi¸LnŽÈmԁì#"5Ò0ŒŽl—{ýˆåžHª÷ÔLÈ#ÉE_Í´è î–û‚çCë½bÐúõ)ÒÚ´[òÇÌVA°<ºêG±Å)ˆÌ©C_;…~ì :$}°meæ}kMÐÕ]Òõ6·,@Rʏi%È1­ÅŸÚÄυù²ž*Å98‰bðV) «Ôm¼YCÿ]1؂¢V¶¤ây—I%ÒM}ÛÁpº!8TqbT?ùú‚÷Ö&ɓ1¼H¯g— Ýí Z…ªÃ)¡HA¾tb¸yD ‚쁅1ºJØ”4nY>xx§H3ҋ‚ìðð$˜Þg`[­Â´iÁ)‚v¾ÿÉ:ž?Õ!ˈ_Õ.û`ý ª³Ó ˆŠÂPEëüäy]Ãz¶ 0_—N»§‹²o»;-­ã~ü·ËÃ?‰ + ¬†Á¬ó­|€áG­¸§Hq¨4 q‘$ Çï3àß~þÀÿ-Ð=9þO£Ëiø)˜å÷)œm‡ë:•~Ü:p\w¤ ©U^ÁHθq0k…ܲ°´[v"®ôЧèûbZH{…´¤}io|û€ÂÊڃM ?À³â~”Û÷ºþޅQXjÙYmãÀšYösàÍê©î£gž®Ãƒ«tIÃ|‚.¥ª ¸4ÝDYرˈÁŒ«˜l™\‹¬k;F·O棬:½tÛõ—6ɦ`¤ F|«lO¸²‘G½ŽRû¯£?tŠ뺎R¯na|èˆgk×ý×QJߣºÍ£Ë­ûǺÌI$ßIÆ{8ÊÝ0þŸÊÚqã ·§dÕý—x*ã ¸Ú ¸Û]5ï[¤†ªÌ¿Æ±… ÄìÛØò߀{mŠÝ?.@D¢ýßBñDZ_êòÿ + !øÎÕÛÛLY°-+´u%亇?³0ý~(„_¦àïA¼ šÝXVaÚÜÕÁ|ÀbÁAû þ.¬.~œf{Õê×AaÛF^¢¡jN™®ó|5>;Ûl6h–¡u­Råg«Õâìnmq!ÐÕL.“Ô ¶LÒú^.‹›ñ;öÿê­é +endstream +endobj +3403 0 obj << +/Type /Page +/Contents 3404 0 R +/Resources 3402 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3411 0 R +/Annots [ 3389 0 R 3399 0 R 3401 0 R ] +>> endobj +3389 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.573 690.333 216.297 701.237] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +3399 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [448.024 589.176 483.212 620.144] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +3401 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3405 0 obj << +/D [3403 0 R /XYZ 90 757.935 null] +>> endobj +3406 0 obj << +/D [3403 0 R /XYZ 90 733.028 null] +>> endobj +3111 0 obj << +/D [3403 0 R /XYZ 90 569.153 null] +>> endobj +3407 0 obj << +/D [3403 0 R /XYZ 90 554.592 null] +>> endobj +3112 0 obj << +/D [3403 0 R /XYZ 90 451.078 null] +>> endobj +3408 0 obj << +/D [3403 0 R /XYZ 90 436.517 null] +>> endobj +3113 0 obj << +/D [3403 0 R /XYZ 90 333.85 null] +>> endobj +3409 0 obj << +/D [3403 0 R /XYZ 90 319.289 null] +>> endobj +3171 0 obj << +/D [3403 0 R /XYZ 90 206.669 null] +>> endobj +3410 0 obj << +/D [3403 0 R /XYZ 90 192.108 null] +>> endobj +3172 0 obj << +/D [3403 0 R /XYZ 90 89.441 null] +>> endobj +3402 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3418 0 obj << +/Length 2270 +/Filter /FlateDecode +>> +stream +xÚíZ[oã¸~÷¯ÐSWj†wRn»@w1³ØKÙ™t_¦C±åD¨-¹’œÄûë{(êF[RœÄi·Å> 2–©sÏõûhbïÖÃÞw“o®'Wï%óH*½ëµ`OI‚%ÞõÊûì‚øtF0Æþ‡)Á~˜mÃŇ)Å~º9ÜE«,\üßdav˜Ï¿I§_®¸zOHG"‘ ÉA_)ðÏv‰£”`D›ß_ÿÒ#…Âܬùz@ êßnÂ<ŸÎ¨Àþõ4 ~´ÝmÂ"²O>Fë(›íGÉDhŸ0b„NÞ]Oþ5! {¤ô†PH1á-·“Ï_°·‚ç?x±@{媭Ç)ƒ¿ïÓäç õ,eKÑz1ÄhåÞ¢6ñtól̃`#oö^vQnag“J…(a£þ$ SÕ+nÒtcå½8 `¿L¦£q ` !cvWèzÁ|žÇàÖx}XÌÌZoƃ›¶@T±Øçqr»X¦I= Ȝø6±©ò,0<Ï ûq`oL‚Uò©o³ó59Þ,øƒ]wÒšCŽx+vGª5 „¦“?ÇÉ&N¢/v¡À…3°¢ÊÀ› +I[¾ð×Ò¦úˆò‹Ô¾G#¬Z+0뱂£@7FwqÞc•«f;aYÁ¶t³Ûª†?~7ñ>—¦l£¨˜í²(²{ˆ·µÏæ˜@—a§I%ÂVqõbºîÙámÐG6AÏÙDS‹qqgMKwѲpýèH—ynG¶@jJ +¨ ð¿_÷Ŝ#ڊZ‡›<êÇ(‚”©WÅymh±Ï’hõGøH9l3Jªb"IN±Á׶˜b(·,‡·Û'UˆVX¦R€ÅÝp¥ò HHBãäJø»Çe´3ó¹ój+­À¾ µ//VóyœL9öïÃM¼Z„Ùí~%ő-Žcptçë»,Rá?ÔÛêËN»Pö@[nJ YõW"­äXžhÄÛè‡Y¡U ûÎÁ›³8Y¦ÛTÈÍ&B=mò€"eBÍ ‚ëÎ8ö†3Žâ`hƁf5ÚOèsͬ¸7ƒ-WVäKÇd<'£cÎ(}bÊA:ª6¾~Êóy¸6,‰ñ6¼ªâ“Š/p‹Ï̳_ +³8„XöÌHLAå÷aÖ7ˆje/™ð«1É°ð‚yf‹w; ³ò¼,q†yÿÔ¢º¬àJ^d^ëÑ©¡CÑ#¥ß¦Q¹õe º(²0.òù¼4eauw¡^j¡‘l*c%é6NÂ"í3@˜Zé©3H~ˆî¨á×±µ0M"‚Îàuç;A’ÏâÄy5ÅÑtf0 +ú§3`öɿf:+¤Û°š¾?8Ÿ1áÚ4M›ÈÖ¼&›»Ù|Ñ;‘5CDˆ‹Û½OVBÖ]w•aë}R-óiîv% 0îÍ&œêrƒ'8’\œ”—kdnzÉÕî8ªBµÉ£R¦Døïä̀5€¢;ÑÊ>¸9ôØ̵ -ÇWΝ“êräI”à-Tüƒ…§Ñ_ul +V¨nö¥NYF)ó¥4Ã8bô÷jGi¿å‹‹rÁdã6J ñoâ_#hî3ÆÙ9¬Âm­žÉ*ó?F›òWÞŧÃö&Ý ñ•æµ,Úä‡mŸÀ§cé5g= qøª³Ì(tFøw„®F¨ éèøÔEH¤9û—ܞ ü†é ƒÙ¨¨ºŸ å=áH^æv‚;)UV©nþÛÛEJê‹ë¯0hm/XØ¿cä‰JáwÊÖ¾qwJÁ›ÓKWﵓ¼ ‘Öòû©~]¾„yÚÓõ9KùP•îiBihd³Î*4Nê_Ùµª#š×æ ?®Î¥/,’’`3ÕèÅ/V.{÷«¼óÕÕXI +˜KÎÁ/wZ°gÎd]Ýöf¯À;âoLÁFu{þáøÃå©vœÕó¼A³M0íX· Ó¢ZÀ«QvgnDuhr·º÷I ~íϯ.Œ=¾‰'5Ìw}îE¼2 «ˆ?Âõ F73´úXQû±š¤öÃßó(ûj*„_ùêoa²¯A¼éj÷FÃÆk™“ сWcÿSTW™ÝÙ?½ú?NJv +@+ÄpÓæîŠb7¿ºzxx@Ëí“x—¡¸¸Úí6W§ˆ»#…pè€Í½žnÓ¬¹…·e¤Oüÿo‡ôuR +endstream +endobj +3417 0 obj << +/Type /Page +/Contents 3418 0 R +/Resources 3416 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3411 0 R +/Annots [ 3400 0 R 3412 0 R 3413 0 R 3414 0 R 3415 0 R ] +>> endobj +3400 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.275 690.333 293.971 701.237] +/Subtype /Link +/A << /S /GoTo /D (main_Meet_Preserving_Simplification) >> +>> endobj +3412 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.269 550.53 238.02 561.434] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >> +>> endobj +3413 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [182.089 324.387 246.767 335.291] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >> +>> endobj +3414 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [325.899 96.965 431.977 109.883] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +3415 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3419 0 obj << +/D [3417 0 R /XYZ 90 757.935 null] +>> endobj +3420 0 obj << +/D [3417 0 R /XYZ 90 733.028 null] +>> endobj +3173 0 obj << +/D [3417 0 R /XYZ 90 625.136 null] +>> endobj +3421 0 obj << +/D [3417 0 R /XYZ 90 610.685 null] +>> endobj +3174 0 obj << +/D [3417 0 R /XYZ 90 398.993 null] +>> endobj +3422 0 obj << +/D [3417 0 R /XYZ 90 384.542 null] +>> endobj +3175 0 obj << +/D [3417 0 R /XYZ 90 172.85 null] +>> endobj +3423 0 obj << +/D [3417 0 R /XYZ 90 158.399 null] +>> endobj +3416 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F8 504 0 R /F13 540 0 R /F7 505 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3430 0 obj << +/Length 1870 +/Filter /FlateDecode +>> +stream +xÚíZێÛÈ}×Wð)‘€¨Õ÷‹’]`m؋ÝlǞøÅk´DˆH”Bq<3ûõ©¾ðÒ¥ï ,0O¤èfuUuÕ©s8ÆÉu‚“G¯®F³·’%IerµN N”$HP’\­’OcBŸL ÆxünBð8-wéâ݄âñ~{¿ÉVeºø%ÿR¦åý|þj7ù|õóì-!‹DJ$$‡ýœÁ¿ù%Ѧ#Ú,øéê〠+Kp³æû3F˜©W¼Þ¦ÇãdJ_M g»Ã6­2ÿä}¶ÎÊ Ñã¬XÂ#C„F­Ñћ«ÑFÌà„¸l…Ér7úô'+xþs‚3:¹u«v § ®ÛäÃèŸ#2‹ÏfX„!E%"çmHmºËª¬<Ν#}K³·FtÃÕHa“LáŠõf¾¦eôêì­Àñ+TÒ:CW›m¶®üÝ&-Vþ¿~P®åé—mx²_ûkU¸ÎŠ¬L·ùoYx;]ۗ~ŘaI™Aöó}ñמQHÓàà”dx(@xóx¿»£ˆœUo¹ß}Ùo/oîÌø­½­ìîp1”AÕ²“‹›d£Ú—g²Uæכ ù>Í]6!b ¾dÇム>uÃXeÅ~—Σ Ñ@™ Å£hˆQÑÛÇ^«zEˆÇÞúx읏ÇÞÅñØ'q<þÙ¯XàýÁXº ï¹½†dÁúm^mj§Ö®an¶• ÎN )$„M"4ƒ+ÜíMÈ"-êe jÌ)ÇHRIˆ*é­¼¹[fίoìJÓ:r¬Vóy^L84tÉj‘–!¬ Çaà;­Zîm4·-Hœ¯þu·æ1È<õžuiâùüèÍþ–Á6pGÆö°Ïn$8"¬é¸ºKúÍ¡6 Ûºpk(‹“Å”¨×@‰°¡°ÑÍfÕ|}p³2óÞ¯rȲ­±i¨JÓ".“¼XîwÀŠßBç¯ÒºÉ\ܾ;ñvžåa ûÐõihùCº ;6Ž61,˜oR³Gd‹>”-†L“Q40I§¢€˜& +Õ2Ä“TõH=ÖviâÃLǻU÷‡¬€Ù†%Õg€!Hrq‰Ø¸Ts2 öù*Øü½ÜÅ&B^ +$ÚtØs¨E­BÝÉóDY™Ï;su‘®=„.ž¸ä»ôƈpØùÑrœzJ;Ã1,)”Ž”mL `vèzÉ_&S)90%?FÜ0­vHSNí´îçI!Bú֗«•◼ÈÒrñæ.Äçgƒo[¬Dmû§¡(1Rڜ“dgI8" –_ï3—ße°¼¨Ê4¯Žó¹soáýéƁ…DJÅÞÈ!nûø»&Ö@ [" ®­sïؾÈìaÛI6H€¡Eˆi¢Y¹J¦MüŸòb ™ÿ<S&) ‡¼+˜‹Müs]¤>Œ«ýPqƒÖρê@” ke~S ¡øí¯A¬TiÁžÝO@ì®À]Ù²j²Wæ<ôÝJ‡ò:hˆ÷?Ž’Onaē탘yÁ¶ÆÔ@GÓԇ$-Ð 9®û|•€GL‡~Z' Š"4 ‚8VpÖí"4!Rg~©ê؛2c! *Ò#ɱn"ˆ@ƒp ƒà’v‚5o䓓KÝMKa©Ãm8G.jÎdÓãvªÞn²rhX1hˆÎ8ì‹'—v¦ÕC½º¤7}‚±ª•Ñ—û¡–dI#‡04:i)£É}–ËƁ–öˆ¤~‘™/2óEf¾ÈÌ™ù"3ÿ2S½ÈÌÿ¥Ì ›¯/ƒR³?‡•šû§!QF¹F²e-ÛÍqHº@hÞe„¡~X|Âi E¿]|:ó>&ß²ZAêLܲgµ­3¨±õޜQ9'ÌÍG 4òFþ1p»aF¹8#ÐXµzŽ—0 +bf7 ¥co!FÀasóxíïç¶ÝµQg!þzIQ.{ôÞèQ$gøAuF4AVºôË=Vf–›Sˆ‘‹ ÊL&ÇꬊԉŽk·Ÿ šÚ‹i¹ýv§:M`ƒ¾ ŠT;[Ϋ¢)'´‹î »ÿwuäWhÇÁ$ÔâSÔ âˆE'~VIñâèid=lÙ%ëR;¸å:OÓ;ÖP´û)y¦¤ÖÓÍ傀sŸ»õð;89y&JNÌ'ï²ÅÑi÷‹ÐÓxyŸR¶÷”Å:ÔhZ +S_ŸNýSÛàwó±´ÿI÷!\SÈ0:Ü÷ý?æK ¹Õý[¾û{u¾FáD@Þ«Íw¶Ô,ï ?kâçöçü똕ž1ÉýGZܤ -ÓújMþ4M†‘ýŸ ^VN@ԇ¬žd>²'õÝßG.}A¼†á&9›ª:Ìg³ÛÛ[´<¢›"?”(¯f‡ÃvvZ‘+€ñ-ËZ×Âe·/CøywNòÿ_Ê݆f +endstream +endobj +3429 0 obj << +/Type /Page +/Contents 3430 0 R +/Resources 3428 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3411 0 R +/Annots [ 3424 0 R 3425 0 R 3427 0 R ] +>> endobj +3424 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [365.617 504.305 476.603 515.944] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +3425 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [323.631 246.716 429.297 259.195] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +3427 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3431 0 obj << +/D [3429 0 R /XYZ 90 757.935 null] +>> endobj +3176 0 obj << +/D [3429 0 R /XYZ 90 579.03 null] +>> endobj +3432 0 obj << +/D [3429 0 R /XYZ 90 564.46 null] +>> endobj +3177 0 obj << +/D [3429 0 R /XYZ 90 321.441 null] +>> endobj +3433 0 obj << +/D [3429 0 R /XYZ 90 306.871 null] +>> endobj +3178 0 obj << +/D [3429 0 R /XYZ 90 104.608 null] +>> endobj +3428 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R /F8 504 0 R /F13 540 0 R /F7 505 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3439 0 obj << +/Length 2298 +/Filter /FlateDecode +>> +stream +xÚíZ[oãÆ~ׯàS+Ñxî5-лAÒØìºyÙ,Ú¢,¢©R”½Î¯ï™ÞF"eye7@›'Säá¹Í9g¾ohÝE8únôÍõèê­d‘AFR]/#ƒ#% ”D׋èã˜Ä'S‚1¿›<Ž‹M<7¡xœ¯WÉ¢ˆç?¦7E\<ÎfßäŸ'Ÿ®¸zKHG#‘ ÉÁžSøµ ŒŒh#ðýõ/=Z(ˆàFæoJ˜©%¾]Ç»ÝdJ_O '›í:.ç}²LŠ Ñã$»…[†=&ŒY¥£7×£¨ÁqÙ +)&¢ÛÍèã'-àþFÌèèÁIm"Nü]GF?ðÉÌR†°mfCLWé-kƒ× hØ© ‚¼‰½|Ü&Y¼Èˆ¤z ¡† ÉÅ©„‚³FÕ÷vñótQéüÒZP jáT Ñ~ϧ DµŠ¦B#ÄpAVf³»$KŠxþ–,æñòWŒi–Ì·¾ÒM| ùñ¯XàÛ<ەðŠåÇ4Kâbþæs%¹Û¥yæ%ÿämÑ BĤY¬õj×W«ÝTóWT«î}ëÊç77ùºG9 +â¼I`‘¬w›¾,*Dˆjõƒ¤ zH`¦­ +”jõJˆF‚7Aý2D›€Ä’J&T„4¥µÐÇ4[ƒ#Ÿ¼ À݅'œ! õéB&†{áïàç]f{Ñq™û÷h× xËÐÖ ÌzœàÈhÒ4Ð*Ýõاµ~–«Ä›ÜuñPFÆù²ÇÉW/íÀCZ®¼E²Û&·¥w2à3±r“däYqWM´÷ߍ¢N Ó þx9¡bìÛÂë*ª‚¬ùÉvõVwOc¤ñq¹CHèd¦«r"¯Ë÷ôµ€Ñ@¡L[)4!R¯¼¬K«£Ê r•Çd§ 1~X%E߀Âx…"”UoÈó¡rŒT;Ój£ñ%MÞܯïfw N¾p ‡7}ÝÀ$’¦·Å˜@Z6bè`‰‚&œ»M)‡…Ðþ•j„Ã>Q&Ån(h…-¯‘"V‚ Þy#L "Ùì2×u‚Öɲ:«8«²±KÕӃB´i›1†¹ägÒ_,>N+“S"Sò0‹CŽ2Š°1GŽö­äió•"o^:˜$¨"ǶӻÕY:]PevÞøŠ0Þò›Ï·ÉÖFû¼j0ín²+³YšM8ßÃhm¶¸Ûo’¬<¾ȐNê‹ÜöPå<í¨œBs“—™¨“ÃF^¤à³Íá4…~Ýl¡nÖU’ÝØíi[ª‘Ôòh†Ö`÷¦ÍØȋ>=v²<1Ù2Œ¼º€`BTBÜÐpšWœLÈÔ, uº¿ĎÑ&ªlNÈø<!'¹GÇìõ ˆÊ“ÔãgÞäû †ü|êqS$eˆ»üYaF‰ž¿X²il ®Òt Kwv>©Tó¬™œgõâ (üoóÄeÿ6…É4/‹8-w³™ótî]ëÒÃτDª‹$Ë7i—yŸB ¬›ûkOÇkØ®ZÚ +®-SïXž%¶":¨9¤»@àÈËakÀHQQakqˆ­µÀÖ0eÛIqÙ$VB„èŒÖÐZ‹~h-` ‰s°5}–ý +\ƒ-¸¸¶©8 ®A°^ú`§†ÇÀZu1³¶ÔIZÐÌEÝzß­œtŒ¨r{îºzâí¶TwIxÊÁ)ìÀPƒ\QÀòüäQ0G\ýi‡;åèZkTÁ¸×JtHXA1 à'õ*Rދù‰¢í;M=ýB²ÁÐôI"²R2D¡y¦©Öj7 wØ` ’©ÆëYÔ³é'–A^œáÂÀÈ—¬B£‰!"ÌÀ"ÕmìrÖ¬ÁiôÈð/‹³uŸpBQmi§°r;Ь|o;¬Þ6ݝývئeZ!C;ÏuK>A.¼ù€\tvÄAvakè˜e€ ·"î' ¸Ð˵GÂIõÜ •4»{ –TyДýÀŠñç²ßn_%ïM°u>ˆPH(©Îþ6›ƒ±_fwJ ôìÁw¹ý°u†”d]ë’]ÎÍa¬éö é r.Ý> endobj +3426 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [334.883 678.378 440.282 690.857] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +3434 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.059 465.882 422.924 480.597] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +3435 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.333 200.38 425.662 215.096] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +3436 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3440 0 obj << +/D [3438 0 R /XYZ 90 757.935 null] +>> endobj +3441 0 obj << +/D [3438 0 R /XYZ 90 733.028 null] +>> endobj +3179 0 obj << +/D [3438 0 R /XYZ 90 541.632 null] +>> endobj +3442 0 obj << +/D [3438 0 R /XYZ 90 527.316 null] +>> endobj +3180 0 obj << +/D [3438 0 R /XYZ 90 288.086 null] +>> endobj +3443 0 obj << +/D [3438 0 R /XYZ 90 273.77 null] +>> endobj +3437 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F8 504 0 R /F13 540 0 R /F7 505 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3452 0 obj << +/Length 1997 +/Filter /FlateDecode +>> +stream +xÚíZ[oÛ6~÷¯ÐÓ&3ëH݀®X‡Ý€nÍöҁl+±0YÒ$¹iöëw(R:’wÐ }²,ŸžË÷}T„½[{ßϾ½š]¼ ˜¢0 wuã…Ø“A‚ïjí½ñ A|¾ cÿ՜`?*·Ñõ«9Å~žÞoâu]ÿœ,˨¼¿¼ü6ÿ0wõãÅKBI pX¯qø̘8‹ŒhgðÃÕ#^(˜àÎæ› ',l-^¤QUÍT`ÿjR?ÞiTÇæÎoñM\Ήòãl·B"”O×Ngß]Íþšpƒ=ÒdCH$™ðVÛٛwØ[Ãý=ŒX¨¼»ÆjëqÊà3õ^Ï~a›Y<™a" ;‘4@ÒÒDû݇U\ÔIžU—Mû^.^†b¸U…$½[BU½¾¼L²9Çþû(MÖ×Qy»ÛÆYí8¼x)ð°Ú…´MÙÕ¦ÌçTøwÙ|Á‰ð“›åáÒ\ @öOÖq–o“,ªóÒØ:ރ©® Ie¼þÃ*ÍüÍô:‚#ÙE–.¯ãÅØš½Å—qU ¯FÒqÎZÓÝ´G‚To.‰‰2ÊÖƚ‹¹`Í°èZ¾o1fc¹ƒX»=ÕÈÈÃå¡+8îò•¶c× ”²‚Y$Ù*ßQ,Sû›Î£þÍ#a ± KÑûhlÏ0\¦‡»JiY^›‹È|TE´ÚÇFp3’(Þgr2'äXN +Ig„FfÊÀGP*Bù:ìB qb¬nAà!¼(0 Ù!Œà]3×÷EœE[ÈF° ĒV",*ºÊht͓µqùÑX ©: µÃ5' LÈ¡¸T\^ÖÐ × mut£Bºã§QQÅ×ÈÉ­í=ª+€;Ûa»ÁacŽôÏC_ q1’Áýˆ >œ 5Ff …vð&ÉÒ$‹ß4ü‚H‚¤ ô +¨%‰çMþìpÖùÈÈqŽ¨b˜¸ÓP¨ÞرpÝ¥u7óͧF£]d·6®Ml Gógyk‰ô·ïgÞcݲ0á0“ýy×wqœáI½œN\ˆmqÝ-U€””{w¼ñHå`Ҁd÷À &JAÃä'JùC +q»ŠƒO&ñ +r¨I£\A mÑru¹‚>!W‰§¸ƒDB”ŽM>$ íó_îêÙÑU'à†R'ðŋ2èù‚!I”Ëw èJ@”` Ý>}‹=-cðc„¡Ï_A%¡ëv™Þp<¦4¹‚ãBøp +U%â½j®‹©À;“¯G&ÐY¸pïՑÇPå&¸ü?RnôEÛ̧‘…žI<Ÿíä#ÙøB@Ú¶³0XÇ剌§@ÒAh“Ìí¤ísS£%À„-VT›}Á€8m$D×FÛ]U¥¸¡ŸåeÜvCVG‰VCce ôዞë4•'m À …:q)`ÊLeN"ëÂ|®WŸÏy¥ú÷‹<É væ'ÉæfdM;Üjî¾×’"*“ÈQá÷ªÎK37ð³™1¸›í¶K㑛ÓÇlÍ`ÆA’öêüOÝAqƒ `®ÙÀ!LAàÞ®2€œÙ˜¡‚-%\r‰Š"½ü wãk¿Õ›”º€F{ ÷ÞÆ«M–üµ‹5Ržf`Û+əT" ?ËÄ)™ÈžP&ò@Lè’6uPiAÈlÀxÓÁ1‰°üØØú'~û{„>>Â^ÇjÇS:¶ÕŠ„Csï=[8¢qì–¸ vLâ‚Í1«öî˔#bõ× +Äp’ž*h×Ǩ†¥«à˜†å «h°×ŽCа”ð´l × -@}ю»]0©@CR·3ÒhÜ·ËàŒòQòY½~úêU¢^ÙYÔ+9Q¼òÿ³x=A½JW»pb*{°ÉAöZ•Ò"FŸÃæªQ²ýtvÓ`3˜ÅÌ<ê¼X4懃6˛ ¥‹>“’;D¬oÚSBÎ3jµqvѧÑñÐ÷úT}֜ÿÍɟRsJ9­9%åG$ÀlDҁϏ~4 ÒãðFÜU'$…‚ˆM¦ÉFpÝ)NÐDîýs·Qwñ‡ºŒŠÊuí%—ŽÄãʟ~'‚Ñcâð¨Ä#’y/£" )NzP)9ó;|¡/K “úúõ}Íiò0ºƒ²öYU#«D ýÕ<…3µ#) ¹æa²WÈÿÆóQ¦¦«/Ø€DèY~¬yAµ$ âOYñ§Ž©=eÕ^¬ý ;ûìS­Žf"¾yî-ïÍg”V¹¹Š³›¼\µÙ¬ŸW6¼U×/6ðV|8 C¬?J®Æ@[Ÿ9ï‘݈$ýE«®ÀV;؃ã +vVišoÅÏÒ>©‰ÒtNÚ}ǁÂù’Ðsùé|ûo$"‡D=ö…¤æ$X*€®dʾâ%BPŽ¼%Z»ÛWºú«í׬ÍW‹ØæËïU\~9·Éù%ÊvQÚÿ£Æ4fÙ¿!‚‘,ó òØ· ivö§×^ý4kÒ×ÇK”D w ÜÔuqyqqww‡VÚeIQ¢¤¾(Šô⡺x!Ã7ŠnZµÍÛ¾HtÇn›¶ÿ{º•? +endstream +endobj +3451 0 obj << +/Type /Page +/Contents 3452 0 R +/Resources 3450 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3411 0 R +/Annots [ 3444 0 R 3445 0 R 3446 0 R 3447 0 R 3448 0 R 3449 0 R ] +>> endobj +3444 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.526 619.579 322.446 630.483] +/Subtype /Link +/A << /S /GoTo /D (main_Time_Elapse_Operator) >> +>> endobj +3445 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.526 502.635 340.17 513.539] +/Subtype /Link +/A << /S /GoTo /D (main_CC76_extrapolation) >> +>> endobj +3446 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.659 431.294 268.34 442.198] +/Subtype /Link +/A << /S /GoTo /D (main_Widening_with_Tokens) >> +>> endobj +3447 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.526 302.396 340.17 313.299] +/Subtype /Link +/A << /S /GoTo /D (main_CC76_extrapolation) >> +>> endobj +3448 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.062 98.244 276.047 109.147] +/Subtype /Link +/A << /S /GoTo /D (main_CC76_extrapolation) >> +>> endobj +3449 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3453 0 obj << +/D [3451 0 R /XYZ 90 757.935 null] +>> endobj +3181 0 obj << +/D [3451 0 R /XYZ 90 682.316 null] +>> endobj +3454 0 obj << +/D [3451 0 R /XYZ 90 667.779 null] +>> endobj +3227 0 obj << +/D [3451 0 R /XYZ 90 565.373 null] +>> endobj +3455 0 obj << +/D [3451 0 R /XYZ 90 550.836 null] +>> endobj +3228 0 obj << +/D [3451 0 R /XYZ 90 377.088 null] +>> endobj +3456 0 obj << +/D [3451 0 R /XYZ 90 362.551 null] +>> endobj +3229 0 obj << +/D [3451 0 R /XYZ 90 172.936 null] +>> endobj +3457 0 obj << +/D [3451 0 R /XYZ 90 158.399 null] +>> endobj +3450 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3464 0 obj << +/Length 2361 +/Filter /FlateDecode +>> +stream +xÚ½YYsÛÈ~ç¯ÀSV™£¹1PR©²]«M6G9^%/^— +"F"jA€@S̯Oρ“ e+Ú<Ø =}÷×C<8øqñîvqu#Y£XRÜ>1"I $¸MƒO!!ˆ/Wc~X&Õ6¹û°¤8,óãF§Ur÷·ì¾Jªãõõ»òiùùö§«B‰”HHçY†t$£C F´#øËí¿g¸P Á͟Î0aqKñ>Oêz¹¢‡·Ë˜†z»Ë“F»úAWK¢B]¬a+&B…„ ÃtñÃíâ˂k ¡ˆ‰`½]|úŒƒö +0b± +–jpÊàoü¼øç{Ëâ³V1 ID%"`+­7m²Õ®êk+ȔÓÕM,†ê*á8XÁ_,¨cs}xu#ðгˆcњç­3Ä=xÌ>4›¤q6èàΑ¬ýh»¯=ш1…Qám×eÑ$Y¡S·Ì +÷%šB2Ä$m¿ücæý:T”£X‘–¦Ùdõœ Å šXad¶‘àOø#PÌ}Œ¯ëKv# Ñ^€Û×¯>֍޺çò¡Ó¹n*кñ¡·¯[ý›ÒÛa»«Ê%áWóŸn­ïYª;“sžQÅIætñöÙ]T…B(wî|[À9 D¹k²²Hr³âá®ñ!;ì++5l&žt_ÔÙ£v¿.©€¨Í’û\»÷uSVYñè^;­`·ØoïGîL{‰)!ŽA–÷ šòW“ +º¨ù/X`'„p‘{Þ¨°sØhV "Q AP,„Ó.Ùíò£“Å[ØƤuõèóû㏋àSoùŽü5›Öo@CÃú¯R'GO¨×›"û²× 2™úmTV#I!©@’ÇNÜžÖÚúá;³?î5®›ôúòŒƒa“¸!6Á%ãÙÃLÒrˆ:Î_;ißÌ0H°î ã 5`é !FTK³žƒp¤TÔ±©´Ó=ÍÀt58d•ër»KšÌEi Sí3>’ ÿ¾ãL_*kÇ4±½bœ"…Õ8¨¡ºd릭¨úËüÜ—R¸¢7 4#É @+hq}CG qá»zÓvÆӞ«€0f—7”RÞUþæ¸Ó´°åJDøL0`øbÙhgš¯&ùÊ,u<_Œ@ÂD^D £SÏ@èVJ]’}dŽëë÷ï#y·òîT EdâÎ"©, )^¨>wZ À:›Úg;Š[žÑR$âøÿŒ®~ç(Æ% £(ždëˆG(ùº!È\ò¤h—ÓŸ²"‡0ÿ<“APù„SWâ’úö÷֚‰@"Aߘ­^¤Àÿ¥z ¤ú2h{9´Òõ>oܳéu~¯í‹fÙB¡Ñ‘P‡9¿Xì"(vää¼äð‡Î-ßR²é·(Íz¢ÄkzЕ—'/k¿w<ßqÍ{“+mPÐ(°+¡AµwٍÀ»„û´‘}kÏ֖¼¾Üi1Šc9n´/„Úä;‘6ï‘öEÜá³z +,Îáq‰h_È.àñxÒ[fb‚™T{­6~|ýÂŒZ*^ }È+!ÏBÓ]g¡…y…¼†Í$„ÈsÐE"E—á—j \ &.—ýB‰éNHú²Ñ×ljӼxk@ À‘ƒÍ2»~€ÝuRû§ ¡àÝwK3Šè*ZY¿1ë¸ÿ2±}²wêÄVšï±à¼±dßX2/æV'Eã…,݈S6þT¼ôƒJ¾oõ³î;…À*+z5m¯§f´'tÜëwà`ò5+÷æpªÂ¬1ʚšË‚XïŒÚŒ™¹¦ÒI=„F Äë„`ŒÒ^.§5< µZé‹ õz_UÚZhGº)«›{2 føéiƒ"qEåØ|©^WK…`-§ú@id}žÃùKZ6×=n<[qÁÂ?›5˜œ‘vAË$Ïç²ø ܕÞ'dÁpå¸íŽ=´g ¨ÅúŠ{ÈòÜ —é<ìƒe [FǯHMâxÜŸž+ +ÝÅB K†·ÝKçØ®ý6E‡˜,Bý͑Ï-5šÓ†¸“9& ;îtŸ“{Èdv˜!4¹Ÿf¢ñ4#Ãi†2y6Ã\Sù l&˜N3†çK§SÝeEƧž…üXFß1Í$izWîFP?Rl’§m÷©ï ­Ýéí}{er£{{gÌ;7DÞ#ýпKW#$ŠðtŒHÓz®Ë0-t"Ûùä+lÁ?Lº²¿4=ß>X ՓŒ,ótrA ¿œø[Ï\nòŒB[ðhX¼&Þ>{çHO®O»;ÁAAšÚ¨Õ"ùÃ0Ç  ªhȒӁ=8ó‚µ/·@f¯a§Ù”µÿrãn# ±¯ÚÙãFÛv³"u㊽¹­…íeÃOFR€ûLK禥gëÿċ”B/ÂÔݦ¹Žn;qK¿lÔÆã³æR2´÷´¾G»ñý³%qÛÓUäUrt{ëÉ«}᱘2p¦*÷›vá¿êՃÅÈÈ°vöE'ŠNM·%qxcÌ°oF£ h׋íí«¹ÖuQÝ$UÓÝÊ>Tåv’÷m‰£$ÑÙW‘wÐⱁ”:b6)„¤«•= $Š#¦\½! ÆP/-I| ‡°uù ÁÛ)´ÒgU: ù7ņ ÛÇ®QWŸÓŸLîý„ýa€Á¸®ÚJIðiëØ àk抺‚Šgº0Š:{>ýai~F(= ´ þç”9åHəŸ¡ucx™ùtžñ§‚P>3 šs¤»ãg9`ÂNM +‰€†µ¡ fãmÈÂÀEãí±Âa¥ :ÙYäæ> endobj +3458 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.659 661.123 268.34 672.027] +/Subtype /Link +/A << /S /GoTo /D (main_Widening_with_Tokens) >> +>> endobj +3459 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.011 531.827 513.996 542.73] +/Subtype /Link +/A << /S /GoTo /D (main_CC76_extrapolation) >> +>> endobj +3460 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.806 476.294 144.406 505.236] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3461 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3465 0 obj << +/D [3463 0 R /XYZ 90 757.935 null] +>> endobj +3230 0 obj << +/D [3463 0 R /XYZ 90 594.597 null] +>> endobj +3466 0 obj << +/D [3463 0 R /XYZ 90 580.027 null] +>> endobj +3231 0 obj << +/D [3463 0 R /XYZ 90 342.1 null] +>> endobj +3467 0 obj << +/D [3463 0 R /XYZ 90 327.53 null] +>> endobj +3232 0 obj << +/D [3463 0 R /XYZ 90 143.505 null] +>> endobj +3462 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F72 471 0 R /F23 340 0 R /F65 376 0 R /F106 2750 0 R /F8 504 0 R /F31 472 0 R /F7 505 0 R /F1 542 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3473 0 obj << +/Length 2809 +/Filter /FlateDecode +>> +stream +xÚíZ[“Û¶~ß_Á§VšZXÜA¬ÛÎÄMœišÎ¸ö&/ŽGCIÜ[‰THj×ú÷=¸ð&BÒ®³îä¡‘à!p·sqtáèû«7·W×o%‹4ҒÊèö.Ò8R’ AIt»Š>NA|:#ãÉ»)Á“¤Ü&ówSŠ'Åæ°NWe2ÿ1[”Iy¸¹yS|ž~ºýáú-!½‰”HHëÙ ÿìH‹ŒhKð÷۟³P Á-Í_OLÂtCñ·MRUÓxr;Õt’nw›¤NÝÈûô.-§$ž¤ù†4ñ„0i&½úîöê×+ÓàˆX4„BŠ‰h¹½úø G+ÿ!ˆé8z´TۈSÿ›èÃÕ¿®ðYd)CXŠYÄWÞºaq,| „šCxä­ìõa—æÉÖËä <%CšŠ xÜ.ú`6¿ÈVnÎ/U¡‘f›{²ðäõº¨R7´NŒ½>dù}ó¨yÝ¯Óªv£Y¾J îŸ-ø•£°ûÔ¥Ç1»ÿÊ\±Éã:[®ý+ž¥Uú Æ4·;oø:¸áÄÝV‡ +|Ÿ-ÒÂ¥5L¾ŽVîf•Ý™uÁƒï]¹AËü7‹Ã¥ã. yRfÉbӐ—ûñÀÉ0쪥–êI™÷˜uàF›èaßËJ}A|à©£ñüù“îO5¯ÝàçÀ.ÆŒ V˃‰¶éŎ—;ŒÙ׈úö¥~&ÿ‡0ÿ˜ÑچªKž Gó¼:†Œ +Aã&Y¸äŽpZ֍-tJ3ŒÙÄø2:>È0Í趗ûÚ5¬k×T5 islâšÜE¿°ƒߤ¶×M‰Úö|ëª}(>šñ…Ò3†»âÓ­YÚ.Ϊ9ØR±é €KvIY÷OSJ·ñý‰6¥Êtª23}­ô¥¤X J³ã~á.ã56DÆƗþŠ /.NžŠºôè\ã +ÂÎ&º†—™ó‹È ¸çóM£Áª'šF@#ø3NEÝ ø¶0\[AºãQ˜Y_l‹ýlÎڛ³–ù‡Ô;T +ârwZóE:/-?MÉ´ +`É®ÚúÍǧTÄñÝ/êû^Ò¤©†Z[1^fÿÿl²Õ<)ï÷[SŸÁYƒ7¤Î¥ ÞÖ«IŠœ¢—êÀ©–ȞNJ-Ê3HŠí.©³…ëÄ©¶K§&Eî‡\pýœ3ú .éƒjõÁzÂÀzÔà_Ò¶F]‹s,8˜,—jì8‡1<·‡ãó‘ü~ŒÁ"MDŠé A¾ýÿHôûŠDö[…r~: ]þJ'fHIÝ减Ý<¡˜Ã%/s4¨›~BÌiý¢9ì#«¢×‹¾æNÊ[wë sÙ5÷ü'!vÙ£R2ð‰¤ë™»d|§¿ÛÑ +õøwî¯q믇ΘB¬!O…êҕ™ßÈ{¨Úêf—a7óQ¾Ñn_¯~;}Ž#ÂøEºä uŸ' 7ñøsIð[Lå‰_KÚ¯$E¿yS€uˆ¦eÚæ$ïŒ~æo—æn½_s7?UiùÇ©ë?“Ü}lã½Ã¨2Ÿ"jÌMg Üχ´‰^N²ÿDÍÕ?®,|½n¬úŽz]×»›ëëÇÇG´¬Ð>Ïv%ÊêëÝns=Ö·Þ,„£®\½k>vÛeÚÄAÜ&ÆFøÿü²‘ +endstream +endobj +3472 0 obj << +/Type /Page +/Contents 3473 0 R +/Resources 3471 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3479 0 R +/Annots [ 3468 0 R 3469 0 R 3470 0 R ] +>> endobj +3468 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.708 272.688 250.895 301.754] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +3469 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [448.024 227.232 483.212 258.201] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +3470 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3474 0 obj << +/D [3472 0 R /XYZ 90 757.935 null] +>> endobj +3475 0 obj << +/D [3472 0 R /XYZ 90 733.028 null] +>> endobj +3233 0 obj << +/D [3472 0 R /XYZ 90 556.83 null] +>> endobj +3476 0 obj << +/D [3472 0 R /XYZ 90 542.286 null] +>> endobj +3234 0 obj << +/D [3472 0 R /XYZ 237.535 381.142 null] +>> endobj +3477 0 obj << +/D [3472 0 R /XYZ 90 364.442 null] +>> endobj +3235 0 obj << +/D [3472 0 R /XYZ 90 207.306 null] +>> endobj +3478 0 obj << +/D [3472 0 R /XYZ 90 192.762 null] +>> endobj +3236 0 obj << +/D [3472 0 R /XYZ 90 89.441 null] +>> endobj +3471 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F31 472 0 R /F7 505 0 R /F1 542 0 R /F8 504 0 R /F10 473 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3489 0 obj << +/Length 2563 +/Filter /FlateDecode +>> +stream +xÚµZ[“£6~ï_á§,®«uAz·ö!©L6Ù¤jv¦7/“) r7 ^ÀÓÓÿ>GH „eÜә¼Ø\ÄÑÑw.úμº_áÕWßÞ^]¿l• DP±ºÝ­¼ŠAœ’Õm¾z‚Âõ†`Œƒ7k‚ƒ´Ù§Û7kŠƒº|zy“n.yº¹ù¶þ¼þpûÓõkB&‰ˆ‹æëþSq&%ÑqÀ·¿z¤P‚Ç1ÿ:#„%ÈïÊ´m×Êqp»Nh ÷‡2í¤¾òVîd³&q « .%„Ça‘zõýíÕÿ¯ˆÁ+Ò£Á#1¾ÊöWï?àU×ZaĒxõ؏گBÊà¿\½»úï^D–2„·È"†81ðvƒŠ§‹a`–ÃqíÝÓAVéV&°8ƒgDMè"ž Eq4Ê<¯‹ŽÈ µ3NÕi¹}}¬²®¨+ŸQŽ’8¹¨o<Œø¤äÖEîÌ®»QO®6 |<&ñjVH¸±È—¹5æ`»E£>õÙ3~Í‹~í€ws³OÛöfr›{Yµ€øyÆÁo˜ã Î:ušœ »&Anó=Q§ª„Q>úÄa§:Õ|xD¦$fÈTÒ&$ 1uá}_TeQÉúŽ'`!I ùVÂ*Môv&h§ËUçõn6LΙuu£Ï{”ôašeu“Õ½y¤6—ûˆ×¡Þܛ˜ûÃÕê}û ÑÓcwç£tE΅VŒ’D¬@£“õfèdÓÞ8O[)ŽaHŒ"œD1Â`×:“‡H)<Æ¼@ò¯Éà%³b÷dQ‘—mWT +Ý'z™f3ã _¡@!¬aC#Ä!‰¸:tN2Îl¦~£æ˜'ƒþÎþ¨Üº_@S«QŸŠ\ÎÔÜÕeY¯)Ç%ÈuÞ¢3(ƒM"”D˜ÀdDe+ 6ëU¾«ëRe<¤íÔY×û´¨T¸õþßßׁwêٛQì‰FvÇüø4rAŒÚTÙ¥G¦™§c0i•«ƒ(¨«òI_nõ©[<4²•U's}gtubÝA…‚õ¿|}/«7}GAQ ‰^ÁiEg¦”Êç{LJ,2HÐj?á1Jð,O«\þ†1­d®ðEë Dï=§x‰BC P,éEB)J(žÕ® +³¨T0Wõ§Vß½“ú?K˲ÇÆÝÉ]ݘëm80Þ7Œ0ι<0QBŠ#îòÿ­‡Iõ«SZ³qðJ{4˜ô…0A˜¾ŽybÁ31"<ºä™ %#0Wu%ÏdìÁáLø[ˆúSm}äŠñgE3` )(d&žMàij«XˆŽÜ}úy[T_3¬ÝE‚übÜ{¬/-cîJ;»öê¾u÷§QÆ$Þ¼@z³úWÈzjV€øp+^é÷Þ7úâï/„ðgÙyK Í#éØy„ÁfÇFçìÝ%à'íÑ(™n|p[eNåTQ5懏ÞY©eœ'³Nm sÖ¾È1U…gà½Ñ8R 6 ~Üùôå(¶ŒþH£(•œ•–c®Õ§…}sÈv¡½ZòiØǑ‚¡òó]šˆ™–±»^>¡—ØWp 8 +gÚÄ~eÎd=„ s$€†÷#ƒ§æ‚Z‹q{þÝçÕ!YLg[ÚèaŽ4pë8º˜R!aâèʱI5*nìM^‡PÊ2¾ìax"z²ýš-ÇgG¨ŸˆøÐÙªò @C þ6¸Ó²õÁÀ P¢ø< ý~JaTHM-Á'¬“Á6 +àXvú¸g&ðוּ¿á RUê1 Ô¤0rUdÓ]8¯¥™¤ªÍ¬²‚MÆh“ê?Ë¿àd¿ˆb±Ýƒ: + ¡P£›ú áA2ó¬)îFå͓¦J¾ÂfCXŒ€Á¹îÙ3…C–ZÊ}²ÉÀfp™µR$U¥–¯šUAP݁aH2k|п°ñrȒÀ5½5·ørï¼Íº·í%(±/nƒà8Zì¨Y£ ý¨Ñã/hÈÏH>cÛ#R ŒÍ­ït´}UêýU5ÎÒ¦HïJééÈ_!qü”6þ®ŒÕ?a ɑ@‰·½•œ\èBÀc:Zè>l($YJ¸Û„ø®‘à”^* v²tdïO¬v@VúˆõÕ¤I1³@V7²uåô-<ËLÈÔä£\šŒ1K#–zj.NBݵÁ_³ma´;×´€¡Tœ6-4“2Ž¸Îs¡†uðò€Ü'óÌ´s´1êm€j)ÿ´æ?» +”‹¬§:îïdãz„Ñ¡õk˜õΘ/ŽAb ©k·ï?gòÐ×X_f³d’ºüæö(B?¥e‘oÓæþxvK+O¢‰!]ØUKE¬Šªe/¦Nèî°ºÄìæn1oôùÜàyD´ì\!Ÿ˜VÊê¾{Øʦ©]>BlI ƒ”}Gý§yï觨E´¯rs‘ £üJ6æªàºãQË\ßÎÒckFj°àÀ˕ÖÃR¤(sÓï`!0q·k?g™»Iˆ0¶](Þgû×´Ùq>.žÚ>Û@q¤vÖµ¨5uÞå ÎC»ý`æóg”ÄãîÓ=­ŸÜÇlÒ·Ø6" ‡8sran=§ò׎ӽ—áP³J­ˆØ=DñH ô"v#0¶ã°gNgÙfRùT&öЇyÄǖªý9„>z ‰Å„GÐÐÇÜb8ùBœûb§W°{ð1Û#‡Ï, 6ª°ëÖT.߉…‰%1%gÛå:>AÔ:!ò |3”<›ü؄sfGn=à£av/¸Œ¸^¸OgbGGb늿ƒJ”Þö( +ÃgÏt%ˆôŸn|f—’ ª‡Vuzp4ßèìMy2õzŒOgq„Kqî«ú 8" ™.þB·øcañG9S= )G\øŠsvZù)™/­üx|Œ]øóË_@`[>£ôÛ©È«ËÜlã›o†Â8<³·¶ú3¯’Õé´l·ï¤¹ì{‰ »È”otõöNnw=Œ¥É23­90˜ˆÍJÄ ¥gەä•çŸ/#†ÝÞÒk•?a]í3*Öm¦¹jP2íÝÐ&€¹Œ1DÔ*]Tþ, Ÿ ž…¢ú‹Âùg0"F ‰ŸûLÿõ Ìu¼j9ë¯_¸fMn)d^ùî C3•>5‘¥Oþ×ÊæokÎå/iuÞy(‡5/Ëìö‡‘ú&ȼCTmÒwrhŒé•}\ GÿÑ4ÓêKâv}Ë<ºîps}ýøøˆ²«âР¢»>ÊëSž9‘ûGd{òC]±ïßjw€‹ûôôu àÿ4fñ +endstream +endobj +3488 0 obj << +/Type /Page +/Contents 3489 0 R +/Resources 3487 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3479 0 R +/Annots [ 3480 0 R 3481 0 R 3482 0 R 3483 0 R 3486 0 R ] +>> endobj +3480 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [322.376 678.378 385.519 689.281] +/Subtype /Link +/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >> +>> endobj +3481 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 383.594 239.856 394.498] +/Subtype /Link +/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >> +>> endobj +3482 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.639 189.301 300.161 199.582] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box_4e6787c98290a49ce80b90c008aac5a8) >> +>> endobj +3483 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.144 149.136 182.164 160.04] +/Subtype /Link +/A << /S /GoTo /D (main_expand_space_dimension) >> +>> endobj +3486 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3490 0 obj << +/D [3488 0 R /XYZ 90 757.935 null] +>> endobj +3491 0 obj << +/D [3488 0 R /XYZ 90 733.028 null] +>> endobj +3237 0 obj << +/D [3488 0 R /XYZ 244.439 386.747 null] +>> endobj +3492 0 obj << +/D [3488 0 R /XYZ 90 370.02 null] +>> endobj +3238 0 obj << +/D [3488 0 R /XYZ 400.69 152.289 null] +>> endobj +3493 0 obj << +/D [3488 0 R /XYZ 90 135.562 null] +>> endobj +3487 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F8 504 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3498 0 obj << +/Length 2809 +/Filter /FlateDecode +>> +stream +xÚíZݓ›Fß¿BO9©Êše¾™ÍGU’ŠSNru>{Ï/Žk‹•Ð. d@^ûþúëf­?r—'Œz¦{ºýëf‚ÙÝ,˜ý|ñÃõÅåSÅg†ÅÔìz33ÁL+J$£³ëõìõœR"KÁüù‚ó(ßE7Ï,˜gÛ÷ñ:n~Knó(ÿpuõCö~ñæú—˧”¶$R¥ˆTæ«~c‡t&¥àgׯ¤04c¾ÂM=âÇmT‹%“ÁüzaØ<Þí·QÛ'/âMœ/h8Ó<2T†sÊCzñÓõÅÛ +b‚­¬!5Ñ\ÎV»‹×o‚Ùžÿ2 7á졵› Æẝ½¼øçEà,ŒZ84$M4S„‚YªÕ:ÓF»¸ŒóâªZH_ÒåS#Ûê†Df¶„k ™Sf7·ñÍ…eÛu¼îȹ|*ƒÖÿA-!em®ë{gš".íM¶qÿF;äwÎ /~¾˜½®Þ¿ZPJaÍIt»;¹Ùí¿ãUéö`•åy\ì³t¤wöQ™¹k3õ>Z¹Ûu²‹Ó"ÉÒ¢;öÖ½ßTê}ÝÓ¯cŸ¥SpI%1Âyó»(?e°%S¬kNçïL6šÂv¤ ª–ˆ×{7¦Vž5êÔC¢ÒŽIŠÎŸ`d\”I•n,ÃmèŽ@ÕݤðvçÕ`ÒS«ãqK®ˆÑt¦#J«ÝOïWñÿúHwƒG`ÕJDQ®¯®’t!0ì6YßDùÝ4-OÙØÀv´LœghÜЖ>O66°Y{ùBF›¿üÜE{}‚˜ÖcÊ{0l5¦35Ó$dº„¶Ç9›ÍY&é*ÛíÁžÕ>㻇¤¼˜Œr†÷µ$çUýÙ( EƒGYޒXÝe©›·¯¸Å#!·ä"!ç`êí:CÕ +ÁP‚Ϧe”¤€ +Õ;Ø·Å`{YؘÈáIƒ%= 5dlŒNKAõüûm‘ÙÊÖæâêÍį́¾&-­M{ßP|G9¬d2¥zê,qXT`–S]‹ŽªÊ% •òªV"´$Âh+M$Íf¯!£ôs8°"B7«¸*tÔ8ÃÒ§ÐPEc¤ò!4ÃúýhZÐMǒp)¼¬%ƒë²rØv(Cü°``ʎÚOì"I å¤¿pg–ЛEO›¥ù÷Û(¿}L ±œ€¨¶A¦Œ;¡èTä ÂLÉPËÈé—ÎÅku4ª„£ÚI­p{}ŸΏvÑûdwØÙçƒþU½Iœ©#ôð„¹gåÜ(Ä>|¿=D[û²å€SCÄ㙤m2xìn•Ô½íùE:KL°c|’ °&BAÿã ug³Ž  «]¨¯– -bZËäÄ2dä#X&Ú[5Ò¹‘> U¡%®Lùè¦S@ü¤ßLN:Útju®ÎÀ/ ^7GeáL)¢¡Ðéä½3€ ª£Ù#€ ¨„ jÔªœ²J xóՀ|È4ßðd@:ƒâ«ƒŠCe#Öô,(Äʙ+…Î /ãÒ÷yHŠDÐ[aG*ðsúÐùÐ4 +h£93ٙ˜)Á|¡t˜©>3Õ_˜ùçb¦ú¢˜ÉÇ13ôÍÙ1ÌôN›e[+ïðŠ)Àô3Ž¦3 ß6Ã5?ÄyCý+•îae²žï5Ntƒö60(&e¯h謥×{¨pÓYr-¹!ÿR±ÚB½¼‚LI„o8É?fñü˜­ŒÓq@FÝM¯îH—äóÈ^O™äsr`@ÈÖåÀÏ6X¤H_õõKx°ÓUŸÑa§îCij¨Qm¨Á7Nx=¤•7aëGÝÆ[ … %«®B €Š[z>ì ¤°&#n¢mÁŽ!¡'ßÄ6ÈþŠæIÛeŒÏåŠñª—ùap + Ñ,Û Vý¸K¢zÈsûœòT› +PÛ&¦[˜¥Siy¸KC =»XO +Y­²»Û¸U® Ë9 )ïzÖoµº(qé§{6Ôâ ܛÔR vD%=úÄÜ7*FGœ™rXÅçÍ(¶NœŒ¶»KQ_÷š;:Bá.¨˜Ò±Ûõbu¾†IšÈÀ§›<Û¹Çýaj^$?Ø÷֗‡ü…Ip½n£ýÜ°á‹MØ༂x8æLñʓ=È8›ôk­éi¿æÞªŽ57Ø1sV¶Ì°¿2E(;#†CHåýÑö»®¡ØØ`óÔp oaÆ ÞXÁ6HDÝ­€'N…ªg +?+‡êaGeC>‹íBÂtÏGF|7ìêÆxm‰ê¾‚AÆDóÒ*7ƒŠ‡t¢S`ŽAڌÊjwüzhŒ&ܧõ1hÔ}T`N»óù;±Vù¢HîÒÚ¾ÂׂÎã•sÀªênžCØBe#§/Žߣ’Dt}M„W®8¬îëåFeoá«(ÍÒdËmÊhŽå¨èI­Êá;\´C&ývh=øÍÓû€Göªq®\O]Ö-y5¿Ëc(°ºÆÇ-oǗŽ¦â›AW§ÌcÔ)|–„ªöWUh{…žÐ(<÷NqŽ®‰S1I­pgoLrøx“å;ûƒŸ¸ǀ˜Ta—di• ZÅd·8€:6d§½KèIçš ºÝr¾°z‡ž×uiÍhw»º­̀Y³¼nÇÏ ÃgÖɹëJxŸI™ “Øu<9þJŠ'tï+igê-ÿv@¼o,K‡cÎw‘nc§î–Òäí!®ÛÐ{¨$ês(Չ›ÜÞü'Î3G¼˜RÉT—y}ŸÖ×1–$Žª³;n7’ZTm¡ì¶ù?ֈ "§èS‡)Ö¢m¬æMÿ§î9¸'ÍÉ3#êXxÒ@þ9‹ \Ñ~±’ÝŽ…þ’ y¢cÁÔäù<Í{ ùñ iÚgpƎz¯?WÈõ#;‡ý¾Ý­@ÆhþêVüßw+”ÑSõïVȳºP‚Þf˜GêdrN·bšá~r»"ôœæT»B<¦]AÏ«æÔt»¢wÞà×­hzóýcÆ +¨7 Ï=e\*†™ñ\'ݹmD)Eï<ïstDW÷³†WûÓa¬ýñ¯"Îÿ¶°%ö÷ߣôÐþÄn=.÷y0 ˆ°wX¨Š¿Œë#!V³?fõݯ•-ýzi¨Ûlõ¾,÷W——dU #ûœ$åå~¿½<þ¤Ñ’4Ô#|ÃQvYÞ|B;pDìÿ_ïkŸc +endstream +endobj +3497 0 obj << +/Type /Page +/Contents 3498 0 R +/Resources 3496 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3479 0 R +/Annots [ 3484 0 R 3485 0 R 3494 0 R 3495 0 R ] +>> endobj +3484 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.502 704.958 241.69 734.024] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +3485 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.635 631.459 163.823 642.363] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +3494 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [486.549 568.006 513.996 578.91] +/Subtype /Link +/A << /S /GoTo /D (main_fold_space_dimensions) >> +>> endobj +3495 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3499 0 obj << +/D [3497 0 R /XYZ 90 757.935 null] +>> endobj +2878 0 obj << +/D [3497 0 R /XYZ 213.427 559.204 null] +>> endobj +3500 0 obj << +/D [3497 0 R /XYZ 90 542.477 null] +>> endobj +2879 0 obj << +/D [3497 0 R /XYZ 90 441.709 null] +>> endobj +3501 0 obj << +/D [3497 0 R /XYZ 90 427.138 null] +>> endobj +2880 0 obj << +/D [3497 0 R /XYZ 90 326.37 null] +>> endobj +3502 0 obj << +/D [3497 0 R /XYZ 90 311.8 null] +>> endobj +2881 0 obj << +/D [3497 0 R /XYZ 479.157 171.728 null] +>> endobj +3503 0 obj << +/D [3497 0 R /XYZ 90 155.001 null] +>> endobj +3496 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R /F8 504 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3507 0 obj << +/Length 2538 +/Filter /FlateDecode +>> +stream +xÚíZmsÛ6þî_¡ûÒR3Œwnr3mÚtÒöÚ\êë—\ÆCKÍ‰Dª$Ûÿ¾ ‚ïEù÷zsùbƒ4¼Ü]ì>xv<»™áÙwg__ž¿”l¦‘–TÎ.×3g¡$HP2»\ÍÞ„ >_ŒqðzNpeÛèêõœâ Ý<ܚU]ý_gQöpqñuz?wùýùKB:‰”HHß+>sSz%Ñf«Ë_=R(LÁ͜¿aºžñbåù|A.çšf»ÛD…qoޘµÉæD&YÂ+M„ +ÓVèÙ·—g¿ƒg¤ô†QÈÄl¹={ûÏVðþûFL«Ù]9k;ã”ÁïÍ엳žá®gx–2„¥pþh +Ÿ·âaë 7£''DLˆzBqkM‚Õˆ“ÂdæTÑƽY¦Yfò]š¬âäƾ"A‘º?ÙÿrÝO3ð  µè÷žo ¤Ã°ž°(n¸|-+5VñÖ$yœ&h¾`˜¯Ö5C‡'ÛçNv’npî“•Y9›ÖYºu¯£ëtNDðÁþ0_Øw2ÈcX÷÷÷Ìû,ñ1¡‘¢³»Õò¬£Mn<ªQ˜ªT­[i¦ ~fwq^~–ƒGêµí}Gr¤p¡ËMšƒ‡_`)ÙXÿ…GÈQ²žxD(Äx£c”¬|«-„v=g5)Ä.SÁ:ÝlRfwù…O3‰Ó&*ÈUÙ[`m½V NE3ŠDØüO‘í½«#U¤¼®ä•YÒìw;@€rXFà—{J}»`„"¬u?BFW —Õn(Çv1`À›?:£aà5Z DucÏXL‚kif¥u0~é[ † ÇÅd2vdÈ«! ’D™©ŒÏóø&©]Qa+±Ë&íÉr\(¤™˜R™¨<؅¦T”š ù~y[k=}y°Œ’4‰—´ ‚܆lY´,=ª0օøä¹O¢dÍ2µP^mi% \©ƒ‰ò ëÐPº¡7® à^‹4¯¼€O$mÁ®´—‚/5µö†HÒÊÞ¯’êë€ÌÿƘºU¶:˜ÛÈ҅qZiWF¤×E7óâµ/и‚ÈfǶ$…¸Ô½Œa7™Í>«UÊÕ˜ßöå.éód½™‰ÎfÖw!í±ˆÎâéÌ ØºE¥â6Î}ÐÅP›éÈCpL1€@ÈwÍ[‚ÖP´—Ylš ùª^û7ÆRŸêáå>qY>}“.÷`dÕ± + +Àȯ»â©>PÔ<ê0˜B8¡Çh)Þ,Uñ°3I´µ®–t„ôÁ†É }¬ÝÅ®Ótã䥐Q‘fϟÛgë"ð2Mʁ?0UlÑÂ÷³±ïÉIªÊ(9]ëÏÜ -ú34n¾sï‘aCŠ¶$a!¨&-äÒ)|zx,¤‰#††ML )þÆ6ãäæê›8óãw'ÍWqæWю>¦i 6Šõ1íp‹}aòYÈڔv/l +×=ÁD 0'HóR¥Š®¸´¯ILqgŒïüȦ|¨§¸•>[ÉcÜʾ©a/v~Û í‘ÁW@y™$Îp;èn_´–Ù§qˇ”Šc¦iàXbÂ4 ¬Š3­'Är°Rɺ‘láNi`-ifª¿ÙŽnù{·ËÒûxëú—å«´²>.ªß‰÷d…(ðØ–7­ræXu l.¹5Æ;»íÞ/»¬Ó[øôö‰ÓZ Í9P+v;,û™ryÛPó2H:½î~î Ýíãç;³ŒíR5-ÿ_’`ÎÀ¡ìaK›Ãó f‰ÁyÃÆîՊË2×Kµr÷¦loÙ°™ušm­ZöqŸ—ávèʆ,Ž ü¨þËZl[jáFÝÍ}|' ‰ƒ~p°Ô¡6—s…Ë \°Ã ¼¢ €žÞ£×vc·’os§þA v†q%P}p…°Ôޟ°ãvLa‡ø_ÅÞÁÆÕ;ì›;ì ÂŽ9 ¬föMv8€ûªŒøíàÎNƒLaµ!¶W™Ê€Žâ”—rx[á£ãÇAW¤BO…(ž²)UE}ÃË=UՑgJڙ Æ(7FBLsnÙ/"­ÀÑ"²^%¬€Ð V©.0  +ÌÑ " $§ªHÒ^¹j«Hñè*€€ñ t>5RdÉöø3;¥ÍCÚ"‹…ãmž°‰i/ŒY8$“ÊÓ <åô¶5ÐÅà-¥ƒ+%c×+‘Ä“G$ŒM!èÉsVÊØÉÁV}¼¤ ùdIIo{iGJÊp ·Å +`àӗK¬fŠí{d[Ç(öŸÉfÙä eÓIÙ¼ÌfR—Wº˜ú/–Ùäcœa<²Înnõ/K€pà'Þ ®ïKøS՝`þÃjìµÝ¨íUëê±¾kí« ×îá_¹É>· Û¼qps¹É:Þ]‡ÍÚkLÙþ´u?r'-¿Sé,{?«G?œ•ÎkõµÄ—µûn‹bwq~~ww‡–9Ú'ñ.Cqq¾ÛmÎ{nXmOuÃFȺmZßKˆ˽J^vàÿßé|ß +endstream +endobj +3506 0 obj << +/Type /Page +/Contents 3507 0 R +/Resources 3505 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3479 0 R +/Annots [ 3504 0 R ] +>> endobj +3504 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3508 0 obj << +/D [3506 0 R /XYZ 90 757.935 null] +>> endobj +3509 0 obj << +/D [3506 0 R /XYZ 90 652.848 null] +>> endobj +3286 0 obj << +/D [3506 0 R /XYZ 90 630.537 null] +>> endobj +3510 0 obj << +/D [3506 0 R /XYZ 90 630.537 null] +>> endobj +3287 0 obj << +/D [3506 0 R /XYZ 490.972 565.828 null] +>> endobj +3511 0 obj << +/D [3506 0 R /XYZ 90 549.101 null] +>> endobj +3288 0 obj << +/D [3506 0 R /XYZ 484.995 486.429 null] +>> endobj +3512 0 obj << +/D [3506 0 R /XYZ 90 469.702 null] +>> endobj +3289 0 obj << +/D [3506 0 R /XYZ 90 422.498 null] +>> endobj +3513 0 obj << +/D [3506 0 R /XYZ 90 407.928 null] +>> endobj +3290 0 obj << +/D [3506 0 R /XYZ 125.554 197.359 null] +>> endobj +3514 0 obj << +/D [3506 0 R /XYZ 90 180.632 null] +>> endobj +3505 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R /F95 1788 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3518 0 obj << +/Length 1892 +/Filter /FlateDecode +>> +stream +xÚíZmoÛ6þî_¡O› Ô ß)vCµk‡uݐµÞ¾´E ØL#Ԗi|”`DKŸvh¡ ‚K™G=J˜.$ž¬ƒÝn6§O3M§f³]©É{^š+“̈?5Ѻ4þ”pl•Nž.&M¨ÁÉ¢!RLxËÍäõ[ì­ ÿ¹‡Ó¾w“ImÍÌrö‰³yk’«8Ùfíwaô®åV +«7¶“¿~˜Qÿ—kÓ5 ƒ8-'MºÙⱡ}С†Ãz 5%¤K‰D“‘…%‘¯dMí³†4bÚ·9ã¤Ø‡EDó +ŸáO:ŒN œ;DP¥arÒ! ãå¼Lo·& +60œËCã¼ kÑèFmÂ$L¶­3儻Œãu®Ðì—ëpe‚袀Á @ôð]”ÿü üäÚ,ßÛ¤dVs7 a ÚQk¬íßö›K“t˜×\¯™‰ *Kûó(X Szúôcj¢|:W_$ÅpyÛŠ°„ýTþor -šþ6t°úL;$¶%,9 ²‚M»´<ÂþhôH‚™ +Æ²×AÝÊc vM’>ùƒúsppÎ x/rläږ£9«(°¸_ÆûhèxñcË åŠÔx ÝmmËÉÀ""]€Ã@KE¯ceõ¶µæZ# +¤¡‘­ždXov-/t‘Ê +r“%£~r#5‚‘ñ*ì¬†È à†òÛ9 уk¸gy%Ü9ºcðZsŒ°!ÇC¼J0ݎ‘jÞö:&ˆr¬¡$cÖÈk£””¬ÍþV8Ò&Еðʲ6ûÞÇڔ@²r-9ƵL_?µ‚ÜÇH¹ ŽckÙr[9°æ‚`pqƒóûœ¤H0ñ¥38^cpÜ'-g{2g5g_ƒ³Í&S˺¬ÇöiéCÞª§ñþTMT‘¢â §ôe1óq–ª;LՎ,0€tFx“,œÛ>#bڕƩ€­Ðo„ ,³Uo2ãŠ|Þ(Ò #­¢ñ„#w«÷[8b{2± ‡#32µ–Ù%¶Ù‚ەí!À3‡Û:J0…!¼’(l·2ÚO{±„`$µ¾g,9( ²d¡hT„ê+Bæûå®ZþfkBʺDâ>¢ POÇj%YáU^4Z…Ec9>¶Íñ) +JÆÔAAÙ;}Œ4VcU#Áê°jw® RŒD¢ö©ž¢JVPÔW5ŠzQEª¢ +"ÓSTi<ŒG¡·¨ÂŠŒ:(w°¯j¤æsCCáVrD77ú6³‘©•1 6ÝÌæZlf×´ôx¶k‡KHÅGKHŠxµ‡>PBª–Þ + ¨ÒöBêŒîÉ5tÛÀøìŸéf‡[u÷¢›Žêþ÷e5ƒ¢—b +¹Ôînëÿw]}bÄ'Füµ2âÓÙÈýŸø÷y6¢Xu6m›V¨ßè;ñ¦zäl„·X®Õ·¾£ fÂô¶ãt$zOG`þ‰æ^Øépät8òYŽˆ¯äp¤cHTýÂÌ 'Á< TŠùVB"H’sp©,ú»R†TD¼šÔ±ÜPaðñ?¡†ò®Ô(ƒK©!c¼'\€J±ãÂÅ­¢^Mªvÿ>>. %U‰Ú}ý†NÈ0~u_¿a¤qû†5ù&²º}Ãr¾É˜8¸}Ãr¾iÊnß°~¾éCh©¾}ÃHóò ¤›>x)Ntóts9òÓäð6}­Ø4tÄüé‘I|)ÈT^Žmß±•>Õ?öŠmqµ¶ZC Bh$D£Ïíò·7–Ýkqe9u÷–ó—?v&ùv&ÄÔEâ× Ú®@·ÕÔ«Ê$»2d0Š0ê–$¢™=ý™¾2Æ9™{öÞ+Z¿L²VöÚ[­ —Á¹NÓí󳛛´Ü¡}n¦gÛíú¬¶–×ÄÒåR wnØ&.vÂÈ¢y6ÌñÿÛUh4 +endstream +endobj +3517 0 obj << +/Type /Page +/Contents 3518 0 R +/Resources 3516 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3479 0 R +/Annots [ 3515 0 R ] +>> endobj +3515 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3519 0 obj << +/D [3517 0 R /XYZ 90 757.935 null] +>> endobj +3291 0 obj << +/D [3517 0 R /XYZ 438.998 675.861 null] +>> endobj +3520 0 obj << +/D [3517 0 R /XYZ 90 659.134 null] +>> endobj +3292 0 obj << +/D [3517 0 R /XYZ 125.554 448.565 null] +>> endobj +3521 0 obj << +/D [3517 0 R /XYZ 90 431.838 null] +>> endobj +3293 0 obj << +/D [3517 0 R /XYZ 438.998 298.052 null] +>> endobj +3522 0 obj << +/D [3517 0 R /XYZ 90 281.325 null] +>> endobj +3516 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F65 376 0 R /F95 1788 0 R /F13 540 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3548 0 obj << +/Length 1908 +/Filter /FlateDecode +>> +stream +xÚåY{oÛFÿ_Ÿ‚À) Të}p¹dz9 uÂ½Äuµ¸" šZËDøPIª¶¾ýÍr—”H­dµ×¤¹;°–äpvæ7ï%v–v¾|=›œ½ +˜¡( 3»s"숀 N‰3[8ï\koJ0ÆîµG°Wy<¿ö(vËls/U<ÞVqµyþü|ðÀ#¡[ޔrìžgq]ë卼“í3Y$8Sá3—øÄ{?ûnr1›ü:! vH+ +H0î$ùäÝ{ì,àþwF, +‡–*w|Êà7sÞN~˜à]µ8©EÂ×j½Ì2oÊüÐMÊ|µnâ&-‹Z߉+©+YݕUîW.ôuK½üÍ£HÓø6“æÅòNÿ6›•áp~/“ +5¹˜_­ó[P´<{EȎh Sq»ìïšb <`àGÁÌÀ/_} [ê^<6²XôüçSõ¾3e£ Šœ)Ø/âFéë2KpwcƒrÄH/Æ?ži‚ïL™B؇_Š0¦½ùð'j@ô,n¤E!ŸÐƒ (˜‹8¨},U°è+Ç÷#I k0ˆ•àrö“ ¢!#drŽ!í±»-ËL3Ìæiñ Q¤Íf¾Hë&ŸßšÈG4CA˜¤KƄû æø$"`l,Ä1ä`‚Åևʃx´çA&†ÓÄæ%„Hÿ 0v¶z¦)ÀÁï)* †BÑã r +¢"µ¨Ì×å£E6¢ùìt™°$O*œ®à£…DH­ +j߈¢Ø¾aך(ÀáQ­1âŒ=¡5F~$Žj=àr@kö«Ö:[wZsá»7åºX@Z“V¦‚"Ÿõ1¿H+»A*F|· ŠÈ*¯@¶êÐä+lᭀ ÙãÍvx“È›>ÉRI'筁w•T™yñޒû§,ˆ…œ>¥â¡~á¼­Òöæޖԡ€ó Ï¯ s *Š‰üÏ7ò?x_Ĉ³CÕ¥S½ù­l¤,,: + :ú£Xð‘ô P$¤`äÚ&ô Åtž¨8¨‘ûRu Ì?Ta_°ÓàâGà‚T(¨³Cµ…Km~.Šø6¹ÙàŠÃÑpA¡&á1¸€IŸcÓZ µm­”‹¶0nݔ•4Ïâ¶&BǵZUåcš· ›~Ô¶]ð(môuZ4¥M¦ ¥ãªsP(¥XË®’ͺ‚ÞpŸ£‚–}•jªµ´ð„¦3Ú6_iÇð!:)#Ãô~x#†ٖ“»8«m;AÓŶ.X‚Ui-/`Wh¤µ+šg÷&z ­ÊD#ª.¢]D·‹êêVj¢¾^É$UvS=r‰‹ƒ+nksŸÆ‡N+ Æé(†(«>Œ¡¶{W› »÷VÔÊÈlº÷N,ÓºÔR½h©F}9lé-JpÈ©4Ü/ûßæt‹Ûì–þme2 ÉïÉIÛ2pÄý ¦ *ÇáÓ­3”É:—E³cl²ƒ®³{²èÚ¹Ð\,e!+UE̛U™P¿+³¬TP?ôQþ“ÉçíØÍpJ?RޔúÐqF¦ŽQʇT簾ŠÕ*C÷÷}ÔaEÛÂÕ±Ù$êSæÇj÷̀[5˜oÔxÙaXÖPÐüy¾òAϤú÷hÜØl\Èâxhÿ¥E’­Ö:̐ˆöÚD~h¸Út8­rÁ±1qAÕ#l˜j. HGiSã©ñ¾Zš9ÿ¦5£RöZ)®±oˆë‰‘XgQ<œB¯×·jömwy#Û9ª]¿Z‰Î»<lj©óDèE99à‰V¥”ožÏJnœŸãƒ°@ª„X¬AÂy{¬`y¿Xçóžª~¿<Žñ7­wua:¿È¤ +vãi±xñãÕåO7o/ºrGß+h4BÀ +º<•p( +|h‰ŠZ3·¬ÓlaE¦ª.2ºHSáÕÄÜ)Ç$©“¦Ï‡áùÜ5Á±'Û{N;!!;Qð1 ÚÏr‡ q®HªڕùÛM µÈÆëYRÿIÈÇGÐëru{•èk-Ú /h•«ÚXéëÿ{ñiƒéTȟ¡©OђLÎ/ h@llë<ß|2ÛU®L@¤¾¨~þUÁó­Î_eu̐ËÏ0v–ía^!5ú @›ö>7 ¡ÿ_ ?݌⯫BK˜\Õ¹ô±”¸ü<ːý¿(~NÆûÿ }nÖ#~ÀO‰›–îêêIVÏ6ü?bH"‚¨=EÍôȧ>é©ÒÆ.¾xyõ³ù”¤0»O}óïß\¿¾ø×åìç=󏿱à$<õk÷iu{ ,x„8Ÿ#ôܹì&:}iÆ:}ñc-«/<Î]ãkoâbg^Nz*®êþ@#‚Uª!O}ëtßÊn6Қ}pºÕ?'휻•—„1ܟÀÜ7ÍêùÙÙÃÃJj£ÈªBisðÙþL¸ÃE…IϤ? ÉËîü)-ÔñS{ˆ‚Æøÿ¢Á% +endstream +endobj +3547 0 obj << +/Type /Page +/Contents 3548 0 R +/Resources 3546 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3479 0 R +/Annots [ 3523 0 R 3524 0 R 3525 0 R 3526 0 R 3527 0 R 3528 0 R 3529 0 R 3530 0 R 3531 0 R 3532 0 R 3533 0 R 3534 0 R 3535 0 R 3536 0 R 3537 0 R 3538 0 R 3539 0 R 3540 0 R 3541 0 R 3542 0 R 3543 0 R 3544 0 R 3545 0 R ] +>> endobj +3523 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [121.93 421.681 280.942 432.585] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +3524 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 367.228 173.467 378.132] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_4b841053fdf5718c17a018ff650b550a) >> +>> endobj +3525 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.282 367.228 242.925 378.132] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +3526 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.089 367.228 412.478 378.132] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g616fcdc7600a3a11a8a9152e75730899) >> +>> endobj +3527 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 328.802 173.467 339.706] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_33d58476db85f48e4ad680c69bca524f) >> +>> endobj +3528 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [200.804 328.802 278.631 339.706] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +3529 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 290.375 173.467 301.279] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_2b220dabc613a89a062968101429e58c) >> +>> endobj +3530 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.282 290.375 255.109 301.279] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +3531 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [276.638 290.375 336.583 301.279] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >> +>> endobj +3532 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 251.949 173.467 262.853] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_c98ed1378829f72aee73c40dff16f269) >> +>> endobj +3533 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [200.804 251.949 276.947 262.853] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +3534 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 213.523 173.467 224.427] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_8a6c3f01edb04382620066f17b63b20c) >> +>> endobj +3535 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.282 213.523 253.426 224.427] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +3536 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [275.513 213.523 335.458 224.427] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >> +>> endobj +3537 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 175.096 173.467 186] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_e46f7a91b9fac1a62ef875ec5c72aab6) >> +>> endobj +3538 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [200.804 175.096 285.256 186] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +3539 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 136.67 173.467 147.574] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_c3126925bcd3349b150771d52c19639d) >> +>> endobj +3540 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.282 136.67 261.735 147.574] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +3541 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.245 136.67 348.19 147.574] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >> +>> endobj +3542 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 98.244 173.467 109.147] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_9720487deabf813a31afd4e9cfe695aa) >> +>> endobj +3543 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [225.014 98.244 298.956 109.147] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +3544 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [343.756 98.244 419.222 109.147] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +3545 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3549 0 obj << +/D [3547 0 R /XYZ 90 757.935 null] +>> endobj +3308 0 obj << +/D [3547 0 R /XYZ 125.554 711.11 null] +>> endobj +3550 0 obj << +/D [3547 0 R /XYZ 90 694.576 null] +>> endobj +476 0 obj << +/D [3547 0 R /XYZ 90 509.156 null] +>> endobj +154 0 obj << +/D [3547 0 R /XYZ 90 501.892 null] +>> endobj +3551 0 obj << +/D [3547 0 R /XYZ 90 385.988 null] +>> endobj +3546 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F13 540 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3592 0 obj << +/Length 1860 +/Filter /FlateDecode +>> +stream +xÚíYmoÛ6þî_¡O™ Ô ß)ۀ¦]‡v[Ú5¶¡ ÙVm²äIòRÿû_$[Ž¢8k:dÀ>I¢È#ï¹çŽ¼#.|;:9¿”,ÐHK*ƒó‹@ã@I‚%Áù"xxOÆ8|;&8ŒËe<};¦8,²ÍU²(ãé÷鬌ËÍÓ§Ï;?Æ$ +‹|<¡‡Ï³¸ªÜë»ä"±ÿ’|ž€dª8 §ãßÎ_¾9ý9"°4»¡b"˜/GïÃÁÚ_1׶×2à”Á3 ÎF?Ž°WkÿiÕT4ˆ@Mɍš„j„£@Q†°NՓuš-ü*c¿n÷X5*qѪTŽ™ +“•{TI^§ù¥ûS_%þ¥€…Aí2Ç™kœgEµv£\Cq±7ìô´ZŒ%v´ Z#®8èhظ.EbQóYŒoéø¥À;D˜0ª×2˜Fڳᥢ#ÄRH+LÌ q©›éêd¹Êâ:q«+nûѼ]ח®GG’D"R­¤Í*Éã¥ÇçU^'å_c*BÀô¦l¡‘Íȯýj ŸÊKO¬w7•Õ -‚ Ð] Ï ³7€¿U:xÁqø £8R’ÞÇg¤:Ìgdž¼˜ž]Å«dÐq¸D¬ˆ›YĚ^÷®…"¢ïðˆG³Å C(z C·;Åiöˆâä…{VÖH Á'¸ÇÿÞ„Pø çP8 +ßÌëø²Èãì‘шº,TËAáˆ29è"F†h]¤¨\$¢‡yˆdÀAFk¯|LÒü+Ù³Ÿ±Ô§; v–^¨œÚ‡8gÖtçL·oËtÑ7üè~<{ˆµíÑø¦µïoѬ‡yFÓÿžáîs´K>v ¾±Ó"Í!ÑôyT±ÚL¬þåz^Rò)~õàö9†´X%e ëþê³ÚöS0?oR0vz™/!Ç·K76Ž·°Oq«v›ƒÖ;²ÍÙ¾Ín>`Ìz2YŽ$n÷ìú*­zRY0“’mfç‹9D ©ÉPB¬¤m‡y¬g^ÕE +jVi‘OÒܐ9®Ó™#42Pޏ_DaIú™üÿ_à×ééçeØ3K¬ª©–ôp‡E€àÜQ÷âοW¡!R#µÕàa+4T +„á¨zO~¿¤»?s®Ž¶3Üs¾SHñöì}ÈÆt(+$â”wIñ"y¨~ "Þ¿fE‘ ÓßXwzµÎ²©‹€Óôbê6·x^?Ú°ýÊ°UEž­J[5&F ×l¾égÀ$¥$Hs„‰¼3Hk.‡ƒt¤Úi垘ⲅު•Ö®ÙýÖ~—J^û¾hi„){ˆpro-Òɝ‚M]ð©×%¨óš"`Îò:­’ž™"‚ˆnÕºˆ³ªoª  +Ô7lÁ2é)Ûr¶›ò3œ¢ö¹õ +ö­é¬Xç‹ÿ”םµ%„¸DOa³æÍí'Š½K™ ³·Îl{1ƒˆ¿šy‘ÔqšYî óUÍËtU§Í–Ô1Sqĸ'À³í¦×Œ0LJÐòÝÝ®Èíª$bŽS¾ºñ ÎRŒó°˜ýž'eœÙ­Ó´Ù`d^æ;©C¡Ì˜!Ce²*íKåæˆ[²o•¤X"²-ÚìíóÙ¦YŒUú&Fl¬¢­šôáa†oñp Ió=eÝ»•¹¢…OUº[ªVñ¼©cíV]ÀH’´áö¯Ë`Ø2µ‚ƒ’D‹€A7/ªÏÜ™²ÉN/g¼ S¶ªãLèYüóUbu áÌ0Õ¤ÍöZË´ÄîÑżw aUÇeݸ(‹eghµ©êÄ79b°ÐepcÆ)‚“Ò–PL'ö> endobj +3560 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 684.047 173.467 694.951] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_68e25304a250a8c739927adfb90043d1) >> +>> endobj +3561 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.547 684.047 235.147 694.951] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +3562 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.266 684.047 283.993 694.951] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >> +>> endobj +3563 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [347.989 684.047 423.455 694.951] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +3564 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 621.282 173.467 632.186] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_e9a2b78be6811d666fb9d145078d796d) >> +>> endobj +3565 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.091 621.282 262.251 632.186] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +3566 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [347.717 621.282 423.183 632.186] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +3567 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 558.517 173.467 569.421] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_6b286c9e001bf126a0ab85aac675786d) >> +>> endobj +3568 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [209.917 558.517 282.185 569.421] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +3569 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.304 558.517 426.77 569.421] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +3570 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 507.708 173.467 518.612] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_c86d25d06285c9a2e890770fed084574) >> +>> endobj +3571 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [200.804 507.708 221.058 518.612] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +3572 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [250.338 507.708 325.804 518.612] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +3573 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 468.854 173.467 479.758] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_faae25a26dbecf9341c7fb2c2575f81f) >> +>> endobj +3574 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [200.804 468.854 260.36 479.758] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +3575 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.924 468.854 353.39 479.758] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +3576 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 429.999 173.467 440.903] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +3577 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [184.206 429.999 225.013 440.903] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_59d06e9b429faef7a632d58e4a0b12bd) >> +>> endobj +3578 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.35 429.999 311.906 440.903] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +3579 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 391.145 173.467 402.049] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +3580 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [184.206 391.145 225.013 402.049] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_6f581bf46ab0488f444977453ba2ea2d) >> +>> endobj +3581 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.35 391.145 326.292 402.049] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +3582 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 352.291 181.215 363.195] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_09726be54fe2a591787de59eeffdd2ea) >> +>> endobj +3583 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 313.437 241.112 324.34] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_5eb7f86790ada6549123a0225d68a4de) >> +>> endobj +3584 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.449 313.437 328.006 324.34] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +3585 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 263.623 255.488 274.527] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron_6424da8931d774f6a2e403c1e2f0d09a) >> +>> endobj +3586 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [282.826 263.623 342.382 274.527] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +3587 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [182.484 163.552 242.041 174.456] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +3589 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3593 0 obj << +/D [3591 0 R /XYZ 90 757.935 null] +>> endobj +3594 0 obj << +/D [3591 0 R /XYZ 90 449.093 null] +>> endobj +3595 0 obj << +/D [3591 0 R /XYZ 90 410.238 null] +>> endobj +3596 0 obj << +/D [3591 0 R /XYZ 90 371.384 null] +>> endobj +3597 0 obj << +/D [3591 0 R /XYZ 90 282.717 null] +>> endobj +3598 0 obj << +/D [3591 0 R /XYZ 90 226.303 null] +>> endobj +3590 0 obj << +/Font << /F63 374 0 R /F72 471 0 R /F65 376 0 R /F50 339 0 R /F35 2018 0 R /F11 418 0 R /F99 2117 0 R /F23 340 0 R /F31 472 0 R /F10 473 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3609 0 obj << +/Length 1891 +/Filter /FlateDecode +>> +stream +xÚåYYsÛ6~ׯàSJÍT0Þîô¡IœLÒ֓ÚN_œŒ"!‹ ¯`ýû.^å¸i3iŸâXì.v¿oaëÎÂÖËÅӛÅÙ ß±"ùÔ·n¶V„­À'ȣĺI¬[›@{¹"cû͒`›Õ9[¿YRl—Ù~Ǔš­I75«÷ççÏ&KÚe±\QÛÏ2Ö4ºyÅ·\ñ"æ ™®c×Y¾¿y½¸¸Y|\P [D©â(p<+ηﱕ@ÿk #' +­{5+·\êÀof]/~[`c>i^!Œ]+ >"¾«M¼,?WÛwëÎ^xx´ˆ„(À‘µ‚_ìQ½èºw`˜Ë¤$²ù’xöç˜W"UfÃÐ}šezpÃuO¹,-xÒ-¡žýI®ãfEºÕ#bg4ûFð\w–[Ý—E#j#=ð{¸æM…¾—|ûŽ¼f¢¬!z‹E˲l¯E$üÆ´à´l^Á9Gž¯mc0'rmQVeVÞ¥±Yyvœ•R†›vÓp¡ÛJ3×jC‡6*ÌäŠÅ´s°o§ˆ#Õô”`Sž“Zh‘ž &§±Ù\ø¬IEÊÝ3vÜDjÚÖ|bž§Í«Jé9íÇ@˜üõõN²£ó¹ìܱªâ…î¥þÝp=Vó¤-VÝ}ŸŠnIEx,ŒX³Êˆ÷GâƒQ<(ÁûNp^J§|J‹;="Ý1cŠ–:½sœp䜽›„‹œ`|µ$¶r—K´|5ÖKì¨>—¡å* Ä~Uô²At#Œ˜û7‰mš%ÚèazB³ç¢Ce‚M¬j9õ#{[—¹îgf¼Üü¡œ¬Ú[=KG tÄ +qtRK0©ï ª\½\X·jÊå%Ö°ç@™J3¬j§ù¥†Þ·÷–単3ÐÀ€ ‚ø­x½-ëœ'HÎ?Àªð#ŽµrrühÀcD "?S'ۚ4yOôÏs>í~^ÆmÎ Á4ͨ‹w"‘¿ƒô§ðŸø˜ªKRС Öb_qmpä v"…å”RE›¯WJÛU72qg/¯™qž¢(ò;Q?šãÝB`€¨›€gDx( +‚n„ƒ‡¥g ¶òõEÆ¥OgìˆBäö’?¤E2#œbøôÑú½½|õûÅÕõŜ¥ +)é&*X;~ i¿ÝmZd€`“6ñÏU–Æ©x¯×M¨O†¢ØWÁèSãù§2± Ÿs@=nâL' 4Ú"½nLoy8ç•)U!˜„èó0ò45°:] 6„ i™˜e9°ã”Ï)“sšãutÓÀ:U1Q7M `ÓùC¡üŽNú{GLè¾][4 Ž—9ì‡e'¦®Œ¶+â"‚½ihž²:ˆzNgá5PZ*«n¬°Žž=æàYñås7ؕm–LÁ²£ñph¸D¶'±qѕe1.¢l‘œŸg¼¸»5¯k°è ¡ŒB£.¥SîmPâ'¨KãÉúám²Cõë°CWzò.)û(ÉÙç4osãþ,ӊðä(ÌúݐF\Jå% ” H5COKYá¨óê3͈®»£V~fÙ9°=$äÆs·*?ÛL– +£€Á«~ç#æƒéDĤÍ\”6dNh~ Ús_±žª¾äg`èZbPz­aSû¦”žÌÉAmϑ]¹=†È×0F„üwñŸ=x*¦jæõ÷™ Ž +TÔ×M£ízl=:óð'‡A?Ö'€wØz¬Þ㹇ü£ä?H8à8$G„óvù§î{Ç4òX…´û  +×/.,ɚÕwmWTr”‚}[bá1ޑ·ø4_ýESEØpќ¯ÑáT|Gé> +\g‚+ηÀ•ÐÓ¸2€ÉúÚØ(‡æ Ä%€q¤œ“Å®âRßSg6ªº¯x¼3¾~UTí\ñë;£ãIÚ<ßÏìæ`äºÞ×Ô¬³E0Ðaœ.R)¸ÙIŠ³úüøo¢Õ¿ VN@†·@›'û¦ïÐ1+ù­ß$‚)X­|¸¿z 5+‹Rt"â j’d&¬h„ôWCÍÏÇAå8È ûèÛ𘵍1"ՊÂy1Áº*ñ€&ɔ¬õ-¼­»Š9gûiI;D^W’É×¢q“<¯§õ>œwDBSï»Ùxêй´¯*2A©Vi-ØÝTËfÀ‹þ‰PÅðVò–×€ã)\”;º­,øamÐ[WŠxxÛhŽpLtùÿIN½V‡ïè~¨¢á‘ÏèêÙÌòQ8¡ùWÀ‹çBܽ’ÙÌgGmúÓð›þxÛðú»¥çÙƐ_YÑ2ó&ù¬«ò{ôƒ,ňš7Gy—¸æÜ©-û`u­Ÿ*Ç} ƒûƒØ QŸÝßߣ¸Ap­¨j”Š³ªÊΎs$’gxŽÚv·Ø¼ì.;i!_ïԫڑÿÿ>±±R +endstream +endobj +3608 0 obj << +/Type /Page +/Contents 3609 0 R +/Resources 3607 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3599 0 R +/Annots [ 3588 0 R 3606 0 R ] +>> endobj +3588 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [296.326 657.138 370.268 668.042] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +3606 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3610 0 obj << +/D [3608 0 R /XYZ 90 757.935 null] +>> endobj +3611 0 obj << +/D [3608 0 R /XYZ 90 632.435 null] +>> endobj +3552 0 obj << +/D [3608 0 R /XYZ 90 610.123 null] +>> endobj +3612 0 obj << +/D [3608 0 R /XYZ 90 610.123 null] +>> endobj +3553 0 obj << +/D [3608 0 R /XYZ 465.707 445.807 null] +>> endobj +3613 0 obj << +/D [3608 0 R /XYZ 90 429.906 null] +>> endobj +3554 0 obj << +/D [3608 0 R /XYZ 90 279.576 null] +>> endobj +3614 0 obj << +/D [3608 0 R /XYZ 90 265.832 null] +>> endobj +3555 0 obj << +/D [3608 0 R /XYZ 90 89.441 null] +>> endobj +3607 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F95 1788 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3618 0 obj << +/Length 1299 +/Filter /FlateDecode +>> +stream +xÚíX[oÛ6~÷¯ÐÓ&5Ë(‰y[ƒ¶h·Yã=¥A ÈŒCLO¢›úßïð"Yrç2$(Ð>‰"ÉsýÎ'á`ààÃäí|rô>f@"¦q0¿’˜ NI0_ç!ñtF0Æáé”à0kÊìòtJqX›¹h²Ë?ÔU“5›ãã“Ñ”¤a]Mg”ãð¤ÈÚÖ ?Ëki×d•K8™& IM/æŸ&ïæ“'Tñªð%Œy99¿ÀÁæ?1‘·Vª "ÊàYg“¿&ø Y”!ó­Yˆ¢èÿ˜vŸÁœÑð æ8¯«V›W~•l2]7—gSnàÖ°…–¥[ÿÅXô^ðÊ8˜–‚{—­“™•¢”' i%àNâe†çÀ!)%Ð¹ª +UÉ7ÓY vËo«BåJ_¸}öÍ(Fq’‚ Ši䶿]«bá#™ùغÇÊ{¡ ùuS—#¹vÓZ{͸¾vÏeç— ¬Íæ6oóüFî?\U7²QÚ+¢;±v•å~¸P¥¬ZÕmè.ìEû›‡ÊY%ú,Úñõ #!bp E$Ž‚>o²RjÙ´Ç£íÛcFa%)J°;S„9Æv°cÂPÊÒ.€½OûÓ{A~Á˜VªZuèa›EÑ`±MæV/ŽU5pø5+Ôâ2k–k˜>äÁ‘ [74õ”òðÌb*ðK¼…f¢s™4î1sC÷˜yÕºùªÖnB–+½qsW¦²×~þ&ë%ÝĪV•n¡Š˜¡I¢¡ʚ̒÷Çe   3UùøäEÝ®›>&æL´§Ìá3OHÇÂøK@X*˜…°nywš•}h:1g]xîE«¸“xã|Êp›ÆI>Ã>Ë|“òòcµZë=—Ål ‹uYnöÜÆ0Š"þp¤;ภŽI“çÂa#ó)á!˜Õã3p1úAp‘=Y’ +?u…Ÿ$;…ŸŽpѼ;ÔÁ!.Îb…µ[P~§‡ +sD^d\ìI*š +õ×р»ÅL/u%ólÝzlÍ­‹Lg3W(ŒDH¤dŒ&­nÖ¹ñ/³\ÉÝ´M]¤k/añ Ò÷ѝa®5ˆa‘íãR¼/dŒ£ˆö„å7Ÿ’v—Ó"[Žµl7—¹VyV›.ƒ¯ ð‹„~¡2-;”wB]É] +Ò[WÃȧ¶‹q_We÷&8añÏ&øý6Áø%š dÈã© áI]-›µýr!ᥡñ–Ï{CDÞgN¾·7˜ÑôiÍê0yçˆX·¿yÏ{g¼z—Ú^ý=´©ü>•"ÓGñ÷KŸFàïÔ +ÀDÂ÷ÖJò"ß¼8²µ²-ž1š¥½Œ'ˆRѷɇËb/eä¯@Ç¥%"Ä ._…Þ[cüG©1úì[.hÆÖ@xŽkLŒÉ y×ÝîŒ8³dÐ,(¿Ó¶LwÄ2˜ –ÐÙ ~õlÐÞ¦;E‡l0F<¡?Ùà˳ÁÝ’qjM}ä/Iû+¬ŽácÅýŠäq¾Û%OMh ûאݫGe÷òw+›_§œ‡ÞÆ?³jnlPø«9 +ª­/n dQhÉ +òLJo¤³ìŸ ý>± ¼Õ—˜Æ}ßh½:>:º½½Ey‹Ö•Z5Hé£Õª8ºëÁ)Û*¸î¾/˺#~ª‚É23”úŽÿÿvCîl +endstream +endobj +3617 0 obj << +/Type /Page +/Contents 3618 0 R +/Resources 3616 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3599 0 R +/Annots [ 3615 0 R ] +>> endobj +3615 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3619 0 obj << +/D [3617 0 R /XYZ 90 757.935 null] +>> endobj +3620 0 obj << +/D [3617 0 R /XYZ 90 733.028 null] +>> endobj +3556 0 obj << +/D [3617 0 R /XYZ 90 572.93 null] +>> endobj +3621 0 obj << +/D [3617 0 R /XYZ 90 558.987 null] +>> endobj +3557 0 obj << +/D [3617 0 R /XYZ 90 366.883 null] +>> endobj +3622 0 obj << +/D [3617 0 R /XYZ 90 352.939 null] +>> endobj +3558 0 obj << +/D [3617 0 R /XYZ 90 241.413 null] +>> endobj +3623 0 obj << +/D [3617 0 R /XYZ 90 227.47 null] +>> endobj +3559 0 obj << +/D [3617 0 R /XYZ 90 89.441 null] +>> endobj +3616 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3627 0 obj << +/Length 1624 +/Filter /FlateDecode +>> +stream +xÚí™ÛnÛF†ïõ¼j) Z›¨¤Hš8n­ ÜÀ ¥µD”"U’Šå·ï,wy’¨C'-Š^‰‡ÑìÌììÿíJؙ9Øùyp6œ<—Ì P ©tÆwN€O$(qÆSçÚ%p=Œ±{9$Ø ³Exs9¤ØMㇹšfáÍ«è6 ³‡ÓÓó΋!ñÝ4Ž¨Àîyæ¹¹üMÝ©òJ& +“NF™ÌKƒï´3â#gé¦zž.–±ZGÅ͙†íἜ‘ÊÙ¤þBß°y’W¦?X‹¶3¯zÿÓÅ»›ó7¯/_=ûýÅø];Ÿ!Ùä U#=!¿ ïZ­—q4‰Š÷ÆTà–éˆÒù’B <$)7_9[EñÔö_h;Ò|,í„Tš©e¦r•Q23OŠ¹²)§³hÆæÁ$NóUfߦwæ0å[Cl§ÆG´©çCOJ^]PT.“ªÏ7Š9bœ Ê<]äyvÛÞªPY~ÚqÐ8êôñ‘W¶‘°`­ÐZ_èÄýƒEãx_ l)Íç­5\åjúý†ÿN@#3ÀˆpäùA_›îŠŒˆŠVhQÕ圭0×æIõ&š%i¦¦¨§[GRµ…†Iґ’ÀJI¡ ¬°Pæë„l,3B«Xžô jǃʠxXª¦  ÉÜI¡…»Ê { X¯ÎºY~ìDÑºŸ¬{##8V…éN¯Ðù¢£‰¾tÏÒuO +$ÛW"]n¿®ÑEa„F÷ÕD»¬=öÉ1¡ˆ°Úâ6Õc­ûqäsшòÈgÁ1ú$‰œþ‚¼’½ú A‚Çà'˜Ñî<_GI% +ҔÐ÷ûT[9+ÇéªèÊ«5¿M×åú¬=óŽôøŽ<7Jæ*‹ŠÜ¼-*³|N”±˜F yd¾àÛ[¦0¤1 “©yu½yî"Í ;|¦&Q®ª÷aQE1‰WS•o»Fz/ÀÊø«´Z•ãY +Ñύ\š«y˜7…KÒET³©ì¡!nÙGR FA ¿7Z«e—FCsùTnáÃV|/”‘%\.³t-@ÆñÕ³sJ$èì :sòl=QËšô#ç#hz)/¦§§±JfÅüFeYšíKͲ5›ñ> endobj +3624 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3628 0 obj << +/D [3626 0 R /XYZ 90 757.935 null] +>> endobj +3629 0 obj << +/D [3626 0 R /XYZ 90 733.028 null] +>> endobj +3600 0 obj << +/D [3626 0 R /XYZ 90 628.632 null] +>> endobj +3630 0 obj << +/D [3626 0 R /XYZ 90 614.58 null] +>> endobj +3601 0 obj << +/D [3626 0 R /XYZ 90 410.52 null] +>> endobj +3631 0 obj << +/D [3626 0 R /XYZ 90 396.467 null] +>> endobj +3602 0 obj << +/D [3626 0 R /XYZ 90 254.929 null] +>> endobj +3632 0 obj << +/D [3626 0 R /XYZ 90 240.877 null] +>> endobj +3603 0 obj << +/D [3626 0 R /XYZ 90 89.441 null] +>> endobj +3625 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F11 418 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3642 0 obj << +/Length 1745 +/Filter /FlateDecode +>> +stream +xÚÝXmoÛ6þî_!`ÀfCR"%í€.k‹¾g­¬H C‘éX¨,y’Ü$ÿ~Ç7ɒå$: Ø'½QÇ{yî¹;bïÊÃދÉ/óÉÉsx N¹7_y{'ˆQâ͗ÞŔÄg>ÁOÏgO“j“,ÎgOËüv-—U²x“]VIu{zz¶–éWµH.ïv›KY;Ì_<'doJ#¶×ò›%=F4nÅ|…ÓG3Ÿ2¥‚Þ8KoG$¸ß~¾WðYžÔµ‘;Ÿ :•›mž4Ò¼ù W >‰§²Há!ŒNIȕÐɳùäÏ 1Ø#Úa,BQÀ¼t3¹ø‚½%¼åaˆØ»Ö«6^H•b¹÷qòÛßé| ÌYë|†("ôÁè}Pê—Åø[Hc<ýŒNË¢nô3™¾¨²¥ýô£q `{ +†8@SçÁ+µzÄÍq¹EÔ +Ï)F \‰³ž•àsy“5· Ã-#BJœ°´ýadߐ£ˆ‡né»b_XŒH«×ÓwŸgïߞ¿yöÇËù§qq€xÜ9ΐJ6» + Q-:ÓâX]«j?B=6i Z%y=¶‹ÈBû`u¹ë¶{X‡Üliv“Ê­ÊÏ¿ÙˆN‡ºYžžfÅ 2ì[’gËERYz¹£ ¨Û´«ÂU9£lzí:±1pC ø÷ {Ø%ɑ¸sGünp‡¼íx’jØ úÐÅùó]æҐ4´,EP|˜õX ¸zÙ#KýjUV®ÙpqN»éìZs¤}¸’…¬`L³½Çª*7ƒ>eUæ¹qrV\™WàDšË~ܕéaë6’¹Îê3¥¬¿êÂg@ØÛmŽÖë–õ 0©†š„ˆÄñ÷›šÁ{ÛЈ¢¸#ƒÇcª…›Ã¹9 +ææ¾ìPEidp>*ÚMÎ ¹79ëà°–†8fÅп?Nå<˜Eý¢ùԆ¿J¶[Ww[¤€¡*Kmìo·nŒÈT# àÕߍI™ÂÄ7ÅʲhûU/z½)ë·ûµê;²Œœ>°E0ðâÓëâP¶.ÜTÿƒA‡Äï:Åð¡.„$°Šîùî2wÞëSê»(ªÍŠ¸;{8– ºu1ïÕñGueÏA>èjË÷¯‡ÿ™dXw¶_SÍÉ8 G8GpèbõqÌxªá…ÖV•1 +Ð_ë–D퀒¨Àqu•%EӍ?A4u#/P­ØaXPÕv²F/¨0‚#.u‘râYïòæþµ-f«ÛcN5½¤N‰¤x¢*·=,ë>dÅjüƒjAô—ï­«ö§›cÄÞ/‡F)>¬l=¹!4=ñ~e»;0Ç:è4I ’$F,lG­v¤èçÃðDƒ: èôôAÀÆØÒÈä1½ÒpL9Wd£Š}tÕÀ<ڒ`~¯eõ“|,lß&ÅÎÍÕ*ì†ÈªîŒ#u¼©‰f@ÂxúQJk¤±ì«çî^O45uú’8BAw®·nšíéÉÉõõ5Jk´+²m…²æ8ëäFö¤¢VHËԛ²jÓ^ntÝGCÿÿ­ +endstream +endobj +3641 0 obj << +/Type /Page +/Contents 3642 0 R +/Resources 3640 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3599 0 R +/Annots [ 3633 0 R 3634 0 R 3635 0 R 3639 0 R ] +>> endobj +3633 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 184.304 150.493 194.834] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_33a5462cd5398fdbd61989d17aeeaa72) >> +>> endobj +3634 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 145.076 141.367 155.98] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_ga88e9b9cb2588cbf5914695fc14e69a8) >> +>> endobj +3635 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.865 145.076 174.293 155.98] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_b74908b692bc6f8112f5d27b96141431) >> +>> endobj +3639 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3643 0 obj << +/D [3641 0 R /XYZ 90 757.935 null] +>> endobj +3644 0 obj << +/D [3641 0 R /XYZ 90 733.028 null] +>> endobj +3604 0 obj << +/D [3641 0 R /XYZ 90 604.1 null] +>> endobj +3645 0 obj << +/D [3641 0 R /XYZ 90 589.53 null] +>> endobj +3646 0 obj << +/D [3641 0 R /XYZ 90 510.132 null] +>> endobj +3605 0 obj << +/D [3641 0 R /XYZ 90 487.82 null] +>> endobj +3647 0 obj << +/D [3641 0 R /XYZ 90 487.82 null] +>> endobj +1422 0 obj << +/D [3641 0 R /XYZ 90 321.925 null] +>> endobj +158 0 obj << +/D [3641 0 R /XYZ 90 315.325 null] +>> endobj +3648 0 obj << +/D [3641 0 R /XYZ 90 202.904 null] +>> endobj +3649 0 obj << +/D [3641 0 R /XYZ 90 202.904 null] +>> endobj +3640 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F21 2111 0 R /F72 471 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3692 0 obj << +/Length 965 +/Filter /FlateDecode +>> +stream +xÚÝYMoÛ8½ëWð”J@M“¢HJÁ¢‡¶›Ýv‘¦ÞSZŠDÇBõáÒr÷×/)RþŠ6 ŠPé`H¦ÉÇyóf†„[€À;çõ̙^0"1ŸÙDp†!õ1˜¥àÚÅ2o‚B‘Ë"ž_z>r«|»©Œç²Ëíùù›¥H¾éI"ÿ½)n„ô¾ÎÞO/0>ØÀ÷9$„©íü?̔#0‚>‰Ú3îKoâSmB³q–l;IqDÚe¯~“ÇëµÁy‘ïŠb•Çµ0#Wb¡ÌÇ¡+ÊD aL}\ƒ:ΜïV0àÆa”CN(H +çú+©$QîšY|mX>;ŸdE èÐNÌ!S+¸O bԘûÅ÷i³ý~½Þ_ÞZC®Þ9àzB•PÝ:ìÖ©YšáD‘úàLóœ^p„Ê Ñ 0˜`Cd#ã­Xě¼6îJªr]ËMRWÊi»°u~DwÒ«'güùè6VÚ;Àô´§mÉs¾ ¼jµôà±f‡ג-”Q Ûà¯Ûho²Dï~žJÐ ˆNô‰Aî2¸Þ®D6o.dU˜7›²÷ž_ê ö0u·»c¢(¡è(;ä:uf ò P/FÔ¦LŸ‘qRŒ0 Fì¾ÿ«iϼ|ÀIGè!‚QÀNJÝàg[Q¥Èƒ¯ªM™fåíümÖé§4“Oú‰¯ÎBùqÜk\Â]‘Ø¢‘•YÅyö3®³ª4c éÔmc(~\}"<®q\¦ÑÀ¢f¤¨R¡ýü{–¬uv[ +k{²Œ¥yëYÎÎòÿ b6#FÚñ;VÏ+R؏Hëe%ëq©t@ieåÈÚE™Ë«Öæ±è³g4ŠüÙÓ³T#mSŽéú`GOHõxƒà})õ›Ü!üÿWªÞ®½é4ð‹D§J=Ý%z«zC?¢:EÝÙ4ž+Å#zõ¥Î?©âAŸOž%s@d°r¤Õæ&ÿ…òlUÛ§÷Xdéf4XÌýÆÐÕ÷y²ïž Y%©=ÞLŠó×³#…~ö¢ÐiC—)•pøÔ~nÛ¿e0â$´MtAJÛÁ^Š¶}­U’…í²m¡›¯¶n¾ü³ò…G©k¹ŒËM+­öÒ %äzꖏ¦½ QŽþ,„%i˜}íÛ_ºéOìÅ!‡D§¶[´¬ëÕùtzww“5ܔÙJ¬ž®Vùô~ñï@•l£MŠ6šÕ`ÑD)<õÿ¿¯ç +endstream +endobj +3691 0 obj << +/Type /Page +/Contents 3692 0 R +/Resources 3690 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3599 0 R +/Annots [ 3636 0 R 3637 0 R 3638 0 R 3651 0 R 3652 0 R 3653 0 R 3654 0 R 3655 0 R 3656 0 R 3657 0 R 3658 0 R 3659 0 R 3660 0 R 3661 0 R 3662 0 R 3663 0 R 3664 0 R 3665 0 R 3666 0 R 3667 0 R 3668 0 R 3669 0 R 3670 0 R 3671 0 R 3672 0 R 3673 0 R 3674 0 R 3675 0 R 3676 0 R 3677 0 R 3678 0 R 3679 0 R 3680 0 R 3681 0 R 3682 0 R 3683 0 R 3684 0 R 3689 0 R ] +>> endobj +3636 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 720.286 199.475 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_fcba1dd5e579752d6dcc40ef4d5799b8) >> +>> endobj +3637 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 683.344 199.475 694.247] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_c0ef828e81a5c7625db3abadcafc8438) >> +>> endobj +3638 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [226.812 683.344 301.193 694.247] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3651 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 634.82 199.475 645.724] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_f2441164b4c23a8203f399f561c9a7c7) >> +>> endobj +3652 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [226.812 634.82 301.193 645.724] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3653 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [417.691 634.82 477.247 645.724] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3654 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [237.672 621.342 303.64 631.247] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3655 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 598.251 199.475 609.155] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_4bed59d493c4fd91537602efb267c938) >> +>> endobj +3656 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [260.745 598.251 320.301 609.155] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3657 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 561.682 199.475 572.586] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_80f6de87ec43c33fac3832b14a507c0b) >> +>> endobj +3658 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [263.525 561.682 323.081 572.586] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3659 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 525.113 199.475 536.017] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_298300b8f88eb674c317b99ad09a474b) >> +>> endobj +3660 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.12 525.113 313.676 536.017] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3661 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 488.545 199.475 499.449] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_2024878c4c26cb836d454e2e93f40c8f) >> +>> endobj +3662 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [261.313 488.545 320.869 499.449] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3663 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 451.976 199.475 462.88] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_4f3206ab2d3c47e2014e5b306167c7c0) >> +>> endobj +3664 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.517 451.976 341.074 462.88] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3665 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 415.407 199.475 426.311] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_cca11ef67e39b711f96604b6bf806feb) >> +>> endobj +3666 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.708 415.407 330.264 426.311] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3667 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 378.838 199.475 389.742] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_b4d4a0ebee3fcc93490aa029028a810b) >> +>> endobj +3668 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [273.487 378.838 333.044 389.742] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3669 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 342.27 199.475 353.174] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_1bdc1023fb4478270594d0e965eb90c9) >> +>> endobj +3670 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [264.083 342.27 323.639 353.174] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3671 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 305.701 199.475 316.605] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_461dbfcb8f68886137794e4a408fc55e) >> +>> endobj +3672 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [271.276 305.701 330.832 316.605] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3673 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 269.132 199.475 280.036] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_74b0a8cfdec7831e7a3e296b3e3751dd) >> +>> endobj +3674 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [291.48 269.132 351.036 280.036] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3675 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 232.563 199.475 243.467] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_6957dba3dbf92459a364893d7ecfb897) >> +>> endobj +3676 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [232.81 232.563 292.366 243.467] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3677 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 195.995 199.475 206.899] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_f47ee9cf59cfac8a346660698c61d113) >> +>> endobj +3678 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [242.215 195.995 301.771 206.899] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3679 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 159.426 199.475 170.33] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_bf60cc7fa60d33c4fe958126d55cbac2) >> +>> endobj +3680 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [262.419 159.426 321.975 170.33] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3681 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 122.857 199.475 133.761] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_77a2c5c27e9c0838fea6e6447b20c320) >> +>> endobj +3682 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.431 122.857 347.987 133.761] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3683 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 86.288 199.475 97.192] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_404beea19c04f4e7bbcfe81aae0d6a7d) >> +>> endobj +3684 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [287.873 86.288 347.429 97.192] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3689 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3693 0 obj << +/D [3691 0 R /XYZ 90 757.935 null] +>> endobj +3694 0 obj << +/D [3691 0 R /XYZ 90 733.028 null] +>> endobj +3695 0 obj << +/D [3691 0 R /XYZ 90 700.371 null] +>> endobj +3696 0 obj << +/D [3691 0 R /XYZ 90 663.802 null] +>> endobj +3697 0 obj << +/D [3691 0 R /XYZ 90 615.278 null] +>> endobj +3698 0 obj << +/D [3691 0 R /XYZ 90 578.71 null] +>> endobj +3699 0 obj << +/D [3691 0 R /XYZ 90 542.141 null] +>> endobj +3700 0 obj << +/D [3691 0 R /XYZ 90 505.572 null] +>> endobj +3701 0 obj << +/D [3691 0 R /XYZ 90 469.003 null] +>> endobj +3702 0 obj << +/D [3691 0 R /XYZ 90 432.435 null] +>> endobj +3703 0 obj << +/D [3691 0 R /XYZ 90 395.866 null] +>> endobj +3704 0 obj << +/D [3691 0 R /XYZ 90 359.297 null] +>> endobj +3705 0 obj << +/D [3691 0 R /XYZ 90 322.728 null] +>> endobj +3706 0 obj << +/D [3691 0 R /XYZ 90 286.16 null] +>> endobj +3707 0 obj << +/D [3691 0 R /XYZ 90 249.591 null] +>> endobj +3708 0 obj << +/D [3691 0 R /XYZ 90 213.022 null] +>> endobj +3709 0 obj << +/D [3691 0 R /XYZ 90 176.453 null] +>> endobj +3710 0 obj << +/D [3691 0 R /XYZ 90 139.885 null] +>> endobj +3711 0 obj << +/D [3691 0 R /XYZ 90 103.316 null] +>> endobj +3690 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F72 471 0 R /F35 2018 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3733 0 obj << +/Length 1135 +/Filter /FlateDecode +>> +stream +xÚÝY[“Ú6}çWø)µg‚ÐÝ6Óô¡Ûl&ée¶Yú´›a à‰±©m²C}%Y K.?Yòçóó]„¹7½_G½Á-'NBŽ¹3š9!t|ŽÃÈÅ΃‹à^AÝ;A7*–ÑøÎÃÐÍÓÍBÄE4þ#™Q±obúQ-ñø¯õr" +ïÃèÝࡽ`ìB¸|½¶ÿs½¤A€IhWŒ<Ÿº/½>f +‚~q2Ý´X&!@!±ýò¬á›4*ËÚîÈ ±+–«4ªD=ó^Ì$|¸"›Ê)„v ”ÑÞëQïß’f ƒ4aÌ>aÎtÙ{øXοs aà<éUK‡b,uî{÷ !ÿðªÅð±H¼œj¼T–C9«aÿ–ñ]1­j¤I–TI”&ÿEU’gõܬð(sóe}™Ùu6É×Y,bû t–Bw®%+ìZókmA.O²y=³Ìcá!æMÂç¼Ü2¸GycÀ)Ò××<äÒœ{:¨O¥H„> ̑, ³~Â†J(ê<ÖÜÚÙú֜ÊÖ7ÿ”¢øÉcÌ5çFÙÚ~VVò|R¦DQn‰ƒ@}ûSò¯O$A÷B§kÏ>:vô»:Bf{xQà·m‹ªZ ƒ§§'0-Á:KVHªÁj•Ž?4ïYAø[#³¼°öÛ|&'—Z즒ÿÿZF‰Ð +endstream +endobj +3732 0 obj << +/Type /Page +/Contents 3733 0 R +/Resources 3731 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3751 0 R +/Annots [ 3685 0 R 3686 0 R 3687 0 R 3688 0 R 3712 0 R 3713 0 R 3714 0 R 3715 0 R 3716 0 R 3717 0 R 3718 0 R 3719 0 R 3720 0 R 3721 0 R 3722 0 R 3723 0 R 3724 0 R 3725 0 R 3726 0 R 3727 0 R 3730 0 R ] +>> endobj +3685 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 697.092 199.475 707.996] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_3de2c410fab852f07f89df5be3d4c118) >> +>> endobj +3686 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [260.745 697.092 320.301 707.996] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3687 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 648.461 199.475 659.365] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_e3a660d2b2a34f69d2d0cb1cc77f6f69) >> +>> endobj +3688 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.469 648.461 327.026 659.365] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3712 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 587.876 199.475 598.78] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_ed795d57d70d782ccf2a584cce183050) >> +>> endobj +3713 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [226.812 587.876 301.193 598.78] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3714 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [237.672 574.345 303.64 584.25] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3715 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 551.201 199.475 562.105] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_a3de5a2fe7f06d0aa3e4972be2023933) >> +>> endobj +3716 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 514.526 199.475 525.43] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_fcb46dd5c0701130f067f577f99ef27f) >> +>> endobj +3717 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 477.851 199.475 488.755] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_24e90bb8bb38d248aca79c76a1717d9d) >> +>> endobj +3718 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 441.176 199.475 452.08] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_55e9dfdf5da9a55b7523bda6b7f56c78) >> +>> endobj +3719 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 404.501 199.475 415.405] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_8abdf2e292960e1fb216ce3c2c0816ff) >> +>> endobj +3720 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 367.826 199.475 378.73] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_f9d7eaecf113e25020c55ed0bf79eb03) >> +>> endobj +3721 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 331.151 199.475 342.055] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_fad3fbdebb1ba319083c56fa2ae679e6) >> +>> endobj +3722 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 294.476 199.475 305.38] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_79f64d099a652834da74cc8fd68f2452) >> +>> endobj +3723 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 257.801 199.475 268.705] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_164f8732d5fe6b526a34e168145a95ad) >> +>> endobj +3724 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 221.126 199.475 232.03] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_98dae78cdd16f7127a4b3e18c3976562) >> +>> endobj +3725 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 184.451 199.475 195.355] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_f9daca45c3c1d0d1afd57ab47c6cacd4) >> +>> endobj +3726 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 147.777 199.475 158.68] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_f0647cd431d30a9658d4bdc77e32d9e4) >> +>> endobj +3727 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 111.102 199.475 122.005] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_b19be1f26efb21370e8460b325a7f57c) >> +>> endobj +3730 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3734 0 obj << +/D [3732 0 R /XYZ 90 757.935 null] +>> endobj +3735 0 obj << +/D [3732 0 R /XYZ 90 714.146 null] +>> endobj +3736 0 obj << +/D [3732 0 R /XYZ 90 677.471 null] +>> endobj +3737 0 obj << +/D [3732 0 R /XYZ 90 616.885 null] +>> endobj +3738 0 obj << +/D [3732 0 R /XYZ 90 568.255 null] +>> endobj +3739 0 obj << +/D [3732 0 R /XYZ 90 531.58 null] +>> endobj +3740 0 obj << +/D [3732 0 R /XYZ 90 494.905 null] +>> endobj +3741 0 obj << +/D [3732 0 R /XYZ 90 458.23 null] +>> endobj +3742 0 obj << +/D [3732 0 R /XYZ 90 421.555 null] +>> endobj +3743 0 obj << +/D [3732 0 R /XYZ 90 384.88 null] +>> endobj +3744 0 obj << +/D [3732 0 R /XYZ 90 348.205 null] +>> endobj +3745 0 obj << +/D [3732 0 R /XYZ 90 311.53 null] +>> endobj +3746 0 obj << +/D [3732 0 R /XYZ 90 274.856 null] +>> endobj +3747 0 obj << +/D [3732 0 R /XYZ 90 238.181 null] +>> endobj +3748 0 obj << +/D [3732 0 R /XYZ 90 201.506 null] +>> endobj +3749 0 obj << +/D [3732 0 R /XYZ 90 164.831 null] +>> endobj +3750 0 obj << +/D [3732 0 R /XYZ 90 128.156 null] +>> endobj +3731 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F72 471 0 R /F50 339 0 R /F23 340 0 R /F35 2018 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3781 0 obj << +/Length 1415 +/Filter /FlateDecode +>> +stream +xÚíYÛrÛ6}×Wð)%'„+/ž¦3­[g’¶‰k«OIFCS­ / +HÙ£|}I™’¨ÚV2iž(RÀrqöìÙ­k Z/¿Ž£3—X\ìZã™@Ës`Yã©õÎF¸ÎAísA;I89w0´³xuç"œü9¿¡XœœÞðè£ħ“7ËäŠ çÃøõè ¡Æ 0ö!®|}iÿ'=¤å‚“ 1vÃ<×vÇN€mž,â°àúÉŸI÷‘oó4’bØF4PF¿ŸHš*cð³¢dðî´¦òùk øÖ]9*±(VŽÅÖåàï4àÃflú‰<àÊ&ºL»ûcV¾¾ž¯Þ/®#/Ö»!“êŽÃzž¥Vø2ei^è'‹O“¨FäÙJþ6Þ§¯£3[¾tÖ¥: À¥È"|ÏøúÛ\8ijydŒÏÓy1ãù簘g©~6ev–è»P_$äÌ.…±‰ù”ÏÂe\Tÿ«9Ët:O¯ßٔ«I Ó×ÚçÀÃÊiyõ)9ÀŸ¿(Àæé2½Røñi5Q2žBûº\Ž„!û>º á–àøWjðB¢Gµ¦ ðQ5¦wȤ^`€\l‚æ>0+Nõ%/„B_.ÿhÂ["TNò@àA¤&ù€º~…RQ i‰¦ÔÅzœÔ~Jƒ íoYró×Å¡X-x&F’Ï„„å¾M†¦´%ûÚ\¥ïì*P `&©ö³‹Á É.u[z%ùö3&kUíµúÿ÷4¼ŠùäÕ¬« ˜Lé{x4Y +|´†öU>¹\ðH’¦Ã•eÒþÆj<ÛN¹ÀeþFm™‘Õ®âÉÉ­ƒ¥fÇKnÖ•e]î ¡aÜƼ‡}…§I˜ë4|úbVv"qÎûæ£ (¦MÆ\#ÿ˜¹W»ÛêS†Ä09HT¯DµÃ¿DÏóL䕞?•ÞJ¿ÕžKçóû©Úà”ÉìF’ +‡Êo¶à",2Q5M[´·ŒŠ–Þ2O­q&BÕÂTU’诣¢¼ÐmB&Nœ!A +Êb)Ò¼%œQ¶X™I3}-nxU§\Ä«uÀÒeÂÅ<Ò7·ŠÎO$˱i¶è•S„Ê‹»É:Çvbþ¾è@N#ªz`u-{à¾ì+ƒ±QçŸч³ø¢“–k§‰óAj“çRmž?ߚÔ2mé×Úí n%P/v·…;môtdõŒÛD·)ie þ½e{¬–íñXS¯è@ Ù÷xäÿˀɹ:²Q«[u˜÷dsVo±ú’!rŸ ϟPDî퐤6ÚÙºo=ëD¸eÞ¥ÀƒÞ®Ž¾m½?³‡ÊTö7¹=nô¨aÉöã1ý8UæyÁ;Q/¾8¢_wõèS*vmÄI YŒ[nî× ™4x­ù¹uT]å­ +Ÿ¼“Ývå@«áܒþ°>4߶sWŒñöíÜýΝûvÂz š!HôÜþËY«öN!#êœí²†ág6ÊÁ •Ç[à‘­3QÃ4“­éà +vl‰ ßۋG(êKÖðˆ-öA­ Û: úÕ58€·Ù`\.¯ +Mçêôîï4úeO·±ùÑҕ #¿ï7Ëê¥+óŠøæC1 cæ¼`\Tœ—ˆ‹ÄuœWŸ‰õ­ùV¬oþɹøÁaÌ6§#…é2ŒõºtõÉŠGji@Ÿû]òJšõÊ>ZÕ¯?Ô)kø‹|Ènµ¢àMQ,NF£»»;å`™Î̋Ñbî‹Zʔ^omdV…&™¨Ž¨Sù0)ϐÁ&þÿ”€) +endstream +endobj +3780 0 obj << +/Type /Page +/Contents 3781 0 R +/Resources 3779 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3751 0 R +/Annots [ 3728 0 R 3729 0 R 3752 0 R 3753 0 R 3754 0 R 3755 0 R 3756 0 R 3757 0 R 3758 0 R 3759 0 R 3760 0 R 3761 0 R 3762 0 R 3763 0 R 3764 0 R 3765 0 R 3766 0 R 3767 0 R 3768 0 R 3769 0 R 3770 0 R 3771 0 R 3772 0 R 3773 0 R 3774 0 R 3778 0 R ] +>> endobj +3728 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 719.912 199.475 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_65b1cc4ac0c0c8a2efcbf3d36d4ac0ac) >> +>> endobj +3729 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 683.194 199.475 694.098] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_6afe848ad84ff68d48142caf0599760a) >> +>> endobj +3752 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 646.476 199.475 657.38] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_91459c49e4f7d7fc2dea0347e0489ce5) >> +>> endobj +3753 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 597.803 199.475 608.707] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_956de4112c520bb87767ce894b4d512d) >> +>> endobj +3754 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 512.828 168.86 523.732] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_00f887bfb5c61faba29a67def563c786) >> +>> endobj +3755 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.914 476.484 187.002 487.014] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_268aa30d717cdc7d07e60cf7c56712e6) >> +>> endobj +3756 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.436 439.766 210.524 450.296] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_627ac77a4752fde3c10792ee9f1673a4) >> +>> endobj +3757 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 366.372 199.475 377.276] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3758 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.215 366.372 251.021 377.276] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_b45faf2ccad8057c7b27e0c999eb063b) >> +>> endobj +3759 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [278.359 366.372 352.739 377.276] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3760 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 317.699 199.475 328.603] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3761 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.215 317.699 251.021 328.603] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_80993a2a72759ec030dd3cde21c8a00d) >> +>> endobj +3762 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 269.026 199.475 279.93] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3763 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.215 269.026 256.64 279.93] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_08ceb442794b5f60c1ad09ce744371e1) >> +>> endobj +3764 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [283.977 269.026 358.358 279.93] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3765 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 232.308 199.475 243.212] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3766 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.215 232.308 256.64 243.212] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_8772f767006f16e376d8eca9b1578b73) >> +>> endobj +3767 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.413 183.635 269.974 194.539] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +3768 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [341.331 183.635 415.711 194.539] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3769 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 171.68 171.52 182.583] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_59638854527a5bebee3676750668c63a) >> +>> endobj +3770 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 123.006 199.475 133.91] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3771 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.215 123.006 254.14 133.91] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_2857ee1039a41cfab001c0ba21c69ac3) >> +>> endobj +3772 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.477 123.006 355.858 133.91] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3773 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 86.288 199.475 97.192] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3774 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.215 86.288 254.14 97.192] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_02949da26a3761489d2fb98018010990) >> +>> endobj +3778 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3782 0 obj << +/D [3780 0 R /XYZ 90 757.935 null] +>> endobj +3783 0 obj << +/D [3780 0 R /XYZ 90 733.028 null] +>> endobj +3784 0 obj << +/D [3780 0 R /XYZ 90 700.259 null] +>> endobj +3785 0 obj << +/D [3780 0 R /XYZ 90 663.541 null] +>> endobj +3786 0 obj << +/D [3780 0 R /XYZ 90 626.823 null] +>> endobj +3787 0 obj << +/D [3780 0 R /XYZ 90 529.773 null] +>> endobj +3788 0 obj << +/D [3780 0 R /XYZ 90 493.175 null] +>> endobj +3789 0 obj << +/D [3780 0 R /XYZ 90 456.457 null] +>> endobj +3790 0 obj << +/D [3780 0 R /XYZ 90 381.415 null] +>> endobj +3791 0 obj << +/D [3780 0 R /XYZ 90 346.719 null] +>> endobj +3792 0 obj << +/D [3780 0 R /XYZ 90 298.046 null] +>> endobj +3793 0 obj << +/D [3780 0 R /XYZ 90 249.373 null] +>> endobj +3794 0 obj << +/D [3780 0 R /XYZ 90 212.655 null] +>> endobj +3795 0 obj << +/D [3780 0 R /XYZ 90 152.026 null] +>> endobj +3796 0 obj << +/D [3780 0 R /XYZ 90 103.353 null] +>> endobj +3779 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F72 471 0 R /F23 340 0 R /F35 2018 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3832 0 obj << +/Length 1216 +/Filter /FlateDecode +>> +stream +xÚíZ[sÚF~çWèÅ®4 ËÞWëIûP'î$m7¦Ov†‘amk‚•„=üûÝ aLcgª' ±:{öûÎåƒ]l][Øú£ó{¿Ó;‘ÌÒHK*­þ•¥±¥$A‚«?²ÎmBtºclŸ:Û^xƒS‡b{2žß˜Qä þò/#/šߘá·t >͂K9_ûz'„¬L@©BŒI˜>³ÿ&Rñ`D™.GôÅí×N—ŠÔ…lb8o°Ì4"š•¯ý¶Õðñ؋ãÜnßÑÔ6Átì%&òÅ\ûĵM8„G„jS£wýοf°E2À„BŠ ktοbkÏ?X1íZwÙ¨Àâ4ulluþîàüú5#CQË%Ïüåà0Ü*Ê–"wûlv™€gÂö†Iî«ŽŠ›8ö¯Ãü~25ù¨dWBl”ù¾iòމÀ+Hu)E’¸„)Ïg¾ TTŒd/)¤&éK.âÒ-ÑMJ83å8ˆÎu-*–$î"D’ùԄ^PsM‚›‚"Êyüê’\‰¨Òp‰´(À|z—c3xÕOÔ¥7;9çÑuAþ—5à Ä0SåKïãÁ'/ñ*ì۔ 3ø VÒ¤†fez͐XÂù¦aEÙ\ ˜–ÀTó!W©û€àå‹yŽŽnSo½ñ̼ްbë¼K·›³}Ójæ+ùðå,ҞAÚ§)Ÿâטöiò‘ûX5|Ø`#¡w)ÉMðt™äˆ^DšÌßIó1ËE¨`Ý_+P¥€Bd_`‡“0NV=»;œÃW¤1}× +"ŠÁÄaá¶õ¢€qP Šy%w«´=ρ[Œ‘U’·äDAôá=‰U0‘±¹J+ Œ¸ˆQúz1kˆUŽô²nm µ{=Ù5ś:{=)ojì,U¬CN)¬¶¤ùJwxÒt‘Ãe5m>ÎƉ?ϟ9e¹?}¨Q‰”Ë~`¨JkǒÚtå;úE±Ó + Vµh‹5´^kƒ_néjd—Ró=ªK%ÌÚb³Wõ$ž@=õö'|(.(ùù„ÕqVk­oý[dþ²§÷$Š¥\ચÜ+¨¢U+­ZiÕÊQ+½½üUó’Jo+3vi!{” “µØ*3šwNžùï²ö¿äñ$˜ÎÊí–ÈaÊ6ç‡#áyÛä~´ÇÁ޴NjºÕ#­iõÈnzä`Ÿ[Gû¨Kw*[õ€Â*#ȅ4Êó!æ{ò ë{YoÍÚwŸ Ìâõª³ÂC\À²5Â.{֎ðêÕ&jSýOsÞº~Š]ÆàŸ—ÜL–&Ìqa–8ùÙÛqLJâtjù”!72O + ßwÈmÃì{O×ïñ¸ÕO(I˜™¸= ”Dà%È#æ§Â„FB÷oLy+õ) +¼âcy&,ÿX Ë?ü›èG»8rõÑ gÞØY€— œ(ö'EÁ(ý½‘ŠèØ>3eÏÌWöÍ*ïþL»‡Xñ—¸ +1¼_7I2=êõîîîÐ0F³ÐŸFÈOzÓ鸷ÞV¬@OT #W“¢ë“¨X¾ÂÃÚ$¬òøÿød?ý +endstream +endobj +3831 0 obj << +/Type /Page +/Contents 3832 0 R +/Resources 3830 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3751 0 R +/Annots [ 3775 0 R 3776 0 R 3777 0 R 3797 0 R 3798 0 R 3799 0 R 3800 0 R 3801 0 R 3802 0 R 3803 0 R 3804 0 R 3805 0 R 3806 0 R 3807 0 R 3808 0 R 3809 0 R 3810 0 R 3811 0 R 3812 0 R 3813 0 R 3814 0 R 3815 0 R 3816 0 R 3817 0 R 3818 0 R 3819 0 R 3820 0 R 3821 0 R 3822 0 R 3823 0 R 3824 0 R 3825 0 R 3826 0 R 3827 0 R 3828 0 R 3829 0 R ] +>> endobj +3775 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.413 686.933 269.974 697.836] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +3776 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [341.331 686.933 415.711 697.836] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3777 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 674.977 169.02 685.881] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_9c4298d04019ab7b5233ddceb430be03) >> +>> endobj +3797 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 629.939 199.475 640.843] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3798 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.215 629.939 256.003 640.843] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_761744f24a8e2faed19912950cf13baf) >> +>> endobj +3799 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [283.34 629.939 357.721 640.843] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3800 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 596.857 199.475 607.761] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3801 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.215 596.857 256.003 607.761] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_7ce6dfd81e04c3eb8d196bf13a96ebe6) >> +>> endobj +3802 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.413 551.819 269.974 562.723] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +3803 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [341.331 551.819 415.711 562.723] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3804 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 539.863 170.883 550.767] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_c95c1fbaee07d3a9cead4d07683f6168) >> +>> endobj +3805 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 494.826 199.475 505.729] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3806 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.215 494.826 253.791 505.729] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_72ef8379745ed9575b39216ba1e51d18) >> +>> endobj +3807 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.128 494.826 355.509 505.729] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3808 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 461.743 199.475 472.647] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3809 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.215 461.743 253.791 472.647] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_6a2d561ac8088ed64a0bb51d8fffcd9b) >> +>> endobj +3810 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.413 416.705 269.974 427.609] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +3811 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [341.331 416.705 415.711 427.609] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3812 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 404.75 168.671 415.654] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_fc3433d8ec297e2d1fbdf559d93f9080) >> +>> endobj +3813 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 359.712 199.475 370.616] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3814 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.215 359.712 259.32 370.616] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_7e90d52413515d81ad9b68fb1740d869) >> +>> endobj +3815 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [286.658 359.712 361.038 370.616] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3816 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 326.629 199.475 337.533] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3817 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.215 326.629 259.32 337.533] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_1a79ab4c49d7ae4406b56dc2b3d94463) >> +>> endobj +3818 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.413 281.591 269.974 292.495] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +3819 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [341.331 281.591 415.711 292.495] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3820 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 269.636 174.2 280.54] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_e179c684a9ed7eafbbac1825d17f7daa) >> +>> endobj +3821 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 206.613 199.475 217.517] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3822 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.215 206.613 256.64 217.517] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_3cb9b031ec4e6fd7e53e53da5b0f04a1) >> +>> endobj +3823 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 173.53 199.475 184.434] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3824 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [199.973 173.53 246.399 184.434] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_de4a5582f82333f20fd6a8be13ff8d7f) >> +>> endobj +3825 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 140.447 199.475 151.351] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3826 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.215 140.447 250.185 151.351] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_06c0a4ba25cbc3d59797bf1c73c49497) >> +>> endobj +3827 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 107.364 199.475 118.268] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3828 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [199.973 107.364 239.943 118.268] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_0803532e7523865597c394e1371d2b16) >> +>> endobj +3829 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3833 0 obj << +/D [3831 0 R /XYZ 90 757.935 null] +>> endobj +3834 0 obj << +/D [3831 0 R /XYZ 90 715.044 null] +>> endobj +3835 0 obj << +/D [3831 0 R /XYZ 90 658.051 null] +>> endobj +3836 0 obj << +/D [3831 0 R /XYZ 90 613.013 null] +>> endobj +3837 0 obj << +/D [3831 0 R /XYZ 90 579.93 null] +>> endobj +3838 0 obj << +/D [3831 0 R /XYZ 90 522.937 null] +>> endobj +3839 0 obj << +/D [3831 0 R /XYZ 90 477.899 null] +>> endobj +3840 0 obj << +/D [3831 0 R /XYZ 90 444.816 null] +>> endobj +3841 0 obj << +/D [3831 0 R /XYZ 90 387.823 null] +>> endobj +3842 0 obj << +/D [3831 0 R /XYZ 90 342.785 null] +>> endobj +3843 0 obj << +/D [3831 0 R /XYZ 90 309.702 null] +>> endobj +3844 0 obj << +/D [3831 0 R /XYZ 90 220.746 null] +>> endobj +3845 0 obj << +/D [3831 0 R /XYZ 90 189.686 null] +>> endobj +3846 0 obj << +/D [3831 0 R /XYZ 90 156.603 null] +>> endobj +3847 0 obj << +/D [3831 0 R /XYZ 90 123.521 null] +>> endobj +3830 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F72 471 0 R /F50 339 0 R /F35 2018 0 R /F23 340 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3895 0 obj << +/Length 1735 +/Filter /FlateDecode +>> +stream +xÚí[MsÛ6½ëWð”JÓÆ'x2iÓ¸“´I\[9%-Ó6'"©’Tdõ×w’’(“’ì‘%ÕÉ4.‹÷K;×vþèü6蝸ÌÑH»ÔuWŽÆŽt ”8ƒKçc—äöúcÜ=íÜõÓÈ÷N{w“Ñì&¸L}ï¯ð"õÓÙññ˛`øÅ4 +.½w“è"H{ŸoŽNYê€R‰s¡{kÿEѤæÁˆ2]µô$ï>ïõ©0.؎Ãá¬Á2ӈhV=öËFÃ/G~–v=M»A4ùyPÜ9 ®À}¢ºA<„[„Ú%‚£WƒÎ?f°ClÀ„D’ gu>~ÆÎ%Üã`Ä´r¦¶Uäpj9睿;xmð)CØ…‡gqè²ðèdó0‰³b`/=ˆ>åˆq]<÷ ü.©†’ßøyudåM?-/â¤ü1 +ìŒÙ뫪/¦ŠAW^;ÄEœ)èP ¡yÙ!¥¢ÖÊú'‘–˜ÿâî<îyh;ˆÛ¢`ƒsµ‚š% %ç–fã ö£ šÄ»ŠÓLÔBח ))˜b¤EøW±1 +¼×WÍ0£ŠÖ|ìPH¯KLœ•hCÞëÌ{ççaŠî×ÝÀ{ŸzKìY e­{͐XÄòEÈVésw + ©ÖðÌ玏¿OýÑ$(ix‘$£³‚",ø=ìšùk‰ŸóÑöfÔó½x®' $M ؇ռBýóìö.rû”2(`—P˜kzÀ‹Ý(Œ'™Ɵ0¦q˜ÏvŠ_òƒá×=àwßð;à{ß]Â7Œó«œ#å’]£w‡ÀÅ6Á?ä Ý}Ý–&H×;Ny÷Ksìå‹ë2Æõ'i5tª5âdíLö cˆ öøøÖDì ßj¾—ú*Cww„Ù½ùPÞë3¢ºÏžÁ0ÎÇÁ0ô›À®$Â|{7X¯q$…Øä¤j¤b+qݳ ›Œòuv bT숭}&bZ×ÓWËËt2Ìۈ»ŒûgyRB‰Î6l%£Ÿ¯—Š³d_†ñµ÷{Ø(—aÚ  †ÞPuP„ƒ"a{E(aægYx{é÷!tÿá®UÎÑë3\‰`Ïw!ä“ñ]w¾c©–ç¶#Kãm¨µ»TXÑvêÀo5ê(RQG/¨†7~ùŠÖ^q +¨›O7lYƒ»i5ߔ¶3¯Ï4F.%u°í'õ&&º\š‹Þ©y9gÀ?kð€Ž\¼~gJ¸B.{ô­)EŠ>qk}µWØ÷w»%®[­™«]W˜×Ä-ÄX׈kÚÄ5®¶±•¿\¶ßl%{ÅÖv¢®e(dÒXЍ™4V+5û¯ö½|x¹>9ɦöÁ¸-j}ºÛ|²  τ˜bϦ´”òÆ+á©kB„Éuá©×¡6¦k÷—`zŸ2Øckv‡ —%k×å. `"7Ž4/ œOýqyŒÁK­©@déÛ¢A͜´Ì-LÃü¦ÁFsOg F@hç Dƒ¨qw9©öjjŠj°©ù_ò],9êÅÇõ@O}ãÂÔ[ì.ז5wH¢Tâ±ÄÀÝD¾Ð‚¦ê¬ À«Ãbã¾Síl-1ÓLÈ>ÂgáqíYŸb˜xþJ»³¶¿ ¢$n‡ÿ–ù:ÎƁ=èÕpĬMME `Õ§0yD~ ÈÊǀ,¹?d3¤·A¬ò$÷G^dÃw1˃ìÉďRŠ°ûÞzÂ@]˜b»\’ij Ÿ¤q6?ÅØ[Ķ¸Ìæ˜K,¶—ÉÕʃÑ’áp2«C–³¦´»ËE¬Ûæ”qÄeI'õƒÒióŽ¼9Ï(ySm±é¬"ÚÂûêô6Òø[RO)¤4ÿž¨Ç` +ÌÑì-¨÷p¾E~ì› ^—µ•vÚˆ Vb7´k],©¶uÕ>„UðRØMak9L‚uïý8Hý>>:šN§h˜¡IŽSæGãñèè®î,Y!ɹ‘«¤üìTz®êp3òÍf >ÿÿ­<\Q +endstream +endobj +3894 0 obj << +/Type /Page +/Contents 3895 0 R +/Resources 3893 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3751 0 R +/Annots [ 3848 0 R 3849 0 R 3850 0 R 3851 0 R 3852 0 R 3853 0 R 3854 0 R 3855 0 R 3856 0 R 3857 0 R 3858 0 R 3859 0 R 3860 0 R 3861 0 R 3862 0 R 3863 0 R 3864 0 R 3865 0 R 3866 0 R 3867 0 R 3868 0 R 3869 0 R 3870 0 R 3871 0 R 3872 0 R 3873 0 R 3874 0 R 3875 0 R 3876 0 R 3877 0 R 3878 0 R 3879 0 R 3880 0 R 3881 0 R 3882 0 R 3883 0 R 3884 0 R 3885 0 R 3886 0 R 3887 0 R 3888 0 R 3892 0 R ] +>> endobj +3848 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.432 658.013 258.993 668.917] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +3849 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.555 658.013 439.727 668.917] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_b65697a5fab14ca76c391a3aa523e3f6) >> +>> endobj +3850 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.432 633.107 258.993 644.011] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +3851 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.555 633.107 440.305 644.011] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_2b39d89b5938161bd8922b7c1f28f637) >> +>> endobj +3852 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.432 608.2 258.993 619.104] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +3853 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.555 608.2 432.554 619.104] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_4cca5e272cecc038189aac8b2fc8ace2) >> +>> endobj +3854 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.432 583.294 258.993 594.198] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +3855 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [361.361 583.294 403.772 594.198] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_356bd3ccfaa76c0ef4452a34ce767897) >> +>> endobj +3856 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.432 558.387 258.993 569.291] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +3857 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.555 558.387 409.69 569.291] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_0acb1530838a14041c43002dd8ee3541) >> +>> endobj +3858 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [164.108 533.48 259.668 544.384] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +3859 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [452.93 533.48 480.387 544.384] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_ga88e9b9cb2588cbf5914695fc14e69a8) >> +>> endobj +3860 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 521.525 152.425 532.429] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_84ea81a9b4eed51ac13029dbccf67662) >> +>> endobj +3861 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.801 521.525 314.357 532.429] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3862 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [164.108 496.619 259.668 507.523] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +3863 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [452.93 496.619 480.387 507.523] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_ga88e9b9cb2588cbf5914695fc14e69a8) >> +>> endobj +3864 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 484.664 149.108 495.567] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_755f1ffc7dbac4ff01984c02774c9bc6) >> +>> endobj +3865 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.483 484.664 311.04 495.567] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3866 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.749 459.757 259.31 470.661] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +3867 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [320.948 459.757 348.404 470.661] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_ga88e9b9cb2588cbf5914695fc14e69a8) >> +>> endobj +3868 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [382.47 459.757 417.668 470.661] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_d6c64cb3cfad6b8d7fb952e3f85347aa) >> +>> endobj +3869 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 447.802 173.467 458.706] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3870 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [166.019 422.895 261.58 433.799] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +3871 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [330.597 422.895 358.053 433.799] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_ga88e9b9cb2588cbf5914695fc14e69a8) >> +>> endobj +3872 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [396.66 422.895 431.858 433.799] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_cdce8391d61c3090aa51f9d0656524a2) >> +>> endobj +3873 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 410.94 173.467 421.844] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +3874 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 386.033 156.281 396.937] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_9a28ec8161898b61530de9bbb4a3251d) >> +>> endobj +3875 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.097 386.033 234.477 396.937] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3876 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [308.814 386.033 383.195 396.937] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3877 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [156.251 335.224 199.339 346.128] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_dfb768d4ea63e2eb5d58aec03b999f17) >> +>> endobj +3878 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [226.676 335.224 301.057 346.128] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3879 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [132.73 310.317 175.818 321.221] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_fed617fd6598839b510b46a3857387d4) >> +>> endobj +3880 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.633 310.317 254.014 321.221] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3881 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [150.828 248.857 247.464 259.761] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_bb6ca6c02bde2f04d412129e4be9743e) >> +>> endobj +3882 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.801 248.857 349.182 259.761] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3883 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 202.033 202.902 212.937] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +3884 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.4 202.033 314.263 212.937] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_2f03dea4f9d5f0e15e18785cf3dd58a3) >> +>> endobj +3885 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [341.601 202.033 415.981 212.937] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3886 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 116.663 199.475 127.567] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3887 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.098 116.663 296.905 127.567] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_e6fa6e27a794dc71b88169df7f08fcac) >> +>> endobj +3888 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [324.242 116.663 398.623 127.567] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3892 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3896 0 obj << +/D [3894 0 R /XYZ 90 757.935 null] +>> endobj +3897 0 obj << +/D [3894 0 R /XYZ 90 716.221 null] +>> endobj +3893 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F35 2018 0 R /F23 340 0 R /F72 471 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3948 0 obj << +/Length 1546 +/Filter /FlateDecode +>> +stream +xÚí[mÚFþίð§Ô¨eog_½§ªR5‘’¶º&äS|àãPÀ¦r!¿¾³~8Ö¤p/)NpfwvföyæÙ1†zz/[¿u[g/÷ 1Š)¯{íêiD2ðº}ï½@T»”Rÿ¢ ÔÓqxyÑfÔOF‹›¨Ÿ†— ¯Ò0]œŸ?¿‰zŸì ¨ù×||¥íÝWg/* 0¦ ç +—Ïìÿœ©ù”0nÊݶþOí“Ö…láao±Å27 /§ýâ4ü|N§¹ÝnÛ0?OFá,ʯ¼‰®Ñ}ü(îá%É|ü³F[¿w[ÿ´ÍP²„IM4—^oÜzÿ‘z}¼þÊ£„›À»ÍF=Á¬c#ïmëï-’O«› iÕOÐDá Í8¡Jæî~`Lf˗ó²IšMÁN +ˆPAÛ¬ &Kú¶‡ù¬å¿fI,7h¶˜Dq8ŽÊDe/ÅvÔ?»°Óé/¶¬j ¡’Õ6§•'0™|ór=à˜€@ã F‰Ø³JZj¨ÐŒð Ø ·ÜÖ"ªÃ- ÀõžÙµD9'™Di8KR êN-ï}¶þ*i/‰§³;ŒÃöK ã”Ãýdd§ág_0@¨ùºòY3D´QJd@àÀ‰Ð PÔ¦w1–Ü¯ñ0ž\¶Yµf™Ÿl]¡Æ¢ +ä#J¾"â øN©×ˆgŸ³b;ìïßJy’¤—XK‡ƒø.ßic_ð +E  ¼â° GÌæØeùü_³t%…XÉÊħ¤”Ûˆ~·`j<§S}$Á”ßN‚ÙätMµöû—ãù_Sሃ– %5®¾2 ›_á #®ûCLs‡hV ç·À˜ût ï[31”;cÔ{ÇØá’eD}Ÿm%Käþ!T[b´zÏñ}m~RXÈä‘ï¬ÝíÛbN 9XÙë(Jýó—"ÆTÇ3Äø2ö±-F19«g¤¿þ§âºþp¼ +²šÚðÙøòYx…èÀó$HC¤Êü\d_Q¦ãp‰‰üçù¿ÅoòÞM£ô‡¶”~±M†ñ¼ürÓªÏÖT”N—-öOˆ ‚ CL¿¢"è<²O^ùîu+KåÊ_4á«~öf6›œŸÝÞޒޔÌãá$%ÃÙÙd2:ÛT—Š¬ziä:)n§Ž“4*o¬âÅñ–;I˜ÿäu»« +endstream +endobj +3947 0 obj << +/Type /Page +/Contents 3948 0 R +/Resources 3946 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3751 0 R +/Annots [ 3889 0 R 3890 0 R 3891 0 R 3912 0 R 3913 0 R 3914 0 R 3915 0 R 3916 0 R 3917 0 R 3918 0 R 3919 0 R 3920 0 R 3921 0 R 3922 0 R 3923 0 R 3924 0 R 3925 0 R 3926 0 R 3927 0 R 3928 0 R 3929 0 R 3930 0 R 3931 0 R 3932 0 R 3933 0 R 3934 0 R 3935 0 R 3936 0 R 3937 0 R 3938 0 R 3939 0 R 3940 0 R 3945 0 R ] +>> endobj +3889 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 707.957 199.475 718.861] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3890 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.098 707.957 294.404 718.861] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_c62afeb287031d74441101af60be319a) >> +>> endobj +3891 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.742 707.957 396.122 718.861] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3912 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 661.133 195.799 672.037] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_a8f66682c527ff5a5a2496de0e3fb2ec) >> +>> endobj +3913 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [199.615 661.133 273.995 672.037] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3914 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.134 614.308 196.833 625.212] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_2f9c525f46f4ff5707b505a88c82aee0) >> +>> endobj +3915 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [201.684 614.308 276.064 625.212] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3916 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [380.387 614.308 454.768 625.212] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3917 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 555.529 191.365 566.433] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_da7d59af059bdfb2e485d341213e6d19) >> +>> endobj +3918 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.181 555.529 269.562 566.433] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3919 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.528 508.704 192.794 519.608] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_b1b19ff2b88ffca75ac27208cdd877a2) >> +>> endobj +3920 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.038 508.704 272.419 519.608] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3921 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.205 508.704 453.586 519.608] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3922 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 449.925 197.453 460.829] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_798df1392d067294fc936bcfa19745c4) >> +>> endobj +3923 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [201.268 449.925 275.649 460.829] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3924 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.987 403.1 198.34 414.004] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_3f5e732694ad7d879ac7eaef0668073a) >> +>> endobj +3925 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.043 403.1 277.424 414.004] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3926 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [380.828 403.1 455.209 414.004] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3927 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 344.321 191.216 355.225] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_d3d8562d66aeed544d8ef75b941e807c) >> +>> endobj +3928 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.032 344.321 269.413 355.225] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3929 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.541 297.496 192.658 308.4] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_c32024703f8ac04b6b68ff1761575d2d) >> +>> endobj +3930 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.916 297.496 272.296 308.4] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3931 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.165 297.496 453.546 308.4] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3932 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 238.717 190.26 249.621] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_307453961ae9779ce9e1e3ebcc94496d) >> +>> endobj +3933 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.075 238.717 268.456 249.621] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3934 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.626 191.892 191.787 202.796] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_a831d9698f64ff610fa1b3341025603a) >> +>> endobj +3935 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.129 191.892 271.51 202.796] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3936 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.91 191.892 453.291 202.796] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3937 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.668 133.113 212.417 144.017] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_be0aef8acc1101523cfbf50ebce7528e) >> +>> endobj +3938 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.801 133.113 291.182 144.017] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3939 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [392.593 133.113 466.974 144.017] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3940 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.922 121.158 250.302 132.062] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3945 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +3949 0 obj << +/D [3947 0 R /XYZ 90 757.935 null] +>> endobj +3946 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F35 2018 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4006 0 obj << +/Length 2190 +/Filter /FlateDecode +>> +stream +xÚí[YsÛF~ç¯À¾0`ír4÷¡ŠSµ›µ]Éf¯£}²S,ˆ„%&¼ €²˜_ŸÆ †)K•ð‰ ôô5ß×=3À΍ƒ×ƒ] .^Iæd$•ÎÕÇ`GI‚%ÎÕÌyç‚ähL0Æî›Á®,½É›Åîz±»õg7ùa~xÁîòòÛ[ú[|“?›ü¸]^ûÁ藫ï/^R€R…“0|"ÿëô–š#ÊL~ÇÕHq÷£1± +ÉÀóé®A23ˆ–?öUð· / S¹W#C]¹Yx‘ŸþòÖÿêíú«)üDˆ .,:xy5ø8 ;$q˜PH1áL—ƒw¿`g¿ï`Čv>%w-NcÅÎσÿ pæ|\ ‚ÀU=‰BžP”!,Eªî{JE2|þ\òBFa?¤—:·-ʍIœº•÷ÿ97{þ¯I’Hè"@Ñn㯼¥Ÿ;*ùÈÂQÿïM˜î®aTct/85£Ç„µZÁ‚ŒÈ¬¾K">Ÿe–Çn2׿}=pލ¡n¸½ž,·‹ t~³ªy)¹ƒ¹ï±À­2ÜæÌ­xº–hD2$?ta-Ó´$û)«ºï¥ýfšty©.xxK¥Ú®WaÔí£ž60e`㘠Œ$'õ8·ØZ™®ÃÝHŠ<ó,öÆ·ôµ—B®J‹½m°ÔSS–˜Ò"›†¿Cª’šª¥ÊŠÂ47RòtÂH€ ¡á 2}þŸÉÈp-Zg((*ρBåô¾Oo¨ ŽÁ§ˆkt›Mï;o±õ›Äñj܏Ƹbœ~dþ0¦z?(« +7¾Ç˜5çèÌ~oÐQÀDÉÿGÞªÁdfPsƔ JØ[»°•rêÞLg-¸J99-®rŠ¶ÍAêïÏAnÃUpVÀo¬‚\¥œYq†÷ÇU†¸"V塍äÄ6fx +÷&+p=ãY~dPrr5òd[¡’Ë¡ƒÉõe0ö&1åú.àøŒè–Ëõ*ý>›ßÍÃu^¬?4 ›°˜.¸d×2pÞjÖ$E YÆé´èK! +øà ¿Ç”¶\ÇðëÇ#ßGmÕ-ÜtR¼¨;§i;~Pù"Ó¦Ö¢sš¦IQAávߨ¾ÐkbÔj{˜Y²‡Ya«Y +Cë‰ÒÏÌɵ¶ ,'úe¥¶¢,7܂²ÁÃ(– +a²ñ ܗD ҄=‹¦¤¿ãŒz1M +èZÈí>€2Zre#Sþ0.•Ñ®(…°ÉˆTí)Ó­D*y7‘ +²G¤ kHá{A¤ðoI¤pÑJ¤œ±n"­ ÜJ¤BM¤I‘‡ÝЏ¢ùê¦ÉzežB§¨EH“á6ɔÛ,D·^æΰ©³Óº¹Ãή&#‰Ué×DìßS™QƒL"‘Ò晕n1‘ù"•y_¹JÈ4¦ÊÝHˆÜÝIþö«a PF +Rø\ÃÓBBÓe[ ÿžº…TÒØÚ+|È  ˆ­½ÒÊÆ ¤Lí´…dÆÊ +0pÿ’iùt6ê#ZHqn!›[HõÈ-äÂ÷šzÇåvÍ7 ¿«yÄi®žsóˆ’’fÀKÿ’À+^ÅÜ´sô¦Ñd6QáÞµÁ°:õ‰DºlõÚ +tu0MAÛ4Æ6Mù+;ø}A˜#ÂÉé-3(G0”žçí‘ÇØù® ùR´ ±j°73?l"9íÂÏýrœãY‰ ^/×cŽg‚Ûu4÷WQùéùßóÀ À7I•%ÆyNÍ4Õ/5Ϛ&4ƒ ~®ÏZcÔÚ ?­«‹Úœ¸@HË*œ$8«i[…Ó–•›šà„8µnñÄ÷ÅJèY©x¡ +7ˆÈz wÇbfLjŠ}¡Jµ€Â[/]»I¯ƒîzu’– »ÝPRú¥vphL4F±0`g„ó³Qo}ÀKo‘j÷ÓƼhd¾Š/¥Úõrãó0‡ÕWÛÕ4~.<Ä£JŠ0Ä lÆÏ +ÂH†]Ñ&ì"•%¼fè¢ÀJÔ³öåÊ»^ø“œ°÷ÏÉP]_Ëo˜½û¥H—«c߅“!zIUÏ7òS0©LôÎ&”!!»—Økc]‘%ër T%%í_^ÞŪ&g0Ækw8l‡äϱ ŠZ„1±WØFj›i²-]Jὕ„á°›†Àæ#-”À@Âz²‰³îèRÊ›xñŠVá…B·T.Zýúëqù,`¢’ÎGšÏ%2Ìn>ïðƒÍ©(9´&ÝëõzÑ [}2ÒCvŒA]g߈»Îùŋó8©oÒ* ¹97T +°^ïm̤eÑb娗|~Ͼæ[Ì£]Æt›øø)¸ ´Ъg LÓ#vϯ>ÓǙ>þìô.0ÔFœÐ'§þ@úà=̧'5?§¡ZéC!jH™a¡& úøÛ!}0Q£¸¹¤‰$_Š>þ=ýGcú—byf3ƒI§C­ŽàäOJS5ëéI­ÏûÅ:úQî¤}þ2ïf)ƒ˜¬wl­;U·T›#¡d&0ý,bÚ [9}ìKØùK×dÅtöæ;)Ïâ™oS½IÈ)XzÅ6múÞ{z™½üž^ü?ôƒ¯â³¥ÙнUAw±#RŒ Ê öø4¢é Ôd)òg?QjÙoNþí?ƒd۫ԗh….}E›Ë‹‹OŸ>¡iˆ¶«ù&@óèb³Y\«"R´<üð!çéå:(véàÇe²Ï…öýÿⶪ +endstream +endobj +4005 0 obj << +/Type /Page +/Contents 4006 0 R +/Resources 4004 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 3751 0 R +/Annots [ 3941 0 R 3942 0 R 3943 0 R 3944 0 R 3962 0 R 3963 0 R 3964 0 R 3965 0 R 3966 0 R 3967 0 R 3968 0 R 3969 0 R 3970 0 R 3971 0 R 4008 0 R 3972 0 R 3973 0 R 3974 0 R 3975 0 R 3976 0 R 3977 0 R 3978 0 R 3979 0 R 3980 0 R 3981 0 R 3982 0 R 3983 0 R 3984 0 R 3985 0 R 3986 0 R 3987 0 R 3988 0 R 3989 0 R 3990 0 R 3991 0 R 3992 0 R 3993 0 R 3994 0 R 3995 0 R 3996 0 R 3997 0 R 3998 0 R 3999 0 R 4000 0 R 4001 0 R 4002 0 R 4003 0 R ] +>> endobj +3941 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.722 707.957 211.923 718.861] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_95ac9759a14fe23bf8d02a621e4e9e5c) >> +>> endobj +3942 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.36 707.957 290.741 718.861] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3943 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [392.486 707.957 466.867 718.861] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3944 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.922 696.002 250.302 706.906] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3962 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.015 650.587 191.281 661.491] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_e4bfe4a80fb074c50ec17657eee225e8) >> +>> endobj +3963 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.013 650.587 269.393 661.491] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3964 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [366.762 650.587 441.143 661.491] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3965 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.616 638.632 222.997 649.536] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3966 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.074 593.218 204.365 604.122] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_d5ff0dd1267079af85d9938bb4a975de) >> +>> endobj +3967 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [209.155 593.218 283.535 604.122] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3968 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.986 593.218 437.367 604.122] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3969 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 581.263 199.475 592.167] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3970 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [296.238 581.263 370.619 592.167] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3971 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [468.945 581.263 513.996 592.167] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +4008 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 569.308 159.735 580.211] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3972 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.968 523.893 191.792 534.797] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_1d723d4d200b4a6a694b141c7b6f408e) >> +>> endobj +3973 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.476 523.893 269.856 534.797] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3974 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [366.951 523.893 441.332 534.797] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3975 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.616 511.938 222.997 522.842] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3976 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.33 466.523 215.546 477.427] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_9b45abd63e1255df8341775c8f42b842) >> +>> endobj +3977 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [219.592 466.523 293.972 477.427] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3978 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.27 466.523 467.65 477.427] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3979 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.922 454.568 250.302 465.472] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3980 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.479 409.154 193.302 420.058] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_f1952cf5da3ecbadd8401b948e899a31) >> +>> endobj +3981 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.497 409.154 272.878 420.058] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3982 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.354 409.154 453.735 420.058] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +3983 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.187 319.149 272.748 329.077] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +3984 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [354.877 319.149 450.438 329.077] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +3985 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.914 305.884 192.84 317.839] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >> +>> endobj +3986 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.007 305.884 304.933 317.839] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >> +>> endobj +3987 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [425.965 305.884 472.39 317.839] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_b733c7c83da19667a83c2a3abafa5d05) >> +>> endobj +3988 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.187 249.825 272.748 259.752] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +3989 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [354.877 249.825 450.438 259.752] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +3990 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.914 236.559 192.84 248.514] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >> +>> endobj +3991 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.504 236.559 305.43 248.514] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >> +>> endobj +3992 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [427.768 236.559 471.892 248.514] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_79a5a323f582c4260790552d3be140fd) >> +>> endobj +3993 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.187 180.5 272.748 190.427] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +3994 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [354.877 180.5 450.438 190.427] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +3995 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.914 167.234 192.84 179.19] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >> +>> endobj +3996 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.546 167.234 304.472 179.19] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >> +>> endobj +3997 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [424.295 167.234 472.85 179.19] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_dda98cdf0bda436acac3193162fa53b0) >> +>> endobj +3998 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.187 111.175 272.748 121.103] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +3999 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [354.877 111.175 450.438 121.103] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +4000 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.914 97.91 192.84 109.865] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >> +>> endobj +4001 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.761 97.91 305.687 109.865] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >> +>> endobj +4002 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [428.699 97.91 471.636 109.865] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_76b5e4c5b9628c14a7d227517b8fb349) >> +>> endobj +4003 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4007 0 obj << +/D [4005 0 R /XYZ 90 757.935 null] +>> endobj +4004 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F35 2018 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4049 0 obj << +/Length 2224 +/Filter /FlateDecode +>> +stream +xÚíZÛrÛF}çWàIKV‰£¹Pe]µG©\Öö*ܧ8łȡˆ˜´Ìýúí¹àF‚¨H¶Ê›'€Ä §»§ûœžÆ`ïÖÃÞ÷ƒNW’y! +%•Þdá…Øó%A‚o2÷~‚ähL0ÆÃw#‚‡Q¶Ž¦ïFÓÕn©æY4ý9¾É¢lwyùíRÍ>èAj>}³]ߨlôÛäNj+BPê#Æ$Loäc‡´t Q–#&#ŸÏGc*´ +fâx¶ëÌBDBV¾öê^Áß®¢<·r'£Õz³Š +eÿ¹V PŸC•Ìà/BÁµÐÁw“Áb°GŒÃ„|&¼Ùzðëo؛Ãÿ?z±0ðį̂µÇ©Vlåý2ø÷;çï_ÍbøÔ @_ɍ¾†[Ÿ2„¥°jŸ˜?T ifU-–QbïҍÖY £"…+!Cdô=6áŕÀ ïŒ)E’¸ßÎöžRÑb^òQèc¢_ +—AéÑ¢t¡q=x¤«Îy¸·ê-I‰  +‹b·QI´v‹1!öê¢`ï!í˜.„°å{¡Ð6–P¤/à¬Ҏü.‰nVjúâ;¼h@[ ld·.®|J( +)_ú!Ÿ¾‰ŠxDÅð£^'5}›MY³çèÖô!C¢öô7&µçŸÚ@$"¬Ï-ȼšäòò£V5ZmÁÕó³#VÿIÛ'cr¯q•mô±¶…]¶ÁPoÌ$F˜»pp©vvö Ükó-”ù‚õˆ‘¬õï^=†Böh/®h ©DAO¿ÿþ°xH@žÕáü@ó¹Íù æÓ'5V‘hìýáMš®:d ‰èI™¡1èh`Œi06@Ü1[Ñ úÜњíï-×:ñ:2gi’`Wເ0Ê |?Ž?9ä,_°°i®g;íNž8`#D|¦‘$»òàgURhƒ…/©?¶ÑÊ=LŸž ‚ÿ+‚Ô_U”üE¥ý‹Ç‘àä+姖õôI­wôÄ|v”ž|$üðÙýôÄx?=…ˆÉ é„ä–[”¤g¨))@˜~QFúJiç*K×2E”÷“KõÔ3s ì^ùg¢–æTµ[ڝŽðIIT%¨‹Õ8):Är@Ež,7õDùmrPòÁß͒¯\}›1Ÿš1ËàËP¸œ¡V§kUl³$·ª‡ac<ƒj²nּǻA~cˆôË1ŽZ³r$qµ|ç8âAE>¸CAë%fµ$è ´O Q¯Â\AÍãäÖ„Š»¥*–u_Å¥ÙG[`˜.9¤hÎ \…kjÿÔ1¹$­b$v•¨ÇÃ[ȊJ' ³ÿ‚\ Óv5½Ióxo må5ÓV»‘'#›F—ØñѱÝWSëç]e5"‹sÖ_X Œ¸ï­Ýââ%6S:œöºÏPàûÏ_ÒêÇçªisM:L€ ä1ݒóX‚¬¾VùvUôi[DYWd 9¦6~÷ás‡ù2s~y™æE¦"]÷ƒ³4?·wÍv“2¨ô‚=˜‡Ï7ÛµÊâÙôJ¯`š­#÷ÿÙb]œ÷Ã÷uº5 6}g]8>³<†½—I¢Œ¼¼;^o½Ó]µƒv]½ÌaџœŠìegÞ^Píó~÷ô,BØc4:8ýM P=š]‹MlhU¡Ò«W÷‡ï£õŽO›Û…cÛÙ#_À÷¢ iìÖz+¼Ö>ù„m#:Ʀfnl›ŒóÕ~z~2’ÏGFñ?5æê"£!ž˜Œl÷“‘$ˆ`þtÝQÀ ƒ‹ô”ú֐‰ÖРG\¢‡yçG­¾2I؂ÂÇ0É MQS!ڀ^l(BÓäkùòöEH+~"Ò¢ˆ×íóW¯AZmMzÂîQL[^|ãõE1 á%m¦jÄÿ‰jß%ìI¬1gs¬>‡ˆ;÷ZQ¼˜5³¼Vù,‹7:ÑLUŠuÚ#Æîlh{Æ¢%}ÇãZ8ڈø ¨ý÷Í'~ÿÉ9ý©9 äž£s’Tð>sGç`š§:¨{@äžS’ȽH3?'ºÁLÛlÛk0 ëgŒ±ÒZ¶¸.qm6e—xQ6h»¨ÈuycXjµVIQu›#{¹mpuR6y«œ‘®C C‡èö1w†ë®4“¬ÖBÿˆ’¹½É”Ž+÷£ÄúÜþ¬4)ßq'…Êfg¥ìe<[º§æe½ÃZ¯S÷†î¡ «•½ù's7Iº°×YªÚ¾÷ÓY¬lGÍÓSã¦óªÝž)ð¦oê÷ï*·UžvþÛ&1üµ.«ôº›Ÿ»•B ˜4Y–ÝöY}Ü3ZåéÞâä{=ÿÆJØÃ, ÌPf÷Í®ÝaU®`Ïà†­S¥›(ƒŒÔ­&Órº‡seAW;:”–”§i`õkµ˜B™U¯¾XØ«dƒ J ̬sqY–fy÷¹ÊÀ0ÿϸš³¬Pø–î`±‘Í0¶Gz5~T¬aÄþt(bü'WÙß´çœþ%Õ #MˆÎº¼²#Í"š:œ¯QeÝg-ûà•w? L¿¯Ö—>@EÎË¢Ø\^\ÜÝÝ¡YŽ ô6Š‹‹ÍfuqÈÚ )M~%¤Šàuæq²0=‡ƒŠ üÿ?Y«í+ +endstream +endobj +4048 0 obj << +/Type /Page +/Contents 4049 0 R +/Resources 4047 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4053 0 R +/Annots [ 4019 0 R 4020 0 R 4021 0 R 4022 0 R 4023 0 R 4024 0 R 4025 0 R 4026 0 R 4027 0 R 4028 0 R 4029 0 R 4030 0 R 4031 0 R 4032 0 R 4033 0 R 4034 0 R 4035 0 R 4036 0 R 4037 0 R 4038 0 R 4039 0 R 4040 0 R 4041 0 R 4042 0 R 4043 0 R 4044 0 R 4045 0 R 4046 0 R ] +>> endobj +4019 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.187 687.016 272.748 696.943] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +4020 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [354.877 687.016 450.438 696.943] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +4021 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.914 673.75 192.84 685.705] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >> +>> endobj +4022 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.546 673.75 304.472 685.705] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >> +>> endobj +4023 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [424.295 673.75 472.85 685.705] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_16b12775a696c6e304cf9ee7ffe2213e) >> +>> endobj +4024 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.187 616.281 272.748 626.208] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +4025 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [354.877 616.281 450.438 626.208] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +4026 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.914 603.016 192.84 614.971] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >> +>> endobj +4027 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.761 603.016 305.687 614.971] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Checked) >> +>> endobj +4028 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [428.699 603.016 471.636 614.971] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_a355ae6b2a2a704e88060541fbaa6562) >> +>> endobj +4029 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.617 544.57 270.177 555.474] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +4030 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [388.048 544.57 403.878 555.474] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_d5c5cd5266cf95dcdc0f03d0108168b5) >> +>> endobj +4031 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.923 498.722 274.484 508.649] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +4032 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [377.32 498.722 472.881 508.649] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +4033 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.639 485.79 229.787 496.694] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_2ee8a6019070192609b3ea6e5dfa3018) >> +>> endobj +4034 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.55 389.461 270.111 400.365] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +4035 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [326.347 389.461 353.803 400.365] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_ga88e9b9cb2588cbf5914695fc14e69a8) >> +>> endobj +4036 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [387.102 389.461 414.559 400.365] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_f9af63978105e142642222864ce7c3be) >> +>> endobj +4037 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [272.441 377.506 331.997 388.41] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +4038 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [186.533 354.592 237.219 365.496] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_4ced0eee2a4a2c50779c2d01ef022500) >> +>> endobj +4039 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [337.342 354.592 411.722 365.496] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +4040 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.194 307.767 270.755 318.671] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) >> +>> endobj +4041 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [329.054 307.767 356.51 318.671] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_ga88e9b9cb2588cbf5914695fc14e69a8) >> +>> endobj +4042 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [391.097 307.767 413.572 318.671] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_6133c234bff425e6feac34cef06b74b2) >> +>> endobj +4043 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 295.812 184.651 306.716] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +4044 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [184.322 248.988 235.007 259.892] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number_a7885d402d5653321f316029ca0af517) >> +>> endobj +4045 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [307.185 248.988 381.565 259.892] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +4046 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4050 0 obj << +/D [4048 0 R /XYZ 90 757.935 null] +>> endobj +4051 0 obj << +/D [4048 0 R /XYZ 90 213.66 null] +>> endobj +4052 0 obj << +/D [4048 0 R /XYZ 90 150.984 null] +>> endobj +4047 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F72 471 0 R /F50 339 0 R /F35 2018 0 R /F23 340 0 R /F99 2117 0 R /F97 2175 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4065 0 obj << +/Length 1851 +/Filter /FlateDecode +>> +stream +xÚíZ[sÚF~çWè)3a½÷Õº—™6i:I7Mè“ãad¶& Q!⺿¾gu,ðtR?É«sýηg/عq°óKï§aïì•dŽFZRé §ŽÆŽ’ JœáĹt A²? c÷]Ÿ`×Oæþè]Ÿb7žÝß“Äý^'~r~þâ62ƒ‚Éèb5¿’þÕðÍÙ+B +(Uˆ1 ê3ùßåCZ6Œ(Óåˆa_q÷y@…1!SŽï-’™FD³ò³v +~1ó—Ë\î°¯©Ì3? ò7ïƒ)˜O<7ˆÆðŠA]"„ÚûyØû«G@ vH0¡bÂÏ{—WؙÀû7FL{Î]6jîpj ›9zôpgð)CXŠ:øˆádͬ{µŠÆiGùÓËx¼šQêg¯ÀB? 1®›r)$¥¥§›1TqB»’®ò*„éý"ˆü¹‰„jhþ¨,WðÔüŸêΡRZu¥~‘jÀû`¹š¥¹šƒP9È¢3 T O Ҋ´(‚½±L@LT'`AŒç­–SÙí6§HjÒåµ v%÷ü|lNïsÙ±À×q<Ë¿Ó¢ñT ¹29ò#‹l +Å «L~_Œk1¯´§É*°Ia¨vœÖL»[Œb€Hv16Œ¦¶HBb¤<ŠQ²jÞXcEÇ⨱‚ì‘<ã8Z¦‘¦bX¶azF³0 +®òn|UO ñ”7ø-üˆ1 –ùhÚ´†c$=U›ƒ™E$`W&§·áåÄ’Ò+ô‰²*ÓUŒšÞDê/I¼H³Š¿Ç·~âÓ ÿ £›óŒ]KztˆDœ(V¡ Ÿ>Bé¶G]PÚÝm››À§5aÕn¶B½á¦%ÌÁÕ °ðó¿(æ¦pj S)æ…ØŒQ>=”‚mè"õ”Y£«-¦‰®oÛA Ć |`Æÿ'ƒéç ±-âe˜†}*ÜÏ}"Ü;q1ÿEyyӮߔ×T–ŒÈà> +Óû¾nW†çˆKµAKž"ª(b`Hž"ѝ¢ª¼2ÂÊc3µ$L@Â(9FÂÖ)u{@Bojwþíû´ƒ,œ E€à!¬  Ýl¬XѽJ šü1š”4eZ¤ÉÃû-vÒ~‹QÆ¦@Á‘Äގ&X«Jâϑ= F¯§öþ+º£SoÈz½]˜z„^ësÖp~OFöË¢BkĈÜ_…Íeõr;º(]wQ™mþlŠgÆ I‰$SÈ5ÉÉgGèüÉض1q‡ËQ§#­êFÞP]>ÿëìÏ3KŸB`‚UÙøÛbO«Ž3.´T'A­¤\&9ʯ¬•“ƒ´TNµ(y‚v7´ÕNÞ×íy­–£Æ´{0¼â\>*¼aNæðæ-x³'x?Á[ YÁ{1û2tú–põ˜èfÆ+¸ù ÁM´´ƒ)y÷Âjol“.ÛZ¢Nm£Av!ۃZfìì4‘M±‚eHjs]Á +A +lHŠ2.6¿˜GÅtÁ m#ìämº²É^ÈÖ +I¢­]‰x¢í'Únv%PFÁÍὶ4Jñ˜l½|?ÍjyBP Ló³Øüff]/¤h `°>6ç ñܶqÏâª3g„"Uï¯~!ú,~Zô·T±Ù4€x#ªÛ€;¤úΘûì8ñaŒCßVfÿw§¹õDԑ(ª¦ì5˕WîÚnJ– ¹æÿ½ç$ã}VŒÉjœæ¦>K0rFíæˆáɱ]Ÿhmþ Uì±gjª(mU儱Ø{J{^l‰SŒ@o ïãU4 £›ÑË0±Ó0¤+¬MÊ!ëGKæ×јƃ³z"š¯“hä>D#wlÃQÄê]Ý.¦ñ­±x Ó";˜ÆCâðæ×xoÎÁn¢Q’?µxFnã‚°¦ñ ÁÀ'%ÑÈј Ø{gY‹øߍwJ¢ñäöb‚0x^7‰À"“ÇY†¶efs¼¥b«ßD"ÁÕ—£Ráí59`B!nò| ?åřúUÅY6éeqnmÏ)°ÕaµiÎ̽¿9w¶Ÿ–A³°yZÖî`"ھн£>iÂýq +”J€‹­Bõ)o +y¢j¨—_íÒÜ:`Ô}kH˜k7|ÇÒûx匏QÎj§ +qúžàyë&†'éÁ3íI‹y½–íL!ÄìõKP¿ä´õ[]X¿~}‘¹{´çíÃìÖ¡€¯VÌ+n +„(v‰‡åՂwæN…¹YW<–WëòÇâ~]þðç2H¾é á§èoýhf‚üzF²¬ŽÐ12w1MPÀ–‚ p2÷ì“Sþúµ—Ũ¶—˜ÖWAºMÓÅùÙÙÝÝ/Ñ* + +Ó³ÅbvÖ +ۚׄpTã`ZÞ,™ÇIP^!—ó쌭Çÿ_é¾o¯ +endstream +endobj +4064 0 obj << +/Type /Page +/Contents 4065 0 R +/Resources 4063 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4053 0 R +/Annots [ 4062 0 R ] +>> endobj +4062 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4066 0 obj << +/D [4064 0 R /XYZ 90 757.935 null] +>> endobj +4067 0 obj << +/D [4064 0 R /XYZ 90 733.028 null] +>> endobj +3650 0 obj << +/D [4064 0 R /XYZ 90 716.221 null] +>> endobj +4068 0 obj << +/D [4064 0 R /XYZ 90 716.221 null] +>> endobj +4069 0 obj << +/D [4064 0 R /XYZ 90 557.385 null] +>> endobj +3898 0 obj << +/D [4064 0 R /XYZ 90 535.073 null] +>> endobj +4070 0 obj << +/D [4064 0 R /XYZ 90 535.073 null] +>> endobj +3899 0 obj << +/D [4064 0 R /XYZ 90 503.88 null] +>> endobj +4071 0 obj << +/D [4064 0 R /XYZ 90 489.309 null] +>> endobj +3900 0 obj << +/D [4064 0 R /XYZ 90 459.441 null] +>> endobj +4072 0 obj << +/D [4064 0 R /XYZ 90 444.871 null] +>> endobj +3901 0 obj << +/D [4064 0 R /XYZ 90 415.291 null] +>> endobj +4073 0 obj << +/D [4064 0 R /XYZ 90 400.721 null] +>> endobj +3902 0 obj << +/D [4064 0 R /XYZ 90 371.141 null] +>> endobj +4074 0 obj << +/D [4064 0 R /XYZ 90 356.571 null] +>> endobj +3903 0 obj << +/D [4064 0 R /XYZ 90 326.991 null] +>> endobj +4075 0 obj << +/D [4064 0 R /XYZ 90 312.421 null] +>> endobj +3904 0 obj << +/D [4064 0 R /XYZ 90 270.886 null] +>> endobj +4076 0 obj << +/D [4064 0 R /XYZ 90 256.316 null] +>> endobj +3905 0 obj << +/D [4064 0 R /XYZ 90 214.781 null] +>> endobj +4077 0 obj << +/D [4064 0 R /XYZ 90 200.211 null] +>> endobj +3906 0 obj << +/D [4064 0 R /XYZ 90 170.632 null] +>> endobj +4078 0 obj << +/D [4064 0 R /XYZ 90 156.061 null] +>> endobj +3909 0 obj << +/D [4064 0 R /XYZ 90 126.482 null] +>> endobj +4063 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4082 0 obj << +/Length 1473 +/Filter /FlateDecode +>> +stream +xÚíš[oÛ6€ßý+ô´ÙXÌð*’AQ`+ÖÝ]ë>µ…¡ØL"TO–“z¿~‡¢$[Ž"¹‰]¤]žt!uxy¾ÃC‘Ø»ô°÷Ûà—Éàô¥Ï<´O}oráiìIŸ A‰7™{ 4&ãáëÁà ‹ƒéëÅÃ4Z_™yLÿϳ [Ÿ½¸2³O¶’™OÿZÅç&}œ¼:}IÈV”JĘÍòŸ¹* F”éªÆd$ùðd4¦ÂªP4ÎÖ-’™FD³ê³ç½‚_DÁréäNFšM¼ˆ‚ܸ7ǫOÔÐ$3xEˆ C"|+tðëdðπ€쑢ÄD’ oÞÄÞÞ¿ò0bZy7E­ØãÔ*yopgçS†°/6"¸¼Rñ¶ñŠC{¬«WAG^۞¯& b°ŒIæ—wi–uv9a>âŒvö9AœóªFlâ4[O—á¿fjÛ)[Ló š–ea2=_çfieycÊ1ÂDy0H‹²_>`gi²ÌÝXíåw Ä(~÷ƒ«¡E³†¬+|nÁ‘V¤ªö“²Žhvµ¢õ`¼ÏŒõ•ùGWS୚c¢)Êv«D>ôJñÅ“¯²¤D"¿*I(ÇÝÚaswaâ®n¤ŠÛôbçC7žeál¶Z„f^}Õ¢=e!w:¡¡¶@ZÖPK/)Sˆ00½ƒ9"Fœqð“÷Ô,ëÁH!MüŒ4'wcdÛ0Ÿs³Ä0iÐ4®H¢HkÝ$iküî…{Aú â÷cŠö1ÅûR½LÑ}˜"{1E%JÄ>Lݤ8H‚ËnŽŠñe}©nŽÀÍH;Gô˜Ó‘àÅt$D1ÁÓv™èãH ŸðŽhmú^>.!_ÙÄægwÉ$»>nuïԖÃg²_ÙZpº0Y§ÙOŽg¦€`ïif<âÌXvë»$¨\D«ŠÓrxÉ7坂"®e3Oû¹èð*OK[àйª3­RˆûµQPü>¸4U ðRHÎ/³j9u=¢bD«2ÍKÒ²æef›É—Y`´™+0âŠ?pµ„5d¬¬0ñDØÿ”0PXÀÀù¨ï™çɸní÷“îP«AH¥”ÐßU”Y>ÊøGŒ2DÛ?»ÅåÄ]še=QF‚Cðî(ãsz;ÊXÑ3Fuˆ±/ö1\!ÌEwˆÙj·‚¨× HuÁ#µhƜocÆf)F›éäÁYZÆAÝ$øfÙM(‚¹|àL‘ÒZהò‰¢ïž¢§Yù„R7}‘d}øH¢Ž¹G‚‹Hb/v“²ž_S²à®ûgdòv(±²ól•ÌêXbÛÞ?–øaMzþ_mµ\Täùܦï¸Jô}W¡ÓPªÃü±¬¨÷Kv}¶»ó‘®’yÛþ¬Þ|ÒÇRíÂÀcs7$1Av›­*‘Ý°TeÆYs£%8_¦ÑªÚæ¯Il%\NPݞ¸ê'PŽŠx” > endobj +4079 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4083 0 obj << +/D [4081 0 R /XYZ 90 757.935 null] +>> endobj +4084 0 obj << +/D [4081 0 R /XYZ 90 733.028 null] +>> endobj +3910 0 obj << +/D [4081 0 R /XYZ 90 691.329 null] +>> endobj +4085 0 obj << +/D [4081 0 R /XYZ 90 676.759 null] +>> endobj +3911 0 obj << +/D [4081 0 R /XYZ 90 629.555 null] +>> endobj +4086 0 obj << +/D [4081 0 R /XYZ 90 614.984 null] +>> endobj +3950 0 obj << +/D [4081 0 R /XYZ 90 567.781 null] +>> endobj +4087 0 obj << +/D [4081 0 R /XYZ 90 553.21 null] +>> endobj +3951 0 obj << +/D [4081 0 R /XYZ 90 506.006 null] +>> endobj +4088 0 obj << +/D [4081 0 R /XYZ 90 491.436 null] +>> endobj +3952 0 obj << +/D [4081 0 R /XYZ 90 444.232 null] +>> endobj +4089 0 obj << +/D [4081 0 R /XYZ 90 429.662 null] +>> endobj +3953 0 obj << +/D [4081 0 R /XYZ 90 382.458 null] +>> endobj +4090 0 obj << +/D [4081 0 R /XYZ 90 367.888 null] +>> endobj +3954 0 obj << +/D [4081 0 R /XYZ 90 320.684 null] +>> endobj +4091 0 obj << +/D [4081 0 R /XYZ 90 306.113 null] +>> endobj +3955 0 obj << +/D [4081 0 R /XYZ 90 258.91 null] +>> endobj +4092 0 obj << +/D [4081 0 R /XYZ 90 244.339 null] +>> endobj +3956 0 obj << +/D [4081 0 R /XYZ 90 197.135 null] +>> endobj +4093 0 obj << +/D [4081 0 R /XYZ 90 182.565 null] +>> endobj +3957 0 obj << +/D [4081 0 R /XYZ 90 135.361 null] +>> endobj +4080 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4097 0 obj << +/Length 1585 +/Filter /FlateDecode +>> +stream +xÚíZYsÛ6~ׯàS+M-÷‘I3ÓfšÎ¤Ç¤ú”f<´D˚èªHÙQ~}O™&(GJÝXO0Ihûa÷[ì88ø¹óã sþJ²À #© WÁ’ J‚Á(x×%É^Ÿ`Œ»ozwÃÕ,¼xÓ£¸»˜n®£Ñ*¼øur¹ +W›gÏ^^GÃvR4ºø}=»ŒV½÷ƒ×ç¯)) T!Æ$¨ßÊî¦TÖ@0¢Ìd3=Å»g½>v [œá¦F23ˆ–ýì…WðËiÇNî gh7š-§a¹7FW°|¢»Ñ|¯´K„²B;? :ÿtˆÁÙ&RLÃYçÝ{Œàýë#ftp»5 8µ ›o;tp#ø”!,E>bˆât’l‰w×ô±&Ta<·=Ù,£y8³Æ*æÃà@†§ê·FÈ WQ>̹¢ÙŒë‹ÉÈɞGã ؃Éxîð7¸•;)™Ç‰Jzs'*,êÛ}f82”°ÅȈø{¬åHÂÖ´v°oÜ #ª3T>ácX&Ù„¤s*BÒ4·íÝ*²N1zïf +\šÙq£À:…$åî?l!O]?YÔ(àQÍv–Y¬—¹“$6zDtÇ=Ñ “ÉbŽjì³+RðfÂuÇÑÉÉџ¦£ÃŠìûp1çJíàÁŒ7 ™x!ØÔBàò‚7ÖI«X§L"-̑ƒ=¹ŽjƒÝ½\\Õha¡v¨hȨ|B-m +hjYÏô¨¼aoW¦òMûyCsåñ#AUo˜nx—xÃìÁ܀ÛpO`”ô¼ajxCKõ$¤8v‚„ ]L×Ù!ó¦G!x¦ëȟ(yÕáÙÉ៦ßåÁ¥8v¢¼'è&Ä®ñæKݜ/9Cª>[òc’Ç[ò`Ž<à©ôyPb¯3‘¢{P"ÐŽF³õ´ ¶(Š¨ž)éN#dKÜÞ9[7šJu æ°"›Â† "È^ÔaHNZ¶¤ÜŒÄäu€u¢¼öÜÇü p/ôaÈÏÃ`ë~ +æTÜïS,†´‡;;äћ 9ÄyW&ƒŸhQÈìKà·ïܐÂN+@Hñ%$0«Cšù:>=†9ýj‰X“ˆÝ1 gn¨~óœâ଄}¡I pJD ²ãõe•ˆáÝDLg>¾)é>ñ‰ˆOD,^Ä>œˆûŽˆwÊiù•öÇÃÑÿªï,žTÚÇCŒíÅŒɌ‡æmyÔ(•–šác54î8àÕA1ðԏqH ÊÁÀèIy¯ôs1þRÇáñ*‚5d] áb6Ëzð£‰%è›I¼X5ô•m¢©Ë`ç¬ÎGuR$ ¨|ÔÜÜÚ§ö<§î9#«#R3ÄR³ÎÜPýæ¡fçTÝè¥ÑâÀVP³• Ô}Lrv¶¯Ú³³äHÎýü>ՇêUĤò +Aí G-Ø>´¬¤jÇCZ!A|`0ÌîАP‚ŸÅ^Á~»c }¥v'52(*h!5Ûe ôÔ Ïv¼´,JAVúï:ÝÜ×èÖfŸÄü•7û¿@mĸB攔’rºóq”$“ù¸®¨ƒÒ‰Óû¼E%>!ñzxnÐu˜âאœ",éݲ"¹’[6NØw©ô™D#&H ™´Àx+ì{7|¬Y®Ð$9_.§çØv¬&¶#ž ¹Ê?³Å*52‡—³âºpÿ¾³œ› +endstream +endobj +4096 0 obj << +/Type /Page +/Contents 4097 0 R +/Resources 4095 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4053 0 R +/Annots [ 4094 0 R ] +>> endobj +4094 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4098 0 obj << +/D [4096 0 R /XYZ 90 757.935 null] +>> endobj +4099 0 obj << +/D [4096 0 R /XYZ 90 733.028 null] +>> endobj +3958 0 obj << +/D [4096 0 R /XYZ 90 691.329 null] +>> endobj +4100 0 obj << +/D [4096 0 R /XYZ 90 676.759 null] +>> endobj +3959 0 obj << +/D [4096 0 R /XYZ 90 629.555 null] +>> endobj +4101 0 obj << +/D [4096 0 R /XYZ 90 614.984 null] +>> endobj +3960 0 obj << +/D [4096 0 R /XYZ 90 567.781 null] +>> endobj +4102 0 obj << +/D [4096 0 R /XYZ 90 553.21 null] +>> endobj +3961 0 obj << +/D [4096 0 R /XYZ 90 506.006 null] +>> endobj +4103 0 obj << +/D [4096 0 R /XYZ 90 491.436 null] +>> endobj +4009 0 obj << +/D [4096 0 R /XYZ 90 432.277 null] +>> endobj +4104 0 obj << +/D [4096 0 R /XYZ 90 417.707 null] +>> endobj +4010 0 obj << +/D [4096 0 R /XYZ 90 358.548 null] +>> endobj +4105 0 obj << +/D [4096 0 R /XYZ 90 343.977 null] +>> endobj +4011 0 obj << +/D [4096 0 R /XYZ 90 284.818 null] +>> endobj +4106 0 obj << +/D [4096 0 R /XYZ 90 270.248 null] +>> endobj +4012 0 obj << +/D [4096 0 R /XYZ 90 211.089 null] +>> endobj +4107 0 obj << +/D [4096 0 R /XYZ 90 196.519 null] +>> endobj +4013 0 obj << +/D [4096 0 R /XYZ 90 137.36 null] +>> endobj +4095 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4111 0 obj << +/Length 1721 +/Filter /FlateDecode +>> +stream +xÚí[[sÓF~÷¯P_¨Ó“ŒžŽ_]̏u2ü0zqø”(õc†_鐋Ôl Q¦J‰ÑÐãîýáƄÕÀádiÑÌ"Š•ÿö¨UñãY¦¹ÞÑPQWϳ Óù“7úÌ'¾«£ <"DP—ß(< ÎÔ`‡¬&<ä1áLæƒw°3…ç/Œ˜ò«•ÔÜáÔ6sÞþàÆàS†°ëà#†¨*2•&^wÞç0kŠ*ØÈ+ß³åBGÁ­Êæ]¢ :L?ä’oF%â¾»<$)Ïÿáù‰E' è:xŸ-ª|Ä¥_ +@óRá^†SZt1‚ð:ŸK‹2Ýëo$Ü`o4g±E/g”Øê§ÝFfgªŸ_ÄY¨£,¿‹OŠ!Ê×aØJ„{ +uµzPz—†qTý% #H|“Ÿ5{‚hjÓ"!㍑¯ È«"@¢Hl n¥GÇú,0}ƅKa׋hªßcL#=-^X=#´ª¶r¨¦±.ôGqVáT[ôKÕF;²µQˆßw˜¹òu2|‡Ô }n¨Ó\îç—Íw­Ô‰7Kb×tEëÔiFJϓ¬bLó ;c +Š0#m°õÀë )]:Èk)€Î +°“¹øw¡Ž¤è>9k…ÌN$ +‰/Ù*±[x°B¼yBñ•æ§­!h%Ð/À @I¨:müҎÏQŸµá³º†Ï×8=¿’âeÇYc +¤Ào‰%°ö¡àgŽ%õi8#wˆ%B +wDÌUšb’œo¿¤Vuf¯[âIÏô¸¤ýš*¨àÑƲ¯ézžŽ_Y>u_õÔøÏd¼Ña–!”‚ÊÖ!*#FÄ¢fX1×gXÚ"}t´²2˜]@<9áî½{{x@¸BÔk̯i®u‘Ù³&'±°Ítö`~‹±ÐÊ÷n`,Ùe¬l3Ö·»¥›¢ÂWEïãG‹25Öì"¤Ã#lÅµS!Þ>i18[0ÀqÏ,º…“4rƒ(šæ/Àn¡“ ‹“‡ó{“û R3 a®V¶`fñíµQ&ÝM™¨Ú…‡0–_“Œ”Qäu2z 1 ³e=XC!¬íÈN¿Kd—Jµb;íŒí¤;ðöØÞc{í_ÛÚÛ©Ky—Ø.Ú°Ilk«Æø-Lõ^ð¾õ€õðþ»ì὇÷ÿ¼[´JÀOáw¶øæü ͧ÷ïæO;²àõ™ÿ³DÃ?$å7ü üB_ê¿%܀8E¾ ·ø™å;c†dõ»·hfŽýV¢§‡žzzø±éAþ‡éáA¿º¸ùêâ¥.7‡ÞåÒBöÜÑsGÏýÒâGâŽ~iaYZ4ÑÆ~ÜàÝ宏»OWçâ¹E¯G‘hÛÕÏ×{Uo¹¯¨¦k_ +ðºÑàøêpŠÚ˜ X9f›_˜'$òÆü²îØô4²ÎÒ*gvÿRˆ`Pç®»}c!i}ÍýFgI”Z𤹿ñS"ƹ¿+,Ä2èp\SP{- +<¨Ê½ý][/I›†©†V›†ÑiEò®Îtv¶þòPäöÒìÎ©x÷öFŽìóž÷rŸw”o¨ÂY¾ÛÜë‚Y>ë$®ÏmqZ.ôdóÅl9”žUGš¶OFI)âw=µ:™=Ì/D …„à[ÛÚ_ ÌQ´â¶<‹–ßÒò›¿Sül·ˆÇATMÞM+åÎ$ëþ~3]€'¡»ßj]8™{öSþõû`•¤µ½ÄüX/ŒÎ²lqtxxuu…&)ºˆÂE‚Âìp±˜Ö¶åµÙt¿®¤“23ó8©¶ÉÂÃ9ä3Ž®Åÿ_±tX” +endstream +endobj +4110 0 obj << +/Type /Page +/Contents 4111 0 R +/Resources 4109 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4053 0 R +/Annots [ 4108 0 R ] +>> endobj +4108 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4112 0 obj << +/D [4110 0 R /XYZ 90 757.935 null] +>> endobj +4113 0 obj << +/D [4110 0 R /XYZ 90 733.028 null] +>> endobj +4014 0 obj << +/D [4110 0 R /XYZ 287.777 663.906 null] +>> endobj +4114 0 obj << +/D [4110 0 R /XYZ 90 647.802 null] +>> endobj +4015 0 obj << +/D [4110 0 R /XYZ 90 599.975 null] +>> endobj +4115 0 obj << +/D [4110 0 R /XYZ 90 585.405 null] +>> endobj +4016 0 obj << +/D [4110 0 R /XYZ 90 526.246 null] +>> endobj +4116 0 obj << +/D [4110 0 R /XYZ 90 511.676 null] +>> endobj +4017 0 obj << +/D [4110 0 R /XYZ 90 452.517 null] +>> endobj +4117 0 obj << +/D [4110 0 R /XYZ 90 437.946 null] +>> endobj +4018 0 obj << +/D [4110 0 R /XYZ 90 378.787 null] +>> endobj +4118 0 obj << +/D [4110 0 R /XYZ 90 364.217 null] +>> endobj +4054 0 obj << +/D [4110 0 R /XYZ 90 305.058 null] +>> endobj +4119 0 obj << +/D [4110 0 R /XYZ 90 290.487 null] +>> endobj +4055 0 obj << +/D [4110 0 R /XYZ 90 231.328 null] +>> endobj +4120 0 obj << +/D [4110 0 R /XYZ 90 216.758 null] +>> endobj +4056 0 obj << +/D [4110 0 R /XYZ 90 157.599 null] +>> endobj +4121 0 obj << +/D [4110 0 R /XYZ 90 143.029 null] +>> endobj +4057 0 obj << +/D [4110 0 R /XYZ 90 95.825 null] +>> endobj +4109 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F8 504 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4125 0 obj << +/Length 2931 +/Filter /FlateDecode +>> +stream +xÚíZ[wã¶~÷¯ÐÓV>YÁ¸ƒp“>4Íö$m.ÝuŸvSZ¢mH¤BRñ:¿¾3xJò&yjõÂ4ÀÌ|óÍ H:{˜ÑÙß/þzsqõF‹™%Vs=»¹ŸY:3šÅÙìf5{?gŒèË£”θdtž–Ûôö‡KNçÅæù1[•éí?×weZ>__ù˜-ÂAÙêö»ýö.+/¼ùæê cƒ 87D Ó7ò?wC‚50J¸°íˆ›K#ç¯/\ᚉ×Ëçˆda ³¢ýÛ_N +þr“V•“{siù<Ûî6i¹;o³{X>KæY¾„[Œ)>gʢЋ¯n.~¾` †ÎXc0eˆj¶Ü^¼ÿ‘ÎVpÿ›%Â&³§fÔv&9.l3{wñ¯ zÔø\ªUo|"ˆH¼êv‰‡Ê'æǬ +k”îõó.ËÓ-h&„œ¿i4-¶ /[(=1†G&Ã¥’£¦g„&¬ñUžÞm²Û¯ï#Â$'Ôð£ø@Y݈¯«ÛïÒz¸û¥ßí÷å튑)¬%‚…àB2E¸b3ð<±Êû£·S}à+v}è€ÎF××ÍbÓÍíKÅüÕ«OP„É„0@Ëñ`2ºóû1/6ðS؈¦ç뼎ù°Á_`„3Ér»s'¨¢Ë"¯jw9„+•óWN¦UC­9%šÊVêÇÈ´’ؐ¯qxþ¦¨ ½îgFVèÍ×\Æf֚tþxŽN+y·.PÌcI«à ïÖö¾Ì0èW?º‘Šqšp°ž‚¢Anó‡·Y½/s¤6aæ)ô<Ï.™š?\ª9BŒ+„˜š£ç€ç¿feᆥ;îŠj=è¤ü‚7fqÐ*†X­ó÷´ÈÝí§Ç¬~lÉ?PŒ+M˜T#·%ºk¯Ä¦À‰Ÿ²ÒMT?¦¹_yöó>ݸAu ‚ž?”˜Í냉YZQB{x>G¤ˆ5æ(N´{VfÕ.[¶y¾ÔjN"( ³…žKBž· ÏkiîP †@IìQꖄòߋºYu‡SÄTfœØÓT=At†K°j¿‰qæMb¥ äŒ<éi¨nöõn_»s佪^]_U튑tëžD9¥LǤE™6!‰Ò=˜ƨ–ßPì f~•®B¥~¡ŽeCE˜•ëå팏ÊÈúˆ*²¯íhò~[Ç-H"’Ñ„o‹}ÃH·[—Á #BòÐA«vì¸ÌÀ³3¨šOPuXR@e'!ÑE_Ò?0ð¹JЯxxíÃgæxMÍ% å'ŠjÁ:7Âg|åÅ.+ÓºˆµŒ +bmdzŸG# ¨ÍÀ!tj¶¨ãp8~2F„¿Pà˜A pV—è%²Å©.G~Z“sʽÜhpAEØ3þÉHþà‡5 +§Š(k}‘âMÿ½ç9ԸÅzA¶”ìÿÙò:["rÖy"䃛éºÜ(À«zIþ¸of̄|ð&·ƒÂõpMt_ûú Nä+ÃçF~kž:¯¥àc- {Š¯{Cßïs¨r‹¼‰Ôn7cœí(Ð9°-$r +èidø $0(Ë«ëàx«bš:;iÊômÿ–ßX££ïÁ²Á‰›VŽpgå•*‹íŸGrÃâ/˜ +PM­Ϻ¸ñ™¢C*ôWÕú„æNӜ}¬¡™ÊVƒU¦0ô!ï­ýõ2­|(÷^Ïýr™UÕý~Óë;®œ[«ÓM`›´3 ™v ®…±›r[¬²p¹wþ:Ýí6ëlu:253;|ÐÓ¢•òpÆˊÆȳÎJPuBƒên´ ¢}ºdsöò3&ffÍZÓºÑOëúыØîÊl¹®àoÍ@>/p¥®,?P*\ûŠÍ —´KËʙ $eeY”×0!·À›'Ôd½Y4' [MhÍ3¿u™–­©S—ò |–KðNí«‹å a8äCޕ´->ÒÜßޕhŽ e¶+ÊÚ;®aQ «‡5ùÔñØ4ëÒtüà®ÒósíŸy0â…n¶&àÞ(àN$ànކÎáêΜ#áäaÐxû¹}Ȳ¡’HqÀÖc"ÁœÔÓ5— z2XjÙ¿±‹P™ØQBK½§pw` hà­åïž#Kӌ0u@øáÊ ±B W֑D‚ßè¹üM4Nh%¤%y|KFê.Ò÷»"ˆf œ²Ù}:\„>@ª\¶Øqe-¢…íh#ëæñ0ÍWÏy~ô"7~c¨Íՙz™z$62R˜„²á™–Ñ?p®ÂQï›< fK¹w@¹PyvaævÖZrw(mƒ³Š¥b‰àèR”Öhj“ˆá¥!ý>÷ëˆ(,YºÐÿFdpJܡÅ|[‘&I¿Çõ'Af0¡„‘ÛjK´aÇmÙP$#ހÍSw¬–ë,¯Ký°¢n} WQCsʉÒ]ÑÃTÆc҄÷Fœ4éßo0å†p1IHú¾âP÷Y8ëJLA4óDþŸÈdP¨B—»Œâñ}Ò¾$F +½+š|ÆØfiî)éêMv/ôj1TƒŠ‘Du|nlž›–®˜8\Tô\è@É/`ñ&UQQWŒ%¹±xXËÁ›*$`Ë)Í1#Jèŋ‚ˆ*fµ 8N:_å|Նãø‹Nj Å6“áI5”Cæ¥á‰lÞYº‰[ˇ÷eºìYv—SÈ)#¢ç$¦®D<.%e/ñ ZD%Y’$ɤm Ô‰õ¶9Ó4j¸Þ4xՙȼ1 ÞlMsòW3¾³^ÅídÔp·í8Ž¹_©¡­ &9@*Âûº]łâ`÷Ç-1ꁅ€Æ7½'ý=òE1²WÜf“.ϳ %ŒuÖ±›¡e¾ˆã «„Ò(•…pD!ÉÀŸÊè†+0ٓxÕa/“xlú†šJZ|oëÆw˜Ä«8&ˆE¿ k ’c*½ss®Õm¿+b˜ˆ¾æn¶‰ŽžSÒt3î@Ýè5GÐô”¸àB*Û,0nG ç@á Bœ}è@’Lmx1ËmÌ*pÚïh´ŠÒ<í «¥æ(!y0õB0J.`„ +´#>B0âqFäÁˆBÊÄ;=âóò——¦ŸE{ȨRMZ÷ øé`èø’” ?, hõ;³(5‡D c ×ê¬jaÐÚ ìîšd™ôµƒ¿&jBÎۚ!Ýà±°aŒ$aòFÁÚ`©<šàVÓ_²y»÷îžÝq_µ›Ø폠õm +õÄ-ÓEU?o2ÿ_vlÿ•dóvõM Ž'eš?d­F¸Y#€T¸£ÐþßñX–œôE5`Ö}šT ãÈmú ñB:=}/p"ûÊBœSH½Ž/lðBO舚Þ#=Ù¹zþíˆR‚Ósáw±4„’}ݵö=}Ì u³MÁôß%œ2‚~‰³ýàÏ13pAXbÏuwÒ÷ÎRRnÎʦ§ÕBv2VöˆÇE ,b*^x2m>A[3Q óssÿ Ñ1°T[ÙC²­x&&€ñ)¸àñ’?,Õ:e»„1þ¢X'IJäÜŠ›‰a¾Á 5ŸäŽ÷QÀt„ŸpûËönwé?ävÿ®²òOøBÞwûߦù¾Ý@ƒø·U×êC§„£nøî„Ñù»,óJ:Í~šµgÿ¸hü2ðabˆè?3y¬ëÝõÕÕÓÓYVdŸ¯w%Y×W»ÝæêðÝÏ ’ô/Ô}UvÛÈ÷͇G//Áþÿ=î_C +endstream +endobj +4124 0 obj << +/Type /Page +/Contents 4125 0 R +/Resources 4123 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4053 0 R +/Annots [ 4122 0 R ] +>> endobj +4122 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4126 0 obj << +/D [4124 0 R /XYZ 90 757.935 null] +>> endobj +4127 0 obj << +/D [4124 0 R /XYZ 90 733.028 null] +>> endobj +4058 0 obj << +/D [4124 0 R /XYZ 90 667.419 null] +>> endobj +4128 0 obj << +/D [4124 0 R /XYZ 90 652.963 null] +>> endobj +4059 0 obj << +/D [4124 0 R /XYZ 90 611.852 null] +>> endobj +4129 0 obj << +/D [4124 0 R /XYZ 90 597.396 null] +>> endobj +4060 0 obj << +/D [4124 0 R /XYZ 90 549.769 null] +>> endobj +4130 0 obj << +/D [4124 0 R /XYZ 90 535.313 null] +>> endobj +4123 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F13 540 0 R /F8 504 0 R /F7 505 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4134 0 obj << +/Length 2376 +/Filter /FlateDecode +>> +stream +xÚÍY[sÛÆ~ׯÀäEde®ö† µ‰ÛUš¨jÍd2ãĞ%‰˜ €–™éïÙ„…–Ìtú"-gÏùÎý,ˆ£»GoO^ÎOÎße(TDóÛ(ÃQ"Š)‰æËèý„$¦3‚1žÜL žÈf#?ÞL)žÔëýªX6òãw墑ÍþââÕªÈUDÅòãõn³(šé/óoÏß2@i‚ ^óÿ³!ñ0Œ(ËÅ|šðɋéŒÆ +‚\æûg–!’1wì¯Ï2~µ–mkøם›íZv…ÙùWq ðI:)ª¶‰é„¬˜ž¼žŸüû„m°8A ‹£|sòþ-aÿÛ#–¥Ñ½¦ÚDœ*`ëèÝÉ?O°güxˆp”á$J(CÞh˜©U•Ee Ka «$bHaˆ>Lg …¿FgŸ'`ãÑl@L fcì9ј;ãüŒc¼)dUVw†6r‚²˜8R‚)ð#°¤ñ€y‚‡Qœ&Žê®éXWr´®ˆµeQœý.mÓôÿW[Ì18‘!B1ãI‘„bqœŸgL`ÄÈ Ê6 !BY*e„M!8‚ŒxÎ)X‚€o¶MÑKcÆcó8`èÒü[–wegÛQ[›ÿÚKq‰ ²O"An©À¿¤’[bRÐp”sʏrBú„àiˆjJ|Ȏ­ËÖYävJã ôKu°uÛԛ€ órêxƒ£ bÈè°ë›BÒÃÇ, Öd¢'õ±¼¥"ñÄÑ`¨qÈ¢/7>ÅQÆ¿Ô3ˆ"N õ6¡´)Œvlû™Òا{?‹1¶ùz5k»ýÚ>¬LݐË"/7P(ô&$‹~žQ”²>áðç0p΅—r*f)g²ªu)d±|/a¹‘]™Ë!ħФ©T‘ë]њçui&æP‡ƒrY݆S¥}R !`¨Žeèì#d=µ¸ï³@¾Á0Ì{‚Pöúæáù€Šôì Ðä j•‚ Z?Æ!hÀâc?%LKcDpŸ•¬žuѤ€¯ Ù›•´MFSƙ߄L[ýJB†Œš«Â Æö˜Ú¡gü©+é’gQ¬Êj9J4™çŶÏÃv_uò³YçºCësöån³®üÛ8ioëõºV}ß^ø‘1Ç!ó.ÿµ~BXΰèõƒµÆÿ *¹X[i÷Û"O6KóôêìÌóæ.بíÕßj0ˆ/xÞÖ¥nÊB•¨½ºiº›ª¯äš½[ǤÎ;GÑ©cIjmÙh:êãj¿í£EϦ\ƒ„¢µ¾¹_•¹µ²Kaa¢_ŸÚnë<ì’îì̙SîV²Û5®O+ÂÝ*‹¤‡´\Ԋ쓶ÇÈ~hÀ¹¸?± xy+„Û$/åmtü8%„Àá”cÐn]䫵r(KðdS+†j⦏õÞ<éÈR‹¼Þl×01¸Š®Â,ö†“Vß0ruIçÚºk¤ªaSŽÕ·$Ž‰5´zן“Ëei +§V ÛP·õkÛ–m­MÑßÎbuñ¢Î»Í‚U§샒º#À|6¼'ˆg}sËͅNQW­òkW~ +ÝaE4í?1èáÖùÌr$7¹´¥¢nöÁ!Ɲ´oŒ/¿¹z{5}0¸IGóƒll@ncš¢íš2·¡Ìl•6ÈLkS_Iâį ù®±ÁÝåVĶ°ˆ^Cزõ‰C@­ÍŽ"oíÞ(Ãà-áÊH"U7NØ jŸAÙÓWÇÁpY:iãÛ4ˆóg[Ed_Hó¨oŽ#åªaà„OërSڋ/dfúÉgBc˜a}P´lìJ•~×sÛ]_‘íe®çßñŠ¶lŠå ¿Ð®úé½ö÷aÁM Ç1š1Îù6yR×2áëý˜Ô6÷_»?þ˜˜\˜£”Âå‰äæ3kMg„B)¼˜Îü»þú”ÑŸÁ¯®ß@µÀïNa8=Õށ¡*¼3h%Ê Í»«·×f¥SšÂòÒU™LdÒ+ªÁKŸt`4. ¡§‡ùê£jñÍՏ˜]Dš=’yÀCŽF%ʲg§6HiW—Ìc¤å ‘îŒäXYÙ¢;={lG~ÀŽö8¥=ð™;-.c春â¾XÎ͔^ÿt32_ñ‚¿½þÉcd8ôaÊJSõ Z­UÿOú ÜÔÁŠƒíÎbʌ†Ž)‰jõòëw¯}%Rq Œn³\oþqu=WGJ£ßøƒ‰O¯g‹¶•~þzál®…«O!ø3ʸ SÏAçÖƁ³a÷F”dÂcè X. ]‹Ûgp[S ÌH¬À|uýû‘gO¤]|ÀÖDàåá4ƒ?`¶›ï5 „ìFöDÚõ¦4!˔rqDÒ 5égºC–îU¥Gà ¥ž«r|æ·ÓCvë{òøçT~&鱿¦ê_Qax€E c>ú(r£f"õûµ}t?`›Gû+¶yø¡-šÓiOZ÷¡Ú¹ûŸìÀÖö÷PŒÔoËfî€12¥(¬’F³_#·ú»Bß&Ó1܏˜«®Û^œŸßßߣ¼E»ªÜ6¨ìηÛõ¹g¶‘Öê·ã¤gÒO„æve>½êû•ºß ±ýÿ ¾Ó× +endstream +endobj +4133 0 obj << +/Type /Page +/Contents 4134 0 R +/Resources 4132 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4136 0 R +/Annots [ 4131 0 R ] +>> endobj +4131 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4135 0 obj << +/D [4133 0 R /XYZ 90 757.935 null] +>> endobj +4061 0 obj << +/D [4133 0 R /XYZ 90 89.441 null] +>> endobj +4132 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F65 376 0 R /F13 540 0 R /F50 339 0 R /F8 504 0 R /F23 340 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4154 0 obj << +/Length 1631 +/Filter /FlateDecode +>> +stream +xÚåYÛnÛF}×W(àJ@´Þ;I¡ ºuдiSGí‹4µ–ˆH¤BRVý÷ÝåE¤)JIí¦EŸH‘»s=gv†ÂÎÂÁÎËÁwÓÁù¥dŽ|I¥3½u|츒 A‰3;×CB;Œñð͈àa®ƒÙ›ÅÃdu¿Tó4˜ýݤAz?™\$ñ"ݪ8T£1xx± +²ÌÞ^©[•Žˆ7´o s±IF璘?L Â1¹L8ázpý;sxþÊÁˆùž³3«Ö§ ®+çíà·îu†2„¥¨œ‘ˆ!N rµÞ¬‚\i+Î/ ÙÛêqЧu˜ßØ á`#÷ËùýFÅÁ\c˜§öòL_Xë]»(¼ïÐJXKx)õy‡Z‚‘+ËY>ŸL¢,·¡ ÖVř՛lTäIÚ¥S$ÝJM§ \ù÷ |H™Ù닽½cÄðh ÷Eý(ëP#‘ä¢Ô–‹¥ +?h°©ùì—íúF¥Ý òéKDŠ²ÊƒéÈåZFco˜HùçGw@'©Zðg‡Ž|ì—kBò(-]§JCuþÞ®x?ÞÄõ4*àŠ$åvÏñf›[+$1DÖ`ȯ[4aOHJ™¦‰¾è¤PÞz×Oê#\³ +GpçVvÝi0%Ñ܊ÎvÁÆÞiTŸ6B!aXôùÙPXí˜'ÌCRø';ÒI6N8r1i’í(èŸküó¨FQcšWð¾Ók^‹è£9‘j æ5¹övgÎÆMÖ!›zˆcÖ* ™°@zå‚]”/»¤@ 0oùِ"(•”.–%.‚us?!×¹'4×õ噽4ßõsƒµ´$ ¯Z&q–7”žÙKìf¦«m¡Y€j½la¬9cÊ%ò¸l’ë Q˜@œ¸ÿÛC© 7È’ °oâ)ÏbÏbcKXëݑ³õ—dÏÝ+vFæ™Õט~sú!P#~ÿÓPìVþõz4ftY ¨áÿFcÃ\ä1Ú,¶Óe1_̓p»VqäQÛG·Ð䘛|£GXO!¶J?*Ö]‘š;Ód]nU¥°Õ*Q59^ØGï0¦+51cK9w8DB¯'H”8G©h®º6çíf³BËe8›jùRˆaÏ}Âñëaœ±.tˆ™ŒÖv×*ŠUPÄ3¬„£ŽŒâ"C…ó_Eq¸ÚλH-Èkƒ\"õ~¸Ú•Ö“¢ÅÒ&v|Š1m7ÅK•FyV–\"Š> ç•MýHžÔ3¿ÙÞý¬Ø×Ê0ÜÜ_nãPÃ3k€¡ej (˜ò€ìxœ.Š9ùª‚Ô^Þ[€³ˆ-8û²CˆK¯³pQryϞÒ—B ãKÉM£>pu¨¼ˆú¯éˆ¹ÃyC`K8mîÇƬtêɄbÃü@þ˜KE0àûäKÅ ì¢8ïŽÙß ÙE#@Ù¨²kÌ·P•Ìol4åkÄÅ°,aêã6XEyìØLí€õÂVC¹Úâ(üՙÚ% bÍæòô<Q8u>1Q痔µz佯 w0^WŽÊÈã>5=@N*šÙù^=p¹gýˆ-?|ûo­/²,ZÄúP¯¿\à~1ÀŽ j÷L·Ç÷h{³MªYµ³z57?7ZW*ߦqÖj[jí6„·­÷wÊ·¶·¨pf'™îtlÛçïO_rkþaÖQF8’¸âŸiÀÖJ¨›ÜOÌ&tƒ‚ÉþtV4Q·úüÖ [žfºRçÙdb">KuG´âù Ûbeô ˜á·A7«NÊÜ=)ŒÐùÕ”¨x˜@8¸·÷Õìaút+Uµ÷QÜ(öÄ;(î…˜ÏÏÿ$N¢x™¬=R$Ûl–«týE¨oÍЃÂÂL›Æœb¶©‘ú&鏄K)qô´¼µÿø‘ Àsâÿ>æÿH¼Ô_H½âÿnˆö XõùÅϲٷ?‹Žßþø=Sé×ú;y¶×A ­TÝ~ÝiQ*­Ë+FzjÖYE£1ƒ ¿U%V¬gœò gm/Œyˆá*XË<ßLÎÏw» +3´£MŠ¢üf ó‡ÓÞýý·RMÀë$­P×fJnæâÿüÇ +endstream +endobj +4153 0 obj << +/Type /Page +/Contents 4154 0 R +/Resources 4152 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4136 0 R +/Annots [ 4137 0 R 4138 0 R 4139 0 R 4140 0 R 4141 0 R 4142 0 R 4143 0 R 4144 0 R 4145 0 R 4146 0 R 4147 0 R 4148 0 R 4149 0 R 4151 0 R ] +>> endobj +4137 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 348.395 164.042 359.299] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_ba7dbedd485eab91821f129132a04723) >> +>> endobj +4138 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.379 348.395 241.511 359.299] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4139 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 309.541 164.042 320.445] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_3a4c3af6146717b3302f467368eafe46) >> +>> endobj +4140 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.379 309.541 234.885 320.445] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4141 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 270.687 171.791 281.591] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_b45e800217e1c61d8595e2ffc51a83ad) >> +>> endobj +4142 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 231.832 164.042 242.736] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4143 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.782 231.832 215.588 242.736] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_2c93e938cd478716c7c9e5e9988f7a98) >> +>> endobj +4144 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [242.925 231.832 293.057 242.736] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4145 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 192.978 179.554 203.882] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +4146 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.052 192.978 250.666 203.882] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_584cb5084fe5479b0c373e3d17fe5ffd) >> +>> endobj +4147 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.933 154.497 297.728 165.028] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_79c648d88214174287e3763b804f4aaf) >> +>> endobj +4148 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [301.544 154.497 336.732 165.028] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +4149 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.933 115.27 342.261 126.173] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_3c9879f0c9dcb81fe1bbf78828509ef6) >> +>> endobj +4151 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4155 0 obj << +/D [4153 0 R /XYZ 90 757.935 null] +>> endobj +4156 0 obj << +/D [4153 0 R /XYZ 90 733.028 null] +>> endobj +2083 0 obj << +/D [4153 0 R /XYZ 90 691.329 null] +>> endobj +4157 0 obj << +/D [4153 0 R /XYZ 90 676.759 null] +>> endobj +3907 0 obj << +/D [4153 0 R /XYZ 90 629.555 null] +>> endobj +4158 0 obj << +/D [4153 0 R /XYZ 90 614.984 null] +>> endobj +3908 0 obj << +/D [4153 0 R /XYZ 90 585.539 null] +>> endobj +4159 0 obj << +/D [4153 0 R /XYZ 90 570.969 null] +>> endobj +1423 0 obj << +/D [4153 0 R /XYZ 90 490.066 null] +>> endobj +162 0 obj << +/D [4153 0 R /XYZ 90 483.466 null] +>> endobj +4160 0 obj << +/D [4153 0 R /XYZ 90 367.369 null] +>> endobj +4161 0 obj << +/D [4153 0 R /XYZ 90 367.369 null] +>> endobj +4162 0 obj << +/D [4153 0 R /XYZ 90 289.78 null] +>> endobj +4163 0 obj << +/D [4153 0 R /XYZ 90 250.926 null] +>> endobj +4164 0 obj << +/D [4153 0 R /XYZ 90 212.071 null] +>> endobj +4165 0 obj << +/D [4153 0 R /XYZ 90 134.363 null] +>> endobj +4152 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F72 471 0 R /F23 340 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4194 0 obj << +/Length 1504 +/Filter /FlateDecode +>> +stream +xÚíYYsÛ6~ׯàSJÍD<4éCë©;¹&nìNì &)c^áGùõ€:Lɒ"GíLlÀÝý¾]ì. 13 ñçà÷«Áøܱ øvŒ«©áCÃu W‘qm"ÜáA͋!‚&-S\ 14ód~G% ޱے–óÉä,Ïfega<aͳ„V•¼ýOãrˆ¼˜Ò¤::1ŽÀ‹¢ÛCnÝ`þëäèþ³™L!hÍs 5\#ô¿²‰™ï‚ëÂS²£anhÂêùÿÌô=[+ÀØ}¾Ø¬@ëÌEȾ».Â\QûÈÈ´"–Æ<.äÙ& 7.evSƒz^ôºñò1þ¤z"U g?Ù´`QWSôháó¥m=+œõ,ŒxI +z®Pa]\X‹”‘ì[ÕÈ>°ÈÀ>@¾÷DÚ°±ÊHã4/çAžŏ¹¸‘pu^sPsYÜÎëøµc’?è›7:]xT ´âÊ[¡¨ÞÖÕÄVv];¬í-­†êÇ0l +GzV{±ã‘ÓVò€íÙV‡ñ¡M…¾òÍ6;--:à‡9¥mkño+ÚÈóôNÝc°à²Óöö¥íƒ±hûfB«± jÒ♑û§d$ýáØžÓEڎ&“0.Ëœ3üvyöúõrc©—Šçñ´ÁzsÃÀç>Dü7 °ÅâîV ÜÖÌyU—1M¥^T'ü©VÐú}ybÛðèÃEɞ½ä¿ߨúvA Ç>†IW’¸^Æø#oïÑT,›õ¬Æ1tÜ‡ªTô–¥çY Õ±æÕ«¾”ÎÖ"#ÞÓñùdè»GªY¤Ï'9¶ú<ëñù©ñŽK÷@d±öQßzNo_Ýä9[ÛüäÀ@!Ö©w ڀ/v¤ᇷÏ"ÎîâPÄ«ûªëÞ©&Yòœ¡Íƒ-AEŽ’਄ŽãS‰³Š8ÄY9ñZŽC1➊ˆ%Ź ‡r½‹æ6Ñ÷ïãôV—çM +&¬¦­ëtò|n$t~ê|®’Ý +ĖvÀæ;ú5¨ +ÆO÷!¾Ç•ûÓkþq–6*V´R¬×ÁªJûŽ¶E¨þŽfQ"›­{VÆR‚hµÄŒÝvX–±šÑD”»Z}ýÜØá–ç›×ŽÇÆú˜Ø¾Ë¹'Ͼ‰QH]ip.„©ÄÁ·zÔ'ßòQˇ¿«¸üEôÔÀïiÖuH„_ÄRq¹@–=l^iBó2֐šÝúîí  Ž y‘ç vñü®®‹Éxüðð +4+JÀêqQ$ãǾ·´ +jC Zdš—º \v¡„¿LÛpÖíÿ//¨É² +endstream +endobj +4193 0 obj << +/Type /Page +/Contents 4194 0 R +/Resources 4192 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4136 0 R +/Annots [ 4150 0 R 4168 0 R 4169 0 R 4170 0 R 4171 0 R 4172 0 R 4173 0 R 4174 0 R 4175 0 R 4176 0 R 4177 0 R 4178 0 R 4179 0 R 4180 0 R 4181 0 R 4182 0 R 4183 0 R 4184 0 R 4185 0 R 4186 0 R 4187 0 R 4188 0 R 4189 0 R 4191 0 R ] +>> endobj +4150 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.933 720.286 290.247 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_39b6f38fff55dd953ec509b3739dd17d) >> +>> endobj +4168 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 681.058 164.042 691.962] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4169 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.782 681.058 218.358 691.962] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_a03b119140132112557907b772102b33) >> +>> endobj +4170 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 642.204 194.776 653.108] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_e96eebded76c559c95910dc233c68f06) >> +>> endobj +4171 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 603.723 195.334 614.253] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_c26379e5f82fd0223682b11b9e052ea5) >> +>> endobj +4172 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 564.495 224.634 575.399] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_29c6deef0eb3911adbb08d36a8f0b3f2) >> +>> endobj +4173 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 525.641 179.832 536.545] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_6609e54e84d50cd074c2dd65f38b47da) >> +>> endobj +4174 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 486.786 227.981 497.69] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_d67d37524d1fb7f31766c0b02cb8591a) >> +>> endobj +4175 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [231.797 486.786 297.44 497.69] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +4176 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [341.943 486.786 392.075 497.69] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4177 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 447.932 191.718 458.836] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +4178 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 447.932 288.852 458.836] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_484373d269a31c21efae44a83f8be6f0) >> +>> endobj +4179 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 409.078 191.718 419.982] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +4180 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 409.078 303.079 419.982] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_0ff04e47054c14b2edf29096ecc95ab7) >> +>> endobj +4181 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 370.224 181.845 381.128] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_43983a6ee447e480f8700915bccb4811) >> +>> endobj +4182 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 331.369 181.845 342.273] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_c53e4323b140cdd4ba1ac96e7204d93a) >> +>> endobj +4183 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 292.515 154.727 303.419] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_146b211f83e22bd011d3de2e5975073b) >> +>> endobj +4184 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 254.034 176.505 264.565] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_94b3624c208219e401569cd289049b38) >> +>> endobj +4185 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 215.18 150.493 225.71] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_33e6005a1fe40cb202eb619912c25c3c) >> +>> endobj +4186 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 134.044 203.075 144.948] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +4187 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.573 134.044 296.324 144.948] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_5a207ecd92e9fd8f3b1937a5064746a9) >> +>> endobj +4188 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.005 119.423 322.825 129.328] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4189 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.437 95.563 194.297 106.094] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_b917a480b6afe7e2750aa2862c6783cf) >> +>> endobj +4191 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4195 0 obj << +/D [4193 0 R /XYZ 90 757.935 null] +>> endobj +4196 0 obj << +/D [4193 0 R /XYZ 90 733.028 null] +>> endobj +4197 0 obj << +/D [4193 0 R /XYZ 90 505.88 null] +>> endobj +4198 0 obj << +/D [4193 0 R /XYZ 90 467.026 null] +>> endobj +4199 0 obj << +/D [4193 0 R /XYZ 90 428.171 null] +>> endobj +4200 0 obj << +/D [4193 0 R /XYZ 90 389.317 null] +>> endobj +4201 0 obj << +/D [4193 0 R /XYZ 90 350.463 null] +>> endobj +4202 0 obj << +/D [4193 0 R /XYZ 90 311.608 null] +>> endobj +4203 0 obj << +/D [4193 0 R /XYZ 90 272.754 null] +>> endobj +4204 0 obj << +/D [4193 0 R /XYZ 90 233.9 null] +>> endobj +4205 0 obj << +/D [4193 0 R /XYZ 90 153.018 null] +>> endobj +4206 0 obj << +/D [4193 0 R /XYZ 90 153.018 null] +>> endobj +4207 0 obj << +/D [4193 0 R /XYZ 90 114.283 null] +>> endobj +4192 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R /F98 2120 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4245 0 obj << +/Length 1457 +/Filter /FlateDecode +>> +stream +xÚí™ßs£6ÇßýWЗÌIJ$B™ÉK3—N¯wô.}º»ñ,&XøNâû뻈¶ N'>$Ëî꣯v¶¦¶~ür1ù®%ð©o]ĖÀ÷ b”Xë³Mâΐ`Œís‡`;Ô³p|îPlgéòJNt8~Ÿ\êP/O35Õ ©"é )ÃöiæyuúQÆR;$°««ÄåØ·‰ï:_/Þ Þ^ ¾ 8„-b`q—YÑlðù+¶&ðÿwF®¬[s×Ìò¨ ÇÔú4øs€ë`ºG§VÁù^¡áÀâÔEØgU€¿©¤HÂ4ù.kW‹«Úý¨t·½btÆðZò†”"ߣpt‘¨ø…R¶aÃú#i\4·F™ ¾î¡''8oœÃÎÐ |û¤:€ì•ïš+TØ0é¹pØM:!ƒJpL{Gp@í0ÍëP®Uv«êØóUtÆ ²²3tAc< y &*{ÝñièØpß#*ÜƟ§ÑJ0EçÕâíMsyPPKcauèÕHB֑†Ø8ÕºÑGjymÔ¾ìê©tT°’TڐÊW¤ ©x ¦,@4/,\ê!ÏoTl7.öaëý‘–a±uÌw ï}¢d¨ÇoïæZæf8ú ”ähgžw´H_ ÈÕ*ԅ&XŸýy¸ý}Xyˆ­ü‘Š¦“KÄG`Yjo Û€$[€ô¢d_â>âôIË꿒ÇÇÓLÆe¦ò‰©Šq¡Ã¤ÈÍ«Æº¨•8©WÇ äµÌõÁk2mÅIõXÈg­…îúL·BæRÄȞŒùây¥Œ=‰¶ÊX!°¾ñcü!JäA¬Ó[IÀ@û„5„ž°:)ç¦/Ì +rRe䃜]B!aÎÏ**`4ò7t Íö Óu4Ý6fwk¶òdªÆ*ƒn÷P ׍ñ.å«×míþ?¹ ¸®>Õ¤“D]e$”¿Óò—T2[4“zöƒó”fïaA9 Ó´ŽxõHÅQ›©ºÈž$7ɤIj¶(y™Íš2<£"ÓåÃùn3Ö5&óõLƒìNž?{sZfþ© F6—:„°FϨKéÒ¢é~ÉõK·eQ6¯{á,®4ò»Vo€¾z­ÖGÓن&›ûk]{ik¶H‹dž.5í1êqÄx[ï^÷Øäȧm¿{vo…›/ß8PW¿/›,ÒÅ5Ž0ª)ÿáÉûÚ ÊK> endobj +4190 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.437 696.376 188.759 706.906] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_2ca2446f563956eb2b92ddd17e5c0b2c) >> +>> endobj +4213 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.953 657.148 211.085 668.052] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4214 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [221.824 657.148 307.233 668.052] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_d07dc0dabac5685f9db8d9dc11e513f1) >> +>> endobj +4215 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.953 607.334 211.085 618.238] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4216 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [221.824 607.334 285.136 618.238] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_8aab82f7118966662582f88725ce4735) >> +>> endobj +4217 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 568.48 187.563 579.384] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4218 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.061 568.48 213.834 579.384] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_7facb7a06ac72f1af2bc514c788f1a38) >> +>> endobj +4219 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.172 568.48 318.421 579.384] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +4220 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [364.578 568.48 441.827 579.384] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +4221 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 529.626 187.563 540.53] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4222 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.061 529.626 213.834 540.53] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_57362a4d56c397575a6d043cdbcec0f9) >> +>> endobj +4223 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.172 529.626 318.421 540.53] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +4224 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 490.772 187.563 501.675] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4225 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.061 490.772 213.834 501.675] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_5b3db7ba1765b3a04f8d320968f70447) >> +>> endobj +4226 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [391.157 490.772 468.407 501.675] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +4227 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 410.009 197.337 420.913] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_6a24743a95176da13995bb6c17151c9b) >> +>> endobj +4228 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 371.528 175.748 382.059] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_29c63b939ed830a0395170835e60beaf) >> +>> endobj +4229 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 332.3 205.636 343.204] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_fcf86304f17dc474e1e5bbe0486c1b59) >> +>> endobj +4230 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 251.538 164.042 262.442] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4231 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [164.54 251.538 202.497 262.442] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_a948df90fc7880e7e52ceef297ee9bbf) >> +>> endobj +4232 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [229.835 251.538 279.966 262.442] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4233 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 212.684 164.042 223.588] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4234 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [164.54 212.684 202.497 223.588] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_2cb39e7c88e9e724e7970d0e953f2c81) >> +>> endobj +4235 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [229.835 212.684 273.341 223.588] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4236 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 173.829 180.54 184.733] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_deee840f3313b6050d439dbe5fe2fdd7) >> +>> endobj +4237 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.877 173.829 258.009 184.733] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4238 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [299.742 173.829 349.874 184.733] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4239 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 134.975 178.239 145.879] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_af7dc46b2cfbd6650ac1d2035d331f15) >> +>> endobj +4240 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [205.576 134.975 255.707 145.879] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4241 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [297.441 134.975 347.572 145.879] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4242 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4246 0 obj << +/D [4244 0 R /XYZ 90 757.935 null] +>> endobj +4247 0 obj << +/D [4244 0 R /XYZ 90 715.095 null] +>> endobj +4248 0 obj << +/D [4244 0 R /XYZ 90 676.241 null] +>> endobj +4249 0 obj << +/D [4244 0 R /XYZ 90 626.428 null] +>> endobj +4250 0 obj << +/D [4244 0 R /XYZ 90 587.573 null] +>> endobj +4251 0 obj << +/D [4244 0 R /XYZ 90 548.719 null] +>> endobj +4252 0 obj << +/D [4244 0 R /XYZ 90 509.865 null] +>> endobj +4253 0 obj << +/D [4244 0 R /XYZ 90 428.983 null] +>> endobj +4254 0 obj << +/D [4244 0 R /XYZ 90 270.512 null] +>> endobj +4243 0 obj << +/Font << /F63 374 0 R /F72 471 0 R /F50 339 0 R /F97 2175 0 R /F98 2120 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4278 0 obj << +/Length 2431 +/Filter /FlateDecode +>> +stream +xÚÝZ[wÛ¸~÷¯àË&TÁ¸ƒt6ÛlÒv»mÓÄíKvKK´Í­D*$Ûùõ\H‚tIºgOO|H‘À`0óÍÌ7 qtáèg¿¿<;#Y”¢TR]ÞD)Ž”$HP].£1!HÍæc¿gõ:»z;£8®Vwù²Î®~,®ë¬~¼¸xU•·õ6/ùlNŽ_­²¦±·ïò›¼ž‘$¶o SXÆDòÙϗ?œ½¾<ûxF@!£€PH1-Ög~ÆÑžÿaÄÒ$º7£Ö§ ®«èýÙßÏðÁÍP†°v3ïòUÖæK«Ò›m¹h‹ªl´çoö&âhN9b<µó~Âÿµjݶڻ¬íîòÆ=ÌjwSVîå:__ÞÍýM·QÄlºÓ:"q–À‚ áý‰R1õa.ÀM»¼¸¨š¶Î³µ•üÄ Ó¦«o ߙ úuµÉ묭j»GB¼=ÌÁ&˜%¿ýv´àÄ D¡4I»±ÚUšçöfmëåAe²M#i±c¦A/E£ô’\ë5OÄÁMsÂQʸUïoÛv³u^И#~»gÛsJ‘ä® ¥˜ìqNp—Ú]{vyÔ[ß¼ YE[ýÓþX”yV_½~ØÔyÓè‚ÎÉéÎ:Q"=ÕiQ}Ÿ½ËÛm]6}\õÊy<`“(Ä1ë0ٍPÞŽh»D&2~!˜¤â˜¤~Í¹PÆëJK!¥0ÎbÒY`²aN%½¦_†@¢$Rôÿ‚¯ªüfFÇtQäe{ÕÖYÑ6f©«Z׎¡ª”ÿs0ôðf!|¥àÁ¤P$¤H +îgWƒ«ÔâŠîÅ£H¯„•LJˆ…Õá¢óÉTûb¹ßçB²¸¹7ô`³#Þé흭y…p¼â §~òð|¿Vàü¯“ %Eê’BPÚä'§¢ÐFs¨s³ßoòE‘­ŠÏ¹#@H¼ì@NTçFSW›{kÈiÍHzØá +4'4E"‘ÑœC¹ç|`uˆ8^÷}ÞfŪ£EßçÍ¢.6­‹ÚÃÄè;;geâ}KF?=ȃ¤Îߕ®._ÿ’/º}3GCÿ Q¸Ϧ:]|÷:“x°àp.XÜê0¥]Ðûô +²OÂHÉ\h¿uƒ0$ŒTÁ²†„Aƒs(He£üõbX¢bÈ;pxC$¢°p_ëv—Òx&.æ@å ;™qÅ®P›ô¹ê%Gn”¥†šaY`9¨„ÄS>Zl$‹!FTä zŠ’ð: Ê÷ xÌíyXÎÜu›»Þ¢ælÈäsª’Cµç|\íw%s°?éí¿Þ é–+/œ@tAVV`2äý”¿À’ÂjZUFâRÄh_tH0&l1&ãe±ÎKSœÍs„ú±{/âf“-òç!ÿƒrr`CGœ/Fé'¡ê%‘?hªcQBÓüV7RúÍbÊì8«¼Ð¥J§û"»^åAä&`’ÞKG°v@ó¶nPÈNÀ$&`Iÿµ×?;{/Ê»jnr*Ðw5J:ÐU·y™W[-H‚#óz­ïTœ•!Ä&PWT:Aì¸é£¦çö”@@ìXAx³®–ÛÕ¶yn(n‚M'x`ˆƒ@œ†¤ôc§,Æ!íÀ|¼÷%pI–åÊ]™)”%^ÒHƒê8ìµÎ5sxM÷œÜBoíã)o$£Ö1!–G@ºLØoUÔñ@O)éñ@O)ê¤ ÛÀ¾¸á—&=` Ä\7„=0rC=õyxF¾»záSt°÷Ä ÇªÊ#ýΨN)¤G +ÐU6Ê +Zd“Ž@¶•½^ç#¶©ÍQLˆ#îå®´ˆBQMÓ‹úc¥ûŒûÉZºEÙ«åÚwðh *³I¥é@÷vÙ`ÝKwº5{ +ÀF§ã¢¡S__Í!Ôç¸}Ü‹lµz´?»­èÊw×îq¶Ù¬‹òÖ͹s“½-šáÍãúºZÙwÿê{ Ÿ•B’=¾¿yr°í{ܐ§nÅÊéa×ÙdEm˜Ò WèºâÄ$"£ÊôLØ” {00#±9Í%¡#›ÃHðqÑÞÙ9®°öCpªU±Ô'ìÖê ²…Å=à bÂêíÂëõ¯Ý‹\Öü_nÆÞ08q$ ò¬ð`Q„;­·Y²©‹a™Ä·…æ:Ÿ´5M|Ã;ë}g:*Ô7fºt †7§Þ桦ÜÒÎɖËéjê€(x€SyÈ êƒ{ñ¤kø”(5æ6®ýæ.„o>:ò;(# ¦ôxyj{Ô9ÐîTA}<-˜+Œ—ÝÞ ¶·g̬L¾‹ŒúwጼÌ5]-sg꬙7{(ÖÛõ©«õó2óEåv»¶DÅS´Mß}{øë1^Õ3!öœ èÒ¦€{Ë‚êNÿ4­!7ÕjUiÞ[Â#‹°l½YåÎEE;v´õ írúŧíAŒAŸŽ‡®ôá˜[Ÿ‡åºoýƒ(åÒ¯ç¡l# 2ݘÏG…t߄|+LMØ\ì;Ë‘†¦>÷ÕõP xÂÔ*¦NÿÙõ;s‰qü S ÖIåEEh¬>ÓÂdg,ý¬ÇÒ~ìþ’ ÛDG]Å~m!a÷LŽ•bâ*±ô£0Œ·EµÌ'õz²;ðõc¼‡bÈ×CÊe¡ D& SÇ÷ÎKR‹0{N‡ãÇTˆ ¹Kö÷Ÿe|i“ ,åiTÒx—i‹~êMÝe% æ>+íön˜Aœ²‰ G«lxê™nœ&cÔûߚ5>óW‹[QýgŽRŒ¡‰t±ÿ¿3/8R +¼ÇVÆ3{1.‹ô¹8Ù3™ù“í¬¹‹{be®&íí¹÷äEðð‡1”è}R(€2ýUðñDÂ}Ú;ƒâuº#ŒÑâGÉ >ÙxÂÇrÀø^FÅS¨í¿&Îéð=0ŒsÆùôßdHKNýoó_ÂïA´$Bð búoîg÷dæ¾Ñ™¯ öÇ?š¼~ªÃÏ_²òæ¬ÿægifí¸<Ĉ`dÊ°w Ùû¼k²ìÎþuw¶íx@‹É†<¸kÛÍÅùùýý=Z4h[›í9ô;绵“YTõBn*×Z®«®è%<\gúCšÚÿ?ÏÕ~a +endstream +endobj +4277 0 obj << +/Type /Page +/Contents 4278 0 R +/Resources 4276 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4136 0 R +/Annots [ 4262 0 R 4263 0 R 4264 0 R 4265 0 R 4266 0 R 4267 0 R 4268 0 R 4269 0 R 4270 0 R 4271 0 R 4272 0 R 4273 0 R 4274 0 R 4275 0 R ] +>> endobj +4262 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.349 670.008 226.034 680.912] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_e0c9395c1ac4d96e245be43fcd76424c) >> +>> endobj +4263 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.176 670.008 371.308 680.912] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4264 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 631.173 164.042 642.077] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4265 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [164.54 631.173 213.646 642.077] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_7415de7b412a5e297810ff35a97a2849) >> +>> endobj +4266 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.983 631.173 318.232 642.077] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +4267 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [364.389 631.173 441.638 642.077] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +4268 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 592.338 164.042 603.242] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4269 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [164.54 592.338 213.646 603.242] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_54cdd6074f90a5623c8ae7ddcfedc5c2) >> +>> endobj +4270 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.983 592.338 318.232 603.242] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +4271 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.035 553.504 159.401 564.408] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_c8652f34bdfa731c02c1900f62bd5e88) >> +>> endobj +4272 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [166.337 553.504 327.551 564.408] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4273 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.782 553.504 513.996 564.408] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4274 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.82 441.496 227.951 452.4] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4275 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4279 0 obj << +/D [4277 0 R /XYZ 90 757.935 null] +>> endobj +4280 0 obj << +/D [4277 0 R /XYZ 90 716.221 null] +>> endobj +4281 0 obj << +/D [4277 0 R /XYZ 90 504.247 null] +>> endobj +4276 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F11 418 0 R /F72 471 0 R /F98 2120 0 R /F97 2175 0 R /F65 376 0 R /F8 504 0 R /F1 542 0 R /F10 473 0 R /F13 540 0 R /F7 505 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4289 0 obj << +/Length 2326 +/Filter /FlateDecode +>> +stream +xÚ­Y[ÛÆ~ß_AhJÕÖìÜIn’‰³I›¦…oûâ-ŽVD(R&)ïÊEÿ{Ï\x¹ÒÆ}9£¹œËw®ÄÞ½‡½¯¾»»ºþA2/B‘¤Ò»ÛxöI Ä»K¼·>!(X, Æؽ ؏Ë]¼z½ Ø/²ãV%e¼ú9}_ÆåñææU‘ß—•¯ÕbIö_eqUÙ×_ÔF• úö_Â,}"ÅâÝÝOW·wW®„=b +˜ðÖ»«·ï°—ÀüOF, +½³jçqÊà™yo®þy…3ã§eNxŠL4s„ˆ¡P†0üc8ìS-Í]‘ÕúþW,0×äy‘@’oI€n÷üÉüÁQR¯7ýhOøÃ7öIÍ*"Ñ™í¬¿ýh·-íƒ0 |¥—^ÿ pOGKÂâ ¶%‰Pg˜Ýw['öM‘eł +ÿ!ÍïíÔºHܟïµêi–8ÅÔÍ®u'scØ»Hx°½‰Û„ô–p…¤YðxzD·ÿƒ|@ V>£sˆ@ôŒ‰˜´Ðq!š¿0O/Óo¬YBØbÉ9÷µBwÜúÉbÉ÷©ð„|y„“Íþ—V>ÛXKîc+Òj78Oҝʫ´È'$‡i¤¥…NÝ’kE{c bŒäŒ—LrĈý€:‹cêpÜa iÛ1hÓ`çÀ|Ñö)0Û÷kwàðåbïos+ìC^ÅuZâiü>;¯ùݟTY,;=õ4hîg}Rþ¯…à/vEàI? - pɐ$ŽW<Á,õ­cwï{Õܯ֩æC%v"®Æ\]†Ê$"ÁÓpØÄY¥vä”Ú-º¹Ñ"ZˆVf¥ƒÍ´‚À>äH=·©&ù£þ‰3•×/û§¶ƒ]Q:æÓ|Á±^­ÉÇ~#…fŽNq³¡žtoɧ!WK‡=-ҘËÏi®âruû¸/U¥1cԈehäÜì€ —üé‹éÿébú¥ý5oͧ.ãªQY}Q$I”Æn®E=Ç>Ÿ3e"1i3›q¦ä¹Î” Ìèeø`š°s§pu\’|º2}RÙ8îcî—R$Cwð_ +m0NuEc^Ú»8«‹§"|IˆœDBÚ+Þ(kÚÚJË8ƒèI§êm¡Ó՘©žÝ—…^ö1M´=ëM’~*=ÿïßnïcCã<éo`j>̆Ì]mj–än}šo +ÈNkm3ò¥ðÓºjLòØH8O<…6}½ÃyªäZl'#ËpnîÐěÍh{š×†ü{ÈzðÕFïÑv±NÁ=VèiU;5PAœ¦oAzûƤèÅJƒüPœZµh­ZøÕÖE;t#=ÀLݟû”³qá RY¯UåVÔ͝=q +çàX¥ÚÍH_Å뭝±í0#À±nL;¨jÄ…?äÄ5÷õÖ¾eÆåÚUtïµüEO´TDo|ŒšpBë’6CµØáN ò6ܝ;Q»ŸÔñVo24{q¥¦òrx¥ãÄ|”Oä\:ÈÖëŠsÉÿñô¨ºº„êЋi㽇É?xM4 ?M²hTEðéôžùb&½á>˂¼4HZ²u9@9ß÷ á"›ªêò`|* 5¨dè窱9ôdzì&ÃÒë«xçþœ‡›çÁ<ȁ]‚¥¯ÜªRîlá-ƒ1¼Í\ZMÔ-Qv*¥çt>eMq_ÊÀbPń_2ÞB÷™bÔ@=ýÁ× êÆIs!û8¦Ô—Ó8Ž8?ƒãp„ãðwá˜öqŒ.JxBÁ!|ºZèeƒBN<·Œtuà û`¶Šd("3›Yó(iâ'I“èòì%a …QhÓí¦è*´eè•_mŸ_L°zãþ®„?†*O²©œÞ¸†¦ R›Mjâӗ® \p&r–?¨°šÙéÆ.7`p|ÓKm_ +z>"än틎ú©óvÃ܇Cœ¥õ}1Çô²w¡£SAVl—ýg†¤“rƝ:Å5¤oÛmf¶ª{wIz"K“Ê­ÚµLíú¥Cퟝì¾jϟ¡»éÅ ëÁ´C怵5UoZÓ´î0 éùw\¦º2a[ßÜÞNøñpæXÞ?öäŒòALf “sðixÇAšo‹]q¯rUªU­ÊݬKõfO¶½’V ­ŸXñnÎ.43_z ’ùÿ+™ùL—ª’Cœ¹ôÿPœ%ÃFÏg¶.øYWíðíçyêïæ<5¹d÷«‘«ºéy=¯O‹Ü‰K(²oü ûþöå籞²Ò吘8܃×?ŠZc%Š4±îÇ0B}“ìÔ6H(¿Ý¬ELïã²NׇÌäx0nѨßß×1xàĎL ’a‡L˜¨Žy @N×PZíT’š2kydîٔÅÎîkïÔf]©]œ×érª k&°Œ:ƒÖþ§úB:’¦ \ —‹b]«€90‚Bu¨uŸ¨^5IzáÊî/íã{5œþ¾X dÔ¦YÐÐO9b|p*"Ïÿô5ü F$pZX.G0cK%èÅNp Ò0õ«(ø jj‹õ„<8X6ïçÅĒ¼¤}õ¼Uû BTýn™ØZÒÖ±ï5÷Çe[¹‡ÍT!—q='ÜéÕ"Æiߤ~çu¡ð>æx˜ò‚clóæ§(T÷>L¯¬×ƒ¿}\«½Öùlc} ÝF!Ã.JU'77®y Œ%«¸¼7Pzªݤeìn[Ú à:¦`p§Âà±îƒÙzº' [Y¤£.,Ø|#x)F’n•!P^úµÕ|UBºÏ!p„€8%ø(B¾Öµ¦67l¬ÆéØÁ¿*Uþq¡ÛOvü÷8oƒ«†™k=vßn0"Q[ó€;ÀþÕt5-g¿yÍÛßlLíè%¡.MÛÂi[×û›ë뇇´®Ð!O÷%Jëëý>»>ÕiïݬhÙ4ž¥ÿ…£mGžÈÿƒiÉû +endstream +endobj +4288 0 obj << +/Type /Page +/Contents 4289 0 R +/Resources 4287 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4136 0 R +/Annots [ 4286 0 R ] +>> endobj +4286 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4290 0 obj << +/D [4288 0 R /XYZ 90 757.935 null] +>> endobj +4291 0 obj << +/D [4288 0 R /XYZ 90 204.564 null] +>> endobj +4166 0 obj << +/D [4288 0 R /XYZ 90 182.252 null] +>> endobj +4292 0 obj << +/D [4288 0 R /XYZ 90 182.252 null] +>> endobj +4287 0 obj << +/Font << /F63 374 0 R /F65 376 0 R /F50 339 0 R /F8 504 0 R /F11 418 0 R /F23 340 0 R /F31 472 0 R /F7 505 0 R /F95 1788 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4296 0 obj << +/Length 1836 +/Filter /FlateDecode +>> +stream +xÚíZ[oÛ6~÷¯ÐË6«^D‰ô‡®k‡u+µÙ^Ò"Pl:*K®$×Í~ý%êBIqì%ÛТOº„>÷óOd°sí`ççɏ瓓>s$’>õó•#±øqJœó¥sá‚‚éŒ`ŒÝ³)Án˜­Ã˳)ÅnßÞ¨e^þ]eav;Ÿ?K“ël«’…šÎ(Çî³8ÌóêöµZ©lJ„[ý•°û.ñýé»ó—“çç“a‡”ðŒ;‹õäâv–ðþ¥ƒ“Âٕ«ÖŽG\cçÍä÷ Þë eû¼u1ãÎ+µ¾›Jó^l“E¥IõôSºØ®UR„å+°ÄϨ‡˜'»r1’ž¥jõcºˆàG—EFE>Ÿ/Ò$/.+§mç1Ž ¦ÕQPFHn{‹9þs*)HŒÂ«Xé5'/$ïăå…–?øX­°¢å!zõHªh”~˜å]ÌGž'êõQG‰zW-丳p&(žÈ åúתØf‰©ŽâFÕºÔjJ¹Û:[¾NW#ú fˆ²¾G–f<¿±0Jª”YBõHë4f#š<$E£§¸‰òUPf²‘ƒÊ²®ë²æá *¡¤ò½ úÉóO µÑõ–Ï­·B¬l "ˆl‹ /–ó9xéa÷cGËË0».ë¸ge·äHv|ËRþ4ãҍVÕµÌOù"Yª)áî§êq4/êˆìM‹Dl®Ó’W²®3º+…¡1!Õo|ìªÛ06L{Vå›pan—8œ—Ü5Ú xýzÄÜ÷Sî @TæÌ<ŠˆÐDZð$ÔóÜoË+;)ҍÊÂ"ÍNN 6>ÍÆä>Ðâ‰ȵÓïGáD +bÁÉHëN ‡`!Élyµ‹hG*ËC÷{àA¶ð ëÊB£uºÜÆÛÜÆ «”ÀÀ9º„ÀS˜Ã8¨qÓ$êhI +ý°ãX-µiÒÝEÅ͈qZÓÇ0^6^fj“©*)J®+[LÀ¤u —R±rÍ–M¼Í’Àña.1QÙâ3ݕ Í$ØÔŒèˆ ]|§³ætLF¾ôRE‡ª2èªÒÍ´ÖU"ÜåˆVˆmü[É îaŚ!4ØøDǗêø&U¤£¢ºfíô¼3ý‚æøÃô[ê†ðfä›W`ì#"3ªüÛã{OþÑñž~ʂÒÏÉ}ªÄ!éÿ8ýdã¨&0AÀ|²Ó¤ U5Mjr{•¦q•“£ÆG”_á¶Hãô:Z„F‚v{”Zvc§j~7—EÃ3 P}äà—4ѺÃdiÀ8‰o«»h –9šùÁêl3Ì(MٛHݶaŠBOj[Í5Ö Ø•Y¸­ù®vº×1:Â5ð{qÜ#ÌOm¥mz½¯®›°žX‰êõç*ãŠàµ½[Z–ÖÏÖ=þéî +6ɚ+QÊíU3Ž[ŸK²·sÓ%ÝÔm€oK@qø)…™E¸ÓŸ¦g&4«–öN˜ÕƒòNšñ°Ó¡'iÓrdD•†4©3N( 5‹†rà†4Í}ŠG›[ÛJ¡ªÌW"ÁkÜ~1‡Ãàò,dŠ†º Œt‘é{ˆ;¥ qFឞVW<ø¼ ȦR2;›P@LÁÐ%5a½3땐M¦Ég¿&GJ>9 ¿VÀýÀ¨^WÀPUyW«º +” ”üÆԎU:ýùÆý&’§ë‘ê" í 4H¸»QÙ!`@þÉó„=Ö¨«íšyæ«fÏ$ö ç„ßÃÄăØÛ;ˆ0#ÀŠ ©ˆ½Ç„¼â(Ñ£6ʋfä¸Aì}ùƒxZØìùØÉ÷L5½ûif/3¤> endobj +4293 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4297 0 obj << +/D [4295 0 R /XYZ 90 757.935 null] +>> endobj +4298 0 obj << +/D [4295 0 R /XYZ 90 733.028 null] +>> endobj +4167 0 obj << +/D [4295 0 R /XYZ 90 716.221 null] +>> endobj +4299 0 obj << +/D [4295 0 R /XYZ 90 716.221 null] +>> endobj +4208 0 obj << +/D [4295 0 R /XYZ 90 603.463 null] +>> endobj +4300 0 obj << +/D [4295 0 R /XYZ 90 588.892 null] +>> endobj +4209 0 obj << +/D [4295 0 R /XYZ 254.215 512.263 null] +>> endobj +4301 0 obj << +/D [4295 0 R /XYZ 90 495.202 null] +>> endobj +4210 0 obj << +/D [4295 0 R /XYZ 90 386.808 null] +>> endobj +4302 0 obj << +/D [4295 0 R /XYZ 90 372.238 null] +>> endobj +4211 0 obj << +/D [4295 0 R /XYZ 90 264.341 null] +>> endobj +4303 0 obj << +/D [4295 0 R /XYZ 90 249.771 null] +>> endobj +4212 0 obj << +/D [4295 0 R /XYZ 308.538 187.932 null] +>> endobj +4304 0 obj << +/D [4295 0 R /XYZ 90 171.205 null] +>> endobj +4255 0 obj << +/D [4295 0 R /XYZ 268.967 120.488 null] +>> endobj +4294 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F11 418 0 R /F7 505 0 R /F8 504 0 R /F1 542 0 R /F10 473 0 R /F13 540 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4309 0 obj << +/Length 1756 +/Filter /FlateDecode +>> +stream +xÚÝYKsÛ6¾ëW°‡¶ÔL À‡&9¤nÓiš¶iâžÜŒ‡&!›>>â(¿¾ | +Rd;—æДW»Øý¾]ìÂغ±°õë⧋ÅÙ ×±¸Ôµ.6V€-Ï%ˆSb]ÄÖ¥Mò–+‚1¶_/ ¶Ã2 ¯^/)¶‹tw+â2¼z•\—a¹[¯Ï‹ü¦lD‰åŠrlŸ§aU©Ç7b#Ê%ñmõ•8vmâzËw/¿\,>,l[¤Ý÷çp+Ê—ï°ÃúK #'ð­»V*³uàÿ©õvñ÷u†:»|p9½C¥CE«-ÞýõºJnò«¼é4ù¬Ýýs ÿél„6âPÁØf»ËmYÔ"ªEüN s<^uÒ+â!—2õ›?;c:¢õ­6+·R!©ÔO~rъ8®‘Ü.6j©î¾E…Ø,)‡Ýc%"¯+µæ±úE/™ä·EV܈\ªE™iñR(ñ>(ñ¹Ø©e æÁõ½½«åmQ%u"?ÂÜH#2¦–aF$`føgÆ=H`v*)´´B˜›IÑ  +¿1QæøÉo€Ÿ‘:Ï·Û4kÈþ¤W›«§RÄM´GËÖôS1'1èNE5X%ש0éVó&»†’¹} Þiâ_!ñ붌ÁÊ}Òßáȧ'#­¥'€œC|t#«(%q‡FÑÔ]¦dY¡¥6­¿Q]”æ²ñ¶.Á½t·\9œòY½Á¨ä‚cߪôÖÐHñ¡ÑpÁ?aÚæ¥\¯DæuUê5Ù(-SåB‘wFÕ'&]KJ%Uíò:üÔZÑ¿—õ38ºm´™ë©p[Q†à³Š8!xZ¦htž>5€B8bpüh‘f•e¥F|SWÌGnàÊ Ól|QBéŠ5bÏ»´}#Ò°úåE“GuÒøs5D5l—´¯”!‡cõˆhãs™A(»Pœ©WǨÈeòÉש4³PNcBSFc´‹Gtcp<@l(nOÚ­ø \lúj}U—aRWëukýJõã>aß0q¡Hó«÷» >™ µŸ+FäútJ‘ËM‹„))g)òFÔMÙWÚ.Ŷ2±v:ó6³EsçQ›MÂ&•eMZ'Ût'Ð}­ +›çÍB2Qê#æöäMò½êÛmýGYNµWY7i£+Ċ0¨Ÿ°õI~3ùH0Âîf9r†jXŠm)*Õx8Ž¯v%¢ˆû9K°¸ß{­E<˅X8¾âë°aHÜîPBþ$2>g$óÌd 2—9÷2E¦olJæ]&¡ðíØ`š@tF3“>yû<ŸD’Å“Éq»ãbiˆ?0L>…ÃÝ:Áÿ(À GvÙÒ㐼ßWJ¢Ì?”žýæ#ƒ!F¨¡…õ†šÎ×tÎظ¦Ë¯çòŠm^«Ïæš.ã0T'ciUsW_Òe«þø’î!<à™ìÂ8ÈO,éŽ.éü䒮%ÏKçí¼¤OÚMYdƒ >ÀŒq §?«êwI}kÐF9">Ÿ…ãp9ç÷¸pωEX€ˆ˜šähf]EªÏ0Í©gφW“ªïgÑ1’ +»È#=¸Ÿœ×tŽÛÀßÇJà"8Ww_bîA|Úïäs z y¾;%PטÚÄü>ãkðÆ j Ã=Ée<™âToÜV¦S—CepÜY˜&M€0Äî‹JF½ï¬ß?@>3’$ßw!°šÓoŽ|ôñ‡‘o¦•‰}‰ãß4ûd›ÜªSöq;ªŽ×ëBø"Ì:Ð'„4u$̅šMæäd€Và[|ÈÚ>Å<詇^·2hŸ7zæqôux\ª)ÖLdN¥tJä¿ô ?Žxuê4~†öˆº¬Wõ½¬&.ŸTøü*ÉEX^ýòi«À¨*5l»Z%!<ôp‚'ˆ´w­µHàxð‚¡¿¦_¸ï7øéØä; Ì@,Î瓚?á•;ŒòbÅó͍¿»SA§Ìt'Ü·ô0È869ЗC×͇ѻå\ÿ·…ùŸ(\Š‰ê_(Ú¿L€­aDšF>¹©Ww‘¼½‹Ô¯Ýe¤zÕ7’êåŸJ”ãý0oÂt8,Ս\Yõ×FÁ¤C¥óóþ[!´“ʳ÷V÷ôû¢åÍ°_âÃüû¼¾­ëíúììîîEjòd[¢¤>ÛnÓ³IØf^˜¼^Éj©îXËþÒx#¯å½Ö^üÿØÁ +endstream +endobj +4308 0 obj << +/Type /Page +/Contents 4309 0 R +/Resources 4307 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4305 0 R +/Annots [ 4306 0 R ] +>> endobj +4306 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4310 0 obj << +/D [4308 0 R /XYZ 90 757.935 null] +>> endobj +4311 0 obj << +/D [4308 0 R /XYZ 90 733.028 null] +>> endobj +4256 0 obj << +/D [4308 0 R /XYZ 206.163 675.861 null] +>> endobj +4312 0 obj << +/D [4308 0 R /XYZ 90 659.134 null] +>> endobj +4257 0 obj << +/D [4308 0 R /XYZ 507.769 608.418 null] +>> endobj +4313 0 obj << +/D [4308 0 R /XYZ 90 591.691 null] +>> endobj +4314 0 obj << +/D [4308 0 R /XYZ 90 512.292 null] +>> endobj +4258 0 obj << +/D [4308 0 R /XYZ 90 489.981 null] +>> endobj +4315 0 obj << +/D [4308 0 R /XYZ 90 489.981 null] +>> endobj +4259 0 obj << +/D [4308 0 R /XYZ 136.903 413.317 null] +>> endobj +4316 0 obj << +/D [4308 0 R /XYZ 90 396.256 null] +>> endobj +4260 0 obj << +/D [4308 0 R /XYZ 90 349.386 null] +>> endobj +4317 0 obj << +/D [4308 0 R /XYZ 90 334.815 null] +>> endobj +4261 0 obj << +/D [4308 0 R /XYZ 90 299.567 null] +>> endobj +4318 0 obj << +/D [4308 0 R /XYZ 90 284.996 null] +>> endobj +4282 0 obj << +/D [4308 0 R /XYZ 90 249.747 null] +>> endobj +4319 0 obj << +/D [4308 0 R /XYZ 90 235.177 null] +>> endobj +4283 0 obj << +/D [4308 0 R /XYZ 90 199.928 null] +>> endobj +4320 0 obj << +/D [4308 0 R /XYZ 90 185.358 null] +>> endobj +4284 0 obj << +/D [4308 0 R /XYZ 90 137.82 null] +>> endobj +4307 0 obj << +/Font << /F63 374 0 R /F65 376 0 R /F50 339 0 R /F11 418 0 R /F95 1788 0 R /F7 505 0 R /F8 504 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4340 0 obj << +/Length 1537 +/Filter /FlateDecode +>> +stream +xÚÍXÛnÛF}×W(ê’@¹Ú+—êII4Ý''0hj%¥H…¤¢¨_ßYî’"eÆv¢õo˹œ™93»ØY:Øù}òôb2= ˜¡( s±p"ìȀ A‰s1w.]BPèùcì¾ñvãr_½ñ(v‹lw£æe|õ*½.ãr7›=+òe¹Qy¢®ÎwU­VžOvŸeqU™Û·j¡J„®^¤ÅA\„Þû‹—“ç“va‡4v‰$N²š\¾ÇÎÞ¿t0bQèl›U+‡S×Ì9Ÿü5ÁwúDè|’ˆ#iýڛíù¡n±Ve\叧ú™¹ï°ÀI‘Wµùü*ÍU\^=ÿ´6žTUZäæӉöcz‰žrĉÓÝÊ,ØǑñ£Yð3XÅqV©Å;Œi’ª¼¾ªË8­«Ù¬±ãÊ×BŸF…,t|p(Ö9cTæÛ6q½ž¶ó“,jÄ®éKÑ©A;)—¥ÊâZÍߛ•÷Vú"BŒ00T¢€róÃ[UoÊÜ&F}£ÌM²F#‡~ $„<€2ì-€°â ý~:"`$Hpày8\ÀqØó¯ +°,tçžÏsÉŒ‹L Â;ÁhRŸa(0ŠHH¹ØÖØG]cE +Ê¢¸Õ6^ë;Úòõg~KG†îcÿi4áç^:RîN¹ME¦“AûÖOÅQÃtÇ #X#ØÕÉî¾:9>) %@&ä<_«$³ô_UçÒ¸^ÕóÙ¬ Ñmá‚!…ƒtp4Ý!ÈF£ÐbtÑ&þ¼H6+(õ¸nèD¿Ze[©­“dÏ¥Û&"öa©rMZjnÿ,‹ÕAa-Š,+<*Ümš/Í+M/™š5äÛ²§CÄ5§PMÅšR1\ué ÈÖõ:C77]¤Lì©Mv#†qD$ÿþ½äv0øÀã‘QþÄüUõ„‹CΩÐHÔñ0b?¤y’mæcü4Œú/#² £ñŽWûð 䙄AG&¿Ž%o¬qȨ/òUB›0^ÄÂB|Þ×q]¦ŸÆh +ù©ÜCý[ºŒ¡¨í°ŸK“¾æƒîòåÒ¶û·Í èpimzð@Èáuz&©‚o:-èç £mÔm)iy u[S…ÎÀÊ>Åώ3†<Ï"Äç øÌNQo6×Yšy¯ÕêºU{¶É]ïGã; +§ 7m„ŁÀ-Ÿ~ ÊÌXó›Zě¬ööñ+7 =ƒ– _ë +ߤÙÜ&flc¢VëzwËo-„‘/Œ¾`f$¼3—Ÿ †™C!'ÉòПöíH¾nÏTÝ6>¬`n§yGþEžíÆG.H²žfèY¸å¢diÖ ¬ƒ™IGŸ‡Ç +¨ŽÁÏ&XÁÿ¬JÙy=¬¯‰UKC/#І(Ý0›Œà"!»fQzLºjm. +{&¤‰=-¼†ä¬0a…=qC\nD‡Y?’ÒX4ŽQԆŽX‘šÅ`Ú/:Q½^Ü«‹tÑ`z¤¯ æQ²§ôPý +hmX€º +ÐßLè»{¡£X">~ìº|&#(L˜puÁ±Ñ g.ÞOÒèa +äëªZÀ(/èã*ê;d$Õ1ÅÝgâø~âMŠuªªa¯‹sËÅêÃvu· ÍGˆƒDB³çäês2•("…“ï—}ô¨øýÙpê<Ía2îB´ó{ƒŒGqBŽáôŒögÉñ w ÃðÈV@o)º=Ç7÷`ö„ÏpÚûV°|ŸÙìäî”jO÷NkZZ˜ŸTUºÌõ‰€×ÙÝí`îþð05e$|èYjs† +‘  åÀÖÜ¡ŠÚ?8¶èv™ö±ÝjšG»ß4WªüɵÜö:΁ì¼øZ”*«îü#`1ª1Df'q®ÚAÚxöÓÞý1i8ro/ %b¸;«¹©ëõl:Ýn·(©Ð&O×%Jë)ìÀ§··^=)Ù éÎcVE©Z~†—«æÌfÀÿ?1ñÂ( +endstream +endobj +4339 0 obj << +/Type /Page +/Contents 4340 0 R +/Resources 4338 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4305 0 R +/Annots [ 4321 0 R 4322 0 R 4323 0 R 4324 0 R 4325 0 R 4326 0 R 4327 0 R 4328 0 R 4329 0 R 4330 0 R 4331 0 R 4332 0 R 4333 0 R 4334 0 R 4337 0 R ] +>> endobj +4321 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 437.783 192.544 447.711] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator) >> +>> endobj +4322 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 356.087 198.363 366.991] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_b30ab523e337d72baa4edc802452e532) >> +>> endobj +4323 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 317.262 198.363 328.165] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_044dbf593127c9e8cbbbe2a0d169c30c) >> +>> endobj +4324 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [225.7 317.262 275.832 328.165] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4325 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 278.436 198.363 289.34] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_535895e2351f7618e9107a38d9285d73) >> +>> endobj +4326 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [225.7 278.436 269.206 289.34] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4327 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 228.652 198.363 239.556] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_6b5016000dff8b0c774381316acc0a11) >> +>> endobj +4328 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [225.7 228.652 303.527 239.556] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +4329 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 189.827 198.363 200.731] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_cf4cf2f1d8c3e1d339b1eddc94139272) >> +>> endobj +4330 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [225.7 189.827 310.153 200.731] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +4331 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 151.002 206.112 161.906] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_9d7fe3b07d9e1d35c04fa2d81e32bf34) >> +>> endobj +4332 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 112.177 198.363 123.081] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +4333 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [209.103 112.177 249.909 123.081] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_39867871dd0a4fbe2f3cef2695881345) >> +>> endobj +4334 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.246 112.177 361.699 123.081] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +4337 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4341 0 obj << +/D [4339 0 R /XYZ 90 757.935 null] +>> endobj +4342 0 obj << +/D [4339 0 R /XYZ 90 733.028 null] +>> endobj +4285 0 obj << +/D [4339 0 R /XYZ 90 690.995 null] +>> endobj +4343 0 obj << +/D [4339 0 R /XYZ 90 676.438 null] +>> endobj +1424 0 obj << +/D [4339 0 R /XYZ 90 578.495 null] +>> endobj +166 0 obj << +/D [4339 0 R /XYZ 90 571.85 null] +>> endobj +4344 0 obj << +/D [4339 0 R /XYZ 90 455.766 null] +>> endobj +4345 0 obj << +/D [4339 0 R /XYZ 90 375.046 null] +>> endobj +4346 0 obj << +/D [4339 0 R /XYZ 90 375.046 null] +>> endobj +4347 0 obj << +/D [4339 0 R /XYZ 90 336.34 null] +>> endobj +4348 0 obj << +/D [4339 0 R /XYZ 90 247.731 null] +>> endobj +4349 0 obj << +/D [4339 0 R /XYZ 90 208.906 null] +>> endobj +4350 0 obj << +/D [4339 0 R /XYZ 90 170.081 null] +>> endobj +4351 0 obj << +/D [4339 0 R /XYZ 90 131.255 null] +>> endobj +4338 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F11 418 0 R /F8 504 0 R /F72 471 0 R /F98 2120 0 R /F34 2406 0 R /F97 2175 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4382 0 obj << +/Length 1675 +/Filter /FlateDecode +>> +stream +xÚíZÙoÛ6÷_¡§Îf†¤DY_¶b-z ˚ {h ƒ‘˜D¨W”“ù¿ß'’:-;qê(ö`ˆ’)~×ï»HaëÒÂ֛Éog“£×®m(p©k]X¶<— F‰uYŸ¦„ 6'ãéɌà)/R¾8™Q<͓õ•ˆ +¾øŸ¼X¿Ê³Ëb%²P,NײélNž¾J¸”zøQ\ˆbFüi5©Z–02%n0ûrönòûÙäۄ_Ø"Šæ!ÏfV˜N>}ÁVÏßYفoݨY©åP®‰u:ùk‚L¸+ÃÙv‘cû–Gm„]¦üL)SäÛ÷+úÅ¥aä㛉õiÎ@þ(NE&ã<[”른ýJ`¹ä æÍÞKfÊgÌ0üˆÖP˜g²¬­¯G¯=jù ŒëTÂPŠ\‡Zsâ Àq´,E¹*2£ëòJèAK]Ýæƒÿ¯EXæŬåWÁDI.ãì²âæèutˆßGžë_Z‡Ûzhµå ûõœò*–zN_ À êIhTòV=sΩí!f»Õd‹9ñÎó<1Ï·˜*– ñmœE™o3S×8[VÙô‘µ^„—òÀ&ßÔ¾ï©ÕL©ß;’zRl Á³È`%KÖzmÂÀñ¶8 +úl‹*ÌüËòfBÙÇ 7!åz³L äRĵÜp 69ஸ\$q&x¡—±!~$¸€BJ×a/ÏLüªCZ +ۛš§Zá8)­ïÂ($&ÛÀà\«\G»±&W»loƒ§y•·¯…ÑO’Aü›%ö”¢&“N‚äðHuÅ{ú”aú.u7UDQ$„o‰Ýßc·Š;£Õ8ñˆ1¾Ëîà%Þ^^Âkc/×[ꀰ'÷€`@‘í·‘u,°b WÏø¹0ÔÎÇU!ѧ—­ÒsQô™ƒ—lBŠ~MˆHD{zl€ÔšÏ e², n•ã(; Ȉ³dTÕÎÅ@µƒ1 h0#eVŒÍၠ¹ëzb¥ƒL¨õ0à€H¸mB¡Ï:°¬@G D-‘i²Ü¨Àð•æÑ*Éõ7Ԙ‡ © ›¨…‰µÀ èÜ9Pö(< åç/ïRòþÈqsÀ^ʘ!ì³Û‹Sç™ÆPŠ}DYó"¬\BMv¹Ø í+= úêæ£_ÝRä;/n÷D™ óì}: ç–©½êÆ>P‹%Ò%äšÿ[ª}Qwō)³|}ßÓ+í¶§2Ã".EÁ« ©–=U츌mKÍv¨rˆ­\UZ TQÓJÑ°WÍZæB”—©Eóvq5+Ò¢*G€ëzÕ~‘b»¬CÏҔzP/ÑÛlí æ»ÝݖŠJ–rÊi~±ïOsસ‰e—²Ž›jƒ±™ç÷ë¡%—å¦ÌEv[|›ö¦V*í½VŽÇÝÇ}&Šüî üçûVß«+¨, ù:ÈG›[>(Wxó¬Nï¼»]$yËÊ!Ÿ¼Lç2ŒãE´J—¬½ +ŽÜ±Ëj;Ph7õƒ,£ããPÅXs†‘ÛÄnö‰~=}õö­jM/õEŠ¬mwŽ)6Ó]à#§Ýà}²cHiÌ{TÛ*-çÐ, nNÕ^È'²÷ˆ6=äRú$vöî`gz?3?@`ä€ϲزÝs@÷=©hȝBÖ'®sðþx2¢Äß;B¬ÚÓÆ~UCë5óe›¤AD¿Ë½pÛÙ¼|9Öü8Ènkò=^Ɓw ÞD;}’óh§ÓÇ#NOh|Z•£»dzQÌ6ÍÓ1؈8önw÷Ú½Cåî°bíî.u÷™*w©>–šhŠH?9_ïP¼ÝÆÊ^\Ô½kúÂx,´éE +öõߺÂÕ!ÇÈvvQ@qÄ E3Elò0ÔS€z<ƍs›à ¥çu]xWC9ì'å*„ÖM^¬’ŸÇ¤ðv1.x"G­¶øÑðCրppÇï8êï6Üj'Ã7ߤ°1f`|VWo'ªº-R³EwR‘¢oÍg)úæo)ŠŸ*›D÷Ϛ£ä +G×ÕR¢hO³ uLjVp1V9uï§%ûjÕ£÷¥Î–_â{ÈÆMÚ¹*ËåñÑÑÍÍ +%Zeñ²@qy´\&G=µ ¤&àº^³ÈEç8³)^áaªRé†þÿŸü±Ä +endstream +endobj +4381 0 obj << +/Type /Page +/Contents 4382 0 R +/Resources 4380 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4305 0 R +/Annots [ 4335 0 R 4336 0 R 4353 0 R 4354 0 R 4355 0 R 4356 0 R 4357 0 R 4358 0 R 4359 0 R 4360 0 R 4361 0 R 4362 0 R 4363 0 R 4364 0 R 4365 0 R 4366 0 R 4367 0 R 4368 0 R 4369 0 R 4370 0 R 4371 0 R 4372 0 R 4373 0 R 4374 0 R 4375 0 R 4376 0 R 4379 0 R ] +>> endobj +4335 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 719.912 179.554 730.816] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +4336 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.052 719.912 250.666 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_fefca839fc7b4d2d166e7a1fe6196fd5) >> +>> endobj +4353 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 681.058 182.044 691.962] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_ddf5f330215fb1878018673eff609704) >> +>> endobj +4354 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [209.381 681.058 293.834 691.962] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +4355 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 642.204 220.22 653.108] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_e4a4890ceb257496b788e0d31dbf6d7f) >> +>> endobj +4356 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 603.723 155.265 614.253] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_3fe60e1a76b2a92143004e52ccfcb7c7) >> +>> endobj +4357 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 564.495 158.044 575.399] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_0a4f8e3f3469f021594ea9311c21aadd) >> +>> endobj +4358 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.382 564.495 235.513 575.399] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4359 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 526.014 158.044 536.545] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_067b4c27cf8643f8ded50ebda77da8aa) >> +>> endobj +4360 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.382 526.014 228.888 536.545] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4361 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 475.828 158.044 486.732] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_37857f2dfb7b17609b671f9070be15ca) >> +>> endobj +4362 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.382 475.828 269.834 486.732] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +4363 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 436.973 199.947 447.877] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_99161b46c175aa485608154dbcc866cb) >> +>> endobj +4364 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.763 436.973 288.215 447.877] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +4365 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 398.119 161.013 409.023] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_0bf701759fc56f8fb215c273e53b46ae) >> +>> endobj +4366 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.185 359.265 195.165 370.169] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1685b5eb65ba36a9e715a8e3344dbcd8) >> +>> endobj +4367 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [173.069 344.644 225.739 354.549] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator) >> +>> endobj +4368 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.148 333.685 227.817 343.59] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator) >> +>> endobj +4369 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.185 309.825 187.563 320.355] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_5c85932f5fb67a78d1faf8165783d5d3) >> +>> endobj +4370 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.482 294.831 271.151 304.736] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator) >> +>> endobj +4371 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 270.971 150.493 281.501] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_562fa08178e809398402920e5e674ff8) >> +>> endobj +4372 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 231.743 181.845 242.647] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_9e8a61b2b759dde8f65219688548ffaa) >> +>> endobj +4373 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 192.889 181.845 203.793] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_2e45b62cb223f5a21ced82480712e64f) >> +>> endobj +4374 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 154.034 154.727 164.938] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_d05bc9046303661aa532423ac5a5c16d) >> +>> endobj +4375 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 115.554 176.505 126.084] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_ea6d543c90be52299d6ffc57fc9ba5d1) >> +>> endobj +4376 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.408 100.559 450.955 110.465] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_2e45b62cb223f5a21ced82480712e64f) >> +>> endobj +4379 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4383 0 obj << +/D [4381 0 R /XYZ 90 757.935 null] +>> endobj +4384 0 obj << +/D [4381 0 R /XYZ 90 733.028 null] +>> endobj +4385 0 obj << +/D [4381 0 R /XYZ 90 700.151 null] +>> endobj +4386 0 obj << +/D [4381 0 R /XYZ 90 661.297 null] +>> endobj +4387 0 obj << +/D [4381 0 R /XYZ 90 622.443 null] +>> endobj +4388 0 obj << +/D [4381 0 R /XYZ 90 456.067 null] +>> endobj +4389 0 obj << +/D [4381 0 R /XYZ 90 417.212 null] +>> endobj +4390 0 obj << +/D [4381 0 R /XYZ 90 378.358 null] +>> endobj +4391 0 obj << +/D [4381 0 R /XYZ 90 328.545 null] +>> endobj +4392 0 obj << +/D [4381 0 R /XYZ 90 289.691 null] +>> endobj +4393 0 obj << +/D [4381 0 R /XYZ 90 250.836 null] +>> endobj +4394 0 obj << +/D [4381 0 R /XYZ 90 211.982 null] +>> endobj +4395 0 obj << +/D [4381 0 R /XYZ 90 173.128 null] +>> endobj +4396 0 obj << +/D [4381 0 R /XYZ 90 134.273 null] +>> endobj +4380 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R /F98 2120 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4428 0 obj << +/Length 1367 +/Filter /FlateDecode +>> +stream +xÚÍX[sœ6~ß_ÁS +3Y­ˆËN^ÚLíiÚ´®í>9Fíš)·€Èzýë{‚½ï-ë46‚•ŽÎù¾s“°6×°v9úåv4¹p,ÍG¾c:ÚíLó±æ:Q“h·‘v§‚ð¨dÁñ}ÉÊåtú>Ïæeͳ7ËJðÔ›ëïVUíðšÏxiO—“¤XB‰N\l|¾ý0úõvôeD@/¬‘Fê"×¢Z˜Žî>c-‚ï4Œ,ßÓͬT³M ž‰v3ú{„•M/=[)^³•`ٖ§¹#BìÖàO¦IuVë¥>å\)v}9ÒîÆðHyš—Ë ŠŸx –ß¿JB rÁ’@­³à~)xµ±TMü„)†?Ò"æY%¶vhŸ“ ×Ô<0ʱ¥Q¦‰ÛÔÆÄF¾­lºæ¢.3ŁxàÆJ“v(mhGqÖ>[µša>ÛZØ*¯~ úˆyÔ­’*N.|]# ³í²-À[í,‡®Í²‘ƒû9â!®Ú9›¶c¿›„áXÁ²Á5¨G‘I\XÈ'߇knª? +^f?å§óœ²ŒÉøŸË;é&ž‡°ç@·{Ýæ‰l[ò(UlMw§<«â<;‚ì¬Nþ¥fI,âÿ‰^Páòë›+•ŽDPízR¸œŠ_Qæ/ƒ°/$?ŽEiØT—êõÛv:žXãצÎƑúíàªES˜‹— zqµþ¼`ˆxΫí!¾Y°¢* ꟣*XZ–nÒ"‚ˆ‹œ~³å€Š,ï´\ãûÈ´÷dš£eQÔY,‚27Lª/ª€eER§Yu<Ë;‚Q­‡ßDñÏQT `ùÛô{Ðå&CìÙÈ[U‹6Ȑ–Ku0{@¬åB!?Nl‡]#UF´å:úowãê»ÈÛïMR&Êøñ­1¶± ’(dÒ§8›o;dE”߶ôWOYl7VHv¥Ò#ö$ùD>õ:m»°TU»‰Mô;íûØò¡øjcۂàêP0‡­¨«ú>éÆù*Ë]ÔY(ÀE6Ýk»_nÛå&ƒ#;=½j7Ýéç§T‰”=UÁ cõ«w–ˆ³ÖØÁQ*ڔ$9¤w?À¡.Ë8 +.yÆK&òrЛæg> 4‹öÝ'Xµ·ûŒgr _1û³î|@ô¦f/b PUN’d;ö÷=¶=‰`y²I]ï ®yÂz/Úðœ-‡Áà+6²l¿kÕ)þ\°SŠ‰^½J}dew’ÊE—Ð{é¬Û =Þ9)¢þÞ#šNóJ”œ©øݓbäé­ó§ÉTƒõ»@@÷· ïÞíŒ ùÞÚхâUª·gNŸGœÃƾ‡lÛWŽ®rÇ_µ(jEGsŽ…ž¢Aƒ²§¹Ø¾šu`+âz3Ûݼ:ÈwÛö–™úˆvžxÛ9öU£S™2õÚÝ1·¯ê¢¹}ù§âåO¥ºŠ’,«»ëLÉÈW)Š—«® ‚#S"ˆ  ‡ó ïŠvkÙ¿Z7ú}ÔDðJ_â¹ÈZyǃÅt2Y,(¬4óE‰b1)ŠdòÜmÖ¤n/d–«pH󲿔ƒpê7ùüÿëk΋ +endstream +endobj +4427 0 obj << +/Type /Page +/Contents 4428 0 R +/Resources 4426 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4305 0 R +/Annots [ 4377 0 R 4378 0 R 4400 0 R 4401 0 R 4402 0 R 4403 0 R 4404 0 R 4405 0 R 4406 0 R 4407 0 R 4408 0 R 4409 0 R 4410 0 R 4411 0 R 4412 0 R 4413 0 R 4414 0 R 4415 0 R 4416 0 R 4417 0 R 4418 0 R 4419 0 R 4420 0 R 4421 0 R 4425 0 R ] +>> endobj +4377 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 706.961 191.718 717.865] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +4378 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 706.961 288.852 717.865] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_77c72d8473dc3e9856d7ff6c05ce7b07) >> +>> endobj +4400 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 668.107 191.718 679.01] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +4401 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 668.107 303.079 679.01] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_a341843d5eadfc196441cad0af63ac9d) >> +>> endobj +4402 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 629.252 179.554 640.156] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +4403 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.052 629.252 242.925 640.156] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_548ae200545f7d25b875f190b5611368) >> +>> endobj +4404 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 590.398 179.554 601.302] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +4405 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.052 590.398 285.516 601.302] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_ec5860620ae92988c1740dc393064fe7) >> +>> endobj +4406 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 551.544 156.281 562.448] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_dd39af06cea8afa45c772e94db8a1309) >> +>> endobj +4407 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.097 551.544 244.549 562.448] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +4408 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 512.689 252.988 523.593] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_7f5a110ccdfd8efa5e0eac984f90d753) >> +>> endobj +4409 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.803 512.689 322.447 523.593] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +4410 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 420.968 203.075 431.872] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +4411 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.573 420.968 296.324 431.872] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_21f1586e66349acf7aa0d70c77f92b60) >> +>> endobj +4412 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.005 406.347 352.207 416.252] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +4413 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.437 382.487 194.297 393.018] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_6e742d7ffa4f4b7037760cf3ebf62348) >> +>> endobj +4414 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.437 343.633 188.759 354.163] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_f97f2d43a487ec81e040aec36bbc6ebe) >> +>> endobj +4415 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.953 304.405 245.406 315.309] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +4416 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.145 304.405 325.654 315.309] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_11de7a0cc309058d6aee273d613c9432) >> +>> endobj +4417 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.844 289.784 367.996 299.69] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence_8aab82f7118966662582f88725ce4735) >> +>> endobj +4418 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 223.643 237.376 234.546] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_a83361b2264ca8ed30599dca32447874) >> +>> endobj +4419 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [264.713 223.643 329.778 234.546] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +4420 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.349 115.601 226.034 126.505] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_339fab488002bb5b341e1bb82edee103) >> +>> endobj +4421 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.176 115.601 405.628 126.505] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +4425 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4429 0 obj << +/D [4427 0 R /XYZ 90 757.935 null] +>> endobj +4430 0 obj << +/D [4427 0 R /XYZ 90 726.054 null] +>> endobj +4431 0 obj << +/D [4427 0 R /XYZ 90 687.2 null] +>> endobj +4432 0 obj << +/D [4427 0 R /XYZ 90 648.346 null] +>> endobj +4433 0 obj << +/D [4427 0 R /XYZ 90 609.491 null] +>> endobj +4434 0 obj << +/D [4427 0 R /XYZ 90 570.637 null] +>> endobj +4435 0 obj << +/D [4427 0 R /XYZ 90 439.942 null] +>> endobj +4436 0 obj << +/D [4427 0 R /XYZ 90 439.942 null] +>> endobj +4437 0 obj << +/D [4427 0 R /XYZ 90 401.207 null] +>> endobj +4438 0 obj << +/D [4427 0 R /XYZ 90 362.353 null] +>> endobj +4439 0 obj << +/D [4427 0 R /XYZ 90 323.498 null] +>> endobj +4440 0 obj << +/D [4427 0 R /XYZ 90 242.616 null] +>> endobj +4441 0 obj << +/D [4427 0 R /XYZ 90 242.616 null] +>> endobj +4442 0 obj << +/D [4427 0 R /XYZ 90 161.854 null] +>> endobj +4426 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R /F11 418 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4450 0 obj << +/Length 1936 +/Filter /FlateDecode +>> +stream +xÚÅXK“㶾ϯà%Uað" Ž+‡õ+'vÙ»“¸Ê»®-HÄhàP¤LR«‘½/Š¤¨m.9~~ݎ6Žþ~óåÃÍÝ·)‹r”§4£GYJPBIôPDocBX, Æ8þqAp,›­|ÿã‚â¸.OªhäûéU#›ãýýWuµiöªZ«÷oŽm§¶‹%MpüU)ÛÖM_«GÕ,ˆˆ ‘aK“Œ,~}øî曇›ßoȅ#båH2”±$ZooÞþŠ£Ö¿‹0b¹ˆ–jqÊ`,£77?Ý`¯ê–àn§ˆ3e”!œ&NÁw”&öø°/z»L@ÛVG]øF¦fã…{m©HÊEܬUvSð3‹ßá_Üoì™x{^cËóDüÙóíGäËólö¥Ù ÄÓÃG·ŽŸtCwxæ@Þ[XIX¬‘BvÚïÛîËN·j$-ó´ç*­Q÷‚BTЁBMÀáKŽEüó“ÛR]µªétµqŸÌhàé¤ûtjƒJ4Ÿí¤%³^è­ªZpxëÉå'û®ÞÊN¯eY­,~Û—bN¹¶v®ïždçf°/,©³°p VÆ!Å0˜œ$0)Ô;Œi‚´>Û$·~öÁ€ø£nü£ç|ªD\e)ŒÂ)ñê’èÊp~–Û]ÙËîÕÔþ|»ßOVx5¸¤åªÀ«E†¸HB^?Ïä0dUÌqI‘Èz9¾Èä‚i¥×å±.ËÚ~hï/Me(Ï0±@C!2f/Gœfî”ÿxµËæÙ lô‹?@ªÓ˜Ö.&=íE|£ь[Xʈ‡¥oœ—œ"d²}\&ì²"÷Qüü}²€Ë0½…ÿ¹2%s¯Ë"¸þ*$ M£Ú]]=ã׎¬BVt6Ü6ʇñ¦ÑEŸ0ÖµŒ ô`܄ Î}í‹G”‚  Š ‘<J‰×“ÎDwur@uï¡ @‘ácßÏ´HƱëM;ç}XFόãŸí_þæÆó˜ás»Ž—vMÔIjbÀ+äýugº´œÛĽwhgs߬|较ŸIžØì·4’íâAwOžÔ­YìÖýùC5õpdr±i;GoÝñP €ç¼Շ)û’à°ÜF‹«US¼ôèoòÿ$”Dk01‚–‰¾ï 3…èƒNeŠOâ"<Í_.H ¸uҘ<0×& ²C!J“Iïs† ì9 MP¯$ÐO„„/>;‹óŒ©l—¡ 'Þú•t½oϪËíeÎÖjd”ùƒaɤxˆ‘orÜÃþç3,̌M +‡Õ Œ{ïCnÑL@,9ç¶ëßKˆ¸pÝ òĬI‚ðIÌ+aEPD1†•qÊÀâs_8Æ `Kˆ›Þ¹~ +,¼ê4ÉÓ®ãÊà"ó¿Ó$â:d_êô½Å®†5‡'՜¥é~&€ÎK?à ôää¥"¿¢H¯n \WSîûfȏuQ|<;Üu…µ3¤'Ÿ+Ùì*Ù,=+Ù, %~ŽJ6|KGÐç),Y3Ã8.ٖ˸d3ºÃ³ °4_¢Apžõ>øå¼D§`úR‰'Q>*ѣ؃Ó}ìDበ!͓i©øX8[ìóXÐ1sv}À=ë+»HabBü¿‰KÍÄGð§5§ôÔgÜ_߀º‰ßóê±³} ã+sm' §‹©ùrQGn²B?º¹øåY»>`v××XãNÅ~Wêµìzaݨíõü3ÂÊw[µ Á³+”I:ß •ºR²)f»‚…ÂÿTÝz\†¦O®©°UþÊ×ðÂzBk`‘@Ððɵ±…ôŸá)Ò}úgG÷ñoÈå¿.’$ö˜û½¬ö‹±õ›SsŽÄ¢í_Ä ¤Ä^‰œfÿÂìŸZOòšW†ûØ|êºÝýÝÝáp@ëí+½kîîv»òî\ˆ…2Ïä1¼²lë¦or`Ñ<Õՙýÿ1š¬ +endstream +endobj +4449 0 obj << +/Type /Page +/Contents 4450 0 R +/Resources 4448 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4305 0 R +/Annots [ 4422 0 R 4423 0 R 4424 0 R 4452 0 R 4445 0 R 4446 0 R 4447 0 R ] +>> endobj +4422 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.839 719.912 170.205 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_5cd2538767045bd89360588c37d2aedb) >> +>> endobj +4423 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [187.945 719.912 383.48 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +4424 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.021 719.912 513.996 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +4452 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 707.957 233.78 718.861] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +4445 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.91 607.886 266.363 618.79] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +4446 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [111.184 595.931 161.316 606.835] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4447 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4451 0 obj << +/D [4449 0 R /XYZ 90 757.935 null] +>> endobj +4453 0 obj << +/D [4449 0 R /XYZ 90 670.637 null] +>> endobj +4448 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F31 472 0 R /F7 505 0 R /F8 504 0 R /F11 418 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4458 0 obj << +/Length 2030 +/Filter /FlateDecode +>> +stream +xÚÕYYsÛF~ç¯ÀS¬]ŽæÀPUâ$ÞÚì¦Ê‰µOŽ‹# µ À eå×oρc²ì¤*y0jLóõ×ÝCÝG8úçêÕÍêêµ`QŠRAEts¥8’‚ NIt“GïbBZoÆ8~³&8Κ}¶}³¦8®Ë§7Ùö?Åm“5O××ßÖÕ}sÔÕNoß>µÞ¯7”ãøÛ2k[÷ø³¾Ó͚¨Ø™m '1‘týþæ‡Õ÷7«_Wì±vp‰$ãÑn¿z÷G9¬ÿaÄR=Z©}”PËèíꧾèe >ú„¨÷ +Œn»æ¸ëêÆÙø•û󝗿«wǽ®º¬+êÊØ Ê64A,I§»"òÙÑZ #"þs¼3fšWé-ΊªëÍÕ)÷Î}e¯^§|‚‘T)HZ‰“B” „&½è#^&ؤ¤zWTeQé¬7¼Õe±+º÷î;Ž'ßm¨D˜%`¦D´ØÏÿu·¤#’ð;ƒ½R”(Ù 4úÐèÎÐÅ8»mX¼ "tõš@ EL Îj'"#Rɔ †`)˜‹’´GŒR%|™È|½¤‹¢¿L]ðNG¤S]u&U|ku,Êü4íšÄEu_ê°êVz<„§ƒà€€{¯«òéGF û³nªj“…8# ¦‹Ýx_CR«8¯‹ñø ìŒEo²$Õ³ÌIþl˜Y +Xç(UÌ}ñýǝ>ºh¯ƒoÇ=Â,UHbã,qolÛå××EµNpü!+‹|›5÷–†NŒ “l ½Ù7M½¦<~¬K‰—@Jr)ñÄOõ…§óªîÜCæ7׿ÁÊîɽhB ”³!Âàbƀ5Ód¢Ìsèz«=ÿ¾>V;K½/`c6°ñÃÆuž¨ä³¸¹¨ZÝtîû !›×QÚ¼óE +NTÜÝ/DÈ ógH "s¤/2^b_|Â»Ö ~Eå> S+XŠèŸ_0fK€”xésÍT€?ƒPÖcâ`‚ïRß¹¿–¸Þê!ÏދÓԄÌL¥ð™ÉƒŒ¢³Œ2»}IF™ï'e[ƱùžlžQ,…–N±çº6O¨°;a©D‹siBș4ÊBÈï“&˜i*'°7 MÒã&OJŒ¤*'¤o6Uá¯Knûï>d'&žL‘fk6‹PXð$JRR"BV™*ªøĪž@à1 c– ª8Å Rä ôÙ=”ôB·/e%˜ãÅ +›Ì+,ⳞåùöXÝÖ^ºÔf‡Çv›UùvW—Ç}Õ.Ý ˜Lb¶ížzæ’"©†–āž"&åsHO!‚ùÐ{¾Éóv<Ó¹Ö»æûAÈ3›™ƒJ¾”xÚ_]Úvä??»«Lñoº©µ_ëj·æfrXØg]S|´“;D]a€á†p#ïäÒÎÌ Í¬MmOm!6«Euò…9aߋBÄ%!áyžVèf)é KɈËWË0ËEq1ƒí ÓÂiС„“eñ™’³I01”ª ´Œæw+léލ7¯Rî õ˜†f!ƒ¸‰ô8’b¦W0'(&×»ðîÀƒåPÏm1÷&Ò6¿xØPõ…°‡ÝƒƒÞ$ýä¡ i<@]f7Ó8}°ÝS‘³4•eYï²ñv°Té‘÷›¡´Åm©ÃÊyú«•P(%êS´²?VñiVÁ> endobj +4455 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4459 0 obj << +/D [4457 0 R /XYZ 90 757.935 null] +>> endobj +4460 0 obj << +/D [4457 0 R /XYZ 90 733.028 null] +>> endobj +4352 0 obj << +/D [4457 0 R /XYZ 90 716.221 null] +>> endobj +4461 0 obj << +/D [4457 0 R /XYZ 90 716.221 null] +>> endobj +4462 0 obj << +/D [4457 0 R /XYZ 90 594.516 null] +>> endobj +4397 0 obj << +/D [4457 0 R /XYZ 90 572.205 null] +>> endobj +4463 0 obj << +/D [4457 0 R /XYZ 90 572.205 null] +>> endobj +4398 0 obj << +/D [4457 0 R /XYZ 349.813 507.496 null] +>> endobj +4464 0 obj << +/D [4457 0 R /XYZ 90 490.769 null] +>> endobj +4399 0 obj << +/D [4457 0 R /XYZ 90 370.498 null] +>> endobj +4465 0 obj << +/D [4457 0 R /XYZ 90 355.928 null] +>> endobj +4443 0 obj << +/D [4457 0 R /XYZ 285.395 293.132 null] +>> endobj +4466 0 obj << +/D [4457 0 R /XYZ 90 276.405 null] +>> endobj +4456 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F11 418 0 R /F7 505 0 R /F8 504 0 R /F23 340 0 R /F1 542 0 R /F10 473 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4482 0 obj << +/Length 1441 +/Filter /FlateDecode +>> +stream +xÚÅX[oœF~ß_A[)%Ì΅a•VJ›ºjÚ(nìªNdav¼Fea l7Û_ßÃ\XÀxå&vòÄEÃ9g¾ï;—;+;?Ï~8ŸÍOBæÄ(ièœ_;1v¢ N‰s¾t.\BPìùcìžz»IµN.O=ŠÝ2ßßÈe•\þ–]UIµ_,~,‹Uµ•E*/Ïöu#׋EZus™5²Jš²ò|ʱûcžÔµ¾}+¯eåá¶y> D䒈yïÏ_Í~:Ÿý=#&vˆ +‹G(bÜI׳‹÷ØYÂûWF,ÎN­Z;ep͝³Ùï3|t‹”!òn‹f“'U&‹¥ ïE±´qæI#ÍÃɶH›¬,ôÓË2Ý®eÑ$ê^} Ä}óˆu³\,ʺÑÛN֞ÏãÀ}¢/åÆvæ'„ô¢&BÀ¸2úü¹^2Ø%( ‘]òs|—3õmÌ{ßF!ŠƒÐ~[OXgHDÜ.x»a!q¿Úê-öïvF8A„v›IWSþCTô6C̚¾!? 1 +uüV§ÜzQiºÞë/8î}䐅à\-}³m6ÛF3فϹ‹,“j±±ûgB®' ‚è¶Ó +žiˆ0ëÌ®'ìD ½…ÊÐ +F˜wg­P såzÓì½°Û§±pß47²Úeµž(%îNG®Öj•Ž<Ja #úŽ"¸‹ ÌkciGºµ>µ/Wßà3ړWv’çÚjVØ؍ߪô(wwíCà&*Mám-7I¥µeÏgX@ŽÄqµ×lýÌ\фö€xF‰Q“Âÿ´…°ÌÀiÀ·Þ%›öŽ«ŒûÿER[™JdQ܇‰@ ÒC-†œ¼+ß B9 +*ÇÂkQšÌâ#vœí'ÃÓ%ùX·àÒÎʱÜõ ‘ÀÑ0…Ï62͒<ûw25ƒ±CN©z¨»mêkw)  𠕊 ž+ñ(ËAéW¯®m“kn2ÓDÒC»Û)fÌÃJ²:t•ëª\ÛO¥5–çZçY±Ò¯ÞaLs¹P Òv8‡„(`ºGÜJö¥|¸êÂç ÝÍ&G77UZT£kÌ0hV"z”öíɶÿ:´-JH6µ¼2èBB»î R°_ô;í CÂpÜ(=Â۔å­Eõ&їº§o([š¬C=Cjuo²"Í·K9Ñ®‡jz>UQ›}ZvG"ìúò÷9æÇ´}6¬X§Û«ÖÍ#+eZ‡:-¥þìùÝQыºÎVEÛÊ“p[0“ÏÕqhme +›{⪵7Ð'irÞ;.av¬(B‘hÿl¥?rìaäÂHˆh,K•Äê(Ü^ÕQø¡ix4ÆYN馷‹ÅÝè! Úa(ºvøÕÑ.¦!þdÆÂÂÆ´­_Še¦©JM¬{-¶–¹L?cWdž>}Œ®|ª!i'Ôf+Rýî‹U–q7ùh`²¢ù$l<^êæAÁÿ !"îûLýtCG0ìéÿbÄ ‡Äÿ$nšf³˜Ïw»Jk´-²M…²f“õüv™èYž¥§;¿­ËJZ¢àåZñ†|þÿš: +endstream +endobj +4481 0 obj << +/Type /Page +/Contents 4482 0 R +/Resources 4480 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4467 0 R +/Annots [ 4468 0 R 4469 0 R 4470 0 R 4471 0 R 4472 0 R 4473 0 R 4474 0 R 4475 0 R 4476 0 R 4477 0 R 4479 0 R ] +>> endobj +4468 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 386.817 170.687 397.347] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_e7c03963759dfdb937135a7f99165361) >> +>> endobj +4469 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 347.589 170.687 358.493] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_12f3d0ee3885355092a65262f24d46af) >> +>> endobj +4470 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 309.108 178.435 319.638] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_f0ea51d59b5026db43b2edd4cee928ba) >> +>> endobj +4471 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.426 269.88 222.233 280.784] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_dca809f9ebacacf70bc610d41bbaff47) >> +>> endobj +4472 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 231.026 187.564 241.93] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4473 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.303 231.026 238.472 241.93] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_e575efc6c01c4bf9968c7e27bb94951b) >> +>> endobj +4474 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 192.172 187.564 203.075] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4475 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.534 192.172 245.665 203.075] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_400c02f876d8f4e3f6aef2bfc5fb16cb) >> +>> endobj +4476 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.426 153.317 227.852 164.221] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_192ff11375b59075c9ea19a8c2b5511e) >> +>> endobj +4477 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.185 114.463 217.61 125.367] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_70e56452f6edfc1943b555156e6bf828) >> +>> endobj +4479 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4483 0 obj << +/D [4481 0 R /XYZ 90 757.935 null] +>> endobj +4484 0 obj << +/D [4481 0 R /XYZ 90 733.028 null] +>> endobj +4444 0 obj << +/D [4481 0 R /XYZ 90 716.221 null] +>> endobj +4485 0 obj << +/D [4481 0 R /XYZ 90 716.221 null] +>> endobj +4454 0 obj << +/D [4481 0 R /XYZ 118.055 639.557 null] +>> endobj +4486 0 obj << +/D [4481 0 R /XYZ 90 622.83 null] +>> endobj +1476 0 obj << +/D [4481 0 R /XYZ 90 524.437 null] +>> endobj +170 0 obj << +/D [4481 0 R /XYZ 90 517.837 null] +>> endobj +4487 0 obj << +/D [4481 0 R /XYZ 90 405.417 null] +>> endobj +4488 0 obj << +/D [4481 0 R /XYZ 90 405.417 null] +>> endobj +4489 0 obj << +/D [4481 0 R /XYZ 90 366.682 null] +>> endobj +4490 0 obj << +/D [4481 0 R /XYZ 90 327.828 null] +>> endobj +4491 0 obj << +/D [4481 0 R /XYZ 90 288.973 null] +>> endobj +4492 0 obj << +/D [4481 0 R /XYZ 90 250.119 null] +>> endobj +4493 0 obj << +/D [4481 0 R /XYZ 90 211.265 null] +>> endobj +4494 0 obj << +/D [4481 0 R /XYZ 90 172.411 null] +>> endobj +4495 0 obj << +/D [4481 0 R /XYZ 90 133.556 null] +>> endobj +4480 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F72 471 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4514 0 obj << +/Length 1520 +/Filter /FlateDecode +>> +stream +xÚíX[oÛ6~÷¯P1 “Öš&)R—´Х͐®—4q†¶0™¶µÉ’+Éˌaÿ}‡")KŠâ¤íú0`/ºPç~>žs(l--lý<úi:šœx®¢Ð£ž5]X!¶| N‰5[ïmBÁΘ`Œí3‡`;*ÖÑìÌ¡ØÎÓÝJ̋hö2¹,¢bwttœgeUDIV9cʱ}œFe©ÏÅB l‘Åä¹ Å&>s>N_ŒžOGŸF,©-à>ò]nÅëÑûØšÃú #7 ¬«šjm1êÂ=µ.FoGX{ƒÛ^qÜòŠ`17°|ê"ìqåÚJy­ÞðYïÇܼÌóT¯K{Š¥6켦ÎäQDU^½Å,ä}`ö,) Yõ}[JYèÙU®V6…²¶£Z(D4+¼È×(£4·âñlÅ+Çhֆ7ïÇL)µ™’)Æüò7Wj-_Üä”trÃuK8ntÌ.TìºÚ] ôsQÊr¨3{þg´Þ¤¢ÇÖmNòq(‘³7dºÒ(\äiš;”ÛWI¶4œë›Z­n°•á¸%éÜvÍ™ ÷²Höio# òI³“–ÅVë@6;ûè¦ÝÂaυ>&uÄhÀ`¾ µóŒŠU×Aöʵ„ÜWëñ²TOÔmY –²˜ÊZùÈ„{ß ¹k$‹$º&þè¨_y%iÒѺѥX&™Qó°V㺈ùLéÒYʙu±Ç k{Ûîí‰$£þøàARW~©E÷¢¶Gq¾ÕÑzüXY +‰˜˜´%?Ôòjµ–“†¯¾ƒÊôÑ@fÇ~ˆ‚tûˆ~¡ó<Þ®¡³9X¨ ڑìÈq9 +¼f”øqU¡¡Ú2±Ól%ŠÄµ3Ù/T°¯úe—Ù¹GÛs·ë¹K µçgÛË4‰•ô©ã3{·åÁêl`ƒÔm'‘mׇ‡À©`©rhüë0ëó·yï†í§/O§¿ö[ÓÃÃì¯ß¼¾˜žŸOg§¯¿RÔ]åÔÄé”Ú˜º"5šMUÉnßm&sCãdg"kãà•X_šÉéd›Å²}=&ÃÇUO3âàAà` ¹›†ñ%‘SO¼ó$ƒmfR°ÙU¶±l‹„ûóSFÑ¡³Ô7™ C¶üš˜w"Tšnæ0˜>×Cµ;îXsíÜ¢÷—x9pr!Î?†â3¶A3€û¹É˜œÐö¶ +` ÷9ÔxÙ+šfr{ïšØÐ0: €sÔÝÁÙÿáähÜõ“ù¿äÁ e@ý5ã!â¼_ºšþ¥_MS¯º“©—w¥(¾w8·5v^EÀÅiB£Ïwe3dÁQ#*#†œ± uøB`+Ï~·ÌÓ/jîÞÛ “ rqsî]UÕæh2¹ººBq‰¶Y²)PRM ·O®—Á–ˆ¿ßi†¾u^˜ÿ.,®ëÁ°›ˆÿ?qI  +endstream +endobj +4513 0 obj << +/Type /Page +/Contents 4514 0 R +/Resources 4512 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4467 0 R +/Annots [ 4478 0 R 4496 0 R 4497 0 R 4498 0 R 4499 0 R 4500 0 R 4501 0 R 4502 0 R 4503 0 R 4504 0 R 4505 0 R 4506 0 R 4507 0 R 4511 0 R ] +>> endobj +4478 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 719.912 180.54 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_97586e332fd16ccf6e7d642bb4bbf83e) >> +>> endobj +4496 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 681.058 178.239 691.962] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_0ac88c873a13c4afa6f99d3d436e13a3) >> +>> endobj +4497 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [101.128 580.987 157.904 591.891] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator) >> +>> endobj +4498 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 569.032 173.456 579.936] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +4499 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 273.781 160.207 284.685] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_c9b8aa34a8ed8e2c3c38d0435adff6ab) >> +>> endobj +4500 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.977 273.781 219.823 284.685] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_c9b8aa34a8ed8e2c3c38d0435adff6abb5b32713c840499d9e29facf95a17f41) >> +>> endobj +4501 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [222.812 273.781 346.049 284.685] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_c9b8aa34a8ed8e2c3c38d0435adff6abc1539389d3643cf986ef5bb99697d1cc) >> +>> endobj +4502 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [349.038 273.781 450.696 284.685] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_c9b8aa34a8ed8e2c3c38d0435adff6ab7491a8ba26958c3e27bed23b7eef1a7e) >> +>> endobj +4503 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 193.392 157.417 203.922] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_36a0c8ccab7923610bd27f637af63e1d) >> +>> endobj +4504 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [184.754 193.392 228.26 203.922] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4505 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 154.164 157.417 165.068] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_8fb8b2fe343e5afa80edc06bfa31460b) >> +>> endobj +4506 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [184.754 154.164 234.885 165.068] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +4507 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 115.683 165.165 126.213] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_c7bf9d127644aa14a09eab633e87f544) >> +>> endobj +4511 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4515 0 obj << +/D [4513 0 R /XYZ 90 757.935 null] +>> endobj +4516 0 obj << +/D [4513 0 R /XYZ 90 733.028 null] +>> endobj +4517 0 obj << +/D [4513 0 R /XYZ 90 700.151 null] +>> endobj +4518 0 obj << +/D [4513 0 R /XYZ 90 643.738 null] +>> endobj +1477 0 obj << +/D [4513 0 R /XYZ 90 415.451 null] +>> endobj +174 0 obj << +/D [4513 0 R /XYZ 90 408.851 null] +>> endobj +4519 0 obj << +/D [4513 0 R /XYZ 90 290.852 null] +>> endobj +4520 0 obj << +/D [4513 0 R /XYZ 90 211.992 null] +>> endobj +4521 0 obj << +/D [4513 0 R /XYZ 90 211.992 null] +>> endobj +4522 0 obj << +/D [4513 0 R /XYZ 90 134.403 null] +>> endobj +4512 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R /F11 418 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4555 0 obj << +/Length 1392 +/Filter /FlateDecode +>> +stream +xÚíZ]sâ6}çWøikfŠ,Ë™íÃ6ÓÝÙm;“&´}Èî0ŠDSc³’Ò__ɲ0C !°3›0F÷žstu¯lèŒè|hýÜkuß؉AxÓ:1tÂâ!§7pn]„‚킺Wm]*Æ´Õö ›§‹{6´ÿ¿T,...óL‚ò¬hw<Ý˔Ji.¯Ù‰6Š\–%L‡Õ,. +IûKïSë—^ëk )‹ ƒJ HBLœdܺýºÿɁǑ3/[ßÃê;unZ´`å \õŠÀ¯ €#'ô0€1®}ö<3}Ý_Ï/F•!×ZÎm‡(ÇWüZm¯þÕ®½©n6tÖç&h‘‹Ÿšú~†&zôÝcŽW&GQ Tv !Ħ•’oÝÊŒl›âžKÓfÝ µœQlÈ&ÁÁéìµ#èîMäÊOÅ^9¤Ñü2t•ÆX2؁ð 93;ˆ ýÝìT\Üåyº;ÈpÙg_§4åÅâD4b˧²_01>KŠoÌÐç#ýaÌ©Úh›vdú^ ˆšõqâÂ=ˆóžÈ[ì£'–ac6ÎÅ¢/ù쀺ºÈ šö«¾<ëß- +&OI^4Ó|nó¦»|jãy‘o0\š[…Y娥½êXÚÞ\›«?“d:ál`{5èÁ b"ÿÌ £¨ŒH§ӛӿj¹d§Ó…¿kQ?ç1Íh vÑ­a`DÎ~ ”`/Á/è´ÈÓ|Äš¾&öÏMì*4KI-ꚏƒr̀×KFšÎéŠY;ݐ>³<Î16‰ËbGv÷šû?*‘5‘Ɛ¦ò[Նª]¸Îgúƒ¦ez˜¿ÜŽÅ«Î¶š¡§8" ˆ—mU,T´qè²åÑ%Ÿ•¤6©Ošºúd/éÍÊNJ|°[+T&œ÷Óñ䅣Ò߂/Ó £îMѨÆÁrK—Å@GLˆ° AP3fÆ|wsùñ£¹4ðO̗TÈÓbõiRC5©ò?Ÿ=-Qa…„'å¶D9Wzd´*ÛÞÈ3ñ½eQyGç9:÷±A¤kžèˆ{GˆiýPxm4EbPŸEØ7 *£Uë1€xÉöÛ· *¨p½ã­ bó…Œ@uSüïù>†}ÿB?œÄQõV ‰±ÌôlMvUn*b\¥ÑWö•ó³z¯ÄüøS2ñC›·Z ¿Ólj ~-š™Š‰ú!¼ÚÐ!ðL®¤êeèÞ0[èÏþqìÕ¯­çÚ^…Ã%Ð÷E1¹èvçó9H$˜f|"/º“IÚ]ƒmÃk¤ ®ÙÚ'=ª ]–­êæ¸ ðÿú€œ^ +endstream +endobj +4554 0 obj << +/Type /Page +/Contents 4555 0 R +/Resources 4553 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4467 0 R +/Annots [ 4508 0 R 4509 0 R 4510 0 R 4528 0 R 4529 0 R 4530 0 R 4531 0 R 4532 0 R 4533 0 R 4534 0 R 4535 0 R 4536 0 R 4537 0 R 4538 0 R 4539 0 R 4540 0 R 4541 0 R 4542 0 R 4543 0 R 4544 0 R 4545 0 R 4546 0 R 4547 0 R 4548 0 R 4549 0 R 4552 0 R ] +>> endobj +4508 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 719.912 157.417 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4509 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [168.156 719.912 208.963 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_9dc926136daee1f47975434ee45298ec) >> +>> endobj +4510 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.3 719.912 279.806 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4528 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 681.239 179.554 692.143] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +4529 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.052 681.239 250.666 692.143] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_3c1dcd74ba0b2509f45aad45a5d922ce) >> +>> endobj +4530 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 642.566 135.579 653.47] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_c9b8aa34a8ed8e2c3c38d0435adff6ab) >> +>> endobj +4531 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [136.077 642.566 155.225 653.47] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_239b0622fbcfe1638b4246deab2caa29) >> +>> endobj +4532 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 603.893 179.832 614.797] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_745ac1cdddf74c6f387cfbbbc566dc78) >> +>> endobj +4533 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 565.22 187.583 576.124] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_b6976f576e6e50941ee7a7b1a737c0eb) >> +>> endobj +4534 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 526.546 227.433 537.45] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_b3186208850238a080373f035cd532cc) >> +>> endobj +4535 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 487.873 212.489 498.777] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_442aecbe0ce384a7c1add146fb125ed6) >> +>> endobj +4536 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.933 449.574 297.728 460.104] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_2679da4dbd5b8c33ef607aee49690c2a) >> +>> endobj +4537 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [301.544 449.574 336.732 460.104] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +4538 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.933 410.527 342.261 421.431] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_9960963fb1f8fb56631e0402557065ae) >> +>> endobj +4539 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 371.854 191.718 382.758] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +4540 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 371.854 288.852 382.758] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_78c24741e21a4406ea8ad1588c768147) >> +>> endobj +4541 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 333.181 191.718 344.085] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +4542 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 333.181 303.079 344.085] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_0ab383f3930179982937f7733a283a03) >> +>> endobj +4543 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 294.508 194.776 305.411] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_29202eb817eb5c9d59433abeeb4f2eea) >> +>> endobj +4544 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 256.208 195.334 266.738] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_ea0fedb82a525e6ada13cd7fd2d03225) >> +>> endobj +4545 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 217.161 201.471 228.065] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_f8fcee7f8582b0afc9115eb1304c24f9) >> +>> endobj +4546 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [228.808 217.161 272.314 228.065] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4547 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 178.488 181.845 189.392] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_b0f18894c8f97fa0cd38736462f36132) >> +>> endobj +4548 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 139.815 181.845 150.719] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_7bdaff085ea6859cdec9b27bffb6de4b) >> +>> endobj +4549 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 101.142 154.727 112.046] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_93d5d6abf06ec551294c4c18abb4349d) >> +>> endobj +4552 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4556 0 obj << +/D [4554 0 R /XYZ 90 757.935 null] +>> endobj +4557 0 obj << +/D [4554 0 R /XYZ 90 733.028 null] +>> endobj +4558 0 obj << +/D [4554 0 R /XYZ 90 700.242 null] +>> endobj +4559 0 obj << +/D [4554 0 R /XYZ 90 661.569 null] +>> endobj +4560 0 obj << +/D [4554 0 R /XYZ 90 622.896 null] +>> endobj +4561 0 obj << +/D [4554 0 R /XYZ 90 584.222 null] +>> endobj +4562 0 obj << +/D [4554 0 R /XYZ 90 545.549 null] +>> endobj +4563 0 obj << +/D [4554 0 R /XYZ 90 506.876 null] +>> endobj +4564 0 obj << +/D [4554 0 R /XYZ 90 429.53 null] +>> endobj +4565 0 obj << +/D [4554 0 R /XYZ 90 390.857 null] +>> endobj +4566 0 obj << +/D [4554 0 R /XYZ 90 352.183 null] +>> endobj +4567 0 obj << +/D [4554 0 R /XYZ 90 197.491 null] +>> endobj +4568 0 obj << +/D [4554 0 R /XYZ 90 158.818 null] +>> endobj +4569 0 obj << +/D [4554 0 R /XYZ 90 120.144 null] +>> endobj +4553 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R /F98 2120 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4614 0 obj << +/Length 1500 +/Filter /FlateDecode +>> +stream +xÚÝY[oÛ6~÷¯ÐS&1CR¢.R` š¡mŠeM¶—¶0‰n„ê6I¶ëþúJ”d;’ã\œn}%‘‡ç|ü΅$Ö¾hXû}ôÛõèäÜ65y6µµë™æaͱ b”hׁöQ'lŒ ÆX¿4Öyóé¥A±žF«[ä|zÞä<_M&giR”9“ÒS†õ³ˆEÝü f"7ˆ«‹Ä τYtâØÆçë·£××£F4©4`rL¦ùñèãg¬ðý­†‘é¹Ú²êk5áiW£?GXY3ô¬¬dxÍJ‚md™®æŒ±jS?QÊ*ušqÚÇ1³oÒ4Rߥ~ù¥è‡ª‡4Ž~N£”ÛãåßO˜á¢ &“À<®9*à;Ùèßåm؇ÕØ´)²0•ÀÈcžÍ÷ÓJë L¾D+ƒ1c“Hʗó<)zfsD ÕL—ÏEÏtÔDà#M§pVÓ¦˜û¾(ŠÙ<:î3ÃEØnmñ¨è•ì-ZÉiy+òe=‰T½17¼hL1FŽÃ a"<Ջþx7ä=jµáí.à4g·Â—ë«ŠI ¦<Šê ¡þ$†…õÏCž”ª7¯¹©–üS<2¥W…Ø=-ª(»a+–UXΆÀ­¯…ëž±G«§¨«%Ïúܑ2DÀužî›î± ËÛAÄAv;ÙªG +Cf;°u#?Ž aÈv\m,ƒ+3•µ2.ú55.ç7QÓ~/âH{Uû|žø2xÓl'¦:/U4KvÒ£¨'ÝIŽ ŒERÀ¬Ór•‰-ÆÄü۴ȸ/¦í蝎ùH†4áqÓó`ò0ž«Yial¢œq·Ù5³e@b·Ï•¤[H Ñcbߺ#ïµPÕtûùt˜„eÈ£ð»8òoZéÛèû²`;\@{82Ä&â\-ar(öGb=§íäó`¤Þ=ø»ÈSéÊÓY•(TMðÜX^7À͓69ò›H}”ÒAªHoùråå[)~Ãw!…8ëAÝuåµåìN¨ËôSù°uҗ*`?ƒéî0?¸¦&Av‘ÿ£‹š¥x³A™¾ËÕAW¶*TŸ9™ éžuËy·håòZO­1ìdÚTÞÇYT´BŽ›Ê¯HëÖ×$]6¹E•@„µBÁAÌl‡o¾fhgäæ>‹ ÚUüûU¦Åç6•F²òP$ÁÓkˆ^bI°rˆi&r^¦ùéé÷öp…‹0<Ÿ¾þ–å°¹(8Ž9ÞÛ¹ö”HŸ¿‚é#üFQêävå­èã*1Æmq{Ú'Ñ. +Ú'öföã‚1mˆ˜÷ìë^AÃ[˜¿ Bˆ.÷i2Õô _ãÝD¹_çÈâ8²øÉ9ò|1A™³TÌd„—…ŒA·œJ…Ëb2©¦šæòD³>͔ݓIzÏ÷lº?G’Gí{}Çb÷l ^"]ÑgÏ6?œ"ɓ)"H‘—bHm0²ÓÄeP+µF¼j À®‡Šz0ý´µÎØQǺ+v> endobj +4550 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 707.334 176.505 717.865] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_0d50a5df6b31c6de90fe366e18e750ff) >> +>> endobj +4551 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.408 692.34 450.955 702.245] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_7bdaff085ea6859cdec9b27bffb6de4b) >> +>> endobj +4574 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 657.521 150.493 668.052] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_6742bd7f3f2cb079b96900dda0147940) >> +>> endobj +4575 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 618.293 156.281 629.197] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_fa6ba487c08199e83a970fc49b53d3d0) >> +>> endobj +4576 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.097 618.293 203.603 629.197] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4577 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 537.531 203.075 548.435] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +4578 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.573 537.531 296.324 548.435] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_09c8fc0753a389cc42f84c12f7920832) >> +>> endobj +4579 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.005 522.91 317.229 532.815] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4580 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.437 499.05 194.297 509.58] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_0ab38d6ea061e7c2cb1595ba9cf2fd42) >> +>> endobj +4581 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.437 460.196 188.759 470.726] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_af207e746f4a3dc2722e254612dab3b3) >> +>> endobj +4582 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.953 421.342 204.459 431.872] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4583 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.199 421.342 278.511 431.872] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_2935fff040a5b31930fff594a0b2596d) >> +>> endobj +4584 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.953 382.114 204.459 393.018] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4585 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.199 382.114 297.2 393.018] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_bbde4b86cfca3e29a917650f4c9c62d5) >> +>> endobj +4586 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 301.351 157.417 312.255] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4587 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.915 301.351 204.34 312.255] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_dba3d929f4317a38ad387c5b45a91199) >> +>> endobj +4588 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [231.677 301.351 308.927 312.255] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +4589 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.083 301.351 432.333 312.255] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +4590 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 262.497 157.417 273.401] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4591 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.915 262.497 204.34 273.401] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_047a99eb91872d19730f4fd14a81f55c) >> +>> endobj +4592 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.156 262.497 243.343 273.401] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +4593 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [258.785 262.497 293.973 273.401] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +4594 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 223.643 157.417 234.546] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4595 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.915 223.643 204.34 234.546] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_f2eb5d22ef23937a261cfe3f6bc435e6) >> +>> endobj +4596 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [231.677 223.643 308.927 234.546] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +4597 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 184.788 157.417 195.692] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4598 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.915 184.788 204.34 195.692] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_448b4387171ec166085eb46aacedaad9) >> +>> endobj +4599 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [381.663 184.788 458.912 195.692] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +4600 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 145.934 157.417 156.838] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4601 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.915 145.934 206.47 156.838] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_61bc4f536e4c04b9594e1b6c7e13d76e) >> +>> endobj +4602 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.807 145.934 311.057 156.838] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +4603 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.213 145.934 434.463 156.838] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +4604 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 107.08 157.417 117.984] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4605 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.915 107.08 206.47 117.984] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_600a652347fb8718e0bc05f7230b8d8a) >> +>> endobj +4606 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.286 107.08 245.473 117.984] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +4607 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [260.915 107.08 296.103 117.984] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +4611 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4615 0 obj << +/D [4613 0 R /XYZ 90 757.935 null] +>> endobj +4616 0 obj << +/D [4613 0 R /XYZ 90 726.054 null] +>> endobj +4617 0 obj << +/D [4613 0 R /XYZ 90 676.241 null] +>> endobj +4618 0 obj << +/D [4613 0 R /XYZ 90 637.387 null] +>> endobj +4619 0 obj << +/D [4613 0 R /XYZ 90 556.505 null] +>> endobj +4620 0 obj << +/D [4613 0 R /XYZ 90 556.505 null] +>> endobj +4621 0 obj << +/D [4613 0 R /XYZ 90 517.77 null] +>> endobj +4622 0 obj << +/D [4613 0 R /XYZ 90 478.916 null] +>> endobj +4623 0 obj << +/D [4613 0 R /XYZ 90 440.061 null] +>> endobj +4624 0 obj << +/D [4613 0 R /XYZ 90 401.207 null] +>> endobj +4625 0 obj << +/D [4613 0 R /XYZ 90 320.325 null] +>> endobj +4612 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R /F97 2175 0 R /F11 418 0 R /F98 2120 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4686 0 obj << +/Length 1100 +/Filter /FlateDecode +>> +stream +xÚíš[sÚ8€ßý+´/»öL:’eÙ҇í4i»;ٔݗ´Ã8D4ž56• ÿ~å+—˜BXœ O6FË§s²úŠzgüÞ7ºCöê þy 0§€ú·èÚÀ@¬BÌK ˆé«±?¸´(1ãp~'o•?øÜ(_ÍÏÎÞÄQ’*?ˆR«C91߄~’·Wr$•®)£¡Ôò˜žÅ!¬/ý÷ÆÛ¾ñÍ­AkÀŒ£áظþBЭ~þÌ<Ýç£ÆȦL_CôÉøË ¥5›®¹•œ,Y ÄÁ6s‘‚ìÂÔϔò\Åï3}Ô×R±«wºîpíˆ%;·ŽÏŒ'Rùi¬²ÑÝ €%M\ŽÇÕãs^#VtÕ®°½jÀùʄ¥øτ“a¦Rùå->‘ôÕàíÃDÉ$ â¨IÖ¯òU»XŽ,ʵpB‡ŒÒAfqšœåS TÐ"˜ÙðH+kÞ(®Ý A‘«Íqì̜Ž XŽ:`cÏ.]%Ó©ŠJTÒ»Rf>‘††›•«5¬|I– Ø%µód1BC²!°CaÍ»+ê ÷Ÿ7́©gW¢ ³ZnôÀÂ+Õ‹€bêP¦¯/ÂeæÕRœ÷Âîñ!Œ6@H·A(v†PÂöPØkA*„½J[&¡Q`˜Xóý¥¤ "t±ÜûILm†-­e¹²w*Øû/Øt‡âT°÷á©`o/ؽVlږ‚-V›MZëÔOk¼ "Í0uœãé× BÌ,0}ø7¡lâb¦Aû.]Û%´¬ÙÓÁšÀ:d>;x;w°œµã_ßu°ˆw n:ØuàysõŒ:´Cq=™+y®Z×õNý×16Iþçþ ¼–ä³£s÷rëdïuòycu*“;odì»L®½@Îwj©§Ó”¾¯- ýTÞ†]L£aª=™4ì[Í¡™í-bûgœÊÊ5~Z;))úª +j\~9–ã©ŠûQ5~!ÙKà,Ÿr̽M/KÎoâ8ü>(ÙçOÙòÝ°œ*Ìvçv‹¤ù®ÀRŠ]Ôy}Ì#˜S“ªiS:ѧ®“Á¨ŒcTâGἸÓ_=žÂØ¥õ»sK/}ƒrYÉoÓ`懲:›Æ ²¹À„Õ‰e¾ß4ëi®=oKßøøýr­¸ÕÉh'î²ÝmÆÃ%.†VV÷ŸzeѶ¼õ³KŽŽ¸»]ªŽ&9Ø:ÀÅ,îa^Î~Õ \捀ûåÇêô•Uv)ù¬âÃ߉T¿Yœ›%‹øÑÔ­Ú…³L”Ty3“?Ô«H7T™iØê0 æ'Y™_Xö/ªî>9º }Á˜‘ºÉ¸KÓÉY·{‡ žFÁDá íN&a÷qC·$E¯wQ ÅeõÇUq"ýpìg¥¯ûÿ?ý Gï +endstream +endobj +4685 0 obj << +/Type /Page +/Contents 4686 0 R +/Resources 4684 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4467 0 R +/Annots [ 4608 0 R 4609 0 R 4610 0 R 4632 0 R 4633 0 R 4634 0 R 4635 0 R 4636 0 R 4637 0 R 4638 0 R 4639 0 R 4640 0 R 4641 0 R 4642 0 R 4643 0 R 4644 0 R 4645 0 R 4646 0 R 4647 0 R 4648 0 R 4649 0 R 4650 0 R 4651 0 R 4652 0 R 4653 0 R 4654 0 R 4655 0 R 4656 0 R 4657 0 R 4658 0 R 4659 0 R 4660 0 R 4661 0 R 4662 0 R 4663 0 R 4664 0 R 4665 0 R 4666 0 R 4667 0 R 4668 0 R 4669 0 R 4670 0 R 4671 0 R 4672 0 R 4673 0 R 4674 0 R 4675 0 R 4676 0 R 4677 0 R 4678 0 R 4683 0 R ] +>> endobj +4608 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 706.961 157.417 717.865] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4609 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.915 706.961 206.47 717.865] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_e3cacddb2450b8b685b8f39936a2b69d) >> +>> endobj +4610 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.807 706.961 311.057 717.865] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +4632 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 668.107 157.417 679.01] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4633 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.915 668.107 206.47 679.01] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_e615df068adfbb40a0b0b7a993579d22) >> +>> endobj +4634 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.793 668.107 461.042 679.01] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +4635 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 629.252 157.417 640.156] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4636 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.915 629.252 206.47 640.156] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_f06b2331eb3d080794682080b7f7eb1d) >> +>> endobj +4637 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.807 629.252 311.057 640.156] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +4638 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.213 629.252 434.463 640.156] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +4639 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 590.398 157.417 601.302] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4640 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.915 590.398 206.47 601.302] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_423e3bb0d9886c630c3c227def9f2073) >> +>> endobj +4641 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.807 590.398 311.057 601.302] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +4642 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 551.544 157.417 562.448] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4643 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.915 551.544 206.47 562.448] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_bdd61469bc5c6dfc6e97f306a751035c) >> +>> endobj +4644 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.793 551.544 461.042 562.448] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +4645 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 512.689 157.417 523.593] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4646 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.915 512.689 200.851 523.593] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_cc5c5125e7237c5913981b99a502f332) >> +>> endobj +4647 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [228.188 512.689 305.438 523.593] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +4648 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.594 512.689 428.844 523.593] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +4649 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 473.835 157.417 484.739] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4650 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.915 473.835 200.851 484.739] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_61208276a246a505bd753ffbb568bfe7) >> +>> endobj +4651 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.667 473.835 239.854 484.739] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +4652 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.297 473.835 290.484 484.739] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +4653 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 434.981 157.417 445.885] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4654 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.915 434.981 200.851 445.885] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_f245f065572b31c8ca97e196e45f9cf9) >> +>> endobj +4655 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [228.188 434.981 305.438 445.885] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +4656 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 396.126 157.417 407.03] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4657 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.915 396.126 200.851 407.03] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_89943bdfa5424bf7acecc51a7b6949c8) >> +>> endobj +4658 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.174 396.126 455.423 407.03] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +4659 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 357.272 157.417 368.176] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4660 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.915 357.272 200.851 368.176] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_852f422dfdf14a1e8a97b4dad77f7e36) >> +>> endobj +4661 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [228.188 357.272 305.438 368.176] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +4662 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.594 357.272 428.844 368.176] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +4663 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 318.418 157.417 329.322] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4664 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.915 318.418 200.851 329.322] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_3c920e734593812d8529bc12be6f503e) >> +>> endobj +4665 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [228.188 318.418 305.438 329.322] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +4666 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 279.564 157.417 290.468] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4667 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.915 279.564 200.851 290.468] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_54742578f3ff98e32e7e15d6b554f13f) >> +>> endobj +4668 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.174 279.564 455.423 290.468] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +4669 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 171.522 180.54 182.426] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_340e8b886fb185bed798dcbc1391c126) >> +>> endobj +4670 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.877 171.522 251.383 182.426] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4671 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [293.116 171.522 336.623 182.426] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4672 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 132.668 178.239 143.572] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_e86d21a6490f299af6229d70cf20c3ba) >> +>> endobj +4673 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [205.576 132.668 249.082 143.572] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4674 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [290.815 132.668 334.321 143.572] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4675 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 93.814 157.417 104.718] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4676 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.915 93.814 206.47 104.718] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_2fb9117b8937e3d9a9b4d3ae397bb79a) >> +>> endobj +4677 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.286 93.814 245.473 104.718] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +4678 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [260.915 93.814 296.103 104.718] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +4683 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4687 0 obj << +/D [4685 0 R /XYZ 90 757.935 null] +>> endobj +4688 0 obj << +/D [4685 0 R /XYZ 90 217.775 null] +>> endobj +4684 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F11 418 0 R /F72 471 0 R /F65 376 0 R /F98 2120 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4715 0 obj << +/Length 2358 +/Filter /FlateDecode +>> +stream +xÚíZKsÛȾëWà´!cs4OÌ@k»*ñ>’MRqle/ö– "! Ð(‰þõéy€Cr6•r"6º{º¿îùz@ÝE8úñâ÷×—?Ä,JPÓ8º¾ɘ AIt½ŠÞÏAÏc<{3'x–V›ôã›9ųr½ÿ”­ªôãŸó›*­öWW¯Ë¢nª4/šù‚ +<{½NëÚ^¾Ín³jNÔ,+–èc`eF¤šÿrýÓÅ÷ן/x„#b<I&¢åæâý/8ZÁýŸ"ŒX¢¢#µ‰8eð¹ŽÞ]üí»ÕŒ?Íê$¬.æzu„&«HR†p,ì +ßfÍ®*œ›Í§Ì^,ÍRæDÌÌrÀK”ðT)‚¨ÂVÉ=±"à¡g ¬`Ҋ¼°$"q§ãeÈ +¢ ïŒÐ€ +‚‘I+‚L<äò½\/g(m ˆ‡b±UñR1Ò¢ÓRݹü¼ýñ"z¿€/ÝgåuLËmV¥MYÙUâ¹¢ŠûH¼èy ¦]H>`ð¡ÑÙÏsB 6OoÖÙ@§óèžÓ·^ð%‘ègù øÒ;5À #¬ìfO¨®ÞѲ‹HT¯zGfŠÚ=ž)2[囬¨5ÿ0÷5ð~§³z›.³ç¡ìeÑåI]càžD„úµ~à!p‹L3±; dæ—e™ÝΩÐø¥Ë<ӇS¾ë÷ú7oÂû-ÂIWôOêQcÇàžPZ¬Bö AɨO ô(„¥:šõ,Š)”)ÃD´8.>•›ò.+²r×>dՍHú«b¨ßØ¢L:”ý¡Ô3ùƒÓPÚÏ=Îïòµã¬©¦qÀüÆ·B’hHD=eԞÆ:W™½höÛ|™®×šÎÆqg·±¿Þìøv»Þçŝûfe«lÂdnˆ´¹Qï77åÚé-=Y1Û¦ye… ã…;¥†kíÇm•Õº*ji1poɲòu‹,Cª½,h'œ’:jûÅ®.<ÆßÚs3çûµƒ¾ìúÂ˗!Jd ÷3ynûPGmt<ô-ð%ÐD/nöy§¯t´À<«Çž1õᬣ+¯ÎJ$y2:ó<î-Ž‰ôkòÅ×XP¾þÈI\à‹•KG»áÂu·áž[~f)ù5>½ä}‹¯¦B¨5‡•xÉQG‘|° >,f×f c±mÆöÒëÛú«A2|¦öcéÜ3a1ýT¦›faÆO-ín7­Mú˜ov› 5¡CƒÝ£©yp··šÚ¶*›³A‰´3fÞÔ~Ù-õ˜-đ)[㈶õÅhR½-×ëRWçƒm zT4uœn¶ë¬nmÎS) ·àíªU•ºŸýý£ ‘ÂàŠ{Zýx‹âŸtèm¿ƒÕ>X3¼?>ïP5l1ÎÎʗ³J*+& +ãÖWǎ:@4‘˜Ø“(À'p\ȯސ\~n7ÞE \÷Q—ÖHþ¶í— øÄC²úؓ٠Þ/Z–v²Gw8 (TrsX¦·:£é{‹ »h2eïJúª½>¸e¹ÊFæø=Àð¸f¸ƒŽ˜#t¯½³@WPÇÇÐlô¯žIJg"LÃÎG`MR\ćSÃqFü%äbj꤯úÚ1‘ú”êˆÞw¡n;“Fs×ÓƒB¥£ÐïN`ìYÌ5QÂÞQªš}þ¨Œ±±©ßîÐD +b-Wü­ù5×ä—õ³yü™ý0ي4xɔ‡÷ö©…«ûÜÁ|öUxpܯÏ3Ó«àÂ:à{ tÊ[ Ã½Ðá{Ó>¥×Þ±¸Ýî·¯¦&{{ëTèƒ{ó‰U0¯n‚ä)ÇôˆzªDb$BƒµTf‚“šWCúl}W }Èà èkÚ`šÿ`ó¥çÐIÀ‘Pgà¯Ól À¤,ú£Db1,ƒxåPKmƒLؔLJ%@ØqÐ3ÍJæÇÍ}YV@ÿ·e±ê;Nð¸fBW,Ï!˜ö>z– |RAϕÂú¸:Á H -ƒóû¡Læã?ˆÄ°8 Tÿbþ"ü‰Tˆ ÁG™ì^庯íû\ûÕ½Ôµ_þ^gÕo4u¾ÿ%- ÉöZ#ù^«Ê*ǀá&Ö¯uhKÓal~—µ/¥ìÊþµW²5ä×)‰Xÿ6íSÓl¯./вF»"ßV(o.aн<$(žغe§ä¶}ý³)[ª—pscfR4Žÿ¿OŒ­; +endstream +endobj +4714 0 obj << +/Type /Page +/Contents 4715 0 R +/Resources 4713 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4718 0 R +/Annots [ 4679 0 R 4680 0 R 4681 0 R 4682 0 R 4704 0 R 4705 0 R 4706 0 R 4707 0 R 4708 0 R 4709 0 R 4710 0 R 4711 0 R 4712 0 R ] +>> endobj +4679 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 696.076 157.417 706.98] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4680 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.915 696.076 200.851 706.98] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_4b4c0277d3b6c85ab6633ae9f5e235c6) >> +>> endobj +4681 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.667 696.076 239.854 706.98] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +4682 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.297 696.076 290.484 706.98] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +4704 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.689 657.371 156.055 668.275] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_66a2134e0f7fc74d62b14f46631dc2c7) >> +>> endobj +4705 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [159.644 657.371 314.233 668.275] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4706 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.037 657.371 486.625 668.275] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4707 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.349 618.666 226.034 629.57] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_182ea33f63c0eea708e02a32b0904f30) >> +>> endobj +4708 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.176 618.666 364.682 629.57] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4709 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.349 579.96 226.034 590.864] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_cedadd7f7742a18d941ded77da69ba9a) >> +>> endobj +4710 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.176 579.96 389.897 590.864] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_c9b8aa34a8ed8e2c3c38d0435adff6ab) >> +>> endobj +4711 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.82 480.031 221.326 490.935] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4712 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4716 0 obj << +/D [4714 0 R /XYZ 90 757.935 null] +>> endobj +4717 0 obj << +/D [4714 0 R /XYZ 90 542.782 null] +>> endobj +4713 0 obj << +/Font << /F63 374 0 R /F72 471 0 R /F65 376 0 R /F98 2120 0 R /F50 339 0 R /F11 418 0 R /F1 542 0 R /F10 473 0 R /F13 540 0 R /F7 505 0 R /F8 504 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4726 0 obj << +/Length 2116 +/Filter /FlateDecode +>> +stream +xÚ¥ے۶õ}¿‚“—RuˆÅ…àEqݱMâÔq[ÉL'Éh¸dq"‘2IywÝé¿÷¤HŠR¸ÉËrœû¢Î‡:ß^½X\]'&qÀg±vbê„#’3g±r~q#ŒÎYäU]&Y^Ï<.©ûr›T•ù÷Z«rÆ"Wå©|¨¸,Œg¿-¾¿ºY\}¼bÀu˜æ@†$ÒIwW¿üFìïP"âȹÓP;Çç¾[çýՏWÔJ3ü餒8¤ ¥c,$<Œœ BáD‹Øå:1a‘¥õ2ËÕÇeú+•ÔG&Æ}"„p<Œøæêßõ‰Oˆ;í{ƒè™ùp cƦÜ~0×<óaX`_!èõ7’vLå± $"Ž8LæöóÜ(üWIU¿Rʓۭ2›éÀ@…®7à³* o•íT^eÍaµOÀdš¾`úKT­ ¿3 ¡€ºE„!aqà0«j:"€Ž×JKøV5 ¨4CAÔÊl$Ö©ÖÅv[̸t調v¤¡ ÌïqéKP]L¨ŒÛl+µLÍâæs„™ÏQGKÐÑR¢ƒœµPŒ}BCíæã!C–?áŸd«òúK+-ÆÔÁfW”Vø,Ÿù¡1à>͘t-Üép|°ºHš ­-ÚÉò“ôcٝ †b¿†IÊåÍý¾Tú‹ÑM£«@«AÖ* (ƒbüÀ¿HO¦ðì,y‘‚˜NÁ|¦ÙÙ*îUކЮ+[§]ÙÕBwÏUcÛÇÄô&A_ùÔb5ákж­eˆ:"‘8nbYŒ ÁyÊL 7!}âÓp’G¡ÆuzpbIßfJ9ž)íöçs.ÖåHôR&HG»˜Œ šï +Œ¤;k ¢‰;L;V§É‰ªûDzŠb i¬…Ž¥ú½21á[&ۙ'BîîT½)V.˜‰_Üݗ‚}ÊVèx„,á‰Âýûd.k6sÞõ½Û‹æ¥ÍÉ֒Ön¨Arôº•ÙÍòuå½Æ0˜yR +7««&  ˆ¥U|ãSQǧÐÁ£PßÐõÃAÂØEÓª‡d›Õ³@º2/rÏÔZs î Ð8€ MÄ­eÕä6–!›X–x±¶—¾@MZ/ --Ô1`¥¤çŠ\ö(km¨ïœÙ¦éŒ´oâ“OöËÁBK"â“[6E@E¨6¶ò™»2‹¬¶_{¸/ µ™„+íáðMÒTéö °©$Ý˜Ý +h5'º0ÛZ¥ˆ j܏€ÑÐý6;:{nAó1]w,¦ýTùÚq²ÜœÕ- ì¦IeÛÖmG˜$ +Y“¡î ï+‚˜— EOó £„Ó6Ê:˜[*§ u¥¢9‚ê ›|ÚçWBwÔ"ú<Ê®ße—û#ìB{.Zjþ™´ÍŽH$ÃÀŠ¹{§º:?¤Vå‰ÙÍUãN¨ðžYðJ År_ä+ã—hBÛ×ã4 AÌ\WMþÄ°Ø©¦T¡}ëÍ¡ú²mulÌš hjÓì¨nÓÓ h’uq['Ù°—mS‡¤}O;ÉäËA åÑ%O‚"G£Ëž„ÿ‰¿æH>”Ž#q>îH€È÷Žä |6â+Gšä+dZ™ ¼Kv¹Ì›–ñ¾7ÛHSï)‰d<¥ÞÛÉè‰ùˆã\õˆfá©müc·èµ£]§iL‹ƒåüéSóýâT¤¹=馬¿Vùj;ÖùfksŽŠIɪe§¾éfS×9­#h0ýÇóg¾MøÍ {€ý¤>h£‚|qŽe¯CÚò­¶•öß3̝tÕ똠å8ª¡í&–¦}Ð\ö&1P”î>–-èq3àž×ïÚ¿jџӥ%ôäH+ß:Ó5Ñÿœ”vܺ õ ÃdH"H§s½!ÓÙ>AÒx_#0Œ =Ÿp”å›bW|P¹*Õ²Vå®7yþÁȓò¡ÁÛ:}·3@ÿ<šEõc§4?K{:î±.nÏŸâ¥Vÿ;7¨ùýAmÑÔ è’ؚë‚r¨÷Í,Þ£¿8Xû”­ÌÞó^–39’QJðÉkBž{ÑK±âäñéòí—ý™Úó­ +A¢8øØ«=Kò“‡ºç’ü£ø·I~ôÙLÀ õàMQ£qcèŽ7 Îê‚qӏÀ mv׸lÎÒÃ6)ͺõü_7$ú¥VúEKPû¢ÕC^ƒ»e) dfk•éV{­JÓÁÖº,væ^Kã¬R;h€2¯×QÍۙA^ªNšìÔ4òf€k˜7Kµ"FcƒzZþ+8a<è< nŸ†P»[Ud7ùaúªÛį‹ô€nb¶,×Xrý¸‡‹0‹MsõOÎóùbú.–S£S-DÀýÁUçò¼GIŒï•\NdÆ=+pQžKàwSF¸ž©äÁ(æO3_ºÏ_¿ZüçÒÄ(Š°iÒÎ +’ žŽº£õPÀwž%àÁ|FVÂ7ÿ~ó~ñîÕËÅò՛Ç0ËxL¸/§sk>½—9|¸Ì~C²ÇÿŸcž‚ÇÁc™ŸÊøðG ‚MýÍCÿ¶ìÛ…„:#‡.þçp !»lbÈ,m ™ÅO•*ÿ6“ÒµýämEÄÌc߯Ž? P·fR€äHÝ÷JY!d¿;Íÿ25ñÈ/‹B"hû¢¸©ëýüúúî9äÙ¾$Y}½ßo¯OÔÁÓOØ"ѽäðý¼}Ó:ÑÿÿÃH֜ +endstream +endobj +4725 0 obj << +/Type /Page +/Contents 4726 0 R +/Resources 4724 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4718 0 R +/Annots [ 4723 0 R ] +>> endobj +4723 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4727 0 obj << +/D [4725 0 R /XYZ 90 757.935 null] +>> endobj +4728 0 obj << +/D [4725 0 R /XYZ 90 223.935 null] +>> endobj +4523 0 obj << +/D [4725 0 R /XYZ 90 201.623 null] +>> endobj +4729 0 obj << +/D [4725 0 R /XYZ 90 201.623 null] +>> endobj +4524 0 obj << +/D [4725 0 R /XYZ 107.713 123.174 null] +>> endobj +4525 0 obj << +/D [4725 0 R /XYZ 107.713 107.386 null] +>> endobj +4526 0 obj << +/D [4725 0 R /XYZ 107.713 91.598 null] +>> endobj +4724 0 obj << +/Font << /F63 374 0 R /F65 376 0 R /F50 339 0 R /F31 472 0 R /F7 505 0 R /F8 504 0 R /F11 418 0 R /F23 340 0 R /F95 1788 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4733 0 obj << +/Length 1795 +/Filter /FlateDecode +>> +stream +xÚíZÛnÛF}×Wð)•h½W^Ô¦@ë4Ò¦H·/N`ÐÔÊ"*‘ +IÙÖßwöBŠKѶä äÅ©áÎíÌìY°wåaï÷Á¯gƒ“—>ó"ùÔ÷Îf^„½À'HPâM½ó!!ˆàј`Œ‡oFãb_¼Q<Ì›¹œñşée›Éä4ÏʪˆÓ¬©ÀÃÓE\–æã[9“ň„C™%Öc eHB<úpöjðÛÙà EØ#Ú € /YÎ?`o +Ï_y±(ôn´ÔÒã”Áuá½ü=À÷zC¾hyƒ˜õǘ»Nª¼0F>1—Ò}ü"OÖK™Uq•æ™2´)GŒGβˆ(7h„S:|NÔC{WÅÚÆM=x¢l8y‰–§  A–i‹’+#ãFqÌk ÐB¬L{1'òCêÁ©HظËÛÕ"MÒêƒyEàÖ+  Ÿr#{š¯”û›qR‡×B`VäKóI~\Nj´Ú˜»dëß®=$ HÒõË1ÀZjE†T‰NÆ$H`p +ä×ùûí6‘+•Ürâ¼¼]ĉ5 Q€#X  ß,QVÓÉ$ÍF¯Á·éE\\iÐt¬q Šhm÷Ù¼ÈGT o2–tÖNóˆGœ7ÑHmðcsYùJݸ£°@N1â Üd‘ˆ·‘Î-Î_Ëåe½ÚËu–èú8¤dxS2§¹œ½Ç˜&)¼u¡ê¡*' ¡ Ó7Üþ}zX™%mµE9~SøßQDaÅ4¾\ÈÞ"CQÐ$ìº'j{ê–Xê²êI'ó!WMў§Ù"Íd_CŠBÎÝJ{+«u‘ÙWsYë’3…£­³úqÞ'‚¢¬ë‘£9DÜo,L3#A™³¢œlÆ¬¸( +=Õ`¹« +:uDö,cAPHœðŽÏƒO/cq¬2®ZeÌD¤ÊX_u~ôƒl*GD oÍmo^"À¹7-tE§ÈÕZW…Œ+UFalMPûómÛµ_æ«ÊUœØÓ.u)· ¤îÀMänGÍ}7å~¬„ÁíHn¡¶‹\æùÂÀý Þ–U¼®òE~•&±]AõƒÞ +îÝü„[’=¥Î›Öû¢ì‹ô܄AAG÷îljk8[lÜÍÁIŠ€@0ÿ…èšán!u¤6Û0¥H¢gµ­öºP ¸ÑYØÔ-J9½¦¾Š°N7đ«­¹Óã~éUšÔjæ±Ê'»´LÓE/Ù4?·IÎòÅ”iš]ՏŠe§qxÁBMD½¾§T¸Rçc·ž×äfbKÚ +b »ˆ^썞[ ¨2ýT”BçeF̶]ÂZbH*ZÉÆF&h‰øˆÒ !=ªTõlŠȵI÷î:°÷¨^ç¹Uv8ØJ[v·B„t × ê¶Ç d‘Ê?â‘pŒië‚T0¯%ò¤)À‡ÏÍ÷ *âƍ-2 +7—p2Q + ÏPÐ!¢rnÉòl xN»×Â&~7&(ðƒ½Pì…~}P~^ð{Q@¼–ÌÓUúS­ê²§cs¶žIrÇ)“ì8äàÊqȶÁèA²Ç"´…Ã"ÿ!‹èC@Þ§÷­C€¾7ÈC­Ü?¤Óѯ¨ÓQñð~ŒÓ£`|ˆ³- tóû¹ÇìøbtT“£kí¥}”asŒˆïC›ÿä<ž÷¥™â"iY5¥ï¼¯ÃûúC´'ç›é»Ey8ñËîҞtþËøEÈ øÆÉ`ðͶȝ5œ-÷þHè Ù"Øéý]³ðÁ&ÝIiÑ ´;}øÒ~IJ+ö ´â3PÚý äa”Vcõ§Çr¯µ²¯ŽµFßYëÞµÃ[;Ÿ@i¹Ci‰¦´ðT½rm¨—ž§äf©ÖhQݶGê¾°(Ý&a³×ÐCÓ:3Idî”å!>Í¿]>­Ô÷Œ`|~'¼wO`âB6Ì2UœõZýÑYî²ã²¦×À‡Ý)m#63&jò¬0c|8Mõiµ¤–V"õŒ@kgömm–ú"Ë­ð®}@æóá_yee«yl…×Þ±Ft¬é™ÞU›•´GŽe¼i8Œ’¿õ.ïŒÝ³ÍÑNvË¼š[ÕÑoƵÒú·íãŠ;ÂêþÈÁQäcÏß8èß6ˆv3†%„šñz|,›°ÐíÂÞÖýÂÜÚ¦anþ)eñÃH@fÍýë8[·Çæ(U”ÍX«EÍÑmÌ ½¼“Ò:i<ûÏ«?ý1Ð@om›a€nJf^U«ÉÉÉÍÍ JJ´ÎÒUÒêdµZœìÎÚZ«ÀV¶ÁÎê°/ó:3i¦Înzî¼ÿÿ<ì‰ +endstream +endobj +4732 0 obj << +/Type /Page +/Contents 4733 0 R +/Resources 4731 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4718 0 R +/Annots [ 4730 0 R ] +>> endobj +4730 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4734 0 obj << +/D [4732 0 R /XYZ 90 757.935 null] +>> endobj +4735 0 obj << +/D [4732 0 R /XYZ 90 733.028 null] +>> endobj +4527 0 obj << +/D [4732 0 R /XYZ 90 716.221 null] +>> endobj +4736 0 obj << +/D [4732 0 R /XYZ 90 716.221 null] +>> endobj +4737 0 obj << +/D [4732 0 R /XYZ 90 606.805 null] +>> endobj +4570 0 obj << +/D [4732 0 R /XYZ 90 584.494 null] +>> endobj +4738 0 obj << +/D [4732 0 R /XYZ 90 584.494 null] +>> endobj +4571 0 obj << +/D [4732 0 R /XYZ 90 471.735 null] +>> endobj +4739 0 obj << +/D [4732 0 R /XYZ 90 457.165 null] +>> endobj +4572 0 obj << +/D [4732 0 R /XYZ 90 324.976 null] +>> endobj +4740 0 obj << +/D [4732 0 R /XYZ 90 310.405 null] +>> endobj +4573 0 obj << +/D [4732 0 R /XYZ 90 181.05 null] +>> endobj +4741 0 obj << +/D [4732 0 R /XYZ 90 166.48 null] +>> endobj +4731 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F1 542 0 R /F10 473 0 R /F13 540 0 R /F7 505 0 R /F8 504 0 R /F11 418 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4745 0 obj << +/Length 1187 +/Filter /FlateDecode +>> +stream +xÚíY[sÚF~çWè©3eÙ³÷õęiÓ¸3i:ã&´/ŽÇ£àuòÝüûž•„Èr€ÞŸÐÂá\¿=çƒC£_"}×ûfÔ^(YbSÑè.²4Ò +ˆdn£«€í€R_öÆI6Kn.ûŒÆóéÇî6Kn^OÞgIöñììÅ<]æY2Ióþ€I¿˜&ËeùøÆݹ¬&véØ¡>ŽVb0п½ê½õ~ëzD#(<šh.£ñ¬wuM£[|ÿUD ·&z,¤f‘`_§ÑÛޏ=º3Æ U² ‘U<ÙÄ¥·•ƒ_§·+O§IîªÃÅ}:Î'ó´<};ßÏ\š'Å[è9š0A¸°-ý* ̈́pLÞ|á²$Ÿgççþ ñ;*éØ˔¿ž¤.Én^þ¾(Sµ\¦½äÞÜðÂÊFtLc¡„ÏCaÜA)ÓÎT®$¾ê”„¸¶Û-Ò E`–ðµA¶Å XI`|+§šj,Q†EL˜•Uq®îŠz\—_´ñL3h¢˜(%߸ü>K«Âå\ù0^'ûS“9ÛLUË"D«ó°|[EN%Béóf0tÎØ6. àƇÖč?{ÜüÜ· oã$y?u¡RC”¨Ý}艦÷¨ŠÓµÖÏElX]Ž•0%ñâÛ#àáp<œ<¥u þÜhþ¸åû‚“aÖ5r7ÑG&Щ zåîÞQÊÆX­üÆû—/ÏÎ +?nE?0+c¦}³K§š ,/_×' ¸$‰äöh¸’ØɀW°’Çê+K†eö€ŠÚÀ[$±ÚìÆ0"Œ®0%ژ¡aÄE{áÙcjW…»T‘S ÚªÎeDdi õDB/ÂP.°Å©Æé#ÛØ +Ž)J´±á½ KЩGiB¹82–Òƒ±äŽ%Pj,• +±I6ÒÈ9v„Ï6‘í »«ÐØèpÌn¥F^2ˆDÉýÔ¨Ùâeñ™!L¨cs#õ—q£v[£ñyÀžˆ<˜„ðìT{ÈS›¬yÇ;a³ý’”À¿‚}il9§b_§„ØÃ) ¦CôLØÝSÄ<`^_“ÞÉ­­ÈK[‘À.¿Ne'z'lgzgáŸFïÄqé]«¾­‘ü¹¨=˜ÿ1JWaКÿÃY·gfs±µ &R(<Õ*ñ ´Æ6_óGtb'Äbu¤{Ù#? {Çe§„ª;>TíÁôòÙœ^Ênô’?ù¯7ùçÑËgz¹ñÓ§þ¼ NiøNpâØÐO§×ا4ÛZZ!ÿx#L÷æÇ?ç¬ÛøWDjÓþmòÿø?¸OÿõÆcsq¢LÁÎ:îMŠ} šRh€›j_‚™“²ÊØh•¤Ë>ÈbóSW«ŸòXíÊÃOK—}ٗ2®ýC’Þ'Óõ羚ÊeËz©Býõb¾â¤\<¼u® +²Œì×hõô}¯ÈÝÚ_0šàÐ_%çCž/ΆÃÇÇG2^’ût²ÈÈ$.Óa+mQ¶]+¹Ã›\86›gUø“ߜ[ŸOòÿ²·µ +endstream +endobj +4744 0 obj << +/Type /Page +/Contents 4745 0 R +/Resources 4743 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4718 0 R +/Annots [ 4742 0 R ] +>> endobj +4742 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4746 0 obj << +/D [4744 0 R /XYZ 90 757.935 null] +>> endobj +4747 0 obj << +/D [4744 0 R /XYZ 90 733.028 null] +>> endobj +4626 0 obj << +/D [4744 0 R /XYZ 90 716.221 null] +>> endobj +4748 0 obj << +/D [4744 0 R /XYZ 90 716.221 null] +>> endobj +4627 0 obj << +/D [4744 0 R /XYZ 90 668.982 null] +>> endobj +4749 0 obj << +/D [4744 0 R /XYZ 90 654.412 null] +>> endobj +4628 0 obj << +/D [4744 0 R /XYZ 90 619.163 null] +>> endobj +4750 0 obj << +/D [4744 0 R /XYZ 90 604.593 null] +>> endobj +4629 0 obj << +/D [4744 0 R /XYZ 90 557.389 null] +>> endobj +4751 0 obj << +/D [4744 0 R /XYZ 90 542.819 null] +>> endobj +4630 0 obj << +/D [4744 0 R /XYZ 90 495.615 null] +>> endobj +4752 0 obj << +/D [4744 0 R /XYZ 90 481.045 null] +>> endobj +4631 0 obj << +/D [4744 0 R /XYZ 90 433.606 null] +>> endobj +4753 0 obj << +/D [4744 0 R /XYZ 90 419.035 null] +>> endobj +4689 0 obj << +/D [4744 0 R /XYZ 90 383.786 null] +>> endobj +4754 0 obj << +/D [4744 0 R /XYZ 90 369.216 null] +>> endobj +4690 0 obj << +/D [4744 0 R /XYZ 90 322.012 null] +>> endobj +4755 0 obj << +/D [4744 0 R /XYZ 90 307.442 null] +>> endobj +4691 0 obj << +/D [4744 0 R /XYZ 90 260.238 null] +>> endobj +4756 0 obj << +/D [4744 0 R /XYZ 90 245.668 null] +>> endobj +4692 0 obj << +/D [4744 0 R /XYZ 90 198.464 null] +>> endobj +4757 0 obj << +/D [4744 0 R /XYZ 90 183.894 null] +>> endobj +4693 0 obj << +/D [4744 0 R /XYZ 90 136.69 null] +>> endobj +4743 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F11 418 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4761 0 obj << +/Length 1234 +/Filter /FlateDecode +>> +stream +xÚí™KoÛF€ïúì%%jµ»Ü§!÷P#)¤€›(½8†AË«š¨L)-Çÿ¾Ã§Hz)ʖ궆/I/æùí̐‹?ìü:øe2½¾£‘T8“™£±#Aœgr圹„ ‚½!Á»§ÁnߧÅîb~m®âàâcxñýÑÑÉ"Z%qF‰7¤»'ó`µÊ/?™™‰=¢\M ÈóA‹KõÎ'ïo'ƒoa‡dp‰¤ÏéÍàì;Wðü½ƒ‘¯•s—­ºqõáwî|ü>À[½¡>‚׼AR¸Ô°˜w±4q,âÔ¬Ñ;Bj²ÀdÄ M™¨q¾¤¡¬fª\pœKüŠ9>Y˜ÙWŒé44Qr‘êKVGGÓT÷E”zp2¹š×U Œ()GÍq_— ~ò†Œ37“Ÿñ1ŒL_¼ý¾ÌÕ¬Vá"ã }ˆ &Ô¯æEœÞ،ÀHªJ‡±Á£¬\~“bMC +AjãÊÙ,†\ç 9®-R‰°ÏÀ.‰ˆÍÖ2ÉmH%×&¿˜n’øP¡‚KŸ¶b×H¬BL¨VZ¦¤i՛´ZtUíÈ4$p¤e¥YB7$Rì ÈED·q¥6\µÜŽ«BTVéøÙ¢4Í(!µ„ámGþ¥ìtÀ6£RVA }1Ìk +[iTÝe‡F…ÄÆ|C;4ö9dD#¡Z;` ™øÀL–±j¦6ãíìµöãf·•Þ7 -üَ@\Òì|và\O•T˜ö`×(øOSè+ap9·U?nÈJâz²8Ý'UÀ¶•TÚ'u[=£;Õ3!LC}PxÖ€gýÀÃ,ð®·Â©V=5‹!ßZ³RÑDðŽšå3„k5«£¥ù5°§ÔÝÖ·yW¥šAMá͚²K«OaçtçV¿7•\C<ýJ~¨ŠÖ×e»Ü8=­‹‚È‚HÖ"’[ˆçûº(£ª§œ)Q/û{z)£™÷—e+M=Ú6ïaгÿø¼ÇŸkÞë'Ñ€Ävm{Ïsã×yî<ύÿyNîݒǯ-ùy[2{®–<~––Ü&Ríݒǯ-ù…µäñ³´äöp¨ /‹yó-÷ø8¿¯7Tþð¥Ø–0šŠgU9ûn͘V¤õêúH-š@Á¨”Ü÷ÕÌÝ +TlæAbì\ø0mçâ¡`ßGLUP&ñ­-}з®âÎroƒèªÈE4¿Ï¯à_Up–}j„­åu:±l¾|Ï`×e†Ý,âÂý0‚‡7A6?ˆÿß9"TÍ +endstream +endobj +4760 0 obj << +/Type /Page +/Contents 4761 0 R +/Resources 4759 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4718 0 R +/Annots [ 4758 0 R ] +>> endobj +4758 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4762 0 obj << +/D [4760 0 R /XYZ 90 757.935 null] +>> endobj +4763 0 obj << +/D [4760 0 R /XYZ 90 733.028 null] +>> endobj +4694 0 obj << +/D [4760 0 R /XYZ 90 693.096 null] +>> endobj +4764 0 obj << +/D [4760 0 R /XYZ 90 678.526 null] +>> endobj +4695 0 obj << +/D [4760 0 R /XYZ 90 631.322 null] +>> endobj +4765 0 obj << +/D [4760 0 R /XYZ 90 616.752 null] +>> endobj +4696 0 obj << +/D [4760 0 R /XYZ 90 581.503 null] +>> endobj +4766 0 obj << +/D [4760 0 R /XYZ 90 566.933 null] +>> endobj +4697 0 obj << +/D [4760 0 R /XYZ 90 519.729 null] +>> endobj +4767 0 obj << +/D [4760 0 R /XYZ 90 505.159 null] +>> endobj +4698 0 obj << +/D [4760 0 R /XYZ 90 457.955 null] +>> endobj +4768 0 obj << +/D [4760 0 R /XYZ 90 443.384 null] +>> endobj +4699 0 obj << +/D [4760 0 R /XYZ 90 396.18 null] +>> endobj +4769 0 obj << +/D [4760 0 R /XYZ 90 381.61 null] +>> endobj +4700 0 obj << +/D [4760 0 R /XYZ 90 334.406 null] +>> endobj +4770 0 obj << +/D [4760 0 R /XYZ 90 319.836 null] +>> endobj +4701 0 obj << +/D [4760 0 R /XYZ 90 272.632 null] +>> endobj +4771 0 obj << +/D [4760 0 R /XYZ 90 258.062 null] +>> endobj +4702 0 obj << +/D [4760 0 R /XYZ 90 221.046 null] +>> endobj +4772 0 obj << +/D [4760 0 R /XYZ 90 206.475 null] +>> endobj +4703 0 obj << +/D [4760 0 R /XYZ 90 171.227 null] +>> endobj +4773 0 obj << +/D [4760 0 R /XYZ 90 156.656 null] +>> endobj +4719 0 obj << +/D [4760 0 R /XYZ 90 123.175 null] +>> endobj +4759 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4789 0 obj << +/Length 1426 +/Filter /FlateDecode +>> +stream +xÚÍX[oÛ6~÷¯0 ³€™æU£ÐvË°®E»ÆÛKŠÌ$ÂdɕäxޯߡHђ,ÛÉÚ}2%“‡‡ß÷ …{;¿Œ^ÍGÓs9! +=ê9ó;'Ďï$(qæ çrL"ĝŒñøƒKð8*–ÑÍ—âqžn䢈nÞ&·ETlg³×yVVE”dÕÍŶ¬äҝPÇ¯Ó¨,õ𣼓…K‚±Ìb©ÌRìIÀÜëù›ÑÏóѧÇ°CjG„|&œx9º¼ÆÎÞ¿q0baàlêYK‡S¿©s1ú}„Š2„=±;FQjN¶s\»™¯dUy¡ÜšžÒ²E˜La§ÚÔ =¥³ئ¼™p…þÓ )—D·©ÔóCÑšÏ +}kñ‘ ˜ Ç¢™ñƒ;àô)«"0j¬ÒSVÁÑfç¶À* Ö¹ËB¦Q%×z¦À­™êyȇƒLˆ<@ ^ñQVë"3ôWRâàû[0d{xtYàˆsÑ'A"¡9}Ç_8Y(¬ 4€ÏDBˆQD‚žx˜Ï£ +‹Ð´3Ë¡Ýö¹ò1Må€u†ßëå˜:NMŠ  mmÄ__Läv;Šx¿®Vë~&bS<̦8ȦOŦú9Ʀ~ùGɤù‚'So6@¦ +<ö2‰Š†MeuÇæl6w}>Þ®äáýïŠ^5tä{á b'œ€ãí¦œccìx³v²‘Á¼)6‹<^/eVEU’gúÕ¬3)1µ)Þu)›:qš‡{™©ä¬,òe¯˜Ýåiš»TŒ7Iv¯_]Z©œÕmMӗ€(Wù– +诌â®(h­3ë²¼Õ*EgÕYȘa¨M_¿M¤…rÄx¨w©W•-cù]¿Ð—h@=~¿K²8]/ä@DuÓóPŇf‘[¶ñëØaª‚ØšõãPR }ÄI¯ù5{ER|ba އ÷m’ɨ0ОÎ95ìºvYô;•F8yü„p´Œõª.îMCý±žb9¹Iª]ö²Fú¿ÓsPXŽxÜä,+d ßhü҄”²WÃR5±•+!>JóI½Ø +eÀ•n1f!4H) f\ù°¾M“XÛ|'—·ÍÖçë,V±ÿtÃ b*:7ˆ&¦zÜè¬ p“Ÿµ¯ÝùIÞEë´jƒ¶Žî™ Íߪp_'é¨42ÌÈåªÚ~&ú@›4nÂõ*ùWCMW®£ª~ݹRôœÅŸü«ª6헐íSY5%¥ -¸['¶äYºÛf±Ýö$ôóÃ^ÕñP ÖíSŸÁô_˜|#tÝkU_ŽØ:‹ïË/Å[tš¦8_%²ìFG”æä§5Ü2*;!ÉÙãHÛà‚ûüÕéÿGC4ô¾­x;Jàgñ÷¾p™?^$VKÑvÒJ}.!dü¿¤¬é9mןñv¿Ëð@'¡:©_¼B@½¢¢_ ŽàÒÿ¼æ)hBžøu­þª§óPè«z[U!¢ßnÛæÈ<6’~4m’~ø£”Å÷ª71õ.Ê È\ Å£2%‹ÒöíXÝϨBéšw!¥9¤>Ù_N3úmTÇæÎ_øˆí.1UµšM§›ÍÅ%Zgɪ@I5…Æqºß&´¬Þ»uö±Ì Ùäx¹¬ï{øÿ íœQ+ +endstream +endobj +4788 0 obj << +/Type /Page +/Contents 4789 0 R +/Resources 4787 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4718 0 R +/Annots [ 4774 0 R 4775 0 R 4776 0 R 4777 0 R 4778 0 R 4779 0 R 4780 0 R 4781 0 R 4782 0 R 4786 0 R ] +>> endobj +4774 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 338.191 192.544 348.118] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator) >> +>> endobj +4775 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 256.5 191.737 267.404] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_257775ae01cfcd011aca9bcbccb03da7) >> +>> endobj +4776 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 217.679 191.737 228.583] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_50423c4391d0c3064787f19661914973) >> +>> endobj +4777 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [219.075 217.679 262.581 228.583] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4778 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 178.858 191.737 189.762] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_61e02a6ed1b9dd0d6d306d76f5da55a2) >> +>> endobj +4779 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [219.075 178.858 303.527 189.762] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +4780 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 140.037 191.737 150.941] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_92333180e0163e9c87f2220dceef012d) >> +>> endobj +4781 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [219.075 140.037 296.902 150.941] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +4782 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 101.216 199.486 112.12] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_964e4bcbbfde58f43977d0a8e686ec35) >> +>> endobj +4786 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4790 0 obj << +/D [4788 0 R /XYZ 90 757.935 null] +>> endobj +4791 0 obj << +/D [4788 0 R /XYZ 90 733.028 null] +>> endobj +4720 0 obj << +/D [4788 0 R /XYZ 90 705.051 null] +>> endobj +4792 0 obj << +/D [4788 0 R /XYZ 90 690.496 null] +>> endobj +4721 0 obj << +/D [4788 0 R /XYZ 90 641.525 null] +>> endobj +4793 0 obj << +/D [4788 0 R /XYZ 90 626.97 null] +>> endobj +4722 0 obj << +/D [4788 0 R /XYZ 90 591.721 null] +>> endobj +4794 0 obj << +/D [4788 0 R /XYZ 90 577.165 null] +>> endobj +1478 0 obj << +/D [4788 0 R /XYZ 90 478.905 null] +>> endobj +178 0 obj << +/D [4788 0 R /XYZ 90 472.254 null] +>> endobj +4795 0 obj << +/D [4788 0 R /XYZ 90 356.172 null] +>> endobj +4796 0 obj << +/D [4788 0 R /XYZ 90 275.457 null] +>> endobj +4797 0 obj << +/D [4788 0 R /XYZ 90 275.457 null] +>> endobj +4798 0 obj << +/D [4788 0 R /XYZ 90 236.756 null] +>> endobj +4799 0 obj << +/D [4788 0 R /XYZ 90 197.935 null] +>> endobj +4800 0 obj << +/D [4788 0 R /XYZ 90 159.114 null] +>> endobj +4801 0 obj << +/D [4788 0 R /XYZ 90 120.292 null] +>> endobj +4787 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F72 471 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4831 0 obj << +/Length 1655 +/Filter /FlateDecode +>> +stream +xÚíZ[oÛ6~÷¯ÐSg5Ë(JY÷ÐkÑË°,É°‡¶0‰I„ê6QŽçýú‰”ä‹âā“`À^"Z"ÏùΝ v®ì¼ý|1:zç1'@G=çâÊ °#<‚8%ÎEä|‚™L Æx|:!x,ËTÎN'ódy£¢RÎ>Ǘ¥,—ÇÇ'y¦«RÆY5;_êJ¥“)åx|’H­ÍðL]©rBü±ÊBU“¥Øߝ|»ø8úåbô׈cØ! #\ Á¸¦£/ß°ÁûF,ðE3+u\Êà™8ç£ßGØ +u׳–ãa öË|GŒ\ʍÄ_)å ;ýúšŸòÚ2vö~ä|™rÀc[ÜÕe0©–ø•}9@£þœª”U^þ4´ö+æ8¬7ÙMãa|,ÙÌ<Þ êø€ŠçÖ¨PŠ<—:Sâ"QÊ[­ãë,UY5é؞>®YŸBÆhr¿ÃîÓv Ê‚}qb`DÇy6«–…ºMÍ°.d¨fÝÊ»Ðn0j~­âþp¸˜‘åLUó2³6_Ý(3èw7^m|¿Ua gϯ‚«$¹Ž³ëš›£w€W¿9ñ}$<| 1ff–ÇWfgØoçT7±6sÖŧ'A;iOu28óîѧÕÞež'»íùFêtV³8SÍeW±ÒϤ³møFÂP‹_9WCø1Pi'ÅV·2‹¬²³diFði[®@>€y5®±€Tt˃µ¨ÖÈR01¶o ä–É÷å +²Æã!Ìèý̃p +qœ=ÌöÙ ò¼ÍÂÉûÃ÷oŸžØ±OnTX+ß72×vá1ƅÊF–±ìê6¹VË*Öµ×î›ñ_YIÆñ,š§Å[ߟ%XŽîêʁ èB‘Ô5†ºŠŽCU–C% F^—Ǥ­UߞŸ|ø`†êÂ<´‚Ö¤Zm†·£`à#—/ÞÜBæãây•ÛÀœC²PÒv +¯ô )|Nõ< •ÖWóäõ>Âý±ñ•Lô å,£wľ=àûzÆHþØÿT¥y¹œéøµÇ‘•W2™Ùµq6»\VOwˆLwÕò 'V- CWšxÙ¥ã­s"üý†ó"VQ»j(ä×÷Y®ÿÒçÄó*»1Ê¿¡ʞOç;û·Ç+:•™¬;ðëúÏN}×·?Ø÷^¶n¢ÌC>燬›ô¢¹i¾³:¾sõ“^…ZuŸ/d1XoqDÓ¬¬ÅóE\Ý "Pƒw›-ï9Þ­ÐÍkwˆ@5÷À[÷öV’§€Í¿ðqîšÍ/Z?mŽ'ÊԏŸ¶ÿ?`~Ú"0?þЪü¡ÎÖ_~•Ù¼ µÜÖ¤TÙ߈`©–Öjµ9õ\µÃHöÝiGŸF ”=¿ÄˆáÎúoªª8>:Z,(ÔhžÅE‰âê¨(’£57¤&`#¢#rµrÅօx™6Ðº>ÿ|Í +endstream +endobj +4830 0 obj << +/Type /Page +/Contents 4831 0 R +/Resources 4829 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4849 0 R +/Annots [ 4783 0 R 4784 0 R 4785 0 R 4802 0 R 4803 0 R 4804 0 R 4805 0 R 4806 0 R 4807 0 R 4808 0 R 4809 0 R 4810 0 R 4811 0 R 4812 0 R 4813 0 R 4814 0 R 4815 0 R 4816 0 R 4817 0 R 4818 0 R 4819 0 R 4820 0 R 4821 0 R 4822 0 R 4823 0 R 4824 0 R 4825 0 R 4828 0 R ] +>> endobj +4783 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 707.272 191.737 718.176] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +4784 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [202.477 707.272 243.284 718.176] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_dfa7b03e2ac3a6666a7538431f1bdee9) >> +>> endobj +4785 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.621 707.272 348.448 718.176] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +4802 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 669.041 179.554 679.944] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +4803 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.052 669.041 250.666 679.944] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_809a4546135123a08f12c0a65fb22241) >> +>> endobj +4804 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 630.809 225.211 641.713] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_6aec148aa41935a4072c64a43c51c577) >> +>> endobj +4805 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 592.951 155.265 603.481] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_3410a53827de9155ac7d6cbd84263364) >> +>> endobj +4806 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 554.719 158.044 565.25] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_8388d0d6d7ff68c627d516ec17f56b4c) >> +>> endobj +4807 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.382 554.719 228.888 565.25] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4808 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 516.114 161.013 527.018] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_314eb5fed86c6bbe4a7223ca8362f0a9) >> +>> endobj +4809 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.185 477.882 195.165 488.786] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1097cf7cb41f29a02ba271abd2f00f5e) >> +>> endobj +4810 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [173.181 463.573 225.851 473.478] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator) >> +>> endobj +4811 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.148 452.614 227.817 462.519] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator) >> +>> endobj +4812 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.185 429.065 187.563 439.596] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_cd7d1ed2a688f0c6af96e1cff336f933) >> +>> endobj +4813 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.482 414.382 271.151 424.288] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator) >> +>> endobj +4814 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 390.834 150.493 401.364] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_d350b84c25b7c37693d2e7a08d3165ca) >> +>> endobj +4815 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 352.229 181.845 363.133] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_5cebd3d6d6ec070c47682e77b0248f22) >> +>> endobj +4816 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 313.997 181.845 324.901] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_67f95ed6867827f03a6af0a7334376e3) >> +>> endobj +4817 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 275.765 154.727 286.669] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_2552e7a194f5fb0d591bafb591b91968) >> +>> endobj +4818 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 237.907 176.505 248.438] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_5a79ce2b52efebd42da2736164a043ad) >> +>> endobj +4819 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.408 223.224 450.955 233.13] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_67f95ed6867827f03a6af0a7334376e3) >> +>> endobj +4820 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 188.343 191.718 199.247] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +4821 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 188.343 288.852 199.247] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_2b451e6b09162c7c19b0a2ad36545c69) >> +>> endobj +4822 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 150.112 191.718 161.015] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +4823 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 150.112 303.079 161.015] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_78a4d5f5e4702a16d6aae656293ec7ad) >> +>> endobj +4824 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 111.88 156.281 122.784] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_c92d2324f8ddea454926272e5ccc6dad) >> +>> endobj +4825 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.097 111.88 237.924 122.784] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +4828 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4832 0 obj << +/D [4830 0 R /XYZ 90 757.935 null] +>> endobj +4833 0 obj << +/D [4830 0 R /XYZ 90 726.054 null] +>> endobj +4834 0 obj << +/D [4830 0 R /XYZ 90 687.823 null] +>> endobj +4835 0 obj << +/D [4830 0 R /XYZ 90 649.591 null] +>> endobj +4836 0 obj << +/D [4830 0 R /XYZ 90 611.359 null] +>> endobj +4837 0 obj << +/D [4830 0 R /XYZ 90 573.128 null] +>> endobj +4838 0 obj << +/D [4830 0 R /XYZ 90 534.896 null] +>> endobj +4839 0 obj << +/D [4830 0 R /XYZ 90 496.664 null] +>> endobj +4840 0 obj << +/D [4830 0 R /XYZ 90 447.474 null] +>> endobj +4841 0 obj << +/D [4830 0 R /XYZ 90 409.242 null] +>> endobj +4842 0 obj << +/D [4830 0 R /XYZ 90 371.011 null] +>> endobj +4843 0 obj << +/D [4830 0 R /XYZ 90 332.779 null] +>> endobj +4844 0 obj << +/D [4830 0 R /XYZ 90 294.547 null] +>> endobj +4845 0 obj << +/D [4830 0 R /XYZ 90 256.316 null] +>> endobj +4846 0 obj << +/D [4830 0 R /XYZ 90 207.125 null] +>> endobj +4847 0 obj << +/D [4830 0 R /XYZ 90 168.894 null] +>> endobj +4848 0 obj << +/D [4830 0 R /XYZ 90 130.662 null] +>> endobj +4829 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R /F98 2120 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4869 0 obj << +/Length 1530 +/Filter /FlateDecode +>> +stream +xÚÍXKsÛ6¾ëWð”J3 ðM59¤IÜiÚ´®í¶‡8£H(fÊWH0²òë»xQ¤LÉJ'îô !)‹ýöñí.±õÁÂ֏“®'gç¾cE(òmߺ^[¶Ÿ Ï&Öub½›‚™Í Æxz1#xJëœ./f6ž–Ùö–%5]þ’®jZo‹—eÑðš¦_^mÎòÙÜöðôeF›FÝ^²5«g$œ²"fB¬ý) ½Ùûë7“×דOŠa‹HE¼ŽgÅùäÝ{l%ðÿ #' +­\•[®íÀ5³®&¿OðQP¶ƒ°ï)PWœò4V]´«ÌÜ¿eù +ԓ÷çmóIՌì³s÷¹NhÍmùFøm{ƒ=Ö»¹ÖkÔ¡ê@XÐP/åqh’æ¬hàÔ%ßVl åàžœÞ-›ŠÆlÙíÞ?^,»Á†Ùj`¶,ß°׶æÄE‘ë*X—Œ·u¡ÝÈoÙÌžæ­ö³Ôb6¢éqØ*nfěöcgDLµÀ[Z$;Ð( þšd 9É_ò¸Ï2ÞÓä8Œ´HyJ³ô { üÔIßwB,òëd‡ŒíâÑìp>s=0õ£Xâ+L‹˜=%¬é'Çe|au){ÉòŠoÿ»ÄnÒâCƸIà¦G瀜(X žË"Û~M~/J8Q[Ó¬a£ @9tՀÞçN„0°°ë â9:Jê”É7#ïUYfÇ1–«)/ëçÏ9鄈¹Ð5uœÂŸÜ==9ö´ýÛÁ^oµƒ‚Õ:^·L-Št´fQºÖ%¢Hzá¤øt=r„ ü§wߍȐoÛf{_ñu*léÐzæS¶Ÿ"4×w•6¶ êⴘ%æÆ×QÛY6£œ%#È^ìb[9n¤ÃÂëגwRÞéÚè?i­oŠR¿Ì{ÝÎڜ…îga—'ò"÷!†L‹’QÍONK…¸—Ÿ,ƒ;O>{v4™…‘Y+ì1¢JóôswܜšGó(D.¸kH¿µ¼jµ7„!$C +cB¯±y¸ˆ“»Óf#Ûýj_„|) |p¿<=(œ2$Œ ¸î°ƒHäŒ2{Àê®/,MPäùʧŸþuôÞ$3ôêUÅbÓ¨ð— µ*0*ƒ´Ù(+ïÉvéBúDV±#ä…þ°Ê™)îƒê’yŚ¸N+®§†ã4óâ~3P®{)%íªú/±•Յõ…h$B2-WYÌõýZ]£Âlߎ¸–<ì?X”6JU—Nßޙ=})„á4E ÉÛÈìËی§ ÛÓV!hþ ¬ƒRÛd‡å~Û3w`0þë– ³9 \Ñ°š«–ˉúڛ÷êJÕ{…X qwcüߍez›* +â¦åe.š[šÉê kiò±mT1‚M©®º¶ˆ÷YÖ9ºj׋t”ãÑ~íÅQWž&ÇÖu«îgAàŠ²îŸãi"ÊC@ O®¡¨ôÑdx†,ïh^efÂH5K§úœÜæFÇ]½jœ”ÒUÖKþ^• +ä†Þ^÷2H9A^áX÷2h\à Øë^Ž9`Zª±¬Ë,+…â›fqˆd¸š2Ù©’ȳäË ¹DÿnÑÐÓû_Þ|¨B&'~x“ÜฝN ƒBdÚÚÎÒ]͞ †ý¨‹´zøﻙçMµ-ßÒ¢¥:QEÀ¨ì¯wߘ`ôÀÈa$ØZ—+f¾?(d[æîgÒ;}E^:»Vó–ójqv¶ÙlPÜ ¶H«¥ü¬ª²³û1֓Bddj!kÃKy¹ó0ü)hvHûÿo#^i +endstream +endobj +4868 0 obj << +/Type /Page +/Contents 4869 0 R +/Resources 4867 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4849 0 R +/Annots [ 4826 0 R 4827 0 R 4850 0 R 4851 0 R 4852 0 R 4853 0 R 4854 0 R 4855 0 R 4856 0 R 4857 0 R 4858 0 R 4859 0 R 4860 0 R 4861 0 R 4862 0 R 4863 0 R 4878 0 R 4864 0 R 4865 0 R 4866 0 R ] +>> endobj +4826 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 697.247 203.075 708.151] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +4827 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.573 697.247 296.324 708.151] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_c3223cf8c7d19b02b5e3c04038024b47) >> +>> endobj +4850 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.005 682.627 346.612 692.532] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +4851 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.437 658.767 194.297 669.297] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_70e9ad42674d62ed9bd73268e3af7064) >> +>> endobj +4852 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.437 619.912 188.759 630.443] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_ea9a4fb9807eb61cda3eedf8e5a7acae) >> +>> endobj +4853 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.953 580.684 238.78 591.588] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +4854 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [249.52 580.684 319.029 591.588] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_6293b813e42a59a9795cafe0efa762cc) >> +>> endobj +4855 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [290.965 566.064 397.522 575.969] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint_2935fff040a5b31930fff594a0b2596d) >> +>> endobj +4856 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 499.922 180.54 510.826] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_f882ff84afd3c2507e17ffa62ffd20a0) >> +>> endobj +4857 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.877 499.922 255.807 510.826] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +4858 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [297.54 499.922 345.47 510.826] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +4859 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.349 391.881 226.034 402.785] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_dd9738866968b13e938d5669dd94a55e) >> +>> endobj +4860 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.176 391.881 399.003 402.785] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +4861 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.398 353.026 171.764 363.93] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_3badc2f43376aa26f481af4800a3515b) >> +>> endobj +4862 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.063 353.026 379.972 363.93] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +4863 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.021 353.026 513.996 363.93] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +4878 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 341.071 227.154 351.975] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +4864 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.363 241 257.19 251.904] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +4865 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 229.045 132.51 239.949] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4866 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4870 0 obj << +/D [4868 0 R /XYZ 90 757.935 null] +>> endobj +4871 0 obj << +/D [4868 0 R /XYZ 90 716.221 null] +>> endobj +4872 0 obj << +/D [4868 0 R /XYZ 90 716.221 null] +>> endobj +4873 0 obj << +/D [4868 0 R /XYZ 90 677.486 null] +>> endobj +4874 0 obj << +/D [4868 0 R /XYZ 90 638.632 null] +>> endobj +4875 0 obj << +/D [4868 0 R /XYZ 90 599.778 null] +>> endobj +4876 0 obj << +/D [4868 0 R /XYZ 90 518.896 null] +>> endobj +4877 0 obj << +/D [4868 0 R /XYZ 90 438.133 null] +>> endobj +4879 0 obj << +/D [4868 0 R /XYZ 90 303.751 null] +>> endobj +4867 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F11 418 0 R /F31 472 0 R /F7 505 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4886 0 obj << +/Length 2133 +/Filter /FlateDecode +>> +stream +xÚÅXY“ܶ~ß_ÁòC©x°8x®¥Tَå*ç°"m*k• +Cbv™pHŠähvüëÓ@ƒ× F»«—<ÄÑèn|ýuÔ»÷¨÷óÕ·W×o"á¥$xäÝn½”zqÄHșw›{w>c„±ÕšQJý·+F}ÙîäÇ·+Nýº<>¨¼•ÿVlZÙon~¬«®oeQõß»^íVkRÿÇRv6ß©­jW,ñU•)-–ÓÈgI´úpûËÕO·WŸ®(F=f c‹ÐËvWw¨—Cÿ/%"M¼ƒ™µó.à[zï¯þyE­Q§_42ôb’Æ”i#‹ /æ‚P1–:”Àè¬ûN+’Ö) ¢'g)ªNµýo4¤8óϯñK¡-…—½²‹ÄÙ"×NǯÙéxi§ë7!=AÀš¥$b) +úGÝÃ1 ûýƒìoVë д}Ùè2üï¬ß„ˆü¢³sZ%{•ãÏ¡èp¸kdf¥äÅNU]QWøû»jëÐi£ß(åm×ãRYåƒJE›Ÿib½ÀMCëôì`QXTZ«NáŸÙE7¬Nº9ÓÉL©Ñ_ÉÌ],JI’j¸b 8<“ æí¶CIâx˜Â2’&ã&ߢ:­ê•õŊ‡þç }UWQèFîO"{Íõ©€¯ "´áýÓ£Ü5¥5šŸ,_èÁÓÔ côë-.„/ó¼¨î±½­÷­nq¤Èzì-*õi/Ë¢/T‡=àRüïÃô9˜ôÀ&Ý®·‹ÉÂoZeŒ/ê}‡Ë•öZ£½¤Á6–.jÕ®Ö³ÐeØ÷Ÿ}ç„Ì +k´pà(SG۶ޝbÌl)ÛJƒ_ÿÊÍl÷åQ͎lÎSC@Ƅñô2‡ü ?9\â†à¹^á'z ­]^DjVÂã —a—ðå$à.X‹—Âúv:û²¬5ÎoèÊêÜntÜenÁ -f‰ÏÀÖ, Ý ­ŽáºÊGÁ&&1²Ü®u5e!76S^ðˆˆ@ ìð§Ä^ 2KCO¡‡_¢˜ öÖ³I7ÏçZ€çØ}ÏÿO=Aß믁¥ì’NÏC#Ÿ’èͳ@˜ÚEßo{¨”Ö‚ñ!}i¤&4Btïn_öE§zìÔPÓ½ ¨áâŪEÊf†eẆs҄ÕD¦éˬÀ÷«;îÚdÕ+eEë’[Ò¢²Ý I`NÍ¢Séxy”Yï*=†¹ ÎêFWœ:ÉЃ‰ wØBb‡¡ÂŽVAÀ¨)+æP°ðԏ¿W•je©ó‹ýº*ØïTŸ¥›E:ªÿi_|–¥ª\ú‚@Õ\WJ,^õϛ}•õcIø—:ÛCØKÓeÕçðqºO†ÛÓ¦®K›@a_·¯_ã¿v±1ç—+}UvüZ|>Y‚]Æ{tZ@†Ô&¤—ï–„GÑ ëèÜ odf‚>5;g.¼’ð±,¾ÛÏp²ø3¢±9¿ˆ[X¼Sý¾…Jþ\°$H‚Apßî•C(¤Ì€Žþ(l†–É[RÐwëØ"ˆèÄÝ ù£ä¬æ_:`QôŸҞ]Täζ{ruE*X ‹üÀº,XÜ⨥ìs€_Ät$n³ÒD> endobj +4883 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4887 0 obj << +/D [4885 0 R /XYZ 90 757.935 null] +>> endobj +4888 0 obj << +/D [4885 0 R /XYZ 90 372.299 null] +>> endobj +4880 0 obj << +/D [4885 0 R /XYZ 90 349.988 null] +>> endobj +4889 0 obj << +/D [4885 0 R /XYZ 90 349.988 null] +>> endobj +4881 0 obj << +/D [4885 0 R /XYZ 170.288 285.279 null] +>> endobj +4890 0 obj << +/D [4885 0 R /XYZ 90 270.968 null] +>> endobj +4882 0 obj << +/D [4885 0 R /XYZ 108.69 194.339 null] +>> endobj +4891 0 obj << +/D [4885 0 R /XYZ 90 178.743 null] +>> endobj +1479 0 obj << +/D [4885 0 R /XYZ 90 83.31 null] +>> endobj +4884 0 obj << +/Font << /F63 374 0 R /F65 376 0 R /F50 339 0 R /F8 504 0 R /F31 472 0 R /F7 505 0 R /F72 471 0 R /F95 1788 0 R /F11 418 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4909 0 obj << +/Length 1278 +/Filter /FlateDecode +>> +stream +xÚíX[s›F~ׯ ә&Ãj¯\4mgÒ$Î4M&ª­>ÙdÑ"€êèß÷,» „±ìÔV“‡>ØÀêìî9ßùÎe×6ÞL~YL¦'3|ä;Ô1KÃdžë$(1‘qn‚µl‚16çÁfPfÁåÜ¢Ø\§ÛU•Áå»äª ÊílörWu$y}y¶­ê8›ÍB9t™ÔqÔëÒ²©ÀæË4¨*õz/ãÒ"žçalÙLpjϵ>.ÞN^/&Ÿ&ôÄiô.r™0ÂlrþŒ¿50b¾gÜ4R™Á)ƒgjœM~Ÿà`‰/m¤ aGÇHÎEk¤|#mi‘Á<ä n؄!Ÿ»jïžù 2=¸ç »A9bÜW3^ä +»}P×æßò_¬Gõ¨%µÐR=ÃΆ +©mŠÝ¶Tt‘C5<ß%y˜n"­ !=IÁ øc%øãÈZà3P\ EŠV«‘u˜@LÓb?ëuúÄ´}qBŠˆÏ•à|s•&¡²é}œ]µ¦Ÿlò°NÀȆH-àqæ¶9-.({sûÊkMÃÓ7ãÜXC¸óyHH%.°ÀðG뵺¸Ôð@‡K]¤Œ#˜¡{/ƒMZ÷=¶ å^„®z‡¥v»<Þ'ä8¦6R=eAÿýö1X|(-æšQ’C¶{[û Qy0(ÓÚ祇¸Óñû3<Æ2º yZâ‡!L¼92&ã´P^ւ#LjòO¡„ú*$zQUÉužÅ¹ÞAj#fpÄ êcu›]]çÀ*òí”òÙQ³CY²,Ù k&î<òð¡’rD2äeÄMŗϦâ?µŽå†¨®@>¡Û˜ÞÎw£{ÀiPÏiŸ,c +âÇz z Þô&=ýšG‰òU¨C&ëÙ*Não:Ë<~Œ²ú9¾;¹·ïÝ4f˜ßs‘à­æ¹©¤‰ò­^˧0‹Ri +ñ¨~(ã ²aäg†qUõçp3•µÛYuYí7à˜«MÔ ½Èaýo]Åì› Áh.}t»uõ'ô+hÐKí{C['“pMÏzý9Ȋ4>؁yÈž¤Ën³ÅJSo¹NÓµE…y“ä×­×"ýcQJש÷ºq£5£›$ïÖìfúƪeàÞe €†8é"¶X°TC¦Ef{†¯ä>â=ôF®¹‰ƒ½ä»ÌÓqÂG¢ ­´yÓ”™¦þ¼½…SŸú*N}üQÅå–¦æ}o‚Ôê±¥J†d3i#*Ó/’lžÅ­w•eíÛo“¿¾ÄsÃ]aZÕu1›NonnPX¡Mž%JêiQ¤ÓÛ|é­ |w +X¶‘Ÿ­Ë¶Æå0˜2 !þÿ™PO +endstream +endobj +4908 0 obj << +/Type /Page +/Contents 4909 0 R +/Resources 4907 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4849 0 R +/Annots [ 4892 0 R 4893 0 R 4894 0 R 4895 0 R 4896 0 R 4897 0 R 4898 0 R 4899 0 R 4900 0 R 4901 0 R 4902 0 R 4903 0 R 4904 0 R 4905 0 R 4906 0 R ] +>> endobj +4892 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 609.505 170.687 620.035] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_641015af4c3d3b84184e8ca8dd128b10) >> +>> endobj +4893 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 570.277 170.687 581.181] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_f3c5bf7dd0135194b6c180dcb232ef54) >> +>> endobj +4894 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 531.796 178.435 542.327] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_fc81dafc5cf15ca9acd8f6a03f66c788) >> +>> endobj +4895 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.426 492.569 222.233 503.472] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_a02f5903786b4da29daecddcb0db6cbf) >> +>> endobj +4896 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 453.714 180.938 464.618] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4897 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.678 453.714 231.847 464.618] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_311a973ff993328d8cb3627f3af31129) >> +>> endobj +4898 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 414.86 180.938 425.764] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +4899 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.908 414.86 239.04 425.764] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_3e8a8932563dfdc292fde93931f0bf2e) >> +>> endobj +4900 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.426 376.006 227.852 386.91] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_4fa3c4bbfb1c6905d95c08c2d90af526) >> +>> endobj +4901 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.185 337.151 217.61 348.055] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_b404db5180176140a7600b31616f9a07) >> +>> endobj +4902 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 298.297 180.54 309.201] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_6ba82ff86685d87dd34f4d441a7d769b) >> +>> endobj +4903 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 259.443 178.239 270.347] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_d8c2dc06b66e812182f2b1445940e7ff) >> +>> endobj +4904 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [99.226 159.372 156.003 170.276] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator) >> +>> endobj +4905 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [436.169 159.372 513.996 170.276] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +4906 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4910 0 obj << +/D [4908 0 R /XYZ 90 757.935 null] +>> endobj +182 0 obj << +/D [4908 0 R /XYZ 90 733.028 null] +>> endobj +4911 0 obj << +/D [4908 0 R /XYZ 90 628.105 null] +>> endobj +4912 0 obj << +/D [4908 0 R /XYZ 90 628.105 null] +>> endobj +4913 0 obj << +/D [4908 0 R /XYZ 90 589.37 null] +>> endobj +4914 0 obj << +/D [4908 0 R /XYZ 90 550.516 null] +>> endobj +4915 0 obj << +/D [4908 0 R /XYZ 90 511.662 null] +>> endobj +4916 0 obj << +/D [4908 0 R /XYZ 90 472.808 null] +>> endobj +4917 0 obj << +/D [4908 0 R /XYZ 90 433.953 null] +>> endobj +4918 0 obj << +/D [4908 0 R /XYZ 90 395.099 null] +>> endobj +4919 0 obj << +/D [4908 0 R /XYZ 90 356.245 null] +>> endobj +4920 0 obj << +/D [4908 0 R /XYZ 90 317.39 null] +>> endobj +4921 0 obj << +/D [4908 0 R /XYZ 90 278.536 null] +>> endobj +4922 0 obj << +/D [4908 0 R /XYZ 90 222.123 null] +>> endobj +4907 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R /F11 418 0 R /F72 471 0 R /F23 340 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4932 0 obj << +/Length 2040 +/Filter /FlateDecode +>> +stream +xÚÍYmsܶþ®_ÁNfR^’ƒðʗ³ÛµâLÓ&£Úê'Û£¡HHÇ)¼<«Ê¯Ï.¾ïd'îL?h‚Àb÷ÙÝg'ê=xÔûáâo7—¯áÅ$xàÝÜ{1õ€řw“yï|Æ«5£”ú×+Fý¤Þ%·×+NýªxÚê¬Nnÿ™ßÕIý´Ù¼ªÊ¦­“¼l›Û7:;¤m^•«7?^¾fltW‚H +挗vÉDF q·âŠ}·ZsEý+¾ N0¾ní_Ÿ•öªHšÆÊ»YÅÜ×»}‘´ÚμÑ÷º^±È×eªW¡ >‹"yñýÍÅ/x õ˜ÁI…$ÊKwï>P/ƒù=JDyfÕΓ\À³ðÞ^üë‚:ÌçOëå…$)3Ú²ð0òB.…/Fé±]­ðÃóíÛ§¦Õ»¯í|ÚØç_ìc¿%éà÷TQøc/Ð8xH+û¾ªí\t$}³1bnóV×IÛ-Í'g¥ ¹Óyٝò9E€›CiêÌhnu™Í÷ÂÔ ßXüŸú5¸Í}ûöÛWš#րQÌ&Ö¤ÕÁõò¥U#"\ޚoœߘ’„÷FÓy¿Ï<áÈâ… 'EGá´cEpvHTÚ­7[@Y•vºlüfÊà‹ƒv›»ÀK‡|4iå^t‰(ëÌí¬«]·UwŠ¢Zqå?æ僝zO)/ôÆDiV ˆ¨¤"ª³ï=çjºêÝZa¨ì ²Ýö‰I+ō©! ëlýR¤I;:JP8BÆǬ0ZÃ8alN ¢§…™@ð»ǼpR^O ¼#†µ 2žC !ˆ6ÙÕ'Ic!`@•HA&pI˜è"f!öuµbÊÿ˜gº™9¾îÁ3¯;Ýn«ì(ÀÜâ1ê×u…;»ðÜÁ,q`¨‘’À @<wiôU^¦Å!Ó „ ôÆGô=–p žGה¸‰`Ûâ^Ç!‘Œ£ë¢øúpWä©5ç'½»ÓÎøׇÒàÓLB|æŠ>-8 ‚Sia9¾~pdÿ¦O”“Á<Î(›’–Îfb;•BîE R”CPE‚LBp9ô¯ô}r(œÏ,ÃaàfƘO¥ž0x݉·Ly–>šÎ3÷m£hù­ H}Êú+f•ÿ:o7Ãÿ4=ÓZX0]ŒC\–¬DèO3¥Úk»ªíҤϗf›Ô=.Ê»Óí£Öå,½l5_ÞÇ «3"‚B×gÖ{*èÝ`öõéù? YH"®æû 1:Oo +É(aJŽŠ a®¼\é6ɋ®Âiï; ²ÆŒÚvÜՄ„†ì\Ç9­}Úë2Ù¡·!œl‘t>½ÔŒ2 ˜X…Ït£¬W¥ã~÷åúkÀS ĺdíZ2]tN¶þî>{Vçì’ÿ¯:×W65"A£ñI‚†V=T¿%µ¶³‡£§ÚÊ>!ñÛ¤ló¤]1߉B…N’&.¸6¼Rî¢x²ÞÓY¯ò,ñÜ΀µŒ„Ãå8 qE’eÍätcèȝ£ö߁¢±U,{ÆÓIºuy?6­vûª„>vBxnQ5[\Á¨ží# QG]!Ÿ¤:w©¾TÊ]4NZêQ⫉œž4Îð@»bñÄ <@•oJ |L&'ƒlÀ!ׁ9Ï°A ½TÐ-øˆ€؜÷Y„àZUᥝÆÁ9®ª¹zî*.?ã&~ÎØ ¸›ÍÞ4Í®›0ý³é(Ž{+*Vµ¡ª×ÜGMRf  ýÑ_#È>9M¿$ΐ`<éXÓ‚(|NQ@h‡ —$báyhQù^0ÁÃü¿£Ó8ëjˆO“F#ð4©*Mš¡ó4lÚgÿ¨ð;}°q0 8TYÀIDã)ª(îå6(“_"ÌÝ Êýւ“öp\ë×ö-±Ÿ÷ŽW+'°ü¸ÍÑRóp­3çºàµ{ÜQ`ô«¥Î4%¹k5`A­Ó|Ÿ»`Ÿ×é)E¥¹)æ*¾$nîp×è֎¡ô2ÿގA­FÛá$Íí·ÄíÈÝ3MÜ!n 64L9ó`bÐÒ¼:ÑÊý×è7c=~—ÿ&PgõZûù Ôã8WÈÑO:ˁ.‡5.Ãó-.ø¡îo²ÃEGŽ(Æ˜Þ ¹'H0°üV'ÿ ïçŸ_Wêzˆ¶“ª™Û†I*§eUOƒÑf 9$EÞºé)Ë£]µv¹£ ߥš7†àåñOŒÇ(Jb?ÇÀRöx‘lLïÀŸc1)ƒ)ݞVKD$ò3~ŠZ'9P 8vÖü?\ŒYô©ÿ0?øÃYpO Eäþé¢b¢Ô¼þ»;Ã.q¯]h_]h_þÝèúÏ+¥|WåJÊ’b×I}DQºnúÞúRäwè3ßê.¬eÿñºÑ?ì?(}YA{ü¶m»ß\^>>>’´!‡2ß×$o/÷ûâòø—¸‘pÔÐ÷ÝË®ªùy‰tnšþ#ü]Î +endstream +endobj +4931 0 obj << +/Type /Page +/Contents 4932 0 R +/Resources 4930 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4849 0 R +/Annots [ 4923 0 R 4924 0 R 4925 0 R 4926 0 R 4927 0 R 4928 0 R 4929 0 R ] +>> endobj +4923 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 493.743 207.229 504.273] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraints__Reduction_87f25b7a2988f918a20b3d09047b08ab) >> +>> endobj +4924 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 454.515 197.875 465.419] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraints__Reduction_383574ff4028da9048235b061a613b99) >> +>> endobj +4925 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 416.034 214.978 426.565] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraints__Reduction_898fefd81641cf4f6b854e85412a415c) >> +>> endobj +4926 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [285.613 279.285 397.034 290.189] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +4927 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [159.512 115.762 179.766 126.666] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +4928 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.977 115.762 329.907 126.666] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +4929 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4933 0 obj << +/D [4931 0 R /XYZ 90 757.935 null] +>> endobj +1480 0 obj << +/D [4931 0 R /XYZ 90 631.363 null] +>> endobj +186 0 obj << +/D [4931 0 R /XYZ 90 624.763 null] +>> endobj +4934 0 obj << +/D [4931 0 R /XYZ 90 512.343 null] +>> endobj +4935 0 obj << +/D [4931 0 R /XYZ 90 512.343 null] +>> endobj +4936 0 obj << +/D [4931 0 R /XYZ 90 434.754 null] +>> endobj +4937 0 obj << +/D [4931 0 R /XYZ 90 378.341 null] +>> endobj +4938 0 obj << +/D [4931 0 R /XYZ 90 315.954 null] +>> endobj +4939 0 obj << +/D [4931 0 R /XYZ 90 253.756 null] +>> endobj +4940 0 obj << +/D [4931 0 R /XYZ 90 231.444 null] +>> endobj +4941 0 obj << +/D [4931 0 R /XYZ 90 231.444 null] +>> endobj +4930 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F65 376 0 R /F50 339 0 R /F21 2111 0 R /F72 471 0 R /F23 340 0 R /F95 1788 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4961 0 obj << +/Length 1675 +/Filter /FlateDecode +>> +stream +xÚíYm›Fþî_T)ÅR½ÞØkU©Íõªæ¥½æ®ê‡$²°YŸix àsÝ_ß}Æö]ê$ŠÔw,0;ÌÎ>óÌìZw´~ýx;š^¹Äb€¹Øµn—ƒ–ç"@1²nC뵍@Îx‚ „öõA;(’`v=ÆÐÎâ튇E0{͋ Ø^\\òŠI”¿½}6½B¨¥C@ÇVš¿Ó"¯#°S \ß (A@È«E¾? ƒ°Zâi”åx‚)´oÇ Û<ÉcižzòŠ/y1F¾ÍӅxD]Hmä3©tôÓíèý 5ÐBÊ+Ô¡Ö"½~ ­P<fA@˜om”Tb9˜ˆkl݌~AãaxÐÓ>:–‡]€\Ç,Y{8H¤#Ë eH_ÓôŠÑör}àAfMÄR¬Õ„¨3szEaׅÌi¼üƒvEžEiUòJ߅YD©ó˜'<­¾í©ì11:'ˆ×3Ð ñG²Âš \êYá;†ˆVq»âõ´ÅZÊU”™ÙˬЃj4,vÀØ(¯››;žòB $43‹,©§òZYgcLíM”ÞéGo Ä1ï\à_IÅÎPmäŒiWêõ„ŠÐÊó¬V šEÔ1*wSºÖ¨!€®{Ž¨±Ýúv˜pæ@X¶d‘~`võ;™ƒö#ó šG„¦ÒՁÏ3<ŸŠˆÃ´Ê?‹ 7*}¹¾~±·ßcYG(lyH giY|‰å¶¬xÒÌæÅR9}ÁYf; Ø3¸ØÄôWQºˆ×á#R<¶çù¶.Á9NÃemtô +|1í)N˜„Uä@ÏDÌKžÌ¹ Œ«uºñRÖ`ÌÒ/«~Í̃—Y-·½˜¸l…êO:TPr<2ÔV˜½¼Ñ×'FN2sqg(ú•šÑ¢Š¾2§Š?ÔÚåëaËæJb!"èÆÁŠå|Cn¯xµ.Ò.ÖZ¦câÙ +Âòª²‹òWÖó›Ü0¬ÉÆXm:àÊIm`òNÐÌ<Ëâã΋ÊY•åÉwuWã}'M pIC"U±6aÓUéLÝZ(ZŽ'D$î õ Kã­¹ò•šÍXk¶ ;6A'˜› Øáw'£’ÆI3Jýuµµj ܨ¬È–½7º‘4݌‘X„¢9KRÎْuä­ô~¸”߈GˆíômVYl†÷|Q‰\§’$"P*K(ظ¾ÌkÉmüÌ ›gU%2ë'‰ÑA˜!BOÁL¬ÕEm˜©XOM°j˜©å ÂÌ>vϳ®eAŒ#µIËÞˉm‡´]r{Å¢&çDÈe•F·3YºEqymDP׫xúZžl?}¡ky¿§KThS±o4Q@š=O¾ S×3xrÏ@0]H½_G²b¿—ÿ‚X¬Qd¹ÿöY&?¿¯G:.YRï”èÂʔMbwïÕ®>tž  COØ $ ždÅvVFÿðYµÍùéYº¬‚xfæFél¾­xù‰ê­v±g›ºöŸgë{ª2×ä ±Ðúd&*ۇS^¡y¹X¬ó¨®rçÛ°a—9ç@±£!‚|àøä ª¨û[Jú%ãÃѐi ÏwòßqPˆ2•PüPxþ@L@Aµ‚yÎTêüöü#ïéÓ_ÈFл²áv½½qÜÛ±q´ïƒ" +ÒªA›XË ŠJ™FyøŽ '²y)u‹p§Ü· +ÊYš¥U¡óy$BfÃw +J©ìÇsî@_¤é®µú"×ëy\[4Ü#ò…jM{¤ÓÔxªÊíµ<“•½ä{Éë7G%¨%9Íy,¨RvµN·»’×¾zúXwD®„ö ¯‘¥WöΪGÏGÊw;{‘ï^UU~1n6°(Á:òDÕ4Ïãé~<´´ˆ ó%M[_$—†ÓÄÃDµþ÷üÿ/ðh( +endstream +endobj +4960 0 obj << +/Type /Page +/Contents 4961 0 R +/Resources 4959 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 4849 0 R +/Annots [ 4942 0 R 4943 0 R 4944 0 R 4945 0 R 4946 0 R 4947 0 R 4948 0 R 4949 0 R 4950 0 R 4951 0 R 4952 0 R 4953 0 R 4954 0 R 4955 0 R 4958 0 R ] +>> endobj +4942 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [161.242 507.051 194.776 517.581] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_6e192bab4a848124e98adc8e04f1b780) >> +>> endobj +4943 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 468.093 160.465 478.997] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_f724448826bbc00406f8f680b31fcaad) >> +>> endobj +4944 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 418.923 175.967 429.453] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_7698afbb74c4d9ef4a404fd200b9226c) >> +>> endobj +4945 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 379.965 204.739 390.869] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_6a570635ea948e8b83a131c1433f558a) >> +>> endobj +4946 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [232.076 379.965 283.313 390.869] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >> +>> endobj +4947 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 341.38 244.091 352.284] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_162dc548ba77c3b8b0c09b83740b0add) >> +>> endobj +4948 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [271.428 341.38 322.665 352.284] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >> +>> endobj +4949 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 302.796 191.718 313.7] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +4950 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 302.796 288.852 313.7] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_68155a8dd4748908068c4f06816ced9e) >> +>> endobj +4951 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 264.211 191.718 275.115] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +4952 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 264.211 303.079 275.115] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_97f31ca582bbc0a736ce5f3167021638) >> +>> endobj +4953 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 226 150.493 236.53] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_766f30dae23752bf497bca855ef8b259) >> +>> endobj +4954 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.636 187.042 264.424 197.946] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_c7a892d14bca002fc1a03f9b8a950850) >> +>> endobj +4955 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 110.925 176.332 121.829] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_6d81efe6a6302e1b6296be157faeb73e) >> +>> endobj +4958 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +4962 0 obj << +/D [4960 0 R /XYZ 90 757.935 null] +>> endobj +1481 0 obj << +/D [4960 0 R /XYZ 90 630.886 null] +>> endobj +190 0 obj << +/D [4960 0 R /XYZ 90 623.868 null] +>> endobj +4963 0 obj << +/D [4960 0 R /XYZ 90 523.614 null] +>> endobj +4964 0 obj << +/D [4960 0 R /XYZ 90 523.614 null] +>> endobj +4965 0 obj << +/D [4960 0 R /XYZ 90 487.051 null] +>> endobj +4966 0 obj << +/D [4960 0 R /XYZ 90 437.508 null] +>> endobj +4967 0 obj << +/D [4960 0 R /XYZ 90 398.923 null] +>> endobj +4968 0 obj << +/D [4960 0 R /XYZ 90 360.339 null] +>> endobj +4969 0 obj << +/D [4960 0 R /XYZ 90 321.754 null] +>> endobj +4970 0 obj << +/D [4960 0 R /XYZ 90 283.17 null] +>> endobj +4971 0 obj << +/D [4960 0 R /XYZ 90 244.585 null] +>> endobj +4972 0 obj << +/D [4960 0 R /XYZ 90 151.277 null] +>> endobj +4973 0 obj << +/D [4960 0 R /XYZ 90 127.772 null] +>> endobj +4959 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F21 2111 0 R /F65 376 0 R /F72 471 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5006 0 obj << +/Length 1479 +/Filter /FlateDecode +>> +stream +xÚíY[oÛ6~÷¯Ð^2 ¨i^DI ¶[»ëV k¼§¶d‹q´êâIr]ÿûR”,;²c§Îš¡}²LQ‡‡ßùυؚYØz9øe<]xÌHxÔ³Æ7–À–ïÄ)±Æ‘õÖ&׌±}él‡E^_:Ûy²º•Q^ÿOŠ°XŸ¿•,Ò8 +鼿]ÒMq€°ÀÂZòõ”Õ FÔm&\^õ!."Äo¦ü´C͌çIX–ΐrlAm™Î¥žy#odáÀ–Ù†¸‡¹MVB¿Žÿ ˆÁѨpùŒ[Ótðö=¶"eaÄD`-õ¬Ôr)ƒßĺü9Àá]¿yŽ»zy ÁWôßQʵ6ëϕ:ÅÌèõæåÀz;ä`›-èÛàµÚé;Ìñ4ÏÊʼ쑢¦=WSŠ0Ϊë«UYÉ´OÖÙ´qdK¯úwtáS+€=y®69EžK¬!aH€åõž~Ëþ–Ó*Î3gȸ°ó¹2·Ã*/ÎÁTØÅ®EœDe=¥ºã0ۑtˆ½Þ§Ó»ª%€Úõe­»~–‰L¥~¡'…Ã|[–ó<‹âlfÈ» ÁÃ$,å0‘JêG™¨ÂîÀ àf­X…H-snDðŒê“•!(ÈoI>-ë°ÁB¾×Ì@½@¯ß ѐ èq¿fÅB9Õ^;f‰óhÖK$Èð@"Q¦£À%Ò=RÎVŸC çù|UÃ[Û~1ê8„#‘jd Ôè‚vÃV€\¯ï0õ97–‚䶑í„EÇC.„Ý p^È#Y‹ÝˆÄà* @†ùˆ»†ð¯e:OÕ:^,2íÁ&@W·¡q„ס±Ìë<ŠoVÍk¶_ä)øhýü«ñŸ®zہ•!—ƒy˜'ØaÃڏ:¯‰£ý¬\Ìᬹžä‹,º†ì"žeO•â?kíxóšRBt¾b +¼5í0ë9h\äᖚÕmÜwÒÀiyãz’1•†Êœa +¯ú1¿éÑÄWy;@ÿ(UÂ,ê‘C8òmæ¬z¤pÄ|ñ°£“b|§÷œGQ.•²úƵý\SíᗠUMÀO¾ü~‘{ø<02‚Ÿ’^K~PÅÌ —yª<óŸÏLz¶HÖl» bZG”“SéÕÌYÆÕmýÇ# ¥âÞ)ùœšYa¾r;Ùw „ª$êÙwÐåv>É3ñ™¸ñ©úo“öi5êmiwŒäƒ2w%”‘/¯êõÎö›Aöä£ÈÈû¨÷FV‹¢¡^Ø=‹TKýê.–!æfʬ’î(jÊI£ä#”9=^¿UP(tü6ÍKUÛ,ÜXŽQĺõPtÖЃ@¨QêÔ'+Qï1´ê7¨^ÏOû¤Z7º ’Ǫr:ôË¥î'Ïw¸óëÇÍ/®–á¼ì9*)GÄûEïíbœ@Ô`hèRDš6æEË,*÷–Ïra-MPr¯á'yžè6á7Ûwœ oû¾asowý r±uápGHÛd;ûô¬ÓS:É6†SÜ· ÷»XCq¸ id%À+¦Âu7cÕ]j3Œkù_ yŸÄ&¿ÛöA–˜–P|Óç„> +hÛ$øÔ#^]´|v²¢„´„°À[Q· SóuZVŠ¾„Cõ ”ÂQENå…ßý^è +Äü¯Å O¼cÜB¡ßÜ°uÃÔ"Ý&ÇÕNW,÷ûâöU°èNò7ÁÍM¯‡„q´¾cçqnŒ4nŽ‹Kž©Éí/› öú¯¹e¯ÿüUÊâ{‡s»læÙ"LœÖ}?*Q²(õõ˜s±›3dw]ɆíõÎ>XÍÓïm„µ¾Nx†[o«j~>-—K4-Ñ"‹çŠ«Ñ|žŒîæ)ªØj…Üä¦-œæ…lj;LuýºiÀÿ_ϕÉç +endstream +endobj +5005 0 obj << +/Type /Page +/Contents 5006 0 R +/Resources 5004 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 5021 0 R +/Annots [ 4956 0 R 4957 0 R 4975 0 R 4976 0 R 4977 0 R 4978 0 R 4979 0 R 4980 0 R 4981 0 R 4982 0 R 4983 0 R 4984 0 R 4985 0 R 4986 0 R 4987 0 R 4988 0 R 4989 0 R 4990 0 R 4991 0 R 4992 0 R 4993 0 R 4994 0 R 4995 0 R 4996 0 R 4997 0 R 4998 0 R 4999 0 R 5000 0 R 5003 0 R ] +>> endobj +4956 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 707.957 176.332 718.861] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_8a354fa2b600043e51e8556864b69dbf) >> +>> endobj +4957 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.669 707.957 281.496 718.861] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +4975 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 660.136 176.332 671.04] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_de012d0e50f285077169741e9940f414) >> +>> endobj +4976 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.669 660.136 288.122 671.04] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +4977 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 612.316 176.332 623.22] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_46a0e4adbfa5f07c11b1cefeaeab50a9) >> +>> endobj +4978 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.669 612.316 254.906 623.22] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >> +>> endobj +4979 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 575.828 184.081 586.358] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_12f9c11414ff84c5f98e089fe1671e4b) >> +>> endobj +4980 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 502.039 229.552 512.943] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_947140ae6a3b18452b6e69dfcf3daf51) >> +>> endobj +4981 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.89 502.039 308.127 512.943] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >> +>> endobj +4982 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 465.177 196.347 476.081] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_b482b0092b8947168a9cc650e7f5a666) >> +>> endobj +4983 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [223.684 465.177 274.921 476.081] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >> +>> endobj +4984 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 428.315 220.038 439.219] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_a894183e37c6f3614ed4938d94a3a7ee) >> +>> endobj +4985 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [247.375 428.315 298.612 439.219] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >> +>> endobj +4986 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 391.454 224.003 402.357] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_a76dc794cd0a663bebbf8fc0d11d9714) >> +>> endobj +4987 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.34 391.454 302.577 402.357] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >> +>> endobj +4988 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [219.695 377.829 272.49 387.734] +/Subtype /Link +/A << /S /GoTo /D (main_Concatenating_Polyhedra) >> +>> endobj +4989 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.905 354.965 182.439 365.496] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_81788a9e6af2cd17a632e4008b4b5634) >> +>> endobj +4990 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 306.771 176.332 317.675] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >> +>> endobj +4991 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [187.071 306.771 227.878 317.675] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_ebaa837f2ff5fafb87e1e9ceaa9ccfa1) >> +>> endobj +4992 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.215 306.771 306.452 317.675] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >> +>> endobj +4993 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 269.909 167.466 280.813] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_d56183741949b698e9781549d3da5fa5) >> +>> endobj +4994 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.281 269.909 222.518 280.813] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >> +>> endobj +4995 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 191.139 180.54 202.043] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_6e1f5c74ae6b2a7fda7094889aa46300) >> +>> endobj +4996 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.877 191.139 259.114 202.043] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >> +>> endobj +4997 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.404 191.139 383.642 202.043] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >> +>> endobj +4998 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 152.285 178.239 163.189] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_c8977c97bf04a9145308585bf0f79110) >> +>> endobj +4999 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [205.576 152.285 256.813 163.189] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >> +>> endobj +5000 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [330.103 152.285 381.34 163.189] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >> +>> endobj +5003 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5007 0 obj << +/D [5005 0 R /XYZ 90 757.935 null] +>> endobj +5008 0 obj << +/D [5005 0 R /XYZ 90 725.058 null] +>> endobj +5009 0 obj << +/D [5005 0 R /XYZ 90 677.237 null] +>> endobj +5010 0 obj << +/D [5005 0 R /XYZ 90 629.417 null] +>> endobj +5011 0 obj << +/D [5005 0 R /XYZ 90 592.555 null] +>> endobj +5012 0 obj << +/D [5005 0 R /XYZ 90 517.117 null] +>> endobj +5013 0 obj << +/D [5005 0 R /XYZ 90 482.278 null] +>> endobj +5014 0 obj << +/D [5005 0 R /XYZ 90 445.416 null] +>> endobj +5015 0 obj << +/D [5005 0 R /XYZ 90 408.554 null] +>> endobj +5016 0 obj << +/D [5005 0 R /XYZ 90 371.693 null] +>> endobj +5017 0 obj << +/D [5005 0 R /XYZ 90 334.831 null] +>> endobj +5018 0 obj << +/D [5005 0 R /XYZ 90 322.089 null] +>> endobj +5019 0 obj << +/D [5005 0 R /XYZ 90 287.01 null] +>> endobj +5020 0 obj << +/D [5005 0 R /XYZ 90 210.113 null] +>> endobj +5004 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F23 340 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5030 0 obj << +/Length 1823 +/Filter /FlateDecode +>> +stream +xÚíYYoÛF~ׯ`_\ˆÖ{“+$z¹@š´nì¢n0ÒÊ&"‘*IÙQ}gÉå±2»†S´È“HŠœã›ofg±wåaïÇÉ·““SÉ<…”¤Ò»Xy +{¾$HPâ],½Ë)!ˆðãÁOώ ž†é&|vLñ4Yï¯õ2 ß¿Ž>¤aºŸÏ¿×¹N7QæúøÝÅ«“SBZ¢)æ,\H~^¾â¬N0¢¼záì¼Cሿzåe ¦ª7¾[‡Yv<£O/ŽêÍvmÔ+ž¼Õ+“`ªã<‹)Qĝüp1ùsB@ öHáá#Ÿ o±™\¾ÃÞž¿ò0b*ðn‹·6§ ~×Þùä× ô0eKQjøV…–¥F§»x‘GIœ•† Üú{3Êãªüî,ðÏIeJ~æՕÎìÃ0µqbÿÜèÍ0¹¸^Uk!U]ií‰8 `A8ævAJ…óV¡Ÿ”‰Ñ/@\Ö~Ï+Gv€ßš÷¨ø8’$Aã|¿Õq¸±–T p$r†xà‚ÂñÝÌ÷ˆœœ•°ŽÏòå|ždyªÃM)üȚgBž^ÙØ¿w\'[†y’vÀRq$«mz~×O-€‚âAí(ÆMž•¿ O>¬ÕAÒµV=HŒ0¡wÝþ ìcH41~Ù#£É¾£;Èj´ó) FIɋøPŸ"Dˆ£@ùåç¿ìòíÎ"×8ÿ˜ˆiBÈuÊíñùŒR$9…_€Š¤ÿO@߬-ûñB(õ§ÙmÁã[7ãퟎ½ß› + leÿ> ‚Óÿ|ˆpé#âHÕ ‡\!GŸž ¸…û¤Ó¶™ù@(αޖ¥Ä‡ÚEH2–Mî<"«÷÷N@‚9LÚ´6žoõ" +×Ñ_Ú$(ZÍ7œ"ÜÀº ±ì¶ÄՁt©DjµQBN™8*ÈP’ò½ÕŽ bð|­«Úù½Îi´5%­ÛA½tØñ*óöÉPcµ¿Éðîv$ +$%cmJ§EÓ¥<²É" +š¬@Œ5Yc0ëê²\þa Â&:>þ= ·ÖŽÐšsöÚV²ÆÄ(Îç¥eˤ¦ì¥!¼XÞgû ÂW­ÓU᥅FöAÜEDÐ6d¨…Ì›VT5[>Éb·ÑqöÈ +ªÑ7(Èu¦Ø Ô]@1ôJ!)‚A@¨ïõš’dmÅ=P>¢XÊY¹PÒÞI°ùü:Ì*òG"yPéâ$ÎÓÈvôôþV‡͍Ž£øªŒ¦©c÷´ÕÆ¿‚ÒYë{Åë(ÖÐpIjfâ¿xׅøê»4p’ÖÝ{¾Kã¬cÈޔ¹<Ýé¡úl\óD´²i[JKâõÞ¢~Uu÷‘Í¢e²)¯Á]NBYÿPQø§|Ö᤺¡bڕI3@]dRæ“CÁÌ&ÁiéxiWÿ¦Ò»sOó 4cOšf3ARA³O¬Ð3â6KÃæ Sá?ï\ ÓvŒüú…}§é¼ñ^»4•ÿrUäG7Ÿ€Îàê’Nøg§“»K¨nLÄޑovD5JØûe;ƒö£BÒz€a/²º³j3œ^kÝ,í;RŒw•}Vþ§ {ªµ„u…ÉĠٍ—4bÄU4òÕ s¯Ú4bþ£hþ¡‘Öº}4"ƒàþÊ÷ГìA4B¸tiD}(·î¡‘/42L#KP ڞ•Nuµy蠑ìá<žGÌܹ›GTãa82ä7õº$Cm3L4¢ÊŸr‚6í™`€­ÂÊa,FÍÁíœ\,x7+||Z£"ëÎ â¢ÍÐI¸ŒÀ‘&ø3Â(ޏÒ²Å¨ +ܝÊá0u¨ñÇÝ9ÀŸrç ôߝfn=¶ó%͚7f“c¦ …Èb W¢€ëcO°¨@’í…[ºt#J ,Ûô7ąz²‚QhÑVV‰Çä‘ÒŠÓ§˜1ýk¥–Þ+±(€QpæÛ®!iK±¦W:’:ҁ¬|8CR3t †ÂœL¾¸®äö^º<ÔKÒÃAAkòVNþí͕Ž TÛôUšlZñU²^'¦œÞ¶æ*˜®õüœz—ö¶Û5º¾vþ9zÕÕO“"¾vÌ ×¹Îóíüääöö-2´‹£mŠ¢üwr÷´ª%Åôµ›¤j¢n +¬ Cÿÿ â©Öc +endstream +endobj +5029 0 obj << +/Type /Page +/Contents 5030 0 R +/Resources 5028 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 5021 0 R +/Annots [ 5001 0 R 5002 0 R 5024 0 R 5025 0 R 5026 0 R 5033 0 R 5027 0 R ] +>> endobj +5001 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.349 658.204 226.034 669.108] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_bdd1d97c66bb40b6b396982cc6dfc182) >> +>> endobj +5002 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [317.301 658.204 368.538 669.108] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >> +>> endobj +5024 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.651 607.489 166.016 618.393] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate_e1b84de453a8ba7224dbc5e378011e9b) >> +>> endobj +5025 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.567 607.489 341.887 618.393] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >> +>> endobj +5026 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.021 607.489 513.996 618.393] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >> +>> endobj +5033 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 595.534 200.564 606.438] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >> +>> endobj +5027 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5031 0 obj << +/D [5029 0 R /XYZ 90 757.935 null] +>> endobj +5032 0 obj << +/D [5029 0 R /XYZ 90 716.221 null] +>> endobj +5034 0 obj << +/D [5029 0 R /XYZ 90 558.305 null] +>> endobj +5035 0 obj << +/D [5029 0 R /XYZ 90 507.584 null] +>> endobj +5036 0 obj << +/D [5029 0 R /XYZ 90 475.298 null] +>> endobj +4974 0 obj << +/D [5029 0 R /XYZ 90 452.986 null] +>> endobj +5037 0 obj << +/D [5029 0 R /XYZ 90 452.986 null] +>> endobj +5038 0 obj << +/D [5029 0 R /XYZ 90 389.217 null] +>> endobj +5022 0 obj << +/D [5029 0 R /XYZ 90 366.905 null] +>> endobj +5039 0 obj << +/D [5029 0 R /XYZ 90 366.905 null] +>> endobj +5023 0 obj << +/D [5029 0 R /XYZ 90 317.664 null] +>> endobj +5040 0 obj << +/D [5029 0 R /XYZ 90 303.137 null] +>> endobj +5041 0 obj << +/D [5029 0 R /XYZ 90 255.933 null] +>> endobj +5042 0 obj << +/D [5029 0 R /XYZ 90 241.405 null] +>> endobj +5043 0 obj << +/D [5029 0 R /XYZ 90 194.201 null] +>> endobj +5044 0 obj << +/D [5029 0 R /XYZ 90 179.674 null] +>> endobj +1482 0 obj << +/D [5029 0 R /XYZ 90 81.662 null] +>> endobj +5028 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F35 2018 0 R /F72 471 0 R /F65 376 0 R /F95 1788 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5057 0 obj << +/Length 1410 +/Filter /FlateDecode +>> +stream +xÚÕX[oÛ6~÷¯°‡Éh͐)JÁ0 Í¥H›µ^âbÒÂPlƪ‹+ÉñŒaÿ}G$%K²â¤AÚË:"ÏáùÎw.¶¶Þ ^OGç®cùÈw©kMî,[Â%ˆSbMæ֍M"|8"c{<$ز8˜Ž‡Ûi´]ÊyL/ÃÛ,ȶÇǧi„Étœ ‰g§óõ¬~ž¼=:'¤aR<ÂÀ¾2ð›^Ò:ÁˆÖ NÉËáˆrlŸÒmA­–þþ˜®“(Ès­m2ô©-ãURK®äT'—É DÄcÌ&¾2:8› ¾¨ÁQq„íY<¸ùŒ­9ÈßZ9¾gmÔªØbԁkd]þàހªÏ9­§Â.ÿŽ€Cô&¨p#Ä>â5ÄA¾C[˜3FkÌÛ +E%û¨?¨ÏàÎ0kã­‘ƒسFå&ôŽv0”Ža9ò8³F”!‡ùzÓdšèÎv®DMKØômÌõŸMEúß­!B&ãtH¸}_þÈjÙR&;E;ÖەœË»ü!eùzf‹JMh”œ¼x n¼ár©!Ã/a2‹ÖsÙC|î lëÄ´©  +À˜«U„–˾âÈsÝC4òbÄÈ)">kÐCÔSYaTùx*óY®Š0MT„±Ž’ñ©h¿{° ‡*CéSít }Ä´#\ÃYìµÄ¢¿jJÀ¥ƒeìà5t*Í|§"H|DzÚ>@éœJp9åHçšyÚë#C.ð¡íc;‡Ì’Ÿ=‡ê¬1ÜüK™áŽÛ0ÃÞ0S>ÓfJù­Ô’†™ò6Lôc0Ìr±€ó…~–¤CÊí^Ú×ì6Íe´Õ¢¹LR£ì¡aȨ>{#”ãì!Ê8ù~·m¶âÙJmDå„/Ì]M<‚\|&­:ü39+¦ÕA¡MxKƄ‡€øVKK\Ëk ‚nõŽšžaqïQ‡ý=‡uSñĨoÀu›Kè•Ç#¡Pƒ‹L22>ü6ù&KCÚy:[Ç2)U•è.Í áû’l£*‹¹YÈDfAMù»,«­²REš…a²Ð¢OÓH«‰¥9,â"æ@w¥ñªz¢”·W݌8Ôñf—h÷óQ¥ÆaˆxÞ® ¸OUÎuAŒ§'i¹ô¾ü‘œ}ú:ýGŸÿºÈ¥ö§±ýxàvÙzeÐ  \uXöÃvØÆ è>­Ã>š.“¡1\ì1³Hõ5¾¨¨í˜¨9TÅÙÂLÇWŠMå‚7Y8ï²Lint†¬&ïmłYšäŠU¶¬“ðëZ¶O̟•myƒ`?Qº‰#ÄSÓíö¨Â ñæó¼ÌŠÂDš±,Ø]n›»U&ÒÊØ,Jóu&ÏàY·=U™ØL‹‹d <- |㒷ù}Ô/¥ ›^™ñPꥭÑXÑ zâÁD:h²Ì²é.ÚMšu@Â{fÝQoVYxœÿ܃CqÔW³¨€70—¶_ ÆëÛ(œUo؂Ù0rå3µ ÕéBÕ(z0]d²Ž¥ +˜ì«:ÿÞzyñþ¬³Í~yxËÕ+HBnÿýÛÆ.ÞO¾qÏÉå‡ëWgÓ¾½jÁ-álA-À†¨+ —Q5÷û¬;¯,TiOÊÒd« G94—Ôk ºv¿¸`”xOý<¢>‹-\ä ƒþ*Â}Äy÷u&˜Û*ô­É }ó1—Ù¯CÎm“·É:ˆªÊͱé?yÝ/0*¿Á#‚àUÀ¸–‘´g_¬êß;Z»óBF®¿w,‹bu|t´ÙlÐ,GпV +‹#(LGûÉÐЁµ’ºÅiUKıêqíxþÿ§wú +endstream +endobj +5056 0 obj << +/Type /Page +/Contents 5057 0 R +/Resources 5055 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 5021 0 R +/Annots [ 5045 0 R 5046 0 R 5047 0 R 5048 0 R 5049 0 R 5050 0 R 5051 0 R 5054 0 R ] +>> endobj +5045 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.923 336.061 197.177 346.965] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5046 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.912 181.432 316.06 192.336] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +5047 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 126.573 160.207 137.477] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_55b76ba0041601d8da38ab5ad619eed5) >> +>> endobj +5048 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.977 126.573 192.655 137.477] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_55b76ba0041601d8da38ab5ad619eed54312979a12cae5ebb0791496e1ccce7a) >> +>> endobj +5049 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.643 126.573 217.621 137.477] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_55b76ba0041601d8da38ab5ad619eed505abaa6ff4aa204c25c94719e8a2b6f4) >> +>> endobj +5050 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [220.61 126.573 251.932 137.477] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_55b76ba0041601d8da38ab5ad619eed5b7fe867b1243e111ef4364e3ef5b5329) >> +>> endobj +5051 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.921 126.573 336.614 137.477] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_55b76ba0041601d8da38ab5ad619eed5bed2d3fff60e7c0b8fc325bf46f9725f) >> +>> endobj +5054 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5058 0 obj << +/D [5056 0 R /XYZ 90 757.935 null] +>> endobj +194 0 obj << +/D [5056 0 R /XYZ 90 733.028 null] +>> endobj +5059 0 obj << +/D [5056 0 R /XYZ 90 651.04 null] +>> endobj +5060 0 obj << +/D [5056 0 R /XYZ 90 591.531 null] +>> endobj +1483 0 obj << +/D [5056 0 R /XYZ 90 479.416 null] +>> endobj +198 0 obj << +/D [5056 0 R /XYZ 90 472.815 null] +>> endobj +5061 0 obj << +/D [5056 0 R /XYZ 90 397.277 null] +>> endobj +1484 0 obj << +/D [5056 0 R /XYZ 90 285.868 null] +>> endobj +202 0 obj << +/D [5056 0 R /XYZ 90 279.268 null] +>> endobj +5062 0 obj << +/D [5056 0 R /XYZ 90 143.644 null] +>> endobj +5055 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F21 2111 0 R /F50 339 0 R /F65 376 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5095 0 obj << +/Length 1315 +/Filter /FlateDecode +>> +stream +xÚíYKoã6¾ûWè”J@M“”¨G€¶i춋¦‰Û² A–‡¨^KINÝ__RÔÃvdÇN»‡\l=ÈáÌ÷Í gD¨Í4¨] ~F—¶©yÀ³±­ï5jŽÁHOµ;!€cˆ „úµ ð8ð¯ õ4Z<Ð)ü_ل|q~~Eʃ"åƨ_DAž«ËzO¹\&!âL{:òLãëøÓàçñàÛ … †*ˆ“ha<¸û +µ©xþIƒÀô\í±k6ŤÝ~À­Æ`@›(c®ËIÄB¥ÑgOh­èe™„K“¼R§‘7º$pI²eºÚc`7¿`LVæ(ø¬6ææj Ý ‰À®ƒfy¸x)×ÿ ÅòEý²G†¶UÆÙLHAkÊ4†8Xs…!¶% ‘XX" x–¥ ù¦£OY"xT˜„i¶VJñ2”k"„tÐ+`Ãf!A‡vlt‰—9te{❚M(§¯­$ÜÅr›1Ï"½+N‚oLVaú‰Ž]üçl»ß¤™šúÃÿÓ÷>ä9›%1M +£U×@DóÞ8O™P$¹À/}~ŽT8ςúíÌ­~WÇV‡÷ÞpÝТäIW‹ª.ºÕ†÷kïç4lór¥¯ºé8Js–ÌTTyÞÒâÈuc;]ìASÙ¯e¶±W<°\Y5Cl(¨ â=é4@Lû…a36\¨ïLäʏÅÞLî¬2ÂZ¿ïôiøì!:@Älj B„×ÝÎOÍÆ$M£íi†å~Ēc‘ð,$*-^Ò>´L-쬵 ™Ö\%Q½‡²>Ö,¸º¶ªFíSú«Pδ/—XT^æáÈäÁâË×r©²Â ¯£ó|f)KŠwF_Ëhã‰CSnü%§ï”†R§ì¢èQ8¾H齁‰´‡LÏ~ÁVäççS>—wÕmou„p]Ì&OØ(Fÿ³*Ò΂IÔ»sÏß´vª,@î’+Ó +Ë–k6 Î{8v€;Š“wòFÎÉk.@o·¼~ G™2)dÎògë×Óü±/ˆE‹wÝyQS&¼‰?Íе'ñýûf«–Ï—ÜTÝ4h +»ýZ"Ú0ó…ýOLã”/üœýK÷hh‹´"¿žË²(h~Ìƨ)bÓdž–IZ6é¾H×2@¥nÝÚ +CkàëNXéÞß+ ë—aXfŒN›Y=>ˆm8È:qì›È­’Ø1¢j%þ)(ONë-s/ç9’@vÛªåÞF·üþ]ròï6p‰uÀž~+U.—?ATíé›}\¼—ՐË?•ƒ°½vÌâ¹"%Xދ$·óŠÓM–Ä}¾g±áØZd§ªt^ ±év ò1ZÆÙ'¿8k³‚òñuß±€Û/äÅTTE”óÌ ¶Ý§d~¸½øøqyçÏÔ_.Šå¯±=u¤HãÄ;yvqŽÊm…ršœ±Âç,?ßb œg÷È<¯©ÚB rw=Q­NR…£ØÀsL·>I% ¤ÆyÜì¬×U^áq]°]7gÂê¶>V7ä”'¿aÕü|’²)Û¤[Ì¥(Ê»3 ‘Ö!ÀÒ3€!ª¨ßÒ¦\Q–ý­5W¿ *<;}‘ë¶<>Ev>=>>‚0eÂ2X1ʲhôôÈwIŠð­®í¸oQL´Å‡xW°Ê‡Àÿ?d+{Ò +endstream +endobj +5094 0 obj << +/Type /Page +/Contents 5095 0 R +/Resources 5093 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 5021 0 R +/Annots [ 5052 0 R 5053 0 R 5068 0 R 5069 0 R 5070 0 R 5071 0 R 5072 0 R 5073 0 R 5074 0 R 5075 0 R 5076 0 R 5077 0 R 5078 0 R 5079 0 R 5080 0 R 5081 0 R 5082 0 R 5083 0 R 5084 0 R 5085 0 R 5086 0 R 5087 0 R 5088 0 R 5089 0 R 5090 0 R 5092 0 R ] +>> endobj +5052 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 697.247 155.733 708.151] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_3f29f8b40d09b17eaa4cbaac069f72a0) >> +>> endobj +5053 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.07 697.247 224.893 708.151] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5068 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 658.767 163.482 669.297] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_b339ccb929a7255295ad19a5b168d5d0) >> +>> endobj +5069 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 619.539 155.733 630.443] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5070 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [166.473 619.539 207.279 630.443] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_4fb7d78e7b37d7f4b99babdc5cc84783) >> +>> endobj +5071 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [234.616 619.539 276.439 630.443] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5072 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 580.684 179.554 591.588] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +5073 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.052 580.684 250.666 591.588] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_1c884f5152f75040139ec3d9ec8ac293) >> +>> endobj +5074 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 541.83 135.579 552.734] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_55b76ba0041601d8da38ab5ad619eed5) >> +>> endobj +5075 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [136.077 541.83 155.225 552.734] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_7c502c8d46ed2f68679404fdfdf8e0bf) >> +>> endobj +5076 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 503.349 162.677 513.88] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_d8cee05f88ad5aea288c1f6b8bf7cdc7) >> +>> endobj +5077 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 464.122 160.455 475.025] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_e5902ab7e2d3304037a56ecda7fc22a4) >> +>> endobj +5078 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 425.267 168.216 436.171] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_f1827b1f7a42393a2526944530559c5a) >> +>> endobj +5079 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 386.413 201.969 397.317] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_2aba27eb7310045e1a35c7e68af01ab2) >> +>> endobj +5080 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.933 347.932 297.728 358.463] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_fceefab91d648d188e42e5a75a3a977e) >> +>> endobj +5081 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [301.544 347.932 336.732 358.463] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +5082 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.933 309.078 283.353 319.608] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_eff190ba56f86d3425859043689d499a) >> +>> endobj +5083 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 269.85 191.718 280.754] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +5084 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 269.85 288.852 280.754] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_de98f4e320d7d21e223afb83240b3800) >> +>> endobj +5085 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 230.996 191.718 241.9] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +5086 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 230.996 303.079 241.9] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_77fc44f44b1bdda486e19e30310634e2) >> +>> endobj +5087 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 192.141 201.471 203.045] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_42867df59ec40173391b76074f9f0fb2) >> +>> endobj +5088 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [228.808 192.141 270.631 203.045] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5089 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 153.287 181.845 164.191] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_13c726daa7d565ded0b177e24b6d1104) >> +>> endobj +5090 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 114.433 181.845 125.337] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_a40eabb29ea4abe082c3a2e6dc820276) >> +>> endobj +5092 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5096 0 obj << +/D [5094 0 R /XYZ 90 757.935 null] +>> endobj +5097 0 obj << +/D [5094 0 R /XYZ 90 716.221 null] +>> endobj +5098 0 obj << +/D [5094 0 R /XYZ 90 716.221 null] +>> endobj +5099 0 obj << +/D [5094 0 R /XYZ 90 677.486 null] +>> endobj +5100 0 obj << +/D [5094 0 R /XYZ 90 638.632 null] +>> endobj +5101 0 obj << +/D [5094 0 R /XYZ 90 599.778 null] +>> endobj +5102 0 obj << +/D [5094 0 R /XYZ 90 560.923 null] +>> endobj +5103 0 obj << +/D [5094 0 R /XYZ 90 522.069 null] +>> endobj +5104 0 obj << +/D [5094 0 R /XYZ 90 483.215 null] +>> endobj +5105 0 obj << +/D [5094 0 R /XYZ 90 444.361 null] +>> endobj +5106 0 obj << +/D [5094 0 R /XYZ 90 405.506 null] +>> endobj +5107 0 obj << +/D [5094 0 R /XYZ 90 288.943 null] +>> endobj +5108 0 obj << +/D [5094 0 R /XYZ 90 250.089 null] +>> endobj +5109 0 obj << +/D [5094 0 R /XYZ 90 172.38 null] +>> endobj +5110 0 obj << +/D [5094 0 R /XYZ 90 133.526 null] +>> endobj +5093 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F23 340 0 R /F99 2117 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5145 0 obj << +/Length 1505 +/Filter /FlateDecode +>> +stream +xÚÕY[sÚ8~çWø)‹g‚dËÆLû°›i:½Íf›ìSÛa[O}[ٔÒ_¿G’í@bˆiaÛ}`øèè\¾s“±ugaëåà›ÁøÒs¬õ¬›¹`Ë÷b”X7‘õaH"¾="ãá•MðË”Ï®lŠ‡y²^ˆHòÙÛøVr¹žN_ŠLH^åÒQ†‡ /K³|/æBÚd2Y(€Ð`H×þtózðâfðπ€@Ø"Zæ#ßaV˜>|ÂVÿ¿¶0r‚‰µÒT©åR¾ëzð××ÊàM¥ÞPŠ`¹ÎÄò©ƒ°ÇŒf)eúøfŸõaÄ@Ë/Z·8ªŸ)™ä]-Ü{M¥*dœU·«1Ãð!Fï0ÏÊm²æ{|éSk"z®‘Rä¹Ô®k$¼Rg”j÷ø26‰]D`…kE0v ¨vOä"Ošj׌¶Ouïµ4y—QÒr)«h: …”¬F^ËjYÆÙ]7Jç“†*/j´ '›Âƒ£œ !|ö¬ã@°” ©IP§‘…‡…Í8ða᠀ìÇÃmž'û±ÀË0ŽgIΣ]€Ð†‹ËJ +ž`œ•$߉Œ·p–Š, çÒvÙ0O»à â:­ó:lqF[žŽ¿__¼z¥–t(mÇŠÂ|•"«xç5™Ò‹×BFˆhŠÈüs»Þc3àll-Ó¢µOöÑñô¬Ž `ô8‚4ä›Ç<‹Œ¨¥è B? þbeäx¹˜€'0 +XP- s-uˆOÖ6cőCTÊ«–2+;NóýÍð­äRì +Í6T⹁M¹ CQ–óerÞ¥ÆÒ[«Çœ'e'ç`ÑÆ`µr!a‡ÆÈ÷ّ‚èÏ7'Φ ªÔþ¹.IIy’˜X¢~’Ù.Ô.c®ò¯¡2Ь½añ‹©ˆ4Y-W‹õ+CåJ×äb—ívîÞ×ꎭgëÉN×+^t–-† ŽU¶ÚØXÅÕ¢ƒñ‘׶îªXșì/z£! ê×Ä©ÌÊmUR 0®–·I³~'Ò[QwB—Ë,T™³Ü:æa—bš ’§š”ÒºÝÞIžÄ™Ø£ÍÀÛ±ý-lçröâk!!A©*х+ñ#¸j2êv´j¹õ*¯#:ŠM°j“w!Shp[lˆïÂÆ®'FŒ‘^1~/J¾þ?:Qªò¢èGŒ&"?RàB‚ڏ?èHÑC©È‹¼cÀðéãJµÿIW*¢3ñüÝtúMȼ)¼çöÈ‹\ÌmÊTÒ¦a àl¤ø¥]H²¡#bM?Ã㪄9AÉ8“jð3CŸvéóǜòL4§õŠøN`3š^uõb¢t/„ ŒPÚŒ;+–ï´ýTt\Ê!;J2!Äg‡€PӇI^.¥˜u¢QSô€£¦{šª wàî1°~-$Snt‘OA“`‚Ø=²va“ü,lºD'Æ£$H“îS‘)‡Ïªu!ú•»”•ŬݽwŒ8jтÃãtYôZ +{[‘Ú¹= +¼.;šñ×Œ0ì&ß3¨õŸ:ʍf¶ßgqó$þ&NaøW-÷ÇáÄËò²ƒÊ"ÙÉìp©îWâì'[¢G¹¬Ü¿W¥yÇÝÕætqœËø.ζ{Ïö!¥ï¶FmTód3âuJ…‰bkòô6¯9ßÈà ¾¯=£,4Áõ=îÈÍPZÔ ±Auè üpJÐÿ©›÷6Gt÷y‡›«œ}õøüÄØ ®°ÏžÂ;66¾cñÔt3éûŠ¥y¥âÐ/˜÷D,€A·¶ôMc’+]ÉdZùªyId×ó¥~Sd~ü] +ù›º0­ýòŽgËÆ~Êó_+!ï )F#ªQ_±^‹&ÙÍ>[ÍêÍ@7B÷ò’‰Üöñ‹ª*¦ãñjµBa‰–Y\HWã¢HƏ¯h6¸ºü–ɼyѕ沽:„?S}K¾í°ÿ¿â|ž± +endstream +endobj +5144 0 obj << +/Type /Page +/Contents 5145 0 R +/Resources 5143 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 5021 0 R +/Annots [ 5091 0 R 5114 0 R 5115 0 R 5116 0 R 5117 0 R 5118 0 R 5119 0 R 5120 0 R 5121 0 R 5122 0 R 5123 0 R 5124 0 R 5125 0 R 5126 0 R 5127 0 R 5128 0 R 5129 0 R 5130 0 R 5131 0 R 5132 0 R 5133 0 R 5134 0 R 5135 0 R 5136 0 R 5137 0 R 5138 0 R 5139 0 R 5142 0 R ] +>> endobj +5091 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 719.912 154.727 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_de2531310fd7806c9e4f745cab145926) >> +>> endobj +5114 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 681.432 176.505 691.962] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_bc8ae851f2a0a6260d954b3bd8505249) >> +>> endobj +5115 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.408 666.437 450.955 676.342] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_a40eabb29ea4abe082c3a2e6dc820276) >> +>> endobj +5116 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 631.618 150.493 642.149] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_f1bf8c762c6f36b30f2abcaffe591acb) >> +>> endobj +5117 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 592.39 156.281 603.294] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_775a8cec41b0fcc88689a171f5be8546) >> +>> endobj +5118 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.097 592.39 201.92 603.294] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5119 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 511.628 179.254 522.532] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5120 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.752 511.628 196.689 522.532] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_584f3fd5a19536644a66818169b16ac6) >> +>> endobj +5121 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [224.026 511.628 301.275 522.532] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +5122 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 472.774 179.254 483.678] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5123 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.752 472.774 194.467 483.678] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_b36bf020da4fb4583e6e1a6b94197cb4) >> +>> endobj +5124 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [221.804 472.774 299.054 483.678] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +5125 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.434 433.919 183.257 444.823] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5126 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [187.758 433.919 210.233 444.823] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_6b8dae6436867a53e27720ee211f1cc7) >> +>> endobj +5127 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [245.576 433.919 322.825 444.823] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +5128 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.647 383.11 188.47 394.014] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5129 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.183 383.11 254.412 394.014] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_5c56451d80b8c02636854053de9e0440) >> +>> endobj +5130 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [300.18 383.11 377.43 394.014] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +5131 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 332.3 203.075 343.204] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +5132 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.573 332.3 296.324 343.204] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_d593d3aa49a632911d8d49c83b3f4985) >> +>> endobj +5133 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.005 317.68 316.216 327.585] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5134 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.437 293.82 194.297 304.35] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_3bc88b2886b0b86865186d142e5ee414) >> +>> endobj +5135 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.437 254.965 188.759 265.496] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_ebb212a14f52ed934059925c1f5f2010) >> +>> endobj +5136 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.953 215.738 202.776 226.641] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5137 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [213.515 215.738 278.601 226.641] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_600c942b0a2e94b550ccd84ef9c30928) >> +>> endobj +5138 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.953 176.883 202.776 187.787] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5139 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [213.515 176.883 312.354 187.787] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_6804f93015ae6e1dc0c2e42e726380c4) >> +>> endobj +5142 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5146 0 obj << +/D [5144 0 R /XYZ 90 757.935 null] +>> endobj +5147 0 obj << +/D [5144 0 R /XYZ 90 733.028 null] +>> endobj +5148 0 obj << +/D [5144 0 R /XYZ 90 700.151 null] +>> endobj +5149 0 obj << +/D [5144 0 R /XYZ 90 650.338 null] +>> endobj +5150 0 obj << +/D [5144 0 R /XYZ 90 611.484 null] +>> endobj +5151 0 obj << +/D [5144 0 R /XYZ 90 530.602 null] +>> endobj +5152 0 obj << +/D [5144 0 R /XYZ 90 351.394 null] +>> endobj +5153 0 obj << +/D [5144 0 R /XYZ 90 312.539 null] +>> endobj +5154 0 obj << +/D [5144 0 R /XYZ 90 273.685 null] +>> endobj +5155 0 obj << +/D [5144 0 R /XYZ 90 234.831 null] +>> endobj +5157 0 obj << +/D [5144 0 R /XYZ 90 195.977 null] +>> endobj +5143 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R /F98 2120 0 R /F102 5156 0 R /F34 2406 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5206 0 obj << +/Length 1500 +/Filter /FlateDecode +>> +stream +xÚíšKsÛ6€ïúì%%g"O‚Ð8=4M2“¦iꨧ4£¡%ØæD"’²¬þú.I”lš”*?4LIÀîb4°uiaë]ï×aïä­Ë,…”K]kxa)lI— A‰5œX_lB‘NŸ`ŒíOÁ¶ÏüÑ'‡b;š®®ô$öG‚ó؏WƒÁ;êØO£ØéSí×S?IŠÇ3}¡c‡x¶ÇÄ1E•M”p¾ß÷Þ {ß{ ÂÉ I&¬ñ¬÷å+¶&ðý{ #¦÷þêáÖÅP†°+ŠÅœé©ŸêIaÒÛE8Nƒ(L2NÞ +¼6[}Ê㪘÷øc”êbbzå§å“N̗~lÂÈü8Ó³sm–×sŠæŽNñáïDÇ?;BØIõvváO뷶י('AdŽ0°a”—8rú €ÿY—^.VöÍ*Ÿ~ïå)_ÛK<8ÐÖÙq•¦óÁÉÉr¹Dã-Â`£ =™Ï§'wÓfM +DCVB.Ê÷ʳ¨¼L„ðåÌÏ®ÎmÆüÿìaÒº +endstream +endobj +5205 0 obj << +/Type /Page +/Contents 5206 0 R +/Resources 5204 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 5021 0 R +/Annots [ 5140 0 R 5141 0 R 5162 0 R 5163 0 R 5164 0 R 5165 0 R 5166 0 R 5167 0 R 5168 0 R 5169 0 R 5170 0 R 5171 0 R 5172 0 R 5173 0 R 5174 0 R 5175 0 R 5176 0 R 5177 0 R 5178 0 R 5179 0 R 5180 0 R 5181 0 R 5182 0 R 5183 0 R 5184 0 R 5185 0 R 5186 0 R 5187 0 R 5188 0 R 5189 0 R 5190 0 R 5191 0 R 5192 0 R 5193 0 R 5194 0 R 5195 0 R 5196 0 R 5197 0 R 5198 0 R 5199 0 R 5200 0 R 5201 0 R 5202 0 R 5203 0 R ] +>> endobj +5140 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.349 669.969 226.034 680.873] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_303b4ed4262469c1834228e0f88dba74) >> +>> endobj +5141 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.176 669.969 362.999 680.873] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5162 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 631.114 156.281 642.018] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_10cab5245f80aacd8000d0312730ec03) >> +>> endobj +5163 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.097 631.114 313.002 642.018] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5164 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [331.214 631.114 484.119 642.018] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5165 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 592.26 180.54 603.164] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_d7552a414d66f92897d12767579fa3ca) >> +>> endobj +5166 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.877 592.26 249.7 603.164] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5167 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [291.433 592.26 333.256 603.164] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5168 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 553.406 178.239 564.31] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_0c26ae11a4146369ff86288347cc54db) >> +>> endobj +5169 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [205.576 553.406 247.398 564.31] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5170 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [289.132 553.406 330.954 564.31] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5171 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.625 502.596 245.522 513.5] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_e6206985cd5536c4dac181de5fb21247) >> +>> endobj +5172 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [250.848 502.596 325.229 513.5] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +5173 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 490.641 155.733 501.545] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5174 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.466 490.641 239.289 501.545] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5175 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.853 490.641 316.409 501.545] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +5176 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.625 439.832 245.522 450.736] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_5363ddeed325652ee6c064a8936cfe57) >> +>> endobj +5177 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [250.848 439.832 325.229 450.736] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +5178 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 427.877 155.733 438.78] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5179 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.793 427.877 238.616 438.78] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5180 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.747 427.877 315.303 438.78] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +5181 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.92 377.067 243.605 387.971] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_a98511973ca14e8904e4e2c1f774bd3a) >> +>> endobj +5182 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [249.226 377.067 323.607 387.971] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +5183 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 365.112 155.733 376.016] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5184 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.466 365.112 239.289 376.016] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5185 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.853 365.112 316.409 376.016] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +5186 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.92 314.302 243.605 325.206] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_f4abff14e1b88cbb929f0733432477ff) >> +>> endobj +5187 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [249.226 314.302 323.607 325.206] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +5188 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 302.347 155.733 313.251] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5189 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.793 302.347 238.616 313.251] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5190 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.747 302.347 315.303 313.251] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +5191 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [136.138 251.538 242.189 262.442] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_0fb144e5f3fb6815e4c28c89883607be) >> +>> endobj +5192 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [248.028 251.538 322.409 262.442] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +5193 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 239.583 155.733 250.487] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5194 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.466 239.583 239.289 250.487] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5195 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.853 239.583 316.409 250.487] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +5196 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [136.138 188.773 242.189 199.677] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_e67eb83f2626818420b3201db09e3d58) >> +>> endobj +5197 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [248.028 188.773 322.409 199.677] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +5198 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 176.818 155.733 187.722] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5199 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.793 176.818 238.616 187.722] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5200 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.747 176.818 315.303 187.722] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +5201 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.349 137.964 226.034 148.868] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_75190def344d4c1ba6c59a6f0fcf7420) >> +>> endobj +5202 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.176 137.964 388.214 148.868] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_55b76ba0041601d8da38ab5ad619eed5) >> +>> endobj +5203 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5207 0 obj << +/D [5205 0 R /XYZ 90 757.935 null] +>> endobj +5208 0 obj << +/D [5205 0 R /XYZ 90 716.221 null] +>> endobj +5204 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F11 418 0 R /F72 471 0 R /F65 376 0 R /F35 2018 0 R /F98 2120 0 R /F38 342 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5225 0 obj << +/Length 2685 +/Filter /FlateDecode +>> +stream +xÚÕZݓ۶¿¿‚o¦Z Hž'IÇmêf®öµ}°3OâØH¤BRÖÉ}w±¿Ä“u™ú!/\.»¿ý‚Ž{÷÷^_|wsqùƒ–^ÂhïæÎK¸iÁT ¼›¥÷Þ‚‰h6œsÿz&¸ŸV›ôãõ,à~¹>¬²e•~|“ßViu¸ºzY•6e5›Šû/×i]Óômv—U3ûY±È€L‚ĉžý|óãÅ«›‹ß.Ä=aP‹¤ò›‹÷?so ë?zœÉ$öö†jㅁ„qí½»øç?y˜@2®Uï0LØã|Ÿ5i¾Î–$á÷Y½¨òm“— +uùƒâ=Nܛ!“aBŒ¾¥oÖy‘=§i•fZùöi[æECS§ŒÅº¬wUÖ{Ïpä 2é ´œ ûÙí³…cqGc³Ê/T,ªŽtVÝ[å½}}á½7$)ˆŒTd_æÖ*e‘=²Ã]¹^—³@ùû¼¸¿òš…2…DLʼný!Ôx':N;E‘V£¸§U°XD@ox¬‰¢O ™4†6ï¿^QìàŠ¥=RæI„£MínÀ!‰@X P,ДÍÂÄÂaŠMÈBx=¢€ùW8h"7¼ E»™à½Ý@9!ngq%d,d XÞ +ýPy,·fAÐêHëèHbP8f#Y)ø«…%»™€¹f"VÞ¼GõbhÕ¹ëK<ÉúèÆçLÈö`ÕñÁbØèl|u–ñÕÍøB?Éö '¬ÖÕîdÛ)ëG*|Üú}u âhЏո–Ä s£)l9K’¨‡€aò:aB†žæœÅ@~"Å,m +2©g(S¹ §’ÅÎ8Ë ÌELF!˜&”úÌM€M2 "ÃIÅðôÉÉÓ;@Cª8:d_ +”0äPƒ€µ³4i/IÂ: 8€v›Òa*"0ÞÝÓá×õ¨4Ò<Á Ž³ÿ„Oø´HœrǍXOö‰ð¤OB…~Ü'’ÊAå©H²àtUöŸ@l(pz¥ô<þÚ>¡Îð q–OÄ_ö }Ê'$ô, ~Ù'$D(hJ‡¿×'Âs|BûV®`Q]a¿Êªlª†ˆÐÂ{ªÊŽYµYÜ©mMºÌ7YQc}>]³ÖÛta§i±|î +Ùªçtuûú1·¬ŸOI®ÓQ‹‚%yÞ_&´›|Ì%ÆàˆPDÁ‰#bÍý)¯Aj¥|6ˆ(£æf.,ãH7êLŠ²q¥½UW“U›¼(×åýañ#Ö!áOÀ¼°¤¬Å¿5²*hLê¬ú4ʧÎIù¹ÙAûï a±ÝÓc}‰‚Fp[euV4)Ò:žw4¾„¯Cîwüó@œ¯]«9Š°ÔniÔQA{j'‹´Îjz €,,%É +;Vˬ²—´T¡dó¶'ptë9(.ÒÄÍc@ +ÉãZÅ opr¥Úy=>ßµ=»Z,âkqù÷ýF:öëCÝd›‰½O ˆµ€{}ŒÈ„…AÜOIp¢ˆV²-¹Þؘûv6\ü½†ïcWø¾œ¨F!èÑKp§§ˆciÐ,šûûŒZdªÈZ%ƒ-Ö»eæFz‚xyc_×Y3q,Ø®²&U'Í":É2㉉¸k؋ ¡@Ä[CAþ “/X^„mOӬ҆X§.`BlèiJ˜²Ç̲™âɇ·4$oÕä ƒýO Jè;\ԆâGy ¿¿–ÈpoS@Iã-ÞÞíòµÝŖ¨]Ìüwä‡Wéb5›‡¼ó°Íh†qÇ^8 eblƒËNŽÆ>hL·ÛõÁÂp[Yf‹²‚̱-‹eûînWPÊ1O]XƒZ«ÏMtØúuw58(­»@x>Áʭ½Ñªò±”g3éµÃB¸jٔÕŸ9œP~ÆCðØjæãcŒÁ¡Ðlýð<—:4¸À1ÅA ¥-ð0ecáÑZBþ¨\7†ÀOR¢^敭ÌcnGcBœ˜ + ÒG·¨\ÙFßC…G)xn…Љ­ÚL3fb+«Ø_f&EPVIü´|–t5c<,/vHÆøÃwNS8j +c¦Ôþ"˜¨)†ä(Vct@Aã„\5îä§Õ”ûg…ÕzUîŒ/ë[K¹*7%’•;˝#-pÓQ,`×&5^cuHëû|&üõšˆdÖ|>Ikùý|*r뗈)8zdÿ11^Bô±g °ˆ.âÜÄmɓ®ï(mQR˦4wóéšè_–Ùæd½ÈMf1ü̏ ÷»M»²pßãYðKR²!vBLgQn6®¾fe¦nx™Sµ>áƜµ…u!‰ðS£ÙÄeXYŒRA¹X쪊 d¦ôé·­J´æ§|i0“ððv¯xN— ´Èù)g‡¡É?¡ézG9i®c¦àˆ}´T³rmËPÙýÄ0}´;èXj Û·þÍö&¤•G %:R +@Ìì.ùh×´®A–¥c•Ú×t¸*OoñËã`ƒ¾óa– +úåèT`Çˀ¶¢:L·¶º…¢þ˜‡€þ¸Ûå󙸾u㸍q}ÖW“Ö0ÛCʊ¸hëdìr1­‡mæÿm7›k¨ +0ŒpôòÎg€Öý¼6¤= ­8¢ §h?#mÐÒ>Z‥‚(¤ßâ´íx_&,ðžZ¶Üœ@Ü¢\f£Š©”L¦–03S¶Ú¾êúàq‡C»ÖÝ#bÍñV)ªâS«£Þ¥K—@ïE ·ìKNl7ð ó+¡ßT*¶÷4"kMÃ7ö †P{ Ç¹Eêàés ф_¥ñº¢¢‹`x+"¡šÁ'7™Ó[ +Φ|Ç<U/?ãÎÑe!cQ°<ërœ›š³ÂO³ªl$w÷—ý”¸ÈLeôU `"ˆ—àE£Àß5¥û9æOæEÈ"pÞÞòÃq,ÿ—h‡3ÿÉÃ܄«þM8°P‰ñÿa ¿F¥à©ØÇÞE<ÚÿU¡‡ÕYõ /Z­^ÿ‘»Ô–"xjÛ~wwΜ Î[åbéø.Ëì!éd¿znöwR}ï™oìÛ·jšíÕåå~¿g‹šíŠ|[±¼¹„Þ÷ò8‡õ¸@$í.Û¢ÌÞ´ Xܘë6Öÿÿ°ã– +endstream +endobj +5224 0 obj << +/Type /Page +/Contents 5225 0 R +/Resources 5223 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 5228 0 R +/Annots [ 5220 0 R 5221 0 R 5222 0 R ] +>> endobj +5220 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.82 677.939 219.642 688.843] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5221 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [201.41 494.399 353.665 525.368] +/Subtype /Link +/A << /S /GoTo /D (main_representation) >> +>> endobj +5222 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5226 0 obj << +/D [5224 0 R /XYZ 90 757.935 null] +>> endobj +5227 0 obj << +/D [5224 0 R /XYZ 90 733.028 null] +>> endobj +5223 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F78 539 0 R /F8 504 0 R /F11 418 0 R /F7 505 0 R /F10 473 0 R /F13 540 0 R /F6 538 0 R /F9 568 0 R /F12 622 0 R /F23 340 0 R /F72 471 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5232 0 obj << +/Length 2268 +/Filter /FlateDecode +>> +stream +xÚ½ZY“ã¶~Ÿ_Á·PɃ“ Ǖ‡ÄåuÙ¹6Þɓ횢$j‡eŠÔ’Tfå_Ÿ¤Š:ff³/ˆ£F}’4øÐàû›¿>Üܽ‹D$âQð°èˆÅYð° +~#LÏæŒR¾Ÿ1¦õ&}|?ã4¬ŠýS¶ªÓÇ¿ç‹:­÷÷÷ßgeV§mUÏæ\ÑðÛ"mlþ”­³zÆâ0+— OB–èÙ¯?Þ|÷póé†ÁhÀì”&Z¨`¹¹ùùW¬ ÿǀ‘ÄÁ³µ $ð_nþ}C3ô$SqB(•æa‘Dƾûœn¶E†Çãö»wŠV³˜hšs]Jáê‡'·r]E5ã*|Îˏص¬Vnpa®i—+w )þÕéÏyû„­¶£×¤×Zåu¶lóªtk›ÑÌ"/]+wS<–ؽÇӁ·Hš$š2+n¢àynXŒœÄBŒ@èîïÏî)ÝÿBýŒOsüÛ{O¿ÃöÙ|ts·g„+Ž›ýÅpÅy˜»äË´±-7\c—a¸¹5m>?e%ö6Ûl™¯÷xû0=Ån¼cbU6mZ¶®;«7ت֣‰fŸ´Fjٌ©ðó¶Îš%18kY9Zu—ø¯ù,ópÛsPž1iÑT·N”N^H|™mRÎ{)׈*×ïø5#õ¾GZ[p6 ³u]mFà©êüc{·é2##•ðjÞé—$‰Å„F‰¯£Qý™·U¢µ Óñp+)‰RNawÙâ”á 8‹’Ý8Àœë84g8•±!µ„Í»Éß“Dò¸§Ì}±k p£JŽ© ¥1ž8VQ HÄ"ww8‡{6®–óÁ,Ž³Äð8 ‘ ·ÝOÇ[iÂo+1¡Øpæ(ñ¶ºÊö€!P$ú¬ùÙzæÇJ¹N^‰O0gàœ]ÿ£‘DÇ<t;‹õ'ü³’ ¸ ;±X ï½ÅüâboçÓöiN˜ê,"éÁÁdk£kðN:²è´yѦ`´œú/œÚ¡¸ \_ÈWœÖç‰ëc JJ¹ TÓ¨.^ $†¨Às)òM^¤u±ŸE*¼¶{ˆs5TNÄXqGú$AèÿY•`zäiґ¬WÙ/”ò^Ø!gMd.ôªºØàȸO À:VúÕ €ÈP’XG“°ÀKÓà@UdKcŸgÌxIæÐhmèkmq&¹>ØënpÂÐýىÕÆíbÐ ó¬ùÿhC5è4BÂòG‹ëA¦y5÷jM.þÓj+snuªªWy™¶Y^HÐ(|gèZa8·U±¥Q;.;pŸ1/,¢6\u˜ý4UPQ‡TjPP™rȒˆü)=¦¦‰>è»TQ¹?&ÀAz·¤N¸º¦#ÞzþÖ𷞀}ª»C©Ë™pÌÕD*,4*#@Ôs^v`Äzäb¬Í!ÜZ¸yQ Dž5¯Ÿ¦Íëœ)g`ÅX¿¼d%\٠©䪊רhÅËùUe+gc=md»xhdX{ŽØ_Gͯu|øê5ò˕jv¦P­.`̏¿¾-ªfg".£ƒ9—&Èv>,e„ïgdK3K{в–­ÓK û¹Ô^Ýor‹àÂôHXÚ°‚“ßЏà6y=:ÊŸí;z·4hxGÑ4ÆOÀ¹~¾d:ø‰a´ìïã\>b¦÷&n9eæãX¼¤ +ÏÞZ…¿dpõÕUxuÞ^ +/|m‰B ·:_:T} +6U’Yì¯ %…ñÍü¬­[z¶Î!áq\¤`sâ7E”/(ù ÃÑӕ5Î "f̯š 4£ UnӺ͗»"uî&Œ`êÐOM0rQciâǽ Ø̲ƒF%]¹ÄñâE՗KÌР\bF\¹„G m +ÌpuäÄD°Ø€`b|À)Ã0ô£_ÈQvp¹6{?‚וYühŸ£lþ4ݞ·ñ +¨5‹¯ý>Á~ :è3Pæõ‡½òyo$b>°pÝøè>³À‡ÿ4Yý‡™R¡Sò¤å.-°m˜pUÞ¦÷›”­)sÖýC–9&‘³ß‚®õ7æá¼,ÖDÐÞ`>µíöþîîùù™,²+ómMòön»-îŽé€ +Dû‡—§}ö½©êþ;èܤèF÷ÿ?D„ +endstream +endobj +5231 0 obj << +/Type /Page +/Contents 5232 0 R +/Resources 5230 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 5228 0 R +/Annots [ 5229 0 R ] +>> endobj +5229 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5233 0 obj << +/D [5231 0 R /XYZ 90 757.935 null] +>> endobj +5230 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R /F78 539 0 R /F8 504 0 R /F11 418 0 R /F7 505 0 R /F23 340 0 R /F31 472 0 R /F75 541 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5240 0 obj << +/Length 2267 +/Filter /FlateDecode +>> +stream +xÚ¥YmsÛ6þî_Áé‡u©`|—››iS'—6msŽ{77iÆCKÄ)Eª$eǽ¹ÿ~»X€")Z–¯Ÿ@‚‹Å¾<»X,¹³r¸óæìÛë³óסç$, eè\/„;Q(X …s½p>ºB0M¦‚sî¦Õ&½y?‘Ü-ó‡µZTéÍ»ì¶J«‡Ùì*T•6e5™Ê€»¯ò´®éñJ-U5±«Š¹v^"W$ñäÓõ÷g—×g¿Ÿ ˆ;B D,òg¾9ûø‰; ˜ÿÞáÌKbç^Sm_z0æ·³œq£ T©8aœûN$C&BŸû{‰ÚܓxMIcVÔ[5oè%¥aÕ*…²ÚMÎ_¼³ƒˆYÄg*`*h‡j"÷n"äÀMDîF5ërQÓKZ)zØV%’Ýe µ -Œ +ç?§›¬0¤) «Ž©q¶Xté›*ÕZà—Üìܬ pAÙî“˲ÚL„›6YYÌ`2ñݬ1ÖÛÜzƒÎS€B«Û"Û¨¢†_Ã5ÆÑÍÃVói‘pjmfîÐi¾3¯år°6+-þJÍKµÄ5¿r.ç™*šš œÐsóÔzAJ +ãçK0Þ67[†Ïõá5ÊîyÜ]–y^¢,÷Y±Â)á¢éc½¦O5}0oô-kh2«é}[Öuv››•èfüšÎçª6*¯i¶†½,å-h¨ÐëAà²É4„ûv‰Zƒ­‚Ž²^â1ϓ`­çJMÏ SKÔs=*"ãX1è–ʂ3ëӝ6~š—eµÈŠ´Q5q»ÖFsKaø•œˆ„èŠÉâÈ·4)DNȒȋñ{Àd|ÌOŒ¿Ç¸ø̧Ct)(ŒÜ! ‘.hÒl&xg71Ÿ½í +CæuÈ|–È`¯ç‡r‡LÊȒˆCëH ö‡lÈ< Ýâučô✹§Â M"÷^Y?uSíæƍ¯8Ÿ—õN§(˜%?IÈ0’´@’#ŸÅ-Ôú(‰£dêû +û<–à °„ä½à°,cÝIŽ2IbqnƒžånĄ<(ö®9%IJC& ýª/ÀgRºbÇ/ˆéXĽ{!tèƒlT&OD§+®'‹±í<à½ýþDĆÇ#¶'ñŸ Ø °ýc¯süN¼¹ ãÏ`7´nŒ)à28 B(ÞÐû+Á²úFG2¾¢ˆZLMð}ÎC´A…4Myfïy¹kˆâë¯iüâ=å||^‰™™ìÓ¬Dÿ]‹üÂVÈÝäµwPؤÕÍåçm †¼Gk$Ybµcui+*9p>£á¥éúå¦%µJ_òé”þF¿hً¡1Œ¸f£/÷‚˜M_ÐÐF†BðQŒ{ípíLƒ xº/3}®#ϦU–B‘ ù·nÂÅC!|Û&dS`ŸA‰Ý3m§rצ“=Kšƒ`õUkâEv—ÕeÕÅӘŸGPôÊ/ø¶í@J>)ù¤¦‡¨ýïˆ *¯Õé šÄË‹Ò,H; +°/qXYA)d¬+ÖŽF[kV +0®LM½´÷¨¶€nÏà§RQ°›QçeGzô¡$”qÈÓTé PÐy;ӟ‰‰¤‡^0x´ÄcÜKNáõ‡•lQt`·0b^$û†»7æ¹Ç]¹Ëͽ£¼mÒ¬˜pPÇkº]³Ý5³ÿÓ®c¹pk¢ÁX3„üïŸd€ozÆüö1cƧðz…F<—mæ€ + +ÄD÷OÆà| ‹ààØ¤5\LZ.=–ÀIÂê¾òÉ~õ)‹º (,ƒðû×Z!X¼Ðà¨ú‚Y³¦'4„Ɇtr⤶[Që%î­¢É9\œ^t²À}­Ç¯e±ÜՆ”ÀIdú”^„;ªd·.âP{ž-CôPĝ;ᡲ¨õ튽&ÃM5D<âÞëÛ£‚&Oör@Z™©ŒB²(iÉZžÐ1YÛ^AeÔﻌº&ºU ¯¹:F‹üÁ9¹©Ó Z‚ÇP¿³ÐRº­Í¦Ôy0ÁÌ §×VˆYrŽ' Ž;}1&MgìGµ¹µM‹Ëb·ÁLKž„‰ïÊ9ÌMÚÚŽ%8ƒ=È ]^Ln +8ÐÒÓ;n³Ùõ$ò],…͏͛ˆ…Òï45ú­­¶ws¼ÁÂY’„ƒþŠQDx$ƒ&Ý뢌²7Lܽ{ûÓ屶 X]F-ä“ÝzÐ4ír(+‡ªô䘶P4³§ùÕ7“ˆ»ÿ>& ¶ùLiªôaîq çž@ï~ûÓõQãÀÙÄãgŠC¥Êqë_ƞï~þðËÕå͓BŐU½ð™Bí› = A8q¸¯#&°˜¹R6õ0ªÔÂ6HØD®V¦›|õæÌùhC)0¡4FU¶¸y3Úèµ·¯A(ð±tà¤ƒ×»bþì\൹`ÐRÏ©lS6nèµsÒmvs—ÂO_’øý0„kDâµ +5¢!ö8¼Nï@Œ5‹e ³å3E\JÎ?¿ hö³Ò•jvUQ2÷^a›ÔY¥æÖ|òølߘK…Ôr-E˜äL±Çvï×eÕ¬Û&ö²…Å#øGÏÓ䳪ø¸7ɓ_šãÑúáž'¥l϶Äçj‹¬OJÙبý¶xÝ,f3ˆ8Ÿ»wi±“V+ëci!ۋdŸ*ªÃ¥p¶aŸGò<<¬ËM‰)£ÜÕ4±M«†žÊ±Ž6v?b_s~ ¨k *…Æş +ƒË*[eE»Sÿ#ýΙS@»î0ô=0üÆ w|êß,ý÷*èö°€E€•ûðôn3šyµiÍBHç6zù¥VÕ_𗀠¯Ób§ÿH™Db~RísÄ'Ä¢Q±öA)£$iö›cŸ~ KÒ^^Gº^²ýÞ¦ÙÎÎÏïïïÙ¼f»"ÛV,kηÛüü-.úè±LÚ»ð¦´gý¹Ò‰ôÀþÿ8Û +endstream +endobj +5239 0 obj << +/Type /Page +/Contents 5240 0 R +/Resources 5238 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 5228 0 R +/Annots [ 5234 0 R 5235 0 R 5236 0 R 5237 0 R ] +>> endobj +5234 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [164.828 229.186 340.976 240.09] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_10e7c95784e356487a6a6263a89cec66) >> +>> endobj +5235 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.558 137.94 188.38 148.844] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5236 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.878 137.94 371.262 148.844] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_584f3fd5a19536644a66818169b16ac6) >> +>> endobj +5237 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5241 0 obj << +/D [5239 0 R /XYZ 90 757.935 null] +>> endobj +5242 0 obj << +/D [5239 0 R /XYZ 90 399.175 null] +>> endobj +5063 0 obj << +/D [5239 0 R /XYZ 90 376.863 null] +>> endobj +5243 0 obj << +/D [5239 0 R /XYZ 90 376.863 null] +>> endobj +5064 0 obj << +/D [5239 0 R /XYZ 107.713 301.068 null] +>> endobj +5065 0 obj << +/D [5239 0 R /XYZ 107.713 286.342 null] +>> endobj +5066 0 obj << +/D [5239 0 R /XYZ 107.713 271.616 null] +>> endobj +5067 0 obj << +/D [5239 0 R /XYZ 107.713 256.891 null] +>> endobj +5244 0 obj << +/D [5239 0 R /XYZ 90 216.159 null] +>> endobj +5158 0 obj << +/D [5239 0 R /XYZ 90 193.847 null] +>> endobj +5245 0 obj << +/D [5239 0 R /XYZ 90 193.847 null] +>> endobj +5159 0 obj << +/D [5239 0 R /XYZ 90 89.441 null] +>> endobj +5238 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R /F8 504 0 R /F11 418 0 R /F7 505 0 R /F10 473 0 R /F13 540 0 R /F72 471 0 R /F95 1788 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5261 0 obj << +/Length 1547 +/Filter /FlateDecode +>> +stream +xÚíXˎÛ6Ýû+´Je ¢ù–h ›I€4ÒdÚÍ$0› µ%G’g2ùú^’’õ°¬ñtZ ‹¬,Q4yçžC^ìÝxØ{3yq5™½–ÌSHI*½«µ§°J‚%ÞÕÊ»ö A$œc쿟ìÇù.^¼ŸRìgÛû^åñâ]ò%óûùüNu—Y> ¨ÀþËm\îñƒ^ë|J"_§K Ë1E•O”š~¾z;yu5ù:!`öˆ5@„(dÂ[î&ן±·‚ñ·FLEޝµó8eð»õ>Nþ˜àQg(CXŠ–3ˆ!Z9Ô³7ïÝÃ',ð2K‹Ò½¾KRç‹Wßö΅¢H²Ô}zf˜½V¢µ+eED€MvSí¦t ãÈ9`'Àn¤šÓ^Œ(­']'éÌx> $^”q™,?» ÜúW@¹‡½•”»?Ðå!O«T”Ýs7[»ßU’ëei|²†",TÏ©ÎÖ©0¬' 3¬ ¬gÎÇM–—›8]¹m×—ÿü¦‡7ïÚNhÒ䦹t?<}>ÏçÒåñ™×uŽë×Nz9 0R +<£Õøzõm©÷&€Å¼gj½B(›+ˆ ‰j‰¢\ÍçI:åØ¿·Éjç7‡N˞)È+ý)W›<›Rá߈B™&k÷ëò›l—Ý@Œ²Cáöq^º'@Â@ê9 ‘“±ÔGPWÇ ¹6±“‹ÞÆYžÜ$éq§îÇÛ)>ÀÏ#¼ûx©Ñ@íT2$¹ðNa·´Ùiióøû,ÚÇ Ìë™â6Ÿ‹[9Fl¬¸"DÖ~ +(pY®DÎçßuž3[ÌÀ: Qˆ³c->w¥Æ)F‰4pz™éõ'Œé2|,Ê·î/œ¿m^>u×lEÕq«Õ€5!â!sÀ!+ƒÖ‰3'Kõ˜—˜ IÔ%,Iϒa„XTђcÉ +9æ1.‡¼Ã(Âr¼8¸Œê ³%¢²ábúĊ!ۄž'V¨¦qb%òQÄ +뵈ÕF¥M­ðyZa“J©M½!¦³x4X¬q[w€¼:ËÏvf+/²r3d +u«Èi&˜  M"‰ÅX®Ì"GŒsKnÌϬ*Ä[ˆØVœ£õÂGùwI9%þÆM_A ÌQë°-ÝÀ­‰[¼=èb$¡0ï.iÅÏã=¿æiÚzuÛÎHÅE‚C°y•AYËB±7Ç ³–#ûíýTŠËE–«Ue…UÙS¸€@1IÆáÒ↤⓲Aå#Ž’+?U>…ò—Û¬88Ž_TdãQ[í¼3Bhç)!cáñc.„Þ„|D@³(V=) ˆX(À³ž =F&q( ™4p–O—D`|…c’H8\VÈè@ ýkQŒŀØeD»x©8âK.Uj¤½<48?'’ê©"yrû`…!ŠHŠ'ˆd£Ååb).Ë`H$u÷¹‡5SüÔÌR3ÅOÍü_43êj¦¨4óqšÊÓ 3+µÖª\ƒ¿¦Êà<‰¿l‡tn᪹hݞé*ñŽ48ª¶¬siÐoΣÞÕið¶Qq~‘,ôì0 ]ƒ¢¬ïÑHª«¾í +"¢Mo¶eC˜Á>îSn’b`+ÊP#ÙãõE„¹tByPӈÐ +c,´½ókócҕ6<òͽæEa7ÝÉ¡´(ĘhW Yë&×q URmW&dՈþz0\n?f«¤ëõ¸±U»“gÛ@ÚM@h^úô¦Þ d„lP8CFa ùd·ßj“]õ.&Ï÷"ߛ`;’ ˆr<|¼8Á`¿Gö)8^Ø"·­qðY…°¨j …„à5pª>\½ÖV×ÝSkº{ù³Ðù/S!üŠ~S›âºƒî+ošå™j5Ą »Àžµ®œtžýíÕO¿Ml{I|™Ü”å~>›ÝÝÝ¡ei²ÏQRÎöûíì´XZ«ÀɼáÐuÝøßeõI6Iap›:>‰ÿ?¬cæ +endstream +endobj +5260 0 obj << +/Type /Page +/Contents 5261 0 R +/Resources 5259 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 5228 0 R +/Annots [ 5247 0 R 5248 0 R 5249 0 R 5250 0 R 5265 0 R 5251 0 R 5252 0 R 5253 0 R 5254 0 R 5267 0 R 5255 0 R 5256 0 R 5257 0 R 5258 0 R ] +>> endobj +5247 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.558 684.664 188.38 695.567] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5248 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.878 684.664 369.041 695.567] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_b36bf020da4fb4583e6e1a6b94197cb4) >> +>> endobj +5249 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.867 549.698 187.69 560.602] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5250 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [187.843 549.698 513.996 560.602] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_6b8dae6436867a53e27720ee211f1cc7) >> +>> endobj +5265 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 538.116 99.295 548.647] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_6b8dae6436867a53e27720ee211f1cc7) >> +>> endobj +5251 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [316.086 520.118 422.655 531.022] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_6f8cd8fbee64faaa5e47c8e41ba7662e) >> +>> endobj +5252 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [439.486 520.118 511.506 531.022] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_66438955854cf73ddaf27a40a69fec7b) >> +>> endobj +5253 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.861 361.243 187.683 372.147] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5254 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [187.833 361.243 513.996 372.147] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_5c56451d80b8c02636854053de9e0440) >> +>> endobj +5267 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 349.661 138.836 360.191] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_5c56451d80b8c02636854053de9e0440) >> +>> endobj +5255 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [316.086 331.663 422.655 342.567] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_6f8cd8fbee64faaa5e47c8e41ba7662e) >> +>> endobj +5256 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [439.486 331.663 511.506 342.567] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_66438955854cf73ddaf27a40a69fec7b) >> +>> endobj +5257 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [164.828 119.223 340.976 130.127] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_f4e7705af87f5eb64d2ebdc60cd7a36e) >> +>> endobj +5258 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5262 0 obj << +/D [5260 0 R /XYZ 90 757.935 null] +>> endobj +5263 0 obj << +/D [5260 0 R /XYZ 90 733.028 null] +>> endobj +5160 0 obj << +/D [5260 0 R /XYZ 90 630.093 null] +>> endobj +5264 0 obj << +/D [5260 0 R /XYZ 90 615.523 null] +>> endobj +5161 0 obj << +/D [5260 0 R /XYZ 90 453.717 null] +>> endobj +5266 0 obj << +/D [5260 0 R /XYZ 90 439.147 null] +>> endobj +5111 0 obj << +/D [5260 0 R /XYZ 90 265.262 null] +>> endobj +5268 0 obj << +/D [5260 0 R /XYZ 90 250.691 null] +>> endobj +5112 0 obj << +/D [5260 0 R /XYZ 342.471 122.376 null] +>> endobj +5259 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5275 0 obj << +/Length 2073 +/Filter /FlateDecode +>> +stream +xÚÍY[sâF~çWh_¨Ú}•Ô$ÙªìÜ*ÙM2ëñ>M¦(£ +HDc{ýž¾ —“Ê>ØH¢uú\¾óÓÝE8z?úÇÍèê]Ì"‰dLãèfI%1A‚’èf}‚H2™ŒñøÄàqVm³ù‡ Åãró¸VË*›ÿ+¿­²êq6{¯ +UeMYM¦TàñëMV×öòZ­T5!éX ☤rL1ž|¾ùqôöfôûˆ€B8"F‘ „‰h±}úŒ£%<ÿ1ˆÉ4º7«¶§ >7ÑÇÑ¿GxÐÊŽEÇÄPì z]ªÕ¯ÓE®ŠfÞTYÞÔ³Ù¢,êfnµíi-Óçø`6[æzñ—¼Ö‘)ÿŠ†?¢­•§ N7³«þlF1×Î1«>åÅ&/Ôg»PàΩ[9cÊíúVv%í¹¸pÁ~ؖ#PدiÖyؑƈãvQîB­òf­2û±+󢱗eÿ›Å¦¬÷•ê,{e¯+Õì«Â‰„°Ø ð(ΣBŒ‘ÿQð§`Œy4$8µJ¾}X¨]“ƒ¯g½w2d× $…W%¸TU7ËÙ,/&B›mòå<«îö[Б2=WI$õžºYW¥¶ã¾p慂Ä)b1ùÓ¢T ‡©x2NÆ÷à™*‰ÁËÐÛM®U¾Ým”vŠZ: çã՝Köë÷£è“ùòJ¸¼ +äTn>K×Ï°rŽéz’‹”z…|â{&»-ËÍd*ÒøYùœ×sõûÞ&µymch£´’trÛ$6·.i2þÊ*ÙC'Q!}hvpÄ!•[8êhK§ì,ƒô€û”pí2+@5 ñ´Ý­©öêi8­L +ç²Ø< ZpDÙ%ÜCŸ…j½ý©£4‰Üۓ’"§­odÍ3úŸ ²}~çCZ{ð'0–öýÛÞeÚ:ÓÀú’wžÃVZ.T–Vp½ËÊ YSk‚rŽõJesN»‹€;ø¿« à-ÝßûÐ]«MÖæë»}±Ð·ÛiÊAÀpšøwë€t˜~#Ö¸´ÖBZœÐ)ä&g^Ä]0«;÷Y} ^ˆ=ÔýÊ'\ø¹DBÁð—}³Û7G÷5ó XD?˜ÔӐ]™/õ-‰Çõ}¶3—Â8ÿ9]¡y?ä3†¡@Ê6¨gœF:¡œð³ô=µ ÊF2‘Ž'].œkWCzIÀ§O14»$–ô¢XIíÅòãN-rè5þ«B´Í¡²‘VºÉ¢Sé*àÁÉ!$è!ÈÈ X¯zvõÝwö¾S/LŠÁ‡Öè’À¿4#/®³/ÈH¨ìº{³QMáímÑ/¼OÕ¶™?S +¡é9Ý#¦À|¨ÞB’'É0þ$Aœ‡ñÇÏâïo/ÀE„‘ÿüý,Âûk›¾?{Ï“a™¼ „Ç(†G¡ + ‡ÂFÁ"èbRàJن3ÔÃ$(ámãß<îT‘m¡Ñ‹1ßL$—©1¸‘¶Šÿ=Ô¿‹ÖÑ6M´HÛA?§gY5_æu“ 5Ïê:¿+ì";¯×jñ›.©j9ÿy¿½U¡ÂQO9džQ¤í¢¬E¯ÜÑK(B²tyûÐ@CÚnê‹y¾x õˆP"AáAG`Ø¿Åk(%aw†Ûdª.hcšú´‡7»iÏ0 7ñÃñîjyéOR‹ÛãºÜK8‘ÌßäU¨Kfˆ¼ÌCîÆÝ)R²ÜA•ö£=D]G‡Õ×åºXå¡Y+?jÁ| ~ÏÀ?eÅ:kàF)wª²€·w·ª¹WªèK™îžb*ùÒc§f ~œ h¼X¿e8c¾Ú/6ùReÅó¬#±DXð‹‰xÀ¼äÙæaŒX’œL'§Ð&YÃôE/®úÁÁ4}7`gS1dœ‘ù|Æ4}²dC¦õ„èBe”Tzˆ\¨%dK%´àe¥Üw:Fæs·«Ê‡|kOÐæQé¬Ï÷Y šž°Å$=¢ªaӜ3ÏÕü)D1Aúiy®ö3`{/ü›þt6ÐNÄI‹ŽU¶©C20´iTêIä}^+‡h÷3áfÝH Hüd¢\åƑ£MSRû1 £t¨üãö1ÄXw §ì×3@#…ÑcŒÙ1Dãßo ó”¯ë\6jÕö‰™íè èbWeµÕjéÛ}m†EúÒ¶> endobj +5271 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [164.828 621.024 340.976 631.928] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_cdc0aeddab3d98e336719f42e6e5b06c) >> +>> endobj +5272 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5276 0 obj << +/D [5274 0 R /XYZ 90 757.935 null] +>> endobj +5277 0 obj << +/D [5274 0 R /XYZ 90 733.028 null] +>> endobj +5113 0 obj << +/D [5274 0 R /XYZ 342.471 624.177 null] +>> endobj +5278 0 obj << +/D [5274 0 R /XYZ 90 607.799 null] +>> endobj +5279 0 obj << +/D [5274 0 R /XYZ 90 528.75 null] +>> endobj +5209 0 obj << +/D [5274 0 R /XYZ 90 506.438 null] +>> endobj +5280 0 obj << +/D [5274 0 R /XYZ 90 506.438 null] +>> endobj +5210 0 obj << +/D [5274 0 R /XYZ 90 469.152 null] +>> endobj +5281 0 obj << +/D [5274 0 R /XYZ 90 454.931 null] +>> endobj +5211 0 obj << +/D [5274 0 R /XYZ 90 407.727 null] +>> endobj +5282 0 obj << +/D [5274 0 R /XYZ 90 393.506 null] +>> endobj +5212 0 obj << +/D [5274 0 R /XYZ 90 358.258 null] +>> endobj +5283 0 obj << +/D [5274 0 R /XYZ 90 344.037 null] +>> endobj +5213 0 obj << +/D [5274 0 R /XYZ 90 308.788 null] +>> endobj +5284 0 obj << +/D [5274 0 R /XYZ 90 294.567 null] +>> endobj +5273 0 obj << +/Font << /F63 374 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F95 1788 0 R /F11 418 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5289 0 obj << +/Length 1754 +/Filter /FlateDecode +>> +stream +xÚíZ[oÛ6~÷¯ÐÓ&5Ã;©¬°µÝ°n+²Ö{j‹@±éD¨,y’ÜÔÿ~‡ulǽ­òd‘¦Î…<ç;„½k{¿N~žOÎ~‘Ì P ©ôæ+/Àž’ J¼ùÒ{킈šÎÆØ¿˜ì‡Ù:¼¼˜Rì§ñîÆ,³ðòè* ³Ýùù¯&1YX¤ÙtFöŸÄažW/ÍÊdS¢}“, ˆc |ŠÉôíüùäÙ|òτ€AØ#¥B!ń·XO^¿ÅÞæŸ{±@{·åªµÇ)ƒßØ{5ùk‚»ÎÞgB0¤Ý ÄÒý#;‰ƒl‰Ù‘‹‰ä 'ˆaz +—T×$Þì’d†É¨Ž€ÂALj8ùŒ:îÁÃKG(·bˆbv +çÞÃ/g@Åöòz§}ˆgâ~ßkÁì6MOàDœüsðGu2„°–»üñ¡üívƒG›Á½àOa’\““´3%o°&i‡ŽIÚÇA#ØNYíoÕ¶O÷k†„<¥¬qÙ4,ØÛ¦PPÿZ}àá× RC´êû~œP” §˜v%¸„‰áeåÂZo¿®pÃúóŠjè¾±¨ç&û~*„Ÿ7÷üm·÷ÿ÷V”Éò&!= lå@SÛG÷_㜬<{çÕO¿OÊÈlíµwÊNý¾)ŠÍùÙÙíí-Zäh›D› EÅÙfŸÝ¥Ó)À$T#dUw(Öi}¯‰Œe ÞÙÿ2a +endstream +endobj +5288 0 obj << +/Type /Page +/Contents 5289 0 R +/Resources 5287 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 5228 0 R +/Annots [ 5286 0 R ] +>> endobj +5286 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5290 0 obj << +/D [5288 0 R /XYZ 90 757.935 null] +>> endobj +5214 0 obj << +/D [5288 0 R /XYZ 90 455.73 null] +>> endobj +5291 0 obj << +/D [5288 0 R /XYZ 90 441.16 null] +>> endobj +5215 0 obj << +/D [5288 0 R /XYZ 90 251.553 null] +>> endobj +5292 0 obj << +/D [5288 0 R /XYZ 90 236.983 null] +>> endobj +5287 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R /F11 418 0 R /F72 471 0 R /F95 1788 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5296 0 obj << +/Length 1748 +/Filter /FlateDecode +>> +stream +xÚíZ[“›6~÷¯à©Å3±¬+B›NfÚÜ&iÚÙ&îS’Ùamy—‰ .àlüï{„Ìbošt’vŸ, qn:ç|`ì]yØ{>úe6š> ˜§ +hà͖žÂž ”x³…÷Ö'9žŒ±>&؏²utq>¦ØOW»k½È¢‹Wñee»³³ç:ÑYT¤ÙxBö¯¢<·Ã×z©³1 }Ì5ˆcŠ*Ÿb:~?{9z:ý5"`öHi€H2áÍ×£·ï±·€õ—FL…ÞM¹kíqÊàwå½ý1ÂÎ|«S¡BsOґ€[Ç~O }Vª¯î›>¸q ‘ÄʛÀ/ÔÞô$΋<0^…b¡„é3I7Š aÌ+oI“ÕÎnjK‡aH«M ýcšè…•{©‹­3aþUT§´¸ŽŠ½úr°Iã¤Èíö(YLË€õù*Í·íMÇG¹¬¶dÑÎÉ­VVq¢óÖä@4LžHp Že9¡D`-_F«\÷øÇ(bRUþÅ. 2]l3p9ñÍCšŒ°¢Þ„SD„l¤â(t)XèõfN#!ÍCæ!uØêÑYÅk“ŠÝF'ÑZ›x(6VÔÙvö~(ïےö(&L€àú,õh&…4¬v\¦éÊÊÔÛù*^è(¹X¸Ìº€’‰¯{ùøñµž0…§#ڛP©I¨;áòy»¾„;4¬ãDŅ@ÀePí°~B¸bþÓO…N ÚŠ¯ +?žïzÁád0-U?ØJ´wHZ››õÈ`(”¢Úvª0ðçi’CUpÎýFâ\ôëÀQU›ñ©G o–ç—P²ëUbû˜SR.§‰²ï4÷uºMqruñ$ÎzT )^÷’¸/h ͌ö ¨¦}֛âìs‚ófjë î‘ óýsÙä+ʦGeC±‘ž® iÓo3mÚÏâ}OË3íáÀÔ¥„`»£{œ®7ÛB»X\k;¨+ßN«ò·³ªÿ÷X” ÞÉܖ!âAÝj z¥@ ÉNf¶„¤d-¹¶ Íà6랃ÑK0™pç šŽÁ´áaCŽ1‡A‡#XuLAnj°KÆÈ +~!¿(%~…­ÝµÊ‘h³ÉÒOñ:*âÔ-¥KëU\Ø9àkÚg”(Ø»–âZ)Ï¢eÞ#’ˆ‘:s‹lÛÁº©3÷á¾½PFÚíåvE —XŒOû:ª)äBvçÚåM@mhTŬªèVzîB +Ó2¤Í:醖*2‘oô<6WÒ&S6»(&ˆsvÐÛlL"Åh7߁£1)Úùþóje•Í˺.ÍröX:ƒÎ€_­+³¶9tîŽ[†Ç¤†4ÛéÇ1p]®tß1À€Šð°x…3¨F;n[J€8&wi ûözhN+¦ ªÝ¦~ŒK=1‡RŽv:C'ŸKÐé• óvmŸV³w'èa› «¯HÐ%&·³ïžéB9È9yù4Ù"ßFäê"NÊS‹Ý!ÿ6;ºüûVŽM)$ØƂ‚mû1V(lŸØÝ87È0;òð!äÜ1Lï¹VtîlÒaqëÓ¡(âB£Üä ê8q—:ŽkÉÅìv-0É ‡žálö£Ämì9¤’‡ù  ‘5?|åv0/BDz`4 ‡¸rôäŒ–ÐØu*C•æQ÷ß!¨²ØDB'¢¤Í4 AeŒß.À.Ùiáâá"HÄ4víÃe”„ ȆÂ$äCßf½M¦Õ›š¤—‰ &½æš!½Œ‰.û2—Ò¥½dH¯™ßFzCˆìÁsü c¥¸ÎkÐ^|œ—¯œW48/I‡óš•’á˜Aƒóš©ã¼fØæ¶å’ñØüˆ·£“Py ¹‰Ò¶œj1ˆÙ8Äå›,ÁÔªºwiŒö‘g:7h;&Âßõ· ¶ÏÃGnj8F|Tÿ=íý–hïžèRÓP~i'ሸǑoG‚{ùœw'Œ‡1+eË0ƒ +GÆÄ_Ø%f؁³T¦üZ(1£Ó S8Â; ‰Ä慳IqIoÅ`́Ríü¸Ç’ÿ3–Ôqï~ãBh0᩟¸ËOÚ {' B(8ƒnO87©f¾Ñ»iõ‘ÞNݗz;ù3×ُc!|gøoQ²ÜÛMóæ㣥³¼nÐÏ š§[46Éî¿ÑÚ9i=ûàU£_Ge`÷ö’P6ß1\Åæl:½¹¹Aóm“x“¡¸˜n6«éaº6¤˜7)µeõGƒuZ½zÓ=ÊÎrÿ¿¦–CF +endstream +endobj +5295 0 obj << +/Type /Page +/Contents 5296 0 R +/Resources 5294 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 5300 0 R +/Annots [ 5293 0 R ] +>> endobj +5293 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5297 0 obj << +/D [5295 0 R /XYZ 90 757.935 null] +>> endobj +5216 0 obj << +/D [5295 0 R /XYZ 90 686.039 null] +>> endobj +5298 0 obj << +/D [5295 0 R /XYZ 90 671.469 null] +>> endobj +5217 0 obj << +/D [5295 0 R /XYZ 90 481.863 null] +>> endobj +5299 0 obj << +/D [5295 0 R /XYZ 90 467.292 null] +>> endobj +5218 0 obj << +/D [5295 0 R /XYZ 90 123.328 null] +>> endobj +5294 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F11 418 0 R /F95 1788 0 R /F13 540 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5312 0 obj << +/Length 1910 +/Filter /FlateDecode +>> +stream +xÚÍXmÛ6þî_!à€œ Ô\¾êe[¦MÐ^Ú¦ÉÞ§M`h-zW¨,¹•ÿý ERo¦½é¥î“$›Ÿ™yæáà>ÀÁ«Å÷7‹«—! ”„4 nvA‚ƒ($HPÜdÁí’Dâ՚`Œ—oV/ÓzŸnÞ¬(^VÅñAfuºyßÕi}¼¾~%KY§ªª7’û՚ +¼|Q¤Mcnßʝ¬W$^Êr+µUñ%Ålõáæçŏ7‹?üÂéüŠ˜¶ûÅídðûÏF,‰ƒÇnÕ>à”ÁµÞ-~_à‹g¢ áP gŠGۃ«‡"UR»qõ’Ñ»q‚ÀG0ܽùY1±NòÄ-Pǃ,Ó=œFby³Jèlë§pù \bâ[Ry6&Œ¡$bÎð¿<;ŒxB܊»ª*ŒÍb“—ï1¦e®Ž›,oT +ho ù}iV¼Ç¿xÛ?tDe¶YkëÁšrˆ|k@(­_ÛýíÔC&'Ñ%h C·ÂPà [þøIÉ2ƒ­y—QùöèÅ‚ÅÉE,&[=3+1]ÑÞÝÚcƒ¡8nø™Äár[•—9_öÙ­…ŒMz7>y6á(‰éß¹ÉÑ»‰© »I\N18™÷mՖY^Þo~ÈkÏV!ä`ŸüYî ¬é»á@ +j”øPõ¾CpeÓã öì± ó˜}¹mòmÓ'mC±9ĸ˜ö9}[KÍ@Ù³RàÑJ  Í^BØܼñ¢ÚZ%-³ª{ƒŠ°àk»‚¡¦–¸‹0Šb° DâÈÑãMÂH0ZåXÅl~'Õ£”¥ç†CòY=LlLj‡±[–™© +3šåûĈ€óô ÉwÇÀ4ë÷O»Õš1~. +Œ6Pîe¸ø¸Š"ŒV péÍ/ÀE¡DÃKpA;"O  ‰\Dkl#oŒO™ì:†Ì ˜— P´ÿ¥¥¾Šez8ÔÕ§|Ÿª¼*Í_ÕÎü•+󜗪òù²'ä{ñ`¹Zª¶.EÃ){²Vu+=6¡é'¤·úíÀƒ”‘)žßˆaDDïù.-ßNŒ‚LèÓ¸‚ôªóFÚT !¬ d&å{ó`‹hUn ¢úQ#ê +º»™¡®ÊmÑ7¹ÍuÜdf ñè9ՉœÐø4g#(q:+!J´úÓz^f³mG@[֟´¶>d½«ê½s«m Å̎¥5W¥e£yü¸¢`užÞÒXŸ6Œ ÿƗ7Ð~Éik˜Z Çä¯pÒÐNݙ`Ú«ÔYÇX3T9`.PzÒH¯JÉëÙkÓ¨é*€ðÄ jÞùÁRIÌ»tŽ!ø2DBôÑ®ÊÂGü‘Té ÂØu¦{Óòމ»©zHÕ°}ws¨€³½ÒGÿ¾-ª¦.újzñÎ-©Ó£µë~)òR6¾è®#8ãÓÚþ¼šu5e˜@fÈÓ×A# œPÍ!@ +ñlš všhTv}]5Ê :)LA»gæR¬¼ó¨ÜÚX܏ßù5¥ã×2þÜn§Ò%‚[ÖÓ@ó˜ÀøåÄi4§××7+˜Ü`’Ñœ‘© •((Úw4”Е´æ†!ˆ©IH/©%<åÙßZ,e¹Õ/„¥8|Ž”«m»—¥‘®ÉǎÂ\®l‡Éö±›íƒ­G»ºÚÏØoWE¥)ï±gF]^ŬÜ5ÍpPš„Ó^ï)ÓU·x= +ôðÐÃlð¢ˆÎŒž£`¾ûꓽ7*”#æ˜í¹m`#c®ñ d‚<ù€§Íèy¹-ÚÌ«}Š’x>žŠs“û½ù˜‡álöœêó꟰i*ýT‚ȕ…àSp_¥Yo^ZcÓ6¿0_Jê{ûÉäm— OîöªÎ³ÍI|IòØxvÿ?¡o“ëû´}KÓ¿ÊµË1¾à­Jó²ouà<ƒ¸£éÁ` Dþ¹ïõì°DAùuöÓábˆáÈÆëÿ!\L=»o¾$l¿Õ+ÁüWöS׶:×£òYBžpþ•>„=Iü¹黏óá‹ +˜€þ"Ä\õ=Ì>ºFfm73ÿidýO­élJþ’–mZ¬zô?jS²nz)#=FTC‰ _¼“ÒڜìÀÝýÛtÃÁ_ÐO0ýXô ÔáúêêññmԖù¡F¹º5quÊ°#+—¨7ÒKË}å&è¼Ôt'?§ñüÿ !Ag# +endstream +endobj +5311 0 obj << +/Type /Page +/Contents 5312 0 R +/Resources 5310 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 5300 0 R +/Annots [ 5301 0 R 5302 0 R 5303 0 R 5304 0 R 5305 0 R 5306 0 R 5307 0 R 5309 0 R ] +>> endobj +5301 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.912 331.528 350.381 342.432] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +5302 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 277.644 192.544 287.572] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator) >> +>> endobj +5303 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 195.905 190.054 206.809] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_605b7611d045e0ea0ff47c2ec36c2268) >> +>> endobj +5304 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 157.051 190.054 167.955] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_9db5a39fe27d6c659e9c6ce626e83dfa) >> +>> endobj +5305 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.391 157.051 259.214 167.955] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5306 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 118.197 190.054 129.101] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_ed024de0dc1ad69e380f706d25740cb0) >> +>> endobj +5307 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.391 118.197 293.535 129.101] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +5309 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5313 0 obj << +/D [5311 0 R /XYZ 90 757.935 null] +>> endobj +5314 0 obj << +/D [5311 0 R /XYZ 90 733.028 null] +>> endobj +5219 0 obj << +/D [5311 0 R /XYZ 90 550.929 null] +>> endobj +5315 0 obj << +/D [5311 0 R /XYZ 90 536.358 null] +>> endobj +1485 0 obj << +/D [5311 0 R /XYZ 90 435.963 null] +>> endobj +206 0 obj << +/D [5311 0 R /XYZ 90 429.363 null] +>> endobj +5316 0 obj << +/D [5311 0 R /XYZ 90 295.642 null] +>> endobj +5317 0 obj << +/D [5311 0 R /XYZ 90 214.879 null] +>> endobj +5318 0 obj << +/D [5311 0 R /XYZ 90 214.879 null] +>> endobj +5319 0 obj << +/D [5311 0 R /XYZ 90 176.144 null] +>> endobj +5320 0 obj << +/D [5311 0 R /XYZ 90 137.29 null] +>> endobj +5310 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F13 540 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5352 0 obj << +/Length 1629 +/Filter /FlateDecode +>> +stream +xÚÍYYsÛ6~ׯàS*ÍD0@<Üô!M›LŽNÝ؝>$ LB2'₲ªþú. ðD]6cåÁ#švûí·Ø°13°ñfðëÍàâµM y¶i7SÃÆcÄLbÜƧ!!ˆ¸£1Á¯FyñÉÕÈÄÃd¾ºAÆ'Âیg«ËË7"ϓlr½’¹ˆFc“áá«9—R=~S‘ˆ;±/ +©Ô±†&¶F_nÞ ~¿|° ¤´ƒ9È¡Ìð£Á§/Øàý;#ê¹Æ²–Iáwn\þ`½&Ü^íµl#‹º†cR„m¦øÙ4Y©¾™_èÏfڐo@ŒÙv‘‹,ۃoj:¦¸˜¾¡ +,·Üj̖[ÚêŒO¥g>c†ál˜¢~/^;&¨õlÛ*„Ã*LfŒ‰…<ËR*~2Ï>èB†¨SL#nÍÖ±i"Û2á—"í0œAP³¸gúe‡ˆâs’* ¿ìrŒŸÄ2ß/ã(3VÇz¸òHÛÅ/¥ gq$â|T[="lÈÏàô ;d˜Ä“|•ŠÃs +{eÊ}1©gî Âò¿¶×OöÖG‘/²XÓ>¿ê¡Ñ®\8Ýø~/ÊnìU-æ‰ ã™bšçµ”×EŽí4|ÄT‚7£,d㚏ù](՘õe@Ú#5±OD“:ˆQ[ù OÞ}™=Ã`DûsÁ³Ç¦Šnh¢¤Èä÷BÃÃçó fÅ÷‚QM€ êÛ4Yl˜D§([ýRäZXX=´ÐÞ’´µòôcjÉã´YÈӖ‰?ˆ'›Ëÿ|ÿ½÷êNøEíòucÛ.è ÕXPèð,äqU'pßzsäy( òžºýõ^gqé‡á$XDéwöÞ?č¬‹ÌŽÝЂš©nd\^ú"˺ÊŒìzOãºp}yýêí[õ¨<ª -$x»Õmç@ÏEóÎÞÔÀöǜ>›šÃà–nNdž ®Û†gòL€w¸ÓA¶ižhç Í‡áL\9$ýq8Í HøÎô½*tÈ®úÁBĶzou:#ÆC&qO΋æ,cM`h;µÂêXL/Ñm[O¦uÔ¼xÑ¡\E›RþDâÃdì9=mƒŠóó„{9vpþ¡ñt<·IsZÑ‹îg»cÒ5¶ƒÄŠíPýîd; +Öŵ©2"Xø"PonW{|’›<¹–U¿=ÓAÛ*c¾ú¬º2X¹t `yf§gE;€,LÖkbîûIiu}!cŠcJðž&úéOjBåÂ÷…”ÓÅüy×2\„›“Â)ŸËNÉ„EC¦/`§²ch?؏x#%Ùj"ÃÿÄ ‡¼y’óùDÏ ãÉíªØñÎQזhT` uªàU½o)ãõGß_¤¡ªY]Ù¾¸ÔiîZÎU*1;Á¡R©g°Ë˜üzŸøÁüá@G<æEç­N öá]œ÷c×>oÅdR¹ŒõX1Éey¹º³,Þ9û n¾®—<í,´"ý4)kÉ|æw‚ÔÞµ²Õ3âýpnÞ4Û ʸ#/š«‹eØ9Ш.͙‡Óþº©"üª<”È"}J~Uݘ«õµ¹úço)²ŸŠíQ³å/ªüYà_ˆYs-‚ì³f«ÞP¯E•6ÔʾÕÓûAéÊÆ^â:ˆâ:öïò<½¼¸X.—È—h‡i†Âü"MçknÜX5qj!ÓêÆH]'x•5Ñ:àÿÿZ¼Í+ +endstream +endobj +5351 0 obj << +/Type /Page +/Contents 5352 0 R +/Resources 5350 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 5300 0 R +/Annots [ 5308 0 R 5321 0 R 5322 0 R 5323 0 R 5324 0 R 5325 0 R 5326 0 R 5327 0 R 5328 0 R 5329 0 R 5330 0 R 5331 0 R 5332 0 R 5333 0 R 5334 0 R 5335 0 R 5336 0 R 5337 0 R 5338 0 R 5339 0 R 5340 0 R 5341 0 R 5342 0 R 5343 0 R 5344 0 R 5345 0 R 5346 0 R 5349 0 R ] +>> endobj +5308 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 719.912 197.803 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_6135986b7669c295a1855279a9347433) >> +>> endobj +5321 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 681.058 190.054 691.962] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +5322 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [200.794 681.058 241.6 691.962] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_804b0e848b19f18d99664d5bbd57a3f1) >> +>> endobj +5323 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.937 681.058 345.081 691.962] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +5324 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 642.204 179.554 653.108] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +5325 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.052 642.204 250.666 653.108] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_af6afcf59d181946f02b27418d9b651a) >> +>> endobj +5326 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 603.723 155.265 614.253] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_a33b89d7143376193110dde339707b0d) >> +>> endobj +5327 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 564.495 158.044 575.399] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_cce6ad80815e7d09970ed92968967585) >> +>> endobj +5328 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.382 564.495 227.204 575.399] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5329 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 525.641 161.013 536.545] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_ad63aea0771a124cfb70c8e8e80779a3) >> +>> endobj +5330 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.185 486.786 195.165 497.69] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_2b29f5668213f9171cfdc666ef4142ea) >> +>> endobj +5331 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [173.442 472.166 226.112 482.071] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator) >> +>> endobj +5332 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.148 461.207 227.817 471.112] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator) >> +>> endobj +5333 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.185 437.347 187.563 447.877] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_b174d3f8d008aca83801ae0de294528d) >> +>> endobj +5334 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.482 422.353 271.151 432.258] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator) >> +>> endobj +5335 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 398.493 150.493 409.023] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_6b57cf93153051d3aa63c33e34ee4127) >> +>> endobj +5336 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 359.265 181.845 370.169] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_9fe4a78fa5899317f5a060d7b607b5c1) >> +>> endobj +5337 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 320.41 181.845 331.314] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_7b9d70f9508c08b9a86272878ca03b5f) >> +>> endobj +5338 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 281.556 154.727 292.46] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_25fce97f25e1814c62ec46b7a04ee942) >> +>> endobj +5339 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 243.075 176.505 253.606] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_37abf9e26c109cf608ec7829284883ec) >> +>> endobj +5340 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.408 228.081 450.955 237.986] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_7b9d70f9508c08b9a86272878ca03b5f) >> +>> endobj +5341 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 192.889 191.718 203.793] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +5342 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 192.889 288.852 203.793] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_b0063024b3761b3ff89c3f259ebac6fe) >> +>> endobj +5343 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 154.034 191.718 164.938] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +5344 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 154.034 303.079 164.938] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_7072dc2f1979eb1198aea49e10bcd59d) >> +>> endobj +5345 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 115.18 156.281 126.084] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_02e5a05e31a64af8bb2652645f74190d) >> +>> endobj +5346 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.097 115.18 236.24 126.084] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +5349 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5353 0 obj << +/D [5351 0 R /XYZ 90 757.935 null] +>> endobj +5354 0 obj << +/D [5351 0 R /XYZ 90 733.028 null] +>> endobj +5355 0 obj << +/D [5351 0 R /XYZ 90 700.151 null] +>> endobj +5356 0 obj << +/D [5351 0 R /XYZ 90 661.297 null] +>> endobj +5357 0 obj << +/D [5351 0 R /XYZ 90 622.443 null] +>> endobj +5358 0 obj << +/D [5351 0 R /XYZ 90 583.588 null] +>> endobj +5359 0 obj << +/D [5351 0 R /XYZ 90 544.734 null] +>> endobj +5360 0 obj << +/D [5351 0 R /XYZ 90 505.88 null] +>> endobj +5361 0 obj << +/D [5351 0 R /XYZ 90 456.067 null] +>> endobj +5362 0 obj << +/D [5351 0 R /XYZ 90 378.358 null] +>> endobj +5363 0 obj << +/D [5351 0 R /XYZ 90 339.504 null] +>> endobj +5364 0 obj << +/D [5351 0 R /XYZ 90 300.649 null] +>> endobj +5365 0 obj << +/D [5351 0 R /XYZ 90 211.982 null] +>> endobj +5366 0 obj << +/D [5351 0 R /XYZ 90 173.128 null] +>> endobj +5367 0 obj << +/D [5351 0 R /XYZ 90 134.273 null] +>> endobj +5350 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F23 340 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R /F98 2120 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5386 0 obj << +/Length 2004 +/Filter /FlateDecode +>> +stream +xÚÍX[wã¶~÷¯àSJµ+ xUó’n²9Išíví6»9>°KH)‚!©••_ß (Z–•¶iû # æ>@ƒU@ƒ¯¯þt{uý&åAAŠ4JƒÛ‡  A–2’D,¸-ƒ!c„å³9£”†ïfŒ†¢Ýˆ»w³ˆ†ºÚ¯eي»?«ûV´ûÅâkYËVôº½»Ùw½ÜÌæQBÃוè:¾—²±<”õR®<‹Ãˆ&³o¿½úêöêç+rрY9’Œd< –›«?Ò „õoJx‘;Kµ âˆÃÜ\ýõŠžÕ)Ω êtӋ^-Q¢wÛûʏ¿—›{ώßlëe¯tÝYÑ<ïë7 1f)‰yÌ£ˆ°$Eæ£(9Ú|˜'`¼Å/FÃvåT}oiÌ¡¥ÚȺƒSïú}#¸<»g#ïºF,åÝ°{z¼!ûH +?6aêÕÊ¢ µÒبê¤qÌY ê9›½—ý¶­ûµœùÃÕfëül¥˜+‚Sq^m63–„ãÐ9¡ÃR8~kQ—•4;ÈI}žq×Ü+ÁÓè"Ùó>ÙpWåy5T­z%*õ‹ü-ðÍÀ}ꄥɯÿ'C|¤4ª3C¼™Å ØúmŠ%Ԇþ‚¸~!¦?;ÏâÙj“ØwÛZÍ¢ð_ËíNÕ«Jö>‡»QEÝ{á^¯p®ëjÿ+R|±µŒQµF«º?©ÈFžQê¨ÀÏyA(Ôá”+R¯T%zYž¨æ“ àû˜ð¸p¾AÞê^zkˆ~°KçEëµv7£ÎñàÏ"Oõ'/÷‹r±Ð]ßJá¬þB¨èƒ Udlܧ(' ‚›â‘Ÿ~¶©e¤È OkÌqB”îÕ6 VÝ¥þ°–5~Ru'Ûûl;˜çªv|‘-çÎõ(>(¹\=Ê4ì2)pÙözc€‡¨ ÍÂضüiÛaw‚NãªkVfKUáM +ߎDLˆc‚!ÍöÖ-–Òb9~²IlœŸL—êÖ}1j»A úâH=ç·á<ÇBÂ|·VË5•[ÚHQ÷8ìÚ1„ÄUµ®çrÓô{œ6®²Y 0Ÿc\/«mé7»ÅJ +ÿ]{Æ6&k€:AƒìÐF1 + ÿÞ)q8bšÛ@ÄUŒ=b&Ct¸–Ò‘üë¶M£}øyb?a~8Ïb5dcê냛”ª•ˆ4U Q ۋ™Ðƒ˜º‹ g> endobj +5347 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 697.756 203.075 708.66] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +5348 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.573 697.756 296.324 708.66] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_d53075833d1bde0c9e36dd70afb4b967) >> +>> endobj +5370 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.005 683.644 345.599 693.549] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +5371 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.437 660.292 194.297 670.823] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_071ec60375df0a0f5051dc431f445e37) >> +>> endobj +5372 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.437 622.455 188.759 632.986] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_02b52b4ef5b1806566495cb7b6d35abb) >> +>> endobj +5373 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.953 584.245 237.097 595.149] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +5374 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [247.836 584.245 309.903 595.149] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_6e9c19c25562f9d1a71523d00b337450) >> +>> endobj +5375 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [290.965 570.133 398.006 580.038] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_600c942b0a2e94b550ccd84ef9c30928) >> +>> endobj +5376 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.349 479.205 226.034 490.108] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_dcd147a1c5474a820c7379514f629fda) >> +>> endobj +5377 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.176 479.205 397.32 490.108] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +5378 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.794 441.367 172.16 452.271] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_71a39e295673dabbc4661c7c0a2c3445) >> +>> endobj +5379 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.855 441.367 379.081 452.271] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +5380 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.021 441.367 513.996 452.271] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +5394 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 429.412 225.471 440.316] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +5381 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.27 330.308 256.414 341.212] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +5382 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 318.352 130.826 329.256] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5383 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5387 0 obj << +/D [5385 0 R /XYZ 90 757.935 null] +>> endobj +5388 0 obj << +/D [5385 0 R /XYZ 90 716.221 null] +>> endobj +5389 0 obj << +/D [5385 0 R /XYZ 90 716.221 null] +>> endobj +5390 0 obj << +/D [5385 0 R /XYZ 90 678.504 null] +>> endobj +5391 0 obj << +/D [5385 0 R /XYZ 90 640.667 null] +>> endobj +5392 0 obj << +/D [5385 0 R /XYZ 90 602.829 null] +>> endobj +5393 0 obj << +/D [5385 0 R /XYZ 90 523.422 null] +>> endobj +5395 0 obj << +/D [5385 0 R /XYZ 90 393.059 null] +>> endobj +5384 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F11 418 0 R /F65 376 0 R /F31 472 0 R /F7 505 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5401 0 obj << +/Length 2065 +/Filter /FlateDecode +>> +stream +xÚíYY“ã¶~Ÿ_Á·H‰…ÁAÀø)NÙ®8Gm¼“'Ûµ…! cŠÔò°fþ}/qeÍn&WåA%îÆ×í#}{óÕýÍí7 ‹$’ M¢û]$q”&qJ¢û,úaE"b½!ã՛5Á+UÔ»7kŠWUñü¨³Z½ûkþP«úùîî[]êZµUýîísÓêÃzC9^ý©PMãŠß띮×D¬t¹ÕF*KãÅÉú§ûïn¾¾¿yC@/«OQÊx´=ÜüðŽ2hÿ.ˆIl¯CSÿEôöæ7دiþïÖȣɳFBRDS¥”! _ìB÷ ÊËF×폘ãc•—¶€f‘ ˆJmL»î¿·b” +šŸÖ›,õ÷çFÃ,’\3øf$æ÷¥ù~û Ç#Çlc1$Š©tCÞæ֐ƶÍQ…b–tÙäUéÍ®jÿAumuPm¾UEñ웲uà«ì Wm}×]U՚òÕ)/÷®i[eþcõЪÖU·œùߺÉI#Á)@í%÷nœiӃtßéËs)1øH„ïÖ§®OAÔ¤&lœ 1”¯ç½ëCÙd"ɬkèE]/6VBË0Ý÷çS¥ˆÈÉTtÁ¤ s:™ ]³ÀÒ ¥4~• 1Á'2ǧ˃§ø4VŸM€*XÁĔBäø<òõ“: (t6~b4"P +¦7»Rr?óýU¨ô`vP—Y€=÷W+u~‹õ#€+Ëk-@N/¡9 ñ&os£@Ø©¶UÕ­ÆÝ0`a²2+¿¼ ‰à“]håååBŒR°” ¿¤‰ R~1Hé¢Ô÷º +³7,åˆÛÀ1Qêáóœ˜8Û76b@ÌöU/D48Éü-åO‰a[˗èYÅטâýýZ€×¼ó=àN¢§1™àÝ}XeïL˜váX׺9Ve6ÄY57íarìMÂ1’6ÁŠ¸ hIð¢®@Gp:€êR¼!‘˜¿ª4ÓÐU06ÀÒeT•F½>U'SÑs;wc¦ à6ŠCxq%¦Í3›$ ؄b9م³ÕÄ 2勦ã¤OXø\ÏĒ‹±YЇ#õ‘/c—ràä°²IìV!T ƒ ×LcøÉ,øª:ßçå‹y™|½4„?Sb™†äy’}³4$ÈH$r$b–¡Ì<]íJÖÔA`™…9gX#¼ß‡IßwžüËå‚=±ãŸ–D {2É!&*òkωHÈíõ'°ˆyÌÜXÃÄÀu¹*þfªÿ… 7Nƒ.&o5_ñË>å;Só¢5ÙoÚìóYó.þ5¤#S ûêٜUÙªkÜ ŠÛ¢j:%æ ëÐÈhyì´¦‡*ÝׁG™æž +eMš¦ˆ³žœülú.á4{.ÀsG,Åx!GùÙÝ©f-”½YÚk“ ÍÄÕQ—®dø–-äå¶è܁ÝÖÜHåªû¯NÖþ˜ðd +˜– ‡(Ä5åñ ªn¾dè{„Žfʼê×¢ÍìÎsh½ì»ú{Õê0…jå§êŽÇªn½‹¸?»©¼¼xi˜҆µYꐶéñn¼ªcWÃIGû;!ð+hõ¸.àæø¼ïQÙ^dØS˜€:Ït­3t-טy¯‚è‹»uºûf»þ‚ìïf J`pN>é"ðã`”ÇÍðA½Fá—à);Sø…€:Vø* ³ßš…Ùç´ð‡s¤¦K™€¿0XÊËrv©™„›óqLyM]¹¿™& ”ð?¦¼¦Ï˜òšï­»u•Àz­LÃzÍåêæZðÑ@šs*l%UA™„{TÅnD2?^¸`‰%¢<¾êðµ¸1}un /bþrüß¾?½‚O/Å6KYìƒ@¤‰¦ñ —¸»œº1ܵº|É(Ö3BO›]Ñæ=Ãr|ˆM·yϵúAýgSm0¯ÉJRW{ú¨B¡¬\ß=ð+U¶Z7_*?·*ˆ&±µ®ßÄڠ͓ڶK·,¡ïä­c[ "F,R·>ÀÐðàZí…&C|LC­VôÀ%³;`rÂÓ?!üÚ XjLéª* /zQ} +ÛËAý÷]þ‹*t¹¤Ìû‡–±‰AzÅ Á)/ +×êt+ÿø:«¼PP?Çy‚’þõÇÇñÉyg¸LRÅò½èavó>º2ÐÚ߱׺ª-Mü"Ô•éèç-éÝ­|´Û̺c‘oUÛkÄe]™)»Ý‰ŸB·Û)'?='¶´¸öåÙ¾0ƒ'†¼"¸áñìùâQܼ ûjxBwUÿŽî*ÿ„½ö»5–ïêSeìl¬áÌS7ý[F#jV‰ÌK ^½ÕÚ/Ò­ìç(”þâ’À /)b¸?b=¶íñîööt:¡mƒº2?Ö(ooÇâö=FR žõBú”u¨‚‹òÍûsUžÙÿßGâì +endstream +endobj +5400 0 obj << +/Type /Page +/Contents 5401 0 R +/Resources 5399 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 5300 0 R +/Annots [ 5398 0 R ] +>> endobj +5398 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5402 0 obj << +/D [5400 0 R /XYZ 90 757.935 null] +>> endobj +5399 0 obj << +/Font << /F63 374 0 R /F65 376 0 R /F50 339 0 R /F11 418 0 R /F8 504 0 R /F7 505 0 R /F23 340 0 R /F31 472 0 R /F1 542 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5413 0 obj << +/Length 1846 +/Filter /FlateDecode +>> +stream +xÚÍX[oÛ6~÷¯6 “šáEÔÅ(tÝZô†vI†=¤A Ht,T–4]âz¿~G$EK²ìdÁ +ì!%S‡‡çœïûŽˆ­; [of¿\ÎÎ^»Ì +PàR׺\Y¶<— N‰u[W6!ˆóÁ۟çÛa¹ o>Ï)¶ót·qÞ|HnË°Ü-—oD&Ê°Î˛‹]U‹ÍråYUß$µz<_PŽíWiXUjx.V¢œßY$æ æÁ{óëËw³ß.g͸‰-"Ýâò·¢Íìê[1<gaÄßÚÊYË¡ ®©u1û}†On‘2„]¾ß¢¨ÞäG±¹ÚÓ×MÕIž©»_ó¨Ùˆ¬å#pì/¨ƒ˜ !¢MÝæyª^}Bä>½W¯~ÁÃQw2žíÚg¯9îí âÄ­>°ì#aÓÂLY{yñêí[5,EQŠÊ—|ֆ Ô e7‘L?ÜÝîN¤(C3n6… ca„>ÓTF UõÓ¾ÿY!•¨« |3æ!JœG œ>€pˆz€p0BGåeœdw@2.‡r\0‚OšÏ‘<ÿ0¡a2d4`Ñ&ŠDU­šôù„aà1ŽMá¬Â´š² ¸è%8:)·I%Æàƒ4²1¬«äoÑæ×ïøÇgö&¬Ëä›z˜¯Ôõ®C‹žÜT5]¿Gí¬ie±ê¿È:ªÓOUFaåi³ÉôS¨ŠXÍ>RÜm¢‡œªnŽπï9X ¤ŠeÊn’%u¤9جŒ s +ˆ?Ì|”ËćµÐr—ëÃãc‹ê‡:FÈCòáöJœph +•Vrqt-âxÀB†ï¦Vó‘ÏÝC±”çÂ!r}:DÏU©²u}¢ ÕS?5uÑÔc]è9ŸnBþ,“( `7Á#øÑc^y'ûwSh#ò±3è}×›¢î4DêÈWПò\ÎUE:Z˜€,x;-ß>õö2&”µ!/»-QZ÷0ôüô¾TþúüÉõçX•-ªô]/»o`áF“º 2]„¥Ä©¢VÌ$)Šãv§²ýÃs}}Û=)]»VΙg·_Få®[£Ø-NGe|Hëúòƒë‘g´òlÂèB+e¢Îf¡ç|,Fú¶Ã’ºÕ€R7T¢ü©í3µ| ³&L÷§>š¯*£+Œh:} +p!„Þ¤ÚÙW«½WÜûK|ÐÀ}³½®ëbyv¶ÝnQT¡&KŠ%õpÐÙ!LzV ž1btn“—æ¤n¤Äÿï¨ +endstream +endobj +5412 0 obj << +/Type /Page +/Contents 5413 0 R +/Resources 5411 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 5300 0 R +/Annots [ 5403 0 R 5417 0 R 5404 0 R 5405 0 R 5406 0 R 5407 0 R 5408 0 R 5409 0 R 5410 0 R ] +>> endobj +5403 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [484.547 660.314 513.996 671.218] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5417 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 650.417 106.488 658.137] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5404 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [164.828 630.735 375.297 641.639] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_6a5f64baba3ae5704d9645db684434d3) >> +>> endobj +5405 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [310.804 581.032 445.257 591.936] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_7b9d70f9508c08b9a86272878ca03b5f) >> +>> endobj +5406 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [164.828 521.873 375.297 532.777] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_63fd965105d740ff7003037964ec7d10) >> +>> endobj +5407 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.912 194.312 410.704 205.216] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator) >> +>> endobj +5408 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 140.072 170.687 150.602] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_47e2d2f9114f640ca24b3dc68b701152) >> +>> endobj +5409 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 101.103 170.687 112.007] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_2f74f2b935a0e1900eafe79b7a305a02) >> +>> endobj +5410 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5414 0 obj << +/D [5412 0 R /XYZ 90 757.935 null] +>> endobj +5415 0 obj << +/D [5412 0 R /XYZ 90 733.028 null] +>> endobj +5368 0 obj << +/D [5412 0 R /XYZ 90 716.221 null] +>> endobj +5416 0 obj << +/D [5412 0 R /XYZ 90 716.221 null] +>> endobj +5369 0 obj << +/D [5412 0 R /XYZ 376.791 633.888 null] +>> endobj +5418 0 obj << +/D [5412 0 R /XYZ 90 617.277 null] +>> endobj +5419 0 obj << +/D [5412 0 R /XYZ 90 508.416 null] +>> endobj +5396 0 obj << +/D [5412 0 R /XYZ 90 486.104 null] +>> endobj +5420 0 obj << +/D [5412 0 R /XYZ 90 486.104 null] +>> endobj +5397 0 obj << +/D [5412 0 R /XYZ 121.143 409.44 null] +>> endobj +5421 0 obj << +/D [5412 0 R /XYZ 90 392.829 null] +>> endobj +1486 0 obj << +/D [5412 0 R /XYZ 90 295.472 null] +>> endobj +210 0 obj << +/D [5412 0 R /XYZ 90 288.471 null] +>> endobj +5422 0 obj << +/D [5412 0 R /XYZ 90 158.543 null] +>> endobj +5423 0 obj << +/D [5412 0 R /XYZ 90 158.543 null] +>> endobj +5424 0 obj << +/D [5412 0 R /XYZ 90 120.067 null] +>> endobj +5411 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R /F95 1788 0 R /F11 418 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5442 0 obj << +/Length 1458 +/Filter /FlateDecode +>> +stream +xÚíXÛrÛ6}×W0yHź‚àÅI:Óæ6MÓ×VŸâŒ‡¢ ‰-o%©:þû.€"iJVꤗ™>Ø €°{ö`wl­-l½™|?Ÿœ¾v+@K]k¾²ly.Aœk¾´ÞO A$°gc<=· ž†e^ŸÛOóäv#–exý.^”ay{vöFd¢ ë¼¼¾¼­j‘žEyVÕ×q­ºíåxú" «J}^ˆ•(mâOE {æx°žýaþvòj>ù}B@Ml‘F-î!ÏáV”NÞÀÖúßZ9oÝ4R©Å¨mb]N~ž`m⾶1ãŽé»ˆ9¾J B˜²ÿŠRÞ¨³›/õ)×Z±‹7° í"è#æ0¦¦cË郭Àæ™FÝͬ÷ LW˜cø#ET{úÚ£°iàºL. 6PnÍCÓ6¼U]n#¹8!dŠF—Ù-×ÓtF)r…ÖAك ¨ÉcÎ~¢‡ iËòB ?ßgv³¦ZjtùÛcq1vtù®ªâu–ŠLï µ± Ÿ†Ÿªc°:ŒM{šÆ°9WŽ? é±ï +c§·Áª2À±ÖDÜ9äì!|PÄ=HËÒv¼idۄ€Ïí†/ä…¦C!#ÞûÁ=à3‡#×wà£CþÒ?Øaò<ÒwØÙ2V®ŠôIEºú(V"ÿêsròÐØ:CÎ"àsúQ©g‘êûçË0›üedâ¬~8¶»Tõ߇Îapyž™˜‘>í¼aw!êm™U*¸¼#í@}…>âÚ…ê/é (äŒP¼R…ÙRcž%·Ú!+5;:³™‡|êÚ@†\Üæ‘zW÷ª!·¿»è´2·#«xÈ¥mœ ´öK Q…ɧq†x.ÂÌý̤yô?iþ¤Y‚úpéh íÁ»w5š‘€"æ3kÆD8ë\ÑW¤—¢ãDh¼ ðŽÊ¸¨ã<¹``Ô ,ÐÅh¦¡í1#—ñùÏäÙP§Û憥…´£Ö¦V©ƒäD¢`ÊÝ,&ì¾{¨ËkHn«ÆBøªs»)J¥(G5PŠp9Ó|‘¡=ŠDUuç°©£mõ¶"€bföˆ3½F¦~ç‹_U"¿W‡lâ»êízÖ"BPÀ¹BD]S¦Òϐ À?½Ê«aZ$â`Uæ#’B»ÍçMÇUž$¹Mùô&ÎÖ&,õ`QBÖ×åÚÌ8ìü~;©ÐvCFP§ õ|äømÝXlF«‘Ó"gûÎ ‡“x˜¨äìc($Yc9£^çÆkÏ\Ü)¯õ“ÁÕ½®Tû\5ÅíÌ3ÛSãQXÙÕ_IÉRèþç)÷vZWh!Öqf6ù¦ÙÄq Pgj'í½uu-d\ìυ®zÝåµ2rš;9‰Mue2Qט(ßj”ž=SjøˆràAN Õøº`Èó©ÕéŽÛyM [&OG<:s)"®›ƒk‰?àe¦úK¬$=WmÝ…:X-̕mўXy-ÈKÑ&³(†›N Ýn«–é;ٕ!y‰}ô½œ¿;Šrâ.ÿâ|ãfåB¦n|—6#ŒÐPCtL[>kuúV• +ÛZK>¾"Ë˹­wª_Qy³†–ûÞÀƒË<ÚÊ:;lR6¥6ÖPG»¹›æ‰¯êEãÕU™§ŸŒD.Yê'¢ï)‹¨—54yÀ—[E‘ Í¦72| +tý†­G¾š—>(J¨GN41)¼…ë¼¹…”©N±çæ…SýÔϜêÇ/•(¿²9Ÿj¬~ +³m˜ØmÁ§SvÕâåFTºÙ3P¾&c(Ë~³Ì׏ŠÒ;}‰ï!·µÌ¦®‹³Óӛ›Uh›ÅE‰âú€;½›ƒ:«@¡¸{mhy°;€qiÃ4ÄÿOcíu$ +endstream +endobj +5441 0 obj << +/Type /Page +/Contents 5442 0 R +/Resources 5440 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 5454 0 R +/Annots [ 5427 0 R 5428 0 R 5429 0 R 5430 0 R 5431 0 R 5432 0 R 5433 0 R 5434 0 R 5435 0 R 5436 0 R 5437 0 R 5438 0 R 5453 0 R 5439 0 R ] +>> endobj +5427 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 707.334 178.435 717.865] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_16e25a87d3f2f1a0a454883b84bcf177) >> +>> endobj +5428 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.426 668.107 222.233 679.01] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_fbb0b8b086aaa82499371c7faee19c3b) >> +>> endobj +5429 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 629.252 179.255 640.156] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5430 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [189.994 629.252 230.163 640.156] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_83d49cacc2666db32082dabdac76acc4) >> +>> endobj +5431 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 590.398 179.255 601.302] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5432 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [187.225 590.398 237.356 601.302] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_a2b418d948cce672416e77deb99b45b8) >> +>> endobj +5433 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.426 551.544 227.852 562.448] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_b2c21b4ce7f4f822e98343689525f1b8) >> +>> endobj +5434 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.185 512.689 217.61 523.593] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_032aca0bd08a3c854d46b4a7c567b41b) >> +>> endobj +5435 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 473.835 180.54 484.739] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_ead8142c94d4974534e7f0fe10ed63a7) >> +>> endobj +5436 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 434.981 178.239 445.885] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_28cff68f198562b6921add86c58008af) >> +>> endobj +5437 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [98.332 334.91 155.108 345.814] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator) >> +>> endobj +5438 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [463.875 334.91 513.996 345.814] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +5453 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 322.955 120.336 333.859] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +5439 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5443 0 obj << +/D [5441 0 R /XYZ 90 757.935 null] +>> endobj +5444 0 obj << +/D [5441 0 R /XYZ 90 726.054 null] +>> endobj +5445 0 obj << +/D [5441 0 R /XYZ 90 687.2 null] +>> endobj +5446 0 obj << +/D [5441 0 R /XYZ 90 648.346 null] +>> endobj +5447 0 obj << +/D [5441 0 R /XYZ 90 609.491 null] +>> endobj +5448 0 obj << +/D [5441 0 R /XYZ 90 570.637 null] +>> endobj +5449 0 obj << +/D [5441 0 R /XYZ 90 531.783 null] +>> endobj +5450 0 obj << +/D [5441 0 R /XYZ 90 492.928 null] +>> endobj +5451 0 obj << +/D [5441 0 R /XYZ 90 454.074 null] +>> endobj +5452 0 obj << +/D [5441 0 R /XYZ 90 397.661 null] +>> endobj +1487 0 obj << +/D [5441 0 R /XYZ 90 118.565 null] +>> endobj +5440 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F23 340 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5504 0 obj << +/Length 1318 +/Filter /FlateDecode +>> +stream +xÚíY[oÛ6~÷¯0 “™&)Q—`uMÐnÙ²Ä}Ê +C–[˜n£d'ί)’ŠìØrÚȋ;ôI´|xt.ßwxHBcf@ã¼÷ó¨7&f/è¦v!$B(¿ÐªK3Aav›¦7÷-1t±áqç[81plÄÁ‰9M±†@¹`©æ‚|4@uYø¡Ù$½˜ï«—ô]'µ.ͤÖuâ©vB€ãÕ³W/"ý&:ò¬çµ}σG0)Ž øÀå^gñBoÖ¾°OÆ1ð˜§Ûr»›®®\舮Dðø]"„Ñä«Bˆ8êVåÃQ‚Nî:“ »Ë]ä4ZFEû⁐ \ËjƒãÚ÷·÷Cºöá¡SHcèâtZôfáô¤°ß™IL|[Tjw“D÷sÆZ±Ì­ôì}XÆZ H§Û´ðvÊG³`ŠïwÕNYÐ`Vå˜B/´P 0½Û Ÿ¥£è@Gɉ d÷Aȶªó€íx×â®Día_•húd½¹v¼»/éã¥ÉùÛ_^pbÛIáŒÃo½À1ö1 ¶UÌd—Q·5£àÙî+–ÌÍËOÇ«ÐúÌ»ÏêΓÃ޾˿ ¯<‰8 R·S#£K‘VqÝ©~êûNùS]zÊ ʾïbªT]éBâ +/…*Ê;+¾G† h^4¯©>㔞ýmèѯ½*vö"Ϭ> endobj +5455 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [202.852 573.883 245.94 584.787] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_6e613e3f02e896503d38da788ad593b8) >> +>> endobj +5456 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [273.277 573.883 329.905 584.787] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5457 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.331 539.013 222.419 549.917] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_b8dbbfce1fd68d57df6b05d5cc74c012) >> +>> endobj +5458 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [226.234 539.013 282.862 549.917] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5459 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 465.598 202.902 476.502] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +5460 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.4 465.598 300.037 476.502] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_aaa520f25230108e6839b82747cae794) >> +>> endobj +5461 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.374 465.598 384.001 476.502] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5462 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 430.729 202.902 441.633] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +5463 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.4 430.729 314.263 441.633] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_b2dfd07539bfb516c7ca2d04460064fa) >> +>> endobj +5464 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [341.601 430.729 398.228 441.633] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5465 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 357.314 191.216 368.218] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_9a22818e12d0abab8d8a8e0d3346f51a) >> +>> endobj +5466 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.032 357.314 251.659 368.218] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5467 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 322.445 191.216 333.349] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_cf54a358f4ddf09f56364da87de68a49) >> +>> endobj +5468 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.032 322.445 251.659 333.349] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5469 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [293.392 322.445 350.02 333.349] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5470 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 287.575 190.26 298.479] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_4039bbdc92a28fade431cb98f20b0fa6) >> +>> endobj +5471 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.075 287.575 250.703 298.479] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5472 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 252.706 190.26 263.61] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_11810ad660a4aa63766e8ebb0334b7d6) >> +>> endobj +5473 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.075 252.706 250.703 263.61] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5474 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [292.436 252.706 349.063 263.61] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5475 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 217.837 192.471 228.741] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_29b14636d21c90e28ee1821666dc1d64) >> +>> endobj +5476 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.287 217.837 252.914 228.741] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5477 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.647 217.837 351.275 228.741] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5478 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [392.36 217.837 448.988 228.741] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5479 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 182.968 191.366 193.872] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_2f220b5f73e79a2e6feab3a97a7e2445) >> +>> endobj +5480 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.181 182.968 251.809 193.872] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5481 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [293.542 182.968 350.169 193.872] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5482 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [391.255 182.968 447.882 193.872] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5483 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.658 148.098 203.949 159.002] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_7f9dc23eef0ab2ef9d07f4d53177afce) >> +>> endobj +5484 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.323 148.098 264.95 159.002] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5485 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [284.417 148.098 341.045 159.002] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5486 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [359.406 148.098 416.034 159.002] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5487 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [457.369 148.098 513.996 159.002] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5488 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.682 136.143 222.309 147.047] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5489 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 101.274 191.923 112.178] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_952922658abcdfb880fcf0a8483c9620) >> +>> endobj +5490 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.739 101.274 252.366 112.178] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5491 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.099 101.274 350.727 112.178] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5492 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [391.812 101.274 448.44 112.178] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5501 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5505 0 obj << +/D [5503 0 R /XYZ 90 757.935 null] +>> endobj +214 0 obj << +/D [5503 0 R /XYZ 90 733.028 null] +>> endobj +5506 0 obj << +/D [5503 0 R /XYZ 90 642.053 null] +>> endobj +5502 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R /F11 418 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5534 0 obj << +/Length 1661 +/Filter /FlateDecode +>> +stream +xÚíY[s›F~ׯà)E“hµ»ìrÉ[šÔ™¤ÍŒë8ONFƒa-3E€I–}Ï^@ aYqdÚæ –Ã9ßùÎ °5·°õvôëùhzâ:V€—ºÖù•`Ës â”Xç±ua‚(OÆØ>l‡å"œŽ)¶óts-â2œý‘\–a¹yùòí‡ÓÙ»¬sQŽ'”cûuV•>=Wp•ø¶È")£M 9?úí|t3" ¶ˆR{Ès¸-F_°Ãõ÷FNà[kµka1êÀ1µ>ŽþacÎ}Ge&Ç3 ñ  H°—¿…WÙjR Ð`ÜÔ¥Öð½IÃcnFѲH:Õl_{êè’Û¡_0PàõÛÔÝ4I¡Ó&Po}Êîõ©Ã‰-neK¼É†\+wt\+—=×Ê ƒ®åÀ¥ øŽq帘KeRCÜ?äÙÇ»sfáü°7Uuþ¡7ÓT=Ö÷&7ÞT O¤J™L̛¹óëò‘%€úß3âaiŠA~x–ìhÁ 쇀õÛvòI]5Ȩ¤8†T( þ à@V¦ÚA¼Ý‹7t]¼ßƒ÷Ì +v¿¾ì¼Fÿ/zªø#>ÔµoíÖ6,wܺ÷`û¼ E†ï"±‘Þðg€Ý¿p®¯¦ý#Â5?Ù\x kú_"‡üÄ ÉÎsN¥5ò?¢Y6?õÒüMԋO•(‘“õC˜-›J%i¸’¢`¶jQˆ,= €,þøP ¿ÕWŽ¦=|T¡e–%JêiQ¤»m|ÏjBXçÛ©š¤T:3öðÿ}86ø +endstream +endobj +5533 0 obj << +/Type /Page +/Contents 5534 0 R +/Resources 5532 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 5454 0 R +/Annots [ 5493 0 R 5494 0 R 5495 0 R 5496 0 R 5497 0 R 5498 0 R 5499 0 R 5500 0 R 5519 0 R 5520 0 R 5521 0 R 5522 0 R 5523 0 R 5524 0 R 5525 0 R 5526 0 R 5527 0 R 5528 0 R 5529 0 R 5530 0 R 5531 0 R ] +>> endobj +5493 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 708.953 211.849 719.857] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_83b02e8cbb5d14a2ebf2843e6551391d) >> +>> endobj +5494 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.664 708.953 272.292 719.857] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5495 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [314.025 708.953 370.652 719.857] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5496 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.738 708.953 468.365 719.857] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5497 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 674.084 211.301 684.988] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_38ab8dc3ca19cacef112ca316bc7ce09) >> +>> endobj +5498 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.116 674.084 271.744 684.988] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5499 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [313.477 674.084 370.104 684.988] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5500 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.19 674.084 467.817 684.988] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5519 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 639.215 215.316 650.119] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_01c5bdd401e8bc17ea983d941be2aa49) >> +>> endobj +5520 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [219.131 639.215 275.759 650.119] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5521 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [317.492 639.215 374.119 650.119] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5522 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [415.205 639.215 471.832 650.119] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5523 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 604.346 191.923 615.25] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_84565fd9471a52f83618d0d5ce461c3c) >> +>> endobj +5524 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.739 604.346 252.366 615.25] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5525 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.099 604.346 350.727 615.25] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5526 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 569.476 157.254 580.38] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer_6d5c75bcc32f8aea006e8da4b3f736b2) >> +>> endobj +5527 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [184.591 569.476 241.218 580.38] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5528 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [282.951 569.476 339.579 580.38] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5529 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 460.439 145.631 471.343] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1GMP__Integer) >> +>> endobj +5530 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [179.204 449.107 324.659 459.388] +/Subtype/Link/A<> +>> endobj +5531 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5535 0 obj << +/D [5533 0 R /XYZ 90 757.935 null] +>> endobj +5536 0 obj << +/D [5533 0 R /XYZ 90 586.577 null] +>> endobj +5537 0 obj << +/D [5533 0 R /XYZ 90 523.19 null] +>> endobj +5538 0 obj << +/D [5533 0 R /XYZ 90 435.532 null] +>> endobj +5507 0 obj << +/D [5533 0 R /XYZ 90 412.598 null] +>> endobj +5539 0 obj << +/D [5533 0 R /XYZ 90 412.598 null] +>> endobj +5508 0 obj << +/D [5533 0 R /XYZ 90 375.312 null] +>> endobj +5540 0 obj << +/D [5533 0 R /XYZ 90 360.742 null] +>> endobj +5509 0 obj << +/D [5533 0 R /XYZ 90 325.493 null] +>> endobj +5541 0 obj << +/D [5533 0 R /XYZ 90 310.923 null] +>> endobj +5510 0 obj << +/D [5533 0 R /XYZ 90 275.674 null] +>> endobj +5542 0 obj << +/D [5533 0 R /XYZ 90 261.104 null] +>> endobj +5511 0 obj << +/D [5533 0 R /XYZ 90 213.9 null] +>> endobj +5543 0 obj << +/D [5533 0 R /XYZ 90 199.329 null] +>> endobj +5512 0 obj << +/D [5533 0 R /XYZ 90 164.081 null] +>> endobj +5544 0 obj << +/D [5533 0 R /XYZ 90 149.51 null] +>> endobj +5513 0 obj << +/D [5533 0 R /XYZ 90 114.262 null] +>> endobj +5532 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R /F95 1788 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5552 0 obj << +/Length 1616 +/Filter /FlateDecode +>> +stream +xÚݚ[s›FÇßõ)xjÑ4Zïýâ™>´i’IÚ̸ûädÜÿà`Čvî6­–§ >#çÓäÏ Þ;Ê–bk8ˆ"Ué6RúE½‹Õ9t8¼Š‹ëÏXà1ý÷øè­[nˆ!HjèÃÆÉ}Ñ¢ÕŽŒ&U°KÊ6-+iJ«FgiyYà)Z +¼ÕrF±F\3gF’”ÿøeÓõ2ÞYbñÀ9¢šuúÙ² f¥©„ÙªL­³ ¸ºRázÑ:@–ÎDWPgƀ"øl…]ÿ¯a5 p>OâUVçs$´ª¬Óì2˜UnªÙ_iv³E°wv‹ËäÒâIC\»i9ð{=1VLgHÙ)1»”(ìÅcِ¢l¤¨>Rœ¡B·Q *ª‹JŸ,Tf4*Ïãæ_‹†´DÎ81?«y#Ä0™ø+œÉ4XzaìWi >ªßý0§ô6\…I¼‡SB5"Lï#5÷_7¸x°A\°N°¤bXд)ygmÞ ¶–Å«¹ÿز¨%‡Á¾·.’þºhøA°?ÝÍwûU@ª Ì“岂ºÆcÌ,V¬‡†\ùÉÖD¹ìLÄN7øˆn˜¡ ÕF~¶/„ +1¨‰­òqÿ(YS´°‹º+j¸t£ù–‚‡ë]Q7ûDh6cJ=7¼®]`uœ¨]³CJä3¸ùEMx6E³\GYxíÛ\Uä%ÈÌã¢Gΰ]Àl¦}ÿÙ@Îlʝá=c qøAK]ÓǺ 4ë“Ô öƒ:€sSHX`“S‚(‹ÿÙ}o6BàË1ڀŒ;*“ yä·Â¾9=±,›ù™hlÎ$ÐóSña[–˜@Z­KO#ÌÓv§F‹YŸlç–BŽaÙ½hsÎmœó>Î!„Ĺު²]Îy¿%ì°bÞï¦ä<ç»]o_æâÅa>{ñ˜‹]̱tƒ{ožƒ`‡›· ìزI͛[aûšªCŽc8kv]àj”‚A•tô¸ÇK]ÓóØ ‡½¬éïmZ"_Nå>jZJ¢Ú—ùÁÊÆ5ì#(}êýª<\ÎAŒC9¨wrðfdag=G¤!Lå”·Þª=3jó³œ&ÉÃòæÕ@6v÷ñ§Õˆ.‚…—?x¼ «ã°°ŒëöùP8h\íöC»°ä`Õ áP7𓠴'Y;†¾­ðI´Ñ'>1PŠŒî©QÒzP¼ºI³Çž¨ ä;|‚F¢Œ+Õ·“k«›µ—VÏ2’$ۗoP·ùÎ1ú`ª PPޓ*~2_/¡6xYì—UÒd‹*mæÍãù»Í³ýòâ*ˆƒ4mùÏ4YvŠËeEIž +wa|UA‡iožçWäó2ÀÐL)R°ò³K©h·:ÛPu}¡Å¢õK÷½©‘!zìk›× Â(^òŠwÂu’O^þfCyY½ÚP\–ï7¯‚ôÇ©n«^¼ö¢&ïnsSAÚYŒòCñi4…¬Æî§ (YŒì§úöûdÃFÓ_¢b¸F~‘e×ÇGGwwwh¾Bë8¼NQ˜AàŽZaëŒ:¯{ª6Rs°LÒ_¸¹Ü°‚ºñÿ–EÛ +endstream +endobj +5551 0 obj << +/Type /Page +/Contents 5552 0 R +/Resources 5550 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 5454 0 R +/Annots [ 5549 0 R ] +>> endobj +5549 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5553 0 obj << +/D [5551 0 R /XYZ 90 757.935 null] +>> endobj +5554 0 obj << +/D [5551 0 R /XYZ 90 733.028 null] +>> endobj +5514 0 obj << +/D [5551 0 R /XYZ 90 703.284 null] +>> endobj +5555 0 obj << +/D [5551 0 R /XYZ 90 689.356 null] +>> endobj +5515 0 obj << +/D [5551 0 R /XYZ 90 654.108 null] +>> endobj +5556 0 obj << +/D [5551 0 R /XYZ 90 640.18 null] +>> endobj +5516 0 obj << +/D [5551 0 R /XYZ 90 592.976 null] +>> endobj +5557 0 obj << +/D [5551 0 R /XYZ 90 579.048 null] +>> endobj +5517 0 obj << +/D [5551 0 R /XYZ 90 531.844 null] +>> endobj +5558 0 obj << +/D [5551 0 R /XYZ 90 517.916 null] +>> endobj +5518 0 obj << +/D [5551 0 R /XYZ 101.557 443.29 null] +>> endobj +5559 0 obj << +/D [5551 0 R /XYZ 90 429.262 null] +>> endobj +5545 0 obj << +/D [5551 0 R /XYZ 90 380.001 null] +>> endobj +5560 0 obj << +/D [5551 0 R /XYZ 90 366.073 null] +>> endobj +5546 0 obj << +/D [5551 0 R /XYZ 90 318.869 null] +>> endobj +5561 0 obj << +/D [5551 0 R /XYZ 90 304.941 null] +>> endobj +5547 0 obj << +/D [5551 0 R /XYZ 90 257.738 null] +>> endobj +5562 0 obj << +/D [5551 0 R /XYZ 90 243.81 null] +>> endobj +5548 0 obj << +/D [5551 0 R /XYZ 287.777 181.138 null] +>> endobj +5563 0 obj << +/D [5551 0 R /XYZ 90 165.676 null] +>> endobj +495 0 obj << +/D [5551 0 R /XYZ 90 84.327 null] +>> endobj +5550 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5603 0 obj << +/Length 1341 +/Filter /FlateDecode +>> +stream +xÚíYioÛFý®_A €KÑj.£)Ãœæpm¹hàM®%"¼BRvôï;K.%‹: Ë©ô‹Eɳ³³ïÍ۝Ybm¤aíMïå°78¶˜æ"×¢–6¼Ö\¬ÙAœmj—:!ˆ£O0Æú©A°î‰ïëY<‹°ð½wÑUáÓÃÃ7E}ʱþ*ö˲y<×¢0ˆ£‹4àÉbÄÒ)¡Æ—áÛÞÑ°÷­G ¬‘znn#›q-Hz—_°Âïo5Œ˜ëh·µU¢™”Ág¬÷þìáÎ: Z—sÚ.„2„-þ8 èÇ߁k}j"fºÍ„/šQ#p…keÁšØÈ¢fcýK”ñ$T~ ¹cɲaý¸1üm…/À fUy£ñx…ƑÔÙïÊÏ]òû®LBµ>£ˆ¸ +¸ÓÉUÍb††mêÓ\”5y-úˆ…LæY-úŸ)å c´Ë>&*pŠkõ/™ÅHeÃYmTsåúgŒi‰´Zð´vXÐæÉÙ:c?Ç6ÕX‰eʕȘ1‘k*¢†cÑ`‘NQ´ÀԞë§ìژÏÉ2›½D+§îRÀ\„<“!ÂÙ2ïErYX?OÒ Š²ôál¬ÄPòS ¡Ã›œú3æx-iz%"-!²eÄÕxϛY•Ïñ³ÍðZ„ë#‘ŠÂ¯„w‹¤›Êòk”†Ï/>œüutv~Q’5 oåùå$ŠC¥|.åæiìßDéHQß&D™‹ ’t e•†Éõ,E‰5ô¯a­ß†[˜KÈ>i ðj›àÒQ1‘Ûœw>-+‘¬òuŒÊGøY+Ÿ|:ƒXý»lbéȬ õ!ÿYì ë5œ‰@ÊaÄÂ;IóÉJ!„“$™>?…Ál]Ó¥ÝTPV…ÁÁ±‰®§!ˆT愌öÉì4•°´ÿ®Ø£á)2µƒäpïMsgÅFÚ¤3ï)ó{$+~| =,@~ú'Æî ÿ„‡Æg¯c#×ÆDŽqiÍÚ*/¡ølÚ&hQçvº&³Û -x²wì™'¨‰S?QUãIZ‰âFö)~¼Â7w·z¶w×ê2Ä¡}ë×í°ÕŒ} ü_fß;P-ô–– ã"Ûã$Aû«ÆtqX7chët±Knٌ·ƒ«ìû³m=P[wߣjê5-ÿ +¨‚»ç/>|ò^}|úîèï“á§]UÓ'úyêÞ£ÛÈ@¬ ÊP°²ŸC+šP²ï›ù¶‰l‹ªÌçûÉü×ÞùØï´±¤t!Xî.¯~]R^¬¸žq‘å˜÷Éëð‰¥µ…lȀ}¤õ$ EØ£úE^ºÉc£¾=¬ÏŠš ÷ÿäߐü›¶}ÆvJ~0ûTþ(Kýx»±§Î`{³8Ù¦¹‡ƒlcÑìÝ$ËܓàlÂøa;{ª¾î²È©±ÿ)Ó^ÝÄwo¤»&¾CuÍýîúz§­³·WÇE–x¯2Éԍü# +(v½5þîUpCZ›ía‡ÕÓQ *󨮾ü¸å—íõeI³›:þ5G÷õÁg×·7õ[`Òú™£^ÚȂ—wïÚOë¿HTü§í›æ«zm£¶ÓR¿œë +”÷~:i%$¹WœÈ{çæGŒäÁ*9@FŸÁŠÏE»Ï5+ûªµOôê/óx‰c#†i›¯ãªÊƒÛÛ[”h’Fy¢jçñ`Yow¼¡öÌÉu¦®÷“¬-;ðcâË»þ%üÿ¬Õ +endstream +endobj +5602 0 obj << +/Type /Page +/Contents 5603 0 R +/Resources 5601 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 5454 0 R +/Annots [ 5564 0 R 5565 0 R 5566 0 R 5567 0 R 5568 0 R 5569 0 R 5570 0 R 5571 0 R 5572 0 R 5573 0 R 5574 0 R 5575 0 R 5576 0 R 5577 0 R 5578 0 R 5579 0 R 5580 0 R 5581 0 R 5582 0 R 5583 0 R 5584 0 R 5585 0 R 5586 0 R 5587 0 R 5588 0 R 5589 0 R 5590 0 R 5591 0 R 5592 0 R 5593 0 R 5594 0 R 5595 0 R 5596 0 R 5600 0 R ] +>> endobj +5564 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.279 623.079 192.296 633.983] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +5565 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.794 623.079 258.726 633.983] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_092f5c04d267ab5709dda2d3e51aaeb9) >> +>> endobj +5566 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 542.317 134.164 553.221] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_0262a2b32220536d8bc60d84ad8dac4c) >> +>> endobj +5567 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.98 542.317 203.623 553.221] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +5568 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [287.787 542.317 373.176 553.221] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g616fcdc7600a3a11a8a9152e75730899) >> +>> endobj +5569 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 503.462 134.164 514.366] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_727dc2405cfc5f2252e6f21aa0f18074) >> +>> endobj +5570 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [161.501 503.462 245.954 514.366] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +5571 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 464.608 134.164 475.512] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_31603d81a2b0571a82c4c79b8c6e4564) >> +>> endobj +5572 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.98 464.608 222.432 475.512] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +5573 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [248.943 464.608 308.887 475.512] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >> +>> endobj +5574 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 425.754 134.164 436.658] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_0c02302b6281fa91ef9275bd37e43efc) >> +>> endobj +5575 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [161.501 425.754 239.328 436.658] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +5576 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 386.899 134.164 397.803] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_527ffa31e1581a8beb83a832244dada8) >> +>> endobj +5577 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.98 386.899 215.807 397.803] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +5578 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [237.336 386.899 297.281 397.803] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >> +>> endobj +5579 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 348.045 134.164 358.949] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_732d3b59f8a0ba21a72877d5fa4b98a5) >> +>> endobj +5580 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [161.501 348.045 260.888 358.949] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +5581 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 309.191 134.164 320.095] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_1ba0bd59426889233904d052224cab76) >> +>> endobj +5582 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.98 309.191 237.366 320.095] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +5583 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [259.453 309.191 319.398 320.095] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >> +>> endobj +5584 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 258.381 134.164 269.285] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_19623ff8cea2239d66331f29c1d0268d) >> +>> endobj +5585 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [161.501 258.381 180.102 269.285] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +5586 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.348 258.381 221.075 269.285] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >> +>> endobj +5587 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [259.489 258.381 334.955 269.285] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +5588 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 207.572 134.164 218.476] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_470e6a581b91bc6d5a4a6388d1ddde99) >> +>> endobj +5589 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [161.501 207.572 206.662 218.476] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +5590 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.526 207.572 332.993 218.476] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +5591 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 156.762 134.164 167.666] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_df002bbcc4dcae5efdb56bae2971a64b) >> +>> endobj +5592 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [161.163 156.762 233.431 167.666] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +5593 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [282.546 156.762 358.013 167.666] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +5594 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 105.953 134.164 116.857] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_f306aa1f4e34bf045cd07e5ac11d8f68) >> +>> endobj +5595 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [161.501 105.953 180.102 116.857] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +5596 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.276 105.953 295.209 116.857] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1From__Covering__Box) >> +>> endobj +5600 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5604 0 obj << +/D [5602 0 R /XYZ 90 757.935 null] +>> endobj +218 0 obj << +/D [5602 0 R /XYZ 90 733.028 null] +>> endobj +5605 0 obj << +/D [5602 0 R /XYZ 90 640.15 null] +>> endobj +5606 0 obj << +/D [5602 0 R /XYZ 90 640.15 null] +>> endobj +5607 0 obj << +/D [5602 0 R /XYZ 90 561.29 null] +>> endobj +5601 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R /F11 418 0 R /F72 471 0 R /F35 2018 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5659 0 obj << +/Length 1623 +/Filter /FlateDecode +>> +stream +xÚíZYsÛ6~ׯàS*ÍD0@<ÒÉCã&ž¤qâÚêL3I†CQÄ)¯TTõ×wqiZvTËr:yH.€=¾]ì‚ÀÚBÃÚÙàÅdpòÊ24¹–ni“¹æbͶ¢:Ñ&3í㐤“ј`Œ‡#‚‡~ûÞÅHÇÃ4Ú,Ù,÷½·á4÷óͳggy8uŠ‡§‘_²{Éæ,gȒ€ÁL–A¬¡NŒÑçɛÁËÉàˀ/X#bmj#Û Z>~ÆÚ Þ¿Ñ02\G[ ªX3uÚH»ü>ÀJŽ›Z!Å[òl!Óp4›`¤C+„ü¤ëT°ÓŒçüä ÅØåÙ@û8¦ !á6%¼çB~ÂiR”êcÏpNv¡t–&}“<ɖOw?Mã,b#B‡‡åƓZî™)hÑ=ÿåÝïôýùÅۗ¾ž|^IGZٞ¼²uÍUY&W•®#ËÔµ11‘SÁáÅ*Œf`XƒC_6 atޛç#“Ó¸õ9S"‹O‰|·*Âd¡¨¢Eš‡å2V“®—iÁdW HãBÈw³”)Â$-eGRŒ).Ê¥Ÿ&ªSd,?a¬W$Ó —O·ÄÅ )F.u¥¤ru±² m©†ÈHbIŠä¬¯ç=³Ù¶[QîžÔB˜V”aÑ3™%EÛ¨=óÙ¤fò)÷Fµ“Ô=ÙY(¯%Ã)W%X¸”aÑ¡,b?ŠX¡> ýò¿ôÄÛô:Ïc<ŽØV[»Ù²‡a °©Ûhµ£ V[n=6 db«eëÝú¦áO6#‹»O¿ÏG†=œ… Äð‘Z*ی…Üù*(SˆÞ„|£=ª…„=ìû²Ç“ݪL3–ûÀïóƒØr/KÉ'҃`÷,Šp‘Ä,)G5Çܤ~£eˆ%’Yé!®»5µk!jVÍèq8Y¸öúrY’6‹`«¢ñ“Y_à¢ÈrõŠ¦/^ÙÈÒëhø‰”hª$… e¦É8L8tý2œJø"®ÈÝhj4ÛJNÆÄ6Ñpw¹ºÚ½ÏY<-ŠU_­’ „EUîQ.}¥è_SÙ¾KՋótÎ7™búšñ»ÙD + †ÉüfP×ñÊMÆnÃ*2?`^=ò&\ h*×m~;J!`‚H6V‘à’•«¼Ñ]ג +²óÎ÷¯LĈ†_مt/J‹zShá˜8о$ƒ)Ȟ{†(¢•ÁÊz{úó‘N¹¼zrx³¶*­`oÑ£¸G»- <•¬„ó>ƒ@‘{_‘‰leAKqVn~Vøàåë²Dˆ“Š'±ƒuÁ»3̃! $‘†è¼Çi¯Ð…pàÅv6}Q|*¶yHßJïjS”,¾ƒzXñAÉWaFrڊGìËʏD¡Ðð'¶VÁ£›PQb³Úôšv6JïÌk(s:¡³ðã*1؁G•9ô± + +sì»dö¨ï @®/ËR´€1qø›yǀ¢#ê[Þ>üH>Ô¸„¾À%´[¸tŒ\òa-\:F?.u°‘K­ûÀ¥ •¦ÝÁ¥£JgÉP¬z\›m\r‚>\rU‹ì°Uô)@š<׸->*0Þ¡@¼.ò?ÌêÃëÝ +• ž£x½¿uz¢çG{zäQi·¬çÝ©ó-šV •ŠðM$‡yšÇG5/…¼3–ÈŠzcðÓ%oQÍóXà¾àÉ#gª)¾ð¡ðý£úÝPsólqc +å=ˆ<Þ%‹ü²[ܨé\Q{bÝÿÈ©‰y½ætY9I9Ô·eÍÄù¼<Î)׌%}¹§á Ã¥÷‘{¶ÒäÇQÍiÓâ†ãckϓ˜Þ¡ô?á\÷HøiGŽ^ -êäß'ˆú0D‘áì !ŒLû»…ÐAÑó;‡ÇÎQ·/U÷o_?BÏõýëðQ`™¦i´Ûžaá‰óÖ}òÅî} ä#Î]¯sT×5,äÚün†¸ŽB]D©Ùùv!rÅH[–eöìäd½^£ @«$Ìr–'Y\ÿÍ´5 1‘]O2¯~®ÄiΪ’‘ׇô¨«ÿ°@»© +endstream +endobj +5658 0 obj << +/Type /Page +/Contents 5659 0 R +/Resources 5657 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 5454 0 R +/Annots [ 5597 0 R 5598 0 R 5599 0 R 5619 0 R 5620 0 R 5621 0 R 5622 0 R 5623 0 R 5624 0 R 5625 0 R 5626 0 R 5627 0 R 5628 0 R 5629 0 R 5630 0 R 5631 0 R 5632 0 R 5633 0 R 5634 0 R 5635 0 R 5636 0 R 5637 0 R 5638 0 R 5639 0 R 5640 0 R 5641 0 R 5642 0 R 5643 0 R 5644 0 R 5645 0 R 5646 0 R 5647 0 R 5648 0 R 5649 0 R 5650 0 R 5651 0 R 5652 0 R 5653 0 R 5654 0 R 5656 0 R ] +>> endobj +5597 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 707.084 134.164 717.988] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_36cc3783cdc92ab5fc69904c298ed12c) >> +>> endobj +5598 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [161.501 707.084 209.431 717.988] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +5599 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [232.624 707.084 308.09 717.988] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +5619 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 646.559 134.164 657.463] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_a28d735beef86789b73b41dbbde71abf) >> +>> endobj +5620 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [161.501 646.559 181.755 657.463] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5621 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [199.319 646.559 274.785 657.463] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +5622 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 607.952 134.164 618.856] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5623 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.904 607.952 185.71 618.856] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_1ba97c180500b43954b09532151f6c9d) >> +>> endobj +5624 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [213.048 607.952 233.301 618.856] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5625 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 533.657 190.738 544.561] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +5626 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.236 533.657 261.85 544.561] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_fc06f600e94b7bedb91d0371a51f4c38) >> +>> endobj +5627 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 497.289 190.738 508.193] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +5628 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.236 497.289 262.159 508.193] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_90ca2b1613fda31a2ac7e79d9388680d) >> +>> endobj +5629 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [329.225 483.912 390.082 493.817] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Affine_Dimension) >> +>> endobj +5630 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 460.922 202.922 471.826] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +5631 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.42 460.922 248.58 471.826] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_53b24395ac61f8b2b2accc5a3900bf69) >> +>> endobj +5632 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 424.554 202.922 435.458] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +5633 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.42 424.554 296.181 435.458] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_880344de195aef75a6b3f2a4db4787b4) >> +>> endobj +5634 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.616 377.228 233.069 388.132] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +5635 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.808 377.228 295.594 388.132] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_8688fd38682b19e97422816d72524790) >> +>> endobj +5636 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.616 340.861 233.069 351.765] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +5637 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.808 340.861 343.195 351.765] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_453e51570268eb4d63fc529130a54440) >> +>> endobj +5638 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.616 304.493 248.003 315.397] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +5639 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [258.742 304.493 323.26 315.397] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_8865893c48cc07adae5dca6b35081751) >> +>> endobj +5640 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.616 268.126 248.003 279.03] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +5641 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [258.742 268.126 370.86 279.03] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_6ae1850664122e9917f174d10fd3bf06) >> +>> endobj +5642 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 231.758 205.692 242.662] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +5643 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.19 231.758 261.312 242.662] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_d14942b33fb82bb3e6a13e5e92ada475) >> +>> endobj +5644 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.65 231.758 338.781 242.662] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +5645 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 195.391 205.682 206.295] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >> +>> endobj +5646 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.18 195.391 261.302 206.295] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_803035024ab9670971868f4b1092f7c5) >> +>> endobj +5647 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.64 195.391 353.705 206.295] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +5648 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 159.023 205.682 169.927] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >> +>> endobj +5649 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.18 159.023 261.302 169.927] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_6f703ba611b9e5ff613f4df35347ee95) >> +>> endobj +5650 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.64 159.023 330.462 169.927] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5651 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 122.656 205.692 133.56] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +5652 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.19 122.656 261.312 133.56] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_ce98c3e57a1237e6dd5042b5a0919193) >> +>> endobj +5653 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.65 122.656 332.156 133.56] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +5654 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 86.288 183.824 97.192] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_2f31170286d3abc2f4867d0b193ae8bc) >> +>> endobj +5656 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5660 0 obj << +/D [5658 0 R /XYZ 90 757.935 null] +>> endobj +5661 0 obj << +/D [5658 0 R /XYZ 90 626.922 null] +>> endobj +5662 0 obj << +/D [5658 0 R /XYZ 90 548.612 null] +>> endobj +5663 0 obj << +/D [5658 0 R /XYZ 90 514.267 null] +>> endobj +5664 0 obj << +/D [5658 0 R /XYZ 90 477.899 null] +>> endobj +5665 0 obj << +/D [5658 0 R /XYZ 90 441.532 null] +>> endobj +5666 0 obj << +/D [5658 0 R /XYZ 90 394.205 null] +>> endobj +5667 0 obj << +/D [5658 0 R /XYZ 90 357.838 null] +>> endobj +5668 0 obj << +/D [5658 0 R /XYZ 90 321.47 null] +>> endobj +5669 0 obj << +/D [5658 0 R /XYZ 90 285.103 null] +>> endobj +5670 0 obj << +/D [5658 0 R /XYZ 90 248.735 null] +>> endobj +5671 0 obj << +/D [5658 0 R /XYZ 90 212.368 null] +>> endobj +5672 0 obj << +/D [5658 0 R /XYZ 90 176 null] +>> endobj +5673 0 obj << +/D [5658 0 R /XYZ 90 139.633 null] +>> endobj +5674 0 obj << +/D [5658 0 R /XYZ 90 103.266 null] +>> endobj +5657 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R /F97 2175 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5717 0 obj << +/Length 1519 +/Filter /FlateDecode +>> +stream +xÚíZËrÛ6Ýë+¸JÉƃ H/›I2“¦3Žãv“d4”YlùPIʊûõ½AFJ¢mÚN\-<„hàââ܃ƒ غ¶°õnðëÕàì­Ç¬õ¬«©`KxqJ¬«‰õÙ&Q✌±}ál‡y/Ší,¾ÉI?D£<ÌoÏÏßåÑÄ9¥Û¯ã°(ªâ¥œÊÜ!¾-Ó±K#žM‰ë|½z?xs5øg@ÀlÝ7H0n“Áç¯ØšÀû÷F,ð­¥®•X.eðŒ­OƒlƱùÔãÔòa\ž«ÆE\Œ(e{¼Ü¥,yZ(O¾RaD˜¶t½2_ȪҚM0XՕ¢i5Þ05di|[•à_ºu¬´vòiÓÅŒY‹.ò°ß¸1‹Š]n4^µÕS&óÒxq ÑAõ]°½åx… §„SˆµN)Eq§”ò5+ÖçSìeYlÞ«`æ×&ª—º††¡.Òȡܾq·e^ÈMCªÚÌ1ü‘Êëq–e«×›0P乜f(pÅËpõ@oÔôÂ6€ùĹÌæYœ]Gã0Žo‡ã8+ää1B þrú uª +µÖ V¡«ËÅbTÈÒ¸lÆPÎ 1nä¸ÌrSq‚Ã$¼/S0Åï)“¨ø+‹Òr8ͳdEV‰±Ã”^zZš¿º}(¿È‹å—ê}Û áÈ h]ç¶Åˆ@m†æ¶¡XÍ;²Jx»¼_VsYÊÇÒòâ5G#¨#[þ:1Êéäq•/ø/> ÀgÍ 6e¥Å$B³êZæùŒc\»Æµq£Ó8cVýX†E¤F•5Ú.¤ *w&˜ßC§5Xl(Ê\aGôw¶·ÿt!°öDá(nUùµÍóŸTèש±ÆŸXp·{ >b>ٜóÂj¢ÊuŽ¥-…-¿ïó>8J'A]énü¢¦à¢¯UC+^¡Ëa8Ê Õ¾óiæÀ1̇o¾ÍsYQ–¶æœZÛ ÊËcŸ„Qîb}ÉÙC;ŽÿÞî¹hG]äö´IØ°-ÊÑ#垜râ!”cÄ·“ð[”Dÿn #A–)Y¦*5,SÙÄɃ̳_grª¨Óq$·S£OT¯žÝûrûgšX@3áUÜÂ@†À¤äa}Ûº-«m4PÎÅñ¢N̛<-™/Ê»nÎjÝ~ø²uԐŽÂ×5ääÀ™¤Leª3׶[oÀŽ*tT¡çV¡&- WNªâr&ÍñnÛ9q€h¸WÒ´ÊXX Aõ‹Lgk'É÷”D̑GzÙA²€ÚI”¶kbÀ:i"˜8¬‰P©«&ºÔï dàÜ«(îÕϖheIi¢j±_XÏ«ºl@@ö»([W4¼­hx·¢q·/Ecëbƒ[ ïR48è¤h[ìT4øìJ—fø;¤,ÀÁãHß+eîA%‹RE×GN¦ÄQ8ž@8¼uáøI’©£ô¥§· Š ì³.ÔS%P$ÈõݾÎB›oTNjÏóm°ePõ÷]ïàˆù÷;Ö$F¢Ÿ# ½k)óh\ª dG= ê8[“yÃ4l…ýjóJ°çk.u¼¬oþ+=è±ºÑ î©EUw~UËù…þ.š'F³/êë̎ùê¢ï4W?þ(dþ‹Ã¹m÷÷0]„±Óð¯¾Îª²4ý"ŽUÌBÎ)#Øþ$ë\°ÙßV]úm ±üî/ña5ÂͬYYÎÏÏΖË%h‘FóEåÙ|Ÿ­Á¸1j™hŒLë{I–7«¼LÂ|^àÿ!I +endstream +endobj +5716 0 obj << +/Type /Page +/Contents 5717 0 R +/Resources 5715 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 5722 0 R +/Annots [ 5655 0 R 5677 0 R 5678 0 R 5679 0 R 5680 0 R 5681 0 R 5682 0 R 5683 0 R 5684 0 R 5685 0 R 5686 0 R 5687 0 R 5688 0 R 5689 0 R 5690 0 R 5691 0 R 5692 0 R 5693 0 R 5694 0 R 5695 0 R 5696 0 R 5697 0 R 5698 0 R 5699 0 R 5700 0 R 5701 0 R 5702 0 R 5703 0 R 5704 0 R 5705 0 R 5706 0 R 5707 0 R 5708 0 R 5709 0 R 5710 0 R 5714 0 R ] +>> endobj +5655 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 697.372 192.272 707.902] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_59634a195948ff0617177d0a41e30602) >> +>> endobj +5677 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 660.136 241.935 671.04] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_dc7cdee1981f44b5db23f6c28c79d0a6) >> +>> endobj +5678 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 625.267 213.163 636.171] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_621d377682c2c67051c24b1cc8a03497) >> +>> endobj +5679 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.501 625.267 260.754 636.171] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5680 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 590.772 189.901 601.302] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_2528b5f433e743dda827b1028b6c74cd) >> +>> endobj +5681 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 555.902 193.229 566.433] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_1a5606b64a035977b9d76b1932227246) >> +>> endobj +5682 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 518.667 238.459 529.571] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_0047a6aa4f26d9133b9d741f68384f38) >> +>> endobj +5683 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 482.179 187.689 492.709] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_3ac47497148e61f3d7a3da09d17a03bf) >> +>> endobj +5684 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.505 482.179 226.693 492.709] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +5685 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 446.936 228.895 457.84] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_a033cfca735240b3699b523d60ad692a) >> +>> endobj +5686 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.232 446.936 333.482 457.84] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +5687 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 412.067 229.503 422.971] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_fde364ce088f82cf2b9a231e7d9f2abc) >> +>> endobj +5688 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.84 412.067 334.089 422.971] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +5689 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.98 377.197 187.264 388.101] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_042613c3f4ad30b298d70143c935d7cd) >> +>> endobj +5690 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.963 377.197 293.213 388.101] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +5691 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [325.131 377.197 371.148 388.101] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +5692 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.711 377.197 455.727 388.101] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +5693 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.98 319.414 187.264 330.318] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_8fa02815bb561135934f91c9adcd0cb5) >> +>> endobj +5694 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.963 319.414 293.213 330.318] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +5695 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [325.131 319.414 371.148 330.318] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +5696 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.711 319.414 455.727 330.318] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +5697 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.235 307.459 220.058 318.363] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5698 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.717 261.631 186.348 272.535] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_0d8ed7a0e48fe76e7221842c780192b0) >> +>> endobj +5699 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.523 261.631 293.772 272.535] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +5700 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.35 261.631 373.367 272.535] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +5701 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [410.82 261.631 456.837 272.535] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +5702 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.717 203.848 186.348 214.751] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_53f980fb1ac8fa21265bec985bd1382f) >> +>> endobj +5703 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.523 203.848 293.772 214.751] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +5704 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.35 203.848 373.367 214.751] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +5705 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [410.82 203.848 456.837 214.751] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +5706 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.581 191.892 218.404 202.796] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +5707 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 146.064 180.496 156.968] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_d743f8b71eb68f6b41f7ea7b5d21dc22) >> +>> endobj +5708 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.834 146.064 228.087 156.968] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5709 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 111.195 213.153 122.099] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_8d2cc5d18d050975101f2860f2919da8) >> +>> endobj +5710 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.49 111.195 260.744 122.099] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5714 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5718 0 obj << +/D [5716 0 R /XYZ 90 757.935 null] +>> endobj +5719 0 obj << +/D [5716 0 R /XYZ 90 714.099 null] +>> endobj +5720 0 obj << +/D [5716 0 R /XYZ 90 572.629 null] +>> endobj +5721 0 obj << +/D [5716 0 R /XYZ 90 535.768 null] +>> endobj +5715 0 obj << +/Font << /F63 374 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R /F50 339 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5773 0 obj << +/Length 1552 +/Filter /FlateDecode +>> +stream +xÚíZm“Ú6þίð§f‚Ћeٙ¶3mÚ»iÒL¯¹ëôC’a#ÀcˆmîJ}W–_°1ˆIҙûrg›Õjµûì³+[ؚYغîý|×]9ÌòçPǺ›Z¶„C§Äº›Xoú„ JC‚1îß îËx!Ç7ŠûËp3W“XŽÞÇ2Þ<{v“ÁrÜÊ$1—¯ÕTÅâöUä+Ðä0âô)áƒww/z¿Þõ>ö؂-’ÍÍŒ[þ¢÷æ¶&ðü……ó\ë!“ZX6eð?´n{öp¾¼½Ž·ÖCˆ@Œ”!ìp³¨·”šé‹qÙ <‰ä"Ûqá‡L8U‹U(S¥Œ®À¶JŽ +dÛ^!ø½‘¨irwRÓf¥"¹PÆ/¿E©Šï”÷eØ¢›{ˆ—#,UW+z q[C‘Çó•Ýg(˜Õi¯Æ³Ü½¯¯{֛lê™JÇþr@8ÈÃÑlü~ùOÍ'¹ì[Ìñ^mýŸƒFW„Ô¼oƒ×iÍC-Šš1ȲҭM?훋1a=ä1­×.žÀzamÄÃ_FIZÓ^Í"(Âs;ó:áÚí .(¸=ϒ¿ã U9ÞÓ¹*tê|¹Ï¼kžhgÓelìó¼-ݐdˆŠÂÀ·3#°­„läà +›ó 125#ëÄ…P¥ËEÄAÄc…Pý†"-SEµ:¨–C[ð$.C¡Ö>‰»'óekÏ,ÃØýãå>tfcÇçÊÿ0Ž–ér6Ýü0Í+Lԁ¦96©‡ù9è× ö!u05ÿe6bDb/ã@Fi.-ãý\ ‘i@ˆ©švke^§‡ÌAØû˜‹¸íûnWÒÏõÿ,T”ËÈÜÞN4ƒ]%"_©Å{x–]_­#?…%Žeš ÉM~±œÓMc©éïéVÖ1dóãPp{ÉÉØ+šÅ묢ìAÅv ÷(z~PÉ–ÁæT¬P³ÆŸ&“"îòV¹ë–Ó‹[ó7ÒÓó« +€?kËN(i¸Ló"Ék”âAõv`ñ)FÑ-Á™<  ~Û,G€ø\¨G,£ÉxDÁ"ø÷’Pø¿!¡ž¢É&.fߔIùCK‘€Î9;O:Cv“µ_rMiŽù)Y‡éiH¢‚ ,H×\2ÏT¤b™šº|&ˆ4Ž¯)zr¥£4+;ð™&zm‹îð +{šÑÅryÙ3µ!KwÏô$`íN ÷ Œ5Úèù…ÝEß8$g¶+T@« +ƒ;jWvÕU=¢ì›BÙ%éîDžÓ:%Ìñ­ O{ •\¸r*ékÌwêhц·à¶íöª‚Údâ"æ~º·_›µ0CžàÇ5WÇc$V™W7~¨ŽÌþ_'[›ïF{Ó +#b‹NÐÒe×ÔìtÙ'vѶ<Ïî²¾@B9¢üF ÝôØõÊTï±»Ú¥]®01ìè›.±¸pŽæ×bò5ا۝ý­ô:Ž@Ô¦èu’4–A”~©PÒÕ»ÖÂBaëïÑ®Þ2²½YR×Á½ U”–U¯LMŸû  %æ"\Ôo™ŸŠÏìpÀt·$›®^åí°î=B¤Cˆ<-Þ«'ùyŒ:$œ¬.@8I'p:X¶ºªZ_V;¥i ¶+é²6qFÂ.Íñ[«)ˆðs·ZËí¶/ÐÒ==Bç‚Ðyz)Z:dçïç?ÅQ;êËá‹>â«j—ؐÄSðy¤§cé)VúD¤ÆA:ÿ–¿ëçÅï¯Dñö©uN®^לð]×Dϸ­à öì¶ýe?ú7Ïñ9n†#ñÇöä ؘcˆú·Íäw…Go²|‰¹ïoŠ3ˆæ6?ˆhn Pñw΋¯B¯d´–ù9 ¤üè[uF#}@Lc †Œàþ­*dVöÁ*®^ö2wVöW †KgÍÓtõl4zxx@~‚ÖQ°ŠQŽV«p´{TfK ±‘(•èCb&—qù=.¤>¥Søÿ?ù2 +endstream +endobj +5772 0 obj << +/Type /Page +/Contents 5773 0 R +/Resources 5771 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 5722 0 R +/Annots [ 5711 0 R 5712 0 R 5713 0 R 5735 0 R 5736 0 R 5737 0 R 5738 0 R 5739 0 R 5740 0 R 5741 0 R 5742 0 R 5743 0 R 5744 0 R 5745 0 R 5746 0 R 5747 0 R 5748 0 R 5749 0 R 5750 0 R 5751 0 R 5752 0 R 5753 0 R 5754 0 R 5755 0 R 5756 0 R 5757 0 R 5758 0 R 5759 0 R 5760 0 R 5761 0 R 5762 0 R 5763 0 R 5764 0 R 5765 0 R 5770 0 R ] +>> endobj +5711 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 707.957 218.733 718.861] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_87e253a2b1d8e1696c2ebf3feb11dc5f) >> +>> endobj +5712 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [222.549 707.957 241.149 718.861] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +5713 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [249.396 707.957 282.123 718.861] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >> +>> endobj +5735 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 673.088 161.677 683.992] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_8edc85ba3e8a09593959814eaad72499) >> +>> endobj +5736 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 599.673 212.377 610.577] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_1287b254a91451368e7e2e456f448114) >> +>> endobj +5737 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [239.714 599.673 289.846 610.577] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +5738 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 564.803 274.563 575.707] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_ccb5584441a7c7c84de73810cc6afbc4) >> +>> endobj +5739 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [301.9 564.803 352.032 575.707] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +5740 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 529.934 225.109 540.838] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_d09e4e3f9a9da562c6cdb73dd7b47fbe) >> +>> endobj +5741 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.446 529.934 317.512 540.838] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +5742 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 495.065 287.295 505.969] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_880be9febc6dab2cdccbec8814c9a952) >> +>> endobj +5743 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [314.632 495.065 379.698 505.969] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +5744 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 460.196 216.252 471.1] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_a26f672c32271db69ed68fc60eee8cff) >> +>> endobj +5745 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.59 460.196 328.042 471.1] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +5746 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 425.327 254.827 436.23] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_85b2560352485ac05d10aab0ee483252) >> +>> endobj +5747 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [258.643 425.327 343.096 436.23] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +5748 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 390.457 278.438 401.361] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_726484f44f6e6653f9c0126e94e51ab0) >> +>> endobj +5749 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [305.776 390.457 390.228 401.361] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +5750 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 355.588 317.013 366.492] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_c587faeb0edfd2582564b9a8fa3335bd) >> +>> endobj +5751 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [320.829 355.588 405.282 366.492] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +5752 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 321.092 205.752 331.623] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_9e87405c740d202951ba788f9e52cbf7) >> +>> endobj +5753 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.089 321.092 276.595 331.623] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +5754 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 286.223 267.938 296.753] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_fa7b390fb34934e419263a5fc694c946) >> +>> endobj +5755 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [295.275 286.223 338.781 296.753] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +5756 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 250.98 209.627 261.884] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_943c42b0d1b3580e54b3ab60aa55255f) >> +>> endobj +5757 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.964 250.98 314.791 261.884] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +5758 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 216.111 271.813 227.015] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_7704df6970b9563ef9e51793126c0ae2) >> +>> endobj +5759 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [299.15 216.111 376.977 227.015] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +5760 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 181.242 248.202 192.146] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_145cc7c23d407576222e5af347f401c1) >> +>> endobj +5761 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.018 181.242 329.845 192.146] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +5762 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 146.373 310.388 157.277] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_2a66994a33d910d0fe8daccc6cc017ed) >> +>> endobj +5763 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [314.204 146.373 392.031 157.277] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +5764 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 111.503 243.37 122.407] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_953a608f6f9d413870fb3eee5cc6ad1e) >> +>> endobj +5765 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.708 111.503 320.839 122.407] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +5770 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5774 0 obj << +/D [5772 0 R /XYZ 90 757.935 null] +>> endobj +5771 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F35 2018 0 R /F11 418 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5827 0 obj << +/Length 1954 +/Filter /FlateDecode +>> +stream +xÚíZ[oÛ6~÷¯ÐSg3ËHQö°m±­²&ÝK[ŠM;ÂlI“ä¤Þ¯ß!©‹/²âÄjÓy’-Q<~ç;G‡ÄÎÜÁΛÁ/Wƒ³×‚9>òÎÕÌñ±ã ‚8%ÎÕÔù0$Q2ŒñðbDð0̖ap1¢x˜,Ö7jš…ÁÛè: ³õùù›,šŽÆ”ãáËE˜çöç;5SوȡŠ' +fŒˆ!%bôéê·Á««Á?º`‡ÙÜCãÎd9øð ;S¸ÿ›ƒó¥sgF-—2¸.œËÁŸ\ځ7íáxÃB<$à 2„·F}¤”ñÕ{·1oY`ƒ}¦uÊæ¥rïÌ(mP¦>bLcÜEÅM0Iây¶Ò¶å»SêÁ1Ç0$/ºç|YÏ\®óB-Ûæz1™ç0ÙzV]Ï^{ԑ`·pµÝ”"ágL(’ÌZý>W咄ö2IÒµý•Ì쵸QÕ£Æ*s#ŠµT ßB¨‹`Å@¾êÙA[š‰˜$՘"±óe#æ KGڗ|ã%tÝê%ÆZÄ»HàZxqµI§ËÕÔê¹Æƒ[ÈS€ŒËáJç{_9y‘…Q\œœŽI^L…ò(À€#‡•.»XÁ¼Ù`¥e­t¤~@!¾ õ5€’÷‚”NŠÉŸ14C|DD½8“V–zÇß%ˀÿ\¯Wš §Ó`©8˜«Xea‘d§àF'õàM5SvNÊN?O§GCg® ­‘Ah¥ÿw#H"·IBóãTËÌ­Ý[ +uécöG0”7°ØO‹8)¦âd_ˆËÔD»a=Y¨£áwpÖ¯ºÇƒK2ĄÿØÚI°[ØêÀ ñ J9|$U]'ÉâÁ4„ñ4XFq´ŒþUß2g‘gÒ:•´~ÜLÑÓÕ$Šç;ÚÛGùjQœBp½à´‹ÜŽí2y¦º/ ·‡Ðâqùt×5ÿÃõ׈2 ³(¼^´ât?g'¤Í—É2]ºÖgŒ4G˜¬Q<Í"]ˆOÂ"Jö¬Ò£Úɇbà ÿò‘÷ÁÁEמþ°²Ú—ËžªIQš“Økž†ºaÅN£¥ŠóRï½&FDÖÔwfmQ!q7 È¸; ó<šÇ‡Z†Áá†B€ÃZŸ}¿Éqø#aY0ò¹º{N( <­ÊW €#ʀ­HȃKÕÞ$)’àZ"Õô¢m‚ƒ»^wppWzšÁ!ñyÁ!K·cCK݊ ­¬ŽÊ*s#WŨRÐÞ°Q£oÕQ“·…Ç‘än“(ôŒõ@PÏö¼mlo­O‹ ÉäÝoÄØ®/´Å˜ÔÒ>¼{Jэ·x¯ÁŅÊrXSXšÀzèÄZ»5¬Ö'U+F­¼cu˜DRô±8 È«)X*„'™BÄ:ª£@ùXôQo©ee[Üp$üz̺eŽš0x(Ö¢¤·Â¹g}~àõºgÌõˆ¹/Xi?ŸGiª²à:Y.Ÿ©°– æež4î²?Ï:*}äú`E¨²/ºÏÀîÁ |n1څ‰˜¨'‰ÊF‹Ò)ÍxÞX• ‚ê±]"5-û I‹`Ÿ ¿ùÐ벀aA­`‘­Ô½UjZp« T5­XX±ì.ÊU‹¤1õ)(Í˯Ár¿j.òV‘>".ÙÙēù°ˆâH’öYqL£™î¿ÍTfŽû<{¬ßi®n¾µ‰Ô>4 «–µx 5Î=@D{×û Êâ!*h_\ŸGËtÍÖÁ*‡|¤Ïœ–è‹o¢¾8Q Ù§¯aÄkA•¥RÅ8-S¸Ênmz÷yéâÃ}>ýòÁ>Ÿ$~ï†ØFŸ»ÕèÓº¶f΁ˆÙñp»®§“rK`¸0°Ö£ƒÌ9ß&óZ×*” C‚q·†@%ñN]Õþ]e µL‹õˆóXlö“"¸‹‡¡É(#2% d~2 ¢e8WûÍá“öƒ8ó«ý ÌùX:¼'¦µÌ·Q¬Â,xõ9ÍTž·u­aæ–BÒ͹_&ª6o©¸tO·ÈÏύԲ,‘k67 ^áå©ÝL•9Ó®ÖTÅ |4éýŸöçLb¥½¢ùåXŽ!:6ØŽaòÀFŒKui?¡¹‘˜º÷Ô@™ÐdÀòh›¹ðÐж»©{l’¶ï¥z .Ñ­D(¤MU-«J~ÌVqQZÒ2LS»±n7 ·Kš¡› Œ{gÀ g™Ý¹MÉ[Ž°l ·Ev·lí\Ñr^¿æ<Ãɪüš¼^·m|»¨ÞªPz–>ê ·Q)T²ÞÚ`÷ؼ€×ˆ<öÔ|uJ^ ߺ¶§þ¹æZ× +»ªøòÂìÈgËòtËEuäßþ-ÏýÛ?ï!Õý É³$Ó?Âx.Fu™p«§RYãxŒ`y¨NH 0{©*ÔZËþvª_¿Œ}‰ôk¾,nŠ"=?;»»»C“­â(ÍPTœ¥éâlËm;VˆøX³¤ì,,“¬Npsirõžÿÿ­õ¬ +endstream +endobj +5826 0 obj << +/Type /Page +/Contents 5827 0 R +/Resources 5825 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 5722 0 R +/Annots [ 5766 0 R 5767 0 R 5768 0 R 5769 0 R 5785 0 R 5786 0 R 5787 0 R 5788 0 R 5789 0 R 5790 0 R 5791 0 R 5792 0 R 5793 0 R 5794 0 R 5795 0 R 5796 0 R 5797 0 R 5798 0 R 5799 0 R 5800 0 R 5801 0 R 5802 0 R 5803 0 R 5804 0 R 5805 0 R 5806 0 R 5807 0 R 5808 0 R 5809 0 R 5810 0 R 5811 0 R 5812 0 R 5813 0 R 5814 0 R 5815 0 R 5816 0 R 5817 0 R 5818 0 R 5819 0 R 5820 0 R 5824 0 R ] +>> endobj +5766 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 719.912 247.246 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_f1ab967a6606266f7e583fc9752667fe) >> +>> endobj +5767 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.583 719.912 359.035 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +5768 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 685.658 236.745 696.188] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_82b76e3f18679ea161b53bfa80349009) >> +>> endobj +5769 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [264.082 685.658 307.588 696.188] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +5785 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 650.657 240.62 661.561] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_8f97dbc7a7c307fa72f7e904b2cbf21b) >> +>> endobj +5786 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.957 650.657 345.785 661.561] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +5787 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 616.029 228.984 626.933] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_19422844125a988daaf489cbaff3835b) >> +>> endobj +5788 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.322 616.029 355.708 626.933] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +5789 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 581.401 267.559 592.305] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_214e376adb9dc271c61b58f8b2c927f0) >> +>> endobj +5790 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [271.375 581.401 370.761 592.305] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +5791 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 546.774 291.17 557.678] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_1522764599cd8547bfe4ef7e88d8baec) >> +>> endobj +5792 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [318.508 546.774 417.894 557.678] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +5793 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 512.146 329.745 523.05] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_4d6e94fc9839cd5d455f195f46fc2dcf) >> +>> endobj +5794 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [333.561 512.146 432.947 523.05] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +5795 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 477.892 193.577 488.422] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_e5dc5003b3652660bc4ff4a15e4060af) >> +>> endobj +5796 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.393 477.892 232.581 488.422] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +5797 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.059 465.011 248.845 474.916] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +5798 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 432.305 193.577 442.836] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_26f845c3192c71f59cf1c81cd35072c5) >> +>> endobj +5799 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [220.915 432.305 277.691 442.836] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +5800 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.892 419.424 252.677 429.329] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +5801 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 386.345 223.465 397.249] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_c9d9eaf8b76024bc20ce524e13bf86a6) >> +>> endobj +5802 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [250.802 386.345 271.056 397.249] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5803 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 351.717 285.651 362.621] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_59af9a947f610641fe02639f76cfc90e) >> +>> endobj +5804 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [312.988 351.717 333.242 362.621] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5805 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 317.09 229.552 327.993] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_9831db06919c6ee05360b08e84cccbb7) >> +>> endobj +5806 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.89 317.09 277.144 327.993] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5807 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 282.462 291.739 293.366] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_901082d5c6de5ec4b457df69e41bb70c) >> +>> endobj +5808 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [319.076 282.462 339.33 293.366] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5809 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 247.834 266.673 258.738] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_68665d093308c111817eca341b98d70a) >> +>> endobj +5810 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.01 247.834 314.264 258.738] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5811 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 202.247 217.109 213.151] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_e5955a311fc4fde1edf2d5460f0a8356) >> +>> endobj +5812 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [244.446 202.247 264.7 213.151] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5813 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [219.695 189.74 274.983 199.645] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Difference) >> +>> endobj +5814 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 167.62 271.126 178.524] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_071aa57e439ba4f358c7fd43b03a6a49) >> +>> endobj +5815 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [298.463 167.62 318.717 178.524] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5816 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [214.863 155.112 326.259 165.018] +/Subtype /Link +/A << /S /GoTo /D (main_Meet_Preserving_Simplification) >> +>> endobj +5817 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.984 122.033 201.742 132.937] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_bb10ea556dd34e0c1e13f7e99b9efe70) >> +>> endobj +5818 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.442 122.033 243.629 132.937] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +5819 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.079 122.033 371.329 132.937] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +5820 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [224.458 97.57 271.379 107.476] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Affine_Transformation) >> +>> endobj +5824 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5828 0 obj << +/D [5826 0 R /XYZ 90 757.935 null] +>> endobj +5825 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5892 0 obj << +/Length 2557 +/Filter /FlateDecode +>> +stream +xÚå›[sÛ¸Çßý)ø”R3Œû%3yhw6;³Ívҍ·/ɎF¶i›S‰R))^ï§ï9ï&EÊb6iû`ëÀ9¿ó@Òà> Á½º¸|«EàˆÓ\Ww£ÑŒ(΂«ÛàcÈál6g”ÒðýŒÑp™®—‹÷3NÃÍêé!ºM—‹wñuºLŸ^¿þ!ogs®høÝj¹Ûù·?GwQ:c6Œ’›j҂é33ûõêNjï¯.þ}ÁÀ°¬meˆ*¸Y_|ü•·ðý%ÂÙà1+µ$ðº +>\üã‚æýè{Íú§h­Œ¢¡Ã8aTûN~â\eæ×ç +:ü9ë&ôÉÿ†6¦÷¹±?g¥„váònÆUø‰RžD‹mÅëå}Ô® ~¢ŠöVþsƃፗ׫痛Ì¿Ï$ ÿ<› ç›M²Û7î]œDËtñýo`Øno’.Ã^E3¦B(R«û»MTöë&Ž’ýbŸ.ãýîõë¬ÕÅ+ +,‘Úsð§”ÌçÛÏ5Nÿm”lÖq²ÜoÒ7ÏëÜ$Ž +ü1ükW¼^¾5rZËl%aF@›Ú̽ô/еûÆi¿Áj.ß:W»J8ðct?ᔠ+_H«Z!I4µE™ýC¼óeÍsAœ0U¡¨üÑpp}ï` 6Œ²0!z †Ó=þ{6Ýxå殣–ÃÙäÝ8$·£~ôr;ïÉÍ&ûz½ÜnãäÞø\óÒVÛL@ë\CɎƙ%JUnZ-7Æ ½l.%¢8“îüuFçoùpzßÎJ¢t¹Šn †uŒ[uÀ°ÁÀúMsrÆj‰¾·øð´¾Þ¬ºlI£Õîi °Âò ÄÆ@ز6™Tv‹5ú1‰n4þ|¦£OZÚ4®·Utøõæö°:ì:ü=J7g—·ËEp-Ô2 ©Óuàf6ù _ñnbJˆ´‰ì(+zŒ÷ސœ?½7#ãËÑÜ½í ª#ˆ‹,ý•­¤Q6⃢1gÐ[SŸ+͉Påh}žG6PÄãu' +.ÄÒ§4¼zuŠp)¿U©7y]²Væsøox¨M}' ƒÜÀÍ1T<yÆU"fy©ó2×h³ª 8Î\~,Â`p Ê Ô¡è'̅0øBò°ø„T„HË@ c‡_rÈ;P‰Ç¸9ãZó~Œ÷IQ­Å9$Ç6ǑÜh5Dr¬¬$¹ÑzˆäX>'ùsš«ù~­Ë”x.v™Õì$¬c%'`½Þ'´ö…qÞÖÏÆ¢璃ێÑÏf£ÈcÞÀ96Ú©Š³_:©®ÑVOAõ†9žêØjƒêù¨ø×cTǝT—º½¨Aucˆ¨V/çRÝ S9Dõ¹P°öw º5qÖ;“ Â0€À Tú9\/«ÙBgÖ!ÁKðgA(têë0ab±œHœ ˆyÀ6 aAÃB|3^¦ãµØÿ¡­9fkêzµzØA¼0rñXK‰x,Ô´>h'2òUŠvú½§o—®\÷ҕV¨:gB¨&]¡Om¬‚X…ˆgÓì’4ìȱ +­æX—ÎÉêGÄ¿%+ô¢›¬pe‹¬Ptc—7Ïs¤¥ChÁ‹т…^­®­UîiÕ÷bp@„žµûAöŸ Ö»©¦:1RÖ470¡Ñö¦ ½˜Ö°)VÞh‡mm`ŠÖRÍÈ60ÅÀR æáâK·6-ÅÑåmsÍ °‚Õ7W×eªrš0Yòmѵ U×>ÔiíA +I„„†nµ™W¥\§ú–ª©ô‡n¥*—v°ø5ç,÷ÝÑMܪÕöŠ_g1·¤ØR=tM„%•Ó¿pòu>$8"!×L°e€òxGÄÁÂ4æá´¼£aH™œò,®3ñô h¼à¬£8ÑÊ=£ŽÐĈ…¸íÌ=ÜñNèþrªWH+5•r­Š|£=BZÊ^!=¡9®%¤¡Õ¦ö£â_ +i)«„¥[⹬xL +#2˜‚Ø@ +ç¦ Nn!ÝeGúgƒ•uÁ…֍JB +&“HBsœSYrÂ4ÿƒ³CȺ(èÍEìÜd„³ïTÍÇÎËFE]ÖÎÍètd_žŽ' ?¦ÊF@Á}¼Ž5Û]´Xf°ê"îˆmf,–ÝØ짱 åxöÄúô»¢½ú}š¢Æ]@^¾ã–¶GÖaµ÷ŸœÙëÍf½=ìý­RŠhè|¬ç~¬»Fé:Ú?FQÒÑ?H+J“õpÄmNåÈS×ÍMY˜¼h/jZÞl7«Í}|³\-nV›Ý!ò䓝À$í×uFÐ1³Zw³\Ž]Î=1ëw榨‹NÜZq°ê„¥;ÁŒ)îÓ*­Åc <„ù’l™iUHÀC‚­D¹[óúÝÎ\¡¾ìXä7CB©°}ó÷_Þ½ë.°–òJ½œé½_Ռ:2ҋÙæ‰6ÚÀ|Îðål_hÛQ|Aü–oxWÌê³ù€ZPÌ\DO"-kýì¡È·ê®.ŠšeÃ®‡Ê{óýO +ÍDsÿs÷´ÛGë݉7væ<™Ž}þ@¤Æ·hRdg_ÁÆ_h\e«çÌBšþ¥–s­mk-µš†Ÿ1Ððµh™mÇ:E á»¾@ÃߎšOå¥ÖÑÞHSUžêŽ4YÝ7Gö y2’ fÔŠPU8Øo*ྡ0£ F鋆³‚ˆÞ0ûoWãÕL½éì¸(·¸^f³þÄgzDyÏóí¯pÕÊìØ箊çª4tZðύ)*>׊WÅļÏÂ8]/óÅCcþcþä˜ÿðË.Jÿ4S*Ìýè§er(´,ÆÏg¬*J«=`)N GÏ%ÀÀƇ¨˜^߳Ż¿]dcWٛéZFÁÃ~¿}}yùøøHnväÄ۔ÄûËívuÙÚ6jôš1ILYÉÝ&-n)JóîÇ |¹Î¶Ÿžÿx´– +endstream +endobj +5891 0 obj << +/Type /Page +/Contents 5892 0 R +/Resources 5890 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 5722 0 R +/Annots [ 5821 0 R 5822 0 R 5823 0 R 5842 0 R 5843 0 R 5844 0 R 5845 0 R 5846 0 R 5847 0 R 5848 0 R 5849 0 R 5850 0 R 5851 0 R 5894 0 R 5852 0 R 5853 0 R 5854 0 R 5855 0 R 5856 0 R 5857 0 R 5858 0 R 5859 0 R 5860 0 R 5861 0 R 5862 0 R 5863 0 R 5864 0 R 5865 0 R 5866 0 R 5895 0 R 5867 0 R 5868 0 R 5869 0 R 5870 0 R 5871 0 R 5896 0 R 5872 0 R 5873 0 R 5874 0 R 5875 0 R 5876 0 R 5877 0 R 5878 0 R 5879 0 R 5880 0 R 5881 0 R 5882 0 R 5883 0 R 5884 0 R 5885 0 R 5889 0 R ] +>> endobj +5821 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.288 708.953 212.768 719.857] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_90e87cbe8ae0717fa09ff51b70d64b47) >> +>> endobj +5822 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.771 708.953 252.959 719.857] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +5823 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [297.896 708.953 375.145 719.857] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +5842 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [220.401 684.37 277.928 694.275] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Affine_Transformation) >> +>> endobj +5843 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.443 651.17 250.099 662.074] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_d42265530a9e3b2f3bda9ab40d4a835b) >> +>> endobj +5844 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.258 651.17 289.446 662.074] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +5845 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [307.772 651.17 379.512 662.074] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +5846 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [436.747 651.17 513.996 662.074] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +5847 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [346.468 613.423 441.891 625.588] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Generalized_Image) >> +>> endobj +5848 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.207 581.432 266.586 592.336] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_b602d97b867b5d2ea800ea7ceef4c6b5) >> +>> endobj +5849 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.509 581.432 309.697 592.336] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +5850 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [336.494 581.432 408.234 592.336] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +5851 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.703 581.432 513.996 592.336] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +5894 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 569.476 171.361 580.38] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +5852 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [381.591 544.893 481.288 555.849] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Generalized_Image) >> +>> endobj +5853 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.091 511.693 250.748 522.597] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_a9c12ecd84df4ed86b5676a09fa39208) >> +>> endobj +5854 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [280.068 511.693 357.317 522.597] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +5855 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [384.405 511.693 456.145 522.597] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +5856 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 499.738 202.344 510.642] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +5857 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [366.481 487.11 465.544 498.066] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Generalized_Image) >> +>> endobj +5858 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [150.542 453.91 267.921 464.814] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_fb9d83c4e182f640833116dc2f725076) >> +>> endobj +5859 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [306.143 453.91 383.393 464.814] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +5860 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [420.495 453.91 492.235 464.814] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +5861 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [173.011 441.955 250.261 452.859] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +5862 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.923 417.371 468.68 428.327] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Generalized_Image) >> +>> endobj +5863 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.933 384.171 239.984 395.075] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_0441c9c3b0ab0d55165bb6b4fd107f64) >> +>> endobj +5864 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [245.633 384.171 280.82 395.075] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +5865 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.855 384.171 405.104 395.075] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +5866 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.703 384.171 513.996 395.075] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +5895 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 372.216 171.361 383.12] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +5867 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [347.257 358.379 432.092 371.537] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +5868 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.436 325.185 251.209 336.089] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_9e4e32230b187284ac0b9ca8efba8f82) >> +>> endobj +5869 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.361 325.185 290.549 336.089] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +5870 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.719 325.185 409.969 336.089] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +5871 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.703 325.185 513.996 336.089] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +5896 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 313.23 171.361 324.134] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +5872 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.114 299.393 456.992 312.551] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +5873 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 266.199 224.57 277.103] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_c009459805692e582a00d4b5954ab8e5) >> +>> endobj +5874 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.908 266.199 272.162 277.103] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5875 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.542 253.571 347.869 263.476] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Time_Elapse) >> +>> endobj +5876 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 231.33 255.564 242.234] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_2581586de73769088ece60dc01409a08) >> +>> endobj +5877 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 194.468 264.959 205.372] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_b6bba83ceaafdb71df04b77e43bed022) >> +>> endobj +5878 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [292.296 194.468 312.55 205.372] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5879 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [307.933 181.84 362.407 191.745] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Widening) >> +>> endobj +5880 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 148.64 256.66 159.544] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_e8d42fcd571a9c9d64f0e7ffe67e995e) >> +>> endobj +5881 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [283.997 148.64 304.251 159.544] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5882 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [311.5 136.012 366.421 145.917] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Widening) >> +>> endobj +5883 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 102.812 214.06 113.716] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_596fc5b3ee0d04895aca9139cb6cbcb6) >> +>> endobj +5884 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.398 102.812 261.651 113.716] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5885 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.542 90.183 358.593 100.089] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Widening) >> +>> endobj +5889 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5893 0 obj << +/D [5891 0 R /XYZ 90 757.935 null] +>> endobj +5897 0 obj << +/D [5891 0 R /XYZ 90 248.431 null] +>> endobj +5890 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R /F97 2175 0 R /F38 342 0 R /F34 2406 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5945 0 obj << +/Length 2057 +/Filter /FlateDecode +>> +stream +xÚíZ[ÛÆ~ß_Á'—vgg†i´Z§4µǻɋ\j$±/!©Uõï{æ«(‰ÉpôÁÖPœË™s¾óË +[+ [ßÞüýéæþÁs¬õ¬§¥`‹{1J¬§…õÙ&Q2»#cûãŒ`;,’pþqF±mök±(Âùûø¹‹ýÛ·ßñbvG¶ßm²ÔÃOb)Šñm‘Fvòâٔø³_ž¾»ùÇÓÍo7dÁQg3Ž¸Ã¬(¹ùü ¶ðýwFNà[;5+±\êÀçÆz¼ùá›{ûT÷c¸s?B8ò`N("¾¹äϔ2%N½Îú|ÇàÂ/êšp'ýNÊX¬Œ°ŸÔ,êö&ž;‰+±˜GYº*¶ò¢s1#ÌþOU„y¶ «8K砑x•ϑ;üŒ†¥euê ßVêYþf?ó˜} êæŽ}vŸÀ~×Jù¸/+‘nêÛo¢Uy+_X>r=ߺ$Œi…mSy¡¤¹ ]9r:ƒ´f1vô¤ž\ø´žSåùþÇ÷ïA ¤'HýyÿÀ)xž+×ÞÑQî‚@ùÜÓ{ü3ɋ™ËìLBôEôÛÕç°À.f·E¹ÝTúE¶Lh §_¼„E¦íì£ú”‹5ìåÌ]¼iœ®† +•ï¢,É·•‚‚>óy¯…›2Ó#‘.3%j$÷P“ªuV +e 7Æ`‚@߸•ØøYœjEƒò[e1qÞXLªçôJ|äø¤±Æ:¬ô†¡Öš~(Að¬I…ñp)½šµÙèÒ¥äYœVF(­ºû‡ èè`äùÎ!Fz¢»ÈÃ~+U<&:¦"A= Â§…Q‚ ž<Ã€ ßu.eÇw€ 4 ¬D*Š°ÊŠÉ,àøŒ±€\Þ°€ üzv÷< ÈÃ.bo «°?ÊØ5Nƒ À³bî„•\'m'­&í§¿nÉ`°è¸~a‚aex×gøB±|V€‘a¿fuøÿYáÁ +.iYa*¸„Ná¹õÈå-0×>»=Ïò0Í°¥sÊóGxâ ¸€H@Ï9?åÁ÷{Î/_H?®'ϖ¸ÉºÔÔc~,gõüXNVžŸÚå”AtׇK?VÃNBl#ü¨ó:.FÄåg½×süž÷J¶€”ÂGÜg}Òør.M\äd‚Kó .M§yt‹˜^asG8°@>"ÜdþDò t¯®ð°M#i¿²¾fMyB£‚Ù"^îZø&N¸ƒ²»VDÿýO€Gˆ*‘ +'ò‹Ç<ŒDï +ÃÅA.S äîÅŠ4Ýb1/å©óE-l9S $¸ýaI+$ÿÝÓnv™Wû\Œ­O¦:2¥ÈsI?™ÿÛbQŽà„îÛ¨•Œ D–v ÚRÅ·;ƒj¥s5lU`p +e”ëeóvÕÔ¶q:˜Ó;é¥ci}*¼{] b¹ÎÕBÐIäEöoøük@ ÊmÝ c‘Õ)UšUÀLTXl@à‰ÂJ¤ðïX‹Â á\k¦¶(àû7û‹A‰Õë0Ò§ûÞ5RGq¯“õŠ©º“ü?rïÑ°ÈäHWV"õp ˆ4sö#»0Ô& +·FÅ᯺‚:®£½Ê²P"äµ6$üª.D’IOz‘ÿ‰¢»Î?©ûÉòïy#Êù£eÊ7U6ó¾‹Kèï“ÚªNcG“¯2QÜÍӆ¤¶ÔÙp2Xwª%þb\Ç«µ(&ò’(üLŸÛS.ᩞٜ€›Î ôô¸k(ù¬: +Ýɵ‰äØD-5Ìêy21í­h‹Ý"è/ÜÅ=JŒ4l‹#´1h+¤¢£¡ñ-‹¼MEŒgФqpLÚ"³fG‘äPP -—Ã:ó(G®ÛtþÜ¡í ±6pH¤ab<å£êUnæum0r†C¿9ã¯#….`„"LÝ~U<Í3’0%¡—]“U¾„ç©(®&Ü9 §0æÉCö9(ƒyG[™`¢‹âN6žÖL®¯gÈ®cŸŽj¾:±éžO.Sí_Of½`4¶üERó.¶oO‹õ… ¸wšÀ'G“øùØ=—Ä7Õ~”å±8†ª±¤~fR³Â°bž¥=p$Iœ"ΚÖã èp¤¥â!âüÞ®¢ë+2½"²–P™~µTG.·¯Øñ^/I” Ü2Y¤—€qª%NpypcÞî5Ç❇xÐLŽÓqT`÷z :ÖØ¢. „šÆ5­¸ŒÄf¦"ۚ{÷º&ö¡ŽaöÐú£ýà¦ØqðH€äˆ·QúX )q<*rU¸…)ðõ¶ßˆ²*¶*ýŽš¥ ÀÞUZråNý˜"}¸b‰ÝQÏãNÆôÃZ•2D®V«Ösvqµî4ZÆzÜàâÁÔªA>KZµ nà#ܶ—¯uƒÅ6=%v¯=…&V=™ê.NåÂ*–Ô) 4iÛ×aVö» ØNƒ–]¥XFq<_l“ü¤ƒÖ­‘²B†¿õñ@-ğúSŸú§<$Þ`zýS% ƌ?>­ûy{šÇúwJúÑüXI?üXŠâO3Æìš"Ãt[§”ò:º-Ú¬#(‹¨6†Ý£¨C›¾Ù¯V=ú׍BG+/JÁÁ <ÖU•¿½¿ßív(*Ñ6óÅÕ}žoîI¹³‹lŸ4›,ë”:É +Q‡7ø2Q)4ÔÿȗX +endstream +endobj +5944 0 obj << +/Type /Page +/Contents 5945 0 R +/Resources 5943 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 5722 0 R +/Annots [ 5886 0 R 5887 0 R 5888 0 R 5909 0 R 5910 0 R 5911 0 R 5912 0 R 5913 0 R 5914 0 R 5915 0 R 5916 0 R 5917 0 R 5918 0 R 5919 0 R 5920 0 R 5921 0 R 5922 0 R 5923 0 R 5924 0 R 5925 0 R 5926 0 R 5927 0 R 5928 0 R 5929 0 R 5930 0 R 5931 0 R 5932 0 R 5933 0 R 5934 0 R 5935 0 R 5936 0 R 5937 0 R 5938 0 R 5939 0 R 5940 0 R 5942 0 R ] +>> endobj +5886 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.284 709.028 313.701 719.932] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_e47fdbff76383891b3896ac5fc213d5d) >> +>> endobj +5887 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [341.407 709.028 361.661 719.932] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5888 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [403.347 709.028 487.799 719.932] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +5909 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.63 684.52 376.664 694.425] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Widening) >> +>> endobj +5910 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.429 651.395 306.547 662.299] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_323efbe5d43695cc65f8cd5935da94dc) >> +>> endobj +5911 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [336.542 651.395 356.796 662.299] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5912 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [402.202 651.395 486.655 662.299] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +5913 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [324.627 626.886 379.162 636.791] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Widening) >> +>> endobj +5914 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.72 593.761 264.238 604.665] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_9bdab8408169307fbd899ec3670cb2bf) >> +>> endobj +5915 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.815 593.761 315.069 604.665] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5916 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [361.421 593.761 445.873 604.665] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +5917 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.613 569.252 287.921 579.158] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Widening) >> +>> endobj +5918 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 498.105 289.866 509.009] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_10e3116398b920cb137cf576a073cc68) >> +>> endobj +5919 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [293.681 498.105 359.324 509.009] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +5920 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 463.386 290.971 474.29] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_c4e1b49845e553ff84dc73e710def76c) >> +>> endobj +5921 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.787 463.386 360.43 474.29] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +5922 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 428.666 224.003 439.57] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_1b528a2e8d4d096f62535454e05b74ba) >> +>> endobj +5923 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.34 428.666 271.594 439.57] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5924 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [219.695 416.113 272.49 426.018] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Concatenate) >> +>> endobj +5925 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 393.947 254.15 404.851] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_75df0f78d7598dafa946251a04cb5d90) >> +>> endobj +5926 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.487 393.947 338.263 404.851] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +5927 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 359.227 284.585 370.131] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_7ff92e5d40e6faf667a0b1f6b8fad791) >> +>> endobj +5928 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.401 359.227 354.044 370.131] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +5929 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 301.594 241.726 312.498] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_60138f2b5d41fd62c862fdcd7c4a1e61) >> +>> endobj +5930 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [349.617 289.04 407.658 298.946] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Map_Space_Dimensions) >> +>> endobj +5931 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 266.874 249.318 277.778] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_f6df34e5e4ab9beab41cd76897d64c72) >> +>> endobj +5932 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.134 266.874 288.321 277.778] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +5933 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [305.875 266.874 371.519 277.778] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +5934 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 232.155 240.62 243.059] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_18ec2da355442e02ae67313ed5b48933) >> +>> endobj +5935 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.958 232.155 324.734 243.059] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +5936 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [390.537 232.155 425.724 243.059] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +5937 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 159.787 153.097 170.317] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_07bdac3717a59f64634da7d9b1cfaefd) >> +>> endobj +5938 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 122.851 167.466 133.755] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_a598904833b374d50efc72c51914112c) >> +>> endobj +5939 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.281 122.851 191.535 133.755] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5940 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 86.288 193.029 97.192] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_508103dc808fc747a90b573083a60461) >> +>> endobj +5942 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5946 0 obj << +/D [5944 0 R /XYZ 90 757.935 null] +>> endobj +5947 0 obj << +/D [5944 0 R /XYZ 90 176.32 null] +>> endobj +5948 0 obj << +/D [5944 0 R /XYZ 90 139.877 null] +>> endobj +5949 0 obj << +/D [5944 0 R /XYZ 90 103.314 null] +>> endobj +5943 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F23 340 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R /F35 2018 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5988 0 obj << +/Length 1624 +/Filter /FlateDecode +>> +stream +xÚíYKsÛ6¾ëW°—Tš‰`|{’C›©3M“֍Ýé!Éh`²0áC%ÀØʯ‡)™v줓éEI`±»ß>ì\:Øy9úù|tt¸NŒâ€Îù܉±ù”8ç©ónL¢d2%ãñé„à1«r6;P<.³Õ‚§›½«VÇÇ/+‘N¦ÔÇã“Ò ßò9¯&$ó"á@)pI0¦$ž|85úå|ôψ/Ø!ÍÞ~ˆB×w’|ôîvRxÿÊÁȍ#窙•;uá?sÎFŽ°•c÷¿‘+¤Nrž–‹xQ†ÔE8ðpWBq˦*5C  c•ë¡(ŠÍl©Òãã„W•™¸EÞÇ(ډ¬0$:{ñë¯fXMÜp̗æOòB1%J;­œ‚q¼A0ŽçÇ-Å÷»=ìy(À{j!dgTƒÙÎAÒ÷iíèÄǦ0¥.E r½Ð²B©¿EÅy7õÁ8>5&ø›oÏêÒû¶™¥ee2b–Öùr—†þúû¸Ñr)UÅYnôóDÂ{bÆIYHÕ+Ä®Øq¦„"7"÷‚»G™! +(ù&0G`&ñýp&QŒB=$ÎËJjÄç©ÞCö(•zˆÀè”ê"†Ý¤>“‰!<Þ=BÔR—=Ԁ ì¼µ\òŠ©ÒRƒ¸Á=D1·cÿÙ³ž ‰‡\ˆ¤÷ó|XŒã`˜E\”e6Ä볒¥½^ôxý=mã5ìžîQ:žWÏ—yŸ SïÃǛ–¤^S´¯‡û^Ór1ËÄÒ0‘Ö O͛‹Õ~éïëH¹›XþÄøž¨}hBÆ»Þ6^Ï`…ÝSò^™ú>"ø?Á(†hô°nÒ¤lØNÁæ³ÕÄ÷Á§.ѕª«Bö솛zWUÍoÝF̍ÝÈ:I¸”ó:{ÚÇ~Ù¿ó×9Ëd/e€Ýë(—jÁ«+3‰W?j(¹·øQ¯ hÏÊy^V«™ŸùL­–üöU&µ)–ÍìZQÌ.V:ë=n,n¡4 ,ød͉…d0#aó¡a«MÛ óöc’ÔKÁÓvU_ÀÇò¼o]-é\ðU±nlòZñªø@~œsV0Ý`\ꟃpC¬B8 +¾qÕDÝE¾7,GB¥âҙ:œ&L.fI™òÇAŽQrÌü¹tz!Ô¤ã£Ý&µHÍ»2d hý0üJHì´ªP·†ðyË£û7KÏt +N Ó§õE֎ßðüúÐf|R‰ÎÓÛ.²0˜âš¢8Šèax¥Ùô º©Èy!a×;¸wήgrÉ>ëV´¡AAyºH>äÉ°·Èk[5LL¶å°ö“ÙÿQ©Üluö‹Õœôȑ´-ÕJ–ì^ùÖ¥¡á ÌL˜¹µ„ÖfO4K«$ãà¦Å%”%@#WRñ\>(0½1V—A6´¦"°˜1Վ„–9:eoÕ¢LåîªN寮L´„]œ±bÊ/@"xd$ .YÕ÷Ž„.ÿAj-ª!Ýåv|<©׎:4ò‘/mþÚ.öùó}¸l&³;FŒ'×Oo&Ä»ÒX=„aôœ&aDÜ`H³ÛÃ4 [£»"³Õ‘˜÷%ÖE´Ë¾×·X¥=Dˆ‚¸›³ÚC¤+Š™±Ìݲåvt Z˜¾C‚B7´æÙÕ&Smõ·•§wŒƒ}zPxuíª/¿é†Ð–[­VvP”ª+?»š`Þî…nXÃÚ!€Ñ€ÜÌnœ_ó##!›Žˆ!zbº}̳×k¡Š6z þ£Ôp—Ëj¨¿Lõñ& ´å0ÔjY[´ìMHÓòC1ùˆé~x úá; TÿÇ)¨YçúJ_D闅ZǪ;Ö5DwùÐ ²¹agåòª¹WÛ{#²wµ¾óí…ܞ˸=–xŸûQý¢$z¶ä‰`™øÌû òÞ¹†“WF_;´=ˆ7CûùÝ«ÇȐhèÍcsæ 8„Ô`nNýù¾g6?oSc§NûØêÔ:ºººB‰Du!–êh¹ÌŽnf *ãúÆBŸ˜ÌZV]… /óæX|Ðÿ¿uÅdÐ +endstream +endobj +5987 0 obj << +/Type /Page +/Contents 5988 0 R +/Resources 5986 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 5722 0 R +/Annots [ 5941 0 R 5961 0 R 5962 0 R 5963 0 R 5964 0 R 5965 0 R 5966 0 R 5967 0 R 5968 0 R 5969 0 R 5970 0 R 5971 0 R 5972 0 R 5973 0 R 5974 0 R 5975 0 R 5976 0 R 5977 0 R 5978 0 R 5979 0 R 5980 0 R 5981 0 R 5982 0 R 5983 0 R 5984 0 R 5985 0 R ] +>> endobj +5941 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 698.565 193.029 709.469] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_1d51ba9ca3c3e0bf0042502f40d2e11b) >> +>> endobj +5961 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 664.837 165.911 675.741] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_ee33974909cfc1cba605734a57d44df0) >> +>> endobj +5962 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 631.482 187.689 642.013] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_1a26d0018999e56d94a7e96db2b6e553) >> +>> endobj +5963 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.557 619.051 476.544 628.956] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_1d51ba9ca3c3e0bf0042502f40d2e11b) >> +>> endobj +5964 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 586.422 202.902 597.326] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +5965 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.4 586.422 300.037 597.326] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_f39e1b0519a47aafb9dba4121dc41a9c) >> +>> endobj +5966 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 552.694 202.902 563.598] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +5967 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.4 552.694 314.263 563.598] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_eb9b562373b4d288c03549bdba93fede) >> +>> endobj +5968 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [155.819 519.339 199.864 529.869] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_5f6fcc1dab2b08eff20b41d1412d1e2d) >> +>> endobj +5969 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 442.467 203.075 453.371] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +5970 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.573 442.467 296.324 453.371] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_fe613a3da3edc3cb4506f70d409f061d) >> +>> endobj +5971 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [312.377 428.63 331.306 438.535] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5972 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.636 405.18 294.481 416.084] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_7fc86a6331f34f34a506ab2b0609ac37) >> +>> endobj +5973 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.636 367.892 287.856 378.796] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_3628b6d6e250d4c6b8301173c6ecc777) >> +>> endobj +5974 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 289.402 180.54 300.306] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_87d004db7f8febf6f9c96b4a2a1c85e5) >> +>> endobj +5975 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.877 289.402 228.131 300.306] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5976 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [269.864 289.402 290.118 300.306] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5977 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.349 185.983 226.034 196.887] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_1cb88a546d32e7b5c07dc25055e33235) >> +>> endobj +5978 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.176 185.983 341.43 196.887] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5979 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 148.695 178.239 159.599] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_9e17201a9a12235a9a96cc31cfffd38f) >> +>> endobj +5980 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [205.576 148.695 225.83 159.599] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5981 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.563 148.695 287.817 159.599] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5982 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 111.408 156.281 122.312] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_d452407f89cb560e83fb81938c12a585) >> +>> endobj +5983 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.097 111.408 291.433 122.312] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5984 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [309.645 111.408 440.981 122.312] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +5985 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +5989 0 obj << +/D [5987 0 R /XYZ 90 757.935 null] +>> endobj +5990 0 obj << +/D [5987 0 R /XYZ 90 714.882 null] +>> endobj +5991 0 obj << +/D [5987 0 R /XYZ 90 681.154 null] +>> endobj +5992 0 obj << +/D [5987 0 R /XYZ 90 647.426 null] +>> endobj +5993 0 obj << +/D [5987 0 R /XYZ 90 602.739 null] +>> endobj +5994 0 obj << +/D [5987 0 R /XYZ 90 569.011 null] +>> endobj +5995 0 obj << +/D [5987 0 R /XYZ 90 460.658 null] +>> endobj +5996 0 obj << +/D [5987 0 R /XYZ 90 460.658 null] +>> endobj +5997 0 obj << +/D [5987 0 R /XYZ 90 423.49 null] +>> endobj +5998 0 obj << +/D [5987 0 R /XYZ 90 386.202 null] +>> endobj +5999 0 obj << +/D [5987 0 R /XYZ 90 307.592 null] +>> endobj +6000 0 obj << +/D [5987 0 R /XYZ 90 229.102 null] +>> endobj +5986 0 obj << +/Font << /F63 374 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R /F50 339 0 R /F98 2120 0 R /F11 418 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6012 0 obj << +/Length 2378 +/Filter /FlateDecode +>> +stream +xÚÍYK“Û¸¾Ï¯à%)aø~L*‡d½ëÚM²åؓ\ì­)Š‚4ˆùZ’²FùõéF7@R¢ÇöžrPáÕh4º¿~€rƒã:¯oþúps÷C8™Èb?vöNæ:Iì‰È÷œ‡ó~åyÂ÷ÖÏuÝ՛µç®ò®Ê߬}wՔç'¹ëòÇ¿«m—wçûûםڭ7~䮾+ó¾§î[¹—ÝÚKW².$pŠ/^ù¾»þå᧛ïn~½ñ@×ñôÙQ"’ rŠêæý/®³ƒùŸWYêœ4Uå„~mé¼»ùçûâ=ü@¸q4¹‡07y%‡\•’…}%û¢Sí š…ºû!r'œ\gã‡"3bôÚs€« +¤Æu/±òzMÍö?²¸¿§vx’Ô)´zPtóîÀ*xûúÆy¯I´.‰‚îÈól;ÙËz`õæÔt9ŠŸ—Ÿ“ŽÕð`$Ø5U®ê¹x¸«' $þDi ¢8VšEŠªò²<Ó¦þضM7ô šKBFfÛýü2/”%©Vn²ò>ø~tyéìÇÑiÜÈm»¦DÑík¶aÝÔZµÜԇëÿ4çŠZÉD½|ꐇ¦lª0zµÇ©˜÷ªÀö°~è@§Ão;¬TµÌùVò×c^ªá|ÅyT‚RÜ^^ýêÚ¨ Âø£n–å•le½Sõ6ú骩©%˜B§’ÃS³Ãcuì-aNÍ(Žؗ´¢zjë†'¦ !ƒF; ·gÀ¶è„þIiãCO* è¨ÇöÒ"ÜYÄwÊÔríE«çB’[ÎYAà?Çr0†œ¹‘ÆWÓ÷jkðÚeéGdÛÅB†Cނž[ äxY6^ úÚñ %ÇÓ]Ö rj@Ïx¤vÏ®9nKÃsÀˆ‹ªT©Ñƒ¡áֈÐÔvßڏVŸPS²íhzßðÎքøû%M?!Äq¬%}êÚÐÙâY±¿ê[Y¨®ëK¦È{j­UqŽ$«Õ`vžÁÍ*ZÑ·Gö#Æyá[9d-!h6]ovDn/琊é¢ï snXŽ×¯ÞÚ¸‰ŽÞý…›¯?H¬ãÒ©&Ðap ûW®sOkŒGIhMœm¶ƒÆÎâ¼ÍŒÅM˜d€¾|à{°XÙ[íiâ$ißǺA0œø”§E粊LR$´S ÒP³Ô+Hʲbß5š†&`.§f‰ûÌL‰1ÐÛImdiæ¹Óç•$þ Fä_sç“*ïE.Ðõ9è+݃·öœ(I(Ž¼…‰.péÁæÏNîŽõ.7™ ’ÕxÝ΃ +‡œ/må<Ù¡R5Æ€GVËÕ­DÀLùçÃЩ-ViÇAγ<œ<ÒlŦøŠÊd™¾Í S,¨JB¶3q]ÅÊ9®éÀó&€e"òBS0‰?­ÓR‘„‰!ð‰ ˜òÈDèf†àç…*#q:'—•à²l8sÁ ] Æ*ú’藗剟¸"ó0_Æ‹¾²:ÑqüöR‚ª5™ooë‡ò¸“;&Î;+îŽÜÐÔ¦'píY†Z2Ëo*8ª¦×€…PÒJ*{ëðÓtYk1Eyh hbS¡‡5őܖ¾±ÆÊl7ßò&šˆžOí1Æõס»š/õrÐސŠ0Î殌<, jÌ;•C䤘¯äP +Âara´ÃSgƒ Ñ7±½(!pJíÍIÒíÚÍÖ|«½Úñ]aÇZoS4U úÇ¿›LbÒ&ÿb*ÒD#D^™Cú‹öÕÕéj¬8÷Æ=>›Æ.·1†@Øy_¨ªµzR,7±Æ +Òdšï`^g5hOOªx"»‡ÑÝIPBm÷T#¶KÊY§¶¼±xÊëƒäU² ž†Žvýö Bxüx6¾H ©Ïm© +5,Ä¢ lgbx6”|'ÈÚº +âÞ¡—mÇJ‡R÷IíL؏I$ç$Ó;¨ äí…YÇpÑ0i Ô¢iQÇçu­Ì¨*ue0–GOæh9fáøï‡ÌM(.š7ñÏ UZ{Eh°¿ÿÚˎŽƒšÌÔ¼×µb`S;WŠMm˜óúe×l¦I æ42îAÛA4šØ;+Mé¢S~ÇZ…p·ü®8ð{ü"Åy©ˆl‚{Ërb‘%ðØÂ7°ˆCß Dl’ˆ»›¼gB%fž3y5û"ÃW\ ?%ÒÍ Æd¡1óèø•WmiÓÎ0Oö€ceP6‚k;IÞ8š]:ajŸöÏ W€Ôø—X¤‰Íýç/219rŠ®FN^äRe7{¹ßoyo«,)ò÷÷‹×"'`M×C6>@" ]„eŒþ³¦Ö›ÂÛ3ÊãÚ‰0‚&—hÏHë]ÇӋoYPT ? ¡ Àê>qúž K÷ð.¶Ï´M\ +ÎÍüM& lŸa>Þñ"ª¤Ç)å˜fWÒ¤<6ÚÆ|DÈ~mš‚h&o̚–T=htM$m®tðÓk 5`àF"u“ÝÌË¢©›ùËn–̼ Ër…º1ŸßؾL` + …r€@Á~öTœ<†¾ +PPÃX£)e8}gY<¾ãc+Å¡ŸŠ¯ÓBÕ½ìÄþž‰þw¦Ö%Ôc÷Žÿsà¼æuþv^,} +F’~‘s·%½0ˆ•à»TfŸ)ý+xÂÃz3xÂx0»ø ù¶TõÙå¡ÝRvÕÖ¾2xówƒ=Ÿ«¸‘—  O¯ þHø[ÇþŒL2 T›R~æÃpÛàg¾o…N6êüñµ‘e†ž ð°ÁgöFU=êóuÓä8žïâ)"ÈXü?è•P$‰&Ó »?2R4Ä« ²åWìÆH8Bؤð¬›!êۄ — —„õ¯„}y÷KÂ~Y³þÿf/}uâª|—Ô@‹Ïã¯üŸFÿ?N?l`¢ðâ‰7è—øÍHò?M4øè÷÷ë(Zq2ÿG^óÉÿ¦œ³ß-\á¹Â§oâú3Ï;úÞwƒwB¡?:¦÷7ò¶Q^,yזöOÃÐÞßݝN'QôêǶj¸kÛòî:O¸x`ËĖõUÓÙÏ@ø©güŒ<Õÿÿ‘\2Ñ +endstream +endobj +6011 0 obj << +/Type /Page +/Contents 6012 0 R +/Resources 6010 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6015 0 R +/Annots [ 6006 0 R 6007 0 R 6008 0 R 6009 0 R ] +>> endobj +6006 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.82 677.939 198.074 688.843] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +6007 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [121.945 519.235 182.89 530.139] +/Subtype /Link +/A << /S /GoTo /D (main_sect_rational_grids) >> +>> endobj +6008 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [164.819 408.291 398.978 419.195] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Space_Dimensions) >> +>> endobj +6009 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6013 0 obj << +/D [6011 0 R /XYZ 90 757.935 null] +>> endobj +6014 0 obj << +/D [6011 0 R /XYZ 90 733.028 null] +>> endobj +6010 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F11 418 0 R /F23 340 0 R /F31 472 0 R /F7 505 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6019 0 obj << +/Length 1949 +/Filter /FlateDecode +>> +stream +xÚíYYÛ6~ß_¡—¢rqyè ä¡-’iS¤‰‹¢H‚ז½BmÉ¡ä:þ÷^%kwl€¾äI<†Ãáß )¬¼¸øy~qùgēÆey bk±Þ’,HQž1®(2Dò$`(%VtjhGÌPLã ò¨®fW±\v³"50 §P­åÞ՗¾ýÀ6h7E1a =Òko_•JeÿÎH²±FPjy<0Do4ó íž(>8âYn8þÒÉqõöØ´Åv¥à¬‹uóDˁƒ(G±³= £²j +Ù¾Ç þdh#ó9šÏӧ拁‚ xØ37W$k©¸ÏŽt¤ÝÈ œ#–r߁zâ@0dZ‚~ëV5bk[֙ %,‘¸®•bvùŒZ»¸²ív[ÉzkÚi«@Õ®Wv—¢*¤hki÷hvÅ¢\«ß¾ÂtW—Ukš¢²˜`§”[¶­y¯ù«N ½Gæ¶â ¬­ôu¥%S=¬É NÅj»è=£ŒÓÀ¶Îò£õMDÊ 9gõQ¹HïQaGÜ-¬Ò•ç§vë«¡ƒÓóM_Ñ>FF”#šPŠHF&@’Ý’d#xöÈÅu©&}W}a>Æ­ é#Õ¤Bý5;¤€m¡Ü}-ÅÆLi [–u5"× ªã”ø`ÊAqœ:0ýdH¸ŸOˆ›:ÁBE8’¥8N€G1gŽ`Ó FyNςôô.HWöðˆª#ãuŒg(á#LnZ¹_´… S ÿ*\üë6ßâã^lÊö8ŠìA*€¾Nê{c¾"êóÿ õ'y|wëªøa¹"ÿ–+Ԕp‚¶ßÆ aÄÂvº:7a$_)aLä‹øì¢:ø9>õsÜù9ù¹‡/ëîâ1.«=4r>µU1„º…,DÛÓߏZ¦5 á,ŒNïðô>Á>ùÃϊ€€‡“ð L?¿XeìÄ0¬ ˜ú­[eˆucK=bRò¹۝ÎEöÓVa9Ü+ÉC/K))\– bémU :¤‹X Çð¬ ;Ï»¬w²­sªpâPÙɇÇG#|lê.^÷µZô”xÈ#Ó{öêõüïÛ2ÛZ"(®4Fvâߊš)EIþ Ðü"ÌÌS„AàÂß)wWqßUcŸÇb(ÌÉþ÷Z¹Ë ˆÆs]çÛÅ̻ܫ¦¶û¦5£P†µ¢¬ú…y—\ÕÈᦨÌà²h²¼6EuO«¤G³(£<œÏ¸v/5[TÍ^žÖޔƒïTrß(Õn*Žãºd!Û*uægŠ‰îK(1KY,Ýю–¾Ç˜Ê¦Õ–™ŽA·¸¬l½R™-Z ª!·¯-jºZ„ê¬a[y(S1Åjâ¨úþñiQìÚ²¶…rÙe(i@³:ÏqRuy¼}ê–|ÙCÕ}9µ¹1S㔺wùÎÔvÞÌj_-ôIµWƒ{bäê¹­»À¨ ivjôe¹7‚EÍ`ØU±½+FÉ (wëÏÍypøû íÖòÇÆr…ñÊ'w' ÷Áígn}ü¥OßUã>«ª.swØx¢.QÓîÚkÇ, Q'›™ÑO½)’TÉGirt¹TyÒZ$Œ(O³ŒvGЊ¦ïÕP‰T3½âÙgC(*óttEmoö¡¯¯ÆÙ÷€¸?cü“WƒØ¾xÔFžÖèºEkŽJýˆ„‚á¸óæÕé£@ŒrÞÍÓ Š «:@˜LöS:¥{u÷O>Oõ4üiÿèp¡3‚jé'd­¶•SÎR‹©÷P›Åšó@ã Âý¦/Š½ª·±~Ü&qýŠÌ¹­uÞc‚O–¡8£AÄΔ¯)ñ¤«¢Ÿ¨ß™{S¾Ê¤™£RavZׁHpS³ó 3q87xœG5e!|ÀØûJÈS&d Ê2 aNÏ §Ø!K¬øpx¤pHU€RçdðÐ4:î=÷$§Ú÷­DȄ4 âd`Í!`îN焟ûoGÿËÿïõ ,€Ì$å·× +Õ)Ûu?¦L×þ2?¡@ø~–$¡Mw¯DµWæv˜Ú%rŒFÔ$ïˆA1ó¶(ì!ÍÉþ \ëW“™zy Ïë³áMÛî_^´h€øN¢²½Üí6—§©ÝãB ÌíAÈÔ:8ÜÖ²p×PÜ +•’ÑXÿÿζ0 +endstream +endobj +6018 0 obj << +/Type /Page +/Contents 6019 0 R +/Resources 6017 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6015 0 R +/Annots [ 6016 0 R ] +>> endobj +6016 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6020 0 obj << +/D [6018 0 R /XYZ 90 757.935 null] +>> endobj +6017 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F31 472 0 R /F7 505 0 R /F65 376 0 R /F11 418 0 R /F8 504 0 R /F23 340 0 R /F1 542 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6024 0 obj << +/Length 2430 +/Filter /FlateDecode +>> +stream +xÚÕZKsÜƾóWà–Ý„;œ÷ ¤Ò!IÉ®8V•b3—åbA\,‰dØ HþûtϯwIKvɃéééîé×7KšÜ$4ùöìo—gßh‘¤$Õ\'—›$¥‰ÑŒ(ΒËuòó‚1ÂÙrÅ(¥‹÷KFY½Ë®Þ/9]TÛÇÛ|]gWßë¬~|õêÛºX/W\ÑÅß·YÓø×òM^/™]äåuœ´`zÁ9_þrùÝÙÛ˳ÿ1…&Ìí­ 1B%×»³Ÿ¡É¾—P"R›Ü;ª]"¹€ç6ùñì_g4èAŸÔǦ„R™® ÓÒëôö!Ûí·¹O;9"ƒ‹o¬f–š&+Ÿ”ò«/oÃÊMµÝVK®÷Eyã?]Wë0ÙÜú©`„6.ºkÂKµ™ÌlîÊ붨J””PC1RÔÕvdëõU³Ï®ó«u±ËË5WY¹¾Ú×ÕòëÖs+’Â9Z9¼)Ý+»’ÊpÍJXJ wÚKjüJļá¦þ@eð‡½FvÀb„:˜é¦&(çuUÞÔwxôHýà—¾yãŸü`±->¦äxó‰ºÀK +Έ×éÏMp¹ø@)¯›jÑÞ£SW~f[”yã_ñxðéO)³:¬o#£&ۅ·¬ñ4Eéǝ‡á@ú¹MUÏ-—)±æäÉ®œ‘VzQÙùc¾û˜¯glÀÔÚș€ è_7-ãØñ TÛðú½Õ?ŸÐ×ys·m;Ÿ¿é‚¾˜:{DÛ¼ŸöÃ<¸&Š©À·¥N,‰.ö2êéì€NËX²’)Ê¿!CK¬ÒQíׇŒ$‘¼3 Eò4&ÑàúÂF*D³ô‡‚CB±¹Åƒ¹+>Ê@D™t,8r‹!?F‰bà? +eKGBñ™Sy4ì6 "“7J+a8QÀ 2UéL‚4§$ûJòc—ݲÍùªØe7ùŒ‰ ƒÃ^– +9ÔD¦Ó㹐ŸûÑÛwï/:‘Ú0j®nò2¯³¶r«Ý—}U”.µ¹H˜†ÓÁ]¡óþÙMHb ›>‡Ìúÿ𫹠){b±.~Da{AIM(æÏÃ|~JnùÕÈý{ڛy{.œÕWoöo±ør‡"êcAÄS.7 WˆÏ{vG‹¨Ñ`£X1Ù *ù’©EWîh,ðÒ´YíËŽ|™À~%Íív´B,öYQ‡IÿÃÔΩ$Lv}ÐÌÐ;–˜Êõ fˆdÍã,®» +Q”ó¹Úó¹¹¢a®¾¿Íë|NqC8Æ3õî \ƒ—­;¥,ý8±Ãúݘku(ö)Î¥„¢\Ã&ã S‚ÂéQSb¥ÊÅ5wrAB˅½\8í*|åØ»H + L@OÙk°ÔÚ|Zºö¬È>Æ¥°ÓŒA\eNXQ Çqoã¶Ù÷ÁîÑuI0å}¿Ð'·f`KÖל‡Ã®jM*ã<3l!æyE(O‡]]°Œ?;+ˆuejpvÃ~͈دˆøôâT~B­òrJÝÖYÙl³6c˜ô‡ÙU¶uqsÛúWÌ=.îG÷K¶¨›C³:r1\>c^PÚtÆ{x ÓDw´cã -Ì،…ÁIú“8TÙã®$™y>(ºbAáí]NLC¶Iõ4ڀ,•“I‡‹# ©øx"FQiˎç;6NžÛ‹dpPÜQJ±xWÕy…k¼'ÕKIç˜c rô¸Í8¨p +ý ÀÒ.k}PÁ·€ÀJPc•Á\ڋÜã Èðm”FÃ\³{üøô8q!À)›6Ïæ¬,l©ãáMmއ ÜÛ±CR„Ëâw& 0¸ +M«þœ¾âñ¹ BȖf”u´y&|0<»\S?z¢&‡ÔÉ¢ßÕÙÖq½š'̶•gl܆3ñ)(TžôȉX×хù7s„>^ÜRÚ vF¤l8àö6 +µ Ðd÷e-¨ÓDcís—Y=ÊWP‡Œ˜äT=fƒO›ê®v;¦bj6øâCa{.˜.O˜Ž ï“ä|lè>µeEƒq/Rh]xœûv‡ºX܇×•—UÐÄC=xñ©eÇLtk _ÍS1Í>`ÞTrl#L“ˆÙŒð:Ô@>èa§—“üÔwÑ3ã{¥©ù±Ì!È ´R#úÜX~aô>çŽgê†îz'D/¼ÇXE ‡ Vq8@?B²£±*õ©XܝÌǪ|«Ç¯E¸sk†±H4Ÿ»±Ôkð•§nF,D~úÏtL“Fùðf„=gõoz5"緖Ïüøê¯ñnä‹Yü7¹‰ñ¹÷#ܦ±ð[;¾ñS¹ŸéïGð3šü|.ˆ…„jÑ姬ž»ë‡^¥ï/=tn5©b0u]‘ê`Ý:/«]Q¢[ø÷#Î’4VX\ S€Q—füe„Tís¨” ÕVj@Y…ÿ¤_˜V ©b‚ gXøÒ»b›Õ~ð¼k=ũ¤ð¬H —¬"m5Ùw›oZÿ©ÇªÃyGuT-%O º’”¹«¬‘¡ V¦Ìñ¶N±1 ´€X…:ÄêÞ\·f'·Jøa -÷… +¾Ê¸jœ*~œRͦR=Kdàœb—JÓ§Ð)O™oYm¼˜À}†q²4#Šm~YCs9<¡õ;u +cà9™øl¬)F6? %)þþa~]ûùR(i†Íh:Niw%•†T€ÂûŒÊŽ*ÜGõw"ð‹×þÙç% Ðᶢ*·=T±í7‡LSúTÓ¡«™À×)áÌ95˜×zÒãŽ~G‡}¨€OÎ%hs{Ô{zïӒrbº;(+Ys˜Û}d0æ,õ`ÆÌÁ‹oPaƇ&›s0+@끘]-|‰U…ºÉT€cýI@w–ú„Ùúõ•Í¿ {rü'ñ ”@̾0”Ôá’Ï€ƒëéÿà²NÁUŸù/8î_n@›þ·`¡ œ•œŸ÷h(ü÷¡0Œÿ?ä‡áŸˆüàßM^ÿi© Èûñ»¬¼s÷ðŽ¥5¸UÓe[ +„Ä;HüG‡ó<(é5ûoßþémÙËˬ!¢‡I·m»uqqO®rWûšíÅ~¿½8„|.L~‚é®vUÇËÃÎëÉÔþÿ+¡cØ +endstream +endobj +6023 0 obj << +/Type /Page +/Contents 6024 0 R +/Resources 6022 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6015 0 R +/Annots [ 6021 0 R ] +>> endobj +6021 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6025 0 obj << +/D [6023 0 R /XYZ 90 757.935 null] +>> endobj +6022 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R /F1 542 0 R /F8 504 0 R /F11 418 0 R /F7 505 0 R /F23 340 0 R /F31 472 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6029 0 obj << +/Length 2250 +/Filter /FlateDecode +>> +stream +xÚÍYËvÛÈÝë+°š‰Øê;ÉÂcÙg&ãXšÙØ><Ø"‘EÑ_Ÿê'Ñ HSž,²ñhTWWߺ·º„ƒe€ƒ÷Woî¯nÞE,HQÑ(¸ RÄAœ’à~|š‚(™ÎÆxòaJð$kÖÙüÔâI]îWbÑdó¿MÖì_½zß‹éŒr<ù±ÌÚV_~¢™’d"ª\€¥ˆ‘hB)›~¹ÿùêöþê?W|ÁQsóŌùúêÓ,àùÏF,M‚µBÊà· î®þu…ûëื‚ÁaALÂ׋éVBûԈv[vEµÔ·KçwaœSÊ'OSÂ'¢ÙëGõ¶éVúº,*ci“5YYŠRßuµù…‰`y7ïéùD1Ga”€Çʛg=Äs;A$ í€ì¹h‘ +“]ç`³f”QÄ"`™'ú³Ûçl½)éà{?H ŠqÌ<â&Fïä¢ëÆ®ãxÜ7¼3¿YٚEo[qX½ºx’Q̚"{(EûÊó¤·"Ä(1QðCî¥C”ÅÚ¡_é, ~ýŒ9¦ð‡¼–öÀÆ,… †ccwr,sc‹Ÿ™¹(A15¡»·ž?ÖeYKïw$y½0/ە~Õ–ëP?Þøz*3– :-ù™g‰{ ÃX2i»¬Ñ„*ï4¡Ê+ÉŒ¥:Ô@TŠrAßBŒ4Sö¡Í +6ÄQª'úŒ Ö“Þ@Ž`öÆ ¸7A 0œÉ•×ǖBRÇÌdÄ@ˆÒ„\jÿ^Šáô˜8€”YbW EÄààþ8xH—ÖxèBgLQæ)$¤h4¥z$ó¶ƒ"RëÚÇc·bDRÞw+x©Üt ˆ€¥WEi°á@ÒÓg NÇh!ÑP \„r1Z¢ÿ·½â—ìՌ¥1âàÁ *·”Gg÷L»gÆÐñ=ƒùf½Qh: £hòFn¦“<›Ø­Çm©ïw+Qé+I&²fxÒ»OñèË¡°ÅÔSD‚0s©RTy3eñDÀ'ÔZû?98JøA +g! %ӌÌ÷jó"Ûvõ:ëŠÜ–¥„FâD[Y®²µEbM²ÇN4úRdùÊ<ÜlJ0£T^=PEüºZЗ}NQFß!û!”ÃÌÕ õF«ö4Ä2¡hÊ'ÛJk‘wÖeP­YaJ©¿Â<«t­ò`‹˜‡.ƒ2w;Πî÷êBœ.ƒè^›Oö¶rÕRwQ%e‹È5õp7â6˜J™cÉ(ŒbÃð$dy·Uä®VïûgÔHö€:1ڍ12F†ø怩¿Œ%x‚TŽþqȳÁœ—^k „€mŽ…É[±Ô­ 1¿-U8²Y2·€ßŠj12%X#zÎí6ÔyýË?úõöãÝ툥0FɁBàǀô}**Ù5¼Öú-žeµXt_Æ4”Ä ¢ªu£ˆš0¼Ùå¢õj¢CÛr•I8<W_-ÅgŒ©0#7äŠ®ßè,b”ÂñÀë+ðA6Aù{²—ò±#H§§Ðuª=sDS‡כ6ÉOñÂQNSÃ!õÌaDµ6«¼¬G*WÞ×ÿ¼Õ͌ƒ3†­»,öN-Š2DÊwçöÇ8b  )l[=~smÆá0M§GØhýæ´-ð$fUÝy$€ÂµBj[̹ØHÒz! z}涢*EµìVsÑ4Z»Î!!î!¡Ñ' +sD€£Áqö…º3~†ÒüÆ;Ôd‡ô*b1ìñ®³çb½]ÛÞ·9ÚØìê¡ÊÍ6*!”Êÿ±$:ºpšó؞~Û3ø@’}.µG߂ -›­ü·‹ëéÊÇ?Œ)ÇPd:͗c´*qèz¼ŒôtqÛH†çÎsLˆ †g)ðڞ*72^{—ÈfHk–Þ§…ÜEFÓàp¦û>Ø#/¤eѵG{¼ã'(è0iß1?ù†ÿ“Å-èڅÿ³ÿ;þ`‚ƒ˜ðáº>H€Kh™[‹-}k¦o~ƒã¦œOÌÒÿ‘UÛÌü¿KΒ’[8F²]%ñaZwB˜Eê•ýØ«¿éƒúÁ_’Ĉa§Ñ«®Û¼º¹Ùív(o°à¦AEw³Ù”7Çtѳ";‚ÎÈ£åÉuÝ»™ðp­Ê®£øÿ¨Yy^ +endstream +endobj +6028 0 obj << +/Type /Page +/Contents 6029 0 R +/Resources 6027 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6015 0 R +/Annots [ 6026 0 R ] +>> endobj +6026 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6030 0 obj << +/D [6028 0 R /XYZ 90 757.935 null] +>> endobj +6031 0 obj << +/D [6028 0 R /XYZ 90 352.762 null] +>> endobj +5608 0 obj << +/D [6028 0 R /XYZ 90 330.451 null] +>> endobj +6032 0 obj << +/D [6028 0 R /XYZ 90 330.451 null] +>> endobj +5609 0 obj << +/D [6028 0 R /XYZ 90 166.649 null] +>> endobj +6033 0 obj << +/D [6028 0 R /XYZ 90 152.113 null] +>> endobj +6027 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F11 418 0 R /F65 376 0 R /F1 542 0 R /F8 504 0 R /F7 505 0 R /F23 340 0 R /F31 472 0 R /F72 471 0 R /F95 1788 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6037 0 obj << +/Length 1226 +/Filter /FlateDecode +>> +stream +xÚíX[oÛ6~÷¯ÐÓ*5͋HI~[ƒ¦h·Ùâ=¥¡È´#L—¢›øßïH¤dKQ\7i·͓)‰â¹}ç;Ÿ…µƒw£7óÑô\0'D¡ Â™¯œ;¾ ˆSâ̗ΕK¢dkK¿¸´È¨ýb¼è”…1ŠBXâüz®†ÀO»å5xFC +-ïâT.Þ盭8yÂ<(Pr%·¨Yn³l7`‚aäy¼±AzÂAmÑ•äi’ËëJN òTø`ÚG‚Ú}³MÒ¦–Ñù¯ÍRɸ*8„Ô6HtRsÕµŸ:¶æ‡½ešßJ•è>˜†àÒµÕnÝ=tìxçbBÚÆå߇©Ø“™ŠûdÒÐ÷ºL:LLàaª ÃÔ}¯›Í‘Ž&¥VÛXo•9!€ݙ§7Öî¾¼uŸÂ=&na7U­U¡cÐ\7È.Æm”â!Ÿ=ˆ?–ƑG[žùÕ¿~Ëb¸÷­Ö›Ùtzww‡âmód£P¢§›M:}ˆ‡ƒS*$µ‡¬ +ÛíY¡dU¸™Ez(ÿÿíßôó +endstream +endobj +6036 0 obj << +/Type /Page +/Contents 6037 0 R +/Resources 6035 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6015 0 R +/Annots [ 6034 0 R ] +>> endobj +6034 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6038 0 obj << +/D [6036 0 R /XYZ 90 757.935 null] +>> endobj +5610 0 obj << +/D [6036 0 R /XYZ 90 656.296 null] +>> endobj +6039 0 obj << +/D [6036 0 R /XYZ 90 642.257 null] +>> endobj +5611 0 obj << +/D [6036 0 R /XYZ 90 472.264 null] +>> endobj +6040 0 obj << +/D [6036 0 R /XYZ 90 458.225 null] +>> endobj +5612 0 obj << +/D [6036 0 R /XYZ 90 288.232 null] +>> endobj +6041 0 obj << +/D [6036 0 R /XYZ 90 274.193 null] +>> endobj +5613 0 obj << +/D [6036 0 R /XYZ 90 89.441 null] +>> endobj +6035 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6045 0 obj << +/Length 1531 +/Filter /FlateDecode +>> +stream +xÚíX[oÛ6~÷¯ÐÓ&3CR$%ۀµh‹t햭°¢- EflaºM¢ûßïP"eIVœdëÞú$Z&Ïý|ß¡°³q°ójöl9»x)<'D¡ ÂYÞ:!v|A§ÄY®.!ˆ’ù‚`ŒÝë9ÁnTeÑêzN±[¤‡­\WÑêMrSEÕáòòU•¬ç ʱû<êº]þ.oe5'+óX‚$ááRÊ矖¯g/–³¿glÁitsùwâlöávÖðþµƒ‘Î]³+sõà™:ïf¿ÍðY?¨‡°à=?Eâ)¾XDº1Çq‘×j¾ðá¼þcõJ沊TQ­Þj%³vç7Ú³‹—!ï™ã Q.ÀØƚFÐjS·;†{1Úm­Älê‹[0"Pg~…Üøø!ÉÓ$—߁`¡Ü—i'êS{žãÞy }$(k>Û%éÚ¤+jðï»v¥Ö!É7ƒ-µñY¯‹Ûã1³²±©‘6 Sil]nåøD’oe•(c‡²ê2ŠÍrd2¯“"*í¶v:û6ê»JE{Q +¶#ÁÂÖ4SQ&•¬êËÁñ£˜AzI€|‚‡œžæ¸wn†ÁMv“ÉÈvñ4±1¦y—ÕèyŸyˆñ‡N¿ØDzTÚ':˯VÐ0I>gØý¥ÐQµÙAÂÔ¹„…ô€ª˜Sîޙ'ã?&0‰yæ…j2+Õ¡]Þè^ߙ÷Û¨ÛÙ>Ë"ÉU=ŽÝÀïEkï‚ÀƒõÜNe¾Qە¬*(¾3îúQß?ãïi¯3ŠÀA<‚†en<ì#[Wä÷E¥™Uº†úɸМjÕG›¡yõ!WQ¬’ç`‹äV#̈ÀI¤¤µÜâx‘›W·U‘Ü*`UÙ)%oãfKø~úcˆxâËџøJ_鯡?H¡?ÈY™êÊnÒ7—ÁÝƳæ~?¡îC¬c5u(eH¦1߽ʕ¾YA½5˜NÉLj³î6ñã„|‚ÁXfw<‰©µ ½keû¬ØOXAJ§çÜšq•/‚{¼Á|ôš‚º xÈëã°05OÀ¿ÛpSh]û)A Œõf + ^@Âå>Q‡U{>uw&T0|Ñ©øa¢G¨ù…y¿zþëÛë7/þ¼Z¾Ÿ‚`N +ÄcF2Qq±\xXßÖùpz¸gd1@fÉ"šÙqS쇣ë“o ¬XõFø¥ìÛÅ°ì"ð³QÕßÚ(ƒj Žâ-•ªmc=YQ›M%0sRŸØ§¶‘²–Æén-{¬‡½ú¶ž?8yˆ‡ô‹NA½B¿w +¡4ÄÉ(FÛá¢Pk2ŸœxFóŠÎ-ê!¥ÕÝçŸaëÜ{Ñåüh´eɨù2exzÀŸÉ&/*Ëј>¢tS@Åm ìj»³cÕ°3/²ÊÌ'ÚΆ´­‚»çs,|X³vJá_öŽþßÙîDÍtâq¯‰~aÚM¿ëµ›þ§˜"v”Éyb÷x<ʎð: s-ØèöŽt®ßè\ÿÛYFÁ2Ã,š“<1ú‚Ö§ú.*ão”"@! û‰²ù4 > ú0_·Ÿ&y®³Q]kï4÷šŸ–|۟†ÛÔ²úvιkŠím”ïl¡iFþ¬Etw/Œ4ãi°77ŽwR'[ÏþrìêçY“¨£½$€HᎽ·J•—www(®Ñ.OÊ +%ê¢,ӋÓbêI¦ô;!·öҗA“Ùû$¼Ì"5ÿ„¢Ò± +endstream +endobj +6044 0 obj << +/Type /Page +/Contents 6045 0 R +/Resources 6043 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6015 0 R +/Annots [ 6042 0 R ] +>> endobj +6042 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6046 0 obj << +/D [6044 0 R /XYZ 90 757.935 null] +>> endobj +6047 0 obj << +/D [6044 0 R /XYZ 90 733.028 null] +>> endobj +5614 0 obj << +/D [6044 0 R /XYZ 90 558.496 null] +>> endobj +6048 0 obj << +/D [6044 0 R /XYZ 90 543.926 null] +>> endobj +5615 0 obj << +/D [6044 0 R /XYZ 90 347.949 null] +>> endobj +6049 0 obj << +/D [6044 0 R /XYZ 90 333.378 null] +>> endobj +5616 0 obj << +/D [6044 0 R /XYZ 90 133.546 null] +>> endobj +6043 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F11 418 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6053 0 obj << +/Length 1915 +/Filter /FlateDecode +>> +stream +xÚíYéoÛ6ÿî¿BŸ6¨R"));€&=°®]³ÅÅV´…¡ÈŒ-T‡«£Iþû=^:ÙͲt†}±IêññÝ¿G ;k;Ï''‹ÉÑ3î9! +¹ËÅ¥bÇç1—8‹•ónJrÉlN0ÆÓ³ÁӨ̢åÙÌÅÓ"½ÙˆU-_&eTÞ?/“Õlî2<=M£ªÒÃßÄ¥(g$˜Š<À‰{„O]—Ï>,^Lž.&Ÿ&dÁQg3ùsâlòîvV°þÂÁÈ çJQeu=øOóɯ|P×C˜³žÈE¡Ñ¥Ù6j!¥8zFHok@áéɓs¤—véBÆ>¨Uß:m÷œ¬¨ ѶqR™e³CQFµ•4N›•èq°ö"Y #«“-/;þC†„à¨/,t9 u eu<ØÞ±†~€|ÂÑÂÌíg@oÇÀ÷„¢¶ª-¾yõ `€Jäu’¯õJmiºh¨ ã}ó¤µó®Îaçæì9¤~HǒjŸÐ4D.cÐ‰ S +ëħ}’¬ó¢FܨÚÑ$J×Û&ÓÓ¦²”Kº…Š™Y¥z®åœ6U²r6=ì^îÃTuâPç•ÜO¯c±­!€ÿ¢oÃ.¬ªŠv*òu½YŠ²,ÊCVór}¿³ZYȽ’ùà Œ/õ¿1J—j0ì§S©6R|<ŽB·ìîÆë@K[/B™ÞÉYtdM¦'Qšj9µOnË5Wù6w1E4±J;nì2£‘r:÷BMÀŽ‹ó‡xNð=DžOïèÔÛè>¢Ä;èR2ÿ^€N=¿èR†×q­‹G¸Cš=O}vòaDÂ/t0=£HO@Œ–¢¨Æ€ÌïC=„Í] Ü×u,‡¡Þ? ó³¯óä0ïA¡¥\솈÷BùÜÌmôìEvÚ”Y¦0ê!{HMÒòMköË LÕáðoHéàt¹SŸ>§”vçõ¡~x|µÃÍ@=,uP?Ø¡ ~Ó{Àß“½¶ù"ö÷°á°_§Ä^ì÷Pà·°L ÐÂèf€üß ü—º[™ÿ­n€ýn€|Ån@]­‹ë–œ"J½/^ðÙÃ\ð}%…ZÃY×ó Z/ +yØõ˜L`õî6ñHû‚º1«½Îì™JÎ"[ž*fŸåÀB¾^¶öˆ¸P·Ú®š,ÃbZz/üLâQ„=÷îÅk‘ƒvñ#Sr¨êŸeGéü"j L\È,ø,”-ìúú¶èl£žÜ¦«ªÿ‘^¯D­çJDøo¶[QêgQ¾Òk6ËJ=5²6 +ì€î²0Doô¨­ +€Ä¦¿oDn˜î—’Z)½VÊ:I…¢ÈKúÀkbª¬'›þ½ú%»ú¡}*ù›g E6ðà?<†hˆÊ᣶¬KŽ–žêGW€ ¦@æ鍦*ra÷5¹)`ï1v¯•Q*MÔ¾Ñ™yÃPõ‚ » ¨¬(;tP¯a{Uq…lµ+èžwZI5…ìœÛ·$¬“PO•€Ü¶V@¨Ô”ñÀ˜²˜Z2Ìv,+W›D 5Ò¹MXÓ± ƒ~lÚCª¡âSc¹d䀘Ҙ#:ÓB‰jM cc*A# .“n%áàb@¬#aÐwÙq@+8`F¦0$ӖSg#ù.+ MÒK¹T'›™R\ò֌š<‘»L²U#ìƔŽMZÛ)ßIœ^Öé´¸À]×Ø{l²B¾;+VM|«CÞá´'Q+…r4à‘†ÍÈ»4Øìaß­uH¸·Émø­&{o©ˆNû»Ã¶–¨ÿÚ­ÅÓ}ZxpstÛ~î±ñ‹Ú¥E‰ÖC™²è£‚t+¼m½UËQ6q]˜[Ýäue7†L4Ì z?5;w¦Ý¯:ÊLm#¥§¦›Ò“7•(¿Ai3ª½ŠòÆÞdwe³¯ \ŒäÇ Ù•˜ä9Â(©5ûèØÑÏÕ´tò’ÀGn_¹lêz{|ttuu…â +Á¶%Jê£í6=ºíÆhÐü–É¥õA·!›õ£ÚvÊ}ûÿ ðä%‘ +endstream +endobj +6052 0 obj << +/Type /Page +/Contents 6053 0 R +/Resources 6051 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6058 0 R +/Annots [ 6050 0 R ] +>> endobj +6050 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6054 0 obj << +/D [6052 0 R /XYZ 90 757.935 null] +>> endobj +6055 0 obj << +/D [6052 0 R /XYZ 90 733.028 null] +>> endobj +5617 0 obj << +/D [6052 0 R /XYZ 90 538.7 null] +>> endobj +6056 0 obj << +/D [6052 0 R /XYZ 90 524.13 null] +>> endobj +5618 0 obj << +/D [6052 0 R /XYZ 90 308.228 null] +>> endobj +6057 0 obj << +/D [6052 0 R /XYZ 90 293.657 null] +>> endobj +6051 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6063 0 obj << +/Length 2356 +/Filter /FlateDecode +>> +stream +xÚíZ[oÛ8~ϯÐÓ¬ Ô /")fчmѝéìtg²À:…!Û´-T–4’Ü$ûë÷P¤nm'ƒ>ôaKyxøñ\>òÛï®^Ý^]¿,PH *‚ÛM p Aœ’àv| + A”Ìæc~œ&Õ>Y|œQÙÃN¯«dñ!]VIõpsó®J׳9å8|%umÕ]ÍHê|¥A’`D„”ÊÙçÛ¯ÞÜ^ýyE@vn.‘d}ÆÁÚ 0b*îÚ^û ¢ ~³à·«]a·|r=±BG¤Ù5½¹_é²I‹¼¾i•8–rýVñ‘#‰U0'ÐĹQ7뛛LçÛf·ÐUUTA×o9 Q)áK;ôvW3Êû|6gœ†éÆü²°ÙiÛP—ÉJÛ¶uº×y šÚ/ÅÆL+œ¨QĹêÄ/‹{Ûi¢%(Š¢®žz][Ánnî“ûtØÛÖ$ˬ¦zm¿öšQÐln¦ æ”HÄxȏÓ¡2F"EbȑŠÈ×4ŸE8üšdéz‘TÛHkÎá«@õÁkÌ/õa1q1Œ"Ú#¶*ò&IsgÒIn|°/MQY±MW—k*Jíf_‡|]# ‘EDÂÊ%â±ìôÕNŽÞ—YÒ¸·Uë@vÑÆ7ª­s’_ß]ŸÚ.¯¬Þ=*®y¨+£$@ϯ麛¢›kSt[›æ[Û´×Í®pªz<à“HILZlb$q‡°v½©.š‡¦0Z{Yô_þÀñҺñ?累Pªts¨:øûeŒÜ£…}sôý«Y¾^5àží»³_óÁ(+ê~õýmÂ*]VºÓÓ®aùpÔweám'©zQ`NÄeQd´^€=4ß³ÇæÏ0"¼HMuÐ>cŤë”n:Ówhygíé橸¸]ÓõªJ—úx7ÛõºÒ͓04덅p Êc·ºYdŝ®­,}fúå…ý5p@ƒqèõ‹Öo!÷µ¡`®PÔ¥×…ÞlÒU +æáFäNÈã/ë'ì¡ +"¦øA»¾„Œã½@”õáî½GZ ¢XÝ ºJ8˜• S°èê«qþ$³ŸVE–^ùÚn–é]ØÎf”/åHÉ}ÊùâÑBòòæÍΊí$÷fó(Ráûg­J¶Yû©kMk;M^4v’vÛ[ÿ…ÖMUìíÓR»è7<„}c8ëÂïƒËi1¤&Osšu'†ZŒM’Õ^wR(Žã®2“òðÀ·ºKg,ô LÓ÷Ì!"$I?ÚZ§gÆ[wpÝ^ø2ŠyïÔ¹P†{ ÆÛ=Û/@™~WÖ'„ð^ˆÙ’Žå]ǚ „#zy‰°ã*šì8È6¨Á3†ë‰wØO|9ÞQ¦&ñ[·Áªl{kY@z­Á0&!þ:{q±¼ð4tˆÅy{–tbόË xŽm6öcl—n¼KW 1"/'c(ê÷«°FYë¿ûv‰#qÎ|âˆ'Ìâ÷°ë‹B*mׄ(Ý掲ÚxfRÍVWµq!_Òy0¼^ç©£³iì‘A™œT )?¦djÿÕUñ ¸¼¡¡‡²ü–4”4ô3#'X¨øf,4–—Xh|š…Š#Ÿf¡i:µVz‚…ŠS,4YŽÎI§XhÏ*žÂB‡ ü u,ÔQPqš‚Šíó”_  ìB̤Š\¤ b8€¬O™2Púú4:UêD;JOÐasÎÐ÷Û8y6MÒ° öñ1ùŒ€áLìäÿìóû”ÏeŸ±aŸ&ãýU*¿[*PsCx†€FˆDä")Lú h{gzt÷“餻µìì¼»=íïö< p…†XsŠxÒ!ÜYs`“›3©‚,¸¨9WE ô9•®þqšo³lû:eJ!†~˜ö¬Fj+²÷Ârçњ`Äéc’R>ä}Ÿ6‹×Ýíññ;_ãêˆõ®úž© (Êá +æ¥Ç£ øÿü}ñú—Ÿ?~xóŸ÷·¿{äÅ ÒHïÄ-'ñ8©!cý?éû2.Ó|örÖægpê–ôêf­± 87Úw³+d—‚‡O¥Ûš–ÂûÁ] HÒÙ¶¨Òf·wÂîv í£…­-¥¤íÅ%´­ í:ÚìC±Å¾[›‡‡"wu©Wé°…]—åƒ|~Ó¦f¯”b’æiÏmŽHbjtR<#TP„Ùø å3…ÑiÇg +ӈ51C>h OÞ?™Ñí4-ÁÖ6öµM¾CO@rŸd™=ÇÂ8 0•]õÆlêc¡„ÎãóxçvÓ¨f;ŒÃI?ʚ_tTÔÊ iy-mŽ/½G%‰ՌÁ8ËiÓ@†‘Rö&¼;¸¨•ì5pígÖ:c„!Œ 8U|#Žß£ê›¾¤õ4 ¹á¶è3ÂSóF +Ña/n‡ÚÑSvµ´óà H¯åZô"õ½•‰Ï×1‡T|ØŶÚçppFf˜T'FÙWÛŠÏ¸ +|Êd§èWõEÜVzŸXÔo‹ø ·€Ã‹Ý?%@DãüØ»>š˜´ì^»¼l_]r¶/ÿ®uõ·ç¡[ëÏI~踎IÖ®Z5¸†ã¢&?™ð Žô›Ön‘ve_‚îé'{0èKb‰Ø໦)o®¯ïîîЪF‡<-+”6×e™]?¶‡‘ˆÍ²²éŠ˜û¢Ò]H1×YímÆ#üÿА +endstream +endobj +6062 0 obj << +/Type /Page +/Contents 6063 0 R +/Resources 6061 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6058 0 R +/Annots [ 6059 0 R 6060 0 R ] +>> endobj +6059 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.645 647.573 184.245 658.477] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +6060 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6064 0 obj << +/D [6062 0 R /XYZ 90 757.935 null] +>> endobj +5675 0 obj << +/D [6062 0 R /XYZ 353.169 325.422 null] +>> endobj +6065 0 obj << +/D [6062 0 R /XYZ 90 308.361 null] +>> endobj +5676 0 obj << +/D [6062 0 R /XYZ 90 104.748 null] +>> endobj +6061 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F11 418 0 R /F8 504 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6069 0 obj << +/Length 1485 +/Filter /FlateDecode +>> +stream +xÚíXÛnÛF}×W𩕀j½w’ú¦NÐ\7Q‹i PÔÚbKqU’Š­~}g/¤D‰µÇ@› /¶–ܝÝ9sæÌ,qpààéà»Éàì‰dAŒbIe0¹ +b„’ AI0™ JFc‚1^Ž&å2™^Ž(ê|³Pó2™¾ÈfeRnÎϟ–Ù|4¦çIU¹Ÿ¯Õ•*G$ª"U`I2"‡”F£÷“gƒ‹Éàρ³à€Ø½EˆB&‚t9x÷sxþ,ÀˆÅQpcg-Nüσ7ƒŸøN?(CXŠ?E„}Œ3­K纨j7ܾøÊxrö$;ÛÓ(„½cv÷›Ò9!GœòfÂ7£± bøX/W¹ºÍêÍÔ!xh SN›ui» g‡1 #Ò0ƒ÷±ðH|ëgvŒ""ãÆæ£ßN¿zyùââ×&o{ìF ÉH6Óâ& ¼»yLP{ŽIˆ$8jç¾*çYè:f¤ze‚°[XËuZër$Äs`Þ-õǞ,T³Ê¸<"bhݶÏK°ëõRµ{’yöeׅ.Õõ¸0ÀE†» ièñR-g@[kãɺHëLnô½Ní>‰}äOJ9b<îBMÚÌ´ÎÝÒ9—UÓZ¯t®¯³4ÉóÍ4Íu¥|fZÈ=†‡èï÷ZÕ벨z"ÏâQKC‚ê±F%â¸%svåA/ü‘t‘û8À+»šîâ,8¢l‡.˜õœƒ£8jw¨Yuü>‰û×ó[µžUÊsC{ê†R ›”¥Ÿ›¼JRåX8&\ Y—ǏܼëVïÚÃä&Ä76ΛêÈÉî"eÔåý.ͳêwõôÊf‰^n‰Ôè™hõLôëPH|LÏXGîdè˜ bP²°_"QÍö‡vˆDQîÚ±!4hŒ”ž«M4-yÚ¸¯ü$õåÜ SäÉtq›ª•Q­ê¼³xk¤sÅÇ`+ޏª6œ*F’&ɳù4)½êvOÓq$†@·k²(õJÝMэDdŠ¶¸ýlâ–ÇŽ{*@iœ¦Ö€ÎÏr՗«cÅ(ÂP_9FRîÉ?û´”M]ÏT«ûÈ>ÿòeßBð‘iF¹—iF™]lž4‹ÝÈxfßÖnœ&…û1óæ +ŽO å­Ì6îqâÍ«B•‰-fXmªZ-Ý̛E–.¼Q -CVø8ì̔•IfÿÔBk~¬’2YÂùÊjÛ ™N69Ô¶7Eš¯çªÚ+hj¹jZ£mjîA½;xŸ{ à†©RŸÞ>!~_Ú»&ÐAÔ0þ—QLai–@öU% Ê"f|€.ðð˜Šgô1e 䎲·}êlÑÍ£ÖÉîx÷2ѐ£ETm#|˜§n\1?!Oé±ázO^&Å:É·ý¼s£Ü¶9APCj7Ȳ7Jy'gͯç­íyI"†ÛÌXÔõêüììææ¥ZÙªDY}¶Zåg‡Jºc…p¶F®šO€KÝRVÀÃ¥ýÚ{€ÿßãkþ +endstream +endobj +6068 0 obj << +/Type /Page +/Contents 6069 0 R +/Resources 6067 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6058 0 R +/Annots [ 6066 0 R ] +>> endobj +6066 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6070 0 obj << +/D [6068 0 R /XYZ 90 757.935 null] +>> endobj +6071 0 obj << +/D [6068 0 R /XYZ 90 733.028 null] +>> endobj +6072 0 obj << +/D [6068 0 R /XYZ 90 659.361 null] +>> endobj +5723 0 obj << +/D [6068 0 R /XYZ 90 637.05 null] +>> endobj +6073 0 obj << +/D [6068 0 R /XYZ 90 637.05 null] +>> endobj +5724 0 obj << +/D [6068 0 R /XYZ 243.423 584.296 null] +>> endobj +6074 0 obj << +/D [6068 0 R /XYZ 90 567.796 null] +>> endobj +5725 0 obj << +/D [6068 0 R /XYZ 90 479.503 null] +>> endobj +6075 0 obj << +/D [6068 0 R /XYZ 90 465.16 null] +>> endobj +5726 0 obj << +/D [6068 0 R /XYZ 335.617 402.488 null] +>> endobj +6076 0 obj << +/D [6068 0 R /XYZ 90 385.988 null] +>> endobj +5727 0 obj << +/D [6068 0 R /XYZ 90 297.695 null] +>> endobj +6077 0 obj << +/D [6068 0 R /XYZ 90 283.352 null] +>> endobj +5728 0 obj << +/D [6068 0 R /XYZ 90 166.456 null] +>> endobj +6078 0 obj << +/D [6068 0 R /XYZ 90 152.113 null] +>> endobj +6067 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6084 0 obj << +/Length 1835 +/Filter /FlateDecode +>> +stream +xÚíZKsÛ6¾ëWðÔR3Œ‚î©Í$™¦éŒ›¸Óƒ›ñб¥H•¤¢¸¿¾‹_1‰Ói§¾X í »ßî {o=ì=Ÿ}=»x&˜¡HPá]¯½{¡ ˆSâ]¯¼ŸDÉ|A0Æþ՜`?.¶ñí՜b?Oï7jUÄ·/“»".î//ŸÉj¾ ûOÒ¸,íò•Z«bN¤¯²¥I‚áSÍß\¿˜=½žý9#` öˆÑÍC2î-·³›7Ø[Áû/<ŒX$½ƒÙµõÊà5õ^Ï~žaçõGFãÀ ©@DÖ§§ï—jW%yV^#Ž¥\<‹xG‘(đ· ðçVDY­./“l`ÿ]œ&«Û¸x»ßª¬ê ¼xÆq7¶E>0®7E>§Ü?d6LÉZ¬ïª(b¢þ†z¿+잞Tð,À¤Þg+»‡v£@’aXïù c6¤ E²‘Sm’ò¼²BYãW ø^BDI¶Ì·»¸JîR…œ’®% Ê0œy ðpÙÉ2ÄPè2í.ÏÓ¹Þ:-ç./·ñûd›ü¥Íaäx Ç[Y/“LÅÅíS?‡¥¶ÔîüʚØ;o&)Âr ì=G +¨hNó›ù"‘ÿ$_è­à†¤ $$ i“F­!òt™è41aÒ„3VË-÷»Ûl@;…Ã"¢£CԞä“4„ì*X +`\)pÇ2"—A©Ñ þŠ9‘ýv@t á…µÉȉ•iOì4/ä\Õûo’,…ó|3œ ƒ„Ü"!ÔUû+U틬64GX{5œñmÑB‘.¦¦ÊÌ"ÏÒ{»ªë·Ww\ F¦ì:F”Vc–Wv¡¶»ê¾5ìTEˆÁ&àHD¢c%wù>[)çíºÈ·NÏ]>'ܧÿ(€lx0$¡B@υ€y|d TՇM²ÜØÂÓÅ«ë²Wx˸t@UmÜò¾P:?ÍÓ;Äqºw&e‘ÛݾR+t„ê}DÃ(Š$GÒÔ(t¨oU¥Šì2a€ÇÞI5ˆ XÛQœù©Á;»Vú„@Lz:¹}½sûkð\Õ¡¹û]-«fïÀ©F!¬ÅC$v÷T¿=òµm "h¢Á8ŽÆ'B2’'ñÉ Sq•»åëi¹qÆ<«ëؾÕûXpbÞJeù6ɾ€ ¬k_¢»ÉÝ;Cx‹ãˆFR.jkEÏZÑ/5¥™Ù…MÆÐ/T¼ÜØT ¦ôl‚9Í$¼hR PPé—êÂ<˜ê¼l hLp·‘|ب!#¡6ešjg vȨãâ2t &> ã'~cá_Aýۙ€ImòŠE]@§µ ÆRÙÏêá-IÝRô[‡¤ÚØýK3ÔÛlÑózñÖ î¯žÏ¼³ùÊ hy¿.-dӀèpµ®4/÷õÃ.kJ÷É PVïÓÊ»ó«‡ë‰´xÅë²±¦¥ú0Œ0—ÒÐ(âÐl™Â?Í:܀†&ßÍWXÎfØ")Xoê‰Âf¢Š„Ÿ’9ƒæçÂ=(ÚNm ¸¬àÝ»û'aš Úüs»lgx:•§ŽMk],bC28ö§0ãµõCŒÌŸÀ8pkd‡Óœtk)'[Ùa.ãVÛµ.a, úhÒc,=‘¡¶Q7¹œªµ›’öY•ïuÛ¤¼îëЁ‰xŸñÊÿãՍhñJDòьW°è˜ñŽi"!Dy£# ö\FM*Û5•ò:ÑÏUV¡£†âÆ$Ó#‡ '¤O¨µÄQBvyï‡5 9D.2Ã#£I„šM Ôžù…5À¨OÙî#¥>K©Å§Qjs¾YÍæ²Yڑp`Îè ?j¨±ìÁÑ÷Ä)h{Ÿ§˜!!‚‡eôô‘Ñ?2ú/ÈèÉ#¥ÿSzþHé?ÒŸ)LúÜÌP£ \¥Õ~Õ©|>¨!5® èêwÊýr©ÔªÔaÀ@ϓ4µè¼×¯Úä­¡Fæɾ¸ÆD`´ñQ ó?;\pà9ì¤ñiIUÖ&ÖuªŸš`~¸ÿ1†Dïõ¿Ç›éMˆD²%-Ÿg%a=vO)«ç`½¼ÑͤÅíñhˆ6³¶^4ó0¥ÁÈEE<?ñ Åù{àñ„ûÓ^„觑‹ #Eøù!=3Ç.B>RÌøõ0‚?ºö°_5ÆzAÊÉ* 8ÿ\DHð-b~v+ ™t¿váÀlyp4°]é[ßÁ¸ÇúÆ>º›ûðK©Š¯çœûŽtügûØý—\ßÊX>W´³:̼QÍÒu'‡>öZ)ç¤õì¯^ýhg·Ö^"CÄZ꾩ªÝåÅÅáp@Ëí³dW ¤ºØíҋSLíH!pðu=”nóú’ ÞܚVwÿ¿4}Ä +endstream +endobj +6083 0 obj << +/Type /Page +/Contents 6084 0 R +/Resources 6082 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6058 0 R +/Annots [ 6079 0 R 6080 0 R 6081 0 R ] +>> endobj +6079 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [338.247 515.886 386.177 526.79] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +6080 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [338.247 231.68 386.177 242.584] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +6081 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6085 0 obj << +/D [6083 0 R /XYZ 90 757.935 null] +>> endobj +5729 0 obj << +/D [6083 0 R /XYZ 90 694.089 null] +>> endobj +6086 0 obj << +/D [6083 0 R /XYZ 90 679.519 null] +>> endobj +5730 0 obj << +/D [6083 0 R /XYZ 211.842 423.995 null] +>> endobj +6087 0 obj << +/D [6083 0 R /XYZ 90 409.27 null] +>> endobj +5731 0 obj << +/D [6083 0 R /XYZ 216.764 121.791 null] +>> endobj +6082 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6093 0 obj << +/Length 1978 +/Filter /FlateDecode +>> +stream +xÚíZKã6¾ûWè”Ø@Ìæ[dïi3˜ 6™I9L µMµ+K^IŽÓùõ)Šz7ýêqv`N¦$Šõ`ÕWõQÆÁÇo&_ßOn¾‘,ÐHK*ƒûU qJ‚%Áý2x?%Q2›ŒñônFð4Ê7ÑÃ݌âi–<­Í2ÞƏy”?ÝÞ¾ÉãålNž¾J¢¢pÃwfeòQS“. ¬$‘SÊðìÃý·“×÷“ÿNè‚RÉ! +™›Éû8XÂýoŒ˜VÁ¾šµ 8eð›?N~˜à£vP†°=;Cº¶å1Ë«Ÿ8ϪÛÛMœÆ›øwã^ú ¼ÈÒ¢t—oãÔDùÃë߶ÎÒ¢ˆ³Ô=úÂÚyó=å˜"H + +ªWºûZ5k`QˆJÒLúj6„N_es;5˜3 3 æ`™µ•fõ Æt›´tÎ÷Iç!Œ5ëÆéê!õH§ö¥ƒ×^egIÉP÷%,} ̔IhöÅ¿0ÓÓVõjKvÏÒ0OµºÃ^·¤Û17}°¬Dœ·š¼Óöóƒ›(po✆es"I¹›ÿΔ»<-|ëB¼…í–ùÎxÖ¤)¥Zg­@U­§Qºtƒ,MžÜUoÓ¾¥B"¢xg*f=8ÒªSc§Õ(œÌ4+ÝÀl¶åS§Ús!†Ý|ÑgÈxÌvéÒÔæ®òlSß6I6£bº·— +¢Èc=ÁË]Ž1Ÿž2¶ªŸkŒ+²Òd¿Žë:ëEŒ²nÆX¹®qjÓÄguù«5$JvÍÓ¢‰ÇÍvWš%ª°°³Q,Ï1ÒZBèqD¼±¢)M^Ü^î$`IˆmÜ*„nRK(o“í¾1-©°ÎÍŒˆ),Óø s¿õü8ëÊPìÿme;׳©Z"Fè5bº¿©ÿÙ:ðxW€›‰@LŽ ñ ‡BD¨zæ¡t·1yTfµ“²Õ™ÁqBC'Ì)HFÐzPC‰D‡@­†K“f°/××щë;±Òýl%Gª«†‡`2D¼Ëb “Lh§/ªJ©áÎ{¿—öé"JÝýGã~s-Ö6FÝ»ž€# +Š +ܹ äÐl.™œþ3± »¯²öÉW'8E²«ÈÇÐNÚ¯OI*§°ÎŒ¸ÐC«`Ø[Å`§ ÝÚÝ7Üó;†ªQ`„OW6Öaà]€­Uå ÛÚg£2~Œ“ØV;k—ëúaÕKºø±mbþ±îß½™ï«Éwuז Óµ†rj!Ü䍬$+vî‚M·hS8l)"ÇÐ^£X²KÊ&7Üoä÷&•œ…IaŽ£;ÇÐI„:¶ßbNêëßf[¢^îºS¼(¡gE9è%ñò!Ê?,¥å1´ÐiځEîêommÓ~Œ#ýdÕç¸ ¶{b>tax6¦/,o/ÛmšÇil‰Ûp=ƒ=¬‚/ÂB÷ê¿VÞ~£gî§tÐ>2Ño„Xț˳ܳ² Ðýžô¶]ZŽ—®ú8;h›-{ᚭêvÛlI9ãA?èx5k͕ ltèx%acéyÕ!7Rýý£°qÔÃJ†Öé~éS*êqDM¿B™ +fñ! 8Ç`M¨b¬sPy‰YÕ°±KËlg‹ ò0–yýúÜ¢-ãCÒJð€µ +©.g­Bê>kµk`­ö‘—7b + ¡ºµVÆ)°<*8c2úÉ2Ôª°«,çÓUɞK~ºðó³èªI¨éꁅÛIGŠÎ¤«õÊoLÚ6‘<4›´¡^U2¿Ú˜¨0¬w„ +‡~£Â,„^ÃraÈI0ò3þL…_@…Ýæv͔ ãjèz6O)‚|ÕÝñÒY]‡kïkÚ×ZŒ>‡hXè˜8Ñú“¸8y§{*þ".Nþòdü.þ¿¥â/bâä""úcâüOcâü¢£ˆ+2qù™‰ÿ©LüDƀ42L™¶©:’Ó˜¶»ü³ …>ÒFe‹ÅÅn±0fY|U·8I†à ®?¦æârH¹€–M~J9,ŽÍñ²È,wgº@ý‚ó r¥ã ¢/?¿ ×:À¸ÊÑÀ‹0ø–ц×Ð2´;*²OºÎؽ6RõÉHµK³ñÒU÷Mú-2i[d2h‘``:¿<¿ =&ÖÈîŽ/ÈÁž_Õ ¯p|Á¡jŸ<¾8oî%ž£ú£”©pµ~ ‡Gt=º9t $T¨^~ +¢5ü§ dôíŸ{ +d·Œâ´†¹Á·{<íþ´àýâL-B´ òäQš#Þ}“ö~lù²4„ä9ÿ#2Wü4sî¡F¼‘«š9÷PpȜ¹ÙõÁ«u»Ç(¤#¯–,ïâè1S +’ým*ÐÀ÷à +t½“ï3rØçv`^R]R}ZWŒÿÊ#øBûOžê< ‰„mgªþ4ÇBðaº³D×æ|}Ù$½»¬3ß]üT˜ü˙Ó:ó¿Ò]”t(ð«] +h{Û¤ˆcDm#ەâéÆÔF:Ëþ4£ïwêô%*D¬;Á^—åööæf¿ß£Evi¼ÍQ\Þl·ÉÍóê­B8êêȪ!…›,oÙ ÜÜTå3ÿÿã:hZ +endstream +endobj +6092 0 obj << +/Type /Page +/Contents 6093 0 R +/Resources 6091 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6058 0 R +/Annots [ 6088 0 R 6089 0 R 6090 0 R ] +>> endobj +6088 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [376.58 578.09 424.51 588.994] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +6089 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [376.58 300.233 424.51 311.137] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +6090 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6094 0 obj << +/D [6092 0 R /XYZ 90 757.935 null] +>> endobj +6095 0 obj << +/D [6092 0 R /XYZ 90 733.028 null] +>> endobj +5732 0 obj << +/D [6092 0 R /XYZ 211.842 489.098 null] +>> endobj +6096 0 obj << +/D [6092 0 R /XYZ 90 474.634 null] +>> endobj +5733 0 obj << +/D [6092 0 R /XYZ 216.764 193.824 null] +>> endobj +6097 0 obj << +/D [6092 0 R /XYZ 90 177.98 null] +>> endobj +5734 0 obj << +/D [6092 0 R /XYZ 90 89.441 null] +>> endobj +6091 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6102 0 obj << +/Length 2342 +/Filter /FlateDecode +>> +stream +xÚÕYKs㸾ûWè”HU#o‚®$‡ÝڝÚWe3ëÔ&S.Š‚$ÖP¤–¤Æãüú4ÐàK¢e9ñ%'`³Ñ/|ýmgtöþæ›û›ÛﵘÅ$Ö\Ïî7³˜Î"͈âlv¿ž}œ3F8[,¥tþë‚ÑyR퓇_œÎËüig×Uòðs¶ª’êéîî}•­K®èüÛ<©k|ü`7¶Z03·Ej“LϹ`‹O÷?Þ|wóÇ YèŒù³UD"¡féþæã':[Ãþ3JDlfžj?“\Ào>ûíæ7ô¢\ªÕ@"ãA™UY拥¡ñujÝÝÕM•¥Mþô–E“dE_ÿ‹* +;uã–fŽ&p/þä¼ý>V©„Q ’™½POH2\É;`ΐäCŽKab"™-AÃXm?fEžö~ èà +”Ñp†§ü`›cºœsøv’4ÕÑNpãšHÊZ¢lƒ.OŠe‘?á¼ò_ó¡®J.t¯,rH›î„f—Õ/ŠÑz +OîÜuÎZ+b4?ñƈ±"qdZâC¶¹¿-93DˆÑ2ÆO¾ûšÚC“óîF÷LFñ," +,XÜû²n ø²b!éüK’g뇤Ú÷¶hN¤Éƒàb÷»ª\p5,.øBrr•+ø«\á"áœÓÄDú’Ý ‘:î˜T_g w Ö\fEZîI“­rK&nxƒ“@l z1eN@@hìþ'MˆlƆÄDD]øÿeâ @*ÙÉØ<l‘ìAPhòCÑ8̏ylɧø3Õ~þ· þŒ#DKá9•\Ü×`ւÍ!r¶¶Äêd±UVl–î83P2’lŒ«ò+ZÛ!Û7°8—]D$fæ’m@v.:ã\a¡‰¦üsôÀ8®@™î̕×ùë#IŒTcˆ @1 ± š”¶ uÉ {QÃÆû{•56äÂfgÛ³L9s(ôîv¦ß”ÕÄeӂš7ÇˬhÊ©[ +^ŽEoϯŒà#€tÚÇD3Ì ZrªÇq¯ºtªC:ímµ +Ùo$¸¬mƒërƒÇàI|¦½®ÝÿâVI~ô†‡×Πþ…MÒnu`BK©âùï;[àï%G<á%xíåt¯Á³ |䔦ãKôœI QL^6)§$îÃmÁçM–[w÷©€¤ +¼ý& Wó„õ!I-¾âs¿*l8ãÞ:ŽáXgòøUµ­\U6rû¤Â­/sð‹$&çǵ­'"w) HQñØFÿKü + vvÜIotùî[}º€6Ü#´ïGñ#À5Çb=4‘ã^fÎÃ1M`'À`õ1o\Ȝ+È–×DÏ€î€¤Fþi^Ö£->?”uíÒapKy¢`YeÛ¬xL bhü¡ñÇ¬Ù!ü«¬Éœ‚û¸;ºS̒Ïr*Wåc…ï֏x™†×ZØÅÔ‡àÒþqLòúN…u ¶ øðCÒÝÓA|üà Å Èñ‡C n®ñy—¸$Ûquôî  ‡­¡ä°ÌŠ%°Kª&K¹»@nÝ¡.ËÍÉñxÁÂVÑ=U-÷vÎ ŽÝãx ÜÁKÚøˆÏ‚D®Êõ1EÔñúLàd$Õ'’ 9¢Ë#ï€ÜÌøÆý [Ù¢l«ô­íñèv›íÄ#°7Êû½%Àœ%(‘BŽ”–eµÎŠó· n’!C¸.JdŒ—è yâq<.M‹–øÎöQ[=áûa8É. +†g‡4èö0 ʱûep¯ÜLÅAà&Fê2Í@Õ5®ÇñÀ¥z&(T]1{̄ÖãrŽð‰Ý=ø[NЕ÷­@!¹¹Çpà)Äd5cÚ éb¨âM| ŒNŒ[hžüi½}ÄM +çc =ªê€AÛn.2ˆháa‹ƒËi~ Çå^’G¬Çhè E¿¾²5„*~VV?×{Bój¸î›OˆÝˆ§Ú†Yχ÷7³^™Ðbtܶ¯ B.ÉÒÝëêç,8Th—~TBý_÷íìÍ{‚ {ôâeÇÝß»sIt¤ŸéÝåh€çX_9ÀûûO}_ë?>o!¹†ÞueWêï¬ÿùüIèa4£Y€ ÚtJÿuÂt†°~¢±¢ÆN°ápuŒ¹ØšŽ;Ni¢”5߂ȟë.fp$—ç'W(„¦Gø*K09ÊÖc5¸¨†€âv}Ú¢b>+ºÛyzÎ¢3ˆy~Ôh´ã¨mu[ ÁÖô¨Q¿ÍxËôÜÞD5Jf!ÐÌNšS3CÇ[dæ6s¥ÝÔ}“a¼ ˆÔ9ö4ÇøÁ¡ó6ƒæñœg ^š +Ä-Šìl19€žNƒÁÌÕMÝë&‡-„ƒ¶¡ð*kõÂVQp4ÛÜ'^„ƒçâ®'‹®¢³“!:oG¼¢sw™ß¹¥¦£Y¯³‹Xù„Éb LŠ¼½ð|꿛p+§špþFC&֏ôöGß®« ÓÏ$ס¢r ¦Oª­Vöb<øƒÌõ¶D™hØþs΂Ç'*°ų›{øþ¶ë·}; ë&¬¡©|î6“ðmeE~²×ößP@*ɱÃàm t9f#ÜݵǬ¬«ë½ˆÐö±wûÕ±XNVîÙޗ¨Ì•î¶òŊ[ó¹-cíbE +¨ª²B½­ëd‹Õ3këpÖͱüÇåT•ÏÁ3´__Ú¤ÀxêŸÞëرyšøÚUòé´3”æKVº‘üÚâ¸0 jaáð‚ëhlcm7ǼŸžŽsÝáXʶz.CJ\ە+ŽÛmW@ö#†à¬3¸9ýÃR? +¿òÿJÿ?%˜ €3&üO©‘Õp^jåkš°l‹\þ܃[ü¼ÿç…R󀘿$Å1ÉûZ§mº¦‚7KwÕÁ~³mŽš}žµO?! õò2Ñûw×4‡»ÛÛÇÇG’Öº•CE²æöpÈoÏËÜ&IÔ1éüµ/«®8qw3i|Ç~bÿÿì҄ +endstream +endobj +6101 0 obj << +/Type /Page +/Contents 6102 0 R +/Resources 6100 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6058 0 R +/Annots [ 6098 0 R 6099 0 R ] +>> endobj +6098 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.525 392.731 163.126 421.797] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +6099 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6103 0 obj << +/D [6101 0 R /XYZ 90 757.935 null] +>> endobj +6104 0 obj << +/D [6101 0 R /XYZ 90 733.028 null] +>> endobj +5775 0 obj << +/D [6101 0 R /XYZ 90 635.762 null] +>> endobj +6105 0 obj << +/D [6101 0 R /XYZ 90 621.192 null] +>> endobj +5776 0 obj << +/D [6101 0 R /XYZ 90 338.16 null] +>> endobj +6106 0 obj << +/D [6101 0 R /XYZ 90 323.59 null] +>> endobj +5777 0 obj << +/D [6101 0 R /XYZ 280.943 129.745 null] +>> endobj +6100 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F11 418 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6114 0 obj << +/Length 1237 +/Filter /FlateDecode +>> +stream +xÚíX[s›F~ׯ੕fªÕÞaõ–¦‰§iÚ¸Žúäz4X¬d¦Ü +(®úësV ²e×½Lê':{îßw`gã`çlôíb4{+™£’T:‹µ£°ãJ‚%Î"p.DŽ J&S‚1ŸOûyì/Ï'Óhw£ƒÜ_¾¯s?ßÍçgyL¦TàñëÈ/ +{y¡×:Ÿo¬“•M’9¦ŒN®ïFo£ßG|ÁÙÛ.r™pVñèò +;<ç`ĔçÜî¥b‡S¿‘óqôóßeKъ1DDÌ'Ljüu±<-´ùÜ‚å*M6ùÖcŽþŠ†gEio_÷þþÊÄ9{«DË9N0¢®®ï}[m¬L7Ä1¯%À©dÚz¦œ($=êL!<%ªP/Ã$ +}eÜ:€AÒE’r+ù*ª"ùög•f&;{—®ë§MH‡>0ÍíÇÒ1K8â\Ö"ejEh;\“NîâÅlÀGÊkdʛ°°EW¤Bû.«Û¤—bèE7®3¥ Y1{äÍ+•!TtÞ9|§¤SKâ!+Џ„´*Šz%L&Ú̏Â`éç›m¬“²çMÇq¾4i\Üä鄊ñmbK®rÆ)bòYr&¡Ù!? N¨;¤Žzâe÷smÕ!¤¢€OÃd•Æ™_†×‘F˜Ré"‚]Óèˆy¬eYAù:M#PMðÓ`¼„€—q˜„qø§q«6¦Z‹é©ñp¡Ø,ÐMXC@gaO5IRD`ÞÉã”I$«°+þeìîՖ7UÔÅ®(u|ÌfÑü1`œzH1q +œk™o¬º\ÛU˜lz®äºØFåýˆ§.¦«ºˆ¿Ðå&”÷!ß÷ N  +‚ڣk?*ô€ÛPxvGða•˜Yií`EQýYåOÇY¹›Hñ Ýæýe6#ÏDfDýÏÙ¬•l³Þä›jϹèKéѱní¾Ó™]œV~©ƒ#åëúØ*_ŵ®Nö}p.÷¼²qü”–ºnÎ^K~g‘6÷M#u±Þ}Ètî—i^tü¬GðÁä…5ð#¼î¬hLˆÇpû®–XÌqÞ¦t£Í/ÏÚ"bÁkº¯À°¤ðVO£p+ô”íkÓ,Õw ±)A’±Ú¡ö—Þ£ˆ¼1ØãñîæF1XvŸku;ms£ޏÂçâ:ñ·pÃì×1ĉ÷<\§X‡êŒÍûEÀôâô‰Rn‡çŒÎažƒ‰l^çö:,a†Ûä ÑÒ¢”Âk‘Pݬž’~Ҟ–=ì˜Üõò¸84µ¥$-;ÀÍÒ0)‡yŽ£¼&:Þ#:¯³ÀÆéÓY®·Å‚2Ö⼁͵πÇvXÈÆ^/G'@Ï)õ€ÿè¶ÛaIþ²í¾L€/kÈÿÞxÄÒO7€Ê/uçoô?ò»Ž‚Þ?ñïþÛ.D }î2¯ú¶ ] ¯ñV¹snXÍÌÎ궞ö¶š öæ—Bç_O`ç¯êù£ŸlýÈ^›©ùɨÒyÑϑùBi†2 [9¶‘ýæÔW?X&½ó—Àìc¸i훲Ìæ³Ùíí-Zh›„YŽÂr–eÑìdZZàÔm”¬ë‘§õ›h˜ÀÃx_¯ƒüzóø +endstream +endobj +6113 0 obj << +/Type /Page +/Contents 6114 0 R +/Resources 6112 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6120 0 R +/Annots [ 6107 0 R 6108 0 R 6109 0 R 6110 0 R 6111 0 R ] +>> endobj +6107 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 461.569 138.508 472.448] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000012) >> +>> endobj +6108 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 441.479 314.566 472.448] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +6109 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 117.842 138.508 128.721] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000013) >> +>> endobj +6110 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 97.752 314.566 128.721] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +6111 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6115 0 obj << +/D [6113 0 R /XYZ 90 757.935 null] +>> endobj +6116 0 obj << +/D [6113 0 R /XYZ 90 733.028 null] +>> endobj +1250 0 obj << +/D [6113 0 R /XYZ 90 637.074 null] +>> endobj +6117 0 obj << +/D [6113 0 R /XYZ 90 622.622 null] +>> endobj +5778 0 obj << +/D [6113 0 R /XYZ 90 433.168 null] +>> endobj +6118 0 obj << +/D [6113 0 R /XYZ 90 418.716 null] +>> endobj +1251 0 obj << +/D [6113 0 R /XYZ 90 305.302 null] +>> endobj +6119 0 obj << +/D [6113 0 R /XYZ 90 290.85 null] +>> endobj +5779 0 obj << +/D [6113 0 R /XYZ 90 89.441 null] +>> endobj +6112 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6126 0 obj << +/Length 1360 +/Filter /FlateDecode +>> +stream +xÚíXK£F¾ûWpJ°·ûA7àÛf³»Êæ5™q”Ãdeõ@ۃÂüŽóëS Œgìd´Q¢œlš¢¨×÷UØÚXØz7ùr9™¿Ìò‘/¨°–kËǖ+â”XËк· A”LgclßL ¶ežÈÕ͔b;‹*ÌåêÛè!—ùa±x—GátF9¶_Dz(ê¿·j­ò)ñl• +4 F„M›~X¾Ÿ¼YN~›°[¤z7w‘˸$“ûØ +áü½…ó=k_I%–CüÆÖÝäÇ ~ÒʼãbˆøƙÚ™¬²ì¹ÈµÅB†á*ÈÒM¾ÓÎh ·ÁÃaQÖª^·÷Ww‡¢TI}ü™öwþÖç#±5»|nl 6E-Ôó„0D=­Dà]ÄÈtÒFè>Jã(UjAŽ;‚D0…÷ºHP§–†&W²þ ²­ŽÇ¡¾ÊÖõ¯’Ács¿q±¾ŽÒ1›Š˜Ë£ZçzöPŒ0ÃȔY-B{þcDr f#/sïµ2åc4ú.†|Ò +¡ªþšÄ|F1E>„]ÇK8~ýˆ)™¨RåÅ¢§à¨¨—aâ!ûnaÎz‘è<Ò3D©hs ÕTÊ(5ù)Õ0íYÖÿöQ×ÿŒ0T­2¸„÷M‰v}¢nœæ…a9Øùĉa.ÀA¸ýļù=PÛ2 ^—ÿˆ½¢xC;À 2ŽÂ•Ì7»D¥åS©ò9Ic÷ò1Ϧ”ÛûԀb,hâEŠY@ð[!™†cÈsÝ ÈZ=¹)‹0ß ˆè,Jƒ,ÙÊ2zˆ¡§¥®°fàánŸn)>¡[Â0½†oëÞ‚X È·Ò¤Ù·C¹3mâXï:E>ÆÃC.'º„†ûìÊò}aؕÙõ+Uúÿ:ÙÆJ§XšIe¬9ü°U¹,³¼×“"~@×Ä»ôdõá<†½ÏežùðÈ}Ĺ3XPn4­êÆo.›•·¾4½¿¾ø©PùçSÎmƒàïdº“†tËÿ¨U‡µ¾CƒO÷d³cc\{ö«Õüû¦¦ò£½ÄƒM·(,Ëíb>ßï÷((Ð.¶9ŠÊùvÏOñÔÑ£®Û*YWÖdyû‰“*_'ñÿQÒ ¯ +endstream +endobj +6125 0 obj << +/Type /Page +/Contents 6126 0 R +/Resources 6124 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6120 0 R +/Annots [ 6121 0 R 6122 0 R 6123 0 R ] +>> endobj +6121 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 152.166 138.508 163.046] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000014) >> +>> endobj +6122 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 132.077 314.566 163.046] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +6123 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6127 0 obj << +/D [6125 0 R /XYZ 90 757.935 null] +>> endobj +6128 0 obj << +/D [6125 0 R /XYZ 90 733.028 null] +>> endobj +5780 0 obj << +/D [6125 0 R /XYZ 90 592.061 null] +>> endobj +6129 0 obj << +/D [6125 0 R /XYZ 90 577.49 null] +>> endobj +1252 0 obj << +/D [6125 0 R /XYZ 90 373.459 null] +>> endobj +6130 0 obj << +/D [6125 0 R /XYZ 90 358.888 null] +>> endobj +1253 0 obj << +/D [6125 0 R /XYZ 90 123.111 null] +>> endobj +6124 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6138 0 obj << +/Length 1434 +/Filter /FlateDecode +>> +stream +xÚíXَÛ6}÷W評šÃE)¿¥i4ÝÒÄE¦!K´G¨¶h™©ûõ½”(ْe{& Šȋ­…Ë]Î=çRØÚYØz5ûv5»yé2ËCžK]kµµˆU¸²tWÔÚ­rí§á:‰Ò(‰þVÚ30k{zÜìÿæøy?~ýn_V*iô•óÒãGæ̐#u`šÙÁ®l |$àŽì†À¤ÃñÑ0ÂEQ¸È¥N;øYšìTwª½8r¦}¥fË¡] BOììI1j“ÔŒ©²ÑNå‘ïÙöÌîðbbw*‘èèV¾‹&·gÈ#}è¾i×+TXQºÙR¨²Ž+Ô`±Ó(Ê *ä `ÈÔÅ[UÕn§år<{`²D{}‰0§íÜ­—jÂpF^gxdBÈ2!Iã½IÍvÒ óÒDP%yµŸ»Ü¾ì'K9t΄Ÿ¨J#ÿëx×ü4è8š2p†R·‡Òꈧpé°´1ï $UØ¿j"JÂ9x%5‚Ù¬ ½‡R»ªn š/Dhõ´Ú‘.DZ<¥t?ô·PÆ\C?—Óʨ@\zü¾ø+Pyeéãsª‰Ã;ÐXY‚w¶ïý8 +×~±«•V—íqˆwHt‘Í)·Ò̧‰s \ò9òæ"÷ƒt-MЊ‹¤xRbüÂ$$ŒÀù"ºˆÒ Kr¿Š6±ºÂ'”#WÐaj~ו귌4µ¼R8ã¼´P²# áÙ ÀuÒd»½¯æľó«ö&ðÍӍ™—ø¡2ó6Y]MEIRäJ~5L÷šTçÝæe@q”Û:6fís¥îP雗…æV3±a3xVõ¦GUûD» …vAA+™Ç†zÛULéoUG›¡*+ÀTî~\>mRìL'òö4k&èÇ9ûNå¦ð+ž©¨k™{§”™9¶Àºm¬~ÖÿsV©NFìÿ}’ÇJ¡o²}$¬ý _rUøUV )¹!³ÓÎB7 ‚8ÖÂØ»£Š™ê^G2ÓÁT>¥‹¾„LøÐF;WwGÍCsÿ|<`ªGr;ïy%˜ðÁ¢uN;¤®¤Ã•#üÜFi¥êýƱé¥øI/5%AŒAûÅÁdôiL6-–êCir½×?~¬‰y œG‘Ÿ¨pŽ‘tè( #€É…<Èàeš£úƔÌ'5ÄôìÈ°³bQr¦šŠPg‰+þHDtI€[¦ÿ¨ zç•!r¨•Oƒ¡¼"§Qá^B‘DҕC-õÎiiû®Ñ Ït¾Þ5 ˆ#¯YÐ+~£1°hšU­¢@끀v†ŒA¢?îĤ¬ó<+ª®ýÜìG|»ëÏÂa–€¡“4ˀy™¦YgpP•ÿ8†žLaç˜mõ²@¶‹©#ë `¦ ñC­ã_v…aKI{Ô]à݅þ6àx_Øwp°…³¤YÝ$ù#¹¶þˆC.yÂWþϸ#7¿HÑ)ú¥Èý|RÔ'tü ֕QùØ/°Í—WðÇjbÒ|yåâÜáþ&­^涓¯öÖhX{ó[©Š¯çœÛ¦ÌòÓº9µ¯{½TmÚÁ#DµÀ˜O3‡SUëٟVwõCK^{‰ˆákwU•/onPP¢:òEÕMžÇ7§up´ +qèÙ6 ќœu_ +¢&Í í$þÿ-Hæ8 +endstream +endobj +6137 0 obj << +/Type /Page +/Contents 6138 0 R +/Resources 6136 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6120 0 R +/Annots [ 6131 0 R 6132 0 R 6135 0 R ] +>> endobj +6131 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 481.443 138.508 492.323] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000015) >> +>> endobj +6132 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 461.354 314.566 492.323] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +6135 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6139 0 obj << +/D [6137 0 R /XYZ 90 757.935 null] +>> endobj +6140 0 obj << +/D [6137 0 R /XYZ 90 733.028 null] +>> endobj +5781 0 obj << +/D [6137 0 R /XYZ 90 453.826 null] +>> endobj +6141 0 obj << +/D [6137 0 R /XYZ 90 439.514 null] +>> endobj +1254 0 obj << +/D [6137 0 R /XYZ 90 287.425 null] +>> endobj +6142 0 obj << +/D [6137 0 R /XYZ 90 273.113 null] +>> endobj +6136 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6148 0 obj << +/Length 1327 +/Filter /FlateDecode +>> +stream +xÚíX[sã4~ϯð83DÕÅò%o˲»Ã²@iÃðP:ÕV¾­/¯çȒØu¯X˜¾Ä²|tt®ß'[׶Þ;^ÍNÞºÌ +PàR×Zm¬[žK§ÄZEօM¢d¾ cûtN°-ÊT¬OçÛy²ßʨëñU)Êýrù®Œ£ù‚rl¿NDUéá™ÜÈrN|[f¡M.#®MŸ_®ÞÏÞ¬fglÁi÷æò·Âtvq‰­æß[±À·v­Tj9”Á3±Îg?Í°ñãðTzÊk£ðlÊC?@;–G]D\G{ù,´‰¡¨eÔZ6V}ò–ã#-ÄG¬)ε–s)ÍÒ±ÖEŠW:"?äµÔ£<ÓÏzk&¾M‹D¦2«EwóÍHèÇB–¢ÎËj`(€ÔÄÈ݁ˆf-˜‡ˆçe1D¹Ií'•Ú\eÏ Øý\Š(Z‡yVÕ¥ˆ³ºÒkÅ·“êÕ±_÷ß×çûª–©–úB[ð#K1ØJÑ « o|Dƒ$[ ؊h™AjZH9îR“àWQdʱÎõz¬–1ä¹ì 3³÷±} +|ÒÉÔÛ¸šØŠÊÁ½ÄáºlTݛÍåÇ&žSᆑ@ž{£†)„UMÄلEOÄ}·ßnÊ"R#‚%3.Êäú9ÔÓKL1ˆTÖ²¬–·4Ç “}søsvlÜ­íµèwF®nB§+#(£»}b࿯ÕÁ¦ÞüÊB5Ø#ÝQ½n:¨ª¡ )ôŽHâh-ÊëF5î]^ôàe™«2ØA›³ °ãÍDa:1æ=GazÈ÷ûÎY4UN>b.¿»šÀæôjJ©mbp½‚€.â,ÌÓÐë*o@K^ýnÉÄè#¶„’¨¡ *­S(yȱC é?úâѵ²Û†ñÖ4“)§,7ßr¨†T$É^¿VMQä¥b]mûQw^÷<å)ì0‰»àPÁ]>Â]×àîUž' ‰â§‚îR¹Nã,Nã?¤Ñt€`¬N²rd +@ƒ£È?‡9&ȧ}}^ÄYgòr +¸ qÇÝüº¡û+­Íä:ήGû–²j’ú &ëN?ÜÃáMx8 :Õk7"©ä„éŒ"æõ…›Œ‚sîéZ-ÞLº1ìS™õ~îò{è‹„}ÿyً~FìÅÿ:{ñöúÌÙËýwØëŽ+Ô¸& àì Ûìi(òŸ¹?9·ð¸7qrCå&jû0‘7.SnËä7 {‚Õ§è›`t€à[ÙÛ{Ӈ°7Ã( wÓϐ»ùýÜí>æÚŞ…¸È?Ç[@N¸]Gƒ1©ØEK¶ŸUyßÏtÁ0O :òL)ŠääfmiQë^ɦM²‚ë¼”ÏÁdÚšnÄÿOÊ2« +endstream +endobj +6147 0 obj << +/Type /Page +/Contents 6148 0 R +/Resources 6146 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6120 0 R +/Annots [ 6133 0 R 6134 0 R 6143 0 R 6144 0 R 6145 0 R ] +>> endobj +6133 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 723.145 138.508 734.024] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000016) >> +>> endobj +6134 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 703.056 314.566 734.024] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +6143 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 327.185 138.508 338.064] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000017) >> +>> endobj +6144 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 307.095 314.566 338.064] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +6145 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6149 0 obj << +/D [6147 0 R /XYZ 90 757.935 null] +>> endobj +5782 0 obj << +/D [6147 0 R /XYZ 90 698.311 null] +>> endobj +6150 0 obj << +/D [6147 0 R /XYZ 90 684.501 null] +>> endobj +1255 0 obj << +/D [6147 0 R /XYZ 90 540.762 null] +>> endobj +6151 0 obj << +/D [6147 0 R /XYZ 90 526.951 null] +>> endobj +5783 0 obj << +/D [6147 0 R /XYZ 90 302.351 null] +>> endobj +6152 0 obj << +/D [6147 0 R /XYZ 90 288.54 null] +>> endobj +1256 0 obj << +/D [6147 0 R /XYZ 90 89.441 null] +>> endobj +6146 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F95 1788 0 R /F23 340 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6158 0 obj << +/Length 1467 +/Filter /FlateDecode +>> +stream +xÚÝXIsÛ6½ëWðÔJ3Œ… ÝÒ4É4ÝÜD܌&!‰S. +«ê¯ï¤Dš–å±N½H ‰å[Þ÷ðìlì|˜|¿œÜ¼÷˜#ð¨ç,׎ÀŽïÄ)q–‘s7%Q2›ŒñôvFðT©\ÝÎ(žæÉa«¢B®~Žï Y‹EÍæ”ãéÛD–¥i~RkUÌH0UY¨`&oJ™7û²ü8y·œ|°;¤Y›ûÈgÜ ÓÉÝìDðþ£ƒ³oz¥ŽKü'ÎçÉï|ÖÊöø‰ˆ!Xgîó<å—ùµXÈ(ZGÂC˜¨hæYY2Ϊr%³h•ÆYœÆÿ*í˜5‡5·ëÿ…9~Ûõ_}>”•JM€¾ÑýoÞ ~j¾C)LÒ KÓ¥ça€(DwÓÛçt°  Ý4wq–Ä™úb:r|Òl ö)4|äQ× xE6‰UnÑS C¾ÇŽ&`6b‚‹D@Ú>Õ6.GV§rq× Âº)j»¸úZÇ3ÈӃþ‘‰ÊªÎ(ó¿U¦q’ó"ÎƂâ{ˆÞ0¸=‹lêl—ïÌl6¿q¶¬[¨²N*Ô º…ä [ÐÏE^@uy®0RU âÓ¬\ G÷L$’Ä™»–I©FLg1_´¦Çkc"àÓ4ò,9Øà¬GÝ°Ûا»ê0óøô¼wœ }çlYÉTUªøwœG<é'=ÍÏɈ~¢tI·Î.ŸB •{ÛjYEh6g`¢)°QIå¡ßµPaóY—üù 0M úAx÷O¨vUœg/ €8RGYù’]<}I­d±©S]gâ"8ô—"×µ³ÏÀc!tæW³Ëcþ5ªÙGAÐPo¤Ä<~¾ÁævÓÊØÅàz ÇY˜§;YÅ÷ |sÓó¢ï_I&£/X@T„J3§lX}Î\¤Gûä~„›Ì~ÆÛ~e¹ý–R™´EXÖ»]^TÊVçýaP“›nKòV8@yûÖ¶?uñJC2À\‹³Åè#}ð™’rݖ7 ;{6˜6ÏÕVV¦JûêÞJeÔ´ØTÞçu5JÆЦâ|Z\Ă,õ®]¸¬CØ#ÊuX óߔs[wÒ~,4ÕځMRz–Ç•1óԃ&ßDÀâÄí绔kÕ&0Rú\SÝaÈFÕ+o>=Η ø)aü vVdHŠqÎx.kŸ•²#‡8wÕoŒñ¿æ•j·…ð~Lw‰Ò,#m¦u§áŽñÛN²Ê‹>EƒhD°hiáëPºît™°ºìA‡2× Ip©43΢™Zíãj»:Š3‘Ö_M™šÇ·ƒÏc¬Upž…æfÄ'…_"ÂÈ%" "A¡ÙÓ`”­ ’íÞ¶kÐöDJN1…šE'ÙZ—†Õ溝:j7ÎÂFwLräƒ>·q0$º8=£¦°‹ˆË®"8È@olÎR¤æ"oLptxÒÏuù¬X€Ã‰ð^-ÚÂ÷^©ˆ V&Žˆ™¹ºôïTêY{4ˆñАõ¨x%+êùˆ`œ­a+~ ¶*ÍL=ºâ'tµš.Ÿ;NºpR;–h¸;Oö”ô«©Ì P@ükQÙÙã '|ë£ #smð"N»Š֜v)©;SôäÛµ8­|F÷Ñc5/ŸŒÿ¬æ!1T4¯`5þ¿aµÜz(ðý—àöë¢1¼Yƒ‚$¸ôb­¹PSt:‘æB Ĺ;É­ۚóìcKzæÑ2Ÿy€ú/¾q>µpúEfu#Ï¡­ ïAO(ïô&FTs‘=ªu­ñìo§mýd®LŽö’Àšî$Ƕªv‹››ý~ÂÕY¼+P\ÝìvÉÍcÌ‰ßM²nNú’ oSgð2m4ò£øÿéöZã +endstream +endobj +6157 0 obj << +/Type /Page +/Contents 6158 0 R +/Resources 6156 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6120 0 R +/Annots [ 6153 0 R 6154 0 R 6155 0 R ] +>> endobj +6153 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 462.296 138.508 473.175] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000018) >> +>> endobj +6154 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 442.207 314.566 473.175] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +6155 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6159 0 obj << +/D [6157 0 R /XYZ 90 757.935 null] +>> endobj +6160 0 obj << +/D [6157 0 R /XYZ 90 733.028 null] +>> endobj +5784 0 obj << +/D [6157 0 R /XYZ 90 433.24 null] +>> endobj +6161 0 obj << +/D [6157 0 R /XYZ 90 418.67 null] +>> endobj +5829 0 obj << +/D [6157 0 R /XYZ 90 272.198 null] +>> endobj +6162 0 obj << +/D [6157 0 R /XYZ 90 257.628 null] +>> endobj +5830 0 obj << +/D [6157 0 R /XYZ 90 111.155 null] +>> endobj +6156 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6166 0 obj << +/Length 1465 +/Filter /FlateDecode +>> +stream +xÚå™Ý¯Ú6Àßù+ò´4|ý;6o[ÕVëV©[©öÐVÈ71 š„2þûÇÈåC—N›ö'qìóù;>€ƒY€ƒ×½ŸÆ½‡W‚ +)AE0ž +‘ ˆSŒ“àcŸDÉ`H0Æýw‚ûºXêÉ»Åý|±›¤Ð“_ÓÇBÛÑèu‘&ƒ!å¸ÿb¡ËÒ 7SS ˆì›,6°’`Dô)‹ŸÇoz/ǽ/=²à€Ô{óEŒñ²÷ñ3xþ&Àˆ)lêYË ¤ ®‹à}ï·>«e ~ bˆ5Ê|µÊäV^&£ëTœŸ0¦™™lÒj>‰ó¬¬ +f•]Hö?aŽëgnÝ­×Qÿ;«õÃ+ÅD G”+P¤–4vSZڄÈi]O€-ˆ›ÃñÁœaH’Cª”›ü¡4ÞÚ]â|euݺ»|ê®ÕÜ4¯w;1%%¼#¢#I[RH +ÙL¨r·háMææÓCÍG!‰öªaÖ±oˆèÕ,:OˎÁي4sP\MtsHxv"Hq>ôÒT¦(G­ï÷ë´üF$Š°‚å$œ˜äàƒ–ˆ +…˜7"Ž;,^߯K“ ˆçgïÔ¿J½+³Ü?Й»š/k½H«í@ðþío6ébáF~Ãt–å…IʈJDȑ‰^þ›U•‚¸·™Gí—(+H¢4„ p2ÑÅl½4.؞4GŠîÍVäÊû¯y:íª"&ÈAE.•—í&é,éJ +dt}Nè»!IAñÌ9L³8_®t•>. êÈ~ðEyÈ ÿ…m¢Ñ¢E¿ÑJ·ÒÒìíi“¡’ƒ0y¿-+³t:v⎡ˆˆ½Ê…%¢J^§Û& >—vþ3ˆÍ3‚¤ En‰CÑ¡øà#÷? vò‘#ð•çR˜0Dåò•'è{qü®šëzMí0èñ—îœ_´QwÞ*à]¥ž:r'ÒõŸAݓyÀŸ;‰¤7ìØéñ-d×ÂN'Éd£ÉÌd¦ÐU^”öû°ujƒåììÉëfÎ=07ëƜäâ +ÌñˆzÌù½L’›0w¨îyÊEüXâ3Þm(·Û§<°I#ÄñÞyWŠLÿ4 „sØÐ0¼' g—h(Ù‡@º +8W^ðٞ§':ˆkã¯ûù„*Œ$÷òɕNaï +é¿ÇQô$Ž¥ºK;#êŽ#D‹ ‘°c½Ƕsa?/ì$Ñ­ aª¥º»†uk’™å +ÚË[ ±‚ŒRmìZKÜà]],”º½x³Ëǹ“¾ËI¹o¶mÕYû—s½›î®«Üc:‹‰0âVÇÎbž;Š#uKµsÇûx/LGé£XâºöÕ¯³Ìí«à¥‚§( Éó ÁP‡àdüDÅ»­¨P!a7¸úYül‡Y]ÓÄë ÑÑîY¯Øíõj|â€SC5Vì.PT *ßâg º—ß2d¢”7„ÌRoÛÚ&Þ¯“îBµÃþêȥϨvâÓ|\á—kš3­²‚.„·=ó‡E¾.¬s³4›Î&Íé!ÄÅ!´y¶Øº‘.Ëõ²v¶»÷§<ÅÚ?zô-uâGú1_wþ<Á˜ªK&brg¢õªÙ¸\DZ)ËézáE,ÜÕXe›€Ôþeaªuá?¬kãäÌýòx¤A]Љ‚Í ÷¦‰U=5 Ÿ@‰ž?¯;™ãÌ9þ£@HˆVyíÿõÿ` L$sÿp¥7<‚Ú;«¯­­þ¶)®îÖWXwó¡4Å÷Îûž&ou¶Öþdn‹êW»@Ù9bD0¢¶îy0½7Æ+é4û3hF¿ôjßîå%2B ïè7¯ªÕèáa³Ù ¸Dë,](­V«ÅÃiP¬bσ»E¦ º—ùî“ .µuö‰ýÿÿ +Ž© +endstream +endobj +6165 0 obj << +/Type /Page +/Contents 6166 0 R +/Resources 6164 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6120 0 R +/Annots [ 6163 0 R ] +>> endobj +6163 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6167 0 obj << +/D [6165 0 R /XYZ 90 757.935 null] +>> endobj +6168 0 obj << +/D [6165 0 R /XYZ 90 733.028 null] +>> endobj +5831 0 obj << +/D [6165 0 R /XYZ 90 603.144 null] +>> endobj +6169 0 obj << +/D [6165 0 R /XYZ 90 589.239 null] +>> endobj +5832 0 obj << +/D [6165 0 R /XYZ 90 453.85 null] +>> endobj +6170 0 obj << +/D [6165 0 R /XYZ 90 439.945 null] +>> endobj +5833 0 obj << +/D [6165 0 R /XYZ 90 292.601 null] +>> endobj +6171 0 obj << +/D [6165 0 R /XYZ 90 278.695 null] +>> endobj +1257 0 obj << +/D [6165 0 R /XYZ 90 89.441 null] +>> endobj +6164 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6180 0 obj << +/Length 1596 +/Filter /FlateDecode +>> +stream +xÚåXے£6}÷Wð”ØU±FÂo›ÍîV6·Í®“X§:@¥5b¸6|o楇PŠ‘Çü=˜Xè¢@nñm½ÏfsF‰ÎÄcÌ\†|Á®™éÖօ0BY>âBœf,ŽïB(Kelbp½@çqæi!ëø6QÀŒӼԝhçà€&·/´^—¥^Ք¥Þ]æÌÈ#^“éÊý©¹;bñ+è,ÞrF–×ò°ôy«÷֝ý¹•]wó,ò8«+4HK­ +ʍ•œø Uø Ë¿R…Ñ¡¬UôH¢÷=IôJÙ¡C#œÅ/ŒáßçµjÉu€ú×i‘(]R×Ü#›êÅA:Ûú>vù„AÜ=ä{þ@Úx=i#`g¹@ÙXÈÂD‘9‡²Æëd¾Tڀ;KÏJÿ¬´añ xLÚ\¦^Š\ÂΧ=¿Šxé—\_¼üK¶ “ÿƒ0!×&ìra²}tÖÏ4”Áýù +Šüg”k”(ß +¨; eÞÞe=QDí²æÖ§„#¨§EÑϳ€ÂØXBýŒˆ ¦·Ö¥Õ”ʱͰ™PqN1ÞWA/¡vwµÒÇ0C#öh@tÃÁIœEe ÜDC{Ö¦çøí óáÈI®±%ùHŽ¹îãzk<)P¨°¶îäæYRß+²€íykôÀtÈÝ#¨ûi죀±yåR¡)'Þd¾jal­i„‰5æ8¬¹HP¿_¸Ï=ÿ?ñ€p¾MIbñ,éCú +Ï"w‚ è~‹ë„„Row9sPSg…衎Ǟ/ ¼\ô£ßãÉ çs÷=~ޖç€/Z§á^ërê‘ä^ó{¢¯O¼åon÷a-aPÕævŸpòwYöN3˜¦jûÚrµyµ„m^~ªTùùŒó©Åñ;™íd²gî;=”IFÕükEò~ƒ3žýæ´­oÌIio/>b¸£½m]‹››ûû{Vh—ÅE‰âú¦(’›ã¼:˜DˆßM²niÞê¶8ƒiÃÚGøÿD–yú +endstream +endobj +6179 0 obj << +/Type /Page +/Contents 6180 0 R +/Resources 6178 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6185 0 R +/Annots [ 6172 0 R 6173 0 R 6174 0 R 6175 0 R 6176 0 R 6177 0 R ] +>> endobj +6172 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 538.126 138.508 549.005] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000019) >> +>> endobj +6173 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 518.036 314.566 549.005] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +6174 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 258.445 138.508 269.324] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000020) >> +>> endobj +6175 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 238.356 314.566 269.324] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +6176 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.4 183.964 212.124 194.868] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +6177 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6181 0 obj << +/D [6179 0 R /XYZ 90 757.935 null] +>> endobj +6182 0 obj << +/D [6179 0 R /XYZ 90 733.028 null] +>> endobj +1258 0 obj << +/D [6179 0 R /XYZ 90 513.637 null] +>> endobj +6183 0 obj << +/D [6179 0 R /XYZ 90 499.889 null] +>> endobj +5834 0 obj << +/D [6179 0 R /XYZ 90 233.957 null] +>> endobj +6184 0 obj << +/D [6179 0 R /XYZ 90 220.209 null] +>> endobj +5835 0 obj << +/D [6179 0 R /XYZ 90 89.441 null] +>> endobj +6178 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6193 0 obj << +/Length 1349 +/Filter /FlateDecode +>> +stream +xÚíXÛrÛ6}×Wð©%g" ‚ð[š&ž¦7×vóâd4”Ûhy+IYU¿¾ ‚wQ²{z™ñ“@\îžÝsvIlÝZØ:›}s5;y绖@§¾uuc lqŸ F‰uµ¶®mB%Μ`Œís‡`;ÌãpqîPl§ÑîN®ópñƒZæa¾;==ËÕڙS†í7QXfy!odîÀ–ÉJ‚%ß%¾M]á|ºz?{{5ûcFÀl‘êٌ#î2kÏ®?ak ûï-Œ\XÛêTlyԅßȺœý2ÃGã .Â>ëŁ\äu0÷:˜TûËy\h§§›d•&E™‡*Ñ÷aû#f¸Ú2f>8‚‚.#Y,.e½ý•Žõä`=]Aó=p¿ò¯LK¹˜ëƒÖ¼ùo^ VGÐ{¶\ƒƒˆ™@Ôå=pŒ˜C ÷ÍëSs‘O=söMg›RB¾|LíòNV©19Éoëä\œÍ¬k8@ì•C˜½‹T²ÎÕGŒé*,UšÔ÷˜|T'©ÞhßOâ1ޣح£éÃã!Ðœ;ULCa‰[·ª¼3ä²Èäªt*oË´ «Ú(dé4ÞU¿E®êÿÖ*–IÑ.QŒ‘ÈX@aüÁŒ üçPëX4ö^ºoÔm¢’[sY¹­Ô&*ëÍtWá!ßsŸV ҜAƒ¼ŽJnN1EPEàjˆV3)Œe)óâtp{gf@T8Ìá3ÚGwÁž‰Ï¸ÝÿUZ•k½Ð¹®6L®õ²ÍutXŸÝª(2«e}tàÆqDÁ{¾ÄƟ·®d¦Iò™xˆ®–ŠäTÇå +#µ^„ùí(¢Â (yêPfo«€¹­¦Èéð<¢„ÈC%ä#·‡TažØ">Whœn€Nšÿ {õ*Mê-“3~\ô!¤‘ݱU––¿†ªÄãëH\!¿¥)²*á*™œäù|Hÿ\ÆéýaríՊ C­ê„£F%ö•ö쑍J%š}4 ½0’bîï5,}ÙuìÉåC—ðÚ vAxÈôã£MÇåa¨‡A×y]yUQ4ÏC4xEƒrĽš•M–;Z™ØwƒCŒî3‘¢ó"LÖvˆÎG€¬¥»©3C. ž¬E䙤ˆˆi-µÈõÉøØßR!ÌÇ]d i“t§„"sµ¡;ÒÝÃ5ݗi +ÝÇeÁ¨¾€±JT¬þrˆ-½õõeE}­ˆ¸–Bßx4%ÐÔ¸x² ±º/*ðÜ*ðª™כաÁñ ”âB–›\Ïúc©{[KDoz» £BN¸í¥yK"Ue|íZA8<þªº\dœ•;ÇgÈ ômƒ!õEÿ)ìA;žÞöõјù°¿•™ùxo™£W€ O$ëR ±ýÚÄñSZʦGõ÷]œERç7èÄðÐϙÌÃ2͋Ñz`üƒ ‘xÚyÊô·ÉÀ‘Å2Ý@øòá3õUß{xø(`ì³Ï’}ïÙ ¿ÍU$Ç +®úOcv¤ (®®þ¯†A*ÏùË0ø/ëàø‹'¼ +<öƒgõ¡<ñ!ñnPèd1æ>}œëέ¥¢¾l´Â\ւa.~-dþµÃ˜]óñÇ0لQ'÷ÚÌH­ða!ՄG0K‚$uk"ûÝjVߛi¡ó—¹¸ÕîÊ2;=9Ùn·hU M¢²©ò$Ë¢“ý +êY!Ìҍ‘›´¦oœæíT›q%Ö{øÿ 4Ô½µ +endstream +endobj +6192 0 obj << +/Type /Page +/Contents 6193 0 R +/Resources 6191 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6185 0 R +/Annots [ 6186 0 R 6187 0 R 6188 0 R 6189 0 R 6190 0 R ] +>> endobj +6186 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.573 690.333 216.297 701.237] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +6187 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [448.024 589.072 483.212 620.041] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +6188 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 285.174 138.508 296.053] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000021) >> +>> endobj +6189 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 265.084 314.566 296.053] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +6190 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6194 0 obj << +/D [6192 0 R /XYZ 90 757.935 null] +>> endobj +6195 0 obj << +/D [6192 0 R /XYZ 90 733.028 null] +>> endobj +5836 0 obj << +/D [6192 0 R /XYZ 90 568.997 null] +>> endobj +6196 0 obj << +/D [6192 0 R /XYZ 90 554.427 null] +>> endobj +1259 0 obj << +/D [6192 0 R /XYZ 90 462.764 null] +>> endobj +6197 0 obj << +/D [6192 0 R /XYZ 90 448.194 null] +>> endobj +5837 0 obj << +/D [6192 0 R /XYZ 90 256.118 null] +>> endobj +6198 0 obj << +/D [6192 0 R /XYZ 90 241.547 null] +>> endobj +1307 0 obj << +/D [6192 0 R /XYZ 90 150.732 null] +>> endobj +6191 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6207 0 obj << +/Length 1460 +/Filter /FlateDecode +>> +stream +xÚíX[“›6~÷¯à©Å3µVwо¥m’IzK÷)ÍxX[ö2åV×ëþú0†°^ïÄÉä!O$ŽÎõ;Ÿ„½‡½—“瓫’y +)I¥7_{ +{$HPâÍWÞ{ŸDÉtF0Æþ›)Á~T¦Ñâ͔b?Oö·zUF‹_ã›2*÷××/Ëx5QýŸ’¨ªìð­^ërJB_gK ’$#Ò§O?Ì_OžÏ'ÿNè‚=Òì-0á-ÓÉûØ[Á÷×FL…Þ®Y•zœ2x&޻ɟ|ÒÊ–âÈħΘ›P¾"%œƒ¾«§¯^(q¤3c(µqÍÚ½]ѳŠ#k}³v"vÀGkf,D$”°q€$åví³F_“ÛßhO4G4<’™Û_ôöW!mט۸ٟJÄ1éi»i¢#ðI3li‡7í0_h¥Bê ­È“´‚¸È!…A0ðOŠ@ª[ðƒÕ»Ô«í2Î6η­½¥®¶‰AM–·i:ˆæŒR…$„äʊ}«ÍêEøYu=ü»§-¸†@”C„³¿®£¤Ò#j3ŠX¶zÇk«atð|–ìí¨Xá&]úè´0û©þiãA8 û¶=¿_êÂÄùдN†3QuT¨Ä8›rìßEI •Xn¶©ÎÌ@—žý +âFY4¿-ó)þ.;=Rà2I¾šÄ —‡F¥‹Î*Ë+pç,ΖyZD&¾I4¸¶†Örã0öíHÀ2ÈŸuaA{½z X=G‚õNk÷çPï}cÀ3kÇï¹Ñm*ðUZ$ºŽoT§Í)ú‹þ<‰L^V==A4‚¡5.„{31Á =°^{ !ù„î¯ú>Z+§k Í«k!mœD…z¬ðÇz‡pH€õ íÚWµû(qîƒA‹Ç0lñ˜Òq<øN^¦KÂ- ªÓeAºlð lÐ5x:¿ÃkÜ>+k— Ž^9'ä#«³-àO±À”[ý¨ ÖŠ²n fÝehàç­r·ðÞÛ%¬9ÓA݇šÀŒ)Ñ>#iA½Ýî4¦c¤0 VBÑoþe!ýcܦ(ž>dÜÙ] _yK;ϳU¼>"íϬ„cƒ×G­ÄˆJùé”Vr€1å8­x§åx œ'ÛÚœ2Ö) ~l>ýÎô0ã…bæœ|UŒ÷¥M։ Æyÿ„1oº‰ +ãë‘ôhfo´ÙiuK+»öÞ~±œ{ûˆÝ´i¥Wi”$ºÉ¾Þ^’&‚“XÃÃkAIbîOéyœ™Ê~\—yjG÷vr¸¯¹Fp‡:=âÌ®0îσÎË°aù :?tŠ>dÁ¹°YÅÀVãõ~±­ uNê{ÓÁ'“=øÁ>aôÅX` †ðI‚à“Ay«Ë=tdïx‚*©ÖfVÀÁS—w¶œá£õ,¨@—ö 0„SX3 +§„Cá‘à2©‹ƒƒ«w±¹µª¦…nÈæ‘{Ò¡ ’._Ï@Yˆ“ªiúHm@GëD8ïcA{Œ²QôˆQò3‹çL(DhK åàâPS—Xx8=ñ"à²È÷yHc¥9Š|‚#Ì/‘>Ê9.ЕNå „ŸÒC¾°ÃL‰Ÿy’oö=ì³³yiíëðѵq ¨Žùà<ðàEÂðªV†àÌðܛÚæ†l‘é,t7´wBôøƒ¥¨¢ÁZ÷ڂ­}uˆk_þŒø~*„ïò·(ÛFIÇSïjQ¼‡Ì…BBZÃ$Lïn(¬eÿxíè{ßÖéK€™1|Ï­1ÅõÕÕn·CË +m³¸(Ql®Š"¹ú8¤@»¯swšæå¡ÜàcڀÜGþÿÐÔî( +endstream +endobj +6206 0 obj << +/Type /Page +/Contents 6207 0 R +/Resources 6205 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6185 0 R +/Annots [ 6199 0 R 6200 0 R 6201 0 R 6202 0 R 6204 0 R ] +>> endobj +6199 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 575.512 138.508 586.391] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000022) >> +>> endobj +6200 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 555.423 314.566 586.391] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +6201 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.334 368.402 240.823 379.306] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Difference) >> +>> endobj +6202 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.275 221.481 293.971 232.385] +/Subtype /Link +/A << /S /GoTo /D (main_Meet_Preserving_Simplification) >> +>> endobj +6204 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6208 0 obj << +/D [6206 0 R /XYZ 90 757.935 null] +>> endobj +6209 0 obj << +/D [6206 0 R /XYZ 90 733.028 null] +>> endobj +5838 0 obj << +/D [6206 0 R /XYZ 90 546.456 null] +>> endobj +6210 0 obj << +/D [6206 0 R /XYZ 90 531.886 null] +>> endobj +5839 0 obj << +/D [6206 0 R /XYZ 90 419.217 null] +>> endobj +6211 0 obj << +/D [6206 0 R /XYZ 90 404.647 null] +>> endobj +5840 0 obj << +/D [6206 0 R /XYZ 90 284.252 null] +>> endobj +6212 0 obj << +/D [6206 0 R /XYZ 90 269.682 null] +>> endobj +5841 0 obj << +/D [6206 0 R /XYZ 90 143 null] +>> endobj +6205 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6218 0 obj << +/Length 2040 +/Filter /FlateDecode +>> +stream +xÚåZ[oÛF~ׯàS—ªñÜ/.òi€nŠM§/IaÐ%•H-EÅëþú=Ã^Eɔc¤íîƒ!q4sî—ï ƒU€ƒ×“ïo&W?Jd$•ÁÍ208P’ AIp³>†„ J¦3‚1ßN £|ݾRf›‡u¼È£Û7É]å×ׯód1QÃ6Ñ~ï¾¾‹—q>%:ŒÓy ”$#2¤œL»ùiòêfòï Yp@JÞB!ÅD0ßN>þ†ƒ¬ÿ`ČîË]ۀSŸ›àýä— >«eKÑÒ1Ä¥Wæ³U&³ò +.Ç©v}-?aLÓø6ÙF«ØUá',ð¯SCáxÝmb«×ՏF´„a #Š­Ø¥,Ÿ£ÜmêHL¢ºÚò-H 6 +çYº/Ÿ7IGùíÌ fŒƒ.š3P̯ä«ÿ윥÷û$Kù¿GbD¯xÅöԀ<QIZ °ÚY\š`žÄiq[äQR쯯K)o붳9!‘R5ÕEœfÛ$ŠlH!Ö´ÚûÂïh“Óˆ¨êw+Ú2q‚eilÝdH3L$¦:Ø층kÆ1FX(0±B’r·ù%˜v•ÚÐf,,2wŽ¶©ƒc Ó qÌçÈèÚ +Å:Ù@%¢MDëҞ—*ùÊç̻דàc)L´œRºø´âÑЩ;äòÄo͖") Y¯/’é.ÀÛÎkÏtyH煋>XÞF»]’®ÜÃg+`'K:.“ô(Kº@&‰ÆrY{ß,Œ§D„áñ¾ÎŽ‘ÝÌiòe¿‹ç‰%ûRv÷0 «4ˆ sœA}cq\Ë¥‹!¥%ÒJÌ‡=)uAÏöBb$Ô %¨ª¾ÈEÛ¸ˆóýuç|C§›¯)l€œ†T Ç´Žt¤,ëFíśÒ3w_®”΃Ïûu2_û¥jwϏ°Òø±ñUâ[LT&e¼ø®'WG•™lF2¼ë¸Sº@¡œé’¶q^:©|„tºLúórz¦m9{qqJ\hžBñ#qÛ§Ÿ&°[³%5ÛÙäŽ6þ\YëW`Ž´ðÎLŠuÅuYÆÛaS´#`sðˆ­»çƒJµ=ÎÆ07U›Ç¥ °i%{­¹¹nÆõ'cn{sÏ©øò*£ln·Ùâ°9쇒„ih~²71]4TØr{VC``ÔcSx))OݗëS÷åP*8žûrÅH{¬(™ú”¶_ë™`e«}†1¾ÃßÃà +HÀuQ›À}ž½Î‡ ­òäNôŠæ6ÿËzÑkߺ““¼ì4Uš +VE +Z§DF1틔Ð:`Ê>‚°ÛÕ¦&5kmòa¦Z”À üÉç}¬ÙyÛÇ%Ä#%Ð4âg_ø1ßoÜ;¿ò]_›aCˆ"ò WÝIåŽÌ4´S‡5Þ–Þ í Š}yáŸlâz ó UãfS‡éŒf+ùM¼ôH`mq‘Éâäärž»1:ˆ¦«½àjžô»Û)µÀßÇWN×IýÀç~Ó«_¬Ý?X$üòMw¨ª•k]VPÌC&(ã«üà^h×²”÷+¼~ȓÕúŒcÿBo'%ݍQ§ýÁ]kÐZ»æô±‹N»Ö»¢}}Ðt&( ÿUÏoå¡Îüf¹‚]þ–VW‘0|õ^F‡"ۂ¯çƒ“]å +@ XHÝ øV‹?eB€¾v> D}¸—ATá zÁ*ÂÍÚï|ážóõYÅyøò 97’ÙoIºHæQû žœ_Ñ«M^š’¼7òœ¢#ŸÁã n¥ëVßþ–@õµù%e“Ó7]Hƒ„à½d|kcÍNþ±7Ü£Ÿ9ÜÇ}œÿc +ò¥æç(=T÷ ¶û|¶¤  ÔÕ #˜µ¨»-˜1¨Xïã +58Í~ªoÿœ”ˆ¥ÕÐ2\ýuQ쮯®îïïÑ|i²ËQR\ív›«ã€kQ!©šH]·YUI“·eñ;²ÿ#ˆ'd +endstream +endobj +6217 0 obj << +/Type /Page +/Contents 6218 0 R +/Resources 6216 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6185 0 R +/Annots [ 6203 0 R 6213 0 R 6214 0 R 6215 0 R ] +>> endobj +6203 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.643 690.333 229.737 701.237] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Affine_Transformation) >> +>> endobj +6213 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [182.089 473.499 246.767 484.403] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Affine_Transformation) >> +>> endobj +6214 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.79 231.477 434.212 244.395] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Generalized_Image) >> +>> endobj +6215 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6219 0 obj << +/D [6217 0 R /XYZ 90 757.935 null] +>> endobj +6220 0 obj << +/D [6217 0 R /XYZ 90 733.028 null] +>> endobj +5898 0 obj << +/D [6217 0 R /XYZ 90 536.27 null] +>> endobj +6221 0 obj << +/D [6217 0 R /XYZ 90 521.7 null] +>> endobj +5899 0 obj << +/D [6217 0 R /XYZ 90 319.437 null] +>> endobj +6222 0 obj << +/D [6217 0 R /XYZ 90 304.866 null] +>> endobj +6216 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F8 504 0 R /F13 540 0 R /F7 505 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6229 0 obj << +/Length 1908 +/Filter /FlateDecode +>> +stream +xÚíY[ÚF~çWø©5R=;÷ñPå!’Hmªæ²éK!†Å*jÌn6¿¾gŽ¨Àá“U²Û¹Ë×faò1‰C“Í H’ŒÈr:~ýóèéõè¯[p@JÝB!ÅD0[Þ½ÇÁžÿ`Ätܕ§Ö§ þ¯‚7£W#ìýÀƒþÄaÌE%"’;Ÿž~œ™m‘n²Ý¤4¢+åê™ $F +ë "ðH'bWÌ'“4sÞ&«t>Mò›ýÚdEKàÕ3›±HSø ”p½Ì7c*»lqnº°¯‚õMÕ\ &dõÊÜd›uš%Å&wg[Ò¥FŠ×âӝûɀ¸"!¼4¬HpD©^6·}¨B±ÖÕ¡$›»3”µƒÅ”¨Îü1ës é¸VV,ÁÖ³Êr㬟§åä.²ï£±X@vÈ!;i6Û¬·I‘~XW„Öyû¿×yÅPב»Mz}LjSތ®—m +w‘¸»m2ókC½}Š ÁHÆì\$Ò¤òršA¨Œ‘€üEœ""âFë"†¸öý{kûwc[4ô²nžLnLfr(ñOŠ| ¥™™n]C§ëäÆXi 2-𘄿5¡)\&6ø¥­­nâX!JõQ´[†h\ùÁešC +DهL¿6«ÄvòôÍýúÃfÕ£/†ÓºŽ^nV»ûuF(7B*#Jˆg€áXËðEš™$Ÿ>ýè}ß¹ÜÆZ„ßõ¨%¢àêqGÉN·PIºZŸlLèY +€2-ò$-v“IiËԗ=””jÃÖD۞ðs„…D”–u€Å¤>ú¨¯~1¢ª†'kö"uFo2c+þHŸÛ˜ ي6ÁTŸôûßàáu“®7óýj¿ëÑÏ1ŒŸò,âD!C°ইXOº¨Ðê„Õ©VkGÕ±ÔIêÕ<†ÚºÉ,Äl›”å 1L¾ÊÂHjœ1Nç6¯Z›âtµ, þÅ-¸K‹¥3!7»­™Îˆ‹ÅÒøùjׅüÆï ¯Ÿ‚wåX¹7“…±µ*Á1:ƒ:næNÅH²zˆÝŽ… +˜",H+{˜q0(féÎbwª)M !) ªÃ!_pª!ÉF1碍í‰Ð(K „¡nNíI 1æõªT®FM••(k QdšžDL¹W"˜6´.l¼¶é‰C9c,¬îlï ”½TS՚hT´GX‰¡ò"!•å~t%kS˜ü3—8WÙîgÏкV‚sc_óƒ}e~è/í +äæ~:÷ŸÞÚzƒ˜V…û_TÚE*ŽŠžTEúcǾ–K‘70"ޝoC^1ØŽ|ª›Âyãfiy}·4¹?ôô• û[»ó>~áש]Ƿ櫋jéòËùM¾w,àr'K{‹¤Ó¾D9;ò1ƒýkûc?kûƒÆ‘ 4ü­$JÉÊ¿TŽ_Ïtʗb—Ÿe~#Hgi Îd_l֐ìY³IVûN‡ÀÒp&Š ֆfC~(‚0íùaÙðõ ê7á†{DU ¢S¬"\-ýÉGî>_îõ›‡OˆsìË^¥Ù<%…ñ¼8>:’WG¼Œ&ôx‡Ü´sPö¨›š¶H}_okÝið…ÐIj ¾’뇳gù=cÏÿqö¬Úìhm—=óÑg¿\—rìåifyïy¦Kng¦K>ç½äSJ„ÜÓbMA_cѤ`”ñ ø´†I¦þŸ.Å{G­Ý|zÈ%bsCêÊû}ÛtWg›UV…/ ,º…ÿùŒSC¿êó|“)€.uŠoÂ^­úxôE,Sžc™TP„c6À2¹’, û¹A#àSB´h¦Uêۀ+ÕÏ1…†]]~qýn\Zj’iM°$³ Å)’i´öwû ½J9ÁçI¦ˆü¨IÛ“"ʨ¥…b˜`Âäb0£‡`§ZUMÕ®!JåúÙ¨ö¯™¹ùh 27)?“¹[ðÑi.æTþ߸X~&ÀPÕ1…~ ÕBgY±¢ßHÂWKþ•ŸØšëk{ÈÁ|Ɍ¡çfŒDüð•lՌ‡…ûx«.3Ò³ÖÚiË£Áp¼P׫oýí}çËy룅© ”ökÇ^8ïþ4 pnÉ÷…¿Ì–_7‚®Ã,0Ѕà0xi{Û.Òþ¶Ú¤Ý­_§ÝÍ۝ɿC#øèþšdûÄ#œg·V̕=1²?QØYfû󍩆»óìÏ ºúeTƯ1{c…®Ó¾,ŠíäêêîîÍvhŸ¥Û¥ÅÕv»º:.ȆÂÑk^o*$O3x¸.Á÷(þžóš +endstream +endobj +6228 0 obj << +/Type /Page +/Contents 6229 0 R +/Resources 6227 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6185 0 R +/Annots [ 6223 0 R 6224 0 R 6226 0 R ] +>> endobj +6223 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [331.477 594.175 436.256 607.092] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Generalized_Image) >> +>> endobj +6224 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [348.955 310.54 459.226 323.019] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Generalized_Image) >> +>> endobj +6226 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6230 0 obj << +/D [6228 0 R /XYZ 90 757.935 null] +>> endobj +5900 0 obj << +/D [6228 0 R /XYZ 90 682.134 null] +>> endobj +6231 0 obj << +/D [6228 0 R /XYZ 90 667.564 null] +>> endobj +5901 0 obj << +/D [6228 0 R /XYZ 90 385.266 null] +>> endobj +6232 0 obj << +/D [6228 0 R /XYZ 90 370.695 null] +>> endobj +5902 0 obj << +/D [6228 0 R /XYZ 90 140.203 null] +>> endobj +6227 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R /F8 504 0 R /F13 540 0 R /F7 505 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6238 0 obj << +/Length 2175 +/Filter /FlateDecode +>> +stream +xÚíZKoãF¾ëWð´KQ»ßìöb“`f€ì;É8{™-Q6±©¥({_¿Õ>š¤dv ˜ÃÀ$U]]U]ï#G·Ž>̾½š]¼—,ÒHK*£«u¤q”H‚%ÑÕ*ú‚(™/Æ8þ4'8N«mzýiNq\nï²U•^Ìoª´z¼¼üPå«ù‚ +·I÷{wùS¶Îª9QqV,3Ð$‘1ålþëÕ÷³wW³ÿÎ؂#b÷ J˜ˆ–Ûٗ_q´‚çßG1­¢+µ8eðw}žý8Ã'ý  a)z~ †Dã̽q¦4öJ¬Ïsíòò6+²*Ýä¿e«ëtý Æ´È®wλ|›ÞfF›ŠÁ/Ëb_;åó"K«ë…ñÌ]€-Zx»ÞýÏ/ßïó²˜/çñߌàÅ{-zþH‰0N`µ]µ¹Û;™ÀgBQ¢‘ù¥ŒCü7i º¯??noÊ̈́nÍMH³®Ê6ûÇí„zš BÔP½÷ÓØíý<×%ÂÁ^ÂÛ}§}ÛôpÏïÊÌ™gEíãº`‚! îá­«4¯÷——ÖÊkgV?'‚¡ ۚ ·åê°9LÙŤi{o¼D_‘B¤ýݼΝ¹¿eUiþ‘)‡q‚„–ÍÊNJàžTEX1ð6A’r'ü"~[@ÝqÌãºtëh_;O¼SŽÙ„åâH™ú.ßOÉ ™ì„2·é®jêÀܕë ¤ƒé«›ð×wn×*Ûï²eÝFÁý½³‡=s¦ºõ-秳è‹蕶Y!ât=§"v5Þ(v•ä¹Ösñ^õOOS¤(Õ)a‘D:aÊ×)e|äMšb'¥‚ôáXF‹žÐ(%ɚ:„×ê–û„—m¾à-øLU ~0ÆâæÎ$ò‘l’ Â]2£Az.¤YfɄº¾{¦Û¬Îªýe°¾Ó¿B Ö`;¨4ˆVoI`%d:‘íy_™”3óe“­kwu—~üìó•ÿ5f*LjwC˛*ڕpc۔}X7¿†a61­äwáAP\”ÇoO¨3Þ]åÅ*_¦uæ¼:¿éû×ÎWºq>æYjG×ía “Ägí{6¾>·ÒC]náؗîöÞD=Ý|̝uØZwºÒ!tº‚©t#ÑÕefM|f•ë΅} @*/LŽßC¿ UyN£0n»S„À‚SÞá|j̸`ò5¦Œ„FܖsS«,6I»È‹e¹ÝA¸o6YïDƛªTr4ÂÝ ]-¾µ2PÝz0J”¡¦a«ÔŒ }xºL +DQ.8A‰&”LG(Y@ž>’ç$¶@ù¦<«>Hö¨Àh1#êßsMASžš¨AK(ØÐÆê>­Ž@ÃŽJâᨛ +Z…™¡ý:‚Q¹ “UC E›"››ëÌ,œ€ƒiÍúÆ`,lÌ{°Ýn|8¾1C‰äÍC€‚`—©Ö€THs2'ý¬²¢ÜæEZ—SÖ aAêi”,õL.‹ì$J&Hý$JÆœlP² dªä” AÓ×i‰J6›úb JLCd`2L$gìOÎÙ‘-D6&Ô¥Å)ˆl}Q;éÁ4‡ŸÀ㤏|•¡sÒ@_.ššjíîä$’]Ø®@_C\µñi*#|™ÀaliH-cŒA¦œz£À 1óö¥‚}™Ðß­UÅ8¬cG?Ì `‘˜;™hN‘ò1ʇâ#’ºŸ 7½.¤ Г•}²Á>xŠZA÷†iۓêví;dø ܨh¡-ƒð=fâ R/; Bûà‰ò%gÐêPÒX<:‚ùqd#֞Àh8PíÐ +Äý5y_§Ð´£i‡Ûüˆ´O»€H«o¼` ¯ÏCÿ~ûX÷ÝQ’c2HŒ¬.ÊUöD´ÙZ¹qÈ-ó¿Û–’·¯Á¼E#‡3ãÏwä°Ûý.N8k'y~Ì‘ ‘ðÀFˆ¹Ý–…’ð ­Ðº¹¨›e½ƒ2+,Ÿ3Ͻßæ²óÛJ~›ßC¿÷9å®}g~€Ð<r±\è0^ú¥ÍKšSܯi“$֙T#Vs‚6|³(ëàEÏ~—.‡æ´j¤Ñ×#J†4!O0K€I hšY²³¤ZœûýeD+Ão/FÓYìR§üyìRKMalò¯äò+¹«þ>"öèö‡´84”ÏÌå{£ +꡵A#£ŽÐY²ù9kf‰óì?QsõϙcýwŽ t›ýwu½»¼¸xxx@Ë=:ù®By}±Ûm.ÆgØÓBú,¨ýîº-Vðpk« ãÿP¾P­ +endstream +endobj +6237 0 obj << +/Type /Page +/Contents 6238 0 R +/Resources 6236 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6185 0 R +/Annots [ 6225 0 R 6233 0 R 6234 0 R 6235 0 R ] +>> endobj +6225 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [353.773 678.378 462.606 690.857] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Generalized_Image) >> +>> endobj +6233 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.059 433.397 422.924 448.112] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +6234 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.333 175.03 425.662 189.746] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +6235 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6239 0 obj << +/D [6237 0 R /XYZ 90 757.935 null] +>> endobj +6240 0 obj << +/D [6237 0 R /XYZ 90 733.028 null] +>> endobj +5903 0 obj << +/D [6237 0 R /XYZ 90 509.345 null] +>> endobj +6241 0 obj << +/D [6237 0 R /XYZ 90 494.831 null] +>> endobj +5904 0 obj << +/D [6237 0 R /XYZ 90 250.979 null] +>> endobj +6242 0 obj << +/D [6237 0 R /XYZ 90 236.464 null] +>> endobj +6236 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F8 504 0 R /F13 540 0 R /F7 505 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6252 0 obj << +/Length 1607 +/Filter /FlateDecode +>> +stream +xÚíYˎÛ6Ýû+´jm æð)‘.ºH‹$@ši2Y%!Û´-Ė=ƙ~}/II–dÙq +/ŠbV’(òò>Ï=”°·ñ°÷rôëýèî…Ï<…”O}ï~í)ì>A‚ï~å}‚(™L ÆxüfBð8Ìöáü̈́âq²{ÜêUÎ_G‹,Ìg³—Y´šL©Àãßvaž»Û·z­³ ‘c/5HòñǔóɧûW£ç÷£/#º`Ø½E€&¼å~ôáöV0þÊÈ)é쬽Ç)ƒëÎ{7úk„+;pÛ%Zö  óÊö…3j¥ãdÅa‘dV‹zùÝ [kApxcÝoA{FÈø#x™ì÷I wČáŽD;i]ßõ²]2¡b|Й[Æ+7^¦©®æ.’2^Eñ¦š±6 >bLãJ„ž1þšf:Ï£$Ώê$éÔâM™@¾ð½)„M‰ÊÚæ†;ŒÐFbSîu\¸‘CTlÝÝJ¯m€Ë]õêÁìîJí‰1õÖIž)ÇȧӑϕÛþù×¥Nù¬³ö(£0‰¬Àu´ /V³YO8èî¢Õ<Ì*.DO ¤è1x™s<™rpb´6KAýöÖÜ8ÔKzIғî+$U=5ʝԿ5ìbïLôÏî#8 +Ív‹¹†lꨠÙÄŸ¢Ÿ$R…8o2µâ¸qp˜U‰µŠ –&£§Q …•†E´ØUïŒ#ÍuБ„1Ä|Y |‡l¦9ÈhBeäÅI•ä¡»äi¸ì«Si°p !é’=yÖ'ä[>aH‘fª¤ôÂÀASN²̈!Á+t~0śÔ|VÏfØ:×»0Íõ;ÚTF;Œ‹óÊIG`ÿÁ)Ø)YæPîMlàíؼ;õĔáì$ r7ù™ÕªŠZ‘ ĂsD%»"ߗž¸Í¦Pu $B2Ø«IÓ²°Pmõ‚¹ŠLË6UC{ûrä}pÀÏSççfU¯º8h%š‚üðo‘gÝÚ« ¾[O>’AЋc·%$ÉN²žíŒr$…ú7ƒ6¶t³Š´Ü<©.øÝ¿äw‰¸¯®ÎA ¡„BÓ9‡!âC ¦¯ÅÀ‰MVv7?Db'F'FR NÌ£ƒæûƒpÂÁXúWÃÉOŽúpz{ͪŒz¨»®¢‚Ówt ?¶ê"PåM|ˆ®D¤ÙæÏ÷¯_±Mà[𨠑©3àȸ:Ž>¨§n‘Çô ÞG³i ŽŒK Žf¬ŽV¯KàhÖUéS‘Kž>FšYç1’¹­n’#Ïk€äÅZ.vd‘eÞøáX'5W‡vG»ùš?æ…Þ痑#-¡ƒ«U©†{]èì;±U",X˜³ +@&j»ž9Ú4Ġ؆…sLS7c_æÅÛ :æèB×-6.ÂÈÔ®é¡Èû†ÿ‘[dw»îy¡ã68ÀJ$±9cAOámd8ç8½¬«g¦ë˜#BÚ̧Iæh^A%ÛÁ°šÚ ˜uDz, +I†÷9œQ×Ž·Àh\îN"w¼Å}äN@´; +(’Ï&´åY0ÝàµSB¸xÀX™; on]‚‰DŠn‡iº{¼ž5ß;‹¶ K+`RÕD½ÜÆїRÿO§O|Äðÿ„B®å#ëÌÛçuv5\D4Ÿo,1®ùBŸ¸È¸ äكšä7Êa¿=I»M›ƒZภ:\Äêu‚š‹˜»s\ÄH½ÀE0¸˜77ò,!B^.Ô@ô¸ˆ1®©÷´£þ€hêQõ2÷zJµ ¸vJBŸ(É¿£$䉓×ُuäžÿã²þ‰c*áÁˆ\m>Scdº¿Ë8ûû蝮óÜYöÙ«ï~Yßõ%ν¸‰Ò¶(ÒÙÝÝáp@Ë•q”f(*îNó§%…´ÿk¬ë/÷û¤EÃà>4©}âÿC +endstream +endobj +6251 0 obj << +/Type /Page +/Contents 6252 0 R +/Resources 6250 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6257 0 R +/Annots [ 6243 0 R 6244 0 R 6245 0 R 6246 0 R 6247 0 R 6249 0 R ] +>> endobj +6243 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.526 590.616 322.446 601.52] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Time_Elapse) >> +>> endobj +6244 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [282.39 473.275 343.198 484.179] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Widening) >> +>> endobj +6245 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.659 389.723 268.34 400.627] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Widening_with_Tokens) >> +>> endobj +6246 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [276.778 272.382 336.884 283.286] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Widening) >> +>> endobj +6247 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.659 190.887 268.34 201.791] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Widening_with_Tokens) >> +>> endobj +6249 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6253 0 obj << +/D [6251 0 R /XYZ 90 757.935 null] +>> endobj +5905 0 obj << +/D [6251 0 R /XYZ 90 641.431 null] +>> endobj +6254 0 obj << +/D [6251 0 R /XYZ 90 626.861 null] +>> endobj +5906 0 obj << +/D [6251 0 R /XYZ 90 536.045 null] +>> endobj +6255 0 obj << +/D [6251 0 R /XYZ 90 521.475 null] +>> endobj +5907 0 obj << +/D [6251 0 R /XYZ 90 335.152 null] +>> endobj +6256 0 obj << +/D [6251 0 R /XYZ 90 320.582 null] +>> endobj +5908 0 obj << +/D [6251 0 R /XYZ 90 136.316 null] +>> endobj +6250 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6267 0 obj << +/Length 1634 +/Filter /FlateDecode +>> +stream +xÚíYKÛ6¾ûWèÔÚ@ÌåC¤¤-zHƒ$hši✒`![\[ˆ,9’¼Žûë;|èA[önm‘ƒ/k‘‘3Ão¾ùVÂÞÒÃÞËÑo³ÑÕ Á¼E‚ +ovëEØ Aœo–xƄ J&S‚1¿™<ŽËu|ófBñ¸Èö+™”ñÍët^Æåþúúe™&“)åxü,‹«Ê\¾•·²œp,󅄕#bL}>ù4{5z>}ð{DïÍ0î-Ö£Ÿ°—Àü+#…ÞN[­=Ÿ2øͼw£¿Gøl”!,x/Äl0w*˜BûËØÃB»¾Þ¥‰ÌÓ|yÑ¥Ë\=ë?bŽE^Õf)›¸ñ“ +ñêEÄ{~1ÎQàµvkoL×}äS¿1x2™ú?Þæj?™sê˜CÆ|ÒØĘ l †ÛMëÍÀ®SŸpDýțBª"nÓö«µì¯""¢f­¿Þ¿~=°¤>"=§81F÷·dá6 €ˆµéSX ºŠ×G4dÇñ:>ú( +iï*­¶§ù˜tFÒlZÊj›Õ溸5¿‹b½ÙÖpðÖ/°Uè5°-—¿o_Ž¼Ú +„1ÖÞÀÕZÍe½“2ˆ‘bŽB!$ù¦ ã<X‡AÒY…£¨3@ʏ’Es|/3åŔÒ^àz´­¤—)d¯4×&çTå7_–[Cj\Xƒ¥Ìe×Í°ÚWµ\ۅ¹‘yÒîPävßUºX٩ۃmž¯e:Ÿêh° ûö¤¿š•7}±·ã҂e»i‘ª“¸–¬Ó<]§ÿÈ98,?Œ¢HxðP„Ú KJñZÖ²¬®Ç»eœ:'! +°ªáaN{Ú{À9ÙàÁ›“}j<^¶è­WqmàÐ>ðÀI6O­·U=„<‚ü–&æ²)¤¼ŽSEdz˜_0ÄyŒW$ÔØür'mЕBbÈ?`ä÷iòTâ…FÕÒÐS…>ÂÇŦN‹<ÎÔÈoŠ4¯5ØᖆLÆÖ´¥t={7¡Î:ç™4÷+€½Á!Ü6†Ù|»ž›}ƒo˜‹UË2 ¤Y·@]|V’šM‰éSÆ nÎæ .3³[&‚IÈm9K›M¶8ûõJ_êUS$­Cl˜È,¶åUËÅ*O¿l¥jçËÆÇ@>[7Ï¿.¤>‡o¬™¨#€ª†nèô!±q–&7q¹Ü®e^Ÿ­%ÀN‹ÉÙª,ԑìr õÛ¡^FêÞÊΰ¼8Çò!ò»ÆÞR\’BÜdsšæªÆu +CC‚ª¢å8…¸”Wx¬¼‹*½2 ÑZ&7]«¸‘_ë2ÞY¬Îº‘dlÞhNsh ~Þ§ÏXOŸq¬y­YþYçà;ÝoNïE@AšµËj`;Â@ïlwN:òì¤ôzV b°5ù.x¯ +ÄL¸Bâ÷õêxéNýÑâ!–މ4˜Ô4sö¦pÕDÀ;nÍ»'N<`–'åXQ¨ÁgŒç{³_œU…™‘ùmQ. j‹ªóqPyXÇ+·?º„™gÑh\BÀ}ê6î +— +ü®´iÅóFÚdYGóúBw±ªÄǐ# É}?x µêüÛpžùž(Œ‚‹dú$“ãIÍÝõ:dƒÅMvÿqån)X¥ÒÓÚ©K¨Õ•Û<¢ŽçžhŒk&r€.+]à.ûuûä>ö½_ü=@A.†ü ªˆïҐÔhÇa iH»oïHrBÆçUdûbaXDªý÷zý>mÿ%:/"CA§ë."ò¿‘4$H€™ó2ñXD2*UˆT׊J›½WOjèhÈÃN’¡20Ha":)&••#&ՄÒcê׈IuÕ“fc%&$äQëT‘‚"NùEEò@¿N~TÉ.*ò¢"/o/"ò""ÿÙæòð{2°KD‡~N֟‘Á¢€…ö32çþÙ¼Qd¡§6o-ÍЊN3x_Éòç ‡R4ã?ã|ÛÉðNY™×H0‰‘ÒM´SP'›R1‘}öš«?F:»¿$T_zۃ^Õõæúêj·Û¡E…¶yº)QZ_A!^C°· +œ@'ínõç7õ%«hŽ"URd­ÕÊQþÿ¤Î +endstream +endobj +6266 0 obj << +/Type /Page +/Contents 6267 0 R +/Resources 6265 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6257 0 R +/Annots [ 6248 0 R 6258 0 R 6259 0 R 6260 0 R 6261 0 R 6262 0 R 6264 0 R ] +>> endobj +6248 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.526 690.333 334.351 701.237] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Widening) >> +>> endobj +6258 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.659 589.156 268.34 600.06] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Widening_with_Tokens) >> +>> endobj +6259 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [284.711 471.815 344.79 482.719] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Widening) >> +>> endobj +6260 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.659 372.323 268.34 383.227] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Widening_with_Tokens) >> +>> endobj +6261 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [299.628 254.982 360.629 265.886] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Widening) >> +>> endobj +6262 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.659 155.49 268.34 166.394] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Widening_with_Tokens) >> +>> endobj +6264 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6268 0 obj << +/D [6266 0 R /XYZ 90 757.935 null] +>> endobj +6269 0 obj << +/D [6266 0 R /XYZ 90 733.028 null] +>> endobj +5950 0 obj << +/D [6266 0 R /XYZ 90 534.586 null] +>> endobj +6270 0 obj << +/D [6266 0 R /XYZ 90 520.015 null] +>> endobj +5951 0 obj << +/D [6266 0 R /XYZ 90 317.752 null] +>> endobj +6271 0 obj << +/D [6266 0 R /XYZ 90 303.182 null] +>> endobj +5952 0 obj << +/D [6266 0 R /XYZ 90 100.919 null] +>> endobj +6265 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F23 340 0 R /F65 376 0 R /F50 339 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6278 0 obj << +/Length 2006 +/Filter /FlateDecode +>> +stream +xÚíYK“ÛD¾ûWèvU<;o–â(’*$Ë)P.­5k ô0’ÇüzzzZû '8yöáƕvÞñáã,´e¢[ÀäX¼Äšc·‹G=Ô2K¦Å.-&6£œ,oAÆ;?žÍŒO¥Ëf}ʒž?_Ë»ºÔií .M1k‹pë‰Ð ¸sjzX+XŸR©2]ìšýFW@ýH˜¡@4”³ +%¥Q(û ‘ø~wÂ:à9çüq֙Áë`іu0!(…Éå£e<ÞÆÇÚ[:ZÁ`ĤñjiÊ?˜œ>×„™ ÙäêÕmý@ýšŠ&Gwj–ǧêaä¡M燹% Y£QK ,ÀPf¥é]C$T8$'èxŸ°0?‚¾ŸRÛªÃÈÖsŽ» Lí][àê0|wh‚Í>Ýíµ½‚ÂlZ$ºîòd'ÛÕ."6ÿ_˜!…¦!Ýîýoüo·{ÈÕ-¤jú缦Úk†4]‹ýèš?Û$ƒÏqó'¹sÈpÅïCO1êœê 3Wƒ†ö^Š 9°ÏïäÑk;K³Ra¾œ‡›fGг5bùÊ +endstream +endobj +6277 0 obj << +/Type /Page +/Contents 6278 0 R +/Resources 6276 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6257 0 R +/Annots [ 6263 0 R 6272 0 R 6273 0 R 6274 0 R 6275 0 R ] +>> endobj +6263 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.97 690.333 252.675 701.237] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Widening) >> +>> endobj +6272 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.659 590.841 268.34 601.744] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Widening_with_Tokens) >> +>> endobj +6273 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.639 374.884 300.161 385.165] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_fe613a3da3edc3cb4506f70d409f061d) >> +>> endobj +6274 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.639 118.508 300.161 128.789] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_fe613a3da3edc3cb4506f70d409f061d) >> +>> endobj +6275 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6279 0 obj << +/D [6277 0 R /XYZ 90 757.935 null] +>> endobj +6280 0 obj << +/D [6277 0 R /XYZ 90 733.028 null] +>> endobj +5953 0 obj << +/D [6277 0 R /XYZ 90 536.27 null] +>> endobj +6281 0 obj << +/D [6277 0 R /XYZ 90 521.7 null] +>> endobj +5954 0 obj << +/D [6277 0 R /XYZ 90 284.074 null] +>> endobj +6282 0 obj << +/D [6277 0 R /XYZ 90 269.503 null] +>> endobj +6276 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F23 340 0 R /F65 376 0 R /F50 339 0 R /F72 471 0 R /F31 472 0 R /F7 505 0 R /F1 542 0 R /F8 504 0 R /F11 418 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6291 0 obj << +/Length 2253 +/Filter /FlateDecode +>> +stream +xÚµY[sÛ¸~÷¯àSKͬ`\€ôv:Óv6™ÝMgÒÄݗlFCK°Ä®DjI*Šúë{@$AB¶Óº¶Hè8×ï;‡ÂÑ6ÂÑۛ¿Þßܾ,ÊP&¨ˆî£ GRÄ)‰î7ѧ˜DÉbI0ÆñûÁq^òÕûÅqµ¿ìÔ¦ÎW:¯/wwoëb³XRŽã¿íó¦1—Ô£ª$U¹V°“`DÄ4‘‹Ï÷?Ýüpóû ]pDº³¹D’ñh}¸ùôGXÿ)ˆeitî¤QB|7ÿ¸Ác;8žØA‚;îwp6MH\ªåñYßà¸9æk»¾)ªlŠªlÌý¹ØïÐƒ•hwUc/w¹vÀ—¢Üº¯”‘Ý۝jZ³Z”µ <þªÿ©Æ-É6 ‰·àÁïô%Ï»b½³ÏØg×»¼Î×­ª‹«ö¿„eÜZùpтIœ›æÒ´ê`®«Gó¹®Êm}Ò±ĥQ(ÎKœnIüE«–×Eþ°wâõ©,­Ýë괝>5²(™øT«­TnüÛiÔ´u^”a›ÚÊï ~?å{ëöÊø£Å’a¿ÑŽ®jçè¦ÍÁÌΝ ÌS¥ù–ë¶Ýc]&ÑAКܾ¡ãÒ Œ Ftòuz½a™Æ¿bJ0#caŒX`e?  ”I–j‰HÆ#†±vÚ]¼,(Y´IååÆ(™o6½ ¹Ë¢Þ\Olëm¦vó’ +Ž8£¾·k՜ö­©\[ܖw.‚‹ÁEc£IB‘”Zß4f¿_1ÁF0 J”H88…ú̜·rd¼#ì$çůßkø1$9ñ÷ómI†dF8†=ÉÜñ)JÁØ¥†@¬Sð‹–#©P3”àìُ6asŸID™æ"K\pØ*õ—}‹Âi +¡DÉó~äs?Î=È}Š‡hözéā]½¼ ¤DYB"/ XÁQJü´¹3R…Á1_B‡)‚Jb–;h6«a½ˆÛîî«Öy«Jø[ÃÛÒ<®ÝÞᘹˆðFAHƒQ0D +‰!œ—/”Ðd–LR$týJø°Ùó—N)K½€óÈ$ ¢é(ÄØ&¥àÞùYÚàJ8Ÿ +H2u°rc¨¼ÞZNÿðö&úÔ)3¸°ÈŠö¶ÀPµò¯«î¨U¿›.[W]×\B¨¦IçLJø=!(MÒ à$sÀaéKÇt·JKw¨© :ÉXæ!lÿË"£}ç¶ú¨Z¯µ²ä'‚CûZªVjUwçs·MÀ01 ªgð +à*©Å«Ä²¦··-˜Üõ}¿ÑÕº€ê§Êâªg>ÜÛ6nüÌ8ÍÌà·§K£ pÙ+@§ü  ïþ¶"ž|ڑײN$x6¢óƒ² cÀò:Úþ² „¸¢íÿÀ7Ö{몆ÆïX•¶§4Ü1 i)Îw²®MœØù´ÏSÝrdÖéé«¢@1ôÂ_ò}±YåõöZ·O9=x'Yý(ïÐ/À¦ñWâҞW oŒ@oY”ëêp”ÕÁì¾;íÎ\U¥]ê&<.Ÿcbù\nÈ>7º1$ОñÄÇR@šÖLlŽóævså.çPòÅAˆÏ<0øãô˜…Þ‹+0Ëg0ËS˜.ÿ{œífùz·Uƒo/±j/G@V€?™öÜZªóÊcµ)¤B›6äâ5H%L"Œ¹ßÎ1•q[Ç07³Ì¢O"ܤN˜û +_8€¯šÊmœ·“§Ìi DKº‡„)aѾBéöŸ(È%–1˜$èØyK“žî/“­üŽÁù‰v›x²úډ4ùŸ±Iü°‰$=6ùÀ¬œdÁ„ aqJ‰B°ó¶VÐáéð“.Öö@k¸pÁ%£W=F8ØÏŽ'ü5zy/ +gÁ€Æ añ¢U‡ãL ̛i†ØðúáO3´ëº/¡QÐéLð´E¾_½9•ë¶OGï  ÂY -½©ã6’¾ÞùÑ ¢•“z ´”ó¡6hÐÕ!—dzÿ¾ÎŽðDÀ6ˆb:ŒeÌùsg槢Üõ|á!¥ñy‹™›I73µÕçsÝ£mO×Ð/Í;¥üéŽìh\gÛÕQBŒØ×äqÇ.#<ÿ1TÜ"T¼ëùƒQHà>ƒªr±fUuÅ…êŠI’WÐ۝*'úÔª¹úbòXWºeqýH®ƒ×M¢ùe!ìà­³H•K?=~ÔC-sã)\ôïðõÍÓð¸ðØͤÌΪðùp ¾J€œÆÆ«bˆ&És{ j§V^^WPø +ʾóƒ$(\g¯$‰è¨§ë‚ät³tŒ#“n±<Tí§Ù4»‚-$ÁàE&¿)sæÉÝ3Xã’c6Ù ?ڌõ2·.àޘ +8-2,Ÿ 8ÍPš¾°û`©@˜f¯2jìR6ÑïZ¿Aá¡aléÐ0Š 3úãeÀÅHÀ¹^(ɋŸ*ï~qº2\úΙþR³@FҗþPè~ ÞbÃ> endobj +6283 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.334 604.544 236.659 615.448] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Concatenate) >> +>> endobj +6284 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.635 547.869 256.157 557.767] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_fe613a3da3edc3cb4506f70d409f061d) >> +>> endobj +6285 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.708 432.38 250.895 461.445] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +6286 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [448.024 387.037 483.212 418.006] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +6287 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [322.376 176.932 385.519 187.836] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Map_Space_Dimensions) >> +>> endobj +6288 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6292 0 obj << +/D [6290 0 R /XYZ 90 757.935 null] +>> endobj +5955 0 obj << +/D [6290 0 R /XYZ 90 657.469 null] +>> endobj +6293 0 obj << +/D [6290 0 R /XYZ 90 642.946 null] +>> endobj +5956 0 obj << +/D [6290 0 R /XYZ 90 539.165 null] +>> endobj +6294 0 obj << +/D [6290 0 R /XYZ 90 524.642 null] +>> endobj +5957 0 obj << +/D [6290 0 R /XYZ 90 367.225 null] +>> endobj +6295 0 obj << +/D [6290 0 R /XYZ 90 352.701 null] +>> endobj +5958 0 obj << +/D [6290 0 R /XYZ 90 239.655 null] +>> endobj +6296 0 obj << +/D [6290 0 R /XYZ 90 225.132 null] +>> endobj +6289 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F23 340 0 R /F31 472 0 R /F7 505 0 R /F1 542 0 R /F8 504 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6306 0 obj << +/Length 2616 +/Filter /FlateDecode +>> +stream +xÚ­Z[“Û¶~ß_Á§Tšš0.@ng:Ófb·i2ãÄÛ¼8 W‚viS¤JR»Þ߃ /  Kl?ì +$!àÜÏ÷AÄÑC„£·7ÿ¼»yýF°(C™ "ºÛFŽ¤ ˆSÝm¢ B%˘`Œï–/òf—¯Þ-)^ÔåË£Ú4ùê§â¾É›—ÛÛ·M±YƔãÅ÷eÞ¶vø«ÚªfI҅ªÖ +VŒˆMÒåw?Þüpwó¿²àˆ˜½¹D’ñh½»ùðŽ6pÿÇ#–¥Ñ³™µ‹ÊೌÞßürƒ§zp<Ӄ2„·zÜ=*+N§vû2ïÜÕz”´ã ]WäåêÍ¡ZwE]Ù'»CÛÙѾ©õ¬§bÓ¯Ö/»­Ë²^R¾x.ª÷5Õ=֛E{IûO0;$Ê$&Z\š"‘Ñ(¦nI+ò}]—ËX€áóvbw/«u½©wyQýŽ9†?bŸ¯ë +$„mfFˆ‡e”ˆÌ.Û¨îÐT­BŒÓ™õ;¶óºæ kRpý¤b»ŒY*yµ±ƒº*_ì¨dL¤Ú7ªUU§Üܽµ¶½Ø&×W q¿°ý4êÛao{¥-Q …^-ㄒEѹÝûï—:hŸMä¾¥£˜gˆ¦2Š!¶3îâãPmÔïÓJm´]Ñ2æR˜¨9¶“Ȑă Î8çØz„R”QÞ׆HÊ2œR›‚¥s™ÍÓ{e?×yYûÁ¼{µ­wßZ.êú.(—‚/ÕždAúêÿËNSúÿ“qHÙ/^ÙHW[!ɦ_nœÐþ»g"#Â奈d(¢ÖI\ՕKÌz;ÏTh.íG™KëûÀ•cñ«²l+P’0—Ç©iSìTÕŽ«îe¯lÆîòÏ«¢úªtN}ãʼnäVI=€õ‹Ýag/ž´~yyPý¤¼³#­{õзž­1晾ÒvôÙ«/z£BÞd)?‘7LrDd6¿µAlòè…å±$(¢BÎÊDm;u 箐ï꾤×Е®s.cˆKîûv¬Ñ»|ßj1CÞ.^ÙOÿÙwöæÇ/¬ã?)7•ijA’¡¾l‹AÚ¦I?Á”â¼ÊH2+҄Oë²îPç›BžjèýØ`ü䮓Õ÷ëP½ Édl<=¸ñ‹› +8Nÿކä•ÐÈÕF2½Ä:„2ãxiÎaç ÁŸÔ*ƈ¶Bh%*–b&dê«;,¥#/°C©ä3iÒ°0'ÒK"Œ³¹!3ƒ p{+f"…þøùü1)ZÁ_ÞbÚ_ôRžËhš¸ê¨ËwœÑÀS$9; 0!=Zz‚ô Ž(O$»Øë^›D„gÊÑ Å6/ېEr´Õ 3Ü=ö†z©åw÷†z ÷L½Ôóê6Xm$Fi6U…jWÞÃԏƒ +aëZõó£jT8“X–[:E‰$žªÓ>?Û8ÀœuW7öºÝçk÷˜JY·¾òüÆ¡(àHBJ$ ÈGŠ¡Ó +è¡ìì¸O/Z̃P#˜#– :íuñ 9™M¡×¦Vn“ªv»‚õÆI“ۏlõç¢{t©Ü«Dg¯à j(}íº)î᫱€ÛÖ©ù[óàˆÜ¯ooÀ4,ELô0[XYÛ½ZÚë¼;íè¥ûÁúZ\{iÚ£M·ö›²W u‡@§aòŠÒ1Ø'©kMR £ò:B{{«>ï¡.­L€¬&akSy[fÖ)òûÒEræ!e¬ë×ÊOy0èIc0A–P Õa†‰fãx; '$ôˆ(°P8N.þXš¢ëEø÷æê|Îöœ'ë8a]ïMh½?IÄY¯ërk_W›17C͇dšÁ±Á}Ў±.LÃkf/Ø ¨1fą3w4â¢'‡ªšöö†ô\C “Boäԓnò_ÌðíPÐïÆ꥓ ¹3ƹִýԞõ, HRµùÛL:O¡Ø‰“*›¸ÿ¤>РF³úT‡Ý½jüˆp2´a ×&7çÕ I¨ï·>¯ÕÞ0À?ç³lÌÁ¶ƒ²E(òS^›UÞ<ÀžÝ9Í3lG6–vVç(¶ÎªóQ "¡‰ß +,îæaá›1ÿŠ.‰Î‡„T8q1A'+UõÐ=®TÓÔgc¨ •2h*!ÌÁ’þÌ7&ҏÍ&©!ág‹‘ Ãú•êù?,Úg Óh“ +ndêC¹±×ù¡u3­µ`àYË_ÍØVQz +D Ú¸ãœŽf~›½î®ó8I¥ó)¯žõª)>˜EÇ.åpÅ"‚ûg=Œ¦ÞÉ1â<› +f¡€FÙÈ»:Bƒ@>e“c% ‰{KÂÐ3Î 4¦š½<! Ó)ŽhðO€‘d@cÆåâïÇ$ +R0çáÀžžÚnÓ0Ӂ:•Žðýdʧœ~ } +:‹ : Iø¬Âٟ´³¡5=Á ,š`$Fžu<dzŽzÛ3¤b''ðÒp*t±~°Øßä§|6C'ó àÀ eW£Ÿ±àœhÉmÀ8iØØ .[<`^xNg ¤žŒ$ï¯ ¥‹àé-,42í‹;Ýêß|¤ý‹ÛЂú²K ’ ¢'£èëÁhÞ¼ '†“¨Çøxor)ÏCüҀ#’Yš’ÌhJzDSXB¯e)[TuyÄS4ƒKˆá)ö|Ñ,:¥,íê½r·¿ ð <ãîõê^­¶FÄÒ%ÉLM XNsPêI‚j;öä+8Ò)Þæ…"à—7:©AÚö +<ìæ¡~JGçL11ƒc`PãE.@CÆ´;CUè•TE°oCUˆÏTBž?…&¸DɘߪnšgËðoKðã4\æu¸¾ÿ@«ý:îs‚ZXž'>NAø\CåˆoFæTŽÑ#uô!qí>ݜ^¸7ípfŠ9µƒ9æLlüÑÇ8]QõG/0Ãàýé ­ºÛ”º£ó³ÎY’%P¦cÅDÜs,ò(ÖxÜ:% B‚­ pñüùkp«è&½£ò)‹‹j]ïö`Nãfýlĝ~E`T/€@2šo +š‘ùýÓ ¶öóÜQÃs3¿ÎŸÏÀTL20Õ?V]^¸³pq¢zûÃû•Õ“ É&ÝT$/þQ¶µÝ¡›²ÂôÄyªþ B\†ÓRfþ‰¹ðõáa}ôp1S§ÿ53ÑïRŸÕT•q”ŽïTøÉ6CTÊHzí 2ý‹1:CYê^Œá–ªù•Ù½þ²sçïz˜a/Ö°ÿmUó—%ç W>ΫCî~5×0ý@0bnŒ^Q÷^ƒöñ^õe5ûõ£ÿXn;ÊKR Tc¤;]·¿}ýúùù­[t¨Š}ƒŠîõ~_¾>. “U LËa‘mš±3ïOØv7wböÿ?vp\1 +endstream +endobj +6305 0 obj << +/Type /Page +/Contents 6306 0 R +/Resources 6304 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6257 0 R +/Annots [ 6297 0 R 6298 0 R 6299 0 R 6300 0 R 6301 0 R 6303 0 R ] +>> endobj +6297 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 491.218 239.856 502.122] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Map_Space_Dimensions) >> +>> endobj +6298 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.639 306.219 300.161 316.5] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid_fe613a3da3edc3cb4506f70d409f061d) >> +>> endobj +6299 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.144 269.173 182.164 280.077] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Expand_Space_Dimension) >> +>> endobj +6300 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.502 167.377 241.69 196.443] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +6301 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.635 98.244 163.823 109.147] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +6303 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6307 0 obj << +/D [6305 0 R /XYZ 90 757.935 null] +>> endobj +5959 0 obj << +/D [6305 0 R /XYZ 244.439 494.372 null] +>> endobj +6308 0 obj << +/D [6305 0 R /XYZ 90 478.206 null] +>> endobj +5960 0 obj << +/D [6305 0 R /XYZ 400.69 272.326 null] +>> endobj +6309 0 obj << +/D [6305 0 R /XYZ 90 256.16 null] +>> endobj +6304 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R /F11 418 0 R /F8 504 0 R /F95 1788 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6317 0 obj << +/Length 2072 +/Filter /FlateDecode +>> +stream +xÚíYmoã6þî_¡¶ÀUÖ _DIL·zÛËâz/Ýî¦è‡ì"Pl:ª/%¯“ûõ7)ÉTèÄÛ.ZwK +5äÌ<Ï3C +·^Îþz9;»ˆY ˆi\®ƒ$&ˆS\®‚«Dé|A0Æá«9Áa¦Êìú՜â°.î7r¥²ëæ7*S÷çç/U¾º~!U›¿Å˜.³VΔãðE‘5¹|-×RÍIÊj ÿ%„Á5ÄüÝå÷³¿]ÎÞϬ ¤[ OPÂx°,gWïp°‚çß1‘ûnTD”Áo¼™ý8Ç^q<ñŠ2„cn¼úûZÏwvA×Åzòn8ÀÌxg!‘cÚMޘ1Îd4FQ÷ƒ6Yçy6ÛlÙÅ# Wy)«&¯+ó6!o§ŠIÒ¿]yìsXCÿÿgÚ ÷y»ñØ¢1ÎF[ *hø˜Œ#ñhp {ætü~æ G8áý€™òÅ£h\¹K:Æ%ùˆ¸üâÉ_Š"œŒù£‘Ç +Á(æÑéÑ}ÂѶ¾¾‘×ëºXɕÇV!*†%å™õ[¶ú•`Á”³È€·­×fԇ9åÀ¹<»)dc“½© ¤2»ËË]iž{Öý'·¡ÎŠ¦6OÀ˜}Ön2;ªVæ‰|¿Ë +ó¨­}¨Eј„YµòD“R„£ôIÜpœºQLênÍm8KYÞHe=Y{¦Z°(øNâüT ¤æø FuÈ$„Œª¯Ì…½¾bßè{.k¥d³­«U^ÝÚ×jó;I®~”W¾(1Žb!NG]:²9S²ÓV#ªêÖªë뗳છq´3(Ä*¥ˆ&čU^µµQqí÷C`0 +äšRt‚‹: P¬ÎÖ[<†Ù 0')"`R€ˆàcy"ˆAtl‚52zÝ{'¬ós¢Íõ²^ÙU¼ÅÃ1wKHdëÉ X¹Ê«"¯ä;Ë 3pAÓÈ -۝ªlEÌÌ£‹›Ü®[/¨Ÿ½_ÕºVÍ#@ t$Ð#U‹>UµhQ&Âþ‘]û¤t:DèPñî<ÖA›ãa•~) 1J“=÷OQ60Ín¹éQ™ù2Åé!îæ‹pòõ×æ×7°-c§ÄbCz5¡,ÑaÕwhÀ҈"g:π‡ ‰@ 4N6°Akô+†Ñ!"˅ •Ëjeaö-Ýv`4föæbW-[['pø]½ÜÛ¬µ5V°Y$ûˆØnêº0¯Ö[©²¶VÚўD†:Ý­&š¹ú‹qF8©O1J™ÈñwҀ,8î©y‚ýX'”M 51oIË¢>+.@ Jé@£«u]/åiœ Ô¥MOy0¥CKÒª<ÒSŽÍi¾¶ÒÑç´®Š{s•ûèÉ¡a?»Ù5+íÕ-d«—]”Yäêã¿ëV>Ji½º ¿¯CefC|3­V‹¼ZÖåXu|ô°9×%]—¤ÞÛ·r³F6Ï&ñ1Ý@ÑçߕH¡ ÖÐÉù`ZÀá¶J8Töäʯ#1´å˜ûÊ* Æò¼i¡LÖMkvnYÙSÍ¡¾¯Ý†Bâ!Qϟ{V‰éAãøØl‰`„Ó!…Ç:ƒóO£·Êc?E)?N8”à#͂€Š¹tøa×nwí$؜Û*]¡ùYåm·S ¤k-àÈDxxך¶žj@l¡%„¾äí™ ˆSœŠiÜbå` Aí+’„¢@ó‚ +~ÄQ €pwM°¾=øÕJ»X¯Ê’ðq!Ç×ʧ¦3kU–ÛöÞ\jþ~å™#NQœ°§ÅšŒÕì“:°ˆL8â“Æ\O±.ßð³«r-%tÖ¥ê4'¢Ö%¸äý¸2¯ò2ÿO× Àmsß´²4×Ýö^ªÜ‚“ÕRÚ)t߂i¥·2>•¢ÐD> –DNpÀ옴ITû¼‘Ïìr‹âÈjÌnÉ\*¦[èÊ +«ªu8ö¶ +Ém¦ÆèƊúçV?o|*‰ýòȎ¶AŸýª6(Iã†.ˆœ$ffŒXêßûüï5B+Xàp-(ïA›ðÿNè7tB§Áä¤Fˆkø'~¦÷[ªúD¡Ö,c$ ›}¶5Wšç'6˜á>zjÇؘ…SèÇiøgÕçe :©+Ÿh‹ô˜8æhWÇz—7[¹Ì³JRã/ŒŒ]„n»xŽ™JD:=ÌÀЋ—^—=âVÎÎw8p±°ìñ³¿c컰ۛ[YɃš²Vu9Aôº. +S…ºC@S0-ä¹{ðQé“rÄûMý[J¹;êªþí¶@›Í)“?Ú·3à߁Þúwø’ó0 “£ƒ!ÔP¯æî»màÖ| êþùpʃ<> endobj +6302 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [486.549 696.002 513.996 706.906] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Fold_Space_Dimensions) >> +>> endobj +6310 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [229.635 202.484 249.889 213.388] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +6311 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 130 177.053 140.904] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Grid__Certificate_1_1Compare) >> +>> endobj +6312 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.989 115.38 217.919 125.285] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +6314 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6318 0 obj << +/D [6316 0 R /XYZ 90 757.935 null] +>> endobj +6001 0 obj << +/D [6316 0 R /XYZ 213.427 687.2 null] +>> endobj +6319 0 obj << +/D [6316 0 R /XYZ 90 670.473 null] +>> endobj +6320 0 obj << +/D [6316 0 R /XYZ 90 603.652 null] +>> endobj +6002 0 obj << +/D [6316 0 R /XYZ 90 580.718 null] +>> endobj +6321 0 obj << +/D [6316 0 R /XYZ 90 580.718 null] +>> endobj +6003 0 obj << +/D [6316 0 R /XYZ 498.315 527.964 null] +>> endobj +6322 0 obj << +/D [6316 0 R /XYZ 90 511.237 null] +>> endobj +6004 0 obj << +/D [6316 0 R /XYZ 199.738 436.61 null] +>> endobj +6323 0 obj << +/D [6316 0 R /XYZ 90 419.883 null] +>> endobj +6005 0 obj << +/D [6316 0 R /XYZ 489.249 369.167 null] +>> endobj +6324 0 obj << +/D [6316 0 R /XYZ 90 352.44 null] +>> endobj +1488 0 obj << +/D [6316 0 R /XYZ 90 254.047 null] +>> endobj +222 0 obj << +/D [6316 0 R /XYZ 90 247.447 null] +>> endobj +6325 0 obj << +/D [6316 0 R /XYZ 90 148.974 null] +>> endobj +6315 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R /F11 418 0 R /F8 504 0 R /F95 1788 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6345 0 obj << +/Length 1482 +/Filter /FlateDecode +>> +stream +xÚÕXێÛ6}÷W(Ê@L“”(‘FQ IºiÓ¦Ø&ۗfƒ@+ѶYr$¹†ÿ¾Ã‹®Öú`˜¤¨á̙™3Cagã`çùìÉÕlyxŽ@" sµvv€ F‰s•8o\Bõæ ‚1v/ç»Q¹‹Þ]Î)v‹ì´•I½û=½)£ò´Z=/ÓäÝSYÖé5Æ4Žj¹Z=-vû¨œîÊù‚2ì¾®ËC\›ñ+¹–æYÃã€rυõùÛ«³Ÿ¯ffÔÄÑj±…sâÝìÍ[ì$°þÂÁÈÜ9ê];ǧügÎëٟ3|§‰ÔC8`ÆÄËÃM–ÆF¡—rwéñÅ!ë´È+­N#oyÁpO ïqgA)òà-ðšR6xÇØPn¬1¯žÏœ7 ˆž6xv)E®1Ãð##™>!u8èøJÐ#𩳠¾þ×ú<“ëèYÈc0H{ à qѤÔ[¬]4â¿‹/g®ÖÒ>œ¦¶)aS¯?ڔË:ïi‡Ïj¾ðˆBl·?Ô²2øÕ[ÇñÀ½´LáXˆ7Ö;…øQ€ú€Ý3Є`¶;þ›K+·>áßÜ'÷ {tú4íOß0”—´O&ùhw=lœ;8 +xËç͞ϟòÀ@”3þKc£'ÍXÓÿW‹©..J–Wm~kÍÓªÈmrÛrÐ¥ú9 Tÿ{¤ïbÔO×6^èÊÊ$Š½W<ŽÂ°K&ìM°©¯IÎî©·i5Á¦€'41ͦcZo?Ž»õ`cQ+8â¡øTµ" Jâ ÈÛ§ˆs¯ë¹("¶ëz&ë(Ídb´ƒÌŽËt¯ñœi0Hô‘狳XÎç>vÿ™暆kc:®ûÀPˆ=(fŽi"ó4ß1Å^–‘b#Æ 0JS¢€úmÕ½EAŽR̬©H׃C¥¡áÜ­ ³’B€Fyk`Á¸O~ùbJ×e´“sÊÜ£jj‹ò½Y®¬ŒÈcdr7‘êüÜÊé³Æ¸ª5Œ Áls9@Ò&#J¤÷…VB–•´ ZRì¢4G£¦s6 h_“&µþ( Û¾³S…䒁~af_ú9Š!5ˆðn"üq„¨ý[…(„ÔÿÝküažl$X]š™ÉBµ#jN.¨Ó›L6PÕl1 *¨ûknƒÔi|ȀH@ãÇ·ÅçÈWFâ(ï%Åúô™²YB8â?$ž=&túÔ¦þÔmÄÒ@v2¯£†šÔg9-‰¨ê±ðèÃîpsâ®âþ5N êjŠžNÀ † ÷‘¥yÖ³ÜÒ£¬åÒÓ8>2w9[ L#,I +8z¶­Hçdا˜ÏYØïÊG{q~%ëC©²)¯Æi9h iéµ¥Ïö‘|ÔF¶ ‘ ƒ}$»áñ¹õ¼­ŠÓª¶š»L_‚ªpüN"¹—yÒU ñqkxA¿=C„)Ÿìn1³ëjPhŠqkkjïnÕ.Ê2Ùr”?6Cùáevµ°k]; Áÿ½w&4"³ƒQ@bH„¼ó–VÊj/!ôT0ěæAS!ÀƒÃqIO 0®ÚÅqUv¨ ]d'@îŠ_›®b]»Q™ZYfjSë?• Ù¨Èt@€|8¿»‡Ýï3´Ý¶én’˜2´b< ¸+õoO÷öR?5ñQ7¡R”‰,ûÁý 1A3£èjxÌÒÝwig‡ÄªLH?È ïm”ý0!kÀ!}w äxДm8ÿ8P{üY.€þ—ðý*§¿Æ̤¸Û|c16féK•ÊávÚxÜL­ÛÍä¯J–ß«FÁ÷Ë(oóY•)ÛÔTm¢`DFUYAæÏkÙxcÙ{§ý6Óvú"·ü³­ëýj¹<(®Ð!O÷%Jë%@»> endobj +6313 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 697.922 180.649 708.453] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate_c03d43b46ab7f9e5d0ea3c46a5eab7b3) >> +>> endobj +6326 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 659.298 180.649 670.202] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate_cf34edb23c376600051bbc563e4122c4) >> +>> endobj +6327 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.986 659.298 228.24 670.202] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +6328 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 621.046 180.649 631.95] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate_67cbe06cd666025c2ff64652d5824a2f) >> +>> endobj +6329 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.986 621.046 274.725 631.95] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate) >> +>> endobj +6330 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 583.169 188.398 593.699] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate_df9fc5ac7e45f36bc03af31b98b31a72) >> +>> endobj +6331 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 544.544 163.215 555.448] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate_869306ea4afb6453b8e9cee36c96f46e) >> +>> endobj +6332 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.552 544.544 257.291 555.448] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate) >> +>> endobj +6333 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 506.293 163.215 517.197] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate_3b727ab728f8758af9fb217eca9d791a) >> +>> endobj +6334 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.552 506.293 210.806 517.197] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +6335 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [229.635 424.419 249.889 435.323] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +6336 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 340.691 173.456 351.595] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate) >> +>> endobj +6337 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.43 340.691 253.684 351.595] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +6338 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.588 103.913 187.842 114.817] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +6342 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6346 0 obj << +/D [6344 0 R /XYZ 90 757.935 null] +>> endobj +6347 0 obj << +/D [6344 0 R /XYZ 90 716.221 null] +>> endobj +6348 0 obj << +/D [6344 0 R /XYZ 90 716.221 null] +>> endobj +6349 0 obj << +/D [6344 0 R /XYZ 90 678.089 null] +>> endobj +6350 0 obj << +/D [6344 0 R /XYZ 90 639.838 null] +>> endobj +6351 0 obj << +/D [6344 0 R /XYZ 90 601.587 null] +>> endobj +6352 0 obj << +/D [6344 0 R /XYZ 90 525.085 null] +>> endobj +6353 0 obj << +/D [6344 0 R /XYZ 90 469.546 null] +>> endobj +6354 0 obj << +/D [6344 0 R /XYZ 90 327.388 null] +>> endobj +6355 0 obj << +/D [6344 0 R /XYZ 90 305.076 null] +>> endobj +6356 0 obj << +/D [6344 0 R /XYZ 90 305.076 null] +>> endobj +1489 0 obj << +/D [6344 0 R /XYZ 90 156.41 null] +>> endobj +226 0 obj << +/D [6344 0 R /XYZ 90 148.875 null] +>> endobj +6343 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F23 340 0 R /F99 2117 0 R /F95 1788 0 R /F8 504 0 R /F11 418 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6382 0 obj << +/Length 1317 +/Filter /FlateDecode +>> +stream +xÚÕX[oÛ6~÷¯0 “šæEÔ%Ødm¤kÚ,õž’"eÆ&Kª$×5†ý÷^$[Žì8mZ¬†)‘<—ï;çðPؚZØ:ïý>ê Ï\f(p©kî­[žK§ÄM¬›Dþ€`Œí«>ÁvXÌû«>Åv–¬fbR„woâq«ããó"žÜ‹Ta•ýåØ~™„e©‡×â^}âÛ"È$Ìc6å¤ÿaôºw:ê}ì° +[DYÁ=ä1nEóÞÍlMàýk #øÖR­š[eðŸXï{öð^(CØåÚ£«Å8‰#mÑ¥˜…1ôl‘FUœ¥¥2§–7<ãxCq‘Ã|k@)rk·”òÖëfÀ®q–%æ½ô©˜ç®Õ +©2Ë5R·˜cø‘m)rœ‹Àªj¿(ýKQTñ-Æ4 ++Ñ%ìèó íìóI\)ÃՋÖ(zÔòEב(Jôj ˆƒÇÑ(^‹jQhð@¾±šaD °^W ¡µE2q[/ŠïµEa:у,MVzSU8ò`³ûs‡|¹”Ö ¢l.LLÅ=D:ólÑ%6@ŽëÕ»Vb9‚h2óht­hPÌõˆ5p"œ­³Mž¾U'¸þJ”Qç2´µ­€Æ ÑAÌ ´ ½§Êª01ÈQÄé´Æññ é +“h3ŽJå©TM$¬&F³Xbê3{§PNô8/Ä$VÁ§'B +Iú>µCý¶6†æʧ}æÂ|§¹ð¾m®–µœÅÑL«­ ]” +d5)R=*!Ÿýq +Ñ1kì•ËܸŽ³E¥-Ee"*3±;Û¶rj¤„^2É¢Å\¤•V ^Ý×u·ÒpJѐ2‘Q³T%ÜLLu¥®å¾Èæõ^QKK’¬O¹½l"@¢’ˆã6jMY䈏”Å +wBSæa${³ýù®í¾u­½ÕR7óŸDÔfÊ^=„¶0ÉJÙꪂʉïà Ó[—=̺n|ÈÅMÙS-xÇU• N‚ý·¾l2qæ~!=ÍN"«ÝÏ7go_×QóÙAö¤Çw&hû³• bˆèW+õµ +vQàAK£¿Vñq¾Ý‰5m¶y¬{mýhnýðW)ŠŸûœÛ×Ë0]Ô·yÉÝ')JëôÀˆ`D%¥¨?`€ý{Q¯=ûÛªGôžk{ឆn¾ŒÌª*?—Ë%ŠJ´Hã¼@q5„«ÉðaK·!‚Âk„4wØyV÷7.Òm>ÿÿH¡ B +endstream +endobj +6381 0 obj << +/Type /Page +/Contents 6382 0 R +/Resources 6380 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6357 0 R +/Annots [ 6339 0 R 6340 0 R 6341 0 R 6358 0 R 6359 0 R 6360 0 R 6361 0 R 6362 0 R 6363 0 R 6364 0 R 6365 0 R 6366 0 R 6367 0 R 6368 0 R 6369 0 R 6370 0 R 6371 0 R 6372 0 R 6373 0 R 6374 0 R 6375 0 R 6376 0 R 6377 0 R 6379 0 R ] +>> endobj +6339 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 697.247 175.937 708.151] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Grid__Certificate_1_1Compare_92edb0b8b1e2097c5d20795e576517cf) >> +>> endobj +6340 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.274 697.247 270.013 708.151] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate) >> +>> endobj +6341 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [311.746 697.247 378.485 708.151] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Certificate) >> +>> endobj +6358 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.588 614.801 187.842 625.705] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +6359 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [285.305 597.176 305.559 608.08] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +6360 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [121.93 448.217 274.835 459.121] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +6361 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 393.358 160.207 404.261] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_10e7c95784e356487a6a6263a89cec66) >> +>> endobj +6362 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.977 393.358 192.655 404.261] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_10e7c95784e356487a6a6263a89cec66e9cf46c5e08ead7689807e1c8ba30642) >> +>> endobj +6363 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.643 393.358 257.053 404.261] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_10e7c95784e356487a6a6263a89cec664ac3b90df83c2e43249ccfa2702640de) >> +>> endobj +6364 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [260.042 393.358 291.364 404.261] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_10e7c95784e356487a6a6263a89cec6625b86c6f0633416506503de2bf693876) >> +>> endobj +6365 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 312.595 178.976 323.499] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_b1db3272b7beca7b1d9d17f23d22ecbd) >> +>> endobj +6366 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.313 312.595 271.378 323.499] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6367 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 274.114 186.725 284.645] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_00017ad58d66a7948b0355b3e02c750b) >> +>> endobj +6368 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 234.886 178.976 245.79] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6369 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [189.715 234.886 230.522 245.79] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_1177f236d8c66c01bbb43b37ff90bc7d) >> +>> endobj +6370 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.859 234.886 322.925 245.79] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6371 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 196.032 178.976 206.936] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6372 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [189.715 196.032 230.522 206.936] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_c05ff6bef376a2835adbb0ca123a8e79) >> +>> endobj +6373 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.859 196.032 299.682 206.936] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +6374 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 157.178 179.554 168.082] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +6375 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.052 157.178 250.666 168.082] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_60d9658ef91fbd3a1b0064253246f36b) >> +>> endobj +6376 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 118.324 135.579 129.227] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_55b76ba0041601d8da38ab5ad619eed5) >> +>> endobj +6377 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [136.077 118.324 155.225 129.227] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_1aabacaac0806d617f53db4b34b3349e) >> +>> endobj +6379 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6383 0 obj << +/D [6381 0 R /XYZ 90 757.935 null] +>> endobj +6384 0 obj << +/D [6381 0 R /XYZ 90 716.221 null] +>> endobj +6385 0 obj << +/D [6381 0 R /XYZ 90 716.221 null] +>> endobj +6386 0 obj << +/D [6381 0 R /XYZ 90 659.927 null] +>> endobj +1490 0 obj << +/D [6381 0 R /XYZ 90 535.028 null] +>> endobj +230 0 obj << +/D [6381 0 R /XYZ 90 528.428 null] +>> endobj +6387 0 obj << +/D [6381 0 R /XYZ 90 410.428 null] +>> endobj +6388 0 obj << +/D [6381 0 R /XYZ 90 331.569 null] +>> endobj +6389 0 obj << +/D [6381 0 R /XYZ 90 331.569 null] +>> endobj +6390 0 obj << +/D [6381 0 R /XYZ 90 292.834 null] +>> endobj +6391 0 obj << +/D [6381 0 R /XYZ 90 253.98 null] +>> endobj +6392 0 obj << +/D [6381 0 R /XYZ 90 215.125 null] +>> endobj +6393 0 obj << +/D [6381 0 R /XYZ 90 176.271 null] +>> endobj +6394 0 obj << +/D [6381 0 R /XYZ 90 137.417 null] +>> endobj +6380 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F11 418 0 R /F23 340 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6426 0 obj << +/Length 1423 +/Filter /FlateDecode +>> +stream +xÚíZ]oÛ6}÷¯ÐSg3CR¢(}قµh×Y’mI!0ã“D—’“º¿~¤¨ۑ'UâaËC,É&/ï½çðòtftÞ~>½ó]'¡}çüÚ ¡C}FÎyì\ ؍„px2BpÈTÊ¢“†C™,ox¬XôI\)¦–“É{%âè=ϸb…T£1&pxœ°<··§üš« +†<›rm¹Ôb‚GŸÏ?~9| ítPé¡€ºÄ™¦ƒ‹ÏЉõ÷Ü0pîÊV©ãaW_çlðûVÁÕÈ\‰ AxnàPìèÞ%Ƥ¾îç\Œ‰õJʤúÞø£f•c§e ŒÈ£Dd|³³ùé¨ÿz*³¼XkV_ÞQìÚAß3b |;cäÐ󬧼X¨,7Ý5Pd¥µ Ò遶]¡Ü6Z7éfÝH\[XÛ™%K{§*{‡áJo‚@ç®ê} ¡Ûá‡|4n܈üa7*:0{)³ˆÈtæ¨ÍÕ˜cD°¦‡ëŒµíõæœ)–òBôÑïDT§ÒZ¥!thl Å"©^1îyÖZwÔ3‚ßË̖"+^ÿîYmÒøo)Òål~ÅõI¸ª‘G†òάF.ò¹½ä<+v•òÎùþ¼´8–üz„‰‰O…ö/*E>™”¸FÊhÊROîäÎtÓÌ6Þl53ü³,fL v•tʾ۞9WZ*nø¨@kç6‹Æu'B¼À­ñ¾í`>ny™u/Ñ>¸§7(¬=–(Àð%y cäVäò¥4Â:ʱ°c¯a»† …h`èÀà'â‚àÑ–èΨRžJµŒrñGÅrÎîU¦H,‰ª¾"‹®–Ï_£ZøÈ»º^ÉE]É ¹d鮽5VU>«:–¾×¯w´V?N§‹¹àqÝ«ƒØ×|@ށ'ª‹‚²â윩=¢Ü4~ÕËRvX^4È=ç”e̜­ÌÌÇN¸QÍ]ÄëO×ñ/ [xÍKÊò-·¸ +Ý“Q†Þ,_âV7Ìð÷í ü°i³|HU0«)­÷àÛXûl™žq«. Fú9ä*D}=ÒãNQ{©kÉÿ•yZ`Lûb×涒›3ä¯lZÔ /³ß,§÷Gòµ$á.þàOT4ˆ¶ÕgEÓTbE‹”g¹ÙãwM×û«b#WÓï3ééԜÍ^¹¹ÝP[nD×lÖa¹@oEV¶X5`-6½ €Û®Èºe—U_gï©«6 +iOgIÝÈTÎ4¡ä"´Kóˆ)}ãJþwŽeê`7ä› ½•le +ª&;öoˆ-•½þ×ìj¹µ#Òu&~ÃDØaim´G’ŠÚ:Úo¾-ÿm(☕O…ˆâE:fý¥D£Ï»§¹§ckf[^ēɔ+Õµò@àû­|²6:;þðaË1+LØN“Po¨ÚÅî`:Jö«}a[fYæ…â,µùy“ï- +÷Žspès¶À"=â> endobj +6378 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 720.286 162.677 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_2a0bc130f7cf6a0678ee3b982fcc7ab6) >> +>> endobj +6398 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 681.058 187.563 691.962] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_41227446c918730e97998799bfe04da6) >> +>> endobj +6399 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 642.204 220.768 653.108] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_76fce1702224700691a26cf5e780a1dd) >> +>> endobj +6400 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 603.349 168.216 614.253] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_c915c8d26a7dbcdbbd0c4985ec5b7d4b) >> +>> endobj +6401 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 564.495 226.308 575.399] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_811f6f947785240bcb76bfca023fed17) >> +>> endobj +6402 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.933 526.014 297.728 536.545] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_f4e7705af87f5eb64d2ebdc60cd7a36e) >> +>> endobj +6403 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [301.544 526.014 336.732 536.545] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +6404 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.933 487.16 283.353 497.69] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_cdc0aeddab3d98e336719f42e6e5b06c) >> +>> endobj +6405 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 447.932 191.718 458.836] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +6406 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 447.932 288.852 458.836] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_13419c5d820bde20af5eabd23e479ec8) >> +>> endobj +6407 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 409.078 191.718 419.982] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +6408 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 409.078 303.079 419.982] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_c3e03bc2df621903d136c689c38bdb6f) >> +>> endobj +6409 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 370.224 201.471 381.128] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_ba6b40a4b9708e94d6cd10f54144ed70) >> +>> endobj +6410 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [228.808 370.224 293.874 381.128] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6411 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 331.369 182.044 342.273] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_1f0828932daf26d10e94120c1f4a4d6b) >> +>> endobj +6412 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [209.381 331.369 274.447 342.273] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6413 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 292.515 227.981 303.419] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_68e8cef74c6b4b5a56e2c791f41566e4) >> +>> endobj +6414 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [231.797 292.515 297.44 303.419] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +6415 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [341.943 292.515 407.008 303.419] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6416 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 253.661 272.783 264.565] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_77a904793c99cfb1d61fadd277d59471) >> +>> endobj +6417 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 214.806 181.845 225.71] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_164c38a51c8718e6ac3a3f3e4af77bf0) >> +>> endobj +6418 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 175.952 181.845 186.856] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_77123fc17c8bc6d59a76802c0592a2c6) >> +>> endobj +6419 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 137.098 154.727 148.002] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_0f19da4c46bb8b3be01875eff4c00538) >> +>> endobj +6420 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 98.617 176.505 109.147] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_58b86510b9c4dc05004c0fc01622430b) >> +>> endobj +6423 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6427 0 obj << +/D [6425 0 R /XYZ 90 757.935 null] +>> endobj +6428 0 obj << +/D [6425 0 R /XYZ 90 733.028 null] +>> endobj +6429 0 obj << +/D [6425 0 R /XYZ 90 700.151 null] +>> endobj +6430 0 obj << +/D [6425 0 R /XYZ 90 661.297 null] +>> endobj +6431 0 obj << +/D [6425 0 R /XYZ 90 622.443 null] +>> endobj +6432 0 obj << +/D [6425 0 R /XYZ 90 583.588 null] +>> endobj +6433 0 obj << +/D [6425 0 R /XYZ 90 467.026 null] +>> endobj +6434 0 obj << +/D [6425 0 R /XYZ 90 428.171 null] +>> endobj +6435 0 obj << +/D [6425 0 R /XYZ 90 350.463 null] +>> endobj +6436 0 obj << +/D [6425 0 R /XYZ 90 311.608 null] +>> endobj +6437 0 obj << +/D [6425 0 R /XYZ 90 272.754 null] +>> endobj +6438 0 obj << +/D [6425 0 R /XYZ 90 233.9 null] +>> endobj +6439 0 obj << +/D [6425 0 R /XYZ 90 195.045 null] +>> endobj +6440 0 obj << +/D [6425 0 R /XYZ 90 156.191 null] +>> endobj +6441 0 obj << +/D [6425 0 R /XYZ 90 117.337 null] +>> endobj +6424 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R /F97 2175 0 R /F98 2120 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6474 0 obj << +/Length 1637 +/Filter /FlateDecode +>> +stream +xÚíYÛrÛ6}×WðÉ¥f,ïšä¡õĞ4IãÆîS’ÑÀ$dqÂ[Iʊòõ]\HÝ(™JÔi§Ó'Q°Xœ=8» bãÑÀÆÍà—ûÁøÚµŒ.uû™`Ãs r(1î#ã£I¢öpD0Ææí`“•)›Þ)6ód5çQɦo㇒•«É䦌£é ÏxÉ꼎¨ƒÍ«„U•züÀg¼ßäYÈÁ&±<ˤŽ5ü|ÿëàÕýàϯ°A¤Ž‡<Ë1Âtðñ36"øýW#+ð¥•6µà31î¿°ÞÑî§Ü¡G vèÚb‡„û†G-„]GíòmÎ"á¤KÌY9´3O…S€³1Ó¶±Å’rN¥FlÙ—i;€eÊâÏwW¯_‹Gj–CË3y¡>*žÕ¬Žs=ìv0ÓNʉhòHýò°’()xÊGÓ‡›ñQZfUÇÓh‘ÂNUG“I^Õj!–^ÀD +󬪵-¸ºþ›e‘rµâµÞalìÐÂ. +¨×ìñÆVRȈõ˜zwa5²\ŠlL  +œ@ƒ†¹ô:Š³Çd5t Gì©eVu¬æyˆÀS³\¹àËA¸ØÍ x¦(Y-WÕl‘\vmÊ´{±¤ê´-ZËy=çå2†‘D¸¾ ôîçøÚÁGoD1FžçÀƒ…|Ç×Sêì„käÀa|Èóä%`oïßìο +zèp÷}6¬ÛÞ$E®M!V6ò­ Ws +!ø¢Ïw*KõP財Í'VÆ,«õh¦È©ã¡2Qˆ™ö«dORµâè8lÕRÊ\q¼ƒ³Íù똱’ПŠ7Uûº[²¢ëLR8??~$·ÏÈ2®ç†ˆ‡Üv±U‡YíB§3 ٜ3–aÎgCêLhƒÞNÿî£{©oÂÙ¨uW¶€ŒIiß½Ó}ßV˜¼ŒãŒiá YÁ¸Öé£; [eψÈ$â#‘䱫C"òs¨LÞ.’æùO¸®o®Y(’xµµÌ³‰‹l€Mª±Ž3»R‹åõ.œó(æ$qÆQ3°ñ¦³rúêkQBÖ¥K×1à?r š4¿^é· +´N2Q¬ò‡¿‹È˜BÛR™ŸU¨ˆ…‘ã~Rõ\@ƒÀ?9 Aà™+YÊk¾§EÂ`€ +ÏTغà/÷ÆM&ßx™7ń,žY´êz(çta}µ'ÀuÉ⺚L¤sÓR´ªA}¹?!Ïx³L_^Ÿˆgm+ݼ E¦q<`ÔE48J0ÐRJÖí@¤køï°g c«•|u!ö÷Q–bڞ&»?HY×>²0GjP‘ÇY½Ç3×êÅY0òÇ3Äïû:G¾¶¹ vp¸Õ‹)'€¦ÛV‹ß7ÚÚ"®¿6°õ……Ä^}ù£âåOâJH‹÷;–-!´y¦x¹.Á0pDòúÄoò³ÚÙ£yz3¨®ý%¾‡¬µ<Ì뺘ŒÇËå…ZdqQ¢¸E2Þ׍ +F¯52k^ª¥yÙެÏ©|´Àÿ/9|ˎ +endstream +endobj +6473 0 obj << +/Type /Page +/Contents 6474 0 R +/Resources 6472 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6357 0 R +/Annots [ 6421 0 R 6422 0 R 6443 0 R 6444 0 R 6445 0 R 6446 0 R 6447 0 R 6448 0 R 6449 0 R 6450 0 R 6451 0 R 6452 0 R 6453 0 R 6454 0 R 6455 0 R 6456 0 R 6457 0 R 6458 0 R 6459 0 R 6460 0 R 6461 0 R 6462 0 R 6463 0 R 6464 0 R 6465 0 R 6466 0 R 6467 0 R 6484 0 R 6471 0 R ] +>> endobj +6421 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.408 720.235 450.955 730.141] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_77123fc17c8bc6d59a76802c0592a2c6) >> +>> endobj +6422 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 685.469 150.493 695.999] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_081718c23b5785da17c63ffec13536cc) >> +>> endobj +6443 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 646.346 156.281 657.25] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_0fafb66fa4df451fd3e2f0392329f27b) >> +>> endobj +6444 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.097 646.346 225.162 657.25] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6445 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 607.596 203.065 618.5] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_e1887d907ab06bddeaa2682bdf94d268) >> +>> endobj +6446 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.881 607.596 271.946 618.5] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6447 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 526.985 202.497 537.889] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6448 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [202.995 526.985 240.962 537.889] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_edf9116549ffcced7a39f4596e65e5d0) >> +>> endobj +6449 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.3 526.985 345.549 537.889] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6450 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.88 488.235 209.945 499.139] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6451 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.891 488.235 259.714 499.139] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_c061731c4fec7f60c48e02ed9806b4bb) >> +>> endobj +6452 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [301.948 488.235 379.197 499.139] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6453 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.543 437.53 209.608 448.434] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6454 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.218 437.53 260.724 448.434] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_065895a1428f9dc6b3002818686eff0f) >> +>> endobj +6455 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [302.284 437.53 379.534 448.434] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6456 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 386.826 203.075 397.729] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +6457 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.573 386.826 296.324 397.729] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_c74dafaa0b06e9cd3d15ea0d2af1b213) >> +>> endobj +6458 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.005 372.257 337.637 382.162] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6459 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.437 348.449 194.297 358.98] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_041afb1a2cc7277572fb7235cf08cf64) >> +>> endobj +6460 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.437 309.7 188.759 320.23] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_e94a99f8e8d290b5791baa01fd540a14) >> +>> endobj +6461 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.953 270.576 226.019 281.48] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6462 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.758 270.576 301.843 281.48] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_f00dd6aeffc847b73a3aee11d6d169b6) >> +>> endobj +6463 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.349 162.844 226.034 173.748] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_082a74ad0ce931ec2e517bf0f009daa2) >> +>> endobj +6464 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.176 162.844 386.241 173.748] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6465 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.599 124.094 160.965 134.998] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_1a15765e7fd1f486a9ee12a061dc4c76) >> +>> endobj +6466 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.464 124.094 345.612 134.998] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6467 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.361 124.094 513.996 134.998] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6484 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 112.139 155.733 123.043] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6471 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6475 0 obj << +/D [6473 0 R /XYZ 90 757.935 null] +>> endobj +6476 0 obj << +/D [6473 0 R /XYZ 90 704.136 null] +>> endobj +6477 0 obj << +/D [6473 0 R /XYZ 90 665.387 null] +>> endobj +6478 0 obj << +/D [6473 0 R /XYZ 90 545.907 null] +>> endobj +6479 0 obj << +/D [6473 0 R /XYZ 90 405.867 null] +>> endobj +6480 0 obj << +/D [6473 0 R /XYZ 90 367.117 null] +>> endobj +6481 0 obj << +/D [6473 0 R /XYZ 90 328.367 null] +>> endobj +6482 0 obj << +/D [6473 0 R /XYZ 90 289.617 null] +>> endobj +6483 0 obj << +/D [6473 0 R /XYZ 90 208.887 null] +>> endobj +6472 0 obj << +/Font << /F63 374 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R /F50 339 0 R /F102 5156 0 R /F34 2406 0 R /F11 418 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6500 0 obj << +/Length 2477 +/Filter /FlateDecode +>> +stream +xÚíZYsÛÈ~ׯ@^6dÊÍ `¨uªöð:Ùl*ŽWI¼[.ˆ‰H@€@þõé9̐–ö*U©T^`Ðè™îþú¤ptáèõÙחgçßÅ,’HÆ4Ž.¯#‰£$&HP]n£w BåËÁ/Þ, ^dõ>{ÿfIñ¢*vj[gïȯê¬~X¯_×ùöýkUª:k«z¹¢/¾)²¦±·oÕµª—$]¨r£€'a [PÁ—?_~öêòìÁSመSˆ%LD›ýÙ»Ÿq´…õï#Œ˜L£;Cµ8ep-¢Ïþz†DؗL`O2‚cÄY%”! +ÞO” +³}÷]ôn%@Ô«ª*ܺ>O}ãöÖPhaªƒ•òåËñ÷úíOXàMU6íÓLF +›aôÅý «¼çáö#Á›îzþ]B£´s­-JQÌi´"Iέ²ÞªöX—þP#x3ˆcˆAÉ’v¶sÒˑôÔJŸ„¨¤!UšLQé«2¨ QjR‚0æ§hPg+ɟÐ!àÜ$Õ¡B‹{:|Üø3¸d˜^~r44y`Τ¯÷Ü/$‚?³/Ð_ô@0Ѿ „‰øU¾@Ѿ t†–Oû‚ø_òŠ$>Iƒ'ø‚„ +:ÕáçúÂç¦p˜š"+p»ªÕŒUi 'ï«Ò¹b êÁ„Œkÿ¾0Ùæ{U6ºL›/\šC¶Q};ò¢«fê±ç5£–¥OOPϝš£Dö^·µ^÷û§&ã ¶㒠¡Oˆ§‹®Û¼ 1ªu'5.Õ ¶nCtx¨ô8é®ïŒÌõJ–Žyá„ÍÆEéM_-Bm<Ù5l+ þ`]¯Ã’p¨z•mvÀˆ’E«sg,×onFb¸v'jÝ£îa%;Š(9·c¶©êZ5‡ªÜöﮏ妵8€§!Bòì–Rè.z4ÊÐ@.(CÙ×/f˜ú~rT̈́œ¸o®‘ XA{ޗB M‰Â;ž—B®%IìµsÐÈPN­‰916…G-]VÛ{¥û¦ûhN;̅^äN§ð¶ó¸õŠ;ÓiÖ©oCîl¨?S +iiz(xÌûz~‡• NŒ@îaó˜ÛÍcá¸ÀÂØö°Ô ÷¡h¹b‚-~x” ±Ü95¼6úƒk'Œ}Ê,™/8¬6»êXlûÞÍá +¾cR.vÕ¾ÒUG؈c;=ÊJ}„Ka:íL.ôëvIªÞۇ»¼(,‘f§Wš|(܇ùMYÕj«-R&"]üc§JûÎÞ(Hg=[¿é‚¾7ÁN¿>d«9!†¸bڞš9‹˜¶8ÓG£lñM¥®uŒÒnr3ƒÑD™™@ß÷n…-6Ý÷F7°`unˆwu”Õ~ßõÝ}÷…\)zÐos§ÎÁ"CV1áÞð/Ü¡ ˜ôÊf|úÆ’—Þ|}T›Í±®-êt×\Ž‚õ¡®´aoó­ò™Ë5Sï =œCý…ëôoõ±²â¨F)«ÝuI"T±ßǓù™ˆ¶/‹QBR+ϝF-·ûþñ3ÀŸr»ä£]³¦³l;VY HgWú˙˜Lƒ ?ë 2IžÅ2¥£ÙÞ¸ˆˆû`®q?åO‡€úñ&=¨²º·ÜõŒÆ*l֏M¨d™`b‡ˆ1”RIj2)§®lú»SÜrƒŸÞë聵Ç_tþ +´Ý,!­c2¡ås´5-íi-0ÀR4ávø»úâ•Å„ÞɕBWX>¸MµU£r¥y¤^19ÜÜÝåí®+jµxaý†AñDŽ0GYP—IþμJ«·|ÿ˱‚$1$5Á’ø4VÐϊŒLôÊ°tzÕ/ýX¡ß´ÝWÞ$^¯›šƒ8ké…[­xˆÕÜDRO®${j ¸ð§Ò,µc2~üŒw18¸ñ£IàHƒ° cr2;µö’â³l2?-HAòxfZìE0Tn$PKÆÂ_´Àý†o§›%fXäqaóláïu·ËuKª ¾ËÆÈh®ìƒÎ92,û†D$øÞ͇äӅ”0'†N<þŒ8…ЕžúÿÝÿ[ +ÐC‰îG­>¡¾1?’Õ{±ÞtÿFbÝÿ’؇¿5ªþ­/8Éþœ•Ç̕„ÂÖ3êaʂ؉ºÎCkðGÕýìg%ûWÔÝýÉF+oޗ&ˆ ¿YîÚö°>?¿»»C›ËüP£¼=‡¶ÿ|<.ÄD¿À×ÛWuo +XÜg­éGúÿ7Ó&§ +endstream +endobj +6499 0 obj << +/Type /Page +/Contents 6500 0 R +/Resources 6498 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6357 0 R +/Annots [ 6468 0 R 6469 0 R 6470 0 R 6491 0 R 6492 0 R 6493 0 R 6494 0 R 6495 0 R 6496 0 R 6497 0 R ] +>> endobj +6468 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 719.912 180.54 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_3075c67d9868fc0b483db13256fb4e0c) >> +>> endobj +6469 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.877 719.912 272.942 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6470 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [314.676 719.912 379.741 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6491 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 681.058 178.239 691.962] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_8ab7b9abebd48fe0ad129a237338aa96) >> +>> endobj +6492 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [205.576 681.058 270.641 691.962] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6493 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [312.374 681.058 377.44 691.962] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6494 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.349 642.204 226.034 653.108] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_6fb154017052c68b63121cef49c568ce) >> +>> endobj +6495 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.176 642.204 411.457 653.108] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_10e7c95784e356487a6a6263a89cec66) >> +>> endobj +6496 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.82 542.133 242.885 553.037] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6497 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6501 0 obj << +/D [6499 0 R /XYZ 90 757.935 null] +>> endobj +6502 0 obj << +/D [6499 0 R /XYZ 90 604.884 null] +>> endobj +6498 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F11 418 0 R /F78 539 0 R /F8 504 0 R /F7 505 0 R /F10 473 0 R /F13 540 0 R /F6 538 0 R /F9 568 0 R /F12 622 0 R /F23 340 0 R /F31 472 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6509 0 obj << +/Length 2414 +/Filter /FlateDecode +>> +stream +xÚÅZ[—£Æ~Ÿ_Á[P²ÓÓº¡Ç'qŽwÛÆ;y²}æ0šá5Ú_Ÿê —FH ÕÄyÐ]ô¥ú«ª¯ +aïÙÃއ›onîÞ æI$ÞÃÚ“Ø Aœïaåýä‚h°¸%cÿã‚`?.7ñãÇÅ~‘^’U?þ=}*ãòpÿ¡LW’<)ãº(·”cÿ¯Y\UæöÇd” ùI¾L`LÂBæSο<üpóÝÃÍç«ÂÑ«à! +÷–››Ÿ~ÁÞ +Úð0b2òöZjã”Á5ó>ÝüûÛ ¯f‡Ü ‘ 1Q;$$D4Œ¼2„¡Gos¸rÛýl.6—m\ƛ¤Nʟ1ǯ¦íÖ\ÎÓ ߨ=ݽ縧Ú[‰8ÌwKA¥BšyÿYÔ  *¸_¿Äõ;u+ý]ž¥¿*]Û®,͓Êö­µ^…èÖÓôÔ/x’?×/æ>®ÌuŸdY¿Etâ«´L–uZäæ±X7ë±ý¿-÷A¢™¸L¶eR%y¬ŒÀÓAm´ 'Š$fgæ}8õe±²w©ÅA•>çéÏÓeœ×hqË`«/»Êè TÔ錐 ,ap=èçµF(­@j iӈ¬D^Ô#ƒŽL™ví¨ØÜÅvímW«ÿ±Uc5\ЮšŒÍ  hWµJ”>r­RܨôÌ$ƒhˆ")Añ +CyÊä4–© fꢙ΂sh¦þÞ¥p˜v7©B•B'˜|½ ¾Vteúœæö~m®F¯XúÕ6^Z9¸ª#Ó}±yîT`ߎ_Í8±®›éÖE– +FæϦÉbRK•¦ÏÎÛu% +õ¯Ëd«öp?ç4¬:&âôI`mG$`€h +#³³î鏺'@aD½^ók{6ýEõÝù- â$‚c +­Sÿî5Þl3 d6xßE)ì+€Éβ*Ö1ö'"vi¶Î3(ŚP‘æÖÁ÷&à™eØØÆֈDŽÍ‡¼µP%øs_iÐ!ýÑ$b!i„¿9 ‘FM?!@2š=Ugb7å @‹ÌŠ#ÐC‚4Z42”9ے¾'E#Ž; ÚÕüxt­ÒM’W6þ—¤,|Br>M¶ÉOÃÌ&¢á9üÀ!»@x€ §‘ô¿‡ý°Ð¦ÚÀšü*YùÊ4.ã*1w{ÛkRŽmV¤µóžð׺ð²l›ãÚ¼Ñ +¨ó(+ÛëËón£ RÉ©ÃtÜå&å?Î]Ãç6wíqtgÓ`½‚…nÚ :uϦÐ9Tœ¡7ä)Ʀ°cS­Èý½BÐ# ª3±ÎÑcãáùäà~:÷¢@pA“&õ¢#©W0;õâ}K¦QcaTžL¢8däPƒÂ m"Qm“¥®Éh÷3èÆï Ì\â§Baµ  fŽêËt*wO¶ .$ÿ Dž†}ª= ˆÔÍ~†žIžGyFý=";‹FðNÍz8ۖfUiÑl„Ê‹üv•Úe6Fý¦&‹³]ËA¬llUäXÔ8;mQàÇúGÑ¡hŒ8R8”6æ)˜µ3¬RâÓªPÅ23Höø•¼Ÿ§ke‰ó”l"´9/GlðüÛ_ÞÙì䢴í_O8Å®êò B›¢ëë^5P wèy²»J£ºê´h‹ZL£Vfe:œ@¨‹ ؇GDu,xÖTÕ)˜zJm†ƒ“Ó.U״Ȳ(ÊUšÇuR!§kó^ ؀<Í«:ΗɻËK3î£aiƉ̼/@Æj7=V׫݌Eðuáœ>-DagZdªxs<E¡h—ËO @çVص+ ×®€^»2UÀâ³ +Xü +XWeØnDë•VÞ¤žÁ²²ˆÌp­äŒo½%ÜÖQ(âòrçÊl= h—¤sÒÌA5ŒL¿>ê_ >í`†¢Èu°ß¯ˆ¬èÙQPs¿õ‚ùʺ©æ€Ò¼ûV[ÍÏÑùª¸åV”#ŒÇŠâüRföQ-ªÿIŽaU‘i?ãÉÖ»F²‹²©Ê£„[mIWGœ«ä""Ô9té8t5¯A¸šÈýHå¸r†ÕæÅàÓZäØ) iÏS3NNVÙÁH7Øÿ¿Ê~ÆII$ @M9)ÈIÀ®uS!b<<òS6W"(à‘¦Êƒ³‹»Ádéî̗'züåéw«È—VägP<gÃÜzò_ /QŽ„6 JÞlClîBZG-­ƒ–ŽÖÁC÷Þ<;ÔN ;Ð1¯ƒ15íÉDj‚j§uŠÚ‰ ¨Ý9O@ë¡dgmqhS”Í_™rhÜhW†úÿ/Q• +endstream +endobj +6508 0 obj << +/Type /Page +/Contents 6509 0 R +/Resources 6507 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6357 0 R +/Annots [ 6506 0 R ] +>> endobj +6506 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6510 0 obj << +/D [6508 0 R /XYZ 90 757.935 null] +>> endobj +6507 0 obj << +/Font << /F63 374 0 R /F65 376 0 R /F50 339 0 R /F72 471 0 R /F78 539 0 R /F8 504 0 R /F11 418 0 R /F7 505 0 R /F23 340 0 R /F31 472 0 R /F75 541 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6517 0 obj << +/Length 2265 +/Filter /FlateDecode +>> +stream +xÚµYÝsã¶÷_ÁÉCJõ"ü”“Î\Rǽ4—^}nûp¹ñð$Hâ„"’:Ÿ“ÉÿÞvIåÊéä ¹XìÇo‹%÷V÷n.¾¾»¸ü6R^ÊÒHFÞÝÒK¹G‚…Rxw ï/“Ád*8çþ›‰à~Vo²û7Éýªx\ëEÝŸ¨³úq6»©óÅý.uµU=™ÊûßYÓàôV/u=‰¯Ë¹žBÅʗa4y÷ÝÅõÝÅϤ➰R„1‹UèÍ7ïÞsoï¿ó8Siâ=XªHcá½½øçjòF‚#¡¼X*Æ£ÕzµD‘2~Ñu…³E>‘¡ÿ1o:ùs~ Â|YèÅ´¸ÄQ›ŸæzÛæUé®j×° >”Ìjىy`õ©HXÌSo*‹ãeü[eìý@ŒH¾¼l¶zÞ:Ò¯Àì4ëmïnæ„öð*${¼ÕVm£0( ·Äßèv]-|Èjm&©cü„²%d‡l“—šÖàÐɗ 䳬²r1\ÙÖj+ ’¡]/ÀLE;¦`…e84öžM¦JF~Þ6FgÐpµ×«ÙfsÝyv£ËV÷Ì +4íãVw]tn£7Y²bGÕò`m^¶Vö•&¸Ì+½4k~ä\Îs]v„g³î¿/tY)­µÂÐ~RÔý\±-ˆ[ô\DÜY9”ð—UQ †ór…¯Œ'̌ûÍ?5øžð!oi¤Û +<~(ˆ³Å ŒÙ|®"ÒÙ|³¶+h›#«"‰µ™a€áL ãÀZnªx`BL† š«T1¥$Å*½HãXgÚ9ÈB­bÜ;î÷ŽAÍå‹ýufòäG²[ jTõ¸T7¸O2t‚ +X^ Q~ä!G"!†³$:š b/bi¬ó=d2Š@R¤q X{š+ÈÆQìÏÌáwþ¤½l&cðÐÙ­$25 X*ý^œ‹1 ’‰86ΡÀ`q̍£X$:¸3b"™T&!i-Ø"ðRÙ´õnNNĀ4ŽÍê R¢®Gp$H‰Grdc Q¢WòYؘ*ÅO„ Á' ž‘ðIˆD©7 ºõŠLºä(“4ÿC”ØEœ'ÊSp=SJ&Ô³+?f² Hß_€Ï¤ôņ/ȧ‰Hôv"çØù¨LJÄç+n_–cÛ)à”„Î~t †@ ºgàà, ½xsga l MEÈÂ0&óÂQA k¼¿,oîmž6FD+¦%øՖ) £À›¦€<Ê8ój×"ŗ_âøٍÍùfJ9ßLWbFŸ]ê•pŸu¹(®º’ÅìC:~ÕSVß_ÚÖp(ڂҒ;´$ÓÒRV}}syŸãðU'³õÐ}OÚ©EäÓ)Nþ‚¿êًC³¸´Ñ‹¯ö‚Ц/pècċ 1ÚU—Æÿ<à:x ‚š™Û³ÞðüwVç–ï0³X¶¸œÁöˆ ÚB9`pÝpL{x•±ö“Ž9ûóÀðÓ_ô6^äöú0„Ö˜£Gõ¦?ah¿P’§ 4=Æío#[ë¢Ñ¿æ‡ö H›RȌeEK3úîÆûì„؇õ”¡B&¶¨åAܗ£µ¼kªÞ—Ýý¬¯—÷· ŒÆ3R©?Ì£~n’>{HDa—K! +Ã! +Z‰ô¯?!Š´G'X.^*=‡×/„:كìЖ”©rù@&{0ÌjWÝªm–—f=,ÿ Ý®ÝîÚÙs-í-|:kn)lÈ®)gIx–)^:fýúÿ2ë7Ɯ—²Ï1p¤(éÑ©`uÒÂ!d” +ž¯ +.—Š¥âœÅ®æéó(~˜ã֟0ýg­ fdJpªB ˜y»Æ'̬Óœã¥X l֘ðVÊÿ ‘bžAÔï +|°ùÅLìÅÑ|­Êå®!RD,’aFÙ[5rXVàŠ /öìåR$ƒËå±êà`Ý­°zY`¨$fa¬Üº¼^’ð„$5‚ý•Ï\&pÀkÀ˜’ÅiOn:ÂFjÓõ/jšèŸwØÇÂ^˜eñH¡^s§Z_‚эÇm9@•„˜P¦ÜKíB&©aøZo>t‘ër·1Iµ7È_«9¼)[|E‡” ’ ux1AÜ4pÀ¥ÏlDÎfw“8ðMUtlSÓ0ŠY$¶‡ÓJë›DO·`8KÓÈíàu:ƒ'’e:¼DÂR‰±J*_ýpýTãL/cÕâ”읏څԚ‡J9Miƒ©¹»¦$ԛIú/o_¾¾¾»¾}JºbcY8Sºý-{¤éå +Gü]áþñꇻ'M‡O~·É°’Áà&x Òk,èt»Õ¹iº`kZ²¬« IdzÛõŠšÜ·7Þ»Ï!áyË£=Ýî6t€B>Žj$¿Ý•ógÇ¢êcq¬Óo뢂š¿x°­|Ükì/ºÛ˜OŸ£"n,$’í3£QÕ4ÔàR/FÛ2,‘}wï]^ñ¨fjŒ¶ó÷£ESšÀYº™áV·»ºl’æ^ß®»Èk=ïì8Ò&ÚwLÆÒQ¥SO@8’3&$êo×UÝ®û¶ò²ÇÇ ŒxÌMGg­™ÍzŸö-úõs:†:·Áö¬,Ú÷±é×JsV5Íláö²›v1›AepÿcV€Y½²x*Q¤à +‘îE÷#ÇÜöÌHU÷×Õ¦2I¤Ú5øY‹³j¬ólºI ŸÂ¤—¾ãTkc[úŸ0Ü·ªóU^ö¹ñ‡ÎCžíõßuÀá·(µ“s»u¿Ûö­`BÕ ¶ÏqôØ%ºA6Ûáÿ]ÿɤ +¶×Y¹ÃR˜Uè7Õ>p& B ØÖDoµ&%Q³Ÿ¼nöw¼¡ìåPÁ)ÞûaݶÛÙååÃÛ7lWæۚåíåv[\ƒeÀ;î™ô—ÓMÕUdƒ?VGöÿ/øP– +endstream +endobj +6516 0 obj << +/Type /Page +/Contents 6517 0 R +/Resources 6515 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6523 0 R +/Annots [ 6511 0 R 6512 0 R 6513 0 R 6514 0 R ] +>> endobj +6511 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.445 227.366 329.35 238.27] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_55b76ba0041601d8da38ab5ad619eed5) >> +>> endobj +6512 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.558 136.271 211.623 147.175] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6513 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [212.121 136.271 438.779 147.175] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_edf9116549ffcced7a39f4596e65e5d0) >> +>> endobj +6514 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6518 0 obj << +/D [6516 0 R /XYZ 90 757.935 null] +>> endobj +6519 0 obj << +/D [6516 0 R /XYZ 90 380.291 null] +>> endobj +5246 0 obj << +/D [6516 0 R /XYZ 90 357.98 null] +>> endobj +6520 0 obj << +/D [6516 0 R /XYZ 90 357.98 null] +>> endobj +6395 0 obj << +/D [6516 0 R /XYZ 107.713 283.02 null] +>> endobj +6396 0 obj << +/D [6516 0 R /XYZ 107.713 268.628 null] +>> endobj +6397 0 obj << +/D [6516 0 R /XYZ 107.713 254.236 null] +>> endobj +6521 0 obj << +/D [6516 0 R /XYZ 90 214.489 null] +>> endobj +6486 0 obj << +/D [6516 0 R /XYZ 90 192.177 null] +>> endobj +6522 0 obj << +/D [6516 0 R /XYZ 90 192.177 null] +>> endobj +6487 0 obj << +/D [6516 0 R /XYZ 90 89.441 null] +>> endobj +6515 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R /F8 504 0 R /F11 418 0 R /F7 505 0 R /F10 473 0 R /F13 540 0 R /F72 471 0 R /F95 1788 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6539 0 obj << +/Length 1471 +/Filter /FlateDecode +>> +stream +xÚíX[›F~÷¯à))υ¤¾$JVJS)M¶}Ù¬VČר68Àîfóë{æÂŘõz«´ªXy3֘CÝe ¼(›õĘ(²pzê¤_ '0æ#Ήº •2l÷˝cºÑGNk^_ßl¡ôÚèôïò€¬íò ú£ áfÓØ·º]éæFÕOB¯;˜Ä¡: æb“±…>ópZ#mNú¹…6¡Ùáþ8!£&¥Žuî«Í} ¸eCc$4s9 +Œ‰Nz—Ê´³NFpo#ŒtEX«·ìS©›,Iò"±›n€ ie§1Jeo²’#ÙQø|]•º»ÂÂ1_M %¤à*ÇÁ2ЙÜi›šÐÜ9!¬5…¸„GûžËö\æ_듻2/š'›.{Ðt#=fº8~Ôtæû=š.?jºIúgÚL¤MŠñ£Ûu`1‚#z”9ÀÅ(ù)àqB÷Ý`觘>⧰àÉ~zpM’ èö7 žd¨°Î*Hè?d¨ü‡¡þ¯ 5”?õaGm÷æOóŒyÅôÄýü>I…½ý@G–Ã;ÛR4Lþ¤†|ž~ÚLz‹A»&ÜNU› ~ï#&x§LãŽ@aØtV2å Ò¸ß ;·å˜ÝnB%0C´ß?Ý>æ(¹Û÷Ñ}û„¹’¾j̦öÞݧYçõÄ­(C½Á'I)p®aôÒ±HÓÍ|›ù˜E¦´¨|±‡“s‘ Þ=¦Æp`|ÈGëºR©Ù²Û¦.…ҝQŸo´°›?˽¬„_ïÒ¥K0Ë¡`ûœ:L²1 µÜ uó›ŽÞ›  ÜtNá‰3ŽZÈçÛÝFé‰(÷ö`U•Û#¾ÀÍK@îDcB0&IÚ,F¸Ia hrô^ŽÿˊÆ-Ëu˜Û¼nßav¶wT€Ýï%Ž*[z‚eÖ9ûd&!Ç(æâÙ ßP64çCöËÆÐ¥÷Zf\š|‹–ñ`2¶óÔ~i´Oþq„X$þ[v'ÆïÛA $‰O}Ýn^³CìpXì^³s‰8Û8üv¹ºÃ6a{貶¿×ªú)àÜw-ü5-ŒÆ¶´•US}#m—vK0gÀÙJ¹"mezí¯_ff²}¾f¸ƒÌºivÉbqww‡–5º)ò]…òf±Ûm‡°DtÔYµݖ•+?/àä6Ռ8èÿ_7| +endstream +endobj +6538 0 obj << +/Type /Page +/Contents 6539 0 R +/Resources 6537 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6523 0 R +/Annots [ 6524 0 R 6525 0 R 6526 0 R 6527 0 R 6528 0 R 6529 0 R 6530 0 R 6531 0 R 6532 0 R 6533 0 R 6534 0 R 6535 0 R 6536 0 R ] +>> endobj +6524 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.118 660.753 217.183 671.657] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6525 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [220.461 660.753 330.896 671.657] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_c061731c4fec7f60c48e02ed9806b4bb) >> +>> endobj +6526 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [358.522 660.753 435.772 671.657] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6527 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [316.086 631.174 422.655 642.078] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_6f8cd8fbee64faaa5e47c8e41ba7662e) >> +>> endobj +6528 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [439.486 631.174 511.506 642.078] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_66438955854cf73ddaf27a40a69fec7b) >> +>> endobj +6529 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.579 472.298 216.644 483.202] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6530 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [219.653 472.298 331.771 483.202] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_065895a1428f9dc6b3002818686eff0f) >> +>> endobj +6531 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [359.128 472.298 436.378 483.202] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6532 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [316.086 442.718 422.655 453.622] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_6f8cd8fbee64faaa5e47c8e41ba7662e) >> +>> endobj +6533 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [439.486 442.718 511.506 453.622] +/Subtype /Link +/A << /S /GoTo /D (namespaceParma__Polyhedra__Library_66438955854cf73ddaf27a40a69fec7b) >> +>> endobj +6534 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.445 230.278 329.35 241.182] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_fceefab91d648d188e42e5a75a3a977e) >> +>> endobj +6535 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.445 97.315 329.35 108.219] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator_eff190ba56f86d3425859043689d499a) >> +>> endobj +6536 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6540 0 obj << +/D [6538 0 R /XYZ 90 757.935 null] +>> endobj +6541 0 obj << +/D [6538 0 R /XYZ 90 733.028 null] +>> endobj +6488 0 obj << +/D [6538 0 R /XYZ 90 564.772 null] +>> endobj +6542 0 obj << +/D [6538 0 R /XYZ 90 550.202 null] +>> endobj +5270 0 obj << +/D [6538 0 R /XYZ 90 376.317 null] +>> endobj +6543 0 obj << +/D [6538 0 R /XYZ 90 361.747 null] +>> endobj +5285 0 obj << +/D [6538 0 R /XYZ 330.844 233.431 null] +>> endobj +6544 0 obj << +/D [6538 0 R /XYZ 90 216.704 null] +>> endobj +6442 0 obj << +/D [6538 0 R /XYZ 330.844 100.468 null] +>> endobj +6537 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6550 0 obj << +/Length 1651 +/Filter /FlateDecode +>> +stream +xÚíXێÛ6}÷W¨(ÐÊ@Íå]’‘H/»hÚ¢é®û´ ŠM¯…Ê’#Éq¶_ß!)ɒL;v[$/}±EŠÎå̙!±÷èaïfôÝltu-™¡HRé͖^„½@$(ñf ïÞ'Q1žŒ±ÿjL°ëøá՘b?OŸVjQÄ¿$o‹¸xšNoŠdñp£2UÄU^<Ü=••Z'T`ÿû4.Kûx«–ª“ÐWÙ\'AT„ã7³—£g£w#ºa]D€&¼ùztÿ{ ˜éaÄ¢ÐۙUkSÿ©w7ú}„OÚEÂRìíâˆ!YÛö6ÏSx$áÅfN§Iù ÞmýÙ{ómª²ê¡Êµ¼ ò_cçyVVµ|óùD› ºÂŠD­T+Ó:ê+½æê:;À‚søÐ|ðdWô,åÈzÄ,€½‰f50Ëî,Ÿ@´#€"’”ÛÏnUµ-²²–Þݟ1ÄÃvÿªØ*‡L*ǤY”,­q¶°y–>Ù'xe¾¦]G”ɽ˜9ôà( +ÛªUR~T ½ý¡"Qö¤„ˆË°R(«¹ 8pø1·óMKd" nÅ(äaíßa ë”XÅiï“ìюà yÒ +.7ñ\5o×*+híØF©,¯Ži‡Hô1ŠHÄû)Ô)a°œ'&häò¬˜çj Á£óDgC¹‹7Z5épùïw—ÛW.ÀRä<Ä;`nõ¢p·36mJ)„³3@H/á.©VA#Šù) +íaúrªö°9´€I$ϲ€\nÙ¾Zհˋä1Éâ´&ššTOc)ü&ƒÒ>ǼHá8S©"õeµ˜Nó²²=S UéæÀü囚@ö`N·´ hkà³g ÁLîÄÇv;dæP¶ä¥C:ƒÚ*:¤E¶1Rû%ãøN„s$÷1tրNÀ÷5 Š '’!í'È}acõÆÜ/¿m«Í¶gãx!ü³‹+t6ÅURêÛê()3!¸°ÔZ.¿1"PµnùpÄo´"Ύ×úIÍ3P®‚€õÝxT¹c,ìñ^9§°Ø …´µàT0'„Aø45Oâ4ùK¹Ú] FZé&7L¬§(<É&ê"Äzç„-Àž?·ãÎ1‚ÁAîè%.7SF€ZØÇ0@:A›¥—ìD —–Œ}€2AßùL#$‚èóœ]z[ôÏ.έ•ÇNÐî!)ÐêùÍ¢ŠApŒtB‘÷ Èðžë¾x®Ç¤ Eýz½Ä EŒ–—@¦ý°“nYÂà$^ŽÄGȐ B„£àßA’b é8Ú ®Ùþ¢“½ºÐs÷B¸Ûp»{!»Û!à‰ög­c­ìÖYÊ[dk¡ÃÓólpÿi£ŽoIDˆ¢=†\¡@FŸµ'j×]Ьmü{M°™Z6͂i×íQrihe鯗E¾,–yšæ¹»öNEßE¤jj®›{B}ýÃYàH4­ÚkJEÕýDö6›­V­Ÿ­¿¨¥ÓZ ƒ®= ?ÑÍ©34݃ċú Ö–×,òX$ ç…Õƒø}iáʑaýþ癋$PÀ[8vÙ“à +e{høÖE¶Q‡²ÁmÂOÙJIUցÓ×ÇÅc}|kB¨…8ˆ:Ž ÝßǀEt;1¼©–$<÷¢Ú\PƒUh€c/¨Ô1̔VåzØèm‡µòvðG©Š¯uîÕpù5ζͭŒ¦³÷Z”*Ê6åt9FT3ë³®§Tm¤µìO¯yúyd¢¹×—„Ðã¶:®ªj3½ºÚívh^¢m–l +”TW櫞ÛVÂQÐ +i)`7WšI“kCþÿçò>k +endstream +endobj +6549 0 obj << +/Type /Page +/Contents 6550 0 R +/Resources 6548 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6523 0 R +/Annots [ 6545 0 R 6547 0 R ] +>> endobj +6545 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [121.93 111.131 309.156 122.034] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +6547 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6551 0 obj << +/D [6549 0 R /XYZ 90 757.935 null] +>> endobj +6552 0 obj << +/D [6549 0 R /XYZ 90 733.028 null] +>> endobj +6485 0 obj << +/D [6549 0 R /XYZ 351.108 675.861 null] +>> endobj +6553 0 obj << +/D [6549 0 R /XYZ 90 659.134 null] +>> endobj +6554 0 obj << +/D [6549 0 R /XYZ 90 567.781 null] +>> endobj +6489 0 obj << +/D [6549 0 R /XYZ 90 545.469 null] +>> endobj +6555 0 obj << +/D [6549 0 R /XYZ 90 545.469 null] +>> endobj +6490 0 obj << +/D [6549 0 R /XYZ 90 496.228 null] +>> endobj +6556 0 obj << +/D [6549 0 R /XYZ 90 481.657 null] +>> endobj +6503 0 obj << +/D [6549 0 R /XYZ 90 434.453 null] +>> endobj +6557 0 obj << +/D [6549 0 R /XYZ 90 419.883 null] +>> endobj +6504 0 obj << +/D [6549 0 R /XYZ 90 372.679 null] +>> endobj +6558 0 obj << +/D [6549 0 R /XYZ 90 358.109 null] +>> endobj +6505 0 obj << +/D [6549 0 R /XYZ 90 310.905 null] +>> endobj +6559 0 obj << +/D [6549 0 R /XYZ 90 296.335 null] +>> endobj +1491 0 obj << +/D [6549 0 R /XYZ 90 197.942 null] +>> endobj +234 0 obj << +/D [6549 0 R /XYZ 90 191.342 null] +>> endobj +6548 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R /F11 418 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6591 0 obj << +/Length 1380 +/Filter /FlateDecode +>> +stream +xÚÝY[sâ6}çWø)µgb¡‹åK:}Øí6™n»Ó4¡OÉcŒB<56µM2üû~²dƒÁH“ö±Á²ttÎwEؘظê}ôú—.3¸Ô5F€ Ï%ˆSb ÆƝI¢Ü² Æؼ¶6Ã|¯-ŠÍ,Y<ŠqGy˜/..®òx<¼©ÈÃ2ˇ·‹¢S˦›?'aQ¨Ûñ r‹ø¦H#aٞ·”Ö÷Á×Þ/ƒÞ?=Ø°A*,ÜCãF4íÝ}ÇÆ~ÿj`Äßx®FM ‡2¸&ÆmïÏÞ¹/Êv¹ÚW…GÕ¢õ[ýKŽW^!.r˜oؔ"®Õk÷ØX}Ǹ³9PUÛS$ô|¢÷pS ‘ÛŽ²´(‡q©ÈiM²~í_zÔðˆëH €C ›8( ȧT‘)ç³7«9«_2©Ò“ÐßBu)V¤ÈÔujé;ùŠ”­™ ¾¨ã¯6 ’†SЮç£$ŽÔÌßÄtTC¹œ§Q {“l!½“c)C·®é%±ÜcŽáC¶lq;ýž‚ôE<„ó¤´–Êæó–¼°l܍¤Ìãd¬M>Ôj‰é¬\ìPä¶ðg×hÁØ}ß9*Õ¾w}{¾®‰Î&¯ÒA»Áç’ËG¡©ÓI"Ê,Ýd —aœÂÍ|š,¶qÀØù +pD}àªÅ'jH $G`½úù¡Â1Ä°w嶊fŽã©H ðÒa¹˜‰®÷aÄ{)ö&·hipwÉæ;ÈñI- íq^¯…¨ø!}nÇ|g“â-1ðÜb°™Bk¶°W¢¡E1O¾ú—t5+ùÈqƒZÌ{Ì°¼µNãªGIÊ(o[ÿqzn5³³Ýæ•ÍÔ ?ÄDo‰5ŸŠ"ž¤t¢–З1äÄü[y*fa$†­Ø¶Õ —¥ÈkéºåÆEGԦЪà•a›yˆ3÷=µzOUÇóî?a~ŒzóFLu]_§Î$YÓaW–|È-‡›ÙôÅW6rp˜ê¡eQ·ņÚkFRfꊏà` §…ÈË\ÀþZ¬™M¸Mwq(ò²‡·x/y ·k& +—I{‹kïSû¹Ù·$>¯7UŃ‹¦oVMç˞±†Ôej5izH*ÄXŒ38Yô]-.‘dk%°³ánûÛ^†ÿÍî ëâq/ø¯Z— h;>¸q¯Aø˜F¶ÌŠqW³è2D‚¦œt-E0,õQmÎõ¹6:¾ÛèFY–ì68ՙ©ìôÚeç¦ #š¿[ q/ +_s×Ô-ËxàQ‡ý]Ô}J´ã1ÔZ¦ÙûýµG8Ecû”ο›·¨<Õ$>aƒáTÞ±•³²ƒÕц瘳 "‹v9GžNíz\*J×¥zÒ!4‚çjtm"-õ)€Ùú‘Äz“i¦—­éGyïš ËŸãBH(çê7> endobj +6546 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 698.25 192.544 708.178] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator) >> +>> endobj +6560 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 616.587 213.297 627.491] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_6c21214d11e4dc9738dad1f72501a286) >> +>> endobj +6561 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 577.786 213.297 588.69] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_642db539e09ba9a9746d490390097d73) >> +>> endobj +6562 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.634 577.786 305.699 588.69] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6563 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 538.984 213.297 549.888] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_72f8cca084e83cace83223ea0ea42bca) >> +>> endobj +6564 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.112 538.984 282.755 549.888] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +6565 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 500.182 213.297 511.086] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_998804f094e131a7f06d05c6e9eb5f5c) >> +>> endobj +6566 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.634 500.182 340.02 511.086] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +6567 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 461.38 221.045 472.284] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_8f29bc3aa01b8f5c67a3323189f9cf9e) >> +>> endobj +6568 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 422.579 213.297 433.483] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +6569 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [224.036 422.579 264.843 433.483] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_8a0c95f43fd48c07a63db5efa3564769) >> +>> endobj +6570 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [292.18 422.579 391.566 433.483] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +6571 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 383.777 179.554 394.681] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +6572 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.052 383.777 250.666 394.681] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_c485f37c083be7bc0238a3f5c6c112e3) >> +>> endobj +6573 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 345.349 155.265 355.879] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_023dc725ab60578fb2161f06211fa023) >> +>> endobj +6574 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 306.174 158.044 317.077] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_465d046e2570dea82e57ab6af9b179e9) >> +>> endobj +6575 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.382 306.174 250.447 317.077] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6576 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 267.372 199.947 278.276] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_2d0bc3adc78e64aafdab0dd9a292db1f) >> +>> endobj +6577 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.763 267.372 268.828 278.276] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6578 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 228.57 199.947 239.474] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_a2e9eec4ddeaf5dca3afa1976d36b703) >> +>> endobj +6579 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.763 228.57 303.149 239.474] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +6580 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 189.768 161.013 200.672] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_9e847f0bfafeac6438cecb2d2114e665) >> +>> endobj +6581 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.185 150.967 195.165 161.871] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_ce4c05e99016850c16c2bdaff5914afd) >> +>> endobj +6582 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.492 136.372 224.161 146.277] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator) >> +>> endobj +6583 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.215 126.081 209.885 135.319] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator) >> +>> endobj +6584 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.185 101.58 187.563 112.11] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_bba3cc93433c6564ba34c1fdd360bde9) >> +>> endobj +6585 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.482 86.612 271.151 96.517] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator) >> +>> endobj +6588 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6592 0 obj << +/D [6590 0 R /XYZ 90 757.935 null] +>> endobj +6593 0 obj << +/D [6590 0 R /XYZ 90 716.221 null] +>> endobj +6594 0 obj << +/D [6590 0 R /XYZ 90 635.535 null] +>> endobj +6595 0 obj << +/D [6590 0 R /XYZ 90 635.535 null] +>> endobj +6596 0 obj << +/D [6590 0 R /XYZ 90 596.853 null] +>> endobj +6597 0 obj << +/D [6590 0 R /XYZ 90 558.051 null] +>> endobj +6598 0 obj << +/D [6590 0 R /XYZ 90 519.249 null] +>> endobj +6599 0 obj << +/D [6590 0 R /XYZ 90 480.447 null] +>> endobj +6600 0 obj << +/D [6590 0 R /XYZ 90 441.646 null] +>> endobj +6601 0 obj << +/D [6590 0 R /XYZ 90 402.844 null] +>> endobj +6602 0 obj << +/D [6590 0 R /XYZ 90 364.042 null] +>> endobj +6603 0 obj << +/D [6590 0 R /XYZ 90 286.439 null] +>> endobj +6604 0 obj << +/D [6590 0 R /XYZ 90 247.637 null] +>> endobj +6605 0 obj << +/D [6590 0 R /XYZ 90 208.835 null] +>> endobj +6606 0 obj << +/D [6590 0 R /XYZ 90 170.034 null] +>> endobj +6607 0 obj << +/D [6590 0 R /XYZ 90 120.273 null] +>> endobj +6589 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F23 340 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6636 0 obj << +/Length 1513 +/Filter /FlateDecode +>> +stream +xÚÕYKsÛ6¾ëWð”J3 €ž\ÚLãIšLÝ؝’ &! ¾BQÔ_ß%RS²¥ÊvzФ°‹ÝoX,°ukaëbôëõèìµk[ +\êZ×3+À–çÄ(±®cëã˜DÙdJ0ÆãË Ác^¦<¼œP<Γå\Ä%ßɛ’—Ëóó‹RÆá…ÈDÉ«¼ ¯–ªédJ¿J¸RzøAÌD9!þXd‘˜L=†ÔœÏ×oG¿]¾ŽȆ-ÒÊÂ<äÙ̊ÒÑÇÏ؊áû[ #;ð­E;+µjÃ3±®FŽ°Ñk׳՗á5} v‘cû–G0"¾QúqVô<å­ìÃÅÈú8eI,S‘)™gaµ,Äý4þY†e>¡l¼PæÿO˜aøV”gªÚb¬Ÿg¯=jù ‰ë4šPŠ\‡ZSâ ßóµ"DU—™Á½š‹I'À X ç3ý,'ç 3µᶱvcË aãƞͻZ &³-¶ª57”u%óúÓNhj#ßqž +ý‚—<•( ïPüA¤çV¬éÿ=ʉÌď°–æ‰15Þäyb¾ïÀkÎUXä2«ž +0 ‡ÌÏÖfې!Ób=¯*k¡'m²´lÝ$i°åYlÀΒ¥Áx¦©ƒ`ÚñðêOÛr8ÈÅ~/Æ\ª{Å@*.;/È3cÕÜx@ +Û›¯åÃlM…]È>•±¥ +Åך'a•ï²öºwpÞlø½Xþ ¾s×Abž{*7úã÷Gίæ"j +½/ªiîI²•@!£:xü—’7)LÏZ:Å+ µ¦"~¼4û­­Je¼6®")øN‹G†ïïRVݖ3èk6LvƒÎ—TŸŸG¢,‡|#·Ï›Ül_¿\½zó¦«Þ¨ ýPàåwžõàÝ@ |ä°à‘gԆ´Ê¼§5n s®ªRps4y¡NTmjð8=äRú,†ö`hzdÞó䁓h;Û§°sQÂ.þȇ§Ë²«Ç¶0¥"0:¦ÛԠˈÿàQ+™Ýp#º^¿`^èÚÁ¨è¯Ko#l÷nóòåÀ‚•½ÚóŒ| Ɓ÷0¸'ÔQŸä<Þõr êôw°Vé.ÏôÑ9òÇÞïµ7â8vñîÒÁxŸqòðw£7rZŽ¸ŽD¬¿Ü,÷ÀÔ«d¹‘Ûµxú„0ºF­ßwëò*1/6vQp’ºnj»9˜€10 + ¯iÜ¢H—ø1x=@wœÚï©X=o=†:í¨:Š„R³:ùyH  +È^×OÔ ç{ÂØwŸ·n¢¶‹|ÆNY«EÛÃßYï¤>¸Ýp¤É¯¼¬¹"§9°läô…¬æŒÔáÁklÝ«L aP{ùÖ´)­cÌ«f?´^Ö7I7~/V Ì×u5Eþf°m_cè[Œæ¸Ì¿§(½è^?9¦ç›òï¡*x$žzo~8iR€ÅeZ›Ú®•b²©ˆiJ<´§Ö]zìqô¨;ŸÍ¡JŽÙ»èm¨5OyX¨ËLV’'M²<¥Œs½é¹o["jnúö±}ËçÂZpÊyà%_w‰E¥>¯/-Y€3^w¢\¶V,Sn^»Kýj®-õË_J”?5•£Qç=Ïꮲh°úÖ°åʓ0‚”6šZóJt@k;XÝè÷Q›^VòßC6îw…yUçgg‹ÅE +ՙ,J$«³¢HÎîÆü°‡×3™­µ»ûí>¦m‡`Ó€ÿ¿Mx9l +endstream +endobj +6635 0 obj << +/Type /Page +/Contents 6636 0 R +/Resources 6634 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6523 0 R +/Annots [ 6586 0 R 6587 0 R 6609 0 R 6610 0 R 6611 0 R 6612 0 R 6613 0 R 6614 0 R 6615 0 R 6616 0 R 6617 0 R 6618 0 R 6619 0 R 6620 0 R 6621 0 R 6622 0 R 6623 0 R 6624 0 R 6625 0 R 6626 0 R 6627 0 R 6628 0 R 6629 0 R 6630 0 R 6631 0 R 6633 0 R ] +>> endobj +6586 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 707.027 179.554 717.931] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +6587 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.052 707.027 223.857 717.931] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_a09a1ddc7936a5377e838cb44610548e) >> +>> endobj +6609 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 668.306 179.554 679.21] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +6610 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.052 668.306 248.444 679.21] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_c53b2bea17ae404e291cbcb7033dbaf2) >> +>> endobj +6611 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 629.585 179.554 640.489] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +6612 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.052 629.585 223.558 640.489] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_102ffa79248502b4998a70fba5f13d98) >> +>> endobj +6613 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 590.864 178.727 601.768] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_8cf170e729ac4e4576624d6ed7d4b44d) >> +>> endobj +6614 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 552.143 182.044 563.047] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_494a5dcf815a292978b1864d2d7f77ae) >> +>> endobj +6615 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [209.381 552.143 308.768 563.047] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +6616 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 513.795 150.493 524.326] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_6a5f64baba3ae5704d9645db684434d3) >> +>> endobj +6617 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 474.701 181.845 485.605] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_c5764ede75697ec70757c5e208945ca2) >> +>> endobj +6618 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 435.98 181.845 446.884] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_3ddc697f9236b117382c35d7f7da5419) >> +>> endobj +6619 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 397.259 154.727 408.162] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_dfc60b971ed974350d241482f15f46ac) >> +>> endobj +6620 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 358.911 176.505 369.441] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_63fd965105d740ff7003037964ec7d10) >> +>> endobj +6621 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.408 343.983 450.955 353.888] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_3ddc697f9236b117382c35d7f7da5419) >> +>> endobj +6622 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 308.857 191.718 319.761] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +6623 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 308.857 288.852 319.761] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1f0983add75d3a9c3663fbf925739212) >> +>> endobj +6624 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 270.136 191.718 281.04] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +6625 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 270.136 303.079 281.04] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_4254da492e5eeb1c12d8d87b997cd229) >> +>> endobj +6626 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 231.415 156.281 242.319] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_a8e33c8dd37c45144bf92a6984c7706a) >> +>> endobj +6627 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.097 231.415 259.483 242.319] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +6628 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 150.846 203.075 161.75] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +6629 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.573 150.846 296.324 161.75] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_8530a0719104225bd022dbe9529ae527) >> +>> endobj +6630 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.005 136.292 367.019 146.197] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +6631 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.437 112.498 194.297 123.029] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_62e7b71f72659356d1d732236ed5f330) >> +>> endobj +6633 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6637 0 obj << +/D [6635 0 R /XYZ 90 757.935 null] +>> endobj +6638 0 obj << +/D [6635 0 R /XYZ 90 726.054 null] +>> endobj +6639 0 obj << +/D [6635 0 R /XYZ 90 687.333 null] +>> endobj +6640 0 obj << +/D [6635 0 R /XYZ 90 648.612 null] +>> endobj +6641 0 obj << +/D [6635 0 R /XYZ 90 609.891 null] +>> endobj +6642 0 obj << +/D [6635 0 R /XYZ 90 571.17 null] +>> endobj +6643 0 obj << +/D [6635 0 R /XYZ 90 493.727 null] +>> endobj +6644 0 obj << +/D [6635 0 R /XYZ 90 455.006 null] +>> endobj +6645 0 obj << +/D [6635 0 R /XYZ 90 416.285 null] +>> endobj +6646 0 obj << +/D [6635 0 R /XYZ 90 327.884 null] +>> endobj +6647 0 obj << +/D [6635 0 R /XYZ 90 289.163 null] +>> endobj +6648 0 obj << +/D [6635 0 R /XYZ 90 250.442 null] +>> endobj +6649 0 obj << +/D [6635 0 R /XYZ 90 169.753 null] +>> endobj +6650 0 obj << +/D [6635 0 R /XYZ 90 169.753 null] +>> endobj +6651 0 obj << +/D [6635 0 R /XYZ 90 131.151 null] +>> endobj +6634 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R /F98 2120 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6668 0 obj << +/Length 2026 +/Filter /FlateDecode +>> +stream +xÚµXߓ㶠~ß¿BO©ÜÖ\R¿µMÒ$wÓ´iÓ½mûpÉìp-,9’|ÞÍ_€€dÉ+ûœ™ÜƒÇ¤‚øø(é=yÒ{{õ×»«ë7Ièå"O‚Ä»{ôr饉q ¼»Â{ï+%‚x±TRJÿû…’¾n6úþûE ýº|Y›¢Ñ÷ÿ°n^nnÞ6¶¸k*Óè®nîß½´Ù,–A,ý¯Jݶ4¼5¦Y¨Ì7ÕÊ,–ià Q‹ï¾½úæîêç+¶IO9[âT¤aì­6Wï”^Ï¿õ¤óÌÛ;©!ü—Þ»«_IöKŽý‹åÈ?%…™—¡ILNþ€¸}¿Î{¿ŒÁá¶Ó]‘՜˶`9´¯ybCoÝ +”úAÊ Ò¥ýÅ룷±„Ÿš¼ëÿ¯ß¤—¡I„†H¢À[ªHä2 ;ß,¢Ø·¤ŸƒÙ­ V`1«ù°Ã$Ë~ E–ä—‡bUWmw>óH˜ Égçõübšú¾°›û]eA §ð Âzkº]S´µÕSiººâéÌ€NÛ +h^WåË¥ñX¨ØǘÜ܀oxžä߶¶U7ë(Nx6ÉÜe˜ ™yË(J% ˜Æšªh'ˏ‚òÁ!ˆÎƒà¡®Ëó~Ö[:ñ/¾8uP¿+xžÿü ùò{` –ÃùÄ#éP +•L’\×ì MU†Êo/dÉ=]# ¹¼z½E”Š N•W?ÏèOᐃ^Õ¾V¢b‘äƒ /'” ºY„©Ï9c SA™ÐåeˆU©‚êžL1{kJÝvøÍ®Zu¶î:A®ÐF"ìk8`ëŸugú,ÖݐÏ-?Ô ªš_nÌæ²Ðû­Äë’$Q}¬R77uÛ5Fs¹ø천!•št+ŒìóÏÏfr*ò,ïe13¦´Ÿ"cžÚKSf™g"ŠòiÎük×mw|"Œ¾D.”Rþ§kiïè*Èc¿Ý;Ú³=Vá^b”O®GÂ3aº”,Ím‚eqœÌn´Ä5ú(Áp+‘Çœ)¿Í‚ßVáXUòñ†´ß»­YYæ,35+€®•ö¨uˆm÷í#Ýø¢|_Xa‚\ÄÙQ…qœV(fµ_èåe_p¾6íª±[,§KNÄÈúò55¨¹d?AlyÔ˜ØêPé¡×~ ü" s¿~øɬ:?âF\8rw(rÑa¢ mI¹&Õ½ñ‡}s6ލã¡n„‰ò­0‚‡šôlveg[ÓMU;íà1âÃïB”‡Ì´òècÞ¡ìÔ»W ÌÄÒVÆ*#«½1iZڍz(ì昖+Xb°Èýÿ­ME¯l՚¦#ZKÎÓÜV¬Š¤)r¼]»Õ+3ñ–³ ȝ©Z×–T܄dàë]Wo´ë–®©ã»â§]K½ښžr/Ã%eÙ?b%á…3ž³€:`s¼uaÜ=…6R~ýjDŽ}ÀÂI1?öÍ9 QÄj +¹ªð';,¨¨‡“šFçûµ]­IÈò£ÑUGî¦ÿÞ\Ôô°ª«¥Ùl»ÖÌ{D€Ç–×ÛjUî +CÝÑëÒèv¤Y]ÍšÃÈ ˆdG%K|袭 U–:kñŸÏF{4$¨Á`À lÈï*cø¥¦¿v·ÝÖ=èp nMÃÒ´?“?\ƒõ‘'…m s$7‡˜–óN3bB&ú`2è;➅…;`…ç=Wx‘}¤ +*˜ˆ˜¿ü­Wá`;¾[„Õ³ÞlËþk¹ÿ[žCEØmú¢|`sð¨«ÊQ7q ,QQàI ǎ˜ÍQàɝ(KÓ# +|FIÏ+Çyå|`fY—e†ïۛS]+V§R‹Qȋ±æ"`’ô_öz±L ۞î®ø—þ¨s0)š“Åæ-Õ {²W™ÒÈu¸Xñ®ßÐ!‘ê,ûÌàüÅàî¨}…£8˜‡!Ôüºà—}ÐZšrϋ\BÑ£µF¦ö×ŽD¨N9%ÐâT·$ÐAâ­Í ±²xht'p›Vô³eû0˜}Œ£ƒ-èDã*}¥›Î´V;ÍÅG4 U:ZE¸gºŽ­ åã¹eNä%€¸¸›˜Êc/‰b¥ÁŒ#QÀ‘Ôe( Ëåù„'>ð!ʞÚ9$>µ‚š*† kô=+NžiٟèϑhOÁVqŒ(aζþѽ‰DšÞè±c¤¦¯*þŸ§˜IˆJ"Zx€2иN!s_?ÔX‡¨Çáyˆ-ÛËõL2«g“þÏWuӘv[ã7'àZª®hÞw(\ Þ»M"ÿÁ¬ôo¥nɚ xX½Ö¬®buÐ$–ó}Š;R.×9°§©·È ÀÓóQû„Ù9Ú7öæTvŠÚð³ƒÇ,S÷²si¢±aþ‘4KÕ8͘]î{꫙ 뢘l…Ó•jJ.J ]u .`L7(ß•ÇßüêÆ>ÙjÊäśTvMLÆIuü!;{ŒÊ.ýŽÝ·>d:¨ˆ19¢QiÅ­‡›OûëMùªG“ÿ€ÇXıÏƧ«æΌIyдCë—BI0SáüÎôŸµÉ³ÿ{ýèïT=öb#_.Ö]·½¹¾Þï÷bՊ]e·°Ýõv[^¿n*#-pL%5ªÙÔ}ǵ> endobj +6632 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.437 720.286 188.759 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_864a52992178820135a7ae3a75e65377) >> +>> endobj +6652 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.953 681.141 260.339 692.045] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +6653 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [271.079 681.141 333.146 692.045] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_90e26e60ccfbe3c6ab8d91b5bf06dab5) >> +>> endobj +6654 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [290.965 666.562 419.427 676.467] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator_f00dd6aeffc847b73a3aee11d6d169b6) >> +>> endobj +6655 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 600.499 180.54 611.403] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_e64d3d01d4baab5102f00046f941188f) >> +>> endobj +6656 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.877 600.499 307.263 611.403] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +6657 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [348.996 600.499 448.383 611.403] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +6658 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.349 492.703 226.034 503.607] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_8e247a33c9eb40439c706a98c5d363d0) >> +>> endobj +6659 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.176 492.703 420.562 503.607] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +6660 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.325 453.932 166.691 464.836] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_d85c523fefc56e289bd9fdf878bb339a) >> +>> endobj +6661 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.917 453.932 391.386 464.836] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +6662 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.021 453.932 513.996 464.836] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +6674 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 441.977 248.713 452.881] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +6663 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [182.243 341.985 281.629 352.889] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +6664 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.609 330.029 202.675 340.933] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6665 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6669 0 obj << +/D [6667 0 R /XYZ 90 757.935 null] +>> endobj +6670 0 obj << +/D [6667 0 R /XYZ 90 733.028 null] +>> endobj +6671 0 obj << +/D [6667 0 R /XYZ 90 700.193 null] +>> endobj +6672 0 obj << +/D [6667 0 R /XYZ 90 619.431 null] +>> endobj +6673 0 obj << +/D [6667 0 R /XYZ 90 538.789 null] +>> endobj +6675 0 obj << +/D [6667 0 R /XYZ 90 404.736 null] +>> endobj +6666 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F11 418 0 R /F31 472 0 R /F7 505 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6682 0 obj << +/Length 2221 +/Filter /FlateDecode +>> +stream +xÚÕYÝsã¶÷_Á·JÍ ÆIöô¡é$7MÛL’sŸ’Ì -B2[ŠTHêlÿ÷ÝÅ?DK:ß]Ú>h.€ÅbûÃî‚ۀo¯¾¾»ºþ6AJҘÇÁÝ&Hi cF"΂»<øyÁáÑrÅ(¥‹–Œ.²f—½ÿaÉé¢.ŸTÞdïÿ^Ü7Yó|só¶)ò÷oU¥š¬«›÷ïžÛNí–+ÑÅ_ʬmMó'µQ͒% U­Õr%hò˜/½ûî꛻«ß®ÈF¦e‰$‘" +Ö»«Ÿ¥AôïJDšzÔ.¹€ÿ2xwõãµûšþ›}F$©¤ ÷ɘ$\&ä‚Pèћݶ¤¨ZÕt¿Ðˆnq3ûº¨ôEñF#Âi¬ˆšIÔ=!‘ ä§å*}eþÌtX+eì’ÙÏ°&Ãß-ö_сV,LA ÎfÆ»BkÜî3×̋ªÚ¢®¬î³Ævd‡®Þe]±ÎÊòْòÀ`ùóÙ=Ø¡›º,ë%Eµ5¤uÛÎú¾Ë +ÇÝOi³m© Îܨuw£ <µÌÄ,)‰bToB¢ð56‰æµjÉO§µÊ`õˆ[­Úóÿ×j¹,‚W]“µ(G¾(6†ü¨ÌÿC–›F–çÊ6µ6°1Q a—+ËʱxDïªeî8¢}XBÓÈÕ/”òÊ°™¡–Eeû÷YÆT¥]½î¥Ð›…ƒ×oV$”„4ØÃz¬„$B¸ÙSÑj®D’.$ª‹¤‘Ul÷ÐԇíÃähCÎɀ±d„qÏÙr"!,ÅnÐí1—„“`™aæí‚qÝÆq/Z3whö€Gzì¶BážmWÏBo’Ò—6i‘0A\ÕY*6QJžÄsØMŽÛå îT1Ñ"4¦·ž–ÛÎÑm€³œáñ8WºTa>Q’Ö0Ø4õn²L/§¿6æ¶cî™Ö„.€*ƒÈ2$4ôã¶‰ªdr¡¡@÷3lX ªìÙ°9>€ßÂ/uY6(!§|ÒGÿGH6šs¢Rêìø#EŸ** czâVÉ*>MVúe½äаùSÃÎ^dp¶“ä÷·E(@L>97ìÜÁyå_ šaçÎÿp„0—4DGñ0iÇIƒôׄœ$ Ò$ r4@[‡Ír’4ÈIҀã*ËÓ^ØD$7 ÃÞ[ÂÉ1N(¤N(f.ŸøRɨæs”.ô•˜²P¾ðsœU3žBŠ?-ێË')õ¡¯fX`Ë_Ÿ@Æޗ1þ„›Lfk™xu%~¥¢š©ˆ0Jx‘ž,šÆƒ’ÈùzhBIÂñùƒæÎÏçÌvاùû²ÙÎØ+ï•Õgõ<€a°Š7„ €oΡ‚©üÐÈ&Þßãè@¸›È§ÚA¹Í˜[Õ¢v} Žë©Žl‘n'Ù:úQwÁR(|pÎ]ƍª¶ó`ðhÒsï¿(—uØýðµ%Ô¶´ž ˆž²u7÷ +åƎðd]ï1Ƙ]r‹p %ÜŠNz°¡ãqèjT×&)Ñ%ßübûHMÀ8³ñò¹º*-ëYñ9„1/ýo‡âCVªjNü0$"ñðaí×3Šñz¼æó,j„!ÌËŸev_B⢃‡’„i:VÍ£5BfSl‹Êáëè`q%³ïœã—5¤Ü+U¹ +vÝè4æûÞÕ8ÐjÑÑïŠMð6›–vòþ„„¥ó’9vù¡Ê32Ì.¡ºõ8ðŸ¾Ç xgré¸~ê›ô( ,",q†Ã‹6ÒÏù‘~ηŸî=ß|ÚG}óñOð½?,£hauù¬:8=£6Œz|h¶•c‚à»$˜tÒÅ;¥ì&ÍÎþ¸Öß ¾÷ò²DAý½ñÐuû›ëëÇÇG²nÉ¡*ö )ºëý¾¼>F“ÈѤg²qØÕ}õ ˆ;]ú;ÒÿæIL +endstream +endobj +6681 0 obj << +/Type /Page +/Contents 6682 0 R +/Resources 6680 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6684 0 R +/Annots [ 6679 0 R ] +>> endobj +6679 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6683 0 obj << +/D [6681 0 R /XYZ 90 757.935 null] +>> endobj +6680 0 obj << +/Font << /F63 374 0 R /F65 376 0 R /F50 339 0 R /F11 418 0 R /F8 504 0 R /F7 505 0 R /F23 340 0 R /F31 472 0 R /F1 542 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6692 0 obj << +/Length 1947 +/Filter /FlateDecode +>> +stream +xÚÍXKsœF¾ï¯ rpv«²£yªøà8±ËŽ]v,¥r]*³°‘•_Ÿž³€Ø•¬Ê!'^ÃLO÷×_=8¸pðzñÓùâä•dAŒbIep¾ b„’ AIpžKB«5Á/?®^&Í6¹ü¸¢xYw7*k’ËwùU“4w§§¯›<»|­JÕ$]Õ\žÝµÚ®ÖTàåË"i[{ûImT³"ÑR•©Z­Ãn©d«/ço¿œ/þZ° ÄØ"B2¤ÛÅÅdðþm€‹£à֌Úœ2¸ÁÙâ·>º/Ê–b°/DÝÎÞ«íØdÌ{µ+Ó.¯Jûôs•î¶ªìó +L„ùה#ÆãÑDˆ¸©þÖNªò yLŸè³ÓÓ¼lUәIÈò38­Ê¶s“šÖ½5`A,ܶüDÖúgzÌÉ«X <œÃæ‡k;bä+Žâˆô`mbÇ<³–@"`õIÊíØ7Æhæ¼ì*û#M"ÌÙ~v̜âÝMÞÎX@%âØJì¢iUk‡ßÙ§jc¯Ý²7×Þ=÷׌9¢LNü2ZQ 8Œú?ô»L•´yy=YªÜí!ÕÛÑÖIê>g9 ªLõÞrCJ¥2•![ðm„$‹“]ˆßlæŒG„²c¶GˆÃn@îM4Èy¼LŠbýj*û¶Nšd«ºÞxØQ9ÜŒ¯ÊÂy8¤Š™¾vnØß®Qý¯Iç¾öšs†w×}Ü0&æÑÍS_8û +ˆfgÝÏ"ˆ¸Áø þÁþ)¼pøxx¡™¼Ôƒ°à`ðMͱ?•!òQøz ]£|JJ—÷–[‘å£W„ SêB1DîÝìҜ²ûeg4˜#¢Þ¾‹ ė9¦$Q.¾Açñˆ?‰}Jí™|3ώƒ–ð끶jPù²¹ýK¨Íž?WÀyèËÓ¤˜o ŽÙl+À|+àk£—œh‰áQjg'dh²¸ûÿøãŒZKP9ˆ=>´Ú}€õ0ùœ‘HǤ¯èfÎth9"@ïPïáë¹# ù’÷j˜%‘/Gz#7ôî«wƒ^ï~!–³ÎM®‹Ä sǀéø5;dáù3ªN½2š„pžãþ$’Kµ­»^·pˆõ‡^˜â%ÙZnÆZ¤e³ã’2¢û&Îê9Ñ +r¾Ó1èUq|_6~Ú.\—¹¶ÉØî–Ý7UQßtÁM«ôI‰.¶Ücf„ÂWŽ^¾sÇEß=¾pùÒµ?QŒÀŠö6©õ79÷Ô#Y=Ó\ª0HºïHSnHÌä 1r½!“ÀÓÞðۏg "cd¨O«K~–cY¼¦”AÃ4©LgµJ{á7Ó€Ä»ÉP£‰ÜŒÊb S™E0A„ŒÙã¼×wÙHšX¹UùÓºþ@+ݟ¸ßšè´#y9jcý¸©ŠÂ"ÞkK}S¨Ó± ƒÊÆè[@«ˆW>S*&bm-Äu] ››Ñ—éY¿ŒŒ\~äQ¿9âGJH:0Âñk¢|â./4Ýc@ûèPh~oUó½fdç«÷I¹KŠýiØßz*hD¼ß1"Q0×Ý)å6iwögÐßýº0ÙÛK"Àö¹éºúôääöö¥-ڕyÝ ¼;ǝŒÜ6Ù5Žý$ÛÊëˆ^n VÐÔÿÿõ^¯ +endstream +endobj +6691 0 obj << +/Type /Page +/Contents 6692 0 R +/Resources 6690 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6684 0 R +/Annots [ 6685 0 R 6697 0 R 6686 0 R 6687 0 R 6688 0 R 6689 0 R ] +>> endobj +6685 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [485.444 568.961 513.996 579.865] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6697 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 559.063 130.826 567.909] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6686 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.445 539.381 363.671 550.285] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_6b57cf93153051d3aa63c33e34ee4127) >> +>> endobj +6687 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [310.804 477.607 445.257 488.511] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_3ddc697f9236b117382c35d7f7da5419) >> +>> endobj +6688 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.445 418.448 363.671 429.352] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_37abf9e26c109cf608ec7829284883ec) >> +>> endobj +6689 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6693 0 obj << +/D [6691 0 R /XYZ 90 757.935 null] +>> endobj +6694 0 obj << +/D [6691 0 R /XYZ 90 733.028 null] +>> endobj +6608 0 obj << +/D [6691 0 R /XYZ 90 716.221 null] +>> endobj +6695 0 obj << +/D [6691 0 R /XYZ 90 716.221 null] +>> endobj +5425 0 obj << +/D [6691 0 R /XYZ 195.633 639.557 null] +>> endobj +6696 0 obj << +/D [6691 0 R /XYZ 90 622.83 null] +>> endobj +5426 0 obj << +/D [6691 0 R /XYZ 365.165 542.534 null] +>> endobj +6698 0 obj << +/D [6691 0 R /XYZ 90 525.807 null] +>> endobj +6699 0 obj << +/D [6691 0 R /XYZ 90 404.874 null] +>> endobj +6676 0 obj << +/D [6691 0 R /XYZ 90 382.562 null] +>> endobj +6700 0 obj << +/D [6691 0 R /XYZ 90 382.562 null] +>> endobj +6677 0 obj << +/D [6691 0 R /XYZ 90 333.321 null] +>> endobj +6701 0 obj << +/D [6691 0 R /XYZ 90 318.75 null] +>> endobj +6678 0 obj << +/D [6691 0 R /XYZ 121.143 244.124 null] +>> endobj +6702 0 obj << +/D [6691 0 R /XYZ 90 227.397 null] +>> endobj +1492 0 obj << +/D [6691 0 R /XYZ 90 129.004 null] +>> endobj +6690 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R /F11 418 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6721 0 obj << +/Length 1305 +/Filter /FlateDecode +>> +stream +xÚíXmoÛ6þî_¡bÀ&¡0ÍW½ۀlm‚v+æ%Þ§¤™¶µÉ’*ÉKýïw")Ù²']’®ö!±DÉ»çÞ[ [gƒŸ¦ƒÑ©Ë¬.u­éÜ +°å¹ J¬é̺´ AÔu†clO‚í°X…ׇb;K6K9+Âë_ã›",6ãñYÏ®Ïd*‹°ÊŠë‹MYÉÕxeiY]Ǖv†T`ûç$,Kýx.ç²pˆoË4’°ܦ.wÞOß^OtÅQº yLXÑjpù[3kaÄߺUR+‹S¿‰u1ø}€÷ìk!hc(e»âù eŒCÁ‹ùÈ܆îé]»¶ƒÔèTàw ›I”#Æ=é$ÕÀuÍ"ì¿ëҌ„ú§TÚ¡¹þ]€橱¢Dzd»?u=äRÒ7q%ë™Ñ”IÁ^ÀZðûžµÀs`Èó-—=ë0|˜fÄ~ìÃ$ð'ÔhƵà›t)‹¸RH4]Š…áÍùÙÀºTÆNjx´c{œzŸ?õҚQ°eƒëâÅ("V“õMGèwruÓxætFU «wÖܳ“¸ˆ3\O‘ð _®(9½¦ +àðQݕWX`ø#{ë5ºxÔòA—׺€.¯!çàWëòJÎÃuRi‹ÔvÅ:ª÷"„hpV½ÃÒa³<HŸ‘ç1UIí(»¾Ý<‹ß +‡yö,NIÍùfø„¨Ð£2:¥»”ôwÛcw…î9RõÑlÏîÓ2H Ñc8Ï J?1´ŸGˆ,×Â?|^™øzR–ñ"]ÉÔìPk£BÖgÂê86ݬ×ÐÁÕ ì°”pŒ‚šbv,4B,[aÃÆ­S‚ÿPH51Md••ë_U‘|UžØÃr¥€úá×èq7ÂGüéÚõÝFðÅÑ|Æ¡îáöƒ¢ðî¹y“Îbí°ÈœœÕN¶-e"¿ìhóòås$艆œN?šŠ1ôØböË¿F&N«Ç„Ú‰ãÃ.eõÅ s“eÉsÓ#“Ó§¸>fËj]èêUù[i†amùiÞܺKÂ]Á%Plî$aj®$Yš˜" +>©Ù¶³¹aÛÝi{zpäⶢ©–qy¯õö‡ëˆoA+³éY¥¾„´‘2Ô2ÚπGq&ŸFâ¹s÷©YóâÖ|¬™úÄ·Û +¤BwàݹxI@÷!/rȏ>Ûij bÚ¯dƉ4xAq^_C{nøóµÚ&ƒ¹4ŸÜÍg&î»íÆ6¸MI®ËÚÖú©Êõ%/´Êp2õ‡B†³¡fNýF‘¬ÛRµ¬šc2Œ–ú©Õ[ €"€gÚì§fTÎnþTÕÓµIÕsà եÒ`ì7%z›w’¢®©ë@"¦ƒðúc¸Êy´P󑇃šR ‡9»Ó¥¡ç> endobj +6703 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [121.93 646.367 369.479 657.271] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator) >> +>> endobj +6704 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 592.03 170.687 602.56] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_41cb3496510a68512516cf65f8d214c2) >> +>> endobj +6705 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 552.958 170.687 563.862] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_9af54d524de94ada872d460c1dbd5cc0) >> +>> endobj +6706 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 514.634 178.435 525.165] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_a82cf61e903a201fe8892501b209ab8e) >> +>> endobj +6707 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.426 475.563 222.233 486.467] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_9571074ab0249afc1e440c8c5eb5d429) >> +>> endobj +6708 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 436.866 202.497 447.77] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6709 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [213.237 436.866 253.406 447.77] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_61b27b2ed8bbc9a128f9001d160b078d) >> +>> endobj +6710 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 398.168 202.497 409.072] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6711 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.467 398.168 260.599 409.072] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_2be2c8b9d00f81fc24dcbc36ad05afea) >> +>> endobj +6712 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.426 359.471 227.852 370.375] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_a6e183ba7e931dc88e16fb9ecfa8b3c7) >> +>> endobj +6713 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.185 320.773 217.61 331.677] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_47def4dcb522c046a6f3a432d72008ed) >> +>> endobj +6714 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 282.076 180.54 292.98] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_ffa77e724493813cddf9740767c2473e) >> +>> endobj +6715 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 243.378 178.239 254.282] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_26673943182a6efc6cc6e3aad8c731a7) >> +>> endobj +6716 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [99.68 143.456 156.456 154.36] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator) >> +>> endobj +6717 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [485.444 143.456 513.996 154.36] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +6735 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 131.501 165.147 142.405] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +6718 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6722 0 obj << +/D [6720 0 R /XYZ 90 757.935 null] +>> endobj +238 0 obj << +/D [6720 0 R /XYZ 90 733.028 null] +>> endobj +6723 0 obj << +/D [6720 0 R /XYZ 90 610.551 null] +>> endobj +6724 0 obj << +/D [6720 0 R /XYZ 90 610.551 null] +>> endobj +6725 0 obj << +/D [6720 0 R /XYZ 90 571.973 null] +>> endobj +6726 0 obj << +/D [6720 0 R /XYZ 90 533.276 null] +>> endobj +6727 0 obj << +/D [6720 0 R /XYZ 90 494.578 null] +>> endobj +6728 0 obj << +/D [6720 0 R /XYZ 90 455.881 null] +>> endobj +6729 0 obj << +/D [6720 0 R /XYZ 90 417.183 null] +>> endobj +6730 0 obj << +/D [6720 0 R /XYZ 90 378.486 null] +>> endobj +6731 0 obj << +/D [6720 0 R /XYZ 90 339.788 null] +>> endobj +6732 0 obj << +/D [6720 0 R /XYZ 90 301.091 null] +>> endobj +6733 0 obj << +/D [6720 0 R /XYZ 90 262.393 null] +>> endobj +6734 0 obj << +/D [6720 0 R /XYZ 90 206.207 null] +>> endobj +6719 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R /F11 418 0 R /F72 471 0 R /F23 340 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6752 0 obj << +/Length 1438 +/Filter /FlateDecode +>> +stream +xÚíXێÛ6}÷W¨)JMMó"êân4i7AšÛ¬û” ­LÛBu«$×ðßw(R²¤•g³)òC–4$gæœ9C/&Ï“٥à ùuŒÅÚð±á:qJŒÅÊxg‚¨kM Æؼ²6ƒ" –WÅf¶bUË×Ñm‡ùü¥ë/Ÿ‹¢Šn0¦aP kJ96ŸÇAYª¿oÅZñL‘†ð–î;&u¸õ~ñjòûbòτ€cØ µ#ÜE.ãF˜LÞ½ÇÆ +ž¿20b¾gìk«Ä°)ƒkl\Oþœ`Ôðª‚䆋|$!.Då.eÛ:Ò0KËʚ:è‹"Z-_ˆTA•ËëCY‰ä±z·)Õõ}[ McXÞ`ŽáG~–áÀÚSَ­¦_g…!F˜Ïk–Q¥+ó¨¿\‰nÅ&J›•~ªW¢r|ª–ÓÑlÊ¥HWñðèècwúïZ9L¿{ò$’–õSâ#B½^Ha¶Ó »¸¨˜‡(wÀ0Ò~üX¿°‘ëQ£ó8jÇÕWX3®“6»ä¸ÃÆ©Cq\˜ÑEž­Ç.¶šWeèbmQn®EX©û0H՟[mÝVA”Š•ºK²B?‡Œ‡Q)âƒ6××]¥›¡íZÕ®šÉÙZ]«Æ›ëÅëyMã!ÿäó‡û)áˆñê=,ëÂ,?È÷wy3B ý0+«BIËË>[ŸJs ½6tC˜>’´^ a¤ªÞ¦Poœ a\eá.iTQ¦a«‹Ee7Òù"²¯uHßè<4Ю‹,³Îâ8“üØ· J}ŠE.ƒ8ÈfÒIŠs”“7”ò¾Õ»)‡ ó¢Äi%HËOߌÜÖâÓ8B< ñ4Iœ/V*Õ”¦+ݚ@7F&ù`Æë0÷欹>žüðà’w~Òf—´Ûuz"xƒÙóȍA«VÞ KQ>è _:-š9Qú:„#[ˆ/G¨#)îË­v㯏Êvׯ7 ƒíç9۔ÏJô×Ür?Ø_›éaÈhÛý4´Ç;°\[îEÕÆzvéû!ÌC®{,mÌF”ÝFn³RÞUvØuHc´ªíy}¤þ“ëNgÙÜTÝnØ[äç”K>Ú[¸¿æBa~¾`¾A8¯õß_ +Ø7nœäÆðԁi`ßqæ!h}Ø är@Tà»Jèrñæ(¢Uß+y Ï!¬äúVŸF¨›¿JQü ¿îõæìMîšïLÉ(}¤P¶ÚDL%IÚÜ]‹†Ž*²¿æßê|ìè/ñ\Ä0m’µ­ª|>›í÷{–h—Fy¢jŸþ³»"ޙh涓´hOó¢&õ™SÈÿÁÆ£ +endstream +endobj +6751 0 obj << +/Type /Page +/Contents 6752 0 R +/Resources 6750 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6684 0 R +/Annots [ 6736 0 R 6737 0 R 6738 0 R 6739 0 R 6740 0 R 6741 0 R 6742 0 R 6743 0 R 6744 0 R 6745 0 R 6746 0 R 6747 0 R 6748 0 R 6749 0 R ] +>> endobj +6736 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 474.264 177.053 485.168] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1H79__Certificate_1_1Compare) >> +>> endobj +6737 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 396.237 179.543 406.768] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate_061c4c3b4f1eef970794b274dae62504) >> +>> endobj +6738 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 346.683 179.543 357.587] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate_51b29c5dffc073c2d350471ae9bb879f) >> +>> endobj +6739 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 309.458 179.543 320.362] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate_b8bee5e53740adc193668686030bb4bb) >> +>> endobj +6740 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.881 309.458 254.811 320.362] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +6741 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 272.233 179.543 283.137] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate_ab939414cdbcf1ba174334859443a72c) >> +>> endobj +6742 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.881 272.233 272.514 283.137] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate) >> +>> endobj +6743 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 235.381 187.292 245.912] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate_517f4965fd423413531cd1d2058748de) >> +>> endobj +6744 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 197.782 163.215 208.686] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate_7e6d252ce9557b9d73833ef594f6276b) >> +>> endobj +6745 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.552 197.782 256.185 208.686] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate) >> +>> endobj +6746 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 148.602 163.215 159.506] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate_efeb88699fb82bb331a2d24ce724bb07) >> +>> endobj +6747 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 111.377 163.215 122.281] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate_553c3b19a36235d228039a6bb3452918) >> +>> endobj +6748 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.552 111.377 238.482 122.281] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +6749 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6753 0 obj << +/D [6751 0 R /XYZ 90 757.935 null] +>> endobj +907 0 obj << +/D [6751 0 R /XYZ 90 599.288 null] +>> endobj +242 0 obj << +/D [6751 0 R /XYZ 90 590.163 null] +>> endobj +6754 0 obj << +/D [6751 0 R /XYZ 90 492.423 null] +>> endobj +6755 0 obj << +/D [6751 0 R /XYZ 90 414.023 null] +>> endobj +6756 0 obj << +/D [6751 0 R /XYZ 90 414.023 null] +>> endobj +6757 0 obj << +/D [6751 0 R /XYZ 90 376.917 null] +>> endobj +6758 0 obj << +/D [6751 0 R /XYZ 90 327.737 null] +>> endobj +6759 0 obj << +/D [6751 0 R /XYZ 90 290.512 null] +>> endobj +6760 0 obj << +/D [6751 0 R /XYZ 90 253.286 null] +>> endobj +6761 0 obj << +/D [6751 0 R /XYZ 90 178.836 null] +>> endobj +6762 0 obj << +/D [6751 0 R /XYZ 90 129.655 null] +>> endobj +6750 0 obj << +/Font << /F63 374 0 R /F65 376 0 R /F50 339 0 R /F11 418 0 R /F72 471 0 R /F35 2018 0 R /F23 340 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6771 0 obj << +/Length 1538 +/Filter /FlateDecode +>> +stream +xÚ½XmoÛ6þî_!`@'5CR$%Àµ][t됥ٗµEÁHt,T–\Iž›¿£øbIVÒ¬+úÉIî>÷ÜÑ8¸ pðbñäjqö\DAŠRAEpµRĂ NIp•oCBM–+‚1/–‡²ÙÊKŠÃº¼Ý¨¼‘~/®ÙܞŸ¿ŒÓOUÓï0¦™ìÔùùÓz»“Í’$¡Z®(ÇᛮÙg_ªµ2kU˂ R!–ï¯^-~½Z|Zð¤÷ŠÇ(Žxmoß㠇ùWFQš‡~×6`4‚ß2x³øsïF ~Œ0FÄÆøLu²(Un|¦Ú¬)v]QWÚ©³ç,á`EŠXj ýbÞÉ`/Ãá?KÂCݍ ¯_¢c¦ÖucÝÆΌfp(rUՍyªwª‘ìæÆyü0†säÄîRuûFó³j§<§ÑxÅ&žd°˜ÂÙ4Då¤ÄQ‹’^§¸«6ï(å“RµâP,v»m6^š :Ô-k&bˆ8b~Çöõ¡ý¡¥–ÉfG­¡ùSœ‘ú ÝÝÉZÐ~(ª¬ÜçÖB†´PœzÞÿ4ck$äC˜Gv"ŽáÓùç¹æ!µõ̓åÜÅþº,2Ö\ëÐÞÛt9~P$Äøq]×åýM‘ë4u£àJøЊ¡©k"î5uÚ\ÌØzôù±o¿ÁÛÞí›fÓC¨x `(X/Œ€Ó +H-cƒf j=Ž»#Œܵœ 7{K©±I ”8V3ÛßÊ*wt†ºÑ`éô,Fɱ.|ž±¯‰í‹tGªuí°V©(՜Ùd3ž€‘YŽ"ŸèèƄ¦8‚Ž•@Ÿ!ÂÙ@Y¾áµñÉ©Ä÷êXEÚ¦Ç$Ü5*/2¹$aq‚w#³›¥ùq®À†+©u%u®¤øôR ¯Ø +©—öz™öMVe¶µ‚ÞpQÁ‘nG7†aݓ×õÞj.ÜðÚñ…jç„|Œÿªb×äý{T;öÐjçW¦ÿ‹`6Iú·Hÿw°Q@N˜¿CxŠ8Ÿ6ºõÓÕÒ>:”Í£­™æá¯V5?ê%,V¯eå;W­¤öBÜzàA]0¢ZÅô>€òå”ÎDö1p£ß}‚ý…ÒŽ"ìuaÓu»ó³³Ãဲí«b× ¢;àÎNKÊÀ +èàñFà‰°­þ€‘hŠÿ¿à¬ã? +endstream +endobj +6770 0 obj << +/Type /Page +/Contents 6771 0 R +/Resources 6769 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6684 0 R +/Annots [ 6764 0 R 6765 0 R 6766 0 R 6767 0 R 6768 0 R ] +>> endobj +6764 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.821 624.275 440.832 653.341] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate) >> +>> endobj +6765 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 280.669 175.937 291.573] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1H79__Certificate_1_1Compare_bf5e694ab674c48a452893f021986318) >> +>> endobj +6766 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.274 280.669 268.908 291.573] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate) >> +>> endobj +6767 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [310.641 280.669 376.274 291.573] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate) >> +>> endobj +6768 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6772 0 obj << +/D [6770 0 R /XYZ 90 757.935 null] +>> endobj +6773 0 obj << +/D [6770 0 R /XYZ 90 733.028 null] +>> endobj +6774 0 obj << +/D [6770 0 R /XYZ 90 610.701 null] +>> endobj +6763 0 obj << +/D [6770 0 R /XYZ 90 588.389 null] +>> endobj +6775 0 obj << +/D [6770 0 R /XYZ 90 588.389 null] +>> endobj +1493 0 obj << +/D [6770 0 R /XYZ 90 404.715 null] +>> endobj +246 0 obj << +/D [6770 0 R /XYZ 90 398.115 null] +>> endobj +6776 0 obj << +/D [6770 0 R /XYZ 90 299.643 null] +>> endobj +6777 0 obj << +/D [6770 0 R /XYZ 90 299.643 null] +>> endobj +6778 0 obj << +/D [6770 0 R /XYZ 90 243.349 null] +>> endobj +496 0 obj << +/D [6770 0 R /XYZ 90 118.45 null] +>> endobj +6769 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F95 1788 0 R /F23 340 0 R /F8 504 0 R /F65 376 0 R /F11 418 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6797 0 obj << +/Length 2054 +/Filter /FlateDecode +>> +stream +xÚíZÛnã6}÷W(°•šáE¥ (Ð-š"ÛØ&éÓnaÈ6«•%W’7q¿¾C‘ºZrœTÛM/‰u!‡Î̙3±ugaë»Éë›ÉمË,ù.u­›[Ëǖp â”X7+ëM¢þtF0ÆöÛ)Ávn‚ùÛ)Åví×r•óÂE¤ûóóË8—©jô¡hM¹ysvAHC>ñ|„9 ^HÿR·h̀`D™_¶xìâŸrn1QŽíËøvJ¹ôHwÂÄ+û~5 Ý)|Y¦…ÞL}jËÍ6 +r©Ÿ\É[¥ŒgËx©QLmê +%sòíÍä÷ 1Ø"ŒqãÖr3y÷ ¶Vðü…ó=ë¾hµ±Êà7²®'?Mpgùa‘}Îi¹þ”!ìòÑÖLÙ€Ryî¡Mˆƒ„#,À©èX -ßsAmzh‚AùÆŽ m#@GkÆ0Cˆ›†|èSôh[¦€ã†gÌCw¬us|ÝékmÕ;Ë4\WŠ“Ü\ȥ̲ £½~°Œ’L®L³m’eá¢|•Ê,¹\éûP­úµ A„Œ¾¼1 ³ȥƢŸ…ñ2Ú­dûr†„ïumӔnæT±±ÝFh½î‘Ã8˜˜wlÐ^"_ ‡P33G7¼Œ×°6¹‰ð6n¼mÀӌÎó×A&QO¬âŒ"âÅßîQ¸Ô”›Ø°¸¾ØÅË*ÉÆ£‡Ól0 Ž„W‘¥Ël~Æw‘Ì“¸¡©ätqµ¢-1Ô/øàE[DïüÜ°±mÒ¬‚ÐWmýµGGœ9 » ¦3=‡"ûŸPKàݾãڗó+™í¢¼G¶‡Á»èc²½Zv¯pjÆ/Šµ–[­Â¢ÊZCՏP + Sµsk"øp*ÓÐ"‚½ ¦Qãä&ˆ"Yª¥ËœŠp$q„1„J\e>ƒ›D“‘¼$üj1¡bS…›z®Kj ·=É°œot®Ä«>ªËêVmFåºÌ%Þ# ÷SA°I±¦Ê=|O{%ªsŽFތL:BŒ‰Ò-¤0 ?Öჽ¦6ŒÑ&Š‘¾É1P˜ü½`͟ÖÞ'ÔRaÜ«W'Ø +?&Üc31,`Ës®ØÍ/¢Æ¶1 ãn˜ãY#¯ðñÕT–QàŒ‘céT¸ˆøì cK§ïf ÿIéS5l¤Ou[9¨Ú¿ãsÚö†W_4+ƒX=qóå?Ÿs[sîäܾ4¨¶ +éSré¸ûFÌQáBþµÕŒ;J5Cšeç)ÕÌé҆h>ÄuŸ@Å_\~Oˁb†ñ£ÅŒÀ@TÄxè˸%jø{™ÎgæKŠC£Nl·iònµÿ>ÿÏ}kõ雟'~®Žz2ûcïÊÚW­Ð% +ҙÆhxˆ‘:R«TS8 Ðx-KƒiÍ~³Ê«ï'×ó%¤«:é¯ó|{~vv–ÚÅá6Ea~¶ÝFg‡Ðא¢Î“VBns¬p“¤Õ)x¨÷8Pwýÿuzô… +endstream +endobj +6796 0 obj << +/Type /Page +/Contents 6797 0 R +/Resources 6795 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6684 0 R +/Annots [ 6779 0 R 6780 0 R 6781 0 R 6782 0 R 6783 0 R 6784 0 R 6785 0 R 6786 0 R 6787 0 R 6788 0 R 6807 0 R 6789 0 R 6790 0 R 6791 0 R 6792 0 R 6808 0 R 6793 0 R 6794 0 R ] +>> endobj +6779 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 591.507 156.281 602.411] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_b5160fe536bd1bc8d42c12de33f40493) >> +>> endobj +6780 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.097 591.507 192.824 602.411] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >> +>> endobj +6781 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 552.653 244.38 563.557] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_fb730d60db4b7e1ddd4c9994ec077cf6) >> +>> endobj +6782 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 513.798 191.718 524.702] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +6783 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 513.798 288.852 524.702] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_348c6523b219aee93545bb401dc0b813) >> +>> endobj +6784 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 474.944 191.718 485.848] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +6785 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 474.944 303.079 485.848] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_aeb70a45d5ee0c7fac5f5d6c659fc69e) >> +>> endobj +6786 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 412.18 185.919 423.083] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_e34390c17dbd12de9906817c4b6cf479) >> +>> endobj +6787 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [384.794 349.081 456.803 361.036] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_241f107b045949a58b49469a6a09caf9) >> +>> endobj +6788 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [481.269 286.316 513.996 298.272] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_5915be624de343f1598d246ee4f1bc42) >> +>> endobj +6807 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 274.695 249.012 285.599] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_5915be624de343f1598d246ee4f1bc42) >> +>> endobj +6789 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [336.317 223.886 462.143 234.79] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_a71726a7725f9269553ed9e594b0d74a) >> +>> endobj +6790 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [202.037 197.31 313.023 207.215] +/Subtype /Link +/A << /S /GoTo /D (main_Meet_Preserving_Simplification) >> +>> endobj +6791 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [330.082 161.121 438.335 172.025] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_ca669c9659132e9fa6adc7a9afbef642) >> +>> endobj +6792 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [481.02 99.019 513.996 110.974] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_6a869e3c010e87dff868fb410d4f0a20) >> +>> endobj +6808 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 87.397 156.709 98.301] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_6a869e3c010e87dff868fb410d4f0a20) >> +>> endobj +6793 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.525 87.397 232.265 98.301] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +6794 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6798 0 obj << +/D [6796 0 R /XYZ 90 757.935 null] +>> endobj +250 0 obj << +/D [6796 0 R /XYZ 90 733.028 null] +>> endobj +6799 0 obj << +/D [6796 0 R /XYZ 90 610.481 null] +>> endobj +6800 0 obj << +/D [6796 0 R /XYZ 90 610.481 null] +>> endobj +6801 0 obj << +/D [6796 0 R /XYZ 90 571.746 null] +>> endobj +6802 0 obj << +/D [6796 0 R /XYZ 90 532.892 null] +>> endobj +6803 0 obj << +/D [6796 0 R /XYZ 90 494.037 null] +>> endobj +6804 0 obj << +/D [6796 0 R /XYZ 90 455.183 null] +>> endobj +6805 0 obj << +/D [6796 0 R /XYZ 90 392.419 null] +>> endobj +6806 0 obj << +/D [6796 0 R /XYZ 90 317.699 null] +>> endobj +6795 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F21 2111 0 R /F50 339 0 R /F65 376 0 R /F72 471 0 R /F99 2117 0 R /F35 2018 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6822 0 obj << +/Length 2444 +/Filter /FlateDecode +>> +stream +xÚíZYsã¸~÷¯àÓDªµ` zS©Ê3åM65™qžf¶T´ٜP¤–¤|äקqñ)kj¼ÙMÕ<¸‚`£ÑÇ×·A¼9ûîúìâ5§AŒbNxp½ â0#Fpp½>Ì0F$ž/p†³·sΒr›,ßÎI8+²§;µ.“åßӛ2)Ÿ./¯òZ•zѽY™Í¹þéâ5ÆúXÆ(d°¹¡þg»¢Ç¡±_ñ]±Ï×@|ÎØì|¾ ,œ]å›9a³b„:(ÄÒû— ê‘_ð}–T•%z=ÉLmwYR+;óNmôaäLå+=EB2#\jšg?^Ÿýz†L`#2& ,XmÏ>ük˜ÿ)eð`VmƒˆPø͂÷gÿ< ø‡¿F‚Øå‘a—€¸d E!g–ëwêc’\Uîx¬³žH„)÷竝Œú$Tˆý’dµ*Ê9³ušßڃÃWö÷ÎIBim?¦U­ò:­šIó‘q¥E>ˆf<ÆÄoSªlŒ‰¨lXyHë»1Jñ¸Yô8B†ÿýL øâ5 ;Æ° ”!Q=n-…„°ó‘@±©ÁGE¼1ÏڛŒá +, ]GŠ"9°ô%Ž˜ ¥§Ê“­ùë²ØŽÐd¬—ì»$É2X€ãÆÌY̏yr“©åÕfÄehŒˆ$‡lv\ƒÇ6.{U-߃©dªözï‘c`õŸN®=h ‰Œù±ƒ‚ÃE./ï5$$ÙÞi‚t}žp$[•}ú4B!F£Î ’9š#ìEÅaü;ž 22»Z¾SÕ>«Ç †-Œž@[ ³{j孃·wo΂ J 8±žåB¯ 4‡[Ûç©f"›©²²âk| (ióþ²pr/8 +Ë÷Oۛb”à‰‹«"¯êŽÓ˜Ñ«G؏BÁ‚"„üÆQôlÕ iâØLÝo‡¬ôNª.ÈðÞÒêT¸(Äéø¥àö7BÛHBb;´ý£Á-¶CgV‡ïÉȦsؕd  ñ’ˆÜó\íKúï9`†Ôè ñêCV„8é"cŽÂñÿ˜Ùg³üO©qçÕ«ôÇ(ù1N4†` + Ô³œŽ)öY†µ2úV T<êjfò˜ì¹cÊ Íè?pðóc¡S‰ƒ*â B§¤³í>[B­‘ÞæÃh¦ßjsqqL?:4ÒÃWç6Öjìärôlaûˆ ~OÁÒB£ j`ä+ò~EÞ¯Èû‚È+ð‹*F¾¸bž«U¤ŒO@^É—"/G‘0‡‘C^ók[ŽL oUJ}õ‘ô°E_]Öòyè;è<„ƒ"(A8nz9T׎Ê>_éü¾9wh¾§pözþQøVU[[@ Q¹É¤tƒ¼p/·j{e…oü^è0Xhh…Ö!G `Ñ4§ãÅU¾)FÄÏgÃA¼ Ü®¼7Ît=mdœE³êÁ4BÒݶۼ.öPvO‰¹É÷Šr\Ì¢­OZ«˜¤É쨼)ZÒSž[ÌÙç­Ì(µŽï‹Ò¾(M—Þ#•¸Ç¨ÊNíÊBxŸ6´nžÜbxßó1ÐgcՁGýêÍÏoíĄ&õýLÔª`»ûÏÒbþˆ'q19ª€‚ÜgPow¿N¥°^vÕ`ÒÊ<²>ÊÙ°Dy–(ë†%êqJŽ†%ÈxdÜÞå5©\ßz9þ†µÄÃuåv*ìþPáÕe‘ÙÉÄþ4@ï ðÃÜF%õ¾Tîk;˜.ý‰t¡² 50ýp—®îø¿À‘n>F§E€&à$&L=õïï«ýnW”Îí HÛÜZwÛô ²¬?c³Œº˜ø:pÐù ÿ֚ÀýƒÁvçWt#}姥õ:­ˆó¤rÃíçð0Å0;…áXv†³ üv†uÈ%¬°9‹œHx¬•Ç ÙZ Œ»¡ßí`kw ª­-1‡…iH>Ò~ì6¼åž¦Ež90p¸*ÍmAå{¾w5›&¡ùv¢A|²¨´K4¢¢Â9 E +¢ØiyäuæÖnìM­vµ»w‹Æ«šW­-šzÊ,\0¢¢ü@ +P[’uݶ: ïäöWío>©UÝ7;—¹7÷£lÑýŸîš‹[›£OôvÀåYÛ@Ô"SèO2äóÍ^j“̪AÚFqÃÿWân@Irâ¿+™KŽ9Š$§ö¿ÄXŒë•,l‹{÷è+7ûèÊ7ûð¯J•Ò5–;ÔÏI¾÷—ÝZþ‡‘N·ìÙ š†³÷Ê·þìÉþøÑßÎLPhùÅRt3Ï»ºÞ]^\<<< U…öyº+QZ_ìvÙÅa«CGH4D6…“ú¶ð¶‚ ^ëù@þÿâ•ÍK +endstream +endobj +6821 0 obj << +/Type /Page +/Contents 6822 0 R +/Resources 6820 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6829 0 R +/Annots [ 6812 0 R 6824 0 R 6813 0 R 6814 0 R 6815 0 R 6816 0 R 6817 0 R 6818 0 R 6826 0 R 6819 0 R ] +>> endobj +6812 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [481.02 683.713 513.996 695.668] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_c3abadf1d96bef1880657113014d46dd) >> +>> endobj +6824 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 672.092 152.027 682.996] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_c3abadf1d96bef1880657113014d46dd) >> +>> endobj +6813 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [155.843 672.092 227.583 682.996] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +6814 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [389.029 608.993 436.411 620.948] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_1c76acbe653414cc28fac54c69622446) >> +>> endobj +6815 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [391.069 560.176 435.432 572.131] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_f3699ea93d8ec71859566480bede9332) >> +>> endobj +6816 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.942 454.461 160.308 465.365] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval_79370159de3dc1738441b20eff866329) >> +>> endobj +6817 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [168.15 454.461 311.959 465.365] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >> +>> endobj +6818 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.021 454.461 513.996 465.365] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >> +>> endobj +6826 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 442.506 182.054 453.41] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >> +>> endobj +6819 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6823 0 obj << +/D [6821 0 R /XYZ 90 757.935 null] +>> endobj +6825 0 obj << +/D [6821 0 R /XYZ 90 512.669 null] +>> endobj +6827 0 obj << +/D [6821 0 R /XYZ 90 428.932 null] +>> endobj +6828 0 obj << +/D [6821 0 R /XYZ 90 368.413 null] +>> endobj +6820 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F72 471 0 R /F65 376 0 R /F50 339 0 R /F35 2018 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6838 0 obj << +/Length 2039 +/Filter /FlateDecode +>> +stream +xÚíZ[sÛ¸~ׯàÓVšYÁ¸ðt6Óínv¼ívRÇ}J3J‚l¦©ŠTýû\D‘ -ÑN¼³“úI"œû÷"Žn#ý2úñftñZ²H#-©ŒnV‘ÆQ, ”D7ËèݘDõdJ0Æã7‚ÇÉvÌÞL(ÙþÎ,·Éìïé|›l÷——Wye¶vÒG73›¼¿ùõâ5! ùDi„lî¤ÿÙÏhi@0¢LfüXìò%Ÿ1þ~2¥¯òՄŠqÑ#]ÆuXûÃÒùaÂ_³¤,½Ð›‰¦c³ÞdIeüȵYYcÔØä ;D1S©­ÌÑÏ7£ÿŽˆÁq.1Š™ˆëÑ»÷8ZÂø¯FL«èÞÍZGœ2øÌ¢·£ŽðI÷S†° ÷#ð›YÏA'§Þë]¾¨Ò"÷O?‹ÝÚäUâ†@E?¥1®[‚ ¢ªƒ­Ÿ;QÁ2ÍN…Œåu„ªýÆäÉÚºˆ“c¼Ü“g)'âGÀ’’3$¢žq ¹?ъ×.ðź/Åà+®àÏy2ÏÌlêb2eà[…y4…phb|µêÙ&Fät E˜Õ©~UΗHq>\ê 7Ði|2P-÷^^­vr‚Çr´ú±6n ‘Á݉A!Œû;”@JÄýÔnQ>αBœÆ8ŸÈ{í¦ 7»L!ïÓÕ~¶+Óüv¶(À¶OÕ ÚYzZ¿±À0^V¡_b鞾ó[hÑ )¦H³Úð}ù6æ&À$ÌiŠ“­Cø.ͳ47ïýD¡Ò •/Ùªç~Á_œ ¡+WÁY´¥GT5´À¬G Ž´ª•¨îÒ²G*?æpâ:»oéÛÛÐÛ¯Eïœ*kcªéfkJ³ý.÷úù0€ +tQwÞº»‡…ŪÇÂ)¢T 0‚<ʈû´ºóª¦³¨Ú~lI˜'¢í–ht\§jÙÖɋ)ƒ2 ¡ð"„ù%צÚA։q^^vW·2F¡˜@(`Ô/]%YizTbAmtJWÞ¼$_ú/Ežíý·ÃOÕ]€s¿É‰€` =\}ý¬Õzj?–§|ýCÖõž†r°«ö)|0º1 X!&C#Ò!5…xÁýo÷}Ü?J=ƒû„?÷c¯e‘.û°_sžþô+Møc2ÜM¿z>àw-`–ZkJã_úDIÄ°>ú|è“A Ïà&T}Ñ}%ý~^Æâ؝ý–Οm 3ÜÈ]bó( =<ûÖ{œœïGêö8%¦H[ˆr@ËY ÖÖ,Ò±¼+vYøu^¯ñŸYâBk|^R!à,ØNË$ Ê¦€} YFxŒtï¤ÿQT¦ ì-ëšÀ8ÁOúíÒ»•Ò±ó |vŒƒà/Õ6uN.-œÐØbùÖø_Árø:Ck&xoxú”®½,Ғ^úߓ,;ìlë%-+8=û‘À¡¼ŽC…ótÓy½ŒÊ].œ·jQªÏ˜Îˆó6ˆ³gq&¸¿)fG,g‚Y,g +÷Ï<ÙÙòÄI¤°fÅì!ÝjzË <‰d§4´õ݊´c°½¿×㘞¹ß’R6ü-TCf*zèB"EBŸAn‰ÕOAîžvlÓ±ö܇=ÂL|ušÒòݳkÓóñÕìڔ»¬êK†$S¦)T³M9Cà<Na>¿¤_ñÆÞ/@¢0µn݂÷—¬\Ñ!Ž!7åc¸‹¿Mµ§åÜÌÌ'ßsSÛ¤9“Žº\›Ì£go÷ëùá~¨ÍW$ k¡[“õ7,k/jÆ)FLo•ò£¸’½?ný©—*µHÊޏ—d0³u=rüWöHnŽÕFd s¼. d±(¶Ëú6V´ÏÌÆj3Nþb!«ï:º¦A÷ÓÇë»:8m†›|òê“(æWŸ¹œ°äÈ,#mY:Õ£*pMÎùJ¬ÃP$ñ§rø<0GÔdp#ŒÏÍ¢XÛ~B%ï6ŽêÀp¹[,LY®vALprå&²à|;èKf\vJÒ³}± +¿TeØ×·ªî’°Ì^ &i^†n|”wšMìÒT}÷"Â^Tuª¦ø$ˆnߥu$ÃYíM$`Ùüóñckê=ÊÔþÕX÷5'Ò` óIÀ(8=§ é$`礮u½Å¥W%éJ‹c7ª‹¢söD\èS +C¾³ºpoûгÙ{.Ory*µ…¤9{SwŽÐ¿zõª8AƄÛ1’qç?(þBc_hì ýfi¬ø}h¬’ü4±Äc¡×೎PðØ]žÖƘmiÑY6˜Í¥ÄìÿÍŠg`³eM_“à„4|–†ÒîdÊõу¼øh±/DïÇÐŅÀqÙWḪËqÈVê…ãá¸â[á¸êwã¸êaŠÛƒëMtì%¿Ö#ìÉ}éÓ¹/mqßzE÷µ0©øV˜{ ¶”PõÌþm0¡]ÖUîÒøU×âox<€¬ HëþUšíŸ,†Î÷[’ï]ÎbÔ¡óÕo’ado±m·G@!ÔÞŒô–ý':|û›ÿ#ÿ¨/Q1@irwUµ¹¼¸¸¿¿G‹A«ÝlQZ]l6ÙÅçŽnH¦t䞫"¼ð¶.¶Áü4‡ÁµkШëÿÿ‚Æ} +endstream +endobj +6837 0 obj << +/Type /Page +/Contents 6838 0 R +/Resources 6836 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6829 0 R +/Annots [ 6834 0 R 6835 0 R ] +>> endobj +6834 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.583 654.028 295.607 664.932] +/Subtype /Link +/A << /S /GoTo /D (main_Meet_Preserving_Simplification) >> +>> endobj +6835 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6839 0 obj << +/D [6837 0 R /XYZ 90 757.935 null] +>> endobj +6840 0 obj << +/D [6837 0 R /XYZ 90 733.028 null] +>> endobj +6809 0 obj << +/D [6837 0 R /XYZ 90 716.221 null] +>> endobj +6841 0 obj << +/D [6837 0 R /XYZ 90 716.221 null] +>> endobj +6810 0 obj << +/D [6837 0 R /XYZ 90 606.434 null] +>> endobj +6842 0 obj << +/D [6837 0 R /XYZ 90 592.32 null] +>> endobj +6811 0 obj << +/D [6837 0 R /XYZ 90 461.282 null] +>> endobj +6843 0 obj << +/D [6837 0 R /XYZ 90 447.168 null] +>> endobj +6830 0 obj << +/D [6837 0 R /XYZ 90 276.079 null] +>> endobj +6844 0 obj << +/D [6837 0 R /XYZ 90 261.965 null] +>> endobj +6831 0 obj << +/D [6837 0 R /XYZ 90 89.441 null] +>> endobj +6836 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F106 2750 0 R /F8 504 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6848 0 obj << +/Length 2164 +/Filter /FlateDecode +>> +stream +xÚí[IoG¾óWôÉCbÌbí‹06Œ£@Ùà‰9'Ùh²eÑi6•&Iÿ>¯z/ªz¡DË0¢¡îRéÕÛ¾·©ˆƒO~|?LN% 2’Ê`z(I $˜.‚ó!!ˆáј`Œ‡oGgÉjvñvDñpÝ]…‹dvñËòc2KîNNÎ6ÿ½ +çØ}ábôaúÓ䔐uŠ9’‚ÀÙ)ñÿd[F”™bÇÔCÄ Âd±áu ^lx·MvóíhLj†ÃÕu4ۆÙÊïáe˜Œˆ†ñ–$zH¶D?L,¯8 ©^„BŠ‰`¾œÀÁÖ +0bF7é®UÀ)ƒŸQðnð¿nÕ1eKQê˜D‘Èõ¼-X¼/»æpkÓðÈKõmï®Ãx¶Ɍ"™øë‹ï×»xö²‹xø%‚8[q±õ,¾Q1\ûLI"DµÚA!NtÉK³TL!¬ +öc¦ âF 2"×èijÓõŠŒÆ‚+£´z-E´‹ÅêaˆXóPÒ*ì`¥—ýÏ>FáÅÙ¥‡§ í-Þ{,°ý˜Þ-ãOQ¸]Ǫ<†¶*Íå°R‰Gÿ ieÚ¤µ––<9ù+Ñ.7&­oµ®\zèçÏb €Q¾Ä<‹·„x˜“õéP"Íùq¤3Çs\æu—]jRƒyȋ=ŒD°@Xˆ¾‰Qû|ûœ’q„9ýæ­tTi›¬c?õ” Ï.~7»h닦ÕgØ’‡£ÁÜõ¡îÙ­C"$’ª=ERÄ+ÓìGu!l¼¶»ƒ8Á 1fÐÀj]Ì6›å§x4æ(,æëx³µ¯¤xío_dp\@À™¥—ÜzÎäÈèR/3…sŠ‘ÀÆUx~²Íä•/¥¯¾“¥D¥Öî¼Çòªn°”ïq¸'HW‰á|GË8üm¸e4Í àW!Is~ÿýbvñq^à#;ª_xMÀ›Kñ>Æ [ë`ú0føÙÃ"1ˆ—ÞçuF Ï~­åÒ°;Ê@‚=|)x’_÷I¤DIánçMÇÈðý\÷6T´[¢“Ò…0àê— * AU§jù£U[ÊÔî|yXãPŠaá¢ì‘~‰ €´³©ecnT¯éЖmÊÒkÚÆàUê}.öô­*&RlݧâÄ®»èåíΗ}¡CÁü J>2ö‰u‰TúØm'‰¾"ùtaÎöåE²¾¢/Ò´’­L%ï-Ó9"Ç,±v1{0L«»¿ŸKAé¾æ÷ã´ª¾†)pGœ®eœ§‚é®Á Ð"ò0Wêâ§[¤&Ÿ¦=¡u‘¢ãøôƒDråhVz”H´U¤Ô5Eo™SÊe¸¥Š LîÁ¶¥Ð©“v&ݐïË¥Žâ} uJ~lëiӀwámYÙéH}pwìÒ[ž¯ wڙÂèSý-+Ó§‰`¥•VËض…~°B¦ dNJÍÙTÀ›¡…0µÞÉz|ÏìAÓ^ +?»m^#Jù×*MªŽÖÞVíaU͗?ì先„Hƍ7¢ÞÜ:­9ê³71—Ïóç‰ùóÄüybþ<1ÿÆ&æò©'æˎ‰¹î71$àQ‹eÊ|93`¾ÚÌ\å„^xðÏÌ!ÞT}ó?cfÎ{N= ޏք¾:G×á;ñNS½)ø'Ù)Ö: R´*k±¿O­yX7^ÈØStë8µ¦‹î-kFÒûXoßêL;;àW>éÇÜþÎEV ì$mÔ&Þ¾‘3ą: N‰íJÌFr}të@_¢ÙSÎ'À:п¡©j²ÞŠW ~.19`Ê>IU fH¶OY÷ƛ…}í$‡.ˆ‹.û[·¢€†º£ÎÑq?óC•ˆ»þÉF…îoýצ-l͘Â`QŽäAÛ5¬“˜£Ÿ‡ƒÒIÑcJEú8O Íòú4Y†ñb“Õßŋâvœm?ó—Ó]<ß.¡hOßÞ¬ç»Uogé’u&hÑ)ôÚ`›:}D¾`‹.1V½¹}³,”prNÉúP·¡mUÕp(-C×ËEFys3»ÎžlM×T̎óy/T7ö‚ ¶C +]ÅQçÝI]Âo¯¼eÔ´)BjÄÛ/‚¤ÄËã½U*AUÿÑT£ÒªFK¡ÓH(«è—R͘ (G5s;—םwW½*‚¢ÉtÕÓ¬O=]êñ<ÉPê-¨™BTq· ž^å—_†Ó¥Ëu’=l¯–y4˜Gлd7©ò—Oa&Ux¸LÖ«âOÂX­­Vo áϖÞcL£ð$½_[\óïi4І—IH¸»ÎÇÂÈõu„®®JÅeP¢©¬胉ÖGº¾ ^U;Ò-Úãhµ=PbÃ÷.0»dÀ ̽²ÄC…=ä³Ç ¨¶WIˆ Ïâ«0Ynsk‚rD®œûŠ9MmBÔ2šå5—QÿM¸-£ÂGބ›y²¼ÞO¢ß¸“te}?Cd +óÌ¡¨ã]wÈ+(ojúü-xb ªîíïüôAµöN”cô±_—û¿ª\‘<1ø®Fðâ·Ýê# ÔC×؎V@v:R<X*ßz9ÿÒ5ïHwzà ä6ƒ”¶‚!ÃõQÂ Ó p´™Ž˜&»,ؔ.°ÿm (X Ñ}¿Œ‘~ ¸”È(p“ìK ºûI±d--øË^s&³—ÿoÂä_¶†È¥úuï >É}]à¿,©0ٔƒ¸À¶Yٛxø. s!3ÉþŠ§ŸiÒ¯ø¯†ÀZfý«íöúd2¹¹¹Aó ÚÅËë-·@ÈÄQ۞Ԅ@P(‰”ˆ_­“\üe ‹«4*ÜÓÿßÜð~í +endstream +endobj +6847 0 obj << +/Type /Page +/Contents 6848 0 R +/Resources 6846 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6829 0 R +/Annots [ 6845 0 R ] +>> endobj +6845 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6849 0 obj << +/D [6847 0 R /XYZ 90 757.935 null] +>> endobj +6850 0 obj << +/D [6847 0 R /XYZ 90 733.028 null] +>> endobj +6832 0 obj << +/D [6847 0 R /XYZ 213.955 609.8 null] +>> endobj +6851 0 obj << +/D [6847 0 R /XYZ 90 595.229 null] +>> endobj +6852 0 obj << +/D [6847 0 R /XYZ 90 471.189 null] +>> endobj +6833 0 obj << +/D [6847 0 R /XYZ 90 449.211 null] +>> endobj +6853 0 obj << +/D [6847 0 R /XYZ 90 449.211 null] +>> endobj +1494 0 obj << +/D [6847 0 R /XYZ 90 354.45 null] +>> endobj +254 0 obj << +/D [6847 0 R /XYZ 90 347.849 null] +>> endobj +6854 0 obj << +/D [6847 0 R /XYZ 90 289.313 null] +>> endobj +6855 0 obj << +/D [6847 0 R /XYZ 90 240.749 null] +>> endobj +1538 0 obj << +/D [6847 0 R /XYZ 90 189.426 null] +>> endobj +258 0 obj << +/D [6847 0 R /XYZ 90 182.826 null] +>> endobj +6846 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F23 340 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F21 2111 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6869 0 obj << +/Length 1490 +/Filter /FlateDecode +>> +stream +xÚåXÛnÛF}×W(В@µÞ —K +EÚIŠ¤¹¸±Ú—8hie1¡H…¢ìº_ßÙ )’¢%ٍ‹}°LQËٙ3gÎÌ;×v~œŽ'/æD( +hàŒçN„Ä)qÆ3çƒKbÔŒ±{îìÆÅ2žœ{»yz·³"ž¼N®Š¸¸^®'oã2QËnԇœ¼+&g 9ý¬¿Í¼ãW'/iìG¹(çàÞî'³¤åÁˆ²¨Z1î1!‚jÁÏM\”ÅfZzCÊ1˜‹¨+—«4.¥¹ó^Îeá‘ЕÙTªÈEäRA”ÕÁóñàˀ€ì H0îL—ƒ±3ƒû¯ŒX:·zÕÒñ)ƒÿ©s1ø}€÷ÂNÂßÂN±À?“eœ¤€Ÿvð™\O‹dU&y¦œ‹Cê#æGæѲŠf'&dÖŽV Ê»•Ìâ%€ÀB…”ðÝÕ5éürÞ³Á! +oR€fÛ¤¬mRŒÁÃD;@+ŒQÄ£½´jmß07jX‡LÔˆۼ¼Ý,¯€=Ðräñ4UB{ñ‹ˆ-|z¡E‘ãÆÂaÀŽµ80^X2Ïòéf)³2ÖlÑ·æya.ÊE²6WëFAÜjìí×2“pÉ2o^äËêYYYKÓܣܽM²ksëcšÊ‘.˜Šñ ÏBíe(Œ“—”òö¢Cl_­R´XÔø©Žµ²Â|„)2…ñkìÊ0 ŒƒÝÜ6ÖŠ(íHTÛ +\â0Ú­‡ûŒÔ"­Hyĵ• `‚DH†"ßbÚ¯¶0(Kî¶X_f Y$%¤Üg\AÈ-„»ðæyÚGVà e´ƒPkcˆ ‡5†{7©r¤ºQëú”ŒøP$<~Çq¯F! x_q)9¬s6Ý(Ÿâtc=¢Íò¦è]½öÓ§kÇ߅ ’›0‚Æ´õæüÚG¨jJ{¡9ØQCÄEøxdÚZ qñèhcÈÀA"‚| L%ÔoQµÒ£«»J@÷Óé´)•¥é—]ï€', k«Üϳø*í‹Ùj…áÃbîô‹!…Zí€ÉP][µûv3Bíähþ-L› èI¦L °CíÙèÙÑVh3ñÿnÅìØVü:Éd\Lžÿµ2 k½®q9Kãõºoß½Ãñ_ÌS©¶m®¥ØÄlPUoÛhŠÌwI6M7³¾:á ‰¨ÛuZ¶Ze݄¯;-†Á~2E³žítꃪgÑ}oá¼Wc°{Ø;ß\¥ÉÔX#õ¤«¯_l²©bíºÅ‘®JV´¢ }þ=¼2'§âÚ¡Þ×Lk°Á2¡CGCgŽátLVîÀ°‚; <ªä)(šÞ}$ fíÎ397©­®)Ä£‹-/Fp춮,7EfŽ«•+Ûhò¹Ýº' +õ{“ÓʖŽd4ú€ô¹›÷ú_ÉÿN@÷à<¬"ƒó¢`O†³†çèhï·õ½|TÆl»{§qœ%z›Œa#w!ä?°3ï…p>« ý3|O¯Õâ«3ê „¡C𠘺žŒXg¹œ+QR½iš@Cœ”E ¢6é¬N +¥øæ݋z$û7ºIÒÙºÓ'ÛÍzS«Z+–öÞ*Ïfu?-óŽ­$[äË\µºk=|d2ßTûÉbY7ˆ†›œ+ê^v$mE [“áñ) !wxòÞ« xq‘Tƒq÷ñ›o:Ÿ7 Ï»‰ƒ 1äõ|ӟ8=2sê`.ž¾úŽõ3-®q’•½z>ÝI`÷­hˆÀÙüȗ¢úe(€ HïÍËP!ÎýÎ]<ök5õx¶éÑÇ|ùc-‹<Î]K–7q¶‰S¯†Á¼X(¶ÁHThÈ ²¢¯‰ì³S]ý6ÐÌØúKB®‹²\NNnooÑt6Y²*PRžÀ0x²;?5¬(¢×Fê£Á2/j­›K}|@]üÿ*}êA +endstream +endobj +6868 0 obj << +/Type /Page +/Contents 6869 0 R +/Resources 6867 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6829 0 R +/Annots [ 6856 0 R 6857 0 R 6858 0 R 6859 0 R 6860 0 R 6861 0 R 6862 0 R 6863 0 R 6864 0 R 6865 0 R 6866 0 R ] +>> endobj +6856 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 278.75 191.16 289.654] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_b82fb79015a9e4959fe801e608b2a0ae) >> +>> endobj +6857 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.258 264.31 364.14 274.215] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_6f8cd8fbee64faaa5e47c8e41ba7662e) >> +>> endobj +6858 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 240.257 191.16 251.161] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_701574facbfd5461d399dccbc88a2999) >> +>> endobj +6859 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.497 240.257 295.747 251.161] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6860 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 201.765 198.909 212.669] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_e9cc837bbae1745ada3780634c73858f) >> +>> endobj +6861 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 163.273 191.16 174.177] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_e7df198cd5bdd6e9f87192fb3170261f) >> +>> endobj +6862 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 124.781 191.16 135.685] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_9a14be758de0e77faef8de4a11bd8e8c) >> +>> endobj +6863 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.976 124.781 230.163 135.685] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +6864 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 86.288 191.16 97.192] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_5a74ca4d6d20b677bd8e4bf05dd45760) >> +>> endobj +6865 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.497 86.288 262.003 97.192] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +6866 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6870 0 obj << +/D [6868 0 R /XYZ 90 757.935 null] +>> endobj +6871 0 obj << +/D [6868 0 R /XYZ 90 733.028 null] +>> endobj +6872 0 obj << +/D [6868 0 R /XYZ 90 678.303 null] +>> endobj +1539 0 obj << +/D [6868 0 R /XYZ 90 628.139 null] +>> endobj +262 0 obj << +/D [6868 0 R /XYZ 90 620.977 null] +>> endobj +6873 0 obj << +/D [6868 0 R /XYZ 90 519.077 null] +>> endobj +6874 0 obj << +/D [6868 0 R /XYZ 90 470.513 null] +>> endobj +1540 0 obj << +/D [6868 0 R /XYZ 90 420.638 null] +>> endobj +266 0 obj << +/D [6868 0 R /XYZ 90 413.476 null] +>> endobj +6875 0 obj << +/D [6868 0 R /XYZ 90 297.542 null] +>> endobj +6876 0 obj << +/D [6868 0 R /XYZ 90 297.542 null] +>> endobj +6877 0 obj << +/D [6868 0 R /XYZ 90 259.17 null] +>> endobj +6878 0 obj << +/D [6868 0 R /XYZ 90 220.677 null] +>> endobj +6879 0 obj << +/D [6868 0 R /XYZ 90 182.185 null] +>> endobj +6867 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F21 2111 0 R /F23 340 0 R /F65 376 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6911 0 obj << +/Length 1668 +/Filter /FlateDecode +>> +stream +xÚÕYKsÛ6¾ëWðäJ31ŒÁ‡'—Æ“d’¸S7vÛC’ÑÐ$$sB,VÔ_ß’’L9²,Ûӓ \ìî÷í¶æ¶ÞÞ\NÞ9Ìò‘ïPǺšY>¶\‡ N‰uY_Ƅ Æ&Çc<¾˜<Š4˜^L(Ëdy#¢"˜žÇ×EP,OOÏãLÅô폼˜o,Ê2–Ùä˜r<>K‚²l†ŸÅL4ï³P(ÑÔõÆÔ¥“oWGo¯FÿŒ(‡-¢•á.r·Âtôå¶"xþшùžµÐ³R˦ ~ërôÇÃ6µ¡.µ<0Ô±•¡„ú{–KÂoŒ}SÇId´¬nD3H´QÍX(»•uÌ]³.”…y–Ë,Š³¹‘!Û×YYÉ|ÄY¥ì¯óe(¶AM­Cؼ^ӕ#æµï‘vÓ6;OÞq¼‚æ1eaJÕùÒ¯”ò !ÊÙÅÜxýóû‘õå˜à+xkW?ƒIʸ¯˜cm y9 KM{/2Q•,†dÍA +´lÔ"Ç{ˆ|ÛހÍ%6—ö°ÁÃAØàùlJ†lDÌߕÚ9£ú]äµ;ôæè¹È#´ ¼5“F¯\Êf± ‹ŒR‰,ëF­ÕY¯Ô·µŒ£ø6.[A±’IÀMw0ò¹o¨%óXDÊÓ$‘ñùËs¨ˆ£és‰µŽ†AG$È‘`'z©¶r!LV¾–µî~V +i±V×$o0´ÅÝ|¨uNû…æeÖªj¿ u|äþ²„`ăŒdïÙ}íÇ¡ÚÑ.ÙËÒ¢n˜Ó údpÚªÀcÏyY´¡íGç;åí[}º[–{ÓrP†q<ê4bäþ.âÙ»®c6ò:וUõEÅÐ9 +FNßðñ_/Ï>|h†M»ÝvâP±‚jµ×¨ÈC½ÄëÝ(4ò?ëÅ ®ö³,«B¦ö•œíøÏZ©gÅù)+¸§ª†H˜ó"ÞÞv(|/ +}È5PmDû±Ã`ÕÍ"Œjœ½]3D'ªîwl4Èq;zɼ?Ž ½Uå¬cÍë×C{p1Æ÷Œ{øw{ðûùp-e²KÈ'2ˆî ùx ä÷dÆ9¬¥ÂÜ!ãY1±ùX¦C `ˆØìþhw)[‹vØF»C·G;LSvF‰¼Q"ªC]ÏáISÏ·ø $÷ir-%ꅂôÈDC"¨9¸3¯›9XŠÁPaØA>=ÄÖï˜9٘¬Ÿèa(µÖê”)YN8*B‡ˆ»¶éîj®»¾UQ‹m¡ÙojMCUÖa(ÊrV'¯†Ì€vÉéì˜I9(ÙZt1-Z±ˆKÝ_>0ˆ0F®ËD¿zâlzv#B•Ú¿›úغ4H’;ûՉ u@Ž4— jVw¯ P€0(ÕÞ\D8¶=H*új1ø ÐN§ÀGËǤ©ËEÖ/ŽÈaz¿µ YÄÕ̀ =M·ØòQ—„›w¬ò¸ã«¾JB@FraÅæΘûˆs㯫–úò¡HÍ&ü¢½0nþš[ãæϟ¥(~QiÇõ· «Û­¸"À­%Šþä#È_´¹rЉêR´{ÐƲïV;ú4Ò®ìõ%ž‹›ªÊOON‹ +KTgq^ ¸:Éóäd͍VàH¨3kO}a‡Ø > endobj +6882 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 696.002 191.16 706.906] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_4124a10b953c4c49984524875a257f3a) >> +>> endobj +6883 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.497 696.002 260.32 706.906] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +6884 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 646.189 191.16 657.093] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_04aff92d245522832391c1704f455992) >> +>> endobj +6885 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.497 646.189 283.563 657.093] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator) >> +>> endobj +6886 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 596.376 191.16 607.279] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_158df02c8c54fa5a9286836fb01563cd) >> +>> endobj +6887 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.497 596.376 268.629 607.279] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +6888 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 557.521 179.554 568.425] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +6889 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.052 557.521 250.666 568.425] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_c1b93dcadc82e52690114301554801b0) >> +>> endobj +6890 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.933 519.041 297.728 529.571] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_0ed481e43baf024d4a5b5e86e85c4a87) >> +>> endobj +6891 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [301.544 519.041 336.732 529.571] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +6892 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.933 479.813 342.261 490.717] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_a8f43e35dec15be4374b207a9440eb2c) >> +>> endobj +6893 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 440.958 191.718 451.862] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +6894 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 440.958 288.852 451.862] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_bca5613972564c8ec5c832bc8ff200d6) >> +>> endobj +6895 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 402.104 191.718 413.008] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +6896 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 402.104 303.079 413.008] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_3a808cf2742df02d856a8d9882845861) >> +>> endobj +6897 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 363.25 181.845 374.154] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_b48b93c69098ab1dccd8d063f9c41575) >> +>> endobj +6898 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 324.395 181.845 335.299] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_0912217f15a36eb486b243ee592f3379) >> +>> endobj +6899 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 285.541 154.727 296.445] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_e1dfbc8be3858f2423df19c32e043110) >> +>> endobj +6900 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 247.06 176.505 257.591] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_298a32e26d8133869f28560cca4ba73b) >> +>> endobj +6901 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.408 232.066 450.955 241.971] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_0912217f15a36eb486b243ee592f3379) >> +>> endobj +6902 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 197.247 150.493 207.778] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_5bb7f6903958069b19f70d1391987a51) >> +>> endobj +6903 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 158.019 156.281 168.923] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_ede3aa1f7d5925d31d3f66faf655dc66) >> +>> endobj +6904 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.097 158.019 237.346 168.923] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6908 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6912 0 obj << +/D [6910 0 R /XYZ 90 757.935 null] +>> endobj +6913 0 obj << +/D [6910 0 R /XYZ 90 576.615 null] +>> endobj +6914 0 obj << +/D [6910 0 R /XYZ 90 537.76 null] +>> endobj +6915 0 obj << +/D [6910 0 R /XYZ 90 498.906 null] +>> endobj +6916 0 obj << +/D [6910 0 R /XYZ 90 460.052 null] +>> endobj +6917 0 obj << +/D [6910 0 R /XYZ 90 421.197 null] +>> endobj +6918 0 obj << +/D [6910 0 R /XYZ 90 382.343 null] +>> endobj +6919 0 obj << +/D [6910 0 R /XYZ 90 343.489 null] +>> endobj +6920 0 obj << +/D [6910 0 R /XYZ 90 304.634 null] +>> endobj +6921 0 obj << +/D [6910 0 R /XYZ 90 265.78 null] +>> endobj +6922 0 obj << +/D [6910 0 R /XYZ 90 215.967 null] +>> endobj +6923 0 obj << +/D [6910 0 R /XYZ 90 177.113 null] +>> endobj +6909 0 obj << +/Font << /F63 374 0 R /F72 471 0 R /F65 376 0 R /F50 339 0 R /F99 2117 0 R /F98 2120 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6977 0 obj << +/Length 1044 +/Filter /FlateDecode +>> +stream +xÚí™_s›8Àßùzºƒé!K!ðãuš›ëµ3¹Äw/IÇ£`¥a„pÜôӟ$ ±]ü¯¶Sšëƒ ‹•v÷§•vß¬_GÖà,ð@£€`t "X€!%Œ&àÊÆzžãb„}î`dó"ããs‡ ;OîĤàãwÉMÁ‹‡áð]"/Æo>M ‡¶(Ë$—ŽK(²_§¼,ë慸õÿ2Z4a¡M˜ç|½µÞŒ¬-¬‡6‹¡ 2‚8³®> 0Qïß½(s3*>ñÔ3—ÖŸÚ¨ñ +h­ØeÅ«$®Wt>»IÛö{‘ݨå™öÙLƕR¡4KkeÎ(ZŒè{!p záׄХoÀ•K•ËzÒú­añ±QõŒѓN’LHm¸qõ0KRÖ~“ñOãrÊc1~üzuz=ìQ¤~xEh«# Tj¾VK«ãàbF¸QëBT³B6n¬î„ÓNžd³¬î˜U8ˊÔ]¾YíEv<Ö²Ó¡D́w\NRá`jÃN…ÖøËm5S4„¡¿“ÃÌ|÷úd²YD&UÂÓä³8…~”¾ê…Xo°>â!"oV¯óÌñ©²õ·6E¬‚Cµ3Øë¡þi³ŒÏ¢ÈŸoCk©jFmáÜ]ÙÅf›)Ÿô粪{®YÈR$v½"0}b¯ñf‘9Ù=ÌFk<Ôi@í³ÍNXk÷|* +^åÅ«uÆ?šÿþåÈD rÈþê5×m¡£ÀÑZùš.ˆÆˆAĨšÕH¸³4=V§2ÂíWRBH"ÿQ钁 Úûm}¬®;ŒmÛûG%ËßD–_“õ:·¡&ŒÆjwTãªàIU‡†q¡oQõ J"5>>ފ¿ >¾ÆçøqåPzd‡ã ÈìtH P…•¯#‡bˆpïÈ9 Sû¢Ø?rÄÁäÈ]N³µÐØ;c•û%ü&í¼ÏÝ;µ~„õ¤û1èyHڈÏV!óþÝ}'gþ‚ÈÑtO«~öbÞ»]4`=DN|=â¿l_ö%C +¿q†ÔE…„„[3$}m¨!C´xý8hö?h¶täƒÆg0òƒ>Ò³OfC›$û…_påÁôˆÐC_öÑÖpµ/Ž{у{‘ho¥Gþ_èù¾“m܋dûıhµ„FãkѦ­p `ÄtaØÔ i)m8µv:×EL]XoºmeÝiÜgÊëuç¯R?;”ڍ­ßs9ãéSÝæ^‹ÅS.‚ ºù™‹.t\#ûR´L՚ýÚÖ–1åÓzqÈs–»ªšƒù|ãÎd2-`R ¦ÓtðeåfAŠ…= +¹Í ²¼hÔO¤z™q]i_ö‡²ÿ',ÜR +endstream +endobj +6976 0 obj << +/Type /Page +/Contents 6977 0 R +/Resources 6975 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 6829 0 R +/Annots [ 6905 0 R 6906 0 R 6907 0 R 6927 0 R 6928 0 R 6929 0 R 6930 0 R 6931 0 R 6932 0 R 6933 0 R 6934 0 R 6935 0 R 6936 0 R 6937 0 R 6938 0 R 6939 0 R 6940 0 R 6941 0 R 6942 0 R 6943 0 R 6944 0 R 6945 0 R 6946 0 R 6947 0 R 6948 0 R 6949 0 R 6950 0 R 6951 0 R 6952 0 R 6953 0 R 6954 0 R 6955 0 R 6956 0 R 6957 0 R 6958 0 R 6959 0 R 6960 0 R 6961 0 R 6962 0 R 6963 0 R 6964 0 R 6965 0 R 6966 0 R 6967 0 R 6968 0 R 6969 0 R 6974 0 R ] +>> endobj +6905 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 697.274 203.075 708.178] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +6906 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.573 697.274 296.324 708.178] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_0651bfc78898bf691898cdb599198ea9) >> +>> endobj +6907 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.005 682.679 346.908 692.584] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6927 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.437 658.845 194.297 669.376] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_baf335015f8c71026d2bee65ce4d109f) >> +>> endobj +6928 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.437 620.044 188.759 630.574] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_ea20a64dc7e9dd789fb069c7b8faca16) >> +>> endobj +6929 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.953 580.868 238.203 591.772] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6930 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [248.942 580.868 268.08 591.772] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_6f8cd8fbee64faaa5e47c8e41ba7662e) >> +>> endobj +6931 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 500.182 191.16 511.086] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6932 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 500.182 232.465 511.086] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_62b7a88cefba86a6731c6b46487fc28a) >> +>> endobj +6933 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [259.802 500.182 337.051 511.086] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6934 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.208 500.182 460.457 511.086] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6935 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 461.38 191.16 472.284] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6936 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.557 461.38 232.364 472.284] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_49574f120ec3f9fbfda58d6f826587e9) >> +>> endobj +6937 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.305 461.38 486.554 472.284] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6938 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 422.579 191.16 433.483] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6939 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.557 422.579 232.364 433.483] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_0308fb71a28c28f4e33aabfa9c5d3781) >> +>> endobj +6940 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [259.5 422.579 336.75 433.483] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6941 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 383.777 191.16 394.681] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6942 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 383.777 232.465 394.681] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_9dd6ce1cb02b58fd3b973e40867362ac) >> +>> endobj +6943 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.28 383.777 271.468 394.681] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +6944 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.803 383.777 382.052 394.681] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6945 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 344.975 191.16 355.879] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6946 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 344.975 232.465 355.879] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_4d372c4dff7d328d3da118817ed3d8b7) >> +>> endobj +6947 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.28 344.975 271.468 355.879] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +6948 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.281 344.975 316.469 355.879] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +6949 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 306.174 191.16 317.077] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6950 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 306.174 229.964 317.077] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_72b6b45299672d85c7984392454296d6) >> +>> endobj +6951 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.301 306.174 334.551 317.077] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6952 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 267.372 191.16 278.276] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6953 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 267.372 229.964 278.276] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_2e4d2efe88475a75dab18c7f9fe5e217) >> +>> endobj +6954 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.301 267.372 334.551 278.276] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6955 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [380.707 267.372 457.957 278.276] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6956 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 228.57 191.16 239.474] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6957 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 228.57 229.964 239.474] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_114f91c420cc8060d6834730c8e55721) >> +>> endobj +6958 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.78 228.57 268.967 239.474] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +6959 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [278.781 228.57 313.968 239.474] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +6960 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 189.768 191.16 200.672] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6961 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 189.768 229.964 200.672] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_41cdb256f546f09bd317deef44ac0009) >> +>> endobj +6962 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [407.287 189.768 484.536 200.672] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6963 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 150.967 191.16 161.871] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6964 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 150.967 229.964 161.871] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_b4396e8bfbdd5831fd37d13c19194cc4) >> +>> endobj +6965 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.301 150.967 334.551 161.871] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6966 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 112.165 191.16 123.069] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6967 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 112.165 229.964 123.069] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_9075dd07574234cc124e6076c272e987) >> +>> endobj +6968 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.78 112.165 268.967 123.069] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +6969 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [302.302 112.165 379.552 123.069] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6974 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +6978 0 obj << +/D [6976 0 R /XYZ 90 757.935 null] +>> endobj +6979 0 obj << +/D [6976 0 R /XYZ 90 716.221 null] +>> endobj +6980 0 obj << +/D [6976 0 R /XYZ 90 716.221 null] +>> endobj +6981 0 obj << +/D [6976 0 R /XYZ 90 677.539 null] +>> endobj +6982 0 obj << +/D [6976 0 R /XYZ 90 638.737 null] +>> endobj +5269 0 obj << +/D [6976 0 R /XYZ 90 599.935 null] +>> endobj +6983 0 obj << +/D [6976 0 R /XYZ 90 519.13 null] +>> endobj +6975 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7041 0 obj << +/Length 1232 +/Filter /FlateDecode +>> +stream +xÚíšÝsâ6Àßù+ô”Ú“ ô-‹¹¾ôær3×k›&´/ÉMÆ‘x +6µ \ú×Wþä#’ã cË+íîO»kIÜ>7~é4Zç‚• tú@! †œ`Ðék cH©ÝÄ!ëÂÆÈrá{{adƒÇÝ ÝÛ¯Þ]膏íöWÏ×nxûéû(´±cé(òßnŽ¬7Š²ËKÝ×Ùs¿«ÑD:‘ÌþÖùÒøÔiüÛÀfpàt0\BI9è×ßè™û_‚T9`š¶F¨ù€«ÆŸ ”+†æähNAŒdÔ’PˆÏ´¼!„§ÝÏÞOúïó\~n€ë&76˜S1W¯öµDç`¤C7ÂÄnͅWò7ˆ£nàGqþp…œõÝçNôÙz)ÛcãIϽè* 3¼¤YöÛ:—8ƚ‚%Ö$ +F@3¨ˌy©ãqèçΎtv1HGž]ëÄ $TZ35 ‰|N4F"ÉM¯©T5Yè]BApÑ Y!ƒCBœ¢Á¤B‡´|+ž)¾€‘ÑX•hŽ~ Œ˜˜a”jBæ'.Æ +R) +en¢ 2—Æ/Í$˜kÌÑÇ@÷m“I×Ó~|‡®GívŠåm˜ÌÚlÆ&#ñϒ_iÕ1kšÔ3käèM‘3ƒA,_ƒ¹¼‰R«˜+¬¼$F@g-·†:©¶ÅNA.ä»Á®–± ?2yéÅs9>@ìô°ó÷‰ÝŽ¹+ÒÖú¤U@xúóªü¹òýMÓ&>˜¶»DL0‘â +4°)†PÉ×i…ÅJ¤V†ë÷²1šºÏ»/´ðâ\› Š_¥C׏Ó4á[2L(‡œó½„΃AøG¬üjq¬@^ ++©Éò[֖Ä$U†Å{'5û0|F¾6Íý÷ȧäsK>ÓïécA°ï‚ öÛz©-ĶõÌQ‡PÓîããrІËA ^^ÁîöŒ`)Sï?êþ8•A-¤þÒ­!­X¬" + +NŸ.£,è`°pJû¾Yʛ&¦C¥È[^'Ý é/¬—öÇ × 2dgb^šuàÆ:ßùØïÆÆnQ[È`é)W@b]øÍKÏDùM7,<ä‡zx§soõ‹¾à.Î6ºL;È{卮Óã&×Á,u¼`“‹cˆ0ÙO‰| ½ ^à@Ê!R5ÛE¹·¢¸×nQjwh??Ó<æwÙMtDe¦ýðaݦ–&ã:ó»BC‰vþ)¾q&UdII3ïü?ÆñhœäÄ6æVj‹$è<³dÊÙÚÀE“ô܅×[¯4MjŒžî“©šÒå"U#=á±ötǪ}8e|¯ ˛t‘–ÅÆL$V7e ™]j\ú¸©Kq²•G=z5Ò]Ïxÿé¨b–2‘# FS>£ifâ%Ù̌oX=/ŸvF v6=ìRnPI ²Ó;\A^”%"(•FÏÿ–·óù’š?ûóW¤ÃŸlέ<°ýæúcw`—±w’ˆÒáìd2¦ËZÐnRޕ.Òm¦Ù? ¸úµ‘Zu6^ìHHQY¡=Äñ¨ÝjM§S؍àØ÷F!ôâÖh4h=sRŒe)¤äÑw¥“ç››C7)”ýaìÿ?£?ó +endstream +endobj +7040 0 obj << +/Type /Page +/Contents 7041 0 R +/Resources 7039 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7045 0 R +/Annots [ 6970 0 R 6971 0 R 6972 0 R 6973 0 R 6995 0 R 6996 0 R 6997 0 R 6998 0 R 6999 0 R 7000 0 R 7001 0 R 7002 0 R 7003 0 R 7004 0 R 7005 0 R 7006 0 R 7007 0 R 7008 0 R 7009 0 R 7010 0 R 7011 0 R 7012 0 R 7013 0 R 7014 0 R 7015 0 R 7016 0 R 7017 0 R 7018 0 R 7019 0 R 7020 0 R 7021 0 R 7022 0 R 7023 0 R 7024 0 R 7025 0 R 7026 0 R 7027 0 R 7028 0 R 7029 0 R 7030 0 R 7031 0 R 7032 0 R 7033 0 R 7034 0 R 7035 0 R 7036 0 R 7037 0 R 7044 0 R 7038 0 R ] +>> endobj +6970 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 719.912 191.16 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6971 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 719.912 229.964 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_8d443d5098921978efd7b625000f3b68) >> +>> endobj +6972 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.301 719.912 334.551 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6973 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.205 719.912 387.392 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +6995 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 681.058 191.16 691.962] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6996 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.623 681.058 231.792 691.962] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_32a44c95ae4348ff889b48c309f9eab3) >> +>> endobj +6997 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [408.979 681.058 486.229 691.962] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6998 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 642.204 191.16 653.108] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +6999 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.623 642.204 231.792 653.108] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_6ea3cf85efb71cf62fa3e233c9e9cf7b) >> +>> endobj +7000 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [259.058 642.204 336.307 653.108] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7001 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 603.349 191.16 614.253] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7002 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [201.9 603.349 248.325 614.253] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_2666c570468f53609bf420024a12628d) >> +>> endobj +7003 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.141 603.349 329.39 614.253] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7004 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.547 603.349 452.796 614.253] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7005 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 564.495 191.16 575.399] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7006 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [201.9 564.495 248.325 575.399] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_385e4d3cfe442f4fcbeefd9acf5c10eb) >> +>> endobj +7007 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.141 564.495 329.39 575.399] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7008 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [347.044 564.495 382.231 575.399] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +7009 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 525.641 191.16 536.545] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7010 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [201.9 525.641 248.325 536.545] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_98b5ccd1157e6ec8beec7702af9acb36) >> +>> endobj +7011 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.141 525.641 329.39 536.545] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7012 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 486.786 191.16 497.69] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7013 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [201.9 486.786 245.824 497.69] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_80d43634ca26fd76dcb1fdede6363dc5) >> +>> endobj +7014 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [249.64 486.786 326.89 497.69] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7015 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.046 486.786 450.296 497.69] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7016 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 447.932 191.16 458.836] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7017 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [201.9 447.932 245.824 458.836] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_691b91bcd9b5c336892574e975235de5) >> +>> endobj +7018 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [249.64 447.932 326.89 458.836] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7019 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [344.543 447.932 379.731 458.836] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +7020 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 409.078 191.16 419.982] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7021 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [201.9 409.078 245.824 419.982] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_65766b549090f6b52281c99cfba9eed3) >> +>> endobj +7022 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [249.64 409.078 326.89 419.982] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7023 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 370.224 191.16 381.128] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7024 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [201.9 370.224 247.687 381.128] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_0dddfc1f0ff6f55a90c4ea8829b9752b) >> +>> endobj +7025 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.503 370.224 328.753 381.128] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7026 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 262.182 191.16 273.086] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7027 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 262.182 232.465 273.086] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_f5bbfb14fef626aee9f34e71a78c0d7d) >> +>> endobj +7028 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [259.802 262.182 337.051 273.086] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7029 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [354.705 262.182 389.893 273.086] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +7030 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 223.328 191.16 234.232] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7031 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 223.328 232.465 234.232] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_920af28903c20a4a4962761b834d577f) >> +>> endobj +7032 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [259.802 223.328 337.051 234.232] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7033 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.349 184.474 226.034 195.378] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_37de3f55cf5e917e32f7f2f9c6d34840) >> +>> endobj +7034 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.176 184.474 398.426 195.378] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7035 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.91 145.62 156.276 156.524] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_3fc6b9758fbac86e0592d37c23f14b1e) >> +>> endobj +7036 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.086 145.62 348.418 156.524] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7037 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [366.62 145.62 513.996 156.524] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7044 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 133.664 160.176 144.568] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7038 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7042 0 obj << +/D [7040 0 R /XYZ 90 757.935 null] +>> endobj +7043 0 obj << +/D [7040 0 R /XYZ 90 308.435 null] +>> endobj +7039 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F23 340 0 R /F99 2117 0 R /F11 418 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7067 0 obj << +/Length 2284 +/Filter /FlateDecode +>> +stream +xڝY[sÛ¶~÷¯àÓ9Ôqãʋ3yh“´6íä´>3“v<4Yl)R%©Èίï.RE+NŸ‹]ì»ßB4¸hðíÅ×7WßD"HIñ(¸Y) âˆÅYp³ +>„Œ!KF) ß/ ³f›Ý¾_pÖåãF¯šìö]q×dÍãõõ»¢ÒYsûöa×,Xê¶-êj±äŠ†¯Ë¬míðg½Öv½Ê5²æqòX-~¿ùþâíÍÅ_ Gf£b äۋ¿Ó`óß”ˆ4 †jH.à[¿\ü÷‚žUŒ B#5RŒ0§ÚÝeE©Wö„ot›7Å®ÃÓᮾQtĉK.‰©eô•ÝSÝíX/˜ +ÁÖyà.“ˆK·ËÙ¥¾ûC睯í·Ûh;ȍÑÐ,Öͽ3ÌÏß^ ÉÈäÎܖܚÁ5WuÕµOÚêÍh‘4 ê͒ˆÐD ‰hdõè ňP’”+o~óZšxDÎ㞄9#ƒWHŒ²8IgèÿϜ ¨$*F8sdÅ©4NXuÒ^¹ã°±<$* + (bå<”͈S„GŽÈTz҂^Ql6z¬!W%|G¤Xa6ÄvÉfä@‘HøPA_X9xeNhfr݁ðáV`?¢«¼o£ÄiPZҍ»€˜ÎFk +Î0¬–L +€½ÜOüŸtS?¯î +¢R×&¾}ÈLΉTçE +O䧗}m~Æi½'DXD˜Ä2âñtÇq›/_ùÆ^ú†èŠÙXs¾GÚOu‡ñÂR¡¬›)vºîcÆÔsÎÕç!œ2Ãû\ÍçxHÂÄÀchE=.Њªc?­ÅSl’IdDÃáˆþa˜÷ ôp»j‘6 „›'í $Xž,Ç¢–€¶lkGeà1¦“²®÷iژ…}vd*:|±ºÍÙ Ÿ# Ãò:Æ>zÄD‰b h´èzw(ì»Â)ÜüÄjïÀ`uÌ(Õ8ytºZù ðCÑ7ô“ô„0eݟíAœö´àapQ—‚ƒäø¥–»—ÚצÿÝ÷H4ü×ðfëM¿©sƒk³þ··õÞùðüϷϾyãµþu=›÷¢“úwŒf½?ÎØDBú•G@ æîáR$\ÖØcþú 1“ƒ] |]­Ð;}àqúLåÅ0¾7RžL”š> endobj +7060 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.82 677.939 255.069 688.843] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7061 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.521 495.239 182.709 506.143] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +7062 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 459.373 124.191 470.277] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +7063 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.542 151.596 513.996 182.564] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_0651bfc78898bf691898cdb599198ea9) >> +>> endobj +7072 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.635 140.263 232.246 150.161] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_0651bfc78898bf691898cdb599198ea9) >> +>> endobj +7064 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7068 0 obj << +/D [7066 0 R /XYZ 90 757.935 null] +>> endobj +7069 0 obj << +/D [7066 0 R /XYZ 90 733.028 null] +>> endobj +7070 0 obj << +/D [7066 0 R /XYZ 90 257.794 null] +>> endobj +6880 0 obj << +/D [7066 0 R /XYZ 90 235.482 null] +>> endobj +7071 0 obj << +/D [7066 0 R /XYZ 90 235.482 null] +>> endobj +6881 0 obj << +/D [7066 0 R /XYZ 90 131.297 null] +>> endobj +7065 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F10 473 0 R /F13 540 0 R /F7 505 0 R /F1 542 0 R /F11 418 0 R /F8 504 0 R /F65 376 0 R /F23 340 0 R /F95 1788 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7076 0 obj << +/Length 2515 +/Filter /FlateDecode +>> +stream +xÚíZ[oÛÈ~÷¯àS+!«ñÜ/^¤@7ÝÝnt×}Jƒ‘h›¨L*”T'ýõ=s!9¤Æ”ÛE ì“x9š9sæ;çûf†8»Épöîì‡Ë³ó·’eIevyœ)I $»\ef„ Ææ ‚1ž½Ÿ<˛»üêýœâY½þz[¬šüêçòS“7_/.~.«"o®~ü²iæDÏŠí¶¬«ù‚ +<{³Î·[ùKq]ø÷Õ²°MS¥gTÉùÇ˟Î~¼<û|FÀ9œçŒPH1‘-ïÎ>|ÄÙ +žÿ”aČÎîÕ]Æ)ƒßuöëÙßÎðäÀ(CXŠh`ˆ"ú¤Á=8fiØìXàe]mwö–ÏÞØË&/«)¸¹ŒþüÎ><kDä3ÁHi–Îbé-£âˆSÞ@$Ø Z!HSÒ}(¾lÖå²Ü}ô¦G¦ ªfügÆt˜xA q˜ngV3™qdâÙ÷]œ¿U‘‰D”ªÖ„$º² $‚d …Œ ޖ‡íP˜•.è¯q"h„;g)2:Œ,Ot'µã'ˆ>èlÐC †}I6Y•jJÀ¢‹[z•r#Š»ùü4_0¦YDÊÙùa“Ä æJŽ³Æ‡³Ó¢épòIÇ +½ÝwMCf÷·ES¤‚B‘à²>‘ªu²!ø¤êFCíhÌì:1ðÓÈ1ŠÉæŠwið}¢+[~t@*hD÷,¬ÛH¹MQTo’3º«c!X»Ûrë3ú“-Ûm©êSö¥ +ŽJÕÁÔA›`,²…„ äG2Tž”¡âY2”ú ՓjŽg(uj¦3Tù´Ó*³ÈèH†Š‰ •ÊÄ-=¡„>CSà =è€^áٟ¯St(À“£‘”b¼ ­¼ò¿¦Ïû|]î¾ú{Kò–鐤¦ o;‹žj‚ 34æ1 +-xwþ¶ƒ¬J°«u"8µ¯ÊÏûÂS –0%d(*ö›!õæþgSoË]DŽþé`$p_ÕÕâßES‡‘À“k§‘–»º™ á©w¤G@Ô@™"f$²Øˈ,ÊI'²æP ü“wEU4¹uÒݦ„ÕH{Ý$•UTl¦”=MY‰4fCÒ)« +ҝû±²‚¿¸é…W7ÝÈÓÂJ1U_-îc1‰¯ëàǦôn}gyµ +Ž¬ëí¾)b pÞÃzåAVnۆÊÐHUïZáÆ ì›á|,ëMY¬lÐQ'•#A:Öu\…¹‡`(렎òQ†ªN÷ôÚ:¬]R劈–¬Å ”Jæ!Ä@‚Öë„>\ãÑ`Xua¡¦:9ïW:n…3ôÉH$A¼ ! œ´J2S +8gr@ÊöGúÕþ|Ÿ<,£ô%ÃÁ›Ñ੼ò#ZiuȏqÄ`ȏÃ{"Æé)$–AùD)ãNŸ&B¨‡RÅZE!ì DLÉ°Œp‘–mœ.ÓYgåwde1çDàwÓ> å¶4lý3Ÿ…ð¬É¿nƒÝ}ȁÛÜ×PÚS2Èwv•J#Ø(R +²€ÉàIPepÕ”çÕ¶}YôÃÉ_ÔcÙ ~XˆÃ1±Æ€·\ÑߔÚË(µÁ|÷Ë2Ñé,ÎØìÒÍ(¨ñ²º­ïj[ƒëý6ô¢¹óWõu+كõºT²ƒÛ²³k¡r½öWùÚj‡{' ¾†¶?…†pð#©÷ÀΦ‰O+9|¶Cÿù5—–¦Ð˜#ºrÜg³DÎ<Ï©˜eü~ ±`=’ûÇ6ÚôñK—Ê¿Lª"U ª@E¨ZEèž9õg©ýoîMê/áÙ@ý%ö«¾Y ò—Ñ‚Dï¸Á½˜½kÊÕÕ"å~,AÙ¦D¢P°Þë…Ո +萫4b¬r:4ÀÃ4À³±F´U·ö¯n $ájJ-ZŽPt:i8§‡j‘«H B¿›¼Éï +¨câêÈ,W¬½<äÐ!áù+·íe×î(>J/ö +•·á°WÊ‹T¿ÿ•ÐŽÚɝž2áîAí(fÄiG>©‡ò)¡)0VА=I;RˆMÀ©þ%ÿCâQ½¬xä úÉI<.GÊ-ÃoUâ¸z4VÜDVA{¢;b1è{2GE¡ ÍUeɓw¬õóìX›“v¬Å);Ö/¢²˜¦AeÁ”y•µŠDêmht +ÌnþxWN=槭´⠞áGp¾xÎçDƔooßÔÕM³w'‹ßvȖâyë%ñŒ<!Â6Y’<ÿ|§lQ Æô宗6˽‡°ŽÙ8€¢7E¯ÄB'Fx1܏fzìŨT­§Ú|ÙyÚAÛÿãâð1eë9Úرƒ6†„ÇÚ`žˆíâ70o<`Hlî¥ýÅ¶Nêñ'mÜ¥šâê0‡‡Á°Û5ßvn‡ÛM ÿ˜xéÐæ³}x”x†)¤¿moG°|–£â“ $~‰Ñ9ËCRrP?G¬²ð ÂlKÞ6eQµ¤ðG·prßϬó]nÞî«å®ãƒ?ÕËý]Qíò]€”%@jW•fÐ>"¡‡‡V´™Õ¿zåo#žµ·L‘,5&Þ*,È1–…œž?¦{ôƒ Æô±\_Ðçáúk7M'3ý/ÅnßT ú”:>î,’›³dý篭hXòãPLƒ +Ä´…1ŒNÃLÃL³7uq %Š.!¬»+{tºÛ^\8(\ùÿǐÎ2c +‰¾ÚU ·¬iL„5BiÁfÝ·›ÛÇF»©¯ÜR˜“Šf§µŠ>âbÏ9%A¢™—†\•ÞêÏÍâàË.56Ž‘fi°±GÖ4ý5­ÿíè̺’¦fSènñ†Ô³–cÂ&Á)Èç֞ž ü'cM`_6\¼@y{*Öª“°Ö}<:þUÚM}ê'¨ncHÄꚀ@ tÙÆ位ƒ] ‡Ûv9ìoÚØßü}[4¿·í!®Í«}¾î¿Û𫯦¯DPt@>ú-уU÷¯EéGöϬ½ú˙ ]$)aaÆp€ÛÝnsq~~–[´¯ÊMƒÊÝùf³>„m4jÔï _·;íwu†_VððÎI•ƒøÿ&Ãà{ +endstream +endobj +7075 0 obj << +/Type /Page +/Contents 7076 0 R +/Resources 7074 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7045 0 R +/Annots [ 7073 0 R ] +>> endobj +7073 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7077 0 obj << +/D [7075 0 R /XYZ 90 757.935 null] +>> endobj +7078 0 obj << +/D [7075 0 R /XYZ 90 733.028 null] +>> endobj +6924 0 obj << +/D [7075 0 R /XYZ 250.019 649.92 null] +>> endobj +7079 0 obj << +/D [7075 0 R /XYZ 90 633.193 null] +>> endobj +6925 0 obj << +/D [7075 0 R /XYZ 118.164 520.721 null] +>> endobj +7080 0 obj << +/D [7075 0 R /XYZ 90 506.051 null] +>> endobj +6926 0 obj << +/D [7075 0 R /XYZ 291.124 417.412 null] +>> endobj +7081 0 obj << +/D [7075 0 R /XYZ 90 400.684 null] +>> endobj +7082 0 obj << +/D [7075 0 R /XYZ 90 311.388 null] +>> endobj +6984 0 obj << +/D [7075 0 R /XYZ 90 287.019 null] +>> endobj +7083 0 obj << +/D [7075 0 R /XYZ 90 287.019 null] +>> endobj +6985 0 obj << +/D [7075 0 R /XYZ 90 237.778 null] +>> endobj +7084 0 obj << +/D [7075 0 R /XYZ 90 223.207 null] +>> endobj +6986 0 obj << +/D [7075 0 R /XYZ 90 176.003 null] +>> endobj +7085 0 obj << +/D [7075 0 R /XYZ 90 161.433 null] +>> endobj +6987 0 obj << +/D [7075 0 R /XYZ 90 114.229 null] +>> endobj +7074 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F11 418 0 R /F8 504 0 R /F1 542 0 R /F10 473 0 R /F13 540 0 R /F7 505 0 R /F23 340 0 R /F6 538 0 R /F9 568 0 R /F12 622 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7089 0 obj << +/Length 1204 +/Filter /FlateDecode +>> +stream +xÚí™KoÛF€ïú<µRvfß>6H +¤)à&j/Ža06] •)•’£æßw(’)Ó$mY© ôdR^ÎÎãۙÙ]üˆà§Á“Áø­‘oÈ“ëÀ‹ÀML®‚³¤ŽPžQ„Qz]œI„óÙכø*.ÞO?§Qúõääý4‰£ôâÍߋtˆ.Œ—Ëé<ŽH‹ðõ,Z.óÇñuœÿ?¹Œ3Ñd]HÖÏ'ïo&ƒ¿Èʉ7Êh Vêàòvpv.‚+þý] @z¬7£nE’ÿ΂ƒ_¢Õ0’ Œ®TaÜCºK ç‹8VóôUþúIhñûлb}žÅ™Þã·^W&#´ ¼eU6s}ɇÔôQë½ðÃp¤¬/çÉr•OÒ¢Îw "i@]Š‹»æc°S“‚àËAg×é4N®ÎóZTŽ¤!ð¨‚jHå|ˆWwiRDyu糍%ùs +endstream +endobj +7088 0 obj << +/Type /Page +/Contents 7089 0 R +/Resources 7087 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7045 0 R +/Annots [ 7086 0 R ] +>> endobj +7086 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7090 0 obj << +/D [7088 0 R /XYZ 90 757.935 null] +>> endobj +7091 0 obj << +/D [7088 0 R /XYZ 90 733.028 null] +>> endobj +6988 0 obj << +/D [7088 0 R /XYZ 90 703.284 null] +>> endobj +7092 0 obj << +/D [7088 0 R /XYZ 90 688.714 null] +>> endobj +6989 0 obj << +/D [7088 0 R /XYZ 90 653.465 null] +>> endobj +7093 0 obj << +/D [7088 0 R /XYZ 90 638.895 null] +>> endobj +6990 0 obj << +/D [7088 0 R /XYZ 90 603.646 null] +>> endobj +7094 0 obj << +/D [7088 0 R /XYZ 90 589.076 null] +>> endobj +6991 0 obj << +/D [7088 0 R /XYZ 90 541.872 null] +>> endobj +7095 0 obj << +/D [7088 0 R /XYZ 90 527.302 null] +>> endobj +6992 0 obj << +/D [7088 0 R /XYZ 90 492.053 null] +>> endobj +7096 0 obj << +/D [7088 0 R /XYZ 90 477.483 null] +>> endobj +6993 0 obj << +/D [7088 0 R /XYZ 90 430.279 null] +>> endobj +7097 0 obj << +/D [7088 0 R /XYZ 90 415.708 null] +>> endobj +6994 0 obj << +/D [7088 0 R /XYZ 90 368.504 null] +>> endobj +7098 0 obj << +/D [7088 0 R /XYZ 90 353.934 null] +>> endobj +7046 0 obj << +/D [7088 0 R /XYZ 90 306.73 null] +>> endobj +7099 0 obj << +/D [7088 0 R /XYZ 90 292.16 null] +>> endobj +7047 0 obj << +/D [7088 0 R /XYZ 90 244.956 null] +>> endobj +7100 0 obj << +/D [7088 0 R /XYZ 90 230.386 null] +>> endobj +7048 0 obj << +/D [7088 0 R /XYZ 90 183.182 null] +>> endobj +7101 0 obj << +/D [7088 0 R /XYZ 90 168.612 null] +>> endobj +7049 0 obj << +/D [7088 0 R /XYZ 90 121.408 null] +>> endobj +7087 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7107 0 obj << +/Length 1364 +/Filter /FlateDecode +>> +stream +xÚíYMoÛF½ëWð”’HµÞï¾4p +¤)à:j/Ž!0ÒÊ&*‘*EÇοïKJ¤D‘rìÀ6ƒ@ŠÜÙyûæí{×ö~ü6œ¼—Ì3ÈH*½ñÜ3ØS’ A‰7žy—>!ˆ±`H0Æþy@°¦ËprPì'‹o7v–†“Ñ—4L¿F£Ø†éäì~•Dûv½Ž’8Rýw‹p½v·vnÝûxjsÓTi~ÁÕøÃàl<øo@À9ì‘¡b›.—W؛ÁóFÌhï®hµô8ep]xŸ pg`”!,E-0ÄetœgTùoò‹ô“•MÃ,IߞºÇŸ±À{I蝼7¢æ5mÀÇ K\›¦§ˆc^µø5JCýi¯âgnàöAÁ’7dX!a˜7„øŒ(cmó„`¤jŽÐŽˆª[9Û0C¦´jt9O#Ï®\Ck Áq„‰Ç’”»ö6»Mãٍu7‹"N’cpKF¨üá¸íW€Ã+i¬_…¨Šè5€ô~¯„òÁ_½º(ÜÏͨ‡piž]ªcU $&/MT¤â{E lÚ@`üԁO u“z(îсR:Pª=êÉ_u¥=Û¨G!& ?NÂ\²×&ùË¥­øeÐÖ>[1`+Õ~˜BI yQK¯)Áb Êd&65 …Y+NÞÄrêlw­Né5±ŽYT»5’ÅÖüçŠØÆÑÈtϵ<×Í(Äí[Væ¹ V8a¤´G`B Ýlóó¿¦ÀqµW·Û ‹‡ šu„¼Äš?±¼Lí"Ìì¡CF + +5¨*œ¯äŒ±0„c¤Yû†„²þ I/å&¤Â‹èÙÉ´ãE0v4`ž ·¹^Uú9ödz»ŸÑ¤F†èc¿¢_Ï`( 0]~=j‚Wªº é<#ÿ$Xþ­¾ VÉ+> º?¯múK „_N˟a|.¶Iÿš›²é6¿Š¢y†Ô<‚ýO֖AºÈþõª»?œ„ÞúK´B€…jrn²l5:9¹»»CÓ5º£UŠ¢ìdµZœì‹âšØÎl {ž”¹[&i~ÃÃe˜onöæÿ+pGÝ +endstream +endobj +7106 0 obj << +/Type /Page +/Contents 7107 0 R +/Resources 7105 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7045 0 R +/Annots [ 7102 0 R 7111 0 R 7103 0 R 7115 0 R 7104 0 R ] +>> endobj +7102 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.542 594.909 513.996 625.878] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_0651bfc78898bf691898cdb599198ea9) >> +>> endobj +7111 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.635 583.577 232.246 593.475] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_0651bfc78898bf691898cdb599198ea9) >> +>> endobj +7103 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.542 354.02 513.996 384.989] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_0651bfc78898bf691898cdb599198ea9) >> +>> endobj +7115 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.635 342.687 232.246 352.585] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression_0651bfc78898bf691898cdb599198ea9) >> +>> endobj +7104 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7108 0 obj << +/D [7106 0 R /XYZ 90 757.935 null] +>> endobj +7109 0 obj << +/D [7106 0 R /XYZ 90 733.028 null] +>> endobj +7050 0 obj << +/D [7106 0 R /XYZ 90 691.329 null] +>> endobj +7110 0 obj << +/D [7106 0 R /XYZ 90 676.759 null] +>> endobj +7051 0 obj << +/D [7106 0 R /XYZ 90 574.611 null] +>> endobj +7112 0 obj << +/D [7106 0 R /XYZ 90 560.04 null] +>> endobj +7052 0 obj << +/D [7106 0 R /XYZ 90 512.214 null] +>> endobj +7113 0 obj << +/D [7106 0 R /XYZ 90 497.643 null] +>> endobj +7053 0 obj << +/D [7106 0 R /XYZ 90 450.439 null] +>> endobj +7114 0 obj << +/D [7106 0 R /XYZ 90 435.869 null] +>> endobj +7054 0 obj << +/D [7106 0 R /XYZ 90 333.721 null] +>> endobj +7116 0 obj << +/D [7106 0 R /XYZ 90 319.151 null] +>> endobj +7055 0 obj << +/D [7106 0 R /XYZ 90 271.324 null] +>> endobj +7117 0 obj << +/D [7106 0 R /XYZ 90 256.754 null] +>> endobj +7056 0 obj << +/D [7106 0 R /XYZ 90 209.55 null] +>> endobj +7118 0 obj << +/D [7106 0 R /XYZ 90 194.98 null] +>> endobj +7057 0 obj << +/D [7106 0 R /XYZ 90 147.776 null] +>> endobj +7119 0 obj << +/D [7106 0 R /XYZ 90 133.205 null] +>> endobj +7058 0 obj << +/D [7106 0 R /XYZ 90 97.957 null] +>> endobj +7105 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7146 0 obj << +/Length 1959 +/Filter /FlateDecode +>> +stream +xÚíYkoÛÆý®_A @BÕz—»Ë‡nR I•ÀmëÆjÜ$hqm³áC%);NÑÿ~g_)Qvš´( +ô“¨Õìì<ÎÌÙ¡°sé`çÅèébtôܧN„"ßóÅ…a'ð âq‰óÖ%Q6žŒ±;ìÆU/çc»ev{%’*^¾LÏ«¸ºNOŽçËy5&¡[žg"O<ŽÝgY\×úñµ¸êgQ¬(õ¼»^ß/~Í£_GÌÂQfð”;«|ôö=vXÿÁÁˆF¡s£¤r‡y>3çlôß¾Ó%"ìó­KQäY¿ê&™N˺ѦÅ`·Ï¨û@~0·\‹*nÊJÚxôœŽbâS…«ô>z¤ez‡{E8°"ï0LJNS{#ÞÙ(ò˜Ý[h§( |+ð-¸ÃBê®Ê¢n´ñ/ÓBÄÕröq­O«ë´,HX€xk¬8!së 12]-F"äC\&鈛¨¿­D7"y¯wpÜفA4@>øªDO7ÍzÓhÈ´áçÜEÁVê!í斛Ü^K̖i2žÐ pë›x­Ÿd&îÅóðÉýCá£*Ùmx>Æ/ +I'a!¨=dÆDî—îù( Y?š÷™(C7˜aÊ%ÜZpû…)SB¯þ]©Ž÷û >[‹Ugé'Q(RÒ*Wå¢ò¶¯œS@;0’HNj`‚ Lõ&\‹+¡c’”«M.Š&nÚ0]¸ÔCs•š>µÚ¶¬•óåR"1;«2·[…U–eåØãîMZ\ê¥w{™˜ªg›´Ähè€â‘‰Ê;Pۓz;ááõ:CWWm¦4 <\£²JÂà/ï؃•ë¢L˜ŸèM'éÇ1á® ÓqÑùýRT6"g +· +^jm^•—UœçmØ֕² d§]|“«l“ˆÝÈ£]À1,²ÝH÷ôPŽB¿m´ß TÍ$ +#´ßæ›ó,]i〹·kø6Å;álaá!ßÒÕ!Xˆb“›uɘե¡Î×JBå±,šªÌ ÷ý¢+Q-_Áç®>)ýÛÝÊ每Ÿ¿z1´ó÷ÞâÖµÀsBpÍgŠÁ%&9Z 3™“¦ •;Çs›ÿ1ã•õCS–Òµš™¸R®)Ç$Ôk4hʁhO¬Mp;ˆÈ×D›0÷ÏcBˆg›½ «M¿Ý¥Ôoþ<[ÌfóÙÙb9ûþÅlùüåé˜r¨7©{±£xånC­NM0!b~Ôg—þa³7OÆ ÐôGÎé f¹˜½Y<==ýñ‹¡!íCg>†«c lÑ`¸–1®wzúœJoê¿R tƒDÜ?“—¶*N‹fy&~ÝÈv;ª›Ü2m¶7ÐÃÑ”=dó½•i:¹4Q?[Çõaš«1 à*›LÊ"»ÕK© +²±Ò–oÛ]Êb-n剐|Y´4°eVw’­O”‰¼"GPÔïÐ4Bz+£ˆp¶ß OD~nêù¦XÉÂ×7ëÁ|ÉìkæÕ¬;P’#&ÜMR¸ÄțÞReh`?H<Æööö%xºI³Ä$%6¹¨Òk¸¶®¬?¿TÔƒLäÝ« 7"_Ë{§fc¸ƒlå< c¶Ëû=M>âa;éÈ ’Í}e@##È'¤wHÍ®‹ý~s½+ñýºÄÃ~€¹‚b*ý0±WÕÍÎ*Üñô3ãáî҆Ū4»khQÍþٞû@¶¯kyý«úó•›FÓ6Ñòu´ä`c†š”?(Ïy܁´ätúIT¥ ¤,€{XêtݤyúI ˓2¬¦ÖŸ·¼†ø˖àٍ!%,0%%:%¥®âkÕås½Žå˹¡EC{±í†ª=èê>†Y¡•¹Ðǚ3U畧Ԇô²¼¨ÉϽî-EÓ¢»´˜Lj +5 +:L<¢ ”%‚!é¡(ßaÂ* ØöÜB|;bÿg@%C8j\‰òí Ûϊ,îÎ(ζÊnˆý/àZ}ò1|0ç0B^Ðû†ŽŠ  X‘¸H´Ò²ƒ<}j^Ú)¦Dˆ¼mïÙ +õSI'Ñ60~þ”µq¡ÅJ­¿ß؟d-IWz0‘i¤NÓ ‰Œ[«ÕÆPc:JP´AW]:À€•Œ#¯Å[lX|ÿ6`GǦ4Ÿñ MG…5¥ÑWõ[Õ¹J5ŒŒ¢&ÅÀÑ¿l¤n)û*6âPPšx¤yGk´lÔ]5l$—î! )½×ñ‡ŽîrCŸZø.µüKÿTˆþFÂè'ÂPÓÊ„Æã÷Fˆèö=±b ý2¼ËgCg0H%ÿ Æðz/OvËÝÿf|ÐBÂÏýkFý%­È‡øÀô_2@3܎aíëYóê$7Çܾ°Ô_Í[Kýå§ZTå¿fF9‰‹Md%_«WÕöu8F€Oæí¼Î„-]íÙÇ>ý8RñÜÚKÂQÜëªiÖÓ££››´ªÑ¦H×J›£õ:;Ú狎¨ç UҎÑyY Kh°˜«ôöóñÿ?&açÒ +endstream +endobj +7145 0 obj << +/Type /Page +/Contents 7146 0 R +/Resources 7144 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7045 0 R +/Annots [ 7120 0 R 7121 0 R 7122 0 R 7123 0 R 7124 0 R 7151 0 R 7125 0 R 7126 0 R 7127 0 R 7128 0 R 7129 0 R 7130 0 R 7131 0 R 7132 0 R 7154 0 R 7133 0 R 7134 0 R 7135 0 R 7136 0 R 7137 0 R 7143 0 R ] +>> endobj +7120 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 454.693 244.968 465.223] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_0f5e373c7067f61d03e3a90724a6983a) >> +>> endobj +7121 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.738 454.693 294.581 465.223] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_0f5e373c7067f61d03e3a90724a6983ac4528dcb9794c502cf7c9bd65e9c54ae) >> +>> endobj +7122 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [150.585 415.839 255.909 426.369] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_abc43ede7fd0577eaeb7255a0eca232d) >> +>> endobj +7123 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [287.774 415.839 448.819 426.369] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_abc43ede7fd0577eaeb7255a0eca232d6a4badcfd0bb8d6e536fa16b2d5108d0) >> +>> endobj +7124 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [463.855 415.839 513.996 426.369] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_abc43ede7fd0577eaeb7255a0eca232dfb044a16e827afb114b4a2b9ba86fcbb) >> +>> endobj +7151 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 403.883 232.286 414.414] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_abc43ede7fd0577eaeb7255a0eca232dfb044a16e827afb114b4a2b9ba86fcbb) >> +>> endobj +7125 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [235.275 403.883 335.777 414.414] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_abc43ede7fd0577eaeb7255a0eca232d4d21924dceed7aac6368d4bc5affeccf) >> +>> endobj +7126 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [293.764 364.656 350.54 375.56] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_dda1de457524bc20064ace508201876c) >> +>> endobj +7127 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 283.893 172.361 294.797] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_1ee38be62a49852994bf906003b0c23c) >> +>> endobj +7128 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.176 283.893 241.819 294.797] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +7129 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 233.084 172.361 243.988] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_a682606a24cf76b2d13ef9d70b0b4dde) >> +>> endobj +7130 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.603 233.084 242.246 243.988] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +7131 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [350.937 233.084 407.714 243.988] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +7132 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.703 233.084 513.996 243.988] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7154 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 221.128 160.176 232.032] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7133 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [296.334 221.128 379.133 232.032] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gac82e7e0179442ef589f2fc61302d654) >> +>> endobj +7134 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 148.401 172.361 159.305] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_ee0ae23c1027e709991811b8398b9f46) >> +>> endobj +7135 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.91 148.401 244.553 159.305] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +7136 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [371.12 148.401 448.369 159.305] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7137 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.485 136.446 275.283 147.35] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gac82e7e0179442ef589f2fc61302d654) >> +>> endobj +7143 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7147 0 obj << +/D [7145 0 R /XYZ 90 757.935 null] +>> endobj +7148 0 obj << +/D [7145 0 R /XYZ 90 733.028 null] +>> endobj +7059 0 obj << +/D [7145 0 R /XYZ 90 691.329 null] +>> endobj +7149 0 obj << +/D [7145 0 R /XYZ 90 676.759 null] +>> endobj +1541 0 obj << +/D [7145 0 R /XYZ 90 578.366 null] +>> endobj +270 0 obj << +/D [7145 0 R /XYZ 90 571.766 null] +>> endobj +7150 0 obj << +/D [7145 0 R /XYZ 90 471.39 null] +>> endobj +7152 0 obj << +/D [7145 0 R /XYZ 90 383.749 null] +>> endobj +7153 0 obj << +/D [7145 0 R /XYZ 90 302.867 null] +>> endobj +7144 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F72 471 0 R /F35 2018 0 R /F97 2175 0 R /F98 2120 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7198 0 obj << +/Length 1573 +/Filter /FlateDecode +>> +stream +xÚÍY[s›8~÷¯à)…™Z–qÉLÚnÛIÛl²wgg›C@Nèbpqšþú=B€Á׉‰·0Ë÷é\$¬\+Xy7z5MÞZ†â"×Ò-e:S\¬ØAT'Ê4T>«„ ÃÔÆc¬žk«~6÷½sMÇjßß°0ó½ÑUæg÷Çǧ'çÞy¦GM¯b6×Æ:ÅêëØç\Þ~b3V¼fIÀ`R]w° +?íËôýèÍtômD@-¬B j#Û J0}þ‚•ž¿W02\G¹+FÍS7à+£?F¸4 7M£¸aÁ2 G±ua‹Jû.uâWß ùÙu©È§w#åó˜‚õÒ8iXóxmW½Ä—Ï7'PÃhÎ¥‰—ß/Øæ÷Žñ\ۄ¨Ašð¼wªBØk1$ó£$÷.îyÞ¥‘£|÷?F ó3ïÍ÷EƸP´=£ƒLËUÆÀ—–ž;J¯¾¾ØøìøøËRá ø‘çýBÎy4~ø¹pÌin8F šÃó§/ÿ>9=ùç¥FÀœéÉÙïbö5ÜäuòÖÖA]ײÌtÛÍM䚦ÔüÕm‡‚’–¡ú‰¸š]ù`‘i&­ù nüe”\ËQ|á âŠÇ5¢B XD´)Ô¦ˆÁÍB •ƒÚš9ˆbR™I±¥Ìü†Ir°d¨*À–/yøšX×FØ6«Þ%#›ºÕçbB»’f€Õ_YGËòïì6 òn Ç&È1mp,J¸r>ø¾ÛPé õ“Pƒ´¾V#Ý!Ë1aÙZÕ÷«A-!:Ä,R†:©±¢H+.7,äڎ2†Àà’ã‚0J,…Ÿ¬?1ì'³ÝïJx]G–©· –i† 4L JKWéâ~,ÉuäiV¬«‡y­ô0§MÞêÍt#ãJ‰Ú%6°„¶% ҀéTcvðö®ž‚l Ó¶£~cC9dhm§Oº`™j¿øU)ø²Ãu!3×j…‹°vHò•®Þ’Œ{SD~¯ô{¹W®°•Ãì­O,¿Í’²j’á¹ÒAÞ®‘Þœ­ •é nélx—þ܁[ûYäƒ&Ü»`ù#H Î\³Ì[ÿ„ƒåõÌ9¤gY%ˆ÷q¼Dz²ü™VZI JèïŒ7”«ò<+3džÊëÓVö›X½–ãC†§BA/Êe˜ÙmÍu•Ê½+‰\”ü@ُùá8Mâ2ÿ CêðÓrvÙ%Æz&:žw`T> ™¶‚¾þzÆ|âM +쀬 uûÂÆ Z;<` Ÿçcpå˜UÅâã äìÛ­l5›A²#ÿ¥€Ü=¢þ¤aÛ­jõ¾¦Su)üÁ¼fÉðüÖl?„çK]¸\¶7¤[ª¯Ægóž>öéÝ×ÝP®O(J‡-‹ (Üγ ªî[®w;’pÙçºns0E„®ú +ltô•&²pÝWä7QW¿ >°­ºw]OÈ^ü¸'öäY´Œª·û—c¶…(²KðØ ? 7Š(šsÍ¯XoÐìWÁƽú‡0äê‘Õ–G×6‹,]¯$År¸ë/§«ä©÷˜{¸ú?ò–"ù߇+,ç}¸ü{w“rÖSŠûeŽoáÈ¥Âëû|ÔDF½}ʃâ4LDõ¾Rõ¢ÔdÙj>0Š‚(4Œ Š¬ŠÃ=Øðzë$GÁށ¢YLŠ­®m`×Fj+ê=Qe#- Ø}ÝDX7^ߍÊ~ôz$ˆü‰Q¬½ÝYÏGûòÄEâv빁0~Rh)E¶„‚“÷ðR~°D­{ºÒê@ƒSͺâë9ˆ€ÊØñŒ`ý4҂iˆ³ëaduø(Î KËsUêB@.žV¦ž¼Íæ%ÍÏ«CU­ 8Y•þä,{¦Qª–î:õ“ºü€Jܳծ ÔF餍 H/¬*̤eÿ*Õ݇QáЕ¾Ä±¥uÖºÉóÅñdrww‡Žn“h‘¡(Ÿ,ñ¤åÆ5« mד̪šgžfuöƒ‡s³ÍÿÿìW|Ô +endstream +endobj +7197 0 obj << +/Type /Page +/Contents 7198 0 R +/Resources 7196 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7209 0 R +/Annots [ 7138 0 R 7139 0 R 7140 0 R 7141 0 R 7142 0 R 7164 0 R 7165 0 R 7166 0 R 7167 0 R 7168 0 R 7169 0 R 7170 0 R 7171 0 R 7172 0 R 7173 0 R 7174 0 R 7175 0 R 7176 0 R 7177 0 R 7178 0 R 7179 0 R 7180 0 R 7181 0 R 7182 0 R 7183 0 R 7184 0 R 7185 0 R 7186 0 R 7187 0 R 7188 0 R 7189 0 R 7190 0 R 7191 0 R 7192 0 R 7195 0 R ] +>> endobj +7138 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 719.912 172.361 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_5da8e430d26c6471590e2c7ae5f7d82e) >> +>> endobj +7139 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.849 719.912 245.492 730.816] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +7140 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [301.932 719.912 379.759 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +7141 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [436.747 719.912 513.996 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7142 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [249.57 707.957 332.369 718.861] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gac82e7e0179442ef589f2fc61302d654) >> +>> endobj +7164 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 658.144 172.361 669.048] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_3805575c5d920cbc808cf34e44c11fee) >> +>> endobj +7165 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [199.698 658.144 258.148 669.048] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >> +>> endobj +7166 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 619.663 180.109 630.194] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_a4a79e7bb87171b31d49429f9d875dcb) >> +>> endobj +7167 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 580.435 172.361 591.339] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >> +>> endobj +7168 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.1 580.435 223.907 591.339] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_40f18b846fb1fe73b63da7fa7cbbbbca) >> +>> endobj +7169 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.244 580.435 309.694 591.339] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >> +>> endobj +7170 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 541.581 179.554 552.485] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +7171 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.052 541.581 250.666 552.485] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_ff27d012a01487b7c9c14a9a3b40d9b1) >> +>> endobj +7172 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 502.727 194.208 513.631] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +7173 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.948 502.727 311.935 513.631] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_a9f9e9fbb372e1f21bd0472b2db20567) >> +>> endobj +7174 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 463.872 170.687 474.776] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_dda1de457524bc20064ace508201876c) >> +>> endobj +7175 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.185 463.872 243.314 474.776] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_8ccc13c9fa8f27701c935b481a371f89) >> +>> endobj +7176 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 425.392 170.687 435.922] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_dda1de457524bc20064ace508201876c) >> +>> endobj +7177 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.185 425.392 235.712 435.922] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_f46e579954688eec46ac0a43029fdaa1) >> +>> endobj +7178 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 386.164 214.681 397.068] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7179 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [225.421 386.164 301.724 397.068] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_3800cc1eb2fb15d0c42dd71740bb661a) >> +>> endobj +7180 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 347.31 196.709 358.213] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gac82e7e0179442ef589f2fc61302d654) >> +>> endobj +7181 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.207 347.31 276.688 358.213] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_162d95e1149e222a317370e2fa25a120) >> +>> endobj +7182 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 308.829 155.265 319.359] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_4d480f0b906eef0c0094c8fabc69a3b3) >> +>> endobj +7183 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 269.601 278.681 280.505] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_3aa58c4d8ded71e574db9d1c59533300) >> +>> endobj +7184 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [282.497 269.601 348.14 280.505] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +7185 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 230.747 273.002 241.651] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_0bf7e46a624f9d9df1528ae0b47ad55d) >> +>> endobj +7186 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [300.34 230.747 357.116 241.651] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +7187 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 192.266 194.567 202.796] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_e60e06beac90231262189084333bda57) >> +>> endobj +7188 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [221.904 192.266 265.411 202.796] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +7189 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 153.038 198.443 163.942] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_3a010e69cfabe1a026ee21f7639207e3) >> +>> endobj +7190 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [225.78 153.038 303.607 163.942] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +7191 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 114.184 226.268 125.088] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_ea40406b8f95d9ca4f61f23598448cd5) >> +>> endobj +7192 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.605 114.184 330.855 125.088] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7195 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7199 0 obj << +/D [7197 0 R /XYZ 90 757.935 null] +>> endobj +7200 0 obj << +/D [7197 0 R /XYZ 90 677.237 null] +>> endobj +7201 0 obj << +/D [7197 0 R /XYZ 90 638.383 null] +>> endobj +7202 0 obj << +/D [7197 0 R /XYZ 90 599.529 null] +>> endobj +7203 0 obj << +/D [7197 0 R /XYZ 90 560.674 null] +>> endobj +7204 0 obj << +/D [7197 0 R /XYZ 90 521.82 null] +>> endobj +7205 0 obj << +/D [7197 0 R /XYZ 90 482.966 null] +>> endobj +7206 0 obj << +/D [7197 0 R /XYZ 90 444.111 null] +>> endobj +7207 0 obj << +/D [7197 0 R /XYZ 90 405.257 null] +>> endobj +7208 0 obj << +/D [7197 0 R /XYZ 90 366.403 null] +>> endobj +7196 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F23 340 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7251 0 obj << +/Length 1862 +/Filter /FlateDecode +>> +stream +xÚÍZ]w›6¾÷¯àª³Ï©I 9»Ùr¶žníš5ÙvÑîp,'¬<“z¿~¯„À‘í„8mo ñ~?ï‡{×ö^ ~¼œüÌ}/F1§Ü»œz1öBN£Ä»œx†„ ? Æxx>"x(ª™HÎGË|y#'•HÞdW•¨–§§o_Ÿ'çՈDÃò*—³Ñ˜2<<ËE]7§ïåTšÛ²H%¥4ÂC‘Ñߗ¿ ~ºü; öˆƒ…(ô™—ÎþÆÞþÿÅÃȏ#ïܚyõá˜{ƒßت„×UcxM5‚9 +üÈ ©0g~)e†}ûœ÷aÌ@×[£a6±÷´LÕµî½Y¥ª¥JʹÊfÙBee‘ÌʉÜ&§~Ä ï$5|·Nâíš4!÷ÚãÉÏ!õ"P•ZUJ¨7&Šƒ ÑôB*ëu#›“uÑG»¨ÔŒ :Ø]‚CX’­¶ÛÜuü´kSޕÜ.FƑ7Åd¿‹®Ê2ßNjP®þˆ1‘»0’Ö.ÅÄE†™¯ õ!2u :ÑâW¨f­Ï=†â04ÁHCD Äùˆ‡Á†h›å(@)$‹äóû56Œ» 2“ñ›2kÊê&KÊ¥Ôc!GŒ“½šp8á0ÀÅ,ËêVٜT#?Êz‘«æ’%uv€¨¿m#që!‹Ž[{ÙA£¹Y¸Ìzqgwy»ãÑ#ŽpöK¬OTÓÀVGóNؚÀßÿìTŠ:ƒ ·Ró3î{©Uaó­m`S®‘¢¹Ñè³U¡í„` ^_6L³©=Z!¤ÎΟ³ZՏ¬œAŒ€äð°mé6Bù‹ù¸Xk+Eþ`:ø·ïcæCjåÇ*ókvJÚ*Ûcr8XnMÈì/·fH{~Uuç0⬪<⫪‘ƒe•Çä`Y]£cêªé wÕUŽÉê*CõÎ…ãÓÊ*°$@‹AÂÌ»O(ú1¹WW×»\貫)¯œ{wÃÐ~œÙ‘&¸w¿~᙭M"Ï·l”£-ªLí$-š~ekܓ“' ÇH,¢N³,™,fóg¶Þ_U¦º‰Êµaà(â]J®Õäô4•Uåb†ç+T74¸8{ýº9m,=· "d(±Ï÷ëJ­·Ö_i¦¦0S‡,ë‰|xÇá‘ê`ú¼“½ Ï ïo€—:'ÃiÓ Ì\!Mqàï‡{Hý ¸Åîœî†;,Óz +„mH&‹TNš®–{l”W‰r#)FböÂB݇‰ùö¶n1 ÁZ:±âcŽbzŒfìsŠè3Ç£rZc´4-Ôˆø|9b BqìÜM_÷¹…á:~Uµ±Ùv>õ"Me]OùK—«am*òÚIYÏÃ+BUÝeµÙÄy$Š0FaÈzîIÏ䬬–Iý'µœË‡íH«RÁPfŸÍŠäj©KÞœ£»–ÓHb½:t}¨96b¹ûùFx{3Mó̀Æ<åÊöúÍX}í^‰ÁÔDõJGv¶‰ÉÏJVÅ7âóþŽž‰Bè7´×úg¯¿I(Žø×m™¨ÏQÄØǞú젞?~eíå•sãcù¤¯wbîì±"ÇP6òø]¦n\["Ðww̖®î +ùQ?OÆÐÁ=SôYY¨ªÌ“sCQ‰™,&Ž!÷·ÄvzþZª$µ”æ-•>»i.a~ƒ£‹Vÿ?k*¸5pßhk:¢vŸUTFêNõ{[bJdõÆÊ*ÕÏÛßkp }ü?×h?πÖ)„¸k¾> endobj +7193 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 719.912 229.446 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_fc1e5cbd96d9c2819ba1ec2151f3897e) >> +>> endobj +7194 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.261 719.912 316.06 730.816] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gac82e7e0179442ef589f2fc61302d654) >> +>> endobj +7217 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 681.432 187.583 691.962] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_49625522da117289c0312c67060210f2) >> +>> endobj +7218 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 642.577 201.7 653.108] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_gdf9d6f17d8974c81e3499f170e7762a2) >> +>> endobj +7219 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [202.198 642.577 225.072 653.108] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_21e9dae374ecb009d8f7f268f5e673e7) >> +>> endobj +7220 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.29 603.349 249.272 614.253] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_22183a1ac7a9af9929c6153e2a7a659b) >> +>> endobj +7221 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.358 603.349 321.181 614.253] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +7222 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [403.975 603.349 449.992 614.253] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +7223 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [484.029 603.349 513.996 614.253] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +7254 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 591.768 135.27 602.298] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +7224 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 552.54 179.255 563.444] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +7225 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [189.994 552.54 248.434 563.444] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_485bfce228009ebec2a7bd83d695eddd) >> +>> endobj +7226 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 513.686 179.255 524.59] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +7227 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [189.994 513.686 260.629 524.59] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_3601b97efe162fca1df11d70b0b3d607) >> +>> endobj +7228 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 474.831 192.664 485.735] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_7f2b2dce631b12fb46f6f1fa719e6c84) >> +>> endobj +7229 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.48 474.831 242.497 485.735] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +7230 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [273.44 474.831 319.457 485.735] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +7231 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 436.351 150.493 446.881] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_b5ff957e959947c6016cd28be6e2fadd) >> +>> endobj +7232 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 397.123 181.845 408.027] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_bd1a41cf267b29ebf81851eb096dc6de) >> +>> endobj +7233 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 358.268 181.845 369.172] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_1ef2a882e1f0a3121f94eea90a9a16fe) >> +>> endobj +7234 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 319.414 154.727 330.318] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_8a238e31c3b4acf8a023a6346bbf752f) >> +>> endobj +7235 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 280.933 176.505 291.464] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_abfec033a504656ea05620f485442b1e) >> +>> endobj +7236 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.408 265.939 450.955 275.844] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_1ef2a882e1f0a3121f94eea90a9a16fe) >> +>> endobj +7237 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 230.747 191.718 241.651] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +7238 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 230.747 288.852 241.651] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_25be5d5e126674d8aca8b9ec828e289f) >> +>> endobj +7239 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 191.892 191.718 202.796] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +7240 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 191.892 303.079 202.796] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_b151aa3732a4737e63c5142b42159dc3) >> +>> endobj +7241 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 153.038 156.281 163.942] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_623847fa141f97cd59f3d85627536379) >> +>> endobj +7242 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.097 153.038 218.547 163.942] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >> +>> endobj +7243 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 114.184 219.234 125.088] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_abc43ede7fd0577eaeb7255a0eca232d) >> +>> endobj +7244 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [219.732 114.184 311.916 125.088] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_1e73b39b2848f8141aa58219cf97dead) >> +>> endobj +7245 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [315.731 114.184 422.161 125.088] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_0f5e373c7067f61d03e3a90724a6983a) >> +>> endobj +7248 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7252 0 obj << +/D [7250 0 R /XYZ 90 757.935 null] +>> endobj +7253 0 obj << +/D [7250 0 R /XYZ 90 733.028 null] +>> endobj +7256 0 obj << +/D [7250 0 R /XYZ 90 455.07 null] +>> endobj +7257 0 obj << +/D [7250 0 R /XYZ 90 416.216 null] +>> endobj +7258 0 obj << +/D [7250 0 R /XYZ 90 377.362 null] +>> endobj +7259 0 obj << +/D [7250 0 R /XYZ 90 338.507 null] +>> endobj +7260 0 obj << +/D [7250 0 R /XYZ 90 299.653 null] +>> endobj +7261 0 obj << +/D [7250 0 R /XYZ 90 249.84 null] +>> endobj +7262 0 obj << +/D [7250 0 R /XYZ 90 210.986 null] +>> endobj +7263 0 obj << +/D [7250 0 R /XYZ 90 172.131 null] +>> endobj +7264 0 obj << +/D [7250 0 R /XYZ 90 133.277 null] +>> endobj +7249 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R /F36 7255 0 R /F98 2120 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7285 0 obj << +/Length 1939 +/Filter /FlateDecode +>> +stream +xÚ¥XI—Û6¾÷¯àÉC½×b×N.ٜ—L2Ócwr±óô j!æf´ºóë§ + Eª%¹Ÿb)ÔòÕWïÁ#ޏWßÞ_ݼNV^äI˜x÷[/'^šÐ ©w_zï|JƒU´XRBˆ· Äg}ÍÖw‹ømõ´ãeÏÖ¿ˆMÏú§ÛÛ_º[ßõ šùí¦âõbÆÄÿ®bRšá¾åz™7¡a˜?ÌÂÅ÷?_ýpõñŠ‚ZÄ£Z8 ÒUìõÕ»?ˆWÂüÏ Vyæíõ®Ú‹ÂüVÞÛ«ÿ]k™š“‰i”$A´Ê¼4\$‰}ïÃ0Ö×»sÞ»e ¶~ÒŠÒ®¡NýƒUîÞ…I®ÖEÛ¨¾­ÖëYÍx$7¾'19+ÊÿΊǾ³þ}A)õY5ðSAÁX/‚h:Ûà~o^§¡—ùI„æ‡aD¡·¤QG‘±þ-W64ڊECT͘£µM ÄqÙ*Ȳ .҂>95/M‚,ÏÝ®àŒž3‚‚y%©·ŒVWVSŔ(Œjwærã_y½ýôøõÐJ´œ]sŒ‚%ºãs æҋ(EÍ ·®ÕSǏ JÐÝ4ÈcK}—"ùôÒ@Bühº:*-/«Ä_\ž¨Qž:Pj@ʽñë‘씦·‚„ygɼ‚èN& ¶—ùž+&*G(ßsYô¢S–ˆ/SÊ7¶òˆGôºñS£4Ã=8â@á Œ4.Ê¡ëÚ^™-^ƒ­5@ÍDSôèA±ÊН>×VƒQ¿4ÃNÏi–Ù‘åðcÃ$FEŸhÌÆ|¦5}&í+S „‘E¨/®ì8e¨]ku®ã@ß‹Pà›b·„ùå¦ܪâÅ®.°£$²îƒý‡¡RVÆÖîž, `nÁµ·áCH³É¨¶œÙba£Áf|’BÊâoºôµ4SÆ>,ô7o†;\ƒöU”šúeŠ¬Å``ÈU*3Êٖ XGÛÏËÆh<^7Ù3Cí‰XŠ\D3ã³0KäÂ,u“fÁ†Jg*â„âÒíÓ¸ x€) ü쨧§ê í2³§ö¼ªÌÈ͘ô5L €Ë ›T(mk7Ÿ4MßŪC†B¨ºàz^»]J×ã^—gGBÊÿø äœEƲyI±yƒdiá[č¬CºªÊ ‡®\úÿRÞL4 ^ÅÜìÒ ¡Ña7¤€#ÿˆøˆËh¬Ìn°©k¥­öúlkV{>H;Õ1MC4²LÔ)Úž7:êN!ý¦hû§"Ç*¨:%‚Šd~Ù6è*’úûoÌ*lºIø¨Ñà#& p…™Ï‡IÁ¹ô¾‡ç£èß"Ör¿úü +…5‰ÑU!MæÞF1SVA &9«Ç´h©„•¥°GRÛ¥‡ÿ*ÒI§ß­©í?påôÑIós| Ø™$Lé¸ýTqNÅÙÞ¤;¯”<u*·—*çüQsü?ho!š½ôoP÷·gä)”Qón Ï¡xZKõ[Ľí§{8.l¡_æã7Éû-bhýìӇ5ÔNlÊšnP„&qãÄËiË>xnôï+ý4<èK³4XþÜØ)ÕÝÞÜì÷û ÁЈ®„ºéºêæù¿)ðMG!Û±éhݟ=¢ÉZGâ™ÿÿ›`u +endstream +endobj +7284 0 obj << +/Type /Page +/Contents 7285 0 R +/Resources 7283 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7209 0 R +/Annots [ 7246 0 R 7247 0 R 7271 0 R 7272 0 R 7273 0 R 7274 0 R 7275 0 R 7276 0 R 7277 0 R 7278 0 R 7291 0 R 7279 0 R 7280 0 R 7281 0 R 7282 0 R ] +>> endobj +7246 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 719.912 224.993 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_42acbf3b42263a3dc137395dc8fe1421) >> +>> endobj +7247 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [228.808 719.912 334.132 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_abc43ede7fd0577eaeb7255a0eca232d) >> +>> endobj +7271 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 639.15 203.075 650.054] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +7272 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.573 639.15 296.324 650.054] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_28dfc886a103ede666395ab45fc7950c) >> +>> endobj +7273 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.488 624.529 334.373 634.434] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >> +>> endobj +7274 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.349 531.109 226.034 542.013] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_30c23ab257a58da3708591becad2bf1f) >> +>> endobj +7275 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.176 531.109 379.626 542.013] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >> +>> endobj +7276 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [140.284 492.254 162.65 503.158] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_6ba0be34c122032442a7409f194e157d) >> +>> endobj +7277 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.835 492.254 342.367 503.158] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >> +>> endobj +7278 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.909 492.254 513.996 503.158] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >> +>> endobj +7291 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 480.299 149.666 491.203] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >> +>> endobj +7279 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [265.411 270.947 342.66 281.851] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7280 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [264.006 177.607 322.456 188.511] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >> +>> endobj +7281 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.912 148.028 329.362 158.931] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem) >> +>> endobj +7282 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7286 0 obj << +/D [7284 0 R /XYZ 90 757.935 null] +>> endobj +7287 0 obj << +/D [7284 0 R /XYZ 90 733.028 null] +>> endobj +7288 0 obj << +/D [7284 0 R /XYZ 90 658.124 null] +>> endobj +7289 0 obj << +/D [7284 0 R /XYZ 90 658.124 null] +>> endobj +7290 0 obj << +/D [7284 0 R /XYZ 90 577.361 null] +>> endobj +7292 0 obj << +/D [7284 0 R /XYZ 90 442.979 null] +>> endobj +7283 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F11 418 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7300 0 obj << +/Length 1976 +/Filter /FlateDecode +>> +stream +xÚÝXioÛFþî_ÁO-¬Æspx¨ÝœT ÜƱ7V‹ i ÐÒHâ†"U’Šüú}ç$)ъî‹ýDÎõÞÇ3ƒ½µ‡½×g/fgç¯Bæ%( ièÍV^‚½($ˆSâ͖ÞŸĂј`Œý›Á~ZmÓù͈b¿Ì¿lIJJço²»*­¾L&W—7ó›jDb¿¼ËÅv4¦û/ó´®õï;±jY D)±Oc6ú8ûùl:;ûóŒ€XØ#J ¡ˆqo±=ûð{K˜ÿÙÈ%±w¯vm½€2øæÞíÙ?ÏðI•(C8ä•5J]‰í¥ä›û­¨Ò&+ =ñS¹€™¢ÑS %°ÓÎ'=Zˆj(è£Ï5Ödò²,=Îçætº¨æoá+¹Ÿ¿â¸£ÈB"Ò@Ë"wC—+ýúgW)&õ÷z¸¬ÊܬY>5RŽ°–<0ã£$ A}ŽB«¾5XYMzG[ Q9F˜3MàæÝåËË·¯øö´ b”Ä!¬¨³°e‹¬XëAµÏÒêË&ˆ$Þ8ñ¨ï2ú_uÙo£„úi¾‚ßnʺ΀žâóˆruиrUVþü~Ĺ_ÿoús~;›No¦·³ùô§×Óù«7×£ûRâÙ)_“ˆ"žPëìÛFˆ¨›Ñ˜ñÈ˵ÐÎ÷rªnÊåß`3_»ù?0f%$®ïʬhj»ÆñRŒUF gˆ@qCd$܉•òæ>o`+9´cÏc’ €F’J‚Sf˜¾¿…ÜùM$ǐŽÕ8 +~g90P…·+L`ºÈ Š}C ÅxH‹ÙôýìÅõõ/'ÅÆ"8vi:Š@ÞáþCsW–Ÿ{0k #Z ò6é•mf²2¯nªý¢±éñ©Ø¢?ýÄ +Î\~8êz!PP–çøΛ/;Sz6g1ô³X£Áþk@’ñ˜Ù=7;ºd@…¨¥‚h€O£Èn=@e@ ‡1íçÁñ°ËÁkÍÇ…Ìì}±Ïò¥©H©þ4U&Cðs–æÃU YŸt+âl¡ñÁa˜Ð‡áÇ–ƒÄ¯ÄŸû¬RõR*õw›>dÛì«0³óSÞýK,MW†§™^틅óWq×ü!G˜Z·g†Q0—Ù  PLõG31ñãz—.„–{_,…™-ŒÐ Õ©*Tª6QHJ +ݯç“Ôԃ4Ï'PÏ ÚÛË*[gE¸Åž,0¶²ÀofÝfÏîšlk}V—ù^çÙí¤×ë'µh&NLS¡½¼x¬ôPŒ‚6A@pÙ÷|k<ÍKUH•³)ëÕgø‚6™0H¦0‹‹™f“ÕaCC`ÒÉJ,­^Ö쩪)kU¾ôÌ}ÖlŒrÂ5¨ØpÁ„S0Pt*‚{âu¼¾« Þ!ÆÙ&(§ ¡Ä¦Ÿ“6®ëf9™ä¢X7›¹¨*pÌ ¯GѶ¦Í6U)-po¼­†œB«íQ0QLºƒ-„XÖFy9©Öæ–òN™¦WÑŠ#wjÐ\…ÕÜ£t³-ÀöR0+§ ¶H}šDá´eÚ6b»ËÓÆÄ!1ìKœ ?°€ÛWàd ¬·1\¥üËb€"ÔIFCþ1@‘@˜qÇó¯7ZÞ Bô k=©ûF Eôtï#sìöĊXà´ïCa +e¯[h°m€bÑ't]îÐÍ°EYÂÈ©&}!|} ©²ìUÏo…™þn€€7G ZÐüsZÕL!Æ)9ÁôMVˆ´šOvú®_×zu—è:kP•ÄE4í!åw³ÓÀ>rT:ri™&“¯¢*»yd^`t4%œ‡þµìÙW…(çWår(¶‘MÉݺ]}h&gÑÓ5¸ºxyuùûÅìòúíPÆdäy0/40/+r0ÏÇoßV-È ‚P¡… à—É ‡Ëäì&•yýY~¹h¬\j{ó±€nI«ó#eZÚÅ%æª*·š‡êî’C  P¿2ÉiÙüål_©…¬88W¥Åz ‡Ž)¨ÎÉ8þ“Àåy¯BÁíuè‡cŠT­¸›Þ­¿úÍ@ß.Ûdq Åe|ÎÊûmÎơ̈ÄPÒ¢£Ìê[—  qÁ›KÃl׌ˆïb_OvB»Ç&B¼mÏí¦>†BZ#AlЭ¬v.L̵ýÞ.Eà¸e¶%ÇÐ{øA(‹½vِ! SÆ<®w=)9x¾•2­„{sѱ$–Y–æ›~’­Mô50Phbmb;µâ‘ð?Œ«Ùÿ7®îEÕéG¸‡©§€î³G§y?j‚pàX\8ïöŽg~F;ˆ k£ºI«æûµ•«»Ü©\ßÐH‹ÖUȂ‡Gñ&Ø ÍÕ ûŠX7cj,Šå³Õ{ž +‡/ÿa ŒŸúð¯üA@‹Íƒ?OçÁAäÞÈȔˆÓ -äÔCƒ;õà×ZTÝÖ«´ØÛ{™ :È«6 0‚ŽOõÕI]Éo…0JjÍ>yöï}ihå%q„X 37M³›œŸßßߣEöE¶«P֜ïvùù±;T3uZ¢uζ´++`r›ßäÁþÿüŸ +endstream +endobj +7299 0 obj << +/Type /Page +/Contents 7300 0 R +/Resources 7298 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7209 0 R +/Annots [ 7295 0 R 7297 0 R ] +>> endobj +7295 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [278.651 282.035 406.173 312.879] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_28dfc886a103ede666395ab45fc7950c) >> +>> endobj +7297 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7301 0 obj << +/D [7299 0 R /XYZ 90 757.935 null] +>> endobj +7302 0 obj << +/D [7299 0 R /XYZ 90 733.028 null] +>> endobj +7155 0 obj << +/D [7299 0 R /XYZ 90 716.221 null] +>> endobj +7303 0 obj << +/D [7299 0 R /XYZ 90 716.221 null] +>> endobj +7156 0 obj << +/D [7299 0 R /XYZ 107.713 637.39 null] +>> endobj +7157 0 obj << +/D [7299 0 R /XYZ 90 625.271 null] +>> endobj +7304 0 obj << +/D [7299 0 R /XYZ 90 610.701 null] +>> endobj +7158 0 obj << +/D [7299 0 R /XYZ 107.713 533.907 null] +>> endobj +7159 0 obj << +/D [7299 0 R /XYZ 107.713 506.012 null] +>> endobj +7160 0 obj << +/D [7299 0 R /XYZ 107.713 490.072 null] +>> endobj +7305 0 obj << +/D [7299 0 R /XYZ 90 473.345 null] +>> endobj +7161 0 obj << +/D [7299 0 R /XYZ 90 451.033 null] +>> endobj +7306 0 obj << +/D [7299 0 R /XYZ 90 451.033 null] +>> endobj +7162 0 obj << +/D [7299 0 R /XYZ 90 273.068 null] +>> endobj +7307 0 obj << +/D [7299 0 R /XYZ 90 258.498 null] +>> endobj +7298 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F95 1788 0 R /F65 376 0 R /F8 504 0 R /F23 340 0 R /F11 418 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7313 0 obj << +/Length 2123 +/Filter /FlateDecode +>> +stream +xÚíZ[oãÆ~÷¯àSCÕx.ÇM l‚ÝÂIܸY(²»¸m±‘(…¤Öëüúž¹p8#Q´œEèÅçvÎùæÜ>É8zˆpôϋoî..ߤ,’H¦4îî#‰#‘Ä)‰îÑ»˜Ēɔ`ŒãÛ Áq^¯óÙí„âx³zZ‹:ŸýP~¬óúéêêæúvv[OHo>®ŠõdJ9Ž¿]åMc>þTÜzº¨æJi†cš%“wß]¼¾»øõ‚€Z8"Z .`<š¯/Þ}ÀÑÆ¿‹0b2‹õªu”PÏUôöâßؚ„}Ó$÷L#$,”!œrc_Yµ³OyÝhº½—o8ö6² )`Fï¸[ƚ¦h͇ͽy~šPø”9ß|eÆÊjQL?«?…Å¡]ævk^ÛÃ曪i뼬Š…]³±Ïü{Ñ×êãGOæjW4hτÀö©µaJ$Db,Ù|üߘÙDÁ•˜ »Šy[*¹Ÿ´Qfø~WÁè¦2oï1Ǜ­zÏW¥êâv뢲¶?–íÒ|Z÷Úµv«vÏ*¥ßå›Ìӊ&`AÖi…Í‚@ïɌt @2Ž MJ·ÐX·XoÅ6T Bä!6`òºü-ïÐý¤<ÀD ɝ‡Þ¼úïõÍõϯî®ü×>‚@\d„)K9â$¤¨H½íõçy¡i®‚ÍGP&XÆ0ÄíM»¸ºZÕC»œu½©ÇQáÅ`½Qx¨&ª Ȝ}sb¶Áh‹õv™ñÈ`t"¾Õ*qAÔ>m‹*_ PíãëjàDÈjŒºŒò!Ä$w!òÒîç°ÒnL…”C«V¾é®{¦”7ê±/ æÈÃ|ª ©;•ÁÓIŠ¹³?8=¢ï!¶ê¦:2…néô]Ãm_; *“|ÿ<¬“i*iü¤ˆ¼ž½þ¼5­bcB •,þˀPÂ1¢‰³Ãö4ûB%Jû»þû€›Š¸pº[læaP|ˆá•)ýŒnWW¿õÆÏôûÒ¡ñäÒǐƒ³ÿèõ +³Ûoì9Z8¬ÖnMp:MÀ¶lÌ6hýRy¼9£è 9‹ Œ:/{WV+ÀëÃ@b˜2…<˜nZÚ¾ó›]¹‚ +;M’4†œOC¬˜mm¹ƒ]æ*Ô>•Õƒ™´uAMõÙq gàRÈgJ?´Âq_oÖF†Î¯JB_ÓÔ°J¿j´/+ւ²ÚÛWçÕÃ@ã:¥ Ø ï"?µà½‡¬è/HPЛ`ì.öo‡'&H2?Üúë +Ó³„…Âs¿ Œ<×ÏÂ+™ßmºˆi¬òj1Ú Ȁ4‘¦‡® +Eȱ¾i¯þ@ö䄫[€t–)êTÁ6²œþu”+;à +ϕwsóvcë³õ}õ¼rµiTThLhl|î3äu6Ôû©]–Í1tɉm)•PÊeÈ/½šr‚pâd¼êÚùj»ë¸™ÜaàH±ãàm^·Gìãןöâ÷“ŒjA£ÝÕ´£­< Ð³”WFâ6MA«iÑEÁ ìû2¬>gÖfýgÖfý£¬_pÃÃᙛGÀúÕ´]fhºð;$=Ý»ë×;ë×ï*ßùûäû^Íd8Ñùa¦%Âk / ûŒŸa—'V,Hjj¾OjzQí óvü[Í 0~½®1ӎ{pýS˜x"}Âö»™¸b# ÒÆ ÿ½_õ|÷Ï8?×2åô…ÄV¤Ì²FÃÑ$Ö%.@õ[ç³·OMkXE6H#eüÏešy3 B†¨”žR:ÞªN=ä­k/:&“°e\>C]ëOF©+F¤ï¡<5N¥§àX ó,Ӏ&$9Þ#½§pÖ pêKõiϐVñ…œ5¤¢DR”ᎊòŠR¹•yj*J©GEÕ¨OEÕ{׎Óq*ª¤žPŽHï{†‰ªsMHÃD¬kž”oµÅzЄO7æC½½R2ÜKjõ@è!œ2Fl åÏA SßPð°ÏùRbHÏÄprß)vF Ñ^KÊl›ÑM߬¸fe‚ÓÇê¾È›Ò}^›z Ð>C›ŒgÚt¦MgÚt¦M£´ KÃbài™Ü#"Ò¥*;×ÂLcÞ çŸì²Ž1©3}Æ È:1 “±¬übú‚¯Œí_ô³#ãÐe§°:ì ûÿN”fP´²Sÿ›Hÿ÷ÈJ¡d²Ìþc—ˆód/‹Ý*S²¯U2¯–/™—ÿ4EýÕh‘Eå&¯v]zSX,ëþ¶Œ¨I:À`qü¶è­±ì—¨ûô½‰¶^_’ÍëÓ²m·W——hÞ ]UnkT¶—ÛíêòÐï½STäô?’t-ÇzS»¡ap­søþÿײÿ +endstream +endobj +7312 0 obj << +/Type /Page +/Contents 7313 0 R +/Resources 7311 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7209 0 R +/Annots [ 7296 0 R 7308 0 R 7309 0 R 7310 0 R ] +>> endobj +7296 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [278.651 647.797 406.173 678.642] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_28dfc886a103ede666395ab45fc7950c) >> +>> endobj +7308 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [278.651 373.994 406.173 404.838] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_28dfc886a103ede666395ab45fc7950c) >> +>> endobj +7309 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [278.651 115.299 406.173 146.144] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_28dfc886a103ede666395ab45fc7950c) >> +>> endobj +7310 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7314 0 obj << +/D [7312 0 R /XYZ 90 757.935 null] +>> endobj +7163 0 obj << +/D [7312 0 R /XYZ 90 602.936 null] +>> endobj +7315 0 obj << +/D [7312 0 R /XYZ 90 588.89 null] +>> endobj +7210 0 obj << +/D [7312 0 R /XYZ 90 329.132 null] +>> endobj +7316 0 obj << +/D [7312 0 R /XYZ 90 315.087 null] +>> endobj +7311 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F8 504 0 R /F65 376 0 R /F11 418 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7321 0 obj << +/Length 1696 +/Filter /FlateDecode +>> +stream +xÚÍXKsÛ6¾ûWðÔJÁ€€zjÓ¤Ó´™qc·—$£¡EXâT"’¶£ßŃH”ìæ1“ƒF .öñí· âhá跋_n.._‰8RH *¢›»Há(qJ¢›,z7!Ål:#ãÉՔàIZmÓÅՔâI¹Ù¯uV¥‹?óÛ*­öóù›ß¯WՔÈIy»ÑÛéŒr^P GĪÁ”Ä0 µF½ÑÛ[PÊê÷ê¾X6yY¸§_ËåýVMj§@E?£ ^V D¼¨ãŸ2ÏÜëÿ×[óùr£S¯É{Ì1üˆ9Ìás¨ +ÊX%ÞåÅ&/ô·“ãÁÎY»uF$(s/¼Õµnj·ýD%â8nå¾Ç89!%I»§YçõȹT †ûM¥3éV»ýñ>ݸa»Ô¬ýZSåSÊ'y»|ä»Ê: Ù8̸BRro—ëM+¤Þ¥K?Ìr`ÝE4÷8¬Œ :¬r ?¡ ¢½•xÄÄÀ Èûiè̉)¢|Ð5 CCŸ™4ËÖÞEgj½H‹laPµ …cçm\9îö.šýN;íÕ0Ê E‰­}Ûû 79é±Ò"5ğĈÇI¦Ÿ³¬Cu<õvDšDLÈvC¡ NOÜG\áQgüQÀ­Üdã0óp)ö§BìøD/›²ha¡ÐqÑ!& +Ü:cóéècžnu£«z¼ßË ¢C$J°·J„9xlðBà:ጻÌ﩯¼w`›¢´'l#ˆ1€;¬Q¯ÔËOK½3ìù|»˜¥z´ÖM6Ÿot±jÖ ]Uàë3f&ÑDôfV¥ —‰¢“üÎýƒ%y± €ž±ø<MŽ!B[Â0ð 0;LŽß[¨Áò2½¯ýN‡+P +¥Yÿƒm¶€;}R½PævOwÎK¦’V+_Rßژ\ÎƼ38ýtH%Ã*t[2W\(À +¥Á€ûÑðbÎ{×ŜµÆšù¡ëÌÒc¾Ù¸•[ífšuYûÍëÔp䃉¥_jòÕZ׍›Í‹Ì¹Îº¸v;Lb¯ +Y20³ž ~šÎvÑ{·–VzŒ]ó"o xmö.k Ÿcš*… +• ìëƒ ëC|ÜQP¡>³>4å"/½ÒÕQ©8U ¬Ö΄¦ŠÂ™y +ëÅu[7©JºüËiUØ -”Ââ©ÚA`‹z—kÓ¹„œü`"×êç¦H…„ßrY¥C‚7ÝÀ1#¥’1{Uc‰b.Nµ;Æõæð•®ÎT«óÜJ ¶]gP8>ƒ\mÑ8dWp7¦›<[¤Õʶ¼ç^q øQ’•‰#Y VnµŸé"àÇ<©õ3<ôMBVڀ‚ТlÜ`YVÐÛíJ[õ¥gO˜OÝ_ëz)Bª4æˆ@’y¤K†PPF¿F— ±<ßB&`®`°"L„ ÁŽ"¦ä3 ¢ã(ÙÀ},“ÑÔgà?Ê»*°1ÇÔ«ø©¬gO!M\’¨AËè2×ý-˝1t¶.3Æ ÆÀ™â@ÁÓ æÑÕdô&r2c &?þÎXË&¬©g¾Š§¼÷hJÎyQ ûø¼vBSwǍ?¸°Á¼Ù»gÓûØù)™Üùaã_ïZ„aÞºJ^ûvHÂM—ñ0Ýqm-^U:mZnÖéasúÚၺ§˜?ƒèâ\Ž3?b!Ø3AíÄ ¨À<öT°˜õ×ûºioO£4C‡ß'áXw Uò)šàaÂÂÞà™,ÑÅ;°Õw#ˆábÊä¡Êa a`âk1“Ðu|丹0Wê‰o¢¡~™Ã.Ô #>¥ "*~ʧ¸/'eрÜÚɅÌu}¸=ÄSŠQ`H)fÍ^§šZ>1]ªw…ŸJ~ê|6ú¦|BSñM‹.¾‡ßX`Èç~bµŸVá(TKÿi•ásvðeáÊDÈ°léÇ=zr׺úqjŠƒÏ–´è¾öqwãª÷P ´`†ÔHðk­½‘β£vô‡»ñöú™ w^7Ín~yùøøˆ–5º/ò]…òær·Û\§Å@ +€3é„ܵ€¶e¯€É­ýn|äÿÿ£7 +endstream +endobj +7320 0 obj << +/Type /Page +/Contents 7321 0 R +/Resources 7319 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7209 0 R +/Annots [ 7317 0 R 7318 0 R ] +>> endobj +7317 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.639 503.642 300.161 513.923] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1MIP__Problem_28dfc886a103ede666395ab45fc7950c) >> +>> endobj +7318 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7322 0 obj << +/D [7320 0 R /XYZ 90 757.935 null] +>> endobj +7323 0 obj << +/D [7320 0 R /XYZ 90 733.028 null] +>> endobj +7211 0 obj << +/D [7320 0 R /XYZ 90 716.221 null] +>> endobj +7324 0 obj << +/D [7320 0 R /XYZ 90 716.221 null] +>> endobj +7212 0 obj << +/D [7320 0 R /XYZ 227.842 663.468 null] +>> endobj +7325 0 obj << +/D [7320 0 R /XYZ 90 647.047 null] +>> endobj +7213 0 obj << +/D [7320 0 R /XYZ 184.963 468.335 null] +>> endobj +7326 0 obj << +/D [7320 0 R /XYZ 90 451.915 null] +>> endobj +7214 0 obj << +/D [7320 0 R /XYZ 90 342.602 null] +>> endobj +7327 0 obj << +/D [7320 0 R /XYZ 90 328.338 null] +>> endobj +7215 0 obj << +/D [7320 0 R /XYZ 90 215.02 null] +>> endobj +7328 0 obj << +/D [7320 0 R /XYZ 90 200.757 null] +>> endobj +7216 0 obj << +/D [7320 0 R /XYZ 90 89.441 null] +>> endobj +7319 0 obj << +/Font << /F63 374 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F8 504 0 R /F95 1788 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7332 0 obj << +/Length 1629 +/Filter /FlateDecode +>> +stream +xÚÍXËrÛ6Ýë+¸J¥™ƛ„vm&É4M&nì®ÒŒ†– ‹ Eª$Åýú^à›–c'éF"ñ¸¸ç>ˆ½[{¯g¿\Ï.^Iæ)¤$•ÞõÖSØ $A‚ïzã}œ‚_øc<¿\<ò}´º\P<ϒ»ÞäÑêm|“GùÝrùî×ËÕe¾ á<»Iô~áSç/’¨(ìã½ÕÕ´NׄRâ9 åâÓõ›ÙËëÙß3jaTjˆLxëýìã'ìm`ü‡S¡wªVí=Nü'ÞÕì÷> ‰2„¥è@BI닁•Å›…ÏXøhËe¡ËUvó—^—±Ù[‰Ó«í1…,µRÿį³´(íëÛ8ÕQ¾ò pÐÚ•”pê½üz°6*Šj»1Ü3³ðâ•X#"8ì®vvM:¡`BZ¯%ˆ]$pg‘P†´¤Ü®½Ò¥sZ¹Óö¡ÆH…Á(æn¸Z­Îœ]U #b¤kO 8]1V¯AULÔNÀò å܃#‘am¸µ>MŠeos+¤g?Ð)À +d©ÖöE¹Y.ãtÁÁQoVQ~{Üë´hÓS\ ¤_ïòÌXèdì^Œ·æ_9+Â@qˆÖîqƒhçdX’m§L¡*xpÞtB ¸5qáN*óx]&wVúm®£²¯š*wQZ?i;?ÔËƦ)Š¤û!Úf­3íº‡*ˆ§°:Ì&€q¤BR¯)w ô.†!½F‚ +‡%>‡šª~‚.Áo²,±ê>>¹ãbUDe\ +Á•cҹʦêÍ&öX}ÜO©;½þ쒪#3NâòîŒ5C! ~”5¿1¿`m€ùõA—ÇÜ$þ0Á†!['Vˆ° N¥ü¨§T’ˆãF§*WÀ QºqöHg™zª)Fà(ûpÈ;½&›7ѓqÃ9"„OÇMèâf ««2*ÅS#©ÈÛ¾#„ÞC}ÛÇÿèâkœ÷.FJIçÛàAßö‹t×·Ìîýj'µ¹àü™w¬e¦LÔF·ðŒÕƒ +…ç¹.ŽIi³­Ӗ–ÂO²ƒMSìæ;ìÕHK'ÌO1FËóI1d„’c«å*Ï7½;È®TD{ ”í‘t¶S™§T½¯²Ð[ +q]w»ÏucûÚÅëÝSî§8q<ìÆͼ¦7C[õ úNGŸð º÷À¢†=5°Þ§õ¹ ã׸êi_Fq:Gtëf6ä"#v¸ÑçA9 -¨°—÷vax¤òû@ÁÙ>N ¬~\3(~LTðÿו†ZŽI7´õ°ígH7}ˆtK¨µ–wÉU^¶L>ʵÒ\'ý8"u!öÂsàd{3ßvDŸŒ¸õmÃÆÊJ†˜ Q6D¤ýQô4sauÊÌ$Ñ¢˜SÓL‹`GµÜ·.xËrž™wñÚU³H‡©’ÚÒu#ó ]‡æ*ÕaÕiÑCZ •×mmï^ ÍW°}ý{Þ¿VÕEՐ¢,¸rŒÂÿèóË&ÛCµZé<·¹/©CŒ¨P“Yýø cã›csþð¥ Á á·~Ÿ¬H‘è’"! X´ÜKã°îµŽXûêÂÖ¾üQèü§¤ƒñ.JQÒ^0m/ÎÛï5æC¢öVã3HŒ+­H‹ì³W?ýfïõ@âšTޕåayqq:Ðº@Ç4>ä(./‡äb춎 ÜA#d[wŸ}–;øq +ƒûêž7²ÿ¿éuœ +endstream +endobj +7331 0 obj << +/Type /Page +/Contents 7332 0 R +/Resources 7330 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7339 0 R +/Annots [ 7329 0 R ] +>> endobj +7329 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7333 0 obj << +/D [7331 0 R /XYZ 90 757.935 null] +>> endobj +7334 0 obj << +/D [7331 0 R /XYZ 90 733.028 null] +>> endobj +7265 0 obj << +/D [7331 0 R /XYZ 90 626.773 null] +>> endobj +7335 0 obj << +/D [7331 0 R /XYZ 90 612.289 null] +>> endobj +7266 0 obj << +/D [7331 0 R /XYZ 90 522.338 null] +>> endobj +7336 0 obj << +/D [7331 0 R /XYZ 90 507.854 null] +>> endobj +7267 0 obj << +/D [7331 0 R /XYZ 90 407.949 null] +>> endobj +7337 0 obj << +/D [7331 0 R /XYZ 90 393.466 null] +>> endobj +7268 0 obj << +/D [7331 0 R /XYZ 90 205.732 null] +>> endobj +7338 0 obj << +/D [7331 0 R /XYZ 90 191.249 null] +>> endobj +7269 0 obj << +/D [7331 0 R /XYZ 90 89.441 null] +>> endobj +7330 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R /F10 473 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7354 0 obj << +/Length 1757 +/Filter /FlateDecode +>> +stream +xÚíXÛnÛF}×W(P€µÞ —!)8và´I]Ûé‹4¹²ˆð¢òGùúÎ^H‘夭Qä¡‚Hq9;sæ̙YaëÎÂÖëÉËëÉñ™Ë¬.u­ë¥`Ës â”X×±uc‚ŸÎÆؾ˜l‡e..¦ÛEºY‰¸ ¿&·eXnæówïN¦Ä·‹|:£Û'iXUúòR,…z&òHHÛ^ØÔ÷¦¯ßLN¯'Nx‡-¢¼áò·¢lró[1üþƈ¾u¯Ve–C|§ÖÕä÷ ~02Êvù629ˆ^TäU=˜Ú¯E.Ê°.Ê'úþ›‘¿=¿X\èxoS‘ÍçźN²äk’ß-ÖE’»0Çð!2Rps>Üø£·‡Çg÷ü–Ë<äRG/»uSæÉЀ«v S}cö“—Ë¢Ôi B8àç‚eeñÆL¯h¶«ø¤]S¯’jÄ7À3 Ý¢#½i²4ßÆ 1%Üþ’Tu…T†ÛíägFŽ¨ïXðbž«mž~‰ØÌ/o}§‰<€­` lUÇóy\da’/DYjHzùQ´]¯ÊbJ¹}/qfÔN¦Ä^Ž ê@ö€ºˆ¯]¢ÊŸJVÕzÿ¼PÄ^…’‡Ÿ%²B?RT€'[âéßdf·$P{¹Ôë•ÐïƒÍ ¥¢°þU; x2ÐF‡ŒmòÛ¢Éc–ú[; UX'€AC0ˆ "ƒ”³¹ŒX3ÀÏgÎN]RS—Ÿeñ ìÂòOK1LÊN˜6BªO +±”F‰%#í?Ñ~Xå`‚\¿ÍJÞd#±ó|lKAÁæPŒ¸â£„ÍPzgS‰Ôئ<@o© ò±MSŽ³å(‹²×Ӓ™‹§sò&ÉÓ$Gxcä•çJÔՈM(5ìƒ3¤5FZ¤Õš0Çì¸È÷öã}ÀNUèhëUh‚%ØrQà1_-†÷<߉‚WúÎ { \ È⮇(8ð@£=Ì»^£zÌ`K€þP¶dÛ$…|q ~†fÊ)©Úp„©Ÿ"m¤ô™òZî<6•n—˜Òý†ÌRr ZãrçǓY"Åé}leÇíkl;ם• D±aߋ\ë+™‚¿Û¥õ›cÀ1B#Ý°úeÄÏAÑCŽˆç>¬Ìt±1èl4ð†ÅvØ»CMš@f?7£Îõ:Ö¿O*aЗ ßéÌk%aš|c ÚñÀκ*•¬}ëœA'ìZ92²Ã¥Þ·‚mzPzdæÛ¯½Ú"^œ‚RÊ͈áOI?ÿîüÓË«ÓVG†LZ>€å:jN™}ù¾©„—M’¶“ŠH@&ÊÁhòä³,-˜9Äpdꖈl]›ºH‡Å1u¸m +dϽ9µ~R˜Ú3Þ£e•ëƒjw ;Lù¹¤„é»^\mªZdc¶žDÕcÁßþ÷tÃVÒ՝‘õÐ̬ڽÁ©FXªª…ª/‡ëê{?z8—"’áo¢T,Îs9¤˜‰›,Ûìep÷?S²HüïýËTcyÿ &8̌íá°ëöªšÛVZõ­ÑW}ó¾åS9X¶¼ ó¦ýƒR©ÛSYucLâp&”¡¡)Lgؾ­FéÈ>YíÕ/ÕpzÇnF܍8«º^ϏïïïQT!P„u‰’ú:Ññ¾8÷¬Ó½ÎH7ÆdEiÂOrø1S£ÚÅÿ/– Ø +endstream +endobj +7353 0 obj << +/Type /Page +/Contents 7354 0 R +/Resources 7352 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7339 0 R +/Annots [ 7340 0 R 7341 0 R 7342 0 R 7343 0 R 7344 0 R 7345 0 R 7346 0 R 7347 0 R 7348 0 R 7351 0 R ] +>> endobj +7340 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [121.93 218.534 280.942 229.438] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +7341 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 163.778 187.853 174.682] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_60ae86027d4480aec07a5eed85f6977a) >> +>> endobj +7342 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.511 163.778 257.154 174.682] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +7343 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [341.035 163.778 426.424 174.682] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g616fcdc7600a3a11a8a9152e75730899) >> +>> endobj +7344 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 125.033 187.853 135.937] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_16829d6b83d0c21f3d3e1f87c46ac239) >> +>> endobj +7345 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.19 125.033 293.017 135.937] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +7346 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 86.288 187.853 97.192] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_f5aee1171c6c67b9c57f3949b7b75be8) >> +>> endobj +7347 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.668 86.288 269.495 97.192] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +7348 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [291.024 86.288 350.969 97.192] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >> +>> endobj +7351 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7355 0 obj << +/D [7353 0 R /XYZ 90 757.935 null] +>> endobj +7356 0 obj << +/D [7353 0 R /XYZ 90 733.028 null] +>> endobj +7270 0 obj << +/D [7353 0 R /XYZ 90 626.411 null] +>> endobj +7357 0 obj << +/D [7353 0 R /XYZ 90 611.89 null] +>> endobj +7358 0 obj << +/D [7353 0 R /XYZ 90 491.601 null] +>> endobj +7293 0 obj << +/D [7353 0 R /XYZ 90 467.232 null] +>> endobj +7359 0 obj << +/D [7353 0 R /XYZ 90 467.232 null] +>> endobj +7294 0 obj << +/D [7353 0 R /XYZ 90 417.991 null] +>> endobj +7360 0 obj << +/D [7353 0 R /XYZ 90 403.47 null] +>> endobj +477 0 obj << +/D [7353 0 R /XYZ 90 305.515 null] +>> endobj +274 0 obj << +/D [7353 0 R /XYZ 90 298.745 null] +>> endobj +7361 0 obj << +/D [7353 0 R /XYZ 90 182.697 null] +>> endobj +7352 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R /F95 1788 0 R /F10 473 0 R /F11 418 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7406 0 obj << +/Length 1392 +/Filter /FlateDecode +>> +stream +xÚåYmOÛHþž_áO\"5›Ýµw×Fד +”Š^ 䤫 ŠŒc‚u~«ãòïov½6I0ŽsJÕ/±Ç3óÌ<;³ÆÆÄÀƇÎÞ°38ä¦á ‡Sn ¯ ‚Ä(1†cã¢K2Y¯O0ÆÝÓÁ]7‹ÜÑiânÎoüqæŽ>W™›Íww÷—nõˆÝMâ^Ÿ2ÜÝÝé´8=ó¯}uϏ=_êŽÓ¥¶Ýû:üØy?ì|ë°DYÃ&3¼¨sñcøÿ£‘éØÆ­’Š ‹šp óÎ_¬=[=*O5lð”[ÒSB„mCPaÎ +o÷fA8ÖVºÚppª8IK¯,Vy•õLÑõ½¹ñD?W¦óiîGÅyr]½$žæà9ëºAœO‘rø1‹‡ /Ó§q‹ÂÑDŽç’R¶¢CF-›èð}è}†•£Sm?ؾø HHÛ.1ÃÊ>}³F‘ûàÇ~ææI6:/¬Qµ3™‚6RëÝ +¥SÄBŽeýO®‹«hmü'2¥ +pB^¿>E môß4cxæ{2´þè(Ngyšñ,Šæ/ +ãfµôìXþ¸šÚOâI6“dØ«÷Z«Ê«Ìÿ™J©uÐ…bz‹³6¤äÖ*ڙ÷à·K"¸I¥¡/ñ¼ òù¨èYêÔyK‚oßõ¥ Àhq°#Èaº©Ø?ù|úéý?GÃ/m3'Â|ÖúÍo|݇Õ>FA#Èm°)"˜yêõóBdÉL†L»¼¿aÚŒk˜W=%#0‘O¡ÕïƒNC7÷ ³ ?¼—£YVeØï…Ä’&Ž˜-*MóԏÝH‡ç(Îýì{ÂšÖèfb¼|òG²iÕ[ÇDÌaËIќû¶EÚ¤¾ÛKîV‚ñ¼¹ìr9§KÑXo2áOåçjL{—é BÌ¥è4êݹJî*Ò±Û¤ŒÂ£õا˜ ,Sí”d«ÃïjJ†8ü”³@Œë;P¸ñf]ϳØbezìæà=ˊúxÒÙ-´?‚üþ®Qha$¨Ø”ò„…§Q·[QˆíŒÎoÜÔoä=ÆÁö0Kd$w´„ö}E ²M±†Ðtì\5¥=ÁÔlGhàc¡1õÎmÚJbï@·š +%ðáùÙíW+†[•‡;ñrw’ÄnØ¢JGÜq«„"›Æ*¡ˆ²æe_ê¨z¤i¦b¢]‘HOŠҚ‰²ç⯫HÊ€“Ü´PX=½`Èv¦0â´ê”\ Uëç0 úÌVs˜T×8‡m…#OÔd=b7›—Ãs:ï[»3OmDòzT Ys/–¤Å¦âÛ'ô‚-ŒØl„,‡}Xߐ Á$Žü¸¬ªtq PE¾o’ûݟÁ!ðÛ½nøÝ*™èc³fôµÇÕ‘ßӚِ¼¢E7׍Рȕ4MÐqZ x%1\iWǸ9 ’¸Ä2ÑÝ<¸*’ÉPn–bD`dó-nv¾@’m7ÅÞ©ÌÒ̞'5ÉcÚÂÉ#6Jž·f8ÐÒvöesi9›Ñà.~C,¸· +“‰kZ„Uõí&Ò¶ØrdQkÚË䬫ä*IÂæ–àŽnfa8*ˆl\ŠõËõò—æßÕo­‚H춟ZÕ'U‡f®øx,7ÈØ*gŸ*‚Î"Ý.•vêKýùX÷ØS?û­ÇXW×ág7ž•Ý‘ Åw©ÊÏ$+bD0¢*â?÷˖·ðì_£<û³£ +éÞ^b dâª1½Éótw0¸½½EÞÍâ ÍPÒ4<œ=´@¦‰JÉ5ä˜2,J2í~ß°w£Õøÿo•Š +endstream +endobj +7405 0 obj << +/Type /Page +/Contents 7406 0 R +/Resources 7404 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7339 0 R +/Annots [ 7349 0 R 7350 0 R 7365 0 R 7366 0 R 7367 0 R 7368 0 R 7369 0 R 7370 0 R 7371 0 R 7372 0 R 7373 0 R 7374 0 R 7375 0 R 7376 0 R 7377 0 R 7378 0 R 7379 0 R 7380 0 R 7381 0 R 7382 0 R 7383 0 R 7384 0 R 7385 0 R 7386 0 R 7387 0 R 7388 0 R 7389 0 R 7390 0 R 7391 0 R 7392 0 R 7393 0 R 7394 0 R 7395 0 R 7396 0 R 7397 0 R 7398 0 R 7399 0 R 7400 0 R 7403 0 R ] +>> endobj +7349 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 696.002 187.853 706.906] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_7358056031cb08692ae07044715987cd) >> +>> endobj +7350 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.19 696.002 291.333 706.906] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +7365 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 657.148 187.853 668.052] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_89d5bd03139c8fcaf1ab035208d680dd) >> +>> endobj +7366 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.668 657.148 267.812 668.052] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +7367 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [289.899 657.148 349.844 668.052] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >> +>> endobj +7368 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 618.293 187.853 629.197] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_d5c6d64b009045df8248bcb8ffeea69e) >> +>> endobj +7369 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.19 618.293 299.642 629.197] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +7370 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 579.439 187.853 590.343] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_42e87760e6f69306e6322cc77f20d162) >> +>> endobj +7371 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.668 579.439 276.121 590.343] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +7372 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [302.631 579.439 362.576 590.343] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >> +>> endobj +7373 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 540.585 187.853 551.489] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_8ee7e3364443dc8cd55f3f6388c81ecf) >> +>> endobj +7374 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [239.4 540.585 298.956 551.489] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +7375 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [343.756 540.585 419.222 551.489] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +7376 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 477.82 187.853 488.724] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_9bb0903a2b33f94b096f71e604f07648) >> +>> endobj +7377 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [226.965 477.82 245.565 488.724] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +7378 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [259.699 477.82 292.426 488.724] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >> +>> endobj +7379 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [349.973 477.82 425.44 488.724] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +7380 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 427.011 187.853 437.915] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_691bb5ef88a4c9638034de4c1b9532cc) >> +>> endobj +7381 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.19 427.011 235.444 437.915] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +7382 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [264.724 427.011 340.19 437.915] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +7383 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 376.201 187.853 387.105] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_25b59f3491de4996c701bbf044746fe5) >> +>> endobj +7384 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [227.508 376.201 272.668 387.105] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +7385 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [349.702 376.201 425.168 387.105] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +7386 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 313.437 187.853 324.34] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_5d2426c9804102311d41fd445b122cf9) >> +>> endobj +7387 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [220.334 313.437 292.602 324.34] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7388 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [353.289 313.437 428.755 324.34] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +7389 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 262.627 187.853 273.531] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_163f5dff452c6cf2e3a0c929eb2b8187) >> +>> endobj +7390 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.919 262.627 307.862 273.531] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +7391 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [346.496 262.627 421.962 273.531] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +7392 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 211.818 187.853 222.722] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +7393 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.592 211.818 239.399 222.722] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_91cfad066b0e12cdaf7454fe4585cfc5) >> +>> endobj +7394 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.736 211.818 340.678 222.722] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +7395 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 172.963 187.853 183.867] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +7396 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.592 172.963 239.399 183.867] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_2f41d86c5a949d903179e82072854ef4) >> +>> endobj +7397 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.736 172.963 326.292 183.867] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +7398 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 134.109 195.601 145.013] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_9dc9e3a464def0e2d929fab9cae6e360) >> +>> endobj +7399 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 95.255 241.112 106.159] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_ee8ba0ffc68e00046b55e12427c582cd) >> +>> endobj +7400 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.449 95.255 342.392 106.159] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +7403 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7407 0 obj << +/D [7405 0 R /XYZ 90 757.935 null] +>> endobj +7408 0 obj << +/D [7405 0 R /XYZ 90 281.72 null] +>> endobj +7409 0 obj << +/D [7405 0 R /XYZ 90 230.911 null] +>> endobj +7410 0 obj << +/D [7405 0 R /XYZ 90 192.057 null] +>> endobj +7411 0 obj << +/D [7405 0 R /XYZ 90 153.202 null] +>> endobj +7404 0 obj << +/Font << /F63 374 0 R /F72 471 0 R /F50 339 0 R /F65 376 0 R /F35 2018 0 R /F11 418 0 R /F99 2117 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7429 0 obj << +/Length 1884 +/Filter /FlateDecode +>> +stream +xÚÅXK“›F¾ëWprP•™”ÊÁuÊN²åì®sY»TV#yD–}z ÐîÆ媜€¡éé¯ûëǀ{;¿N^ÞN.ބ¾£8¤¡s»rbìð F‰s»tî\BÏ¦Á»ï§»I¹Iæ炙E¶_‹e™Ì—‹2)÷³ÙÕÕ«Á«)‰Ü"Ÿz”a÷U–T•¹½+¡ß‰<J7c—FñôÓí»Éåíä˄€uØ!ÚÆ÷™“n&wŸ°³„õwF~9;-µqêÃ5sn&N°Ev|ÕH9u"@ +)¡1‘épÈ Ú·+°Gn½ê&v·€Ä[7Yf֋•²ñâM÷… qÀ.ZÅGŒ}#JB +a3+S¯eedÑa¶BI¾ÑCŠƒNf?¢…£ˆw²2† •¯IZX²6ËæuìBhä}.–}1‚2oQú¿ ¬ËF<ª¨EZN})ÎsXŠB·€p–;Y‰‘"‚Hì·JVIVmåùÀB 9dE1‹{[Ÿû["Mâs,¼xÃp/ٖRÆßi]”æ¹Ú&©ÍqŸôŒ +Cèz­M×F€`'D1÷#SXIÌ…Än1ƆT7òzRC’“3ˆø`:e¶®\µ˜}5؄DˆãðFƒÍ&‡¤n¦4 U˜Õ ï–˜õ¤´öù^ä¢L2ù-ÑdןhZÁ»Ž¸pß©ynüžäÊ¥{óhi8©îíÇÆ÷ í1N‚ìyFbÐÐLa[ψ»êjŠ—¡Ç6“©¬3Sƒô;E!?¶±/k•8KóµÌ¡½i™V_‹@­)jM#ЊF dÌ*¿Ç"âÞ…*Ҫȍò•â¤Z\ +h¨4—ù}WúTÞ©ÁKYM#w)WSÊ\˜  K͒¶QTêë¦¤ëub_|vY¤vÂQòهŠ†z¯y¥ Y'%ÔgQÊoÚÝ ~±7¯sÙ­¬Ð0ìT*$#¸åf›‰ ¼Ôü|n›­øÒÈRyJ?f¢*kÙ5‘ÜV܍€ýöíwUєP¡i—•·T'y¯IPÛ$^©6Y6‡:ò¬kƒå×EÚt6·¨TËh³ÛªíºÏwNÕMÛÀ|•KðH^óz¿µ%À šYßßy³™wßT#nâE¸›¸~éÆ©ƒD„H·xD v¼›!¤L÷_S‰j1¿4±5ŽPÐiþ,»±±¯œbÄCúdû>\½ýëòúærDSS4íw(2¢ |׺“y&s˜BÀ$lQú4Ò# ˆšÑuÐç_62[Z. ©FVË붑5¹T)ckZeW‹c1±Ù֖󦜎g» ·qhš‘å„e' hÖÕìÌÀ5ˆÔXw:¥Ö¹ÞÆ!7bÞ:õ¶E +­Gt›kOá`ý‘Öo¼”«ו‘î“—ý|dî¬gíõô‘eÈÎsaڇm!ÞlE*UÆn-ÑOžû$Jè­ÖE“Ùú¸°zªŠýê‡Ùu?œU.¿¦BÏÊÿ‘ñ¡ìTõr6ËD~_¯ç¢,Ô#ôà=z”…òË΂“«‘4 hÚ+rƒ¢‘ÃfÀH…hS³cÊ&ù*7ÍÆF ˌ!í°ß£Z·›ïáЧþ¯Dª q›ýpHµë²Íª.Ûhk?'Ù ($åÂFz Tåh“ÕÏœÁ^·ó‰Mã|:Kšö¤;$Ê?ðhûìèïs<ŽzXýhšt3ÞÜ›(nöU-6mÿ>m2pFä‡_ +éXŒ Ý£§4ú!ôQä?ÐÚD?¨UYl$¨zˆÛú˜v^ª†'NvTtOhC]’õq&ŒqýLE>lÝ7ïÉM©­:?¨+¥v"e:"'è¶IÙ ôCœëÄÇ¿=ÃÅ$zê_Oýw“õ« ‚ň±àÈú÷*ãUÚÇÞ m.š‡•(š2æZL$y“dÓîÇQ[<ºhÃQ#j~Ìèu#„i}vÚ»ß&:eö’ˆ#w9³®ëíìâb·Û¡´BP­¶%’õÅv›]œ†¬§…ˆwJVm4§Ã`XÜèÙüÄÿÿlˆñ/ +endstream +endobj +7428 0 obj << +/Type /Page +/Contents 7429 0 R +/Resources 7427 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7339 0 R +/Annots [ 7401 0 R 7402 0 R 7422 0 R 7423 0 R 7424 0 R 7425 0 R 7426 0 R ] +>> endobj +7401 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 685.043 255.488 695.947] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron_6b1f2d6606a0b4d4fc8bbde3b24ce553) >> +>> endobj +7402 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [282.826 685.043 356.768 695.947] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +7422 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.841 584.972 252.783 595.876] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +7423 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [454.44 529.315 513.996 558.381] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +7424 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [335.826 517.36 409.768 528.264] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +7425 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [302.324 505.405 361.88 516.309] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +7426 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7430 0 obj << +/D [7428 0 R /XYZ 90 757.935 null] +>> endobj +7431 0 obj << +/D [7428 0 R /XYZ 90 704.136 null] +>> endobj +7432 0 obj << +/D [7428 0 R /XYZ 90 647.723 null] +>> endobj +7433 0 obj << +/D [7428 0 R /XYZ 90 479.876 null] +>> endobj +7362 0 obj << +/D [7428 0 R /XYZ 90 457.564 null] +>> endobj +7434 0 obj << +/D [7428 0 R /XYZ 90 457.564 null] +>> endobj +7363 0 obj << +/D [7428 0 R /XYZ 480.093 277.647 null] +>> endobj +7435 0 obj << +/D [7428 0 R /XYZ 90 260.92 null] +>> endobj +7364 0 obj << +/D [7428 0 R /XYZ 90 142.427 null] +>> endobj +7427 0 obj << +/Font << /F63 374 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R /F50 339 0 R /F31 472 0 R /F10 473 0 R /F95 1788 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7439 0 obj << +/Length 1312 +/Filter /FlateDecode +>> +stream +xÚíXÛrÛ6}×Wð©¥f*‚ üÖx’LÒ&ãÖê“ãñÀ,sʋJRqô÷] E2´-;qÒÎä‰ ˆËîÙÅÙC`oíaïõìÅrvô*džD2¤¡·¼ö$öDH§Ä[®¼sŸÄø|A0Æþéœ`_•™º<SìéîF¯Juù{rUªrw|üþýÉàӜD~‘Ï”cÿ$UUe›êkÝ|Óy¬ÍÚBJŸJ<¿X¾½\Îþ™°{¤±† $÷âlv~½ô¿õ0b2òn›Q™PÏÔ;›ý1Ã÷zFÂ!ïy†(b_æÝÝ^,Cÿæø¤È«ºTI^_žíªZgÆQ°r&HîÌùÉt½’¼g2ÁHDF6#âÊx!*»¿Ì|ã]œêË7ùf[O,+ÀsIÛI«m–í&VfoGÄ XHPD»¥Î“°ÿQ¥ÉêR•ë-„«¾ÉÑ^B,oÊ°Ém›ãð‚NKPfb‚>Xghÿ7®«3Ínukh¿Î„ˆÃªß«ÎŒoKá4˜:sàeisI +î‡H +Ðö’”KÄù8­O½†}ÜkK?öÕq}ù«ÒåÏsÎ}çý;•oUjۆo>š¥ »ŒÇˆ`D @xdé™ÖÎIëÙß^ÛúmÖDuo/1QÅ]Toêzs|tt{{‹â +módS¢¤>Úlңϳ¶· +”å}j\·r.+Jݞbè̔)aŸáÿ/Ù½$ +endstream +endobj +7438 0 obj << +/Type /Page +/Contents 7439 0 R +/Resources 7437 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7339 0 R +/Annots [ 7436 0 R ] +>> endobj +7436 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7440 0 obj << +/D [7438 0 R /XYZ 90 757.935 null] +>> endobj +7441 0 obj << +/D [7438 0 R /XYZ 90 733.028 null] +>> endobj +7412 0 obj << +/D [7438 0 R /XYZ 90 597.974 null] +>> endobj +7442 0 obj << +/D [7438 0 R /XYZ 90 583.841 null] +>> endobj +7413 0 obj << +/D [7438 0 R /XYZ 90 427.031 null] +>> endobj +7443 0 obj << +/D [7438 0 R /XYZ 90 412.898 null] +>> endobj +7414 0 obj << +/D [7438 0 R /XYZ 90 229.164 null] +>> endobj +7444 0 obj << +/D [7438 0 R /XYZ 90 215.031 null] +>> endobj +7415 0 obj << +/D [7438 0 R /XYZ 90 89.441 null] +>> endobj +7437 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7448 0 obj << +/Length 1626 +/Filter /FlateDecode +>> +stream +xÚÝX[oÛ6~÷¯ÐÓ&3ËHIÙhƒvH×vÙê+Ò"PdƦ‹'эýïw(R²$ËnÒ¤}ؓ(éðð;~çØY:Øùuò|>9y)˜¢PPáÌoœ;¾ ˆSâÌÎ¥Kb|:#c÷bJ°•Ytu1¥Ø-Òí­\”ÑÕë二ÊíééÛ·g½_S¸E>QŽÝ³4ª*3üSÞÈúŸÌc©uûaèҐL?Î_M^Ì'ÿN Ã©ÑpùŒ;q6¹üˆ|å`ÄÂÀ¹«¥2Ç£ ž©ónòǵŒ2„ïX†(ògÝa«¹Gܘã³"_–kmëÕ»m¥d¦í3@r‹æ;ýñäeÈ;ˆ F~‚d-/+#Ó³Š0DÒÈü«bíàx§òê<_­ÕˆbLÛI‹u–mGT3ŒÔ3ÂÏ×Iº°ÑŽl€›Ì`eýÔdF)ã)á. Nò¥c•qW=.nÌ3n½Y¡Ö‘ziëÈù­_&Éoe™(‹J5bÕ*Šíp‘d2¯’fB³b+º[º ¯FÑæÝÀ‡3ŒÂP8 Ž„„6Ñ¢L*YV§½é;5ýLC04@˜Ó^>t¦ô¢TÐ&zÆ+a°s)ŒkáÙq©ù°0¦¹ ¼«föΧh:ó8sϕù‘Ø™y¡q•raóªk |Äü¬^©‘Ìb¼M¿kGëÊÂ0QÔ«D*šÕY0cD Z{»ªRå:VëRÚ¨gÑÖ ®å0÷ª‰va%ôŽÖi: Ï>V (oñãQž1ê»4ÓO·C°¼QÞÁÕÐCTï¡åJ¡²…ÓþI–yŒ>JBÀ8°là÷Ù ´lug•jBªçÒMZ’v¿ü4²4^› +j»’9 €yîy®t;‰ÝOu4ÓqýT´Æþ2ÖGQ„ýv>Š¸lA"A€C¥3„ 6h<.“ºY f +Èücü:h_D¬ÅZõ[UÛ7_›~oì}õÞ–l@/ú´ÑŠdEeá® íJª¶3‰¢Éãt½Õ¾êoÞc³½t>Øg‡PJÅ¿·þ(%X[é^¬9ܨCQ’ӂªãÀ"ø†%ÀŠ ¥Ë²è6ÛÕ.3ºmDµÅy‘%@F¶ÉÔ8u^cü3E\_A³Ô õ‹M,W +2óa»Ç„Åéi*󥺽’eY”ǼæCMÛ5óÛ²Ðýö&rN]è¾áɌSô»‡ô·ÎÒ`tfPA9ïðéf„3àláy-ÑÿÅRjÞЊíÚ Ž;›$[gæ+ Rý·EF™-Z肉™YÔ£…Ÿù12~ ø«ë  øµLæÇX•ò0C!n+ÝR Ô(öw5ªv‰G1âuÆt\rÂåCg¶ë±ðŸ¶n=è@bê¬øÒ#À¡J¥ñ­KUü¯T«Z{îS¬ø“Þ59}ˆ·h¯9œï{cÇ×Ox¢—ü?V¦á5µêëž{ÞR×·Ó`1œš|ØÛiÝ)¦ÿ…† ©Ó¾6Üi^-š—¿*Y~?åܵ&½‰òucŽ&ËOZdX»3004¢š”HÂwRZ#eÿ8Íè·IM;¼D_âíõV©ÕéÉÉÝÝŠ+´Î“U‰u²Z¥'ûqîhSÁî&ð¦(›ÝWÊf›ÁÇ,RÉ0ÕÀÿÿ)> endobj +7445 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7449 0 obj << +/D [7447 0 R /XYZ 90 757.935 null] +>> endobj +7450 0 obj << +/D [7447 0 R /XYZ 90 733.028 null] +>> endobj +7416 0 obj << +/D [7447 0 R /XYZ 90 592.145 null] +>> endobj +7451 0 obj << +/D [7447 0 R /XYZ 90 577.575 null] +>> endobj +7417 0 obj << +/D [7447 0 R /XYZ 90 460.767 null] +>> endobj +7452 0 obj << +/D [7447 0 R /XYZ 90 446.196 null] +>> endobj +7418 0 obj << +/D [7447 0 R /XYZ 90 244.307 null] +>> endobj +7453 0 obj << +/D [7447 0 R /XYZ 90 229.736 null] +>> endobj +7419 0 obj << +/D [7447 0 R /XYZ 90 93.246 null] +>> endobj +7446 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F11 418 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7459 0 obj << +/Length 1757 +/Filter /FlateDecode +>> +stream +xÚíX[oÛ6~÷¯0`“‰áE¤¨`+°$íЮ—¬uia(¶ “%O’›äßïP$u³ìd[‡>lO&eòçœßwHìÜ8Øùyr6›œ<Ì Q(¨pf+'ÄN â”8³¥s傘˜zcì^N v£bÍ/§»yz¿Ž—E4™\Qqzú:Ÿ¿—»E•äÙôÓìÅÉ3B:¶)áH’V®Mÿ ‡ô–'Q߸ ßO=ʱ{AG¬1‚$µCŸÄ—r;ôG3¢g ÎP³ËŸ^˜Ÿ¿yuùòéoÏgFìI†„v8d„Œ˜„ô„0ŒöÓz•di’Åà¦hÇwÛ4Y$Õ'=ŸãÎ| $àèÖÏvIº4'7Ò?!ÝØœ(Œ¨~¾«Lc՛pv¡K…TƒÏ®b¶7[+*€cß3 ý$[ÇER•ºWÙaå6Z˜æ2ÙÄY™Ø õÒÝ¡õâjJ ׺eKc}hw“+€×)âERÆöÿ¨²ûY¤»e\î/b½ê½õ·á¡AF=ŒÂP8$®Ý£ |QÅEyڛޚé£]&Cu¢洋ùΌ^–‰B¿A±ÿ0Sº¹+ã¥nU¹þ½V¡`a>ÛÉmî†>÷6뙵=£Ð'cçèЮýQÎÛ]'˜5UÝì öŸä&Ë ë@Tv¥79 k½ºº¶C•OY¾I¢T÷õ>§„»õ^wÑÈAõ„€¶„³zƒÀÐÿf 0Bø]QÝ7‹*ºÉ³(=¬3‚"vTe|¨ØQaH¶\þä ÿ¨ÒšI3"/ÇxIA«4„3þ©! C壴†c$¥<¦5 ‰4ô»bcÒÄBUÏ@0Ž +Q<$DDˆÄz¼yU}øg2dÿ°˜:(G~—¥è›†~GŽ WÙaVŽ Ù•#èÖ[èíîAÍ4D M­Jj‘¡y£Jj?*ÕÿG•Ý–Q¥jÈî ÷_Aœô19(Np,™Ü§1þ5Ò[ø/hI +ý®F1#P¯âÍ5\Ìj£Ïv™¾Wêa¾¨‰ìUS¡ŽWZœCÈ^¦®ó“)bå}jy®R¢ó 喧ÜÒ] ŒÚ퉽(&íj˜ð-èP{!¯îöwDj±©g„¶„©¸Þ3"‘ Íé¬A ûÖx«³¡º‰ý5ë”ÕÐUÎç#N†%̾†“U±‹Ù!CG‹¸Úà‰z¡›C"‹[ÅÉû«@‡[¬¢´[f\-9ØåÇÔ ”ÓPìÓ»E¼UÇó/²tع¿TËÓÓ$›úØý¥Ér†¿Žð_ŒI[ú+ò)åî­9kɺ¡HfâËäÝoOÉÄ $ƒÐí·urTndÝ­~â»NMñàQ(­(u< .ƒl-{\YZå…ey›çEû@v[3¤éÜÄY\À%ÁþªÈ7Xåiªƒœd7ú‘¦q?ïÊu_IÈ9M†?RÊû£®<t½Ý¦h½nhO“je4f˜ˆ ¾È+%„®³å’=RÙwƨ¦/û•~ûPÙ7È@äÈkÒA{ö±’Éác%|y¯LÝL¥šÔłš]Ïíw¬À5hŒ4Ùä–Ú’ >njvBÃøÿ > ? +endstream +endobj +7458 0 obj << +/Type /Page +/Contents 7459 0 R +/Resources 7457 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7465 0 R +/Annots [ 7456 0 R ] +>> endobj +7456 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7460 0 obj << +/D [7458 0 R /XYZ 90 757.935 null] +>> endobj +7461 0 obj << +/D [7458 0 R /XYZ 90 733.028 null] +>> endobj +7420 0 obj << +/D [7458 0 R /XYZ 90 580.19 null] +>> endobj +7462 0 obj << +/D [7458 0 R /XYZ 90 565.62 null] +>> endobj +7463 0 obj << +/D [7458 0 R /XYZ 90 402.669 null] +>> endobj +7421 0 obj << +/D [7458 0 R /XYZ 90 380.357 null] +>> endobj +7464 0 obj << +/D [7458 0 R /XYZ 90 380.357 null] +>> endobj +1542 0 obj << +/D [7458 0 R /XYZ 90 214.462 null] +>> endobj +278 0 obj << +/D [7458 0 R /XYZ 90 207.862 null] +>> endobj +7457 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F21 2111 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7475 0 obj << +/Length 1567 +/Filter /FlateDecode +>> +stream +xÚµX[oÛ6~÷¯0`“™æUƒaÀ¶,ÚµÍï)- E¢caº¸²/ÿ~‡¢([²lgh÷à„¢ÈÃsû¾s(ì<9Øy3ùu1™ßx̑HzÔs+GbÇ÷”8‹Øyp A̟ÎÆؽì†e.o§»Eú²Vq.ÿHË°|¹ºúUáS‘‡éò~nÔôóâíü†ñ”Jäy>ÞHÿÉ,éi@0¢Ü.XŒÈˆ0aü|IÂoi¸ÝNgT`&©«²MVÊÌÜ©•*§$pUÁ“L¸T2-sòûbòeB@ vHãá#Ž²ÉÃgìÄ0ÿÖÁˆÉÀÙ5«2‡SÿSç~òçŸu1e{Âhx[?¦Idz¯²GШßÔyT%E¾mÔ±òæ7Úê!ÎgF)øµø‰RÑÛcl(ŸZcîÞLœ‡™€ˆ~(–w*®›cz;à½Vá~d ÍjâS'Mº2U­‹6â«¢,¾NJüpkxÂÌÅE&9²9A|äQqhN{‡pf4k4wa©Ìl½mR ¦ªÂüO€üJLq‚%Z‘Ó ;nf(aKš¾˜x©¸Ów<h´oÝBxڄ%d[dc")|Î|bÊ»‘°$ý®¨ïÌ8ÅH`ُéhÀâÂ*/Fã¶Þ;ÑHªA EDöpM[\UÔ6¾ETg*¯Â!ÊEONÇg@À.É.^ƒÞ§ÒÕ%ÆgØ„\_ŽBŸûЕѳГ®KzÖx×±‘ùôÏL©€ØÓAÏ1¬£ ý“=bhËê™г×#Ó««MÓ͵…½iìšâ~\΍()zŠÏD§{LFŽkFvh®Û®!‘ y)i‡Œ˜^iËâ‚Dû¡[ôäi’«Ï#@œQ!øµÔt¦×8î3šC·ÏnCSlGôô8"¾z°ß°rÄy—˜a™ë¡À?òÚ±˜.V†VA»ä)/À´–‚† Üãé†vñ?,#<µkpÓ><©\»Ì6 «²ÈõcU¤i1¥ÂÝ%ù“MALSuÕç殅HX;ÕÚn6)Z¯»,2¨¤Mä­1‚ou{ôB}<<Òݬ!íW,ƤÁ1¨‡2Èð +lp…ƒs…ƒÎÂ2–O ç?Öľ‘Ð\ïFÐÂ@;Øë)~±°î0[í4’¬ƒ6à»$Ò:«¸QCç‰SUâ0Ö}V(ð¼s¬8“>â„õëâá=s1õ¹ …æëï–mbꪫ••~öæ°p¡Ñ%€À¥Þ½| ·êÂíæ¿Üª2UZkÉœpÕ úÝÖA'µ6ï[„‡æ>֊И©“´úŠ y ÏúîÃå‹ýi3ïêRª´Gþ©T«¸)[Ç~ß{»X È1É×EVhJzÒ€L‹ÚvëªÌNîR_ê0MªÄvŒ±Ò&æƹâù@ ¿îx`9 ^ûq§ù¨‘ö ï„˜:îcb詶GÏÂöÑÒ®yl¹×<üµU康¦½óÚ²vø³u·«Vé^Jûékvï• ±±ìoǎÞM¦ÙëKh!q×R¬«js5Ÿïv;mQ'›%Õ(h~ÌR ;ö}hW=³¢«Ç9LfM…íÇüÿ/›€ š +endstream +endobj +7474 0 obj << +/Type /Page +/Contents 7475 0 R +/Resources 7473 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7465 0 R +/Annots [ 7454 0 R 7455 0 R 7466 0 R 7467 0 R 7468 0 R 7469 0 R 7470 0 R 7472 0 R ] +>> endobj +7454 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 697.621 174.015 708.151] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1No__Reduction_77067a656a3aa9381a93a23dfba036e4) >> +>> endobj +7455 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 658.393 197.875 669.297] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1No__Reduction_f38e352895f910cc9556dc7ac0d8f39d) >> +>> endobj +7466 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 619.912 181.763 630.443] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1No__Reduction_5a0edbc51074f6e9e1a908fa292abe13) >> +>> endobj +7467 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [280.418 483.163 391.839 494.067] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +7468 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.857 179.274 243.473 190.178] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_96bae54a01fe00bad4306bec61bb4687) >> +>> endobj +7469 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.279 140.419 155.464 151.323] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +7470 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [155.962 140.419 221.894 151.323] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_891529f721ff485fe2ec90ac48952cc6) >> +>> endobj +7472 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7476 0 obj << +/D [7474 0 R /XYZ 90 757.935 null] +>> endobj +7477 0 obj << +/D [7474 0 R /XYZ 90 716.221 null] +>> endobj +7478 0 obj << +/D [7474 0 R /XYZ 90 716.221 null] +>> endobj +7479 0 obj << +/D [7474 0 R /XYZ 90 638.632 null] +>> endobj +7480 0 obj << +/D [7474 0 R /XYZ 90 582.219 null] +>> endobj +7481 0 obj << +/D [7474 0 R /XYZ 90 521.176 null] +>> endobj +7482 0 obj << +/D [7474 0 R /XYZ 90 459.691 null] +>> endobj +7483 0 obj << +/D [7474 0 R /XYZ 90 435.322 null] +>> endobj +7484 0 obj << +/D [7474 0 R /XYZ 90 435.322 null] +>> endobj +479 0 obj << +/D [7474 0 R /XYZ 90 317.268 null] +>> endobj +282 0 obj << +/D [7474 0 R /XYZ 90 310.668 null] +>> endobj +7485 0 obj << +/D [7474 0 R /XYZ 90 196.345 null] +>> endobj +7486 0 obj << +/D [7474 0 R /XYZ 90 196.345 null] +>> endobj +7487 0 obj << +/D [7474 0 R /XYZ 90 159.513 null] +>> endobj +7473 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F72 471 0 R /F23 340 0 R /F65 376 0 R /F95 1788 0 R /F21 2111 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7522 0 obj << +/Length 1838 +/Filter /FlateDecode +>> +stream +xÚÍYÛrÛ6}×Wðɕf"$=If×î8Mb7rÚf’Œ†¦ ‰ñR’²£~}H‰Eˎ/}HD“àb±çì™…­ßz¯Ï{ûǂYòÖùÔò°å‚8%ÖùÄúÜ'1g0$ãþـྟEþøl@q?Y¬ær’ùã·áEæg«ƒƒÓ ðgIì/Æ£¹ŸÊÁ×ó7ûDŽl˜§ÔCB80yiý¹Òð€`DíjÀy‹ Æ«/o²p¸ðó|0¤ƒ1öe”.üBê;äTfâöeÀ-æ1Þ§ž­löŽÎ{ÿô˜Á)ÃÂäÀÄAÔûü[¸ÿƈy®uUŽŠ,›2ø]X£Þ=ÜbÊ\{x¶¼X„v蝌.À£òúxE˜ÄyéNeoÿ˜ã͵ +d3×RŠ,º4ø…RÞxÇú<ä€ße‰Z81ÏÔº²™Yà‡r”šÖσ0O–Qz݆zús ÿˆv1ïŠÆ°µ›µ\pSØw$lj ‰<Ì´›ea! 4Ebpä/1¹Â«€Ì‹ÉÁA ³Ll˜çXU ôcmóÕèðäD_fæôeªr¾ +¬~–LµAÏÛ0è¹ÈæõÔ_0f-þÙH`·SÌüÅ3 +¹DjC¨5V[ RF°N]”xpË0'y‘I?ÒÚ˟ð–p:Àrú$@;;Mï†3q=äIîç4 ãâó÷L͑·Ä”Úˆû>bÊ4£zPe@ïq³êoa9ÿt'>h#§•nô«&$éj¬“z%¨ÿðmÓdåKòP³ð’^`Uª¼²ŒÁk=Ž: D¼kg‹ KñuçRyû‘¡ãǃ6èǵ6¹ÉëKtlPÆ´™£7pÅfÞ.´Sú,];(@!Ø-ÙBYï°>¶œ¶ª&³Þ8¿¼ÑÆÞj x¿ƒõ¶+v"½ZìV΃¶÷€¤埤}[\w|™]ÂîòRªZhz×2½òu’˜Ñ©Ùh~£–ƒ§F_&†&&l«¶# ÄÜ;Ê#L‘㲪’•"º­j˜V>(°ñh•Cî¶ÙÚ nwØ@nn[UGªO®õ%íK£i麦¸æ¯ÏµšqÄf}¤´I)Ø{;üŽ{âQD¿¡8>j3ØõǁìDmv7Øn‹šß‰™q4€6ô‘þM‹½$ë +ô#Ź3;ô¾0–:AÊޏûíIâ áÖÇ7³mI"îš#vŸô#ÌÛMÿ©qgæ(”ù63{é¼Kû ×ÞMû)[;i¿‡k‚»Ñ&5ñ(ÆmÔ 6¢ë}f:ÿ9j\ÿ@+À +qwý>[~—n P{ÐfõwYî!ÎÍWÔój]g%å³ÈÔ¡ +vó§ùømD$¨„_Ô«‰Ü;?^V‡pŠV—Ê”ÌòZ`¤>V+ Ì©ìHV¤Ô+ûfUW¿÷Êp®ý%®ƒ®ļ(҃ýý««+äömi†Âb?Mû?Šë +€¾S™V»»(Éê“$¸©åLˆÿnûÐ +endstream +endobj +7521 0 obj << +/Type /Page +/Contents 7522 0 R +/Resources 7520 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7465 0 R +/Annots [ 7471 0 R 7488 0 R 7489 0 R 7490 0 R 7491 0 R 7492 0 R 7493 0 R 7494 0 R 7495 0 R 7496 0 R 7497 0 R 7498 0 R 7499 0 R 7500 0 R 7501 0 R 7502 0 R 7503 0 R 7504 0 R 7505 0 R 7506 0 R 7507 0 R 7508 0 R 7509 0 R 7510 0 R 7511 0 R 7512 0 R 7513 0 R 7514 0 R 7519 0 R ] +>> endobj +7471 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 697.288 181.845 708.192] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_3b9f6fbac96e03a00d061a2cd2ca2baf) >> +>> endobj +7488 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 658.516 181.845 669.42] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_7dcb9b448c8c0171e18f29551077d133) >> +>> endobj +7489 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 619.744 154.727 630.648] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_04704288741dbaf6f50e8fc09c43f737) >> +>> endobj +7490 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 581.345 176.505 591.875] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_afdd0083c1c10d49e06f4718a826ae1b) >> +>> endobj +7491 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.408 566.392 450.955 576.297] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_7dcb9b448c8c0171e18f29551077d133) >> +>> endobj +7492 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 531.24 191.718 542.144] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +7493 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 531.24 288.852 542.144] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_1091bf4d0e8ce7672f907cf5e7921120) >> +>> endobj +7494 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 492.468 191.718 503.372] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +7495 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 492.468 303.079 503.372] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_f9503f2a0fd1535ce7cb9465908006dc) >> +>> endobj +7496 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.635 454.069 188.679 464.6] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_6f9c769f48ed91cd71bec247b7733430) >> +>> endobj +7497 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 378.657 197.363 389.561] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_b38e5d3ce8cc120ce4b534bc43d90d34) >> +>> endobj +7498 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [225.062 378.657 290.706 389.561] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +7499 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [428.607 378.657 513.996 389.561] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g616fcdc7600a3a11a8a9152e75730899) >> +>> endobj +7500 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 331.915 197.363 342.818] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_0a8906c6b7e5b785bd457641007d1359) >> +>> endobj +7501 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.198 331.915 312.466 342.818] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7502 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [348.112 331.915 423.578 342.818] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +7503 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 273.217 197.363 284.121] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_c5f6c7896e64b8750e2cd9729c19d66e) >> +>> endobj +7504 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [228.468 273.217 300.736 284.121] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7505 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [353.977 273.217 429.443 284.121] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +7506 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 226.475 197.363 237.379] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_e37107ec8d1402bb69ac6462d7f4646d) >> +>> endobj +7507 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [224.7 226.475 302.527 237.379] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +7508 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 191.687 197.363 202.591] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_5e74729a5f7cabef57fb795cc728869c) >> +>> endobj +7509 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [224.7 191.687 309.153 202.591] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +7510 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 156.9 197.363 167.804] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_8a329c1ea10527cde394abab15b67356) >> +>> endobj +7511 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [224.7 156.9 300.844 167.804] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +7512 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 122.113 197.363 133.017] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_46797ad634dc267c1264aa046c69f9f8) >> +>> endobj +7513 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [247.572 122.113 295.502 133.017] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +7514 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [344.425 122.113 419.891 133.017] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +7519 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7523 0 obj << +/D [7521 0 R /XYZ 90 757.935 null] +>> endobj +7524 0 obj << +/D [7521 0 R /XYZ 90 716.221 null] +>> endobj +7525 0 obj << +/D [7521 0 R /XYZ 90 716.221 null] +>> endobj +7526 0 obj << +/D [7521 0 R /XYZ 90 677.568 null] +>> endobj +7527 0 obj << +/D [7521 0 R /XYZ 90 638.796 null] +>> endobj +7528 0 obj << +/D [7521 0 R /XYZ 90 600.024 null] +>> endobj +7529 0 obj << +/D [7521 0 R /XYZ 90 550.293 null] +>> endobj +7530 0 obj << +/D [7521 0 R /XYZ 90 511.52 null] +>> endobj +7520 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R /F98 2120 0 R /F35 2018 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7579 0 obj << +/Length 1826 +/Filter /FlateDecode +>> +stream +xÚíZms›Fþ®_Á'Wš‰Î÷ÂÝqiәڎ3IóâÚÊL3qFƒ$dÓJ ²¬þú.܁Ao¶båC>a£½ewŸg÷v°ucaëUã¤Ó8>ÌRH *¬ÎÐRؒ‚ N‰ÕXŸ›„ &[m‚1n^´nºÑØí^´(n†£ù­7ˆÜî[¿¹ÑüùóýĽ wÔ½ºu'^ëKçÍñ9!Kê)UH Ï´ÿ¦EJŒ¨ tjt(DÏ~ߤátäÆq«M9eŠ6½ñdä&ž¾sé ½¨Eœ¦ôáSŒ7©â©ÎÆËNãkƒ€l‘,,\" ¿`k÷ßX1åX³LjlٔÁud]5þj`b¼jŽ—Í$ X!)CXpmî5¥úñùºl‘DJb’.r-œÜ·$w&‹ض£Ù¶ªÄ¹¤I îˆBÓ|âî؄åuxÑ]‹ò¦;ªÑÍâ¢@CG)º1áº|Uu¶­âŠ[m ”âÆÙ¾~[ŸÛ«æ5æ¸q²â1©°ò¤Eš!дy_ ^‰9„rĄ]ŠÊfӉR®›UÏb9˜ThºFïQ/¼¶ÚI‡ÚÍÓàöZ„7ïýdÞÕÌ®‰Y¿$÷â÷ŸºíT‚¯(’UN?¼»xûòïםOlRR¸ðMR žM©¹~t¯æ1ŒŸÛ1¹_,‹Ÿ†¾å¢kSKI›”õ͙YU/ÃxE‚ZªC—!ŒçOßØü±ÿŸ7èI3efìVÇF6Qûè‰Ó7Ý]"Ž|¬7Ñ4=®ß5-Ͳ€Y‡^úDïëÔùɼôäÂL½è8…4gBo^¬RˆRz脵%Rꉁ-åëSC,y±´µîHß+ð†2¼%¯Ãî–ññ2Þ Q‹7eb›í§­P­ ·ðX½¡de'¥©§åÎ~+u€» ÈféùFŠ›³-·n4O_Ðv`ºrP㐠]®!g/ Gëû&@2:?ɱÚ)¼tìYj~Ka/7¿0¥z›»Ñü­N`ŠTŒækšb¨û>ÐXF êD€ªícv:¤Pɍ'º[ó¶t¿ŸŒæݟ„:4¡r(Zß$xE3WHJçûЋðMí‹]~ ÓuüO˜vÅÃ(ÿ$סȵ—ãWWÏ÷ùœ®ÝõU€)™?ô…ÔE¥ +Z·î¥7r“ê!ÁJòDFº›u'ábÈ«å_ÿªß÷2q¶ý¼'ÿœG %!·õ—Sé‡1Ü®¼ÄºÈF´hl†‹ü³)ý¯ùvʼŒŽ½è—‡Ҝ˺Á4k*MDîRU^´8töC+¥OÖ³7W^ž‰Ú³­ü¯?×ö†.Èv›$“çÇdz٠õc4 üI„üäx2{ô»¤…ØHJ†ùç8ŒŒû~7ÇÚ¨ÿÿü=Dc +endstream +endobj +7578 0 obj << +/Type /Page +/Contents 7579 0 R +/Resources 7577 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7465 0 R +/Annots [ 7515 0 R 7516 0 R 7517 0 R 7518 0 R 7539 0 R 7540 0 R 7541 0 R 7542 0 R 7543 0 R 7544 0 R 7545 0 R 7546 0 R 7547 0 R 7548 0 R 7549 0 R 7550 0 R 7551 0 R 7552 0 R 7553 0 R 7554 0 R 7555 0 R 7556 0 R 7557 0 R 7558 0 R 7559 0 R 7560 0 R 7561 0 R 7562 0 R 7563 0 R 7564 0 R 7565 0 R 7566 0 R 7567 0 R 7568 0 R 7569 0 R 7570 0 R 7571 0 R 7572 0 R 7576 0 R ] +>> endobj +7515 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 707.957 197.363 718.861] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_c720d2c0875eba7d87a4068876092025) >> +>> endobj +7516 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.851 707.957 252.452 718.861] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +7517 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [265.274 707.957 298.001 718.861] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >> +>> endobj +7518 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.285 707.957 426.751 718.861] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +7539 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 661.23 197.363 672.134] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_fa8decb7c7093c9cde1255a6c1af62d4) >> +>> endobj +7540 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [224.7 661.23 244.954 672.134] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +7541 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.234 661.23 349.7 672.134] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +7542 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 614.503 197.363 625.407] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_dc326b7c8687b685c42817f7fec425e0) >> +>> endobj +7543 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [234.394 614.503 279.555 625.407] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +7544 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.014 614.503 426.48 625.407] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +7545 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 567.776 197.363 578.68] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7546 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.103 567.776 248.909 578.68] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_0a7f222ac228554b369d460087815b87) >> +>> endobj +7547 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [276.246 567.776 348.515 578.68] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7548 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 531.109 167.466 542.013] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_5e4f3b53b4dd4f7f57a13df638b162e4) >> +>> endobj +7549 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.281 531.109 243.55 542.013] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7550 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 494.443 205.112 505.347] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_f1921cd40fb0920e1173cf67418c63fe) >> +>> endobj +7551 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 421.564 190.738 432.467] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +7552 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.236 421.564 261.85 432.467] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_ed38463ae788879580d6372653452603) >> +>> endobj +7553 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 384.897 190.738 395.801] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +7554 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.236 384.897 262.159 395.801] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_8b99abb6e15eedbdb94e2466e8304c52) >> +>> endobj +7555 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [329.225 371.37 390.082 381.275] +/Subtype /Link +/A << /S /GoTo /D (main_Affine_Independence_and_Affine_Dimension) >> +>> endobj +7556 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 348.23 202.922 359.134] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +7557 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.42 348.23 248.58 359.134] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_b5dfec17f683d1cbe01cfc71d601108c) >> +>> endobj +7558 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 311.563 202.922 322.467] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +7559 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.42 311.563 296.181 322.467] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_f14ea5b6122685afd62a3df786512d77) >> +>> endobj +7560 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 274.896 209.547 285.8] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +7561 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.045 274.896 261.831 285.8] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_f7fd07f1f8d91c830130c061da7b6c56) >> +>> endobj +7562 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 238.229 209.547 249.133] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +7563 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.045 238.229 309.432 249.133] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_b7c86f7ff6b09ff72e3ee3382b4c933b) >> +>> endobj +7564 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 190.604 180.496 201.508] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_e85fbe787fa3e172ecf6a63b2847d69a) >> +>> endobj +7565 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.834 190.604 280.102 201.508] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7566 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 155.832 213.153 166.736] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_f2c70f89a472f7fa34ba64817693776a) >> +>> endobj +7567 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.49 155.832 312.759 166.736] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7568 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 121.06 213.163 131.964] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_0d1677ef76c939ca2025722d2ee249e2) >> +>> endobj +7569 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.501 121.06 312.769 131.964] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7570 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 86.288 205.692 97.192] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +7571 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.19 86.288 261.312 97.192] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_81c8a26a02090eb4fb9255dd814514a8) >> +>> endobj +7572 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.65 86.288 332.156 97.192] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +7576 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7580 0 obj << +/D [7578 0 R /XYZ 90 757.935 null] +>> endobj +7581 0 obj << +/D [7578 0 R /XYZ 90 584.828 null] +>> endobj +7582 0 obj << +/D [7578 0 R /XYZ 90 548.162 null] +>> endobj +7583 0 obj << +/D [7578 0 R /XYZ 90 511.495 null] +>> endobj +7584 0 obj << +/D [7578 0 R /XYZ 90 436.593 null] +>> endobj +7585 0 obj << +/D [7578 0 R /XYZ 90 401.949 null] +>> endobj +7586 0 obj << +/D [7578 0 R /XYZ 90 365.282 null] +>> endobj +7587 0 obj << +/D [7578 0 R /XYZ 90 328.615 null] +>> endobj +7588 0 obj << +/D [7578 0 R /XYZ 90 291.948 null] +>> endobj +7589 0 obj << +/D [7578 0 R /XYZ 90 255.281 null] +>> endobj +7577 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F35 2018 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R /F23 340 0 R /F97 2175 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7634 0 obj << +/Length 1630 +/Filter /FlateDecode +>> +stream +xÚíZ[oÛ6~÷¯ÐS' CR¢.Å°‡m®E³$ÛK[´MÛÂtñ$9nöëwx‘b9ò%±›4ŸDËÔ9Gßùøñ"¶&¶Þ÷~¿ê½ó]+B‘O}ëjlEØ +|‚%ÖÕÈúb‚ÜÀ9%cûÜ!ØæEÊûçÅvžÜLŨàýñ àÅÍëן‡ŸäOú—S>η«gïY2Oi„|?çÊú¯ºK+‚õêW6"D\Vwøm›…7 /Kç”2 Æ"j‹t–ðJè;b, +‡„¶È†pˍ\fÓȗ6{o¯zÿö˜ÁQ°°àx˜ö¾|ÃÖî°0r£ÐZ¨^©åQ®‰uÙû³‡ Ä«Wy@­Âõ=®ñB3 .Â>Óa_ˆj^d&ðjjâ-7°ÄçõÓ<ÅÙDÿˆj!D¦1‰¢e'n¡6°}ÅØ5ȱ¥^òq“œj—ºO+\ˆRwâÙh%Æ!„V¨ÌæqVu8ñäúM~†.rÃú¤’±ͳw /eþ”ú/„A!dC¿,¥lŊÌi11ɽxß³¾œ2ÉpàtÿMžõ/ ÈÛSi1½û‹¸š¶1¾b†.æÏ5vÀó¤˜+.vy5œ€²„r'4«é¢È÷ˆuJ( +™ÿȵ„Њƒ€¢ˆE ±&öAÿÔ +\D€RûPë½x*jgQð*/:™µ7±‚çN¬‰œÛ$FJ¸ N«Âå#Úø™X·ÂÌÛB.C¥Až'›³—}˜çª›u„Ù'ÝäjºïBåb˜¤›VÁÝš“x¬#jr“gɍnÁ_w¹á€”¿5Â]¨ÑDQÖQ諆Q5?_Þ/§„Q((ä®” §ó,v(³¯%GEQŠ•Þðå§W_Ðk9ä±]ŠC$Ù;@’Gq9,DuL«Ts Cå©3:ÈçÙHŒŽ Ýs´Ö8þ$µÊgy’Oâ!O ´&yyÌñÞ9Ö JE6ÀÔ4ºª]Î¥¨LÈã•:îZ eñ¦;ÎøpoØ{ކ„W°.û°VÑLDџåfm|$Ë}ÈRcé4XqC„D𲺮.ßæ^]Þ^(ðŸT=ô‰z“5Xû¼ý·C±yóAÒY$\Ë‘^Ò=‹Úi±èš]KzX"†dUNZ»PµrÄ]kLXy…!;S b$zàúÀ”Ë*½þ£ûòK͔e\äiŸr ƒ^4챃ðpäEÿí÷Y!Êru£ÞIP +]^û¼ÕveG©2.Ùyj¼Ôôv-6p2¢(zjFúÕ;ԎÄ2#fxШųa£ÿbÙ(s±ØÂÄ(ü ¸…بè’ÐNù÷8ÿ»£….‰vaŸ4±•}²SÃ>Y€œl0èúö›\Œå€é0wkCe°œÏúÙFKlK‘¶4:qÔ5b,ρñE5ã_)°æéñ Ü{ W}=Û2€"/l  €˜ 3€ Õ]’†ˆì0%ér¥ö™å•nÔ[†&´Ž}dŠ0aÛGr‡“Û‘ ?–F²ôµ4¯H©k@»(týƒèé՗¢¼/¦ñP²_}²°€f¤Wr «O4º˜çõ¦[³zZꍠœYÏñd^ϔMi—Îæ•ÝSCŒž5äÑ4„µ5ä䱿Pµ(8*У*кzâÙÊOS§ñ¥]Ý\L…~®ã]‹Ý륺Mãú„‘½Ø8ãÆÕ>ZˆòÉAV›nDí4κÅ0rwC0±] ¡Ó®bèÑp ƒà^ÅÙx£îh‰jKR å› * Ö#T$ÜEÎܶœá»r†×Ëó%gn[ip‡œáurG;ÉÙ'kåìvi´AÊ"ý)c¥ÌÛªdq&éúSWQGáØM8X[8žAu”£ì¬z"‡î.Õӏ*žVÏûà¾ã1`uÜ4ÔGQà†æ„5”„’Áú„sÝ¹úXQ¤ óúxµcö;Õkýã¯R¿8ŒÙæí>ñlΓۏbõ!)‡ê&FòL´üÖkP£_ŠZtõ›ýcÕ­?z*·ñ’Ri ï´ªf¯Ï΋–hžÅ³ÅÕÙl–œµ`\yk24FÆõ'Ú4/êÀÍTlçðÿóœK¶ +endstream +endobj +7633 0 obj << +/Type /Page +/Contents 7634 0 R +/Resources 7632 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7465 0 R +/Annots [ 7573 0 R 7574 0 R 7575 0 R 7597 0 R 7598 0 R 7599 0 R 7600 0 R 7601 0 R 7602 0 R 7603 0 R 7604 0 R 7605 0 R 7606 0 R 7607 0 R 7608 0 R 7609 0 R 7610 0 R 7611 0 R 7612 0 R 7613 0 R 7614 0 R 7615 0 R 7616 0 R 7617 0 R 7618 0 R 7619 0 R 7620 0 R 7621 0 R 7622 0 R 7623 0 R 7624 0 R 7625 0 R 7626 0 R 7627 0 R 7628 0 R 7629 0 R 7631 0 R ] +>> endobj +7573 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 698.089 205.692 708.993] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +7574 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.19 698.089 261.312 708.993] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_2d266342acc104c59dc0046242ccdac8) >> +>> endobj +7575 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.65 698.089 338.781 708.993] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +7597 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 663.41 205.682 674.314] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >> +>> endobj +7598 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.18 663.41 261.302 674.314] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_46a4105c8476e5f5260a775777398586) >> +>> endobj +7599 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.64 663.41 330.462 674.314] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +7600 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 628.73 183.824 639.634] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_353fe86259fbb2dd09d451e9dd468676) >> +>> endobj +7601 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 592.622 192.272 603.152] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_aae8e418bb3d7a1432117530eaea7ec4) >> +>> endobj +7602 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 556.14 189.901 566.67] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_e3be22e7dcdf54fdc0fb976fd755d0c7) >> +>> endobj +7603 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 519.657 193.229 530.188] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_74d2b64496aa448a85ec0b370cee0977) >> +>> endobj +7604 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 482.801 241.935 493.705] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_3905c42e02befd8a894c57abd9f972f5) >> +>> endobj +7605 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 446.319 238.459 457.223] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_22b6ac7ec1477dc82d6db22900b59be2) >> +>> endobj +7606 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 410.211 187.689 420.741] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_d423a6ddce01a2f2efb34b826d0de921) >> +>> endobj +7607 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.505 410.211 226.693 420.741] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +7608 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 375.157 228.895 386.061] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_7ae373e57180f03b09aa0e38d1f19811) >> +>> endobj +7609 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.232 375.157 333.482 386.061] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7610 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 340.478 229.503 351.382] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_1ae372d4f3b58cfa4af6edd51d845209) >> +>> endobj +7611 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.84 340.478 334.089 351.382] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7612 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.98 305.799 187.264 316.702] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_0e90a75aac44c14997804b8911ff7bbb) >> +>> endobj +7613 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.963 305.799 293.213 316.702] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7614 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [325.131 305.799 371.148 316.702] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +7615 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.711 305.799 455.727 316.702] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +7616 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.98 248.205 187.264 259.109] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_cb19de0243a618e9bf3d62e2ee04ae01) >> +>> endobj +7617 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.963 248.205 293.213 259.109] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7618 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [325.131 248.205 371.148 259.109] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +7619 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.711 248.205 455.727 259.109] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +7620 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.235 236.25 220.058 247.154] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +7621 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.717 190.611 186.348 201.515] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_cfec639e917dfd6eb63c4006ac55b807) >> +>> endobj +7622 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.523 190.611 293.772 201.515] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7623 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.35 190.611 373.367 201.515] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +7624 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [410.82 190.611 456.837 201.515] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +7625 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.717 133.018 186.348 143.922] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_217e4addfae235df12c449320e65f891) >> +>> endobj +7626 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.523 133.018 293.772 143.922] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7627 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.35 133.018 373.367 143.922] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +7628 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [410.82 133.018 456.837 143.922] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +7629 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.581 121.063 218.404 131.967] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +7631 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7635 0 obj << +/D [7633 0 R /XYZ 90 757.935 null] +>> endobj +7636 0 obj << +/D [7633 0 R /XYZ 90 645.736 null] +>> endobj +7637 0 obj << +/D [7633 0 R /XYZ 90 609.254 null] +>> endobj +7638 0 obj << +/D [7633 0 R /XYZ 90 572.772 null] +>> endobj +7639 0 obj << +/D [7633 0 R /XYZ 90 536.29 null] +>> endobj +7640 0 obj << +/D [7633 0 R /XYZ 90 499.807 null] +>> endobj +7641 0 obj << +/D [7633 0 R /XYZ 90 463.325 null] +>> endobj +7632 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R /F50 339 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7691 0 obj << +/Length 1757 +/Filter /FlateDecode +>> +stream +xÚíZ[oÛ6~÷¯ÐS'3CR¢(À­[‡µš5é^ÚÂP$Ú*Kž('õ¿ß¡(Ù²#Ëv"7)ڇÀsDžËwn$±5µ°õÇà×ËÁÙKϱõ¬Ë‰%°Å=‚%Öed½· AŽÆØ>lù,Ÿ)¶³dy-£<ÿ_åA¾|þüMXÓ, ’ñÅu0—Ï—¯Î^ҘžR<Ãâåì?’ FÔ­ .[æˆ8¬&øyß /’@©áˆ2 “ jËÙ< +iFÞʉ̇ķe#fSÁõœƒß/ÿ Lƒ-Rª…qÄaáp6xÿ[Œ¿²0r„oݖT3Ë¥ü&ÖÅàŸ®TŒ›ªf¸É&áȃ/8uö˜a÷¥¬\¾þÎz?b û«,KªqÍO>­{[RhYÞ¼ÞþN~À Ã1ò†YªŠ ²ú÷ì%§–¼y®±ò\bˆƒ„Ë+M^ËPÛýS¥Îxb~ƒ$1Åu¥Ö8ºØ¾ ò8H‹Š:ȇ·+±ú€1•jeç.{9Âøs8b•æ.æA(G¿Å3™ª8KÍBçƺJ[8ŠÓ©ÿ[ή`¬|~¹HþPµAQËê!‹âÉrKÈ°7ØÝ´´ƒ\f(A‚øÝv¾)=+ŽºmDѸ´eÄi±ËîMkï˜èEç$ÏÂ:Çà…"ÁªÐñKÕ¶¯Ñ7¯”˜MxÓ0»f Íó +A8ª}94+kZٖ‘ÔRrÖµhÅb$5S r !k#V­VJ§…WyØ_qr«nŒˆš¨û[ QŸ Léép¤zÒøÂè¼Oª@­ìÛjK?w­ã»)V& یnŠñ7‚%ÎNßXÊ!C€.–a"ÖÎO‹'úuá þق# ÏÌl1†('ˆIÓ|Qe +I“< §=Å¢¬Å:Pæ:â'çûŒ³‘ƒÖ´YŽÉÿñMÈúýÜ6uºÅ +aÑPÂiš1âì¾0q)rÝÓ¡Dõ“ÎH3U_\Z£É@éŠÄ<¸ È´F@zµ{‡ôO¢ö!¨3E}ηœÜTtr|×O¸óª +›wJöÑyÑu¸?¸ó2]¾ÑÖõNM´îÌËFúÞ%µ€äEØ#—BŽ …½W—Ôü$°{ªEÑQ¸Û]…ùÌí®BZkê¡®½ðö æ®Yx,´AäÔýAî©o €º{ôw„D¼û4xßpä×;)(¿–ŠÿHTR8Q:0¾§pò‘ã‡ä’¾ƒ”)=Br‘®bãñMÿCBˆ­OF®’Ö <€Žó‡¤áÙl¾(4–Ç)-½SM.“8òXÛ2 ôIÈ6_šª=RŒ}ØØE ¯R¿vvýA®šË°¨ÄÉ̯ÒÇ=ú‘ÚÑȩ̂Íi0"þÊin‚|G·±ZûG˜”¹v TÞOÙMÜ}pð ×Ó.8øJ£š VFƒo0‚.¨±këRº02Õ$Æb²’´Õ‡Ed]›?$^kIé1’ВÅÔ+Å"qJÁr`Ùü6Vm;Zಙߨ &A¢Z—M+ŪY"™%sBF÷{½HÅÝ·Nd^n«> endobj +7630 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 720.286 161.677 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_35518da8c480784110d40b680256bd61) >> +>> endobj +7651 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 646.871 205.752 657.401] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_ae058fd9619a17e121c3aab9b0612d81) >> +>> endobj +7652 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.089 646.871 276.595 657.401] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +7653 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 611.628 209.627 622.532] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_dc269190695c1745ab086168fcf35835) >> +>> endobj +7654 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.964 611.628 314.791 622.532] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +7655 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 576.759 248.202 587.663] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_0e09e7efc2f63aba534614086427bf49) >> +>> endobj +7656 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.018 576.759 329.845 587.663] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +7657 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 541.889 212.377 552.793] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_0e9ecea59dea0ccb1cc3600bc11f1056) >> +>> endobj +7658 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [239.714 541.889 289.846 552.793] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +7659 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 507.02 216.252 517.924] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_a493e3939364ce0db66b42f0ef6511d0) >> +>> endobj +7660 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.59 507.02 328.042 517.924] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +7661 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 472.151 254.827 483.055] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_1cd37a76428add108f267548ae76664b) >> +>> endobj +7662 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [258.643 472.151 343.096 483.055] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +7663 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 437.655 236.745 448.186] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_594973c5284386e52b8c33b206a47907) >> +>> endobj +7664 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [264.082 437.655 307.588 448.186] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +7665 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 402.412 243.37 413.316] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_580264341ec83f4bf3d6da1205939b0a) >> +>> endobj +7666 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.708 402.412 320.839 413.316] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +7667 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 367.543 240.62 378.447] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_c6376a87e99d3cdabaa6ee7542474849) >> +>> endobj +7668 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.957 367.543 345.785 378.447] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +7669 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 332.674 247.246 343.578] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_a317313059bdf973567d2fcf5e030212) >> +>> endobj +7670 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.583 332.674 359.035 343.578] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +7671 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 298.178 193.577 308.709] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_fea57a711a6b7a5d501112b84b246759) >> +>> endobj +7672 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.393 298.178 232.581 308.709] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +7673 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.059 285.176 248.845 295.082] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +7674 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 252.35 193.577 262.881] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_6ff5e78b07441619f850114578ca48d5) >> +>> endobj +7675 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [220.915 252.35 277.691 262.881] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +7676 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.892 239.348 252.677 249.254] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +7677 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 206.148 223.465 217.052] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_bfde1aac87d8218fce0fa9b4ea8a5eb1) >> +>> endobj +7678 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [250.802 206.148 323.07 217.052] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7679 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 171.279 229.552 182.183] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_ec298ee7df246c945e6a56442e04176d) >> +>> endobj +7680 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.89 171.279 329.158 182.183] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7681 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 136.41 266.673 147.314] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_bfb434e3d574f4bd53314ac8749c4731) >> +>> endobj +7682 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.01 136.41 366.278 147.314] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7683 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 90.582 217.109 101.486] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_72782e7d9a6612efd73b253b0f862c6b) >> +>> endobj +7684 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [244.446 90.582 316.714 101.486] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7688 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7692 0 obj << +/D [7690 0 R /XYZ 90 757.935 null] +>> endobj +7693 0 obj << +/D [7690 0 R /XYZ 90 733.028 null] +>> endobj +7689 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7760 0 obj << +/Length 2722 +/Filter /FlateDecode +>> +stream +xÚí[ÛnãÈ}÷Wði"«vß/ƒl€d°d³A&3N^f-Ñ6‰R(ÊçëSÅ&)‘¢DÊbæ’ì‹eRÅêêêêSUGlÜ4øãÕn®®ßj8â4×ÁÍ]àh`4#Š³àf|1F„O¥tônÌè(L—áôݘÓÑjñüÍÓpúS|›†éóëםeáý* Óá:ÿróãõ[ÆöÔsîˆÖϵÿ֋Ô,`”pY +Ü´èp„ U +ü®KÛE¸ÙŒ'\QPæø(Z®aù;(3;Š’ÜN¨wu^ýpsõ¯+jhÀr·(C <[^}ü…s¸ÿc@‰p6xÊ¥–ä>Á‡«¿]ÑÂÅÍÏÜå†ÌÕ27W‚½ð¯á‚P­¼Ù¿ßlâû¤0<[ùY:·÷˜°Äêr–?S* +O¨=I4µ¥Löo¼LmxV|'T¸f³ ‹h“ù«¬,®>¬®¿1[%Y'qr_˜X=Ìã;ô,:X˜ÂÁ¹ª»–É0k‰vªÇtÌYÓ “y‹¦`°Jæ¹E‹"¢òÉÃáØz^¿Ut/ö&‚[B© &œÇL1ÎUMKðq¢`GÝ®V‹â>FYz_„Ûû\"wg ñß=O·ðõݍ™}ʦa"MµøÐÏTQ„Å;©»e»65½z]¬ÕM¿s¢% &Œ§x3ˆ>Ä– ±ì’0¸Q.û‰‰ƒ)Ë(Ê&k—›(}ôQìTám0ƒÏÂ,^:n_XuËÜàyŠ³ï¾ÂÚu4˼­¥?k#(Eœ‘mÜ.´'RšÑŸîÚ6‰„=P©º ›¨Í\G”ª0Þì›mÓ$š‡OÁ¾Iì @g§\…6I?bð¡f3K¸‰ $ôΞÇJ¹)ËàÌ÷¤=½'óÜϏ‡nލ¹ÂuæI4—áýÁöQÒoÄ£zFÿ3Æ ¡ÆáíâðqäÇÓ1hún<ь:v5ŽùSœDa:ýáÓ:`ÿ1j~åAd½¯ûÍ*ª&5‹£$›fig›×¯óQ§“|!-‘ÚÂ*‚'U‘«RÌ¢;€ŸGÉj'a¶J¿?Ô¹J"ô +ÂJ_ha¸%D-¬-‚ò£ÐbœfGrn÷äQÿ£1ažö|dxó <ò܉ÖZ!Å`UÀ‡Hðh5Ém2‡ýåÝöPx·MŠ½†WËp½Î/÷³ Bjªœ ’-ƒ3ÀEYY›{Õ»æ.ùnuu¤ˆpW~*1{SbØÑÜ߸}n1ÕJREB„Z†¨öâ¼ g¡L5/¬!8…Ì`x%t¯Z! /€,ah²„s]…cvB +5! uuP qv´¤’ SÓ+ÊzAS‡,¼Sl´“È…ríÈÿ3ø4 +äʽ÷PعC.¼ª /N"'RÊNäbœ×‘«6vrÁ²S^ —ý¹.E.nåè>J¢4\ÄÿŽæÓ[u „á€5;ÑGˆÑûh‘· ÓÏËÛª“«Ù’F‹Íóò»q.ßՓÁàPØeM\ÄPêÂÅ/ +‚¯Øœ6ÃT<ØjìS8hÍàÖü’ÐÁ+>¸¾—CCj½š‘WEŒw— àmO°C‚Í7…×Ш:Q——I6wy½Çöʼý„¹›}“)%BT“+3*áQXèÙ=ÉƉ‚G±´(ÑháJ»§Nד=)2f†® rOãD(JŒUÁDgMóêt“ 6B ¨Œv”4¸%G ³¼bårö­6j¥ŠB¡ªúà£DJÔÀÌ©,B»ØuO×Õâ©}×iԜPS[€×ÛéýæØ«÷ Sd<¾9Nf«ùÉl 0W5õœZ¬€üÈ_œ”胯0Lc6êŸD?LÈ>µ'Ò`‹‡Í‰\ Œìʨ¥Ê(Ò´˜ï´3§ëÒ‡Í ]5§ÇJTXÜ¡hgÁ덃60oµc´"»!3£ Û`Ð:Ý潟‚­_4ªlÔYƒhNûA4sP½î°B³ ž‘mS]ð¬‡2ø(<ׇ¥„‹Š9LÚ¼ ±$T%S2†éÌßI¬{vkòe±’÷ÃJ÷B¬—Xe†ÂJ)äèv…}RDé Je|¼ÞíKK»J\|¨ÉPèÕâvÚ(lÏS´õï@ÐíÁ¸_]A}Öâ8Ÿ ˜¨·¦Öâ¬= +ÖÖ°a~ÜSÖ6ÐZ4ÑZPÖ‚u µ åvñÒ „®/ÂL®W‘š+à­3Åò,n« ìä ^ÝñӖ"Ö׺fÃ_/~!ȉÐPÙúŸé/)~ UÂA.̑ⷾ”0Cá‹_Q.'—-é³#_ÒF¸“yj7j³‡ÐùBL,€wÁµ-„Ý+^¸Eç ¬Ë“ÞMˆ°2gÔÏkBÄK2—29TâњçiŽ±ÍZ‹KòŽÙª1Zu•ç¨¬*ύÖ]‰å/L4ßmõöãC=%y÷@WA£™îʨ¥ÌM@×ÞG=^©ú¼,z„ÈцÊ_MèõUý!QÙ 2~ӊÊÌaqê{机P N]hϩç9ulçÔáɧ.ô©v ŽÕÚ¹û%÷ŠFCE_Š†í~¥h¾fŠãk¥hŽ!%>pÑš¢ÁÒôú!Rô@2ÛÊÒpÇÏøóÿˆ¥Rµ×πÔJéa ±&ùAÛëg!åQ¤Ð×@jÙ¨Ÿ ¯øϓH-厬Aé:KyYFBñه¬—’5àNíçc/+‰+]€óЙô¡kTþzn7]3Dó]˜ªùgæmB@­Ã8ÊÚ°Ki\}§»ÕBõsoSꢪ޻I±/'n'F –0ÇËh +»f½‰¾æ#ì+9S ×v‘UÇYŠ1Ëõ6«‡étûÄ»½ÍK·QöEIÛQ#`W 6Ãïñ3ÎœuTAD Ì«õj±ºg³Åj³M»‚úì`Œ’öË#”4ã½éæi§\Db>o_¹³sOJXG¬ÉL8&‡X‘7oŒ.j5(ÆÀ\߄¤kUֆÛŒŠ çûç¹Ó°¶-‡Ïj®‘Zvp°þ¾wäL8¾‹ï5ýO.ðÄ¿äZ¼ÏP.òy¸Æ)” bðùþ÷O6ŠbMÀlßs¢yQ塁ý\…§ªŠíwS.ػܹ)”ñþ²<;.˜§ü®¿øû&JƒÇ¤ŠøúK˜lKxÀýõˆª¢t÷22:P[bD|WŽ>Då²û™ý3(ÿûóUî˝½È' +Z%‰‡,[¿¾¾~zz"³ Ù&ñ:%qv½^/®EymÖ Ê±Ý¹·»Uê [®Òê`Ü\æU_ðÿ¦8Ïÿ +endstream +endobj +7759 0 obj << +/Type /Page +/Contents 7760 0 R +/Resources 7758 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7766 0 R +/Annots [ 7685 0 R 7686 0 R 7687 0 R 7710 0 R 7711 0 R 7712 0 R 7713 0 R 7714 0 R 7715 0 R 7716 0 R 7717 0 R 7718 0 R 7719 0 R 7720 0 R 7721 0 R 7722 0 R 7723 0 R 7724 0 R 7725 0 R 7726 0 R 7727 0 R 7728 0 R 7729 0 R 7730 0 R 7731 0 R 7762 0 R 7732 0 R 7733 0 R 7734 0 R 7735 0 R 7736 0 R 7763 0 R 7737 0 R 7738 0 R 7739 0 R 7740 0 R 7741 0 R 7742 0 R 7743 0 R 7744 0 R 7745 0 R 7746 0 R 7764 0 R 7747 0 R 7748 0 R 7749 0 R 7750 0 R 7751 0 R 7752 0 R 7753 0 R 7754 0 R 7757 0 R ] +>> endobj +7685 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 697.994 271.126 708.898] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_0a0d8c78069019f44dc34ebab82ecfc6) >> +>> endobj +7686 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [298.463 697.994 370.731 708.898] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7687 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [214.863 685.366 326.259 695.272] +/Subtype /Link +/A << /S /GoTo /D (main_Meet_Preserving_Simplification) >> +>> endobj +7710 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.984 652.166 201.742 663.07] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_ccc6c6488ea9d8555ea8e978cf188749) >> +>> endobj +7711 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.442 652.166 243.629 663.07] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +7712 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.079 652.166 371.329 663.07] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7713 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [221.562 627.583 267.759 637.488] +/Subtype /Link +/A << /S /GoTo /D (main_affine_relation) >> +>> endobj +7714 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.288 594.383 212.768 605.287] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_ba9abb279871c30a4f0c6cbb188fecc1) >> +>> endobj +7715 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.771 594.383 252.959 605.287] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +7716 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [297.896 594.383 375.145 605.287] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7717 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.657 569.8 275.748 579.705] +/Subtype /Link +/A << /S /GoTo /D (main_affine_relation) >> +>> endobj +7718 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.443 536.6 250.099 547.504] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_934cc1f45a6d438f5d468276140cd5a8) >> +>> endobj +7719 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.258 536.6 289.446 547.504] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +7720 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [307.772 536.6 379.512 547.504] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +7721 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [436.747 536.6 513.996 547.504] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7722 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.255 512.016 484.66 522.972] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +7723 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.091 478.816 250.748 489.72] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_196d1efc79437ca1d96b79b7cd60387f) >> +>> endobj +7724 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [280.068 478.816 357.317 489.72] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7725 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [384.405 478.816 456.145 489.72] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +7726 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 466.861 202.344 477.765] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7727 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [344.359 454.233 470.793 465.189] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +7728 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.933 421.033 239.984 431.937] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_b499fba7b7be2932147748248180e057) >> +>> endobj +7729 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [245.633 421.033 280.82 431.937] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +7730 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.855 421.033 405.104 431.937] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7731 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.703 421.033 513.996 431.937] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7762 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 409.078 171.361 419.982] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7732 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [347.257 395.241 432.092 408.399] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +7733 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.207 362.047 266.586 372.951] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_702b00ff42a88c23ab25eecf0e9acef0) >> +>> endobj +7734 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.509 362.047 309.697 372.951] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +7735 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [336.494 362.047 408.234 372.951] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +7736 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.703 362.047 513.996 372.951] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7763 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 350.092 171.361 360.996] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7737 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.141 336.255 414.324 348.42] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +7738 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.017 304.264 265.396 315.168] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_25f104e58f88e05dfcb905bcd66e493b) >> +>> endobj +7739 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [298.568 304.264 375.818 315.168] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7740 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [407.239 304.264 478.979 315.168] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +7741 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.616 292.308 225.866 303.212] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7742 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.222 279.68 466.67 290.636] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +7743 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.436 246.48 251.209 257.384] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_0d4db6f54c7332e1a2e0bc85e16ba176) >> +>> endobj +7744 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.361 246.48 290.549 257.384] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +7745 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.719 246.48 409.969 257.384] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7746 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.703 246.48 513.996 257.384] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7764 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 234.525 171.361 245.429] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +7747 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.114 220.688 456.992 233.846] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +7748 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 187.494 224.57 198.398] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_44e10aa0180433db7d19fb8e473dc829) >> +>> endobj +7749 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.908 187.494 324.176 198.398] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7750 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.542 174.866 347.869 184.771] +/Subtype /Link +/A << /S /GoTo /D (main_Time_Elapse_Operator) >> +>> endobj +7751 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 152.625 255.564 163.529] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_d8d04d80653fb850dd92468af1995f97) >> +>> endobj +7752 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 115.763 257.637 126.667] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_1d780ef5b99cc9752eb322353b7b6b08) >> +>> endobj +7753 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [284.974 115.763 357.242 126.667] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7754 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.542 103.135 378.454 113.04] +/Subtype /Link +/A << /S /GoTo /D (main_CC76_extrapolation) >> +>> endobj +7757 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7761 0 obj << +/D [7759 0 R /XYZ 90 757.935 null] +>> endobj +7765 0 obj << +/D [7759 0 R /XYZ 90 169.726 null] +>> endobj +7758 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R /F50 339 0 R /F97 2175 0 R /F38 342 0 R /F98 2120 0 R /F34 2406 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7819 0 obj << +/Length 2060 +/Filter /FlateDecode +>> +stream +xÚÝZYsÛF~ç¯ÀS¬ +Gs`Œk³U‰vÍáŠ×Òæ!vŠC âX’Ÿž ^e;yˆcÐ3Ýýõ×Ý`çÖÁη“o®'¯}æ$|ê;×KG`'ð â”8×±óÞ%±`:#c÷í”`7*ÓhþvJ±›¯Öw2.£ùÉM•ëW¯~ZÔÑmžE«ùÕ]TÈé¯×ß_¼&¤'žR|?€Éµô¿›!ƒŒ¨× ¸‘!a¼ðC.WQUMg”c&¨+ÓbÕÒ\y'—²œ’ЕÙ.1Á¸K…P2'ÿºžüB@ vˆ6 P/ÒÉû_±ÃõG=*u<Êàwå\Mþ3ÁÖĸojŽûË$òቀ2„}n–ûR®§ožÓH˜¨‡Bäùa£[Ý(£mkëÆÑyžØ°ó@’x跒օ̢Ԛå»Z–Q—#r9,€†Ö¨5ÖȜ@Gp«ÖƒL[ՔIË[kÛwßNœ÷3Ê°{yøs9%Üý½.£"ݒ<›ƒ“Ûl`õîÌñ"Ϫz¿Ü\$Á/ÖSŸ»_‚þŒuúë[0¦eUë{^ÿ,ÀÕܸÏÔ*elLBû€ÄCc€@6b8‰´)¾Â ¬µÃD@ Â÷=‚¦°aûµ6™Å}›Ù„è=ÄBÔ¹¿[à°ã!w`»K*3f09€£d!TNYàÊê~U›ó|i~yZÜ×Ivk—v'÷¸ŽH̤B@B!£…Å–aô¬¥ÌFÔ¥˜¡]ß(‹GäŽ|юYHስ¡Qâ¿]ÌcˆxΌ H¸ƒ4Àûˆ¨£}óï7¿`>Lb™cv…ÇG…?n¼np²'r¨ðQ ø¶ßÎ93˜lb‚‡þłÇxvÖxöԈ!4ñ—Œ<.lÌ爙Ï3X¸*$ÄË ãÈÃ`Gð,÷\µUCd#fœO”9ÖSÞêQjÞÓI)ò=¢pà3ýè 殒4©e<·k>¶öð„wŒÕ ü«†(ÿzÊ.œ{î"/Ր2J²z>S#mQ8¨1®ÖT‡£hZT‡¡$ ì§Á‹!)¤Û¬û]Z”S»¹ê2¤#–m8qJ\C‹pIÓ¢³§þ#y†j5……~³6£U•›#™-s½Š…a`=s^Ùõi¿™ +cWŸd#TÇ<® 5k¸Åe‚aBæu¼iH•Aý„Êrd˨Æ6Æ©èP©’üj~mÃsµê҆>(r»R“b¶S!ò:Vޓ‚C)@µ”Ocoâ3D[ö>KÅ£ûŒ,*Ë|J9pùGãñc¤!º~IÿNVuÞD–·4ñ’Žø˜•û|_:U½'ݪ<¶Q¼ ¾‡Xœ£:€¥’6iYjZåUÝÂ÷Œ BT«d¡oW'Â0 ˆ1z.2êµÉ礶W=x$û$•¤¶´€¶Â=(Ò맞± 3’ˆŽJ7\ÏøG¤ú¤tÃ1b˜Ãi;Ý0Ï7=(ÁÕ •kš»-ŽÇ£šfvÔ㊭կI;êh#í¨§lÚQw·V]O;>x%ð÷¦Y3h_tú1áób™†aä‡ÞÇÍ4\ۇ3"'BÚ<îùFÔ™ÞÈÒ¨ðú>[h +iÔlìó&²&x“ÇÉr½a…&©„ÐF¯«kïÿ PÄ®\˜Ý%¸pUD ¹½ØÛBdÐ؜33Fq<¯Ô¬ó¸Yl5‡Žm®´w¥Ç2ÝVÊ\í0Ž=Ÿ>''~ÇÕN(F$hÁ”Ê~™æÞGcóNo æÌ¢[[ ÚpY¾²wº2¿€ó|cÌ@¼6®:?-ûƒy,ø(ž.Êü€ÁÏÇ×ô£ùzËuW[ÄyS|eyÝÅu~݀àOÈP +É þþõï§Ü•;Ҍ;ŠÎьp¨•>Ë͵fƒ&úM•F2ÛÄtÒ$r] Äê!'‚™BgœÌ¥LsTêŸÜ¢¶g ûg­_T&ÑÍJVó+9ʍ_ÔùüF·ˈŸ×𥽽Ñºª*ä"é—`ÂOÜY{)Ü%·w²<Ú-ÏÉ2@¶ª«ïf9«ZۍÆI•oV†#{ûí>¾Iv_¹ññ]ô 7„e¿h$ ºìÖS{$Ì}p9 ž¸‹„ú5õ~Œ|Š×ÕouûSÖ $Ÿ¦4™#„ÃPì}uM˜z'¿»VµMTœH:»×n¥XÂù±Ø>%VL€Ý¨Ø„í&T·º‡^ÒCf´XXÂïÞ?Y”Gû-SõìžUÏ?=Ó¸Ÿš®ÌöK¡ +à /žNQƒ„1öøƒ"(è¥= Évï²^¸º4l19ZZ ⃥u·‘‰Ü…ª’âa °²œXäÙ\#…L@QÀÛ%=DåØÞ¹O#9ê…zßãŒÈZBøÉÊ5¹Œ¿i¯!‰rÕ.WG£jKÎ`µjëÞ¾šc O}>ÐÖÍùˆHŒ8#¨6¿óC¥#?k>ó!qAQn¾Éãqnßx^ß ó^ÙÓæƒ> endobj +7755 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.897 707.957 257.434 718.861] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_047e2a717168ae129338109f1afc9a7a) >> +>> endobj +7756 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [284.367 707.957 356.635 718.861] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7778 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.542 683.374 378.454 693.279] +/Subtype /Link +/A << /S /GoTo /D (main_CC76_extrapolation) >> +>> endobj +7779 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 661.133 257.786 672.037] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_9b7061aa20aa4b513216bcdb1a905ce7) >> +>> endobj +7780 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [285.123 661.133 357.392 672.037] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7781 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.542 648.504 375.773 658.41] +/Subtype /Link +/A << /S /GoTo /D (main_BHMZ05_widening) >> +>> endobj +7782 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 626.263 214.06 637.167] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_173628da404c1dc2c4d423cad7f9f960) >> +>> endobj +7783 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.398 626.263 313.666 637.167] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7784 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.525 589.402 308.768 600.306] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_fa62abe41a99d6a01cca319ed860bb5b) >> +>> endobj +7785 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [340.956 589.402 413.224 600.306] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7786 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [462.191 589.402 513.996 600.306] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +7822 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 577.447 156.427 588.35] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +7787 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [231.489 564.818 302.72 574.724] +/Subtype /Link +/A << /S /GoTo /D (main_BHMZ05_widening) >> +>> endobj +7788 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 531.618 245.911 542.522] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_46d5dc7df45abdea275f0295fee58c23) >> +>> endobj +7789 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [273.248 531.618 345.516 542.522] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7790 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [319.346 518.99 393.257 528.895] +/Subtype /Link +/A << /S /GoTo /D (main_CC76_extrapolation) >> +>> endobj +7791 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.84 496.749 291.592 507.653] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_87aadd3a9d47e978a32c9867b13220a4) >> +>> endobj +7792 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [320.409 496.749 392.678 507.653] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7793 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [436.169 496.749 513.996 507.653] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +7794 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.622 472.166 310.533 482.071] +/Subtype /Link +/A << /S /GoTo /D (main_CC76_extrapolation) >> +>> endobj +7795 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 400.42 289.866 411.324] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_703f57855b17ef63b28f88fe13a51870) >> +>> endobj +7796 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [293.681 400.42 359.324 411.324] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +7797 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 365.551 290.971 376.455] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_204fb0538d07ee8ac3d5f2724419928b) >> +>> endobj +7798 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.787 365.551 360.43 376.455] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +7799 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 330.681 224.003 341.585] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_f41476c22751c8d79e8599443aea93da) >> +>> endobj +7800 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.34 330.681 323.608 341.585] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7801 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [219.695 318.053 272.49 327.958] +/Subtype /Link +/A << /S /GoTo /D (main_Concatenating_Polyhedra) >> +>> endobj +7802 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 295.812 254.15 306.716] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_1169e57865dfa83ffc8cc23071248340) >> +>> endobj +7803 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.487 295.812 338.263 306.716] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +7804 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 260.943 284.585 271.847] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_ba8ba56b075b2be7b6309cfaed039070) >> +>> endobj +7805 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.401 260.943 354.044 271.847] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +7806 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 214.119 241.726 225.022] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_34dbbfe20e987a3d55c7a3f2d08f1aed) >> +>> endobj +7807 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [349.617 201.49 407.658 211.396] +/Subtype /Link +/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >> +>> endobj +7808 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 179.249 249.318 190.153] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_100662089d61a01ea43a28a944da266c) >> +>> endobj +7809 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.134 179.249 288.321 190.153] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +7810 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [305.875 179.249 371.519 190.153] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +7811 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 144.38 240.62 155.284] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_128413fc4c3051aaa9033a8030509ae5) >> +>> endobj +7812 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.958 144.38 324.734 155.284] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +7813 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [390.537 144.38 425.724 155.284] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +7816 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7820 0 obj << +/D [7818 0 R /XYZ 90 757.935 null] +>> endobj +7821 0 obj << +/D [7818 0 R /XYZ 90 643.364 null] +>> endobj +7817 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F35 2018 0 R /F23 340 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7874 0 obj << +/Length 1635 +/Filter /FlateDecode +>> +stream +xÚíZYsÛ6~ׯ`_\i&‚p¤'éCÓ¸3i“¸¶ú”d44 ɜðPIª¶þ}$H¦(©ã«<†¨Õbì·@`kfaë×ÞÏãÞèÌf–‹\›ÚÖxj¹Ø’6A‚kXŸû„ &C‚1îŸî{YìMÎ÷Óhy­‚Ì›ü^e^¶<=ýäÞ,M¼hryíÍÕàëøý茐5õ”ºÈ¶%L^j]‰lX@0¢¼·èpa¢øiŸ†·‘—çƒ!”¹´¯âyäªzr¡¦*§¯1—‰>ÃXëì½÷þêPƒ-R†EH$ab?î}þŠ­ž¿·0b®cݔR±Å)ƒÿ‘uÙû£‡;CL¶¨,¼,¼"ô+ƒÎWQ=þ â+°®Ÿ-¿Ó$/M«uÎ^÷ÛFœ9֐Rˆ±Qþ…R±ñëóP@.ójÒêía63®^”2zÒ ŒU’ì“bYe³Ñ²ó7±w;É瞯&ͯ·§×b_°ÀðG¶”ÖnIj9à–Í«5ƒlN­!áÈå¼rëB‹,1y-®M:aò0^ÄՇҊÁ¦#µ¼WT#Ï<ùtYý÷ë×^Dj@Dµš¸#ÃÚVȯKÊ@9ÝUšFݹË&™òµEK?RÖB‘yaRLòe^¨8ð0O½(7 “ ôÁüd¶Ñâ:4âAƒyM\“ÔHd&ûÊ×^˜/KW´gڝüù|–-4Nün\Ùì-À\Dp…3D„1ô, UÜíÏG:W™W¤Ù›7»â^®£n%- jÍú.C$E’­Nµéà¾Nå !åV§Ú­áäöÕZAܟ#ÐÂÅ~G˜»ÏgŸ'+'ËC‹`È0—µ—AÕÛŚ<ÃëÝ¿€e\ mVC@bj¡pZƒ}P Ò$Zš²š¶LÁ%rÀ)óëÛýٔÖZí]%D€W ËJ¯*Ò­~–{±¥o; 燕,‘؊mŠ–ÕaÕÔ'h¡[ÙÄPµ1…êú˜ê.ö¨ ¼Ì ؉×èË´ž ÝY+˜H¸»`¢´O"WbR-Gn7‹­¨)]é,Ž••ˆsçîÒ_IØH8M‰jš“41·($t8í*„¡dȁªBÙ¹Âø“Áéi +]Ny†œ†vmô—#›±Æ§× –;M t[,Évl¨gâ>쬪ä`Ü¡.EœŠMÜù´(æ ³~u +JR¢Ó úL𿺪íJðð¦ýÃc5mغºü‘{ݓ¶mþT][Âη&¯ì¥këMæTŸ$èý010’ëD¹©!B ê:<žz8‰jl–ý~xq$¤“ % ºÙ5»ñ…cڇ ZFa¢¼l„°ÁÓÛ3/ÏÃٝSŽI 8;öß^+ÿ›&Y*˜|\”䥣>)v£¢³>‚ ²*P:ç¸ÿíS3Ñä<ÕÇ>z¯ÙRƄڰ,íÎBÖS5uœ x™=S'* ™p‘ [q?¥$ˆ´¿#¼½W¾²ØòÔéÂEº€½2›üfmM4³Ã9plIå&çy›ÆÀyÔöYš95¨ËkÐtìԌ?x l äÊé-U š3UÜ(•´À,%¸¾ûà`-k²q${³yŽôMb}†Ý Áÿ£ çÒ¤¤¥ƒ0·!Ï¤í½ ý‚Ñ®+»ß¹°;ï\:T”͸؇ѐ›ã0š!JÅç`Önv´ö@Ú¤[K¯jXwRÄs\êׇ.6"@6R½YòZœ¼jý =´@ ’½t‚;;º8ßg¤¯~ÊKöb<»oŒ—HbÞ +úV ÈKy,Èî·ã7fZ<Ì´äõ˕ÞúBÄçÅËsæáM]¬DPXOÎ>`%O¬˜!ʟ!°>Šý¾O¾/ {¿+Î>Wø÷ð·/ŠÙ€ŽÄ9ôžXy? ¢cN”V÷ÃôŽ¯¾i1®;Áyù6*‹=ó±¾W}4—ðªæ*ûq D?oú‹VÌýo­Je«+Q鎨]C3¨þKU¯“ʳoV=ú­W6‰•½H%à E¿.Šùéhtssƒü-’pž¡°ÍçÑè.´¯i^(%Ózo§Ysƞ~Œ¶ãÿ¹Ï×¼ +endstream +endobj +7873 0 obj << +/Type /Page +/Contents 7874 0 R +/Resources 7872 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7766 0 R +/Annots [ 7814 0 R 7815 0 R 7836 0 R 7837 0 R 7838 0 R 7839 0 R 7840 0 R 7841 0 R 7842 0 R 7843 0 R 7844 0 R 7845 0 R 7846 0 R 7847 0 R 7848 0 R 7849 0 R 7850 0 R 7851 0 R 7852 0 R 7853 0 R 7854 0 R 7855 0 R 7856 0 R 7857 0 R 7858 0 R 7859 0 R 7860 0 R 7861 0 R 7862 0 R 7863 0 R 7864 0 R 7865 0 R 7871 0 R ] +>> endobj +7814 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 697.247 203.075 708.151] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +7815 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.573 697.247 296.324 708.151] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_38da38d0fab7eed9ee09fdb11f88fd15) >> +>> endobj +7836 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.636 658.393 287.856 669.297] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_51fb0220102e525b11cdb06dcbe322c7) >> +>> endobj +7837 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.636 619.539 294.481 630.443] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_2f13e4ffe7b47ec50721791877b41622) >> +>> endobj +7838 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 538.776 180.54 549.68] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_1c59e94611b71ddd67acd033a05bbbc7) >> +>> endobj +7839 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.877 538.776 280.145 549.68] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7840 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [348.444 538.776 420.713 549.68] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7841 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.349 418.78 226.034 429.684] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_137dcf52993d2ff3dd6e4678b45baf56) >> +>> endobj +7842 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.176 418.78 393.444 429.684] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7843 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 367.97 178.239 378.874] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_1c2f0ae89d7bf247a76c40282f31758e) >> +>> endobj +7844 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [205.576 367.97 277.844 378.874] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7845 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [346.143 367.97 418.412 378.874] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7846 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.625 317.161 245.522 328.065] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_c2cd6705bce0af4bd9880b990baf1198) >> +>> endobj +7847 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [250.848 317.161 325.229 328.065] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +7848 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 305.206 186.179 316.11] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7849 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.478 305.206 326.746 316.11] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7850 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.876 305.206 430.433 316.11] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +7851 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.625 254.396 245.522 265.3] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_025902247d9c8b46d92c514c1646ff69) >> +>> endobj +7852 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [250.848 254.396 325.229 265.3] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +7853 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 242.441 186.179 253.345] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7854 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [258.456 242.441 330.724 253.345] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7855 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.075 242.441 437.631 253.345] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +7856 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.92 179.677 243.605 190.58] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_af0214aee8884dc52be4e061d6b4df94) >> +>> endobj +7857 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [249.226 179.677 323.607 190.58] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +7858 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 167.721 186.179 178.625] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7859 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.478 167.721 326.746 178.625] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7860 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.876 167.721 430.433 178.625] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +7861 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.92 116.912 243.605 127.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_2560fe5ce16277c4b4db17e951047028) >> +>> endobj +7862 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [249.226 116.912 323.607 127.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +7863 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 104.957 186.179 115.861] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7864 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [258.456 104.957 330.724 115.861] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7865 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.075 104.957 437.631 115.861] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +7871 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7875 0 obj << +/D [7873 0 R /XYZ 90 757.935 null] +>> endobj +7876 0 obj << +/D [7873 0 R /XYZ 90 716.221 null] +>> endobj +7877 0 obj << +/D [7873 0 R /XYZ 90 716.221 null] +>> endobj +7878 0 obj << +/D [7873 0 R /XYZ 90 677.486 null] +>> endobj +7879 0 obj << +/D [7873 0 R /XYZ 90 638.632 null] +>> endobj +7880 0 obj << +/D [7873 0 R /XYZ 90 557.75 null] +>> endobj +7881 0 obj << +/D [7873 0 R /XYZ 90 476.988 null] +>> endobj +7872 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F35 2018 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7904 0 obj << +/Length 2793 +/Filter /FlateDecode +>> +stream +xÚíZY“Û6~Ÿ_¡'¯T±08H€omÕÆN\•cíõÌ>Ù)GÂH\ó2IYžüúm<Qòd“ÊCžH‚ÍFw£ûëC³í Ï^_}{wuý=g³…œòÙÝÃ,Ä3Á ò)™Ýmfïç„ &K‚1ž¿]<Ê4Z½]P<ϓǝܔÑê§ø¾ŒÊǛ›7ë:ÚæY”¬nwQ!¿Üýpý=!=ö”†ˆs›kî7$ FÔkîEÄ“|1$!â”4Q¶qrA>Éqþr'×UTËÍê_ûô‚ahïaðb°ædžì…E”³.z•íÀj>öæß}©e¶i7Z½Í“x½ ~ãIƒ­œYà…Snõ¬\xú€ÔVë<«êSZ/™  CË; ë”À‹ð'­pÂä‹`R9àÀZõŸ}±ž7©Ø{MòŠ0€OÈ9M:9ž¬JkŒg îÃ1Mªð.ßg›8Û®^Ååا ì•àÖÄ 0#DZ„ A¶דèªÅ$ïa$>ܞòO6ÈÀ¸Pn@ƒ +ð"ŒÂÛdéÀDP{À§£ºµ9CÂ'bÐ&EðàÏÚ«L? ÛOÀuâyìdØE'ÎÿöÓÀîÿŽ¸N®ó3h†bº6eÌ?ƒ†=ؙçŸvFù×;C”ü!ª#»Rs +ٕŽ€ìö¸uÅêݳ:-°æ€ãq(h›Î%úA¯ÈÉs¨7ôÒiƒfӇ÷;¥q&}ðYê«ÒÇ_ÙãIÙã˜! ¡¥“À/ +„úägÝ(ǛÓaÌ«™ts]Œ£B½ž†ú· +jMW~QG~2 xD—ÅS VÅÁh€Ã6]¶x(‰Ä ÊtÑ8°ñ?íÐ,o¤4•5‡BTR´!v§¦nŒ‡ Ôm{Púé¼Â¬í‰IPŸK_ޏe'²d&&“'I¾ þü`E~ÈK+{£|PïU³±Ž!–Ìb)‹RªD+‘öS½œ?˜kÔPUu¯kå×êù#ÄaKØ Ë R aˆÐu^ä "8Ó6^ƒ´pPß­“¼’‡zªNè +âZ•ˆŸUð[€ÏżhüÑrÆ ·H!^W)gВX‡€/µCT®ƒ‚øîò£Â˜7·•ª01FVbT»¼¬j 0 ¦Æ‰[”@²ÎS];ÂâC™§fÑV‘à²>´÷†&{С·†£‚Êh£Zíë‰yœ™¥È\ŒUÖµ–ž«"҅"ܪƒT×ôÌ#µŒîUe®Ñ +A/˶´_+낍ìò!®w–ÀŠ”敽“ñvgo«x#+m‡ÐÚÁ볎·ž’Q떙…¯]”<,µm­­7T‰`•`YB ÉßÜZ’fL~ßLϵ»(7¯\¾ì ÖÊ(Îj»“6WŸ+œpê +ð€ *¨Á( ÔjbËm‚!xC²m—TG^hûˆØP}pF>#³Í7N„»Æï]{…lõ_CDÙWB(zD0õ\*BùÑ5“]€K„9¦C+Tªv%4-ÂG/ arp@‡„ek‹t +!‚ùx>¶¥Z®Ä±¯‡Â 5ۋc h 3ør)âÐgÀ`ëÌž G-Ùð4¸î2&Nš–®g‹­?GæRjhor_f&C^;;ìâõÎ~PÊ&ŒN )4àHtÝØJÛ¨Ò¼Ž,¶s¨™üAù©9@„6[çü62A+Ä\cx‚‰MXhŠµÖý¾/t]§× €‹TÖf¦«å~KÕÜÑ0d §jÛÛ£}n˜GÖ56§±ÎcJº³nÐƌÆÌcn+¨>¡üj©}œÔ–i¶1ï÷­ºunV¢¢(ó/±m~Tû¬ÙBS£9gÖ6܃ ±ËÓ|+3™ï+ûN–©¹Ó²Q¿&‚å*øV…äNV–óH/øºÓ ^ƒŒŠà3`¿y™uS_´Å…ÿM崑¨î\'ÙKPRváþ#ØT]5ƃÁ™`T)‡Í*³óA&‰&ª®ïqhxZ‡òçv²µŒQ¹`b.;rŽ|¯EÒ­i4Þ(ºMT“¼Ð],!@íM7éÎT­±Nϖ^¶ãÊ|üóÝ|8mðz¦ë·/›<… ìH>š„ Ã•¢ŽSÛE«qƾ( uö¯PŸ¶2ÆVBÕBxœ§‚£Žö5´ðº}·^žµ¢Š‡¸ªeG­UK o¶å^ýõªÅ*¾,HG£œÞNOã—åÙâ´h‚»'à8BMCùi%qËJÏ G-j[A÷úNã¤}\8­Ãp;þ;àAçtá¿Ñô¿ÎüA‹ˆgPfûþØýÚy»}ìUàÑÎúÌà Èÿ¶ðý¹Uåç(Û7z(KÙâ¥K*©é^3x¼•ÍØÕhöqÖÜýx¥!«×>CÑÁp[¯í꺸¹¾>h]¡}%Šëë¢H®?êqÑ3ô6)5èæÍYřjô5˜ÙÿKe3Ç +endstream +endobj +7903 0 obj << +/Type /Page +/Contents 7904 0 R +/Resources 7902 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7766 0 R +/Annots [ 7866 0 R 7867 0 R 7868 0 R 7869 0 R 7870 0 R 7889 0 R 7890 0 R 7891 0 R 7892 0 R 7893 0 R 7894 0 R 7895 0 R 7896 0 R 7906 0 R 7897 0 R 7898 0 R 7899 0 R 7900 0 R 7901 0 R ] +>> endobj +7866 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [136.138 684.266 242.189 695.17] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_6f27f62cf5d65574cbb44025b1b3e585) >> +>> endobj +7867 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [248.028 684.266 322.409 695.17] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +7868 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 672.311 186.179 683.215] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7869 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.478 672.311 326.746 683.215] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7870 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.876 672.311 430.433 683.215] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +7889 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [136.138 621.94 242.189 632.844] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_715054228bad30a232707ed0357cdd98) >> +>> endobj +7890 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [248.028 621.94 322.409 632.844] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Checked__Number) >> +>> endobj +7891 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 609.985 186.179 620.889] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7892 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [258.456 609.985 330.724 620.889] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7893 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.075 609.985 437.631 620.889] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) >> +>> endobj +7894 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.084 547.658 163.45 558.562] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_62d44847fe22abb82cbac84a776a9c72) >> +>> endobj +7895 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.434 547.658 357.784 558.562] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7896 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.021 547.658 513.996 558.562] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7906 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 535.703 221.595 546.607] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +7897 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 497.287 179.554 508.191] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +7898 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.052 497.287 243.314 508.191] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_09eda1d1953d8f83e4352c6fe78cbded) >> +>> endobj +7899 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.651 497.287 336.294 508.191] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +7900 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [110.861 167.604 170.418 178.508] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +7901 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7905 0 obj << +/D [7903 0 R /XYZ 90 757.935 null] +>> endobj +7907 0 obj << +/D [7903 0 R /XYZ 90 483.911 null] +>> endobj +7908 0 obj << +/D [7903 0 R /XYZ 90 435.347 null] +>> endobj +7902 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F72 471 0 R /F65 376 0 R /F50 339 0 R /F35 2018 0 R /F98 2120 0 R /F38 342 0 R /F10 473 0 R /F8 504 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7919 0 obj << +/Length 2768 +/Filter /FlateDecode +>> +stream +xÚÍZ[wÛ6~÷¯ÐÓ®´±`\’È휶IzÒîn²±Û—¤Ç‡¢(™Dª$[ùõ; .$(X²ÕíÙ¼X48œßÌ|–#<úñìû«³‹7! $BŽ®#GQH§dt5}‚X4™Œñøý„àqR­“ë÷ŠÇåjw“Í«äúŸù¬JªÝÓ§ïÒ&Y–E²º¾¼I6Ùä·«Ÿ.ÞÒSO©@añVûs%ầ`D#påÑ!aܼ<¦á‡URד)å” :Î֛UÒdjäC¶Èª ‰ÇY‘ÂŒ¦RçÙ뫳?ΨÁ#Òº…G(Ãéúìãox4‡ñŸF1n[©õ(  ~W£Ë³ÿœá¾‹9¸˜2„C®fø*ÛdÅ[ÖC> @ÝÂ+YDy«i3ÜR¦@9–ÙbB¹ šæYÑÔj¼Þ¦7êªMÏÏ2€xžäÚØłýÕ¾Pèþ%vQPxXÊôìß÷£Ú‹þäbFßÆäæ9-ŠÚÚÐTô LFn¢’ÕjPŒ8n±½j«´•VpU°`D׿¢-á0®k?ÜQ% +†’Y)úEþÑzº2'ù">ÕR3 ?ž>¶OþÐUI%§ˆN{”Ì~ÏÒFÙÐtFgÚêj±šT(ƒ¤ÔsQ®ˆh?€…½´¬ª ‹ÆR·'oHÆîå(G!À1bd4ið¥~&(âàdÇÙ‡  Z§ž·¤q<ï( ù¸“Èԅ¢; 6u.Ӏñºޔrä¶Í Z.Ô°}6½)ëÌ(´ìUŠ$-u]n×Y¡U®ç”P ó•vÖÊŸ±KlÑN©_•`XáEø*s]R—kMw`ai^·äjÊyß­êÒð3Cµ5á +À“§Íqi +Õ¦Pýä€|¹ÌMOâô¤¡Ž9(K€ðžÖx?ŽáöK³ǒ­iÙîî^r fd«óò[ØÝùò‹Àvž€AJ½z( +l:ÛyÊy äRôÊyà™/L—Ø@!ނD6½v|~– ¹t¦Ùõl÷ÔõߔbXSDàøz>”rGn°¼¡8⦨s“Ÿv²¿Ü=r7ûÕG÷ûÑG$q(øäŠíƛV£×éÌÊm17^6ßz¸kw²Ñ†Ún“=ìIDP±–Îrðã·½%Q¯pBƉ Þ3$(ím‹ÛžN¡fÆ#-|ô謅¦éÒÛîÜ1g4qpð®~XR'°|аð/ƒí'í®›†ZV!ӎÊíöل‚0»?ëÍ×i{âY Ž;B?œ9F$;ñ7Ž7g:ñüÙ»“A<ß×æËè2ùg(uX˜ó'Bð”‰Xv/b)gBçÀÞ6§§#¶Ó„fñÿ±6}aVHÛ£*IJ{¦Ò¢Õ減Dž$~±‚EÙ?JL®2ɝ€æ$Ýyѐ~Ç,€vý˜ó¨Ú–ûçßiz¬óeþÖìžÅ¨)uëå;Iùˆáˆµ:P“c7Àp%[cÔaž ´¨Êµó—KՇ»F?s€I÷ó"©Îð"y}?/=ˆô±¼hàL.À1öxÐuǾ4! ] T}(1݁1ñbtŠÉõÏôÖèÃNµ™Àº¥°C•ï?‘4)]C†–èܐ*͕“EfÎ:óeQV6Rò¦c–ÿêpéh[šl½z9õ[ =f ‹rµR]Šã&@¡Éj5"·¿ú(5Й̍ª¤(U‰€±ðXCC‚XÊEÁvôs‘4PÚRÛRõMë3dýŸéôc«¼–»Òn&…ðÅ ïvέoçÃ.ç‹ôWRåÉLzhU²öý{­YÔ¦}ÝKж'v³|¬ÐZùzT‰iÎæ™<È*úàUEÓÒðÍnÐÑ{¬Õœ™wتÝ>¢#0eÙP@–í9"ÐM)4ý\sÂ_µ§'Óãñœ–¶ž| X÷Éî¤,ٓ |²_¥,µ²ý)2çð«¿± ª×*XÔ¢Éàq÷„+FQ{Ö#†g=Ž»l&€¬oÎd1Ýæ«yí†ü»K#YAݔæm“Ü«Ò)ÜéÖ4zêÏÅæœIQ ºûõ7BD„PæBÂ﯅AË §=)õ–½Ã‘Â…‰ž_½ƒà\묷Ø;Cx‚$Iˆ¸<øã(Ž5MèªÞõ¥6"·<­}JkY#«dÆwJòå õ‹ïÒï¡çú!vX‡v§Xڝbéë)–¾>ÐÒà5ñó«—ê2mÕ¤µ}px4Gdm¼”y[XÀþÕÍùÞ»¸ÓUÊc/)µÚ:×/T=gW‘–‰ÏUA=Ûzpíê ÛàØòS`œ[~ +lƒS`ËOíïMõ3­x<ÒåèŠÐ†þÑހt¥º7´ +צoÞÓ¸&¾UyyÌ#ûó›Æ˜¶šç°Kò¥Ãuw&\r =M÷¥P±]_ÛgjŸa(*8¼PŠ„¡m&±GÇð… +‰#[fEVD®_¯²®ËqgKäçEöt)·|Ýñ3tÕÝ©ŒoŠàç1J\?ÿòï·¿¾þpùÚ£2ˆ€£öÚlN| '}¡y±Ê ù–EÆfv·YåiÞüæ+Ø\ P†e¿½üÞÃP·EúU¦›„kv.•5äϖùz“¥¹ìJLSRoS©í¶#§Ì¿ð +c$Hüм̇]ù°^΃g/W%cPÿk‚Pý«#Qýó dÙ¿O8kÿü+)¶æœW‚Þ8Ȟ‚A§U‡Ií»·Ë,ӋT+û<2W?+>Ñ;¨Œ*Ýg7M³yzqq{{‹ áÎl*”7›Íêb¿]éÐCy³JfÏÖee; ù9T÷ñUßÿÿ|(ïú +endstream +endobj +7918 0 obj << +/Type /Page +/Contents 7919 0 R +/Resources 7917 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7766 0 R +/Annots [ 7913 0 R 7914 0 R 7915 0 R 7916 0 R ] +>> endobj +7913 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [269.857 641.63 313.363 652.534] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +7914 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.725 600.095 193.232 610.999] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +7915 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [293.433 517.562 336.939 528.466] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +7916 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7920 0 obj << +/D [7918 0 R /XYZ 90 757.935 null] +>> endobj +7921 0 obj << +/D [7918 0 R /XYZ 90 171.722 null] +>> endobj +7532 0 obj << +/D [7918 0 R /XYZ 90 148.481 null] +>> endobj +7922 0 obj << +/D [7918 0 R /XYZ 90 148.481 null] +>> endobj +7917 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F23 340 0 R /F10 473 0 R /F8 504 0 R /F72 471 0 R /F65 376 0 R /F7 505 0 R /F31 472 0 R /F95 1788 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7927 0 obj << +/Length 1789 +/Filter /FlateDecode +>> +stream +xÚíY[o›H~÷¯àiזÊxî ًÔFmµÝv“m\i«´²ˆ=±Qm €›øßï08„8iºÝ‡>aðpæ;·ïœ3`gá`çåàÙd0~!™ã#_RéL.;ž$HPâLæÎùļ‘K0ÆÃÓÁà ]ÓÓÅÃxµ]êyL_‡inŽNfy°ˆ£`5=[‰}œ¼¿ ¤!žRIéÁæ…ô_Ë%-#Ê«“>"LT ~¿KÂñ*Ȳ‘Ka>êu² +r]>y«/u:"j¨£C†™‘9x>|ƒR˜ExȃgëÁùGìÌáù+#æ+çªXµv8ep]9gƒ¿ؚßjjå#Œ¹ãQ‰ˆä%Zkâ`­sfG}Iã¾hj«‡}Dž+´mÖÓy¸ÖQÆQ֒2~!pãmO ê×þ˜,­a@ÀX¦ø_–׆ÀÖó¼zéˈˆ¡žå±}1K‚™ý 컊³0Zì½rrö˺–n®…ça£JŸÂhÞ§eˆ +V©t–èYøcª-ì«¥†íÓ= ›(QaUH3û4Þ_ѓo+èåuXÁy\^/ìÚ “$›p•£Žu9†ß®`•ÛŠdCQ›py¬7“@qˆ<֗G­Ü¯äÛDGU X(ՙVžh«TŸí=»pƒ%˜P@ä y;þ–Enâs¥G†°À3ñÜ܂“Ё#Ÿ^F㈳>CŒÒ^J3"êM~*W´i`Ԗ¼îaþ¯÷xbAÐáq ¦¯Ã|;-‰²C0†r ë½gõ{jQsóov…h{Ëe‰õ–(W>ýëýôøäÍéëçÿü1yß!X1$•¬ƒ“H‡l¨vf<£UéåÂC¸¾@+Àà!I-õž¤ó0‚À-“w'&¾·n é¦`5!†E.íWkÚ,c8¤0Pñ,( +Ìb䙗OBKá"ŠS=ï¢؀Q„½=b`ߒ¸'»‰ÁC¢·ÞRŠ¸¨Óƒ tÀÞC¡½ë‚5oõwc»³Ü«.€¢ŽMË$÷á3(S„öw7á]÷ÒI¨Töét)F›<¦9ˆÇ`?z—;@}îñ^kÉèä1‰„ªWl;‰¬ì³,‘žãCFûmV9€Ü èqz·q‰<Éû¸ Xûþì1p·Ð×É*œ…y'Á™>[IÚ¦©gЌÌ-÷aE™N¿˜Ö'ÈÐÛ%WeÆÌí[I’Æ×áÖÆQÝvàöòve{ÛQ ß«­U²ªK|¿íïC®üG×õ=º.ã¬[™Ûã¢æa”O϶ø£|ÜEKèŒê´œe]©3„zHïpP¦1ˆ Ìz2-jÏ —i¼Þ›*²†’ÕT5«muÁ…ÊçíæèJí4ë˜ýÃȣ얫0†LHažíãÜ tõ0ØÇ ûwc-Œ±®=1" AèR¨ û× ÌÄÎˬ‰í¶ÚsZÇÏӑË8«]f~—1Λ.;¹Ü—-'Kò1/o‚T—¢8·û›³†taÞ¾8çåUÒÜب…Û®®åZ,oLŽéÃGÐ2Þ,–El($™×® Æó°Ø’í:ØV#¯ážRN­y–o®ç큸7~L>öû&e MUËíϯg:1Eè~.÷wªeùüè(ŒF Vá|¤¶ŒôDÌ >ñw§%il ze“ ¼üú¼æÐ0¿?g â»´˃4›ª :œU•0ҟ7 Zê¬ó‚zÌ¢ìkWCñ£>¸ŠÇ®†‹tcN(ﮆf{Y»d¶è*‡-:{ôrÈ9R„?¤½IcMµpñ_°EÖ_Ÿ$ÜǬOô¶­ÛŒÎî„æéAv„ +ÅZ¯«£Í•6ô—íq}uš™—zµ½³·v™iìE7§Èœò?ᔗ:ÒiÇé 6‡N³’¾èð¾Ù$Ë"Ê{ôþzQY »½ööù¾Öwµ®&i}„÷'Ø­ô-&ø‘­ƒÕJþ€»¼TU5/?”4—'6 ¾‚û¹6ß4¢¢Õ‚Û‹m‡”K$1»—.“ž¥Ó¬¶t°tjð4èn;é쮐ª=3.î;옓 +š2uèw¹â;ì%¦˜²Ÿ<ç…؆NMkˆÀÞVLPÞZ:(oÞe:ýÙۘ|DÓ¬W™W}VªË Fæ#eÙû<|¦µU²Ôì“SýúsP˜q‡²&Κ;–yžÇWWWh–¡M&) +óq’¬Æ7kFC +´‘;º¬¾t­ãTW%–'=7ìÿ/ìý4 +endstream +endobj +7926 0 obj << +/Type /Page +/Contents 7927 0 R +/Resources 7925 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7766 0 R +/Annots [ 7923 0 R 7924 0 R ] +>> endobj +7923 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [320.997 375.253 408.311 404.319] +/Subtype /Link +/A << /S /GoTo /D (main_Octagonal_Shapes) >> +>> endobj +7924 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7928 0 obj << +/D [7926 0 R /XYZ 90 757.935 null] +>> endobj +7533 0 obj << +/D [7926 0 R /XYZ 90 681.007 null] +>> endobj +7929 0 obj << +/D [7926 0 R /XYZ 90 666.559 null] +>> endobj +7534 0 obj << +/D [7926 0 R /XYZ 240.245 591.933 null] +>> endobj +7930 0 obj << +/D [7926 0 R /XYZ 90 575.328 null] +>> endobj +7535 0 obj << +/D [7926 0 R /XYZ 240.245 500.702 null] +>> endobj +7931 0 obj << +/D [7926 0 R /XYZ 90 484.097 null] +>> endobj +7536 0 obj << +/D [7926 0 R /XYZ 90 310.091 null] +>> endobj +7932 0 obj << +/D [7926 0 R /XYZ 90 295.644 null] +>> endobj +7537 0 obj << +/D [7926 0 R /XYZ 90 178.516 null] +>> endobj +7933 0 obj << +/D [7926 0 R /XYZ 90 164.068 null] +>> endobj +7925 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7937 0 obj << +/Length 1823 +/Filter /FlateDecode +>> +stream +xÚíYëÛ¸ÿî¿BŸîd æò!Rä¢ Ð¤Ië¥Éu] ‡$Xhm®-œ,©’|»ûßwøÐËÖzCÒ; ý$’Í çõ›±q° pðföb9»x-X TËÛ@á qJ‚å:ø‚X<_ŒqøaNp˜T»äúÜâ°È¶z]%×?¦7UR=\^¾_5ɦȓìúj›”zþyùÃÅkBì)UHˆ„[îr$# F4j –<"Œ·ϟâð2Kêz¾ 3EC½+³¤ÑîäúVWs"C¯àˆ)ÆC†#Ãsöj9û÷Œk£¯v³Ÿq°†óŒ˜’Á¥Úeð̂«ÙO3ìMŒ5µTã(ˆ©@DDNÛW÷+]6i‘×—V‰C.¯ÞT¢«`AàˆsÇ¢n֗—i>pøk’¥ëë¤Úìw:oF /^s<´)GŠvFßVŜòð.wVJoݳÙz³Õu£wn]ø—ë*iŠÊ;õϼhÜ ß<¸å Ÿ½?ß&¥{–Eš75šp삆cÁ"¢ˆp9QDQ¦MëâãБø‹Š>ðq¤Z‚æ¡Ôy²ƒ[ƒ09Œ±B±$§¢‘2Äãζ_!‡ˆ‚ÛJyêc™Sz/""ƒ˜›ö±óü)‹ë· 1?aŽW´Æ¥1 ‡W3ÙUäŽì;Ç~Âqlù—Ûé|6õȓ<›/8'á˼¬ïÓæáÚ¥ø1k#Eûݪû`BD$`ٕ¥?{Š3².rþò÷Ÿ¯_¾÷áÇWÿz»üy‚Ÿ„8•h0™` >€j(éØÓuß_¹çmUì’¸ôç«F"Œp_D[·ŒÄ{¥=‰ÍWPˆÃi¬¼f|¬‹¹ÕÌ<fæ aÓ$ižæ›)50·µñ¤ ÕEǾ6œœ¤lSTi³ÝyÉwÛ¢Ö­P sÂCöl]hOhK–Y8Š•Ök··¶3‹"÷‹ºÔ«ôÆ´%¹y˜r4¡ÉÃd; ÈÑ­8ԕXôÆ]0¢Â··“®B’ªÇ¢|ÄTPDU—ki=Á ÀµÏƒ©01‡ù3XÌX)ïVnáùŸf¶ôG#tõ.É2mË쬕ÍâdŒ,LOs16î¹{Œ0–dÁ`Œü–ƒ©˜,ÔBB)'۝xX»N(—ÀñoÕímޘV š +‹`ÙTc&º'UOaá•úšº?òë—à$TBŸê5E>ÓÍ&ïËþo‚Gà¶/Šû)u!Œ©ŒÎW÷ GO´ÊŽ“øLíxSY÷Sœ  E|P +@ºu*HZ|8õ1§à@ÉÏð¸Ši'ñ×Åo¸‚ìû’óq°0‹Šóá»h›å¶ÛN|#]Ü;ÜÅcÀ]ڂÊbǀÉ0Í·°°v§Mûº.“•vëf„:µ­¼±‚zRéD-æ-s9ªæ¬ØUuxÝIÙµ')+€ËÚÞÒ7ÛÄ¿NóU¶_ëzJôxxmŒ”kB¸ÈÅamúIò…Ô„2Fâý±Ñ z8IE?;éÎ5nQi¸u ó—mLF-؋¿zÿ6~ô¹Ñà ,{xo5n+œhhºŠ¦’ä1#(5=.·í°–Øvݏ‹£1.ÝäEešKV\¤kµÜv_·”ÝpgºÍ¼Ø¥P¦ìþ <<íba#r>æ_wVÎt¾i¶×ºªŠê”Ñ iiO ɌS;$³¶—1>·ÌÙ ·Ì›bº£ˆsÕÚû‰ÊA Š¢®Êõíií{Ù,Ü%÷én¿s§ÐR9Mmjº¬V3 +šùºL¡|0q0Šx­'%£ #~Ç’úÿ$þ{Lâ‹a«a¶oªtmVñ4¶sSF煍!ž@vc´ ;!ÑYó·âPžäyð­#â|C§SúMpñ præMYV¤'äE=scþ1šGCLÜ2ƒçÍ©ŸJÍq‹æ°¢9l-šÃ³#u²Îi˝à|(¬>øÖÃ9¬z8§¼£÷7µjvp~,û¿ŒçlâÕx(°\ª#0·Ÿ@[‡ÙÞlëL|u¼½¨ÿ5ðnúBoìÑ·è{ôÆcôƏ¡73ƒ"9®¤ãèHQ6 ߸…o<„o|߸‡o<‚oh!È…ïÎ,‡k‰‘çþ«aÿŀ;ÁEb&ýFîΣƒ”ù`ngàÕo[|u[²nóÏZWßÏ9}¸½Kò}jÏ~5¬ ë]9ƒCŒÌ_<¦¨ÛÆpx¥µ¿¤»Ù/A»úÛÌzª×—Hhtp$Û¦)//.îîîЪFû<-+”6e™]GӀ Œ»=¬ßBèYÅvf>år8„?eÿÿã;ê +endstream +endobj +7936 0 obj << +/Type /Page +/Contents 7937 0 R +/Resources 7935 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7942 0 R +/Annots [ 7934 0 R ] +>> endobj +7934 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7938 0 obj << +/D [7936 0 R /XYZ 90 757.935 null] +>> endobj +7538 0 obj << +/D [7936 0 R /XYZ 90 694.089 null] +>> endobj +7939 0 obj << +/D [7936 0 R /XYZ 90 679.519 null] +>> endobj +7590 0 obj << +/D [7936 0 R /XYZ 107.534 580.982 null] +>> endobj +7940 0 obj << +/D [7936 0 R /XYZ 90 564.877 null] +>> endobj +7591 0 obj << +/D [7936 0 R /XYZ 90 362.365 null] +>> endobj +7941 0 obj << +/D [7936 0 R /XYZ 90 347.795 null] +>> endobj +7592 0 obj << +/D [7936 0 R /XYZ 90 143.848 null] +>> endobj +7935 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7946 0 obj << +/Length 1814 +/Filter /FlateDecode +>> +stream +xÚíšmo㸀¿ûWèS+5CR"EmÛìnq/ÛÝnr@ۅ¡ÈL¬«,ù$ù’üûEêÍ¡åx›\q½û¤SÙáÌ3#ÊØ»õ°÷·Ù««ÙÙ[xIN¹wuãIìEœ F‰wµò>ù„  š/ÆØÿ0'؏ËM¼ü0§Ø/²‡µZ•ñò»ôºŒË‡óó÷Ißyœ-/×ñVÍ?_}sö–xJ%â<‚Éé6CFŒhظrȐˆ¬ð×c.²¸ªæ Ê0“ÔW›m×ÊÜù¨nT9'ÂWy·0?ÀL˜½¹šý4# {¤q ‹P'›Ù§ÏØ[Áýo<Œ)¼»fÔÆ iÇÌ»œýc†']L„9¸QD°õsÝêøØv!al8å>P2”í€úa«òx¦°Íé͈!!§¼I â´ó÷„n`ŽÈ—êö½K7ŽÂ@<]¹CºÐOz‹4ԁ½Kf½Bð¡ÓÁK&b:z%¡S&œôX­E@…ÿ/ÌpRäUm._½>¬3ˆÈtv­$TÈÉdÊiÝ,0#$`¼›åzåҜµ#þ4_pÉü‹âMݧõC·ŠŒ#LåxM–?ž•ÂŠ‰.>’N˜cö£ˆw©õ;b( <ٙøÕßX^¼÷á»7ÿüúê‡8 .x;Œ8$‚ ‚vŽý”æYš+m9P@Ýo³4IëÏæ9†Ï-¤­>‡8†æùW»4[YÖŹ9¾¿4Ǜ²ØØ_ÌáÕks¬tà ÆµØŠ³>½ZkJ +idá§ùZ•i]™»µùYøÕ6NìÈUºQy•¹¹,n̈º•ÔLª1“.BÊûi®u΂ õÞ¬ûómŠÊٖ*I«=-ëulNó$Û­TÕ7#Íé‡Ý{+ºÀHJp90‡`:"`¬Veu>z¼3N"¬ÃW Ìè0OŒV›„H†}ItjnNw•Z™³º0ÇÖ©ííöá÷—û¶Ž”\Ø9õ‘PêJŸCچQÆzmÓ6"›B{»ƒ©Íö—ô6/ÊVñ¸ÚÓ4În ˆºõfßÄu;t  Ï‹MgæÚè9'Ìotå̟^WÁy8^Ø7÷‰ÚÖÉ'.ªìC¬ªWçç™ÊoëõR•eQNy ò™FQïµ²˜Sæß5Y ‘|cŽÖ)²Ë96Î9Ö䜃3G}há»d¬o«Œ÷¥ O3oâût³Û˜‹8ˌžfMëe™Mqˆ„vñ0µÎÈANhàLº1Š†MR`;¤wjs [³ÚowyR[ó±ÿºHš‹›[6ñiˆ¨©CAˆ<¡Ù‚Çdð Ä¡³ösŽH8ÙÏ(B¬+×E‘iÏÒzà +óIsƳ»,X„0&€­äÚèVê8ÍmÆú—FÇ[¯:dÊÁ÷gƒQÔ7ËÎ&™w€¾è["i[ç%¤eØ{ÉÖgÁ§0”22.øU½+óÊ%8@¡èl©Ër¥0;î–Û0Fw–¯Ež=X@[¦Ð¡©,D To+z@Ý µ®ÇÔèÅaô<’ï¹$Šåºüš†>º žú|@ý4Ÿ‡Øÿ9ÎÒÕ2.m͛ ¿Å©þ¼Rô$çӓœ¯×ÞQ=8Ѥß¼ta—¶rw•iÔd`òu¦œÈ§„¢H¿šA˜G’ŽQMGõ/‰êª.ӤΖÿ-³E¸ù:Äì@ƒ6?í^Ä!jÿ [~Ìn#¦óÛ!‚sm }&‚SÀoKÿ"}ûïN‚/HpÊ©“ ¦Žõ{A†àZÚsœ˜îbš}ƒÙÝì£Lœ°U˜Ví0­Ý鴝É*­~,Ò¼^Þ4oâí~Ðé\çÂ2ú-s=„`Õ½ãÿ;Ø'h£‰pÐÄà‘ÆŠ¦Ã_ÖÇNbýþ(iŸ×u±-²âöaDk?åÉD'B"#7ÑÃ$zÈÜ=9‹Åӟ!(¢Ñàs¡÷ò¢È—Ufö„ñ' Þ"•p‚8ãnú þõ' +ú²»{ð7Ÿ1Ë»´^;é~¡OKèÎ쵓«P9 é”K5<‘¬âidÀn:þђu¼/\Zcíýu‘­ÒüÖîz«úN©ÜJm‹è‹ô]cý’ÞՏ'ˆ 9¡û.þâFÚjʂ_u#L^¤v_&grj!Õ²ƒí<³ÿ.‚<ñÍ@½sûÇ&cáއ z³^ÃÌ^¶43—iæâûJ•œ3æÛ¬yç»ö³‰FÅÏZ”*«n?#M*âh¾š—JY#eÿöÚ³ogo{}‰€J»`X×õöüììîî%Úåé¶Di}¶Ýfgj …„¨O؛¶mŠv)Ònn<òÿ_ª +endstream +endobj +7945 0 obj << +/Type /Page +/Contents 7946 0 R +/Resources 7944 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7942 0 R +/Annots [ 7943 0 R ] +>> endobj +7943 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7947 0 obj << +/D [7945 0 R /XYZ 90 757.935 null] +>> endobj +7948 0 obj << +/D [7945 0 R /XYZ 90 733.028 null] +>> endobj +7949 0 obj << +/D [7945 0 R /XYZ 90 531.811 null] +>> endobj +7593 0 obj << +/D [7945 0 R /XYZ 90 507.442 null] +>> endobj +7950 0 obj << +/D [7945 0 R /XYZ 90 507.442 null] +>> endobj +7594 0 obj << +/D [7945 0 R /XYZ 90 411.728 null] +>> endobj +7951 0 obj << +/D [7945 0 R /XYZ 90 397.976 null] +>> endobj +7595 0 obj << +/D [7945 0 R /XYZ 90 304.299 null] +>> endobj +7952 0 obj << +/D [7945 0 R /XYZ 90 290.547 null] +>> endobj +7596 0 obj << +/D [7945 0 R /XYZ 90 196.87 null] +>> endobj +7953 0 obj << +/D [7945 0 R /XYZ 90 183.118 null] +>> endobj +7642 0 obj << +/D [7945 0 R /XYZ 90 89.441 null] +>> endobj +7944 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7957 0 obj << +/Length 1605 +/Filter /FlateDecode +>> +stream +xÚíšKoÛFÇïú<µP­÷ýŠ$ÒM·—4himåC%)+î§ï,Ÿ¢¼–åZN“ —˜TV3³ÿ™ýí,)\8x9úñ|töB²À #© Î/ƒ% ”çËàݘÄÔdJ0ÆãׂÇaž„ó׊ÇY|³²Ë<œÿ]äa~3›ýº(ë, ãùÛU¸¶“÷ç¯Î^²cžRƒ¤T༲þ}=dÁˆòvÀ¹Ç†A„‰vÀ÷Yx‡E1™RÁ˜¡c›¬ã°´õ'oì¥Í'Dmº€˜abÌ°t6GÏÏG˜Á©d +)p¼HFïÞã` Ÿ¿ +0bFÛjTpÊào¼ý6Â%¦ a)v$F ‰Fæ² ñöÔ5ìz#7í€òfmÓ0™qÁ½Zœ(&ŤˆªNî6ñógY:c!Ì(Kk󨎩óL š$.2¢QãÎʑSú´…3o6«+£žã|•«ºhþÄ/²´(ë[Pâ*ßÔäî¿© ±šÐHò.¸Å•Ç¹Aw#À©Í՞êá»&™D¼ö]”ÆQjß×ÞV8g 3ü…ª/¼±å&O›…Q®šØóf¶Íç«,^FéU}saË­µi큄P¼Šö±cæ ˜#£»1å**<±B’y_ŽaºÜ‹oÑk}ہ‚Ë^‘VãýªÐd;Uë¼]¨{é˜R¥†Áàa.ë¯<ÿ°°ëJ¡Ùà˽‘aÞ5R؀ò¦ò[™(Êål¥ŽÇ×a-ça~µIlZîE3Üd:ñÎWy6¡b¼MkU¢KOR8EL’#rBœ“ÛvˆDZ©ÃÒs¨×nõ…y“ÑeS/@Ði”.²d åw[äYS +jJ í”“ÊԞòs‚çK{jxÊÏž „ÍÃ2˱ӥ»“Ù‡ÎAŸ„#êK@çU§´‡œPJb_áuÀO¿¾ïá¦tS2æ&i°)‰Mb>nޛ!Á®<”¸Ô‚¨ H³†¡rÈPõ„ 5ØÏP)áú C%R}q^dY\[;Éi„#!NgèÝ7R"e:hc d…§<ŒZd84þáŽ(a…? Gšvñ^‡¹/b†¨~ +(†IC1„¡Ç0C\w[J mÛ½‹dk·X²4¾®Õázáˆ2yKŽ¡Œx¿³EŎN{ÛxŠ|t–1#NÁ:Ÿ zª>#|Õàó@JØ~JÒ¬é ÂúO±û|kªÂÇmŒÔüI’µŸ#F@èǽÕ_)ú1)z‘mÒe1¿¬úÍ,™‡™›ÒµûÇz{ΟaՇùüù‡uÝ£}eùúO +¸¤k¿¬ûšg†QIˆ]}TêεêÓÅn/È!Í"¯²Õ2÷2ϒƳKšpImÒ¼@&˜ÃAæ#YÁɕš/ÈG%«;ãS¶Ɨ§?©ü—&–ë÷ó×|åïÿÉß WޞŠ½ò8ö>Íù_c„;öò/’½UÂEîᮤêTà=š¼@\Ö¶Âê+y?qò|z Œ÷¡WßF¯¾ ½‘þ‘¾½à'†èÕ§B/ôʃèx?)z“ðC”Dÿ¸—Bï’ÖÝÞAZ÷_Þ§¬JXôƒHûÝdª”{f/¡(é"rkèNʽUî*´Ø¬ç©Çìe†ÈSyXú=0aö^¢ao띫²\ÏÎζÛ-Zh“FëEåÙzŸÝîv¬Žú÷<—í ¯$Ë»ó.|˜T¯néÿ/óÛ~ +endstream +endobj +7956 0 obj << +/Type /Page +/Contents 7957 0 R +/Resources 7955 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7942 0 R +/Annots [ 7954 0 R ] +>> endobj +7954 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7958 0 obj << +/D [7956 0 R /XYZ 90 757.935 null] +>> endobj +7959 0 obj << +/D [7956 0 R /XYZ 90 733.028 null] +>> endobj +7643 0 obj << +/D [7956 0 R /XYZ 90 636.968 null] +>> endobj +7960 0 obj << +/D [7956 0 R /XYZ 90 622.506 null] +>> endobj +7644 0 obj << +/D [7956 0 R /XYZ 90 520.941 null] +>> endobj +7961 0 obj << +/D [7956 0 R /XYZ 90 506.479 null] +>> endobj +7645 0 obj << +/D [7956 0 R /XYZ 90 404.914 null] +>> endobj +7962 0 obj << +/D [7956 0 R /XYZ 90 390.452 null] +>> endobj +7646 0 obj << +/D [7956 0 R /XYZ 90 288.887 null] +>> endobj +7963 0 obj << +/D [7956 0 R /XYZ 90 274.426 null] +>> endobj +7647 0 obj << +/D [7956 0 R /XYZ 90 172.861 null] +>> endobj +7964 0 obj << +/D [7956 0 R /XYZ 90 158.399 null] +>> endobj +7955 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7968 0 obj << +/Length 1931 +/Filter /FlateDecode +>> +stream +xÚíZ[oã6~ϯÐSk5ë(f‹}Øb¦h;Eg;)öav(6kW–\In&ýõ{(RWS¶3ë,°@^&”LŸsx®ßÇ1|õ·Û«ë·! R! ƒÛu p C‚%Áí*ø8#19_ŒñìýœàY\lã»÷sŠgyú´Ñ«"¾{—Üqñtsó˲Šò,Nï>l❞ºýñú-!=ñ”*†”×Ò¿µ[Œ(o6Üzd(D˜h6üõ”„ïÒ¸,ç *0St¦·»4®´}ó«^ëbN¢™Î–ðŠ)&f K#óêÍíÕïWÄà€ÔnIP¼Ü^}ü„ƒ¼ÿ1Àˆ©(x¬wmNüMƒW¿ÂÎÅxÒՑBó@Ò‘[k‹ã­®tQÞԆŒ%]¿U¢ÚI¬‚üłZ1úó®|÷ú­Àý00ðk¼qîH“LDž]ë93£Ë2É3û®Êíß{·N¶ÉŸzeËýý¿ô²j÷֑¡ƒÈ( ë°QüOŒ™‹_ÿD©ˆ4{ªMRÚ=ã¨vÏ_FgøÇXƒøG Å]V—ûÝ]vÔA +Eرƒ²ýVq•;åkwÖæs[èí~kŸþ˜S1‹Ó½>aŸÕe ìì[°ñóV:Ë·Iö‚²¾}uàAÊð[à †Hà6ÒU±×¾(†ˆã6Œ‰³6Î\BåYúdWÉñƒ$®Âã´ÌGS‡FcÓûYºP…$4™ƒB®¬qo>/õ®‚RxfUÂ+!\T«ÕÍM’Í9§Éê.. ¡²êX¤xv‘.rs„Ǭu‹§|(b­ã›NpÔñÆážb Q$å%ju¨¬h²5³›æ²H²e¾ÝÅUrŸÚȀëF¡`°HDÒ~õ‡µÏLèÁ"º„™…]Q™”b’›yQ=™%›å…G² uÊÝF4‹ÎòÊ +¾Ï÷ÙÊtQóv]ä[»Šïsӄÿ0ÿèo<º 1í´ÍŽ5¤¿¯Êƒt&c텮öEfµ². +B󭝵m×ô4˨€ÏPè”öŬNšé7hÁq»L7"PXáA;Éä±.¦mê¥zíÆÔ>«òýp ò‰…ûú‚QDšÞW#"Ä!U ¤8„*0âÁÕÇÐ` +ÞfOõ´ÓÌþù"Â܋}BŽˆ‚¤hCvŸç©•vðƐè¦÷·'µûN°àÐWì±Ó'¸æ榐¯"‚:x ͸²ïjär÷ƔŸs´˜¾²¢‡ÝY†ˆ²è°j‡‡‰ I—× )ñì»\¯¡ÉÐeb÷¤IÆ)Ÿy4PèK$¼”†•_C¯;: uVÔm–)^‡tPN^a$£6ƒ‚èãÆ*ÞÓ' B¾×Y6ùäC§Á'|’û-ÂO¬0›‡‚ÁÐéÒçc’pûÉÓ"×À¬fVC—¦®Ê­»cé̶³ÓÀFuSÁ †©6faY%¾‘& Bȍž¼}+J«ÒŽLÛÑæ,;Ô!!èø (áQҍ4xp#Íèé4çÌ;ÔChóô>èÈGš“̪~Ü$ˍ+„ˆB±ÓaWZÆ¥>@€klÿìò$ssæq£ íá¦u„ø,¸Vè&–ƒ¼‰SÐÎ6¥ö•h“—b˜¶À:÷•}¾²ÏWöùòìóø%E +ËÁ‰Ž2DXµÕô6å¢TSqe‘6V/—Z¯Êº ’Ùc’¦öƒº¢à+1Tۃ¥¸9¼nÚ,MhÍgË4/÷Åðsó~ªÍ±ú’ëŒQ)vØæ@GR•®Q xD&ëx äÀ0©|eùÿ,ß°>q +Š`…@r9 DTäçø\ôÁ}’k¬eä¶xȼµxȬNS|¬î˜Ê$Å'( +£±öŽâ&(>Œ§ðx„> endobj +7965 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7969 0 obj << +/D [7967 0 R /XYZ 90 757.935 null] +>> endobj +7648 0 obj << +/D [7967 0 R /XYZ 211.842 575.144 null] +>> endobj +7970 0 obj << +/D [7967 0 R /XYZ 90 560.42 null] +>> endobj +7649 0 obj << +/D [7967 0 R /XYZ 192.853 284.896 null] +>> endobj +7971 0 obj << +/D [7967 0 R /XYZ 90 268.792 null] +>> endobj +7966 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7975 0 obj << +/Length 2138 +/Filter /FlateDecode +>> +stream +xÚíZێÛÈ}Ÿ¯ÐS"QOß/“`Ä°Ùl°Îz‚<8ƀCQ#&©%)ÏN¾>ÕlÞÕ5ŽŒÝ‡<‰¤ZU}©:çTQxñ´À‹ooþtsûN²…AFR¹¸ß. ^(I dq¿Y|\‚˜Z­ Æxù~Eð2È÷ÁÃûÅË,yÙE›~̃üåî ž²4H>ì‚C´útÿÝí;Bzæ)5HJÎ+ëpC3 QÞ ¸÷Ø0ˆ0Ñ øfΛ$(ŠÕš + Æ ]FûC”‘{òc´òÑË( á3L,ÖÖæÍÛû›Ÿn˜Á Rm‹PHãpóñ^làùw Œ˜Ñ‹çjÔ~Á)ƒÏdñáæo7¸Þb<¹ÕÚ ŒùBQ‰ˆän¶o£CgiqWMblåöý•j¤°Y¬ <™(ÊÍÝ]œ®8^~’xóäOÇ}”–ƒ·ïîï©@†¶›¾Ë³ËçÔíR¼­7¹ïšSÄdó‹èçCîÆ ¬ÂÊ8&Í  ݸ1tpXiÕÄ?1f>gÈèÖN¹‹‹ygy}ěÖ^ÀŽ®ã4Ìö‡ Œ“Y‹5eIÁì¢ù?o}ÓĽ垙%›¥B²‹^²fŠÛ ,_Üe–{, ‚0ÝmkZŽM§Yé.³cº‰6îf›gûúq”¸Ã^I±üÇ7! +ÖæÓ6HŠÈã1$ {Ï£ò˜§×6¤€ƒk÷-N·©oui­›Q¾‰J@-Ñ7³™¦BkŽ5ŒâW¤Ë«}œÆûãÞc“sĺ j#/‰¶¥»:¦ev ,‘­ÖõÏ×ÌB­îÁ.b€t5ö– nâ!àlî9Hà⦠̗C”{˜¤ÆÜ °’#"äY„H‰v¯³,q֮ )Ï2ÄÀ»ok°Â`Ìà¿™Ûš»»êãÿX.`ò\à°Øf5Ëïã4 +ò‡·6ý,gVÜÈß8ÓCpV qAN³v¸¨$]\¯¥1Ë7Y´¡alq{҃²D§=™3ð@)"\Íx€åMzPž¤zÁ Íȃ‹Š©©¯™†LΙၠéß_ƒ€œø6J£<(1«,ó¹lÁ¤ ¦'áµÀgÌû)60`™.`>ÆiAñÉ +kÂ!Á÷ðSÒz?VxXø 3dTÇqù1òs\—×vÚ¢Xu‘¥É‹»Š}&@hh~ªíO£p>+¦±5›5S;õQ%ô¼vðøhIÌÞ8«·$·âÔËà +aI®ÁápTýŒe„X—ÕLžwq¸sâ‚iHŒ #< ŠšÊ]}§6mØW·ŸíB‚äXë×^¸C§5­<ï¢<ò1¶ÆVæUâ, ¨Z(ǵƒ–ʬp:–5õ4äÈ¨H¦ âle¸¦ œ2Ê/WµÌiÐdt¸†)ý +GByOÀ6\!¶»ŽVD,ÁLÛÕdîó±ßÀ½åÅññ_QX¶c=Ael’Ókä” ªvÐïG‹b'€> …`êZZøŸÜ#ƒõÉ¥PôP4Û^ž3StÎÜ åˆ>&gNLp¥Ìõ§XyÌ°Ç?ý(C±§Å8ÝË­x;Jå§]iuv)q‘ º³ÑÈf®¯Y²"ˆ +:Œ›§³u¡½jÖñ]d厔Mž¥@P9Ç0Œ¢MaáÐÇIâ¾°©eUxüä*{羬ÁÌ>±‡k?Ã$+ŽytòýØ1 +Â/¨„`'`g ÇeQã5ǐU#Õ?Zç‘,Iªªº ùÅ¥=¹ReOÌëK{r­Úþ*Uó×ö¼®íϔö¶ÖSט¤@ºk¢ØÌ%²—ÞҞC1cfÃךfcӕà"}UDZUDªhª´ÇŸd¶²'=éÝøî +{2)ó$FD]¡°ç€Ó³…ýefZõ;]̓nùR1Cü+6¯ž<ր¨¥þâ֜;ã¢n ˜Qk€_Øs­ík ÈÉր™m t.?[õ—ÅgñJí®gÛêë´‚Í桪 ó Uá½&½}3úÚÛ€ÌàÝ6†Þ²”S>(K}9¤)¹¨Õ`ÏÔ¥hÝjþãfS *‹0;ØóyŠ¬Þr}‘’ã…œ$@×{‹˜â¥€ðòX4Ðrp§O>Ž2[v)v5~žà)d–‚"ð+”:áy=Æ1?QÈ㐗5¶sµÕ°î‹ù• +ƕ¿±šœq`íÁµÕëÖéÙ€\†ŸK8´®å_q€5ê/V?+◠+Mf]UMxðdu‚S¸v®¬Q¸µ.ÍàŒ÷AÒT$ÅñpÈò²)_FûÇ:)³=lˆ—µ˜A’ëiÌG¬%þÏZ¿,k3´õð¡‡É^ö2€}]»7,<3Аúú¢—е¯¶„žâ¯ò›FVêñk8ÂÝY„>€ú˜w5å/ÊZ¯jFÎa¼€•ë¯BZÅ9H' yO';V³Yµ^Ia ’ùu3Ux‚Á(è(vÖ¼ì^¦NT- +a¥ç@vï}\Ý¢ð4gQ%&8‹Þ_à ¢„ (œÇÀ}ÀÃuÍa”ºWö}¨ׂ´ÏÜ« ›­ÿ3Ùµ‡>þˆÔpêúÒ¿‡T]È(¦ëÞƒ„à£4yoû֖~êۆÜmMBîæïE”ÿv%IJ^ö_ƒô$Þ¶¦ ËÛþ7èQ‹ÏȾÆÀËQT/Ò­ìߋæê/®Ú͗hàó.Ôvey¸»½}~~FaŽi|ÈQ\ÞÉíi®ô¬Àáw=‚mÓâÝgyÛ…‡ûªÓx²ÿÿÚ» ý +endstream +endobj +7974 0 obj << +/Type /Page +/Contents 7975 0 R +/Resources 7973 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7942 0 R +/Annots [ 7972 0 R ] +>> endobj +7972 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7976 0 obj << +/D [7974 0 R /XYZ 90 757.935 null] +>> endobj +7650 0 obj << +/D [7974 0 R /XYZ 211.842 671.203 null] +>> endobj +7977 0 obj << +/D [7974 0 R /XYZ 90 657.295 null] +>> endobj +7694 0 obj << +/D [7974 0 R /XYZ 192.853 404.696 null] +>> endobj +7978 0 obj << +/D [7974 0 R /XYZ 90 389.409 null] +>> endobj +7695 0 obj << +/D [7974 0 R /XYZ 90 245.991 null] +>> endobj +7979 0 obj << +/D [7974 0 R /XYZ 90 232.237 null] +>> endobj +7696 0 obj << +/D [7974 0 R /XYZ 90 89.441 null] +>> endobj +7973 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7983 0 obj << +/Length 1559 +/Filter /FlateDecode +>> +stream +xÚíY[›F~÷¯à©µ¥zvîÃXU¥6J*¥­²íºêCY³ÀzQ18€wëß3\ Ø{7NµyY/0œëwÎùfÀÎÒÁΏ£棫W’9iI¥3¿s4v”$HPâÌ}çí˜ÄÔdJ0Æãë Ác“®ÌâzBñ8‰¶÷ŸšÅÏámjÒílöÆËÍ2‰M´¸¹7ë`ònþúê!-ñ”j$¥å…ôoË% F”× æ=24"LÔ ¾;%áEd²l2¥ƒ0MÇÁj™<(ïüÜ鄸ã öàÓLŒÖVæèå|ô~D@ vH¡ÅÞjôöv|¸ÿÚÁˆi×y,V­NüFÎÍè× 1eKÑ +1bˆÈ*Îymã¡ï®†µ|(|`$×õ‚|»b³×\,{ƒ)9"ZFS ¥vñ~°HB¿”xD0Ä]9ˆˆŽ}^L9‘ˆ áL!˜ZˆãÞtÂ3›ß_”ð¶^ø /‰³<5aœW ù übwsq³Í =壯JùZ´ÝcÙß^Öc‚‹¨Þ™âIµ¦-Üp)©½ ã(ŒƒwåBÛžSÎeï‰%ؑ‰Å¿Èq†BœŠ“ûbÝo/š(Aœï(°ýøˆRî‘ÅjäIښ±UiªÅ)l“d·Ñ흏»%~ÒLÓ_fÚ§˜iû'އî)SͶyª/4ÕÎہ ¨Ò_¦Újª]àÀ[D‰ú¼ÏȜ+vՉ–M‘²gœx.Øëžûm²ø& †X2ÀÜê›$Ԕ|/;×V¿mwÕeÝïÊ˪é•¿gAúõDˆq”_L¼±§~uKy°¢^Åi¥½‰‘ýPk›Aà› ¨œ,=ûË©ÿûiT·±—¸0?š£íû<_Ï®®‘—¡M®SæWëutuɖÂaW ¹³—Ö°U’ubáæÊXrtÿѾÊC +endstream +endobj +7982 0 obj << +/Type /Page +/Contents 7983 0 R +/Resources 7981 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7942 0 R +/Annots [ 7980 0 R ] +>> endobj +7980 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7984 0 obj << +/D [7982 0 R /XYZ 90 757.935 null] +>> endobj +7985 0 obj << +/D [7982 0 R /XYZ 90 733.028 null] +>> endobj +7697 0 obj << +/D [7982 0 R /XYZ 90 528.165 null] +>> endobj +7986 0 obj << +/D [7982 0 R /XYZ 90 513.847 null] +>> endobj +7698 0 obj << +/D [7982 0 R /XYZ 90 359.634 null] +>> endobj +7987 0 obj << +/D [7982 0 R /XYZ 90 345.316 null] +>> endobj +7699 0 obj << +/D [7982 0 R /XYZ 90 191.103 null] +>> endobj +7988 0 obj << +/D [7982 0 R /XYZ 90 176.785 null] +>> endobj +7981 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7992 0 obj << +/Length 1488 +/Filter /FlateDecode +>> +stream +xÚíYK¯ÚFÝó+¼j†y?P•E£Üªi«¤½T]$ò5¬‚Mls)ÿ¾Ÿ=cƒÁ\¸ ­²È +<ó½Î936öæö~êý8î ï$ó 2’Jo<ó ö”$HP⍧Þ{ŸÄT@0Æþ»>Á~­‚É»>Å~ºÜ-¢iL~² ۍFoÃ"˜§I°œÜ/‚uÔÿ8~3¼#äÀ<¥I©`ñÊúvJË‚åõ„q‡ ƒõ„——,¼ZyÞPÁ˜¡~´Z/ƒ"²#D³(ëíGICÌ0á3‚K›½×ãÞ§3Ø#UZ„B +W½÷±7…ñ7FÌho[ÍZyœ2ø]z÷½ß{Ø¥ŸMµ6cî)*‘ÜzûúŸ0Zqšä£Ê‰c+Ã;##ÕHaã  aMäÅt4Š“>Çþc°Œ§“ ›oVQR´ ï>Ì©@†6I_diŸ +›@Jóã™M2=ôžsÄai÷ÈŒ™«Ä¡ݘ-qn紖¦ +qÚÔ3H¦vˆB“zN8ï´C纱“EÖùi ±çÑAœ„éjñÃ2z7•öÓ¬k1†‘$׬Öôq˜&E'¹]2(ç{Æ)¢Ù0ÔTfγm·²·‹8\Ø¿±kÓ$-ìŸ:a,—;{™oÖë4+¢©½|pÃÅ™z{o§é +|AGånµÞ€CˆTy0IçÙ_}) m}"ü$N棧ڥ«ïƕÊøiRy éämVU;ÛëbvN¸¡÷Ð*˜Fv&w5FâRI08Քd³¶«?ï†QžÏ6Kçbf׊ÊhkÈîf›Ì¹WÕÆjÏa¤#‚ªÜÄD‰j—;fQ]¿i”,àÐ]4E¼5€6W„Au("B0bˆbÇÂEÍ`§ÌŒÂŠ\aހ¶Ø­£$XAÞ5–T+9"F>ɵ)Õ ÷±Œ.§ÖâMô‚!®å“zÑò +Š'1q„Ä——Ò3Yin£I4ÙÆÅbð…"¼D?`«1{ùêèöwv6g +Ìلv¸Ôº0X‚t!‚ MD¼“eœD;`1 =¯šKRûŸyäÈ&°?aº®ÓϬmÂép3D0=Š£µ´F\î»-µF3—Ð#öÊw9tv{ý´îcwòQ•)`«¢„!,õ-Š!Ódúi^e‚ÃÞÉ+´RõˆÃ ­ˆ²g +»FXЃ Ÿpè©=ê¤î3†@šÀ‹Ÿ]fãâŒæ2ÿ¢ýü6^º)nÉxž¤™ã·³i¢ÂÛYúê¶>U4[Š˜$W4¹ÔXÌý¶¦Üú\†Ð ØæêÚû  ++û N¢eãZ‡ô‘‘o:ôUèPkyªC­Û]:D¿¹û=U‡-Vùr!b |µñç*QP—¤¨>Ž¤½cMåò?Ô¢´‹)ˆ–º S”t­l•¢7Ñ â$ˆ¦ö쩀#¶ÇÈ¡¹Ú}™EŸ6@êÅ®<§ÜF†ì€V¾T†ÈTˆ˜¯M†ÎcN +Dµxä>Kˆ¤‚-¦:s ¢W +‘¸$Dú›Ýà@”_8MîXµSAÒì·6y‡?Q£¯$z• ƒì•>çlTœî±Ýcqç Nk~Üÿ«QWœ—Ì­ÄêJ­„R-oªUô0Ågµ +D?q^:Mr]Za6y)/• ½:N´{]TöPM{û·zí"5®S,À«ù&X'‚Õ8‰´RÏÀÛ5Õ$ãøã€Ô }í·ê[¸"‘QL»Ï.% ~ԐïÊ”¥b¸ËZ2ì¥Ó {¼•}ßÂw=ø[lê&+Iù±4x²oca£òCII¢®ï£Èi#ûÛ«ÿýÒ«²»÷—hàý˟EQ¬GÃáv»EaŽ6I¼ÎP\ ×ëå𴇬@TcdV½•ÇViƒ‰WAÙÝ'ùÿŠ-¶ +endstream +endobj +7991 0 obj << +/Type /Page +/Contents 7992 0 R +/Resources 7990 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7997 0 R +/Annots [ 7989 0 R ] +>> endobj +7989 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +7993 0 obj << +/D [7991 0 R /XYZ 90 757.935 null] +>> endobj +7700 0 obj << +/D [7991 0 R /XYZ 90 624.575 null] +>> endobj +7994 0 obj << +/D [7991 0 R /XYZ 90 610.004 null] +>> endobj +7701 0 obj << +/D [7991 0 R /XYZ 90 463.532 null] +>> endobj +7995 0 obj << +/D [7991 0 R /XYZ 90 448.962 null] +>> endobj +7702 0 obj << +/D [7991 0 R /XYZ 90 302.49 null] +>> endobj +7996 0 obj << +/D [7991 0 R /XYZ 90 287.919 null] +>> endobj +7703 0 obj << +/D [7991 0 R /XYZ 90 141.447 null] +>> endobj +7990 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8004 0 obj << +/Length 1586 +/Filter /FlateDecode +>> +stream +xÚíY[ÚF~çWø©)ÌÎÝ3¨ªÔFI¤´UÓ,ÉËf…¼àe݂Ml³”ß3ßÌ%Z’VÕ>ìããsûÎwŽ½¹‡½7½ŸÇ½«×’yiI¥7¾÷4ö|I Äϼ›>!ˆùƒ!Á÷ß îé2˜¼PÜOۇp–“_£»4H·£ÑïÓ<˜'q°˜\?«pp;~{õš–zJ5’Ò‡‡Ú°"Ž#Ê+q‡•À§4¼\Y6RA™¦ýp¹ZyhϼïÃt@T?Œ§pŠi&úŒ£³÷jÜûÜ# {¤‹ð‘ž.{7·Ø›Áù·FL+oSH-=NÞuï>bÊ–¢bÄeeœóÊÆ}ߕY~,|`$ו@¾]…q°×–Á”-FS ߯ãýhj ‰fVãE*‚!®äъp,èòbȉDLoÁÔBöÆ Ïhd“ÿ c‡“M”?L¦IK‹¶kœ"¨šêiÓyÖå$^U"ð,RÊ´SŠÒJè&ŠQÞZAÛq ¾@+ˆƒ$€ ¸áCVùØÃ4Y™Ämí¿äÞ󇰺¼‚(î2Š)$°ÞóÎ1ˆbÄ,æ‰Õ—–ßyn֊geTRPmZ–§Aç¥i3«*Šçöé´[J Ìt]Ì:áH+R›øuúÁ®ePÑ*€ïäsÈ1dKiȤj­¸¥ +@1Ólä(h9ÕCò $R!,˜ãÖŽ‘ Jemåx?ûa®2rW^[gá A#$íBϪ<%‚´“¼3Máçu°ˆò¨®»ê†h'©yı2‰´q½ÀWOÃUAú¿(xºéY> ’9î?‚q³IÎ×Ë0Ώ…T È»nBš&*ú›¸ôæ¾£èô¬ÉÂSjN"¨¥J(ˆg] ”Hùþdµž*³œÏ ¢Ã(ž&ËUGw‹u´¨!¥I_BmSD ¡¹´ÅϤ-qŠ¶Ô3mI[ë¸n„ I}4ãMF¤±ƒ¦ÓÚâÇ ýêlD/ÊÓ²QéÞK¨µun:{Mó·ø3cV:/ç­÷ozÞM!0ÑßÂ#fidZý40]ÀÁl)™t¡‘@R~é)8úH‘jfV°¤a¶ +§yéNbÙ*(Êg +ø|/'n[÷‘f5~_ …ªC-ôRC{u+k֋Ƙý€ €YQß­¹§Rã™ÜÓ¿R0À=’û¡Fê„î ©±L“ÓwÉn-;$Ù ïGenú*ë®N—]¢lg0Nºµ°ÂIÅ/5¸¹Õ¹—#hÔZ³ì&žÙí2ì&ŸÆn­¬MtÙä:̯`Dh$šÈ'“»pâÀ·Ãe­¾ØJ&ìIÒ]É”ø JLÎ$A£ªNLPþ%H~bylM‚ÆZC‚•[ʼn,Ì•uűlæZݲ“(vú€ÍßÐl)àêðXGnû}(µfg}Qö¨†K}´âÒrQڏ«†±˜óo»^R㠊¾Âvyù:$“û”ZÁ±Úà¿:DzÀ\þçIÖ?¸/ŠK ¶EߥaÿÀŽg¯Yðš_I\ž²)ó÷##ðq@iïí6ThºûÚAf‘J8L°PeR!½¹­±Ã¯˜A\Jýi¸LÏÀv'Õ©Âþª—ÏTÿ­Ù(6 Jjtbûp'åŸöƒhŠ$–§¾,0}êӂ<õi¡QÑ9q`ä«ZbÛ¡ƒ·_‰/ÈYã…ðt wÇþ©ˆdv„º8‡EŸ_ü-U͝íÄô}ûWޕm;´@ónNÑ°@Œªç—” ¼‚>¯¾ä eŠÝ¯tÐà5Qç~¤+>΁%fKgªü8gVÁwƚwf7¶ü[µZû·ì·öχ,L¿Ñ/ñ÷[¯«㦭=UŽ™¶b:Aùêý:¬HÕzö—Wýú¥WĶ±—( .\y¾]]m64ÍÐ:ŽV)Šò«Õjqµ_A--„#¿VrŸ¤Ö°eR¿·áä²Ø:öâÿ Ž+ +endstream +endobj +8003 0 obj << +/Type /Page +/Contents 8004 0 R +/Resources 8002 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7997 0 R +/Annots [ 7998 0 R 7999 0 R 8000 0 R 8001 0 R ] +>> endobj +7998 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.4 529.29 212.124 540.194] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +7999 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.573 358.295 216.297 369.199] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +8000 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [448.024 257.034 483.212 288.003] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +8001 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8005 0 obj << +/D [8003 0 R /XYZ 90 757.935 null] +>> endobj +8006 0 obj << +/D [8003 0 R /XYZ 90 733.028 null] +>> endobj +7704 0 obj << +/D [8003 0 R /XYZ 90 592.061 null] +>> endobj +8007 0 obj << +/D [8003 0 R /XYZ 90 577.49 null] +>> endobj +7705 0 obj << +/D [8003 0 R /XYZ 90 421.065 null] +>> endobj +8008 0 obj << +/D [8003 0 R /XYZ 90 406.495 null] +>> endobj +7706 0 obj << +/D [8003 0 R /XYZ 90 236.959 null] +>> endobj +8009 0 obj << +/D [8003 0 R /XYZ 90 222.389 null] +>> endobj +7707 0 obj << +/D [8003 0 R /XYZ 90 118.771 null] +>> endobj +8002 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8015 0 obj << +/Length 1858 +/Filter /FlateDecode +>> +stream +xÚíZ[oã6~÷¯ÐÓÖÖ ï"vÝbZ´ÛE§´/ӁÁØtL¬-©’!jl“,1ÍĘêϽ¸ý:"p ŽH¥£.^lG¯ßàh ëßF1­¢‡j×6â”ÁïMôjôßT1eK±§bÄmô\6ŸË®4ìå§Ô ¹n6”O™MÌDSX*SrD´<©Mâ¸Õ÷[ï©[†¯â q%OzDÁSN$bBDSP¦â¸4=õÌf»,³ùü.Ý%Ë9ø‰»O‚cü‚^¤IQ†Ç ÄÀà +gĸ®cÿ#lТ¿!V­xOGpÄ»#@JRïéB¢¤ÙôÚ%—Ø7a£Àûj§à>±â öI8·záߕë˜+Óðíàˆ*Ö¡ÀlGZÑ֑׮@%â˜t›ê°.¶f³±­ñ^ÕPÖ¦^˖Ƶ›×`y±wq1¶þÇcXß%.­ý"] ˆC´Ê Ä!ï$ŽI–CƑHÅñ‰{§¤cÕl@U.k’с3L’ )ˆÃ/6+AâbÖ{·;£ïr +ÅN º ¼¢\Îf.(Ól„V~¿ÛÚ¤<Ӄ­wkïÛužN¨?ÔzwCzç1yu/:¡vyJí +qنžÉkŸZ:»mN]²H·™)ÝÝÆ¢ÈœRBQ q7¹°ää >(9ð£ä ΒƒhsÖ]šnÂiW"!σø£ˆaîVsûhåïe¦@vŽ!˜>GòEtG㈳Á.¡z E0LáÔQà›[\‡Ôë?Tê+‡ƒÙVCt¨kD}¼OØG¢>FJÒSQ¯mÈÁ=î@à*ÿ„瘏]é×Uû÷àP¶–r" à·ò¤âåŒßEÎ2ßÙ³ +kdÉm¹ËA–ZÔLš?¸ÂÜtåøo/WfS ]Ç »wŽêj²n®;Çkð.}•Bԟ’×ÈGSOxbSŽØôß]ÏÝõ,Ýj¯ï}¿Æ‡((eŸZãÃ5°ù¸Ÿ4¯×ó¸äþ ë)lÙDôʧ&ðŒ0 9ÚïPÐ6fU¿_Øïp ÉX½o¿C®D DÿÍ Çxá yAœãõ 7<òbN(¨Ù­žæ»rÄܧ ûX¾çP Â->MÜAn`Pº“˜ãá»õu¢wJ7uòSìü¾gÿøõ(z]AÙZ[N³Ü6¸ƒ/º0>3öòXýâð$ÌçWr¥™Ìž®\h€4³U¾§ÇÞé#Òå¥ cJµöé€Íy5Ãgp™^£Rmû"J¹§ÛJà\º*öŠ¶–„]^€„íȱé| –O)ÎP*ۏšà“Ã'8ÂüƒT0 åü4ÁQO>§Ü¬ÏéœG^¦YºIïŸzüæÿ1‘‡-“S ̍êô³ôÈ ÄdÇؑ|Pvü„º¦ËÒ¬|FLìÜmͽW*+JüÙÿ[ÑäÎx?¢ŽTGëoM>ÛOx›-2¸¤ã†ji<þ¸ÆäóYèڊ"¤@0Èx‚¤›ZÿÚÀ +²9¸ôËÔVb.„÷¼Ì+‹Ù¬‚2wïÿÇôùÕSH˜ë__Ú$ݺĔé!/bUAJoÅñW.LëM°ÇÙýҀ IôÕf™$–Hjv„ÙÙÑ®O‚qéuFy]ßQn÷`LÕϧõðÈ8xc}ž"˜ìê¸wɲšõ6M¨¶Ú%5åùå­É²ªño½½ðê[OÐýùC^}d¦ ›ÜßSU i üU ÷ü8 v}¹T´üì둪Vòó\¿p÷4ؐú<"ß³/{X½ó¤oØe­1õgÖÿW`²|QòNՃ‚šˆõLr¬N觡ۦ꙽™¨T¿Ön±>bô]½*—LՔRÍüýP#ýLV›ïªo¸cÂAQNŸ “@µ”WFj¦*ïÿ4ÐúÒT:Æ1¼"c³gx÷ß¾âÃïÒHµ¡ºô«4ÕWh¶„º©ú+4PE Áp¿ô|Q?6EFx¬+ððt<ŸM„×>ñ?“ì̦kt÷òÎy ­€NÓs´ ã•mRiìÿQóé¿£*h;¼DAц[¿X—e6»¹yxx@‹í—åȕ7Y¶¹yn¬½S "íJÖUc›mš·Í,n«–í™þ݅i +endstream +endobj +8014 0 obj << +/Type /Page +/Contents 8015 0 R +/Resources 8013 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7997 0 R +/Annots [ 8010 0 R 8011 0 R 8012 0 R ] +>> endobj +8010 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.275 328.874 293.971 339.778] +/Subtype /Link +/A << /S /GoTo /D (main_Meet_Preserving_Simplification) >> +>> endobj +8011 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.332 175.84 235.598 186.744] +/Subtype /Link +/A << /S /GoTo /D (main_affine_relation) >> +>> endobj +8012 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8016 0 obj << +/D [8014 0 R /XYZ 90 757.935 null] +>> endobj +8017 0 obj << +/D [8014 0 R /XYZ 90 733.028 null] +>> endobj +7708 0 obj << +/D [8014 0 R /XYZ 90 635.92 null] +>> endobj +8018 0 obj << +/D [8014 0 R /XYZ 90 621.364 null] +>> endobj +7709 0 obj << +/D [8014 0 R /XYZ 90 508.799 null] +>> endobj +8019 0 obj << +/D [8014 0 R /XYZ 90 494.243 null] +>> endobj +7767 0 obj << +/D [8014 0 R /XYZ 90 391.63 null] +>> endobj +8020 0 obj << +/D [8014 0 R /XYZ 90 377.074 null] +>> endobj +7768 0 obj << +/D [8014 0 R /XYZ 90 250.551 null] +>> endobj +8021 0 obj << +/D [8014 0 R /XYZ 90 235.995 null] +>> endobj +8013 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8028 0 obj << +/Length 2047 +/Filter /FlateDecode +>> +stream +xÚíZ[âÈ}çWøic¤¥¨ûeWJV3+m6Êd¦“—ɹÁ4VÀ°ÆÝ=½¿>_¹|+cs™!ÊnÔ-À”«¾ëùÎ1ƒ‡?Žþ|7š¾•,0ÈH*ƒ»U`p $A‚’àn| AL'c¾FÙ6š¿Sî6/ëx™EóŸ“û,Ê^f³¿-òèa—F›ù‡u´ÇŸî~š¾%¤µ=¥I©àðb÷?º%ž#Ê«w={D˜¨|n‡6Ñá0žPa3CÃx»ßDy쮼Wq6&:ŒÓ\b†‰f÷½¹ý2"° H¡‚ƒÛÑÇO8XÂõŸŒ˜ÑÁs±jpÊàu|ý}„ËãÁPkƒ0恢ɝµo>/â}žìÒì0¢»Ëô­mO5RØ—„p[òål–¤cŽÃ§h“,çQöð¸ÓÜÛpúVàvL2´ú:ۍ©ŸÓñ„CޓUäöÑ\ &duË2NwÛ$ò]æÖz»Kƒ¯·OnÛ_c8ޑn>HpÈ7©nŽ?ïûN  +icªEQºtk(óƒÅT]8ÿ˜õ¹…Œ®Ë×`ëÙòØY¿L ÊÈÝÄÞL¥ˆiÙ!Mv’t±Ûî£<¹ß”5h·¯½Î+†´®#÷õúŽoê=)‹=ÝåîMä^jëÊSW=Òa)o!† ©¡žP®!ŠN!¬…6ˆ!FKÈÉ«v=†h¦ø)$~åušò—}œF[ºÆ²W$š‘'E ÕTГ…Ã]²t;ÞâZžGς>/ ž:³Svߟ Ïl­ á4ç{‡ˆÉ6z°•-T‚Àÿ´àeId ·ØÌG"°]p~T©¾õ Q]-ù¶H1 v¹;çç$£lþæsiÂÁÕ«ý꛾3¡V0•ÇÐ ;mO%éžúÃ..ü]$€Œó<‹’ü0›¶ÌËþ¥Æ ȆGgW{h›Åíz:ˆŒžqB ¬Yµö»žvÓ0ê,Y«W‰³y—Æ6/ðGzg A’˜¦—ëU^ Ò´6õc’n ŸzzB!Œ’ÛªRHÒ2‚=¤p´ê®Q8G²,_ƒ(I,šEq9ÍìpÎÊ)ýþÇQðŒ!a´²Ì´3oŸ•ݞ‚Åê04)anez]¥é2Îʈ­ ÛH¸zL¹ƒf¸¼öû$}p_=Y?¼¶ó(J¹:; dÓwI +™òÏ÷¢åf—Tˆã<&"„&«úÒΑÃ>^$öÎxé.Ü¿ô˜ ô‚zn†Kdàh†ûþJ¤Õ¥¬°RpoµèOga°;–ªÈX é04ò8»œˆšF  “!æåÃÓݺd^ދ+EÖàõy,Öå¥ju§ÜáJ_®*jpx¼?äIþ˜ÇËnT-)öÈ¢ô`+­øTk ŸhŠ$M'=… «v°–È(¦ËvZ ê£lÜJ@°40ëÖ*4&R…S·Vµ6œ0ÐÜR8›é0Nÿ‰,L#SV¨“OeádÍë³ÅƒØö¡õNڜ\Bi@Õns&ë†wÔ<Îú°As´bËy_ +€â4¬;Ëk™•@Y’x‡–Žx¯Xž`„mæ[C=˜@º!g4“¤ˆBà œ}•f*b_)šŽEÆ&^•¼gmY ‹S²”TGœÞë¦~’ßt“ýTuÓ:ª#Oš 9É(:օ}Epúðb›ë%»ZÂeÉÃúDøo ðؗ+<þ +ïÆýWàë¯?¯ð7'½y'=„ÒeRŸKº]n•“¥o‡–ƒÑ}øÇ!Îþ0",ëâ¯Qú•`Ï“Ý +‚^WFöŸÌ,v¢ñ„A^>ÄUc;ÏþTïþ2*ê¥Õió ×°¶Îóýl:}~~F‹zL“}†’|ºßo¦Ç‰jíB 4êMVËÚî²Òý$…‹Û(ï‹ÿÛ:ï¯ +endstream +endobj +8027 0 obj << +/Type /Page +/Contents 8028 0 R +/Resources 8026 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7997 0 R +/Annots [ 8022 0 R 8023 0 R 8024 0 R 8025 0 R ] +>> endobj +8022 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.151 608.453 244.345 619.357] +/Subtype /Link +/A << /S /GoTo /D (main_affine_relation) >> +>> endobj +8023 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [336.2 383.189 480.931 394.828] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +8024 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [324.852 141.059 466.489 153.539] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +8025 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8029 0 obj << +/D [8027 0 R /XYZ 90 757.935 null] +>> endobj +7769 0 obj << +/D [8027 0 R /XYZ 90 683.019 null] +>> endobj +8030 0 obj << +/D [8027 0 R /XYZ 90 668.609 null] +>> endobj +7770 0 obj << +/D [8027 0 R /XYZ 90 457.755 null] +>> endobj +8031 0 obj << +/D [8027 0 R /XYZ 90 443.344 null] +>> endobj +7771 0 obj << +/D [8027 0 R /XYZ 90 215.626 null] +>> endobj +8032 0 obj << +/D [8027 0 R /XYZ 90 201.215 null] +>> endobj +8026 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R /F8 504 0 R /F13 540 0 R /F7 505 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8039 0 obj << +/Length 2208 +/Filter /FlateDecode +>> +stream +xÚíZ[ã¶~÷¯ÐSkkï¤Ü6@ìHRt»;íËvahlÙ*K®,Ïdòë{HQi˗ÍÌ&}èÃ`l‰:7žË÷QÆÑ:ÂÑw£¿ÜîÞIÅ(–TF÷«(Ƒ’ J¢ûeôiLbj2%ãñû Áã¤Ú&ó÷ŠÇeþ¼I—U2ÿ1{¨’êy6ûÛ¢NÖe‘äó›d—N>ß÷ŽO<¥1’Rr+ýÍ’À‚åí‚û1"L´ ¾¹&áÛ<Ùï'S*0‹é8Ýîò¤N›+ÒUZMˆ§Å.±˜‰1#ÜȽ½ýgD@ Žˆ ‹PHâÅvôé3Ž–pýû#ëèÉ®ÚFœ2øŸGGabì‡:™ °HQ†°¹UšïŸ·Ö€öÉ»w{1ŠHžsKê¬,šo á¡Ìё”@ùԊ™bî4oö—ԍ¨¢§Š³õ¦n>n’béôgKw;YM¨ÿ cZ¸+鄈ñO»*ÝïÁÞcƒ}œ2‰b VR$ÍoZ¤;ãê~<{ÆO0[á…KÂÅx_/g³¬˜p<~Lòl9Oªõa›õ%ÿcˆ”ç~UǞlÀÉ8[5iH}ó9…Òaí#ærÕ·[ݚz“í›5j*Ǻ]”íË L61œfÅ¢Üî`ÿrä§¬Þ (#ÔD£+|3¨ #ÞY]VCb0R±l—T7I ÂJ‹!Lq'­Ëÿ#SƘÁV’~+3WډK¼ºÊõ•’8É2hI ² ö‹íµ=Ä®÷Õmß8íGÚ8À/µ4¨sÞyX?ïÒ"ÙÂNi,œäˆôñìp)ÕõÀGӗËlÙH|•.Í×òb—,òbʉ„ø‰pþ¹žÙì¡<˪rÕôy¶MÖ.c¨"ÿiÚxRe‰Iw+-¬xA‘èëî1©†Ìgˆvõö˜p5^@S©=?fEšTó·Ð¨ìx°Íª¹õ»!Öu>äóÔ´" +’Ô­ü3ìú0HËq]Mèòýð¸0 èõI „襍RW T‹q94‰„idêu&‘]_°SÆÓ|—ÚÆ &@šPlR7P ‚ªÖJ}øn}² ]¡7«Üîx8•U¨@1ÝLw¨ch•q.ÚÚëìî×I$û°Í›¾Óîºø´e"@ $–1䪙ÆñEÈ x‡-òóµõ¢`HBÞ WH˜A1˜}`'“í.RÞ,Ô~ÆDúJyœ¬“HÓ CBk'‰‹Ð*…ê™z«z­¾CSŽÁ#¥£i Q´ g`#4Ò/ۆ„¶"`XËmB+0¦’üÌÉUlCƙóð2x¸‚•¯ “ªæ 7›aú×iõ…V#,X0Ó.Auy +ÕMµsÓ^9ì–ihxnþכ³Ø½­È?\dN½Ï-¼x–Ö˜ 'FÌ+»!ö+´·ÐȼÁá©»o[JV¬oc—ýpù~nðö‹¹‡Ýî«øÐXãûp”äçü¶+zTký`„Xlc[všÂ5H´‹V퇺}ÌÛ&ó„eŠæºsÛ|ìݶ+·ÍýÐí}oN¹kÑÀ˜NÍwmÒ¤k’»PZÀâ¨^ϓì§eº²µyÈk¿Zòƒ :1î^)x ˜@ý³UA¤a܏œÅkt#û|ÔHý9-ö“Ùý³z÷ \”ÃfkŠÏGnØ` ôf@"aúãÜP$Aš³ Z3M2žÎ¾)³Ç`qˆ +_†Ý8îœT.±.Ñø¶[ ófÀíLêžsBÃ)  •uH›wÉâ؜®O††ìfë‹ñ$C1é ³s`ÃL·ô\ÑsùzþkÓóuZÀ$˳Ÿ}Šî©#"Œˆ›˜ºâPa_ÈÔ¥äã‡Ì?ÚSÑZ Ö'–¨§ +r,ݱqãÄð1@3l°j'ýi3x6€‘ê»åB¶7æ,¿l«n¦àX³ËœÈøkqp¢¦ÿ¸7ôŠᎂóc +.ÄY +îu¶q.C +J—´,\ðá¶)40úJçÁ\±p!<&Xn¢q‘…ÃÂc€y–xë£áӟcýžô"˜dÀ3фH5¾;¥ˆà»VÅíÈ¿Hס<±p íÙ΋èz+ +Ûӏ©" ®¿1¡•ã§MZ µtM„°~zއéÏ ⫇OÁëK¯ƒy±ô(ß®€ˆyÇûçämk)ƒÙ}y tˆS2œ§« ¯­N©ò aóÆà9¢»Ø¯ZZ·:‹zà•×UòüÛ½¼Æu‡ÐQßÌu_ùa脳éuoà =vûkø–Ž’€Øë±JùUX%ÆgY%댯²JÅi@+A¬£•˜4´òœ" •„‘S”æ«ÞÚA‘aÞÁb=r~ɔ•¾g¬ïùžÃ‘”¿9‚á_H¡»ê¸\`‚ü¼…þi‰pßø_ú^›„/‰ñù—Ä=×=?“´Ÿn¿äåp—úÇ?ÿ&´¾õ×D'ß BÄ0ùQ{yozáƒîkK›¯Ž6_þ±O«ßO 9¿þš‡ölË ðG# +FiçFæ§0Íɕ=Uû˜¶`°ñìßQû金¸ÿj6î’jS×»ÙÝÝÓÓZìÑ¡ÈvÊê»Ý.¿;ížâ÷¬Ú=ޖíñGVÀÅmr:!þÿؼ, +endstream +endobj +8038 0 obj << +/Type /Page +/Contents 8039 0 R +/Resources 8037 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 7997 0 R +/Annots [ 8033 0 R 8034 0 R 8036 0 R ] +>> endobj +8033 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.059 549.487 422.924 564.202] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +8034 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [337.382 289.76 394.782 302.678] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +8036 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8040 0 obj << +/D [8038 0 R /XYZ 90 757.935 null] +>> endobj +7772 0 obj << +/D [8038 0 R /XYZ 90 637.446 null] +>> endobj +8041 0 obj << +/D [8038 0 R /XYZ 90 622.876 null] +>> endobj +7773 0 obj << +/D [8038 0 R /XYZ 90 365.765 null] +>> endobj +8042 0 obj << +/D [8038 0 R /XYZ 90 351.194 null] +>> endobj +7774 0 obj << +/D [8038 0 R /XYZ 90 121.036 null] +>> endobj +8037 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R /F7 505 0 R /F8 504 0 R /F13 540 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8049 0 obj << +/Length 2192 +/Filter /FlateDecode +>> +stream +xÚíZ[ã¶~÷¯ÐS#kï"Ý Ð»ÒÝd§}Ù, -…Ú’+É3™üú’ºÑ’åIÇÉSžF’©Ãs?ßG |3ûÛýìîƒdFZRÜoƒH$( î7ÁçÄ¢ù‚`ŒÃs‚ø8Ä«sŠÃ|ÿ²K6E¼ú.}(ââe¹ü纊ó,Þ¯>íâc2ÿrÿíÝBzâ)ÕHÊ6·Òÿä–xŒ(o܏ÈЈ0Ñ,øË5 _ï㲜/¨À LÓ09÷q•¸'?$Û¤˜&Ù1ÍDȈ02gïïgÿƒbÝ""ÁÆëÃìólàù·FL«àÙ®:œ2ø»>;ŸáIS†°=#Öù¹jtÚ®4,ãSî%¹nT/Ç$‹`šÂrԙ’#¢å¤7Š¢ÖßO&òtã$Þ$#âJNf„§Á˜ N$bB p¦â²5ž{–ËÇ$KŠxŸþœlVñöGŒi–¬Ž.%ÒCüh’BÐðG,ð:ÏÊÊܲð»4Kâbõþ§zeY¦yæVþÁí©EßDÈÒnºß•c6RDTØwóE$$¤'¤ˆ^}z9<äûÑJ"¡[ÑE²/_#Ò)(@ԙtg, ñ1‚Ý=ï]0Ҕ͘‘š!MÚÂ.ƍdˆ¶Ê‚OI½¦/TP”4‹>§Ùôøâ +܏9!aªà"B +Þ¾ðWPó13ÏhXåî=ÚW‚ƒ¢´S³%8ÒªÕ¡Ú¥åÈþT"J»5‰ÛòX4yC óíˆPr<ºµÏiµsIyL֕S<à<±³µ7sݬx¬ÛÚß̂ÏvA¯ÜñvNEè*ÂÉ*êl¬¹öv÷Aõƒ§ 0¤:aD:bªNuØLäMªá‘’HH +…Ý­Bs"£ðέU~Êàaæy¾‚ÌcÝØyg áó.)ÆZ’™„²®9²½/£H·F§õ´q)­ßì]éJÙ^ÃÔÉ7Öápóð2V L"Ùõç~{*0”l—¡³yE¸€>½’°+’Ð í+u'‡YQ%E¹ôt‚¼Š' +EĈCXP/à½7|GA’]#o´O¶•»ÚÅYí2ÝÔ¿ž%¢qۜˆڒkI<ÛÑÓqQo¹€¢ù¹/éÉ(Â]W½Ÿ +äôîµ o÷+.RˆFd¸uú¸{ƒ¦rÌt›u­½ÿi­¿,t7>Êj³\¦Ùœãð ú +Œ×âñtH²jÊz ~"=ǹ±ëÙzœ„éX7å{E;¥×Û)ïڈ«bnRÐÙ¸p‘B±ŽûÚǶçŽÔ,o`1h‚þnñnæŘÓVät_3bXOŠç'_ Guµ,ÀgP iiqwU‘®«Ë5FF?ôT$äċˆè ùªW"_q ùªß‘ï+‘ïC~Ê6¨7ÒõþÛp¦¸Hc“õCÔG¬ÛªyŠ‹ °¯>eaƒ¦a›Kh~š„wê·X%æÍᶠ#ݍå‹û.jÌ!Áș:a1ª0f*Zô~º¬C‘ì«$™ +¿Îƒu +ÝqUqZ•Ë¥Utåvï“Ô‡¡Í’M’å‡4‹«|L=žµüy¤Q˜VÞæ‰Ñm›:Íò,1ÑÃí>é&H’kèÒú€b>´š@ùø¼Çê"¼çBÞbÀ,R‘ð±6-¶Æøð`ã³~á¾ä-ÔÊÛ;”*X”o2‰òaa]ônõh€Ÿ/ ü¨ޣȎhÀåœ7ØêÝ­ØÚEaåôå˜Ö×:·©ÿ̅kÕ°šCHi¤&^$oÏ^ì™K·V”7 XŠŸGu@Ó@O&š(R>B>0DvCˆuÓ}ÖЀ@‚¢Äg=Þ®5ëé­êví´àœ²ÐàÑô‘@(¤ÞM Ã p¡FBè·D¡•ëØ¥ xÙÏ9²>ãL¾†Ù@Ì°Á¡å4Lœ·¬}fSO¶)Ø.é¶?™ +k¦§}r:nßt”ϧŠCߔä–ã¶ïóŒÞ\¼HsL + éX0½°±·Ðß|%÷”'õﶧ¤Ùã-ØZ­‘³ƒ ¦éEC `ü—r:#œ6ý`œeù%;`ïît×ÚÁ©O‡<³SžaO¢]´m.ªæµ^œÌ–6šçµÙæ²3Û®ðÌ6¿ûf—:ù±MÂ6z5™|ë#ŽØ"—šùu¬É^m’­-ÎÓ¾ê—ËþT;s¯T<lùGÿwµÕ~ òJǸ+'Žr2nœG.7OºÔHé>;5RN`{e¢qÁQDG³ßmMõõ6(½‘ÃÀÌÿ1Àë‹$HqæB«¦IÆáô[0ûéIûéôVNß:8.êĚ"õM·'Ñ̜#ªÝRûÁq`–W>‰>ÆësuÚ>5t œ!»oA”æ žxG…Ã!œ¼!ëꌬëß?SýÖd½‚ Y8–É*¶È¥Jﻔ¹½nÑI,~Ãﯣ£¨kf/#"€^P~³/EæÌ%*i0Á(•äˆª›-ŸJZlW¶£¯'¦ª‰L3:³2cá2ÛMõÏIõœ$ÙXC1ìäm>Cõ{lÓØýPI¤¢è,à>ô±læUß/VLäfC_þC¿?CÖòæI5áw9åw…¸Ô¯~XÎÿ?B*˜+êµÿaÉ¡GTA„0“Ÿ¡øƒšæ]ß6ÝÛÝÖ-ÜÝü«LŠ¯æB„uUÿ#ÎN 5­òɈ؎ZŒL¯r0ÓBàOISFβÿÍÕßgÖ·=B¯`â6J»ª:.ïŸÑºD§,=(­îŽÇýÝ0zRH›môqțP¤<> endobj +8035 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [334.883 678.378 440.282 690.857] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +8043 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.333 436.355 425.662 451.071] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +8044 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.526 189.863 322.446 200.767] +/Subtype /Link +/A << /S /GoTo /D (main_Time_Elapse_Operator) >> +>> endobj +8046 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8050 0 obj << +/D [8048 0 R /XYZ 90 757.935 null] +>> endobj +8051 0 obj << +/D [8048 0 R /XYZ 90 733.028 null] +>> endobj +7775 0 obj << +/D [8048 0 R /XYZ 90 524.315 null] +>> endobj +8052 0 obj << +/D [8048 0 R /XYZ 90 509.744 null] +>> endobj +7776 0 obj << +/D [8048 0 R /XYZ 90 252.633 null] +>> endobj +8053 0 obj << +/D [8048 0 R /XYZ 90 238.063 null] +>> endobj +7777 0 obj << +/D [8048 0 R /XYZ 90 135.292 null] +>> endobj +8047 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F8 504 0 R /F13 540 0 R /F7 505 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8063 0 obj << +/Length 1573 +/Filter /FlateDecode +>> +stream +xÚíZ]ÚF}çWø©©žï±Q)‰’4i£¤YúÒM„¼0»X›Ø&dÿ}¯güÉÑ&­ZžŒ‡ëë{ïœ{æÌvnì¼<™ .žKæøȗT:“Çǎ’ JœÉܹ‚˜¹c<|;"x$«`úvDñ0^Þ-ô< ¦¿‡×IÜÇofYpGÁrz¹Özôaòêâ9! ÷”úHJ/7Þ¶&­F”—“>"L”yxº ÒtäRÁ™O‡zµ^™¶#ïôNFÄêhCÌgbȈÌ}žMŸÜ`‡˜²…¼x¶\}ÀÎÆ_91ßs¶ÆjåpÊàºt. po‰)CXŠF‰CuÎÊïçîù`ËûÊAr¿4ÈîÖ: +Vš‡eg1%Gė½ÕH©ªÞŸs ÄáÜz|D@æžìED+‚®,\N$bB8.Ób6­òŒÇOŸ*9Õ_²$XÇPò0Ž¦—ð6|H6|žÅQšÙÛãðÍüCøfÒë8•‡ÞpñƒµðEÛÂ'Užw>8²h5?\Áèpå©ë¹5§-sIJJû÷³Ž·*$qe“­÷D®*“_ +‹¦Q¿J w¸ÈW^ˆ N^íU-ÃH°†7Ã”@DùŽ 'àjxl P°Fw•ƒ#ê±ûåhEÁ‘ïѪ‹0í€Jèûºf‹‚˜n–™ýßØë,^­7YÝq- – ’Û‚©Þ½8WÆ Ç¶«GD ›ø.ž±äTX^ël«uԑ'¥ +a*H”œ”hÍ»¦M"O©Ô¶¼´&µrف‰Ë€¯} +”@*©¶à+`ÄL'é¸õ|í§ÝIRðW,h#²Æ­}ȳêÞǑ¬7—夙MKÑfÿi•Õ&ͺ*H€(«ž¾Ö%*¢,ó¦5·a×,J|AbÐ +ÙWÿVÝ\¢0â +®0g¼I û +G(¬¯¬U9Àn¼ÎQ,ó;>\ÇaSg¿‚Î4ƒAaZїý<¢æ: ®—Ú~ŸfqbÛ¾¶­£Ñfum=rÛj0䫙u.kYü16Ôæùò`ƒv>`l“ÚÄp»°-• ogi +ÖëåÝñ­¼ ç:ªÌ·a¶(¹© +¨£­çz܆z¶ˆÂOfßp L¯lÛð‚Ÿ}™i3'öŒ_gœfóñÐÉ¡°Á2œOƒäv³ÒQÖÛK€ +·“EçS²-z*¼é"f +Pp^î¡+ÙGWâ²êØ )ZvBÞ)TÓ £œÔ—b¨c­ASÀJæB^Dx;‚‘|CÁ(í'Ð,H¯:aˆÖ=±AX}eh/è箔%¼Ÿa-isÇû$­kZÙeð¬gh­ÑÍ'È]tHè!¨jXu D©z<^å2̛*7¿=Bå2Øaú“h»èT¹ÐTž rÍrŠ‘0ôԘÂ6žZoa€'ÆœB“r}nÇ+A!øMI ­Ùã—3`É*zئv:尟;Nûu:‘ÞAÎëÒïÓé”Ó~Njjûö:b +å«(l2(?ëô³NÿëtzŒNÿj™Þ ¸}Ń1'»Õ K²«kh>Õ^·iÕæCù6s}=5æýQïoF]èÞíE®„Ôƒ„l^uR¼ÅËϛ¡ÖfHž7CçÍÐ×n†ÔÎfˆžOÏ¿÷éù“__ÿ…Å´lÈúèÜí£sut®âÀ¦Bð¿ Õß?:èaϞûü¤“s%{¹ÛqP‘7¶:û¹à²_‘óÜßùäÜû/ r k·ZgNVâDý»”¸:V‰ƒvµV»³ÿ‡ŽÌÉY&žÏÌÏ2ñ°L¬ +±û éAëyÇþaÃüQ"‘@˜Ì+þ¨!`m¼¬eËÛü¬&×mÅm)Üìm¡Þì͟©N~ è#{ÿ:ˆ6¦/…UHŸsWÀ«ùÄ(?z³ˆsàôR—8·™}tÊO¿ Lmëx‰œˆ«YZdÙz|q±ÝnÑ,E›(\'(Ì. ‹.îã§á…pTŸޔ[ãU\NEÁàÊRÝ«ÿßÆ÷ñ] +endstream +endobj +8062 0 obj << +/Type /Page +/Contents 8063 0 R +/Resources 8061 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8068 0 R +/Annots [ 8045 0 R 8054 0 R 8055 0 R 8056 0 R 8057 0 R 8058 0 R 8060 0 R ] +>> endobj +8045 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.526 678.378 355.512 689.281] +/Subtype /Link +/A << /S /GoTo /D (main_CC76_extrapolation) >> +>> endobj +8054 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.659 606.781 268.34 617.685] +/Subtype /Link +/A << /S /GoTo /D (main_Widening_with_Tokens) >> +>> endobj +8055 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.526 477.484 355.512 488.388] +/Subtype /Link +/A << /S /GoTo /D (main_CC76_extrapolation) >> +>> endobj +8056 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.659 374.007 268.34 384.911] +/Subtype /Link +/A << /S /GoTo /D (main_Widening_with_Tokens) >> +>> endobj +8057 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.526 244.711 355.661 255.615] +/Subtype /Link +/A << /S /GoTo /D (main_BHMZ05_widening) >> +>> endobj +8058 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.659 173.114 268.34 184.018] +/Subtype /Link +/A << /S /GoTo /D (main_Widening_with_Tokens) >> +>> endobj +8060 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8064 0 obj << +/D [8062 0 R /XYZ 90 757.935 null] +>> endobj +8065 0 obj << +/D [8062 0 R /XYZ 90 733.028 null] +>> endobj +7823 0 obj << +/D [8062 0 R /XYZ 90 552.21 null] +>> endobj +8066 0 obj << +/D [8062 0 R /XYZ 90 537.64 null] +>> endobj +7824 0 obj << +/D [8062 0 R /XYZ 90 319.437 null] +>> endobj +8067 0 obj << +/D [8062 0 R /XYZ 90 304.866 null] +>> endobj +7825 0 obj << +/D [8062 0 R /XYZ 90 118.544 null] +>> endobj +8061 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F23 340 0 R /F65 376 0 R /F50 339 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8076 0 obj << +/Length 1826 +/Filter /FlateDecode +>> +stream +xÚíZÛnÛF}×W𩕀h½wî +mÆHÚ¦ ’ÆîK@ ¥µM„"’Š¢¿ï,—W™ÄH‹ÔO¼-‡3gÏ\%ìÝzØûeôôrtö\2O#-©ô.o<=_$(ñ.—Þ՘Äüɔ`ŒÇ¯'ƒtÌ_O('ÑîÎ,Ó`þGxén6{µÈƒÛ$¢ùÅ]°6“w—/ΞÒO©FRúðñBúnIG‚åՂË&ª? I8‚,›L©À LÓ±Y­£ 7îÎscÒ Qc/àÓLŒñ­ÌѳËч1Ø#,ÂG>|x±]½ÃÞî¿ð0bZyÛbÕÊã”Á1ò.FŽðQˆ)CXŠĈ!ÎJœóJÇû¶+ kù1ø@I®«ùnmâ`¦),{Á”-¢)ï×x´HÂ¥“ø ŒË•<ʈŽ}VL9‘ˆ áML-Äak:ðÌfQ¸ +s³œ?ýõåßXÌͧ< Ö €&ñˆÞÆÀ Í[,ð"‰³Ü^²ñ v)Œ4aL—’§ºz€ê-ß¹Z´WD ­VìzdpÄwy2™JØؖ©çö4 Â8ŸOíÛޔ1ˆb]°/vðÖ¹UŸœ!ŸÔÛ¼ÈzQˆ‚35Šð…Ml÷À,ÝrÚÑ[!"ktÞbÌz>ë#î×ÖçëCÑ¢^òc¹Btôj}÷ˆHûªQD!€•¢¤ZtÆQ›wn¡Àm.€JIËeIؙâ…ßVë4™aPŒh¾çwƝ¤&ÛD¹;OnìQm s,½-Cٛ_FÞU±Ð‘~º —&ãÛr± [å’E²ZoòÂœðë;Q–¸3ß$é¾_~5ÉJ¥5sJuøºˆQ¶ÏŒ&„C譗äwAî˜È±BXȒ‰Ò=Ò2ºg w¼ @ŸâF¡<ƒ(r'?8Y'¥–pøÝ'¡>5lëØ‘V¤Q3ì³â&õ"ÔA}WS"$Òh…$D­â…2äBPÏMšÍ:¯7bº!@!ƒbÁ¢­@Ðz¡£¢F×ñöçØÁòê¢ÂÌ¡ö«e:¤0Zã³ÚdyŸíb}íJ×%øÀ“XRíRŒþH"OŸžÿ!ô;°ÿaˆvæmv0Dë8pYq+kEÆÂ7É-׀›¬2?OJº¿GØÂi«W^] RèÕ¶ÃEƒvж»’µ uÇ@ñT<*t†›A¹´ŽÚÅݏ*€²ap÷<˓ÔE xìl‚»ñfuí$rÜ l]á„Q# OÞ[?0qæ–Ûô씎Vp¯„îlïLÁ)[:*±-Öëhçt)ñ=3+ÜëåÛ0¿«v­Vh?ŒÂÓ¥‰‚2öäfq‡6Ææ‰ãÞÏ!¹S¿ëþÏ>-L±ŸéúºÉÔY¾œÍÀÉ8Dár¤·›•‰ó£!¸Cj3aK¶v»¹‡}“SDÞcŸô áûNG‚BœÔQ'ˆ—}éYBzVCIˆ5¥²Ë2`ü2ì2ؑiÛt IÇÑž%i PqzU¯…YyìˉÄçHáÔ©;© ,Í|`Èni‘&\äUp56°ëùn"…‹û´cТ1ô£ˆ¯Gá=Ê×îQÎÏ}9ƒ´hTkÍPӝÀ®¶»›†-]¤_±ïíM0ò›r`°7ùâʚ*‚pѸØʺ܁7Æf#Sæá›4Yõ|C($…ˆ1R5‘ÌÈó½Å¥OiZÅ«-Ÿ¸OFIŋëÝñäf™65¶Üh÷Á} ÍfÍpQ<ÎJX 퓭>¾Ñ"¶,^{v•uxù¥»zjÃÌf®fÃÿ{5ƒMDj&¢d°ùd8ãûrÈ¥u7ßÛZ®7ß÷fRj iz(•ŠÇTúoûŠ”Ú?ìã²3쳗'XAŽ²ãé¨-ŽæS;©ãþѽéÈèͨiÌ>gÚG0ÃãÚØÞqÕPÉï YÇ}_{ܧªîNêqŸ*G +j¨uU'g÷{S?Uή¦~ +w¦~ÅÇÝÔOí—< +™ú5ó´ƒS?·¦~âqê7\0±o|ê÷eð?Žýþ?c?ñ8ö{^ó%<Žó‡îzúÆ~Ðá0~¼~×C=„/28fSÊïv`ûÁ©Ÿ.§~-|ºŸ´?ž6¥â ß,eæ„Vƒ>h)섰S” úêMÞÿkƒ´H©SÿÙPü£ô…$å3Uþ£A؟ªù^|mC˜íÊ˪ap—e×à.þÊLúýD@Œp×/ƒxDÍtËEÃ4s% ÜÄÈVrΛ¦ |ðÂT>ì,{ïUg¿Š=hô% +ö×¼¾Ëóõììl»Ý¢E†6q¸NQ˜ŸA„8»ï-)¶>©…Ü»Š­’ª m´*ʨ{øÿ…É +endstream +endobj +8075 0 obj << +/Type /Page +/Contents 8076 0 R +/Resources 8074 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8068 0 R +/Annots [ 8059 0 R 8069 0 R 8070 0 R 8071 0 R 8072 0 R 8073 0 R ] +>> endobj +8059 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.008 678.378 276.143 689.281] +/Subtype /Link +/A << /S /GoTo /D (main_BHMZ05_widening) >> +>> endobj +8069 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.659 578.885 268.34 589.789] +/Subtype /Link +/A << /S /GoTo /D (main_Widening_with_Tokens) >> +>> endobj +8070 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [290.456 449.589 371.442 460.493] +/Subtype /Link +/A << /S /GoTo /D (main_CC76_extrapolation) >> +>> endobj +8071 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.062 276.716 276.047 287.62] +/Subtype /Link +/A << /S /GoTo /D (main_CC76_extrapolation) >> +>> endobj +8072 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.659 177.224 268.34 188.128] +/Subtype /Link +/A << /S /GoTo /D (main_Widening_with_Tokens) >> +>> endobj +8073 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8077 0 obj << +/D [8075 0 R /XYZ 90 757.935 null] +>> endobj +8078 0 obj << +/D [8075 0 R /XYZ 90 733.028 null] +>> endobj +7826 0 obj << +/D [8075 0 R /XYZ 90 512.36 null] +>> endobj +8079 0 obj << +/D [8075 0 R /XYZ 90 497.789 null] +>> endobj +7827 0 obj << +/D [8075 0 R /XYZ 90 351.442 null] +>> endobj +8080 0 obj << +/D [8075 0 R /XYZ 90 336.871 null] +>> endobj +7828 0 obj << +/D [8075 0 R /XYZ 90 110.698 null] +>> endobj +8074 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F23 340 0 R /F65 376 0 R /F50 339 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8088 0 obj << +/Length 2085 +/Filter /FlateDecode +>> +stream +xÚíZYÛÈ~ׯàS"VOì&[ $ÁzÝv<“}ñ%öHÌJ¤–¤Fžýõ©¾xHÔ1ÉØH?Ø"[ÅbÕ×u|]¬|?úËÃèî­`DRP<<‘ ˆS<¤ÁÇ1!ˆE“)ÁßO'å6™¿ŸP<.6Ïk•–ÉüoÙ¢LÊçÙìݲNVEžlæ÷ëd§&Ÿ~¸{KHG=¥ Áˍö?Z‘ž#z‡ƽÀŸ®iøë&©ªÉ”r Ê$«ín“ÔÊ®|Pªœx¬ò%,1Éø˜‘Xë}÷0úuD@ ˆ…G(‚/·£ŸpÂúFLÆÁÁHmƒ2øÜ÷£ŒðEˆ)CXðĈ¡P8œkoã©ï±Ùð|`d(½@ý¼Sy²×b,Á!"R\D“£(jð~Ò1Pd©Õø*žÇâbDô,òbçÁÀ”œŸ÷¦Ïl–¤é¼Ú%K5O³­Ê«¬È«y’§sµ]¨ÔÉϘãæÛ¹†ÔꕼëƒeÌkÞ¿š/J‰“éªócJ½ÐÇ,ßd¹úd9îzLvGH@¸›þœ¦Õ€V€˜·Z·êbˆ¾Ø äjBùø`½oq±÷Ž½0¹ÅzíªØ¸oßÝÛÏ,¯‹#™žz>2 ç3æ¶)£HB€L)EŒ4&ºÀƒÐ®UYÍzÏ·zz;Db€+F˜Óù$„Bº7 =4ÖïÁïÒyû8Œ‘w¢Ë¸>`†Ú‡qÌ»*cÙnzºàþm6öjáÄëuQéK‰ÇëD§ÝS–¯üWNf­ÖªªíM–§jBøø³þOU~ñ葞ïî߸ׯ³åÚ¾,sO.×üpÏ~3)¢M{¶Ÿ‰ñ»4ÖÏ깂Š"¶ˆÁçRûGÆu™@€TvÍXŸþ•piƒ‹'m[RfðL²Ø(÷D¹Ïs뻑-‹ýêøÁÖ+õ±…/“ÒKuk—1JÁÎM™`ã·´¢ì9æ60ÙǻۇµÊ]P×IY[Ãàî±,¶G)ÙaröÊ\È»ÉÿÞ%ögL©f½²IP(›jòÁJD@2b±­6Ÿ!AÜ6Ё´qʎP“ݺ‰·>+Ó£€säX©ªý¦vxØȅ«…:㯆3‰B¢3£H_& ¶¢q¯’† ¦ÉQSMñ@[`(n›åç?@{… xÖû:67büÛ©rHÑX°Ó:Ý×*†ÖIX¯)õö3†HaКZ©¡§±¼º%ìºQ ó‘ °…>b9¨ŠúË}‡Âq ¥ÉÔç‰Bè×L„_Á)bȍ ˆDüìÆ!N@Ž‘^ìÌZµ~ "ä‡Â‰#¢}#jÿ3Dmgø{ñ/µ¬_D×8Ðñ*tÜF×(Däèÿjtí„}ybÖTú´PNÖvAOí«={M½ +‹cßXÜW`qü2‹ëP8y…kø›|!“çù[bÐíó7ûˆÙDøb¡†œR¿î“M_Þ'Þçüj™^Ä<ÓéÓ1ÇôZûå0Ó£X"’.Ó ñY¦G¡Å71=~žéPÈ-Õã]ª&6TOéÀpTVzT/ +۝i¨žpámR„‰\öO7ñ?‚£˜jã˜qúwÊZ$ŠZF‡iKŒbpJ’ð&Ú¾ñ o ~áÿñ{!‚‰_|ñ#·?اiýߏUâßHüø5â#~7?¨èK@:‡󤪲UÞҝ¹m(Ê)çãË<š¨k½qèwŸ—j§{‰–zW§³ÙFå«z=Wei^çHuÄnђê²0$ \bq4Îõ§°Ý^/ô÷Ô,L‘Úëi±]&ûÊ »§„®cÀs—µæ`ú sÆp2…±|x©Tj×®r&Ǝ6rÊ”$Ù/IÛäóñAS—Ÿ‡çÏñ&_ÐPk!‚#"wý¾¦[‹üÖZ¾vk±¿üm í‡qMŒ{ÍOúwD’™ß+·"‡ú°ÝxXýJ,£é¸¶£vÚÁ4˗ÅvýGï ùîÕk{UänÉ΁¢k%ºQæDLà$!wöªT“ÚO),8õ›¶*цý“¯ýž ŠǽԘuü§ ÎW$¾õ/Ì_0À»Ú3¨àXex”Rïu¼êŽàn}K°·®/؛Vªü½f;.þžävãÊ­ ýÒ4s³ˆ‘¦Öºê ’{å±·žýø«m£oí%1´XÜÄк®w³»»ÃဖÚçÙ®DY}·ÛmîN£»£˜WÔ(y,Üøp[”Êï",n Ë9Áÿß"ùÌ +endstream +endobj +8087 0 obj << +/Type /Page +/Contents 8088 0 R +/Resources 8086 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8068 0 R +/Annots [ 8081 0 R 8082 0 R 8083 0 R 8084 0 R 8085 0 R ] +>> endobj +8081 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.334 312.156 236.659 323.06] +/Subtype /Link +/A << /S /GoTo /D (main_Concatenating_Polyhedra) >> +>> endobj +8082 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.635 258.3 256.157 268.198] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_38da38d0fab7eed9ee09fdb11f88fd15) >> +>> endobj +8083 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.708 148.957 250.895 178.023] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +8084 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [448.024 106.435 483.212 137.403] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +8085 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8089 0 obj << +/D [8087 0 R /XYZ 90 757.935 null] +>> endobj +8090 0 obj << +/D [8087 0 R /XYZ 90 733.028 null] +>> endobj +7829 0 obj << +/D [8087 0 R /XYZ 90 566.778 null] +>> endobj +8091 0 obj << +/D [8087 0 R /XYZ 90 552.762 null] +>> endobj +7830 0 obj << +/D [8087 0 R /XYZ 90 376.528 null] +>> endobj +8092 0 obj << +/D [8087 0 R /XYZ 90 362.513 null] +>> endobj +7831 0 obj << +/D [8087 0 R /XYZ 90 252.416 null] +>> endobj +8093 0 obj << +/D [8087 0 R /XYZ 90 238.4 null] +>> endobj +7832 0 obj << +/D [8087 0 R /XYZ 90 89.441 null] +>> endobj +8086 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F31 472 0 R /F7 505 0 R /F1 542 0 R /F8 504 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8101 0 obj << +/Length 2542 +/Filter /FlateDecode +>> +stream +xÚíZKs㸾ûW贑+#$œTÙÚÝìfS™Ì8¹L¦T4[Ü¡H†¢ÖãŸÆƒAA²fÊ{Iå"‘"tèÇ× áÅã/~¸úóÝÕÍ÷‚-$’‚ŠÅÝÃBâE*â”,î6‹KBK¯Wc¼|{Mð2ïvùúí5Å˦zÞªM—¯.ﻼ{¾½ý{ÑçMWë÷Û¼U×ï~ºùžÉô”J$D +‹›Ùÿh‡Œh2 ¸‹Ì!a|ð§—fø¶Ê÷ûëå&“t©vm•÷ÊþòN=¨îšdKUð“Œ/‘zΫïî®þsE`¼ ž¢.vW>âÅ~ÿi“ÙâɌÚ-Êà»Z¼¿úÇ> 1e >1ıùd<Ö=“069™Èa@ÿܪ:߁jQ0E‚ˆgÑä(MG¼Õ6Д;ã«XCI&ÎZD AL‹UBbœ/V¦äü´6<··vówÖè¦ÖÛòq«ºõ¾Í µÞ”;Uï˦v&ôoÌñøÛZÃkאHpÿb‡)ýicY§9ڛsK"L¿œŒñáŒE3óYö”ENù“¸nju"T†æÜÞC4ãâ÷Cˆ0ˆ_äŀ-„ž„…~<«€ŒÇîòÏë²~Mw•„ùËÝa7$'Ð/¯j^›hÝëÇ}˜˜Æ9¼ŸEqŒóWv:ýF +Gó¬|c¿ÃgßØùR]jøYõQ–…°)ÔC¬l€)FÛ4֒ ðd8Œv4•Ó|uÀŒOíTcxø]•fÙÉU§[ k61ÇPy§*#k@½•N +E¨åòLJ˜¼e¾4;R”V™Îé.ÔÚÛ2ÆÁ9„¯è§¨”|êõ6ÕĦ¢QßµqRf¡¾|B*q¬ê@™/ˆ>ŦàÇ´4W á+  `åã¸àñvq¨wÄHĉYu";Éh£……äêúôň +QÌÓì¡ ¶‘F‡BÝ5‰„֗&qƒH’£©'Ù×eœ:^Dña£U¬sB¡z£Þ¹ójƒ£¤ÙiL:¥0*™Õ†l2È¢¶çc¯ #ï@Wó æ¤sÄ> endobj +8094 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [322.376 569.426 385.519 580.33] +/Subtype /Link +/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >> +>> endobj +8095 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 305.429 239.856 316.333] +/Subtype /Link +/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >> +>> endobj +8096 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.639 122.605 300.161 132.886] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape_38da38d0fab7eed9ee09fdb11f88fd15) >> +>> endobj +8097 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.144 86.288 182.164 97.192] +/Subtype /Link +/A << /S /GoTo /D (main_expand_space_dimension) >> +>> endobj +8098 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8102 0 obj << +/D [8100 0 R /XYZ 90 757.935 null] +>> endobj +8103 0 obj << +/D [8100 0 R /XYZ 90 733.028 null] +>> endobj +7833 0 obj << +/D [8100 0 R /XYZ 90 643.459 null] +>> endobj +8104 0 obj << +/D [8100 0 R /XYZ 90 629.581 null] +>> endobj +7834 0 obj << +/D [8100 0 R /XYZ 244.439 308.583 null] +>> endobj +8105 0 obj << +/D [8100 0 R /XYZ 90 292.548 null] +>> endobj +7835 0 obj << +/D [8100 0 R /XYZ 400.69 89.441 null] +>> endobj +8099 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F8 504 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8112 0 obj << +/Length 2736 +/Filter /FlateDecode +>> +stream +xÚÝZ[“Û¶~ß_¡æ!•f,,î6¶gÒÄÎ$mÇÞ´®Gék‰THÊ»ûï{@€WA¢¶³Î´~¢H8ÎùÎÄ“Û žüpñ—ë‹ËגM4ҒÊÉõj¢ñ$ J&×Ñäý”Ăٜ`Œ§ofOÃ|.ÞÌ(žf›‡uåáâoÉMæWW¿,Ëð6KÃÍâÝ:Üų×?]¾&¤#žR¤ `òJús;¤·‚åõ€k õ€—c¾Û„E1›SA˜¦Óx»Û„elŸ¼Wq>#j§KxÄ4SF±‘yñêúâ÷ bð„T°ˆ0ñr{ñþžDðü§ FL«É]5j;á”Áu3ywñë> 1eKс1$˜Ã¹¬×x¨»Ò0–Ÿ‚Éu= |ØÅi¸Õ–^0%GD˓h + ޟŒ dId%>‰E0Ä•Ñ ^Ûd¶roöÊo½ýábòޙ2!¤kYÍDn@vóïxYºÝZfy»,’ôÖmrvþf×coÜÿvK¿è×Ãgîœnžõ¶ï&€%•´ #@Yà㵦ð„¨ƒª%šëڍ©Õg:õ°´c’¢÷ŒŒ‹2IÃҍ¥fú#ŒênRøwçÕàÓ6Ç$Òé›Ü«ûe¼3¯>ÒÜtKE]]r Àn’hæ·{д<…±Hw Î3î]ZÅÎi²²ÞE»ËçQB[ÂÌ㦰ɪqår Àº) €¤²3؛9›Í™'é2ÛîÏjŸÍwI¹öq£•M$CEm¤ÈòŽÄêW–ºIÌ›«Ùâ#.7gX"ÅX?<vA%;.¨ØlZ†ÀÊѬúÏϟ°½Tçò'|†´´A4˜~»)2;CÙÙ\³€zs{3J ¯Q$1„oÝÝ7#¾§ðë‰h'Y´êÌÍ8@”›$Uö=ª*ƒ`,eá'ó@ ®p+ˆ d?ú 0Åä)ìWB€o±+r ZÞT¢ñd~IÒ`‘zäƒgªNú@…î8@?ç,ñV֜B–á²%Õµ'ÚaØ3eOíg\Üñ˜yðváÕÂŒÃÒ¼ýѳ} +q,Ûí£Ü#*Ùd ÜEÏH\tÈŒ–¡Ó;.…ÕCΨ⠌êÆ´Âíõ:+œmÃûd»ßÚç^ûªþIÔ¡õyxÂÜ3rn”¡>ó$þ}nì£:Óê•Öˆ?ÎB%Ð_yФa®FíF`ÕGQMÓ¬´ktpnãíMœ;M| LéŸàü(êU5Å&j£½ùá°7?»9#l˜ƒT¯eö:Ø\óÈKhMj}¾Õ)Þ¬9Ìãã ¢™qu˜‚VŠBöOúXU™w“ D[)‚‹ì¢q¹‰¯ÇÒIä)o`Mˆ€xX4 +”Ôü̒ZŒ•Ôê°¤ö£X““%5”¼¬[¹0º(­À§¨¨p%ôɊº·€3*jyvE ¾^,³(n+èªètu„©¥-Y3DÚ=8UÂnBÊûõçÛ¸Üçu±Ú £ó›ÄCfMõ¢¦É=Á‚ó(®Îˆöt,Ú3¤É ã lt°ö}¤¤¡¬obÖ½G:5Ù¬ÒÏ¡°*hÜîaTH^×qûåºvçзY‚v‰ä~6—à`/^ØëÃhöõ¬á +/§AøxÛñӈ!SÈó,ôZs5‰¼Î“8­›ߦQÝC4Äân^ïÓ¥«þàîûlYT¶ 4&€!Ý䈁Ãtå#rMÁkm#ã?¦ý?!n»^š‚ô»µá›,ÛXi¶lÍr³ ¥t»dæïq†")GÕI†êÍ}íÏل’ç¯ß×¥#κ¦|(cáΕä-‹™à£Q ÉÃ8‹ªÿÀ.¸Wy¨Ë”Ä@yފ8Õ:lz¿ª|ÄOÝÌX»òS÷¡`fúÂÍìe¾ÔTmq–¬\¨}3K7®ßè£Y‰8åY}ÏÊÇólÛ8«Ü´Z®5œ:Z˜Ä”ÕáÂÙÖÏYŸdgåjÛ¡ùctچýß±¦L¥®ñ‰âÊäµUØ)“Ô­Æ°ˆŸ ² ñ¦¶€~À€˜Šy³Ö3>Cœˆ š 8¯¬/ŽüÒÔ‡‰%˜Íg$l)¨ÿ¨† ÂùI—‡…µ«þ^V”ö€+ÜZÉ_› k8ÜG¬Æ¥Û„ý¹oéè®-aM86Û!ïùÜPWá‘ÎÀúD‡t‰À²Ïº 1©¿Ö 9çØä69J»š Nl~ٗ»}}TP›‚.QÅ}Îùgž”U!ʄɮ“`÷æÈ羬Zæymrê™·Þ&@P¿Êó7_i{̙y{`¸cø„+rÔý9ül&N™;P¬¬ŠvPÉ! ÚÔc[˝X ˆòÁ>Ú¹j.K¿ñ)„!¯Öc2,ðÀô«91éè7^} <ÑÇTX=ª4âB{Ù§‰!ãOfûãÜ4œÐ`W³9£A=ºx(fФ½­Zåp­\9¡ðuÂMöŽij:!¾6dªmŠq|Ñl¸æ„“ü.©¢‹iÀ„›cw°Ðƒ´·D{²¶ ó6Ñ¿qï+«¾ò…ìì3ûr$ÛçXdËJõ“}#¬f‡?½0÷¼›ì›¿ÏIö%TÂb$ÙWmp>’ìw>x9*ãH²ÏÙñvà5¡Ã\Ÿjòçúìi£N›ì‹ÿ›dÿ35U¢¤úÒdçæ|µ“{s}þ¤¹þÓªô?”ëŸg&ç¥ú AýtÍ?']Â~––™ß²úì‡ÑƒB„ …õéjøN‰£ƒ8›¡/ËÄ4YÃ|%E¦ËxEr›Ú…šÿn/?š~tÕÇ®ÔDøó¾:cñtþE÷D蹍ºa‘0(9}u¡;‚©­øºž,|p˜cÛQz9:•—$„ÚãæüHaÒmdÔ!b.ˆ>'‚»uŽ“ÏÁÄ'©‘†G*{N8ì(ëâ¡DRý‚/3º¯ñÞfûê¸nñ}’û +[æÞ %ù‘ž$•ÿ}œm㆟§J;®Îý:µú*XÓ|YĔû*Õ\Õä×|QöÆdúæ@ÊÝÖ'RöÖKٛߊ8ÿ³©"åþ=Lݑ±=ª‹†¦?Ž‘Ù(²!â]\ŸJZÍ>Nê_½¨0j×KT`Òº,wW——wwwhY ¨Rv9JÊËÝnsyø9SG +1ÖØ4ìY7žn³:p')<Üz>ÒüÿA4á +endstream +endobj +8111 0 obj << +/Type /Page +/Contents 8112 0 R +/Resources 8110 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8068 0 R +/Annots [ 8106 0 R 8107 0 R 8108 0 R 8109 0 R ] +>> endobj +8106 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.502 649.079 241.69 678.144] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +8107 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.635 579.005 163.823 589.909] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +8108 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [486.549 518 513.996 528.904] +/Subtype /Link +/A << /S /GoTo /D (main_fold_space_dimensions) >> +>> endobj +8109 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8113 0 obj << +/D [8111 0 R /XYZ 90 757.935 null] +>> endobj +8114 0 obj << +/D [8111 0 R /XYZ 90 733.028 null] +>> endobj +7531 0 obj << +/D [8111 0 R /XYZ 213.427 509.198 null] +>> endobj +8115 0 obj << +/D [8111 0 R /XYZ 90 492.911 null] +>> endobj +8116 0 obj << +/D [8111 0 R /XYZ 90 414.576 null] +>> endobj +7882 0 obj << +/D [8111 0 R /XYZ 90 391.641 null] +>> endobj +8117 0 obj << +/D [8111 0 R /XYZ 90 391.641 null] +>> endobj +7883 0 obj << +/D [8111 0 R /XYZ 491.351 326.932 null] +>> endobj +8118 0 obj << +/D [8111 0 R /XYZ 90 310.646 null] +>> endobj +7884 0 obj << +/D [8111 0 R /XYZ 203.822 224.064 null] +>> endobj +8119 0 obj << +/D [8111 0 R /XYZ 90 207.777 null] +>> endobj +7885 0 obj << +/D [8111 0 R /XYZ 485.373 145.106 null] +>> endobj +8120 0 obj << +/D [8111 0 R /XYZ 90 128.819 null] +>> endobj +8110 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F8 504 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8124 0 obj << +/Length 1948 +/Filter /FlateDecode +>> +stream +xÚíZے£6}÷Wð”ØUZ$m¶R•{å¾ÉNž6[SŒ­Ù¡bƒƒqfçïÓcÀ©Ýd7™',7}Z­£Ó¼ +hðõ쳫ÙåW! 1! ƒ«ÛÀÐ@…@$ƒàj¼˜®@)?[GÙ&º~¶`tž®îì*‹®¿o²({xòä§e½J“h}ýü.ÚÚÅË«o/¿80Ϙ!a¨ðá…õ§å–@ Հ«†—Õ€OÆ,|¾Žv»Å“6·›í:ÊmÙ󋽵ÙôÜ&Kìâ†Ë9gàlξ¼šý14C(Â"Qøàåföâ% VØÿm@ 7:¸/FmÁ8^×ÁóÙÏ3zbI;!fœÐPzÓÍvŸ[ïd~ç}Ëì2×qb£¬ìøJšúû¢ä.Êó(ÁN(»VñÛKÿï›ß[›øèÈÃ)àœ(S…çu9¢å &"¬DɪÇ„D«°óÐcD£t5€¸Á %àÁ(â¿}s‹¡înZÀ]GƒÌµN#Qerš!RÉhŠ͇ µŒÄ;ï¤ýR–ØÕGØÖf¾ËÓÌúߢÄ_·Û,}o¢ÞYŸ+ˆ¢¡OïÜUµ6Vq‘$.ˆ®é‚ØZ;@»®Ø¯¯ÝÖ.c7UvåWÊCß"¡@„¨³Ÿ×Àe +g݃°d;Ç?]¯BÃ|Y¬õ­]Ùe¶¼ÙÚì6Í6Î-×ÜïâäUyûç‚IG7këÿå»kþ°õÿüÎ.wmW×?î776ë¡NœÈPvè· +IN˜†~5F3Zr3ÿòun“Umþú¢Œ|I8ˆv=K×ñr²Z?íM@⺠~Ú Xî(SÐ#0˜!‚ +"Tw¦Q¥væì~¹ŽW6J%\©]÷sWíz•Ì8Åê9ØâNWS­åúô„w͈ZKž+„%*-=ˆæQ½2‰ãþ¤Æ„ð¡žÀªÏKB “$!&+£pNLúŒÝäò›;Eþ€-+&bYۑ;ãP¨À˜ùÏGN*b3¦ˆ% Äµ?®ˆŠÓ)’xH÷±Iº«ˆ;o‘O¿zɟ§ë 4X Š1a§'´:[ØQŠô«Ž…âöÀðæ6€†‚U4)Þ è¸b•0¨X[F +¹àœ<uŒA-ëÜo®ÚÀ®B‘ *'ë\û”¬S’„ ´l +´ÂÞi텛#‡zEL“sÅ +æ +Ô6M Hž¬<ž¬ô¬ÈGyX¤ŸFà_ã‘÷¶T”ÿÇSùœ²¨·X22¦ßH2í4*ãlžãäa{‚›Åj°®ëK÷ÇjhÇZO¡¡Qú‰±·ÏD»¾tæNחeŠÀ:ˆ·ßM>bÑ´¨<Âfˆ6Çu%cü̺ làž¤Gj !Ô9ç+BÈú ÂI (žÅX<ôPM¥‰2| §Å©Ç*JèÅY®`ƒ¼Ïõ[((1×äØÁH9rŽv`£?Vmô¬šRÉp´¦lÅlâ1‹³Û—¬ÿ(7‰æÍÐÔc–¿iÞ¢í“ç+l¤Î¾¸Q:Óʸ¡z›N:ayï +íú[Îî'¡¡F%¦§~Z} âp—_‚JC¤ìŠ§gnOvÚúfõ¥mÙôŸÛ–_w6ûp!å|WŸPí£usrõ§3e³]­²p)£RtSNN̟[ëA–È~ª»ïfEðÝqª“*8wy¾}ryyO–;²OâmFâür»]_¶ÂÖA à(©ÖžÕÙÚ&­^Élj“Y…;Šÿ_›Ù(² +endstream +endobj +8123 0 obj << +/Type /Page +/Contents 8124 0 R +/Resources 8122 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8068 0 R +/Annots [ 8121 0 R ] +>> endobj +8121 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8125 0 obj << +/D [8123 0 R /XYZ 90 757.935 null] +>> endobj +7886 0 obj << +/D [8123 0 R /XYZ 125.554 569.498 null] +>> endobj +8126 0 obj << +/D [8123 0 R /XYZ 90 552.771 null] +>> endobj +7887 0 obj << +/D [8123 0 R /XYZ 438.998 418.986 null] +>> endobj +8127 0 obj << +/D [8123 0 R /XYZ 90 402.259 null] +>> endobj +7888 0 obj << +/D [8123 0 R /XYZ 125.554 191.689 null] +>> endobj +8128 0 obj << +/D [8123 0 R /XYZ 90 174.962 null] +>> endobj +8122 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F65 376 0 R /F95 1788 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8132 0 obj << +/Length 1993 +/Filter /FlateDecode +>> +stream +xÚíZmoã¸þî_¡O­ \¾‹L‹Úí]ÑëµÝÞ¦Ÿv†b3±p²äJò:é¯ïP”¬Ӓs—= ŸLRôpf8|æJ8xpðçÙog×ßIh¤%•Áí} qJ‚%Áí:ø4'±pqE0Æó ‚çQ¾–ϳäicÖy´ü!¾Ë£üéææ«2zÈÒ(Y~ÜD;³ørûýõw„tÄSª‘”!,^Iÿ½›ÒӀ`Dy3áÖ#C#ÂD3áݔ„÷IT‹+*0Ótn¶»$*ùÑܛ|AÔܤ+bš‰9£Ôʜ}{;û÷Œ€Ê-"D!,¼ÚÎ>}ÁÁÆ¿0bZ‡jÖ6à”Áo|œýs†».xàbÊ–Âiø—{P†ðy¹1®aö«$^›(uÝu\”Q¥%l~gʃ1im¶èšÍâŠ6†?º)½¥"X7¢tí“"‘ ²™ó4%$.j%ÍgŒijÖß@Ÿ’yQf¹©Ÿ5†D»]ž=ÆÛ¨Œ³z(»wVÅ¥ëÇi™ù” +’­iù%¦UòrSîó´ðˆä1š?”ùÞx„Â6iÒÌù\q +áł+8ZÔ[x~†Çx¿’·£pÊT3+ƒHÈqa[QR$ ð®Hˆ$¶;›:„×qnVµC¡[9~ËæùÐé0×ç¡Ø™Ul·Í¬ÝÀݓÇŠ âüè)XÏc¨¦Ùqj½)Ñ`V£xíª?$‰[l•mwû²R«Ö'Êkw&¿Ïòm£Ö¾ˆÓ‡Y%œãÌ¢Žë~]Pÿ£»Äø¶æ N.·;<µÝßø‚é6 +Añ ‘ˆc2yÈT(;‚è9mHϧ »bÅ+hPD4ï@6âHÕ°]6w +¥Š~±14ÌãÇcU>íLma œf® §^©N8]‘ÀPŒÂ7[Ž[u—e‰—,ã´™¸|Z6 ¸tR7ã3øýƬ~²‰Ê¬—Wu2‰HÈûGöïûíÉ=28ÏP6&lS”u8@(9ÿö±4é–vâ›D¯ž¼¾Ha5ê‹ÞR¿q3tõojî‘Áº±zR8}i˜+ˆžOgmñJۘ¾Ä'>!HµáüÆ>zdôNhßØ*˜’H갎éæM{ ä(¤úH[¼Öc*=HÍëi¬püÌöétù§¹{BC@wBOн¯A¶UρSF|˜ûK‚>åÆbÎú‹Ølf†Ee?£½¯ò)Z ?õ!P0!>ú¡žÁ‰tȔ!ÁE ñ#ú²†lE‚άDzyð,Ç +½ÚMòS,.ÕsÐßG±Ø£ٔ„ê@Ë{N³Ü‘1~Æ] ,d—¹KŒ¸‹ 0¤AgVë.»øˆ»€¹`9æ.`“ŒrQcî!¤KH­R]Bʄ<RûÌRTÀì£ìÞ=²„ÔöÏR®¥á!í*UñQ+n„*°RüR>*ßøè¥|”wø(WdÀGíHÅGm£ÃGm·æ£¶ÙçÕµØþZ.äZ]Jržv@nR RLϨ»](ìhÓ'´£&>Œ$âóÁґó'?b02ÌR畨Ël5Ëû<ÿ吉_„Lü ™þ¯‘é­RþY•2ãj€Lv¤B&Û¨‘iAæV3;Rƒ“mÀÉUA¿œlë2pÂ@͟ƒM!¶m6À~ŸC' aRëWF§“’¹ÆªªbýŠY¿bÅܽ€´=bùy§S²Ñ žÒJCe ÉdqAûEµ7ZT»ØÔPW±ÙÙ¦a¥}6r®Ê­i¤ôi1M){f1M¡ÀjkÃwgVR瓵´èXœ‹¦”¦D^RJcàö|Êj¬8n#ðݔGÏÚ©¦ÊhâµÓ]ˆ ÍT?&^¤Š&ˆ +=z`ÓÄxݓáµJUü¬B:„<=UH÷|vI!]ËmQ ê՗CvhSv{yٓ ɖ+öËe“W”MÏɦ— W2¤}Ћ¸±Küº· â¢Ûñ+½]xãðoþÃ¿½íú½í"øònwˆÿ,ò.¼dD0DÛ;ïs¼[ÞWK—³xí$‡¨*xE§_âë +¸Á§ÞR´êøL‚L+¢¡xÎ4¦§^XèçÐLñB_™` š’L9‚é©÷5rjkŸaÿ$Í|÷*Ê&ñ>t~´°%ñ¼HÁCÈ#GáE¹¾¹©¢ÒCØ¢FÏ'ìzKkB^ñxkóO¨éÄ»fvHûÖ¤@ôÒݏX¹«lÓ|"TB­¼6v\TG¶y‰*ù𨵷@ÁÕ¸Í鱏 CÐê×&Âm*ÍV{йì¤JHCMâi²æªý|êP̺ó`R“Û%ëæÙv³î³$Él¢:ó™Í¾‰¹©>¯j¾²ÙÛRè¤h¢æ3¥¢?ëS… »]‚6›Þ“ágZRAQ—~¥Õ|ÕrVa#ÄÐ]쥔…¥ºÛà’ëÖàä:ÿ*Lþۅx×ÿ[”qÀ_­(“G¿k,±;ŽöZlþјÚHgÙOAÓúë¬ +ˆV_gžácoÊrws}}8Ъ@û4Þå(.¯Áq×=· ¬&ĖæGâÖÄÁ6kHJœZŽRÅ +úÿ¿‰&üH +endstream +endobj +8131 0 obj << +/Type /Page +/Contents 8132 0 R +/Resources 8130 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8138 0 R +/Annots [ 8129 0 R ] +>> endobj +8129 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8133 0 obj << +/D [8131 0 R /XYZ 90 757.935 null] +>> endobj +7909 0 obj << +/D [8131 0 R /XYZ 438.998 675.861 null] +>> endobj +8134 0 obj << +/D [8131 0 R /XYZ 90 659.134 null] +>> endobj +7910 0 obj << +/D [8131 0 R /XYZ 125.554 448.565 null] +>> endobj +8135 0 obj << +/D [8131 0 R /XYZ 90 431.838 null] +>> endobj +7911 0 obj << +/D [8131 0 R /XYZ 438.998 298.052 null] +>> endobj +8136 0 obj << +/D [8131 0 R /XYZ 90 281.325 null] +>> endobj +7912 0 obj << +/D [8131 0 R /XYZ 90 234.121 null] +>> endobj +8137 0 obj << +/D [8131 0 R /XYZ 90 219.551 null] +>> endobj +498 0 obj << +/D [8131 0 R /XYZ 90 138.783 null] +>> endobj +8130 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F65 376 0 R /F95 1788 0 R /F13 540 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8175 0 obj << +/Length 1474 +/Filter /FlateDecode +>> +stream +xÚíYk›Fýî_Ti‹¥0ž÷@ÔTê¾¢¤Éf»ëT’Èb1kÓbp1ÎÆÿ¾w`ð̲N'›ªŸ0øΝ{ϹgžØšXØzÚ;ö§’Yò$•ÖðÚò°¥$CX¿­·6!ˆ¹}‡`Œíó>Á¶ŸÍüÑyŸb;WÓpœù£ÑUæg«ÇAùq¼]„ãeŽGçYŸ¸v +/yÿýðùà”©‚Þ<áýýTšÔb"QæUÇäQß¡ÛÇÔü¸hqËò|øïÖØCA=ë3e‡Á*ˆÿkØïVúzö‰’¼“„Tùn„üWÿþ€—û+þï~ÉÉ.ÐfG£s³äM“67óiÇ´®˜ LÂJ²˜Ù?FùjT®3[<5»'¿œ½9Åv eÊ?zõòüÅÉφo>k¾ï^9ykÐL\—_f5³#cm ),’K7“rºµÙÙYáLŠ{gžØ‰pÝ×W$\~>áfÀ|aÎÉ~ñœÑ]H;b?Í¢q«ƒƒ ä‰í‰¢j'Æ ßååc ìAÒE#…<¥ àÚ$n¶’ùÆiÉà†©[; +JÞÜ»Öý/HéÔJó>HBTÄÝõ:¨¸à%”+sÍ-^ Þ¸¾0Å73©TÛ#ój +aöc_ÛdÿÒO–Uº"?hWa¦ÏÃˏéÛ3 6ê; Ò¾ «,3û˪~ýÚ+.+nã%®B ¯‡ÝižÏ777(X eÍ3åƒù<l^€¹Û±û:5—³43éG |œùú†b ÿOGë +endstream +endobj +8174 0 obj << +/Type /Page +/Contents 8175 0 R +/Resources 8173 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8138 0 R +/Annots [ 8139 0 R 8140 0 R 8141 0 R 8142 0 R 8143 0 R 8144 0 R 8145 0 R 8146 0 R 8147 0 R 8148 0 R 8149 0 R 8150 0 R 8151 0 R 8152 0 R 8153 0 R 8154 0 R 8155 0 R 8156 0 R 8157 0 R 8158 0 R 8159 0 R 8160 0 R 8161 0 R 8162 0 R 8163 0 R 8164 0 R 8165 0 R 8166 0 R 8167 0 R 8168 0 R 8172 0 R ] +>> endobj +8139 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 609.148 225.331 620.052] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_6713cca018bed4091ffafb98ca4833d0) >> +>> endobj +8140 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [244.425 609.148 310.068 620.052] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +8141 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [428.607 609.148 513.996 620.052] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g616fcdc7600a3a11a8a9152e75730899) >> +>> endobj +8142 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 558.355 225.331 569.259] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_28f6854a94a3a7d58034cb1d51ae9c7c) >> +>> endobj +8143 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.669 558.355 337.121 569.259] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +8144 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 519.518 225.331 530.422] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_4857c775f03d5b4ff084723eed2b5e31) >> +>> endobj +8145 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [229.147 519.518 313.6 530.422] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +8146 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 480.681 225.331 491.585] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_1daec40615d5a93ce0de360865d93497) >> +>> endobj +8147 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.669 480.681 330.496 491.585] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +8148 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 441.844 225.331 452.748] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_bc31d844172a202d43d08e299e26322f) >> +>> endobj +8149 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [229.147 441.844 306.974 452.748] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +8150 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 403.006 225.331 413.91] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_d3eb603756ab7be783cd92410ac7aed7) >> +>> endobj +8151 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [260.456 403.006 320.013 413.91] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +8152 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.967 403.006 427.433 413.91] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +8153 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 352.214 225.331 363.118] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_dca9874a75b5ba09114b8495a23c4edd) >> +>> endobj +8154 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.976 352.214 328.918 363.118] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +8155 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [354.707 352.214 430.173 363.118] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +8156 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 301.422 225.331 312.326] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_ef3ebc0ed74af80cd3653321153360bd) >> +>> endobj +8157 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [276.214 301.422 296.468 312.326] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +8158 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [344.088 301.422 419.554 312.326] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +8159 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 238.674 225.331 249.578] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_2b4e2b95a505c70e40370e121cd179a4) >> +>> endobj +8160 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.104 238.674 272.705 249.578] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +8161 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.669 238.674 314.396 249.578] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >> +>> endobj +8162 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.143 238.674 430.609 249.578] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +8163 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 175.927 225.331 186.83] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_b95eae83384d8c6b41b9ed8f9fd16704) >> +>> endobj +8164 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.646 175.927 299.806 186.83] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +8165 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [354.872 175.927 430.338 186.83] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +8166 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 113.179 225.331 124.083] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_2b3eb71543b3284872781f0b4481fe39) >> +>> endobj +8167 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [273.099 113.179 345.367 124.083] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +8168 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [438.53 113.179 513.996 124.083] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +8172 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8176 0 obj << +/D [8174 0 R /XYZ 90 757.935 null] +>> endobj +286 0 obj << +/D [8174 0 R /XYZ 90 733.028 null] +>> endobj +8177 0 obj << +/D [8174 0 R /XYZ 90 628.113 null] +>> endobj +8173 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F21 2111 0 R /F50 339 0 R /F65 376 0 R /F72 471 0 R /F35 2018 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8226 0 obj << +/Length 1621 +/Filter /FlateDecode +>> +stream +xÚíZ]s›8}÷¯à© 3µ¬¢³Ý™mštÚmÚlâÙNÛñLlf xÇõþú½B;¶“&íLž°AºººçÜ£+6F6Þt^õ;½‡òêý+ÃÆë0„å¿¡ñÙ$1au ÆØ<³6ý,ögÅf:YŒÃaæÞG—™Ÿ-^¼Ð ŠÈŸLƒóp8 Âáà,³ˆ0SøSX_ûïz'„¬ H]ͳÁr¼_U“†O#ʼªÅkòÜêRŽÍ×Tÿ8o1k3äy¼êóÛ«õ°G?ϕµ¾åQ3Œ§¿e7£Ë˜‹¸#Œ.Ãã:0çáUXN,LÕÎÆax¬M2jË۝ã~ç߁»Ø exmQÁ î|þŠ!Üg`Ä£+À—L Ž?ø˜¥dЛð±#«s÷V=ñçFw“ŸõwñX!b×WñÕ«vy.úk î!ÎíµWúUH¬‹„³êS õW/¡þü•‡Ù/ç¦ÆàÔOfþĪYt-M…Ùòˆ#ùå‚:î/ßk\„•þ¨™ýcT¿þè”Á\úK„‹®£9.Šé‹^o>Ÿ£ G³$šf(*zÓé¤wó zÅ +±Ñò-âUu<§YX•²Ž(™ÕÄâÿ? `¡ +endstream +endobj +8225 0 obj << +/Type /Page +/Contents 8226 0 R +/Resources 8224 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8138 0 R +/Annots [ 8169 0 R 8170 0 R 8171 0 R 8189 0 R 8190 0 R 8191 0 R 8192 0 R 8193 0 R 8194 0 R 8195 0 R 8196 0 R 8197 0 R 8198 0 R 8199 0 R 8200 0 R 8201 0 R 8202 0 R 8203 0 R 8204 0 R 8205 0 R 8206 0 R 8207 0 R 8208 0 R 8209 0 R 8210 0 R 8211 0 R 8212 0 R 8213 0 R 8214 0 R 8215 0 R 8216 0 R 8217 0 R 8218 0 R 8219 0 R 8220 0 R 8223 0 R ] +>> endobj +8169 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 706.973 225.331 717.877] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_3b5db50d397654bd1a8d4067d90f7419) >> +>> endobj +8170 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.434 706.973 390.855 717.877] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +8171 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [438.53 706.973 513.996 717.877] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +8189 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 644.232 225.331 655.136] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_8cdc72dfa85aed4e613f780b02e69e92) >> +>> endobj +8190 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.333 644.232 363.754 655.136] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +8191 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [438.53 644.232 513.996 655.136] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +8192 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 593.446 225.331 604.35] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +8193 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.071 593.446 276.878 604.35] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_187bdab1051f58af280af66645ce1fed) >> +>> endobj +8194 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.215 593.446 415.636 604.35] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +8195 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 554.989 162.657 565.519] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_b3ad0a7ad694f4a7724504544aff49fa) >> +>> endobj +8196 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 479.315 190.738 490.218] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +8197 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.236 479.315 261.85 490.218] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_38a5f3efb1fe599046d2ed48223bfa41) >> +>> endobj +8198 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 442.5 190.738 453.404] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +8199 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.236 442.5 262.159 453.404] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_46f912e8b181561f68062e183005c8bc) >> +>> endobj +8200 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.216 428.899 279.072 438.805] +/Subtype /Link +/A << /S /GoTo /D (main_Affine_Independence_and_Affine_Dimension) >> +>> endobj +8201 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [313.187 428.899 391.232 438.805] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Affine_Dimension) >> +>> endobj +8202 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [173.523 406.059 210.384 416.59] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_c2583843b139ce11b842155b35d60332) >> +>> endobj +8203 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [173.523 369.245 210.384 379.775] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_294875fd6b469d8949f08c24b5893b6e) >> +>> endobj +8204 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 332.057 202.922 342.961] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +8205 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.42 332.057 248.58 342.961] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_1dc5b9db43a16365ba0773a96fe1b799) >> +>> endobj +8206 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 295.243 202.922 306.147] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +8207 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.42 295.243 296.181 306.147] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_2fe458f016db5eeeb95bee46f1800533) >> +>> endobj +8208 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 258.429 209.547 269.332] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +8209 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.045 258.429 261.831 269.332] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_6bd361a7c7e187c0ff63c62894e741f8) >> +>> endobj +8210 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 221.614 209.547 232.518] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +8211 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.045 221.614 309.432 232.518] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_425f248891aec4ed7800bd92334fd7c1) >> +>> endobj +8212 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 184.8 205.692 195.704] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +8213 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.19 184.8 261.312 195.704] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_cc8d0378d1cb13b5ddc04dd12cf18ebe) >> +>> endobj +8214 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.65 184.8 332.156 195.704] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +8215 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 147.986 205.692 158.89] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +8216 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.19 147.986 261.312 158.89] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_3be7b3a04406453631aef24b817565a5) >> +>> endobj +8217 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.65 147.986 338.781 158.89] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +8218 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 111.171 205.682 122.075] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >> +>> endobj +8219 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.18 111.171 261.302 122.075] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_d3e2a76d26bef272d0a13fa3bae9a5c2) >> +>> endobj +8220 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.64 111.171 330.462 122.075] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +8223 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8227 0 obj << +/D [8225 0 R /XYZ 90 757.935 null] +>> endobj +8228 0 obj << +/D [8225 0 R /XYZ 90 726.054 null] +>> endobj +8229 0 obj << +/D [8225 0 R /XYZ 90 612.528 null] +>> endobj +8230 0 obj << +/D [8225 0 R /XYZ 90 573.697 null] +>> endobj +8231 0 obj << +/D [8225 0 R /XYZ 90 494.381 null] +>> endobj +8232 0 obj << +/D [8225 0 R /XYZ 90 459.589 null] +>> endobj +8233 0 obj << +/D [8225 0 R /XYZ 90 422.775 null] +>> endobj +8234 0 obj << +/D [8225 0 R /XYZ 90 385.96 null] +>> endobj +8235 0 obj << +/D [8225 0 R /XYZ 90 349.146 null] +>> endobj +8236 0 obj << +/D [8225 0 R /XYZ 90 312.332 null] +>> endobj +8237 0 obj << +/D [8225 0 R /XYZ 90 275.517 null] +>> endobj +8238 0 obj << +/D [8225 0 R /XYZ 90 238.703 null] +>> endobj +8239 0 obj << +/D [8225 0 R /XYZ 90 201.889 null] +>> endobj +8240 0 obj << +/D [8225 0 R /XYZ 90 165.074 null] +>> endobj +8241 0 obj << +/D [8225 0 R /XYZ 90 128.26 null] +>> endobj +8224 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F72 471 0 R /F35 2018 0 R /F65 376 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8280 0 obj << +/Length 1850 +/Filter /FlateDecode +>> +stream +xÚíZ[s£6~÷¯ài 3EÒN§ÝÛL»I³i_vw<ØÆ ­ .àxÓ_ߣ l|IB6ÝL2ÁB:çpΧOBعt°ó~ðóÅàô]À‰d@çbêHì„CXýš8Ÿ\BÞ Á»gÁn”Ï£á™G±›Ín®âI ?$£<Êo^½²Ê$šÍn†çñd9Ž'óÜ#ÂÍàGé}¹øåô! ‡4o҇p´¿M—VL#ÊdÕã yéPŽÝ7Ô^œw˜õ’’Wc~Úaµvûz…±váIêÆóÅ,*c5Ì9a,D<Î $Cr›˜óxë‹Ó±éçc0ܶ&åªyðöbðπ@+vˆN¯"*¸3ž>}ÁÎÚq0bR8+Ýkîø”Áÿ™óqðûÛRáfÉ8n> Q#B +™ ¸ñþ™Z÷Õ8çÓ ‡Ž²lfÛU<ù¥ ì\÷PϟCxúòfs´º÷s Ädjœ¥EÙêVý?}RG@„¯kLQàÈCÂçUþÊež¶0¼Ñ›aDXÆ2_ƦSÛ$Ca@ªNÉÔD¥s‘¥³sU݊“ò + +fîÚ6h©žd¾ÈÒ8-‹ºƒv)eÃ%Â’V>?cÌ:¢÷Q€EüUR >Ê=º6“zÎ]ԙØu‚[€¡qˆöR-íË4ñ(w¯=ÂÝ8/⇂Cð8peåÕýÀ@QH‚‡CãZ± v¡äÖàð ApÀQf‹l–]&cMôãYVēÇH(áÃG>æM|0J >ԅÁ£¤¾eð¡ïÙ] uÑć²qr Y„‡ðÑ +½Æ‡I—AÁ–Âhꡃ+–£"6‘¶E¯l”Š1Ð,†’Kãâ:—™eÊbï‚8[ÀÞØh’eIZ§y6߅´&¾v˜:SÏÒ¡Pju²i÷ÅÍ}ðK‘üæô¶E˜þ‚öFU5ÓI‡›käM‡ÅEÝtWO¬URئªî·ƒ „AhœP‚Döƒ¿q—ñEÑFâ÷-x˜#Æý¾Q”u¡Ç å]øF‰ù G¾eËtò¸kړ.·ÍïcVYW.“ÿ®*ïïþéB€¼’h4ëä„k¥£ü»\;Ún­×À×Ûˆ@LÍ›üêõ6Icë-I;°K ÞÔh®z£à–àR2’‡}­à…–+Ãh”©4˜W©{ˆ—Ç(¾ýºÈã¢H²´S°hú„.O {1<Óam~Ù:Ž_{,Ё¸„=èF1¼ ­ž÷ ¸‡#G_“yòï©1"Á˜2qcªS1ÏÇîË=Yà¾Îâ©>d˜Ž¥rº ËÅ0Ýk‰cIK“—žQe ªå×ÆVÛ¿ÐÉZÎï0MˆHȎž&Lo˜&Ò­i;MàÂN“ìxŸˆ‡¼iØ £0>Ó¬4f/´mÛG@&üð|íp²ž¯ðc +¸ân6·¾FzKå:¶)𠤎,Hò,è}>«oa (D{_]%c…ý«õ§FE{Ãf›†Jó6€3-×Ñlio®Ú|±,o­Â«½gy$y¹Õ~§q©-¼®Õz¡¶SîÉA˜<³Ð3 U,$îÆBµ(³»˜ær¥¾Ôé}Á® F‰è1énˆ4c,2[öK¬³­-È;P"æ( ½¼;2IÝy’vs¢dGq"˜8̉ÐéXNô©8‚É ¸I:ÝˉGZ¢Æ’âD5b?'ªdÝ[UÅhœ“ß™Hc³K1š ,ÒeX14u3šD¾úùdD6öÜÀ§a4֌fCëd4IÃCS¬ÓɚÑÀÑHkMjР^JW6]d9–Áe Ãeàx‹Ëx# +*ª$U€}`9íü/ +Åq4Ζõ_ՑÀ÷!UZÁÖeÛ<‘•„Ù$I/÷FºuŒ„¿ï<GLÜm3•……’ô…٢̓q©ÎS=Yðòu)v+hºæa} [ðª {P ãúÖ¼êWº{'x)@³>¸¾lU¿*’ +Êê—9<†;¡ÜŽÛœËÂ>òÕ6}seèÄ·zýÀ{ó rFÀö‘甫sÉ’!x4GÉá]]‰ +íü¢šÍ›s»fUçÈ=ûÍI&7?þ(âüuÖ2ÂoQºŒf^=ªÓ©J¥êFàGŒ¨‚2‚Äì~Œ+-lžìo§ºúu S¹Ž—Xq}véª,¯NOW«h™&‹%åéb1;m¥qã© (»°62­Òͳ¼^Í¡q•s»ÿÿ5 +endstream +endobj +8279 0 obj << +/Type /Page +/Contents 8280 0 R +/Resources 8278 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8138 0 R +/Annots [ 8221 0 R 8222 0 R 8243 0 R 8244 0 R 8245 0 R 8246 0 R 8247 0 R 8248 0 R 8249 0 R 8250 0 R 8251 0 R 8252 0 R 8253 0 R 8254 0 R 8255 0 R 8256 0 R 8257 0 R 8258 0 R 8259 0 R 8260 0 R 8261 0 R 8262 0 R 8263 0 R 8264 0 R 8265 0 R 8266 0 R 8267 0 R 8268 0 R 8269 0 R 8270 0 R 8271 0 R 8272 0 R 8273 0 R 8274 0 R 8275 0 R 8277 0 R ] +>> endobj +8221 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 719.912 183.824 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_ad10819182a33870e4b0a7e3b2bca564) >> +>> endobj +8222 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 683.628 192.272 694.159] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_1190fcf4794305386f8475f9ac51ce00) >> +>> endobj +8243 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 646.597 241.935 657.501] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_41c9a9dc63e253ac5ed21cbdad4e2640) >> +>> endobj +8244 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 598.981 213.163 609.885] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_db466cb206f1d16d24257a838d130cf2) >> +>> endobj +8245 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.501 598.981 351.922 609.885] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +8246 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 564.588 189.901 575.118] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_df7bd95cb0014251d60d1fd82c1d3932) >> +>> endobj +8247 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 527.93 193.229 538.461] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_fb7b94b681c4d195080fa81ed1480cc2) >> +>> endobj +8248 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 491.273 187.689 501.803] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_e386245235cada70fc797b0747b0d326) >> +>> endobj +8249 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.505 491.273 226.693 501.803] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +8250 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 456.132 228.895 467.036] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_99dc4fb442b60dc9c694d7abc853a3dc) >> +>> endobj +8251 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.232 456.132 333.482 467.036] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8252 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 421.365 229.503 432.269] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_a8128b9910f31bc963842e48c44a863e) >> +>> endobj +8253 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.84 421.365 334.089 432.269] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8254 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.98 386.598 187.264 397.502] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_3a03cd3ea1b11c1c8dbdf462959d79df) >> +>> endobj +8255 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.963 386.598 293.213 397.502] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8256 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [325.131 386.598 371.148 397.502] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +8257 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.711 386.598 455.727 397.502] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +8258 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.98 328.917 187.264 339.821] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_6d33d9f1d987efe6e333c7ad1993dd5a) >> +>> endobj +8259 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.963 328.917 293.213 339.821] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8260 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [325.131 328.917 371.148 339.821] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +8261 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.711 328.917 455.727 339.821] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +8262 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.235 316.962 220.058 327.866] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +8263 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.717 271.236 186.348 282.14] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_b73df10027395d3b2c9fbd3f3e77944e) >> +>> endobj +8264 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.523 271.236 293.772 282.14] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8265 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.35 271.236 373.367 282.14] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +8266 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [410.82 271.236 456.837 282.14] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +8267 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.717 213.555 186.348 224.459] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_5358c9f367ad37e650d411ab5e558e50) >> +>> endobj +8268 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.523 213.555 293.772 224.459] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8269 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.35 213.555 373.367 224.459] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +8270 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [410.82 213.555 456.837 224.459] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +8271 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.581 201.6 218.404 212.503] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +8272 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 155.874 180.496 166.778] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_888509fe116790d0b9a267e614be10ec) >> +>> endobj +8273 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.834 155.874 319.255 166.778] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +8274 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 121.107 213.153 132.01] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_78e60691cfc6b6b52a34cc7952380a84) >> +>> endobj +8275 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.49 121.107 351.912 132.01] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +8277 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8281 0 obj << +/D [8279 0 R /XYZ 90 757.935 null] +>> endobj +8282 0 obj << +/D [8279 0 R /XYZ 90 733.028 null] +>> endobj +8283 0 obj << +/D [8279 0 R /XYZ 90 700.305 null] +>> endobj +8284 0 obj << +/D [8279 0 R /XYZ 90 663.647 null] +>> endobj +8285 0 obj << +/D [8279 0 R /XYZ 90 581.264 null] +>> endobj +8286 0 obj << +/D [8279 0 R /XYZ 90 544.606 null] +>> endobj +8278 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8337 0 obj << +/Length 1814 +/Filter /FlateDecode +>> +stream +xÚíZmoÛ8þî_¡O»2P3|§T¸k¯‡})6ÛdïK»0‹I„µ%¯(7ë¿CQoŽeÅn”6îC`I’Ùgž™¡„½{ÿüûrröN2/D¡¤Ò»¼öBì)ɶw±÷Ñ'±`:#cÿ|J°å«h~>¥ØϖÛ[çÑüçä*òíëו@‘DËåvþAǛ…Žççù”~7Åô÷ËÏÞÒY*X-ä N¹Þ?œÈŽN#ÊÂZâ-y5Qý·´ºøÐ3-g( E=æŸfm–}³ŒŒq³]NCêëÕzÚófŒ)$dàÍÀ¡¨ óA_ërc:]89Ž„áßՔŒJûxòŸËɟO±GJór…h ¼ÅjòñwìÅðüG#Þ])µò8eð»ô.&¿Npå*Üu™Àݍ…$ŒP,)…[ý¥¢\¾ç}œ ðáU–-«çVŸü¦RìC)a÷ÿËO÷ÇÙ§Ÿ°ÀðGœYjŠ±ú÷읢^ºI^z—"É XÜÁUeë[½°øù£2xrí~4ÕÕÒ)Çþç(O¢´¨¤£|ʔ_ ˜¨HÌ'Œ©ŽQ¯:ûêí``Æ$€ô³®,w±ŽÀ¡3A„ÿ6YéÔ$Yênµ±~µ’ôÆ>çþ{½º‚g¥Ì»Mº(`„q·ÅmT¸«÷ѶºÈâäzëF–;-§îœY‰+\¯Òï^8u¶¶‹ +†¸ðfF’`ŸËhNâa\DqGTŒêê\ۘJõü.)nŸ±Ó©ÛìoFß#Ž/ +„:ÅùÎ0%÷8ãôÀ9?ê<Ð/„ƒH…Ԉ“oêT÷å˜ä»ÅÍc@ÐF~Tc`½uWÙuƒŠÎú÷܆ˆµÉ{qÓã TŒ&„à@A1ÁٓòÁsÅ „îW6UÒÓ\ÿbè@J¤äS•=Í( ˜_lM¡W°`Æ) CLLSî»ŒPh‡*ú\F蛞ñ@1Aöú+Åó +}˜5†àHD:µÄqpx1üp¨”Æ.'rè¡8Û.–ú(.98ã×AFK!'B#Ĉðc A¿„)v¦ÙcŠýÌyy`òd £¥ytò×LÝöÂE8Ų§ˆÑ¶Ì0/¶Â¤ &Ãá×è8Ÿ;jj=óFBžˆ‡QÓƓžJ@Q¨Ñùä~âx&ƒ‰ãéÐ1˜7¾€:°BíaÄ f¢DB5f9±Iœ‚ÿM !¾=_¾Zö6¢ x* Þd«õ¦°ec¬ÂÁýXÅv™¤qžØð^Dö(ù¾^V +RÒ¾ƒ F¡á‘Ï‘À …XNvÚ;æ1k½(ªídî׸Csƨ7‡æ}DA°ÏQÞe¨§›µ_Á¤‚û‘1ÉMZž¸Û5Êpê(´Y¶úìÛeF7ö¿„ß”yýx0&/Gd˝P0ó ÝP[dó+=ï,©ãÇäÏ68WÃÁ!¸<"8ì4‚ÃR#8$ât76ìª;±a•µ±Qïª|`t1­,͔øÕÛ&¸kÇôEŽЇñ–à­fõûI°R»ðÞqQÏ.$`’0+Slf;Y«få?úÂ,°Òo~ Ô%F/ÈÓ:7º|­7wzDœ—¹ÿùþ ½:䶏jkJ}̀ÛX€9†×[[´Ïj¥:-îÓ¼Ö-Ü+ÔʨM—ÕµqÆFW/Jã¾ H†Ì¶gÚ˜9˜÷X~³^ë|~•mÒøÿ¸<ÚñÓÖvî²4àe€(§Ï‚öÅdÛ5ºüY«Ÿîuy–²4nx½‰Is*¹†H…ü8 ?ü¥É>~çÉõ\[ þ-ŠfºfyÌ¡âã`(h»8‡fÙ¢Yµh–ÑÌyM Yñà4« ͲB³ªÑ,ûÑ,wÐX³¬ôÙNubSÏ@§‹µ´ba Õ΅®»·³?¼úê§IiåV_‹T†ßÅúõÙÙÝÝZ´I“uŽ’âl½^ží֙…pÀ{㫬Êw«,o +1x¸*û¨]€ýÿµb5m +endstream +endobj +8336 0 obj << +/Type /Page +/Contents 8337 0 R +/Resources 8335 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8138 0 R +/Annots [ 8276 0 R 8297 0 R 8298 0 R 8299 0 R 8300 0 R 8301 0 R 8302 0 R 8303 0 R 8304 0 R 8305 0 R 8306 0 R 8307 0 R 8308 0 R 8309 0 R 8310 0 R 8311 0 R 8312 0 R 8313 0 R 8314 0 R 8315 0 R 8316 0 R 8317 0 R 8318 0 R 8319 0 R 8320 0 R 8321 0 R 8322 0 R 8323 0 R 8324 0 R 8325 0 R 8326 0 R 8327 0 R 8328 0 R 8334 0 R ] +>> endobj +8276 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 720.286 161.677 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_41d30675a3c28980af0f087b06a1f4c1) >> +>> endobj +8297 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 634.916 205.752 645.446] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_ffd7d0678df82882b006ea7b02771f98) >> +>> endobj +8298 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.089 634.916 276.595 645.446] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +8299 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 600.046 236.745 610.577] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_c6434b8a020aeda5828830fd4b639277) >> +>> endobj +8300 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [264.082 600.046 307.588 610.577] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +8301 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 564.803 212.377 575.707] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_d3a8f10409a9fd73afb6691686d6862c) >> +>> endobj +8302 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [239.714 564.803 289.846 575.707] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +8303 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 529.934 243.37 540.838] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_201ee4c814267695f31b30be833917bf) >> +>> endobj +8304 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.708 529.934 320.839 540.838] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +8305 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 495.065 216.252 505.969] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_1d52cb88936eb0f5bde559b39f8ec42c) >> +>> endobj +8306 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.59 495.065 328.042 505.969] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +8307 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 460.196 247.246 471.1] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_faf0bc4f0e0a036dbc3852b3e4490243) >> +>> endobj +8308 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.583 460.196 359.035 471.1] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +8309 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 425.327 254.827 436.23] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_ea7119974f9313e4c93908a2955c4186) >> +>> endobj +8310 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [258.643 425.327 343.096 436.23] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +8311 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 390.457 209.627 401.361] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_0c2c96efcf10102068f754c608a12427) >> +>> endobj +8312 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.964 390.457 314.791 401.361] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +8313 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 355.588 240.62 366.492] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_3a031a8e65176b8bd80d2857bd9a68b6) >> +>> endobj +8314 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.957 355.588 345.785 366.492] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +8315 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 320.719 248.202 331.623] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_afc9294d3fb5f2c0fd8d4e4d22c283b6) >> +>> endobj +8316 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.018 320.719 329.845 331.623] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +8317 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 286.223 193.577 296.753] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_7ea45b608af772cd69e2c23d7d62a3cf) >> +>> endobj +8318 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.393 286.223 232.581 296.753] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +8319 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.059 273.221 248.845 283.127] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +8320 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 240.395 193.577 250.925] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_3ad1db1c5141d2815c0d849d12548e4c) >> +>> endobj +8321 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [220.915 240.395 277.691 250.925] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +8322 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.892 227.393 252.677 237.298] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +8323 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 194.193 223.465 205.097] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_676b331ee61606b74be4cd1f90756839) >> +>> endobj +8324 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [250.802 194.193 362.223 205.097] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +8325 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 159.324 229.552 170.228] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_0ea21bf85aa2e90c449435cfedcef181) >> +>> endobj +8326 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.89 159.324 368.311 170.228] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +8327 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 124.455 266.673 135.359] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_db0fa15c5f30fc4be6a94ce2606208ef) >> +>> endobj +8328 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.01 124.455 405.431 135.359] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +8334 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8338 0 obj << +/D [8336 0 R /XYZ 90 757.935 null] +>> endobj +8339 0 obj << +/D [8336 0 R /XYZ 90 733.028 null] +>> endobj +8335 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8406 0 obj << +/Length 2792 +/Filter /FlateDecode +>> +stream +xÚí[[oÛÈ~÷¯ ö!¥€Õx[ Ýl +l³Ešxû’,Z¢m¢’¨•d;î¯ïΐ")Þd›uÛ[$‡sΜ™ù¾sáàà6ÀÁ_/þruqùV²À #© ®nƒ%Âöj| + ALO¦c¾ŸFÛU4{?¡8L—OwñbÍÞ%×Ûhûôúµo°O¢åòiö!^ÜÏãÅìývBt˜ÂÅ~òËՏ—o ) ¤ +¤êdòþèšTt"QfòoÈ·“)8|Cý Ýr†Œù;jéµûý2Úí\oWCÃxµYFûؾLSHHLÁFxÃ|ˆoâl`ñzîÚq¬†Ç¾KF•½}ñÃÕůîâ€dæå +Q-‚ùêâÓ/8XÀýŒ˜ÑÁcÖjpÊàÿ2øxñ ì§ +—§Làò@ˆBÞP,)…“þ™R‘‰Ïß >MÌáC6sÉÂ?³:mo½r²VÖ‹äfBE#´£›m’Ûu½;Ûð3xž®wûîþ`aˆ¦…Q,Šz¿¯ž gRy’ÿ¿|«h aô’gë‡"É Ì E†k7ø?gúúùܧnò)½Å4ÒÅL}Ƙù"Jm8’XçmöwÉε©JgHI’7ŠÖNd´Ùl'\„é—dí“ÔßNo¼Fw±û±‹÷S¸H·¦ÂxŸÌ'…õaaÙõeïÛõ•¿<¢ ÒD‹:q,‹†~ˆ@Òmžz€ùsÔ8‡‰¬,ã)£ª‚)ü7„Ÿ»Ž3a”-c° ]Ç3˜‹Ûø¨/îqk?á?'„X¼It½<~„0²2{ÁÈ6ªƒ‘íûe‚Um^A”°qÜÃÔ 0²ÊTÁˆ‚±ýFëÄ$ûf£K 1R”Œ> [™õܲ· ܲ¸ÒÎw ni$JȚÖ$7àËÿã–Ç­ó#ÍÃÛxo£eòoð×û½)ˆkÎ0+°`íªØ2s®gŸV×é²I—m¼Ü=­l˜íûâÞ„ @VGE»”úPñë‚&-৐Q#ÅDŒ˜2øeB«X·ZЋ‹,ŠI¢Ñc²¿sŠx,Ø;52l±féÄihàt_Û¸Öh¶)\5/„¸Z™3­*ϕ°*”|˜æhq”€)Q.ȧHÀ iì‘ {ÛéJðE9$<´B¢Hxé{ä¥Á)„@¬VA¸jʂK! ¤Ñæ(o¡Ì!oÑ´H]d©ŠŠÌC_),†à! œQ†0÷j~ëá^aÄ ¯Âý㝚ŒëAH§b˜ŠDæ=“]-f¯L¬£?ÙoØÕ颓R¥ˆ˜ÂwÕ P¤(“¸À»Ø«-wiw¾¥y¡Š£…ZOBCdçD +"6gÆr¥¤íÔæFKÉÎa!+s ))úXÈvV°’²…l{ÏB­Îs»Ÿž¥Î^#qÀ¼æÜ`žÒc0¸E•Ô@&³Ñdž'º™—$CB›±µq´dթВÕÂÒRf›.Z² w»}PÝí¶ÏÁ´¤ÂZÅK)ÍòҔ ˆ_´¦øFuQrà2àš *øY̔w¥ì­çòҔÙEA¡pÕÏ@ÀhZÓ21¿²U +b0­9Ù§ً +WOö3ET™ƒ¶SÉ聈lïÝDÄږ&;ZšåQ9؛‚#ƒˆ¬ÑûX$åk#¥w¸91LbÃ*'¶ãþԌ…üåÝ®ƒ¦˜â}4e{)hʶïT­“zǫ̃i{·'ˆqðؘÁÁ„Ž<èj'Zb„i bd ãGSÃÇ0Žç1 h‘Å0Ö*1 4lq õ‘khNˆa*å%XŒMDxI0 8¶•(ªbâu(nïšì«‡‰ì7$I'Bæ“àuÔ²H_7X`§C5#øåÄ Dƒ³lÑE@J²1rfÔج–y^Òì4æ‘`R2Z `+¾ÄÓ$ØÎ*o³÷ *K³N¼näjè Uïÿ!îa\´”0BŽTÅNhśqÞ¤Œ¨Ž©) µ¤8«¸ÿA +ç +²­kIÑñ +%e†P;ú8˜“jƙ\çU²ó¾’r ˜L’ë$¡)œs œô7f#b!€—g¤•‹È¹ddgß𐠪ÔgVpŠ¾þe~>Š”‹lš¬âì™Íî%¹À¼Õ­·†ŝfÕ/½3¡Êî—ÙW=¶À¶’±ÚÜïÝg‰V·î|D6 S7 Gf‚÷¯ãýc¯›Nb(›)pa¢ÿ›Bz¨öŸÄgÀ}›÷1öëI1d¦˜°ÍÏÉXï_òŽ¹iÒMºLo“y´œÍ—éî~Û·yN^怄y˜ñµNã4) 7sìÝM7n—ƒ]ڜhanV5X1# à.ì·¯‚a)rô~mÅÇ~óÐòÙ?pŒ¥ `T1 +f`¿ùîï?¿{7tñL©âÀÊô÷q0­–àô Y:’VÉrBô›|2¿ñYÏô£ˆQöÏ¡f°r>tʨfÐ&¤¨÷™~ŠW×ÙWð`Œ·þã÷"‹y«þ=ùé"¹yªÙô Ìz×~*bHØkà‘§^ÎÇM4¯¢oýL©u}ˆz¤4?B*Áw#¹S¿Â€wêù*WÅo@ˆVÜe~äwâkKÙ¹_wñó.Þþa"D¸Ëm°¾ÏñÉn÷ÛU¼=Œü9p¡‡dùoKLnndÿ +ò_»È¦ÿ ¯­2\ìß»ý~óúòòññÍwè~l¶(Ù_n6ËËZìQ5ñp2ê&7÷*Ýúá'k¸éNp¢ºýÿJò +endstream +endobj +8405 0 obj << +/Type /Page +/Contents 8406 0 R +/Resources 8404 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8138 0 R +/Annots [ 8329 0 R 8330 0 R 8331 0 R 8332 0 R 8333 0 R 8355 0 R 8356 0 R 8357 0 R 8358 0 R 8359 0 R 8360 0 R 8361 0 R 8362 0 R 8363 0 R 8364 0 R 8365 0 R 8366 0 R 8367 0 R 8368 0 R 8369 0 R 8408 0 R 8370 0 R 8371 0 R 8409 0 R 8372 0 R 8373 0 R 8374 0 R 8375 0 R 8376 0 R 8377 0 R 8378 0 R 8379 0 R 8380 0 R 8381 0 R 8382 0 R 8383 0 R 8384 0 R 8385 0 R 8386 0 R 8387 0 R 8410 0 R 8388 0 R 8389 0 R 8390 0 R 8391 0 R 8392 0 R 8411 0 R 8393 0 R 8394 0 R 8395 0 R 8396 0 R 8397 0 R 8398 0 R 8399 0 R 8400 0 R 8403 0 R ] +>> endobj +8329 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 719.912 217.109 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_15b21e990e26976e615a7d3244ed843e) >> +>> endobj +8330 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [244.446 719.912 355.867 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +8331 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.984 685.05 201.742 695.954] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_8b2ee24610cb804238f33581093948c1) >> +>> endobj +8332 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.442 685.05 243.629 695.954] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +8333 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.079 685.05 371.329 695.954] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8355 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [224.458 660.47 271.379 670.375] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >> +>> endobj +8356 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.288 627.274 212.768 638.178] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_7999968db9fb568980215d2c84393358) >> +>> endobj +8357 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.771 627.274 252.959 638.178] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +8358 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [297.896 627.274 375.145 638.178] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8359 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [220.401 602.694 277.928 612.599] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >> +>> endobj +8360 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.443 569.497 250.099 580.401] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_bb5709426ac80aa0bcf907b4f1d4a577) >> +>> endobj +8361 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.258 569.497 289.446 580.401] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +8362 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [307.772 569.497 379.512 580.401] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +8363 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [436.747 569.497 513.996 580.401] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8364 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [344.304 543.708 439.335 555.874] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +8365 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [363.591 533.959 459.505 543.864] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Generalized_Image) >> +>> endobj +8366 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.207 511.721 266.586 522.625] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_c7b41dba5d22086cb9715c3f51248f98) >> +>> endobj +8367 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.509 511.721 309.697 522.625] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +8368 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [336.494 511.721 408.234 522.625] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +8369 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.703 511.721 513.996 522.625] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8408 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 499.766 171.361 510.67] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8370 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [381.237 487.141 480.87 498.097] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +8371 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [427.125 474.973 513.996 486.554] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Generalized_Image) >> +>> endobj +8409 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.268 465.483 155.212 475.129] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Generalized_Image) >> +>> endobj +8372 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.091 442.986 250.748 453.89] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_97cc0d02a88d52e79cbb6615a3bbab42) >> +>> endobj +8373 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [280.068 442.986 357.317 453.89] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8374 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [384.405 442.986 456.145 453.89] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +8375 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 431.031 202.344 441.935] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8376 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [350.005 418.406 446.071 429.362] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +8377 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [342.547 407.447 438.461 417.352] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Generalized_Image) >> +>> endobj +8378 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.017 385.209 265.396 396.113] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_2c47f2f619b1d0f322b742891920735f) >> +>> endobj +8379 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [298.568 385.209 375.818 396.113] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8380 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [407.239 385.209 478.979 396.113] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +8381 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.616 373.254 225.866 384.158] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8382 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.222 360.63 466.67 371.586] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +8383 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [366.37 349.671 462.285 359.576] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Generalized_Image) >> +>> endobj +8384 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.933 327.433 239.984 338.337] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_e274e65fc3f012ab21bcffa3177228c5) >> +>> endobj +8385 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [245.633 327.433 280.82 338.337] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +8386 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.855 327.433 405.104 338.337] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8387 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.703 327.433 513.996 338.337] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8410 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 315.478 171.361 326.382] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8388 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [347.257 301.644 432.092 314.802] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +8389 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.436 268.454 251.209 279.358] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_732e7355673aa63a2fc22a470a36f707) >> +>> endobj +8390 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.361 268.454 290.549 279.358] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +8391 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.719 268.454 409.969 279.358] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8392 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.703 268.454 513.996 279.358] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8411 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 256.499 171.361 267.403] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8393 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.114 242.665 456.992 255.823] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +8394 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 209.475 224.57 220.379] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_77a2a8e38120a21ac0d5f19eb6e1668b) >> +>> endobj +8395 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.908 209.475 363.329 220.379] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +8396 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [301.27 196.85 344.597 206.755] +/Subtype /Link +/A << /S /GoTo /D (main_Time_Elapse_Operator) >> +>> endobj +8397 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [463.2 196.85 506.527 206.755] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Time_Elapse) >> +>> endobj +8398 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 174.613 255.564 185.516] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_940db627ef73d29e63fed31acc7553f7) >> +>> endobj +8399 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 137.765 214.06 148.669] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_99247c74022e8d51cd0a2d93a87bcfe5) >> +>> endobj +8400 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.398 137.765 352.819 148.669] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +8403 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8407 0 obj << +/D [8405 0 R /XYZ 90 757.935 null] +>> endobj +8412 0 obj << +/D [8405 0 R /XYZ 90 191.71 null] +>> endobj +8404 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R /F97 2175 0 R /F38 342 0 R /F98 2120 0 R /F34 2406 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8458 0 obj << +/Length 2130 +/Filter /FlateDecode +>> +stream +xÚíZ[oãÆ~÷¯ ò°‘€Õx†äcQ ݍƒ¤ àÚnó°49²˜ðV’²ªþúž¹ð*J–lyӇ>욗™3çò+…G?\üõþâòÚ± †˜c:ÆýÒ`Øp aqŸg„ ˛/Æxv3'x”iàßÌM<˓íŠGeàÿ?”A¹½ºÒ ê8H’­Ë£uÈ#ÿ¦œo–ÃM=ÿíþ§ËkBzš.œÆl`Gž÷A-ðD02-Ö¬øDÞÏ&ųO¦¾¸ k[ˆ1ÚìùËªí±“ ªµû93g<-’ æb›±°,QÇ3  Fµbnù’KÁxªu6ö†×š¤ezâñÅ÷÷ÿº ðDª×v‘éQ#L/>ÿ†žÿd`d1ÏØÈU©a›üMŒ»‹¿_`m*Ü7Å}Aˆ‹ØᚠI‡ªÓ¿˜&•Ç7ûŒÏ +6|’–‹#ýNðT>jænå*¡ƒ ŠüªBîGqʳ*γʲÈçéÆtŎ/˜â½4g-¿Þ|j +ÈàEó÷òÚ5 ¤ul‰96[˜` ¢„ý.Š*maÚ_Šq[§jŀ˜PœÙ,ÈøœÐÙF¡@J¯.;¨{ЃºÊÐë•^æi‘g<«õ‹|©Îe¬w.a6"„4'ÁؚàßFöš5õ*®&$›»NK(ÎFÜ dzâa—}ùàšTz§üÔ¦ j'.\€+ïM±V”ùï\Ōÿ£ ^ä\?ÊòºÀgð÷搠ÙÖYæYÁ7ƒ>„åø1ۇXYՇ‰Ý‰&rR›Ætßm_SƒCò+tï±YÃ_Ö耣›¥H’UÝ< ¸œ[îŒW錱YÅA¬H2!×´UĦŠë 8ç("2YÝ"Íù7Q›ß¨‡ÀÊëä“éÕÄQ ÈȌj aL§¥¦6'ô¡Ý磨×iF¸Ü.B‘kµk¶T(êÞËÒĝÕÁsB F·ŽvFªØPrIíD¢”€uh¾°Lgvǹz$U~Þtö±3Kö¨6Ý̽¶8“àßE9mdÜGØ–†"ؒ.® Ŕ ?”± +‡½NM*ڏÎAJžæBô'ñßI/¯'ÿ”v +Ê8xHxåßñéRçþ÷‡lD¯‰+·’”ØM^H’Q`¯ +Æ›œ0N%ËrnâÒѾs”} ºo`ÁUü¸âåц|Mmùфü؝r6³YÌUZJ"uÝ7”¸qu°¸1‘¸Öµ‚¼Ì›uA=Ú¡ƒî:Qqa´q ôX̙­‚'>bb"öá¡Ïg¼§ž‰@è4ºPx”˜‰¨Ëž r“‹˜‹‰Øä!ÛéòZ¯w»¼¶hoé"Ûf£Vs@ÉAÔk³¨@H¤ÚMz…„½Îº•}p†—5žC Cï©úIÝ°çiPœÍöó®"U±„ûc!N 8p­a9 Šq4=²R8tTT Cu:ꈯk¦PâéH׳ÏÿR^’¡õ߅ènFV<=’ 2ÑÔö'Ljùª‘ƒl½qÃôQ#ðÉɾ‰AíõlßÔ¶¸a^Ä|ª¦ú¨¦-*›:ŠÏ>¸&*=hr]Ú²ô:ÜeŠ8ˆtC©e{2˜žYË<‰þ´:GΣ÷'P<€×פÛkȵPá$;S™ v<•ðfPÌ·æí‹9•ïä2Ö a¦Q€aÖ󠲏ÃT§•ÁT° 1…å!jëaå/qò$ 2ž¯µØ¿ˆáÀMJ¨v“loÌh!›>SâíÿòÚì³7ÈÔ_°…'ò£‹Ü.IŸÜ¾ | !Ù2 C[ck/üÄ«º\Ëܤ²% 1$³ÏáÖÕFŽÔ‹ÓÓÃט{ôôv·EÀn‹nRtÔXÂ=iι‰ë•‚n¡zšîã2|¦ulÏ.ºoÒéu$‰‡pÇåÙ$Ù;kp9Ä÷`–:Ë=ŒcÜ"ÎÄ$šxtE_'Œ|ª‰ç!Ç9'ªƒ*Œc?Z§ÅAn†UýRTþZÆuS,LeËF^k°ªŽ®®B^NEfŠ…Z£)’ßÝ}üñGu©Š‹B×<«ƒ®Æžœ]1…”OQó…uˆ% +÷ëšVj9‡(Ë=‰xW½ÖÜî‹Ìý\©ùUÍìafòÂz“x ¹bpw>;%”9oì½7âŒÉ¤m¨cŸýëÙ$d2Ééb]é©é¸Ù!Èq[oÍ ^¢ÔP"z}î-„»ÌôáÃT±h#Ë¢/ô|،ّAý!ϓc¼>Ƀè ×Ç^ÿBlü g§Û¦Ù5'0àÈAˇg}$ ‡µÃ‹Ë}/Þ ¹ÍDW‡ˆé«xò°Ý¯3ñ¾‹”ƒ¨¨Zåôò!±PøМÌÆÞ6ëVÈo„â¢â“þ² P…y£ÁýÙÜf0³I¶sJ›Jê–×ë2›jú]·¯w¨¸ùó߶u³_­ÃWÕr¼ŸbÊ4§õ×eT“”ÁìvK9‡6±ÜÄՋ߂’õŒMb@xVÊÓ¼ÜúUü¾;zÙëmu^‰¯÷ƙÿ°Õ“•7ŒÅ)‡mµäD›d~qVlMjóúe®‹¸ùhñ° +øØéOnÿ¤j ¼È$î×µµšÖ¼ÌÎcòñ¯‘ON Žü1Róã#1ñ-Tý^Œ2D©VÇýj8-O}ÛüXLÝê_Œ©›T¼üVDf2dëUBõ ¨ìfy‰ßn©FFÆñ½T ©$ûÃh®þv!1ÒñK<Y¸EÀª®‹«ËËÍfƒÂ +­³¸(Q\_Er¹; éQôÙ¥ñe3Èë´>S™+ÐXÿÿÁ*«R +endstream +endobj +8457 0 obj << +/Type /Page +/Contents 8458 0 R +/Resources 8456 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8469 0 R +/Annots [ 8401 0 R 8402 0 R 8424 0 R 8425 0 R 8426 0 R 8427 0 R 8428 0 R 8429 0 R 8460 0 R 8430 0 R 8431 0 R 8432 0 R 8433 0 R 8434 0 R 8435 0 R 8436 0 R 8437 0 R 8438 0 R 8439 0 R 8440 0 R 8441 0 R 8442 0 R 8443 0 R 8444 0 R 8445 0 R 8446 0 R 8447 0 R 8448 0 R 8449 0 R 8450 0 R 8451 0 R 8452 0 R 8453 0 R 8455 0 R ] +>> endobj +8401 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 719.912 289.866 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_2f90e70dbef264e99b7015c0ce7e16fd) >> +>> endobj +8402 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [293.681 719.912 359.324 730.816] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +8424 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 685.043 290.971 695.947] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_19a2fb28254bc142e01f3ee00c27ea89) >> +>> endobj +8425 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.787 685.043 360.43 695.947] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +8426 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 650.174 224.003 661.078] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_c5ec610fb42e16beaac59b537a71f187) >> +>> endobj +8427 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.34 650.174 362.761 661.078] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +8428 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [349.582 626.587 443.167 636.492] +/Subtype /Link +/A << /S /GoTo /D (main_Concatenating_Polyhedra) >> +>> endobj +8429 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [459.201 626.587 513.996 636.492] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Concatenate) >> +>> endobj +8460 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.268 617.354 161.686 625.533] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Concatenate) >> +>> endobj +8430 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 593.387 254.15 604.291] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_4c7c04e76c758c53feeb8c5cf58638a6) >> +>> endobj +8431 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.487 593.387 338.263 604.291] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +8432 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 558.517 284.585 569.421] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_dfe66b5a34b84fcf63d1a48777f68e4d) >> +>> endobj +8433 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.401 558.517 354.044 569.421] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +8434 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 500.734 241.726 511.638] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_1ae424886d05361c1a78c89dbdd5b7db) >> +>> endobj +8435 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [349.617 488.106 407.658 498.011] +/Subtype /Link +/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >> +>> endobj +8436 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 465.865 249.318 476.769] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_7a1f9b31c3ed7dc3e7691b9110ddbedb) >> +>> endobj +8437 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.134 465.865 288.321 476.769] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +8438 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [305.875 465.865 371.519 476.769] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +8439 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 430.996 240.62 441.9] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_966dadd4ba398fb77b77584e5af698af) >> +>> endobj +8440 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.958 430.996 324.734 441.9] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +8441 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [390.537 430.996 425.724 441.9] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +8442 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 357.581 244.265 368.484] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_cbcc65a843515d547f055b687d1e6d5f) >> +>> endobj +8443 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 320.719 167.466 331.623] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_9bd884fea397d9d6cde6426e6f47cc4e) >> +>> endobj +8444 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.281 320.719 282.702 331.623] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +8445 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 283.857 193.029 294.761] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_57fc3d9d838fd7e20e80806307452a91) >> +>> endobj +8446 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 246.995 193.029 257.899] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_9a864135634ed49de1aeae3b38ed933a) >> +>> endobj +8447 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 210.133 165.911 221.037] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_885e896b320d1f4285b5dc92a20f8884) >> +>> endobj +8448 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 173.645 187.689 184.176] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_804363984fe210abe47624522dfb7a92) >> +>> endobj +8449 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.557 159.647 476.544 169.552] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_9a864135634ed49de1aeae3b38ed933a) >> +>> endobj +8450 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 125.451 202.902 136.355] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +8451 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.4 125.451 300.037 136.355] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_dea57326388915780370a677453778b3) >> +>> endobj +8452 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 88.589 202.902 99.493] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +8453 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.4 88.589 314.263 99.493] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_8eb19423295d8af4d69f144fc227128f) >> +>> endobj +8455 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8459 0 obj << +/D [8457 0 R /XYZ 90 757.935 null] +>> endobj +8461 0 obj << +/D [8457 0 R /XYZ 90 374.562 null] +>> endobj +8462 0 obj << +/D [8457 0 R /XYZ 90 337.82 null] +>> endobj +8463 0 obj << +/D [8457 0 R /XYZ 90 300.958 null] +>> endobj +8464 0 obj << +/D [8457 0 R /XYZ 90 264.096 null] +>> endobj +8465 0 obj << +/D [8457 0 R /XYZ 90 227.234 null] +>> endobj +8466 0 obj << +/D [8457 0 R /XYZ 90 190.372 null] +>> endobj +8467 0 obj << +/D [8457 0 R /XYZ 90 142.552 null] +>> endobj +8468 0 obj << +/D [8457 0 R /XYZ 90 105.69 null] +>> endobj +8456 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R /F35 2018 0 R /F23 340 0 R /F98 2120 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8494 0 obj << +/Length 1325 +/Filter /FlateDecode +>> +stream +xÚÅXIoã6¾ûWè4µ€šæ"jt +´“¦À´¸‰{Ê Ybb¡Z<=ŽûëKŠ¤l+ò’ÀI¶(éñ-ßÛ¨:¿~Æ×>q"ùØw¦÷NÀ'ª»Ô¹"H莄p8qƼˆgÃa•o,åñìÏlÎc¾yÿÞˆ,ÎóÍ솥«„¥³ wQ8¬äp¿N?¯Úˆ)-ò¤:¼Ÿ4ɞNL"Kq…~tG˜Âá6‹›¶QD힟pmÅ~ÌãºÖܦn„‡¬Xæ±`j›3"$ԝ‘#¢˜vÏÃX™h:†Ê׆%Á‘z<øm:ø6@ò)tP¯R')w_¡“ÊçŸH:놪p> endobj +8454 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [155.819 699.062 199.864 709.592] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_f191b9781c37da15b49810d47a838823) >> +>> endobj +8478 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 622.369 203.075 633.273] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +8479 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.573 622.369 296.324 633.273] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_4a53183970490595ac39c8c070601c6f) >> +>> endobj +8480 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.944 544.057 200.017 554.961] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_343e039e48425126b187827066d12bf2) >> +>> endobj +8481 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.944 506.893 200.017 517.797] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_4ac4e4131c756f0ffce85b9dec7d2b3a) >> +>> endobj +8482 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 428.581 211.703 439.485] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_b3b8f7e6fdd123f510ba85f4527bdee3) >> +>> endobj +8483 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 391.417 203.414 402.321] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_269f357fca785afae3774b1e084d9b93) >> +>> endobj +8484 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 354.627 179.265 365.157] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_21a9e355a53ec45a5a60213fa8c24f2e) >> +>> endobj +8485 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.575 277.999 140.53 286.845] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_43ab45399b7e22ffcd6403b7e59a473c) >> +>> endobj +8486 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.575 240.835 140.53 249.681] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_2d12805af932544a4fc1575f8db62a3d) >> +>> endobj +8487 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 203.67 167.639 212.517] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_a2a8683afd33a1d57db43c9db16de1f5) >> +>> endobj +8488 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.839 123.301 181.264 134.205] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_de7792cb469ddf1d5d8944bbe7f1f55a) >> +>> endobj +8489 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.05 123.301 321.471 134.205] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +8490 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [430.251 123.301 513.996 134.205] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +8510 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 111.346 146.896 122.25] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +8491 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8495 0 obj << +/D [8493 0 R /XYZ 90 757.935 null] +>> endobj +8496 0 obj << +/D [8493 0 R /XYZ 90 640.498 null] +>> endobj +8497 0 obj << +/D [8493 0 R /XYZ 90 640.498 null] +>> endobj +8498 0 obj << +/D [8493 0 R /XYZ 90 560.283 null] +>> endobj +8499 0 obj << +/D [8493 0 R /XYZ 90 560.283 null] +>> endobj +8500 0 obj << +/D [8493 0 R /XYZ 90 525.141 null] +>> endobj +8501 0 obj << +/D [8493 0 R /XYZ 90 446.71 null] +>> endobj +8502 0 obj << +/D [8493 0 R /XYZ 90 446.71 null] +>> endobj +8503 0 obj << +/D [8493 0 R /XYZ 90 409.666 null] +>> endobj +8504 0 obj << +/D [8493 0 R /XYZ 90 372.501 null] +>> endobj +8505 0 obj << +/D [8493 0 R /XYZ 90 294.07 null] +>> endobj +8506 0 obj << +/D [8493 0 R /XYZ 90 294.07 null] +>> endobj +8507 0 obj << +/D [8493 0 R /XYZ 90 257.025 null] +>> endobj +8508 0 obj << +/D [8493 0 R /XYZ 90 219.861 null] +>> endobj +8509 0 obj << +/D [8493 0 R /XYZ 90 141.43 null] +>> endobj +8492 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R /F50 339 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8529 0 obj << +/Length 3171 +/Filter /FlateDecode +>> +stream +xÚíZ[sÛÆ~ׯ`^\rF\aï %éLcÕNÓÖqmuúàd< YhH€ÀÈʯïÙ XpAQvÒ§<᲋³çúsv‘Ì>̒Ù˳o®Ï.^:KQ*ˆ˜]ßÎÒd&E‰~ZÏÞÍ1FT-–8I’ùëNæY½ÍÞ¿^d^mîòu½ÿGqSgõÃ奛ÐÙfóðþM¾Þ¯òõû×õ«yíâÇëï.^` †õ¡òÅ×!&ÙQíó8¶žö鎝@ +zı1xPèØT(ëØTȸc $é1m¢Þ¶Ï>:¢Ÿ,êÒ&A" dÔQ´œ šÀgô¨†‰øäìΘ8ª…!Ñg§ÆôR%HeÔ²K¬í¾î2)dÛ~:‡©G™¶Þ»` hBK»IÅ­K©¥ËÔU¹y°wÝ$^{³ª¶»ªÌË֕&Õm„Œ!µb¯Œ ˆg@/¡Â‘Hýœ‡ ">L³z ?. +vYQß]ѐÿ¼Ï6OÅ<‚¤RôÈ çAÏå—_Lá]¬%c>oîM!¾ÞNêö&¿î @—øÑòÞãÃϟ††R—¸eyÅGYžtYOfùDÅMU ÑpZs°Z/¿ƒ=ÀEp/5‚½ãºy’b0T!„°ß åcÙä  _Ë°îy»ËW zñkƒI¦à¹1…fsoÝsDA0cÏš`(hƒ–˜¤·€ÙLw’tз"ì:׫¼ÍŠM×]åͪ.vºe1FõC!„„ÉL¢Dâc½ª„ô¡!„&Âåw’¯¥Ëö£×"jU,¡„|¤«•©WàʶµšÞ›÷.ëS‚0Deàþ§5öÀ+þ?õõ#à„¬Ìˆ +zÝåÔ]'¢}¬­,n̅k—l-š0­\Ö¾)sÝî(¬C¯Ôe°}/`xøÏBhŒÐHQå‡Ë£ý™BŠÇ%ôi^ïÎ!À&4æe«qQ[-è×Í~·«j³  ¨÷²dµÛðŽÎo¡1ƒþ#/^WÛ¬(݀‹‚>ž`žr”°VÇðÌ/H¬è„佋@ Cû²#ø§ó¦6»}Æá»Q‰º« +¨ŸrPN; ›Ë‰,0âJ^•øh~îs¢Å)Óé¼M=HœŸ¶Cœø4õêÕ©k) +u„øœµ^Ö¾šˆ®•X +¡æ]áûU›}¨Êlóþí]¶‹A¨J‘Æú,ð„zT¸Žà&ÿ€€ÂÏ^ß\ùd¯ kÈQÉ5%d¥Ôg ¢D$íËÈoªÑ¤RJ~>ì­u5ˆÐ(¡|QÂ]¨œ›ÿæhi’ ÕïLLë6kò™B`)ï:¯U[c@¡ÈNw:“ŠDâR‘¾‰¥"}]ª©±õàU縛‘¼º$¤%=VçK‚EÂB—4⚂ ZûAÚÒF›b¶Ì ‚úɁ` …DËãÀÎgø`×­9ì™û»\C»aüÎÝ@²Ú†2e¥ÎöÁdnSÙǢqÂå?$ )u¤<ß<ôTmE…C $‰-ÓwO8 ÀCäy‘*€& Ó”k êÚm¿Õ¹º‰–˜6‡uªs52´¦©¤Ê¶»:š–±Ô‹YI ¨s¼Â¸¦r~Êbä”ÅÌqÁƒÚ ºÚÉ>uNÉü¾hïìëUU®ê¼-~͜9à?_¸ŒÁ0£$¸ßÉÆüP Ž0êL¶ã2#¶œ€NF}ŠuHØ%,õ…Û$ÀaëÚïôu” ֒P`óàvn\F¡Y;Ýr0ëW8U$®Fñ[¨1­t Fñ˜— 4¡£ÝãOÖ'Gútn¨Ïó®“h  n‹áó_4NåæPðwéÀÊ¡6%‚M‰ ƒ¦DMg5p}Ü·ƒW‡¶‰9ó>ôuŒô‹B|¶C “™“4ǗKú®à)†ŒÀ̖ß`’¶¶¿ÑJó™Â«ÓÁ ŒM–Ѝ$ädt?·Ôî²Æ®’9ê!€E +`9Ü3îMêTý.H<~0ÇO`ÐòðÒW/ÇÃAL‡D—4¸¹Ô ]âA:?÷»ÚэÕ¯¾>ԀΙ¤w\("•ßº<(îí[”u¶ÌƁ ‡; ˆü%tŒàRzÐÁ`ú ¸h·Áv9ú”/ 脧ºˆõ§HÆÔºá|hqGâHb2<åÙ)Ɏ˜Âª/Ha¬ñu¼×ÐâósñØO`ý$Ë?²VÜPƒ”õ¦,ÛHñß"‡ÆœçSåŸá©Ó‹]Æ°€pÞ,Ìñ Mƒ7ÿç‚ÝŒ‚¼íªD”ìú±­ìø¶Çað2ì~Ó:b·öšív›‡¢ü`g´ÝZ«ªÖù¸*×nìpy“ô!V¶ºÒ ¨lwÕ²Û#F[w(§RŸu®ù¥XàýÞ¹ýDx(Ì|5Ï6už­ìË>Ó+Û«ßfZݝ&¤ëõñdñ¡ <ì÷µŸ¼·qp´vâæ†ßöÂ|¢@~Ò>P¸£ßm'›* m¯‹:ï¶Úƒ}÷ÌÍz¸&PNŸÜéñwϟËôÇщ§/¾"æ(uP|[éJý¨³Ž-–8ŒÑ,0l!b8ȳî¿8¦¹kózuŸa>µÇûö“›ÂJÁ´P»¼QÇsÝ?Zè•țÙC¢bLq ïsýð1Óßç1p²%6ô]â +cx•ow-°c~v”ºñÞlì€^·î¦o³ŸtãîÈ4ûº#h)-o G¬3C'ûÆ¢¯Lzž†˜Ó,Ñ!’Âh֒¨£Žà†÷5“ý­‚Í‹Ö]{u¿-ð"Ã۟Jë¥}4É®&ÁÕÉèÊ Îºÿ8º`7wVí@¹[:/`´¶÷އBn´a¾Ô÷:í›sO!ì‚#"èqÀå}Iì"ÉË݅=AD‘é0¡sp{Ÿçî¡0n7AÀóχ’‰),u¯'5¾vôé_ôEèKW›¿>¤I Ád8¨Vc¥\Úw`‘Š(E2¡‡U3WC=C± 8”Â];LñԜױ>pXszaF›o¼ÿ; è,b/dá¾YmJgR°b7s¡ƒ±l¼éí–ì¡)À‡ÀoƧ$/ãـ÷YCÀ”´ƒ:7›ÒD2[|Á‹r¯,öÓÌÏÈpg‘n4Òj”øPgûå[sp؄´¨½Üß›è ×e éÿ@„‚] Óø—p¨ŸR¬Ný#Üü ·:à)蚍κýß,î±;ô·îäß>ü»Éë?-p\öýgVá^G€ÝѪ¿G®ÿÚEDû$²GoóÜ i%ûiÖÝýÝ@öüb%íÕz׶»Ë‹‹ûû{´jо,v5*Ú ¨ì/O&TúC›áôŸéU÷³zQê#Só£±þÿÝðì6 +endstream +endobj +8528 0 obj << +/Type /Page +/Contents 8529 0 R +/Resources 8527 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8469 0 R +/Annots [ 8513 0 R 8514 0 R 8515 0 R 8516 0 R 8517 0 R 8532 0 R 8518 0 R 8519 0 R 8520 0 R 8533 0 R 8521 0 R 8522 0 R 8523 0 R 8524 0 R 8526 0 R ] +>> endobj +8513 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.064 658.284 229.749 669.188] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_3a18eff42a557fd87d59895399c7a13f) >> +>> endobj +8514 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.784 658.284 444.205 669.188] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +8515 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.053 595.655 179.177 606.559] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_7a9afaf958c6f9dd09c89bd706dc09b0) >> +>> endobj +8516 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.391 595.655 319.812 606.559] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +8517 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [430.251 595.655 513.996 606.559] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +8532 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 583.7 146.896 594.603] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +8518 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.762 533.025 158.127 543.929] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_0e39243c24d99f8d374f9c14e3da8d98) >> +>> endobj +8519 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.789 533.025 386.293 543.929] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +8520 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [478.4 533.025 513.996 543.929] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +8533 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 521.07 306.128 531.974] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +8521 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.525 345.227 253.249 356.13] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +8522 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.782 345.227 341.46 356.13] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +8523 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [343.993 345.227 369.896 356.13] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +8524 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [272.352 151.733 304.232 162.637] +/Subtype /Link +/A << /S /GoTo /D (main_CC79) >> +>> endobj +8526 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8530 0 obj << +/D [8528 0 R /XYZ 90 757.935 null] +>> endobj +8531 0 obj << +/D [8528 0 R /XYZ 90 716.221 null] +>> endobj +8534 0 obj << +/D [8528 0 R /XYZ 90 483.879 null] +>> endobj +8535 0 obj << +/D [8528 0 R /XYZ 90 421.492 null] +>> endobj +8527 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F35 2018 0 R /F72 471 0 R /F65 376 0 R /F7 505 0 R /F8 504 0 R /F23 340 0 R /F31 472 0 R /F10 473 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8544 0 obj << +/Length 1851 +/Filter /FlateDecode +>> +stream +xÚåYmoÛ6þî_!Øf3ÃQ¢²´š¦]»-Ȓ´_²ÂP,ÚÖ*Kš$'ñ¿ßñE²dË©›b†}hISÇãñä;s;o/¯G¯=æ(ð¨ç\Ϝ;¾ÇV¿"çfHbb4&ãáňàaX,ÃÉňâa–¬2*Âɯñmëãc+PÅa’¬'—2ZMe4¹(FD 3øQ>^¿;zMHkAêÃj æèõNŒHÇ&‚eA-ñŠü8SŽ‡¯¨í\ö¨u +^Ïy±Gk³ìi–¥Ñv= +èP.ó$¬¤šæŒó÷„3gÜ:æRΤޘL§FÎÅaølU2FÔðàìzð׀À(vˆv¯ë#*¸3]n>b'‚ñwF,ν–Z:.eÐ&ÎÕà÷n‡Šã­PQpžÇm¨Àþ@ Ã4R¨Üà ÕB¦õ'ó%ËeVqf‡«EXٞ,«ÒtgYa„ÁUœÊҎ—‹l•D¦_ÈjUX3û¤”h4v9þœ(ÞKõÿ݈ð!xËÅÍM›­³ Ø|[¥qkvi¼Œm즍 6tU±’¦ÏLkœ,MÖÝOfÕQ&¨H™s«Ë7*9x2Œ!@°ŽË ˜x§Lûs ÿˆÕcB¶/€«§j×ÃÚ·Yµ0½i¶Ì³T¦•ÝËÎÆPGw݂7Ž¸cÌ(ò…Eç[ÐϨ +Hb:z·ª#•7BÀ·,ÍH\©˜°;§,WKÕó6:ªVrl9ˆbù¸IU›˜]Ô"â¹nt÷h㈬–=Ï £hÜî&¼OÏÈ6´Õin—E<¬X¤G—zÛìÑÙ°GÀš\ŸúÐÞÄÖðb®ß…«M5靂vXÄá­ +Ä®µœ#ÏmöóÐc‚@î‹vÙmÀzHø~-³þ¬’¦D€Æ4•6yºï²þª¢ ²ùÔLZ•2Ò9`†-tgY’*({¬MöQàc¢ û"·qäά£LÈ”=:Ý~ª)!€mð>Ùµ’%l{Õöa0¦Q߅C £é̤‰ÙÇ£©Mò‰JÅM¤¯uº¬å€8«! +¹ُ·ê ]ÅITšß¡ˆâBN+3”æèÔ?²™÷–s£ÅÞqԱ׎k:TóÏÏO×paOw“k-=ŠÁ]*`E!K ¬Èn‹ «Ì¶‹^ªÎ³2®ZŒnüÚ: ,'Æi¥ñ5—…Èø(ëo읭`îq²Å:¾ã¨˜0©,é0äk íI©lm ÙëÅ<Þ1±whšr])ڃfVóy:ֆËÁ¸' +DœvÚh™\ÙEª§ó²ú0Œâ´”EeÏ#ü`ä¿{nZsFéî‘ièN¹ût­¿\—µë¢çN¨A}¢€j‰ 9Ù ®l‘þI‹³_˜Žff!«ÛÆG¹2¶°±hܒâµ +£h‘*«"ص<ö¢½Ë>ÿôN^ï›ütÞ¡‡òŽ×â.ñê5˜ŒìÇ6ït.Ce¸´½†wö着#•¸åwHÞY¡óEÀA©jòåŸGšn °öý"jïʖ/¾žöªü"8 ÷AîÙSÎÛÏâþ>VbÝ+âÊ>‹r‹r› êɳ~v -«´9ûÛ`|qØžÌ߇ª$‡ƒK½Â”€Òêá)¥^¿£ê·”³ËÚÓlU™¹''¦ÕñS?ÕjUèYWJ¦Q²{XsdbŸ—OZ/ͪCޛ ÌGsÿ!àþ‹É 7÷ß͊oÁûɞ<å¤8Ù;ùœ<;9O[nˌ Wø­b%¢¶\yª} ¸Éì;â{[7”ÝáWÙtµ”i֕åmêÂã=è¨EÄ*î@:…Ó6%‹¾bf§ +Q­s™ê— løŠ¨–ªwGàyTÕ)´þÈ·föU@)…8lJ½%PŽ·±v_ywܪ‚RÒ}Ó}Ué—p8¼ôK¡¢S´a1¥_æÑþÒ/Ü:±ûؾ;18ÄvØ|`²-¤”€“‰ +€QðÎŐÃïº)]-'ÍÔ²Ï"Šnbõ¼§”#ñ›q +ˆ¥ßx +ÜÃIʹLU­WNΩ@Þcr ÐƟ⦐Ä:…=ä{ô`ûޟ¿ýpvyuÖ£ ¢#hóV¯©j»nEÚB7qšÄ©´Ä/ò$žÆÕǞ§Äî”Ã;bL|äQËO/[Ð¾à³Û?eý¸Y„ +ïwÍ ¹y år«JX]ƒ7Q/âX–Ýjìvß( âÐ]Úß¼›@tntó U„P)jÖ9j~Úd4?ÞÃÓý‡çC»ñßÂt&›z^]UëR4Fê/"* ÈÔ诤´›4;ûäÔ½_Ìy¿±W½n𱨪üøèèþþMK´Jã¼@qu”çÉÑîE¦¥…¸Èo”Ìj~^fu…1Nap©yzÇÿßÃÃ× +endstream +endobj +8543 0 obj << +/Type /Page +/Contents 8544 0 R +/Resources 8542 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8469 0 R +/Annots [ 8525 0 R 8539 0 R 8540 0 R 8541 0 R ] +>> endobj +8525 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [222.372 707.957 302.073 718.861] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_1190fcf4794305386f8475f9ac51ce00) >> +>> endobj +8539 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [309.149 597.512 329.403 628.48] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +8540 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.563 597.512 422.493 628.48] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +8541 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8545 0 obj << +/D [8543 0 R /XYZ 90 757.935 null] +>> endobj +8546 0 obj << +/D [8543 0 R /XYZ 90 171.722 null] +>> endobj +8178 0 obj << +/D [8543 0 R /XYZ 90 148.481 null] +>> endobj +8547 0 obj << +/D [8543 0 R /XYZ 90 148.481 null] +>> endobj +8542 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F65 376 0 R /F31 472 0 R /F7 505 0 R /F95 1788 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8551 0 obj << +/Length 1476 +/Filter /FlateDecode +>> +stream +xÚíYÛrÛ6}×Wð©•fJ$ÜNrq§I;ãÆîSâÑÐlqÂ[I(Šþ¾ ¤Hš’ã¤I§?‘‰ÅîÁî9 +;wv~™=»š-Ïs$’‚ +çê֑ØñCØüZ;oç„ ,\‚1ž_,ž‡e®.Ïód¿Që2\ýߔa¹?;³/è8L’ýêZo#µ^]” Ìsø¡×W¯–ç„ô¤>¬&=p§^ï§æ•O#ÊdûÆ òÃÂ¥Ï_P{óf¬ǐ”¼óó«Ý²Ï“°ªkW Iç*-’P+3Íqóã’[`Þ¨[U¦²¨yÏÃÂðؚdŒšáÙË«Ù_3£Ø!5¼žhÀ(½½ÆÎÆ_918»ú­Ôñ(ƒkâ\Îþ˜a»Uøè–aì9>ˆ¯YÜîD˜*­Êê¬vdliyõð%i¢ ™l›®Öqª²*γj`eyÎqo¶Ï•~ûÕF5`‚€©¾Ïo›kÏà`\·“>,Ÿ«HçvbU„‘}`'ygw£)E—?ŽüDçZ]ÂëdªÝ|gëSAQ†(gmP—…ŠâwSeßm8` ›Ë6‹”ÛÊʺ×Ff6Œ´ÐûƒçÍÝ&´vuÞ\oììSmÛ8Ñhäì \˜{ǯióàåÇHÚ`ý¸€!Ε^Ÿ%*»Ó›•*Kå4ð{iP捝 ;¾µuØ_Ó£ˆ ÒN¹Ÿq£Èòà +Êà 1ªu5ʈ4ü§ÛÔâž$#j}/¥ºÕÐI¸”Ä)Ô¾‡ü)"Š¨%FÝ£‹T6;Ån>ò½ŽÜô¾PTí (ª3W6ž“BŒÒÞC>xÈ&)‘R‰<&Nr"GÒë¼=Æ÷n)±´h³å‹´€ðq~Z $'haoÄî¼ÉÐ!-ÅéÈ»ð)ÞCÔ<˜¿ÃG¨º„ +‚è’çyvWnL¬.÷äJ“wß5^ ëãšÃ­Ñ]5°Rо‰¢‚õÚÕÛ8KâLB²U},’8ŠõõDu¹„Bƒ)—øHPÁ3 Ÿ¶ÀÂmyxn%8Ê ƒØ¾cfûZÕ ¸åù¨Ã£ªK¼lVóFâq Æ8žõ¸Æ§ªøˆ¦í;všP1´bȧ_ª«l°±ÇX^¥‚ÞÓÀœ°(ʨèÉrßÍ~B<œÏO£Á’>ù:òg&—>„I¼^…åÝöRŸHOÑI•ñ£2põm|0Ðáƒ5n06Ä ĕFyZ„:¾Iìô]¬7vrf‡òñfNnyÑ÷ £CÈ   +lP@h$ † Ê?¤½ŒÓÆYã²°ÅcÆzÅcžäS2M@§9—÷¨iØ0äyÞ¤8Ãvmvg3:gó´óŒ‚gT + ÁÄÕSÂÍ$P>™Ömö¤Ûß\·)Ä0<Ãq*Ù67Ss‚ÄádxLµƒG©¶ç“Z´{¢ÜfÃà"Âò`Ã1Ó'â_Ôk €øC}X®K™ÚÜGÉ 6ÿÿ 6ý|Áæ=0¹ PŒ›[ÁæV°y_°«fJ#ؼņ÷ÛeP;¿jkjêЭt ™¾-[ûi¸ï/ z›ßtµ f[\ ¿r´GÏõgµ À½‚úO-ÃSËðßkÄ°eðžZ†®eOGýãG} ß0ÎôƒG}遟‡“þTãy'åW;èù°ìyзh|Û¾Á.z¼o’‡&Êðè'~‘¯¿À˜æ<Ìû§ —u:ãº0lfªÊþl˪ùië§ùñg¥ÊÚгm˜4÷&óÚÊ]à™?0LV˜.¶äR)dÙ{§½{=«“æà/ €qWZ­‹³år·Û¡¨BÛ,.JëeQ$Ëûâѳb2¨3rÛ~ãNóRµ› ƒÐÇ´|ÛÇÿo32ÂL +endstream +endobj +8550 0 obj << +/Type /Page +/Contents 8551 0 R +/Resources 8549 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8469 0 R +/Annots [ 8548 0 R ] +>> endobj +8548 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8552 0 obj << +/D [8550 0 R /XYZ 90 757.935 null] +>> endobj +8179 0 obj << +/D [8550 0 R /XYZ 90 638.659 null] +>> endobj +8553 0 obj << +/D [8550 0 R /XYZ 90 624.405 null] +>> endobj +8180 0 obj << +/D [8550 0 R /XYZ 90 416.526 null] +>> endobj +8554 0 obj << +/D [8550 0 R /XYZ 90 402.271 null] +>> endobj +8181 0 obj << +/D [8550 0 R /XYZ 90 180.38 null] +>> endobj +8555 0 obj << +/D [8550 0 R /XYZ 90 166.125 null] +>> endobj +8549 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8559 0 obj << +/Length 1574 +/Filter /FlateDecode +>> +stream +xÚíXے›F}×W𔠪0š 3 [Iªâ7eÇN6ö¦*.Û¥b¥Ùnd­þ>=̀€E²ãøöà'˜K÷éîs°së`ç—Ùƒ«ÙâB0'D¡ Â¹ºqBì‚!¬ïÖÎK—ÄäÜ#c÷rN°•i´¼œSìæÉ~£Öe´|_—Q¹?;³ê8J’ýò™ZoWj½¼,çDº9ÜÔó×W„ô¤œú`NsÞ÷fÊÀ&‚ea;ãgòÝÜ£»?S;x6±­ÏPòv͏GvíŽ=O¢ª2»]ÍCꪴH¢ZéeŽÇX€¸Ž`„ÜóLݨÆ1•­Ì<K„áµÝ’1¦Ï^Íþ™xŠÒÀëˆJî¬ÒÙË×ØYÃóÇF,”ή™•:>epMœç³?f؆ + ™ ƾPˆðÍá6QªjUVg!ãP‰‚“Ú j¶YUƒ•‹ Žû+8Òº{µQ¿j_Õ*5ãüÆ\WyVÕegµ¹ÎÍõÚ.ŠŠ¢Ìïâ0_Û7{;³Ý·ˆârι‹F& °ð„H‚”#ÁeïVª¨c0á¿á¸Ý¢ª×ggq6÷±û&Jâõ2*o·©ÊêSð„…ôO™Ï)wwÙÜc˜¹ñ¹6îéA ›çöå¶fU{MWyZDu|Ø廸ÞØřîÒ¡×äžÉéÀ‡¤¡6¥­—8Tá`ãQ˜Nt%€o~›De·õf©Ê2/OapDƒ` +ÊÃ}µ1ݪˆVv¸Žï +¢hnÁ9S҃Ð1Ânw“¼ãœõg/¨9á.¤‡ZW£“Ó²q›š 3c§IÎûvYP)ö‘„ ªmFüã± FϧˆpÙ£[D·”[÷ˆhÄpÒÎ`§x3@ßÑf½/T|0÷$¥@¢úÊ\`ÐPˆñKÚ{É/Ù$ÙR"Ÿ‰“l«¦³ö˜’x=Â¥dˆãÿRq~Zeò}>PÁ©Q=˜rœC:rÊïA ÞÅvÔ}…9>……2à‡°<ïÑí7ƀAɂDŒkb( ˆ†ÃÑdª´‚Ôh'½Œ³$ΔF’TÝI¼Šë×õæA3!!5< A-e<ØÆÉÚ*AÔcw W+é¥ZéÒܯà˜ÛÁÄ·ÈKSi`¦9´©9¥ÅÙF•q'Gxµ…‡„s8«›z8´oØiuÂД#NŸX©É(ÕጯRý6©_¥úsKu0”jñUª?¹TsDßnTKÁŒTëÁ”ã‚ ,ҕêHFKuSüæö¼kÈNØ°lû6ûhŠ0N 7§À)›éOXÞÍÐb,Á`ŽDÝÅõ~i>jïï Œ>î +kÕ-˜8¾U}ÙñÃD!K$eWÇ?ýöbyþûÓË'ÿztõbªÕ§Q8Õk÷è5$†sHr„Ç›²  í5nÊ<¼>·³l ,'tMŨ‰a’ê…úb÷575èî_¦\”ð±.ÆÑòGè`ØVM'Ԝ–ÜæлlR{ún“Wª=T³¡JÐæÙ:Wvb–[ÛdjîîÀÀ( ªB­âW ;0¥ÉgÂhd0Ìçëý$µC#íK¯‹è$§§SÉÄì€3n;tÅ­¦1ÕÍÑþƒr`ÿ£tÄ£Ý0‡ƒé½nø`÷û7¾ÉӍ™=¾ß˜ óù˜Ý~‰ÍïÙ=®ycQd㹋“ÄŒšêï;t`µ>*ÀØÿ(Õ¾Ävtº†>_;Úa2þ—,dÓã¿ã¯äæ×1ø¤]eÒþí +ÖÝÖ0¥.µwºé³·m×gnm{gnþ¬Tù­þسŒñ4ʶ‘Í8ݽÑ[A-w|ԋÕÒoyè¹RÖIãÙßN;úuքé`/‘b‡ÒÝÔuq¶Xìv;´ªÐ6‹‹Åõ¢(’ÅýTêí¡ ºMnrûK ÍKÕr <„:ŸÂÿ_ÍIiD +endstream +endobj +8558 0 obj << +/Type /Page +/Contents 8559 0 R +/Resources 8557 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8469 0 R +/Annots [ 8556 0 R ] +>> endobj +8556 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8560 0 obj << +/D [8558 0 R /XYZ 90 757.935 null] +>> endobj +8182 0 obj << +/D [8558 0 R /XYZ 90 612.595 null] +>> endobj +8561 0 obj << +/D [8558 0 R /XYZ 90 598.024 null] +>> endobj +8183 0 obj << +/D [8558 0 R /XYZ 90 382.122 null] +>> endobj +8562 0 obj << +/D [8558 0 R /XYZ 90 367.552 null] +>> endobj +8184 0 obj << +/D [8558 0 R /XYZ 90 127.739 null] +>> endobj +8557 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8566 0 obj << +/Length 1819 +/Filter /FlateDecode +>> +stream +xÚíY[oÛ6~÷¯ÐÓf3ûÈ`+°Þ†vm—µ°¢-ÅVa¶äIJ“üûŠÔ…Š¬¤k“åaOº<<—ïœó‰ÂÁ:ÀÁ/“Ç‹ÉÁsɍ´¤2Xœ¡d›§UðaJbj6'ãéьài”o£ã£ÅÓlsu¯òèøUr’GùÕᡛP&Ñfsuü6^/ãÕñQ>#jšÁC9û´xyðœÎ†4„Ý4uªý~´S<F”ézÆSòÃlNž>¥îæí€Xΐ֢^óhÔfÛ'›¨(¬´ÅLÓi¼Ým¢26˂9c!Rsp†Î1oãÓ¸2,N—vÇ +av"ãæõäÙbò÷„À[Ê½QÈ——W»8¶ñl®(…˜+›‚÷µ”ýAÚÞ  ¥q&G#%æ¶ûP8ï‹,皯B( + 1ŽPŠ4ñ*”°57Cv †'cf{!¸ês·±ÀË,-Üã›7OjÏPF+;<Ït}XIJgsqüÎ*)Ô*uAbZk´;N*ÑÌë¥ÂÓ'à0¾LÊ«c›f×%+Àn²uÙ,ز‡«f‹ŸÜ OR*¬'üüæýñ“ß^½zöç‹Åûy +ŒR üÀ{d@$xLÑ&X’t“¤±1Ò,¾Üm’eR~²ë3À.Ç œ¯‘Pvùãód³rÅ&²—]^EÐÕ³Ó<ÛºáÔ^!Šn¢ U–¢*¨¢" …ÌÍ5¢Íʼn¶Œ2JÒ$]©‘²_Ï 0'”#Î #Éî¶YgyRžmÝîgYכšpΈ˜V!­Þ­²ØML3§›±Œã•}.ÏÜú,u7Å.^&1¦0¥B4aPåiè#úäjÈ6†8çûæ™(4 +ÃÆ ÈYM_œ UHB[¸PH*š©I1$ #Bån=‰>n9Œkã3“¿ë=xub`QÚ÷-`,)z“‹-—¸psãmåà +ü«|?b‰s(5tJ¶™¶~fPßFÚÕÓ<$éY àr9SÖsŠ]´t·«d§E’¹|ÉN{S{yÓtÕ^1˜ hJ$¥+î5èbeœ‡ÞúVŽî!#Äüeí:¡³¢ŸX¢­­‹ëz;ƒ2{=qãÑu™l¡Í¯ÜÈUßtëɾݞ¾s·ýœ@Üô>Źd‹kŠ÷“Þª¹€^$›½«Ò¿kQ[âÕx¬d÷u¬˜Ýÿ¬Ü•€ƒ/Œ“nq]”«ÃÃMœ®Ë³ã8ϳ|ÌúP †­õy6£bzQE òëÔ^],t‹Xí#VÄU-‰t8žE0Ö¸¿u^ÑÛyJηö’ÜêiAs]¯š1`Ž”ä>ñ5:£F:gIÄ ˜ââqRõ?'m8©¼'NŠ(õ¾šq_MÐM¿š Þá7&¥4]Rjɓ•½¢™Ø nöXçC¤ )Ñé}•“9îY%s§I݂{†ë–ۍsO 쇏sOòP¨§±’t˜ ކ{ÚËb5Ê5¯‹ª;À(ׄ/¦–ñ×AþïBcæÞvC¨Ô…w ֣MÈ«bêZ‹]Û,ºKV`7¾[V¸¨%ë4Ëï»çËÞó‡ãþz¾ø‚žß;†ÒwØò«V-_`bººðººyiZ¾™T òÞÊÁ–)¢mm4|Èò¦˜ÎÀá¿´êE +…dÆÂiM„!ìg}®ªÎf6É ÇžL©›ˆË×érŒB"n '-,9‘Ú‘©ö‘AØMäDÝDNjÇB{ĔõNÃüÓ4‰éãìrÆñö(oÏù  +›¯;cÐm!¯è Ô9È£²ÉöX$3›]I‚„oÏF „Hræ¤%"Xߎ9iÈôpŒ9"Tûüm¸ÓœC‘—ŠúAvjˆ4}!ÅÉÎKŸN¸I'Ù¥O™Ä·§L'5ýÖu˜±{âLµ™û)òÊzíúk)»†ç½¼ p{¢¶è¨moòx—ÇEœ–Õ)¦O¢$æVÍyÚ ÔÉîm©{pԉ?´ã&hE˜`î8RЋæ]‹fd˜:qóƒCg%ݓ`<Áno֒'óÖ#Of´ÑŒ‚f5s‚äc²WlœÖ~hú¿¥Bš¨Ûþ¬þ‚M†';·…®Î|ÌëLwwu{·®Çۇ?Š8ÿ~&ÄÔAêu”žGîŒÎ4ÁÏFäkS 02?PMáuUæ];#­eõݯ“*P­¾D§ÚbV–»Ãƒƒ‹‹ ´,Ðyšìr””»Ýæà:˜:R ·Úxš¹„ÝB*Ô^ÂGАÿÿ÷òÍB +endstream +endobj +8565 0 obj << +/Type /Page +/Contents 8566 0 R +/Resources 8564 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8571 0 R +/Annots [ 8563 0 R ] +>> endobj +8563 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8567 0 obj << +/D [8565 0 R /XYZ 90 757.935 null] +>> endobj +8568 0 obj << +/D [8565 0 R /XYZ 90 733.028 null] +>> endobj +8185 0 obj << +/D [8565 0 R /XYZ 90 512.901 null] +>> endobj +8569 0 obj << +/D [8565 0 R /XYZ 90 498.972 null] +>> endobj +8186 0 obj << +/D [8565 0 R /XYZ 90 307.149 null] +>> endobj +8570 0 obj << +/D [8565 0 R /XYZ 90 293.22 null] +>> endobj +8187 0 obj << +/D [8565 0 R /XYZ 90 89.441 null] +>> endobj +8564 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8575 0 obj << +/Length 1771 +/Filter /FlateDecode +>> +stream +xÚíY[oÛ6~÷¯ÐÓ&3ûÄ`+°4éЮ]³&V´E ØL,̖‘”Ïý|”ppàà·ÑÑùèà‰dBJRœ_ +‘d›Õ,x‚X<žŒqx:&8LŠerq:¦8Ìws=+’‹çée‘w‡‡Ž J“Åâî╞ÝLõìâ´“8ÌaQßŸ?;xBHï@ÁiŠƒ8õy?[’L#ÊTCqL~O¨Àá1u“W¶œ!¥D³çÑ®í±IYZnçcEC½\-’J›mÁ„± 0†Î0¯ô•®ÓÙÔÒq# ¯KƄy<:9ý3"ð¤6/E0]ŽÞ¾ÇÁ ž? 0b*nkªeÀ)ƒqœþᝮ¢`<)z®BìüUõ´X3O¬‹v=Bom^Ý­t–,õx"ÁñÇF¢B0DXÿ%<<¦–¨~I×vúhâ*¾#A㠃à?ŸkÏYi6×EZ9iª†¦\%S7¥K•iž µmI7õm«ÿšÛ ¶ŠE=’PÑúU*Z¥‹òpÀ c4 ëʔ7Óºhß½C‹p¤x[­Ï½²Ûi¡W….uVó5®Êíxé^^š’ Ž­ÖM0|â™@…Pœø’g› +ETˆ ìæ1aÍÀ:Õ¹3½ÎòBÏv;EF0çCŸœ|œêU>ÿþP]¢•Õìðp¡³ëj~¡‹"/véA½Œ¢N·"SÞÖ!§ÂôʎΪ‹N5ŒNe¢Ó“2L"íÎŽkkÍ9ÕÚfiïäeò1]Þ,íZ‰•SÏür¹öB1G±1q¿™‘§¶MT-F |&‚\‚$ò$}IßH’Dïƒ$³|9­’ë¾ x²òXðô;}yìäOŸ/‡äÿÁNô±U¤ÆNf„ÞÀ0YI͈ý/}½›Äqïkj\> v2²lj5é>0b,‡Ãnäf#5#5…è£EóòÌÛÅâ‘Ú©1¿>3Rð3ÖPÌL^yá&ä)Ù~¸9ðÅ}t˜P®¸ –ŸúM›Iºï›6m…;©¿iÃi'ÔM|n倬ˆÚ÷M»ãêEgà“.2¼Ø ñþd‚,&dlE†N؆ܠ¨“øžÈM¢¨»çø‘‰>/pbJ"Ø .…§?®é4­|ø °t+*÷‚,Nºø`ªtR¥fø`j»vÿ/nV·6Èfn× +Z> endobj +8572 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8576 0 obj << +/D [8574 0 R /XYZ 90 757.935 null] +>> endobj +8577 0 obj << +/D [8574 0 R /XYZ 90 733.028 null] +>> endobj +8188 0 obj << +/D [8574 0 R /XYZ 90 524.688 null] +>> endobj +8578 0 obj << +/D [8574 0 R /XYZ 90 510.118 null] +>> endobj +8242 0 obj << +/D [8574 0 R /XYZ 90 294.215 null] +>> endobj +8579 0 obj << +/D [8574 0 R /XYZ 90 279.645 null] +>> endobj +8573 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8583 0 obj << +/Length 1575 +/Filter /FlateDecode +>> +stream +xÚíYMÛ6½ûWèÔÊ@Mó›¢QôÐ&[ M€m²í% ÙâÆjeɕäx÷ßw(J²é•½I³í¦è^l‘¢†Ã7Ã÷†Þ8øqôýÕhz!Y ‘–TWׁƁ’ aÛJ‚·!!ˆEã Á‡—c‚ø\ÇóË1Åa‘Ý®LRÆó—颌ËÛÙ¬P§q–ÝÎ_›d»4Éü²“(, Qß]½˜^r0!U0›æàN3ß·nˆçÁˆ2ݍxF¾O¨Àá3Ú^¼0ËÒZtÏ|wÂj?íY\UÎÚÕXÓЬ7Y\ûX0aL!!£``hÑóÚ\›fa&_ºqGÃíÖ$cÒvž_þèÅiàå +ÑHËõèí;$Ðÿ"Àˆé(Ø5£Ö§ þ³àÍèçnC…O†,Òc(*‘ÜMþüfi6uZäÕ¬qâØÊôÀ9À"B +kX t áLTu2›e&_¯æ¦,‹Ò34½øÀ€ˆ*Õ-ýjUc*Â]>ž0¬ÃôÚý×+ã.ªM¼l/“tmò +c¤Ž Î3Á‘S…fÀDºÍoÁº»ß`³‡ümšginÞ ìú à„oB€!(ïԭޖy5d’9êS¨.·fÀ¨ &Ý ´e¬8OZ†Ê³Û–ùZ®¢‡KВûµb6àG:êg¨Wiu¯vúm‘(Ú+×/FˆËžãò˜uwiÕvu9Ž”Ò'Q¢Š€‰á`dý°zæcŽÃq–&ó¸|ßî9ÝÖ@útH¶ƒããZØÇææ\ú#0—÷a®ï`Þ× +“4·øƒ”,23(Uª¢CVƒ¿@{¾ÂÐ'…y\…‰Ä‘ÂèNaô)…Q˜Ý§0Ñ^aZ,ã4·`$]ùÕöq™Æ3 ¬¡z#½_ârgù$l­Ÿ$aðj´9G +h0¡"¢‡„½)|îáðgÀv½]5Ûco’®¼ yéas†äé}$êK¼²õ$õR¨[)UG½òñ¨÷S"’í¹"ví9Ç£Tÿì@ý‹‘ŒøCòX‡ˆ€pq¼­|ÞfO¼ýx¼ WûÔƐ°®0¦üTaLÿ„ƒÁ¢ØæI՟ æñ¢°‹ù`lÂBïÁ Á6_ÍÄåüùÍƽŒ©ªît ·5::´ß[ykg N”È䟨¾¥@¢-½ÅÇú{4ÎMђL»³”/d£qD#>Øã @ [ß;Ç\­:÷Ö¦^‰ÿÞ¥…R5¹êp56! ¦}O4–â…Á@^²y­!ûO–ö䓂ß×÷¾`xõýçh»?Ùß8PÚÄ6¨'üIOUO°<ÒÖé ;©'T}†ž4;V³³â!}-Q÷i cGh5áOjòeªISÓ[ӈÐüjBHLˆþß©IÇñG<ÑÇ~Ãk¾Ù+iÅ¢ö3«Ð Cú_‹.mVX¢n›S»fKÉ®ñKeʯÇB„mŽ½Šómœ¹kKl.ÁÊýÙ#ûÚÒ åãð1í"ÝÊþº«ŸF ¼{I¤Ã=À«ºÞ̦ÓÝn‡–Úæé¦Di=Ýl²éÝ,:°B8R½‘ë¢ýN´.ºP¤9t®›/Dwðÿ Æ5¡c +endstream +endobj +8582 0 obj << +/Type /Page +/Contents 8583 0 R +/Resources 8581 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8571 0 R +/Annots [ 8580 0 R ] +>> endobj +8580 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8584 0 obj << +/D [8582 0 R /XYZ 90 757.935 null] +>> endobj +8585 0 obj << +/D [8582 0 R /XYZ 90 649.939 null] +>> endobj +8287 0 obj << +/D [8582 0 R /XYZ 90 627.628 null] +>> endobj +8586 0 obj << +/D [8582 0 R /XYZ 90 627.628 null] +>> endobj +8288 0 obj << +/D [8582 0 R /XYZ 90 510.864 null] +>> endobj +8587 0 obj << +/D [8582 0 R /XYZ 90 496.294 null] +>> endobj +8289 0 obj << +/D [8582 0 R /XYZ 90 381.568 null] +>> endobj +8588 0 obj << +/D [8582 0 R /XYZ 90 366.998 null] +>> endobj +8290 0 obj << +/D [8582 0 R /XYZ 90 235.624 null] +>> endobj +8589 0 obj << +/D [8582 0 R /XYZ 90 221.053 null] +>> endobj +8291 0 obj << +/D [8582 0 R /XYZ 90 89.679 null] +>> endobj +8581 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8593 0 obj << +/Length 1991 +/Filter /FlateDecode +>> +stream +xÚíYoãÆùÝ¿‚O©Dã¹·èC’MM l7.ú°Y´8Z1¡H…¤âu}¿áð)Ëö¦Y ~‘†äÌwß$>8øîâ«ë‹Ëo% 2’Êàz(ÉvWQðnAbz¹"ãś%Á‹0߅7o–/²ä~k£<¼ùG|›‡ùýÕU½¡ŒÃ$¹¿yk£ÃÚF7oò%ы .ÊåûëחßÒCH`3È©ðýÍoÐD0¢Ì4;¾!_.WTàÅ7´^¼Ë2F4gþ>µEûu…‡v½4tawû$,­;¬SHH¬@FԂyk7¶b̦k¿c0<®AÂ)wûâÕõůîâ€Tâå +Q-‚õîâÝ{Dpÿu€3:¸«víNü'ÁÿºÀ'UEAxRôT…µºÊ#éhøØ)™+¤x+òò~oÓpg—+! (þ^€ô%7ý‡Ê)ÅorA˜Ã“SŠ¢Nj„žÔCœ¶;n³,ñàæìqU« Î %kµÕBz–­¡‘§m”04Uf¸7UfÄ´©‚Nò?ÐÅÕÕ.üïâÿ‚L™‹Ÿ°Àë,-Jw)¿Ô†ùÍ«{oœEg©ßù… ^Ñ#WI$Xë'Ö›`J#*I³éK/^N1Ø Åûuf7?aL×±MKïOSh…A«`qØߤh)G†¨íJ€UŸ‰AJ$•écˆ¦10aF¼Íf´ÕºN¥‹Ãn4'Htñ´DŒå“v6ˬQ¶9Ï6 ÏãÓ=@ãGäE6Ívqú;È<}ä(J÷­{ Dȃ]蘏’“~”<ß×Öa:´Æ܆ëmc‹MPÐD ï%çsLë´SÉ ùÀ‡_}\Û} NóHÿ5]Ö/Êèê +XàÀu˜ÄÑM˜ÛKËSFa@A´3Š«!•½âœgb¢ïù'R=ÂP7¤3€ÁÅ(£mHkÐßÙ´-ççˆvçöYœ–S„„ÇÝ.<ÑíRzV·Ë”@:yWׁd^šÝ?}³+žÖìVú­þÏ[rµ¼ÛÚÜNàŒ¨Tª8}Y_7Öq M§çuÚCҔü¥×~éµ»^›|îÍöŸ½×IFbHåt ›6yÎêNö‡ËÿÙZÇm½),½¿Qü¯×ÖF…{Fåâ.Nÿ bŽ„àœªžÅÝ ýÍýt߅@Ø0)TæBŸ‘fH7ÏïB u!°h(µ•0GÊèQor¤ÍÓQ’CM•k¨‘0ôe˜ñy34Òݛ–çDw056èÐ)eMµä–“³ rºŽí„ƒ®*2·h«&(‡gf .ÿ³ ÞoWfgЋweZÃO7ÌpW3à ‰G=˜ÁÇ]Uô|0ó# ¨ "B ÃÊ4‡•×¨‰®f,A¦ôӇ"Q cr(¢^†"èPDt´j*‰ñS·˜™Š¨‡Ç"º7‰Óf,¢‡c¸œ‹è¹±tò}M§›é©X7ÿ$¯é†hz¸ ô^Ó·®T19}ýûYoéõYoéÁ{ë᪷ôâÁÁ´]Ý·ó51éjÔª&®C¸Ï|ÕàÂe§éÁCDþ~)¸Í“m.æsÙÅ}N%Ÿ”Œ{9˜Õ“‹*ÛÄW\þA<Á½ {Ö̂> endobj +8590 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8594 0 obj << +/D [8592 0 R /XYZ 90 757.935 null] +>> endobj +8595 0 obj << +/D [8592 0 R /XYZ 90 733.028 null] +>> endobj +8292 0 obj << +/D [8592 0 R /XYZ 211.842 492.907 null] +>> endobj +8596 0 obj << +/D [8592 0 R /XYZ 90 478.182 null] +>> endobj +8293 0 obj << +/D [8592 0 R /XYZ 216.764 192.761 null] +>> endobj +8597 0 obj << +/D [8592 0 R /XYZ 90 176.656 null] +>> endobj +8591 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8601 0 obj << +/Length 1993 +/Filter /FlateDecode +>> +stream +xÚåZKsãƾëWà”UæhÞ%•ƒí]WÖNÕf­T›-DEØ @ƒ eåקƒ×CJÔ²Û9iô{º¿n' N¾¹úòöêú­d‰AFR™Ü.ƒ%Ân·H>NALOgc'¥B’õ¥ +ŽÌ˜â®ÕO~YVʂ4Eúk;ÒrŸtQÖ~q_ q·YVåº}lsïì©“/bO2¬/žË4ßÆî#ƒ(&lŸ{eë]Ut\ûHŽëíÖçØ}í ÒºO­1A!×P1&³xV̸@3WÜ%á-‰k&ä+6¨¼Ü.Û²¶+êrçò Š@“YûúŒQDŒ!1ÄP‡ÆêFÙ?^7ì¤RHñQÕO˜Î„4€¯à¯Â`ϙäfü£r˜Ër?ºÜ¼Ãaԁ¢¡RGCœö'îË2÷äŽÁÍY‹Êà=¡dè‘Ï‚¢Dh$Äi(J )ðŠrb<u‹(uù¤œ7ú8¾¹éàÜ- ³<‡ì_ûíw ¶º{ã.¼CŸ-¬r?ýÁ“ˁHFÒD¨•FT’à"A RŒDSIFöýª´KWE癫#ã\…AŠÈý ØRˆn®¶àuvÈAF9H…4ᑫrpîÒ{|„#Ì1‚8è^ nx@šAòٗý[ô îˆe$€ô>#mʬ¨ãbc>TA<=‡É‰I°ÞÚ³ÂáïO‘¬W ¢À§:Aɶ‘qùx£ Èe@†ÇA×( 7 Ë˜&‹6‹²ÈŸü*‹ÕPæÐü2¥~,ÆÖól*[´Õ´퐇ÂhðúqìáÑQ·ñE´yÜQØê@î!…ðpñ>CŒA&D##ıl$y\eóU›35@4ÆÂ;=O·ö,¨ìëþãfù¸²•!¸¯F™³À¡àmWžµ úRê€Û®nëçQD Õ1W$(¤A¨xŸÓ“WôÆô7ß¿ª9þÕ÷Æäœæø¿Û¿ª5&¿¿ÖxÏ4ƒáh£/Ÿ'¼‡dùϕm2¢êîTZû[O¶S2Ù°žÌa1·v±uICòÌòÜi”‡¿)\ևÂ'|Ù¤@xø0ªü°í2",eDj â sÏ%GªÃŒ„³º[4ÎëP±ƒé‘1„"=„"„:6‡À v=:† #¤Þñ¦ä(&”Ð +¨ L!8dõg§/#ãÉÈ×z ¦€¸†á¤mԎ„„ ¥ôë‡Q#:Ì0ÿà ÿv¥æ>ÏÀP_Ây£ÚÏ3=2Ïp=Û9ó è[ë4+Üü°`žAèäUŠ0>3@ +šó’߇/’ѹ FC»ó!Á‘ÿÊ7îñ›¶æhÏ‡ ?Õã쒭‹#U\¼ ÉçC~|ìûÀ¶É÷Ùw6T†>­,l× –ÑI:¤ÁèÅ'þCàhw^VÐrT‹¬x8)åA;"þa`eH”§13ª ;Ó_õ·žÀe!ȺÜ7š”©˜á¡ù”ú€Õ[bÿó¼Ô8õK¿Î7_ãA Žgºý +aš´öŒï]¯ï +@»íÆÙ~Ûæy¿ùÇÖVœ +1i÷oi±Ks¿vÙógGÊVÃÌp +$$—DKªxò½µ­’^³“nõ­oy‰Vˆ ãéU]on®¯Ñ|‹vE¶©PV_o6ùõa¨Ž¨´ìúâuYõ&<\7ׁýÿû~‡E +endstream +endobj +8600 0 obj << +/Type /Page +/Contents 8601 0 R +/Resources 8599 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8571 0 R +/Annots [ 8598 0 R ] +>> endobj +8598 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8602 0 obj << +/D [8600 0 R /XYZ 90 757.935 null] +>> endobj +8294 0 obj << +/D [8600 0 R /XYZ 211.842 577.147 null] +>> endobj +8603 0 obj << +/D [8600 0 R /XYZ 90 562.422 null] +>> endobj +8295 0 obj << +/D [8600 0 R /XYZ 216.764 277.001 null] +>> endobj +8604 0 obj << +/D [8600 0 R /XYZ 90 260.896 null] +>> endobj +8296 0 obj << +/D [8600 0 R /XYZ 90 145.547 null] +>> endobj +8599 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8608 0 obj << +/Length 1533 +/Filter /FlateDecode +>> +stream +xÚíY[ÚF~çWø©5R™ûŒQU©Ý$•ÒVJú”Fȋ½‹U°©1»åß÷Œgl<`X²—D‘ö‰¹ŽÏœË÷qpàà×Á/“ÁÅɂE’Ê`rD8P’!lfIð1$1=ŒqønHp—ËxúnHqX,¶ó4)ãéïÙU—ÛñØ TY¼Xl§ïÓd3K“é»rHtXÀ¤~š¼½xCHçTÁÓ"æÔÏûъx6Œ(‹‰Wä‡áˆ +¾¢nð¾G-g(ŠD󟟎hm{¹ˆ×k«m2Œh˜.W‹¸JÍ߂c + ©ƒ8#Î1ïÓë´>XšÏ¬ÇaØv*‹Ìòàõdðï€À*Hí^®Õ"˜-?á õ·F,ÒÁ]-µ 8eð»> þà“¡¢à<):¡B ìâUuN±ç!¦N:]!Å[ŸWÛUšÇËt8”Bì/¸_DØÛ$•£›´7RC¨ôÉHQñVâª(VÛ±|¹°ñ .lÎIÊU"4ât®Ä÷r•c—«fЛ«%OyÀ Æx¼®ÊlVÙ³"¯â,‡Ìe +‡cae]Ùiÿ s(("ÌwÎéÓ3Ž£_§PwZ¿³ðOBµÛْªÀMÄÚceÅ»ú˜D|çïY¾Èòô“¸#8"Œ“ + +I€ Õ¦„ ô(fH‰]U•›´G)•HîÒ!»[•ã<1ùbk—ì– +Óx6·+³b¹*ò4¯ì´¸¶ê©çNˆ#jç Ìz,åP“¤5tž­ï5´Iʃ&3…ÕðÿÿÞÖמ +endstream +endobj +8607 0 obj << +/Type /Page +/Contents 8608 0 R +/Resources 8606 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8571 0 R +/Annots [ 8605 0 R ] +>> endobj +8605 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8609 0 obj << +/D [8607 0 R /XYZ 90 757.935 null] +>> endobj +8610 0 obj << +/D [8607 0 R /XYZ 90 733.028 null] +>> endobj +8340 0 obj << +/D [8607 0 R /XYZ 90 615.796 null] +>> endobj +8611 0 obj << +/D [8607 0 R /XYZ 90 601.525 null] +>> endobj +8341 0 obj << +/D [8607 0 R /XYZ 90 492.123 null] +>> endobj +8612 0 obj << +/D [8607 0 R /XYZ 90 477.851 null] +>> endobj +8342 0 obj << +/D [8607 0 R /XYZ 90 328.431 null] +>> endobj +8613 0 obj << +/D [8607 0 R /XYZ 90 314.16 null] +>> endobj +8343 0 obj << +/D [8607 0 R /XYZ 90 202.756 null] +>> endobj +8614 0 obj << +/D [8607 0 R /XYZ 90 188.484 null] +>> endobj +8606 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8618 0 obj << +/Length 1407 +/Filter /FlateDecode +>> +stream +xÚíY]oÛ6}÷¯ÐÓ&3ÍoRÆ0`k›ÝdM†=t…¡Ht"L–ŠKn$Ä1. C6àƹåÆÅ8—H$ÙS â1ŸGI²ˆ‹ü¶Ü4ܴ¨„Ô:«ºi +ÿÅn|qµ­ ,&”oÑ&_Ù%‡‹‘ÒáC*Wc¾2 òP[‚ŒÕAšî&½Mó,ÍÍ»‘ʘ2t؄K!IÏ|Ÿ$Ž6#ûˆ‹u¸­mKû¬ïL7܃¥å„|lO#¢Ø# ðºᖖâÉs Degíà^ùcˆLA*tt¹ ¥V›òLFn4…p8Ľ0•Êù>‚ܶ+›n6.…}Þ¸1È\“<í“(TĺIÿ¡jCžIlHx¾Úœ’ä¹äFÅì£ô†r$AÕ¬Þ¨=½‘'ê8¦7ú¦7ò?Ó*ÄÞٕvgW:®7‚ gŽ=‡B6ÓÜ,îÓún±Ç³´/?T¾üL;åÁH¶ŒÓSž«WŒ©œ²‘'¨Ð³‰ÔH5¡ß*óA2üA=SeZs¥{„a@%9QÏÁ0§kÑpªRòJ9_qÈŠSË̦2‰}[åцóO ñE>qýQŸ¡þ£¤>£ Ðïÿ¶$!K[j^Æ`p >.@zxã±"oãÌì]$T£?#¢ÃX›ëŸ“èˆý›Ï¹—›æ‚@è9eyørCSÉÀÎ#*9"$L!ùô Jɉ——.$QmßVÑv8«4q@„ߦ闛ο£4Õ³|X;|Å<%àÜ?üHV›Ðæi~;?’kûQ± §€iA¯ü< Hû C…~TU›UrÛv©SãÈuݸ߮¢Ä¸Ý›z 'M‘Ôâhí+¼#¯Íº[¹ÚÄÀ,Õr“¹­–¶ß4Nwy¹ÁÒԛÒý0­l_·uèé¹`‰3ÄB6$â®dªhi2WF‰©jȾæÏ~ýìèÖ ‰>õ;wû]phŠŽi÷W„[yrÂeão£²®Ùɬm:=µ ¸”_BøŽ‰òM‹S¤÷) 5]èĨ¡ÕF0Pzý+cœ“Ö³?½îí§I܇ý ä‰wŒ|W×ëùlvâ +mòt]¢´ž­×Ùìqrö¬@¡<\JvçãUÑULšCç*j‚ýÿ:‘d© +endstream +endobj +8617 0 obj << +/Type /Page +/Contents 8618 0 R +/Resources 8616 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8623 0 R +/Annots [ 8615 0 R ] +>> endobj +8615 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8619 0 obj << +/D [8617 0 R /XYZ 90 757.935 null] +>> endobj +8344 0 obj << +/D [8617 0 R /XYZ 90 694.089 null] +>> endobj +8620 0 obj << +/D [8617 0 R /XYZ 90 679.519 null] +>> endobj +8345 0 obj << +/D [8617 0 R /XYZ 90 521.092 null] +>> endobj +8621 0 obj << +/D [8617 0 R /XYZ 90 506.521 null] +>> endobj +8346 0 obj << +/D [8617 0 R /XYZ 90 348.094 null] +>> endobj +8622 0 obj << +/D [8617 0 R /XYZ 90 333.524 null] +>> endobj +8347 0 obj << +/D [8617 0 R /XYZ 90 117.537 null] +>> endobj +8616 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8628 0 obj << +/Length 1572 +/Filter /FlateDecode +>> +stream +xÚíY]o¤6}Ÿ_ÁSËHÇ€íQU©Ý/iÛJi’mÒÕÈ'Ae` +̦óï{ 23éf·»Rž0`®}Ͻ>Ç×`ïÆÃޛÉO““×ó$’¼‹kObG as—x—>!ˆ‰éŒ`ŒýÓ)Á¾*—jq:¥Ø/²Í­NJµø%½*U¹™Ï]‡:UY¶YœédëdqZN‰ð ¸©§ï/ޞ¼&dk@Êa4Àtšñ¾·]s"Q&Û/ÉwÓ ±ÿ’ºÆوـ!)Ãö›°Ú û"SUe­]L%õõr•©Z›Ï¼c…‘ðf† 0gúZ7Žé<¶ý,†×Î$ ˆywe!‘½¿e1¥¡—»¬ºI‡€"“äP:.è:©<Ká ÎgpG)ªtaHRð½@gi˕ªÓ«L£‘…É&Pº4c°^d°#3òH™ Ɍx–™ÿ$3f,>™ r2Dá( +!Fø°Ìˆ^fì’™æzq—Ö·CÑ [¢—mÑqèP +’Ctη˜bL`ÇI´›àŸPˆ`×+ý3Jä&ù®ÒjMµG`/àÓ—ÆZé ¡ñ󧠗ãՆDcn˜q ÿ/Fmªq‰YW:±­ë¢"jÿ8ñW±|Ÿ/Z|(þ +ŇTþU9 ó¢\¶E¹/r(äÙ#ÔÇ9VâMœéŠ‡†¼ŸûeŽ“ŒD@‡°ŒI ¸ÂåA¥Ç( =Fi6ü@ÉóU øË8’ª†~fá`”ák­jÚÐ)÷ÁRm†½JOIè7Iü\}^Š£B{ +o r#óÇöÙª4¡ÍÓüf¾7Õî‡Å&\øEžmlKUÕzÙÛÞ»œ‚V¬Ü£+÷ÑR%®¥®Šu=†‡6=xÎÁDÑzÕ\­ãXWÕõ:sS,íUgۄTîe©ëué>L«á̙ŸŽxÐ04‘08 ‡ ]©k¹å“hX‡EsöãÖÍ}æTƒ6 äy“ð¿oú3öG܏8]ç][«fKð»9ÄWeª`]*>m~q´@™¼Ñòdõ% @ï£pX`¾öY×Úß„ö[1ÿ +Ê÷ÓàìÍÄ»l:X!’25eM¬¦Øf׳£gÂøSXr$úbԜ XJ]­t\;w +{­V*Ö¦Éz惒¡÷ùÔeHWÉ~ iN:¨0¤™Þîalg³ÎúÉÜdÆhñãÃUñ™Nr±„ø¥µCnўfºM‹Ò@w÷5wi–íTÜýêÛÝÙìþøŠ`#ŽýïÕüï‚yGHr&Üÿ®P6Œ3œø©Y†øÜmË|öÖQœ½yWéòÛiún³ý«Ê×*ëiãƒ1Èw®cd(̬}dþ`ÿ\·KÔzö—׶~ž4ùÒϗ%R—1·u½šŸœÜÝÝ¡¸Bë<]•(­OV«ìä~´¶¬oóÎHw¬±,ÚÍLšÃÃeC÷ðÿ +²g_ +endstream +endobj +8627 0 obj << +/Type /Page +/Contents 8628 0 R +/Resources 8626 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8623 0 R +/Annots [ 8624 0 R 8625 0 R ] +>> endobj +8624 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.4 138.024 212.124 148.928] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +8625 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8629 0 obj << +/D [8627 0 R /XYZ 90 757.935 null] +>> endobj +8630 0 obj << +/D [8627 0 R /XYZ 90 733.028 null] +>> endobj +8348 0 obj << +/D [8627 0 R /XYZ 90 585.86 null] +>> endobj +8631 0 obj << +/D [8627 0 R /XYZ 90 571.635 null] +>> endobj +8349 0 obj << +/D [8627 0 R /XYZ 90 422.988 null] +>> endobj +8632 0 obj << +/D [8627 0 R /XYZ 90 408.763 null] +>> endobj +8350 0 obj << +/D [8627 0 R /XYZ 90 200.449 null] +>> endobj +8633 0 obj << +/D [8627 0 R /XYZ 90 186.224 null] +>> endobj +8626 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8639 0 obj << +/Length 1815 +/Filter /FlateDecode +>> +stream +xÚíZ]oÛ6}÷¯ÐÓf3ÍO‘ †[Û ë6 K³¾d…¡ØL¢Í–Ò¼#~½ÜHˆýôBÀùy@/œqG/¶ÑI/¢÷¡lÈÉÉ2›@0VE5dZ‚à \ßr—o-ë$Eš\ÍL9~cüíoœå0Xc8k®òñ•iÔ¨Š‡nŒm¦SøU¶‘ HG$€AE›Ð¾L³X{×CI€-™HSÏG/òùbYÝS$ãIÄrbqãÉñüç^t H2 ¢#L‹"“NËeñÔ=éŽØæ %ˆmúXlC³õUZݺ¦\p¸z¶UÞ.«¾Qšj°ž]ýë¹É>k¸©ì˜Å)…[«‡ U¨ckƒùKY»·çõ¤.½ÉÒìÆ]ÖÓ¶ XÔræIÖôWÍQÌ?enJȝS«Ó0)[»x"žªLq¸ÂY^±M7Ñ}€àNi¾n•êb Z½×^eÑ¡ê6ñ}WélæZW¾k0ýˆXåÂ<!ùÁ'GÒû–CÁ—àN(Ž™1â2Ì d ø0<ç   àS÷̯m噿å¶Lîç#Ûá퀲¦çmª-]ý tPºH%ái±E°½•ó1— eëñX†Ñ_˜y~·;¶ÕÞÄƒÄ +)Pëîă˜xˆÇõœx|Lâ¡7¡se Y—5àny…¸w¤™¥HðMŠ±#~°:´‘ж¶ÛZ¢G‡ZºˆãýËg€'£O\ÕufOIÕ {ßa‚#W'"5K‡ÙЏõ>”{”–s¨ّhoȱ—KŽ@ƒYµJK³f¤ÖSöÕML#.Äѧ–dÓ.œc¤d¼µ[ ©L%$”ÙÂçâ«ÕM¼S7YLŽ‘|Š»Ü‡»©jpOŠíŒ'àNm¢@ג¯MrK›ø³6=mQ,ÉY íÈY Õ BŒ¡©>¤&^,L1¾Ê—Ù´‘&ɂÒØ^†+\K’‡”ÃV/cDžêÀ±µºK›¾¤4Å6ƒ¤^›ÄkSâɯö +_Y×Ø£ER H¾¿)²”Ølßĝx¬§ŸmÕړ¼°gy6mêðF“ËÇ*b…üêë¿gŸUǨ×1ê¤ +‰×±Î‡t‡Ž‹©Çt¬ËUžÏœµ4 èê kàFd@ã„(åx¼nuaI"ú“dlœ^ÍûĞÂæ7µÖ€@yù éR‡‡yD2i_:ýï +-~ˆš‘CԌbâ•Ã»Ô 4¤¥õOӥ妚Ù1½šÙ¦W3ÛìV3 ˆòã£j£x1J ¶Ÿu,ªY=}¿8§fZo«™}¶©fCãþ/×îAZ¹ÿ¤åúp¢˜l.ûÀEЦ|šdrž¶>¬hË}Å+ø5çäX'ؤ=XÌJ±4JØúÍfaªe‘™©ÏÖXÔuúÃA`ûêæ:™•]Ã0Ü6±Üf¶Ál–AŸ³'Ê6(¶?#ˆ!>‰:ô+‚ú«˜IŒ´dÊè!t­ áûŒ3yVÈýåZÉÝ¥—lwñgiŠoBô½CýždËĿװ’wgM™¢}Ê +ªa™8Ø½1ëÓt·²¢uë×^m;_¢€±pC·Uµ8V«š”h™¥‹¥Õh±˜zІÈCdcä:÷…ÆÀÿ?_ƒ½b +endstream +endobj +8638 0 obj << +/Type /Page +/Contents 8639 0 R +/Resources 8637 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8623 0 R +/Annots [ 8634 0 R 8635 0 R 8636 0 R ] +>> endobj +8634 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.573 619.364 216.297 630.267] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +8635 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [448.024 518.103 483.212 549.071] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +8636 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8640 0 obj << +/D [8638 0 R /XYZ 90 757.935 null] +>> endobj +8351 0 obj << +/D [8638 0 R /XYZ 90 694.089 null] +>> endobj +8641 0 obj << +/D [8638 0 R /XYZ 90 679.519 null] +>> endobj +8352 0 obj << +/D [8638 0 R /XYZ 90 498.028 null] +>> endobj +8642 0 obj << +/D [8638 0 R /XYZ 90 483.458 null] +>> endobj +8353 0 obj << +/D [8638 0 R /XYZ 90 367.885 null] +>> endobj +8643 0 obj << +/D [8638 0 R /XYZ 90 353.315 null] +>> endobj +8354 0 obj << +/D [8638 0 R /XYZ 90 238.589 null] +>> endobj +8644 0 obj << +/D [8638 0 R /XYZ 90 224.018 null] +>> endobj +8413 0 obj << +/D [8638 0 R /XYZ 90 97.337 null] +>> endobj +8637 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8652 0 obj << +/Length 1818 +/Filter /FlateDecode +>> +stream +xÚíZÛnã6}÷W評šáE¤H÷´{¶[ ͦ}I†Ö–c¡¶äJr²é×w(R’)˗dÓfQäÉM‘Ù33çÈÆÞµ‡½7ƒŸ.g¯óR‚ +ïrî)셂!¬ïfޕObr8"cÿ|H°å«hr>¤Øϖw‹x–G“wÉÇ<ÊïÆc;¡L¢åònrÏ6Óx69χDúܔ×oÏ^²µ! a7€9Õ~ߙ)ŽM#ÊT=ã%ùf8¢û/©½¸èY6`H)^?óÞU›m_,£¢0«]õãÕz•±~Ì1".¤7g(nsÏãê`q:5ó,†¯í’,`zxðêrð׀À(öHåÞ DTroº\}ÀÞ Æßz1%½ÛjÖÊ (ƒÏ¥÷~ðë ç ¾*Ä6^åÖ):î‘ +±ð ÓCÏË»uœF«x8â”AÌ'¸Ÿ+â|I!*{¿d½‘¢8€3Œ·ËzƍY–Ì̊û09²¡#"±¡³Žú,¼.çÇðª8qðʘ2xeÁ¼ +ȃ^p2ϒù'ßä:…õ)ñÿÀO³´(õ-õûOiDAÇ?‡ÀÀ£Œ>M¾¶«~efÀ#Ό°™p׳D€LfUÀKÄÎq!HÒæxWIºLÒøƒ™ÈñÖÄ¡ íº ¨$Õü«0ØJRfæ1êØ@öoYR²±¡\$EÏþƒ”E©Ù3Z¯óìS²ŠÊ$³CÙܚ³ˆÍE—#¸Éò¸L¦fÐ4¤ÜDUå¬~n×|Šu¹'ØOîiÿ¬/É0ì„ÔY…#ÕN@UÁ­+f'øƒc07 õWŸ¦ñZ»ª;϶k¸“(Ä +B®Úl)ÊÙxœ¤CHì›h™Ì&Q~½YÅiÙ1Æ1[ÝM€/y¦½k–ô9> ˆ‰6{Ý.¹]¢@4©åq"8wÞ%é4[­„—1êÉÄ…¢R(Ìp.ÂÃN Ÿ;ØÓv08NX`*¸¾è­à +*ïÑÁ¢9À˜¦ñªÕ5¸—©°j]¿kåIØé­ò(NëÌ(ï;€¨™FK!ýº%Â6ï ¦Gyãâ@"ŒÌqñ«OkÓ]‹¢ª¤œ°Þ¦#8`¶©@±~ªÇm2ݲ‡æýY\¹`š@µ˜”y””Åx\™91{w(f×BW‘Æ£³8ÍVI•YŸ º”jæ~ߗõÐ>ۓhãæ‰1-Kc˜­Žé6f‚‘Gúê(€¢) <9^>Ð_±í¬¼ÛYÛÓY¡¼3ù8‰¶èÑmÓTrMàókËä/Þ ¼«Ê˜¨jËÚ<ê@o—;µn©ŽI¡@|{»lÚ¤3@†qÅÂn:ߤSÛôaxD I¯Í͍6ÐÉ(7ð@>Y Ï&£\€~µ¤àîÞuóã!á>¤C\4i N„ €¢¡)Å:ž&zxf>ÞõØ* +¸ÚM·Ï¤;¹ã¬yrvË ¡ª˜|Å2 ÜFmÊ4t‘2ÎïI5´¨¤Ndö‘ +·Ê\Ötω~ML«ÏÛE2]tÈa'0Ò² Vb)®‘ñìێ]ÎQFÖ°z­Ì ݾÀ.¡Û9L +Ô*¯ÂÔÏm™ØP»©1´û̅òÊ[:Ҙ»ýôà 6cºüfQ–ö¹ª3X¦i¢™”‹z×y¸Í²Ü†Àrcw ºF†1%-Sqd9À-Yv«<4åöM̑äV@Kšå5°õ²Ç° \_GnïF\‹ar¬…H¶­·)G´ÃXÈ£y¹›ij®­o©¹-ÆôD—ól³v ×ܕ$nãbHÊãm#h_³Õe#Í,0£ºöGÓ®†8 B Pñ8"8q +ûŽPSrB­P‘¡"Ÿ…ÊS¿j£Rt^5‰úU“è*`'*VX½B9?I¯hÞËØýô + ®Ö+”]½Â\>ë•/R¯tß2¢öèh­‚> endobj +8645 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.643 537.126 229.737 548.03] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >> +>> endobj +8646 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [182.089 296.382 246.767 307.286] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >> +>> endobj +8649 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8653 0 obj << +/D [8651 0 R /XYZ 90 757.935 null] +>> endobj +8654 0 obj << +/D [8651 0 R /XYZ 90 733.028 null] +>> endobj +8414 0 obj << +/D [8651 0 R /XYZ 90 623.807 null] +>> endobj +8655 0 obj << +/D [8651 0 R /XYZ 90 609.237 null] +>> endobj +8415 0 obj << +/D [8651 0 R /XYZ 90 383.063 null] +>> endobj +8656 0 obj << +/D [8651 0 R /XYZ 90 368.493 null] +>> endobj +8416 0 obj << +/D [8651 0 R /XYZ 90 142.32 null] +>> endobj +8650 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8666 0 obj << +/Length 2147 +/Filter /FlateDecode +>> +stream +xÚíZYoÛÈקàS+«ñ܇Ú.Ðf“v[Àuܾd±(‹(E©$¯÷Ó÷?œá14)+´€Îÿ¾~ÝG8úqö—ÛÙÕ;É"ƒŒ¤2ºÝFGJ2„íÓ&ú0'1½XŒñüzAð<.öñúzAñü=í’M¯ÿš~*ââiµò ª4β§õM²y¸K6ëëbAôüÕâãíOWïé¤ +¨ìÔôþè–<Œ(3͊Èw‹%xþõ77#Ûr†ŒÍ7ßOìڒ}“Åeév»]:OöÇ,®ûY´dL!!u´eás“l“Z°$¿së8ÖÃß~Kƹ}={{;û÷ŒÀ[‘Z½\!ªEt·Ÿ}øˆ£ ¼ÿ)ˆ=Ö«ö§ ®Yô~ö÷>i* +ʓ¢g*Ä5Þ^UOŠz´ALTºBŠ·:¯žŽIï“ÅRPpWP¿0$ø“‚U&ÿd£–¢˜ƒ '-EAíºYñÙ:Ù!ݸ§|réMG8"œxÓyE}•¿¡‘§ý•#ntà¯Jsç¯J‹Q-À®ºûæû— ²ZÝ'yRÄYúpoÁ˜æÉ:ÝÇ÷ j©Ôü,ð?­+ÇEʼ@Hôø”à׬Õk\ŒÉþÔ²õS*§ lB¥Þ$àjé!_¿Ú:d#ä”D”Ðf¯"ÉʧýEª!ª#¹”RÌïyY-Àœ¬—'q±~ûëх_YUû—œÿnLHj¤-ÙÄ~6"¦FTҀ(Ÿ¿9$µbïÒ$¯ÖU§U¹ZÕ¬¬íA +’¦ŽN¿ë&ñNÉmêQ:Ô_~اy\ƸãIÕZáO~EŸ”FD¶ÎaùÞ¦ŽëCžXO€́IÒ~Ø[ÈAî4ø!Í30ÁG·PàÞÂ¥õ(ª­d +”î%û3Xè>·ÙUÊyupßÑ@>Ž„éqÙÝ2QíÒr„*!6»¬µKQöö°¡/(RR½:ýÇ´Ú9ªERH' +ÜuW;ÍÌU†âޗˆ›gÑX æ½w_ÄÛsëÍÆ.êüF®T\½Ók3D4éÒ§€¼—IdÓ>Ô؎Gø‡ÇÒà²ËÞ*´³Ï¯ÜZÕÛ´¡”Åq.Âè ‹"—àßÀ‰¢.òda²š·µ±®‰}ŠÍNRBÖo¢nYÁÀó4°Ègâå÷¸KŠ±j +‚jښ=ÐG@ â^™6ᦾápn +7­1ë§ÒåÑúÌaS{<|z‹Q&‘4r,»,Ø¡ëQlj(O>ÎÊà ‡„¡CÚOB‡ìËÐwH«›[ÐÀMƒ\´¤à€…° ’Péj}…†¢JŠr|ßíf]Tm8ۍѠ¶õ> ídÿÛÆY²­ÜÝ.νÄeºñÿ~¶¢7ŵ~¹%4èèëþ‘–žÁ%È𡅧¤b‘g2ùØiÚõ6Ž2DñahJ)gÏHç{ІÃqméýŸë.Y@;¼¸à´ž§¾™aJMR×*×Ò£‚¯ëV{­š^{ëä±wN{Êc߄ò¸w6BGk±8óßÕ-Ç=(3÷»»:ã˜ÚÖóU¾ÿ…X‚p²˜sÜìÁk‘¼™C5w‘I•ßåí¯wIÍ×F¥éF¨²Ú¬Vi¾àL%ÐÇ^¬æ0`À^¨+Í#h‹ÃēnÇ +·è§¼Óõ@è²i?CÛmK€ ܑ¹5ö$!³#Ï;Í084úm­°~ñ¼e1%ÎèGÈKýHH ŠWÍý&-[k¦$Jat¡›¤PsöGHu~c0IXáíuTx-(•Ï†‰h$™îk×n—*w»KyŒï<ŖQÏÀXóFÀ¥ˆ¢¯¤-Ҋ0”6 + +#F¾FÇhiŠ¡Jâé:lÿ~³¾öƒî°Ð.†nˆ"¾õ²°e€®E©/욦%öé¹*Ò»jº´ ‘¡ci é’ÜöXˆ‚ _À‹o ^@*è¦ô¼ămöf¼ P\Íׂ~ž÷Ãú, C)ĺû¿1äĸ€£ €‚Ð À?é×(C pÂÃ…¾Ð‡†}-…0@ëÐ{5\i©¶8†×\ÙiÃ. Æ û"l}ÝÆ/âcˆô/Ã1Ä4ŽîËŒ!^€1 äpÈÃ0 r +É0Ú1e ïú £ÝˆÃg#º2dÿ¶Oa âü@ÚÙ± +Yÿ!’" +z‡h¾ôº˜‚.È·Ã..Ðź_]ˆ tq..Ðź@0K  r.¾-t6Pá¹ Éý¹ {3 +]€§wž4]èóÎ])êªç}ûè}¯Ê85ªeX$ŸkíÊq“Í{€|ÕÐöė>ÕЃݽ°–ë TcJ Hº0fvÀ¸Dö@Ó9³=9g¶gÌN|db¶§\LP ú•0Aà +@´9 ·SÈ«UK~0×[¢Ýù§w=y>ËÁŒ_ úÜzã3Î'¤ºÒÚúu8ÓÛ‹Ú£Bœ:› Àw–½UÁ`«C—ÁØÔº^8[A>‘}Ï +}bžVÝyÂézÉ!5J3Î.ƒuývxVRjd áœyT²FQ@ÂŒ‚#aê²Îs×v\±ÕË?6å«Icurÿ(“â÷ !æÞB‹ó‡Ø›Âêê³Ý +üÖV¥1¢N¶Z£ï“&ŽœdÿŠš»Ÿgµåzn®b¸Í»ª:®®®Ñ]‰òôX ´º:³«çsFoð°®«Ü6SëþPxñÓ^îk£<Óÿ²)õe +endstream +endobj +8665 0 obj << +/Type /Page +/Contents 8666 0 R +/Resources 8664 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8623 0 R +/Annots [ 8647 0 R 8648 0 R 8657 0 R 8658 0 R 8659 0 R 8660 0 R 8661 0 R 8662 0 R 8663 0 R ] +>> endobj +8647 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [325.899 665.144 431.977 678.061] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +8648 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [338.748 654.467 444.511 665.371] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Generalized_Image) >> +>> endobj +8657 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [454.44 493.804 513.996 504.708] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +8658 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [365.617 386.202 476.603 397.841] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +8659 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [392.893 372.968 498.655 385.843] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Generalized_Image) >> +>> endobj +8660 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [454.44 212.305 513.996 223.209] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +8661 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [323.631 116.658 429.297 129.137] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +8662 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.215 104.703 409.977 115.606] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Generalized_Image) >> +>> endobj +8663 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8667 0 obj << +/D [8665 0 R /XYZ 90 757.935 null] +>> endobj +8668 0 obj << +/D [8665 0 R /XYZ 90 733.028 null] +>> endobj +8417 0 obj << +/D [8665 0 R /XYZ 90 472.883 null] +>> endobj +8669 0 obj << +/D [8665 0 R /XYZ 90 458.312 null] +>> endobj +8418 0 obj << +/D [8665 0 R /XYZ 90 191.383 null] +>> endobj +8670 0 obj << +/D [8665 0 R /XYZ 90 176.813 null] +>> endobj +8664 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F8 504 0 R /F13 540 0 R /F7 505 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8680 0 obj << +/Length 2233 +/Filter /FlateDecode +>> +stream +xÚíZÛnãÈ}÷Wð)+«v_Énå$³3 lÀëqò2´DYD$R¡({¼_Ÿê ÉnŠ”íhv‘ òdŠlÖ­«NÕiGŽ¾¿úÓÝÕõ‡˜E +©˜ÆÑÝ:R8Jb†°þµŠ>MALNgc<¹™}ÆÑ +îÿaĔŒžÌª]Ä)ƒ¿ÛèãՏWØmÝ2©Æôër¨Ñ0¯5]Úgº5™U ­Ú%edR!xÌO¾€“6œ¦‰`XØgÁ Å&;â°À+ ûFoY-†_F³“Ä&,‚é$aÒ%6(yS6x ¨LÞ@º[…¦$N&×v­ s'ç;,¤‹/Ý)ƒd“UC?c +šÃ¹?P +Ç(Q¬ß£êsã¦ï`Yen¼*˜êb¿Ü&’Ý@Ž°5~²f¸ÜÊó}Ž+f(é0´Qü®ÌLܗ94’E]¥y}˜Ï9-TÊ—`d´¶õŽ‹{¦q½¾Õ¸ÊŠr—i]Y'ÂNþ~¤iKG[½Î­Íe‘é4ñHWx"Nó¿5£Ð˜c.ƨäì05ƒ6ÐÍїõÔ¤Ã`;ˆƒÒ†™I1ÌÌó¡û²V•Ñ£f`@GÍÀCÍt(ÎR3Xèjß®îÍ\ðx„–%>㒚yǚrqÞÔ^kw·¸FçÿÂ.ðå0Äe›^M…ß98Œs*V¨ˆKÎ~ìþn8ì÷ó}Ã×։R9Raþ@Cò V²¸ÙCÊù"éNç§ÂZ U†„”3óOTC>ohøÌ[Õiõݙq þ$2š)¶EƒDÛ ‘¼l”>DÕgAX^²¤$ä!#›ä>±‰Y»çYÁz†‡’QT~ÕoX®Ëã<ñé7šG]_M'5wŽûÌUKÙý8I~"Zõ>Ióúá(GÔ)tÊe  8•ÙóÐ-4rk MæžDɋ‡¯AuEÁw¹ã+ ãowä¸ßÿ,NXküÍèeù˜"A¢û`ü`„¸£ãÝ®,L35Ç1¾D³hÝ\ÔÍkÞ>é7 çÖ÷Ûú²sÛ¬ÜÖÏC·9徙’…ù`ŽÓùšºS©ÔŒ+Ž5›;®ƒ íÃÚçq[ûå²=º “—‚8ðKh ÿÝß)9±¡³aû×Á#£ãZ =†‘PùLPKý)-æJïþ¨ÁQ2<(‡h««ÏÜ°ž1з©2ÝhE˜ÇY0 3[VL{Ç8À¨ +Óé²Ù‰ã6Àiåkô@D£„C„Á@¦~O©Oÿ<ÃþëE@ڋ²Ùû>]öÍiqjàäCŸ¤t_p.™gR„t§»~F÷ÿË$–°V¾öŸLLÆ!”á¼!2ßh\ÑÔÛýl¸wó¹Èlûão‡¬úf*ÄÄÅñ¯iqlÀE§è£½ SŒ¨…k³f&¶žý3j®þ|eâç϶ L}mVmêz?¿¾~zzBË:ù¾By}½ßo¯OÀ“Büz[7µ+›üË ¸¹3}ý$þÿæ¨6¢ +endstream +endobj +8679 0 obj << +/Type /Page +/Contents 8680 0 R +/Resources 8678 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8623 0 R +/Annots [ 8671 0 R 8672 0 R 8673 0 R 8674 0 R 8675 0 R 8677 0 R ] +>> endobj +8671 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.549 615.519 195.105 626.422] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +8672 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [334.883 531.827 440.282 544.306] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +8673 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [315.008 519.871 420.77 530.775] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Generalized_Image) >> +>> endobj +8674 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.549 386.73 195.105 397.634] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +8675 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.059 289.804 422.924 304.52] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +8677 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8681 0 obj << +/D [8679 0 R /XYZ 90 757.935 null] +>> endobj +8419 0 obj << +/D [8679 0 R /XYZ 90 606.552 null] +>> endobj +8682 0 obj << +/D [8679 0 R /XYZ 90 591.982 null] +>> endobj +8420 0 obj << +/D [8679 0 R /XYZ 90 377.764 null] +>> endobj +8683 0 obj << +/D [8679 0 R /XYZ 90 363.193 null] +>> endobj +8421 0 obj << +/D [8679 0 R /XYZ 90 106.082 null] +>> endobj +8678 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R /F8 504 0 R /F13 540 0 R /F7 505 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8690 0 obj << +/Length 2304 +/Filter /FlateDecode +>> +stream +xÚíZ[oãÆ~ׯ òÐJ@4ž;Iõl“ÝɶØnœ¾l-l"ɐÔz_ß394¥µk›¦y0D‡ç~ùæÐ8ºŽpôÍìo—³‹W’E)J%•Ñå.JqK†°¾ÛFïæ„ –,–c<³ xžÕ‡lýfAñ¼Üßݨm­_çWuVß­VnC›gûýÝú­Ú7j»~S/H2/á¦]¼¿üöâ!†4n)q ¿?Û-L#ÊÒnÇ×äËŒ +<ÿšº‹·d9Ci*ºwþz‚ªgûÕ>kKír‘Ò¹:Tû¬UúµhÉXŒ„L¢%#Î0oÕNÅT±±û8N†ÇŽ$ãR/Ï^^Î~žXÅ1æå1¢‰ˆ6‡Ù»÷8ÚÂú·F,M¢[³ëqÊàw}?ûç ŸuãI1pbˆqç¯v ÅÈz´Ø»Ü +]JÇ ü‘ÉI$þÅÁ®ÀŠTô¢¾Ë‹=xá½Ý(ð`㒒I.À1’ÔYã8éºÐÕ'ó¶´ïQfï +XœMHÁQšx!ڛ¼™€ +Ø÷›”eZÕ>op:/w"@OŒcñÈCDðét›·7V†Z5•‚ŠcD+XkܘИÙæQ_».òö›YôÎlteÀîÎv *æ¶X:µ‚ú¯3À±äâUI”Æ,1΋!÷ÀÅq.ºüór÷û$’½ Övи¨·l—EaóãXÁnS¨øòldH&Ü7AÓü†Ü<))¡¾ŸÈ‘0† âx¬Åd¢s"åvcÂAdßl„œwU‘°¡ÝàG“8D€'¸ +jd¿«ç:ÔgÉ1ÄE #E4æ]9šðC‚’§y!%ˆ@¥‘ÐÇä Nð”(âP⦝?çÈØÌû"3¨>KðŽ¡vRàIcû†ëÙ)ZU7«àýžNXåãŠNbšÝ°Õ ^ …­Tújri +`Ã:ÁºvjVŽÕÖÖÞ\ÝÙ߶Û?ÊHXé2òO#îÀKÇ~I (ø½¦xJh¦CHܺ8Tmbn¡¼…BîK-ä­rÏMIɋëS¨sÄöÖóz8‰†z ø‹?^cUýWt°Ò uù)=zmô`Äâ²My8”…駰†ŠfÓ®»h»×nÒodÅÖ®;µõe¯¶Ù¨­Ÿ‡j7½8eÕáeaÊ|pÒÑáší) d¹O­]qLhv&7ûv˜-û£3:Ñê~"á1À‚Ä´kØ¿ü¸Q•–á‘Éžöx«i·«U^,8Ȕís@͵SáŒ÷Rð÷ ÔÖüL‚óÝTû×Æ#'![@],ô¸ +€‚¡ú‹.æJ{ÿ$ÁQ< –Ãb«“oˆÝ°ÆèË Š4…îÏ'apHg4bê`¼ßü– Ž‚¦!ø} +|“ˆcoà¬vµÍÁ—:¢—y‰UAõõ¹«“†$ë™LîB¦Ùó¸w•)F¥ òÌþ4U¶‹ãëÔ}Ó€¶·>O2€o~šñàŽZrŠˆˆGÓñû´à3O b‡Ó¨ÊvZ@N ·(Š‰|Ä´ …\ò¨µÎÌqKŸºVLoW¦•ì³º¸ÊQ{8oeôóL÷zª“gŒúêx7A‚óþÉG_bzš;ùòñÉWã˜É“/G4aÏqò J§ÇLÐ|»î•.¡ÇÖ£§ógP½‚kiƒ+è§îñ•jo•*¦Š` +n”ÏQþÐ5£ÐS%q<òw×ÌÌRƒ¡t‚|¯:4¿oÊÿÔsôiôÃ(Dú+‡?ÃnÆ*…fúì¡zƛòœ7Äû‰×' ÂdפÐHbÚuÍdÔ5åï]ó³vMà%H8dçÄu ~ªmê˜xD×¼ÍÃCô-“ʼno™­½=ß/!”iœ„–ùÿè—:4!=Ž…¶œš:ð`&Ý׋€iŒxÔi«SŸñèƒgßÿøáõë *E?ߘÈILÿG›½¹ø¢ þ/è┳_k·% +BÌ7ªÁw‡Ës˜£z†auµwÇF¹u•ƒ=j{m-CµÅŠëúh¾Ú˜ûÒm¸V…OÁms×@op„¶ +*ôÖs0GCÍ÷&ßܸ¥ÝˆÍèýfSçW¶¬à°žxß}t(¥pÓÈ»ndãçc>öl/Ôm+|åù!ÿEmÏýN†0å©cY:pèIHáá‹Ø +qUÛJê¢7s5ŠÆ`ւcÓNA}í¿R]vm–Ý|7/¦¿ 1Iž#k‡5èSóaˆç4Ûêxr  `†ù$}¡P™*?Ü#|^•yњx‡G&J`1s[}%7«£A8hRPYýX#|lę£ª>¦Z%­f?EÝÕw3cÛÁ·Ë$F {/Ý´mµº¸¸½½E›‹¼ªQÞ^@]܏Ÿ2œCïºIë¡ì\‘°x0Ÿ»îÙÿß(ˆe +endstream +endobj +8689 0 obj << +/Type /Page +/Contents 8690 0 R +/Resources 8688 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8695 0 R +/Annots [ 8676 0 R 8684 0 R 8685 0 R 8686 0 R 8687 0 R ] +>> endobj +8676 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.333 665.144 425.662 679.859] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +8684 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.526 406.696 322.446 417.6] +/Subtype /Link +/A << /S /GoTo /D (main_Time_Elapse_Operator) >> +>> endobj +8685 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [457.18 406.696 505.099 417.6] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Time_Elapse) >> +>> endobj +8686 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.659 176.223 268.34 187.127] +/Subtype /Link +/A << /S /GoTo /D (main_Widening_with_Tokens) >> +>> endobj +8687 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8691 0 obj << +/D [8689 0 R /XYZ 90 757.935 null] +>> endobj +8692 0 obj << +/D [8689 0 R /XYZ 90 733.028 null] +>> endobj +8422 0 obj << +/D [8689 0 R /XYZ 90 481.422 null] +>> endobj +8693 0 obj << +/D [8689 0 R /XYZ 90 466.851 null] +>> endobj +8423 0 obj << +/D [8689 0 R /XYZ 90 352.125 null] +>> endobj +8694 0 obj << +/D [8689 0 R /XYZ 90 337.555 null] +>> endobj +8470 0 obj << +/D [8689 0 R /XYZ 90 121.653 null] +>> endobj +8688 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F7 505 0 R /F8 504 0 R /F13 540 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8706 0 obj << +/Length 1846 +/Filter /FlateDecode +>> +stream +xÚíYYoÛF~ׯ òÐJ@µÞ{I¡(Ðæ(¶€ë¸yI×6‘TI:Žÿ}g^-˱мøAÐrw8»s~3K\8øuòËùäädA„"Iep~D8P’!lž’àÔÄÂٜ`Œ§§3‚§q™ÅËÓÅÓb}w­“2^þž^”qy·Xx‚:×ë»å™NnV:Yž–3N x¨gÏߞ¼!¤·!U°[Äá8v¿ÉàL#Ê¢†âùa6§O_Q?8aËŠ"ѼóÓ=\Ûm_®ãªrÜÎgêl³Žkm^ æŒ)$dÌA‘ðŠ9Ó—Ú +¦ó•£ã8D–=Kƕ™ž¼>Ÿü;!0‹bÕË¢¡VÙäÃG$0ÿ6ÀˆEapk©²€SÿëàÝäÏ Þk* +ʓ¢g*ÄSÞ^uOŠ-õ„íUºBŠ·:¯ï6:3=› ÊÀîÔ/"2X¤`•{Ù¨¥(æ Ã^KQP{ØP|6NV¤‰ãxŸOνéG„o:¯¨'ù+!b¯ê(FDɁ¿)ç°v4¦"%ù>= L²XÄI²¬6ñJ/“4Óy•yµŒód©³ 8ù©àål(ÿßXàö•¥±Û ⥷E*l…ÈƏ#HC<‰§ésmCJ¢i¾NsýÑ +Ü#œG1ÁA’—–þç$©F˜‚Ó‹Ži6Â-D\¶“ëÓ[ÝVanØiÍ=ƒêÜÀêÏOÖמzUd›"×yíŠK·/XNO딂ÙÈù9ŠÂöøõuZH@%â¸Õnšof D„˜êU]”=‘M>MöØ2ݜ†ILa@‰˜ÛŇDk­Ëj1`Ð1x §ÅÆj&õўAz/ ä‚XV‚Î[yn@çe«ÙQûԅ·S’ìŽÄ9ÈF"ˆC·Ñë/+½© ¯Ç‰uQSÕÉb±ÖùU}½Ôe ÊÞ#¦‚°Sª³,¬½Œ¥œ¦—î$Ió«àãœí÷pIÕ®‡ÓÆÃa8Р4&uÞ¬·¼Šo*Oé _r³ú.ڐ€>›CGœFÃÓníµdÀ¯¼ò(xfm6 ÀÜÂuÙÎl&g59æ~ßÚ ‰Fr֜bp +ØzÎ$ +r‡È>#ç8rÊÿ9!ÞTçÖ99n““qäTÃÈ1sãøG; ~2D)yÆÏÇàgRh?•uR@Ô£ƒï8Œ£OÂ8â!Ž +qô ˆÛ£ÍG£]_ʯ€;òT´“OC;þÚÉg´;2ÚE¢xíÂg´û´‹Ã[ Ìü­¦ã·)òA¤ ;¤[ù +,›ÃoWUz1 Xi! ÖªÚ=Ž èuC!=p²ÕCîb„t)ðÝé|7‚Ê@ ÂvÛ»&ºÙÑPÙ)4õCT¶v€$ŸKóŒE.%™ èiiìbf™J]mh…I:­4-±§²Ä-„:òñžy@OJêI¡¹XGäOü¢s2H]/Ú£8ù,•¥‘Ë +y¯\ÎåÀ¢­Û/UãÂÊA +xJÿ­lâôD¦´q0*'[Î4à"P¤ÚÓY9KüÉD›Î©ý—îN°2:AHésÊz§µ[ˆ×UqÀ,ÅË΀´–ïi“êXâé½\‡2thªʇÆùµL]©ÙÛaº¿nÁ`aéšt&žÞ¥Ë£vé,T¶na¡¯ÌÄÀÏÝT¯Æ0¤¾Æ0+þ­aa|ai +GÒ«1ìü#ˉ¹`¾öïYä)UÛ[T@\@lñ¢‚ãçú›^>Ã^¸Ã& ¬Œ‡XÍ`XeÿRÂ}øÈ +#‚U‰Þé§Mö ûu£Ñô½ù¶—i|±ÖU[_P°PC5½Ó¾sCq*Q÷¥.–zYÚÓmɈ’ ©¢C„ìÏqÈ.šoBýC4mñz½Õ×V½J 6-ñvïwYÙÖ;_Ñþú{„îwû†÷^•ß—U¤DRîtÄUccåã(dÖßÏ!ßlã˜epa®lªæ^¡4µûÍtÏ6Þ~}KÌý:b2^«ëî*¨>Çë4YÆåÕMfê¾=J ú £M¹°à¶[=A{!ŽQ'JÄU÷í¢r;¶zž§¹©åE5íÚmZ_»Tx~péþÉö8‡zÈ9Të®zá +ÔÊ·K˼Ž!Гö"jWpA õR»Içs“l†•$L`´=Ööa¢ˆ„‡~¶ßa/ ¥% ýw`YX†×©qXƒNþ±-í£Ç!÷ðW¥ËïMÉécà8¿‰}Ú2)Üù~iK;‰‘iµL…"•W¤:!dŸ‚fô›+Wºó’P!†[ϼ®ëÍâääöö­*t“§›¥õÉf³>ÙõîWÕ2¹lòbV”º±"Lf¶VÛÑÿõ)@ª +endstream +endobj +8705 0 obj << +/Type /Page +/Contents 8706 0 R +/Resources 8704 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8695 0 R +/Annots [ 8696 0 R 8697 0 R 8698 0 R 8699 0 R 8711 0 R 8700 0 R 8701 0 R 8702 0 R 8703 0 R ] +>> endobj +8696 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.639 588.675 300.161 598.957] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_4a53183970490595ac39c8c070601c6f) >> +>> endobj +8697 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.639 417.895 300.161 428.177] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_4a53183970490595ac39c8c070601c6f) >> +>> endobj +8698 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.347 326.885 435.546 337.789] +/Subtype /Link +/A << /S /GoTo /D (main_Concatenating_Polyhedra) >> +>> endobj +8699 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [454.45 326.885 513.996 337.789] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Concatenate) >> +>> endobj +8711 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 316.987 113.133 325.833] +/Subtype /Link +/A << /S /GoTo /D (main_Grid_Concatenate) >> +>> endobj +8700 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.635 264.507 256.157 274.405] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_4a53183970490595ac39c8c070601c6f) >> +>> endobj +8701 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.708 146.207 250.895 175.273] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +8702 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [448.024 105.059 483.212 136.028] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +8703 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8707 0 obj << +/D [8705 0 R /XYZ 90 757.935 null] +>> endobj +8708 0 obj << +/D [8705 0 R /XYZ 90 733.028 null] +>> endobj +8471 0 obj << +/D [8705 0 R /XYZ 90 584.166 null] +>> endobj +8709 0 obj << +/D [8705 0 R /XYZ 90 570.398 null] +>> endobj +8472 0 obj << +/D [8705 0 R /XYZ 90 413.386 null] +>> endobj +8710 0 obj << +/D [8705 0 R /XYZ 90 399.618 null] +>> endobj +8473 0 obj << +/D [8705 0 R /XYZ 90 259.997 null] +>> endobj +8712 0 obj << +/D [8705 0 R /XYZ 90 246.229 null] +>> endobj +8474 0 obj << +/D [8705 0 R /XYZ 90 89.441 null] +>> endobj +8704 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8718 0 obj << +/Length 2596 +/Filter /FlateDecode +>> +stream +xÚíZ[sÛ¸~÷¯ÐÓVš‰`\ðtúÐÝͶ»Û7ëö%Íhh ²˜H¤JQqüï{p!HPì¤ÞéK_,Üqðû¡ñäa‚'?]ýùîêúmÎ& +©œæ“»õDá‰È¦·š¼Ÿ‚˜œÍ Æxz;#xZ4»bq;£xZoŸ6zÕ‹_Ëû¦hžnnü‚¶,¶Û§Å;½:.õjqÛ̈œÖÐigî~¾~KÈàB*à6•9ö¾?º%M#ÊT·âòf6§O ¾ñ.qlƐR¼Ûó§3§†k¿ß‡ƒ;ín¦èTïöÛ¢ÕfÛdΘ@<—“9€¡¸æ^kû0]-ݺ K„aÚÉ2i†¯~¼»ú÷QíuUìôlÎ)¸_€Ÿ+MRàÊÙI–äżá"§(À.»ŸÕåʝxN&çžu$C$#žu¨ÿJ^ —ˆó‹ÐQ‚r‰+Ʌtòj[)$C’\„!âÈ͍¾]mÞ`1ыMù°ÑÍâ°/–z±*wº:”uupPPA5Š øæ8,\f¹‹AuS$d ­ÒýÙ 2ó Qè„ ˆ_4<h”t‹Þ—Õ¶¬ô·ãÁÂ9É$,Í¡!Õ¬S>ónnÞͧÚ(.ãÓv£M#Ÿ:ÜàÛ¯×n_ܱlëÆMXðÜÔ¡î.ÚÑ®FŽÛ¶¬üÊnS>},·[7¸)ŒDºóGÄ$aŠ!BèåN†ýLd~FGE˜q†„ +ú‚¬êÌȈYsžÁÚ ¤ƒ¡<ógÿøe©÷­Áì&Ú۟‰‘H`#Wª—«C»º¹)«YÛrµ(š‡#P܎ˆ‰èV©Àݦ©g”O+ÀŽdÓr-Mëu"’ÌCɇRWÜɍ#iØO,¯ý…Ž×Ðè˜ Íu»¸ö4ÑÈZqŒ8á½`–¢)(i7eŠ\à‰"ÇÜË(Üe°Ï(Ã4òôwôŒaëUÆÔ3pœ£Iza2e‰„«°¸èŒbÎ? 6äŸ5ð +A3ŒrÉbÛùöX-Û qôAa9}ƧQ–ú´Œÿ^qDuL°‹qVD“u\û8‹c’ä»ü+ÜÖ®ØTAúh&bTOœ— ʌŸZB¯uÝ!‹ìÌw ÿEû5ìH¹mðÀ˜¼šã¢¢Fyⷊ½’³/пպ¨á‚ÈEA¿3HÐ,–˺Y9?d¶Ô~؛Yr6>ö|÷ÓÕ佝Þ;èÜÚõ@Œƒeî tÜn‚¬Šd±y©Ž»{ÝÄb6–®2Ÿ (2ñU’s*eµ„hãÐ G§¯A°ž]®Û1|¸1Ép +T¨Þ“žc8UHʆ‰LæS4(·—Ýâ­08NŸ¾2V4©2Ñw..¤°IÃNђVÌ[H½,×O½] †Àö‚J>Å2 ‹åæĺx¥Í€»ðœ¹µìbDNGloi +§¼9àävìÃN¹¤$",<~wì„̌̀ʕ½q]o·.tïmê՝aP(ÀƒàºŒ x êgx•Ï îëÎ!؇<µ}Z,ëU½+ÊÊ8gë.í¼sÓ)‡(Qñ}„^£ÛcS¥€bñÞѶÍQ§m€Èƒë)ù”bZT+×p¾Å´º)g¸ Ñè=qHH´_¤Étzi2=xqw°ûµÏwÍ×3H”H#˜2J¦eëoïöoÆxgàÓr1Å@Çj¥Á2ÒJ¯ ®Â/‘[I;Å)W Q‚ Ì9EP°Å4oNHŒUÞr1&Ç4ÛÙ{í~—:$al]7~Ü»ÕÉ]·Â‹åÀ ‘2Õgþâ–ió×Å>I$}µ/*[²üVp4ì‚DbȱÄs9ÌÙ<ÅU] l:A;tn¢ƒèLpá¡+0Wóz,FuWì±»+¾,Êê5Õyž _1 8¿Üw®óÙ¼¯Øu·ÈÔVL˼½zèöÖ£3z=3=ƒc4´×t:PAo”ägô† ŽˆP}@j1è2?‰å d ‚ÚÛ£N¡¬Ô† ô¡¡7建3êuµÔ/c.Dk\dçl´ ¯¥=;W¾q¿ñÜwnðã72þW¬•‚ö•uÊ»§ 1§5+Äs"·‘‘&|h—¡gì|âRÐS‘ü”ªÍágoH(yb«Ë «íOª¼W@g!{Šé5ŸžÃˆGq9P„£¹LU!8ƒÐáñ©bŒ¸0:U<@Xä#"eüÚAŋãTMɾPð)u?ͽ#rÂX€0«|8€Ý8e֜ånÒQ&ð1)²/ÁñŠó`}Î ä Q*Ee捣±Þ󌜡nŸª­“$ +yrô `0<-`úÂüyÀ‘óRl qŽÁQ b]l:ò‹«30Ümº‰`. ý~,˜K³æÒ¬«Ic#0’ý‡ÄT, ‚ *é-ØÁƒ÷ԏëê´&1¥.-Q&âÊr²~ñõ]-·õÁDò‰dZr$y­Rs\k6>Gœ³¸Fáò,÷Ÿ@LÛ¸f,–CHk&•ĝ—*F}\¶ªµ¿¤ªý­M½òÔî§Ï ³ao¦ËvãZvX9Ô^ÆîdÈ—Myˆ¯.”Ñ`»Í2}Ä@XfË£¯k˜.‹ö<ßMJ’4CKaD Uˆ%䌚Ñæñ§_öÿO¿ÿÓO¿pg¦â:˜kWB7wi›/{}A ]كo慨M¸ ôŸæ?Š¦,Ϲ$‡À‡ ?Mê!l•¼ñåîkÓÑg¿C‚šõ¿]úyüõêî ßز}P¶þÞ~âK&u`dr9¢nlÙûËzï¬EJ›S•#õ× ˜Ë}]E¥úÄ+²:°&NX! 迂ÅéÂøŸM ðQD¾ôMìÿ˜À]9Ä®Lúÿ1áÊ +}\ìº5ËèžïvÊçº^Ë\çÝüaÆùÔÃö·¢:vU;#­>ÃïÁ‚4#ê  Ôô7­ý#ÝË>MºÖ/./êé5NcÓ¶û›ëëÇÇG´< cUîT¶×ûýöú´à88ÔX„C֝WÞÙ‡+ãÂà®h»Òàÿÿ©FzÄ +endstream +endobj +8717 0 obj << +/Type /Page +/Contents 8718 0 R +/Resources 8716 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8695 0 R +/Annots [ 8713 0 R 8714 0 R 8722 0 R 8715 0 R ] +>> endobj +8713 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [322.376 539.129 385.519 550.032] +/Subtype /Link +/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >> +>> endobj +8714 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [488.213 185.186 513.996 196.09] +/Subtype /Link +/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >> +>> endobj +8722 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 173.231 219.384 184.135] +/Subtype /Link +/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >> +>> endobj +8715 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8719 0 obj << +/D [8717 0 R /XYZ 90 757.935 null] +>> endobj +8720 0 obj << +/D [8717 0 R /XYZ 90 733.028 null] +>> endobj +8475 0 obj << +/D [8717 0 R /XYZ 90 613.854 null] +>> endobj +8721 0 obj << +/D [8717 0 R /XYZ 90 599.284 null] +>> endobj +8476 0 obj << +/D [8717 0 R /XYZ 223.966 176.384 null] +>> endobj +8723 0 obj << +/D [8717 0 R /XYZ 90 159.657 null] +>> endobj +8716 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F8 504 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8732 0 obj << +/Length 2663 +/Filter /FlateDecode +>> +stream +xÚÍZ[sã¶~÷¯ÐS+MW0îÔÍΤÝ8Ó4íl½n^vw4´DÛl$R!©µýïs@€P ¤Ý8™>xDàÁÁÁ¹|ß!ñä~‚'ß_üíæâòJ²‰FZR9¹¹›h<‰$CØü·ž|˜‚˜šÍ ÆxúnFð4.¶ñò݌âi¾y~HÖE¼ü1½-âây±pª4Þlž—×Éz¿JÖËwŌ¨iÿT³O7?\^Ò[F°šæ N½Þk;ÅӉ`D™nf¼%¯fs*ðô-u×±œ!­Eớ©í²ßÄei¥ÝÌ4&ÛÝ&®óØdÎX„„T“9C g˜ëä.©7–d+;c…0 ;‘Œksû⻛‹_.ÜÅR›—Gˆ*1Ym/>|“5Üÿa‚ÓjòXÏÚN8e𻙼¿øÏvG…GLi„1ŸDT""¹]ܝD¼Mª¤(µ"CI—W` ž=Š°†Mš]P+æs\x^^ ì?B%m6|óX ~žQ‹§ñíÆÝYåE‘”»<[§Ù½½Uåî·yªÜÅ+w¹N·IV¦yæO½uÃE²Û¤+8žõ_Úyš;õæD ͉Ur{t?EŒì'Ûooá¬ëëüÎÓ¡ k¸*£,æۜÄ9¨G’\Û5¿{Z%» +vþ…g·„°"Êj½X¤ÙŒÃAět½Œ‹û=س:¶s &êd‘›#|töOï\øô—æ1IšGœ£ ¤RŒ¬+×sÖyâ̕åÕÐ/|;ÆA?hl_uŽFÄ4YUyÑs!tÜ'„1wNѳØ&ÉeRùQŸ¢Q4•”ÆTõo¼®=ýÐl…CoM² M!I[ùYRK·B›ËÖ2Æ¢Ò̀xÏ÷›µ^ÅûÒʹƂ ÏX¾´Úì %1SÀ“µM|„q8@íŸó¯îP¬•LZ+î]~»®ÝÜóÙ©MÄÛøiY/¼lÅ|ÄÃ9˜ ږdÕ£XCÆpùYEvìÎY©WՐm®ÿˆ1 94Òªõçê!-C-‘j~ÍZKÂ¥gœAIRççdñà’ª‡ÚÆ0Ÿ>¦ÕC¨jB®çº“5g"jªœò#Puóp`MoÛnÑ8[ D)R”žŒx%èËXèçàAâ.é|Ĕ¤ȂõÚÂ$³ +š€ à Œ¤âÕB[/ŸÃ™õömA„ßQr,–l¢-Gbjò¡·ñ¹ƒã±چ‹‡8><6‚ +O8\ªÃ„3R’Ë€q4XœÉó-0/ŒÓåéHtx•(’À:q~öJ @¶2²?rº dÖØ)ä„ê¼S=`=¸V:@ªºïõ®â !§âð0„@4›3 +*‹þG Š–#UÃW#‰cH>Boý zÞ% ÔÙ\P°ÞþB< +M¼A +Ptá?ÅPväQøO! []>×õ3][‰cDgîB¼Œ ôBù7‘ ƒJzj„ù$ˆiG‚ø( ’]6~sê@‹;üùf=¬Ñ&³hjJõ +þ3èÉéO†)9œ_.ß'•õ'»Ž»(T“º=›Uùò6YÞն߸œ6PP^Šzñ7àƒý…‹q(Ž„j •oN×]H ʜ +^3Òl“fɧ@lÍ e€*Íî"@onwW&[þÊ3ˆŽ›“f!5(èÑ¡sg´žÁ||Êí”N³pMˆ€³ã¥ÜÌaÔË£T†2 ñŒû\æ+9(ñ)hÈGÆ`¢ˆåoeRµâh}ýiù¯ïXÛßþtùÛHíg´'zœÑº öÉË9ø&adHÑ=Ø Lª54¿nN³¸×G.õ”¸²sÒÒ{f&e•fqåæRKãú3ÌÎÝ¢0ºKŠzò ò,‘6®bN|5w&/D‰B0 Ñ’Зà#d¨6ÓÓ³>ЧÙ*ßîÀœõ1›±ŽOø j¾–§À=é“ Ã#[‰õUž¹EÌ ³J‡ІáRÌ/ÇPÉ^*.›U1¤dCza,œ<á|©ŠÎMžE¬‡’æœDÓo7enW¨úl6F$$/yš&E‘ïíG„÷# ’r°–p$yÀ0F·ÊRRu$×ÑY„šbò2„šGÒç‹ÀdÛ´©ŽóEŽ$ùFM…eÔ±®vÔ\†5øS7í B}hp‡’ÇgZ¿ŒYB4(_‡ŽÇh40Þ¾AÎ"uã=¶h/“™ Çv³¦€[‡d “†m *SÓ8ÞØ[ ÔòýJkÄ¿ÌI%ïÀஏºŽÀÊ7¤j:®º±è6iZÚÚ¡¢ÁRMÿ ìç¥OÓY¡ÊuV¡¶à› g{sÙGEŒ°! ©Ëío³”öV0ERHm²‹žÓŽ§x«s\$ãѬxwBMo‡"ÿQ ½[4xèPq¥ˆNt”º$k{J#2Ìç^éè<Ðyñ;Òy5ÜÐyó NÀñqMçGIÈ‚þHDÇù¼'´Ç{]VVâ):¤ô?žÎÿï4́èŽÎCáxX®òµs—¶Óîè‹!ò‡á£"©±^ˆW€ÐÌg½×Iµ/ŽãÞã0:¿M3:5 +¬[êS„Ú^¦áÌÕ(ƒžB`82€:D@²âNwîC߈ÐÖO§ú§áÄMëvíç“BŠ†>îWM‰C‡%h?{=Íæbú›oìïóIØ÷ªMPÁDÊû¯¢žPëN#yË&„Ú +VºÖK8s™ ŽƒÈ¦ yU¤IÖ´V¾mÞ^'&—¹®öÙªj{ëoóUMå,5.€çrĚv…“È™ëÚ'¯Ob—ß(uf¤˜×¶'Üäuf4“‚ƒÁÌTïÞ±†’‚FQG€nó|c—°D;/Ìñéýæ ûyÏ¥J +‡ÇõSåy91’ý>øëpG–vÙ:% +ÌlJ#ۇ ÆÝ3oNJ õ&a†êÓS@ÆðøGäò'0:ýº¡®½öÿkç =8å'š§Py5’j ?ÜÕq*'8\G%3€/Ý«¸ªØ'#IJO©ûr nEžmžÛü–é˜ädŠ²ß4<è—`Ô})2VôUA~yUØÅiñ˜–î¿š€4oÄ!¡aªüªöï¼JŽl¾ë/ÿ1›ÙÆÏ~û3Ü´Zœ_÷ÅÝòfÛ«¸LÊW„Š°i> endobj +8724 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.639 616.141 300.161 626.422] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_4a53183970490595ac39c8c070601c6f) >> +>> endobj +8725 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.144 575.976 182.164 586.88] +/Subtype /Link +/A << /S /GoTo /D (main_Expanding_One_Dimension_of_the_Vector_Space_to_Multiple_Dimensions) >> +>> endobj +8726 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.502 458.546 241.69 487.611] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +8727 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.635 385.046 163.823 395.95] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +8728 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [486.549 321.593 513.996 332.497] +/Subtype /Link +/A << /S /GoTo /D (main_Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension) >> +>> endobj +8729 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8733 0 obj << +/D [8731 0 R /XYZ 90 757.935 null] +>> endobj +8477 0 obj << +/D [8731 0 R /XYZ 400.69 579.129 null] +>> endobj +8734 0 obj << +/D [8731 0 R /XYZ 90 562.402 null] +>> endobj +8511 0 obj << +/D [8731 0 R /XYZ 213.427 312.791 null] +>> endobj +8735 0 obj << +/D [8731 0 R /XYZ 90 296.064 null] +>> endobj +8736 0 obj << +/D [8731 0 R /XYZ 90 217.288 null] +>> endobj +8512 0 obj << +/D [8731 0 R /XYZ 90 194.354 null] +>> endobj +8737 0 obj << +/D [8731 0 R /XYZ 90 194.354 null] +>> endobj +8536 0 obj << +/D [8731 0 R /XYZ 472.811 117.69 null] +>> endobj +8730 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R /F8 504 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8754 0 obj << +/Length 2190 +/Filter /FlateDecode +>> +stream +xÚÍY[oÜÆ~ׯؠ€» hGsåB ±ì©“ª’Ò>؆@-GÞBr­¨¿¾g.¼îhµq¢¤O$‡Ã33çòïâŧ^üýèÛ«£“7[D( +h°¸º]Dx!‚%‹«dñ~IbÑjM0ÆËóÁ˸ÎãëóÅË2{¸SI_¿Koê¸~8=µÃiÑ6ªusô'÷ª†ÕÇ«ïNÞ2ZŒ2Š¸°³Ö×vÊd?#Ê¢nÆù¥G +ሐ^È7O +y•ÅM³ZS—W«ˆ.U^eq«ìȅºUõŠ„KUl`ˆ!–L`-ôèõÕÑÏGÄà1ŠI&›üèýG¼H`ü»}…‹{3+_pÊàš-.þu„÷*2„1(=DQ§ø¶ÛâîáCë±}„=òþìíC¥Š8‡“q*—gD_Ãå1\$™¼ —gÔN2/éìË Ÿ"àèûì@ÆA7£i“ÓÓ²i­ºãÜJ~aW/+UÇmYûÖÁ1Éû3û½æ0I`ºXƒ.#áôú ¼»ª6û +#cÅa„ÃÞ¯Ï* …Rt@Olµ)‹¦µB]¼´iœe×*ÙnTr}nV.áÁD€¯ +qxHœ‘c»Úu7>Ûp†¢H<#½N}ê€ 2역 }×û"(›¸91…”t“Þ×J;vòÑÎxlCF ¢JÀæÌÿܶÕÖ)¸wR¤%€X;Ùü?uÚ*ë±½@±ü¥Ýƙ¨UU«FmܦeáßúvÎ"œv[O*Ϟ‹8ïõ âE öŒ¨A©0¨¡¯ÚÝž¿¤{^zQCF|Ñ>ׄ»¨÷˜›²Ì¬´Îú_½´Ï:º»èƒÇiô­{¬i.5‡…Ã"SFÕû“B膓À˜ÙÀ˜{/Ââ)ÐIõF&E!îgüâ‘Á˜É¨À?d‡T\Ð/D*€aúÿ¯¯>lbÞTkN"„¯Ož"Յj·uÑxD3†xØ»R[o•G ǽÑÒ[‡bEâ ªÈì]÷ª½sfSæUY¢5{Ñ ˜ +›9Íd€%A¯E½®GHPÎ4½GHívX”Á«8­ïÓÆ «Ÿ•‘‹TʦáT¥?”OkïâÖ§Ùшþ±§Êcgˆ··$ÍUÑ@2Y§…¶$–›Lj6 Ö*º”ݱ7q£šã™?¯Ãâ¬sÉ5o‘:́š.Ýi¯T‰7¯0Œ uyeÆFù3æ¦qè+×øĈœ¿¤öêyéŠq=By¤ìôYc`™&væ>®¬pV«|ú¬¹å4«Œª¢/× ±?Û@&£r‚®ÀŠ-ºê/ ”À=è^L¤zѕ€Ö~U¶‘<<¤vô¥k.%Ñ3¥ëgãуÔLjtô[³“¡Ñô M:ÃyFÌø²RPuú_åKPà'ŒÐI¡fÂÃU&œUX(ɧÐ}Õ[Rn¶ù”nß…wè×ÁÔf(Òïg¸‡OªÐ¬O¹,x[—ù 8oË,+5xÞ§Å';ôcªXñ]®Qž3È/T ÑAÝ ŽÓYïMQWUº»ëMe½‘:íZ1Œ#Õâ³4M ^-Ieˆ"îºöhP λ&S1`L=m“¹²Ó7‘;}©û&#ŠÍ m‚XáN#£žŠ¯Ð Q`᎘˜¹Kemiµáè ðÖ¢¾÷Ÿâ £÷‹îÍùù»NŒÕpçƒy !ëÏHÜ_ …gÛė즮ÿµGÖ$ٍ}h"ÊÊ0˜cÊTAà6¡Ó½-î”·óWݓª?¹æԅñ\£€±úv×€/ÍN0­g§í7]:[_Þõã3Õª:O ?3 ÐM*ÅZÞVCb\+š#~3‰Ø¹P É(Ü[Lk‡ÁŒôœoo²tcø^å7Ê!ԛma¯Ù»h-ÁÐòن²ßŒq³IÓëd›Wsß6ybˆÉ´a›’w‚€ íqíU°9ß혴eïÓÃG€sá`“6ªv}º‰xáôÓ¶2ÿvùêí[ÇDWL.Ue/4`¢h$0*¢!1bæÙGÁPû™|²»3 +'ÑÄ)vtõˆiך{K!õ ŠÈcÛ¾g9ô+›?ÉÞmjL¢Šåv¦_ffFHjæiÌü»Ø¹ª!=søžë5N!µ’€ÿ:…¬ôœÀë2Sòq0BlÍ×v¥ƒ¡J›þ€ô;Ú=CxÈÝoÉ‚ *ÆÄ>|Œ£Ãß4)ú¬Œ“½AŸz‚þ ]㬥= ÀšW\,9{\€!ÂÙþp—CubÂ$váÐÇæésÅn•Ý„©åìÈÍ݁ä(§?rôBqþ…Ú ¡®2¯m 'òÅ +Ê®ò͚Ô4a V9¥m6¥ÙuŸ=Ø¿¦94oŽ´.Çñ;t|öÄf×l¶›jšÛmvì;FˆpПõ6ίäÜbB(¶lێˆ'¢hpÐé­ÜPÁ]oõUGìËz?½bt@B†¢×‰thž÷¥ÖŒOcPP㬏:äÐä»Ö½(¯€b›_÷Ӛ—øøq÷†j[.ό>» +÷úu¦t<m;“~ÈOi‘¼üñ‡·ÿ~}qùz!æ?­ƒÐhíÀÖæ_5(B£µÿªEdzSÓ:­¯ ÜcW ØGW%؇UÿU{½ãßÇEÿ7N+ý³véYFº6ÐGsqr©:Û“ý´èîþqdü{Ø/åˆážܵmuzrr6 ÚiU£´=âìd×åFRIe/¤ïWäe×ÑN Ì Ô¡¹þÿBE,/ +endstream +endobj +8753 0 obj << +/Type /Page +/Contents 8754 0 R +/Resources 8752 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8695 0 R +/Annots [ 8738 0 R 8739 0 R 8740 0 R 8741 0 R 8742 0 R 8743 0 R 8744 0 R 8745 0 R 8746 0 R 8751 0 R ] +>> endobj +8738 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [121.93 356.674 372.559 367.578] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >> +>> endobj +8739 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 301.814 181.845 312.718] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_ebb4df2fa553f9a75fc23f4a3d8aa084) >> +>> endobj +8740 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 262.96 181.845 273.864] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_64edddaeda5b87632fc0d37fd0f56749) >> +>> endobj +8741 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 224.105 154.727 235.009] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_9cbdb37b93b7d66e66a19df8f46a71f7) >> +>> endobj +8742 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 185.625 176.505 196.155] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_def9cf2f5c18bf5fc72e2648e848f8e2) >> +>> endobj +8743 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.408 170.63 450.955 180.536] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_64edddaeda5b87632fc0d37fd0f56749) >> +>> endobj +8744 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 98.885 200.451 109.788] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_9846bc1d16b42521b6cda0e8a4799115) >> +>> endobj +8745 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [227.2 98.885 292.843 109.788] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +8746 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [428.607 98.885 513.996 109.788] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g616fcdc7600a3a11a8a9152e75730899) >> +>> endobj +8751 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8755 0 obj << +/D [8753 0 R /XYZ 90 757.935 null] +>> endobj +8756 0 obj << +/D [8753 0 R /XYZ 90 733.028 null] +>> endobj +8537 0 obj << +/D [8753 0 R /XYZ 260.509 675.861 null] +>> endobj +8757 0 obj << +/D [8753 0 R /XYZ 90 659.134 null] +>> endobj +8538 0 obj << +/D [8753 0 R /XYZ 466.833 584.508 null] +>> endobj +8758 0 obj << +/D [8753 0 R /XYZ 90 567.781 null] +>> endobj +497 0 obj << +/D [8753 0 R /XYZ 90 457.433 null] +>> endobj +290 0 obj << +/D [8753 0 R /XYZ 90 450.832 null] +>> endobj +8759 0 obj << +/D [8753 0 R /XYZ 90 320.788 null] +>> endobj +8760 0 obj << +/D [8753 0 R /XYZ 90 320.788 null] +>> endobj +8761 0 obj << +/D [8753 0 R /XYZ 90 282.053 null] +>> endobj +8762 0 obj << +/D [8753 0 R /XYZ 90 243.199 null] +>> endobj +8763 0 obj << +/D [8753 0 R /XYZ 90 204.344 null] +>> endobj +8752 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F21 2111 0 R /F72 471 0 R /F99 2117 0 R /F98 2120 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8804 0 obj << +/Length 1869 +/Filter /FlateDecode +>> +stream +xÚíZms›Fþ®_Á'f¢ó½pwi;Ó¤Mš¶I\[i'éh0Â6­Plýûî!ì¨m¦í§ƒãXöv÷Ù·[׶^NžÍ&§/³|ä *¬Ù•åcK +‚8%Öla½³ AÌw¦clŸ9ÛA¾ +ægÅvºÜÜD‹<˜ÿ_æA¾yú´šŽ“²ˆJ³F½rå0áü:ûîô!­QF‘Ë%°¢¿õyµ¤ÃÁˆ2¿^qvÑC…¸ˆ†È—‰<_EáL)ÇöÌñ©­²ePFÕÌytåñì( aŠÎmƉ":ùf6ùcB€ ¶ˆ—H2n…«É»_±µ€ùï, òò¬[½je¹”Á¸´.&?N°ú ©å¿Â­v Ã¥¤ aÁ+¶Ÿ­ãåÂðTÃ:‰?(n±]ößcŽË4ƒTi^°Ér³]s™–eºÒËÔΪ-å×foç/'Ö;½öÌñÚU7·õKójµ àu&vÇÓ·t2¥ —ÀHêÓ{|O)ß!ÒÃW¶Ø0•:”·L¬ÅÐÔ§Tï6L“¢Ü¿Qµl4½“#¸ýd?5‚}l?OÁ¨"‡pû..7óÊäz¨…u_|õæ—ùT­cp…gM~>Ænß¾>ûᛟ_Í~iémWÆ;v„ˆd@…跹佈@leašm¦ZDù:,Á`!£Ko.õKùõRµCƒÉ²¡/`j»ŽJäºþŽèPˆ{¢¡´É¢$X<üømEW ×#‡Ñ£ÊÝ=zq"ŒJ &GY åî+TËÓÛõ}R Âä}étŸläW ¤KE€ÚĎ r¼æ¨=ï…XCíˆü#Q@ •4q\l×Þ3†[ƒ…O•÷ÇvycLI–‰-¼Mb$´—ïȷ˸qLë%é•!XS^ÄÅoë$,s“çEºÖ  Í}ÖöÁÕ+EMéJÅ.Â`}”˜ÇW¹ãr;]õ±ïÝ °]ö1’¼QþÃ<\‡øa7ÿϸ"ŸlõÛ~Jžž÷0C\Ÿ>Ô­!Je×Տó+ØåW`ٙ‚W—q°\næçÑbF‹ùYžÂÅ ¡*ÿÃþñ‘·µª‘J€úÊ«…Õ¡Ë’’yE¶AÕI–gCî¾wØÝL©ùØKǟô¸Ÿp1 ù®‰Ï+ ‚å8—´í݀züTK¿Ð ÚP×CVMj½Â„gÏnbóýÛx¹¬®.£j †HÑ!VÄÉõÒ¬­Tu§|˜µS¬Ø¿037æ8…TälÄd†µ»xUɤããZ|?2õïNÜ¿$¬“æƒ\å}*~@t~±)ÀuõÑ: ‹±†Uïn¯aUÕÀÑrxýÂm\ÞtêŒÚÚÁÊ,èh–톮JU)rՎ±Ú#)¦z‚£b²q*aqô DÀýÐOÈh®óµ*8æú¿n5FH½Ã`«¢ÉƒAV}&£råǚŒ¤;ä_j2Pw‰16ë Þ©ª¹ë}BÒ>qˆ9Sbß « ¸Q™ºæmTµzÔ<½§é‘Õ¢¼Ÿ§ë²k4æ•p™*ÄU¯WRÓö—|r- Ï%cLÀs©ýæ͐ (B'ِîý‘} +EéïïS|¬æM•$á‘õîýÓáâe/z#Äu®jÚ'‡‚͘²'/nÑ[ × „IjÖCAùã>¸–” yR>¢EÅÜQ¥¤Zö6,ƒë4 –ó‹› êˆìoN¹ÐÁæâ·‘ˬ§Rô[jMuHœ¤Å˜tG@mt /……®k>Áxg¼^ +JR+µ¢LN¥µ»ù5ÇBà| jö³¯GÀ…CË{-`2­6l\À˜¡ƒxQ4õœ\.†#¹%Šý€!>G0G&—‹'H^%e”P nà>m®œëCáâ3Ä}þ¸ˆQՍÒ~–Þ "„"0éå0ç`>Ìk$¹+š}ßbAÔ8¨ݓËônP’Œ”ƒ€bHrö)æÝPéÝ0„¶uNê§L 씘‡¸k6ö:Z]Fæû…ê"Ä`AuË 0 |Vã›ÔL¼NñÕf§³pð…}' ¹ü±À"^E‰:dš×‡HÃïhW”a4oÞÜW/lOúÛ°ß2UìyT®ó¤¸w0U½£ãæù‡HŸoù5ÿ$ªàVm ßo›œç!¹mԼǘõ´s\€÷Ö9ªöýn¨‚“=ݜÝ?5„§Õ6òG ýCh²<É<óWŒò•Üô}f[sÒç*+cõu5nnÍ1ÕÍOE”æ@˜4B~$ë:7SŠü H6ÒÆHº*ý¢ê$ò"ªM§ÚÙïV}õýDËoË/ñÀkmOoÊ2{zzz{{‹Â­“8ËQ\žfÙòô¾Í·¨€Øva¯jM¯Ò<ªO*aRuðv jÿŸéE +endstream +endobj +8803 0 obj << +/Type /Page +/Contents 8804 0 R +/Resources 8802 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8695 0 R +/Annots [ 8747 0 R 8748 0 R 8749 0 R 8750 0 R 8765 0 R 8766 0 R 8767 0 R 8768 0 R 8769 0 R 8770 0 R 8771 0 R 8772 0 R 8773 0 R 8774 0 R 8775 0 R 8776 0 R 8777 0 R 8778 0 R 8779 0 R 8780 0 R 8781 0 R 8782 0 R 8783 0 R 8784 0 R 8785 0 R 8786 0 R 8787 0 R 8788 0 R 8789 0 R 8790 0 R 8791 0 R 8792 0 R 8793 0 R 8794 0 R 8795 0 R 8796 0 R 8797 0 R 8798 0 R 8801 0 R ] +>> endobj +8747 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [290.341 720.235 358.056 730.141] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +8748 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 697.994 200.451 708.898] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_bb6956f4cc086675f02d421fef46122d) >> +>> endobj +8749 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.18 697.994 316.536 708.898] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +8750 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [349.165 697.994 424.631 708.898] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +8765 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 639.215 200.451 650.119] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_ff1c6d17be391cb22a9c4d4e0fa0feb8) >> +>> endobj +8766 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [227.868 639.215 303.224 650.119] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +8767 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.821 639.215 431.287 650.119] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +8768 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 580.435 200.451 591.339] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_9f616c59b2d80aab9f11db8f3c63883c) >> +>> endobj +8769 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [226.975 580.435 338.396 591.339] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +8770 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [438.53 580.435 513.996 591.339] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +8771 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.717 554.856 245.433 564.761] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +8772 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 520.659 200.451 531.563] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_c4e8228056b829aa7e0e05e1b292d2c3) >> +>> endobj +8773 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [227.788 520.659 305.615 531.563] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +8774 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.796 507.035 243.512 516.94] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +8775 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 483.798 200.451 494.702] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_e315cd842b8a3bd48d730eba070969b0) >> +>> endobj +8776 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [227.788 483.798 312.241 494.702] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +8777 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.796 470.173 243.512 480.078] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +8778 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 446.936 200.451 457.84] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_440d3df9ebc23e058ec03d5606cecda9) >> +>> endobj +8779 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [245.054 446.936 304.611 457.84] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +8780 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [347.228 446.936 422.694 457.84] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +8781 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 400.112 200.451 411.015] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_bcfc281c9ef2a45bcfad5ed4a1109b8e) >> +>> endobj +8782 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [239.574 400.112 313.516 411.015] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +8783 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [349.968 400.112 425.434 411.015] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +8784 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 353.287 200.451 364.191] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_82341fbea6e1c21a80058424c0ccf2d0) >> +>> endobj +8785 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [227.788 353.287 248.042 364.191] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +8786 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [269.173 353.287 344.639 364.191] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +8787 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 306.463 200.451 317.367] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_45243459137b3c9e917bde090a48ba01) >> +>> endobj +8788 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [229.761 306.463 302.03 317.367] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Octagonal__Shape) >> +>> endobj +8789 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [354.874 306.463 430.34 317.367] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +8790 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 247.683 200.451 258.587] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_b6db0040a47381b41656b2846ce782fc) >> +>> endobj +8791 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [235.866 247.683 281.026 258.587] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BD__Shape) >> +>> endobj +8792 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.822 247.683 427.288 258.587] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +8793 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 188.904 200.451 199.807] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_ddf613a0448b642291d5e60910983a81) >> +>> endobj +8794 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.088 188.904 254.688 199.807] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +8795 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.084 188.904 299.811 199.807] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >> +>> endobj +8796 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.711 188.904 427.177 199.807] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +8797 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 103.533 190.738 114.437] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +8798 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.236 103.533 261.85 114.437] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_6a10411642132d2a11144719a8cec9fb) >> +>> endobj +8801 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8805 0 obj << +/D [8803 0 R /XYZ 90 757.935 null] +>> endobj +8806 0 obj << +/D [8803 0 R /XYZ 90 609.491 null] +>> endobj +8807 0 obj << +/D [8803 0 R /XYZ 90 537.76 null] +>> endobj +8808 0 obj << +/D [8803 0 R /XYZ 90 500.898 null] +>> endobj +8809 0 obj << +/D [8803 0 R /XYZ 90 118.612 null] +>> endobj +8802 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F72 471 0 R /F50 339 0 R /F35 2018 0 R /F65 376 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8856 0 obj << +/Length 1765 +/Filter /FlateDecode +>> +stream +xÚíZ]oÛ6}÷¯ÐS&1ÃQ‹a+Ú]dm¶—¶0›N´É’'Éq½_¿K‘’åXþH¢¦m‡ ’L]^ÞsîáIì\9Øy3øõbpö:`ŽD2 s1u$vD@§Ä¹˜8]B“ސ`ŒÝs`7ÊgÑèÜ£Ø͒յšäÑè]|™GùêÅ ó8NËB•¶~e©rxà}¾x{öšVg”Qäs®T}ýlšløC0¢LÖ-Î?tX!>"¤1òËA#/“¨(¼!åؽð$uÕlžD¥2OÞ«©Ê=º*Ã#F8w§ÚèàÕÅàß3Ø!U ¸@‚qg<|üŒ <ë`ˆWè,«V3ǧ þ'·Álƒ¾ëÇm¿‰@XŸ÷?QÊ+wÖïkò+ëØû7çã^“x¦Ò"ÎÒQ¹š«ÃïèñGSr÷Æ4U£ÆÀÆ»¶å'Ì1ü·q–å­.Ìÿ³×‚:!Œ)ð+Ì) +|â C‚fHïU¹ÈS‹Iym¡X÷^ÝfÓ[¿ß¨q™å溘Gcû€K²"N¯ ¤luN‰ á + “YºðV+8¬Û”×qaÚlr„4”B#_G`Õ!eqàÍPÇ"Ü«ñ2Ëû|dq1 +—«Gi;^ #‚&`ùBu L¤n[0£tbÑM“•¹‚Ÿ¶ó +iÐnڍƋ¢öÂR§ +cu9ϖZ€Yª¼º„SPjÑe= »Hc”7ᮖÒg ï t£e6·' +T¦Ü!1-X¡™¢ŒAjŠ‡Ð¢¤‡1dIv£$Y´è©ÉÓ¡†ù)I¶&…âïE:.- qÚ¥ò$@Xˆ¾HÔ8åîšA}Í ‹€ oÃ犑 ýã2[¤“§Ë›´{9€)bAxÄý9`Ã|G´±@Tø= +Î ]u¦y6ۅyé¦Î›Ò=Óóͺl¿mïdõQ²§;ÕèÞ·ÍŽIë6«#ºÒïfY ïç"èë"“ ÷D³q®Êçòãî3G]T!¬ -ï]B°¾”£B)bë.Dw¾ïþåB€¦qt™tâF+H”ÿ :± ÷'n 7·{ !báÜ&Âhˆ²šì™®HҐóïRŒ}IF5;Õ¤4Š.3ó ó€)êÄ1ÊG¯¾ÌsUìZ™8©r š<”}ü»cŸ‚Q­6uXÝLsÏç.Ô¦÷˪t½Q{8))’ßš‘@ z_ƒ‘—*1UÎÃÆàɲQc±<ÀD~\¤½ÔSŒ„î,úÏâÿ¶´y û´‰ƒìӍöy>vO÷dû2SÍêï8Ö«"]‹Å|”îµÄ±$¥É©W½QG Àòá³mH’ÜêïI¬Åì ¤÷»C±jÁþ@I?ÜH AlÁ…M ¸ê.0CÄï§Àl»Q˜>Ó¬4õR¦um»€"LøáLîèdÉpÓÊdÝWk^Ñ!ðÀ¥®„f}'ô©î5ÐRõ¾¼ŽÇšý×±€fàÕÜÂÀ­Ð¼2Ž +uk‰ hijt œÝiˆ’E=S6¥Ýl¾(ï¾ÒcôüYCMC‚M 9Ý?£¿Q©Ê#½­Ô5“_=Tø³=ªíª'¾½üÈûÉOS§EõE\o^,¯•]5êZ~’ˆëVÝfŒEfª^kµm,PÝS 1Géåk“IêÎâ´[ %;J ÁÄa1„FNJ¡OÃ#$ œ;‰Óé^1<Ò5–´ê7öT:XTP‘ð9c›r†·å ï–3î÷%glSip‡œá]r–GÉÙV';ålýi´GÊ$–_GÊø^)ó*Yœjº~×UÔ³pÜK8~€*êYvže§·ê‰ ²cª§Ç*žˆȯŽ ô²0z¥²™*óú(Ik­>/žÎ†2?( >‚ª´- ׬‘ÒJ‚~Ô- øÎú8q°áƕþœiãcœÛÏs<©£'!ÐzGªkǙ#¶êÆÈlKÖ·SÓW”Úq× #̓ÎSý¸ïÌS{2à©ʺV‘‰OÛçZˆpÐ>¼eÒ?€ïùü’"ەÓÚÅúH—uq}xdM¸lÚy†H"ñØÛ·`æ±#Ï×ç‡$ ksǟž§ªÎ/j…<¯¶$ó™ Ùy}’Û³»Õqnsóg¡òŸ<Î]«a¿Gé"JÖñ­U¢9¦‹‘>m­£‹4‰°ûAÕ¥•Ù?N}õÛ ŠçÚ_‚Àãæ˜ÄuYÎ_œ-—K4.Ð"ç9ŠË³ù<9Ûã­Q(DcdZžey3AÀÃYT‚Ï›x@üÿ[eg( +endstream +endobj +8855 0 obj << +/Type /Page +/Contents 8856 0 R +/Resources 8854 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8864 0 R +/Annots [ 8799 0 R 8800 0 R 8818 0 R 8819 0 R 8820 0 R 8821 0 R 8822 0 R 8823 0 R 8824 0 R 8825 0 R 8826 0 R 8827 0 R 8828 0 R 8829 0 R 8830 0 R 8831 0 R 8832 0 R 8833 0 R 8834 0 R 8835 0 R 8836 0 R 8837 0 R 8838 0 R 8839 0 R 8840 0 R 8841 0 R 8842 0 R 8843 0 R 8844 0 R 8845 0 R 8846 0 R 8847 0 R 8848 0 R 8849 0 R 8850 0 R 8853 0 R ] +>> endobj +8799 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 708.189 190.738 719.093] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +8800 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.236 708.189 262.159 719.093] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_d850947fe33d1adad7b33c58ab859ce0) >> +>> endobj +8818 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 671.79 183.824 682.694] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_cecce63184c4367b7e48cd7f35b29adb) >> +>> endobj +8819 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 635.766 192.272 646.296] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_112cc024004bb7146ddccaa837664bf5) >> +>> endobj +8820 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 598.994 241.935 609.898] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_062e6c821cbe563825968a30a108f14d) >> +>> endobj +8821 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 562.969 193.229 573.499] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_f4f6e42cf5b4be24e73efab004e22a34) >> +>> endobj +8822 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 526.197 213.163 537.101] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_cd523ec773dc09fcf2c3ebbbd70b3bc5) >> +>> endobj +8823 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.501 526.197 315.857 537.101] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +8824 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 491.933 189.901 502.463] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_d43b1f8f4b622041e8719a0b26c4a2d2) >> +>> endobj +8825 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 455.534 187.689 466.065] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_345c97f889e2b3dae5f12fcc130a8b75) >> +>> endobj +8826 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.505 455.534 226.693 466.065] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +8827 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 420.523 228.895 431.427] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_085c8cf54c180f7eaf693904cb6ce68b) >> +>> endobj +8828 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.232 420.523 333.482 431.427] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8829 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 385.886 229.503 396.79] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_302728bb407aa3c4137332e3275d21fe) >> +>> endobj +8830 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.84 385.886 334.089 396.79] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8831 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.98 351.248 187.264 362.152] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_5468429667edd0199d41c11d79d3d9b7) >> +>> endobj +8832 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.963 351.248 293.213 362.152] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8833 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [325.131 351.248 371.148 362.152] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +8834 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.711 351.248 455.727 362.152] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +8835 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.98 293.697 187.264 304.601] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_ef0c072f344fd2a732e792578091cc9d) >> +>> endobj +8836 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.963 293.697 293.213 304.601] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8837 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [325.131 293.697 371.148 304.601] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +8838 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.711 293.697 455.727 304.601] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +8839 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.235 281.741 220.058 292.645] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +8840 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.717 236.145 186.348 247.049] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_d9bdf9f5b0e6b90d5c0c173ada762067) >> +>> endobj +8841 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.523 236.145 293.772 247.049] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8842 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.35 236.145 373.367 247.049] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +8843 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [410.82 236.145 456.837 247.049] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +8844 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.717 178.593 186.348 189.497] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_2e81b3aeb6ec2e74bee0cf690d44cd69) >> +>> endobj +8845 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.523 178.593 293.772 189.497] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8846 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.35 178.593 373.367 189.497] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +8847 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [410.82 178.593 456.837 189.497] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +8848 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.581 166.638 218.404 177.542] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +8849 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 121.042 232.76 131.946] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_23d4da5a4d3ccbef1d32597a77661ab9) >> +>> endobj +8850 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [260.097 121.042 335.454 131.946] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +8853 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8857 0 obj << +/D [8855 0 R /XYZ 90 757.935 null] +>> endobj +8858 0 obj << +/D [8855 0 R /XYZ 90 725.174 null] +>> endobj +8859 0 obj << +/D [8855 0 R /XYZ 90 688.775 null] +>> endobj +8860 0 obj << +/D [8855 0 R /XYZ 90 652.377 null] +>> endobj +8861 0 obj << +/D [8855 0 R /XYZ 90 615.979 null] +>> endobj +8862 0 obj << +/D [8855 0 R /XYZ 90 579.58 null] +>> endobj +8863 0 obj << +/D [8855 0 R /XYZ 90 508.544 null] +>> endobj +8854 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8912 0 obj << +/Length 1771 +/Filter /FlateDecode +>> +stream +xÚíZ[oÛ6~÷¯ÐSg5ËHIÅ0`˖bí‚eIöÔ‚"3¶V]\IŽçýúŠ¢l9ò%ŽÓEŸ,ÉÔááù>ž›ˆ­±…­·½_®{'g‚YòÖõ­åaËqJ¬ë‘õ¡ObÞ`H0Æý‹Áý Oÿb@q?‹9Êÿè&òś7úq”–…,ë1ꕹÌáÁàÓõ»“3BV&£Œ"›; J5׏zHK‚ežqqÕ!…؈FÈO;…œÆAQ †”ãþõÀ£}™L㠔úÉ¥¼•ù€¸}™†ðˆÎûŒ3%´÷ÛuïK€l‘ÊPÜAãV˜ô>|ÂÖž¿³0Ø˵æըIJ)ƒßغêýÕõÑñªñ9^Փ8HÀe ®ÕýH)¯¦7ïY†иɲ¸~®ôÉǵb—Õµ–±ÌYæQÄñ—_fA\¬KRã>bŽÃ,-Êíâ.d³å+¨®Ë{µ‰DÛsUn{ù'gµ\X»°+.P$lb E®cë¥_Êr–§E(_Í0âŒDË|&õ ¶H wÍ è4òì~ŽÔïgi¼Ðà¯êmÏ[yÛöM¸yû#ƬC ÜÌPN¢b·…žs¬vÆ*@Z© +%=¢Ì:&ôÀLœa‹Žé8bÍd¯Á˜÷#$„÷Qu+K(ÜˉÔ72–‰|kÛÜVÞ·Š¾ÁóŽnÊ}9D ìºÛ;dÂAŒ à F÷ôH ]D©f ^!\Ab®€·ÕEv«§µQ'O—|míÕ¡!,%ȵéc÷j­ò7´? »ö'CkZû4ÒûS£÷'\™¿d*OôÝ(*þ™¥áÊa"¶1Hy\ÚڜK4d­‰¡R°mâÖ6!˜€\{}âìÚ'*›1c(#.(á‹¢…òT%D’ï\}I\5°‹¹ÔEŽÃŽáၹÄ;º6-ı½«¬«BáXæ~åô7qø1¬ªx_ŸuŒƒ\*Ž¤RÌiv¿Ö¥æR,ƒÂÐ*•†|`lשN¾jFÂ)äÙ´ +¹ÊÝdè_Ñã +ÿ4KýK y~”¥»_SŠæõh•“G¸ºS5$6píUøXÿÆÛLkç<ù€9ýz!õ“,EéXßÜÈr.åz¦4Íæª҉R‡‹p"KGôXb‘Õ$°­He‘\mXc¿µITö'gîH‡胰W™Wû Ãh÷V>í`f™e–w²nüu›Y§ýU*5ñj®O Ú¤nã#ó"°KÅ»guwcfª{Òéî¾3o»¿[1ÞÚ­*Üí¾Î94á"ÙќKd’å ¿ˆþ“~¹˜Êý(Wfeûõ»Qêß,JYŸ£°@³4šæ(*O¦Óøä~…µ"…ØÈi„¨N€vêYޔ©ð0©úÌm<Àþÿ·Õ3 +endstream +endobj +8911 0 obj << +/Type /Page +/Contents 8912 0 R +/Resources 8910 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8864 0 R +/Annots [ 8851 0 R 8852 0 R 8874 0 R 8875 0 R 8876 0 R 8877 0 R 8878 0 R 8879 0 R 8880 0 R 8881 0 R 8882 0 R 8883 0 R 8884 0 R 8885 0 R 8886 0 R 8887 0 R 8888 0 R 8889 0 R 8890 0 R 8891 0 R 8892 0 R 8893 0 R 8894 0 R 8895 0 R 8896 0 R 8897 0 R 8898 0 R 8899 0 R 8900 0 R 8901 0 R 8902 0 R 8903 0 R 8904 0 R 8909 0 R ] +>> endobj +8851 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 719.912 232.511 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_786d96ab353d022f56f211fa26e76766) >> +>> endobj +8852 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [259.848 719.912 335.204 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +8874 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 674.237 180.496 685.141] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_2282182b70472430c77106aecf3c8029) >> +>> endobj +8875 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.834 674.237 283.19 685.141] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +8876 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 639.521 213.153 650.425] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_0f1e6f6f630698056d7e35149796f3e1) >> +>> endobj +8877 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.49 639.521 315.847 650.425] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +8878 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 604.805 238.459 615.709] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_77ae7142afc112b5cc786f24875cc336) >> +>> endobj +8879 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 568.25 205.692 579.154] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +8880 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.19 568.25 261.312 579.154] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_75b26365a17a571d891fe7d0b5ded447) >> +>> endobj +8881 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.65 568.25 332.156 579.154] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +8882 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 533.534 205.682 544.438] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >> +>> endobj +8883 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.18 533.534 261.302 544.438] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_5ef6af0a8b11cc47f885ffc74e7be5b8) >> +>> endobj +8884 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.64 533.534 330.462 544.438] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +8885 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 498.818 205.692 509.722] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +8886 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.19 498.818 261.312 509.722] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_374c1462c19381ba7d0f27f4bbd94a72) >> +>> endobj +8887 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.65 498.818 338.781 509.722] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +8888 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 464.102 202.902 475.006] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +8889 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.4 464.102 300.037 475.006] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_632c2bfa8f851855c68d4c919e1cd237) >> +>> endobj +8890 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 427.546 202.902 438.45] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +8891 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.4 427.546 314.263 438.45] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_a34fb5a16a8af56089e3a09b86263a08) >> +>> endobj +8892 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [155.819 391.365 199.864 401.895] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_98d288c85ce5c2e32cee27f20c6ce7ac) >> +>> endobj +8893 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 356.648 161.677 367.179] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_453d3ceee367754b17c722b66cb03e69) >> +>> endobj +8894 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 283.702 198.011 294.606] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_cbcd7cd19d71e22f0a8deb3dfc536462) >> +>> endobj +8895 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 249.36 205.752 259.89] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_61834f7d3b6629c2aafc5011c258961b) >> +>> endobj +8896 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.089 249.36 276.595 259.89] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +8897 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 214.644 236.745 225.174] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_1af6f8ca3539ffa5cff895d30c7d4d7e) >> +>> endobj +8898 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [264.082 214.644 307.588 225.174] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +8899 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 179.928 267.938 190.458] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_a04426c5a10bb84d277c580d8377a8ca) >> +>> endobj +8900 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [295.275 179.928 338.781 190.458] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +8901 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 144.838 209.627 155.742] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_123c8d12181469abfa5dce562831a218) >> +>> endobj +8902 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.964 144.838 314.791 155.742] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +8903 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 110.122 240.62 121.026] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_7ba29a874c71bb8631504b25945713d3) >> +>> endobj +8904 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.957 110.122 345.785 121.026] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +8909 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8913 0 obj << +/D [8911 0 R /XYZ 90 757.935 null] +>> endobj +8914 0 obj << +/D [8911 0 R /XYZ 90 621.829 null] +>> endobj +8915 0 obj << +/D [8911 0 R /XYZ 90 481.126 null] +>> endobj +8916 0 obj << +/D [8911 0 R /XYZ 90 444.571 null] +>> endobj +8917 0 obj << +/D [8911 0 R /XYZ 90 373.299 null] +>> endobj +8910 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +8972 0 obj << +/Length 2080 +/Filter /FlateDecode +>> +stream +xÚíZmsã¶þ®_ÁOj&‚ñBðÅÓv¦½ÉuòÒ7vòå.£¡%Hf+‘*IÙ§þúî EJ”LŸx—8é˂À]`÷ÙgwRgéPçݍ®Þù‰Häsß¹[8uŸəs7wÞ»Œ'ŒRêތuã|OoƜºÙj÷ æy<ý!¹Ïã|w}m†“´,Tiçà#O*‡ñ/wß]½c¬¡Œ N<ÀR´®?™)­õ0J¸ˆª7·R˜G«…üåY!oWqQŒ'\R÷nqW­7«¸TfäGµPù˜…®Jg0$˜”® +}s7úψê0m(@Hg¶½ÿ…:sÿΡ`¯Ðyҳ֎Ç|®œÛÑ?Gԝ6/is, ><pA¨/Ír?p.µúê9çýD‚7î³leÇq=ùÒ.ìG=÷ÏçÓY–e£O¦q:Ÿ®“4Y'ÿU‡qþ*©ž^ìÛZäôvW”jÝ%ëͬq¬õSõyõ.àN»ö=N|9ÆIh¶ümZ¢¨[¨YY‡FQãÊDåД +ëu٘äŸÖ°(+¨­[€{5é)) Ê‹c¿1“®¶¡LÒu!Ÿ…•¨Y—6ÀaàW3¾6²¬C’ty 9‹ÀUÅvU’N+î­ÙÂЄ…”„Ò™pʂóz4;e¾ÕAqrÎy3{͈iè@°ÏŽŸuH•DÔÐy¡»¥$ÌçCú;W`žª)îîËx~ù)®§6GýT¨ã¨=íŒ@@Òáµ7–] +üKk'—Y3"mº iÓó†€æßODƒï +zFï bm9`ùÝÒ@Oz$’a_Bøl™Â‰ð?_¦(ÁÈÙ"cYüÎÀr¶Â€êÐ÷öÄÕYbø„íKÝâ!b$äòK¤’ß,4ú䔳>ûï;š>‚° _ev ½Þ¥åK“K1|vùc´'/'ŽS­‰Œ>oâÏ”a¶iÝâžÍIîÏcƘçI|¿êĬ:¿ü&y›­7Ûý#„Ð&<¹œ0Û­’tž'H³¸L²£má¬lÑ;Æ)„vÔwás¸óˆ¤^w¨Öú}¸·ÛÉÌg±‰õq‰àîЍ+daúÇ8?‘¼…ôܸ(’ešŒ™‹X¬ Ù\`±^Ò±i&<”ð%×P]z]l!`Qö‰yÖ üá‚Ìي†bz«ÊNê,³é½š6Tªù0ñ!½à||HÏï(æD|„„Erˆøãíð@­­ðÀÅbxT»ÒxZ-Ð ˜ÀÁ¡:pŠ®È $¤^o_4 &8ÑÔKBƒÀb;23Zþé؂€„u/ˆ-Nºä ÁUf›l•-“Y¼šÎVY±Í¡ֆ:k/Ÿö¸÷¯ZrqÆÎ"$¡?„™[ÅERÖ:q»XÞè-Û:Cï[£ÏB_æ“0"ÀùÜ-ãCx$Á ‹/–g\уönê‹ ³ýþ¶âˆùv—ðܯåØ:ˆ“fي¼©G;™Ò÷IDýÁ X¨ð»¨M?ªçì=åÔ'œ Ö²to¨¶å3£ðÿ|ìG€ód Y¨ÜœË¾6 +ôD. Uìïr/ë`W¾qjt¢9bü×s‹u¼‚*·ÔûÑ?êœ÷ðLâÍ&{ÒÍ>&kSeê9qažŽÍ×MöTÁ¹´Bf‚iO``žÿ‚ZÌþ<ÏÖX£ë)fjÕÉà’ ½Q¥-êüP÷쭚ff& —ûԌX`!bAÿ¢¯­OUòÁãûË“ØGØ ò/%ö"YoVÉb7ÝPýâ±T© å+¬/"ÿdpùûsÇKÕ#,¨QŸÙ>,e­ÓÛA¨üÑt‘´6?ÝÇáÃ'û¸ECmäð| Ô¶9mOͬC‰”$ڟʞ€xÐèe&tzß.º¢Åƒ`¨ ñªP]+Ž ½ÙíEs½å6‡^ïëª)dD°cIZ»îŒœØA­7ån,_ZñWø&ãI¹±Nxö2(y©ŽÛþ‹NûP‰=íƒ$hˆ¡YqŸ oÔù4Øq>ýæã&WEÑu’ß6Ù4e¿ÍT½©Y¢ÒrŠÝzY\_k­¶»‰§­xѶˆ¹²‰ß&•fP€Æe–ÿùXf–ªª%íË.øBU :ëF!Y7·xèX“¸gÕçKa1±N~öÖFºëX7¯øçÈËøH'§œÐaªÍÖú·é¢Ë˜íÁ.på€©(`x •†¦DüòØç!=@eÎ¥|æè4"<ôš7K-Í-c–* ¤h³„ˆüXQvQ“ò¡æk57÷»®ËÔ+P(eˆâ¡ñ.Ž°Ÿ\ƒ¢`0®þW+tÒN¼€®D@èJDÑst…:Ÿ¥+œtHW(ûUÐÕq1ГÅïuG×£ŽDЋ°p1mÂâ`lhgy Ÿì.è) 8|–·´õì:÷¼…Ã5oᗳ¼Ú¹÷ o…PÕ­ñ¦æÞ”@äþxëðåcè#ö}÷¸z×Ø'Q-—yÑ[b-éåwU=x£ßuÍŒ¶y±oy›¯öUoóå'(ç¿ÂâЋÿˆÓmՕb?¢(èvjGP‚obc\|µšº·ªBºÙÙ¿ê¿ïGÚ®ûõ2h]­›Ž‡²Ü\_]===‘YA¶i²ÉIR^m6««–v̀,öË"ËíEw–×å0 šŽ¿í°ÿÿ3ŠŽ +endstream +endobj +8971 0 obj << +/Type /Page +/Contents 8972 0 R +/Resources 8970 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8864 0 R +/Annots [ 8905 0 R 8906 0 R 8907 0 R 8908 0 R 8930 0 R 8931 0 R 8932 0 R 8933 0 R 8934 0 R 8935 0 R 8936 0 R 8937 0 R 8938 0 R 8939 0 R 8940 0 R 8941 0 R 8942 0 R 8943 0 R 8944 0 R 8945 0 R 8946 0 R 8947 0 R 8948 0 R 8949 0 R 8950 0 R 8951 0 R 8952 0 R 8953 0 R 8954 0 R 8955 0 R 8956 0 R 8957 0 R 8958 0 R 8959 0 R 8960 0 R 8961 0 R 8962 0 R 8963 0 R 8969 0 R ] +>> endobj +8905 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 719.912 271.813 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_1773f4a296b1e34a24fc238f84d615c7) >> +>> endobj +8906 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [299.15 719.912 376.977 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +8907 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 685.345 212.377 696.249] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_1fbcf2de5cd0eeca6b521e70b7d731a7) >> +>> endobj +8908 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [239.714 685.345 289.846 696.249] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +8930 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 650.778 243.37 661.682] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_6f42f2d4a41b935d5441c51351faffa6) >> +>> endobj +8931 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.708 650.778 320.839 661.682] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +8932 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 616.21 274.563 627.114] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_f6ef577d2302b2baac4689f8766cfb2f) >> +>> endobj +8933 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [301.9 616.21 352.032 627.114] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +8934 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 581.643 216.252 592.547] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_6069a2503278c2ba8d0f3c5b80dba198) >> +>> endobj +8935 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.59 581.643 328.042 592.547] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +8936 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 547.076 247.246 557.979] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_1760892eb5a3f38323cff257495f1711) >> +>> endobj +8937 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.583 547.076 359.035 557.979] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +8938 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 512.508 278.438 523.412] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_ac2ae1578a08e1613a4e7ddfa0f4b711) >> +>> endobj +8939 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [305.776 512.508 390.228 523.412] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +8940 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 478.314 193.577 488.845] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_60b58548061b148441614897071b152f) >> +>> endobj +8941 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.393 478.314 232.581 488.845] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +8942 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.059 465.464 248.845 475.369] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +8943 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 432.788 193.577 443.319] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_451da71733ac3915319b8bd36744d415) >> +>> endobj +8944 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [220.915 432.788 277.691 443.319] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +8945 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.892 419.937 252.677 429.843] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +8946 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 386.888 255.564 397.792] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_d00fd827006fff19ba3d2bec4da28267) >> +>> endobj +8947 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 350.63 223.465 361.534] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_7ba23c56994f511973d468959040f4a6) >> +>> endobj +8948 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [250.802 350.63 326.158 361.534] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +8949 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 316.063 285.651 326.967] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_aaf96fa77980ed96433261f5dd4c8f5a) >> +>> endobj +8950 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [312.988 316.063 388.344 326.967] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +8951 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 281.496 217.109 292.4] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_5c527292c276945f5ce0bdc9b41ed37c) >> +>> endobj +8952 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [244.446 281.496 319.802 292.4] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +8953 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 235.969 271.126 246.873] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_16579a075dfcd1fa22ac02bcc859353b) >> +>> endobj +8954 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [298.463 235.969 373.819 246.873] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +8955 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [214.863 223.492 326.259 233.397] +/Subtype /Link +/A << /S /GoTo /D (main_Powerset_Meet_Preserving_Simplification) >> +>> endobj +8956 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.984 190.443 201.742 201.347] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_cab49f11748c7473f15388191159a798) >> +>> endobj +8957 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.442 190.443 243.629 201.347] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +8958 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.079 190.443 371.329 201.347] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8959 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [223.306 166.011 269.939 175.916] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >> +>> endobj +8960 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.288 132.962 212.768 143.866] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_1be27ff4f03e00236044253c3ddd43da) >> +>> endobj +8961 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.771 132.962 252.959 143.866] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +8962 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [297.896 132.962 375.145 143.866] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8963 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [220.401 108.529 277.928 118.435] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >> +>> endobj +8969 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +8973 0 obj << +/D [8971 0 R /XYZ 90 757.935 null] +>> endobj +8974 0 obj << +/D [8971 0 R /XYZ 90 403.838 null] +>> endobj +8970 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9030 0 obj << +/Length 2940 +/Filter /FlateDecode +>> +stream +xÚí[moãÆþî_¡OW ˆÖû¾ÜC wÍ%Hs€“sS w@K´ÅV¢’:Åýõ}!ER¤DÙìÁ)úÁ–DwgggžgfHâÑϾ½zs{uýN²‘FZR9º½ixå~²R4àã‡(‰Òpÿ;ZÌÂû ãOÓ$šÅëð!jŽKs^àÎ1Ç?O!àqx·j¹œµœŸp<þê„jš©Áìñ&™}x\ßmVmº¤Ñ*{\5±òóM’å§WûCœDa:ûæ·meŒ]4@\£)ø´Þº¯¢ cw +[x»‰JKÍã(ÉgyÆyöúµUa–qþaÄQ²YÇI˜oÒ?_ºI"cQø#毦PñyýNQPNKÉ ‡V ô¤Hhîôü3,ç!1n‹É8ß8'׺rSH+Y89(À|$ˆŠG…L¾Œ3'S›œ‘ŠPä&‡1Áü`þÙCà}÷-zp¾;¼û8_:EÒ Sã(ÛFóÜ©æpfYF'Üœî‰ pðQnˆ yÕIœƒÖö V«ª{%1Ò¥’Ÿ'B緋aÁHÀ–(Ú°—pCÖN{Û•Ñ¢œ¦)4!ŠŒ¯ýˆ¼2"åH28à±:2n|T\jÄ2R#@¬#´Rú€V‘€–€eª6g1–ÔqpQ;mÅÿ[v‘(jbîå-,À"FܸÂÑ/w¿Œœå[ŒþP^˜ºf˜ÚŒ€§”b±GzçÆ𥶱öHæàÇ~‡¨Þ,¬WÀ»ÇÏ%”"¢i1¾C¨-€Ú¨ÒmÛâþàS5˜R0I[_ÀkÈsy@JÚÍ€”­T %{˜9ûQ’â˜ÁJ*PRž£#ï©`j­ø»8â£ÝúO ¢A FµÓi Çr“+˜9·.žäÀEÐN’!衵qÜ`Ô©qƒÑÂpƒµÍ)n0­Ü`NÔ¹ÁŒÙ›”B8PC‘C€TÀz’Ô @û@Œ¦èIâÍ%ì EŠêgÑC1Uˆsq!;Ђlôœ$‚1¬^°~D<‘ ÂЄ Eà–&ßô® ÌEªÎ`.ãú\úíÆzµZf'è€)~ŽÌ(%ù“ªµ`ÿY=-¤Ël˜ŒÝÁPKÆ®&t˜L9`ªž±Ã¤ÍŒ]莌]V°t05|Â^âe‘°ƒ6a7V9™°ƒ`{ÂW6vퟰ›¥”Z‚3¶2À鑭3à²N@®O P +p\€Å²Í~à=L”äh€P’“@A'Ýe=‡þ]â3c¥ç ˆ‚³Ë3csQ@œž3Ö@”DžD3Jˆéî¹æ lê› +crœµæ¬¦‰Æ{ ’:‡HP#Óz+ÃÌë“ÖÉQSÜlÏ[A£a º¦‘ÃHÆD#­m6îÄIŒ4‚­i®¬c¤폑8Ò#Å9Œ”HaÖ# ’Z_†‘ÿo%|ÑVg||·Ù%‹^©£‘~FÁ\^ë!Ly€Ï!™¹è,’¡W«»Y£Ê¿lø§¶vGó¾ü¦3ëj:H6Lî(‚F +ˎ›Î¬»é(2c=šMgÖl:3ßtfçšÎ èÃÅI7òVv²Ñ\¯­%ìºÖï]ݕ 8ÈIDx‰l³¶¾1҇v´ŒGLŽ¸¢ˆ«çµŠ¡¤¨ëj Ô·VÈj ãO˜òºÐHÑg5WôÉÎûaÖfgEڍ˜°"'ºkۈœ¾kôé}ðýn³5Dk† ùó÷—1“’Á2usw¯•xº²tsÁ³ne²÷ôºÉzdÑA+÷PM/¸Ãù?Ì=G…mŒ„Ãää5¡ÈMÚÞÚfœw–ª£%ÌZ/œUÜçɁóéFYP܇‚@I@CAô ±gBŸÁ<À'øÅϽkéÇ ?e½HHÀf’j_ºƒ„¦ pNØ(„d^Ò/ÌFÄ@¯îH'‘ç’‘Ù}ˆNŽ)XE<üXLC}XC: +ª;riŠ”ŒL¯£DÍ6‹f¡«6ÄíÑ(2b7åSSƒ¦‡'¦Žü±/¨Bq)¡†ïêIã΄>èá ³±õ–tQ2g»Uî~’ÚÏùf½Ýåqòp(±ÏêŒßf¥»(ßGQÒ²>àˆ­ÁVXȄɢ­ÀHêûǖA„›'UöÌl¬Ô¥·aœîcðç4ZìæQ—??Ék´»è”+= ÂëèºjïpÜ,̝›ïRÃõYü9Z¹h³‚k×NzpNêÔ/ó‚Ü4›ÜQ;‘vÆ´ã¸ãv8¼ˆ³î’yîÌk¶Ûnaا©åk×ڒ8€øÎVÐшʵÿNÅ©?åSø¹q‹ËãyèT»øþÂn’ßѓ.g/2£Þ–{L’ZlCñ°¥£ Q‘³7uãYÐÚHJó2âòÇm””ëþ»Éfc`³;ÇcKpªCÑûu9võÎÒ¢¬žM÷¸¥ÊÄøÍ·7Zû¼çíÆ7ëÛYÁ4bûÜO…{±‚|õ8‘Âdó òŽš-ìéý½?µKŒFEƒxþæ ì—-=>:LóHãÎûŸB±¡B½Ñ<Ò ²©„`¸Ý®]ës\v{Ý‘ñØcÛj/öÙãÈÖwà}úRÎ. P"èà&è #ˆœ¡£ rÿ‘sì²à9Kõ0@%+Õ~{ér& ïÿøz¢¡£%0ïïÛºüæaZ]Mðæ¡ÝÛd‹«8,Îú _nV­Ëǐ€²@Œ÷ÀøX àÀžú܆ +U/(ßF©O½|펨7”:£‚c‰KqÔLþæ»`6+üè‹&Õ>LàžEº¤‘AywÎ-•¦y-eãÉmÞÀAæq×“n~á:»?Ó}Å=j†ä'ón !Ízʤ²ÈÎÄ[î$žM¼ÍÎsZBÓÛÙÕN=ìa(klÃFAÓ|÷†!nŠ)Œ®:»ý9| ҜF,“Dضê m%@íÌ|zw»,Kƒo°EI_M„JÅ[ AsȆï5œ(ÅÉ)D0¯^0ôžuWô¼ ‡›Æ‰ÁMÈüîV¦ÑM.|€ Ò +¬[JÑ”üø]ˈ\"ÐÝ·ø]s‰ÜPõŠâ÷ Í×Á²ócËv½aX³þš¢DÁéÜ©>HKx6_@4]Tô}ÿ°xßPÂþBbë^öPƒ‰fHßØøMסÿY¼é9ñωÙ×=ݏ¿eQú‡‰㬀ídW4Ì~|6C…K¨†*–égʀ¶>D.»•ýkT|ûë• âƒ¾æé?v¨ –y¾}}}½ßïю§Ê(¥j®û¥Ö›Ô/?NààÚÖv¨iÿÿ mú +endstream +endobj +9029 0 obj << +/Type /Page +/Contents 9030 0 R +/Resources 9028 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8864 0 R +/Annots [ 8964 0 R 8965 0 R 8966 0 R 8967 0 R 8968 0 R 8986 0 R 8987 0 R 8988 0 R 8989 0 R 9032 0 R 8990 0 R 8991 0 R 8992 0 R 8993 0 R 8994 0 R 8995 0 R 8996 0 R 8997 0 R 8998 0 R 8999 0 R 9000 0 R 9001 0 R 9002 0 R 9003 0 R 9004 0 R 9033 0 R 9005 0 R 9006 0 R 9007 0 R 9008 0 R 9009 0 R 9034 0 R 9010 0 R 9011 0 R 9012 0 R 9013 0 R 9014 0 R 9015 0 R 9016 0 R 9017 0 R 9018 0 R 9019 0 R 9020 0 R 9021 0 R 9022 0 R 9023 0 R 9024 0 R 9025 0 R 9026 0 R 9027 0 R ] +>> endobj +8964 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.443 719.912 250.099 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_7153c25dfa21af48271dd46e7e7cde7f) >> +>> endobj +8965 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.258 719.912 289.446 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +8966 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [307.772 719.912 379.512 730.816] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +8967 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [436.747 719.912 513.996 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8968 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [344.304 694.477 439.335 706.642] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +8986 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.207 662.843 266.586 673.747] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_c3d56f02e252446c5844465d94068227) >> +>> endobj +8987 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.509 662.843 309.697 673.747] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +8988 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [336.494 662.843 408.234 673.747] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +8989 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.703 662.843 513.996 673.747] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9032 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 650.888 171.361 661.792] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8990 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [381.237 638.616 480.87 649.572] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +8991 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.091 605.773 250.748 616.677] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_f4416e25871d6e2ee1fd5a09a1f9c343) >> +>> endobj +8992 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [280.068 605.773 357.317 616.677] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8993 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [384.405 605.773 456.145 616.677] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +8994 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 593.818 202.344 604.722] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8995 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [350.005 581.547 446.071 592.503] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +8996 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.017 548.704 265.396 559.608] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_53fb6133be52cbd02a3fc7573900a95d) >> +>> endobj +8997 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [298.568 548.704 375.818 559.608] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +8998 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [407.239 548.704 478.979 559.608] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +8999 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.616 536.749 225.866 547.652] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9000 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.222 524.477 466.67 535.433] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +9001 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.933 491.634 239.984 502.538] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_96712b6e1b0c6ef2ef36177eba8a5f7b) >> +>> endobj +9002 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [245.633 491.634 280.82 502.538] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +9003 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.855 491.634 405.104 502.538] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9004 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.703 491.634 513.996 502.538] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9033 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 479.679 171.361 490.583] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9005 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [347.257 466.199 432.092 479.357] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +9006 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.436 433.362 251.209 444.266] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_2d82b566c9bebad2adaaa3b5ba0e923b) >> +>> endobj +9007 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.361 433.362 290.549 444.266] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +9008 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.719 433.362 409.969 444.266] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9009 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.703 433.362 513.996 444.266] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9034 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 421.407 171.361 432.311] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9010 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.114 407.926 456.992 421.084] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +9011 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 375.089 224.57 385.993] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_723455890ff6a03f145169e411c83289) >> +>> endobj +9012 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.908 375.089 327.264 385.993] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +9013 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.542 362.818 347.869 372.723] +/Subtype /Link +/A << /S /GoTo /D (main_Time_Elapse_Operator) >> +>> endobj +9014 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 340.934 212.377 351.838] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_6f68d17132551d9a40f661fcd911b482) >> +>> endobj +9015 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.95 283.864 264.574 294.768] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_32c9572669f8c0490cd714af2731b62a) >> +>> endobj +9016 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [293.611 283.864 368.968 294.768] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +9017 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [300.92 259.638 413.759 269.543] +/Subtype /Link +/A << /S /GoTo /D (main_pps_bgp99_extrapolation) >> +>> endobj +9018 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 214.84 248.929 225.744] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_52fc679f0d74857dacafb72b57ab5c37) >> +>> endobj +9019 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [276.267 214.84 351.623 225.744] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +9020 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [303.801 202.568 367.562 212.474] +/Subtype /Link +/A << /S /GoTo /D (main_pps_certificate_widening) >> +>> endobj +9021 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 133.678 200.451 144.582] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +9022 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [211.191 133.678 251.997 144.582] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_57be1b41dad904bf9936df4560df720b) >> +>> endobj +9023 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.334 133.678 354.691 144.582] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +9024 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 86.288 200.451 97.192] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +9025 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [211.191 86.288 251.997 97.192] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_280aacebc757d7ab2a23ff2e282aa10b) >> +>> endobj +9026 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.334 86.288 354.691 97.192] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +9027 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9031 0 obj << +/D [9029 0 R /XYZ 90 757.935 null] +>> endobj +9035 0 obj << +/D [9029 0 R /XYZ 90 148.399 null] +>> endobj +9036 0 obj << +/D [9029 0 R /XYZ 90 114.987 null] +>> endobj +9028 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R /F97 2175 0 R /F38 342 0 R /F98 2120 0 R /F34 2406 0 R /F35 2018 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9079 0 obj << +/Length 2162 +/Filter /FlateDecode +>> +stream +xÚÕZÙrëÆ}×WàÉ«ÄѬ@åJUr+ŠÊ±]ò•?\»XŠpˆ%(ZïžÄBˆ‹DÙ΃D,ƒžžéÓ§Ï €';ÿ¼øûÃÅՍǜõœ‡…`Gz Jœ‡Èùâ‚X0™Œ±{7!Ø Ë4œÝM(vóÕË2ŽÊpömòX†åËõµ¹œdu׶zd—paòóÃ7W7„t:£Œ".$¸¢ûúÚ4éùC0¢,hZÜݏX!²5ò׃F>­ÂªšL©ÀîÃ$ nœ«°ŽÍ•Ïñ".'Äwãl—ÂeÂSF/þñpñ¿ f°CôD ‰$Î<½øò3v"¸þƒa¾|g£[¥§ ~WÎýÅØNúðWARÇ=nFᤠaOX·ól±û¬ÜÃn•Àé”réÂ`’§,³úüž[/cs§~)b;¢kßítüpkÚô= (¬i’/¬ÁÆr”T¿¬³y­¦‘{n’ îWùºœ0éÎíy‘o¬Û€}%±FÉBͶšthƒ0·å„ 7OÇÜ|D¸?„Ä÷›FAÐim|¯mƒÙHgyxÛU½¯w;›2AB– @¦q˜EcÎ ä¤1ø2bM"Ò¦Á<Ì ,-<£­b?M²yža<®b A¢¯aìêFàNBL¹O¹3¥ aSý'JEψóe* íŸMVGöžùd³à³n¥<«6šŠ¡u¯ ÀèÓîݖ1ò ¶šùêE ttœƒI„ayœ@@¾ÍŸûMXTc0ˆy«ÀœM£MR/Çâ/Å_ &·¹yZPƒ@Ӝ *=GPÃ(šUE8g[àU3@ö,NãèôPo­Ìn>Ÿ¾'Ä‹¢jdÒ)FžÜfq:2éÀ(”7 ²xB†ŠL½Öãʜ׹ýUT§žãy—æXO•:æ˳:L²${‘Š{ĸ‡r](pË9ÚëqÎÕx–Íx s›3 îﰇh[Îæé èҐ)}¶4•⿝|Í)z>áü´:‹ìWþm$Û93Z.ÞuC +ÄÏæF·¼"?éÉ + 1é)ýA`Y$Ï»2Nsÿgõ/Þ¡àw`ð?B,f“ôs5»€u>{Œg}7¢w€ò³¶¤Vq˜áj5 €ªˆç À€‚Àê@_þWo$ï"³Lž–qyt€ÞS i´½¼)d$BÚâ $w͈ÌEuØ­‚ªY•7υõÀ‚YÑVëU­KÏÀÐ&Q‘×=…ÏCã#©Ë`Éæ3ٖæÍljõ”½cêŠoîLõ&‚ûˆ“7&¹${R\?#aŽ‰×Ük¹«ÙmÑn1ÑiG%â<lõ,Vh [á# S›w +‡aY'ájv£Šúvè½>|8ôƒÁ^Q„p‚a50%¦Óê©ã’" ‹9êuß ÿ 8?àj#L²!ߨUoŸazJÎT¥~ƒ­’ë³O8ŸçÔVK™ºjn™ŸÂŒÂœ,ìPÞAUg)"Z@ýZ(¹>ÎéôÔ+c?+r +KµSw¹ß­X´ÿdØ2mtE óýën%ÍÐ>ÇJ?E#ˆ +ÒCŒí[ïóæ=—Ñ«vÞ«¦À—Í&Dno¦ô6õ¼B;1oAËaI¯ ƒcu¡HÊWtáíˆEÌDø{U  4uôDàªª'Q¬ö²"³÷Bžeí&Ú×#æo5oÇÞj +D)ëù8’¯{ín”¯3,`¯åoSêÔñÝíõµq…ö_Ÿ2$Ú Žv‹¢×7eÝî¿ií2Ô¹·VÕ^šßu¦vhzïwIÌ;èÃ]ÒÎ[>r,M…5“}:ú±ÔB¼Ñ˖`66âMBÔËzb^*Èqi œ–Š8&-WúsŒÜ„>u|áWç&Õ»ö{åêî<Ù«_]š] *¢aP»ç´'㙂±8e0j—Û­ÖCâzÄ[EEóêh΀EÕËkEte¬ „?€?†Ÿ xàñýEiꩯ#|û¹ NÜ çaÙßNI‘Õ|ëcNí?æäßU\þe"„kçà»0[7[Éj‡°l…FªL™o¦ y7²ÔŒì¿Nsô¯ ­è[‰/»µuY×ÅõÕÕf³Aó +­³¤(QR_Åêj—1;VT·FÍVGš7ú'Éàbîî^ÀüÿPÂÊ +endstream +endobj +9078 0 obj << +/Type /Page +/Contents 9079 0 R +/Resources 9077 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 8864 0 R +/Annots [ 9047 0 R 9048 0 R 9049 0 R 9050 0 R 9051 0 R 9052 0 R 9053 0 R 9054 0 R 9055 0 R 9056 0 R 9057 0 R 9058 0 R 9059 0 R 9060 0 R 9061 0 R 9062 0 R 9063 0 R 9064 0 R 9065 0 R 9066 0 R 9067 0 R 9068 0 R 9069 0 R 9070 0 R 9071 0 R 9072 0 R 9076 0 R ] +>> endobj +9047 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 686.402 167.466 697.306] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_0c8b9e21e6308b5841acc2f1ffef10e6) >> +>> endobj +9048 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.281 686.402 246.638 697.306] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +9049 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 650.265 289.866 661.169] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_91dc05df4b7c844f1f6c9c5419db5635) >> +>> endobj +9050 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [293.681 650.265 359.324 661.169] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +9051 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 603.169 290.971 614.073] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_3b8a6c571be95e78b20207f732cd0848) >> +>> endobj +9052 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.787 603.169 360.43 614.073] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +9053 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 556.073 224.003 566.977] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_c878ab15837984ba2930ef42fa81dc5a) >> +>> endobj +9054 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.34 556.073 326.696 566.977] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +9055 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 521.566 254.15 532.47] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_e45ed9165f98258083b2337c3872acee) >> +>> endobj +9056 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.487 521.566 338.263 532.47] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +9057 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 487.059 284.585 497.963] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_02a568a0ea643d33f943fb6ab98271c7) >> +>> endobj +9058 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.401 487.059 354.044 497.963] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +9059 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 429.639 241.726 440.543] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_df9133b519b04cad51e09ebb9332cddd) >> +>> endobj +9060 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 395.132 249.318 406.036] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_d64b9c9ef7488b49c4f9a4acd3f57491) >> +>> endobj +9061 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.134 395.132 288.321 406.036] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +9062 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [305.875 395.132 371.519 406.036] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +9063 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 360.625 240.62 371.529] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_a944a73dab7e82a786f12d860def325e) >> +>> endobj +9064 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.958 360.625 324.734 371.529] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +9065 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [390.537 360.625 425.724 371.529] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +9066 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 282.38 203.075 293.284] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +9067 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.573 282.38 296.324 293.284] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_25717d92bb71e83e73c686fb6f231efb) >> +>> endobj +9068 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [228.914 163.453 289.556 174.357] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_cb90cd62d5a91523a0f7f7d17a7d380b) >> +>> endobj +9069 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.022 113.006 271.198 123.91] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >> +>> endobj +9070 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.26 113.006 341.902 123.91] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_0b63a885009bef951c4a57e878b81698) >> +>> endobj +9071 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.426 113.006 501.602 123.91] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >> +>> endobj +9072 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [189.178 101.051 203.354 111.955] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Determinate) >> +>> endobj +9076 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9080 0 obj << +/D [9078 0 R /XYZ 90 757.935 null] +>> endobj +9081 0 obj << +/D [9078 0 R /XYZ 90 703.321 null] +>> endobj +9082 0 obj << +/D [9078 0 R /XYZ 90 667.184 null] +>> endobj +9083 0 obj << +/D [9078 0 R /XYZ 90 620.089 null] +>> endobj +9084 0 obj << +/D [9078 0 R /XYZ 90 301.173 null] +>> endobj +9085 0 obj << +/D [9078 0 R /XYZ 90 301.173 null] +>> endobj +9086 0 obj << +/D [9078 0 R /XYZ 90 220.936 null] +>> endobj +9077 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R /F50 339 0 R /F35 2018 0 R /F98 2120 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9125 0 obj << +/Length 2274 +/Filter /FlateDecode +>> +stream +xÚÝZmsÛ6þî_ÁO.5Áx%ß]f./Í\¯MÝؽûd<´DÛl$’!©:î¯ï‚_ Q’ÇÉôî“$ +X,v÷Ùg ön<ì½9zqqtò}À<t@ïâÚÓؓA‚ïbé½÷ ALÏæcìŸÍöÃ|^žÍ(öÓÕým´ÌÃËã«<ÌïOOëÇqRQiǘ)wQf/~8ùžÞb”QąUªµþ^èC0¢L7#ÎÎRG„´BžïòrÅlNö/fšúÑ:[…eT?y]GùŒ(?Jðˆ!|&¤zôúâèó1Ø#•¡„D’ o±>zÿ{Kxþƒ‡Á^Ê»«F­=N|®¼ó£_Ž°5ú¶ÏÊôgʓ°ËZý”ŠJf^5I"-11“âA»×²Ù\eеG%â\l? ¡Z»–÷Y”„kk¦Æ‰œ!†Žlh.%‘sˆ*-D=®(—§§Yç×B|âcd"$4íâã™5qQ~c}õî͑÷~N•ðÏÚèLgTô"³ǵJ#)‡8¤»”bͤ·o_Âr5XÒdj1ɑìæ=ŸU*?ßoMJQA3w'Q˜_fa^Æe®æu\²@!0—ÖÐûaŽC¾¤j*i Ùã8+ö ÷9‡8×ÜÆ{=ý]TnrwœcDºìYæ›È‹H@ÏÍ øºì0YÖ_Òdu_kþ*omÆÞ$& Ô£Æÿ%ë/™5ٌ?´‚‡®€bÈúm¦Ê +‡ª„!Œ[gÙ¨-v®Ì…Ÿ:—Ä +ªuCvëZƒuU¦¨ùa¡*§¡:EYò0‡6A˜¶¶z“ÇËѲþ¯1®ǟ–@îüiÕWwPF2Þc3FõÞlFæm|…Y–§_â52Û)QµOò3J8 \M¯¨ñό}(cN´@ +Ð9bÇgu„Wù½úvü€‘ÄýͼãVA Ã}ϑ‚‚É#­9Ó1ÎG­jÇÈ£ ”9åÐÆAâdjôÞÍ"önèUZE–<_EÅ"³¦MUŒè¬]¡44“DX’©!è\»Xs³Â@¢ýsÛõP›0ÝíÐÓßwQŠ¸f»î»øá×]#ï +h^Yms뭋¦@ÉúñÚU”ùfÑkŸáA˜”1¸¨­†¬IÎ~lÄÔÛ®-Óµ)PÐ((‡1„‘ÖA•€ˆ¢µVÿ†6 y$qrsú0õö yksÊÒEì?a}¡”ŸåQÉàH^cæq±É²4¯6a~vÛªJ„Òþuš×ÚIÚ_ÆÅo›da%×;³Ca °ì_Tq¤øm¨?”¤æÑhÝ"é‘=Ïææ⋠áٙœh֘ütkè')tïj<2PYÚY gû-őèÎ?'ï¾k)9+xÄZÁÄùÂðL‘!=Ü̔æ?/Êð&MÂÕåùm˜¹R•ÒÈóÌb”ªÚŒáÊM@¡“‰zì¶éÜZàÅ«öBDAv–Á0€¶m„j¤”üúÑÓѪõ΋ô‹+óAÅÁØ.=ÕÓé‰\Th*)– û¯I jÉðe“QMr©Ú÷–_¥‹)jÂmDiŶ,;AœÊp±]Ä©'¡r3TÐj¨)椸ߌ<=_bhûûS¸¶õšèØy¾ËB»Ômo[—1ø°^£ÖbµôRZðVp²Y_¶s +—¦²nÑ?q!ȺÓ8ì1tàE"µ„ø»‰’(7×(¯WQSNµ%¦ïn¡ø)N–.»Ã5¸t³KÄèè:ä×·ÿúÏëwç¯"9dW¨õ*Q1*ˆ»Aïãļé`xÐ}ÉVñ".?ºj"ٚ›.ÔÜ7p›f6ñjY .6Ilê£ßMIbü> endobj +9073 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [173.573 695.499 248.929 706.403] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +9074 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.529 695.499 331.472 706.403] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +9075 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [353.509 695.499 416.93 706.403] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_d6f64ccc36541cf23baca88a68ad06d7) >> +>> endobj +9095 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.287 645.677 218.748 656.58] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_d7e1698be31b1b95dc7e28d13ec162d5) >> +>> endobj +9096 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.431 645.677 330.373 656.58] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +9097 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.898 645.677 469.254 656.58] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +9098 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [482.674 645.677 513.996 656.58] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +9128 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 633.721 161.84 644.625] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +9099 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.589 595.854 177.843 606.758] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +9100 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.809 595.854 257.166 606.758] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +9101 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.195 595.854 286.449 606.758] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +9102 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [309.772 595.854 400.312 606.758] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_17e25309469009012f40ed891a2c3f01) >> +>> endobj +9103 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [429.213 595.854 449.467 606.758] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +9104 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [493.742 595.854 513.996 606.758] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +9105 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 546.031 213.576 556.935] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_3f4e612db0eea52c329f5a6be95197b9) >> +>> endobj +9106 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.913 546.031 261.167 556.935] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +9107 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [307.881 546.031 383.238 556.935] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +9108 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [391.484 546.031 411.738 556.935] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +9109 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 496.209 213.576 507.113] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_c262e9c3acc2920c3e3df6fab7852753) >> +>> endobj +9110 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [300.698 496.209 376.055 507.113] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +9111 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.791 446.386 162.157 457.29] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_74dabf047d8ef99e4088e5c410d34e6f) >> +>> endobj +9112 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.848 446.386 358.287 457.29] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +9113 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.021 446.386 513.996 457.29] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +9130 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 434.431 224.683 445.335] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +9114 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.74 384.608 215.202 395.512] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_69571f990b874f16d0f62235088427ca) >> +>> endobj +9115 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [245.791 384.608 305.347 395.512] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +9116 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.345 384.608 432.702 395.512] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +9117 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [442.575 384.608 502.131 395.512] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +9118 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.525 237.112 253.249 248.016] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +9119 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.782 237.112 341.46 248.016] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +9120 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [343.993 237.112 369.896 248.016] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +9121 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.68 127.523 333.036 138.426] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +9122 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9126 0 obj << +/D [9124 0 R /XYZ 90 757.935 null] +>> endobj +9127 0 obj << +/D [9124 0 R /XYZ 90 664.276 null] +>> endobj +9129 0 obj << +/D [9124 0 R /XYZ 90 564.631 null] +>> endobj +9131 0 obj << +/D [9124 0 R /XYZ 90 359.523 null] +>> endobj +9132 0 obj << +/D [9124 0 R /XYZ 90 310.959 null] +>> endobj +9133 0 obj << +/D [9124 0 R /XYZ 90 212.65 null] +>> endobj +8764 0 obj << +/D [9124 0 R /XYZ 90 189.715 null] +>> endobj +9134 0 obj << +/D [9124 0 R /XYZ 90 189.715 null] +>> endobj +9123 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F35 2018 0 R /F72 471 0 R /F65 376 0 R /F95 1788 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9143 0 obj << +/Length 1767 +/Filter /FlateDecode +>> +stream +xÚíYَÛ6}÷W評šÃE)wšAÒ6Í2é¸@ƒ$(¶õÙÒ °#|‚8%Îlá¼r A,OÆؽì†Å:¼¹SìfÉn-ŠðæIü¶‹Ýtj¦ã´ÜD¥]£¶ÜELŒßÌ_<"¤uey\€*ú¬ï̒Ž>#ʂjÅÕõ€â!Bj!?œr™„›ÍxB9vg〺Ñ:OÂ223¿E˨éFé¦áÜe\*¡£‡³Ñß#b°C´£¸@‚qg¾½zƒÌ?v0øK:wzÕÚñ(ƒkâ\^Œ°u:n;?à=A aŽ  aŸuÿŠÓ…>¾ÚwñˆãŽå¬2î:æñkŒidM¼[Eå +LÒ702ƒm)wÿîªè˜Ù¬¿ \SîÌ0ÏÔJ=³ +íef®oí®·*òÛ8)Ñ@,&†±¯¯­,CQ›ie“ýhK–²c)>ôê`—»zõäá¿Ì^– ùÒ¯CÐȀl(i}ú«8Mâ4zcvepıò©Õáy±ˆSÈrSêó,WßMtrÛy ©+Ž0[=³uVÁŠqŽÂí =jԽݮ£ÔâKlá%¾M³"Z  ÀÀ?Œva„}TáÞA!˜ž€‘&µŽ(ÇÀ9¥œ< Ü‹Ÿ‡ì7 y¶r‡ n¢ã:a !ïgçÃtoqXS\‡ÐbrÌÂ÷„=w`ÏÇ{T²“†Õq % âìµ¼3{ IqöX{:Ìäǁ ³oéÓi(#gA¡ç#á{Ç ªªVüôÞȈÞåI<ËA<¤4@Ò§]T»ÌÒ±‡k*í¹§ŠH¶h•*Ø!½€˦î«dèèýËóxµ$[öÛ"Þü¹Mçeiïù&Ûó裫w/Õ#`Â5/‹l= 2¥q²ÇKº*Œ°KPËvÉ!“LM(pú€t°®]§ýœnºK$tÞJ„7IˆDCÂâZźOí{¨Ou·›hÑ{bÉï¢çù4Ò²ö÷Ò1db›ÔG ÕÓ!‹\¥T˜ªùª9'·Y—«õ¦1{Üû>Œå0¹÷¾ûOÜ â·»œº½ìX®X™‚4Ù0ÔY(¼³zAM{òÕðû7oWqjß纑Œ‰{¢—Ìaü<^MÚe<ÔL ,iw“ŠÐp +¡]ïí4<@B|´N#âè2ï +Ul†ŽØÀî#U¶-{mk>ÉjÌÊmŒ³t¯×2¦w3¯\9}L–«°4«b»:Ší75¶ß`¡J´xi¦ 0 QÂ,ªd,³mº°k3sÕ¨ K´Hír=Ù“ ‡Ë0N»oâô6±GUݱ6¶ì0ϋLac `¹ VE4*~ ’­%#Ã4‹¡Y÷F³üûû˜àu?&xî³gÃD‹ûl˜hj´ÈęD‹J﬏—É3I@‘ Žr,‚hàn$Ë»’e»IšÎS,þ…b}¾‹ÿ¿)ûŒ(VÿŸ¬/Q@乿dõ/X0Kõ~&íÿoÎû¿,®T6¨~eo«†enm×27¿o¢âkõÄFÿi˜n+Ž¦ÊsïK!Fêµ*6d>^G‘5ÒXö—S~iðkô%R ÖÄaU–ùôââîîÍ7h›Æyâò"ϓ‹ý`¶¤·µeõxQ•Ï0© +·ŸŽàÿ‹ø5¶ +endstream +endobj +9142 0 obj << +/Type /Page +/Contents 9143 0 R +/Resources 9141 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9149 0 R +/Annots [ 9140 0 R ] +>> endobj +9140 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9144 0 obj << +/D [9142 0 R /XYZ 90 757.935 null] +>> endobj +8810 0 obj << +/D [9142 0 R /XYZ 90 712.404 null] +>> endobj +9145 0 obj << +/D [9142 0 R /XYZ 90 698.096 null] +>> endobj +8811 0 obj << +/D [9142 0 R /XYZ 240.245 623.469 null] +>> endobj +9146 0 obj << +/D [9142 0 R /XYZ 90 607.004 null] +>> endobj +8812 0 obj << +/D [9142 0 R /XYZ 90 481.739 null] +>> endobj +9147 0 obj << +/D [9142 0 R /XYZ 90 467.431 null] +>> endobj +8813 0 obj << +/D [9142 0 R /XYZ 90 246.587 null] +>> endobj +9148 0 obj << +/D [9142 0 R /XYZ 90 232.279 null] +>> endobj +9141 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9153 0 obj << +/Length 1637 +/Filter /FlateDecode +>> +stream +xÚíYmoÛ6þî_¡O› L4_%*Ø +¬];´k×lñ€](¶âh“eM’çäßï(’z³ì$}]‡~"EOÏÝñîIØY9Øùqòp>™=ñ™¢Ð§¾3¿tBì>A‚g¾t^»„ N=‚1vO§»Q±ŽÎO§»›ôæ*^Ñùó䢈Š›“½œdUWFFmÙÅ,Lß̟͞Òyeq”úYßj‘‚e¡•8=ÑB8"¤QòàV%Ò¨,§؝OCêÆë<ªX¯ü_ÆŔH7ΰĈ.¡R:y<Ÿü=! ;¤v”PÀ„³XO^¿ÁÎ֟9ü%]-µv8e0¦ÎÙä— 6NÇ]燢‡æ”!ì w±|ñuRÝÔ ìîف;[yˆ¨ÖÄù•1g]'ë(ÕZӔ·ÖV¯m.õejÝ,FéjS$ÕÕÚ¸i[ÆK4xzÏÁžÀœ;åHøñøzçU²ÉʓÞÞVGßx‰:%al/«åÉIg«êê<.ŠMq́@4Z›)î.S6„nr©ÇJ»&tËF¾ ö«b‚DRøV❀ºšrr® á¾î0ÕÍÆ~ý<ʎl+ëwcyCåÜJ|ÿó«óG/_œ>üûÓù«1Ì ù²y6¸„Œè„(Àù–ÔDÁׯ“,M² õáxÇ×yš,’êÍH¢bØ6R®7>Ü&éҔºH¹ Un’S‡©®˜ÛjP:õ°‚xÕ¹8TÿTÉInò&«:²j–”zÌ6d#xØ*P4dî…:#ˆDzà82U”dI¶ê –°š.“òÏm¶0¢”†Ãñq_.ªhµÉ¢ôüì*ÊÇ"G€ŠÐ𦌠Š¡G-éë¥[A#±)og[u`9PJQ©N`ïÀÀ‚qJîÆÀ|øüƒ@5²…wwÞ偗¡(Ñ÷K¿,'°§Éu¤ú|L´|ŒAb×õUM:;fz§¾£zšüŒA¥îò3%éÍ}ÀêF—Ÿ5‚´ágjÞò³Z ÏϔÖT¯GČI-~Æ­åžðIã[Ƭ0´MMpAªK۔†¹Ý5åÚÖSo’šBCš×öJµ¢¢¦Æ!£4† â'àu:ËïÉëÆ øD> endobj +9150 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9154 0 obj << +/D [9152 0 R /XYZ 90 757.935 null] +>> endobj +8814 0 obj << +/D [9152 0 R /XYZ 90 657.608 null] +>> endobj +9155 0 obj << +/D [9152 0 R /XYZ 90 643.233 null] +>> endobj +8815 0 obj << +/D [9152 0 R /XYZ 90 431.01 null] +>> endobj +9156 0 obj << +/D [9152 0 R /XYZ 90 416.634 null] +>> endobj +8816 0 obj << +/D [9152 0 R /XYZ 90 192.456 null] +>> endobj +9157 0 obj << +/D [9152 0 R /XYZ 90 178.081 null] +>> endobj +9151 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9161 0 obj << +/Length 2109 +/Filter /FlateDecode +>> +stream +xÚíY[ã¶~÷¯ÐSc‡¤H‘rÒÙíN°i6™f§A‚íb ±i[Yr$yÇóï{(R7›cÏ&³ PäI2Iž¿óñëßL^\O..ã(HPÓ8¸^ DL§$¸^濾 (™…c<½š¹W% ÌÞ_{qIÈ`3QĸUš½¾´KFúŒh”´+®Þz¤†é„|uVÈË,­ªYH9ž^Ï:U›m–Öʎü¨Vªœ9Uù†"Âù4Š±:yu=ùuB@ Hã(.ˆx°ØLÞ½ÇÁÆ¿ 0øK÷ͪMÀhÏ,x;ùÇ;§ãG/„1 ‰™3Ù:=ݨÜ8o9”tq™ð¡¹ œ!<1§VÌí²}zqÉñøI[]ß9gÜ.í³ºK·n¨.ܔû½«Ôò`ÆÄ}§³v¸¶-f”»\@ºŒÔ­2!ă{•IíuýpÊ +– Êyo†vaN›ˆ®w•×v¤Ñë¼(ÕòPŸQTÂXÀ; BŠQÂ]X^íj[ë"ÿȐÀh؈¨êå|ž©|]ßݨ²,ÊS¦ Ž¨½i¥õf)ŠéT¯Ì3²Î6Õ6mÒƖÌ®@S;S¬Ü©%ˆ Ҋ‡d©ìª‘–I“ÏÍ"5#| +^PYd·y4ݤ{½Ùmìhše.ðK;Û©FAµÐlž¿HHï§6òèô#ÏÅpö{¨BµpU·û2$ƒ¥Ñ)܁“Í:Ĩ¶*‡8 Fý $’pîO@$Š;‘+ „ÅoÔíu^øÂÓ ldñ‰±ýéŠ>ú.rhkŠÅ(r¿¹ Ž£„œ.E„ž,” "£S&vÁ:§f˜Äxú/ÌñN»ûù¢Ø{+G‹ž®þÂÅ" ~&^é6ý‹]1FdÜmzÛ·÷IbH2Ö®ûÜF˜ìñ»~Ùáñ-§Ç›Š1ÚAÊÀöe1q·ï_=%QŸ_ÿËÍËÞ\}÷êç×׿xÄIp™ì"G|¶WïÎ3«Ïga È¡öÛL/týÞ‚!¥IãͼS珦àµÕ¦­w.¡†…ÏN»öe5úä¶Ø7hZYé®Ø¼6˒ØÕRx…æEØ:y‘ €scqp•}vKRû8ÐF ­ëTç:_[™na™Ûo©«ïò…û ÝnË >­»o†š¡YÈXÒ»Ä)ÞÚ5È"«ò;p¾Ê{])dhîYÉñRÃR]WŒÃUó:(‚C¿wK[Ï?Ê ô'ñ˜ü^fÇGÙdéY“ÿ+Rfu°¬ŒþÉÊα2îXoYïY³2þ+cqžô¸½÷‘2‚XÙcRÆ[RƇ¤Œ’2ޓ2>"ePX ûXRDŒ9YäÙµ¹…z×ÄøÒàIw ÿV,š!¹‹™ôŠ8Fø$Ÿ€C1(¯Eæd=û}<"19É/@“~…ךg +6ìWçü4ŸëêÆ£ðͪ9¼ÅƆoÀŽÌϏ¦}2ÂÎöس¶¼D #!»^ª¤†¨Ec±5þøÃý„õ.t,ÃO+pÎƅÿGUïʼò Ž“"u¹Sþ ë“A·d#wU È3W}µƒ:4•C*E…# %²Û¡6Ø~N ³½ëb${$}ðH‘ˆÅgOË®°Û„<]+ˆ¹ž±OT,t>cÀàÓL/oÒÒÕ³E#ápöՌa$ÆN¦¨Äþß$Opp|ÎÁɑƒëb[dÅú!Ô¹)÷з™›*Êr5Zã-D€Û­½¸Ë1¶Ó?±ýÃöÀJ¸T=¢ÿdº£i©Sñc°L@á¾ô!-}*CT姀KÂáL`òÇÂåh‹1\vî壥»ï[Ö®sß {Ósp¡¤³ò4nš=¥âÿ7?&"yQ.æ'o’Ç¡"À#bɞ£t>=V |"å8VßµšŸiüÝH¿6¦‰éãßöø7#Ö=ña +wVš6€­±»‰èÊÞÊmW9T ¸Úíòejo}bØ\à¦UÖÃÝD¿›í6ð¶Û‹‡*ÎáúBYçÈÃ^ÃRAh®k× 'ÓReZ5½ks¶í˜ëa6ÌT¤Z/Ü4(´[Ø(;×`„yÙ¤vÁ­›© +¨>FRc–™Y‚³``žÊèUYlì¤ÛŸL× +>¬K½ðÙUe×âZ#—Æ×m5¯Ó|azYæç(ŠÖLb}ŠùÉ‘O¬Ç[ íÆ£CBƼpJ]æmݐãu‚“ƒæ “vNbP‹ö¼ìã³H‚éa¿nåk·tï‘bXéO6卭BnO•ÑÑ_ŸSã ¯F;ºü,†°g3äH‹QhˆGÙ£Ð|á½"A‰•QâR†¶Ȳæ¨.‹ÝúΗrœ Üß!¶>À…lcâ(ۻӘf-P¿îÒlÜdëRÿþ®h9²ÕlQ·§³©$c ?ü[9–€ùò©ÿ*7ÿ"ƒ þ"’î/|ž ޖ€®]xeT1”Õýl9«ý鈫ýñÏJ•ŸÍ8Ÿ:ûߤyg­a†Öª²/ƒ™Ëµ!x’Þ*匴–ý'hßþ>iê`¯/‘¨\—«wu½_\ÜßߣE…v¹Þ–H×Ûmvq\ÈR€‹NȪõ÷¦h/2:‡ÁMZ·Ý«¡ÿÿ 4¨@à +endstream +endobj +9160 0 obj << +/Type /Page +/Contents 9161 0 R +/Resources 9159 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9149 0 R +/Annots [ 9158 0 R ] +>> endobj +9158 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9162 0 obj << +/D [9160 0 R /XYZ 90 757.935 null] +>> endobj +8817 0 obj << +/D [9160 0 R /XYZ 90 635.818 null] +>> endobj +9163 0 obj << +/D [9160 0 R /XYZ 90 622.093 null] +>> endobj +9164 0 obj << +/D [9160 0 R /XYZ 90 413.696 null] +>> endobj +8865 0 obj << +/D [9160 0 R /XYZ 90 389.327 null] +>> endobj +9165 0 obj << +/D [9160 0 R /XYZ 90 389.327 null] +>> endobj +8866 0 obj << +/D [9160 0 R /XYZ 90 293.909 null] +>> endobj +9166 0 obj << +/D [9160 0 R /XYZ 90 280.184 null] +>> endobj +8867 0 obj << +/D [9160 0 R /XYZ 90 89.441 null] +>> endobj +9159 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R /F113 9167 0 R /F8 504 0 R /F1 542 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9171 0 obj << +/Length 1600 +/Filter /FlateDecode +>> +stream +xÚíZ[ÚF~çWø©)ÌÎ}lZõ¡Q5M¥mBŸÒ‚[_¨mB¶¿¾g<¾c«%ŠxYÆf|îó}ç,ÆÎ{;/F?ÏGwÏ%s<äI*ùÆñ°£$A‚g¾vގ A̛L Æx|?!x집¿¸ŸPÂgƒNÂR´‚ŽbeàóÊÄcç][Ù¹‚¼ö=Øé؏À3ÉÝápJ‰0;MŽhõý2IÂRÖՋƒräbr¶8À’fÇ 7Sn‚©¸3…OOˆÓnuâ4›-“}¼Î›¢’há/ s?˜?e­ü‰^%q–ÛËWA¬ýtñìãÎP–Il¿úÎêóDÛ?¢ u$µylÀEQY»‰•hõÚým©L"Þ¸ñ6ˆC°êÝ(p;0TÁ…"…$åö×:ߧq6$˜!îòºŽÒ½JA{“`cmõãµ]$qø`WðÕ± +édò8 çT”¹È–.ÕlÒ$*5›¤ “4Q%-ˆ­PÚŽ0m¢ŒÙ€yyn­8ßِu yõT Fuì{‰…øsÄ© ¨såÙGž}\é]u“Í:7B:5Õ¡0ˆ pKH+"Ë׳xÉ¡Xý0X/üôý>ÒqÞ³¦c·'Wû?ߦɄŠñ!>“,NÑ#seÊ` ô¼W×}WYZæ{€ïæ$Nƒx•D;?–¡FGmJFR0ƒˆr·‹Åü†Å_ /uhí½Ë/‰Ã.F¸ÆañMâp‘0ƒ(ŸÀ`IÕµ@øbpÄÔõPXÜPøš(ìuQXÜPø‹¡pä ¢à_3 · ºæò蚯†@—( ã> +tŸL¦JáñÓDo @é*0§é¤e†Ø:+Ù~·ˆ4@D="¯¥a=¬ô4E{)ó8Rv“11Œ”[g£ÈÅ>ÐǍUüs• 0'éÅ<usjNó”G¼6O1L-O™…å)³ªÀ¯ZB"F®ƒY ì&3ã$· @šü¡1ìX…‚Ìà @¸íi©¤¦Ksaé²ÐÓ[Š S¦l·.gB@3·<)þïaTªÛ`µ-«Õ¥p"i·ZW~V¢|¾-pRm곸ú`hÌ÷Õ–Uíö¹^Ÿ'hŒòÖ:±Ö¹Õ,ÃÃ.QöÑ_6ƒ\ÑîCþ™@ÿÍ©*˜Lñš%'éÐLInøïT¸Uq¸{¢-ƒà†-ánɖ°ê°å“݄@­«cå?tÊ`²–„ôµ§E‡cµ²€0rˆ^ó.ÝV'8 çDCyÆÌaƒ¦»°«×ãwšÆŽLMj“ÓºôB½)‰jçÉ~µ-ɺåãSF]Uwb“·‰í6±Ý&¶‹'6Ð'฼Ðq»‰’¨ƒ›H¼’܆ókŽ‚Do ïâߎ¾žY^0 Ïi·aðs ƒuëۏAW»> endobj +9168 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9172 0 obj << +/D [9170 0 R /XYZ 90 757.935 null] +>> endobj +9173 0 obj << +/D [9170 0 R /XYZ 90 733.028 null] +>> endobj +8868 0 obj << +/D [9170 0 R /XYZ 90 637.302 null] +>> endobj +9174 0 obj << +/D [9170 0 R /XYZ 90 622.87 null] +>> endobj +8869 0 obj << +/D [9170 0 R /XYZ 90 521.639 null] +>> endobj +9175 0 obj << +/D [9170 0 R /XYZ 90 507.208 null] +>> endobj +8870 0 obj << +/D [9170 0 R /XYZ 211.842 264.816 null] +>> endobj +9176 0 obj << +/D [9170 0 R /XYZ 90 250.229 null] +>> endobj +9169 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9180 0 obj << +/Length 1922 +/Filter /FlateDecode +>> +stream +xÚíZIsÛ6¾ëWðÔJ3Œ…5“C3I¦i:ã&îôf<”Yl¹¨$UÅýõ} ¸J¤$;j&_,ߊ·|~ÄΝƒ7£oFW¯sR‚ +çfå(ìx‚ N‰s³t>Ž ALM¦c<¾ž<öÓÈ¿½žPËl•„ßYÒÝ<ï1hRÈa +èj#¤9ÞSAø2Ñ+HXtè¢Hpð =q›ŽWUv8PŠˆëàê rðÚ–} ïkòXÉÁ’!Ñ!P¾:*Ì_o‡D†lNl”Yïô´PW¿~ â|÷©/)xPDˆ©ÆöRŒ÷EÌúè2¤¼¦^¤[=Б4 +±í“ ÑØv(ïËþ¤¯jqhz¤{™Úڣ쉊êB›V‰vÈ|ÏåÍ×!ºpѺpË:´-Š¹•pšú: èdqGÔ§§ÔWµãÊt¯AÙæîÖÁb]¶†z"h#:çpágeB·ý¬é§b.‡íbù4«Îc´ÙæeÒl"1RJt{È2‘B’Î!5žÝG["Ìi×KC#؄º­–±ªZEb³×Ú´@¦Ên…û;/÷WYrio³íüO½Èë½=^U&Êè%µñj½é‡=e»)r#d04áÈeÞ^–´‘‡•6Š¡Oý<)͔¬Î<'D´Ì¬„r/ËJ(Pƒ}k—:NÀ1—±à֑°•¦Ûg¼ãK(ãüŒDÙêþƒR^›(6QZ0sT•*ü ÓMövV²>äÉ⺠PúhGJŒ'¾ãõpG.…òÄ%Rñ£Qž{åÜV÷KR t :6G +:ȪLšË^œÇ Âô$¦6¤ù>颛‹º^š[/‹åº^ +Þ |4-Š¹'tZ„íso€ž¹zô˜ö4˜DhB(ïé"ˆÙ/ÐÔÅÕ»GÚÆMHC¬1ЃaZùz/L“O0í ¦}m˜vŒÃ7Ӏ‡y£ãvçÔÇò &bïß-~IüG\ӚŠºO𛀃 +€â‘°nZ}ûS?øðxƒ¨ÞžzP£ÖŒ7ŒD%ƒº¬‡> ô”ÌÝöö ñ'{ŸOøó ž?«ìD9힛“Ó\ڝæ2!ª8©¦¹€"ÚÓ\Å«i.<0¡e^iMs͝}XÍja¥˜åÂo=ËÝ{><ˇ¸gà$Îg¹†pk–‹!ªöþa7t´ÎæÂ駦ˆ/Æùü çÿ8ßà>ïBš™+çªáq®çŒsÙÀ G©é‘ñøƒÖ¥’V³¿œêêg[ey‰ôkþA´ÎóÍìêj·Û¡E†¶q°IQ_m6áÕaîkQ!.jàªê¢$­«-,FE;°ÿ±ºn +endstream +endobj +9179 0 obj << +/Type /Page +/Contents 9180 0 R +/Resources 9178 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9149 0 R +/Annots [ 9177 0 R ] +>> endobj +9177 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9181 0 obj << +/D [9179 0 R /XYZ 90 757.935 null] +>> endobj +8871 0 obj << +/D [9179 0 R /XYZ 192.853 628.477 null] +>> endobj +9182 0 obj << +/D [9179 0 R /XYZ 90 612.598 null] +>> endobj +8872 0 obj << +/D [9179 0 R /XYZ 211.842 371.627 null] +>> endobj +9183 0 obj << +/D [9179 0 R /XYZ 90 357.128 null] +>> endobj +8873 0 obj << +/D [9179 0 R /XYZ 192.853 89.441 null] +>> endobj +9178 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9187 0 obj << +/Length 1685 +/Filter /FlateDecode +>> +stream +xÚíZ[“›6}÷¯ /-ž©µº"ðtúÐLҙ´Iwúf<¬-¯i18ÀÖñ¿ï'$ÀؼsÏË.–…ô]Ï9cçÎÁÎÏ£Ÿf£›'sxÔsf+'ÀŽô”8³¥óÒ%±`KWæښ Wªe# ¤]é$D O\%ŸÇ¤ž„JB¨ý¨]&„ $8ƒú†Î’æŽÇoj[DÐ2ÓÖ½Íížô‘ĺ1‚&4y±œN!a(Œ£å<ÌîîuŽŒiÙ@‘Ôp=[gé˜ +w—˜˜u¶§¨)ܞˆÑáà :ëì¨!ùÒë/!îÕ-f6ûËüÎ!š“(Y¤›mXD·±êÏ +% IÀÊ2+°f¹âŸcOÀ²ºA’(¹›ö…²+'³udé`îÍÅ­E%I[•½ÔŽfcèTUbAGÜÄ¿n+¥M{³ÕÞê̼ø¦¤'ð%$rð˂ ­$¾@J%Q>\Jˆ³R®A°NrbÀ༭&ÄCÕÖÜsÛ¤ £gt]!zy·eÕ»Ôêõ=ÀáÕôåô‹×”ûVOˆA= 䐞‡,§9•1jôcÄê =Ô­'$â¾¼šj3Z\ª÷<ÒÚ ²¤Ì·EÚ¹˜L²!]!t´Ò奍.Øb­ì¶†­]éªLk!cX<¸ +!·òr†^  ü ÏUèc ”¶û*±#K’¥‹¥ø+ñ¡;°\Éûùƒã^›}>1Q@®£‹/SrHø* o! +ćä3óOB X ¹Ž #L¼/[pnáü2À€žùð‰ÂdEò͉‚æs¢`Ó<›†‹u…Hùß÷É¢h?¢¶Á£AÍA°«ÅVŽ²FTdöí{ôh Î¯"Mô£ñeOƌ™óя›}sxÒ¡æ ¸. +Ù 2 +:u@¼PŠ$í« èTÖI”,¨-/Òm§wû ꯤ›ffJC”æ †b¨@Á|pèI2ä1r†[èWnùÀܒë炢<¼¾&Éø (ú³¦ùÎ#}äûäó瘪‚®Å8ð!{όãa$@9¿-ã+Nóþâ+ã\—q؅Œ#†Ç?eν3ŒCÆýŒCñë»Ì¥Éü¹;!&výQ#‘¤|'֊ã0Πáé»T8¢$ófÝ8=ßEź“’éË,¬_u¢¿Ðϯu=/Þ+þƒÌúÈ  ÿÛGF™u֎¯Óx%wՑ@±Sêøik0á o-< X›ÉßÉALېE“…Ó $CŒGÿü»Éˆ|%ôc‡èq46œá#O}‰øÿ/Ўïâùÿҟ»”?sK<}Úì۟¹ˆ Á«àªJ‚QŸýX!ŸùháÏ|ø#WÙwc!\ÛP¿…IyÚ]¡Hõ:½U=ˆ‘Æ1ÝýHÿš»/”²NÏþqª«_Fel{‰/£jB\Åvzs³ÛíÐ"G÷I´ÍPTÜl·ñÍiE¬(Ù°êJby2˜V©ˆܔ0qÿÿ»öM° +endstream +endobj +9186 0 obj << +/Type /Page +/Contents 9187 0 R +/Resources 9185 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9149 0 R +/Annots [ 9184 0 R ] +>> endobj +9184 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9188 0 obj << +/D [9186 0 R /XYZ 90 757.935 null] +>> endobj +9189 0 obj << +/D [9186 0 R /XYZ 90 733.028 null] +>> endobj +8918 0 obj << +/D [9186 0 R /XYZ 90 592.843 null] +>> endobj +9190 0 obj << +/D [9186 0 R /XYZ 90 579.151 null] +>> endobj +8919 0 obj << +/D [9186 0 R /XYZ 90 433.46 null] +>> endobj +9191 0 obj << +/D [9186 0 R /XYZ 90 419.768 null] +>> endobj +8920 0 obj << +/D [9186 0 R /XYZ 90 314.802 null] +>> endobj +9192 0 obj << +/D [9186 0 R /XYZ 90 301.11 null] +>> endobj +8921 0 obj << +/D [9186 0 R /XYZ 90 196.144 null] +>> endobj +9193 0 obj << +/D [9186 0 R /XYZ 90 182.452 null] +>> endobj +8922 0 obj << +/D [9186 0 R /XYZ 90 89.441 null] +>> endobj +9185 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9197 0 obj << +/Length 1598 +/Filter /FlateDecode +>> +stream +xÚí™[ÚF€ßù~jA*³s÷ j*µQ5m¥4¡Oi„¼Ø»¸›³dÿ}Ïx|Áf0¬–¢hŸÀÃpæ\¿93ÆÞ­‡½7ƒ_¦ƒ«×’yiI¥7½ñ4ö|I Ä›†ÞÇ!!ˆéј`Œ‡ïFƒlÌލ(¦ËûEfÁì÷ø: ²ûÉÄÇI¾‰òrŽùË.Ê``ôiúöê5!{‹QF>¨R¬õ£Ò҇`D™®f¼ûàB8"¤òÓI!/—Áf3S‡Ó‘¦Ãhµ^ydGÞG7Q6"j%sbDˆ!“ܼšþƒ=R8JøÈg›¯?a/„ñ·)oWÌZyœ2ø\zp¯Ó)CXŠ=§#†/=ŸW:Z¯`¢Ïû\JòÚøü~%Á +Lã\ºý))ÂXõú“"¢êU2ÌÞDÉì}zÆiRÊPƌÍRޘø`>Ñð… -Äþ"½ÙÄâðí©“©åÎÉÄ&‹5z¶‹ó…Í£¿±Àó4Ùäö\eAžföñ;+W‹ý•A¼ä­ceŽ´¢ÕX€Xav;}_ “ ¯Öôcœ,ã$úd' +¼7qL%CSãz$)·xåÛ,) %_”õ‘•¦–ã‹tÆÉ­}¸Žò]%¬Ó­¨Ñ}£(6jòÆ,̶ÓIÃ‹xã0ƒ‚ \O +’°£ÈmƒCùrRŽó[ÒÒ~¨àAUН04@n%ˆú¥7_}žGëÂq“ÖídPÈ'ÝTÀ&'“8q<¼ –q8 ²Ûí*JòŽ.-­5¨Mê˜.2Œ2Fñ# œ"&ÉÓÅ£/ B‚\Ù¨qY“'ÈÊІ18bÞÇÉ<]­!E¯—rÔL§H1,¥y‡·âLފS¼U_‚·/ÓgÞá-¸æ6ÛÚ=ü8p’œU¢ç.äjHañ$ÈõÂT}ãȝ7ap0×À­öþ#‘Ky‘&ÏÌu¤7R ªzñxè‘‚P}„ºò ©ËwƒG€DÍNœè2å¥ÀË„ û×êK÷¶—Ecn< +ÉßùH]›Ålž†QƒÒÓ¨Ó8_žƒ:ˆ-ÒTô .°ŒŽ¯ãàF§JJ±›ªg íÍ6ô&ô=ÅCOƒÂmñt†®¼péžî¿Þ¸ü ^»ãóÉ"‚Ê<”}£jˆwv%n¶óEEÞÀ,ÓópÒh7–Pn/^ØO×:L %ks~¨±ž8„z%­µþŒêtj©µœc¡vFU+Ð-%Ðj¨§:TñŸ*¼áîå8Â~/Ç¥õÞ{g°Æa)ò\‘¡A Ñ5Z`ä] ±}Úkg[«Ëâ%ÃYoþÙ&óÜÙ¬ÁrǛ4(<Öôë…¢}.v”AŠÒ³pÅ}]a«âê+Kzû’]‚@­í»n£jï9¤Bӂe×=íR2á’çõQÀ0¤0/û(öè>J~3}Ô)Z»]ϡіêœÀ›RWë0N}یëöN@¸/8ù À8ËPûØy´õ³u#®e§ïÜrÊÏ!9‹t +äéNo“ä¦IçWya$¥ñòjNñ{^tœS *Ê?u`Tg‚Ž„-¥¨O¾Òó"ÃâçôÚpt³wçE³hoàääKÚ ®Õ-ê¡yºN—éí} zæ'94÷âfJFÛ}úA'Øn9N2Ø(=rØÔÏÈü +zB{‹‰K“¨¸Å»@5¬|A€RsÑ_ò³´ý¯Mtxv¼–|Žön Oø ù,o­ç\­¨@œøOrîa©B³6Lˤ…º0ʃ€ª&5.9 +Nˆ6o¸yèïªc/¯Jíçv…Í}B˟†Ôý¦RàáÖRAž¯Ïn/r­X»¢û&^*ð…:÷E|ñ4íÁgª|»š¼“KÄ¢ oùX¡×>–üµPøÙ÷#!†åAñ ÙˆewFTBñ®Æ bd^!s«ˆ‡¢¨4ÒZö¯W}ûmPø¶Ñ—(8㺄y¾ž\]ív;4ß m¯3çWëõòê0ƒö¤Àñį…ÔÕ°J«PÄ ®Š—þÿ;q|= +endstream +endobj +9196 0 obj << +/Type /Page +/Contents 9197 0 R +/Resources 9195 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9205 0 R +/Annots [ 9194 0 R ] +>> endobj +9194 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9198 0 obj << +/D [9196 0 R /XYZ 90 757.935 null] +>> endobj +9199 0 obj << +/D [9196 0 R /XYZ 90 733.028 null] +>> endobj +8923 0 obj << +/D [9196 0 R /XYZ 90 644.514 null] +>> endobj +9200 0 obj << +/D [9196 0 R /XYZ 90 630.731 null] +>> endobj +8924 0 obj << +/D [9196 0 R /XYZ 90 536.712 null] +>> endobj +9201 0 obj << +/D [9196 0 R /XYZ 90 522.929 null] +>> endobj +8925 0 obj << +/D [9196 0 R /XYZ 431.18 460.258 null] +>> endobj +9202 0 obj << +/D [9196 0 R /XYZ 90 444.941 null] +>> endobj +8926 0 obj << +/D [9196 0 R /XYZ 90 350.299 null] +>> endobj +9203 0 obj << +/D [9196 0 R /XYZ 90 336.516 null] +>> endobj +8927 0 obj << +/D [9196 0 R /XYZ 90 232.544 null] +>> endobj +9204 0 obj << +/D [9196 0 R /XYZ 90 218.761 null] +>> endobj +1308 0 obj << +/D [9196 0 R /XYZ 90 89.441 null] +>> endobj +9195 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9211 0 obj << +/Length 1433 +/Filter /FlateDecode +>> +stream +xÚåYÛnã6}÷W評€š!)ñfÚín±»½¤÷) Åf¡²äJJ\÷ë;iْåKÞmŠ>ْFÙ3‡sH +{÷ö~|7\¼á¡§â”{ã;OaOp‚%Þxæ]û„ PC‚1ö/‚ý¸˜Ç“Ë€b?OWzVē“Û".V£‘½dU©+gc^Yên7ãwoÙŒ†EL@(õX_[“V<#ªµÅåU!B'ßuò*Ë2R†ýq ¨¯ç‹4®´½óAßé" Ò×Ùn…„1?äÌ8¼þpƒ=RÅ!ó¦óÁõ öfpÿ‡/é-k«¹Ñ~Sïjð띆s¶: +Åùjãnö EtB2j’¯V ÅsHE²O!ʃxšÐš1oóòØ­# OÝä'>uë~+åSDžú© þDAs³¸–îYQ°¨£a—Ó ÜåºØK×ì¬>Š/Æ|ùOqö§›éõd\G›#ŒÌ‡3ù‚·Ž~lfxëïm=6ñ)Pˆ›¥ÒCU-FËåMKô˜%‹%ÕÅb‘^ì*זèû›¸F„çùZ’ nÎëc¤üÿC°M +endstream +endobj +9210 0 obj << +/Type /Page +/Contents 9211 0 R +/Resources 9209 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9205 0 R +/Annots [ 9206 0 R 9207 0 R 9208 0 R ] +>> endobj +9206 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 563.557 138.508 574.436] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000031) >> +>> endobj +9207 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 543.468 314.566 574.436] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +9208 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9212 0 obj << +/D [9210 0 R /XYZ 90 757.935 null] +>> endobj +9213 0 obj << +/D [9210 0 R /XYZ 90 733.028 null] +>> endobj +8928 0 obj << +/D [9210 0 R /XYZ 90 534.501 null] +>> endobj +9214 0 obj << +/D [9210 0 R /XYZ 90 519.931 null] +>> endobj +8929 0 obj << +/D [9210 0 R /XYZ 90 365.528 null] +>> endobj +9215 0 obj << +/D [9210 0 R /XYZ 90 350.958 null] +>> endobj +1309 0 obj << +/D [9210 0 R /XYZ 90 208.511 null] +>> endobj +9216 0 obj << +/D [9210 0 R /XYZ 90 193.94 null] +>> endobj +9209 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9224 0 obj << +/Length 1456 +/Filter /FlateDecode +>> +stream +xÚÝX[“›6~÷¯à©…™Z–„$„§“™6Ív’Þ¶‰û´ÉxX[ëeŠÁwûë{„67qÛ´O6Bë÷ì¬ì|;úz6šÜß Q(¨pfNˆ@Ä)qfKçÎ%ù¡7&c÷Ö#؍òu4¿õ(v³äéQ-óhþ}|ŸGùÓtj–ã´,Ti÷èOv*‡ïÝìÕ䆐ƒÃ¨Oã¨Rõ¥ÙÒ҇`Dý°Þqû¦G +aˆFȳA!ϓ¨(¼1å؝y!uÕz“D¥2+¯ÕƒÊ="]•.`É'œ»¾ZèèÅlôۈ€ìÊQ<@ÏÅzt÷;KXå`ð—tvÕ®µÃ¨¿‰ófôó[§ã“Η!˜9ˆfM6NÖª7N+Eº’&7!?4W¢‡Î~1§FÌ¢h}9¹áøð QYûgöh}±ÈÒ¢Ì#O³PfæVtH¥yÜÅå#êˆoÙnD¡¨|&Ì1/~_¨MÃÍ(Xâ܈(Êåt§Ãîû(‰—ó(_m×*-ÏÙrÒ½­yæQîîRo yïÆ&}è¡úœ"ΛOÞbìÛ;ԏ…¤ÞS>ƅÙÓ:ÜÀÂ&S£tÙ#‡‚«¿Þ³è.à¬9+ʕ֝Bt6Y’­žÆqºÈ֛¨ôÀžûľÍrcá2àö±– !Á ¤ p,Ù;¶– ?GèèäÏW¶ +^ǚa$h‚9òE`ä}£6¦¨PhËánÛxn›1o”²ŸvupîªDüÊäãY]ÍYj·Né—PëJgH¤3Ïnzèlúi£ò¨Ìòvɀ¨[Æ@€ø`7A’òÔDPTÌBgYƒÌ1|AÑû;‡pkЫ|Ú¨ÐÀsPµC8gT£Í™ï5ÄdñҊ¼å!».z(üœsè[*õÚ.&•¯Z¹úlÈcÓi´\ÎÌVùÖ ºò[ÌqpæñyçõgFj‚ FÞX±è9˜!ƒø)8é©p¢¥“»8MâT½ë©sH~µV9&¨%„—5ø=P¥‹OW€*  †›MáN¨ýt,XH$íø§%°wŸ™ç9ƒ00ØՉü`Ò Wâ ö‘õOÀA’ëD‚qHÕ¡ç‚ ? „ÏZ¢…QˆáèÓ*þÐ[ŽøƒBÇ£¹ý,5!ĖœMþÿÍT“ò4 aCâÒTÍ5\B)öûÌ\õèòðK0”\‚¡ÕƒYµÖÿR¨埭&I >ҹݮð³¦Hë>9·î끟#F®Ô>”:¹RF‹voö Ò¹_¬ÎÞ/`„è»`´2¦öÛ½}Þjiþ=TðsàRØwáP|êô¡oS½ôAAkru"ï¿sd '8oè¾gƒAȧàMWã~Ìb>Â|كùLžÆ|óq°÷Y–XqW…@K<öøéç&óuœÆëøÀzÒJ„Cí2»Ôkxù-¬ÿwÛå "{PC}óF¤ Pœ®:gåªØ&åÀ´‰àµ*·@úÜí¢c7 Çèÿ%…êxÀ!{½c{Ñ6=lu=Ož ì³Á¾´ã'€†òÉ|€å8е”Ÿ8ðK_œ6&±k¤$øž260l¢ÐažË;Mܤ=jҚŸ¸'H?¨î zËñœ rîï™3ɏ™3u"ýiŒ™š…îÔ.Ù!‘—«!3X,ôTQÚ ?ç¬ÓŒÝêÒהfkN3–ØÌôÏùçç®-Ì¢t%{¢x¯Eê6¶c¤Gðà‘ž©ãË~uê߸ÙëKd‰ÓdécYn¦“Én·C‹mÓx“£¸œl6É两@&ïS½i'×YÝÉÄ),®«xùÿOGê; +endstream +endobj +9223 0 obj << +/Type /Page +/Contents 9224 0 R +/Resources 9222 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9205 0 R +/Annots [ 9217 0 R 9218 0 R 9219 0 R 9220 0 R 9221 0 R ] +>> endobj +9217 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 624.47 138.508 635.349] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000032) >> +>> endobj +9218 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 604.38 314.566 635.349] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +9219 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 118.216 138.508 129.095] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000033) >> +>> endobj +9220 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 98.126 314.566 129.095] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +9221 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9225 0 obj << +/D [9223 0 R /XYZ 90 757.935 null] +>> endobj +8975 0 obj << +/D [9223 0 R /XYZ 90 595.696 null] +>> endobj +9226 0 obj << +/D [9223 0 R /XYZ 90 581.176 null] +>> endobj +8976 0 obj << +/D [9223 0 R /XYZ 90 467.013 null] +>> endobj +9227 0 obj << +/D [9223 0 R /XYZ 90 452.494 null] +>> endobj +1310 0 obj << +/D [9223 0 R /XYZ 90 306.866 null] +>> endobj +9228 0 obj << +/D [9223 0 R /XYZ 90 292.347 null] +>> endobj +8977 0 obj << +/D [9223 0 R /XYZ 90 89.441 null] +>> endobj +9222 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9235 0 obj << +/Length 1536 +/Filter /FlateDecode +>> +stream +xÚÝYY“ÛD~÷¯ÐÈUxvî¹(ª $Tµd^–”Kkk½*dÉHòóëéÑ}ùHâ O–Æ£žî¯¯[ÂÖÊÂÖ£ïf£«’Yr$•ÖìÞr°¥$A‚k¶´nmBsÆ‚1¶¯ÇÛn¼vç×cŠí(Ø?xË؝ÿäßÅn¼ŸNóe?L/-ö˜Gv^ ã·³WW/iFE\(P%;ëë|KK‚eN¹ãúf@ +ሐJÈ7'…< Ü$O¨ÀölìPÛ[o7õò•×Þ½‰¶½pKŒa3©ŒÐÑóÙè¯1Ø"PB!ńµXnßbk ë¯, xik—íZ[œ2ø ¬›Ño#|tÊ–¢:bˆªù´Ô±o½†Šƒ”ä•ñé~ã…îL`í ž’#¬ôQmžÏ1’RÕ +`6 GŽ&Ud=øÉÀÙT"Ž«M;?}ȑIŠŒë! ¡Ñ?ÊQ¼‡Yë(0Îa¬Üƒ²œ-“®ï„h ±@@Å®ˆ]HƒÌ´% Ôr&ÑHaÇÈCXЖvGÚjjDeå¶ÙAҨģðS~k ŽêÀˆ@2bŠ”@Úáý?æ‡âóà‡¼_€P¥¡77éyQ¶àâø㲅Hâ’- +Þ$ÞûnH?r #^;§¬{qé@‘`qrvbP Îe ŒœVQ}Oº ïÎä|¶¸+6lo™_ݛ‚ÔÔTíw`òÁ"ž„B²¢ÈVCv±Þe˜CˆDZ©3⛵8Ä(_ÄI€Ú…¤’hÀ9“Ä)Ð4Àõa`'iWi}EA!îâs$¤±Æ'ë?þ8óÁe¾öCíÿã}pùW‘º[\ U¨Îåª?ÃƱ¤]ý?çYapTÈ=\lù*VøÌWcc/Ùé)z Ù©M‚xí¥[h„Ý­™]çôYáÞ o¨«…Sêæ Ê_¦ )MÙEûª2QüYÀõ"ݏ¥8A}¦'7ëf¥.ùç¾f[óƒDó‰³œ’äÀ D‘ôŒ¬£§%‚¸£NNJŽ¢ÇSÊA‚·%£ûAIIš JfKPâ Jž”®1ïãâUñbîußϦ@QÝJÍï½MÞ¶/€/—\Ýmĺ3ñçOv5°n³ü6Ä_¢òõbv²ò%0v֐¹&èŠMÝÔýuãÅnÅíd);Ö^%z"|¸U`ø)[…ÿzbì· 0C~Šã6̺ØõúAøݼŒvcß5 Òï¦Ãe‰‘?ù HϚÛÖkÃg†ÛÔÔ^úš=˜fÃÂðߎXƾ?y ·9Û U9¢œ\ ÌQ…t=3æͅ9xq“qFfN”ÿ&7{ýï°º: A ƒ’¼ç“#¯%¡×àTÛn’ø«0k5JKm2–.”é2a0 +hªŠ˜“ŽËá¸ûÁCjتÏýޑ}瀣Ì, ƒBþCKÞaôk#&ËÛ2ÅóÛ"Ïó›7‰9Â.¸ÿg7ܺADF$~UL12_L* ó97ŠvnٟVyõcޗÕú $®|HÓÍôêj·Û¡E‚¶¡¿‰‘Ÿ^m6ÁUŸÛRG5wVÓø:*ç@?„Åu–=üÿQ;ݹ +endstream +endobj +9234 0 obj << +/Type /Page +/Contents 9235 0 R +/Resources 9233 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9205 0 R +/Annots [ 9229 0 R 9230 0 R 9231 0 R 9232 0 R ] +>> endobj +9229 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 189.635 138.508 200.514] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000034) >> +>> endobj +9230 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 169.545 314.566 200.514] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +9231 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.4 98.244 212.124 109.147] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +9232 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9236 0 obj << +/D [9234 0 R /XYZ 90 757.935 null] +>> endobj +9237 0 obj << +/D [9234 0 R /XYZ 90 733.028 null] +>> endobj +8978 0 obj << +/D [9234 0 R /XYZ 90 581.211 null] +>> endobj +9238 0 obj << +/D [9234 0 R /XYZ 90 566.708 null] +>> endobj +1311 0 obj << +/D [9234 0 R /XYZ 90 421.341 null] +>> endobj +9239 0 obj << +/D [9234 0 R /XYZ 90 406.837 null] +>> endobj +8979 0 obj << +/D [9234 0 R /XYZ 90 160.948 null] +>> endobj +9240 0 obj << +/D [9234 0 R /XYZ 90 146.444 null] +>> endobj +9233 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9248 0 obj << +/Length 1908 +/Filter /FlateDecode +>> +stream +xÚíZ[s›F~ׯ੅™j½w@“éLšÆ¦77vóâd4HZÛ¤TÀvÜ_߳삃¬4ŠëvúbÁjuöì·ç|ç²ÆÎ¥ƒï&ߜMŽŽ%sBJ*³ 'Ď/ ”8g+çÜ%±Ð›Œ±{âìFù:šŸx»Yrw¥Vy4ÿ1^äQ~7›™á8- UÚ9ú'·*‡ïÝÙ«£cBZ‹QF>¨R­õÌLéèC0¢,¬gœœH!ÒùúA!/’¨(¼)Ø=óBêªõ&‰JeF^« •{$pUº„!F„p™ ´ÐÉ˳Éb°C* „|&œåzrþ;+å`À+pn«Yk‡SŸ‰s:ùu‚-èxü DsǧÉí– èÑZ•ã¬R¤/éè8ííÈÇ¡3…O,¨s坟 Üý •´FèìÊ¢Ql¢¥}\Åk•q–š×ò**ÍÓmœ$æia§^§Ë,-Ê<ŠSµB½e;ž2‰BŸ8S +†gX­þòÃRmJXé#w CBE¹šÍâÔã6žÄ«y”_^ƒþå. BÂyæQáÞÚýÆÖ®ÚKsŠ˜$õO,Ä=©#c՜Ø^šYô¢‡€Îì´cÐ`Ñ2àµÔ·³!õP4ڕW°ö€z …Í4à;ÚPÀLY€§-Z@ 1b¹¡¬½è¾‚U3Ÿïrrp#Þ¸gy·Q)˜»7°ýA—a?Øéñ QÚ¬y£}(‹WVä¾4æwo&}*v2YG¥Á}M¹Æ°šÂg(äøþ:ˆÍf-3Vó \ ™×7šç¢<Ž‰*æ§Êa$wÝI„H4ؖÙ|¡æ‡Ð&ˆ ±µFA¬¶ÐÆÔÎã4iïLrJ¥@ @ÁG’Z|‘­7×¥ÿ‘˜‚5+ëʚ‹óKKʯ¿›8ç0¸K÷–Xå1¸]FšQ:î_ͤ#ÆA…ÀßÃÁèC¸9öÛ¸¼2;ÈU±QËÒ«´-³í¶ªmeµvÕ§%ý]CŀJw˜ÁœßTOÔLpk¬ËRåÀÙvô÷ýŠ^­¼¯,kE|™Æée ,wÁ¦®k\°§û¸†Iþyxk4ÆPLX‘‰1ò“¢*±A•íôŽÑÎÍäý [»£>ëG‰º:|`.»ü°KuI8vý&ìvŒ®8„gJÄýn`ö·€OcÀs½ÚÎ4ßçÕOYj‡Ì‘ù»ùHOxãBj +îÓP%iñè 0žJ¸°ò®§Âñ–ÆÆLF’ì[Ä¥ßõþ\­³›=|{0ú û6ú³^ô§{FñPôž^ô‡Ð¯˜FÂ&ú{†š){' ®NM–Ú熝­Ð¸' Å£Th 4ƒi F~Ьr7 ‚CžÍ˜ƒpäWÑÊAžWÀ;âçˆ&/r­Iªvúí9ï¨|ƒ\‹(] a*Qàû½“éH†ßN@†á(æ ©ÅW´B"c¼É#3ë±lQ³Ÿ]ܙÑ- :Ñ#*Z^™9«¸xQ±¬gE!Šƒ¤y>0í¦yûhÓY(Ù.(L·„­Ï£¶Ì’d p#È LÆ'(’¡ìÒ S1`NÅÿc]ÿ!IúÄÏ>'ñó`œøكĿM¶Y–Xqï\ÝøAºÇG÷s°†ù:Nãuü§:÷S‰ÛéÁ³‡hû ͹1îúÙÁ¨Ÿ1Ȏƒàêt꧔lKHx®’rJ[Ô¯G5õWßv¨_²Õ¿Ø’­™9Dý„v3†OŠÑåþ¶:¤£á~ ·­ùŒa´ qê»ÖáÊŒ& +0†D@»,SmEíàQÕöua¹3NŒÖ–…a¯²|­Êë\÷cú¥eߜZ¶í3^DI¡°`x³#¶…s³§,Míx‹¢îÆB+ï<)z„ûÅ\³PnULÑn_«6æa qq5RJ÷›ïýRúTí¬'±ûÜhþsV_\l[và{ˆÌJWßQ‡1º“~Ù¨<*³¼è•¤#Å „!ÂG:Áü¿] –PúukÁFžb3x_´î°Z B‚Š û·Tƒ{¥t¯jPø`åt$%`’¤ v`ì#Aå6›5õiFæ±Xm«¢¬vZdšpoô°8Ùi´Ùäهxmé€IêFVy+dcZoæô »»ª0ƒ‡V£ß²uuã eݛ +BlßÙæ÷j,We¼Œ’ºÑy¡Ã5¯£ùM¨;cô '8ã]WÁ t#š@>˟l׏v][—ÿ8ðâ²!þ(ï÷Ë;íÛî¹ô¯ñeXûÞâW·ö ‰¾¸†bÔü˄¾3¼××?ÑΧ£‹}­Ã‹yµ1ƼüV¨üKO×&$?EéuíÚË­o/0Ò©½éRÀ­„Áììw§~úÁ¤Y[}Id†º*ËÍìèèöö- tÆ›ÅåÑf“Ý· – q¿r‘åF±u–79# ¶¹‡ÿ_ Ï— +endstream +endobj +9247 0 obj << +/Type /Page +/Contents 9248 0 R +/Resources 9246 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9205 0 R +/Annots [ 9241 0 R 9242 0 R 9243 0 R 9244 0 R 9245 0 R ] +>> endobj +9241 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.573 594.665 216.297 605.569] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +9242 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [448.024 499.87 483.212 530.838] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +9243 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 236.891 138.508 247.77] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000035) >> +>> endobj +9244 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 216.801 314.566 247.77] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +9245 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9249 0 obj << +/D [9247 0 R /XYZ 90 757.935 null] +>> endobj +8980 0 obj << +/D [9247 0 R /XYZ 90 656.853 null] +>> endobj +9250 0 obj << +/D [9247 0 R /XYZ 90 642.865 null] +>> endobj +8981 0 obj << +/D [9247 0 R /XYZ 90 483.028 null] +>> endobj +9251 0 obj << +/D [9247 0 R /XYZ 90 469.039 null] +>> endobj +1312 0 obj << +/D [9247 0 R /XYZ 168.903 393.566 null] +>> endobj +9252 0 obj << +/D [9247 0 R /XYZ 90 379.478 null] +>> endobj +8982 0 obj << +/D [9247 0 R /XYZ 90 211.068 null] +>> endobj +9253 0 obj << +/D [9247 0 R /XYZ 90 197.079 null] +>> endobj +8983 0 obj << +/D [9247 0 R /XYZ 90 89.441 null] +>> endobj +9246 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9261 0 obj << +/Length 2210 +/Filter /FlateDecode +>> +stream +xÚíZے۸}×WðiCUEÜI*—ªdËÞÚͦʱ'yq\*ŽX¡H…¤FÖ~}o (&–³ŽËO)°Ñht÷9Gö=ìý0ùóýäîµd^„"I¥w¿ö"ì’ A‰w¿òÞû„ Mgc쿙ìÇÅ6^¼™Rìçéq£VE¼ø9y(ââ8ŸÛÛIV•ªªÇèGª€Ó÷?ݽ&¤7eq€+f®ßÛ!Ž?#Ê¢fěw#VG„´Fþø¬‘ïÓ¸,§3*°?¨¯¶»4®”½óV­U1%¡¯²%ÜbDŸÉH¼ºŸü{BÀ öˆ ”PÀ„·ÜNÞÀÞ +îÿäaˆWę̀­Ç)ƒÏÔ{7ùÛ_ :eKÑ :bˆ‰:òUããéêCðK!'y»øê¸SY¼…¥ ŽÇSr„Yx1ž QÜÎùçimî% 2%> #Q—#pg³{N1E š½³çýÇÑHWš\JF̧.EåçDQÝîÏ¡hð,ŠÒvÎ'y²ªM^¤š×¢ $z@Ÿ…Qú™`4^ë.™©E²u SipóšƒÅEëÔC$ŽBÙöɧ¸8ãwkh#\R¿Ácø?þÄÅâÕǝ¥vei[x0 +‚ê¦ÃI¥™3„ŽG“~Ÿ+³Ìe¿¨Š8©Êùܸ²°s÷éåéÔ3h¢Gƒô_©,ß&Y\åcŽpØöÿ?Œ”oØoóÚÅubÌ3¥· ‡ã.] H’èfhO‰dÔ ½ =hGûÑ4>톢¤Îã½v&^ë&l“Öºg3w€ðú‡Q„õps¿÷Ù +RȆkS;¶Þg5 ê«m¼Û‚¢/žô"œòrwpDrqR^®‹¸­/Ø$wv'P¸ +;=n5%Âÿ¨ TÙ"¶f(†=©•½ñpqИâi=iÇä2Ž‰Â í%'eåؓ‚wÜç“ <„Ž1«•ŠmŸ¶‡Lhžr5ŸÐQ &1gGη Ý7ÜÈÙusGïšþjõ»_n#«›ʌº;wn1=ÊéÉb2 O…Ù%s Åö2÷/;ZOje£™qÎ_Ðÿ¢cÞ­¿ý§ÿ;;U™6§õs;j:i·ÓÒ}3ëÚ$Ü>­ú9îëˆîߗÓú3$ùTFLnDˆ;èé3bL.“ j°û3é™âŽ€œÐ¾ÑfQ0 |#†žZ&aÏu#èÙQtҍè€A°àVћL³oíüZ3 ñ,¼@­ël­³vtí¤F§HÏÀF¼c‘MÛÈò:/ã¦õÇ˦`GÛr ÁH†üÑbZN_?iç°J€3.'‚+å„xNN„_ œÙNüÊýcÎJŒ/XQÔ´¾\«„8/:á{°€o•…žçŒ²Ð?*  LåK•…™õ’´h´sVrãxêàz<=Û9_®6‚Ï*6È5bƒB5±=#6È9±!”78ºNk­w€ +ŒË rFnDšrË[{Þ¨ Òð}⨠ÒWä +µM> endobj +9254 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.275 690.333 293.971 701.237] +/Subtype /Link +/A << /S /GoTo /D (main_Powerset_Meet_Preserving_Simplification) >> +>> endobj +9255 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.269 541.145 238.02 552.049] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >> +>> endobj +9256 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [182.089 319.694 246.767 330.598] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >> +>> endobj +9257 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [325.899 96.965 431.977 109.883] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +9258 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9262 0 obj << +/D [9260 0 R /XYZ 90 757.935 null] +>> endobj +9263 0 obj << +/D [9260 0 R /XYZ 90 733.028 null] +>> endobj +8984 0 obj << +/D [9260 0 R /XYZ 90 615.539 null] +>> endobj +9264 0 obj << +/D [9260 0 R /XYZ 90 601.301 null] +>> endobj +8985 0 obj << +/D [9260 0 R /XYZ 90 394.088 null] +>> endobj +9265 0 obj << +/D [9260 0 R /XYZ 90 379.85 null] +>> endobj +9037 0 obj << +/D [9260 0 R /XYZ 90 172.637 null] +>> endobj +9266 0 obj << +/D [9260 0 R /XYZ 90 158.399 null] +>> endobj +9259 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F8 504 0 R /F13 540 0 R /F7 505 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9275 0 obj << +/Length 2010 +/Filter /FlateDecode +>> +stream +xÚíZ[âF~çWøiÒRÔ½Êdiw4)©“éݗÉyÀ4VÀ㞞ίϩ‹/e +º'ÝZ”~²)ÊçVçò}œÜ$8ùnôŸëÑìdIŠRIer½NRœ(I $¹^%ïƄ –N¦c<¾š<Ϊ]¶¸šP<Þoï7ùªÊ?ª¬ºŸÏÝrQÖǼö{Ì#wy “÷×ßÏÞÒSFE\(0Åêú—ÛØC0¢,mv\½H!Ò +ùöA!¯¶Ùñ8™RÇד”ŽóÝa›Õ¹[ù%_çՄèq^.a‰!ÆLa#tôúzôûˆ€œ(¡b"YîFïÞãdëß'⥓;»k—pÊàºMގ~at|6ø:EóDQ‰ˆäÞeôl—×ƹ5d(iö&}w5R8M¦pł:1³*xtöFàð*i¡ëÆ6_×în“•+ww,Vþۏ*À´"û°õ+ûµ»Ö€›¼Ì«l[ü‘û§³µyèWŒié·T9D¿Ø—_ì \šz§D J}hàÉãýî’[_äÄ©F¡wç~÷a¿½¬ÜŠ TçŸãI¢œ¨.owŽz_ WUÜl.ü4xù„ˆ1ؒ†ÐÛø±ÊËý®(­I܁DŠîTOÛ㐹ÖÍu™;琹 2+¡CníW,ðþ`Ž,Ûúçl‰Þ@4K/ý®¨7Qk[2·[Ûràô’B‚ߥpuå`Sw{ëÃH@Aƒ¥9åIªl¹NÊëOËÜÚõ™u K‹8Ö«ù¼('Ê êdµÈ*ïօãHJ{ÅZí7w-]ºXûØWÍbà;Žžú@ºL‘â­øâèÄþ‘ƒ¸#csØg hƬ­¹¦L†Õ¡NÛ~lòÂî¡, S¢Ù)Âbn¡T·Êê Øú ²*wÖ¯ +ˆ²É±©ÏJƒƒuiâO§(—ûݺ…íp †…qÞ\£Î+m£ì[îЂ4Óýèqå¾v7™»ÙÒkl õ¬cÁ‚”"Š>S´HëÂÐÛ@)Œ¤ò:éctŠaH2_fØV7~êþòÝ(yg¿~µ¸ò"Ó¯8J,¡>dx”m–扴j±C7P†sD÷˧ðè!óý¹®Še}~¶ "™¦iñ¦­`.zX ±pÕ 49=XבcÈ ° oÓ¾¾?ä%`ˆÉT€]Q%9ÂJ_„QÌŽ&½M—Ý+/ò±ØpBƏ†‡Ðkáa`RÔ¯)7q…XéðíC›Ï{Øe‘­ÝZ8,vٍƒ‡v:ýÏàÈ YÁaãW5;i '®´áÿçd*%4êÒiñÖfRD´†ÆNH,áPb„ ¥/apÕΉ‹2ϪÅëOÞ?7}]cÄÊö |ÿˆy‰‘Òéië—ì,ÐCäù«}nã»,`ð-ê*+êã|nÍ[8{ú <¢YHÔUñÉt aÝÅ7‘žM\vdL[ΰ}™›Ã6X!J2’$íúa»+0Ú?mýW”[ˆüûH˙2I‘ &m ×þ sSBÿ„Žë}¤+ó ¬Ÿc!¬Û”;¥Í|ò›OÑi¤(҂=» â­€¹i¹> +peÖ³Ãl ¸ˆYѧìÛw¾tß& O’® +9nêl…É£`¼»zZ' ’ Ž‘WŒàˆ{›Ð„H5ž¹­ª'¦^ + +À8!rS“Y@*Pxó=Ś· Õ2Ò¾ÎFîÒËà‘Ã\3Ns&Û7£ðn“W±9Æ Ú`¾‡üzKʆ¸¾DéæhÊPÚýÐVÅý„c|&áÀ¦bª=L¹8ÁatiõýLB·9°QêSÇÜF›¸€Ãæésôð@¿CFFkK€}Üõ¦\ <<1@¡Vðƒ˜h‚T7÷Útɯá?|äM׎‘_$Ï´·+`€:Ìܽ•is/¤> ˜¹êqúñT]¿9Ï<¡épà‡z'¾tJCBh‹rµHŸÄ@IH@ý‰Ÿ% ÐŠ¤øLú4>äU~>¥Äœ|©4‚Bõ H°ŠÚ§±ÆË)YfßãڌЙ÷O{äiIc¼ºF£r2¡ÏÓS)Ud=l> ™eÌõÝHÙR󦘝4ÂPªžöPxD¶oÿ.¶¶1çeF&ÑÏ3ü(íCe$”´3üqíÂà,=ðÝ÷qD¯!O¹ü? ú֜á|¤†4Տý}{ +¦õ^ŸâD¤Ð†ù Ì¯LÕˆí?6Û}ô@Û}øï1¯¾š1ö~ý”•·™Ÿ,¶~4¢ ™·~adþíäނLôû·y œg¿%ÍÝ#ñÞԐÈp››º>Ìg³»»;´<¢Û²8T¨¨g‡ÃvvZÜ=)00;Ⱥn^‘íö•w¿(aqgÏâ$þ$ړ +endstream +endobj +9274 0 obj << +/Type /Page +/Contents 9275 0 R +/Resources 9273 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9279 0 R +/Annots [ 9267 0 R 9268 0 R 9269 0 R 9270 0 R 9271 0 R 9272 0 R ] +>> endobj +9267 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [454.44 591.936 513.996 602.84] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +9268 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [365.617 498.402 476.603 510.041] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +9269 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [454.44 330.234 513.996 341.138] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +9270 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [323.631 236.7 429.297 249.179] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +9271 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.549 96.617 195.105 107.521] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +9272 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9276 0 obj << +/D [9274 0 R /XYZ 90 757.935 null] +>> endobj +9038 0 obj << +/D [9274 0 R /XYZ 90 572.805 null] +>> endobj +9277 0 obj << +/D [9274 0 R /XYZ 90 558.557 null] +>> endobj +9039 0 obj << +/D [9274 0 R /XYZ 90 311.104 null] +>> endobj +9278 0 obj << +/D [9274 0 R /XYZ 90 296.855 null] +>> endobj +9040 0 obj << +/D [9274 0 R /XYZ 90 89.441 null] +>> endobj +9273 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R /F8 504 0 R /F13 540 0 R /F7 505 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9287 0 obj << +/Length 2300 +/Filter /FlateDecode +>> +stream +xÚíZ[oãÆ~ׯàSKÑxî3T/@»Ø ¦À6ëöe³h‹²‰J¤JÑvœ_ß3^†"e¹r‚4í“)rxns.ß74Žî"}=ûóõìêƒdQ‚Iet½‰)I $º^GŸcBKæ ‚1Ž?Î ŽÓj—®>Î)ŽËíó}¶®ÒÕ·ùM•VÏË¥»õ!«ýóÊSVÁù—ëo®>ÒSFE\(0Åêú½[ØC0¢,iV|ü4"…pDH+ä/ +y·M‡ù‚ +_Ïg»ý6­3wç»l“Us¢ã¬¸…[Œ3EŒÐÙûëÙ¿fÄàˆØ@ …Ñínöù ŽÖpÿ›C¼tôdWí"NüÝFŸf›á“A§ a)zAG qâ#_76{¯a¡â§BFòÖùúyŸé\àíh<%GXé“ñdˆÒVç£Ùã2_{‘ç&ɜÄgç GQq2O“FýZpWˆÕþ&BLûDl¹¼ËŠ¬J·ùÙz•n¾Ç˜Ùjï²$ߥw&O¿Çߖš6?Yüm^diµzÿƒ_y8äeáVþÆéLDßGH&Ò*ÝÞƜ¤ˆèÖɯæ %$d,dˆ^}zÞݔÛÑZ"‘´¢«l{xލH§`ÑéÎ!X-X‚‘DoÂISIcN& %]©VãNÂN¶ÆBL‰_ӗ&hJšEŸób v|q îï9! ÂTÅBľð'0ó®0=€Ñ¸.Ý{´oCigf#Fp”èֆú>?Œè§Ò²[“9•ûªÉÊH\nF €"äê­ xÊë{gA•öÙmí €¸HÜÛ3s ®ºóî»¯gÑg» Wît3§"vádU>½ ×ñ®>èþæiÈ#̎R°H¢D1íS€‹¼I5μ VyLª^P&â§û¬ë»P ’Púz#êCᩤu:÷È¥\´q³¿®”í5 ¢rm?nžÇªI$9Và L -Ûeh°EA. Ï &HZ‘„fèÚªëí0>jhÕË@@'(¨x¢‘"F‚Þ{# ´!Ùöúë&@ÛlS»«û´ðÑ8äkÿtˆ&ls"bhK®%ýn 1°qáU.ˆ@ qÊNÀ.¸ëª×§6ò´v/(ÐþBˆ4¢Š«Îïî/ˆÑ鄀3ÝÆ惯µ÷?Üf{ãëëR!éÆÇ¡^/—8Ž¡¯Àx­îvYQŸò>8‘^à«ÒøõT¸–”uS!&oÖÏUPÅ sƒÍ&„‹Šu·‡¸ÙچÈ\Ï©Yª!玛`¨ pkDÊjLF’ˆÓ}íHÌt Ì´ì0À‰@Ñs%{rBIr ‘ž:¤ïV=ˆLÿÜdú±š3?£%jèrrؕS_:u•ßÖÓeFÐ˂{ҌÁP°Ü&ôôL@/^ôú—è šPËHÒz¸óKÄô7åC±îãyÈN,ÿ‡a†i•§¦, ՖïcZMØßÇӄpåµÕ3žÍ£1ðL8†ÐQ„›UfÞ<ÖË0Jþ²â…/JΚˆ0„G´‹Q£ Û©hu=Lۻݵ;°I2¿+3þÛZþª®Ò¼>,—ÖЕÓÞ'ãc» ø´9´ÎŠr—i]ŽY `p±Ö‚?Œõ ˜OÝ)ضɝee‘™œè‘‘ðt@~‰²@¦&HjâÅÔOq-'8 ôåa^6ä”!k¥ eÑbœ²€ÏB½Íìèé÷¤ èH ˜`I‹ ÅIÒ }¥»Õ '‹êsm(©4d„ó¦øZ»»u€Â»Y²r úr ÿë6>M„§JàU"ØKP =ûÔуtâíé’=UêkkE1ûB'J$Ì ˜†@ÌÀN&š]¤|”KE»q! °Õ‰cHh ò D铸ê" +Õ³è­ê´öZp AP ÄF4gd#4җmCB_á4AB$—ìB+ Ö±©M²ÊØƌ3yQã +†»Áå ¦Í%< '!QóSí ‘ôˆ…<š +k&§½ó°_ÔélÈ|iIS’/6§¾O›z#q’µ™:f—°ŽÊnˆý ý-4rë8FæŸÛž’woA>½EÎr4G' ã¯wäa¿ÿIœpÖô7cåS~@Š~0BüaênWvžÂ=H´‹6ÍEݼÖÛ'ó†eÁæ¾wÛ\vnہÛæyèö¡3§Ü7€IØFà%“¯©?±I-fñDÖÞñ3L6¶8¶u¿\¶>èĸûBÅåœÌüTÜVû[pq:FÅ9±a˜!0Á#“-.¤“>93RÌ@‹½2»?©G¨¥£X9춦úúØ ”¾‘ÃÀÌÿ1¨ŠÈY­™-Q¥ƒƒó¹- Óé2ôÄqà´ò‰5yFaº„$Ì‹ê#ª3Ä‘öÁG8uw‡¸’D½Ž»kÊmÔL}ÜSÔjwDõÔ}\oËÜ!çÈÿs§/0wú3wq6qCâŽõäÇFÞÇKZ? ³ŽÚ8ÌJ{Ÿq2ñ¹6¹ƒÅ—tZc‚pw°¡ãî`‚åî&'¹;,ì¸;¬ Tx|wWÊ~-0Ü]üÔÜTÁj¢` 'ò2îîEIH}uu‡Œãê ꎑ òUÔ]NSwÿýµ·êêÎêN€Wh¥Þ€ºaʞ¼Žº‹ÿS÷_!uþ˜ÔÐ[ô¹ÿÿe,Hv!Ì ¸ôÑØ` ›ÿÙ`7÷Ó8÷ãúí\ˆØCÅCÃCÍè{4¢ “Z¤‘ùo8Ç2-þ”5MØyöϨ¹úËÌ€þA¨B ·ys_×ûåÕÕÓÓº= ‡"ßW(¯¯öûíÕñ>ö¤>5Û4·+ª’psgó ãÿo?  +endstream +endobj +9286 0 obj << +/Type /Page +/Contents 9287 0 R +/Resources 9285 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9279 0 R +/Annots [ 9280 0 R 9281 0 R 9282 0 R 9283 0 R 9284 0 R ] +>> endobj +9280 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [334.883 678.378 440.282 690.857] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +9281 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.549 533.281 195.105 544.185] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +9282 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.059 436.355 422.924 451.071] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +9283 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.333 164.674 425.662 179.389] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +9284 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9288 0 obj << +/D [9286 0 R /XYZ 90 757.935 null] +>> endobj +9289 0 obj << +/D [9286 0 R /XYZ 90 733.028 null] +>> endobj +9041 0 obj << +/D [9286 0 R /XYZ 90 524.315 null] +>> endobj +9290 0 obj << +/D [9286 0 R /XYZ 90 509.744 null] +>> endobj +9042 0 obj << +/D [9286 0 R /XYZ 90 252.633 null] +>> endobj +9291 0 obj << +/D [9286 0 R /XYZ 90 238.063 null] +>> endobj +9285 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F8 504 0 R /F13 540 0 R /F7 505 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9301 0 obj << +/Length 2637 +/Filter /FlateDecode +>> +stream +xÚÝZmã¶þ¾¿ÂŸR8sù"JÔ¶ ¹KÓÙä¶(ÐíÁ-z­«,9’|¾í¯ÏðMeù宛 í'ë…‡3Ï<34žÌb:•Û]ž4Ò<ùI®e5#b*‹·¯>¨ù“|oNÔrÑÀ`žcÏŒBM`8 +ƒØLÿÍǕÜ)ê;ïÛûE`»p +ˆ»ÔMzw—³tJò,]$•]™݋a¿i·y•11›`Älmã²?u ŒGÜ''Hc$ÚÎj#õßfÑWj÷OÎõšå]< ¦u⨝Cm3lü½‘Hc­§îO‹$H¬'’5•3êÑÔÛN¦¡7öÝ ’Å¢]T³“OOCàÖÀIe+Í`/•Gϳk—4Ù2·ïZŒ’0†X(œÀÉؚ)FöÚ­Ò`TZ'OÌO½KVCuZœ:6  EÐYò¤MÈ%›0“vI° b hPD¸èeBÄ`ßm:l\â8NIv@6–×èƒÖ՚ç,’-˜ƒÃúG“h„#q6É1Di;ç…,e–Z‘Wfî™^Ÿ¼Áåg“·§Òèº ˆ¶•çò_^²ØÝ]N³y²«åòyöd½Ç$‹¢¶Þö©”„Š±˜ÿ&”¤µÌfÀ€  ¨¼ç„YàAËHÀþÐÖÙ³"Ï +ùn$*æ<,ÒûAJ±yû+mXÁM9—A€¨`W„å§AUËQÛô茂¬}Ó²5Ö¤%Å˪'KÐ~zs3y4ÀUæÆU¼üe_/es²°"| Ìñq؁¿¿U!Q4ØpŸAzpTA +p ³m¼ÏÚY/`ˆáY¹lp‚ÔÜ-ŸÍoߦ0¸qvIV²úœ…a”²°ùð„™Õ¼k#Q&«¹J³úý¾X9ýÆv€+aEø϶€uábIXOÖ©c‰>fvNǐC™|ÚÆ 3l>%±ÚN4H8üÿ7áqþGŽ‹„…)Ó½£/*㜀_ÀAØ5ðK00¿ŽÁ/Ì"N¡/A/aûè+zè+,ú +lyñj_ՙ"øT‰$ógÃmiO·¦€~2`¢U’ ²²wN¸2híËv!XI‡MYÛÁ¦h™ëšÍ<4K™Ì# +ܐ Š0—AjíçšyÖmÂÈ,ËO›ÃmYÉ&[¹šm_5øŠ}`ý¡è—ÃYóÊÜ®iNò|Pc›Eï\ ¥nG’ïG¶Äs¿Wc›ßß×G$SÚ.{¦™.sײjKÒ¾ÙõCbàEAL^œ[ ¬¹6‰ÚcãScKÆ÷¨Ôã8˜¾ƒO) €ÏDÓÐ|&üb-¢-ÿøãX¢Çˆ“p ÷ÑÉ åhgkNÁ`ÜBz0€ôðW„tѐ«dç!@¶iç<£‹ ;|¦nWèAµ¯âXt é”_֒'½ð‰Çµkˆj”p ¡‘ðÙýKàøà˗ú— . ¼‹¬+2Ñ×oîãx!?6U²+aƒ­º(^ GÓOïÊ +à+üW_•j„ÀV·OÕBK!փ¡uìfžL¡Ø¹ða="U] ¥î eg™ŽH "]od›|\t¸z,œÇPEFהoô*þø‘Õãá´¦5J!€‹ð% +¸¢’zBÍë(ã\§ õ,ÙíògÓv…§gë75\û»koÏñÀrg݃ºC‹[5Uuë‹t“¢>¨ì%¨¸T D=Oc‚N÷õÐB_$…xÐ<8'7\D9œ2̱„[xäò>e€H +Âþr|:³Jª4+’©Ô§YÛ2Ϫ÷|Ä£Uû†‡/ÎÏÎõ )" ½³ãW§,w qݨàaÜóaŠÎ‡õ;`ý»”æí¾VÍ õčع4o”Ë÷\ Ç¢a8ýscF©ˆþªm€¨»u¥€qk§rú¬Êª’†3ÕV‹õ®´ÇF#=݆¡úi6ej®UsE°¡¬éÔ³Ìõ1”zØ­W½¹Wg(Ìqݬ'³lûZ”E%×°lµÑ÷*Ÿfê@ ä½Ó¥ÚÜ'•¨ ³èiô”ƒ BtM5·F‘Œ/œ‚eqw÷m/œ)Ýr<= Ué2ž` LÄÅN™*•¯Ò*϶=éBiç3&«¢"ÅÂçƒFA°M UŸÐÂ9ê¸òù8•5Ðtar„†§"›v1‡¢PÀ÷Ùv¿57Å~»Ôgšp­“,üöŠ:ýx%{eR +Üf*sbnó4<ð`l$a_"Aðy<ÁƒAU;µr–RÕÎ,r՞D@¨H ˜u“Tårª¼‚*Jбš?tÝL½Ï,X›7Z)}ål¦®Ý3C/VR¦2U•iȧu©Û!3´agé—ÍJÈXÙL#Dô2ÞQAs”§WšëŽkjn•ÿgHšhVå†"rÐy_Úö/ïZ3¿ÙI3y¡ƒf4÷.}–K ÉM'_  «.ËÚF?%EÌŒ“ƒGéO_ÏìÑwï`5•õªÊvMÿ<Õ'q#$Zs$6ã•k]8ZyÔÜüÝرŠµÍ¹o¿ýfËáÇæ7üÓMÅ)Àá•ÿ¹Ñÿ±Ó«$΄ýƒ”^œƒ?Ë´Y×Þv”BÝÚüknþVËêw3àå¶_öפػޡ +@Ó¾ªºmŒÔ‰1ýO“·­]ÍÊþ5qW¹ÑÎÔéK w0Üþ¦ivw··‡Ã­j´/²]…²æ +ªÛãéI!ý¿@´ýÊmé|/+àáÖ"æÀþ¿*¼“1 +endstream +endobj +9300 0 obj << +/Type /Page +/Contents 9301 0 R +/Resources 9299 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9279 0 R +/Annots [ 9292 0 R 9293 0 R 9294 0 R 9295 0 R 9296 0 R 9298 0 R ] +>> endobj +9292 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.526 562.721 322.446 573.625] +/Subtype /Link +/A << /S /GoTo /D (main_Time_Elapse_Operator) >> +>> endobj +9293 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [285.409 545.096 332.425 556] +/Subtype /Link +/A << /S /GoTo /D (main_Time_Elapse_Operator) >> +>> endobj +9294 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [275.187 368.058 399.221 378.962] +/Subtype /Link +/A << /S /GoTo /D (main_pps_bgp99_extrapolation) >> +>> endobj +9295 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [292.22 135.599 330.187 146.503] +/Subtype /Link +/A << /S /GoTo /D (main_BGP99) >> +>> endobj +9296 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [347.562 135.599 391.059 146.503] +/Subtype /Link +/A << /S /GoTo /D (main_BHZ03b) >> +>> endobj +9298 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9302 0 obj << +/D [9300 0 R /XYZ 90 757.935 null] +>> endobj +9043 0 obj << +/D [9300 0 R /XYZ 90 625.491 null] +>> endobj +9303 0 obj << +/D [9300 0 R /XYZ 90 610.921 null] +>> endobj +9044 0 obj << +/D [9300 0 R /XYZ 111.798 536.294 null] +>> endobj +9304 0 obj << +/D [9300 0 R /XYZ 90 520.19 null] +>> endobj +9045 0 obj << +/D [9300 0 R /XYZ 448.074 444.94 null] +>> endobj +9305 0 obj << +/D [9300 0 R /XYZ 90 428.213 null] +>> endobj +9046 0 obj << +/D [9300 0 R /XYZ 395.641 138.752 null] +>> endobj +9299 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R /F8 504 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9314 0 obj << +/Length 2480 +/Filter /FlateDecode +>> +stream +xÚÝZ[ÛÆ~ׯÐSJÑì܇T‹µÇISÀµ· P×(iVbJ‘,I­²ÿ¾gfx_ŠZ§‚‘æaAjxxæ̹|çÂÅóýÏ¿½ºŸÝ½‘l @R9¿˜x®$A‚’ùýnþÑ#±`±$cï݂`/̏áú݂b/Ÿz—‡ë¢MæO«•[Ž’²ÐeEc^9ëŸî¿¿{CHg3Ê(âB(v¯?9’ž<#ʂšâ݇.„#B&¾ÊäuÅbIöîõô1‹ÃR»•÷úAç â{:ÙÂ#BxL1ÃtöÍýì?3lðœXE …óíqöñžï`ýû9}ùó³¥:Î9epçfŸáI¥S†°¥#†¸ª4_Ö2>?½„ŠO©„äÍá˧L'áŽ&¨?®Oɐ|RŸ +¡ ËËÂ1…°ú•²½Öyiîïk¸ª÷8ð~2FŠv:‰’ý˜S(†(®ž‚ԏÆSÓhgçKŽ9ò©?_‚)Q™åöþ1èǟô‚$ó§ý_ A&íÕÓòjõêí?1[Ÿ+å­!¢}¾`ï_Xàmš¥ùI¼Þ–N5”q¨`¨š«‡e>âp÷ecý+Gˆ>…jžFXpäÂÖçƒ|în=ž"¶õôóÃWs×p=“ŠFô­íÓÆ%?FI%ú“#¸C¸$Ҍ +¸QHRî^ø‹µ¤Á6xeêÞ£½£¨È •³)À¾~#DyˆŠ¨@AÀ["í6ÍuqŠKwŸ>¸ë6=f§ÒèÍÉu°H1s0šï+<}ÿílþqIÁƒ^-ˆgDV+«O¸Ž|Hwî‰ Hs­0Ã<¶;˜µƒŽ3ˆI{ߞϐX~kX[çú¨ÁÜûA› Þ/„Æî¥Gã~a|ÒÖh Ážta®°˜O<öèë1¼ ¡æ{›šJâ«wU”&«Õ[ kŽ6 ö½ÅŒj}êð*´©Òm½¬QÓ40²˜KbÅÑBa·6âé_Ê<ÌÒØF`%#h@Bþß„e\"õ2ðb¾‚œ­¼ y…:ßü²Õ™Ùï3+hV”»Õ*r0ÆÑnæûÓ¢zÐ 1Ñ6fr‡]îDcµEL’[ äLL®æU_M&V¿›åÁUä»^€:—QbÐL¹‰õ•¤€"ªŸT~Z@T‡¹‰㱫I£¾M¾35e^šïL„š[ƒ9Œò +8ÜZè.Yžf5Y –83 ʂ4_0Û +w;°<›æÕ²©“àˆB©/Q[ù]ÊÄ +Òuc™âžâc½Ñy'ñ™E¨êÐUš +¶zÏkF‚Aí|°÷æî™;ÜlÂB/c—%-—ØQv”T‘)h›ÆK"'k“ž–L€âA†ü™7u{Y íâ„[vv²òƒxÎíÁ¡ ~#Á Wª‡IìXxo Có"eÒ¨—29ºØæQV°nkixàJXp)¢¨WÃÒ-×&3«›ŠœËlñ*«Ÿ<iJùݾgªV#Ýz–ù^¡§JzáÕÛ÷¦å|=,ÛªTAŸ—ºi>Á¢Ý€öÓ +‡ñ©CAà ¥@ Œ\üŽ\ĵ±†?2֑ÇG.¼;¸0¬ m¦m†ŽågÌ%IÌhÂxlÕ­ÃʅéØZÑÉsö¥=ڒÕªa_0¥P1Mà¯Q¸š»QP{øϛ¹“ø8»6‡à_d á_Cð›M ¨P}ÐKӗŒN 8‚zìæY¿Û_Vfnºžt¬úðÁՔúÍT½¶Uhá@ìd¬£a×+ú´À½é!(ÔÕmaVmï ×îÀ~–5‡,ŒlFšÀDàÙWèptll.«·wW÷:•pcS€f¤^¤z]ÿŠømá^FÄ©Ë iÆ+ªŸ?kQ]G=ҔP$ÅUãù=ã=/ՑdÂÔ3H ‡òÁï;C˜b³Ÿ! +XùrB¼8C¸ï4G+¦=¯^Y¸Õë¦ (FSƏæ«O˜G!tÅúC=¬iJ1„rc§t½ÑÐE]Ae Ò݈œ’ ©‚›!7Ã@*¸ò¾'EuÐ0Ž#¦"ÓÛހÏjhÐ+ÓýFA o2r#Õč]Ñç¥F à@ŠàÙ®™·¥Óõ⏠BHmúgØhl~ÖÛ²¨SS=ÀqXìRäP¿#êìÓnªçƒsNë܇dmLÞUú¯M +H0>*PGâ6©¢®Ûœ ŽwøîY•Mà.Mª%›íà:ýÙ®ø†j|Ãf&¡y?îa`L“Ï/e'A—ò9¢<ÖHÒӀRvÜ3•ªˆô‘UÕΨ~²øwž¬%ÿÿO¦:DûƒÎ'V³¶6ÍM‰öÛp¢Ï-Ÿ±¤…<ñ_’”è‹’ô/v˜y5)5XéŽ|7‹cÃrÀÁÕÐ w˜œ£:õBãN‚ÁcÅ"@•dB‰×âñ"„s3æò·Žá„7Þh(bZî)f «!auÊ ÖÀyŸë°´6'vLUmX}õäá¶U»%m‰ÀHq«/R>:ÿÏ6€Èyá¿ùØÌçˆN÷ï="€>‚ʖwÆG ÐU?k¤s?+¸s?þQèü !¼*Fþ&§0nÁ¢±M‘™@˜(¯¾~hftîdÿž×wYýµòó7(p(Ëluww>ŸÑ¶@§$Êr•wYß=w¹cÃĎv`Ç´ÕG ,m›úLÿÿý?¸= +endstream +endobj +9313 0 obj << +/Type /Page +/Contents 9314 0 R +/Resources 9312 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9279 0 R +/Annots [ 9297 0 R 9306 0 R 9307 0 R 9308 0 R 9309 0 R 9310 0 R 9311 0 R ] +>> endobj +9297 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [271.268 678.378 343.546 689.281] +/Subtype /Link +/A << /S /GoTo /D (main_pps_certificate_widening) >> +>> endobj +9306 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [428.986 468.609 513.996 479.513] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1BHRZ03__Certificate) >> +>> endobj +9307 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [117.507 457.63 183.14 467.557] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1H79__Certificate) >> +>> endobj +9308 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.559 371.523 345.883 382.427] +/Subtype /Link +/A << /S /GoTo /D (main_Concatenating_Polyhedra) >> +>> endobj +9309 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.708 258.322 250.895 287.388] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +9310 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [448.024 216.303 483.212 247.272] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +9311 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9315 0 obj << +/D [9313 0 R /XYZ 90 757.935 null] +>> endobj +9316 0 obj << +/D [9313 0 R /XYZ 90 733.028 null] +>> endobj +9087 0 obj << +/D [9313 0 R /XYZ 90 452.248 null] +>> endobj +9317 0 obj << +/D [9313 0 R /XYZ 90 438.323 null] +>> endobj +9088 0 obj << +/D [9313 0 R /XYZ 134.214 362.721 null] +>> endobj +9318 0 obj << +/D [9313 0 R /XYZ 90 346.639 null] +>> endobj +9089 0 obj << +/D [9313 0 R /XYZ 90 199.814 null] +>> endobj +9319 0 obj << +/D [9313 0 R /XYZ 90 185.889 null] +>> endobj +9090 0 obj << +/D [9313 0 R /XYZ 90 89.441 null] +>> endobj +9312 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9329 0 obj << +/Length 2532 +/Filter /FlateDecode +>> +stream +xÚÍZےã¶}Ÿ¯ÐS"U, î$WªÇãµãTMv'öÃfKő¨Æ)“T´û÷nàHq²“ª}IîÆéˁgO3<ûþæ¯7·w’ÍR’ÊÙÃn¦ð, JfÛÙû9!ˆ©Å’`Œç÷ ‚çQ~ˆÖ÷ ŠçÙþÓs¼Í£õOÉcåŸV+ó8IË".íýÊ9ÎáÁâÃÏ·w„t&£Œ".P¥šëk3Äч`D™ªGÜ¿óH!ÒùËU!ßX,©À󇅢óøpÜGelž¼wq¾ á•Ïë8ϳQÐAòúJJí«ê7ÚVP¿ô[¼…óñl¤/ì€4®¤¡uˆÀ¥ÓœH=B¿Ó~kþÞD§ÂŽ4ނ Ç[®´Êï %ÖC‚ñÖ4´„qXAåVªvUüýH(PÆÛû}ì0]ºêš0™šY('#ê6R!“AE€mÓòƒE+uh‚·3¢‘ +@—ÏIáC´Daèç*ük< —Žsú-tžAÃ6SxÀd·ø2Ìçç¤|öµ"‘¶Šè^[uº!¶ã°gNm6íM +m†ÇA”v{ìÁ}ýê]H,;å>–íV/ô3„IjÔs)”c$CÞS­'´AùÖ¬c·!‡!`'”C±d2m1Þã›øÔ] ‰ÐN??Òq`ఓ۟6á ÔäÂãèi“Ó=îqo…é%ŽCDTx•€_ç‚Úôzu¦˜9_ùꆘ]H®¨Î[Õ=ރ+Ö[ ÚۄR]Ôc|9‹#„ Ä9qèEC‚" ™Ÿ²‰P\ã€á—ǁjÈj8 <ù"iàNh¶ßzvfj&hwfôm—ëw±}ìۖ¡°þaÛz”Ùú1^ï*îmÂéi& ™ X.^¡¡*W;ÉúÙ|‘± jÙ¾x§S)ØUL !vL’úÔ  ‡¢=§uæ6pÑD!ϛ°ýµÉn„!҉ ‘1„Ùë0DâDF†z8 Þ6a »*jHf»ñâ÷ó’SXýê—=þÚÛâó(ç£3+:Î7­µ˜Â ‰ëFú šÑ s`P¥¢þ}¶cjsàY·¯¨†D¥“ÎK02.Ê$J;––Õ¡M·“¿Ç8šíÊan+‘ÒXù¢¹-ƒ-ñ±Ð×  䨦ŸÕ¾gÝx™¤›ìpVë¬ÿkÛ}7%@IV’^é½I·××4¯‘X]e©D/1k;]_ÈA3 ©µÕI™ã!ÊN†0›–$eÍIá?ú„õ…?§¦O‚Öib †óoôÖx5CÙ%㠀wãBBú’ì*‹ Ú¶£ŠïØ#üöT_€לúë×G{`ÐTµXÊá â*°|—Žò]Úýdò9|—·›†ÎÑlg8Nç8’ä%„— +5Hxbmõ¨¨õ^ÀS;lß½ô‹€–“_ßØRêuÜâc¹ÀÈ°¼Ær +qŹºf©xA碜T¦-ŽŒµ¶OŒC¶Õ[¨NÖ0ûvª©jÐXWݨ]ï笰N;D“Ãé`ž{Yýc&Í7±ê ³Ï ÒÙQfS0œÇ¿Ì§6ÕÐcXJ!þ2”J2¼C‚[~3ˆÝÜZÚ-QU{ô×{ÎÊ6F½© @ (˜›N^”?õÎ íÎ#Ԕ|}a}¯/¿„õ‘êµÌüv»–Â<òæHª?Á¶ásx!otŽòx¸KÔ3î.ûP½÷B×WU÷Ý4„ž,¸²ãÓfY³ç3ÐUúùvˆˆ}t›[®}—'qZS”oê]ò·±æßö¦ýÚ®ïþ–mª†(ªO<èOº”#}AW>šr<^kiÈ ¾è¡O¼ñ‰”@DFéN“lã°6vT-üzHn{8â7À2L×í¬õZïNéÚúÙµg@ôV•5ÍÉë­ }}ÿfµè;COÕfCU[SãßÓ ÁÿÊüžOiY½m%hHä” é%Wn! ۔vö}&Lòe‡8rƒs/§'aí©tOKü’7§8줳¹®ûœmk2ßûØ´sÉ4².Ééâ‚NRb&žáªÎnšA ˜³[Â|˜pñ½ÞšÐÛV ç`‡½µ›Wææ_Eœÿq!Äܚý(=ÕK,èÄø}cFúD›ö?ÒW'LŒ‘Ʋ_gõÕß͗œV_ˆávs¿,«ÛÛóùŒ6:¥É1GIy{<îo/ùXG +@!h„ìêow‡,ë•‡Éÿÿ:à2 +endstream +endobj +9328 0 obj << +/Type /Page +/Contents 9329 0 R +/Resources 9327 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9279 0 R +/Annots [ 9320 0 R 9321 0 R 9322 0 R 9323 0 R 9324 0 R 9325 0 R 9326 0 R ] +>> endobj +9320 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [124.42 660.753 272.524 671.657] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_787615432c9f1d6aac5a6394aea8cfa9) >> +>> endobj +9321 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.639 466.653 300.161 476.934] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset_25717d92bb71e83e73c686fb6f231efb) >> +>> endobj +9322 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.144 426.552 182.164 437.456] +/Subtype /Link +/A << /S /GoTo /D (main_Expanding_One_Dimension_of_the_Vector_Space_to_Multiple_Dimensions) >> +>> endobj +9323 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.502 321.153 241.69 350.218] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +9324 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.635 247.743 163.823 258.647] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +9325 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [486.549 184.355 513.996 195.259] +/Subtype /Link +/A << /S /GoTo /D (main_Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension) >> +>> endobj +9326 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9330 0 obj << +/D [9328 0 R /XYZ 90 757.935 null] +>> endobj +9331 0 obj << +/D [9328 0 R /XYZ 90 733.028 null] +>> endobj +9091 0 obj << +/D [9328 0 R /XYZ 277.106 663.906 null] +>> endobj +9332 0 obj << +/D [9328 0 R /XYZ 90 647.191 null] +>> endobj +9092 0 obj << +/D [9328 0 R /XYZ 400.69 429.705 null] +>> endobj +9333 0 obj << +/D [9328 0 R /XYZ 90 412.99 null] +>> endobj +9334 0 obj << +/D [9328 0 R /XYZ 90 158.838 null] +>> endobj +9093 0 obj << +/D [9328 0 R /XYZ 90 136.526 null] +>> endobj +9335 0 obj << +/D [9328 0 R /XYZ 90 136.526 null] +>> endobj +9327 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R /F8 504 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9345 0 obj << +/Length 2629 +/Filter /FlateDecode +>> +stream +xÚíZKsÛF¾ëWð´KV™£ycF»åC\k;Y¯£ØÚÊÁv© ” €ÑúßoÏ‚R§ö°'¼{zzº¿þ>xv;óWgß]¿”l¦‘–Tή63g‰$HP2»ZÏ>Ì AL/–c<¿\«àÄâÓÕç/ é FE\$àŠëï?#Êt{ÇåûˆÂ!‘ç'¼Ø¦u½XRçW MçÙn¿M›Ìy—m²jAÔ<+VpŠ!æ,ÆèÙ?®Î>Ÿ0ƒgÄJ$(ab¶Ú}ø„gk8ÿà C¼ÔìÞÞµ›qÊ`»½?ûé û ã£ÁWaÌg •ˆHî§ì‚žî²Âxa[:©Eº +%Xϖ°Å‚:3÷»Á“ç/î?¡KT «;Œû|yqëŽÀƒ»r"ñ]²aM`+­9ˆ#곧iãüp‡[ÙT@ y·€Í—}V@@K®èüòµÛ>s›áÅф7q21 AÚ;Þ仼ÉÖ×?›Äð1¹~y(VM^±(CTÊɼ6Ð.¯_?›ð—)$%›rwɉ@^BÔµ~͍«×›Cqí2zëˆÙü#ø7“Ue¾^{xùú♥úш`юücœ#­h¸GcqUucÆs dÆý ̑:ï.13]{K{éPÔùm‘­c¾@¥D>ÕwÏ <b¬›ÓÖÆxu(Àî³6”GýŽ™H³.¹VuļBT«‡^ÊA¤h7•UfjgýÉÝ9(^¨:À›Ù’j‘vOü\¥{r©Ûl]/m·ð]žÛ´‰nÊ›_²UƒFh2ÌFŒ´–àF‰ (Œm§qŒRDxòÇNÎ|<KouIdé¯ëQ<…úWä6ƒª"ìŽë/5 bÏÇέf ÁqØ5æqØeßvYoÅÀã'€•à.­ëf}q±Oó*†zÐSÔ 홺|ÿÌ;öD¢¡^ÕzûöŀÿhvD#Ba}‹c7fˆˆ!toó"K«ë}Z5y¨½>°Âáå{·¡¤U²+IãÆóGZâƒq‡ÅŸOÿzˆ£˜ ))A’j$æm„êÈ# øsÄ°B\v ~Ÿ7wnÎUVïå|-–ӐéDŒ¢;° Y(†­^³Â@ìÎâM›•ÃØ@?¤66@‚4éJ--Ö1#€ ”MÍ`äJ›h>oî-;0b¾oi>‚hhâÀÌ\mÁź4ÎëQ‹„0áís”MdaaÖ"pòý0P'+J%“ˆ2¨û¿£$¡ðµ­-åï +L´l] ʓtt—ŽÃ´¯Ê}V5_zKèXÞvëãØøG²m¶ËŠö(­ZPR÷yíÖyýKÙ1­ÈéMUî"Qd˜¡R§àS #“ .OÄJÔ´4Æõ*p %@U¾J·îä¡°Ycv£YC Ÿ`Lä(¨ +2ê$ƨ®ÙéÜÑ=>(ÄGsõ˜E' %ºt»ÍTÌ3m1‹õCʁÈè©ìæ(x¯mãeèYÌr.¦|`*¯CP&8²ž*ÛCç…ःZ#:²fp ?U¥å×DpPéP¯ VWŠ!Áæߐ`S,ãˆejŠ`éÄìá×K¯ª|mEºx2ÁîŒ$cO*ö²öÉÜs¤¨ÄÐH†ÔL÷{GÑÿ“ï`•ºF-1’œóošn[¿Žnl´Oò„{Ú>@ž’ìєۛ¿)Ëíq›Ç8ðÏÓtrOu<x/ú1Ğ<ŽØ+m9Ʊö±Û.=†\˜g§¸¾:Íõ'Ñ(ôâ“"ߌšcYl}ûm/NÇ·–ì´kÓ +‰š½'’ŠI!!O&•ŠF$a'hO‚DȭϧŒ!Á( B‚QÒD„ Ô‰sGæ¨æ -ÜsÇE„×^—<âí‹ëU\D0HZ.þ÷D„ø3ED‹½ÇF0Š ÌSÒA>J:(ó2Ayå ÿ¯~¿rðŒ÷{Ht.ˆ™§áîÜãˆ9•ºM 'îbsÌÅ8§âa9‰¯¶jâ@’L¾Õ±+e|úúX–‹@ÑXhH›<ÖÁF#`Dí'…Á”–†i6zÕÁ_PÀ80úæ2-Ðt`9V 1Ü +Òhî´h漓pÊ +4s¦'!à´hf'4sSPbö&Ӄž>*Ð £U2Ý5 @g÷é½£wšôM’V™ÝhÞi á=Ød¥Ëàïî`Ô©[ØqEŸ¨¾º=:h‚XøÔ4½¤B±GË/r@LS”äqê #EèTçë[ÊëA§³ÚfÃÍCz¼T_­Á0C”§k°>ævã_úž½ Úù×\ù¹òd9Œ.!¡?:´BaJ6ª0’3’åŽpbc?um[Oûë»TçÅí6klü‚Õ¾“; ݚ4¾Ó&šØŸ¦‰n 2yíמã\Ö¹jì¾ûŀ /' +aÈ<ª…ó¸¢ÆF꩸¢ßò“•®G>YM°Z¨Â+r«§Œ±Õ]¶úõÚ/”wº§ývUŒÒ¼2 {ÿs%ü%šN6ï›ïKñ® )JìG†>{<-Ó¤ •ò¿8q% mµ‹Jüû¹ +¾^ƒÌ¡Ûé¡}çµH¤&ÜÝe„¥ þ ² “'(ÁŽ”¶±‡»Ý5§…ꉂ%Tx#؆oȀ`º¼[é ¬"•¡aµ :´å’¬ÿëèoˆ4‡¶4ø1àmÙd“ßÒ¡•‘á_ߘÔÒA°†&_ׇÅ18éQÔîe~'üâwïÛßÜEû¶+#8ÍõÿfÁ±ïçUÓÚ7Ü¢<4ÞV•­òÚ-\ۖöÏ2ãšû‹öÒâ¸ú3&ÌwWºx¬ø¢s¬8pÙж¼gmvµ‰±*«ª{§Qeõaë÷wùíß½érÊ,6úbü¯ð9MÔcu³¿¶Á*JhñLùÿ +…FBðÑ/þUÏÎS‹vÎþÐÿYèþ]gÕ_Mgñùÿ¯´8¤ÛðªÎ/Tݕð|Ç,,÷}Ÿe~’nf¿ÎÚ½:ü% JYøè×4û‹óóûû{´ª”è¾Bys¾ßoÏænÏ +”Zx±)+¿ +eÕ)P8¹³TëAüÿ }p=Õ +endstream +endobj +9344 0 obj << +/Type /Page +/Contents 9345 0 R +/Resources 9343 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9279 0 R +/Annots [ 9337 0 R 9349 0 R 9338 0 R 9339 0 R 9351 0 R 9340 0 R 9341 0 R 9353 0 R 9342 0 R ] +>> endobj +9337 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [452.228 490.681 513.996 501.585] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +9349 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 479.349 138.817 489.63] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +9338 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.573 479.349 230.252 489.63] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +9339 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [452.228 326.595 513.996 337.499] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +9351 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 316.407 138.817 325.544] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Pointset__Powerset) >> +>> endobj +9340 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.573 316.407 170.476 325.544] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid) >> +>> endobj +9341 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [482.674 105.465 513.996 134.53] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +9353 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 93.509 154.647 104.413] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +9342 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9346 0 obj << +/D [9344 0 R /XYZ 90 757.935 null] +>> endobj +9094 0 obj << +/D [9344 0 R /XYZ 90 700.89 null] +>> endobj +9347 0 obj << +/D [9344 0 R /XYZ 90 687.202 null] +>> endobj +9135 0 obj << +/D [9344 0 R /XYZ 90 570.195 null] +>> endobj +9348 0 obj << +/D [9344 0 R /XYZ 90 556.506 null] +>> endobj +9136 0 obj << +/D [9344 0 R /XYZ 90 406.108 null] +>> endobj +9350 0 obj << +/D [9344 0 R /XYZ 90 392.42 null] +>> endobj +9137 0 obj << +/D [9344 0 R /XYZ 90 208.159 null] +>> endobj +9352 0 obj << +/D [9344 0 R /XYZ 90 194.47 null] +>> endobj +9138 0 obj << +/D [9344 0 R /XYZ 90 89.441 null] +>> endobj +9343 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9373 0 obj << +/Length 1568 +/Filter /FlateDecode +>> +stream +xÚÕYmoÛ6þî_!`@'5CR¢(Á€-X‡¶+æ5ö!- Ebb­²¤Ir<ï×ï(R´e+®Ó¸)öɒ|<ÞÝóÜ %lÝYØúeôÓttöÊw­…>õ­é­b‹û1J¬ib]ۄ ;c‚1¶'ÁvT-¢ÙÄ¡Ø.²õ\$U4û5½©¢j}~Þ=ž]ùì½È¢&-rgL¶/³¨®Õå{q+*‡¶Èc!UâÙ.÷Ó7£Ÿ§£¿GŒÃiaq—Yñbtý[ <ca䆁µj¥–G]øͬ«Ñï#|Ð1ê"ì3ã˜"ùÚ¹F,J0XH+Î^²µ4ð@TîÑ.¼P=å`£vͺy´×ÜÀµ'W}Œ83 ~Ðæ1ßë$îeä‹4Q*ëUTª«˜á#QI󦍖‘KV¢‚ÆFˆþ!Çaˆ2bÁΐ鐺J".˜#põ@X¤'³ç‰Æz0*%Z Ñ2¬Ï¯€š]W2YEòQI2¼µ‹CäbXsäƒ튫RÄi”¥ÿŠz@»Ç‘Kh§½n’óó–´ûڙ Ν$âØA w²—ëì½)ŠÌ{¶ã¹ˆ?Íâ"o¢4_ˆ¼‘I›)ð°n”Ôe²ÉB%‡"N}¬41/çø1ºÍA‚¹o›-‰ÝÑÍ!ö±Œ#2âì`å!1אòr6–2Ÿ’«8ØÉÏ}—÷÷dY~J†–õ€ŽŒŸŽ¢!öÀë3t:ªß$E¼”DØêF·E¥.šyª»R¼iP«¶rè›;‘‹Jn¬WVÅ¢[*:eYV8”Ù«4¿S>`L3qÞv´®%YÄGž P†XÇ㔲¾Ôu[¼Ê2Có ÍŠT¥ƒVãB) ø3uéý˜cpú"´½~´«žÂѬ„Ð7‘ú)µIL”'½ÿۜ© {4À +¬QÖü.Íãl™ µí~i¹ÐÕkÛÛ!ïéq +|v(#Æ!GÔ;U¢4ÿ&˛,•KïÄâFhʽZæ± PÝÃ}'º†+ùþg¸r¯ +K¢ÿ“ƒSu§'¨÷­TÜ:NÓY²\”»:anÓpƒ@Olc&§¼¡³‰,Œ`ž~C[ =í÷ŸUÚM¢¦0Qß,â~Øk±¨*%ÙSƒˆoæHÓåÇ«Ëׯ5×—Û¢T?u?ŋ[]˜Â-…a€¼ÍÜYêØ3!6´i ľeÆ3öÚÖ^¬€vL%0ÖÊ ’çÁ¶ri%"]¾^ÔßïhÊ|¦ßg~ÎôË`&Aˆ8pDÁ|œË +ŠâWN߉ܣˆ)T{²9‘<%¦P—}Ó×)"J‚GWˆe-ð¾6Ñçfâ”ý¼ÐÚ AlYcÄf²¹¸ØBånæ­G&>,Æáq‰ß´ɐÂy5õCtØ&Á&{CÀ€®ëkê0fWK=&¤·;ͿȳµùkŸ}0³Í‰âdìÛ +â.iD<¶sÌês¹Á–²±w*"üöö+—„K8RÉúô©ÞÁ.ËvFa8ÝxPÌ¢*dQRªl«›xVËéX$èsú“œòä12“°îè)Ë¿¬žmȪզOȧ—åPU®AüҜ뀁±^T›¦ÙÌ£¦d­qêÌ ì±eMo|™¿bÓz–¤õ_Åç:äS#ٝ^Ù{'“ò<ߍ'zYj2¢M‚Ûµ9-šUêä#§Ÿôé<ü?ž¥qKÁ~ùÂ#nêgªÝZžÕö§Çì¥>öÊr¹ÔêÒîw“h5íÑ51µS‹?ÝošƟg‡µ>Г|›Ý¯>8ƒì‘/ڏ®B}I}´`!bl7“Öœj¡ß˜Lº—<êV¿éQ7@áÿ^Ž^ÚÏwQ¾Œ2ǀr/UA>šÞ€‘|Á'±BÎ؅\¹B;­<ûduWoGíд±—¹ØŒió¦)ÏÏÎV«Šk´ÌÓ²BisV–ÙÙ~_ÞÒÀs£Ä¼«[•3àá¢%gˆÿ+§ +endstream +endobj +9372 0 obj << +/Type /Page +/Contents 9373 0 R +/Resources 9371 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9388 0 R +/Annots [ 9354 0 R 9355 0 R 9356 0 R 9357 0 R 9358 0 R 9359 0 R 9360 0 R 9361 0 R 9362 0 R 9363 0 R 9364 0 R 9365 0 R 9366 0 R 9367 0 R 9370 0 R ] +>> endobj +9354 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 471.944 181.845 482.848] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation_a4b60ce3ac62aee15faac1b5035fdb4d) >> +>> endobj +9355 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 433.089 181.845 443.993] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation_b92b75d150bd5fbfc03cadec75d59e0f) >> +>> endobj +9356 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 394.235 154.727 405.139] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation_4cc725a9fe3bdaded2c131bb8bb47ed8) >> +>> endobj +9357 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 355.381 165.446 366.285] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation_a317e5d2d782c3589c48cb3b45d6790d) >> +>> endobj +9358 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.784 355.381 273.381 366.285] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +9359 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 316.9 150.493 327.43] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation_80b9d602f99df76039d58032b20041d7) >> +>> endobj +9360 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 235.764 218.029 246.668] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +9361 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.527 235.764 250.965 246.668] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation_553ae81ae234cedad36e72b32c967e65) >> +>> endobj +9362 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 196.91 218.029 207.814] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +9363 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.527 196.91 262.043 207.814] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation_62827195c6aeacf38a8fb3df6df8ff2e) >> +>> endobj +9364 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 158.055 218.029 168.959] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +9365 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.527 158.055 290.804 168.959] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation_9f09728ae53c8e3dadeb202f28bb6fdb) >> +>> endobj +9366 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 119.201 218.029 130.105] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +9367 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.527 119.201 266.456 130.105] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation_1dd09c87a931132dbee52ea24266866a) >> +>> endobj +9370 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9374 0 obj << +/D [9372 0 R /XYZ 90 757.935 null] +>> endobj +9375 0 obj << +/D [9372 0 R /XYZ 90 733.028 null] +>> endobj +9139 0 obj << +/D [9372 0 R /XYZ 90 691.329 null] +>> endobj +9376 0 obj << +/D [9372 0 R /XYZ 90 676.759 null] +>> endobj +1543 0 obj << +/D [9372 0 R /XYZ 90 595.99 null] +>> endobj +294 0 obj << +/D [9372 0 R /XYZ 90 589.39 null] +>> endobj +9377 0 obj << +/D [9372 0 R /XYZ 90 490.918 null] +>> endobj +9378 0 obj << +/D [9372 0 R /XYZ 90 490.918 null] +>> endobj +9379 0 obj << +/D [9372 0 R /XYZ 90 452.183 null] +>> endobj +9380 0 obj << +/D [9372 0 R /XYZ 90 413.328 null] +>> endobj +9381 0 obj << +/D [9372 0 R /XYZ 90 374.474 null] +>> endobj +9382 0 obj << +/D [9372 0 R /XYZ 90 335.62 null] +>> endobj +9383 0 obj << +/D [9372 0 R /XYZ 90 254.738 null] +>> endobj +9384 0 obj << +/D [9372 0 R /XYZ 90 254.738 null] +>> endobj +9385 0 obj << +/D [9372 0 R /XYZ 90 216.003 null] +>> endobj +9386 0 obj << +/D [9372 0 R /XYZ 90 177.149 null] +>> endobj +9387 0 obj << +/D [9372 0 R /XYZ 90 138.294 null] +>> endobj +9371 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F72 471 0 R /F99 2117 0 R /F98 2120 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9408 0 obj << +/Length 1381 +/Filter /FlateDecode +>> +stream +xÚíYKs£F¾ëW‹UÑhހk÷ìÆ©ÚÍÃñ*‡-¯Ë…¥±M‚@ ÈZÿûôÀ „ä÷!lº§»¿éù¾v®ìü2úi:šIæ„(”T:ÓK'Ď/ ”8Ó¹sê‚8öÆcì{»Q¾ˆÎ=ŠÝ,¹½Vó<:ÿ5¾È£üöðÐ~}þ.KÏOT•q–zc*°û.‰Š¢¾uHr¥HrêŒ G!çu<ÓkUçziŠäqáÚRĦq:KVs5·wõgi_-TY_d—ÖVœ–æÝjö.Dœ^õޜeiQÖOá ´#ˆìÆ,D8pƜ!"XÄQ«tÞÍO¿˜u-Ç:wÕò"˒ý•Ì– +*’åoßîªIÙSà`|û¡•ªç0xû$¸xB¸ùʔ/6õŽR,Mn›Gàj'Z¥D‚PðUÙúVèøô‘¤ÄÐf·d،¹Ýa¤ñåó]3á$Ӎé*žE‰¨úºŠo¢Dí‚ß< ŀC(†Bò\€úîPÿ)@¥YùÂÈÚ­Á¢i°=r—±<8øŸ!ð³çs7VɼèmN­’6óý{•Î6T%Â$!>ÂqP +û™yþ@€É`|oëz)|iâ7~…˜ésE¡ò žÖqym$É6UªÀW샞Ĉrqoè•×‘i_ÃM-NœŠBŸ= ™}NG¥@4 «3Y«êaIç‘YxEí¯h 8b<4P ýž•Ê&ÐÆ©,lÞó~¨ µ¸­Q]_Z_h«è)ù]š`~x˜ÁUÑ¢¶|p?PÇ­¿-F 3¸Ù„Þ¼ÙKv}¡«ó10•â¹—H~ß%2Ä¡Z5òǪ\®¬ŽX*# „÷áʀ·D)"F–¾We'RïU1Ë㥍g?¨”wÄê…*×J™›¨«¤ì˜†ÌDmÑÓí‰èeÙ(2+»f%/–‰Z¨FUµ¶¢¢«½š–b¿ï«µg W‡QDBÑ®5°J­²ó£µ;¸ÒM‘²ÙJÇÝÀ®_c¿©qŵǒñ¶Hƒ{ÖÚ`ªÇ;Ž ôȃ:,a•Iôzk'r@sÐôVX]„‹Ð}¼GÂ$ý^£í9¬O4ì2'M»n­ +NB$½# +S•Ó˪gÃÀ¯à(,Ag&èc¾@$ès¡Ž;h2âBíø²—ˆ=Fò†Àmñq +÷FÿÛðò~!Ú&ż‹2ÚE™måVÝ·Q&ü­š{ĵe‡§Ã@ÈùäA@Ð,÷8m<Ê@ƒküŠ´Ç#­%Ÿr¬9S,ªàíVÝ·0¨o÷¼9F%ÌâAøäîrX‘}DÖ58d‹â5½~h2M*ÄS¡ >ƒ‚ßIX#Ht÷ãÏú„bXÞS¶æ‚Þ…Òà©(@ÑwPðþ±9hÁ÷=5·§äRk€Àü Bªž|\¸|a8ñý  ¾5?Ô7cù^gÙdø·(]Ù¼j(ßhS*/šÜ£ƒ•¡k¼1‘þI)dÙ?Ž½ú8ª’·™/4 Ä6Dúº,—‡“Éz½F³­Òx™£¸œ,—Éd›a·¬uõ#—™Q‹Ìv„8…/¸·òÿ/MíEÖ +endstream +endobj +9407 0 obj << +/Type /Page +/Contents 9408 0 R +/Resources 9406 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9388 0 R +/Annots [ 9368 0 R 9369 0 R 9389 0 R 9390 0 R 9391 0 R 9392 0 R 9393 0 R 9394 0 R 9395 0 R 9396 0 R 9397 0 R 9398 0 R 9399 0 R 9400 0 R 9401 0 R 9402 0 R 9403 0 R 9404 0 R 9405 0 R ] +>> endobj +9368 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 719.912 218.029 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +9369 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.527 719.912 255.378 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation_c8b0d22ea3470020b35240f778c34a94) >> +>> endobj +9389 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 639.15 180.54 650.054] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation_825bf274e880e1c8d51b42d32c69004e) >> +>> endobj +9390 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.877 639.15 288.474 650.054] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +9391 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [330.207 639.15 410.804 650.054] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +9392 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 600.295 178.239 611.199] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation_f7184f692efc0672e3213f6be9d5cf4c) >> +>> endobj +9393 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [205.576 600.295 286.173 611.199] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +9394 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.906 600.295 408.503 611.199] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +9395 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 561.441 194.507 572.345] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +9396 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.005 561.441 245.695 572.345] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation_d1bc9d7804925b15f8205df0b3efc8a4) >> +>> endobj +9397 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [273.032 561.441 353.629 572.345] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +9398 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [395.362 561.441 475.959 572.345] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +9399 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 522.587 194.507 533.491] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +9400 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.005 522.587 233.312 533.491] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation_b9da0d811233cfb64481a7fe08b7f645) >> +>> endobj +9401 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [260.649 522.587 341.246 533.491] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +9402 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [382.979 522.587 463.576 533.491] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +9403 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.349 414.546 226.034 425.45] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation_f00b427f47054a80d236d124443c580c) >> +>> endobj +9404 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.176 414.546 401.773 425.45] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +9405 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9409 0 obj << +/D [9407 0 R /XYZ 90 757.935 null] +>> endobj +9410 0 obj << +/D [9407 0 R /XYZ 90 733.028 null] +>> endobj +9411 0 obj << +/D [9407 0 R /XYZ 90 658.124 null] +>> endobj +9412 0 obj << +/D [9407 0 R /XYZ 90 460.798 null] +>> endobj +9413 0 obj << +/D [9407 0 R /XYZ 90 377.226 null] +>> endobj +9414 0 obj << +/D [9407 0 R /XYZ 90 300.901 null] +>> endobj +9415 0 obj << +/D [9407 0 R /XYZ 90 278.589 null] +>> endobj +9416 0 obj << +/D [9407 0 R /XYZ 90 278.589 null] +>> endobj +9417 0 obj << +/D [9407 0 R /XYZ 90 229.348 null] +>> endobj +9418 0 obj << +/D [9407 0 R /XYZ 90 214.777 null] +>> endobj +9419 0 obj << +/D [9407 0 R /XYZ 90 167.573 null] +>> endobj +9420 0 obj << +/D [9407 0 R /XYZ 90 153.003 null] +>> endobj +9421 0 obj << +/D [9407 0 R /XYZ 90 105.799 null] +>> endobj +9406 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F11 418 0 R /F95 1788 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9442 0 obj << +/Length 1456 +/Filter /FlateDecode +>> +stream +xÚÅXmoœFþ~¿©R +Ro½/ìÂZQ¥Ôj¢$âÆWU•Yö|4\yÉõþ}gaá€ãlǵ“O¼ÍÎÌÎ<óÌغ±°õjöËbvòR0K")¨°KKbËqJ¬Ed]ڄ —8s‚1¶Ï‚í _WçÅv–ìV*ʃ«ßâë<Èw§§íë«W*½ú ’ Œ³Ô™SŽí³$(ŠæöƒZªÜ!¾­ÒPiՄ¸6ó|çÓâÍì×ÅìŸç°Ejg¸‡<Æ­p=»ü„­Þ¿±0bÒ·¶µÔÚr)ƒkb]Ì~Ÿá[7F‚ï7†En·9ãûYÖ÷ag•e–;̳çú·?bŽÃ,-ÊFâèbn?ÓÛ:y)yφ b­=ù·‘xë"é“Và'g.„kßiÔXs†b.±æ°AÉÍf§œ y¾lmì&p©Û +ÀŽ‰‘h!ȧ§—Ë–Ìe®í«I,ã!ŠßWå¦2èèRÀ®³Ü ½‹·QVk•–=’\Â:îØÀ9Üó润_óp£RmHEfež­Gu±Ì’$s(‡âIošW1¦‰:­‰¶eJ‹ä2_Ãqivô‘R>”ºœs@ßf“ Õª‹s/Z±UÃ\D|ï5ÉÔP±q°ó¾kUn•2AsُZ™ ßMÀ{™ÁhŠâ4LªHMÔ"gȓ]=ŸÐ=ÏíȨôƑ/:tÿ<Å)҃ Ð!¥œW×I6»z§Ö×ʀî¥fÑXd?ó£øvh¡Pïüv´|©3Gæ›îèùiíj©†êÃ8¾Šªõf¬£,Çuݶ\-°/¶wÓ£Àᥡ2áꊆFꚌü™Ç¥jMÖE}¿ ëï{@Í}¡Ê ­ Ôs »oƒ˜g¯_¸é£‚Ú4—bXämƒ’²§PBûárOT˜Møç"ý}‹Š‹ Ï(œÝˆô™ƒXIíœJ༥o$ß&·]‡©»‹~û¬øNùžˆ¦®gú]òìÝ#Ïôai&>#—æM§åWﹶQL„èž÷1B +´,º£ì$b$¢Äÿj‚¨ +݁µA…×Þ ?ô¼‡¹…ÉñÙm`BÅ`ÝÃb,Ûº¿×Y–ÜŽ†x½IbUÃCG4œ&t=Û=²º£ç•9)ÄËQÿÏÒd×}:„Ÿ@¸ôÑá× â5>"ûCïn +|ˆù¤8Qc÷~àn ¼ûĜp¶R¡&¨ÏÅ(wC" m.°YÇAÚNŠACÛÍC8+ôùXEèˆ;Ó“šñJ“ÀàW»s¡é߬¾Ù!«hŒþz:º Fޕa®£I|hÍô÷ƒwì +gàá_ËkÆð}hí ÃXT×LzÅSÄñEuÓ]ö=jéqE‡¬n)Íü˜UI4ú™j‘U6KFzڑÈq9°àí±ÿ·à7´Ê{þ¶«×Aò’¿ù]Ç%â|Œ—ózO0F:]Jê9²y4Ãdóð ëGÍíG +§‹û­JåE>ŒFT§éßlؾPÊlºÙÙg«½{;«Yyï/̼ˆá®¬Êrszr²ÝnQX *79ŠËåN ¿§rëuJºßë,ïx ^®kð óñÿPÿOÅ +endstream +endobj +9441 0 obj << +/Type /Page +/Contents 9442 0 R +/Resources 9440 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9388 0 R +/Annots [ 9423 0 R 9424 0 R 9425 0 R 9426 0 R 9427 0 R 9428 0 R 9429 0 R 9430 0 R 9431 0 R 9432 0 R 9439 0 R ] +>> endobj +9423 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 454.319 181.845 465.223] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_8ede6a8a55e35d1c41065b01afac0342) >> +>> endobj +9424 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 415.465 181.845 426.369] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_a303fa28c55c391afe4f067f91db36ce) >> +>> endobj +9425 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 376.611 154.727 387.515] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_4f7df2a0b66616d7672e562fa8c4e8f6) >> +>> endobj +9426 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 337.756 165.446 348.66] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_419ea78710f4b45c1542647e1212a3f7) >> +>> endobj +9427 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.784 337.756 273.371 348.66] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >> +>> endobj +9428 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 299.276 150.493 309.806] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_0ca2fc9566495b3d4ac6b970a301d9a1) >> +>> endobj +9429 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 218.14 218.019 229.044] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >> +>> endobj +9430 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.517 218.14 250.955 229.044] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_af9d682418e536d9a1f6bd24991e1c56) >> +>> endobj +9431 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 179.285 218.019 190.189] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >> +>> endobj +9432 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.517 179.285 259.253 190.189] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_f78754c1ef47797c0acbd31cf48f9caf) >> +>> endobj +9439 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9443 0 obj << +/D [9441 0 R /XYZ 90 757.935 null] +>> endobj +9444 0 obj << +/D [9441 0 R /XYZ 90 733.028 null] +>> endobj +9422 0 obj << +/D [9441 0 R /XYZ 90 691.329 null] +>> endobj +9445 0 obj << +/D [9441 0 R /XYZ 90 676.759 null] +>> endobj +1544 0 obj << +/D [9441 0 R /XYZ 90 578.366 null] +>> endobj +298 0 obj << +/D [9441 0 R /XYZ 90 571.766 null] +>> endobj +9446 0 obj << +/D [9441 0 R /XYZ 90 473.293 null] +>> endobj +9447 0 obj << +/D [9441 0 R /XYZ 90 473.293 null] +>> endobj +9448 0 obj << +/D [9441 0 R /XYZ 90 434.558 null] +>> endobj +9449 0 obj << +/D [9441 0 R /XYZ 90 395.704 null] +>> endobj +9450 0 obj << +/D [9441 0 R /XYZ 90 356.85 null] +>> endobj +9451 0 obj << +/D [9441 0 R /XYZ 90 317.995 null] +>> endobj +9452 0 obj << +/D [9441 0 R /XYZ 90 237.113 null] +>> endobj +9453 0 obj << +/D [9441 0 R /XYZ 90 237.113 null] +>> endobj +9454 0 obj << +/D [9441 0 R /XYZ 90 198.379 null] +>> endobj +9440 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F11 418 0 R /F72 471 0 R /F99 2117 0 R /F98 2120 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9468 0 obj << +/Length 1397 +/Filter /FlateDecode +>> +stream +xÚí™KsÛ6€ïúìÅ¥f*ožäÐ6uf’>\G=d‡–`›-E*$eÅÿ¾ |Š’åZi§“\l>€]ìî‡Å®ˆ[;¯G?LGǧ’9 +)I¥3½qv?9I²<ÕÁ¢”|´_PÚ[³U¿bð ®¡/v»R¾ªÆ ,%;ôI÷Ý"å#Ñêì‘ßVùreƒaü0&Â-|Aٓ"¦àÜì2T´<¨jz^é<£ +©W:›¥á²²g7TÓj¦VèZçk­íMPþ[ÚfªS3öý­Žm˜¡ô),3ʈٙ¢RÚm>kZ­p±Œôª‰lã8jrB7«TÏã^.ù6ô‚1Šˆâí8P‡ª_+D}_‰Üï6TÉleL¯áë‡Çʯ#]TÜÉx»Uƒ{Ö:fŠ×[Ú\3ò¨4 vyc…~Zb¿—a;–Ó~aa.”ûÏ5î#éõÒmOaÙ5W›ÔI»µ78QHúæ\"H Y¾¸)q9ŒAd]¦³'—é0O â÷K¢Ž:HR •DÞ÷dÏ;„¤u·Q•©pï͟¦:ïç‚!™`b)]Êh—2!Ûý[qߦLx˜‰Û;¼ #æ‘'& enQÚÑ(·€×øФ‰/ˆ´V3xpäXý»Ý`Pï´pÅ}‹As»cæŒJXœøƒ2Èݦ°(ùÁ4§1`݁£ûëâÐbM*Äsѝ~ÓÇï@ö],ߛƒn¸MܳEl­,}ŒRÿ¹” +(Ô»…ør’>Œߍ#MÚ3ÍÃÄ<mê̈­“Å0u˜ &ŸBԔî£úJö°„‚¡ÇÞ`&ÄÈSìõf¼[nÅí c»SPb±wÂlwŒ;ºÅƒæ×ö4Jë¿ÿABAü}¿ß @•4ýªo¿ë὚þ¬h6҅-nϪ¯!å­ý$RÞüîÿÖÇzõ— ^U»ß oDé4«#„¡mCÔ@‚ ¡Ø}§µ5²´ì/§ºz;*œ×¬Ž2̦ï.ϗ'ÇÇëõÍ2´ŠÃeŠÂüx¹ŒŽ7»Á–h³¼ZÈMb»ÜERE0Œáá¢Ø)þÿ;ˆ8 +endstream +endobj +9467 0 obj << +/Type /Page +/Contents 9468 0 R +/Resources 9466 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9388 0 R +/Annots [ 9433 0 R 9434 0 R 9435 0 R 9436 0 R 9437 0 R 9438 0 R 9455 0 R 9456 0 R 9457 0 R 9458 0 R 9459 0 R 9460 0 R 9461 0 R 9462 0 R 9463 0 R 9464 0 R 9465 0 R ] +>> endobj +9433 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 697.247 180.54 708.151] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_306699ac7d5f2c2c909c3a3baf303009) >> +>> endobj +9434 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.877 697.247 288.464 708.151] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >> +>> endobj +9435 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [330.197 697.247 410.784 708.151] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >> +>> endobj +9436 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 658.393 178.239 669.297] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_5740d23d50b9aa7c95e8b6b51242258d) >> +>> endobj +9437 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [205.576 658.393 286.163 669.297] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >> +>> endobj +9438 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.896 658.393 408.483 669.297] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >> +>> endobj +9455 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 619.539 194.497 630.443] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >> +>> endobj +9456 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.995 619.539 245.685 630.443] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_6d5d2010157ae8f712e4a3e551d355d7) >> +>> endobj +9457 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [273.022 619.539 353.609 630.443] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >> +>> endobj +9458 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [395.342 619.539 475.929 630.443] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >> +>> endobj +9459 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 580.684 194.497 591.588] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >> +>> endobj +9460 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.995 580.684 233.302 591.588] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_d99eb5124bfcd9c75379efdde73d1a1a) >> +>> endobj +9461 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [260.639 580.684 341.226 591.588] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >> +>> endobj +9462 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [382.959 580.684 463.546 591.588] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >> +>> endobj +9463 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.349 472.643 226.034 483.547] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_de82782e3363de460caad677b3583559) >> +>> endobj +9464 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.176 472.643 401.763 483.547] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >> +>> endobj +9465 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9469 0 obj << +/D [9467 0 R /XYZ 90 757.935 null] +>> endobj +9470 0 obj << +/D [9467 0 R /XYZ 90 716.221 null] +>> endobj +9471 0 obj << +/D [9467 0 R /XYZ 90 518.896 null] +>> endobj +9472 0 obj << +/D [9467 0 R /XYZ 90 435.323 null] +>> endobj +9473 0 obj << +/D [9467 0 R /XYZ 90 358.998 null] +>> endobj +9474 0 obj << +/D [9467 0 R /XYZ 90 336.686 null] +>> endobj +9475 0 obj << +/D [9467 0 R /XYZ 90 336.686 null] +>> endobj +9476 0 obj << +/D [9467 0 R /XYZ 90 287.445 null] +>> endobj +9477 0 obj << +/D [9467 0 R /XYZ 90 272.875 null] +>> endobj +9478 0 obj << +/D [9467 0 R /XYZ 90 225.671 null] +>> endobj +9479 0 obj << +/D [9467 0 R /XYZ 90 211.101 null] +>> endobj +9480 0 obj << +/D [9467 0 R /XYZ 90 163.897 null] +>> endobj +9481 0 obj << +/D [9467 0 R /XYZ 90 149.326 null] +>> endobj +9482 0 obj << +/D [9467 0 R /XYZ 90 102.123 null] +>> endobj +9466 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F11 418 0 R /F95 1788 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9511 0 obj << +/Length 1508 +/Filter /FlateDecode +>> +stream +xÚÕXے›F}×WP•*ª¬Ñ\6®<ÄɺâÄN²VžÖ. £2 +ÊקçÉN¯ã—E°Ý==}NŸ¹`çÞÁγÉwóÉì:`N„¢€Î|éDØAœgž:·.!ȧޔ`ŒÝ_=‚ݸÊãůÅn¹Þ¯dZŋŸ³»*®öWWǟ=ºeáM)ÇîÓu\×æç\Jý?Y$â2?à. ±÷fþ|òÃ|òvB 3ì H0î$ùäö vRøþÜÁˆE¡³ÓV¹ãSϵójòÛ_œeü0+‚(âvfu“^]•uc2‹so„Ä}¤0¡¬â¦¬TŠ³kBŽâ!áSU‡}òÄØôƦQ¶&¯1ÇçFÓ¾?ò! +ÑúÖ#Ñ +o Ãt¸nRuc’o!Y<“ÅâF®ã&S¨œp(‹ß¬Þ7"L‡X›ã0SŸD(©3…JGÜVý¶RãËôñàøȃ©@õé/Ûf³m eºúsî"åÚÛ¸ó•4–i™lsY4v’êÓüôf•Y +&6î4£í˽,Ô@2µžU™·®² ¶^—åî.+îͧ×Óµ¼Òômùçù,tÀñÈÎè5¥¼ou;å@½ÍfV«®Î¦^T± Ã|DBñý8Š õó£A©ïâZž”³+6Ðó±ûÎ#ܕêϟæû¦Íf€êWY‘¬·©i;ΐˆº–z2 tR¶Ç%îÅa…AÇåoG¦?(í“óÇb%«L…PJÝ»½VÉVuoõëFC LÅ-P§ =í>BÑúÑ ­2.ҏâå˧‹i×9Gy~d4ÒùàÌ("Që¼½[g‰vî ßÝod݋3(f×T_n‹‚¥ry~֚Ç%X@;ª&L2hü^¤³nÉÐm¡FøöŸ³kAføVÓ_±ÂG‘ïZ£ ªÚÂèÈFƖÞath¸nô=(þ”ECñ|†g§¼ù´íw½-%õh`²&‚õqw·ò[%þ¾4ϗ¥ýð¢L³å~ ’#ªs‰ Áz3¥ÀJžáÄ(’Š%ir_CªcžA¿Þĉ\tžCòQçX¯l­˜Õ͈NYA€ Xaçr#›mu¨d»Pu£÷¨ÑýÿLšVKu¾æ'hôº¬ÕÚcVîèhp†Hö +À.ÖéâÁÊGî„S/‰Ú¦? Øþ‘N<Ñ{ú¢/—” Ä×܊ˆÿxÆ]/«ÁAY3Œ Úêá‘úö0xl’É–c$pô_ +ëe@Z£v$óM³ÿÆ2¨Wí2XÓaKasª<&Ü!}/êqÜ [qBô<ÊÑI‡!üÌÌÊbfŠ + û˜ÅÀLöÔ>n@e£@%1P€ÓÌÕôÍU‹:ʨ +A¡0Š¸½þZÅﺛ¿ƒ4Źýuiÿk ê1²3‚BöÐdÞµ¡>€àU»¾b‡n P$Xh¯Øy„8ކtSöµ½2¯öŠÊ¼ü^ËêkuËkµâE\Ñòb®«C9ᨅU4DHù+ٞPÌÌþpÚ_?Mt=ù’P †»ª¯šfs5›ív;”Ôh[d› +eÍl³YÏNo/Ž¢‰.Hwÿ™—•~VÀÇ\_H÷ñ€úÿ ·M± +endstream +endobj +9510 0 obj << +/Type /Page +/Contents 9511 0 R +/Resources 9509 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9388 0 R +/Annots [ 9483 0 R 9484 0 R 9514 0 R 9485 0 R 9486 0 R 9487 0 R 9488 0 R 9489 0 R 9490 0 R 9491 0 R 9492 0 R 9493 0 R 9494 0 R 9495 0 R 9496 0 R 9497 0 R 9498 0 R 9499 0 R 9500 0 R 9501 0 R 9502 0 R 9503 0 R 9508 0 R ] +>> endobj +9483 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [159.289 553.329 329.928 564.233] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +9484 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [371.591 553.329 513.996 564.233] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +9514 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 541.374 136.934 552.278] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +9485 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.279 486.514 192.296 497.418] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +9486 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.794 486.514 258.726 497.418] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_5dfef947c46e234a1ffd4707312332ec) >> +>> endobj +9487 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 383.834 190.738 394.738] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +9488 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.236 383.834 261.85 394.738] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_43cd840b1ec99350c222b3f217739cea) >> +>> endobj +9489 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 346.972 190.738 357.876] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +9490 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.236 346.972 262.159 357.876] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_97ddb3b93ac699eebaca7e79f691b0ad) >> +>> endobj +9491 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [329.225 333.347 390.082 343.253] +/Subtype /Link +/A << /S /GoTo /D (main_Affine_Independence_and_Affine_Dimension) >> +>> endobj +9492 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.616 310.11 226.443 321.014] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +9493 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [237.183 310.11 282.343 321.014] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_7b8d597a3c23af1fce9d8d3e1d36e11d) >> +>> endobj +9494 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.616 273.248 226.443 284.152] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +9495 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [237.183 273.248 329.944 284.152] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_b7a35f8df974c9e932df6291754859fb) >> +>> endobj +9496 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.616 236.387 224.76 247.291] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +9497 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [235.499 236.387 278.986 247.291] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_2bf7987a6ee3547c1e125e83e432ee2a) >> +>> endobj +9498 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.616 199.525 224.76 210.429] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +9499 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [235.499 199.525 326.587 210.429] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_e1c5216e2ba5c80d77e128daea25b46e) >> +>> endobj +9500 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 162.663 209.547 173.567] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +9501 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.045 162.663 261.831 173.567] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_6fb94f0e966e97bfb9dcf43dddcf12ba) >> +>> endobj +9502 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 125.801 209.547 136.705] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +9503 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.045 125.801 309.432 136.705] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_c6ea1802e6a6cfb32e5af6d6d26eb424) >> +>> endobj +9508 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9512 0 obj << +/D [9510 0 R /XYZ 90 757.935 null] +>> endobj +9513 0 obj << +/D [9510 0 R /XYZ 90 733.028 null] +>> endobj +1545 0 obj << +/D [9510 0 R /XYZ 90 640.14 null] +>> endobj +302 0 obj << +/D [9510 0 R /XYZ 90 633.54 null] +>> endobj +9515 0 obj << +/D [9510 0 R /XYZ 90 503.585 null] +>> endobj +9516 0 obj << +/D [9510 0 R /XYZ 90 503.585 null] +>> endobj +9517 0 obj << +/D [9510 0 R /XYZ 90 424.725 null] +>> endobj +9518 0 obj << +/D [9510 0 R /XYZ 90 398.912 null] +>> endobj +9519 0 obj << +/D [9510 0 R /XYZ 90 364.073 null] +>> endobj +9520 0 obj << +/D [9510 0 R /XYZ 90 327.211 null] +>> endobj +9521 0 obj << +/D [9510 0 R /XYZ 90 290.349 null] +>> endobj +9522 0 obj << +/D [9510 0 R /XYZ 90 253.487 null] +>> endobj +9523 0 obj << +/D [9510 0 R /XYZ 90 216.626 null] +>> endobj +9524 0 obj << +/D [9510 0 R /XYZ 90 179.764 null] +>> endobj +9525 0 obj << +/D [9510 0 R /XYZ 90 142.902 null] +>> endobj +9509 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F72 471 0 R /F99 2117 0 R /F97 2175 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9565 0 obj << +/Length 1561 +/Filter /FlateDecode +>> +stream +xÚíZ[oÛ6~÷¯ÐS' MR¢.}\Ðè: K³½´… Û´­MO’ãz¿~‡7Å9¶7iƒ<¦l^¿óñãá¡°5±°uÙûõ¦×ï»V„"ŸúÖÍ؊°ø1J¬›‘õÙ&yÔ9'cûÊ!ØNª<‰¯Ší2[Nù¨Jâé JªåÛ·«?;$´ËÂ9§ ÛYRתxÍÇ\þNj!‡~]Ïg¶çë͇޻›Þ¿=–a‹HKX€—Yü÷ù+¶Fðû #7 +­…¬•[uá;³>õþèa=+¼:;†WfGH€|hPaŸ©)~¡”Éáïڋñ«‰6äú²g}>gÀe•ŽâK^ð*iÊ*þ´¬žïo*æ=M'¦i½ÖHWù‚†Q@ Ë¢n6úVßý÷µB˜“ï‰9QŠ|X%Š¼@Méš7óªÐ'êk^¤·zl×\ýR+ûe¹;­º$ª +ƒÂla´lŠ:Mº3m îsc|GÄ{B¸ó´Hóô?˜? ðáKþ +Öp|Qñ5ϒ&…e|蕮/Òfº èUxwôs!ªTIZ4]¼>ÆW€£¾j¦Ú7•ã¶žˆþoZf£´˜¨‡oœ­fFõ¿× ¦6FÇOj"Z±%ڞÉgT†ÇkøÉÙ ’¢;SØ;ÛÛ9„ؗÒduî·âH’T'N2<Ö©±ÆŸÛ¤ê„pàߒƒµÄ©Ñƒ´+±á†ì%ˆ‘èa© +`,8UêAª`-CÏ8”uF}D úpLªøÝ·YÅë:ݏJmƒ*/}fuðn´¶ Õ¤ïˆ¤?Ä¡åNFÁs3Ò¨Þ÷`ä€Ãi4jñÓ°‘¾X6 +_,ö01 +.ғ \ÚyòM^'o¶vItûD{Ù'*µìÈÙ=º¾}Qò±X0¦|;*”ÖóY\ÜÛ;¤§Hõ4:sd ƒ8ËóC`< Ì|…ò Ö<À""{„œ»ÔÝ¿€D\»º€¢ô‚Rw0"°Ó£«fÔjÌ¢lTÁd«µigaÂö¯äŽAîV2<¬¬d1Öʾ" pÀ¤®í¢ÐõO¾ ÏĨ¾Ð9úbšûå5š4 À½‚[X^ߨ(>19Þ6“´T§r œÎí%ÙÜì”mh—Ïæ =ð%ŠGog¯r †°u 9{êûúWzFÚOü´òÓÆiÉJAS®ÓÄ]ùæÑC°^‰ÛTg‰šײ—êÁÖ2ÒÝZ¸ùê¥JÍ;ðÍK󦥏¢À õ{¤0 ÆtÞãÆàu%Ï×U®1WúQ¿Iªþ¬yõ‹Ã˜­gó{R̓ÌiC~s…šš×L! ÆˆŠU@b€VŸ¸Q[5³,Sú­'1¿³—„àoÜ&ù§M3{Ûï/ 4¬Ñ¼HgJ›þl–õ×`ۘ5ýÚNÆæ†)/«öè?æòE‹-üÿ® “º +endstream +endobj +9564 0 obj << +/Type /Page +/Contents 9565 0 R +/Resources 9563 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9388 0 R +/Annots [ 9504 0 R 9505 0 R 9506 0 R 9507 0 R 9526 0 R 9527 0 R 9528 0 R 9529 0 R 9530 0 R 9531 0 R 9532 0 R 9533 0 R 9534 0 R 9535 0 R 9536 0 R 9537 0 R 9538 0 R 9539 0 R 9540 0 R 9541 0 R 9542 0 R 9543 0 R 9544 0 R 9545 0 R 9546 0 R 9547 0 R 9548 0 R 9549 0 R 9550 0 R 9551 0 R 9552 0 R 9553 0 R 9554 0 R 9555 0 R 9556 0 R 9557 0 R 9562 0 R ] +>> endobj +9504 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 719.912 224.481 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +9505 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [224.979 719.912 289.497 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_cb75fd68aa10bd15e590e8e8954c5002) >> +>> endobj +9506 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 683.05 224.481 693.954] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Grid__Generator__System) >> +>> endobj +9507 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [224.979 683.05 337.097 693.954] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_0d69bc8c9bd9843262551c7e3e33f5a2) >> +>> endobj +9526 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 646.189 205.692 657.093] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +9527 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.19 646.189 261.312 657.093] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_9f3c5474494eb306717bc3da7c109307) >> +>> endobj +9528 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.65 646.189 332.156 657.093] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +9529 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 611.319 205.682 622.223] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) >> +>> endobj +9530 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.18 611.319 261.302 622.223] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_0514c2e57ac8154666e9fe6bb56c0e18) >> +>> endobj +9531 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.64 611.319 330.462 622.223] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +9532 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 576.45 205.692 587.354] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Poly__Con__Relation) >> +>> endobj +9533 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.19 576.45 261.312 587.354] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_6187dbe974649c7bd4de8e66f70d3e46) >> +>> endobj +9534 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.65 576.45 338.781 587.354] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +9535 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 541.581 183.824 552.485] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_d909d5b60cab5d1a6816577c97b60fcf) >> +>> endobj +9536 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 505.093 192.272 515.623] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_8c33b9ea975535b5aa0882241cf78986) >> +>> endobj +9537 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 467.857 241.935 478.761] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_8ed700f662722cbebdc9328344ba2839) >> +>> endobj +9538 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 430.996 213.163 441.9] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_c251eb38d1b24b8b570d874ee11df424) >> +>> endobj +9539 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.501 430.996 288.431 441.9] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9540 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 396.5 189.901 407.03] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_0d9abbf681b7b0724963d97596286ae5) >> +>> endobj +9541 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 359.638 193.229 370.169] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_a0ac997a15935821583174de968e5bff) >> +>> endobj +9542 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 322.403 238.459 333.307] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_bbb7562de97ccf13bd97b57bb5e3ac94) >> +>> endobj +9543 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 285.915 187.689 296.445] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_e3be29eddce8f41019e7dcb731c8ba7b) >> +>> endobj +9544 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.505 285.915 226.693 296.445] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +9545 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 250.672 228.895 261.576] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_f740303d5461c838735ec53c5c1f8855) >> +>> endobj +9546 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.232 250.672 333.482 261.576] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9547 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 215.803 229.503 226.707] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_31d70a625e092dfdaed4f3232701f35d) >> +>> endobj +9548 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.84 215.803 334.089 226.707] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9549 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.98 180.933 187.264 191.837] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_c5c7acc50141a9104ef5b9b7598c1438) >> +>> endobj +9550 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.963 180.933 293.213 191.837] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9551 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [325.131 180.933 371.148 191.837] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +9552 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.711 180.933 455.727 191.837] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +9553 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.98 123.15 187.264 134.054] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_e680437fdc213b7174c581caa2e0c0d3) >> +>> endobj +9554 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.963 123.15 293.213 134.054] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9555 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [325.131 123.15 371.148 134.054] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +9556 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.711 123.15 455.727 134.054] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +9557 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.235 111.195 220.058 122.099] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +9562 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9566 0 obj << +/D [9564 0 R /XYZ 90 757.935 null] +>> endobj +9567 0 obj << +/D [9564 0 R /XYZ 90 733.028 null] +>> endobj +9568 0 obj << +/D [9564 0 R /XYZ 90 700.151 null] +>> endobj +9569 0 obj << +/D [9564 0 R /XYZ 90 558.682 null] +>> endobj +9570 0 obj << +/D [9564 0 R /XYZ 90 521.82 null] +>> endobj +9571 0 obj << +/D [9564 0 R /XYZ 90 484.958 null] +>> endobj +9572 0 obj << +/D [9564 0 R /XYZ 90 413.227 null] +>> endobj +9573 0 obj << +/D [9564 0 R /XYZ 90 376.365 null] +>> endobj +9574 0 obj << +/D [9564 0 R /XYZ 90 339.504 null] +>> endobj +9563 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9621 0 obj << +/Length 1735 +/Filter /FlateDecode +>> +stream +xÚíš_“›6Àßý)xºâ™X' $ 3}h¯IfÒdšæ®OIÆÃaÙfbƒ ø÷ÓwõŒ1öÙw8—vî !¤ÕJúiµ+­‰…­7½_oz—¯¹c(à”[7c+À–Ç b”X7#ë“Mri@0Æö‡>Áv˜ÍÃá‡>Åv:[OÅ( ‡ïâÛ,ÌÖ/_Ö³ûÄ·Ó¤?  ÛW³0Ïuò£ õM$‘¹ŽË™íø´ÿåæmïÕMïïÍ°E”&ÌCžÃ¬hÞûô[#Èkaä¾µR¥æ–Kxάëޟ=lzµï©zËp­·„xˆƒPD0×]þL)Sê”õ¬OÝ¿Mәɗúe£èGU ¨=“xÿ#šµÀ±?c†£4ɋÃ"Þʼn³á«o‹Läy #¸#‹Ú¢O˜ Eú.¶_ìèRß¾JŸO´i‹¤hSî"NÆÃäñ’¨–4zÑW5ʳ|ärßLcz”/Ô`-ç0.D£Qí‰»|íQpîªYsñGAœáô£(–Y’Ëê@4«•vâƒU®È–BÚI¸NY(ƒF°žŒd‚ȳµÎ‚OªvÔj»>bÌ-kÃø8-z¸ˆãÓ8¿_\·™¤…VCÌÅz£Ún°rƒ€•õ…$äØFnÓe2¦¿c ‹ÙéÜ|³teºŸ´t?8è¢û`xH%è…l’É&•N«iI짊¨ãxÈq ºFæB³TLM"N$®À™~½ gËòK^b7_, 1B­èmÜ2Jw ˆkçëEù¿Ås‘(/T¯%òç2ô½âd¢óߋù-ä©ôëeP#/ûš­ê}h@zŸŽâñºÑՖ3‡zš¿ƒ\vwJp<:ÌE8 Õ¤fa¼ë؞`n® +¹ˆCç—Ñ(ßr:¢taÆ1×À̤«PªÐXªÁövѲTåQJU Hó”¯óBÌ5šWw Áf~ç–JNÎ*.¦éÒÀf"±ŠÐJ½zò嬐3q¢)Ùa]™¢mä†`ë‡ûâÇgþ~<þv‚ã¨;‘8ØYAç®-ÝäPP}$hÇæô¥Žàl"7 ©šu£E5Í+¯d²5zj»íÂûaâ<ðÜÿªÅþ°<,éÎäUìueñÎ"yñéMG¾CÎàäM “·VÚd¹ˆ&çßekí7i ÀI©‚Á¨ 7pŸ1®ï±-§rˆ’cöIïXhƒ•2†Ý>#È#'h…&(¹5  ÉÀ·p°jò@‘ÂDÓ·ëÆѝ ;ä¡erêÁC˜¹û„fr;ô Ϗ+×ÃÉ*\™Á•ß‹+Çôމg÷ÑÊùyL›·WŸ’ãÕ6¸2ƒ+oâÊöáÊ ®L/oàjt,ÍoŸØÉDqf‰ðí3îǛå.ÌzçÄ>Ãk½e¶âž?Þ7u¸šùи;œ+ÜeŽcý©—ÈÌòd›& +›]P] DmlaÇ­; [•N‚LkMx»íÞaˆts å"oӓ-7U¶^÷Jý®ÔgÈõ©ÁÕ¯ß}<Ðw= ©™P1ëh&ŽÂv¯ÄïHë–?Ö,·B黈möîv&å–LŸ€NBÀqàîÿϹûx*ÜÑ.yÜg ‚ó‰ #y6Œgå›ÿr_wäïŸå㛟YY þ‘QjÞlîŒä`escVʛ^ój~gÕ/å"û©Nt^^F%ËÐ\·Iï¤(‘m®º0?„j³?p¶¯E‰²îÙW«LýÞS#¿Ñ—ør6³?-ŠÅËËËÕj…¢-“x‘¡¸¸\,f—»w\5)àðy•qjî×æiVÝBæ<”—mÛóãÿ/ÔF̏ +endstream +endobj +9620 0 obj << +/Type /Page +/Contents 9621 0 R +/Resources 9619 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9623 0 R +/Annots [ 9558 0 R 9559 0 R 9560 0 R 9561 0 R 9584 0 R 9585 0 R 9586 0 R 9587 0 R 9588 0 R 9589 0 R 9590 0 R 9591 0 R 9592 0 R 9593 0 R 9594 0 R 9595 0 R 9596 0 R 9597 0 R 9598 0 R 9599 0 R 9600 0 R 9601 0 R 9602 0 R 9603 0 R 9604 0 R 9605 0 R 9606 0 R 9607 0 R 9608 0 R 9609 0 R 9610 0 R 9611 0 R 9612 0 R 9613 0 R 9618 0 R ] +>> endobj +9558 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.717 708.953 186.348 719.857] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_d914801461cad05325559e95b9c4d9c6) >> +>> endobj +9559 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.523 708.953 293.772 719.857] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9560 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.35 708.953 373.367 719.857] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +9561 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [410.82 708.953 456.837 719.857] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +9584 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.717 651.17 186.348 662.074] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_6e73a7d462d6a9a3891fff6c4a923495) >> +>> endobj +9585 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.523 651.17 293.772 662.074] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9586 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.35 651.17 373.367 662.074] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +9587 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [410.82 651.17 456.837 662.074] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) >> +>> endobj +9588 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.581 639.215 218.404 650.119] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +9589 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 593.387 180.496 604.291] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_5df26655af3ae7844569d7086edf8332) >> +>> endobj +9590 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.834 593.387 255.764 604.291] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9591 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 558.517 213.153 569.421] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_c2182f38e9f8acede601c3dcfa71c3b3) >> +>> endobj +9592 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.49 558.517 288.42 569.421] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9593 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 523.648 161.677 534.552] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_13f15417d90174f6c2d3648e83d9fcf5) >> +>> endobj +9594 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 450.607 205.752 461.137] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_0a5c586d872f15baf7fd70941fc16c41) >> +>> endobj +9595 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.089 450.607 276.595 461.137] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +9596 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 415.737 267.938 426.268] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_1c64e09d6022054690f7d2bdf4e02138) >> +>> endobj +9597 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [295.275 415.737 338.781 426.268] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +9598 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 380.495 204.078 391.399] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_5d53d09dcc839672fedd4ab5d4142d57) >> +>> endobj +9599 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [231.415 380.495 273.238 391.399] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +9600 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 345.625 266.264 356.529] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_ec640128c6492defc09c4d6ad5d3ea19) >> +>> endobj +9601 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [293.601 345.625 335.424 356.529] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator) >> +>> endobj +9602 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 310.756 212.377 321.66] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_7df62db3bf13024d4ee9f8aaf0d27dc6) >> +>> endobj +9603 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [239.714 310.756 289.846 321.66] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +9604 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 275.887 274.563 286.791] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_eb30e6558c9efffc62d5765b3bfe5e4f) >> +>> endobj +9605 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [301.9 275.887 352.032 286.791] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +9606 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 230.059 209.627 240.963] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_f60c3f345fb8ec8c708e49e8fa33f737) >> +>> endobj +9607 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.964 230.059 314.791 240.963] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +9608 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 184.231 248.202 195.135] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_4f9a47ba1b29f1e07a32542584d50686) >> +>> endobj +9609 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.018 184.231 329.845 195.135] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +9610 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 149.361 271.813 160.265] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_304e74729ca34fc67648cbc995e1dfc7) >> +>> endobj +9611 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [299.15 149.361 376.977 160.265] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +9612 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 114.492 310.388 125.396] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_e6eef0ed4aa8b3690f01f774dd0722fc) >> +>> endobj +9613 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [314.204 114.492 392.031 125.396] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +9618 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9622 0 obj << +/D [9620 0 R /XYZ 90 757.935 null] +>> endobj +9619 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9671 0 obj << +/Length 1663 +/Filter /FlateDecode +>> +stream +xÚíš[“›6€ßý+xJñL­Õ È[›i2“¶3Ûì¦/IƃAëejƒ 8÷×÷ ^ðÚ1»ÙMö ,dé\¾st$ÀÖÜÂ֛ѯ—£³×‚Y>òÖå•åcËqJ¬ËÈú`‚:žŒ±}>&زe0=Sl§‹ÍµŒ²`úG<˂lóòe³yL<;MÆʱýjä¹¾}'¯dùL&¡„q™#¸Í<6þtùvôÛåèßÉ°EJI¸‹\Æ­p9úð [´¿µ0b¾gݔ½––C\ÖÅè¯6Zá¦v7´#ÄEþáR†°àZŏ”òrúêև u?—Úđy¦dÊæF¸we/¥PEÓ¹Ldi–z|ći’ûzS 2½Øä…\v õbžÃh¤õ¨ºž½v©åªÂQªRŠ„C¬ ¡Èƙ¿D‘rfv .ÔÓÕF7¤WúZ\Kýh®œ­Dn+±Ôoóï8Q9¼1!!qå¼rªy®»´dY¸ëV]ŠtgÊ\ëݒ§C R‰}Ê9|¿9æˆR¯šä#ƬCX ¼ä:î’aÌÝÄñM\\§ëBϾŒ“xÿ's-½QƒÙ٘¹¶Ì׋Bù +u:kë´Ÿê1äÅ ºCá™ÉPYo.ä!¬öø€ˆÂ@ڞpÓK"<ë$lȄ¿ŸDˆLZ$6§¬I„û’Ä;Äè!²—ˇ!’r7‰0{‹Ä¦'‘È9"Ü9ŒÅYš.ŽI“Ó ‰¦Flù$r¦RA_LÎlñõ¤â!Ç#ߪªv¨úü|0ŸÇfIaʇd³'GêsÂü1)äù„ ½ZCڛgkUŸRM¾ªGه^8{®SæF—U¹Jܪ¸ƒ†¦Zå“î„HTüuõv³è!îÓ‹·Qòa×âßH®oÇWFçÅb¿ŽÐ$ºËÌô +ƒ/AX,6ú†oe”I!#Ýs¶Q‽=Œ÷µ$f)ZU{-‡Ã^ëHz?‡K¡ í‡Zߟ)þá(¾·l}ï_¹µ: s÷— +ŠzeOïz»§BðÁ}Û +¡hAîZÝÜÐ܍+ ÷©h€&h¼ 4î+ õ,ú¢ÙÈàæmÈKvî#õÄ +÷ÛïÛ§“Ž3 ž¡‰œª³‘iY\dAœ§•{yžÂôû\Þu® u(wOF„]¼¢|‹wqê¸ûÖ®MûL[«ƒv”:ìܽp'µxÇñA<‚ˆ¿€˜è¤>íI{÷OHcþ]:<äqg›üÞÕ? >|Šˆ‘@òA2ÈÞå1¿gNêtÝN)û&}0p½Z…ù ø8C¯¦G®>`?Çå‘]ý!Αø4J’^t¨ƒ\îÞYv1ïI²CrEgÔÉæøüï1!IJ8˜-:W!¢=;‘Wérµ.”ÏÓ½ú¨áf'Q+7†A§·ÔR½º€)ÇøC,.â¸FE¥–Þ¬+FT_óU ¾H`ŒÚQ¼”Inä¾7FÄ«ùúd]p DœF¡Ï¸cyϓ²‚Vs”1Õ*èZžÛv™PÃ¯]¤£µ×ñ«DyÐ8 ]¶B!Ÿ^Èî²½H§39mL)£a‚ƒ;îþààŽ8 8Ô0=ÁáAṀڎ 5k+6”°*6*­Ê†\ãJ@Ý £F5ÕQ“w…Ë›Õ¨öÙ€2ÆvÝ6Û-ÿt¨ Èí«Ù¦6b¬g—jtا$¤ß¸®¥ò4¸ Ð“Y>×Lµ…N²ssZ›vòbsÒ9O)\¾ÇG ö4bµ¾¨¨9)MU¾¦ÔæÚó²Räc1øÇAuEG¯ûl:Fáh Ð᲏þØX8IMÃ|è=¨_žió—×™lÉèXž¢d°Wõ,õ®éìGö½F¶ õ†Hºê„uz½^,iÆ}$\*3M”™öÉ]„™3¸ O-Óî~-@$âúmtõ-4·z3­¿ôæ>ÔŽV¥Öἔ/[šÓ€Š>óÓ|ë­¼ÏeöӘó꫞?ƒdW*¸?«¡ _× ¶NQý1bi¹ Y¥l­Ù?Vu÷û¨ôÌV^Øt!†ëúìº(V/ÏÎnnnP˜£u¯2g«Õâ¬e¶­ q[r•fÆæiVgJh\–…ù-ûÿ¦ Â +endstream +endobj +9670 0 obj << +/Type /Page +/Contents 9671 0 R +/Resources 9669 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9623 0 R +/Annots [ 9614 0 R 9615 0 R 9616 0 R 9617 0 R 9634 0 R 9635 0 R 9636 0 R 9637 0 R 9638 0 R 9639 0 R 9640 0 R 9641 0 R 9642 0 R 9643 0 R 9644 0 R 9645 0 R 9646 0 R 9647 0 R 9648 0 R 9649 0 R 9650 0 R 9651 0 R 9652 0 R 9653 0 R 9654 0 R 9655 0 R 9656 0 R 9657 0 R 9658 0 R 9659 0 R 9660 0 R 9661 0 R 9662 0 R 9663 0 R 9664 0 R 9665 0 R 9668 0 R ] +>> endobj +9614 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 719.912 207.953 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_9a45b4b8f148a20359a2f3e2b1c2cb2d) >> +>> endobj +9615 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [235.291 719.912 311.434 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +9616 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 685.224 246.528 696.128] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_b1b315e7f04c051a36f48d344dd34052) >> +>> endobj +9617 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [250.344 685.224 326.488 696.128] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +9634 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 650.536 270.139 661.44] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_be643d7919aa34a2c1112702878f5536) >> +>> endobj +9635 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [297.477 650.536 373.62 661.44] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +9636 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 615.848 308.715 626.752] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_7a8abcefdfb125b7c9ef5f96d352c1df) >> +>> endobj +9637 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [312.53 615.848 388.674 626.752] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +9638 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 581.16 216.252 592.064] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_96e902093a55f87f0aebc2bb13a8d740) >> +>> endobj +9639 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.59 581.16 328.042 592.064] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +9640 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 535.513 278.438 546.417] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_7e4bbfa6f481ead40e3ca6231e0f69be) >> +>> endobj +9641 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [305.776 535.513 390.228 546.417] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +9642 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 489.866 254.827 500.77] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_3569a428ad758dc9ac8273e0f1f77772) >> +>> endobj +9643 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [258.643 489.866 343.096 500.77] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +9644 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 444.219 317.013 455.123] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_2aaf9117efebc52a8b45b787075a9647) >> +>> endobj +9645 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [320.829 444.219 405.282 455.123] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +9646 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 398.945 236.745 409.476] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_d6a8cc7029bad7ad7ad116c90ff59aec) >> +>> endobj +9647 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [264.082 398.945 307.588 409.476] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint) >> +>> endobj +9648 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 363.884 243.37 374.788] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_236a18fe8cc922d00ee92a6c6e42f923) >> +>> endobj +9649 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.708 363.884 320.839 374.788] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence) >> +>> endobj +9650 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 329.196 240.62 340.1] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_bfd98397c137d81dcc27111fba3ccd54) >> +>> endobj +9651 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.957 329.196 345.785 340.1] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +9652 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 294.508 247.246 305.411] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_a26e1a5815b7a0c3b610395c854594bf) >> +>> endobj +9653 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.583 294.508 359.035 305.411] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Congruence__System) >> +>> endobj +9654 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 260.193 193.577 270.723] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_3c1e5a2419a5f4a5cf89133606ed1680) >> +>> endobj +9655 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.393 260.193 232.581 270.723] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +9656 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.059 247.282 248.845 257.187] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +9657 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 214.546 193.577 225.076] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_9ca6b6eed07fd3b72119b8ea58328e5e) >> +>> endobj +9658 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [220.915 214.546 277.691 225.076] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +9659 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.892 201.635 252.677 211.54] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +9660 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 168.525 223.465 179.429] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_8132d1a9b329271fb4f7faeb59c89c39) >> +>> endobj +9661 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [250.802 168.525 298.732 179.429] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9662 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 133.837 285.651 144.741] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_1956a63a72283d208851d3fe2b11989b) >> +>> endobj +9663 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [312.988 133.837 360.918 144.741] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9664 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 99.149 215.176 110.053] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_4b428098e57a9101473a54cd71a0753f) >> +>> endobj +9665 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [242.513 99.149 290.443 110.053] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9668 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9672 0 obj << +/D [9670 0 R /XYZ 90 757.935 null] +>> endobj +9669 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9738 0 obj << +/Length 2569 +/Filter /FlateDecode +>> +stream +xÚí›KoãÈ€ïþ<ÍJÀªÝ’ÅNÍ˜Ìxs™]´E[D$J¡${œ_Ÿ*6I‰)R1ëAöbYT³ºººû«G“4x hð׫¿Ü^]¿×"pÄi®ƒÛ‡ÀÑÀhFgÁí,øž0JéèØÑQ˜.Ãé‡1§£ÕâeÍÒpús|—†éËÍÍáå1³£U2žpEG?,ÂÍÆÿû1zˆ²ß¢ä>¹Bj5VŽ»ýéêÇÛ«ÿ\1Ќ,ÓDb„ +î—WŸ£Á ®ÿP"œ ž³VË@rŸ‹àÓÕ?¯h>ª¶Ïl´ŠŒ–1C4H0Œɜò¯œ«Lâ¾àóDÁðïV«E~õKsE?f-ppkût¾[,¦0Þø1™†ÉlºŒ“xÿ7ª‹Ä~¥ŠÞ¯’Íö´Ü¹MÁž BÞ½€Vù¥ø¼~ox`a¸Zâp9'Z²`£Õ"íŸ3MóÙÙ®PÌõ{çî–X â¼q(¾Vm$ÑÔm¶óxãÛT{–Ö¾Q4.6A£ù¯«‡`P!צ§ASD»²ÍKƒEDÙÑ÷^í|–ãä1·d1¼t,Ì(Úì[Ò8Eû©ª¬Ì sš)ƒ g0.uzi>e/ž^F»õ:J§w«¬J¿@ßҚDpî‡ù)\æÖ 7ãƝ…Jf]œgÔ¢3øäÖ aÓL±Yü0æjdCª½AÛ¾‘ýÞiÉ ZœúÜ6è#,ÐÈc‰”êM2‚Œ'\çí1ü÷8ŸŽd•_x܅à$t¾¢Y9WÙç]T!N4;s €Ë3J ɕ7¿ü»Ñr¼î¾hºãŠM¼\/⇗énf +&ÜF¸<¾l¿Ö8ÝÂG´e=6­éÚ´’0¸PlÚcU–Q´¬ó]¥OÞk;•Ôà÷á6n0 ÜÜÆš@=çx;÷æ˵]G÷[¯kaÏJJ'Å\’ÒŒþöÐD8 K=ÂÅ&jÒÖ¥Êù‹7‡ºnwi;ǻ‚‰Œá £Ä)Wú„¤.Å°´SÌ360иH +@FËõöe¬Ô蕻qä) ðȈ‡ eÌFI4—á㑫†¸ [Eþ5fŒAJ‡w‹ãۅCmÀ ¤c¦f|Ô±¥±ÏŸã$ +Óé_Öi;ðx£äwž ëCÙ?¬¢r\÷q”l§Û4Œ·›››¬×é$›Kð³ÚÂD2˜Èܘi”ÃßOÓ,JVàžÂí*ýÓ±ÌU¡U,}áÂpSˆ¸Śá")ÑZ³'ñ¿>‘ *f¾œD¨¬ßeˆkúÿÍ3ÞÒÑpBé ‘ê_RÂØbÞló\Á‡]’o7¼¼ ×댉øåé`yÖ¡"WeÌ-:g\àÞx«ZÏcyTKUTD¸-¿Ìޔd@ fÀ.¤»—E­$¥J"ê;XåMœu°dH{¯(td–ÐîX@+àB#°°áÀ†Ö€%œëöÙ ,lTÊþ6Å m†8ä0N˜~©—©íÁ cçí$·ðÎFnYJ gƒ#çVf½y®çž[x¹ä~9É-èËnYmì!·*=7pKP×pk¨ÜÒÊÑc”Di¸Àó:­² .µÐK*Bµ\<“Eª™Í+;”upxݓÈ׆²Má%Ô^v²8Îba´æp®4ÀʔZ>•8„DÒIcüQ ' +nÄÒ|Jin<[É.9Ö¬Z‘13ltK”!*UŒDgxqՃ ©¤¢ÐÐQbA§úih_žQ²¤Õe>•>KYVÝe JH\5©äEÉßóÞP"]-¥}žç%¤ãÀ‚°{¯S1L¥G *¯æÔÇ +ùÌz_âùã3ää~5;éSdÃ̕™½GTƒ‚¾_çaª”ÊhÍÛA[0 Ï%¾ûìç ŒV]¾…•¾ÀhÝå °}î ZCØöh9+Ü}k~Axš³xÏ> ¹„ÇœðŠ[À>#]øÅ6{-ˆ²nhm¼s@u*ε@çÙæ”sÀÎ¨:”ÙÛ9C¨5C9Hë­èé°6ÍU0Ñā +'üBK ¼âYÚq‰{(D1C¤0¯õÙî9é,û¢ÓïëD?Gðڌ@AT)íP• <ƒ5>†§wR ú†Ù§h]Ì7'܁0²Ë ”Ò`û“ª5°¿SÏ̤óÍ0!»ÇPc½‚2>L¨l«õŠ¬ÓzÈ®\KÈ®X:˜yÄ^ò²ˆØA k»µ]KÄwÖ"vhÚ?b¯”¬a16ٟ¶tFë|Y+«ÝJm™¥ó&ûÁêÊ>£ÙI¦ÓàÝk5“oˆ¯ŒŒ™õ2 v%ΏŒñ¦@T’÷8JY@ÔLw¥@l w{e]* +¡G[pD-'OÂÉaNž·0b¿yÐ:>ªjàÍq+h4 ª+yF +¡ªŒÌl³ò?œ>.ƒ†ŒÄ;kçhBŸÁHG¤d=©º©‰¡¢/#aO;w#ÿ(%|ÕR‚r”=Ù+tÄÖÔðöꁘ´´‹dxS'É°Ñ»ÅÝ´–åŸ'þµ¥…ÝQ¿o¿ê,XëÎj¨#7ek!¬8®:‹öª³5ƒ<…zÔøŒŠTcX‘WEWÕYÐb»øÖµ¸Uœ¬4WskÍ º®Ô{wåöí4a²$Û´©nLÜ~€-%c!‰ÐÐ%ÏNä.ª碔ÎPÚ\¨N¥?µÄ’€(¦“ËwáˆáWÜÉÊû¾×zeEg1±¤xåa×4–ì}Û<¸Óó×S˜¢` 9DiÖÁ ¯©Ìœçx4X”É!Ï2ýN[Ž7\t”)j®§×¤èDÛF×Ã?ã„óÿÈõ©ZOSj¨Ç»h-I€N›+ÛBÊÖ a@ujçžØk5CðVñŸ'3)÷[ײ‚RpJdúx q!ù$˜“[ "Kuá¡¥—å VÑý\ÊË=`_‹ šÀœÊ6!„òše_ĐòpBZ=»Ôáä;8À¹—¹¢\”Րå»Þ¾È¶û¢ú‹Ø³}ß{,Þk„ÅÀlù·8•Ûp—/ž|ÈRìˆPyö?ÿš¿Çé¿ü²‰ÒïðQë>¡¨(Ý?ÑVƒeê_•È^wùÛڏìßAñß߯2¬ìõŪ˜ e"9ßn×7××ÏÏÏä~CvI¼NI¼½^¯×µý]5ïX¥ù‹2«´|¸..3NÙÿyrdå +endstream +endobj +9737 0 obj << +/Type /Page +/Contents 9738 0 R +/Resources 9736 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9623 0 R +/Annots [ 9666 0 R 9667 0 R 9685 0 R 9686 0 R 9687 0 R 9688 0 R 9689 0 R 9690 0 R 9691 0 R 9692 0 R 9693 0 R 9694 0 R 9695 0 R 9696 0 R 9697 0 R 9698 0 R 9699 0 R 9700 0 R 9701 0 R 9702 0 R 9703 0 R 9704 0 R 9705 0 R 9706 0 R 9707 0 R 9708 0 R 9709 0 R 9710 0 R 9711 0 R 9742 0 R 9712 0 R 9713 0 R 9714 0 R 9715 0 R 9716 0 R 9717 0 R 9718 0 R 9719 0 R 9720 0 R 9721 0 R 9722 0 R 9723 0 R 9724 0 R 9725 0 R 9726 0 R 9743 0 R 9727 0 R 9728 0 R 9729 0 R 9730 0 R 9731 0 R 9744 0 R 9732 0 R 9735 0 R ] +>> endobj +9666 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 709.266 277.362 720.17] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_97011210c7f0b2efa0f837ef2da6c5b3) >> +>> endobj +9667 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.699 709.266 352.629 720.17] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9685 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 675.022 229.552 685.926] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_7e68bea365fe939d08c91ec4edc61a2b) >> +>> endobj +9686 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.89 675.022 304.82 685.926] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9687 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 639.411 239.804 650.315] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_672b0568e7a27c37b3afde649f7c0171) >> +>> endobj +9688 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.141 639.411 315.071 650.315] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9689 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [219.695 627.095 275.476 637.001] +/Subtype /Link +/A << /S /GoTo /D (main_Convex_Polyhedral_Difference) >> +>> endobj +9690 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 605.167 217.109 616.071] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_eb14f5522982b3874f2cd19586813421) >> +>> endobj +9691 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [244.446 605.167 292.376 616.071] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9692 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 569.556 271.126 580.46] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_a809bff4b85d09cd801e5e5cde1b8c06) >> +>> endobj +9693 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [298.463 569.556 346.393 580.46] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9694 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [214.863 557.24 326.259 567.146] +/Subtype /Link +/A << /S /GoTo /D (main_Meet_Preserving_Simplification) >> +>> endobj +9695 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.984 524.353 201.742 535.257] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_c93800b9ec7aae75937598e1f2209b1f) >> +>> endobj +9696 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.442 524.353 243.629 535.257] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +9697 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.079 524.353 371.329 535.257] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9698 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [223.306 500.082 269.939 509.988] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >> +>> endobj +9699 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.288 467.195 212.768 478.099] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_f47944944e16e786df5c0671e7baa995) >> +>> endobj +9700 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.771 467.195 252.959 478.099] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +9701 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [297.896 467.195 375.145 478.099] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9702 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [220.401 442.924 277.928 452.829] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >> +>> endobj +9703 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.443 410.037 250.099 420.941] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_4f514edad990412bd66cc666347103ab) >> +>> endobj +9704 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.258 410.037 289.446 420.941] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +9705 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [307.772 410.037 379.512 420.941] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +9706 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [436.747 410.037 513.996 420.941] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9707 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [344.304 384.557 439.335 396.722] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +9708 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.207 352.879 266.586 363.783] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_08e91d11b3deb5b694356b5573d2547a) >> +>> endobj +9709 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.509 352.879 309.697 363.783] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +9710 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [336.494 352.879 408.234 363.783] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +9711 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.703 352.879 513.996 363.783] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9742 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 340.924 171.361 351.828] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9712 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [381.237 328.608 480.87 339.564] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +9713 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.091 295.721 250.748 306.625] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_50e1047c49fffb06bc5089a06a051a3d) >> +>> endobj +9714 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [280.068 295.721 357.317 306.625] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9715 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [384.405 295.721 456.145 306.625] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +9716 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 283.766 202.344 294.67] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9717 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [350.005 271.45 446.071 282.406] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +9718 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.017 238.563 265.396 249.467] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_cbc86683af6afc0818cc9e980a84fcb8) >> +>> endobj +9719 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [298.568 238.563 375.818 249.467] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9720 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [407.239 238.563 478.979 249.467] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) >> +>> endobj +9721 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.616 226.608 225.866 237.512] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9722 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.222 214.292 466.67 225.248] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +9723 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.933 181.405 239.984 192.309] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_e89cd985111a1a27c60a6fcc28ae9788) >> +>> endobj +9724 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [245.633 181.405 280.82 192.309] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +9725 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.855 181.405 405.104 192.309] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9726 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.703 181.405 513.996 192.309] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9743 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 169.45 171.361 180.354] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9727 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [347.257 155.925 432.092 169.083] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +9728 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.436 123.044 251.209 133.948] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_371deb67f73bf27ac9a7ff6f2216db9c) >> +>> endobj +9729 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.361 123.044 290.549 133.948] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +9730 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.719 123.044 409.969 133.948] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9731 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.703 123.044 513.996 133.948] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9744 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 111.089 171.361 121.993] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Linear__Expression) >> +>> endobj +9732 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.114 97.564 456.992 110.722] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +9735 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9739 0 obj << +/D [9737 0 R /XYZ 90 757.935 null] +>> endobj +9740 0 obj << +/D [9737 0 R /XYZ 90 691.81 null] +>> endobj +9741 0 obj << +/D [9737 0 R /XYZ 90 621.955 null] +>> endobj +9736 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R /F97 2175 0 R /F38 342 0 R /F98 2120 0 R /F34 2406 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9801 0 obj << +/Length 1769 +/Filter /FlateDecode +>> +stream +xÚíZÝs›F×_ÁS*ÍTçûä#3}hÒ¦™´™qm7M2 g›F€ +(ªþûîIÈƵ“ôÁÄÞÞíío·{¶®-lý2zq1:ye3ËCžMmëâÊò°åØ J¬‹Ðz?&q:™ŒñøtBð8ÈâÀ?Pq=ä:à9"†ðȋ×gb毢P&Ï. æï˙X&ª/i€M›+u0D‘¸íšÖtpä¹ +XüÐ-Ð=`Û_)y•NVN=’À<áõ°Ò9ÊÊÇ`0ð·Ý¡L`:žGqTÈÐ7q£CøŸ" Ѓ"J“¤šö %¶;€&›pé¡í¥ɂ()üóu^ȸ­ÔÌ$dž0|òl–ŽOá!îÙ=“Þ)<äcxWt2!º£“cäp>Dxrä`Ö +OÕi3<Õ³ +Oum„§Û¾ðTC¥´T°) Õ(Úö¼Ü±”(£Øà†ïˆXٌí‹X »vÃ2ï31ªÀ:¶ .Çàr¯lۃÇ҅,§®HáJȑ Q¥ ÃÇ||™.“ðx‚àXÔ1!ãb_'bG¨!ÔÁ9;ÄJþ+àºÍ€„îºæî0¡Â0ostÚâR.áê÷&G¨±íåhg`TJ÷ã‚÷r„%.ÜðA™ØÏ*Ú·8bÿÄhŽPÌò˜á ‘t¿v¼§—qC<¹¶ó`áJÔÅØݯ_zÆÝôè‘é¶ k.მ¸'Ý&Òm÷ŽÙ60¦|Èý‚'$ÔE{¸5;[»çAlÀ˜@é 5 뉨m(ªÓ;òœÚ\à÷vuêbI ¸o"¤Úõñ)ˆíñ)¼Ýø”Ñqm² £´L|”L•@+;2{½»á™1f¶©A<KèÿUÓ7^5A´}9%³ë\÷(šPízЄÛMêmMÌuÇ=´¤ ­TÑÄ6;˜ÚiÏò¢·«ì‡Ûôôuø.~ø+&ü ªí§S4هŠ&1DÑ40El×:ö…P@¦B nÇ·2¾庛WËd¦S7IÃßks“†ÑÕz“„뛟¢XBUÁUÎ^¿7!À=r¦¯8_³ö1Þö‘-C|Ѓ® ý\õê‡Õ`sÜî+ëÃ]yìNãZ‹_¬'’ñ½ŽmÃ0ï@$ň85àâDª“î:>MÞ«rεõåíf +L ð×7z2ò-ï¥sóvQúsQúGɖt«ÏÏ Ÿ—ý}ÀU0gÎ…E–þ~:` XsÚír{˜0•¦]’ t’A¶„ ó˜…Làï‰~áñ¶lzÎ`Ôm7¬·ëÄí'¹ùRUòÁ'õ¼E€‘ñAª¨PÞ)—‡È”í2§*ž>«òñÝÔï´}A—s™û粓9Ÿ©)ýö0Âû¬gZ•¢jùšÏ·è%_ÈYà¡m“ÜUÉfñV»˜hØj¬Ãƒ7ÑõÌz;ò>«°4–Þô2˜Û˜ç˜‚nJ‹Êû¦£Ô³.>šÂ•‹Ô½YÅômZÉ©”µÕbSϔùy»á*RèÑÃ`†Çrk´Û¹{"3ÔÁ!6 £ïîö·‘¶«QÔóÓÈêÓGyôX~è) Üf÷ð¢ú©.&²8˜´Ö'óh>õ,þÈeöÚÉÌ«R YVŸN)€•°Ì6é?¤%Ñr»S‚ç²BWiÙ'«ºûu¤§v3^âB‡ëÍڛ¢X> endobj +9733 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 708.953 224.57 719.857] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_98c785602c5af8f7e0c1be92bb5e8b71) >> +>> endobj +9734 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.908 708.953 299.838 719.857] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9755 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.542 696.325 347.869 706.23] +/Subtype /Link +/A << /S /GoTo /D (main_Time_Elapse_Operator) >> +>> endobj +9756 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 674.084 255.564 684.988] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_e10fbc38125e63858549f5ec8a25e046) >> +>> endobj +9757 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 637.222 255.574 648.126] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_7366f9b91109b63f078e963bccd9f5b4) >> +>> endobj +9758 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [282.912 637.222 330.842 648.126] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9759 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.542 624.594 373.782 634.499] +/Subtype /Link +/A << /S /GoTo /D (main_BHRZ03_widening) >> +>> endobj +9760 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.609 602.353 306.641 613.257] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_281b8db6a8e0014ab2c41dd15f8c0708) >> +>> endobj +9761 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [338.997 602.353 386.927 613.257] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9762 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [436.169 602.353 513.996 613.257] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +9763 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [312.079 577.77 390.169 587.675] +/Subtype /Link +/A << /S /GoTo /D (main_limited_extrapolation) >> +>> endobj +9764 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.268 566.811 208.508 576.716] +/Subtype /Link +/A << /S /GoTo /D (main_BHRZ03_widening) >> +>> endobj +9765 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.637 544.57 311.746 555.474] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_1a3647877302fc6e0e583b8b881a7a4f) >> +>> endobj +9766 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [342.158 544.57 390.088 555.474] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9767 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [436.169 544.57 513.996 555.474] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +9768 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [308.894 519.986 392.558 529.892] +/Subtype /Link +/A << /S /GoTo /D (main_bounded_extrapolation) >> +>> endobj +9769 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.268 509.028 208.508 518.933] +/Subtype /Link +/A << /S /GoTo /D (main_BHRZ03_widening) >> +>> endobj +9770 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 486.786 236.197 497.69] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_f074d4d4d406dd065812b32cc8714222) >> +>> endobj +9771 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [263.534 486.786 311.464 497.69] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9772 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.542 474.158 359.338 484.064] +/Subtype /Link +/A << /S /GoTo /D (main_H79_widening) >> +>> endobj +9773 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 451.917 214.06 462.821] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_6e9d9dd7740b414d407c16687c99a88e) >> +>> endobj +9774 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.398 451.917 289.328 462.821] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9775 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.871 415.055 284.525 425.959] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_cf531d280805472a54c22fed0f689932) >> +>> endobj +9776 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [311.405 415.055 359.335 425.959] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9777 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [399.78 415.055 477.607 425.959] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +9778 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [312.079 390.472 390.169 400.377] +/Subtype /Link +/A << /S /GoTo /D (main_limited_extrapolation) >> +>> endobj +9779 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.268 379.513 192.566 389.418] +/Subtype /Link +/A << /S /GoTo /D (main_H79_widening) >> +>> endobj +9780 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.197 357.272 291.929 368.176] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_9764ef2f159cfdcca3f151e899bd43ef) >> +>> endobj +9781 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.46 357.272 369.39 368.176] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9782 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [414.041 357.272 491.868 368.176] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +9783 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [308.894 332.689 392.558 342.594] +/Subtype /Link +/A << /S /GoTo /D (main_bounded_extrapolation) >> +>> endobj +9784 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.268 321.73 192.566 331.635] +/Subtype /Link +/A << /S /GoTo /D (main_H79_widening) >> +>> endobj +9785 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 260.943 289.866 271.847] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_527e7c81841bbcf1963c6e260dadfe01) >> +>> endobj +9786 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [293.681 260.943 359.324 271.847] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +9787 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 226.074 290.971 236.978] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_a6b6fed08414c86d33fc4a44c59e9e22) >> +>> endobj +9788 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.787 226.074 360.43 236.978] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +9789 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 191.204 224.003 202.108] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_87ebe6f7cd176227f61c6d0fe47a4f68) >> +>> endobj +9790 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.34 191.204 299.27 202.108] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9791 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [219.695 178.576 272.49 188.482] +/Subtype /Link +/A << /S /GoTo /D (main_Concatenating_Polyhedra) >> +>> endobj +9792 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 156.335 254.15 167.239] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_4c11206af59b0f6a5471aded55d20961) >> +>> endobj +9793 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.487 156.335 338.263 167.239] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +9794 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 121.466 284.585 132.37] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_dee3b5c0c3800ce2214e68a156cbcf77) >> +>> endobj +9795 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.401 121.466 354.044 132.37] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +9798 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9802 0 obj << +/D [9800 0 R /XYZ 90 757.935 null] +>> endobj +9803 0 obj << +/D [9800 0 R /XYZ 90 691.185 null] +>> endobj +9804 0 obj << +/D [9800 0 R /XYZ 90 469.018 null] +>> endobj +9799 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9846 0 obj << +/Length 1891 +/Filter /FlateDecode +>> +stream +xÚÍY[oã¶~÷¯ÐÓÖ6 )‰”, +ôìiŠíH7iû°[´D¯…êVQÞÔýõŠÔŎ¬Ø†ÓíK"Käpf¾¹|$±õÉÂÖw³ÿ=Ì®o™c(`6³VV€-Dmb=Äև9!ȵWc<¿[<çUÆû…çEº]‹¸âáÉ²âÕöæføzAüy‘/®lŠçoS.¥~|/V¢ù&òH€\ÇetîølñûÃ÷³ofÎh†-ÒhB=ä9Ԋ²Ù‡ß±Ãûï-ŒœÀ·›Q™åÚüO­ûÙÏ3l¬ÂCë(XGˆ‡ÌðlaFµ‰m›6Ë·óšI +ë$mK‘óLh¿€o)ø¶NxÞnò¨NÀyO×ðáÑïÖøº[£7ñŠØ6¶ ÔØø¹A&‰Ê¿Õ'ãè÷ßͬ/CYòH„q’‰\‚rÇ3fÜGLqßê ݛ/¯Êü†ádGLïhÏ÷Œ¹ :."ž£,@^hÅß PÊÄN½6Îh×ü.V{>‹¨.*ýܤyÁ[Çù'3¥0Ÿ¦=SjóôØ՟kæhÔȝ¨à01—À‚<Æ„",O!óŽƒO(þ*yï£xăòæ¿.!j—©›*)Ð.ž¿žV«Ó"T!?&+;6BZŸA„øÚco<d¤ÔÉY= »mºdzĎDUH; *ÊDŠ©Aõ~m~BPi-dYä;¡õT#âApÓN¥ÏàÁ§J†ˆÓeù‰aå‚\2®VEŸX&åíĖ ïE=&ìU]„KªÅEüú‰Ñz~œÝBï£ÐÛbyDX˜1I>8@N_‡FŽDcM)4ƒ“|<¦ \çùr‹¨Þ';Ì"ËEŒØ֕]Ù÷´¨Ÿ‰4å¹(6ÆìŸD¶¦ø¶í@>m°ƒ®ì —6ë2û@À>…þúÖª·Ó¥?bôFлoÐw†¨®ŽÇF Š¤ú­Aãjáÿ²®6MR‘yfg€ÿ„\"ƒåcCÝÊÓûÀ´—^mÏȨ®·ß?ªÖÞÀ¯c)"¬‡;#1¡ˆ½.‰Ö‰‰y yÀeÛAI½ÖAY¶Õ¥ób,GpÌNøvD2…î“éÊ!½÷lñîõœ°Å?Éhñcu€")½w»7ýk¹_¿®’<*²’׉*§@*‚ùÄ Æ¤è‚}ˆË(IÂx“•“kzr߆Ž ÌAöþV%uËF+®ã"¿CUÖñÍM$ª±²K1b¬GM‹üæþí»wúQó†ÒБ׼'ÏÀ@žÆSuŽ—HµÉ;“b8ŠÃx—,PÏCÛx¹€ª*xf6òËÀý\^ý«0ûGÀLΤ’ÄG|ƒó%`.+ 0/œ¼wjÑ¶ÛKæ^¼FL€lrzØHµyÙÆ@)õºd-JQqÅ,´‰þP{á¾3½y3F]ä8ôÌćÉ8`Ç%þ²(Òc’>-x<™ôÉHҟ?ÂZè®mÏWºýgc1Àš”‰|†‘¤ò]I4ù®å»ú¦ìâF‰R+o"`ÿ͛åö°ÏÔ÷¾PîE½ Î^éRU-È|?ÛæýE"š)FóåŠó!ý nv”¦0ó˜t» ´eRïE½©ò±í¼ç ý[<»Lb¶ñrEBÊÕ&}=¦>Ð4Öå늧rT2Àîv’ ØV‰ÔéD‚¯$9Ӆu4Tbe"+ªm(“¿ÅÓ•ƒÉV5OC37ÉÃåÖ™¼`)n‘ÜÝ17šTÀ†n¯¬¹è¶>x£•7£hS&*kô¬±zÙð@ö q%H"Õ +¦K慱ցµ¨òÿäçãœñœ«½ë'õgn(Uûì s&ÛaȧîQœ xŠc‡Ï–­¹\‡Q‹—®;ÞځëŽ}µLÌ¿Ò¢]$60­: +²ïyÞ¿ÃþQ$ z–bBĜQÝ«ö™»ŠÍ2mŸO?¨‚‚âh>L‰3 ®Ô‹ž{2>qGó×±§û'1%œç"/°§òO²Mö܁8OM}ÿ#Éc9Üæ¶ëná÷w‡ÝÁ̾YݙÅØKzVëÕ¶*–ÐqšiuÉy–Í‚ja%"¥Ò6JEØdcÅ!ÉC¹•µÈäKâ4²iň8ì²Ô/ÇI&wk^·O‰1.2žtȶ`×ë¢?ogu`iz)· *UÕ\ªÍÚiz Ñ& O„ð¸-j’'ê¦O5¬€ë]'}?µ"uG>íˆýëqkÁöüÈÛñö6œ¡À÷é»~ JMë~XïÞEg¦´GÀ槹í×?~‘¢úJq÷öìŸç›–Ü)_}V¢D՗JŒl}œØ°ý{Ñ:Z[ö‡Õ>ý0k"º×WwwDl]×åÍõõãã#Š$ÚäIY¡¤¾.ËôúiHQxtBVí51PŽŽ¢Àˬٱíâþÿ½[ D +endstream +endobj +9845 0 obj << +/Type /Page +/Contents 9846 0 R +/Resources 9844 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9623 0 R +/Annots [ 9796 0 R 9797 0 R 9817 0 R 9818 0 R 9819 0 R 9820 0 R 9821 0 R 9822 0 R 9823 0 R 9824 0 R 9825 0 R 9826 0 R 9827 0 R 9828 0 R 9829 0 R 9830 0 R 9831 0 R 9832 0 R 9833 0 R 9834 0 R 9835 0 R 9836 0 R 9837 0 R 9838 0 R 9839 0 R 9840 0 R 9843 0 R ] +>> endobj +9796 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 707.957 241.726 718.861] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_787615432c9f1d6aac5a6394aea8cfa9) >> +>> endobj +9797 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [349.617 695.481 407.658 705.386] +/Subtype /Link +/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >> +>> endobj +9817 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 673.391 249.318 684.295] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_6b737abc8f33b2a2362e3f9c9ab08d58) >> +>> endobj +9818 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.134 673.391 288.321 684.295] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +9819 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [305.875 673.391 371.519 684.295] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +9820 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 638.826 240.62 649.73] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_dd7b66394e6c54bc1ae03a4ed9a33c9e) >> +>> endobj +9821 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.958 638.826 324.734 649.73] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +9822 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [390.537 638.826 425.724 649.73] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +9823 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 566.777 180.773 577.681] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_0c58bbc8bf8db5f570da3db42a0ae2f7) >> +>> endobj +9824 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 530.522 167.466 541.426] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_ca90e7afe251a0d4174dcf538b34006b) >> +>> endobj +9825 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.281 530.522 219.211 541.426] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9826 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 495.957 193.029 506.861] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_547a8d96908afe5a7f9e4ba2e10d7ac8) >> +>> endobj +9827 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 459.702 193.029 470.606] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_efab726809c553c136e5d8fda50c276e) >> +>> endobj +9828 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 423.448 165.911 434.352] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_1d7db8ee4d8972c1818a36d6517ebbff) >> +>> endobj +9829 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 387.567 187.689 398.097] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_a38fbbd15d5dc2e98d5b24c92b06c290) >> +>> endobj +9830 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.557 373.872 476.544 383.777] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_efab726809c553c136e5d8fda50c276e) >> +>> endobj +9831 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 339.98 202.902 350.884] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +9832 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.4 339.98 300.037 350.884] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_6c7c72e56241da463eaeccdff79b6d49) >> +>> endobj +9833 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 303.725 202.902 314.629] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +9834 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.4 303.725 314.263 314.629] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_a78179b1d8478dce6cf572af8e0b9cb4) >> +>> endobj +9835 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [155.819 267.844 199.864 278.374] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_86d2bbceaa288f2f605ac88516d313cb) >> +>> endobj +9836 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 189.141 203.075 200.045] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +9837 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.573 189.141 296.324 200.045] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_73cb0d61cccb259e06b68d4f83deb6d7) >> +>> endobj +9838 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [312.377 174.672 355.085 184.577] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9839 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.636 150.59 287.856 161.494] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_3b49993a1cd4fc6891da88a6259b9f93) >> +>> endobj +9840 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.437 112.413 194.297 122.943] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_a39bdf85d6db02629fa73bbcaddab6d5) >> +>> endobj +9843 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9847 0 obj << +/D [9845 0 R /XYZ 90 757.935 null] +>> endobj +9848 0 obj << +/D [9845 0 R /XYZ 90 583.606 null] +>> endobj +9849 0 obj << +/D [9845 0 R /XYZ 90 512.906 null] +>> endobj +9850 0 obj << +/D [9845 0 R /XYZ 90 476.651 null] +>> endobj +9851 0 obj << +/D [9845 0 R /XYZ 90 440.397 null] +>> endobj +9852 0 obj << +/D [9845 0 R /XYZ 90 404.142 null] +>> endobj +9853 0 obj << +/D [9845 0 R /XYZ 90 356.929 null] +>> endobj +9854 0 obj << +/D [9845 0 R /XYZ 90 320.674 null] +>> endobj +9855 0 obj << +/D [9845 0 R /XYZ 90 207.963 null] +>> endobj +9856 0 obj << +/D [9845 0 R /XYZ 90 207.963 null] +>> endobj +9857 0 obj << +/D [9845 0 R /XYZ 90 169.532 null] +>> endobj +9858 0 obj << +/D [9845 0 R /XYZ 90 130.981 null] +>> endobj +9844 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F35 2018 0 R /F72 471 0 R /F65 376 0 R /F23 340 0 R /F99 2117 0 R /F98 2120 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9897 0 obj << +/Length 1542 +/Filter /FlateDecode +>> +stream +xÚÝYëoÛ6ÿî¿Bû’IÀ̐’¨GÐX³¦h×G–xÀŠ¶0‰v„êUIn¢ýõ;Š¤l¹²­.IÑõƒa=Ž§{þîxÄÚRÃڳɓÙäø̱4ùŽéh³…æcÍu¢&Ñf‘öN'Ù¦1%cýÜ XÊ4˜Ÿ&Öó¤¹fQÌ_ÆWeP6''› âéyfLMŠõÓ$¨*qyÁ¬}Dz_Ëv¨ny®ñaöbòt6ù4! ÖH+ u‘kQ-L'ï>`-‚ç/4Œ,ßÓnZªT³M þíròçK­ð¦vohG°ƒlËÓ\ÓBØ¡BÅ÷¦IÛÏ«uÚ»)u«:¨ãPˆý¹Õ,Ž$—¯\JA/Úœê=Æf$ñ?l›ŸxK1üHïú?>sMÍA› jšÈ±MmJläR_ÈyfØTiÍúš‰‹[ r^¡gŠ©ú˜ÂåÆšâ*ϓýfƒl^²Ð To„ÍÃ<[–+îðyÕT5K«û4ý‚Õ«2k9CHÓ b #A„Ý"H*&¨ú,}Dl¢¨â,ŠCÐ9[*CµºŠ¥ñ£< bá r–KŠÒ°\…\uù²Ó‡‹¶rpê{È¢Ž6µMä{žè\dTÍšE‚ï+–^A2µ×g«,¬ã<ë›v;üEôs×ÛÙáòA·ò 8—™ Y½Ã}3Ã,)ò$_6ÒZüî—ýáÅ)Ë*}^7Å`æd«tÞQUØýÎxà-YÆÊ fó§ ƒ…õۏàå»$ä“UœD2ñW(ôƒTUèw|ވ#UÁ˜ã…rf!Ö¬¬cö©|¿BWõ~«ïgrÔówš§EÒ:ï6®›¹(ÌÂÝãß^¿Ÿ¾yuþòéßÏgoï€ oÚčaËF%nÑL[åËUX琁„èߗkv¦œBžCŽ;mÕ «ç—-8ú/¬î`ؑy²wiP q/6´*yp±«ÿ‰CîÅ Ø\lTÝçY±„½h•¦Íûs];ôûá|:6ɞ‰j”—û¼»¬¾A1dKÞìs±[Ÿ´à„?B®tÆ›jß̳í"ù.&|‘‡lÇW 6HU$П‰NÚó5é"Ûöá#AÑãä ê¹'h³ •}Õó¬f%ìÖ@³d€7õ4Örå¯;<¼­¬o!êSp A>•›Æ=ÁéúCÁém€†ç `ò$¿Ý2'!›Í<è‚M·g§ÃÊŒ¨e©EÛÖÚõ- ,@üžÝöò=ºÊo÷å`T·Vèö¦œbXÈ!fß/_ß Bº׺·†4ÿ~@òh?†ñÝ€ÇØøßýfj³¡/³v×ɽ¯¶'ŸZDˆ,bÓ÷7Xû€¶ +MØsYC9¸Ãœv?0"°¸h’&È¢6„"Ç7M3ÀÄEŽÙÂ@†Ò•Ô´ÛåNãŒG~PÇW"ú7ä¸ññ\dÞõæŒÃm40-Ø +H ¡h#Ëö•½(~×ìË9«”{Jyэ@ҍÉÄB} } +끄<êšAE''94‰,72º…Ž}ìÄ"¸óÓ£G{§&P><?ˆRodLq=6eøœÈ?õ6±«š÷"»Òä¡„‡‡‚Ê?= ØÜޛšo0‰¬Ëۅ2ëA¤lÚ8Ü;f‰ìuáՎ¹È3;ºÝ@æ#£Q,ý§B°Tò)?¨ »«Ÿ<¿. ¥Èô½qxxPï8®^Ý´GÅ6þN‘ÁÕü „Ê3óAÅík‰\×üo¼EWÝëÆGï@ïsÉ“òŒa ¼L„×­w‹ƒÕ°ãk[·Œû=¾}îãâ=öQÇ<tùPLÄ!oô¡è÷ûˆÎÀFä­4µ¸ù«båÏ¥ºl_Ù +zä¬>sV¬ä¥Z<„ÔÆÈEºmF.™še Í>jêêIkÕµ¼¢`wIy]×ÅÉññÍÍ ++´Êâ¢Dq}\Éñ—ujƒ ÷bÇd‘Ëú›æª<Ç> endobj +9841 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.437 720.286 188.759 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_e58a861a42c5216a2267e3f94ecaec8c) >> +>> endobj +9842 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.636 681.426 294.481 692.33] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_f496ec55802726ee3b39e52458ab0647) >> +>> endobj +9863 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 601.198 161.84 612.102] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_b6ab1820f2fdf444d1431ff3af424451) >> +>> endobj +9864 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [231.559 601.198 297.202 612.102] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +9865 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.765 601.198 456.154 612.102] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g616fcdc7600a3a11a8a9152e75730899) >> +>> endobj +9866 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 562.713 161.84 573.617] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_b4959b3da46291de301d9150f5afc3aa) >> +>> endobj +9867 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [189.178 562.713 237.107 573.617] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9868 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.672 562.713 330.138 573.617] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +9869 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 524.227 161.84 535.131] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_858e0030826ee6c29545a934166874ef) >> +>> endobj +9870 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.08 524.227 332.907 535.131] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +9871 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 485.741 161.84 496.645] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_1cecffe684d1faa9b0f6b8d4f227e9ae) >> +>> endobj +9872 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [231.559 485.741 309.386 496.645] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Constraint__System) >> +>> endobj +9873 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [330.915 485.741 390.859 496.645] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >> +>> endobj +9874 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 447.255 161.84 458.159] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_d6d1e866b7ba9bf4233f3a5254cda0f9) >> +>> endobj +9875 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.08 447.255 331.224 458.159] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +9876 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 408.77 161.84 419.673] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_fc2a04d2049183cddbcf70316fdf40e7) >> +>> endobj +9877 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [231.559 408.77 307.702 419.673] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Generator__System) >> +>> endobj +9878 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [329.789 408.77 389.734 419.673] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Recycle__Input) >> +>> endobj +9879 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 358.329 161.84 369.233] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_dad834921ba7c139b0cb10c507b4070a) >> +>> endobj +9880 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.33 358.329 274.93 369.233] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Box) >> +>> endobj +9881 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [283.471 358.329 316.198 369.233] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Interval) >> +>> endobj +9882 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.567 358.329 431.033 369.233] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) >> +>> endobj +9883 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 307.888 161.84 318.792] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9884 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.58 307.888 213.387 318.792] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_f15f956dac6d4b19ecd8fee0f9718f29) >> +>> endobj +9885 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.724 307.888 288.654 318.792] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9886 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.349 200.934 226.034 211.838] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_d84befb6d0ded481871cbef1b7306824) >> +>> endobj +9887 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.176 200.934 369.106 211.838] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9888 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 162.448 178.239 173.352] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_8af124edba7c75bc76ec394405aa893e) >> +>> endobj +9889 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [205.576 162.448 253.506 173.352] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9890 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [295.239 162.448 343.169 173.352] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9891 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.071 123.962 160.437 134.866] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_67a7d08f3cda46f7a743d46f3a6f33b5) >> +>> endobj +9892 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [168.409 123.962 327.421 134.866] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9893 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [354.984 123.962 513.996 134.866] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9894 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9898 0 obj << +/D [9896 0 R /XYZ 90 757.935 null] +>> endobj +9899 0 obj << +/D [9896 0 R /XYZ 90 733.028 null] +>> endobj +9900 0 obj << +/D [9896 0 R /XYZ 90 700.336 null] +>> endobj +9901 0 obj << +/D [9896 0 R /XYZ 90 619.988 null] +>> endobj +9902 0 obj << +/D [9896 0 R /XYZ 90 326.797 null] +>> endobj +9903 0 obj << +/D [9896 0 R /XYZ 90 246.449 null] +>> endobj +9895 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F35 2018 0 R /F11 418 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9922 0 obj << +/Length 2458 +/Filter /FlateDecode +>> +stream +xÚÕY[—Û¶~ß_Á·R­… ‚—uÛsR'ñIÚú¸ö¶/NŽDb%Öɐ”eå×gP$—«lӗöEÁ`.æBqoëqïõÍ_îon¿…—±,cïþÁ˸—Ä“aàÝÞ?X®ÖçÜ» +¸¯Úƒúøvr¿ÞŸwºhÕÇ¿•›Vµç»»ñô*HýºZ­CÉýW{Õu4|§´YÓU®¯ˆbé‹4]ýxÿýÍ7÷7?Ý ÷#‰LX"¤—n>üȽæ¿÷8Yê ÕÁ‹BϽ÷þæ7üªV¡`<–#­X`õúZ÷ªÜë‚$üZwy[6} ҃P·ßJ>âĽu1eÄè~§i×Fuv”_”}¨[;¼"î^Ò×øó…ægC†G!ó aqó¯¬ùêÍ¿uÞÛñ=ûÝä8´™­ÝZû½{}ã}0$oí)¤Ð`&»Úê¦Õ®z+´zžÈηe5ˆvä½Ó½kxÚXR#K +ð@("Å(ûŽHîÅ,KDŠ$ 2é ÖoK‘ 1°Q‘1×BF,•¡µ©]û +„J²©ðž+;ØhzvÎË8 ,`BuôÔ%hÚÚ9z YUönç¹ëõÆÆ[Ⱦ®º¾U%þS[]éVQ;·CòNë6ˤUñ=¿|½€ !¸‡Öë +i©±9 _-øçÔ G(M@,TUmÙÛ§å­ö=N&„œ;Zkê®+7{Mo}m¥€kéoúUà+.9£ã¸HΖ,p¿Sæºdpú Ä¡_¢c@Ó§ª^…ä1³¼#ÓKkú˜g™9&„$ÝôFV$hkË ß¡òËücw•g®5یô@QhŒE/Ë,ð;u°£ ¨áÝøŸËܒKÛÎ:ãWçøÑ:z!ÍpPWV5xiuq¬ +UõôzЇ ðº¿d¡ïˆ¬Ö†‰ã}d=/ë¢úK Ï6µ6¦TuÿD´9”Uyl¹x{˜FRˆUj±W£ ¡ÿ ÇÃQ0¡ú¾-7˜¿Ž½îhÎ8ÈØqD85rheDý{»­¯¦Þ–¹ +É¡¹µ­Îë¶(«­5ÍNۀbxاe¥®vX~õñJhGÚ%k«+¡!L¼ys•¯ˆlB¢K;h°@6€ +úf®(ºêJc/XA÷ÌÚ +aDËÿÇ)"L Õf™K–$gö”%Qâ…4“±ˆÞ,ä ŠÐ—ƒ”ƒ„P¦ì뎼ó“äËFO4ÄÝÔNë0•, bƅMè?„¡œÛSB¢öûY=ðbs}hz{)êJwî2äûc¡‹³Û¢«‚‚›+iN>'É}Èn¹=‡ ë®]UŒS·^|9U±•1ÁEÃCÝõ6¡5ì(çà;ÝÊö™ ªIjœgjÎ êK&J$›K¦š%M¦tnf5v§\b¼¹1)‹âlzkÐãŒ:Dk̐ÀDD™àR§{˜<F€xQm© Çu†ÕçŒnŽüœJt=îéw­ËHøŠñYPúÍ5Õ£f©|p;4 Æ&Â=”ƒÇÎ<†s»˜OLˆqêoj Ž *à‚`þz…éàЀ÷(g ƒë9‰«Tà%yFm;×&0il +υÚdA›«•Ê Âkçígà˜,ÊãэÁ7#7hÂÇÄ!\b6%óÂÚÆ2ÈwªÚêâ%¼QˆQ ©ÐÔZJå¤à„ö˜Sµ€“¦ÇÀVùn*ÍEX›úž€v¡Û¡G6Å땦ÔW˜HwÈ&h˜&À−e¹·ôŠ(¡X±eÌMî®ÙlâŒ(°!çKäIÉÉ´ìÎsݐڠ+Ï®´=d½„q—âŠ2~©ß§­Úó.É~ÿ[ÄPÜÞ[®—"x\Ҝve¾›…ý¥<íÕrWf+SNý N܆L1ÍW³v9äÐSEô‹g{’p’FaäÒ¨Fl|iöe^ö )W,å#†:iß9{[íšQE ÚAh§|. §ÁÐY_JÇæØB?¡_^Sl,™u ™²'5›#ͺ¢ÚÂ5É úò¼Š¥ï²0´4Û +|Õϓ)¹½™ih›Õ(f)š|\.¼©{Ó¹û  9x¨-͐àª=@œ¨ìâP>…Îo,×O4m“´—'~Öm½  ¡Ä—aâSWŽŒÏČºp §× üc­áüÅ拙¡ô«QXjÝ÷•fRšÎ+F.Yd³ +Éä›Bão +| ƒ¢rüIÁɸ]IêJ‡’EÝØX—dPv&xÈë¾J}gùåà¥ü3‰NšýPû¹†¨`w<èb~)&) +§] ҄E©töú²` Œu©#@'-pð&C~þU&®Pá_±R8QÞ»Ò Áζõ0z»€°ßSýÔÝ-Ú܈œ ð`$¥‰¦OL{ãþeMµZǺ¿ @|¨ÚÐMċ´g¤ Wó¦ ºx +ð{Bœ¾!ϒ"ÁµP@»˜¸<úցw2ˆF0¥4NåuaÅ%Yw´¢è1)T̆*¯¦®Š‡ù*ãv@c÷ӑê˜*«…~+L#Ɠèê t_õâIÛ6¿˜aGTX îoG1ÁJ­:’Í*å¾±àؔBF±Šjè‹%CA&QÊ}ßytàæÆÑ7¯†öáã{{:‚"“w¬¬:ÝbÍ¿åŸÿDÏÇh“Ooú£Ý$ž‚èdÓù·œt~æI“/†´Ùáþ¼v̼¶f„ZCÄ,GÙ#,G©Ã2,N°¹ô ô% G\‰AÌ« =¨Ä]Þ²èUÛgRÕh6Úe­È6$ÑäóÝBþ3öÙºÛqH§D~ù`Çæ.¸?úÈO·î·¢óµ“pÎm·äýíØûM ˆ6AZ‡€ÁíÞLd–õïÍBĒ4ôFÓ °P3Dñ²à9›1”^")šH0Œðö\1åòIrIL1óúæ«b^µ¦øÿ°¦ø_³æSAfÛ=λó¿ãIŸûO¢ùQŽÿŠ®–Œfÿû½Åˋÿ‰®&µÙWûÏ(½ü,ü»•”¾½åWÕÑ}¹F5\;ôxœœ…¨Ã,Æý÷ô‡Ï ê„BòÜè¯.òba'øжìú¾¹»½=N â;ÖMËÊþ¶iö·ëôÂÀdhºµ+ÆÊ +¿¹_þ‰Ûÿ<šß^ +endstream +endobj +9921 0 obj << +/Type /Page +/Contents 9922 0 R +/Resources 9920 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9926 0 R +/Annots [ 9914 0 R 9915 0 R 9916 0 R 9917 0 R 9918 0 R 9925 0 R 9919 0 R ] +>> endobj +9914 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.82 677.939 225.75 688.951] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron) >> +>> endobj +9915 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [122.445 648.359 277.732 659.263] +/Subtype /Link +/A << /S /GoTo /D (main_representation) >> +>> endobj +9916 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [443.233 594.869 502.79 605.773] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +9917 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [100.734 582.914 174.677 593.927] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1NNC__Polyhedron) >> +>> endobj +9918 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [402.44 513.666 513.996 524.57] +/Subtype /Link +/A << /S /GoTo /D (main_representation) >> +>> endobj +9925 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 501.711 156.301 512.615] +/Subtype /Link +/A << /S /GoTo /D (main_representation) >> +>> endobj +9919 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9923 0 obj << +/D [9921 0 R /XYZ 90 757.935 null] +>> endobj +9924 0 obj << +/D [9921 0 R /XYZ 90 733.028 null] +>> endobj +9920 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F31 472 0 R /F10 473 0 R /F11 418 0 R /F23 340 0 R /F72 471 0 R /F7 505 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9930 0 obj << +/Length 2010 +/Filter /FlateDecode +>> +stream +xÚÍY[ã¶~Ÿ_¡·ÊíšÃ«.“¦@»Ø v‹ivŠ¢H‚lÓcueIåzÜ_ßÛ,ÊrÖɾäI"yxx®ß9”pôá蛻¿<ÝÝ¿OX”£<¡Iô´r¥ A‚’èi}‚8], Æ8~\ݾx~\P7Õi'7]ñü·rÕÝéáa<½ YÜԋ%8~[JÙ×ïäVš5Y¯%ðe<1ËòŏOßÞ½{ºû鎀d8"F‘¢”‰h½¿ûþGm`þÛ#–gÑÑPí#N<«èãÝ?î°Ó +_Õ.ËÆ×M ÊeÝ«‡Àg$¤ÍSLL´"cí¬eÔlß,ž?ºˆÝµúÊȂ£eŽ¸÷ýZ¡²V²ëÀ¿ZÊ?}mŸæH°I\ß´´“}üñ* ~+‹?عQ¦·Ï£ØѤíNó^«aÇěKg; +ÉN’Q0Ó<›3ÍSÌzqÌz¥÷»T±woã@Ö$…²óŪÑabcE‡Î»Þ±è‹®wg‚]³Ÿžá£&MÔÀ܋¬eWôM§¼e‚8kåºÜž,Sˆ1ËJ¿5ž5v`E‚³×R…19ÐJÁ¸¨7Ž²v]qúÅaë¤üÆëD틚söË8zÚB]¿`C™DsÍPÒÛïÍGiF£Ñôkhv7e('·l>é°:#H’<ò[Åó'‰91§çf ÂizÝ:à‘™ ™„©y-“^Ι4v븺,i†h +0G9b$›)/ìW•š°‹ŒL¨ÏHX 2Vz¿+Y³%((šDý,,…)(mUԞõÉΛóGª`¢rdgàžKÁ¾™¤Ò¡ՌN]I°ÙbFÀL8ëˋ™×ÕM™»$&ﵘ¡×àºÝ!0èóÙjšút ëoGn~‰Ü|@n>AnæQ•ÈÍ'ÈÍróäcäær³¹ùù ¹oûÓü!ÖÑQã£EµôŠ3}MŽhƾ4€< aÀu #—…£hÛ®i»²èÝĨ™±öfác¼ûÆíªÄ¤€¸…ª¬¥v:º)9CYzk ¾±£wŸþý™ ”™íæ¿ ¼üºúÂZ9zN^‡÷óÿ3z:Óã×`ã\âñ0ñþޘ ȏÂ8:‡¶·êwÍáeçECv*ÈïL¾e"®;1îK÷£Û»?¨Þ1Þlì‹íD _v@¿’ëâ ÜBÒtÇRÉëÇ D¥:Tš9´÷¦bø¼ø¡¬?ÙÎIÌúTþn!D¬,µ:ì-•m®ÕÆWҮ뛏{4`cØGWxü´Èl_ÆtjPݜé{eéX©Ãª¯;Ùu6ëŒÐd¤#2%´Ô3šî˺ܗÿ+úÒX>…RÙ5`bcã4K­| +Ȥìj':”až2ãj»nS?`L;ã ¡å˜ñ›Kw`ážÞé5©;½ðËW꫎ÜÁ±l\•:€^ײuªj\SÐ:ëÃúu¦­nN s©€4Lg:þ¹Î†¸Æ&(X°qZ°Ì-pã‘ç‚lÚ?ø–á¢IßêµÑÔ¤/¤üHŠ\ßþ©¯Leyޔ{Y+ؤž’Ÿå~¾ºL’æˆÑÔï¿­_`‰¾úŠÛ`újS:Û/8„ýÚõ Ÿk6®ë}èýK'¨´·ÿ¡§°CãÆèL‹§—ƒ/0.ë`‰ÉrÐò¹Vü)P4Ĥú¢Ûòï[„à:îܑGw¢Oób¾­Õ‡CÖU©ÓS¯€ù—¶QAQžMî™Ö3:ý²:$ü\õ0oƒ;#¾Ð ô“‹Þ\Ó6“=V¶ÞoQ²·jÓq®Òœ Œ Šo-I4¿yFü:a¡ †DÑ_žX Cé\?‘w_àÿçm/»@9W…­gÄ4BîË\©˜¹’Ž,}þZ´ñh7ä¿­\”\\)”0Ð@`”éS qžxD%øÒn)â)…K'Ü9ÏÀëŒBÆ,áŠ"•¿Z,I’ƧK~9J8ÑùwÙÁꏃ; ñr¸9ã­ LàˆjÎQà'üùo€—LH`ÊR a‚vâr°JÃé‰YಞAÖPÄs÷yù4«> zE2QäÒøc'2#Œ€$ œùðówû#–AëK$Ò¹(n-â7_¡ú\÷sEÀ…ž±áÆ"˜a¤'øNû›©NÙððA—é? ¨ç9àݍ¿$Ì/0à9̀…€’êh‚G](õÏ7ôWìÐýb±ƒB;9ôÜ0þPÔP¦ÎWO_s‡†#‚µMޒA_þQJ§¤ÕìSäßþjw–—d)bçÙõ}ûp<ÑZ!(òm‡Êþ¾m«ûËðqÑǁÉÖtÆ Ø¾é¤¿kÃäÞôãhjÿÿÄMÕ­ +endstream +endobj +9929 0 obj << +/Type /Page +/Contents 9930 0 R +/Resources 9928 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9926 0 R +/Annots [ 9927 0 R ] +>> endobj +9927 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9931 0 obj << +/D [9929 0 R /XYZ 90 757.935 null] +>> endobj +9928 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F31 472 0 R /F7 505 0 R /F65 376 0 R /F23 340 0 R /F8 504 0 R /F1 542 0 R /F11 418 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9935 0 obj << +/Length 1937 +/Filter /FlateDecode +>> +stream +xÚåYëoÛ6ÿž¿Bßf¯1CR"EµÛ€­h‡u-µÙ€¡- &–ca²äJJì¯ßI=­8NC†}±ù8ïŽ÷ø‘¢Þ¥G½Ÿ~:;:y.}/"‘äÒ;[zõBɈàÌ;[xo'Œ‘€OgŒR:92:ÑÅZÏO§œNòôf/ +=™œº¸yü¸;&ï(åEYaGLª-j™Û™4ÉâÒ6ó¥ý¿È±¥Ô…[_ՌJ½v-]Zš$³ýg×z½IÝd`ç–yZÈŽ¨<ˆˆ +A#£^,æåF_ÄóE²Ž³2ɳr®³Å|†K½™£žÁ1EÂé¯Ïã…åÜ3R¥j΄E\VpæhŒ؀Ӫ\ ô·-TÿQýã}—Wi•d—¶»qPŸ~RèK M㪞/ãÊJ˺Â*EüPzŠÐÐ +üŽ2jéT‡NŘ7ë’ Ê¿.CE”µòOvàçq(pa–&ô$‰B_Õ<„çɤs¡]Á%aJ"74r;VÜïÉ#BÕœ;¹}Ös]"Xã¯w… + ‹zBñ‘³ydäÍ:TÄD\2ƒ,0 (#J‚|\‚}»¤qb<59Xߏ7EB +û1²n¸r™§i>…Ø6.cƒÊ8ÃÊN }æª8b3³¼Ê.*ˆ‹‘XbQD(õ›`Z.ÁŸçÉZ_Æ#6 +$V?îé×±“‹G!eÆNr%“VShÛ¥O秝97+ã–Ƕ÷ìÕéٟèaÆ ï,‚ãqÑ»Y úË8‹ ]å.ÜäIVaÀÇX@B³)¤BçeߚWÜë _ÛÙ?»r`„1s÷ê²tÆExXyƒO“WŒï(ÆäõwäÝ¿z¯¼‡Ø×ÿÙ×xö} !¦‹ù³ë ”¬Wv«ú¶õ½ýëKôB¡£z'dQáëã–]#È Ž…3ñ,¸eõ ÖaÊ k`5ò‘Ô‰IS•Í”k”•.l5Ã^·ša¿^¯ñ‡+‹p*Éßr¡àò .JàŽê ¸ßŠ}Ð YÄÔ~Óÿ85%Ñ絆 ún]dˆðÚs=²·"°uC³ÅÀ\z‰!†Êbë¾ „GCTbìÝ:é¸@TUþ@Õ‡S7þÃý Õ®ØL±.ށ-m +û %€–Ё–°.32r؇ê#7ӅÎÊTWhtÓÏ»Ëp›ärU¹½_åEœ£>âÀ®€â)òpâҚ. ‰ä‘³œ+œM¥ëYÚAÜpäZWI §Vð–Z=Ÿ©— +ª=½ÃÙÀ¤Ñó‹óåžãƒêÙnñh”A$›ó¿‘A@Òá÷¬Ó :bP§?-UÝšsl„HÖu5_ö] §MF‘6£@w£ ¦qš_zm‡¶Iµ²4 ÏUŒŽeÛ18dêæs;ÔÐaJ°SæÓNµ~Œƒ6¬Ý¬ËÄÝèÍÏÓäÃz‘ + O ¥aí„ñ~µž sÉ9>˜):É3Õ9¸<ciƏöˆB¸-B)(«X/0ð¢ψ¾u/rÛÏòÊXà #:³åZ‡p•˜ìj”Æ"ÐÚXÄIgÖÒ-ï[w<@Ÿ â¹S±†7°ÝÌ0H·#ƋBHÒê Ç‹8t¤‹3~¿8»_dÝãæ©íß"їy†¡2z‘°ñ°ÿ^„€J\˜µ{+ +ﺱr)âƒKÍm÷"Ù&äóme€²ïEw܅Ù@t9Ìë²ñÎièÎâàîÅß¹Åþ½v¾ùœoÜù«àçút?Bs¿†Ðœ 4¯±(4:èÚ°<óG)HØúãG]Œ½]Á5;P}ÚnÈ §†xÇv×-â,_'^¬IÑÑÅflEb4aG‘yèƒ4jú°ßf”£Cý^%õP ì¦.èöRò+ÿË)„$¬®P.k¹Îñöª²4=lŠ‹s7>(ñ.¥ñ²r‚·UL©Ë;KÏm t o +0-ûúxS݅7y¯'!0${Àp’Y8Iÿ-8 SS6y`ˆRÝ(ýÿÐäHø D€Á¾èàòMì]<p™øÒ÷>Šï³âaâÑöëJµÒU ú +`²É³E öòÖ¶»Vã\?؋âñZû~”û.œ„Ñ>Œ«î‰qŸãÑ·µzè¶CT«Ó28Vף˃\ÀW7QÿѼŠá)ÿ½‚öi·æѵ¡mö~¸”ŠDLúݲþ^Ù>  ‚ןš[Â)Ú ¿Àºný ÖvÝwXÛù½Œ‹o¦BLœ¹_é쪾ú .å”M‰¦3 êæPÀ›8vJZÍþòêÖ¯ÖÈ­¼L…Äo1ܪª6ON¶Û-¹(ÉU–l +’T'›Mz²ë;.øŽÝ0iòÌ:/œúIÖdD2´ÿ?EôÇÔ +endstream +endobj +9934 0 obj << +/Type /Page +/Contents 9935 0 R +/Resources 9933 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9926 0 R +/Annots [ 9932 0 R ] +>> endobj +9932 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9936 0 obj << +/D [9934 0 R /XYZ 90 757.935 null] +>> endobj +9933 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R /F1 542 0 R /F8 504 0 R /F11 418 0 R /F7 505 0 R /F23 340 0 R /F31 472 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9940 0 obj << +/Length 2223 +/Filter /FlateDecode +>> +stream +xÚÅYmsÛ6þî_ÁO-u`¼ ˜ÜÝÌÅM;}»ºµ{s$£¡)HfK‘*IÅQý-^H+Ïõƒ† ,v±»Ï³€p°pðõÅËۋ˯ ”*‚ÛUà qJ‚Ûeð:$Et6'ãðzFp˜Ö›tq=£8¬Šý½ZÖéâûü®Nëýóç~÷ŒÈ°*gsÊqxU¤Mc›?«•2ßT™)Ë"ÁC–ÙÛÛo/^Ý^üqA@3£ QÌxm.^¿ÅÁú¿ 0b‰ ̨MQÏ"¸¹øéûVqìYE0",ˆ)CXpkÚí½²:­ª¢¨f”‡y¹¶]Yµt›{ûÉéßv“vkT«Ñ—Õ®ÌÚl“`w¹¯G’ Œ)hi4¨Õ¦z§Í6ÍÔb™oTÙÀ¼ÆNÀbIÞM|n¶«³·{šÅb”Ęè9sFJ( æ:¥³úkUª:m«zq³oZµ™Í¸vݼÐ"AÌ/Ô D"ÀÁfWL†”IVS$°ÆPS+.o&Â#‚“³¢ˆœEâ |(Ìn‰3|}؇À}ò<2"Ïr¡SŠN»0¶tƒ†8¾Ô^‹d˜¥µZí +ý¢ÝªJÛ­¡eFxøÎú¾²Ç$Ó;rDXŸ¶y™Õ3‡ +¦´iQì'tä $ñhqÎ1׈3½ž¦D‰‡=„tHºŒ;ôh¦»¶Ú¤mž™ÕLW­Êt£–îûª…âš8Tivï:·ÛfÆ7º ÐOÞÇ%¥ "$ù„ ÂHJÒM¬¶–Æg Ì3g\Œ‡†íJ¥=ñ~«²ÖØ —k}ÉÒÒ6î”}Vwmš—À3àj‡_ééUm¿õ´)ì,$2K`ÊÞvïëhhڄ†Æ¨¢2K™ŠJ·º§.'«]±ô—¶í´£5ߚe¾Ò"¡~„x°¥–5æ¬jÈ1š)…\<ý½£ðNÐ7y”¿É9þ|LNqúcªÒG+úÄ¥ý˜ÚáCþ:%ly@ òe¡§⼩Û4ìÆõ‡¤0ÂýN,V ðãÿyc”$ç’7 ¿ðµ¢g‘·F֘v(o|5@yðXï)]ᙆBxŽam€‡sÁIBÒa®CmBE)}•b …$Éášfí΁8IÆÊBÏ;$.Ÿ&üO@'‚£^ücÄ=4^Y¹vô)¸Î×ùŒ„eZ؎Cü¶r8°µŸØÆU=p6â|´/µJ›ªÔ̙›Äè Ž·WÖ ù4¶‰“¾€5é+•UkùRm¶U H ¡ÅÑxaHûgNÁ^SÏ<ªi̙çp¢¬Ê9Èm÷îì­ÚáÛSÙ¼çî <þ|§××=8Ž›%M+m:ÖðUuƒ7¶õÛ®éÖªCnGý\Ô¢ïÀ]kÜ»&AÝEÉ(ØÖ»L»ÄÈúÌ>¾TÃî/«lgŠ›îº@Ã1ì ƒB݋ȧßÀLßÊ°Dð»%:|ª¢Z»ò*ñ£‡2ëÓ¬Õ#'¶DC½dÝ(ˆN)¢ƒ¯í~«&„C‘‡¤Q€—»ÍQ`֊¡>T|Ïtŧ7vm¯5ÔâUaêʼnõ‰¢¾îú=/—҉D4îÓåìÃ[‚$íSãõ¶†<ÐÖÛ)6$°¬L¤ AϾÜåÅÒEcjþ9Z¿ß§Úmƒuñ Õ\þcª+:3³ÖùßæªAƒBh·šC„‰/Š¥ÕÃÅd¶Í©:j°‹°C1œ±æðÄÝY¬ oÒ`(7U ]¼µ]äM_¤¶äÅHø0Žœô9ሁÉ'âè”n1G4‰tw–œ‚Ÿ#-ܝ|tS•YQ5Çî<×H§¦52ñÉmgˆò>/oúÀqꛃc¼Ü•¹¦ý-çx˜ÓÇ¡Û]–VöyçæÜ鐆Ðo'q'Â<£Ž:¤O €$’‘AÀLcµyçáɁŸMÀID²¯µö&é2уEÃ{€%7 ä¡ÞUµÙê}Þîö®üx¹ÊtÚ#SÖO˜ZV XôÅË?¦ªDúˆÿ׿]\ýøÃõ÷¯þûÍí¯⠄;?„‰äLLÔg`)¨ÃD·?Ö˼vð[íêý<ó¸”óõ'CNû¤µÛbμy©qåÚí°jÈ×eUë³î±Íx’Þ{ò0<—ˆ*™MČ Ú·W"B2:Š>½ÅpønûÿlÑ2Á¡¬­lŠ A“ä)£…¨y4Œ–3tUW›Á€Æ3®ƒî¬·½ùph¥ç%@gÞ6GìÜ#~Ï'Èâ°´¯Þù? ‡³¿„ÃÇõ ‰"Ïý§¯û‡ïp®<óÒØm× t¦º×.Uí«ËWûòK£êÏ5Æ8Ÿþ–;}zÓm¢#öÕ·ÍÈ܃ }xÃáRÎHkÙïA×úÎ^Gô%2FìðOà}ÛnŸ_^><< ¬A@ÁÛåíåv[\ûē¢S£²êHzSÕª‹RèܘóïÿÿÂMÈ +endstream +endobj +9939 0 obj << +/Type /Page +/Contents 9940 0 R +/Resources 9938 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9926 0 R +/Annots [ 9937 0 R ] +>> endobj +9937 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9941 0 obj << +/D [9939 0 R /XYZ 90 757.935 null] +>> endobj +9942 0 obj << +/D [9939 0 R /XYZ 90 440.883 null] +>> endobj +9904 0 obj << +/D [9939 0 R /XYZ 90 418.571 null] +>> endobj +9943 0 obj << +/D [9939 0 R /XYZ 90 418.571 null] +>> endobj +9905 0 obj << +/D [9939 0 R /XYZ 90 287.822 null] +>> endobj +9944 0 obj << +/D [9939 0 R /XYZ 90 273.512 null] +>> endobj +9906 0 obj << +/D [9939 0 R /XYZ 240.245 210.84 null] +>> endobj +9945 0 obj << +/D [9939 0 R /XYZ 90 194.372 null] +>> endobj +9938 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R /F1 542 0 R /F8 504 0 R /F11 418 0 R /F7 505 0 R /F23 340 0 R /F31 472 0 R /F72 471 0 R /F95 1788 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9949 0 obj << +/Length 1374 +/Filter /FlateDecode +>> +stream +xÚíXMÛ6½ûWèÔÊ@Ìå÷ÇöÔI´¶{J‚W¦m¡–äJr¶þ÷I”,iµo»‚6'S´8œÇ™y#l¼ž=_Î.^Id$•Ár(I $X®‚÷!!ˆÓù‚`ŒÃ«9Á¡Í{}5§8ÌvÇ­[åöúçø&·ùñò²?=':ÌÒù‚ +¾ØÙ¢h†¿¹µ«ÿsiäÀ.ãR„ÌÐùÇåÛÙËåìÏÏp@jO„BŠ‰ Jfï?â`óoŒ˜ÑÁmýVpÊàw¼›ý:Ãî£3¢‡Ž`0HX (CXŠbTԛ·«.^ Ü_ÂÕðGýêrëű(]Ҍ³uóeiQæ6NKuå>`LÓ8Ý4Ïe»zïÏ(KÑhëA,Œ £Mk—¦qáå_‘Û—1ìu9X{²1D¬‘Â`‚À”ð€‹ruy§sŽÃOv¯®m¾9$.-:#¡§sȳ9á­p¼!,3À˜mŽÝ e@7Œ…€àv&›(ŒŸ#ÎeûJìÏ5N£,ÙÛ2¾Ùùínãr;±…fHh¿¼öibjÖ]ˆ‘·3 WH,8D„‹^i Šø?/é’‘‡°À˹¡a{µWƒÐ2†™7pbÄ5kßz® +%Â]ª^/ªE€P`$àÅ êå]/Ë¿›ð€3¨&9Žà`¨Ñ½í®8 :F;wý&ÝÊ ³Š@‰w‰±:$ÉqÂ2 ç¼ .œ™J2‚4íL½ßçYé¢Ò­>NäÁ‚H¤ªÎ@!Iýâ˜ñ6qºuyܒKWjÅÞF~¸Š¡Š‹¸]«ò´uß½‡9#c䐂|¢Ûĕ.$ i„¥ì}”Sï)îpïn¹\x´ðÖ¡ –úl) ˜"]™j¼©æZPMôµ z.›ÕC-X@ö…oÊæØ¯L³²5ílîViN P:UbµûD†35ÞU͋ì¡ð âÆQÈ![ږàh\œ°QyȝÏÃÄú@ܸq5€«>`þŠëªr:[G7ˆF¬c‡û‚Æ ÌTµ˜ô…R¯j¼°›¡—Å1-mTƑÝíŽm]­+µƒ› ˆdlË6·­"e©ŸZçY2B—Á(ï×_–Wàˆ0_vê›ðÂ/žZø 3ò,åç1)­ýŒÁe»#@'9ÒÜ üµK]n!E¯?'ÿ†Â°ãÃÍ´ük!ŸT£„%3ÖèSa> ͛úWænçoÂ<)Ì›Ï ³fç5i§?U<ý•÷hL4T ¿ B&ûá‚é{¨š×Y6*ñ1UScT]í6¤j˜¹Ÿª9¡£êg•E Ì¼L¶ÈÄ)ð.ˆ–Hå¹Nz@£lh…¦¾sU—ìËcÿöâç·¶{³M—îB'C 0™–ùÔ¢ˆ:·wԜ?¾{”R÷¢k¡c£êß4ŸW¯¾y”ˆVaî+Ɠ7÷)”øŸ(ýï(Sº×:jß:ª'UóÃÎQ·£uŽ†ûÎQùÎQ·£~°sÔø÷ŒÆQ +2Ñ8ê¶qTÃÆdC“!×~ÁÆqüYêºq<ó3rýÙàKdĬù(.LÝ Óéªò·bmÿØÒvóè¹»yø½pù÷sÚÔ<ÿbӃÝ5㊯?U¦ $º„†#Z1D—AÕ¼s΃lý´£ŸfuPOþ­ÃsmËryqq{{‹¢ÒxŸ£¸¼Øïwws¶g¢¨:#ë¶ò“,w-©Àdb«‹Îóÿ^F= +endstream +endobj +9948 0 obj << +/Type /Page +/Contents 9949 0 R +/Resources 9947 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9926 0 R +/Annots [ 9946 0 R ] +>> endobj +9946 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9950 0 obj << +/D [9948 0 R /XYZ 90 757.935 null] +>> endobj +9907 0 obj << +/D [9948 0 R /XYZ 90 665.701 null] +>> endobj +9951 0 obj << +/D [9948 0 R /XYZ 90 651.163 null] +>> endobj +9908 0 obj << +/D [9948 0 R /XYZ 90 443.914 null] +>> endobj +9952 0 obj << +/D [9948 0 R /XYZ 90 429.376 null] +>> endobj +9909 0 obj << +/D [9948 0 R /XYZ 90 237.996 null] +>> endobj +9953 0 obj << +/D [9948 0 R /XYZ 90 223.458 null] +>> endobj +9947 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9957 0 obj << +/Length 1669 +/Filter /FlateDecode +>> +stream +xÚíYYÛ6~÷¯ÐSk5—·¤í$Û$Hš´ÛĤ!Û´W¨W–³»ÿ¾ÃC——v7iRAŸLQäp曙o†26žŒÎFg% bK*ƒÙ:ˆqJ‚%Ál¼‚8L Æx|9!xœTy2¿œP<.³Û+µª’ùótQ%ÕíùyzB¢qYL¦TàñE–ìvvøR­•y§Š¥¹ŒK1f1›¼==šþÐ Äh"B2,óћ·8XÁü³#GÁµY•œ2ø͂W£_GØY…ûÖÅ¢gÁ ° ¤ a)¬‰«}žßšó›gîíb0áYþÀbw™alÜ ´¿»Û¢N–uºL²Ì­Y¥ë c0^ušÔÊí¸J0eá¦ÖU™7/ÝT £Ê—e±««ý².«:PzàÈ©àˆ0À.$ylut³TÛ:烽Œ!\ +qL L ‡Ö®^Ÿ§Å„ãñ»$KWó¤Úìs0ꂱ@1mœ]U¥ÆâZGc@ÆüZs™·eVnnít¹Ö’Áº¡#9ŠcوÜììšÁ¡„#Ç̓³>­X–ù6©ÓE¦ìÌuZ_yŽˆâ¤UÚèä9„Æ(Š¢fÕ7Z"Ä}Õ·L6– Œ]­ò¾]Á”a‰DʤCy£ +U%ÚÉÖíM”em*ßÖ.´:ëönþ*iWÚßm™µ •Ãa1’ŒSNa/ßE¡ËyPw›ép5û éÄ!Ycúwž Ùxë€úv«Š$$dŽŸµæ"C*™O~ŒZé?x¤ƒELš@N^Â2>!±D˜1çiOø <›Ät܄§Qi0Tâ‘'fŠSŒxÄz1Ãeh[G?,o€†”Ða÷õ…ñA{‹ôс($€Þ¡ƒð¾t&þ¯é€|$6 ñgE§ü   èn›OÃTçŽ%ƒhHì³l6ÕÞ~<Ú„æ~Þp¨bp…x>Gp}Ñ|¶7ÈzA'Þ?µ÷åÝaÿóÁÑöฤ@4µ=h¡9üÀ.#À&ºï÷uó=4Æ +!Sì¿"†û2?¸Ì]ꯚ2ÜcÃöч}øm§ª¯'BŒ]6½HŠ½ùªcÍï´(¸$·7 ɂ¨Nh4™2 ¦WJ9#­eÍ觑Á¶Ó—D!b¸í®êz{~vv}}–;´/Òm…Òúl»ÍÎîFTO +á(l…¬›®%/W¤Læ†#îàÿ71™~d +endstream +endobj +9956 0 obj << +/Type /Page +/Contents 9957 0 R +/Resources 9955 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9926 0 R +/Annots [ 9954 0 R ] +>> endobj +9954 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9958 0 obj << +/D [9956 0 R /XYZ 90 757.935 null] +>> endobj +9910 0 obj << +/D [9956 0 R /XYZ 90 653.386 null] +>> endobj +9959 0 obj << +/D [9956 0 R /XYZ 90 638.816 null] +>> endobj +9960 0 obj << +/D [9956 0 R /XYZ 90 459.925 null] +>> endobj +9575 0 obj << +/D [9956 0 R /XYZ 90 437.614 null] +>> endobj +9961 0 obj << +/D [9956 0 R /XYZ 90 437.614 null] +>> endobj +9576 0 obj << +/D [9956 0 R /XYZ 90 332.805 null] +>> endobj +9962 0 obj << +/D [9956 0 R /XYZ 90 318.235 null] +>> endobj +9577 0 obj << +/D [9956 0 R /XYZ 90 215.464 null] +>> endobj +9963 0 obj << +/D [9956 0 R /XYZ 90 200.894 null] +>> endobj +9578 0 obj << +/D [9956 0 R /XYZ 90 98.123 null] +>> endobj +9955 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F11 418 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9967 0 obj << +/Length 1653 +/Filter /FlateDecode +>> +stream +xÚíYIÛ6¾ûWèÔÚ@Ìá.qzkM[ M¦½¤¡±éX©W’gé¯ï£¨²ìq¦¦ r™¡dúíï{iì}ð°÷Ãäû«ÉÅKÉ<…”¤Ò»Z{ +{¾$HPâ]­¼wSB§³9ÁO_Ïž†y.^Ï(žfñýF¯òpñst‡ùýåeÿõŒÓ,Í©ÀÓçqXvùF¯uõ™N—ä2.Ŕ)>{õjòâjòׄ€eØ#•%ÂG>Þ2™¼{½¼åaÄTàÝV»Sÿcïíä× >êeKÑó +1ÄkÏ®³,žÍY ããåeT,VQñ1‹Òr±¶o+î,ð2K‹²‘¾ ¦ðôãþÅK%z6s" +<ªL¾·[·8²îW@1{¼9' +ɀzspS‰ÚekE%Càž Û|$)·ÛÞèr—§E­¬oƒp¼ÑVæ;="JÄ1i6Ek›ô0]ÙE–Æ÷vUߦ}G”ÉÎ!ÌFìàH­†ršaÔïË!¾?¯#%@\­\[˛L£ªd›šdbJPÀ¹7§PgJY/î–z[F‰K罧H€|¬@¼Ҋ(ÊÔ[:ãxzÆÑjæv‰Nˁ5Ž#J EG®6y6£bz›º™pƒ V·‰¸;uB€åCV{.³mgîçQºÌ’mXF×qýQ–79— ¤³´Èœ +Ø÷ ÿ£Ôíáô¿‘ü¨þ¯z+£´9Óõ¿ÏAQhŒßïnÆ8b¢m§›01ž0D§¿+ñ‡ZyÎ8t2ãOÛю +·£[/] ’Ñš='MLu­ Š~1$ ÅO@ úb0¤Z/·6eQêW­Íÿ}c‹§kìOÉGš•uêí¿b.õ ë’ƒvB0Ì$~lßËÔ0A &§‚¸Œ¶¼tZž`Â×ó×Ù.]í¸_„×™scþèJ0íOÿJÑÏPÍa¾˜Wc»óùÅÝÖò¢¢‹ä-‘7´ùÖpˆJr9\$€&ç-¿‹Ò,}?1„pÈbÄbº€SQ×t•Ã_Ö¹!m•f“JaR)¦úø̦Ÿ¥¤ƒoHŸ:¯xBø9)W-·pCó1Å\2Á  M°m˜‹6þm°:Ú\븂›Û +Yp‹432-ëW_Øð/lªLš¶yh$õυ4'C@˜ù_¡æÿ55ÓÇ!MÞEIô·¶"z Æ<֘2„óÑ| Pç$üx6› ðây¦×kºŒLa(‰º#z±Û.Ò²Cäãøª¯a5®uW5µ†îP9&˜)àíåMõ]2vÇc.ãøç@W¨ï8]ìtlç0ºvmjÀ•AiTàj\ÍjüúG"FÎÓh=# +«±:¿˜…N¶å}gؾ +f€Š¨¡’ã̓ÅøJK(«ŒãÎB=‘Ȩ¬Tßn¢åÆÞ²Ž²²¹)¬¯˜–aÑÜÄlêÔ}®M}VO7{Ãx×pãöĞlw¥^Ÿ*Žfҝ)5N…‰.uþ‰s%@XP7S‡FĄrÖ͐Úü¸Â4»Ö&C ¦Ï‹Ê¬Ôö«&4×õ²l÷ŽdUù°–ç>'|7ðՉ±™ÖâÀèx0> +à ؋O +³9Ëæê-[ŸV˜guYûÈ\Èøž}+fI”~ «›´.€=ŒîW·“D‰Dg` Çiú.Œ‹l°±1Õuøxc*Ø#¿²½'c{=~gø0ïê«?Ž^§a Á9Ì´7Æý9æóvFúÌ\¹ƒÂÝô;n#š EÛ9 ‚»Y oëY +gV>ûY8m«c å?Öep”„ µç½±Zفù/4€!•{h݈‘čŽ0Ç#fŽ4ç8€]ÜÓetdrS=|¯ôb½®ÇÔ.-³Ýr3Õß_eã&8õ××êWW°ˆ‘Ï‚úWW¡|€Ø¯Mn͹¤~l&ö±>Ø‡ß +;bZcÝ/aº ãîW[&y7­aêaD MF†õàé[­k'­gzÍê'‹Þ½$ðë(î¦,·—···hY ]ms•Ûm|±]=)02ü®<›©”dy{—/“ÐÀê^üÿ¬œä +endstream +endobj +9966 0 obj << +/Type /Page +/Contents 9967 0 R +/Resources 9965 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9974 0 R +/Annots [ 9964 0 R ] +>> endobj +9964 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9968 0 obj << +/D [9966 0 R /XYZ 90 757.935 null] +>> endobj +9969 0 obj << +/D [9966 0 R /XYZ 90 733.028 null] +>> endobj +9579 0 obj << +/D [9966 0 R /XYZ 90 642.262 null] +>> endobj +9970 0 obj << +/D [9966 0 R /XYZ 90 628.277 null] +>> endobj +9580 0 obj << +/D [9966 0 R /XYZ 90 543.961 null] +>> endobj +9971 0 obj << +/D [9966 0 R /XYZ 90 529.975 null] +>> endobj +9581 0 obj << +/D [9966 0 R /XYZ 90 433.704 null] +>> endobj +9972 0 obj << +/D [9966 0 R /XYZ 90 419.719 null] +>> endobj +9582 0 obj << +/D [9966 0 R /XYZ 90 323.448 null] +>> endobj +9973 0 obj << +/D [9966 0 R /XYZ 90 309.463 null] +>> endobj +9583 0 obj << +/D [9966 0 R /XYZ 211.842 89.441 null] +>> endobj +9965 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9978 0 obj << +/Length 1951 +/Filter /FlateDecode +>> +stream +xÚíZIsÛ6¾ûWðÔJ3Œ¤{k'Ít›I[wzH2Z‚,¶©’Tœô×÷W²ä(z±xÞöÂÁC€ƒ—WßÜ^]'Y¡HRÜ®ƒJ$( nWÁë!ˆÓù‚`Œg¯æÏâbß½šS<ËÓ½*⻟’û".>ÜÜôÏI8˳ù‚ +<û6ËÒÕk]¿ÓÙR]Æ¥˜±HÌßÞþpõâöêï+’á€Ô’…Ár{õú-Vðü‡#…Ác½jpÊàüvõË>ªeKÑÓ +19Íîó</$¦ÏÑñæf¿O¶É?ڒxƒ^æYYÙéOI¦ãâîÅûÕ»,cóê £õõw‘艊ƒH '©6ÛêU…Hˆ¨4–ª}eÔPröm®×o0¦ËDgÀ‡ØËB)„Û½å~w—y8PŽ""/ÅaåçÀD8æ`bŠ0`oöÔvßo=´¹qa6¦ýRgºˆ«¼8"¹@à’ÍÆi…­npÖij'n—÷ .XD‘ÑðX_'Y +~ñÖnxä +IÊíÊ_uµ/²ÒC™q„q«cU쵇•pŒQ³(YÏ /ÎVvgé;‚WõnÚ×UHÄzºbæc`j“”RÐVˆÒrÌòÊôvW}è;d¡0R¸=”.$Žiê˜Üçûl¥¶ë"ß:>÷ùœˆÙ;óG;d,‘$ôЧLÙ¦° 8˚õã&YnÌð–BdSç-Ò._Æ¥¶é³Ú¸U¡ï׳ws*fqºw/ëã­öß.OL´šáãFÚ£Qøª§mÌ»À.t¼Üh—ØÇ .œË|»ÛWz…êÔÞäæQ0-(fHJ(s>ï’p¼Õ•.ʛŽÐ n!!*l‚,DXС½=ã#¡¼  ÛÆ´i°íX2MÖ®Ï ·ÿïÝú&û¯š“¹ÿS/«v­Ç©"cy‰¸ê;Õ×#]ö1Ò öH)1Jý“ŠP…ÊöÛ&ši¾>Í7ŸÏò²òQå8" ãò­t–o“ìHÌö +PßÃÇ(‘èr×t–îÅU²…±ÍÒu”×$qÁ§e>Z؈zŽÆŠ¢«¡Ó<;3jꏍ6EM„ÄUC ±—K­WeÉì1ISû¢*Ø còÙÄÝh›LCs¸æÝ2ÍË}1|ožOe:Æ&ò„jFì0ӏ¤*]®†.ƒ`>¬ì®u< r _ “à‹÷K½3;3F=YªÕÍ ‚Äi²º‹‹ˆÝ¬:z†¢W«o7EnTxÌZÿód*h¥åY•£-óü6Wê2íFŸYS‘V ènòø"ÉLu¼Oíɀ霁`0Pˆ(f·~ïkŠBèÄ%¤àbý~…€s¹^ˆD¡qpaÅnה±}”ëvËÐm["óÔ¶Df4h‰¾òµ8B˜µå` IƗËA¡ Ç܋ºµ\É6OB…’ÂLŠR؃ >ã E=èãd˜j AËi@¨aðk8ôðµñÎx­ç¦zíŠ}Vå{ÈE¶­:è¦ z E„¡.Á¬+ŠŽ±.,˜¥s2; ò&™ƒ¼‚D}ÈkO@^³ò‚W€2#C/ý äSØç|X“P‚TôŸX#Ð1%/òa­AQìõòàG*2„µá©¿Q©›¼$8 ÝoSä$ÁGæzeLdŠ¥›6ÕÒNÝ圝ü^êâ˹3ç2?ÇÙ>v·J¦ZÚ;Ý¢35FÐR“^‘‰<ûMk§¤Õ쯠ýh‘K'/ b]ϳ©ªÝÍõõãã#Z–hŸ%»%Õõn—^úH +ᨻ¤]7˜l›m ÂÃmýɍíÿ/V)#* +endstream +endobj +9977 0 obj << +/Type /Page +/Contents 9978 0 R +/Resources 9976 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9974 0 R +/Annots [ 9975 0 R ] +>> endobj +9975 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9979 0 obj << +/D [9977 0 R /XYZ 90 757.935 null] +>> endobj +9980 0 obj << +/D [9977 0 R /XYZ 90 733.028 null] +>> endobj +9624 0 obj << +/D [9977 0 R /XYZ 192.853 466.919 null] +>> endobj +9981 0 obj << +/D [9977 0 R /XYZ 90 450.89 null] +>> endobj +9625 0 obj << +/D [9977 0 R /XYZ 211.842 218.338 null] +>> endobj +9982 0 obj << +/D [9977 0 R /XYZ 90 203.688 null] +>> endobj +9976 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9986 0 obj << +/Length 1890 +/Filter /FlateDecode +>> +stream +xÚíY[ã¶~Ÿ_¡§Ff8¼Sš / ’¢IŠn’)ú°Y d‹¶‰•%W—u¦¿¾‡ɒ¬o6óyI‘‡çúCG»G¿ùÛãÍý7’E)J%•Ñã6Jq¤$A‚’è1ÞƄ NWwc¿Ygõ!{z³¢8®Šç½Îëìé{³®³úùáa<¼"I\•«;*püU‘5oþ¨·ÚýÓåF]Æ¥ˆY*W�ùúñæ¿78Ãqœ…ÑæpóöŽrÿ6ˆ¥Itr³§ ¾EôÓÍ78H…ÇÒ¥b$Á@°HQ†°^DSnŸJ·¿ðþG«¨B„&ðÇMÜk/JÙtµUí»ÕÖÛþ¿)Ƙºƒï~XQgE§¿œí5áð.lvGJù™ÁüE%Š\0˜ë²:˜òõYôۍY„mŒ%3]&ÇË8G‰ =“mÝi;ûRŽILà7+ó @Y<߈b‚¿eESÍfö¼þ‘AT°‰È»—,b[¬ã?{ À¤ô[›ÿe­©Üˆˆ›n³Ñ:on¡›ŠødŠÂÿXk¿"ÇìJ‡žÿy¬LÙúk[ûÝUÓÕúâÿi¯ë é‰9{pÙó¨9ÖKöPHˆAZg›½nf—¤i¬ÇöÙ7«z‰²@*½ªíEÒeÕúƺêÊ܆–ílëê†u፽‚Pº]؛àõºŒYÂ2FÀŒó½kÝvuÙï9ØB^bDÔàzCzšË–¢$²Òí¢ò…âc2ùg“ý„ÐÏݱ„ "TÀ9óð©'¾[ – .“ Ï-ô¶õ­®l«À(GüGÀîŒ `‰"Ò㵫dƒìʙuUÖR&?§°yxØTe›™Òæ&Àÿ†‘¦í).TB0þÏí±˜²Â^ú¼ Öù9ÔñÔü†‹¦ `Uk +€PðGçzÍR.`ˆ'üSó%XŽè_ Ó#,%<Äó)x5øØˉ‰$ Ä$sž%yú;ÍL øÄÇ´ùk`5åü"}MèPŠÎ赤wÂ#Ó´d9o«cUT»çIV²¿”+rì”sæ +É +CDc1/=fImnL–"É ~8°x5E6E%>š¶6›¶X‘Ø&±øi­Ê¶Jhô¸¡¦¸áöZÀ ÅqƒC1JEz 7Ø7œÚ8¸ Lè©G`2#¨ø`­·¦,L©ß-¢ŽŸéA‡ÿqA'Ø6ìüI(?$}%¢€Œ¥BЂ’ñ  þ™Ê¿¾³‹=Ä8R ¥0Ï‡òÝf¯Ýçý”ÉO¾ +¿@IñÁqÿºTâA1HÄB<¡ãªOu ¡ÄBMŒ‰§óHð¾™^döX=»/pïÎ¥µÉʶ¿0èkÍÌ×ØCl¨1?˜¥PgLάõVDÄó¸œ+©Çęá +&RL0U SÙ#! -GŸD8ý„à£×0‘CðUÔx.¼š ¯fËÍ\͐þš ï*Ö¦/ñŸÜ¼m¬açn9…% +gÒdt溤™‚•Ò«G7(Ÿù ‹þüIg!,AaÉ4‰þ6ՎS]pGwVµ /2H_vFÁÐtš$zdÝêúW&Š‘c¾€óo€ ¢>!ǓYŽ§}Ž§CŽ§6˜omCZ§òsòÜø«4ÛkíEI½›˜rF'Ò¥€¿]0+ÅѳËý¶ša$Ö¡s%ð±ü86­.uîÑ,ˆI5ż6Ü^®õ‹þpÎ(ãkwÌhö‚¦rŽe‡ŽºÞVõÁ],°½%µÃYãûm蛬–k?˜…µ…iÛb6v¬šÆ§;H:ÔÞ¹ávæ>UùÑ}¿ÍZ»«QË"$LSôìœüx݅L‹gŠ< šàÄސêÚÕ@¶Oc]fÀGn}…³X×µ»þ†‰Ý4ÙÎa•]V‡õ§ılØÅU¹TN€eð|]Å´ÂK¸ÝÝø-6Y£=ýÅ´3æ惩Š¬µ9êi&4A,®[©bˆÎݤkô¶ )nÛ_÷¹îØÕ`=}ÈõÚ Ýnçce¼ 7ÖÜÌ_hd‚RÜO| q2 .NŒðÜ$‘Ÿ=]¼±ÉÓ<¡ÛW<¾û}ïK¶óo°þ+!‘ÿÌÊ. ª°¥ÏK +pÏô¯QâQ[kXCþ¤uÒKö>ê[ßy@;óKÕÞ`ß}ÛîïO§Ú4¨+ͱF¦½?‹ûËêyDÊÏs}:ØëPÕCqbcÓ=\èÿÿƒö÷ +endstream +endobj +9985 0 obj << +/Type /Page +/Contents 9986 0 R +/Resources 9984 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9974 0 R +/Annots [ 9983 0 R ] +>> endobj +9983 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9987 0 obj << +/D [9985 0 R /XYZ 90 757.935 null] +>> endobj +9626 0 obj << +/D [9985 0 R /XYZ 192.853 580.2 null] +>> endobj +9988 0 obj << +/D [9985 0 R /XYZ 90 564.096 null] +>> endobj +9627 0 obj << +/D [9985 0 R /XYZ 90 460.702 null] +>> endobj +9989 0 obj << +/D [9985 0 R /XYZ 90 446.132 null] +>> endobj +9628 0 obj << +/D [9985 0 R /XYZ 90 331.406 null] +>> endobj +9990 0 obj << +/D [9985 0 R /XYZ 90 316.836 null] +>> endobj +9629 0 obj << +/D [9985 0 R /XYZ 280.943 111.036 null] +>> endobj +9984 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +9998 0 obj << +/Length 1297 +/Filter /FlateDecode +>> +stream +xÚíXK“›F¾ëWpJPU4;o@7gc»â8Éf­œ6.+fµTxåקa,Ò*²R§öÄc†ž~|ýu7ØZ[Øz;ùv1¹z#™å!ORi-,[Ž$HPb-ëÎ&q:Œ±}3%ØöóØ_ÞL)¶Óh÷¨‚Ü_¾ïs?ßÍçÝ×SâÚi2QíëÈ/ +}{«T½¦’•¹ŒKa3ϙ~\¼›¼^Lþ˜Ð [¤ÖD8ÈaÂZœ»Ø +àý; #æ¹Ö¶Þ[œ2¸FևÉ/|Ô*Ê–¢cbˆcڧʴ4 @I"Î1t>÷ƒ`¹J“¢Ìý0)µ ß°Àõ»ê‘Û׃å¯*«¯Þx¢£*ǕZ ©5]é-=k8(ϛ pÑ{îì™qì áZ3⠻뽯‚À„ÁחUšU¦îôSúмmÕԇwõ#˜#Gõëí".ÝfC™j¡å£Ò7Å®(U|èÄ¢]¨åҮ݄BÌÈÞpÌFôãÈsi{øcXŒ(H%â¸#HàmX>¦›R‡I‡…Éz z®ŠMTVG5^À â3£ÒA¨!É=}Œ•«Råż'`/¨‡â"{CaA;ï|Ð3Ì»Dc×¢Q»‡ÊÚßÜmÃ(Òw÷f/ XfÛå"G8Âq/:†¼6rÇ£ÀEÒå: +&ñ_ÿ¹RY‚Òÿ,ðJEÌça2åÀ~K?_ob¥“å``b˜<Raov8æ2Î ‹Ø #σÝ­ ? ô¡G“\xãôXŽ{¯š+-´L³4J×»Y˜¬Ò8óËð>ª—¤æzK‚¯ +ˆÀ¬’ +Á“Š§ÈÞÅݯÑΘ‡$0Á HœgÀéÒpú}š¸=‡^‚ϗล!¥¥îɽ2÷M¸äÜՃ—)q>›é%’!†éÅ Ó¤‹oN¢÷ç¨] Îè µÿw¨½‰Â­*7½Â’û×#®ð£BèćNËs¡ñLM¢µG’ÈdT³4“Y4TqVî¦Ðð·Ú ìº/uë˯[8U#M¾6³ÍíÓ s ìíôýÊô¬´òKHÝñÀ÷Ì«Oúqÿ ”ùr¨‚uW£ò•çOi©T°ü}œEª‚Š_A°Ïí¦Ÿ3•ûeš==›Tš ÅÊ!ü@wžNeŸ_Å×*Ѫi9Ý¡ ßöWÇg2˜ˆe Øõh¥îÜá™L"ÁÙY¥zoÄX¥†ÙÖcý>³R·/Ô[&¿ˆ™Œ#áÈ~‚A«äB¬ºg¡­R~V]&.A«"ÌëÓ*z ^¢Ï1pA»ïM4©‚ÈC¤ +K5©Âõ)©V‰A³ªiášdu•#¡f_¨u Ùq?éóú63¤ÓpcåՑ,%µ‰“³´90IË?d)¿QR¥Êõ «ºVu{sÁB^€RsQ-õè`tÝ +X’?ǶäÙ¹ˆ"${ΰÿ=Ù^~,¢Ð³ŠórbúqvB?îþËýøð7´tÁ[î©¡ë¿Ï 4´¯sÍßghL…àƒáí¦òM•}æ±I?ýhrP?üZ¨ü멶ÑüG?ÙøѾŸùT‰‚Ù³mÏ0"Q]a\6P[ö»ÕÜý ã±×—¸b¸ÅÐcYfó««ív‹VÚ$a–£°¼Ê²èêi‘ëH!9­‡&áã47æ‡ ¼Œë–ò‰ÿÿCx5F +endstream +endobj +9997 0 obj << +/Type /Page +/Contents 9998 0 R +/Resources 9996 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9974 0 R +/Annots [ 9991 0 R 9992 0 R 9995 0 R ] +>> endobj +9991 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 358.813 138.508 369.692] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000001) >> +>> endobj +9992 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 338.724 314.566 369.692] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +9995 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +9999 0 obj << +/D [9997 0 R /XYZ 90 757.935 null] +>> endobj +10000 0 obj << +/D [9997 0 R /XYZ 90 733.028 null] +>> endobj +1313 0 obj << +/D [9997 0 R /XYZ 90 592.061 null] +>> endobj +10001 0 obj << +/D [9997 0 R /XYZ 90 577.49 null] +>> endobj +9630 0 obj << +/D [9997 0 R /XYZ 90 329.757 null] +>> endobj +10002 0 obj << +/D [9997 0 R /XYZ 90 315.187 null] +>> endobj +1314 0 obj << +/D [9997 0 R /XYZ 90 212.416 null] +>> endobj +10003 0 obj << +/D [9997 0 R /XYZ 90 197.846 null] +>> endobj +9996 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10009 0 obj << +/Length 1575 +/Filter /FlateDecode +>> +stream +xÚíX]“Ú6}çWø©…™ ôm‹·t›Í4ýJ“íÓ&ÃxOMm³„þú^Y2Xưٔ‡tÚ'Û²tuïÕ=çHÂÞÒÃÞëÁwwƒÉ­džBJRéÝ-<…=_$(ñîæÞýÄéhL0Æ÷#‚‡a±goGót¿ŠçE8û)y(Âb?¶›G$æÙhLÞ¤aYš×wñ"®ÿÅYƒ]Æ¥2Œ>Þ½¼ºü9 àöHí‰ð‘Ï„­÷±7‡ö7FÐÝÛÕ½Ö§ ž©÷~ðÛÛ¨ðÙè…0æžO%"’›_}ŠâM•äY9­èZ™Ü*Ñ2Aäcå 4 aL”Õ|:M²ÇÃÇ0Mæ³°Xn×qV9'··3-¢ð£¶p·*òÃdŒQ>Lzè䖶½ç  ;äÆÌt’mÿ8RiúT«¤4}œ©©SM§0››I—qa•=fE€¸lF,{l*DñÁ·°ˆÉ*ßäi¾Ü“,Êכ°JRû ¦©Ÿó2UBþÇÚª7¦ÄG’RÈ09f¸=ü…©$=^?{SåKÄ|vTIÄñ¡Sb«8´…¯7ÕÞ¼nlÝ75¯³z:%! _\J¤NtН0Ë+k¶™-É*Ô©Wšbiáóîu·øÇÔÇS/I›Øï㍁cVñü ÿúð>ŽíЮÞ}íïKãö/yÛÕ³iªV¶á‡õ&5fBEÛiÑéôëÆhé8 + ›k'^($Ÿ0oÌ)"Âoñ‚EP–Ô5©å @€êK(n: çóY”gËbkHMú€†¶²2Ÿ7ßßfÁnÉG˞˜Tc‹é) ±é4®qd½œÏK§€¢|£CÝ»‰nEÑW»¨÷@YQ_ñŽø‘'ª¼š#ÊÉ5 É"‡N/\6p=gHõ Ç£à¶ðâÃOaT¥6cà&.¡\4¦ç¾ІPG:5ª +ŸLrõŒD®¤HDõIågxVCKŠëð,enK’žôbAJpðä²28²¤Í5§+,œ0ð³¥$ügLjÂõÆ 4ɧÜyS-EÌv‚Áú{·J¢•-îF â(±p +® +·U-µ#ØP½hT£è€>«ŠpžDº¶z)“)$é§LŠ-e>äy:KůA—3XëÙ:ɒuòW¬­ŠwêÄ5´(77ôô1©äÈç'ktB¤ü”H;„‡zà»û$K“,þØǸ ¶†r¹C¹APg-ʅ¯ºÊê֋” iž¤Ü€²§(WÒk1n›p•%À¦äi¯¹Ë·šoáéò-4¸|«{îäùÖúeK*ɖ~DI}‡}˜Þ¦Õe¦ÆH) < Z"XWÛB{Ú%ên:,A ;t¦eܓHóÜ±8n&í¶© ¤»721¸Daö§@—Cˆ4ø_ƒþc$¿ zÆ †k"óÝBý² ù×`ø5&'˜@ѤÈ%, +Km‰µO0ÚðÍáÿlìèr“Á}YÅëóšÌÄrÜ`—=ñˆ*õÔáFP„Iÿé†øu‘ٖZh¬WZÍ*@ƒ«n–êƒAGùÊ~”D·´·¶fç‘òÉIˉ“¹ó>N##Føg}šÔðñ>A/ꀛo+3{K&Ý9Ñ«pY;@k‘TÌŤ­ÂpWqñ<iidT^RŠzkÔÄÕYANËÜÜd×B+‘»$MÝ3  9ÌÕ+Ù6T¶ª»uXv÷®$UP#‚]ý¼{yU˜]bâ+—t_’~I A¯Pýa®ü¶¤ŸÚ¡¤>_ĹB‚SGµïgn7}IëÛIÝåävs0%]nw×µ{#.Èeð¹âõ8"õé$°×ûb¼Y [ßoõ.VˆýltÃ|Zñ0¿—qñíHˆ¡­úŸÃlZ(izyÔ¦õÄH_ù&3 †£ØšÈþðš·ÍÎùè/ |ؓ2¿ªªÍt2Ùív(*Ñ6K6JªÉf“NN+°exú¸Â‹fG²Î ~’Aã:<ݒ@þÿ™V² +endstream +endobj +10008 0 obj << +/Type /Page +/Contents 10009 0 R +/Resources 10007 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9974 0 R +/Annots [ 9993 0 R 9994 0 R 10004 0 R 10005 0 R 10006 0 R ] +>> endobj +9993 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 665.586 138.508 676.465] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000002) >> +>> endobj +9994 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 645.496 314.566 676.465] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +10004 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 307.79 138.508 318.669] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000003) >> +>> endobj +10005 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 287.7 314.566 318.669] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +10006 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10010 0 obj << +/D [10008 0 R /XYZ 90 757.935 null] +>> endobj +9631 0 obj << +/D [10008 0 R /XYZ 90 636.53 null] +>> endobj +10011 0 obj << +/D [10008 0 R /XYZ 90 621.959 null] +>> endobj +1315 0 obj << +/D [10008 0 R /XYZ 90 507.233 null] +>> endobj +10012 0 obj << +/D [10008 0 R /XYZ 90 492.663 null] +>> endobj +9632 0 obj << +/D [10008 0 R /XYZ 90 278.734 null] +>> endobj +10013 0 obj << +/D [10008 0 R /XYZ 90 264.163 null] +>> endobj +9633 0 obj << +/D [10008 0 R /XYZ 90 105.736 null] +>> endobj +10007 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10019 0 obj << +/Length 1313 +/Filter /FlateDecode +>> +stream +xÚíXے£6}÷Wð”@U¬ÑòÛf³›Êf“LfœÊÃfË¥yL…‹xçëӁaì™-'•lí·FêîÓ:§%lÝ[ØúvöõrvõÚc–@£žµ\[[¾G§ÄZFÖ;›äRgN0ÆöµC°-‹T®®Ší<9lTTÈÕÛø®Åa±è¿vH`ç™3§Û/Y–ÍíZ«ú›ÊBã2×ã6Ây¿|3{µœý1#à¶Hí ÷‘ϸ¦³wï±Áû7FLÖ¾¶J-—2¸&Öíìç>e{¼bˆ¶¡}СåqäÌ]F>&ÐÅBFѪ‰,<„‰ŠVaž•U!ã¬*õ°Ôþ sü²{¹šë˜Áá9x#¸ñìöPV*mrõ…6¸z-x/—!ŸxðWm–É ØQH±€9IcÃqÏfÎ)Âą¹}äQ·±}E¥j£š›A úEœ™ûN áàSƒ ‰‹\·3©òÑSë c°¬‚ÿ»Ø÷uæ«')ü9%ÀˆÀ¾¸Ñˤf‹rÌÞ9M_ˤTSTKkÅ1®Ç&}šr›´eíZŠ×“a˜&Ë +¸ç YíttÐÛà ¸lïBŸÝ»Àª BÎö¨ é»}œ$§Z™KÕ%……L¸{ùèdÉq r`O½ù Oi>¼ÿróák>šoqo¶¾7OkG¾Q[³á”•ŠûlSr«”ùuìƒõ®®øMáÿ˜Wªå˜ÑÂù.Ý&JWˆl™Iyùi« +YåÅp½·U~Rçý‘λg^À/¿e¯Ur‹~ltX£Mý9Å'L ÿ"’{.ÜI>ÿ¼ƒÿDzùT\@ÔégQ‰:ùN$ȧ"1>2õp7xê‰i}R +ŽxZsRÊA¹;çZϯùÕ<¶Û<–m~)Uñ¥Ã¹mròƒÌv29²å=TW'Ð9cD›´:¿GIj"ûÝjï¾oVÙÑ_øˆá.¹›ªÚ.®®öû= +K´Ëâmâêj»M®VdoÈ¿ß ²Öª^“G^¨Wx™Öòö ÿhüÞ +endstream +endobj +10018 0 obj << +/Type /Page +/Contents 10019 0 R +/Resources 10017 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 9974 0 R +/Annots [ 10014 0 R 10015 0 R 10016 0 R ] +>> endobj +10014 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 289.299 138.508 300.178] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000004) >> +>> endobj +10015 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 269.209 314.566 300.178] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +10016 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10020 0 obj << +/D [10018 0 R /XYZ 90 757.935 null] +>> endobj +10021 0 obj << +/D [10018 0 R /XYZ 90 733.028 null] +>> endobj +1316 0 obj << +/D [10018 0 R /XYZ 90 522.546 null] +>> endobj +10022 0 obj << +/D [10018 0 R /XYZ 90 507.976 null] +>> endobj +1317 0 obj << +/D [10018 0 R /XYZ 90 260.243 null] +>> endobj +10023 0 obj << +/D [10018 0 R /XYZ 90 245.672 null] +>> endobj +10017 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10029 0 obj << +/Length 1465 +/Filter /FlateDecode +>> +stream +xÚíY[³›6~÷¯à©Å3µ, I€ßÒ4'Óô–&îô!Íx8 ÛL¹¸€ãº¿¾+$0`Ž“¸“N&O!­V{ù¾õ[ [Ï'ß.'ó;áX>òÖrmùØrAœkYolB£ÓÁÛ/§ÛA‘«—SŠí<9neT«ãû"(Ž‹EwzJ<;Ϧ3ʱý4 ÊR_ɵ¬¿É,” ×a‚Û ãéÛå‹É³åä¯ Í°EjM¸‹\‡[a:yó[Ì¿°0r|Ï:Ô«R‹Qž‰õzòë›[áoçùcf¹T "˜¾á³¿C¹«â<+µC)ó;ŸwD¹Ø·f¦8×"Ê*Z,âlÊ°ý.Hâh›}*³ª'p~Çq×Òù>Ô–Û"ŸRnÀb`;^«­ó;Ú՞SÄy»åŒ½HtõcÈ÷H³¦ÚÆ¥^Ó;Ú§ún³(È¢9” ßuš5á˜0gíYA!•îÔ®ò]žä›ã,ÎÂ<ÝÕîsŸ˜¯y¡oÅ` Ì>S’­Å ¤ 0,9¶‘ ¶£1{Ž1ŒuA GÂlþ} +¡@°q;‹³Íâ’3ƼºÜ‚Ê•³ä¨GÆû´ý®®¶… Ö/a`fï;4ˆZ #&®Q(.›˜#,Z—ïwÍÁå> eY®÷‰9 PObKuÛ& ó±Õ¾0!´æ­Úq_}¢Ô¯=B<Qêõ=Rk©¬¡r9’ea  p”$JábcrùչË+‡1_ ÿNî46„A%£²ñQ¿½–Òlê`½©õ~¢Õÿ9¯¤58UmÍÄ÷é.‘*íëzÑz°è—,‚*/ʞ¢ 2Îîß Œ8¨îuÀ9ˆrƒ°ï”1ó8ª_هîbDÑj#³F7%‰XpÄA¼Vfêy³f¥3÷ýúXV2Õ7ýJ_¨‡ƒÌû´Á»)Gîì!‹\q2à3j.­í#¨ä'Q¤èôUa‡ù®3=Y{žÚ0è^W-GÓÍÁÈcÞPã~81D}¿EϼwŽ°ËÆ&%úg×óçÈM >Ý®-„nútsQÎ:FҸÚæûJŸžÆYœÆÿÜ T/d¹O*å„Ë8J} Ü^^š8 RYÉâ=iÒC8«còSÙAžÓºçiÉgå çzÖ®?(S£Cœ$ztoÖB"ˆèeù@Nىî&±‡²G=I}ˆ"ìހ„©ƒüvÍe§8$”ñ»})[®([6Ÿ¾lùH•ùš ©?n!×C>äÜ Ð’×kñ«æz8SBÉrÔCe´zPg‚ãœ2AMªLPÏN&Œà(÷wØesDOK=²¼ê*ՙ1ν¢±½ù¸ ÚåÆÄCžËú&ÞåqV•£LëøH8Ä0­;`ZqÆ´Ü÷?œhM¹r Ùg]g(t~ˆeÅÿ†e/Áë(‘ú1â<Æ£ŒñÞ} …2ß¹ ú +Ä0çQ8½Ç£]Õ¯æQîCÐ:ŸœG—g®=wAãŸqâñ@]Þ-ðªÏðóh|)](«=÷ñ`l3$ ŽýÛ2T?šê~„†1F|ð“åchX|¡á/4üÙÐðU­™&mþóÞ ét8>²1³ù 3ïՍpMtŸç ¨évƒFÄ +b~ehU*©´mJTcý‡SáôXõˆ/ÈÇ×Hä÷¡")ЏN+b¬)ti€P•J׳֭K(qkòþ檺©Ãv¿ðê²âÊnÝÝ…„bÏüwUçlPú¼T¹§¢×¼6á«_M ë—ßJY|=åÜ6&ü)Èöé+¨p}§DAíÖv1"Q]ÖåË©û¨oö§ÕŒ~˜ÔF>éK<9¸5ó¶ªv‹ùüp8 °Dû,Þ(®æ»]2?‡ÇŽˆ·²n +¼4/d‚0™ÖÌ3ûÿ Sà’ +endstream +endobj +10028 0 obj << +/Type /Page +/Contents 10029 0 R +/Resources 10027 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10034 0 R +/Annots [ 10024 0 R 10025 0 R 10026 0 R ] +>> endobj +10024 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 608.026 138.508 618.905] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000005) >> +>> endobj +10025 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 587.937 314.566 618.905] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +10026 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10030 0 obj << +/D [10028 0 R /XYZ 90 757.935 null] +>> endobj +9673 0 obj << +/D [10028 0 R /XYZ 90 578.97 null] +>> endobj +10031 0 obj << +/D [10028 0 R /XYZ 90 564.4 null] +>> endobj +9674 0 obj << +/D [10028 0 R /XYZ 90 394.017 null] +>> endobj +10032 0 obj << +/D [10028 0 R /XYZ 90 379.447 null] +>> endobj +1318 0 obj << +/D [10028 0 R /XYZ 90 151.505 null] +>> endobj +10033 0 obj << +/D [10028 0 R /XYZ 90 136.935 null] +>> endobj +10027 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10042 0 obj << +/Length 1486 +/Filter /FlateDecode +>> +stream +xÚíXے›F}×Wð”HUÖì\`ôæ8¶+Îͱ•ÊƒãR`¤¥Â-€¼Q¾>=̀±«ÝìVÅ®Ês¡ût÷éØÙ;Øy=ûf=»zå1G áQÏYïß#ˆSâ¬#çÜäÒŒ`ŒçoÏe™ÊÍÛÅó<9^«¨”›âm)ËãjÕ¼ Á<ÏKÊñüE"«Ê ß©jæT*8—¹Ÿ»˜,>®ßÌ^®gÎX†ÒXÂ}ä3î„éìÃGìDðüƒsÓ¬J—2¸&ÎûÙ/3l½Â·z„±ëøÔCÄs‡ïT}‹ø<«VívØË{{I€|,œ%\1§fïN&•Ò›®^qÜ[Ë(b¾€SšUñÎø.³È ò,9šQ;U_+3(UuHj;i1SiQ€Û×÷mÉ ÂAàÀĉg^mC&SU«räßéqÉÏ}5zóÀ[ÂPÀ‚ÖÛyVË8«FŽíU¦JYçe7!­›7q’˜ÑÖ®•Q¤,Tu>:§:VµJ-Ž»é³áyÚLJ +Œì·fþŽ13«Qv‘H»¦¾Ž«‰èR†D·æî˜0Nuù0(/ÿ +UQÇyöÀ€À#ÎÍU­Vq¶pñü“Lâh#Ëý!UY}WœG‚¶v¯¯Ë|Aùüj*^gâ9f`=çôÑ 1 ᵋt!œŸC >k×짎¸ÛA/K¥m§$Ežäûã2ÎÂ<- ±ÀŸmbgóÒxÅP°/õÉìÂiKNÀ¶'èíÏ ›\¯Ù1œFÈ÷†z‚¤ò;Aݔ>¼Ó”~34ìS +ýAW0nj®½š87ˆx>¢¿kˆÖ”åuß2 %‹ÒVsÿÁN^Ën¹Å˜—ò!ÔEgu…F% ©¿ÜÛðî¼¢\Œ<ê ê[U˜žÊZE·ÔÔй‰šz¯”Ý:¶ÁùÐÐÊsÃ.?åµjy|DNߥE¢tJ]ÞC’êý\ôÓØRÉØ_-0ð¢×”ƒÚμÍsM¡.ý7=zµ¾ÝXa¢¢Í)y6v›4Îâ4þ»Œ5Qôڔçøu»|ó¾ÇÎ_w\& \ü`œwÍÞciN&r¼æˆ0ÞÀãQÛɟGÑ¥®”y^ ‚"—°KÅàº]½<]S"ҙ=ySzf^iãgûI•qwë¢ ¾»©4þ±Ä>w±Äÿ3±´>KÔó„j³mZMä”ëA*OеGBgɟõƒJËö +‚”V*CoKê|kxé‚ÖÂqñh©EžHiñåK-:’Zä\jÝWgùÿë¬ÏHgÝGUý¦ß* ÛC YÝÉjç…Ó#Ô¸ɪ:¤…‘FŒû ¨gB™™ÁÖnJeÔmŸÖgðXŽ°×EúPäöÕ! UUí‰}Ai¬QÚӖ/¤,uóulôõdv<4Ÿhó›8 @”Žr¾’;Õö²HU5°êqÌk—5°Eûñ˜|1 +ؽE «€?i(óJ—ÓG¨à0ÏöåAÿ›ªôI¬‘·ð°ªÍÁ/ºùÍr †[/è_—/9‡“˜haIsèñ³ú—ôo®ÃÅó0/š 3›0m`0pV¯ŸláÄ5¿0Æ6Y#Ÿöäñ„*æ|/¡K*tß(Cíwó'©ó± ï£vZ—ªlí +Sö2¬‹S ¥¤*HáFeé•G³R¶ý 2O¸c’5ɔgw-6a{ÙI†ê:¼ ;> endobj +10035 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 566.629 138.508 577.508] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000006) >> +>> endobj +10036 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 546.539 314.566 577.508] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +10037 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 235.637 138.508 246.516] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000007) >> +>> endobj +10038 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 215.547 314.566 246.516] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +10039 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10043 0 obj << +/D [10041 0 R /XYZ 90 757.935 null] +>> endobj +1319 0 obj << +/D [10041 0 R /XYZ 90 537.706 null] +>> endobj +10044 0 obj << +/D [10041 0 R /XYZ 90 523.16 null] +>> endobj +9675 0 obj << +/D [10041 0 R /XYZ 90 206.714 null] +>> endobj +10045 0 obj << +/D [10041 0 R /XYZ 90 192.168 null] +>> endobj +10040 0 obj << +/Font << /F63 374 0 R /F65 376 0 R /F50 339 0 R /F95 1788 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10051 0 obj << +/Length 1481 +/Filter /FlateDecode +>> +stream +xÚíXKsÛ6¾ëWðÔR3„'º¥iÜé;MÜéÁÉh`²8å«$Gýõ] DÒ´-¹žœ|A +\î.¾o÷°sã`ç‡Ùw—³å…Çœ…õœËbÇ÷”8—±så‚8/ÆØ}7'ؕU&×ïæ»Eºßª¸’ë_’ëJVûÕªÿxN·Èç *°û&•um†ïÕFµÿ©ÂÜï&É<ž°C|ÁácÑͤ‚ðÑL¥Œïq¡×ÐE’GEVÊ&¹NÕ+ø“·Øl¯ÍVuï©9ü|Iê¦Ö÷܅„ÞukA‚Q߇9.À=îaÀ.?øgXVE lÇQ‘ßT;ƒD}»M¢­&¯¹J´‹æƚhä®)Òâf?ì¾²óŠá0ÝT2N",dé/æÂÃÿ NAmˆ!†-宋"/ÄÓÈ·ZÉ8^ƒ¬×°Ôë,ɓ,ùW³±À0£n¡ +©¤õÍáÕõ‡}ݨÌÄö gH Œ[Jñ2ˆ™0Dƒ#~™ÂA%ݤ«$O“\}šXÝ¡QxwPõ¨eóë8Ö+˜…ðCXˆRgnojøé+¬©ô²cæO¢ŽÀªP.aFþ‘yŁ F‚ùÏA`†ÂCŽ4¿eTwšöclSЏQ-s3¸¶3 õdÔ¤6O•*+UCS±¹73e‹“ÅӐ[¸xƑҢ¯È-),ԒüÆgk‰¶wiƒFåqÈŒÂЃ/ äñÐ|à½jv•vu\«ÇËÕÕè(FÍ»™Öj"• ñÃ.—m5‹óØ Š¼M‰®›É †åBeeӖ…‡cP8ƒ`œ%¸ÌT£ª3{Q/N‹ÍûºL¥^¯í¨q%´~Û뵝•DÅÅ<údÔÿi®ÞKs}i®7×®´t¬n¬†|¥ n¡ñ Qú=T»V“FR¼i ŽitG~Pʾ:öÁ¹jÝ~m¼ÿ­hTW\F%åǬL•Æ¶l#3“ÆuçwH±lŠjÈsp`RfÔ|¬ÌðG2ƒX™ñYמ"šçá@<]kØ,î£T „Ç@\x‡þÏ ñ€<“À § Œ‰€M + Ú!ãþJîÑaˆ¸Ï•„ð5Œ=¡L‘S$Ä@CPS8tFC<£Ñ0¸¶3†p0ÔzæÞZ7—£\x¸¯™ƒRøݒœß,ɓ›%Z tÓIÃl{—ÉýðJE:-u¾JŸ%ÏÔfIx~ŸåÏàSû,¼ÏzáK£=¯ÑžÒVÿҖ¥ì°X=Bµ"EŸo~Ðip½û¨ë]VÚÞÿ4[ÙØ=Ž´º-M&ãÃë“È€½ßÑ5Ø®4Ÿ Ýziî·ÞìRó¨M|Ì,¿%£´VzßbýKì>³sžL„Ðn²HH%Þ$µÜ¨nK«ºÊéí­-“ÝŸßÓýéà†Ÿ¿ó·G‹©þ<‡Ð¡œ«¸Þûó¯ª1Ìó^ÔÀSÔ@hÕpæAðÊ@ˆ2$ÀY‡ +ãe/€8ƒS”Ûdȓn¸,°Çã F„à#IðN‡«yco;â˜[Ësóg­ªoçB¸¶6ÿ*ó][(, >kS i@FTã×JŠãFÃDö·Ó~6'!GIà#†Ù6M¹Z.oooQT£]ž”JšeY¦Ë»Å¹g…ðÞÑÖ¦kYQÙð“fòpÖÙÏÿùì8” +endstream +endobj +10050 0 obj << +/Type /Page +/Contents 10051 0 R +/Resources 10049 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10034 0 R +/Annots [ 10046 0 R 10047 0 R 10048 0 R ] +>> endobj +10046 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 436.931 138.508 447.811] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000008) >> +>> endobj +10047 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 416.842 314.566 447.811] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +10048 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10052 0 obj << +/D [10050 0 R /XYZ 90 757.935 null] +>> endobj +1320 0 obj << +/D [10050 0 R /XYZ 90 682.134 null] +>> endobj +10053 0 obj << +/D [10050 0 R /XYZ 90 667.564 null] +>> endobj +9676 0 obj << +/D [10050 0 R /XYZ 90 407.875 null] +>> endobj +10054 0 obj << +/D [10050 0 R /XYZ 90 393.305 null] +>> endobj +1344 0 obj << +/D [10050 0 R /XYZ 90 177.318 null] +>> endobj +10055 0 obj << +/D [10050 0 R /XYZ 90 162.748 null] +>> endobj +10049 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10061 0 obj << +/Length 1453 +/Filter /FlateDecode +>> +stream +xÚíX˒›FÝë+X%¨*êé'ÐÚ%Ž²órìIea»¦hITx(€,ëïs›n 4š™háEV@ӏû8çžîÆÎÚÁÎO³ng7¯<æH$=ê9·+GbÇ÷”8·±óÁ%q:_Œ±ûvN°–Yx÷vN±[¤‡ŠËðî—ä¾ ËÃrÙož“À-òù‚ +ì¾Hê2¯ïÔJ5ÿT)˜—qO¸³ù§Û7³—·³f,Ãi,>ò™p¢löávbhã`Ädàì›^™Ã)ƒg꼟ý1ÃÖ+|Ö»@"Œ¹ãSß©z 7¯–íp+zcI€|,<± fì*L+¥ݼ¸×—QÄ| ³4½’•ñ=ÌcóRäéÁ¼µ¿ê2/¥ªvimژ©l[æ'4¶¯ïÛB„ƒÀ! oV¶ 3U«räÞqyÉÍh]Vx ]©G[oo[W¢"_—;gëG]˜ç½íƱŠÑ|ÁÀÈ×uëlª2•·_YxŽ)U¤suˆR=ô¡p0IŸ˜ppil{ù%RÛ:)ò'Æš„ iUÇËe’Ï9v?‡i߅åz§-~(BR Ù PYÌ©p÷¹v]h 4¢}ó9ƒ$²vÈGl2‚$G2覭7I5Eê#Ìý¶“†àé<ÄÂw‹Ùlçt§)•±=NÀõ +ºHò¨È¶aÜ§ê;øɈ[¬:›'€¼§t¿$•Î3#܅€žšdù>¼cΘ‡¡NñÎ>–mYl¡ÚŒÐh¾÷›$Ú y–«D›hÁi1îê"-Ö ÿ¾³ýŠa˜º.Ã8‰4²Ä$TV,F˜üKÏš +”äëå¦éõùæ˶ªø Õv—587ê9q7am>¢07½îí¸,Œ•i)òIp`$Èp`°«CÇnÛ.\퀭.€jµK­•¥YË ÀÒ1´?K]‹­yMV´ñÖrh™ðlÑá ˆ’Nªp¥Ú2«ªÒA9ŒË†›rmUçÝiÒÚ ÷“ö£Ú‹ÂZÅgjÉùÔYß+e‡Žmp>4voÌÿ­¨U«#½xmMÁ mºu§±¨ü,ë¢Vq0Ù|ýÑ%ÌYpŠˆð{ÛÄcv/ðY³H´ 1úœÁri¥æênÔ»"AžÂ$¯Í´±ÀM›ù|qü­ÓŽ‡ùþÆø2,à€Ë ÓáhÂ[Þ/°™@÷‚€k"ãQ»ÜŸU+k]Ø6æ Ø<¦fˆ`:²o°v€¸×9Ð +hi£6¡L N¼kèC²cýÃJK|¾øÊ¥Ön·&¤€í‘G„Œ\ +™‡8&}©½ €ÎËKÂÛT´Iáä3 |ŽÐü„Ð,ÀW$t'º, -¡A4§uˋ¦Çb@h+lG­ž¢6l±qÚë Ï%¤C\â6‡@Hn¹ÍŸÊíÖ»)nKäÓ`làP úpïkg7š¸ügv“+‘›È¯ÝçAàpâ x¿=TÄ·üFü§‚Í…¼¾bWvâ£fOhôQÁïÞªZeçù-9òX§ÌQ5á9¤¼¨Ý˜"Éس^÷Ž²=75Ô&wʌ  8±ù +”÷¯ßÇSžBÎtð”æ]]%<|“ÀбdXjyu)»JÅà †.œÃ‘Ur§û³ªûqšêùý«eá‘i`pvgBntþ/¼Ó7zê_fžxJ¡í‚1¾—ôˆFðØkÉæLÑ÷Q,°—¬B"!øèÆì­>ë¢l?Ûªl>mi6PÁÊoçB¸¶¿†ù®9Eû.ÁŸõTÀÓîPˆA#ÕUÒÞ¸ŸÆ³¿öígsõy´—Äã9eS×ÛåÍÍ~¿GQ…vy²-QRßl·éÍ)†z³@ün’U{‰’m*’³æ {ÿ’«« +endstream +endobj +10060 0 obj << +/Type /Page +/Contents 10061 0 R +/Resources 10059 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10034 0 R +/Annots [ 10056 0 R 10057 0 R 10058 0 R ] +>> endobj +10056 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 520.623 138.508 531.503] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000009) >> +>> endobj +10057 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 500.534 314.566 531.503] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +10058 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10062 0 obj << +/D [10060 0 R /XYZ 90 757.935 null] +>> endobj +9677 0 obj << +/D [10060 0 R /XYZ 90 491.568 null] +>> endobj +10063 0 obj << +/D [10060 0 R /XYZ 90 476.997 null] +>> endobj +9678 0 obj << +/D [10060 0 R /XYZ 90 374.226 null] +>> endobj +10064 0 obj << +/D [10060 0 R /XYZ 90 359.656 null] +>> endobj +9679 0 obj << +/D [10060 0 R /XYZ 90 256.885 null] +>> endobj +10065 0 obj << +/D [10060 0 R /XYZ 90 242.315 null] +>> endobj +9680 0 obj << +/D [10060 0 R /XYZ 90 95.843 null] +>> endobj +10059 0 obj << +/Font << /F63 374 0 R /F65 376 0 R /F50 339 0 R /F95 1788 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10072 0 obj << +/Length 1520 +/Filter /FlateDecode +>> +stream +xÚÕXK“›F¾ëWpJDU4;ïÝ—í*'©r¼²/¶KÅJ¬–DÐ*ʯO3<ÄË<šÿ’ÜåQ~˜N»Ë> ÆYêO¨Àãë¨(Ìí»ø>®ÞÅé"½ŒK1æ˜ûŸgoF/g£?G,é, +)&¼Åfôñ3ö–°þÆȅ·¯¤6§ ®kïvôÛŸõŠ2„¥èx…bÒºö¨]˒%IòO§SãÖ'ŒiÏ÷Iù0_dé*ßiO‹J1ÂÃjQjÁØ X +kՋF|~{(ÊxcBö–½yŠŽC`4"’ƒ†êËŪ0BŽ×„!Ô"ðgbdîȀ qÎáF!I¹~_Ä6_‘¹,²­ÉÁÄõ뮣°¤ÖÇh ÃžÑŽACjÇÊÌèËm\Í´ë%ˆÕº‰ÙÀ¯9 +Ò(}HÿÌPØÈ ª ëŠ: +ì„RŽ(Sp#ä¡ùÄM´‰Ë8/¦Ž‚V‘›Æ)È®X0',O+A”JZ› %SFIZ<•]/­ÌqDÝ/‹NáÕi® +6‡ß”E󢟪"˜}ÛD0(©~à$âå_‹x[&`õÅI ƒ°íÄ¢\N§PÐ!Z'Ëy”¯v›8-Ïe&`vSݳ‡<ó©ï-&C1Ó $É5B&ǍP”.‡ÚO¢@© º¯Éa”ÛªX&à|$é"Ûl£2¹[ÇhsªÖJzðu„·ª·?nwiS—F‹ÆÖ~HASy° lƒ8k0ñ1ʟ ›L„P5…ÍÀ7Û]©{Žº§L¹h:ËW–×Þ½y+…OÄø°NÒežèf\Dºh³’ƒ G˜B”_¥z +H㲦.ãAÛxQZw2s-¶‘fn²¶,ÁÊMð^¨]0S(dM¹ýàCÑc˜’Uš¤«6Œµ5»ukL? µPå²ê—Ñ¥”¢ €z€o$—_ÄÄ%º³„@ZØ©Ü¤ÉéÞë£ÒÜí“õÚÜÝYÑNSÅË' W¢P›ú¿A^7ýòW§ †‰%¿4+Ñèt ‡»–`$þUh²—" é ,zXÌpx,fwæÜJi–‹ùml—‡&[Ž¡®D;ÿÍ'Õ¨<±ëNkßÅs§`bC‰¤ì)4·R'À\â'À\br!˜kUÃeÁÁ%c,}ª,àsÌõo0×Öj0¯ÝªŠ¸ôk몫-ký®)ëbÀ$Šz†„AVlÎX@ªºs’61Ç~¥ª™¸å„ª×ZNpÆ՚ìdۏkÓçßxw€)óU65Ðnt{<‰‹1&ûÔ—î€ÿÕ¹BƒV¼YȯDêä˜.®Ñ™0|*—NԉÑÚ¼3Í«ï²Ô.™”©óx¤>ø„î(܅¡JÓÝï…éTÂaÜíԅÙ\Ö;ÇÁ=½6‘Êíþ<Þdôö g «œö÷J>³`; !€ØÏ ¾mî2ʵ`}ˆ¼ŽtòîñÆ)>2BýXYXœ:Îa߯¾™l°¶°3ŽãÙ¿²¥= hfoNfCìÑïV;€kpùøआ¿M’&›ä易b þãsrÀä0ô À}Ó5¦9‘ŸO'¥HÑsÙ$±vCVO ÀÐ'ãl›­³ÕáEõÛ,7þµHk0OÓ4ÃG˜×;ßhby|8 8¦ù³éêL|ћ&Ø3i"!ø;¿Õƒ¤3ûX£™y´fÞqþ½/ÄØÖî¯Qº‹ÖíiÈ£V=Û4,F@ÄT£Žm…Û¸æãÙ^}÷ó¨JNk/ „«IÏCYn§77ûý- +´K“mŽ’òf»]ßôK°£RØæø^ç¦j¦,oP7Õð܋ÿ?¢Q6è +endstream +endobj +10071 0 obj << +/Type /Page +/Contents 10072 0 R +/Resources 10070 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10034 0 R +/Annots [ 10066 0 R 10067 0 R 10068 0 R 10069 0 R ] +>> endobj +10066 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.4 541.245 212.124 552.149] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +10067 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.573 370.25 216.297 381.154] +/Subtype /Link +/A << /S /GoTo /D (main_Cylindrification) >> +>> endobj +10068 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [448.024 268.989 483.212 299.958] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +10069 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10073 0 obj << +/D [10071 0 R /XYZ 90 757.935 null] +>> endobj +10074 0 obj << +/D [10071 0 R /XYZ 90 733.028 null] +>> endobj +9681 0 obj << +/D [10071 0 R /XYZ 90 592.061 null] +>> endobj +10075 0 obj << +/D [10071 0 R /XYZ 90 577.49 null] +>> endobj +9682 0 obj << +/D [10071 0 R /XYZ 90 433.021 null] +>> endobj +10076 0 obj << +/D [10071 0 R /XYZ 90 418.45 null] +>> endobj +9683 0 obj << +/D [10071 0 R /XYZ 90 248.915 null] +>> endobj +10077 0 obj << +/D [10071 0 R /XYZ 90 234.344 null] +>> endobj +1345 0 obj << +/D [10071 0 R /XYZ 90 118.771 null] +>> endobj +10070 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10086 0 obj << +/Length 1184 +/Filter /FlateDecode +>> +stream +xÚíXے£6}÷Wð”@Uuü¶IvSÙÜ6³ÎÓdËÅÙC<Žóõi°a<7We¦jžÀBju÷iÓ¶Ö¶~˜|;ŸL?Hf(TZó•`˓ J¬yd]ڄ N—`ŒíOÁvXlÂÅ'‡b;Kö×**ÂÅÏñUûÙ¬;ìßÎRÇ¥Ûß%aY6¯j¥êo*]*°Ë¸6ÇÂù2ÿ8y?Ÿü=!à¶Hí‰ðÇ„µÜL.¿`+‚ñF,ð­]=kcqÊà™XŸ'¿Oðɨ(CXŠNTˆ!ŽMhWY–€ƒ>cO‰r6‹ÓJ¥ZVq–. Øx 4Zlâ4ÞÄÿ*øæÂƁ0Nü‰^fiY5™¹+y_éµÓèŃщª 훽ˆ9ÈÛ °iæܙã H¯K<$av=÷]í¼A«Êše´gš#HÔÑ6ffÑÛ?ði;§ºŽË‘ý©Èq’j6íæ²ÉV#nxâC¼ ò@±C$ò=oïž‚ã„o· øqº6Ùl#,T¹M*T×|[´ü\Šbԇ¨[ßk _¨j Å!촜 W÷üõ‘GWaA›¥«0)Ոã ΁緞ǫÆC†&õi²7°¬F£0MÁ¨M^í8Ò§ƒbÄöþŸ¥Ê5æƒÐŽ6‚±ƒã*«HŸD‡cû&LâhëíF¥ÕÀ—^ü G‚6þùu‘9TØ;¨<ŸIôíÊaô ÷”óÓ¥G)òè©Ê#±#„…j<¯²59p2r\U2?Å»ifÖÛ°A@UtÈxý¼R=MRÑi‚&@‹ |ìÝ7†~ =øH2bx‰x‰ö:` ›w9‰À!±ŸBKýLûŽé‡ÓKŠˆôî#,vaI‰€ö^XÿûÚùêÝoŸÞºß7n}åݯwŽîW¼Úî—Ýê~¡O|F÷Å«Î=Ò¡ÖF;}p³Gkû¥†1èeù³¥†aÏhx”Öð³ßrhˆOVP­Ad͐èú²®_wk“çèEÞÌü½4¥ ggë¥åߟïùCù~x7-}ȤÿЫéúJ‘PŒÌ7WÒþ% ÞB¡Úk`hp4'šŸ-)6? 36?þ(Uñµ#„m +÷—0݆¦kÔ,x£M©¢<0<†ƒ‰¨f(sŽJÒDö—Õ¾ýÔ4UG‰ïAºØ\WU>›Nw»Z–h›ÆyâjšçÉôvýu¬~G€W›ú$eÅáò7µ*ÝÊÿÏõ/n +endstream +endobj +10085 0 obj << +/Type /Page +/Contents 10086 0 R +/Resources 10084 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10034 0 R +/Annots [ 10078 0 R 10079 0 R 10080 0 R 10081 0 R 10082 0 R 10083 0 R ] +>> endobj +10078 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 571.245 138.508 582.124] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000010) >> +>> endobj +10079 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 551.155 314.566 582.124] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +10080 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [88.007 239.645 138.508 250.524] +/Subtype /Link +/A << /S /GoTo /D (deprecated__deprecated000011) >> +>> endobj +10081 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 219.555 314.566 250.524] +/Subtype /Link +/A << /S /GoTo /D (main_A_Note_on_the_Implementation_of_the_Operators) >> +>> endobj +10082 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.334 150.842 242.487 161.746] +/Subtype /Link +/A << /S /GoTo /D (main_Convex_Polyhedral_Difference) >> +>> endobj +10083 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10087 0 obj << +/D [10085 0 R /XYZ 90 757.935 null] +>> endobj +10088 0 obj << +/D [10085 0 R /XYZ 90 733.028 null] +>> endobj +9684 0 obj << +/D [10085 0 R /XYZ 90 544.752 null] +>> endobj +10089 0 obj << +/D [10085 0 R /XYZ 90 530.643 null] +>> endobj +1346 0 obj << +/D [10085 0 R /XYZ 90 421.042 null] +>> endobj +10090 0 obj << +/D [10085 0 R /XYZ 90 406.933 null] +>> endobj +9745 0 obj << +/D [10085 0 R /XYZ 90 213.151 null] +>> endobj +10091 0 obj << +/D [10085 0 R /XYZ 90 199.042 null] +>> endobj +9746 0 obj << +/D [10085 0 R /XYZ 90 89.441 null] +>> endobj +10084 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10099 0 obj << +/Length 2039 +/Filter /FlateDecode +>> +stream +xÚíZ[“£Æ~ׯà)AUQOßäòƒãÚuÅvª6»c¿¬]*FjÍP‘@4³ã_ŸÓV;«Jü0OМûùÎ׎î#ý0ùûíäæ­dQŠRIet»ŽR)I $º]EcB§ÓÁÇï¦ÇYµÍï¦ÇåæùA¯ªlñs~WeÕó|Þ?=%I\Ó8þ~“Õµûû^¯µ½¦‹¥¹ŒKs,§¿ßþ8ys;ùτ€e8"Ö¡b"Zn'ÇÑ +ÎÿaÄÒ$z²«¶§ ~7чɿ&ø¬W”!,EÏ+ÄçÞµ»²ÜLgiš¾ÄÉù¼Î·»M¾~^ì뼸_,ˢџšxß^ÅoX`¸P7ÆU°sF¤Ât*r1‹oÞ¦¢çŒ¤ˆHìÏnEà.G.,vè%nÀ½53)‘HÁ +…$ånéwÖ^“)¢â¦twÑ@2ƒÕi'3¯^êӄ´kš‡¼QO%Š·‹2›~—÷êÞÀû&ÑGkÊVëf¶«t­«Gˆ¯³ÏÅL Ë¬É!`N„+c¹ñpŒR"/p‚^âÄ!ÐOyóàLKwzلq ¤K 9L9 d ”ªC’ˆ‚ÚüÇzDáˆv¢ÖÙ¦Ö#âEPíª¼n möU¡WƒCÊÁMmÃ͘H Š.»ªÌ¡¼«<ÌÛ:Í}{ëí®yžBK£ ƒúœARÍ %,ð7Ÿ–zgÖóàÖNDÐ$A +›òM;ûêf5ŸçŔãø1Ûä«EVÝï·ºh¶I!Ї<ß>T唊ø ÜJ˜Œó±úa®®ÐÊ»(V#r(EŠž«H?#MY¥åM¹+7åýó,/–åvr·±— )*·d•CljˆøÌåœb€D,œ÷oG#P3c)’ŒØ_Ó0!¼ +}TË|Š1ÄfkÓê…^äÛì^;AR¦„å™ñï,ÀÇöx̪'C4i—@/$q‡Õ3¦R$’4ŒÌÏy¡³jñæÓÎͳº¶ÝÀ¡|ÆP;Uˆãƒmî1$^&=KR–ÄߗÚú¾Ì¡”M•åM=Ÿ[óNu¤k&00uÁJå6/²¦³@H”tÿíHEÂ?r(ZcÛ:w–ù2b\ š £,´IV7‹¥4EI’|n`ùUnb‰ÁÄbãK!Úß×L,êE·HŸžYƘlm€ÄÕ¬3Ïî`J™ £S*aˆqu»÷Å +ŠÅ…ëÁ¶ÞÊÍÑ6Ûíì5Æ‰ »ÂÙX(¹8ê®Ð¨|ÀKHR¨=”o7Šä Ûô”ˆø“áõaè˜!k €^¹wÏcõ* éqã '9Çä<h %O¶Q O +¤ïÆ÷¹aH1XÈR?„Ðbd¶ÕfÔ~ÙHL`Ô³ #§†ŸÅ›Þôóó=Ⱥ=c²f~Ÿòåƒ?Õ®+ݲ€‘dµ Áqb½úf`WàÊÌ6#€%˜†©;å „rväL ²i²‡Ðl_fþyC½Rg(-SöÂæFtø`oÿî—Yìμ--£Ê6þ>;%<%rét”Õj]ۊÛoš~ lö^1¨|¾Ž•„)Êþ䬎ÉÇh4L-&.íî)NûdڈýCƒøG,Ã:© “0ò9<ÐNÓ#<¢²ÀÔµ&DO™¡Æú!?dÀEYr†úrõe;꼂Úè¶U'æöȃ­ŠiãÒfւ¶l;¦5ôÐ/#Á"Ʉ]cÓǀÈ~èी‘3Ήå'\|%'öÔSc#ïj cVu.¤Æv}jœH»z¥Æ^jLNQc¤¼5î¶Xç™19bÆp×89&'Èqj¢¼¶å-7&-;%7&}nL.àƀ8ê³Ô˜tÜÔRã¾ò1jÌ¡É+7~7&žÓË©1ùŸRãzW7y³o.bÇ$$±cúÿ`Çôå옽²ã‘"¾9&é+;~eÇ!;æ׈ÖW²cuϙR/cÇ÷ºhÛähh‹ÁÓc¦’!Ež’xŒ"r¬¥_öÙ‡L `¯ï 5s̶ƒÌúiæ~©uõש±Õ?³bßRUVFlQÃȦ#¢€ó8þ Û.sžý;jÿý4±1ì5@¢ÃdhšÝüææéé -k´/ò]…òæf·ÛÜóʞÂ{/«×-ÕٖÕá»8¹µ™>Šÿã7,Š +endstream +endobj +10098 0 obj << +/Type /Page +/Contents 10099 0 R +/Resources 10097 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10105 0 R +/Annots [ 10092 0 R 10093 0 R 10094 0 R 10095 0 R 10096 0 R ] +>> endobj +10092 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.275 690.333 293.971 701.237] +/Subtype /Link +/A << /S /GoTo /D (main_Meet_Preserving_Simplification) >> +>> endobj +10093 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.269 541.145 238.02 552.049] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >> +>> endobj +10094 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [182.089 319.694 246.767 330.598] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Affine_Functions) >> +>> endobj +10095 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [325.899 96.965 431.977 109.883] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +10096 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10100 0 obj << +/D [10098 0 R /XYZ 90 757.935 null] +>> endobj +10101 0 obj << +/D [10098 0 R /XYZ 90 733.028 null] +>> endobj +9747 0 obj << +/D [10098 0 R /XYZ 90 615.539 null] +>> endobj +10102 0 obj << +/D [10098 0 R /XYZ 90 601.301 null] +>> endobj +9748 0 obj << +/D [10098 0 R /XYZ 90 394.088 null] +>> endobj +10103 0 obj << +/D [10098 0 R /XYZ 90 379.85 null] +>> endobj +9749 0 obj << +/D [10098 0 R /XYZ 90 172.637 null] +>> endobj +10104 0 obj << +/D [10098 0 R /XYZ 90 158.399 null] +>> endobj +10097 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R /F8 504 0 R /F13 540 0 R /F11 418 0 R /F7 505 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10115 0 obj << +/Length 1863 +/Filter /FlateDecode +>> +stream +xÚíZIoÛF¾ëWðÔJ@5ž}QÑC$ÒH·—´‰²ˆJ”JÑvÜ_ß7 )EÉv,AëÇäðmó–“«'¯?\.^I–d$•Éå"18Q’ AIr9O> AœŽÆc<|7"x˜–ëtúnDñp³º[fó2¾Í?–iy7™´oˆnŠÑ˜ +<|±Jw;¿ü%[dîYVÌ2Ë¸CŽÕèË7ƒ——ƒ¿,à q–…Él=øðNæpÿM‚3:¹u»Ö § ®«äýàç^á£Þiƒ0扢ɽ‡Á«tUY¹›8Cº’.^ÑC4RØ$c¸bA½˜›´Œ^½x%pü +•ž¸Í—Ë̇c•-*¿Z¦Åܯvù<<½Q¦åéÇU¸³YøkU ¸ÊŠ¬LWùßYx;]ؗ~ǘaK™­Ò*ßßvì‹\ÇD É´7ÞÜÝ­O¹Å("NÕ +ƒ;w돛ÕiåNL¤:û´=OÊåì@uq½†pT›òH¸Êüjy"à‡ÁËFD Á–l·»7„Á&ï‡ò–ͳb³Î gÒ w хâ‘;ĨèmwÃ:d¯U½#8d—Þ!»òÙU쐽;äïýŽÞl푥«ðž«Ñ+ˆf¤ßæÕ²6jáJæzUY—àôÀ_!Áo‚ \}9¸Ô]]‡0PAP'QiŽ9F’*ˆ"G‚/åå§Yæìzd]Â-!¼ˆ]5ŸLòbÄ¡œ NæÓ´ n8#ik¹±ÞÜB´8´Á|a_óÛª¹@ |ǽ§Þ‘. R¼Ÿï¼Ø¿3P+2´‡}T‘àˆ°¦æê2éV‡Bژz“Í ·‡²8XL‰z¤ës Ý(«–`ë½ÊÊÌ[?Ï!Ê6ÇÆ!K(EL‹&átòb¶Yo¡[¸Ç uÎÛk¯óJ#B›(‡–Û5‡ ]¤]+®ØT~‘úËn›Î‚ÆÆÐ`À¢/XRDÑ3E‹4.t½”BÀˆ‘ÐI¢StC’† +°Ã¶¼ +S÷—׃äƒ{übú.ŒrˆL»Và(±„úñQ6Y™G$ÒJÕª÷¥;Gt»|òÒП«2ŸUÇg +z£vb8Ò0âǜÀ\-0ƒâ: šÛÈ69´MÉùçà›É¤5€§éÂwÚéÖCœ|^eV¶p-ö·‘zçÎä¨{á8žMvG~˜1Mr3 JSù˜Lß»pôˆÖ 1Ö{ +‘pÈBºÒgÐ}]ðÍðm^di9}ù)øFˆ}ôUV(U$0;ìU’u‘é(}±É\,g9têiU¦yµ›Lœ)S¯» #U©Ôˆ‡ô -G†°n¬ý®'™¡ûȦÑY¹7pSdö€íëó$‰Ùr½+*1 R¨‹ƒLÂ`ò÷ã«êA:¬6=]‚²>GgpLØ~Sæ•Tylÿê펊"-ØÙMðÃj´²Íl Q€+sí`vc„í yÁ¡Ä`@·mÂÀ8ö z3rX—&Ø +PYÐêJSh08ë‚pØE¢d@ЕZ›ÐˆH5¼ð[UKtaÅ à.Ž¹I!®5æ4_͚7”ÉQ¤¶ÒFERš‡ Yk½æL4%l{óí2+³ž0˜ÏM4#çc„‘2¬;ªS# v€óš }¼ë›IL"¹¬Ç‡’€"÷¦žB¯ÀeÒ.(óPKö¤–ê™Z>•Zêÿ)µÏÔò™Z>SËgjù%SKs@-)–äŒÜ2€qJ]wõüÌÖA‡@ek¸—­† i¹Zîú˜ ¤æm®†ñÃè'Þ³ÖGÐOÞÐOüX‡,ýÄûz(û=‚Áz/3c@ …`G˜zßÏÌ ŸjuŽ"“Â13³JëL€eogpZܜ£±Dúý¸¶ZZB௧h岃+á4r‚ï¥eD¤ö͸Éט’YPNÁG.NP28\ȉqkWDK"­áý'€&¥b<΀/ªV[§O°!Eùýtš Ò¢;3îK§ED)ÚA/mؓh‰ÿáNü(+‚f"Å#YÑÓ@zPùø¡á=ÆyÓÁî‹W›fÝ$`fª‡e=ÊœN È2Ûq¢Œø 0N΄ʼnéãÐ5ú yLèyz*¥*‚%¬Ç1|¥Œù¾ÛS¶Ô~–d0ֆ?š4ì‘$iäʇ‰9(b?åéó ?JÛøÍC~%]ãŒqâ‰Ác†pvúçý0À‹æò_€™9ݟAH iªú+÷ILk}ÓÉ0Іy§ÌßÙªµ˜4üYƒÒm9dêÿøu—•_„¿~J‹ë4L Bo¬(hæ_A>QOÍÇ úýû¬†Þ³?“zõãÀE¼5µµB 7y±¬ªíäââööÍvèºÈ·%Ê«‹ívuqXÜ-)00÷´jQ·YoÊà~^À͵;‹ƒøÿ–a¿¤ +endstream +endobj +10114 0 obj << +/Type /Page +/Contents 10115 0 R +/Resources 10113 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10105 0 R +/Annots [ 10106 0 R 10107 0 R 10108 0 R 10109 0 R 10110 0 R 10112 0 R ] +>> endobj +10106 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [454.44 589.661 513.996 600.565] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +10107 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [365.617 494.906 476.603 506.545] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +10108 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [454.44 323.43 513.996 334.333] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +10109 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [323.631 240.63 429.297 253.109] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +10110 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.549 97.651 195.105 108.555] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +10112 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10116 0 obj << +/D [10114 0 R /XYZ 90 757.935 null] +>> endobj +9750 0 obj << +/D [10114 0 R /XYZ 90 569.496 null] +>> endobj +10117 0 obj << +/D [10114 0 R /XYZ 90 555.061 null] +>> endobj +9751 0 obj << +/D [10114 0 R /XYZ 90 303.264 null] +>> endobj +10118 0 obj << +/D [10114 0 R /XYZ 90 288.83 null] +>> endobj +9752 0 obj << +/D [10114 0 R /XYZ 90 89.441 null] +>> endobj +10113 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R /F8 504 0 R /F13 540 0 R /F11 418 0 R /F7 505 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10125 0 obj << +/Length 2113 +/Filter /FlateDecode +>> +stream +xÚíZIoãF¾ëWð4#­ríUÔ`IÐ “´g.@ -Ê&F"5eÇùõyµp).²»å&@ŸL‘Å·¿WßW4Žî"}?ûözvõN²(F±¤2ºÞF1Ž”$HP]o¢sB§‹%ÁÏß/ž'å>Y¿_P­VÝÛ ¢çE¾XRçßí’ãÑ]þ’nSû,ÍoSË¸sŽõâ·ëfo¯gÿ›° GÄZ"RLD·ûÙÇßp´û?D±XGvÕ>â”Áß]ôaöó ŸõŠ2„¥èx…Ø»ö`\+²µHŽ§«Õ]š§e²ËþH7ëdû+Æ4O×çl¶OñüW,ðm‘+ã3¼kbá-û1ËÓ¤\¿ýÝ¿xòº)°_E:¢ ¹’FËÎ*´ RͯÜÚ@+AX **T“ªSŔ‰ùã}Z¦#ª— ÚNÃuйúP8F*nœÎü$t5MÜ쯣ëG{ 3²Ø؀ϛ§‘B L"˱. L`iÙ,C½͵„a˜ hE^²¯ø‰˜ìÓ*-«@@+(le1â†6ì&¼óF(˜%àž·òºÐ.ÝúarŸä>ÇlãŸö +фmAÄ捛5ÿèi l\z•K"‚¶ëEqÊPFŽã¡c™<¯Þ rêeP¡“A҈*2ԝÝÝ_¥ó%Uf&^Po¿MÆÛO«¸#¼„cµY­²|Áaÿ…Ñ»fywÚ§yuÎýXÀŽ× }YÇs7•²±‰ +[=&¯6ÓUÐÈ s“Í&†Ë úu€¸ÙٙÈÜØi[ª!Ã9jÈòÆÓ¢“ƒ‘$âühˆ™$·{ù…{•@¤³dJ";q06“3ûŽŽë÷fõ6ÿܔúÐFÀ.š¿`*jt²?˜ß;U™ÝVӍF€É’vÖ @ ­Um’ÚT€~? lÞ§|ÓšV()-ÀüÏ"†=ºÌSŠC˜Å±‚ 5Uñ”0«í‰7.‰êÉlÝÖp“I¸‡é8܃ù‹[¼µ»Y§æÍ¡- £8î‚XNi«—Në%0“Áž\‹;M«…emŸzµß©úm³j]•IVW+kÌzéK $Y†ÉYÖå?#‰1ë›xlÒ¼ØgyRcÆÀź1îŸc}€Zr`¬ÞfÎæ"OM‘´Ð9Ì;&0VžØK@AÜlÑØZNl -ºl+!Bˆ Jk|­Å8¾õÄ+ìŽ~°Á€`ƒ `›PœØ°Ð7´[ÝÛ­áñ¸V]ܬ -’8sQ÷Scw»c;ôÖnAWC\7Ïë¾¹9 Ë8â2öGÎt†¤eŸŽ£[nÞÕ֊b@SÅD݇cHØÉDEÊGq?QM[ŽÍZƒC0œú€`t¶¹I†ajhH…rÀǥ͈ý .´rçÐpêŸÛ¡’åw¯Á”¼EU9½ÀÈÿtGN‡ÃqÂYd£WçSŽ…„â#Œš·ß¹Ý'á$ÚEÛú¢ª_ë$ʼa›¹ïý6—­ßvEà·yú}lÍ)5 +vÔ;âSf*6ñç ‰E"žsÙ;~Ƈ­mÏÓ®ê6Ìîä£NŒ»Ïô<° K—²FÛïq £>›6Ò1ÖÈ!ˆ5 +!€ ™DbtØuÜåFê)h±W&û“zGj‡óÖ´_“aƒ3Л‰4¶3v ܆"«pÀ Îé†g11s3J1é€bÒ¿Å ¿e¹¯Ê4Lj&Ž¿2Í¿ +Ӕñ¦šlŠjb=ù-‡·Tç’Q÷㤀ÒÎ×O|́´¶8î’É`LÐ=¶ 6´lL°lÓDã,ۄ…-ۄÕ=H_Â6•²±¯Á6ÕslTÁj +%.ð…lӋ‚®êelJ âólӜ‹É×b›þóÖÿ!Û$±BJ¿Û$ðW‹¯ló+Û|†mª¯ló¯Æ6Åg›ý’ö#ýÒÿ²3)˜ BÄHÞ«÷ÆqƒýÏ<×ÿÞb´ûñïcZþ}!ÄÜӊŸ’üT{oBõ`DÁðiØF°kP盍û‡´Þ¸gÿê«Í,hè÷*Äp3jî«ê°ººz||D·GtʳC‰²êêpØ] ë¬#…téç¶î}QÓ±,‡›{;zñÿLá‚- +endstream +endobj +10124 0 obj << +/Type /Page +/Contents 10125 0 R +/Resources 10123 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10105 0 R +/Annots [ 10111 0 R 10119 0 R 10120 0 R 10121 0 R 10122 0 R ] +>> endobj +10111 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [334.883 690.333 440.282 702.812] +/Subtype /Link +/A << /S /GoTo /D (main_Generalized_Affine_Relations) >> +>> endobj +10119 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.549 546.589 195.105 557.493] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1C__Polyhedron) >> +>> endobj +10120 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.059 462.189 422.924 476.904] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +10121 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.333 204.579 425.662 219.294] +/Subtype /Link +/A << /S /GoTo /D (main_Single_Update_Bounded_Affine_Relations) >> +>> endobj +10122 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10126 0 obj << +/D [10124 0 R /XYZ 90 757.935 null] +>> endobj +10127 0 obj << +/D [10124 0 R /XYZ 90 733.028 null] +>> endobj +9753 0 obj << +/D [10124 0 R /XYZ 90 538.106 null] +>> endobj +10128 0 obj << +/D [10124 0 R /XYZ 90 523.623 null] +>> endobj +9754 0 obj << +/D [10124 0 R /XYZ 90 280.496 null] +>> endobj +10129 0 obj << +/D [10124 0 R /XYZ 90 266.013 null] +>> endobj +10123 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R /F8 504 0 R /F13 540 0 R /F11 418 0 R /F7 505 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10141 0 obj << +/Length 1657 +/Filter /FlateDecode +>> +stream +xÚíY[ÓF~ϯðS›Hd2Wۓª€€Š¶…íKEÞdvc_°'›M}Ïx|½»@ â%¶ÇÇgÎõ;Ÿcì\;Øy1yr1Yö Õg^©F¤]£²O°è6lûñap’Èe6y=lâ'ØÄ=úyØôä·×ÿ`¶:„0–¡»j|2 +[øÄ=Vã“õ«‡@}ê4Zܘîö¢~‚YuæÍæœÜÇÆ"54I¹tHž–LgWñ&Õ:؆åu®(—Î>x@E§MÇÀ–PI)K¸ÿ'¸µe4¯ÊèÓ —pI——˜+òa©ƒ¹e#‘Ò*ûDÜõ´eÚ(¾‚£¢²ñ±ÍRZövՃzhë4@«!L$kÿ¢}®‡" XÓñKU•E¬ƒÐ4£eCÙt y¤ç(WCá*™_zÁèDÆt(sárÇÛ­>?€ÕMõØD̼^£2ؙ+ñ cÈ ½­Y,¥h KÅêoA–aÃýÞolÿÀmÛk°ï£K«‘Û^3o W­‚p×(ÐÉSGªÀ7hl6°¶Ï­0Z·¶µÀEâ÷†M¦»ãÃ{¹nâòJo+pª hï ­c)¨ÖÛ8ü¸Wïî|Ÿz¶}Ä7ú^ûƒ±|9c'ŒÅçŸÉXvajµY•ÌEÝê,S2} (í—-§cù ñ‰i"ûPÞÒÚì©9Í8õêÍ1×*ߋÀkÓ:ØÍGTÊo“%y÷‘$ï>’Ä°DBº#$ †ÞIòóØ9(p´†¤Àm6­H’97ÀmŽ-’TØu°²r­´šj·k·ªFèÎTé³û;B™|¨or'ø`„IóOYþ Ì™/ºÖéÓ0É$UYñ÷¡÷Ð3 |ÛýAξ%rFÚÀ6Êμò4³¸t0oagó¢RAkù +UR"û2e¥0Ì¡Ûn̏jXPÃvªGš$ÝãRa߶ù³ÍsüAöUè¦ðØ0݄9î7°r®Þúîa¾6É;ហWÞóžMa$44e=dˆñ 3)(«ñ~„² +”ÕˆœPV@Äõu.úì\"â?ô{]ñ}qÏ0¿üú(€¶ÞC¬Wq Á-/+†k/Kšk/þÎUö³™h%ŽýÄûàÜ4£¯¬ù€#³E?gÐ*oTÕjÖ³Nuöû¤ÈMc/ñ.áºN¶Z§ËÅâp8 uŽöq˜f(Ô häÅi ·´ö·«ê›R”T_ Â£‚ÝœÄÿ?¬o÷ +endstream +endobj +10140 0 obj << +/Type /Page +/Contents 10141 0 R +/Resources 10139 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10105 0 R +/Annots [ 10130 0 R 10131 0 R 10132 0 R 10133 0 R 10134 0 R 10135 0 R 10138 0 R ] +>> endobj +10130 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.526 619.364 322.446 630.267] +/Subtype /Link +/A << /S /GoTo /D (main_Time_Elapse_Operator) >> +>> endobj +10131 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.526 490.067 353.45 500.971] +/Subtype /Link +/A << /S /GoTo /D (main_BHRZ03_widening) >> +>> endobj +10132 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.659 418.47 268.34 429.374] +/Subtype /Link +/A << /S /GoTo /D (main_Widening_with_Tokens) >> +>> endobj +10133 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [286.885 289.174 373.57 300.078] +/Subtype /Link +/A << /S /GoTo /D (main_limited_extrapolation) >> +>> endobj +10134 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 277.219 167.927 288.123] +/Subtype /Link +/A << /S /GoTo /D (main_BHRZ03_widening) >> +>> endobj +10135 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.659 189.682 268.34 200.586] +/Subtype /Link +/A << /S /GoTo /D (main_Widening_with_Tokens) >> +>> endobj +10138 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10142 0 obj << +/D [10140 0 R /XYZ 90 757.935 null] +>> endobj +9805 0 obj << +/D [10140 0 R /XYZ 90 682.134 null] +>> endobj +10143 0 obj << +/D [10140 0 R /XYZ 90 667.564 null] +>> endobj +9806 0 obj << +/D [10140 0 R /XYZ 90 552.838 null] +>> endobj +10144 0 obj << +/D [10140 0 R /XYZ 90 538.267 null] +>> endobj +9807 0 obj << +/D [10140 0 R /XYZ 90 351.945 null] +>> endobj +10145 0 obj << +/D [10140 0 R /XYZ 90 337.374 null] +>> endobj +9808 0 obj << +/D [10140 0 R /XYZ 90 123.156 null] +>> endobj +10139 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F50 339 0 R /F65 376 0 R /F23 340 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10157 0 obj << +/Length 1552 +/Filter /FlateDecode +>> +stream +xÚíYIÛ6¾ûWèÔÚ@Ìá"Š¢‹’ ’H“饓ÀÐXœ±Kr$9Žÿ}EjyiâôõeÆ¢ßú½Ïvîì¼=»]½ô˜#‘ô¨ç\ß9;Â#ˆSâ\‡Î͘äÒɔ`ŒÇï&ƒ,æï&ÓÕn©Â,˜ÿÝfA¶›ÍÚËâÓd2¥Ÿ¯‚<7ß«;U~§’…½ÌõøØ%xòéúÍèÅõèˈ€eØ!¥%\ Á¸³ˆG7Ÿ°Âú#&}g[JŎKü_9FŒðA¯(CØã-¯Cܳ®}Õ®¥QF2)¾ÇÓÙì6Ý$¡ +çÏ^¿ÿ ³¹úVdÁ:]E”&ó©v¬›Âђ[3 *ѽÑGÌñ"MòÂ<î åOZÏÕKÉ[Þâ#º ½Ôº3"¸Èªx2™rð¹uÚsý1 ¢¤˜Ø兊F=ÈI}Ø"8ÍGTÊÞi›DûªB#N;ÆùˆxµüGŒÙÀ¹¹‚V2ÅzàT‚uI%ò«•à»ZçàIá7†pbd8nÉL=XB*EöRøi™J(ræ¹ã"ò҃rc½ìXè"é×.Ë(0€ +Äݖ2‡f*߬ +ý™Ó;³¶Hãõ¦ˆ’{kÈê>3 –ÝÛN{ÿjäܔûl i5!|Ü.b»×4YµC[¥’)8Ì?ÁazŠÃ•L„j 0½è(‘ÈÃuj7ù)1™2ŸÃ.ÑmZÓÞÓmªDkéE÷MºVYP¤Ù„ó1êôêmŠ‘”ž›PMz‚X*ËgÝÙs^”õAà´‚Ö†^,\\'æ©éõµ› +hŠeP˜0BÛµÚP'¬Žc¼É‹¡„¼úu£Ý*£ð¦ˆÑ奣¡¢ñb=GÍ0$ëù¥ŒNô¦DB?3ȁöwÛ°¶/~„!ZÇàziýË[È©ÐúlÕοM^ù a⯳T·ÚWýGUÑ·Ê2«¶49:âQi_Û˜{ý¡é54=Õ¦¤kÝôÁJ?¹p68£»üª´+Zƒ{¹úuB9”pÜ®”ù>‡f(;Nm|ƒÕdߍ® ¬zîѪQP¤Ÿu_(°Z\OKc7õk6´°²]D‰Ï{3w½^íŒ-6Î{±Ž-¾Še•½Ú Õ*ØYAµX&їÒãä0¸æ‰è Á‹o U¦á"l΋p6ƒfs!®Á* +çAv¿‰URD(ÚT8(dd Ù悍£»á!îc~îÎ}2 D"Œå!¨‡t{ŠáA1 GY ¢Ç{C‚Lï‹Ú0½ßM£DW˜Œe•rEœ‘0‚øæ5Ãú &10ÞioG\dÊ`d1eAá¢G\ÅCâʽïã­¯…œWe>o(©×¥¤Þ%ഃœ#áËcüÔýÏ2Fè&êRKy0ÚY0ठ(ÎÎÑQÌû.aԇV„±;¯jÂx<¶kgÐC,åä|¸ãÞ~è!_ä‡:‘µÀaœ.¸Ò5ü¿ð¶GÃÛ.<çÂsÎÂs|æ óî"ìŠ3À£0Žü¬¥P°ô Õq#¤ÃQ´å{8ŠÏDÉQ´ÈŽ‚W`~NŽâ?ä(¾ô¿¤¬¢8*T8ק{³fËù+5 „­‰ë©ŒåGnÔØ¿õFM£Gâè…–ˆëk=üˆìåGì\ü¸=zDZôˆZzDºôˆCU2¶Uk”½OÓ;&F€ò³;¼Ÿ0ü‘åU ½û´bB5e´Ã€5îu›öì÷j‚ö8¹Ü¬]ç#`œ\®Öþ?Wku.úo˜="âŸú‚¹|± ŽxÀj˜o_,s /Üí!Ö;8šãÚNJäšGËtÍß¹Ê~ÖÍâØïA²)¡Á¾6à•iŸÍ"8 ¼Ìý”A«|PU«Ï>;Õ§·£27½ÄÀòë:YÅzvuµÝnÑ"G›$Zg(*® ‘¯–pK üìh¨ãÎ6,N3U XŒK’ó þô>’ +endstream +endobj +10156 0 obj << +/Type /Page +/Contents 10157 0 R +/Resources 10155 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10105 0 R +/Annots [ 10136 0 R 10137 0 R 10146 0 R 10147 0 R 10148 0 R 10149 0 R 10150 0 R 10162 0 R 10151 0 R 10154 0 R ] +>> endobj +10136 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [283.644 690.333 376.001 701.237] +/Subtype /Link +/A << /S /GoTo /D (main_bounded_extrapolation) >> +>> endobj +10137 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 678.378 167.927 689.281] +/Subtype /Link +/A << /S /GoTo /D (main_BHRZ03_widening) >> +>> endobj +10146 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.659 590.841 268.34 601.744] +/Subtype /Link +/A << /S /GoTo /D (main_Widening_with_Tokens) >> +>> endobj +10147 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.526 461.544 335.736 472.448] +/Subtype /Link +/A << /S /GoTo /D (main_H79_widening) >> +>> endobj +10148 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.659 389.947 268.34 400.851] +/Subtype /Link +/A << /S /GoTo /D (main_Widening_with_Tokens) >> +>> endobj +10149 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.631 260.651 359.783 271.555] +/Subtype /Link +/A << /S /GoTo /D (main_limited_extrapolation) >> +>> endobj +10150 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [491.531 260.651 513.996 271.555] +/Subtype /Link +/A << /S /GoTo /D (main_H79_widening) >> +>> endobj +10162 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 248.696 128.077 259.6] +/Subtype /Link +/A << /S /GoTo /D (main_H79_widening) >> +>> endobj +10151 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.659 161.159 268.34 172.063] +/Subtype /Link +/A << /S /GoTo /D (main_Widening_with_Tokens) >> +>> endobj +10154 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10158 0 obj << +/D [10156 0 R /XYZ 90 757.935 null] +>> endobj +10159 0 obj << +/D [10156 0 R /XYZ 90 733.028 null] +>> endobj +9809 0 obj << +/D [10156 0 R /XYZ 90 524.315 null] +>> endobj +10160 0 obj << +/D [10156 0 R /XYZ 90 509.744 null] +>> endobj +9810 0 obj << +/D [10156 0 R /XYZ 90 323.422 null] +>> endobj +10161 0 obj << +/D [10156 0 R /XYZ 90 308.851 null] +>> endobj +9811 0 obj << +/D [10156 0 R /XYZ 90 94.633 null] +>> endobj +10155 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F23 340 0 R /F65 376 0 R /F50 339 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10169 0 obj << +/Length 2062 +/Filter /FlateDecode +>> +stream +xÚíYK“£F¾ëWpZ£ˆ¡ºÞ€>Ì:<ÞðîFŒgzOc‡‚Õk d@£‘ýf=€ÑÏt¬}ðEE’•™•ùåWÛß/þ~»¸y#Y¢TRÜÞ)bI $¸Íƒ!!ˆÓeD0ÆáÛ%ÁaV²õÛ%Åaµ¿ìT^gëwuV_V+zI’°*—8üvŸ5¾S÷ÊüŒƒæ0biœÔ!à”Áu¼_ü¸ÀzEÂRx^!†Dê\û¨]«ŠŒ$1ÿOW«»êTæ*_ÿ#N×êS[gÇjŸµEU®Áûb[jÁ¾O…3ä',ð¦*›ÖFç¡þM¿{ó&#Ÿ!:XFÑÅJŒ¼æà$ï^-#Žz‹}«‡uV”íúý¥iÕáᵕ°¬ÓµifVKMÓÉj§R;®r+NGÆ%ˆÈ^þ'ŒÙ̺1â1ídÚã̪#Êû(|ã$ÄÈ.wÏñŒÒ8ìÄÊìÉD §,6/F‚j„_›m…Äf’‡m5ç¤DB²k'Gr”&½í®hf  1ÜRvÑZ5§}«Ç"¬îíܦ:OmQn] «kËU½uÕõîûEðÁ¼çÒÖJ«%¡Ÿ»î][Xݪ=+UÎøKÁa‹g8LŸãp'“•ùŒ’ m”ن߉éàpÓ櫇¸fû"_gõötPeû(B@êÐ!Ã!AaGΰÛ"faq?ßÀ,^ºr_Í(IÆéc8Û-ó݂b„~²™3D÷ö’dµ²Þ·”aµ½DE©{+´E“¥x" ¾É ˆo»™,„œr&'MÄÍ‘ˆA¿b҂""â1S•øš©2N>©fy¾nŽÙF­{Û5„m­ >ó‡xj/»n/G5ÇÖUÙ·ŠÎ ò×J0,vTË­ÿ:ϛ¹M +Oédő¶qÙ#w©LV;ôÖ°Ã! +ö^g˜x4„®öù|-ʉäh=‹ö͆õÇF¡|[àé‹Ò…ÃóÛCßïzøöúÝ4t]“ƒ{Â7HlNÁ7f0ðEÁo¯Êm»[«º†`?âg,¸¿zTJzæ +®8Ú7É>ÈwÎÙãÙ§}»Ê>PÚe G!”ZBWøÉd<ÞdÐçìÐ& F¹4Öf6@ +Çä7ÊÕ³>i’¤ã²î—~ 'Nќ÷È>MQDÃDWÖ'—€¢ía9ĄÅ"Mü“ØÏ0PfLJÛÿ/þ²¯hä÷²bú,VüŒà>Ÿ {äÿ32ùR~,¿Œó§ø±ü‹?ɏ{Ùé?dp›$ÏýƒÌü1‹ ½Tˆ Á'IýVGG£«»íàÕÞ:Œµ7ÿiTý•þðíüßYyÊ+ÑþÚ½¨MÍ$FúOûu ²‡ïU÷MÎzöKЍþi#<ØK’¨Q_„»¶=®nnÎç3Ú4èTÇíÍñ¸¿¹±§…p4ü¯tß!Ï¡ªU‡X0y0€\Åÿ%@[ +endstream +endobj +10168 0 obj << +/Type /Page +/Contents 10169 0 R +/Resources 10167 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10105 0 R +/Annots [ 10152 0 R 10153 0 R 10163 0 R 10164 0 R 10165 0 R 10166 0 R ] +>> endobj +10152 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [283.644 690.333 376.001 701.237] +/Subtype /Link +/A << /S /GoTo /D (main_bounded_extrapolation) >> +>> endobj +10153 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 678.378 148.55 689.281] +/Subtype /Link +/A << /S /GoTo /D (main_H79_widening) >> +>> endobj +10163 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.659 590.841 268.34 601.744] +/Subtype /Link +/A << /S /GoTo /D (main_Widening_with_Tokens) >> +>> endobj +10164 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.639 362.928 300.161 373.21] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_73cb0d61cccb259e06b68d4f83deb6d7) >> +>> endobj +10165 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.639 92.605 300.161 102.887] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_73cb0d61cccb259e06b68d4f83deb6d7) >> +>> endobj +10166 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10170 0 obj << +/D [10168 0 R /XYZ 90 757.935 null] +>> endobj +10171 0 obj << +/D [10168 0 R /XYZ 90 733.028 null] +>> endobj +9812 0 obj << +/D [10168 0 R /XYZ 90 524.315 null] +>> endobj +10172 0 obj << +/D [10168 0 R /XYZ 90 509.744 null] +>> endobj +9813 0 obj << +/D [10168 0 R /XYZ 90 258.171 null] +>> endobj +10173 0 obj << +/D [10168 0 R /XYZ 90 243.6 null] +>> endobj +10167 0 obj << +/Font << /F63 374 0 R /F95 1788 0 R /F23 340 0 R /F65 376 0 R /F50 339 0 R /F72 471 0 R /F31 472 0 R /F7 505 0 R /F1 542 0 R /F8 504 0 R /F11 418 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10182 0 obj << +/Length 2099 +/Filter /FlateDecode +>> +stream +xÚÍY[Û6~÷¯ÐÓ® Ô^%Ò)Ø.š½i2ۗ4042ÇVkK®$Çq}EêBIži³Ù"3’¨£CžÛw>Ò8Ø8øfñÕýâîeÄ…TD£àþ1P8ˆ#‚%Áý6x‚8]®Æ8|µ$8LÊc²yµ¤8,׽ޖÉæûì¡LÊëz=^ùrEÿsHªÊ޾֏ºy§óTƒ^Æ#rB—ïî¿]|}¿ømA`e8 ÍJDŒb&‚ô¸xû[ÿ6Àˆ)\©cÀ)ƒë!x³øq‡V <²Š2„#a­ºßÃÜ4"a®—T„ó@Ãꔤn|›u^eE^ÙçKv8X¡'Qï‹ÊÝîc÷û,ßY‘ºÕ¾Ïv{]Õö!Ë·zIDøÁüӕÍòV›¶ƒ‘ðä|Yä_˜^öYºw꜆tŸ”fú•ñ ˜¿‚ˆ)áìLÒZ—Ùïz»\1.Ç«½&æ¢ÂêZÕúh‡ŠG{MÁäºL²¼®ì€Y¡¹º©Ím³X£à½YkRfÉÃA;ñòœç#¬`YœwþW²7Ñ< mT&¥“JÀá3uë36ј‡ua¯M\àª;'‡á+b*% _Ï¥}™žrÐxVb0Oçö —µ%|ûXG§mïfè£bx÷’뇆bnr¸Yî«åŠcþŒ)µÂŒ „)Öäo#ûÚJÄA„T̤ˆQ"`("Î|§ÅKîQL‚Õ@*ɝs’íÖYÂMЭY¹m<»bCIøþmkJµ ÍöÙ:nJ]µ½w…wz$6öÓÐrÂ)bà „YdçþlE¥gi°’°TÕÊ 'G†:’±hùá€K‡&ãEøbª–(«.Nt’©ÿ%’" +8"„9à˜ ¹ïÁRs±VˆcõL¨½©ØÔkifdX-ðo«D€*éûGK¬(âÏû‘Oý8õ @,êçhu}„!W%TÏ4q $D^62c…9â¥ÍÚJyí¦‰‘2å#"‚š‚‚j;ß{ÓùŠlk!÷#úàz À•&µÎáoÝ0ÛåV™ Bj摅³-ÄþahÐ/~×û8â=Àô!òðce…V$ƒ®7+t=pt4ΕÕØåk$¼é•¤­ O53= 2H/¤*`9@¹sdàõ7‹àm³˜Þ™–®í;èd3)ÆDúO¬–ü¥Õ ê!d}7ÙuF‹©ÕN …×äW“WÚq¦,oá4sa(Ê-P'!Bä™=Éh…@¸¢ÉZ¿þê“ñXµö>î•x™UpVƒÆPo×kX‡jHÙv“”»34ˆz´Ÿw¡¤C½{ MëoMœ‹”)¼ˆ|6‘’ˆG²SR¶=®€æV쮫,O‹ã rÐ8,žGÁ—aÍèuãԃÎwõ~£Ë¸ÉΌäp4çL&cãL¸FŽfÁ€_(ÍÐ¥±óakEÓä\9a÷UdØiZšd^8>ÐÈVIJØT7¬Æ;žp£pG>7H˄rØåòó˜|Ø4Sm:m[ĺåB¡9€'‘@jÅ tX9x6x"…ü8„·Ûšca¾môé±I•Sßcþ Ãýi©hGª7o´#Zs †Ú ŠÍƒÞ”Í +„ ävÆ%°½‹bù\S ³ Ó -¼ö”;\JZØ1¿ê¤Ó J—6$}H%Ý'ŽU¿&žÕ®{é0R@™<œsKŽ6> ë€) yړ·ò0ŠP$8×ú¡ žíI·›ÚOKBHôÙ¦öð øÆy/-J à§"wäÞ¶èq¦<¾òe::ïÙù´Ï¥!}Ê9=þl›K|³¹ˆODYº®aÛó½¦`ß]²zoïŠÜ ™ ·¹>Cxâçr#îr£ÙÓ|xìxÓ\·[fK-¦v €Ä(žbÉûCü^£Ëg€¨ºÙ^6À«FÀ˧ÌZ)öɀ·9y)§ø;ƒ·Œ;‰M}=é9¤¥(–]ïÍõeãu½1Â7î3ó6ÂÆÀ„CX~ aaûj«šEö@©´ƒ^YÃs“P,j……¨ð¢…xU­â¤}e7÷XŒdûQÔnõaÐx5úG‹™É,¦`kEèÐy+wáÞxñ©òy3ƒM»Ÿv7‘Jp…B ŠÿÏHýŠð©|‚&ÍÕlÂÍ!À²¤Äƒ$м+50@~ÒÄÚMhc 7mpá¶÷z#<»‰"#Aħàæ õg/³èÁ)Ì…Õ Ú&zÔúx:€‰3û©돃¾œ™ Œw¹dê>Ú`’ò‡ê,9l^žó´îòћ„@¥›:§ä_3³0H¿.Ž´Ì2A;WTŽÊzåñ$“Ó çT\ ”Àóö5oæx&c + Ñ5‡Ó#|1c*DUb2…=ËE†™ú6ËИÞÍá#„6²†kÀ첃ÇäT¸Î˜àØÖú·tä565åQÉÓ|íd]çÈì ?½9ü»É+EçQø¦¯ÐŽ¬ÎÛÔóùÇkï¥Îóº‚Va¼{õ]¯“æwŠDÔ÷ÌøWà ŠÈ?û£OûcOæ*„ÉW>2ð•Y§©6÷ؖ›}tueþ[éòŸæ¨ÅeÔI~n]c*É&TYuˆ`DMʛß ŒotËÕ¬e¿íÝwvCܯ—È1ÜõÇ}]ŸÖww—Ë¥:çÙ©DY}w:î¦Qh!Ðï:%mª‹öÌ"Ëað؜Lüÿ€Ÿ6 +endstream +endobj +10181 0 obj << +/Type /Page +/Contents 10182 0 R +/Resources 10180 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10188 0 R +/Annots [ 10174 0 R 10175 0 R 10176 0 R 10177 0 R 10178 0 R 10179 0 R ] +>> endobj +10174 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.334 580.208 236.659 591.112] +/Subtype /Link +/A << /S /GoTo /D (main_Concatenating_Polyhedra) >> +>> endobj +10175 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.635 508.469 256.157 518.367] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_73cb0d61cccb259e06b68d4f83deb6d7) >> +>> endobj +10176 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.708 394.18 250.895 423.245] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +10177 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [448.024 349.388 483.212 380.357] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +10178 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [322.376 129.177 385.519 140.081] +/Subtype /Link +/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >> +>> endobj +10179 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10183 0 obj << +/D [10181 0 R /XYZ 90 757.935 null] +>> endobj +9814 0 obj << +/D [10181 0 R /XYZ 90 644.989 null] +>> endobj +10184 0 obj << +/D [10181 0 R /XYZ 90 630.565 null] +>> endobj +9815 0 obj << +/D [10181 0 R /XYZ 90 500.315 null] +>> endobj +10185 0 obj << +/D [10181 0 R /XYZ 90 485.891 null] +>> endobj +9816 0 obj << +/D [10181 0 R /XYZ 90 330.126 null] +>> endobj +10186 0 obj << +/D [10181 0 R /XYZ 90 315.702 null] +>> endobj +9336 0 obj << +/D [10181 0 R /XYZ 90 203.757 null] +>> endobj +10187 0 obj << +/D [10181 0 R /XYZ 90 189.332 null] +>> endobj +10180 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F23 340 0 R /F31 472 0 R /F7 505 0 R /F1 542 0 R /F8 504 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10198 0 obj << +/Length 2637 +/Filter /FlateDecode +>> +stream +xÚ­Z[“Û¶~ß_¡§Tšš0.Hª3i3qÚ4qãm^œŒ†+A»´)R%©]ûß÷àB @I±ý°KsÎåû âÅã/~¼ûûýÝë7‚-2” *÷ûE†‰ ˆS²¸ß-Þ/ A1]Ec¼|»"x™7‡|óvEñ².??É]“o~.š¼ù¼^»W$]ÖÕ*¢/¿/ó¶5Í_ä^ê>Ym%ÌËbÁ—1a«ßïºûáþîw$à ¢%á J_lwïNj<ÿiËÒŋuXĔÁµ\¼»ûÏvµâx¢e n´º’FœNŽeÞÙ»í('èÊA×®ÈË͛SµíŠ^™Ã©íLëØÔjÔs±ëgë§Ý×eY¯(_¾Õ£}MvOõ®EZÑ^Òþ +›À ÊL”¸4E"£‹ˆx”‘êº\E¶á)o7 v÷y³­wõ!/ªß0ÇðGLÿ¶®@BXfb„h˜6F±ÈÌ´ìNM՚á Ä8œ/Àf\לd`N +$D?¨Ø¯"–&˼ڙF]•ŸM«ïÒ&RFÙʪ“vìÑXÛÜì“«;иŸØ\µú¦ÙÛÀÜ)KH¢W«(¦dYtvõþýR¹ð‹öãÏZéEÄ3DÓd§gÜúÇ©ÚÉß0¦•Ü)»¢UÄ¡½æÜN"C LpasέG(Eåý»ÆE@R–ã”Ê,Ê¬{¤¹nó²Ôöƒqr_7ö¹±24¬×õ#¬S® æÑžd F|õÿa†IõÿY¹8„lŒ—¯Œ'ÃVž[!Φ_nÓþÝ ‰áÉ5d(¼ÖJ\Օ Ìz?Tëh6ìGé[³ ¦Ã¦mñ›¢l+P3Ç©iWdÕŠ›îóQšˆ=äŸ6EõUáœúƋâ„%Uæ/§ƒ¹yVúååIöƒòδ”îÕcÿn=™cŒ3u§ìèuÑ«nz£BÜd)Ÿ‰–pD’lp~cƒÈ¸eßé¹å ¾$(¢"™”öÚÖÝ@ÓÎm"?Ô}J¯¡*ݶ¹Œ!žpoÇ}ȏ­3´ÛÅ+sõû¾3?|aÿYÚ¡„¸¡H†ü²La›ÆýVˆÝUFâI’&ÜÍ˪>Bž, +q +¢Ÿôc`UP€ñÙUUÏëP¾ %ñXxkp½/v€Êà8^þs’7@n6’®% ÖP!ŒÐçSs†»dŽ¸“«#Ê +¡™¨@8!S_Ýa*åy9J>‘& 3^ Â8›0Sñ8ØÇùnEL¤Pb?ž?=#%C)ü˛Lí½V¸‡·e4mvTé;ŠÉŒ7ð%œ]òžMí õ€‡ýÒÉ®øöªWƏðÌ@9¤Øçe2£(m5c†û§¾cȗJ~ûlȗðLçK5®nƒÙ&Á(Í¡ªPîŠa÷0õý ƒDØÚRýò$Ž$–e—¦NQœOU·ÎÉv˜³íêÆÜ·Ç|k»€©”u;ùᕣe:ªÎ颼IÉ põ‘h¨ 4z*;ÓîÇóÝÊtsÄâA³£JÁ¡­f.ÛÕÒ.RÕvUP£ÞYirs!÷Yj)º'н +@wŽ^Cl·Mñ0_iÜPÅâšGKç~ùñLÃRÄD¶…‘µ=Êm¡ì°Í»ù ‚Šzö@ ’«½r+µNóÆ~.£Å}ÔæZĐ–Õ>+d]J Àø_Àq×kùé©j£}fãxššPåâ_WI‹ü(­{g|Æ*© þýœ7MƒB5&ís1Ő2&@i‚:Η΢C“k¯ãäJ5ˆ‰=‡ÿ¾‘@§ƒè¬.ÒɚÓlë£ö´ 38Ñ9 ìmÝ@¨ëj7l¨"‘Œ@…87¸ÏLï16b×Û&ö‚•€/¨pÀf8³§'֛rH¬²i×3ÀÒÛåEï'LN=éœW|1S½C–¿Sš‚QM¡]î‚qn5m?´§BËbVîþ2‘ÎS(²âE$ØʜíŸÕªÖhöAŸêtxïV†6,áV;ãîòÆArˆcêïÛŸ¶ò¨iáÛ³lŒÁ¶Û­×7?çe±ÛäÍã ìÙ]Ò<çldc¸hu‰w«¨ºìŐ!bû•Á°ânê¾ó¯(è²K(”…cëÔ±X)«Çîi#›¦¾èóÀi’M%„>mR×|§=ýÜl ÕÌüb2t˜¿’ý¡LÚG4Ó(“ +nNiêS¹3ÝÛüÔڑÆZÐð¬åϦí³H5ȉ_gU8±Iƒò‘¡7u’À¾ ‘!> mýÖà ŠG°0€¶w4s*<Ÿ¤]A¹þ2ÍÒõÀaí×1£âavô2-² +z´è¢G|›02%zŒž©£Î•k{}²czuà™[ÿô}Ðcô1ÚøQg>]Qõç40B³w„RÝ.Jí9MaOÈæ)˜@™òíq_ÌÀÈ7"`ã ­K+àˆ"jc`"ã‘õ× Ú€]❮»@-*ªm}8‚9õ6«¾•úQÕ¾‰ IfÔ-ý“©nìÍõÒ¹à +‘³i…¸©p"0U¿/V]^Øãs1“=‰ù­þÆìIPœZ«Îž—+Ûڬйœ19|U?[ˆë`;I2ÿ]øúð°>*¼˜¨Óÿ«Ï/„ÏùfUe¥ãg~°M?ª•2’ÞúMMÿ-ŠP–Úoi¸!r~f¶_Ìì©ÁÛƒ˜[ DÌÍ[ÙüiÅùÒ¦ÏçÕ)·?´+Ða¿99F¾¨ýƒAùx'{2š}\ô­æ;ÊKÒˆÈH†ºî¸~ýúååm[tªŠcƒŠîõñX¾>O Î,¦“a’}ÖqП\˜rdöÿ?MnÙ +endstream +endobj +10197 0 obj << +/Type /Page +/Contents 10198 0 R +/Resources 10196 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10188 0 R +/Annots [ 10189 0 R 10190 0 R 10191 0 R 10192 0 R 10193 0 R 10195 0 R ] +>> endobj +10189 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 491.218 239.856 502.122] +/Subtype /Link +/A << /S /GoTo /D (main_Mapping_the_Dimensions_of_the_Vector_Space) >> +>> endobj +10190 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.639 306.219 300.161 316.5] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Polyhedron_73cb0d61cccb259e06b68d4f83deb6d7) >> +>> endobj +10191 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.144 269.173 182.164 280.077] +/Subtype /Link +/A << /S /GoTo /D (main_expand_space_dimension) >> +>> endobj +10192 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.502 167.377 241.69 196.443] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +10193 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.635 98.244 163.823 109.147] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +10195 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10199 0 obj << +/D [10197 0 R /XYZ 90 757.935 null] +>> endobj +9859 0 obj << +/D [10197 0 R /XYZ 244.439 494.372 null] +>> endobj +10200 0 obj << +/D [10197 0 R /XYZ 90 478.206 null] +>> endobj +9860 0 obj << +/D [10197 0 R /XYZ 400.69 272.326 null] +>> endobj +10201 0 obj << +/D [10197 0 R /XYZ 90 256.16 null] +>> endobj +10196 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R /F11 418 0 R /F8 504 0 R /F95 1788 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10208 0 obj << +/Length 2293 +/Filter /FlateDecode +>> +stream +xÚÅYmoã¸þî_¡^VÖ _%1Ý= íÝz}Ûî¦è‡ì"m:No'Éëø~}‡"õ&vzúÉ6M g†3Ï<3ÂÞ½‡½ºY\½˜'‘ hàÝì<‰½0 HPâÝl½[ŸÄÙrE0Æþ‡%Á~\eñ݇%Å~‘žöj[ÅwKÖU\®¯Í²ÞuTU­šå—›¯Þ2’O$C,àpz+þ­Ù2Q`D™ìv|ç"Qõ"¾=+âÏi\×ËØ¿YJꫬLãF™•j§ª%‰|•o`)”ûœp-tñýÍâç1Ø#­gDˆB&¼M¶¸ý‚½-¬ÿèaÄdäÛ]™Ç)ƒÏÔû´ø׏½,ðÌ˔!£á_vÆ:¹ +D1éløŒ1³†ŠÑŽdÔïiöImöL£âaÐmÚÇ­+B¿.ãMëƒÈß&™Êë¤È¾Ž8 +HØ=;ä Сûÿ(ýcÒ첨@L°A֊ÂmØû‹&A‚ïÍŽ3'v¿q8F ŠnÃ׸rù#>hný ~ _à—Ÿ÷!ŽÃáþ(w¥Fà—{÷Œ¡Mq·Vw»"ݪ­CVÈ•½J‰ „ØÚmòÕ[1) ʙ·‚Ü—ÂFh±3»¾.© Hâuªj{Ùû¢¶”ÅIvÈ̺3ÀÚëê8­ ³ÂìZ³í®¢2+êçCœš¥¦pE•”ˆ¿,DâÇùÖáMJæÑÙ¸8šz1òó¢1:Zwf*[«ÊZ²sµb<ÿÎü|î \Í(ðWŒj—)p#T3_¬ïõ×Þ÷µþÍüMQUª.‹|›ä÷ö±Â|Î.W/%¹ËKL @ÊË£.²9®T‹­T«{‹®Xx·í‰ƒœ@ÁWE4$S_%yS×v? F!¹æ):‹‹>uV€X­¬>lñà:ä¨1 " ®)†rIƒúdkæW] ‹dk^XAͲ.JE~}]ãÒ<þ üx‡ùïwFE9¾'Æ^Hïú“à +ŽLŲ %ˆãºÁ¨ˆÒnÓm’§I®¾8ܹb"@‘àšBPnøtl­.kFR ’ì‚"G/(rCµlëOë–ÒºªpÅqxò™{æÀö„tJ˜[pÂ}$ÃW*׃%n˜"àæA/—âàנǨMlƒd=ìU’oŠ¬Œ›RéûG“Ì›Ç<ÅP4uÐC)¸4â¿ب²Ñs=yx2‰J¡Kˆ9¤rÝl¯¯k8dLœ&Û»¸º?€ŽÍL›)‹‚Ûéãâf_¾ŽÖÔą¹:7ƒÞ·çüöŒóƒsΗcÀ3 U@0÷§©Ï]ÈB"‰"à+Зˆh-ÒB À£wͯ@à<û»M±U¼´ÐþÚÀ}6ó—ˆa~Ø­8ø¨šC•[>›FWëÄZ¢•ê4è4Û•#ãTëh¨Ö¿=’dHó–ȅ°Ó}ÆÓ'HDhð1uyB÷1U6û®Æ®Ût\|–«"çÝ;óé:J{> ÃpðàÀ´×úõñ4DÒä8Ç†Ç +‚†F“ÛxTz54µ—„Ûìx_%*ßÚ0ûc¾íº=ÝùÙïù¦Iºú]±i'n,á V`!ë`ÎÊGĞÐbVQ7¦{Œ5ë¥êpûQ”ªŠ›.l§œ_@UÆ}H¾uöÀÐhŽ›Ÿ:íqÕ {²vHgcƒ+æBØto…:)ƇI +²—UîÝ͸ /£•¹¦'8Fˆ0•ÓÄüç¡)@z׃U¨»È1ý§Jš–ßr¡ˆñÀoԒÿ¡i; ½^©Xrí&'' °zè.:LCúށ8©aPõ{2 +…t%0ñwÐ!)-ÁÀ†ƒq ¢u>‚]²Ê:ë@Ⱥсçæ••ÍÉ|˜Õ\ö`ÖfN‡»ÕÁe bÃ@3T=@CÌ`Bö{ã(cn』ˀ=oÛ߶n M!ÆýCžhñUG‚_™?Çf‚ìvgIždÉ/-–À¶úT7*3µ½2c&¥ªêtmþи‡i®û.˜BŸRy^:×ä8°º:&µzc»yÀ,:wfœ¦£"ß«¨i“EÃ"·Ʋ*[nTW€®Oæó[&¾q5vuH`‡EÑuQ¤Ó¼ýÍ»Žt¨Ô2œËŠ“¦gã3¢otºaÿâD öhœ"9÷ÍdDB12“‘·@FŒst‚…Á9â(dÀ“}ØÊ¢1¡LáԅÏ*øèL‘Ä« ¹u4î–³áN©6 tì¿(ò@ցÅ=«Ñ¶½3£a(”ѼÃ2Mڛ}—õ¾Þ·‰¶_é"n3¼û1c(ûã^åjTÉvU‘ £D+,MMík礦"ašªéC£gQ;]+ò™R1ÝuÛ˜²LÑ~àÈ&¨ñ®àÁˆÂW{ùw;:…Bná§ßº4ŒÏ^¿MÅÀ׀>~ÿö¤¼€sÄ Bèaù´ëà4wdLqšÃ¨µë>í´a ¸·œìÉ^ÚETL9âOcð··éaëš9Oãø­CàÊÀ‹Ç1]OÚðo'Á4-@!Ñ¥o%»·‘4npæm¤€žQð™k?hç萳?»˜3?mà™ÿ®Uõ{ÝpÙkþ{œÛ—6†Çu¤º¿Œô;Z3pl§ªŸT÷^ÀXö“×}ûë¢õà /äbC½ošòúêêx<¢M€Å—Jš+píÕãéáH +Ñ|»ÒCGVt´"Éa1káÍýÿ_…'ËO +endstream +endobj +10207 0 obj << +/Type /Page +/Contents 10208 0 R +/Resources 10206 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10188 0 R +/Annots [ 10194 0 R 10205 0 R ] +>> endobj +10194 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [486.549 696.002 513.996 706.906] +/Subtype /Link +/A << /S /GoTo /D (main_fold_space_dimensions) >> +>> endobj +10205 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10209 0 obj << +/D [10207 0 R /XYZ 90 757.935 null] +>> endobj +9861 0 obj << +/D [10207 0 R /XYZ 213.427 687.2 null] +>> endobj +10210 0 obj << +/D [10207 0 R /XYZ 90 670.473 null] +>> endobj +9862 0 obj << +/D [10207 0 R /XYZ 90 579.657 null] +>> endobj +10211 0 obj << +/D [10207 0 R /XYZ 90 565.087 null] +>> endobj +10212 0 obj << +/D [10207 0 R /XYZ 90 498.266 null] +>> endobj +9911 0 obj << +/D [10207 0 R /XYZ 90 475.332 null] +>> endobj +10213 0 obj << +/D [10207 0 R /XYZ 90 475.332 null] +>> endobj +9912 0 obj << +/D [10207 0 R /XYZ 264.215 398.668 null] +>> endobj +10214 0 obj << +/D [10207 0 R /XYZ 90 381.94 null] +>> endobj +9913 0 obj << +/D [10207 0 R /XYZ 161.222 319.269 null] +>> endobj +10215 0 obj << +/D [10207 0 R /XYZ 90 304.544 null] +>> endobj +1546 0 obj << +/D [10207 0 R /XYZ 90 204.149 null] +>> endobj +306 0 obj << +/D [10207 0 R /XYZ 90 197.549 null] +>> endobj +10206 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F23 340 0 R /F65 376 0 R /F8 504 0 R /F95 1788 0 R /F21 2111 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10243 0 obj << +/Length 1820 +/Filter /FlateDecode +>> +stream +xÚÝZYsÛF~ç¯ÀSV…Ã9q¨6©ÚÄ«­Þ(¶öÉN± bh#£0¿~{.\)Q’d$€ÃAwO÷×_÷ ˆ½wöþ=ûúz¶¼ ˜£8 w½ñbì…A‚ï:õÞø„ Îæ ‚1ö¯æûIµMVWsŠý2?¼—i•¬~Ènª¤:\\˜a5ëVVµlæ?_·¼$¤'ŸÄ ±€ƒv-þfÊÀ‚e±›ñbBHŒ‚¨ñÕ½"¾É“ºž/¨Àþõ<¦¾Üîò¤‘fä•ÜÈjN"_k +å>'B ýëzöaF@ öˆöŒQȄ·ÞÎÞüŒ½Æ¿ó0bqäÝêY[S×Ü{=ûi†Oz™2„a,¼ÚßäÙڙrÿ°“µ6ÁÉX^ +Ü_`a‰¼¥ˆÇVÈ[JÅàïÍB@Ø–ʍ‘ž5²Jš²Z5åj]õdŒp„˜`ƒ͌ªwÖ¯îš4ðùkùa¯=:\Ä@Ç(ÂA¦¦½[Í@Ëøº¼ ©€X H„ê…¡uÞ?ó,±ـ<}“߀úîi°™àÀé¯d’.Ê"?˜™=,@í¼›,ͪ9 }¹n²²Hò.s"|½=RæÚ¼·ðL³ú—}±n¬må¦gڄ³ äêë«yso•tìÛDìÃB͑¹ÜÊ¢A÷ønàüE#Æî +99wk«¡q`ñiÐ=}šá¢ÎaHQÄ„Ü‚ÐøêZ:m/ÌGœ>3u“^\TrN…ÿ›Z²ª)o‘C!9Iôäœ&”‘F 蓀sjQgðXŒ(ñصÒð› é1ÒQN·ÈS|ŸåeÂj΅_nÏÎÅÅ@Å0Êþÿ/vN°ÁH´4äO)|F×óÀ(Í!ý%P4ÁwÂÒ¨×Z°a(Yú-Lîö[/åöFÚ5\*ÚÊ­'{à"2Ûu¶¹TVVû5˜gù6)RsóBºoN¶r q2¡ÑÆñ„OzMaþªTèºí1a¿ÅÃ9â¨t®C³ä…Ü${Èu·Ô‹ù‚‘.Òi=*A7eÓ@Äõ§ýrׯ2=É:ÌYaÇêCÝH+B-#C‡è‹‘4èæ›Ã]ÁjՏࢯ" >F$ږçDÜ#æ³Ã£Â9°îwb9'„øMW™42—ÏÒ§¬üۍÝ&ŠÞDØ͵u<háCPÒ¶ãEÙô1þŐó\&$' ÞȳâëÞÜîa` 9Š?e@¬­WÈäã×S¹x$A¬z˜VÝfµÉ­ó@@"D€ÏEÁò’öù9B¼kÃßb†Û]W7ÅÛæé99¶ÑPTG”wFb­9Â1ÑWÁ˜<]hl¬öÒ\ÿãPö²L³ÍaÒ;-zôǛ_`ÇðÔZc“ô¦,óÓT•Ê·Ó +t~XI…ê¼þøÌ×±×ckÚ+Ùì+SâGIÇ0b]N +äDÚA+íáHfy%Ž¼ÁiÜA³ ]\s“Sõ>«ïUÕ÷7¸!¤~Ïé#éAÝÉÊáäF§ü"Ô­›¾IòzÒ1êlà~ÇDÏî˜m¢ýÁ,5·Ž™. ƒëN¶“œumö¸ï/M®‹‚ƒBö [0èZ̦£XXĦ¥Ÿã+s~z…m˞ëÞ³M_®Úä»LÛçé¸ð¹s¹ÎR™žßiE€>ÚÂ!žÊCY½jÊÝÉJð1I`† Ži/7€ƒÝNØ&@ßM‹ˆÅüyò¦oFmtš²¢nÀúƞóXã6£i£.‚Lôï¤×¿“»ý;<²ÓÌsg.5(ÕvƒóiˆDć‰ÐÀ}‘µÒ'vúρ?»Ýù³ ¨N¤:æ=A®{d!7dÀ‚jh‚‚"*Â@0¼‚C3j£]V)wGu/ó9ñ-ÕçÒÚl'³ÕWÊÁðP‹jØaQ=4Â"ÇBaÑ`Žû«©¹ €í¯Ÿ¾ïçn¦¶r[V‡Uý!WúæÞ§´ñe“ä+ûlV¬n¬?~ûû£\GÐn§öîà¤)G.ÖæZÃBmɲçÞÆö飳Bûåz½ße2uOMÕñȜˆç`Z‚‰»ë@0ØXñˆ}ZDè„ø½‘UñwÆãÑ°MŠDQÇ;õï4( ¡™ 6(0F„>WÍúñûc1ÕϺ×HIž›]™­p_nôOrSt…~üÚ<è¡oÍõÛrX{ ZêȾ-1b|8}¥I¾ÚZÈ\¹$˜öW æÃkY}>·Ðx™{Ç(jÕî =s/ÓÔk^D ™ë£•×Ò%’YÙ¯ž»û~¦¡ÐÙK¢úÛ0ï›fw±\ÞÞÞ¢u sÙU(k–»]¾¼»WïIQò­ö¥4 ¸E< nuŒ€ÆþÿÚ];( +endstream +endobj +10242 0 obj << +/Type /Page +/Contents 10243 0 R +/Resources 10241 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10188 0 R +/Annots [ 10202 0 R 10203 0 R 10204 0 R 10216 0 R 10217 0 R 10218 0 R 10219 0 R 10220 0 R 10221 0 R 10222 0 R 10223 0 R 10224 0 R 10225 0 R 10226 0 R 10227 0 R 10228 0 R 10229 0 R 10230 0 R 10231 0 R 10232 0 R 10233 0 R 10234 0 R 10235 0 R 10236 0 R 10237 0 R 10238 0 R 10240 0 R ] +>> endobj +10202 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [224.034 697.417 264.203 708.321] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_d25e2d27e5d731e6b63fb84a65700faf) >> +>> endobj +10203 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.941 697.417 305.705 708.321] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ab7519865a52fbbc8dc2031135a9fb41) >> +>> endobj +10204 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.01 682.858 391.568 692.871] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >> +>> endobj +10216 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [250.046 658.901 290.215 669.805] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_d25e2d27e5d731e6b63fb84a65700faf) >> +>> endobj +10217 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [300.953 658.901 357.729 669.805] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_dab8b3f43dd9a5e707b95e15a9c282f8) >> +>> endobj +10218 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [311.435 644.45 345.993 654.355] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >> +>> endobj +10219 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [235.8 620.386 266.564 631.29] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ab7519865a52fbbc8dc2031135a9fb41) >> +>> endobj +10220 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.301 620.386 341.41 631.29] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_36becc8c3ace976043199807351d5b04) >> +>> endobj +10221 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.817 605.934 323.613 615.84] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ab7519865a52fbbc8dc2031135a9fb41) >> +>> endobj +10222 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [235.8 581.87 292.576 592.774] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_dab8b3f43dd9a5e707b95e15a9c282f8) >> +>> endobj +10223 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [303.313 581.87 393.434 592.774] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_6f4469416e02c586de17284317f8a92e) >> +>> endobj +10224 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.817 567.419 347.024 577.324] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_dab8b3f43dd9a5e707b95e15a9c282f8) >> +>> endobj +10225 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 480.563 163.361 491.093] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_900663a0e97525c064ccf31152fa8ae7) >> +>> endobj +10226 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 444.005 163.361 454.909] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_1c71c9b7d1de1b77eeb054e1c0ac935e) >> +>> endobj +10227 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.698 444.005 228.964 454.909] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >> +>> endobj +10228 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 408.195 163.361 418.725] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_f60bb41867a12ce28144596e3cc1406a) >> +>> endobj +10229 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 372.011 171.11 382.541] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_c3283cf8fd0dd8ff2a319cba1dead1f2) >> +>> endobj +10230 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 300.086 215.923 310.99] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_411d42e5b59a492742793834efeeabc1) >> +>> endobj +10231 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.26 300.086 281.526 310.99] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >> +>> endobj +10232 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 252.943 171.65 263.847] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_66e3e2f2433738665eb748d2f6c5878f) >> +>> endobj +10233 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 206.173 187.151 216.704] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_e006881831b298f0af5031e99df2bc6f) >> +>> endobj +10234 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 158.657 202.902 169.561] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +10235 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.4 158.657 300.037 169.561] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_5a36a32ab46d46f574f3091e931e2bd2) >> +>> endobj +10236 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 122.472 202.902 133.376] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +10237 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.4 122.472 314.263 133.376] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_cdc1e9b5ac338be9d0584d50d275226e) >> +>> endobj +10238 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 86.662 161.677 97.192] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_8c82df1de8703aefeab268dc9ffc557f) >> +>> endobj +10240 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10244 0 obj << +/D [10242 0 R /XYZ 90 757.935 null] +>> endobj +10245 0 obj << +/D [10242 0 R /XYZ 90 714.318 null] +>> endobj +10246 0 obj << +/D [10242 0 R /XYZ 90 677.825 null] +>> endobj +10247 0 obj << +/D [10242 0 R /XYZ 90 639.31 null] +>> endobj +10248 0 obj << +/D [10242 0 R /XYZ 90 600.794 null] +>> endobj +10249 0 obj << +/D [10242 0 R /XYZ 90 520.404 null] +>> endobj +10250 0 obj << +/D [10242 0 R /XYZ 90 497.001 null] +>> endobj +10251 0 obj << +/D [10242 0 R /XYZ 90 460.937 null] +>> endobj +10252 0 obj << +/D [10242 0 R /XYZ 90 424.753 null] +>> endobj +10253 0 obj << +/D [10242 0 R /XYZ 90 388.569 null] +>> endobj +10254 0 obj << +/D [10242 0 R /XYZ 90 314.995 null] +>> endobj +10255 0 obj << +/D [10242 0 R /XYZ 90 269.874 null] +>> endobj +10256 0 obj << +/D [10242 0 R /XYZ 90 222.731 null] +>> endobj +10257 0 obj << +/D [10242 0 R /XYZ 90 175.588 null] +>> endobj +10258 0 obj << +/D [10242 0 R /XYZ 90 139.404 null] +>> endobj +10259 0 obj << +/D [10242 0 R /XYZ 90 103.22 null] +>> endobj +10241 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F72 471 0 R /F65 376 0 R /F23 340 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10294 0 obj << +/Length 1685 +/Filter /FlateDecode +>> +stream +xÚÕY[oÛ6~÷¯ÐÓ&3ë.Ý0`[—í +tmöԁbщV[r%9nöëwx“%E±ãÆÉÚC&E‘‡ßù¾ÃC{—öþ˜üz699 ™— $¤¡w6÷ìE!A‚ï,óÞù„ ΂)Áû¯‚ý´Z¦ç¯Šýrqs%³*=ÿ3¿¨ÒêæÙ3S­ZmdUË&øpöâ䔐Nÿ$aˆ…F×ÝÿdšôL Q–¸ÏG:IP·]ü¼·‹ßi]S*°$ԗËÕ"m¤©y#ç² +HìËbU‘ Üç$TN~?›|šè{D##"1á͖“w°—Aý #–ÄÞF·Zzœ2x.¼·“¿&Ø¢<|jÔ#êÅ`/@¡ìå`0ü(C8Öì+9S€~´¶çsóL 󧹲sȋ€cÿ:­ò´hlë´ +XäÛuÚäõ{Œ©ÌžÙ]¦¹çÏ) N<#„qbì{%—àt]̚¼,ìàó€ +¿¬f>Ï Ð³Æ”_¥E¾Zƒ+àCSSÎ]ËúÕcÝ3öäTஓâ›R‚B“ÞS*zŸx輦{­‰™görguiýúF·Ò£/e@„?=¯d¶B :SÍÞcáGŒ©3˜t3ŠéÀǔ‚!¡(©%wpj°1ðàÜ—ªD nªº–ŸÖ†ª¤0R¯³#] Ð:H’¯$Bæ„ `V-¢ÓŠ£Ç®Ms•×¦MßzŽDD\#MA5ªµ‘øEYL—éç|™Ú7r!—²pÖÕ¥›SڌÙÉÄxtt;s;¼²N5ó”ƒ0J„e²‘J¶.2ÐÏn 88u^Æ4ÚÍÂ:ÿWž77+¹›†ªÙcðŽ¡(´:y#›uåÄÚê³Xoí”زì a¡0ùnX.Êr±ØÍÍAr›v #–wÕZŽñNuµå ÕEfá,7ý(¨w#t/\åü6̏I'ÆócH–}Ò.šú¬VÜÝu°¢@ÞÈ*m`ÁØÛZápa´ãNJÈhnSlµ§–ä—mŸ0+ú*¬¤ÚW]«ñÕþú@(«§Y7µRibI«½–Fzr¨[hÜÑ-”´nÕSë:Í{cª:‚e<¾K°°ƒfGÚñðíÖ)·33‚³œ`¬—CÁ*ëú‚µ2‚åÌû‚½óÒ|¢YW7iewÉ{AüÆXxì¥v§Œ¿!XM|y‰q]¦B«ŠÈM`¯æÕ'ô¾Ô鳈Û"«yUÕ͛Er‡æa‡&¢äHy3Mzy³°šWfµysHæâwRçþ:mÔ.„IØWû=øyO4¿I–þ_‹ú׊öA§”i–;U܅¢ÁÎ¥šÇwÙC‚ë/Yæ°,ǘ –Ðc$ɽS”ÖoÝé{Ång²‘>ڦ݇ùŽÀ¼B=Í4«ÊÕ^¿ÞɌñÁ엫²ÎÕûCÐ=©ÆîlÓ­ktõè U” "Ž”‘QÚÒL/!2³ö”Æœ‹›‘¾FœÇÛï #p•;¶á_%r„w"ºÉQau,¤§ÛÏe፱c€¬"êÏËŢܨ®n:¥˜  ¶r÷µ÷0r‡©cðãÅ¥ëã2XïÝkHvZ°«•Q<ä$§Ãÿñ;¸ÁYm{•sÛËS„·;‹y^ÕÍÛA6| ˑžDIRuδ/¤*HåÎϳÅ:“zQ80(Æ!äHlÏaÓA̙-dZÝ{O0¼” a®$¾ï¬¾{……(‰`]07ސ¢ aEpæúZ+»Z¦¶è®»MÑÞy›Âßµ¬¾„ðëöbsZ‚¨9¸D©½çÄHÝPð!È`ÿ­tW>ff=÷ïåD;}k/‰#ÄyôªiVÏNN6› šÕh]ä« +åÍÉjµ8¹}yÚé…pµÌÝ]í²¬Ú;e¨\ê»Y4Äÿ?åÐ +endstream +endobj +10293 0 obj << +/Type /Page +/Contents 10294 0 R +/Resources 10292 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10188 0 R +/Annots [ 10239 0 R 10262 0 R 10263 0 R 10264 0 R 10265 0 R 10266 0 R 10267 0 R 10268 0 R 10269 0 R 10270 0 R 10271 0 R 10272 0 R 10273 0 R 10274 0 R 10275 0 R 10276 0 R 10277 0 R 10278 0 R 10279 0 R 10280 0 R 10281 0 R 10282 0 R 10283 0 R 10284 0 R 10285 0 R 10286 0 R 10287 0 R 10291 0 R ] +>> endobj +10239 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 661.255 204.985 672.159] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_7607ef1c8ef6b668dd2be62c39330406) >> +>> endobj +10262 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.214 615.607 182.698 626.51] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_277ba920e188477bb301196b19d63770) >> +>> endobj +10263 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 579.105 172.198 590.009] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_754f66ed06474d4b68a93131af02a86f) >> +>> endobj +10264 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 542.603 155.859 553.507] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ab7519865a52fbbc8dc2031135a9fb41) >> +>> endobj +10265 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [156.357 542.603 180.337 553.507] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_dab2c45cbec19ad11bf34db42b794508) >> +>> endobj +10266 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 495.516 155.859 506.046] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ab7519865a52fbbc8dc2031135a9fb41) >> +>> endobj +10267 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [156.357 495.516 172.735 506.046] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_a215867508a89858bcc7ab025f8d20f1) >> +>> endobj +10268 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 458.64 181.871 469.544] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_dab8b3f43dd9a5e707b95e15a9c282f8) >> +>> endobj +10269 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [182.369 458.64 206.349 469.544] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_272424f5d0df282c6d1ee63a5c84e3e6) >> +>> endobj +10270 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 411.553 181.871 422.084] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_dab8b3f43dd9a5e707b95e15a9c282f8) >> +>> endobj +10271 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [182.369 411.553 198.748 422.084] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_04aed5c92cf15c71ce85b8cc173a893b) >> +>> endobj +10272 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 374.678 189.204 385.582] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_36becc8c3ace976043199807351d5b04) >> +>> endobj +10273 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [189.702 374.678 216.999 385.582] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_b66151b86ac8c495eba1a3209501928a) >> +>> endobj +10274 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 327.591 189.204 338.121] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_36becc8c3ace976043199807351d5b04) >> +>> endobj +10275 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [189.702 327.591 209.398 338.121] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_241c65ff3d32769cbb9badd2c8e00ca5) >> +>> endobj +10276 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 290.715 215.216 301.619] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_6f4469416e02c586de17284317f8a92e) >> +>> endobj +10277 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.714 290.715 243.011 301.619] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_9fb86f09111d4ac21fdc7c7baa86e622) >> +>> endobj +10278 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 243.628 215.216 254.158] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_6f4469416e02c586de17284317f8a92e) >> +>> endobj +10279 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.714 243.628 235.41 254.158] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_5eb3117d3d7d0566a99f9f5807276864) >> +>> endobj +10280 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 206.753 198.011 217.657] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_44b0a622563e60fe28b91b7e9ff76364) >> +>> endobj +10281 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 170.251 155.859 181.155] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ab7519865a52fbbc8dc2031135a9fb41) >> +>> endobj +10282 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [156.357 170.251 213.143 181.155] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_386fa9c84bc37468f1a3a2b860a0bc3d) >> +>> endobj +10283 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.959 170.251 247.723 181.155] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ab7519865a52fbbc8dc2031135a9fb41) >> +>> endobj +10284 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 122.79 205.762 133.694] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_37703f96495cf4bcb8ced3ff20e4c396) >> +>> endobj +10285 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [209.577 122.79 240.341 133.694] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ab7519865a52fbbc8dc2031135a9fb41) >> +>> endobj +10286 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [261.322 122.79 292.086 133.694] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ab7519865a52fbbc8dc2031135a9fb41) >> +>> endobj +10287 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 86.662 166.449 97.192] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_2edf5fe7007a3e91a404546ca2f2d98c) >> +>> endobj +10291 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10295 0 obj << +/D [10293 0 R /XYZ 90 757.935 null] +>> endobj +10296 0 obj << +/D [10293 0 R /XYZ 90 632.617 null] +>> endobj +10297 0 obj << +/D [10293 0 R /XYZ 90 596.116 null] +>> endobj +10298 0 obj << +/D [10293 0 R /XYZ 90 559.614 null] +>> endobj +10299 0 obj << +/D [10293 0 R /XYZ 90 512.153 null] +>> endobj +10300 0 obj << +/D [10293 0 R /XYZ 90 475.651 null] +>> endobj +10301 0 obj << +/D [10293 0 R /XYZ 90 428.19 null] +>> endobj +10302 0 obj << +/D [10293 0 R /XYZ 90 391.689 null] +>> endobj +10303 0 obj << +/D [10293 0 R /XYZ 90 344.228 null] +>> endobj +10304 0 obj << +/D [10293 0 R /XYZ 90 307.726 null] +>> endobj +10305 0 obj << +/D [10293 0 R /XYZ 90 260.265 null] +>> endobj +10306 0 obj << +/D [10293 0 R /XYZ 90 223.764 null] +>> endobj +10307 0 obj << +/D [10293 0 R /XYZ 90 187.262 null] +>> endobj +10308 0 obj << +/D [10293 0 R /XYZ 90 139.801 null] +>> endobj +10309 0 obj << +/D [10293 0 R /XYZ 90 103.299 null] +>> endobj +10292 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F72 471 0 R /F50 339 0 R /F99 2117 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10337 0 obj << +/Length 1819 +/Filter /FlateDecode +>> +stream +xÚíZ[sÛ6~ׯàSKÍD0.Az·I·›N»›‰7qžÒŽ†a›-o%¡¨þ÷=¸Ñ¢BÉr¬d3>ÁƒƒïÜ„ƒ›?̾»œ½ˆY¢4¦qpy¤81Aœ’à2ޅ„ ˆÍc^Ì ³®Ê–sŠÃ¦¼»•y—-ÿ[\uYww~n§õªìz©æ¿\þtö‚-ú$eˆÅìnÈÿÓ.±@0¢,õ+¾Ÿ ’¢8H|û ‰•YßÏ”ãðržÒPVm™)ig^ËkÙÍIÊzS‚Ó(ŒˆÐDgÿ¾œý>#@Ä ÃŒ«jöîä0ÿS€K“`cVUAD<ËàÍì3ìPÞ}Ô à ÐüFÀ0 eÇܝ¼›G qWMS>VۖÅõRêûG¶R«Þ_ÚñAt¦t›ˆá¼›3Jµîê~Š;†8j$Õ­å{Õ’ ë4å(Ñ¥áÇùÔJJõņò/E£5HT7‘&ü/àAI‚Q’r³O¡^«¦,!ٖûtë)jñã”, Äì4^$¾·åB+£aÝh=`l(¿aN£@&. Ý`qX¸U;ŸQ§QðæªQª©ì¤,¥.â4{¾·n'_¯dn_€˜™}ôE}SJÕÔöms¥²¢¶kixuggWMÕ®ÕBŸ +}Ž„ˆOŒRî*~ÝÇ°…å(‰1/ÆÎû¡ÖÚ#ÑqӁÛöˬ'%®Ì¿0]¡Fɕ’¹ï‰(¼ke°c£”^ë-‡çAÅU@,—î½ÊÏÏË¢Ÿj› ŒÈ½Wq]³ñ¶Ñ5›°• ªÃ7oäïkÓ%;lÇ#Ý]hø‚D(ñÐ>ÿ°Ydg +çX‹ªµŠè‘Ï|ÌAå9©SÞþ#z :S‡—D—‡ãü¼P¶QsØÿøõ˝åGáè¹ÁX—ë¦Û±€²Ù,Jã ÞKgzß¡)c‘«g7ŸCٗDrò£Ï†çýîOCu×±Ax^@ +‡£½¾hº'z"¿ôpERô˦2pÜÌáìË΅„C±õ´£Ã¬—ã÷õÞ|—ƒdü¡|w”Ó>z á¤.]Û¸˜L­6§ÏìòF:¥³¡Ùb¤£¦Ÿ­UöGQeåSÜá Ɯ²Ï‘P­k+{……3,CxT®µ£o[m`Œ§[%г yAPO™8…¼"$¢­ªÎ6ôöƒ˜ô} Áb8fãøhƒ„Ê3Âbªâc[Ý_/ïÌ!?‰¬WÑ;š¨©:þé­ï)šiÏYÛôÅà´ü1œ™Žó­ e¦äà÷|æå½ø\¯¾î0IÀkñcO§ÛÂqXZS¡Ëí"·-³Õ ¨Ý‹>÷åýÍOÑM掏¯C4χífïОشǢ²<_‚½/mJ>¸l;ÙËî½v·ÒºZsàƒE²ùù½}|•?{ÀO±9Ä´ëÕ(”Y¯žbñÏó\»H’NWÜ*nšž¦ÐŠ’qÅ {z)LwY¨J¼üXk9åú®l] µczáô =Ø¸m܀a`y(éô½¶uö…u0u¿îl•kÚ¬S…±nxõ +âz„Ûl1ÔzZÛ›ÍîUy ,ƒøŽ¼)77â`w1J…ÎMÌÿxŠ8v./LªÕU®¸ðB°?Ý?쏷`2_Ï9{A\L›‰5§®\¤PîhEEà9‰Î3}l³'û-ð£ÿ̌äîù% H]º[¥Úó³³ÍfƒV=Z×EÛ¡BµmyöaŽ¶E´^ D†$´j:wü¢†É*ûP€ÿŸX8ä +endstream +endobj +10336 0 obj << +/Type /Page +/Contents 10337 0 R +/Resources 10335 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10188 0 R +/Annots [ 10288 0 R 10289 0 R 10290 0 R 10311 0 R 10312 0 R 10313 0 R 10314 0 R 10315 0 R 10316 0 R 10317 0 R 10318 0 R 10319 0 R 10320 0 R 10321 0 R 10322 0 R 10323 0 R 10324 0 R 10325 0 R 10326 0 R 10327 0 R 10328 0 R 10329 0 R 10330 0 R 10334 0 R ] +>> endobj +10288 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 661.584 163.361 672.488] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >> +>> endobj +10289 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.1 661.584 214.907 672.488] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_b955487a974e74224f3d72d743ee78a4) >> +>> endobj +10290 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [242.244 661.584 280.51 672.488] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >> +>> endobj +10311 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 625.229 167.466 636.133] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_fe22acf3f8e5b6c20880acd443350482) >> +>> endobj +10312 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.281 625.229 209.547 636.133] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >> +>> endobj +10313 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 588.874 252.795 599.778] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_113964ab3d7ea36326ce962629a322ce) >> +>> endobj +10314 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [280.132 588.874 318.398 599.778] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >> +>> endobj +10315 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 552.519 229.552 563.423] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_def4c62b5cdf5186801c592cc62dccea) >> +>> endobj +10316 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.89 552.519 295.156 563.423] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >> +>> endobj +10317 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.299 517.903 266.673 528.807] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_01b873b0e820222e07789c3ba5fa48ae) >> +>> endobj +10318 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.01 517.903 332.276 528.807] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >> +>> endobj +10319 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 483.287 196.347 494.191] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_d3bda090e4ac93d937ac4dd775c20919) >> +>> endobj +10320 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [223.684 483.287 261.95 494.191] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >> +>> endobj +10321 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.1 446.931 179.739 457.835] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_1ee74f5687635ddbb9729be31a37e2d3) >> +>> endobj +10322 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [205.79 357.823 245.959 368.727] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_d25e2d27e5d731e6b63fb84a65700faf) >> +>> endobj +10323 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [221.256 319.222 295.178 330.126] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_5534b8f8fbd973bfb7051cf5fb31f19d) >> +>> endobj +10324 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [247.269 280.621 347.203 291.525] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_5c3bee913efb87e4661df746e184e1e1) >> +>> endobj +10325 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 200.226 210.607 211.13] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_30e0b0c2c668e73566cb1720d72cdac2) >> +>> endobj +10326 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 161.625 168.555 172.528] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ee126cc2eef44ab1d2055d0d15bc3169) >> +>> endobj +10327 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 112.065 144.674 122.969] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ab7519865a52fbbc8dc2031135a9fb41) >> +>> endobj +10328 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.173 112.065 332.409 122.969] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_0a660ed1cfae2599d7f9236f2084d499) >> +>> endobj +10329 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [387.143 112.065 417.907 122.969] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ab7519865a52fbbc8dc2031135a9fb41) >> +>> endobj +10330 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [438.888 112.065 469.652 122.969] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ab7519865a52fbbc8dc2031135a9fb41) >> +>> endobj +10334 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10338 0 obj << +/D [10336 0 R /XYZ 90 757.935 null] +>> endobj +10339 0 obj << +/D [10336 0 R /XYZ 90 676.536 null] +>> endobj +10340 0 obj << +/D [10336 0 R /XYZ 90 642.203 null] +>> endobj +10341 0 obj << +/D [10336 0 R /XYZ 90 605.848 null] +>> endobj +10342 0 obj << +/D [10336 0 R /XYZ 90 500.261 null] +>> endobj +10343 0 obj << +/D [10336 0 R /XYZ 90 463.906 null] +>> endobj +10344 0 obj << +/D [10336 0 R /XYZ 90 374.767 null] +>> endobj +10345 0 obj << +/D [10336 0 R /XYZ 90 338.189 null] +>> endobj +10346 0 obj << +/D [10336 0 R /XYZ 90 299.588 null] +>> endobj +10347 0 obj << +/D [10336 0 R /XYZ 90 219.073 null] +>> endobj +10348 0 obj << +/D [10336 0 R /XYZ 90 219.073 null] +>> endobj +10349 0 obj << +/D [10336 0 R /XYZ 90 180.591 null] +>> endobj +10335 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R /F50 339 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10372 0 obj << +/Length 2041 +/Filter /FlateDecode +>> +stream +xÚíZYsÛF~ç¯À¾8`•9šÁ`p¨’­²£ÕÖæX{e퓝b ‰‘„ À(†ùõÛsá ÁC¶âJ*y8GOO_÷t ;÷vþ9y};¹¸¨£8ðçöΉ±18·‰óÞ%ùt:#c÷í”`—W+>;õ°[dÛ‘T|þCº¨xµ½¼ÔÃrÕFTµh¦?Ý~wqMH>‰)¢§+ò_ë%FíŠ«"1 +¢–ÄßO’ø6ãu=y »·ÓØsŪÌx#ôȍ¸ՔD®È—02Ïw}I¢“ÜN>NÁQ’a! +)s–«ÉûŸ°“ÀøwF4ŽœZµr|ÂßÌy7ùÏ)ã¾´ð€x#'ô(ÂÓì~ð<¦Ž·ûœ÷3âTÒM3'yªî s7j•¼O’y^äóEÑ4Åjž¤õÿÖù²™—•¨Eõ8%ÌóJ$ëe“ùî9’ÂÌð²ÈëF èJÿy‘À8¬·/®CωàR W¸”ç¡À÷œñQìûúN¯’Äh )´¾â¸¿%!«¯S£TÖ[ä£GvMóÖzÍðlŠÀ|»EFÉV +cT)Šh`w$#4¢í±/5=°§õ*ÍïÇèaÄâø½žg¤F,yaÄÝò¬¨¿E&V"7+xžè²šÒÐUj•¼¨±7+1õ±{ÏgzÒè*®SàÀ*g$ A(±3qÆä€UªM!ŠCLä¦ùA{íƺ˜º=xL·Î ‘ïG;þ?  …-¥m)r¾22yæ4ó7¥¨xSTóWuÞç#§ÂÁt#vnéLj€jg€q13Îwž“•<­6i-æ¼,³íœ·lö¥£ôÞSõ@s—Ì‹í4`ÖøAÍ¥aæ\g'%!ÝqVEᘿÒEÁî~š»»^gÆâ‹;cùRÚãnFˆ†mLhÅ0æÎ-ïV‘í]‡>hüΈ"ÍGD˃£g‡.éäûtÀªƒ'·'À +0€A¨œÑˆ"83BŒ¼U±hIJl^5M•.¤w¬Qï#A/¨é˜6“qà`LuåމkŠO®–\Õ㫟Ÿn­Æ[‚ê¸nÃÓõó¡È’iËb#¹¥ùJbn=´™§A®eêâ -Š";'*¼‹äs…ò¯»1GCa¼šj-Æ,òGw!sßi|äGôÙ}ÆÆґ(’óœ`xH†Þp#d,3~p-óˆ¨õHHÁ ?Q?¶cø߅M4›ޅx‹8¼;ñ%V kowö,´睗1È7üßQŒ¾!IQè…G£qèƒ*½a0>mé… ‚ß|ó[DßÝ· …g…¿/–Ï}º!ñ◗-=×5 ¹c8þ²×؞›ÀM‡8t#šuen€ Ò%ï‡àH‚D‹w;It‘g[ÞÇà·L¸³Ü_¤óŸ¶o®a˄“ëô‘gQž˜Ã3†¼ØæðäÏû"r‰iüBüÆAÔû/Œpw“‡Ï‹èÉþè„u“\^uS nª*/΃Ž1ã†ä”v™À×GŸCÀyÔ{ 2<ÂIýüN,³•˜„_ŒžàÅ1b^4ôâ7ë¦\ÛG)ŸWÌU* „¸Ÿð "O$“>£X2·Þ¨º}¹aNšãÁݲàÏLÁ¤Ø®‚³`Ÿ°C¿Ã¾q;Œé);쑐Añ°L"oäfSâ~ÊåYp¡Ç.7£1†7¡?TÝ!g£§œÍÿ„ˆÉPȆŽö®˔gé¯b,dúÂd)¸ª7ڀvHûà2ä‰'âçG¶âD{}&DL§éJ4<Íì“ûJÔË*-m¿Â>³Ù˜ŸJC„Cr¬×¢Ðúé€ d$ +OužZ-»ÆÓ³ôÎ"ŠNvÎüSp~¼(N1('Ö1ÚâXÙ÷Š.^U¦—dr%“<™.¯Å,rŸî=e¦#S¬xªÛRŸD&7m-NrÂN~‘,‰;8ZOqýç^ä¢J—zM +† joܲšÒqë­ñöå÷aº_Ð PÐUµ4ÿ†Ãc">`ìåÚlC×N¿ýVÛhT¬ŒÃaxWSßùLÉ bZ„<ìæ5Õh/Ï +׬~-ê4’aH}ÛWüY6aTW¿áƒË‰GÉ8#_dfx%š‡"1$”œû›l«ÍÎKùK¬=r}Xv¤¢ÚÕ%@µØš…d1« ýUV…´¯Çîv‹4I+-{žµ²èI.mt‚'×{ž-ÐÁQ<Ë4?z⮨ô×Ӛ¬JóºÖüaNÝWÓ5>øl%‚¦à^Ľ–|~”֍îñÁð<2­ø¥‰RU؄½÷Sç¬íá¾»\öÄ(>ú· ˜Ï5çêt%ӎo` 0¾ä¹~¾À÷°ª5©à¢ÚTir‘²ó}÷†JZ­9m±Õ[ÖuïLCFÛIߚvúD2_göómÿ>€¼Fæ¿%dËv»mza~Z¸×? æëÿ­EõՔ1Û>ø‘çkn@RfgF u °ðœ˜—±_ʄȎ‰mè›ýìدï'*°wüBðB·È‡¦)//.6› ZÖh§e…Òæ¢,³‹ý4¹G2‰®  ½CV® [ÌNs\ñýÆ3Èÿÿe”i +endstream +endobj +10371 0 obj << +/Type /Page +/Contents 10372 0 R +/Resources 10370 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10381 0 R +/Annots [ 10331 0 R 10332 0 R 10333 0 R 10353 0 R 10354 0 R 10355 0 R 10356 0 R 10357 0 R 10358 0 R 10359 0 R 10360 0 R 10361 0 R 10362 0 R 10363 0 R 10364 0 R 10365 0 R 10366 0 R 10367 0 R 10380 0 R 10368 0 R 10369 0 R ] +>> endobj +10331 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 719.912 321.152 730.816] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_86f44d9d38638be46ef23422783f847e) >> +>> endobj +10332 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 669.103 226.666 680.007] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_ba65a2c1a6d563f5058479bc07181b9a) >> +>> endobj +10333 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.004 669.103 292.27 680.007] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >> +>> endobj +10353 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 588.34 154.079 599.244] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_d25e2d27e5d731e6b63fb84a65700faf) >> +>> endobj +10354 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.578 588.34 193.083 599.244] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_5d2c2fc2c077e77db657af49d332c9b5) >> +>> endobj +10355 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 551.543 167.639 560.39] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_d34bafd07f582c558936f9ea8892abd6) >> +>> endobj +10356 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 429.49 180.54 440.394] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_057c4f38d0e8b8a146af731dbd91864f) >> +>> endobj +10357 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.877 429.49 246.143 440.394] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >> +>> endobj +10358 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [315.548 429.49 353.814 440.394] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >> +>> endobj +10359 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 378.68 178.239 389.584] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_2a7c225e4f50e2287216dcd77eaf27d5) >> +>> endobj +10360 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [205.576 378.68 243.842 389.584] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >> +>> endobj +10361 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [313.247 378.68 351.513 389.584] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >> +>> endobj +10362 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.349 327.871 226.034 338.775] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_8691a3facce4d6f973b48743fa42ec42) >> +>> endobj +10363 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.176 327.871 359.442 338.775] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >> +>> endobj +10364 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.167 277.061 156.533 287.965] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_a55b32c299b7d7bec303f636b66ef624) >> +>> endobj +10365 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.599 277.061 309.948 287.965] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >> +>> endobj +10366 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [356.899 277.061 506.247 287.965] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >> +>> endobj +10367 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [435.185 140.686 513.996 151.59] +/Subtype /Link +/A << /S /GoTo /D (main_powerset) >> +>> endobj +10380 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 130.788 125.865 139.635] +/Subtype /Link +/A << /S /GoTo /D (main_powerset) >> +>> endobj +10368 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.08 111.106 366.346 122.01] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >> +>> endobj +10369 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10373 0 obj << +/D [10371 0 R /XYZ 90 757.935 null] +>> endobj +10374 0 obj << +/D [10371 0 R /XYZ 90 607.314 null] +>> endobj +10375 0 obj << +/D [10371 0 R /XYZ 90 607.314 null] +>> endobj +10376 0 obj << +/D [10371 0 R /XYZ 90 568.579 null] +>> endobj +10377 0 obj << +/D [10371 0 R /XYZ 90 487.697 null] +>> endobj +10378 0 obj << +/D [10371 0 R /XYZ 90 227.786 null] +>> endobj +10379 0 obj << +/D [10371 0 R /XYZ 90 177.065 null] +>> endobj +10370 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R /F35 2018 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10391 0 obj << +/Length 1724 +/Filter /FlateDecode +>> +stream +xÚåY[oÛ6~ϯP_6’º§inY´ÖµöІlщZITE*‰7ì¿ïP¤$˖§ëŠ{1ï‡ç|çJ[—¶~<úîâèä™ïXŠ|ê[K+ÂVàäQb]$Ö›ä:“)ÁÛ/'Ûq•Ç³—Šmž­®XRųŸÒyW«ÓS=­vÝ°J09ywñüä!kôIä Çwáö†ü™Þ2``D¨Ýq>B$B~ؑxr'‰ï³XˆÉ”zؾ˜DÔfy™Å’é™Wlɪ mV,`*ð¨k»$RD~¸8úxD€ ¶HƒŒ Àñ¬E~ô涘naäD¡uÓìÊ-—:ÐfÖë£_ðeoeê “ ‡©dU,y¥EñðÚV7@!%­(ÇÀ4q`?´ØµS%vì’ ‘Î3¦g%×mRñR¯óÂ,ÁM›óÊÌ$©x?!v :¶‹ô¤Ð o±‡ ݕž†nlnmïQ`ºq’èµy¼øÐ^•¤o1¦,Ñãë ñl0”î H mMœS0¸È3°dtí®ÓÓޞÕRª›Ç- hÎ.ÓB‘P77w9ro N)f¬H6ÏÂTrüƒn:ö¨ã“h3„pA^—&]ö¤Ó' [¦pž­€€ŒÓL¹7nPéȬA҆¾M-¨¨¤| !­N?Ò\lCÊ2Áv~ø05ÇhˆüˆÎý5b‘¸3pa]´n!cѧ“sÝäµ0UV\9Éuš° ×ڌ?ê“W<™>‰¡áÐðsa|5él¦ŒIC(¹Œ³™YK‹Ù|%™hU¾n¼ÛòO»[ÖPxÅd]FàX7YMáuaâO;:¹vtW1ª{iÑ àmlºƒZ³¸XÔeʒa+qâ&}¯S:ÿd`çœgÆ7ÄLòò3 7’-Àcû*FV5¡I}äâ.û§]@îÐÎ éò0LÌ¢ØÒR9Œèã:Ix§Åa±ÚÅê%,vÎ¥äù§`ëþ§°Õr~YxÇcñHÒZ}~»víÿ.ìDH´Ž½CM¤:=ÀjÄÍò¹n¦ÊI-ž1"Ž0C<Š<Ü]´ÚQ†„}2õ¨¿G:Š0§³¬el²ÏM°?Š—ÇFŒ‚ËuyÆÄ¡‘ÐÙ'ÎÔ%”šzÑ×;›<Š:>È¢ÞF冥Æpw²ä@R…²tK!dÝN¼²  ÷N±èkÙîòyË[@bMºWÝNf‹‚ÈzISý5_—%«fMöšANO/‹½^r k> endobj +10388 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10392 0 obj << +/D [10390 0 R /XYZ 90 757.935 null] +>> endobj +10389 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F65 376 0 R /F50 339 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10399 0 obj << +/Length 2594 +/Filter /FlateDecode +>> +stream +xÚÍZY“Û6~Ÿ_¡§]©ÊÂà$È©ÔV9ë8µÉ¦âijOŽKE‘˜7"©ð°¬¿ƒ—:ÏÔæE"Áf£»Ñýu£A<{œáÙ÷7ßÞßܾ Ø,BQ@ƒÙýÃ,Â3$(™Ý§³sBg‹%ÁÏß-žÇU¯Þ-(ž—ÛÃF¥U¼úw¶®âêpwg‡5Õ^Uµjï¸}KȈ?‰b‡Ù ûo,ÉD‚eQGñÆÃ$BAسøÇEÿÜÆu½XRç÷‹ˆÎU¾Ûƍ²#¿ªU-H8WECRP>çk¦7ßÝßüqC€ žc!‘db–ä7>âY +ã?Ì0bQ8Ûª|Æ)ƒÿíìýÍ/7ø¬•)C8#+#êìü“Ê× “Xòùa§Rõ`ޔI›«¢‰›¬,´”0ŒrÄx4ᅈãÖtê>µc¯EìÜZ€¾¼·crq® ‡™waúðÜÊDHJ1fh~u“ÞÝm³Úç5@A\-¨O4‰È ê)Éz§zW0ŠBqNê‰5|R/9(Är¶„e„8-þÄwwïÕ­ñhK)ƋÄA¬žôî*•4*ýhiÏÀŠ²¦—( Ü¾òÚzâ®\PÑ©oF2exœÒNªR;»±ý«;áÌ]é<[ÙwjÔyµ™Ó©|¿ÑÔf«&KÚm\Ùû/ILh›U9˜©áyÞ֍£lw»²r7àu üoÓ$ƒIí` +"˜°2¼²ÂŽÆłˆùÁM_ÖYG¢¥'ّù:N~·³¢†€Yöº–SóCž%2FPÓÀ¦/Ø"¤^?W¦ÑÙÀ& AŸD¶f˜5ªŠ›²Z5å*) o„€l&£«Ežú÷„‹Ðu'E%—BÝ.Ւ1i²ádždˆBúÒ OŽq÷¸/¢ Ä4¼^o³.Fʪ V󶤣·9G‚÷«\-˜œ«8]–Åöà™‹cX ÙQ¯³4«iÀÛã­ŠNN …ýo6Ò¬þo[$M= +#؍ÍÊÕ£KÏ¿~3û`¿㒥´yØ=w8caf +•h +pßt!ÌÛ:+íe³Ñয™Í88ú«Å277b뱑Øú6‰‹¢lìõڑ”R>éUí«¬iTḬµGµM7«rØãM¹T*1J}ØâT€ WͦLëÆ;Jx}ÔûdZ•»U§ÖoXàÁ@ž‰ÅüDqÜ;„FÏ«„¡ ñ:‘¥žc”Š +LÍðUuóÊJ;•jÃæ¢ÜXÒÞ¯¬î7ÙÖ9jÝd[çÒª¨ÛÊØ|”ð’²Òžoo6 ÷¶§èœúçÜ,õãBÌãe¥Ò69•–8žìÀ<%ä[m¨¬ ®+ëGö¢õ£ÀÄ_?†+{]aöŸ4ò–Yj9>KÑ:‘!}sQŸ@AΧ £j­ÌÕãqBŒ¸sß Z½AŸpþ¦½Þ8­ó®>§NÂFâQ"üàtÊ[äY ¾(üba4¨Ê\_…áôÐPtéaíÂzt„{ú6+ì\tb<©‹â>˜¡bbÉù˜Æ@ïS©)Ø0ì*Öñ§gu2†ó¢,–yü9Ëc÷¤«/íãºìèãÆ'§Þê~…œô‹ä̜q´tn¹#Ž(¥S¼ÒP¤q—¥žæҎB‡éú:šwc©J :¶éàHÞJ#Ùï£F~3‘˜QöDk•Äm­sƒ¸Q:µÚtSØYaþöqcgöc˜“4>ØÀ¿Gem¦‡‹úˆԉ½­Ô®RÎ>„é-Èž×=‚u út y„¨Ïái Eäü³®(©U˔%îvß'‚µ‹Uˆ£qêÅr¨ ¼Pþ²…> ý!N.ú„ÇçB`AÎî¦"œ@àÑnä +†½¡ª¦(ÀG!¹.!"Wq]gÅ€Â6†lÝy…n°G¼´àÏØüú›¥ˆÄ”B€ƒ‡GœŽÀϖGG¡Æ )¹&¿˜¤z\d¿6–taӔ¾` Ùs@0ìx0ÊN˜zÉ]¬êµ=%R”ȐÄÒ$ƒ´o_%P$ûuûŠ2U (U©ºÝ6§ªßomUÜ9ó‡H‚è ð×íµÖ‘_fcÐ¥º€&̏ºìEQWžB]v±g£>"×e¹µÜž qƒ ¨¤§——‰CÜUö°RŸãnõ' 7€ø8ß`zöƒ‡SØ{zÙ5ÐK¯^¨,“Á_z¿i¢ÉÁxÿw  Â1‡µM[µO2Hþ¬7jSµêR±‰ŽºScØÖAKýNäì¾ûœ¨®Œë»ÉË“©;‚Ius3ÕÖú 6oÏ?ÅÛ "°z4-ƒs-’Pw(Úî7•m¹T›yësð̀üEW³ê[ y æ\fERæ;Øt¬·ÊŸUtc@wŠ9€À4§ðÌ)„ŸèÙÃւ⳥<`ø~C؈ž=†›pô Eßù—æC·Î(z¡[ …x(_´[O¦çS!»Ò:Æiº*Êbµ.›¦Ìûææjgû>úìd6[-µê{AvûËi4Άúöýóe°ñ1KêÍ?£ˆƒÝnÄÃùôûÖ>k6– +¶j;{T7à[æñк4œ û߻Ԗh­š½R…Gi؀C*ð‰ø»¹”Mõ9Ž'*϶Í‘®M‹Ù¸‹¹ÑH‚yke‡¬r 27úéÓ©5d{Ótj·©}°Vv8S÷ò)Skªõ¡cç^ôÍúÐ¥ogSK•>GÒu| Î{Ž lAPª¯væã.OX7óäÕ¬£gУãkü†wýU0cŸ†}÷iý£>N¦›z.ÆKüu;6t:aGIXÀ‡²³éÎÀ˜+@MÆNºV/·‡ FE7ÛLj0‘ÓÛ§Zƒf'Òõ“ë6IT]?´ÛqMïÎÇÍqȤob'›ëÇߎ!DCxí§cæ“10cÈÊB÷ɘü¨µóN;º.ˆÜmWÙ[Wú؛ÿ@!ñ÷…s·óû).Úî$^—î<ºîÛêéý¬Î§È¶ÿß+唴šý>ë®~´g¶ƒ¼$”ˆ M…MÓìîno÷û=JjÔÙ®BYs»ÛmoŸn+F\ µËžIÿiB^võyVÀ`÷¹`lÿÿºE6 +endstream +endobj +10398 0 obj << +/Type /Page +/Contents 10399 0 R +/Resources 10397 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10381 0 R +/Annots [ 10393 0 R 10394 0 R 10395 0 R 10404 0 R 10396 0 R ] +>> endobj +10393 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [341.255 574.928 379.521 585.832] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset) >> +>> endobj +10394 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [156.603 545.349 349.878 556.253] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_386fa9c84bc37468f1a3a2b860a0bc3d) >> +>> endobj +10395 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.519 545.349 513.996 556.253] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_37703f96495cf4bcb8ced3ff20e4c396) >> +>> endobj +10404 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 533.394 216.526 544.298] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Powerset_37703f96495cf4bcb8ced3ff20e4c396) >> +>> endobj +10396 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10400 0 obj << +/D [10398 0 R /XYZ 90 757.935 null] +>> endobj +10401 0 obj << +/D [10398 0 R /XYZ 90 733.028 null] +>> endobj +10260 0 obj << +/D [10398 0 R /XYZ 90 714.318 null] +>> endobj +10402 0 obj << +/D [10398 0 R /XYZ 90 714.318 null] +>> endobj +10261 0 obj << +/D [10398 0 R /XYZ 111.081 639.557 null] +>> endobj +10403 0 obj << +/D [10398 0 R /XYZ 90 625.186 null] +>> endobj +10405 0 obj << +/D [10398 0 R /XYZ 90 520.118 null] +>> endobj +10310 0 obj << +/D [10398 0 R /XYZ 90 497.806 null] +>> endobj +10406 0 obj << +/D [10398 0 R /XYZ 90 497.806 null] +>> endobj +10350 0 obj << +/D [10398 0 R /XYZ 305.44 409.187 null] +>> endobj +10407 0 obj << +/D [10398 0 R /XYZ 90 392.759 null] +>> endobj +10351 0 obj << +/D [10398 0 R /XYZ 321.092 330.087 null] +>> endobj +10408 0 obj << +/D [10398 0 R /XYZ 90 313.659 null] +>> endobj +10352 0 obj << +/D [10398 0 R /XYZ 90 214.205 null] +>> endobj +10409 0 obj << +/D [10398 0 R /XYZ 90 199.934 null] +>> endobj +10382 0 obj << +/D [10398 0 R /XYZ 360.931 89.441 null] +>> endobj +10397 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F65 376 0 R /F50 339 0 R /F72 471 0 R /F23 340 0 R /F95 1788 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10413 0 obj << +/Length 2163 +/Filter /FlateDecode +>> +stream +xÚíZ[Û6~Ÿ_¡Å]ˆ9¼ˆ5h +¤˜MÑË"Ùdö) Dµ•%U’㺿¾‡"uóЖÓdÚ}ؗ]¨Ãsý΅Æ΃ƒï®¾½»º~é3'D¡O}çní„Ø |‚8%Î]â¼s Až·XŒ±ûzA°UÛhõzA±[d‡LªhõSz_EÕáæ捌q&Wßçå®Y,)ÇîÛ¦ÚÅæú\ËjA„+óXM"àÚ£dñáÞ]ýrE€+쐖  €q'Þ^½û€žÿà`ÄBáìÛU[Ç£ þgÎÛ«_á³Q†°Ï‰bˆ©¹-³¨‘Š‹ë—„Œ>ì§öh?üZ¯˜½°[ÐJ™G[y̽µäq¯[þ…0GÒ­ø¨^¤‰&8«~ýX­Ú˪–…"(âAxN¤) 6)F>9+ÆD-77Q’¬ò"_-ÕRgÉ +}<…ܘå¾hšb»JÒú¿»U =•wiž¥¹|¶XúàJeU42ndòAÈñèÃ%¥àNà²K ŸzšÀ‹$©5ËM¡?¢cŽCÏ–0³°¤Øî9j6imٝúÈÃdX$õ¦ºmT +°¤® MŽÂ@t ži‚Q]ï¶iþ`#È!çè äù=½Ô¨%/Œe{žµ§èk™É­Ì͊(OôEY)¿ù¨Øhï_ALî>,¸-«ÎöF0P0f1ÞøýÚbŒ ì1™7EÈý±œ ûn˖T¡Ž¹{/×E%õ‹(×ÿÓ|á©@P1G:ÔÚb­ß·»µO¶²Ù „Áڴѯ÷i–uÄíè»»²£WïâXÖõz—u˚]eÞ­+P|«5Óî-¤@–Ãýð¥S,öŸ‹)÷íX ¡%³`Œ {œ;à  ó“xãî·iè½zUÊ*jŠjõ¢®Ó‡Ü»ÀqÐË9҇ÒÁ>:ö9b°ÃƟ‘Zh€;«`O@J?ŸZè€)§R‹RK¥Õ>­å**Ë찊´òÀÉ&™áнD„€"o͓"xŸ'ÂT ¶Ta¢ßå`MUºúé°×÷ÂΓú,« Ÿóúz¥ÕË&[ªDéUP”J-,è,~Aº$$]*ÀŸŽÓeË̹ŒéyˆŠ'̘Zv™I8 +zÛÄ£|ϞôDõ39¡Îi6õñ#:¿î%æ@“÷Œ"ÒÜ¢‚CñÅ5¡²¬ÅÎ>䱧«“{”£!#SßµB21’…ZÙð´é^—Å‚ò.˜Û%½màmTIóÝ}¥ âæ*Õ©÷³â´ÕhëEá…fƒ +¢×`aXâÞMR?똊µßµ4ÚÀ* £ˆ‹-¤æÁÖZ.UºU‘*jö¦îRó±•7ÿ7àYQ%À@ª¬ùQ‰$³ÃÂç®­~X_€§¶2¢kS_V©Ì»ªúEW¾‘*y››—ªæí[ˆÛ"Þ)‹è¢J™ÊU¬CÊÓGä)ËÁíe +œMú\ôZ¿/ŠLS+ Ö?®ïǝ’ð.ʇ,D8¤3ùp´ù‰|ˆÙ,ÿÁL:$¬ßä׹Πü +º½¬üY‚v¶1†š—#ʏ +&›ÈªQðæê´a3«È múlpYò­tX³­§š’`Ú½i+ÿÚBÚRo°©vr1ÒõQ“VäÙÁ¤¯µe ð{úÈæ§ÛÅ3€œ¤)‘[å/;Gð'Êì`䐾<+!ú”`Á𩞆ε4ØãGXÁH{®‰±^_„ÐÞc1ƒ£Ííã‰yþý™Àá!ÿ¬ðü°Ç +†/ +à‚’ÏµEZè¿,èE`ý. ¼ÿƒÅфêK {BÔð½ÀêŠjÞ/Îw¬Pû„½~ë&¹¹)êFOc£­¦ü•þ×!‰ "@ȀœÛX§ Cà(:µ›¥uíe¨-”X—Âžx!3qozÐÚÆ!gÁ€Wй™Á(€ÿŒ‚á×Ïn_V0„Ð÷ M_íšþܧwn/ä±Ýý½§<”95ä(tæT†[ŽNe€b½Ju¥ëë/qFCU¹ë͝ÑС.?Qu"~3KãDÙ-<ú ©TO†)d`ü(Ž¾Àٕa;>iÞ\ Í5#…Sq&þÌdK‰€H£ÓP{ seéoҖq!Á0B'pݺ©¥g€ÇS‚ "Ö¡Œ;Lše=z(ªn<՝ÚÄYT›Ë}kzsó s… ]Þ-¦“­u‘ez°Ó߼ǘfò¦=&îÎyU¶öeЧ­¼§”OW½[r5h,3´Ùô¦ÒŽIͪËù)¼ëjšç \õÏ"Ê2 G˜AöÑìd˜œÜÊ&J³Îü·²Ž«´ìÆ.T5Çʸ[°,cŒvžÈ ‹QÃ9õ(Iëœk—Öý Ùõ‚¸Ò|¡jeÁ¢ª»÷Q£IT2V*eñH¢&ÒkôÇ»Jš¯Û:½TՒ¨u‰‡6juPÇ©›Â®2Júo:ÁF³À&ú¹ŠÈh¡(•‡³Þ÷Pá Bƾð÷íï(À> +ˆý; +"ΏáµRˆŠsۅˆ¾5q¢oþSËêª"0hð¯(ßEÙpŽ¯§UÝ# F +†"}¦óVJ#¤–ìg§»úñªõê_"q‚›¦)o®¯÷û=Šk´ËÓ²Bis î~=QۑÔj~:Œßz¤Û]õŸæðpõÊcýÿ˜rÂ+ +endstream +endobj +10412 0 obj << +/Type /Page +/Contents 10413 0 R +/Resources 10411 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10381 0 R +/Annots [ 10410 0 R ] +>> endobj +10410 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10414 0 obj << +/D [10412 0 R /XYZ 90 757.935 null] +>> endobj +10415 0 obj << +/D [10412 0 R /XYZ 90 733.028 null] +>> endobj +10383 0 obj << +/D [10412 0 R /XYZ 140.132 663.906 null] +>> endobj +10416 0 obj << +/D [10412 0 R /XYZ 90 649.743 null] +>> endobj +10417 0 obj << +/D [10412 0 R /XYZ 90 544.883 null] +>> endobj +10384 0 obj << +/D [10412 0 R /XYZ 90 522.571 null] +>> endobj +10418 0 obj << +/D [10412 0 R /XYZ 90 522.571 null] +>> endobj +10385 0 obj << +/D [10412 0 R /XYZ 90 473.33 null] +>> endobj +10419 0 obj << +/D [10412 0 R /XYZ 90 459.265 null] +>> endobj +10386 0 obj << +/D [10412 0 R /XYZ 90 412.062 null] +>> endobj +10420 0 obj << +/D [10412 0 R /XYZ 90 397.997 null] +>> endobj +10387 0 obj << +/D [10412 0 R /XYZ 90 350.793 null] +>> endobj +10421 0 obj << +/D [10412 0 R /XYZ 90 336.729 null] +>> endobj +1547 0 obj << +/D [10412 0 R /XYZ 90 242.836 null] +>> endobj +310 0 obj << +/D [10412 0 R /XYZ 90 234.492 null] +>> endobj +10422 0 obj << +/D [10412 0 R /XYZ 90 159.46 null] +>> endobj +10411 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R /F50 339 0 R /F23 340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10430 0 obj << +/Length 1587 +/Filter /FlateDecode +>> +stream +xÚÍXÛnäD}Ÿ¯°„‰éôÕm„„E,¬vÃSv9ãNÆ—ÁãI”¿§úÛãL²" ¢øÒ.WUŸsêŒqtáèçÅ‹“7 ‹2”%4‰.n¢ G2!HP]ÑeLâb¹"ãø|Ipœwu~u¾¤8n«‡*ºüê·òºË»‡ÓÓu¾Û\½WÅ~ݗm³ütñöä !ƒð””Ê ^n¢k—Œ2 QVœ‘¯—+*p|FgÂéh©[ûݳÑ~¬òÝÎÆ»Xf4Võ¶Ê{e¯¼W7ª[’4VÍ.˜SóÚÅO‹¿úE8"¦GB"ÉD´®—ŸpTÀõ·F,K£{³ªŽ8eð¿Š>,~_àa¿žô›2„a3¼Ø¸lŠv½¯UÓ禓æÒMÛك~Sº*v}½¶Ç÷f{܍[Õ¨J+Ü£][ûg•VU풊ø¾lní¥ÓJšŠ}ÊIgi È¸Íò#¥b¼êr%!Ûm…6›° žLªë\ù0Œ#’Ê×lþà%T¦ˆ +qˆ®ÁÍÆt/ÆE€×8 ×è™Á×4›ŒÑd 0xJÇ%LB/ÊxjŸ£Î¼`KQ*8ôŸ#Æ3€õ#¢·]»$"¾+ µ›ìuºfNkÕoÚâTn±môy×ZE[çeƒ\ýb†j$J¨Æe³®ö…šáª`H=&{3Œ”C(9/Pš$Ç8¿Ê$â„Aë("™#Öùþº*׶œwª¾V®ì7ûÆtf7Âód(J°b¹CâXæ dÐ'#i”B2 7(‡$8…¾s@‘ëû™ºÉ÷•Û­5Tct¶–£Ù¨O”ºòáA•2rœîw†©eáî͔ïp©+¿2 TOUFlò_ÅwWè?iMPԝÞLJ%“ñ˜íVÓPÄyï ˜±í– í6×u ‚ìõØ 'ÊðZõ÷J5:Yî¸*¥5}Àÿ˜:ƒœqà_»fTžÑš GySÌÄ! 1YXSй0É@ Ï“ È7sè /f됡)âI(õ#fxFø´¹xe +©˜2蜙 + Ë`Ï¢gˆ6˜iˆ¸©v¦ú¼¬ü†w¬»rë+Ðâ9Tõ~0-¦¢'–ä˜mµ«ت&¯ j±CFÒäòœ£"$C4“ÏXª”‡n逯áÁ†Éq˜>Vªk3Õã1¦7UÏæÄݝ-‘W8†¹[ò™¹Ó)k% ìéðpj3‰ÀIÞ¹EûÁõ­ý_Â|ț¾´ÖWßب# ΍4vðHU=ØTEÈwÊFxÀg¦'ñ­óÚChÝ6¿]jÅU»P¥1V¶ÊcêZö~/ÚzÛ6ZSÑ VðØXnRÇÍ9àx:òÞ3Lu͏07…Ç2ös³Cæ +,c=õௐdzsÜ`$gGùKQ Ï¦¬žà&â ¼²Œ£àŽ“TŒ7í¹A&%Mþ»ß~#I<=Ý›í¼ˆqÜƏ:*£ÄÂ"™NçñOg}äWèÃ3™Q9ÔO‡ôÃm⚉îCXtY6æӜªÑ„!øsZ"ŽØ£Ck4k‹_Ñ úÃAѧÛrŽ8OæüÐȺ§ò Ëã0¿CC¤G;AB¦cáýåÆe]B1® íͤ¼Ï­“pŽ$Nž¯4¤;0\]v¼ÎQ»ü4Ó[ö2ŸîUûX¨ ¯v­ƒŒê‡11±MS»DR˜q`R½–:ÑYëU·;}ÂwÙ˜"0C8I‡]{ò÷›6zKß;ü¶%lˆêŸÜ¬o&!G9¬\ÌnÿYÄvý_HŒ±DHèœDÂ>ùÌoEÛò_|*/ýTîL?²%`ØIúÒolþÛZ‚2 IØok"CBL:3SçîÔÏ9{ꆝ=ùc§º¯–BÄ®WïòfŸW3ãN‡؆¾c¤g˜–jí} Ë”·V¶²?#ôëÂ0ø1_’JÄ¿Mmú~{zrrÖ;´oÊm‡Êþwr³AÀ™ Aê¶så— \¬ Vдÿ›Hƒ2 +endstream +endobj +10429 0 obj << +/Type /Page +/Contents 10430 0 R +/Resources 10428 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10381 0 R +/Annots [ 10423 0 R 10424 0 R 10425 0 R 10426 0 R 10427 0 R ] +>> endobj +10423 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 549.723 188.41 560.254] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Smash__Reduction_a4959b6198e090d37abbd07085b74a30) >> +>> endobj +10424 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 510.495 197.875 521.399] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Smash__Reduction_8041e8b3420a554e9637e4dfcf43c2b1) >> +>> endobj +10425 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 472.015 196.159 482.545] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Smash__Reduction_a3b0210cf6bc4dc319d24d429518c61d) >> +>> endobj +10426 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.911 335.266 391.332 346.17] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) >> +>> endobj +10427 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10431 0 obj << +/D [10429 0 R /XYZ 90 757.935 null] +>> endobj +1548 0 obj << +/D [10429 0 R /XYZ 90 687.344 null] +>> endobj +314 0 obj << +/D [10429 0 R /XYZ 90 680.744 null] +>> endobj +10432 0 obj << +/D [10429 0 R /XYZ 90 568.324 null] +>> endobj +10433 0 obj << +/D [10429 0 R /XYZ 90 568.324 null] +>> endobj +10434 0 obj << +/D [10429 0 R /XYZ 90 490.734 null] +>> endobj +10435 0 obj << +/D [10429 0 R /XYZ 90 434.321 null] +>> endobj +10436 0 obj << +/D [10429 0 R /XYZ 90 373.278 null] +>> endobj +10437 0 obj << +/D [10429 0 R /XYZ 90 309.737 null] +>> endobj +10438 0 obj << +/D [10429 0 R /XYZ 90 287.425 null] +>> endobj +10439 0 obj << +/D [10429 0 R /XYZ 90 287.425 null] +>> endobj +1549 0 obj << +/D [10429 0 R /XYZ 90 99.766 null] +>> endobj +10428 0 obj << +/Font << /F63 374 0 R /F11 418 0 R /F50 339 0 R /F21 2111 0 R /F65 376 0 R /F72 471 0 R /F23 340 0 R /F95 1788 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10456 0 obj << +/Length 1349 +/Filter /FlateDecode +>> +stream +xÚÕXÛnã6}÷WèC¥Ó¼ˆºmn¶)°ÍiÖÍK²0d‰‰ÙêV]âu¿¾¤HʒbçÖt‹>’"r83眙‘¡ugAëçÙ»ålqæ+¡‡=kyk…Ðò=(FÖ2±®m„€ë9s!´/í¨Ê¢Õ…ƒ¡]¤» KªhuÎ×UTíNN–›ÊA]ÈuÛh2gŽ)´OÓ¨®Õí%»eÝ–Çâ-">!¶‹‰óyùaöÓröç Ç …:G¨|B­8›]†V"þÿÁ‚€„µíVe–Ø*®©õiöë N‚®‡”b&zô+D%BYœQ8H*´æØÄ Õé¿Õbu·±XÿÎâF[i6ÚòÅŹº‰£Ü¼ª +S{ëxÔêËèä»ê„ox§m¢}Ah°’à‹Bµð»¶D҅§zAY¦`³9`‡PˆmzÙÚΐJóÐ.Â֜`€|ͧ‹vòXEõ‘ek“‰³6^äuÇå$È. D21ðĵ3xƒ1í±®çTÀzÏ«¦Reý¾C–'z¡äWu§‰vÙmey•±©IùþR(þG8Û¨ÛïáhùÞ{[ðÞs¥÷ÒkW¤¹ DÚ{É-—ÚÅvʁ¶çHÂn Ä9KÔ#“¡|‰Y)³5d8èÑL΍3BA@ž—ÊÃÉ[œá!êÄ¡ /n 1¢Ø²'·¢Ô×c¹F¢epÐƙ¾r|×r"auSµqSå"dƒ#–Ç”&!€Â°KÂ᠖¤«É{ÖD<5`½gu\qÕѲ@ß®*LëÀrÃ;3XäUDōzZG5Sw±©bØ®7E›&z~ÍÇ£¼áQÃ̛º6›Âؐ\Õ6¶E÷lÖ)Z"ŠÙÿº[v)coÖUÁ{¼ žYUì‰fòdc{Çó^Deåßf ªc£¦ÖSy/ç¢1ºè¶%¬êWäï5¯êWí·CŽIì`‚%W]»1Ê8ÒêŽb´ÁªÙ•÷óçöÉn¾Æ­åi2m=÷#ÇE¥­Ë"OöN+óiT5¬æ¦[E_L4Âåy¢¦™^Vߤ ú1‚«#ï) ½0_8ûx b†÷¥>‚ÀQUõ£ç“å+q»dM[åSàö>\1B$ÊNó}CznO Dí0y~•äw}`µïÿOö®ißÒÓ¾èLE-5Ö ‡£ ¾çïGmHÉìuÒ "¥„Å? +_)&âJ¼×♱¬¨v«šÿÅ^€h×%Vz/ÏWë]3é’oˆkð®ƒ~%cè'M=†J·®œ×/ã¸-¹Ñš^‚¡h:nð/ƒ=ýÆ ºøŸùL÷Ë`‡ü”£H÷» ¥ÓaùB– 9=êG3>ªÇóá.?‹¾•ã·NäÇ(ï?á$ºjè«öÒµ,Ä)õ3¬R‘ýa™»_f]þöþ¢Àb“œMӔ'‹Åv»q ڜ—àÍBLy‹‡óÁÀŠ ßé¿Þ=?Ä?³îKáAþÿJÛ! +endstream +endobj +10455 0 obj << +/Type /Page +/Contents 10456 0 R +/Resources 10454 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10381 0 R +/Annots [ 10440 0 R 10441 0 R 10442 0 R 10443 0 R 10444 0 R 10445 0 R 10446 0 R 10447 0 R 10448 0 R 10449 0 R 10450 0 R 10453 0 R ] +>> endobj +10440 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.418 623.503 204.56 634.034] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Throwable_14c081beabe1e165b1dc44b2a84b6c2b) >> +>> endobj +10441 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.413 584.702 194.963 595.232] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Throwable_5024cc2b142473f5f733a8808cb09162) >> +>> endobj +10442 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 298.294 177.053 309.198] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Variable_1_1Compare) >> +>> endobj +10443 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 217.609 149.098 228.513] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_8dfe38ded52523b20209cce599411c4c) >> +>> endobj +10444 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.914 217.609 218.557 228.513] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +10445 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 178.808 179.554 189.712] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +10446 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.052 178.808 189.795 189.712] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_bb6a26c12f7bdee7504d577ca81992e0) >> +>> endobj +10447 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 140.007 179.554 150.911] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +10448 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.052 140.007 250.666 150.911] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_44e2225e59844067e005297572cd9ca5) >> +>> endobj +10449 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 101.206 191.718 112.11] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +10450 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 101.206 288.852 112.11] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_7102c6fe85d4c8e6939d29a047becbdb) >> +>> endobj +10453 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10457 0 obj << +/D [10455 0 R /XYZ 90 757.935 null] +>> endobj +318 0 obj << +/D [10455 0 R /XYZ 90 733.028 null] +>> endobj +10458 0 obj << +/D [10455 0 R /XYZ 90 642.077 null] +>> endobj +10459 0 obj << +/D [10455 0 R /XYZ 90 642.077 null] +>> endobj +10460 0 obj << +/D [10455 0 R /XYZ 90 603.395 null] +>> endobj +10461 0 obj << +/D [10455 0 R /XYZ 90 547.059 null] +>> endobj +1550 0 obj << +/D [10455 0 R /XYZ 90 422.373 null] +>> endobj +322 0 obj << +/D [10455 0 R /XYZ 90 415.69 null] +>> endobj +10462 0 obj << +/D [10455 0 R /XYZ 90 317.242 null] +>> endobj +10463 0 obj << +/D [10455 0 R /XYZ 90 236.556 null] +>> endobj +10464 0 obj << +/D [10455 0 R /XYZ 90 197.875 null] +>> endobj +10465 0 obj << +/D [10455 0 R /XYZ 90 120.272 null] +>> endobj +10454 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R /F11 418 0 R /F72 471 0 R /F23 340 0 R /F99 2117 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10487 0 obj << +/Length 1991 +/Filter /FlateDecode +>> +stream +xÚÍYYsã6~ׯàSBÕD4ÞN^²3qªrì83N^&)DÂ6wx…„|̯ß HJ²œñNÕ>؁f£ô×Ýqnâü¸ø×Õâì"òÔK#9W×NJœ8¢^Ȩs•;\J½ ^®(!Ľ\Râò®âëË%#nS>ފ¼ãë_ŠMÇ»Çóó?–)‚‚oJ±\±¸¯KÞ÷8|'®E·¤‰+ê ViÌ X°üëê§ÅW‹¿d"Õ2„±û¡“U‹'‡ùŸâùiâÜkªÊ ˜ÏÒy¿ømAŒ>ǞZϐŒô¤$ò?qbJ¶âôWÊbIC÷AŠ®æåÚ°(êõæQŠ~ÂÁÐÿIB ˜5u/gáóì"fNºEÒ1/ +˜&öÒÀ¨öNÈmWWÈ[ã%?ŽŠŸ(‹6×3j”ØŒyÍÕq¸QÿDn?Vâ]¤éHš$I"mLˆTQ8¢ +¼ˆÄ–FÞ=ÒLõRçÒÒx-±³ÈÄÛ+æG^†jà¥ôˆ·o7MSšù#~|ûóöÖë[‘©ûh\QWð²œùü÷N]- 5ï–~ìZsYô`t&òh2#—¶Ø “©ȅòNƒC‘?mÃf+Û­\_oëLM½E#«ö2??ozÙ ^á_õßì›ùÈN,)¥,Øâ«;í¶ÏôÕÕ2\%ü$hP=[{ïÈ^ù)ċ³ +|†>îñ^‚3äv¹Ý”vü«¨6ªz|aw™l2‡=D=í\ˆ¿'Úã¦OÚ6/*Q÷ýwô›Š?¬û–gb=|ýd8ýO6/ª­9EZŠåTB/×¹+FBA2qï{!ç¾=s†¤1 ÊPn{›²®>mWÔ²¨o^èøfó‘ÉþËAíØÛÏteÄcQ2wÎ-g‚ÅPû >½yþ¡y¶g) =5Ý3·mÀ?ë¬?‡ÕlÛaÒ«åñ³ðÙðûN”\Ú3ÁٙÁø0ðü µ–É¿)¬°\b÷Âæj3¨9TY¦ï2ǞIwPzazÊ÷è‰ì܊ŽKˆ ­#œÉqå –!ñøî»'óM !ŸîNÞÿQ._¥‰€§&gïíèØ((àÖvPÛ~1?]q–¢?Ú!ýò´µî–Qè~óB“ß¿$K¿ª6­mÏÁm|Kn*ÝFÇu.:…Í8c@ýÎÈôeU0jn=jÚÛ7Bò¢´aþFôYW´æžôï{ ԝ:NlÎÑõ‡–^1„X‰˜‘ì{`áDZI'f|OÍN 2Ý\užGO;OñèDÛéÞA½s|Œ49¸µ–Â6 ‰Á55[&M-Ž|÷šwÐ_ÜðåÚ"ýÎÔKCfÙç0D¸ôÃÈdp=Õã̆÷*/ª©MÙdÍ´jlÕ\Óå +UՔÊšLKÛ¢Ìqš[ YSµX´=àRYԂw¸ˆóÊj=Öô«ˆÅî<»Åu(ÁÂÝ%ˆ¡Ÿ¨¡zEV/°3:«öY?9>ê¦^Õz·›¥B¡B1Æ#¤W%D½ ŠAîðý`çQ0ŠZEZQãñzÖtðiÛÔùðíØa°%TÏ=.(ä>TZtˆÝs/â,¡6ƒ‘ z'].€ý$t¯t¨À¤-́|U𪣠+ž §æÖìÍ6vsÁÀ`XŸ„%¼ö®xnRÎÑÛêÜ|~@ߑÁXì'ßn¹:rwejÕPM,â#ÚëĖ•ºÃñ÷VC£Zl"‰#TÍ·ªù:¥ÂAë4ªÁûØZßÂT¢ôØê§xÍ ÄÚ'¶ò÷‡tމ¿_.LñP{°Ô‡:f('L)PØâþx‹f¯ˆ&»¥¤˜`¶[2"a}¸‹zœsé¡LŽ_6©ÄÉf'PžÆB=2SñýJð<Ã'uÜÁS•z· ?Z8œùðÈ#!/kR”øÞ·"Û!ÂÐÇÙîcˆ1#WÏ!­íµv'NCE¨…§ö§è¯Ûª`;‡ôá3ݓù”AË܉ëm‰dº3@*êVE_ +n¸#`R÷õ«W8(y}³å7†v†ÄŠ-¯T²Yià^(QUTiù@*^«”vðx«—Ø<ž@ÓX–b~oŠ’Äd®óƔØæŽՐ;†{ÐѹK©Çv7¡âÈÙ YhIxâi·X6ì4›ÎÈ c2²^ ‰DÅd¤.‹ël®œ¼W÷¿ ¾Œí}P·J&2õp@¦Ä ƒäš b:Àd@|Ʀ^„t;jņÛÑÊþR1ÂmUˆBښ֕óŸ("(liòÜ_(ì/ | ]þÒ¦^hkÑ++Ò¥î9ºÊ”—ög|5¿µàËï½è¾^BÍaÀòW^omݬò3&¶n‡™:7Ù| ž{/,` f;úy¡í¾“—&1xoê[)Ûó³³ûû{/ë½m]´Wȳ¶-ÏöÂ8u»;…áök/¼Ð†ÉŠï÷ë`ÿÿ«–²• +endstream +endobj +10486 0 obj << +/Type /Page +/Contents 10487 0 R +/Resources 10485 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10498 0 R +/Annots [ 10451 0 R 10452 0 R 10468 0 R 10469 0 R 10470 0 R 10471 0 R 10472 0 R 10473 0 R 10474 0 R 10475 0 R 10476 0 R 10477 0 R 10478 0 R 10479 0 R 10480 0 R 10481 0 R 10482 0 R 10483 0 R 10484 0 R ] +>> endobj +10451 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 706.961 191.718 717.865] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +10452 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 706.961 303.079 717.865] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_49b4a338d3d82bfb7a404ea87481fc4d) >> +>> endobj +10468 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 668.48 150.493 679.01] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_ed0f237309569c2bfbf9e6f60740974e) >> +>> endobj +10469 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [166.284 629.252 254.064 640.156] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_0431b025f2e3c1b5d3cef06c4054f726) >> +>> endobj +10470 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [349.206 629.252 384.393 640.156] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +10471 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 548.49 203.075 559.394] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +10472 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.573 548.49 296.324 559.394] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_a5f2c0410e128e2f082d761ef36820da) >> +>> endobj +10473 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.005 533.869 309.384 543.774] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +10474 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.437 509.635 239.129 520.539] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_5012c55d8fdb1420b80a3bfbe5a5b843) >> +>> endobj +10475 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [297.206 495.015 329.585 504.92] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +10476 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.182 470.781 315.981 481.685] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_75683687bda865c93db529b76271bed2) >> +>> endobj +10477 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.349 362.74 226.034 373.644] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_56a9fd5bee6f87ae9079aed0bc3de31a) >> +>> endobj +10478 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.176 362.74 356.363 373.644] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +10479 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 324.259 151.051 334.79] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_d71d7986fdfd19215fc87726ebacf555) >> +>> endobj +10480 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.866 324.259 190.054 334.79] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +10481 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [199.867 324.259 235.055 334.79] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +10482 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [184.141 223.815 219.329 234.719] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +10483 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [296.006 146.414 331.193 157.318] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +10484 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10488 0 obj << +/D [10486 0 R /XYZ 90 757.935 null] +>> endobj +10489 0 obj << +/D [10486 0 R /XYZ 90 726.054 null] +>> endobj +10490 0 obj << +/D [10486 0 R /XYZ 90 687.2 null] +>> endobj +10491 0 obj << +/D [10486 0 R /XYZ 90 648.346 null] +>> endobj +10492 0 obj << +/D [10486 0 R /XYZ 90 567.464 null] +>> endobj +10493 0 obj << +/D [10486 0 R /XYZ 90 567.464 null] +>> endobj +10494 0 obj << +/D [10486 0 R /XYZ 90 528.729 null] +>> endobj +10495 0 obj << +/D [10486 0 R /XYZ 90 489.874 null] +>> endobj +10496 0 obj << +/D [10486 0 R /XYZ 90 408.992 null] +>> endobj +10497 0 obj << +/D [10486 0 R /XYZ 90 286.566 null] +>> endobj +10485 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F99 2117 0 R /F65 376 0 R /F23 340 0 R /F11 418 0 R /F8 504 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10509 0 obj << +/Length 1562 +/Filter /FlateDecode +>> +stream +xÚ½XɎÛF½ë+H$Øêé…ÍEqÄËpldb+¾Œ #¶FD(R&)Kòק؛HNK^¹ ‡d³ºêÕ«WÕÂÞ½‡½—£§óÑÕuÀ¼Å ¼ùʋ±qJ¼yêݎ A~4™ŒñøfBð8©6ÉâfBñ¸Ìk‘VÉâuvW%Õq6{?‰),Ȓ»\ÌfÏÊÍ6©&$‹É”r<~×T»e£þ+VB½+–ð:q8ö)Ÿ|œ¿½˜>8ˆ="â! +÷–›ÑíGì¥ðü•‡‹#o/Wm<Ÿ2¸æÞ»Ñß#¬ƒ^U°Ü ìFd°1âï…”! /dÀïµÿ“i!>`Ž1ü!¿¶®iŒ|øƱöØ®%Ö:í~¹h÷uVˆ¤Z¼8l+Q×YY¨Q×ß´oêòHïîÚôœ!Ú3tìú" h1UHME$öOÔÕäxVµÌoY© ÿ¬.ÏEÿñór¹Ûˆ¢IšÖí2õóãžYD~ŒuÝ;ØGxÜbf°i‹À¢9n…Š0æY€"ðFz‘9@ ( Íû6uzI× +8QbÝfEx,ܲ#ÆÞÅO(ï„ O–eÉޖEš÷zu9øêYR5¢Î’BÝ&‡LÛ-Wêš©˜{#å‚"ÕóœC‰Y¨,jS…Cbр¢Ê¶EáÀ‹ÃRl[‚Ô³ÞÇ'#½Ü‘…¸qMýºIg³\÷Íz!ª +è×÷¢ç/d†žž¯«²…u¯áÉV|ŠX`3="(FJ˜Tª% K! ‰Ê—Vߪ{-to_Ž[0†¢Ð~þÞR|“õ6YŠ…euKqCÉsA’ˆ#†y/-Ãl°Ð©.tÞ­H¦ëñØÜ ]Ì×»b)ëø{J›ÙÒå”ø4øÞzï1!ãÖiÇB¢n—­>9òˆu=ò^É^*G½ò­hvU1¬GR¿ž:õ +$'9”î«¡æeÝ­Ü›ö¤‡`Dü“ø`æ¢$Š#ËÈfÕ.J2“ E,F˜‘¾Ú̍ǕŒS¤]½ÉwúeöTŽiÙTKêä+¼q–½ ‚‹¼%”"`™ƒ¶¾æÚu•‰ÂÈçEjƐ‹äTÂÍÀûêÊI°dê¶Û­×6%ªP…¢6Ã@& ÿÇ#•³uåëiVÀêS8¤Ù€ÓIPi>͏½È´£ÝvòþSMo— +‡,r†ÂØJÞ‡-8B0zA7 =;²{ØÂøÝy¸Š%´º¹ÙÝÁ`®¢r<õÅQË°‡¢ÀœÅαGʌ»‰ÂŠ®ŽišV˜ÎZq!„tÕeøùáñe¾jà¨F-uѓ–cl©JíAf@ÇØ .¾ßŸªL¶O«L@Ìæx¯IÓ7 ¤éLåzúJL»/‹üø`¦?} òQ;hö[êÚî´,7F ïD«R, —ÙöDnµûè0 ƒyä>. ¯ÃßF0B¢oýiDþL à|;ªß{8œíùpê»içÔV˜ô­Q&u«åIÝüS‹ê—¶Çj,Þ$ÅΨDKK5òV§¡‰m ƒ&SøNN©Èþõ̪Aòä/¨(bl +ÖM³]]í÷{´¬Ñ®È¶ʚ+ƒ«‡õÙ±” ­Û`6eeæÚndêçðÿ´šÒy +endstream +endobj +10508 0 obj << +/Type /Page +/Contents 10509 0 R +/Resources 10507 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10498 0 R +/Annots [ 10501 0 R 10502 0 R 10503 0 R 10504 0 R 10505 0 R 10506 0 R ] +>> endobj +10501 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [278.651 550.451 465.948 581.295] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_a5f2c0410e128e2f082d761ef36820da) >> +>> endobj +10502 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.628 447.64 201.531 457.483] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable_bb6a26c12f7bdee7504d577ca81992e0) >> +>> endobj +10503 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 148.353 175.937 159.256] +/Subtype /Link +/A << /S /GoTo /D (structParma__Polyhedra__Library_1_1Variable_1_1Compare_f6c069432956f215967c61be24a40939) >> +>> endobj +10504 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.753 148.353 214.94 159.256] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +10505 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [225.401 148.353 260.589 159.256] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +10506 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10510 0 obj << +/D [10508 0 R /XYZ 90 757.935 null] +>> endobj +10511 0 obj << +/D [10508 0 R /XYZ 90 669.41 null] +>> endobj +10466 0 obj << +/D [10508 0 R /XYZ 90 646.168 null] +>> endobj +10512 0 obj << +/D [10508 0 R /XYZ 90 646.168 null] +>> endobj +10513 0 obj << +/D [10508 0 R /XYZ 90 536.877 null] +>> endobj +10467 0 obj << +/D [10508 0 R /XYZ 90 514.441 null] +>> endobj +10514 0 obj << +/D [10508 0 R /XYZ 90 514.441 null] +>> endobj +10515 0 obj << +/D [10508 0 R /XYZ 90 434.066 null] +>> endobj +10499 0 obj << +/D [10508 0 R /XYZ 90 410.693 null] +>> endobj +10516 0 obj << +/D [10508 0 R /XYZ 90 410.693 null] +>> endobj +10500 0 obj << +/D [10508 0 R /XYZ 90 373.407 null] +>> endobj +10517 0 obj << +/D [10508 0 R /XYZ 90 358.837 null] +>> endobj +1551 0 obj << +/D [10508 0 R /XYZ 90 272.399 null] +>> endobj +326 0 obj << +/D [10508 0 R /XYZ 90 265.799 null] +>> endobj +10518 0 obj << +/D [10508 0 R /XYZ 90 167.326 null] +>> endobj +10519 0 obj << +/D [10508 0 R /XYZ 90 167.326 null] +>> endobj +10507 0 obj << +/Font << /F63 374 0 R /F65 376 0 R /F95 1788 0 R /F50 339 0 R /F23 340 0 R /F11 418 0 R /F72 471 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10545 0 obj << +/Length 1647 +/Filter /FlateDecode +>> +stream +xÚÕY[oÛ6~÷¯0 µ€šáEÔ%+ô²½aY“uma(•%’ìf¿~G"EÛ²ìܓí!±-Q‡‡çûÎáwDlYØúmôòdtðÆeV€—ºÖÉÌ +°å¹qJ¬“Øú2&9=!ãñ‘Mð8”ópzdS<ÎӋsËpú!9•¡¼8<ül$ái*Ê鱨ì åxü* ËR}ý$fBÚÄ‹,`–r0äP×þvònôëÉèïÇ°EZG¸‡<Æ­h>úò [1\gaÄßZ¶£æ–C|¦ÖñèÞ»(ÊvùjQ>"zY¯E&©ˆ•‡¯Eɤ¨’M“H­ë£˜Ÿ +Í­7u5”+7ðíEr>ßÁ •ìòLgý'ÒÏ6!dÊ—9†?Ò³ÙùTôÁ×iü¡¹,0¸Ät×I—=ҋyQé¤ÞF\{´†5ñ‡Æy˅¡™t¾ÀgÀî/4@ÔÝ0Ö Û06dçÉâÎ\B1IEՕ¬­ ¯…U]€u@n‹i—«i‰ë Çp{’x=EÔ3ùòó5Q#bùŸÀf»|üÌÄïö—wσ]ٵԁÛ;ؐd=;²)µ!v‡n㒶ÃÇ°Ÿ ð%p÷Ý«Ónl•Ø %¦D/¯C¿k²/`ˆÑoƾ8¡PB͞V…¸ü™Ÿ"ŒÄÔ<¹·oñìÚù$ªZf}Ž¬fß`ʊCó0Âh"-DTu¨õ^WtØ`óÒHx¢gÅO«¤ó¼;ØJ›ycÑ£¢MÆk¬¾ûÍ@£¸heOïÏå$+…ÜY]v>{y ¸ÕVð¶õª¯‰ï@%X¤b(1EÄ3é;e¶29›dµ[uçzÈ[‡9W‚è4ÏÓýð„e”$Ó4ã]µj3Ý.B­ÈŸ”· ý˜« ¼KöF‡!â°.nå``=j„™²øâøÕÛ·ÍW:V©Q¨r­1aͺBíD¡œˆë¨í=àÊ骘e³¸ž&>9ħ(œ?Ñ% m— +s;Ìbå*p@¯0Ö 4vQ@ » ÙaC‘B.6%¿m´¶c5a.ƒZ :ÝO„Q”·^Ǎº°9‡]476åo{6ÏC qÌt²ÓA »!½N£²Ž"Q–³:}6´ zb³ÖY˜–ƒ– …±œCÉeR¶=Î5ëÆÈónºÍÅ<—Ó2ùG\c k»í©~6ɦ§•(e#[ëû›5lîÊ­áN9¯oFQ]$]Ç` + vÿ '7+œƒ,òkÕvWBfÿÈoŽó<ÌÂFÍ*I»nâC¯Ô츽+ÀMoˆ6s‘Ïù폿¿¿g´^‹¨Ñß»†b¶KnŽ#Y5$KØáÊ敘ˆYô­vÈ{ŽÞ_21$lˆ eò ÙÚ­:R0Žcäò`CO€ÍNO´Ý=¡òg;9+‹Uû@-zÜ{Pl"ê+ÆÇ{‡'ó=Ö<âÈŠÜʅ„^垓÷¨™cHøRg]dÞ&s!zõ&—Õcª.‡_ÿµG+yZ4'¹¶ø›í f†4ϟLHÄ¿ú§U.˜e]ñ°ª=¤BA·á1_RñqÞ?ã9j_nÉy¨v‡ê§>ùP?þ„ûiÓRèlýfu§9-Ú# ¹z›‚ô&´¡–nBŽE§µÔʾ[Ý·÷£6î+‰ï!†MòœWUqxp°\.QT¢:K +‰’ê (҃íC‚5+rÏ1‡W „Ì çmAØÄâÿ/èüB +endstream +endobj +10544 0 obj << +/Type /Page +/Contents 10545 0 R +/Resources 10543 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10498 0 R +/Annots [ 10520 0 R 10521 0 R 10522 0 R 10523 0 R 10524 0 R 10525 0 R 10526 0 R 10527 0 R 10528 0 R 10529 0 R 10530 0 R 10531 0 R 10532 0 R 10533 0 R 10534 0 R 10535 0 R 10536 0 R 10537 0 R 10538 0 R 10539 0 R 10542 0 R ] +>> endobj +10520 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 528.366 170.687 538.896] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set_da205f4442f845f797fb108c121fe371) >> +>> endobj +10521 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 491.473 170.687 502.003] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set_6faffe6889615dc0491bf86dd601172c) >> +>> endobj +10522 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.024 491.473 233.211 502.003] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +10523 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 454.58 170.687 465.11] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set_5842c4add70aabcc093269aea7a348e5) >> +>> endobj +10524 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.024 454.58 233.211 465.11] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +10525 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.297 454.58 309.485 465.11] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +10526 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 417.313 179.554 428.217] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +10527 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.052 417.313 250.666 428.217] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set_3d49b2488d36bda4fef0109bedf6b0cc) >> +>> endobj +10528 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 380.794 158.044 391.324] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set_7176b36adef9683aae06961175ad94cb) >> +>> endobj +10529 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [161.86 380.794 197.048 391.324] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variable) >> +>> endobj +10530 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 343.901 176.505 354.431] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set_4090b6696c19cb93c705d9a9e06f4915) >> +>> endobj +10531 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.408 329.887 450.955 339.793] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set_4c3c15515e1335fb69130aad4f371a1c) >> +>> endobj +10532 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 295.676 191.718 306.579] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +10533 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 295.676 288.852 306.579] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set_32b7f9e0a2f54d199ad55bc008bfa62e) >> +>> endobj +10534 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 258.783 191.718 269.686] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) >> +>> endobj +10535 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.216 258.783 303.079 269.686] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set_4e8f85cded8a6be1916c2cc0bb31c540) >> +>> endobj +10536 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 222.263 150.493 232.793] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set_3a5d4b3fb638414792155bcef8b54c1c) >> +>> endobj +10537 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 184.997 181.845 195.9] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set_0b93ff227453cf62d922dab902055f8b) >> +>> endobj +10538 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 148.104 181.845 159.007] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set_4c3c15515e1335fb69130aad4f371a1c) >> +>> endobj +10539 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 111.211 154.727 122.115] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set_ca3690ce9d77a85740cdf8a508edf127) >> +>> endobj +10542 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10546 0 obj << +/D [10544 0 R /XYZ 90 757.935 null] +>> endobj +10547 0 obj << +/D [10544 0 R /XYZ 90 733.028 null] +>> endobj +1552 0 obj << +/D [10544 0 R /XYZ 90 653.216 null] +>> endobj +330 0 obj << +/D [10544 0 R /XYZ 90 643.575 null] +>> endobj +10548 0 obj << +/D [10544 0 R /XYZ 90 545.986 null] +>> endobj +10549 0 obj << +/D [10544 0 R /XYZ 90 545.986 null] +>> endobj +10550 0 obj << +/D [10544 0 R /XYZ 90 509.212 null] +>> endobj +10551 0 obj << +/D [10544 0 R /XYZ 90 435.426 null] +>> endobj +10552 0 obj << +/D [10544 0 R /XYZ 90 398.533 null] +>> endobj +10553 0 obj << +/D [10544 0 R /XYZ 90 361.64 null] +>> endobj +10554 0 obj << +/D [10544 0 R /XYZ 90 313.788 null] +>> endobj +10555 0 obj << +/D [10544 0 R /XYZ 90 276.895 null] +>> endobj +10556 0 obj << +/D [10544 0 R /XYZ 90 240.002 null] +>> endobj +10557 0 obj << +/D [10544 0 R /XYZ 90 203.109 null] +>> endobj +10558 0 obj << +/D [10544 0 R /XYZ 90 166.216 null] +>> endobj +10559 0 obj << +/D [10544 0 R /XYZ 90 129.323 null] +>> endobj +10543 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R /F11 418 0 R /F72 471 0 R /F99 2117 0 R /F98 2120 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10567 0 obj << +/Length 1297 +/Filter /FlateDecode +>> +stream +xÚ­W[s£6~÷¯àik¦E–áIv7M§Ûn›&î¾d3bË1S..àxóï{tÃ@ˆ“tú aq.ßùôé;÷v~ž|XLf¡ïÄ(iè,6NŒ($ˆQâ,ÖÎ͔Ä®G0ÆÓK—àiRåÉòÒ¥xZf[±®’åoé]•Tóù7¦° Mî2Q/¯Eãz”áéÇ,©k=¼Q¹„OE±`–20ÐȽ]|šü´˜ü3!vˆ +„E(ò™³Ê'7·ØYÃûOF~̝ƒZ•;õá™9ד?'ødRÔG8d:©ë&iҕŽèr—Ùñg‘ßAxj|±/VMZµ +Íڞ]0Ü1LBøÜñ(E¡5þ•RÖûƹñ Wk§ú™auoR½Rk¤Óuš‹¢¯Ëæq'zVžý&O¾-ë]²Ëöë¡{¹ì+fþÈÀ¨M+¢‡´Â@¦%Ó ¨ã‘ÅA Óº;*L›­p­ó4ßçz¢¢pû‰èir:í/.!¤Oœ‘ V‰±¶MŠu&\¦è™lzÕ÷üa(Rà#Â|›M–4b=RêA…17@~›âŠ¿—°0$M Hm^&•¥ù1ïÐjc}¡'Å8²‰!¿È¦õ|^ÖM%ƒþ»Ó—;Q%MYé é²2˜ÂÊåÙÙIÊG(æ±]+ñ ¥þAVhóÔþÝÃk¹ëÅP®yÿØ7»½©†BrG!}ÿg)mDĨã¹h’4³œ:õªJwÙ§YõÞ[!Y[Ù,7úùàRÖô~—kµ¾É¢FÚG/bðáSD,‘t°ÔûQ¦Ú¯$†=6ìÞëórµ‡,¥K'2 ݘmQxû1zlq¨¸¥ ÓhÚ]¥ß¼ÓYC†Ç¬}N‡¡áçÃ0Ò§†ZDDG¦jŽ¥ªËÇ©³ŸQäûaÿì$H8bQ8zä¼=UĈ £×#Æ}Ä£§¼0°b¬lŽœ Ϲ"8D1Ž_-ýGÒô 6>mé¦ÒEºÓi?„£'ÆˆññVCáÎL«*«ØU©–‹ë^½µÛ3Øèƒl§Ž©ƒ:gÍä^ґ¥’’î¾°oÊ,+¥DÒâÞ5L31?т§[ÐÝ.CÛmï—á .„¾Œð×^àÔÅ †2F„¾¸1€– áºT tfjÛ =5½†žüU‹ª{~NŠ}’¹íèA‰cu¼«`$$I#×ÂÞÄtf;vôëDqç/ÖÁ?vÒÛ¦ÙÍg³Ãá€V5Úé®Bi3àfO[ìŽh]£ÖH˃¼´7‹´€—¹â +âÿ/â•ñ› +endstream +endobj +10566 0 obj << +/Type /Page +/Contents 10567 0 R +/Resources 10565 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10498 0 R +/Annots [ 10540 0 R 10541 0 R 10561 0 R 10562 0 R 10563 0 R 10564 0 R ] +>> endobj +10540 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 697.247 203.075 708.151] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) >> +>> endobj +10541 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.573 697.247 296.324 708.151] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set_587efac6e5a2fbde0a1866dbe4427224) >> +>> endobj +10561 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.005 682.627 328.312 692.532] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +10562 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.349 589.206 226.034 600.11] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set_d7bdf8849f22908ce11574a04ba875df) >> +>> endobj +10563 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.176 589.206 377.952 600.11] +/Subtype /Link +/A << /S /GoTo /D (classParma__Polyhedra__Library_1_1Variables__Set) >> +>> endobj +10564 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10568 0 obj << +/D [10566 0 R /XYZ 90 757.935 null] +>> endobj +10569 0 obj << +/D [10566 0 R /XYZ 90 716.221 null] +>> endobj +10570 0 obj << +/D [10566 0 R /XYZ 90 716.221 null] +>> endobj +10571 0 obj << +/D [10566 0 R /XYZ 90 635.459 null] +>> endobj +10572 0 obj << +/D [10566 0 R /XYZ 90 551.886 null] +>> endobj +10573 0 obj << +/D [10566 0 R /XYZ 90 495.243 null] +>> endobj +10560 0 obj << +/D [10566 0 R /XYZ 90 470.874 null] +>> endobj +10574 0 obj << +/D [10566 0 R /XYZ 90 470.874 null] +>> endobj +10575 0 obj << +/D [10566 0 R /XYZ 90 377.483 null] +>> endobj +10576 0 obj << +/D [10566 0 R /XYZ 90 355.171 null] +>> endobj +10577 0 obj << +/D [10566 0 R /XYZ 90 355.171 null] +>> endobj +10565 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F72 471 0 R /F11 418 0 R /F95 1788 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10640 0 obj << +/Length 737 +/Filter /FlateDecode +>> +stream +xÚí™]o›0†ïó+|™H µmB/Û­Q§nC].*U“倛²SÙdk÷ëk·‰4 ߬h» +$pü俯‚€`>‚[Ÿ'‹Ñѳ"–M‹àBà@Ç"4= Àõø\ò~òiñö÷MGg×rfÙ L1´a×‹¥PA¬¸œ :¾¿“Ê„LÇ_³SÉý8ºÛ$" ce² ¥0S„,—ÒÇžwÁO¯®x¨©o&Ž…/_=1@€€Î@²ƒËù\O1…c6Ë1¦wKÅ1áJí;ã:܋×·2Ђ_„K-ôÃññé­ô¿d<2àï7ÑRê½T?c³|lD]¬ÁüÇÏÓ´d׬ÊÿTŒ`~øëqAR1B[À¶kÍ(ÚÊj¤uU+½‘Ê—õ2{òš¼wEUví<¬2D|_a§~ø¹ƒ¢tÚ¨~ü~"V±ë‚Díª¼ ݦïéÇ$ëõŸþ©òVKlüTžŽÓƒ¤ #¶Ý,NmÂÈä“gôMêô²" ƱR@_Ūh,·”gåÔÅSsåQ¨Â(üþr¥VJ ¸~ü«æ¦Û:Óa[*þo©ùFà ,•¶)/Ñ!y±òêÑSYÇb°_Ž§:½y*¸¼§šD‹ôºKíz‘úñߝ{™O-×2ª¶7™Ñ¦&QËÍé/7Ÿuàæ϶ÛÛÌ"ÐtF­´[l™iC©ÓR'́J·OeZµ¼Ô÷Ø;`ËLÚµ÷¡ÔÜ©\sÓmÉ°ýöàï[Sa¿Ó +ý@%§¥ü¶Ñ­Óºõ¶ÜœÕP6íQÙeVÝ-e÷hçäåêpÈEwK=Íçò“zEîzÁÛ÷$|%•Ô"‰õslÖ㲸‹¨ét‰g:F"VF*HûK|©»šh]=\+ ÔÂ> endobj +10578 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.819 672.615 208.774 682.802] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +10579 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 638.09 145.791 646.937] +/Subtype /Link +/A << /S /GoTo /D (page.157) >> +>> endobj +10580 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 612.84 145.791 623.026] +/Subtype /Link +/A << /S /GoTo /D (page.210) >> +>> endobj +10581 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.78 612.84 165.716 623.026] +/Subtype /Link +/A << /S /GoTo /D (page.211) >> +>> endobj +10582 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 588.212 280.116 599.116] +/Subtype /Link +/A << /S /GoTo /D (page.93) >> +>> endobj +10583 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 576.257 258.537 587.161] +/Subtype /Link +/A << /S /GoTo /D (page.127) >> +>> endobj +10584 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 564.302 260.191 575.206] +/Subtype /Link +/A << /S /GoTo /D (page.231) >> +>> endobj +10585 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 542.329 145.791 551.295] +/Subtype /Link +/A << /S /GoTo /D (page.309) >> +>> endobj +10586 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 517.198 221.606 527.385] +/Subtype /Link +/A << /S /GoTo /D (page.339) >> +>> endobj +10587 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 493.288 187.046 503.475] +/Subtype /Link +/A << /S /GoTo /D (page.366) >> +>> endobj +10588 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 480.615 287.867 491.519] +/Subtype /Link +/A << /S /GoTo /D (page.398) >> +>> endobj +10589 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 456.705 280.116 467.609] +/Subtype /Link +/A << /S /GoTo /D (page.93) >> +>> endobj +10590 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 444.75 260.191 455.654] +/Subtype /Link +/A << /S /GoTo /D (page.232) >> +>> endobj +10591 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 421.557 187.046 431.744] +/Subtype /Link +/A << /S /GoTo /D (page.366) >> +>> endobj +10592 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 408.884 287.867 419.788] +/Subtype /Link +/A << /S /GoTo /D (page.398) >> +>> endobj +10593 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 384.974 280.116 395.878] +/Subtype /Link +/A << /S /GoTo /D (page.95) >> +>> endobj +10594 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 373.019 258.537 383.923] +/Subtype /Link +/A << /S /GoTo /D (page.127) >> +>> endobj +10595 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 361.064 260.191 371.968] +/Subtype /Link +/A << /S /GoTo /D (page.232) >> +>> endobj +10596 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 339.091 145.791 348.057] +/Subtype /Link +/A << /S /GoTo /D (page.309) >> +>> endobj +10597 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 313.96 221.606 324.147] +/Subtype /Link +/A << /S /GoTo /D (page.340) >> +>> endobj +10598 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 290.05 187.046 300.237] +/Subtype /Link +/A << /S /GoTo /D (page.366) >> +>> endobj +10599 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 277.378 287.867 288.282] +/Subtype /Link +/A << /S /GoTo /D (page.401) >> +>> endobj +10600 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 253.467 280.116 264.371] +/Subtype /Link +/A << /S /GoTo /D (page.96) >> +>> endobj +10601 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 241.512 260.191 252.416] +/Subtype /Link +/A << /S /GoTo /D (page.233) >> +>> endobj +10602 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 218.319 187.046 228.506] +/Subtype /Link +/A << /S /GoTo /D (page.367) >> +>> endobj +10603 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 205.647 287.867 216.551] +/Subtype /Link +/A << /S /GoTo /D (page.402) >> +>> endobj +10604 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 181.736 280.116 192.64] +/Subtype /Link +/A << /S /GoTo /D (page.93) >> +>> endobj +10605 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 169.781 258.537 180.685] +/Subtype /Link +/A << /S /GoTo /D (page.126) >> +>> endobj +10606 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 157.826 260.191 168.73] +/Subtype /Link +/A << /S /GoTo /D (page.234) >> +>> endobj +10607 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 135.973 145.791 144.82] +/Subtype /Link +/A << /S /GoTo /D (page.285) >> +>> endobj +10608 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 112.063 145.791 120.909] +/Subtype /Link +/A << /S /GoTo /D (page.308) >> +>> endobj +10609 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [421.151 684.571 438.087 694.757] +/Subtype /Link +/A << /S /GoTo /D (page.339) >> +>> endobj +10610 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.59 660.66 403.527 670.847] +/Subtype /Link +/A << /S /GoTo /D (page.364) >> +>> endobj +10611 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.411 647.988 504.348 658.892] +/Subtype /Link +/A << /S /GoTo /D (page.396) >> +>> endobj +10612 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [484.642 624.078 496.597 634.981] +/Subtype /Link +/A << /S /GoTo /D (page.93) >> +>> endobj +10613 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [459.735 612.122 476.672 623.026] +/Subtype /Link +/A << /S /GoTo /D (page.234) >> +>> endobj +10614 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.59 588.929 403.527 599.116] +/Subtype /Link +/A << /S /GoTo /D (page.364) >> +>> endobj +10615 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.411 576.257 504.348 587.161] +/Subtype /Link +/A << /S /GoTo /D (page.397) >> +>> endobj +10616 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [484.642 552.347 496.597 563.25] +/Subtype /Link +/A << /S /GoTo /D (page.94) >> +>> endobj +10617 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.082 540.391 475.018 551.295] +/Subtype /Link +/A << /S /GoTo /D (page.126) >> +>> endobj +10618 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [459.735 528.436 476.672 539.34] +/Subtype /Link +/A << /S /GoTo /D (page.235) >> +>> endobj +10619 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 506.583 362.272 515.43] +/Subtype /Link +/A << /S /GoTo /D (page.285) >> +>> endobj +10620 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 482.673 362.272 491.519] +/Subtype /Link +/A << /S /GoTo /D (page.308) >> +>> endobj +10621 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [421.151 457.422 438.087 467.609] +/Subtype /Link +/A << /S /GoTo /D (page.340) >> +>> endobj +10622 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.59 433.512 403.527 443.699] +/Subtype /Link +/A << /S /GoTo /D (page.365) >> +>> endobj +10623 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.411 420.84 504.348 431.744] +/Subtype /Link +/A << /S /GoTo /D (page.398) >> +>> endobj +10624 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [484.642 396.929 496.597 407.833] +/Subtype /Link +/A << /S /GoTo /D (page.94) >> +>> endobj +10625 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [459.735 384.974 476.672 395.878] +/Subtype /Link +/A << /S /GoTo /D (page.235) >> +>> endobj +10626 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.59 361.781 403.527 371.968] +/Subtype /Link +/A << /S /GoTo /D (page.365) >> +>> endobj +10627 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.411 349.109 504.348 360.013] +/Subtype /Link +/A << /S /GoTo /D (page.399) >> +>> endobj +10628 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.59 313.96 403.527 324.147] +/Subtype /Link +/A << /S /GoTo /D (page.364) >> +>> endobj +10629 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.411 289.333 504.348 300.237] +/Subtype /Link +/A << /S /GoTo /D (page.397) >> +>> endobj +10630 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.411 265.422 504.348 276.326] +/Subtype /Link +/A << /S /GoTo /D (page.397) >> +>> endobj +10631 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.411 241.512 504.348 252.416] +/Subtype /Link +/A << /S /GoTo /D (page.400) >> +>> endobj +10632 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.411 217.602 504.348 228.506] +/Subtype /Link +/A << /S /GoTo /D (page.400) >> +>> endobj +10633 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [459.735 193.691 476.672 204.595] +/Subtype /Link +/A << /S /GoTo /D (page.232) >> +>> endobj +10634 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [459.735 169.781 476.672 180.685] +/Subtype /Link +/A << /S /GoTo /D (page.232) >> +>> endobj +10635 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [459.735 145.871 476.672 156.775] +/Subtype /Link +/A << /S /GoTo /D (page.237) >> +>> endobj +10636 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [459.735 121.96 476.672 132.864] +/Subtype /Link +/A << /S /GoTo /D (page.237) >> +>> endobj +10641 0 obj << +/D [10639 0 R /XYZ 90 757.935 null] +>> endobj +10642 0 obj << +/D [10639 0 R /XYZ 90 696.969 null] +>> endobj +10638 0 obj << +/Font << /F63 374 0 R /F50 339 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10708 0 obj << +/Length 1161 +/Filter /FlateDecode +>> +stream +xÚíZ]SÛ8}ϯÐÛ&3‹äH¶y[(ËК–t†t4Ž-‚[­¬4°¿~åء͉b')éSbْϽ:çÞ+Y g­ã~ëðofºŒ0п.6Ð ú¸mŸ_½9½é|î¿]ä@D™î7¹Ñ%nÑÜ:í·þma݊žô¦6´- +ü¸uû@·¿Z®Ɠ§bÐ%–þÀuë} UHÊþrX ô¡ÂFÑØ0q¡C1°‰£%Lí Žé@àëºÃÆÐ¥ÕS½¦mOÆï¥ÑӃ¤Ç/ôäÓÑÑÙeŸ'JÏ …ü³o¸= µ ÆË^Hg_èO҄R¥Ò˜aþe”øŠgRäB~+^%¸ÁÈWašL¼l˜•¸{i‡ÐöXÈ\¨5 »‚–Â/ÞùäG"à~š åH$¾È!2ˆÇoøõƒ—‰5ð\6‹mà…ãôqÍè˜Øõ‡?“a°Ž–Uüw¾ò†iâEkµŒÕr›r¿º©B/ŠžøÁ÷Yf³³ü¡ ªfDO¦g×xÄê¢ÆÀª¦4YGmDR›{IÀã0 ãð?QOŠ{àù®‰¸-‡³—ž+酉ÊwëãîncÉ®§þ¬X⬒,ÛF,¡õb Þ[,ÑUJÍX2¥öcÉ Da¯€ˆ8Ü­ãð¡H„ôT*󺕓q¬CÍðm€ÅuóP“¡±Ge×òå,¼-8Ô«i È3Ϻ¾E’ëJ¾Ä'âvª~ŒÈß Í5Q¿‰» Òèåy¯ÈƒHÄ¥8âЦ™¤Q†ÅökÍ°lÕºñêy©°2™~¾ú--siÍÿ‚ì:0‚!cî¶YOçYoI뱞6c½m-wÊz¶Èz•òðûVԂ^Tüv&]0­rnö( —å~T©T?Fñ2À&Ž=y^œ¯˜îë§\­0¨R›MLL¸/ß!DÁÃØŠzŽ6-Ýݝ.Q-¼ãƒêÇÇf¡„¼ÖPb5–«G¡V`Ú`»×bîþb2©f–I±{‘a„~m•á=mͱÂÂÖo•ý¢*ûëê?ywÙ»8½9ïzY^½ ~rs3©4ä}£¶®2Ö`Ž‰Ê3] ?jm+-ò‚³·Øϛ*{e%3ÝÉý0äQêõ0ŸMw)šV-ÙM©^„¾=@Ì2)£ò<&\Ö,ú„ÿµ £ŽW£x°âKì2;0}iŠõ:ÇÅNùÔÀK´KêLïÙ&{ ÓÔµÓÄçÌqç¶}Gž¿Z,öi;&Ïz®Ë'ë’G%½,¼BÛ¼œòíKœÕ8Yºî? Àœ  Ï'LO!0èږS .¤´["ì?ˆÎäýϦV—S{ËËÊèòâc.äJÛyy}é%#/*ÿß!ŠÊã²Xñ•b‰¾…açÀÒ¹¢2¶´ì+˜þû§8ÑAÀ‹ZˆLÏm<(•ŽÇcèçP¯Û2 Cu˜eÑáŒûæ¬Æ¸ íçAîSY‹SY™&º1žÎ ¤ýÿ?Ä +endstream +endobj +10707 0 obj << +/Type /Page +/Contents 10708 0 R +/Resources 10706 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10498 0 R +/Annots [ 10637 0 R 10643 0 R 10644 0 R 10645 0 R 10646 0 R 10647 0 R 10648 0 R 10649 0 R 10650 0 R 10651 0 R 10652 0 R 10653 0 R 10654 0 R 10655 0 R 10656 0 R 10657 0 R 10658 0 R 10659 0 R 10660 0 R 10661 0 R 10662 0 R 10663 0 R 10664 0 R 10665 0 R 10666 0 R 10667 0 R 10668 0 R 10669 0 R 10670 0 R 10671 0 R 10672 0 R 10673 0 R 10674 0 R 10675 0 R 10676 0 R 10677 0 R 10678 0 R 10679 0 R 10680 0 R 10681 0 R 10682 0 R 10683 0 R 10684 0 R 10685 0 R 10686 0 R 10687 0 R 10688 0 R 10689 0 R 10690 0 R 10691 0 R 10692 0 R 10693 0 R 10694 0 R 10695 0 R 10696 0 R 10697 0 R 10698 0 R 10699 0 R 10700 0 R 10701 0 R 10702 0 R 10703 0 R 10704 0 R 10705 0 R ] +>> endobj +10637 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 721.97 145.791 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.157) >> +>> endobj +10643 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.627 707.957 296.564 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.211) >> +>> endobj +10644 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [261.266 684.047 278.203 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.420) >> +>> endobj +10645 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 660.136 280.116 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.96) >> +>> endobj +10646 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 648.181 258.537 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.127) >> +>> endobj +10647 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 636.226 260.191 647.13] +/Subtype /Link +/A << /S /GoTo /D (page.233) >> +>> endobj +10648 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 614.253 145.791 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.309) >> +>> endobj +10649 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 589.123 221.606 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.340) >> +>> endobj +10650 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 576.45 287.867 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.402) >> +>> endobj +10651 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 552.54 280.116 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.96) >> +>> endobj +10652 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 540.585 260.191 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.233) >> +>> endobj +10653 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 528.63 287.867 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.402) >> +>> endobj +10654 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 504.719 280.116 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.94) >> +>> endobj +10655 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 492.764 258.537 503.668] +/Subtype /Link +/A << /S /GoTo /D (page.126) >> +>> endobj +10656 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 480.809 260.191 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.235) >> +>> endobj +10657 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 458.956 145.791 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.308) >> +>> endobj +10658 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 433.706 221.606 443.892] +/Subtype /Link +/A << /S /GoTo /D (page.341) >> +>> endobj +10659 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 421.033 287.867 431.937] +/Subtype /Link +/A << /S /GoTo /D (page.398) >> +>> endobj +10660 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 397.123 280.116 408.027] +/Subtype /Link +/A << /S /GoTo /D (page.95) >> +>> endobj +10661 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 385.168 260.191 396.071] +/Subtype /Link +/A << /S /GoTo /D (page.235) >> +>> endobj +10662 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 373.212 287.867 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.399) >> +>> endobj +10663 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 349.302 287.867 360.206] +/Subtype /Link +/A << /S /GoTo /D (page.400) >> +>> endobj +10664 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 325.392 287.867 336.296] +/Subtype /Link +/A << /S /GoTo /D (page.401) >> +>> endobj +10665 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 301.481 260.191 312.385] +/Subtype /Link +/A << /S /GoTo /D (page.237) >> +>> endobj +10666 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 277.571 260.191 288.475] +/Subtype /Link +/A << /S /GoTo /D (page.238) >> +>> endobj +10667 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 253.661 285.097 264.565] +/Subtype /Link +/A << /S /GoTo /D (page.105) >> +>> endobj +10668 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 241.706 258.537 252.609] +/Subtype /Link +/A << /S /GoTo /D (page.135) >> +>> endobj +10669 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 229.75 260.191 240.654] +/Subtype /Link +/A << /S /GoTo /D (page.246) >> +>> endobj +10670 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 207.897 145.791 216.744] +/Subtype /Link +/A << /S /GoTo /D (page.285) >> +>> endobj +10671 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 183.987 145.791 192.834] +/Subtype /Link +/A << /S /GoTo /D (page.317) >> +>> endobj +10672 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 158.737 221.606 168.923] +/Subtype /Link +/A << /S /GoTo /D (page.346) >> +>> endobj +10673 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 146.064 287.867 156.968] +/Subtype /Link +/A << /S /GoTo /D (page.411) >> +>> endobj +10674 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 122.154 285.097 133.058] +/Subtype /Link +/A << /S /GoTo /D (page.105) >> +>> endobj +10675 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 110.199 258.537 121.103] +/Subtype /Link +/A << /S /GoTo /D (page.135) >> +>> endobj +10676 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 98.244 260.191 109.147] +/Subtype /Link +/A << /S /GoTo /D (page.246) >> +>> endobj +10677 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 710.014 362.272 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.318) >> +>> endobj +10678 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [421.151 684.764 438.087 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.347) >> +>> endobj +10679 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.411 672.092 504.348 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.411) >> +>> endobj +10680 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 638.283 362.272 647.13] +/Subtype /Link +/A << /S /GoTo /D (page.285) >> +>> endobj +10681 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.656 600.361 396.593 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.172) >> +>> endobj +10682 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [484.642 576.45 496.597 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.99) >> +>> endobj +10683 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.082 564.495 475.018 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.131) >> +>> endobj +10684 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [459.735 552.54 476.672 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.240) >> +>> endobj +10685 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 530.687 362.272 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.312) >> +>> endobj +10686 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [421.151 505.437 438.087 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.343) >> +>> endobj +10687 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.59 481.526 403.527 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.369) >> +>> endobj +10688 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.411 468.854 504.348 479.758] +/Subtype /Link +/A << /S /GoTo /D (page.406) >> +>> endobj +10689 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [484.642 444.943 501.578 455.847] +/Subtype /Link +/A << /S /GoTo /D (page.100) >> +>> endobj +10690 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.082 432.988 475.018 443.892] +/Subtype /Link +/A << /S /GoTo /D (page.131) >> +>> endobj +10691 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [459.735 421.033 476.672 431.937] +/Subtype /Link +/A << /S /GoTo /D (page.241) >> +>> endobj +10692 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 399.18 362.272 408.027] +/Subtype /Link +/A << /S /GoTo /D (page.313) >> +>> endobj +10693 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [421.151 373.93 438.087 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.343) >> +>> endobj +10694 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.59 350.019 403.527 360.206] +/Subtype /Link +/A << /S /GoTo /D (page.369) >> +>> endobj +10695 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.411 337.347 504.348 348.251] +/Subtype /Link +/A << /S /GoTo /D (page.406) >> +>> endobj +10696 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 314.154 425.255 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +10697 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.59 278.288 403.527 288.475] +/Subtype /Link +/A << /S /GoTo /D (page.375) >> +>> endobj +10698 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.656 241.706 396.593 252.609] +/Subtype /Link +/A << /S /GoTo /D (page.207) >> +>> endobj +10699 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.656 217.795 396.593 228.699] +/Subtype /Link +/A << /S /GoTo /D (page.263) >> +>> endobj +10700 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 183.987 362.272 192.834] +/Subtype /Link +/A << /S /GoTo /D (page.155) >> +>> endobj +10701 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [435.935 148.057 447.89 158.961] +/Subtype /Link +/A << /S /GoTo /D (page.75) >> +>> endobj +10702 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [484.642 124.146 496.597 135.05] +/Subtype /Link +/A << /S /GoTo /D (page.87) >> +>> endobj +10703 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [499.586 124.146 511.541 135.05] +/Subtype /Link +/A << /S /GoTo /D (page.89) >> +>> endobj +10704 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.59 88.998 403.527 99.185] +/Subtype /Link +/A << /S /GoTo /D (page.372) >> +>> endobj +10705 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10709 0 obj << +/D [10707 0 R /XYZ 90 757.935 null] +>> endobj +10706 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10775 0 obj << +/Length 1130 +/Filter /FlateDecode +>> +stream +xÚíZ]sÚ8}çWømaºI¶d;Ð4I7lBg2%0<µeV6¥ù÷+c“Clñ•43},[ºGG÷\Ý+´±´³Z»Wk}"†æèADë4h:FPë µ~ýâúãé}ã[ï³f[˜È~‹¦ÒæÚi¯ö_ ÊV ÁEol閁5/¬õ¿m(Û?k@7[›/ž +5ò;ÐîjÿÖÀs$ CgÛçW_vçþqŸ]Çþ˜/ AÙ a­ ¡îàüñnâ:!u»Qð8aCAÝK ¨x<9itï&tÊþ^L!Ã.Æù$nÏjZ¿‰0¨C`äd 出/¡ãˆÓ ÂÔWB†•ù<‰Yâ6õ/ÐՍ×çLÈÇ*àR`vÍø ]:J~qæú!³#ûÜìo*+؎~V oìáÎgÂVŒÌ7“‹¹É'É6^–ÝL|%®vˆ3OzFWDòG¥·™¸ y÷‡{3¥)l…H±QjSÁ^CmhwwÝCmäÝ« ÿQÛ;W[ž:°ÔôÏDÐiÐďøž;õAsˆ%ÖsËÙèa“TÆîHD¡KQjùGúqÜð倣F/tä\Ù¯½rÇ0ùM£—±?°ÃF/^-zŽY&4².´ ²©¼k‘™Dö¦"+~KDÇrÄ0t‚ÌE‡÷TØqŽ*ºÁҍ×É?PAŠ +òê×"/vZߕž#‰ +ZªÎ‡Åø—”gi±¸ºà £uêU鞀Òܽãþ"ùåP[FÎóÊ¥UXzXLû+93UΒ:‹(dYä°!V@²^‡õëjŒä‹±vJ·½d¶Šu¸¢*Ÿë*¯§BdÁcÓ19FQl·(Æ»Åû­’¥Êù‹§–äÀT¨D_ùÁ^@:æ}OƒžÜ#¯gဉíąU|ÕK¸^Äêóñd7¬ÞJ­­…i)M6H×côøF끕 2*vÃwuÑMs©AÀ­†l`Ë›»/·§n÷æ⺷[ZqÆ84‰D•¾[E_AÏs§©ëíƘ: GP8}]ÇZæØ.[¿eⱧsZÏ/z÷ÒíÜß»þ6Y—JÕà©C(¥+âc1c¼,¢ÛY‰e>%I¨²bïQiîìÛI»Õ–6Ƭ²ù®-¬Ï~³£ öl+ž0‘âôù0KW:ߌ[–(¶ê‹ñå q¢;–aç/ı#‹Ó¼(íMòºæ‰„ürÉD^etd_b&þj`\³ë+Êg4È~? ²cKËÔ?k::’· Þhr1îË'™Í컶üõOúWü /´-Ýhù‡I’LOZ­ù|®{±>ãþTè~ҚNƒÖ +m…YChêÖÓ £HdÀÂHäÓ÷¹l åŠ^äÿ¨Þ… +endstream +endobj +10774 0 obj << +/Type /Page +/Contents 10775 0 R +/Resources 10773 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10777 0 R +/Annots [ 10710 0 R 10711 0 R 10712 0 R 10713 0 R 10714 0 R 10715 0 R 10716 0 R 10717 0 R 10718 0 R 10719 0 R 10720 0 R 10721 0 R 10722 0 R 10723 0 R 10724 0 R 10725 0 R 10726 0 R 10727 0 R 10728 0 R 10729 0 R 10730 0 R 10731 0 R 10732 0 R 10733 0 R 10734 0 R 10735 0 R 10736 0 R 10737 0 R 10738 0 R 10739 0 R 10740 0 R 10741 0 R 10742 0 R 10743 0 R 10744 0 R 10745 0 R 10746 0 R 10747 0 R 10748 0 R 10749 0 R 10750 0 R 10751 0 R 10752 0 R 10753 0 R 10754 0 R 10755 0 R 10756 0 R 10757 0 R 10758 0 R 10759 0 R 10760 0 R 10761 0 R 10762 0 R 10763 0 R 10764 0 R 10765 0 R 10766 0 R 10767 0 R 10768 0 R 10769 0 R 10770 0 R 10772 0 R ] +>> endobj +10710 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 707.957 285.097 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.103) >> +>> endobj +10711 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 686.104 145.791 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.316) >> +>> endobj +10712 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 660.136 287.867 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.409) >> +>> endobj +10713 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 624.988 187.046 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.372) >> +>> endobj +10714 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 600.361 285.097 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.101) >> +>> endobj +10715 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 588.405 258.537 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.133) >> +>> endobj +10716 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 576.45 260.191 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.243) >> +>> endobj +10717 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 554.597 145.791 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.314) >> +>> endobj +10718 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 529.347 221.606 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.345) >> +>> endobj +10719 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 505.437 187.046 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.371) >> +>> endobj +10720 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 492.764 287.867 503.668] +/Subtype /Link +/A << /S /GoTo /D (page.408) >> +>> endobj +10721 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 468.854 285.097 479.758] +/Subtype /Link +/A << /S /GoTo /D (page.102) >> +>> endobj +10722 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 456.899 258.537 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.133) >> +>> endobj +10723 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 444.943 260.191 455.847] +/Subtype /Link +/A << /S /GoTo /D (page.243) >> +>> endobj +10724 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 423.09 145.791 431.937] +/Subtype /Link +/A << /S /GoTo /D (page.315) >> +>> endobj +10725 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 397.84 221.606 408.027] +/Subtype /Link +/A << /S /GoTo /D (page.345) >> +>> endobj +10726 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 373.93 187.046 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.371) >> +>> endobj +10727 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 361.257 287.867 372.161] +/Subtype /Link +/A << /S /GoTo /D (page.408) >> +>> endobj +10728 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 337.347 287.867 348.251] +/Subtype /Link +/A << /S /GoTo /D (page.409) >> +>> endobj +10729 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 313.437 287.867 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.410) >> +>> endobj +10730 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 289.526 280.116 300.43] +/Subtype /Link +/A << /S /GoTo /D (page.90) >> +>> endobj +10731 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 277.571 258.537 288.475] +/Subtype /Link +/A << /S /GoTo /D (page.123) >> +>> endobj +10732 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 265.616 260.191 276.52] +/Subtype /Link +/A << /S /GoTo /D (page.228) >> +>> endobj +10733 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 243.763 145.791 252.609] +/Subtype /Link +/A << /S /GoTo /D (page.306) >> +>> endobj +10734 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 218.512 221.606 228.699] +/Subtype /Link +/A << /S /GoTo /D (page.336) >> +>> endobj +10735 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 194.602 187.046 204.789] +/Subtype /Link +/A << /S /GoTo /D (page.360) >> +>> endobj +10736 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 181.93 287.867 192.834] +/Subtype /Link +/A << /S /GoTo /D (page.394) >> +>> endobj +10737 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 158.019 280.116 168.923] +/Subtype /Link +/A << /S /GoTo /D (page.90) >> +>> endobj +10738 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 146.064 258.537 156.968] +/Subtype /Link +/A << /S /GoTo /D (page.124) >> +>> endobj +10739 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 134.109 260.191 145.013] +/Subtype /Link +/A << /S /GoTo /D (page.228) >> +>> endobj +10740 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 112.256 145.791 121.103] +/Subtype /Link +/A << /S /GoTo /D (page.306) >> +>> endobj +10741 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 87.006 221.606 97.192] +/Subtype /Link +/A << /S /GoTo /D (page.336) >> +>> endobj +10742 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.59 708.674 403.527 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.361) >> +>> endobj +10743 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.411 696.002 504.348 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.394) >> +>> endobj +10744 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.082 672.092 475.018 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.120) >> +>> endobj +10745 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [478.007 672.092 494.943 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.123) >> +>> endobj +10746 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [407.91 650.174 419.865 661.078] +/Subtype /Link +/A << /S /GoTo /D (page.60) >> +>> endobj +10747 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 616.366 362.272 625.212] +/Subtype /Link +/A << /S /GoTo /D (page.143) >> +>> endobj +10748 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [365.261 616.366 382.197 625.212] +/Subtype /Link +/A << /S /GoTo /D (page.146) >> +>> endobj +10749 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [494.569 590.398 511.506 601.302] +/Subtype /Link +/A << /S /GoTo /D (page.102) >> +>> endobj +10750 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 580.5 362.272 589.347] +/Subtype /Link +/A << /S /GoTo /D (page.103) >> +>> endobj +10751 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 555.25 362.272 565.436] +/Subtype /Link +/A << /S /GoTo /D (page.315) >> +>> endobj +10752 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [365.261 555.25 382.197 565.436] +/Subtype /Link +/A << /S /GoTo /D (page.316) >> +>> endobj +10753 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [484.642 530.622 501.578 541.526] +/Subtype /Link +/A << /S /GoTo /D (page.104) >> +>> endobj +10754 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.082 518.667 475.018 529.571] +/Subtype /Link +/A << /S /GoTo /D (page.135) >> +>> endobj +10755 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 496.814 362.272 505.661] +/Subtype /Link +/A << /S /GoTo /D (page.317) >> +>> endobj +10756 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.082 470.846 475.018 481.75] +/Subtype /Link +/A << /S /GoTo /D (page.134) >> +>> endobj +10757 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 437.038 362.272 445.885] +/Subtype /Link +/A << /S /GoTo /D (page.156) >> +>> endobj +10758 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.59 399.833 403.527 410.019] +/Subtype /Link +/A << /S /GoTo /D (page.375) >> +>> endobj +10759 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [406.516 399.833 423.452 410.019] +/Subtype /Link +/A << /S /GoTo /D (page.376) >> +>> endobj +10760 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 365.307 362.272 374.154] +/Subtype /Link +/A << /S /GoTo /D (page.155) >> +>> endobj +10761 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 329.442 362.272 338.288] +/Subtype /Link +/A << /S /GoTo /D (page.285) >> +>> endobj +10762 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [481.304 303.474 498.241 314.378] +/Subtype /Link +/A << /S /GoTo /D (page.198) >> +>> endobj +10763 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [481.304 279.564 498.241 290.468] +/Subtype /Link +/A << /S /GoTo /D (page.199) >> +>> endobj +10764 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 245.755 362.272 254.602] +/Subtype /Link +/A << /S /GoTo /D (page.158) >> +>> endobj +10765 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 220.505 425.255 230.692] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +10766 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [489.613 195.877 506.55 206.781] +/Subtype /Link +/A << /S /GoTo /D (page.166) >> +>> endobj +10767 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [482.988 183.922 499.924 194.826] +/Subtype /Link +/A << /S /GoTo /D (page.180) >> +>> endobj +10768 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [481.304 171.967 498.241 182.871] +/Subtype /Link +/A << /S /GoTo /D (page.199) >> +>> endobj +10769 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 150.114 362.272 158.961] +/Subtype /Link +/A << /S /GoTo /D (page.257) >> +>> endobj +10770 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 114.249 362.272 123.095] +/Subtype /Link +/A << /S /GoTo /D (page.258) >> +>> endobj +10772 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10776 0 obj << +/D [10774 0 R /XYZ 90 757.935 null] +>> endobj +10773 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10837 0 obj << +/Length 1214 +/Filter /FlateDecode +>> +stream +xÚÍY[sÚ8~çWèmafãèbÉvÞZ’MÓM²4¡;ÙM;ÅÄ[c³²)å߯|!°‚1Û[¶Ž>Ëwα .;o‡Óߎá0ÌÀp,† Šúà±{u{~ñÐû<|Lh25/`” w.†;HB€òÙÔ2,B7é<~†ÀWãï4ˆcƒyþÖ˜˜¨ÿÜw>tà* +W ¨®1&d´XuÐC´Ë儻ƒ8\< _r÷:x’\.ÎÎþðR>Ž#º÷Ï|*~ÍñÀä¸DxwÙ(ÌÀ B†CKÁãòõ8!ŽaS´þ–O¦\Š\¨€·ö|'¼·ïîþ†Ä=ù>»‚¡/d|‚{<ݎþñSØEUð®Idx.eà»zknB«PìB £‘w–Óc&ë+“…"Cñ-Hn?äI²Ý~ƒk·ÿðàQ*䨇`—{u–`Ö&5ÐuCxq”í/R?WÆў>t^ãÛ¥wÀŠjàkֈ¿Õ‰' ÄgnW#›Öþò±²›FUù0 x.vûðgžð݁ŒÕEZ£bZMƒm+¯NDºÓ îaڝ ©^«d‘怊¡8ªYËDxWˆ½z4–3yèYÇpßç×y?£¯‚ãÞ/’TLö ø1ÛíV,PÛÒËp/ëÍ_DA4ÞJXìPÑnjèSKRɃ(i•9Ü*qbÒ.qbûÈÄYú©&œ=è â$ì'#NFœÄ15j“þ2²Ò½)ªœ_çý6ÔteÙ=Ñ< ïKV¹)¹Mž„|U€(ÕcÉt3±Rj—Šh»TDàÿTÃAú“Öpdœ«ÿj fPad0æìIM´5ø<5é𲢖TÆ¡[®É'Bõeî­úÿÑ&:†½¹dÆz +wTK›öŒm¢ÕjnBûgOõê]ÎÄöôq\Ìʽdoç­ñXDBf½é…ZE¬&ÖVƒ\ì£ÌOGBæµgµäd-ЫÓn‹ [n‘E¯´Ú"cšb?z¥ÍZdܜ½K§¶iø +¸$ˆ#7]LÅai$B?È6ôukÄéèí*õ5“ÃÃ:¿µ 䠂$–û!º,-–uaڄò¨õ+m$gjióÅÍ`ø×¹¸t 1™¦‹Bl"¼4óÍcys4¼ãâC¶Ù=vß\?U­-µË@‡éš,GÇf3/ |Á#×’”ïÊ¡ýÎÜnm’ät(Qu1¬4ZÝ×Å2lœxöJÈËO/i¤‘j„³¬Ò‹ŸþÉb»VЄ;šEy°»LeZð³î¥n]¾b-|# ÕoVSƒ_Þ ÜŒ‹â».Ká݇}k:šòÈw“©â:÷¥´X›\=°evžp4Ïk—ç´Ìp,b—'ÆÔQ}«Y >‹^úeÿåíR Åm©‰âæc"ä/=J»Iqã‹ëOÂÂAe¾•|X=BFï„(CÞ Qn²ØÙ°¼ú=;á¦+x‘mâå9ösšNÏNOçó¹á%Æ, +¦ÒÒÓé4<]S[e×™†õ"d¤ê”Ø$–åöƒH NxPFUÿÿ;'¼ +endstream +endobj +10836 0 obj << +/Type /Page +/Contents 10837 0 R +/Resources 10835 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10777 0 R +/Annots [ 10771 0 R 10778 0 R 10779 0 R 10780 0 R 10781 0 R 10782 0 R 10783 0 R 10784 0 R 10785 0 R 10786 0 R 10787 0 R 10788 0 R 10789 0 R 10790 0 R 10791 0 R 10792 0 R 10793 0 R 10794 0 R 10795 0 R 10796 0 R 10797 0 R 10798 0 R 10799 0 R 10800 0 R 10801 0 R 10802 0 R 10803 0 R 10804 0 R 10805 0 R 10806 0 R 10807 0 R 10808 0 R 10809 0 R 10810 0 R 10811 0 R 10812 0 R 10813 0 R 10814 0 R 10815 0 R 10816 0 R 10817 0 R 10818 0 R 10819 0 R 10820 0 R 10821 0 R 10822 0 R 10823 0 R 10824 0 R 10825 0 R 10826 0 R 10827 0 R 10828 0 R 10829 0 R 10830 0 R 10831 0 R 10832 0 R 10834 0 R ] +>> endobj +10771 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 710.014 145.791 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.322) >> +>> endobj +10778 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.339 672.809 192.276 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.111) >> +>> endobj +10779 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 650.239 145.791 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.250) >> +>> endobj +10780 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 626.328 145.791 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.266) >> +>> endobj +10781 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.819 601.078 208.774 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +10782 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 576.45 285.097 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.106) >> +>> endobj +10783 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 564.495 258.537 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.136) >> +>> endobj +10784 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 552.54 260.191 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.247) >> +>> endobj +10785 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 530.687 145.791 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.318) >> +>> endobj +10786 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 505.437 221.606 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.347) >> +>> endobj +10787 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 481.526 187.046 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.373) >> +>> endobj +10788 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 468.854 287.867 479.758] +/Subtype /Link +/A << /S /GoTo /D (page.412) >> +>> endobj +10789 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [273.132 444.943 290.068 455.847] +/Subtype /Link +/A << /S /GoTo /D (page.165) >> +>> endobj +10790 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.175 409.078 180.112 419.982] +/Subtype /Link +/A << /S /GoTo /D (page.172) >> +>> endobj +10791 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 385.168 260.191 396.071] +/Subtype /Link +/A << /S /GoTo /D (page.244) >> +>> endobj +10792 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 361.257 280.116 372.161] +/Subtype /Link +/A << /S /GoTo /D (page.92) >> +>> endobj +10793 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 349.302 258.537 360.206] +/Subtype /Link +/A << /S /GoTo /D (page.123) >> +>> endobj +10794 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 337.347 260.191 348.251] +/Subtype /Link +/A << /S /GoTo /D (page.228) >> +>> endobj +10795 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 315.494 145.791 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.306) >> +>> endobj +10796 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 290.243 221.606 300.43] +/Subtype /Link +/A << /S /GoTo /D (page.336) >> +>> endobj +10797 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 266.333 187.046 276.52] +/Subtype /Link +/A << /S /GoTo /D (page.360) >> +>> endobj +10798 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 253.661 287.867 264.565] +/Subtype /Link +/A << /S /GoTo /D (page.394) >> +>> endobj +10799 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.506 229.75 283.443 240.654] +/Subtype /Link +/A << /S /GoTo /D (page.180) >> +>> endobj +10800 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 195.942 145.791 204.789] +/Subtype /Link +/A << /S /GoTo /D (page.155) >> +>> endobj +10801 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 169.975 280.116 180.878] +/Subtype /Link +/A << /S /GoTo /D (page.91) >> +>> endobj +10802 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 158.019 258.537 168.923] +/Subtype /Link +/A << /S /GoTo /D (page.125) >> +>> endobj +10803 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 146.064 260.191 156.968] +/Subtype /Link +/A << /S /GoTo /D (page.230) >> +>> endobj +10804 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 124.211 145.791 133.058] +/Subtype /Link +/A << /S /GoTo /D (page.305) >> +>> endobj +10805 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 98.961 221.606 109.147] +/Subtype /Link +/A << /S /GoTo /D (page.338) >> +>> endobj +10806 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.59 708.674 403.527 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.363) >> +>> endobj +10807 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.411 696.002 504.348 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.396) >> +>> endobj +10808 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 662.194 362.272 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.283) >> +>> endobj +10809 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 626.328 362.272 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.283) >> +>> endobj +10810 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 591.115 425.255 601.302] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +10811 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [484.642 566.488 496.597 577.392] +/Subtype /Link +/A << /S /GoTo /D (page.99) >> +>> endobj +10812 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.082 554.532 475.018 565.436] +/Subtype /Link +/A << /S /GoTo /D (page.130) >> +>> endobj +10813 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [459.735 542.577 476.672 553.481] +/Subtype /Link +/A << /S /GoTo /D (page.240) >> +>> endobj +10814 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 520.724 362.272 529.571] +/Subtype /Link +/A << /S /GoTo /D (page.312) >> +>> endobj +10815 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [421.151 495.474 438.087 505.661] +/Subtype /Link +/A << /S /GoTo /D (page.342) >> +>> endobj +10816 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.59 471.564 403.527 481.75] +/Subtype /Link +/A << /S /GoTo /D (page.368) >> +>> endobj +10817 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 447.653 425.255 457.84] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +10818 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [472.208 423.026 489.145 433.93] +/Subtype /Link +/A << /S /GoTo /D (page.270) >> +>> endobj +10819 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [481.304 399.115 498.241 410.019] +/Subtype /Link +/A << /S /GoTo /D (page.199) >> +>> endobj +10820 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 377.262 362.272 386.109] +/Subtype /Link +/A << /S /GoTo /D (page.257) >> +>> endobj +10821 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 342.049 425.255 352.236] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +10822 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [472.208 317.422 489.145 328.326] +/Subtype /Link +/A << /S /GoTo /D (page.269) >> +>> endobj +10823 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 294.229 425.255 304.415] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +10824 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [482.988 269.601 499.924 280.505] +/Subtype /Link +/A << /S /GoTo /D (page.179) >> +>> endobj +10825 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [484.642 245.691 501.578 256.595] +/Subtype /Link +/A << /S /GoTo /D (page.109) >> +>> endobj +10826 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.082 233.735 475.018 244.639] +/Subtype /Link +/A << /S /GoTo /D (page.140) >> +>> endobj +10827 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [494.569 221.78 511.506 232.684] +/Subtype /Link +/A << /S /GoTo /D (page.201) >> +>> endobj +10828 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 211.882 362.272 220.729] +/Subtype /Link +/A << /S /GoTo /D (page.202) >> +>> endobj +10829 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 187.972 362.272 196.819] +/Subtype /Link +/A << /S /GoTo /D (page.321) >> +>> endobj +10830 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 152.107 362.272 160.953] +/Subtype /Link +/A << /S /GoTo /D (page.286) >> +>> endobj +10831 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 116.241 362.272 125.088] +/Subtype /Link +/A << /S /GoTo /D (page.157) >> +>> endobj +10832 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [496.109 102.229 513.045 113.133] +/Subtype /Link +/A << /S /GoTo /D (page.211) >> +>> endobj +10834 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10838 0 obj << +/D [10836 0 R /XYZ 90 757.935 null] +>> endobj +10835 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10905 0 obj << +/Length 1187 +/Filter /FlateDecode +>> +stream +xÚíZ]sÚ8}çWømaf1’lÉvÞÒ&KÓMRJèLf’ŽF±xê¯Ú&$ûëWÆ&‚lâÎî ØÂÒ=÷H÷Ü+ L ô[F­Þ_DS,Õ"ˆ(£±bÅ PÅ*#G¹iŸ]žœ^w¾>+:0U€‰è·øA×PÖÜ:µ~¶ h +\ôƆjhX±ýÖÍw 8¢ý³TÍ2•ùâ)_ё&¾=åªõµV‘`°‚q°b MçVˆÛ,ö„Þã”;1£çî]ÌâÇ££'ôjÊ"þçXŽ(žІý–rÓE´!0ŠrÓ⣠¡ja)áîáµ=†ïÇ®³c|¤›õÇÿb§lÌÛÁ̸'ëkÐZ7Ü]{ŠH˜/~L]æy´»XW›L ¹3³¹Cq(.ÒŒheFº›Æ|XèiÂÓ0 ÂÂí9Åc»úþ€ò¦0ØaK‡Ú&[xÝÏl=¤<ΦÞç~?R7 w)O~yŒ+LåÇ)·t h‹iºœùw<®´˜ &ûRÔ¿г ]¸6yÁ|6lá ƒÐÌ Ž9KÜ;Ó([ϙ‘Áuq6È®ůD 2˔h–jb¸þÔ-ZƔ%‰; ê!¬;wdÛÜm:=‡&³9u\Ÿ‰I=¼ÿ {3ÂN¤„PØ­ßJØÉÛ û8šQ; g!ç¹È3»–ní@c õœØÎAté)§oS Ä VŠô»•òß%‡›ð†Óh6]”ü¿iïì6"¯•`ª"B::Ô^C{¯)I«È¡¦ëM&1R=‰«ª Æz¤”¿"¢b…@C%¦þZiÐ"f[Dí&¥ÐËEáÆbu« E1/)iB‰`ýÀ—Q"ÔpáúV*Ë*¡K¤˜z*QJÍUUB¯¬xoW6¨Þ£Ôû’-uLm’Çh*ö¾s×áLžÕS䵶L¹?á¡ÏÓصKÈ3£÷ه ¹´WžI‚¤pÕ þsƼw‚^{ ýÓ¤ëÌg«ã.|hnihPjɦb_–òø>ó—y5³ˆ„›’h¼%ó‚YàÐʬ͢èÀ` +#ýáéqB؝é—!=ýšm¶¾utÐ>>ßmpN?^_ç³<Îz0{Wº'FU8£OǗÛK¿Æ ˆ0h.€Ð³Bú!²µ“è •$„eêeg!µÓþ2ÑT*FÐ˧¢d_épùÍn«„WÏp>ÖëäWéÚ×/+¦‰Å3e Â@dÁL$ïEMHçœå‡.õˆ8á".}7`éN.,(¡šåT$;§é=‰Ùð¦Á:Ц÷ºi°6î²Ëo؉¹ˆVÉìËëDµ Í,^ñcKl׋múhÊ; ûO.·K¿óÛÂùüæ[Âã?:·“üþ‚¢^̯oËò× ƒ¼¨¨HüÕNWñtÅyálîÙeyõwö—¼‚š†ª´üãÁ4M££^o>Ÿ«v¢Î7ŠU7íE‘×[£¯ä5„ºj< 2ã˜ƅûn }– +ÌêÚ@‚ÿž ¯ +endstream +endobj +10904 0 obj << +/Type /Page +/Contents 10905 0 R +/Resources 10903 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10777 0 R +/Annots [ 10833 0 R 10839 0 R 10840 0 R 10841 0 R 10842 0 R 10843 0 R 10844 0 R 10845 0 R 10846 0 R 10847 0 R 10848 0 R 10849 0 R 10850 0 R 10851 0 R 10852 0 R 10853 0 R 10854 0 R 10855 0 R 10856 0 R 10857 0 R 10858 0 R 10859 0 R 10860 0 R 10861 0 R 10862 0 R 10863 0 R 10864 0 R 10865 0 R 10866 0 R 10867 0 R 10868 0 R 10869 0 R 10870 0 R 10871 0 R 10872 0 R 10873 0 R 10874 0 R 10875 0 R 10876 0 R 10877 0 R 10878 0 R 10879 0 R 10880 0 R 10881 0 R 10882 0 R 10883 0 R 10884 0 R 10885 0 R 10886 0 R 10887 0 R 10888 0 R 10889 0 R 10890 0 R 10891 0 R 10892 0 R 10893 0 R 10894 0 R 10895 0 R 10896 0 R 10897 0 R 10898 0 R 10899 0 R 10900 0 R 10902 0 R ] +>> endobj +10833 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 719.912 285.097 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.107) >> +>> endobj +10839 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 707.957 258.537 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.137) >> +>> endobj +10840 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 696.002 260.191 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.248) >> +>> endobj +10841 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 674.029 145.791 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.319) >> +>> endobj +10842 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 648.899 221.606 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.348) >> +>> endobj +10843 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 624.988 187.046 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.374) >> +>> endobj +10844 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 612.316 287.867 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.413) >> +>> endobj +10845 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 578.508 145.791 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.156) >> +>> endobj +10846 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.627 564.495 296.564 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.210) >> +>> endobj +10847 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 520.724 145.791 529.571] +/Subtype /Link +/A << /S /GoTo /D (page.286) >> +>> endobj +10848 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 484.859 145.791 493.705] +/Subtype /Link +/A << /S /GoTo /D (page.156) >> +>> endobj +10849 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 458.891 285.097 469.795] +/Subtype /Link +/A << /S /GoTo /D (page.107) >> +>> endobj +10850 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 446.936 258.537 457.84] +/Subtype /Link +/A << /S /GoTo /D (page.137) >> +>> endobj +10851 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 434.981 260.191 445.885] +/Subtype /Link +/A << /S /GoTo /D (page.248) >> +>> endobj +10852 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 413.008 145.791 421.974] +/Subtype /Link +/A << /S /GoTo /D (page.319) >> +>> endobj +10853 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 387.877 221.606 398.064] +/Subtype /Link +/A << /S /GoTo /D (page.349) >> +>> endobj +10854 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 363.967 187.046 374.154] +/Subtype /Link +/A << /S /GoTo /D (page.374) >> +>> endobj +10855 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 351.295 287.867 362.199] +/Subtype /Link +/A << /S /GoTo /D (page.413) >> +>> endobj +10856 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [219.454 327.384 231.409 338.288] +/Subtype /Link +/A << /S /GoTo /D (page.76) >> +>> endobj +10857 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 283.613 145.791 292.46] +/Subtype /Link +/A << /S /GoTo /D (page.157) >> +>> endobj +10858 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.627 269.601 296.564 280.505] +/Subtype /Link +/A << /S /GoTo /D (page.211) >> +>> endobj +10859 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 235.793 145.791 244.639] +/Subtype /Link +/A << /S /GoTo /D (page.157) >> +>> endobj +10860 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.627 221.78 296.564 232.684] +/Subtype /Link +/A << /S /GoTo /D (page.211) >> +>> endobj +10861 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 197.87 285.097 208.774] +/Subtype /Link +/A << /S /GoTo /D (page.100) >> +>> endobj +10862 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 185.915 258.537 196.819] +/Subtype /Link +/A << /S /GoTo /D (page.131) >> +>> endobj +10863 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [261.526 185.915 278.462 196.819] +/Subtype /Link +/A << /S /GoTo /D (page.132) >> +>> endobj +10864 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 173.96 260.191 184.864] +/Subtype /Link +/A << /S /GoTo /D (page.241) >> +>> endobj +10865 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [263.179 173.96 280.116 184.864] +/Subtype /Link +/A << /S /GoTo /D (page.242) >> +>> endobj +10866 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 152.107 145.791 160.953] +/Subtype /Link +/A << /S /GoTo /D (page.313) >> +>> endobj +10867 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 126.856 221.606 137.043] +/Subtype /Link +/A << /S /GoTo /D (page.343) >> +>> endobj +10868 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [224.595 126.856 241.531 137.043] +/Subtype /Link +/A << /S /GoTo /D (page.344) >> +>> endobj +10869 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 102.946 187.046 113.133] +/Subtype /Link +/A << /S /GoTo /D (page.369) >> +>> endobj +10870 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.034 102.946 206.971 113.133] +/Subtype /Link +/A << /S /GoTo /D (page.370) >> +>> endobj +10871 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [494.569 719.912 511.506 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.406) >> +>> endobj +10872 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 710.014 362.272 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.407) >> +>> endobj +10873 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [484.642 684.047 501.578 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.101) >> +>> endobj +10874 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.082 672.092 475.018 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.132) >> +>> endobj +10875 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [459.735 660.136 476.672 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.242) >> +>> endobj +10876 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 638.283 362.272 647.13] +/Subtype /Link +/A << /S /GoTo /D (page.314) >> +>> endobj +10877 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [421.151 613.033 438.087 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.344) >> +>> endobj +10878 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [441.076 613.033 458.013 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.345) >> +>> endobj +10879 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.59 589.123 403.527 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.370) >> +>> endobj +10880 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.411 576.45 504.348 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.407) >> +>> endobj +10881 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [459.735 552.54 476.672 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.244) >> +>> endobj +10882 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.59 517.392 403.527 527.578] +/Subtype /Link +/A << /S /GoTo /D (page.362) >> +>> endobj +10883 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.59 481.526 403.527 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.363) >> +>> endobj +10884 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [459.735 456.899 476.672 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.231) >> +>> endobj +10885 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.082 432.988 475.018 443.892] +/Subtype /Link +/A << /S /GoTo /D (page.138) >> +>> endobj +10886 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.082 409.078 475.018 419.982] +/Subtype /Link +/A << /S /GoTo /D (page.138) >> +>> endobj +10887 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.082 385.168 475.018 396.071] +/Subtype /Link +/A << /S /GoTo /D (page.138) >> +>> endobj +10888 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 361.975 425.255 372.161] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +10889 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 338.064 425.255 348.251] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +10890 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [459.735 313.437 476.672 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.223) >> +>> endobj +10891 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [479.661 313.437 496.597 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.227) >> +>> endobj +10892 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 279.628 362.272 288.475] +/Subtype /Link +/A << /S /GoTo /D (page.256) >> +>> endobj +10893 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 243.763 362.272 252.609] +/Subtype /Link +/A << /S /GoTo /D (page.257) >> +>> endobj +10894 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [484.642 207.833 501.578 218.737] +/Subtype /Link +/A << /S /GoTo /D (page.105) >> +>> endobj +10895 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.411 195.877 504.348 206.781] +/Subtype /Link +/A << /S /GoTo /D (page.410) >> +>> endobj +10896 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.719 171.967 507.655 182.871] +/Subtype /Link +/A << /S /GoTo /D (page.191) >> +>> endobj +10897 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [484.642 148.057 501.578 158.961] +/Subtype /Link +/A << /S /GoTo /D (page.108) >> +>> endobj +10898 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [459.735 136.102 476.672 147.005] +/Subtype /Link +/A << /S /GoTo /D (page.249) >> +>> endobj +10899 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 114.249 362.272 123.095] +/Subtype /Link +/A << /S /GoTo /D (page.320) >> +>> endobj +10900 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [421.151 88.998 438.087 99.185] +/Subtype /Link +/A << /S /GoTo /D (page.349) >> +>> endobj +10902 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10906 0 obj << +/D [10904 0 R /XYZ 90 757.935 null] +>> endobj +10903 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +10967 0 obj << +/Length 1187 +/Filter /FlateDecode +>> +stream +xÚíY[SÛ8~ϯÐÛ&3‹ÑŒmÞ +e)] )Iw˜ÒŽG8"hëK*+Mé¯_ÙN „$vlvgö%±e]¾ó‹Î‘ NZ‡ýÖþŒÏòf  <†,ŠèÀuûôâíñUçkÿ=°¡kAÊ̸üƒMHÖÜ:î·¾·i…壩c9„‚ j]…``ÚßhÏ“¼WlLÌz­-8„Â9$šgLƒ‰-Vívmsq¿›„÷wb ¸&oW÷ÝDÆ:ÚßË£l<{YO:˜¶'B™n¿çø àj8•àò¤®÷0…mÂìi‡¡™hلëMI\²––®EÁ6k!·XKÆ£±~n€äèNß:¶ÅÀ¿G7B­D´LJD½|ij\Šžö’q*Ô€¬ +À$ª±ˆ±F{½ûT‹¨„Käà¦z;QràŸˆX(®Õf¤y:³Ê@Ë$öyšÊa\OՇoýÞ‰TžûÜ@Y‡ÉÏ2%¸|úªô—qJ¼úó4&1KˆZ¦q‚Pã¨P|Ԓ‡áý㺃q`üµ«óP®ìµfÏ^!~º»‹ŸpUü,q1ŸÇ?’±Œä/ñ*þ¶m‡ø_ñFñ©?i „®©ã* +Àî:$lÉßßþ­J¢íš®orBڈ<ì²jäi>ÖI˜ eÀÚjnžÙÂósíèd4ܤ‡A˜¤bPú…É"*]ìÄõ`l3ÚxIóGá\È*&ͳ“ÁÅc1ö²5Â6k#¸PH_·7‹V¨›Ö^6¬ r6í"#Ä;*ÙH'Wˆ9a52¡Æ©…S!{[¯ˆó®ú˜!•©£ÒYe(Ò´uBæ«Ì6™R·§°œ÷zþ‡KÿøcFó§Ž ÛoÎVï©Ý3ÿèê*ÏÕm6‚—îÌ© +£ÿîÍÅj^¶µt(#Šþá»óϐú¹¦šÝÇl|éÕ{ùs#ɎݘÍ׫¤]~†ä…)ÚàäÑÛ@GG{-eÚ[=$öÒsñZ˜¹ùæ^ñVxvÌ,Ï!îô^šz¥vº':ùúð§¯3Š×© Å˧T¨ß:”¶ÓâýœÇc“yæÏ_ …?²©L +cS4B A ›OÈêìãã=!¦Â’}³§?³{t:‡¹ŽE žÝ–ßi=:ØߟL&VZãXŽ”%õþhî?¡oAj„lËy˜äÖ¤g9°(QSñel£Ü˜¬'þÿ4cRª +endstream +endobj +10966 0 obj << +/Type /Page +/Contents 10967 0 R +/Resources 10965 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10777 0 R +/Annots [ 10901 0 R 10907 0 R 10908 0 R 10909 0 R 10910 0 R 10911 0 R 10912 0 R 10913 0 R 10914 0 R 10915 0 R 10916 0 R 10917 0 R 10918 0 R 10919 0 R 10920 0 R 10921 0 R 10922 0 R 10923 0 R 10924 0 R 10925 0 R 10926 0 R 10927 0 R 10928 0 R 10929 0 R 10930 0 R 10931 0 R 10932 0 R 10933 0 R 10934 0 R 10935 0 R 10936 0 R 10937 0 R 10938 0 R 10939 0 R 10940 0 R 10941 0 R 10942 0 R 10943 0 R 10944 0 R 10945 0 R 10946 0 R 10947 0 R 10948 0 R 10949 0 R 10950 0 R 10951 0 R 10952 0 R 10953 0 R 10954 0 R 10955 0 R 10956 0 R 10957 0 R 10958 0 R 10959 0 R 10960 0 R 10961 0 R 10962 0 R 10964 0 R ] +>> endobj +10901 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 708.674 187.046 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.364) >> +>> endobj +10907 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 696.002 287.867 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.414) >> +>> endobj +10908 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 652.111 145.791 661.078] +/Subtype /Link +/A << /S /GoTo /D (page.159) >> +>> endobj +10909 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.175 614.308 180.112 625.212] +/Subtype /Link +/A << /S /GoTo /D (page.172) >> +>> endobj +10910 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.175 590.398 180.112 601.302] +/Subtype /Link +/A << /S /GoTo /D (page.263) >> +>> endobj +10911 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 566.488 280.116 577.392] +/Subtype /Link +/A << /S /GoTo /D (page.98) >> +>> endobj +10912 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 554.532 258.537 565.436] +/Subtype /Link +/A << /S /GoTo /D (page.130) >> +>> endobj +10913 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 542.577 260.191 553.481] +/Subtype /Link +/A << /S /GoTo /D (page.239) >> +>> endobj +10914 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 520.724 145.791 529.571] +/Subtype /Link +/A << /S /GoTo /D (page.311) >> +>> endobj +10915 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 495.474 221.606 505.661] +/Subtype /Link +/A << /S /GoTo /D (page.342) >> +>> endobj +10916 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 471.564 187.046 481.75] +/Subtype /Link +/A << /S /GoTo /D (page.368) >> +>> endobj +10917 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 458.891 287.867 469.795] +/Subtype /Link +/A << /S /GoTo /D (page.404) >> +>> endobj +10918 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 434.981 280.116 445.885] +/Subtype /Link +/A << /S /GoTo /D (page.98) >> +>> endobj +10919 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 423.026 260.191 433.93] +/Subtype /Link +/A << /S /GoTo /D (page.239) >> +>> endobj +10920 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 399.833 187.046 410.019] +/Subtype /Link +/A << /S /GoTo /D (page.368) >> +>> endobj +10921 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 387.16 287.867 398.064] +/Subtype /Link +/A << /S /GoTo /D (page.404) >> +>> endobj +10922 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 363.25 260.191 374.154] +/Subtype /Link +/A << /S /GoTo /D (page.228) >> +>> endobj +10923 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 339.339 280.116 350.243] +/Subtype /Link +/A << /S /GoTo /D (page.92) >> +>> endobj +10924 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 327.384 258.537 338.288] +/Subtype /Link +/A << /S /GoTo /D (page.126) >> +>> endobj +10925 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 315.429 260.191 326.333] +/Subtype /Link +/A << /S /GoTo /D (page.228) >> +>> endobj +10926 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 293.576 145.791 302.423] +/Subtype /Link +/A << /S /GoTo /D (page.305) >> +>> endobj +10927 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 268.326 221.606 278.512] +/Subtype /Link +/A << /S /GoTo /D (page.336) >> +>> endobj +10928 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 244.415 187.046 254.602] +/Subtype /Link +/A << /S /GoTo /D (page.360) >> +>> endobj +10929 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 231.743 287.867 242.647] +/Subtype /Link +/A << /S /GoTo /D (page.393) >> +>> endobj +10930 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [273.132 207.833 290.068 218.737] +/Subtype /Link +/A << /S /GoTo /D (page.166) >> +>> endobj +10931 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.506 183.922 283.443 194.826] +/Subtype /Link +/A << /S /GoTo /D (page.180) >> +>> endobj +10932 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [264.823 171.967 281.759 182.871] +/Subtype /Link +/A << /S /GoTo /D (page.200) >> +>> endobj +10933 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 150.114 145.791 158.961] +/Subtype /Link +/A << /S /GoTo /D (page.257) >> +>> endobj +10934 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [273.132 124.146 290.068 135.05] +/Subtype /Link +/A << /S /GoTo /D (page.166) >> +>> endobj +10935 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.506 112.191 283.443 123.095] +/Subtype /Link +/A << /S /GoTo /D (page.180) >> +>> endobj +10936 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 710.014 362.272 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.155) >> +>> endobj +10937 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 674.149 362.272 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.155) >> +>> endobj +10938 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 638.283 362.272 647.13] +/Subtype /Link +/A << /S /GoTo /D (page.155) >> +>> endobj +10939 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 602.418 362.272 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.155) >> +>> endobj +10940 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 566.552 362.272 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.155) >> +>> endobj +10941 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [489.613 540.585 506.55 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.166) >> +>> endobj +10942 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 506.777 362.272 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.286) >> +>> endobj +10943 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [489.613 480.809 506.55 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.166) >> +>> endobj +10944 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [482.988 468.854 499.924 479.758] +/Subtype /Link +/A << /S /GoTo /D (page.180) >> +>> endobj +10945 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [459.735 444.943 476.672 455.847] +/Subtype /Link +/A << /S /GoTo /D (page.228) >> +>> endobj +10946 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.748 421.033 494.684 431.937] +/Subtype /Link +/A << /S /GoTo /D (page.420) >> +>> endobj +10947 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [494.569 387.16 511.506 398.064] +/Subtype /Link +/A << /S /GoTo /D (page.109) >> +>> endobj +10948 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 377.262 362.272 386.109] +/Subtype /Link +/A << /S /GoTo /D (page.110) >> +>> endobj +10949 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.082 363.25 475.018 374.154] +/Subtype /Link +/A << /S /GoTo /D (page.140) >> +>> endobj +10950 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [478.007 363.25 494.943 374.154] +/Subtype /Link +/A << /S /GoTo /D (page.141) >> +>> endobj +10951 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [481.304 351.295 498.241 362.199] +/Subtype /Link +/A << /S /GoTo /D (page.202) >> +>> endobj +10952 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 329.442 362.272 338.288] +/Subtype /Link +/A << /S /GoTo /D (page.322) >> +>> endobj +10953 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 293.576 362.272 302.423] +/Subtype /Link +/A << /S /GoTo /D (page.157) >> +>> endobj +10954 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [496.109 279.564 513.045 290.468] +/Subtype /Link +/A << /S /GoTo /D (page.211) >> +>> endobj +10955 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [474.669 255.653 491.606 266.557] +/Subtype /Link +/A << /S /GoTo /D (page.425) >> +>> endobj +10956 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 232.46 425.255 242.647] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +10957 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 208.55 425.255 218.737] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +10958 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [484.642 183.922 501.578 194.826] +/Subtype /Link +/A << /S /GoTo /D (page.103) >> +>> endobj +10959 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 162.069 362.272 170.916] +/Subtype /Link +/A << /S /GoTo /D (page.316) >> +>> endobj +10960 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.411 136.102 504.348 147.005] +/Subtype /Link +/A << /S /GoTo /D (page.409) >> +>> endobj +10961 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [484.642 112.191 501.578 123.095] +/Subtype /Link +/A << /S /GoTo /D (page.104) >> +>> endobj +10962 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.082 100.236 475.018 111.14] +/Subtype /Link +/A << /S /GoTo /D (page.134) >> +>> endobj +10964 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +10968 0 obj << +/D [10966 0 R /XYZ 90 757.935 null] +>> endobj +10965 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +11038 0 obj << +/Length 1283 +/Filter /FlateDecode +>> +stream +xÚÍZ[s¢H~÷WôÛjՊ}¡HíK’ÉdIŒªÌd¦(¢C ·œÄýõÛ\L”¨4`Ì>X\„Óß9}¾ï ˜Î['ãVï##ÀP †ß!…bÆSpÛî>œÝt~Ž?ê +¤Lܗþ¡59Ý:·þi!q”ÞM5E#LÜÖíO¦âü'bèà1½Ê*&bë€QëK ®"¡p ‚bS a¢@F³Q‡DÛVèZæÐw|Zæ…}Záâèèj[3ß³sô`üÏ_,œå¯Ï[%†è"¤47L–_žá]b(:EëW9¶kÇ|jN|oι7á&O=Å¡øŽÛ¾gZQdϼ4f(saÍÆNÎC{º÷mSØÆ*- Ý4Ê©<<öðfÜã¡ûáÿ=Žkƞ!ž|(IÓ &‚˜°ÂËS¾W2ŠŠà®`ä¹qќ՜å<—ykèõ½M&Ý,iý1eRô÷øýß<‡šgOAÈEú5307Ó}¹»•—ʸ¤’ô¶]z‡lÀÂÀ +c;®íçз½8âñO‡~Óö#Åe%ÈIÑ×gäXDzfе3 +,Q ¦¶Ë½$†ÑëÛÌ]?ñŸÊÌ֌˜¥j¬Õ·ß¬ð›ǪäWögl[Ž³Ø‘d×|:ŸˆZ2 }±Sšgª¾ {‡Ä'#%_°Dq¾<¾é_ö¿wBíqÿj°aà óôæÆñàá}Á¶ f &#Å®õ$:„ù›rۀõ¹!Am¬¾-µ±ñNÔ.JbiU"Pk̹·RÙ¢5gë^僡ƒÉ1T ùp¹ë‡ 3ô5ãEÀ·?ÕQ&#`ýÁ» Ø2¶w[Ÿúâ`ÄUǀ¤ˆßždVÖÊ{^$„´(„Ze!”)~õ„6ÂÊ®TBÚ@qs@ÒBH%D÷²?LÂçp÷µÒËÌõŠJ‰‰uR•Cº*ñܸ‚ÇÅV<¶W°½ kÁ°;w^­U‰i?ô;É*Ë) +Ûö “>’jÙh^º~5kêôO~%A„ÌÝ;VšoD«¶1ˆjMÉr~94“`¦Þó²¼y%¬0¹ƒÁ©ùBÂíɵ ׺Š¼yU{~`̶zÖÆÞE›|êWƒÑøº:6ûƒ³/É4í¨°}|Ñ«çã©ïEqh r•Í³&óîùbg­[©ˆ&_¶/CÃdšçÁU±¹ªý +¶‹×ùRS¡3¨šZí[¶¸Z6(#âWŸë¹ò¼Öº£\Q¼£VåR›kDIо–¼79̪8ÌÈ;&A1ßÍd»#F4ôS¬—ú3ËT?Èbž\ÚûˆÐʛKBd<¿(ý+»bíÝfkU”«fÝe˺۸–Wrï5|{‰Ÿô"ºþ¦+mĨ¿F߸õ2öõÊçr[üV€éi“üT`ù‰S èùÇ +ÔP(U3ðãÞIÇö"?\º’æþd_#þÑ¡´eǗ–7·œlÿ¤ðwbJ¨Fòò)= ,þBJ§KÄtŒ8ϝÍ<û–{Ÿ“+è +^¤kŠ(–ËÔ~ˆãà¨×{||T&‘2÷ì Tì¸No-|¯RíÙȽàP +ÌõÃÜ}Û»Oú¤ä…™²fHÄÿ?성‡ +endstream +endobj +11037 0 obj << +/Type /Page +/Contents 11038 0 R +/Resources 11036 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10777 0 R +/Annots [ 10963 0 R 10969 0 R 10970 0 R 10971 0 R 10972 0 R 10973 0 R 10974 0 R 10975 0 R 10976 0 R 10977 0 R 10978 0 R 10979 0 R 10980 0 R 10981 0 R 10982 0 R 10983 0 R 10984 0 R 10985 0 R 10986 0 R 10987 0 R 10988 0 R 10989 0 R 10990 0 R 10991 0 R 10992 0 R 10993 0 R 10994 0 R 10995 0 R 10996 0 R 10997 0 R 10998 0 R 10999 0 R 11000 0 R 11001 0 R 11002 0 R 11003 0 R 11004 0 R 11005 0 R 11006 0 R 11007 0 R 11008 0 R 11009 0 R 11010 0 R 11011 0 R 11012 0 R 11013 0 R 11014 0 R 11015 0 R 11016 0 R 11017 0 R 11018 0 R 11019 0 R 11020 0 R 11021 0 R 11022 0 R 11023 0 R 11024 0 R 11025 0 R 11026 0 R 11027 0 R 11028 0 R 11029 0 R 11030 0 R 11031 0 R 11032 0 R 11033 0 R 11035 0 R ] +>> endobj +10963 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 710.014 145.791 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.317) >> +>> endobj +10969 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 684.047 260.191 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.245) >> +>> endobj +10970 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 660.136 260.191 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.245) >> +>> endobj +10971 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 636.226 260.191 647.13] +/Subtype /Link +/A << /S /GoTo /D (page.245) >> +>> endobj +10972 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 612.316 285.097 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.105) >> +>> endobj +10973 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 600.361 287.867 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.410) >> +>> endobj +10974 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [264.823 576.45 281.759 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.198) >> +>> endobj +10975 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 554.597 145.791 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.256) >> +>> endobj +10976 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [264.823 528.63 281.759 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.198) >> +>> endobj +10977 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.109 492.764 195.046 503.668] +/Subtype /Link +/A << /S /GoTo /D (page.275) >> +>> endobj +10978 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.034 492.764 214.971 503.668] +/Subtype /Link +/A << /S /GoTo /D (page.276) >> +>> endobj +10979 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 457.616 187.046 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.375) >> +>> endobj +10980 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 423.026 285.097 433.93] +/Subtype /Link +/A << /S /GoTo /D (page.106) >> +>> endobj +10981 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 411.07 258.537 421.974] +/Subtype /Link +/A << /S /GoTo /D (page.136) >> +>> endobj +10982 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 399.115 260.191 410.019] +/Subtype /Link +/A << /S /GoTo /D (page.247) >> +>> endobj +10983 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 377.143 145.791 386.109] +/Subtype /Link +/A << /S /GoTo /D (page.319) >> +>> endobj +10984 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 352.012 221.606 362.199] +/Subtype /Link +/A << /S /GoTo /D (page.348) >> +>> endobj +10985 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 328.102 187.046 338.288] +/Subtype /Link +/A << /S /GoTo /D (page.373) >> +>> endobj +10986 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 315.429 287.867 326.333] +/Subtype /Link +/A << /S /GoTo /D (page.412) >> +>> endobj +10987 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.819 292.236 208.774 302.423] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +10988 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 267.608 280.116 278.512] +/Subtype /Link +/A << /S /GoTo /D (page.90) >> +>> endobj +10989 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 255.653 258.537 266.557] +/Subtype /Link +/A << /S /GoTo /D (page.124) >> +>> endobj +10990 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 243.698 260.191 254.602] +/Subtype /Link +/A << /S /GoTo /D (page.229) >> +>> endobj +10991 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 220.505 145.791 230.692] +/Subtype /Link +/A << /S /GoTo /D (page.306) >> +>> endobj +10992 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.78 220.505 165.716 230.692] +/Subtype /Link +/A << /S /GoTo /D (page.307) >> +>> endobj +10993 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 196.595 221.606 206.781] +/Subtype /Link +/A << /S /GoTo /D (page.336) >> +>> endobj +10994 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [224.595 196.595 241.531 206.781] +/Subtype /Link +/A << /S /GoTo /D (page.337) >> +>> endobj +10995 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 172.684 187.046 182.871] +/Subtype /Link +/A << /S /GoTo /D (page.361) >> +>> endobj +10996 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 160.012 287.867 170.916] +/Subtype /Link +/A << /S /GoTo /D (page.394) >> +>> endobj +10997 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.819 136.819 208.774 147.005] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +10998 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.819 112.909 208.774 123.095] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +10999 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 88.281 280.116 99.185] +/Subtype /Link +/A << /S /GoTo /D (page.91) >> +>> endobj +11000 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.082 719.912 475.018 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.125) >> +>> endobj +11001 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [459.735 707.957 476.672 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.229) >> +>> endobj +11002 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [479.661 707.957 496.597 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.230) >> +>> endobj +11003 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 684.764 362.272 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.307) >> +>> endobj +11004 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [365.261 684.764 382.197 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.308) >> +>> endobj +11005 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [421.151 660.854 438.087 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.337) >> +>> endobj +11006 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [441.076 660.854 458.013 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.338) >> +>> endobj +11007 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.59 636.943 403.527 647.13] +/Subtype /Link +/A << /S /GoTo /D (page.362) >> +>> endobj +11008 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.411 624.271 504.348 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.395) >> +>> endobj +11009 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 589.123 362.272 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.283) >> +>> endobj +11010 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [365.261 589.123 382.197 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.284) >> +>> endobj +11011 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 565.212 425.255 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +11012 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [472.208 540.585 489.145 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.269) >> +>> endobj +11013 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 495.474 362.272 505.661] +/Subtype /Link +/A << /S /GoTo /D (page.156) >> +>> endobj +11014 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [365.261 495.474 382.197 505.661] +/Subtype /Link +/A << /S /GoTo /D (page.157) >> +>> endobj +11015 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [496.109 482.801 513.045 493.705] +/Subtype /Link +/A << /S /GoTo /D (page.210) >> +>> endobj +11016 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 448.874 362.272 457.84] +/Subtype /Link +/A << /S /GoTo /D (page.289) >> +>> endobj +11017 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [365.261 448.874 382.197 457.84] +/Subtype /Link +/A << /S /GoTo /D (page.292) >> +>> endobj +11018 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [482.988 423.026 499.924 433.93] +/Subtype /Link +/A << /S /GoTo /D (page.179) >> +>> endobj +11019 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [489.613 399.115 506.55 410.019] +/Subtype /Link +/A << /S /GoTo /D (page.167) >> +>> endobj +11020 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 375.922 425.255 386.109] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +11021 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 331.434 362.272 340.281] +/Subtype /Link +/A << /S /GoTo /D (page.302) >> +>> endobj +11022 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [365.261 331.434 382.197 340.281] +/Subtype /Link +/A << /S /GoTo /D (page.304) >> +>> endobj +11023 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.656 293.511 396.593 304.415] +/Subtype /Link +/A << /S /GoTo /D (page.207) >> +>> endobj +11024 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [459.735 281.556 476.672 292.46] +/Subtype /Link +/A << /S /GoTo /D (page.231) >> +>> endobj +11025 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.656 257.646 396.593 268.55] +/Subtype /Link +/A << /S /GoTo /D (page.263) >> +>> endobj +11026 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.411 245.691 504.348 256.595] +/Subtype /Link +/A << /S /GoTo /D (page.396) >> +>> endobj +11027 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.748 221.78 494.684 232.684] +/Subtype /Link +/A << /S /GoTo /D (page.420) >> +>> endobj +11028 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 187.972 362.272 196.819] +/Subtype /Link +/A << /S /GoTo /D (page.158) >> +>> endobj +11029 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [482.988 173.96 499.924 184.864] +/Subtype /Link +/A << /S /GoTo /D (page.182) >> +>> endobj +11030 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [484.642 150.049 501.578 160.953] +/Subtype /Link +/A << /S /GoTo /D (page.108) >> +>> endobj +11031 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.082 138.094 475.018 148.998] +/Subtype /Link +/A << /S /GoTo /D (page.139) >> +>> endobj +11032 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 116.121 362.272 125.088] +/Subtype /Link +/A << /S /GoTo /D (page.159) >> +>> endobj +11033 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [489.613 102.229 506.55 113.133] +/Subtype /Link +/A << /S /GoTo /D (page.167) >> +>> endobj +11035 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +11039 0 obj << +/D [11037 0 R /XYZ 90 757.935 null] +>> endobj +11036 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F11 418 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +11104 0 obj << +/Length 1095 +/Filter /FlateDecode +>> +stream +xÚåZQ“Ú6~çWè¥)LŠÐJ–,ßôúp½ËMÒ$¥v:s—a| ž€M)¹_aæpm,se¦Oز¬ýv÷[iw1Aˆ ÛÖÕ°Õ{#r°#¨@Ã/È!È€94œ »öۏ×7v>ß!‹HL¸ÐïÅ,Æ7í›aë¯èQ‚ ~›ÛØfç­»ÏMôø;D0s$ZdzæÈ¢LÿÎРõ[‹ŒË,ª‘óq`êw øïrŽxñ‚ PΫWõ2ŽÓ1gû›ýp@H쀬úÝÀö{›ÉôËî`ÎÓ¢}8UXþNÍôv«kr›*œÜü¾Tá÷ÎÛËäþƒë¯ÜYr}O8ù{³”¦ŒV:$¦úàN—éäf Tªl¢ÙW´½úe󥆤¡ÛþÉ4Š½Þz½Æã%^ùÞ"Ä^Ô[,f½=óe´°°½[䋮b`ó LÕ÷|=8…÷Òöÿ=¸{ +endstream +endobj +11103 0 obj << +/Type /Page +/Contents 11104 0 R +/Resources 11102 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 10777 0 R +/Annots [ 11034 0 R 11040 0 R 11041 0 R 11042 0 R 11043 0 R 11044 0 R 11045 0 R 11046 0 R 11047 0 R 11048 0 R 11049 0 R 11050 0 R 11051 0 R 11052 0 R 11053 0 R 11054 0 R 11055 0 R 11056 0 R 11057 0 R 11058 0 R 11059 0 R 11060 0 R 11061 0 R 11062 0 R 11063 0 R 11064 0 R 11065 0 R 11066 0 R 11067 0 R 11068 0 R 11069 0 R 11070 0 R 11071 0 R 11072 0 R 11073 0 R 11074 0 R 11075 0 R 11076 0 R 11077 0 R 11078 0 R 11079 0 R 11080 0 R 11081 0 R 11082 0 R 11083 0 R 11084 0 R 11085 0 R 11086 0 R 11087 0 R 11088 0 R 11089 0 R 11090 0 R 11091 0 R 11092 0 R 11093 0 R 11094 0 R 11095 0 R 11096 0 R 11097 0 R 11098 0 R 11099 0 R 11101 0 R ] +>> endobj +11034 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.175 707.957 180.112 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.173) >> +>> endobj +11040 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.506 696.002 283.443 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.183) >> +>> endobj +11041 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.175 672.092 180.112 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.186) >> +>> endobj +11042 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.237 660.136 291.174 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.191) >> +>> endobj +11043 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [278.088 648.181 295.024 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.200) >> +>> endobj +11044 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 638.283 145.791 647.13] +/Subtype /Link +/A << /S /GoTo /D (page.203) >> +>> endobj +11045 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.175 612.316 180.112 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.207) >> +>> endobj +11046 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 600.361 260.191 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.249) >> +>> endobj +11047 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 578.508 145.791 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.258) >> +>> endobj +11048 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.175 552.54 180.112 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.263) >> +>> endobj +11049 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.109 528.63 195.046 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.278) >> +>> endobj +11050 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 506.777 145.791 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.287) >> +>> endobj +11051 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 482.866 145.791 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.320) >> +>> endobj +11052 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 457.616 221.606 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.349) >> +>> endobj +11053 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.598 433.706 184.535 443.892] +/Subtype /Link +/A << /S /GoTo /D (page.378) >> +>> endobj +11054 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.598 409.795 184.535 419.982] +/Subtype /Link +/A << /S /GoTo /D (page.379) >> +>> endobj +11055 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 397.123 287.867 408.027] +/Subtype /Link +/A << /S /GoTo /D (page.414) >> +>> endobj +11056 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [261.266 385.168 278.203 396.071] +/Subtype /Link +/A << /S /GoTo /D (page.421) >> +>> endobj +11057 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [258.188 373.212 275.124 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.425) >> +>> endobj +11058 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.776 361.257 296.713 372.161] +/Subtype /Link +/A << /S /GoTo /D (page.427) >> +>> endobj +11059 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 327.449 145.791 336.296] +/Subtype /Link +/A << /S /GoTo /D (page.158) >> +>> endobj +11060 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [278.088 313.437 295.024 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.181) >> +>> endobj +11061 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 303.539 145.791 312.385] +/Subtype /Link +/A << /S /GoTo /D (page.182) >> +>> endobj +11062 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 267.673 145.791 276.52] +/Subtype /Link +/A << /S /GoTo /D (page.158) >> +>> endobj +11063 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.506 253.661 283.443 264.565] +/Subtype /Link +/A << /S /GoTo /D (page.182) >> +>> endobj +11064 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 219.852 145.791 228.699] +/Subtype /Link +/A << /S /GoTo /D (page.160) >> +>> endobj +11065 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 183.987 145.791 192.834] +/Subtype /Link +/A << /S /GoTo /D (page.158) >> +>> endobj +11066 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.506 169.975 283.443 180.878] +/Subtype /Link +/A << /S /GoTo /D (page.181) >> +>> endobj +11067 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.109 134.109 195.046 145.013] +/Subtype /Link +/A << /S /GoTo /D (page.277) >> +>> endobj +11068 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.109 98.244 195.046 109.147] +/Subtype /Link +/A << /S /GoTo /D (page.278) >> +>> endobj +11069 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 710.014 362.272 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.156) >> +>> endobj +11070 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [394.59 684.047 411.527 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.276) >> +>> endobj +11071 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [414.516 684.047 431.452 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.278) >> +>> endobj +11072 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [394.59 648.181 411.527 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.277) >> +>> endobj +11073 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [414.516 648.181 431.452 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.278) >> +>> endobj +11074 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 614.373 362.272 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.156) >> +>> endobj +11075 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [394.59 588.405 411.527 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.277) >> +>> endobj +11076 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [384.08 565.212 401.016 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.377) >> +>> endobj +11077 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [384.08 541.302 401.016 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.379) >> +>> endobj +11078 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [394.59 504.719 411.527 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.278) >> +>> endobj +11079 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [489.613 480.809 506.55 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.167) >> +>> endobj +11080 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [489.613 456.899 506.55 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.166) >> +>> endobj +11081 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [484.642 432.988 501.578 443.892] +/Subtype /Link +/A << /S /GoTo /D (page.108) >> +>> endobj +11082 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.082 421.033 475.018 431.937] +/Subtype /Link +/A << /S /GoTo /D (page.139) >> +>> endobj +11083 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 399.18 362.272 408.027] +/Subtype /Link +/A << /S /GoTo /D (page.158) >> +>> endobj +11084 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [489.613 385.168 506.55 396.071] +/Subtype /Link +/A << /S /GoTo /D (page.167) >> +>> endobj +11085 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [494.569 373.212 511.506 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.181) >> +>> endobj +11086 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 363.315 362.272 372.161] +/Subtype /Link +/A << /S /GoTo /D (page.182) >> +>> endobj +11087 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.656 337.347 396.593 348.251] +/Subtype /Link +/A << /S /GoTo /D (page.186) >> +>> endobj +11088 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.719 325.392 507.655 336.296] +/Subtype /Link +/A << /S /GoTo /D (page.191) >> +>> endobj +11089 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [481.304 313.437 498.241 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.200) >> +>> endobj +11090 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [459.735 301.481 476.672 312.385] +/Subtype /Link +/A << /S /GoTo /D (page.249) >> +>> endobj +11091 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 279.628 362.272 288.475] +/Subtype /Link +/A << /S /GoTo /D (page.258) >> +>> endobj +11092 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.656 253.661 396.593 264.565] +/Subtype /Link +/A << /S /GoTo /D (page.263) >> +>> endobj +11093 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 231.808 362.272 240.654] +/Subtype /Link +/A << /S /GoTo /D (page.320) >> +>> endobj +11094 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [421.151 206.557 438.087 216.744] +/Subtype /Link +/A << /S /GoTo /D (page.349) >> +>> endobj +11095 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [384.08 182.647 401.016 192.834] +/Subtype /Link +/A << /S /GoTo /D (page.377) >> +>> endobj +11096 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [384.08 158.737 401.016 168.923] +/Subtype /Link +/A << /S /GoTo /D (page.379) >> +>> endobj +11097 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.748 146.064 494.684 156.968] +/Subtype /Link +/A << /S /GoTo /D (page.421) >> +>> endobj +11098 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [489.613 122.154 506.55 133.058] +/Subtype /Link +/A << /S /GoTo /D (page.167) >> +>> endobj +11099 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [384.08 87.006 401.016 97.192] +/Subtype /Link +/A << /S /GoTo /D (page.377) >> +>> endobj +11101 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +11105 0 obj << +/D [11103 0 R /XYZ 90 757.935 null] +>> endobj +11102 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F11 418 0 R /F23 340 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +11200 0 obj << +/Length 1569 +/Filter /FlateDecode +>> +stream +xÚ½Z]sšJ¾÷Wpwtæ„ì‚,Ði/CS[­Ò™´igg#«ÒòÕks~ýÙL£IX@§F!˳ÏûõìËP– +P.;çnçô-Ò[µ‘†w¡Ø@1T *®§Üv‡×ÎMï›û^éKâ×åÿèëHœî8nçgò³@ùՆ©šº¡ÌÃÎí7 xüü{¨ºm)›|T¨ô5ʬó±31À#&ðߚ¡˜š®d³NzÐè<‰ƒûõÁ#ÿŽvÿê•8…/i„OrÂP\”UÛ(¯ŸÒ€d~ý›s/H³eÉ~zÙQnO4tuÓ.ì”ÝV-î‚ÅIæ‡$À¿z'¬éŸiÝ‘•´¯†2ôÑpw‹Չâ6€/ºq0Ï>M<¯]!Ûª4tÄM<â4¦gÜÍF÷sS˜“‹ä©Qm¿<©P¡8‡bÕðñÓ>dá}Y‚xe ¯/ed,½Ú Ï\Ǚ83;—vnÎD¥ Ü¶è¨ +ýíhÜӍ.O5»î‘ p÷|<þЮipdÝٞî<‡~G¢¨¢a)€L£ÒìE²ÆsÑñޑ +¶¿É\¶@›Õ¹ÍhÊ+‘â„DcÊâuäñ²%Ñ2D{Áò®œßA¤?Y&ðç~*Úô‡uö0âù%Y¼ˆ™`ߐtó=¿À³IdݺiÊóxžÇђ­i$mÿíêrØÅÂ$òpèGâ^ !ðþ·¢A¤ö-MA:Tùç¹éRÙFîi#ò¨rÙÅÃ%ÖÞ¯”]`©/û X6ó¥™W°¨ûy@ŵF>r2ìOs Ó‘¹‘ò:IÂËÛóC )-à)¿öd­h ž°ø;•®1Rø…¸Ÿü +€Qì‡d)õ…]¯,u !•˜5¥}[ê¶ûUÓЋ×t-»2yÎß]}ÞøÄBVl7HM©«;±,òDlìv`sàÚþ×äØ)^°8Ää.åôKü‘¦ +¨ {Gƒbcã0ÈÁÀD¸h¿x™'q±éZ7tÚ~þ´ 6zÄ&"Œ¦5H¢jÅç*6'ø§. ’²(Õ[M†“ÕA©NeÏÏsxAYÑ2Õ±P¢Jt=x“ˆ‹hš‘Ú°TkD‘j‰ã=–›Õ·qðTöÄ\æ7÷_îZéh^[ƒª“âi7–âê¡IW¼!ðä̪·hòg)_‰k+Ý°Q³"AOE |;͹ôVñ¿ÝÍíg÷‡Ö–\oauÜ=Ï¿rån½T«úv–Ã֚~-KDÖ·ž¢ºñ IÒ\`òw­­ŽbÝ4¯Ö‹8ù³‘yúÂGxu]…¶±}žüúu1d÷°¡öms;¤©@œô-ÙÚnÚl ½ys Þ0¡ QÂWœÕ¸Ã±%\J•ßøÙªÁž‰Ù +5=2lÍíÔ +µ-Y´…-‹]À¦ÑŒ†zv¼ò—+ʎ]û{“=õÃ$ð÷xŠõ_ô™¥,¶j·ßûï +Ø\ó’í«#HµMÝ*_b1lÕ0úkwE{ùô—åáv÷²8,·0‹ƒO)eÿô £›ÇW$Z“ øý ð/N-NUãÿ‚jïD‡ ;£´4¶°ì‡²ýõA¼tc<â -SՁ¶Õ¹U–%¯NO7›:OÕuä'Lõ³Ó$ NwÜ·g5„}Õ|YpÍ͉…1+Í÷#~2ÌÓYÝâþÿD6ùM +endstream +endobj +11199 0 obj << +/Type /Page +/Contents 11200 0 R +/Resources 11198 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 11202 0 R +/Annots [ 11100 0 R 11106 0 R 11107 0 R 11108 0 R 11109 0 R 11110 0 R 11111 0 R 11112 0 R 11113 0 R 11114 0 R 11115 0 R 11116 0 R 11117 0 R 11118 0 R 11119 0 R 11120 0 R 11121 0 R 11122 0 R 11123 0 R 11124 0 R 11125 0 R 11126 0 R 11127 0 R 11128 0 R 11129 0 R 11130 0 R 11131 0 R 11132 0 R 11133 0 R 11134 0 R 11135 0 R 11136 0 R 11137 0 R 11138 0 R 11139 0 R 11140 0 R 11141 0 R 11142 0 R 11143 0 R 11144 0 R 11145 0 R 11146 0 R 11147 0 R 11148 0 R 11149 0 R 11150 0 R 11151 0 R 11152 0 R 11153 0 R 11154 0 R 11155 0 R 11156 0 R 11157 0 R 11158 0 R 11159 0 R 11160 0 R 11161 0 R 11162 0 R 11163 0 R 11164 0 R 11165 0 R 11166 0 R 11167 0 R 11168 0 R 11169 0 R 11170 0 R 11171 0 R 11172 0 R 11173 0 R 11174 0 R 11175 0 R 11176 0 R 11177 0 R 11178 0 R 11179 0 R 11180 0 R 11181 0 R 11182 0 R 11183 0 R 11184 0 R 11185 0 R 11186 0 R 11187 0 R 11188 0 R 11189 0 R 11190 0 R 11191 0 R 11192 0 R 11193 0 R 11194 0 R 11195 0 R 11197 0 R ] +>> endobj +11100 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.598 708.674 184.535 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.379) >> +>> endobj +11106 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 674.149 145.791 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.287) >> +>> endobj +11107 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.819 648.899 208.774 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +11108 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.819 624.988 208.774 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +11109 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 590.463 145.791 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.286) >> +>> endobj +11110 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 554.478 145.791 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.159) >> +>> endobj +11111 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [261.266 518.667 278.203 529.571] +/Subtype /Link +/A << /S /GoTo /D (page.421) >> +>> endobj +11112 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 483.519 187.046 493.705] +/Subtype /Link +/A << /S /GoTo /D (page.372) >> +>> endobj +11113 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 448.993 145.791 457.84] +/Subtype /Link +/A << /S /GoTo /D (page.256) >> +>> endobj +11114 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 413.128 145.791 421.974] +/Subtype /Link +/A << /S /GoTo /D (page.256) >> +>> endobj +11115 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.763 387.534 180.7 398.064] +/Subtype /Link +/A << /S /GoTo /D (page.179) >> +>> endobj +11116 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [235.155 375.579 252.092 386.109] +/Subtype /Link +/A << /S /GoTo /D (page.179) >> +>> endobj +11117 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [213.576 363.623 230.513 374.154] +/Subtype /Link +/A << /S /GoTo /D (page.179) >> +>> endobj +11118 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.611 340.057 210.547 350.243] +/Subtype /Link +/A << /S /GoTo /D (page.198) >> +>> endobj +11119 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [136.595 328.102 153.532 338.288] +/Subtype /Link +/A << /S /GoTo /D (page.198) >> +>> endobj +11120 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.24 316.146 160.177 326.333] +/Subtype /Link +/A << /S /GoTo /D (page.198) >> +>> endobj +11121 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.895 304.191 150.832 314.378] +/Subtype /Link +/A << /S /GoTo /D (page.198) >> +>> endobj +11122 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [136.595 280.281 153.532 290.468] +/Subtype /Link +/A << /S /GoTo /D (page.256) >> +>> endobj +11123 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [173.327 268.326 190.264 278.512] +/Subtype /Link +/A << /S /GoTo /D (page.256) >> +>> endobj +11124 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.24 256.371 160.177 266.557] +/Subtype /Link +/A << /S /GoTo /D (page.256) >> +>> endobj +11125 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.761 232.46 170.697 242.647] +/Subtype /Link +/A << /S /GoTo /D (page.283) >> +>> endobj +11126 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [275.125 220.505 292.061 230.692] +/Subtype /Link +/A << /S /GoTo /D (page.283) >> +>> endobj +11127 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [272.963 208.55 289.899 218.737] +/Subtype /Link +/A << /S /GoTo /D (page.283) >> +>> endobj +11128 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [212.42 196.595 229.357 206.781] +/Subtype /Link +/A << /S /GoTo /D (page.283) >> +>> endobj +11129 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [199.528 183.922 211.484 194.826] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +11130 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.018 172.684 152.974 182.871] +/Subtype /Link +/A << /S /GoTo /D (page.75) >> +>> endobj +11131 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [189.008 160.012 200.963 170.916] +/Subtype /Link +/A << /S /GoTo /D (page.76) >> +>> endobj +11132 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [221.825 148.057 233.78 158.961] +/Subtype /Link +/A << /S /GoTo /D (page.75) >> +>> endobj +11133 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.636 136.102 278.591 147.005] +/Subtype /Link +/A << /S /GoTo /D (page.76) >> +>> endobj +11134 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.679 124.146 216.634 135.05] +/Subtype /Link +/A << /S /GoTo /D (page.75) >> +>> endobj +11135 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [248.235 112.191 260.19 123.095] +/Subtype /Link +/A << /S /GoTo /D (page.77) >> +>> endobj +11136 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.195 100.236 191.15 111.14] +/Subtype /Link +/A << /S /GoTo /D (page.93) >> +>> endobj +11137 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.182 88.281 253.137 99.185] +/Subtype /Link +/A << /S /GoTo /D (page.93) >> +>> endobj +11138 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [399.552 719.912 411.507 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.95) >> +>> endobj +11139 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [461.539 707.957 473.494 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.96) >> +>> endobj +11140 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [389.051 696.719 401.006 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.93) >> +>> endobj +11141 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [451.038 684.764 462.993 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.93) >> +>> endobj +11142 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [392.926 672.809 404.882 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.94) >> +>> endobj +11143 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [454.913 660.854 466.868 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.94) >> +>> endobj +11144 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [438.127 648.181 450.082 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.96) >> +>> endobj +11145 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [500.114 636.226 512.069 647.13] +/Subtype /Link +/A << /S /GoTo /D (page.96) >> +>> endobj +11146 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [431.501 624.271 443.457 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.94) >> +>> endobj +11147 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [493.488 612.316 505.443 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.95) >> +>> endobj +11148 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [473.165 600.361 490.101 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.105) >> +>> endobj +11149 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [474.271 588.405 491.207 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.105) >> +>> endobj +11150 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [382.157 576.45 394.112 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.99) >> +>> endobj +11151 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [394.879 564.495 411.816 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.100) >> +>> endobj +11152 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.559 552.54 385.515 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.87) >> +>> endobj +11153 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [388.503 552.54 400.459 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.89) >> +>> endobj +11154 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [441.086 540.585 458.022 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.103) >> +>> endobj +11155 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [421.45 528.63 438.386 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.101) >> +>> endobj +11156 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [434.172 516.674 451.108 527.578] +/Subtype /Link +/A << /S /GoTo /D (page.102) >> +>> endobj +11157 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.995 505.437 423.951 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.90) >> +>> endobj +11158 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [412.603 493.481 424.558 503.668] +/Subtype /Link +/A << /S /GoTo /D (page.90) >> +>> endobj +11159 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [440.936 480.809 457.872 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.102) >> +>> endobj +11160 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [460.861 480.809 477.798 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.103) >> +>> endobj +11161 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [429.21 468.854 446.147 479.758] +/Subtype /Link +/A << /S /GoTo /D (page.104) >> +>> endobj +11162 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [407.302 456.899 424.239 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.106) >> +>> endobj +11163 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.79 445.661 382.745 455.847] +/Subtype /Link +/A << /S /GoTo /D (page.92) >> +>> endobj +11164 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [363.597 433.706 375.552 443.892] +/Subtype /Link +/A << /S /GoTo /D (page.91) >> +>> endobj +11165 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [400.408 421.033 412.363 431.937] +/Subtype /Link +/A << /S /GoTo /D (page.99) >> +>> endobj +11166 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [436.084 409.078 453.02 419.982] +/Subtype /Link +/A << /S /GoTo /D (page.109) >> +>> endobj +11167 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [432.617 397.123 449.554 408.027] +/Subtype /Link +/A << /S /GoTo /D (page.107) >> +>> endobj +11168 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [423.92 385.168 440.856 396.071] +/Subtype /Link +/A << /S /GoTo /D (page.107) >> +>> endobj +11169 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.056 373.212 449.992 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.100) >> +>> endobj +11170 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [445.778 361.257 462.714 372.161] +/Subtype /Link +/A << /S /GoTo /D (page.101) >> +>> endobj +11171 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [419.497 349.302 436.433 360.206] +/Subtype /Link +/A << /S /GoTo /D (page.105) >> +>> endobj +11172 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [372.444 338.064 389.38 348.251] +/Subtype /Link +/A << /S /GoTo /D (page.108) >> +>> endobj +11173 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [406.764 325.392 418.719 336.296] +/Subtype /Link +/A << /S /GoTo /D (page.98) >> +>> endobj +11174 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [468.751 313.437 480.706 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.98) >> +>> endobj +11175 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [396.264 301.481 408.219 312.385] +/Subtype /Link +/A << /S /GoTo /D (page.92) >> +>> endobj +11176 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [434.45 289.526 451.387 300.43] +/Subtype /Link +/A << /S /GoTo /D (page.109) >> +>> endobj +11177 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [454.375 289.526 471.312 300.43] +/Subtype /Link +/A << /S /GoTo /D (page.110) >> +>> endobj +11178 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [489.643 277.571 506.579 288.475] +/Subtype /Link +/A << /S /GoTo /D (page.103) >> +>> endobj +11179 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [474.151 265.616 491.087 276.52] +/Subtype /Link +/A << /S /GoTo /D (page.104) >> +>> endobj +11180 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [468.054 253.661 484.99 264.565] +/Subtype /Link +/A << /S /GoTo /D (page.105) >> +>> endobj +11181 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [425.026 241.706 441.962 252.609] +/Subtype /Link +/A << /S /GoTo /D (page.106) >> +>> endobj +11182 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.684 230.468 381.639 240.654] +/Subtype /Link +/A << /S /GoTo /D (page.90) >> +>> endobj +11183 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.03 218.512 379.985 228.699] +/Subtype /Link +/A << /S /GoTo /D (page.91) >> +>> endobj +11184 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.084 205.84 396.021 216.744] +/Subtype /Link +/A << /S /GoTo /D (page.108) >> +>> endobj +11185 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.824 193.885 391.761 204.789] +/Subtype /Link +/A << /S /GoTo /D (page.108) >> +>> endobj +11186 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [438.295 181.93 455.232 192.834] +/Subtype /Link +/A << /S /GoTo /D (page.108) >> +>> endobj +11187 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.221 181.93 475.157 192.834] +/Subtype /Link +/A << /S /GoTo /D (page.109) >> +>> endobj +11188 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [426.67 169.975 438.625 180.878] +/Subtype /Link +/A << /S /GoTo /D (page.97) >> +>> endobj +11189 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [430.545 158.019 442.5 168.923] +/Subtype /Link +/A << /S /GoTo /D (page.97) >> +>> endobj +11190 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [420.044 146.781 432 156.968] +/Subtype /Link +/A << /S /GoTo /D (page.96) >> +>> endobj +11191 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [423.92 134.826 435.875 145.013] +/Subtype /Link +/A << /S /GoTo /D (page.97) >> +>> endobj +11192 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.522 122.871 395.477 133.058] +/Subtype /Link +/A << /S /GoTo /D (page.92) >> +>> endobj +11193 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [467.885 110.199 484.821 121.103] +/Subtype /Link +/A << /S /GoTo /D (page.106) >> +>> endobj +11194 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [437.449 98.244 454.386 109.147] +/Subtype /Link +/A << /S /GoTo /D (page.106) >> +>> endobj +11195 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [454.226 86.288 466.181 97.192] +/Subtype /Link +/A << /S /GoTo /D (page.99) >> +>> endobj +11197 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +11201 0 obj << +/D [11199 0 R /XYZ 90 757.935 null] +>> endobj +11198 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F11 418 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +11317 0 obj << +/Length 1528 +/Filter /FlateDecode +>> +stream +xÚ͚YsÛ6€ßõ+øViZÁIððÄ~ˆ›¤MÛLš¸3:DA^I+ê¯/x9-àÑNlKõa»Ø˄ÚVƒÚ«ÙóÛÙÅKËÐ\àZº¥Ýn4j¶…Ö‘v»Öîæ?¿ùñş‹·¯5:bK|¯üÀ4ìâòìÅíìË ‰«PCå·± lk~8»ûµµ¸þZƒÀpm_Þj¦nˆ¿ö~öû K‚á‘$Š×:ÖlÝÐÂÕªiƙŸϏ£Œ°(ý¡¢Zok1Þ½šiwKù«×ŸW«ˆ_K„€‹Ü~àœ$ +B°“±z4 IJ=’¦lɀ°[®<ú ]…†2ínP’Pî­âÿéÝ_Ððn(ÏØuŸdOkd¸ÀÁè”þÈO*¬Ó»ü8L§RŸCé³,ï‰¼µ5O4½¼¼Q¬å»Ës[Ñ-Xüµï"ç”'ëu¶<§‘/[ï>)§°tZu„3)ÌêK‡Ò¬o4NýÂ>? SkÝF•ú&ħÞZÛ(e‚\†®èZ7ð0xÂãOTy¤øÍBÇóâœEÔc!ÙJ}Õ@êÀ„ÓQÌÚ-Ê°+L6@X£Sس`e¡Ø©·áqè‘U\8Þ}ñK Ô¹+ąä{)Óìd*=½•>îæô‡sñøKO«ÑÄ÷Ûò"Ây¥‹¶Šå‰Ä¡KiÔÙ½;"RI(?ª@K¬BO:Ò+M¤wïٚ•þ¿¡¼ˆ´ª:ÂNûÒÜ„H$âVšu®Ù]ÏV%WRDÀVX” +ܝ 6qð8ҎdniD9 Dõ9(x¡ö‘“~C&Žrȓñ3OäSÊï 6 ¤¸î‚¾ÀÕñ­©½‡<ªäGÒJUS‘ƒ…§Œ<4 1-N˧XË?²0 „5J ³ì0öʝÏì. хeÂñÊ]b“8 }öÏìô˜$ýp÷†ä«Jû(Ë°Š]¨,RÇÂwIó⦋—Í$  7#gϪ[Nǘ®ÓÜ"ݘvÓj:Àró]]õŵL'Êلl"lˆ,Û£=q;÷ë j:ˋC°ˆÞ÷\µ¶¡ýWӑLG×,aOK7›õê@½gÙ®O_éHÔ8M§æªsv°¸VícPÁY‘q•úގmw"ÛL“Z‹LLO'Ê⠎…IÀ6/O‹Š¼(Yëè?M¡Ùwì*Kšý¦’öA}`* ;½'¦²zcÜTóýìH±sÚvópQ^¿·ë‹“Åš®²ÏèÙњݎ#J™ƒ·Ëƒ`ÈV¶Ù¶rGýÏÅ¿ Dõ&W”÷]óܒd•*º–ÏßÂ<˜Vm°TCŒ;C‡O™²@’Ž>(0›ÃPL(ýwvF ¹Üá$’<8®È+E¸ŸÆpuä§<"Š4Æ"×x«C&/:p÷ìXÔFóiì¹õ×Ó(,@ý²„Ç¢$—Û֕u™ßú‘G¨dU }KùH§0Ñ'åSˆ÷Åbë½H)"ÊiI0¥xNãQeÎ/ïŸZÞêۖžéJm`›®jSÚK×4'ï’meÎvÉúPdûsõßnÐõÿË^××£íeÁ)íuý/Û«u¾¾™ÖôÒá|9ëêjdÉçÙøœÆI÷^ݳæÒшÕ=­L¢h÷T!ý•s¾¤ƒÎWӕڏIö'‹³>;ûj?¦e9ÀEŽêSZÍÓYpméŸÃ.À¸žÝîè¢\ÿ¡}ªß6=Tõ¶n¤ª7¤”·ÀxžVï#QN‚êõˆa5y៥º‚@!°Xb‡ßSZ+[iöYk^ýR<׆äEŽ ¨7!c—eÉåÅÅ~¿~ +òˆ%°ì"I‚‹“íki ìÈFòR0a Z}‰‹a9é' ±ÿÿí¾„È +endstream +endobj +11316 0 obj << +/Type /Page +/Contents 11317 0 R +/Resources 11315 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 11202 0 R +/Annots [ 11196 0 R 11203 0 R 11204 0 R 11205 0 R 11206 0 R 11207 0 R 11208 0 R 11209 0 R 11210 0 R 11211 0 R 11212 0 R 11213 0 R 11214 0 R 11215 0 R 11216 0 R 11217 0 R 11218 0 R 11219 0 R 11220 0 R 11221 0 R 11222 0 R 11223 0 R 11224 0 R 11225 0 R 11226 0 R 11227 0 R 11228 0 R 11229 0 R 11230 0 R 11231 0 R 11232 0 R 11233 0 R 11234 0 R 11235 0 R 11236 0 R 11237 0 R 11238 0 R 11239 0 R 11240 0 R 11241 0 R 11242 0 R 11243 0 R 11244 0 R 11245 0 R 11246 0 R 11247 0 R 11248 0 R 11249 0 R 11250 0 R 11251 0 R 11252 0 R 11253 0 R 11254 0 R 11255 0 R 11256 0 R 11257 0 R 11258 0 R 11259 0 R 11260 0 R 11261 0 R 11262 0 R 11263 0 R 11264 0 R 11265 0 R 11266 0 R 11267 0 R 11268 0 R 11269 0 R 11270 0 R 11271 0 R 11272 0 R 11273 0 R 11274 0 R 11275 0 R 11276 0 R 11277 0 R 11278 0 R 11279 0 R 11280 0 R 11281 0 R 11282 0 R 11283 0 R 11284 0 R 11285 0 R 11286 0 R 11287 0 R 11288 0 R 11289 0 R 11290 0 R 11291 0 R 11292 0 R 11293 0 R 11294 0 R 11295 0 R 11296 0 R 11297 0 R 11298 0 R 11299 0 R 11300 0 R 11301 0 R 11302 0 R 11303 0 R 11304 0 R 11305 0 R 11306 0 R 11307 0 R 11308 0 R 11309 0 R 11310 0 R 11311 0 R 11312 0 R 11314 0 R ] +>> endobj +11196 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.772 719.912 191.727 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.92) >> +>> endobj +11203 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.284 707.957 151.22 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.110) >> +>> endobj +11204 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.389 696.002 208.325 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.102) >> +>> endobj +11205 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.396 684.764 172.351 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.97) >> +>> endobj +11206 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.371 672.092 208.326 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.98) >> +>> endobj +11207 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [258.357 660.136 270.313 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.98) >> +>> endobj +11208 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.292 648.181 245.247 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.99) >> +>> endobj +11209 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 626.328 145.791 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.110) >> +>> endobj +11210 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.211 612.316 165.148 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.111) >> +>> endobj +11211 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.401 588.405 234.337 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.112) >> +>> endobj +11212 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [221.675 576.45 238.612 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.112) >> +>> endobj +11213 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.195 564.495 196.132 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.127) >> +>> endobj +11214 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.071 552.54 200.007 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.127) >> +>> endobj +11215 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.57 541.302 189.506 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.126) >> +>> endobj +11216 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.445 529.347 193.382 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.126) >> +>> endobj +11217 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [221.646 516.674 238.582 527.578] +/Subtype /Link +/A << /S /GoTo /D (page.127) >> +>> endobj +11218 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.02 504.719 231.957 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.126) >> +>> endobj +11219 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.684 492.764 273.62 503.668] +/Subtype /Link +/A << /S /GoTo /D (page.135) >> +>> endobj +11220 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.789 480.809 274.726 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.135) >> +>> endobj +11221 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.676 468.854 182.612 479.758] +/Subtype /Link +/A << /S /GoTo /D (page.131) >> +>> endobj +11222 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.398 456.899 195.334 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.131) >> +>> endobj +11223 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.968 444.943 221.905 455.847] +/Subtype /Link +/A << /S /GoTo /D (page.133) >> +>> endobj +11224 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.69 432.988 234.627 443.892] +/Subtype /Link +/A << /S /GoTo /D (page.133) >> +>> endobj +11225 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.514 421.75 212.451 431.937] +/Subtype /Link +/A << /S /GoTo /D (page.123) >> +>> endobj +11226 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.122 409.795 213.058 419.982] +/Subtype /Link +/A << /S /GoTo /D (page.124) >> +>> endobj +11227 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [130.518 397.84 147.454 408.027] +/Subtype /Link +/A << /S /GoTo /D (page.120) >> +>> endobj +11228 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [150.443 397.84 167.38 408.027] +/Subtype /Link +/A << /S /GoTo /D (page.123) >> +>> endobj +11229 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [212.729 385.168 229.665 396.071] +/Subtype /Link +/A << /S /GoTo /D (page.135) >> +>> endobj +11230 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [209.112 373.212 226.049 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.134) >> +>> endobj +11231 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.821 361.257 207.757 372.161] +/Subtype /Link +/A << /S /GoTo /D (page.136) >> +>> endobj +11232 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.308 350.019 171.245 360.206] +/Subtype /Link +/A << /S /GoTo /D (page.123) >> +>> endobj +11233 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.115 338.064 164.052 348.251] +/Subtype /Link +/A << /S /GoTo /D (page.125) >> +>> endobj +11234 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.927 325.392 200.863 336.296] +/Subtype /Link +/A << /S /GoTo /D (page.130) >> +>> endobj +11235 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [219.603 313.437 236.539 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.140) >> +>> endobj +11236 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.136 301.481 233.073 312.385] +/Subtype /Link +/A << /S /GoTo /D (page.137) >> +>> endobj +11237 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.439 289.526 224.375 300.43] +/Subtype /Link +/A << /S /GoTo /D (page.137) >> +>> endobj +11238 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.574 277.571 233.511 288.475] +/Subtype /Link +/A << /S /GoTo /D (page.131) >> +>> endobj +11239 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.499 277.571 253.436 288.475] +/Subtype /Link +/A << /S /GoTo /D (page.132) >> +>> endobj +11240 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [229.296 265.616 246.233 276.52] +/Subtype /Link +/A << /S /GoTo /D (page.132) >> +>> endobj +11241 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [161.252 253.661 178.189 264.565] +/Subtype /Link +/A << /S /GoTo /D (page.138) >> +>> endobj +11242 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.389 241.706 200.326 252.609] +/Subtype /Link +/A << /S /GoTo /D (page.138) >> +>> endobj +11243 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.639 229.75 200.575 240.654] +/Subtype /Link +/A << /S /GoTo /D (page.138) >> +>> endobj +11244 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.283 217.795 207.219 228.699] +/Subtype /Link +/A << /S /GoTo /D (page.130) >> +>> endobj +11245 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.782 205.84 196.719 216.744] +/Subtype /Link +/A << /S /GoTo /D (page.126) >> +>> endobj +11246 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.969 193.885 234.905 204.789] +/Subtype /Link +/A << /S /GoTo /D (page.140) >> +>> endobj +11247 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [237.894 193.885 254.83 204.789] +/Subtype /Link +/A << /S /GoTo /D (page.141) >> +>> endobj +11248 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.67 181.93 274.606 192.834] +/Subtype /Link +/A << /S /GoTo /D (page.134) >> +>> endobj +11249 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.544 169.975 225.481 180.878] +/Subtype /Link +/A << /S /GoTo /D (page.136) >> +>> endobj +11250 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.202 158.737 170.139 168.923] +/Subtype /Link +/A << /S /GoTo /D (page.124) >> +>> endobj +11251 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.549 146.781 168.485 156.968] +/Subtype /Link +/A << /S /GoTo /D (page.125) >> +>> endobj +11252 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.603 134.109 179.539 145.013] +/Subtype /Link +/A << /S /GoTo /D (page.139) >> +>> endobj +11253 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.343 122.154 175.28 133.058] +/Subtype /Link +/A << /S /GoTo /D (page.139) >> +>> endobj +11254 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.416 110.199 214.353 121.103] +/Subtype /Link +/A << /S /GoTo /D (page.129) >> +>> endobj +11255 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [201.292 98.244 218.228 109.147] +/Subtype /Link +/A << /S /GoTo /D (page.129) >> +>> endobj +11256 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [221.814 86.288 238.751 97.192] +/Subtype /Link +/A << /S /GoTo /D (page.139) >> +>> endobj +11257 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [426.67 719.912 443.606 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.128) >> +>> endobj +11258 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [430.545 707.957 447.482 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.128) >> +>> endobj +11259 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [420.044 696.719 436.981 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.128) >> +>> endobj +11260 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [423.92 684.764 440.856 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.128) >> +>> endobj +11261 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.522 672.809 400.458 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.123) >> +>> endobj +11262 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [467.885 660.136 484.821 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.136) >> +>> endobj +11263 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [437.449 648.181 454.386 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.136) >> +>> endobj +11264 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [376.627 636.943 393.564 647.13] +/Subtype /Link +/A << /S /GoTo /D (page.138) >> +>> endobj +11265 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [454.226 624.271 471.162 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.130) >> +>> endobj +11266 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [396.254 612.316 413.19 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.126) >> +>> endobj +11267 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [407.87 600.361 424.806 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.134) >> +>> endobj +11268 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [376.877 589.123 393.813 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.129) >> +>> endobj +11269 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [412.852 576.45 429.788 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.130) >> +>> endobj +11270 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [449.773 564.495 466.71 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.130) >> +>> endobj +11271 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [479.113 552.54 496.049 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.141) >> +>> endobj +11272 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [387.955 540.585 404.892 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.143) >> +>> endobj +11273 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [407.881 540.585 424.817 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.146) >> +>> endobj +11274 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [435.397 528.63 452.333 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.146) >> +>> endobj +11275 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [493.937 516.674 510.873 527.578] +/Subtype /Link +/A << /S /GoTo /D (page.146) >> +>> endobj +11276 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.559 504.719 390.496 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.157) >> +>> endobj +11277 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [395.148 492.764 412.085 503.668] +/Subtype /Link +/A << /S /GoTo /D (page.157) >> +>> endobj +11278 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [363.597 480.809 380.533 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.155) >> +>> endobj +11279 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.665 468.854 391.601 479.758] +/Subtype /Link +/A << /S /GoTo /D (page.156) >> +>> endobj +11280 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [360.827 456.899 377.763 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.155) >> +>> endobj +11281 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [347.547 444.943 364.484 455.847] +/Subtype /Link +/A << /S /GoTo /D (page.158) >> +>> endobj +11282 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [366.914 433.706 383.851 443.892] +/Subtype /Link +/A << /S /GoTo /D (page.155) >> +>> endobj +11283 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [398.615 421.033 415.552 431.937] +/Subtype /Link +/A << /S /GoTo /D (page.157) >> +>> endobj +11284 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [439.262 409.078 456.199 419.982] +/Subtype /Link +/A << /S /GoTo /D (page.156) >> +>> endobj +11285 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.098 397.123 396.035 408.027] +/Subtype /Link +/A << /S /GoTo /D (page.156) >> +>> endobj +11286 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.665 385.168 391.602 396.071] +/Subtype /Link +/A << /S /GoTo /D (page.157) >> +>> endobj +11287 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.69 373.212 403.626 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.157) >> +>> endobj +11288 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [350.875 361.257 367.811 372.161] +/Subtype /Link +/A << /S /GoTo /D (page.159) >> +>> endobj +11289 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.809 349.302 387.746 360.206] +/Subtype /Link +/A << /S /GoTo /D (page.155) >> +>> endobj +11290 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.534 337.347 386.471 348.251] +/Subtype /Link +/A << /S /GoTo /D (page.155) >> +>> endobj +11291 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [400.149 325.392 417.086 336.296] +/Subtype /Link +/A << /S /GoTo /D (page.155) >> +>> endobj +11292 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [399.572 314.154 416.508 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.155) >> +>> endobj +11293 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [392.398 301.481 409.335 312.385] +/Subtype /Link +/A << /S /GoTo /D (page.155) >> +>> endobj +11294 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.223 289.526 392.159 300.43] +/Subtype /Link +/A << /S /GoTo /D (page.157) >> +>> endobj +11295 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.516 277.571 391.452 288.475] +/Subtype /Link +/A << /S /GoTo /D (page.156) >> +>> endobj +11296 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [394.441 277.571 411.378 288.475] +/Subtype /Link +/A << /S /GoTo /D (page.157) >> +>> endobj +11297 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [371.336 265.616 388.272 276.52] +/Subtype /Link +/A << /S /GoTo /D (page.158) >> +>> endobj +11298 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.084 253.661 396.021 264.565] +/Subtype /Link +/A << /S /GoTo /D (page.159) >> +>> endobj +11299 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [376.954 241.706 393.891 252.609] +/Subtype /Link +/A << /S /GoTo /D (page.158) >> +>> endobj +11300 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [371.336 229.75 388.272 240.654] +/Subtype /Link +/A << /S /GoTo /D (page.158) >> +>> endobj +11301 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.084 217.795 396.021 228.699] +/Subtype /Link +/A << /S /GoTo /D (page.160) >> +>> endobj +11302 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [376.954 205.84 393.891 216.744] +/Subtype /Link +/A << /S /GoTo /D (page.158) >> +>> endobj +11303 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.206 193.885 386.142 204.789] +/Subtype /Link +/A << /S /GoTo /D (page.156) >> +>> endobj +11304 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [366.705 181.93 383.642 192.834] +/Subtype /Link +/A << /S /GoTo /D (page.156) >> +>> endobj +11305 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.824 169.975 391.761 180.878] +/Subtype /Link +/A << /S /GoTo /D (page.158) >> +>> endobj +11306 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.856 158.019 372.792 168.923] +/Subtype /Link +/A << /S /GoTo /D (page.159) >> +>> endobj +11307 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [371.487 146.781 388.424 156.968] +/Subtype /Link +/A << /S /GoTo /D (page.161) >> +>> endobj +11308 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [344.23 134.109 361.166 145.013] +/Subtype /Link +/A << /S /GoTo /D (page.158) >> +>> endobj +11309 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.223 122.154 392.159 133.058] +/Subtype /Link +/A << /S /GoTo /D (page.158) >> +>> endobj +11310 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [394.6 110.199 411.537 121.103] +/Subtype /Link +/A << /S /GoTo /D (page.157) >> +>> endobj +11311 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [350.765 98.244 367.702 109.147] +/Subtype /Link +/A << /S /GoTo /D (page.161) >> +>> endobj +11312 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [425.036 86.288 441.972 97.192] +/Subtype /Link +/A << /S /GoTo /D (page.155) >> +>> endobj +11314 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +11318 0 obj << +/D [11316 0 R /XYZ 90 757.935 null] +>> endobj +11315 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F11 418 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +11429 0 obj << +/Length 1421 +/Filter /FlateDecode +>> +stream +xÚÍZ[oÛ6~÷¯ÐË0XhR²nAӇ^R´]·¬ñ€iA0ã•(—¢êz¿~”%±âˆ¤­¤{±-›þÎwϕttތ^ÌGÓóÀsbnàÌoœ:a€€ï"gž:Wã·¼zýÏäóü3ƒ€~ þ·ùaæEõ×£×óÑ×RßBmþí‡ ô|'ÉGWŸ¡“ªïß9xqä¬6«rgæzê=s.Gà]&>¼ÃAõÙõÐõ üFªO0)K¶à¿mä7‚Å¢eðñÍȹ:q}8F~Ð.h$8'¨˜©èj—ØR9™E ˆ½ý„¦‡*tpΎ´ôèìl Sÿr,P°¹ô«WJ¡<åOåj‚à˜,µ0Q_† ¬2$¾\«˜ÏéÅ òÑ.Ï»«HšâŠ3‰EQ§ÏU‰ OUJȪœ—:C×0‡êø›á1^R!yÊtz}é °ó§{`GT\|²é:ö¹M³S§§u¡‘˜ÉÆZÖäöAëÈ©@%L_ØÂÙ#´ì͵æìÚiXÍí[ýB2EËâxX›Þ@fSÈ5hæ·'àT¿;‹Mã-r»ñA<›ý¼™$€áì£-»Q§“~j“>ÿíðóÁ ÚËçì öçÀf¥ë¨˜ù$‚ãõRÛ:…ñ=O›h zÞg¾¯ë‰Bƒ—¶aX¨ÚD«$c)%§ªû'õxgt†ëBÛnÅîc 7.ì¾25ÛÔfçL®­uìgœ1®M®qôØ +¡aâ»g(ƒì@ÜSåƒ;µ-‘š ëCw¤õAUPï,ÖîboàAŠ‡Î°¦ xlræg–€ÍÎìî9ØÞCÆ2a gIµhýg¯¾? ø Á„ž±„ÃmìÀ‡÷¹ÙWýø-—´^³ z±Ï]—†1¬cõ·Âõ™z^e¦âûÈÆ&߉š;ڎaHXµÁ\Í9Í ±VU_¯%-m ց^$é0PKóH¼m‘äÃ㍣è_÷ê] ¶ÂmÇTÑcñè@Z–_…©º Ú]”…<ÞeHŸ‚i«r òRššßqw½~Ãî‚mnÝ匳\—Óõ\ ärX4;¢ž6Ù&¦wg\ofÂs{ÐeEÓYoOß͎¨z¡|/ 'q“½ßÄOƒ‡Ðõ¶ -ùZÚW¯”:Õ¬“ŒÚE™·÷„©û”XE¦‰m @zQû˜šßo¨æ·t²‘ÿ#?¶—Û$Ù\¶™²¹ø»¤â׉ïËæúáɚϟ ÛC¦’¼ù«~B`r⩖ø’ÒVÙF³/ÎöÓûú±:ÿ_…Àƒî¶/¿•ry:®V+” âl)“Óå2›î˜¯£5B3þ¹Q3†˜*3­úŒßԏÔ‡Ë`HÙÿ?Êܘ +endstream +endobj +11428 0 obj << +/Type /Page +/Contents 11429 0 R +/Resources 11427 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 11202 0 R +/Annots [ 11313 0 R 11319 0 R 11320 0 R 11321 0 R 11322 0 R 11323 0 R 11324 0 R 11325 0 R 11326 0 R 11327 0 R 11328 0 R 11329 0 R 11330 0 R 11331 0 R 11332 0 R 11333 0 R 11334 0 R 11335 0 R 11336 0 R 11337 0 R 11338 0 R 11339 0 R 11340 0 R 11341 0 R 11342 0 R 11343 0 R 11344 0 R 11345 0 R 11346 0 R 11347 0 R 11348 0 R 11349 0 R 11350 0 R 11351 0 R 11352 0 R 11353 0 R 11354 0 R 11355 0 R 11356 0 R 11357 0 R 11358 0 R 11359 0 R 11360 0 R 11361 0 R 11362 0 R 11363 0 R 11364 0 R 11365 0 R 11366 0 R 11367 0 R 11368 0 R 11369 0 R 11370 0 R 11371 0 R 11372 0 R 11373 0 R 11374 0 R 11375 0 R 11376 0 R 11377 0 R 11378 0 R 11379 0 R 11380 0 R 11381 0 R 11382 0 R 11383 0 R 11384 0 R 11385 0 R 11386 0 R 11387 0 R 11388 0 R 11389 0 R 11390 0 R 11391 0 R 11392 0 R 11393 0 R 11394 0 R 11395 0 R 11396 0 R 11397 0 R 11398 0 R 11399 0 R 11400 0 R 11401 0 R 11402 0 R 11403 0 R 11404 0 R 11405 0 R 11406 0 R 11407 0 R 11408 0 R 11409 0 R 11410 0 R 11411 0 R 11412 0 R 11413 0 R 11414 0 R 11415 0 R 11416 0 R 11417 0 R 11418 0 R 11419 0 R 11420 0 R 11421 0 R 11422 0 R 11423 0 R 11424 0 R 11426 0 R ] +>> endobj +11313 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [164.271 719.912 181.207 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.156) >> +>> endobj +11319 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.207 707.957 270.143 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.161) >> +>> endobj +11320 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [155.713 696.719 172.649 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.166) >> +>> endobj +11321 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.049 684.047 178.986 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.165) >> +>> endobj +11322 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.636 672.092 174.572 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.166) >> +>> endobj +11323 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [173.137 660.854 190.074 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.166) >> +>> endobj +11324 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [202.438 648.181 219.374 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.166) >> +>> endobj +11325 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.579 636.226 189.516 647.13] +/Subtype /Link +/A << /S /GoTo /D (page.166) >> +>> endobj +11326 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.75 624.988 170.687 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.167) >> +>> endobj +11327 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.603 612.316 179.539 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.167) >> +>> endobj +11328 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.875 600.361 166.812 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.167) >> +>> endobj +11329 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [155.494 588.405 172.43 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.166) >> +>> endobj +11330 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.343 576.45 175.28 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.167) >> +>> endobj +11331 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [161.023 564.495 177.96 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.167) >> +>> endobj +11332 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.339 552.54 192.276 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.166) >> +>> endobj +11333 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.638 540.585 200.575 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.167) >> +>> endobj +11334 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.284 528.63 151.22 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.168) >> +>> endobj +11335 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 506.777 145.791 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.168) >> +>> endobj +11336 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [230.99 493.481 247.927 503.668] +/Subtype /Link +/A << /S /GoTo /D (page.172) >> +>> endobj +11337 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.37 480.809 213.307 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.172) >> +>> endobj +11338 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [136.047 469.571 152.983 479.758] +/Subtype /Link +/A << /S /GoTo /D (page.172) >> +>> endobj +11339 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.603 456.899 179.539 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.173) >> +>> endobj +11340 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.284 444.943 151.22 455.847] +/Subtype /Link +/A << /S /GoTo /D (page.173) >> +>> endobj +11341 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [223.498 421.033 240.434 431.937] +/Subtype /Link +/A << /S /GoTo /D (page.173) >> +>> endobj +11342 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [246.581 409.078 263.518 419.982] +/Subtype /Link +/A << /S /GoTo /D (page.174) >> +>> endobj +11343 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [155.713 397.84 172.649 408.027] +/Subtype /Link +/A << /S /GoTo /D (page.180) >> +>> endobj +11344 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [155.424 385.885 172.361 396.071] +/Subtype /Link +/A << /S /GoTo /D (page.180) >> +>> endobj +11345 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.274 373.212 196.211 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.180) >> +>> endobj +11346 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [173.137 361.975 190.074 372.161] +/Subtype /Link +/A << /S /GoTo /D (page.180) >> +>> endobj +11347 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.579 349.302 189.516 360.206] +/Subtype /Link +/A << /S /GoTo /D (page.180) >> +>> endobj +11348 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.854 337.347 171.791 348.251] +/Subtype /Link +/A << /S /GoTo /D (page.182) >> +>> endobj +11349 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.603 325.392 179.539 336.296] +/Subtype /Link +/A << /S /GoTo /D (page.183) >> +>> endobj +11350 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.473 313.437 177.41 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.181) >> +>> endobj +11351 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.398 313.437 197.335 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.182) >> +>> endobj +11352 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.854 301.481 171.791 312.385] +/Subtype /Link +/A << /S /GoTo /D (page.182) >> +>> endobj +11353 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.473 289.526 177.41 300.43] +/Subtype /Link +/A << /S /GoTo /D (page.181) >> +>> endobj +11354 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.343 277.571 175.28 288.475] +/Subtype /Link +/A << /S /GoTo /D (page.181) >> +>> endobj +11355 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.268 277.571 195.205 288.475] +/Subtype /Link +/A << /S /GoTo /D (page.182) >> +>> endobj +11356 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.284 265.616 151.22 276.52] +/Subtype /Link +/A << /S /GoTo /D (page.183) >> +>> endobj +11357 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.587 253.661 150.523 264.565] +/Subtype /Link +/A << /S /GoTo /D (page.179) >> +>> endobj +11358 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [280.578 241.706 297.515 252.609] +/Subtype /Link +/A << /S /GoTo /D (page.183) >> +>> endobj +11359 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.603 229.75 179.539 240.654] +/Subtype /Link +/A << /S /GoTo /D (page.186) >> +>> endobj +11360 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.343 217.795 175.28 228.699] +/Subtype /Link +/A << /S /GoTo /D (page.186) >> +>> endobj +11361 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.284 205.84 151.22 216.744] +/Subtype /Link +/A << /S /GoTo /D (page.186) >> +>> endobj +11362 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [223.498 181.93 240.434 192.834] +/Subtype /Link +/A << /S /GoTo /D (page.187) >> +>> endobj +11363 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 160.077 145.791 168.923] +/Subtype /Link +/A << /S /GoTo /D (page.188) >> +>> endobj +11364 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.878 146.064 192.814 156.968] +/Subtype /Link +/A << /S /GoTo /D (page.188) >> +>> endobj +11365 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.312 134.109 271.249 145.013] +/Subtype /Link +/A << /S /GoTo /D (page.189) >> +>> endobj +11366 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.706 122.154 235.643 133.058] +/Subtype /Link +/A << /S /GoTo /D (page.191) >> +>> endobj +11367 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.603 110.199 179.539 121.103] +/Subtype /Link +/A << /S /GoTo /D (page.191) >> +>> endobj +11368 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.343 98.244 175.28 109.147] +/Subtype /Link +/A << /S /GoTo /D (page.191) >> +>> endobj +11369 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.284 86.288 151.22 97.192] +/Subtype /Link +/A << /S /GoTo /D (page.191) >> +>> endobj +11370 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [489.623 719.912 506.559 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.192) >> +>> endobj +11371 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 697.94 362.272 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.192) >> +>> endobj +11372 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [461.379 684.047 478.315 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.192) >> +>> endobj +11373 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [384.628 672.092 401.564 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.199) >> +>> endobj +11374 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [372.194 660.854 389.131 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.199) >> +>> endobj +11375 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.818 648.899 374.755 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.199) >> +>> endobj +11376 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [436.084 636.226 453.02 647.13] +/Subtype /Link +/A << /S /GoTo /D (page.201) >> +>> endobj +11377 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [456.009 636.226 472.946 647.13] +/Subtype /Link +/A << /S /GoTo /D (page.202) >> +>> endobj +11378 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [395.756 624.271 412.692 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.200) >> +>> endobj +11379 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [434.45 612.316 451.387 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.202) >> +>> endobj +11380 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.335 601.078 362.272 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.198) >> +>> endobj +11381 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.084 588.405 396.021 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.200) >> +>> endobj +11382 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [399.01 588.405 415.946 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.203) >> +>> endobj +11383 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.824 576.45 391.761 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.200) >> +>> endobj +11384 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [350.875 564.495 367.811 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.199) >> +>> endobj +11385 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [343.114 552.54 360.05 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.198) >> +>> endobj +11386 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [438.295 540.585 455.232 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.200) >> +>> endobj +11387 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.221 540.585 475.157 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.201) >> +>> endobj +11388 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [350.765 528.63 367.702 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.200) >> +>> endobj +11389 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [350.068 516.674 367.004 527.578] +/Subtype /Link +/A << /S /GoTo /D (page.198) >> +>> endobj +11390 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [495.7 504.719 512.636 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.203) >> +>> endobj +11391 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.79 493.481 387.726 503.668] +/Subtype /Link +/A << /S /GoTo /D (page.207) >> +>> endobj +11392 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [344.778 481.526 361.714 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.207) >> +>> endobj +11393 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.084 468.854 396.021 479.758] +/Subtype /Link +/A << /S /GoTo /D (page.207) >> +>> endobj +11394 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [350.765 456.899 367.702 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.207) >> +>> endobj +11395 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [439.979 432.988 456.916 443.892] +/Subtype /Link +/A << /S /GoTo /D (page.207) >> +>> endobj +11396 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [476.183 421.033 493.12 431.937] +/Subtype /Link +/A << /S /GoTo /D (page.209) >> +>> endobj +11397 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.559 409.078 390.496 419.982] +/Subtype /Link +/A << /S /GoTo /D (page.210) >> +>> endobj +11398 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.484 409.078 410.421 419.982] +/Subtype /Link +/A << /S /GoTo /D (page.211) >> +>> endobj +11399 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [395.148 397.123 412.085 408.027] +/Subtype /Link +/A << /S /GoTo /D (page.211) >> +>> endobj +11400 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [398.615 385.168 415.552 396.071] +/Subtype /Link +/A << /S /GoTo /D (page.211) >> +>> endobj +11401 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [439.262 373.212 456.199 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.210) >> +>> endobj +11402 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.665 361.257 391.602 372.161] +/Subtype /Link +/A << /S /GoTo /D (page.211) >> +>> endobj +11403 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.69 349.302 403.626 360.206] +/Subtype /Link +/A << /S /GoTo /D (page.211) >> +>> endobj +11404 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.223 337.347 392.159 348.251] +/Subtype /Link +/A << /S /GoTo /D (page.211) >> +>> endobj +11405 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.516 325.392 391.452 336.296] +/Subtype /Link +/A << /S /GoTo /D (page.210) >> +>> endobj +11406 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [371.487 314.154 388.424 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.210) >> +>> endobj +11407 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.771 301.481 392.707 312.385] +/Subtype /Link +/A << /S /GoTo /D (page.211) >> +>> endobj +11408 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.223 289.526 392.159 300.43] +/Subtype /Link +/A << /S /GoTo /D (page.211) >> +>> endobj +11409 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [394.6 277.571 411.537 288.475] +/Subtype /Link +/A << /S /GoTo /D (page.211) >> +>> endobj +11410 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [425.036 265.616 441.972 276.52] +/Subtype /Link +/A << /S /GoTo /D (page.210) >> +>> endobj +11411 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [439.81 253.661 456.747 264.565] +/Subtype /Link +/A << /S /GoTo /D (page.212) >> +>> endobj +11412 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [395.676 241.706 412.613 252.609] +/Subtype /Link +/A << /S /GoTo /D (page.231) >> +>> endobj +11413 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [457.663 229.75 474.6 240.654] +/Subtype /Link +/A << /S /GoTo /D (page.232) >> +>> endobj +11414 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [399.552 217.795 416.488 228.699] +/Subtype /Link +/A << /S /GoTo /D (page.232) >> +>> endobj +11415 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [461.539 205.84 478.475 216.744] +/Subtype /Link +/A << /S /GoTo /D (page.233) >> +>> endobj +11416 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [389.051 194.602 405.987 204.789] +/Subtype /Link +/A << /S /GoTo /D (page.234) >> +>> endobj +11417 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [451.038 182.647 467.974 192.834] +/Subtype /Link +/A << /S /GoTo /D (page.234) >> +>> endobj +11418 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [392.926 170.692 409.863 180.878] +/Subtype /Link +/A << /S /GoTo /D (page.235) >> +>> endobj +11419 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [454.913 158.737 471.85 168.923] +/Subtype /Link +/A << /S /GoTo /D (page.235) >> +>> endobj +11420 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [408.408 146.064 425.345 156.968] +/Subtype /Link +/A << /S /GoTo /D (page.232) >> +>> endobj +11421 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [470.395 134.109 487.332 145.013] +/Subtype /Link +/A << /S /GoTo /D (page.232) >> +>> endobj +11422 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [412.284 122.154 429.22 133.058] +/Subtype /Link +/A << /S /GoTo /D (page.237) >> +>> endobj +11423 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [474.271 110.199 491.207 121.103] +/Subtype /Link +/A << /S /GoTo /D (page.237) >> +>> endobj +11424 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [438.127 98.244 455.063 109.147] +/Subtype /Link +/A << /S /GoTo /D (page.233) >> +>> endobj +11426 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +11430 0 obj << +/D [11428 0 R /XYZ 90 757.935 null] +>> endobj +11427 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F11 418 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +11540 0 obj << +/Length 1609 +/Filter /FlateDecode +>> +stream +xÚ½ZYs›Fקà­Ò´^³À.àIòÐ4q¤qÚ¨3q2Ì­¤M¸²‹"«Ÿ¾Ë!Ù"˜]îƒ.¿ÿ}‚i¬ Ó¸œü:Ÿœ¿Æ¶á[ؘ/ ß4\ ² 1_7Ó«÷¿½úgöyþÆpL˜ËëÊ?Û/O^Í'ß&P5 X^\àÚÈãÉÍgÓXÈão ؾgl˳bñlù'Ṅœ ó'Дß-d¸– LŒ*ªd±8 gMwaDA˜&+¾¡IHE@’E³„Åì_úKÉ\Å_Õìýu91`Š3jT˶ëÓ+fä¿-gµÑ9',ÉÅ£änÎ,dJ蘀©­'։tVœÉ7šPNò”«ÅpÛá±ü yš i°`1M“Z,iÒø–.TÂ9X©»VðŒ§_h˜…_Î,4ýdšVB“•Ò֎©˜qª‡ ; |›n’…´ë Ìڝ̶k3­-‚%Oã€Ü¦…w~/ޔ¸–§{K£´à|;SÆ}HršÈW@„`«D)¼«¬óc°e š°d¥ ìtºÂ!C‰á"ç:0v·»/Xé:KÊKa5eìƤ…›ÜeE7"_ Ü-ó2~L&1«4ÉÌzR|6ÿfª¼ÂêôGÙюjKC\YUÆòën.«ï}’àòmz§tOØ {)+¡2Pì¦ >Y~ô"yAw쯉XKYjUû¦”]åB–8饚J¶ýNÎZûµ9 +x!ÃJ„œæCs|…ô%• —‰~8\žfi”®XH¢h„Q*ԝ‰5’:ˏzá Ê\2?Kb¤‡ÝÔé {JcÃ7¹í'"“¬úuwZ®ku»®n4aÔùZQ?¯ßžšájßH³ÊfÅIç¯!|0ÊÙ6€>ÚOŽÏžU§O{8rD¬O雰Î`ß>–hÏÐóç§æ¿ˆÓºtmY¾~eJ…á“`Åظõ$ùD°C‡FNãå6X³Õšò±£³AddtÁâ,bË]°E·Pt´u⧕šfa^”‹qze±AsJ²}A.õЈd‚ŽÓ{m’ƒ[)%ì.‰›LPNh§u,ÍOÂ8že`™Ì°åÎò]pÂî+64›h Ã@]uôLÆE’3 MúŠyº†Ý$uÿP®±ÅéÀcM¹*|Ídån寮ƒëL‹Õn»åÅ:1/î¨ÐÜÁ¬‹à嚆_ U©Ǐ…îM©¥6Bäi«’š FQé6x¿‰oi[åu-`{^84œ ÷gÌg®#«o)÷‡6n=`c¸?ûEuâ‹6Xøž¯[ÏtF©Ïòú™ô=ÉÄjpÝU@û˜ÍðïäLDxðê.ãTèÜøt5Ìþ ¨ï²ÛÅO½«Öîø\¯GÇWQ³ìG’¹Ýnaɑ> µ9jf![©‹Ÿ£ç½•ÔÅÒÏ}­¯¼‘Ú ¿ÿl>ۆ=àCO÷Ѷý#mø®íÕ×! ToçkºÏWuÖ?÷qXý¬ƒ±úñ·˜~š!4Õï?H²!Qõý“‰Ì}µ—QU4A‘'å_ÌÎl™6>RZ [IöÕØ{[< ˆð =ئµ·â:ϳ‹óóív Bd{‘qÀòó,‹ÎÔאB¸¥t©’±8åµø,‘ãòö8’úÿвó‡ +endstream +endobj +11539 0 obj << +/Type /Page +/Contents 11540 0 R +/Resources 11538 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 11202 0 R +/Annots [ 11425 0 R 11431 0 R 11432 0 R 11433 0 R 11434 0 R 11435 0 R 11436 0 R 11437 0 R 11438 0 R 11439 0 R 11440 0 R 11441 0 R 11442 0 R 11443 0 R 11444 0 R 11445 0 R 11446 0 R 11447 0 R 11448 0 R 11449 0 R 11450 0 R 11451 0 R 11452 0 R 11453 0 R 11454 0 R 11455 0 R 11456 0 R 11457 0 R 11458 0 R 11459 0 R 11460 0 R 11461 0 R 11462 0 R 11463 0 R 11464 0 R 11465 0 R 11466 0 R 11467 0 R 11468 0 R 11469 0 R 11470 0 R 11471 0 R 11472 0 R 11473 0 R 11474 0 R 11475 0 R 11476 0 R 11477 0 R 11478 0 R 11479 0 R 11480 0 R 11481 0 R 11482 0 R 11483 0 R 11484 0 R 11485 0 R 11486 0 R 11487 0 R 11488 0 R 11489 0 R 11490 0 R 11491 0 R 11492 0 R 11493 0 R 11494 0 R 11495 0 R 11496 0 R 11497 0 R 11498 0 R 11499 0 R 11500 0 R 11501 0 R 11502 0 R 11503 0 R 11504 0 R 11505 0 R 11506 0 R 11507 0 R 11508 0 R 11509 0 R 11510 0 R 11511 0 R 11512 0 R 11513 0 R 11514 0 R 11515 0 R 11516 0 R 11517 0 R 11518 0 R 11519 0 R 11520 0 R 11521 0 R 11522 0 R 11523 0 R 11524 0 R 11525 0 R 11526 0 R 11527 0 R 11528 0 R 11529 0 R 11530 0 R 11531 0 R 11532 0 R 11533 0 R 11534 0 R 11537 0 R ] +>> endobj +11425 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 710.014 145.791 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.233) >> +>> endobj +11431 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.02 696.002 231.957 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.235) >> +>> endobj +11432 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.007 684.047 293.943 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.235) >> +>> endobj +11433 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [234.378 672.092 251.314 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.237) >> +>> endobj +11434 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 650.239 145.791 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.238) >> +>> endobj +11435 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.684 636.226 273.62 647.13] +/Subtype /Link +/A << /S /GoTo /D (page.246) >> +>> endobj +11436 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.789 624.271 274.726 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.246) >> +>> endobj +11437 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.676 612.316 182.612 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.240) >> +>> endobj +11438 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.398 600.361 195.334 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.241) >> +>> endobj +11439 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.968 588.405 221.905 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.243) >> +>> endobj +11440 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.69 576.45 234.627 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.243) >> +>> endobj +11441 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.514 565.212 212.451 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.228) >> +>> endobj +11442 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.122 553.257 213.058 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.228) >> +>> endobj +11443 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.821 540.585 207.757 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.247) >> +>> endobj +11444 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [231.777 528.63 248.714 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.244) >> +>> endobj +11445 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.308 517.392 171.245 527.578] +/Subtype /Link +/A << /S /GoTo /D (page.228) >> +>> endobj +11446 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.115 505.437 164.052 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.230) >> +>> endobj +11447 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.927 492.764 200.863 503.668] +/Subtype /Link +/A << /S /GoTo /D (page.240) >> +>> endobj +11448 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.136 480.809 233.073 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.248) >> +>> endobj +11449 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.439 468.854 224.375 479.758] +/Subtype /Link +/A << /S /GoTo /D (page.248) >> +>> endobj +11450 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.574 456.899 233.511 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.241) >> +>> endobj +11451 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.499 456.899 253.436 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.242) >> +>> endobj +11452 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [229.296 444.943 246.233 455.847] +/Subtype /Link +/A << /S /GoTo /D (page.242) >> +>> endobj +11453 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [223.478 432.988 240.415 443.892] +/Subtype /Link +/A << /S /GoTo /D (page.244) >> +>> endobj +11454 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.551 421.033 202.488 431.937] +/Subtype /Link +/A << /S /GoTo /D (page.231) >> +>> endobj +11455 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [132.172 409.795 149.108 419.982] +/Subtype /Link +/A << /S /GoTo /D (page.223) >> +>> endobj +11456 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.097 409.795 169.033 419.982] +/Subtype /Link +/A << /S /GoTo /D (page.227) >> +>> endobj +11457 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [155.962 397.84 172.899 408.027] +/Subtype /Link +/A << /S /GoTo /D (page.249) >> +>> endobj +11458 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.283 385.168 207.219 396.071] +/Subtype /Link +/A << /S /GoTo /D (page.239) >> +>> endobj +11459 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.27 373.212 269.206 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.239) >> +>> endobj +11460 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [156.52 361.975 173.456 372.161] +/Subtype /Link +/A << /S /GoTo /D (page.228) >> +>> endobj +11461 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.782 349.302 196.719 360.206] +/Subtype /Link +/A << /S /GoTo /D (page.228) >> +>> endobj +11462 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.554 337.347 225.491 348.251] +/Subtype /Link +/A << /S /GoTo /D (page.228) >> +>> endobj +11463 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [280.334 325.392 297.271 336.296] +/Subtype /Link +/A << /S /GoTo /D (page.245) >> +>> endobj +11464 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [229.436 313.437 246.372 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.245) >> +>> endobj +11465 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [272.035 301.481 288.972 312.385] +/Subtype /Link +/A << /S /GoTo /D (page.245) >> +>> endobj +11466 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.544 289.526 225.481 300.43] +/Subtype /Link +/A << /S /GoTo /D (page.247) >> +>> endobj +11467 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.202 278.288 170.139 288.475] +/Subtype /Link +/A << /S /GoTo /D (page.229) >> +>> endobj +11468 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.549 266.333 168.485 276.52] +/Subtype /Link +/A << /S /GoTo /D (page.229) >> +>> endobj +11469 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.474 266.333 188.41 276.52] +/Subtype /Link +/A << /S /GoTo /D (page.230) >> +>> endobj +11470 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.296 254.378 145.233 264.565] +/Subtype /Link +/A << /S /GoTo /D (page.231) >> +>> endobj +11471 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.603 241.706 179.539 252.609] +/Subtype /Link +/A << /S /GoTo /D (page.249) >> +>> endobj +11472 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.343 229.75 175.28 240.654] +/Subtype /Link +/A << /S /GoTo /D (page.249) >> +>> endobj +11473 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.189 217.795 227.125 228.699] +/Subtype /Link +/A << /S /GoTo /D (page.236) >> +>> endobj +11474 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [214.064 205.84 231 216.744] +/Subtype /Link +/A << /S /GoTo /D (page.236) >> +>> endobj +11475 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.563 194.602 220.5 204.789] +/Subtype /Link +/A << /S /GoTo /D (page.236) >> +>> endobj +11476 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.438 182.647 224.375 192.834] +/Subtype /Link +/A << /S /GoTo /D (page.237) >> +>> endobj +11477 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.404 169.975 268.34 180.878] +/Subtype /Link +/A << /S /GoTo /D (page.247) >> +>> endobj +11478 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [220.968 158.019 237.904 168.923] +/Subtype /Link +/A << /S /GoTo /D (page.247) >> +>> endobj +11479 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [237.745 146.064 254.681 156.968] +/Subtype /Link +/A << /S /GoTo /D (page.240) >> +>> endobj +11480 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.772 134.109 196.709 145.013] +/Subtype /Link +/A << /S /GoTo /D (page.230) >> +>> endobj +11481 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.284 122.154 151.22 133.058] +/Subtype /Link +/A << /S /GoTo /D (page.249) >> +>> endobj +11482 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.389 110.199 208.325 121.103] +/Subtype /Link +/A << /S /GoTo /D (page.244) >> +>> endobj +11483 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.396 98.961 177.332 109.147] +/Subtype /Link +/A << /S /GoTo /D (page.238) >> +>> endobj +11484 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.371 86.288 213.307 97.192] +/Subtype /Link +/A << /S /GoTo /D (page.239) >> +>> endobj +11485 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [474.839 719.912 491.775 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.239) >> +>> endobj +11486 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [449.773 707.957 466.71 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.240) >> +>> endobj +11487 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [397.36 696.002 414.296 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.244) >> +>> endobj +11488 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [486.295 684.047 503.232 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.249) >> +>> endobj +11489 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [364.693 672.092 381.629 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.250) >> +>> endobj +11490 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.882 648.181 450.819 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.250) >> +>> endobj +11491 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [484.622 636.226 501.558 647.13] +/Subtype /Link +/A << /S /GoTo /D (page.251) >> +>> endobj +11492 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [372.194 624.988 389.131 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.257) >> +>> endobj +11493 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [397.549 612.316 414.486 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.258) >> +>> endobj +11494 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.818 601.078 374.755 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.257) >> +>> endobj +11495 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [366.366 588.405 383.303 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.256) >> +>> endobj +11496 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [371.906 576.45 388.842 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.257) >> +>> endobj +11497 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [395.756 564.495 412.692 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.257) >> +>> endobj +11498 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.084 552.54 396.021 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.258) >> +>> endobj +11499 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.824 540.585 391.761 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.258) >> +>> endobj +11500 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.222 528.63 387.158 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.256) >> +>> endobj +11501 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [350.765 516.674 367.702 527.578] +/Subtype /Link +/A << /S /GoTo /D (page.258) >> +>> endobj +11502 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [350.068 504.719 367.004 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.256) >> +>> endobj +11503 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.656 480.809 396.593 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.258) >> +>> endobj +11504 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.79 469.571 387.726 479.758] +/Subtype /Link +/A << /S /GoTo /D (page.263) >> +>> endobj +11505 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.528 457.616 369.465 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.263) >> +>> endobj +11506 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [344.778 445.661 361.714 455.847] +/Subtype /Link +/A << /S /GoTo /D (page.263) >> +>> endobj +11507 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.084 432.988 396.021 443.892] +/Subtype /Link +/A << /S /GoTo /D (page.263) >> +>> endobj +11508 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.824 421.033 391.761 431.937] +/Subtype /Link +/A << /S /GoTo /D (page.263) >> +>> endobj +11509 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [350.765 409.078 367.702 419.982] +/Subtype /Link +/A << /S /GoTo /D (page.263) >> +>> endobj +11510 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [439.979 385.168 456.916 396.071] +/Subtype /Link +/A << /S /GoTo /D (page.264) >> +>> endobj +11511 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [485.189 373.212 502.126 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.265) >> +>> endobj +11512 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [364.693 361.257 381.629 372.161] +/Subtype /Link +/A << /S /GoTo /D (page.266) >> +>> endobj +11513 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.882 337.347 450.819 348.251] +/Subtype /Link +/A << /S /GoTo /D (page.266) >> +>> endobj +11514 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [452.283 325.392 469.22 336.296] +/Subtype /Link +/A << /S /GoTo /D (page.267) >> +>> endobj +11515 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [372.762 313.437 389.699 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.270) >> +>> endobj +11516 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [436.652 301.481 453.588 312.385] +/Subtype /Link +/A << /S /GoTo /D (page.269) >> +>> endobj +11517 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.781 289.526 392.717 300.43] +/Subtype /Link +/A << /S /GoTo /D (page.269) >> +>> endobj +11518 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [398.864 278.288 415.8 288.475] +/Subtype /Link +/A << /S /GoTo /D (page.269) >> +>> endobj +11519 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [394.182 266.333 411.118 276.52] +/Subtype /Link +/A << /S /GoTo /D (page.269) >> +>> endobj +11520 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [454.226 253.661 471.162 264.565] +/Subtype /Link +/A << /S /GoTo /D (page.269) >> +>> endobj +11521 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [350.765 241.706 367.702 252.609] +/Subtype /Link +/A << /S /GoTo /D (page.270) >> +>> endobj +11522 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [476.323 229.75 488.278 240.654] +/Subtype /Link +/A << /S /GoTo /D (page.76) >> +>> endobj +11523 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [377.983 217.795 389.938 228.699] +/Subtype /Link +/A << /S /GoTo /D (page.77) >> +>> endobj +11524 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [468.482 205.84 485.419 216.744] +/Subtype /Link +/A << /S /GoTo /D (page.270) >> +>> endobj +11525 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [469.294 182.647 486.23 192.834] +/Subtype /Link +/A << /S /GoTo /D (page.270) >> +>> endobj +11526 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [385.076 158.737 402.013 168.923] +/Subtype /Link +/A << /S /GoTo /D (page.271) >> +>> endobj +11527 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [496.806 146.064 513.742 156.968] +/Subtype /Link +/A << /S /GoTo /D (page.271) >> +>> endobj +11528 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [405.649 134.109 422.585 145.013] +/Subtype /Link +/A << /S /GoTo /D (page.275) >> +>> endobj +11529 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [425.574 134.109 442.51 145.013] +/Subtype /Link +/A << /S /GoTo /D (page.276) >> +>> endobj +11530 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.084 122.154 396.021 133.058] +/Subtype /Link +/A << /S /GoTo /D (page.278) >> +>> endobj +11531 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.568 110.199 385.505 121.103] +/Subtype /Link +/A << /S /GoTo /D (page.277) >> +>> endobj +11532 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.187 98.244 391.123 109.147] +/Subtype /Link +/A << /S /GoTo /D (page.278) >> +>> endobj +11533 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.206 86.288 386.142 97.192] +/Subtype /Link +/A << /S /GoTo /D (page.276) >> +>> endobj +11534 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [389.131 86.288 406.067 97.192] +/Subtype /Link +/A << /S /GoTo /D (page.278) >> +>> endobj +11537 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +11541 0 obj << +/D [11539 0 R /XYZ 90 757.935 null] +>> endobj +11538 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F11 418 0 R /F23 340 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +11662 0 obj << +/Length 1542 +/Filter /FlateDecode +>> +stream +xÚµZ]“›6}÷¯à­ö´f%øÈd_²MÒ¤Ív›l;& ²­”¯\góë+ ÞY³»HöÅ ç^IWçÞ{ °6°^Ï^\ÏÎ^yŽÚ¡‡<ëzm…Àò=hc­ëØú8sùóË¿Ÿ¯ßZ.l€=ùÜá×õåÙËëÙ×”WOcßölEéìãg`Åòú[ ØNXûÃ]©å"GëÃ쏸ë w<@~GØò‘c7Vó‚ ZåâÇóŸÖ³bÓÚÿzf}\" æÈ÷Û|ù¬ò‰àô `-!´CÜ1½@`¾4µÞ‡u>Ò±r¿€`N %Lx +³„ÍŸ€]- žS‘Rr•'7[ J~ã+AÅͳgïÞ\‘+‘¯–š;±å5¶h“(ÏÊJPžU*Ä÷ÎÂ)X9ZYЈ‘˜§,+¹D&4‹ KW,ž¼Ê‰t“Õ³½a➭‘¢„Q1ã"Ï*‘'¤š²J:z)J`ça`¯ø¯„pN“Ý`øÖo¶@xþ_ý!ÁhÅH¾ú¢Š7—¥IFÖ»L^È3¥%¯×ҚђËÍ@Š\'~ûÁxIJZñòˆJБp[µ;Ÿj¦ \=v“7½‚ð©;Ž C|Ì!ϟ7·œò>¶]™,Ú[”®tˆvé¶:§—OiBŽQÁLQï Pâñï<ÛL²ô%«Æiÿ6.ó¤ë¤f–¹· ÆYæòòâö²Æð}u¢1D »ûáBÞ£ÍQˆzg®–Év—$„–%ßd„¯Éø¿ÑH:]ìә“÷,ÞiÅR×ÚCÆ +‘×hDԠʨ +±þÿUt“grû~ØÒÂØ`Oá±;–)‡à€P§ðhÁÊiÐôj"ÖD:h‚EõZÝÈcêQw¡ÇzíMPÉ9ÐV&ÊMRó¹^1ãë:ÔAƈÌ`e¬B¤X¦‡Ù_o½øåÝ?“=YVgĆ䔠ýÙf•ï²XÆÁ€p{ÃáA`í™Àj§K²yJè*¯£Y+õ:ÀÓÆ]±$¯=ߏļ¸ð½6 É}&S­óƒîâaÊQµÜo2*D36ƒ0êߟQ¾e‚e•ìµâf°*@„zÃGòR${Š¬î+4= ¶DWŽ\P TiÁôÇpÌc]O[¤=Æ~Öa»(‘ì@3ɒeEõqì]ŒfE‹šo;$¬t¸?­ó$6mÉU˜–É®(á߇±Ú)w‚žíÈòdƒå!WaR›ïúû¼--·2SÇJú[߬b¢d‘ AU3-CíKݛhsè¦h-‘üq˜:^ÝÇpÿÞHd#YÉõi³è`Fö´¬Œcý~®Mi1õžIé·ºÏ6Οê|üÞOy¦gØ76ܟ̚ ³VÕO®ÜøšÊÍ=Rh”ô°Cçç#9FÔô’ðŒQa¼ƒé"#¨ð¥åá=¯¶(½Aûl9÷1w5›Ó°ãÝmY­Æ5%~ ì)¬§w +²å›­¹¼¯*;F¦Boã¨äi‘ðõ ٕu!^–mʘ¦”ëÌ£*¹!•¬šÊ¤*WrþˆŒ¢dÛ à.» ê‘åÌ®4HmàÈúÈ{ ÐD”¼·À¨çˆz폧‰ „ƒ>)˓åáf'´ ;`è¨\bµÑLýs&Uÿ\ «ô Ö §Tÿ\ðdêßhm¯áÓýë¸Þ“ªnjÞ%ºÎôêŸs¸Pçbs`m§ŸH¨sž@¨{ s°âäú)NÎ4Š“L¯8¹ +Åi°2äÓ+CnØ»Âã”!×ôß{Çu‡ UڛÏ5öO£3¹áÔ:S'ΎÇîKo^`‡0Ð}çíø®›g‡¾´oÝáÐƸî®·lq°[Cµ§ÇBª9m«©æäϒ‰ÏËæüÍv4i¾4'ê€m.ɟ ½Xʦjþ±v°ÍÈþµŽß~­ßÄwü…o;[ýmUÏÎÎöû½•ö.ㅰyuVÉÙÉôuF ¡kû· ë\4Ž¥¹h‡Ï3y1=tsö œÿÿ=ùòÝ +endstream +endobj +11661 0 obj << +/Type /Page +/Contents 11662 0 R +/Resources 11660 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 11202 0 R +/Annots [ 11535 0 R 11536 0 R 11542 0 R 11543 0 R 11544 0 R 11545 0 R 11546 0 R 11547 0 R 11548 0 R 11549 0 R 11550 0 R 11551 0 R 11552 0 R 11553 0 R 11554 0 R 11555 0 R 11556 0 R 11557 0 R 11558 0 R 11559 0 R 11560 0 R 11561 0 R 11562 0 R 11563 0 R 11564 0 R 11565 0 R 11566 0 R 11567 0 R 11568 0 R 11569 0 R 11570 0 R 11571 0 R 11572 0 R 11573 0 R 11574 0 R 11575 0 R 11576 0 R 11577 0 R 11578 0 R 11579 0 R 11580 0 R 11581 0 R 11582 0 R 11583 0 R 11584 0 R 11585 0 R 11586 0 R 11587 0 R 11588 0 R 11589 0 R 11590 0 R 11591 0 R 11592 0 R 11593 0 R 11594 0 R 11595 0 R 11596 0 R 11597 0 R 11598 0 R 11599 0 R 11600 0 R 11601 0 R 11602 0 R 11603 0 R 11604 0 R 11605 0 R 11606 0 R 11607 0 R 11608 0 R 11609 0 R 11610 0 R 11611 0 R 11612 0 R 11613 0 R 11614 0 R 11615 0 R 11616 0 R 11617 0 R 11618 0 R 11619 0 R 11620 0 R 11621 0 R 11622 0 R 11623 0 R 11624 0 R 11625 0 R 11626 0 R 11627 0 R 11628 0 R 11629 0 R 11630 0 R 11631 0 R 11632 0 R 11633 0 R 11634 0 R 11635 0 R 11636 0 R 11637 0 R 11638 0 R 11639 0 R 11640 0 R 11641 0 R 11642 0 R 11643 0 R 11644 0 R 11645 0 R 11646 0 R 11647 0 R 11648 0 R 11649 0 R 11650 0 R 11651 0 R 11652 0 R 11653 0 R 11654 0 R 11655 0 R 11656 0 R 11657 0 R 11659 0 R ] +>> endobj +11535 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.343 719.912 175.28 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.277) >> +>> endobj +11536 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.268 719.912 195.205 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.278) >> +>> endobj +11542 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [150.224 707.957 167.16 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.277) >> +>> endobj +11543 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [155.843 696.002 172.779 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.278) >> +>> endobj +11544 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.284 684.047 151.22 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.279) >> +>> endobj +11545 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [261.525 672.092 278.462 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.279) >> +>> endobj +11546 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.57 660.854 189.506 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.285) >> +>> endobj +11547 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.445 648.899 193.382 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.285) >> +>> endobj +11548 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.684 636.226 273.62 647.13] +/Subtype /Link +/A << /S /GoTo /D (page.285) >> +>> endobj +11549 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.005 624.271 267.941 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.285) >> +>> endobj +11550 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.267 613.033 150.204 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.285) >> +>> endobj +11551 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.348 601.078 235.284 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.283) >> +>> endobj +11552 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.242 589.123 234.178 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.283) >> +>> endobj +11553 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [225.899 576.45 242.836 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.286) >> +>> endobj +11554 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.358 564.495 187.294 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.286) >> +>> endobj +11555 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.386 553.257 182.323 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.286) >> +>> endobj +11556 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.368 541.302 187.304 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.283) >> +>> endobj +11557 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.293 541.302 207.23 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.284) >> +>> endobj +11558 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.603 528.63 179.539 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.287) >> +>> endobj +11559 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.667 516.674 187.603 527.578] +/Subtype /Link +/A << /S /GoTo /D (page.287) >> +>> endobj +11560 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [182.552 504.719 199.489 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.286) >> +>> endobj +11561 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.27 492.764 221.207 503.668] +/Subtype /Link +/A << /S /GoTo /D (page.285) >> +>> endobj +11562 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.792 481.526 151.728 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.286) >> +>> endobj +11563 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.284 468.854 151.22 479.758] +/Subtype /Link +/A << /S /GoTo /D (page.287) >> +>> endobj +11564 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.017 456.899 293.954 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.287) >> +>> endobj +11565 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.86 444.943 202.797 455.847] +/Subtype /Link +/A << /S /GoTo /D (page.289) >> +>> endobj +11566 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [205.785 444.943 222.722 455.847] +/Subtype /Link +/A << /S /GoTo /D (page.292) >> +>> endobj +11567 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.916 432.988 235.852 443.892] +/Subtype /Link +/A << /S /GoTo /D (page.292) >> +>> endobj +11568 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [263.179 421.033 280.116 431.937] +/Subtype /Link +/A << /S /GoTo /D (page.292) >> +>> endobj +11569 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.878 409.078 192.814 419.982] +/Subtype /Link +/A << /S /GoTo /D (page.293) >> +>> endobj +11570 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [275.343 397.123 292.28 408.027] +/Subtype /Link +/A << /S /GoTo /D (page.293) >> +>> endobj +11571 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.195 385.168 196.132 396.071] +/Subtype /Link +/A << /S /GoTo /D (page.309) >> +>> endobj +11572 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.071 373.212 200.007 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.309) >> +>> endobj +11573 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.57 361.975 189.506 372.161] +/Subtype /Link +/A << /S /GoTo /D (page.308) >> +>> endobj +11574 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.445 350.019 193.382 360.206] +/Subtype /Link +/A << /S /GoTo /D (page.308) >> +>> endobj +11575 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [221.646 337.347 238.582 348.251] +/Subtype /Link +/A << /S /GoTo /D (page.309) >> +>> endobj +11576 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.02 325.392 231.957 336.296] +/Subtype /Link +/A << /S /GoTo /D (page.308) >> +>> endobj +11577 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.684 313.437 273.62 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.317) >> +>> endobj +11578 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.789 301.481 274.726 312.385] +/Subtype /Link +/A << /S /GoTo /D (page.318) >> +>> endobj +11579 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.676 289.526 182.612 300.43] +/Subtype /Link +/A << /S /GoTo /D (page.312) >> +>> endobj +11580 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.398 277.571 195.334 288.475] +/Subtype /Link +/A << /S /GoTo /D (page.313) >> +>> endobj +11581 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [224.604 265.616 241.541 276.52] +/Subtype /Link +/A << /S /GoTo /D (page.316) >> +>> endobj +11582 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.968 253.661 221.905 264.565] +/Subtype /Link +/A << /S /GoTo /D (page.314) >> +>> endobj +11583 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.69 241.706 234.627 252.609] +/Subtype /Link +/A << /S /GoTo /D (page.315) >> +>> endobj +11584 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.514 230.468 212.451 240.654] +/Subtype /Link +/A << /S /GoTo /D (page.306) >> +>> endobj +11585 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.122 218.512 213.058 228.699] +/Subtype /Link +/A << /S /GoTo /D (page.306) >> +>> endobj +11586 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [224.455 205.84 241.391 216.744] +/Subtype /Link +/A << /S /GoTo /D (page.315) >> +>> endobj +11587 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [244.38 205.84 261.316 216.744] +/Subtype /Link +/A << /S /GoTo /D (page.316) >> +>> endobj +11588 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [212.729 193.885 229.665 204.789] +/Subtype /Link +/A << /S /GoTo /D (page.317) >> +>> endobj +11589 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.18 182.647 192.117 192.834] +/Subtype /Link +/A << /S /GoTo /D (page.322) >> +>> endobj +11590 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.821 169.975 207.757 180.878] +/Subtype /Link +/A << /S /GoTo /D (page.318) >> +>> endobj +11591 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.308 158.737 171.245 168.923] +/Subtype /Link +/A << /S /GoTo /D (page.306) >> +>> endobj +11592 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.115 146.781 164.052 156.968] +/Subtype /Link +/A << /S /GoTo /D (page.305) >> +>> endobj +11593 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.927 134.109 200.863 145.013] +/Subtype /Link +/A << /S /GoTo /D (page.312) >> +>> endobj +11594 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [219.603 122.154 236.539 133.058] +/Subtype /Link +/A << /S /GoTo /D (page.321) >> +>> endobj +11595 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.136 110.199 233.073 121.103] +/Subtype /Link +/A << /S /GoTo /D (page.319) >> +>> endobj +11596 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.439 98.244 224.375 109.147] +/Subtype /Link +/A << /S /GoTo /D (page.319) >> +>> endobj +11597 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.574 86.288 233.511 97.192] +/Subtype /Link +/A << /S /GoTo /D (page.313) >> +>> endobj +11598 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [445.778 719.912 462.714 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.314) >> +>> endobj +11599 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [372.444 708.674 389.38 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.320) >> +>> endobj +11600 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [406.764 696.002 423.701 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.311) >> +>> endobj +11601 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [396.264 684.047 413.2 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.305) >> +>> endobj +11602 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [434.45 672.092 451.387 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.322) >> +>> endobj +11603 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [489.643 660.136 506.579 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.316) >> +>> endobj +11604 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [474.151 648.181 491.087 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.317) >> +>> endobj +11605 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [425.026 636.226 441.962 647.13] +/Subtype /Link +/A << /S /GoTo /D (page.319) >> +>> endobj +11606 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.684 624.988 386.62 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.306) >> +>> endobj +11607 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [389.609 624.988 406.545 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.307) >> +>> endobj +11608 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.03 613.033 384.966 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.307) >> +>> endobj +11609 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [387.955 613.033 404.892 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.308) >> +>> endobj +11610 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [400.667 600.361 417.604 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.302) >> +>> endobj +11611 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [420.593 600.361 437.529 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.304) >> +>> endobj +11612 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.084 588.405 396.021 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.320) >> +>> endobj +11613 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.824 576.45 391.761 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.320) >> +>> endobj +11614 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [438.295 564.495 455.232 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.320) >> +>> endobj +11615 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.221 564.495 475.157 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.321) >> +>> endobj +11616 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [426.67 552.54 443.606 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.310) >> +>> endobj +11617 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [430.545 540.585 447.482 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.310) >> +>> endobj +11618 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [420.044 529.347 436.981 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.310) >> +>> endobj +11619 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [423.92 517.392 440.856 527.578] +/Subtype /Link +/A << /S /GoTo /D (page.310) >> +>> endobj +11620 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.522 505.437 400.458 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.305) >> +>> endobj +11621 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [403.447 505.437 420.383 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.306) >> +>> endobj +11622 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [467.885 492.764 484.821 503.668] +/Subtype /Link +/A << /S /GoTo /D (page.318) >> +>> endobj +11623 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [437.449 480.809 454.386 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.318) >> +>> endobj +11624 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [454.226 468.854 471.162 479.758] +/Subtype /Link +/A << /S /GoTo /D (page.312) >> +>> endobj +11625 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [396.254 456.899 413.19 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.305) >> +>> endobj +11626 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [350.765 444.943 367.702 455.847] +/Subtype /Link +/A << /S /GoTo /D (page.322) >> +>> endobj +11627 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [407.87 432.988 424.806 443.892] +/Subtype /Link +/A << /S /GoTo /D (page.315) >> +>> endobj +11628 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [376.877 421.75 393.813 431.937] +/Subtype /Link +/A << /S /GoTo /D (page.311) >> +>> endobj +11629 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [412.852 409.078 429.788 419.982] +/Subtype /Link +/A << /S /GoTo /D (page.311) >> +>> endobj +11630 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [449.773 397.123 466.71 408.027] +/Subtype /Link +/A << /S /GoTo /D (page.312) >> +>> endobj +11631 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [381.31 373.93 398.247 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.323) >> +>> endobj +11632 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [395.676 361.257 412.613 372.161] +/Subtype /Link +/A << /S /GoTo /D (page.339) >> +>> endobj +11633 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [399.552 349.302 416.488 360.206] +/Subtype /Link +/A << /S /GoTo /D (page.340) >> +>> endobj +11634 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [389.051 338.064 405.987 348.251] +/Subtype /Link +/A << /S /GoTo /D (page.339) >> +>> endobj +11635 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [392.926 326.109 409.863 336.296] +/Subtype /Link +/A << /S /GoTo /D (page.340) >> +>> endobj +11636 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [438.127 313.437 455.063 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.340) >> +>> endobj +11637 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [431.501 301.481 448.438 312.385] +/Subtype /Link +/A << /S /GoTo /D (page.341) >> +>> endobj +11638 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [473.165 289.526 490.101 300.43] +/Subtype /Link +/A << /S /GoTo /D (page.346) >> +>> endobj +11639 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [474.271 277.571 491.207 288.475] +/Subtype /Link +/A << /S /GoTo /D (page.347) >> +>> endobj +11640 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [382.157 265.616 399.093 276.52] +/Subtype /Link +/A << /S /GoTo /D (page.343) >> +>> endobj +11641 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [394.879 253.661 411.816 264.565] +/Subtype /Link +/A << /S /GoTo /D (page.343) >> +>> endobj +11642 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [421.45 241.706 438.386 252.609] +/Subtype /Link +/A << /S /GoTo /D (page.345) >> +>> endobj +11643 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [434.172 229.75 451.108 240.654] +/Subtype /Link +/A << /S /GoTo /D (page.345) >> +>> endobj +11644 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.995 218.512 428.932 228.699] +/Subtype /Link +/A << /S /GoTo /D (page.336) >> +>> endobj +11645 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [412.603 206.557 429.539 216.744] +/Subtype /Link +/A << /S /GoTo /D (page.336) >> +>> endobj +11646 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [407.302 193.885 424.239 204.789] +/Subtype /Link +/A << /S /GoTo /D (page.347) >> +>> endobj +11647 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.79 182.647 387.726 192.834] +/Subtype /Link +/A << /S /GoTo /D (page.336) >> +>> endobj +11648 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [363.597 170.692 380.533 180.878] +/Subtype /Link +/A << /S /GoTo /D (page.338) >> +>> endobj +11649 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [400.408 158.019 417.345 168.923] +/Subtype /Link +/A << /S /GoTo /D (page.342) >> +>> endobj +11650 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [432.617 146.064 449.554 156.968] +/Subtype /Link +/A << /S /GoTo /D (page.348) >> +>> endobj +11651 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [423.92 134.109 440.856 145.013] +/Subtype /Link +/A << /S /GoTo /D (page.349) >> +>> endobj +11652 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.056 122.154 449.992 133.058] +/Subtype /Link +/A << /S /GoTo /D (page.343) >> +>> endobj +11653 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [452.981 122.154 469.917 133.058] +/Subtype /Link +/A << /S /GoTo /D (page.344) >> +>> endobj +11654 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [445.778 110.199 462.714 121.103] +/Subtype /Link +/A << /S /GoTo /D (page.344) >> +>> endobj +11655 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [465.703 110.199 482.639 121.103] +/Subtype /Link +/A << /S /GoTo /D (page.345) >> +>> endobj +11656 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [372.444 98.961 389.38 109.147] +/Subtype /Link +/A << /S /GoTo /D (page.349) >> +>> endobj +11657 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [406.764 86.288 423.701 97.192] +/Subtype /Link +/A << /S /GoTo /D (page.342) >> +>> endobj +11659 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +11663 0 obj << +/D [11661 0 R /XYZ 90 757.935 null] +>> endobj +11660 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F11 418 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +11782 0 obj << +/Length 1458 +/Filter /FlateDecode +>> +stream +xÚÍZ[oÛ6~÷¯ÐSg3MJ"%íK·6[wA–fÀ°¤‰¶ÙêVJž›ýúQ±c눲ìÅÖõãá9‡? ++—“·7“Å{fò˜ÉŒ›¥áaÃaQ“7‘q;ýù÷ßý5ûtóÁ°±‹0eê½ú†m“êòäÝÍä넨«Ø õÛÔAŽE0™Ü~ÂF¤®00²<×ØÖO%†mZê?6>Nþ˜à§–PüÄ‚Õ±I Ç´f´iU~$ŠÏ™HK)³äûچ¦q¹j­¸¾œ·s“â©e±ö¦õ3'y´…K‚Ü/ò ä +5ái!²´€ m€ü&ñ/×µìv +¾át7,Ò~ ;Ú w÷8˹ ÊLV-Þò$†–…ˆGw)óúuóÈ~˜)²Un´€Î÷öM™Û.bžÕÄö zóFî gW3B§,EÇþ56!ü+™©ƒô9ôói²“/©h§1’ßal¦Üߊrí‡Yº’ž†p¼½A°ð8Àz¸E)5lÇ6·……Í%ÇqÙ7ɪhÿSýp-Vk.õ¹ÁŒßkddtå –*Q•WJå“âÌq]lgOƒ‚¡Ý‰Pªþù<ò‚ûAQˆU +ö³›´7écØuƒÞƒ`ÌÎ4ÙäŠ[üûl“F};cvwæ /–>¯ä[“ €¾OEºèø9i¦àc¤˜þU?¬y$ÿWq/ùpqqUÍÌ/Õ½™I§[.Չnk5ˆ" ÎcÝ´æÊ÷}gÏSÈìr1ª…ž¡N螤Ìl 0=3uaÒ>ÑÙ¡éJAC«ÊT‘ÓÙÞ\VC§æD¬`Û¼þ€¹ä£`æ¹ÌT¥” +²*‘J5ƒA˜N·ß^^y^Ë}*DyjOòrº™ûíOcË×$D§›^kÚV¡~Ä¢Ü7r}°‹zõä÷Oê0#poÜ{7übvÛ®yøeWϨ2©ÔÍ0xÂwº ]µªO«<ï™3Vw—vüSœéï¾Uë¶'uŽ-¹læÂ^}dݕc3„óŠ^j\ÐyÝÔ¸ÌâH»l>…ÙFxÅSµ\ŒÕ0d Òd„ëëIsz?KxµR¨×´á“ñ/áT25 ù×MŸ›ë ¨VyÑà:¢ ²šî«R4ԘO€?‚¨WOðšB×Yþ&aÈvMƒYb¦Ý4‹”r´ù{ˆš°e_5 ˜Gz¥»†È!·B­ce-Y= [+9šªÃ/¢*+—Áªs^DUèa°ªÄ Í®-a+\]*„§`!1Ž¦ŒÐ35-½I‹åƒ¿)ªª½ªyÚõÁ8,®­™š¯˜žf0©¾fp†fÆ´÷×k.¹Im.u‹µõ=&Z1-ÑJ%Àj”^·Ãõd“–‡\Jö¡Ÿ­ öU36Ú&‰Ów“Äqm’˜'vmL<ƒˆN¯ xÃ¥'ЫWº@£~ÉGÝý¿EÝ=êÞXQ÷Ɗº7FÔ«Kp±ëS¥Y—Ü !zîK©ÒZÈÐgcòRª´ÍUi½”*í9::ò8ѤJ{Ý +jx íô1¬Q¼y NN¬¦—› ºäaE.aÌõFœö§ ûuáؖٳVç§6ÖÛ1±OAå{휟M DÖK-˜QN5>Oîy“à¹Ì>sp· +„וLm̎JU‡’1yÄíûÙîû1†<ÇrÛ/Ù¨‡(mµ®›5ŸÕí?–íé®FhNÛB¡9ù³àò»¥Ó¢9ÿ-H7AÜßaŠwº©ris#‚‘©n4›[j%ø‘ó¶³MϾ»£_ª/ïè{‰ë ›»ro]–ùÅb±ÝnQX M*r‰D¹Èóx±ç¾ƒ^b#çd©*½Ú°$“m÷Eª.&uÁ‹ö€”ÿÿœhÛ8 +endstream +endobj +11781 0 obj << +/Type /Page +/Contents 11782 0 R +/Resources 11780 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 11202 0 R +/Annots [ 11658 0 R 11664 0 R 11665 0 R 11666 0 R 11667 0 R 11668 0 R 11669 0 R 11670 0 R 11671 0 R 11672 0 R 11673 0 R 11674 0 R 11675 0 R 11676 0 R 11677 0 R 11678 0 R 11679 0 R 11680 0 R 11681 0 R 11682 0 R 11683 0 R 11684 0 R 11685 0 R 11686 0 R 11687 0 R 11688 0 R 11689 0 R 11690 0 R 11691 0 R 11692 0 R 11693 0 R 11694 0 R 11695 0 R 11696 0 R 11697 0 R 11698 0 R 11699 0 R 11700 0 R 11701 0 R 11702 0 R 11703 0 R 11704 0 R 11705 0 R 11706 0 R 11707 0 R 11708 0 R 11709 0 R 11710 0 R 11711 0 R 11712 0 R 11713 0 R 11714 0 R 11715 0 R 11716 0 R 11717 0 R 11718 0 R 11719 0 R 11720 0 R 11721 0 R 11722 0 R 11723 0 R 11724 0 R 11725 0 R 11726 0 R 11727 0 R 11728 0 R 11729 0 R 11730 0 R 11731 0 R 11732 0 R 11733 0 R 11734 0 R 11735 0 R 11736 0 R 11737 0 R 11738 0 R 11739 0 R 11740 0 R 11741 0 R 11742 0 R 11743 0 R 11744 0 R 11745 0 R 11746 0 R 11747 0 R 11748 0 R 11749 0 R 11750 0 R 11751 0 R 11752 0 R 11753 0 R 11754 0 R 11755 0 R 11756 0 R 11757 0 R 11758 0 R 11759 0 R 11760 0 R 11761 0 R 11762 0 R 11763 0 R 11764 0 R 11765 0 R 11766 0 R 11767 0 R 11768 0 R 11769 0 R 11770 0 R 11771 0 R 11772 0 R 11773 0 R 11774 0 R 11775 0 R 11776 0 R 11777 0 R 11779 0 R ] +>> endobj +11658 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.782 719.912 196.719 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.336) >> +>> endobj +11664 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.544 707.957 225.481 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.348) >> +>> endobj +11665 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.202 696.719 170.139 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.336) >> +>> endobj +11666 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [173.128 696.719 190.064 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.337) >> +>> endobj +11667 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.549 684.764 168.485 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.337) >> +>> endobj +11668 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.474 684.764 188.41 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.338) >> +>> endobj +11669 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.603 672.092 179.539 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.349) >> +>> endobj +11670 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.343 660.136 175.28 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.349) >> +>> endobj +11671 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [223.339 648.181 240.275 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.331) >> +>> endobj +11672 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.264 648.181 260.201 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.335) >> +>> endobj +11673 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.189 636.226 227.125 647.13] +/Subtype /Link +/A << /S /GoTo /D (page.339) >> +>> endobj +11674 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [214.064 624.271 231 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.340) >> +>> endobj +11675 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.563 613.033 220.5 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.339) >> +>> endobj +11676 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.438 601.078 224.375 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.341) >> +>> endobj +11677 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.404 588.405 268.34 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.347) >> +>> endobj +11678 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [220.968 576.45 237.904 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.347) >> +>> endobj +11679 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.772 564.495 196.709 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.338) >> +>> endobj +11680 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.284 552.54 151.22 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.350) >> +>> endobj +11681 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.389 540.585 208.325 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.346) >> +>> endobj +11682 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.396 529.347 177.332 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.341) >> +>> endobj +11683 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.321 529.347 197.257 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.342) >> +>> endobj +11684 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.371 516.674 213.307 527.578] +/Subtype /Link +/A << /S /GoTo /D (page.342) >> +>> endobj +11685 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.292 504.719 250.228 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.342) >> +>> endobj +11686 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.878 492.764 197.815 503.668] +/Subtype /Link +/A << /S /GoTo /D (page.346) >> +>> endobj +11687 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [278.431 480.809 295.368 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.350) >> +>> endobj +11688 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.195 468.854 196.132 479.758] +/Subtype /Link +/A << /S /GoTo /D (page.366) >> +>> endobj +11689 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.182 456.899 258.118 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.366) >> +>> endobj +11690 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.071 444.943 200.007 455.847] +/Subtype /Link +/A << /S /GoTo /D (page.366) >> +>> endobj +11691 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [245.057 432.988 261.994 443.892] +/Subtype /Link +/A << /S /GoTo /D (page.367) >> +>> endobj +11692 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.57 421.75 189.506 431.937] +/Subtype /Link +/A << /S /GoTo /D (page.364) >> +>> endobj +11693 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [234.557 409.795 251.493 419.982] +/Subtype /Link +/A << /S /GoTo /D (page.364) >> +>> endobj +11694 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.445 397.84 193.382 408.027] +/Subtype /Link +/A << /S /GoTo /D (page.365) >> +>> endobj +11695 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [238.432 385.885 255.368 396.071] +/Subtype /Link +/A << /S /GoTo /D (page.365) >> +>> endobj +11696 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [164.829 373.212 181.765 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.364) >> +>> endobj +11697 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.676 361.257 182.612 372.161] +/Subtype /Link +/A << /S /GoTo /D (page.369) >> +>> endobj +11698 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.398 349.302 195.334 360.206] +/Subtype /Link +/A << /S /GoTo /D (page.369) >> +>> endobj +11699 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [202.457 337.347 219.394 348.251] +/Subtype /Link +/A << /S /GoTo /D (page.375) >> +>> endobj +11700 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [230.542 325.392 247.478 336.296] +/Subtype /Link +/A << /S /GoTo /D (page.372) >> +>> endobj +11701 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.748 313.437 232.684 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.372) >> +>> endobj +11702 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.968 301.481 221.905 312.385] +/Subtype /Link +/A << /S /GoTo /D (page.371) >> +>> endobj +11703 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.69 289.526 234.627 300.43] +/Subtype /Link +/A << /S /GoTo /D (page.371) >> +>> endobj +11704 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.514 278.288 212.451 288.475] +/Subtype /Link +/A << /S /GoTo /D (page.360) >> +>> endobj +11705 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.122 266.333 213.058 276.52] +/Subtype /Link +/A << /S /GoTo /D (page.361) >> +>> endobj +11706 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.379 254.378 208.316 264.565] +/Subtype /Link +/A << /S /GoTo /D (page.375) >> +>> endobj +11707 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [211.304 254.378 228.241 264.565] +/Subtype /Link +/A << /S /GoTo /D (page.376) >> +>> endobj +11708 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.821 241.706 207.757 252.609] +/Subtype /Link +/A << /S /GoTo /D (page.373) >> +>> endobj +11709 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.308 230.468 171.245 240.654] +/Subtype /Link +/A << /S /GoTo /D (page.360) >> +>> endobj +11710 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.115 218.512 164.052 228.699] +/Subtype /Link +/A << /S /GoTo /D (page.363) >> +>> endobj +11711 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.927 205.84 200.863 216.744] +/Subtype /Link +/A << /S /GoTo /D (page.368) >> +>> endobj +11712 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.136 193.885 233.073 204.789] +/Subtype /Link +/A << /S /GoTo /D (page.374) >> +>> endobj +11713 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.439 181.93 224.375 192.834] +/Subtype /Link +/A << /S /GoTo /D (page.374) >> +>> endobj +11714 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.574 169.975 233.511 180.878] +/Subtype /Link +/A << /S /GoTo /D (page.369) >> +>> endobj +11715 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.499 169.975 253.436 180.878] +/Subtype /Link +/A << /S /GoTo /D (page.370) >> +>> endobj +11716 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [229.296 158.019 246.233 168.923] +/Subtype /Link +/A << /S /GoTo /D (page.370) >> +>> endobj +11717 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [199.379 146.064 216.315 156.968] +/Subtype /Link +/A << /S /GoTo /D (page.362) >> +>> endobj +11718 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [199.13 134.109 216.066 145.013] +/Subtype /Link +/A << /S /GoTo /D (page.363) >> +>> endobj +11719 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [155.962 122.871 172.899 133.058] +/Subtype /Link +/A << /S /GoTo /D (page.364) >> +>> endobj +11720 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.283 110.199 207.219 121.103] +/Subtype /Link +/A << /S /GoTo /D (page.368) >> +>> endobj +11721 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.27 98.244 269.206 109.147] +/Subtype /Link +/A << /S /GoTo /D (page.368) >> +>> endobj +11722 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.782 86.288 196.719 97.192] +/Subtype /Link +/A << /S /GoTo /D (page.360) >> +>> endobj +11723 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [391.82 719.912 408.757 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.375) >> +>> endobj +11724 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [425.026 707.957 441.962 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.373) >> +>> endobj +11725 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.684 696.719 386.62 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.361) >> +>> endobj +11726 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.03 684.764 384.966 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.362) >> +>> endobj +11727 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [395.676 672.092 412.613 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.372) >> +>> endobj +11728 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [403.755 660.854 420.692 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.357) >> +>> endobj +11729 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [423.681 660.854 440.617 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.360) >> +>> endobj +11730 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [426.67 648.181 443.606 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.366) >> +>> endobj +11731 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [430.545 636.226 447.482 647.13] +/Subtype /Link +/A << /S /GoTo /D (page.367) >> +>> endobj +11732 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [420.044 624.988 436.981 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.364) >> +>> endobj +11733 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [423.92 613.033 440.856 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.365) >> +>> endobj +11734 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.522 601.078 400.458 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.363) >> +>> endobj +11735 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [403.447 601.078 420.383 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.364) >> +>> endobj +11736 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [467.885 588.405 484.821 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.373) >> +>> endobj +11737 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [437.449 576.45 454.386 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.373) >> +>> endobj +11738 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [454.226 564.495 471.162 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.368) >> +>> endobj +11739 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [396.254 552.54 413.19 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.363) >> +>> endobj +11740 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [350.765 540.585 367.702 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.375) >> +>> endobj +11741 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [407.87 528.63 424.806 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.372) >> +>> endobj +11742 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [376.877 517.392 393.813 527.578] +/Subtype /Link +/A << /S /GoTo /D (page.367) >> +>> endobj +11743 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [396.802 517.392 413.739 527.578] +/Subtype /Link +/A << /S /GoTo /D (page.368) >> +>> endobj +11744 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [389.041 505.437 405.978 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.374) >> +>> endobj +11745 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [408.967 505.437 425.903 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.375) >> +>> endobj +11746 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 482.866 362.272 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.376) >> +>> endobj +11747 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.084 468.854 396.021 479.758] +/Subtype /Link +/A << /S /GoTo /D (page.378) >> +>> endobj +11748 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [366.705 456.899 383.642 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.377) >> +>> endobj +11749 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.824 444.943 391.761 455.847] +/Subtype /Link +/A << /S /GoTo /D (page.377) >> +>> endobj +11750 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.088 432.988 396.025 443.892] +/Subtype /Link +/A << /S /GoTo /D (page.377) >> +>> endobj +11751 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 411.135 362.272 419.982] +/Subtype /Link +/A << /S /GoTo /D (page.378) >> +>> endobj +11752 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.084 397.123 396.021 408.027] +/Subtype /Link +/A << /S /GoTo /D (page.379) >> +>> endobj +11753 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [366.705 385.168 383.642 396.071] +/Subtype /Link +/A << /S /GoTo /D (page.379) >> +>> endobj +11754 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.824 373.212 391.761 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.379) >> +>> endobj +11755 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.088 361.257 396.025 372.161] +/Subtype /Link +/A << /S /GoTo /D (page.379) >> +>> endobj +11756 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [467.486 349.302 484.423 360.206] +/Subtype /Link +/A << /S /GoTo /D (page.380) >> +>> endobj +11757 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [395.676 337.347 412.613 348.251] +/Subtype /Link +/A << /S /GoTo /D (page.398) >> +>> endobj +11758 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [457.663 325.392 474.6 336.296] +/Subtype /Link +/A << /S /GoTo /D (page.398) >> +>> endobj +11759 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [399.552 313.437 416.488 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.401) >> +>> endobj +11760 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [461.539 301.481 478.475 312.385] +/Subtype /Link +/A << /S /GoTo /D (page.402) >> +>> endobj +11761 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [389.051 290.243 405.987 300.43] +/Subtype /Link +/A << /S /GoTo /D (page.396) >> +>> endobj +11762 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [451.038 278.288 467.974 288.475] +/Subtype /Link +/A << /S /GoTo /D (page.397) >> +>> endobj +11763 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [392.926 266.333 409.863 276.52] +/Subtype /Link +/A << /S /GoTo /D (page.398) >> +>> endobj +11764 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [454.913 254.378 471.85 264.565] +/Subtype /Link +/A << /S /GoTo /D (page.399) >> +>> endobj +11765 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [387.378 241.706 404.314 252.609] +/Subtype /Link +/A << /S /GoTo /D (page.397) >> +>> endobj +11766 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [449.364 229.75 466.301 240.654] +/Subtype /Link +/A << /S /GoTo /D (page.397) >> +>> endobj +11767 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [391.253 217.795 408.189 228.699] +/Subtype /Link +/A << /S /GoTo /D (page.400) >> +>> endobj +11768 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [453.24 205.84 470.176 216.744] +/Subtype /Link +/A << /S /GoTo /D (page.400) >> +>> endobj +11769 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [438.127 193.885 455.063 204.789] +/Subtype /Link +/A << /S /GoTo /D (page.402) >> +>> endobj +11770 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 172.032 362.272 180.878] +/Subtype /Link +/A << /S /GoTo /D (page.402) >> +>> endobj +11771 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [431.501 158.019 448.438 168.923] +/Subtype /Link +/A << /S /GoTo /D (page.398) >> +>> endobj +11772 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [493.488 146.064 510.425 156.968] +/Subtype /Link +/A << /S /GoTo /D (page.399) >> +>> endobj +11773 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [429.828 134.109 446.764 145.013] +/Subtype /Link +/A << /S /GoTo /D (page.400) >> +>> endobj +11774 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [491.815 122.154 508.751 133.058] +/Subtype /Link +/A << /S /GoTo /D (page.401) >> +>> endobj +11775 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [473.165 110.199 490.101 121.103] +/Subtype /Link +/A << /S /GoTo /D (page.411) >> +>> endobj +11776 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [474.271 98.244 491.207 109.147] +/Subtype /Link +/A << /S /GoTo /D (page.411) >> +>> endobj +11777 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [382.157 86.288 399.093 97.192] +/Subtype /Link +/A << /S /GoTo /D (page.406) >> +>> endobj +11779 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +11783 0 obj << +/D [11781 0 R /XYZ 90 757.935 null] +>> endobj +11780 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F11 418 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +11882 0 obj << +/Length 1547 +/Filter /FlateDecode +>> +stream +xÚÅZ[“šH~÷Wð¶ZµÃt74ÈTò0I܉‰·¨Ùšd’êb¤Uv¹pÍì¯ßnÀ)eÐìÌrûÎw®}N VîZoæ­ë?4E2dCCš4_Jt ÊAinIíþè]ï¾ó}þARAWXcÏ%TñÓ­Þ¼õ£ÙY Áäi¬Ëº‚¥…Ûzø$‹ÿ Y1ºÒ6¹Ë•T¤°OGšµ>µÀ> ö˜@À¾#,éH‘†S©æ²ƒpûÈ£$©íš+ú{B$e®2*Ó»–ôp…0h«@ËnHE±WÊÎ0ß¼Ÿ~ +ÙÚõloEÌ(²W^)¨Qúèo<‹Z䀰Ûnu`aKˆag¡ˆÛ?ãÐ |njmßkhíPÊ{ݨ-‚rE"² }—˜>òÿWf ÅP…q©ãslb.|oaÆÔc¢Ê£2ÀˆYÔö¢æÌb!­Ðß©Ó³H˜ J,Û¥^Ĝ]ª¨RÈoé;/ £†˜+êÑÐtìëånÎíÒ'ôzt„3¾Ÿç`ÅÂW’zk3Z“…o•2ƒjaÔØ^LÈ.ªÔâp>‚HxPº¶g»ÌÂMá#…Ñ_>“ˆÒ¬)D‡qŠ/W‹sR.X‹]3¨ž¤¨06\ó§ˆÇÊꛠãŒ?Ö-€°ýßtý„{M¢ÈÐÀ»žëÕ«ô–Ã> Ë*k®²[ªfݕڕ5C9$Äà‰y+©7KRo!º4\è¸x½qœ†pø8\µt.ƞ0ì5µÂÒUJ1`¾èCH;ùPiæ‡4«ñ[;æ¥Ô[…î‚R…êÁFçÆM›¸.¬V ۜnVÜ8nÃRw¯·$k{µ¦áيÝq!gFl7pìåÙD¼à-_¶œ'E™×ìEÌÒôLÍd´í@Ð6ƒºÝEF+fö#,‚ˆžg!ÝxÏ!Zµ¸‚é {X~¸ÌÐ5É®™d`?†føts3IÞÍÄU qL˜iYÄc)ñèÇ1›lxÃô‰y“Ñ0 ¼«d y\ËG¨µIºª2.Ó\Ë5~qºVË/ªnÇ«3#IÒ¦ˆ¿p™FP`™Þzýº*\~5ípkóT–ªb q +3sãŒþZµJŒ.šï%nf+’Œï¢êòÊJj²ÚE’Æ|¯!õ”b/³ÆÚ\ÄÍòC¤2Lé‚_~Z8”ô½`7´[¡°™Ëg½©pö£#•(§\úM4a‘@=)Ta¾ÓZšDÙ£S.R©o¯?;BvÕ®#蘵•®ÿ_º¨éÂE +j(—ðÕ¶ˆPñÀQÍä¸iúˆ»¹y뻁҆.—‘YyC€´òÀú¥Q¡ DE 5uqgƶé°u/©dÔ"“´½ìwD*Ê!ä^Ӕë¹rÂÊÚb¥ê©äƒY1ä.†9ýÇýÑüd_W¨ç]²3YÞ§A£[?ºïBÛ"咎Ùa­ÈÏl¤¼´ ‘HäDX;Oö{ûzĞ¡N_…BÁzÅÈӀ@äÞbª™v¢Û5/Ö£îÈï,ÕõÄEIlwý¿ Oìït¿õ¾%Å8Tµ¦söhT[:2Hý}¿`Ôë°[u“ò˜F/6ÃN¬(ÖJƒö—ÑxØ¿·ãádлïÏ¿œvÿ„ÝvO’ßg–I#^Úúk]‘šz ø$Ûї=¶åçÚÎÞpRQüË\ï'ü¹£‚öí ÔÝ´w›ôOóޔŒ§äRÐó÷·£fpƒÞlvf† df™G‡·÷ýaÿk¦l<ª «atN¸Ñ˜›j~N»'sΰ÷Ž û2™rÌñ›AoXéî3ÿšÖ• Ø}Kh÷v&ºÒÍÞS†Œq¶ñ2_ÓN"þ¹\f‡»š™f…3=øÑð·Æí(=šÞÆtÒïßé¾gȧÐô$!»åΕ =£4S6Õìoi÷í#¯ +ïñ…]]VÚ Eë8n®¯·Û­¼ˆäg¡lÇ×Aà\˜/§5„ª¬?ƒ,ـ–sý0SßöØI7ùC>böÿèDW! +endstream +endobj +11881 0 obj << +/Type /Page +/Contents 11882 0 R +/Resources 11880 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 11884 0 R +/Annots [ 11778 0 R 11784 0 R 11785 0 R 11786 0 R 11787 0 R 11788 0 R 11789 0 R 11790 0 R 11791 0 R 11792 0 R 11793 0 R 11794 0 R 11795 0 R 11796 0 R 11797 0 R 11798 0 R 11799 0 R 11800 0 R 11801 0 R 11802 0 R 11803 0 R 11804 0 R 11805 0 R 11806 0 R 11807 0 R 11808 0 R 11809 0 R 11810 0 R 11811 0 R 11812 0 R 11813 0 R 11814 0 R 11815 0 R 11816 0 R 11817 0 R 11818 0 R 11819 0 R 11820 0 R 11821 0 R 11822 0 R 11823 0 R 11824 0 R 11825 0 R 11826 0 R 11827 0 R 11828 0 R 11829 0 R 11830 0 R 11831 0 R 11832 0 R 11833 0 R 11834 0 R 11835 0 R 11836 0 R 11837 0 R 11838 0 R 11839 0 R 11840 0 R 11841 0 R 11842 0 R 11843 0 R 11844 0 R 11845 0 R 11846 0 R 11847 0 R 11848 0 R 11849 0 R 11850 0 R 11851 0 R 11852 0 R 11853 0 R 11854 0 R 11855 0 R 11856 0 R 11857 0 R 11858 0 R 11859 0 R 11860 0 R 11861 0 R 11862 0 R 11863 0 R 11864 0 R 11865 0 R 11866 0 R 11867 0 R 11868 0 R 11869 0 R 11870 0 R 11871 0 R 11872 0 R 11873 0 R 11874 0 R 11875 0 R 11876 0 R 11877 0 R 11879 0 R ] +>> endobj +11778 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.398 719.912 195.334 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.406) >> +>> endobj +11784 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [222.393 707.957 239.329 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.409) >> +>> endobj +11785 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.968 696.002 221.905 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.408) >> +>> endobj +11786 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.69 684.047 234.627 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.408) >> +>> endobj +11787 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.027 672.092 293.964 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.409) >> +>> endobj +11788 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.65 660.136 274.587 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.410) >> +>> endobj +11789 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.514 648.899 212.451 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.394) >> +>> endobj +11790 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.122 636.943 213.058 647.13] +/Subtype /Link +/A << /S /GoTo /D (page.394) >> +>> endobj +11791 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.821 624.271 207.757 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.412) >> +>> endobj +11792 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.308 613.033 171.245 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.394) >> +>> endobj +11793 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.115 601.078 164.052 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.396) >> +>> endobj +11794 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.136 588.405 233.073 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.413) >> +>> endobj +11795 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.439 576.45 224.375 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.413) >> +>> endobj +11796 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.574 564.495 233.511 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.406) >> +>> endobj +11797 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.499 564.495 253.436 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.407) >> +>> endobj +11798 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [229.296 552.54 246.233 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.407) >> +>> endobj +11799 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.015 540.585 219.952 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.410) >> +>> endobj +11800 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [155.962 529.347 172.899 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.414) >> +>> endobj +11801 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.283 516.674 207.219 527.578] +/Subtype /Link +/A << /S /GoTo /D (page.404) >> +>> endobj +11802 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.27 504.719 269.206 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.404) >> +>> endobj +11803 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.782 492.764 196.719 503.668] +/Subtype /Link +/A << /S /GoTo /D (page.393) >> +>> endobj +11804 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.95 480.809 287.886 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.409) >> +>> endobj +11805 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.573 468.854 268.509 479.758] +/Subtype /Link +/A << /S /GoTo /D (page.410) >> +>> endobj +11806 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.544 456.899 225.481 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.412) >> +>> endobj +11807 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.202 445.661 170.139 455.847] +/Subtype /Link +/A << /S /GoTo /D (page.394) >> +>> endobj +11808 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.549 433.706 168.485 443.892] +/Subtype /Link +/A << /S /GoTo /D (page.395) >> +>> endobj +11809 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.296 421.75 145.233 431.937] +/Subtype /Link +/A << /S /GoTo /D (page.396) >> +>> endobj +11810 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.603 409.078 179.539 419.982] +/Subtype /Link +/A << /S /GoTo /D (page.414) >> +>> endobj +11811 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.622 397.123 223.558 408.027] +/Subtype /Link +/A << /S /GoTo /D (page.405) >> +>> endobj +11812 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.994 385.168 198.931 396.071] +/Subtype /Link +/A << /S /GoTo /D (page.405) >> +>> endobj +11813 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.981 373.212 260.918 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.405) >> +>> endobj +11814 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [159.848 361.257 176.784 372.161] +/Subtype /Link +/A << /S /GoTo /D (page.391) >> +>> endobj +11815 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.773 361.257 196.71 372.161] +/Subtype /Link +/A << /S /GoTo /D (page.393) >> +>> endobj +11816 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.189 349.302 227.125 360.206] +/Subtype /Link +/A << /S /GoTo /D (page.403) >> +>> endobj +11817 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [214.064 337.347 231 348.251] +/Subtype /Link +/A << /S /GoTo /D (page.403) >> +>> endobj +11818 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.563 326.109 220.5 336.296] +/Subtype /Link +/A << /S /GoTo /D (page.403) >> +>> endobj +11819 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.438 314.154 224.375 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.403) >> +>> endobj +11820 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.04 302.199 183.977 312.385] +/Subtype /Link +/A << /S /GoTo /D (page.393) >> +>> endobj +11821 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.404 289.526 268.34 300.43] +/Subtype /Link +/A << /S /GoTo /D (page.412) >> +>> endobj +11822 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [220.968 277.571 237.904 288.475] +/Subtype /Link +/A << /S /GoTo /D (page.412) >> +>> endobj +11823 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [237.745 265.616 254.681 276.52] +/Subtype /Link +/A << /S /GoTo /D (page.405) >> +>> endobj +11824 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.772 253.661 196.709 264.565] +/Subtype /Link +/A << /S /GoTo /D (page.396) >> +>> endobj +11825 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.284 241.706 151.22 252.609] +/Subtype /Link +/A << /S /GoTo /D (page.414) >> +>> endobj +11826 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.389 229.75 208.325 240.654] +/Subtype /Link +/A << /S /GoTo /D (page.409) >> +>> endobj +11827 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.396 218.512 177.332 228.699] +/Subtype /Link +/A << /S /GoTo /D (page.404) >> +>> endobj +11828 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.341 205.84 258.277 216.744] +/Subtype /Link +/A << /S /GoTo /D (page.414) >> +>> endobj +11829 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.464 182.647 188.401 192.834] +/Subtype /Link +/A << /S /GoTo /D (page.420) >> +>> endobj +11830 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.682 170.692 159.618 180.878] +/Subtype /Link +/A << /S /GoTo /D (page.420) >> +>> endobj +11831 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.803 158.019 188.739 168.923] +/Subtype /Link +/A << /S /GoTo /D (page.420) >> +>> endobj +11832 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.603 146.064 179.539 156.968] +/Subtype /Link +/A << /S /GoTo /D (page.421) >> +>> endobj +11833 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.343 134.109 175.28 145.013] +/Subtype /Link +/A << /S /GoTo /D (page.421) >> +>> endobj +11834 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 122.154 221.605 133.058] +/Subtype /Link +/A << /S /GoTo /D (page.421) >> +>> endobj +11835 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.087 110.199 169.023 121.103] +/Subtype /Link +/A << /S /GoTo /D (page.420) >> +>> endobj +11836 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.284 98.244 151.22 109.147] +/Subtype /Link +/A << /S /GoTo /D (page.421) >> +>> endobj +11837 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.371 86.288 213.307 97.192] +/Subtype /Link +/A << /S /GoTo /D (page.420) >> +>> endobj +11838 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [449.773 719.912 466.71 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.420) >> +>> endobj +11839 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [479.501 707.957 496.437 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.421) >> +>> endobj +11840 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [494.056 696.002 510.993 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.422) >> +>> endobj +11841 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [392.359 684.047 409.295 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.422) >> +>> endobj +11842 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.358 672.092 481.294 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.423) >> +>> endobj +11843 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [454.744 660.136 471.68 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.423) >> +>> endobj +11844 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.335 648.899 362.272 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.425) >> +>> endobj +11845 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.084 636.226 396.021 647.13] +/Subtype /Link +/A << /S /GoTo /D (page.425) >> +>> endobj +11846 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [399.014 624.271 415.95 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.425) >> +>> endobj +11847 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [363.587 613.033 380.523 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.425) >> +>> endobj +11848 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [496.805 600.361 513.742 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.425) >> +>> endobj +11849 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [476.332 588.405 493.269 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.426) >> +>> endobj +11850 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.084 576.45 396.021 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.427) >> +>> endobj +11851 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [385.175 565.212 402.112 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.427) >> +>> endobj +11852 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [421.151 529.347 438.087 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.331) >> +>> endobj +11853 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [441.076 529.347 458.013 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.335) >> +>> endobj +11854 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [481.304 504.719 498.241 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.198) >> +>> endobj +11855 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 482.866 362.272 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.256) >> +>> endobj +11856 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [481.304 456.899 498.241 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.199) >> +>> endobj +11857 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.59 421.75 403.527 431.937] +/Subtype /Link +/A << /S /GoTo /D (page.357) >> +>> endobj +11858 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [406.516 421.75 423.452 431.937] +/Subtype /Link +/A << /S /GoTo /D (page.360) >> +>> endobj +11859 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.411 397.123 504.348 408.027] +/Subtype /Link +/A << /S /GoTo /D (page.405) >> +>> endobj +11860 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.411 373.212 504.348 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.405) >> +>> endobj +11861 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.411 349.302 504.348 360.206] +/Subtype /Link +/A << /S /GoTo /D (page.405) >> +>> endobj +11862 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 315.494 362.272 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.146) >> +>> endobj +11863 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 291.464 362.272 300.43] +/Subtype /Link +/A << /S /GoTo /D (page.292) >> +>> endobj +11864 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [492.078 265.616 509.015 276.52] +/Subtype /Link +/A << /S /GoTo /D (page.391) >> +>> endobj +11865 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 255.598 362.272 264.565] +/Subtype /Link +/A << /S /GoTo /D (page.393) >> +>> endobj +11866 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 230.468 425.255 240.654] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +11867 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [421.151 206.557 433.106 216.744] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +11868 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [364.155 194.602 376.11 204.789] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +11869 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [363.647 182.303 375.602 192.834] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +11870 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [432.279 170.348 444.234 180.878] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +11871 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [407.871 158.737 419.826 168.923] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +11872 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [410.7 146.438 422.655 156.968] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +11873 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.292 134.826 398.247 145.013] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +11874 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [405.091 122.871 417.046 133.058] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +11875 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [401.216 110.916 413.171 121.103] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +11876 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [388.703 98.617 400.658 109.147] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +11877 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.401 87.006 470.356 97.192] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +11879 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +11883 0 obj << +/D [11881 0 R /XYZ 90 757.935 null] +>> endobj +11880 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F11 418 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +11967 0 obj << +/Length 1386 +/Filter /FlateDecode +>> +stream +xÚÍZ[s¢H~÷Wð¶Pµ!Ý óf„XÌ(8€ÙÌf¦ºˆv”Z.nƒ“q~ý6³Æ‰ÐÖ̼Èý;ß¹Ÿ·â7î]ù½ËkUætQW%•ó8pŠŠ9ÉÝñ–m˜·Âÿ=ך•>W^è÷åâtÏô{ÿö = 8X>­ ā¬p‹¸w÷pKzþ=DY׸Çò®˜ëK2ÝFœ×û؇LpÀº/)Ü@’E *•Ô™3 ü'ۙZà 9ÓÙļµüO–l*dUóqÇ=îîBR¯jõõJý¹€Pԕ×ú€w涁 Gþ/» oÐÏێkž ÍvŠ]Ù¦i˜Æ¹P糎Hj…äY¥Î捹}Uð2 4µfhV½š˜SVØksèYèܸ֍ézŒN¾A£y¾‹æö‡&(µÊ°nÐßf¥`G,ue~de36™|V˾FCÃ(¶ç€* ÜjÐjêléWÃÌ'­]ކ–7¿:‡†fßOØÃg"èÏBÔQ¬~ò˜Í¬“mŽ‘#Ð;ií¹žT]‹sæxgÇô>º‚Zõ¬1k0ÑÊh×ý¹“þM^9Äïb‹fþŽk”m’iD;˜=÷ŠµìýVm‚³ ý†6;ŽãN‡f˜Ù¤»r°Ÿùv6£Ãâí- +““:CòÁ—sí³»kÁ},Óa*ü· N²PþkqˆÑ"7Û<ÈÃ4ÉØ&‡QŠ +àÏH‹'9›áF”XTqóEA–±šQ¢­p‚IcdF8nÁòuÌe¥æÍwÌ6Ä8NÉeáŵV3+§B’ÞS-‘G¼et¯³ÉÃ8ü^F +š¦KÌWÄp1hZNcž*mÐtøÞqÏgٝáÔá\óÆb××ÅQåoߧã² gۈ1QÝt›,Ãd…Œ¼‘ÍÅKõêÀd?Ö´×*àíÚ$¼Š¦“eõ Ž·TŽ**TGU–EUꟈÈÿ)©g§T[E=m•}ÿD{§»ÖȲǧå= q€fi´[ã% Ð$¼'Ù½{wPOryÉ͒&Q“uQSà‘èŠ]ñšæÌô|dc™·Ãb¾ù?‰²ÊN¹‡„÷gSûæ­å8~GÛnHºÜ.rD0Ýàn Gt ËI@³(C'«[H(ÚAC‚AMkSý^#d§¨Yڋ~Õå6Cík²½8ÈÖÅ÷%©Ë6ÁJ òb(ÞÛ¾›ï®ÒoMþôu÷©ì糒¨¨UBHPHyD_‹i?ˆ¶]|ÿí/‘½ï1yS&B²Fôx:CíRÕ² ix‘ há2—–N ðŸºÙd\-NÒ&.P×Zp!Áî—Ò¨=E0MÚ(Lp@Ð2Ìò Y`DWsá*éÈòÖÁ« $(õU‚#zwü›*:kˆµÈ9Y}AÂê(¨h—èfŠ}ßÌÙæ,ò`•&AÔ༗€e©=ýʬ²[T}‚‹· ®_ŽÐàÄIQ·¸,j ©«bS1QÛÔÿ'zÛäà É^"¨þR‚a¾.:ԊlqÒuäi‘×5}Ð=aÚô@!I¸l2¬¬vÇï”CudÈGýk¿=þè­je«oùÍ{ÿ­[õ¬Õ_ݝ.cëå«¿ÆB©ø“bõá^»ê°V±:˜g˜ü!( +ŸUÇÓ ÙҘ/÷?ì󀎂ÕI B Jô… ª(ïa\+[iö·ßûPüK@9à µ(iÿ_€užoÞ]^>>>Š‹L¤‰·!b˜_n6Ñå3ói a_<<¤¤"§¤V?Lèɸ|u#>¢öÿòîߟ +endstream +endobj +11966 0 obj << +/Type /Page +/Contents 11967 0 R +/Resources 11965 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 11884 0 R +/Annots [ 11878 0 R 11885 0 R 11886 0 R 11887 0 R 11888 0 R 11889 0 R 11890 0 R 11891 0 R 11892 0 R 11893 0 R 11894 0 R 11895 0 R 11896 0 R 11897 0 R 11898 0 R 11899 0 R 11900 0 R 11901 0 R 11902 0 R 11903 0 R 11904 0 R 11905 0 R 11906 0 R 11907 0 R 11908 0 R 11909 0 R 11910 0 R 11911 0 R 11912 0 R 11913 0 R 11914 0 R 11915 0 R 11916 0 R 11917 0 R 11918 0 R 11919 0 R 11920 0 R 11921 0 R 11922 0 R 11923 0 R 11924 0 R 11925 0 R 11926 0 R 11927 0 R 11928 0 R 11929 0 R 11930 0 R 11931 0 R 11932 0 R 11933 0 R 11934 0 R 11935 0 R 11936 0 R 11937 0 R 11938 0 R 11939 0 R 11940 0 R 11941 0 R 11942 0 R 11943 0 R 11944 0 R 11945 0 R 11946 0 R 11947 0 R 11948 0 R 11949 0 R 11950 0 R 11951 0 R 11952 0 R 11953 0 R 11954 0 R 11955 0 R 11956 0 R 11957 0 R 11958 0 R 11959 0 R 11960 0 R 11961 0 R 11962 0 R 11964 0 R ] +>> endobj +11878 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [247.947 720.63 259.902 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +11885 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [184.545 708.674 196.5 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +11886 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.539 696.719 203.494 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +11887 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.807 684.764 230.762 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +11888 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [166.642 672.809 178.598 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +11889 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [225.71 660.854 237.665 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +11890 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.324 648.899 263.279 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +11891 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [249.122 636.943 261.078 647.13] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +11892 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.165 624.988 175.12 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +11893 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.823 613.033 207.778 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +11894 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.383 601.078 186.339 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +11895 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.365 588.779 151.32 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +11896 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.365 577.168 151.32 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +11897 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.365 565.212 151.32 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +11898 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [189.726 553.257 201.681 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +11899 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.85 541.302 197.805 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +11900 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.358 529.347 182.313 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +11901 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [199.848 517.392 211.803 527.578] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +11902 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [187.524 505.437 199.479 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +11903 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.259 493.481 150.214 503.668] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +11904 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.452 481.526 157.407 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +11905 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.342 469.571 149.298 479.758] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +11906 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.923 457.616 191.878 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +11907 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.365 445.661 151.32 455.847] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +11908 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.034 433.706 217.99 443.892] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +11909 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.833 421.75 215.788 431.937] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +11910 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.406 409.451 188.361 419.982] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +11911 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [263.23 397.84 275.185 408.027] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +11912 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [261.028 385.885 272.983 396.071] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +11913 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.717 373.93 206.672 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +11914 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [212.968 361.975 224.923 372.161] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +11915 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.96 350.019 165.915 360.206] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +11916 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.897 338.064 187.853 348.251] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +11917 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [205.227 326.109 217.182 336.296] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +11918 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [250.607 301.481 262.562 312.385] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +11919 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.935 290.243 169.89 300.43] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +11920 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [187.384 277.571 199.339 288.475] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +11921 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.307 265.616 209.262 276.52] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +11922 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.561 253.661 189.516 264.565] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +11923 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [189.725 241.706 201.68 252.609] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +11924 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [199.708 230.468 211.663 240.654] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +11925 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.716 217.795 206.671 228.699] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +11926 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.225 206.557 191.18 216.744] +/Subtype /Link +/A << /S /GoTo /D (page.65) >> +>> endobj +11927 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.969 194.602 229.924 204.789] +/Subtype /Link +/A << /S /GoTo /D (page.65) >> +>> endobj +11928 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.411 182.647 229.367 192.834] +/Subtype /Link +/A << /S /GoTo /D (page.65) >> +>> endobj +11929 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [230.692 170.692 242.647 180.878] +/Subtype /Link +/A << /S /GoTo /D (page.65) >> +>> endobj +11930 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.658 158.019 195.613 168.923] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +11931 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.374 146.781 151.33 156.968] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +11932 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.474 134.109 183.429 145.013] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +11933 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.819 110.916 208.774 121.103] +/Subtype /Link +/A << /S /GoTo /D (page.65) >> +>> endobj +11934 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.819 87.006 208.774 97.192] +/Subtype /Link +/A << /S /GoTo /D (page.65) >> +>> endobj +11935 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 708.674 425.255 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.65) >> +>> endobj +11936 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 684.764 425.255 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.65) >> +>> endobj +11937 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 650.239 362.272 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.283) >> +>> endobj +11938 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 614.373 362.272 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.283) >> +>> endobj +11939 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 578.508 362.272 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.283) >> +>> endobj +11940 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 542.642 362.272 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.283) >> +>> endobj +11941 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [391.273 505.437 408.209 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.188) >> +>> endobj +11942 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 482.747 362.272 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.293) >> +>> endobj +11943 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 459.055 362.272 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.422) >> +>> endobj +11944 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.082 432.988 475.018 443.892] +/Subtype /Link +/A << /S /GoTo /D (page.129) >> +>> endobj +11945 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.082 409.078 475.018 419.982] +/Subtype /Link +/A << /S /GoTo /D (page.129) >> +>> endobj +11946 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 365.307 362.272 374.154] +/Subtype /Link +/A << /S /GoTo /D (page.161) >> +>> endobj +11947 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [496.109 351.295 513.045 362.199] +/Subtype /Link +/A << /S /GoTo /D (page.210) >> +>> endobj +11948 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [481.304 327.384 498.241 338.288] +/Subtype /Link +/A << /S /GoTo /D (page.198) >> +>> endobj +11949 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [481.304 303.474 498.241 314.378] +/Subtype /Link +/A << /S /GoTo /D (page.198) >> +>> endobj +11950 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [494.569 279.564 511.506 290.468] +/Subtype /Link +/A << /S /GoTo /D (page.108) >> +>> endobj +11951 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 269.546 362.272 278.512] +/Subtype /Link +/A << /S /GoTo /D (page.109) >> +>> endobj +11952 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.082 255.653 475.018 266.557] +/Subtype /Link +/A << /S /GoTo /D (page.139) >> +>> endobj +11953 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [494.569 243.698 511.506 254.602] +/Subtype /Link +/A << /S /GoTo /D (page.200) >> +>> endobj +11954 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 233.8 362.272 242.647] +/Subtype /Link +/A << /S /GoTo /D (page.201) >> +>> endobj +11955 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 208.55 362.272 218.737] +/Subtype /Link +/A << /S /GoTo /D (page.320) >> +>> endobj +11956 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [365.261 208.55 382.197 218.737] +/Subtype /Link +/A << /S /GoTo /D (page.321) >> +>> endobj +11957 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [472.208 183.922 489.145 194.826] +/Subtype /Link +/A << /S /GoTo /D (page.269) >> +>> endobj +11958 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [472.208 160.012 489.145 170.916] +/Subtype /Link +/A << /S /GoTo /D (page.269) >> +>> endobj +11959 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [484.642 136.102 496.597 147.005] +/Subtype /Link +/A << /S /GoTo /D (page.97) >> +>> endobj +11960 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.082 124.146 475.018 135.05] +/Subtype /Link +/A << /S /GoTo /D (page.128) >> +>> endobj +11961 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [459.735 112.191 476.672 123.095] +/Subtype /Link +/A << /S /GoTo /D (page.236) >> +>> endobj +11962 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 90.338 362.272 99.185] +/Subtype /Link +/A << /S /GoTo /D (page.310) >> +>> endobj +11964 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +11968 0 obj << +/D [11966 0 R /XYZ 90 757.935 null] +>> endobj +11965 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +12036 0 obj << +/Length 1128 +/Filter /FlateDecode +>> +stream +xÚíZ]sÚ8}çWèmaf£H¶%Ûyl`3t @¦ÙI;ÇðÖD6¥Ù_¿’m҄64I'‰eÙ\{¥sρ @à¬öaX;þ‹êÀ†6Õ(Ž€I1$ø®·;ÍÖUãëð#0¡òséÃ0Tw­5¬ÝÖ°ìE§Ÿ&&4uÜ vý‘ìÿÔm ,Ò·`hº¼ú`PûTC‘ô F²­`j:D”d£ö˜Ô8¬ùwS>;÷n„#îNNò‡‰çøþ;JQce„‚#Œ¡Mr#}>š»|Äz"’äÏԏÌ1É=éŸÕÀõ‘FP]×íü… ©´µÆæv`‘&1O¶`êE Ô\È׊Qú|@YWŒe }ÝX$‹fc þ!-älá%SæFáDÌyèòø§»dtšl0uf¼›m>††v"úQ`kVuógÂØ×tZÝ~×MœI:~A Ö- £mˇ¾Ñ ôڈf¾¢‘ D‹áH—ŸòŒî‘gôgûçÙ^þ&‚f¼žÅ‡%Ú4óh+‚†_ÑÈ+#ZŸûNâE!Ü7‘¿¹^읳ӫ+&£ÁŸQÝq‹è´^½Ÿ”®9ÅôÖ«ÚaÙ­¿ûÐʚº®­BDI Zú®.üBÅÒírŠ0'Ž½IXmŸ]ôX[’K½3á¢(×c\S¤ì}Wÿ8›z“),žI겑ð0–Ä;¬¤btØâõ9ÅeM5ç°Õ+Ð0…†¥ªëjƾ¹NV•Ö*1íՔ–v>ÍZMiº -‚Ÿ"éî]ªk|+•l]OÕ3læ'à2¶U‚Z”oiÉp.s>GB‰ÀKåþxRqþN§Üý¦(+ƒÎ<¸Ù²1\7˜XÛ¦1Ÿµiea$!øÞ¹yzÿ›cJ‰Ö }Ñ;o]±ÓnzmÿÙo²*ÅG/˜ùÞøŽÍcµ„Ü(ߝÿHžlôP²Ûöa+v´v_»z˜€Ziò.y–`y†€BÛÔ­ü4±!!ùÆx8åtü{øùí҇ì6w$»¹Œ¹ø£AH=Îî/œp.SuÚþ‚Êò¤PI'ëD#¨ÉG6Žt¹œçÎfž}ËÖßêôy€[&ԑ¶> endobj +11963 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 708.674 221.606 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.339) >> +>> endobj +11969 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 684.764 187.046 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.366) >> +>> endobj +11970 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 672.092 287.867 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.403) >> +>> endobj +11971 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 648.181 280.116 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.97) >> +>> endobj +11972 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 636.226 258.537 647.13] +/Subtype /Link +/A << /S /GoTo /D (page.128) >> +>> endobj +11973 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 624.271 260.191 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.236) >> +>> endobj +11974 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 602.418 145.791 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.310) >> +>> endobj +11975 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 577.168 221.606 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.340) >> +>> endobj +11976 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 553.257 187.046 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.367) >> +>> endobj +11977 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 540.585 287.867 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.403) >> +>> endobj +11978 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 516.674 280.116 527.578] +/Subtype /Link +/A << /S /GoTo /D (page.96) >> +>> endobj +11979 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 504.719 258.537 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.128) >> +>> endobj +11980 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 492.764 260.191 503.668] +/Subtype /Link +/A << /S /GoTo /D (page.236) >> +>> endobj +11981 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 470.911 145.791 479.758] +/Subtype /Link +/A << /S /GoTo /D (page.310) >> +>> endobj +11982 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 445.661 221.606 455.847] +/Subtype /Link +/A << /S /GoTo /D (page.339) >> +>> endobj +11983 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 421.75 187.046 431.937] +/Subtype /Link +/A << /S /GoTo /D (page.364) >> +>> endobj +11984 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 409.078 287.867 419.982] +/Subtype /Link +/A << /S /GoTo /D (page.403) >> +>> endobj +11985 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 385.168 280.116 396.071] +/Subtype /Link +/A << /S /GoTo /D (page.97) >> +>> endobj +11986 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 373.212 258.537 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.128) >> +>> endobj +11987 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 361.257 260.191 372.161] +/Subtype /Link +/A << /S /GoTo /D (page.237) >> +>> endobj +11988 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 339.404 145.791 348.251] +/Subtype /Link +/A << /S /GoTo /D (page.310) >> +>> endobj +11989 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 314.154 221.606 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.341) >> +>> endobj +11990 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 290.243 187.046 300.43] +/Subtype /Link +/A << /S /GoTo /D (page.365) >> +>> endobj +11991 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 277.571 287.867 288.475] +/Subtype /Link +/A << /S /GoTo /D (page.403) >> +>> endobj +11992 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.819 254.378 208.774 264.565] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +11993 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 229.75 280.116 240.654] +/Subtype /Link +/A << /S /GoTo /D (page.92) >> +>> endobj +11994 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 217.795 258.537 228.699] +/Subtype /Link +/A << /S /GoTo /D (page.123) >> +>> endobj +11995 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 194.602 145.791 204.789] +/Subtype /Link +/A << /S /GoTo /D (page.305) >> +>> endobj +11996 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.78 194.602 165.716 204.789] +/Subtype /Link +/A << /S /GoTo /D (page.306) >> +>> endobj +11997 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 170.692 187.046 180.878] +/Subtype /Link +/A << /S /GoTo /D (page.363) >> +>> endobj +11998 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.034 170.692 206.971 180.878] +/Subtype /Link +/A << /S /GoTo /D (page.364) >> +>> endobj +11999 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 158.019 287.867 168.923] +/Subtype /Link +/A << /S /GoTo /D (page.393) >> +>> endobj +12000 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.627 134.109 296.564 145.013] +/Subtype /Link +/A << /S /GoTo /D (page.211) >> +>> endobj +12001 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 110.199 285.097 121.103] +/Subtype /Link +/A << /S /GoTo /D (page.106) >> +>> endobj +12002 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 98.244 258.537 109.147] +/Subtype /Link +/A << /S /GoTo /D (page.136) >> +>> endobj +12003 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 86.288 260.191 97.192] +/Subtype /Link +/A << /S /GoTo /D (page.247) >> +>> endobj +12004 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 710.014 362.272 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.318) >> +>> endobj +12005 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [421.151 684.764 438.087 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.347) >> +>> endobj +12006 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.59 660.854 403.527 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.373) >> +>> endobj +12007 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.411 648.181 504.348 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.412) >> +>> endobj +12008 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [484.642 624.271 501.578 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.106) >> +>> endobj +12009 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.082 612.316 475.018 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.136) >> +>> endobj +12010 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [459.735 600.361 476.672 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.247) >> +>> endobj +12011 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 578.508 362.272 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.318) >> +>> endobj +12012 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [421.151 553.257 438.087 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.347) >> +>> endobj +12013 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.59 529.347 403.527 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.373) >> +>> endobj +12014 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.411 516.674 504.348 527.578] +/Subtype /Link +/A << /S /GoTo /D (page.412) >> +>> endobj +12015 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [435.935 492.764 447.89 503.668] +/Subtype /Link +/A << /S /GoTo /D (page.75) >> +>> endobj +12016 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 469.571 425.255 479.758] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +12017 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 445.661 425.255 455.847] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +12018 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 421.75 425.255 431.937] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +12019 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 397.84 425.255 408.027] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +12020 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 373.93 425.255 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +12021 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 350.019 425.255 360.206] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +12022 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.748 315.429 494.684 326.333] +/Subtype /Link +/A << /S /GoTo /D (page.420) >> +>> endobj +12023 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.082 291.519 475.018 302.423] +/Subtype /Link +/A << /S /GoTo /D (page.138) >> +>> endobj +12024 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 257.711 362.272 266.557] +/Subtype /Link +/A << /S /GoTo /D (page.285) >> +>> endobj +12025 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [435.935 231.743 447.89 242.647] +/Subtype /Link +/A << /S /GoTo /D (page.76) >> +>> endobj +12026 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [435.935 207.833 447.89 218.737] +/Subtype /Link +/A << /S /GoTo /D (page.75) >> +>> endobj +12027 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 174.024 362.272 182.871] +/Subtype /Link +/A << /S /GoTo /D (page.158) >> +>> endobj +12028 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [489.613 148.057 506.55 158.961] +/Subtype /Link +/A << /S /GoTo /D (page.166) >> +>> endobj +12029 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 124.864 425.255 135.05] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +12030 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [484.642 100.236 496.597 111.14] +/Subtype /Link +/A << /S /GoTo /D (page.99) >> +>> endobj +12031 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.082 88.281 475.018 99.185] +/Subtype /Link +/A << /S /GoTo /D (page.130) >> +>> endobj +12033 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +12037 0 obj << +/D [12035 0 R /XYZ 90 757.935 null] +>> endobj +12034 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +12105 0 obj << +/Length 1217 +/Filter /FlateDecode +>> +stream +xÚÍZmsÚ8þί𷃙‹#ɖlç[“Ð ½„Ð@nr“ëxPˆ§~¡²(¥¿þärà:X¶Bš/`˒öٕ÷Ù]É@›k@»èœN:lj¡9ºCÑ&š4‹@#¨MfÚ}w0<ïßõ¾L>i&°u€‰—=0Mœ6wú“η­@ƒÙhl閁µiعÿ´™hÿ¤Ýplm•õ +5â?ÐƝÏ°ƒ-$ˆk„5 : 8—:êAÜõXè¹£8X?ÑóÜKÿyl}rrÁüٟ¨ ›°n.:Úý ‹LPtÈŊŸ#uËÌ?ˆ8eß{Hôê䧽œë)÷æqäîøÉ[ÐEÁÔ@dwb¢]ÁGU½öŠÅ~ÄÊÝ£lÝwƓb|œZaE™èVc ƒØê€ò¦8ª‘e\% ïÊJâà{*Žþ¯n€æj0rG,~hØheMJà G·1,[xSêÎüF‰G¿B$ÿîAÅSß(ël†¤löq×Kµ³Úٝ~íAÐ¥3w¸ (kd<ˆ•ß¢‹«‘›zpÚg¾G|áÀʘ…׎eUó@±ŒãÉÍàlâ†ýÏ©qn{&è~¸Lþiiå8J8ó„ÿÖÀ‚–#¥ó§¸á2ø-tO6to½Kº_¥*y‹ƒÒ „ +)ªj˜%pŸÝÉ뾌¶‚žÏRöÐÕxð=IÚ&*“‚|Ôµ %• )Ê*ÛDu•Ï©(…B?òxí2;P!î҈2Çµî À+Qµ+ê¬%SÂ:ít~·Þª•õK)/ÿ‹ADÇAP'ÄiŒfÛü¸ù«Ã;>P…o)¼r—~D½J…‹EìÿX0š¤`- GUié‚— ZKUt£¼·4±Ð>ñD%ïÅJy/ªv©Ê{Ëãä½V$»ÍönÑ@'½”©öq Kã~H]x‹„þ’Î’¤nµ§f‰Ö0[šæmZ–]ª¿ ‡qe“(sÌ+»2z;WŽD:Ãc.Ö<¤aÌÖ®¹kN“v^Ö´xÁå=B¬ºXM‹F c ¶Œ¦Jì£l™çIÏÝõ‚¶„Øzã±Qö*Y@ÇV#JÙ¹œ½héí t;<½¾ž÷ÏÝ,óºI÷|¯O/ûW/›~téžÝÝ ÷ééc¶Q[^K»ˆ7s³p ŒŽuиˆœoíÚ¿+.Â÷KÀ#Ð;‹¤å½Ðzª]ê@±×”pßÛáÇþ‡ñ@pG•<.Ñ;##ÉúÍÉ<ÑË°‹o°#J}³ˆO´—~V½¸ÝèŸßFÈonÊþèaÜMòû+/ZzA~ý/À ? eÙhÖtt$A½wdSZ(™köUÛ\ý•~Ӏ·ðBÛÒ €6_.^­Vú4ї‘¿`ºÏ‹àxÇl%­!4uëy’ǘåÀDÞS¨ïGé>>˜õ²ýÿ1x¦ž +endstream +endobj +12104 0 obj << +/Type /Page +/Contents 12105 0 R +/Resources 12103 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 11884 0 R +/Annots [ 12032 0 R 12038 0 R 12039 0 R 12040 0 R 12041 0 R 12042 0 R 12043 0 R 12044 0 R 12045 0 R 12046 0 R 12047 0 R 12048 0 R 12049 0 R 12050 0 R 12051 0 R 12052 0 R 12053 0 R 12054 0 R 12055 0 R 12056 0 R 12057 0 R 12058 0 R 12059 0 R 12060 0 R 12061 0 R 12062 0 R 12063 0 R 12064 0 R 12065 0 R 12066 0 R 12067 0 R 12068 0 R 12069 0 R 12070 0 R 12071 0 R 12072 0 R 12073 0 R 12074 0 R 12075 0 R 12076 0 R 12077 0 R 12078 0 R 12079 0 R 12080 0 R 12081 0 R 12082 0 R 12083 0 R 12084 0 R 12085 0 R 12086 0 R 12087 0 R 12088 0 R 12089 0 R 12090 0 R 12091 0 R 12092 0 R 12093 0 R 12094 0 R 12095 0 R 12096 0 R 12097 0 R 12098 0 R 12099 0 R 12100 0 R 12102 0 R ] +>> endobj +12032 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 719.912 260.191 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.240) >> +>> endobj +12038 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.727 707.957 272.664 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.269) >> +>> endobj +12039 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 686.104 145.791 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.312) >> +>> endobj +12040 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 660.854 187.046 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.368) >> +>> endobj +12041 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 648.181 287.867 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.405) >> +>> endobj +12042 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 614.373 145.791 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.286) >> +>> endobj +12043 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [258.188 588.405 275.124 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.425) >> +>> endobj +12044 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 554.597 145.791 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.158) >> +>> endobj +12045 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.627 540.585 296.564 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.211) >> +>> endobj +12046 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [105.611 529.347 117.566 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.77) >> +>> endobj +12047 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.506 504.719 283.443 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.179) >> +>> endobj +12048 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 480.809 280.116 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.92) >> +>> endobj +12049 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 468.854 258.537 479.758] +/Subtype /Link +/A << /S /GoTo /D (page.126) >> +>> endobj +12050 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 456.899 260.191 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.230) >> +>> endobj +12051 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 435.046 145.791 443.892] +/Subtype /Link +/A << /S /GoTo /D (page.305) >> +>> endobj +12052 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 409.795 221.606 419.982] +/Subtype /Link +/A << /S /GoTo /D (page.338) >> +>> endobj +12053 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.109 385.885 187.046 396.071] +/Subtype /Link +/A << /S /GoTo /D (page.363) >> +>> endobj +12054 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.93 373.212 287.867 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.396) >> +>> endobj +12055 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [273.132 349.302 290.068 360.206] +/Subtype /Link +/A << /S /GoTo /D (page.167) >> +>> endobj +12056 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 315.494 145.791 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.157) >> +>> endobj +12057 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.627 301.481 296.564 312.385] +/Subtype /Link +/A << /S /GoTo /D (page.211) >> +>> endobj +12058 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 277.571 285.097 288.475] +/Subtype /Link +/A << /S /GoTo /D (page.110) >> +>> endobj +12059 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 255.718 145.791 264.565] +/Subtype /Link +/A << /S /GoTo /D (page.161) >> +>> endobj +12060 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [273.132 241.706 290.068 252.609] +/Subtype /Link +/A << /S /GoTo /D (page.168) >> +>> endobj +12061 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.175 217.795 180.112 228.699] +/Subtype /Link +/A << /S /GoTo /D (page.173) >> +>> endobj +12062 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.506 205.84 283.443 216.744] +/Subtype /Link +/A << /S /GoTo /D (page.183) >> +>> endobj +12063 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.175 181.93 180.112 192.834] +/Subtype /Link +/A << /S /GoTo /D (page.186) >> +>> endobj +12064 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.237 169.975 291.174 180.878] +/Subtype /Link +/A << /S /GoTo /D (page.191) >> +>> endobj +12065 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [264.823 158.019 281.759 168.923] +/Subtype /Link +/A << /S /GoTo /D (page.200) >> +>> endobj +12066 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.175 134.109 180.112 145.013] +/Subtype /Link +/A << /S /GoTo /D (page.207) >> +>> endobj +12067 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 122.154 260.191 133.058] +/Subtype /Link +/A << /S /GoTo /D (page.249) >> +>> endobj +12068 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 100.301 145.791 109.147] +/Subtype /Link +/A << /S /GoTo /D (page.258) >> +>> endobj +12069 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.656 707.957 396.593 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.263) >> +>> endobj +12070 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [472.208 696.002 489.145 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.270) >> +>> endobj +12071 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [394.59 672.092 411.527 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.279) >> +>> endobj +12072 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 650.239 362.272 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.287) >> +>> endobj +12073 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 626.328 362.272 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.322) >> +>> endobj +12074 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [421.151 601.078 438.087 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.350) >> +>> endobj +12075 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.59 577.168 403.527 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.375) >> +>> endobj +12076 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.411 564.495 504.348 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.414) >> +>> endobj +12077 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.748 552.54 494.684 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.421) >> +>> endobj +12078 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [484.642 518.667 501.578 529.571] +/Subtype /Link +/A << /S /GoTo /D (page.102) >> +>> endobj +12079 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.082 506.712 475.018 517.616] +/Subtype /Link +/A << /S /GoTo /D (page.134) >> +>> endobj +12080 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [459.735 494.757 476.672 505.661] +/Subtype /Link +/A << /S /GoTo /D (page.244) >> +>> endobj +12081 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 472.904 362.272 481.75] +/Subtype /Link +/A << /S /GoTo /D (page.315) >> +>> endobj +12082 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [421.151 447.653 438.087 457.84] +/Subtype /Link +/A << /S /GoTo /D (page.346) >> +>> endobj +12083 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.59 423.743 403.527 433.93] +/Subtype /Link +/A << /S /GoTo /D (page.372) >> +>> endobj +12084 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.411 411.07 504.348 421.974] +/Subtype /Link +/A << /S /GoTo /D (page.409) >> +>> endobj +12085 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 377.262 362.272 386.109] +/Subtype /Link +/A << /S /GoTo /D (page.155) >> +>> endobj +12086 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [496.109 363.25 513.045 374.154] +/Subtype /Link +/A << /S /GoTo /D (page.210) >> +>> endobj +12087 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 329.442 362.272 338.288] +/Subtype /Link +/A << /S /GoTo /D (page.156) >> +>> endobj +12088 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [482.988 303.474 499.924 314.378] +/Subtype /Link +/A << /S /GoTo /D (page.179) >> +>> endobj +12089 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [481.304 291.519 498.241 302.423] +/Subtype /Link +/A << /S /GoTo /D (page.198) >> +>> endobj +12090 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 269.666 362.272 278.512] +/Subtype /Link +/A << /S /GoTo /D (page.256) >> +>> endobj +12091 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 234.453 425.255 244.639] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +12092 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [484.642 209.825 496.597 220.729] +/Subtype /Link +/A << /S /GoTo /D (page.97) >> +>> endobj +12093 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.082 197.87 475.018 208.774] +/Subtype /Link +/A << /S /GoTo /D (page.129) >> +>> endobj +12094 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [459.735 185.915 476.672 196.819] +/Subtype /Link +/A << /S /GoTo /D (page.238) >> +>> endobj +12095 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 164.062 362.272 172.908] +/Subtype /Link +/A << /S /GoTo /D (page.311) >> +>> endobj +12096 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [421.151 138.811 438.087 148.998] +/Subtype /Link +/A << /S /GoTo /D (page.341) >> +>> endobj +12097 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [441.076 138.811 458.013 148.998] +/Subtype /Link +/A << /S /GoTo /D (page.342) >> +>> endobj +12098 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.59 114.901 403.527 125.088] +/Subtype /Link +/A << /S /GoTo /D (page.367) >> +>> endobj +12099 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [406.516 114.901 423.452 125.088] +/Subtype /Link +/A << /S /GoTo /D (page.368) >> +>> endobj +12100 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.411 102.229 504.348 113.133] +/Subtype /Link +/A << /S /GoTo /D (page.404) >> +>> endobj +12102 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +12106 0 obj << +/D [12104 0 R /XYZ 90 757.935 null] +>> endobj +12103 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +12157 0 obj << +/Length 984 +/Filter /FlateDecode +>> +stream +xÚíY[sâ6~çWè­öL#$ےqÞ »`lhÚtGã€!ž‚Í +S6ýõ•/°@.ö²€§3}`,Éòù¾óétC` +hUnJõŽªÀ€U(p&À@@§g ¥¶Ùh>È_œO@C5ˆß%/4Æ͕¦SùZÁ¢œ|Mt¨«Œæ•Ç/ŒEû'€ jÔÀ:é5š¢Šç ؕû +ÚeBÐŒDY!@WTˆ(IQ{½«?<0?ˆ<>‘1’Ü‘÷kB$eÀ§•~«¯‚$ZËÞ§Hà +§†¯0†É Ìö°Ù·›‰«ou8 +Y/€¼Z,<ΞÂU0fîréOƒ÷9ȘH.Ÿ»¬Î^ž½1wYÇâ.¹¾¾m0ûÙ]äq2Ô@-~˱ŽUô¶ù"´¸?α¯¨Æñö­QäNÃÀå•HO÷ «¿5–ô೗‘ïÎf/ìêû(é{ãÕȳE!ÊQDՔˆÖ^(+DZ{|éå¡i +:*¤™+Šs?ðçþ?^)ñ}®,*€?a^ŒýÍEçÀøO'¸†ÊJpåÿÿ(Á†õmÈêC‡ÙNŸ Ìϯ£™þĔI ¤×5ÚCöG³/kH²N;eÃoÞ_•nP[Í2|m9e ¶Í;vÓhÄÏ2¤Žáã ;9¼^Øû®Õ( zÐ9Szé…Õ··e©ß)%Ï:Mï­ÖÙP¤RR\xQ¶Å7›{ݶÝ•B 逪Šß©u ¯y´˜%‹þbz×±d•H¿½»x8#žeàAÏÎþïËIN,ÌiuÐ á‹5™zo^`lô«»}NÅÆé:Yý«[Ý^ è2ÆX,x}÷iæ½ÿѪxÏD¦]‹Kf{Ñ ˜%vréҬκms`ÇÓjÛl;¿—ð'Sgf¯7æ±éwl«ß½é”âv¯sqá“[-5¼öÇ^À&«€qor\TöBÁJì ww¶‡“uñ¦ªkû´¥Ü/sP5`à} +‰£~0}u–ú#æBÚñŸ;) Eâî‚-#.4:.Ú³w£/séú›+¬Ã;ZKµà•Á檀BCWkÙ¥1 !ZÊÞyöä~ëFVÝø’V3‡ÒÊ`éñ_dB¤eZïºÁʝ¥å?AǦD\ûa6"ˆTÄ+ å+U$ªíy™³©gMés|ÉBvøâšU¤l®Rž£hq]­®×k8ZÂUà/8ô£êb1«îÉwà5ÆÔ·F&!O‰ÍCž¹ï¢qîF‚3Ü3$ôÿ?Em— +endstream +endobj +12156 0 obj << +/Type /Page +/Contents 12157 0 R +/Resources 12155 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 11884 0 R +/Annots [ 12101 0 R 12107 0 R 12108 0 R 12109 0 R 12110 0 R 12111 0 R 12112 0 R 12113 0 R 12114 0 R 12115 0 R 12116 0 R 12117 0 R 12118 0 R 12119 0 R 12120 0 R 12121 0 R 12122 0 R 12123 0 R 12124 0 R 12125 0 R 12126 0 R 12127 0 R 12128 0 R 12129 0 R 12130 0 R 12131 0 R 12132 0 R 12133 0 R 12134 0 R 12135 0 R 12136 0 R 12137 0 R 12138 0 R 12139 0 R 12140 0 R 12141 0 R 12142 0 R 12143 0 R 12144 0 R 12145 0 R 12146 0 R 12147 0 R 12148 0 R 12149 0 R 12150 0 R 12151 0 R 12152 0 R 12153 0 R 12154 0 R ] +>> endobj +12101 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.819 720.63 208.774 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +12107 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.819 696.719 208.774 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +12108 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 672.092 280.116 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.98) >> +>> endobj +12109 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 660.136 258.537 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.130) >> +>> endobj +12110 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 648.181 260.191 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.239) >> +>> endobj +12111 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 626.328 145.791 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.311) >> +>> endobj +12112 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 601.078 221.606 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.342) >> +>> endobj +12113 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [261.266 588.405 278.203 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.420) >> +>> endobj +12114 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 564.495 280.116 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.98) >> +>> endobj +12115 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 552.54 260.191 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.239) >> +>> endobj +12116 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.161 528.63 280.116 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.99) >> +>> endobj +12117 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.6 516.674 258.537 527.578] +/Subtype /Link +/A << /S /GoTo /D (page.130) >> +>> endobj +12118 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.254 504.719 260.191 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.240) >> +>> endobj +12119 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 482.866 145.791 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.312) >> +>> endobj +12120 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 457.616 221.606 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.342) >> +>> endobj +12121 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [261.266 444.943 278.203 455.847] +/Subtype /Link +/A << /S /GoTo /D (page.420) >> +>> endobj +12122 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.819 411.788 208.774 421.974] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +12123 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.819 387.877 208.774 398.064] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +12124 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.819 363.967 208.774 374.154] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +12125 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.819 340.057 208.774 350.243] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +12126 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.819 316.146 208.774 326.333] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +12127 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.819 292.236 208.774 302.423] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +12128 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.819 268.326 208.774 278.512] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +12129 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.819 244.415 208.774 254.602] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +12130 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.819 220.505 208.774 230.692] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +12131 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.819 196.595 208.774 206.781] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +12132 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.819 172.684 208.774 182.871] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +12133 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.819 148.774 208.774 158.961] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +12134 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.819 124.864 208.774 135.05] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +12135 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.819 100.953 208.774 111.14] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +12136 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 720.63 425.255 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +12137 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 696.719 425.255 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +12138 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 672.809 425.255 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +12139 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 648.899 425.255 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +12140 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 624.988 425.255 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +12141 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 601.078 425.255 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +12142 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 577.168 425.255 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +12143 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [474.669 552.54 491.606 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.425) >> +>> endobj +12144 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [496.258 528.63 513.194 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.427) >> +>> endobj +12145 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 505.437 425.255 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +12146 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 481.526 425.255 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +12147 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 457.616 425.255 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +12148 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.3 433.706 425.255 443.892] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +12149 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.59 387.877 403.527 398.064] +/Subtype /Link +/A << /S /GoTo /D (page.374) >> +>> endobj +12150 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [406.516 387.877 423.452 398.064] +/Subtype /Link +/A << /S /GoTo /D (page.375) >> +>> endobj +12151 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [459.735 363.25 476.672 374.154] +/Subtype /Link +/A << /S /GoTo /D (page.244) >> +>> endobj +12152 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [421.151 340.057 438.087 350.243] +/Subtype /Link +/A << /S /GoTo /D (page.346) >> +>> endobj +12153 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [496.248 315.429 508.203 326.333] +/Subtype /Link +/A << /S /GoTo /D (page.77) >> +>> endobj +12154 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [276.306 56.166 391.275 66.129] +/Subtype/Link/A<> +>> endobj +12158 0 obj << +/D [12156 0 R /XYZ 90 757.935 null] +>> endobj +12155 0 obj << +/Font << /F63 374 0 R /F50 339 0 R /F65 376 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +12159 0 obj +[511.1 460 421.7 408.9] +endobj +12160 0 obj +[642.5 589 600.7 607.7 725.7 445.6 511.6 660.9 401.6 1093.7 769.7 612.5 642.5 570.7 579.9 584.5 476.8 737.3] +endobj +12161 0 obj +[722.2] +endobj +12162 0 obj +[525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] +endobj +12163 0 obj +[611.1 611.1 611.1 611.1 611.1 611.1 611.1 611.1 611.1 611.1 351.8 351.8 351.8 935.2 578.7 578.7 935.2 896.3 850.9 870.4 915.7 818.5 786.1 941.7 896.3 442.6 624.1 928.7 753.7 1090.7 896.3 935.2 818.5 935.2 883.3 675.9 870.4 896.3 896.3 1220.4 896.3 896.3 740.7 351.8 611.1 351.8 611.1 351.8 351.8 611.1 675.9 546.3 675.9 546.3 384.3 611.1 675.9 351.8 384.3 643.5 351.8 1000 675.9 611.1 675.9 643.5 481.5 488 481.5 675.9 643.5 870.4 643.5] +endobj +12164 0 obj +[571 571 856.5 856.5 285.5 314 513.9 513.9 513.9 513.9 513.9 770.7 456.8 513.9 742.3 799.4 513.9 927.8 1042 799.4 285.5 285.5 513.9 856.5 513.9 856.5 799.4 285.5 399.7 399.7 513.9 799.4 285.5 342.6 285.5 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 285.5 285.5 285.5 799.4 485.3 485.3 799.4 770.7 727.9 742.3 785 699.4 670.8 806.5 770.7 371 528.1 799.2 642.3 942 770.7 799.4 699.4 799.4 756.5 571 742.3 770.7 770.7 1056.2 770.7 770.7 628.1 285.5 513.9 285.5 513.9 285.5 285.5 513.9 571 456.8 571 457.2 314 513.9 571 285.5 314 542.4 285.5 856.5 571 513.9 571 542.4 402 405.4 399.7 571 542.4] +endobj +12165 0 obj +[513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 285.5 285.5 799.4 513.9 799.4 513.9 543.7 770.7 777.7 733.6 847.5 756.3 656.2 804.8 850.1 449.3 566.3 870.4 699.4 992.9 821.6 782.1 656.2 810.6 777.6 627.8 599.6 699.1 599.4 970.5 849 596.5 699.2 399.7 399.7 399.7 1027.8 1027.8 424.4 544.5 440.4 444.9 532.5 477.8 498.8 490.1 592.2 351.7 420.1 535.1 306.7 905.5 620] +endobj +12166 0 obj +[799.4 285.5 799.4 513.9 799.4 513.9 799.4 799.4 799.4 799.4 799.4 799.4 799.4 1027.8 513.9 513.9 799.4 799.4 799.4 799.4 799.4] +endobj +12167 0 obj +[761.6 489.6 761.6] +endobj +12168 0 obj +[826.4 531.3 826.4] +endobj +12170 0 obj +[556 556 167 333 611 278 333 333 0 333 606 0 611 389 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 278 250 389 555 500 500 833 778 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 832 667 667 667 722 667 667 722 778 389 500 667 611 889 722 722 611 722 667 556 611 722 667 889 667 611 611 333 278 333 570 500 333 500 500 444 500 444 333 500 556 278 278 500 278 778 556 500 500 500 389 389 278 556 444 667 500 444 389] +endobj +12171 0 obj +[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] +endobj +12172 0 obj +[686.6] +endobj +12173 0 obj +[1083.3 458.3 1083.3 736.1 1083.3 736.1 1083.3 1083.3 1083.3 1083.3 1083.3 1083.3 1083.3 1361.1 736.1 736.1 1083.3 1083.3 1083.3 1083.3 1083.3 1083.3 1083.3 1083.3 1083.3 1083.3 1083.3 1083.3 1361.1 1361.1 1083.3 1083.3 1361.1 1361.1 736.1 736.1 1361.1 1361.1 1361.1 1083.3 1361.1 1361.1 875 875 1361.1 1361.1 1361.1 1083.3 441 1361.1 944.5 944.5 1222.2 1222.2 0 0 805.6 805.6 944.5 736.1 1013.9 1013.9 1083.3 1083.3 875 1113.5 919.3 782.1 1083.9 770.8 988.2 850.4 1194.5 819.5 958.3 1055 964.7 1567.9 1126.1 1089.2 997.7 1132 1196.1 868.1 822.4 873.8 898.9 1367.7 996.6 929.5 991.4 944.5 944.5 944.5 944.5 944.5 875] +endobj +12174 0 obj +[722.2 888.9 611.1 1000 1000 1000 1000 833.3 833.3 416.7 416.7 416.7 416.7 1111.1] +endobj +12175 0 obj +[1109.9 1007 867.4 1064 1110.4 626.7 772.9 1138.9 955.6 1284 1075.7 1047.5 875.4 1082.2 1030 856.3 832.3 943.9 827.8 1279.2 1112.9 824.3 943.1 597.2 597.2 597.2 1361.1 1361.1 597.2 774.4 633.3 649.4 739.7 677 684 700.6 827.6 533.6 588.2 758.1 480.3 1228 880.8] +endobj +12176 0 obj +[458.3 458.3 416.7 416.7 472.2 472.2 472.2 472.2 583.3 583.3 472.2 472.2 333.3 555.6 577.8 577.8 597.2 597.2 736.1 736.1 527.8 527.8 583.3 583.3 583.3 583.3 750 750 750 750 1044.4 1044.4 791.7 791.7 583.3 583.3 638.9 638.9 638.9 638.9 805.6 805.6 805.6 805.6 1277.8 1277.8 811.1 811.1 875 875 666.7 666.7 666.7 666.7 666.7 666.7 888.9 888.9 888.9 888.9 888.9 888.9 888.9 666.7 875 875 875 875 611.1 611.1 833.3 1111.1 472.2 555.6 1111.1 1511.1 1111.1 1511.1 1111.1 1511.1 1055.6 944.5 472.2 833.3 833.3 833.3 833.3 833.3 1444.5 1277.8 555.6 1111.1 1111.1 1111.1 1111.1 1111.1 944.5 1277.8 555.6 1000 1444.5 555.6 1000 1444.5 472.2 472.2 527.8 527.8 527.8 527.8 666.7 666.7] +endobj +12177 0 obj +[575 575] +endobj +12178 0 obj +[892.9 339.3 892.9 585.3 892.9 585.3 892.9 892.9 892.9 892.9 892.9 892.9 892.9 1138.9 585.3 585.3 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 1138.9 1138.9 892.9 892.9 1138.9 1138.9 585.3 585.3 1138.9 1138.9 1138.9 892.9 1138.9 1138.9 708.3 708.3 1138.9 1138.9 1138.9 892.9 329.4 1138.9 769.8 769.8 1015.9 1015.9 0 0 646.8 646.8 769.8 585.3 831.4 831.4 892.9 892.9 708.3 917.6 753.4 620.2 889.5 616.1 818.4 688.5 978.7 646.5 782.2 871.7 791.7 1342.7 935.6 905.8 809.2 935.9 981 702.2 647.8 717.8 719.9 1135.1 818.9 764.4 823.1 769.8 769.8 769.8 769.8] +endobj +12179 0 obj +[632.9 520.8 513.4 609.7 553.6 568.1 544.9 667.6 404.8 470.8 603.7 348.1 1032.4 713 584.7 600.9 542.1 528.7 531.3 415.3 681 566.7 831.5 659] +endobj +12180 0 obj +[1027.8 402.8 472.2 402.8 680.6 680.6 680.6 680.6 680.6 680.6 680.6 680.6 680.6 680.6 680.6 402.8 402.8 1027.8 1027.8 1027.8 645.8 1027.8 980.6 934.7 958.3 1004.2 900 865.3 1033.4 980.6 494.5 691.7 1015.3 830.6 1188.9 980.6 1027.8 900] +endobj +12181 0 obj +[446.4 446.4 569.5 877 323.4 384.9 323.4 569.5 569.5 569.5 569.5 569.5 569.5 569.5 569.5 569.5 569.5 569.5 323.4 323.4 323.4 877 538.7 538.7 877 843.3 798.6 815.5 860.1 767.9 737.1 883.9 843.3 412.7 583.3 874 706.4 1027.8 843.3 877 767.9 877 829.4 631 815.5 843.3 843.3 1150.8 843.3 843.3 692.5 323.4 569.5 323.4 569.5 323.4 323.4 569.5 631 507.9 631 507.9 354.2 569.5 631 323.4 354.2 600.2 323.4 938.5 631 569.5 631 600.2 446.4 452.6 446.4 631 600.2 815.5 600.2] +endobj +12182 0 obj +[833.3 777.8 694.4 666.7 750 722.2 777.8 722.2 777.8 722.2 583.3 555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8] +endobj +12183 0 obj +[592.7 662 526.8 632.9 686.9 713.8 756 719.7 539.7 689.9 950 592.7 439.2 751.4 1138.9 1138.9 1138.9 1138.9 339.3 339.3 585.3 585.3 585.3 585.3 585.3 585.3 585.3 585.3 585.3 585.3 585.3 585.3 339.3 339.3 892.9 585.3 892.9 585.3 610.1 859.1 863.2 819.4 934.1 838.7 724.5 889.4 935.6 506.3 632 959.9 783.7 1089.4 904.9 868.9 727.3 899.7 860.6 701.5 674.8 778.2 674.6 1074.4 936.9 671.5 778.4 462.3 462.3 462.3 1138.9 1138.9 478.2 619.7 502.4 510.5 594.7 542 557.1 557.3 668.8 404.2 472.7 607.3 361.3 1013.7 706.2 563.9 588.9 523.6 530.4 539.2 431.6 675.4] +endobj +12184 0 obj +[777.8 555.6 722.2 666.7 722.2 722.2 666.7 611.1 777.8 777.8 388.9 500 777.8 666.7 944.5 722.2 777.8 611.1 777.8 722.2 555.6 666.7 722.2 722.2 1000 722.2 722.2 666.7] +endobj +12185 0 obj +[500 500 167 333 556 278 333 333 0 333 675 0 556 389 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 214 250 333 420 500 500 833 778 333 333 333 500 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 422 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389 400 275 400 541 0 0 0 333 500 556 889 500 500 333 1000 500 333 944 0 0 0 0 0 0 556 556 350 500 889 333 980 389 333 667 0 0 556 0 389 500 500 500 500 275 500 333 760 276 500 675 333 760 333 400 675 300 300 333 500 523 250 333 300 310 500 750 750 750 500 611 611 611 611 611 611 889 667 611 611 611 611 333 333 333 333 722 667 722 722 722 722 722 675 722 722 722 722 722 556 611 500 500 500 500 500 500 500 667 444 444 444] +endobj +12186 0 obj +[517.7 444.4 405.9 437.5 496.5 469.4 353.9 576.2 583.3 602.6 494 437.5 570 517 571.4 437.2 540.3 595.8 625.7 651.4 622.5 466.3 591.4 828.1 517 362.8 654.2 1000 1000 1000 1000 277.8 277.8 500 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 777.8 500 777.8 500 530.9 750 758.5 714.7 827.9 738.2 643.1 786.3 831.3 439.6 554.5 849.3 680.6 970.1 803.5 762.8 642 790.6 759.3 613.2 584.4 682.8 583.3 944.4 828.5 580.6 682.6 388.9 388.9 388.9 1000 1000 416.7 528.6 429.2 432.8 520.5 465.6 489.6 477 576.2 344.5 411.8 520.6 298.4 878 600.2 484.7 503.1 446.4 451.2 468.8 361.1 572.5 484.7 715.9 571.5 490.3 465.1 322.5 384 636.5] +endobj +12187 0 obj +[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] +endobj +12188 0 obj +[556 556 167 333 667 278 333 333 0 333 570 0 667 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 278 250 333 555 500 500 1000 833 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 581 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444 394 220 394 520 0 0 0 333 500 500 1000 500 500 333 1000 556 333 1000 0 0 0 0 0 0 500 500 350 500] +endobj +12189 0 obj +[638.9 963 638.9 963 963 963 963 963 963 963 1222.2 638.9 638.9 963 963 963 963 963 963 963 963 963 963 963 963 1222.2 1222.2 963 963 1222.2 1222.2 638.9 638.9 1222.2 1222.2 1222.2 963 1222.2 1222.2 768.5 768.5 1222.2 1222.2 1222.2 963 365.7 1222.2 833.3 833.3 1092.6 1092.6 0 0 703.7 703.7 833.3 638.9 898.1 898.1 963 963 768.5 989.9 813.3 678.4 961.2 671.3 879.9 746.7 1059.3 709.3 846.3 938.8 854.5 1427.2 1005.7 973 878.4 1008.3 1061.4 762 711.3 774.4 785.2 1222.7 883.7 823.9 884 833.3 833.3 833.3 833.3 833.3 768.5 768.5 574.1 574.1 574.1 574.1 638.9 638.9 509.3 509.3 379.6 638.9 638.9 768.5 638.9 379.6 1000 924.1 1027.8 541.7 833.3 833.3 963 963 574.1 574.1 574.1] +endobj +12190 0 obj +[472.2 472.2 472.2] +endobj +12191 0 obj +[777.8 277.8 777.8 500 777.8 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8 611.1 798.5 656.8 526.5 771.4 527.8 718.7 594.9 844.5 544.5 677.8 761.9 689.7 1200.9 820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7 666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500 388.9 388.9 277.8 500 500 611.1 500 277.8 833.3 750 833.3] +endobj +12192 0 obj +[556 556 167 333 611 278 333 333 0 333 564 0 611 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 180 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541 0 0 0 333 500 444 1000 500 500 333 1000 556 333 889 0 0 0 0 0 0 444 444 350 500 1000 333 980 389 333 722 0 0 722 0 333 500 500 500 500 200 500 333 760 276 500 564 333 760 333 400 564 300 300 333 500 453 250 333 300 310 500 750 750 750 444 722 722 722 722 722 722 889 667 611 611 611 611 333 333 333 333 722 722 722 722 722 722 722 564 722 722 722 722 722 722 556 500 444 444 444 444 444 444 667 444 444 444] +endobj +12193 0 obj << +/Length1 761 +/Length2 1188 +/Length3 0 +/Length 1725 +/Filter /FlateDecode +>> +stream +xÚ­’iTS×ÇAã#ˆž<Ô0B ¡ ø€ÓBMD@mHnàÚ$7$!! QAÅ29Q\LVA| ‘± Å EEE[ ”¡PY]O¿¾uχ³÷þŸ½÷Ž¥ރ‡„ALD$Ó$`°è$" ˆD:ÆƆ!82yrd ¨Ồ …¡tќÈ4"cˆX)Ã#dÇØ´(rBHs9"ÀâÈ" !ڃË?„ C2%xÀwñ„øBRH"‡x ‰x0W pX„qXdòñàü.͋¿/É!‰…¸%ÌM…ä!"ð >Ɓ Ó ”åÿõasf”@ÀæÛ/9õQ#„Ê?ˆP%ƒ$€…ð ‰èCé.è|4ÆKÆÀ\Q¸Äw)Xʄ£!ž,ãF>G …–òˆ÷!jÜ€Ã6Oú—Û|íÿ¼Ó¥¢Éü•â¿Ú.ª—bÒß1ꎎÁDÔ^*D¿÷»Ð†mq, +›(€#‘p”ôõ ‘ˆ%Xă¢;Dˆ =PKâ‘`/”LˆZL¾‹?1YJ|ü[t:‹wDQð›Ð9$ +PɔøÿQr£$H$[z4¨;ïc>Œz AÑóð>Âu9´ïtUR‘jkAo±®6=¼:ƒ]¡¾S·"±?S[PØñU¤ÝÓòÀْÜÕØ!Ý¡OsÒ£µq;º˜c#3²ïÍÉ¿ʍ©±œÈe)_Š­f‡ÿSuwjÄI{{ßÓ΢AoŸû­e8ßçéÿJÿ±¥Vc°¼²ñÌ!Šs 3W°3ùp¹­£¥ïÊìÈ¢ròÅÊY:OzUû’ nØŒ#µQ«f ¾;>¿Wë W/5Uú¯”²FF-Üâk+ñT§¦$ÍùW¥yUE×»YW,Ô/w?³Ÿc2¢5Ó!47+×Ïj<Ÿ´—X¸vª9 ý[ZÞÜ«Ÿï\ƒ¿ªÉ9=Á»kP§@—°ªímßÊ-ÿèö˜•ve.øz—I®-ßq{³7½²kgŸž~Miû,ÈLïùËV·§n}’–8A£ +yq#<þû_ó³RèßêÏ_›Ò²(Žˆ)¼ØÉVžõêÏÏÇMRqºÖµ<ƇØÝî~Íy˜87êÆF-BÞÉaÅ4Ã1ýð­4Ç£G2À)Ky¿@Óf¶K~zÕuè‡ÁíU;rŒ±I?Ê Ç-["ƒZ‡ËáuL!_ǼÎ;y{ËRj~¦‚»Ùò?°–ñÐÚ³†éºz¦nyËÃaç~V­ƒÓҎ,¯±òÉÖ?»³@źbwžREλ >sí÷)Æ¿Ùc­{ܲ‰Ã{TH½-¿t7õ~§gד×@Ř&ÆyçŒ8»÷K{ÆÖ©ž«™Ç/'±za{VçfÍ]#…YÍXÏ·õ3:+MÖÔúí +žØHz5©$—Eî¾åJQVjwgu¹bú±?NØ^c;ö<•'„6{ΆaݦM%©¤M-D²Åe]žÓìáÎ\hxü ÌêWsío|2B²pûs˜;-Ö<_óV»sOÅyEkÌW?ÉmÒU“¾ðƍ›ÄÛílë†LÏéŠ_óCZšqúÕ!¬õå7[ӏ­2­>;ðÇõ’Ë}:š¦_Ž|c¸žœ)16és~ŸQSå˜íƒÛ]ƒå_ìù¾bm…VCÞþ<ËÿgÑü$RPLŽóOšËî7ñóžÆ +1Ìb“çЃí:±qÁÖWïłôFu7kÓè賩jâu£ ]É_삂´M|ôîi…K÷6LÝjïîU9U/ÜñŽ”n¸«ÿÉýœá¹º«ÏkÖé™ù«9»‹íO•nø¢æ"ßîhĹ䃼UWä6¦¥!7Ý6ŠD_óÓfj{7›ÉF9)Ò¤1-8ã—dUöjÚ2UɤßäUÜè1kè·úν‰ëŠùË0)bwé›ï#]¦’eU“µÅÎÈw[›¬2õ·z¾8Þnù¦9Ô#¦]3?rÀú‡«G¶—(ÄÂÞ4–³ÅÀIo©mÊÈ7ûIô2ñÜ©•.Ž—aå~ؼVj¿-`§Y›9Õ«²o;ÍU¯I_çV÷6x€ÅžŽ71»ü_œC³ +endstream +endobj +12194 0 obj << +/Type /FontDescriptor +/FontName /LDBHLR+CMBX10 +/Flags 4 +/FontBBox [-301 -250 1164 946] +/Ascent 694 +/CapHeight 686 +/Descent -194 +/ItalicAngle 0 +/StemV 114 +/XHeight 444 +/CharSet (/one/zero) +/FontFile 12193 0 R +>> endobj +12195 0 obj << +/Length1 1440 +/Length2 5130 +/Length3 0 +/Length 5893 +/Filter /FlateDecode +>> +stream +xÚ­˜e\“ï×ÀAR]£AI钆’Û`Ä`l PB:¤AiéîF’éRJºãAÿñCÿoŸÏÞì:ßsóݹ¯ë~1Mn°£%DÁŽâòŏÕå |  Ëcgˆ +æ—³@AÄ@11~€Š‹=€_Àçç%`ÿùöô¯fòp+G0 n àX8;[¸\ž«•à9ƒƒ!nˆÛ•1/Üuµp5OÔљà×æðZ:[XA®Ò®ÀïðÊõ_A{% ³þ/ü üCD¯Ëk;„þ¨ÿƅ¯Wr€ÿÙ |  œ®Iÿ ~ª?¬þ&ÿ ±ëä¯?É5±?Šýa&r\SðÚ;Zÿ:Ìp0†t²·pÿGüê9Y8Cà“ïZüºš°àupÍìz¡kKPôZüúÄDþÿŸ¯ƒ?Z ýA®õþ£Öõæb×Áµî¢WVH‡ß¯¯¿g"Êw ^•û§‘˜€×~up±GÁþg–W§}•~u琰ßwóùßÛ'+ëèöœ›_ÀÍ/vuҀ‚B‚~Ï?2­\œ¯¼Q¿_nWÿ³†Â®Ê^]ˆÁĘ£ÕCÛøšÀ|/ùÌ¡NLYëÚ(Ê÷#ïý¾DcÚçôª"8§+ O +“n‘,ã,ßw=»‹ mòÐêWø郈J½XF›/'=«¿k¸“¤î¾äÄxè·FÚXóyo]óɧéùq ¬©[kšìrº+xß0ZÑU­ÉþÂ"† +IözA¬ Úd ˆü`Á )W²¸ì©A?/Û ü:®ÉmÇ&Š“LüôØ “ýºÞÎÜæê!Fôùe)ç Ù4ž#3.nÈ£¨i×<؛>ãîTnŒ÷.?(ð¼¬p¦;BUz%!„aTkßz­Wî½¾ÁÖ·hÉç|ØÙ»sÏaAMòÇ!ÝßÞxEIá Ê⧗x³w nóµ +Tù36{[«¡†¿³B6¯’¸«8»'¦¶¬QT­lÁÖÐ^m÷€©Rø +I•¡¯è)R¢÷íuWɇ=kۄ¢rsr‹oÖå»=b2m]eÐg½Y ôEÈOá­•_jž 0Z¬îµ152¨©Ùárße¿¯)3dLS&ÇñCùÙ +V͆÷èûïø̂î¾®ÈqÞòÞÅ´À ©+R(+5ݤŽ ²ñÓüQ¬‰ÚTRb»·XÔÖ)QÉ~kj´R¦4 ŠÉNÛ ªÿ2AIÜê¬Ãph¡iù܏ÄëfÙdÂ3;«Zѳ4†ì0Å7´ŒúNã)SKE„®ûùq½N„f¤ÛÇޝ’ç³L>B[*©€vš„rÎY(ºÝ’’¶ óUÿOåYJ:dçT&A9>q ¯»à)‹6ØMm„@Ò÷UpÄi.ÁÔxC‡Ñæfÿå3żØµ7¬Ô­E°LU3bâï›3i*ÓXA67™¿ŒÖJni{ËÇ{ä#?OÉOÓ@3ëXîaR« ¾˜b½ÙMòz¸0ð^ ‘p€ Ó`¦e}3z—]P,~¼>`MM>ÉûT2×kEðSóÓ1rٟ0¼˜þÁ#Vè”úpk7Ëã,É¥”ˆ(«i‚“·ØÊ]/›«jj¿òÜî aœ*ágêWè<ˆþ,3ºÏVUm^@ê6¶«¹¾6€— +â0Ì }F|^œ Q¡‰ZÇ©õùy¶ößvÕËMÔzeՀ+¦OKzèHÔ×çÆk,͗¢¥½-MO-H¥…2u¡Äûtê:>#†n§§sœ³~KHf²PBÛùAb£ðÐðY¯ìÛÀêÒø˜ U·©X3º:7eúFÿ/øŽKQ£ˆþ>d°D—Þ ÈÑoÍJŒ }f ÅO}BøLwRVs¶½ÚÚïK1:|•LÏOŸPhŠ’oKŸ‚X¤±dV*±—|ö¦•N@yKåàI°Ui#ŸV×x“ÞŸ#ɚ‡ºS¶2†53ÁÏøð½4B«(JËØ!ˆ¶mÎiœ{²d./ [ÇÝâí,ú¦kfZ Ÿ3¨öÆIÆ!l>›e*æ õ2­ *8£m•‚ö@­™Ÿ?ĺGïæ—ÝÚå…V§=ídò}aŒðp6ˀ™Jc±à — qntD&G9iÖ³õ½6‡a…Àüº—æÃç®1ÂËÅò9-ý{’Ä0ÊÅ_½¾úA¾LúÒi©g¬öœœYƁª)Z‹˜]%åƒ3"L”÷1ì«i|3ëÃÃö/ú”z¤%š¼ƒ+¦ÞÚîã<ˆ­}‚RP)6A})0š·6#-kfvþ\YÍ£jݦénñ6ô ÔÂޝ<N "#íDä§âȝž¼_¥b;ƒ¢G +’ú§/¸Ñþ +]‘ Vf7ÿUm…'$̖Ìry)cTr §^YjT]†™ÝD*éBÎë½U~ÔK¼!ƒŸdú‘bðb“c¥_†žYÇô#©µóМȼ@ Ã ~([·ÌPҝhÛ'ØUèZVƒ.JoÉ@¬H‘ÂyЭë˜ý}LQ&¶$Ö¸˜TqÐ@ۚõÅw¥C[¹}ˆE`õùe 0YÖ*.N‘6Ú*¡_¤ó2Ÿ,2·—iž)£{<Ï ÃÂØw¶Šnvëìý¿)AÜ Ô7 rFçoƒ(´ˆC2ûH χ¾µ t¶Ñ»Ü+0{éúÞÞyÏë‡=‡¨Âö[ý÷CbZÌ\´¶HmÓ[•TFMªâ‰ù܏³*\™N&Á±D ðÁN©zVO‡‘D† ‹ +éhaBÚÏÜn¸¶>·µ²Yès!§…áÄ–$¦xÛÞüòmÿÁlÞ^¡MÍÂj°‚ösC"ì–Çit‚[f¥\·Ÿê³¹ïf¥ñîô)ñî` ¾ÀŒ"{ûrú,ŽìúÝÙì­6¾h(œÂÀ+©epÚ±Ìñ>4 +±.i×D˜Zª$UåhìĔ•µMur6¹¹˜vã£æçV0óp£ÏÙ.\âx“Š•ö áØё£BFè9k9<›Ã*eUAzޛ/fž"q%b²E{>àל‘)fâÕúÝÜÜÍp¾/U­þÞ^t§9ï¶@–é"£<Õ9‡ ò ï™Ühf™ögñuúËX\÷zJ›wÕûۑkÛgc}ahS/ååªdýׯػÎô”Ϻ^ä’Ò '"=ì0xø§cYÌÞ|ÏU§²ã þFôÄrÕÏ£º¶5 Éÿª|ˆ6i Ö2`øÊó°ÿx1ç‘o€:be;b/‰müLSšØªsV5÷“è¥áa旷s|îÝ4ÞÁscK©D}UÆ%ÃÆ b江N¹}Vt¸†ÏO912 GĘÉå3ëD˜ICDÊùie:w¦³agßƓ“¬2p“w’Ë2n“›Oîϒ&ZÄþ¾LY «Ó{h)ـ+õù.p$ ɂ5Œ\sq Iˆ0êZ¦X[ûóãáÎ8¼ò ¬npàí®ê——Jtïî²÷rÆû­Ë ¥¬YÒ¹'Š£soɲú°hûš†ƒ"ó­G3jê¡6Ðñ¼aoœ=¡yXUŵ²Ùž059)¹¡pQ2Î[o™í¶¤e˜&EÈÈ_ÕØ ì”>ɝ¥HªÁc]¼žË<-'Õ®ìRß)Q<õªÐ•>Ê|•yËär=P*Êâ7¬ ž >}Á-k;fùrqvA$¢Ïƒù6¸à‘ädÀÇî˟2h[zŸD ûyQ@8UFÖ£%#;cN–®ýygFÀí‚!ûŠˆ@1ȉÖVšNÙúré‘ÂWãÑèÚ ¦ùÆAýQ? ÌO¢wZpôD½ ¬XVwrTeyn>(À£tYÏÒV$.1Ď|¦4`SÛöT،-¼%èâK/ӅøLsHO§^þ"16š”€+Rįh«¥«6ÎÀjÖw¾­X£áZPwøOUfÈÏxráÀ¬kã ÙSOõ òì­}ˆ'a0+ âÀdŠ¨ÜÛ}3슧§˜xñ,¥ <ÛaM9°=KÏTèËÙog4R nUÔモñúO“žˆí(«¬® Ö¬ƒ*¬ÜÊsû÷ÛaÖ¶´û'ž©jÓ)Iá›P¬S" ´$0 âg|:'‡ŽäŒÊYøÏ¥•º‹öŠåT…uÚýËRºÒ.Òb³¨-ó⚼L4õ)’ÛlO?'öRèéÙ»yC’³{ „ûy†Ùkv3gÝí +gyƒTú®G»üM³"þ%^,œNLØÆåa·@ÓDr:}kä 9žhÁÏ`6™ÀKÓ3ÚíŠþ0÷ˆR•ç¸”"µ¼z/²Åñ ±©Ja2½žcÑI@˓ý‚ÃυC“Ãˆ©4‘šM£X„ƒF²•?îÆ +ryì„ ^báLâP*H|¬'Q J Éþω™ž°ÛXG_Eq̊Fͧ¿Ö½,0À]ŽïÜù4.‡z©Ü)GÿA0†áf§*}úz¾.önȄ2½>Ã¥iw• âÆÎ~Nµe~o$ŸZ[åÉúc¦È7©JΊ9£`ó¢§ëwû“_µúèi:B­žÔ½_'k_?êq›¶»ï¤ÌᎠ+¤o_i7 §ÊÇâ˜ÛÖº=6¼—ŸÆÔiò@Tÿ-–fÑ@[Ü /ÊÜ=TAò E‘»V>,ÃDCnÃzUÔî41¸è‡o_¥“ˆeËëvnz‚0ÿ®„c01ûå“öeHœ‡!#¢,;'Òs‰¤Á±7Z}3oAÈîaϦ’ŠX ëDêÛæ­ôt„Åm£tU‡H‚Ô½ÑñlJ7­*gë+âŒYdô„u“#ÚÌB­¤Š<™€ê#(”ÚyŽÝÊFá›qŸÉ~xüeÌ$b°s—ë%áë•PsŒ¢P·4Ó¾¿Î§ +/‰Iá9j»úUÄ_æ`¨êQ"N„r0uQ˜4ð•µÕíŠyM~ÔV\Ø kÎfôB Ïn$þ=ÈFvBû¶Uã훵Q–cÜb5]r^;Á¦ðµ–F!V4‹–ÜNŠïõ"áÏM5v¹z,ä¶NþÇ:±1A¦4åê 2³3­Çˆ>´$ˆ¢êÂ/È0Lá¢R_šÎôƲ (~aM\š6ï£aš%uèÇ#×-º4;%áå[ët¦¥3ŠñEx4y”€óò|õðՅCäX•Ø÷V$ßê¥×ÿf§H=³¯ÆïÑ­‘ew¯‹‹€ÁáÄ~ǎd)bœBõœÚï¢lX÷pÁ'±{wÛFü `wÇäēHÕaIoö¥eÉ ÎüÑ­°Q‰äýìÍx¹ÕՄi÷1Ý·&¯ŸQº`=»ã›Á¯*Å>dý¾¥v „%%^˜GJŒ1¿æótCŸmIj¡L.osݚñ&é¹vºÂºÉ‹Èœ‰ídJ¯/Ý+6×ùQ¡Rç}‹\÷,JY¾)N3epÇ'ÙÄËY»'Îó‚;ÖÓÅP IT}\DÄg"ÕwJ¡µÿP”–™„èS¹WC¹rRdT[ê©\˜ 5ö¸Ì ±gs‘(³cåÕÀØ ;„WêYH:t.´çpV8b{ÉÞΎI=éÑ²xÉú†ŠyÜœ»‘$ä-ÝØBé%tt’9\X­öô„š-9¾Ð©z,:RÏF›â[ՌèÒ\ל³½í+“r\î睪WLäT¶9ÿÖå<µùý¹ÊÒ +æ‡MëçÉL²peª²ÄÜf‚\ïK=:U“!éY VÑáÀ™KÕ°+_—FÊü@¿K÷ãe?Q(ç weM#7ívJåÊW¨îýKõÚQáG¹¡_ÿ·¿©O¡ÖIi¨«ÂÕ¿ƒ¸øÊæe6-Ù…|ÆÖîÅDZ{Ög„ó¥ýVø¬®ÎpŠ-ŸÕb)è§ á¬¼ŒäX¤Yˆ ŒªÔÕ2ªµ¨¬J /—Ý¤1ð`ïÝ&Ñ·Ù-Wq§K"‘O.ºôÏ1Þ`¨ùÎÅîzÿÇëm#3S}Q•ç1mƒÉX(}'2rËa5P}(Ù R‡:É\6²+jÂÌNqZ¼Q<¼ë«ÃÆy0Kv>ûA¡_-Æ(õÒ3èü(3CÁô³ ¥[tQ*B îËzµþÚ¯EÆmžÄB[tàÐ/%zg|Œ%ü—qR5X7f¨º~L7êDÑ9š„12û®Ir¿f(©B’8W€G`7úéJgtm披o¸Ý‰ÆíêµäÌhÏOG ÷9/YóoDðõ¯ Ìûñ¤¿Õs6¡o˖øIy[¡¯牢ð`tP•ør¦'/ԉb*!ÚÓB‘Ë~· +£~&Ý8åH†L¬L×¾ˆ75.øXû#—æä +endstream +endobj +12196 0 obj << +/Type /FontDescriptor +/FontName /XBGHAK+CMEX10 +/Flags 4 +/FontBBox [-24 -2960 1454 772] +/Ascent 40 +/CapHeight 0 +/Descent -600 +/ItalicAngle 0 +/StemV 47 +/XHeight 431 +/CharSet (/braceex/braceleftBig/braceleftBigg/braceleftbig/braceleftbt/braceleftmid/bracelefttp/bracerightBig/bracerightBigg/bracerightbig/bracerightbt/bracerightmid/bracerighttp/logicalanddisplay/parenleftBig/parenleftbig/parenleftbt/parenleftex/parenlefttp/parenrightBig/parenrightbig/parenrightbt/parenrightex/parenrighttp/summationdisplay/summationtext/unionmultidisplay/vextendsingle) +/FontFile 12195 0 R +>> endobj +12197 0 obj << +/Length1 1501 +/Length2 10189 +/Length3 0 +/Length 11074 +/Filter /FlateDecode +>> +stream +xÚ­—eTœÍÒ®qwwww'hpwœÁ Ü5x ¸wwA‚»܂kÐû÷÷íäìó÷¬ùó\]ÕUwUwõZCC¡¢Î"náh’v»±°³² $åØÙoßllH44’. S7Gð;S7€ŸŸ ïnàà°ñ +ps +pó"Ñ$¼\l¬¬Ýô’ ÿ8ñÄ@.6æ¦`€¢©›5Èá-†¹©=@ÝÑÜäæÅ +··¨ý³Ã r¹x€,X‘ØÙ6æn3•  ø&9°¥#€÷ßËîNÿkò¹¸¾‰ÐÿK&àM¤…#ØÞ `²D*9¾e½iùÿ!뿃K»ÛÛ+™:üþ_úì¦6ö^ÿãáèàäîr(:Z€\Àÿíª ú·8E…»Ã[åÜLímÌÅÁVö ;+׿×m\¥m/7›ßÿåhîîâ»ýëa|ýÿeK›·×ò™#-Í;š †Ø¦5…•úKL–Á2¸’d”„Œv…6d²¯ bͺ4Oh€È.1C1mmÊ1ROÞW-,¹6‰ûú¨C1Qqò>«ÃŸ™A å|ïCwø¹¿D¾ãÔÌt¶Lu³áÑ[­pÈΛOxSº0ÿ|åo÷qìçrºÕn*’aN»B +Hë`#áÇÃ/ÇÇ¥¢!|ƒÏ7Ø/K„}kÓv«¨üÑ9ŠÐsÂOˆl ž–›cHì™väK:Ùüòê$<³Z¹"aŠ ‘Ö–÷Š§ÛS üÛ(ÓrA~©²Úrš·ÄeyXæ¥ÄöÂ2E„ š>½npoøNj–]Í$‡p2»Ss +šÉïgšKêX˜kÃÇÇõ»×hÂî3s +‚*(m&¾LQz¦c†Q6BؙˆA +]Së¤}7qQÙud±èï㢛¾­÷Šþ¹œù¯TKH‡¿Òr™õ˜êZ?HyBðëöƒ…6óϏú»£39Œ¤%õ×M:4˜†*{ +ÞaW„öHKP· 8.nKàSˆ`“âbˆìh¬ã–z§=~Ywúbq?ü&-àù2ý$¸;‘ª9Ø|RÂCê»LlÇúKƒÑ‡ïºë}…‰×$_Eýà0]š…†/‹jš]yéûÒ0¯ ~Ĕ2þšsvè\ßÎkñ–Ë—@5ýû7Œ ßiŒG*.Ü0TóMX]tE;ºûÀ.àªß>ÊÆ܂V/Ó"%j…E>ñÏ.¸H#‘7·ù ¤¼Sý_Cneܑ1¥ZFõ—ÀûekÃ?mø·ƒ; 1Ý©„u*iEº «ûüåýá'sj‚5oÜvÙjÜØ%/¿:»²˜-¢s×æL>Ÿ†|ĞCäÿü]æG 靲û*Tû2eՑh{»˜?Ò¨ZçwTÈüdøQå¤ãèÛÙ@‘̯:sÊ|‰QCt9­9¨Äs °ÊSuñÊ$b"ÕͯÙrÎØzŒ…*LNïȸ¥LGY~±a÷w÷Gç?Ž1å±{\'á,a¾2åVrxCåoí=/±hcSæ­Âþê‹1¹4)°eڝQöÀdõ¢.[Ԗ ­Ë1N)Ptˆ·éŠ%–Ë燐BC¦ª,9F°éɀU©{ÛÝøí¾*â¥75ä´¡¾Ì*‰N*ùjƒö7æÞþñµ’OÛ²“ “V kÌ P¯#ÇJdf‡’=k¿iå\WúîD¯–ªß) HbpߜG…z&ØaD5y9¨#oFõr¯#ûÊ$–3c°<¶=7MÍ¿/“cHšÐÌ[r<ó¾žIÛì #°צ¢ðªõYÝYŸzš~I´%LÿX-îôLÑ.綔®j9þƒfb½ó«-[À°{ÐË£Ä`Ú°/šµ€~³æÂܓâºõÄÌèâʅKhsxùö§¯®¹Gö4‘>9Ñ÷ú=8¾®ÈҎþr| -:gà ³w+_²™_³}4¶säVä`í/Õ^@T—é²JùfǧŸ˜,ÑaB· RË¥˜´”êÞ}ta°²;N¦öä’,ÙªV‚—¦¤E^ÃÚԅ¾ÊõÈ•PÒ +χÆT¸ }NWD•qÈޛœx¸—ŸxÿúëŒêÆÜw[c¸ÎþÀ¦È&}w+õtØ1¯E÷õ7°Ûð#ùúâ¼3Y¦û~{ߌ šÉxñå®f°¥JìwëtËîÔ§kmҌø`¢))ïgQÒÚËå_R2N^RQðâ꺻¿=˜^¹’ý@îÔáêùaQüž¬Byl…Eµê®‘ó›Ý¼V ô"ސÒÑðÆ)äç^¹¼…s•~ï:˜ñd0÷¾¸IÐ٩، xRÉëÑ«L$¾¶µ9GŒùž³´:Öþ…Ù4ž<ªá /jÉb¼¥ÒM:évuÐôÈ#¨Æ}–W» á‚´™P©z:L–««I..4QŽYºJìݤŠ²¼ø.¡9¸I.£l+¡Â=3S”QÎ}àÃOd.UõÝÎÉ=¾åei¶A÷Ïì+,_#ê”bWô8¸Ûf¿^ôCsÛ¿J}sc³ðØ ­@´/!3õÚ+L Ænò!¥ºöõLŸÙ;˜Æ'}d-…*LÄô$ú’ñN„áÖ%û›µq'pؐ¶Z1<·‡ûFv >f«žm¢êÀQÊøÜTË¹ÊJSä¥ÖXž:/ŠÞOÍMp̂Ž2£-¤É“¸×Ɓv/z¯WYo'šKŠœÕ]Ùࠍû¾¾Pß%,ŒsuÍGP wá%qøcÌ{+Á²þÚ +`¬v¾ ‹@2[^èÄJ1Rx¬bՉ®™+ú¦çÞûXÅÁӊÝ|#éîÂÅýá>Áùäîj«¥=ÄAÁ‹yXŸy_M©Gžs,¾ô¿ïÎÍ@fB(‘!:AîeЙ¾Ú™ì;À×ÚÑ)eÈ#¼ÿêÕ®Ý܏P킑q¿=l¢Rojv…ð*Õ!јnù¼ÁÂý “ùÜ}%]G(ÊÝT«‰ó[Ï漃¹ßõ#!q9†³Mã=p¦ý龍!)óóëï0+hª +flrG0ôQpîaŽå•[;5´§W}AUΘ‰†çñéQ’{–ZÜÁ˜øžI4)cðJ.,µ©›Zl2åք¹ÓÇa1>¢o܋MõYŸÔ ~° -Ê,^GZÂ/ÐI©%ìmPœÞ)Ì=P·‰:¦Ô“ v]ï7ð‹¶BæØ37‰ +‡õ›èZÑÏyR6<•Ãeåö&ÔÍg;à%÷ÔÞìÞ^Jlýv9ª–ÔÞõàõFØP9¢ÿ©îUë̹Ð?Ó-³D_[è"!XТQ`‚µg„æÙ¸/Ȇ"MüÇ;r2»ÍA”:fˆxÊÄÿ!-=ë„Eªö·qæ…ÒùXYŸÜô.§ +‹ª-·núd}ËK‚6ùšÖÿì«QžIH’•{ ̝ÄrÚ`(zô=Zá)­(ÃL Oåc·v°oeùÂâ"cÀÅ ªq<‚ø³²V=‡ /§s—7é;ü:r’èÏådüeÞëÅf2¹§‰€îG¢÷(:ċ3 „žÎ¶[a\xhzfÍ&áwktË£à¥Àò(CUƒª³âÀP¥pûìiã‘Lí–Á4ëäÎ‚ºZ‰ÓB ȼ‡ݨxŒ2ÐÃÌÆž«ÙéۜâÜm5Ã×8F•«1ó8„´#C*úk?Úw›¿ê¾+5WzZhGI‡„C :ÅA³ $/FD{TêÉ+:0àғ=¼Và‘fMAå¸h÷갉&FÏ.A½‹#!CcÝH¬> n›ežð8šœƒ~¿& ½ápÌoµ0õœ7*`à +v^·^*~x<¶i&úY‚ãŽGóԋ 泂ªÂÅ"‡2ÎS<}Ôw¢y1ü9‹Ñ´ƒÍ* +ŠqLÆÁPs¸<™Í'Ý>² ¥M©¿oUÆx ¯»È#ûÙ̎"æá—kM`¥7^ãc©V­Œs†ڍ½è¬X6œökJô;DÜáE ò˜¾ù W-ÑüƒPØɆ¸Z,íjՄ2À¨È@~Ä£Ýv؈4̞*Á1#C3›w½sÅ9?ŠË]4óÕV™ •‡ÈEۗÅs¶§×‘‡a³)†+ÝÄá²@ÇŸñü`Gò©ÌŽ¡†wXɃàá,¹UÊ(;ë\xÁc´Ù羆ŠæðÙ÷y@—ñר^l›ÒG +¡©ô¬ƒê[ŠOÇåC–Y¢Ç +ÊU¡VԜëÊ(x÷¦ÖÖqn(û5–&’lWÆçY=ô¬íßî=ªÃ3F9'ÀLw3®Ï2ÞH3È׳lâWµÃv}í›ôÇýCñ¯éÊj˜pu+ʒøºvÁ‹¦<¥œÌë$ö”ƒ ÐÏLТX û3b—.£íÚKvbé^|Õw@ª­—îŽ'L4{ÿ\5̜ƲtLg¹{¬¶›Þù|›u«’×VÔúò‚o´YÚ5=ì萒ðXÇÙ:ŽŠzl15!Ó'AEœ<­â„ñ«¨NQ]öÑ­ó[òâîQš‰*11½¯}^zßÓññ=âø oÜÞø‘¨ó€3?E¼ÓӯфdiÒ[꺱ŽÏBx/G¬Yã9ìpyE÷ÒÑÎiáƒÏEïT0RäÁ.ý¢_²æìkJÌôqPüO+¯¦¾ËϾ x͛ÊCÇT´ÒaPw̯Odpˆ r„ŠÅ¤®»fQåà|ØàŠ•aQzo‰7JlFí…Úµo¬ÄŠ§¼UEDÎë-9r‘Œeº-¹ÀxG¬s‹ò…‚ÒkNgo>hØ9CëªÁòQŸšŠ—9.Ÿr>½.ÞcÌ,Pü"êø0ŽÊC# +|î§Ä­{+¯³BÖ&ûNåìðÎiz• q’\ŽÕeØQ9ø<#5 +&Á Øޛ³ù4Æ<>Àc‚d!Fî]p©~Ž—l: aË`äz/ʊȈÿdëK˜¤ãêéaqÿÉóApg½ŽÎ¤!BÆÕA+Y£•XÁs¬Çóuþ˜9B¤uò'‘1Á J$ûE˜6ÞÕ7~ìeCËÙöG'Îâ6Ûx!Z†”& w.] “c…g2Am¦½Sžum%6¡YòCœÁÛW±×]€Yóϙ¹ÂfŸ›Yj;<ê&3‹÷°q(_–ŠÞQ®n(ō¿…5Á@×V¸yTr¸bú*ZOjæðê;£m¾›ýÖ B$­»‚¡}‰;ß'tŸï÷Ÿ:úešy¢«¥0¶YÇ^»0­9û’¥×ý¤_»¨¬+?$ö­’Ôàh$ç½DçøáøœÉÆÏ;ՆuÕP¸ +-s[-þö_K2öæ5ÝžQ/a?´l[=Ò· Ï«‚ÔÁFeûÅÒpîEŲ%Õ­/yk—ùCÄ̉“Æ[K~°ÞÖ0g=Ú×âˆrm7çÊяmÀ<&÷pFVÓ\À?>=h¾nƑ§|1ìÕá4Š˜.Ï +¼íSÚ_³"­((’kn§–ñ=…) [©¶õ¿r AK×v< ÇÛ8ÊÜ"%Q÷ˆ<4$6 xŸ¨Lã‘$ÿ´y-ésí^°„¸c}˜´‚šÂ¢Q­yØð9À‰Ë”ä:ô”c‰ „®ÈÃ\¥iG-늟OÎUcª††º<%ÓÆRس Ŕ:°²JM }†erâ©<ÑÊ¢ˆAÆ~m²Y9ïÒ1OBÓbS‡ùŽã¥Jðm×MÔwN¤^Qøèԁ²hè‘7NɚµÃ °7´{B¨òèu¨ð‡fÚÌ%ÚewUþ­ö-²â-6ŒwîIkÂ;‰ÃfÁóÍõÔ8Qن#]«Ý’¶½p£«dâ5,íK%§Õy7$óÊËeío¼yï©Añ ÛI#rQ‰ ‚Yx×MªG”óð79&’H÷N¥û,¤«‡È99/"ç™àÓËiLÛÊBÓ®(ª*•Øyâ5K„ê^$xn%v> P[´•l~ù4«uGꐲrœ0xpƒo‘µC±U6“mk †šÖõW¶^m,§« +¸FþD sƁÅ掍éâÛæȜ‰X0Ó~þqú@éëˆ bQÓ8ݺº%Ë9¡ôzyT‘ÄÏáK¥\Æ-â]ӍBTÍ<¬gS¤cå¾[¦†ÓÕúš¾¨0‹Çê o¥ö[Bùº}Á]ýAO¹w¸=–Ñ£Šm&³¡Ýj}eaú^™OÒVz¹ÒP/‰of¯žw¶7h×90Ú^Y8×X7²p&NÈ Z”€Î®»Oýö·’1Eí ý¢=Y&„©ŒÅ]×b·ãÔ ‘½‡8zO™†<2UØá–l bµHF46«%& \[Ä˂+¯b=b%ԋƒÊ,„vèÞ©òhýð“?¼w¸ñ,39”‚ô1zŸÂl¬óäÊϒƒ°]¸>€“P—C+EÊ ‡roÏlÛ{—¢t®ë“íE»ä1µ˜ ˜Œ‡³þ‘j‰¡«Ru [W'nkm[²n†R1ž¢Ré¥+ñÔõå%)C@–À§ G,ŹjNAî,yõciuI ;I®zÆíB¦ùNWô³ù×°¼Dº_,=ÜnÖ¦O HᏖ?5!ÛóW\¡³ìŸÄ§´÷•®‰—ºº0$Ž7úÅI¾$·\X_ñJüVxi€7I-tðÒð\ØW…_„– ò%äÙ0à FXU·—ԏ)××~½|Q?AÏ}ƒ¢Rš¼ßýdOˆAe¬l4œ H}þRõ û™‹ý.’Ùºß=Ö«j†[»ƒE¬(〈?±Ç- ¿ gÉDL̛ØÎÐôYk¿Í®‘êƒ2 ª–tÓé~4ÁFӀÞatHÃOŒVÅ$¯ßžÔêú™õÏ>⋕¥ú5tï¶C²AóEc~h¶‹ŸÏÂF<­Gš2[ô˜ÚR\e’0bØÎNò—+BÏ­AÊ-»?½ß9ÄdðO_âUÙ_,"q6ÀlHU°‰‰–s­‘rÍ_Oú¬(ö~¨ Ò΀MûŽ0¦üU•8\«‚©Œêdæ»Wæ_ºFPEêï|k7Š˜*ïŒÂRL‡^Ôª +K©@|/0±bŸó¨éŒ$bqcD f$”ço]èì½±31/öÉâ3ìì£x¬Çõ¶‰[ èVr@ãEñ¤t–€ƒªnÑäGÏù^vq€ CMYC+¬P»‡gõ«C\Ðû+S~Þðv•Dw/ÊzôN–¢­»! _ˆñoBÜøß:Ítæl TgªôÛêQ±üYM sNizŽýv&‘NØŒÕh8l agäiÖåìª"ëYå­p«w˜E\SyOqÜ%–óõpÎU©J*ºç:”í=Ài\ðV?ÿ҈ӵ…”EÉo^F+Øízü¨¢ÃÔâhkdQü®B¼³ ‘O޼Ъ—Ü;5¨ñ^~uì.(ýÇ#DŽ­ÃO–÷}‚æäÔ0'!œÆ$>â(ËÅù”ˆWSÛç¡“ÝW«×;Ÿáî”gø,°dIm‚D4³Ξ±=?°G*ÿʺœ®ÎÁÛ|CÆ-Ž³`¨Úùþ!ÞE’ |icNA®MY_›ã|úFaVŒÍ9؜n¯uOb±ßM֎@‹Ï`=Åú (/ÂHéÓ N(ä9q#â5ù`5ɪ[¤VÆ¡ëV»Â‰©Ýødã>eÇ W,ú,´ë¤*‚èCn]®¨V„“†Î­C„*²BOޚÖúÎ"Ïþ}»÷åJôˆ(ÍÙr¢'Ӄqs<8\Pµ¹"Æ)tæ˜IZ©l¿6µ¬^"¨¾jô@\›~—ÐðYZ#þ«Ô §-¼*ª%îBp͸Î7v'Á࣡¹8Y;£šŸÐlmkÙ¡uúÖÒ»B …èˆøo´çóÐâ¥RYü$ˆÑÙuþ"we“É$Fá¢YSÈŸãûÑs&ý¼]ù‹¿H­Þ—óãam]GP~ðàÖù¢³‚þ“oŠ ÄL]XÅ÷-õµÙ†p^ü܏ÔýŠ÷ûeÞþ9Ÿn]7T'Òl°º\Vz‘3#5œ~uòÆv› ˆ‡-Ü ±Žº+Ô“*ß7‚MV‘Ä´Fñ«ÕÒÕ N?t/âjøNzP`,iŒ¡<‹ó8M{ÖÀ;;sƒé˜?é ¥ïâ—Ï`p_LJŒK‡åy*²Ó·ì|(n‚N! »A‰I ˆ‘Òê'ÍZ>ÓfaœxǝŒUSÈ-üŸ`ZÌ[¼ÜÀìÀ”æŠ ,Î½Y^©æKÔÅǧ„‡Y.‚ìv}uc¼ÔáÓw‘˜ö˜«¶!)ãŸ"z¶74æØÈí' y*Æ•¨ã5ŸºQ}HâxÌ -»³F¶T ¾Qs«aíøˆ ±½H®¬xJQo[،Ì–K¸oˆ%Ë6„VpÈøDá$f1β›Ãèé\Ý x¿Úþ ú™tj¾œÚÄ{ƒGjÉMö,ØISXŒm|ßQ`b6ãœdåáó”SI½­X׏²?×KÃY›5XÙä&2F=øèåÌ_\&Ûè²bK“F)ßö yeäŒò·½žgÖù©¼¶Ô–èK”‹ó\^ÊÚLoy®Å©k¹‡íë»5`ÇxA +’ðR­ºw½ßчE„×÷šÞ!o0 âšäzÑ1šÊ5ZØÆ 9¢šw o§Ò⡽j[àס–y-¥ò•èQ†FJÚö«¦ÇŎ­PyÚÆ +ã‚2-$´ÕTËPv—Õ„‡Kö)êÞ°˜w??ËÕpý’@æ؏ª¬óOy¯Y=×%æ<½dÒÏ3"¡)÷2*±7é}Zç0Š`’N5ˆÔWEéBõ9ï·ìÁXŸÔ˜ÏiÉDæ'ŸnîzOÈê#êhΝף{[í;ñ¸tXÚqLíZ«k¬ IÄWòžhl•M­TÃJ¶ÛҐŠî²L.$‰fÓ0;0F øGU£h¥’âZǃ|ÅÉ;™õá2LuNƒ*+›1B—Ü +¡ÀŽè!Òm1Q÷>WÀZJúԈ=“C¢ä•<Éä &rÜ;²>ڋýø^w”ç#d7ãüÄ©ÛĀƒ ø:lJú}¿Ôm¼¥Èaa”@~WçÐ/Ø;˜÷:üí^É@6Œ&û‡ltÄT\[ïå ·Á¶¾¦Ã(“»e}ökJ$6o‘Á$DÂ!xºÓ Xû35Œ±ó®I[D4¬œœMÚø!“£¥ï³ +ûkºŸd잾–Xœ!Ž¯óÊÓt”pL›GڱǭÞ81%1vø½i# *…|~šU$…ö¼¾m%ÙsÔº@õ%n½ÂÏ;’uƒýTÍ*âÜMm)§G +̟YùÚ¿´tÔ!±áš³:}ÞoÁâÖ¸oôhŠH{]`u4( +RKP|€}›Ò< 3ÉH¼#pì¶(›çº¹»$hïeô˶Ò=ٖê'shΣI¿p G'` »µÏ2Ô7ù³O©áΜè4”Áù |å:‘Ö‡T/èX5À€/÷]L®û ‹VUNµ»4g‘"Þ~R¢š׊¤è´¤‡¥K\_ “ýׇ*žY^bfš'ғñˆiW%†~¾b¨û0ˆ76+\¸f´?ÀUY©ÐƲ ê­`~øý…¹3R˻ӵÈpîP¨ØtðɌЮzí@/ª·j;t^3î3m-'´_t )\l*ôsp9Õaø††¤4 Â…Ö4R3 ÒvZg0[}1ÐWzq'92Lb)¶™ ªzš˜o!­!·ïi@>ÍéúJ^RFÑþÆ>SìØQ-Q¡4ÚòR@= ’U¶<Èÿr}X?9Ûßw/'úꞞò‰Zó÷ºÜà®Äæ¡ÇÚ9gS& Ýö—¼FȊ!×b=(=ã â +wÕś‹îOCóÓ®N5Üìfïöp9K–åt+1ê2)2õ·èrkêªàógÁ‘REÙõüÇ¢. \¸Ÿ©__ª%v¥èÊ]Εeä*î0e:MÅÙ ø/ˆ9M⹐`Έv‚ѨkZ¹`{_ ,t"¸›D\¡ âOùö•a+Z°3¶t7iî4èŠ;êD\‚%:°†kQÆÀR.^?¤j±öš<­¯Ç>WC˜Úˆp·åÄÎ֋ê„?%†õ}@ïÀ!¦"NãÓ¯\¸÷ +ÅõTlº•–’"¯*0»…r‚Wi+“ŸêvÞ ”õ©†ŸþNQ]K²K¯™Ò.ådmS™ï/XHv=ŠæÀ_Døκ¡WKÌ¥C@í}Y™Ñý5!G;úШ¦ÆysÐ7V¶4ž*{À«yö»¼=j²BÚó«(¬:Ÿµ¤ÿFw/„äöb–g6äþÔ55k >ºÒW˜tл(‰A§,䖢æïoy /i¬®ë×úS“u–ƒ:cy¿¿ÅpAA·Ùª9ˆÂì»·L¡g}PVž¤¶jhôέ¦ðæ°bÌ$€¾Wb[Fã~|¿kɌU—UOTàMKiïKoôxh'ÆNù ÃC—WwTu“ol±;Ìl±£ô´ªîðy•âKŠ«gíS¤¹3Èm웼©Á®éø3Հ=¥¹žƒˆ›Í%ߑ‡Õe­,Ç#V9\½Àl0rM|òs1&Խϫ™þ@ äz|ñ~ŽN ¯ªè/Îz»I‘·u 0*5ƒ»ü«z ûæpÓå1ãÃýöW­šò $?ó"†ß ½¤ãýR3õØ0èµðsßè1Z£¹QuÒó-†Eýý%ˆïP’xÃ] ar…Њ¡=Ö~8™t(õÝ\R’Ę'<,m¶òîc£^MwÑ$€h N*ÂÊÙm̐–½ó»³øVbÑp¹.*Zn§þ¬ò]Õ^9SPú=Åá‡æ6|»£œa¾ÅÏÈD@Sí ùÏïa'¿?ƍ¢aįUËWo +{Æy€R_•‘q£™¶âŋǁˆCÄLc\dp;·Ȑø|£e§<ãÞé_ÁT|$ß" MtÂú‰îé[h&TAÖÔ²•øŒ›¿p|¿ ݧJVrwQ2f`i!%BIÛîąÙxþ‚ +¹|¿½b¼·áå¡@íÄCKL'ív%Vð«íŒ' ‘RöbÔ£©êj¥5NÒÂ/ݙCü"Þ}Îx]C0ÈwÚ,FÞ<°ë_<»ñà"­ Ø SbL£@ß3Ñçþ-öÀ“2+Ö뀅áTp’ôÊxFÖO1Êþ%°R³¶X„L~e쑛I "a<ålŒb*|ð¢èR z.X£À>çGtæiÔ Iÿûn +u‰‹¥né7u^VŽáК²õÎHž ŗr(rù2 +63 +èÿE²É|L¨V35AwY=ø¸ë&2ÏH+D´hHhë]%nÓÏõ6x?ƒœ¡/’‹•!eÑ_Á©yaÞcB¦`Š-(&çúÆ0Ê}#†ZYü{K)µ€xÍø. %Ü¡¾¾[ðh6R“-|zÄeù†¹J["W˜D&΂jŒ[Õ7üÊ4gù©—R +$îm¯Ò½<ÿS¢¤I«…bLº(_Ì2ʐj…ÑýdŽå*ۀÔ^¹2ȆHv/¬ ڗÉ+c!òìOÔzÖí­Šèëß4Éël¾º_”åŠå&ÎâbT$ÝÚº¥l×!HMu—ˆ:j­î Ž'Mss)«Á|Õläüwü~ú”_/QûUä!Eå]°‹jd´d®)PP¢±œŠX]'©3‰DÏz‚4òJŸù´ÔHæÎ4¦¬ÑN¨Ñ +\F]½žC‘¦³s°/ëI.NOY ¥®S!w YM¡é$Í„-t*ÌÑ´¡<(~ý’Æ{jr1V^«¼ h¯hütî}×SõÐæ‡"ɇüÁ9àõ#…1’g±It¢£Õž#ؽ™Ò»x[ŒµHœ6÷)5 ·iÌÁèRŒt㗕4`†ÿó@ƒöó©”÷=tq3lÔ¾ù eÀ’O¿­À¡ÝãŒMO%­©Âø¸ÚØ40 v"Õ4Bú‡êС>lO›£ß¼IL3A£æùë–^ › ji¢4¼¿p›föœa§Fè×ò@—ÉÝò™hëîƒÐa‡­“µšr±€,ó¶43±çñq­½t# ó¯CL9ç¹Ý|µßa¥1-H‚1çÑoVÅ©;ÙvUØyî~+l+FâX±ÛI;óæՌ,@ÜÇ0¬æ9LìIV*„?À­+]uÝ Æ! 'ºUÓDú¿Ëè²Îˆ;˂_ß!T(JߗõEiÜ{ 2µök^a¿õMì]E18É]–<¬x±{àš“Å É JÉVóÞÿ–f)¿—bÂm¦T„ÿêýÓÚh +endstream +endobj +12198 0 obj << +/Type /FontDescriptor +/FontName /PCFYFO+CMMI10 +/Flags 4 +/FontBBox [-32 -250 1048 750] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 72 +/XHeight 431 +/CharSet (/A/B/C/D/G/I/J/L/P/Q/R/S/a/b/c/comma/d/e/f/g/gamma/greater/i/j/k/lambda/less/lscript/m/mu/n/p/period/phi/q/r/rho/s/slash/triangleleft/triangleright/u/v/w/weierstrass/x/y/z) +/FontFile 12197 0 R +>> endobj +12199 0 obj << +/Length1 771 +/Length2 1151 +/Length3 0 +/Length 1696 +/Filter /FlateDecode +>> +stream +xÚ­RkTSÇÅë2ȳ"¤òõ¦U*ä!%H1€¤T‚hxHE.!gŽ&ç`0@”]( +ÈC ¹PA[ +"ˆ*ˆ¢UQ¡‘X¬b±Fñ”{ÀººJÿÞ5æÛ{Ï÷íÙ3”…a|7‚Çà S¸ÑÝélÀãÓ€ØÓh$ +%@ +Ç +Ètoo/ðU’0X€ö9›Éb3™$ +ÀU2Tœ K–NŠX€#…2T(ÀO H€R¢‡P |\ˆB…Êp$°vò„¬…r(K†ˆ;‰N*T€x(F1uÒS0&Âë=Œ$%~ ’¡LN˜K¦l.„IÇ$*€@‰ŠÓ áåÿakzó $‰$T l?•Ô?x•¨þTàÒÄ$”Ž@6]ߛãAM’Ngƒ *ä`b ntOwšç{•¡Jˆ„¡ +a $r8…C ™î„ÈoÊõk.7t͗Ÿýù´Sd˜ÅáªDh©§jú_5’ U‚õ4wN‰õa·aÚ°•˜GPL L/ É*hÅ`2A* •* ÇTw WG‘Lá2Òä»z1U<ùՈ°â=FT ”˧€^ÍßW¦ºyЀƒIŒ¢1¼‹IKû›P˜$“AL1õ}ˆ€>Ô"”ÈB%’ô]¸ÐgûÆüºé+KoTÎZ*w,üvûÕFmm¡ûà/>¶·eõ×áós­ÍFô¸õÁáUßQó>¹Ž£¾”ʧj¶¹d1oiIöˆp0&vF{q[‹•ôHæc½K_býg#w¿ìMnœU2@g%ï6«èî7¦oÒ\»¯7/@?:HÚP|6$Fö÷fw¼â⥸¾¬Ý>¦èåGèÉ-÷:7, +½÷ófv{¶ž[•7²¤¢UÐc(¸¨~¹6Ìԉ<à…ՍÛù²­çVÆÛ>¼£÷Ζk²RÏÔtCÀþ˽3´§ßÙ±,¸MÙת<`hÕ¨fêfï_ݨ/·k±[þ/çSœQ‰Íã§[ît«Ím~=aíT‘|õÄq4çéÍøYÑò„.»ÁÜõŐúÓå¥T›²f|”S{tŒš ŒÉéù&Š©©Ú¾¹£)Li¸ÝgI9úâQUP‹çõhWÇ~£nAIMY.3’Õ§˜Ÿþ/ÿÎÇώÖìüu<‡Í`—ŸQÌò,³®MŒ!Ù!)cÆGìŒ ½˜/<Ôw˜ª*)Ø%ÉOÝ:÷È©ZàÝòÅi”¿ÙOn9óÉ¢‰Ôšf}šÇø–êóW]㪗½Úó.»µa^“‘$ö}³N“Ó§~͸G¦EÎ]m‘žzmë©60¢šÍ“g¥Fº©#Ì\¬:sÏW:xfXeúÃrñ£ËiyvúH>e_$kåŒJ7µŽ©ñú[ý=és¾Žu’JŸÎy1hÕm±Åu)x{›íŒœÑnèÑA„æ/çÏ÷³ÞíŽ3IpIñN¨ë¨Õ™òý”}±©³kíí”3ß5*®~mõó‹$è^d„ÿ¹«iEÎ'C4ÁÿƲd;¹ji}TaՎŸÎuÇÅ|™brmٍœ9Û2 Q5Ê¡û×Ùæ¯÷žiõ«Î‹<«šže¹Ž¹ˆÚïùÊÐÍeM`ÃiëùҊ‡®ô¬èQÇYþ÷¦É­å>ª¯kÓM—…žL<“‘qʄ{m݀ío鋚¨œýÓïÆäc¿uږwì2O丢ۡcN°Bû¶ÔßlQÑÐHHÎÄÝðK™}¯ÖøRȯ:tªšã­ž¾½•tؐ 9iXâ1Üô&¨Öåy–lâyÅ麥­þüdۍV~ qŽ™òÌÃýâ2îk™Éb"ۆbjïû¦d@Ÿþº|ÎÅ^ק5•+ÍŸœ½'¹Ôc/tÿ±íbùÆ»£çëƒ)³ÛbäBñ ?ëïíÉE›I»Ü¸ùÅG8•Ëês‘=} +Õ³,.˜ð ÿ©y᪪ÒCu±¦Ÿ'eê +Mëw¹Íï|p9åÓ+¡|¶É¶>C|Ê2¥ðåN!š½ïü[›þ®÷o2±Ã™ê¡q' +t•zTñ]^….°tö]°>ͯáfû…¸5©ôöNÇOVž+2êϬÝzS°wø`³sçjeqå'¹mëz¯d ÜNÓ9ì]HÕ5^÷Þ= 9®«¨2ýÞ~^ÿ†vMÆÿ§b=  +endstream +endobj +12200 0 obj << +/Type /FontDescriptor +/FontName /ZGGNQH+CMMI12 +/Flags 4 +/FontBBox [-30 -250 1026 750] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 65 +/XHeight 431 +/CharSet (/greater/less) +/FontFile 12199 0 R +>> endobj +12201 0 obj << +/Length1 789 +/Length2 1882 +/Length3 0 +/Length 2433 +/Filter /FlateDecode +>> +stream +xÚ­R{<Ó{ϵ,×Èô?4æº c8¥ ›Å:Qn³ý°Ú…ÙŠ:.唈!Ê¥B¥¥‰ÚáÈ EE)rO«Ž£‰°ÎèéÕótþ}^¿¾ïÏûýý|Þß÷ç3$úYᨬ0НÅäX¡¬QŽÀ6<ÞHH$ÛÆÉ‹éJ怎ÊÁÁÀq#$@bÑ(G”TlcEűi‘¾ÍlYdà ›F!3<™ 2¤=(d:àÇ¢Ð@Nœ5€£Óßå1€/²€Tk +PiFИIJ%Of8 °ÿZ¦r£¾Q@vŒÔ_±iHMRYLz@Ã!K: ”zùØú±¹;—N'Ë헃úMfÐèqÿ°Q\Èð,*Èfþ(Ý ~õ†©4.ãG֓C¦Ó(8f¬P¶ÖHÛ¯uZŒ;-¤iJ$N¦Ç€+uIýщ4¾ˆÝï$‹¯‹]áˆd“CŠ‹äwñ +F}Ç҈شX`/Ò‰DI…ÒïÛ)è‡YnL +‹JcFhŒ@f³Éq¤´ƒ£“ +Æ`¬Ô0šÉâH¯Ò`âp²¼U;,€p].­ éFõ¿ @оC””e®À¾×Ņ{ØÆ°Bc¤óml{ 2þt.› 29+”4´o8œ&ÍcA +d —Eqúu_žèxE‚[é“+ŠÏR£)å.ý\žÿ¹ê€MêðÉj™žAwSIe(‘p°~j3nw·p$a¿Þ±ÍÝP؜wIVpB01<8Õ|Õûù¿œ‡ŸtÒrV9(¥mH,ôz€sµ°L‹p垏Öpë‹<›=a|YU´ê +Ï8‰úßzúnó.‚$ㅦpîiòeA·QòzþÔpù"6oôáÉCYÆ<ò+m£á¤ìóïÓÀ#ρÙHVÊtîÂaQ¤æIõãÅî¸=ºþ²jõããŸÊha Þæ°"sˆ> vDƽP½¯Ç¾ªûé©ÓgM«ŠÒUsÄњsNC5{&ŽÂƒ6ÜÉÜîsCkn–üܾ·¹ÛåK[ú¢‡ˆNã‚Ôi|ú`æ`¶pÔÀY6ôIpVKÌhÓæϲ–nFâlÞ({Î3³ÞO¥Ô 2Š½ÞúNnQÞBÒoÌ\}Ty¯§M5àˆ¸t‡s2Ž9s«–g™jèfvÒÇ¿Ò¾–_*@ÖL`”á–bÃhF½¢¸ÖL×9hG›±ÚùS³^dËîÿj©–Í:µðD¶²{Ímy™'pŸúÉ o†å²zûÃ,Ë`mèëÝvëLîÛgÌ,=ž>VôÈ,ãÍTmë UæFÒ:éÉïe•ÝìŠ]·Û¢£ô|š_»N1ž5ØEÖ¨ñqiV·ò­T$v&Ò–ºCz}¾ZëÏBßäÉæøÏOaZ²g”êøBñ“ä²(L¶ßš¬kâÜv’¨Ï:² +jõß?LhðÚi"¼³Tô¢ÆL¨Ç¿kPV>Ë?A#ž1n`«c)f ÊXó&ª¤«õ0¿÷Zòž.{ŽGÌ[@ÓdËy7¹[gŽ¨‹=êý {a-%2›*xžÙ!ÿÒåw­óçØ©¾ÓÛ'™nÍÇ*ȍ©)çJJ ëïrk&&“KÇuQ7¶՝4ñW÷Ôl y¨¡êßȊv¾^ø9ߪ3Þ"Xœ ½W’™èÙsؔßnTÐ;d>÷ñ X´EZcs]›òXûÛ.Ùzÿ{dýçÐބ÷WkM®þØgUékÖggà¤Eþ‹º.ZùuƒC˜Y.úfŠj–L\R®BåOñ¼”ú‹)ÕJӞ.ò”ƒÅ¤?~JPô×­ñˇV«Û^íýQRð~=šERυJ*_Ü7ô„êÙ4$&Eº¬ÍQíÜ]TŽ-Têc<ùôðâU‰ÎaÄÉÕÉSéû¹W›ÑžG‡l½rj¡ëwµnrülÊ Xá*ë\6.é=ýÇðÍó;"ڗ詝z|$)\AE?ÉR|©)æa-}öòÞÌù3¤:÷Rm?6bÓã|ꐦ ¤(g}ªö‡JÈ/œ "ØvÓ µ¡Cíyròíðþ±[Ç}4JlGèœ×ÜïÌ×!4˜;??ýóýu¥®–j +¸‘rqf"ÃèžÇë«ûyàó0ImEZ6P’B¢+;§±ð4M™1_"š&LçÜÕ`8Î$¬"rw÷¯/¾VãbTà9Ž{dj.£0Ãþ >d‘¯“X¸÷¶9M|á걟Þáº'³kJ>춊áŒÜ9­¡Éèûy ~i­òn”ôãb-òÛueæëj° '®q¯<®þ%bð’aõ´brëc×.ÞxlhYêÅñv§sŽyCõû|7}@÷ «Ëá‘B„O¤x,Ù{"¼[¹I9 ·IjŠÇ6–ºŸ«RkÈ$4î=‚Ø"߬S˜¥›0¿äŒ›?·5\'°%‰xÍæ¹Z1nxÊWcJ¸f5?1yo;ÔÕuɪõ¥Ú™hK#ù”gÇ ±‡KDš¢7ÓÚX9¢¿ö:¶ºUçê +ê4ÌßP8ø’î%¹³5þnÕ֋^~›fÓÅÖ ÑÛeÛ>(ĦSg/*Όö:Ùì«j{=ö@ï´À-]±õÚíatФ^ùZ‡¹Ìî/Œ$è”j&4/ªUFüõ2ã+÷7FŸ‰ +endstream +endobj +12202 0 obj << +/Type /FontDescriptor +/FontName /WNXLJT+CMMI5 +/Flags 4 +/FontBBox [37 -250 1349 750] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 90 +/XHeight 431 +/CharSet (/D/d/i/n) +/FontFile 12201 0 R +>> endobj +12203 0 obj << +/Length1 805 +/Length2 2096 +/Length3 0 +/Length 2657 +/Filter /FlateDecode +>> +stream +xÚ­’y<”kÇOQû¾–GfÈ0dKvÙ²/M3Ï0ŒÍ Íا‘­}çH§…JŽ=:²d_B–^1ö%$¼£Îùœóvþ}?Ï?÷ïº~÷uŸß}ËJYÙ*êaˆ—Ac"¢ˆ€#4 35€±TV†Èʐ@G$¢( &€ÐÐPÎùã•S€²º¦ê)MUˆ,`@ô£‘pž^j;0©z¾ ‡F Å ôeÌ@£ð€-)48 ‡Ç6;Ȁ HI A M.ƒž8DéɌ€%êßË¿¿Z ‰Ì€ ß0aC$àiÄB”,‰ŒÓ@ËÿëÇáÆþx¼%Ê÷`üAPÿj£|qxڟ¢¯Ÿ?$D H"ühu¿³Y€œ¿ï]3 + +Cë<ñ  ˆ@•‘ßë8²1Ž +b¬p´€EáÉà·:HÀüHˆï‡Ò ‡ ¬¾_췞 +G ØÑü@@ùoó7ø[3""ᨀ‹2\YÁ02¾¿Vn?œeD@18‚' ¢ª H$ ¢Ì¥¢ª +!RÊV‚ˆÆ€L€%’ ·Ê¸C@ sPûS"%ðRPòý["fÂ?¤: äÿMþûÿõõ‰Ô ƳRTQe𨠀ºªrÈÿøÐþ$H |{aŒÿÒX#w¤‚hÈP?­é}¯ò—’P£¼®Ò#0²DjQäÛߣž¦jÁécZ|½¤ªN;ðø*o¯7®Œ'eÁ¼\ ƒUý Z©Üd«5ÈÛÂ)ËI³eYBÓ]Ý·f½nàö͸53$9íW¥°4,³1ðû‘Šó³õ\хÛÌ%ý»k¡>aí†Øïcd>¦@ܲªÏ'ƒöŸÆã۾̛óˆC­Â®iü{C¢ £Ý>ï9S5¢³,˜ú‹—]L*’— %ͨ‘÷÷›‚7l¬U#Tî +êhòp”^æ›ê҈'‡Åªø"ƒBßÜ}3nx8êùWÁ ®û½²qÍԄÑeäÉVƒìÖäëÞý;ŠMõº,aÂÔ¤€éÈÃ4‚—5KÅ¥BÝGc‡±}®+±~—Dý6/‚½‰ãf¿ˆ÷7 ‰O-'ÖZªy «»¯§å{:˜Œ£&” ÜaÁË"òº|۬ΫL¦T†q7“pžÑb}ßòáe¡?ö٩¹ÎÌõ€1Þ<ñ+‰Ë§X%ÿDC¨c9%֌ՙÞmÐ$fq«pÙujƒ&[ϗ÷64n‹çy}væ‘õ”ºzr~¤1àMœ®¥¶.wí×TëÎjmìNävӂܸß/‰6ýâ}‚¬,÷žûÿ‡ËËÉÎݚª +¿PÀçœú‚'‚'ÝêÑÕÂᨖ/Èhãýæl;º•m»O.EYîݬ—A§Ž4ç5×Þ¬sm±©>Pû:º¢Ûs‘ZgX[#EógøÇìvU쐽=Bè^ã›åF'§+%ÕùÖtžª‰Ë_¯L¬~«wüa£½ùŠL4ašý³4^„…gzˉlŠ|;¿ÊLS‡œә³á>¤óʲ9›:7Æ:†÷?~ÌÓW6>°úé'‹Æ£{ÑüfE8k#‡¯Àšâ%Ӑ1méñ›†zòÄNÚiÉ»Õ$(S'<v‡#¢gS[„| ™;ÜõŒíQqÒò<ï•Ë¤wàQ™“#Z’Ä :‘*îשò-Sw#C^Äa‘,5U>·>Cü OÏú9^^ÒÜÄ3ÕÊÆÒF²úŒÔ$sUæWyË{ñ—úžªü#zž‰ Zsz{x¹x?º‰œ<ƒ´‡˜b4ÙŒîÂÛž6¯ï°Þ¨W ]שe?Á÷X×¼•WÀiÔÉߣuºÍbs…Þ—¤?-ïw¸•9qh¹£l,d E0ì49§º»á¨ÃMéXâ[ŬˆP©1­‘›sQKæ{O9‘j{ÐGŒÐ$K£}²Ù“4‚×ö;·ïA'fÓâœx…¶ad3zP`Û`=û¤ã«á¡ìEñÖ³íô¡:ýq¾µ  ŠÂ|¬™ŒrYø§k(óiÈfK3œI½O/M5oX v]>1j~ê +{HÆî¬gŒ‚òÛyÜÔ©>Ö²Gõ\ú¢å.Sø.ìó‘"áS™­{ió]g™$¦9Æaz˥ڛOòa±f ÎWU›Sïg5=‚Dαt\Ò rÅ?ɬEŒƒç¸’³5nNö÷›s®\„µŒ†ð~ôp + !.6‰É0Û·d”r=Ђm¦J½ )ôñ^[9hw]fò½‘‚îü¶b6b3lÐMý!ɗ[ܤ[3ÓëəÓ3¯¥UM†‹™Ùk°¸\5nôšr˜Ž:_œüØ#ÊÃ~ñEwˆÐØ¥>¾Ê}G÷í‡Ú•èŽ­ôd½$E²@w‘8Õ¯$€ÏÃÂF¾fb÷Ók¥0Ïÿãdù +endstream +endobj +12204 0 obj << +/Type /FontDescriptor +/FontName /OMWOOP+CMMI6 +/Flags 4 +/FontBBox [11 -250 1241 750] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 85 +/XHeight 431 +/CharSet (/d/e/m/n/u) +/FontFile 12203 0 R +>> endobj +12205 0 obj << +/Length1 1006 +/Length2 4498 +/Length3 0 +/Length 5158 +/Filter /FlateDecode +>> +stream +xÚ­–y>¤¥ +‹QµtCÊP)@ÛÝ ×d%Åñ7 ‚uòvAÙÚ¹ü*?ƒ®Êh¤ ÊÚÀ,Ýìh| kKGÀkBºy‹ʎŽ€ÁÏ WÀéŠtñ@"D) P²v¬¶( ø§$-Œ ¸ö·áîôËéâŠðÿ’)àE"°Go´¡ëbñݐx-ÿ²þ]\ÝÝÑQ×ý³üÏAý—ۍrôþß,ÚÉÝ éÀ°¤ æß¡·‘kƒ!(wô¿½Zn–Ž(keŒ­#JˆB$þ¶£\ÕQ^H„>ÊÍÚ°±ttEþ²#1ˆ+Áï—°±ºš†ŠÐߋýåÓ·DaÜny;!Èïà_ ýÍø¹ ¼Sˆ(Å⯞îý«—Æ‹@al1I)ÀÒÅÅқ‚/%&) <€( é ½ð‚Á¢¬>ÀÆ°ÁºPüܪ”$Vþiú›¤ðÿ~i`Ëß$€­ÿC’? ‹FÿöãOFüPŒüŰ͈ï‹úñíÿ@|g‡ßªð…‘®®¿¥à£]­]PNnäà¡#Ÿ„ùÅ°óP _ÀÅû‡ßÐýþ÷&oÜÀz=€"b’ŸPàš$Äïÿ„Y»»¸ 1n¿^üiø‡mPø„Dz!­)&Ç°ÖrìkB +üÕr +I\9“óõ4=®J–ݘ•£qyÓ yé è1ÈUD—°u³Œ°‘œg«Qöí|`~<ê¤fÈJ1$Û±Þ03'Âet´Ð¢ÓÃW&¹—œÞíLñ~›óh")ÓYƒ^Ëfۊ .;Û÷wxØ;?I™„à]N ¸—Q¯4^‹ùð}S›ƒÌű˜¥|cø1ÉÖ23ä0M,ó$vaÜCfŽ^ìå¯lZª>7¬ø>A´£ð®¶„Ï^©[xœKoÀPZÖ¶H–=(÷¢¼~x ¥‹2>OÀéõ˜½‹)4®h¸¿j7õ(¬XUòsuŸÄzØñh—æ¯áp”È¥gMO ÃÌLϼÊ+?Ëí'½°ž‘;"#·Q‰a¯àq;Ïû±øý¤c×4€“SÌ£‚.à‘ Q52nÿ bß;ñB´TÝb‘G˚?·–ÈÕWk +Ï}4˜ÑÔÔ¤ +ºö©†÷ºöšÚ鯹Ž…†æFÆdŒNUăêàv8 F‘Ð ²ÖD'B^ÖuŸœd‚®éÒ&‹åúµ2”{{ Ó< %ú›9âq>&«&ˬw¿Ù;EYpêF«Ì«´­L?gPíû¡r5åLžÙ÷9xŽÁ—óGðÑë -òQ2¯Â;ý§0F҂ç[ëW+1n#Žß”=ÞøNQð}Bqß··¼6’tfxˆ¨K'»ƒA­Š 8eÏo}¡4NäCOd]Èwš¥…WRuÓ(.‡­i7`‰•—Ã_Çj»¾ä'„Ü’ ¹Âx7ZÓz5û*dv֞)±</šä/Ž‰ŒGž½pë›yš§N&]Ôïo¼«‰œ“cº²oU{÷ÎØݧè³; +Çù)7¢yc2«ežnx}­~•ž2”Ë2/Å¢e¤ÝˆÔ ãM:Ÿ QPÒç„bùÏæžÑY'© 4½ä ?2P çªíl§VXY•£QÒñN}–ÚÛR¸”/)Ñ`w­lGq2=$­,þi¡=Ò£ËæÛüi{X7Ä«‡‚bŸ2²z-òiÖ&p”g&RÊJ¥™Ó©2¼všS4½kSCôü«§±¯²CBxZ×Ü+èËyMùçC)…ªN†}Âhù»t™ôIœà”ïA,õ€n’Š™†‹']”¤=&$s îS30¡¯;‘ÏhDI%|€Ÿâ +­ôb¨±bäŸçXk32n¯ †ÊžtkG~ ³Hõ„©AZ’êiŧ©†ƒ¿ëæ­pèl€Æi{/BÖíeyK–3‡‹ ˆ—Îo½¹ÜCZKL.H"ø„µˆ¬‘TÃåA™U ™ójÛùõz‹„ED6 ôvî¬áïx&‚¢Á‰Tv±YlZsœ…^輊^ì$º3b¯uãD˜šBESÔ·<„­¢a½‡ÃR1aÜ*p"E…”¢ÈÍäøšµ*´èŠþ½`ys³µægv'·+º=UÂÒ.VÈÆÔ¤³¼UŠêeq“Hãj¯VmJ(~UѾ[ºòõæédpÂewª!<`%‡¯ð IØÌEÄó6¸É“p?ÖÑnn“‘*é€g¢÷¶¶–BÊkm‹tcDh³ê0"‰V¥êÄÅuU‘ËãœÏt£.Öv,ÔpDҗÁ³Ûî¿!ªÜ¾ÕG”Èz*îãÐ\-)”o•’BùYaŠCîœ4•Ûtýú¬è½Ìø䳺#>=–ôÆݙT“z|ªÇi[¬1r“¯õzõ9RR!w@H$~Q©Ý¥=þJ-Bq˜Èk{ìQû1±Ô¶¾¶ïØHÚÁ5­Ö¯–7T!z:E:;ýxzjúã5†ŒÒ(z‹¤ÁA=é’ù”>âÚ'ñ÷Ö¿Û¶Œr—žêµ‚"˜i ‰Ï‰æ7pFPqr^öM½Gçêòۘ…/ ]æ[qd?šgØÄe¾2tåKmyó]WОb·uA¶Èz¡ŽÂ\; ¤‘¡ÎõÙ­»À¦³wUù1]e#Ù<§ZEŒLùºîY*ó]M™8æf8Ƹ7û®QƁÂäîìrêwûèCEûû¹ Ö€@±9ꜰ/÷ çU¼ØsÙò=ÝÓoš“‹–jL‡r%ãª/&“RYò ×N©k±¥vëêÊð0Ž¤Ê÷"xÕ6\=D¶*ÌMï…ÌT8¼óVNPˆê×.«ô˜ÔpûR6/ái8Q œžº{µɼë$%·;jέBµf%t??Ö`81¹z;§¾z^š«~` kȪŒ‡lie¯–Q…ßàãŽûÊ:ï½òõ—õì¼=)Jגo0dKMIæ¼»ÜÔðzɨŸ[•™@}ÁÖõWÓ>¥:Hà’F–MˆVʦº •Ðs.“(“Ù +N©îÓôìöie>[e=vмíû¼FtŽÞ®Ñ¡Oæcz›`$;OwP¢ãµr¾Eù×¾—Ó`°áØ´¿ç¹“gØycMJ@)|oT7w«Q+7óؼÂ\ó#W?V[l7ϳQƒ›™—œë]P¯áWëB€ô#‡kv5oq¼ÞÕÐï5Žd­{òéÚÑæm±t›Ï“K%Y3 +ù7?¯Zš"’å«éž)Ó +›³ž¼È {ïl†~¶üöå˜Êž89˜„m¨«¼ñ‰ÇîÅ¡±ß¨1ˆº¸IÎê0_rtºn‘ØȬ~ÙüUxiüUQ‚nz@¨:'Ð>H̗3ÿ§ÄvŒUž±«1X•6ŽÀ½ï<½?>Ü"°pQs#‡º[‡Í.QûºÀ@YA·bæŽSj‘Ñ9¯Ì¨ÚÿuRFåàñ©¶ 7;1Í=—~Œ»4àé4mUÒPí°Ø€Sbg:§•/\ý±ªËÃ_3£½&7þX©§//t!KôögьËÃöÔ4Ÿ4o«h] ×·¡OÄ>é]”AÚéžxˆ¼a=½/]ì°v3W=ÌÈ &…±|;쳟k¯Òè:EÀŸ¶fÑfj„ïÜ6fkR‹ir·´Ÿ$ƒ„ZýÌv‚ba‡ÓCÚí5míz¥c±Œ=«{t¡,iªÕ¾ìéÏüÙ-…Ž‹Î-Í1Y"úŸÏæ„˧k¸§µÔ¡o%וaJpUÓk¼Ä²þÐõ°^¥V®ÓàüAù;ÍÐÇ`ØÎÙq¿ï¾¯¸è:ïM1Å%wQW§Ô°ISbÅÓ¨ñö³¶‡IY·Uë3ƒûtö7O-B¹Rض«š"¸½V]÷úš¥Ë|>Æ—÷¼/¾mç@GìÞÍ®ÅCUMTÂZ_ô–Ëà…>”ØÆ ìš¹…‡o*F2ÌÕz~ÑEË +\qbªôඊiOuò…aM_Ý· /¡çl¥Î2èÙI"3ºÙ'´£°ôl[ƒ…>W¼hö¤.®h½G=¿û”¾]¥ÿ,"þP22'¬5³ê-ê Йô¯»Y¼{ÓFOyMâz7etÁS“É H0‡Cž­Ì#svÞÙ +U‰>ç‡7Û¨´HáÑXUvg6ÖÔ{só®â\þ]’Âz—ƒAˆÃ‡JW8fRñPöìõõÉJ ©ûO4Á‰L_¯ú}¦²wI/L5yMoØêrŽ +5œZTT±…Ñ£ ~û#Ú.SۛŸ͐¨Ú×høøøV˜w$ª|.õ[Oçã.—o¼,váR½rDŒ3cù=© ‹íãÓ@a4±z,.+ŒXò"%O¡RU-–Y.¹Þ€ôM–~~áˆŒøH$¤‹SþR¥¡»»ٓóöŽ|†š0¬ßEK7/´ë! l[lÐÃT:ºû^Z˵¦¬ÚüÉÕÚG<)®Ê[\ ã¸õºíx…A‚µ…æè2öS¬MbQ¦_ZEûú,ñ̎³3¸þÂò-*^¸Ëec©çJCÑT¸’í ];Þ}#{µI5i3îÃ`§8e_·¯¼¡EH¶¸Í[>“[Ò²+„ü¸)¥ÁQ˜RͅÀ¹s„ÁTT¯¼×3¼”öa ZRj§»¦ÁäÔª¥Ûˆ=®wn¶ë«'(ú‹¦ÐŠWüéJW}º¨¸­!•DSûÔ¼Í#ÈÎᇰ—gæ‹ ¥aÏýr• +’¸²íºzW_©ñfsÞO >÷‡¯—mDzòÓͧ n‡^†*ò3v]§5âº5£§ÜÀS@7r¾LòY§ ªkIšÏ3ÑkÏ4·v‡Y‹íEBûÜ ‘ÛÓpaIöƒ¾¤Å¾L*]¶P.2ÿ‘-ßƋÑTÆzIT±W•âênܺϧӺÜÍP4r°1š³2[y­+Fì@®ÿÖ3ÆüÙ…¦rœû]`OÛÇÒD‰ù“Œ +é~¦§ÍoÉçd¤;¯gËo³›¼R½¤"ã)Ý]3 \§ÞV(§÷~;ù‰·ÝΑ›-eűmM9nãמMÈy–®E€풑»ÙmóSnlÝ)xKÌjã|%ÀT?ÛPº¹³…š1VäÎs¶‡dßYÚ,›¸nräb>-¹¦>Ø5¬åÙk¨ƒnÙÕQêèÕMeó^¶¤"ÝLøÑ* O7þ.ˆîìÛ<șlF­Ô¡ÍÁóW¯[Ä.)J§¼,7o¢ÊœT_–å|üBú"Ý䱬ò)¸nÁh¸EׅΌÅ×)Á¡¾áeÁ®Õõæ Ásx6{-„”ᣬöúŒ0ÛðøFà…÷lm‘k+ð™OœõÄ)ë 9﫞ќB´ê¤tÕètbÍRѐꤗ!ò\ó!à—ÅÍ ¬Í³QR«>Á&Gë'v—dƒë!ã†~U±5½ù»Ý×zaDßEÜÖ +4'П¯Ñ5svI¯¬½fuwØ¡ªÍéÊÅpøv?uQ¹-ôž©tüP‰–žýú„ò5îD­§Ç»æ?> endobj +12207 0 obj << +/Length1 768 +/Length2 1151 +/Length3 0 +/Length 1695 +/Filter /FlateDecode +>> +stream +xÚ­RkTSWU +Râ¥ÂÐփÁyA´&AB(’êÛKr “\¸I0™€jµBy Ò + X¨ÊaFD@‡ +h(*ˆ¨¸PFe +öãêúwÖùs¾½÷ù¾}ö9Ύá|–†Q¹ÒƒJ¢2‡Ç öø–B!8;s0R"¨<RÂL@õõe€m*) yŠ7“îɤ{œ×`ˆ$V \9çEހ%ƒ1DÉRÆÂ2¼‡’>*B`¥†XR)ˆ˜?¡°Æa1‰@¥1"R‚hX‚È äyKÁòx/ÂbUü[*Ƹ)àº`s#ÀMŠQ¹TÄp †âÓ`ÜËÿÃÖÒæ*©4 ’Í·Ÿê4$C¤šÿ +PY¼J c€‡ŠaL¾T /zãÁbD%[Ê+!)"bÉ%RxP½H¯EQ"jXŽ(E± ’*à–‹—:Áã[ðAÞº#8Âmña¸p‘+šxP~/ÔÔßk<" QƒÝ…BŅøz»‹Z2k«\„Š¹Ðè a¤!PðV4:h©‘‹a5€Õ¸a2IŽ*ñ#&Ä aþU4@–Ì4<+œXÄ(€,…Šà7c³QµÖƒæpÀô^÷)Q!·;3­åR°ÏÛWºž»n¨$ ÖÝÒ> endobj +12209 0 obj << +/Length1 881 +/Length2 2068 +/Length3 0 +/Length 2668 +/Filter /FlateDecode +>> +stream +xÚ­Ry<”k.EŒ„Š²Õ[¨a2›†qìgb˜,Yçh̼£ÉÌ;c¡”È2¥BQ¥å¨„('ÊZ–%kC¶²“qrl}£¾S¿¯óï÷{þyî뺟û¾žë¾u·‘\ ,ilЎ ñ 0HŒ `M$ð€äŠFÃtu­¹ …Ï`C6>h`ðx#`Ÿ€ ` ´± ÎЇƒéÖlŽË8ÄàÖzËIƀ% ä2¨ Rø‡@–¤•Â\ÙTÈ"K&pY~Á\@È iHÐT>à0 jY¢³ã¯0MÀù‡ +¹<‰(þE¦ IcCL!@é0”[Ò ”hùÈú±¸€Ét¢°–Ë/õ/šÂb0…ÿM`³8>Ȉlȅ~Lõ¿j#‚4†€õ#KàS˜ ª%ÀÌn$z÷WœÁ³c„€4ƒO=Ð)Lø!ڏJ$ö}сòôvµ³ôB|ìŽDa@|7!Ðߓ¿Ä˜ï±Ä".#ðA#ÑhŒ$Qrþ¹‘èe QÙ4`qF…Ë¥ahI),Å ˆ†`ˆD0 + ±ù’'€Ä˜p€Îæ–§jl —¡/ ¨l‹ò ÁHº¢Ào¡@,ï¥ÄÚo@1AïûŒ¾…»”ä;”e?™ ÿ0úN|]–eæßVZY±CŽ`ñ€'ùÚãÐáÿ“Hp¹ Äÿ²­’üÓ’‚`H…‰ÛØTÓ¨ÃFgGØf5ޖÖãi¦ÞŠª/=U˜jŠë6]ßÂ-zén™R>¥|˜qG)å½CŠFÇõª=´ «9êŠ:õZ¹Fa£ÞÕ4×5¨c¾¿HÕfTW*²Òc‡Ä[û9EˆÚ3=Á¥Ò¹Ž#ãkjïãVg··-~Œ<ÖÐ+–¿DÓH‘3J“ÁÃ=‰̍۳³Øâµ›|Óf6,‰Õ*»šß(¤âã3ˆ«ZS÷.È¡õBè} 0ÌåÀ­bÏ_ñû\Md5Úfžû½wN«Ëéß²úï—!Ϻiïó¥b\ôß/;=x€í9Úö+Ëh¥Z­ÓÈþ ÝÉÚõK*Ò]ó/W$…®|dZ}¨ô²þ:Fö!w+üï +r3žL^ih¾/稜iᅯP1¢%ƒTlor½;«½aú 3괉ŃÅ\î'7¶¤B“:¡cš™wd?S'Yöìd·9ñµæ¶GÎUqÒã´º><‰Z«auçÑ[áó:E•¼¢í÷ÆbŽMÇzjݜÝ$ظï_9¦úéŽ|PÄÆø£—^w.òÖº\ˆØÚ¾Uõ†ùd­Á/4NZ n¶®š9Q>ïl“JmÌAåvï=ò8ûUOŒ¨cáÚÛ]O‹Üðm´š‹•OÞmÎM'i^Û +ё¡w7¦ˆ»6#½D›È6ÃqùiC ^žÎɱ›Íßj¸øÌè[h—/¹ž¼qÀ[ÍH+ˆMJ¸]¥üܛ¸Ó}WÅS\°‚wl+®HÓË\àK¡SŒ e;nžœqj¬´¸_©›)‹GÈeÐÿTO:,'¶â¡Vurjáx^=§ÖסdjM¯›ª6uw>ôàqçº8‡ÏíeŸÉzƒâíãR%•îý“Óن‘K2½þ1é~,[¼·Ò ð*„–*ÖH$—ÍÁ÷èúÐÎçß/z[aítRfüV³·ðaÛÆ‹J—âk V?[Œo{Ç6ÿm³V‹ŠæÒ +Mŕf—ˆ$ÖÙpŠÃ:Î~–XB‰|£åüGiÃ5ªÑÇwãF꜅%+#‹_U”Ÿé_±Ë+ÚêÏyƞLÃÒò±ýªË¤“z“Ž@"wLìký¹Íª•¦`ªÆzP»éiÐÆ(î +òÞîrë #Ÿzf°ªÉ—ôšb&¦i“í=¾Š®2Ãç<2H#åìæâ—jˆ -Wɛ÷]Z› Ƚ7»««®úÉøٔ1 /¬¶ñìÒ¨¿Î%îÃ`¤·‰@zkuî:‡SM<ØE_­óçö:`o¦’¤Giݙ¸÷'#Gw½yÑÅu.{M"¼}ŽÎ÷§Ä¿Šð[4ªíÚ©f}GÒ׿‹B^yý¢æJË\ß,™4h'—^÷³ù”2ÿDÉ#ŠÔ—½éY™Í•Us¦98Tñή¶rõv>§lá ¥~éœö`~¥Kñ¨·SDZŒ&wY2!g¾Çŵ•Õ"erÄÂ7 +?ª’­žŒ0}¯õ0ѱªOá}g‰«UGðóéjÝ«,š±Ù!ùáR©ý¹õƒðí°@KÎý5Eyeò±#eÀô£¸õe:™nõïwŸ0!œ¶®Þj2â·êCЖ·(E|h$5ýVÜh§ÎéjdÚêg)v˜‰ªéŽŠ…6J•=û7ç˚é&k‚Ü]‡UÊMK|ÐÆu5âL= -á})üØpD{J=‹w®ú>¢&J&‡þÞéÕ[ù¸´»€\؁+ȀÊÂօÒÐÝU5R/”cÙëè&OR¿uáB8µum_p?fMÁʦìôBÚvúMQg¹ûÔxO8Ã0Ùëu§ˆ$Ôº#Ÿ$<’T«Ù`øðӉ÷Ï(M™ “«à´¶-kmïÿ×4±¤eúdÇå="8‡$À¶;Ž‰X|ñhëÙìÙÁGÃÈw§S¸c÷e.õ‰½îy„—d9øù9.óìþý`¡fèOÍØ@Üi%»%ÄÀ˜´Îf»+mýÇuDûª~¦–Mä%ٗ 鎜7ï»(gœ¸Î­ÖéLõžsYåÇÏ5«}»7¾}CŽ zJ9½Õxv鶉Q_gq`ã!/sÕ¼"ê,)çÑÎcö÷O9—ŽNùôh”À«ÃšÜLûJëØÛ®gO˜†eöt¾Oy(ª¸¹ÝJÏ`_ÏÉ*qBNúŽû¬°¤?±Ž5i I6Mºx•†Âú)_©:èçõKIR’ž§ü+îMþ +|ž³Oº¤ªXœÖ¬dôHð['ä·ÿ +ÝúR…TóÐÒ¡|ªe·:ÕûÕçòœøá×½Rß°Á—)S©á=ÓÌÓ®hÇvw…ŠdƒÔ`öãηÛÈǨk©Z•õF;C¬Â;Øg†ïÕtþ᦮^]ʸIÒOx­?A!xFoyü¢¡Å®1:Ÿ[0íz´yOHᄓ®Y—Ò»W~„Ø—ª}´2}béße—mñ ‚.Ö[ªôås}ÓéO_ÛGGŒwxÔá_p‡p[à-­ù7YZ-=©¤$Ë/AûSºE `Æù4Ï"ì?¾ÖS.Ln¢é³òXnnƒwi÷63Có»µ]ûÊÇK?û½¹2wz9#fg¢ß“…+MÌÚòɈës9æïó"kÖºth4ÕùÃ|!À +endstream +endobj +12210 0 obj << +/Type /FontDescriptor +/FontName /XZSFAY+CMMI9 +/Flags 4 +/FontBBox [-29 -250 1075 750] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 74 +/XHeight 431 +/CharSet (/L/comma/e/greater/less/n/triangleleft/triangleright) +/FontFile 12209 0 R +>> endobj +12211 0 obj << +/Length1 912 +/Length2 3316 +/Length3 0 +/Length 3922 +/Filter /FlateDecode +>> +stream +xÚ­–y8”íÛǙ,e+’¸e'³ØSYFöÝ(“}Ì †1ÃëD„JT–¬%[b(„G²Ëʒ%ɾÙBD~SÏû¼Oïóû÷=îîÏy}¯óü^çyÝÇqKˆZ äµ1D¬‘@–‡aꀎ©©!腲IH萰(2ŽH¸„"cÕعs*€‘PP ªêÊJê?E€Ñ;ˆ„ss'Ò:2?Eª€¶–„C£€)ŠìŽõ¢ç@£ð‚ˆÆaÉA`@¬~î𬰾X’?fƒÁ M\°n8ä§)C‚+Pý+Œñóþ{ÉKò¥›¤ٔè&1D>À`]Ù fDz5,ÝËÿ‡­'×óÃãÍP^?ÓÿÕªÿ ¼pø ÿ‘½¼ýÈX`JÄ`I„Km°¹ƒñÿUǐŒÂãÐÚ7<‡)¡JÅq¾z¸@,ÆGF»®(¼/öWKÀüÛ½}¿\@lLL‘¹¿GûkÕ…#­ƒ¼±ôù/†ýÃô&‘p€ …ÂèBúó÷›Ã¿ªéÐD Žà((«( ÄF¿DtR(0GÀ`l Ý2L ’é[zcBW"‰íç\飁 ~†þ"5âò èÿ%½>ûÒµø¦@¼CEâó*ÒoH¯ê÷ÒSùÿ†ôºÿ €þÂÿî3N ¤ÈÔyeú±`*€ª24äÿÑ~$–@þu•éÓú›]qôc±X4Ûð}>Ò#¥â&5T7÷}!³Œ¯PZ~dgmTYÚy0íóyž~ҟבּÂëÜQܸ"®äeã猫òøÉ +ík­$jˆ»•“O&;qxM³wµe¶4óʈž™öþSnå£Øæ˜-ó& 0՜“Ëw˜¨ƒû¡ž×»Æ‡ÙS1b3Él™¯M’°WæÇâÞî.és‰Ãymüö雼?†O6Žöz~âL;“iÊ`á¥4+±Õí{[¯mr&]îÑ»°¯À[àD,¥©&àø†lWÒ]Ûâ!l݄ŒT´2‹:¬m:¹s8”­°¸T\Ï3 .yhꀍ繥͖óÅeÁ–¼Wù¹ùãš¹ÈìZB‰ÉRÇzŠ4Þ¾[q˜Ñœ×«*Nºq×&.ARkåΫÁîZ܏,9Ò7wRߐŸ‘@¶Ë#­üzŽ$"{‹¢‹þ &ÂÛ7iM:LÕeºÄà{Ï@Ò¶¥MŽE°i¶> +]`è4QÁìø‹‘üº§ÜN\ÊwÆyQYÊZܽGæ¯Ûñã€úÀçµâ›öG. +tMžrªò¸óâóríNOCCŒ: JÖ=*¨›u'ïù•æ©ÇR’\„ÞYµGg ¦ËÍÌ¡Ñ~áiòS$KÛB/K™è¤ÞZﳖÖÒT;êùS!º¥vG’®[ðĖ‹åÙvxË2&æ©ÌÄÉ(—êx¯ +f®ëùÑã*ÏÂgä´ë‹ 6ϲãÏ =/V€Ý¯·–ä¬{$Wö5@$¬g»pdàÞÄùÜ~[zDÖgÈ Q2KN#Ä2n¯¤”JäÜ&}{®oõÄu<°± E@Ä®½*G —ö.0xg¨a:ÔñkaQ‹‹ÕŒÂ™ÊíµÆìΨ ™ò@Óg—mž‚¦™â2"GRï³śÝêr·ɳwdÏdô0ß;Wî}ë|’çé©òYÖJұݘ¡ª’¬ø7Ç® 6o¾V‰¶¾¤ÅDs]*ÿ’bÈ<æ,Ý·¥;«É=ÿèҔ½ÙË¢£¯ %S.Û¢¸(o ] ÷õ/UÒ?ŠØȇ%{­ê¥eœ²{dÇ\[Éqjte‘¡´ ±—8{7sÁsbK»ÏÄÝÐáózÔÂoUS¼urèt¡‚U~''ç I}-> ‰é½ð-–µø6øâ +¥ùŠÈ³mDøóìÂRó«ÑÞõ*Éág}8WË4«[×J{^é~ú(OSÝÞËÉ…\£æòꦦsKe+%‚2Ò/ü—2²%™ü²Ïä­Gjì"úGÍ4êôE½õ?ï†Åc긎ïä³*•Ýà˜Ó3ëì\fcLÑI_}0p4õU5P;·y÷üҏ‹åA[—óú/Ô2+­Yìpó™',õ«`k›*§g>5|¤ê4¤üáS ł }ò&QZ%7Êt‘sîqå@âEہ•f×K¥gá€|ñ&Hm*|h1O$Ó5EoÒP‹í®þ¡‹‹&‘Qóp­ ¶T±Â¬¹¿ç"-ZßÒz&q¼8•y¸¨´½ÞÄíöÒ²» ÃÄk©F¥·}œ¿0%iy搖_,t5xŽ +=¯Fm˜>¾&_¸Ð¢$0òññ ¨"õa g¶½°}Q:r$ +>cf˜o6 ¾Ö:¨x™!2«^s)F<˜á´ÜΧܐì Ùçwê 3- ¤R®í _(·ÃÁ!ñãQŒŠ,¤ãáMU^Ýw÷N‹å~q8ŒLïú&½ë|4¯Ëؕܓ¿4¾6½Ë‘øŒSÃñ::f&§+´÷À¢=-i¡ +ÿàÐ:Xx%ÅX¡.ŠhȾflcJíÖRɱ.Sèš,4)pRÓÑqÒÒܶœ¿°ú‡µäUŽº¯¦{Ì«$Í©`ԜF¹š|ˆe”Îí¦l>Ý#õd•µ¡m³Ý½!eë‰8/ÏÅïÚU_Åûd©ßî݇ŌM—ƒjs7S×31cùÄ횿 ïR\9zu°¼yJýÁölw¨A¥è®2”½ÚsÔÐ[›w–§&Kœc4ª*6‘êý ¥ •¨Uñå×:·A´@Qß<؃ò N<ÐÝ+­d͑Pk nPxQó4 +/ó¬5èùòð“Ì÷ž„ðœ{)ãëÈgý7ùåWÂ.ΫÊ°¤•Œ)‹—LH(xy­JbBffJ‘f%¡‚GôŠaû©¹.Fåx1¦¤¢ø­Gñ“x3$:m»Èwï*Êë Á0BüµËOöK+ãw4+´)W§O’U¥p·rŒ^ܬØ%À ðh§?æ¶ ÒåàQ‰WEÈæv>¶£!Oç}:QÍE.=v‚KñTûeY†ÁPÏ\=u5ÎqSØqµƒeÆæšFç üus52·ÇŠãUS®ž<û8V¶·_SاN9~·}z³úÇ)]¥Sö};5À ,céÌïýk”¶xA\£büà\­òâF‘†ÍÈ0ϳˆÈ‘W2ä‹MáÍæI,á!¹p°°l¾g¯~ºí›c‰ îÈE\%¨Ç.*Äó°ïiö`Ÿ qiOâõ˳›ÓŒMœK +n寿\öµo…˳|5R\ˆq‚èœwóü8ð¶Ù)ƒ°i/_Í¡µà²IÃe%À¶þà ‘«â¸ºt#îù×´Ð^˜ßÈêÑâ÷%G§™s%Ý=kÝWÄ3Ásóƒ?„Û-#Œ„K­'ÌôìµY3Ghf¦~(’jd „’ ÅÊäéQdøÅŠçùºCy¤Þ#LJ'ôÒNzU~çÝË9’†4Ü]Ïø4Ö´|ò¥ne'3¯´n²ù$#×í¾æW䵧,Wi]TÅ*]½Ý§u S ø#ªŸš8vztánT”Þú™/c¯Å_¡ž*™aƒ ["Z¢*g4‡(C i9Tý·º¡/§~íµ Ÿ"ߢäºK?Ù`[-Xöt`wCv%ŸÝ8Éñ¶œ‡ùáÖ\æv‚ZÁϱhPÇZšÛËÚ¤ÝÔàIFA«\yšhÍö¬ÕÞä=äf,gçãMí ÁâŽÌ°{í÷Þz„琾Õ~œ¬¼NεŸ_`Â/ÉÔTV5]/4a2 uÈ?4Þ}mªuv†RTØΫ-+…»kIÕzp¦x!PÎ1 †V +K–ËÞâ·Ï:RÜ­míïAh»þMe¾Gë½UwAþïCD•ŽÔúŒ½|±7nUå\BûR²[Aàéþ}õ(îYjR®DDì.­•¡åniþí‡~iÐ}[c‡hLN’¤³(2*6ÿ 'Θu(ÕñëŸVí :(f]=ñÒe辙}ä@»Éá†á#jáí+ w”ÐÝnòöôòùÉ\3³Ù‡{•ÔïcŠÍ"•w¸íDÖ)!g)î·Á»‹u´3|ü¾w˜b¾“UÈ-8Úeàý¼¤'ðX¿¹òøÊÍAš‰¸âjZØï„hvJ31ñÚ0OӐƒÆ>ܔ7ϞkÎ\tq|°ŠIä† .üó\_4'Yye̛%ÓI1'…'Ž§'NÄqmíó?JLYԀ¦GöP¸7Ät¨õF”9Ï*›,”Öi÷`¦rK=Ü1Bfƒ36ÔËîKa*øB$ôÆ·tQ.Oîàkðè ‰*¡c|¾å/mä›÷ *ÇOm.®Ï8äRA;ÊìcC¢ˆ;9‡5C Ï¿\ß°vKh)êIõ<±«ðpڬϭqtïýõ¢$Bç*l^vºú‰å™&â&M ™NÙüo>ÍHßZÝ¢•iËN—\ÏËóƒ:î|…&Ûû~5Âo:ä7 +Ž/üÀò‘ºeaå +tÛ¾æ¯3>¢ª-E)åôÖ C{Xg»Ùuá×f +³Omlgc¯SÀŒNþ.6"=ݵ‰Oֆ“µòhŽ­ðšeÓi¢’9ý÷ŽÕt$@Üvÿ^…iö ži¢ç’ŒKËC’î +endstream +endobj +12212 0 obj << +/Type /FontDescriptor +/FontName /WLMXSH+CMMIB10 +/Flags 4 +/FontBBox [-15 -250 1216 750] +/Ascent 694 +/CapHeight 686 +/Descent -194 +/ItalicAngle -14 +/StemV 113 +/XHeight 444 +/CharSet (/a/b/c/e/l/p/q/r/u/v/w/x) +/FontFile 12211 0 R +>> endobj +12213 0 obj << +/Length1 808 +/Length2 1232 +/Length3 0 +/Length 1791 +/Filter /FlateDecode +>> +stream +xÚ­RiXç®–E"zA‘²ÜÛ~P#$Pâ#Â^ÃA–֐L`t˜‰ÉDÙ, +.T4(ˆ‚È&Š"¡iáÊ­² x+ö¶ HA´ìt@}úTÿÞgþ|çœ÷¼ç=ï#o?s& ƒ\07§Qh Àb³Ým•JDT*ÉȈ%‚¸8Œ¡N\bš­­5ð À’ÀØ0¶ÑtXX¤P‚C"ÀÆø‚O ¢ øG!>“' å"|àL_¢<‚²Ò)”‰àðla‘—ém3Á<. +Ø\<Š$¦ó¸ðÃx0„Ë(€‰ Àw¹C |!1$:ñ)$ ða p%Y,ï㎠+0`ó&͗ߕ@"1±ØòvE2 äc("#¤ +Hž1"Ôü?„½Oî"AOnä2ýŠÏÔ¹‘0"{‹ø»§ïC 7â1äƒ1î8yL4€9͊BÝFS€Å.°â{Ã8/¸ˆZÉC(ÿ}!„+2,8>^»ý|MßÞÅJћ £¸¿Lê_蕘öWLx$‚¥ ˜J!Œ&€Ä÷îúÞ0g”‡ña4XÒ­W$âÊHT‚Ê’NÑ4£|H + )¡Ø‚‚b8Ñcb‰#‘–,f ,„Ë9҇K8:bÒh*0·¤”–¶VÀ†NýŒ'‰ _¹ˆw±&̃ )Ä#õõ`¼íÉ{åՇKâœ/µ•*ÙRž—iÛzd(õk»£¯ãtñ‰!d_X“m\€ítc„ƝND ’7!‹ƒ·3¯>˜âû8 sãØqú띙­vQ8IÙìބÒzCòˆÇ…üÝEVي ŧ€Ó:ʲ½óÝÌ1ËûKš“g CJÿÍSŽºÜE»¥%B6H{5ôêô{ÛêVáK3Z'Ò¹Ì¾­{òk·z¨Õi7.eé+Š?oI9þR÷H¢nJíèÓqIí'ü‰€9³åd7iVª‰G݂«BžÍq¾è*©<+})èɃóÄ¥{43u +úF>ã¦#ùøPé üéñË!‡ÊëØ1þ½m7ô9‘[Wßb$9yåUô¼ª3î9?ò´EmÆÔã̅#~פK^B“쑦ßq•³çèMî¸×øäÅgÙó›zdH‹²(—µ/ÒköñùgkS ~"]ৰE“uû®Íõ*³<ÝóÆòÛ´iڕ]ë¨ú’\QóÚl0s:ø¼çíˆÔ¢‰}ђŸÕ㳙¡Z¬<_çõÉùÙ´yÎNgH}P5Lùgµ¼á.?Á—yGžþš4oIŠå78ÜÔËRŽÊ™øe8ßÕD©òF¯«& m +*‰(:vü`,ÏÝG,­â; Î=pËÀªüFɲäKŸÄòeM=¾Q Ü£¦a1¸ðÏÙ&Ys%²¡òfÿ›Žö«~üv»a‘‹Ï]3…•U›vt.ôRý°ô¹_J¢¼=ªóÉ}(]]í—~ÿÉâZ«<ž'«v^3#‰™7é]®“tÆYÇ%}‡z|7…óÊX8ž«öoI~騇ý̆“? ½…ˆ¼Ùa!þ³–ÄvÝu,—¡ï8!¯+c§5Õ*]çå>ݞ«ËF²&ÜÓ¦˜É~ëœÖú@¯-Ý'­’®’NƏt>×íÙâ*Nø¨€^åÉ·3lr~ø:½éèäÞ%ß½ÉÕ£5§‡cu;7Ž©oî–)Ff{q’Ý%Ÿ{…«iýëiƒ8Ãa¬ºNÚµëÓè°)zÌàÔ)‹ú#9“&”Øu•nÝU•i™¡i[3A‚)yN{ãEŸG)°—ö¾ù‹<«Ÿ7£Ó_…º~¿ß'Ã|gý檁A{az1#8mÆh2÷«˜éÊÕeé:Ú Qe×ÆBU §¾ø£vӛ›öÿËO…Ö8»×ß+VÀ⇏êª]xF•ÿѬŽ))#[Ûö÷·ÕÜOµ7gZ$•5'.FŒWœXsòÚ-ÞҘÛÒBœìö”³N\ÅA¤Û(8‹·Ïn0¯Ý>fÖuýqWê‚ë•ü]¯¥Zsá–3¶W.×ۜÐYõ qf“¥ºêuê©4£ÑýÅm*Û[¦‡Ü‹n!Áöíœîft*.Áõñ¹vö§wKvßí¬MqÏVúýy`ùªZÒ`W¦ÖåLäEð>Z‚íº&­ìðbÂ°A×ÿ +’5Xâ «þ5gbÓqv…É«…¿^ÉcYG’¦òçúîôk.žÏ*Ÿ_c†Q½‹O)$7D÷ÔtÏÝq¥à<·~â’±°–ª‡ ½1¶G~d?ßzÍnÖytíáØÎõ_8NËåßô“ÙÍ¿i<±²nB¯U™S¿µ†ÝѦ—ûuòԟBs" +endstream +endobj +12214 0 obj << +/Type /FontDescriptor +/FontName /UQOYSR+CMMIB7 +/Flags 4 +/FontBBox [0 -250 1294 750] +/Ascent 694 +/CapHeight 686 +/Descent -194 +/ItalicAngle -14 +/StemV 63 +/XHeight 444 +/CharSet (/p) +/FontFile 12213 0 R +>> endobj +12215 0 obj << +/Length1 1432 +/Length2 8965 +/Length3 0 +/Length 9817 +/Filter /FlateDecode +>> +stream +xÚ­wuXî¶5"ÝÝ1tçÐH‡tw×Ð9tw‡ ÝÝ) ¢tJw7‚¤„„ßø;÷½çþû=3Ï<³v®½öûNÐP¨¨³ˆY8™¤ÝX8X9ŠjìVvvq$ 0ÈÔÍÆÉQÒÔ $ààççHƒÌ o On.nN$€„“³7ØÆÊÚ @/Áð;ˆ æۘ›:MݬAæ¦öu's›7+@ÌÞ ö;àr=@¬H s7€ÈÊƉí7%YGK'ï¿ÌîÎÿvy€À®Rúh2 $-œí½ K$6%'H7„ËÿZÿ]\ÚÝÞ^ÉÔáwùßBý·©ƒ½÷ÿ898»»ÀE' Øñ¿CµAÿ⦲°qwøo¯¬›©½¹˜£•=Àþ/“«´ÈBÅÆÍÜ`ijï +úÇr´øoåþ¡À¦ª «ª Éô¯þãS1µqtÓðvþOÕßÁÿ`Ž?¢ØÆ  Ï‘—yüûáõ’r4w²°q´próLÁ`So$Èé n€/ÀÆÑäyA³±::¹ARMü–N`¤ß å°I‚ìÝL[ÿe`°);€¬þX kcû ñØÌþ H¾ØÔÜäf²tûcç°™ÿqCr̝ì!æOH‹¿ ¤èO<ý³œ[x~û]Ü!gå?)\6KK›?˜‚ÿ@nàoèñWÍß~'wð_=!!VAHAë¿ 7€í¯êìþjΙÏáü-ڟá¸!‚9Ú8þé „Ôrtw0û}k¬þrá؜þ¹ 5þÊâø=’ó7¤‡³)äø¿„æâø+øé„PpÍAŽ…Bæu¶wwý«dä¿á€Ðüãå†Ðq9ØüïÅqÿŽy€þ²@Š¸BëŸ2íýéÊ !èf ýµ È nžN%@Ⱥÿ!R{üµWHøŸê\§ü¯ìÿ{ëÄŝ¼|Y8!M!/쿏?€Ÿ‡ßÿEš»ƒ!‚¹ýó¡¹¼ÿƖ6«yÌ‘–œÌÃlÓ["*¤Š¿VÁ2¾·jMTjú4ۍº”ôʾlTޅq£Qçgu6Úì¹ç±kL—Ÿê„ôy°KbÆüˁ‡ÉA–O;±ÎU–¢÷¾3å]è7ôΖ¹›SîWÊ3c•)º%¹ƒß +Uè%5á×( úô=šû²Ãxxu¤³ì5#Ãij.•Q\‘ëž)ïaÖ§Bl#ژV/ºÜ±~#$¿Üá¾Ã4ï"ªí0⨊œV”Db øÕ?\/š °R`WÔFeCó°#ês}ˆ¤Œ§/ð'¥¢=Ιۻt(žix 7ÊöŒLÆÖ%rK¥ìjâé|^Ni÷üE]òɁÔ[Aç~èÉn…ñZ z°¨í¶TøzYÙ_q|8Ðnr4‰Ä(ER~ùº‹fŠù—¹"Ùìbü´gx +P6CFï|£rœ‡Ÿ÷‘LA¾_ ÌF– z¹-žàÍZ¿e §2§†©ø4£¨í×KƒµŽéc¾!ªV^«Þ"V¼œâ6ÉmI,‹+R˜‡ÄâkªáÂ.tPW¦$…†çáqÐÙ̘E]Ó%Ü0êë#øR¡|Æ?þè ¡ßØ՟g„—n_›¢i?w@}®m Õ²&P†,2BæIw[‡å©g.ÝG,1§f¤`–_|ïRX®•r•\úÒ¾ÙrÇx[¿È8-~ÕVg‰žÁ›¶| ‡#«º©ïÃYÄþ\üÑ]ïãa:cu\QæÓ=A®KÛêMªJÇIÎe»_ïÐxšlÂxr,>F‹3Èÿ˜ªLw5RÇIΕþp÷á‹?ATcX¢Ä+)”­.Üï'P{qæQ×O‚çKËýP¯ôAèl꯵h?üB²Yä* u07`ÿdw&AçêÌ°ß¡ÃÞ~#Jý…ÓvæZùíÇ·üÍQ4µ–™wÓø' +r§’¢½UP™ϜfÜiæÞ!±W6§Ã>L$qµö^-û¦ ðé=LC£œÍê¢î·²ÄǺӷÜÒÂ.VyjÊRNžòŒ÷/×Kƒ‚l±™/è®’MS¸eØoɊ‡ +'¼„„›Éå&÷îÙ¶ +’–;KhwCvµp;…0èõ,Û϶ÏÆËU-8©Öé屄J¦ìo{¥s|ÅMGÇI/-b"ŽiôFí¿) ‡ŸSä¨# +^‚%ÚæzÑìPtCžqöŽñfÍw@œ,!™‰–âg6›5ÌÓîÊà +è·î¨T®é<,+x‹‚øïZ[\ár—nՑ$4ò ~‹Î:˜‚ÎLÌØ×b•àO­Û|Í7þ½ÕGºl£SåñC+”xÓÔîïx7ìwIwøÄ +A'C³±Æ¨•òÂ阎$"«–YߺO<}²~¾×DD¬ÊEÐá Óê7wišã§úbÒ]™LXðúcbéõÎzO}ÇÜ»œÈlœÀ_Ñd£óYçMzŠiß&ª"¾Ï¨£FË̂¡·ð)?©õV H/é‰Q_/öfdÅ Gr¥yÌl<ÜÑÕÜàcõ—4”¾k |sŸ>ÂùÌ]Aw=ÎäêZ6B¢»à˓ð0Í5 ÔA‘,¯+òa󮚰4{âÄ%Y¾«: ›¢< Dc²ƒSÑ|±ûšŸ¨YH_-Y:ïåY3”dl.—ë”­û’–sÿD°tr+“£¡þMLþ«»]‚Í“‡PÚ/žÂO­*ÆxgBùÀ¸÷µÀ¦üݚ5Þ`W‰RLMԕzdùÞû~¶°’-Å 5‹çW¦kP‰OFäô¯ž.€®Îµ¥ßQ]5kmú¦tȋ‘;œ[8•]›“žÕÎGb[7^í¼;@5 'ç ¡™õB)ï®Û‹{¿õëšû×C9üÑJ¨¾N.5º%S£'ÌÜv¬õ/Á%ú虙ļW¡TÊÞeŠ,…ÉÊá0U8ýûdƘÜÃä¹:Žè]ÁåóŸk‹•õÍs +Ä:zF±_~î2‚h¾âNR˼SEKÌ ‰ô +¶ë਑¡ ŸÔ!T#­w±Ô±s   +¶åú2&Iõ̌BtOmv׋ÄN6rWàBú:©UÄæëQ–•4Nµ°ñŠG +lS—,w“x4ä~,Ÿ¿a •³Â$Mчª÷{YQÁ¥:ƒu}©Â¿ðÑÍ·h^äZri?öÆ'¶®M†0."ãuI¢æâŠA1)í¬7¦—tqÖo1Nž*WPo¿Ø“­ªS ºæÇJ÷Õ9˜@¬ ½3åj¾jÑ0¬ÌÞ +Ž‘ãX¤âÂP£r—ß21Q>‘ —F‘4ÃX`‰nd»jb85Ÿ ޏHËôOêN¼•}M%“›=‡æN)6°3mâûzòµnªo#l­³;.«.â&~eøkm¦ä›Ë>óo=¦Úúғø»cÄÓ06¾h:Ø_K„bõS¯µ°¥}Fâ¤Î\±$Y¬ÎlõÛ_w‚maÆÔýĆ¾8HŒ—”ýP½>w‡ñÆ0ô¢É ¯¦ÆÑå&❨7Œm¹%>äTeª_ÊAÁZÎ:â®ô…wê¸ùQäŒO¼ç‹t¦÷~Ùf ÑjkW¢É«[ð½FÍü6=›`.e)dâEÕ¤­.Sq,óGþ0ÇC‘ŠÇÏ|kª›ªïœÅÆ"'¥¯7ðNJ7 ©EI¾ŸùZeÕªìhǝsTjã6tÜNK¶wò‹ÅJo‹¼žÎ„šÞÞìʲ?Éì|Ú«ooç¯çÊ+–65;Cz^H‡Þ) ¼~ˆŠüºÒÔÏÉl0h Ÿ¤Úў›Ë•N¬Žbiˆþ]ÌÿZ.`%ôgêæªô…N2ÿrŠ‚t©_÷Ê;Á#rhÕFE>€µ9ºX1_ÎBá³z`•wRW•»kç…F[<oÊ9ʺ–ÓTätZŒ@ð¦Ðeáµü™åsKLbAä,®ƒݹ~P:óϬ(sœ]èïn™Òñ´ ð°¡OÚ\-•;›EèãÍ;®ž#©˜9Ká×q0©&Yñ$ôb–¾UFO¼Ä$ó«>vvbØ×â©â +lsû1]VZ¡<ëjæôc9d?6múˆŽxWPõže Kžé÷ëàPŸe·xT Ç Drë~Š¡MĹh1\*õh’+ešñ\ õ38?ç3†æ‚É° +']\'²òve7XÇáP ̟†¨«’vÆ9COž «ËþâQúˆ°|š0 iX½ÖT…Ò$×]n‡Õ¤Zg´²Ý³Q|¢æ„é­½ëef+Ú¢·Ož#¦õùêàëDðǐQ!NO§?n*CáyÉßÔ$i±ÛYæÈð“ϟ——6ð|olSŸ~P·©•{±:ž¿û¸H5O‘„û.½»Nb 0£ÙÆ[˜gc!cF.$Ӝ¾;ˆì>§ÑCÁºá- †FŒ¯âYì­ +t¥ºEÔY Ÿ˜€H3½D{“mìd}ózÕÆêÕw€Zn_÷EIMwš‚™8ªKlfƄY£•žÊïL¶¬åý1ÔLr3·ÅäŸ×ÌÐ2W‘KÍ¿ë•`ӊ¾ìÚW®+Ec¶z……\ë¨[dZš”I‡TÅz¤¡òq°§ouFG€¤¯Ð2<~4üä_DG}Y˔w •›‚ŸAÔWZ,ÀlRµI¥è\ C:ÈbæßYp\í( 1T‹74Ùhz7X÷uL뉓C~m¨ñ§žˆ/²‘´,`Æãa¥8C#à w•Ö¨ù‰[KM-½ ©7t¨“¼—ý—¨æø]Ø6ÎÄç3¿¶ü!}ë«À9 kÃs•ÄæQ Ÿp;[Â|‡w6PêáKAôé)Ñò<‰£ô¨ý©{dåÃzÿyƒZ;èîÜÑ{×f@ÊÙCª¤ SËhK/{Xújέ;¹ä°×DqÃcê¥æºU íËz›yÛ§×FÓò×%ï˜ß|`Õlð´b?K¤¾T»ýõ#îܪzçûض`^Õö!Áó„¢òòí(R9k½øÚÖ«Qå«ÈaKRÒüÖìãˑ‰r? ¿ÇÛ¨öSm«6ÙuÝis߾ь€™¦ę:è¤B{©ï/"ÔòÝ%?À0ÃÝ;îáP‰v§·¨ñ¶rÛpiÈEÈ€rÁy›q,‹™ŽV Ê1‹eð2éu¯Vl%¨„·¤éh ìWÄ;k#çBÂY֏ÚÎö/CBŠ]ra6ûžÕċÃ%j¹RhÏ®²Š_gn ´9·õP¥uk³#|<¬”!ë¦ù ì¸ö'ß/¨PÅç¡^Ë}˜7¹¾ Ó9g+楻¬ÛTúƳP äJÞ|Å#gU!`ç‰S¬Yãaþè˜]Y4Ÿªøj2:ÖuóÑ~Ì­uºšrkíÆYÚ­Þu+÷È5¬¢ð•?Û½§©¯|üÐ7óæ™=Ö¾y²sÄE²ÈÌKD '¥2º‘hü3=‡Vx5½FâíXYF²÷ -әóåDØ9Ê°j.³Jª=k–p¶*Ö>OŸ¾oÈýù$ª¡X¬°N©}ù_¯¨îÂæeáæY(ºÊ{P+D v…o¾ÍÁ©Rg¯11ËpÂvÇÁp}Q¨—Þ»6Z±ë1]”$æ›ÿV>ŠP(Ÿ¯1™…*Ûí‹ +–½Ð˜+XHíUÙE`Å!¿ÇÀÆÄwގHël^u¯x¹Î Ý 4¼48vÝXFc‰ NH¬³¶Q« íÝ,l¯x¹G'~³Þ§@ebö‹Ò$è\>©B ÑLÇ*Vi H=ó†± ;ŒŽ_ã2Y3àå/8v:5-$?—§d/ +øB2—îŸyœÆSÚ~ãSíàíê}Õ2( Ý·ì½åŽ•¯šTÆÁ¢ZÍÕ¿›·ÄO¹·…Q)U‘,¬KW¯x^qyRØð3ÓæÛÖ<xž¾éb”A4`_¶ýý<1g®¤áç¾SÃfF†<ÞœEËu'i â¢/#ø$^§Ûÿ[¿œíúÎk֝t+7©ª˜Á‘ÉXŽGNO—Ýʨ s0É)ˏՏK 0ƒ'ù¯fïH ̈4k$•Šve…ñ<Œ0ü°y¶ET%÷£%Ž«hž}aÎó‚K,{â航çU“¼É²-S FFZGâ´wAË «í<ïҝ%Ô|½¬w´udXœÃ0ö£K›a.~¹—n¸¦(ۍŸ9+ÇÍKó¥P½0·Áf^á _&cÚËcÔ­dN> åI[y +…;¨"ϟJ´…ØÒÄ9 +‡NæÇM=µ(d;J§‡T×»ºX«Í…¤ bŽ[#üòD †)Š‰ÖAY@›K(våDØx9÷Dï·¹D9B½ÅüÔ°½‹ÏkЁ\mi˜ê,Ú4MA}'Ô³õ+Äz*6ó¥ê§Ã¶ôË¢Ò¸¦¯àâ9Ö¹ïd[ÙMÒÃl~믷…ô|&ÖTn?å¾WXr¦\vKÝñP¸‡šáR…Šóf}_wôÕÚ/LÏæ˜#ðð¤À—ùW>žZmD%[Y•" ±ñfƒZªàð¶ñ$ÁW¡BÈ£w“¨:ê@7ƒÞë9¢Mýô'Íp(ÁnoKÜhŸ…í¿?I.rè0mõ{#Mþ¥ÇNÍf¸¿Foô Í¥_„qnÑ,g3kœ«Žº­sùx Œþ±ì Û¦ê­eÖϼ8ÓÊσܙh:÷ÈWoŠž+¸$µUx€9ç§iNq-TÊñÒþÝ@­‹5ÂÛ6Y„qʞñh»u~’²kÀË^áæ¡ï¶¾—æ½en흯 .Πû%\Ø&Sþ—J<µ ™/™)úŒ;Hès߉°ˆÆõ+CBz "Éɨc¢Moiä¹ðãÓòP …iWû„’ Èp\]ð…õa)Ô¢z› +hSWG¯0|òƒ},.. e‡ËfD¾>Ä…„q匜éƒ;õœÞWä<1Íc,ù+¹µ 7ãK£À( ýSRFqF¼€E1ncèÎGZ‹Ï”…­+qÆÖ%W‘F. ïå›Tj3ÒâÝÇÏk&â¯Ç'ýF[ J‰©ÙMÚ5Ž¯e£Ø¤’µTkÉÛÏÞnÃBõ¨Ñwb€z¥ó:ÀÂ|º-CÃóciáo&&&s„jã ¹rý‰PÜÉ ¤Dˆî‚ÌÐl–€^AØ0ûþ¯^¢ÜŸÉã."ŽÁCxŸ¾©') #w†b”¬Ç^Óq©ÿ`~[±Xý4„™Þ!v hÏ^øˆ‘él‚ÑÎ?VèëxðË6K4vøBCÌûlbg+D׫ág‚ºSBå§%Þú“ˆX©›?!†°tº<$™²®Õе±}4©tKá5;°P„ÑI«ê€ÜJÛ»Ž¹b½IDûÓB2Í^¦w~ÛÉZæfÀ ‰rõúW¡x_Wj>cCm*àTn‰]|À³ÝÈe½RzÛ+Î#Ÿ –GN² Í–Ûêð“Kn+Ëoþ¬0ÛÏøºâ“E¸  ÙbHŒE¶³ Ýô.\6Ái1õÖ¼Ëaœ s¸>qA¥œq}]O4˜9×›2ÁŒŒ I¡÷ ›†Èb7)=™Nº!/ ‚žŽ:ÐÔòêHÝë™R ×a-±óó)~”ýž¸>ƒ2üq"X°îWaTäqÔÓò±ô™}ïB;9ÌPº V½W¥Úäo>ˆn¶÷T´Õä`¨}Ži¥öêKˆ¶¥>÷~m“N ݒ³_ ¬Ú$E†ë=Nia˜Á¡dúH…Ys½Ä „Þìþp3Ã+!Kìƒ# +[{èÚ,B)–éÛ/o+ßkj²!»¼?ççE¢¾åô7»}S½@FD ê˜d勫çÿxTŒ")|Úde¼· +V¨ÃBFÏ6»]Ä~†…Vș2¬üå4x[2(¹µ¨Å•9¾ýëÀÝôM¡~õøTg«À$(I«¸€•Wß»¡z¾ŠWéà(:þіÚH.î/O¢l’y¼Ç£¾5ÚʺCYõˆcXîƇNw¸5OraS®¼AÌ±‰“s7‹kYG¬ëµó”©r65oÁÄÁImãb96Ý~Ê–ç@ó~…šÄf{-՜F1õÁ…Õý;§ý9'Vù®ˆÅ“ÑXÇgwU”ffæý÷-÷ÒvF‰‡KZ:ôÜŠé ½éBxâˆ;qßF,±Þɑ<Íx„O¸¿ÒIEd]C Ó8P+ߖçû9?IwÈ5'Hðö H‹8A· FØÑg¹öS*5„,¼ðT,fú#¡ w×|>TÃРý/®7ûn7´IW¤ î,0ŸŸà +idÒU슪 SII¥[Xl§÷?dýا¸Ÿ1^ÏR/f"øUyuA(|Š”ÖÄ{KcÓ ùOì¼Ú!™KžDžMÿ±&cˆ÷‘þ0`i=3²qýÆÂz±_¢û3Ðû@°š²ÈÅ'Ž‘mÿ£åOjîFÌ¥ >B¨Öñ0o_Ø7˜¢ú/¹eØV&P¨…nöΈœé@&0QZŇǡƚd¢¬q^q0V …lþI‹Cj/GŒøzXy7gñ&ˆô“†cÖ-ÑKïˋ£>L½¡DvRISÒۊ:dò̶†Ÿ7Ôþ&¼¯ÌÍ§q&á0WÅÂ[Gô2l®Ñçöž%÷8(‚sÊõž ´Mø31¼vÄ®4™ßÍ¡GÖÇMÚ%°b î”Á@DŽ€‚kW,Ö«%†&é¼/!9 hP>qcÄ YW4'ogÙ"öÚsf¾ ¦®J²ûÑïmtySßñÓD©¢‚Vnª£Žރ:>FWáÀ +] _>'e»miç§õÅWB™\Î@TAæãÝ +x6^˜Ë DQ™0…9…™¸hÝFY‘÷nŠîIôŸQƏÉ wýTuäªïMÊ;§Œçcgõå¬æûðOª¤'%Ó£¶øøH3£é(öi¦~Vd¬X×\þ"ËVð8~IÝwƒ ›`÷꒼£G5Y‰ +ŒÑ«Âãl•)ôsI£rŽW$h,ZUև«Ñ~%Ö³¢Ë´Ëé·Éì~PógT)ãß½VÚ~ƒ&£(J},GšÜãҞ•D‘@µGZ¥„9d‡N,ÐJâŸ:¼¿ +XM˪Æ©˜QCÃVO”üȪªý\u®Jdý&WêcXݚù–Öô”#Y5XÕ¢‹È͉ßë"B‘s{nFecy°ƒ;÷C“.´*¿•¹ÇÒ [† ôá¥M u‘õ +M°LÄÔ¹Ý'Ɣ°±·=²[7ÇÓí¬ï—£ôÒlM \#ðŽỖ=\u`Ãí®X{º?Ç Dú´˜?D0¿‡¥v›s‡»#eMAåeGi:›ÆE2rUJ4¢oxR¦§J†ŠÎ¼¼Ï]rE?žø¦z¨ÉÑZ¸)6{½ÝJläxc?/!f¸N¡}^”Š2!«v¼%ÂÎY^üܐ–±Œ5êôܑf^I‘_Äà†XÝ(Û*^û¤¾be¢¾=-Nϫų’ï)üÊØô2ýÜ)GŒ±ì3]å)¼ö™æ0¯__ÁTš×(çZ€‘À’;­“G¥o­yc._ȔGÓ[Å=¾96JJûi.=©‚ܾ*÷†rœ _ä‹ýs +{{q#-žVéýàj©ùQ4z~Wö£^ ÑCñõx߀jy€Ynùƒ÷Ç…„ ?ä)LN–1ø¦)·ñ=‹€E Ìè +Œ=FPÃEÐFAÓnk{Ž ?Âa¹ŽoV¯U¤²áÞÇ0E¡Ê=f°e€ÆB?^ŸŽí³úN˜îànô˜ +óJ[ُ‹=(ÍW¬€ãP?Œ…âm:¦¸”Š¾6‡Ý-7’qÑ9QuBŒˆOæרh³‘vVmźKÇ X)zoè”ËÊÒþ?Gç +endstream +endobj +12216 0 obj << +/Type /FontDescriptor +/FontName /QLYQLD+CMR10 +/Flags 4 +/FontBBox [-251 -250 1009 969] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle 0 +/StemV 69 +/XHeight 431 +/CharSet (/Delta/Omega/a/b/bracketleft/c/colon/d/e/eight/equal/ffi/fi/five/four/g/h/i/l/m/n/nine/numbersign/o/one/p/parenleft/parenright/percent/plus/r/s/semicolon/seven/six/t/three/two/u/v/x/zero) +/FontFile 12215 0 R +>> endobj +12217 0 obj << +/Length1 788 +/Length2 1456 +/Length3 0 +/Length 2013 +/Filter /FlateDecode +>> +stream +xÚ­’yX×ÆEÊ"Z ,EÌ° Ä@ l"–Ä(DöMB2$)aB +ʍÈR¤€ +ÔÊR*‚+Ö E‘EEYJmÁ È&ûðz}®ý÷>3œ÷ý¾óß¼gŒõ½w›p$H‚!ž9Þï¸R¨oÃ¹(»rA Cn4èàíí-‰,×@pÀY*®p¬Ëf²x€©«Ùr“-@Œ¹l: (4 ŒAfÐi`7Lgƒ<¡@äpêòŽx€ +ƃ\È°PÂã›Î"A&RÂ.yBQ0`ûÉfðc?— 7LW0Í’C!À£”°;aä4aù`}=œÄçpvÒb–Ç#9ý£J‹as„ÿ©Ã1±|È(0äB_·€ŸÐ( ƒÍùºêÉ£qØt"Ää€î“ÅŽ'±A†7›GgQ4N<¸âƒãk$¸ìŽ u;uóʍ®”¼ilˆç+ŒýïÐåލÿ¢‘l¸ìD ‡„‹G‘çó*ì«£Ü!:Ì`CLÀ’`и\šP ‡Œ²$€½x€ 1ÀDLDx±ÌC¶H$É@ÌUZ¾N;€õ^¶V”µ=€…!ð‹¶°±~üÃÀ&\xÅøç7»¸À‰{Í­¬ñ€¹%Á°ÂYö6„äÿé¤ó¹\â­üQHtŸu AºRÏS˜¾åà…×U¤¸—vœ“C˸0%¹;«ëžÜ\+êΓá”ß÷ŠC\ œ­«+Ë £æuâ³j÷ù´“¤©q¹Ç»‡Ãâ¤ë:ÄáP¬Á´è­Êï×:'F2»´V *k<5Úô¶ØÛÔÍ÷¥BŸþªúÁÕú¢ƒ6¶$1Ç/=íÊ&+}ªêñ¸Š ëôþÕ£ùßô?¥ü®X³¹w ®å«Í–*ž9²:­ùÓwôZ”õZƒúrÛÈÙ²tU•ËKw[.:ÌÝ\`Xî¹"õ¾§è´ú¡‹§’6¸ïy4ªõÀ=ƒ"b®×ê/ۄ Ï\ZÚ±d\3LQ —î;¯1Ø[ú×ýcc*F’®g¾>÷ $z GÏFð9sÕ/c·SKŒ<<Ôzßu®ÏHªüµËïµYö•är;…Tæ$dÆÜ$jÔ«“lÏIêé>ÿr¯§h~ñÈÄð\÷mfN¢£§¦/ãöäT7±"nZ¯ÝԞ”ÞþЬ²¡­ üm×SÚµi°y×éîŽÆj¾ŸO1wpÿfµ5Qðצ(kiº8‡ðÔl ÷`ÎÇyqTd’'óT—º¥§7§ûfâÙ”­¡¨N¸ÃÕ!dÊ,>Ñy-¤œô𘄑â5"J㘜•jíu`AÏ龋Çâÿ4¬·¸{Ãÿ×W·kf$>äSÏÄ<{Ö8œü-ùçrÕÑT(’9ôÀRpè`‰ 5tn˾beÛß´*ž¼$ò4¿¥Èpßöt¾/Uŋßâ¬T»ð ÉͱãÕú¸ö¸s8Få@fÕc2û#±)ó£ÉœJÖÅQĺ«þ2ÚëÔMEëZg.¿|tΈ¦5-´ó8à71ì„Ö=PŸ¬okÖ$ò\¼Ó@‚‰ZW·ÚÿbÖjæaq Á ÓsVj)@yötғÜçƒæô»áÚ&‡ ú ²×Wö¯¦ôÐûÖªæëUêsp\÷[eP²§Læ›TÃÓö¦6é_§¯W«Ÿ‰œN?e»ýjQ‡Ÿ•´0ÎeŠ|Ä¿‘býöw'.‹ÛÚl} 3ß6®“öbö_ØobZ…y8*ïíEíôå߶ùy_›qºîkhl»9¦"ÛwoÁ:eõ™Ÿà掛Å‘õxçIzɀ4“ÙgT’í4ܱ_té…<'|SôáwÁòþ?'æO_Þo±ñ…âù5Zï0äàÆ_ùÙE3‡ËÍóBïj²vízî<_؆N:\ÙFzL™ ^¸êàd¦\0æ4ûû†ÛÖ¦%X×ÿÒ);æòúÏÎL¼—`ÞÃcp ¥ªté}ُér“Ézoi/ŒSteËÞû’ÛÏkÌåçËf£R¢ 3úÖ°úwßðÆ<.t7V…ÇBFã3þn Ø’Vâ\!Ÿ²!ç‘é~°¨4tš¡˜†âNŠ«†Þ[µ$ÌJ™{^K-áäñP‰‚g9ýjš®(n@ÒLl$§u傌²[h'ÔT¨L³LÖEÂ8}Û·´sB¿ÓTQëh/)k7¬ìÙþ­½ú¤æH¬D•cM@­Ê…ÏÏ8žg4њñ«WE—_×tql­›h.óßxüÆü#Fތő;xöZ_êˆ¶Ç =;ùE…“êÇéPUnՃjÅM—̳Ǻ–‚[ÊÖϺ2áÔæ?nލ‚Ë-ê®Vٜ(nð·D÷tM!e­žÉJƒÖLã+˜ +߲ێŠ4Á++£'ÏjäÃ7ª'k3YœŒNïÇîD;µ¤ ›7³%ßëÌX܊z-zl_r`]çU}Õ6móaïªr2K­NŠ£á=M/…Íß6¶ìO$ÕÝJ{µïfŽÊ¼ú-mS)mWé¥ +uqAPù\Ž¢Æ{y»H!?Þ÷JA«Å%7N¹× ¯¥úŒßß]=š/'Û­ÛLܪW¦óê^ó¿Ú­ÕZ +endstream +endobj +12218 0 obj << +/Type /FontDescriptor +/FontName /LYFRJR+CMR5 +/Flags 4 +/FontBBox [-341 -250 1304 965] +/Ascent 694 +/CapHeight 680 +/Descent -194 +/ItalicAngle 0 +/StemV 89 +/XHeight 431 +/CharSet (/P/one/plus/zero) +/FontFile 12217 0 R +>> endobj +12219 0 obj << +/Length1 976 +/Length2 3441 +/Length3 0 +/Length 4077 +/Filter /FlateDecode +>> +stream +xÚ­“y<”{ûÇEÊVvŠè¶•%3Æ2ö}ìÛXʒm̌ ³0FȾ+û®AÙNÙ¥ɾUÙ·I"©%"ñ›:¿sNÏyþ}^÷?÷ûZ>ßÏ}]ß[Ln-­"¸¡õ x’4Qtͬ $Ã$&¦KD#H† ¡Uˆ²2Ðö»ÈʨŠœ²ŠŒ,“ Kð$b®xq]‰ŸEŠ€6MÄ xÀ Aò@ã¨H°& 1hR ÐÆb«Ÿ¾€ÚM¼ŠF˜ …A’7ô ž üӏޝ(þFùyÿ•ºŠ&úRMâT“Õ"Š€Ç(´;؜@= Muò¿0õoq}?,ցû)OÑe8 6ðÿóœ· MÌ(4ÿïR[ôŸÖÌÐ(ŒîßY#‹Ajã¯`р̟!Œ¯>&‚cHHÀõEÿŠ£ñ¨› Ží—°=\ßÀ&õk›¿RpO² ôþ[ôgí/†üÃÔÙ1ÀeŒ „ZH}þzsú×Qzx$…ÁS¯ƒ@‰ˆ@&ê½ ’0x:@Pý‚Ax‰ÚPG¸ˆL?—IÝñ3ô')`·¿ "#€Q¿!£CŒù ©½ØßPãþAU +ÿR¥£<µ–€ÿM" €½CyLü ¡˜ô7*P•Iþ„ßÒÔOòû©¿ 8àŸ£¨.¯¡‰–ÿ÷ÒttAÒÔiYª.¢,(*ȄüG!ҏHDãI¿þêêÿbw õ¢ Ñh$Óô©í™S[ªW2\A/yDçJCªùƒöÑ権´#Ø;}&>’¯îÛíU’9O.Ó/Ÿõßç÷½ÑlùB=Â'5wü`ùªë2ùÚc~»Ïd³À·ÞÂ;QYŸÔm­*±yÕ_ži_ÚS°Ñû±.³yw|Nˆ¦ãòՇyÑPE;}2öb\ÌýsrBVl¹>åñòq¶Ìô£”¡¨PÏ8†F©ÙMB³Ç^ CaƁãÖû­Ë<ùãP'üàø¤ÇëHH4”’?›X’œ÷¸i¯:¬9,W.5?¦žŸ€ê5Š¤÷-ð?,E΍Åô…ðîºèˆ….9¶5<{,\xF0’¤Ñÿíè‹Î¸ØÞ úžõöîo¡ýkœ”ùù¥£[>½®œ€ïJ^³Ï»¶øÛnšëÏ)Šé²‹× ¦Þi†º;ç°p¬’/³ShË×á7p.ËÝ« L; ›Ž_öKC¦_¨]ûÄmy$D„ó ã›)=`cEëQº§†TjÂnšª/6}þ  _œš0ró_8t½z€zVÖ¥}û.É@)¬¹§Ý_㚯žã•1ÿð8y.Ø|×nW‰R¾m¹Í?°“u‘ž 믍¾ËŽËeP[·9aSmˆ%uÛî{« ¥Ežþ#çíðúcKë™ÕßÚÒþ`ô Ç՛?w‡–GåŒH’2@ òžù&Îï­ûÕÂ+&ûâ‰Þ&3IÝ/,¤ÎG·&|Õ£ýX^;–(” Bo–yϖp_åçäYº¿þ¦°¢. 8 yÁ|ȟ_ßR¸§"QÂî_ïán[D ýpÒaµ{to¦¨éô„Ò|þ¦}•¯Ø:ïãs©u¿&ÈÓ#gX÷n6ä Úä9ê‰$ ïQ¼nŽÈUaÄ¥7¦‹g‡_3(½3í1^£úÒ~˜~Kš‡¿ýÞ^/Ý |šb¡J~÷ýžÂ #Ç©û“W’B >¾ñ·æOh´œ_T]/è?äKhV½=½ ´‚9ÓH5§öCÝGçÉ»•è°ÐvcuÕB{Ãî)ÚOz/«L×ã³Ð½âÄJ\kú„üë/å ëF§A¥Gß2¥ŸJµ¬×ގ‚s5Á›AݜÌ7úݧ1B½jS~WgS,cwq»:>eü’›ËU»=8«'rå˙kÛ§Zš»o^%7 +Þß.ÛB2ÚF(%Ëb È¸‘Ñ ÕOâM+"ɉ›EÞ Lä´v‘^wk<É|hWN¹¹f\”ò¥Yï½ó˜öƒvNéˆü/ €§gôÒ¯}¶¸…å½7¶Ý¿SíښÄÞºÃwŸ5‡Fj'ÂAíµ+7}“Øë¡ÝÐ@Æf˜žˆ÷\EÍكà +dâüáY­Û˜Ñwá‚®ÉóS’ú#¼s,ëZ5f˜¹ *2Z6z«™6 Câéùñ™4€©>ãþ,ñ%èýìžnìJǐµGŠé’¥øù(S Ä×9ë‘ñêô}ÑFÖ3—ŠÖ.&Žs›|s+ëo].1EÐ\i'Ê5ÛšzÍ­}ªø–ú/Y¦#5æ|sk(…dyÙÁtdªÁWt,ÿBò[uÔãìS èXçMœ¡¥ÿ>áx¬‹³£¯6ªbuª¯¡[WhX8VñÐéÂ×Û\E(®{N7ì¾¾k£Unèô÷jVÕ|uù2†ÕbTˆ§d#uˆó3H820Â(h¹h€~š•¢h:L+@`ÔZâ­ÀG¦ßydhœ°£¤6T–1Ww¦±WÆÚUß±“#Á¦­¸^Þùâú<Ü “nóaE[«n칄2¨þÙœ¼`òm2ϦJúďÜ×*·e–ªKHõv•B*,“1³ÇU)ÈÚ6 V?^ØÆ‡Ê ZäÝyžiÕõJðw1n4 +ܤkÒi"¢D‚br'åÚ{i;á²_Ôþzùó’¦BZÓ*Ì×_Í۔2Ýyðxç,‹Ù%¨ÿ«y«ï ý3‘ë“ ”xF¢=_s•ó÷ªü”C6ÃJ;†{ŒFŠÌÈÁ¥`ßЛƒ5»œÆ\¦æUä} ÷Ñ°iAgëćO‹®Ï¹–ôù¨ ׋^;=À] ɬKÒ /S¹0·§ýN/p,´Í¸,ˆ¼±¢ï™“Ëq¡F’_P7R?u"—ب‹¿H‘\!× —®žUs(OŸ ѕgl§ðámÝ?b=Ґ͓ãÛ56º¢B‡íéElœ§*t`2ÚÙ½0ê÷®oIÉn½åcÁE|ª‚^HôêBdEEdÐôfǃôB•’œ[ (–{_‹%iã s៳]p£ ú|x¿Åªÿ°ª¢ é’  vf`!ØÅ +¼Jåö§ç4¾ìœ5ënyd׀t4Ÿtã'mhð„¯kf¬ÑFԈ›È÷“²Íaߚbò]È!úùoCe配À ÃÏ]Úô„–÷Ë,hÓ ï6Ùw$k~¶`à}¤ÀyóþÐ+ñ·³òïëq>C; éŚór?\¸Þr.$uxfIM£_µ—ì'v:µŠ=mãìýÍb­U]/¬\´ôz :½tBiÅ~ÙíöStl¤EèÌjFõz—UPƒ@؂øk…6ÅHæîaWÀ+í©ûm.؞kÔ)ÅXɔ­¾Gì½FDk\%ä|ɾ'·±LÙƄXù­ð–Q4û†Õ8­›e;1©:¯b.ÌDÁó"@vm„ig¢ýlçó¦Ø¿ÒòXp32‘e¦ ̝ê[¯²sÛ_ñT.` RËð/Øx`±æ<Ùµ^WSÛéÜÉãSo("œÍÇZTÛÓDöNr…OÍÀœ±·&»J Þ7{úgIÈèñL墽”(’Ÿ}˜û#rAŽnR +ŽŠåÎ%ÖkvªÅ t7YȒ‘)&ïô™_ +¯:4…½û¨íV)5lf[_Öc£Ú‰kh)½ÉÛó 6xÍï%.ñŒ,h>ʗ—ý¶Žè췛®ÇÙéÖªÔ¶Ù²Ô¬˜.Ö®h bùŽ‚:͇ÌM®Šn™iO7•éõΚ⯇½âR•¨Ñ`T%"•¯ÝUnx'µs"ëÁ©Þ¼ì˜Óº¾ÁðFϕ7ýQ +›þ­Šobw*×GÎÖßY-È8ÆÚãþñåȪK“–¦–Êóòâ]]wÖÁ§Ã¦‰,¨°Ï!»±O¬Æ{.ôëŸä €†¿yuÄÙâõÌæêìâK%ò[²4 굶°ä™¬OW¡ôû~JKÈ¿VC͂†Îø@oB²/ÿ¤nz>~Å^C°Ÿ‡·÷ÙËv>“ˆèó¤•qAžñȖ7ß +ù‘Æf×\Ž£´ðrfü¸ñzÞúÿajóÏ +endstream +endobj +12220 0 obj << +/Type /FontDescriptor +/FontName /YPFGSD+CMR6 +/Flags 4 +/FontBBox [-20 -250 1193 750] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle 0 +/StemV 83 +/XHeight 431 +/CharSet (/a/b/d/e/i/l/m/n/o/one/p/r/t/two/u/x/zero) +/FontFile 12219 0 R +>> endobj +12221 0 obj << +/Length1 1183 +/Length2 5354 +/Length3 0 +/Length 6087 +/Filter /FlateDecode +>> +stream +xÚ­Se\Ôk·¥»CF``hDiNif€Áa†Téîné. A )éFº%$¼ã9ï{ôžûõþæˬ½Ö^Ïzö³ÿ\ì:úwÀp[ˆ*ÜÅýP(PÒғ…Dˆ¸¸”w(ÜEÙÆ"JK +(€¨(!#&-# +$â(Á]½‘PGw¯ß/‘$@Á‚„ÚÙ¸´lÜ!Îh;@n…¸{ `0€Þ¯7€Ä ‚ô€€…ˆ€@jç°…8@]ˆ„åQw±‡$ÿ.ƒQ®ÿ¥< H7t(/:$ wyÀ{"áGpôYt’ÿPÿ6WEÁ`lœÙ£gôXg(Ìû?<ÜÙåA´à`ÒåßRcÈßÑ´ `(Êù߬º» j§àâƒDþ.AÝT¡^°ÔÝÎ`osƒüU‡¸€ÿ=¶¿"khh>0Õøë5ÿ¢tl .îÞ®ÿ˜þÒþ…¿1z6H¨ైˆ-DÿþûÏâ_G©¸ØÁÁPô:ˆKlHo"ô^ ‘8À€º€!^ˆ:¯° ÜÝ@äÀŽ$úõ˜R €°Á¯Ò_ý>Â6¿‘@Øö7’Ûýƒ€""að†ü%~! +ý°¿¢aû ¸A=~wˆÿ¢á(ä h‰ÃP ý¢³ýéŽçüÑá\~{£oåuüÁ£óÁÿ t3üÑè0®¿i´™« âƒØ»ÿ®ÿSý{¿ÿ)£S»ÂPn˜¡'üǵ€áßrq´‹»#òÇ Ð§¹{Âÿh@§Gý†è¯^Øë÷qè1ø@Ëÿï**½|ïˆJ}Ñ÷HŠ‹<û_B;} ÷¿>oô&ÿÛCÑ{xAìˆæfàv²ÁNiM¡åÏU +Ç*pù1^Ç?jè˜|G4›€ +Ð@ð/כ|¯Ì¤&ÛÂÝbó¼br‹|ûTwXõK">}úfËÃz+Óç “ÉI¦–÷'WŽó =òÖ¦©Ó}qLí‰åÁòdÓ¢žœ£Þ½|^eƒmüEvŒÎǍYÁ’&ª™0ðzn1v=ŠtDy8(lɓ"9gi4è¹SA³ÀÂ1ü-Šê{!A^ҍùYó@kî¬ëx·Fô´g}ólC=¥®ê§žblIìÔµÛF’ùÞYµkG¸ ++㵚e…„¡…(Õ˜ëµH÷WÔ¬B̒Š_nÃ7–š§áRŠ×3ü;‡7Ë`5c§ïôlŠÑ@7½êCO8yOj‚¿Ðßݤ̾σ(P¯èün %âot¥°þ€Azo­]…ZîB­@C;\"÷s?¸‚ãÃÒ=ø9¦âÇøÆgãgDV¢!k—&Çl}Gdëðçv±ù¢QýÁÌÆU'Þ_€lÕKÀû? +Fðu$FJÅsXã;¾…vµò~W™~pþ_s‹ÌÖI;¨7wWFÿ6µŒ—„°Hl̐ÿ‰úšäpAËFbຓV4mVÊ Ï»‚‚€Úòù½¯l:JþõT”£¹{”Bï3ï5¼“ðÏíå…•ªX64{O4¾SM¨»-•Ê­Æ1hJ»ygúÆɽN >“Ú –N]”Ä…áÆDƒ‰¦ƒÌÝ:b°î¹c°…¯|ž.îá¦ÍÔo4ȼÍYµÏS-ÖÃQÅümÎ¥Kê]µñ´¬Þˆ¼*wUÅiˆ¨ª·­"©,’µÝ›—ö~\»I3’Ñ©X;N “>q°-`5Ï|øœø«¶<—Q„Hõ9ñR•¬Ýé'S$Y‘{¢Ä(¹we"O×õƒãÍU>Ÿ=…w†FYݕðZATx +Ÿ/q>9Ή=}] +ï'šäìô Vǯ”´ŒÛû¼L^ïd÷îæãëßß.bÅákÉ3m¸°å´ñoк72+¦ÆåÙ2¬Æ¯Ù“í¢Ð \D£¹4Œ…ÅïœÙ¾lٍ¶HOkϨÇc³âWäÿD¡^4Èô´ }D›)qÄԜöñ¸pDP'•.’A‘“÷Åý]Rq1ïùæ7Î;†ã¬ì#GŢ딵ÂÇ\$(í?Xöæó~­âÖ·{‰á§;7ÚíÂQôbj¡*TV/Ép_¼"õ4uÑ?çS„ÆÞ­ŠCí(¿ÿH|X[ŠŒ¥­Ær€ ·ÕZýÕ¬0=&¼S[‹;tô+Ç'y5„Ÿ':JÕO€£òy×r]ÖÇàn­—äFÿu÷*ù¾ñ&Ã4#.cíTº%C‚™õÚ«‚!Ô5ñ¥âÉ xv')Gq:RX±¬@ž¾x@Â.Êø’»æ¨ý’i¯CD/Ó5‰qæ»·2æ»J_wCÐNÂå{‹äG½¡)X&–R¢²Å9‘~$ܸ<áÝMA½;•™Y¨Å‚èŠ$¥Jr¥ÞA[hB€ÚOo6AÞwñõN†Ó''ÔÜw)&ò+ ^áºÄٌEƒ]+Ÿ,ÈàÀVZÖqVÇqb³ÃÖ2[[Ëݚ5í·dä!ë©z„t§¿#Ôg’—ð^ÿÁ!À¼_DoUQ„m‘Á8×9¨øÚÃèX¼¤@P£½o«Uç=§o]b‰ìŽgÚæ©çÞw”Å¿;”nNJO`Ô)¦qp!8ËJBÍÉ©]Áܾ«8ìÊdÛð¸ë7¶mÚ¸ƒÇbÀJOà$>çK½°*½Û,ÉÛÞ\׬Þî“cÕFnéw`B9I«yƒX ý›%›íŠW¾ü£Å,qŽ”<âü2õïñð¥¨üyƒ¢"™´ÒA7!%‡ƒ¼/-p+Dö&òj™¶f­j‚cäÙKTue[·-52 ë*ý‰ 'h¾<×mñ˜È«R8ÞÞ­²E‰A¾mŒÏrä²wùªL7ù\ìô¡¯¼ìkҐà‡M"iŊ³ƒcÇrÉ I¯­GòÚ‹Z9ÍA]$9«J[»æÉów¡/;Ê°§€ÛIo­¾Ä‡qü¬(6ªs†tÞyºéaMbìN9uºã vg..©Oácn×M¡:y*ÁDàIzˆWxªwSûiÃLï-'òõv³o`”Ü^ñ§üà'XàWÍbL-wÉY]„VØ@̔éqb÷w[ñÜÓ®¢s6WÏlҎÖ$= +˜š]Iі:9)æ`½_~FÝd?V†P«Ð!69ÞÉn©Û ÇZÐǢ€¥§òa>¥¼6žêªëë 8H]S²è°Ot&Ü÷j÷sï<Û·çu'…ºbûã,mD<ž°(õ²Éš58æÊWŽaŸÿAËýL~<úú Wm£ûÛ¾¸°L+¤[¯õ’ßU\¾ª8äLØq‡w{¹±Y¾UtøBH:H¨$­ßæT|íž/œÐ>Ú:¸ÃtÖ?ÞZsߊ!PÿƒøýgêîDÿ™ª­RÏÅ4¯yYב‰֙²Ë`H$æKÖ“¥S¶Kj?ä¾1»:çG&WÑcdgË áYy}Â^ef•oÛû{ ¾q˟ôÓy~ª_IŽ"œ»Z´Ýށճwžu•¸,݄™Nk|U¿1\Îütjܹ)*j`½:T õX-=úÚYõùÅ ~¿s‡Ýû[§ë†p©š¦ãÌÔå×ÒY}“Ät'Ùy=Á YBêϼθ®Ö?ë²<Е¢©æßõÆWPžäS  ý®^£ùDòfÂÁ°äsoF· ¯3Öė÷ì›<÷Jó­µCë.ƒ×yC©Ï::0¥Fћ$íë2vÝ¿ÒÓ9Ù©ƒÆ)§Y)ˆ*p7æ/MÅm‰¸ÒÀ乞•Kóí&:…ˆå}Øð¼Ö U'¢ÅÚe=܊™0Åó¿ŒÙÈ'RØÚc^åeí=f +†îq²w³bXc/¯ >£*çꡧLŒÖkÃB2G,tOv²eß \øm + ›¬”³ŽL£Ã*"ªœ(µÞƒ&8Lí€#¶_m_ÐL„pGã2¬Ì­Ö÷Ù!fÜ š “z³gf}€™- ^ümfmò¦#’ÝgÓW9VÁ⎕Pý ¿½ìÉÂØCò »“§¡]=ü5¦¡Ìg®‘2ÜYË1?<æ×WL¯mɳÍ+?®®-y®×~l÷¹%™,^tÇ~€Ôc°"«šiÇX'—('}%¡~7ëzÇ?§¡r$†‚¦vuÙë-B¨[„¼ƒh1(¿_+ÿÃãÓâC·­¦WΕu/•¹;ŠMpø§<‘ÍÆ>ŸnûH’PÈÇ,IÐdâ?½B0“œ…·[Ì5Ó(’rÈx–ñîšHÄDƒ,½·Ïëç%H—9;å2<™Þh¼Ÿy¼"—óQڀKƒP_Š:gÅZ'”sôV£B#~—Ó÷³™¾–`zÅ8T{‘¼K¥?ŸÏU,{5äŠbì§ýö°á›¯„’¸`›ń¢ì¤ñχa‚Áy·W1àî5f%%qâ—\§O ÉHšVnˆ§n(Þq˜Ÿ)oÅƲ>¹[ÐpJt«že¿Ž?›”oÆÑ&›í×^ýiº#Êi¯}Ìܚï÷]Z¹(ýPÌ/ ]81;¬«) 8±%üÃC‡V7ò-ÔZi~ìc܃¬¡ä'8ùJ´`¬]Èg§a[ݽòÐKÆ7\~Óo§KgoB¶OÀGg”\96˜Z,Âïyv¦ Q>éÎA±Ý{)ôe>‡e{O«qÊvQtð.V!ÚÑ:òí‰ßjK>05,6)'&:=bL—$Jt~›#Ê®q¯ºhq»þq2ÌþmaÄe*§h¾åtý½¤Kqœòj—ih;ƙWÏÙk‹böü‡œAZ ¹ƒ"?œd°äîŸûª¬ÃºJ}d&Þ¼cµÝ‰*Á¼é'/ÕsåVWj‘n¤PÔå67ÍϤ_ìµsLÃÛ½ÈÐåõ5¢'o“{BÒès#”¨Éh®õÀ’*0›õ ¾âü[cٔæ»R;Ü]ü):±ó‘sa&]‰óùdÍcF¾{Îć,½=¨9iE=ýÄŶ-¡@Øü*<Þ:q±Ÿæz“Þ€¤T£ú2ó%…ò›í‰‚›u +3à”²´È¾2M.tÎh{¬ùÍ.ðâ˜ö±Š iµÒŠ›5U§äQ‰ÅÍúlš*S„ú­Ëã÷(¥vXZM8Áò|’.ìÙþmr *¾ËÚo!QXRÄޟ¨2 »9z,ÎYëqGt‰GÂ,ó*©­[Q½ìˆ`¬¶¢ܞêsÓiãøµÒnmñօc_faš}Ò´9DD摒+ªFYýÀÜ! ÒÉKÉ úGöer:ä<܊fÌ®®EӋD¯£ù‚¬q¯u÷£¶Š±øim‹¿ ޜSL7}éë¨à"7î¥æ8\{A­ê1"Ði¾?Ê|ûŠõ(ÈüÚÌg/®[ £Ç|Ââ®Lr'áàÔ¨b¸¹À™/'&“ÍÞaž:Ž3o讑Ã=26üòò1¬®Úk”Qj©_“Zp—°¶K[+Çd{oÿ‹½7aA†Ób/ÃåÂdÒ;|¾#[T^püó®æj¥Û¼qÙ¯\-Æ ÂI¬ØÜd0ðÚLFPT¥óï}ÏQCÞ?¹ +dŸ2–¼¡ÿQò´ÜŒ‘øÖڐÔþ åÿæóÛ0 +endstream +endobj +12222 0 obj << +/Type /FontDescriptor +/FontName /KKLHYL+CMR7 +/Flags 4 +/FontBBox [-27 -250 1122 750] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle 0 +/StemV 79 +/XHeight 431 +/CharSet (/T/a/b/c/d/e/equal/f/five/four/g/i/l/m/n/nine/o/one/p/parenleft/parenright/plus/r/t/three/two/u/x/zero) +/FontFile 12221 0 R +>> endobj +12223 0 obj << +/Length1 1034 +/Length2 3716 +/Length3 0 +/Length 4388 +/Filter /FlateDecode +>> +stream +xÚ­Vy<”}÷&YËN¶Œ‘}flƒ‘%K(û’13˜ŒÆØeÉV!Ù·HÖ…ÂØ"*KH²”­¬I²$YžÑoª÷yê}ÞŸûŸû:×õ=çúœsîûó6³”ÕFáÝÐúxQ*UtŒ-T¨„ILL‡€F1xœ.‚ˆV ªªP@Ûߐ‡Pe5U5%U&1@ïLÀxx É" í&``Œ z¢½)9,`‰GbÐÄ`9@‹,~œð,Ð~hB%Ç…( ’¸¡=08&ð?†8w<ûFùûüM  ~S€Ť$@±ˆÂã°Á +íÎ6ÁSj¡)Nþ?Lý;¹¾?k‚ðþ‘žÒ£ÿaÞlðx¼·?MŒñ(4÷oéEô/kÆhÆßû߬!Å µqX4ùÂøéc‚Ð(3 é ¸#°~èŸq4õo”¶ý´¶´0×µ4‘þ9͟”ƒ#Zûü“ô‡ö'†þƔÞ0A€DR„”çï7§•ÒÃ!ñ( Ž²Jʂ@@3Qö‚‚”€P(€Á¡ÐA:ˆâ,‡Ã)GJK.îxӏaR&FüýBPìF@ ½ÐD,ڝøO +`Ô?P™"CûúSæö@»cþÐ+`Ï?  +þC QÀÞ¿!eçÀø "…Äãп1¥´‚€Æý—#E袿Öëw.JaÂP ûý•ðo±%31ÿMi†ÿâ:àwE + +A~ÉÿwÜgÏâƒBeTYyJ^(DA€)A.ÿ—éO 8&þü’(Kó7vÇPV B#™ÞŒá‘ð˜KY qázÅ/+i¥¨Ïz4Þ4©ïi;=‘B-ë;ï+5Sg»_•ËɲD»$ø—€ßõÖ0óýõ(ߛ٣‡K®K¹!$Û­\ãàE‘oÑ«¬- ¯·?)Q›¾šé¯H·+yš¿ñlõŽ™„®Õ2ý”0U§CÀÃμe˜­~.Ö:>¶N\A؂-Û·âªbüt [zêÑé¡èðKñ Mғ›øVŽýb†Â´CÇoÜÉìÈV!‹9).‹eÍOwKâÙXk¿w÷Ü×Ê<, Àí[‹>Ãèθûù!üz.Ã<ƒzWÖeH­¶Âd1e§™²iÏ£‰RÈFj1¾º!xȶ™<²(Há"ñ»ZsK~ºÅhÉ& JêùÊ\4­Þ#"×OñȊ™œô8& <3*Os¯–#Å#UpBƵ7=û§½K/´B{‹åéÀÍ£LŒrÖ·½á,y< +vöï>º¦íÅÁB2éŽmJÝy$6p»\ûVpÔH¾}Àú®ç4’=WÇgW^¦ÿÓÕ¼'å¢ýZÜU0}ðûÈ5é"S1Ĝt€Þ¨Z#ç¢Z4ý@r'sy®‰$okŸeòéRíÊ 8"U/àxË6w…ñ<ãUÀ¼ZÖé˜öaš=Ô$ô\L TÁOj–«TÖÔñSݓʹ%¬ë4Ï!<ÑPY¯‚鹂Ð({ôÉ朗"/¨~8yq#øã \Á¯r~6ߧ¦ÍNæƐ0,Áêî£Éoý©WÞ_*åyo s3MõÑòSš„/-†šð«F'Ÿ¸$“8úç 9Õù2a§}Š©-°î]ˆÐ ®±M!ö´c‚YA'zÈyYj| +/઼ÜÕ\›ý+JéRŸ^S™x­Ãnº“ @~O’Ò$¸õ )1ۖú±å£y­‹ý‡?¯ÞÑl(gAÃ÷…dXåS“sLAÑHKÕ÷kywb,¢°i«p"f·#מÀÉGbŸ,,¶£‰÷Óé +íÂ:׋Zž–áFÿ*co‡æ†ƒbd/âÂúÖãõ PŽñ ZîÝVìnAn$݂Ϲޘ|+ݵD¢èX`Á"ÿ^ñ¤ l&Énø¡ ]Ž +§Ï¨Tâù¼þ7ç8¥ï‘eKgCa<ÔÓq,Å~Ã3 +|Ã& •[´é…c^šߧwÐÄ ò<„³³4Wª³g§¾Ý~¶¼ƒjȜú`°_¥«›êÜ gÐd/½üX«o“•&¹í|®&Lžd0&Ä®-Ñ|Ci±Ê‚ÚŽFÚ9°Ú °hWâôË8zÅ‘m°2/~ŽEæ<–®­–©:ʉ1$9BàKÊ?vªjXèïµë¤.®’ ^×6F݃˜p. ýuŒôø’C]\ٌu¿æPú¼(GxÖüóuP@®Ìf²‘ñ¥6Ñ­}mªìX¦À¾BßùfºÕÖqÃëåð«+É×ü\¢}•Z3Qý;•i6·†[ÊFòžÇI.痏IØܛÜ(ò‹Ä]#ƒN•Ù6¼KR©S*ÖÓjMP¥üˆÁ¼TIüjсà2ìވë|ìípIéþ´sdwôͲ!â«qÈԗMR ý îûq?g#Y p ;HàîÇR8(׶ˆFV,l³ÃŽ0zÚQƒå™zÛÙܶcv/vªnì0Ò®ñÜ0Ãû‰OZNa3Ž¼zn/dRøîH½iý›îx`u¶r×ZBæîðvý¸/ £vÝÚºv W-2¦Üiߙg^4*ñ6ÃHù³v¼òŽøÆÜ÷>µ¢£Ž­©—½1è43ꦲZ„ðMD‹Ò9Òí^-Íhtð{>·nè÷´Î5ç>pÎòM¦„>áxøi'3# +£§Îü¼Ä¤ÄE ùj™3uY¦9’µ?֗ôŠžÑ7e¾ ¢’n©ª9±–“È\ßõő™/}ÈÙôÖ|jaÔk0¼*Ê+٥ËO šé³áf–±‹oYVkèIo*À†>SŒjÄ5ùã@#òœKŒ¼]~v½qïé +Ý.sÔq|9ZéÞ¸:«ƒ­ n¹©£-&™Ïxû{vç‚Êš½þ:‹®f¼¤­i~(a§É2Vâ^ݎ´3,ö¡hÜ`ÝþkŒ SUÐ%w±óMG6»$ÒÎfT™R»zÜåé¶^5¬‹-jŽë™Zi|õ»ÿqGrŒ³^ˆ¦¶b¡¶/Çi,t’j49c“:²³rZ—h¥¬²¢œ¶´#ŒM™™ÞãÙiY/»é ZA…ðfïI L©Õ.bŸª2|)òp­ <8ސ5ÒgŸ«¥ßÈٓ™ÿxfpÕ¿¯Ø$+ÿƒ±“„85i¸;86!löùWš´$Økļ#|êóýµ±Ù'™oÝËFUl0&T|UÓÏìÕsIäò-Ò¢áe JµNÇûc^“;ÒÞ3*H‡›ž9âšÅ“æÎÛ~ÖEW^{û•õÁYÑùræ–Qf«á6fº¸Vk0¸W^.Žn½g¬ÜŒ®Yû‹=É©Ë-0$H¼|YKËmÂ07Iû„GþÎf ú‘ÑΒ³†èr›og)[†Óäì ´ÅȓƝÉ]z:#6bÒÄ~ÐT¬Ä¿|œùS¨­y]d¾ip𖎤aöýƒ7ýò½»ÝM~Ev«±!ĉð›ö¨J´D8XšË0Oüò©ì¡W‰ûNÉ­ðٖ²ÅÚp2´ +éýæÉÅšE%Ó(¸è‡ƒ»nDûºï\ŸÏQkÝ ¸nä‚«ë`õù,ºvºÑ|þèEËÓÉÃË÷†Ä=? fÏ2vÆlØú|Ô$_0nH±>Ñç<@<åãŠáégf œP6*ӏ`<Ú6´VS‚òü|ÁD ==?s›àJc-ÔWw[reû„vÞØj4zl;ӓé˜óuM1î=/ŒÔx;›S+0üD‰b/çzùEÕJîùõjµá³‰­²6Úš å%Ï°wã{w¤§Ûd‘¬§+7¾h¯WêÍXƙ4ÆÏtñÕ¿`4/Ud6QõåR×ñwh_åŽQÌ,=nyA/®p õìp–4õIJP²®oƒœVnàá²ë"u°qٚñd‘þ+h&°Rû¦Ãk¼ÞÕæB#È^°œtKÿõpšèˆ2õ~þiA®*%oîýAªøŠHÞ*<Â"χ֤¢O*z_ˆƒù‚+±— +*-ò­­7Œ% ›¯†Ø; +šÆÛӎÃeß&¼[w ë ŽæáT‹“UÚ©x«§?>©çv]ÝFœk¯×xZê,Õ2Í%ŠKN2¤ßÿŐÏzÙ«ã ¿’DvIê'¿òÐáÄÄï~»4ž¿{iõ«JãTÉ9óQØ҆҅ïáR%Ëõ}ØkzÊÙÇæ·;j߬Ýüèô29(âM(£áÙSáׄ¶+œÉ[DÛ3ºä ð|É×6èô[å±}*L§\M<;Odl¼_i’ýñïVýÏݝçÁ$÷ #¿ˆšeUÿlnË@™ZÉp=9wyPrjQË÷&‘Aõ’îçÁÏÚw&OÑ4æ«$íò»T¦¥ñi3Y?¹|}å£Å¦PÞl¸AÈñzóˆ”I—vs>+ ªtþŠ×=ËeµµsÙþ¾È¨pO»[ÓôF> _D«„­lEx_“µ¿ùªTÁ£>éòølƒÛ[‹]†Ì¼É·®ˆÑk¼ŒæwIn¼frÏçΙ\™z|R`ëûî +dÓôLÂ0{7G»ÇA‹úqƏ>ûž§–»š­«Yg…?› S × ¶Æ'îÁ?>t‚éz$J¦@—ù Qê‘ëi6ß5Kœêãü ÇGÊŒ2°öðL™f-r¬ŒKŸÂµ f‚IѱbFã·Öd<ë¬3QéA‹èî‹~4±Ø,Ø?|®¯Æ³ÅÚêöîþ«ç¶Wë òÁVÎ $pCÆ,«ËXÑ7;¤ çߎ0êÏf1§UûÖÍ%—;m½Ðùúhé"òü.¿•²5m¹u Òíùw +_ØÁ{ú¯†íí¨§0Q{mÍ°íXÚáÁ¢iïá »’}³¯¨3¶ò&28E¸ühçðYTT5¾ÊX‡oÐGg—8À_‰ÊyÄ>ÚË#w|iyà¨ðÀÓiÀó¨Cð~E"•r¦·#ùxBi=¹šw32«‚ZÌ)[|„ÖZX¥|ݗ7„c8)9¹¼¦BÎæJìú³ãqã"×ï€úŸ)‡>=-ã\6__8úä&íU–Ùr_ìü¿hs¢iX·ÃÌ®©V:MhÎhLhûâþÖ§ò(ú…Ö^FÜ ý¦Àk}™%¿i°ÌæÂ/æÄì©V+ÒÍ[ÅÌÌÀg|Íϳ-øÐ(¨‡„-*>ÎÈàzqÅÚ‹¯ hÌóvˆ•~5£³áx¡ÌÚÉC°5\‘OÔb,ý»ÍIÖHΊÓS8ÖI®í]ºb¦]›Þ1»M'‰]#â{mW§ÌÕ!ª2{’¶Ùt´u.¾³Šçvõŀn7Ç&¢L¸§Zk…c²ýý@J2«/³(QâeU²ÎÊóÀ±(ŒŠYý!ó£€ -ë´K¬Ñ{s¿ãõGRŠ|þ‰tÍ +endstream +endobj +12224 0 obj << +/Type /FontDescriptor +/FontName /SRQDSN+CMR9 +/Flags 4 +/FontBBox [-39 -250 1036 750] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle 0 +/StemV 74 +/XHeight 431 +/CharSet (/a/bracketleft/d/equal/fi/h/l/m/o/one/parenleft/parenright/r/s/t/two/u/v/zero) +/FontFile 12223 0 R +>> endobj +12225 0 obj << +/Length1 1666 +/Length2 7374 +/Length3 0 +/Length 8359 +/Filter /FlateDecode +>> +stream +xÚ­te\”[÷6!")ÒÍPR + ÝH—t—8  LÐ) ҍ´€H‹” "%]"„t ‚ïxâñœóÿúþî/÷º®×^kïÅÍn`|WÉÁÍ¢îGÝ +e*ºÆ–@aPP˜˜›[¡ npU +"JKJh'P ,)#",#.IÌ Pqs÷A@œQ^¾_N’%W +Áº ”3Ä› ‚ŒÝÀPÊG ƒŒ~E F$á q$P0 +`q‚‰…~)҂;º$ÿ„ÐîSž+ +À‹ÉÀJtpƒÃ|Gb!=7l-VÉÿQÿM®Ž†Áô@®¿ÒÿÑ¥ÿÃ\¡0Ÿ¿<Ü\ÝÑ( ëæAÀÿëjùSœ.ÄŠvý/«…Á `%¸ ¸ ÿ“€"Õ¡Þ( +ì pÁ?pÜá¿R°íûCˆž…²±ªžÀ_sýƒ4Aá(w@ø·÷6ð·íê °b±ß߶ÿ)¦»9@áNq ùcoÖøP¸ÄñÆ*„»¡°!lkŽnâ_c•)ÿ‚þ´$B*ÿ³$!ß–@H󷅍»ÿےéÿϒü¶°Y [Ø,F¿-Q€ñÿ, °@w²G€À (ÄõNüŸÜŸ×ëoR [{t7/{Ø¿¢Ä€¿‰‡ˆJþÅÀÝØ Bþƒý‹úOEb/ù{+ÃNVÈ« + !ÿ Kü‚ÿ°Gÿ%òŸƒ‰þÿ»Ü¯¬`( ƒ¸¢a(¨;vÞSâX +›Äÿ‡;ö<4ÔƒÀ±ð¾¿po(V8Å>¹¿qlgœ~möB ;J(Ü +‡¢~W”ùb}‘ð¯ô; V + ‚Dþ;‡4vŽ07§_o„}ÃX_W(üþ{8  ÙÃ@¿Ïð 8ý± ÿÓd€;¶on`È/ußµ°Íw‡¡‘ÿ©÷ E¸aCh{$äݓ! Ž0ˆ÷ éßį°P"XUH(véücÆÒØ(4ŽDAaÿ3v{ ¡áÿl´è_È-ø}X‰?à_{ö¯Žþß墬ìæíwWDpWZû؁@ €¤¤xÀ¿Áh۔?ö7vEým;b… o˜xz ,æ’ÞQ¨V4\A DtÞûrsšð­ES`6Ô!ÀX<ÏÝ Uü­`éU|'Ý£zm°l*¢!NïɃ£BªÊW1ù¥OƒÅ;§Œé|BcÒÈ®x¾iuz˜eä„/1Ét –³¢9ïLqõ’æ9l([µŸ.LPò%ñs0JN—ÎãÒÒù̯f;h +Jï‘ï~š¹¯e@‡TáqT ±?¬Û:zŽŒ®)½ÛXò¢wøA¡ÿ¤ÃÚ{›%Š#’{¿Ë¸Ôû8&Éo²ßn4j+®àØ_Ÿˆ¸ƒE¹{~¸3¬gI(!X£å>sﲨóc¯€^µ“ð‚(^ÝZÃG—ÓÚj`äÏ BƒÀ³RУœ×),ªÛ¾Ï[åOMéâu3,¿·v’L´Ò©ǦUΟé \ÑE¿:IkrŽß¢[ݘÖ(^vÅ!eÈõ7´}M§R¿º÷nu!¶Ûèöñ›׋w¤û"å?NuŽYÿ¨àØ;IòK¡°šd¥Xö ¤-IÉè£êüÀõÜ OMÆJ¿Öôߢwccó I:4ޜ0¿ÿÖÛÉsg[(‚my›ä®¤Fl&‡? Ö遽§¶¾OhõÁ˜'J{v>L™°uzGÈ?íLÖâKqÅÌk.ÎyÆ·VaN̔÷¥›ûK•ÌZ^w]M%·^=¦ìí³¡œé$üm¬3Ѕæَ4ée¨ÛÜɛÑT°$¡jåä~AšWcí=w–GØû‘â¡‘/üK*!àÐÇ>€Û²©ãÒ«⺦CUܰ늧‡²¡œÂyFðjǑÀ½òÿÜ%¡r°TßÇ­¶ˆb~Ϝú†BÕ¥lPuKí çM[³ÏÇ- º§c%ê]ÔE#ׇúÚ2‡|ÈÜÉãu’éFBŽy1€çÞ/‰g}#7[ô„¿òϳŽV˜úTúóʟ¬¢>®´Ž¦8P8ÝnN´–8#Œúp…qÐϳfVTèôVîC–´¨òcÖ×ñی,+Ôëž?7&ú)rj"ýñsS¨sÀ&_T×N•0¢”)µ,‘Âá(rªÉË?‡Æ묮få™Ï¿áužÝ™&kQgUÌÙ´ÒN ÷œjg ŽB퐶ô)ÁCM¡½"d¡ èðŠ»uáñN*¸®W”-{0xõ¹)çDDù•ÕY…ÁÊqà½6†ZMº]ë,Ås-ŽD æZ]ñÆ;¨{­õ¢#¿äÀ¬?*v®gh®Çkm}šº$ñ³õúHýŒaÿòxMø |ÑÆ*.;¢øè0Žxú íʺ€ àÐÖò§üÁáÞf?[A+÷RÒwØãêåa¡åI¥47xŸhy)ºÜ½L¿Û­U`gÌ\ŐüSIðy8-<·‹ÂòžÚ)šUU~GºÞtbS w•àÖqq®ÔÖ«¯×Ì´¢ØѺyÕˉ`8Ô@¶2"«ëèތ>ž4*9á +w6òݑ¼ñΈڠÏ=k¢äa˕KBºOvâ[Q³? Hd²D­9˜-V££;,wžó}Áˍ󌻬EŠN™a.Š.tXÁ`}àø–8íØöæ€üvÉãªøïÉeGêÃÎGߚĺléL“Xˆ?…‘’6?L–pFdf|>;ÊÒñ2ÔâîïlÆNR'}®•ù ¥FH5—Ò 2ُD—ë=à™ê:,£ôIÑÀ—°ys'&¨ÇºK•?A‡I;¥¾Á9õ¡Edê´ÈxÝf7íÕç;p­æ± FÊ*Ÿ} Iˆ£M°s|™àiàùn@þSÃÝ2ÃMMÑïËaíÆûÔEã|ï(¬zébqý™m«c$ù +4ŸßRýڊ—2úƑ±6Rá0Ê¥áô¦³:à,&Ղiìú%9y²Ý¸Ï›¾eÇ'[/Қw[¦&u'ÝUu"£Ã™ƒ‚@t'¼ªÑšO©ŽŠ³mc|² q:YrRV Ãüd1»Ï0JЃMÜÂZ“þ‡÷â'Aöc¨ª˜ÇŃ{mÇ\a´€, î|Î ‚ <ê ^ÃÚè®t{¹­ƒ“sSºVTÂÎՊ1ÑM 'Ýûzዧ„ù“­zýovŽdÆ~›*ýz‰Ë˜ŠKÅQœ3‘-Hua. ©“-]÷0ºcܳæL¹”ö.¼L‚]Ÿ_ þ`L|Øå)é—U$NŠÁËzÌg ³ù-ï`ÿØ+‰÷ð à†¯Éרòw ^ôä‘Sâyì°ÈÝLä¶êñÃµò—S[fçûc'²êOÌfR¿,‡-­£•¦ö}¾u•ŠsöÐú›ý <õÐfÂÏÁ‰íK Šaí®°n×ੑ{{z”nåBh[¦ñ¼&ŽÚšiöq˜²ÏÝÂø=ëæ‘2¾¹w󌻭¯ ‰Z+?[LODòÁ^„ƒšµ«ôÞã8ÀŸOšˆÆ“,}Ùµ<[ajÏÖpnwÎYò³»ý«L,cÙðZ·z›2H; UvƒsúV"TÂL¡¾!|v‡™ò܊0_ÎöÚÊÍH´gÍ3Hx#æsð#W…¦ ·ËÔõ˜ŽnQø²Ùó¹L4 Ïf¹0wpˆVíyG˜ê´óBÃ4ô•ˆ åÄëX*,ze¼âÏ*œyIÌ:C5CÑè[U8ÏÖÈì¬ÈªÓªð¹V#i÷:À£{â)}À…ÿ}¨ºÍ ¹R³uUՍ'!-Vþœ×Ã,ÉôÃëL2‘QVŽF©ÜÄøL˜7ƒH˜¼küb{¿¼äã›|áE~ ©–®þù†p”öуr%6tGLâI†t>§’Ñ1-›8Þ\ +õ‡×fÚË䉅tÙ»û¯UŒ`£ƒ x,'5 ª{¢Á)t]Á#ä>’ +kE ŒÂ~Ÿ+”FUÒr ô‚›Òî¹_Þ»='!Dym%ÒÜÀÞ¬¦…ñZèåÖyvsï˜Is0Fß/a¡ä]Ðø’…[GZôî¤nèØ>ãÓóA‹mVáòITÂ"Áj1Õj‹šjŠRvü!wnÂBEúŒÉh¯Mr*·6õÛ(<~s+ 0ºxë[iPeÆ--íä\jM5Ù¨3O"¯-ÙÇ q#aÒjL{´Jæeœ–F#õ4˞EÍ …TSY÷ÙÆtƒ™†&Ò-w×ý™¾Mjܺ–lœòÕ>Žß“—=aL&ßt»g†‰»IÍ©]Šž•±]°gÖ´³ºØÃg¬Yè#¹B{†cFjTFetÒ\w'¾ö®Iµ¿*á˜Ì½áž¿ol­%¥ÔÄuÛF³V>_aöIwð&þÎý8\ê{˜ºtRÒýyWÏü…¹•GŸ¾¿ŠÓü04^0ôi)Õ¦E²+SjúG/Eÿ7®þbju‚·6&u›|÷Ó7©ßñs!0:â.n>ÓÙßIn•¾RA½¤B˧ˆìƒÕñ”9vR8ø²„O3V7‰[xÁó;ñ u*µv¬ËéÑdҚSÅí>”©ì–â·gé‹ÂírI~7ÒªeϺ?a$¾ ?ÎRNV ªjFcN®MgxOåWåîЕ?>ùpHWq¸B”If˜«ð=âIÎþ9u=¯m,Ë€ñ;Ý*•ÌšÑòVîV8ÅNJö ®s€WEqºûž¡ÓûƒA+€šŠ@~è—Æœ±œëÞö\êÀe³Û¹×fOV'æ>Ý@NÏ?—w:3Øßòê9tw¯¤`Üâ*2GïR|´ ›Î›½MTka zá%èÙæiµ H—IŸ¨‡×ºÞ77kŠ‰7³îöákH˶8o>²R­ª’>"®à܆ßà_G̙.‰ÅKTõXmfŸ’ΗM¸ìj“ð}3`é¶×ë™ÏüHF~mgL“–Dd:ýG +ïK×ôÀ«®Ö‰ªÌu£¾ê›°Þ{Ûó´ûÙ9’<îÈ{w£k…˜¥ä(ã3 ZwV†‚óª œ1ÚĂ"ñ~Óêev.²ûc³Ï4Տ´I"ª’ÜÑ¥õ1uhó$| Üç^ JµY[³/pTû˜fø¦°¾¡4O’n.+R '¦vA +o´;^ÞÓî֐½yÅ)´à l}<äoZp¼[ùEòÁ1ݽA³ðgÂuËQtMáÜFBb²æã%·Ÿ¡ÛñR[ðäP¹üwô6Tܞ?'B«êÙŒR|yї¢£;Ûÿ|‡è»"}‹`¾Éœ5JsD¤8œ@U!z²|¸ÄľæîÝäw´™Yݹé…Ö*žÁ}déìöˆûÜÆOên;Éj#Ì©J9cRòÕ;…‚Öôõ[å!||j´Ú(Ýáy¥* ýˊ‰•§›ƒãÇ­Kø¢•[Œ™‰—Ú„8®›r7¿¼e7µ‹FÆ ðUO“ÝrvÌ íÐ¾¬œ­re»/ý¶@R ¿í}éôhÍùUxf[.~؎CŠà> öÓ(ÖìÈáxØÒÜæûhJŒ°€Mke€¹µCÏK€‡ÇáLøo¨4BÝ+pCtv;n²”–ÉĝïR5-Òv)**nʙ¨9½_hñŒøÙμ—¿Ñ%,™Â‡äíþz/+fª¾‡2ózƘýÕÚü³;~ëºU_|ª1ü;¦§¹ƒ–š¥?U)¢’a*‰Já¯IKë5ž$Tijï{Û§u ÁGɔÒ|Ë.Ûkrâs„‡ö•Q…L£^x!ÕîeªMú$âühZïh…[O%Á‹ò„)®úú@Û!´…é2ÈæcÛ-Ü/¼‹ÃDÕåP@RŒ+¹ôâV9Ƀ–™ó4“ÓïÇ”é\ +Ù%[«þqoôTîo.7ݶ¼RF<®dLñ½­lqºOÍpЖÙþš®$^´$°½eØÖqS¼á&›ëŒ_Cæ—OA×àŒƒ 暌;þíì>ø÷×T?³½\;ÿ”ì_ƒ9q;såSØ f¾)W?í`ÁéF cy‡þÊ­Ü]šæOÊ~X%`ÄÆûtzù‘êÍIˆÝà†Óæ;ݶÛÒ¢e]MmŸó~§fN´Òœ?´DáêWí®·%çQm⟬ڧՊ“ùµy|*ót_i¶£Aæӝ@Ä6£”TÒÜ{ORf¯dDÁ!‡ö)Cð—ÅòÛ$ُ ¨è¤’R Wm¦•>eԜ>ëó8Çc?´‘ó ]¾°æèâþ!dÞ*.´äòçrhÖPc§4œÍÞtdË Nxk¨GALé€Óþ0”Æ<ôM1L·à”.S×£7θéæs~0˜hçWÏvþ©s ËPâµ¼u9ñ¤´0ïÛ)…\ø/=Òe¿Õn8:›àÿúú¡µqMóDFYôÜCß €Ê…>Q ʔ¯^#€–üòÓ^ãÒ¯I,‹Ù:S2/¼ÕŠ˜¶òŒ«;!²éþMû¹ZVßnáäÁ)ßҏÌá+èycV»øÚi´|µ2JÜ{[T­‹Ufý(œiuŒq¯xrúÆ©Äh °¬àl¦nËmNýŽ€ ~:yTÚ*ò}„Þus¡*Å9ïðsæçô-MLí£3ý¹«møö`ª$ÂíP u/nLÃYb”šß¹BEï#Pnq¡ÉÃ=£—/øZÎÌ +¥0 Acz=³Îû¬Éx’vø á:“ß I“Ù U-Ž–J"Ûk&üǽþd%7Ìhû÷„5қ/œ:¹(ŒËêp±˜»_CsÂŽqÓ Ëû·"1ÏÌøÏ©ŸsΔ¿ú*Z¢ÞÞùT-åùIsÕ%ÊJáª÷ÆáÐúSê Ú$‹å!±ˆ¡tnFgå†÷•ªBŸ~•–ƒG»cÌÜöåøx÷¾lÙúÃ¥’Ø9ð@Ù6lǏc›;7Ñ?0µ„'¯*ỳ›T…6h9Éá{žØþž«¹È›{¯é{„w×äN©ÍÓ2Ù0Séjl,.†›—ÈŠ(QsÞuӓà{Ï^…õ¨øÐ1Öµ8}Ñs©¢Ñ&ªg1áñž_ÛÕY†Þ—x±w‡üöí¶êÚÇÌâç½…Ù·&ÝÓÞ^öA< ¯Ó¯/&eeF©Z´vVüao¥)E9EKy––û¼ß”r÷P +d~ôL¢Ånpõ­ÕÒ£ÛáH¨­gúä,xy®Uü5ÒÝ=b²äñD+>‰R}–ˆàeC~m\LT#7,h«ìßiÎECäÌ b-ý6v£çhüÈc/N¶^ê'´P»’™Gó'‡´Š¦#>xï]ûÞ†cùxÝ]LTCúE¼o¹xm¬úqÚîÒxëÕ¤êtv¦Á<§õšÏ4,*Ö¾ì¤ÑsEõš[2[4tsO«çgdB$¬3§Ò¦X/©%œ[ˆÝp"âzç˜æäSwcΙ#KMÛ·(sžå³ I‚&·‡’[#ìÎ>êY~1Úö¦n„d¸|êZŒÂ÷-»ººŽuNGÓ.Ø>!„nvv€‘>ì4Z>dëÉd^ÞoßÏL™ÊðXd€ßE›¹)E =l±×b8ÿ¤c›5J½yOQɺ²œ¬©Ž4ڜ6AyA|@WÌÆéxáÑç¢uàP>ÈÚ¬mò%á“NI=ÚOÁÌßÔã»Å¸Çd ƒØ½©~/Àgcý¶ÌÑÕ°¾CÛ®‰N-üɱÉ,òŽ0‘BÜcXþî¢âyƆ͗Õdt$qÔ.aAÌVãOç¢ÀsU.;WðB_oTåÝ"ZÐt#Whˆ¶𙶐ÄmOÀO½VšÓ¦Ê+±wãLUð©òðp}Å`s2Y €ãìŽq0g,³P®½=$ª©žø楣v»ÑÃf®•‚øÛ Üž\}}'C¨Å9úŒ¨XÅS袥lÊîtM}Çê¿éž¨µ2ªbóPPzËa5éxçaˆéˆ¤ÉÒ-Ør<1ŸãśjEõ2ç| ‹íù¤µ©ó‰ÉØpPĵ;¾}vZz—ÛÃw  \ +´ Q¬ø†\f³YåŽêí䞦ô'RòK$ٚv;Vˆ—$}0Z-ûKÈ[;£ìïÕä)ï¹ÍöìœÊI}9ÙD1Ææ.Î_p#HB¨Ee>©N²MXŠðóU?qWÌ;JIá úúqž ÓÈ&!˜µm‰  Ô雛b”D‹ÓtA"fšò4ð‚cUÝ*M·º ¾ƒ2Õ;ތùRKÓ%•±`¹?’û±:2Qi¸­Â}¥¸’›(CÝ<½¢ÿèˆ~óžVšÅ 3µD0ëòPäiU‡]ë{»o\4a&ñWéñìßð#kZô[]ô–gÖ ´Snÿú$žÌKÇ÷ªïÙªD¸©1Ý2¾îsŒ‹D.+¤Uª1Š :ºÞ%O`RэðÕMö[i:t¢Ä6ò„ëßòjé%Ý¥> endobj +12227 0 obj << +/Length1 788 +/Length2 771 +/Length3 0 +/Length 1315 +/Filter /FlateDecode +>> +stream +xÚ­’kPW†Å^”€# •‚`w”’d!!$–"!¢ (´'dO’¥ÉnØl0)bm¹”KiՊ:XPDEñ.r‡‚´P«P¹hQ‡ˆ—Š‚WèÊ8Å¿óg¿ï}Ï{žýÎqwŽû£D %pÊa")^Ç“Ípw!¡”Â\$¥  |>‚u +€p›'ðEˆ?ĉ)”ð +Yd2ñ@°’˜LŠƒH)¥„j:C&U1!à e`‚`• +ĘvhA ÔB2¢L‚“Q *0œÁ2…árð&Û¨N3%¥BRKC/r QW +å Ö*‚> Ò$ÿÔôðPJµJª6ś†ôŽ,Uc*ÿB­ÑQ‘ +I|ºõ 8É QL§ž®†QR& Æ*|“íǝ0m(¦‡hFɔ@.UiáDâètzz ¬Ø¨p±x…÷ä­NhQR §b ØoÍ5ò¶¦gDbz°žÍd³ÚH¯©¯„ig-ÃeŠá +àËõR’”l:ʗËiÀpêÔÓÀ,&NPô@O&È ’aºT6`©1\§5u'œÀҐ ?Õáû¥#q-…©  +Ê© åÝ? + }š/|ø@8t¤ÿÇ'ӑ$Ä©‰'Emª–ÓÁB=”1z: ْÌä]Uه7/Û¥â–ù‹–ÊÁžY ’êÍ{04]Ì-ŽvVPe÷Kïœý¡ÑîË«‡Ë–Î#Ïجú>qxß¼£góJÊ%[·pë™Ýb;CFÞÎ9cޞ÷ÃSÖîþ9ëÎA=Ù_”ëúiÏ°ë×-–Åè=aÜþ £7;-lÇl_ìâÀë94«×l¾¡×xíõgóŒâõ1·jŸÅœ\8^Uª +ªãŒnoY¶12 +8¢¹/Æ®ù/õ¯tYkÙäÅsé}If xÆò|RԚð†> VrUJ¬›#Vñ¾ÞoÇå³ïýºhÖYr"®?9m»ÇÑNc.Ã"æÇÞ{á…s›·8ãŸùƒ6ÖamÕ'[¾²Rº ™û;^=-ü[µrø½ºÁҋ#×]ý%{À\˜jSÿƪÑíÙ_)³­GGlý·™Ñ¿‘ÿ0bŽ÷œ<­RÛÌsºá&J4ËóŽ?\VaWQWx¥X²õñGq ¶…ÝEâŽËU}# ý`ü)¹ýfMZDøìåFËü@+§SY‰ø]G烓¥/_ãmqý•{ž;^à„^ªI¢¼¾ëMRW’H~ÎéáŒè=‡åü¥ÃùxE@jUb|k®|ÃüŸœºúc¿±þðywp°è¦ðÞrÆëò®lO›Ö®`Çƒ¨C-MN-R¿™ÎÛ_ÊrH7äGu‰äþyŸo`½ì}Õ ¹˜úÏÛ«C–÷~bæ(»G÷ ~”¾ã³sóÙÙ¹×3kŸ°ÿv¥õ¦#\vˆž•îìË<Ð +£cۍ7”A’Ÿ5k´Käè)[I $ -Z!Z˜#ZqÈÒͼȵ z¶¨FÏI˜‹ llEÙ iÛî*ÕÚÇûÔÜځñ«e­9~Í Úª£IdÝ[™á"ªù-háòuyÇ÷–¦D4†D^23aèÒ1ýxaǺaÒ>ÿX¨×sóM»WšG¬5«® ®ï=r»¶¼¼¬O«Kv^ºO~bât ÍhëÅÊÙiqœW‘0¶ºîØÞFWß®&}Ó?Œ}ë +endstream +endobj +12228 0 obj << +/Type /FontDescriptor +/FontName /TPJSSH+CMSY5 +/Flags 4 +/FontBBox [21 -944 1448 791] +/Ascent 750 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 101 +/XHeight 431 +/CharSet (/minus/prime/turnstileleft) +/FontFile 12227 0 R +>> endobj +12229 0 obj << +/Length1 854 +/Length2 1837 +/Length3 0 +/Length 2429 +/Filter /FlateDecode +>> +stream +xÚ­Ry8ÔkNY²E!ÊOȖYa”²ÇŒ™Ÿ1™…ß,LóMYҕ=KGÒA(”$тϮE’¥QÑ9*Õ(:C__××ù÷»ÞÞç¾ïçyïë~^=í}x[23tb2Ø&HØ»ãšHBNOωl*“á@dƒ8ial9‰X +‰C›ÊéöÌpD¥„²{Ãe°¥ƒ•DdîDv(HÏ ižI¢‚l °¥Ñïåà ²@ˆ ’arH$@¦’Ø@0H¡2äàˆœ!Lû&sÂP\b‰Mb“†€Ø"™É ñ2"÷`ŠßÅNþ¦~îÄ¡Ñ<ˆôåñË!ýƒ&Ò©4ÞLz8‡ B€;“ BŒ_¥ÀïÞÜA2•Cÿ•ufiT’-ƒB¤) Æ|'¨,'jHÞGe“B"®à ƒü«qz+Fà.nx{'ãï[]áö© 6ˆŸâ•ù³gQ£ @Š…âóãðË[Ž “LePÆ B‘'‡Ba0 Pd0 +£Ä†á0“-nÄÉ€&$·¼T4'²ÄIQYa❄.“+8…àd"…"ñ'†ú‘ƒiÿ…M-8•BePÙ¼Ÿ 9‡¨â ~v#8 $-ÿèðŸ™ÙÙ1£ø&¦€‰…¸‰FYXs3ÁÿèHì•O)þGB/ £@’Ü@?“dyüpöeG‹º/IÁeE÷®¼iò½u4—Jà1y^ÚvñôùñšÔVÕ°5’åie¨Z=Å#9ðC¡ryMbÁEßSјFØS¼*/.ñ÷uKÆúÓέûϜ‹×À5B/Î&èìø sìžByÊί¨áÓH¿üF#ï £í[°¥2ÛUyÓ¯Ú²qyþÞ£7ð/èÄô;ü Ԉ‹T2­U°J±;¬K°úàg’™®W³‰šzʱEî²à¶÷ìßV§G>$gO?TӚó*òÞâfcߢeŝñG¥—ÙúZéÞIÊØ ä«pMæå/‰Å=Á»U‰‡›F·" •úü)íãÉëèøÉb¥À4t¸(æÖRÞ®÷ÏWñ“óM2=u…é­ˆ½‚QÕs¯_{û¶uEáÓ²+¥Y"¡óýˆÊX`ÿu‹CŠÍ/.L¨9t&rn˜ „¸;Ö÷lj_ôQÄwùı-÷UŠn¶}6ygÓs“ŽÍ°Å_Ý6ÌMªjŸÑ($š—b²(’ÊõåÖÖϧޤ¸ïÌ÷¸/öaSõÖïGØG$‘ +îô•G–}sÅڜÍSÒyñ'±V^±ãê±p·âúBõ®8'Y¾fªn­TÔ>ùøéX-’Lòh>†×Êx•'­îvýÛÆo«•ËƒÔ›®È~íó{’ë·!%ä†TÒs‹Ct ¯f b1ÁqlB„¦tÌ;=Må”U¡KÛÒCnÅG .Í—<Ê+çwlx¢þ¬ Ð-|v—§ƒé¯ŸS8»M—ó½»þùBvŒkZñEMõÜ$ÿ†õ„AèûN½ØKC 펵WÞ5Ô¬‡IŒ4À]î·éN¯ëîK´ÙR‘8a~íà®1}«Ù!Ïã¬'sIu’SÒw3ÖYžF^âÃ#£~Ãà +UºgÂnq:/g†eE ŽJ34\e+&Æ'8×zá{Û¹û¼‡ã°‹ŸâÐO?7•kì¢5ÆȄ×^Ì=þªdǂ½Ì7 ŽúՍÑíLõ´¨§Ø[c}‹õ6v€kªˆ—<ïmüÍ«x'¤¤Òïç£_—ã°ØõÍNh`ó¶×lbFw+¾1&ñ—f̈cÈBîkGVÙ¥ +Â*׍ý±á ÅGÞäÈÊÒ³Ç*ª¦âð×'³D¿¦î–Äç½.ÙWð¥ê@ÓsJ *02×(\ǑÙ+¡?ûLJã:’ww©œ#ÃÖKÇw%\9´j¨@º|»zÞÚÞg»!žÖËËõƒ’w–eyÍÍHéÅ_ jRžß–ù…(K) ÔàZ¦þà5}Iš[54ÌÍƧ¥*ÀºÏõ7S˜ð ¬•*+À×fçYYÃm¾1UѾñU=%·O2+ë´y´š+ÞFH1㶯³‘D]øWŸ^ʙ$­0—ªTÿº¬€Öà³.³ìÂLVêk×gDÇx³‚iÝ-Umɪ¤k|ßŨÍ~ãùn]E{ò|”3jÎG{§q뺠۔ý>ï/-ˇu¸ßZ—çw¦óqF¹†N;„8-³}ó±[tJoO–±jWL"ët–tØੜxê²rØ"k2ٞ±Tº6‹08ZþÁúþé5mtDþÛÉhç-RØ+dé®mó~.§Âªýæ-ߞjxBÈñÖj©î¸?¾‘ªà—0Á@=ùlB@Ü´^ÓæUÕf.8…N»œ›.WË0©|*r¸I3›¥­«{VÑ^yà:tørÍé‚Ã}ãac<vŸ|,5¼º1=8U +pµÎ4eVO«¶ĵÎJ>#æ£òLgë +ÚÍùt‰ê8xí)“h©ä4rÕ6k¦%Q6Ãvð°B\ɬë'·gÌOüzáIú=ËeÔV¡bSҋ +ÛÛ¦]èfÑj®©¦âœ¿¼‰dNóÎåü"ÓFhêwƒ0»¿ä¹ðù=úÎ{^”S¬[¼ÜnÄÍöÌ3r–Ò}´A»X{Êšó’ºrQÈîU@@ÖxÂJF£*à&GóS}kÍt/bÃÛ{9w¼>ˆ&'ƒ„ÑÂ÷­mü£ÐfoBdÇäƒ/ÍõÆJ†9²…–z$^wQPq­×Ô>®ÍÖ2ÛL‰èø³‚ŒC¾‰¡OŒ—$-(“ ~e¿¤‹q6ϕjÚ*·Y^%ìÉ×w…^Ô¿”}ùïÞñk ;ìŒ8AžDGd2ç½¾pgºVâïßlӉ§õ•* +=ß¹½¡¬³Èìk ›ÐAæåInÛOÿ T4˜ê +endstream +endobj +12230 0 obj << +/Type /FontDescriptor +/FontName /JLSCDF+CMSY6 +/Flags 4 +/FontBBox [-4 -948 1329 786] +/Ascent 750 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 93 +/XHeight 431 +/CharSet (/asteriskmath/dagger/daggerdbl/infinity/prime/section) +/FontFile 12229 0 R +>> endobj +12231 0 obj << +/Length1 875 +/Length2 1387 +/Length3 0 +/Length 1993 +/Filter /FlateDecode +>> +stream +xÚ­R{—É}nÌ Œ)…ŒA!ƒŒ5ËXkÆÌÍìI÷£‹Kä$*6•Ð/¥’{¹”½Ë®Ž´å t¡h'éHû,ÚN¿Óþ÷üÖ?ë{žç}¿ç{Ÿ—dÆ r` %Ñ°—Åhd pü‚6;™J ‘82X€!tƒY€ÆdÒ[!4 :³è4ƒN ŽDª’!¢X Xsl¦D΀ËH€? Çã= I ÆTdÀ‹AàT…ÂrX– É Ñ°A ”)CÞhŒ8…… +é •Ëä¸)`›´¸E¡«€Ž!P¸ü.wòÿ0õ}s/…XÌÄOµŸÒ_hA<"Vý)ÄK,~!,C¿—†À_½ùÁBDÿ=ë ÄÄFEb8ÐÉԕŒ¯"÷B”°‡`P,ˆˆåð4£Âï­àӛ6B +ñ \g÷5ÕiŽ'@Pl£J +ê7ñô™öíŒÏH†(ŸJ¦Ri¸ÿfþ"¾»k- +I„*t†ÈdŠ·¢3@M*„•Vâ†)dT‚á%ŸLˆ‘ÈS¡:2AcÁTSÌ4H§Š–ËážÑ ÊtÄQ‰h*7þä×Æ#¨Bþ­b ‘Š¿udàµ(,š^g¹X ý/ãè(R‚k +ùë==%Jµ¾óL Ðè :pv¡'ýRÈd0ŠMo*žÆÌ9Á„a% ?’@®ûâŽ]I.Ù±¶ðÞ¹¹­O-¥¯kօVí8‰“‚ùf"ì§×gú*Ӎ¶Þ_ì¹](»lœÆM-Xx¡òÐéâЌ]ŒZrg‘jï¡l/vV¯½‚srÿÖ·„U+ë?qÐÂþñ¨ÅÎí|áKϰšOõmØš›8?þ‡f÷lC#U÷‹ŽoÓZ¸$õT_Å/i²0©µ±÷aŸ?\nWX$7¿·+ä=",~x‰; ßа€Óî:©3b·˜8¨­jšmæÿö‰r´{'}J$jôU=ã èÕØgÆ[r]ë·2ì9ç%1‘"µ›Ìó†>‡ö†Àž2s­Ví,ð¨Q“š\=xß*š_}UcÕ,o¬_Ñòü}éò5gCJío¹gª'µ,‚g„&¿uº×؍þX0œÛ4§y绍ùQ'–76è p¯p*ÚqÊn]ÿzâ±CePò¡×¤.÷ ½Ô‰#”]Ç:ö-jÛv´ûþ}Åø„µÅý}¾ý9¦ŽKÞ8µÖyT'™ñ.­ÌRèÎî²qlÛ¿ã½.é?O‹IU÷k×Õ.ê)¨ªÙ¥óp"Îc{’•Võƒ ãq.]æ8Úw¾Ó] %G ®÷–¶Ó¸¼Å7~wd¹tÜÊQÃÛÊÝ/÷›“6]2˜¸RJ>–vnz>ÜÄhM¼ÌÔoöÊYñò‰ÿ:§½VÜ1•Òˆfy%¹,Ķòٝ-mÃ?o]z›Í×ê|h·aNrÁÊnÿí]ëɸ<ã=Z&!æ>Yæùeé{ޙÈ.‚ÎuD1~÷[h´Z™aª.[SóÇ-(1?êuUH¿Uñ2üïlìó“»ÖZeñ Ö¹·$d¼‹óÕ\ô.gìÒyM¡ýÚ;£zêϵŠ)á³Ïno²®tw ²"ÀZ=+îªzí0‡„Ô=ŸÎv½É9Ý`à4Çÿ‹ZçàœÁ^O9U7biRŸÐhE*ç†ïÜÛb¤žÈGŽoSì‘wÌ?ÏMxzppIÓ½ypyäDø9½Ø D(ï+ÙÌ£õ³2Ü|t£ +.ÎìvÞ3l½ZƘe9T±+N–r|ÖKÄonpXÀbêxÛ¯Èt—õ çfe»Ùqëfjy`/¹ë9ïZ¿dó?S±Ì½wo_{µ™XrÍóìi՝•,śìÝÆ ˜©ckÏ£·}Æ_¦®‚ƒ;g§P–Ô¹sB¡4=¯+'ó,ùþ#sµlÂw%ªæ͵[ ]6‰y˜-…’IqºùY܁Êã'¢ŽòïMNìå_œÿÃxÅRë–ÁqVþ;›Ýöq#©„", ^ÝJ”ݘ?穁øÅòŒŸ²Xㅺ­y-§·õDæ¨OUÝ!<Û?ô¦ÈÒ¼úL{žÓfm)fd~‚½?½~YÒ3‹â•ÏMF”‚“:I“í.ûzÛªRÌRÎPn0¡9Ý 0uô-*ò^âWpçՏO–ñ—‡K?rœ澴WEÿªùÓ4º™ +endstream +endobj +12232 0 obj << +/Type /FontDescriptor +/FontName /WSWKRG+CMSY7 +/Flags 4 +/FontBBox [-15 -951 1252 782] +/Ascent 750 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 93 +/XHeight 431 +/CharSet (/infinity/lessequal/logicaland/minus/multiply/negationslash/prime) +/FontFile 12231 0 R +>> endobj +12233 0 obj << +/Length1 792 +/Length2 1349 +/Length3 0 +/Length 1899 +/Filter /FlateDecode +>> +stream +xÚ­R{<”i-‹Šä´y«03ï0äXÃ&ì:‡œÒ˜÷ñ2ޙfÞ)ói¬-_QZiË9’*»Õ†VZ2jÊ7‰(ہrh‡¶ß~Ÿý÷û=ÿ<÷u]Ï}_Ïõ<†z^¾fT˜Ž8³1Ü "@6ÀÉÝ7p €$%CC'.BÃQ6ö Gldm *Ÿ + YِÉ6TœØeFàÀØiÓ‚È +P£.J§aÀ†G ÑÒt ø²é(‚ €ÊbŸ…<àƒðî>&(A€Q:Â&Š) ¹b 6°úÃ|ÎgjÂåIMc©ÉM@jfc,€†у-…Hü?L-mîÌg±× T7‚Ä t%Q›n›y¦îHIÜö‚ÎÒ/ˆŠÓw*†E +×wÕÇe¡°Ð—’í­ÇÄ Gò$µ©­ZQ÷׺ÑmO¯áÖh§x$ïÏ_S^›”{a׉xJ ¡×WKp()cå¼É×#®­{ýæg×`*šûóJÊ}[Š¶¸Ò"sºÁƓc…ËYhȃW4-îî” ^—¶µ^)„O}×[ðÐâ7…)§åJ2ÚJço]ó+n8ðkë3X¹½)ëŒÚýTõ7£1Ê -ù7¡é~Ûáü²šcøÊeùÓ#s—Mšö[¼k~ÏÜy7¦¢,ªÐ›,‘¿M.sÁucÛÝ^®^?AýCü±ÉäçeË*‰F;ˆ™p<&ˆêÚúí;ÃXWèÄe‰Mù› ­[éÝÇOn\Ïg8%9§QúÒDa@¡…ø…wÌYÛÎñøù…¡ô]b¹íW*ðD~b³Ø!fŽý!úbDé ;jæ¹Í”]š¢— +”¹¤QΚ֙vÛdyú«Ëäwžöí.@à +ís +úãŅš¡õ‰­{þM\Ç°mŠ«„έûr¨ +Möó¸Jåù+ë0š•äù¹™Qyû¿Â%3B,3ùÁö1A¢ÑÆS¯1|³'kÊËjîŒWUÆUPùÃÚ«”Îæ0ŽÈÕój>:÷Uꚤ·7TOQUóW%’¸ï—ÕI*îN5g&e®ÞÜê±ùIpÏ åÌì-ª¨x ]7“±©IlÀÍÛ˃'ßÿLÁ?v( M½ö>m\¼Ferbäⶨg$è]¦ŸÝ°Ÿ‹Ú‡Ñ¼´ÁÃsñÜ:þkí–úî܎xúó²Èõ萕¦l¹¤¯ÊI·3îõK¢GÙ3ý¡B,E#ÖËüö›ÅÇ\¯OÉãqEäœûâÙÁ銻õý§¾ßý'=©1 +endstream +endobj +12234 0 obj << +/Type /FontDescriptor +/FontName /JRVZXP+CMSY8 +/Flags 4 +/FontBBox [-30 -955 1185 779] +/Ascent 750 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 89 +/XHeight 431 +/CharSet (/dagger/daggerdbl/section) +/FontFile 12233 0 R +>> endobj +12235 0 obj << +/Length1 791 +/Length2 945 +/Length3 0 +/Length 1491 +/Filter /FlateDecode +>> +stream +xÚ­R{4”i.—¦´›K”¡W¨æbŒ‰°kä2Ê4¥B5æ{g|™ù>¾™‘‰q9$I%tSQqd+{º*G¹%eT{j'+×.ZuJºh+ûaÎêß=ï?ïïyž÷÷>ïó{l…"_†8¦raÑYžÀ/D´Î°èLŠƒƒÅ*ǖ‰Uа<3¢‡Äïû(Q҄¶iZö €q†6ez¥W†°õãoðj…FÓ¨0kYM/:¸!¨V=p\1d©*z½²ƒ6Ë4í^z}Bÿ³0Ö^û%5œ¹±"Ex›n{“Úٙ¿õȖ³–`kE?gas?—g'ä'-ësîµ>?T¦=e~e{SüÜ¢°ë ŽËo€w¢\óÕ±×½J¢Ýh&TE«|#ߺ,õí&`ÓC5:™þRGyçÞê’nËêóÅ+ ²ˆ'Œy7ÌtÔZâ0̓F½{åÛÉÙ4[p.ùPiـ17ï3Õýs¡*Ê~ùÁ-ý}B*GTÌIÞ¥Ä|ò§n.QÚd=õ]÷Ã9†GÏø%VëÉ.¶-é?ö=FèV•2¶JxëþÎMr¸6¼w]µ­ó­}þ½o|ö×\l¯kˈ}šdœúºbaÜV”sËéÜ·}Éõ/w|h–~5(à ‘9å©þÕû__µÎ÷±âÙUÙVD<äaýé™ü‚²^w\W™ú¦³¸5ùBÉéÚ¦¾þ£õüéÃÇtkÒlŠ4'sæÚ/-ihhw¾=ø"<9(cª¡ÉÙ{½M)F¯ ÷°ÃzXv·kxÔñ”¬NŸ•3û½³„¨ùÚ¾¼_/ž}­¸óI¬×¾]‘Ò‹GǤcö<:aŒq§Ǚ©Ö&UmZŽ p‹ô›ÓõþŠìb”»›dï´É¸ä¯ØCÛ54\Âh4ø9͛¹EO¯#pÕ|s(ãTV—£´årž28òñO}'K»™¿Î ÑÅ?ó8kkÕ¥¸àí›-ã¶gô š?ó™5ØQÏeX¾Í9ÜÄ®©™—>‰6±«’‰D© :‰¼¾!Ü:¾ÑìÇY¯{Zf'}ÚkξÆt³{ÿÅ*N{$¦ì,ºP±6Ôëè€Kc¨¤l¸v^ îòçå;å¿o¦ÓêJŽÔÚ{ò"\_>7Mâ ½Lªº#Ò©3?|¹skp¶`sðnIkàúθ à´>UYgӜ^rÔÈ|àý0w$'«<ï™ÔâÎÇ6ßHpi¶Ó’·kÂêçuÕ¯9¸lÕÈ?G¥Çv +endstream +endobj +12236 0 obj << +/Type /FontDescriptor +/FontName /LRFJNF+CMSY9 +/Flags 4 +/FontBBox [-30 -958 1146 777] +/Ascent 750 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 87 +/XHeight 431 +/CharSet (/asteriskmath/lessequal/minus) +/FontFile 12235 0 R +>> endobj +12237 0 obj << +/Length1 765 +/Length2 1314 +/Length3 0 +/Length 1852 +/Filter /FlateDecode +>> +stream +xÚ­RiX“W¶ˆ&"›Â "”Y> ĀZ!„¥ ! TÂ4&_àƒ,ÂQ¡,jé(;( P„d‘ŠT+[`JÊ"Å¡hY;õé3ôï<÷þ¸ï9ï9ç½ï½&FÞ>XŽð$ä,ˆ± ´(4†H@àˆ21¡ˆ – +œXbÈÉd+À:©8(¶ÑÖ´E™a¸D‡ˆ3 +fƒDøf³%øŠlð²aH,Á<@ߨˆèP$Š‚88˜-NBÁ°…ßÐä&à +Ò»0'2üC* +E(Df›21€B$G(àIÄEá=…ŠiBËÿCÖÖæΑ<ž'‹¿Ñ~Ó©¿äY|˜'yÏòÃ#Ő  9H°•zz'ŽqàHþÖ¬›˜ÅƒÙ‚``AÁæ]Žp†c Ž7,f‡\/ڌCÎV% +ÿ6uàÝ=èǽ,Þ?ífқ Ä I8þdobðO¬0IÇ' +—AQ±>œ˜[†Ql!VD[€%±$(Å'R " °€ÅPŒB1'Š%€Â™³W(Bm¼+ZøðØ{Hð›ð¯wrtÆÄbA[kkET ml²-ùìÿ0ّ"$o~…50V¸ A1%²í“B³îžÿöµøñwHL„~NiR÷ƒäÚ{Ü«Q{ÍQ}/Ú?¯‘¬ +—«gN»ßÆs¸ÄqÝ»gÚc}ðÉÃíª{0…¹>*³ìWAJm­jü_½þ^o1ûÔxq,ê²Òã%H*ҝ¾„øö§¡µ…saq=ã2t6Çø?™(fÁ} ÈojìÒe¹‹°X(+éÐ Ì]ÔZ—é¶þÜ6¢šC¾\@SÌ9²º“€‰áNô À¼0C™>ÙõªÚjF¸Î¨!ïœaOURi驇ê¡ý¡H-Ò×Fr[ŠJ¾|¼³œQcv%<¸Õþ¾6í;DqÓ§zCÛåçAæƒëkÒ}ÊÊSO¦÷Ø-à–Muí>Åéõ­±Z°I_(”~rLj¬k‘ ýÏáuÂÒ܉9íźn-”»JæÌvF†#¾Á÷ÁË&Ù „3-ûôý¤ÖËçÑ8ߌŠÝ[qG&u|e•¯óÝv¥R¾ґOŕÝۓœ¨}°ß‹ô0o) +~.wInF_ÿÔîÉSý?À¬s¨§‹Œóæ]A´ÚÒj߅ný +×I ÒT‡Ú¡NŠl“þ.†Ì ?‰ki5ŒvF§¼Ü½hf®ƒP" +>¿.+FýhcNOüÅ¿Ôôý7†þ}½&fÍGë^K½ÞWnz;ñk÷Ö(âÒBÚ3ï+9ï<ãjT7ßiÂx¹=yÛԓŸ›Ú¹zUm4_õ<õLø­*¿WKjiÍ%÷|'˜04 ÷zW5EÅq +ö£¦q±unëŸíHÙKÊiÿªnp(HßkAÙ5f¸lÜ]ÍÌÀP€ü$o­”ñJi8ŒÆHøðc +“–ËœRöfwám |LE}š¯Ü|,1pî"Ϩž{o´‘ì]WS›‰Û.‹/kSFVGc¯M­V¼ôðYÊ– ‡w&S*úzkåó…ºÉsN%±Ÿ¯%[‹W_#¿ÐÜÖZœöl5zímŠÅ¯‹Ô›'©ÓDɝЬƒ\À>{qK-Âþr¿c¥zNðP#—Þ܋~£j0…ˆL]F ã úòâótߣC’ô>ϙ{÷„sôÜnãøQ ~ëòìóžeþ +ßÇÏc·K͔=9p´HI=Á#$Q‰¯ÞáF±.¸ôäB³åJYñÚB…Ê]ˆõ[H·J‰%ÿç$m›´Óò³kÇOì ´šh¸Ûêeӝ<ùLóN¡e/¹Î¡ép!ÃüÀh€Ÿ¥þ‘µÎzõ•Ø×Êû…ÔÌÅVÓL£f¢þ³2¦UU¯™‡Þñ›]¶áœêts¯ÃÊìä7I)Jv¡vì©*}ôB)QSóæ¤ñ¹ÌC;ë×]dææªiôõÞ¹ÑXV°x¾ÝÓ2Ýç÷½Ãß,€K¹ÓéþðCiç`g5®(Ký¬%·´z[<5ñXo["ùtíæ'~ÏïyÇò>{Ž8…'k¯x3'F +æ.YšP,Z:LÕØÿÆÛ]¡ÏTß\©6l[(»7ۋÉ{k?ŸQ5’v•¬Ùˆ: ™vùŨVHÿ|d:Ñÿo(ëèGÑRjGå ·ârÖ`Ÿ¿qP–»ã ßIÚ£ý!vä»êIÿ®–Š7ÐYM2¹¸8^„-ð¹Srõ²ëÛ3•É B3þE/,i—é7£é<—¥R\o‡º9S3»6d;}™÷‡4Çe¶®— Þ·ø_/ózŒ +endstream +endobj +12238 0 obj << +/Type /FontDescriptor +/FontName /KNYRWO+CMTI10 +/Flags 4 +/FontBBox [-163 -250 1146 969] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 68 +/XHeight 431 +/CharSet (/p/s) +/FontFile 12237 0 R +>> endobj +12239 0 obj << +/Length1 831 +/Length2 2352 +/Length3 0 +/Length 2910 +/Filter /FlateDecode +>> +stream +xÚ­Ry<”k¦£ì²–/’±Œ™±“}_²„˜,i̼f33b,éX’TRˆq²$eË9QÖJÙe)D1–œñMÎ9ß9_çßï÷<<×}_÷ý\¿ë¾å¤¡Æ¢hA$P¡„.`jç₀8܄KNΔ ¢¨X"Á Eu„ŽŽ*`L"ªš®«®Ê¼\r€)‘D#cýü©ÄTá;I 0ƃd,EìPTÏìFág" Ri*€18}¯ N $Ÿ1*\€Á¢©€è‡%pÁ¾k²&ø­?˜`Ò_©ó ™Â@öd*L‘"G0 /̞Èü djùÈú±¹E0gÂo¿çÔ¿ò(<Gû“Aē‚© °#b@2áGªø‡8;ƒ Æÿ˜µ¦¢pX´1Áð?BXŠ6Ä8b©h€J÷ ó£¦s{ +`&¶¶&¦Ju/éˆÂ¨.4Ò»~gïaÄߘi +xÀ™þ"˜DæùëåõÃgæ4ƒ%øªšŠLFѸ˜ëÃD@8À0`(†2ÃTD*³`z øÉ\ß'Š`v…ßcBm†û2wFüT`ä@MFýªÂXè? ³–¶ÿm‰ 14ª@UÕ4-5  ‡Gþ L&ƒêÞê1-þ ûb™óÁPÍ54HDŸˆ ¸ýøRá󼞢ýŠ¬&~57ì5ö=ãŽy—ÌŠ»ßf¤8V‰üZLâ›Ù?#²-N¹ò4âT§Å矃n¤ì̜?7C{"Ž\¡ÛѦI2ë1óë÷¯-h°:¼k/L9sïŝå—ó¹Ž3—Oìï¥Yš<ÎW5eÆjj!-è¸Óñq•ÇÕ¤øӃ +/«Ç†ð§Üd펹Ïñ«ÒÈoħÁ‚_ó8rníx³l¢$F«šd½«éЏ§ChzšùmŽ^õXÝo€Éùd–6e”&ö׆êևz&œk+šh,ýۓœ>ŠG>µž„°÷èPÜً-xØæuÍkJìø)?=Œ±Šƒ«>0_;œb˜é°*Ÿ߻-_P%¶+aÛ#YÍÿ8îpZO=6ºÆh×oV.5¿µbÖd¿Àçaó\öæÆQÖ§&n;‚ejk ŒdŽ]îÛÂvƒ ¤»Ï›¦V!¹órSr[’‡/@:4î|‘2 Œ4fðĎ¢åSó*šã˜xÕÎîU”žÅfв¢Ž¦Xªäò•†púqÖó +½±Dò%È\['øߌ—\kÊlgÉgYÞ~,$f„>=¢ERÒçà1Mž¦µ8lnËÒÚ²%=ê Å&ªëa€zI¥t Ûv÷oóÞw_yLÛ"ÓÎX6˜cè$ɇ£ž„6…îÙDnåË.‘æ5XǒڶÊÀHÿ–„`²›fWqQb~c‰$ëeý,Aªøó,–Îõq1®êJ»ŒL–ˆZÆkýOC›áá0aŸ&~›ƒ<·éžêmn+Q`JUfäúö@ŸÈf-Ü¡€¦£2þ´éADÌ͔¤‰r"÷fúÖ¹)Ӊt:סþs©§¯ãkkÆá2+|,y]ӏ ³¸ík‘Ao “ŠñÜï äxù\%³uéï·W8“!½-®žDïæw鼋 BMnò²ë}º”ƒ´ßÇSÍï5°(¿e;&ªÖ‡çŒÎÎ1ø4pf (=8qéDM±p?ØÎçà#m6%Âp¿òå‰J›`¨ª‰º[‚>›]^ìT ^þ—£p÷˜ c+ð­Õh=ÍÀ`ßA ›¢eÿ_yXSîM]¾g“G ³~,òG¯]µS–«•Ë¿C„G”z²Ê8©Â>;?‹[{ÈFië[Ý1¢ÇŽÜ¨¥?ÂxË[Zdú¢w3À}t*Sº›aÑáv(֑P™Õ8ÔÐ}>bÆÇsñªmCÛüÿôøâà`h¾ïSšf(µ¤NÆY£ØËU‹ìFì$îÒY b‘ 5k¾Î®Yó× <òî Vî¯ Ô$V-ß®ôJÓÁ뫜u¯[?/ÎõUÉ%äcâB ø¸˜Æ €/®÷9f_ýãÌ´( —xQ)ÎX&•^9י宽{@ô FöÖ¯®F€»çùÜ¢¨PRc¨å>/– +eÍÜB‚Û<×CÍ«’¦Fqm5“ZZjރJ¤Æ¶úè'ґlåš!T‹í ¡©Z•öqø­7Öª©âá5qF웈½†ÖoÂz²ØT«–£èp4!)>ÛgbÝ#FŸtÒ£ˆcº'Tõ•a¾ÊìJ†}!Ô~ú^` õ¼|¸Híμ¥c Æe,5KÏÌÙºž?ø¦—u—ﲿÂ#yM›s=cH$˜®Ü å ¡èœÂÑ/1åh1å[Ǝ6]–hñãrØÊÚ)ž§ó¼œÚÔõ¦£>(ÁX¡„2ñËc;5ÄÆÐ;ý£Z¡ßeÈHαof㈀ñ£øÆÊúMՒ‹¼·¾ ®ÉÄ<›8_–]ÆfT‡Z+.Üa-©W(ö'¼7ûùmÂU>ÉAfaqã²aîþ~Kþ~V‡Lªyxtuã;ðò‘ýŽ&ÇLcñôðBfËîj5aùfÓU€wiôµ¬Áóux¡¥se×´$6óÂÄ5v¨tšæëR“z”c±¡A.å÷Ä©º–å0Õà3úŠ<ÎX m#ïûù+;¯r®Oõ7n$/O\Ì:¹ªgÙq¶hp"ª™¤šÀiÝ&k!Íy©™5ðñTKàªxeS`L樕¼.÷drZdšd%T¤‡?jêqÂiBFf_½‘ä‘Œí\£œÂô +9ĔÒᅫΠz-Òq´2rWú䚀ñ‡Iã :vM>°ëó¸!ÌpIsi|G¹ö+yâ]ÏV§é#¯ºw:5Ñò糺C'/N/q÷½ ë ? Ø +§örP±Á›±Í"çî“1«ÝQmëÚ¢_ +¶ê|s”ž5iYH£]Ó¼%ø&ü’< Ú¶ ¯ˆ aÜ?ЖCڈѬêT1qï~…ŸPwí飅û[½T˜Øܾ¸NIìzø~äX2¨ÝµÉ;ÁϬÙæXÏÙÞÄêü‰ÃÎuúßð6Ø(¯)\”¬ôQ—%ô]½…_‚ænìéA¿ˆÛlénÄ´'*> endobj +12241 0 obj << +/Length1 832 +/Length2 1188 +/Length3 0 +/Length 1759 +/Filter /FlateDecode +>> +stream +xÚ­R}8”ùN›«vv›U³v·¤ýQãsfÌ03¤ñ1Wb(T(òÎÌ;ãmÇ 3ï0ƒ”%òQHòu‡³Bú˜Šˆ|•¶Dm¶h#«¨V[„΋m÷:öóϹÞÞç¹ï羟çù=D½m^d¶@ʃ9R J¦Qh,ÀõbsiT`N¡áˆDG ¡ˆTâ¡0 Ь­-€h–€jÍ¢2XT*Ž¸¼TÁ<©19‡e0ÀrD$€§h ØÁ° áC’y>Œéò!1ð’òUQ0GiˆJ†ˆ‚P`ähK‹­±uÍ›¹»xº;o7ýãæÁm"A½U!ÊαçcÚ_1¶¢»©*•†±ïãŸÿ"3g _*@$"`Î`H&ƒT8*&eÎ`€H@$X `%Ö±E"E±¢@÷cG&ÃÍ=£9˜aUÒpBÄ „áó͘a4>,ŸOý}F©2Ò +éL ŒlA4*Õbÿñø +™ – óWƒ-êc,D°µÂ°æãzHù6qû²*ãK£‹î–išh8ˆªÒÜ/6tÕ}û0]CüÃm×P“>µÏTy.?¤9ômø´Ž<©6j{g<&4-ûþìPXàPnDµŽÏë\®j0DÿmìèW+»'ž34<îõµ•÷-¾‘ÿ²e´p›‘“÷ðòÇzKw‡]j̋cZúprÅ;© ,ô<µ²CKÓzõŽ[Ö{'6z_Š+¦^Ik«§ŠVdÌîy«ºŠ_».A”2’²±š^ÂÜõ–‹2ÐhÀ¿O«‚tì».\wˆö‡NþÓ·7X·bHµÝKÜϖü c&ãA›aìe|ñA߁áÍ +˶#n ˆ3¾\Ðà™(·ýÖ'}*R Qú§l¸äõåd/Ðí>uk¼¸s+eÖ*?“h8yïR·ûÞ­û©“mÿPö Š¦roÑOv¦†öi9V¥OðÕ:=ÚùtËkúcÎNtã3GMßläÚU,«ûmb‚eê˜C~¯ Òa]$Íüs)»óܒr°¯u·òêM«¬3g6¥„%Û;GGÊ/î4ú…ÞƒÂßޔ·ÅØÎWc§vÿØ9J^{û ï¬êÂëëjœj>~ÕK 8³*“2À¬Ð½&1[B)³±³yÖ¬2£k†Ùºölš¶ñhfg8fBq:¥‰½GNåŽEDn<{ ve,µÍW~[[êL1VØW¥ïQç„¡õ– UJ×vƒ©;Iø ƒi÷Ìzª¨Xë xšífùË(u5‰ºº«ð»O›?é´b˜\æ •w*í ¡aG>å>1Ja¾Ïóq²O C¯;R^8Ìâ?ØEçxÊ®®m ¬W½®\f°·ÏCY{êÁš2¹í]¶™nnAZÿýþ¶ÇI5ý/Ñ®&ÀÓ=ðr|ˆ맯‹‹"œ¤c¦Mk|¦lvõÜʻŦ`s±©sìæŸ “~8[tõ í¹âûý…xAW×9úçp5²|Ýë»·¯]Á/ãÙi¼ã=?m„Û öÚ²sí!v " +C+¾láKwyëÚƒI·ŸŸ€^ÖNÆ[9ͤ‹ÎõÔ $£9o Zâã—Û=ý¹WÕ 7¤sŠ)<í ýE«º*Ê¿ß°0Rt)é&ÈYµa:+yôW?¥Ÿ­¾˜N¨C;+Úí¡~áשþ7éòíì7¯¦¤5Ä»iÇã³zL¬{WFĬçÙ­‰fOܔ¨._od(û$ZáɇÜÞhûTfœ/n=Ün­Á0ÙðheË !ñhÔ/c\ßÉâÖö]Þ  õö—Ä4»Ñ\æHÚWôûäÚÓQïÃO$mÙ2Læ×|B¾Ø£ãŽP¿¤¿LÖñŒ³3ù™jÕĒó‘ÓaO×;J¿Sâw°uãh׏י–]E׬ôl†v¬¬7zW4Mhûq©›a‚¬ãÉ wsçCnãµÌ¸h;Òùi?ùêk¥ïUŸè¨–«–“> endobj +12243 0 obj << +/Length1 920 +/Length2 3636 +/Length3 0 +/Length 4260 +/Filter /FlateDecode +>> +stream +xÚ­Sy<”ûÛF–A¡ì"²ŒalYƖeÌ d˜ÁhÆX&Ù÷5!dÉ®P”-áX’){’%û)eÈqô›:ï9çóžßï?ïçùç{Ý÷u_÷úHKÀ‘Šú’֘D¤(B” çK¤%DPQ‚pHK’±h +ŽD4BS°çˆ¦¦*€Äú 9Q>¯ªÁ! X¢)^’Jp#Ẏˆ%c ÖçIÄb7*@ñÂú,çŽ&þâc t]w4@’ÜqX +U‰®cHò¡’qž^@ÖPîg2ÿ#ÐÇãÄÏ?õÒ°%ÀàÜ)€ÖGäÿì̌èA4þ4cü}þr`É~ôæYz³r½U ‰ˆ§Ò ÷à[‘è¹°ôJþ?Šú·¸±?o…&ÐåÿœöùÑžú'æÇ’ÿM¸„ý³$K,çOø·×Œ‚ÆãÜõ‰žx, ü§ çgŒ Âbà8Š»àÆûaÙ±DÌ¿SÓÇõ+1ØÊÎÑÑÊPþîá—ŽÆ)¶TŸ¿e²aÈ?˜>2.@)+)+CèDú÷×Ëù_É`DwGôTÔÔ4™Œ¦r(Ó¥TÔԀ`€#b°A6ˆ^1X‰H¢ÐCJýÈÈ?ר®€ š~! 6ù£wð7:§ €áÿ :Ó椀ÿ UŒüiÒã.ÿÔé>,Á‡BõÃR~ÿ{t¤ `EzýŠPúO¤ +U4U”CþÑݟLÆ)¿®‘¾€¿°Ž¾.,6ëÎñnœä®íÝ[ ++¬b9Ëhàù8ͪ¾sä7Ψ‰›ŒøŠ¾‹¾ggêö«sy¹–Y–ÅNú%¶]·0ފðMË;\p]νöä¤Ãv®%uÉçônÔGîÖ¦ÑojŒÖÃ3ý•™Že=ŸŸ,†ËÙ®°MI0t¡ºò¢Õ5Œsñvq1ugT%<9¾•ñиé@žÌtæé7Q¡Þq fù÷_Hmþ'öKAE‡N;Í}­…Þe ¼c´¤*1Cùc¬í{r¾©&C2؅ĂæÜr!åÓ1êyGº£†¸™çŸF*êúm£"žI¹…èäò§VÛ¨–8k{™Uß#‰Kwy\o Q¢>WŽê¿Þ‰ÆxÒ¢áïJ«‘VOÈ6&ËávÒ#¤OßAžž'xó3©cîû•ÚÝNzeú`p¥¬Jev%ÒØàªmC¥K±Á” {fƒbÿQíàTcV2©¼é„jya~Ã;¸×qµ^ñ"w;‰1îQ²Üïq N Džð*K½#•EùzÂ[¯ìfew$òvf#sì<ž,h"*“ø÷ž´UÝÕ¯4wkØqÎï¬îqµœy– Ûс´·Xêä|XÇùxëKkþz$)Ë-稑C̃Ī®¾’KÜJ¦IŸÒQmv=݅ð÷éëOOïJ`ÝÑ’Ýêg¬¿|kpMÎXĜѣ¾†•¤‘È[-b¿W¢v6ÐÖL+-¤jhR3êõz&¡f.cjnÊK®cR(ԁ9dhO<\g\KÎ Ÿd ‰$”;ÛEœ HóúaOs‹¡Í„¼Õûü²1Ú +§2Ńo J]±äðÝ©|aíŽ ßœŒ¹7¦&Çøq¬úGv#”?˔!’ÓÁX7,hÿx1äÅ*SÓ¥—R c\%û>= +T…"é‚Â=f].œÑnÝ^…+- +dzšŒôDýߙS–ÚI±‚à¸?îCnQßvš¨>éè<7=+~”Ã9ŒDØ8Úr^PL:¹þ|Ɩô­øòå#Œ÷„ZÃÍÃÌ 7F’úÞÝ¢ ό¶nÛ<¯ò¿í$€^4ϘúD–]:ÕìgËòmÜýôäG·K‚-è+£:¼ºhÈ®/ÿdzbÈvÔ#œ£‹rC –¾ï': ™É™èLA6À³B– >Þl¡¦ ôïIS½zðç>“´QÕ|'¥;á*\dÐ#\{1ê…mvS©Bƒ‘×òS§S, Ãçš>…û­ÅwA{âSD¹Öë–êŸM\ŽÍWLÑm¾誧»&øêèã=å „z‘ôÕ;ÇÉ9ÍÕ?çSQä[‹´¨—ÉK±â÷´Æ¬Ø8NsôYe¶W +ÖmpcÍüÁme÷P~×æͶ* VJ¹"e›´Ÿ6øôòJqŠdº†¥¿•c¤5?_aÿ²³Ø­¯·>Ÿïek™4hÙþlö'§Í9æĂ»—Ä|Xð*GœÕ¥F³ï–š3{lßþêêå7˜6Ý6í!pTXìx¼œáÑ#wÿhÏΊíå½?Yêno«Cq|4î5sÐç(i&xÍäyê+äÔT‹Ó ÿŽŒðµ·ö‹í^¨Z'·¤å³wd/š˜·ç½´Þ…{ 9ù ;ˆDZIb’¦~·}Ê×un(2e29ä®i1¿XQš|¤èT,ÁC[¥†jøBü›psïý¾ãçwJ®+òúE@ÐèÆ·)9‹[iƒ\Öº–›òüZ'gÖ¬€Ô;`û5ç”Á¿|Ot{Wj6oDßÁ…™IB—xüãiÃw¶ +½ßgùߧ)L­_Ú⦍n³ÝíǦWÞ ÅÔ~`Þ-KKÝ„µ+—Ó:Îõï+Ÿ<ò0Á5åځXÓZý§Y²cę€Oé¯b_Qšfí舄Î(Þv††Œytñ€²¢Ÿ™º#}¶{ß®‡…ü@*É|k6‘/ÞÏùG¡5䶺4UÕ|/&Š›tˆX7Öàíï u1°SêâbŸ§?O$¸SjÏ ¦Hç7¾õcrÈOþ…U›™JÅ ù‡[å°«ƒIh¥Ñ3³P‘0a/Ú&h¤ú†Î{æùÈÆ.ŽjU9;[S0 ÍCè¶O2 ¾nK@ϪV3IØèfX3xmÞ%³´¨ß|h™d}œeÒ'¬;mmž¡EIåÑ åœCö—Š&ßÐàOÑâ½B3"líɝñWSðáÀÔcC×¼¯Â*4x§=\³·¦ÈŠ»ž²Å_9ç zâ¥!MÃ*¯ÒÅ ã°ã©º©Ia¥¯¢?‡ûùœ¯{(¢3êÕF Hé‚gyáP ´_ª†¹~yÉõMªÓRßâÌ­+l7ë¬Y¯pG5ø¨œ˜Ä¨¾—ÙfgîԑrȎÐÙkäÓ(͕U‰¸Â±ç? J¢s{.4U>ÄË¿)9íæã(e&ý>älø„Ló‡±ÝóÆûȅûON~Þ»>¿¿†¹Ö"ŠµŽ(ÈB•Ýœ/—Ae( “r˜¨–A;ÍüvÅ‚™yÊg¦©±òF£ßvÍU¼ûòÚÙrLy }Çc,F¶^¯53í^à4ç]ë ”êz#­Ñ]À~}3µ"G°»(ÅËy©pÍ¢øè}ýÞ!;|‘4$qх¦Æü¹³÷£oJ¿£TfQ™m³ðÕ!½ íäˆýÁ¾êŒ“ržy^¢‡ïŒƒ©ÝgfP6Ø?§¦ª8ž·ä3ßbѾvY0,‰Oem!cjbÞùh ªá]üM)„ïR¨LÕ +…‚ÓÜÛ꼂?|ž%*3{½“ÓŒôΠ {JÖ«)êQ8@vûCÓX¾ï‡–э@ñìî\ï_—%—Õ4¤òræÞ’œ “?URñL†·Z|_TÍn4bLÃ%IÚÞåæ +ÙЈqǜ,uPa8_¢åcý˜Qy-¶g7•d³¿Çù¥WgtJr;îC]Ž«ÇRVĝfYÂW»s®Øð]‚Jù‹.Ÿ‘L’YÃeÑÃÞ­ßk*‡d•”›Ö @Ղï©n×Û¦LIׄïFۏ´BFBï;Úò‰6‰«âVâÁÈ""A.-#:®ÊØrëTâ˾Õ´ìálÔá™^oí;Ü´²ÂqÙÌ,Ìù†¸äå&¯â«&oÙª¥„ó—Ö¼=u÷ð3©œ˜(›¹uz@xðþbš÷fd®èü„RŸÞŽÉwÚ•Ê ;¼Ðk¾»•$¡½¨/ù¨Ž1°—ƒžÃ-ÑjŠÚޏXꡬˆžgi¯'öd¥òò,*h’é–¦‚—’3|ÜP–°`.¶|/2Çê¸b> endobj +12245 0 obj << +/Length1 1612 +/Length2 18915 +/Length3 0 +/Length 19754 +/Filter /FlateDecode +>> +stream +xÚ¬·ctfíÖ&ÛvžØ¶mTlû‰m£*ªŠm۶͊ŠmëÔ»ww=öéó§Ï÷c±î‰kâš÷\cQ(©2ˆ˜9˜˜K:Ø»2°02óv&n. +öò *æ–n€¿B8 + +1gscW ƒ½¸±«9/@ÓÜ nn +`e°ðððÀQĽœ–V®juM::úÿ’üc0ñúŸš¿ž.@K{åßws[G;s{׿ÿ׎ªææW+s€ÐÖ öMI[FQ +@-¥¨2·7w6¶(¹™ØMò@Ss{s€…ƒ3Àö߀©ƒ½ðŸÒ\ÿb‰¸Œ.Žæ¦À¿n枦æŽÿ¨èŽæÎv@—¿ï  ÀÒÙØÞõo\@{S[7³ø+·pøWBŽÎ-ìþêþ‚)9¸¸º˜:]£*‰Kþ;OW+c×b»ÿª-ÍLÝþ)é_º¿0µ®Æ@{€«¹§ë?±LÌf@G[c¯¿±ÿ‚9:ÿ•†› ÐÞò¿2 8›[;›Ùš»¸ü…ù‹ýOwþ«NÀÿV½±££­×¿¼þeõ¿rºº˜ÛZ0±°þiêú7¶%ÐŽéŸA‘±·p°0ÿ[nææø?uîæÎÿjõ?3Có7 c3{[/€™¹“¢ƒëߐêÿ;–ÿûHþo ø¿…àÿzÿÿ‘ûŸýo—øÿï}þOhI7[[Ec»¿ðïø»aò€vŒ­±óÿËÜØhëõpøOCMó'ùÿ#ãjü·"ö– afdþ·è" ô47SºšZ,Œmÿvê_ru{3sg[ ½ù_FÿÕL 3óèÔ¬€¦6öÿ´žãß*s{³ÿLþ/IÿJIAG[VR‚î?w꿬”þrïªæåø7±ÿQŠ‚ƒÙÿ:üƒ!*êà ðaø{XÙ¸œr³°øý¢ý †å¿Î +Æ®Î@O€îߒ™YþUøÿxþë¤ÿ0ö¦fÿ̊ª«±½Ùßñú_‚Ô¦nÎÎYý׍ÿ[ðÿ<ÿkÐÍÍ=ÍMáV—LùB­S3Ò\k±s†'Åuû{YÀ‡ÃKÔ +ó«zRÃwx*ŒÞk§y?Û¼O?öeiF{±l©z’Í/óüÈhúòQ7);¸è‚™ JÓÎ4£}®ä·!t8™5v'•U Šß¡§;؜a®žhÉÜó1È‘üMSêc0;QAÐj NÏ(ŽŸ©ÇF†‡zn ûöñé²c`)øÜ!)£²ñ…tÔ+|"h ÒšðoÚ¯>‰5»} r)ÈñÈ#íä_•,óÖìÛåß!Óڅøœ¥[÷+µ°®ç¦£øE¦y~ç|­»QH¸`ó7L…ôßÎڐ‡Ìd@× ?€]S÷»„ûÔÚUÓ¾ö!å̏Ì(w–Ô{´@íS03ŒD¸U"‰µ:ºPxë-‹ÊY™¿—f…ÛÇ$ >.hštôþ¶©9“7ËÑw®ÍÀQb0%?Òt­£8!MVt¦ìÕáåޏOWæ óÈ¥¥ _•zÏÔX¢ÞÙ"?¯ö”8Ú]ԆÜf…¿š%Aîϓ€NK†„e2Ÿ9þC÷ëtà(ÝsË-µâ$Èûä»Û )Üì|yà%-vy¹­ˆVáSeù]ó“[Í/Þ²d’Ÿ5ENo#ã«HәáüA1XÑß;^‘áôì9öÇsŸçIœ‡ mÞtÇm^†‘À½‘Ä-á~òw¦ãÞyÿl€w"VŽŒv’à H^Î՘EÍv¡-³º …6œÜ¥%´ùGr?+I'ø'Ŭ¼Û[ H«sh´¢¼?¢¶™%Á@¨1<}^‡m ãnD‡NjZ P£ga8GP‘íþ6¤}¾f'©Y9•_ëÙA2Fé,ÈR–Þçj‚ +_»µÁ»ðw5ÒßÎDš·ÙWS¯~¡Œˆ¾£«!ÇÙ!ÁÑRûÄÑ ôy…Ohšš\!¤îÞ"*¾dd¥'úYúÝ^Åä2;l\ qâkÃ(N‘úéámlùå1ANà×;^ÜD!ZŒM§A“‹™Ï—£]M†Þ«ù¶@«V§ÐG]WÔÈ·ÖbüW§VfÙË»_Ÿh¯—HÕ0ÌØ~#È&OÁ,ï¼cß%´×Ë֘Β)ihØ9zd#^Ð?0éï(R +r£Xü÷4ˎC(wÈÕ3Ԇ׌[ +Ú8œG,ÛËF2}<žzñz[µÍ( ]$7¢/FÀæ}`¯"¦æ¹4ŒÓÒ'²° *N‹‡Upì¬ÔÙ#Q’\mØk0·Y˜ã†²u_Ž20m—cù Dw1O†Ì\£0]4ÊI;®ï²’ou_ £?b°Ôé62šSÙ³\ªû¼R¸Çà4¼Pâ¢xâß¿ø©ùÁ +Íõ43nñUp¥ÙZQIA‡4Ñ+žI½. »dÃ.mÒµ(ëÈOÑP²¨›Fh;wGuº‚vg&°àmF‰€vXf‘åÇe2ºÐ4¨“Aò¸‹|I[ N{…<ó½™ü ¤Ã®p<Òþ”ñl SW“…ÝumèšpÊõ/v̌Ïqü6ÍðjO§rÑyÖó¸ +ù¡S¦º_Ãý""Æ=ýz‘`Ïu£Rzu/ö¤lò šçüꏗ+.ü&̍–(î)lÊxÎ/ÁÌC̱&Ñg BìÅÜ-eºü¤ß¥úÆò¢qc6¿*Ë c$W(ïå.߯3¡yË&ð~·êú^&S·æTA®²Ò^3ÖéÊ"v{B»¬B¤>½Evâ‡m4©Žñ‹kÇÐTêx’&û‚z™%½s»0ßkñQ¾“8.·;;$¸@WUÇÆPäÎ1N@Î7l¹Š†ŸOlSO·{žÆ¶ZC¸•œ°ì(*2M—ð€ƒ–f­ùh…!G]·ÝL¯pÑʄÔ^qÅfÙݹÀ*¹¨ð«ÙûÚKÌ5-*·åS•}™+02ÐŒK +Ánql{q}Gã_@Kša짂øPvÿ.Ÿ¸.½Ó÷Érn£d˜®A3\ +F¯Â놧‹…¾ÖwW{à-¨;#LÒ\›h·¼óœh ¡Rn½»œw,rFOdiÃñLhŠWÉ©kÂ}ÀNí<9°- [`ê + ÊäEU]ÒNQÆÇ­|ööúÑç•Б½dâ¾èçn£›9¿¼iʑTw\÷?Ç·Q‚€¦Ç¹ÜÀÑ 6–qáÒFíP¶²M9fúBöåQ TQ|w|ó‹÷çÌß/¾St“ÿ¹rJá4 )2ÿ}êN™«³¹>=~ßöìýьÀ²S8%'ãûŽ +–$ÚüÆQ·å«S½ýÉ=E“‡Ç„ìŒ@Øí>Í÷­ÒH\õ–h„Å­)~õ±!§’M-օìclò¼ô¿\¼â?}1YØá>*4J&­ *sDp­Ž F¬6@õ(gõ“(Àðå€gþqñìÄ÷ûk ŒwÕT0v(ܽ’¸¼° ¯æŒ¦dB"Ç ÌɃ±]I;1iLl½ç€/óƒ ª¦0¹„¾þäòúo4Ò¼g¹ÐœÌݺMÔ +Þïb4rñ>çø߃duúuø2ßêñW{'¸¸í c&“%éh¿&î'%”9)9Ò;mþìðNÜN€ÀøŽî’“¥€ hhÖ,’Ïx +Ä` ø~¦¿zÞwfP/±¸Ú_ó=µZ_r¯HÜõÄ2°ÚŒËÓ<+]"ŒŸ| gS/W:sòêVµ¶×ö!Øz}öøýVpÓm`~+RÞ3=Âj +jÿy¯¯Ë#ÅÞiK8ü +]´«‡µ£Bö¡öZ’¶ô•lâìMÁ@[¹²Kär*ÌI92=<“¿H#ºê‰ùe Ì¡ás¾Á+ktiû=l¹W¹ÀIntœQ½Æ~8xG O9³J¥T³ Ô¾¾&Ǭºð¨MRÚvl6Šn“2/˜S¿îÐbò­¸=G/nÓV•u2F—RØBö„Ycâ^“YïØÄ=÷«zT÷Ó¸&/xJ:ÊgÔ¢,$yͽçúôèRG ±æoã0m½à¼+ѽQ‚Nõ%-wfa9@ì¶]…d4QKa}ÃZ€®SæU”!Y Lè¾j‘=¢¤pò4iG?XhøjŒ,öDGiåñ»òîhmÊá:¤¤Í#ГYC´Ù æ ÝQýEœ¾¦Ÿ9i›žêtk¿HÁ&è|Ô¥l;9ïüHÓ¼Õó7£BÙn˜õ Â+Ãȁ°’¹dù’Opu@Yԝ¹Ìý¢ðׇjEÿ*„|‘b¬x~=¿ ¯#&còýá7\œDˈ…'pKC¥ãƒÒëªÅ§}ѽ‘à1†z·äs<÷¹9ú¢Zä€ô² ªÂõŸðàœé[É­ƒ§çòíÈ!†ý*ã´ä›÷»®UÆèúíRø@Å©©M¢ 6†9)Õºec2—™Ø&ÄS=ëûuíªÃgbå/”m„h¬õ< +ÈÜˍ‰P¬ž3O¹ “o˜kxáÈo5ݳ»#œ°&RPëÚ#Q›ÓäÍ/u:á2—¸å ¯BNýcöV›`ÒeŠ“bÅpáûÙ *JŽVÒú7°Ó˜P½…ƒÈ:Ÿì~*_¦õ¶¾8:À_Øhâå(I&‰‰Y*&îØ:þhàÂó依…{Ûªf„v<´Æ£:¤;¶ë£™w>_ۑ^œvKٖ®LÀŒø§Yå;‡ÖÜ詃Žñt‹agÁÛ³¾ 6Ô¨hØ^×ö«Ÿ7²DÄ¡ÑxʞçZ§&Ä‘¦³ïwèë^Ïa•æ™áx-ûЩ…lÙ֞íTSÙVà Û¸¶’t³aê݋„¾ÁhÎ!3ABêؕԇƒ¾  ÆP~lÌn1N](bœºkú„ñ£uÚ³ÏoÀ}$‡Æ+I«|ê„PÎM@֚6…¶“ò³)kÊwª4L:pì’M&%¾:Êò€Ÿ˜ˁ§T7­ãð›. ‚‚_3UöÖ+îYÍ}Û¤•Ç’®A¿í#ŒXÇb(@¦-jÚ¸~F†¥Ï^@”Àö N¾¿ðìè§pÕÖáû½î»ÈØAÚìÌ©©Ý×ÇNŠ­rJ Xê]>¬© +ÔôzoŽsèGEvÀêo毟öj*fÍc] oƒ¥,–䙟ìavYãÐiO°Œ‘HV¼¢{P;‚'5RI€ù©ÖL”bw7ytm´i§çÿ® G‹J?ޱˁ³«HèzºüÅô‚C¡ÇEZZ{¬‚8KW2Fێ~V•¹S…ŒõD=[%ÓYG'šŠº2Ž¯ó'ÃO5A˜¨)¡qAÆ·Jìtç|ØõžD¬[^Ew™³Å¯?êÝÅÅâ,6îrÍÈBÖ;xBDÉ j{.3E^g-¼Ñ¥Z+ÿæíÀ +N=2‹©%IWh3Ÿ¾ÛŸªoCö”XwôGÉj ˹u¬ ÀÏÞaœ¯‘™%õ¥µ*H­á¾ð¶²Î—åïç Ýâ,”Þ&z\AÄ&Žð(HC²7Œ{‡{ó× 9G®{äfÆÍ¶¬µð›?CáÐSrûNAK“‚à³É).ÒÂÏ]ðáåøvµ‰Bi—"®¯ íw¥¢ÙTü +xÊÂ;ÐBßQÔÀ„Œ¶‡Z°-yE¥Õûsº›'vï÷݆‚"ï2»$Û·Úí©„”Ø€ Õ³UF18 EDR2ªGv¨.$Ì#E½RX¯«A@s‡Äe7ßØêbCn‚;Ç2ž3O.x,¸»ʄ0ŸÖ0þ=jyŒ¾“ÏÌ­P÷šÖoþRâÊ;:]Kƒïezo*Êiùx·Òyäzñ—\VÑöîeÊ?øD°RòN-'«¶î0f¶²½œ/~¯'­’íxÈMûŽ¸C¾´«P¾yQÓÔµžæ©yÞÄæj-áUŠ«\â#ÒÕ°†-]ôW¾ÿþûçٌ¾™ÑšvÛåv{Òp-M<ŧH[=<ó×Y…p¡Y +¿/·\Á´XÂ<Â?¢êæ4¬g§E->ïy!]3Ä­IÿôÏ27±Þ{/™þvʚ‘Zîáâ +‘¨7[X»6¯ï/ø3vjýUý”ñ¿¶Y,DR¼õp].JÌhT + „ÛýI ËNJ;üV‰ “¿$¨zar>«Èȷ읱쑪ÇRG<„3èχWqñ]ª-A_²ÒUî—Y7kÞë,äÞªØßâÒiu¾Å#$bÞ¥XÇȹd£ÊÑË,ùLoà¨XÙ֊ì]&^%®ÞÂÚ»ß iÝà‰Ë; +TòÊÍÑï1Dõ`B<“1^#ÎÝ}éɅȔýÖ.»w¢°()B/î#VûýÑ÷Ý»EänøO£l™š×þI›’ßH„OöPü5q +Ð;ُ]Vn¬ÈÄӁúٟ“g6.žI&ÑŸôjøî±µXÕŽ6eò=°83å[ýdƒÝRa„Ïó¯N˞•ø= ð‰tÂîÔUZôûmƒ‹· 뾧`ciµF«à²ºGE‰~l ³×ë¡yŸ §%ÄC–æî,,Noà +BŒ¹ ùãÙ¬!Š™ ðB™mIõ@ºJ%”ÛïÛߍ¨„WJ­ËI£2¥öŽ¢áIçŒõuX° –û³c‹ˆ?EÆ8ïl´NšUm 1\o E“¬NBìþèV}þ\¸ãdk¯Éó|Õ;–œ!ágAYŽw4é?Õ>$µ&Y ILȝ C?p|†ç¯‡@&,O¢‰":êçÌE( ±Æú±‹3<ÔTN}àÉ +2| +çÝÂ&öða…Ç‚õí¨V„v†Ì›Žø£“SÒñ’É[)(o?RËõ'?¨Ââz@ùS¾«ö ¦+þýëL^CÒމ«JWÍ TM¦ÊPìé›]þQ},Ýф¾³j‰(ǘÈìˆØâ[­®ÜÔô*Xí#V;B›É&„o˜Å§ü݉Îßúc°^„zîñÖÛ^{ÑØ0 ¡Ü~¤Þèœëô¶”?ÅæÙ×ãÓúøˆ.ÝíE áúšSku[˜Ù‰¤3ÎE2&0 ΅ø›¢.g^´G]~Ò/ÒÜ7ªß–˜g•µ|ÿôéßg¹BýÁ[ï҂ÉÎ߯§j>ksRœ¨õåq¿»:ç̵¬½f鶓ÉX#b‘'¢yJعGž(©ÉÜ 84Ž BZÊz,rYÖ®“£Mï~µÔLój!<`¼yä¤IÎY`Ӊ¼–’)aU(â!œç¤”Ä(ØK¬Å²¬™¿Š»%¹Æc™¸ÞDý‹–Ñ8nþ–‘ÍÌíN0ýS~³s,#Óλ*`klò:…¢Þ`Ä?r,‰—óžßˆ,/ùN•­À¡‚>/i/å=˜%”ýä6T»cÛ+â#ò‘p]R™þa9W¤.ʗ×îñ°{!ÏÜ`£Æäõ‡ù x-oR œ¿ºD€^ÇÎÉØ]õèo×PAÞ´ à÷Ðìä ɐò"Òû Êaÿ)K\ӊ«Ï.òb‰¶_ú”4 b›êœOý¨Nz½ª]û6òhì¼úÅ‹ëÌfnŠ"-ÛÄ­€ºÿÜãmè³SËÕ°gќÎ9.ÚDyâRÇh°bÝQ¥1U±¿•ḣå¡Ò‡øعx$s¬Æ´Ä~a~ 0(¤R$"è{C2]Ãމ÷bš®Óws›Øûkø7Q¢›ó๏úz ‡ É¥¯ÁjŽ¨7îÚ½û~D±ƨʼ^^Gƒö´Õ¯ß¡¯Ùy&ô̶ËáK\ôº²‰µ 7©{¬°ڒ5DOµ³2Áº-!8Ñù‚ce|ƒuÔP}¹ÝØÙHºkæŠJö®;WxQh}Q×"‹‡x1àbö +å{m6ÑÞ»<÷Œ?g<è›\I ʟÜï6qÛWۍ´•æ +¬ {™¢¦JYè­<Ûî¹RÖ ¬\1ñ 9N£hgÒ\=B©=Ñ>¤©‡õÔ/?·kܚ8"]ŠýM¡êøȌ¾64´/~9ž·· ®äD›k™0Xºø ÂT)óÔQtGQ8æ”LҚè@'·ÌF¡^§^´"GæFjXUÇ}»t\Ÿôp+ê +ó]O×G@c2/]WÇàAÈ`Kï•õdgıדY/œJ¯3oìã9² …ž”Óoi‚âg +ÂrÆr”ñ *«Ö׏²t)̟ÏàŸ]6ícìOÎàçmÃ2w˜,ZƉ …–ÍÞõtºwÐ9cú}Պzmì¼¢'Ü6²o,ÍÜ4¢a ÿõ¥*¶Bp˝»†…Le»µ6÷ö‡‡2ƅø9°Ðp!9{3Û!Jî-‰÷Â+oíÞיû‘‚ªÈàJ*ap>»b˶nuûÜ/öˆ*«ÞÛ#šÂSōà}ÉòÈgà +ó£Þ9š8OÍs–@…çöò.nL¬>“³}>)¡sb(ÉËP°%/ÑKÄÊ œ³(ØùÐJòg}jÿ‚?CéÈô„6UœLvX*çÓòÛJaa– 1˜êaEì#ð¬»Ï¸³®ÁÄìÄ^Q[Ѓ‡R…×àe;ð\h÷˜¦—ÄÑ_œ ÞtkîõaÎr úKÙV²Ï„AvvQÜÑT_ðªôìހ[læþA«›Ì*± v^žëO@ôò –µÜRB”˜à^§õ:o–Êÿ`H ¸,k_b!Ã}^×ÉÏ2ª'çYÐ4rÅxØҏÖËC­Ìbn“Èš5¸Ì¾N¹î灊V– F7ŠÅ8ìT2@šñ'»ôu+jïW4 b ڟ®Â_èRiˈäªXJœ°” Ð_ì P; (͞FïN¼ª&2¢ ýöå±yË×áþ’ÓÁž|ŸbÎÿ* ­³ªk²Ì°T£R?‰hHøñ¾Z·òÜÎÂë­eFÌ>ÙC¡Q…= dDTb=bpØT}C–§èó«´¨‹Å„lƒ1Jµø/Ò(R`€ 0´]\sýD±éi)š³±•ÏøˆÊ´=DMoœWž./ŠxÔ Ýâ2ŵÜPÂØgÀlø8z²€ªÔ€„Ÿ€I¥+çm¾=ŒšÒ{ð‚i|wàQºø°=̚Å:‰ÓÑ`M*”ð`èÐ}ÚAªÖ ËùmvdÔ$zH(^Fvú°] 0ò¨ yÎFÃTKèö¾ë>äy<¼;ÉÀmê˜ðOæ±7ÓãÎ ãŠLï`}'馓ָâãï]O¿òLà MûPúC¨@Iq(©˜ó2Iq”pæótþú+ðdgñFH{øÑ Õk ©Î'S‘ã.H§è‚+!‘% …Ä° Pdx›ny|xóý^o×ÌÒ¿.™èrOWÇ3nhY6›Üé^;ë|ÚÞrêö³4§«_7Øxõ6Ã>TæÛûÀÅâõ å×Ax½*ã›À﹓iš´ÓÞýÁ‰Kæ­±­\Ì¡Áϧ)q¤²àèøPÓÀ€ª+㢭«BO¯POŽ…¸¼M¸¹†Yए”HÃc :±Ÿ^ÍpCJ4?¡Qä؜˜(,•¤It q.¿¥!†¤Pö¦<[úšH»œ5r¹26@Ü´Ó'q–h_@3(":LÙû6CašµßÊný£•ûÑÖçä±úªù¼è‰¦QwšŒ)ޅe€ ÊyLKDÄ)þ©ý˜úuÓ£§ÿ|ƒHƒ¡FÈCiS×É£ëWù“¿Š½Y¬øÌB2ÛBô©Ù–“¢¶XäjàNÝ×"Ñnrü……Ók‡ZW‹­Ï7 ӒÌñ IšÂèÜµÆ Ė»”ÒNèžéh >Ì•Ël[ïQbÑ.†ƒ³‡ÌoÍL‚Œ>X_ª öÈ4b +MŬ(‰ÂªkuÐ:ܬ¤Ð*¿!^±ç+ß°!òZÂ衵±v +¹ø âGš!-€˜.JŒéñ‹!X|wÄ} cŒf— +j°s¼!¤º¿·è}NgQ«ÌÔü¬8*Ó]<ÁùôiØSrù±p‘º*ZâÇáŸÁ7:ù¶‘½5ñªA’/AϤlªRx©òqËß{_Éõ,YòŒ‡ù|0|ÙJB›-èQX¨#‡dn·yO=œx‰m»ÅÜlä:I$^¿­ŠµqÏ _˜Ü4€Zpµ ‰*=0ö¥/xˆºÜrÂÁ]ʆ Væ—ôJëbÞ^œ 6ß#éÈqß¼‡ï1¶0~Қ”¼W8!ÚõF. VŠ³™•„‹=#,‡ì?'L¥} §«ðÊ_¤ñ\ŒÙš2Oc¥mÛ^¼.~ÊÊ\ÄMÀâmt!ùð®šrFgnýp·(Qr)J¤n€5LÍé{uЩ[&_¥gëcՃ,H$k-åkOÐNñZ£†®nîfIè6üv9NC}U6ºƒuýþcôŽ‡A³­­¤œß¸2T’ˆžÀEaU~FL0´G‰ë?^w7åÅÔ]ï­UôQôȊá‚mÇBPšqbÄS™Hæˆø£Ñ?*ÂÉÏdc‡X¹Ë#„®yýÉ€1GPšÔ.L³ŒÈíYšæ”ˆg ¾;t=9@4Zù>>›õb4ÈHŠê«@ÅjoéÓ‘ÏcŠ«ÔdqƳÿè6wñààºÆ \ ?%=°D”ˆ\¡›ñž•»ÏY¶?¾D¸Qëàu|QðÅ`ç8Ý'S›2ï™Ad:ŸW)—±Õ€F€oÈv¾›z‚cùkÄ[r” yqÞwçIóøÌÔE¯½ã0.¡–gí ŽÂ“O¨‚_buL(+˜§÷_aö•ãP¸å ž×Œô® +£g.ã´Õ)Ã<ËØêBKØà÷ë^Ý8½™Ñµ~a.ßU«¸Z{›¥°ˆô*]møáiÿäª!s¯_¢ÑW!<ñ\áË4¯wéÌùBl03ßüÀÑbãÊÅä1 .cݧÙ\U³ñDk‡Z¡åxFETåò{µ +| ”ˆ@Ԓú¥¸×ÂS¿ŒÊG®êœÁµÿõú›ßЪaIJP/°K*‹ˆ|ÛIr”_Ëaò½mRѤ¸¼ÝWT:ìYÀ]ªF¦·ÄçBƒ ]˜}ªìÃþ§ßy¶Øu/Nü-·d÷[Huۋa_¥ô¨k½:}ò’•æ¢U¿x,; …„ Žqn†h†JÁ‚‚o ;_ÑîWh<ˆúš+1|½ˆ’ÊBàZƒ¼¤ƒè«Åí6‚èqì®m|,èÖÛqñÉ:ã©;¦X½†óKÇ1;™½¿Xýg©Z‰ê$M÷ ‹~/f¸bdªˆÎOPðs–ʏr-ÛÐCT_¯¼Ü +˜2 ˜êá7ELèªU€Ö¤ ŽiÇ÷æõÛÛ?&F üpËüBØäÔPª.7 TYyþ¹Åyxíi øÜ_”/z,ÿ¡0·}Š@ÛïÉ̈93ã¼-Ÿ¥Bñp qæ/Ùzæ3 ÀýjQ&üC–›oÌ*qÑð3Üáa]ãxѲæÈ!yÂù9k/;­ÆºJ&}!’òV5¸—…‘˜Îþ¨Á;jáÐM‰Êڕ¤ñテwž® ½çE€4e“u{ÓߧŒRü)ë³ÌüþÑ5ñnsÕÏ3èý páôØ4EUÇŸðÇ#,ö­ÙСÝô¨óFáÓ^ùÙ±€ý- ¦èJ€?g`™–Kvé•Ö_æ{”ÜaOçþB:¶"8Ä +F‡~®ÉÇ¥÷d ãEêy[/òÝË`ª%Žôž]a•>җ0 !'dÍÃcMã :Ì¥Ê?^õî4ôœ:Sr •ju6—™=KÃóµNÖ^ Þ-šªµ3\> ƒ½êåô–îrTùm:ª®D§‘â¶*,¬B¨ÊK4¤ôŞ‘¬ÊñÏG÷¥‰n#{m÷óYR@¯Fڍ ÔZáéÒBÈ[ó¨¥â͓sæ:®kúxæ|ZaÅ õ—ÓÅùy}™úWwvÜZ“‰Æє³âB¾Ðæ£Zr¹ޏ¤Bkˆœù%×Ró1PSGãì~»òòèèX£„. QØ»½-Ð҄ñ-þyÆí×g±NÕIj¥¿½¼Ÿct%ð»}g>,–Ø—aY{q(´gN!bÄeßnïä -3î*#õ*@ÊD ÁƄàÌÙ¶D€ÎKϾÛE¤{ç5b6Rð¸O‡ñÌ[FêE+:"¨%Hɾw"îԋ·ß&0©LNšçԔ)nRäO µ.ò¼ŒJUî|6ÏÚ¾ûjFsˆiqÃ× ®ý8ò™c²4‹»CÜ*¨Šf?»f’!¾†^¨­hC™™¼¸É?q£”¤¢ßãCL4¯´Ï6êõ‚µìÜøSÔ¬\!Êx˜"äK樖´½ôpdmŠÞ~Ƌ{ï/› *,¼¦FCæ·Ç¦í犀Ɵ*¥ +S ;ã^CbùÒ:ˆ»+ímúc*À›¾JB’»ÁžÙ\IE"ªf‰Zÿüœ*d·FEo+Ṽ-”)ŒHŒ€¢Î©Oäɯ5°J+Õ_)‹~†®R©’óG$ˎ½Câ?ƒþ\’*êCà„Ç,‚¦åÖz/)S2LL­°Ðîæ™Úr÷¢¯ÈsÜÕõ„ðús‰KÏ›K¨×V¿!uõf" ±(Y҈Ønò)G˜QqC£‘c—°X›µØ6.= +”*©ó ùMžæ`ûÍ^ãbC˜µÒ¿úóf×8ü*.®1e|0Ñd.…7œ—{Š¸P›¿WŒ.Z¤1ÏcâD#‘.boPTÛÞ°ºh$ê8KH=6B2QxèÀp¡€„x‹VóXEââŽö ®´%ð”•ZyÙZ³Dk…8î¬ï+–vöþ¨=(c™»ì¾X@ÖU‰l>ð2|÷n¤z#VZÆ·l'ê«ðúJ¢X÷¥lù̹¢&é©0¼õÝü#ëjؑ×.” Ókåpä,~¨Ú_–˜u5(:²·)Þ,•’ID³7 ±ãÝ ´æǽa6xô%/ ±–@·Pª¤F»˜q!6/®Ib4rS’ÕÀ¡E½OmT•£û£CØn.6¸xM7” +ÇD‰–ЊñzUXšc¼ûï ^)zùa¥ spý`? tÃ2hò¦RäÙtÜøN—è ý@fw+w&ó6ø‘©%ÊêEb Ât!M,®ø‡¬gI;ÃüQͨ]º®U~Ñ=.Ͳ>Ñù\Š qO@õFû8x´î';ï«Àë‡$¼l.ÈNÚSØI5¨šÐ FXÈæɪžãÞ´Î% ÛÞÌA?íÖÞ LýÑàQ'sžUtpŸš]à¦}Pçó€çx5œúCSï[h§…ùTíLë*=Èõ^NL®ÓÆ,hz"$†E˜"£•Üs-„<Á…é,»ñ]âà¨|qFªÉñ¤Eݗ’äµ,÷ë’P=‚À/:˜\©Gê|vXdOßbù‰0{¥ý}ê>¢\ÕÜØ£·Í{{uÕ£R56º '+â@árÿã›ÖNÇ^ö=¥MÃýëa—Z ÊhÏ©TÆ*ú5¾Ÿ Z¬öÑãù·sŽGû§1ugf˜ß¥‚Ç"úƐùvZŠ‡3,#áËáý…’4:æ§ùο*‡(–ûÓµ²òŒ°_Ú³P GÇÚϺÂ'ÍMì ³L-TXEñ›ßO1“V½¨úfÛlASÉTõ–¿ÛÔåñ-*1q +Õ ú9"g³ý1‘h˜ûȽ–ÁÒkÒJtβÑGÕdÁÑø„[ 4‹VžkðzIý'° Ô•a‡²ƒŠÚ}›ZŸ¢oJkp‘Îê³oPñÝ +ù§N|ΞÁ´Fܧ^Å£“e,Ìf¯†ðê[Ÿ æUçn]Ε­cás9ºè=WE «WR·l,û9ÆvðZµýÍ,²è‚OÊ˳Ý#Ó¯²–èWi!—f™ü<Ÿ‡eMa—0¿¼€Ìó®zòÌ__é”{«\²_.‹yGþO÷'$töó‚üú*µ(ÿúOŽ¹güéӃ\™6ûÒp\’¡J¸æ>¼–‚=¢XôqïŸz±ÿ—F•~ê«Ösi|Sà5Ó­Œ¼Q!Zc3ÿÓÒÎd¢6!J}ÜF‘®ß偢ë1Uòø*Ý~uï@þU&å,9I€Ðç8ûÑð°2HKŠDšÓ™òC/Eç¤HùÓøç›_äÛ»eØ3צŠ)õyۏ.TÂòЁ—·$¢Ò«t|Ww!vµºs—×½£û’ܲ¼1®|ã¯êèÙïqDmù՟sï^Á2Ö¹ÕJÅýÓ¸tcÚlƒ~ÉÖ&aðZ4Š÷ö^Ô r_ Uq¦71¾RKv_G4¶ƒ‘Ò3»u-F/ Ñ +ÊÙ«ÓlÕÄEbO­9 ÐPÈ0`íË·1VzΧ2MÄ6"M÷`;­ÇÄ5“åA9Öm +9PSE€´›ž¬;̄N•‚á—jƒÓ®ão…é¨Ô[¯Aþ +a±©ÈßÉ"aú©ÄìÖ·û¹y;ÚµÙ\PÁÒºõ€X¾Hˆ"Àçä*d᪷mvèó⢷MÆX/ÆzuÍ·„Ç‹ÛÆGÇpÐ(ãƦg14ty ˜Ã OßyӂTÈHcÄCÑMâ&»ï^mc¾Ùf›Nw¾C„5µ͕µMD”ß<°ÃÛ§y„*ò¸L9šñ·¬ÐùÎř± FÙêå3)©•0³Èü_-“œ3:@„Б?\/ÐE½[Ó9ÅAW4ÿùuû)ò«@¨w7åËá–)ôHÿ÷˜ØÛî"®á!Ž÷™—žþð¼¹#³|WëcFçð}§k8jàí.¢ô­ü xȂøÑ’{ÛĞ6+䟧¹¨@y¼^ÊG¥ n¡‚çT{Q—-/ú#É)“§†½B0É6o „ uåö*È*ÊE6Ù&ÂGó³âbŸ³PÝ$PáªÕÚçq–@0„¡ü‡“ofó¿ +JüíÝáæÇó-fÓ¢fú/w®S2·ág·r4–6£ëÇh²_毎^ÔÜ@*2gÁúÀ–%´*“p³eE—WG#56}vmåkôÂ`jî#Ü㕃éõäçº2 Á2´'í­ ¢I,k0³Ÿ™JG`æÛO-vÚüöaÈõêÆU<Ñ÷*¼ýð¡”QàÚÕP°pÚ[]¹¡Žª¦Ux9¶'ü¯€ 3ϛsæÀÎÁ“úÕPõo¡é©Ô³n€HÔCž×1kûêW¶Ã¸L=­¬ÀM|zlï0*²8Nšš?VÒÍ!W¿Æa‘ +¢–ÙÓ¢Çôфº "¦osëýÙ¯Ú­íˆi¡ùŠ¢¦_¬RP4šÁ\|™å ËÖLI] È*g¼«ƒäò&á¹Æ$Lô±3?3â+”>|öù¥ËT*ÿDûµCT”ºE֌âSÂgï“6~ƒÒ2¥ßŸuUè¿»²"–SÈGC]xփBϪ~Œ^mH‡²À`ð:T Ê +Ù¶HŽRkã6̪Ž•J_pLï3üöáÄd+L!Õ¹^Ž Œo ÐVXh vi´]¨·ÀŽËڍ²ªV‘)w¦­E§^2þ*WºŒÞ +¸¥ +W¬ ~Œˆø‰Õ×Nñ[yU—Óô÷Ggçmed Šƒøv_];ÞtÚ²N‹¿uá—Ý …º¨a‡ T±Ú9ÁU–’ÍþîhQ½ñ.Ù%!ÝÂh÷ 8DïÕr(¢¨ /—qªÐãČ6E&–æ繊ú˜å[§ÉÂêøW1½ŽMd·âZ|ö^ðm °¢ª¥Â¶èìátû Dz„p<½Á÷(÷×g°>×Ý¢^9R|mŒÖo Cç¥EIYK^Ö­÷[Þü"¤KT +ø°?YˆýbgíË]5q”Fѧß@é^ÀWwr¾o·é=‚šòó± ˆ‚ÒN‚….¦”¥>M䴍ßBBÉË +£Éі:éð4úûï·@à˼qgèÉqx±)üþÑ9‘ïXf}À÷B.Fü¶ŽsJOB•¨®¦Ž9§(Tz=8dvYNS҂o6æ'ÎzŁ5[Ýe«jc-ò»e"3øxpÂÔì}’Ëøú¡rœŽV- +ÊF?0aÂ]ÌÖÞhƒc÷ä.,"¶ðe_àK'°B׋‡ é¯6&L9zŸ`<ˆW5“-!fÏ#è²hÝ°¢›y´j +)¾ l¼ƒ³a<ÌÒ+>ø’ˆZ¤æýèq8ê›ÎÒb8WËÙÎ^ ‹.Ꮅ»¨Y­Om)9çÓ®ëûÃ9zå³FSaÉõ­Á1ÂsíŠP€Êù»|Œ8tAN:Aúõ5ª#\b#§ÒmR˜ÿA*‹yõJÏ Ó֌Êpm—*\ŽYKšè³‰š³›Û‚¬Ð…ÂçÆ KÙx=Å2Û.ós‡i–¹—7ÏÖË-m1ê'%œ^3§-G舌Xíì„g.´Õûøýó»üÚŠ6;š·Ãó øiå¤âçS‚µ9ƒô¯¥z•9”l5³XxvÆI‹Ã¨TAºè1Š;ŒŒ€òLü’Çw!cÎ)ÉìO 7Ìø:Â<ƕ$@k÷™Nô;ÚðtÈ]…YXÖbó·Êɟy›Dxê¶D”9OïG/Òürˆ«v['÷]nœJs…ÏR''Lpm_íï™YLT{ +šœa†— +7äøïVc4„~²ó—öBQÚ¨7#daKH¬+Ùhxgð*é÷1À²bý•e&¬ °S¶]ˆ$ˆž*Äû–ÐÄç£Î©Â×›«öh(ÀáXBé š?”ºâuŠËòmxŸBÊUº¬ÐY°@Z êï¦yßóãlê£è\ÆgSXs¥Ü>]âèÓ´ñ± ~/Òa!p„P²íîX«\=>øãÊf~à¯< ŸÆŠvå!׀¯“X•tZ‚1ɤrµYCœfo-™Óéá´YxÈ[c¤ý¦ï)TŒkÃé0 [aªÝ4 +Qaᄎö\±Q£^ïe%qCÙ+ý+ì-}ÜNçoøµà!–jª6š€ïD‘z´Ÿ³ïƒâ®Â´¨· ûn =fXJþ_å2+9@f?Oׂ;°â” ®ïÎr.ŸÖ̾rY®”£ Mx‹WŒÝ?Ú¹W¾«.ø·¥c‹½È¸ž™¼^1¶jŸ×fÄLuþðÀ^Ìa쐤à>ϛ|éP"¹ÐhYKˆÖ7ô`•'!qıQ8ýMë¡£ÜÍxG'òÄ]²œV‹]Jµn-mú> ë"pg}?©ùæ‰Ç^:ÅÍ[ÅüMk#»Ð«À,›žcƒ_‡^êÆFD¨RtåIÓ-þ-Ð¥ÆXÇ +–ZˆÁ‹õÎ4˜Þd[hÁ +?ðA?끹K¿]W¯k'<þf”êÃÇ ^2 MßƑO”˱T0;£Æ¥cÅ!3âúS E3Õ™º‘i$‘1+»Œ¹|‰VÅÉ°HØŗ:™@Œ»¯hy³ä^ä¬ÖUÉ fÕ sÂö´ÆåÉ-;Ÿìï¿zöÖ襩Y-ËÜ´-¨“6èÃLÞ`ãA±üåB„û²îÚªëT”îœú+²Ç(v]\MxàÂà¤MMmºî z2›\´î +ºúe‚W©`ô1\–Ç݁œ÷R¨›lýïßt˜6+ê”ìÆÇz’5¨¿ wÉTâ®òU¤M?sÏ‹PIRõ^¨VP­.æ¶7ü¹RìæA¨"úÍÓó ¡{ÕÓ)aa×dTÏTÿʹ%þ{VCð¥×ï§J—Á1‹h©_Ä»[4r봆Šk±Yœ-š:3gڇàçý¾}›Ãv  aÇ$ÈþúVu•øs¦æF·<©#\u|·Ö¢Œ›+Þg4gS?ªC‘“í˜Ƀ:R_]…Óº\ámÏìڎ¶k(­2ÿû=í0[Ù°4«þ›Ÿÿz2©)é%8Nlð%{íÀLERˆVaï3¤0xÍóœ´ï·‡éK"\ÛTõK¥°¯?’ŸV†è‹S%ðÚ,å^õKJyÔ-³Æ'^E-eÉã,ú–gŽ^ãsd῞qf]pÕ¬ÈjxWàÔ±¡x¯"ã$Ë>Z¤ 吾]#æ"°ª,ѐ´2¾ow0£.³µ12wq r<‘cÒ×Ã) epß6‰cñ9.l5Q‚ìx/¾Ù~´T•Ä¸7 +¢%²b¦Œ8cŸÛç iM¹«$.–Óqó!áÄZhšà>\\Æ?$¯x;²ž®áý‰›b8B., +Õö~º5EŒÚÒv¢häD:?!|o)–(ï ¢žyðOT¤ú•¿¤j€E…’ y¯ÕdÞ åÌcñÈõ•·Öë@4Z7‡ìØËd8ÙB–£åðá¶w$Ypõåý´ð9|7»,¦w +jpU[LûGöd¥ÔÑ[ýmsœqxq|!²†æõòKf«”Ü@Žÿòk\Ðåñ^2{µczR Ì çNdªGvCÈåé3çŽ\yj8¾ôé'dí' !ƒ‡ QÕ¦Z뤯 4 ç) %S‰Ò‚~{> "Yghl»[ö˜ŽºcKíTdP›À…ðq. +ÆwљDËØúþø”nO|ôùÀ¸Š6Ûè•Í¿bÌj<ÑiÄ«Š¬Êaz<¨—Ï(遀Öü±£õÈí~ó‹o§û‰œ»Ó¨àW$ +c%N¤§,—› +¨f•arïaÓ]<%óàæÙñå³Ô³EÖ"ó#Ù8åÍ0ïOíìo•‘/ªD›ò²íøºY.gª™›Æé¿ 6!½\dnaHFUâ­ô©_¢¨g˶ûÔ/––Â,ÆI–kÆó>eº¥6¬nK‰ˆÉâïU SÅÃéIm$Ê^@“Ê$;àZ;…µ5ppd*¯E4ÉÒhdZ!ÏMœßîj¸8‡˜qî Ûë÷) +Mîýr"~÷-XÃOÜ"ñrV×äï%ÕUi!:ôÀ*”Y\û|”u¹| ‡ò¼²S£+ñ`¡äm²Z#SLpÌöÆzÓ`‘lÝÎ#ž ·òfjúZ*ú9X^ìô¨ 5ˆ¹ä¶¿I¯Ðw胲±[†iI›`ø,Ýn#Ëp⿯îbÁÜ«”ðïGÛ8XÉޔ®O¡O\ÛoûÝ)ªJpA3ñyÀ‹%n&Ÿ‚Q˜Ÿò{xþÚ£ÉÀ‘a]“)³P` +5'GÍ{,ù' ØóØÂbI•&yN)֒IA~†gÜë"Ðfóã'0Õ~ì¤BJ0žr ÝOYBÕ§=êCù‚Ž+5èQ—FW®—AF&è%õPûœÑ^/­srmÝlÄJ2ø\Ø@čx }4pF‚ßþ©¼õƒ³½ÌhƓ‰Ç FbÔVÞ¾rý¯íò¦èÎjýníŠ\ó_\¥‹ò>?ÕVȈšy€ìòu$¬äµêa/EÃOÇøOЙœ8z1v†$D“I1KCыr¯EՌ֌ĥ=lãˆG`W©ýb-ªºééf\€9ôhhÞÂR5P÷5ñ¹Æ²ˆ¤9H~®¸³\V_U•Ýãa[`üihûF|ì)ÁÃ[ãå6è +nQXûêµ´hý]“,Š¸dÉüÝwk%P1y rÄ¢Ø,dx3Ój°AàM1bá—Uº‡àW<*e5Oÿò 'Æ*ETòäǙÌg*qó7”!"†øª'§±[žM°ˆüù{¶ÒvCxƒ¨†6ZÏ0§Ìá¸e'€¼Ul©êõòÐ(¤"ûí2¦4±Ã_Žþjà,Žƒ(Cð¡ì\téæÏX¡P¼º(dw"…‘t—Òºl+>èëœÀ«ýS+4çÖa<q,B+~Ãz̋u]ã½å_­!ÈB4r¡ŒÍæ¢yeÝV¸>ÝsúŽgGKÕI(ß+ê飆ÇÕÓª”¦hŸÀYT?žDÛA2x€þ h”j† Wn€¨g9çrõøžÔd·I©ÚXÑs­ö笿kª=1°‡òÝ÷‘z ™*؟éŠ,¨§«o½¸!îP¨öäÇ¥w[°€>¯t’ ¯¸d;!(Ú8çÃr¯ßËr5Šœìaå@¯Åèp&Ý—¬äÈìÑEžê³½”òBåÊ㙸FxaSªo`nøPUb` œ7_!† 'ˆ(Ëøi×åÆ(–ç_±º*<“`¤Ÿ|? tP¨#  ‹kqÖ üžß4P¬À”±‡çðŽ’•\`@úkKj{wz|R¿ØÃ͇¢¿Ì:DÊÓ9™Êæъ‹–¼öÄa¶¸@c:µc"EŠ—8X…ØõZ}`LÍí³ÔWÙçöìÿÚûDÒlNŸEØ~x}À쀣gž/±t16×tÛ78@dA!¹f÷‘hP†œb£+‰>S»P·Vw»gÚÞ@›¿j3È/J1Ðožž«QǶ{CÉK‹ªNè\ +nªfZèC×¥3aÀÝ‚Œû…âÿ“ã'e;߶¼›$NÎ|úÄݏ'‡ÊÌ¡ÚµˆjÅæZk"°òàœ‡x•{ã¬æÒjæñB¸ )z=°ÚïîO4,ü1~Ò­³›r 5«¤]Œ¡(³ØvçáG{}‡T"ãÛA _¾¯­=8£8«{ˆõñ"Öã4Œ¬Ì1Ò~+Ž7Þ=‡å&þѲiL±OùU“t:GSzp–Cà–þ‰ëZp²ß–š[È5!Í]"-*–Ê o•ðla +&[IŸ'#ûým"P^ÇÁÞ¸pÛÀÞ=YVõp öf´« £ïىœ#¬6Ϙ «Öi’P«êæGÈÑPˆ—ÓÌç»èL-§º +j¯]Æä¿ÈbS«z Œ@¿Ãò÷•fªæ¬77¹žúæðÀ`T8G[¶‹Çt OôÄÛ¹r7,‰Õö£–Ü.è ‰³3Ò dXeK)-ã›Û¤Ïºy®¥8¯¦:w‘‘:z”Ô:Â<Ã;°b^Ò7rçi÷àà3'ßÏëd ݛe5¨´½kë#…˜“™«xæò@Ét5(÷ I ¶d>ëÖ+¿OP™ƒã tñÎʄ<ê67 Ï[@ìÜ#Ò6£§í¦‘3½ ¬šd —%e~…eåE]‡M$1±×¡û7"vsŒs°_yiñ“ÜO=ù]=ö™BºeKÉà¯WžnÑTт2:$’,eFÿL%x5»çJ†$÷å^ŒÅÒ³¹‹5hÊÅ Z@Là™ç¨p†ª‰Â÷$p­¹ 8‡ƒ<·ÒwäÝQ‰Ý¦r Z:?¬àòÀ=m¬Ün9èp¥&a«µ¼cd§0⢅ëU%hC¼…Ö·? +n›@š—û#Ùø NDRé>¹ÊѱÍÌÄ<`ÂM¦ìdÏÇ¢ZøãVR)÷Gä:(€m‡¹¿ý­/x +~H‘•8“PüËÐЪq]ãÏ«@Û«cæо Í„`†A$z2&„çRSÓï±@]ðGN—RNlˆüêú¬tÅ(v…‹×ˆÞiJ µw® ë8³ÔºÅ/{5íy}\[/´”^Eš²5g-J—õmƒmÚJÅòô˜/y)FÌöð¸> ÊÙr%•çIä|(в> endobj +12247 0 obj << +/Length1 1630 +/Length2 7267 +/Length3 0 +/Length 8102 +/Filter /FlateDecode +>> +stream +xÚ­VeXܶ¦AJi$‘î.%¤»»f`†în¥¥G@%•¤»[¥C@@ºC¼èwÏ9÷ùîùuïù1óÌ^ïZïŠwíý “Ž>œ=̤ƒzððòK´À®vžMTƒGäè©mî|y8ÈÖ ƒ*Øz€$Æ {€HHHà³äan¾p°£“€ÝPϘƒ‹‹û_–ß.;ß w‘°#Àz÷à ¹¹‚ wÿç@}àá8€! €¼¶Ž©ª–2€]YË  ‚‚඀Žç]+@€‚"@ùë öàß­!xï¸ä[ ߅|€ ·ß7À w#w¿`Àn õ¸› †!žö¿ ¸³;Àþä‡Ýy¸Þawd:0„»yî²ê((ýU§‡“­ÇïÜð €9ÜyÚÀž¿[úƒÝÑÜ¡¶`(àòñøË°#Ü ¶¾w¹ïÈÜàà?ex"ÀPÇUÀ €ƒmáöqGsÇý{:ÿêð?º·usƒøþ‰†ýñúg `âÀ‹/ x—èq—Û Åçû½,ªP@€ÿ/»½§Û?0/üπØï Ç]¶ö0(Ä`rÀçӂyÜ¥°ÿßTæýωüø?"ðDÞÿŸ¸×è\âÿï}þ;µ’'¢eëz·=2€»WÐü~g ¶pÀï·ÆÝô¿Âl]ÁßøwGcÐ_Åþ7ßßaUÛ»¡ÈAï„áäåÿË F(}@ö:` ÀÁr7³?vC¨=CAwÚþë]?ÿß0'0Ðú[‘¿ ÔþïåßÉõ§x>5mSEy®÷ÂþñÔ¹Û_7à¿ÓkÂìÿyøÍóìÌàÏ#*àˆ‰ ÄÿMÆ?4ÿ:kÚzÀÁ>s~^~~ÀÝ÷?>ÿ:YþF +„ÙÿÞ}[¨ýݲýÓðzÂáwÿ¹ÿwMÿãügíA ÿë (᜙“åQEõªgHÁ¼£M³'Ò­¸ÆàMaH¬583fY¢Üæ¦2’·vDò¶ÑwzÛíç75Îõ¾6J[ëKÐ^] 3G{!É+JŒk=ŒÏª˜(kÇ8ÁJc ËL”ßh}eHWϪè‡~%ÇÛ?çaö* !|æFÌøHÑü ´êõökê÷ó3¶®þޞîÖCìöo´\ÈÄ{,R^XD¬ñ!îHZ3ÃrÿX®5ŒêuÆí)¯DmIö”.Ó#(‡C3§Êòu] ŽDƒš‘¹êb˜EéŸô6ñŠ¬Nóœ)P9ÔrÇq•~]«,ùþtÎäõ±ï\²ë#¥šŠ¥?ñdD03~i¯ÎRæÕaœþÌùéXæэZ‹·L¦^S(M ¹¦¢U×õÛ]‘5 +‹åX®²8M³uãö7KíuꉨŽwZd;éØîbˆßÀ€m,ûV=ÁCÄBŠIG#ZÜR%6ƒQÁøÌ·ò7EiÍLgÏ¡±³Ší£õÇÕ!ÌÞT¶/¤ŽRôÃ՜³í$ó©²·ýË¢Jó4x–5ìs¥ðüÀW“'+Ó_}›CxOX³ˆGˆsœÔ”÷“’=—#F&«U>þìu †Z §­nõ’á Ë\–œYcÌtÆñÍ¡=©iǵ/‘äç3+,M×9|}A¹ãÙ{3dܲTÙò/ð&Î7¶‚ µÑw¸_KW²E%W·ûnÎu€§p֎ k>OÜÃ>î¼G6*ºKÄÆx¶pwa£.0ˆÛ˜w>üë#³´‰D?–{¥™È‘“èØ,³u³fT¥*®l×^X;¢Vð[MÌ×·õ•lpy8MÀÈ@âþ‘1a˜þh¿ÙFlêëí“óp/¼[HòÍc{E»ý#>†ù'dÐuu³éCÞfF½ÒL­å¶ãd°ɐó¤ô¢IJ¼i‰ç¬êgR­i/ړmÎ÷a¹ž6IÓÇUÙܬZ_’ˆ¨¾Úá%À«7­{Ÿ,w‹ÕõúvŠIV‡÷rö°qÑa^ºr‘&Sz›bZo3ª´–%¦8*L5ücòX`púûiÕk$â4CQc‘¤Rú$ìI +'ÂcR´š¥uQ!½Â©ÊJ£ãëS–Ñ•¾½G̓¾açûF {ƒ_?[°T/F߯Sž1n$‘ÉÊمÏ•196sˆïö’ë- F•¹Í +#KÔëÕÙfý¿ˆ²Û¤õ^tgN°> +.i÷i'J*Où«ÐÇh2rÐ[î‰ ó© '¾Ãµï½²Qbš´n–¶]\½­áL/'|À{èãà“sùaʾƒ¢ô4^rIÖû‰¢ æî<îÍæ¹/ù”àV1ZO¶Lü]R )–BÀµ¢‹nîÁ'™ ýº£'Ç4¶fµ¢¤`O§m¢ð…Ï+_d*øGO+ûŠF‚—½Ü[|VËib™4p÷§ *¿¦Ü¼;d<,í=Yèr{uh¡ÿÓ¤…“2DM5ãýíÆòýˆ‹G­a±Ùß'r„‹ðéϝŸèMH…ˆœ…CSÅ/fZ:ëŸXeeµ¹#‰ÈèYÙ‰T„Ñ4åOm(V«},úG¨Þ¶ –ý ꎑϪõÒ南³ÉHÃ曲$vñҊ:¸E0ÆÞ«6 ˆ +×åÙô*]8SV¸ØV:ðox³Ìvó2Ô ?„%jã{Å™iE{~0CœÞæR»Rå‡ÁO~’øƒ¯³ë).Ø寅ï‘l(«ˆD!Ê +ÿ–˜è pküx[ÁIÄô‰b™ûÃÉz=Æ©E"ýjYùִgÁÐCjVî‰Iô°Zœùº,ø¯fcJU†›ÖBüñÚ³y[¯ª+¤LÍ_ºëö„­bdþWÌ6Þ.îý•Qåt ƒ¹“?R„æ2NßÜӞÀñQ›Üú 1—­wÑَÇõI¤iEW,ŒöE$¡­òõ|º„%Q£Yè;Æ3Š¤×öÕÖ䧂ki#N lÚĂ(܇ºrÝa·±ÈïŠF!‘^ +BÊâ£Ï«V3ÞÝ(ÏÏvY§Œ§}G–!ÖTÌüxôÀ”FqòÙp풭w½jHEMV‡|ÎK€ä4¡ øÐç#ö6i!FÔ Ùޖµ-%e³hcäé‡ÚɐC`YS[µŒµe –Ú‹HæP,®l$Îø\á`+ÀˆÈ››üv’ÓõÁK»gÞjÄ õ6@Âc Ä=J»‡Oª›䛮"ŠÔ9_^W‹Üºé-¤Î Â~tˆs8Œ­[«Ô:¦+S ×V«6n½Ì°žYaÕ¿]|©gúú‡‰òäJÅP÷Ü×t:9“¢4.v·Iï×ç#2®ÆLµêñ‚jߜs9¿Ÿ²žö}Ä՛x\¯¯æ9¹êM8ýw퉪KæÙù{ð÷)ü&Ø|üNZXÆJv·H…¾y_‰<~cü<å¬äÄä ˤLh££„F2áö¯–nÞgï ʧñï?âKfm&L¸×¹A¶œú(ʇ]R`ëú }ÄÙ9©L™¦AjÊYœ §×óø-_PIó­ñº[c½A·Šxaå^¥ÿ»84&Ãl"w3–Î%+3öáÉlû#¦Ô­"*{ßný/y­É³5Â`.§PǨ÷òúÉ z +¦'G쉪gQP¡i#³íŽq×ù÷Óª”š½gÁÀâÐ>ùð‹¬öŽÐ'ôW({‹F¸ }@B܃ËHôâ‹sìØ°üª2ªñ4»Ö5R–¢L-±$-P—-âš-&½!¸§Hå&Oàû{SÆ,— ‹Ö…_é p)„=›¥Þz„•z´Ã@Ss">`\8•QGÀdÄÁõ¼*<ËQ†¨×švî;Î:-‡²f‡Á5j>=ëù>o ËŠsï]Û1±§cJ?üõrIæt‰#Ú\’½š$§ðçI6€c·¢°ÿé±Ýæ%mÁzkfÆÊûµ&ÇTÓ{Ø,*“o_õô”{8I|Ÿ&õ¸-QQ¥‘J($Ī;Á`¡T5¿§0[§÷h€ +âð¯¸ï5Y ôd,¡·¤--¼’/kˆ’ÛösvÀLô£šm͉¾ÝUN!ƒš”l¤O±HùDíDä½.3W ‡S**—FØ恾“ه/ÂôãÎp +Ö?1y‚2Nƒ³~Íî¿eB5ˆ 9,óíæVU| ‘xþ*SêóÈ$¤¯ /Û l@¿pôá.]ò§±ýª5á ¥oº¾cD£°ùÏê%åÚóÅ[Â×æBOÙ)Û¸ów(·žÅQÅqrbÞti˜=9ôšXš ï%C1&m4³xŒ—®IkRL8óDZ!À“Ô{Dó´`ŠVåQt¨”äøÛ¶Xô‘ æ(QCñâãÞóñJQûƒGÍÙÌ2g>›,ސº@kÁoèÞäæ´áҊ ‘«CI`p§ìV¸2Äás³ý¨Ëã´9d*ÇûU š4z~|Tëõü֕O¿Òq-zÌ$Ûó+•¸Ì/…G-Hƒ@hÆûè3þÍÈXc¬ô°W1C{ Ôêu~¸ã,M{KêùÕáo ¦ÔZËÏðyפ4k¢0`"mè^Ë Œžbäùòµ6 çÞÐææÀ/a’+Wò6š†t‰ >J>Ëæy9©˜®ýÛô½Oô«VïŽfJ¥Í“Zðv²˜q­G9p¿¥=Ñ;;"âÅ7üŠ÷†O ÷•ÚF……×{¿Å©Õ‹×ÓN¼’_Ý‘Þ ÍS©›_ +e7"†å®=Û¥£æ`ó¼+Ö_ §ëÞ­Ô¸÷Bêüqi®ë:™)ó^έ–°,3 hÄýP UŠ0ÅkT%#YŠbû.·|ñ²T>5@ÃћÛ䙼T×x£Q©ˆíðHŒjü O™£9%åþ"\o¥}bÏÀ­)ìJÖxÅGKÝêÔe:~èðXñeŽÌ~¤wötӈ棇b. Yê*•WʍÉÍ#óû1]\O8UÁd5SPJÐS®çäÁöªBé®»Qòa‰cp±/<Ž<[Ù \ºøp25ÝìUÛeíknÀE[kX‚%r„çß¼+aá¦TdH°Ëa%¥úedòÔä6* +ãqQ™@{6"/QÜ\Üå8ý`e‹ºÉ”LИBÆÉo¡¥exÄRWÁV,sð,úæešf]NV2îLðy_f®.O¾ÃÌLÃ`§Ø+Ú¥xÚZ®L|òú•Õ‡ëý¹gœ7ˆh˜Æ0oŠQm;È§†Ô*8éÇËÖJñüfÍo¡¿ð3>ô‚Ù>{–…‘cü¸!‘XÍJrg]Õâ¬Þòûd›Fse9gòà?34ú¡‰»aƒÕ"îè;jíSW³R‘w™ßÉÅg$ÙV›9¸ûˆEC'?*Õ; +LRi¬´Õ&×$—¤†@Q½”ZõùŠÛr[¹ ÛÏßÖ®[þ@‹µ»ÚˆŽ{½ýî~µ‘ïX…]ÙFlìóFýþž¤m*áÇ-Ö}È¿£úàŸp³fÆZuíBDå¶>Ë Ûbø8?ÖwByV¬LÛÂÓµÑÑæÏŽy#ŽL†-¼Î¢öþnãàÜPÑÄ0,½Šg{>ð˜ÜNZÕ ¢™ 4™VÀȵZyZ¼}R]Ø¢xtgIò3ám6óY¢Lُ ˇU[[Æ·œõf”˜OlèmùæN1Ðë§Èܨ÷pŠ—ÕÕËvl9‰ò½d‘EˆÏMŽÓ‚@Ôtø¦(‰$%èo\"‹` rĘɊv—QûÀYÑ°‚b¢:ú\jb œ‰ŸKAz?¯^à2°>iL}λ…‘3bÌ/ï~·r´Ú¾Ð2tá  ÂËû÷¦i WܞÊEQî{ì¡Îý­Rá©x!†fȤŸŸ™äÓPsŽ#rŒ®PƆ÷ç¿\8!®EèÈñ> V’3¹8zþ@žLòÈ ç_={¨íŠd–'&³ºDÎfÒ°aY©§!Ðç +õ—SškøV#]+–±¾,¶ ¼{SBy’_˜°ç¤×¤rN ÄZ;k‰¿:UĞñ`®dBo $`•ˆëéxюρuµD +_θwc, “îji2âž>4cܜ“Í5kárÞØÅO¢?B|ßïµë²Xå€lÀšB ­ï_Ó>ýf»Ð+¨,=€uß Äk¡—s‘ý[@ $ë…/³ÿ;©øji#îSlƒ‚¾%U£i¡å|ǀ'h²Nj8µƒyW§C†ÔJ +nkzÃbýÀWÚ +”6Œ³kš_E”!PR<¨k´<°¼8!›^¤ñ³V¡"¯4D"+¿­8؇Rç”ᶡUF}Ë-k¯a¢¹±Ÿ®c“8Û'ÆØDñb‡µËHeJ½:e¥Ð÷W S¾‚Z0¬ý2È]ÑAþý›ÕŠÉ¦Â¸Ëà%žóÓù¯ŸöpÓ¬†{M‘.ѝΈ|±—Zþ-˜¬ºFõ¤~}Žº¾¥ŸbXó¾ÿ½müÇÌëÂñM?ÿx'ä*Agi)ƒ*¡6‹¯Ó›¶%èb×&Ïî¡w.†¯Û '0ŸyŠtÐ\èÊ5_1JÃ)t*¨BñøÝz|âõ}yÌg[…¯~…®çãå7Eæ,—\5T´ÙП~¬v'¬Ë¬DÎ Þ&ÎZ#®ÓÈÇ;¶RQ“<ðïr.޳ˋ,÷5éÏZ•Î…d/ÐLg¯”’t5ªüyKƒ‹¸ûó}2ÂÉ<®eHõØCå(+š(Mî±{ÇQ=üùøqm’2ð¸Lï8€9CúYe‰;>+&ù&JÔWýröð O‰L;Á æu¨A8¯ˆã¢Ñã7ƒ¢éøêFärÀÌԆë†BbìßìdM-KxN?c[ NbÅ£÷çGN•_³ëÔH+|ºš=¼Zç-üeµEŠ%ìb£7™C©9$]è컖–÷s2b~ÊG¦Ê5¼Œ—?+[¦îÇbîˆViàÅõp•GsÚ#EfC$¤‡%y0pú4”•MÓ[™¦É lI(¡ÆFÒƒø…uUàՈšñ%ˆŠÔ0€¤AÈÚÅl*W®GL´ŒgNþ±ì±±íÚÆsK #íæBIBjÒ3ö„HqÒòÍ]’œêú~Z켉˜.¦<ÝÚÓ*Ä1[-´ëilTÂяîiÙu!GÕ8,gôídQœ?*SȽѨsZ2°:z¶ìôiâ„E&ä䐥ØW'”7ù_„!P6«&f6‹otd“5igÕ|ˆå(ø‡  Ü¤ïïÐ ,sJğà3ì;˜íÀÑQûú7”ô 6ÃêÎ÷3Ñ õ O™ˆ +BŸx‹¸§ß +f"ë÷nHÑC§¶Cþ¦Úù+|JãtħœAÖT׽훯Cô›~ + ãe!Î<Ç]¡9‰Xýéؾz1씯Ax©·M”+ç5ýîºëyœ +®¼qu͕!9üLV¦3g o4)®æÌó*:’×€ŽFò—†qUÓC—¥Ëú§;¸‡ÃoåË«—M±A*‚]R‹DŸ"XœÎPñ»œ6 ¿HêM’ŠáíE—ŒÒzèŒ+Ðg§8ïtÈ|¡ˆ«Ø¹¸Ç©ýéeá¾òåkˆ¶Åµ÷€Ï{Ôô2Â<«hK«Ó³W#^ A6;I‹ãD•vËôP.ÑípG¥¬Rp$Ÿ­ä"^º‘RåEǀÁ—I©ÛÐBž-›ˆÏÔYœ^ß¥Å›Ö?`ˆw϶i£;§¬ó>RãE5 +à 1×¼€­ß¦ôù+R¶x¶™ÎýdÒ¾¼U¤"i>ÄdÄo{6’Z²©&[þth>ë•D}Fè‡ðok „¥˜“©óo>G¹.Ÿ²´$e ¾R§'’¥D1Ãë¤U©U^Ùљõ_Rîh†é6>MÔÖ2[²ÁOùô3›ó8]‰¥.JªêOHýˆÂ|KONÈq´ãåÌb>ë홾(RÕí#u“xïÒ‰‡fœ¾ñJ—§í#”¬§0aоŸx!‹Ð…6CWyÌ(#oFýªFQîîÈ-´ý©NAFÓãÚb˜É&¤ÿÑá~ãµK·Ê¡ûæÜ£IÂì^p«ót¼‡-Y¹‡¥ó­K©;eS¤°’åzVÙ¶-’ìŸn±¸\°q6ïl2¡uç<Ÿì×[ëVEåPىiÖvX=¤åYt^Ú{23ÿÎá{±§^*ä ÒØ-Ö± åãB÷ÇO¾àùµCóÞUá.’æ®T@¯‚7³Ê(¢ú‰­± fZNìžÊªú$ô» À9^ 'ÝÒúü É¢¡î¦ÉNÖçAü«ù&{¯Þ€!{ Lù™¶¶®)¯µ1Mþ¤Þ³‡èÚߋ#_ŸÁ®Üé†íÅñ +¨¼Í·Ø©¬«åÄ®XùZ˜¡é„‡”¼yÀFu\Un&À|Yëeõ¬R«¯Ëíqàk™¶ E>¨‹i_ïîÞOGûŸ¼5“uSð/|Î yÜ7%÷C#FAã2×xîÆ­X¯3ßn^Ú¤‹æA@Ã;tßÁ.ÕMRy;£pøè¾'q§HN}‹óÇÀ™ó—sl2 ¾q6 Ã:È¡ê5ǽ¡÷ 3=IèfÂPk/¶üJZíCkåÍ8Ïms.ÐUÙ}mò)* Óz–¶l›Ÿ]r@ü¾&múì”øƇû\üàA¿ñg鯞MFl¬$Žml£»sîàUPä=«TbëØ1ÇÙS–P;9òGÏðtžr¾Ôº4âÃ÷´9RGu~¨7ÿX/[_AK˜ÊgÖèa#‹#³X›…U—$ùÃۆò ðkº¶_em³;šÆbhd³”ÿŒ~aA™›Ù= «œsèN|ÏÜ6˜Kže¾oFV¸òÒmÝi¥ÿ\U+¬±IcÌ雷Gïí¯…&ÑÜêçIò×É7âW’r}ۆ˯€Rž2cµ >PîîÑGxºÿ +œ‰®ÖÎ玷ҚԀð˜ôsöõˆïø©–vp\R÷ \í)¹lm¿™Qº´¢£i­Ëœ¼ƒîp#=csm™…®´Á!ˆöºo}K?ÐÓ· –zIÖB!õb$´¡Èý×?Z࣭f'_ÙÏl؊ÂâÈ÷U'+kŸ£óáó¼éÐ^J#×ê<"ؐxLt«tÓ™Ú?û$÷#!u&ñceçÀj/X LJo´t[üBQºû?Ÿ"ˆ¸ +bʦ[Im¥ ~ƒ&1|PÁÝž1ÖÒñÄαÑSʦZ<èXÉttHV‚ldJzCRO•„èyqyâÆ*͟PÿT=Û[Ç°§ïWÅJíÃm|è7ç;†e/d5°RŸ]ëñ{÷ô範¿ÈNÛîX‹|ô%OyÊç–*¦Ò+‘B­Î–¾D«=ꁉdÚZ÷é}õ¢ì+Ê\2ÁŒò„ÕjC´J ÞØD +õeÜ¢ºÑu^7:>O¢ÅNSt¥¥«t°åS‡0¸<>ay쏆<ð€ç ‹Í·)X¸ÆNFù&Ð6Dïg–¬ŠqôRåýŒ»ÊD64>ì|e±Õk[%{Xg¿YÔ&eÀ­ñÜ&úâs˕·Û›‹7åso ýçÃz”Ì—¹ºðYü4¢§aPFL÷nقÔÙXÔꍄ¹ÁßQ‹K@ºlbbš561"PÙ|x(­3Ì{hpŸ¿^«2•§ñ½>oÆ Jkú ƒá/t?R3úº˜ÀÔ׋¢‰ø¬¥2ŠMðˈ +›MÆÎýþ Ìe¼³Ÿõ^PÚTÛæŒN?ö%TJ¢ö„8Ò[¾æ{m·ÆNO«¦‡u씳טòÉÁãJŸ9gðˆŽÎŸ-‰n‹`–HZ]mƒñcËàc©wª¡%ÏE4Q·ˆ³(cb“.j&ù¶Uåù_ÿYZÍ +endstream +endobj +12248 0 obj << +/Type /FontDescriptor +/FontName /JOTYEC+NimbusMonL-ReguObli +/Flags 4 +/FontBBox [-61 -237 774 811] +/Ascent 625 +/CapHeight 557 +/Descent -147 +/ItalicAngle -12 +/StemV 43 +/XHeight 426 +/CharSet (/a/b/d/e/f/g/h/i/l/m/n/o/p/period/quoteright/r/s/t/u/v/w/y) +/FontFile 12247 0 R +>> endobj +12249 0 obj << +/Length1 1626 +/Length2 18386 +/Length3 0 +/Length 19237 +/Filter /FlateDecode +>> +stream +xÚ¬´ct¦ÿÒ&Ûê8Ol£ã¤cÛÖÛ¶mvlÛ¶m›wœNrú¿÷̼³ö™óeÎûá^ë._UWýŠœXA™þ‡‰PÌÎ֙ž™‰ gacäâ¤dg#gÇ%C/ 4±üճѓ ; -ìlE Üu  @h `a0sqqÁ‘„íì=-Ì̝TªJêÔ´´tÿ¥ùÇ`äñ?-#,Ìl\Övö6@[ç¿)þ¯•@€³9`ja Ë+hJʉ¨ÄåTâ@[ £¡5@ÁÅÈÚ ca ´uRLíÖÿÆv¶&ÿ´æÄð7×'€!ÀÉhlñ7 èn ´ÿÇD°:ÚX89ýýX8Ì mÿÎÀÙ`aklíbò€¿zS»²w´ûëaó×ö7™‚“³“±£…½3àoU±ãt67tþ§¶“Å_3ÀÎô¯§‰±Ë?-ýËö7Í_«³¡…­ÀèîüO-# ÀÄÂÉÞÚÐãoí¿Éì-þÃÅÉÂÖì¿Ðf†Ž&Ö@'§¿iþæþg:ÿÕ'àëÞÐÞÞÚã_Ñvÿòú_,œ€Ö¦ pÌ,k;ÿ­mfa ÇøÏ®HښÚ˜™þ­7q±ÿŸ6W ã¿DõÏÎPÿahbgkí0šÂ1ÊÙ9ÿ-  ú¿c™á¿äÿŠÿ[þo¡÷ÿ¹ÿÉÑÿöˆÿÿ¾çÿL-æbm-ghówþ}cŒ¡-àïÈþ94.6ÿ¯C kÿ¯ ÿôVþ­µÉÚ$ ÿŽä‡­Ù_Z˜˜þ­´p³pš(X8›L ­ÿÎë_zU[ £µ…-ð/¯ÿ)€ž™‰é?l*æÆV¶ÿÀþoÐÖä?áÿ¥ê_àeUÕ4¤hÿÇõ_Ž +—ÀYÅÃþ/¶ÿъ¬ÉÿþI#$dçð¢gæàг²1ÿ}{qq0ùüJþ+óɲ†ÎŽîí¿}31ÿ«ûÿñý—¤ûiDmíLþYegC[“¿›ö¿ÿ˜]ÿü¯Çÿ·ëÿ)ÿkç@w 1ÜúŠ1O°ezV†sݷܑ)í>fð‘ûÒF•¢ÿ»^¿ôð=®Jƒ?µ! M3ܟíËöGR4Çc}X֔½©Àë||RêþÔmŠÎï´ÇŒz¥ˆ¿Ô£½n–dv!´8˜ÔŽ÷§•ôJþ@Ìt²:ÂÜ/¥¾E<"Zmñ²†ºÐyFü5ߗ1ìt`jl§àú€Å´0PªÒŒ •eçG24YÈ c§ÍŸÆ¯¢±˜ä Èi rj.÷Q„œ¾”ú ¥Þ-¶¦žŸIIÁ‡TxSVØ0%-„CG^-Uõ_¥W–ç™øyóÅrȝª#v¨ÅÓPä@1 ŽGÙР!@dZh~}¢B#{etZ¯¬q?ç}ûÙÍ7Œéͧˆ7­kþ˙Wq}fYŒ@ôÙ»RÏ7‚–(L·ÌŽ4L§cÌC]òLò2IøgÉ/À<ô2ìu’Ú²v bˆê]Ýeú(•q£ë¢°-Êc}e²òÆhö¤ÉӜf%wJCT²°ÄxY·@möÞ!Ó ÷:°‰ŠßfÌ¿4dº²Oy˜"iF@AÕOIÖ{"kOû+%­úq~ˆ¥1v`"˜Ã\[ú÷ŠvěõhX«ëw²°ÔNÇÆÞ1PT͆MÉê¸ðÒ)ã¨+r_ˆx–êR…;GgVԈA’I½õ[jўúKóúÑ®>R’›‹ê†èý¹É>ýW³¹"N~jåÈ7ô% Y§ IŸ‹µ'Ã`OÝÀUŸâÌYS[5¥DNqªãX\‰x•h~¶&ô’b…¡ âX¿Ya ™žjPCœ™E}½Ãi ž¼ß”§ùö‘·“v 4c÷_—{œcœâtEp;½0â•¢HЯËØT º[%‡oÇbl…žûÅ¥î:Zt‘”&0Z£.Uèt³”X2âÄO^ÆË œQßÐ1w¹°œ§ZƯ¡Ws¸@ÌӐ÷*‰Á¿«†ˆœMhö4þ®ˆø£¶K†³ò\‚õ"#3opâzÒÅÈÒw^NE(óºf¦Æ"¾…§{jëÓfZ°‰é?çöt†x±w¯š~/4æ»MѾe‚šr¨Gf#ýcÁ{ñTW‘§>‰­”lVnn_qk˪„IuÜ·iܗ«f14„êÄG·å=& "±.óÏÑ°øAÎTZÁœ“ÎÕD¤&Àd Cb~ƯSœJõÐIZâé·µe«#ÅZnö]Wƒ™W`S¦µ(ô+dÒn‹³S%(]ó‰R1$#pÕ^““8¢öP„DÑNp҇rZ-³·ª+¼Fü?è|.˜ŠGꂘKñ¥Èª=¸Öè:¨¤“Ä6\–9.µ¤Z®õñ­c€í8ý¹SŠóϺ·UÖ ÊmôH*´*=b5óõwbýŠ¯i؝ñVÁƒ2U ÃÓÉ Ní"Ú!7¤Óbß5ˤÙkcÁC¾¸s:pÔ\è +U#&|ˆúóÉǍÄ2Vmœ‹JãZø;ªŠŸÔ´S­ž‚Êѐ ,ãÉ×>F›Ï)ÙÛJW©AºmÐŽAØ6# N8²ÑïtŒÁfÔ<~[֟™œ´ï†Óìhn„æøY7 ¤-­7Á”P‰G®U¶îßzEË7|p~jJ†"N4£š[ÒY$…4N»òF5ûµ@,«" MË¡y~Ú¶gõËA_«äÛ;)?ÂD)’PëëÍhGð4‚=ssøgÿ ¾ÀÐîJvõÜWsKÚ_ňÏLqD/ڂBÃÔÂ!{ÌbwoÆ)†Vǧ¢d‘཰`¥¹ÂÎ6ʉE¡N`TzÖây0 ­ 9›|d­Eºž³<AVïÊÜ<¶ŸÚ [NáýrQ*cª;e•‡»|lÃn3½8è½{ê&¨òÓ/%õw‹DZâÕ!f›Ûe'–ƒ Áϵcv3о¹¡JÍݶ'Ž Æ9¶«&HZä;R,úи|ۅþ©9cJ¨Éð½5ȊVæÓ!ä˜ ÄH¦“hÃÇ¡ö‰¢7(ßl;B½íÑöÁ³a‘Ö÷9 “1¤‘iΐšL8#ölzÅzmÈUà#Œ§©Á,/Úh£Û쥫­ìµð~}íž%•Àëô4‘ÌE£¢]}}“NFÖ"†¥*²“§aÕHKñ“AzªEeš4‰7;fó4þBÔÕ0Ž ìz³qI?cà jÞ¾*ÁX}h®?[äνgš÷|ÿì¾]é]°eko¾@±åڌéDFaòîçFQ¨¥NšÃÌ¯åvïázPxgÉ}méš…~s±ZÍÍXò ®—ï>s¨ Ü ú8œ‡5—ÕêuU^ÚO˜èd$¡Í Í®5¹@}G#áŠ1QŽ®ã¢ßß#N_3Õ‡(ze ¯×O5́NYµ9§ÝFnËæ/7e[’'ý5biì›9ÆÁ[fLFþ~ÙQ‰ÙEٜ4ºÃT¢n¤u¬{vmî–8iDÒñp|aé5½­¶GښÙÇ*kU’dúxkFE~» Ùí®¦eáNâÅ°˜‹’ѳ‡þváè-°>×Gì éN=ó š°Ä#¾ÿ\È ~ŽàWÙE,ãDàkf’NÚ^¿To'{É=>‘Ù‘Û?²/Ǽ‡×y7 r{AöÎjໞý'ð A2ïA°›#"ú­à¶¡ÝPQWÄ:%õúz˜ŠÆAh¹‡7¿Ë’ƒ”k÷CiäcxùXq+F×6N7Ü¿é•÷JuÞíي™ŽB5[^ѺG%+•ØH”/hwØ¥L +È"Åo0Ü÷®ú›Në.›¶e”¯z¯LãÅxỔ¶fɝ¡fÝdÙË`”š÷·Q‘z]ø1†`U­í\ý(x%ٔe¡eꊍ٭ۇ ¬ÛTÄ~t5–«É©rGüÏÝúý9~kÚY6{}ó[÷Ãû²õӍ.&]!l@Ø׊)œ³§ÄlRzÖ"N—(ª|p(ƒU íhrõëÜSY?¬ŽC¢ºžfêD¦}cç,”ñýžªdÁrŝJv¡E3Ð÷H™í ¦n­V"ú:€+*áYOÒÄ¢oÉhL*Ïb_Lù*Éüª—ýÒ$"æÇåÀ›WËlµÊðÎjéûJ†Ì8<ŒXü‘°z›>Ù ¯:ñSŽøg(Çj‚u_f£¦šScÞ½§=+ûÁŒ­Ý–kV›´X š[¿‰„æ `p »úotJ¿U*P /ÂyÜ{PZî©jM«Ì;¿A{äڝâ¤q”Ä5ùÿöÓ#ôžäì|ó7Yb—ñ37‘ÈK¼ð5G<úl=ÅPc`‹ˆÖçj§ ÃÜ5 Ž<:‹sw‰þÆee±nN#Ç¢Òc„˜Ê–ã}'ñô¨§•‘ì}õH8=ª;B`Êӊ¤(´¯™ÈèèñŒt +98Äè/‹2=›>I5•yt‰ÓwÌöNýøX¡è#ª¹HàÂ~~­„åµJâQ1qéúJF{@Á¨¤Kc>}ù‘÷^”…îOF!>‚ï낺H}b ŠŠêôJÍxÇ:ºŠ¶ß»uƒ¤²@åÐSf\׃>XÿÁ1£1 «Ÿù+Ùe.lƚþÏïâ3Šfˆ¯>©{VŽµ*öÐøB_Ýâ̊f՘¹Ê[_£§°ì„È›®K’E«Ý(I“,܂ xƒûâ®ó† Kˆln ¡Äô¥ŸÌX€Šù2{é(,x}ËÈ]Ì¥”ÏŒWN'6ò‚Ä‚R–ÈÛË ‚WA!ëë ù=€xŒ8Ԙ²(å•a®sléq& ôÎh¨ŸœôÊÿd< ÛܵgQüR:ˆÍ®€‹< +Êv?1Ø´^‚@hÏuIdÛ_X-.Å%ʎ¼d_HYÀ“ª¥øÕ­|¼'¶†°›¦GQ÷Ù¢Ù]Ôqõ†V3Xÿ†¤ g¤§@FLF´E´èÞóž1xÍQè* %ÔAwç0ŽÔÿþ{9Ä÷ònÿɦY˜À'_.Ô¼\ÏٌaZæ[Øy€±znµ´pP®07S#yXØcX‰ Öu€úøþs Îíú +Ë1Ï­XŸœÜ³©FIXt…KÞ ôµÿOwCî'€J ÖËÕGx-‰ êŸ²—7j‡$·™K^ç·Æê'ÆJ•´š:gûn]¤ç"#"‡j‘¶sÔ°ûväíÊ43IŠÂ=ë¤ ¹E­ÎRÃ)s×ñþܟ6M—ô8Û=5’W‹ïצfW%µd3ü͔¸^øórú?W + Ã"~çiãQ#Á‰uu»¸² L‡Ô¹m°âÚë친›çՑîìãô¦¸( +•9܈D0‰H{ “™ÏfÈ£xÛùQ”dúb¨Åôö)o—U³yyÕ~.Ö]¨a‡A¹œ=]®P­çýÊÛ3Šÿa÷åY›¶%}ÀgAþ=On–q¶¦ffèÁ˾ߔ£ CXô›VÏðáÔë Ô!Õ6éÁ]ÿÀiÇ÷€P\ÇÑ&enÿ´ÚÅñ2«Öû1¸ìÞ½·"ËÓ­kê!]i¹‡®9Î=–ŠâeqÅ2Ÿ–&$ÒÕlúÊB¨$< +ë‘ñHvXMa[{;.Ô}’êÂxçtý²üë¥åë½+­»îãûLÉxZ=Y%¿åÇ@ƒ0Û#"ò¶Ÿÿà@ÔXôÆ©¼JBêLÐv/Ȳ€@7ÙçϜ=ƒîÅåll Ë<}sŒË'¨n¬G°T¿³îH¾ýµ:톒DLÞ÷Ê¢¾üaþ±àÂ_ÅEÕf¹:ˆ´“2MXÕª#!ž跞Îl¸Ÿ÷BHÌ›‡z%{°Ï£Á ¸Á7*iIՔX¹Y· –¶¦ÞˆjPññœì› _fuTO }÷•Âþ¿=;bh—ÐåÖÑF¥µÀ”ä`6“›Ò!A_Ž¨ +¯{Š„EvŸÉ<׳2¬Q,äàvêÃɱûé—_$)øÊZcÅ“¦|ì"㘿dÛ8]ïU`Uf +$&7·ä#¹£bZOQ–Š úÆ[ÞéCÑHß>ý¿Q]2På­×ŽýÜÖd–inVöeúÈ/‡®ô݀‘À;?<³ïNÞóĚhY0я-ð#¢%cNl‡ ÜO Lú|>1ƒ•rôXĔM¤@ízý*ÅÊM΂!—JWNŸÍ>©uwÉ2=`íUß)þðDº4p¾ke•#I8$"©„sÇè¦vŠ“‹d*&Õèß´ˆ.!”6Á‰#ê`ˆt¬j`Ïw &g%µÃ>r9²NýЪ;k×øAÂÆ(ôKØ…üÅ4á´wˆ¨ûoâiÆ`k „ŽcjS/7ý]ìFY…veÍÐíÆꨤXŒ‚ÁªùãɆ–êIzíeX|ÙßÝFˆÑ›­d·sù5aäêU¤ýF…LEšÈ®ðÔ¹£óÑcý"ÛYÀâhÐÎûkмþ47‹ÚÔ°ñ!@7ñºù';È…bIJ×"•“nèÚu*ÉSm½ÄŸƒ;©%¯½•Íún£\ñ 2 á«Îx¾õH.uƵýè1:ùîr$µ|JÈP¼Q1†o›Ë27tñS½)M ¿KƒzÅ¥—@r#óƒy^e¼ñÞ»B!۽ø,nòD ³Yø­AÖ®ÅWsƒdèN¾)—>¿Ø<§·á©ÖUêZ¯.¡è¡ý!>M‰oè+§67Ë6ñLÔÙuÏÕËƔXh<õqoþ ie&G>›0Ӊ©Sœ°^oª4å’v6‘Öò/Î À# PUk,7@ºDaÈÿbûI¹Ò ê‹oÅwلµÂ×ÿþ©†ÁÝǍ<ïŸ&"ãS>"<¨s[—>_éNYHо¿I(¬ÈDm}ŽiK•5$îÊÅX]9Zª •¶•]7.*Ær…MO›xM¶®Pk£RúнLàýˆምõsä[’hs,Í­ÈRT÷<È|lÞc9¿@®vVˆ™O¼0¦+L·ßR +p²°_d­e,n'„ÿ-à&;×÷0²èÖùM–ŒçÔòÔˆf³Ûéͳ’ìÐýµV%YE˜VbՕäR’áÖ¤Ôi~9ጚÝb1¶ǀ}E>!õdE‡¸^$,÷˜·°=w“²ã ò‰Û_ʼnÌ>ésqûԙs=IaÀߋ@úFV]hè <ùÉp5[O˘³û +IáTÙኢ¬e$.¢´„1>+Ã-6¸m.à8RD9BÊÀWS#ц¥ñ+3T€ z«+VqöÄùº­ í&i¦5;úD°äú2 »Ô‡ÃqËËr`k&°Sh;-f W…Ö{ÎÔÏ ¢ÛxPòØûûéðj—aˆ6Q¿!å¦à„ž–‹ÅR±5飙Ÿ!·2s2¬õà*1 ÓëœçŠô QóOƒ•‘X=Ž3¸ËH`^×»¨ì‘AdhrI˜ò¡¾: À¡4ï]°~ê´œy3#‘‹iz“¡}è+NAêx-Í'YÉI£Ç(m/gim¤©Ô3îÑÌ…/gîS‚ÖÕ¡"wë 2@ò,—Ñßot})òŽ+1‹"¹ñêØ&uUŒuš[ß&m•åLšD¥åºcH;ŠÊRè"IJÑ ‡-G½“Æp·Š½Ó"6ÐPÓaÙî5G˜&¡`Öà¢R:a¤Ú`UòVƒ…e©ôg}ƒmº@Ž2Y®«ü‚ê¯ÌËC_!hYõø)”>áÔ3?œ~®Rà Ý͵ +©Ó4”ô6ÚOŒtäwBvJsï04mCõ`&îÒ CqU¾ +T ÈTWC¨ ½\ y"þ´Aû.úë &Gƒ#k¥Ú³/qRW/É%«ñ= Ü‰˜è©¾N£°n‹”œÈùS邻io¦(' +1ٖí؈Ï<˜Q"µoˆI‡ž¼iŠ«ŸאÝÒ §ØP-Eã1Åk¹¸?¦ìû¹éà‡6Ð@:ƬZ•a}‘˻˺ۍ:Á±Š[J`ØG‹rS™½¼ÁóI&Äfƒ™Y;5&ês˜6—¸ÓÉá«£Qž¨7úñv´|Ó̵ûȾƒ½ÓæNàäH1¤Š=WÊmœ/±ÄÎrçF–ܯUœ½}wñ>wTª¶ œ´‘MõºrU2œ6§õ׺h…;÷µJîì–*BQÀ~©í gú rõý'&bÚS‡9&U'’®ØïzO̦öGù•ß¶‚yò‚d®c™ªî i!¶÷gƒ a[[UÚ3áÛ¸‹óè—ÒëLä?ÿñ„á5ȍ'ôPÒïi¦zwòá~7mTS¯~£À4¢é+¶ä$1N'í¸'‹\) +tòй´ãš,p}鵃0µïeq,šãÏ%†NYúFŒeV‡eYp‰¶ŸŸ¦tsJ7·ÐÝÊNâQqS鏝Ê׀HÃ4]ÔR3]R9Ìë[§MCj¬I"]rE!¿ò ÕNRö3 Ä[z¼ØÐ?äF.Êý¶¸ºJX/ˤ©Õþ‚É„n“Ø*¨|š»`aÙü®!í’ȏÞê1½éÌ&¬ŒÂÀ Vj—„·*¡?n  ¨à`9@é¸é£Ííªë÷€|n»¶«:3uùÍõá÷˙7–òÉ(_fbF«à-ÐÒ?¾š~|€nH¨,*)x%.¹Ê\7“65çº(!ñ§ûîV +ª0AÎþJƒҏuvߛ•žsÐSGþªuAZÄe&ˆ®|D6åµÊ¡3ß°Nl¯7Ïp𻾷&ó²±;´-#OC~iƒ‘•<«._/‚=¶#¸L¿ªR)ŽlT°®&êã{¨oyìf ñÙÖÌ/cB´‹8„·ßvoîù8~³(tÝc^Âl{fߏl-±Ðñ h:Œ¡±ÍÎ>‚;õ§4§Ç½™©Q²õ?§'‚7‚Ÿóýb×<€vNq°WaC6Qî[ ˆ`î¢üZPUoÓ`]¬ð-ÊU7/ÌҚԪ¦onÉ ÑÞÓK~Â]AYÅX%žÎ inŸÎêܖ%&¸=æZKó†#ïxÿÙötQV®âw8ŠVN“ÑÞÁcL}Ïl#âÕ(ŠÉ Jˬû¾ße;înDÎ!žãcrÝ0áˆKT[fÝË3û³á¶ØÛñ.>Ù…6ÊO9¿Óy8{îß*Ä¿È|Ù0™?BþM\É?dÑyҕB5Zd›fC>µjõÍ­å]ïý"vHL['7ÕåYWSr _¨[|‡h±BG²Ôºw2WäŠÃ ÎÝHÆ@ \eÛÒé^ÒZåOÆfא¼Ð u%Ÿ'¼¯Án„vK«H„t¹Ä½Ñí‡`Åà›¶ŽÁE? ¤€CírÇÇ_•–zʞ5‰Ø¯‘$å:ð¦uãÙwÁW¡44ùÝ¥¾Ý:ï„Sc¨Jèɤl12’ÙßNFw¨Ð0õ+‰¿­´!ê¡)¡šœØÒrÑ ¥Ò  È‰®áCBÚëƒåÀ ’ ‚ä¯o?ã®öp=×½žàçNÞÀuÓ$z;ƒNàq8Šfð¸a#V1Ž»@{ +¸4«Åb ƒ|rV¹vá IF> õtÓÏ®vFÃS7•Q5¢žÍôJ•W¡†K˦ÀÓ'Œí_õÉGm!zx¸qV’äcátªü—»ÝiHbä®ýF1% +%†bp°é=Èâý«É¤Rñ'׏ax‡Þ>!g1ž šÀ@•tìX‹„Þ²êXKrÁN›F~VÃ}i<6§ ew˜:>ïÁÌ7Ùlp¶F1Q€¼çwÞ¢ÎSx¹W‹˜ôŽTY#W@—ñîNµb87¿êÎ`Û·œÐ{Ê9w¿ttÑ­×TGbûY½Ÿg@+¯q‘%h8WÜ{'1ÂÆ!ê'Ï4ƒgC꥙÷‡`¡›ýHõEyS„þ†¶–}6#.!©/g¾ó“@‰@†$ÀV¸³ð:µI¬ïþ)Ô"µCÙÎë,¹ùìjY—d×ï2&Ìëˆ ,¨FkXpÉÄ C¥J¦œJpÝ4Y;Ö^woM›Cð. ++ Uu +4Øõ‡Û1><$òN›ÒbɝsN/.ÒRÜM»ôVyð4Ÿ˜µUW8/¦|ÅéKˆ %±b½ÿ·nÿW\ïÍâÉ·Ý÷ó$= äZ±±ÊÆ(Ÿm^‹%S%ùoªæ@«"ëNÆ"‰Ÿ6°ªY91áöî…d` +WD-Îù×°†‡~8Ȃááv™dLZ/å®®y=¦ƒ['Z H ®šƒû7‚ð>½ óY’JZ’•ëʔ6Æ|Ó¿üIlŠ|¿‚»~rF¾¥1üéQãš{ýƒ›p{é¹n½ÅÐTAÂãÆó/Œƒ²*Ê°WµÜÐ/…Rz†îÍGP“;nˆÒ{™°Ì7­OÏ¡"©ð~s§+’Ý+ïè J/‰}~ºË- ´!*žÕj®TfS J:²´Ð#OÓÒ¡epÉ&Œ^›CÊ"°0Ô,دàT•võ#ô—ðDßȟ蓣!È\ÉÓ:„2·µ„è]ì'èJËä´_ò'ˆ~Ì­1¦´ŒCáA60ÄAý‚ÕÀ“=ÄÀ¥B¯Ê?#|­±vY‚Ú=oUs"̓Z“kºjzåÏOJؗc¥½ŸmT0Ò¼¡#®ŽˆU!£½ ô_›ÞHðu3±W¦:Jô›zxvÃÍߘjü4!ϬnZËTãá÷êi„ïAAîÈùüív”å‰.¬–—!ò +ƒKéýjôªÞŸñ‡ÿ]m4?sN„´JWëì¨Ê ..±¾ý°ø=#/ÅdÙVSCO.ù··U Lõ{3®C •ÐuOÊÆ ]©xþÆ­ìñÐ槺"à ·òöÖ8S§Œj¬Ü lcÔ´‡ŽÈÄStŽàW¯~C-ÆëðHÎO’,iy®•Ò;óèBL@¸…!E´/ߕäwÛGÁF*áöFÙ«ïZ. …[ŸMÎ.jí“õLF4(³¦’‚oû+vl”½üµÎ‰ðµmæÒ42˜x<GîŽõW2‰0ÇX„óËîõwÖ¶Mހ-¯Ì?ü]µòÍS‡TMBö‡·W›à4Ì$\<ò?É"i¬O´zƒOÖ¾c™Rv}U¥è A¬¯ØJSÜÕµ\|+2³ºgác{4;xy?ª«âˆ·o$,9ém7Ì &˜Ý9•Þ³ƒï1Åk°”¬¦a“þÄ÷‹'¤Ç?áü@Ô-]€‹R߃&î’Dz·#E_·Ô;7”€Îç*,ï i“icqgd¿'}¶HÃ:md«éLQDâ×þýMácoªP.îˆg#4jDF‘§×<úºG>ð< #Ñÿ‡kŠY>C°FÂM[09]àÄÄfà Fˆ™›(RgË#wՙˆ¯ÕÕ ^†l‰´ nä²Ì)3, GX¨­cá"My‚e2Æs—^··§¼žD扂ªsålCÎD/¨‘Øí¹âPÔ\ÎR°2Ê[‘@\Ó©²Xº¼v4± ­l·¤wðckÐ́9TûÔ0÷ñÈà6ÒS¹QÇÉŒÙÉH¹V…ÿÁ" +ýÒK€Q^¯'9Ôyí=¶³¾à•(t¸&'/ꢵÙÃl¾ø§u•HÙ j®r +Ÿ 3óÊ­[rýš29†Q‹X?ùn÷Ê ¼H0¾ÆٞJ{—3ΑÞ,Å;$¦·â”B ƒŒytáûÐ/ãœE¼¨»ñD­àÊË? Mê£ß9ô†*^¾ÓRi'Zz.þäç× 4P¯cPzöÃÑ·Eo~÷ý5Ÿ@™ð“£ô#Q#òKéÏX„¬å'Yˆ +ä- :ºX—ån]\·ZïÒdf0ãõÛE/YsWXŽƒ <7]µO"o<(¾ývvvÎúîƒnìåâolqÁÐ=ùã˜Ö S“8–W)‰äÎĊÛµ 9ÏÔï¸yžû‘-+wÔcOøS"vv óß­½ì*®¾'W¶?ܘtÊÏG%»_Øç;4\^ ¦š)Ž4Ÿ=Éjñoõj¾´Žùèß«a(ÿɨ æ„â'‰x½‚}È–þblŽ Ê_gÁ[°—‚­8ìu× +**ҖLIkëºð^yˆàâûj©N9ç†Õ/Ón°ýx¿ÿò„àç8©Ä†·0â0Ë5å㻪›Ê<¢rÝ6Å©…9G A.7”°F5tç “ó ê6XkÜX‰‘Ô[ù¤jÂy_PΕh~„-¼(! t²Û‚~J˜Dæÿ +ÖÈOª0/V öϘŸ¸×Ð(4¼«ï:ˆ´ùR"!¹™eê“ÀçÀ$YïÉ+…ÊH—²%à–^¿mÝk?ýÁ!ǬçIä‰:Cƒ wÌõÒ¸|!Ðÿ'ñË d¾'J…§Í¾¤®À[`/….˜cí÷{îy»Ž7jìÞOÄO>ø TÃÉs›†Xçz +ª¾Îjß5¦pcp€Ï“éâÁÞ0ää96€ÄJ¸çƒ™ÑwmžÐjz ™W|Ñ«Ì~ +¼ÖŠRùWF!§ºÕz ø1¾C`_ààLåÚhÝ8X9Ü,nùñ9•ää3= *§Þ}ò§ÒÀäzë4rÔñ4™÷ËOªdHõcü*A‘óÚ&>ù$vwÕg™vÜWë„8dm©®?ÆîàX¾%û`~/®çÅ©éo§\ xŠ˜Ãú–cîçܳ‰”‚ àÒü²Úo¸é#1ܒБ¾tM‘Âd½·ˆ%Ç"\¢Æ ²ÑaŸÈ”$ïUî®1îji梼|}|×Tä!<½èµsšb±üA³g`NôÒ¤Õ0'2s +1mI†î¬S+Ž ¬q{šÏË+Õõ-ƒ‰µkêhæ€ãGIäçÌñ‘B·xá•í®3ñ¹éÙ.Xù‚ÅL;·3š`E g}åx\/ÿÚ¨zqé1 ÀÈKsªS`BS°ó"dAKkK&™-ƒ2Qš¬JŽ°Üäê\sXǺou§X(;ÍH•cÄÚbú€‘0¨B+³یޑ%‹í‹k¾yÊÕG`ÃaŽFAý{„jÿ"Z™÷”çTÙHwe{-À(áڍ\™p/êñÛÈX+™O¾n€â0 ßu/õÁy7(ÍÄŚJ?Ç~Ÿ*ý­çÙ +T.݀ˆ¼ÊÄWcT‰]6,/_e¥´ÞÏþǍs[\ϟ?ÝÒ:‚q +8ñål ìÁ6[øažï—S”«:d~,Þê8Ú?©ØIÁiJí9a¢ÇbâhÓ,YÂ놬ˑxÇq€’†# 8·ì«V_:»œ{{V ¨‹ýôIy—Ç%Ry폟 —Âb×¥G/ÅFk¹‡#ûï&b¹®¸øËì‡ÙŠ‘ɨ³yBn×¾9àóXüRYÇÚ\”Fa~·ë÷› µx‚¶¤„¹Zò}kÏa+˜fp!ˆÆIf»ù¢¶ˆ¢ë÷ÄD‰¶Bqüg¯=g©â[¦{¬9·jºÂ3W‹(æ9-«1Ïhë}íǒR ™ õÞ"ô˜Y2H §xkæ£~Ðär¡Ä¸G¥º»%`˜Y<ùXnþ£R2ìj¹X*Óö +Fà3‹=Õ^÷JÞ „¸;É;éñî´¾ cÕé\Ç "BåZ¹1J> l‰4OÖ+wÀXiëÛè£Å: +,‰T*ÿg%ØYM‰öu'ùΊãʼ—Có.ÿdýÏâ1¥Sž·@Öbä_㍱Ëdç9|©ÅÙBîÌUæÄã‹i€û_8Gp²RÁzê„@­[5IÏö–SŽQyæ‘9=}⫾ÆfaøïÎÅš™ß”«ÛiQ«3DqCDßKJ\7íïÿ~^oŠm²=ÅÆç’udŒ¸ù|%뺺6$„À硓7†ªròr;àÑ_»Ñ#×) +#.EbÁ'A¯4ÃԏøÀG%CF†ÇF*Ìl[áí.ŸW‹‡ñìm¥.lÊ!Q×HÙRÒÜûšßV§s"É!W;†_LY~å;¤ ªš)màÁ‡õ)ÂAx‡W›&4»—åcXuÉ£ Ÿí 8kK®ÍìIYÇÑ3J§§ƒž¶@x1¢|æÓ&Á*I™ [»u×IÃJ36­ ÊbA•º9Cÿ„Ù œ°ô±km“®ߑog §š}x‘›°^ý¸¬ð±¼BK‰Ju¬ã,cÔü˜£xò»=J‡HâŠ© +&Óãšê_T9/Æï‚Hco†]鄄TTLf7V–ëÛúf½÷™sÒHo»rcÇ“§SB%ؒ¦,öý²,#êJÚÐM rÑQŠùúòJ*(¦ˆÒ6Kû=Q°+Òξ3{ùM]…Ë}ªkåWgS,ß ì<Ž S­ØOÌÐç©ǂ£w1̜)nx˜ÏÉO]F¼†/Ø^V—PTZÏØzéôºñú)ü•TÉÐ¥¬Ø—9]ŸÑ0ò|R6mÝ3šØ’ç¦Ï ‡ƒ|]t&ªŽ£->´_]WՒ|—¹M²sž¿®qMŠÎCÔ`k`.IŠ(6„hŠÁ¾û™wV£Ìœeg߯WvçóE~ƒ— + …½äº¸¡¹ŽÎAc)bÖèZOŒ~â¤ùJ÷¶šC“³±û´:àBqcù€r s¬ú#tpZFhaš1%I¢·”¢€fÄì'¥m“@)\H²¹.uÆ¿å_¯T©yEZ!Ö V+\Y6C§WRâòᛎa±’òÖiúAÇ¥àٜ<´+vhÚaâ*GàZžÇû²ÍÔ4TC$¸Sö‰!чҔ(\ {4Ä-Ã2]×ýaècV1ê³i/`ܱ“ « ÞÌ)•°„9Vl'(üDåzRoÀ“¡Ô©tÇÖQ_§ p5²?®ò#!ôè”\nÕ°ÛԑLM¥Ï¶Ã 7¬™ +ãìá’À¬»çï‚Í†ÝbSÒãï}µ1*R#+²ïÓ»Êy&“ +´4 ¯¯€Ž&¾Gò7b®7RRþ†ÍØz³:éˆöI>ð9¨™”™D㺃ùˆ]îtXé;aâ2û9¾×t¼ +â›ÓM2/^ڈŠçë¾Þ4:9¡Q4”ßs9fGaµªÐ¸0‘üyÉQ·ã+B5ûí~ƒÖŸZ4»ÉÂ2ÿÐßûÑyyâÀä½@ Kú+†uÀ.‘i]8Üàøžä+»¥;¹ŸWE\ߌãй‘=rOÇ9¨€bˆú'%*¡×"0è%í"cî\¨ukLQƒ´X-ÐÆU²ý1×tE.SÉ^κåt‡e¡û>¬5÷û”%l/ÙèÝø½K0OzšŽo‚$λ$iTY§§üÉÞä·Ú WŠî¢N¢æÕö8+~´9™¤=;àTԝgÍÄEJ?w +}œ‹rò+ɉ{8„°è{$<×LÙ +ÊûáF™ùwš”öo·6G½¼½[ÒӋ§v!Y‘)KއÊNépò~EÕznßÞ/r+M"Ša9sòï ¿ÆY¿ê@<ÉÄT®5‹®$l´¡&VþY½šÕe í@ ¢§_ÌBô…~š)þ5jì‰Ç.u’æ`ªéXñAáZ žEå»K„>¹øÜsKã¹OŠ¡:¥˜%þ«)¬0»¬Uø$¬Æå:ºIo؉Éb?ÔcïyØ^öÞ"VÞbXa§ÉP³ß}짇4Ñ¥ž¹¿“Ö½Á •¿@.Ô§5jÔ¼½Ø©=Ó‡ÏLªƒ•yäý{’»D ¼ £'ì÷O)[_;z¢v0(9BD!骲¶ÀÌ4„Ä ú:¶2Œ~Ï/Ãݛ¢Nk¦Nµ ¤Í`ß«pŸ‰ýß%m7s¦5Ö"×I`Ø •‘äJ˖¬ä›åˆÄ¿C¢G{Ò†ùG”^݊ ŸíDüÖ1k§ïª•qg}ôÇ£*Ù#6ðôˋµö_#õºüf÷jv‰´àÞc+³@˜üjgH¥Tµ÷¢nT«Ž‚…÷bŒªñ àA=‰$è¢çË%l óx/¾%qmå3FRG㟠+ì¼rЙdDªÌýRVfx¾»rßXd†‰¿rj_a_-'a|ý+ˁ+ÖGwìHÀ¡¯e°g„À¹œÖâšùódÙóÀ Ö¦*™9xñõ]×ÔåÉ1Ð&ƒ ì}¤×5uÃÍðcm´LëJðþgž¸qÑ|øn+úKÀ2ڗ6ŽáŸ=ä<Pæ£&<ÝøÁDç쎉1,T9¹"'.¥/K}uB÷²+Š;왔¼Ì?ÚÏ2¯ZŠ‹§T&ò%R.|ÛUÃ-߆©uÛêûJÐ#Gg³Ë¬j–ô´¡80rŽS9y)47˜>ù«ãU??æAÊ5ˆE»¦È«zxQ‰Rrã?¶Ç¦ñæHÃýú 6D«êë=0Äv•ylBg½0œ/;´ÜžN©C€ÁM¬Æ] °ÉKÖ#K&zí! +mÖ5ªj¥ »0,H̲dDQÄÉR‘ +9lÐÁ‘"µÌîTLÙ¤ºlårdûÉ2m. $æΗÁÖ½ +áÛõ5Sqòb¬œåO$£‘|^?0 Ñ /ä +¡*ÎñËò`ªü¶ÙmßD.®úx=X‰ñˆ'·U‡ Éum~m-÷µ ºœÜC.YU¨9oñQjC³¶Ë3ŠÇg{š¯ç‘Òi±r&„‘‘?Àž*”›€,.¡œŠoôBÖ]³ UÓö½)–Ã#¾ÞWõú¥´*1²Øóñ5LßÆÌaìÖ$Úܗ‹Nö©œ.ïFM9­×úZãÎh‰[/Ó·î>€ab¿üŽSØéMøƒ ªf©ü†+èWœÝ}ñ Cµ]q@Êq4¦ãË$­£Û™‹"µ8q3¬r§}'vq;‹žÆD¨8Q«C$›¸Ü:\–dƒ–vÀë¼ytHq‹%BíÈ`v¥y¯¦òïÓÀ,Gô•ìs§…ªkÔoWJuÁŸÄnõu€4Ì%ó`¬û}[ÆXÝgƒSÁ ¾[ ÀËÏ4óˆö'þd’0ßEñ²"N¯½©Cv8À¨æVÉâ=¤ß<Ïö0%þ÷“¾À„0KgV2ÖwIè::ùð0Ð ¤Êâ3Gr¡Íóœ<¯ ‰XqÙE½œ5ñØ`˜»„ø蟡£$I¹¾Â›8'íb·þšÎ‹£õ¼¼äª¾¬?G.ãjˆ¯^ym&4€s5*&‘}<—}Â?Ã7¹q µ^:=ô•!Mx•&h=4ÎŠô‚BȪà­™6QeFû¸É<­Ð­± ú 0DÓlk&]VN³!rëÝÖ҅ =ò(Çx‘wù@€Œ¶ë6|ÿ¬ N$Æx7ØtIïðµªé§kûæ7¾[‹Ð"8+ï»®†’égûÎ-Ü:/aXr¶|î#dúHÖ}‰ã>´´M­I=bd¶¤¿“Sƒ©P"’_y)ɥѹ?×Õ;a‚T#Â÷îî"¾¤‘GœL|žL&ß4"}øâ Áùiü‰uýëºÈ!l+$» uPÓ1b‚pŒ[ÊÔDb‚·¡’_åã¡­§DÛ¦üxâî1µ©ØjäÓqQ@0S¬—]ù*³ ²QP_ÏæÁj…(ZÀàôºÈ6z•ž¬¸É ÅAA+LíSý¬y;úƒöÌTðaòú«ÿ¤gÏò‚Yû­wJ,FºNµALÛèÜ»nÀM85›EʺÐ*¤_¶ËÚÌUêbG™À<û“þq¯ñ'ƒoþ‰@gE—É“xc{tÇðmlƈ'ÀNú¡E“²½V ÒbÛ¥ìR#zKŒšuœ)¦f©²Ãµs‰C갾ࢧ¿ÍÇ®@_Úܪ>!Mzô`¶t>ð)çéìµíš©1q=W§œÆ¯áòElÔm8ЇnÕ¿ø;mW­ÙšM½è™4qc?!u˃þ…P¶ukœ#·Ð¼Ø0ºYròè¦æ섕çôù;Úð•2„ç¦äŠÁaψkškÀß3ˆüIà/ˆù̊’{"¨u +x<™´Óæ®ÚñìôEW€jYuA­De¼´… +¾¶ÂÐx¤¸\=n7@òE]ÿ=æ] '®Øú»·finÂEº¡ç~Aw¶+@’Téõ +ÎÚÆŸÕÇ h‹q–×ÑkßQ6‚ê€)Mv‹è{Ô²6GLOvD°®·úP1[rQ×Õ6€ÿŠ×u_à—åŠt<Ýa8̉P9+l°rs ÖÇ~Qb=!ÜR$Frçe锛Xé:!¶8Ê0Åi…\Z×rP–ü¾¨R $ºnü&[éFÿßu°Ð!*.?»Š Ž|ÏƁ¯ó/jíÍõºeãú|l´¾'">½.6³Š‰/¾³÷ +CÙ9µ¯&ZáF©Hȸ^ d§·Œ]}øBqCN zlÒð>n:ôö-Q‚ûìљºÌZø3”‚¥¬Ñþ@P¤˜mWß ¹ùGâ.§,€ô@s òá^;àžķʳáØ-Ëþê¨| b9WúL\ïØv”zÿᇠ`åyylLÕBà0"u++¶È{/?•I9-õʍ±þ5¡m“._ÇS!Ôý“;]̳–³Ñ´©ZTEµ€ ˜\tÐKJ€ÅOJh©-d ó¬Dk‚M“Gâiښ,a-¯Ñ¬V¯̧3(b´±Êa—éû>5ˆö„Q6r>,Ëۜ%D¯€ÄòWwœè`ΗÅqFy‡Tà ðuœJé<~ €*&¾H¡?_VF?ðÇÁ$d|NôŸVÐýyÿ·%ìÆQE©Cb…­²©@\x†fá‹J¸V=püÍ'ü:J€ÓëðN¾Y`˶YÂß±Øn=«¬²ö¥<ÇT ß#ÒG0ØàÎú¥ÎƒÛ™Â #7®ò+<:·„ã¶`'Ã<P†J³­ØV(ƒfoýºÍ þËh€v†‡2ÔV² QãV[ +ؼ«RoKU ¨ÔÌVK*{šßhÔëF³Ž*-ǧþ9›¾uõ\ö JnSŶ^%á:Ýd6Çgl +¦úªV³®DRӔ´\ ­®ƒS°·ÑA ïCY«‰D´›÷ct@”]‰9= @K̀/^ýºûàQ· ‰­¶H®€Ý$G¢‰øÓ¯0…É«ú¢ßÛèP¸àDUvsǎ3ûS¸¨«½¦Ê“;`gʅ:x9î­6ÿå†|pŒ¦šO$/ÚØcwfg¹ÉS‰<€žè‡8½~$’O ÑЙñòR=„èk놁*–[܉£˜ƒ…ïO¿ã1³›Fç,әô˜nõ§Ø¹Q{ àAܗ3ž‡\\z ”]b"kuJ^Íj¿|»¥a·"Xg#SBî>Iۻ͟퐫Y’Zâžmx8ÚTeš a yÕÛ<''~ç.d#¦>Q 6y„üZüÝZ¹eÑj·‰za›®®/™Æ´MÙ¡?ìã«#n>¡:5Íð=´s¸åC˜[Eu¬ì+E`³cGÔ\¤ßÆûݬˆpQǁRêBÖr¾~¯'qg?˜%ëmÊLw²ræêÖԂc´TeÁ½/iσ‡Aç!D0õàþ·Õ˜%±È¨ÒY$­\#¸¿½†¨j©— ‹ñ·µl²Š䯦9/b?}ÿ*¡iM×¥x/‘Ñ:ªAa;(Tõè “ä +\Am|Q՚˜?!#õ?²b¢Xƒ†Ý:BÕÕ0Œq@z«+HÍñŽ4·~ýþ^¦æRÖ°£¨tèÎÍ<@°ir9;Q"}‡èE½@@Z͏Úe\÷I]÷÷OÛúÃ`ÿ5CÎn +o¤%Òԙä(ïKe,<Œj÷ ÿ„!óCú}Ô]¯Ìµ K#! ½DÛc[ Ð,6"ÁŸÿmk{XœSM£ð¡XÞi6LE\éHÁÛ ø ìü¢.¹"iAÔ5'TÍ&^à ®7ë_ÞË}_×9Ò +;s\úÉ#Œ Ja:єùp³dmÉìå‰êLä:;)ž¡ua£ßÖ\8Pʵ]Õ퐭L_"˜nï7ËÐÃêpXŸ¶/¤9硱rP<žÁٖ þ~üx¸» §Ægʘ‚¯éFˆÌÂþ—>DpÜñïš+4m™ÝÇXØÓ¼|.Vu–Ëõ5í%™äåQfû=špTr©€žfp†æ”‰¥ª@ÙW„0p3™È1jr¹g””+õœÿõHßKŒ3ùQ3;ö +ô¾·»¾?,ùó¢*yL¦ÀŽîÉc jù©UªÉ]Ñ®‚ù7\§m»¡v¦ ð[£¶àòúð;Áw“…É#zÛ%8’Œ±ŠIBök;™±7R°Šßlz3åBgŠ9ßÁ첬'Dc`|ÿÁGšúVoP7F"^û¬5„¢oò?ï-KhÎfû6Pé04xþ¨WA©IH&ˆ§HM…_ï ËƒÅäEIqW‹^‹zä¡@yC~Yôé¦bdsI¨…‹ê…P!qË,™í­lƨO2ñƒåo‘m{ LåeüHÆÑâ™cȬV™ŽƒÉ9krO‹Yéåф±¬BÙ§½H´ä >¤Íhë(> endobj +12251 0 obj << +/Length1 1642 +/Length2 14402 +/Length3 0 +/Length 15264 +/Filter /FlateDecode +>> +stream +xÚ­·eTœ]³-Šîn»»îîNÓ@'@ãîîîîOp îîàîüæý¾»÷>cß{þœ³t^5«fU­YO=£i(T5XÄ- æ iˆ3 +» @lkî⤱U†(²(,ÀrÎf6€¿ „#ÈÌ ±“4s t@IÀÉ à@¢H@ì=ÁVÖÎz-u&&æÿ²üã0÷øäo¤ØÊ@û÷‡+Èbo ²sþKñ¨œ­AK°  ¡¢ª'§, —QÖȀì@Ž›Pu1·Š` ÈÎ Ä°„8lþ}!vàZsbýË%î08ك€à¿a w Èþˆ`r´;9ýý ;¬Íìœÿށ3¶Ú¸XüSÀ_»%ä_Ù;BþzØþÅþ’©Bœœ€Ž`{gÀ߬ª’Òÿ®ÓÙÚÌùŸÜNà¿0bù×Ótù§¥aiþ¢Îf`;'€3ÈÝùŸ\æ €ØÉÞÆÌãoî¿döŽà•áⶳú¯ +˜Ž +3G “Ó_š¿ÜÿÜÎõ ø_º7³··ñøW4ä_^ÿYØÙ dcɊÄÁù7'Ðùon+°Û?ó"gg p°ÿÛnábÿ˜+Èñ_DÿÏÌ0ü-ÂÌbgã°Y"±)Cœÿ¦ÐÿŸ©Ìú?'òÿ€Äÿ#ÿÈû'î×èyˆÿoŸçÿN-íbc£lfûwþ½g™àï®(þY6.¶€ö øÿ‰4³Ûxüïbÿ»·èßE†ØXüwìßüâvVÕaáàaåú·ì$ vY¨‚ÖK3›¿÷/»–ÈÑlú+ð¿îöo;ûÃ4­ÁÀ¯vÿ(Áóodgñßø«Ù¿ÊgS×WÔSaúßlÚ9«þgM{àÿͤ£±øÏÃ?TŸ?CÜ^,œKaáâäðx¹}þ²þ‹‡ã¿ÎJfΎ`w€;+;;àï÷|þëdôßh¤ì€‹FHÃÙÌÎâïÔý§áèâèøWì-‚¿ÿÇù_󹃀H+‹ Pð—ô¬ çïøyƒã’½Ý°ƒ!öeõšÅ…þ5.¿ôð-JӗÚֆIÁ·V…cû×]yƽán<º®TÐy‰CO!æm;Ó^ ›qjƉN´×żâæ}^ví½ßãjêÆ¥/ð¤“í\Ž/ü©\ ýq¨ïíÑ|iuq¸?1 °¾ŸÐ&>ÜÓõ t]Áõì3åÆ!Ò¹~@¥òwÈ%ÕתôŠ%5rb~šÓØ©[î=I!Ô#¤U”¦Ü!"\!ªzéԓµ@\Ÿ…ê›)iSœÆ¥qÓüÉd^·Htšc6ý ¼<€oä-†i‡×c ¦Ãû§¸#FÌ>9Vƒ©9TB|1Ÿ¹ÊŒ˜e“|J%\*Û«nŸµ2ŒŽ½}ý(c¹™â‡÷å¶l €n‘*dõØ<­ì.2gæzҚ›ènLiÊpªLkú4øÖ·XkÃí+ÅR”ÖS/º¬í.SLtE§e¹9=`Aӆóü²qßÚ4w¯ÐäþSÉ`‡¤ÊHæ¯ÎáJ˜I tÿH†ÚkðΫì²D#“j£àkƒMVð@2Íd¡â‚݆©³oü¢}ý©u;užFÀ§•*Û+²#g,Ju/Œñ‘\ä|礣å áG=~S¦eº&­Ë¢]ï;HêsXí d&\õ°©ï€°HH“±ì£Özð×ô‰ ÕV¼0Mžçù^ýµ&Ž]ìï¯ÆÒ§~æ{ ‘Óù‹àÎø¥ôþ©F¹œT( Ì{Ÿ{Å[>jj¶–ÈðíFW?眑ýÏþýl‹(ƒŽOªš`ŠAq’ ÀÁŠÅÏ#°3/¢€dÖ ‰WÆ¥äÓ¾3g ‰¬zÆùf¼‘¾zðñ|«©]d.?©ù'þ!•ÅÇOÏeèíSe< pÅm’†PeYõ¦óo³ÇËE©ýÔ sm§‘UÙ¿€\Þé½™ ½ì# ç¢Bí\;f×tîã]¬~ïCW·bܶÐh¤ø0{ kÞ{ø€‡‹òÁ"7z0VHø7t}­â‹¼®dÈF40n¢Üc[#å5¬âU 1ÉÂ|¸ãÆð­N²—ëv*‹iäJɓhîÊax‘ó ý“sy2ùFτÂÜòÜG8ƒ·¥7©„ ]ÿxØï3´œûúÍõ¯WLr¿ÿAŏÍÒ78¥0YLo~ç‹ŒÊ1Õ»Rf+”덷ö~Í{œÿˆý@¹ZâxsÕ7øYŽØy#T€¡Tä؟}3á!Ri;ÁUçwn»BÐ¥¤ùêÔÞ̈ä÷$ Çno]ñ&Šµ ltxê(íþwòÐiý‹ÚþLúKe¨6˜±¢â5šf÷ý|ÖQ¢jjNàoE6ˎñî¸b¨22µ,%*_*!âÓlºN°( ~«Eüd(È\\1!ÃÏû;¦jÂ‰Ï5%OM`y‹zî1ä¦âi*DÑ!ŠÙÊ°µmö¿mìÀ–dÕ ¸nÓECš·‚’t´¾–ו;ëÚtŸ•5Bßµï܌0xeàvD«Ñ(QÎb¢°Lñôׄ"xšï\2è–ÉFUféMy̪%JbIJ9ÎYc´ïÐmyŽÝÁ¼a¦Ü²%xÙ=áœÅÙû(›q©n…ö„’o[{ä Ð刞Ë9-h<•GŒI}20"œºtî×?m¶çªñ¨÷×k_ Lšçújú°Êí‚XÇ,ùödp€ó:¨Ê·å¬ÅV2ì␔ú‰y8¨ vœ…OœII6ß݀>Km‹ÃS¤ö­£«Ì“ª´„|ç èšWhê¼Ô:Ǻ{æã„ÜM×键Mç·¬ˆ¼Å=œW—ªÞ¨Á"ð¹ªS™.j©Áî"—¿Nw»÷ûó Ï Èõ±¾xLIÃÙû2öðuôÃÞÊÔeIÒÏL€»Ò=™ìbº)¼«'9<æÛKêô@5Z5ë›Ø‘vsWE&…rƒœÕ´=tµœÛÖóêšu(‚ߐ±5½:Un¸}\Ë ñüEÝo"sÙ~Åvù?ä;¾_Pô_OcxÝ{Þ4–2ìËnXn”PoäÎù3hûáõ8Ę^ý;¤­D»’ڐ": ‰ªq”$öùÞ­MŸžb̼ÄMŨ¿Ì¦¬‰Ê4…,Éæ4ßQí‡r[2ÃáL¥\¹óŒÍ^íNOLJ))½Œ‰š*;|hX†ö¬oW0]W’߃˜M ×ËÜo_Pú¶ßS WGüïÝhr©Zé¯y€ šAÖTŸ´`J˜P¶S°;œCԕªý^ßÏUðIÈÓIoå8˜®¿VkÖæä«'ôč»F»PoN–xî¢ÎG'®ó-ûjӚhIdº­ô߅Ž^†ÎÉ¡þøLÁíÐ’4¼0.ènçQh¯'/ý;7˘Œ¾q×ö\¤l .rDê&¿d;~ÅÌú–ÏÐх+Ï_“ ǝ]^·³+}à›ê¯@û£eëŽøÅFÍÉ(QoÕù ¨Ú_>ø¥Pý€47¼–åñïÛàGµöŠ¹Ä^H£ø’m9#·vúgóO„‘ãù~ Ùä®\ŸÑ?Ï[Pg½ó;Ĉ~‘å¿ Ò#gdcÓÿîû‚9‘È@£ÝVœkdxœ» nÉàÓ(Ÿ ±¡oˆô~²ˆ øº‹Î÷-Œ³þ'%œwꤙ²·P¨/GŽ,ô\Úàs}ª­A–»¶œN«Þ;,L=¥á0¾)?Νנ„¬¥°kÃñõ«ënàËÊ3ø +íyI M\îëÌè]1¿ußs²¼âY«Z:ðºM&²þ鳿匪_éÂn%%—¿ãò”×e8ç«|2òCê3ÜÔM¯“XÌ'ç¦SÓþ1.€œt¢Å՗ŘJÉ8zûᖮ憖#½Ã0ïÔ|Á} +>ù«ºŸ˜‘Õ§õÇw¶Ï¿‘¡/\~”Ôà*¾ÛÐÄ©¤RÕܽ/ZZ…:ÏÅ2øÎ3dÄhE +µ¦êmľ×}杖2ÎÎöÀº*QüM%®a^[A iŸ +—ëÀ¥Ø;¯*î%&¡ˆùjH NÛ7™†‹…s…ŽvíÕ×6_M ¦+0æì¹Ø óºÜL8u)} +øø¨€ôÐú€RFx«T–FH/| +mŠ2"²Æ#9¤ì´ýTGR¤höa·¿^%&ÉÐ6Ä%Òjv?êsçҝ&³z™;»”$Œs).5s®YþüÕpåT͘·6̘i„š4°­û ™Pi|õ¦uÅ,…b¸¦Æ~ðq¯™EPÐl8ˆ²]~’Dp±‚uTŒZ(+Íhœ„re‘vÆÂșãøagskݵâńýhDeTcV.z²:7$6ºˆÈ}3탊‹±«³×‘[Eø- +E» üC†õ©°Æ0ìJxÓ)0x&Ýrk+C½jW,‹p•¹eÖÕÑT’ÑDù;ZüíÝ2ϝ Sî.q“=åÉe=`ðOÏ=óòØñƒ%K1à.HõG’ù«Æ_W˧7?I¼¡|͙»*g]èˆ%œ½ŸÐ…¶ð&DZ^pÚ_ô÷$®Ú°T|O¢øÉǯX¢MiP~ÉÚ.Ñhâ]o—šºæ?tj€õ=q~¢WÝ´j7sHɤU*»«5`##|9˜®üÅÉ­|£q'K È¿ÔP@PBjíÈ;±)ê?é¯Çt¶«‚î _ÑîÝ4×Éeœ ®ãȇ ÌaŸ¯ŒëÓÛ#¨¹.]±—)¢6%tmɱGYû^Tñýžë¸ƒ]Y#8GÞê«ðšvàIé5; +°xèqž!• ܎« šžª½ýˆb Ü)ñ„ÂdR=D!#,‘ ù8š3Ý{•#iƒSCUŒ‚e!Á´©©.w7­}¼³ugX~gëaR±:A–Ð7pÛN{K/÷ï7¶­¡ƒƒwÙõiàõÉò"äe]|ÕU‘¡&ØvÁ~m‘On±²ûñFºñúit?«•·ÍÃC-:‡gÚJ`ª'QýP§ÌzÅ嗃ãºajeIé|‰±Nü½žz[Ò@ŒW.€_sш_,êCL 4OŒíLlh À5ÞnÖà1¯òÖ`t¹+–Jó½é”!1*”µðZ62."ˍB‹þe×7tÀST5öUÌ|69‹³ýÊ&±4†¸_½¡Ùæ|2ñɐ¯øÃH&å$4·}˜ˆÞë…X$ƒÆ·Î3ÁÞ:TN½ç×EÔ>1‚¿¿?©À’Ç.€Û\t‰¾…Ú!*7´»ïKwÁž† Û³_ÊÑñ×±‡éØâ‘@¡L|8sü>[k¡_û]f}wWAù¬2‹¡žöHð Š1zÜõkB!Ú¡À gkìä¡õŸ­J%ïöe©©‰@öòM¹X&äXÏȪhw%›Zu(už‘ÏpŠð”¾Õ½RÑVþx&%¿š×.°™S'Äm¬Û·hñO,ä0þÖíP tѓ9Ú´ÃÅýbX3•ý­‘4¾ØR.N•Èçÿs>jŸÌö§öA3êoE™èq!L"1µÔÍTœä}~ýáYp.Š‰bÕ ËóÊ³8ߗy5IkT¿P}³Ï‡ü¢ZžÛÿSg¼b¥šçCY½ë$Û"HåD´½…ëûE¥8E6§7‰¡ÃZ€Ü†KÛ獵ª;O4ò +er?ÅnJ\¤ï›a¥a»eÈf½*,è@ç|z’ÃlÃF£»%RŽX©<Ÿ˜ýó÷-ğaRÈ*+‡ùLW[[`ËþBQQ9gXÐ!£'ƒ¿$*¥C-²i« {çîË1A:**G„¢°R[‰"*KŽAÆFšÚýïQlV›†×ä;eÄH£’¤¬' “=SSL´‚£w¦ñ\¡¸›äÙìKƒÎcSY‘23®cÃQp¼ÇEî8eãRÃáQiÊű¾ÝÃÁŒãt=4}ªl dàš‚ü.Úf´>çoÚ_v+t+ ¹[ITƒ#ž.b7ñ·Ä2}ÇáïÅðtª1ØŠÑ ®˜tvA¯³ßpç‰ðGÅÝçê¢Îܘ#(s0«6¶RæÙݦYt·š—§?E‹=õD· „o"µ$ÉÚ,žÂ>dþxe#u¡ËºÕûÄ>ã[¢‰\äËâ¿$†EÜ_™¨†ÞÅƟͪ"ËÞc0*ú]P-AÁ-+p@ ÑÈ´YÙûé›Ò\#~€‰š°b*…œ»¬þÖOU¿ò®MmŸÃŸîP[ì>Àqdõ¾©ýwFÒ 7‡ò‘÷8•»›Œßlæ!Þ|,¾¡Ã¶w»"ÙdŽ±Ë9œ°ÏÀ‘¸ÁŽaÎËWiô›("‹‰¢4`ÚýÌç0LôÞ¯ŸN=t¬Šø(îüTKd¿ ªÀ†<óm*¼ˆƒOirH›‡f^`uôòïŸKlYóh©íyQ"ŒnðJÃgÔd"u†b*Ît4x⸩Ç +&ŒËýL¸ŒgÂØë§Óá¼êÞ{­©Sú¦²è¬:é]Ѳm̾¸çr +ˆ*/»àí[Šðxû)LÝ5^ÐÂÔ]˜fÏ8 rœ —wD~ÀyôJòwhø¹™:4+QœOàJFuKÚûël‚ۮŠ'̖‹DFµ¹¬`üóM–ÅÕöçÖFcéCsç¬,DXHíÇÇ0ÖpÓJØQæ)Ù¼SD,ǧãU§•ñAnåãïŒ7ŠœÕ¹Ÿt)£ ;Ä©9  ¦ ‘‚âI’Dq0âË~“¡ƒjñ®³¿3èä)~FÇkfé×$ôŒ(/¯׬«Éú„x#¯[îMÆñ‹8b8¨iÙ7#‡iwaè^›t´Ø›pzÚ`TA¯ÚÃà©gí6¦ßL­¾c.>,Œ)ÜòYCèb(X¿|zy]˜¸çzåv‚8{–чºA›ã÷`ãÈ3á:Ԝ‡æÁ¯Æ<81sKƒ\ö®ñÎ$ABÃ)éJ2µ¬¶„ '$þ=4>4'RëùNiÑ S|ž*⇋à©};E—GøJ.ÒÙVÀ{]ùNJó‚ì”rHT˜Ð +Ï|…€F]PM¾àþ²‰q=—ZX?{*)Ž}™ZԞM'ÿ .¦ +Võó| zJa£Ün§Få@jVj¦S üµ´ÅuΎ²ÓÆ"Ç#µñ¹ +…Nõ¯Ï¤&jô•¯P §jHéÖ mÁÖ,ޕ²Î%Cõ?ó›ðbjߥü™hnAzž-趐ú¡ƒz”þ%«’ØåÆ¥£Çp9òØÂu˜T‚[þ +O³±* ºoël—»ŠÄ'c±šˆ |Fñl7‘‹³çœy&óÈ`ВBRkÌqê%øŽ*…ÌrËËy´"¦”7Kå|-Ïúú:G-˜Ó7Ítí+ð¡IK›æݽÔÓ,W#?ñ0ÒgY5gh| P>®ZD\š’úmoŸ;ñ¬åqYÿ÷96°¿B¼Ô‡û÷’ŠòX/·N·èûB9²Ñ%—ëÒ§Ûfv:]ûaAOº‰þY†€ßægqÀ‡)Œ®uc^!—\MJ“7z£1¥%‹á *ö¦¯)åÑ2½„ö(F]b´î¯ÄOlˆáëÁTúᜠ7àØ>Ó¿ûJ³RZ(%[|MHMµLÛïÆÍì>¨&©xˆVi m^°Ö’„‚`\3vƒðùd`F£·@¡ÜW^¸t²b÷¿ëN¹h½ÙG>âè~õ¥2ÄàuÚê8Z·oàjçh;“G-p ”ú–ZÀ +ÁI’€Z]ÁàµüÓrË/!/»ãÓ¨1_àޑswþ)ˆÿ²B›7Ä)î8\ ùmšS¢·õS(m»ïŒrÉK¼M4 fsˆÄy¸>ô—xœö- ¤·¢Û‹±ê2ôžó‡]ói¡G>åÁÅLçï™6¸R»ž­§," 4t0ç(_µöUPPG¤«¡¾µ‡§@øNÒïuâ,OýÁR”Î$s’ÜtnMÄ».R,ïø¡²V § “üUã×ÓâÂ~ò⾪ô—š‘ò•/¤/(Š!Ërý*y`kÔDX©èV^½tG®£)' ç¬[ð)ö ézå¡®¨M«wçµDEmüÅ›Ç=‘î­ê±¹™›¦ Žã¦!VF#ÖêìH%˜I||Žó°Ùyë,“܁Oؓ”FaW}t;Íæ®ÀöèhÚPFTEmÑø×þ±xDm2JËry¹ Zßĕ/(Ueëx˜ò•-›«X 9{߶ k…8Ã\väÓiÙ { “„„ál2¦< FÌâWL”X»å¿ž‹Å)©KÖ"käÉQâªc|nûœ7A0÷ˆD¯iYpvMï R\-aŠ&1h,¦PrfÃJù: üBOÞ8ò±`Éyî +y¢gMIJô-˜÷ûøÂnFè†üÏÒ¶óÓ{îjw¤{q³àöXûžšöÜ!Ù¯YG?§’'ƒ$ì²DÕgΌoŸ¡®cÜe%Ž.Ý-ê),ŦUèí  •k뺐µ¾m!á (.r€ÏC×ÂüIã?Ï\k“a+ÆÒNôê™HÙ`X„âýÊ­wñPûvžo÷DȦòÈ0·¸©?ȍO,“åá‰TúþmÌ¿f:Ôw\ kæIù,¼µªmòi3Q1¿›Sd0´K\œ:X‡F°ù]JÊ/F„}T•‹ÿ ÒQûçY3⃣âDhaTTúwøËۉðÀ#i&ìÚô€v›Hm±DkQ›6ÜÕ^ ZÜ›jº/I´Á0zÎúËõfÈ@ŽÎ"ª†qENpYÉÕá0ʸž­w_ø´˜Û¥Dx*šÜNƒß—6At£ƒGõåý2RÊÓ©U ¼0r-z4þä³á©Ã`[ŽSIÑ-îžÐÏ*…°•¤÷ͽT9AdÎGœød_ +Øڏø㥦Åp„G‘àƒ»°ÌŽL³ŠoâJ=|(Ó ðÒË[ï‘@F WX“ÕBJ*—¾P܈7ÍÂa™˜Ó)£lŸ”›aq¾æÚ|É14¿<¼7OH0à²òO™úBƒH5¶RG±5Ÿ;r$Š™{]O‰Ã%†Êí7§]¶$Wi5DÇÏhщˆ2ï„$`Ô `þ";l+.$ƒ2ªÅˆ]V௑`¥ö<¦#ñP;ñu¶€ï¸#¹E¤¶Ù~þ®È½³„™UܑGlôEªI`³Yhß ³C£¨ +f~[¯¾÷-7 +òÙüt&'`õXÿèÂÇU®¼ËW=ûãCV9t«™Y>ßiàOº÷&­ã¦¹ë7¸ÍgD^7F}Î,½ùöþ‹*n˘‰×ÏÕ[8˜¼”©Š44çþŽ)H¦æÔô†^ÀÀ=eV»O¶X—Ã¥†_zVʙ‘ú¶~þæ`ðÖhFÙ¾E‹ôû‹C0ѵâì~u='ÆÆ.ˆ÷øˆ[¹e¦¦r€5ç‡t[ýÌ©ùSó/—Ôžö8ëØúæËwÃ? *qnµ½0”oæp‹†ø!×Ãè«÷ß=)¤s–î9&ýñ0àöÞðÞT?çyá¼$Õ­ ÔEÎoĝá#…½\v埘^¯çuÀ–ؾyñÂ]ª³€ªó¶N‚í‡êêò%¬œÌ5¹0O„Š—¦5‰—Õâ›ÄØò“aˆœ¥(õyr)ÌÒõ:bž;¬jÒáý°‘:EÔ(Á÷–%zoÙUg -rF5XsòvjI…Wâa÷D5ØÄ]ª¼WA5ìv¹„™GïsÕטó^phœœFn *)‡ÖɀIE¿F-â‡Ï‡Ælïԏ [#Ù¯b:ÆÛåÈW’|ÛOäúw‰„ÚtVmˆý½ ™!ësÈéïå]IÒÁkW@²Å*¥Jo‹ŒueÛß7!}Ô~dVҖb,5eQŒ +K2¬ +’6n—pËi+’4xP¥õ6\·b[cŒöƒHÕìC­…‚ÂvšÐ1•tünº,v¤~§çAwAR;mÊ»¼Û€þH|Mg{±? ­(ØD€¢Î Xóù9XåÚj|’–ãkQÌÖÐ%’ì0S¿i7)ÊÄV°>?1¥œNÁd~%(ÁšC9Aþ²éÿZï¯ÞĪ–¸1AG+סÜÜì’éûš±q_t¢/ji¨Ÿ~çž/ H&6c×úìŸ7į&×ïùÈit*,3hßô£NÚdžÎó-i¸¿hç³É=S'®#ÑíÛÁGKGb„¨8=P„1ú<±Ômq¹jœ5ïΧPèC7†½£ÑuÊê7½uŠgz'¯ý€†èÙF¾OL5 6ãž9ÝþÏ&҂Ɍ¤›~j×ÀT©ø5§É°Àµó'ùm}7iïOý¨3QÈ×Gm‡SNw‹È+ý)þbs§$'{èmt±|J©µÈs+GÒ±ñkýT°VñÑm¡ëQ9¯‹»(ƒ+5öä—ÓϔÒoæ£ßËLˆ ñƒ¶Rô¶óOð3³'¸ý´ícH€ùüu„¨C,X=Þi¾zIÌ¢BCžñ«Ò³¥p†ín78ô{ àt>¯®Çož,ßà–—əG,{šÕkqÜ+’ý`šöí°áÍR©{Ý©`ò%|'%±77&ÜwɃŠÞ¾À <,®D,\˘Ûù3¢dsE•Pšm˜ÄCÌÐ7QѦ|‡å§ìGš =XùI¶ótt^¾„—xê,R„Ò}1𧨱/Ÿ›&ü + ®‘B <òé; +÷†ú;\gáŠx]HêIÓí‰Å^´”ñýìQ ìœ~ ¤ŽÌâ“c³!¥(ÁEì,iW9/”c7¸ûd"õȶ¥ä¦{fWr­d¢ +h‹öÞIau…ÙEÜV¥1y ñxr…e:#9Ã]^¡ÓÅßÈ ¸3‚îrGÙ瓔‡ n„œë}&ÀR†<ºý·“IÔß¼&­ô5¼WVf!?gÊ´5¬ò-¤õU¼ŠÏÅâgݗpIõ ×†;o;$ဠªkrÜo_®¢š&Ìå8tœŸõü€;ï}¡Hí7‡Ç|‡\k vÝÙH&1ü4»èƲÁ;tõvüa¤Ùš22@J­3Gu²>ñ\D!(ÿ_‰ÇZ䒮†~&xÓ4áÞ‚Ú !°t!42HÇ2ZÊâ£×'艢Æ7±Ï8èõï×Âîe “ë çÃË(ݜI×5ÿí'¸ªæ½[W#ò$ùz£w##·íföë¥TûÍåÏVPü,°7*9E«ÚK¤h¡†gζ4졦úÄy²y^76há|~?çmmî³™ùÖèOºnܼ")„K ë>›6’q×U¶_T.­DI­Vóꯒ¥„µ m{êηè&¥…¤ï +ƒf€E§`ÃêO΁XyÞûÅJøy¶ñá-I`ÿgÊ1o‡ªÑė¨OŒD–AÌäƱù¨ +Nåë5 š7-®…ŽÖý:üÖ¾ð!nK]ìD÷.A‚¨RÉÕaù¨O¡¯>ÇO(X!oŸGȏ-r8„¤Rìóâ»FWó-v!Ùò&³C¼h*E†"}—pP%Vϖ¥žuG´ö6ñj3zwÇN¥|Ù{`Ô'¦äH[•çÖÝZ·aò©æÒAcˆÌwºÝý“ÕlÊ*Ì»‰^4¢xÅ»•L’¡¶\¬Sœì+žÊ[üØXL’É„–±H²I.Ž<¬†Ýҗõ0êÝ'¥œÎ]~~&ò¦8ÌÂÚ™&À+> Ó|ÝnŸà»±¸–֙UÓÉ©?sG/·¬îÞ\ÞÌ¿5¬fe´•¼›!f >â´ëÂK^ç‹zкða]8h[åFïVÌ÷H‘¸7Cá1•û륆[ŠoF’‚žéå ‹iL@­,ÈLÞu‚z¸´Nâ)¾ŸP@æO.{|ŃX$Íö¸(Í{XÿPì {ÇÙ 2ùR£Z#yXRkoìxj 1–œäèŸ 0=x.µPTŽKÅÐÍÀd:˘íâT–nÓzÓjOf»S=¾k.ÃçñV½ +Drxb176Žk. zÁÍÊjO“쥍ßÙwÍòw\¸Ä<˜Ìpã{ÄcŠ¥O{1 ×Yµó1+z>»Æ¿6® Ü]fC`=lPX;_½·:»êvÜYSd®°?L²MGóY +$Ú¨P’ÖÅ1ü4uÚÔG©™uÛï™*w­…ÔWªRëaã¤pw«5œÎÈø¬c$3ýJQVƒj¦ÓқFþDK!н5L7ëqTZò½'ƒÏâKM„‹×Ì÷lèdP´Í3„~aSøMC€SŽpòÏâêË@Òßµå1pZ^99…ìnðÝ)¼lÀ]Æ÷V÷Dû0ÀF½õ¨?éÙ'hu´aèn®œžo"þýãNµ°MÅ:t!ž¥+¬{+6y&Ype‹Ã#TˆûzücKÕéìkA«Ðý \ÛÏÉ7á8^ž`s®‹Sâ)5WOû7¿–b4F¿›—Ç^?®5GW ²j +‰²‡3áV~$‘èþž_=L6ácÛìÓ7Ý }â³Îé{·ó2AÍöP‹°âmÞe“nƒÍ·Å’ÏÁ”ËY¤»-V¹mwÏÉü1}t0õ€9‘äÜU:=Ú¾>ÌBµKÃqg{—»eF“®…d¢w\ÄIC-÷é§~jñؗYN¤òRµ÷èn)ÞÆ¿owýxpTi`zÊàØ8œþuŸ¢ÒF)J@"#™û3áosVøÕÒÕNáS¯o{¸VË•²àò@vXüU,²¶–O…ièc 랒ÛD=uó‡Uҁஆóº4McÔJ¶ wÔa²21T”;Á)R/±KÐwR³\kŠòš\íABȉK+³ü«ÖŸÙ9œgKZ +LÁ¸µ´æë#Â1òÞîZ`ib½þ^Å'²´µ¸Q§e±@c­ˆ§å/p¬Ä^±õŒGiV¢Ê+ µŒ,—° Q[C¡ì*» ëS6‘”ïdžÄÖX¿ÜIx8ÆS[Uÿ|Zf@ y­t„;Œ6¶WØõÇü¹Ps̓þ€Mdøñ‹Íxó ̶ü}€îý³0‰—õn/†"ZÔNúUQÐÖ$Aò¿Y‰ Xà¾zÏ^€”ö⡳ñåk1ŽDñ¸üo¢‰dòü£XFL•q«OÙ8°¬/˜Èê»óx¨µÏ° cMa&ú/Ê5£òsMWc§¬›C°¿*m²ËähìÙ²3=}”Ì“ÍÝx)0-4¿¹1Ûèó]êU•¾‘° ˆ‰@KsgE‰s©%«Œ)¸ÍNáýæ¦ÚRË2¸½¬/8•^<5#”<ÅÆ~fV¼ ¨,'YZ®ûê3]½c”ùÔÐÇ% «9d +"XÏ~èwçaÄT +Eqz¢]úíºÊ€–mËF¬èTþÌY™÷mRËÅ8e­ˆ 9é‘^vÍ'QfBbNþ¤eÎåTÃÒÏIÑPZÀhá{·7Sdݚ\Ó4T2{ ۘe~󂅻øÓ÷-ø€À†¸Ÿ7҄OĤ ï‘PrU¿ü&Æ>q5þ|“RtØð<ڍ™?]Ü'ø¬ÏϘyykÅ ºxÜ2Á¥aywݞ&’øQ7´‚\íŽCa%<4°ãÅÝ?únqŸ$ºð- „¿˜4X~Îüº8í#»^"±VE’äj~žóñÀÙRhÃ@Î_AïX0ƒ‰òa•ì4MÝËÿ´÷Y˜Eÿ˜ynHçDPéÓ½A+ŠÔE$÷Þ~;Q‰8ú¬àV±a‚C¸")¥Mïò© +œâؓð6YyÖ¸ûCû‰p{[RM…k1Ì'^RFY—ŒÑ•d7Bâ¥ßp*ôÒº¥Q7ÛȨ=:Ëu“,Žž—+º2zâ©kt(ú¹ÓTS :ä +÷j;Oê=È~AÒñò€:>IÕw}%ŽÛç  aKøЙ٬Ž'÷J,õe8„º1é»ë<†âM]æ +yU ÷=;MKýfß)%¸ìãwø){l5KjƒÍ´4 ¯Ù­N¢×N,¨øiÍO8_ñlOƤàœ94L΂;nHº•ªÝÆ÷Ïø,\ÉP}éÆ7ÁK¸'M$/P¢ÅíƒoulI”8Ð +¾X¤,–«©9y -™ÝØ ×AÞ£'ï#ë×ßq½oø"#RÞÌyÒ¾ê£kÅÈ2«f’d•*Äâýô-cñŒM÷ˆÔá§iGûcSù­%äò÷Í­]«ÙyæãϏçH¶üdå\ŸoðŒMì蕯MãØCz/ê%éÃGÊ©ÎûëU`UÇx 3]4ó8‹œÉ!j£vC~Ìá¶wòrLjouf@œ– ÔÑßê.Ú¦± ’ÞìMŠPҀœy‚ÒNïoTÓÍÌeSöPŠÈè$´æü—•–§Å ÆÛÙèKyáȒÛÛuIÙ)0›í*š Gmòë÷­\¥Ú.11Pžaž½‹ +t÷Èï|%kO» Ÿï4”`{]Vú›e§áx‹%ÓìŸm<)=rš|Úíî<ï˽î°ÆœJ­-Ѥ–1)°ÐäЄW\?®›esžW>¿/w)(0µd½6T¼»"~Øn‚p&èCëE±±@Ñ!R컓ºFfæB‘”McÕgþáÆŠbŽƒeÐdšV:ï ѹÇl~â›Qà’‘Ã1]m®T0ãdÛ23ÔÕó’ÂÕøæjHÚ5¦á\#mؾE’(I­V䉖O¹6ìå¤lëÇÁÔ45iûâ8`e¨XÛÎ5±;LÏî¦ Òz–/—ÃáD{ã’?ÆÁQ}èÑ:æÓ¦4pS¼?¢J]K<ëË~0GË<Õ9ðΪ5+møŽl@ë­6@kÙK¥¨®eÑxí¶'âñãùîg&ý³ÏíÂk‘ô†µ¼#våËåS·È}ço±r¸®1T¥“eq ”èJ"zk—)¼q:O2*(ÁZRÉEã‚ýk‚I4ULJIMô«n9ìRÍ·vQ”«äY“í*xBº§>Vþ!%Օßnîégõ¹™K7¦ KE‘?7ºj½~­=—Ì#cqÝIØ9f‡ +tÔ6˜F¿ƒê Ò¤«—"žp9ei -ð?ñ$ïՄa±ôoºñ úA&Jßbgp'j+¤¿ô¹å+7„L|{ú!>¡òqMýnÁm =¾%J{Åð3ÔЦqa#Ñʝ²OŽù¹ƒ„XEߤ›wj·òõ7ø>80—¡p¦æ…â“úH<œÒráÚqLOn°/¶_Èǔ9ÛC¨vãÍ3äj+úû⁝{/Ɨ¶/Z7š¹öjl¡6)½úٍçVªûÑ>ÑÊk/À]Ò%»;‡—>Ô5ùkw}ˆôA姀ì¬i5iä«ÿ¤îÄA\°&^£|0×ÐE•ÁÀ=•4»Ÿ ìàoª¥Ä‹qÙ[j6åÝ­|1 Ö´Yèò+sL0;6Žàu0N(¶æÝÌO,=.Q(ؤ5½œÓ%_)¡ñéÄëWÜOf!©àÐ>!ÿGT×LÌ­‡)ëϙ%?Ú9¿-„æs‡1-}R¬ìoÝ ¬ðAËkQ}f¥.,˜vƱ•öºý$ׯ•ñ¡]ñK¼¶¸ø¸}iõŽPßFˆ>cJÏÂ`füš¢$®·7«â88N8qré§_3žóޏâœRØ¯‚\†SžôðƵ5¿¼¶Q“RPû›\di$ÂBÚ¶2dËצz(·H’[Ø.';R„Ÿvr¢ozÇ;¶"t·€ûáӉ۪:ÄwmLèF9#ÓåÄwé·NïX.úE´Í1s{ç|›*Ò›¢´‰;§áp‘ס +Ô¯6ÄÇ<Ò:7G¼óìæÆÒ{#M^T‡º=¹€ZæU#`¼KÜ~¬¬Š1–*‰Eªs§¸ (à}¦vÕ}¸:0YýƒU»4[®R…ÖyrúAaÎÈê®°·É!ýžgÍÛÏ4DÞZ%Ž­ÂÈ*ܹ¨‘åÒ!I§ üøaHƒOUSË#ʍpìP̹ŸH@tw] >´£DìbZ¥º°—ù)Þï\rz6+X­ù¬Qट”Š>Nڔô u'z¨x§~­˜…è¦õŽõ ÷÷ +gÒÓ<ŠÝ% úÁ­U¾mM™tяϦ˜‡0apαš‘Qñ§z;ÅÐ?×T&÷“ª+]ØAÞ¥æö¥ÄOxoÒÍQìV‡¥ä1Jfx(Òâ½&ìÇ7‘[ÃsœùUs0D)ŠM.H$(¶®qw)sŠ²á¹•ås¨hóL‹îÆ¡òœŸ¢Ãú^6‡–õ<>,F+çùy‰åDrç›Í¢†ž9ÕËe ¿©Ð3‰! é„ µ¬Êpâvá> endobj +12253 0 obj << +/Length1 1630 +/Length2 21092 +/Length3 0 +/Length 21942 +/Filter /FlateDecode +>> +stream +xÚ¬·ct¦]·%ÛF%¹cÛVŶ;6*®8Ûª8Û¶mÛ¶“¯ž÷íÓ§ÇùºÿtŸ××^˜ sí5Æ&'VT¡6µ7ŠÛÛ¹Ð330ñä-m]•ímåí¹e镁殀¿rv8rrQ' ‘‹¥½Ýw# @h +ø4°°˜¹¹¹áÈ¢öN–æ.*5e jZZºÿ”üc0öøÍ_OgKs;Åߟ@{[ Ë_ˆÿkG àb˜YÚ¢ +ŠZRò* y5€ÐèddPt5¶±4ÈZšíœÔ3{'€Í¿{;SËJsfø‹%ì 08;M,ÿºÝM€ÿ¨è@'[Kgç¿ÿKg€¹“‘Ë߸Ø,íLl\MÿIà¯ÜÌþ_ 98Ùÿµ°ý«û ¦hïìâlâdéàøUñ»ø¿ót±0rù'¶³å_5ÀÞ쯥©½‰ë?%ýK÷æ¯ÖÅÈÒÎàtwù'–1`jéì`cäñ7ö_0'Ë¥áêligþŸÐœ€æFN¦6@gç¿0±ÿéÎÖ ø_ª7rp°ñø—·ý¿¬þg–.Î@38f–¿1M\þÆ6·´ƒcügV¤ìÌìÌLÿ–›º:ü‡îÐé_ ¢úgf¨ÿ&adjogã0šÁ1ÊÛ»ü  ú¿c™á¿äÿŠÿ[þo¡÷ÿÜÿÊÑÿr‰ÿ_ïó…wµ±‘7²ý;ÿÞ1€¿KÆÈðwÏdÿ,#§ÿŸ‘­¥ÇÿÉë¿ZkÿîÿLÊÅèo[„íÌÿRÃÄÀôo¡¥³¸¥;ÐTÑÒÅÄ`fdó·gÿ’«Ù™l,퀹ýW[ôÌLLÿE§jaibm÷ ìÿVíLÿkéúWþŒ²êZ²*Ê´ÿ›û/CÅ¿ƒà¢êáð7·ÿQœ½éÿ<ü#"bïð¢gæàгp1ÿ½âfaóù߄üóžåŒ\œ,Ý:ëfbþWõÿãûϓށ³3±7ýgtT\ŒìLÿNÛÿü£6qurúKò¿Àߪÿãü¯¹݁&p+‹ö&¼AV©i.ÕØ¿Ç¿ëôv3ƒ;שäùUÚwù¦†ns—¾W3ÔOò|¶x,œ:|ìKÓ wcÙPv%/s¿ùR÷ä¡nP´qÒ0ê#¦iDz]ÍËnAhs0©ìŒ+)ë½CL¶±:Á\=Qû‘þÈóà {t@úi’RƒÙŽR‚VzF‘püôHÙ?248ÐuÙ³O›KÎû‘"ÂÏ1_P[­Ì+“Fè V8^êv¿ÏHëù@F…ÌbϘ"îŽWÝô˜¬ô2Z¾Õs Î8{n¤¸n‡«Ì¤øˆ(YhTÅ@I|õ\è0Æ*ç¢ošÑ¢Ò»S=š´n{Ð<@æJhHøó·ó–”˵ö2–mIgØ-ãi‡ 0Ù¾¡%>©í`1óž5×9ÕÅs×ÅkùĀ¼VGf°ªš×£¬EoU)B¸ Q•€ƒµ[Ôøç‹8"‹Â'I‚‚퟈ˆ¸Ê¤:y¡p¶óèrA`c¥€9YÈϓÙX‹gBQ§{ øËúÅÎK¹õÎq„&ß XT/’Ú7×® 8}@Th;WmYDæÛÍSPã=ÿ‡$á(\Þ³×°`÷Îüèt“ÃÏ+⟉Å/Á(ô”ËÇÕ°OW¶-øqG¯GÑ(uëéCޛÇ¥rÃçîd„Zü瞆–FJy•*äK'Ù c›–¿ã/ÏIdÌ5.×M‹UÕÚÌôîidZ2îŽícÞ#Ñ_–r¿<³ žÊE¹Í=n¾e€D²æAðK6â‡V3CԈÀšë¨e0с#Ò:gv v)½t†1h÷¢6o7Îföþ¢Œÿ(‘&û×­H¦’Z0ÞÅ1À}5mû³õh6 +ÕWŽ6ܖ€Pú°n1×åÙ®Àz´‘EÓ`Ìh½i-`ÿD»¸aAÖ²ó”åL ®¨3¡½ IOOáŽF<\cf5µÖµ6Ñþ*nìR8›ffyÖ¥$¨B&oÔªG_ˆ¢®¢P¹c»«'Žã$©…·™ö΁#/ž{݂\V1;˜– gUW7V:MHÖ[MÅûJà°ÕWùJµ\f#?2#uˆBí®ÌÌ0ñ%0lö†ÙgÊe˜§è‡  =&èƒY H‘'±â%þn2'âà RIªÈ¬ nìv]AGr,ü•Ÿ ·{sñ ÷#˜É(Ì‘:Ð;mÉêõ8+ò9fNåLò‡†—ã4qÕí¡€^£ñ±£Eù '  õp>Óí=9‹p÷锧£EæA¯à«š•[辙.›ÀPH½ØîÝ,dßl¹géxµÈOºRo‡ë8µ¤ËÉ"8ƒ1ú…x][rÎz†Þç¼~æé>½\7c˜˜;@mŽ\‘_5Q“*k­ôÍã$šƒHM¢ïn»˜+|I¡tBFXþêª-TÍ1ˆSI@\ øΚ] –#G®I¦êá~¶²=ÆZ!Qó—Cu\…Hòä>Y‚‚;H¶3GËæŞ‹ßaǘOÊz‹Qòïârª¢/úQ÷RI:ÓK~©<$Èᜤ…« +å³¾hîø¶$[E†aŒ­.´ˆúò©º”¿4¶ÊùeñŽè^â”q-aåå¯^g5)iק¯-*R£@b9œ^L ú¬¦¥3º±+(URy s¤µ;aí¦äš¨YDÆæRUÎlßÂþø:˜4˜V´RžÛíLᶢºŠ$l¸•æ©G¸¢¡˜v€Àý&‘• £…¾á· K»œ[Iå|cfµ%ò TÅâëÍîkëæœùüUDè«„Ø‚~k¥íÆw nàè¡i#•H1;“þn&¹ËÉ»"Ë®¡þ7ŽÈžMñý-Ê֗D®¼«°Ø´ +naÖ),ºS<°G[÷(@y/·`:ô^â@#ù§Ujž ³I‡aèfŠ3ÙÌtû"PY dš>x?–$fg5=‰Ÿ—L¶¬„Ý(ckèT« An³ˆ‡œk$jÈaž[fî)ê÷ÙóËðRUG þ±dŒ_Ĝ¼Î9– |»öWý!h·®xIò0?™T„¢‚st&ÔX‡ˆÄ)ÃÐoRÓ㌆Lé-(?Sìú½²Ô˜·Ö Óí¼ Ã7Ls[äKÐMîÏÀµžk©uýôß*²³‹Pê4¼'åHRB¿Ö2ÎÆ'.bý£ÌW¿~‡¨'ºŽÃ Æ0H#&׉¥*ÌÄ¥#ê9¥uS£¤¶-U44(ú&A Më±ÀSÖl û£o$óíT³úËetˑ4z8&¥ ȅšmÉôsá$úÙ=ïökyÍÞLêžJzªG‚a¸CÖÚG¼ºÎ#ÁÛIrà… ¸ðçMš- Þò-a8õ R(3Ycw?*GMOÕ/ðÜ WJ62¹_Ûf +ŸÕók Áp+_žA’o²hýO:¶¨ÜaÏüåÞñŸÉ@ï¬Ä–aÖ’bRTœsQž5^"ÉÝ" +è^|̶³„¨š¬² Yt‘£\zÚ³ziÇ'cÉ ‚n™¶O›9 `F‚Wr÷ +5ß ²)åã“Qzñj).ßn¯£³nmê%‰†Ai¢±÷K%íä-~n`DÙi4ä¦d¬µS´ŠaAÍ{ڛÂü¹þä‘éÑô֭߯û½_CˆRË·µßÂVõO—Æ>íD¨Eµ4ýoÚ®AŸéìÄ?é½|Ø¢RÝpbèùÁË õd-§â¥ÇzN `‡ dàð¾ž[Éåqߟ”Ô¬›âìs›û:’RÇ­1 ²YñI啚@Î韬‰¾†µÁ ¶ÝoOË"5©[‘ƒØV”^Ä°è«ç0aªHJ»T…:,pƒ³Äîôjü¹_" ƒ–ß+|넛“”µ3)¼"Uër/ÖL¯R±þXö’fÈÞ}üj3,ÿf<ïõ'» \³K}„|οÚì¸Ë\0/p7ê´%ÏVè™{ÛeM¼%.„›Û8ÿãJËçI¡–äïB²I òBŽv£>Ϭ§Å›¾“]”º{w_v‘ò§7u‰M1ÏV†£¦ím±ð(7?F±bpÿó ^Çd•ÙT„¶›äû% Œ‰rP¬×4F)ÕÍ6@Q@õ)ðS@†Õý7mÓMÔf$³§87èØ[úJTnv»Œ”';ÃJ|Ú âù]…CT%ºÛ«'ü?ßÞWuÚ©›À²‰£ÓD ]-èÙüR –Ráfc[ +µ¡µaª•üjfÿ¬/KªŽpÌO1ŹÛ7fýRVI݁Yîµ<(—~^BTúð ˜6vVà áì!` '6øßã}pOÁ lo¤Pex½ëÁ=Ã{5sf±¦4 “F3k¦?wñT©«Go;„P3cÓ Ð¥mÆ);cýÁø>bcB,¨…5²®E‰7¦=šGÖс ›€ÿÀGVAŸÑÎ@³´¼‚Až+ä ïû®×îí0£Z~KŒ{žº’q|$Ll0 ¿Nãä±ÉZUàþ½r'üìyք²ÇØýlU”äȈšg1%u^^äP+íÖ(I_øŒÎ#XœËÚ(–ß)ó( [³=¶@a"‹˜³i†T—Kõ7NÕDbßu‚ÐÔ($UÉ%ÙÕèpc`7s¯Rß·1¼m<—Ci,¾Žd?êe!íûg÷<%˜fIԕù’fZƒ‘²÷&Ap[[ÍêV˜@àBá$aë¡LÎão~qˆ[&A `Ù2ŒÔT„@!wÛÔÙ bwhÒBüLn^„[üʘ•µ€ßIúf 22H<&+£aÀiÑ-5ÄåþrZ¨£Z>[¡gyf}<3“ðh]·¾x³W{䫤{­eáá$ÜÐ +µ“4…ͱôaím ´oX³BôÛýzļYζ·Q°S¿XzáeûáU Û*ƒ«+ݍz4ëZ*Ð(Õ& zïõ,"xüqŽÇ"ò ¡Ñ”™·ËomLéñnø$BÛßÉë*]ÁÃÕýB¤·è֐~%ÍÔz…¥ k`kæ[ÕÆJ§±°‹ÔñӔe¨¼ÇQY'œ¦¦Ù»¨ïè2˜¢Û“ÿ9ȕ5e“: >¹Q?sö¤W()š\—Mƽ–v+G­tß‹»U2Úà^C G |Í8Î=_¬ˆ«#.V.Acª± Kép¡Xs„qO¢·•f#¼úQ­44  {Ýxž­§lÇ<—˜K.ØÛfeÀ Ÿp}Š÷p^™S„9EÈh½±#=t€©ˆ !Œ=`a4ÕD4Ùº°-»77â÷!Ñö O·³ðpû±u¿â?ƒ²)i+k-ó,küývՑõ^ÊNë³4Ïy´]•3þ\á—Š76ø(ÌÝËÒRsԟüË{èÔ&[Ÿ–‹¤Iœ¨:®¯å8a­?pmТl7©W Ø$¬b.\u—Y_xŒƒ·jʃZwÍ@â©U çF{³+©èÂWŽøósß+¬Ö(®ÿœë±ºÚLŠ‘ÞÖ@ KåvýÌë=°Hwx$õœÎ'SJ4tuÛù²‘#V0Íbqk#3`®€¸èW㝙K<³¿·.æ>&Èý¯ä;'BnIõ¤¨‚æ ›à­¶!Jžö48_ µÁë;ÐФF싄@ás1¨ØL|)ˆÉŪºÓ8nœ§—2øÌaæ©y¸ vÁwF#wèêӗœÑa…·|¨w}!K$q9qsÞaÙX:Ø×e›?ËÞµ lžIýýÆ+r?OêC¼^rË?œ~¬uSl/‘ÒÁëkvݺ…qòé§Býƒá7x¹YÅðÌ=ê™´¿Ä…Œª,ßä¶SOóDëGýž¬??Ú&˜ÃÖn‰ xµ¸ç²ÏU¯ÈÎ÷ÍñÔ;Œ^vwڑOh^–$¢Õé!cŊBêN9Z««‰ƒbì¨b½>Aƒ)ƑwD·×àyïµWЄ‡’’ŠgýpŽ +¿]ܱLþÖͬâlQ"UEuº…ïÜ<’ØÇÒb=àãäU×Èî6 Àçþ-Õæ­ãcñ›F}ÀÈgÛ絒ßάÆÍ´2ÍäYN›~u?oýæ“tœ+굶ÅÖn;4˜UŸ€jKâeŒè™óaŽ¶VËæ+痱¯„zÕ3$¶±®O·ÔôaícoYpáPwžqß7î­©Û7¸¥£·jx²…säŒvVˆ5r…žF¥U—ØKR¦½e‚vmĬMáÛÂt,b§ ÐhIã„wjøÈÁBˆªärš®íhFp bÞLfv؎Ù2ƒ8‚A-uV[ðúö÷®UKk6’q¹¨;™›\[=l؄kœnݞ‘yö¸ 9Çkkؘ]›~|¦L'ù‹NZ,SY$¡µþWž +R™ÕšdI¨sˆ9È´š×:h–ÏMìiÖuÎdÝy0©á”0zXù$¦ÄdÌÄ£ÂõI­  `Hóõ™[{Ë·ó©ÈÊ’5¼Ô}Ý8ã÷¢õ8È1ùRhÆԏ¯*äolªK˜Õˆ7q9Ù=X áy.;)éÛJf¯úÓ'>’~‹J9fm°ãÓø̓+e’rŠÅ} ‰]‚ÚRÔÜû=¼ì»íš.'^på±A>“߇Ìð“áv™ŒUuß·½ëÅ ºÇ7{âÍÈàL¡>Gž²½R–ê‘ÔLÙ*cQõób­j[tŒR²’ƒËۀ:œû ¦')ðçe,–J¬ÄƒžSþ_b¿G³Ðøé _æ:›‘ Œù!±I‰¡«õXz7¥(å"óE»×DœËý£Ûi£²Ó î|¯4 î±1Ô¾‘ª¯ÑÛ"]>õ {.¸ ÃŽ%+¨u|·äÒc&å-ZPh˜ æܶ|:ÚyhU¸jdž 7Ý@7}k ‚s*Û¦¹¡%Œk쨚ß?JòVÆÆS¦Ñ)¨–Fw¢… „bªK£ëIUb.“Ë»9³MÔ0šîQÖÅNæ~}[ÎÀ"՛¶g/# pàZØ]ñ¡i>½|„FÇç¸x ¿Ù˜A™à÷gu-Äd#ÛXÃð’Zò.Üz–udA’õ_YâÞ +M6ÒÛ¡ æ | ¼ñ©©ñ~lL_ É + GÝö0„Þ6{2”Ï+7vp€ð"Ò;A)2tèGÌƈëq€‘ò‹Æ tÇ2Ÿ7çåÑøŽ%’FfaÒÛ ŽÄ¼™'ÃÊ"÷ÆàLuQ¨O>‹ Š5e`×Ó;è|µKu‰ ÈÊöM'É3,îYóo6J?s]Ÿ\õ®ÁcjqBT”LJ|MÐYu^Õ¾yV|™Í ž‚ +|cA_Ë. i=kÕêÑG,. ª=1c^Ìù|G‚ *æØA±3ÈÇ¥Y%ôc«ÇUîHnåҴ窝ù Eõ_=*7oq[j¨þûˆ»Uº›è¾,P6vc0¬ +l´êÙ%æñ5/#ªŽâñ/óË®úâzÍG6ÿïâT"¬Žo—V‹í¶€‚¹ÐŒ«‰ Éò|Ø¿Â ûàü™$ñ’¡cïÑm´…ÝÕÑÉØÜ%SÄÃÁõpþÒn\±ã©Öd ó£Óœ<¨;·Û‚é‚ø,ªJ7‡NAÐ DLŸ$3Õ-¼ý²Ù­¯¥“Ãe ÇWUR²Þý¥[9c°šì#¢gÙ¤h¹Âèëè5¬®£o.?»oÍ^Á@†ÿ²yÖy÷-åJ0²ÒÓdûØ¥™¤.@ýÏwC©v ?(¹ýÌEþx&¸A•£uñr×}p«ßϯ­鏐n¶±y3EJL÷6âYcs^pöîøõ 胞\UJ:'¨Æ²öG5c`êèlŽK ÊgJb±7Egk<¢­CCZ ÄÄÝ×y'›G*±RËJ—_kʶ+|ë ðrT©ùPÂú ¡y–‡Ñ +ñ{¬¾†s³0G“!fôîÝ5N…ž­"èÅH½ÿô' Fg}4/GÄÙÄ8  º•I¾M?ÒôÄÚÄkŠù;\ÈyN!ŽÝUR‹_ƒ&h(™­#›ºk{›,.ŒÆÜózßB¥µrƒ]j1·ÙÚZ¾ÙFH@KH·’Ý¢óE«9éUÿ¾Lš›¦Š‹\Ê9È­ÁÝ¢æKóò¢ |ä!vZ\º•ªðW—D •ô㶒56¨Ü––¼%÷ùW×>ÑJÉ:ÌÂtg/†j™HȪÉùJʬ«ÙÔâë©)¦hzG}‹ˆ#¨ ³Õ’ӏdU•g;zì@"¡¬Ï27ûwÏcÆ% ‹RØre¼Ž”Úú„7ԛò§SïsúÍ²±bÏMkî܂a}:åi«ödáŽaò$퍕úI¬kà_Q|õ$I­ Î|' Íèqt~z¸•4]ÊøêÝÒ6­Gö Ëûä4µâ³E$¿Ê-M_÷È:š”d€ÚýNè~â¾ÄQo½g/+ò« ¥.Ú¶3@ZµÒn#®åÍZú›>ø £õžÿÌňÙíý£9|?ÂA3°“à=E´”‰8Y¡.ç3¥‡òð·>¸÷Žp±° ‹§(êϟ«©P¾Rª±OówÝZ“coO·H¢Xqe +1yJUØÛÃX•y*SAÒõ+šÄ]å„V>Ël©¥Só]§hî»(sæ'ÀöÕÀW0EÏ¡‰Jñ…}¢pýD‡ãé°F½Ê3FtJ*XHöf ªÓÇJ¿8qù~…ˆoÕùø^ÁßgöD;äD£Ú¾4„aJŠøi Ýg¡ØŸ}5Y‡]"ž•ª™[u7SµmýŽŒ2F¹ßJwü;‡ºJÚüٌ´By)+ruÔùÃÙ9Ñh ß !UÒ?U!ªáÝ[ЄgSð‹ñHÖ¥½­•œ~{°åñj§nª®>e “ª ½<á«E«÷ÝyŒ*ðmx×,{f»¼Î™kÉ`(܉LY„ör=}ði9÷¥L)› + ¨ó«Ü‰07ê¹ênDC‡(—ˏ¨_Ã3v¼â;w—Z<]2“3Yä]ÞH57…°U¢Ò‰°ï/èyRt¢—ëªÄ>øŸXB–}±²ÚEÃAˆ¡,­"a­ü ø +{R +è‘Ô†˜b¦Ðª¹“²ÎÐ$æBüee3ÉŸë¡p;žÇŒ¥0Ùh±jBÐaùf« ñY–Ý‘z)ÿ  ÒÆôÝVR]·ó§åÀ&âá BïæŠSØ5tP1ÑÍǔ9=¥Ñ]Êöuu¦â¥ XW>âšËèü­£xÇÉf[¼3•ËQ%É£2i¼ª=J@ƒutÅB˜à)†R‚øÎÌ6BècjQË:ð¦?½ÁxÝpò¥Èˆ ¤Ôåró…… GìümJº“Œ°‰]ZґWæÇí|ê}n:wv’'$숕Ý|Ä42ó…X"Ž­ZÛ‘ØŸVxæ¼ûM9j+§©ªŒ}WxON\/- *àIÞӝü”óîl5…ßkÜx‰ç¹‹>è ãžD¶@çJ‡eG–;áLpDREýU!eaÅ"üO¤ý–c“í2¹âcZäw\Âú¯täü63‡þ>a¼ ˜ö +ÇkšÌð•Ã’· ìŽ¶î¹êádˆî1RßÜE!#”MØHóëëw‘ë|I¶­~àÝp'TGÁú269›W¼ÜŒE;{ûòb¬ääóa|ì“-?¸aTûPâÜÍ@u’Õ ²õè~•Q©Ô¯Z‹Äæ %ûj~!Œøñ>Fs¥B€‰šÁ-Y4BëžÖï}¯ç²¦­ŸêE:Õzýæѕx¹„àãöƒ¥Û©«ÆþGAò'gœ8ƒGÇU½Áü” +3 ‰»·T÷|:ºÈR…yÏFI‰ó¦ZU_q Côª°XPÊ|krÿѹÇXÝPt Þ܏eÊȧf50†Au3¸Ä>”Jî2ÈhìŽû}vCW{æÅÄe¡½hoh|ÙûˆK ãcvÌðÙ#8Üâ¹úuc¥`Ny± ¥”Nc3 _˜=r“¬e '%!ªvPXÑ-a½rþ'hÖ²àÔ×°¯õ·4Š–ùçhúÊv7ZýPѲռäÁ(¡¸ +¢À“Žä¶6óœc“ !ò¡Æ9¶ô¸»I§ë–CZ¿Ó‘Ðøv;5‹HëŒvëç‡Ê×½_jh…à¾(©]D¬hõeëµSn®I˜‘­ÂxãÅ©Çà9%™e|òuThG±Pډ«Èn׃Xï{Ê¢E= Ç}ia6Y;’æÝ»»A`V=e´cؼ #•äC<úKó§òèà¤O;åä.™Â{3+{£hÅzÚ¦‹ænÞå Ï$‡Zl6Ïpl›û¿Êt;Û]ÍsX‘,ÖÊ' šc"ðfä ChÊiJJš®U Ô‹¹W íÅßCw¢A3¢•Ž.sÓæ2é–ùêǹ9¹ö&±‘´°cI…*¡¾‹g8Ùt +А(JD}s)?~WÑÏ*%¤h]†˜Åì+ó,”Ý-{ GýŽM”êX6«ù˜-G…VŸ¤Ò¨£Rògñ÷ÝàcÆtò0˜3í)VÑÈuÁ¼YດÿH› ¯Ng‘Ë[‰4pŒ¤Nl»6Œðs|½ ¢ 94Ø/Óaë…É w–½NÛÃÜ|Rb‰®;2sªÆïÔ3ˆ'©×¾ØJëٙ§·"QBuÚü]hP»øÌb ‡©·ÃþWrf1ŸðÈv¸oæ4˓o sž0r䅽zšVM «õÃVgèÇóh>¥dxݓ£NÊü·íµ#ÆËɁ¦ü̶½#½œ/7ý_®XÓ¿¦6Z!‘Ý£äPxëöª?Y°uó”•J^SÂÀÍ ‘í­ES~+²),ñQätvz iw †¹ 䔈ˆô0Xñš šÝ};9(kWßÇèú5ïu‡YÞ[8dsRYˆö´!¿d·Pó®Îí$™Px(ªèβÙ3VN†sc;уSۇ!üž::®"/c^¯¨Ïêýª@—%ãþ³ðP+¹E¬¼ŽúdYÛ㯟‰^Ïw9ŠÖ“Ƈ©(òÃøåè¾ìUâ–ëÝöÒo‹C5õ[骫† íæ¬JSϧòr¡‡!=°-mÛ Ö¶WÃBãŽÃ ªÞ´(žŒˆY×ÁÊdþØ¢Yï\$rõЈ31Å͊|Ç(½Y€_Zªv\ûtâŽg†è*©¢í؋ºµ!·£˜„\‹îTG­âÀÔ|¾Yn®ÔÁ;{Bb†õO»œ&@«º»AÿðƒA1­ûK2‘«Ó#«æNWí^«ZÓ7î´£gýÓBLeèìê2Uê£C߶¢pd4m$ïodÍÉ,Ñ 8Gš‚ÿ KQðãFÆæ™k^Ì5f¬mU1l øi7´Æ›,,F3M|7⟖åyóͤo×ß{ƶ’IÉRU^r¢CæÐÄèIƒŽþæ +ž¶p¡°¶Ñ¨í7~ü™ž` ⩃ÄÊÑ*›9ç[knY‘‡.3"’ÚÍÒ¢çNZ_è(`©Lž_–L¬ë†3ÄRõШ³në͟ø™öËÙÊwÔ|ÓsþØÄq'›ˆ*nGY‡#ê4ÑPÿ‘Š…¤àSlèiŠÁ®fŽZu©=Gz‘r¿KUÍÜU$Í®æ3¿æ÷•Ë« ˜Y 2ù*™ºtæ~Ό¬Õ±êl‡¶2+ñ¼Ší.½‡úr=„¹Ï†&,~IÓV¥ªvHÐuJHöÍÕÕÙ5ðù¿ÐC†z¼Šh½ÙòóJݞ㭗>單vÃ(˜ÇñšÓºkà›Šš6˜ac+‘j¿»Ú±–µQ©lm© ²~‰†7}xÛÛÏ2Þ8üˆ:y<¼v’°¨Püæ^V´¤Y>a¡Taá†(xMà™©”í¨/RȬ³à fxf TòüÁO@ˆ ¢…zaÉa§î-a.ìó@NJDïø‡~Ó©&5Ú]1N]ɏª#f@$äW˜é]PÞD]ª£¥D¦DCK„4µ¬Úsì9¤È…³Â«>⣙Üc!~؏¹f%C|®ÄÊý7´•3¨l>SÃâÜ­­n• +þêÖÇn X ’(ȕTcÚÀˆB4\9•$zmêÁÏGÉÆߖ|¤§’ +Pr8:«¸PßYZß19ñ_#ñDùÑæ ‰¢§¨9þ¾hß~åTÍ¸^ƒ\iþÒΜÁ\ö\…,fÛ܎l¤{¦{UsH-˜Ž˜à­`v^„©µq°v]ß ¶äŽèÝÉõ'ˆÁ>WABWëmnEŽ«w‹‰­52ú¾KqC¿?. ;ÔdÝê«“üV‡äWÈÉÉ3†ÞŸý“²F\Vñ®Ôš½²•µÿF¥sϜs7éG·Ãé5?ւ›,Ž[>‘Cíqò4»6áR¨z)MÅýKùbt€) 55h:è²òUǝ8F¸a]jøÕ{7Ête¬²!s=ný¬ç©׎ùÕÐ Z8öÄw‰ÃµŠ¦Êt/€Á˜þ æàç1 +1¯ž;íW…¯7X6Ú®øuæäc“l?¯¯úîQìÓߋ rÁ3¨Ï==ê6;;³…:>;Þ´81ØîM&gìÚå7Q:Í16U[Ðo.$l“_!¿R;»h­ˆjýîŸuÞ¸õYc™T«îѪ‘Í3î9¿A!$RFÕUwŸ3›¦æ\÷©½ÈÇãŔꃸÂöŸ…@¯g'Þ«Ê¡~X7TœYqæ”û˜4´Ðl¨ Õ´¾q„[Ø¢_9”H]·ÿ´Æ³y›{“~ ÕÎL0Q¤´&‘Kð-ŚƒÇÚñv™»¸ƒz2é›$°ñàm Žx^3 ìN¬bá(/g?@\1û‚Påî˜7 L¬ø¡!¤ïñ*Qí<~©½¡9#ËîvŽÆÝq÷E+§2›ð8ªýa5dR˜ÇÖiW¼ƒv„-P•ð¥IÝ;Ú/< æôF˜™îA#.¥|:÷Uc倞@óÎ-"—˜åǽœ^¿$z¢é§4Ø8åAŠš,:XÑAàÍæÝI[¹ðú¦.N±"CºØÈ©F™%±’ÿȀHÛÜsBvG<¾G¶¶ÀaT-³'E)É8ó‹zKŸ_i,‰cý›˜ìvx1_vÓ|œØd.„Œ²Í·™z[˜%•ÄžÌg–ý7mC{Ob"§Mh)òcÆ‘=£ˆ‰Õé }g‡éI¥ÀvcÁ¸|˜}6„㯟út¯)±³R©ÐèdóGW0oê]îv JRJAbš +N[ªï6„êc˜§¢èßGm•ûÏÊç@lÚÀ„î ɝ"cúkVR ð_›r dJåÜÚóé=Ç(äémâ@¼2Óü¶† ËÈYW–ÌË.íln5vÂ-‚Sq«±±=ƒðÖ·Å=€[~¡Uõz‘H;H.)Äe…’9#C*vâsdÁÊÞô_ jù``–ïÃ\àiÄ,;V¢u^:Å·îqyR˙Ξ2r]‘™ïÍYuòÕÞcº¢aLy?P“³H Åe"c:–Ýö3ŸK¼^;-™B÷ãi:¬`Iyãv›õJÉbm.Z·¹©g{¬7ғ8TOì©‹ƒLh+“—¹Æ¬¹è=“íýى …ì®OË-t³ïÐ +RPU44󫻟»Ös@ ŸšO‹ºðvy#bSèà|Ôbfµsr*òF폶6ezՋ!–ù  +¦«G=›aÛ>M9^9³hVê÷©ÚBRÜk«ŒMi²bÂ;4uØ.ã‡ØðÏJãoQ)+—B«0ÔhÉØ©aýv3pðÛYv.x^@öõ8k¡Uy^>¥Î#fÕ–9·8I”²þñÆ _Ôpêà³À/G§ÞÏþßæ¿-ÌÒqP?¿E™ó̧òBχ›ÛD73ü,¥{͘ѷۃ®!¯¶ðA5E÷S#ó‹~¤¾†•8õؾ¨ÕI:ꉚx¸¹gà^ÚîÅf”¡¾ÝcF½¸z÷ ¸‹U¡ }z<>\:FIK¢f›¹µ*<Ñí}̄B(Á)9U¹÷ªEVŒÛpœû?ŠL )í|8°‹!}΄½²–<}³–Áa÷uoJôòS|·H|ýýÈõ!ՁùՍÁ*~œ ~Žè\˜¥kvºià’2y³›•×Ï #†4Xóý›ÏÍX¨:Ë¢Õ ÿ¯<-…‹UôŸzà(^Â6hc 8Ôû}óijIp¹r…xbÖÑö&6CÁ˜«¹á$“`>þº{kSß#Öè¯I'É剩ñAØÝә®HŸ½ |º?¶iOMJ·~D…, +ĚF°µWÇáÖ àÇ»D í;‡Kqï Ò¡9ÈeJêë-ÑWípªe-ÂudsöçRy~·–vñ„ý¢g­øÆ0„ˆÝ7Å7ió.Ð|/ÖEm%ÿ¨n¸÷ý.QLPmëJ¹†±š?”ÄMŒÜ Q™ì A°ŒÛÖO·S¶LT»…’ÅȜúÛlxc>••Æ¾>EJ\è6+ÂQn®“<ÖÒ-w3"9Qq£÷¢ê—s/òbcșŠAúÁºGb™w¤+/ÈMo;ÊFEBցõúú‰+ä¬û`'œkkîlO¢*à ›æ)˜ ª9¨l⨋a=evÖꋟF3CļZîW g§‘y£ÒôØD&™½÷àŠä• Û}~҈C«æùÑ˱m$¾æSÇj8ô¸“ÝG¹ñã 7äO 3R.U~ðgèý0Õä¶Á{è’6niZ+J[]u$3;¢#º`aÇ À¶ÃŸçÈëÐóCß+ó<4Bbã’3ãYû·Ãù¢¤Óš[´!Ëێ¤Í¥Ð#î;hîz( d§¤œ­=<@‰+š*æðºœZ Ïs29¿ýˆ"a½õÖ¨½UFpŠwx‘M¾.é'qÊ)¿ÉóX:ÿLiÑ£š¤šPÂe@>Àßò8y֘Ý"#Sûºš)ÓÅ]ÙyÛ+ê¾UÏ°šƒKŽâ{™ºPö9Șz«ß¢Eݗ{–w°”œ)àÛO^0HÐáÍt»,—@è‡Q°ùöb íÕ1¯?w‚ÕÔ ®ô'×åÓzhÇ0À¤múŠN¶™Â?Df?á7`;™>›L«¿uÞØ"GŒ‘ñæ‘Ê°& ì“%*͓»Ó€jb6Ÿœ{‘$NÍ@P±W¨MÝëªåózTOhLÌ%ÑàN¨ANtÊöþ@_È+q{ªC-²áws~qúC3ê¹ã¯ÀU¿ùú‚#ù9Ék…3MÜ ³q¿§Ë¢øÛÒ×¾NÉtô=ù[vçr¹qþ)|¬V#!i›C~ý2Y슭V£±¯é9|0ž'ÊYÍµÓŒ¸~gʘ÷ê.>Úá{z<˜¹¨‰6-Í=÷Ån“$º="Áfåìe šË½ ŽÙ´ç§J­Ô:ܲ U9.+¯`4k(i¤<ŠŸ¡ŸÀœ^hô÷O™"fbHƒ)#Û8èþ¦¨ïM‚bôgZ‡ë0᣿ 8DR–f•Š#¡³†”/¾7¦áïÇ5˪<´tg#B}"Ï8T«úJU§õ?ý» +ƒÚE fí¿Ô­Ø§ >FÈhÇŒç˜r|À´Æ&‘*…¦WE¢™Z,ÅQ]­ÑÂ>ŽZ·€€¹C­ Kš—Xú£…ŒUŽø°¿¬ü’‚®³òèÙÝý¦sR´æÁ‡_àú0r¡n‘Ö)¹ß³©\Dž"]• ¹ÛšÔó­½\ëÌ5«LcOHźm ²œã‰kï_æD{¥Ðó°{[ŽPÛ:6ó¹!6^ߢ¾%û +9Ò ^‡ov2¹²Û¾™jZßúÂx[֕~µ5 +â½âË×v!îÚׁD&Ý8—`ÁÎ,³ÕØ[Lïø*øE (*ñw³ýc)N¤ùØKs\ ӝ~•Ü©©cSü-½ìtš|'qqVÆ,‹Œè)µ•àücÆ&l'°MÙ_¼³Œ –JmÍëD?A^tŽ%Zjã4ûÄDFÃÅùý áæ&ÅÕFMC|’a–#„¬„ûüte²#½´4¯€ž=“â“ð煔T 2«á±ÿ“ëZw9_¾°OºS5û¬ß׉YX†}9Û+JÔÁ´AUÁ»˜#¶k´§›MÕí×I=x+¨oÓ! +c±?S €&émþ!¼Íbž‚Òo‹}Ô}ÏÐÀ 4Ō¾£x–b9“î*è°7gݜL4žw›Q÷5XÅž·Ê‹OKWf>•b ˆ$ˆcÊSñ{^ÝT‹ó„#ÛÀq¯lÅA3NºÏ8 k&q™*óÌjÇŒÇ –n.mOZ•b%†™ã£âGõ†¯Vî°q„EÒsQ,?¯,ŒA{«‡Ÿ—àîsý_~‹Xå”K>ˆA/œ)'Py‰ôöædÎp Óü¾SO°v+ü‰tf[ð÷Æï×^*ùçS{û:sӒU©R³yó‚,«žQ’’ 3çÇ~3È´”&º±Ô~4žd$ÖZÑø _ý­¸¾¡ómSÐ^‰ß§"3tœþ˜¼j,aw1à ølɅ^}˝µF :ÃxàC>$q»fùÍ0gÞ7}•ú”QTÖ§÷|›¬L«ëƒ¡Ã&)¤ˆŒÅ`&"M¦…š8oœ9q•ÍÀS-n‘á'³Á½sÓ0™Ø· o\€8 -›©BZ^VeŠÞÓ}baöÈ^æ— û¶X缸’ÈÁTüãà:Øo¢I…£ÂB8ºPy¾†-žÏÐB[ÁŠ»ßażõ÷{tŒÝ¹Qô(ó›n8R¬á`9E„…~Õ­åϏ#<1dcmF„ËŽSÎNÈ]ª0¸ª…\?ðôQÙNAò±¼¯DÊPŒ¼UnØÌ;\â¥éã,ïEé|X +¨×Ü<ÊudŠN¹ãE.…’ËMseîŒø_yî?ê#Ÿ«¤0u>ƒÏrT(è†îŽ)28MÝ4v±¾NØ +<ýgSÍtB8¾IY`z¿IGs•u¾=·²Ù½fB•÷}õ]ÓÏ£,ðlFõX‚Æ.äa¨oR5txG ÷õ]P0¼Äê†Tµé+JŽ ÅÿÉæ‹ 3":mxÏF›„ÌEÀ½È­È+¶ÑÓvì<~Iaº+v{¶Öa%y¥N`Giª`œÐôý8yÝÀr 0ÃQª[‘sœå¹í͓-A›J¿ÑGv|å÷b ;mMÀLÉÍJ: Š Åð© تkêMë€X +L^®ÖdØĈKÊ8ñ¸¢-‡}ª×*ovv‘]DG÷{ ¤ŠŠ1{ľÑä`…˜Ëxˆ&Òé©•‹dªÚok¬…‹ö¹Ü‘Z*8øÑzÈ[ 6ŸùáÒ‰Œƒ&±‚Z# ;ÍnÉû\,(×(¨ ‰¤ÙEw¸ê´iö€¨eƒj¤0V´ÖDÁqŒkL)s§ Ï'@Õ_»O=Âf&âõ(– U†A!9²Fò[ãÆ×Upè„ò¨û 2â}C։C2ÑT¢r0-‚÷óˆÈÞ#Å ÓÝwGIœƒ¡=ÜEøy3a.Õ'Ï_×úlÎõàåk¹©wè$å)’õ_<–ϺhÉgâ†@G²,•Xk˜Ê®iRºqoÎ5rxj~ +¬øáÙa(—Ð Ó¤¦äÓüBp¹X©BâqòoœŒÒ! 7±%Îõòj&è?Z:äw™Ç‘Féð¿´-rðW&ŽŒP Ô®ã%3cý<ìBqvcŠÔØí²—†}ٛ“[Œù£:‡WžÚàõ¡Ü«|.ïÏi¯tD$@ÿú!)a¼”SÖ +íÆ=y?wu4F‡£<ø>iÇÁÛF£•‚§ú+ÝΝi&›Keqá4™; ôˆs·bÒù¤Z6J@@9åOÂ9=Ü󺐎ÜAxI¥"ZÃæ¹ÇZêm–cdžð5ì ºMŽì Xñš%®‰ñ®4mÔ•æ$<¡0DÈi"’A²¬~‰0[æËÂ4šV‚ÊR¹•¼·=÷‹ù막ô|ÜB°»1óà?5ݔÎÁ Øúº†€ÆO—ä‚߈~Ãýe#¿[¿–®<¨§ã«7:xVPêÀ¨×Ïù:1-Žl&t·î¢6¥ÒÀÓè±yõ´¡¼yût¨]Ë.@_s…C¼$ÁžÊÜÚªN˜ãq~y©*»]­êއ•Ü¥Ø]?æ1÷ýŸãÜz˜õ½œ’ïNf+E©0~Ē±¥ÿ_®Qëe¨EaçÄ)xÑT¹Ÿ L`˜72ÑËÚæÜ踂”»ö"X¢BŸ7¦¨ +r©0ï) +eŠVDðÈaht€h° V÷Â=UE·ô¯eÛ_€­J.épb/&RÆmq¦ç7µVÒV´úéÂqAcʌ”G›{ã½Æ» ½€Sm.Ôû•ø0½9wk¾áœ¶e/$\a•[y¸w¤òØ €ÿ ÓM+Á<¤°^¶#ã;JóŒk¤ŸD™kÍÛvº“&±»âÇé4' Bh?f[’ž1#,Wï(فԵ¤¼a÷ÜCë¹Â…^áû’ŸÔêQ=mA¾c@¸®Gô±¸L¼üa©qTß–w ‡êËÀאتÇsUµw b‚݆‡xX,Ø…½õ¿ÎjŠ,Lç DqäP[GØáawO©ˆ6Íy¿°ÒÃÂc“¢±IÖä£ÆeÁ´9lM”$„zòÜR½­A 1 3ƒ>Íõ9ÚÕåô2þYfüÒ¯-Hƒ2чo±™ ~Ä].r¤¤³¦ ÕÚîHúXÿãz…,Ý F7jà±#ZV¦Ql”ø´¶†'äA¾þÔ3û¤êÿ®2ÃEØãÜA¤€ÒßÊÚ[®‹„ZuR”ŒŠwG<„ñ_+p$›,Š†wìo±@„1A¶A„V,šÂê‚ñƒQ½¨µºƒD-GòK"OeJ•«·´Œ~Ë""ªÈg”ŒýY#¨žŸOÂêÃ|cÍ:FUU@éüO“†/ì?U‡n.þÁíËàxäð@*Œ|Žw<ønJÇ‚Õ¶0àÒ ,ISž#ï²ô_ïRd¾Ža’æŠnNۉ?|’f…UdÉ+XE ÀìÄ 4ÇÞò—ˆRʪ¨ìL +Uk蛝û#VÄ,T÷(G;,Ñ/ܲ'Âÿ[2WP,ËòÆãêA± ü·•ÐÀïÓeªÑ°!ÙÔèÿáæÊ‚(.MÆÔ3¨Ü‘Âíððñ{;%ÔG{Ñ t‚Q["… ¾ùƒ/zÛVǒ¶œ£ÏoOVÁä=Ìv÷MMýOçRÞÄ_cáoÁù'¾ (3‡ôZEgš` ­kŠ¸æm‘®ÛÚ$vÅÅeš&é›eT¼š¿Ž”+ûÄéؐ¾lëµ< ‘}'Մdà,÷ZÃÒI3l»y^›jaËà ¼Ý¨öI‹^ò +Ä[x@ÀH$Ž› $Ë´GBË×[üQD—v^:G/s`ȍ<+:yQH Í¼kq4¼rKåLj´Ã Cu?ò…@…j⒝Oðԓ¯ËfFýÅn0uüÛð0áZÑÒj›¾Ráø¬‘C<¦/î:‚&vM5©üüùô‹r®1E8âöͲ{¾«¹"3ßVɔÇíŒÁŽäwôdÏ!¤™x£¡[ÈÌp͜ý iëÀ­â%•åÒ¼ü.B÷LÛñ°ù‚“ï)Íê>R«®}|Ì'M8×9!ó¨Á(XÆÇ¡T/€ês’0{Á=°zÁ4ëÇÛµ¾i2Ë/7a¥qwԘgê`±áeeR(?!îÅjf.¤¥0´*ª±X/¨Â'ô’ܹ8µmžDƒÉ¶5>ÇÁòžF~V³Ù‰IÓö[ &Îwª7\nǃ-P+£ÅC×Ý{£9²¸åÁ¨¶¥ Zó>4N¢ Óq{#ÐÁþ`º2¾tf:8ïÄH“mˌ¶O­á )‚‚Oñk‰¥lP3êœ+.H½S%"£]œ«¦q ÿd7MK +t¸’­¶ß×±…¨cÇ(Ç,ÍO_¾št©SÐYnû}fL¶&Ïã«ènÊɁŒ™”.Nˆ|½Ûà:Ñ*™ªR¡n0©ëY×ÎìµíÂQÿãìøҖ³b?. eh{L<áìä?Û4CìVsMœ`i¾û:nfI »Ø5 ŒŒ«ŠÚÐö’àޕÎc½c¸tìÌsEí]$º“‹ý+Ðczáð@ ¨Ìpq‡rÉ$ ,ËÀ”q„§Î +?S–¥S˜$îSþ0ªƒqÉ5Aº¶HmH$)™Ô+–¥r®ýq´(I`aL'UÛ[z«ñ~©â²<” +L“&ó®yK%¹çŽ®Kl-ÉWQ·••8žFö=gê*Ëh½"b~QѤ€µR;&AÁ,‹gƒnÿ3cŒurŽ:ìå`Øâ.ƒ|2˜a »7ÙÏáš,âŒrò +CÅ+¤PÉOŸ³”R;ÀŸ¾˜W2ˆ×/×¥ÇēÕfæ!Z=UöéATGy]i.·NFz¨ä‘2‹â•Ý~ójŒhK’#çh°‡ÆÌ°ƒòDš5œp%PҊ +“€·‹ ¯¸Š15®Òº³"àÆõ–TÏX*º•S¦Ð’‰«A9ßR>Î!Iuö%—QÇN3ç|`Æy`ý»à°S7ÊíÔ£Vz˄—I;œzäš6ö¤‹Ì$´NUàD¶ †hJddþ9M’Ób|Í»´ì™ú ø,&ãÊ&ÆΈ®¸ŠÚ²«¢Z ÅÐۋ˜Æxí OłçöZ¡^€tµZòJÚ!é¢0áNÿÍÉ¥€‡™ú³Žx7ìVû×Ä® psÂËÀ{ÜÃhòIædâÑ}ÿ®pÒ:'~(pº 7~ÌÄ|A«Í˜Ro€<“2ƒ•G@²:Ö Ñ¦ügêU­&ë¸ +AÅ*²©‘ãƒÑž´B®¨¨òñ´÷Ž { ÁÍaZ/]0ü¿7I2Y² eù ”f·ú•W•6çk´Îmƒ¬9r!ÜïÉŒî6pÅÖNG¸}¿û6á©ח yĄöþ[KµàÅ7$†_äÖùcó.WÃLÛ¸¥Œû +×ûs/¥ Ü+1›¸¢µ:·$¹+ 5<’ØOÍ_6=yÔ*RNÞ5¢<=Rd +>áñÄg´…g#§×U ‹È ‡Ï=Y¨Åùè5³4¸#PU›ELÛjì jTÌIJýY²ÐºyMË8i›2毺Žµ¿LTíÛ¹»QºíÒñl\MÝMÑj¤ Œ «ª™Ÿ–º–sW_×+1×+ï§Uªà¯J©ÊÊ(ÉÖª• Ltë²t 7ߊy–uGÄ]mh»Èf øמ€d¸G#Åè÷y³IûhžäÎ']{Ÿäñð&¾*{6Tœ}…IKT#|%M±Ñó-MrÃÚeSY’Š + p&Ž—äHWbéŒx„ݝ%ðº4ꅛG-u%Mt>ñ¹vY…nù¹–¥üý6¼gêÅŽÝIj [Ð=®; +2ªOr—ôŽÒKÉ +@Žï0è]n­zÒÁëGIò$2ùZµBuþßJxxVÆ !Œ)§{û¥ Á¤è\ð`áÏHŠœ#½g!xà½fÌâ0"žß7y°·ªx t3è$ó'Ó!^¯‚d[~$ÏÖ©DFu•ØÝ^*2KÏjƒžXPo=õ"@Œúä—Ì.ÉÎ÷E”̵Ü(ˆ\»zõž:oVjoÉ ZÔŽÁaÀýâ§]”{¯ù=ó¼¥²#ø6bCB¸)`®–€ŸB¦P¡˜†Æ6ô,ãÅ»«Ì0-z±¯oÜIï"éÆÊoy.LNžÙ¬òêœ ËD¡tMÆ8ÒcžaðÂ5pÚ刳Âx*æüíÐÃ[Ô֛£u?òs- —·ö£:ãNÊɈÌkôB +ˆ×NEÓg­ýⴜÕìÛôz˜D”!?s<ݸjP–[bÇÖÙV…H˜ªñ&b½Z„™€ÑetÒ¼{­žqÊ Zxø܅ ‚H‡Ç^-¢²‰A©ðA/ ˆ9PS ¯€šn¥ØÜn„ƒØÿWŽCÓ*ÂnÙb°Ï«ü—·1"r– ÷÷˙Erããºo'}Çô'êâT—•ÛP¦½ùfk‘ÂrÅ_oˆhØJ_ Ãë¸s¶Å)¥Þµ¿y¿™0î¸(–‰­Öç!/Æל§HÛ»’]ÕZj8Âv¸GàᐈԲÈÍLìÛ¿þ΃Ö}’hՍìmg»¦"þS™Òl•iÛHÆIc¡¸,¢Z Fy¸1n}â#ôY¢.™šÄZøÔÀsƒãšßÖ H© ®w{«á^´Ø¢h#~UXE$ßjᮃãâšt¿`Þ_š¯}\ õUžÄë08›V¨è9:A8ø‰-B_N+W0ß'Vh¶^–ì ]çn}¸f¢ÛVÍÏØâýö‹n¶µ·nx·‚£ÓĀ¿¼p•>0Ó?iÙƒ^Ž“'˜³VŒˇB›ü0aùÌ*³ÿ#\¨ðê?x¨:·Œið*OìÐz{w|S‹™·Ï;—îA¢+ˆòZÚPS鎾&Ê2ÚVˆex&dm9Ϝ¼, 3 û‚t“w²Þ¤(¤€t+N=x[€³×LûkeV‘ªóNåVëã“ÖI¡ Ó°õÄ1<¾îD¸ZßcyáÚH‰±‡Ë-f1Ÿ ) â–HgJ·ó|a_÷ˆIÆ»ýñ"•/xxµ Sƒg í+‚Qº#©DÉ2ž‰ÑÜG–ë[Í׿ؕTŸ“RÀÎ*1)ÓwãË]ÝÍ>š,+°?ä5¡âÔ§ ¸Ù Ú.óÝízÿ‚6üA êDŽ`¶S¯|0$§9d˨’aÑ>6ØdPƒõ¡€Ò Ž%?q{­|'ÒÁ£2A¾R·ÂFŸz=c‡¾&! >oZìú`v8t£µ‚5·£;úÄÃ9‘yó3¦³ +»5›Ä ¦ÃÅۇà*6+ܘ1qæ'˜ôC-Mˆ:E£Øz‹«/¸ÌÑØDñ\‹qFÞª°G!缒O&SõUþí`›¿ÿ¦XÃØ= É |—º}¦Ò°’ÖçŸ)ȶ鿦|1*ŽÈùÁ¦Í¤Ý¾:ŋ#ʤ +x¼î À6Å°-ðŽN²ˆ}¾¹ÚbA+÷f$š}RS‹û<Ù¾q}¤qvgîãÌ 8n D°X'ôÊ?!³Ò´â4`’ÜLŠ;1\é*ˆ•Ü·Œ1H4vÓ,ðJ^Uã v\ÃÊ9Š<Õ@ô#9ú–ú3g1Zè,Ï£$. ðH-ÞàØ£ ´:³%ÖXܚOćíàu×zá‹Ð¥¤0z¬ç F$õܸ +ûÐ9­ #ü,sîm*éӆÍ“u4!Ìq ÆI13bõøZçßâ?r[8¨U<¦2uæ{Pu9ÅÔÄÆæhdí1ûëÓ<}9ÇqäKMÞ<¯ddpj* +§‰•«¥Ø ”¡×¦—õÁÌ#ê[à >´Rm4ÌÃÜAË)¶|!rëYœ¿@®{CDf²áRfžŸœû¢ÿ¥³–ûj"L  h~#…t´©îÃ)c®^¾CÝ4*!þŠxfFýkr4¶c8@š/«»†›!2£B÷ +endstream +endobj +12254 0 obj << +/Type /FontDescriptor +/FontName /LVYLSR+NimbusRomNo9L-Regu +/Flags 4 +/FontBBox [-168 -281 1000 924] +/Ascent 678 +/CapHeight 651 +/Descent -216 +/ItalicAngle 0 +/StemV 85 +/XHeight 450 +/CharSet (/A/B/C/D/E/Eacute/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/a/aacute/adieresis/agrave/ampersand/at/b/braceleft/braceright/bracketleft/bracketright/bullet/c/colon/comma/copyright/d/e/eacute/egrave/eight/emdash/endash/equal/exclam/f/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/numbersign/o/one/p/parenleft/parenright/percent/period/plus/q/question/quotedbl/quotedblleft/quotedblright/quoteleft/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) +/FontFile 12253 0 R +>> endobj +12255 0 obj << +/Length1 1647 +/Length2 17999 +/Length3 0 +/Length 18864 +/Filter /FlateDecode +>> +stream +xÚ¬¶cx¥m³&³c{Ŷ͎:êØ^q¯Ø¶m[۶ѱmtìÎôó¾³gϱ¿oþÌì÷}ÜWᬪ묪µ(I•TEMm’¶ 'FV&>€‚åcgGeÛ +¶¼rŒÊ@sg'#À_'%¥¸ÐÈÉÒ$aäähM@€•—— nkçî`iná QSÖ ¥§gøOÉ?&c÷ÿÐüõt´4¨þ~¸mlí~AN!þ¯U€@€“`fiˆ+*iÉ(Hh¤ÔR@ÐáoJÎÆ6–&9K ÈH 0³uØüû0±™ZþSš#Ó_,QG€ÀÑhbù× èf´ûGÅ°:ü°ttüû °t˜;œþށ“-ÀdbãlúOåf¶ÿJÈÎÁö¯Å¿º¿`J¶ŽNŽ&–vN€¿Q•$$ÿ§“…‘Ó?±-ÿª¶f-MmMœÿ)é_º¿0µNF– G€ÐÍéŸXÆ@€©¥£‘ûßØÁì,ÿ•†³£%Èü?3`8͍Lm€ŽŽaþbÿs;ÿY'à«ÞÈÎÎÆý_Þ¶ÿ²ú_9X:9m̘XÙþÆ4qúÛÜ„ÀüO¿È€Ìl¬,ÿ–›:Ûý‡Îè割ù§ghÿ&adj ²q˜Í˜lþ†Ðüß±ÌôßGòÅÿ-ÿ·ÐûÿFîåèâÿ×yþ¯Ð’Î66 +F?þ6À¿÷ àï¢1þî€àŸeccäøgáXšü\~XÚ¸ÿŸœÿ«µðßYÿOÌÿªþwQù_†Y9™8ÿ-¶t”´tš*Y:™X̌lþ^Þ¿äj S ƒ%ø—äÝï_'–ÿ¢Sµ°4±ýÃç¿U@é­á/oÿª€Y[ENTF…þÿ°mÿe¬ô·+œTÝ퀀ÿICÞÖôþ³ux2²rñÙ¸Yþãßqäeãðþÿ û/ Öÿ<Ë99XºtX˜XXXßÿñüçIï¿À|™ØšþÓG*NF Ó¿­÷¿ÿ¨Mœþ2þ¯mð·òÿ8ÿk€@7  Â꒭ UZfºS-Nîð¤„N/+äp°]iƒjQ_µmoZØo…á{M0Sã4ߟ6÷Å3»YºÃÑ^lêžàU>¡79m_Ú&U7ýa³~)Rú¹F”çõ‚Ü6”6‹úáîäweý’w¢év¸ë'Z?r—?LŠG;d“ÔúX¬NÔF0ôÚ³sªÄ“§GêÁ±‘á¡žè¾úœXxJ~($ªH?ûamµ +Ï y¹¦Šé_Ük`Äé}i¥/m—`4eú;P¤Û+g…üßäô‰äž‹¸ðäÃàÁê®ê¹*˸5 "‡»y¨Eµœ(ìuÄ܍]¼1*¤œ¯lv*ÅÛ;ë¾oŸÛyj_}ރcÕêroO’ÖQþ¹ôZUZ§[w9‡-\ÜQ ‹“¾OfTçM6%],~„¹:è …€bÝ µï‡¡:Ñs‡GéæŸd™š–/Äább˜†¹[¢˜4 û(ΊóÓ CtP½Öȱ[CÐZ­.A¼„Îð¡~ŒªÊƒ^ĈdŒ§yW5WxË)ŸÜÚÄÄ¿«/ Æïƒß«w#.4õð³ýîqí7‹ ®‰«†ÂYqÓ<Ïås8t©GDsô¥U¡¹WÈöovºhðæ‰aÓеNrQE +–á–%y4ªø;g fßonÕøý1좄«Ì»·¢È€nV>é!0·Ÿ4é÷tØwòì ¾|_ݕ±DÔÛYÑáqúm×äÍäK-‘â'T'<¼™ŽÕº:s¡ÝF¥Ôø¯ +z]9ë‰ã1æ¾è†iD‹ùžÑª(liù¹õu =®r‰èÈ –Y¢½­x0oOø±p¢Úýa #kÆÖan0×°¤^¼4|†m®»î$1# µÚÆß­&ßKp«ÚçՉß×tï8­Å1Û®^¥YY,kKfÞÆB¸ØÁ2â¬z¹+kÓ?‘µnþ$y°–š<­9ƒð>2G„ ×2¼KP(¬D«¿A9„}EìÓ« +n‘FËeÅöFː6ñnÀ9c#÷Éç¯àþ~ª‘€·é0 }®ýºP`۲ۛ³_è̽õg(ⶠEì$ÜPŽÐdöî«d“yԀʉ|kÛ£XåÅ2˜cn²ìâLŸ 3³SÑüÛ-ò×óâÉkK ]gL%F8›ý*þ¶ÍÓ`\8vù¹ï`fÛmnL»Þ‘d”›ÁܒÑ.òC†¼¯Õžg͘¤eмò£Š‚vIX´b%Jôãåæh _Xí›31/Êî4ðxv°Ðp"ofܘˆ§Ô\¹~|Šwh˲¹]›yqLs237é^!eæ'£ Û6úø¦òYx':©íé¾_ÁSãÉÄæꂼr¾ö³Å™$½ó½‹’8ÅK7ûâ`Ê2+‚Ÿ‹LÐ Ÿ­ãÂ|‡”ÕyFûôœñUK ÷g€ˆډAgGq=:oX Ó®²ìPՏXQC]2áÇô´Ûc÷îEôÖ™–ß8ϙKOÉyGuю•sª{ +ŽUC_ñ›òȒ &~|èéi;Eq"¬/fsÌÙK’k©}vãHI_z*íÓ½\†ðl ÊóQ©ˆ|eo°db!¡uE¦ö¿Ã.³…]‹àg’H§jë˚\IÈ³E2–"ò¬‚sÀ’„Ú<ϧ¸‹àëü1“aô óĖYôÜíÍ^%6L“; k5yÔß¹†~¢=ÑdF†ÎÙ ÊA NøèZTAVùº´œ~毶­Åh­½²m`|Š¨± G®›Ø½)Wpô‹TfqÇiÔ© >÷æà1iŽ|ë/ +pPyb üÝ°-¦$·$ Ã×<ÇÕpY4Ç-¥?ðžÕ›¥È å¼9H!µÜoá—Ø¿·Ìë@ _5ù² 0E{Œ€Kå¦ä¿IÍ#D   ‚m$âÓf%FÛÆ9OãÐ-Gó6“D¿x~ðÛ–Ñ E6ëm»œ7{þÀG¬ÇÛê´p)}ûPvì„2ô´O­ð¨ò`uD†ü8=ߢ‘­¼Ð/¨V$kÙ?A¸`º¨ˆ%åweŠ\\ý­<žOYôÙç—jÈ-pÉÇ:J1”¦šv¥³Q±¦; 1JAҘ¨^/(ð-§<5ïÙ$ºX™ X¥DøE’z²5¹Ö#ñc$’’½›ûiO"/@BAב³NO¹‚èÜJˆàÉ6nXÊ3­9úbg˜7àáb™í8¸ ÛÚvVs.ηo(˜“Ü{ôÍà_0Žº©¯}OÕ?Óø×À:-àzЈ˜Ñê€8ÍjhÑ]ÃYDðë7Ò=Yˆ” ˜l¾6áeíWՌ±G +ŒÖ‚º ¬{8†—Ê3ô|ô]ZÜ÷ÃDV»:à‰7FóæÒ~¥.©‹ñÐ$Œ>ùdYT‡5X¨çílÈn“Xnlå|‘úžø¼%ù‚îˆ&¦¶2¨íƒcÀY¾¡w{µ§†æ=1„ªÿ" -¯ï•Ä]@þò1WÏW¦ÍÆfNusªƒÔþåÛBIòrMcþ›rÖÅ·58W‹ ‰²ÄR¾ìx(a¹ÙÞ±Úgšõ`fǪ­Ýð,S;ÉBÏjø]®ü7@¸ÅÊôÝþ•¤”NÙnʱÓs¼9åÀG ´¼fç7sO#by­KNÓ۞O©îñ"˜t@®>ÎvM˜Î÷º1ŠzH×B¨œn< 1o.Ο»?xø³ßO±¨iú0©¥c5§±!I–¿<ƒG(s”Uâõ̽\iòž=v³«w‹;âAÞ jx§ ži­²Ó•–D/^ù˔ý¡š2”¼x +8r»Y\³;*7(­]Õb÷üLfîâî%PH)‘£É€0éùm+Ív‡˜9 áú;ìÕ +Ó³õÕd~ŽÇStÝÐÝæT!& +I'ÕdΖö›YuÕÔòLÀ÷”åX²Ï‚?_¨Màb~’æy“‹¡‰œ«-zêõf%1e€ÅüÊ°í99öā׃„DqW®ß6D ËÃÜ£ÿ¹EÈnj¯VÀ Y +[½û´bŠ/å B¢¦1Ö¦pA~¢ûc1ÖÀÊõÏœéV»Ý%*¬¹_Ó»_§â{ÜØ4î&<åÇR/¿ðÆíB?¤PُÿÁÞm$çín†'¸Ñ½ôÿέîÿ¸´—&Åk[¹ÑgÒ¨©µ›ôª!7$B0SÌ\=[üLŒN)y§¦a OO¿†ÿݝVpÇR™—ÑÌ]+ý[Fµ¢Ã€Ïý‰l«’øÇï#2†–× + X¸cxìâ×XÌߧ’^,:Èe͕'a¾Ä` ÉçŒàX¶Dqöu‡„ 3!rœ¼ç¯Ԓy„·±¾Ý_>³t«›ÚñošË愭x,ŸŽçþ`°uüŠ&8Fé;øÚ;é°©šµž,3”ô‹Ÿe Ak#ÃdØ_Ä®DFïHã5^…ö¢>¿ÍwÚÚP=Bf(í˟PAÂçCχIƧ‹qˆí¬lÑeÿý52øPl|&úÖ¡xÎâ‹/8»¨FÎI=’xÕôÂþգK}‹²ÙåƒñTÜqŠühmï…H|Y>|¯¶žÕ«GqTa¤t­ÅÉçs;Ð/«ƒ„¹^ÃT †vZå‹4sPvL¢¹Þ¹A«$Ä} jø%-éžÅz¢èd‡9€ö4ÙºèpðZÑHú§§ÁC#‹`0ϊ×N&.¤f‚cʈíöRs.ÿo«ÈcÌÊjown‰æ4mQƒ^kä>K˜´ŽÒ|\8‰{ê™{¤îs‚Pð˜\ü/9q鰜Šò܃ +ç۔š¯/hC\@‚)J±@^¢£(Kù÷P~ÑќMÂnYE+mY燁y~ã™ã9Ç햂ə ûðö(â)i+UL\ÙB|cðò o[Có1yšX“vX¤…í›®gSUö ðü0½9›fÜ÷„_+—2v˜Rü„©6ë´¿ðÄõFsŸï»è[è&ÏH¾·ÃED´Tƒg’B=xÌ ÜR<ÂW¯½$z +e´”pvó«}À§E³îæ$jTYî©¢›Óyêz[.ó ¢z+ä~ UvGÒÒ`»R˜`¡iϐ'4UÙHHÝ·/lx€*ýÓ>ŸA_ËqÞ`VŒŒLëW¨K&òüGø7>A—“aNØ@ôb;|Ø*nÎñN s֒ |}Ð)*ۅ¶"êw4]|6ç–5d{9µº¼zlüð­‹ï§Á Ú1íÝqÂëßbÚÇÀýÀ¢(v¶†c_ $ßУ òÄp³c׫ô¿ÎN±=“¹r‘&-‡[$Rƒ`‰Ó_;¶¡ãšh°ÉLpeîñ@$ÖçaewÁmLG­ï[¤ÆÃ;=Ÿ@nOÞ—ìï_հˋýÉ¿üýyHç>ɰȧI”Pۖêôl_2 de—ÚW(¥ë~1QJ꒐éïE‡v|ô|?ÚÔ1:ËÏÔç«Ö©¡R +†J “æ„Ö}< ~ýyh¡2W™—”˜eÖÞòöl;YsSuy“ŸN°@∩Ю6˜Ò³«ªixÓUµgëR‚½òþRXW gšž×ÿ -‰¦€O•²B—ÔP-Ï»š[,ð‹Å=¡füՍ˜I¿ýŽÛòH³ ‚ñ8 +ñŠQiœçÇot}\ WèëëÛ(ñ¶û0Ãù;j™È4…OE•öd4SԏNñtëƒÙ¯oµ±¿©ÏƔ³ÅúUXŒi•²vò|*°9f7…˜0â'è~ml£kô.}ߔ²¯¦¡úÍw,äip$Ó:ÊéE‚|AÇú"ÃƖIæÇ)É|°+î¦æ›Oàm,¨zË%²³úýá1{*¶ž½¨Xk:J!¸»£Þ’¤“¯ŒUwí¹9$O/.N˜*C¬üæ¨ð{ñŸÑ›Ê2¬ýJ‰Uo¾ÇŸ{gÀh=çf•ýšý ž{ýŸ[ß+ù‡“Ë6¥ðã.;Û|›k‹!3RRï yù µ;fT ¤ïwÛwPá“à‡öœf É#Õä.sCÓF{ˆÙX¥ê>ÑãDZp+s¨5F>Kš®Ê¤:BúÃç+‚ayš—Wг²9m­t§DÀd…Qe ˆŠ9õŒ§J™Pn)¥ŒO0ڄgDi¤aêݪûXªSœ·If%)« ®°­°ÿ,NÊ;Nª¨&6€à­h¦ëQœ~¿Dl¼‹ý›jp~B?÷ìñTJÁ=Â:û‹Á~¹ÞSÝŇ=Ky¶4‰:ÚØ7ÇHLˆ”—]¤O%"ÒÙú(îzr¤»P)c׶%‰hppØa¥™Ï4ø²_ôeT­»q|Rl¿ùùæ®âb¹ÎØ°ƒQhüèVøì-ã'j×[7_Ñ>t¢(NÉf«–V¦jLãóÇNNó×}„øld;rCÉoQ¹î¤ûø£4¤žtRZìHbçŒEÊ1ýæµ=­ /ɈbößÂ^y÷äKD] )uk㵫p¡µ'pUê-$öÉH Û°WҎ£?RÒ‘Ï%¶ü˜^ôóª5oÌÞr•ëΌgh˜FHä¡Þܟ±ª"¡0)ÌQ•ëu(Ìæ<#‘0(y¿øýZa9º dÝýn`±%ol[õa·%ÑdԃçÆH¼þwÁ]†èuúb&u~w>yøÒh(f€ +±A·I4 +óµx»{ã«V¼¸+d%KäG’ WV‹ðŸé×ï„óWîU†“[“lÊSÔ,>îç â¤æ2j=5^‰Ý¸¹¨ß¾DÝØÝí+xh°è©&Pà?PkÏØ¿ž:9ê­Ü M“)drÈ¢‚\¾NdØ6àúc²&ˆ¬†ÀýâXÿyÎÞ[VI”}jê“"gÞÅ`5Y÷Ë£æ4"»§f 4&ÌôµàƒďÀr‡s@í‡|¾R€û4ˆ1óô¤¢~ä#uø%ÉcÈBm9×i<®FñÍjÕ>üU´àÍÆ\YH×øÀ6iYóx{\(ƒSŽ­Õl znA(ÊÓK”!)ÝHŸÅ J׉ñv‹aú¨} ¡)´ +Êý|©6©N±Ý=h +I ÒTâCŠV%²œw Œþ£QAɯ¢†:%W5Ì…à–Œˆ`íZÚ³§#;³L ïÏ+wX:×3ùêƒO3qŸ˜õˆOƒrQô㋑­¼¸‚GQ+ûE­^G—³ìêjèV‘ŠEhÑV58 ¦G84ü.O‡€ a2L­Çô"sDžÜ/yâ{·ï ìÁ qÅÀÎu½õíóÒ½H!–ØÔu‰šdJêd.‰ûjâ,•¼RZ×jõl×("L+xöøæܕ&kõßu„õv>ËâŸÏcJ¿}H!ŒZ¹†^«ŸßŠFãY)tr^¶ùŸHÐ +†h‰ŒiǀXÃèÝ!¯`/‚—|)èSÜÝ\ÿÜãQ¶ ã“1'¨¿Ws–Yå +U§-ƒÅ b®¶KÕçûâðË‘Ðõüçxð›ÌƒfdzV²Ù#‘Êr°‡Øk0³Ùî”ì•GÚ]Þ6#lãpÙÇUs.qM81¿Ã–"¹Û&úêqÒÍÉùï¤_-ªDÞ ‚¿ ®ñƒÉ´ ÂRü7WD’ÝëÖ ïû&4§ÐÈ꬗`³Õ¤^Æy½¾ýÜ'™vñü 6°õî êÍB´{Ê·]>³(Ó´GR{¤Ù¬XB4–è\©Ý»>ބ¤àڝe2àüSÊ\gî)^’ƒzêçI‘^û í +ޟ*Y£¶Ò3¹ ãN«ªVX€œ&Œ_éG ѵì%÷qAðJ»‰^¨þ™|;‘ícð¯Ý»/$juFŽÑrœZjDEq‚6ŸôT‰ß&(„H”´%gÔT@''F¥ ¶ùÕèt,P֋bIScs~U¥ªzÒMøRõÚZŸ!ÞXØ({Ì ¼[ë8!4 +©t…·ÖÉí~P‰¥×II»°äÚ__ή-´ñ9G”âïæÐ͌!ÏóÁæbªVÓÑ߯A÷õAύU`õb õè¾UNaHÛI£¾-¿¬ˆŠO`æ­à†s"Ց© ÎÁ'DQMoâÚ¨ûr\»•èï^ív•ÓÁ„°k²E¥EAk9ÛÅc¬ -‘¨_þÀe‰„óùëÖLÀWTkûK] áü:^tçâl0HîßUCg›èÀLn;'WùÐ w O¢ מÒƌsqLò“ÓSd Išî/»”¤Ãµ%¨ ÖbòåiTÄÊñ+9þünÑÅr6µÒz*Nž¼‰ÌZ¦¼'>òôÇq%»ùݨ>R¨[H’k︟ޕÖ4ÚrµÐ.ánj»Ë‹®(𺮠Ó*‡PÃ=•ô×\&7ýœH¦îh™V»U‹AE¦k’hÃ÷z¼cYÖ]]ßLu€OdÑ]D(qYÚ!6lta5çwÁ¢UuL„<ß,õ-ˆ5ê$‚Þ Â6L™:Ö¶ôøêÙf³:‹ÓX«~YÑcN§ ó竺cvt72ƒÅËÈõ8Nî ¼ëtՌn™Æ<Ÿ81çøÌ¢J[Òã%G§ó;¢½’¤™ qv͓7³Ó¹±Ö’ƒìõh,¸V™¥™Â…Aø°UÕoEnêô<Ï°?Sޙ.E'ž +ÂÁNgš¥´ŒÕ-Zcð¡½t@+»Ü[q …Óí+Ž¹Þµ6°ªþœí@éà e<¯¿Û·™“0ù 7§®@ȵù[ZÌ(„(Á23Qw™4»õ6YZÉ÷ô|ÁuHäø:|Š­ëZ=brà­æ9h=‰È|~Dž¾Ãɼ©†º‚Ú–ø|!YdØ*}µŸ/=ê;ZˆL&™nh*÷„ÜTJ$0„ÄDnгˆššZdߋTØgÆðÍÿ;Š©è…!ÖFÐÔàœ*”x¾+…Tö¾›V>×.XK M‰ ‡EƒýŸr9 +˜ 8h]c>_éžÑà Þ:!ôØùTÑÇ·¨Ò«æ'o+NQæ¥s¦õ­³ÊûdG–QØÊV€F$¶TX÷CîRÝ_‘PººZqÖë–q~E½<ß5Í'¡Øq{0¤ ¥¼÷‡‹jÂϒëéÅ.;IÔ~—èޛZLº³à²B$²Q[q¾…Ùþv$ Ã÷Ìh§þAùšƒ$Æ©fõÒ÷œA´¯kË.جêåíg$Â=gµ•£·èëe3Á1ù9b»pÍ°ÿKϏ…O<Ø(]ƒ•k/µjw¾‰ŒÁ‰˜€ÒEòãL‡óÀUÓöô=åbɜ’½²­xmÁõ‹8žHA˜lH†¾ÞœÛOìj¾ K³(¹Y®Ñ5oÂ~üX«KëðWq Éû†ED¤Fcq Æò•êÙð×ßòöÖ·M¦ug¸5%1»þ0‰Òt¦Ž­†ÓôPúãҊLÓ­vÔë÷ÆWÙœ<Žô‡÷Šk¬Äù'³.ÐiG÷¦}+GM̙÷T‰¯‰í›ùn +cÕäœyËùý5C*~f©ÿ÷v7ÄRðþjli$×®kMÞ-°Âµ_þº­Ù{&”ÈNÑPµfcMËQ²v²Ë6è­D_ÄïqZ ˆº9Ø*óîî}‘¾cnÁ¾é]aÚ2:°T Æör붚.9fmƒ–ï#¹“p“Ur²d}¯ä«<rOm>Äö¢H,~6%_~°¹0Ø]G2•¢i ¥h¡Â‘ž'yŒ>–îL¿>:.Î{jx¸³ Š8~~ºçÖU80‡¥ÂÇ?F?³7-iÈAÇ!»qÀ áHè¡Œ`ð߃)_’íÐjUU¡ÀǨå]#Äà»Hi#|—I˜,7Ä¥˜Ò6…ˆ*“þƒŽw˜‡õÜcÛϹ”Å€ëæSÒ4CB‡`¢|f§áh³ K˜ ê92®¸pAþºŽ†;Æ䮃ù3Ñ¥Å(›2»ºßÂO!8ß¹NælâN(æ·ÒÂru”@\ž mñfFø«Oº¨¬œK‚ Àʘd AÝX¹Ç¿ÂÿóídŒöY™þ'ºœ×6_ÐÌV¢â6S‹ÉêÇaËE"42_ 꾃,¡u¶±nyÂè"¢WnÕÌÉ#! ã…Ó‰¤åmî\o+=Ð2®æLK?‚'\ê‡9 ©•Ûñè—RÒ ¤"oTÄ!|Ž)aƒ,€ +–Ÿº¶¾…‡U8ŸÐ‚– òðÆR¥6:oy è2æ«zTF‹æ¸üÓ`K¤3¹Q1dÍ6ª8º$ëè˜Ê2§ºižèÏb9zü¹Þ æ&͑ ÷eë€6¢ùï?øéˆP6Œ‰[‚gHÉ-áz¹êY·£þ÷!F½Ñb#ü>aÃâ_ÍóýØ_}"K˜< +ïڊT+Ƥ÷g›xÄ üÔ¤›µù–vÔ Í +2+Že_\"¨®é(H`â2Ù¹ÍßsNÙ`@ƒó:.g¿÷Ð¥· 8œ1á‡wùXÅ'†Ìfm'äpº¡ª6«ÔÛ_d×ulaYñà¶ïxì+ÊÒüèbPÔeBÂ%B Dd] /›6„cX~5ý2³¨j¨N*çÐÚÀ€Nˆ7Û¡5HM™£Y@š5ÒHì§ëgå[MŒ$•+u TB°ê7ÖäöJGâÔø¸ÚÜ8/3Bû´èÛWúünÁ“iyTÖpR™Àü©=Âu˜CÊQîVsM§žb† ¨­@èú4ÆRÔW%Qgäãziñi[C€œ³]Àç꣋8íáò§î×é­­/Ó$?ÆÎæ bÊv.ëô ä—/\~@$ªŒØ) Oùâ—£Ž‘ÑúFúé¶Y¥·Ú|UR¥}±m߯Qü1ü4ïm à¾N@k“v•pY±Yö;—à$‹?ļlmk }Ԟ‰«Ò4L×_ê±;\so42ûØ»ÃgCªÇ?J¬ Ä=NìD騄ž4œÚèoø°æ÷ÞQ-Ï|WZÔA”6ò—øúĜÆæ\_¨ö”"¨­FO‘œiº3ä5œÕê›NÿœäçÔ}2ÅnŒºmîÀ$¨O°Pß[Gíu½ñÀA“SIÉÄ\ٛÈ;l8S2Æ"Ë÷a³PGOª³æ…•k££iëk¤³4=Výd±@CjÐ:1nmÏùì'Í« ²ŠË­UŽ®ÌOO[•¤¸žb¼iåНŽ–¯Šh„ ƒ—ß¹ì9ÑÃ}[²»¾KÙ ˜NS¾äç¢C^±š*±A× ²g ì!mçÅJ,ÈATÑüPateL~8C$ݞϓ¶›R8ÿ±—piáWË]‚|ÓÝ®” ¥a© Ì·éÈ×&g²ª6ˆÄjHfõʚ<4†iΨ43­«rŠzR»±˜…q}ó™wmhCwÀƒï _•+۟ Ï{Œü¼øx7H±œö=©7,ëN8-!èKãߕÃß´5‚—ÂYv#'À¶5­Ó[‰Ä‘W¢déU  œ¯bDþy‡žç—5ÃತñÒñÉYÀX~Ûòèš Æ~Y­¦ +¥FþùæøŸvehÍQ!IîgØ {_‹u!`U {ìÌQ}ÈyNNJ͔_¢Ê¬3©µÌÒɏi%AjTbë[· º“FéËÛ/¬¾óÏVokO¯ýýÊŽÙµŒ1T=â†êÊ֘h|ø‚@â×Žª\=´ÛR"JoÕ¾G?º|¾1£n7å]1DZƒ—âbg6Ñꮕ€óÞ Å2V¢Á^å‡ +´ãCT!Ï:H³ZTpï~ä:¸Iã_•ê8S1J¡»±#9‘½bŽ²Ò}¶7ábhûí¢ˆÙÓGiܬ~ïÂö +ÙoÅ În$Ȟ»âùñNV‡¨J]âiíéeÑR ${ŸÃà{–<˵âÇ×ÑC“dŽQLê•n<íØ¡äwËÛ´m b≵)`f–©²Ž°ªW½€©®Ó,ë©á¿À°*F›%|µs|{Ðx`„muþŽíŽt­Ãô±Dš*³ŽOºP¸½ÕrJÚ6>~úV€Ã­%/qsÍkµ^Î 5éÍ© +SJtIE¢7a)'H¬1)f7E͝jŸ¼þ+)$¿³ávg²D”jš¦ùú60¡©rù3C`× ÀN«èÛçs±—£y¼"AÞeG!5×+ÀÔ`F,s=ní²)}÷Õpz±-%|¾G€œ]ä³bF‹êü†(šO_@güp«ž×Ýöà<â¬dL.9ÿüÞa oêVô}‚/o‹Ðó¦3ðú¡:åñ†úüøç ù«»èÌ8Ìæqí(D â[ÁbÛv~L|’YVLÔ¨IZïµ7éX¿ƒtLÀÉ׬8^þÌñ{Ù Yj#„-æöuTHÔB҃¬:ÓHSM}ÅêfFÎ(~‹XLjD¹v/ߟ(EĤ+3æÝ +=æXóíÝ0»‚õÚ…§k%è×Ó¢¯ªò<·à·OwÞ¡¾ñ…&zÏ_ú@Ò’[µ #€„” V‡´îæ*8g¬LÒp•p­˜jÂÛfÐ/ Lf¼ðÿ 4™¾á¡Ð”ʉ”oםÒÈX})HL%çߗ„Q3“ÊÕi霉@옄1èM¿mžPYÈ* rÅ*Û@¬† ûX«ÇÛñ·ó@ … +oçX©@(õ3¿‘¬Rï5µð +O*vt ß“±¢Bš „¡”ç»ÏàJv †_Þ¾(É=|ø4÷AÒê.kfô³ûŒ}{}žÆ‚Ša¯ÀöžW‚1×]OAÆ$56 «ê,šæ]\ŠS9ŠÉёÇc/ˋ.A‡Ž•ƒCɇқ$ìJnª `´Ä–³ÙyZ&­ ðÒÀ]Bü˜Ä.J6jkneN?z€RÅÄDC÷YŸRC{Õ#… ϳ›ׁ-z„~“Ñ IÁÌødÿÐ}†H‹¥`(ó./#Õ…æ“(ï—yµ‚ÞB;\3kîMñ~ž'²wJÅt¹m^DdåÁ‘æ`:FùÀð}4 Þmö4»G¶¾ ©Íõš QzôY›MÂÐò÷–ˆÝ}ë²g}¡c΢Ö7.,ɾºýì'½EÌÛ Ýë»Ú¢àóàνd9sss& ÿ£,xX:ePÈ)^è7]‡›Gº×Ý\HØ£‰OöǏïÔ>ظšüÜÝn°3*! CÉ9œar7Ð#‡ J#˕àê‹=U2m²E‚OGÍe¬)¥Ç¡#±Wð-8·&¥Ú.–öz6L"b¤  ¡,Kq5ÍsJý…Sô‡~×xoæ• ŒS+ªa¥M³éŸ×ÐL†Ew¹NÂÝÈ Fù¦è¡qÄGÒÎcÒ#¹©~6ú” ×Tû×Ο°®¬)ˆÛÙ¼{‚ß!˓QÐý¯¾Fû«:Y+ž"ט«Hxõ!É#c‘1 òj›"à³¾î§3ÇÄx|˜¯…07ð´À±õbºò¾þøäøe;AGÏå²ÊŠÆž)¥Ú6ªþ| ”æw©tYx½œÃ7vóf:ðg·ù¸XœŒZ* {BŽl´/›%3FW´Z)³.P­Ö6ø íٜ°w~0}ƒ,¡AœE†Çȑ¤7[^<˜f!TéM:¯ÍOoFýœÀ'ÒiȜ2;G;¶´9?‚éDŠ2ù¬ðO¶J×ûßíå~5ۗàA(ñ}ÔkÈzÁõXŒ˜ÝƒÇõ +æ˜õËIÏÂË['ž®CXÖXÏxXñØ~D ÚaØwG”Héª#žèTxÛç•«ç „ßm\˜, qé;­ú© Lx™¦r=6ö8Æ]‚i’»4v—ÙK.JêŸÁÕ°M¥•Œ¦0¡3¢Þ8•q€šçq–b +ê|²ÀY—Ý¥³¿9y <ÁDJ`;ú*Tð¾çCØý¨ZfHðÀ=…"M§Z÷s‡-u©Òò»OaêkÓë‚j8€¦ü€Òý’i›z•PÊÙ˱,ïµKSÅk¿Or<ڄ²Í#YJBû?©ÒÇKQy¾#ñ™%´:ŒÄ‰…ÖÂD¬©Üz€èºë´³ÚJ?±=Çñ“g«‡IöiSè56…w¦ûú +ÚJ"]/™8¼G;88|dÇ Ó¾ýüˆ4{ïøçP÷ÓÊ/—õ=Q¦c¾¼&/‘l·ÊËüM´äÊÈ<0Ê_ùÞÔb®ôqvùЯŸÅÔm浖dn9« +¾:Œõ‰‰?0T¼Ÿ µîk3•ÒŸ~©}q´¥‹6òm+¶w óHúŽ¿%£¹ncPîI ƒ””쾺!ðÁ>ü$°`³}ùAsžód‚É3Š|ç +č‘D’wç>søÜ1(w0둪bxKŒD½°Å%²Âe€¾¥î]RæP£ +FôÍzƒU©´c¤ÌƒŒ1m21§ûUM6#wÔCtÕï åwnÌ:¼Àúû§Jé¢Ï­½½ŒXªáߤ‘øºíQ ÐwiNa$~ z`Ç"¼íg¸~Ägç¤#>è?€«‚äu÷NØ ì¼as›Ï|_îbÿ~Ã×Øïì{y j’îÐGå °…ÖÓToïf)ñ$®SÝözs7\æí~þ3.þûRнd¿[¥ãZ&LËê7rÜÞÂTvÃ7D áYì7ÿ„~Ù}jQËe=N‚¬ÓΛGçþÅ~LN(ˆ0íªV]¸ÊÔÑ•N5+þúYO}U¸Jï† ×º5ˆ`î¼îÙ è;`ŸMƒv0m(ƒ}´AÒabÐè°"gØ!ÂĀè°ƌj¼š±ÖgÕÐ¥/§öt9u +wi-•Ú¬v.{>‰ª{þ\†Ô†Å xòXP ì2{^”¼¼1 }éÂÏoz/épàηø¦Y÷ Æ{”/AÜÇ©¸ñd¬gu§mÃU?«#*â·?¡2}OyëÄL_·+¾›=%Ö Æ¥‰"_Ìi´ ±ù‹bu!lzc·Øæ,R¦!>Š©: *NþåÀ­A[|R„$¥˜#¼ôE/«Ð¥‚1ŽÇ€½•í‰&˜Ý8\ñTerw º•oš#½'ûàYƒÒ¤³æ¯J>nÔÛ@:ï|‰6´* +âH&3"‚ždMÜ-“r´Õ3}â­S¸JHQP9–NƒUe¦?]oœ¹(r×÷`։­y F{­îDØì!£´^b¨VȨ¨š¤¿’¾e}…úÓ~¥c ;vI4j¤%ìvæjÐ:zŜoomˆU™ÍÔª1ÜFöžÌZ¡1€Óâ¿^ +lBšœÿCÑ[ʜƒ.ÐFÔN#7Ž[šØýjr¡JÔ€HØ\›ÙYxâUé&‹N²uÈÓûe§€•÷˜ïî‚èÅ7ƒð˜oèÃ-©]+†“ jØ/X”ÁϖÖ©£ôsÀŽ a\½>0ƒCê[ î<üS(ó`ôzî2“®mm]T¼ß)%äì3sSâ‘À,·¡mkçÝ9þRtþî³²Dy?{P$yâ±¥YÎ÷ŸÉŽdÖ(`tc/ñ»½{K9F飶›IuËÆ(¹#81ioä u©Za(°k•ºìUD‰Ð´9—YkÉT¨”Ã险4 /êv[håžÑ ˕I +onuÖ½Ý>›b»uw½)ҏìò1ÛÊÌܚRE2ÜBq.?) +Ö¬¶`Žfð%ÎdìÉº£ÝŸ¯¶â–ÎJvHm¬Á<¥ +ŒÒ0?§²Y«6_•Ÿß¢Æ$ +ó¥ë¤Ý¶lHF$éæ­2\78ž,m…C5à}Ù78Rälª5ñî¶í¡=œyÛ¬æ\‘}h +oTzñEa®:çS• ] £KœÜ<äuNOã»Ñ6ۊ„ð°›´a™q»ôoB­Wœàg¯ˆ³«ß/|ÆÔ­mE +ˆ#ßkÞß8×U»7ik‡ñ(Δ±1ýÐvÇ9©êÉ×5©êÔƐN6 €U,é“óÇfÉôGm lRsf'/öš‰A{\ë2É=/°‚Á!¿lÒ %yZ`6rÉ9:ƒöέ3$Äÿ)ցÅÕ\5ucßæƒýÑv8ÈÀ¬¬Y#? +ÿSq®ç8¿¨q‚@gG/‹ÖëzA`ǧ‰hzÑ +Ì«± ²IùDŒ÷Ú:Q±c5æT"4:j¥¤ì•sUëÖÿGÐjÖýÂuTœÜºq›-Þ©$¸zFÁ ¸ÃZÀüøKH‡¾Ò2¶{ɟ!¹gAœH^T#Í­z«±BÂØ ?ŽîpCÕëQm‚Fý¸Z3yyg1£+œûg$•Ûð[gNÆà#õ?x½¬ó••ÎzÅq…M6úøyÝÕJëÀ¢ä*ªê‘÷YyÖ^•Cè}ÎÓb¿R·)PWÕ.¸óÞD`­ò“% ێà‚y=%"&ì­{ªÔËœŽ*ºèdx1 Of{ 4Ô;š$õUbm.5ËÔÍ*i´ ÑÑ(#’´ì!±[-S&Q¤^ ÙÖµ©îzh’© –y4W=1bÙ?xï{9}XâÆ!ŠGÏÈ¡Èc à¹/”+'ìã>Z7…ì–$ZE^|P_8Ýd1c/Ñ6w)sùŒðƒ9𧠹KÍG*åÿO›üÑ⊸ˬ–r~•*‘iÞͺ )ø~÷OLې˜G€âãM5Úl‘€röå|?ˆãÐ=ò=˜*ÌÝáÕÚ8Ôc2ûKa¶Úº_ØÊ×8[ºxé\³‚{ÀÜà퀽t„Êi£­Z¼ ÌbàZyS"¼Ú‚¶0^ïçS•ýÐ[eÍ +¸,ý½-¢ŒÆ¯@ÒMÕq©®ÎòÁÏy;ë.>Ì×ÀÒ{ýfÝZÏKѯ›Ð(òºÛ±[ÆÙC%äDôbWˆ†-cÒX(•°óªqÏJÃéîðÑm 4ËIž4[®rѧóLß‚ÓâodJv#ìñ’Ä:@OÇgþi«a\?†úösçÀt11ïù$HU©7š&ÖÒÒ°–T‚㏔IY•xë<Õ_ÃëL4Kã6AÐå\æ9'Šª2áÜÎðô^æ>ÀšÚ7›o$8 +endstream +endobj +12256 0 obj << +/Type /FontDescriptor +/FontName /ZSLAIS+NimbusRomNo9L-ReguItal +/Flags 4 +/FontBBox [-169 -270 1010 924] +/Ascent 669 +/CapHeight 669 +/Descent -193 +/ItalicAngle -15 +/StemV 78 +/XHeight 441 +/CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/Y/Z/a/agrave/ampersand/b/bracketleft/bracketright/c/colon/comma/d/e/eacute/eight/equal/f/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/period/plus/q/quotedbl/quotedblleft/quotedblright/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) +/FontFile 12255 0 R +>> endobj +12169 0 obj << +/Type /Encoding +/Differences [2/fi/fl 33/exclam/quotedbl/numbersign 37/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/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/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/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/braceleft/bar/braceright 147/quotedblleft/quotedblright/bullet/endash/emdash 169/copyright 201/Eacute 224/agrave/aacute 228/adieresis 232/egrave/eacute] +>> endobj +541 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /LDBHLR+CMBX10 +/FontDescriptor 12194 0 R +/FirstChar 48 +/LastChar 49 +/Widths 12177 0 R +>> endobj +542 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /XBGHAK+CMEX10 +/FontDescriptor 12196 0 R +/FirstChar 0 +/LastChar 111 +/Widths 12176 0 R +>> endobj +418 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /PCFYFO+CMMI10 +/FontDescriptor 12198 0 R +/FirstChar 13 +/LastChar 125 +/Widths 12186 0 R +>> endobj +2111 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /ZGGNQH+CMMI12 +/FontDescriptor 12200 0 R +/FirstChar 60 +/LastChar 62 +/Widths 12167 0 R +>> endobj +568 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /WNXLJT+CMMI5 +/FontDescriptor 12202 0 R +/FirstChar 68 +/LastChar 110 +/Widths 12175 0 R +>> endobj +7255 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /OMWOOP+CMMI6 +/FontDescriptor 12204 0 R +/FirstChar 100 +/LastChar 117 +/Widths 12160 0 R +>> endobj +473 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /VFEGCR+CMMI7 +/FontDescriptor 12206 0 R +/FirstChar 26 +/LastChar 117 +/Widths 12183 0 R +>> endobj +2018 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /ZRLUIR+CMMI8 +/FontDescriptor 12208 0 R +/FirstChar 60 +/LastChar 62 +/Widths 12168 0 R +>> endobj +2120 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /XZSFAY+CMMI9 +/FontDescriptor 12210 0 R +/FirstChar 46 +/LastChar 110 +/Widths 12165 0 R +>> endobj +539 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /WLMXSH+CMMIB10 +/FontDescriptor 12212 0 R +/FirstChar 97 +/LastChar 120 +/Widths 12179 0 R +>> endobj +762 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /UQOYSR+CMMIB7 +/FontDescriptor 12214 0 R +/FirstChar 112 +/LastChar 112 +/Widths 12172 0 R +>> endobj +504 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /QLYQLD+CMR10 +/FontDescriptor 12216 0 R +/FirstChar 1 +/LastChar 120 +/Widths 12182 0 R +>> endobj +538 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /LYFRJR+CMR5 +/FontDescriptor 12218 0 R +/FirstChar 43 +/LastChar 80 +/Widths 12180 0 R +>> endobj +2406 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /YPFGSD+CMR6 +/FontDescriptor 12220 0 R +/FirstChar 48 +/LastChar 120 +/Widths 12163 0 R +>> endobj +505 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /KKLHYL+CMR7 +/FontDescriptor 12222 0 R +/FirstChar 40 +/LastChar 120 +/Widths 12181 0 R +>> endobj +2175 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /SRQDSN+CMR9 +/FontDescriptor 12224 0 R +/FirstChar 12 +/LastChar 118 +/Widths 12164 0 R +>> endobj +340 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /NXBSDN+CMSY10 +/FontDescriptor 12226 0 R +/FirstChar 0 +/LastChar 114 +/Widths 12191 0 R +>> endobj +622 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /TPJSSH+CMSY5 +/FontDescriptor 12228 0 R +/FirstChar 0 +/LastChar 96 +/Widths 12173 0 R +>> endobj +342 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /JLSCDF+CMSY6 +/FontDescriptor 12230 0 R +/FirstChar 3 +/LastChar 122 +/Widths 12189 0 R +>> endobj +540 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /WSWKRG+CMSY7 +/FontDescriptor 12232 0 R +/FirstChar 0 +/LastChar 94 +/Widths 12178 0 R +>> endobj +341 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /JRVZXP+CMSY8 +/FontDescriptor 12234 0 R +/FirstChar 120 +/LastChar 122 +/Widths 12190 0 R +>> endobj +2117 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /LRFJNF+CMSY9 +/FontDescriptor 12236 0 R +/FirstChar 0 +/LastChar 20 +/Widths 12166 0 R +>> endobj +9167 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /KNYRWO+CMTI10 +/FontDescriptor 12238 0 R +/FirstChar 112 +/LastChar 115 +/Widths 12159 0 R +>> endobj +2750 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /BKKFBC+CMTT10 +/FontDescriptor 12240 0 R +/FirstChar 101 +/LastChar 121 +/Widths 12162 0 R +>> endobj +621 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /NIRNEQ+MSAM10 +/FontDescriptor 12242 0 R +/FirstChar 13 +/LastChar 26 +/Widths 12174 0 R +>> endobj +472 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /NUYYNC+MSBM10 +/FontDescriptor 12244 0 R +/FirstChar 63 +/LastChar 90 +/Widths 12184 0 R +>> endobj +5156 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /NUYYNC+MSBM10 +/FontDescriptor 12244 0 R +/FirstChar 82 +/LastChar 82 +/Widths 12161 0 R +>> endobj +376 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /MZYJFE+NimbusMonL-Regu +/FontDescriptor 12246 0 R +/FirstChar 33 +/LastChar 125 +/Widths 12187 0 R +/Encoding 12169 0 R +>> endobj +1139 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /JOTYEC+NimbusMonL-ReguObli +/FontDescriptor 12248 0 R +/FirstChar 39 +/LastChar 121 +/Widths 12171 0 R +/Encoding 12169 0 R +>> endobj +374 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /MUQVXJ+NimbusRomNo9L-Medi +/FontDescriptor 12250 0 R +/FirstChar 2 +/LastChar 150 +/Widths 12188 0 R +/Encoding 12169 0 R +>> endobj +1788 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /RYALYO+NimbusRomNo9L-MediItal +/FontDescriptor 12252 0 R +/FirstChar 2 +/LastChar 122 +/Widths 12170 0 R +/Encoding 12169 0 R +>> endobj +339 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /LVYLSR+NimbusRomNo9L-Regu +/FontDescriptor 12254 0 R +/FirstChar 2 +/LastChar 233 +/Widths 12192 0 R +/Encoding 12169 0 R +>> endobj +471 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /ZSLAIS+NimbusRomNo9L-ReguItal +/FontDescriptor 12256 0 R +/FirstChar 2 +/LastChar 233 +/Widths 12185 0 R +/Encoding 12169 0 R +>> endobj +343 0 obj << +/Type /Pages +/Count 6 +/Parent 12257 0 R +/Kids [334 0 R 371 0 R 415 0 R 451 0 R 464 0 R 486 0 R] +>> endobj +507 0 obj << +/Type /Pages +/Count 6 +/Parent 12257 0 R +/Kids [501 0 R 510 0 R 520 0 R 532 0 R 552 0 R 565 0 R] +>> endobj +585 0 obj << +/Type /Pages +/Count 6 +/Parent 12257 0 R +/Kids [577 0 R 588 0 R 598 0 R 614 0 R 632 0 R 641 0 R] +>> endobj +662 0 obj << +/Type /Pages +/Count 6 +/Parent 12257 0 R +/Kids [650 0 R 671 0 R 693 0 R 708 0 R 726 0 R 741 0 R] +>> endobj +770 0 obj << +/Type /Pages +/Count 6 +/Parent 12257 0 R +/Kids [757 0 R 775 0 R 790 0 R 805 0 R 816 0 R 831 0 R] +>> endobj +868 0 obj << +/Type /Pages +/Count 6 +/Parent 12257 0 R +/Kids [851 0 R 878 0 R 899 0 R 910 0 R 924 0 R 948 0 R] +>> endobj +984 0 obj << +/Type /Pages +/Count 6 +/Parent 12258 0 R +/Kids [971 0 R 988 0 R 1007 0 R 1028 0 R 1050 0 R 1071 0 R] +>> endobj +1084 0 obj << +/Type /Pages +/Count 6 +/Parent 12258 0 R +/Kids [1078 0 R 1087 0 R 1096 0 R 1102 0 R 1108 0 R 1115 0 R] +>> endobj +1129 0 obj << +/Type /Pages +/Count 6 +/Parent 12258 0 R +/Kids [1122 0 R 1133 0 R 1144 0 R 1150 0 R 1155 0 R 1160 0 R] +>> endobj +1169 0 obj << +/Type /Pages +/Count 6 +/Parent 12258 0 R +/Kids [1166 0 R 1184 0 R 1230 0 R 1290 0 R 1338 0 R 1380 0 R] +>> endobj +1420 0 obj << +/Type /Pages +/Count 6 +/Parent 12258 0 R +/Kids [1417 0 R 1473 0 R 1534 0 R 1573 0 R 1597 0 R 1616 0 R] +>> endobj +1676 0 obj << +/Type /Pages +/Count 6 +/Parent 12258 0 R +/Kids [1661 0 R 1738 0 R 1777 0 R 1791 0 R 1799 0 R 1822 0 R] +>> endobj +1850 0 obj << +/Type /Pages +/Count 6 +/Parent 12259 0 R +/Kids [1847 0 R 1868 0 R 1929 0 R 1955 0 R 2003 0 R 2038 0 R] +>> endobj +2071 0 obj << +/Type /Pages +/Count 6 +/Parent 12259 0 R +/Kids [2061 0 R 2077 0 R 2108 0 R 2167 0 R 2229 0 R 2280 0 R] +>> endobj +2341 0 obj << +/Type /Pages +/Count 6 +/Parent 12259 0 R +/Kids [2338 0 R 2403 0 R 2461 0 R 2520 0 R 2542 0 R 2553 0 R] +>> endobj +2570 0 obj << +/Type /Pages +/Count 6 +/Parent 12259 0 R +/Kids [2562 0 R 2573 0 R 2581 0 R 2591 0 R 2598 0 R 2611 0 R] +>> endobj +2628 0 obj << +/Type /Pages +/Count 6 +/Parent 12259 0 R +/Kids [2622 0 R 2635 0 R 2648 0 R 2658 0 R 2671 0 R 2684 0 R] +>> endobj +2702 0 obj << +/Type /Pages +/Count 6 +/Parent 12259 0 R +/Kids [2697 0 R 2707 0 R 2719 0 R 2733 0 R 2745 0 R 2758 0 R] +>> endobj +2778 0 obj << +/Type /Pages +/Count 6 +/Parent 12260 0 R +/Kids [2771 0 R 2786 0 R 2795 0 R 2806 0 R 2816 0 R 2835 0 R] +>> endobj +2877 0 obj << +/Type /Pages +/Count 6 +/Parent 12260 0 R +/Kids [2868 0 R 2917 0 R 2974 0 R 3037 0 R 3094 0 R 3164 0 R] +>> endobj +3226 0 obj << +/Type /Pages +/Count 6 +/Parent 12260 0 R +/Kids [3219 0 R 3279 0 R 3300 0 R 3313 0 R 3323 0 R 3333 0 R] +>> endobj +3352 0 obj << +/Type /Pages +/Count 6 +/Parent 12260 0 R +/Kids [3345 0 R 3355 0 R 3363 0 R 3373 0 R 3382 0 R 3392 0 R] +>> endobj +3411 0 obj << +/Type /Pages +/Count 6 +/Parent 12260 0 R +/Kids [3403 0 R 3417 0 R 3429 0 R 3438 0 R 3451 0 R 3463 0 R] +>> endobj +3479 0 obj << +/Type /Pages +/Count 6 +/Parent 12260 0 R +/Kids [3472 0 R 3488 0 R 3497 0 R 3506 0 R 3517 0 R 3547 0 R] +>> endobj +3599 0 obj << +/Type /Pages +/Count 6 +/Parent 12261 0 R +/Kids [3591 0 R 3608 0 R 3617 0 R 3626 0 R 3641 0 R 3691 0 R] +>> endobj +3751 0 obj << +/Type /Pages +/Count 6 +/Parent 12261 0 R +/Kids [3732 0 R 3780 0 R 3831 0 R 3894 0 R 3947 0 R 4005 0 R] +>> endobj +4053 0 obj << +/Type /Pages +/Count 6 +/Parent 12261 0 R +/Kids [4048 0 R 4064 0 R 4081 0 R 4096 0 R 4110 0 R 4124 0 R] +>> endobj +4136 0 obj << +/Type /Pages +/Count 6 +/Parent 12261 0 R +/Kids [4133 0 R 4153 0 R 4193 0 R 4244 0 R 4277 0 R 4288 0 R] +>> endobj +4305 0 obj << +/Type /Pages +/Count 6 +/Parent 12261 0 R +/Kids [4295 0 R 4308 0 R 4339 0 R 4381 0 R 4427 0 R 4449 0 R] +>> endobj +4467 0 obj << +/Type /Pages +/Count 6 +/Parent 12261 0 R +/Kids [4457 0 R 4481 0 R 4513 0 R 4554 0 R 4613 0 R 4685 0 R] +>> endobj +4718 0 obj << +/Type /Pages +/Count 6 +/Parent 12262 0 R +/Kids [4714 0 R 4725 0 R 4732 0 R 4744 0 R 4760 0 R 4788 0 R] +>> endobj +4849 0 obj << +/Type /Pages +/Count 6 +/Parent 12262 0 R +/Kids [4830 0 R 4868 0 R 4885 0 R 4908 0 R 4931 0 R 4960 0 R] +>> endobj +5021 0 obj << +/Type /Pages +/Count 6 +/Parent 12262 0 R +/Kids [5005 0 R 5029 0 R 5056 0 R 5094 0 R 5144 0 R 5205 0 R] +>> endobj +5228 0 obj << +/Type /Pages +/Count 6 +/Parent 12262 0 R +/Kids [5224 0 R 5231 0 R 5239 0 R 5260 0 R 5274 0 R 5288 0 R] +>> endobj +5300 0 obj << +/Type /Pages +/Count 6 +/Parent 12262 0 R +/Kids [5295 0 R 5311 0 R 5351 0 R 5385 0 R 5400 0 R 5412 0 R] +>> endobj +5454 0 obj << +/Type /Pages +/Count 6 +/Parent 12262 0 R +/Kids [5441 0 R 5503 0 R 5533 0 R 5551 0 R 5602 0 R 5658 0 R] +>> endobj +5722 0 obj << +/Type /Pages +/Count 6 +/Parent 12263 0 R +/Kids [5716 0 R 5772 0 R 5826 0 R 5891 0 R 5944 0 R 5987 0 R] +>> endobj +6015 0 obj << +/Type /Pages +/Count 6 +/Parent 12263 0 R +/Kids [6011 0 R 6018 0 R 6023 0 R 6028 0 R 6036 0 R 6044 0 R] +>> endobj +6058 0 obj << +/Type /Pages +/Count 6 +/Parent 12263 0 R +/Kids [6052 0 R 6062 0 R 6068 0 R 6083 0 R 6092 0 R 6101 0 R] +>> endobj +6120 0 obj << +/Type /Pages +/Count 6 +/Parent 12263 0 R +/Kids [6113 0 R 6125 0 R 6137 0 R 6147 0 R 6157 0 R 6165 0 R] +>> endobj +6185 0 obj << +/Type /Pages +/Count 6 +/Parent 12263 0 R +/Kids [6179 0 R 6192 0 R 6206 0 R 6217 0 R 6228 0 R 6237 0 R] +>> endobj +6257 0 obj << +/Type /Pages +/Count 6 +/Parent 12263 0 R +/Kids [6251 0 R 6266 0 R 6277 0 R 6290 0 R 6305 0 R 6316 0 R] +>> endobj +6357 0 obj << +/Type /Pages +/Count 6 +/Parent 12264 0 R +/Kids [6344 0 R 6381 0 R 6425 0 R 6473 0 R 6499 0 R 6508 0 R] +>> endobj +6523 0 obj << +/Type /Pages +/Count 6 +/Parent 12264 0 R +/Kids [6516 0 R 6538 0 R 6549 0 R 6590 0 R 6635 0 R 6667 0 R] +>> endobj +6684 0 obj << +/Type /Pages +/Count 6 +/Parent 12264 0 R +/Kids [6681 0 R 6691 0 R 6720 0 R 6751 0 R 6770 0 R 6796 0 R] +>> endobj +6829 0 obj << +/Type /Pages +/Count 6 +/Parent 12264 0 R +/Kids [6821 0 R 6837 0 R 6847 0 R 6868 0 R 6910 0 R 6976 0 R] +>> endobj +7045 0 obj << +/Type /Pages +/Count 6 +/Parent 12264 0 R +/Kids [7040 0 R 7066 0 R 7075 0 R 7088 0 R 7106 0 R 7145 0 R] +>> endobj +7209 0 obj << +/Type /Pages +/Count 6 +/Parent 12264 0 R +/Kids [7197 0 R 7250 0 R 7284 0 R 7299 0 R 7312 0 R 7320 0 R] +>> endobj +7339 0 obj << +/Type /Pages +/Count 6 +/Parent 12265 0 R +/Kids [7331 0 R 7353 0 R 7405 0 R 7428 0 R 7438 0 R 7447 0 R] +>> endobj +7465 0 obj << +/Type /Pages +/Count 6 +/Parent 12265 0 R +/Kids [7458 0 R 7474 0 R 7521 0 R 7578 0 R 7633 0 R 7690 0 R] +>> endobj +7766 0 obj << +/Type /Pages +/Count 6 +/Parent 12265 0 R +/Kids [7759 0 R 7818 0 R 7873 0 R 7903 0 R 7918 0 R 7926 0 R] +>> endobj +7942 0 obj << +/Type /Pages +/Count 6 +/Parent 12265 0 R +/Kids [7936 0 R 7945 0 R 7956 0 R 7967 0 R 7974 0 R 7982 0 R] +>> endobj +7997 0 obj << +/Type /Pages +/Count 6 +/Parent 12265 0 R +/Kids [7991 0 R 8003 0 R 8014 0 R 8027 0 R 8038 0 R 8048 0 R] +>> endobj +8068 0 obj << +/Type /Pages +/Count 6 +/Parent 12265 0 R +/Kids [8062 0 R 8075 0 R 8087 0 R 8100 0 R 8111 0 R 8123 0 R] +>> endobj +8138 0 obj << +/Type /Pages +/Count 6 +/Parent 12266 0 R +/Kids [8131 0 R 8174 0 R 8225 0 R 8279 0 R 8336 0 R 8405 0 R] +>> endobj +8469 0 obj << +/Type /Pages +/Count 6 +/Parent 12266 0 R +/Kids [8457 0 R 8493 0 R 8528 0 R 8543 0 R 8550 0 R 8558 0 R] +>> endobj +8571 0 obj << +/Type /Pages +/Count 6 +/Parent 12266 0 R +/Kids [8565 0 R 8574 0 R 8582 0 R 8592 0 R 8600 0 R 8607 0 R] +>> endobj +8623 0 obj << +/Type /Pages +/Count 6 +/Parent 12266 0 R +/Kids [8617 0 R 8627 0 R 8638 0 R 8651 0 R 8665 0 R 8679 0 R] +>> endobj +8695 0 obj << +/Type /Pages +/Count 6 +/Parent 12266 0 R +/Kids [8689 0 R 8705 0 R 8717 0 R 8731 0 R 8753 0 R 8803 0 R] +>> endobj +8864 0 obj << +/Type /Pages +/Count 6 +/Parent 12266 0 R +/Kids [8855 0 R 8911 0 R 8971 0 R 9029 0 R 9078 0 R 9124 0 R] +>> endobj +9149 0 obj << +/Type /Pages +/Count 6 +/Parent 12267 0 R +/Kids [9142 0 R 9152 0 R 9160 0 R 9170 0 R 9179 0 R 9186 0 R] +>> endobj +9205 0 obj << +/Type /Pages +/Count 6 +/Parent 12267 0 R +/Kids [9196 0 R 9210 0 R 9223 0 R 9234 0 R 9247 0 R 9260 0 R] +>> endobj +9279 0 obj << +/Type /Pages +/Count 6 +/Parent 12267 0 R +/Kids [9274 0 R 9286 0 R 9300 0 R 9313 0 R 9328 0 R 9344 0 R] +>> endobj +9388 0 obj << +/Type /Pages +/Count 6 +/Parent 12267 0 R +/Kids [9372 0 R 9407 0 R 9441 0 R 9467 0 R 9510 0 R 9564 0 R] +>> endobj +9623 0 obj << +/Type /Pages +/Count 6 +/Parent 12267 0 R +/Kids [9620 0 R 9670 0 R 9737 0 R 9800 0 R 9845 0 R 9896 0 R] +>> endobj +9926 0 obj << +/Type /Pages +/Count 6 +/Parent 12267 0 R +/Kids [9921 0 R 9929 0 R 9934 0 R 9939 0 R 9948 0 R 9956 0 R] +>> endobj +9974 0 obj << +/Type /Pages +/Count 6 +/Parent 12268 0 R +/Kids [9966 0 R 9977 0 R 9985 0 R 9997 0 R 10008 0 R 10018 0 R] +>> endobj +10034 0 obj << +/Type /Pages +/Count 6 +/Parent 12268 0 R +/Kids [10028 0 R 10041 0 R 10050 0 R 10060 0 R 10071 0 R 10085 0 R] +>> endobj +10105 0 obj << +/Type /Pages +/Count 6 +/Parent 12268 0 R +/Kids [10098 0 R 10114 0 R 10124 0 R 10140 0 R 10156 0 R 10168 0 R] +>> endobj +10188 0 obj << +/Type /Pages +/Count 6 +/Parent 12268 0 R +/Kids [10181 0 R 10197 0 R 10207 0 R 10242 0 R 10293 0 R 10336 0 R] +>> endobj +10381 0 obj << +/Type /Pages +/Count 6 +/Parent 12268 0 R +/Kids [10371 0 R 10390 0 R 10398 0 R 10412 0 R 10429 0 R 10455 0 R] +>> endobj +10498 0 obj << +/Type /Pages +/Count 6 +/Parent 12268 0 R +/Kids [10486 0 R 10508 0 R 10544 0 R 10566 0 R 10639 0 R 10707 0 R] +>> endobj +10777 0 obj << +/Type /Pages +/Count 6 +/Parent 12269 0 R +/Kids [10774 0 R 10836 0 R 10904 0 R 10966 0 R 11037 0 R 11103 0 R] +>> endobj +11202 0 obj << +/Type /Pages +/Count 6 +/Parent 12269 0 R +/Kids [11199 0 R 11316 0 R 11428 0 R 11539 0 R 11661 0 R 11781 0 R] +>> endobj +11884 0 obj << +/Type /Pages +/Count 5 +/Parent 12269 0 R +/Kids [11881 0 R 11966 0 R 12035 0 R 12104 0 R 12156 0 R] +>> endobj +12257 0 obj << +/Type /Pages +/Count 36 +/Parent 12270 0 R +/Kids [343 0 R 507 0 R 585 0 R 662 0 R 770 0 R 868 0 R] +>> endobj +12258 0 obj << +/Type /Pages +/Count 36 +/Parent 12270 0 R +/Kids [984 0 R 1084 0 R 1129 0 R 1169 0 R 1420 0 R 1676 0 R] +>> endobj +12259 0 obj << +/Type /Pages +/Count 36 +/Parent 12270 0 R +/Kids [1850 0 R 2071 0 R 2341 0 R 2570 0 R 2628 0 R 2702 0 R] +>> endobj +12260 0 obj << +/Type /Pages +/Count 36 +/Parent 12270 0 R +/Kids [2778 0 R 2877 0 R 3226 0 R 3352 0 R 3411 0 R 3479 0 R] +>> endobj +12261 0 obj << +/Type /Pages +/Count 36 +/Parent 12270 0 R +/Kids [3599 0 R 3751 0 R 4053 0 R 4136 0 R 4305 0 R 4467 0 R] +>> endobj +12262 0 obj << +/Type /Pages +/Count 36 +/Parent 12270 0 R +/Kids [4718 0 R 4849 0 R 5021 0 R 5228 0 R 5300 0 R 5454 0 R] +>> endobj +12263 0 obj << +/Type /Pages +/Count 36 +/Parent 12271 0 R +/Kids [5722 0 R 6015 0 R 6058 0 R 6120 0 R 6185 0 R 6257 0 R] +>> endobj +12264 0 obj << +/Type /Pages +/Count 36 +/Parent 12271 0 R +/Kids [6357 0 R 6523 0 R 6684 0 R 6829 0 R 7045 0 R 7209 0 R] +>> endobj +12265 0 obj << +/Type /Pages +/Count 36 +/Parent 12271 0 R +/Kids [7339 0 R 7465 0 R 7766 0 R 7942 0 R 7997 0 R 8068 0 R] +>> endobj +12266 0 obj << +/Type /Pages +/Count 36 +/Parent 12271 0 R +/Kids [8138 0 R 8469 0 R 8571 0 R 8623 0 R 8695 0 R 8864 0 R] +>> endobj +12267 0 obj << +/Type /Pages +/Count 36 +/Parent 12271 0 R +/Kids [9149 0 R 9205 0 R 9279 0 R 9388 0 R 9623 0 R 9926 0 R] +>> endobj +12268 0 obj << +/Type /Pages +/Count 36 +/Parent 12271 0 R +/Kids [9974 0 R 10034 0 R 10105 0 R 10188 0 R 10381 0 R 10498 0 R] +>> endobj +12269 0 obj << +/Type /Pages +/Count 17 +/Parent 12272 0 R +/Kids [10777 0 R 11202 0 R 11884 0 R] +>> endobj +12270 0 obj << +/Type /Pages +/Count 216 +/Parent 12273 0 R +/Kids [12257 0 R 12258 0 R 12259 0 R 12260 0 R 12261 0 R 12262 0 R] +>> endobj +12271 0 obj << +/Type /Pages +/Count 216 +/Parent 12273 0 R +/Kids [12263 0 R 12264 0 R 12265 0 R 12266 0 R 12267 0 R 12268 0 R] +>> endobj +12272 0 obj << +/Type /Pages +/Count 17 +/Parent 12273 0 R +/Kids [12269 0 R] +>> endobj +12273 0 obj << +/Type /Pages +/Count 449 +/Kids [12270 0 R 12271 0 R 12272 0 R] +>> endobj +12274 0 obj << +/Type /Outlines +/First 7 0 R +/Last 135 0 R +/Count 11 +>> endobj +331 0 obj << +/Title 332 0 R +/A 329 0 R +/Parent 135 0 R +/Prev 327 0 R +>> endobj +327 0 obj << +/Title 328 0 R +/A 325 0 R +/Parent 135 0 R +/Prev 323 0 R +/Next 331 0 R +>> endobj +323 0 obj << +/Title 324 0 R +/A 321 0 R +/Parent 135 0 R +/Prev 319 0 R +/Next 327 0 R +>> endobj +319 0 obj << +/Title 320 0 R +/A 317 0 R +/Parent 135 0 R +/Prev 315 0 R +/Next 323 0 R +>> endobj +315 0 obj << +/Title 316 0 R +/A 313 0 R +/Parent 135 0 R +/Prev 311 0 R +/Next 319 0 R +>> endobj +311 0 obj << +/Title 312 0 R +/A 309 0 R +/Parent 135 0 R +/Prev 307 0 R +/Next 315 0 R +>> endobj +307 0 obj << +/Title 308 0 R +/A 305 0 R +/Parent 135 0 R +/Prev 303 0 R +/Next 311 0 R +>> endobj +303 0 obj << +/Title 304 0 R +/A 301 0 R +/Parent 135 0 R +/Prev 299 0 R +/Next 307 0 R +>> endobj +299 0 obj << +/Title 300 0 R +/A 297 0 R +/Parent 135 0 R +/Prev 295 0 R +/Next 303 0 R +>> endobj +295 0 obj << +/Title 296 0 R +/A 293 0 R +/Parent 135 0 R +/Prev 291 0 R +/Next 299 0 R +>> endobj +291 0 obj << +/Title 292 0 R +/A 289 0 R +/Parent 135 0 R +/Prev 287 0 R +/Next 295 0 R +>> endobj +287 0 obj << +/Title 288 0 R +/A 285 0 R +/Parent 135 0 R +/Prev 283 0 R +/Next 291 0 R +>> endobj +283 0 obj << +/Title 284 0 R +/A 281 0 R +/Parent 135 0 R +/Prev 279 0 R +/Next 287 0 R +>> endobj +279 0 obj << +/Title 280 0 R +/A 277 0 R +/Parent 135 0 R +/Prev 275 0 R +/Next 283 0 R +>> endobj +275 0 obj << +/Title 276 0 R +/A 273 0 R +/Parent 135 0 R +/Prev 271 0 R +/Next 279 0 R +>> endobj +271 0 obj << +/Title 272 0 R +/A 269 0 R +/Parent 135 0 R +/Prev 267 0 R +/Next 275 0 R +>> endobj +267 0 obj << +/Title 268 0 R +/A 265 0 R +/Parent 135 0 R +/Prev 263 0 R +/Next 271 0 R +>> endobj +263 0 obj << +/Title 264 0 R +/A 261 0 R +/Parent 135 0 R +/Prev 259 0 R +/Next 267 0 R +>> endobj +259 0 obj << +/Title 260 0 R +/A 257 0 R +/Parent 135 0 R +/Prev 255 0 R +/Next 263 0 R +>> endobj +255 0 obj << +/Title 256 0 R +/A 253 0 R +/Parent 135 0 R +/Prev 251 0 R +/Next 259 0 R +>> endobj +251 0 obj << +/Title 252 0 R +/A 249 0 R +/Parent 135 0 R +/Prev 247 0 R +/Next 255 0 R +>> endobj +247 0 obj << +/Title 248 0 R +/A 245 0 R +/Parent 135 0 R +/Prev 243 0 R +/Next 251 0 R +>> endobj +243 0 obj << +/Title 244 0 R +/A 241 0 R +/Parent 135 0 R +/Prev 239 0 R +/Next 247 0 R +>> endobj +239 0 obj << +/Title 240 0 R +/A 237 0 R +/Parent 135 0 R +/Prev 235 0 R +/Next 243 0 R +>> endobj +235 0 obj << +/Title 236 0 R +/A 233 0 R +/Parent 135 0 R +/Prev 231 0 R +/Next 239 0 R +>> endobj +231 0 obj << +/Title 232 0 R +/A 229 0 R +/Parent 135 0 R +/Prev 227 0 R +/Next 235 0 R +>> endobj +227 0 obj << +/Title 228 0 R +/A 225 0 R +/Parent 135 0 R +/Prev 223 0 R +/Next 231 0 R +>> endobj +223 0 obj << +/Title 224 0 R +/A 221 0 R +/Parent 135 0 R +/Prev 219 0 R +/Next 227 0 R +>> endobj +219 0 obj << +/Title 220 0 R +/A 217 0 R +/Parent 135 0 R +/Prev 215 0 R +/Next 223 0 R +>> endobj +215 0 obj << +/Title 216 0 R +/A 213 0 R +/Parent 135 0 R +/Prev 211 0 R +/Next 219 0 R +>> endobj +211 0 obj << +/Title 212 0 R +/A 209 0 R +/Parent 135 0 R +/Prev 207 0 R +/Next 215 0 R +>> endobj +207 0 obj << +/Title 208 0 R +/A 205 0 R +/Parent 135 0 R +/Prev 203 0 R +/Next 211 0 R +>> endobj +203 0 obj << +/Title 204 0 R +/A 201 0 R +/Parent 135 0 R +/Prev 199 0 R +/Next 207 0 R +>> endobj +199 0 obj << +/Title 200 0 R +/A 197 0 R +/Parent 135 0 R +/Prev 195 0 R +/Next 203 0 R +>> endobj +195 0 obj << +/Title 196 0 R +/A 193 0 R +/Parent 135 0 R +/Prev 191 0 R +/Next 199 0 R +>> endobj +191 0 obj << +/Title 192 0 R +/A 189 0 R +/Parent 135 0 R +/Prev 187 0 R +/Next 195 0 R +>> endobj +187 0 obj << +/Title 188 0 R +/A 185 0 R +/Parent 135 0 R +/Prev 183 0 R +/Next 191 0 R +>> endobj +183 0 obj << +/Title 184 0 R +/A 181 0 R +/Parent 135 0 R +/Prev 179 0 R +/Next 187 0 R +>> endobj +179 0 obj << +/Title 180 0 R +/A 177 0 R +/Parent 135 0 R +/Prev 175 0 R +/Next 183 0 R +>> endobj +175 0 obj << +/Title 176 0 R +/A 173 0 R +/Parent 135 0 R +/Prev 171 0 R +/Next 179 0 R +>> endobj +171 0 obj << +/Title 172 0 R +/A 169 0 R +/Parent 135 0 R +/Prev 167 0 R +/Next 175 0 R +>> endobj +167 0 obj << +/Title 168 0 R +/A 165 0 R +/Parent 135 0 R +/Prev 163 0 R +/Next 171 0 R +>> endobj +163 0 obj << +/Title 164 0 R +/A 161 0 R +/Parent 135 0 R +/Prev 159 0 R +/Next 167 0 R +>> endobj +159 0 obj << +/Title 160 0 R +/A 157 0 R +/Parent 135 0 R +/Prev 155 0 R +/Next 163 0 R +>> endobj +155 0 obj << +/Title 156 0 R +/A 153 0 R +/Parent 135 0 R +/Prev 151 0 R +/Next 159 0 R +>> endobj +151 0 obj << +/Title 152 0 R +/A 149 0 R +/Parent 135 0 R +/Prev 147 0 R +/Next 155 0 R +>> endobj +147 0 obj << +/Title 148 0 R +/A 145 0 R +/Parent 135 0 R +/Prev 143 0 R +/Next 151 0 R +>> endobj +143 0 obj << +/Title 144 0 R +/A 141 0 R +/Parent 135 0 R +/Prev 139 0 R +/Next 147 0 R +>> endobj +139 0 obj << +/Title 140 0 R +/A 137 0 R +/Parent 135 0 R +/Next 143 0 R +>> endobj +135 0 obj << +/Title 136 0 R +/A 133 0 R +/Parent 12274 0 R +/Prev 119 0 R +/First 139 0 R +/Last 331 0 R +/Count -49 +>> endobj +131 0 obj << +/Title 132 0 R +/A 129 0 R +/Parent 119 0 R +/Prev 127 0 R +>> endobj +127 0 obj << +/Title 128 0 R +/A 125 0 R +/Parent 119 0 R +/Prev 123 0 R +/Next 131 0 R +>> endobj +123 0 obj << +/Title 124 0 R +/A 121 0 R +/Parent 119 0 R +/Next 127 0 R +>> endobj +119 0 obj << +/Title 120 0 R +/A 117 0 R +/Parent 12274 0 R +/Prev 111 0 R +/Next 135 0 R +/First 123 0 R +/Last 131 0 R +/Count -3 +>> endobj +115 0 obj << +/Title 116 0 R +/A 113 0 R +/Parent 111 0 R +>> endobj +111 0 obj << +/Title 112 0 R +/A 109 0 R +/Parent 12274 0 R +/Prev 103 0 R +/Next 119 0 R +/First 115 0 R +/Last 115 0 R +/Count -1 +>> endobj +107 0 obj << +/Title 108 0 R +/A 105 0 R +/Parent 103 0 R +>> endobj +103 0 obj << +/Title 104 0 R +/A 101 0 R +/Parent 12274 0 R +/Prev 95 0 R +/Next 111 0 R +/First 107 0 R +/Last 107 0 R +/Count -1 +>> endobj +99 0 obj << +/Title 100 0 R +/A 97 0 R +/Parent 95 0 R +>> endobj +95 0 obj << +/Title 96 0 R +/A 93 0 R +/Parent 12274 0 R +/Prev 87 0 R +/Next 103 0 R +/First 99 0 R +/Last 99 0 R +/Count -1 +>> endobj +91 0 obj << +/Title 92 0 R +/A 89 0 R +/Parent 87 0 R +>> endobj +87 0 obj << +/Title 88 0 R +/A 85 0 R +/Parent 12274 0 R +/Prev 79 0 R +/Next 95 0 R +/First 91 0 R +/Last 91 0 R +/Count -1 +>> endobj +83 0 obj << +/Title 84 0 R +/A 81 0 R +/Parent 79 0 R +>> endobj +79 0 obj << +/Title 80 0 R +/A 77 0 R +/Parent 12274 0 R +/Prev 75 0 R +/Next 87 0 R +/First 83 0 R +/Last 83 0 R +/Count -1 +>> endobj +75 0 obj << +/Title 76 0 R +/A 73 0 R +/Parent 12274 0 R +/Prev 71 0 R +/Next 79 0 R +>> endobj +71 0 obj << +/Title 72 0 R +/A 69 0 R +/Parent 12274 0 R +/Prev 67 0 R +/Next 75 0 R +>> endobj +67 0 obj << +/Title 68 0 R +/A 65 0 R +/Parent 12274 0 R +/Prev 7 0 R +/Next 71 0 R +>> endobj +63 0 obj << +/Title 64 0 R +/A 61 0 R +/Parent 7 0 R +/Prev 59 0 R +>> endobj +59 0 obj << +/Title 60 0 R +/A 57 0 R +/Parent 7 0 R +/Prev 55 0 R +/Next 63 0 R +>> endobj +55 0 obj << +/Title 56 0 R +/A 53 0 R +/Parent 7 0 R +/Prev 51 0 R +/Next 59 0 R +>> endobj +51 0 obj << +/Title 52 0 R +/A 49 0 R +/Parent 7 0 R +/Prev 47 0 R +/Next 55 0 R +>> endobj +47 0 obj << +/Title 48 0 R +/A 45 0 R +/Parent 7 0 R +/Prev 43 0 R +/Next 51 0 R +>> endobj +43 0 obj << +/Title 44 0 R +/A 41 0 R +/Parent 7 0 R +/Prev 39 0 R +/Next 47 0 R +>> endobj +39 0 obj << +/Title 40 0 R +/A 37 0 R +/Parent 7 0 R +/Prev 35 0 R +/Next 43 0 R +>> endobj +35 0 obj << +/Title 36 0 R +/A 33 0 R +/Parent 7 0 R +/Prev 31 0 R +/Next 39 0 R +>> endobj +31 0 obj << +/Title 32 0 R +/A 29 0 R +/Parent 7 0 R +/Prev 27 0 R +/Next 35 0 R +>> endobj +27 0 obj << +/Title 28 0 R +/A 25 0 R +/Parent 7 0 R +/Prev 23 0 R +/Next 31 0 R +>> endobj +23 0 obj << +/Title 24 0 R +/A 21 0 R +/Parent 7 0 R +/Prev 19 0 R +/Next 27 0 R +>> endobj +19 0 obj << +/Title 20 0 R +/A 17 0 R +/Parent 7 0 R +/Prev 15 0 R +/Next 23 0 R +>> endobj +15 0 obj << +/Title 16 0 R +/A 13 0 R +/Parent 7 0 R +/Prev 11 0 R +/Next 19 0 R +>> endobj +11 0 obj << +/Title 12 0 R +/A 9 0 R +/Parent 7 0 R +/Next 15 0 R +>> endobj +7 0 obj << +/Title 8 0 R +/A 5 0 R +/Parent 12274 0 R +/Next 67 0 R +/First 11 0 R +/Last 63 0 R +/Count -14 +>> endobj +12275 0 obj << +/Names [(Doc-Start) 338 0 R (GFDL) 1147 0 R (GFDL_GFDL) 378 0 R (GPL) 1074 0 R (GPL_GPL) 379 0 R (Item.1) 516 0 R] +/Limits [(Doc-Start) (Item.1)] +>> endobj +12276 0 obj << +/Names [(Item.2) 517 0 R (Item.3) 523 0 R (Item.4) 524 0 R (Item.5) 525 0 R (classParma__Polyhedra__Library_1_1BD__Shape) 478 0 R (classParma__Polyhedra__Library_1_1BD__Shape_00b832cc0784b7b30f4d4a2f738a3032) 2465 0 R] +/Limits [(Item.2) (classParma__Polyhedra__Library_1_1BD__Shape_00b832cc0784b7b30f4d4a2f738a3032)] +>> endobj +12277 0 obj << +/Names [(classParma__Polyhedra__Library_1_1BD__Shape_033967c42f02b6029fc4d6153eb8072a) 2122 0 R (classParma__Polyhedra__Library_1_1BD__Shape_0442c5079b3de8dcac61c224ee7a2e6f) 2349 0 R (classParma__Polyhedra__Library_1_1BD__Shape_07cc48290e435dfb739fb565ff1aa3fa) 2354 0 R (classParma__Polyhedra__Library_1_1BD__Shape_0acf1147e3f81830606dec4cc8faddd4) 2412 0 R (classParma__Polyhedra__Library_1_1BD__Shape_0badc932380dcb7f72ea50ca922d9d4b) 2478 0 R (classParma__Polyhedra__Library_1_1BD__Shape_0cc08ca5d72d5cf465eb7812ffbb156a) 2293 0 R] +/Limits [(classParma__Polyhedra__Library_1_1BD__Shape_033967c42f02b6029fc4d6153eb8072a) (classParma__Polyhedra__Library_1_1BD__Shape_0cc08ca5d72d5cf465eb7812ffbb156a)] +>> endobj +12278 0 obj << +/Names [(classParma__Polyhedra__Library_1_1BD__Shape_128b2fafec11e096e41f78710ba2ff0a) 2180 0 R (classParma__Polyhedra__Library_1_1BD__Shape_12dc6df3a06f4c97c6bb2264bbad05ac) 2114 0 R (classParma__Polyhedra__Library_1_1BD__Shape_15b3e8152862a6b98ecf1c4f4a142634) 2181 0 R (classParma__Polyhedra__Library_1_1BD__Shape_16f61fdba7e14a67990a84e93be00efb) 2246 0 R (classParma__Polyhedra__Library_1_1BD__Shape_178a6a88143f44b43939d36024af6162) 2416 0 R (classParma__Polyhedra__Library_1_1BD__Shape_1a02b17cbccf348192f3e7f776b3b3fd) 2420 0 R] +/Limits [(classParma__Polyhedra__Library_1_1BD__Shape_128b2fafec11e096e41f78710ba2ff0a) (classParma__Polyhedra__Library_1_1BD__Shape_1a02b17cbccf348192f3e7f776b3b3fd)] +>> endobj +12279 0 obj << +/Names [(classParma__Polyhedra__Library_1_1BD__Shape_1a6088f536e9340145630576cfd6e6b9) 2121 0 R (classParma__Polyhedra__Library_1_1BD__Shape_1cb059d74161d8458f18b02e33efe434) 1197 0 R (classParma__Polyhedra__Library_1_1BD__Shape_1d00782cbab77286295552af7dba7ed8) 2240 0 R (classParma__Polyhedra__Library_1_1BD__Shape_1e645f35cbeedf3341428988157f71ab) 2176 0 R (classParma__Polyhedra__Library_1_1BD__Shape_20814dec69b3a6602b70a9ad50db9b2a) 2289 0 R (classParma__Polyhedra__Library_1_1BD__Shape_221657648a7e456dba61589e37765cd4) 2530 0 R] +/Limits [(classParma__Polyhedra__Library_1_1BD__Shape_1a6088f536e9340145630576cfd6e6b9) (classParma__Polyhedra__Library_1_1BD__Shape_221657648a7e456dba61589e37765cd4)] +>> endobj +12280 0 obj << +/Names [(classParma__Polyhedra__Library_1_1BD__Shape_242d9bf0b5b215d4aa771e9f8595baea) 2283 0 R (classParma__Polyhedra__Library_1_1BD__Shape_24d2b69146ab1b2216e437468a818cea) 2419 0 R (classParma__Polyhedra__Library_1_1BD__Shape_24fbe68af11e373092f23f59b6cfd3e1) 2177 0 R (classParma__Polyhedra__Library_1_1BD__Shape_25a2d683973c6c6901e47c4fe90cf2b1) 2185 0 R (classParma__Polyhedra__Library_1_1BD__Shape_25c5ef784f17646705c76a5be6c724a3) 2123 0 R (classParma__Polyhedra__Library_1_1BD__Shape_2626176104b632be36dc614e1d5536ea) 1196 0 R] +/Limits [(classParma__Polyhedra__Library_1_1BD__Shape_242d9bf0b5b215d4aa771e9f8595baea) (classParma__Polyhedra__Library_1_1BD__Shape_2626176104b632be36dc614e1d5536ea)] +>> endobj +12281 0 obj << +/Names [(classParma__Polyhedra__Library_1_1BD__Shape_28b268e37d25a0cfa2b5bf39e85c758d) 2291 0 R (classParma__Polyhedra__Library_1_1BD__Shape_29212d49685544d8a3c71993bd30f467) 2287 0 R (classParma__Polyhedra__Library_1_1BD__Shape_2af430cd70ac416ca0907312b65812e6) 2469 0 R (classParma__Polyhedra__Library_1_1BD__Shape_33daeddebffc6eb847edd92c3ba045dc) 2239 0 R (classParma__Polyhedra__Library_1_1BD__Shape_35f19d0e7190c5a18aebc9ced95d554e) 2345 0 R (classParma__Polyhedra__Library_1_1BD__Shape_3825b4905d72422089bf28d3c95c2964) 2126 0 R] +/Limits [(classParma__Polyhedra__Library_1_1BD__Shape_28b268e37d25a0cfa2b5bf39e85c758d) (classParma__Polyhedra__Library_1_1BD__Shape_3825b4905d72422089bf28d3c95c2964)] +>> endobj +12282 0 obj << +/Names [(classParma__Polyhedra__Library_1_1BD__Shape_396bd79b5d57d54685d9c1b9d970c00e) 2286 0 R (classParma__Polyhedra__Library_1_1BD__Shape_47a21a1c8a88c306877d15d4dbc697b4) 2531 0 R (classParma__Polyhedra__Library_1_1BD__Shape_4882da0200ef4201f3adb0f6d7731526) 1248 0 R (classParma__Polyhedra__Library_1_1BD__Shape_4aef1a4f6e9bed5d473e98320401e0e5) 2245 0 R (classParma__Polyhedra__Library_1_1BD__Shape_4b7615a8ec5120dc083f368ecfe2d1da) 2350 0 R (classParma__Polyhedra__Library_1_1BD__Shape_4e04c3a6c835332c31dfbb928b31144e) 2353 0 R] +/Limits [(classParma__Polyhedra__Library_1_1BD__Shape_396bd79b5d57d54685d9c1b9d970c00e) (classParma__Polyhedra__Library_1_1BD__Shape_4e04c3a6c835332c31dfbb928b31144e)] +>> endobj +12283 0 obj << +/Names [(classParma__Polyhedra__Library_1_1BD__Shape_5049b85730d6720536be440753b11ed8) 2527 0 R (classParma__Polyhedra__Library_1_1BD__Shape_535090b407c713681228d6ab2b835e36) 2292 0 R (classParma__Polyhedra__Library_1_1BD__Shape_54f33edf5fdf4c6f606136b882be9f1d) 2284 0 R (classParma__Polyhedra__Library_1_1BD__Shape_5a66e6f883c7310ddbc312f78bb0970f) 2417 0 R (classParma__Polyhedra__Library_1_1BD__Shape_5d71f71f50ba04fe5f810acf0cf1e294) 2470 0 R (classParma__Polyhedra__Library_1_1BD__Shape_5e972fbb672e9b2faec34b949c9a2918) 2243 0 R] +/Limits [(classParma__Polyhedra__Library_1_1BD__Shape_5049b85730d6720536be440753b11ed8) (classParma__Polyhedra__Library_1_1BD__Shape_5e972fbb672e9b2faec34b949c9a2918)] +>> endobj +12284 0 obj << +/Names [(classParma__Polyhedra__Library_1_1BD__Shape_620d5cdb01b8b20848ca01f4e4c05b4f) 2234 0 R (classParma__Polyhedra__Library_1_1BD__Shape_641b55dd6c26bce06bd8041b38aec873) 2236 0 R (classParma__Polyhedra__Library_1_1BD__Shape_668cbd7cea86f47c4e2b303468083712) 2346 0 R (classParma__Polyhedra__Library_1_1BD__Shape_6a3dd351c33d66250d2b4ac639768f07) 2241 0 R (classParma__Polyhedra__Library_1_1BD__Shape_75188bcee0bfc88a4c8571acc04a1826) 2244 0 R (classParma__Polyhedra__Library_1_1BD__Shape_794dad01f1995c73b887effa026ac32e) 1247 0 R] +/Limits [(classParma__Polyhedra__Library_1_1BD__Shape_620d5cdb01b8b20848ca01f4e4c05b4f) (classParma__Polyhedra__Library_1_1BD__Shape_794dad01f1995c73b887effa026ac32e)] +>> endobj +12285 0 obj << +/Names [(classParma__Polyhedra__Library_1_1BD__Shape_79a586ca093d218e5603380ac0475717) 2235 0 R (classParma__Polyhedra__Library_1_1BD__Shape_79acafbe4f67eb7e2710287bcd60db96) 2414 0 R (classParma__Polyhedra__Library_1_1BD__Shape_8101d965bc32e4ab1df6aa445730769b) 2173 0 R (classParma__Polyhedra__Library_1_1BD__Shape_82b35fc075e1e9542d4cc5cff2e236f8) 2118 0 R (classParma__Polyhedra__Library_1_1BD__Shape_84a9c57aa31433a277d9be6b0077065a) 2352 0 R (classParma__Polyhedra__Library_1_1BD__Shape_86dd59c40a3c9867c2979ff24ba342c2) 2348 0 R] +/Limits [(classParma__Polyhedra__Library_1_1BD__Shape_79a586ca093d218e5603380ac0475717) (classParma__Polyhedra__Library_1_1BD__Shape_86dd59c40a3c9867c2979ff24ba342c2)] +>> endobj +12286 0 obj << +/Names [(classParma__Polyhedra__Library_1_1BD__Shape_8921d611a6be878bd8ad66a9af6f405e) 1246 0 R (classParma__Polyhedra__Library_1_1BD__Shape_894e92407922be006a76577cf47b8589) 2351 0 R (classParma__Polyhedra__Library_1_1BD__Shape_8a87935278cb7b1290301e96cb82fcb1) 2242 0 R (classParma__Polyhedra__Library_1_1BD__Shape_8c73e2c464d5e93dc55862d00d5478f8) 2285 0 R (classParma__Polyhedra__Library_1_1BD__Shape_8c89ddcd2fc4311af0e358477630d7d9) 2523 0 R (classParma__Polyhedra__Library_1_1BD__Shape_8d6c186583503c4394603550b50edf59) 2548 0 R] +/Limits [(classParma__Polyhedra__Library_1_1BD__Shape_8921d611a6be878bd8ad66a9af6f405e) (classParma__Polyhedra__Library_1_1BD__Shape_8d6c186583503c4394603550b50edf59)] +>> endobj +12287 0 obj << +/Names [(classParma__Polyhedra__Library_1_1BD__Shape_8e13e7d3536de2745bc9e58a25b75b77) 2344 0 R (classParma__Polyhedra__Library_1_1BD__Shape_8ede75fbd470fa30f11d4c02672883f5) 2342 0 R (classParma__Polyhedra__Library_1_1BD__Shape_8f0bdfca2a6993bfa08358319d589ab6) 2232 0 R (classParma__Polyhedra__Library_1_1BD__Shape_93728c0f0afcd949c391940be93455a8) 2347 0 R (classParma__Polyhedra__Library_1_1BD__Shape_93c1c491c0035f6c38b9ee036184aa7e) 2119 0 R (classParma__Polyhedra__Library_1_1BD__Shape_9507085c5b0efd13c80f08a22b0f5529) 2418 0 R] +/Limits [(classParma__Polyhedra__Library_1_1BD__Shape_8e13e7d3536de2745bc9e58a25b75b77) (classParma__Polyhedra__Library_1_1BD__Shape_9507085c5b0efd13c80f08a22b0f5529)] +>> endobj +12288 0 obj << +/Names [(classParma__Polyhedra__Library_1_1BD__Shape_988ff507806fa8126649f463ef6a1f31) 2413 0 R (classParma__Polyhedra__Library_1_1BD__Shape_9bf45a32e428970068f654258dd7fb0c) 2171 0 R (classParma__Polyhedra__Library_1_1BD__Shape_9c0703b2311336754e28a7f739b7e685) 2472 0 R (classParma__Polyhedra__Library_1_1BD__Shape_a07f93a685253eb04edab43b5ebd27b2) 2184 0 R (classParma__Polyhedra__Library_1_1BD__Shape_a78a6abbbb3c425992ca644f732e69e8) 2172 0 R (classParma__Polyhedra__Library_1_1BD__Shape_a7b3a5c12ea008b78eed88a621c1fab1) 2237 0 R] +/Limits [(classParma__Polyhedra__Library_1_1BD__Shape_988ff507806fa8126649f463ef6a1f31) (classParma__Polyhedra__Library_1_1BD__Shape_a7b3a5c12ea008b78eed88a621c1fab1)] +>> endobj +12289 0 obj << +/Names [(classParma__Polyhedra__Library_1_1BD__Shape_a85819690f928a46e3f437bfe629e976) 2294 0 R (classParma__Polyhedra__Library_1_1BD__Shape_a8e2f5b70168ac89a3f47639e7d9a4f9) 1249 0 R (classParma__Polyhedra__Library_1_1BD__Shape_ab3964a5c29992e6476852c9d246fe6f) 2125 0 R (classParma__Polyhedra__Library_1_1BD__Shape_b054f67fb31ea4e860dd7c24c0b56676) 2476 0 R (classParma__Polyhedra__Library_1_1BD__Shape_b0a670aeef72d808d620bbc33a5e8cd7) 2474 0 R (classParma__Polyhedra__Library_1_1BD__Shape_b464aec35ab7fb9fe0a8a50e05ad6f99) 1194 0 R] +/Limits [(classParma__Polyhedra__Library_1_1BD__Shape_a85819690f928a46e3f437bfe629e976) (classParma__Polyhedra__Library_1_1BD__Shape_b464aec35ab7fb9fe0a8a50e05ad6f99)] +>> endobj +12290 0 obj << +/Names [(classParma__Polyhedra__Library_1_1BD__Shape_bb521f4ff8e2e40318bd06b0ff4d7617) 2479 0 R (classParma__Polyhedra__Library_1_1BD__Shape_bee6d42dd6f94979bcc7fb3d51102864) 2170 0 R (classParma__Polyhedra__Library_1_1BD__Shape_c20541d40c7629b278584406ce554eaf) 1195 0 R (classParma__Polyhedra__Library_1_1BD__Shape_c65231748a66ac5c074502cc8e652e10) 2477 0 R (classParma__Polyhedra__Library_1_1BD__Shape_c7f89b09f6755cdcd97daa3a92522b00) 2178 0 R (classParma__Polyhedra__Library_1_1BD__Shape_c91aac77237c2405df039c4fcfa08ab0) 2526 0 R] +/Limits [(classParma__Polyhedra__Library_1_1BD__Shape_bb521f4ff8e2e40318bd06b0ff4d7617) (classParma__Polyhedra__Library_1_1BD__Shape_c91aac77237c2405df039c4fcfa08ab0)] +>> endobj +12291 0 obj << +/Names [(classParma__Polyhedra__Library_1_1BD__Shape_caa538c9c00b2f69301365d916bb49e8) 2233 0 R (classParma__Polyhedra__Library_1_1BD__Shape_ccbd8986577794cea90edef63e859ab1) 2471 0 R (classParma__Polyhedra__Library_1_1BD__Shape_cda762f8c081fed2862260211618fce0) 2415 0 R (classParma__Polyhedra__Library_1_1BD__Shape_cdc537f0aa5117fe3749d3c50b7dc4fd) 2528 0 R (classParma__Polyhedra__Library_1_1BD__Shape_ce010a880cb8574335f1be294907de89) 2343 0 R (classParma__Polyhedra__Library_1_1BD__Shape_cf4dc2de16f4a54ca03daa6ac1d31ce2) 2290 0 R] +/Limits [(classParma__Polyhedra__Library_1_1BD__Shape_caa538c9c00b2f69301365d916bb49e8) (classParma__Polyhedra__Library_1_1BD__Shape_cf4dc2de16f4a54ca03daa6ac1d31ce2)] +>> endobj +12292 0 obj << +/Names [(classParma__Polyhedra__Library_1_1BD__Shape_cfed8bc19e046453778c9d99d84df283) 2113 0 R (classParma__Polyhedra__Library_1_1BD__Shape_d09a9ccc89ace499a888b6b1a1f4ce44) 2174 0 R (classParma__Polyhedra__Library_1_1BD__Shape_d0a9267e420144cacfb867076d00a803) 2533 0 R (classParma__Polyhedra__Library_1_1BD__Shape_d369744c43a49ebac904bc3e17de0478) 2288 0 R (classParma__Polyhedra__Library_1_1BD__Shape_d80989353ea3738abdb6b605d27cc8fa) 2410 0 R (classParma__Polyhedra__Library_1_1BD__Shape_dbf2609849c95cfb7277df1edc69534f) 2182 0 R] +/Limits [(classParma__Polyhedra__Library_1_1BD__Shape_cfed8bc19e046453778c9d99d84df283) (classParma__Polyhedra__Library_1_1BD__Shape_dbf2609849c95cfb7277df1edc69534f)] +>> endobj +12293 0 obj << +/Names [(classParma__Polyhedra__Library_1_1BD__Shape_df3cfc56df68bc8063e6e9eb3d0ad3f1) 2422 0 R (classParma__Polyhedra__Library_1_1BD__Shape_df78023ac662762ffc808902b970597b) 2186 0 R (classParma__Polyhedra__Library_1_1BD__Shape_e0a1b4b4a344cad01c58e8e006a7ff16) 2124 0 R (classParma__Polyhedra__Library_1_1BD__Shape_e0ba85e8cab7e4e95ec001bde5bdd99d) 2411 0 R (classParma__Polyhedra__Library_1_1BD__Shape_e5c66812ab981ee2d1ab96ce218a7782) 2532 0 R (classParma__Polyhedra__Library_1_1BD__Shape_e61fdcc22d1e0fe43b94194f2eadaa1a) 2238 0 R] +/Limits [(classParma__Polyhedra__Library_1_1BD__Shape_df3cfc56df68bc8063e6e9eb3d0ad3f1) (classParma__Polyhedra__Library_1_1BD__Shape_e61fdcc22d1e0fe43b94194f2eadaa1a)] +>> endobj +12294 0 obj << +/Names [(classParma__Polyhedra__Library_1_1BD__Shape_e68d61763922cee018cbba3834b2085c) 2467 0 R (classParma__Polyhedra__Library_1_1BD__Shape_e748c3f5082b158453fbb3ccf57c8f70) 2468 0 R (classParma__Polyhedra__Library_1_1BD__Shape_eda87d46bc3b54b420a475934e0e1cb6) 2421 0 R (classParma__Polyhedra__Library_1_1BD__Shape_edabe8ecd0866b972e97709e17f94681) 2116 0 R (classParma__Polyhedra__Library_1_1BD__Shape_f4b0f891a6911d7784216f537fa3e473) 2529 0 R (classParma__Polyhedra__Library_1_1BD__Shape_f6351727d099ad178db8b8e742507f4c) 2549 0 R] +/Limits [(classParma__Polyhedra__Library_1_1BD__Shape_e68d61763922cee018cbba3834b2085c) (classParma__Polyhedra__Library_1_1BD__Shape_f6351727d099ad178db8b8e742507f4c)] +>> endobj +12295 0 obj << +/Names [(classParma__Polyhedra__Library_1_1BD__Shape_f8cd5fb701a14bc509872aeb3617b0b4) 2475 0 R (classParma__Polyhedra__Library_1_1BD__Shape_fa8a10ff4b09f8a87e3c558a39f5888e) 2473 0 R (classParma__Polyhedra__Library_1_1BD__Shape_faa5d6b3c1b3b83161b619c28c5f9936) 2183 0 R (classParma__Polyhedra__Library_1_1BD__Shape_fad498a5802a7928442fd0d4b8c6183f) 2179 0 R (classParma__Polyhedra__Library_1_1BHRZ03__Certificate) 906 0 R (classParma__Polyhedra__Library_1_1BHRZ03__Certificate_35ea0c10995c89f8a11a2e8bb5dc7f17) 2846 0 R] +/Limits [(classParma__Polyhedra__Library_1_1BD__Shape_f8cd5fb701a14bc509872aeb3617b0b4) (classParma__Polyhedra__Library_1_1BHRZ03__Certificate_35ea0c10995c89f8a11a2e8bb5dc7f17)] +>> endobj +12296 0 obj << +/Names [(classParma__Polyhedra__Library_1_1BHRZ03__Certificate_5ebec8f5ff32009c4cf98dead90f4a3c) 2840 0 R (classParma__Polyhedra__Library_1_1BHRZ03__Certificate_67b4e0eba7692bced073431cd3cc22ae) 2839 0 R (classParma__Polyhedra__Library_1_1BHRZ03__Certificate_6ab41afc79135511037718442fcad4d4) 2843 0 R (classParma__Polyhedra__Library_1_1BHRZ03__Certificate_97b2101d371edae52746a53cf34e4b67) 2842 0 R (classParma__Polyhedra__Library_1_1BHRZ03__Certificate_f2ec3c62388f9aef1414a527e82cd1a7) 2841 0 R (classParma__Polyhedra__Library_1_1Box) 480 0 R] +/Limits [(classParma__Polyhedra__Library_1_1BHRZ03__Certificate_5ebec8f5ff32009c4cf98dead90f4a3c) (classParma__Polyhedra__Library_1_1Box)] +>> endobj +12297 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Box_025c54a0d06e882346b74c0624ee6e71) 3287 0 R (classParma__Polyhedra__Library_1_1Box_04732c1c89db2f6d76b3b9479ec2fb99) 2986 0 R (classParma__Polyhedra__Library_1_1Box_055f3030915a1b7de0cc50761d9a3245) 3041 0 R (classParma__Polyhedra__Library_1_1Box_06c2ce3f0789aba0294da43628b50226) 3173 0 R (classParma__Polyhedra__Library_1_1Box_070e05c80af78d7c91bee958b9848080) 3233 0 R (classParma__Polyhedra__Library_1_1Box_0cb0abcc152d2d7c95a116efd3ea989a) 3237 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Box_025c54a0d06e882346b74c0624ee6e71) (classParma__Polyhedra__Library_1_1Box_0cb0abcc152d2d7c95a116efd3ea989a)] +>> endobj +12298 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Box_1039be5680ea8eceb903367e1e7aa13f) 3051 0 R (classParma__Polyhedra__Library_1_1Box_161c87c94b78fd1111365e185d0a3ae7) 3171 0 R (classParma__Polyhedra__Library_1_1Box_17182f3f0d9242d5821ba59b2773ae55) 3176 0 R (classParma__Polyhedra__Library_1_1Box_1915597423b1aa0dbed55312b2308efd) 3288 0 R (classParma__Polyhedra__Library_1_1Box_1d20ad17015746b2d9e0290631fc175b) 3283 0 R (classParma__Polyhedra__Library_1_1Box_1d8eb71bd67ae50436968e7323bbeb7e) 2880 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Box_1039be5680ea8eceb903367e1e7aa13f) (classParma__Polyhedra__Library_1_1Box_1d8eb71bd67ae50436968e7323bbeb7e)] +>> endobj +12299 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Box_22f9ceb879f1c8d892f60fb3d9577d81) 3106 0 R (classParma__Polyhedra__Library_1_1Box_286412c3f05e82abdf69c5e5562ff949) 2979 0 R (classParma__Polyhedra__Library_1_1Box_2d20e2dc8d4d0fbbdf87bd01a51dc01e) 3291 0 R (classParma__Polyhedra__Library_1_1Box_2ebf93b52454102cd99eaa211ad6ff71) 3055 0 R (classParma__Polyhedra__Library_1_1Box_2f516cd923f94296daf57c8ace328af9) 2992 0 R (classParma__Polyhedra__Library_1_1Box_2f964d43c2798bde1924e82d88971ea2) 3042 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Box_22f9ceb879f1c8d892f60fb3d9577d81) (classParma__Polyhedra__Library_1_1Box_2f964d43c2798bde1924e82d88971ea2)] +>> endobj +12300 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Box_319084c6ac93db482a8742a58e2e01f3) 2922 0 R (classParma__Polyhedra__Library_1_1Box_339a341a2f7d60de83e4feb3e8986558) 2983 0 R (classParma__Polyhedra__Library_1_1Box_36e39f75a5b973533a044d606444db4f) 3046 0 R (classParma__Polyhedra__Library_1_1Box_3c8e578089e8420dc286b27411fde2fd) 3045 0 R (classParma__Polyhedra__Library_1_1Box_3d107d8f8a78a3925031545c8e1d1a73) 3180 0 R (classParma__Polyhedra__Library_1_1Box_3daaa36a6bf749e0b4d66ce57878e2d0) 3111 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Box_319084c6ac93db482a8742a58e2e01f3) (classParma__Polyhedra__Library_1_1Box_3daaa36a6bf749e0b4d66ce57878e2d0)] +>> endobj +12301 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Box_3f2210364b954a8d532905d09bcb7149) 2933 0 R (classParma__Polyhedra__Library_1_1Box_40ab06947d065a171792da1ce6ed2505) 3049 0 R (classParma__Polyhedra__Library_1_1Box_438eaa92ba7d9f7d8ec085fe9b00ec0b) 3292 0 R (classParma__Polyhedra__Library_1_1Box_4aa52c6b939cf0076740afb33dd454e5) 3232 0 R (classParma__Polyhedra__Library_1_1Box_4b050985a103d89eaa5627c16f4f4257) 3110 0 R (classParma__Polyhedra__Library_1_1Box_4b5e1306956d46f1ee477428b451b44b) 3308 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Box_3f2210364b954a8d532905d09bcb7149) (classParma__Polyhedra__Library_1_1Box_4b5e1306956d46f1ee477428b451b44b)] +>> endobj +12302 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Box_4e6787c98290a49ce80b90c008aac5a8) 3225 0 R (classParma__Polyhedra__Library_1_1Box_5659d55fb93c1fe31b82a674e2630c13) 3282 0 R (classParma__Polyhedra__Library_1_1Box_573ac186b0da77408bcb80531ca0090c) 3043 0 R (classParma__Polyhedra__Library_1_1Box_597f9740fbc8534391d2c8cb6381660c) 3236 0 R (classParma__Polyhedra__Library_1_1Box_5b6323dfa423ea57b8d845237d9b576d) 3286 0 R (classParma__Polyhedra__Library_1_1Box_5c02cdac1cee4eda75e568ef9f550da9) 2991 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Box_4e6787c98290a49ce80b90c008aac5a8) (classParma__Polyhedra__Library_1_1Box_5c02cdac1cee4eda75e568ef9f550da9)] +>> endobj +12303 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Box_5f1ce9b2af5f6ba550cd9080ff83077c) 2923 0 R (classParma__Polyhedra__Library_1_1Box_6592baa6045a08fe1eb0ba33e8ed2942) 3290 0 R (classParma__Polyhedra__Library_1_1Box_685232ed211cce61f5d27727d979df94) 3107 0 R (classParma__Polyhedra__Library_1_1Box_6919ec5aef8459ad9c65bc36e8100d58) 3222 0 R (classParma__Polyhedra__Library_1_1Box_6d2f7819b7359865679b24e683231303) 3104 0 R (classParma__Polyhedra__Library_1_1Box_6d5097ef9a821f98cb97571eb52a49aa) 3181 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Box_5f1ce9b2af5f6ba550cd9080ff83077c) (classParma__Polyhedra__Library_1_1Box_6d5097ef9a821f98cb97571eb52a49aa)] +>> endobj +12304 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Box_6df8193213c66dcf70814c097d7b2fcb) 3227 0 R (classParma__Polyhedra__Library_1_1Box_70638e55ff0529f6f481db703645be05) 2984 0 R (classParma__Polyhedra__Library_1_1Box_736577ec65f40b0637f13486e64f051a) 3102 0 R (classParma__Polyhedra__Library_1_1Box_7ded037fa4c26b2e12565d3aa2c6b70b) 2935 0 R (classParma__Polyhedra__Library_1_1Box_7e1a00f36570e89ee95817d898587743) 2980 0 R (classParma__Polyhedra__Library_1_1Box_7e3ffa1dd9894e6418bd153a4cd2de12) 2988 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Box_6df8193213c66dcf70814c097d7b2fcb) (classParma__Polyhedra__Library_1_1Box_7e3ffa1dd9894e6418bd153a4cd2de12)] +>> endobj +12305 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Box_7fff251a8cd2ecd8b928175af94d7069) 2934 0 R (classParma__Polyhedra__Library_1_1Box_818b1050a44c6fb4d635a6fc088eeeca) 2926 0 R (classParma__Polyhedra__Library_1_1Box_84a324ad469ad76c235789823cf4e0f4) 3053 0 R (classParma__Polyhedra__Library_1_1Box_84d340c4e2a8a35e81d0fb91ff2c466e) 2927 0 R (classParma__Polyhedra__Library_1_1Box_852ebcee0de832c12a87ad15d37570a2) 3293 0 R (classParma__Polyhedra__Library_1_1Box_8653fd3779f7a28930872b1f885f25ee) 3289 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Box_7fff251a8cd2ecd8b928175af94d7069) (classParma__Polyhedra__Library_1_1Box_8653fd3779f7a28930872b1f885f25ee)] +>> endobj +12306 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Box_87e906459b095e23114ee8f0025086cb) 3109 0 R (classParma__Polyhedra__Library_1_1Box_8e45baf04a16a09cfa25bac864515832) 3044 0 R (classParma__Polyhedra__Library_1_1Box_8ed22a325737be112cad6864b2a7ef59) 3234 0 R (classParma__Polyhedra__Library_1_1Box_901382835b88fb9969d88eea101ae7cf) 2982 0 R (classParma__Polyhedra__Library_1_1Box_90cc17398be6745eb507339397381d7a) 3050 0 R (classParma__Polyhedra__Library_1_1Box_91546e88fe3474f55bc6f0eceffa7251) 2932 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Box_87e906459b095e23114ee8f0025086cb) (classParma__Polyhedra__Library_1_1Box_91546e88fe3474f55bc6f0eceffa7251)] +>> endobj +12307 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Box_929caef76be87459ac964105f4c75cf4) 3235 0 R (classParma__Polyhedra__Library_1_1Box_92ef9a99d160f55e3fc44a4bd1ae78f2) 3101 0 R (classParma__Polyhedra__Library_1_1Box_944e2c41213d3ea40e74930a90de97bf) 3105 0 R (classParma__Polyhedra__Library_1_1Box_94dd083371c61a3f54521caed75e2820) 3054 0 R (classParma__Polyhedra__Library_1_1Box_96038eb89649898faa9a4355206b72d3) 3170 0 R (classParma__Polyhedra__Library_1_1Box_9de293fc5ed59d0122ccd78839b1a668) 2985 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Box_929caef76be87459ac964105f4c75cf4) (classParma__Polyhedra__Library_1_1Box_9de293fc5ed59d0122ccd78839b1a668)] +>> endobj +12308 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Box_9e6044d3d1b8cd66b7e150763a0cce2a) 2878 0 R (classParma__Polyhedra__Library_1_1Box_9ffb692c7f3bd8af9b81135e38b38dd7) 3052 0 R (classParma__Polyhedra__Library_1_1Box_a18b052380a4cbb9db236d690f932eda) 3108 0 R (classParma__Polyhedra__Library_1_1Box_a366a38561684a64bc0a042702534a07) 3099 0 R (classParma__Polyhedra__Library_1_1Box_a7961325727c376428ef2f9431e0c204) 2881 0 R (classParma__Polyhedra__Library_1_1Box_ac61a0c0f3a687ef1d79d9014238554c) 2921 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Box_9e6044d3d1b8cd66b7e150763a0cce2a) (classParma__Polyhedra__Library_1_1Box_ac61a0c0f3a687ef1d79d9014238554c)] +>> endobj +12309 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Box_ace7b1f85601837554656295b9c90dce) 3177 0 R (classParma__Polyhedra__Library_1_1Box_acf7b2a7e0bb5007ce8cd9506d06137d) 3098 0 R (classParma__Polyhedra__Library_1_1Box_b4b097033191e38bbb59add2ebba3e70) 2930 0 R (classParma__Polyhedra__Library_1_1Box_b76731fc33f60619d339fd146af90e7f) 2920 0 R (classParma__Polyhedra__Library_1_1Box_b85f80c281c840eedb4f228757b8515a) 3100 0 R (classParma__Polyhedra__Library_1_1Box_ba476c1ff2b0f1cd58f6e76b981cafac) 3231 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Box_ace7b1f85601837554656295b9c90dce) (classParma__Polyhedra__Library_1_1Box_ba476c1ff2b0f1cd58f6e76b981cafac)] +>> endobj +12310 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Box_bb6e0e38bda55fc988819da21f2689eb) 3048 0 R (classParma__Polyhedra__Library_1_1Box_bd266a7d827fb77e09de63dfea2f9d58) 3175 0 R (classParma__Polyhedra__Library_1_1Box_bd6b88d6fd6e0259faa544106b08aeaa) 3040 0 R (classParma__Polyhedra__Library_1_1Box_beb3e0b3cafb96de2ab53e985c574bb7) 2929 0 R (classParma__Polyhedra__Library_1_1Box_c5eb33b72a86a33d7ae4685d376b50a6) 3097 0 R (classParma__Polyhedra__Library_1_1Box_c72c231542712976d1f9223d0537f5d5) 2928 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Box_bb6e0e38bda55fc988819da21f2689eb) (classParma__Polyhedra__Library_1_1Box_c72c231542712976d1f9223d0537f5d5)] +>> endobj +12311 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Box_c86971c152fbb8d2d486d7396ad6b142) 2981 0 R (classParma__Polyhedra__Library_1_1Box_c8a2f81fc1c5b99600d406300792119f) 2977 0 R (classParma__Polyhedra__Library_1_1Box_cbf26ad2a67dbfbd24eb9c89448a793b) 2875 0 R (classParma__Polyhedra__Library_1_1Box_cddbfcdd0e7dd70c2258493ef67d0911) 2931 0 R (classParma__Polyhedra__Library_1_1Box_ce7b6bb6c1aabdf57f1643e88a834aac) 3047 0 R (classParma__Polyhedra__Library_1_1Box_d02ce2da26b1d9dcd0d45042b9f5c3e5) 2879 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Box_c86971c152fbb8d2d486d7396ad6b142) (classParma__Polyhedra__Library_1_1Box_d02ce2da26b1d9dcd0d45042b9f5c3e5)] +>> endobj +12312 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Box_d4d12fdbf775bc0ad0bb248bbaa19370) 3238 0 R (classParma__Polyhedra__Library_1_1Box_d9dba7a094763a47be44e246c1120fa7) 3113 0 R (classParma__Polyhedra__Library_1_1Box_db355a57fc1949b2ef9627d45be5f9bc) 2989 0 R (classParma__Polyhedra__Library_1_1Box_dcd50fc4fa1b8e5533d7af0513d1a833) 2925 0 R (classParma__Polyhedra__Library_1_1Box_ddca3baab772ce17fb5133b0c4e60c33) 2987 0 R (classParma__Polyhedra__Library_1_1Box_df00a3a6522cd0b27a52ba3e2ab5c8ab) 2978 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Box_d4d12fdbf775bc0ad0bb248bbaa19370) (classParma__Polyhedra__Library_1_1Box_df00a3a6522cd0b27a52ba3e2ab5c8ab)] +>> endobj +12313 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Box_e1186868176c9fb31d7293bc2fe55e52) 3230 0 R (classParma__Polyhedra__Library_1_1Box_e1509738a054a1ffeb070a35c41db257) 3174 0 R (classParma__Polyhedra__Library_1_1Box_e627d4ce07125a5bf6dbe4c4464bfacf) 2924 0 R (classParma__Polyhedra__Library_1_1Box_e70fafb10013762e436a434564d7e931) 3112 0 R (classParma__Polyhedra__Library_1_1Box_e862a635387c2458da51889c20465f0c) 3103 0 R (classParma__Polyhedra__Library_1_1Box_e8b96392adb007f1c59758cba8cbc886) 3178 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Box_e1186868176c9fb31d7293bc2fe55e52) (classParma__Polyhedra__Library_1_1Box_e8b96392adb007f1c59758cba8cbc886)] +>> endobj +12314 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Box_f5edabe0fbfa14196208041ded356c65) 3229 0 R (classParma__Polyhedra__Library_1_1Box_f623edfed6d4816ac5573f42a6a1e801) 2990 0 R (classParma__Polyhedra__Library_1_1Box_fb683aefdda7a1c5dcf92ee2a03daf81) 3172 0 R (classParma__Polyhedra__Library_1_1Box_fb9fe84fabd3625d37c47e517034d88b) 3228 0 R (classParma__Polyhedra__Library_1_1Box_fd20bc6142cb1206b51b0b449ebf4273) 3179 0 R (classParma__Polyhedra__Library_1_1C__Polyhedron) 476 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Box_f5edabe0fbfa14196208041ded356c65) (classParma__Polyhedra__Library_1_1C__Polyhedron)] +>> endobj +12315 0 obj << +/Names [(classParma__Polyhedra__Library_1_1C__Polyhedron_09726be54fe2a591787de59eeffdd2ea) 3596 0 R (classParma__Polyhedra__Library_1_1C__Polyhedron_2b220dabc613a89a062968101429e58c) 3554 0 R (classParma__Polyhedra__Library_1_1C__Polyhedron_33d58476db85f48e4ad680c69bca524f) 3553 0 R (classParma__Polyhedra__Library_1_1C__Polyhedron_4b841053fdf5718c17a018ff650b550a) 3552 0 R (classParma__Polyhedra__Library_1_1C__Polyhedron_59d06e9b429faef7a632d58e4a0b12bd) 3594 0 R (classParma__Polyhedra__Library_1_1C__Polyhedron_5eb7f86790ada6549123a0225d68a4de) 3605 0 R] +/Limits [(classParma__Polyhedra__Library_1_1C__Polyhedron_09726be54fe2a591787de59eeffdd2ea) (classParma__Polyhedra__Library_1_1C__Polyhedron_5eb7f86790ada6549123a0225d68a4de)] +>> endobj +12316 0 obj << +/Names [(classParma__Polyhedra__Library_1_1C__Polyhedron_6424da8931d774f6a2e403c1e2f0d09a) 3597 0 R (classParma__Polyhedra__Library_1_1C__Polyhedron_68e25304a250a8c739927adfb90043d1) 3600 0 R (classParma__Polyhedra__Library_1_1C__Polyhedron_6b286c9e001bf126a0ab85aac675786d) 3602 0 R (classParma__Polyhedra__Library_1_1C__Polyhedron_6f581bf46ab0488f444977453ba2ea2d) 3595 0 R (classParma__Polyhedra__Library_1_1C__Polyhedron_8a6c3f01edb04382620066f17b63b20c) 3556 0 R (classParma__Polyhedra__Library_1_1C__Polyhedron_9720487deabf813a31afd4e9cfe695aa) 3559 0 R] +/Limits [(classParma__Polyhedra__Library_1_1C__Polyhedron_6424da8931d774f6a2e403c1e2f0d09a) (classParma__Polyhedra__Library_1_1C__Polyhedron_9720487deabf813a31afd4e9cfe695aa)] +>> endobj +12317 0 obj << +/Names [(classParma__Polyhedra__Library_1_1C__Polyhedron_c3126925bcd3349b150771d52c19639d) 3558 0 R (classParma__Polyhedra__Library_1_1C__Polyhedron_c86d25d06285c9a2e890770fed084574) 3603 0 R (classParma__Polyhedra__Library_1_1C__Polyhedron_c98ed1378829f72aee73c40dff16f269) 3555 0 R (classParma__Polyhedra__Library_1_1C__Polyhedron_e46f7a91b9fac1a62ef875ec5c72aab6) 3557 0 R (classParma__Polyhedra__Library_1_1C__Polyhedron_e9a2b78be6811d666fb9d145078d796d) 3601 0 R (classParma__Polyhedra__Library_1_1C__Polyhedron_faae25a26dbecf9341c7fb2c2575f81f) 3604 0 R] +/Limits [(classParma__Polyhedra__Library_1_1C__Polyhedron_c3126925bcd3349b150771d52c19639d) (classParma__Polyhedra__Library_1_1C__Polyhedron_faae25a26dbecf9341c7fb2c2575f81f)] +>> endobj +12318 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Checked__Number) 1422 0 R (classParma__Polyhedra__Library_1_1Checked__Number_00f887bfb5c61faba29a67def563c786) 3787 0 R (classParma__Polyhedra__Library_1_1Checked__Number_02949da26a3761489d2fb98018010990) 3796 0 R (classParma__Polyhedra__Library_1_1Checked__Number_06c0a4ba25cbc3d59797bf1c73c49497) 3846 0 R (classParma__Polyhedra__Library_1_1Checked__Number_0803532e7523865597c394e1371d2b16) 3847 0 R (classParma__Polyhedra__Library_1_1Checked__Number_08ceb442794b5f60c1ad09ce744371e1) 3792 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Checked__Number) (classParma__Polyhedra__Library_1_1Checked__Number_08ceb442794b5f60c1ad09ce744371e1)] +>> endobj +12319 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Checked__Number_0acb1530838a14041c43002dd8ee3541) 3902 0 R (classParma__Polyhedra__Library_1_1Checked__Number_164f8732d5fe6b526a34e168145a95ad) 3746 0 R (classParma__Polyhedra__Library_1_1Checked__Number_16b12775a696c6e304cf9ee7ffe2213e) 4054 0 R (classParma__Polyhedra__Library_1_1Checked__Number_1a79ab4c49d7ae4406b56dc2b3d94463) 3842 0 R (classParma__Polyhedra__Library_1_1Checked__Number_1bdc1023fb4478270594d0e965eb90c9) 3704 0 R (classParma__Polyhedra__Library_1_1Checked__Number_1d723d4d200b4a6a694b141c7b6f408e) 4012 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Checked__Number_0acb1530838a14041c43002dd8ee3541) (classParma__Polyhedra__Library_1_1Checked__Number_1d723d4d200b4a6a694b141c7b6f408e)] +>> endobj +12320 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Checked__Number_2024878c4c26cb836d454e2e93f40c8f) 3700 0 R (classParma__Polyhedra__Library_1_1Checked__Number_24e90bb8bb38d248aca79c76a1717d9d) 3740 0 R (classParma__Polyhedra__Library_1_1Checked__Number_268aa30d717cdc7d07e60cf7c56712e6) 3788 0 R (classParma__Polyhedra__Library_1_1Checked__Number_2857ee1039a41cfab001c0ba21c69ac3) 3795 0 R (classParma__Polyhedra__Library_1_1Checked__Number_298300b8f88eb674c317b99ad09a474b) 3699 0 R (classParma__Polyhedra__Library_1_1Checked__Number_2b39d89b5938161bd8922b7c1f28f637) 3899 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Checked__Number_2024878c4c26cb836d454e2e93f40c8f) (classParma__Polyhedra__Library_1_1Checked__Number_2b39d89b5938161bd8922b7c1f28f637)] +>> endobj +12321 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Checked__Number_2ee8a6019070192609b3ea6e5dfa3018) 4057 0 R (classParma__Polyhedra__Library_1_1Checked__Number_2f03dea4f9d5f0e15e18785cf3dd58a3) 3910 0 R (classParma__Polyhedra__Library_1_1Checked__Number_2f9c525f46f4ff5707b505a88c82aee0) 3952 0 R (classParma__Polyhedra__Library_1_1Checked__Number_307453961ae9779ce9e1e3ebcc94496d) 3959 0 R (classParma__Polyhedra__Library_1_1Checked__Number_33a5462cd5398fdbd61989d17aeeaa72) 3649 0 R (classParma__Polyhedra__Library_1_1Checked__Number_356bd3ccfaa76c0ef4452a34ce767897) 3901 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Checked__Number_2ee8a6019070192609b3ea6e5dfa3018) (classParma__Polyhedra__Library_1_1Checked__Number_356bd3ccfaa76c0ef4452a34ce767897)] +>> endobj +12322 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Checked__Number_3cb9b031ec4e6fd7e53e53da5b0f04a1) 3844 0 R (classParma__Polyhedra__Library_1_1Checked__Number_3de2c410fab852f07f89df5be3d4c118) 3735 0 R (classParma__Polyhedra__Library_1_1Checked__Number_3f5e732694ad7d879ac7eaef0668073a) 3956 0 R (classParma__Polyhedra__Library_1_1Checked__Number_404beea19c04f4e7bbcfe81aae0d6a7d) 3711 0 R (classParma__Polyhedra__Library_1_1Checked__Number_461dbfcb8f68886137794e4a408fc55e) 3705 0 R (classParma__Polyhedra__Library_1_1Checked__Number_4bed59d493c4fd91537602efb267c938) 3697 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Checked__Number_3cb9b031ec4e6fd7e53e53da5b0f04a1) (classParma__Polyhedra__Library_1_1Checked__Number_4bed59d493c4fd91537602efb267c938)] +>> endobj +12323 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Checked__Number_4cca5e272cecc038189aac8b2fc8ace2) 3900 0 R (classParma__Polyhedra__Library_1_1Checked__Number_4ced0eee2a4a2c50779c2d01ef022500) 4059 0 R (classParma__Polyhedra__Library_1_1Checked__Number_4f3206ab2d3c47e2014e5b306167c7c0) 3701 0 R (classParma__Polyhedra__Library_1_1Checked__Number_55e9dfdf5da9a55b7523bda6b7f56c78) 3741 0 R (classParma__Polyhedra__Library_1_1Checked__Number_59638854527a5bebee3676750668c63a) 3794 0 R (classParma__Polyhedra__Library_1_1Checked__Number_6133c234bff425e6feac34cef06b74b2) 4060 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Checked__Number_4cca5e272cecc038189aac8b2fc8ace2) (classParma__Polyhedra__Library_1_1Checked__Number_6133c234bff425e6feac34cef06b74b2)] +>> endobj +12324 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Checked__Number_627ac77a4752fde3c10792ee9f1673a4) 3789 0 R (classParma__Polyhedra__Library_1_1Checked__Number_65b1cc4ac0c0c8a2efcbf3d36d4ac0ac) 3783 0 R (classParma__Polyhedra__Library_1_1Checked__Number_6957dba3dbf92459a364893d7ecfb897) 3707 0 R (classParma__Polyhedra__Library_1_1Checked__Number_6a2d561ac8088ed64a0bb51d8fffcd9b) 3839 0 R (classParma__Polyhedra__Library_1_1Checked__Number_6afe848ad84ff68d48142caf0599760a) 3784 0 R (classParma__Polyhedra__Library_1_1Checked__Number_72ef8379745ed9575b39216ba1e51d18) 3838 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Checked__Number_627ac77a4752fde3c10792ee9f1673a4) (classParma__Polyhedra__Library_1_1Checked__Number_72ef8379745ed9575b39216ba1e51d18)] +>> endobj +12325 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Checked__Number_74b0a8cfdec7831e7a3e296b3e3751dd) 3706 0 R (classParma__Polyhedra__Library_1_1Checked__Number_755f1ffc7dbac4ff01984c02774c9bc6) 3904 0 R (classParma__Polyhedra__Library_1_1Checked__Number_761744f24a8e2faed19912950cf13baf) 3835 0 R (classParma__Polyhedra__Library_1_1Checked__Number_76b5e4c5b9628c14a7d227517b8fb349) 4018 0 R (classParma__Polyhedra__Library_1_1Checked__Number_77a2c5c27e9c0838fea6e6447b20c320) 3710 0 R (classParma__Polyhedra__Library_1_1Checked__Number_798df1392d067294fc936bcfa19745c4) 3955 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Checked__Number_74b0a8cfdec7831e7a3e296b3e3751dd) (classParma__Polyhedra__Library_1_1Checked__Number_798df1392d067294fc936bcfa19745c4)] +>> endobj +12326 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Checked__Number_79a5a323f582c4260790552d3be140fd) 4016 0 R (classParma__Polyhedra__Library_1_1Checked__Number_79f64d099a652834da74cc8fd68f2452) 3745 0 R (classParma__Polyhedra__Library_1_1Checked__Number_7ce6dfd81e04c3eb8d196bf13a96ebe6) 3836 0 R (classParma__Polyhedra__Library_1_1Checked__Number_7e90d52413515d81ad9b68fb1740d869) 3841 0 R (classParma__Polyhedra__Library_1_1Checked__Number_80993a2a72759ec030dd3cde21c8a00d) 3791 0 R (classParma__Polyhedra__Library_1_1Checked__Number_80f6de87ec43c33fac3832b14a507c0b) 3698 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Checked__Number_79a5a323f582c4260790552d3be140fd) (classParma__Polyhedra__Library_1_1Checked__Number_80f6de87ec43c33fac3832b14a507c0b)] +>> endobj +12327 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Checked__Number_84ea81a9b4eed51ac13029dbccf67662) 3903 0 R (classParma__Polyhedra__Library_1_1Checked__Number_8772f767006f16e376d8eca9b1578b73) 3793 0 R (classParma__Polyhedra__Library_1_1Checked__Number_8abdf2e292960e1fb216ce3c2c0816ff) 3742 0 R (classParma__Polyhedra__Library_1_1Checked__Number_91459c49e4f7d7fc2dea0347e0489ce5) 3785 0 R (classParma__Polyhedra__Library_1_1Checked__Number_956de4112c520bb87767ce894b4d512d) 3786 0 R (classParma__Polyhedra__Library_1_1Checked__Number_95ac9759a14fe23bf8d02a621e4e9e5c) 4009 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Checked__Number_84ea81a9b4eed51ac13029dbccf67662) (classParma__Polyhedra__Library_1_1Checked__Number_95ac9759a14fe23bf8d02a621e4e9e5c)] +>> endobj +12328 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Checked__Number_98dae78cdd16f7127a4b3e18c3976562) 3747 0 R (classParma__Polyhedra__Library_1_1Checked__Number_9a28ec8161898b61530de9bbb4a3251d) 2083 0 R (classParma__Polyhedra__Library_1_1Checked__Number_9b45abd63e1255df8341775c8f42b842) 4013 0 R (classParma__Polyhedra__Library_1_1Checked__Number_9c4298d04019ab7b5233ddceb430be03) 3834 0 R (classParma__Polyhedra__Library_1_1Checked__Number_a355ae6b2a2a704e88060541fbaa6562) 4055 0 R (classParma__Polyhedra__Library_1_1Checked__Number_a3de5a2fe7f06d0aa3e4972be2023933) 3738 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Checked__Number_98dae78cdd16f7127a4b3e18c3976562) (classParma__Polyhedra__Library_1_1Checked__Number_a3de5a2fe7f06d0aa3e4972be2023933)] +>> endobj +12329 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Checked__Number_a7885d402d5653321f316029ca0af517) 4061 0 R (classParma__Polyhedra__Library_1_1Checked__Number_a831d9698f64ff610fa1b3341025603a) 3960 0 R (classParma__Polyhedra__Library_1_1Checked__Number_a8f66682c527ff5a5a2496de0e3fb2ec) 3951 0 R (classParma__Polyhedra__Library_1_1Checked__Number_b19be1f26efb21370e8460b325a7f57c) 3750 0 R (classParma__Polyhedra__Library_1_1Checked__Number_b1b19ff2b88ffca75ac27208cdd877a2) 3954 0 R (classParma__Polyhedra__Library_1_1Checked__Number_b45faf2ccad8057c7b27e0c999eb063b) 3790 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Checked__Number_a7885d402d5653321f316029ca0af517) (classParma__Polyhedra__Library_1_1Checked__Number_b45faf2ccad8057c7b27e0c999eb063b)] +>> endobj +12330 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Checked__Number_b4d4a0ebee3fcc93490aa029028a810b) 3703 0 R (classParma__Polyhedra__Library_1_1Checked__Number_b65697a5fab14ca76c391a3aa523e3f6) 3898 0 R (classParma__Polyhedra__Library_1_1Checked__Number_b733c7c83da19667a83c2a3abafa5d05) 4015 0 R (classParma__Polyhedra__Library_1_1Checked__Number_b74908b692bc6f8112f5d27b96141431) 3650 0 R (classParma__Polyhedra__Library_1_1Checked__Number_bb6ca6c02bde2f04d412129e4be9743e) 3909 0 R (classParma__Polyhedra__Library_1_1Checked__Number_be0aef8acc1101523cfbf50ebce7528e) 3961 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Checked__Number_b4d4a0ebee3fcc93490aa029028a810b) (classParma__Polyhedra__Library_1_1Checked__Number_be0aef8acc1101523cfbf50ebce7528e)] +>> endobj +12331 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Checked__Number_bf60cc7fa60d33c4fe958126d55cbac2) 3709 0 R (classParma__Polyhedra__Library_1_1Checked__Number_c0ef828e81a5c7625db3abadcafc8438) 3695 0 R (classParma__Polyhedra__Library_1_1Checked__Number_c32024703f8ac04b6b68ff1761575d2d) 3958 0 R (classParma__Polyhedra__Library_1_1Checked__Number_c62afeb287031d74441101af60be319a) 3950 0 R (classParma__Polyhedra__Library_1_1Checked__Number_c95c1fbaee07d3a9cead4d07683f6168) 3837 0 R (classParma__Polyhedra__Library_1_1Checked__Number_cca11ef67e39b711f96604b6bf806feb) 3702 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Checked__Number_bf60cc7fa60d33c4fe958126d55cbac2) (classParma__Polyhedra__Library_1_1Checked__Number_cca11ef67e39b711f96604b6bf806feb)] +>> endobj +12332 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Checked__Number_cdce8391d61c3090aa51f9d0656524a2) 3906 0 R (classParma__Polyhedra__Library_1_1Checked__Number_d3d8562d66aeed544d8ef75b941e807c) 3957 0 R (classParma__Polyhedra__Library_1_1Checked__Number_d5c5cd5266cf95dcdc0f03d0108168b5) 4056 0 R (classParma__Polyhedra__Library_1_1Checked__Number_d5ff0dd1267079af85d9938bb4a975de) 4011 0 R (classParma__Polyhedra__Library_1_1Checked__Number_d6c64cb3cfad6b8d7fb952e3f85347aa) 3905 0 R (classParma__Polyhedra__Library_1_1Checked__Number_da7d59af059bdfb2e485d341213e6d19) 3953 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Checked__Number_cdce8391d61c3090aa51f9d0656524a2) (classParma__Polyhedra__Library_1_1Checked__Number_da7d59af059bdfb2e485d341213e6d19)] +>> endobj +12333 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Checked__Number_dda98cdf0bda436acac3193162fa53b0) 4017 0 R (classParma__Polyhedra__Library_1_1Checked__Number_de4a5582f82333f20fd6a8be13ff8d7f) 3845 0 R (classParma__Polyhedra__Library_1_1Checked__Number_dfb768d4ea63e2eb5d58aec03b999f17) 3907 0 R (classParma__Polyhedra__Library_1_1Checked__Number_e179c684a9ed7eafbbac1825d17f7daa) 3843 0 R (classParma__Polyhedra__Library_1_1Checked__Number_e3a660d2b2a34f69d2d0cb1cc77f6f69) 3736 0 R (classParma__Polyhedra__Library_1_1Checked__Number_e4bfe4a80fb074c50ec17657eee225e8) 4010 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Checked__Number_dda98cdf0bda436acac3193162fa53b0) (classParma__Polyhedra__Library_1_1Checked__Number_e4bfe4a80fb074c50ec17657eee225e8)] +>> endobj +12334 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Checked__Number_e6fa6e27a794dc71b88169df7f08fcac) 3911 0 R (classParma__Polyhedra__Library_1_1Checked__Number_ed795d57d70d782ccf2a584cce183050) 3737 0 R (classParma__Polyhedra__Library_1_1Checked__Number_f0647cd431d30a9658d4bdc77e32d9e4) 3749 0 R (classParma__Polyhedra__Library_1_1Checked__Number_f1952cf5da3ecbadd8401b948e899a31) 4014 0 R (classParma__Polyhedra__Library_1_1Checked__Number_f2441164b4c23a8203f399f561c9a7c7) 3696 0 R (classParma__Polyhedra__Library_1_1Checked__Number_f47ee9cf59cfac8a346660698c61d113) 3708 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Checked__Number_e6fa6e27a794dc71b88169df7f08fcac) (classParma__Polyhedra__Library_1_1Checked__Number_f47ee9cf59cfac8a346660698c61d113)] +>> endobj +12335 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Checked__Number_f9af63978105e142642222864ce7c3be) 4058 0 R (classParma__Polyhedra__Library_1_1Checked__Number_f9d7eaecf113e25020c55ed0bf79eb03) 3743 0 R (classParma__Polyhedra__Library_1_1Checked__Number_f9daca45c3c1d0d1afd57ab47c6cacd4) 3748 0 R (classParma__Polyhedra__Library_1_1Checked__Number_fad3fbdebb1ba319083c56fa2ae679e6) 3744 0 R (classParma__Polyhedra__Library_1_1Checked__Number_fc3433d8ec297e2d1fbdf559d93f9080) 3840 0 R (classParma__Polyhedra__Library_1_1Checked__Number_fcb46dd5c0701130f067f577f99ef27f) 3739 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Checked__Number_f9af63978105e142642222864ce7c3be) (classParma__Polyhedra__Library_1_1Checked__Number_fcb46dd5c0701130f067f577f99ef27f)] +>> endobj +12336 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Checked__Number_fcba1dd5e579752d6dcc40ef4d5799b8) 3694 0 R (classParma__Polyhedra__Library_1_1Checked__Number_fed617fd6598839b510b46a3857387d4) 3908 0 R (classParma__Polyhedra__Library_1_1Congruence) 1423 0 R (classParma__Polyhedra__Library_1_1Congruence_0ff04e47054c14b2edf29096ecc95ab7) 4199 0 R (classParma__Polyhedra__Library_1_1Congruence_146b211f83e22bd011d3de2e5975073b) 4202 0 R (classParma__Polyhedra__Library_1_1Congruence_29c63b939ed830a0395170835e60beaf) 4256 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Checked__Number_fcba1dd5e579752d6dcc40ef4d5799b8) (classParma__Polyhedra__Library_1_1Congruence_29c63b939ed830a0395170835e60beaf)] +>> endobj +12337 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Congruence_29c6deef0eb3911adbb08d36a8f0b3f2) 4211 0 R (classParma__Polyhedra__Library_1_1Congruence_2c93e938cd478716c7c9e5e9988f7a98) 4163 0 R (classParma__Polyhedra__Library_1_1Congruence_2ca2446f563956eb2b92ddd17e5c0b2c) 4247 0 R (classParma__Polyhedra__Library_1_1Congruence_2cb39e7c88e9e724e7970d0e953f2c81) 4259 0 R (classParma__Polyhedra__Library_1_1Congruence_33e6005a1fe40cb202eb619912c25c3c) 4204 0 R (classParma__Polyhedra__Library_1_1Congruence_39b6f38fff55dd953ec509b3739dd17d) 4196 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Congruence_29c6deef0eb3911adbb08d36a8f0b3f2) (classParma__Polyhedra__Library_1_1Congruence_39b6f38fff55dd953ec509b3739dd17d)] +>> endobj +12338 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Congruence_3a4c3af6146717b3302f467368eafe46) 4166 0 R (classParma__Polyhedra__Library_1_1Congruence_3c9879f0c9dcb81fe1bbf78828509ef6) 4165 0 R (classParma__Polyhedra__Library_1_1Congruence_43983a6ee447e480f8700915bccb4811) 4200 0 R (classParma__Polyhedra__Library_1_1Congruence_484373d269a31c21efae44a83f8be6f0) 4198 0 R (classParma__Polyhedra__Library_1_1Congruence_54cdd6074f90a5623c8ae7ddcfedc5c2) 4284 0 R (classParma__Polyhedra__Library_1_1Congruence_57362a4d56c397575a6d043cdbcec0f9) 4251 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Congruence_3a4c3af6146717b3302f467368eafe46) (classParma__Polyhedra__Library_1_1Congruence_57362a4d56c397575a6d043cdbcec0f9)] +>> endobj +12339 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Congruence_584cb5084fe5479b0c373e3d17fe5ffd) 4164 0 R (classParma__Polyhedra__Library_1_1Congruence_5a207ecd92e9fd8f3b1937a5064746a9) 4206 0 R (classParma__Polyhedra__Library_1_1Congruence_5b3db7ba1765b3a04f8d320968f70447) 4252 0 R (classParma__Polyhedra__Library_1_1Congruence_6609e54e84d50cd074c2dd65f38b47da) 4212 0 R (classParma__Polyhedra__Library_1_1Congruence_6a24743a95176da13995bb6c17151c9b) 4255 0 R (classParma__Polyhedra__Library_1_1Congruence_7415de7b412a5e297810ff35a97a2849) 4283 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Congruence_584cb5084fe5479b0c373e3d17fe5ffd) (classParma__Polyhedra__Library_1_1Congruence_7415de7b412a5e297810ff35a97a2849)] +>> endobj +12340 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Congruence_79c648d88214174287e3763b804f4aaf) 4167 0 R (classParma__Polyhedra__Library_1_1Congruence_7facb7a06ac72f1af2bc514c788f1a38) 4250 0 R (classParma__Polyhedra__Library_1_1Congruence_8aab82f7118966662582f88725ce4735) 4249 0 R (classParma__Polyhedra__Library_1_1Congruence_94b3624c208219e401569cd289049b38) 4203 0 R (classParma__Polyhedra__Library_1_1Congruence__System) 1424 0 R (classParma__Polyhedra__Library_1_1Congruence__System_044dbf593127c9e8cbbbe2a0d169c30c) 4347 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Congruence_79c648d88214174287e3763b804f4aaf) (classParma__Polyhedra__Library_1_1Congruence__System_044dbf593127c9e8cbbbe2a0d169c30c)] +>> endobj +12341 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Congruence__System_067b4c27cf8643f8ded50ebda77da8aa) 4398 0 R (classParma__Polyhedra__Library_1_1Congruence__System_0a4f8e3f3469f021594ea9311c21aadd) 4397 0 R (classParma__Polyhedra__Library_1_1Congruence__System_0bf701759fc56f8fb215c273e53b46ae) 4389 0 R (classParma__Polyhedra__Library_1_1Congruence__System_11de7a0cc309058d6aee273d613c9432) 4439 0 R (classParma__Polyhedra__Library_1_1Congruence__System_1685b5eb65ba36a9e715a8e3344dbcd8) 4390 0 R (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator) 1476 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Congruence__System_067b4c27cf8643f8ded50ebda77da8aa) (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator)] +>> endobj +12342 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_0ac88c873a13c4afa6f99d3d436e13a3) 4517 0 R (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_12f3d0ee3885355092a65262f24d46af) 4489 0 R (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_192ff11375b59075c9ea19a8c2b5511e) 4494 0 R (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_400c02f876d8f4e3f6aef2bfc5fb16cb) 4493 0 R (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_70e56452f6edfc1943b555156e6bf828) 4495 0 R (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_97586e332fd16ccf6e7d642bb4bbf83e) 4516 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_0ac88c873a13c4afa6f99d3d436e13a3) (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_97586e332fd16ccf6e7d642bb4bbf83e)] +>> endobj +12343 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_dca809f9ebacacf70bc610d41bbaff47) 4491 0 R (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_e575efc6c01c4bf9968c7e27bb94951b) 4492 0 R (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_e7c03963759dfdb937135a7f99165361) 4488 0 R (classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_f0ea51d59b5026db43b2edd4cee928ba) 4490 0 R (classParma__Polyhedra__Library_1_1Congruence__System_21f1586e66349acf7aa0d70c77f92b60) 4436 0 R (classParma__Polyhedra__Library_1_1Congruence__System_2e45b62cb223f5a21ced82480712e64f) 4394 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Congruence__System_1_1const__iterator_dca809f9ebacacf70bc610d41bbaff47) (classParma__Polyhedra__Library_1_1Congruence__System_2e45b62cb223f5a21ced82480712e64f)] +>> endobj +12344 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Congruence__System_339fab488002bb5b341e1bb82edee103) 4444 0 R (classParma__Polyhedra__Library_1_1Congruence__System_37857f2dfb7b17609b671f9070be15ca) 4399 0 R (classParma__Polyhedra__Library_1_1Congruence__System_39867871dd0a4fbe2f3cef2695881345) 4351 0 R (classParma__Polyhedra__Library_1_1Congruence__System_3fe60e1a76b2a92143004e52ccfcb7c7) 4387 0 R (classParma__Polyhedra__Library_1_1Congruence__System_535895e2351f7618e9107a38d9285d73) 4352 0 R (classParma__Polyhedra__Library_1_1Congruence__System_548ae200545f7d25b875f190b5611368) 4432 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Congruence__System_339fab488002bb5b341e1bb82edee103) (classParma__Polyhedra__Library_1_1Congruence__System_548ae200545f7d25b875f190b5611368)] +>> endobj +12345 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Congruence__System_562fa08178e809398402920e5e674ff8) 4392 0 R (classParma__Polyhedra__Library_1_1Congruence__System_5c85932f5fb67a78d1faf8165783d5d3) 4391 0 R (classParma__Polyhedra__Library_1_1Congruence__System_5cd2538767045bd89360588c37d2aedb) 4454 0 R (classParma__Polyhedra__Library_1_1Congruence__System_6b5016000dff8b0c774381316acc0a11) 4348 0 R (classParma__Polyhedra__Library_1_1Congruence__System_6e742d7ffa4f4b7037760cf3ebf62348) 4437 0 R (classParma__Polyhedra__Library_1_1Congruence__System_77c72d8473dc3e9856d7ff6c05ce7b07) 4430 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Congruence__System_562fa08178e809398402920e5e674ff8) (classParma__Polyhedra__Library_1_1Congruence__System_77c72d8473dc3e9856d7ff6c05ce7b07)] +>> endobj +12346 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Congruence__System_7f5a110ccdfd8efa5e0eac984f90d753) 4443 0 R (classParma__Polyhedra__Library_1_1Congruence__System_99161b46c175aa485608154dbcc866cb) 4388 0 R (classParma__Polyhedra__Library_1_1Congruence__System_9d7fe3b07d9e1d35c04fa2d81e32bf34) 4350 0 R (classParma__Polyhedra__Library_1_1Congruence__System_9e8a61b2b759dde8f65219688548ffaa) 4393 0 R (classParma__Polyhedra__Library_1_1Congruence__System_a341843d5eadfc196441cad0af63ac9d) 4431 0 R (classParma__Polyhedra__Library_1_1Congruence__System_a83361b2264ca8ed30599dca32447874) 4441 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Congruence__System_7f5a110ccdfd8efa5e0eac984f90d753) (classParma__Polyhedra__Library_1_1Congruence__System_a83361b2264ca8ed30599dca32447874)] +>> endobj +12347 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Congruence__System_b30ab523e337d72baa4edc802452e532) 4346 0 R (classParma__Polyhedra__Library_1_1Congruence__System_cf4cf2f1d8c3e1d339b1eddc94139272) 4349 0 R (classParma__Polyhedra__Library_1_1Congruence__System_d05bc9046303661aa532423ac5a5c16d) 4395 0 R (classParma__Polyhedra__Library_1_1Congruence__System_dd39af06cea8afa45c772e94db8a1309) 4434 0 R (classParma__Polyhedra__Library_1_1Congruence__System_ddf5f330215fb1878018673eff609704) 4385 0 R (classParma__Polyhedra__Library_1_1Congruence__System_e4a4890ceb257496b788e0d31dbf6d7f) 4386 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Congruence__System_b30ab523e337d72baa4edc802452e532) (classParma__Polyhedra__Library_1_1Congruence__System_e4a4890ceb257496b788e0d31dbf6d7f)] +>> endobj +12348 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Congruence__System_ea6d543c90be52299d6ffc57fc9ba5d1) 4396 0 R (classParma__Polyhedra__Library_1_1Congruence__System_ec5860620ae92988c1740dc393064fe7) 4433 0 R (classParma__Polyhedra__Library_1_1Congruence__System_f97f2d43a487ec81e040aec36bbc6ebe) 4438 0 R (classParma__Polyhedra__Library_1_1Congruence__System_fefca839fc7b4d2d166e7a1fe6196fd5) 4384 0 R (classParma__Polyhedra__Library_1_1Congruence_a03b119140132112557907b772102b33) 4208 0 R (classParma__Polyhedra__Library_1_1Congruence_a948df90fc7880e7e52ceef297ee9bbf) 4258 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Congruence__System_ea6d543c90be52299d6ffc57fc9ba5d1) (classParma__Polyhedra__Library_1_1Congruence_a948df90fc7880e7e52ceef297ee9bbf)] +>> endobj +12349 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Congruence_af7dc46b2cfbd6650ac1d2035d331f15) 4261 0 R (classParma__Polyhedra__Library_1_1Congruence_b45e800217e1c61d8595e2ffc51a83ad) 4162 0 R (classParma__Polyhedra__Library_1_1Congruence_b917a480b6afe7e2750aa2862c6783cf) 4207 0 R (classParma__Polyhedra__Library_1_1Congruence_ba7dbedd485eab91821f129132a04723) 4161 0 R (classParma__Polyhedra__Library_1_1Congruence_c26379e5f82fd0223682b11b9e052ea5) 4210 0 R (classParma__Polyhedra__Library_1_1Congruence_c53e4323b140cdd4ba1ac96e7204d93a) 4201 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Congruence_af7dc46b2cfbd6650ac1d2035d331f15) (classParma__Polyhedra__Library_1_1Congruence_c53e4323b140cdd4ba1ac96e7204d93a)] +>> endobj +12350 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Congruence_c8652f34bdfa731c02c1900f62bd5e88) 4285 0 R (classParma__Polyhedra__Library_1_1Congruence_d07dc0dabac5685f9db8d9dc11e513f1) 4248 0 R (classParma__Polyhedra__Library_1_1Congruence_d67d37524d1fb7f31766c0b02cb8591a) 4197 0 R (classParma__Polyhedra__Library_1_1Congruence_deee840f3313b6050d439dbe5fe2fdd7) 4260 0 R (classParma__Polyhedra__Library_1_1Congruence_e0c9395c1ac4d96e245be43fcd76424c) 4282 0 R (classParma__Polyhedra__Library_1_1Congruence_e96eebded76c559c95910dc233c68f06) 4209 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Congruence_c8652f34bdfa731c02c1900f62bd5e88) (classParma__Polyhedra__Library_1_1Congruence_e96eebded76c559c95910dc233c68f06)] +>> endobj +12351 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Congruence_fcf86304f17dc474e1e5bbe0486c1b59) 4257 0 R (classParma__Polyhedra__Library_1_1Constraint) 1477 0 R (classParma__Polyhedra__Library_1_1Constraint_047a99eb91872d19730f4fd14a81f55c) 4627 0 R (classParma__Polyhedra__Library_1_1Constraint_09c8fc0753a389cc42f84c12f7920832) 4620 0 R (classParma__Polyhedra__Library_1_1Constraint_0ab383f3930179982937f7733a283a03) 4566 0 R (classParma__Polyhedra__Library_1_1Constraint_0ab38d6ea061e7c2cb1595ba9cf2fd42) 4621 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Congruence_fcf86304f17dc474e1e5bbe0486c1b59) (classParma__Polyhedra__Library_1_1Constraint_0ab38d6ea061e7c2cb1595ba9cf2fd42)] +>> endobj +12352 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Constraint_0d50a5df6b31c6de90fe366e18e750ff) 4616 0 R (classParma__Polyhedra__Library_1_1Constraint_182ea33f63c0eea708e02a32b0904f30) 4721 0 R (classParma__Polyhedra__Library_1_1Constraint_239b0622fbcfe1638b4246deab2caa29) 4559 0 R (classParma__Polyhedra__Library_1_1Constraint_2679da4dbd5b8c33ef607aee49690c2a) 4570 0 R (classParma__Polyhedra__Library_1_1Constraint_29202eb817eb5c9d59433abeeb4f2eea) 4571 0 R (classParma__Polyhedra__Library_1_1Constraint_2935fff040a5b31930fff594a0b2596d) 4623 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Constraint_0d50a5df6b31c6de90fe366e18e750ff) (classParma__Polyhedra__Library_1_1Constraint_2935fff040a5b31930fff594a0b2596d)] +>> endobj +12353 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Constraint_2fb9117b8937e3d9a9b4d3ae397bb79a) 4703 0 R (classParma__Polyhedra__Library_1_1Constraint_340e8b886fb185bed798dcbc1391c126) 4701 0 R (classParma__Polyhedra__Library_1_1Constraint_36a0c8ccab7923610bd27f637af63e1d) 4521 0 R (classParma__Polyhedra__Library_1_1Constraint_3c1dcd74ba0b2509f45aad45a5d922ce) 4558 0 R (classParma__Polyhedra__Library_1_1Constraint_3c920e734593812d8529bc12be6f503e) 4699 0 R (classParma__Polyhedra__Library_1_1Constraint_423e3bb0d9886c630c3c227def9f2073) 4692 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Constraint_2fb9117b8937e3d9a9b4d3ae397bb79a) (classParma__Polyhedra__Library_1_1Constraint_423e3bb0d9886c630c3c227def9f2073)] +>> endobj +12354 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Constraint_442aecbe0ce384a7c1add146fb125ed6) 4563 0 R (classParma__Polyhedra__Library_1_1Constraint_448b4387171ec166085eb46aacedaad9) 4629 0 R (classParma__Polyhedra__Library_1_1Constraint_4b4c0277d3b6c85ab6633ae9f5e235c6) 4719 0 R (classParma__Polyhedra__Library_1_1Constraint_54742578f3ff98e32e7e15d6b554f13f) 4700 0 R (classParma__Polyhedra__Library_1_1Constraint_600a652347fb8718e0bc05f7230b8d8a) 4631 0 R (classParma__Polyhedra__Library_1_1Constraint_61208276a246a505bd753ffbb568bfe7) 4695 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Constraint_442aecbe0ce384a7c1add146fb125ed6) (classParma__Polyhedra__Library_1_1Constraint_61208276a246a505bd753ffbb568bfe7)] +>> endobj +12355 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Constraint_61bc4f536e4c04b9594e1b6c7e13d76e) 4630 0 R (classParma__Polyhedra__Library_1_1Constraint_66a2134e0f7fc74d62b14f46631dc2c7) 4720 0 R (classParma__Polyhedra__Library_1_1Constraint_6742bd7f3f2cb079b96900dda0147940) 4617 0 R (classParma__Polyhedra__Library_1_1Constraint_745ac1cdddf74c6f387cfbbbc566dc78) 4560 0 R (classParma__Polyhedra__Library_1_1Constraint_78c24741e21a4406ea8ad1588c768147) 4565 0 R (classParma__Polyhedra__Library_1_1Constraint_7bdaff085ea6859cdec9b27bffb6de4b) 4568 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Constraint_61bc4f536e4c04b9594e1b6c7e13d76e) (classParma__Polyhedra__Library_1_1Constraint_7bdaff085ea6859cdec9b27bffb6de4b)] +>> endobj +12356 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Constraint_852f422dfdf14a1e8a97b4dad77f7e36) 4698 0 R (classParma__Polyhedra__Library_1_1Constraint_89943bdfa5424bf7acecc51a7b6949c8) 4697 0 R (classParma__Polyhedra__Library_1_1Constraint_8fb8b2fe343e5afa80edc06bfa31460b) 4527 0 R (classParma__Polyhedra__Library_1_1Constraint_93d5d6abf06ec551294c4c18abb4349d) 4569 0 R (classParma__Polyhedra__Library_1_1Constraint_9960963fb1f8fb56631e0402557065ae) 4564 0 R (classParma__Polyhedra__Library_1_1Constraint_9dc926136daee1f47975434ee45298ec) 4557 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Constraint_852f422dfdf14a1e8a97b4dad77f7e36) (classParma__Polyhedra__Library_1_1Constraint_9dc926136daee1f47975434ee45298ec)] +>> endobj +12357 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Constraint__System) 1478 0 R (classParma__Polyhedra__Library_1_1Constraint__System_1097cf7cb41f29a02ba271abd2f00f5e) 4839 0 R (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator) 1479 0 R (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_311a973ff993328d8cb3627f3af31129) 4916 0 R (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_3e8a8932563dfdc292fde93931f0bf2e) 4917 0 R (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_4fa3c4bbfb1c6905d95c08c2d90af526) 4918 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Constraint__System) (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_4fa3c4bbfb1c6905d95c08c2d90af526)] +>> endobj +12358 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_641015af4c3d3b84184e8ca8dd128b10) 4912 0 R (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_6ba82ff86685d87dd34f4d441a7d769b) 4920 0 R (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_a02f5903786b4da29daecddcb0db6cbf) 4915 0 R (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_b404db5180176140a7600b31616f9a07) 4919 0 R (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_d8c2dc06b66e812182f2b1445940e7ff) 4921 0 R (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_f3c5bf7dd0135194b6c180dcb232ef54) 4913 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_641015af4c3d3b84184e8ca8dd128b10) (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_f3c5bf7dd0135194b6c180dcb232ef54)] +>> endobj +12359 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_fc81dafc5cf15ca9acd8f6a03f66c788) 4914 0 R (classParma__Polyhedra__Library_1_1Constraint__System_2552e7a194f5fb0d591bafb591b91968) 4844 0 R (classParma__Polyhedra__Library_1_1Constraint__System_257775ae01cfcd011aca9bcbccb03da7) 4797 0 R (classParma__Polyhedra__Library_1_1Constraint__System_2b451e6b09162c7c19b0a2ad36545c69) 4846 0 R (classParma__Polyhedra__Library_1_1Constraint__System_314eb5fed86c6bbe4a7223ca8362f0a9) 4838 0 R (classParma__Polyhedra__Library_1_1Constraint__System_3410a53827de9155ac7d6cbd84263364) 4836 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_fc81dafc5cf15ca9acd8f6a03f66c788) (classParma__Polyhedra__Library_1_1Constraint__System_3410a53827de9155ac7d6cbd84263364)] +>> endobj +12360 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Constraint__System_3badc2f43376aa26f481af4800a3515b) 4882 0 R (classParma__Polyhedra__Library_1_1Constraint__System_50423c4391d0c3064787f19661914973) 4798 0 R (classParma__Polyhedra__Library_1_1Constraint__System_5a79ce2b52efebd42da2736164a043ad) 4845 0 R (classParma__Polyhedra__Library_1_1Constraint__System_5cebd3d6d6ec070c47682e77b0248f22) 4842 0 R (classParma__Polyhedra__Library_1_1Constraint__System_61e02a6ed1b9dd0d6d306d76f5da55a2) 4799 0 R (classParma__Polyhedra__Library_1_1Constraint__System_6293b813e42a59a9795cafe0efa762cc) 4875 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Constraint__System_3badc2f43376aa26f481af4800a3515b) (classParma__Polyhedra__Library_1_1Constraint__System_6293b813e42a59a9795cafe0efa762cc)] +>> endobj +12361 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Constraint__System_67f95ed6867827f03a6af0a7334376e3) 4843 0 R (classParma__Polyhedra__Library_1_1Constraint__System_6aec148aa41935a4072c64a43c51c577) 4835 0 R (classParma__Polyhedra__Library_1_1Constraint__System_70e9ad42674d62ed9bd73268e3af7064) 4873 0 R (classParma__Polyhedra__Library_1_1Constraint__System_78a4d5f5e4702a16d6aae656293ec7ad) 4847 0 R (classParma__Polyhedra__Library_1_1Constraint__System_809a4546135123a08f12c0a65fb22241) 4834 0 R (classParma__Polyhedra__Library_1_1Constraint__System_8388d0d6d7ff68c627d516ec17f56b4c) 4837 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Constraint__System_67f95ed6867827f03a6af0a7334376e3) (classParma__Polyhedra__Library_1_1Constraint__System_8388d0d6d7ff68c627d516ec17f56b4c)] +>> endobj +12362 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Constraint__System_92333180e0163e9c87f2220dceef012d) 4800 0 R (classParma__Polyhedra__Library_1_1Constraint__System_964e4bcbbfde58f43977d0a8e686ec35) 4801 0 R (classParma__Polyhedra__Library_1_1Constraint__System_c3223cf8c7d19b02b5e3c04038024b47) 4872 0 R (classParma__Polyhedra__Library_1_1Constraint__System_c92d2324f8ddea454926272e5ccc6dad) 4848 0 R (classParma__Polyhedra__Library_1_1Constraint__System_cd7d1ed2a688f0c6af96e1cff336f933) 4840 0 R (classParma__Polyhedra__Library_1_1Constraint__System_d350b84c25b7c37693d2e7a08d3165ca) 4841 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Constraint__System_92333180e0163e9c87f2220dceef012d) (classParma__Polyhedra__Library_1_1Constraint__System_d350b84c25b7c37693d2e7a08d3165ca)] +>> endobj +12363 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Constraint__System_dd9738866968b13e938d5669dd94a55e) 4881 0 R (classParma__Polyhedra__Library_1_1Constraint__System_dfa7b03e2ac3a6666a7538431f1bdee9) 4833 0 R (classParma__Polyhedra__Library_1_1Constraint__System_ea9a4fb9807eb61cda3eedf8e5a7acae) 4874 0 R (classParma__Polyhedra__Library_1_1Constraint__System_f882ff84afd3c2507e17ffa62ffd20a0) 4880 0 R (classParma__Polyhedra__Library_1_1Constraint_af207e746f4a3dc2722e254612dab3b3) 4622 0 R (classParma__Polyhedra__Library_1_1Constraint_b0f18894c8f97fa0cd38736462f36132) 4567 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Constraint__System_dd9738866968b13e938d5669dd94a55e) (classParma__Polyhedra__Library_1_1Constraint_b0f18894c8f97fa0cd38736462f36132)] +>> endobj +12364 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Constraint_b3186208850238a080373f035cd532cc) 4562 0 R (classParma__Polyhedra__Library_1_1Constraint_b6976f576e6e50941ee7a7b1a737c0eb) 4561 0 R (classParma__Polyhedra__Library_1_1Constraint_bbde4b86cfca3e29a917650f4c9c62d5) 4624 0 R (classParma__Polyhedra__Library_1_1Constraint_bdd61469bc5c6dfc6e97f306a751035c) 4693 0 R (classParma__Polyhedra__Library_1_1Constraint_c7bf9d127644aa14a09eab633e87f544) 4522 0 R (classParma__Polyhedra__Library_1_1Constraint_c9b8aa34a8ed8e2c3c38d0435adff6ab) 4523 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Constraint_b3186208850238a080373f035cd532cc) (classParma__Polyhedra__Library_1_1Constraint_c9b8aa34a8ed8e2c3c38d0435adff6ab)] +>> endobj +12365 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Constraint_c9b8aa34a8ed8e2c3c38d0435adff6ab7491a8ba26958c3e27bed23b7eef1a7e) 4526 0 R (classParma__Polyhedra__Library_1_1Constraint_c9b8aa34a8ed8e2c3c38d0435adff6abb5b32713c840499d9e29facf95a17f41) 4524 0 R (classParma__Polyhedra__Library_1_1Constraint_c9b8aa34a8ed8e2c3c38d0435adff6abc1539389d3643cf986ef5bb99697d1cc) 4525 0 R (classParma__Polyhedra__Library_1_1Constraint_cc5c5125e7237c5913981b99a502f332) 4694 0 R (classParma__Polyhedra__Library_1_1Constraint_cedadd7f7742a18d941ded77da69ba9a) 4722 0 R (classParma__Polyhedra__Library_1_1Constraint_dba3d929f4317a38ad387c5b45a91199) 4626 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Constraint_c9b8aa34a8ed8e2c3c38d0435adff6ab7491a8ba26958c3e27bed23b7eef1a7e) (classParma__Polyhedra__Library_1_1Constraint_dba3d929f4317a38ad387c5b45a91199)] +>> endobj +12366 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Constraint_e3cacddb2450b8b685b8f39936a2b69d) 4689 0 R (classParma__Polyhedra__Library_1_1Constraint_e615df068adfbb40a0b0b7a993579d22) 4690 0 R (classParma__Polyhedra__Library_1_1Constraint_e86d21a6490f299af6229d70cf20c3ba) 4702 0 R (classParma__Polyhedra__Library_1_1Constraint_ea0fedb82a525e6ada13cd7fd2d03225) 4572 0 R (classParma__Polyhedra__Library_1_1Constraint_f06b2331eb3d080794682080b7f7eb1d) 4691 0 R (classParma__Polyhedra__Library_1_1Constraint_f245f065572b31c8ca97e196e45f9cf9) 4696 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Constraint_e3cacddb2450b8b685b8f39936a2b69d) (classParma__Polyhedra__Library_1_1Constraint_f245f065572b31c8ca97e196e45f9cf9)] +>> endobj +12367 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Constraint_f2eb5d22ef23937a261cfe3f6bc435e6) 4628 0 R (classParma__Polyhedra__Library_1_1Constraint_f8fcee7f8582b0afc9115eb1304c24f9) 4573 0 R (classParma__Polyhedra__Library_1_1Constraint_fa6ba487c08199e83a970fc49b53d3d0) 4618 0 R (classParma__Polyhedra__Library_1_1Constraints__Reduction) 1480 0 R (classParma__Polyhedra__Library_1_1Constraints__Reduction_383574ff4028da9048235b061a613b99) 4940 0 R (classParma__Polyhedra__Library_1_1Constraints__Reduction_87f25b7a2988f918a20b3d09047b08ab) 4935 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Constraint_f2eb5d22ef23937a261cfe3f6bc435e6) (classParma__Polyhedra__Library_1_1Constraints__Reduction_87f25b7a2988f918a20b3d09047b08ab)] +>> endobj +12368 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Constraints__Reduction_898fefd81641cf4f6b854e85412a415c) 4936 0 R (classParma__Polyhedra__Library_1_1Determinate) 1481 0 R (classParma__Polyhedra__Library_1_1Determinate_12f9c11414ff84c5f98e089fe1671e4b) 5011 0 R (classParma__Polyhedra__Library_1_1Determinate_162dc548ba77c3b8b0c09b83740b0add) 4968 0 R (classParma__Polyhedra__Library_1_1Determinate_46a0e4adbfa5f07c11b1cefeaeab50a9) 5010 0 R (classParma__Polyhedra__Library_1_1Determinate_6742290bcbdcb397c3a65f92541850c7) 5017 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Constraints__Reduction_898fefd81641cf4f6b854e85412a415c) (classParma__Polyhedra__Library_1_1Determinate_6742290bcbdcb397c3a65f92541850c7)] +>> endobj +12369 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Determinate_68155a8dd4748908068c4f06816ced9e) 4969 0 R (classParma__Polyhedra__Library_1_1Determinate_6a570635ea948e8b83a131c1433f558a) 4967 0 R (classParma__Polyhedra__Library_1_1Determinate_6d81efe6a6302e1b6296be157faeb73e) 4973 0 R (classParma__Polyhedra__Library_1_1Determinate_6e192bab4a848124e98adc8e04f1b780) 4964 0 R (classParma__Polyhedra__Library_1_1Determinate_6e1f5c74ae6b2a7fda7094889aa46300) 5022 0 R (classParma__Polyhedra__Library_1_1Determinate_766f30dae23752bf497bca855ef8b259) 4971 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Determinate_68155a8dd4748908068c4f06816ced9e) (classParma__Polyhedra__Library_1_1Determinate_766f30dae23752bf497bca855ef8b259)] +>> endobj +12370 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Determinate_7698afbb74c4d9ef4a404fd200b9226c) 4966 0 R (classParma__Polyhedra__Library_1_1Determinate_81788a9e6af2cd17a632e4008b4b5634) 5016 0 R (classParma__Polyhedra__Library_1_1Determinate_8a354fa2b600043e51e8556864b69dbf) 5008 0 R (classParma__Polyhedra__Library_1_1Determinate_947140ae6a3b18452b6e69dfcf3daf51) 5012 0 R (classParma__Polyhedra__Library_1_1Determinate_97f31ca582bbc0a736ce5f3167021638) 4970 0 R (classParma__Polyhedra__Library_1_1Determinate_a76dc794cd0a663bebbf8fc0d11d9714) 5015 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Determinate_7698afbb74c4d9ef4a404fd200b9226c) (classParma__Polyhedra__Library_1_1Determinate_a76dc794cd0a663bebbf8fc0d11d9714)] +>> endobj +12371 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Determinate_a894183e37c6f3614ed4938d94a3a7ee) 5014 0 R (classParma__Polyhedra__Library_1_1Determinate_b482b0092b8947168a9cc650e7f5a666) 5013 0 R (classParma__Polyhedra__Library_1_1Determinate_bdd1d97c66bb40b6b396982cc6dfc182) 5041 0 R (classParma__Polyhedra__Library_1_1Determinate_c7a892d14bca002fc1a03f9b8a950850) 4974 0 R (classParma__Polyhedra__Library_1_1Determinate_c8977c97bf04a9145308585bf0f79110) 5023 0 R (classParma__Polyhedra__Library_1_1Determinate_d56183741949b698e9781549d3da5fa5) 5019 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Determinate_a894183e37c6f3614ed4938d94a3a7ee) (classParma__Polyhedra__Library_1_1Determinate_d56183741949b698e9781549d3da5fa5)] +>> endobj +12372 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Determinate_de012d0e50f285077169741e9940f414) 5009 0 R (classParma__Polyhedra__Library_1_1Determinate_e1b84de453a8ba7224dbc5e378011e9b) 5043 0 R (classParma__Polyhedra__Library_1_1Determinate_ebaa837f2ff5fafb87e1e9ceaa9ccfa1) 5018 0 R (classParma__Polyhedra__Library_1_1Determinate_f724448826bbc00406f8f680b31fcaad) 4965 0 R (classParma__Polyhedra__Library_1_1Domain__Product) 1482 0 R (classParma__Polyhedra__Library_1_1GMP__Integer) 1487 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Determinate_de012d0e50f285077169741e9940f414) (classParma__Polyhedra__Library_1_1GMP__Integer)] +>> endobj +12373 0 obj << +/Names [(classParma__Polyhedra__Library_1_1GMP__Integer_01c5bdd401e8bc17ea983d941be2aa49) 5547 0 R (classParma__Polyhedra__Library_1_1GMP__Integer_11810ad660a4aa63766e8ebb0334b7d6) 5514 0 R (classParma__Polyhedra__Library_1_1GMP__Integer_29b14636d21c90e28ee1821666dc1d64) 5515 0 R (classParma__Polyhedra__Library_1_1GMP__Integer_2f220b5f73e79a2e6feab3a97a7e2445) 5516 0 R (classParma__Polyhedra__Library_1_1GMP__Integer_38ab8dc3ca19cacef112ca316bc7ce09) 5546 0 R (classParma__Polyhedra__Library_1_1GMP__Integer_4039bbdc92a28fade431cb98f20b0fa6) 5513 0 R] +/Limits [(classParma__Polyhedra__Library_1_1GMP__Integer_01c5bdd401e8bc17ea983d941be2aa49) (classParma__Polyhedra__Library_1_1GMP__Integer_4039bbdc92a28fade431cb98f20b0fa6)] +>> endobj +12374 0 obj << +/Names [(classParma__Polyhedra__Library_1_1GMP__Integer_6d5c75bcc32f8aea006e8da4b3f736b2) 5536 0 R (classParma__Polyhedra__Library_1_1GMP__Integer_6e613e3f02e896503d38da788ad593b8) 5507 0 R (classParma__Polyhedra__Library_1_1GMP__Integer_7f9dc23eef0ab2ef9d07f4d53177afce) 5517 0 R (classParma__Polyhedra__Library_1_1GMP__Integer_83b02e8cbb5d14a2ebf2843e6551391d) 5545 0 R (classParma__Polyhedra__Library_1_1GMP__Integer_84565fd9471a52f83618d0d5ce461c3c) 5548 0 R (classParma__Polyhedra__Library_1_1GMP__Integer_952922658abcdfb880fcf0a8483c9620) 5518 0 R] +/Limits [(classParma__Polyhedra__Library_1_1GMP__Integer_6d5c75bcc32f8aea006e8da4b3f736b2) (classParma__Polyhedra__Library_1_1GMP__Integer_952922658abcdfb880fcf0a8483c9620)] +>> endobj +12375 0 obj << +/Names [(classParma__Polyhedra__Library_1_1GMP__Integer_9a22818e12d0abab8d8a8e0d3346f51a) 5511 0 R (classParma__Polyhedra__Library_1_1GMP__Integer_aaa520f25230108e6839b82747cae794) 5509 0 R (classParma__Polyhedra__Library_1_1GMP__Integer_b2dfd07539bfb516c7ca2d04460064fa) 5510 0 R (classParma__Polyhedra__Library_1_1GMP__Integer_b8dbbfce1fd68d57df6b05d5cc74c012) 5508 0 R (classParma__Polyhedra__Library_1_1GMP__Integer_cf54a358f4ddf09f56364da87de68a49) 5512 0 R (classParma__Polyhedra__Library_1_1Generator) 1484 0 R] +/Limits [(classParma__Polyhedra__Library_1_1GMP__Integer_9a22818e12d0abab8d8a8e0d3346f51a) (classParma__Polyhedra__Library_1_1Generator)] +>> endobj +12376 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Generator_0c26ae11a4146369ff86288347cc54db) 5212 0 R (classParma__Polyhedra__Library_1_1Generator_0fb144e5f3fb6815e4c28c89883607be) 5217 0 R (classParma__Polyhedra__Library_1_1Generator_10cab5245f80aacd8000d0312730ec03) 5210 0 R (classParma__Polyhedra__Library_1_1Generator_13c726daa7d565ded0b177e24b6d1104) 5109 0 R (classParma__Polyhedra__Library_1_1Generator_1c884f5152f75040139ec3d9ec8ac293) 5101 0 R (classParma__Polyhedra__Library_1_1Generator_2aba27eb7310045e1a35c7e68af01ab2) 5106 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Generator_0c26ae11a4146369ff86288347cc54db) (classParma__Polyhedra__Library_1_1Generator_2aba27eb7310045e1a35c7e68af01ab2)] +>> endobj +12377 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Generator_303b4ed4262469c1834228e0f88dba74) 5209 0 R (classParma__Polyhedra__Library_1_1Generator_3bc88b2886b0b86865186d142e5ee414) 5153 0 R (classParma__Polyhedra__Library_1_1Generator_3f29f8b40d09b17eaa4cbaac069f72a0) 5098 0 R (classParma__Polyhedra__Library_1_1Generator_42867df59ec40173391b76074f9f0fb2) 5113 0 R (classParma__Polyhedra__Library_1_1Generator_4fb7d78e7b37d7f4b99babdc5cc84783) 5100 0 R (classParma__Polyhedra__Library_1_1Generator_5363ddeed325652ee6c064a8936cfe57) 5214 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Generator_303b4ed4262469c1834228e0f88dba74) (classParma__Polyhedra__Library_1_1Generator_5363ddeed325652ee6c064a8936cfe57)] +>> endobj +12378 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Generator_55b76ba0041601d8da38ab5ad619eed5) 5063 0 R (classParma__Polyhedra__Library_1_1Generator_55b76ba0041601d8da38ab5ad619eed505abaa6ff4aa204c25c94719e8a2b6f4) 5065 0 R (classParma__Polyhedra__Library_1_1Generator_55b76ba0041601d8da38ab5ad619eed54312979a12cae5ebb0791496e1ccce7a) 5064 0 R (classParma__Polyhedra__Library_1_1Generator_55b76ba0041601d8da38ab5ad619eed5b7fe867b1243e111ef4364e3ef5b5329) 5066 0 R (classParma__Polyhedra__Library_1_1Generator_55b76ba0041601d8da38ab5ad619eed5bed2d3fff60e7c0b8fc325bf46f9725f) 5067 0 R (classParma__Polyhedra__Library_1_1Generator_584f3fd5a19536644a66818169b16ac6) 5158 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Generator_55b76ba0041601d8da38ab5ad619eed5) (classParma__Polyhedra__Library_1_1Generator_584f3fd5a19536644a66818169b16ac6)] +>> endobj +12379 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Generator_5c56451d80b8c02636854053de9e0440) 5161 0 R (classParma__Polyhedra__Library_1_1Generator_600c942b0a2e94b550ccd84ef9c30928) 5155 0 R (classParma__Polyhedra__Library_1_1Generator_6804f93015ae6e1dc0c2e42e726380c4) 5157 0 R (classParma__Polyhedra__Library_1_1Generator_6b8dae6436867a53e27720ee211f1cc7) 5160 0 R (classParma__Polyhedra__Library_1_1Generator_75190def344d4c1ba6c59a6f0fcf7420) 5219 0 R (classParma__Polyhedra__Library_1_1Generator_775a8cec41b0fcc88689a171f5be8546) 5150 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Generator_5c56451d80b8c02636854053de9e0440) (classParma__Polyhedra__Library_1_1Generator_775a8cec41b0fcc88689a171f5be8546)] +>> endobj +12380 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Generator_77fc44f44b1bdda486e19e30310634e2) 5108 0 R (classParma__Polyhedra__Library_1_1Generator_7c502c8d46ed2f68679404fdfdf8e0bf) 5102 0 R (classParma__Polyhedra__Library_1_1Generator__System) 1485 0 R (classParma__Polyhedra__Library_1_1Generator__System_02b52b4ef5b1806566495cb7b6d35abb) 5391 0 R (classParma__Polyhedra__Library_1_1Generator__System_02e5a05e31a64af8bb2652645f74190d) 5367 0 R (classParma__Polyhedra__Library_1_1Generator__System_071ec60375df0a0f5051dc431f445e37) 5390 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Generator_77fc44f44b1bdda486e19e30310634e2) (classParma__Polyhedra__Library_1_1Generator__System_071ec60375df0a0f5051dc431f445e37)] +>> endobj +12381 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator) 1486 0 R (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_032aca0bd08a3c854d46b4a7c567b41b) 5449 0 R (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_16e25a87d3f2f1a0a454883b84bcf177) 5444 0 R (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_28cff68f198562b6921add86c58008af) 5451 0 R (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_2f74f2b935a0e1900eafe79b7a305a02) 5424 0 R (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_47e2d2f9114f640ca24b3dc68b701152) 5423 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator) (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_47e2d2f9114f640ca24b3dc68b701152)] +>> endobj +12382 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_83d49cacc2666db32082dabdac76acc4) 5446 0 R (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_a2b418d948cce672416e77deb99b45b8) 5447 0 R (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_b2c21b4ce7f4f822e98343689525f1b8) 5448 0 R (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_ead8142c94d4974534e7f0fe10ed63a7) 5450 0 R (classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_fbb0b8b086aaa82499371c7faee19c3b) 5445 0 R (classParma__Polyhedra__Library_1_1Generator__System_25fce97f25e1814c62ec46b7a04ee942) 5364 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Generator__System_1_1const__iterator_83d49cacc2666db32082dabdac76acc4) (classParma__Polyhedra__Library_1_1Generator__System_25fce97f25e1814c62ec46b7a04ee942)] +>> endobj +12383 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Generator__System_2b29f5668213f9171cfdc666ef4142ea) 5360 0 R (classParma__Polyhedra__Library_1_1Generator__System_37abf9e26c109cf608ec7829284883ec) 5369 0 R (classParma__Polyhedra__Library_1_1Generator__System_605b7611d045e0ea0ff47c2ec36c2268) 5318 0 R (classParma__Polyhedra__Library_1_1Generator__System_6135986b7669c295a1855279a9347433) 5354 0 R (classParma__Polyhedra__Library_1_1Generator__System_6b57cf93153051d3aa63c33e34ee4127) 5368 0 R (classParma__Polyhedra__Library_1_1Generator__System_6e9c19c25562f9d1a71523d00b337450) 5392 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Generator__System_2b29f5668213f9171cfdc666ef4142ea) (classParma__Polyhedra__Library_1_1Generator__System_6e9c19c25562f9d1a71523d00b337450)] +>> endobj +12384 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Generator__System_7072dc2f1979eb1198aea49e10bcd59d) 5366 0 R (classParma__Polyhedra__Library_1_1Generator__System_71a39e295673dabbc4661c7c0a2c3445) 5397 0 R (classParma__Polyhedra__Library_1_1Generator__System_7b9d70f9508c08b9a86272878ca03b5f) 5363 0 R (classParma__Polyhedra__Library_1_1Generator__System_804b0e848b19f18d99664d5bbd57a3f1) 5355 0 R (classParma__Polyhedra__Library_1_1Generator__System_9db5a39fe27d6c659e9c6ce626e83dfa) 5319 0 R (classParma__Polyhedra__Library_1_1Generator__System_9fe4a78fa5899317f5a060d7b607b5c1) 5362 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Generator__System_7072dc2f1979eb1198aea49e10bcd59d) (classParma__Polyhedra__Library_1_1Generator__System_9fe4a78fa5899317f5a060d7b607b5c1)] +>> endobj +12385 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Generator__System_a33b89d7143376193110dde339707b0d) 5357 0 R (classParma__Polyhedra__Library_1_1Generator__System_ad63aea0771a124cfb70c8e8e80779a3) 5359 0 R (classParma__Polyhedra__Library_1_1Generator__System_af6afcf59d181946f02b27418d9b651a) 5356 0 R (classParma__Polyhedra__Library_1_1Generator__System_b0063024b3761b3ff89c3f259ebac6fe) 5365 0 R (classParma__Polyhedra__Library_1_1Generator__System_b174d3f8d008aca83801ae0de294528d) 5361 0 R (classParma__Polyhedra__Library_1_1Generator__System_cce6ad80815e7d09970ed92968967585) 5358 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Generator__System_a33b89d7143376193110dde339707b0d) (classParma__Polyhedra__Library_1_1Generator__System_cce6ad80815e7d09970ed92968967585)] +>> endobj +12386 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Generator__System_d53075833d1bde0c9e36dd70afb4b967) 5389 0 R (classParma__Polyhedra__Library_1_1Generator__System_dcd147a1c5474a820c7379514f629fda) 5396 0 R (classParma__Polyhedra__Library_1_1Generator__System_ed024de0dc1ad69e380f706d25740cb0) 5320 0 R (classParma__Polyhedra__Library_1_1Generator_a40eabb29ea4abe082c3a2e6dc820276) 5110 0 R (classParma__Polyhedra__Library_1_1Generator_a98511973ca14e8904e4e2c1f774bd3a) 5215 0 R (classParma__Polyhedra__Library_1_1Generator_b339ccb929a7255295ad19a5b168d5d0) 5099 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Generator__System_d53075833d1bde0c9e36dd70afb4b967) (classParma__Polyhedra__Library_1_1Generator_b339ccb929a7255295ad19a5b168d5d0)] +>> endobj +12387 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Generator_b36bf020da4fb4583e6e1a6b94197cb4) 5159 0 R (classParma__Polyhedra__Library_1_1Generator_bc8ae851f2a0a6260d954b3bd8505249) 5148 0 R (classParma__Polyhedra__Library_1_1Generator_d593d3aa49a632911d8d49c83b3f4985) 5152 0 R (classParma__Polyhedra__Library_1_1Generator_d7552a414d66f92897d12767579fa3ca) 5211 0 R (classParma__Polyhedra__Library_1_1Generator_d8cee05f88ad5aea288c1f6b8bf7cdc7) 5103 0 R (classParma__Polyhedra__Library_1_1Generator_de2531310fd7806c9e4f745cab145926) 5147 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Generator_b36bf020da4fb4583e6e1a6b94197cb4) (classParma__Polyhedra__Library_1_1Generator_de2531310fd7806c9e4f745cab145926)] +>> endobj +12388 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Generator_de98f4e320d7d21e223afb83240b3800) 5107 0 R (classParma__Polyhedra__Library_1_1Generator_e5902ab7e2d3304037a56ecda7fc22a4) 5104 0 R (classParma__Polyhedra__Library_1_1Generator_e6206985cd5536c4dac181de5fb21247) 5213 0 R (classParma__Polyhedra__Library_1_1Generator_e67eb83f2626818420b3201db09e3d58) 5218 0 R (classParma__Polyhedra__Library_1_1Generator_ebb212a14f52ed934059925c1f5f2010) 5154 0 R (classParma__Polyhedra__Library_1_1Generator_eff190ba56f86d3425859043689d499a) 5112 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Generator_de98f4e320d7d21e223afb83240b3800) (classParma__Polyhedra__Library_1_1Generator_eff190ba56f86d3425859043689d499a)] +>> endobj +12389 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Generator_f1827b1f7a42393a2526944530559c5a) 5105 0 R (classParma__Polyhedra__Library_1_1Generator_f1bf8c762c6f36b30f2abcaffe591acb) 5149 0 R (classParma__Polyhedra__Library_1_1Generator_f4abff14e1b88cbb929f0733432477ff) 5216 0 R (classParma__Polyhedra__Library_1_1Generator_fceefab91d648d188e42e5a75a3a977e) 5111 0 R (classParma__Polyhedra__Library_1_1Grid) 495 0 R (classParma__Polyhedra__Library_1_1Grid_0047a6aa4f26d9133b9d741f68384f38) 5721 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Generator_f1827b1f7a42393a2526944530559c5a) (classParma__Polyhedra__Library_1_1Grid_0047a6aa4f26d9133b9d741f68384f38)] +>> endobj +12390 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid_0262a2b32220536d8bc60d84ad8dac4c) 5608 0 R (classParma__Polyhedra__Library_1_1Grid_042613c3f4ad30b298d70143c935d7cd) 5729 0 R (classParma__Polyhedra__Library_1_1Grid_0441c9c3b0ab0d55165bb6b4fd107f64) 5903 0 R (classParma__Polyhedra__Library_1_1Grid_071aa57e439ba4f358c7fd43b03a6a49) 5840 0 R (classParma__Polyhedra__Library_1_1Grid_07bdac3717a59f64634da7d9b1cfaefd) 5947 0 R (classParma__Polyhedra__Library_1_1Grid_092f5c04d267ab5709dda2d3e51aaeb9) 5606 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid_0262a2b32220536d8bc60d84ad8dac4c) (classParma__Polyhedra__Library_1_1Grid_092f5c04d267ab5709dda2d3e51aaeb9)] +>> endobj +12391 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid_0c02302b6281fa91ef9275bd37e43efc) 5611 0 R (classParma__Polyhedra__Library_1_1Grid_0d8ed7a0e48fe76e7221842c780192b0) 5731 0 R (classParma__Polyhedra__Library_1_1Grid_10e3116398b920cb137cf576a073cc68) 5953 0 R (classParma__Polyhedra__Library_1_1Grid_1287b254a91451368e7e2e456f448114) 5777 0 R (classParma__Polyhedra__Library_1_1Grid_145cc7c23d407576222e5af347f401c1) 5783 0 R (classParma__Polyhedra__Library_1_1Grid_1522764599cd8547bfe4ef7e88d8baec) 1257 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid_0c02302b6281fa91ef9275bd37e43efc) (classParma__Polyhedra__Library_1_1Grid_1522764599cd8547bfe4ef7e88d8baec)] +>> endobj +12392 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid_18ec2da355442e02ae67313ed5b48933) 5960 0 R (classParma__Polyhedra__Library_1_1Grid_19422844125a988daaf489cbaff3835b) 5832 0 R (classParma__Polyhedra__Library_1_1Grid_19623ff8cea2239d66331f29c1d0268d) 5615 0 R (classParma__Polyhedra__Library_1_1Grid_1a26d0018999e56d94a7e96db2b6e553) 5992 0 R (classParma__Polyhedra__Library_1_1Grid_1a5606b64a035977b9d76b1932227246) 5720 0 R (classParma__Polyhedra__Library_1_1Grid_1b528a2e8d4d096f62535454e05b74ba) 5955 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid_18ec2da355442e02ae67313ed5b48933) (classParma__Polyhedra__Library_1_1Grid_1b528a2e8d4d096f62535454e05b74ba)] +>> endobj +12393 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid_1ba0bd59426889233904d052224cab76) 5614 0 R (classParma__Polyhedra__Library_1_1Grid_1ba97c180500b43954b09532151f6c9d) 5661 0 R (classParma__Polyhedra__Library_1_1Grid_1cb88a546d32e7b5c07dc25055e33235) 6003 0 R (classParma__Polyhedra__Library_1_1Grid_1d51ba9ca3c3e0bf0042502f40d2e11b) 5990 0 R (classParma__Polyhedra__Library_1_1Grid_214e376adb9dc271c61b58f8b2c927f0) 5833 0 R (classParma__Polyhedra__Library_1_1Grid_2528b5f433e743dda827b1028b6c74cd) 5725 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid_1ba0bd59426889233904d052224cab76) (classParma__Polyhedra__Library_1_1Grid_2528b5f433e743dda827b1028b6c74cd)] +>> endobj +12394 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid_2581586de73769088ece60dc01409a08) 5897 0 R (classParma__Polyhedra__Library_1_1Grid_26f845c3192c71f59cf1c81cd35072c5) 5835 0 R (classParma__Polyhedra__Library_1_1Grid_2a66994a33d910d0fe8daccc6cc017ed) 1256 0 R (classParma__Polyhedra__Library_1_1Grid_2f31170286d3abc2f4867d0b193ae8bc) 5674 0 R (classParma__Polyhedra__Library_1_1Grid_31603d81a2b0571a82c4c79b8c6e4564) 5610 0 R (classParma__Polyhedra__Library_1_1Grid_323efbe5d43695cc65f8cd5935da94dc) 5951 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid_2581586de73769088ece60dc01409a08) (classParma__Polyhedra__Library_1_1Grid_323efbe5d43695cc65f8cd5935da94dc)] +>> endobj +12395 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid_3628b6d6e250d4c6b8301173c6ecc777) 5998 0 R (classParma__Polyhedra__Library_1_1Grid_36cc3783cdc92ab5fc69904c298ed12c) 5675 0 R (classParma__Polyhedra__Library_1_1Grid_3ac47497148e61f3d7a3da09d17a03bf) 5726 0 R (classParma__Polyhedra__Library_1_1Grid_453e51570268eb4d63fc529130a54440) 5667 0 R (classParma__Polyhedra__Library_1_1Grid_470e6a581b91bc6d5a4a6388d1ddde99) 5616 0 R (classParma__Polyhedra__Library_1_1Grid_4d6e94fc9839cd5d455f195f46fc2dcf) 1258 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid_3628b6d6e250d4c6b8301173c6ecc777) (classParma__Polyhedra__Library_1_1Grid_4d6e94fc9839cd5d455f195f46fc2dcf)] +>> endobj +12396 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid_508103dc808fc747a90b573083a60461) 5949 0 R (classParma__Polyhedra__Library_1_1Grid_527ffa31e1581a8beb83a832244dada8) 5612 0 R (classParma__Polyhedra__Library_1_1Grid_53b24395ac61f8b2b2accc5a3900bf69) 5664 0 R (classParma__Polyhedra__Library_1_1Grid_53f980fb1ac8fa21265bec985bd1382f) 5732 0 R (classParma__Polyhedra__Library_1_1Grid_59634a195948ff0617177d0a41e30602) 5719 0 R (classParma__Polyhedra__Library_1_1Grid_596fc5b3ee0d04895aca9139cb6cbcb6) 5908 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid_508103dc808fc747a90b573083a60461) (classParma__Polyhedra__Library_1_1Grid_596fc5b3ee0d04895aca9139cb6cbcb6)] +>> endobj +12397 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid_59af9a947f610641fe02639f76cfc90e) 1259 0 R (classParma__Polyhedra__Library_1_1Grid_5f6fcc1dab2b08eff20b41d1412d1e2d) 6001 0 R (classParma__Polyhedra__Library_1_1Grid_60138f2b5d41fd62c862fdcd7c4a1e61) 5958 0 R (classParma__Polyhedra__Library_1_1Grid_621d377682c2c67051c24b1cc8a03497) 5724 0 R (classParma__Polyhedra__Library_1_1Grid_68665d093308c111817eca341b98d70a) 5838 0 R (classParma__Polyhedra__Library_1_1Grid_6ae1850664122e9917f174d10fd3bf06) 5669 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid_59af9a947f610641fe02639f76cfc90e) (classParma__Polyhedra__Library_1_1Grid_6ae1850664122e9917f174d10fd3bf06)] +>> endobj +12398 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid_6f703ba611b9e5ff613f4df35347ee95) 5672 0 R (classParma__Polyhedra__Library_1_1Grid_726484f44f6e6653f9c0126e94e51ab0) 1252 0 R (classParma__Polyhedra__Library_1_1Grid_727dc2405cfc5f2252e6f21aa0f18074) 5609 0 R (classParma__Polyhedra__Library_1_1Grid_732d3b59f8a0ba21a72877d5fa4b98a5) 5613 0 R (classParma__Polyhedra__Library_1_1Grid_75df0f78d7598dafa946251a04cb5d90) 5956 0 R (classParma__Polyhedra__Library_1_1Grid_7704df6970b9563ef9e51793126c0ae2) 1255 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid_6f703ba611b9e5ff613f4df35347ee95) (classParma__Polyhedra__Library_1_1Grid_7704df6970b9563ef9e51793126c0ae2)] +>> endobj +12399 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid_7fc86a6331f34f34a506ab2b0609ac37) 5997 0 R (classParma__Polyhedra__Library_1_1Grid_7ff92e5d40e6faf667a0b1f6b8fad791) 5957 0 R (classParma__Polyhedra__Library_1_1Grid_803035024ab9670971868f4b1092f7c5) 5671 0 R (classParma__Polyhedra__Library_1_1Grid_82b76e3f18679ea161b53bfa80349009) 5830 0 R (classParma__Polyhedra__Library_1_1Grid_85b2560352485ac05d10aab0ee483252) 5780 0 R (classParma__Polyhedra__Library_1_1Grid_8688fd38682b19e97422816d72524790) 5666 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid_7fc86a6331f34f34a506ab2b0609ac37) (classParma__Polyhedra__Library_1_1Grid_8688fd38682b19e97422816d72524790)] +>> endobj +12400 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid_87d004db7f8febf6f9c96b4a2a1c85e5) 6002 0 R (classParma__Polyhedra__Library_1_1Grid_87e253a2b1d8e1696c2ebf3feb11dc5f) 5775 0 R (classParma__Polyhedra__Library_1_1Grid_880344de195aef75a6b3f2a4db4787b4) 5665 0 R (classParma__Polyhedra__Library_1_1Grid_880be9febc6dab2cdccbec8814c9a952) 1251 0 R (classParma__Polyhedra__Library_1_1Grid_8865893c48cc07adae5dca6b35081751) 5668 0 R (classParma__Polyhedra__Library_1_1Grid_8d2cc5d18d050975101f2860f2919da8) 5734 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid_87d004db7f8febf6f9c96b4a2a1c85e5) (classParma__Polyhedra__Library_1_1Grid_8d2cc5d18d050975101f2860f2919da8)] +>> endobj +12401 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid_8edc85ba3e8a09593959814eaad72499) 5776 0 R (classParma__Polyhedra__Library_1_1Grid_8f97dbc7a7c307fa72f7e904b2cbf21b) 5831 0 R (classParma__Polyhedra__Library_1_1Grid_8fa02815bb561135934f91c9adcd0cb5) 5730 0 R (classParma__Polyhedra__Library_1_1Grid_901082d5c6de5ec4b457df69e41bb70c) 1307 0 R (classParma__Polyhedra__Library_1_1Grid_90ca2b1613fda31a2ac7e79d9388680d) 5663 0 R (classParma__Polyhedra__Library_1_1Grid_90e87cbe8ae0717fa09ff51b70d64b47) 5898 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid_8edc85ba3e8a09593959814eaad72499) (classParma__Polyhedra__Library_1_1Grid_90e87cbe8ae0717fa09ff51b70d64b47)] +>> endobj +12402 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid_943c42b0d1b3580e54b3ab60aa55255f) 5782 0 R (classParma__Polyhedra__Library_1_1Grid_953a608f6f9d413870fb3eee5cc6ad1e) 5784 0 R (classParma__Polyhedra__Library_1_1Grid_9831db06919c6ee05360b08e84cccbb7) 5837 0 R (classParma__Polyhedra__Library_1_1Grid_9bdab8408169307fbd899ec3670cb2bf) 5952 0 R (classParma__Polyhedra__Library_1_1Grid_9e17201a9a12235a9a96cc31cfffd38f) 6004 0 R (classParma__Polyhedra__Library_1_1Grid_9e4e32230b187284ac0b9ca8efba8f82) 5904 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid_943c42b0d1b3580e54b3ab60aa55255f) (classParma__Polyhedra__Library_1_1Grid_9e4e32230b187284ac0b9ca8efba8f82)] +>> endobj +12403 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid_9e87405c740d202951ba788f9e52cbf7) 5781 0 R (classParma__Polyhedra__Library_1_1Grid__Certificate) 1488 0 R (classParma__Polyhedra__Library_1_1Grid__Certificate_3b727ab728f8758af9fb217eca9d791a) 6352 0 R (classParma__Polyhedra__Library_1_1Grid__Certificate_67cbe06cd666025c2ff64652d5824a2f) 6350 0 R (classParma__Polyhedra__Library_1_1Grid__Certificate_869306ea4afb6453b8e9cee36c96f46e) 6355 0 R (classParma__Polyhedra__Library_1_1Grid__Certificate_c03d43b46ab7f9e5d0ea3c46a5eab7b3) 6348 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid_9e87405c740d202951ba788f9e52cbf7) (classParma__Polyhedra__Library_1_1Grid__Certificate_c03d43b46ab7f9e5d0ea3c46a5eab7b3)] +>> endobj +12404 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid__Certificate_cf34edb23c376600051bbc563e4122c4) 6349 0 R (classParma__Polyhedra__Library_1_1Grid__Certificate_df9fc5ac7e45f36bc03af31b98b31a72) 6351 0 R (classParma__Polyhedra__Library_1_1Grid__Generator) 1490 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_00017ad58d66a7948b0355b3e02c750b) 6390 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_041afb1a2cc7277572fb7235cf08cf64) 6480 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_065895a1428f9dc6b3002818686eff0f) 6488 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid__Certificate_cf34edb23c376600051bbc563e4122c4) (classParma__Polyhedra__Library_1_1Grid__Generator_065895a1428f9dc6b3002818686eff0f)] +>> endobj +12405 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid__Generator_081718c23b5785da17c63ffec13536cc) 6476 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_082a74ad0ce931ec2e517bf0f009daa2) 6489 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_0f19da4c46bb8b3be01875eff4c00538) 6440 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_0fafb66fa4df451fd3e2f0392329f27b) 6477 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_10e7c95784e356487a6a6263a89cec66) 5246 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_10e7c95784e356487a6a6263a89cec6625b86c6f0633416506503de2bf693876) 6397 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid__Generator_081718c23b5785da17c63ffec13536cc) (classParma__Polyhedra__Library_1_1Grid__Generator_10e7c95784e356487a6a6263a89cec6625b86c6f0633416506503de2bf693876)] +>> endobj +12406 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid__Generator_10e7c95784e356487a6a6263a89cec664ac3b90df83c2e43249ccfa2702640de) 6396 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_10e7c95784e356487a6a6263a89cec66e9cf46c5e08ead7689807e1c8ba30642) 6395 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_1177f236d8c66c01bbb43b37ff90bc7d) 6391 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_13419c5d820bde20af5eabd23e479ec8) 6433 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_164c38a51c8718e6ac3a3f3e4af77bf0) 6438 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_1a15765e7fd1f486a9ee12a061dc4c76) 6490 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid__Generator_10e7c95784e356487a6a6263a89cec664ac3b90df83c2e43249ccfa2702640de) (classParma__Polyhedra__Library_1_1Grid__Generator_1a15765e7fd1f486a9ee12a061dc4c76)] +>> endobj +12407 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid__Generator_1aabacaac0806d617f53db4b34b3349e) 6394 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_1f0828932daf26d10e94120c1f4a4d6b) 6435 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_2a0bc130f7cf6a0678ee3b982fcc7ab6) 6428 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_3075c67d9868fc0b483db13256fb4e0c) 6503 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_41227446c918730e97998799bfe04da6) 6429 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_58b86510b9c4dc05004c0fc01622430b) 6441 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid__Generator_1aabacaac0806d617f53db4b34b3349e) (classParma__Polyhedra__Library_1_1Grid__Generator_58b86510b9c4dc05004c0fc01622430b)] +>> endobj +12408 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid__Generator_60d9658ef91fbd3a1b0064253246f36b) 6393 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_68e8cef74c6b4b5a56e2c791f41566e4) 6436 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_6fb154017052c68b63121cef49c568ce) 6505 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_76fce1702224700691a26cf5e780a1dd) 6430 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_77123fc17c8bc6d59a76802c0592a2c6) 6439 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_77a904793c99cfb1d61fadd277d59471) 6437 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid__Generator_60d9658ef91fbd3a1b0064253246f36b) (classParma__Polyhedra__Library_1_1Grid__Generator_77a904793c99cfb1d61fadd277d59471)] +>> endobj +12409 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid__Generator_811f6f947785240bcb76bfca023fed17) 6432 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_8ab7b9abebd48fe0ad129a237338aa96) 6504 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System) 1491 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_023dc725ab60578fb2161f06211fa023) 6602 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_102ffa79248502b4998a70fba5f13d98) 6640 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator) 1492 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid__Generator_811f6f947785240bcb76bfca023fed17) (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator)] +>> endobj +12410 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_26673943182a6efc6cc6e3aad8c731a7) 6733 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_2be2c8b9d00f81fc24dcbc36ad05afea) 6729 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_41cb3496510a68512516cf65f8d214c2) 6724 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_47def4dcb522c046a6f3a432d72008ed) 6731 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_61b27b2ed8bbc9a128f9001d160b078d) 6728 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_9571074ab0249afc1e440c8c5eb5d429) 6727 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_26673943182a6efc6cc6e3aad8c731a7) (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_9571074ab0249afc1e440c8c5eb5d429)] +>> endobj +12411 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_9af54d524de94ada872d460c1dbd5cc0) 6725 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_a6e183ba7e931dc88e16fb9ecfa8b3c7) 6730 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_a82cf61e903a201fe8892501b209ab8e) 6726 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_ffa77e724493813cddf9740767c2473e) 6732 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_1f0983add75d3a9c3663fbf925739212) 6646 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_2d0bc3adc78e64aafdab0dd9a292db1f) 6603 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid__Generator__System_1_1const__iterator_9af54d524de94ada872d460c1dbd5cc0) (classParma__Polyhedra__Library_1_1Grid__Generator__System_2d0bc3adc78e64aafdab0dd9a292db1f)] +>> endobj +12412 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid__Generator__System_3ddc697f9236b117382c35d7f7da5419) 6644 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_4254da492e5eeb1c12d8d87b997cd229) 6647 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_465d046e2570dea82e57ab6af9b179e9) 6608 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_494a5dcf815a292978b1864d2d7f77ae) 6642 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_62e7b71f72659356d1d732236ed5f330) 6651 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_63fd965105d740ff7003037964ec7d10) 5426 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid__Generator__System_3ddc697f9236b117382c35d7f7da5419) (classParma__Polyhedra__Library_1_1Grid__Generator__System_63fd965105d740ff7003037964ec7d10)] +>> endobj +12413 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid__Generator__System_642db539e09ba9a9746d490390097d73) 6596 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_6a5f64baba3ae5704d9645db684434d3) 5425 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_6c21214d11e4dc9738dad1f72501a286) 6595 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_72f8cca084e83cace83223ea0ea42bca) 6597 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_8530a0719104225bd022dbe9529ae527) 6650 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_864a52992178820135a7ae3a75e65377) 6670 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid__Generator__System_642db539e09ba9a9746d490390097d73) (classParma__Polyhedra__Library_1_1Grid__Generator__System_864a52992178820135a7ae3a75e65377)] +>> endobj +12414 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid__Generator__System_8a0c95f43fd48c07a63db5efa3564769) 6600 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_8cf170e729ac4e4576624d6ed7d4b44d) 6641 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_8e247a33c9eb40439c706a98c5d363d0) 6677 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_8f29bc3aa01b8f5c67a3323189f9cf9e) 6599 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_90e26e60ccfbe3c6ab8d91b5bf06dab5) 6671 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_998804f094e131a7f06d05c6e9eb5f5c) 6598 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid__Generator__System_8a0c95f43fd48c07a63db5efa3564769) (classParma__Polyhedra__Library_1_1Grid__Generator__System_998804f094e131a7f06d05c6e9eb5f5c)] +>> endobj +12415 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid__Generator__System_9e847f0bfafeac6438cecb2d2114e665) 6605 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_a09a1ddc7936a5377e838cb44610548e) 6638 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_a2e9eec4ddeaf5dca3afa1976d36b703) 6604 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_a8e33c8dd37c45144bf92a6984c7706a) 6648 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_bba3cc93433c6564ba34c1fdd360bde9) 6607 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_c485f37c083be7bc0238a3f5c6c112e3) 6601 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid__Generator__System_9e847f0bfafeac6438cecb2d2114e665) (classParma__Polyhedra__Library_1_1Grid__Generator__System_c485f37c083be7bc0238a3f5c6c112e3)] +>> endobj +12416 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid__Generator__System_c53b2bea17ae404e291cbcb7033dbaf2) 6639 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_c5764ede75697ec70757c5e208945ca2) 6643 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_ce4c05e99016850c16c2bdaff5914afd) 6606 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_d85c523fefc56e289bd9fdf878bb339a) 6678 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_dfc60b971ed974350d241482f15f46ac) 6645 0 R (classParma__Polyhedra__Library_1_1Grid__Generator__System_e64d3d01d4baab5102f00046f941188f) 6676 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid__Generator__System_c53b2bea17ae404e291cbcb7033dbaf2) (classParma__Polyhedra__Library_1_1Grid__Generator__System_e64d3d01d4baab5102f00046f941188f)] +>> endobj +12417 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid__Generator_b1db3272b7beca7b1d9d17f23d22ecbd) 6389 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_ba6b40a4b9708e94d6cd10f54144ed70) 6442 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_c05ff6bef376a2835adbb0ca123a8e79) 6392 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_c061731c4fec7f60c48e02ed9806b4bb) 6487 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_c3e03bc2df621903d136c689c38bdb6f) 6434 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_c74dafaa0b06e9cd3d15ea0d2af1b213) 6479 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid__Generator_b1db3272b7beca7b1d9d17f23d22ecbd) (classParma__Polyhedra__Library_1_1Grid__Generator_c74dafaa0b06e9cd3d15ea0d2af1b213)] +>> endobj +12418 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid__Generator_c915c8d26a7dbcdbbd0c4985ec5b7d4b) 6431 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_cdc0aeddab3d98e336719f42e6e5b06c) 5285 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_e1887d907ab06bddeaa2682bdf94d268) 6485 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_e94a99f8e8d290b5791baa01fd540a14) 6481 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_edf9116549ffcced7a39f4596e65e5d0) 6486 0 R (classParma__Polyhedra__Library_1_1Grid__Generator_f00dd6aeffc847b73a3aee11d6d169b6) 6482 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid__Generator_c915c8d26a7dbcdbbd0c4985ec5b7d4b) (classParma__Polyhedra__Library_1_1Grid__Generator_f00dd6aeffc847b73a3aee11d6d169b6)] +>> endobj +12419 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid__Generator_f4e7705af87f5eb64d2ebdc60cd7a36e) 5270 0 R (classParma__Polyhedra__Library_1_1Grid_a033cfca735240b3699b523d60ad692a) 5727 0 R (classParma__Polyhedra__Library_1_1Grid_a26f672c32271db69ed68fc60eee8cff) 5779 0 R (classParma__Polyhedra__Library_1_1Grid_a28d735beef86789b73b41dbbde71abf) 5676 0 R (classParma__Polyhedra__Library_1_1Grid_a598904833b374d50efc72c51914112c) 5948 0 R (classParma__Polyhedra__Library_1_1Grid_a9c12ecd84df4ed86b5676a09fa39208) 5901 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid__Generator_f4e7705af87f5eb64d2ebdc60cd7a36e) (classParma__Polyhedra__Library_1_1Grid_a9c12ecd84df4ed86b5676a09fa39208)] +>> endobj +12420 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid_b602d97b867b5d2ea800ea7ceef4c6b5) 5900 0 R (classParma__Polyhedra__Library_1_1Grid_b6bba83ceaafdb71df04b77e43bed022) 5906 0 R (classParma__Polyhedra__Library_1_1Grid_bb10ea556dd34e0c1e13f7e99b9efe70) 5841 0 R (classParma__Polyhedra__Library_1_1Grid_c009459805692e582a00d4b5954ab8e5) 5905 0 R (classParma__Polyhedra__Library_1_1Grid_c4e1b49845e553ff84dc73e710def76c) 5954 0 R (classParma__Polyhedra__Library_1_1Grid_c587faeb0edfd2582564b9a8fa3335bd) 1253 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid_b602d97b867b5d2ea800ea7ceef4c6b5) (classParma__Polyhedra__Library_1_1Grid_c587faeb0edfd2582564b9a8fa3335bd)] +>> endobj +12421 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid_c9d9eaf8b76024bc20ce524e13bf86a6) 5836 0 R (classParma__Polyhedra__Library_1_1Grid_ccb5584441a7c7c84de73810cc6afbc4) 1250 0 R (classParma__Polyhedra__Library_1_1Grid_ce98c3e57a1237e6dd5042b5a0919193) 5673 0 R (classParma__Polyhedra__Library_1_1Grid_d09e4e3f9a9da562c6cdb73dd7b47fbe) 5778 0 R (classParma__Polyhedra__Library_1_1Grid_d14942b33fb82bb3e6a13e5e92ada475) 5670 0 R (classParma__Polyhedra__Library_1_1Grid_d42265530a9e3b2f3bda9ab40d4a835b) 5899 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid_c9d9eaf8b76024bc20ce524e13bf86a6) (classParma__Polyhedra__Library_1_1Grid_d42265530a9e3b2f3bda9ab40d4a835b)] +>> endobj +12422 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid_d452407f89cb560e83fb81938c12a585) 6005 0 R (classParma__Polyhedra__Library_1_1Grid_d743f8b71eb68f6b41f7ea7b5d21dc22) 5733 0 R (classParma__Polyhedra__Library_1_1Grid_dc7cdee1981f44b5db23f6c28c79d0a6) 5723 0 R (classParma__Polyhedra__Library_1_1Grid_df002bbcc4dcae5efdb56bae2971a64b) 5617 0 R (classParma__Polyhedra__Library_1_1Grid_e47fdbff76383891b3896ac5fc213d5d) 5950 0 R (classParma__Polyhedra__Library_1_1Grid_e5955a311fc4fde1edf2d5460f0a8356) 5839 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid_d452407f89cb560e83fb81938c12a585) (classParma__Polyhedra__Library_1_1Grid_e5955a311fc4fde1edf2d5460f0a8356)] +>> endobj +12423 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid_e5dc5003b3652660bc4ff4a15e4060af) 5834 0 R (classParma__Polyhedra__Library_1_1Grid_e8d42fcd571a9c9d64f0e7ffe67e995e) 5907 0 R (classParma__Polyhedra__Library_1_1Grid_eb9b562373b4d288c03549bdba93fede) 5994 0 R (classParma__Polyhedra__Library_1_1Grid_ee33974909cfc1cba605734a57d44df0) 5991 0 R (classParma__Polyhedra__Library_1_1Grid_f1ab967a6606266f7e583fc9752667fe) 5829 0 R (classParma__Polyhedra__Library_1_1Grid_f306aa1f4e34bf045cd07e5ac11d8f68) 5618 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid_e5dc5003b3652660bc4ff4a15e4060af) (classParma__Polyhedra__Library_1_1Grid_f306aa1f4e34bf045cd07e5ac11d8f68)] +>> endobj +12424 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid_f39e1b0519a47aafb9dba4121dc41a9c) 5993 0 R (classParma__Polyhedra__Library_1_1Grid_f6df34e5e4ab9beab41cd76897d64c72) 5959 0 R (classParma__Polyhedra__Library_1_1Grid_fa7b390fb34934e419263a5fc694c946) 1254 0 R (classParma__Polyhedra__Library_1_1Grid_fb9d83c4e182f640833116dc2f725076) 5902 0 R (classParma__Polyhedra__Library_1_1Grid_fc06f600e94b7bedb91d0371a51f4c38) 5662 0 R (classParma__Polyhedra__Library_1_1Grid_fde364ce088f82cf2b9a231e7d9f2abc) 5728 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid_f39e1b0519a47aafb9dba4121dc41a9c) (classParma__Polyhedra__Library_1_1Grid_fde364ce088f82cf2b9a231e7d9f2abc)] +>> endobj +12425 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Grid_fe613a3da3edc3cb4506f70d409f061d) 5996 0 R (classParma__Polyhedra__Library_1_1H79__Certificate) 907 0 R (classParma__Polyhedra__Library_1_1H79__Certificate_061c4c3b4f1eef970794b274dae62504) 6756 0 R (classParma__Polyhedra__Library_1_1H79__Certificate_517f4965fd423413531cd1d2058748de) 6760 0 R (classParma__Polyhedra__Library_1_1H79__Certificate_51b29c5dffc073c2d350471ae9bb879f) 6757 0 R (classParma__Polyhedra__Library_1_1H79__Certificate_553c3b19a36235d228039a6bb3452918) 6762 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid_fe613a3da3edc3cb4506f70d409f061d) (classParma__Polyhedra__Library_1_1H79__Certificate_553c3b19a36235d228039a6bb3452918)] +>> endobj +12426 0 obj << +/Names [(classParma__Polyhedra__Library_1_1H79__Certificate_7e6d252ce9557b9d73833ef594f6276b) 6763 0 R (classParma__Polyhedra__Library_1_1H79__Certificate_ab939414cdbcf1ba174334859443a72c) 6759 0 R (classParma__Polyhedra__Library_1_1H79__Certificate_b8bee5e53740adc193668686030bb4bb) 6758 0 R (classParma__Polyhedra__Library_1_1H79__Certificate_efeb88699fb82bb331a2d24ce724bb07) 6761 0 R (classParma__Polyhedra__Library_1_1Interval) 496 0 R (classParma__Polyhedra__Library_1_1Interval_1c76acbe653414cc28fac54c69622446) 6831 0 R] +/Limits [(classParma__Polyhedra__Library_1_1H79__Certificate_7e6d252ce9557b9d73833ef594f6276b) (classParma__Polyhedra__Library_1_1Interval_1c76acbe653414cc28fac54c69622446)] +>> endobj +12427 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Interval_241f107b045949a58b49469a6a09caf9) 6805 0 R (classParma__Polyhedra__Library_1_1Interval_348c6523b219aee93545bb401dc0b813) 6802 0 R (classParma__Polyhedra__Library_1_1Interval_5915be624de343f1598d246ee4f1bc42) 6806 0 R (classParma__Polyhedra__Library_1_1Interval_6a869e3c010e87dff868fb410d4f0a20) 6811 0 R (classParma__Polyhedra__Library_1_1Interval_79370159de3dc1738441b20eff866329) 6833 0 R (classParma__Polyhedra__Library_1_1Interval_a71726a7725f9269553ed9e594b0d74a) 6809 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Interval_241f107b045949a58b49469a6a09caf9) (classParma__Polyhedra__Library_1_1Interval_a71726a7725f9269553ed9e594b0d74a)] +>> endobj +12428 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Interval_aeb70a45d5ee0c7fac5f5d6c659fc69e) 6803 0 R (classParma__Polyhedra__Library_1_1Interval_b5160fe536bd1bc8d42c12de33f40493) 6800 0 R (classParma__Polyhedra__Library_1_1Interval_c3abadf1d96bef1880657113014d46dd) 6830 0 R (classParma__Polyhedra__Library_1_1Interval_ca669c9659132e9fa6adc7a9afbef642) 6810 0 R (classParma__Polyhedra__Library_1_1Interval_e34390c17dbd12de9906817c4b6cf479) 6804 0 R (classParma__Polyhedra__Library_1_1Interval_f3699ea93d8ec71859566480bede9332) 6832 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Interval_aeb70a45d5ee0c7fac5f5d6c659fc69e) (classParma__Polyhedra__Library_1_1Interval_f3699ea93d8ec71859566480bede9332)] +>> endobj +12429 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Interval_fb730d60db4b7e1ddd4c9994ec077cf6) 6801 0 R (classParma__Polyhedra__Library_1_1Linear__Expression) 1540 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_0308fb71a28c28f4e33aabfa9c5d3781) 6986 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_04aff92d245522832391c1704f455992) 6925 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_0651bfc78898bf691898cdb599198ea9) 6980 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_0912217f15a36eb486b243ee592f3379) 6919 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Interval_fb730d60db4b7e1ddd4c9994ec077cf6) (classParma__Polyhedra__Library_1_1Linear__Expression_0912217f15a36eb486b243ee592f3379)] +>> endobj +12430 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Linear__Expression_0dddfc1f0ff6f55a90c4ea8829b9752b) 7055 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_0ed481e43baf024d4a5b5e86e85c4a87) 6914 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_114f91c420cc8060d6834730c8e55721) 6991 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_158df02c8c54fa5a9286836fb01563cd) 6926 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_2666c570468f53609bf420024a12628d) 7049 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_298a32e26d8133869f28560cca4ba73b) 6921 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Linear__Expression_0dddfc1f0ff6f55a90c4ea8829b9752b) (classParma__Polyhedra__Library_1_1Linear__Expression_298a32e26d8133869f28560cca4ba73b)] +>> endobj +12431 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Linear__Expression_2e4d2efe88475a75dab18c7f9fe5e217) 6990 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_32a44c95ae4348ff889b48c309f9eab3) 7047 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_37de3f55cf5e917e32f7f2f9c6d34840) 7058 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_385e4d3cfe442f4fcbeefd9acf5c10eb) 7050 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_3a808cf2742df02d856a8d9882845861) 6917 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_3fc6b9758fbac86e0592d37c23f14b1e) 7059 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Linear__Expression_2e4d2efe88475a75dab18c7f9fe5e217) (classParma__Polyhedra__Library_1_1Linear__Expression_3fc6b9758fbac86e0592d37c23f14b1e)] +>> endobj +12432 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Linear__Expression_4124a10b953c4c49984524875a257f3a) 6924 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_41cdb256f546f09bd317deef44ac0009) 6992 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_49574f120ec3f9fbfda58d6f826587e9) 6985 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_4d372c4dff7d328d3da118817ed3d8b7) 6988 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_5a74ca4d6d20b677bd8e4bf05dd45760) 6881 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_5bb7f6903958069b19f70d1391987a51) 6922 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Linear__Expression_4124a10b953c4c49984524875a257f3a) (classParma__Polyhedra__Library_1_1Linear__Expression_5bb7f6903958069b19f70d1391987a51)] +>> endobj +12433 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Linear__Expression_62b7a88cefba86a6731c6b46487fc28a) 6984 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_65766b549090f6b52281c99cfba9eed3) 7054 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_691b91bcd9b5c336892574e975235de5) 7053 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_6ea3cf85efb71cf62fa3e233c9e9cf7b) 7048 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_6f8cd8fbee64faaa5e47c8e41ba7662e) 5269 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_701574facbfd5461d399dccbc88a2999) 6877 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Linear__Expression_62b7a88cefba86a6731c6b46487fc28a) (classParma__Polyhedra__Library_1_1Linear__Expression_701574facbfd5461d399dccbc88a2999)] +>> endobj +12434 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Linear__Expression_72b6b45299672d85c7984392454296d6) 6989 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_80d43634ca26fd76dcb1fdede6363dc5) 7052 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_8d443d5098921978efd7b625000f3b68) 7046 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_9075dd07574234cc124e6076c272e987) 6994 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_920af28903c20a4a4962761b834d577f) 7057 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_98b5ccd1157e6ec8beec7702af9acb36) 7051 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Linear__Expression_72b6b45299672d85c7984392454296d6) (classParma__Polyhedra__Library_1_1Linear__Expression_98b5ccd1157e6ec8beec7702af9acb36)] +>> endobj +12435 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Linear__Expression_9a14be758de0e77faef8de4a11bd8e8c) 6880 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_9dd6ce1cb02b58fd3b973e40867362ac) 6987 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_a8f43e35dec15be4374b207a9440eb2c) 6915 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_b4396e8bfbdd5831fd37d13c19194cc4) 6993 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_b48b93c69098ab1dccd8d063f9c41575) 6918 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_b82fb79015a9e4959fe801e608b2a0ae) 6876 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Linear__Expression_9a14be758de0e77faef8de4a11bd8e8c) (classParma__Polyhedra__Library_1_1Linear__Expression_b82fb79015a9e4959fe801e608b2a0ae)] +>> endobj +12436 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Linear__Expression_baf335015f8c71026d2bee65ce4d109f) 6981 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_bca5613972564c8ec5c832bc8ff200d6) 6916 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_c1b93dcadc82e52690114301554801b0) 6913 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_e1dfbc8be3858f2423df19c32e043110) 6920 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_e7df198cd5bdd6e9f87192fb3170261f) 6879 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_e9cc837bbae1745ada3780634c73858f) 6878 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Linear__Expression_baf335015f8c71026d2bee65ce4d109f) (classParma__Polyhedra__Library_1_1Linear__Expression_e9cc837bbae1745ada3780634c73858f)] +>> endobj +12437 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Linear__Expression_ea20a64dc7e9dd789fb069c7b8faca16) 6982 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_ede3aa1f7d5925d31d3f66faf655dc66) 6923 0 R (classParma__Polyhedra__Library_1_1Linear__Expression_f5bbfb14fef626aee9f34e71a78c0d7d) 7056 0 R (classParma__Polyhedra__Library_1_1MIP__Problem) 1541 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_0bf7e46a624f9d9df1528ae0b47ad55d) 7213 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_0f5e373c7067f61d03e3a90724a6983a) 7155 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Linear__Expression_ea20a64dc7e9dd789fb069c7b8faca16) (classParma__Polyhedra__Library_1_1MIP__Problem_0f5e373c7067f61d03e3a90724a6983a)] +>> endobj +12438 0 obj << +/Names [(classParma__Polyhedra__Library_1_1MIP__Problem_0f5e373c7067f61d03e3a90724a6983ac4528dcb9794c502cf7c9bd65e9c54ae) 7156 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_162d95e1149e222a317370e2fa25a120) 7208 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_1e73b39b2848f8141aa58219cf97dead) 7264 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_1ee38be62a49852994bf906003b0c23c) 7161 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_1ef2a882e1f0a3121f94eea90a9a16fe) 7258 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_21e9dae374ecb009d8f7f268f5e673e7) 7266 0 R] +/Limits [(classParma__Polyhedra__Library_1_1MIP__Problem_0f5e373c7067f61d03e3a90724a6983ac4528dcb9794c502cf7c9bd65e9c54ae) (classParma__Polyhedra__Library_1_1MIP__Problem_21e9dae374ecb009d8f7f268f5e673e7)] +>> endobj +12439 0 obj << +/Names [(classParma__Polyhedra__Library_1_1MIP__Problem_22183a1ac7a9af9929c6153e2a7a659b) 7267 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_25be5d5e126674d8aca8b9ec828e289f) 7261 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_28dfc886a103ede666395ab45fc7950c) 7289 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_30c23ab257a58da3708591becad2bf1f) 7293 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_3601b97efe162fca1df11d70b0b3d607) 7269 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_3800cc1eb2fb15d0c42dd71740bb661a) 7207 0 R] +/Limits [(classParma__Polyhedra__Library_1_1MIP__Problem_22183a1ac7a9af9929c6153e2a7a659b) (classParma__Polyhedra__Library_1_1MIP__Problem_3800cc1eb2fb15d0c42dd71740bb661a)] +>> endobj +12440 0 obj << +/Names [(classParma__Polyhedra__Library_1_1MIP__Problem_3805575c5d920cbc808cf34e44c11fee) 7200 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_3a010e69cfabe1a026ee21f7639207e3) 7215 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_3aa58c4d8ded71e574db9d1c59533300) 7212 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_40f18b846fb1fe73b63da7fa7cbbbbca) 7202 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_42acbf3b42263a3dc137395dc8fe1421) 7287 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_485bfce228009ebec2a7bd83d695eddd) 7268 0 R] +/Limits [(classParma__Polyhedra__Library_1_1MIP__Problem_3805575c5d920cbc808cf34e44c11fee) (classParma__Polyhedra__Library_1_1MIP__Problem_485bfce228009ebec2a7bd83d695eddd)] +>> endobj +12441 0 obj << +/Names [(classParma__Polyhedra__Library_1_1MIP__Problem_49625522da117289c0312c67060210f2) 7265 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_4d480f0b906eef0c0094c8fabc69a3b3) 7211 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_5da8e430d26c6471590e2c7ae5f7d82e) 7210 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_623847fa141f97cd59f3d85627536379) 7263 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_6ba0be34c122032442a7409f194e157d) 7294 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_7f2b2dce631b12fb46f6f1fa719e6c84) 7270 0 R] +/Limits [(classParma__Polyhedra__Library_1_1MIP__Problem_49625522da117289c0312c67060210f2) (classParma__Polyhedra__Library_1_1MIP__Problem_7f2b2dce631b12fb46f6f1fa719e6c84)] +>> endobj +12442 0 obj << +/Names [(classParma__Polyhedra__Library_1_1MIP__Problem_8a238e31c3b4acf8a023a6346bbf752f) 7259 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_8ccc13c9fa8f27701c935b481a371f89) 7205 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_a4a79e7bb87171b31d49429f9d875dcb) 7201 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_a682606a24cf76b2d13ef9d70b0b4dde) 7162 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_a9f9e9fbb372e1f21bd0472b2db20567) 7204 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_abc43ede7fd0577eaeb7255a0eca232d) 7157 0 R] +/Limits [(classParma__Polyhedra__Library_1_1MIP__Problem_8a238e31c3b4acf8a023a6346bbf752f) (classParma__Polyhedra__Library_1_1MIP__Problem_abc43ede7fd0577eaeb7255a0eca232d)] +>> endobj +12443 0 obj << +/Names [(classParma__Polyhedra__Library_1_1MIP__Problem_abc43ede7fd0577eaeb7255a0eca232d4d21924dceed7aac6368d4bc5affeccf) 7160 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_abc43ede7fd0577eaeb7255a0eca232d6a4badcfd0bb8d6e536fa16b2d5108d0) 7158 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_abc43ede7fd0577eaeb7255a0eca232dfb044a16e827afb114b4a2b9ba86fcbb) 7159 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_abfec033a504656ea05620f485442b1e) 7260 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_b151aa3732a4737e63c5142b42159dc3) 7262 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_b5ff957e959947c6016cd28be6e2fadd) 7256 0 R] +/Limits [(classParma__Polyhedra__Library_1_1MIP__Problem_abc43ede7fd0577eaeb7255a0eca232d4d21924dceed7aac6368d4bc5affeccf) (classParma__Polyhedra__Library_1_1MIP__Problem_b5ff957e959947c6016cd28be6e2fadd)] +>> endobj +12444 0 obj << +/Names [(classParma__Polyhedra__Library_1_1MIP__Problem_bd1a41cf267b29ebf81851eb096dc6de) 7257 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_dda1de457524bc20064ace508201876c) 7152 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_e60e06beac90231262189084333bda57) 7214 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_ea40406b8f95d9ca4f61f23598448cd5) 7216 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_ee0ae23c1027e709991811b8398b9f46) 7163 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_f46e579954688eec46ac0a43029fdaa1) 7206 0 R] +/Limits [(classParma__Polyhedra__Library_1_1MIP__Problem_bd1a41cf267b29ebf81851eb096dc6de) (classParma__Polyhedra__Library_1_1MIP__Problem_f46e579954688eec46ac0a43029fdaa1)] +>> endobj +12445 0 obj << +/Names [(classParma__Polyhedra__Library_1_1MIP__Problem_fc1e5cbd96d9c2819ba1ec2151f3897e) 7253 0 R (classParma__Polyhedra__Library_1_1MIP__Problem_ff27d012a01487b7c9c14a9a3b40d9b1) 7203 0 R (classParma__Polyhedra__Library_1_1NNC__Polyhedron) 477 0 R (classParma__Polyhedra__Library_1_1NNC__Polyhedron_163f5dff452c6cf2e3a0c929eb2b8187) 7408 0 R (classParma__Polyhedra__Library_1_1NNC__Polyhedron_16829d6b83d0c21f3d3e1f87c46ac239) 7363 0 R (classParma__Polyhedra__Library_1_1NNC__Polyhedron_25b59f3491de4996c701bbf044746fe5) 7419 0 R] +/Limits [(classParma__Polyhedra__Library_1_1MIP__Problem_fc1e5cbd96d9c2819ba1ec2151f3897e) (classParma__Polyhedra__Library_1_1NNC__Polyhedron_25b59f3491de4996c701bbf044746fe5)] +>> endobj +12446 0 obj << +/Names [(classParma__Polyhedra__Library_1_1NNC__Polyhedron_2f41d86c5a949d903179e82072854ef4) 7410 0 R (classParma__Polyhedra__Library_1_1NNC__Polyhedron_42e87760e6f69306e6322cc77f20d162) 7415 0 R (classParma__Polyhedra__Library_1_1NNC__Polyhedron_5d2426c9804102311d41fd445b122cf9) 7420 0 R (classParma__Polyhedra__Library_1_1NNC__Polyhedron_60ae86027d4480aec07a5eed85f6977a) 7362 0 R (classParma__Polyhedra__Library_1_1NNC__Polyhedron_691bb5ef88a4c9638034de4c1b9532cc) 7418 0 R (classParma__Polyhedra__Library_1_1NNC__Polyhedron_6b1f2d6606a0b4d4fc8bbde3b24ce553) 7431 0 R] +/Limits [(classParma__Polyhedra__Library_1_1NNC__Polyhedron_2f41d86c5a949d903179e82072854ef4) (classParma__Polyhedra__Library_1_1NNC__Polyhedron_6b1f2d6606a0b4d4fc8bbde3b24ce553)] +>> endobj +12447 0 obj << +/Names [(classParma__Polyhedra__Library_1_1NNC__Polyhedron_7358056031cb08692ae07044715987cd) 7412 0 R (classParma__Polyhedra__Library_1_1NNC__Polyhedron_89d5bd03139c8fcaf1ab035208d680dd) 7413 0 R (classParma__Polyhedra__Library_1_1NNC__Polyhedron_8ee7e3364443dc8cd55f3f6388c81ecf) 7416 0 R (classParma__Polyhedra__Library_1_1NNC__Polyhedron_91cfad066b0e12cdaf7454fe4585cfc5) 7409 0 R (classParma__Polyhedra__Library_1_1NNC__Polyhedron_9bb0903a2b33f94b096f71e604f07648) 7417 0 R (classParma__Polyhedra__Library_1_1NNC__Polyhedron_9dc9e3a464def0e2d929fab9cae6e360) 7411 0 R] +/Limits [(classParma__Polyhedra__Library_1_1NNC__Polyhedron_7358056031cb08692ae07044715987cd) (classParma__Polyhedra__Library_1_1NNC__Polyhedron_9dc9e3a464def0e2d929fab9cae6e360)] +>> endobj +12448 0 obj << +/Names [(classParma__Polyhedra__Library_1_1NNC__Polyhedron_d5c6d64b009045df8248bcb8ffeea69e) 7414 0 R (classParma__Polyhedra__Library_1_1NNC__Polyhedron_ee8ba0ffc68e00046b55e12427c582cd) 7421 0 R (classParma__Polyhedra__Library_1_1NNC__Polyhedron_f5aee1171c6c67b9c57f3949b7b75be8) 7364 0 R (classParma__Polyhedra__Library_1_1No__Reduction) 1542 0 R (classParma__Polyhedra__Library_1_1No__Reduction_5a0edbc51074f6e9e1a908fa292abe13) 7479 0 R (classParma__Polyhedra__Library_1_1No__Reduction_77067a656a3aa9381a93a23dfba036e4) 7478 0 R] +/Limits [(classParma__Polyhedra__Library_1_1NNC__Polyhedron_d5c6d64b009045df8248bcb8ffeea69e) (classParma__Polyhedra__Library_1_1No__Reduction_77067a656a3aa9381a93a23dfba036e4)] +>> endobj +12449 0 obj << +/Names [(classParma__Polyhedra__Library_1_1No__Reduction_f38e352895f910cc9556dc7ac0d8f39d) 7483 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape) 479 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_025902247d9c8b46d92c514c1646ff69) 7886 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_04704288741dbaf6f50e8fc09c43f737) 7527 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_047e2a717168ae129338109f1afc9a7a) 7823 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_09eda1d1953d8f83e4352c6fe78cbded) 7912 0 R] +/Limits [(classParma__Polyhedra__Library_1_1No__Reduction_f38e352895f910cc9556dc7ac0d8f39d) (classParma__Polyhedra__Library_1_1Octagonal__Shape_09eda1d1953d8f83e4352c6fe78cbded)] +>> endobj +12450 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Octagonal__Shape_0a0d8c78069019f44dc34ebab82ecfc6) 7767 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_0a7f222ac228554b369d460087815b87) 7581 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_0a8906c6b7e5b785bd457641007d1359) 7533 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_0d1677ef76c939ca2025722d2ee249e2) 7595 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_0d4db6f54c7332e1a2e0bc85e16ba176) 7775 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_0e09e7efc2f63aba534614086427bf49) 7696 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Octagonal__Shape_0a0d8c78069019f44dc34ebab82ecfc6) (classParma__Polyhedra__Library_1_1Octagonal__Shape_0e09e7efc2f63aba534614086427bf49)] +>> endobj +12451 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Octagonal__Shape_0e90a75aac44c14997804b8911ff7bbb) 7647 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_0e9ecea59dea0ccb1cc3600bc11f1056) 7697 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_100662089d61a01ea43a28a944da266c) 7834 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_1091bf4d0e8ce7672f907cf5e7921120) 7529 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_1169e57865dfa83ffc8cc23071248340) 7831 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_128413fc4c3051aaa9033a8030509ae5) 7835 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Octagonal__Shape_0e90a75aac44c14997804b8911ff7bbb) (classParma__Polyhedra__Library_1_1Octagonal__Shape_128413fc4c3051aaa9033a8030509ae5)] +>> endobj +12452 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Octagonal__Shape_137dcf52993d2ff3dd6e4678b45baf56) 7883 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_173628da404c1dc2c4d423cad7f9f960) 7821 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_196d1efc79437ca1d96b79b7cd60387f) 7771 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_1ae372d4f3b58cfa4af6edd51d845209) 7646 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_1c2f0ae89d7bf247a76c40282f31758e) 7884 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_1c59e94611b71ddd67acd033a05bbbc7) 7882 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Octagonal__Shape_137dcf52993d2ff3dd6e4678b45baf56) (classParma__Polyhedra__Library_1_1Octagonal__Shape_1c59e94611b71ddd67acd033a05bbbc7)] +>> endobj +12453 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Octagonal__Shape_1cd37a76428add108f267548ae76664b) 7699 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_1d780ef5b99cc9752eb322353b7b6b08) 7777 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_204fb0538d07ee8ac3d5f2724419928b) 7829 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_217e4addfae235df12c449320e65f891) 7650 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_22b6ac7ec1477dc82d6db22900b59be2) 7641 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_2560fe5ce16277c4b4db17e951047028) 7888 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Octagonal__Shape_1cd37a76428add108f267548ae76664b) (classParma__Polyhedra__Library_1_1Octagonal__Shape_2560fe5ce16277c4b4db17e951047028)] +>> endobj +12454 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Octagonal__Shape_25f104e58f88e05dfcb905bcd66e493b) 7774 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_2d266342acc104c59dc0046242ccdac8) 7642 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_2f13e4ffe7b47ec50721791877b41622) 7879 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_34dbbfe20e987a3d55c7a3f2d08f1aed) 7833 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_353fe86259fbb2dd09d451e9dd468676) 7636 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_35518da8c480784110d40b680256bd61) 7693 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Octagonal__Shape_25f104e58f88e05dfcb905bcd66e493b) (classParma__Polyhedra__Library_1_1Octagonal__Shape_35518da8c480784110d40b680256bd61)] +>> endobj +12455 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Octagonal__Shape_38da38d0fab7eed9ee09fdb11f88fd15) 7877 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_3905c42e02befd8a894c57abd9f972f5) 7640 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_3b9f6fbac96e03a00d061a2cd2ca2baf) 7525 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_44e10aa0180433db7d19fb8e473dc829) 7776 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_46797ad634dc267c1264aa046c69f9f8) 7538 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_46a4105c8476e5f5260a775777398586) 7643 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Octagonal__Shape_38da38d0fab7eed9ee09fdb11f88fd15) (classParma__Polyhedra__Library_1_1Octagonal__Shape_46a4105c8476e5f5260a775777398586)] +>> endobj +12456 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Octagonal__Shape_46d5dc7df45abdea275f0295fee58c23) 7826 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_51fb0220102e525b11cdb06dcbe322c7) 7878 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_580264341ec83f4bf3d6da1205939b0a) 7701 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_594973c5284386e52b8c33b206a47907) 7700 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_5e4f3b53b4dd4f7f57a13df638b162e4) 7582 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_5e74729a5f7cabef57fb795cc728869c) 7536 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Octagonal__Shape_46d5dc7df45abdea275f0295fee58c23) (classParma__Polyhedra__Library_1_1Octagonal__Shape_5e74729a5f7cabef57fb795cc728869c)] +>> endobj +12457 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Octagonal__Shape_62d44847fe22abb82cbac84a776a9c72) 7911 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_6f27f62cf5d65574cbb44025b1b3e585) 7909 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_6f9c769f48ed91cd71bec247b7733430) 7531 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_6ff5e78b07441619f850114578ca48d5) 7705 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_702b00ff42a88c23ab25eecf0e9acef0) 7773 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_703f57855b17ef63b28f88fe13a51870) 7828 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Octagonal__Shape_62d44847fe22abb82cbac84a776a9c72) (classParma__Polyhedra__Library_1_1Octagonal__Shape_703f57855b17ef63b28f88fe13a51870)] +>> endobj +12458 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Octagonal__Shape_715054228bad30a232707ed0357cdd98) 7910 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_72782e7d9a6612efd73b253b0f862c6b) 7709 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_74d2b64496aa448a85ec0b370cee0977) 7639 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_7ae373e57180f03b09aa0e38d1f19811) 7645 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_7dcb9b448c8c0171e18f29551077d133) 7526 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_81c8a26a02090eb4fb9255dd814514a8) 7596 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Octagonal__Shape_715054228bad30a232707ed0357cdd98) (classParma__Polyhedra__Library_1_1Octagonal__Shape_81c8a26a02090eb4fb9255dd814514a8)] +>> endobj +12459 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Octagonal__Shape_87aadd3a9d47e978a32c9867b13220a4) 7827 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_891529f721ff485fe2ec90ac48952cc6) 7487 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_8a329c1ea10527cde394abab15b67356) 7537 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_8b99abb6e15eedbdb94e2466e8304c52) 7585 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_934cc1f45a6d438f5d468276140cd5a8) 7770 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_96bae54a01fe00bad4306bec61bb4687) 7486 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Octagonal__Shape_87aadd3a9d47e978a32c9867b13220a4) (classParma__Polyhedra__Library_1_1Octagonal__Shape_96bae54a01fe00bad4306bec61bb4687)] +>> endobj +12460 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Octagonal__Shape_9b7061aa20aa4b513216bcdb1a905ce7) 7824 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_a317313059bdf973567d2fcf5e030212) 7703 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_a493e3939364ce0db66b42f0ef6511d0) 7698 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_aae8e418bb3d7a1432117530eaea7ec4) 7637 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_ae058fd9619a17e121c3aab9b0612d81) 7694 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_af0214aee8884dc52be4e061d6b4df94) 7887 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Octagonal__Shape_9b7061aa20aa4b513216bcdb1a905ce7) (classParma__Polyhedra__Library_1_1Octagonal__Shape_af0214aee8884dc52be4e061d6b4df94)] +>> endobj +12461 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Octagonal__Shape_afdd0083c1c10d49e06f4718a826ae1b) 7528 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_b38e5d3ce8cc120ce4b534bc43d90d34) 7532 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_b499fba7b7be2932147748248180e057) 7772 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_b5dfec17f683d1cbe01cfc71d601108c) 7586 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_b7c86f7ff6b09ff72e3ee3382b4c933b) 7589 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_ba8ba56b075b2be7b6309cfaed039070) 7832 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Octagonal__Shape_afdd0083c1c10d49e06f4718a826ae1b) (classParma__Polyhedra__Library_1_1Octagonal__Shape_ba8ba56b075b2be7b6309cfaed039070)] +>> endobj +12462 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Octagonal__Shape_ba9abb279871c30a4f0c6cbb188fecc1) 7769 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_bfb434e3d574f4bd53314ac8749c4731) 7708 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_bfde1aac87d8218fce0fa9b4ea8a5eb1) 7706 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_c2cd6705bce0af4bd9880b990baf1198) 7885 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_c5f6c7896e64b8750e2cd9729c19d66e) 7534 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_c6376a87e99d3cdabaa6ee7542474849) 7702 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Octagonal__Shape_ba9abb279871c30a4f0c6cbb188fecc1) (classParma__Polyhedra__Library_1_1Octagonal__Shape_c6376a87e99d3cdabaa6ee7542474849)] +>> endobj +12463 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Octagonal__Shape_c720d2c0875eba7d87a4068876092025) 7590 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_cb19de0243a618e9bf3d62e2ee04ae01) 7648 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_ccc6c6488ea9d8555ea8e978cf188749) 7768 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_cfec639e917dfd6eb63c4006ac55b807) 7649 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_d423a6ddce01a2f2efb34b826d0de921) 7644 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_d8d04d80653fb850dd92468af1995f97) 7765 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Octagonal__Shape_c720d2c0875eba7d87a4068876092025) (classParma__Polyhedra__Library_1_1Octagonal__Shape_d8d04d80653fb850dd92468af1995f97)] +>> endobj +12464 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Octagonal__Shape_dc269190695c1745ab086168fcf35835) 7695 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_dc326b7c8687b685c42817f7fec425e0) 7592 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_e37107ec8d1402bb69ac6462d7f4646d) 7535 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_e3be22e7dcdf54fdc0fb976fd755d0c7) 7638 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_e85fbe787fa3e172ecf6a63b2847d69a) 7593 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_ec298ee7df246c945e6a56442e04176d) 7707 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Octagonal__Shape_dc269190695c1745ab086168fcf35835) (classParma__Polyhedra__Library_1_1Octagonal__Shape_ec298ee7df246c945e6a56442e04176d)] +>> endobj +12465 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Octagonal__Shape_ed38463ae788879580d6372653452603) 7584 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_f14ea5b6122685afd62a3df786512d77) 7587 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_f1921cd40fb0920e1173cf67418c63fe) 7583 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_f2c70f89a472f7fa34ba64817693776a) 7594 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_f41476c22751c8d79e8599443aea93da) 7830 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_f7fd07f1f8d91c830130c061da7b6c56) 7588 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Octagonal__Shape_ed38463ae788879580d6372653452603) (classParma__Polyhedra__Library_1_1Octagonal__Shape_f7fd07f1f8d91c830130c061da7b6c56)] +>> endobj +12466 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Octagonal__Shape_f9503f2a0fd1535ce7cb9465908006dc) 7530 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_fa62abe41a99d6a01cca319ed860bb5b) 7825 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_fa8decb7c7093c9cde1255a6c1af62d4) 7591 0 R (classParma__Polyhedra__Library_1_1Octagonal__Shape_fea57a711a6b7a5d501112b84b246759) 7704 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product) 498 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_0c2c96efcf10102068f754c608a12427) 8347 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Octagonal__Shape_f9503f2a0fd1535ce7cb9465908006dc) (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_0c2c96efcf10102068f754c608a12427)] +>> endobj +12467 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_0e39243c24d99f8d374f9c14e3da8d98) 8538 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_0ea21bf85aa2e90c449435cfedcef181) 8353 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_1190fcf4794305386f8475f9ac51ce00) 8283 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_15b21e990e26976e615a7d3244ed843e) 8413 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_187bdab1051f58af280af66645ce1fed) 8229 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_19a2fb28254bc142e01f3ee00c27ea89) 8471 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_0e39243c24d99f8d374f9c14e3da8d98) (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_19a2fb28254bc142e01f3ee00c27ea89)] +>> endobj +12468 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_1ae424886d05361c1a78c89dbdd5b7db) 8475 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_1d52cb88936eb0f5bde559b39f8ec42c) 8344 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_1daec40615d5a93ce0de360865d93497) 8181 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_1dc5b9db43a16365ba0773a96fe1b799) 8235 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_201ee4c814267695f31b30be833917bf) 8343 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_21a9e355a53ec45a5a60213fa8c24f2e) 8504 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_1ae424886d05361c1a78c89dbdd5b7db) (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_21a9e355a53ec45a5a60213fa8c24f2e)] +>> endobj +12469 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_269f357fca785afae3774b1e084d9b93) 8503 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_28f6854a94a3a7d58034cb1d51ae9c7c) 8179 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_294875fd6b469d8949f08c24b5893b6e) 8234 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_2b3eb71543b3284872781f0b4481fe39) 8188 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_2b4e2b95a505c70e40370e121cd179a4) 8186 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_2c47f2f619b1d0f322b742891920735f) 8419 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_269f357fca785afae3774b1e084d9b93) (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_2c47f2f619b1d0f322b742891920735f)] +>> endobj +12470 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_2d12805af932544a4fc1575f8db62a3d) 8507 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_2f90e70dbef264e99b7015c0ce7e16fd) 8470 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_2fe458f016db5eeeb95bee46f1800533) 8236 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_343e039e48425126b187827066d12bf2) 8499 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_38a5f3efb1fe599046d2ed48223bfa41) 8231 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_3a031a8e65176b8bd80d2857bd9a68b6) 8348 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_2d12805af932544a4fc1575f8db62a3d) (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_3a031a8e65176b8bd80d2857bd9a68b6)] +>> endobj +12471 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_3a03cd3ea1b11c1c8dbdf462959d79df) 8291 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_3a18eff42a557fd87d59895399c7a13f) 8536 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_3ad1db1c5141d2815c0d849d12548e4c) 8351 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_3b5db50d397654bd1a8d4067d90f7419) 8228 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_3be7b3a04406453631aef24b817565a5) 8240 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_41c9a9dc63e253ac5ed21cbdad4e2640) 8284 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_3a03cd3ea1b11c1c8dbdf462959d79df) (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_41c9a9dc63e253ac5ed21cbdad4e2640)] +>> endobj +12472 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_41d30675a3c28980af0f087b06a1f4c1) 8339 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_425f248891aec4ed7800bd92334fd7c1) 8238 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_43ab45399b7e22ffcd6403b7e59a473c) 8506 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_46f912e8b181561f68062e183005c8bc) 8232 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_4857c775f03d5b4ff084723eed2b5e31) 8180 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_4a53183970490595ac39c8c070601c6f) 8497 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_41d30675a3c28980af0f087b06a1f4c1) (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_4a53183970490595ac39c8c070601c6f)] +>> endobj +12473 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_4ac4e4131c756f0ffce85b9dec7d2b3a) 8500 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_4c7c04e76c758c53feeb8c5cf58638a6) 8473 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_5358c9f367ad37e650d411ab5e558e50) 8294 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_57fc3d9d838fd7e20e80806307452a91) 8463 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_6713cca018bed4091ffafb98ca4833d0) 8178 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_676b331ee61606b74be4cd1f90756839) 8352 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_4ac4e4131c756f0ffce85b9dec7d2b3a) (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_676b331ee61606b74be4cd1f90756839)] +>> endobj +12474 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_6bd361a7c7e187c0ff63c62894e741f8) 8237 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_6d33d9f1d987efe6e333c7ad1993dd5a) 8292 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_732e7355673aa63a2fc22a470a36f707) 8421 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_77a2a8e38120a21ac0d5f19eb6e1668b) 8422 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_78e60691cfc6b6b52a34cc7952380a84) 8296 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_7999968db9fb568980215d2c84393358) 8415 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_6bd361a7c7e187c0ff63c62894e741f8) (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_7999968db9fb568980215d2c84393358)] +>> endobj +12475 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_7a1f9b31c3ed7dc3e7691b9110ddbedb) 8476 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_7a9afaf958c6f9dd09c89bd706dc09b0) 8537 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_7ea45b608af772cd69e2c23d7d62a3cf) 8350 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_804363984fe210abe47624522dfb7a92) 8466 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_885e896b320d1f4285b5dc92a20f8884) 8465 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_888509fe116790d0b9a267e614be10ec) 8295 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_7a1f9b31c3ed7dc3e7691b9110ddbedb) (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_888509fe116790d0b9a267e614be10ec)] +>> endobj +12476 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_8b2ee24610cb804238f33581093948c1) 8414 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_8cdc72dfa85aed4e613f780b02e69e92) 8242 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_8eb19423295d8af4d69f144fc227128f) 8468 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_940db627ef73d29e63fed31acc7553f7) 8412 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_966dadd4ba398fb77b77584e5af698af) 8477 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_97cc0d02a88d52e79cbb6615a3bbab42) 8418 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_8b2ee24610cb804238f33581093948c1) (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_97cc0d02a88d52e79cbb6615a3bbab42)] +>> endobj +12477 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_99247c74022e8d51cd0a2d93a87bcfe5) 8423 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_99dc4fb442b60dc9c694d7abc853a3dc) 8289 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_9a864135634ed49de1aeae3b38ed933a) 8464 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_9bd884fea397d9d6cde6426e6f47cc4e) 8462 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_a2a8683afd33a1d57db43c9db16de1f5) 8508 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_a8128b9910f31bc963842e48c44a863e) 8290 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_99247c74022e8d51cd0a2d93a87bcfe5) (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_a8128b9910f31bc963842e48c44a863e)] +>> endobj +12478 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_ad10819182a33870e4b0a7e3b2bca564) 8282 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_afc9294d3fb5f2c0fd8d4e4d22c283b6) 8349 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_b3ad0a7ad694f4a7724504544aff49fa) 8230 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_b3b8f7e6fdd123f510ba85f4527bdee3) 8502 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_b73df10027395d3b2c9fbd3f3e77944e) 8293 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_b95eae83384d8c6b41b9ed8f9fd16704) 8187 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_ad10819182a33870e4b0a7e3b2bca564) (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_b95eae83384d8c6b41b9ed8f9fd16704)] +>> endobj +12479 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_bb5709426ac80aa0bcf907b4f1d4a577) 8416 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_bc31d844172a202d43d08e299e26322f) 8182 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_c2583843b139ce11b842155b35d60332) 8233 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_c5ec610fb42e16beaac59b537a71f187) 8472 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_c6434b8a020aeda5828830fd4b639277) 8341 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_c7b41dba5d22086cb9715c3f51248f98) 8417 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_bb5709426ac80aa0bcf907b4f1d4a577) (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_c7b41dba5d22086cb9715c3f51248f98)] +>> endobj +12480 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_cbcc65a843515d547f055b687d1e6d5f) 8461 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_cc8d0378d1cb13b5ddc04dd12cf18ebe) 8239 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_d3a8f10409a9fd73afb6691686d6862c) 8342 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_d3e2a76d26bef272d0a13fa3bae9a5c2) 8241 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_d3eb603756ab7be783cd92410ac7aed7) 8183 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_db0fa15c5f30fc4be6a94ce2606208ef) 8354 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_cbcc65a843515d547f055b687d1e6d5f) (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_db0fa15c5f30fc4be6a94ce2606208ef)] +>> endobj +12481 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_db466cb206f1d16d24257a838d130cf2) 8287 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_dca9874a75b5ba09114b8495a23c4edd) 8184 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_de7792cb469ddf1d5d8944bbe7f1f55a) 8512 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_dea57326388915780370a677453778b3) 8467 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_df7bd95cb0014251d60d1fd82c1d3932) 8285 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_dfe66b5a34b84fcf63d1a48777f68e4d) 8474 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_db466cb206f1d16d24257a838d130cf2) (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_dfe66b5a34b84fcf63d1a48777f68e4d)] +>> endobj +12482 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_e274e65fc3f012ab21bcffa3177228c5) 8420 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_e386245235cada70fc797b0747b0d326) 8288 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_ea7119974f9313e4c93908a2955c4186) 8346 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_ef3ebc0ed74af80cd3653321153360bd) 8185 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_f191b9781c37da15b49810d47a838823) 8511 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_faf0bc4f0e0a036dbc3852b3e4490243) 8345 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_e274e65fc3f012ab21bcffa3177228c5) (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_faf0bc4f0e0a036dbc3852b3e4490243)] +>> endobj +12483 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_fb7b94b681c4d195080fa81ed1480cc2) 8286 0 R (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_ffd7d0678df82882b006ea7b02771f98) 8340 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset) 497 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_02a568a0ea643d33f943fb6ab98271c7) 9089 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_062e6c821cbe563825968a30a108f14d) 8861 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_085c8cf54c180f7eaf693904cb6ce68b) 8867 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_fb7b94b681c4d195080fa81ed1480cc2) (classParma__Polyhedra__Library_1_1Pointset__Powerset_085c8cf54c180f7eaf693904cb6ce68b)] +>> endobj +12484 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Pointset__Powerset_0b63a885009bef951c4a57e878b81698) 9094 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_0c8b9e21e6308b5841acc2f1ffef10e6) 9081 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_0f1e6f6f630698056d7e35149796f3e1) 8920 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_112cc024004bb7146ddccaa837664bf5) 8860 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_123c8d12181469abfa5dce562831a218) 8928 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_16579a075dfcd1fa22ac02bcc859353b) 8983 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Pointset__Powerset_0b63a885009bef951c4a57e878b81698) (classParma__Polyhedra__Library_1_1Pointset__Powerset_16579a075dfcd1fa22ac02bcc859353b)] +>> endobj +12485 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Pointset__Powerset_1760892eb5a3f38323cff257495f1711) 8978 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_1773f4a296b1e34a24fc238f84d615c7) 1309 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_17e25309469009012f40ed891a2c3f01) 9136 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_1af6f8ca3539ffa5cff895d30c7d4d7e) 8927 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_1be27ff4f03e00236044253c3ddd43da) 8985 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_1fbcf2de5cd0eeca6b521e70b7d731a7) 8975 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Pointset__Powerset_1760892eb5a3f38323cff257495f1711) (classParma__Polyhedra__Library_1_1Pointset__Powerset_1fbcf2de5cd0eeca6b521e70b7d731a7)] +>> endobj +12486 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Pointset__Powerset_2282182b70472430c77106aecf3c8029) 8919 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_23d4da5a4d3ccbef1d32597a77661ab9) 8873 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_25717d92bb71e83e73c686fb6f231efb) 9085 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_280aacebc757d7ab2a23ff2e282aa10b) 9036 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_2d82b566c9bebad2adaaa3b5ba0e923b) 9042 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_2e81b3aeb6ec2e74bee0cf690d44cd69) 8872 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Pointset__Powerset_2282182b70472430c77106aecf3c8029) (classParma__Polyhedra__Library_1_1Pointset__Powerset_2e81b3aeb6ec2e74bee0cf690d44cd69)] +>> endobj +12487 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Pointset__Powerset_302728bb407aa3c4137332e3275d21fe) 8868 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_32c9572669f8c0490cd714af2731b62a) 9045 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_345c97f889e2b3dae5f12fcc130a8b75) 8866 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_374c1462c19381ba7d0f27f4bbd94a72) 8923 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_3b8a6c571be95e78b20207f732cd0848) 9083 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_3f4e612db0eea52c329f5a6be95197b9) 9129 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Pointset__Powerset_302728bb407aa3c4137332e3275d21fe) (classParma__Polyhedra__Library_1_1Pointset__Powerset_3f4e612db0eea52c329f5a6be95197b9)] +>> endobj +12488 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Pointset__Powerset_440d3df9ebc23e058ec03d5606cecda9) 8812 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_451da71733ac3915319b8bd36744d415) 8980 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_45243459137b3c9e917bde090a48ba01) 8815 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_453d3ceee367754b17c722b66cb03e69) 8917 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_52fc679f0d74857dacafb72b57ab5c37) 9046 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_53fb6133be52cbd02a3fc7573900a95d) 9040 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Pointset__Powerset_440d3df9ebc23e058ec03d5606cecda9) (classParma__Polyhedra__Library_1_1Pointset__Powerset_53fb6133be52cbd02a3fc7573900a95d)] +>> endobj +12489 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Pointset__Powerset_5468429667edd0199d41c11d79d3d9b7) 8869 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_57be1b41dad904bf9936df4560df720b) 9035 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_5c527292c276945f5ce0bdc9b41ed37c) 8982 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_5ef6af0a8b11cc47f885ffc74e7be5b8) 8922 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_6069a2503278c2ba8d0f3c5b80dba198) 8977 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_60b58548061b148441614897071b152f) 8979 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Pointset__Powerset_5468429667edd0199d41c11d79d3d9b7) (classParma__Polyhedra__Library_1_1Pointset__Powerset_60b58548061b148441614897071b152f)] +>> endobj +12490 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Pointset__Powerset_61834f7d3b6629c2aafc5011c258961b) 8926 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_632c2bfa8f851855c68d4c919e1cd237) 8915 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_64edddaeda5b87632fc0d37fd0f56749) 8761 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_69571f990b874f16d0f62235088427ca) 9139 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_6a10411642132d2a11144719a8cec9fb) 8809 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_6f42f2d4a41b935d5441c51351faffa6) 8976 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Pointset__Powerset_61834f7d3b6629c2aafc5011c258961b) (classParma__Polyhedra__Library_1_1Pointset__Powerset_6f42f2d4a41b935d5441c51351faffa6)] +>> endobj +12491 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Pointset__Powerset_6f68d17132551d9a40f661fcd911b482) 9044 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_7153c25dfa21af48271dd46e7e7cde7f) 9037 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_723455890ff6a03f145169e411c83289) 9043 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_74dabf047d8ef99e4088e5c410d34e6f) 9138 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_75b26365a17a571d891fe7d0b5ded447) 8921 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_77ae7142afc112b5cc786f24875cc336) 8914 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Pointset__Powerset_6f68d17132551d9a40f661fcd911b482) (classParma__Polyhedra__Library_1_1Pointset__Powerset_77ae7142afc112b5cc786f24875cc336)] +>> endobj +12492 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Pointset__Powerset_786d96ab353d022f56f211fa26e76766) 8918 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_7ba23c56994f511973d468959040f4a6) 8981 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_7ba29a874c71bb8631504b25945713d3) 8929 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_82341fbea6e1c21a80058424c0ccf2d0) 8814 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_91dc05df4b7c844f1f6c9c5419db5635) 9082 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_96712b6e1b0c6ef2ef36177eba8a5f7b) 9041 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Pointset__Powerset_786d96ab353d022f56f211fa26e76766) (classParma__Polyhedra__Library_1_1Pointset__Powerset_96712b6e1b0c6ef2ef36177eba8a5f7b)] +>> endobj +12493 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Pointset__Powerset_9846bc1d16b42521b6cda0e8a4799115) 8764 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_98d288c85ce5c2e32cee27f20c6ce7ac) 8924 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_9cbdb37b93b7d66e66a19df8f46a71f7) 8762 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_9f616c59b2d80aab9f11db8f3c63883c) 8806 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_a04426c5a10bb84d277c580d8377a8ca) 1308 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_a34fb5a16a8af56089e3a09b86263a08) 8916 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Pointset__Powerset_9846bc1d16b42521b6cda0e8a4799115) (classParma__Polyhedra__Library_1_1Pointset__Powerset_a34fb5a16a8af56089e3a09b86263a08)] +>> endobj +12494 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Pointset__Powerset_a944a73dab7e82a786f12d860def325e) 9092 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_aaf96fa77980ed96433261f5dd4c8f5a) 1312 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_ac2ae1578a08e1613a4e7ddfa0f4b711) 1311 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_b6db0040a47381b41656b2846ce782fc) 8816 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_bb6956f4cc086675f02d421fef46122d) 8810 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_bcfc281c9ef2a45bcfad5ed4a1109b8e) 8813 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Pointset__Powerset_a944a73dab7e82a786f12d860def325e) (classParma__Polyhedra__Library_1_1Pointset__Powerset_bcfc281c9ef2a45bcfad5ed4a1109b8e)] +>> endobj +12495 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Pointset__Powerset_c262e9c3acc2920c3e3df6fab7852753) 9137 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_c3d56f02e252446c5844465d94068227) 9038 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_c4e8228056b829aa7e0e05e1b292d2c3) 8807 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_c878ab15837984ba2930ef42fa81dc5a) 9087 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_cab49f11748c7473f15388191159a798) 8984 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_cb90cd62d5a91523a0f7f7d17a7d380b) 9093 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Pointset__Powerset_c262e9c3acc2920c3e3df6fab7852753) (classParma__Polyhedra__Library_1_1Pointset__Powerset_cb90cd62d5a91523a0f7f7d17a7d380b)] +>> endobj +12496 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Pointset__Powerset_cbcd7cd19d71e22f0a8deb3dfc536462) 8925 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_cd523ec773dc09fcf2c3ebbbd70b3bc5) 8865 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_cecce63184c4367b7e48cd7f35b29adb) 8859 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_d00fd827006fff19ba3d2bec4da28267) 8974 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_d43b1f8f4b622041e8719a0b26c4a2d2) 8863 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_d64b9c9ef7488b49c4f9a4acd3f57491) 9091 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Pointset__Powerset_cbcd7cd19d71e22f0a8deb3dfc536462) (classParma__Polyhedra__Library_1_1Pointset__Powerset_d64b9c9ef7488b49c4f9a4acd3f57491)] +>> endobj +12497 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Pointset__Powerset_d6f64ccc36541cf23baca88a68ad06d7) 9135 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_d7e1698be31b1b95dc7e28d13ec162d5) 9127 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_d850947fe33d1adad7b33c58ab859ce0) 8858 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_d9bdf9f5b0e6b90d5c0c173ada762067) 8871 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_ddf613a0448b642291d5e60910983a81) 8817 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_def9cf2f5c18bf5fc72e2648e848f8e2) 8763 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Pointset__Powerset_d6f64ccc36541cf23baca88a68ad06d7) (classParma__Polyhedra__Library_1_1Pointset__Powerset_def9cf2f5c18bf5fc72e2648e848f8e2)] +>> endobj +12498 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Pointset__Powerset_df9133b519b04cad51e09ebb9332cddd) 9090 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_e315cd842b8a3bd48d730eba070969b0) 8808 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_e45ed9165f98258083b2337c3872acee) 9088 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_ebb4df2fa553f9a75fc23f4a3d8aa084) 8760 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_ef0c072f344fd2a732e792578091cc9d) 8870 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_f4416e25871d6e2ee1fd5a09a1f9c343) 9039 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Pointset__Powerset_df9133b519b04cad51e09ebb9332cddd) (classParma__Polyhedra__Library_1_1Pointset__Powerset_f4416e25871d6e2ee1fd5a09a1f9c343)] +>> endobj +12499 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Pointset__Powerset_f4f6e42cf5b4be24e73efab004e22a34) 8862 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_f6ef577d2302b2baac4689f8766cfb2f) 1310 0 R (classParma__Polyhedra__Library_1_1Pointset__Powerset_ff1c6d17be391cb22a9c4d4e0fa0feb8) 8811 0 R (classParma__Polyhedra__Library_1_1Poly__Con__Relation) 1543 0 R (classParma__Polyhedra__Library_1_1Poly__Con__Relation_1dd09c87a931132dbee52ea24266866a) 9387 0 R (classParma__Polyhedra__Library_1_1Poly__Con__Relation_4cc725a9fe3bdaded2c131bb8bb47ed8) 9380 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Pointset__Powerset_f4f6e42cf5b4be24e73efab004e22a34) (classParma__Polyhedra__Library_1_1Poly__Con__Relation_4cc725a9fe3bdaded2c131bb8bb47ed8)] +>> endobj +12500 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Poly__Con__Relation_553ae81ae234cedad36e72b32c967e65) 9384 0 R (classParma__Polyhedra__Library_1_1Poly__Con__Relation_62827195c6aeacf38a8fb3df6df8ff2e) 9385 0 R (classParma__Polyhedra__Library_1_1Poly__Con__Relation_80b9d602f99df76039d58032b20041d7) 9382 0 R (classParma__Polyhedra__Library_1_1Poly__Con__Relation_825bf274e880e1c8d51b42d32c69004e) 9415 0 R (classParma__Polyhedra__Library_1_1Poly__Con__Relation_9f09728ae53c8e3dadeb202f28bb6fdb) 9386 0 R (classParma__Polyhedra__Library_1_1Poly__Con__Relation_a317e5d2d782c3589c48cb3b45d6790d) 9381 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Poly__Con__Relation_553ae81ae234cedad36e72b32c967e65) (classParma__Polyhedra__Library_1_1Poly__Con__Relation_a317e5d2d782c3589c48cb3b45d6790d)] +>> endobj +12501 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Poly__Con__Relation_a4b60ce3ac62aee15faac1b5035fdb4d) 9378 0 R (classParma__Polyhedra__Library_1_1Poly__Con__Relation_b92b75d150bd5fbfc03cadec75d59e0f) 9379 0 R (classParma__Polyhedra__Library_1_1Poly__Con__Relation_b9da0d811233cfb64481a7fe08b7f645) 9421 0 R (classParma__Polyhedra__Library_1_1Poly__Con__Relation_c8b0d22ea3470020b35240f778c34a94) 9410 0 R (classParma__Polyhedra__Library_1_1Poly__Con__Relation_d1bc9d7804925b15f8205df0b3efc8a4) 9419 0 R (classParma__Polyhedra__Library_1_1Poly__Con__Relation_f00b427f47054a80d236d124443c580c) 9422 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Poly__Con__Relation_a4b60ce3ac62aee15faac1b5035fdb4d) (classParma__Polyhedra__Library_1_1Poly__Con__Relation_f00b427f47054a80d236d124443c580c)] +>> endobj +12502 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Poly__Con__Relation_f7184f692efc0672e3213f6be9d5cf4c) 9417 0 R (classParma__Polyhedra__Library_1_1Poly__Gen__Relation) 1544 0 R (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_0ca2fc9566495b3d4ac6b970a301d9a1) 9451 0 R (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_306699ac7d5f2c2c909c3a3baf303009) 9474 0 R (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_419ea78710f4b45c1542647e1212a3f7) 9450 0 R (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_4f7df2a0b66616d7672e562fa8c4e8f6) 9449 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Poly__Con__Relation_f7184f692efc0672e3213f6be9d5cf4c) (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_4f7df2a0b66616d7672e562fa8c4e8f6)] +>> endobj +12503 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Poly__Gen__Relation_5740d23d50b9aa7c95e8b6b51242258d) 9476 0 R (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_6d5d2010157ae8f712e4a3e551d355d7) 9478 0 R (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_8ede6a8a55e35d1c41065b01afac0342) 9447 0 R (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_a303fa28c55c391afe4f067f91db36ce) 9448 0 R (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_af9d682418e536d9a1f6bd24991e1c56) 9453 0 R (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_d99eb5124bfcd9c75379efdde73d1a1a) 9480 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Poly__Gen__Relation_5740d23d50b9aa7c95e8b6b51242258d) (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_d99eb5124bfcd9c75379efdde73d1a1a)] +>> endobj +12504 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Poly__Gen__Relation_de82782e3363de460caad677b3583559) 9482 0 R (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_f78754c1ef47797c0acbd31cf48f9caf) 9454 0 R (classParma__Polyhedra__Library_1_1Polyhedron) 1545 0 R (classParma__Polyhedra__Library_1_1Polyhedron_0514c2e57ac8154666e9fe6bb56c0e18) 9576 0 R (classParma__Polyhedra__Library_1_1Polyhedron_08e91d11b3deb5b694356b5573d2547a) 9750 0 R (classParma__Polyhedra__Library_1_1Polyhedron_0a5c586d872f15baf7fd70941fc16c41) 9629 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Poly__Gen__Relation_de82782e3363de460caad677b3583559) (classParma__Polyhedra__Library_1_1Polyhedron_0a5c586d872f15baf7fd70941fc16c41)] +>> endobj +12505 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Polyhedron_0c58bbc8bf8db5f570da3db42a0ae2f7) 9848 0 R (classParma__Polyhedra__Library_1_1Polyhedron_0d69bc8c9bd9843262551c7e3e33f5a2) 9568 0 R (classParma__Polyhedra__Library_1_1Polyhedron_0d9abbf681b7b0724963d97596286ae5) 9572 0 R (classParma__Polyhedra__Library_1_1Polyhedron_13f15417d90174f6c2d3648e83d9fcf5) 9628 0 R (classParma__Polyhedra__Library_1_1Polyhedron_1956a63a72283d208851d3fe2b11989b) 1345 0 R (classParma__Polyhedra__Library_1_1Polyhedron_1a3647877302fc6e0e583b8b881a7a4f) 9808 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Polyhedron_0c58bbc8bf8db5f570da3db42a0ae2f7) (classParma__Polyhedra__Library_1_1Polyhedron_1a3647877302fc6e0e583b8b881a7a4f)] +>> endobj +12506 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Polyhedron_1c64e09d6022054690f7d2bdf4e02138) 1313 0 R (classParma__Polyhedra__Library_1_1Polyhedron_1cecffe684d1faa9b0f6b8d4f227e9ae) 9907 0 R (classParma__Polyhedra__Library_1_1Polyhedron_1d7db8ee4d8972c1818a36d6517ebbff) 9851 0 R (classParma__Polyhedra__Library_1_1Polyhedron_236a18fe8cc922d00ee92a6c6e42f923) 9678 0 R (classParma__Polyhedra__Library_1_1Polyhedron_281b8db6a8e0014ab2c41dd15f8c0708) 9807 0 R (classParma__Polyhedra__Library_1_1Polyhedron_2aaf9117efebc52a8b45b787075a9647) 1344 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Polyhedron_1c64e09d6022054690f7d2bdf4e02138) (classParma__Polyhedra__Library_1_1Polyhedron_2aaf9117efebc52a8b45b787075a9647)] +>> endobj +12507 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Polyhedron_2bf7987a6ee3547c1e125e83e432ee2a) 9522 0 R (classParma__Polyhedra__Library_1_1Polyhedron_304e74729ca34fc67648cbc995e1dfc7) 1316 0 R (classParma__Polyhedra__Library_1_1Polyhedron_31d70a625e092dfdaed4f3232701f35d) 9581 0 R (classParma__Polyhedra__Library_1_1Polyhedron_3569a428ad758dc9ac8273e0f1f77772) 9676 0 R (classParma__Polyhedra__Library_1_1Polyhedron_371deb67f73bf27ac9a7ff6f2216db9c) 9754 0 R (classParma__Polyhedra__Library_1_1Polyhedron_3b49993a1cd4fc6891da88a6259b9f93) 9857 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Polyhedron_2bf7987a6ee3547c1e125e83e432ee2a) (classParma__Polyhedra__Library_1_1Polyhedron_3b49993a1cd4fc6891da88a6259b9f93)] +>> endobj +12508 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Polyhedron_3c1e5a2419a5f4a5cf89133606ed1680) 9681 0 R (classParma__Polyhedra__Library_1_1Polyhedron_43cd840b1ec99350c222b3f217739cea) 9518 0 R (classParma__Polyhedra__Library_1_1Polyhedron_4b428098e57a9101473a54cd71a0753f) 9684 0 R (classParma__Polyhedra__Library_1_1Polyhedron_4c11206af59b0f6a5471aded55d20961) 9815 0 R (classParma__Polyhedra__Library_1_1Polyhedron_4f514edad990412bd66cc666347103ab) 9749 0 R (classParma__Polyhedra__Library_1_1Polyhedron_4f9a47ba1b29f1e07a32542584d50686) 9633 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Polyhedron_3c1e5a2419a5f4a5cf89133606ed1680) (classParma__Polyhedra__Library_1_1Polyhedron_4f9a47ba1b29f1e07a32542584d50686)] +>> endobj +12509 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Polyhedron_50e1047c49fffb06bc5089a06a051a3d) 9751 0 R (classParma__Polyhedra__Library_1_1Polyhedron_527e7c81841bbcf1963c6e260dadfe01) 9812 0 R (classParma__Polyhedra__Library_1_1Polyhedron_547a8d96908afe5a7f9e4ba2e10d7ac8) 9849 0 R (classParma__Polyhedra__Library_1_1Polyhedron_5d53d09dcc839672fedd4ab5d4142d57) 9630 0 R (classParma__Polyhedra__Library_1_1Polyhedron_5df26655af3ae7844569d7086edf8332) 9626 0 R (classParma__Polyhedra__Library_1_1Polyhedron_5dfef947c46e234a1ffd4707312332ec) 9516 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Polyhedron_50e1047c49fffb06bc5089a06a051a3d) (classParma__Polyhedra__Library_1_1Polyhedron_5dfef947c46e234a1ffd4707312332ec)] +>> endobj +12510 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Polyhedron_6187dbe974649c7bd4de8e66f70d3e46) 9577 0 R (classParma__Polyhedra__Library_1_1Polyhedron_672b0568e7a27c37b3afde649f7c0171) 9745 0 R (classParma__Polyhedra__Library_1_1Polyhedron_67a7d08f3cda46f7a743d46f3a6f33b5) 9913 0 R (classParma__Polyhedra__Library_1_1Polyhedron_6b737abc8f33b2a2362e3f9c9ab08d58) 9859 0 R (classParma__Polyhedra__Library_1_1Polyhedron_6c7c72e56241da463eaeccdff79b6d49) 9853 0 R (classParma__Polyhedra__Library_1_1Polyhedron_6e73a7d462d6a9a3891fff6c4a923495) 9625 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Polyhedron_6187dbe974649c7bd4de8e66f70d3e46) (classParma__Polyhedra__Library_1_1Polyhedron_6e73a7d462d6a9a3891fff6c4a923495)] +>> endobj +12511 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Polyhedron_6e9d9dd7740b414d407c16687c99a88e) 9804 0 R (classParma__Polyhedra__Library_1_1Polyhedron_6fb94f0e966e97bfb9dcf43dddcf12ba) 9524 0 R (classParma__Polyhedra__Library_1_1Polyhedron_7366f9b91109b63f078e963bccd9f5b4) 9806 0 R (classParma__Polyhedra__Library_1_1Polyhedron_73cb0d61cccb259e06b68d4f83deb6d7) 9856 0 R (classParma__Polyhedra__Library_1_1Polyhedron_787615432c9f1d6aac5a6394aea8cfa9) 9336 0 R (classParma__Polyhedra__Library_1_1Polyhedron_7a8abcefdfb125b7c9ef5f96d352c1df) 1319 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Polyhedron_6e9d9dd7740b414d407c16687c99a88e) (classParma__Polyhedra__Library_1_1Polyhedron_7a8abcefdfb125b7c9ef5f96d352c1df)] +>> endobj +12512 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Polyhedron_7b8d597a3c23af1fce9d8d3e1d36e11d) 9520 0 R (classParma__Polyhedra__Library_1_1Polyhedron_7df62db3bf13024d4ee9f8aaf0d27dc6) 9631 0 R (classParma__Polyhedra__Library_1_1Polyhedron_7e4bbfa6f481ead40e3ca6231e0f69be) 1320 0 R (classParma__Polyhedra__Library_1_1Polyhedron_7e68bea365fe939d08c91ec4edc61a2b) 9740 0 R (classParma__Polyhedra__Library_1_1Polyhedron_8132d1a9b329271fb4f7faeb59c89c39) 9683 0 R (classParma__Polyhedra__Library_1_1Polyhedron_858e0030826ee6c29545a934166874ef) 9906 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Polyhedron_7b8d597a3c23af1fce9d8d3e1d36e11d) (classParma__Polyhedra__Library_1_1Polyhedron_858e0030826ee6c29545a934166874ef)] +>> endobj +12513 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Polyhedron_86d2bbceaa288f2f605ac88516d313cb) 9862 0 R (classParma__Polyhedra__Library_1_1Polyhedron_87ebe6f7cd176227f61c6d0fe47a4f68) 9814 0 R (classParma__Polyhedra__Library_1_1Polyhedron_8af124edba7c75bc76ec394405aa893e) 9912 0 R (classParma__Polyhedra__Library_1_1Polyhedron_8c33b9ea975535b5aa0882241cf78986) 9570 0 R (classParma__Polyhedra__Library_1_1Polyhedron_8ed700f662722cbebdc9328344ba2839) 9571 0 R (classParma__Polyhedra__Library_1_1Polyhedron_96e902093a55f87f0aebc2bb13a8d740) 9675 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Polyhedron_86d2bbceaa288f2f605ac88516d313cb) (classParma__Polyhedra__Library_1_1Polyhedron_96e902093a55f87f0aebc2bb13a8d740)] +>> endobj +12514 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Polyhedron_97011210c7f0b2efa0f837ef2da6c5b3) 1346 0 R (classParma__Polyhedra__Library_1_1Polyhedron_9764ef2f159cfdcca3f151e899bd43ef) 9811 0 R (classParma__Polyhedra__Library_1_1Polyhedron_97ddb3b93ac699eebaca7e79f691b0ad) 9519 0 R (classParma__Polyhedra__Library_1_1Polyhedron_98c785602c5af8f7e0c1be92bb5e8b71) 9805 0 R (classParma__Polyhedra__Library_1_1Polyhedron_9a45b4b8f148a20359a2f3e2b1c2cb2d) 9673 0 R (classParma__Polyhedra__Library_1_1Polyhedron_9ca6b6eed07fd3b72119b8ea58328e5e) 9682 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Polyhedron_97011210c7f0b2efa0f837ef2da6c5b3) (classParma__Polyhedra__Library_1_1Polyhedron_9ca6b6eed07fd3b72119b8ea58328e5e)] +>> endobj +12515 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Polyhedron_9f3c5474494eb306717bc3da7c109307) 9575 0 R (classParma__Polyhedra__Library_1_1Polyhedron_a0ac997a15935821583174de968e5bff) 9573 0 R (classParma__Polyhedra__Library_1_1Polyhedron_a26e1a5815b7a0c3b610395c854594bf) 9680 0 R (classParma__Polyhedra__Library_1_1Polyhedron_a38fbbd15d5dc2e98d5b24c92b06c290) 9852 0 R (classParma__Polyhedra__Library_1_1Polyhedron_a39bdf85d6db02629fa73bbcaddab6d5) 9858 0 R (classParma__Polyhedra__Library_1_1Polyhedron_a6b6fed08414c86d33fc4a44c59e9e22) 9813 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Polyhedron_9f3c5474494eb306717bc3da7c109307) (classParma__Polyhedra__Library_1_1Polyhedron_a6b6fed08414c86d33fc4a44c59e9e22)] +>> endobj +12516 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Polyhedron_a78179b1d8478dce6cf572af8e0b9cb4) 9854 0 R (classParma__Polyhedra__Library_1_1Polyhedron_a809bff4b85d09cd801e5e5cde1b8c06) 9746 0 R (classParma__Polyhedra__Library_1_1Polyhedron_b1b315e7f04c051a36f48d344dd34052) 9674 0 R (classParma__Polyhedra__Library_1_1Polyhedron_b4959b3da46291de301d9150f5afc3aa) 9905 0 R (classParma__Polyhedra__Library_1_1Polyhedron_b6ab1820f2fdf444d1431ff3af424451) 9904 0 R (classParma__Polyhedra__Library_1_1Polyhedron_b7a35f8df974c9e932df6291754859fb) 9521 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Polyhedron_a78179b1d8478dce6cf572af8e0b9cb4) (classParma__Polyhedra__Library_1_1Polyhedron_b7a35f8df974c9e932df6291754859fb)] +>> endobj +12517 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Polyhedron_bbb7562de97ccf13bd97b57bb5e3ac94) 9574 0 R (classParma__Polyhedra__Library_1_1Polyhedron_be643d7919aa34a2c1112702878f5536) 1318 0 R (classParma__Polyhedra__Library_1_1Polyhedron_bfd98397c137d81dcc27111fba3ccd54) 9679 0 R (classParma__Polyhedra__Library_1_1Polyhedron_c2182f38e9f8acede601c3dcfa71c3b3) 9627 0 R (classParma__Polyhedra__Library_1_1Polyhedron_c251eb38d1b24b8b570d874ee11df424) 9578 0 R (classParma__Polyhedra__Library_1_1Polyhedron_c5c7acc50141a9104ef5b9b7598c1438) 9582 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Polyhedron_bbb7562de97ccf13bd97b57bb5e3ac94) (classParma__Polyhedra__Library_1_1Polyhedron_c5c7acc50141a9104ef5b9b7598c1438)] +>> endobj +12518 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Polyhedron_c6ea1802e6a6cfb32e5af6d6d26eb424) 9525 0 R (classParma__Polyhedra__Library_1_1Polyhedron_c93800b9ec7aae75937598e1f2209b1f) 9747 0 R (classParma__Polyhedra__Library_1_1Polyhedron_ca90e7afe251a0d4174dcf538b34006b) 9861 0 R (classParma__Polyhedra__Library_1_1Polyhedron_cb75fd68aa10bd15e590e8e8954c5002) 9567 0 R (classParma__Polyhedra__Library_1_1Polyhedron_cbc86683af6afc0818cc9e980a84fcb8) 9752 0 R (classParma__Polyhedra__Library_1_1Polyhedron_cf531d280805472a54c22fed0f689932) 9810 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Polyhedron_c6ea1802e6a6cfb32e5af6d6d26eb424) (classParma__Polyhedra__Library_1_1Polyhedron_cf531d280805472a54c22fed0f689932)] +>> endobj +12519 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Polyhedron_d6a8cc7029bad7ad7ad116c90ff59aec) 9677 0 R (classParma__Polyhedra__Library_1_1Polyhedron_d6d1e866b7ba9bf4233f3a5254cda0f9) 9908 0 R (classParma__Polyhedra__Library_1_1Polyhedron_d84befb6d0ded481871cbef1b7306824) 9911 0 R (classParma__Polyhedra__Library_1_1Polyhedron_d909d5b60cab5d1a6816577c97b60fcf) 9569 0 R (classParma__Polyhedra__Library_1_1Polyhedron_d914801461cad05325559e95b9c4d9c6) 9624 0 R (classParma__Polyhedra__Library_1_1Polyhedron_dad834921ba7c139b0cb10c507b4070a) 9910 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Polyhedron_d6a8cc7029bad7ad7ad116c90ff59aec) (classParma__Polyhedra__Library_1_1Polyhedron_dad834921ba7c139b0cb10c507b4070a)] +>> endobj +12520 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Polyhedron_dd7b66394e6c54bc1ae03a4ed9a33c9e) 9860 0 R (classParma__Polyhedra__Library_1_1Polyhedron_dee3b5c0c3800ce2214e68a156cbcf77) 9816 0 R (classParma__Polyhedra__Library_1_1Polyhedron_e10fbc38125e63858549f5ec8a25e046) 9803 0 R (classParma__Polyhedra__Library_1_1Polyhedron_e1c5216e2ba5c80d77e128daea25b46e) 9523 0 R (classParma__Polyhedra__Library_1_1Polyhedron_e3be29eddce8f41019e7dcb731c8ba7b) 9579 0 R (classParma__Polyhedra__Library_1_1Polyhedron_e58a861a42c5216a2267e3f94ecaec8c) 9899 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Polyhedron_dd7b66394e6c54bc1ae03a4ed9a33c9e) (classParma__Polyhedra__Library_1_1Polyhedron_e58a861a42c5216a2267e3f94ecaec8c)] +>> endobj +12521 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Polyhedron_e680437fdc213b7174c581caa2e0c0d3) 9583 0 R (classParma__Polyhedra__Library_1_1Polyhedron_e6eef0ed4aa8b3690f01f774dd0722fc) 1317 0 R (classParma__Polyhedra__Library_1_1Polyhedron_e89cd985111a1a27c60a6fcc28ae9788) 9753 0 R (classParma__Polyhedra__Library_1_1Polyhedron_eb14f5522982b3874f2cd19586813421) 9741 0 R (classParma__Polyhedra__Library_1_1Polyhedron_eb30e6558c9efffc62d5765b3bfe5e4f) 1315 0 R (classParma__Polyhedra__Library_1_1Polyhedron_ec640128c6492defc09c4d6ad5d3ea19) 1314 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Polyhedron_e680437fdc213b7174c581caa2e0c0d3) (classParma__Polyhedra__Library_1_1Polyhedron_ec640128c6492defc09c4d6ad5d3ea19)] +>> endobj +12522 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Polyhedron_efab726809c553c136e5d8fda50c276e) 9850 0 R (classParma__Polyhedra__Library_1_1Polyhedron_f074d4d4d406dd065812b32cc8714222) 9809 0 R (classParma__Polyhedra__Library_1_1Polyhedron_f15f956dac6d4b19ecd8fee0f9718f29) 9902 0 R (classParma__Polyhedra__Library_1_1Polyhedron_f47944944e16e786df5c0671e7baa995) 9748 0 R (classParma__Polyhedra__Library_1_1Polyhedron_f496ec55802726ee3b39e52458ab0647) 9900 0 R (classParma__Polyhedra__Library_1_1Polyhedron_f60c3f345fb8ec8c708e49e8fa33f737) 9632 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Polyhedron_efab726809c553c136e5d8fda50c276e) (classParma__Polyhedra__Library_1_1Polyhedron_f60c3f345fb8ec8c708e49e8fa33f737)] +>> endobj +12523 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Polyhedron_f740303d5461c838735ec53c5c1f8855) 9580 0 R (classParma__Polyhedra__Library_1_1Polyhedron_fc2a04d2049183cddbcf70316fdf40e7) 9909 0 R (classParma__Polyhedra__Library_1_1Powerset) 1546 0 R (classParma__Polyhedra__Library_1_1Powerset_01b873b0e820222e07789c3ba5fa48ae) 10351 0 R (classParma__Polyhedra__Library_1_1Powerset_04aed5c92cf15c71ce85b8cc173a893b) 10301 0 R (classParma__Polyhedra__Library_1_1Powerset_057c4f38d0e8b8a146af731dbd91864f) 10384 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Polyhedron_f740303d5461c838735ec53c5c1f8855) (classParma__Polyhedra__Library_1_1Powerset_057c4f38d0e8b8a146af731dbd91864f)] +>> endobj +12524 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Powerset_0a660ed1cfae2599d7f9236f2084d499) 10352 0 R (classParma__Polyhedra__Library_1_1Powerset_113964ab3d7ea36326ce962629a322ce) 10341 0 R (classParma__Polyhedra__Library_1_1Powerset_1c71c9b7d1de1b77eeb054e1c0ac935e) 10251 0 R (classParma__Polyhedra__Library_1_1Powerset_1ee74f5687635ddbb9729be31a37e2d3) 10343 0 R (classParma__Polyhedra__Library_1_1Powerset_241c65ff3d32769cbb9badd2c8e00ca5) 10303 0 R (classParma__Polyhedra__Library_1_1Powerset_272424f5d0df282c6d1ee63a5c84e3e6) 10300 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Powerset_0a660ed1cfae2599d7f9236f2084d499) (classParma__Polyhedra__Library_1_1Powerset_272424f5d0df282c6d1ee63a5c84e3e6)] +>> endobj +12525 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Powerset_277ba920e188477bb301196b19d63770) 10296 0 R (classParma__Polyhedra__Library_1_1Powerset_2a7c225e4f50e2287216dcd77eaf27d5) 10385 0 R (classParma__Polyhedra__Library_1_1Powerset_2edf5fe7007a3e91a404546ca2f2d98c) 10309 0 R (classParma__Polyhedra__Library_1_1Powerset_30e0b0c2c668e73566cb1720d72cdac2) 10348 0 R (classParma__Polyhedra__Library_1_1Powerset_36becc8c3ace976043199807351d5b04) 10247 0 R (classParma__Polyhedra__Library_1_1Powerset_37703f96495cf4bcb8ced3ff20e4c396) 10308 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Powerset_277ba920e188477bb301196b19d63770) (classParma__Polyhedra__Library_1_1Powerset_37703f96495cf4bcb8ced3ff20e4c396)] +>> endobj +12526 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Powerset_386fa9c84bc37468f1a3a2b860a0bc3d) 10307 0 R (classParma__Polyhedra__Library_1_1Powerset_411d42e5b59a492742793834efeeabc1) 10254 0 R (classParma__Polyhedra__Library_1_1Powerset_44b0a622563e60fe28b91b7e9ff76364) 10306 0 R (classParma__Polyhedra__Library_1_1Powerset_5534b8f8fbd973bfb7051cf5fb31f19d) 10345 0 R (classParma__Polyhedra__Library_1_1Powerset_5a36a32ab46d46f574f3091e931e2bd2) 10257 0 R (classParma__Polyhedra__Library_1_1Powerset_5c3bee913efb87e4661df746e184e1e1) 10346 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Powerset_386fa9c84bc37468f1a3a2b860a0bc3d) (classParma__Polyhedra__Library_1_1Powerset_5c3bee913efb87e4661df746e184e1e1)] +>> endobj +12527 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Powerset_5d2c2fc2c077e77db657af49d332c9b5) 10375 0 R (classParma__Polyhedra__Library_1_1Powerset_5eb3117d3d7d0566a99f9f5807276864) 10305 0 R (classParma__Polyhedra__Library_1_1Powerset_66e3e2f2433738665eb748d2f6c5878f) 10255 0 R (classParma__Polyhedra__Library_1_1Powerset_6f4469416e02c586de17284317f8a92e) 10248 0 R (classParma__Polyhedra__Library_1_1Powerset_754f66ed06474d4b68a93131af02a86f) 10297 0 R (classParma__Polyhedra__Library_1_1Powerset_7607ef1c8ef6b668dd2be62c39330406) 10310 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Powerset_5d2c2fc2c077e77db657af49d332c9b5) (classParma__Polyhedra__Library_1_1Powerset_7607ef1c8ef6b668dd2be62c39330406)] +>> endobj +12528 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Powerset_8691a3facce4d6f973b48743fa42ec42) 10386 0 R (classParma__Polyhedra__Library_1_1Powerset_86f44d9d38638be46ef23422783f847e) 10382 0 R (classParma__Polyhedra__Library_1_1Powerset_8c82df1de8703aefeab268dc9ffc557f) 10259 0 R (classParma__Polyhedra__Library_1_1Powerset_900663a0e97525c064ccf31152fa8ae7) 10250 0 R (classParma__Polyhedra__Library_1_1Powerset_9fb86f09111d4ac21fdc7c7baa86e622) 10304 0 R (classParma__Polyhedra__Library_1_1Powerset_a215867508a89858bcc7ab025f8d20f1) 10299 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Powerset_8691a3facce4d6f973b48743fa42ec42) (classParma__Polyhedra__Library_1_1Powerset_a215867508a89858bcc7ab025f8d20f1)] +>> endobj +12529 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Powerset_a55b32c299b7d7bec303f636b66ef624) 10387 0 R (classParma__Polyhedra__Library_1_1Powerset_ab7519865a52fbbc8dc2031135a9fb41) 10261 0 R (classParma__Polyhedra__Library_1_1Powerset_b66151b86ac8c495eba1a3209501928a) 10302 0 R (classParma__Polyhedra__Library_1_1Powerset_b955487a974e74224f3d72d743ee78a4) 10339 0 R (classParma__Polyhedra__Library_1_1Powerset_ba65a2c1a6d563f5058479bc07181b9a) 10383 0 R (classParma__Polyhedra__Library_1_1Powerset_c3283cf8fd0dd8ff2a319cba1dead1f2) 10253 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Powerset_a55b32c299b7d7bec303f636b66ef624) (classParma__Polyhedra__Library_1_1Powerset_c3283cf8fd0dd8ff2a319cba1dead1f2)] +>> endobj +12530 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Powerset_cdc1e9b5ac338be9d0584d50d275226e) 10258 0 R (classParma__Polyhedra__Library_1_1Powerset_d25e2d27e5d731e6b63fb84a65700faf) 10260 0 R (classParma__Polyhedra__Library_1_1Powerset_d34bafd07f582c558936f9ea8892abd6) 10376 0 R (classParma__Polyhedra__Library_1_1Powerset_d3bda090e4ac93d937ac4dd775c20919) 10342 0 R (classParma__Polyhedra__Library_1_1Powerset_dab2c45cbec19ad11bf34db42b794508) 10298 0 R (classParma__Polyhedra__Library_1_1Powerset_dab8b3f43dd9a5e707b95e15a9c282f8) 10246 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Powerset_cdc1e9b5ac338be9d0584d50d275226e) (classParma__Polyhedra__Library_1_1Powerset_dab8b3f43dd9a5e707b95e15a9c282f8)] +>> endobj +12531 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Powerset_def4c62b5cdf5186801c592cc62dccea) 10350 0 R (classParma__Polyhedra__Library_1_1Powerset_e006881831b298f0af5031e99df2bc6f) 10256 0 R (classParma__Polyhedra__Library_1_1Powerset_ee126cc2eef44ab1d2055d0d15bc3169) 10349 0 R (classParma__Polyhedra__Library_1_1Powerset_f60bb41867a12ce28144596e3cc1406a) 10252 0 R (classParma__Polyhedra__Library_1_1Powerset_fe22acf3f8e5b6c20880acd443350482) 10340 0 R (classParma__Polyhedra__Library_1_1Smash__Reduction) 1548 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Powerset_def4c62b5cdf5186801c592cc62dccea) (classParma__Polyhedra__Library_1_1Smash__Reduction)] +>> endobj +12532 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Smash__Reduction_8041e8b3420a554e9637e4dfcf43c2b1) 10438 0 R (classParma__Polyhedra__Library_1_1Smash__Reduction_a3b0210cf6bc4dc319d24d429518c61d) 10434 0 R (classParma__Polyhedra__Library_1_1Smash__Reduction_a4959b6198e090d37abbd07085b74a30) 10433 0 R (classParma__Polyhedra__Library_1_1Throwable) 1549 0 R (classParma__Polyhedra__Library_1_1Throwable_14c081beabe1e165b1dc44b2a84b6c2b) 10459 0 R (classParma__Polyhedra__Library_1_1Throwable_5024cc2b142473f5f733a8808cb09162) 10460 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Smash__Reduction_8041e8b3420a554e9637e4dfcf43c2b1) (classParma__Polyhedra__Library_1_1Throwable_5024cc2b142473f5f733a8808cb09162)] +>> endobj +12533 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Variable) 1550 0 R (classParma__Polyhedra__Library_1_1Variable_0431b025f2e3c1b5d3cef06c4054f726) 10491 0 R (classParma__Polyhedra__Library_1_1Variable_44e2225e59844067e005297572cd9ca5) 10467 0 R (classParma__Polyhedra__Library_1_1Variable_49b4a338d3d82bfb7a404ea87481fc4d) 10489 0 R (classParma__Polyhedra__Library_1_1Variable_5012c55d8fdb1420b80a3bfbe5a5b843) 10494 0 R (classParma__Polyhedra__Library_1_1Variable_56a9fd5bee6f87ae9079aed0bc3de31a) 10499 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Variable) (classParma__Polyhedra__Library_1_1Variable_56a9fd5bee6f87ae9079aed0bc3de31a)] +>> endobj +12534 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Variable_7102c6fe85d4c8e6939d29a047becbdb) 10465 0 R (classParma__Polyhedra__Library_1_1Variable_75683687bda865c93db529b76271bed2) 10495 0 R (classParma__Polyhedra__Library_1_1Variable_8dfe38ded52523b20209cce599411c4c) 10466 0 R (classParma__Polyhedra__Library_1_1Variable_a5f2c0410e128e2f082d761ef36820da) 10493 0 R (classParma__Polyhedra__Library_1_1Variable_bb6a26c12f7bdee7504d577ca81992e0) 10464 0 R (classParma__Polyhedra__Library_1_1Variable_d71d7986fdfd19215fc87726ebacf555) 10500 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Variable_7102c6fe85d4c8e6939d29a047becbdb) (classParma__Polyhedra__Library_1_1Variable_d71d7986fdfd19215fc87726ebacf555)] +>> endobj +12535 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Variable_ed0f237309569c2bfbf9e6f60740974e) 10490 0 R (classParma__Polyhedra__Library_1_1Variables__Set) 1552 0 R (classParma__Polyhedra__Library_1_1Variables__Set_0b93ff227453cf62d922dab902055f8b) 10557 0 R (classParma__Polyhedra__Library_1_1Variables__Set_32b7f9e0a2f54d199ad55bc008bfa62e) 10554 0 R (classParma__Polyhedra__Library_1_1Variables__Set_3a5d4b3fb638414792155bcef8b54c1c) 10556 0 R (classParma__Polyhedra__Library_1_1Variables__Set_3d49b2488d36bda4fef0109bedf6b0cc) 10551 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Variable_ed0f237309569c2bfbf9e6f60740974e) (classParma__Polyhedra__Library_1_1Variables__Set_3d49b2488d36bda4fef0109bedf6b0cc)] +>> endobj +12536 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Variables__Set_4090b6696c19cb93c705d9a9e06f4915) 10553 0 R (classParma__Polyhedra__Library_1_1Variables__Set_4c3c15515e1335fb69130aad4f371a1c) 10558 0 R (classParma__Polyhedra__Library_1_1Variables__Set_4e8f85cded8a6be1916c2cc0bb31c540) 10555 0 R (classParma__Polyhedra__Library_1_1Variables__Set_5842c4add70aabcc093269aea7a348e5) 10560 0 R (classParma__Polyhedra__Library_1_1Variables__Set_587efac6e5a2fbde0a1866dbe4427224) 10570 0 R (classParma__Polyhedra__Library_1_1Variables__Set_6faffe6889615dc0491bf86dd601172c) 10550 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Variables__Set_4090b6696c19cb93c705d9a9e06f4915) (classParma__Polyhedra__Library_1_1Variables__Set_6faffe6889615dc0491bf86dd601172c)] +>> endobj +12537 0 obj << +/Names [(classParma__Polyhedra__Library_1_1Variables__Set_7176b36adef9683aae06961175ad94cb) 10552 0 R (classParma__Polyhedra__Library_1_1Variables__Set_ca3690ce9d77a85740cdf8a508edf127) 10559 0 R (classParma__Polyhedra__Library_1_1Variables__Set_d7bdf8849f22908ce11574a04ba875df) 10576 0 R (classParma__Polyhedra__Library_1_1Variables__Set_da205f4442f845f797fb108c121fe371) 10549 0 R (deprecated) 1188 0 R (deprecated__deprecated000001) 1299 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Variables__Set_7176b36adef9683aae06961175ad94cb) (deprecated__deprecated000001)] +>> endobj +12538 0 obj << +/Names [(deprecated__deprecated000002) 1300 0 R (deprecated__deprecated000003) 1301 0 R (deprecated__deprecated000004) 1302 0 R (deprecated__deprecated000005) 1303 0 R (deprecated__deprecated000006) 1304 0 R (deprecated__deprecated000007) 1305 0 R] +/Limits [(deprecated__deprecated000002) (deprecated__deprecated000007)] +>> endobj +12539 0 obj << +/Names [(deprecated__deprecated000008) 1306 0 R (deprecated__deprecated000009) 1341 0 R (deprecated__deprecated000010) 1342 0 R (deprecated__deprecated000011) 1343 0 R (deprecated__deprecated000012) 1236 0 R (deprecated__deprecated000013) 1237 0 R] +/Limits [(deprecated__deprecated000008) (deprecated__deprecated000013)] +>> endobj +12540 0 obj << +/Names [(deprecated__deprecated000014) 1238 0 R (deprecated__deprecated000015) 1239 0 R (deprecated__deprecated000016) 1240 0 R (deprecated__deprecated000017) 1241 0 R (deprecated__deprecated000018) 1242 0 R (deprecated__deprecated000019) 1243 0 R] +/Limits [(deprecated__deprecated000014) (deprecated__deprecated000019)] +>> endobj +12541 0 obj << +/Names [(deprecated__deprecated000020) 1244 0 R (deprecated__deprecated000021) 1245 0 R (deprecated__deprecated000022) 1293 0 R (deprecated__deprecated000023) 1189 0 R (deprecated__deprecated000024) 1190 0 R (deprecated__deprecated000025) 1191 0 R] +/Limits [(deprecated__deprecated000020) (deprecated__deprecated000025)] +>> endobj +12542 0 obj << +/Names [(deprecated__deprecated000026) 1192 0 R (deprecated__deprecated000027) 1193 0 R (deprecated__deprecated000028) 1233 0 R (deprecated__deprecated000029) 1234 0 R (deprecated__deprecated000030) 1235 0 R (deprecated__deprecated000031) 1294 0 R] +/Limits [(deprecated__deprecated000026) (deprecated__deprecated000031)] +>> endobj +12543 0 obj << +/Names [(deprecated__deprecated000032) 1295 0 R (deprecated__deprecated000033) 1296 0 R (deprecated__deprecated000034) 1297 0 R (deprecated__deprecated000035) 1298 0 R (group__PPL__CXX__interface) 1537 0 R (group__PPL__CXX__interface_g00a906832c41c42a70a5c9d194e07a7d) 1772 0 R] +/Limits [(deprecated__deprecated000032) (group__PPL__CXX__interface_g00a906832c41c42a70a5c9d194e07a7d)] +>> endobj +12544 0 obj << +/Names [(group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) 1761 0 R (group__PPL__CXX__interface_g1c2a279a3ffa1d1e9947f2667be312ae) 1754 0 R (group__PPL__CXX__interface_g25ea3a289eadef732f4c7fd823387fb2) 1709 0 R (group__PPL__CXX__interface_g2c7a4b4311ef3639f73f40b414376899) 1682 0 R (group__PPL__CXX__interface_g616fcdc7600a3a11a8a9152e75730899) 1751 0 R (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783) 1681 0 R] +/Limits [(group__PPL__CXX__interface_g113f1e845cba6b1c3c5705d0e14f1cc1) (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783)] +>> endobj +12545 0 obj << +/Names [(group__PPL__CXX__interface_g79bd3696a302bb721ef8168fa5d650fb) 1679 0 R (group__PPL__CXX__interface_g7a529f51bfebdd4b3e69c866dced9bc1) 1664 0 R (group__PPL__CXX__interface_g8458e58a5e857de11c35ce3076a70ab8) 1677 0 R (group__PPL__CXX__interface_g853432469169b07e42c557e1d6d144de) 1680 0 R (group__PPL__CXX__interface_ga88e9b9cb2588cbf5914695fc14e69a8) 1683 0 R (group__PPL__CXX__interface_gac82e7e0179442ef589f2fc61302d654) 1765 0 R] +/Limits [(group__PPL__CXX__interface_g79bd3696a302bb721ef8168fa5d650fb) (group__PPL__CXX__interface_gac82e7e0179442ef589f2fc61302d654)] +>> endobj +12546 0 obj << +/Names [(group__PPL__CXX__interface_gbadfeba0a415d210cdd6d7309365e800) 1678 0 R (group__PPL__CXX__interface_gdf9d6f17d8974c81e3499f170e7762a2) 1768 0 R (group__PPL__CXX__interface_ge19dfe022c51c874d905e2a7c81c18f1) 1621 0 R (group__PPL__CXX__interface_gg113f1e845cba6b1c3c5705d0e14f1cc140409716eac06f7ee5c44a200d3702f0) 1764 0 R (group__PPL__CXX__interface_gg113f1e845cba6b1c3c5705d0e14f1cc171c9b0459dc8ba8cc0c8178b6cf4f017) 1762 0 R (group__PPL__CXX__interface_gg113f1e845cba6b1c3c5705d0e14f1cc1b39e3c667ce455313f8ff578722af2e9) 1763 0 R] +/Limits [(group__PPL__CXX__interface_gbadfeba0a415d210cdd6d7309365e800) (group__PPL__CXX__interface_gg113f1e845cba6b1c3c5705d0e14f1cc1b39e3c667ce455313f8ff578722af2e9)] +>> endobj +12547 0 obj << +/Names [(group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312ae079e4b80f17b0095497103a52cffa3ab) 1758 0 R (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312ae3e4424ce8e7ebe86e125541b561fc300) 1757 0 R (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312ae556cc08f48e769b9c15bea83d5d883a1) 1755 0 R (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312ae8191bdbdcd041a9859ed465d16062ab1) 1760 0 R (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312ae94cf20719046117aece5acba61dcae4d) 1759 0 R (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312aed8db7109fb4bb50360b05800dd245416) 1756 0 R] +/Limits [(group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312ae079e4b80f17b0095497103a52cffa3ab) (group__PPL__CXX__interface_gg1c2a279a3ffa1d1e9947f2667be312aed8db7109fb4bb50360b05800dd245416)] +>> endobj +12548 0 obj << +/Names [(group__PPL__CXX__interface_gg25ea3a289eadef732f4c7fd823387fb20f182c5824807f7bc66d2d2033810feb) 1712 0 R (group__PPL__CXX__interface_gg25ea3a289eadef732f4c7fd823387fb2a57b0c1a34eced57ca8437eea92a4328) 1711 0 R (group__PPL__CXX__interface_gg25ea3a289eadef732f4c7fd823387fb2beee33de6f8542b0228161d044640eaa) 1710 0 R (group__PPL__CXX__interface_gg25ea3a289eadef732f4c7fd823387fb2eafcc7ca16bda73dc6b0f7deaf9470dd) 1713 0 R (group__PPL__CXX__interface_gg616fcdc7600a3a11a8a9152e757308990edf84fcb94023ff4a7183bf3f8dace5) 1752 0 R (group__PPL__CXX__interface_gg616fcdc7600a3a11a8a9152e75730899c7753e1dd51e1b7b3fdfafa9f8332370) 1753 0 R] +/Limits [(group__PPL__CXX__interface_gg25ea3a289eadef732f4c7fd823387fb20f182c5824807f7bc66d2d2033810feb) (group__PPL__CXX__interface_gg616fcdc7600a3a11a8a9152e75730899c7753e1dd51e1b7b3fdfafa9f8332370)] +>> endobj +12549 0 obj << +/Names [(group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8057025d0ff550a2226a0a1273c84b4f6) 1698 0 R (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a805e540f453fd070a4e4c0fdd887f4b7a) 1695 0 R (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a80905d51325862cb4db00635875efcff8) 1706 0 R (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a80d808c2d0d6514c33e06445d7aa34270) 1691 0 R (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8202263943c451b9fdfe003b2bc8d0b1f) 1707 0 R (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8261922c7bb53bf71459671df868e55da) 1705 0 R] +/Limits [(group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8057025d0ff550a2226a0a1273c84b4f6) (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8261922c7bb53bf71459671df868e55da)] +>> endobj +12550 0 obj << +/Names [(group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a85912e00d1de38a643d48af1f0e5dd35f) 1700 0 R (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a86c817c11198882f3864d8ace4ec326dd) 1690 0 R (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8930a62d56d7231cdb1ed57e1d3eff0f7) 1702 0 R (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a89606fc251d767040929d3e2645dbb446) 1696 0 R (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a896b8890edb38e9960c455aa178e508ba) 1684 0 R (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8979f37a289d4cb316643f1dcc07ec7cd) 1694 0 R] +/Limits [(group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a85912e00d1de38a643d48af1f0e5dd35f) (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8979f37a289d4cb316643f1dcc07ec7cd)] +>> endobj +12551 0 obj << +/Names [(group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a89f5dce9506b72773425c0504845d8e4e) 1687 0 R (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8a0f28596ac7d4a43766fab174c28ccab) 1704 0 R (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8a1bf7bec2cb0d949e45c3cd0e25874a6) 1699 0 R (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8a7ce2ad16ee907ff9d31eeb1cda41834) 1693 0 R (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8b30277f972f730fe26f6cfc39098cc77) 1685 0 R (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8bd1bad185f4622d07b171767dafc78b6) 1703 0 R] +/Limits [(group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a89f5dce9506b72773425c0504845d8e4e) (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8bd1bad185f4622d07b171767dafc78b6)] +>> endobj +12552 0 obj << +/Names [(group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8bd640c30f757e4ecccd08ac527536ca6) 1692 0 R (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8c77955fc77a169347da8820b46c3247b) 1689 0 R (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8d5e386c6a05c9656eac42fe9e2cdd8b5) 1688 0 R (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8e0c660bfcbcd3d10c3e764e22f41d0a1) 1697 0 R (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8e704947d33ff1b60a2475950d5f18ec3) 1686 0 R (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8fda2f32e2fc3f61357ce0d9d7813f5fc) 1701 0 R] +/Limits [(group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8bd640c30f757e4ecccd08ac527536ca6) (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8fda2f32e2fc3f61357ce0d9d7813f5fc)] +>> endobj +12553 0 obj << +/Names [(group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8fdd3365de1a07c7f7bdd1dc330bba8f4) 1708 0 R (group__PPL__CXX__interface_ggac82e7e0179442ef589f2fc61302d6540e1a601a53491f60c89282fde55b5352) 1767 0 R (group__PPL__CXX__interface_ggac82e7e0179442ef589f2fc61302d654324bf568397fdfc332a4c06e7a4facf5) 1766 0 R (group__PPL__CXX__interface_ggdf9d6f17d8974c81e3499f170e7762a253f4353b82f1a10a08b1e756bb7c84ad) 1769 0 R (group__PPL__CXX__interface_ggdf9d6f17d8974c81e3499f170e7762a278fc3e83d58f3eb97a8041b600870a05) 1771 0 R (group__PPL__CXX__interface_ggdf9d6f17d8974c81e3499f170e7762a2b2bc77b49f9450faf5b5f8ca5374421d) 1770 0 R] +/Limits [(group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8fdd3365de1a07c7f7bdd1dc330bba8f4) (group__PPL__CXX__interface_ggdf9d6f17d8974c81e3499f170e7762a2b2bc77b49f9450faf5b5f8ca5374421d)] +>> endobj +12554 0 obj << +/Names [(index) 467 0 R (main_A_Note_on_the_Implementation_of_the_Operators) 902 0 R (main_Adding_New_Dimensions_to_the_Vector_Space) 609 0 R (main_Adding_a_Disjunct) 859 0 R (main_Affine_Hyperplanes_and_Half_spaces) 543 0 R (main_Affine_Independence_and_Affine_Dimension) 593 0 R] +/Limits [(index) (main_Affine_Independence_and_Affine_Dimension)] +>> endobj +12555 0 obj << +/Names [(main_Anc91) 928 0 R (main_BA05) 929 0 R (main_BCCetal02) 719 0 R (main_BDHetal05) 752 0 R (main_BDHetal06) 931 0 R (main_BDHetal07) 932 0 R] +/Limits [(main_Anc91) (main_BDHetal07)] +>> endobj +12556 0 obj << +/Names [(main_BFT00) 933 0 R (main_BFT01) 934 0 R (main_BGP99) 893 0 R (main_BHMZ04) 935 0 R (main_BHMZ05_widening) 734 0 R (main_BHMZ05a) 738 0 R] +/Limits [(main_BFT00) (main_BHMZ05a)] +>> endobj +12557 0 obj << +/Names [(main_BHMZ05b) 951 0 R (main_BHRZ03_widening) 682 0 R (main_BHRZ03a) 685 0 R (main_BHRZ03b) 952 0 R (main_BHRZ05) 953 0 R (main_BHZ02a) 954 0 R] +/Limits [(main_BHMZ05b) (main_BHZ02a)] +>> endobj +12558 0 obj << +/Names [(main_BHZ02b) 955 0 R (main_BHZ03a) 956 0 R (main_BHZ03b) 894 0 R (main_BHZ04) 843 0 R (main_BHZ05) 957 0 R (main_BHZ06a) 958 0 R] +/Limits [(main_BHZ02b) (main_BHZ06a)] +>> endobj +12559 0 obj << +/Names [(main_BHZ06b) 959 0 R (main_BHZ07a) 960 0 R (main_BHZ07b) 974 0 R (main_BHZ07c) 961 0 R (main_BHZ08a) 975 0 R (main_BHZ08b) 976 0 R] +/Limits [(main_BHZ06b) (main_BHZ08b)] +>> endobj +12560 0 obj << +/Names [(main_BHZ09a) 977 0 R (main_BHZ09b) 978 0 R (main_BHZ09c) 979 0 R (main_BJT99) 980 0 R (main_BK89) 981 0 R (main_BRZH02a) 982 0 R] +/Limits [(main_BHZ09a) (main_BRZH02a)] +>> endobj +12561 0 obj << +/Names [(main_BRZH02b) 545 0 R (main_BRZH02c) 983 0 R (main_Bag97) 930 0 R (main_Bag98) 842 0 R (main_Basic_Geometric_Descriptors) 491 0 R (main_Bounded_Difference_Shapes) 715 0 R] +/Limits [(main_BRZH02b) (main_Bounded_Difference_Shapes)] +>> endobj +12562 0 obj << +/Names [(main_Bounded_Polyhedra) 557 0 R (main_CC76) 718 0 R (main_CC76_extrapolation) 735 0 R (main_CC76_interval_widening) 703 0 R (main_CC79) 991 0 R (main_CC92) 992 0 R] +/Limits [(main_Bounded_Polyhedra) (main_CC92)] +>> endobj +12563 0 obj << +/Names [(main_CH78) 737 0 R (main_Certificate_Based_Widenings) 891 0 R (main_Che64) 993 0 R (main_Che65) 994 0 R (main_Che68) 995 0 R (main_Collapsing_a_Powerset_Element) 862 0 R] +/Limits [(main_CH78) (main_Collapsing_a_Powerset_Element)] +>> endobj +12564 0 obj << +/Names [(main_Combinations_and_Hulls) 569 0 R (main_Concatenating_Polyhedra) 607 0 R (main_Congruence_Relations) 744 0 R (main_Constraint_Geometric_Descriptors) 493 0 R (main_Constraints_Representation) 560 0 R (main_Convex_Polyhedra) 555 0 R] +/Limits [(main_Combinations_and_Hulls) (main_Convex_Polyhedra)] +>> endobj +12565 0 obj << +/Names [(main_Convex_Polyhedral_Difference) 605 0 R (main_Cylindrification) 657 0 R (main_Dan63) 996 0 R (main_Double_Description) 582 0 R (main_Expanding_One_Dimension_of_the_Vector_Space_to_Multiple_Dimensions) 624 0 R (main_Extrapolation_Operators) 698 0 R] +/Limits [(main_Convex_Polyhedral_Difference) (main_Extrapolation_Operators)] +>> endobj +12566 0 obj << +/Names [(main_FP96) 997 0 R (main_Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension) 627 0 R (main_Fuk98) 546 0 R (main_GDDetal04) 628 0 R (main_GJ00) 998 0 R (main_GJ01) 999 0 R] +/Limits [(main_FP96) (main_GJ01)] +>> endobj +12567 0 obj << +/Names [(main_GR77) 1000 0 R (main_Generalized_Affine_Relations) 655 0 R (main_Generator_Geometric_Descriptors) 506 0 R (main_Generators_Representation) 573 0 R (main_Generic_Operations_on_Semantic_Geometric_Descriptors) 514 0 R (main_Geometric_Comparisons) 882 0 R] +/Limits [(main_GR77) (main_Geometric_Comparisons)] +>> endobj +12568 0 obj << +/Names [(main_Gra91) 1001 0 R (main_Gra97) 1010 0 R (main_Grid_Add_Space_Dimensions) 786 0 R (main_Grid_Affine_Dimension) 769 0 R (main_Grid_Affine_Transformation) 808 0 R (main_Grid_Concatenate) 784 0 R] +/Limits [(main_Gra91) (main_Grid_Concatenate)] +>> endobj +12569 0 obj << +/Names [(main_Grid_Difference) 782 0 R (main_Grid_Expand_Space_Dimension) 797 0 R (main_Grid_Extrapolation) 836 0 R (main_Grid_Fold_Space_Dimensions) 799 0 R (main_Grid_Generalized_Image) 810 0 R (main_Grid_Generator_Representation) 760 0 R] +/Limits [(main_Grid_Difference) (main_Grid_Generator_Representation)] +>> endobj +12570 0 obj << +/Names [(main_Grid_Intersection_and_Join) 780 0 R (main_Grid_Map_Space_Dimensions) 795 0 R (main_Grid_Minimized_Representations) 763 0 R (main_Grid_Relation_With) 820 0 R (main_Grid_Remove_Space_Dimensions) 793 0 R (main_Grid_Space_Dimensions) 767 0 R] +/Limits [(main_Grid_Intersection_and_Join) (main_Grid_Space_Dimensions)] +>> endobj +12571 0 obj << +/Names [(main_Grid_Time_Elapse) 812 0 R (main_Grid_Widening) 822 0 R (main_Grid_Widening_with_Tokens) 834 0 R (main_Grids_Double_Description_Grids) 765 0 R (main_H79_widening) 681 0 R (main_HH95) 1012 0 R] +/Limits [(main_Grid_Time_Elapse) (main_HH95)] +>> endobj +12572 0 obj << +/Names [(main_HHL90) 1013 0 R (main_HKP95) 1014 0 R (main_HLW94) 1015 0 R (main_HMT71) 663 0 R (main_HPR94) 1016 0 R (main_HPR97) 664 0 R] +/Limits [(main_HHL90) (main_HPR97)] +>> endobj +12573 0 obj << +/Names [(main_HPWT01) 1017 0 R (main_Hal79) 684 0 R (main_Hal93) 1011 0 R (main_Images_and_Preimages_of_Affine_Transfer_Relations) 637 0 R (main_Integer_Combinations) 748 0 R (main_Intersection_and_Convex_Polyhedral_Hull) 603 0 R] +/Limits [(main_HPWT01) (main_Intersection_and_Convex_Polyhedral_Hull)] +>> endobj +12574 0 obj << +/Names [(main_Intervals_and_Boxes) 702 0 R (main_JMSY94) 1019 0 R (main_Jea02) 1018 0 R (main_KBBetal06) 1020 0 R (main_Kuh56) 1021 0 R (main_LW97) 1032 0 R] +/Limits [(main_Intervals_and_Boxes) (main_LW97)] +>> endobj +12575 0 obj << +/Names [(main_LeV92) 1022 0 R (main_Loe99) 1031 0 R (main_MRTT53) 1040 0 R (main_Mapping_the_Dimensions_of_the_Vector_Space) 619 0 R (main_Mas92) 1033 0 R (main_Mas93) 1034 0 R] +/Limits [(main_LeV92) (main_Mas93)] +>> endobj +12576 0 obj << +/Names [(main_Meet_Preserving_Simplification) 661 0 R (main_Meet_and_Upper_Bound) 856 0 R (main_Min01a) 1035 0 R (main_Min01b) 1036 0 R (main_Min02) 1037 0 R (main_Min04) 1038 0 R] +/Limits [(main_Meet_Preserving_Simplification) (main_Min04)] +>> endobj +12577 0 obj << +/Names [(main_Min05) 1039 0 R (main_Minimized_Representations) 580 0 R (main_NF01) 1041 0 R (main_NJPF99) 1042 0 R (main_NO77) 1043 0 R (main_NO80) 1044 0 R] +/Limits [(main_Min05) (main_NO80)] +>> endobj +12578 0 obj << +/Names [(main_NR00) 1045 0 R (main_NW88) 547 0 R (main_Octagonal_Shapes) 717 0 R (main_On_Const_Correctness_A_Warning_about_the_Use_of_References_and_Iterators) 915 0 R (main_On_Object_Orientation_and_Polymorphism_A_Disclaimer) 913 0 R (main_On_Pointset_Powerset_and_Partially_Reduced_Product_Domains_A_Warning) 904 0 R] +/Limits [(main_NR00) (main_On_Pointset_Powerset_and_Partially_Reduced_Product_Domains_A_Warning)] +>> endobj +12579 0 obj << +/Names [(main_Operations_on_Convex_Polyhedra) 602 0 R (main_PS98) 1054 0 R (main_Pairwise_Merge) 885 0 R (main_Points_Closure_Points_Rays_and_Lines) 571 0 R (main_Points_Parameters_Lines) 750 0 R (main_Powerset_Extrapolation_Operators) 888 0 R] +/Limits [(main_Operations_on_Convex_Polyhedra) (main_Powerset_Extrapolation_Operators)] +>> endobj +12580 0 obj << +/Names [(main_Powerset_Meet_Preserving_Simplification) 683 0 R (main_Pra77) 1053 0 R (main_QRR96) 1055 0 R (main_QRR97) 1056 0 R (main_QRW00) 1057 0 R (main_RBL06) 1058 0 R] +/Limits [(main_Powerset_Meet_Preserving_Simplification) (main_RBL06)] +>> endobj +12581 0 obj << +/Names [(main_Rational_Grids) 746 0 R (main_Rational_Polyhedra) 595 0 R (main_Relation_With_Operators) 677 0 R (main_Removing_Dimensions_from_the_Vector_Space) 617 0 R (main_Ric02) 1059 0 R (main_SK07) 1061 0 R] +/Limits [(main_Rational_Grids) (main_SK07)] +>> endobj +12582 0 obj << +/Names [(main_SS07) 1063 0 R (main_SW70) 1064 0 R (main_Sch99) 771 0 R (main_Semantic_Geometric_Descriptors) 469 0 R (main_Sho81) 1060 0 R (main_Single_Update_Affine_Functions) 644 0 R] +/Limits [(main_SS07) (main_Single_Update_Affine_Functions)] +>> endobj +12583 0 obj << +/Names [(main_Single_Update_Bounded_Affine_Relations) 653 0 R (main_Space_Dimensions_and_Dimension_Compatibility) 591 0 R (main_Sri93) 1062 0 R (main_Syntactic_Geometric_Descriptors) 489 0 R (main_The_Powerset_Domain) 840 0 R (main_Time_Elapse_Operator) 659 0 R] +/Limits [(main_Single_Update_Bounded_Affine_Relations) (main_Time_Elapse_Operator)] +>> endobj +12584 0 obj << +/Names [(main_Topologies_and_Topological_compatibility) 562 0 R (main_Upward_Approximation) 535 0 R (main_Vectors_Matrices_and_Scalar_Products) 536 0 R (main_War03) 1065 0 R (main_Weakly_Relational_Shape_Interface) 730 0 R (main_Weakly_Relational_Shapes) 714 0 R] +/Limits [(main_Topologies_and_Topological_compatibility) (main_Weakly_Relational_Shapes)] +>> endobj +12585 0 obj << +/Names [(main_Wey35) 1066 0 R (main_Wey50) 1067 0 R (main_Widening_Operators) 679 0 R (main_Widening_and_Extrapolation_Operators_on_Boxes) 712 0 R (main_Widening_and_Extrapolation_Operators_on_WR_Shapes) 732 0 R (main_Widening_with_Tokens) 696 0 R] +/Limits [(main_Wey35) (main_Widening_with_Tokens)] +>> endobj +12586 0 obj << +/Names [(main_Wil93) 548 0 R (main_affine_relation) 636 0 R (main_bibliography) 927 0 R (main_bounded_extrapolation) 701 0 R (main_convex_polys) 474 0 R (main_expand_space_dimension) 623 0 R] +/Limits [(main_Wil93) (main_expand_space_dimension)] +>> endobj +12587 0 obj << +/Names [(main_fold_space_dimensions) 626 0 R (main_intervals) 711 0 R (main_limited_extrapolation) 700 0 R (main_pointset_powerset) 844 0 R (main_powerset) 838 0 R (main_powerset_domain) 839 0 R] +/Limits [(main_fold_space_dimensions) (main_powerset_domain)] +>> endobj +12588 0 obj << +/Names [(main_pps_bgp99_extrapolation) 887 0 R (main_pps_certificate_widening) 890 0 R (main_pps_geometric) 881 0 R (main_pps_pairwise_merge) 884 0 R (main_preamble) 468 0 R (main_ps_add_disjunct) 858 0 R] +/Limits [(main_pps_bgp99_extrapolation) (main_ps_add_disjunct)] +>> endobj +12589 0 obj << +/Names [(main_ps_collapse) 861 0 R (main_ps_meet_upper_bound) 855 0 R (main_ps_operations) 854 0 R (main_rational_grid_operations) 779 0 R (main_relation_with) 676 0 R (main_representation) 559 0 R] +/Limits [(main_ps_collapse) (main_representation)] +>> endobj +12590 0 obj << +/Names [(main_sect_rational_grids) 736 0 R (main_use_of_library) 475 0 R (namespaceParma__Polyhedra__Library) 1347 0 R (namespaceParma__Polyhedra__Library_03c487cbbb8731e1c7c9131a7a1faeae) 2011 0 R (namespaceParma__Polyhedra__Library_03ed91fbbeb6d32952c5d2a30bfd3830) 2009 0 R (namespaceParma__Polyhedra__Library_05dd6b345e96427a50b45f9756e302ab) 2010 0 R] +/Limits [(main_sect_rational_grids) (namespaceParma__Polyhedra__Library_05dd6b345e96427a50b45f9756e302ab)] +>> endobj +12591 0 obj << +/Names [(namespaceParma__Polyhedra__Library_077909c2e2a30e356b03d74e287d2545) 2020 0 R (namespaceParma__Polyhedra__Library_0adf6106892886dc859985042b8a7433) 1959 0 R (namespaceParma__Polyhedra__Library_19b0ebdb3476fe1feb0f51d9328fd384) 1974 0 R (namespaceParma__Polyhedra__Library_1_1IO__Operators) 1348 0 R (namespaceParma__Polyhedra__Library_1_1IO__Operators_9ccf426c9d89537e0351aac50a333e95) 2072 0 R (namespaceParma__Polyhedra__Library_20874a85120477d5cf11da451870d497) 2012 0 R] +/Limits [(namespaceParma__Polyhedra__Library_077909c2e2a30e356b03d74e287d2545) (namespaceParma__Polyhedra__Library_20874a85120477d5cf11da451870d497)] +>> endobj +12592 0 obj << +/Names [(namespaceParma__Polyhedra__Library_215d809846aabbfafa5754ce051d1603) 2007 0 R (namespaceParma__Polyhedra__Library_31f5a518ab35f859aafd220bc3e38dfd) 2015 0 R (namespaceParma__Polyhedra__Library_3504c6384a7e40501e2cfc49ba870ad5) 2045 0 R (namespaceParma__Polyhedra__Library_3aa0f8a865cbe18e6202b99d388af956) 2042 0 R (namespaceParma__Polyhedra__Library_3e6dcd6f5d8e3ea263c9205b21a83e48) 1968 0 R (namespaceParma__Polyhedra__Library_4bef34d0d723e765fc4ae7dbd2d195b5) 2006 0 R] +/Limits [(namespaceParma__Polyhedra__Library_215d809846aabbfafa5754ce051d1603) (namespaceParma__Polyhedra__Library_4bef34d0d723e765fc4ae7dbd2d195b5)] +>> endobj +12593 0 obj << +/Names [(namespaceParma__Polyhedra__Library_5604f97d216583cdf012a50d2f8cdbde) 1961 0 R (namespaceParma__Polyhedra__Library_563b92eac806093d3e743ea4dfcc0594) 2048 0 R (namespaceParma__Polyhedra__Library_56eb4e32ec57658bc9e7823cd42ecbae) 2008 0 R (namespaceParma__Polyhedra__Library_5e801a56c2c3dcec13d2d87adf07ac47) 1970 0 R (namespaceParma__Polyhedra__Library_63bd7c7767faf3c219f9c2762095e2dd) 1972 0 R (namespaceParma__Polyhedra__Library_66438955854cf73ddaf27a40a69fec7b) 2014 0 R] +/Limits [(namespaceParma__Polyhedra__Library_5604f97d216583cdf012a50d2f8cdbde) (namespaceParma__Polyhedra__Library_66438955854cf73ddaf27a40a69fec7b)] +>> endobj +12594 0 obj << +/Names [(namespaceParma__Polyhedra__Library_6a54c55d8b52ef353df7cefdfa632d8d) 1969 0 R (namespaceParma__Polyhedra__Library_6c841f33162c2419bd53a078e6c788ee) 1973 0 R (namespaceParma__Polyhedra__Library_729bdafa0ec2ae7a6664cbdf38c09755) 2047 0 R (namespaceParma__Polyhedra__Library_74074a5ed3718745a4d82bacd5b381ed) 1967 0 R (namespaceParma__Polyhedra__Library_75dfd397f7fab1fe9da3eb150911853c) 2049 0 R (namespaceParma__Polyhedra__Library_93c37cc32a1f50c36ec15d67fdbec3aa) 2013 0 R] +/Limits [(namespaceParma__Polyhedra__Library_6a54c55d8b52ef353df7cefdfa632d8d) (namespaceParma__Polyhedra__Library_93c37cc32a1f50c36ec15d67fdbec3aa)] +>> endobj +12595 0 obj << +/Names [(namespaceParma__Polyhedra__Library_99e9dc5df3cf7c0ab581e602d1176e41) 1963 0 R (namespaceParma__Polyhedra__Library_9bfba21dd2d808e2eabd2348e92cb96a) 2044 0 R (namespaceParma__Polyhedra__Library_9c118832fed4c0b9b40547578459dad4) 1965 0 R (namespaceParma__Polyhedra__Library_ca6003248d614d68c07f5330b468a242) 2016 0 R (namespaceParma__Polyhedra__Library_ce0cdceaa0c7eea84cc1c38cf5bea680) 1964 0 R (namespaceParma__Polyhedra__Library_d0719a31106af8ca454d1d1d77dbde4e) 2051 0 R] +/Limits [(namespaceParma__Polyhedra__Library_99e9dc5df3cf7c0ab581e602d1176e41) (namespaceParma__Polyhedra__Library_d0719a31106af8ca454d1d1d77dbde4e)] +>> endobj +12596 0 obj << +/Names [(namespaceParma__Polyhedra__Library_d11992da5c89caef7922c215278d03a8) 2019 0 R (namespaceParma__Polyhedra__Library_d31eeb0067d6cad2eb2ea5ab5bd0a2b2) 1966 0 R (namespaceParma__Polyhedra__Library_d4f28a7482372281b01b4221b8543bdc) 2046 0 R (namespaceParma__Polyhedra__Library_e2684e5d6c84a8e156f58121be0dbd03) 2043 0 R (namespaceParma__Polyhedra__Library_e6a8e238a8400e68173c88d38dd8a8da) 2050 0 R (namespaceParma__Polyhedra__Library_ec4c213c066101e1cd926125ccc4c81c) 2041 0 R] +/Limits [(namespaceParma__Polyhedra__Library_d11992da5c89caef7922c215278d03a8) (namespaceParma__Polyhedra__Library_ec4c213c066101e1cd926125ccc4c81c)] +>> endobj +12597 0 obj << +/Names [(namespaceParma__Polyhedra__Library_ee4e9b54e65780ac3010fda40ea235a6) 1971 0 R (namespaceParma__Polyhedra__Library_f127b16b1a8e300aa97caca515284b6f) 1962 0 R (namespaceParma__Polyhedra__Library_f9dd9190c5f29dbbfa3d6e442dea7e7d) 1960 0 R (namespaceParma__Polyhedra__Library_fb314bce856c60de821bc388a02571f5) 2017 0 R (namespaceParma__Polyhedra__Library_fbd401e5de5c3b3b7bcef22ffbfd6fb3) 2021 0 R (namespacestd) 1349 0 R] +/Limits [(namespaceParma__Polyhedra__Library_ee4e9b54e65780ac3010fda40ea235a6) (namespacestd)] +>> endobj +12598 0 obj << +/Names [(page.1) 337 0 R (page.10) 579 0 R (page.100) 2699 0 R (page.101) 2709 0 R (page.102) 2721 0 R (page.103) 2735 0 R] +/Limits [(page.1) (page.103)] +>> endobj +12599 0 obj << +/Names [(page.104) 2747 0 R (page.105) 2760 0 R (page.106) 2773 0 R (page.107) 2788 0 R (page.108) 2797 0 R (page.109) 2808 0 R] +/Limits [(page.104) (page.109)] +>> endobj +12600 0 obj << +/Names [(page.11) 590 0 R (page.110) 2818 0 R (page.111) 2837 0 R (page.112) 2870 0 R (page.113) 2919 0 R (page.114) 2976 0 R] +/Limits [(page.11) (page.114)] +>> endobj +12601 0 obj << +/Names [(page.115) 3039 0 R (page.116) 3096 0 R (page.117) 3166 0 R (page.118) 3221 0 R (page.119) 3281 0 R (page.12) 600 0 R] +/Limits [(page.115) (page.12)] +>> endobj +12602 0 obj << +/Names [(page.120) 3302 0 R (page.121) 3315 0 R (page.122) 3325 0 R (page.123) 3335 0 R (page.124) 3347 0 R (page.125) 3357 0 R] +/Limits [(page.120) (page.125)] +>> endobj +12603 0 obj << +/Names [(page.126) 3365 0 R (page.127) 3375 0 R (page.128) 3384 0 R (page.129) 3394 0 R (page.13) 616 0 R (page.130) 3405 0 R] +/Limits [(page.126) (page.130)] +>> endobj +12604 0 obj << +/Names [(page.131) 3419 0 R (page.132) 3431 0 R (page.133) 3440 0 R (page.134) 3453 0 R (page.135) 3465 0 R (page.136) 3474 0 R] +/Limits [(page.131) (page.136)] +>> endobj +12605 0 obj << +/Names [(page.137) 3490 0 R (page.138) 3499 0 R (page.139) 3508 0 R (page.14) 634 0 R (page.140) 3519 0 R (page.141) 3549 0 R] +/Limits [(page.137) (page.141)] +>> endobj +12606 0 obj << +/Names [(page.142) 3593 0 R (page.143) 3610 0 R (page.144) 3619 0 R (page.145) 3628 0 R (page.146) 3643 0 R (page.147) 3693 0 R] +/Limits [(page.142) (page.147)] +>> endobj +12607 0 obj << +/Names [(page.148) 3734 0 R (page.149) 3782 0 R (page.15) 643 0 R (page.150) 3833 0 R (page.151) 3896 0 R (page.152) 3949 0 R] +/Limits [(page.148) (page.152)] +>> endobj +12608 0 obj << +/Names [(page.153) 4007 0 R (page.154) 4050 0 R (page.155) 4066 0 R (page.156) 4083 0 R (page.157) 4098 0 R (page.158) 4112 0 R] +/Limits [(page.153) (page.158)] +>> endobj +12609 0 obj << +/Names [(page.159) 4126 0 R (page.16) 652 0 R (page.160) 4135 0 R (page.161) 4155 0 R (page.162) 4195 0 R (page.163) 4246 0 R] +/Limits [(page.159) (page.163)] +>> endobj +12610 0 obj << +/Names [(page.164) 4279 0 R (page.165) 4290 0 R (page.166) 4297 0 R (page.167) 4310 0 R (page.168) 4341 0 R (page.169) 4383 0 R] +/Limits [(page.164) (page.169)] +>> endobj +12611 0 obj << +/Names [(page.17) 673 0 R (page.170) 4429 0 R (page.171) 4451 0 R (page.172) 4459 0 R (page.173) 4483 0 R (page.174) 4515 0 R] +/Limits [(page.17) (page.174)] +>> endobj +12612 0 obj << +/Names [(page.175) 4556 0 R (page.176) 4615 0 R (page.177) 4687 0 R (page.178) 4716 0 R (page.179) 4727 0 R (page.18) 695 0 R] +/Limits [(page.175) (page.18)] +>> endobj +12613 0 obj << +/Names [(page.180) 4734 0 R (page.181) 4746 0 R (page.182) 4762 0 R (page.183) 4790 0 R (page.184) 4832 0 R (page.185) 4870 0 R] +/Limits [(page.180) (page.185)] +>> endobj +12614 0 obj << +/Names [(page.186) 4887 0 R (page.187) 4910 0 R (page.188) 4933 0 R (page.189) 4962 0 R (page.19) 710 0 R (page.190) 5007 0 R] +/Limits [(page.186) (page.190)] +>> endobj +12615 0 obj << +/Names [(page.191) 5031 0 R (page.192) 5058 0 R (page.193) 5096 0 R (page.194) 5146 0 R (page.195) 5207 0 R (page.196) 5226 0 R] +/Limits [(page.191) (page.196)] +>> endobj +12616 0 obj << +/Names [(page.197) 5233 0 R (page.198) 5241 0 R (page.199) 5262 0 R (page.2) 466 0 R (page.20) 728 0 R (page.200) 5276 0 R] +/Limits [(page.197) (page.200)] +>> endobj +12617 0 obj << +/Names [(page.201) 5290 0 R (page.202) 5297 0 R (page.203) 5313 0 R (page.204) 5353 0 R (page.205) 5387 0 R (page.206) 5402 0 R] +/Limits [(page.201) (page.206)] +>> endobj +12618 0 obj << +/Names [(page.207) 5414 0 R (page.208) 5443 0 R (page.209) 5505 0 R (page.21) 743 0 R (page.210) 5535 0 R (page.211) 5553 0 R] +/Limits [(page.207) (page.211)] +>> endobj +12619 0 obj << +/Names [(page.212) 5604 0 R (page.213) 5660 0 R (page.214) 5718 0 R (page.215) 5774 0 R (page.216) 5828 0 R (page.217) 5893 0 R] +/Limits [(page.212) (page.217)] +>> endobj +12620 0 obj << +/Names [(page.218) 5946 0 R (page.219) 5989 0 R (page.22) 759 0 R (page.220) 6013 0 R (page.221) 6020 0 R (page.222) 6025 0 R] +/Limits [(page.218) (page.222)] +>> endobj +12621 0 obj << +/Names [(page.223) 6030 0 R (page.224) 6038 0 R (page.225) 6046 0 R (page.226) 6054 0 R (page.227) 6064 0 R (page.228) 6070 0 R] +/Limits [(page.223) (page.228)] +>> endobj +12622 0 obj << +/Names [(page.229) 6085 0 R (page.23) 777 0 R (page.230) 6094 0 R (page.231) 6103 0 R (page.232) 6115 0 R (page.233) 6127 0 R] +/Limits [(page.229) (page.233)] +>> endobj +12623 0 obj << +/Names [(page.234) 6139 0 R (page.235) 6149 0 R (page.236) 6159 0 R (page.237) 6167 0 R (page.238) 6181 0 R (page.239) 6194 0 R] +/Limits [(page.234) (page.239)] +>> endobj +12624 0 obj << +/Names [(page.24) 792 0 R (page.240) 6208 0 R (page.241) 6219 0 R (page.242) 6230 0 R (page.243) 6239 0 R (page.244) 6253 0 R] +/Limits [(page.24) (page.244)] +>> endobj +12625 0 obj << +/Names [(page.245) 6268 0 R (page.246) 6279 0 R (page.247) 6292 0 R (page.248) 6307 0 R (page.249) 6318 0 R (page.25) 807 0 R] +/Limits [(page.245) (page.25)] +>> endobj +12626 0 obj << +/Names [(page.250) 6346 0 R (page.251) 6383 0 R (page.252) 6427 0 R (page.253) 6475 0 R (page.254) 6501 0 R (page.255) 6510 0 R] +/Limits [(page.250) (page.255)] +>> endobj +12627 0 obj << +/Names [(page.256) 6518 0 R (page.257) 6540 0 R (page.258) 6551 0 R (page.259) 6592 0 R (page.26) 818 0 R (page.260) 6637 0 R] +/Limits [(page.256) (page.260)] +>> endobj +12628 0 obj << +/Names [(page.261) 6669 0 R (page.262) 6683 0 R (page.263) 6693 0 R (page.264) 6722 0 R (page.265) 6753 0 R (page.266) 6772 0 R] +/Limits [(page.261) (page.266)] +>> endobj +12629 0 obj << +/Names [(page.267) 6798 0 R (page.268) 6823 0 R (page.269) 6839 0 R (page.27) 833 0 R (page.270) 6849 0 R (page.271) 6870 0 R] +/Limits [(page.267) (page.271)] +>> endobj +12630 0 obj << +/Names [(page.272) 6912 0 R (page.273) 6978 0 R (page.274) 7042 0 R (page.275) 7068 0 R (page.276) 7077 0 R (page.277) 7090 0 R] +/Limits [(page.272) (page.277)] +>> endobj +12631 0 obj << +/Names [(page.278) 7108 0 R (page.279) 7147 0 R (page.28) 853 0 R (page.280) 7199 0 R (page.281) 7252 0 R (page.282) 7286 0 R] +/Limits [(page.278) (page.282)] +>> endobj +12632 0 obj << +/Names [(page.283) 7301 0 R (page.284) 7314 0 R (page.285) 7322 0 R (page.286) 7333 0 R (page.287) 7355 0 R (page.288) 7407 0 R] +/Limits [(page.283) (page.288)] +>> endobj +12633 0 obj << +/Names [(page.289) 7430 0 R (page.29) 880 0 R (page.290) 7440 0 R (page.291) 7449 0 R (page.292) 7460 0 R (page.293) 7476 0 R] +/Limits [(page.289) (page.293)] +>> endobj +12634 0 obj << +/Names [(page.294) 7523 0 R (page.295) 7580 0 R (page.296) 7635 0 R (page.297) 7692 0 R (page.298) 7761 0 R (page.299) 7820 0 R] +/Limits [(page.294) (page.299)] +>> endobj +12635 0 obj << +/Names [(page.3) 488 0 R (page.30) 901 0 R (page.300) 7875 0 R (page.301) 7905 0 R (page.302) 7920 0 R (page.303) 7928 0 R] +/Limits [(page.3) (page.303)] +>> endobj +12636 0 obj << +/Names [(page.304) 7938 0 R (page.305) 7947 0 R (page.306) 7958 0 R (page.307) 7969 0 R (page.308) 7976 0 R (page.309) 7984 0 R] +/Limits [(page.304) (page.309)] +>> endobj +12637 0 obj << +/Names [(page.31) 912 0 R (page.310) 7993 0 R (page.311) 8005 0 R (page.312) 8016 0 R (page.313) 8029 0 R (page.314) 8040 0 R] +/Limits [(page.31) (page.314)] +>> endobj +12638 0 obj << +/Names [(page.315) 8050 0 R (page.316) 8064 0 R (page.317) 8077 0 R (page.318) 8089 0 R (page.319) 8102 0 R (page.32) 926 0 R] +/Limits [(page.315) (page.32)] +>> endobj +12639 0 obj << +/Names [(page.320) 8113 0 R (page.321) 8125 0 R (page.322) 8133 0 R (page.323) 8176 0 R (page.324) 8227 0 R (page.325) 8281 0 R] +/Limits [(page.320) (page.325)] +>> endobj +12640 0 obj << +/Names [(page.326) 8338 0 R (page.327) 8407 0 R (page.328) 8459 0 R (page.329) 8495 0 R (page.33) 950 0 R (page.330) 8530 0 R] +/Limits [(page.326) (page.330)] +>> endobj +12641 0 obj << +/Names [(page.331) 8545 0 R (page.332) 8552 0 R (page.333) 8560 0 R (page.334) 8567 0 R (page.335) 8576 0 R (page.336) 8584 0 R] +/Limits [(page.331) (page.336)] +>> endobj +12642 0 obj << +/Names [(page.337) 8594 0 R (page.338) 8602 0 R (page.339) 8609 0 R (page.34) 973 0 R (page.340) 8619 0 R (page.341) 8629 0 R] +/Limits [(page.337) (page.341)] +>> endobj +12643 0 obj << +/Names [(page.342) 8640 0 R (page.343) 8653 0 R (page.344) 8667 0 R (page.345) 8681 0 R (page.346) 8691 0 R (page.347) 8707 0 R] +/Limits [(page.342) (page.347)] +>> endobj +12644 0 obj << +/Names [(page.348) 8719 0 R (page.349) 8733 0 R (page.35) 990 0 R (page.350) 8755 0 R (page.351) 8805 0 R (page.352) 8857 0 R] +/Limits [(page.348) (page.352)] +>> endobj +12645 0 obj << +/Names [(page.353) 8913 0 R (page.354) 8973 0 R (page.355) 9031 0 R (page.356) 9080 0 R (page.357) 9126 0 R (page.358) 9144 0 R] +/Limits [(page.353) (page.358)] +>> endobj +12646 0 obj << +/Names [(page.359) 9154 0 R (page.36) 1009 0 R (page.360) 9162 0 R (page.361) 9172 0 R (page.362) 9181 0 R (page.363) 9188 0 R] +/Limits [(page.359) (page.363)] +>> endobj +12647 0 obj << +/Names [(page.364) 9198 0 R (page.365) 9212 0 R (page.366) 9225 0 R (page.367) 9236 0 R (page.368) 9249 0 R (page.369) 9262 0 R] +/Limits [(page.364) (page.369)] +>> endobj +12648 0 obj << +/Names [(page.37) 1030 0 R (page.370) 9276 0 R (page.371) 9288 0 R (page.372) 9302 0 R (page.373) 9315 0 R (page.374) 9330 0 R] +/Limits [(page.37) (page.374)] +>> endobj +12649 0 obj << +/Names [(page.375) 9346 0 R (page.376) 9374 0 R (page.377) 9409 0 R (page.378) 9443 0 R (page.379) 9469 0 R (page.38) 1052 0 R] +/Limits [(page.375) (page.38)] +>> endobj +12650 0 obj << +/Names [(page.380) 9512 0 R (page.381) 9566 0 R (page.382) 9622 0 R (page.383) 9672 0 R (page.384) 9739 0 R (page.385) 9802 0 R] +/Limits [(page.380) (page.385)] +>> endobj +12651 0 obj << +/Names [(page.386) 9847 0 R (page.387) 9898 0 R (page.388) 9923 0 R (page.389) 9931 0 R (page.39) 1073 0 R (page.390) 9936 0 R] +/Limits [(page.386) (page.390)] +>> endobj +12652 0 obj << +/Names [(page.391) 9941 0 R (page.392) 9950 0 R (page.393) 9958 0 R (page.394) 9968 0 R (page.395) 9979 0 R (page.396) 9987 0 R] +/Limits [(page.391) (page.396)] +>> endobj +12653 0 obj << +/Names [(page.397) 9999 0 R (page.398) 10010 0 R (page.399) 10020 0 R (page.4) 503 0 R (page.40) 1080 0 R (page.400) 10030 0 R] +/Limits [(page.397) (page.400)] +>> endobj +12654 0 obj << +/Names [(page.401) 10043 0 R (page.402) 10052 0 R (page.403) 10062 0 R (page.404) 10073 0 R (page.405) 10087 0 R (page.406) 10100 0 R] +/Limits [(page.401) (page.406)] +>> endobj +12655 0 obj << +/Names [(page.407) 10116 0 R (page.408) 10126 0 R (page.409) 10142 0 R (page.41) 1089 0 R (page.410) 10158 0 R (page.411) 10170 0 R] +/Limits [(page.407) (page.411)] +>> endobj +12656 0 obj << +/Names [(page.412) 10183 0 R (page.413) 10199 0 R (page.414) 10209 0 R (page.415) 10244 0 R (page.416) 10295 0 R (page.417) 10338 0 R] +/Limits [(page.412) (page.417)] +>> endobj +12657 0 obj << +/Names [(page.418) 10373 0 R (page.419) 10392 0 R (page.42) 1098 0 R (page.420) 10400 0 R (page.421) 10414 0 R (page.422) 10431 0 R] +/Limits [(page.418) (page.422)] +>> endobj +12658 0 obj << +/Names [(page.423) 10457 0 R (page.424) 10488 0 R (page.425) 10510 0 R (page.426) 10546 0 R (page.427) 10568 0 R (page.428) 10641 0 R] +/Limits [(page.423) (page.428)] +>> endobj +12659 0 obj << +/Names [(page.429) 10709 0 R (page.43) 1104 0 R (page.430) 10776 0 R (page.431) 10838 0 R (page.432) 10906 0 R (page.433) 10968 0 R] +/Limits [(page.429) (page.433)] +>> endobj +12660 0 obj << +/Names [(page.434) 11039 0 R (page.435) 11105 0 R (page.436) 11201 0 R (page.437) 11318 0 R (page.438) 11430 0 R (page.439) 11541 0 R] +/Limits [(page.434) (page.439)] +>> endobj +12661 0 obj << +/Names [(page.44) 1110 0 R (page.440) 11663 0 R (page.441) 11783 0 R (page.442) 11883 0 R (page.443) 11968 0 R (page.444) 12037 0 R] +/Limits [(page.44) (page.444)] +>> endobj +12662 0 obj << +/Names [(page.445) 12106 0 R (page.446) 12158 0 R (page.45) 1117 0 R (page.46) 1124 0 R (page.47) 1135 0 R (page.48) 1146 0 R] +/Limits [(page.445) (page.48)] +>> endobj +12663 0 obj << +/Names [(page.49) 1152 0 R (page.5) 512 0 R (page.50) 1157 0 R (page.51) 1162 0 R (page.52) 1168 0 R (page.53) 1186 0 R] +/Limits [(page.49) (page.53)] +>> endobj +12664 0 obj << +/Names [(page.54) 1232 0 R (page.55) 1292 0 R (page.56) 1340 0 R (page.57) 1382 0 R (page.58) 1419 0 R (page.59) 1475 0 R] +/Limits [(page.54) (page.59)] +>> endobj +12665 0 obj << +/Names [(page.6) 522 0 R (page.60) 1536 0 R (page.61) 1575 0 R (page.62) 1599 0 R (page.63) 1618 0 R (page.64) 1663 0 R] +/Limits [(page.6) (page.64)] +>> endobj +12666 0 obj << +/Names [(page.65) 1740 0 R (page.66) 1779 0 R (page.67) 1793 0 R (page.68) 1801 0 R (page.69) 1824 0 R (page.7) 534 0 R] +/Limits [(page.65) (page.7)] +>> endobj +12667 0 obj << +/Names [(page.70) 1849 0 R (page.71) 1870 0 R (page.72) 1931 0 R (page.73) 1957 0 R (page.74) 2005 0 R (page.75) 2040 0 R] +/Limits [(page.70) (page.75)] +>> endobj +12668 0 obj << +/Names [(page.76) 2063 0 R (page.77) 2079 0 R (page.78) 2110 0 R (page.79) 2169 0 R (page.8) 554 0 R (page.80) 2231 0 R] +/Limits [(page.76) (page.80)] +>> endobj +12669 0 obj << +/Names [(page.81) 2282 0 R (page.82) 2340 0 R (page.83) 2405 0 R (page.84) 2463 0 R (page.85) 2522 0 R (page.86) 2544 0 R] +/Limits [(page.81) (page.86)] +>> endobj +12670 0 obj << +/Names [(page.87) 2555 0 R (page.88) 2564 0 R (page.89) 2575 0 R (page.9) 567 0 R (page.90) 2583 0 R (page.91) 2593 0 R] +/Limits [(page.87) (page.91)] +>> endobj +12671 0 obj << +/Names [(page.92) 2600 0 R (page.93) 2613 0 R (page.94) 2624 0 R (page.95) 2637 0 R (page.96) 2650 0 R (page.97) 2660 0 R] +/Limits [(page.92) (page.97)] +>> endobj +12672 0 obj << +/Names [(page.98) 2673 0 R (page.99) 2686 0 R (page.i) 373 0 R (page.ii) 417 0 R (paragraph.1.1.2.1) 492 0 R (paragraph.1.1.2.2) 494 0 R] +/Limits [(page.98) (paragraph.1.1.2.2)] +>> endobj +12673 0 obj << +/Names [(paragraph.1.1.2.3) 513 0 R (paragraph.10.1.2.1) 2055 0 R (paragraph.10.1.2.2) 2064 0 R (paragraph.10.1.2.3) 2066 0 R (paragraph.10.1.2.4) 2067 0 R (paragraph.10.1.2.5) 2068 0 R] +/Limits [(paragraph.1.1.2.3) (paragraph.10.1.2.5)] +>> endobj +12674 0 obj << +/Names [(paragraph.10.2.2.1) 2081 0 R (paragraph.11.1.2.1) 2557 0 R (paragraph.11.1.2.10) 2578 0 R (paragraph.11.1.2.2) 2558 0 R (paragraph.11.1.2.3) 2565 0 R (paragraph.11.1.2.4) 2566 0 R] +/Limits [(paragraph.10.2.2.1) (paragraph.11.1.2.4)] +>> endobj +12675 0 obj << +/Names [(paragraph.11.1.2.5) 2567 0 R (paragraph.11.1.2.6) 2568 0 R (paragraph.11.1.2.7) 2569 0 R (paragraph.11.1.2.8) 2576 0 R (paragraph.11.1.2.9) 2577 0 R (paragraph.11.1.3.1) 2585 0 R] +/Limits [(paragraph.11.1.2.5) (paragraph.11.1.3.1)] +>> endobj +12676 0 obj << +/Names [(paragraph.11.1.3.10) 2604 0 R (paragraph.11.1.3.11) 2605 0 R (paragraph.11.1.3.12) 2606 0 R (paragraph.11.1.3.13) 2614 0 R (paragraph.11.1.3.14) 2615 0 R (paragraph.11.1.3.15) 2616 0 R] +/Limits [(paragraph.11.1.3.10) (paragraph.11.1.3.15)] +>> endobj +12677 0 obj << +/Names [(paragraph.11.1.3.16) 2617 0 R (paragraph.11.1.3.17) 2625 0 R (paragraph.11.1.3.18) 2626 0 R (paragraph.11.1.3.19) 2627 0 R (paragraph.11.1.3.2) 2586 0 R (paragraph.11.1.3.20) 2638 0 R] +/Limits [(paragraph.11.1.3.16) (paragraph.11.1.3.20)] +>> endobj +12678 0 obj << +/Names [(paragraph.11.1.3.21) 2639 0 R (paragraph.11.1.3.22) 2640 0 R (paragraph.11.1.3.23) 2651 0 R (paragraph.11.1.3.24) 2652 0 R (paragraph.11.1.3.25) 2653 0 R (paragraph.11.1.3.26) 2654 0 R] +/Limits [(paragraph.11.1.3.21) (paragraph.11.1.3.26)] +>> endobj +12679 0 obj << +/Names [(paragraph.11.1.3.27) 2661 0 R (paragraph.11.1.3.28) 2662 0 R (paragraph.11.1.3.29) 2663 0 R (paragraph.11.1.3.3) 2587 0 R (paragraph.11.1.3.30) 2664 0 R (paragraph.11.1.3.31) 2674 0 R] +/Limits [(paragraph.11.1.3.27) (paragraph.11.1.3.31)] +>> endobj +12680 0 obj << +/Names [(paragraph.11.1.3.32) 2675 0 R (paragraph.11.1.3.33) 2676 0 R (paragraph.11.1.3.34) 2677 0 R (paragraph.11.1.3.35) 2687 0 R (paragraph.11.1.3.36) 2688 0 R (paragraph.11.1.3.37) 2689 0 R] +/Limits [(paragraph.11.1.3.32) (paragraph.11.1.3.37)] +>> endobj +12681 0 obj << +/Names [(paragraph.11.1.3.38) 2690 0 R (paragraph.11.1.3.39) 2691 0 R (paragraph.11.1.3.4) 2588 0 R (paragraph.11.1.3.40) 2700 0 R (paragraph.11.1.3.41) 2701 0 R (paragraph.11.1.3.42) 2710 0 R] +/Limits [(paragraph.11.1.3.38) (paragraph.11.1.3.42)] +>> endobj +12682 0 obj << +/Names [(paragraph.11.1.3.43) 2711 0 R (paragraph.11.1.3.44) 2712 0 R (paragraph.11.1.3.45) 2722 0 R (paragraph.11.1.3.46) 2723 0 R (paragraph.11.1.3.47) 2724 0 R (paragraph.11.1.3.48) 2736 0 R] +/Limits [(paragraph.11.1.3.43) (paragraph.11.1.3.48)] +>> endobj +12683 0 obj << +/Names [(paragraph.11.1.3.49) 2737 0 R (paragraph.11.1.3.5) 2594 0 R (paragraph.11.1.3.50) 2738 0 R (paragraph.11.1.3.51) 2748 0 R (paragraph.11.1.3.52) 2749 0 R (paragraph.11.1.3.53) 2751 0 R] +/Limits [(paragraph.11.1.3.49) (paragraph.11.1.3.53)] +>> endobj +12684 0 obj << +/Names [(paragraph.11.1.3.54) 2761 0 R (paragraph.11.1.3.55) 2762 0 R (paragraph.11.1.3.56) 2763 0 R (paragraph.11.1.3.57) 2774 0 R (paragraph.11.1.3.58) 2775 0 R (paragraph.11.1.3.59) 2776 0 R] +/Limits [(paragraph.11.1.3.54) (paragraph.11.1.3.59)] +>> endobj +12685 0 obj << +/Names [(paragraph.11.1.3.6) 2595 0 R (paragraph.11.1.3.60) 2777 0 R (paragraph.11.1.3.61) 2789 0 R (paragraph.11.1.3.62) 2790 0 R (paragraph.11.1.3.63) 2791 0 R (paragraph.11.1.3.64) 2798 0 R] +/Limits [(paragraph.11.1.3.6) (paragraph.11.1.3.64)] +>> endobj +12686 0 obj << +/Names [(paragraph.11.1.3.7) 2601 0 R (paragraph.11.1.3.8) 2602 0 R (paragraph.11.1.3.9) 2603 0 R (paragraph.11.1.4.1) 2800 0 R (paragraph.11.1.4.10) 2821 0 R (paragraph.11.1.4.2) 2801 0 R] +/Limits [(paragraph.11.1.3.7) (paragraph.11.1.4.2)] +>> endobj +12687 0 obj << +/Names [(paragraph.11.1.4.3) 2802 0 R (paragraph.11.1.4.4) 2803 0 R (paragraph.11.1.4.5) 2809 0 R (paragraph.11.1.4.6) 2810 0 R (paragraph.11.1.4.7) 2811 0 R (paragraph.11.1.4.8) 2819 0 R] +/Limits [(paragraph.11.1.4.3) (paragraph.11.1.4.8)] +>> endobj +12688 0 obj << +/Names [(paragraph.11.1.4.9) 2820 0 R (paragraph.11.10.2.1) 4729 0 R (paragraph.11.10.3.1) 4736 0 R (paragraph.11.10.4.1) 4738 0 R (paragraph.11.10.4.2) 4739 0 R (paragraph.11.10.4.3) 4740 0 R] +/Limits [(paragraph.11.1.4.9) (paragraph.11.10.4.3)] +>> endobj +12689 0 obj << +/Names [(paragraph.11.10.4.4) 4741 0 R (paragraph.11.10.5.1) 4748 0 R (paragraph.11.10.5.10) 4757 0 R (paragraph.11.10.5.11) 4763 0 R (paragraph.11.10.5.12) 4764 0 R (paragraph.11.10.5.13) 4765 0 R] +/Limits [(paragraph.11.10.4.4) (paragraph.11.10.5.13)] +>> endobj +12690 0 obj << +/Names [(paragraph.11.10.5.14) 4766 0 R (paragraph.11.10.5.15) 4767 0 R (paragraph.11.10.5.16) 4768 0 R (paragraph.11.10.5.17) 4769 0 R (paragraph.11.10.5.18) 4770 0 R (paragraph.11.10.5.19) 4771 0 R] +/Limits [(paragraph.11.10.5.14) (paragraph.11.10.5.19)] +>> endobj +12691 0 obj << +/Names [(paragraph.11.10.5.2) 4749 0 R (paragraph.11.10.5.20) 4772 0 R (paragraph.11.10.5.21) 4773 0 R (paragraph.11.10.5.22) 4791 0 R (paragraph.11.10.5.23) 4792 0 R (paragraph.11.10.5.24) 4793 0 R] +/Limits [(paragraph.11.10.5.2) (paragraph.11.10.5.24)] +>> endobj +12692 0 obj << +/Names [(paragraph.11.10.5.25) 4794 0 R (paragraph.11.10.5.3) 4750 0 R (paragraph.11.10.5.4) 4751 0 R (paragraph.11.10.5.5) 4752 0 R (paragraph.11.10.5.6) 4753 0 R (paragraph.11.10.5.7) 4754 0 R] +/Limits [(paragraph.11.10.5.25) (paragraph.11.10.5.7)] +>> endobj +12693 0 obj << +/Names [(paragraph.11.10.5.8) 4755 0 R (paragraph.11.10.5.9) 4756 0 R (paragraph.11.11.2.1) 4889 0 R (paragraph.11.11.2.2) 4890 0 R (paragraph.11.11.2.3) 4891 0 R (paragraph.11.13.2.1) 4941 0 R] +/Limits [(paragraph.11.10.5.8) (paragraph.11.13.2.1)] +>> endobj +12694 0 obj << +/Names [(paragraph.11.14.2.1) 5037 0 R (paragraph.11.14.3.1) 5039 0 R (paragraph.11.14.3.2) 5040 0 R (paragraph.11.14.3.3) 5042 0 R (paragraph.11.14.3.4) 5044 0 R (paragraph.11.17.2.1) 5243 0 R] +/Limits [(paragraph.11.14.2.1) (paragraph.11.17.2.1)] +>> endobj +12695 0 obj << +/Names [(paragraph.11.17.3.1) 5245 0 R (paragraph.11.17.3.2) 5263 0 R (paragraph.11.17.3.3) 5264 0 R (paragraph.11.17.3.4) 5266 0 R (paragraph.11.17.3.5) 5268 0 R (paragraph.11.17.3.6) 5277 0 R] +/Limits [(paragraph.11.17.3.1) (paragraph.11.17.3.6)] +>> endobj +12696 0 obj << +/Names [(paragraph.11.17.3.7) 5278 0 R (paragraph.11.17.4.1) 5280 0 R (paragraph.11.17.4.10) 5314 0 R (paragraph.11.17.4.11) 5315 0 R (paragraph.11.17.4.2) 5281 0 R (paragraph.11.17.4.3) 5282 0 R] +/Limits [(paragraph.11.17.3.7) (paragraph.11.17.4.3)] +>> endobj +12697 0 obj << +/Names [(paragraph.11.17.4.4) 5283 0 R (paragraph.11.17.4.5) 5284 0 R (paragraph.11.17.4.6) 5291 0 R (paragraph.11.17.4.7) 5292 0 R (paragraph.11.17.4.8) 5298 0 R (paragraph.11.17.4.9) 5299 0 R] +/Limits [(paragraph.11.17.4.4) (paragraph.11.17.4.9)] +>> endobj +12698 0 obj << +/Names [(paragraph.11.18.2.1) 5416 0 R (paragraph.11.18.2.2) 5418 0 R (paragraph.11.18.3.1) 5420 0 R (paragraph.11.18.3.2) 5421 0 R (paragraph.11.2.2.1) 2847 0 R (paragraph.11.20.2.1) 5539 0 R] +/Limits [(paragraph.11.18.2.1) (paragraph.11.20.2.1)] +>> endobj +12699 0 obj << +/Names [(paragraph.11.20.2.10) 5557 0 R (paragraph.11.20.2.11) 5558 0 R (paragraph.11.20.2.12) 5559 0 R (paragraph.11.20.2.13) 5560 0 R (paragraph.11.20.2.14) 5561 0 R (paragraph.11.20.2.15) 5562 0 R] +/Limits [(paragraph.11.20.2.10) (paragraph.11.20.2.15)] +>> endobj +12700 0 obj << +/Names [(paragraph.11.20.2.16) 5563 0 R (paragraph.11.20.2.2) 5540 0 R (paragraph.11.20.2.3) 5541 0 R (paragraph.11.20.2.4) 5542 0 R (paragraph.11.20.2.5) 5543 0 R (paragraph.11.20.2.6) 5544 0 R] +/Limits [(paragraph.11.20.2.16) (paragraph.11.20.2.6)] +>> endobj +12701 0 obj << +/Names [(paragraph.11.20.2.7) 5554 0 R (paragraph.11.20.2.8) 5555 0 R (paragraph.11.20.2.9) 5556 0 R (paragraph.11.21.2.1) 6032 0 R (paragraph.11.21.2.10) 6056 0 R (paragraph.11.21.2.11) 6057 0 R] +/Limits [(paragraph.11.20.2.7) (paragraph.11.21.2.11)] +>> endobj +12702 0 obj << +/Names [(paragraph.11.21.2.12) 6065 0 R (paragraph.11.21.2.13) 6071 0 R (paragraph.11.21.2.2) 6033 0 R (paragraph.11.21.2.3) 6039 0 R (paragraph.11.21.2.4) 6040 0 R (paragraph.11.21.2.5) 6041 0 R] +/Limits [(paragraph.11.21.2.12) (paragraph.11.21.2.5)] +>> endobj +12703 0 obj << +/Names [(paragraph.11.21.2.6) 6047 0 R (paragraph.11.21.2.7) 6048 0 R (paragraph.11.21.2.8) 6049 0 R (paragraph.11.21.2.9) 6055 0 R (paragraph.11.21.3.1) 6073 0 R (paragraph.11.21.3.10) 6096 0 R] +/Limits [(paragraph.11.21.2.6) (paragraph.11.21.3.10)] +>> endobj +12704 0 obj << +/Names [(paragraph.11.21.3.11) 6097 0 R (paragraph.11.21.3.12) 6104 0 R (paragraph.11.21.3.13) 6105 0 R (paragraph.11.21.3.14) 6106 0 R (paragraph.11.21.3.15) 6116 0 R (paragraph.11.21.3.16) 6117 0 R] +/Limits [(paragraph.11.21.3.11) (paragraph.11.21.3.16)] +>> endobj +12705 0 obj << +/Names [(paragraph.11.21.3.17) 6118 0 R (paragraph.11.21.3.18) 6119 0 R (paragraph.11.21.3.19) 6128 0 R (paragraph.11.21.3.2) 6074 0 R (paragraph.11.21.3.20) 6129 0 R (paragraph.11.21.3.21) 6130 0 R] +/Limits [(paragraph.11.21.3.17) (paragraph.11.21.3.21)] +>> endobj +12706 0 obj << +/Names [(paragraph.11.21.3.22) 6140 0 R (paragraph.11.21.3.23) 6141 0 R (paragraph.11.21.3.24) 6142 0 R (paragraph.11.21.3.25) 6150 0 R (paragraph.11.21.3.26) 6151 0 R (paragraph.11.21.3.27) 6152 0 R] +/Limits [(paragraph.11.21.3.22) (paragraph.11.21.3.27)] +>> endobj +12707 0 obj << +/Names [(paragraph.11.21.3.28) 6160 0 R (paragraph.11.21.3.29) 6161 0 R (paragraph.11.21.3.3) 6075 0 R (paragraph.11.21.3.30) 6162 0 R (paragraph.11.21.3.31) 6168 0 R (paragraph.11.21.3.32) 6169 0 R] +/Limits [(paragraph.11.21.3.28) (paragraph.11.21.3.32)] +>> endobj +12708 0 obj << +/Names [(paragraph.11.21.3.33) 6170 0 R (paragraph.11.21.3.34) 6171 0 R (paragraph.11.21.3.35) 6182 0 R (paragraph.11.21.3.36) 6183 0 R (paragraph.11.21.3.37) 6184 0 R (paragraph.11.21.3.38) 6195 0 R] +/Limits [(paragraph.11.21.3.33) (paragraph.11.21.3.38)] +>> endobj +12709 0 obj << +/Names [(paragraph.11.21.3.39) 6196 0 R (paragraph.11.21.3.4) 6076 0 R (paragraph.11.21.3.40) 6197 0 R (paragraph.11.21.3.41) 6198 0 R (paragraph.11.21.3.42) 6209 0 R (paragraph.11.21.3.43) 6210 0 R] +/Limits [(paragraph.11.21.3.39) (paragraph.11.21.3.43)] +>> endobj +12710 0 obj << +/Names [(paragraph.11.21.3.44) 6211 0 R (paragraph.11.21.3.45) 6212 0 R (paragraph.11.21.3.46) 6220 0 R (paragraph.11.21.3.47) 6221 0 R (paragraph.11.21.3.48) 6222 0 R (paragraph.11.21.3.49) 6231 0 R] +/Limits [(paragraph.11.21.3.44) (paragraph.11.21.3.49)] +>> endobj +12711 0 obj << +/Names [(paragraph.11.21.3.5) 6077 0 R (paragraph.11.21.3.50) 6232 0 R (paragraph.11.21.3.51) 6240 0 R (paragraph.11.21.3.52) 6241 0 R (paragraph.11.21.3.53) 6242 0 R (paragraph.11.21.3.54) 6254 0 R] +/Limits [(paragraph.11.21.3.5) (paragraph.11.21.3.54)] +>> endobj +12712 0 obj << +/Names [(paragraph.11.21.3.55) 6255 0 R (paragraph.11.21.3.56) 6256 0 R (paragraph.11.21.3.57) 6269 0 R (paragraph.11.21.3.58) 6270 0 R (paragraph.11.21.3.59) 6271 0 R (paragraph.11.21.3.6) 6078 0 R] +/Limits [(paragraph.11.21.3.55) (paragraph.11.21.3.6)] +>> endobj +12713 0 obj << +/Names [(paragraph.11.21.3.60) 6280 0 R (paragraph.11.21.3.61) 6281 0 R (paragraph.11.21.3.62) 6282 0 R (paragraph.11.21.3.63) 6293 0 R (paragraph.11.21.3.64) 6294 0 R (paragraph.11.21.3.65) 6295 0 R] +/Limits [(paragraph.11.21.3.60) (paragraph.11.21.3.65)] +>> endobj +12714 0 obj << +/Names [(paragraph.11.21.3.66) 6296 0 R (paragraph.11.21.3.67) 6308 0 R (paragraph.11.21.3.68) 6309 0 R (paragraph.11.21.3.69) 6319 0 R (paragraph.11.21.3.7) 6086 0 R (paragraph.11.21.3.8) 6087 0 R] +/Limits [(paragraph.11.21.3.66) (paragraph.11.21.3.8)] +>> endobj +12715 0 obj << +/Names [(paragraph.11.21.3.9) 6095 0 R (paragraph.11.21.4.1) 6321 0 R (paragraph.11.21.4.2) 6322 0 R (paragraph.11.21.4.3) 6323 0 R (paragraph.11.21.4.4) 6324 0 R (paragraph.11.22.2.1) 6356 0 R] +/Limits [(paragraph.11.21.3.9) (paragraph.11.22.2.1)] +>> endobj +12716 0 obj << +/Names [(paragraph.11.24.2.1) 6520 0 R (paragraph.11.24.3.1) 6522 0 R (paragraph.11.24.3.2) 6541 0 R (paragraph.11.24.3.3) 6542 0 R (paragraph.11.24.3.4) 6543 0 R (paragraph.11.24.3.5) 6544 0 R] +/Limits [(paragraph.11.24.2.1) (paragraph.11.24.3.5)] +>> endobj +12717 0 obj << +/Names [(paragraph.11.24.3.6) 6552 0 R (paragraph.11.24.3.7) 6553 0 R (paragraph.11.24.4.1) 6555 0 R (paragraph.11.24.4.2) 6556 0 R (paragraph.11.24.4.3) 6557 0 R (paragraph.11.24.4.4) 6558 0 R] +/Limits [(paragraph.11.24.3.6) (paragraph.11.24.4.4)] +>> endobj +12718 0 obj << +/Names [(paragraph.11.24.4.5) 6559 0 R (paragraph.11.25.2.1) 6695 0 R (paragraph.11.25.2.2) 6696 0 R (paragraph.11.25.2.3) 6698 0 R (paragraph.11.25.3.1) 6700 0 R (paragraph.11.25.3.2) 6701 0 R] +/Limits [(paragraph.11.24.4.5) (paragraph.11.25.3.2)] +>> endobj +12719 0 obj << +/Names [(paragraph.11.25.3.3) 6702 0 R (paragraph.11.27.2.1) 6775 0 R (paragraph.11.29.2.1) 6841 0 R (paragraph.11.29.2.2) 6842 0 R (paragraph.11.29.2.3) 6843 0 R (paragraph.11.29.2.4) 6844 0 R] +/Limits [(paragraph.11.25.3.3) (paragraph.11.29.2.4)] +>> endobj +12720 0 obj << +/Names [(paragraph.11.29.2.5) 6850 0 R (paragraph.11.29.2.6) 6851 0 R (paragraph.11.29.3.1) 6853 0 R (paragraph.11.33.2.1) 7071 0 R (paragraph.11.33.2.2) 7078 0 R (paragraph.11.33.2.3) 7079 0 R] +/Limits [(paragraph.11.29.2.5) (paragraph.11.33.2.3)] +>> endobj +12721 0 obj << +/Names [(paragraph.11.33.2.4) 7080 0 R (paragraph.11.33.2.5) 7081 0 R (paragraph.11.33.3.1) 7083 0 R (paragraph.11.33.3.10) 7097 0 R (paragraph.11.33.3.11) 7098 0 R (paragraph.11.33.3.12) 7099 0 R] +/Limits [(paragraph.11.33.2.4) (paragraph.11.33.3.12)] +>> endobj +12722 0 obj << +/Names [(paragraph.11.33.3.13) 7100 0 R (paragraph.11.33.3.14) 7101 0 R (paragraph.11.33.3.15) 7109 0 R (paragraph.11.33.3.16) 7110 0 R (paragraph.11.33.3.17) 7112 0 R (paragraph.11.33.3.18) 7113 0 R] +/Limits [(paragraph.11.33.3.13) (paragraph.11.33.3.18)] +>> endobj +12723 0 obj << +/Names [(paragraph.11.33.3.19) 7114 0 R (paragraph.11.33.3.2) 7084 0 R (paragraph.11.33.3.20) 7116 0 R (paragraph.11.33.3.21) 7117 0 R (paragraph.11.33.3.22) 7118 0 R (paragraph.11.33.3.23) 7119 0 R] +/Limits [(paragraph.11.33.3.19) (paragraph.11.33.3.23)] +>> endobj +12724 0 obj << +/Names [(paragraph.11.33.3.24) 7148 0 R (paragraph.11.33.3.25) 7149 0 R (paragraph.11.33.3.3) 7085 0 R (paragraph.11.33.3.4) 7091 0 R (paragraph.11.33.3.5) 7092 0 R (paragraph.11.33.3.6) 7093 0 R] +/Limits [(paragraph.11.33.3.24) (paragraph.11.33.3.6)] +>> endobj +12725 0 obj << +/Names [(paragraph.11.33.3.7) 7094 0 R (paragraph.11.33.3.8) 7095 0 R (paragraph.11.33.3.9) 7096 0 R (paragraph.11.34.2.1) 7303 0 R (paragraph.11.34.2.2) 7304 0 R (paragraph.11.34.3.1) 7306 0 R] +/Limits [(paragraph.11.33.3.7) (paragraph.11.34.3.1)] +>> endobj +12726 0 obj << +/Names [(paragraph.11.34.3.2) 7307 0 R (paragraph.11.34.3.3) 7315 0 R (paragraph.11.34.3.4) 7316 0 R (paragraph.11.34.4.1) 7324 0 R (paragraph.11.34.4.10) 7338 0 R (paragraph.11.34.4.11) 7356 0 R] +/Limits [(paragraph.11.34.3.2) (paragraph.11.34.4.11)] +>> endobj +12727 0 obj << +/Names [(paragraph.11.34.4.12) 7357 0 R (paragraph.11.34.4.2) 7325 0 R (paragraph.11.34.4.3) 7326 0 R (paragraph.11.34.4.4) 7327 0 R (paragraph.11.34.4.5) 7328 0 R (paragraph.11.34.4.6) 7334 0 R] +/Limits [(paragraph.11.34.4.12) (paragraph.11.34.4.6)] +>> endobj +12728 0 obj << +/Names [(paragraph.11.34.4.7) 7335 0 R (paragraph.11.34.4.8) 7336 0 R (paragraph.11.34.4.9) 7337 0 R (paragraph.11.34.5.1) 7359 0 R (paragraph.11.34.5.2) 7360 0 R (paragraph.11.35.2.1) 7434 0 R] +/Limits [(paragraph.11.34.4.7) (paragraph.11.35.2.1)] +>> endobj +12729 0 obj << +/Names [(paragraph.11.35.2.10) 7453 0 R (paragraph.11.35.2.11) 7461 0 R (paragraph.11.35.2.12) 7462 0 R (paragraph.11.35.2.2) 7435 0 R (paragraph.11.35.2.3) 7441 0 R (paragraph.11.35.2.4) 7442 0 R] +/Limits [(paragraph.11.35.2.10) (paragraph.11.35.2.4)] +>> endobj +12730 0 obj << +/Names [(paragraph.11.35.2.5) 7443 0 R (paragraph.11.35.2.6) 7444 0 R (paragraph.11.35.2.7) 7450 0 R (paragraph.11.35.2.8) 7451 0 R (paragraph.11.35.2.9) 7452 0 R (paragraph.11.35.3.1) 7464 0 R] +/Limits [(paragraph.11.35.2.5) (paragraph.11.35.3.1)] +>> endobj +12731 0 obj << +/Names [(paragraph.11.36.2.1) 7484 0 R (paragraph.11.37.2.1) 7922 0 R (paragraph.11.37.2.10) 7948 0 R (paragraph.11.37.2.2) 7929 0 R (paragraph.11.37.2.3) 7930 0 R (paragraph.11.37.2.4) 7931 0 R] +/Limits [(paragraph.11.36.2.1) (paragraph.11.37.2.4)] +>> endobj +12732 0 obj << +/Names [(paragraph.11.37.2.5) 7932 0 R (paragraph.11.37.2.6) 7933 0 R (paragraph.11.37.2.7) 7939 0 R (paragraph.11.37.2.8) 7940 0 R (paragraph.11.37.2.9) 7941 0 R (paragraph.11.37.3.1) 7950 0 R] +/Limits [(paragraph.11.37.2.5) (paragraph.11.37.3.1)] +>> endobj +12733 0 obj << +/Names [(paragraph.11.37.3.10) 7964 0 R (paragraph.11.37.3.11) 7970 0 R (paragraph.11.37.3.12) 7971 0 R (paragraph.11.37.3.13) 7977 0 R (paragraph.11.37.3.14) 7978 0 R (paragraph.11.37.3.15) 7979 0 R] +/Limits [(paragraph.11.37.3.10) (paragraph.11.37.3.15)] +>> endobj +12734 0 obj << +/Names [(paragraph.11.37.3.16) 7985 0 R (paragraph.11.37.3.17) 7986 0 R (paragraph.11.37.3.18) 7987 0 R (paragraph.11.37.3.19) 7988 0 R (paragraph.11.37.3.2) 7951 0 R (paragraph.11.37.3.20) 7994 0 R] +/Limits [(paragraph.11.37.3.16) (paragraph.11.37.3.20)] +>> endobj +12735 0 obj << +/Names [(paragraph.11.37.3.21) 7995 0 R (paragraph.11.37.3.22) 7996 0 R (paragraph.11.37.3.23) 8006 0 R (paragraph.11.37.3.24) 8007 0 R (paragraph.11.37.3.25) 8008 0 R (paragraph.11.37.3.26) 8009 0 R] +/Limits [(paragraph.11.37.3.21) (paragraph.11.37.3.26)] +>> endobj +12736 0 obj << +/Names [(paragraph.11.37.3.27) 8017 0 R (paragraph.11.37.3.28) 8018 0 R (paragraph.11.37.3.29) 8019 0 R (paragraph.11.37.3.3) 7952 0 R (paragraph.11.37.3.30) 8020 0 R (paragraph.11.37.3.31) 8021 0 R] +/Limits [(paragraph.11.37.3.27) (paragraph.11.37.3.31)] +>> endobj +12737 0 obj << +/Names [(paragraph.11.37.3.32) 8030 0 R (paragraph.11.37.3.33) 8031 0 R (paragraph.11.37.3.34) 8032 0 R (paragraph.11.37.3.35) 8041 0 R (paragraph.11.37.3.36) 8042 0 R (paragraph.11.37.3.37) 8051 0 R] +/Limits [(paragraph.11.37.3.32) (paragraph.11.37.3.37)] +>> endobj +12738 0 obj << +/Names [(paragraph.11.37.3.38) 8052 0 R (paragraph.11.37.3.39) 8053 0 R (paragraph.11.37.3.4) 7953 0 R (paragraph.11.37.3.40) 8065 0 R (paragraph.11.37.3.41) 8066 0 R (paragraph.11.37.3.42) 8067 0 R] +/Limits [(paragraph.11.37.3.38) (paragraph.11.37.3.42)] +>> endobj +12739 0 obj << +/Names [(paragraph.11.37.3.43) 8078 0 R (paragraph.11.37.3.44) 8079 0 R (paragraph.11.37.3.45) 8080 0 R (paragraph.11.37.3.46) 8090 0 R (paragraph.11.37.3.47) 8091 0 R (paragraph.11.37.3.48) 8092 0 R] +/Limits [(paragraph.11.37.3.43) (paragraph.11.37.3.48)] +>> endobj +12740 0 obj << +/Names [(paragraph.11.37.3.49) 8093 0 R (paragraph.11.37.3.5) 7959 0 R (paragraph.11.37.3.50) 8103 0 R (paragraph.11.37.3.51) 8104 0 R (paragraph.11.37.3.52) 8105 0 R (paragraph.11.37.3.53) 8114 0 R] +/Limits [(paragraph.11.37.3.49) (paragraph.11.37.3.53)] +>> endobj +12741 0 obj << +/Names [(paragraph.11.37.3.54) 8115 0 R (paragraph.11.37.3.6) 7960 0 R (paragraph.11.37.3.7) 7961 0 R (paragraph.11.37.3.8) 7962 0 R (paragraph.11.37.3.9) 7963 0 R (paragraph.11.37.4.1) 8117 0 R] +/Limits [(paragraph.11.37.3.54) (paragraph.11.37.4.1)] +>> endobj +12742 0 obj << +/Names [(paragraph.11.37.4.10) 8136 0 R (paragraph.11.37.4.11) 8137 0 R (paragraph.11.37.4.2) 8118 0 R (paragraph.11.37.4.3) 8119 0 R (paragraph.11.37.4.4) 8120 0 R (paragraph.11.37.4.5) 8126 0 R] +/Limits [(paragraph.11.37.4.10) (paragraph.11.37.4.5)] +>> endobj +12743 0 obj << +/Names [(paragraph.11.37.4.6) 8127 0 R (paragraph.11.37.4.7) 8128 0 R (paragraph.11.37.4.8) 8134 0 R (paragraph.11.37.4.9) 8135 0 R (paragraph.11.38.2.1) 8547 0 R (paragraph.11.38.2.10) 8577 0 R] +/Limits [(paragraph.11.37.4.6) (paragraph.11.38.2.10)] +>> endobj +12744 0 obj << +/Names [(paragraph.11.38.2.11) 8578 0 R (paragraph.11.38.2.12) 8579 0 R (paragraph.11.38.2.2) 8553 0 R (paragraph.11.38.2.3) 8554 0 R (paragraph.11.38.2.4) 8555 0 R (paragraph.11.38.2.5) 8561 0 R] +/Limits [(paragraph.11.38.2.11) (paragraph.11.38.2.5)] +>> endobj +12745 0 obj << +/Names [(paragraph.11.38.2.6) 8562 0 R (paragraph.11.38.2.7) 8568 0 R (paragraph.11.38.2.8) 8569 0 R (paragraph.11.38.2.9) 8570 0 R (paragraph.11.38.3.1) 8586 0 R (paragraph.11.38.3.10) 8610 0 R] +/Limits [(paragraph.11.38.2.6) (paragraph.11.38.3.10)] +>> endobj +12746 0 obj << +/Names [(paragraph.11.38.3.11) 8611 0 R (paragraph.11.38.3.12) 8612 0 R (paragraph.11.38.3.13) 8613 0 R (paragraph.11.38.3.14) 8614 0 R (paragraph.11.38.3.15) 8620 0 R (paragraph.11.38.3.16) 8621 0 R] +/Limits [(paragraph.11.38.3.11) (paragraph.11.38.3.16)] +>> endobj +12747 0 obj << +/Names [(paragraph.11.38.3.17) 8622 0 R (paragraph.11.38.3.18) 8630 0 R (paragraph.11.38.3.19) 8631 0 R (paragraph.11.38.3.2) 8587 0 R (paragraph.11.38.3.20) 8632 0 R (paragraph.11.38.3.21) 8633 0 R] +/Limits [(paragraph.11.38.3.17) (paragraph.11.38.3.21)] +>> endobj +12748 0 obj << +/Names [(paragraph.11.38.3.22) 8641 0 R (paragraph.11.38.3.23) 8642 0 R (paragraph.11.38.3.24) 8643 0 R (paragraph.11.38.3.25) 8644 0 R (paragraph.11.38.3.26) 8654 0 R (paragraph.11.38.3.27) 8655 0 R] +/Limits [(paragraph.11.38.3.22) (paragraph.11.38.3.27)] +>> endobj +12749 0 obj << +/Names [(paragraph.11.38.3.28) 8656 0 R (paragraph.11.38.3.29) 8668 0 R (paragraph.11.38.3.3) 8588 0 R (paragraph.11.38.3.30) 8669 0 R (paragraph.11.38.3.31) 8670 0 R (paragraph.11.38.3.32) 8682 0 R] +/Limits [(paragraph.11.38.3.28) (paragraph.11.38.3.32)] +>> endobj +12750 0 obj << +/Names [(paragraph.11.38.3.33) 8683 0 R (paragraph.11.38.3.34) 8692 0 R (paragraph.11.38.3.35) 8693 0 R (paragraph.11.38.3.36) 8694 0 R (paragraph.11.38.3.37) 8708 0 R (paragraph.11.38.3.38) 8709 0 R] +/Limits [(paragraph.11.38.3.33) (paragraph.11.38.3.38)] +>> endobj +12751 0 obj << +/Names [(paragraph.11.38.3.39) 8710 0 R (paragraph.11.38.3.4) 8589 0 R (paragraph.11.38.3.40) 8712 0 R (paragraph.11.38.3.41) 8720 0 R (paragraph.11.38.3.42) 8721 0 R (paragraph.11.38.3.43) 8723 0 R] +/Limits [(paragraph.11.38.3.39) (paragraph.11.38.3.43)] +>> endobj +12752 0 obj << +/Names [(paragraph.11.38.3.44) 8734 0 R (paragraph.11.38.3.45) 8735 0 R (paragraph.11.38.3.5) 8595 0 R (paragraph.11.38.3.6) 8596 0 R (paragraph.11.38.3.7) 8597 0 R (paragraph.11.38.3.8) 8603 0 R] +/Limits [(paragraph.11.38.3.44) (paragraph.11.38.3.8)] +>> endobj +12753 0 obj << +/Names [(paragraph.11.38.3.9) 8604 0 R (paragraph.11.38.4.1) 8737 0 R (paragraph.11.38.4.2) 8756 0 R (paragraph.11.38.4.3) 8757 0 R (paragraph.11.38.4.4) 8758 0 R (paragraph.11.39.2.1) 9134 0 R] +/Limits [(paragraph.11.38.3.9) (paragraph.11.39.2.1)] +>> endobj +12754 0 obj << +/Names [(paragraph.11.39.2.2) 9145 0 R (paragraph.11.39.2.3) 9146 0 R (paragraph.11.39.2.4) 9147 0 R (paragraph.11.39.2.5) 9148 0 R (paragraph.11.39.2.6) 9155 0 R (paragraph.11.39.2.7) 9156 0 R] +/Limits [(paragraph.11.39.2.2) (paragraph.11.39.2.7)] +>> endobj +12755 0 obj << +/Names [(paragraph.11.39.2.8) 9157 0 R (paragraph.11.39.2.9) 9163 0 R (paragraph.11.39.3.1) 9165 0 R (paragraph.11.39.3.10) 9190 0 R (paragraph.11.39.3.11) 9191 0 R (paragraph.11.39.3.12) 9192 0 R] +/Limits [(paragraph.11.39.2.8) (paragraph.11.39.3.12)] +>> endobj +12756 0 obj << +/Names [(paragraph.11.39.3.13) 9193 0 R (paragraph.11.39.3.14) 9199 0 R (paragraph.11.39.3.15) 9200 0 R (paragraph.11.39.3.16) 9201 0 R (paragraph.11.39.3.17) 9202 0 R (paragraph.11.39.3.18) 9203 0 R] +/Limits [(paragraph.11.39.3.13) (paragraph.11.39.3.18)] +>> endobj +12757 0 obj << +/Names [(paragraph.11.39.3.19) 9204 0 R (paragraph.11.39.3.2) 9166 0 R (paragraph.11.39.3.20) 9213 0 R (paragraph.11.39.3.21) 9214 0 R (paragraph.11.39.3.22) 9215 0 R (paragraph.11.39.3.23) 9216 0 R] +/Limits [(paragraph.11.39.3.19) (paragraph.11.39.3.23)] +>> endobj +12758 0 obj << +/Names [(paragraph.11.39.3.24) 9226 0 R (paragraph.11.39.3.25) 9227 0 R (paragraph.11.39.3.26) 9228 0 R (paragraph.11.39.3.27) 9237 0 R (paragraph.11.39.3.28) 9238 0 R (paragraph.11.39.3.29) 9239 0 R] +/Limits [(paragraph.11.39.3.24) (paragraph.11.39.3.29)] +>> endobj +12759 0 obj << +/Names [(paragraph.11.39.3.3) 9173 0 R (paragraph.11.39.3.30) 9240 0 R (paragraph.11.39.3.31) 9250 0 R (paragraph.11.39.3.32) 9251 0 R (paragraph.11.39.3.33) 9252 0 R (paragraph.11.39.3.34) 9253 0 R] +/Limits [(paragraph.11.39.3.3) (paragraph.11.39.3.34)] +>> endobj +12760 0 obj << +/Names [(paragraph.11.39.3.35) 9263 0 R (paragraph.11.39.3.36) 9264 0 R (paragraph.11.39.3.37) 9265 0 R (paragraph.11.39.3.38) 9266 0 R (paragraph.11.39.3.39) 9277 0 R (paragraph.11.39.3.4) 9174 0 R] +/Limits [(paragraph.11.39.3.35) (paragraph.11.39.3.4)] +>> endobj +12761 0 obj << +/Names [(paragraph.11.39.3.40) 9278 0 R (paragraph.11.39.3.41) 9289 0 R (paragraph.11.39.3.42) 9290 0 R (paragraph.11.39.3.43) 9291 0 R (paragraph.11.39.3.44) 9303 0 R (paragraph.11.39.3.45) 9304 0 R] +/Limits [(paragraph.11.39.3.40) (paragraph.11.39.3.45)] +>> endobj +12762 0 obj << +/Names [(paragraph.11.39.3.46) 9305 0 R (paragraph.11.39.3.47) 9316 0 R (paragraph.11.39.3.48) 9317 0 R (paragraph.11.39.3.49) 9318 0 R (paragraph.11.39.3.5) 9175 0 R (paragraph.11.39.3.50) 9319 0 R] +/Limits [(paragraph.11.39.3.46) (paragraph.11.39.3.50)] +>> endobj +12763 0 obj << +/Names [(paragraph.11.39.3.51) 9331 0 R (paragraph.11.39.3.52) 9332 0 R (paragraph.11.39.3.53) 9333 0 R (paragraph.11.39.3.6) 9176 0 R (paragraph.11.39.3.7) 9182 0 R (paragraph.11.39.3.8) 9183 0 R] +/Limits [(paragraph.11.39.3.51) (paragraph.11.39.3.8)] +>> endobj +12764 0 obj << +/Names [(paragraph.11.39.3.9) 9189 0 R (paragraph.11.39.4.1) 9335 0 R (paragraph.11.39.4.2) 9347 0 R (paragraph.11.39.4.3) 9348 0 R (paragraph.11.39.4.4) 9350 0 R (paragraph.11.39.4.5) 9352 0 R] +/Limits [(paragraph.11.39.3.9) (paragraph.11.39.4.5)] +>> endobj +12765 0 obj << +/Names [(paragraph.11.39.4.6) 9375 0 R (paragraph.11.39.4.7) 9376 0 R (paragraph.11.4.2.1) 3306 0 R (paragraph.11.4.2.10) 3328 0 R (paragraph.11.4.2.11) 3329 0 R (paragraph.11.4.2.12) 3330 0 R] +/Limits [(paragraph.11.39.4.6) (paragraph.11.4.2.12)] +>> endobj +12766 0 obj << +/Names [(paragraph.11.4.2.13) 3336 0 R (paragraph.11.4.2.14) 3337 0 R (paragraph.11.4.2.2) 3307 0 R (paragraph.11.4.2.3) 3316 0 R (paragraph.11.4.2.4) 3317 0 R (paragraph.11.4.2.5) 3318 0 R] +/Limits [(paragraph.11.4.2.13) (paragraph.11.4.2.5)] +>> endobj +12767 0 obj << +/Names [(paragraph.11.4.2.6) 3319 0 R (paragraph.11.4.2.7) 3320 0 R (paragraph.11.4.2.8) 3326 0 R (paragraph.11.4.2.9) 3327 0 R (paragraph.11.4.3.1) 3339 0 R (paragraph.11.4.3.10) 3359 0 R] +/Limits [(paragraph.11.4.2.6) (paragraph.11.4.3.10)] +>> endobj +12768 0 obj << +/Names [(paragraph.11.4.3.11) 3366 0 R (paragraph.11.4.3.12) 3367 0 R (paragraph.11.4.3.13) 3368 0 R (paragraph.11.4.3.14) 3369 0 R (paragraph.11.4.3.15) 3370 0 R (paragraph.11.4.3.16) 3376 0 R] +/Limits [(paragraph.11.4.3.11) (paragraph.11.4.3.16)] +>> endobj +12769 0 obj << +/Names [(paragraph.11.4.3.17) 3377 0 R (paragraph.11.4.3.18) 3378 0 R (paragraph.11.4.3.19) 3379 0 R (paragraph.11.4.3.2) 3340 0 R (paragraph.11.4.3.20) 3385 0 R (paragraph.11.4.3.21) 3386 0 R] +/Limits [(paragraph.11.4.3.17) (paragraph.11.4.3.21)] +>> endobj +12770 0 obj << +/Names [(paragraph.11.4.3.22) 3387 0 R (paragraph.11.4.3.23) 3395 0 R (paragraph.11.4.3.24) 3396 0 R (paragraph.11.4.3.25) 3397 0 R (paragraph.11.4.3.26) 3398 0 R (paragraph.11.4.3.27) 3406 0 R] +/Limits [(paragraph.11.4.3.22) (paragraph.11.4.3.27)] +>> endobj +12771 0 obj << +/Names [(paragraph.11.4.3.28) 3407 0 R (paragraph.11.4.3.29) 3408 0 R (paragraph.11.4.3.3) 3341 0 R (paragraph.11.4.3.30) 3409 0 R (paragraph.11.4.3.31) 3410 0 R (paragraph.11.4.3.32) 3420 0 R] +/Limits [(paragraph.11.4.3.28) (paragraph.11.4.3.32)] +>> endobj +12772 0 obj << +/Names [(paragraph.11.4.3.33) 3421 0 R (paragraph.11.4.3.34) 3422 0 R (paragraph.11.4.3.35) 3423 0 R (paragraph.11.4.3.36) 3432 0 R (paragraph.11.4.3.37) 3433 0 R (paragraph.11.4.3.38) 3441 0 R] +/Limits [(paragraph.11.4.3.33) (paragraph.11.4.3.38)] +>> endobj +12773 0 obj << +/Names [(paragraph.11.4.3.39) 3442 0 R (paragraph.11.4.3.4) 3342 0 R (paragraph.11.4.3.40) 3443 0 R (paragraph.11.4.3.41) 3454 0 R (paragraph.11.4.3.42) 3455 0 R (paragraph.11.4.3.43) 3456 0 R] +/Limits [(paragraph.11.4.3.39) (paragraph.11.4.3.43)] +>> endobj +12774 0 obj << +/Names [(paragraph.11.4.3.44) 3457 0 R (paragraph.11.4.3.45) 3466 0 R (paragraph.11.4.3.46) 3467 0 R (paragraph.11.4.3.47) 3475 0 R (paragraph.11.4.3.48) 3476 0 R (paragraph.11.4.3.49) 3477 0 R] +/Limits [(paragraph.11.4.3.44) (paragraph.11.4.3.49)] +>> endobj +12775 0 obj << +/Names [(paragraph.11.4.3.5) 3348 0 R (paragraph.11.4.3.50) 3478 0 R (paragraph.11.4.3.51) 3491 0 R (paragraph.11.4.3.52) 3492 0 R (paragraph.11.4.3.53) 3493 0 R (paragraph.11.4.3.54) 3500 0 R] +/Limits [(paragraph.11.4.3.5) (paragraph.11.4.3.54)] +>> endobj +12776 0 obj << +/Names [(paragraph.11.4.3.55) 3501 0 R (paragraph.11.4.3.56) 3502 0 R (paragraph.11.4.3.57) 3503 0 R (paragraph.11.4.3.6) 3349 0 R (paragraph.11.4.3.7) 3350 0 R (paragraph.11.4.3.8) 3351 0 R] +/Limits [(paragraph.11.4.3.55) (paragraph.11.4.3.8)] +>> endobj +12777 0 obj << +/Names [(paragraph.11.4.3.9) 3358 0 R (paragraph.11.4.4.1) 3510 0 R (paragraph.11.4.4.2) 3511 0 R (paragraph.11.4.4.3) 3512 0 R (paragraph.11.4.4.4) 3513 0 R (paragraph.11.4.4.5) 3514 0 R] +/Limits [(paragraph.11.4.3.9) (paragraph.11.4.4.5)] +>> endobj +12778 0 obj << +/Names [(paragraph.11.4.4.6) 3520 0 R (paragraph.11.4.4.7) 3521 0 R (paragraph.11.4.4.8) 3522 0 R (paragraph.11.4.4.9) 3550 0 R (paragraph.11.40.2.1) 9416 0 R (paragraph.11.40.2.2) 9418 0 R] +/Limits [(paragraph.11.4.4.6) (paragraph.11.40.2.2)] +>> endobj +12779 0 obj << +/Names [(paragraph.11.40.2.3) 9420 0 R (paragraph.11.40.2.4) 9444 0 R (paragraph.11.40.2.5) 9445 0 R (paragraph.11.41.2.1) 9475 0 R (paragraph.11.41.2.2) 9477 0 R (paragraph.11.41.2.3) 9479 0 R] +/Limits [(paragraph.11.40.2.3) (paragraph.11.41.2.3)] +>> endobj +12780 0 obj << +/Names [(paragraph.11.41.2.4) 9481 0 R (paragraph.11.41.2.5) 9513 0 R (paragraph.11.42.2.1) 9943 0 R (paragraph.11.42.2.2) 9944 0 R (paragraph.11.42.2.3) 9945 0 R (paragraph.11.42.2.4) 9951 0 R] +/Limits [(paragraph.11.41.2.4) (paragraph.11.42.2.4)] +>> endobj +12781 0 obj << +/Names [(paragraph.11.42.2.5) 9952 0 R (paragraph.11.42.2.6) 9953 0 R (paragraph.11.42.2.7) 9959 0 R (paragraph.11.42.3.1) 9961 0 R (paragraph.11.42.3.10) 9981 0 R (paragraph.11.42.3.11) 9982 0 R] +/Limits [(paragraph.11.42.2.5) (paragraph.11.42.3.11)] +>> endobj +12782 0 obj << +/Names [(paragraph.11.42.3.12) 9988 0 R (paragraph.11.42.3.13) 9989 0 R (paragraph.11.42.3.14) 9990 0 R (paragraph.11.42.3.15) 10000 0 R (paragraph.11.42.3.16) 10001 0 R (paragraph.11.42.3.17) 10002 0 R] +/Limits [(paragraph.11.42.3.12) (paragraph.11.42.3.17)] +>> endobj +12783 0 obj << +/Names [(paragraph.11.42.3.18) 10003 0 R (paragraph.11.42.3.19) 10011 0 R (paragraph.11.42.3.2) 9962 0 R (paragraph.11.42.3.20) 10012 0 R (paragraph.11.42.3.21) 10013 0 R (paragraph.11.42.3.22) 10021 0 R] +/Limits [(paragraph.11.42.3.18) (paragraph.11.42.3.22)] +>> endobj +12784 0 obj << +/Names [(paragraph.11.42.3.23) 10022 0 R (paragraph.11.42.3.24) 10023 0 R (paragraph.11.42.3.25) 10031 0 R (paragraph.11.42.3.26) 10032 0 R (paragraph.11.42.3.27) 10033 0 R (paragraph.11.42.3.28) 10044 0 R] +/Limits [(paragraph.11.42.3.23) (paragraph.11.42.3.28)] +>> endobj +12785 0 obj << +/Names [(paragraph.11.42.3.29) 10045 0 R (paragraph.11.42.3.3) 9963 0 R (paragraph.11.42.3.30) 10053 0 R (paragraph.11.42.3.31) 10054 0 R (paragraph.11.42.3.32) 10055 0 R (paragraph.11.42.3.33) 10063 0 R] +/Limits [(paragraph.11.42.3.29) (paragraph.11.42.3.33)] +>> endobj +12786 0 obj << +/Names [(paragraph.11.42.3.34) 10064 0 R (paragraph.11.42.3.35) 10065 0 R (paragraph.11.42.3.36) 10074 0 R (paragraph.11.42.3.37) 10075 0 R (paragraph.11.42.3.38) 10076 0 R (paragraph.11.42.3.39) 10077 0 R] +/Limits [(paragraph.11.42.3.34) (paragraph.11.42.3.39)] +>> endobj +12787 0 obj << +/Names [(paragraph.11.42.3.4) 9969 0 R (paragraph.11.42.3.40) 10088 0 R (paragraph.11.42.3.41) 10089 0 R (paragraph.11.42.3.42) 10090 0 R (paragraph.11.42.3.43) 10091 0 R (paragraph.11.42.3.44) 10101 0 R] +/Limits [(paragraph.11.42.3.4) (paragraph.11.42.3.44)] +>> endobj +12788 0 obj << +/Names [(paragraph.11.42.3.45) 10102 0 R (paragraph.11.42.3.46) 10103 0 R (paragraph.11.42.3.47) 10104 0 R (paragraph.11.42.3.48) 10117 0 R (paragraph.11.42.3.49) 10118 0 R (paragraph.11.42.3.5) 9970 0 R] +/Limits [(paragraph.11.42.3.45) (paragraph.11.42.3.5)] +>> endobj +12789 0 obj << +/Names [(paragraph.11.42.3.50) 10127 0 R (paragraph.11.42.3.51) 10128 0 R (paragraph.11.42.3.52) 10129 0 R (paragraph.11.42.3.53) 10143 0 R (paragraph.11.42.3.54) 10144 0 R (paragraph.11.42.3.55) 10145 0 R] +/Limits [(paragraph.11.42.3.50) (paragraph.11.42.3.55)] +>> endobj +12790 0 obj << +/Names [(paragraph.11.42.3.56) 10159 0 R (paragraph.11.42.3.57) 10160 0 R (paragraph.11.42.3.58) 10161 0 R (paragraph.11.42.3.59) 10171 0 R (paragraph.11.42.3.6) 9971 0 R (paragraph.11.42.3.60) 10172 0 R] +/Limits [(paragraph.11.42.3.56) (paragraph.11.42.3.60)] +>> endobj +12791 0 obj << +/Names [(paragraph.11.42.3.61) 10173 0 R (paragraph.11.42.3.62) 10184 0 R (paragraph.11.42.3.63) 10185 0 R (paragraph.11.42.3.64) 10186 0 R (paragraph.11.42.3.65) 10187 0 R (paragraph.11.42.3.66) 10200 0 R] +/Limits [(paragraph.11.42.3.61) (paragraph.11.42.3.66)] +>> endobj +12792 0 obj << +/Names [(paragraph.11.42.3.67) 10201 0 R (paragraph.11.42.3.68) 10210 0 R (paragraph.11.42.3.69) 10211 0 R (paragraph.11.42.3.7) 9972 0 R (paragraph.11.42.3.8) 9973 0 R (paragraph.11.42.3.9) 9980 0 R] +/Limits [(paragraph.11.42.3.67) (paragraph.11.42.3.9)] +>> endobj +12793 0 obj << +/Names [(paragraph.11.42.4.1) 10213 0 R (paragraph.11.42.4.2) 10214 0 R (paragraph.11.42.4.3) 10215 0 R (paragraph.11.43.2.1) 10402 0 R (paragraph.11.43.2.2) 10403 0 R (paragraph.11.43.3.1) 10406 0 R] +/Limits [(paragraph.11.42.4.1) (paragraph.11.43.3.1)] +>> endobj +12794 0 obj << +/Names [(paragraph.11.43.3.2) 10407 0 R (paragraph.11.43.3.3) 10408 0 R (paragraph.11.43.3.4) 10409 0 R (paragraph.11.43.3.5) 10415 0 R (paragraph.11.43.3.6) 10416 0 R (paragraph.11.43.4.1) 10418 0 R] +/Limits [(paragraph.11.43.3.2) (paragraph.11.43.4.1)] +>> endobj +12795 0 obj << +/Names [(paragraph.11.43.4.2) 10419 0 R (paragraph.11.43.4.3) 10420 0 R (paragraph.11.43.4.4) 10421 0 R (paragraph.11.45.2.1) 10439 0 R (paragraph.11.47.2.1) 10512 0 R (paragraph.11.47.3.1) 10514 0 R] +/Limits [(paragraph.11.43.4.2) (paragraph.11.47.3.1)] +>> endobj +12796 0 obj << +/Names [(paragraph.11.47.4.1) 10516 0 R (paragraph.11.47.4.2) 10517 0 R (paragraph.11.49.2.1) 10574 0 R (paragraph.11.49.3.1) 10577 0 R (paragraph.11.5.2.1) 3612 0 R (paragraph.11.5.2.10) 3631 0 R] +/Limits [(paragraph.11.47.4.1) (paragraph.11.5.2.10)] +>> endobj +12797 0 obj << +/Names [(paragraph.11.5.2.11) 3632 0 R (paragraph.11.5.2.12) 3644 0 R (paragraph.11.5.2.13) 3645 0 R (paragraph.11.5.2.2) 3613 0 R (paragraph.11.5.2.3) 3614 0 R (paragraph.11.5.2.4) 3620 0 R] +/Limits [(paragraph.11.5.2.11) (paragraph.11.5.2.4)] +>> endobj +12798 0 obj << +/Names [(paragraph.11.5.2.5) 3621 0 R (paragraph.11.5.2.6) 3622 0 R (paragraph.11.5.2.7) 3623 0 R (paragraph.11.5.2.8) 3629 0 R (paragraph.11.5.2.9) 3630 0 R (paragraph.11.5.3.1) 3647 0 R] +/Limits [(paragraph.11.5.2.5) (paragraph.11.5.3.1)] +>> endobj +12799 0 obj << +/Names [(paragraph.11.6.2.1) 4068 0 R (paragraph.11.6.3.1) 4070 0 R (paragraph.11.6.3.10) 4084 0 R (paragraph.11.6.3.11) 4085 0 R (paragraph.11.6.3.12) 4086 0 R (paragraph.11.6.3.13) 4087 0 R] +/Limits [(paragraph.11.6.2.1) (paragraph.11.6.3.13)] +>> endobj +12800 0 obj << +/Names [(paragraph.11.6.3.14) 4088 0 R (paragraph.11.6.3.15) 4089 0 R (paragraph.11.6.3.16) 4090 0 R (paragraph.11.6.3.17) 4091 0 R (paragraph.11.6.3.18) 4092 0 R (paragraph.11.6.3.19) 4093 0 R] +/Limits [(paragraph.11.6.3.14) (paragraph.11.6.3.19)] +>> endobj +12801 0 obj << +/Names [(paragraph.11.6.3.2) 4071 0 R (paragraph.11.6.3.20) 4099 0 R (paragraph.11.6.3.21) 4100 0 R (paragraph.11.6.3.22) 4101 0 R (paragraph.11.6.3.23) 4102 0 R (paragraph.11.6.3.24) 4103 0 R] +/Limits [(paragraph.11.6.3.2) (paragraph.11.6.3.24)] +>> endobj +12802 0 obj << +/Names [(paragraph.11.6.3.25) 4104 0 R (paragraph.11.6.3.26) 4105 0 R (paragraph.11.6.3.27) 4106 0 R (paragraph.11.6.3.28) 4107 0 R (paragraph.11.6.3.29) 4113 0 R (paragraph.11.6.3.3) 4072 0 R] +/Limits [(paragraph.11.6.3.25) (paragraph.11.6.3.3)] +>> endobj +12803 0 obj << +/Names [(paragraph.11.6.3.30) 4114 0 R (paragraph.11.6.3.31) 4115 0 R (paragraph.11.6.3.32) 4116 0 R (paragraph.11.6.3.33) 4117 0 R (paragraph.11.6.3.34) 4118 0 R (paragraph.11.6.3.35) 4119 0 R] +/Limits [(paragraph.11.6.3.30) (paragraph.11.6.3.35)] +>> endobj +12804 0 obj << +/Names [(paragraph.11.6.3.36) 4120 0 R (paragraph.11.6.3.37) 4121 0 R (paragraph.11.6.3.38) 4127 0 R (paragraph.11.6.3.39) 4128 0 R (paragraph.11.6.3.4) 4073 0 R (paragraph.11.6.3.40) 4129 0 R] +/Limits [(paragraph.11.6.3.36) (paragraph.11.6.3.40)] +>> endobj +12805 0 obj << +/Names [(paragraph.11.6.3.41) 4130 0 R (paragraph.11.6.3.42) 4156 0 R (paragraph.11.6.3.43) 4157 0 R (paragraph.11.6.3.44) 4158 0 R (paragraph.11.6.3.45) 4159 0 R (paragraph.11.6.3.5) 4074 0 R] +/Limits [(paragraph.11.6.3.41) (paragraph.11.6.3.5)] +>> endobj +12806 0 obj << +/Names [(paragraph.11.6.3.6) 4075 0 R (paragraph.11.6.3.7) 4076 0 R (paragraph.11.6.3.8) 4077 0 R (paragraph.11.6.3.9) 4078 0 R (paragraph.11.7.2.1) 4292 0 R (paragraph.11.7.3.1) 4299 0 R] +/Limits [(paragraph.11.6.3.6) (paragraph.11.7.3.1)] +>> endobj +12807 0 obj << +/Names [(paragraph.11.7.3.2) 4300 0 R (paragraph.11.7.3.3) 4301 0 R (paragraph.11.7.3.4) 4302 0 R (paragraph.11.7.3.5) 4303 0 R (paragraph.11.7.3.6) 4304 0 R (paragraph.11.7.3.7) 4311 0 R] +/Limits [(paragraph.11.7.3.2) (paragraph.11.7.3.7)] +>> endobj +12808 0 obj << +/Names [(paragraph.11.7.3.8) 4312 0 R (paragraph.11.7.3.9) 4313 0 R (paragraph.11.7.4.1) 4315 0 R (paragraph.11.7.4.2) 4316 0 R (paragraph.11.7.4.3) 4317 0 R (paragraph.11.7.4.4) 4318 0 R] +/Limits [(paragraph.11.7.3.8) (paragraph.11.7.4.4)] +>> endobj +12809 0 obj << +/Names [(paragraph.11.7.4.5) 4319 0 R (paragraph.11.7.4.6) 4320 0 R (paragraph.11.7.4.7) 4342 0 R (paragraph.11.7.4.8) 4343 0 R (paragraph.11.8.2.1) 4461 0 R (paragraph.11.8.3.1) 4463 0 R] +/Limits [(paragraph.11.7.4.5) (paragraph.11.8.3.1)] +>> endobj +12810 0 obj << +/Names [(paragraph.11.8.3.2) 4464 0 R (paragraph.11.8.3.3) 4465 0 R (paragraph.11.8.3.4) 4466 0 R (paragraph.11.8.4.1) 4485 0 R (paragraph.11.8.4.2) 4486 0 R (paragraph.9.1.2.1) 1749 0 R] +/Limits [(paragraph.11.8.3.2) (paragraph.9.1.2.1)] +>> endobj +12811 0 obj << +/Names [(paragraph.9.1.2.2) 1750 0 R (paragraph.9.1.2.3) 1780 0 R (paragraph.9.1.2.4) 1781 0 R (paragraph.9.1.3.1) 1783 0 R (paragraph.9.1.3.2) 1784 0 R (paragraph.9.1.3.3) 1785 0 R] +/Limits [(paragraph.9.1.2.2) (paragraph.9.1.3.3)] +>> endobj +12812 0 obj << +/Names [(paragraph.9.1.4.1) 1787 0 R (paragraph.9.1.4.2) 1794 0 R (paragraph.9.1.4.3) 1795 0 R (paragraph.9.1.4.4) 1802 0 R (paragraph.9.1.4.5) 1803 0 R (paragraph.9.1.4.6) 1804 0 R] +/Limits [(paragraph.9.1.4.1) (paragraph.9.1.4.6)] +>> endobj +12813 0 obj << +/Names [(paragraph.9.1.4.7) 1805 0 R (paragraph.9.1.5.1) 1807 0 R (section*.1) 377 0 R (section*.10) 1099 0 R (section*.100) 6000 0 R (section*.101) 6325 0 R] +/Limits [(paragraph.9.1.4.7) (section*.101)] +>> endobj +12814 0 obj << +/Names [(section*.102) 6347 0 R (section*.103) 6384 0 R (section*.104) 6387 0 R (section*.105) 6388 0 R (section*.106) 6478 0 R (section*.107) 6483 0 R] +/Limits [(section*.102) (section*.107)] +>> endobj +12815 0 obj << +/Names [(section*.108) 6593 0 R (section*.109) 6594 0 R (section*.11) 1105 0 R (section*.110) 6649 0 R (section*.111) 6672 0 R (section*.112) 6673 0 R] +/Limits [(section*.108) (section*.112)] +>> endobj +12816 0 obj << +/Names [(section*.113) 6723 0 R (section*.114) 6754 0 R (section*.115) 6755 0 R (section*.116) 6776 0 R (section*.117) 6799 0 R (section*.118) 6825 0 R] +/Limits [(section*.113) (section*.118)] +>> endobj +12817 0 obj << +/Names [(section*.119) 6828 0 R (section*.12) 1111 0 R (section*.120) 6855 0 R (section*.121) 6872 0 R (section*.122) 6874 0 R (section*.123) 6875 0 R] +/Limits [(section*.119) (section*.123)] +>> endobj +12818 0 obj << +/Names [(section*.124) 6979 0 R (section*.125) 6983 0 R (section*.126) 7043 0 R (section*.127) 7150 0 R (section*.128) 7153 0 R (section*.129) 7288 0 R] +/Limits [(section*.124) (section*.129)] +>> endobj +12819 0 obj << +/Names [(section*.13) 1112 0 R (section*.130) 7290 0 R (section*.131) 7361 0 R (section*.132) 7477 0 R (section*.133) 7481 0 R (section*.134) 7485 0 R] +/Limits [(section*.13) (section*.134)] +>> endobj +12820 0 obj << +/Names [(section*.135) 7524 0 R (section*.136) 7876 0 R (section*.137) 7880 0 R (section*.138) 7881 0 R (section*.139) 7908 0 R (section*.14) 1118 0 R] +/Limits [(section*.135) (section*.14)] +>> endobj +12821 0 obj << +/Names [(section*.140) 8177 0 R (section*.141) 8496 0 R (section*.142) 8498 0 R (section*.143) 8501 0 R (section*.144) 8505 0 R (section*.145) 8509 0 R] +/Limits [(section*.140) (section*.145)] +>> endobj +12822 0 obj << +/Names [(section*.146) 8531 0 R (section*.147) 8535 0 R (section*.148) 8759 0 R (section*.149) 9084 0 R (section*.15) 1119 0 R (section*.150) 9086 0 R] +/Limits [(section*.146) (section*.150)] +>> endobj +12823 0 obj << +/Names [(section*.151) 9132 0 R (section*.152) 9377 0 R (section*.153) 9383 0 R (section*.154) 9411 0 R (section*.155) 9412 0 R (section*.156) 9446 0 R] +/Limits [(section*.151) (section*.156)] +>> endobj +12824 0 obj << +/Names [(section*.157) 9452 0 R (section*.158) 9470 0 R (section*.159) 9471 0 R (section*.16) 1125 0 R (section*.160) 9515 0 R (section*.161) 9517 0 R] +/Limits [(section*.157) (section*.161)] +>> endobj +12825 0 obj << +/Names [(section*.162) 9855 0 R (section*.163) 9901 0 R (section*.164) 9903 0 R (section*.165) 10245 0 R (section*.166) 10249 0 R (section*.167) 10344 0 R] +/Limits [(section*.162) (section*.167)] +>> endobj +12826 0 obj << +/Names [(section*.168) 10347 0 R (section*.169) 10374 0 R (section*.17) 1126 0 R (section*.170) 10377 0 R (section*.171) 10379 0 R (section*.172) 10432 0 R] +/Limits [(section*.168) (section*.172)] +>> endobj +12827 0 obj << +/Names [(section*.173) 10436 0 R (section*.174) 10458 0 R (section*.175) 10462 0 R (section*.176) 10463 0 R (section*.177) 10492 0 R (section*.178) 10496 0 R] +/Limits [(section*.173) (section*.178)] +>> endobj +12828 0 obj << +/Names [(section*.179) 10518 0 R (section*.18) 1127 0 R (section*.180) 10548 0 R (section*.181) 10569 0 R (section*.182) 10571 0 R (section*.183) 10642 0 R] +/Limits [(section*.179) (section*.183)] +>> endobj +12829 0 obj << +/Names [(section*.19) 1128 0 R (section*.2) 1075 0 R (section*.20) 1136 0 R (section*.21) 1137 0 R (section*.22) 1138 0 R (section*.23) 1187 0 R] +/Limits [(section*.19) (section*.23)] +>> endobj +12830 0 obj << +/Names [(section*.24) 1576 0 R (section*.25) 1619 0 R (section*.26) 1620 0 R (section*.27) 1665 0 R (section*.28) 1666 0 R (section*.29) 1746 0 R] +/Limits [(section*.24) (section*.29)] +>> endobj +12831 0 obj << +/Names [(section*.3) 1081 0 R (section*.30) 1825 0 R (section*.31) 1826 0 R (section*.32) 1871 0 R (section*.33) 1932 0 R (section*.34) 1958 0 R] +/Limits [(section*.3) (section*.34)] +>> endobj +12832 0 obj << +/Names [(section*.35) 2052 0 R (section*.36) 2069 0 R (section*.37) 2112 0 R (section*.38) 2115 0 R (section*.39) 2466 0 R (section*.4) 1082 0 R] +/Limits [(section*.35) (section*.4)] +>> endobj +12833 0 obj << +/Names [(section*.40) 2524 0 R (section*.41) 2525 0 R (section*.42) 2547 0 R (section*.43) 2822 0 R (section*.44) 2838 0 R (section*.45) 2871 0 R] +/Limits [(section*.40) (section*.45)] +>> endobj +12834 0 obj << +/Names [(section*.46) 2874 0 R (section*.47) 2876 0 R (section*.48) 3224 0 R (section*.49) 3284 0 R (section*.5) 1083 0 R (section*.50) 3285 0 R] +/Limits [(section*.46) (section*.50)] +>> endobj +12835 0 obj << +/Names [(section*.51) 3304 0 R (section*.52) 3551 0 R (section*.53) 3648 0 R (section*.54) 3897 0 R (section*.55) 4052 0 R (section*.56) 4160 0 R] +/Limits [(section*.51) (section*.56)] +>> endobj +12836 0 obj << +/Names [(section*.57) 4205 0 R (section*.58) 4253 0 R (section*.59) 4254 0 R (section*.6) 1090 0 R (section*.60) 4280 0 R (section*.61) 4344 0 R] +/Limits [(section*.57) (section*.61)] +>> endobj +12837 0 obj << +/Names [(section*.62) 4345 0 R (section*.63) 4435 0 R (section*.64) 4440 0 R (section*.65) 4442 0 R (section*.66) 4487 0 R (section*.67) 4519 0 R] +/Limits [(section*.62) (section*.67)] +>> endobj +12838 0 obj << +/Names [(section*.68) 4520 0 R (section*.69) 4619 0 R (section*.7) 1091 0 R (section*.70) 4625 0 R (section*.71) 4688 0 R (section*.72) 4795 0 R] +/Limits [(section*.68) (section*.72)] +>> endobj +12839 0 obj << +/Names [(section*.73) 4796 0 R (section*.74) 4871 0 R (section*.75) 4876 0 R (section*.76) 4877 0 R (section*.77) 4911 0 R (section*.78) 4934 0 R] +/Limits [(section*.73) (section*.78)] +>> endobj +12840 0 obj << +/Names [(section*.79) 4938 0 R (section*.8) 1092 0 R (section*.80) 4963 0 R (section*.81) 4972 0 R (section*.82) 5020 0 R (section*.83) 5032 0 R] +/Limits [(section*.79) (section*.83)] +>> endobj +12841 0 obj << +/Names [(section*.84) 5035 0 R (section*.85) 5060 0 R (section*.86) 5062 0 R (section*.87) 5097 0 R (section*.88) 5151 0 R (section*.89) 5208 0 R] +/Limits [(section*.84) (section*.89)] +>> endobj +12842 0 obj << +/Names [(section*.9) 1093 0 R (section*.90) 5316 0 R (section*.91) 5317 0 R (section*.92) 5388 0 R (section*.93) 5393 0 R (section*.94) 5422 0 R] +/Limits [(section*.9) (section*.94)] +>> endobj +12843 0 obj << +/Names [(section*.95) 5506 0 R (section*.96) 5605 0 R (section*.97) 5607 0 R (section*.98) 5995 0 R (section*.99) 5999 0 R (section.1) 6 0 R] +/Limits [(section*.95) (section.1)] +>> endobj +12844 0 obj << +/Names [(section.10) 118 0 R (section.11) 134 0 R (section.2) 66 0 R (section.3) 70 0 R (section.4) 74 0 R (section.5) 78 0 R] +/Limits [(section.10) (section.5)] +>> endobj +12845 0 obj << +/Names [(section.6) 86 0 R (section.7) 94 0 R (section.8) 102 0 R (section.9) 110 0 R (structParma__Polyhedra__Library_1_1BHRZ03__Certificate_1_1Compare) 1421 0 R (structParma__Polyhedra__Library_1_1BHRZ03__Certificate_1_1Compare_98c515b16e12424b273eaff073b31f3b) 2872 0 R] +/Limits [(section.6) (structParma__Polyhedra__Library_1_1BHRZ03__Certificate_1_1Compare_98c515b16e12424b273eaff073b31f3b)] +>> endobj +12846 0 obj << +/Names [(structParma__Polyhedra__Library_1_1From__Covering__Box) 1483 0 R (structParma__Polyhedra__Library_1_1Grid__Certificate_1_1Compare) 1489 0 R (structParma__Polyhedra__Library_1_1Grid__Certificate_1_1Compare_92edb0b8b1e2097c5d20795e576517cf) 6385 0 R (structParma__Polyhedra__Library_1_1H79__Certificate_1_1Compare) 1493 0 R (structParma__Polyhedra__Library_1_1H79__Certificate_1_1Compare_bf5e694ab674c48a452893f021986318) 6777 0 R (structParma__Polyhedra__Library_1_1Is__Checked) 1494 0 R] +/Limits [(structParma__Polyhedra__Library_1_1From__Covering__Box) (structParma__Polyhedra__Library_1_1Is__Checked)] +>> endobj +12847 0 obj << +/Names [(structParma__Polyhedra__Library_1_1Is__Checked_3_01Checked__Number_3_01T_00_01P_01_4_01_4) 1538 0 R (structParma__Polyhedra__Library_1_1Is__Native__Or__Checked) 1539 0 R (structParma__Polyhedra__Library_1_1Recycle__Input) 1547 0 R (structParma__Polyhedra__Library_1_1Variable_1_1Compare) 1551 0 R (structParma__Polyhedra__Library_1_1Variable_1_1Compare_f6c069432956f215967c61be24a40939) 10519 0 R (subsection.1.1) 10 0 R] +/Limits [(structParma__Polyhedra__Library_1_1Is__Checked_3_01Checked__Number_3_01T_00_01P_01_4_01_4) (subsection.1.1)] +>> endobj +12848 0 obj << +/Names [(subsection.1.10) 46 0 R (subsection.1.11) 50 0 R (subsection.1.12) 54 0 R (subsection.1.13) 58 0 R (subsection.1.14) 62 0 R (subsection.1.2) 14 0 R] +/Limits [(subsection.1.10) (subsection.1.2)] +>> endobj +12849 0 obj << +/Names [(subsection.1.3) 18 0 R (subsection.1.4) 22 0 R (subsection.1.5) 26 0 R (subsection.1.6) 30 0 R (subsection.1.7) 34 0 R (subsection.1.8) 38 0 R] +/Limits [(subsection.1.3) (subsection.1.8)] +>> endobj +12850 0 obj << +/Names [(subsection.1.9) 42 0 R (subsection.10.1) 122 0 R (subsection.10.2) 126 0 R (subsection.10.3) 130 0 R (subsection.11.1) 138 0 R (subsection.11.10) 174 0 R] +/Limits [(subsection.1.9) (subsection.11.10)] +>> endobj +12851 0 obj << +/Names [(subsection.11.11) 178 0 R (subsection.11.12) 182 0 R (subsection.11.13) 186 0 R (subsection.11.14) 190 0 R (subsection.11.15) 194 0 R (subsection.11.16) 198 0 R] +/Limits [(subsection.11.11) (subsection.11.16)] +>> endobj +12852 0 obj << +/Names [(subsection.11.17) 202 0 R (subsection.11.18) 206 0 R (subsection.11.19) 210 0 R (subsection.11.2) 142 0 R (subsection.11.20) 214 0 R (subsection.11.21) 218 0 R] +/Limits [(subsection.11.17) (subsection.11.21)] +>> endobj +12853 0 obj << +/Names [(subsection.11.22) 222 0 R (subsection.11.23) 226 0 R (subsection.11.24) 230 0 R (subsection.11.25) 234 0 R (subsection.11.26) 238 0 R (subsection.11.27) 242 0 R] +/Limits [(subsection.11.22) (subsection.11.27)] +>> endobj +12854 0 obj << +/Names [(subsection.11.28) 246 0 R (subsection.11.29) 250 0 R (subsection.11.3) 146 0 R (subsection.11.30) 254 0 R (subsection.11.31) 258 0 R (subsection.11.32) 262 0 R] +/Limits [(subsection.11.28) (subsection.11.32)] +>> endobj +12855 0 obj << +/Names [(subsection.11.33) 266 0 R (subsection.11.34) 270 0 R (subsection.11.35) 274 0 R (subsection.11.36) 278 0 R (subsection.11.37) 282 0 R (subsection.11.38) 286 0 R] +/Limits [(subsection.11.33) (subsection.11.38)] +>> endobj +12856 0 obj << +/Names [(subsection.11.39) 290 0 R (subsection.11.4) 150 0 R (subsection.11.40) 294 0 R (subsection.11.41) 298 0 R (subsection.11.42) 302 0 R (subsection.11.43) 306 0 R] +/Limits [(subsection.11.39) (subsection.11.43)] +>> endobj +12857 0 obj << +/Names [(subsection.11.44) 310 0 R (subsection.11.45) 314 0 R (subsection.11.46) 318 0 R (subsection.11.47) 322 0 R (subsection.11.48) 326 0 R (subsection.11.49) 330 0 R] +/Limits [(subsection.11.44) (subsection.11.49)] +>> endobj +12858 0 obj << +/Names [(subsection.11.5) 154 0 R (subsection.11.6) 158 0 R (subsection.11.7) 162 0 R (subsection.11.8) 166 0 R (subsection.11.9) 170 0 R (subsection.5.1) 82 0 R] +/Limits [(subsection.11.5) (subsection.5.1)] +>> endobj +12859 0 obj << +/Names [(subsection.6.1) 90 0 R (subsection.7.1) 98 0 R (subsection.8.1) 106 0 R (subsection.9.1) 114 0 R (subsubsection.1.1.1) 470 0 R (subsubsection.1.1.2) 490 0 R] +/Limits [(subsection.6.1) (subsubsection.1.1.2)] +>> endobj +12860 0 obj << +/Names [(subsubsection.1.1.3) 515 0 R (subsubsection.1.10.1) 841 0 R (subsubsection.1.11.1) 857 0 R (subsubsection.1.11.2) 860 0 R (subsubsection.1.11.3) 863 0 R (subsubsection.1.12.1) 867 0 R] +/Limits [(subsubsection.1.1.3) (subsubsection.1.12.1)] +>> endobj +12861 0 obj << +/Names [(subsubsection.1.12.2) 883 0 R (subsubsection.1.12.3) 886 0 R (subsubsection.1.12.4) 889 0 R (subsubsection.1.12.5) 892 0 R (subsubsection.1.13.1) 903 0 R (subsubsection.1.13.2) 905 0 R] +/Limits [(subsubsection.1.12.2) (subsubsection.1.13.2)] +>> endobj +12862 0 obj << +/Names [(subsubsection.1.13.3) 914 0 R (subsubsection.1.13.4) 916 0 R (subsubsection.1.3.1) 537 0 R (subsubsection.1.3.2) 544 0 R (subsubsection.1.3.3) 556 0 R (subsubsection.1.3.4) 558 0 R] +/Limits [(subsubsection.1.13.3) (subsubsection.1.3.4)] +>> endobj +12863 0 obj << +/Names [(subsubsection.1.4.1) 561 0 R (subsubsection.1.4.10) 601 0 R (subsubsection.1.4.2) 570 0 R (subsubsection.1.4.3) 572 0 R (subsubsection.1.4.4) 574 0 R (subsubsection.1.4.5) 581 0 R] +/Limits [(subsubsection.1.4.1) (subsubsection.1.4.5)] +>> endobj +12864 0 obj << +/Names [(subsubsection.1.4.6) 583 0 R (subsubsection.1.4.7) 584 0 R (subsubsection.1.4.8) 592 0 R (subsubsection.1.4.9) 594 0 R (subsubsection.1.5.1) 604 0 R (subsubsection.1.5.10) 645 0 R] +/Limits [(subsubsection.1.4.6) (subsubsection.1.5.10)] +>> endobj +12865 0 obj << +/Names [(subsubsection.1.5.11) 654 0 R (subsubsection.1.5.12) 656 0 R (subsubsection.1.5.13) 658 0 R (subsubsection.1.5.14) 660 0 R (subsubsection.1.5.15) 674 0 R (subsubsection.1.5.16) 678 0 R] +/Limits [(subsubsection.1.5.11) (subsubsection.1.5.16)] +>> endobj +12866 0 obj << +/Names [(subsubsection.1.5.17) 680 0 R (subsubsection.1.5.18) 697 0 R (subsubsection.1.5.19) 699 0 R (subsubsection.1.5.2) 606 0 R (subsubsection.1.5.3) 608 0 R (subsubsection.1.5.4) 610 0 R] +/Limits [(subsubsection.1.5.17) (subsubsection.1.5.4)] +>> endobj +12867 0 obj << +/Names [(subsubsection.1.5.5) 618 0 R (subsubsection.1.5.6) 620 0 R (subsubsection.1.5.7) 625 0 R (subsubsection.1.5.8) 635 0 R (subsubsection.1.5.9) 638 0 R (subsubsection.1.6.1) 713 0 R] +/Limits [(subsubsection.1.5.5) (subsubsection.1.6.1)] +>> endobj +12868 0 obj << +/Names [(subsubsection.1.7.1) 716 0 R (subsubsection.1.7.2) 729 0 R (subsubsection.1.7.3) 731 0 R (subsubsection.1.7.4) 733 0 R (subsubsection.1.8.1) 745 0 R (subsubsection.1.8.2) 747 0 R] +/Limits [(subsubsection.1.7.1) (subsubsection.1.8.2)] +>> endobj +12869 0 obj << +/Names [(subsubsection.1.8.3) 749 0 R (subsubsection.1.8.4) 751 0 R (subsubsection.1.8.5) 761 0 R (subsubsection.1.8.6) 764 0 R (subsubsection.1.8.7) 766 0 R (subsubsection.1.8.8) 768 0 R] +/Limits [(subsubsection.1.8.3) (subsubsection.1.8.8)] +>> endobj +12870 0 obj << +/Names [(subsubsection.1.8.9) 778 0 R (subsubsection.1.9.1) 781 0 R (subsubsection.1.9.10) 811 0 R (subsubsection.1.9.11) 819 0 R (subsubsection.1.9.12) 821 0 R (subsubsection.1.9.13) 823 0 R] +/Limits [(subsubsection.1.8.9) (subsubsection.1.9.13)] +>> endobj +12871 0 obj << +/Names [(subsubsection.1.9.14) 835 0 R (subsubsection.1.9.15) 837 0 R (subsubsection.1.9.2) 783 0 R (subsubsection.1.9.3) 785 0 R (subsubsection.1.9.4) 787 0 R (subsubsection.1.9.5) 794 0 R] +/Limits [(subsubsection.1.9.14) (subsubsection.1.9.5)] +>> endobj +12872 0 obj << +/Names [(subsubsection.1.9.6) 796 0 R (subsubsection.1.9.7) 798 0 R (subsubsection.1.9.8) 800 0 R (subsubsection.1.9.9) 809 0 R (subsubsection.10.1.1) 2053 0 R (subsubsection.10.1.2) 2054 0 R] +/Limits [(subsubsection.1.9.6) (subsubsection.10.1.2)] +>> endobj +12873 0 obj << +/Names [(subsubsection.10.2.1) 2070 0 R (subsubsection.10.2.2) 2080 0 R (subsubsection.10.3.1) 2082 0 R (subsubsection.11.1.1) 2546 0 R (subsubsection.11.1.2) 2556 0 R (subsubsection.11.1.3) 2584 0 R] +/Limits [(subsubsection.10.2.1) (subsubsection.11.1.3)] +>> endobj +12874 0 obj << +/Names [(subsubsection.11.1.4) 2799 0 R (subsubsection.11.10.1) 4717 0 R (subsubsection.11.10.2) 4728 0 R (subsubsection.11.10.3) 4735 0 R (subsubsection.11.10.4) 4737 0 R (subsubsection.11.10.5) 4747 0 R] +/Limits [(subsubsection.11.1.4) (subsubsection.11.10.5)] +>> endobj +12875 0 obj << +/Names [(subsubsection.11.11.1) 4879 0 R (subsubsection.11.11.2) 4888 0 R (subsubsection.11.12.1) 4922 0 R (subsubsection.11.13.1) 4937 0 R (subsubsection.11.13.2) 4939 0 R (subsubsection.11.14.1) 5034 0 R] +/Limits [(subsubsection.11.11.1) (subsubsection.11.14.1)] +>> endobj +12876 0 obj << +/Names [(subsubsection.11.14.2) 5036 0 R (subsubsection.11.14.3) 5038 0 R (subsubsection.11.15.1) 5059 0 R (subsubsection.11.16.1) 5061 0 R (subsubsection.11.17.1) 5227 0 R (subsubsection.11.17.2) 5242 0 R] +/Limits [(subsubsection.11.14.2) (subsubsection.11.17.2)] +>> endobj +12877 0 obj << +/Names [(subsubsection.11.17.3) 5244 0 R (subsubsection.11.17.4) 5279 0 R (subsubsection.11.18.1) 5395 0 R (subsubsection.11.18.2) 5415 0 R (subsubsection.11.18.3) 5419 0 R (subsubsection.11.19.1) 5452 0 R] +/Limits [(subsubsection.11.17.3) (subsubsection.11.19.1)] +>> endobj +12878 0 obj << +/Names [(subsubsection.11.2.1) 2844 0 R (subsubsection.11.2.2) 2845 0 R (subsubsection.11.20.1) 5537 0 R (subsubsection.11.20.2) 5538 0 R (subsubsection.11.21.1) 6014 0 R (subsubsection.11.21.2) 6031 0 R] +/Limits [(subsubsection.11.2.1) (subsubsection.11.21.2)] +>> endobj +12879 0 obj << +/Names [(subsubsection.11.21.3) 6072 0 R (subsubsection.11.21.4) 6320 0 R (subsubsection.11.22.1) 6353 0 R (subsubsection.11.22.2) 6354 0 R (subsubsection.11.23.1) 6386 0 R (subsubsection.11.24.1) 6502 0 R] +/Limits [(subsubsection.11.21.3) (subsubsection.11.24.1)] +>> endobj +12880 0 obj << +/Names [(subsubsection.11.24.2) 6519 0 R (subsubsection.11.24.3) 6521 0 R (subsubsection.11.24.4) 6554 0 R (subsubsection.11.25.1) 6675 0 R (subsubsection.11.25.2) 6694 0 R (subsubsection.11.25.3) 6699 0 R] +/Limits [(subsubsection.11.24.2) (subsubsection.11.25.3)] +>> endobj +12881 0 obj << +/Names [(subsubsection.11.26.1) 6734 0 R (subsubsection.11.27.1) 6773 0 R (subsubsection.11.27.2) 6774 0 R (subsubsection.11.28.1) 6778 0 R (subsubsection.11.29.1) 6827 0 R (subsubsection.11.29.2) 6840 0 R] +/Limits [(subsubsection.11.26.1) (subsubsection.11.29.2)] +>> endobj +12882 0 obj << +/Names [(subsubsection.11.29.3) 6852 0 R (subsubsection.11.3.1) 2873 0 R (subsubsection.11.30.1) 6854 0 R (subsubsection.11.31.1) 6871 0 R (subsubsection.11.32.1) 6873 0 R (subsubsection.11.33.1) 7069 0 R] +/Limits [(subsubsection.11.29.3) (subsubsection.11.33.1)] +>> endobj +12883 0 obj << +/Names [(subsubsection.11.33.2) 7070 0 R (subsubsection.11.33.3) 7082 0 R (subsubsection.11.34.1) 7292 0 R (subsubsection.11.34.2) 7302 0 R (subsubsection.11.34.3) 7305 0 R (subsubsection.11.34.4) 7323 0 R] +/Limits [(subsubsection.11.33.2) (subsubsection.11.34.4)] +>> endobj +12884 0 obj << +/Names [(subsubsection.11.34.5) 7358 0 R (subsubsection.11.35.1) 7432 0 R (subsubsection.11.35.2) 7433 0 R (subsubsection.11.35.3) 7463 0 R (subsubsection.11.36.1) 7480 0 R (subsubsection.11.36.2) 7482 0 R] +/Limits [(subsubsection.11.34.5) (subsubsection.11.36.2)] +>> endobj +12885 0 obj << +/Names [(subsubsection.11.37.1) 7907 0 R (subsubsection.11.37.2) 7921 0 R (subsubsection.11.37.3) 7949 0 R (subsubsection.11.37.4) 8116 0 R (subsubsection.11.38.1) 8534 0 R (subsubsection.11.38.2) 8546 0 R] +/Limits [(subsubsection.11.37.1) (subsubsection.11.38.2)] +>> endobj +12886 0 obj << +/Names [(subsubsection.11.38.3) 8585 0 R (subsubsection.11.38.4) 8736 0 R (subsubsection.11.39.1) 9131 0 R (subsubsection.11.39.2) 9133 0 R (subsubsection.11.39.3) 9164 0 R (subsubsection.11.39.4) 9334 0 R] +/Limits [(subsubsection.11.38.3) (subsubsection.11.39.4)] +>> endobj +12887 0 obj << +/Names [(subsubsection.11.4.1) 3303 0 R (subsubsection.11.4.2) 3305 0 R (subsubsection.11.4.3) 3338 0 R (subsubsection.11.4.4) 3509 0 R (subsubsection.11.40.1) 9413 0 R (subsubsection.11.40.2) 9414 0 R] +/Limits [(subsubsection.11.4.1) (subsubsection.11.40.2)] +>> endobj +12888 0 obj << +/Names [(subsubsection.11.41.1) 9472 0 R (subsubsection.11.41.2) 9473 0 R (subsubsection.11.42.1) 9924 0 R (subsubsection.11.42.2) 9942 0 R (subsubsection.11.42.3) 9960 0 R (subsubsection.11.42.4) 10212 0 R] +/Limits [(subsubsection.11.41.1) (subsubsection.11.42.4)] +>> endobj +12889 0 obj << +/Names [(subsubsection.11.43.1) 10378 0 R (subsubsection.11.43.2) 10401 0 R (subsubsection.11.43.3) 10405 0 R (subsubsection.11.43.4) 10417 0 R (subsubsection.11.44.1) 10422 0 R (subsubsection.11.45.1) 10435 0 R] +/Limits [(subsubsection.11.43.1) (subsubsection.11.45.1)] +>> endobj +12890 0 obj << +/Names [(subsubsection.11.45.2) 10437 0 R (subsubsection.11.46.1) 10461 0 R (subsubsection.11.47.1) 10497 0 R (subsubsection.11.47.2) 10511 0 R (subsubsection.11.47.3) 10513 0 R (subsubsection.11.47.4) 10515 0 R] +/Limits [(subsubsection.11.45.2) (subsubsection.11.47.4)] +>> endobj +12891 0 obj << +/Names [(subsubsection.11.48.1) 10547 0 R (subsubsection.11.49.1) 10572 0 R (subsubsection.11.49.2) 10573 0 R (subsubsection.11.49.3) 10575 0 R (subsubsection.11.5.1) 3598 0 R (subsubsection.11.5.2) 3611 0 R] +/Limits [(subsubsection.11.48.1) (subsubsection.11.5.2)] +>> endobj +12892 0 obj << +/Names [(subsubsection.11.5.3) 3646 0 R (subsubsection.11.6.1) 4051 0 R (subsubsection.11.6.2) 4067 0 R (subsubsection.11.6.3) 4069 0 R (subsubsection.11.7.1) 4281 0 R (subsubsection.11.7.2) 4291 0 R] +/Limits [(subsubsection.11.5.3) (subsubsection.11.7.2)] +>> endobj +12893 0 obj << +/Names [(subsubsection.11.7.3) 4298 0 R (subsubsection.11.7.4) 4314 0 R (subsubsection.11.8.1) 4453 0 R (subsubsection.11.8.2) 4460 0 R (subsubsection.11.8.3) 4462 0 R (subsubsection.11.8.4) 4484 0 R] +/Limits [(subsubsection.11.7.3) (subsubsection.11.8.4)] +>> endobj +12894 0 obj << +/Names [(subsubsection.11.9.1) 4518 0 R (subsubsection.9.1.1) 1747 0 R (subsubsection.9.1.2) 1748 0 R (subsubsection.9.1.3) 1782 0 R (subsubsection.9.1.4) 1786 0 R (subsubsection.9.1.5) 1806 0 R] +/Limits [(subsubsection.11.9.1) (subsubsection.9.1.5)] +>> endobj +12895 0 obj << +/Kids [12275 0 R 12276 0 R 12277 0 R 12278 0 R 12279 0 R 12280 0 R] +/Limits [(Doc-Start) (classParma__Polyhedra__Library_1_1BD__Shape_2626176104b632be36dc614e1d5536ea)] +>> endobj +12896 0 obj << +/Kids [12281 0 R 12282 0 R 12283 0 R 12284 0 R 12285 0 R 12286 0 R] +/Limits [(classParma__Polyhedra__Library_1_1BD__Shape_28b268e37d25a0cfa2b5bf39e85c758d) (classParma__Polyhedra__Library_1_1BD__Shape_8d6c186583503c4394603550b50edf59)] +>> endobj +12897 0 obj << +/Kids [12287 0 R 12288 0 R 12289 0 R 12290 0 R 12291 0 R 12292 0 R] +/Limits [(classParma__Polyhedra__Library_1_1BD__Shape_8e13e7d3536de2745bc9e58a25b75b77) (classParma__Polyhedra__Library_1_1BD__Shape_dbf2609849c95cfb7277df1edc69534f)] +>> endobj +12898 0 obj << +/Kids [12293 0 R 12294 0 R 12295 0 R 12296 0 R 12297 0 R 12298 0 R] +/Limits [(classParma__Polyhedra__Library_1_1BD__Shape_df3cfc56df68bc8063e6e9eb3d0ad3f1) (classParma__Polyhedra__Library_1_1Box_1d8eb71bd67ae50436968e7323bbeb7e)] +>> endobj +12899 0 obj << +/Kids [12299 0 R 12300 0 R 12301 0 R 12302 0 R 12303 0 R 12304 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Box_22f9ceb879f1c8d892f60fb3d9577d81) (classParma__Polyhedra__Library_1_1Box_7e3ffa1dd9894e6418bd153a4cd2de12)] +>> endobj +12900 0 obj << +/Kids [12305 0 R 12306 0 R 12307 0 R 12308 0 R 12309 0 R 12310 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Box_7fff251a8cd2ecd8b928175af94d7069) (classParma__Polyhedra__Library_1_1Box_c72c231542712976d1f9223d0537f5d5)] +>> endobj +12901 0 obj << +/Kids [12311 0 R 12312 0 R 12313 0 R 12314 0 R 12315 0 R 12316 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Box_c86971c152fbb8d2d486d7396ad6b142) (classParma__Polyhedra__Library_1_1C__Polyhedron_9720487deabf813a31afd4e9cfe695aa)] +>> endobj +12902 0 obj << +/Kids [12317 0 R 12318 0 R 12319 0 R 12320 0 R 12321 0 R 12322 0 R] +/Limits [(classParma__Polyhedra__Library_1_1C__Polyhedron_c3126925bcd3349b150771d52c19639d) (classParma__Polyhedra__Library_1_1Checked__Number_4bed59d493c4fd91537602efb267c938)] +>> endobj +12903 0 obj << +/Kids [12323 0 R 12324 0 R 12325 0 R 12326 0 R 12327 0 R 12328 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Checked__Number_4cca5e272cecc038189aac8b2fc8ace2) (classParma__Polyhedra__Library_1_1Checked__Number_a3de5a2fe7f06d0aa3e4972be2023933)] +>> endobj +12904 0 obj << +/Kids [12329 0 R 12330 0 R 12331 0 R 12332 0 R 12333 0 R 12334 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Checked__Number_a7885d402d5653321f316029ca0af517) (classParma__Polyhedra__Library_1_1Checked__Number_f47ee9cf59cfac8a346660698c61d113)] +>> endobj +12905 0 obj << +/Kids [12335 0 R 12336 0 R 12337 0 R 12338 0 R 12339 0 R 12340 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Checked__Number_f9af63978105e142642222864ce7c3be) (classParma__Polyhedra__Library_1_1Congruence__System_044dbf593127c9e8cbbbe2a0d169c30c)] +>> endobj +12906 0 obj << +/Kids [12341 0 R 12342 0 R 12343 0 R 12344 0 R 12345 0 R 12346 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Congruence__System_067b4c27cf8643f8ded50ebda77da8aa) (classParma__Polyhedra__Library_1_1Congruence__System_a83361b2264ca8ed30599dca32447874)] +>> endobj +12907 0 obj << +/Kids [12347 0 R 12348 0 R 12349 0 R 12350 0 R 12351 0 R 12352 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Congruence__System_b30ab523e337d72baa4edc802452e532) (classParma__Polyhedra__Library_1_1Constraint_2935fff040a5b31930fff594a0b2596d)] +>> endobj +12908 0 obj << +/Kids [12353 0 R 12354 0 R 12355 0 R 12356 0 R 12357 0 R 12358 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Constraint_2fb9117b8937e3d9a9b4d3ae397bb79a) (classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_f3c5bf7dd0135194b6c180dcb232ef54)] +>> endobj +12909 0 obj << +/Kids [12359 0 R 12360 0 R 12361 0 R 12362 0 R 12363 0 R 12364 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Constraint__System_1_1const__iterator_fc81dafc5cf15ca9acd8f6a03f66c788) (classParma__Polyhedra__Library_1_1Constraint_c9b8aa34a8ed8e2c3c38d0435adff6ab)] +>> endobj +12910 0 obj << +/Kids [12365 0 R 12366 0 R 12367 0 R 12368 0 R 12369 0 R 12370 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Constraint_c9b8aa34a8ed8e2c3c38d0435adff6ab7491a8ba26958c3e27bed23b7eef1a7e) (classParma__Polyhedra__Library_1_1Determinate_a76dc794cd0a663bebbf8fc0d11d9714)] +>> endobj +12911 0 obj << +/Kids [12371 0 R 12372 0 R 12373 0 R 12374 0 R 12375 0 R 12376 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Determinate_a894183e37c6f3614ed4938d94a3a7ee) (classParma__Polyhedra__Library_1_1Generator_2aba27eb7310045e1a35c7e68af01ab2)] +>> endobj +12912 0 obj << +/Kids [12377 0 R 12378 0 R 12379 0 R 12380 0 R 12381 0 R 12382 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Generator_303b4ed4262469c1834228e0f88dba74) (classParma__Polyhedra__Library_1_1Generator__System_25fce97f25e1814c62ec46b7a04ee942)] +>> endobj +12913 0 obj << +/Kids [12383 0 R 12384 0 R 12385 0 R 12386 0 R 12387 0 R 12388 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Generator__System_2b29f5668213f9171cfdc666ef4142ea) (classParma__Polyhedra__Library_1_1Generator_eff190ba56f86d3425859043689d499a)] +>> endobj +12914 0 obj << +/Kids [12389 0 R 12390 0 R 12391 0 R 12392 0 R 12393 0 R 12394 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Generator_f1827b1f7a42393a2526944530559c5a) (classParma__Polyhedra__Library_1_1Grid_323efbe5d43695cc65f8cd5935da94dc)] +>> endobj +12915 0 obj << +/Kids [12395 0 R 12396 0 R 12397 0 R 12398 0 R 12399 0 R 12400 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid_3628b6d6e250d4c6b8301173c6ecc777) (classParma__Polyhedra__Library_1_1Grid_8d2cc5d18d050975101f2860f2919da8)] +>> endobj +12916 0 obj << +/Kids [12401 0 R 12402 0 R 12403 0 R 12404 0 R 12405 0 R 12406 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid_8edc85ba3e8a09593959814eaad72499) (classParma__Polyhedra__Library_1_1Grid__Generator_1a15765e7fd1f486a9ee12a061dc4c76)] +>> endobj +12917 0 obj << +/Kids [12407 0 R 12408 0 R 12409 0 R 12410 0 R 12411 0 R 12412 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid__Generator_1aabacaac0806d617f53db4b34b3349e) (classParma__Polyhedra__Library_1_1Grid__Generator__System_63fd965105d740ff7003037964ec7d10)] +>> endobj +12918 0 obj << +/Kids [12413 0 R 12414 0 R 12415 0 R 12416 0 R 12417 0 R 12418 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid__Generator__System_642db539e09ba9a9746d490390097d73) (classParma__Polyhedra__Library_1_1Grid__Generator_f00dd6aeffc847b73a3aee11d6d169b6)] +>> endobj +12919 0 obj << +/Kids [12419 0 R 12420 0 R 12421 0 R 12422 0 R 12423 0 R 12424 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid__Generator_f4e7705af87f5eb64d2ebdc60cd7a36e) (classParma__Polyhedra__Library_1_1Grid_fde364ce088f82cf2b9a231e7d9f2abc)] +>> endobj +12920 0 obj << +/Kids [12425 0 R 12426 0 R 12427 0 R 12428 0 R 12429 0 R 12430 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid_fe613a3da3edc3cb4506f70d409f061d) (classParma__Polyhedra__Library_1_1Linear__Expression_298a32e26d8133869f28560cca4ba73b)] +>> endobj +12921 0 obj << +/Kids [12431 0 R 12432 0 R 12433 0 R 12434 0 R 12435 0 R 12436 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Linear__Expression_2e4d2efe88475a75dab18c7f9fe5e217) (classParma__Polyhedra__Library_1_1Linear__Expression_e9cc837bbae1745ada3780634c73858f)] +>> endobj +12922 0 obj << +/Kids [12437 0 R 12438 0 R 12439 0 R 12440 0 R 12441 0 R 12442 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Linear__Expression_ea20a64dc7e9dd789fb069c7b8faca16) (classParma__Polyhedra__Library_1_1MIP__Problem_abc43ede7fd0577eaeb7255a0eca232d)] +>> endobj +12923 0 obj << +/Kids [12443 0 R 12444 0 R 12445 0 R 12446 0 R 12447 0 R 12448 0 R] +/Limits [(classParma__Polyhedra__Library_1_1MIP__Problem_abc43ede7fd0577eaeb7255a0eca232d4d21924dceed7aac6368d4bc5affeccf) (classParma__Polyhedra__Library_1_1No__Reduction_77067a656a3aa9381a93a23dfba036e4)] +>> endobj +12924 0 obj << +/Kids [12449 0 R 12450 0 R 12451 0 R 12452 0 R 12453 0 R 12454 0 R] +/Limits [(classParma__Polyhedra__Library_1_1No__Reduction_f38e352895f910cc9556dc7ac0d8f39d) (classParma__Polyhedra__Library_1_1Octagonal__Shape_35518da8c480784110d40b680256bd61)] +>> endobj +12925 0 obj << +/Kids [12455 0 R 12456 0 R 12457 0 R 12458 0 R 12459 0 R 12460 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Octagonal__Shape_38da38d0fab7eed9ee09fdb11f88fd15) (classParma__Polyhedra__Library_1_1Octagonal__Shape_af0214aee8884dc52be4e061d6b4df94)] +>> endobj +12926 0 obj << +/Kids [12461 0 R 12462 0 R 12463 0 R 12464 0 R 12465 0 R 12466 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Octagonal__Shape_afdd0083c1c10d49e06f4718a826ae1b) (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_0c2c96efcf10102068f754c608a12427)] +>> endobj +12927 0 obj << +/Kids [12467 0 R 12468 0 R 12469 0 R 12470 0 R 12471 0 R 12472 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_0e39243c24d99f8d374f9c14e3da8d98) (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_4a53183970490595ac39c8c070601c6f)] +>> endobj +12928 0 obj << +/Kids [12473 0 R 12474 0 R 12475 0 R 12476 0 R 12477 0 R 12478 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_4ac4e4131c756f0ffce85b9dec7d2b3a) (classParma__Polyhedra__Library_1_1Partially__Reduced__Product_b95eae83384d8c6b41b9ed8f9fd16704)] +>> endobj +12929 0 obj << +/Kids [12479 0 R 12480 0 R 12481 0 R 12482 0 R 12483 0 R 12484 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Partially__Reduced__Product_bb5709426ac80aa0bcf907b4f1d4a577) (classParma__Polyhedra__Library_1_1Pointset__Powerset_16579a075dfcd1fa22ac02bcc859353b)] +>> endobj +12930 0 obj << +/Kids [12485 0 R 12486 0 R 12487 0 R 12488 0 R 12489 0 R 12490 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Pointset__Powerset_1760892eb5a3f38323cff257495f1711) (classParma__Polyhedra__Library_1_1Pointset__Powerset_6f42f2d4a41b935d5441c51351faffa6)] +>> endobj +12931 0 obj << +/Kids [12491 0 R 12492 0 R 12493 0 R 12494 0 R 12495 0 R 12496 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Pointset__Powerset_6f68d17132551d9a40f661fcd911b482) (classParma__Polyhedra__Library_1_1Pointset__Powerset_d64b9c9ef7488b49c4f9a4acd3f57491)] +>> endobj +12932 0 obj << +/Kids [12497 0 R 12498 0 R 12499 0 R 12500 0 R 12501 0 R 12502 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Pointset__Powerset_d6f64ccc36541cf23baca88a68ad06d7) (classParma__Polyhedra__Library_1_1Poly__Gen__Relation_4f7df2a0b66616d7672e562fa8c4e8f6)] +>> endobj +12933 0 obj << +/Kids [12503 0 R 12504 0 R 12505 0 R 12506 0 R 12507 0 R 12508 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Poly__Gen__Relation_5740d23d50b9aa7c95e8b6b51242258d) (classParma__Polyhedra__Library_1_1Polyhedron_4f9a47ba1b29f1e07a32542584d50686)] +>> endobj +12934 0 obj << +/Kids [12509 0 R 12510 0 R 12511 0 R 12512 0 R 12513 0 R 12514 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Polyhedron_50e1047c49fffb06bc5089a06a051a3d) (classParma__Polyhedra__Library_1_1Polyhedron_9ca6b6eed07fd3b72119b8ea58328e5e)] +>> endobj +12935 0 obj << +/Kids [12515 0 R 12516 0 R 12517 0 R 12518 0 R 12519 0 R 12520 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Polyhedron_9f3c5474494eb306717bc3da7c109307) (classParma__Polyhedra__Library_1_1Polyhedron_e58a861a42c5216a2267e3f94ecaec8c)] +>> endobj +12936 0 obj << +/Kids [12521 0 R 12522 0 R 12523 0 R 12524 0 R 12525 0 R 12526 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Polyhedron_e680437fdc213b7174c581caa2e0c0d3) (classParma__Polyhedra__Library_1_1Powerset_5c3bee913efb87e4661df746e184e1e1)] +>> endobj +12937 0 obj << +/Kids [12527 0 R 12528 0 R 12529 0 R 12530 0 R 12531 0 R 12532 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Powerset_5d2c2fc2c077e77db657af49d332c9b5) (classParma__Polyhedra__Library_1_1Throwable_5024cc2b142473f5f733a8808cb09162)] +>> endobj +12938 0 obj << +/Kids [12533 0 R 12534 0 R 12535 0 R 12536 0 R 12537 0 R 12538 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Variable) (deprecated__deprecated000007)] +>> endobj +12939 0 obj << +/Kids [12539 0 R 12540 0 R 12541 0 R 12542 0 R 12543 0 R 12544 0 R] +/Limits [(deprecated__deprecated000008) (group__PPL__CXX__interface_g760aa1f95d13e389ec6eb33fdbf88783)] +>> endobj +12940 0 obj << +/Kids [12545 0 R 12546 0 R 12547 0 R 12548 0 R 12549 0 R 12550 0 R] +/Limits [(group__PPL__CXX__interface_g79bd3696a302bb721ef8168fa5d650fb) (group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a8979f37a289d4cb316643f1dcc07ec7cd)] +>> endobj +12941 0 obj << +/Kids [12551 0 R 12552 0 R 12553 0 R 12554 0 R 12555 0 R 12556 0 R] +/Limits [(group__PPL__CXX__interface_gga88e9b9cb2588cbf5914695fc14e69a89f5dce9506b72773425c0504845d8e4e) (main_BHMZ05a)] +>> endobj +12942 0 obj << +/Kids [12557 0 R 12558 0 R 12559 0 R 12560 0 R 12561 0 R 12562 0 R] +/Limits [(main_BHMZ05b) (main_CC92)] +>> endobj +12943 0 obj << +/Kids [12563 0 R 12564 0 R 12565 0 R 12566 0 R 12567 0 R 12568 0 R] +/Limits [(main_CH78) (main_Grid_Concatenate)] +>> endobj +12944 0 obj << +/Kids [12569 0 R 12570 0 R 12571 0 R 12572 0 R 12573 0 R 12574 0 R] +/Limits [(main_Grid_Difference) (main_LW97)] +>> endobj +12945 0 obj << +/Kids [12575 0 R 12576 0 R 12577 0 R 12578 0 R 12579 0 R 12580 0 R] +/Limits [(main_LeV92) (main_RBL06)] +>> endobj +12946 0 obj << +/Kids [12581 0 R 12582 0 R 12583 0 R 12584 0 R 12585 0 R 12586 0 R] +/Limits [(main_Rational_Grids) (main_expand_space_dimension)] +>> endobj +12947 0 obj << +/Kids [12587 0 R 12588 0 R 12589 0 R 12590 0 R 12591 0 R 12592 0 R] +/Limits [(main_fold_space_dimensions) (namespaceParma__Polyhedra__Library_4bef34d0d723e765fc4ae7dbd2d195b5)] +>> endobj +12948 0 obj << +/Kids [12593 0 R 12594 0 R 12595 0 R 12596 0 R 12597 0 R 12598 0 R] +/Limits [(namespaceParma__Polyhedra__Library_5604f97d216583cdf012a50d2f8cdbde) (page.103)] +>> endobj +12949 0 obj << +/Kids [12599 0 R 12600 0 R 12601 0 R 12602 0 R 12603 0 R 12604 0 R] +/Limits [(page.104) (page.136)] +>> endobj +12950 0 obj << +/Kids [12605 0 R 12606 0 R 12607 0 R 12608 0 R 12609 0 R 12610 0 R] +/Limits [(page.137) (page.169)] +>> endobj +12951 0 obj << +/Kids [12611 0 R 12612 0 R 12613 0 R 12614 0 R 12615 0 R 12616 0 R] +/Limits [(page.17) (page.200)] +>> endobj +12952 0 obj << +/Kids [12617 0 R 12618 0 R 12619 0 R 12620 0 R 12621 0 R 12622 0 R] +/Limits [(page.201) (page.233)] +>> endobj +12953 0 obj << +/Kids [12623 0 R 12624 0 R 12625 0 R 12626 0 R 12627 0 R 12628 0 R] +/Limits [(page.234) (page.266)] +>> endobj +12954 0 obj << +/Kids [12629 0 R 12630 0 R 12631 0 R 12632 0 R 12633 0 R 12634 0 R] +/Limits [(page.267) (page.299)] +>> endobj +12955 0 obj << +/Kids [12635 0 R 12636 0 R 12637 0 R 12638 0 R 12639 0 R 12640 0 R] +/Limits [(page.3) (page.330)] +>> endobj +12956 0 obj << +/Kids [12641 0 R 12642 0 R 12643 0 R 12644 0 R 12645 0 R 12646 0 R] +/Limits [(page.331) (page.363)] +>> endobj +12957 0 obj << +/Kids [12647 0 R 12648 0 R 12649 0 R 12650 0 R 12651 0 R 12652 0 R] +/Limits [(page.364) (page.396)] +>> endobj +12958 0 obj << +/Kids [12653 0 R 12654 0 R 12655 0 R 12656 0 R 12657 0 R 12658 0 R] +/Limits [(page.397) (page.428)] +>> endobj +12959 0 obj << +/Kids [12659 0 R 12660 0 R 12661 0 R 12662 0 R 12663 0 R 12664 0 R] +/Limits [(page.429) (page.59)] +>> endobj +12960 0 obj << +/Kids [12665 0 R 12666 0 R 12667 0 R 12668 0 R 12669 0 R 12670 0 R] +/Limits [(page.6) (page.91)] +>> endobj +12961 0 obj << +/Kids [12671 0 R 12672 0 R 12673 0 R 12674 0 R 12675 0 R 12676 0 R] +/Limits [(page.92) (paragraph.11.1.3.15)] +>> endobj +12962 0 obj << +/Kids [12677 0 R 12678 0 R 12679 0 R 12680 0 R 12681 0 R 12682 0 R] +/Limits [(paragraph.11.1.3.16) (paragraph.11.1.3.48)] +>> endobj +12963 0 obj << +/Kids [12683 0 R 12684 0 R 12685 0 R 12686 0 R 12687 0 R 12688 0 R] +/Limits [(paragraph.11.1.3.49) (paragraph.11.10.4.3)] +>> endobj +12964 0 obj << +/Kids [12689 0 R 12690 0 R 12691 0 R 12692 0 R 12693 0 R 12694 0 R] +/Limits [(paragraph.11.10.4.4) (paragraph.11.17.2.1)] +>> endobj +12965 0 obj << +/Kids [12695 0 R 12696 0 R 12697 0 R 12698 0 R 12699 0 R 12700 0 R] +/Limits [(paragraph.11.17.3.1) (paragraph.11.20.2.6)] +>> endobj +12966 0 obj << +/Kids [12701 0 R 12702 0 R 12703 0 R 12704 0 R 12705 0 R 12706 0 R] +/Limits [(paragraph.11.20.2.7) (paragraph.11.21.3.27)] +>> endobj +12967 0 obj << +/Kids [12707 0 R 12708 0 R 12709 0 R 12710 0 R 12711 0 R 12712 0 R] +/Limits [(paragraph.11.21.3.28) (paragraph.11.21.3.6)] +>> endobj +12968 0 obj << +/Kids [12713 0 R 12714 0 R 12715 0 R 12716 0 R 12717 0 R 12718 0 R] +/Limits [(paragraph.11.21.3.60) (paragraph.11.25.3.2)] +>> endobj +12969 0 obj << +/Kids [12719 0 R 12720 0 R 12721 0 R 12722 0 R 12723 0 R 12724 0 R] +/Limits [(paragraph.11.25.3.3) (paragraph.11.33.3.6)] +>> endobj +12970 0 obj << +/Kids [12725 0 R 12726 0 R 12727 0 R 12728 0 R 12729 0 R 12730 0 R] +/Limits [(paragraph.11.33.3.7) (paragraph.11.35.3.1)] +>> endobj +12971 0 obj << +/Kids [12731 0 R 12732 0 R 12733 0 R 12734 0 R 12735 0 R 12736 0 R] +/Limits [(paragraph.11.36.2.1) (paragraph.11.37.3.31)] +>> endobj +12972 0 obj << +/Kids [12737 0 R 12738 0 R 12739 0 R 12740 0 R 12741 0 R 12742 0 R] +/Limits [(paragraph.11.37.3.32) (paragraph.11.37.4.5)] +>> endobj +12973 0 obj << +/Kids [12743 0 R 12744 0 R 12745 0 R 12746 0 R 12747 0 R 12748 0 R] +/Limits [(paragraph.11.37.4.6) (paragraph.11.38.3.27)] +>> endobj +12974 0 obj << +/Kids [12749 0 R 12750 0 R 12751 0 R 12752 0 R 12753 0 R 12754 0 R] +/Limits [(paragraph.11.38.3.28) (paragraph.11.39.2.7)] +>> endobj +12975 0 obj << +/Kids [12755 0 R 12756 0 R 12757 0 R 12758 0 R 12759 0 R 12760 0 R] +/Limits [(paragraph.11.39.2.8) (paragraph.11.39.3.4)] +>> endobj +12976 0 obj << +/Kids [12761 0 R 12762 0 R 12763 0 R 12764 0 R 12765 0 R 12766 0 R] +/Limits [(paragraph.11.39.3.40) (paragraph.11.4.2.5)] +>> endobj +12977 0 obj << +/Kids [12767 0 R 12768 0 R 12769 0 R 12770 0 R 12771 0 R 12772 0 R] +/Limits [(paragraph.11.4.2.6) (paragraph.11.4.3.38)] +>> endobj +12978 0 obj << +/Kids [12773 0 R 12774 0 R 12775 0 R 12776 0 R 12777 0 R 12778 0 R] +/Limits [(paragraph.11.4.3.39) (paragraph.11.40.2.2)] +>> endobj +12979 0 obj << +/Kids [12779 0 R 12780 0 R 12781 0 R 12782 0 R 12783 0 R 12784 0 R] +/Limits [(paragraph.11.40.2.3) (paragraph.11.42.3.28)] +>> endobj +12980 0 obj << +/Kids [12785 0 R 12786 0 R 12787 0 R 12788 0 R 12789 0 R 12790 0 R] +/Limits [(paragraph.11.42.3.29) (paragraph.11.42.3.60)] +>> endobj +12981 0 obj << +/Kids [12791 0 R 12792 0 R 12793 0 R 12794 0 R 12795 0 R 12796 0 R] +/Limits [(paragraph.11.42.3.61) (paragraph.11.5.2.10)] +>> endobj +12982 0 obj << +/Kids [12797 0 R 12798 0 R 12799 0 R 12800 0 R 12801 0 R 12802 0 R] +/Limits [(paragraph.11.5.2.11) (paragraph.11.6.3.3)] +>> endobj +12983 0 obj << +/Kids [12803 0 R 12804 0 R 12805 0 R 12806 0 R 12807 0 R 12808 0 R] +/Limits [(paragraph.11.6.3.30) (paragraph.11.7.4.4)] +>> endobj +12984 0 obj << +/Kids [12809 0 R 12810 0 R 12811 0 R 12812 0 R 12813 0 R 12814 0 R] +/Limits [(paragraph.11.7.4.5) (section*.107)] +>> endobj +12985 0 obj << +/Kids [12815 0 R 12816 0 R 12817 0 R 12818 0 R 12819 0 R 12820 0 R] +/Limits [(section*.108) (section*.14)] +>> endobj +12986 0 obj << +/Kids [12821 0 R 12822 0 R 12823 0 R 12824 0 R 12825 0 R 12826 0 R] +/Limits [(section*.140) (section*.172)] +>> endobj +12987 0 obj << +/Kids [12827 0 R 12828 0 R 12829 0 R 12830 0 R 12831 0 R 12832 0 R] +/Limits [(section*.173) (section*.4)] +>> endobj +12988 0 obj << +/Kids [12833 0 R 12834 0 R 12835 0 R 12836 0 R 12837 0 R 12838 0 R] +/Limits [(section*.40) (section*.72)] +>> endobj +12989 0 obj << +/Kids [12839 0 R 12840 0 R 12841 0 R 12842 0 R 12843 0 R 12844 0 R] +/Limits [(section*.73) (section.5)] +>> endobj +12990 0 obj << +/Kids [12845 0 R 12846 0 R 12847 0 R 12848 0 R 12849 0 R 12850 0 R] +/Limits [(section.6) (subsection.11.10)] +>> endobj +12991 0 obj << +/Kids [12851 0 R 12852 0 R 12853 0 R 12854 0 R 12855 0 R 12856 0 R] +/Limits [(subsection.11.11) (subsection.11.43)] +>> endobj +12992 0 obj << +/Kids [12857 0 R 12858 0 R 12859 0 R 12860 0 R 12861 0 R 12862 0 R] +/Limits [(subsection.11.44) (subsubsection.1.3.4)] +>> endobj +12993 0 obj << +/Kids [12863 0 R 12864 0 R 12865 0 R 12866 0 R 12867 0 R 12868 0 R] +/Limits [(subsubsection.1.4.1) (subsubsection.1.8.2)] +>> endobj +12994 0 obj << +/Kids [12869 0 R 12870 0 R 12871 0 R 12872 0 R 12873 0 R 12874 0 R] +/Limits [(subsubsection.1.8.3) (subsubsection.11.10.5)] +>> endobj +12995 0 obj << +/Kids [12875 0 R 12876 0 R 12877 0 R 12878 0 R 12879 0 R 12880 0 R] +/Limits [(subsubsection.11.11.1) (subsubsection.11.25.3)] +>> endobj +12996 0 obj << +/Kids [12881 0 R 12882 0 R 12883 0 R 12884 0 R 12885 0 R 12886 0 R] +/Limits [(subsubsection.11.26.1) (subsubsection.11.39.4)] +>> endobj +12997 0 obj << +/Kids [12887 0 R 12888 0 R 12889 0 R 12890 0 R 12891 0 R 12892 0 R] +/Limits [(subsubsection.11.4.1) (subsubsection.11.7.2)] +>> endobj +12998 0 obj << +/Kids [12893 0 R 12894 0 R] +/Limits [(subsubsection.11.7.3) (subsubsection.9.1.5)] +>> endobj +12999 0 obj << +/Kids [12895 0 R 12896 0 R 12897 0 R 12898 0 R 12899 0 R 12900 0 R] +/Limits [(Doc-Start) (classParma__Polyhedra__Library_1_1Box_c72c231542712976d1f9223d0537f5d5)] +>> endobj +13000 0 obj << +/Kids [12901 0 R 12902 0 R 12903 0 R 12904 0 R 12905 0 R 12906 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Box_c86971c152fbb8d2d486d7396ad6b142) (classParma__Polyhedra__Library_1_1Congruence__System_a83361b2264ca8ed30599dca32447874)] +>> endobj +13001 0 obj << +/Kids [12907 0 R 12908 0 R 12909 0 R 12910 0 R 12911 0 R 12912 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Congruence__System_b30ab523e337d72baa4edc802452e532) (classParma__Polyhedra__Library_1_1Generator__System_25fce97f25e1814c62ec46b7a04ee942)] +>> endobj +13002 0 obj << +/Kids [12913 0 R 12914 0 R 12915 0 R 12916 0 R 12917 0 R 12918 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Generator__System_2b29f5668213f9171cfdc666ef4142ea) (classParma__Polyhedra__Library_1_1Grid__Generator_f00dd6aeffc847b73a3aee11d6d169b6)] +>> endobj +13003 0 obj << +/Kids [12919 0 R 12920 0 R 12921 0 R 12922 0 R 12923 0 R 12924 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Grid__Generator_f4e7705af87f5eb64d2ebdc60cd7a36e) (classParma__Polyhedra__Library_1_1Octagonal__Shape_35518da8c480784110d40b680256bd61)] +>> endobj +13004 0 obj << +/Kids [12925 0 R 12926 0 R 12927 0 R 12928 0 R 12929 0 R 12930 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Octagonal__Shape_38da38d0fab7eed9ee09fdb11f88fd15) (classParma__Polyhedra__Library_1_1Pointset__Powerset_6f42f2d4a41b935d5441c51351faffa6)] +>> endobj +13005 0 obj << +/Kids [12931 0 R 12932 0 R 12933 0 R 12934 0 R 12935 0 R 12936 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Pointset__Powerset_6f68d17132551d9a40f661fcd911b482) (classParma__Polyhedra__Library_1_1Powerset_5c3bee913efb87e4661df746e184e1e1)] +>> endobj +13006 0 obj << +/Kids [12937 0 R 12938 0 R 12939 0 R 12940 0 R 12941 0 R 12942 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Powerset_5d2c2fc2c077e77db657af49d332c9b5) (main_CC92)] +>> endobj +13007 0 obj << +/Kids [12943 0 R 12944 0 R 12945 0 R 12946 0 R 12947 0 R 12948 0 R] +/Limits [(main_CH78) (page.103)] +>> endobj +13008 0 obj << +/Kids [12949 0 R 12950 0 R 12951 0 R 12952 0 R 12953 0 R 12954 0 R] +/Limits [(page.104) (page.299)] +>> endobj +13009 0 obj << +/Kids [12955 0 R 12956 0 R 12957 0 R 12958 0 R 12959 0 R 12960 0 R] +/Limits [(page.3) (page.91)] +>> endobj +13010 0 obj << +/Kids [12961 0 R 12962 0 R 12963 0 R 12964 0 R 12965 0 R 12966 0 R] +/Limits [(page.92) (paragraph.11.21.3.27)] +>> endobj +13011 0 obj << +/Kids [12967 0 R 12968 0 R 12969 0 R 12970 0 R 12971 0 R 12972 0 R] +/Limits [(paragraph.11.21.3.28) (paragraph.11.37.4.5)] +>> endobj +13012 0 obj << +/Kids [12973 0 R 12974 0 R 12975 0 R 12976 0 R 12977 0 R 12978 0 R] +/Limits [(paragraph.11.37.4.6) (paragraph.11.40.2.2)] +>> endobj +13013 0 obj << +/Kids [12979 0 R 12980 0 R 12981 0 R 12982 0 R 12983 0 R 12984 0 R] +/Limits [(paragraph.11.40.2.3) (section*.107)] +>> endobj +13014 0 obj << +/Kids [12985 0 R 12986 0 R 12987 0 R 12988 0 R 12989 0 R 12990 0 R] +/Limits [(section*.108) (subsection.11.10)] +>> endobj +13015 0 obj << +/Kids [12991 0 R 12992 0 R 12993 0 R 12994 0 R 12995 0 R 12996 0 R] +/Limits [(subsection.11.11) (subsubsection.11.39.4)] +>> endobj +13016 0 obj << +/Kids [12997 0 R 12998 0 R] +/Limits [(subsubsection.11.4.1) (subsubsection.9.1.5)] +>> endobj +13017 0 obj << +/Kids [12999 0 R 13000 0 R 13001 0 R 13002 0 R 13003 0 R 13004 0 R] +/Limits [(Doc-Start) (classParma__Polyhedra__Library_1_1Pointset__Powerset_6f42f2d4a41b935d5441c51351faffa6)] +>> endobj +13018 0 obj << +/Kids [13005 0 R 13006 0 R 13007 0 R 13008 0 R 13009 0 R 13010 0 R] +/Limits [(classParma__Polyhedra__Library_1_1Pointset__Powerset_6f68d17132551d9a40f661fcd911b482) (paragraph.11.21.3.27)] +>> endobj +13019 0 obj << +/Kids [13011 0 R 13012 0 R 13013 0 R 13014 0 R 13015 0 R 13016 0 R] +/Limits [(paragraph.11.21.3.28) (subsubsection.9.1.5)] +>> endobj +13020 0 obj << +/Kids [13017 0 R 13018 0 R 13019 0 R] +/Limits [(Doc-Start) (subsubsection.9.1.5)] +>> endobj +13021 0 obj << +/Dests 13020 0 R +>> endobj +13022 0 obj << +/Type /Catalog +/Pages 12273 0 R +/Outlines 12274 0 R +/Names 13021 0 R +/PageMode/UseOutlines/PageLabels << /Nums [0 << /S /D >> 1 << /S /r >> 3 << /S /D >> ] >> +/OpenAction 333 0 R +>> endobj +13023 0 obj << +/Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.3)/Keywords() +/CreationDate (D:20090418071519+02'00') +/ModDate (D:20090418071519+02'00') +/Trapped /False +/PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6) +>> endobj +xref +0 13024 +0000000001 65535 f +0000000002 00000 f +0000000003 00000 f +0000000004 00000 f +0000000000 00000 f +0000000015 00000 n +0000054024 00000 n +0002882772 00000 n +0000000060 00000 n +0000000248 00000 n +0000054193 00000 n +0002882700 00000 n +0000000298 00000 n +0000000416 00000 n +0000073168 00000 n +0002882614 00000 n +0000000467 00000 n +0000000597 00000 n +0000073285 00000 n +0002882528 00000 n +0000000648 00000 n +0000000758 00000 n +0000078462 00000 n +0002882442 00000 n +0000000809 00000 n +0000001020 00000 n +0000097149 00000 n +0002882356 00000 n +0000001071 00000 n +0000001257 00000 n +0000134868 00000 n +0002882270 00000 n +0000001308 00000 n +0000001436 00000 n +0000135213 00000 n +0002882184 00000 n +0000001487 00000 n +0000001637 00000 n +0000144992 00000 n +0002882098 00000 n +0000001688 00000 n +0000001788 00000 n +0000155178 00000 n +0002882012 00000 n +0000001839 00000 n +0000002015 00000 n +0000176730 00000 n +0002881926 00000 n +0000002067 00000 n +0000002225 00000 n +0000181804 00000 n +0002881840 00000 n +0000002277 00000 n +0000002511 00000 n +0000182432 00000 n +0002881754 00000 n +0000002563 00000 n +0000002739 00000 n +0000192912 00000 n +0002881668 00000 n +0000002791 00000 n +0000002909 00000 n +0000202382 00000 n +0002881595 00000 n +0000002961 00000 n +0000003048 00000 n +0000241208 00000 n +0002881506 00000 n +0000003094 00000 n +0000003260 00000 n +0000275804 00000 n +0002881416 00000 n +0000003306 00000 n +0000003492 00000 n +0000295995 00000 n +0002881326 00000 n +0000003538 00000 n +0000003643 00000 n +0000318018 00000 n +0002881199 00000 n +0000003689 00000 n +0000003779 00000 n +0000318075 00000 n +0002881138 00000 n +0000003830 00000 n +0000003892 00000 n +0000318132 00000 n +0002881011 00000 n +0000003938 00000 n +0000004043 00000 n +0000318189 00000 n +0002880950 00000 n +0000004094 00000 n +0000004194 00000 n +0000318246 00000 n +0002880822 00000 n +0000004240 00000 n +0000004325 00000 n +0000318302 00000 n +0002880760 00000 n +0000004376 00000 n +0000004482 00000 n +0000332384 00000 n +0002880627 00000 n +0000004529 00000 n +0000004615 00000 n +0000332442 00000 n +0002880562 00000 n +0000004667 00000 n +0000004748 00000 n +0000352626 00000 n +0002880428 00000 n +0000004795 00000 n +0000004926 00000 n +0000352743 00000 n +0002880363 00000 n +0000004978 00000 n +0000005122 00000 n +0000406923 00000 n +0002880229 00000 n +0000005170 00000 n +0000005316 00000 n +0000407040 00000 n +0002880150 00000 n +0000005369 00000 n +0000005624 00000 n +0000458571 00000 n +0002880057 00000 n +0000005677 00000 n +0000006005 00000 n +0000461841 00000 n +0002879978 00000 n +0000006058 00000 n +0000006207 00000 n +0000468439 00000 n +0002879857 00000 n +0000006255 00000 n +0000006381 00000 n +0000468555 00000 n +0002879778 00000 n +0000006434 00000 n +0000006801 00000 n +0000634618 00000 n +0002879685 00000 n +0000006854 00000 n +0000007192 00000 n +0000645687 00000 n +0002879592 00000 n +0000007245 00000 n +0000007633 00000 n +0000645980 00000 n +0002879499 00000 n +0000007686 00000 n +0000008035 00000 n +0000801855 00000 n +0002879406 00000 n +0000008088 00000 n +0000008396 00000 n +0000822338 00000 n +0002879313 00000 n +0000008449 00000 n +0000008889 00000 n +0000927043 00000 n +0002879220 00000 n +0000008942 00000 n +0000009237 00000 n +0000965666 00000 n +0002879127 00000 n +0000009290 00000 n +0000009623 00000 n +0000995449 00000 n +0002879034 00000 n +0000009676 00000 n +0000010092 00000 n +0001001442 00000 n +0002878941 00000 n +0000010146 00000 n +0000010441 00000 n +0001055149 00000 n +0002878848 00000 n +0000010495 00000 n +0000010828 00000 n +0001080227 00000 n +0002878755 00000 n +0000010882 00000 n +0000011298 00000 n +0001085027 00000 n +0002878662 00000 n +0000011352 00000 n +0000011812 00000 n +0001091035 00000 n +0002878569 00000 n +0000011866 00000 n +0000012250 00000 n +0001108879 00000 n +0002878476 00000 n +0000012304 00000 n +0000012729 00000 n +0001109113 00000 n +0002878383 00000 n +0000012783 00000 n +0000013124 00000 n +0001109289 00000 n +0002878290 00000 n +0000013178 00000 n +0000013468 00000 n +0001166997 00000 n +0002878197 00000 n +0000013522 00000 n +0000013850 00000 n +0001190733 00000 n +0002878104 00000 n +0000013904 00000 n +0000014315 00000 n +0001206562 00000 n +0002878011 00000 n +0000014369 00000 n +0000014672 00000 n +0001226280 00000 n +0002877918 00000 n +0000014726 00000 n +0000014991 00000 n +0001396182 00000 n +0002877825 00000 n +0000015045 00000 n +0000015373 00000 n +0001402033 00000 n +0002877732 00000 n +0000015427 00000 n +0000015805 00000 n +0001409397 00000 n +0002877639 00000 n +0000015859 00000 n +0000016177 00000 n +0001448029 00000 n +0002877546 00000 n +0000016231 00000 n +0000016587 00000 n +0001485315 00000 n +0002877453 00000 n +0000016641 00000 n +0000017080 00000 n +0001491086 00000 n +0002877360 00000 n +0000017134 00000 n +0000017457 00000 n +0001494993 00000 n +0002877267 00000 n +0000017511 00000 n +0000017884 00000 n +0001501705 00000 n +0002877174 00000 n +0000017938 00000 n +0000018370 00000 n +0001514058 00000 n +0002877081 00000 n +0000018424 00000 n +0000018806 00000 n +0001514293 00000 n +0002876988 00000 n +0000018860 00000 n +0000019359 00000 n +0001518875 00000 n +0002876895 00000 n +0000019413 00000 n +0000019851 00000 n +0001519110 00000 n +0002876802 00000 n +0000019905 00000 n +0000020238 00000 n +0001574330 00000 n +0002876709 00000 n +0000020292 00000 n +0000020595 00000 n +0001618892 00000 n +0002876616 00000 n +0000020649 00000 n +0000020967 00000 n +0001641459 00000 n +0002876523 00000 n +0000021021 00000 n +0000021436 00000 n +0001645811 00000 n +0002876430 00000 n +0000021490 00000 n +0000021892 00000 n +0001807913 00000 n +0002876337 00000 n +0000021946 00000 n +0000022447 00000 n +0001945966 00000 n +0002876244 00000 n +0000022501 00000 n +0000022918 00000 n +0002091062 00000 n +0002876151 00000 n +0000022972 00000 n +0000023308 00000 n +0002102957 00000 n +0002876058 00000 n +0000023362 00000 n +0000023698 00000 n +0002116749 00000 n +0002875965 00000 n +0000023752 00000 n +0000024047 00000 n +0002280182 00000 n +0002875872 00000 n +0000024101 00000 n +0000024465 00000 n +0002324991 00000 n +0002875779 00000 n +0000024519 00000 n +0000024837 00000 n +0002328291 00000 n +0002875686 00000 n +0000024891 00000 n +0000025321 00000 n +0002333325 00000 n +0002875593 00000 n +0000025375 00000 n +0000025665 00000 n +0002333688 00000 n +0002875500 00000 n +0000025719 00000 n +0000026004 00000 n +0002345003 00000 n +0002875407 00000 n +0000026058 00000 n +0000026393 00000 n +0002352059 00000 n +0002875328 00000 n +0000026447 00000 n +0000026760 00000 n +0000028156 00000 n +0000028389 00000 n +0000026812 00000 n +0000028275 00000 n +0000028332 00000 n +0002863356 00000 n +0002861015 00000 n +0002861598 00000 n +0002861307 00000 n +0002863718 00000 n +0000030794 00000 n +0000030960 00000 n +0000031112 00000 n +0000031278 00000 n +0000031576 00000 n +0000031751 00000 n +0000031902 00000 n +0000032058 00000 n +0000032215 00000 n +0000032371 00000 n +0000032526 00000 n +0000032682 00000 n +0000032839 00000 n +0000032996 00000 n +0000033152 00000 n +0000033309 00000 n +0000033467 00000 n +0000033625 00000 n +0000033781 00000 n +0000033939 00000 n +0000034096 00000 n +0000034247 00000 n +0000034396 00000 n +0000034546 00000 n +0000036919 00000 n +0000034695 00000 n +0000034982 00000 n +0000030455 00000 n +0000028500 00000 n +0000034868 00000 n +0002862993 00000 n +0000031428 00000 n +0002862634 00000 n +0000034925 00000 n +0000275919 00000 n +0000241324 00000 n +0000037075 00000 n +0000037225 00000 n +0000037382 00000 n +0000037533 00000 n +0000037689 00000 n +0000037839 00000 n +0000037996 00000 n +0000038147 00000 n +0000038304 00000 n +0000038456 00000 n +0000038614 00000 n +0000038772 00000 n +0000038930 00000 n +0000039081 00000 n +0000039238 00000 n +0000039396 00000 n +0000039553 00000 n +0000039711 00000 n +0000039869 00000 n +0000040027 00000 n +0000040185 00000 n +0000040343 00000 n +0000040499 00000 n +0000040657 00000 n +0000040816 00000 n +0000040975 00000 n +0000041134 00000 n +0000041293 00000 n +0000041452 00000 n +0000041610 00000 n +0000041769 00000 n +0000041928 00000 n +0000044325 00000 n +0000042086 00000 n +0000042316 00000 n +0000036516 00000 n +0000035080 00000 n +0000042259 00000 n +0002858952 00000 n +0000044484 00000 n +0000044643 00000 n +0000044802 00000 n +0000044961 00000 n +0000045120 00000 n +0000045278 00000 n +0000045436 00000 n +0000045595 00000 n +0000045754 00000 n +0000045913 00000 n +0000046072 00000 n +0000046389 00000 n +0000046548 00000 n +0000046706 00000 n +0000046864 00000 n +0000047023 00000 n +0000047182 00000 n +0000047341 00000 n +0000047658 00000 n +0000047817 00000 n +0000047976 00000 n +0000048134 00000 n +0000048292 00000 n +0000048451 00000 n +0000048610 00000 n +0000048769 00000 n +0000048928 00000 n +0000049086 00000 n +0000049244 00000 n +0000052539 00000 n +0000049403 00000 n +0000049576 00000 n +0000043930 00000 n +0000042427 00000 n +0000046231 00000 n +0000047500 00000 n +0000052699 00000 n +0000052861 00000 n +0000053050 00000 n +0000053239 00000 n +0000053424 00000 n +0000053616 00000 n +0000057082 00000 n +0000053794 00000 n +0000054368 00000 n +0000052344 00000 n +0000049687 00000 n +0000053967 00000 n +0000054079 00000 n +0000054136 00000 n +0000054249 00000 n +0000054311 00000 n +0002863535 00000 n +0002862339 00000 n +0002859544 00000 n +0000073224 00000 n +0000192850 00000 n +0000801797 00000 n +0001618834 00000 n +0000468497 00000 n +0001645753 00000 n +0000645922 00000 n +0000057261 00000 n +0000057446 00000 n +0000057640 00000 n +0000057843 00000 n +0000058429 00000 n +0000056911 00000 n +0000054531 00000 n +0000058016 00000 n +0000058073 00000 n +0000058135 00000 n +0000058192 00000 n +0000058254 00000 n +0000058311 00000 n +0000058373 00000 n +0001217319 00000 n +0001495228 00000 n +0001945908 00000 n +0001799185 00000 n +0000061282 00000 n +0000061568 00000 n +0000061143 00000 n +0000058553 00000 n +0000061455 00000 n +0002860284 00000 n +0002860722 00000 n +0000061512 00000 n +0002863837 00000 n +0000064377 00000 n +0000064897 00000 n +0000064238 00000 n +0000061729 00000 n +0000064550 00000 n +0000064607 00000 n +0000064664 00000 n +0000064726 00000 n +0000064783 00000 n +0000064840 00000 n +0000067738 00000 n +0000068139 00000 n +0000067599 00000 n +0000065008 00000 n +0000067911 00000 n +0000067968 00000 n +0000068025 00000 n +0000068082 00000 n +0000072268 00000 n +0000072423 00000 n +0000072576 00000 n +0000072728 00000 n +0000072881 00000 n +0000073578 00000 n +0000072097 00000 n +0000068263 00000 n +0000073054 00000 n +0000073111 00000 n +0000073341 00000 n +0000073402 00000 n +0002860430 00000 n +0002859986 00000 n +0002861453 00000 n +0002858658 00000 n +0002858805 00000 n +0000073459 00000 n +0000073521 00000 n +0000215394 00000 n +0000220352 00000 n +0000236501 00000 n +0000237500 00000 n +0000077752 00000 n +0000077940 00000 n +0000078636 00000 n +0000077605 00000 n +0000073828 00000 n +0000078113 00000 n +0000078170 00000 n +0000078229 00000 n +0000078286 00000 n +0000078343 00000 n +0000078400 00000 n +0000078517 00000 n +0000078579 00000 n +0000088625 00000 n +0000083033 00000 n +0000083619 00000 n +0000082894 00000 n +0000078873 00000 n +0000083206 00000 n +0002859248 00000 n +0000083263 00000 n +0000083324 00000 n +0000083381 00000 n +0000083443 00000 n +0000083500 00000 n +0000083562 00000 n +0000088157 00000 n +0000088744 00000 n +0000088018 00000 n +0000083868 00000 n +0000088330 00000 n +0000088387 00000 n +0000088449 00000 n +0000088506 00000 n +0000088568 00000 n +0000088687 00000 n +0002863956 00000 n +0000092449 00000 n +0000092971 00000 n +0000092310 00000 n +0000088956 00000 n +0000092622 00000 n +0000092679 00000 n +0000092740 00000 n +0000092797 00000 n +0000092859 00000 n +0000092916 00000 n +0000096800 00000 n +0000097680 00000 n +0000096661 00000 n +0000093196 00000 n +0000096973 00000 n +0000097030 00000 n +0000097087 00000 n +0000097205 00000 n +0000097267 00000 n +0000097324 00000 n +0000097386 00000 n +0000097443 00000 n +0000097505 00000 n +0000097562 00000 n +0000097623 00000 n +0000101993 00000 n +0000102148 00000 n +0000102886 00000 n +0000101846 00000 n +0000097892 00000 n +0000102321 00000 n +0000102378 00000 n +0000102435 00000 n +0000102492 00000 n +0000102549 00000 n +0002862192 00000 n +0002861162 00000 n +0000102605 00000 n +0000102661 00000 n +0000102717 00000 n +0000102774 00000 n +0000102830 00000 n +0000220409 00000 n +0000107322 00000 n +0000107479 00000 n +0000107937 00000 n +0000107175 00000 n +0000103149 00000 n +0000107652 00000 n +0000107709 00000 n +0000107766 00000 n +0000107823 00000 n +0000107880 00000 n +0000113170 00000 n +0000113519 00000 n +0000113031 00000 n +0000108187 00000 n +0000113343 00000 n +0000113400 00000 n +0000113462 00000 n +0000117799 00000 n +0000117952 00000 n +0000118105 00000 n +0000118863 00000 n +0000117644 00000 n +0000113744 00000 n +0000118278 00000 n +0000118335 00000 n +0000118397 00000 n +0000118454 00000 n +0000118509 00000 n +0000118565 00000 n +0000118626 00000 n +0000118683 00000 n +0000118744 00000 n +0000118801 00000 n +0002864075 00000 n +0000225611 00000 n +0000225728 00000 n +0000122803 00000 n +0000123176 00000 n +0000123329 00000 n +0000123482 00000 n +0000123635 00000 n +0000124331 00000 n +0000122624 00000 n +0000119112 00000 n +0000123808 00000 n +0000123865 00000 n +0000122990 00000 n +0000123922 00000 n +0000123979 00000 n +0000124036 00000 n +0000124093 00000 n +0000124155 00000 n +0000124212 00000 n +0000124274 00000 n +0000182488 00000 n +0000225259 00000 n +0000208623 00000 n +0000128379 00000 n +0000128532 00000 n +0000128685 00000 n +0000128837 00000 n +0000129006 00000 n +0000129171 00000 n +0000129810 00000 n +0000128200 00000 n +0000124531 00000 n +0000129344 00000 n +0000129401 00000 n +0000129458 00000 n +0000129515 00000 n +0000129577 00000 n +0000129634 00000 n +0000129691 00000 n +0000129748 00000 n +0000134981 00000 n +0000134330 00000 n +0000134482 00000 n +0000134638 00000 n +0000135448 00000 n +0000134175 00000 n +0000129959 00000 n +0000134811 00000 n +0000134924 00000 n +0000135038 00000 n +0000135095 00000 n +0000135152 00000 n +0000135269 00000 n +0000135330 00000 n +0000135386 00000 n +0000215508 00000 n +0000202666 00000 n +0000139204 00000 n +0000139356 00000 n +0000139511 00000 n +0000144605 00000 n +0000139663 00000 n +0000140364 00000 n +0000139041 00000 n +0000135648 00000 n +0000139836 00000 n +0000139893 00000 n +0000139950 00000 n +0000140012 00000 n +0000140069 00000 n +0000140131 00000 n +0000140188 00000 n +0000140245 00000 n +0000140302 00000 n +0000220011 00000 n +0000203121 00000 n +0000144762 00000 n +0000145524 00000 n +0000144458 00000 n +0000140552 00000 n +0000144935 00000 n +0000145048 00000 n +0000145110 00000 n +0000145167 00000 n +0000145229 00000 n +0000145286 00000 n +0000145348 00000 n +0000145405 00000 n +0000145467 00000 n +0000202722 00000 n +0000149627 00000 n +0000149779 00000 n +0000149936 00000 n +0000150695 00000 n +0000149472 00000 n +0000145749 00000 n +0000150109 00000 n +0000150166 00000 n +0000150223 00000 n +0002860135 00000 n +0000150280 00000 n +0000150340 00000 n +0000150396 00000 n +0000150458 00000 n +0000150515 00000 n +0000150577 00000 n +0000150634 00000 n +0002864194 00000 n +0000236972 00000 n +0000154652 00000 n +0000154829 00000 n +0000155710 00000 n +0000154505 00000 n +0000150922 00000 n +0000155002 00000 n +0000155059 00000 n +0000155116 00000 n +0000155234 00000 n +0000155296 00000 n +0000155353 00000 n +0000155415 00000 n +0000155472 00000 n +0000155534 00000 n +0000155591 00000 n +0000155653 00000 n +0000159494 00000 n +0000160183 00000 n +0000159355 00000 n +0000155922 00000 n +0000159667 00000 n +0000159724 00000 n +0000159781 00000 n +0000159838 00000 n +0000159900 00000 n +0000159957 00000 n +0000160014 00000 n +0000160070 00000 n +0000160127 00000 n +0000165529 00000 n +0000165706 00000 n +0000165881 00000 n +0000166405 00000 n +0000165374 00000 n +0000160433 00000 n +0000166054 00000 n +0000166111 00000 n +0000166168 00000 n +0000166225 00000 n +0000166287 00000 n +0000166344 00000 n +0000170279 00000 n +0000170436 00000 n +0000170956 00000 n +0000170132 00000 n +0000166655 00000 n +0000170609 00000 n +0000170666 00000 n +0000170723 00000 n +0000170780 00000 n +0000170837 00000 n +0000170899 00000 n +0000175417 00000 n +0000175582 00000 n +0000175735 00000 n +0000175888 00000 n +0000176040 00000 n +0000176205 00000 n +0000176957 00000 n +0000175238 00000 n +0000171168 00000 n +0000176378 00000 n +0000176435 00000 n +0000176492 00000 n +0000176549 00000 n +0000176611 00000 n +0000176668 00000 n +0000176786 00000 n +0000176843 00000 n +0000176900 00000 n +0000202609 00000 n +0000209022 00000 n +0000182371 00000 n +0000180311 00000 n +0000180621 00000 n +0000180799 00000 n +0000181119 00000 n +0000181517 00000 n +0000182607 00000 n +0000180116 00000 n +0000177181 00000 n +0000181690 00000 n +0000181747 00000 n +0000181860 00000 n +0000181917 00000 n +0000181974 00000 n +0000182031 00000 n +0000182087 00000 n +0000182143 00000 n +0000182200 00000 n +0000182257 00000 n +0000182314 00000 n +0000180466 00000 n +0000180960 00000 n +0000181318 00000 n +0000182550 00000 n +0002864313 00000 n +0000186418 00000 n +0000186570 00000 n +0000186723 00000 n +0000191595 00000 n +0000191765 00000 n +0000191931 00000 n +0000192081 00000 n +0000186877 00000 n +0000187791 00000 n +0000186255 00000 n +0000182830 00000 n +0000187050 00000 n +0000187107 00000 n +0000187164 00000 n +0000187221 00000 n +0000187278 00000 n +0000187335 00000 n +0000187392 00000 n +0000187449 00000 n +0000187506 00000 n +0000187563 00000 n +0000187620 00000 n +0000187677 00000 n +0000187734 00000 n +0000203007 00000 n +0000208965 00000 n +0000192233 00000 n +0000192427 00000 n +0000192620 00000 n +0000193196 00000 n +0000191408 00000 n +0000187965 00000 n +0000192793 00000 n +0000192968 00000 n +0000193025 00000 n +0000193082 00000 n +0000193139 00000 n +0000634560 00000 n +0001491028 00000 n +0000196819 00000 n +0000197282 00000 n +0000196680 00000 n +0000193320 00000 n +0000196992 00000 n +0000197049 00000 n +0000197106 00000 n +0000197163 00000 n +0000197225 00000 n +0000201175 00000 n +0000201372 00000 n +0000201569 00000 n +0000201734 00000 n +0000201909 00000 n +0000202091 00000 n +0000203178 00000 n +0000200996 00000 n +0000197406 00000 n +0000202264 00000 n +0000202321 00000 n +0000202438 00000 n +0000202495 00000 n +0000202552 00000 n +0000202779 00000 n +0000202836 00000 n +0000202893 00000 n +0000202950 00000 n +0000203064 00000 n +0000206938 00000 n +0000207122 00000 n +0000207306 00000 n +0000207489 00000 n +0000207672 00000 n +0000207837 00000 n +0000207991 00000 n +0000208173 00000 n +0000213068 00000 n +0000213251 00000 n +0000208336 00000 n +0000209306 00000 n +0000206735 00000 n +0000203289 00000 n +0000208509 00000 n +0000208566 00000 n +0000208680 00000 n +0000208737 00000 n +0000208794 00000 n +0000208851 00000 n +0000208908 00000 n +0000209079 00000 n +0000209136 00000 n +0000209193 00000 n +0000209250 00000 n +0000214882 00000 n +0000213416 00000 n +0000213569 00000 n +0000213752 00000 n +0000213917 00000 n +0000214072 00000 n +0000214256 00000 n +0000214440 00000 n +0000214595 00000 n +0000215565 00000 n +0000212857 00000 n +0000209417 00000 n +0000214768 00000 n +0000214825 00000 n +0000214939 00000 n +0000214996 00000 n +0000215053 00000 n +0000215109 00000 n +0000215166 00000 n +0000215223 00000 n +0000215280 00000 n +0000215337 00000 n +0000215451 00000 n +0002864432 00000 n +0000219464 00000 n +0000219668 00000 n +0000220695 00000 n +0000219317 00000 n +0000215676 00000 n +0000219841 00000 n +0000219898 00000 n +0000219955 00000 n +0000220068 00000 n +0000220125 00000 n +0000220182 00000 n +0000220239 00000 n +0000220295 00000 n +0000220466 00000 n +0000220523 00000 n +0000220580 00000 n +0000220638 00000 n +0000224763 00000 n +0000230095 00000 n +0000230284 00000 n +0000224967 00000 n +0000226139 00000 n +0000224611 00000 n +0000220819 00000 n +0000225141 00000 n +0000225200 00000 n +0000225317 00000 n +0000225375 00000 n +0000225434 00000 n +0000225493 00000 n +0000225552 00000 n +0000225669 00000 n +0000225786 00000 n +0000225845 00000 n +0000225904 00000 n +0000225963 00000 n +0000226022 00000 n +0000226080 00000 n +0000230437 00000 n +0000230589 00000 n +0000235808 00000 n +0000230742 00000 n +0000231858 00000 n +0000229916 00000 n +0000226251 00000 n +0000230916 00000 n +0000230975 00000 n +0000231034 00000 n +0000231093 00000 n +0000231152 00000 n +0000231211 00000 n +0000231270 00000 n +0000231329 00000 n +0000231387 00000 n +0000231446 00000 n +0000231505 00000 n +0000231564 00000 n +0000231623 00000 n +0000231682 00000 n +0000231741 00000 n +0000231800 00000 n +0000235960 00000 n +0000236114 00000 n +0000236268 00000 n +0000237558 00000 n +0000235638 00000 n +0000231983 00000 n +0000236442 00000 n +0000236559 00000 n +0000236618 00000 n +0000236677 00000 n +0000236736 00000 n +0000236795 00000 n +0000236854 00000 n +0000236913 00000 n +0000237030 00000 n +0000237089 00000 n +0000237147 00000 n +0000237206 00000 n +0000237265 00000 n +0000237324 00000 n +0000237382 00000 n +0000237441 00000 n +0000240811 00000 n +0000240975 00000 n +0000241440 00000 n +0000240659 00000 n +0000237670 00000 n +0000241149 00000 n +0000241265 00000 n +0000241382 00000 n +0000244951 00000 n +0000245361 00000 n +0000244807 00000 n +0000241539 00000 n +0000245125 00000 n +0000245184 00000 n +0000245243 00000 n +0000245302 00000 n +0002864555 00000 n +0000248370 00000 n +0000248837 00000 n +0000248226 00000 n +0000245460 00000 n +0000248544 00000 n +0000248603 00000 n +0000248662 00000 n +0000248719 00000 n +0000248778 00000 n +0000252390 00000 n +0000252681 00000 n +0000252246 00000 n +0000248936 00000 n +0000252564 00000 n +0000252623 00000 n +0000256432 00000 n +0000256724 00000 n +0000256288 00000 n +0000252780 00000 n +0000256606 00000 n +0000256665 00000 n +0000260046 00000 n +0000260397 00000 n +0000259902 00000 n +0000256823 00000 n +0000260220 00000 n +0000260279 00000 n +0000260338 00000 n +0000264096 00000 n +0000264447 00000 n +0000263952 00000 n +0000260496 00000 n +0000264270 00000 n +0000264329 00000 n +0000264388 00000 n +0000267855 00000 n +0000268324 00000 n +0000267711 00000 n +0000264546 00000 n +0000268029 00000 n +0000268088 00000 n +0000268147 00000 n +0000268206 00000 n +0000268265 00000 n +0002864681 00000 n +0000271277 00000 n +0000271453 00000 n +0000271863 00000 n +0000271124 00000 n +0000268423 00000 n +0000271627 00000 n +0000271686 00000 n +0000271745 00000 n +0000271804 00000 n +0002862811 00000 n +0000275198 00000 n +0000275375 00000 n +0000275571 00000 n +0000275976 00000 n +0000275036 00000 n +0000271976 00000 n +0000275745 00000 n +0000275861 00000 n +0000279796 00000 n +0000280029 00000 n +0000279652 00000 n +0000276089 00000 n +0000279970 00000 n +0000283866 00000 n +0000284099 00000 n +0000283722 00000 n +0000280128 00000 n +0000284040 00000 n +0000287594 00000 n +0000287827 00000 n +0000287450 00000 n +0000284198 00000 n +0000287768 00000 n +0000291334 00000 n +0000291510 00000 n +0000291743 00000 n +0000291181 00000 n +0000287926 00000 n +0000291684 00000 n +0002864807 00000 n +0000294052 00000 n +0000294271 00000 n +0000294465 00000 n +0000294685 00000 n +0000294878 00000 n +0000295096 00000 n +0000295290 00000 n +0000295510 00000 n +0000297667 00000 n +0000297887 00000 n +0000298081 00000 n +0000298301 00000 n +0000295703 00000 n +0000296404 00000 n +0000293836 00000 n +0000291842 00000 n +0000295877 00000 n +0000295936 00000 n +0000296052 00000 n +0000296111 00000 n +0000296170 00000 n +0000296229 00000 n +0000296287 00000 n +0000296346 00000 n +0000573037 00000 n +0000573273 00000 n +0000576313 00000 n +0000579413 00000 n +0000298494 00000 n +0000298714 00000 n +0000298907 00000 n +0000299127 00000 n +0000299321 00000 n +0000299536 00000 n +0000299730 00000 n +0000299945 00000 n +0000300139 00000 n +0000300354 00000 n +0000300548 00000 n +0000300763 00000 n +0000300957 00000 n +0000301169 00000 n +0000301363 00000 n +0000301577 00000 n +0000301771 00000 n +0000301985 00000 n +0000302178 00000 n +0000302393 00000 n +0000302586 00000 n +0000302801 00000 n +0000302995 00000 n +0000303209 00000 n +0000305668 00000 n +0000305883 00000 n +0000306077 00000 n +0000306306 00000 n +0000306499 00000 n +0000306728 00000 n +0000303401 00000 n +0000304400 00000 n +0000297271 00000 n +0000296503 00000 n +0000303575 00000 n +0000303634 00000 n +0000303693 00000 n +0000303752 00000 n +0000303811 00000 n +0000303870 00000 n +0000303928 00000 n +0000303987 00000 n +0000304046 00000 n +0000304105 00000 n +0000304164 00000 n +0000304223 00000 n +0000304282 00000 n +0000304341 00000 n +0000583062 00000 n +0000583298 00000 n +0000589492 00000 n +0000589728 00000 n +0001337919 00000 n +0001338155 00000 n +0001340834 00000 n +0001340952 00000 n +0001343590 00000 n +0001346504 00000 n +0001346739 00000 n +0001352046 00000 n +0001355282 00000 n +0001358439 00000 n +0000306921 00000 n +0000307150 00000 n +0000307344 00000 n +0000307572 00000 n +0000307766 00000 n +0000307995 00000 n +0000308189 00000 n +0000308410 00000 n +0000308604 00000 n +0000308824 00000 n +0000309018 00000 n +0000309238 00000 n +0000309432 00000 n +0000309652 00000 n +0000309846 00000 n +0000310066 00000 n +0000310259 00000 n +0000310480 00000 n +0000310673 00000 n +0000310894 00000 n +0000311088 00000 n +0000311308 00000 n +0000314253 00000 n +0000314474 00000 n +0000314668 00000 n +0000314889 00000 n +0000315083 00000 n +0000315304 00000 n +0000311500 00000 n +0000312558 00000 n +0000305272 00000 n +0000304499 00000 n +0000311674 00000 n +0000311733 00000 n +0000311792 00000 n +0000311851 00000 n +0000311910 00000 n +0000311969 00000 n +0000312028 00000 n +0000312086 00000 n +0000312145 00000 n +0000312204 00000 n +0000312263 00000 n +0000312322 00000 n +0000312381 00000 n +0000312440 00000 n +0000312499 00000 n +0001358675 00000 n +0002040991 00000 n +0002043758 00000 n +0002046928 00000 n +0002049969 00000 n +0002053696 00000 n +0002219969 00000 n +0002220206 00000 n +0002223380 00000 n +0002226037 00000 n +0002226158 00000 n +0002228965 00000 n +0002231941 00000 n +0002234645 00000 n +0000315498 00000 n +0000315656 00000 n +0000315834 00000 n +0000315993 00000 n +0000316188 00000 n +0000316347 00000 n +0000316503 00000 n +0000316662 00000 n +0000316821 00000 n +0000316979 00000 n +0000317136 00000 n +0000317294 00000 n +0000317452 00000 n +0000320056 00000 n +0000320213 00000 n +0000317608 00000 n +0000318359 00000 n +0000313938 00000 n +0000312657 00000 n +0000317782 00000 n +0000317841 00000 n +0000317900 00000 n +0000317959 00000 n +0002234887 00000 n +0002240948 00000 n +0002243931 00000 n +0000406981 00000 n +0000458512 00000 n +0000461782 00000 n +0000320371 00000 n +0000320529 00000 n +0000320688 00000 n +0000320847 00000 n +0000321006 00000 n +0000321165 00000 n +0000321324 00000 n +0000321483 00000 n +0000321642 00000 n +0000321801 00000 n +0000321959 00000 n +0000322118 00000 n +0000322277 00000 n +0000322434 00000 n +0000322593 00000 n +0000322752 00000 n +0000322911 00000 n +0000323070 00000 n +0000323229 00000 n +0000323387 00000 n +0000323546 00000 n +0000323705 00000 n +0000323863 00000 n +0000324022 00000 n +0000324181 00000 n +0000324340 00000 n +0000324499 00000 n +0000326968 00000 n +0000324658 00000 n +0000324891 00000 n +0000319651 00000 n +0000318471 00000 n +0000324832 00000 n +0000327126 00000 n +0000327285 00000 n +0000327443 00000 n +0000327602 00000 n +0000327760 00000 n +0000327919 00000 n +0000328078 00000 n +0000328237 00000 n +0000328396 00000 n +0000328555 00000 n +0000328714 00000 n +0000328872 00000 n +0000329031 00000 n +0000329190 00000 n +0000329347 00000 n +0000329534 00000 n +0000329693 00000 n +0000329890 00000 n +0000330048 00000 n +0000330257 00000 n +0000330415 00000 n +0000330596 00000 n +0000330754 00000 n +0000330944 00000 n +0000331102 00000 n +0000331295 00000 n +0000331453 00000 n +0000331641 00000 n +0000331799 00000 n +0000331994 00000 n +0000334890 00000 n +0000335105 00000 n +0000332151 00000 n +0000332499 00000 n +0000326545 00000 n +0000325003 00000 n +0000332325 00000 n +0002864933 00000 n +0000639906 00000 n +0000822279 00000 n +0000926984 00000 n +0000965607 00000 n +0000335263 00000 n +0000335451 00000 n +0000335610 00000 n +0000335806 00000 n +0000335965 00000 n +0000336180 00000 n +0000336339 00000 n +0000336539 00000 n +0000336698 00000 n +0000336887 00000 n +0000337045 00000 n +0000337238 00000 n +0000337397 00000 n +0000337595 00000 n +0000337754 00000 n +0000337941 00000 n +0000338100 00000 n +0000338294 00000 n +0000338452 00000 n +0000338664 00000 n +0000338823 00000 n +0000339012 00000 n +0000339171 00000 n +0000339353 00000 n +0000339512 00000 n +0000339707 00000 n +0000339889 00000 n +0000340048 00000 n +0000340255 00000 n +0000340436 00000 n +0000340594 00000 n +0000340787 00000 n +0000340946 00000 n +0000341147 00000 n +0000341306 00000 n +0000341526 00000 n +0000341685 00000 n +0000341879 00000 n +0000342038 00000 n +0000342244 00000 n +0000342403 00000 n +0000342589 00000 n +0000342748 00000 n +0000342938 00000 n +0000345680 00000 n +0000345913 00000 n +0000343097 00000 n +0000343330 00000 n +0000334332 00000 n +0000332611 00000 n +0000343271 00000 n +0000995390 00000 n +0001001383 00000 n +0001055090 00000 n +0001074874 00000 n +0001084968 00000 n +0001090976 00000 n +0001105135 00000 n +0001109054 00000 n +0001109230 00000 n +0001166938 00000 n +0001190674 00000 n +0001196629 00000 n +0001396123 00000 n +0001401975 00000 n +0001409338 00000 n +0001447970 00000 n +0001479473 00000 n +0001494934 00000 n +0001514000 00000 n +0000346071 00000 n +0000346273 00000 n +0000346432 00000 n +0000346627 00000 n +0000346785 00000 n +0000346975 00000 n +0000347134 00000 n +0000347326 00000 n +0000347485 00000 n +0000347676 00000 n +0000347834 00000 n +0000348027 00000 n +0000348186 00000 n +0000348390 00000 n +0000348549 00000 n +0000348745 00000 n +0000348904 00000 n +0000349097 00000 n +0000349255 00000 n +0000349448 00000 n +0000349607 00000 n +0000349794 00000 n +0000349953 00000 n +0000350139 00000 n +0000350298 00000 n +0000350491 00000 n +0000350650 00000 n +0000350843 00000 n +0000351002 00000 n +0000351189 00000 n +0000351348 00000 n +0000351531 00000 n +0000351688 00000 n +0000351886 00000 n +0000352044 00000 n +0000352234 00000 n +0000354412 00000 n +0000352393 00000 n +0000352801 00000 n +0000345194 00000 n +0000343442 00000 n +0000352567 00000 n +0000352684 00000 n +0001514234 00000 n +0001518816 00000 n +0001519051 00000 n +0001574271 00000 n +0001641400 00000 n +0002091004 00000 n +0002102898 00000 n +0002116691 00000 n +0002280122 00000 n +0002324931 00000 n +0002328231 00000 n +0002328838 00000 n +0002333628 00000 n +0002344943 00000 n +0002351999 00000 n +0000354602 00000 n +0000354833 00000 n +0000355035 00000 n +0000355228 00000 n +0000355415 00000 n +0000355613 00000 n +0000355805 00000 n +0000355990 00000 n +0000356188 00000 n +0000356382 00000 n +0000356578 00000 n +0000356789 00000 n +0000356977 00000 n +0000357173 00000 n +0000357366 00000 n +0000357580 00000 n +0000357767 00000 n +0000359768 00000 n +0000357963 00000 n +0000358255 00000 n +0000354106 00000 n +0000352913 00000 n +0000358137 00000 n +0000358196 00000 n +0000359983 00000 n +0000360171 00000 n +0000360371 00000 n +0000360591 00000 n +0000360783 00000 n +0000360979 00000 n +0000361188 00000 n +0000361380 00000 n +0000361586 00000 n +0000361783 00000 n +0000361970 00000 n +0000362160 00000 n +0000362355 00000 n +0000362537 00000 n +0000362728 00000 n +0000362921 00000 n +0000363103 00000 n +0000365275 00000 n +0000363288 00000 n +0000363521 00000 n +0000359462 00000 n +0000358380 00000 n +0000363462 00000 n +0000365456 00000 n +0000365642 00000 n +0000365836 00000 n +0000366030 00000 n +0000366230 00000 n +0000366421 00000 n +0000366626 00000 n +0000366815 00000 n +0000367000 00000 n +0000367196 00000 n +0000367386 00000 n +0000367581 00000 n +0000367737 00000 n +0000370431 00000 n +0000367941 00000 n +0000368292 00000 n +0000365005 00000 n +0000363646 00000 n +0000368115 00000 n +0000368174 00000 n +0000368233 00000 n +0000390207 00000 n +0000370635 00000 n +0000370839 00000 n +0000371043 00000 n +0000371247 00000 n +0000371451 00000 n +0000371655 00000 n +0000371859 00000 n +0000372063 00000 n +0000372298 00000 n +0000372533 00000 n +0000373005 00000 n +0000373242 00000 n +0000373476 00000 n +0000373712 00000 n +0000374184 00000 n +0000374421 00000 n +0000374656 00000 n +0000375128 00000 n +0000375364 00000 n +0000375837 00000 n +0000376073 00000 n +0000376310 00000 n +0000376780 00000 n +0000377016 00000 n +0000377250 00000 n +0000377485 00000 n +0000377954 00000 n +0000378191 00000 n +0000378426 00000 n +0000378662 00000 n +0000379132 00000 n +0000379604 00000 n +0000379840 00000 n +0000380044 00000 n +0000380281 00000 n +0000380516 00000 n +0000380752 00000 n +0000381220 00000 n +0000381630 00000 n +0000369864 00000 n +0000368417 00000 n +0000381394 00000 n +0000381453 00000 n +0000381512 00000 n +0000381571 00000 n +0000372769 00000 n +0000373948 00000 n +0000374892 00000 n +0000375601 00000 n +0000376545 00000 n +0000377718 00000 n +0000378896 00000 n +0000379369 00000 n +0000380986 00000 n +0002865059 00000 n +0000390325 00000 n +0000390443 00000 n +0000393619 00000 n +0000393796 00000 n +0000393912 00000 n +0000394030 00000 n +0000394207 00000 n +0000394325 00000 n +0000394389 00000 n +0000394453 00000 n +0000394517 00000 n +0000396740 00000 n +0000396804 00000 n +0000396868 00000 n +0000396932 00000 n +0000396996 00000 n +0000397060 00000 n +0000397124 00000 n +0000397188 00000 n +0000397252 00000 n +0000397316 00000 n +0000397380 00000 n +0000397444 00000 n +0000397508 00000 n +0000397572 00000 n +0000397636 00000 n +0000397700 00000 n +0000397764 00000 n +0000397828 00000 n +0000397892 00000 n +0000397956 00000 n +0000398020 00000 n +0000398084 00000 n +0000398202 00000 n +0000398266 00000 n +0000398330 00000 n +0000398394 00000 n +0000383611 00000 n +0000383814 00000 n +0000384051 00000 n +0000384287 00000 n +0000384490 00000 n +0000384726 00000 n +0000384963 00000 n +0000385199 00000 n +0000385436 00000 n +0000385672 00000 n +0000385909 00000 n +0000386113 00000 n +0000386586 00000 n +0000387059 00000 n +0000387295 00000 n +0000387499 00000 n +0000387972 00000 n +0000388209 00000 n +0000388412 00000 n +0000388885 00000 n +0000389358 00000 n +0000389594 00000 n +0000389797 00000 n +0000390502 00000 n +0000383224 00000 n +0000381742 00000 n +0000389971 00000 n +0000386350 00000 n +0000386823 00000 n +0000387736 00000 n +0000388649 00000 n +0000389122 00000 n +0000390030 00000 n +0000390089 00000 n +0000390148 00000 n +0000390266 00000 n +0000390384 00000 n +0000398458 00000 n +0000398576 00000 n +0000398640 00000 n +0000398704 00000 n +0000401068 00000 n +0000401132 00000 n +0000401196 00000 n +0000401260 00000 n +0000401324 00000 n +0000401388 00000 n +0000401452 00000 n +0000401569 00000 n +0000401633 00000 n +0000401697 00000 n +0000401761 00000 n +0000401879 00000 n +0000401943 00000 n +0000402007 00000 n +0000402125 00000 n +0000402189 00000 n +0000402253 00000 n +0000402376 00000 n +0000392944 00000 n +0000393134 00000 n +0000393327 00000 n +0000394580 00000 n +0000392782 00000 n +0000390627 00000 n +0000393501 00000 n +0000393560 00000 n +0000393678 00000 n +0000393737 00000 n +0000393854 00000 n +0000393971 00000 n +0000394089 00000 n +0000394148 00000 n +0000394266 00000 n +0002863172 00000 n +0000396507 00000 n +0000398763 00000 n +0000396363 00000 n +0000394693 00000 n +0000396681 00000 n +0000398143 00000 n +0000398517 00000 n +0000400586 00000 n +0000400776 00000 n +0000402494 00000 n +0000400433 00000 n +0000398901 00000 n +0000400950 00000 n +0000401009 00000 n +0000401510 00000 n +0000401820 00000 n +0000402066 00000 n +0000402317 00000 n +0000402435 00000 n +0000404527 00000 n +0000404721 00000 n +0000404911 00000 n +0000405142 00000 n +0000405344 00000 n +0000405537 00000 n +0000405723 00000 n +0000405921 00000 n +0000406113 00000 n +0000406298 00000 n +0000406494 00000 n +0000408632 00000 n +0000406690 00000 n +0000407216 00000 n +0000404284 00000 n +0000402620 00000 n +0000406864 00000 n +0000407098 00000 n +0000407157 00000 n +0000408820 00000 n +0000409017 00000 n +0000409212 00000 n +0000409399 00000 n +0000409594 00000 n +0000409780 00000 n +0000409981 00000 n +0000410173 00000 n +0000410370 00000 n +0000410563 00000 n +0000410760 00000 n +0000410948 00000 n +0000411139 00000 n +0000411329 00000 n +0000411523 00000 n +0000411705 00000 n +0000411896 00000 n +0000413893 00000 n +0000412086 00000 n +0000412319 00000 n +0000408326 00000 n +0000407341 00000 n +0000412260 00000 n +0002865185 00000 n +0000414075 00000 n +0000414261 00000 n +0000414441 00000 n +0000414628 00000 n +0000414822 00000 n +0000415016 00000 n +0000415216 00000 n +0000415407 00000 n +0000415610 00000 n +0000415803 00000 n +0000415992 00000 n +0000416177 00000 n +0000416373 00000 n +0000416563 00000 n +0000419313 00000 n +0000416767 00000 n +0000417059 00000 n +0000413614 00000 n +0000412431 00000 n +0000416941 00000 n +0000417000 00000 n +0000419517 00000 n +0000419721 00000 n +0000419925 00000 n +0000420160 00000 n +0000420397 00000 n +0000420634 00000 n +0000420871 00000 n +0000421107 00000 n +0000421344 00000 n +0000421581 00000 n +0000421818 00000 n +0000422054 00000 n +0000422290 00000 n +0000422527 00000 n +0000422764 00000 n +0000423000 00000 n +0000423237 00000 n +0000423474 00000 n +0000423711 00000 n +0000423947 00000 n +0000424184 00000 n +0000424421 00000 n +0000424658 00000 n +0000424894 00000 n +0000425131 00000 n +0000425368 00000 n +0000425841 00000 n +0000426077 00000 n +0000426279 00000 n +0000426515 00000 n +0000426752 00000 n +0000426989 00000 n +0000427461 00000 n +0000427665 00000 n +0000427902 00000 n +0000428138 00000 n +0000428342 00000 n +0000428578 00000 n +0000428815 00000 n +0000429052 00000 n +0000429289 00000 n +0000429525 00000 n +0000429762 00000 n +0000429965 00000 n +0000430201 00000 n +0000430437 00000 n +0000430909 00000 n +0000431111 00000 n +0000431346 00000 n +0000431581 00000 n +0000431784 00000 n +0000432021 00000 n +0000432258 00000 n +0000434521 00000 n +0000434732 00000 n +0000432494 00000 n +0000432786 00000 n +0000418656 00000 n +0000417171 00000 n +0000432668 00000 n +0000432727 00000 n +0000425605 00000 n +0000427225 00000 n +0000430673 00000 n +0000434943 00000 n +0000435153 00000 n +0000435364 00000 n +0000435574 00000 n +0000435783 00000 n +0000435994 00000 n +0000436205 00000 n +0000436416 00000 n +0000436627 00000 n +0000436838 00000 n +0000437048 00000 n +0000437257 00000 n +0000437468 00000 n +0000437679 00000 n +0000441090 00000 n +0000441293 00000 n +0000441504 00000 n +0000437889 00000 n +0000438889 00000 n +0000434233 00000 n +0000432898 00000 n +0000438063 00000 n +0000438122 00000 n +0000438181 00000 n +0000438240 00000 n +0000438299 00000 n +0000438358 00000 n +0000438417 00000 n +0000438476 00000 n +0000438535 00000 n +0000438594 00000 n +0000438653 00000 n +0000438712 00000 n +0000438771 00000 n +0000438830 00000 n +0000454362 00000 n +0000454480 00000 n +0000458143 00000 n +0000458266 00000 n +0000441708 00000 n +0000441919 00000 n +0000442123 00000 n +0000442326 00000 n +0000442537 00000 n +0000442741 00000 n +0000442952 00000 n +0000443163 00000 n +0000443373 00000 n +0000443583 00000 n +0000443786 00000 n +0000443997 00000 n +0000444208 00000 n +0000444419 00000 n +0000444629 00000 n +0000444832 00000 n +0000445043 00000 n +0000445245 00000 n +0000445447 00000 n +0000445648 00000 n +0000445849 00000 n +0000446051 00000 n +0000449655 00000 n +0000449857 00000 n +0000450059 00000 n +0000450261 00000 n +0000446253 00000 n +0000447312 00000 n +0000440721 00000 n +0000439014 00000 n +0000446427 00000 n +0000446486 00000 n +0000446545 00000 n +0000446604 00000 n +0000446663 00000 n +0000446722 00000 n +0000446781 00000 n +0000446840 00000 n +0000446899 00000 n +0000446958 00000 n +0000447017 00000 n +0000447076 00000 n +0000447135 00000 n +0002859691 00000 n +0000447194 00000 n +0000447253 00000 n +0000458389 00000 n +0000450463 00000 n +0000450665 00000 n +0000450867 00000 n +0000451069 00000 n +0000451280 00000 n +0000451482 00000 n +0000451693 00000 n +0000451897 00000 n +0000452100 00000 n +0000452304 00000 n +0000452508 00000 n +0000452712 00000 n +0000452916 00000 n +0000453103 00000 n +0000453307 00000 n +0000454538 00000 n +0000449349 00000 n +0000447451 00000 n +0000453481 00000 n +0000453540 00000 n +0000453599 00000 n +0000453658 00000 n +0000453717 00000 n +0000453776 00000 n +0000453835 00000 n +0000453894 00000 n +0000453953 00000 n +0000454012 00000 n +0000454067 00000 n +0000454126 00000 n +0000454185 00000 n +0000454244 00000 n +0000454303 00000 n +0000454421 00000 n +0000456991 00000 n +0000457412 00000 n +0000457623 00000 n +0000457851 00000 n +0000458746 00000 n +0000456811 00000 n +0000454690 00000 n +0000458025 00000 n +0000458084 00000 n +0000457202 00000 n +0000458207 00000 n +0000458330 00000 n +0000458453 00000 n +0000458629 00000 n +0000458688 00000 n +0002865311 00000 n +0000461664 00000 n +0000460969 00000 n +0000461147 00000 n +0000461372 00000 n +0000461958 00000 n +0000460807 00000 n +0000458885 00000 n +0000461546 00000 n +0000461605 00000 n +0000461723 00000 n +0000461899 00000 n +0000926630 00000 n +0000464170 00000 n +0000464390 00000 n +0000464583 00000 n +0000464803 00000 n +0000465023 00000 n +0000465242 00000 n +0000465462 00000 n +0000465682 00000 n +0000465901 00000 n +0000466104 00000 n +0000466324 00000 n +0000466527 00000 n +0000466747 00000 n +0000466967 00000 n +0000467187 00000 n +0000467391 00000 n +0000467595 00000 n +0000467815 00000 n +0000468002 00000 n +0000471662 00000 n +0000471882 00000 n +0000472069 00000 n +0000468206 00000 n +0000469202 00000 n +0000463855 00000 n +0000462071 00000 n +0000468380 00000 n +0002859100 00000 n +0000468613 00000 n +0000468672 00000 n +0000468731 00000 n +0000468789 00000 n +0000468848 00000 n +0002861746 00000 n +0000468907 00000 n +0000468966 00000 n +0002859838 00000 n +0000469025 00000 n +0000469084 00000 n +0000469143 00000 n +0000627973 00000 n +0000555488 00000 n +0000555606 00000 n +0000472273 00000 n +0000472493 00000 n +0000472689 00000 n +0000472909 00000 n +0000473105 00000 n +0000473325 00000 n +0000473520 00000 n +0000473739 00000 n +0000473926 00000 n +0000474129 00000 n +0000474348 00000 n +0000474528 00000 n +0000474712 00000 n +0000474915 00000 n +0000475135 00000 n +0000475317 00000 n +0000475521 00000 n +0000475741 00000 n +0000475934 00000 n +0000476138 00000 n +0000476325 00000 n +0000476545 00000 n +0000476732 00000 n +0000476950 00000 n +0000477137 00000 n +0000477357 00000 n +0000477561 00000 n +0000477780 00000 n +0000477984 00000 n +0000478204 00000 n +0000478393 00000 n +0000478588 00000 n +0000478805 00000 n +0000479001 00000 n +0000479220 00000 n +0000479414 00000 n +0000482867 00000 n +0000483063 00000 n +0000479632 00000 n +0000480336 00000 n +0000471167 00000 n +0000469369 00000 n +0000479806 00000 n +0000479865 00000 n +0000479924 00000 n +0000479983 00000 n +0000480041 00000 n +0000480100 00000 n +0002860868 00000 n +0000480159 00000 n +0000480218 00000 n +0000480277 00000 n +0000555724 00000 n +0000558590 00000 n +0000558713 00000 n +0000558831 00000 n +0000558949 00000 n +0000559067 00000 n +0000561511 00000 n +0000561628 00000 n +0000483283 00000 n +0000483503 00000 n +0000483699 00000 n +0000483919 00000 n +0000484114 00000 n +0000484333 00000 n +0000484529 00000 n +0000484733 00000 n +0000484937 00000 n +0000485155 00000 n +0000485350 00000 n +0000485553 00000 n +0000485756 00000 n +0000485943 00000 n +0000486163 00000 n +0000486359 00000 n +0000486562 00000 n +0000486765 00000 n +0000486985 00000 n +0000487181 00000 n +0000487384 00000 n +0000487587 00000 n +0000487774 00000 n +0000487993 00000 n +0000488179 00000 n +0000488398 00000 n +0000488583 00000 n +0000488803 00000 n +0000488990 00000 n +0000489187 00000 n +0000489406 00000 n +0000489593 00000 n +0000489790 00000 n +0000490009 00000 n +0000490196 00000 n +0000490392 00000 n +0000490610 00000 n +0000490795 00000 n +0000491014 00000 n +0000493799 00000 n +0000491234 00000 n +0000491644 00000 n +0000482354 00000 n +0000480516 00000 n +0000491408 00000 n +0000491467 00000 n +0000491526 00000 n +0000491585 00000 n +0000564136 00000 n +0000564254 00000 n +0000564372 00000 n +0000564489 00000 n +0000567192 00000 n +0000567314 00000 n +0000567437 00000 n +0000569569 00000 n +0000569687 00000 n +0000569803 00000 n +0000569921 00000 n +0000570039 00000 n +0000494019 00000 n +0000494239 00000 n +0000494459 00000 n +0000494678 00000 n +0000494898 00000 n +0000495084 00000 n +0000495304 00000 n +0000495522 00000 n +0000495710 00000 n +0000495928 00000 n +0000496114 00000 n +0000496332 00000 n +0000496520 00000 n +0000496740 00000 n +0000496926 00000 n +0000497144 00000 n +0000497340 00000 n +0000497558 00000 n +0000497754 00000 n +0000497974 00000 n +0000498169 00000 n +0000498389 00000 n +0000498585 00000 n +0000498801 00000 n +0000498994 00000 n +0000499214 00000 n +0000499410 00000 n +0000499629 00000 n +0000499846 00000 n +0000503413 00000 n +0000503633 00000 n +0000500041 00000 n +0000500569 00000 n +0000493385 00000 n +0000491783 00000 n +0000500215 00000 n +0000500274 00000 n +0000500333 00000 n +0000500392 00000 n +0000500451 00000 n +0000500510 00000 n +0000570157 00000 n +0000572919 00000 n +0000573155 00000 n +0000576078 00000 n +0000576195 00000 n +0000579530 00000 n +0000583180 00000 n +0000503829 00000 n +0000504047 00000 n +0000504235 00000 n +0000504451 00000 n +0000504638 00000 n +0000504855 00000 n +0000505051 00000 n +0000505269 00000 n +0000505465 00000 n +0000505683 00000 n +0000505869 00000 n +0000506033 00000 n +0000506251 00000 n +0000506443 00000 n +0000506608 00000 n +0000506826 00000 n +0000507013 00000 n +0000507233 00000 n +0000507420 00000 n +0000507638 00000 n +0000507823 00000 n +0000508043 00000 n +0000508230 00000 n +0000508450 00000 n +0000508635 00000 n +0000508853 00000 n +0000509040 00000 n +0000509260 00000 n +0000509447 00000 n +0000509626 00000 n +0000509846 00000 n +0000510032 00000 n +0000510228 00000 n +0000510407 00000 n +0000510626 00000 n +0000510811 00000 n +0000514809 00000 n +0000514988 00000 n +0000515208 00000 n +0000515394 00000 n +0000515598 00000 n +0000511006 00000 n +0000511239 00000 n +0000502927 00000 n +0000500708 00000 n +0000511180 00000 n +0002865437 00000 n +0000583415 00000 n +0000585903 00000 n +0000586021 00000 n +0000586139 00000 n +0000586257 00000 n +0000586375 00000 n +0000589374 00000 n +0000589610 00000 n +0000593181 00000 n +0000593299 00000 n +0000593417 00000 n +0000593535 00000 n +0000596469 00000 n +0000515794 00000 n +0000515970 00000 n +0000516190 00000 n +0000516386 00000 n +0000516590 00000 n +0000516786 00000 n +0000516963 00000 n +0000517183 00000 n +0000517369 00000 n +0000517573 00000 n +0000517965 00000 n +0000518142 00000 n +0000518362 00000 n +0000518558 00000 n +0000518762 00000 n +0000518958 00000 n +0000519135 00000 n +0000519355 00000 n +0000519540 00000 n +0000519736 00000 n +0000520128 00000 n +0000520315 00000 n +0000520534 00000 n +0000520719 00000 n +0000520914 00000 n +0000521305 00000 n +0000521492 00000 n +0000521709 00000 n +0000521896 00000 n +0000522065 00000 n +0000522283 00000 n +0000522499 00000 n +0000522684 00000 n +0000522850 00000 n +0000523070 00000 n +0000523257 00000 n +0000523424 00000 n +0000523642 00000 n +0000523829 00000 n +0000523993 00000 n +0000524213 00000 n +0000524400 00000 n +0000524596 00000 n +0000524759 00000 n +0000524975 00000 n +0000528374 00000 n +0000525160 00000 n +0000525452 00000 n +0000514188 00000 n +0000511378 00000 n +0000525334 00000 n +0002860575 00000 n +0000517769 00000 n +0000519932 00000 n +0000521109 00000 n +0000525393 00000 n +0000596587 00000 n +0000596705 00000 n +0000600054 00000 n +0000600172 00000 n +0000600290 00000 n +0000603613 00000 n +0000603731 00000 n +0000603849 00000 n +0000607253 00000 n +0000607371 00000 n +0000607489 00000 n +0000611364 00000 n +0000528708 00000 n +0000528928 00000 n +0000529115 00000 n +0000529311 00000 n +0000529478 00000 n +0000529696 00000 n +0000529883 00000 n +0000530043 00000 n +0000530260 00000 n +0000530447 00000 n +0000530667 00000 n +0000530854 00000 n +0000531050 00000 n +0000531209 00000 n +0000531427 00000 n +0000531631 00000 n +0000531849 00000 n +0000532052 00000 n +0000532270 00000 n +0000532454 00000 n +0000532625 00000 n +0000532842 00000 n +0000533034 00000 n +0000533252 00000 n +0000533456 00000 n +0000533674 00000 n +0000533865 00000 n +0000534083 00000 n +0000534269 00000 n +0000534473 00000 n +0000534690 00000 n +0000534882 00000 n +0000535068 00000 n +0000535272 00000 n +0000535492 00000 n +0000538545 00000 n +0000535710 00000 n +0000536179 00000 n +0000527897 00000 n +0000525673 00000 n +0000535884 00000 n +0000528541 00000 n +0000535943 00000 n +0000536002 00000 n +0000536061 00000 n +0000536120 00000 n +0000611482 00000 n +0000615242 00000 n +0000615360 00000 n +0000615478 00000 n +0000615596 00000 n +0000619309 00000 n +0000619427 00000 n +0000619545 00000 n +0000619661 00000 n +0000623787 00000 n +0000623909 00000 n +0000538765 00000 n +0000538984 00000 n +0000539171 00000 n +0000539358 00000 n +0000539578 00000 n +0000539765 00000 n +0000539985 00000 n +0000540172 00000 n +0000540359 00000 n +0000540579 00000 n +0000540772 00000 n +0000540958 00000 n +0000541143 00000 n +0000541346 00000 n +0000541565 00000 n +0000541757 00000 n +0000541943 00000 n +0000542130 00000 n +0000542333 00000 n +0000542551 00000 n +0000542743 00000 n +0000542929 00000 n +0000543114 00000 n +0000543317 00000 n +0000543536 00000 n +0000543729 00000 n +0000543914 00000 n +0000544100 00000 n +0000544302 00000 n +0000544522 00000 n +0000544715 00000 n +0000544899 00000 n +0000545082 00000 n +0000549460 00000 n +0000549680 00000 n +0000549873 00000 n +0000550059 00000 n +0000550246 00000 n +0000545283 00000 n +0000545693 00000 n +0000538095 00000 n +0000536345 00000 n +0000545457 00000 n +0000545516 00000 n +0000545575 00000 n +0000545634 00000 n +0000628155 00000 n +0000628273 00000 n +0000628396 00000 n +0000628519 00000 n +0000631029 00000 n +0000631152 00000 n +0000631274 00000 n +0000631397 00000 n +0000550449 00000 n +0000550669 00000 n +0000550856 00000 n +0000551229 00000 n +0000551420 00000 n +0000551608 00000 n +0000551794 00000 n +0000552145 00000 n +0000549208 00000 n +0000545859 00000 n +0000551968 00000 n +0000551043 00000 n +0000552027 00000 n +0000552086 00000 n +0000634314 00000 n +0000634437 00000 n +0000555008 00000 n +0000555196 00000 n +0000555787 00000 n +0000554855 00000 n +0000552349 00000 n +0000555370 00000 n +0000555429 00000 n +0000555547 00000 n +0000555665 00000 n +0000558124 00000 n +0000558298 00000 n +0000559130 00000 n +0000557971 00000 n +0000555976 00000 n +0000558472 00000 n +0000558531 00000 n +0000558654 00000 n +0000558772 00000 n +0000558890 00000 n +0000559008 00000 n +0002865563 00000 n +0000561219 00000 n +0000561746 00000 n +0000561075 00000 n +0000559256 00000 n +0000561393 00000 n +0000561452 00000 n +0000561570 00000 n +0000561687 00000 n +0000563844 00000 n +0000564611 00000 n +0000563700 00000 n +0000561872 00000 n +0000564018 00000 n +0000564077 00000 n +0000564195 00000 n +0000564313 00000 n +0000564430 00000 n +0000564553 00000 n +0000566959 00000 n +0000567500 00000 n +0000566815 00000 n +0000564750 00000 n +0000567133 00000 n +0000567255 00000 n +0000567378 00000 n +0000569277 00000 n +0000570215 00000 n +0000569133 00000 n +0000567639 00000 n +0000569451 00000 n +0000569510 00000 n +0000569628 00000 n +0000569746 00000 n +0000569862 00000 n +0000569980 00000 n +0000570098 00000 n +0000572262 00000 n +0000572433 00000 n +0000572627 00000 n +0000573331 00000 n +0000572100 00000 n +0000570354 00000 n +0000572801 00000 n +0000572860 00000 n +0000572978 00000 n +0000573096 00000 n +0000573214 00000 n +0000575421 00000 n +0000575592 00000 n +0000575786 00000 n +0000576371 00000 n +0000575259 00000 n +0000573470 00000 n +0000575960 00000 n +0000576019 00000 n +0000576137 00000 n +0000576254 00000 n +0002865689 00000 n +0000578391 00000 n +0000578562 00000 n +0000578756 00000 n +0000578927 00000 n +0000579121 00000 n +0000579647 00000 n +0000578211 00000 n +0000576510 00000 n +0000579295 00000 n +0000579354 00000 n +0000579472 00000 n +0000579588 00000 n +0000581884 00000 n +0000582102 00000 n +0000582273 00000 n +0000582466 00000 n +0000582636 00000 n +0000582829 00000 n +0000583533 00000 n +0000581695 00000 n +0000579786 00000 n +0000583003 00000 n +0000583121 00000 n +0000583239 00000 n +0000583356 00000 n +0000583474 00000 n +0000585507 00000 n +0000585670 00000 n +0000586433 00000 n +0000585354 00000 n +0000583672 00000 n +0000585844 00000 n +0000585962 00000 n +0000586080 00000 n +0000586198 00000 n +0000586316 00000 n +0000588366 00000 n +0000588531 00000 n +0000588717 00000 n +0000588888 00000 n +0000589082 00000 n +0000589787 00000 n +0000588186 00000 n +0000586572 00000 n +0000589256 00000 n +0000589315 00000 n +0000589433 00000 n +0000589551 00000 n +0000589669 00000 n +0000592167 00000 n +0000592338 00000 n +0000592532 00000 n +0000592711 00000 n +0000592889 00000 n +0000593653 00000 n +0000591987 00000 n +0000589926 00000 n +0000593063 00000 n +0000593122 00000 n +0000593240 00000 n +0000593358 00000 n +0000593476 00000 n +0000593594 00000 n +0000595881 00000 n +0000596059 00000 n +0000599231 00000 n +0000596236 00000 n +0000596764 00000 n +0000595719 00000 n +0000593792 00000 n +0000596410 00000 n +0000596528 00000 n +0000596646 00000 n +0002865815 00000 n +0000599408 00000 n +0000599585 00000 n +0000599762 00000 n +0000600348 00000 n +0000599060 00000 n +0000596940 00000 n +0000599936 00000 n +0000599995 00000 n +0000600113 00000 n +0000600231 00000 n +0000602778 00000 n +0000602965 00000 n +0000603152 00000 n +0000605961 00000 n +0000603321 00000 n +0000603908 00000 n +0000602607 00000 n +0000600524 00000 n +0000603495 00000 n +0000603554 00000 n +0000603672 00000 n +0000603790 00000 n +0000606128 00000 n +0000606295 00000 n +0000606461 00000 n +0000606629 00000 n +0000606793 00000 n +0000610240 00000 n +0000606961 00000 n +0000607548 00000 n +0000605763 00000 n +0000604084 00000 n +0000607135 00000 n +0000607194 00000 n +0000607312 00000 n +0000607430 00000 n +0000610404 00000 n +0000610572 00000 n +0000610739 00000 n +0000610906 00000 n +0000611072 00000 n +0000611599 00000 n +0000610051 00000 n +0000607700 00000 n +0000611246 00000 n +0000611305 00000 n +0000611423 00000 n +0002862042 00000 n +0000611541 00000 n +0000614353 00000 n +0000614514 00000 n +0000614682 00000 n +0000614841 00000 n +0000615009 00000 n +0000615654 00000 n +0000614173 00000 n +0000611778 00000 n +0000615183 00000 n +0000615301 00000 n +0000615419 00000 n +0000615537 00000 n +0000618254 00000 n +0000618426 00000 n +0000618645 00000 n +0000618831 00000 n +0000622724 00000 n +0000619017 00000 n +0000619720 00000 n +0000618074 00000 n +0000615855 00000 n +0000619191 00000 n +0000619250 00000 n +0000619368 00000 n +0000619486 00000 n +0000619603 00000 n +0002865941 00000 n +0000622915 00000 n +0000623105 00000 n +0000623325 00000 n +0000627200 00000 n +0000627385 00000 n +0000623495 00000 n +0000624031 00000 n +0000622544 00000 n +0000619908 00000 n +0000623669 00000 n +0000623728 00000 n +0000623851 00000 n +0000623972 00000 n +0000627571 00000 n +0000627740 00000 n +0000628641 00000 n +0000627029 00000 n +0000624182 00000 n +0000627914 00000 n +0000628037 00000 n +0000628096 00000 n +0000628214 00000 n +0000628337 00000 n +0000628460 00000 n +0000628582 00000 n +0000630796 00000 n +0000631460 00000 n +0000630652 00000 n +0000628792 00000 n +0000630970 00000 n +0000631093 00000 n +0000631216 00000 n +0000631338 00000 n +0000633813 00000 n +0000636744 00000 n +0000634022 00000 n +0000634735 00000 n +0000633660 00000 n +0000631586 00000 n +0000634196 00000 n +0000634255 00000 n +0000634378 00000 n +0000634501 00000 n +0000634676 00000 n +0000636973 00000 n +0000637202 00000 n +0000637390 00000 n +0000637619 00000 n +0000637816 00000 n +0000638045 00000 n +0000638274 00000 n +0000638470 00000 n +0000638699 00000 n +0000638886 00000 n +0000639083 00000 n +0000639965 00000 n +0000636501 00000 n +0000634887 00000 n +0000639257 00000 n +0000639316 00000 n +0000639375 00000 n +0000639434 00000 n +0000639493 00000 n +0000639552 00000 n +0000639611 00000 n +0000639670 00000 n +0000639729 00000 n +0000639788 00000 n +0000639847 00000 n +0000642153 00000 n +0000642395 00000 n +0000642592 00000 n +0000642789 00000 n +0000643002 00000 n +0000643216 00000 n +0000643402 00000 n +0000643616 00000 n +0000643802 00000 n +0000644016 00000 n +0000644220 00000 n +0000644424 00000 n +0000644628 00000 n +0000644842 00000 n +0000645046 00000 n +0000645250 00000 n +0000648516 00000 n +0000648711 00000 n +0000645454 00000 n +0000646215 00000 n +0000641865 00000 n +0000640130 00000 n +0000645628 00000 n +0000645745 00000 n +0000645804 00000 n +0000645863 00000 n +0000646038 00000 n +0000646097 00000 n +0000646156 00000 n +0002866067 00000 n +0000787307 00000 n +0000787430 00000 n +0000787548 00000 n +0000787663 00000 n +0000648925 00000 n +0000649120 00000 n +0000649334 00000 n +0000649529 00000 n +0000649743 00000 n +0000649938 00000 n +0000650152 00000 n +0000650355 00000 n +0000650569 00000 n +0000650771 00000 n +0000650984 00000 n +0000651198 00000 n +0000651412 00000 n +0000651626 00000 n +0000651840 00000 n +0000652054 00000 n +0000652258 00000 n +0000652462 00000 n +0000652676 00000 n +0000652857 00000 n +0000653061 00000 n +0000653275 00000 n +0000653456 00000 n +0000653660 00000 n +0000653874 00000 n +0000654070 00000 n +0000654283 00000 n +0000654478 00000 n +0000654670 00000 n +0000654883 00000 n +0000658435 00000 n +0000658649 00000 n +0000658844 00000 n +0000655077 00000 n +0000655899 00000 n +0000648084 00000 n +0000646354 00000 n +0000655251 00000 n +0000655310 00000 n +0000655369 00000 n +0000655428 00000 n +0000655487 00000 n +0000655546 00000 n +0000655605 00000 n +0000655664 00000 n +0000655722 00000 n +0000655781 00000 n +0000655840 00000 n +0000726292 00000 n +0000726410 00000 n +0000726528 00000 n +0000729283 00000 n +0000729406 00000 n +0000729524 00000 n +0000659037 00000 n +0000659251 00000 n +0000659447 00000 n +0000659661 00000 n +0000659857 00000 n +0000660049 00000 n +0000660263 00000 n +0000660450 00000 n +0000660654 00000 n +0000660868 00000 n +0000661062 00000 n +0000661266 00000 n +0000661480 00000 n +0000661668 00000 n +0000661872 00000 n +0000662086 00000 n +0000662268 00000 n +0000662472 00000 n +0000662686 00000 n +0000662891 00000 n +0000663094 00000 n +0000663275 00000 n +0000663489 00000 n +0000663670 00000 n +0000663882 00000 n +0000664063 00000 n +0000664267 00000 n +0000664480 00000 n +0000664683 00000 n +0000664896 00000 n +0000665085 00000 n +0000665299 00000 n +0000665511 00000 n +0000665725 00000 n +0000669106 00000 n +0000669320 00000 n +0000665939 00000 n +0000666643 00000 n +0000657958 00000 n +0000656066 00000 n +0000666113 00000 n +0000666172 00000 n +0000666230 00000 n +0000666289 00000 n +0000666348 00000 n +0000666407 00000 n +0000666466 00000 n +0000666525 00000 n +0000666584 00000 n +0000729641 00000 n +0000732459 00000 n +0000732577 00000 n +0000732695 00000 n +0000732813 00000 n +0000732936 00000 n +0000733059 00000 n +0000735654 00000 n +0000669533 00000 n +0000669747 00000 n +0000669933 00000 n +0000670130 00000 n +0000670343 00000 n +0000670530 00000 n +0000670726 00000 n +0000670938 00000 n +0000671124 00000 n +0000671321 00000 n +0000671534 00000 n +0000671720 00000 n +0000671934 00000 n +0000672130 00000 n +0000672344 00000 n +0000672539 00000 n +0000672752 00000 n +0000672948 00000 n +0000673152 00000 n +0000673356 00000 n +0000673568 00000 n +0000673763 00000 n +0000673966 00000 n +0000674169 00000 n +0000674356 00000 n +0000674570 00000 n +0000674766 00000 n +0000674969 00000 n +0000675172 00000 n +0000675386 00000 n +0000675582 00000 n +0000675785 00000 n +0000675988 00000 n +0000676175 00000 n +0000676389 00000 n +0000676570 00000 n +0000676784 00000 n +0000676964 00000 n +0000677178 00000 n +0000677359 00000 n +0000680237 00000 n +0000680449 00000 n +0000677573 00000 n +0000677983 00000 n +0000668584 00000 n +0000666810 00000 n +0000677747 00000 n +0000677806 00000 n +0000677865 00000 n +0000677924 00000 n +0000735836 00000 n +0000735954 00000 n +0000736072 00000 n +0000736190 00000 n +0000736308 00000 n +0000738744 00000 n +0000738861 00000 n +0000738979 00000 n +0000741686 00000 n +0000741809 00000 n +0000741932 00000 n +0000744412 00000 n +0000744530 00000 n +0000680637 00000 n +0000680849 00000 n +0000681045 00000 n +0000681257 00000 n +0000681453 00000 n +0000681663 00000 n +0000681849 00000 n +0000682061 00000 n +0000682256 00000 n +0000682468 00000 n +0000682664 00000 n +0000682876 00000 n +0000683064 00000 n +0000683275 00000 n +0000683471 00000 n +0000683681 00000 n +0000683868 00000 n +0000684080 00000 n +0000684276 00000 n +0000684488 00000 n +0000684676 00000 n +0000684888 00000 n +0000685084 00000 n +0000685296 00000 n +0000685482 00000 n +0000685646 00000 n +0000685858 00000 n +0000686050 00000 n +0000686215 00000 n +0000686426 00000 n +0000686606 00000 n +0000686818 00000 n +0000686997 00000 n +0000687210 00000 n +0000691188 00000 n +0000691400 00000 n +0000687388 00000 n +0000687621 00000 n +0000679769 00000 n +0000678122 00000 n +0000687562 00000 n +0000744648 00000 n +0000744766 00000 n +0000744884 00000 n +0000747202 00000 n +0000747320 00000 n +0000747438 00000 n +0000749523 00000 n +0000749641 00000 n +0000749759 00000 n +0000749877 00000 n +0000752207 00000 n +0000752324 00000 n +0000752442 00000 n +0000752560 00000 n +0000755325 00000 n +0000755443 00000 n +0000755561 00000 n +0000691581 00000 n +0000691795 00000 n +0000691976 00000 n +0000692155 00000 n +0000692369 00000 n +0000692555 00000 n +0000692751 00000 n +0000692929 00000 n +0000693142 00000 n +0000693327 00000 n +0000693522 00000 n +0000693701 00000 n +0000693915 00000 n +0000694101 00000 n +0000694305 00000 n +0000694501 00000 n +0000694678 00000 n +0000694892 00000 n +0000695078 00000 n +0000695282 00000 n +0000695674 00000 n +0000695850 00000 n +0000696064 00000 n +0000696260 00000 n +0000696464 00000 n +0000696660 00000 n +0000696837 00000 n +0000697051 00000 n +0000697247 00000 n +0000697451 00000 n +0000697647 00000 n +0000697823 00000 n +0000698037 00000 n +0000698222 00000 n +0000698418 00000 n +0000698810 00000 n +0000698997 00000 n +0000699211 00000 n +0000699397 00000 n +0000699593 00000 n +0000699984 00000 n +0000700171 00000 n +0000700381 00000 n +0000700561 00000 n +0000700730 00000 n +0000704094 00000 n +0000704306 00000 n +0000704487 00000 n +0000700942 00000 n +0000701234 00000 n +0000690594 00000 n +0000687760 00000 n +0000701116 00000 n +0000695478 00000 n +0000698614 00000 n +0000699789 00000 n +0000701175 00000 n +0000755678 00000 n +0000755796 00000 n +0000759528 00000 n +0000759646 00000 n +0000759764 00000 n +0000762758 00000 n +0000762874 00000 n +0000762992 00000 n +0000766620 00000 n +0000766738 00000 n +0000770367 00000 n +0000704654 00000 n +0000704866 00000 n +0000705047 00000 n +0000705213 00000 n +0000705424 00000 n +0000705605 00000 n +0000705819 00000 n +0000706000 00000 n +0000706196 00000 n +0000706363 00000 n +0000706575 00000 n +0000706756 00000 n +0000707090 00000 n +0000707302 00000 n +0000707506 00000 n +0000707717 00000 n +0000707919 00000 n +0000708131 00000 n +0000708310 00000 n +0000708521 00000 n +0000708713 00000 n +0000708925 00000 n +0000709129 00000 n +0000709341 00000 n +0000709532 00000 n +0000709743 00000 n +0000709928 00000 n +0000710131 00000 n +0000710342 00000 n +0000710534 00000 n +0000710720 00000 n +0000710924 00000 n +0000711138 00000 n +0000714054 00000 n +0000714268 00000 n +0000711317 00000 n +0000711727 00000 n +0000703617 00000 n +0000701428 00000 n +0000711491 00000 n +0000711550 00000 n +0000706923 00000 n +0000711609 00000 n +0000711668 00000 n +0002866193 00000 n +0000770485 00000 n +0000770603 00000 n +0000770721 00000 n +0000774353 00000 n +0000774471 00000 n +0000774586 00000 n +0000778578 00000 n +0000778695 00000 n +0000778818 00000 n +0000778936 00000 n +0000783077 00000 n +0000783199 00000 n +0000714482 00000 n +0000714695 00000 n +0000714876 00000 n +0000715057 00000 n +0000715271 00000 n +0000715452 00000 n +0000715633 00000 n +0000715846 00000 n +0000716026 00000 n +0000716239 00000 n +0000716431 00000 n +0000716611 00000 n +0000716790 00000 n +0000716994 00000 n +0000717207 00000 n +0000717399 00000 n +0000717578 00000 n +0000717756 00000 n +0000717959 00000 n +0000718170 00000 n +0000718361 00000 n +0000718541 00000 n +0000718720 00000 n +0000718924 00000 n +0000719137 00000 n +0000719330 00000 n +0000719509 00000 n +0000719687 00000 n +0000719890 00000 n +0000720104 00000 n +0000720297 00000 n +0000720475 00000 n +0000720652 00000 n +0000724182 00000 n +0000724396 00000 n +0000724589 00000 n +0000724769 00000 n +0000724948 00000 n +0000720854 00000 n +0000721323 00000 n +0000713595 00000 n +0000711893 00000 n +0000721028 00000 n +0000721087 00000 n +0000721146 00000 n +0000721205 00000 n +0000721264 00000 n +0000790993 00000 n +0000791111 00000 n +0000791234 00000 n +0000791357 00000 n +0000791475 00000 n +0000794088 00000 n +0000794211 00000 n +0000794334 00000 n +0000725152 00000 n +0000725331 00000 n +0000725512 00000 n +0000725691 00000 n +0000725882 00000 n +0000726591 00000 n +0000723957 00000 n +0000721462 00000 n +0000726056 00000 n +0000726115 00000 n +0000726174 00000 n +0000726233 00000 n +0000726351 00000 n +0000726469 00000 n +0000801675 00000 n +0000728677 00000 n +0000728834 00000 n +0000728991 00000 n +0000729759 00000 n +0000728515 00000 n +0000726771 00000 n +0000729165 00000 n +0000729224 00000 n +0000729347 00000 n +0000729465 00000 n +0000729582 00000 n +0000729700 00000 n +0000732226 00000 n +0000733122 00000 n +0000732082 00000 n +0000729885 00000 n +0000732400 00000 n +0000732518 00000 n +0000732636 00000 n +0000732754 00000 n +0000732877 00000 n +0000733000 00000 n +0000735362 00000 n +0000736366 00000 n +0000735218 00000 n +0000733248 00000 n +0000735536 00000 n +0000735595 00000 n +0000735718 00000 n +0000735777 00000 n +0000735895 00000 n +0000736013 00000 n +0000736131 00000 n +0000736249 00000 n +0000738452 00000 n +0000739102 00000 n +0000738308 00000 n +0000736505 00000 n +0000738626 00000 n +0000738685 00000 n +0000738803 00000 n +0000738920 00000 n +0000739043 00000 n +0002866319 00000 n +0000741453 00000 n +0000741995 00000 n +0000741309 00000 n +0000739241 00000 n +0000741627 00000 n +0000741750 00000 n +0000741873 00000 n +0000743939 00000 n +0000744120 00000 n +0000744942 00000 n +0000743786 00000 n +0000742134 00000 n +0000744294 00000 n +0000744353 00000 n +0000744471 00000 n +0000744589 00000 n +0000744707 00000 n +0000744825 00000 n +0000746910 00000 n +0000747556 00000 n +0000746766 00000 n +0000745081 00000 n +0000747084 00000 n +0000747143 00000 n +0000747261 00000 n +0000747379 00000 n +0000747497 00000 n +0000749290 00000 n +0000749936 00000 n +0000749146 00000 n +0000747695 00000 n +0000749464 00000 n +0000749582 00000 n +0000749700 00000 n +0000749818 00000 n +0000751752 00000 n +0000754682 00000 n +0000751915 00000 n +0000752617 00000 n +0000751599 00000 n +0000750075 00000 n +0000752089 00000 n +0000752148 00000 n +0000752266 00000 n +0000752383 00000 n +0000752501 00000 n +0000754847 00000 n +0000758525 00000 n +0000755033 00000 n +0000755854 00000 n +0000754520 00000 n +0000752756 00000 n +0000755207 00000 n +0000755266 00000 n +0000755384 00000 n +0000755502 00000 n +0000755619 00000 n +0000755737 00000 n +0002866445 00000 n +0000758704 00000 n +0000758881 00000 n +0000759060 00000 n +0000759236 00000 n +0000759881 00000 n +0000758345 00000 n +0000755993 00000 n +0000759410 00000 n +0000759469 00000 n +0000759587 00000 n +0000759705 00000 n +0000759822 00000 n +0000762171 00000 n +0000762348 00000 n +0000765778 00000 n +0000762525 00000 n +0000763051 00000 n +0000762009 00000 n +0000760057 00000 n +0000762699 00000 n +0000762816 00000 n +0000762933 00000 n +0000765955 00000 n +0000766142 00000 n +0000766328 00000 n +0000766855 00000 n +0000765607 00000 n +0000763227 00000 n +0000766502 00000 n +0000766561 00000 n +0000766679 00000 n +0000766797 00000 n +0000769299 00000 n +0000769468 00000 n +0000769634 00000 n +0000769802 00000 n +0000769968 00000 n +0000770134 00000 n +0000770839 00000 n +0000769110 00000 n +0000767031 00000 n +0000770308 00000 n +0000770426 00000 n +0000770544 00000 n +0000770662 00000 n +0000770780 00000 n +0000773605 00000 n +0000773773 00000 n +0000773939 00000 n +0000774120 00000 n +0000774645 00000 n +0000773434 00000 n +0000770991 00000 n +0000774294 00000 n +0000774412 00000 n +0000774528 00000 n +0000777914 00000 n +0000778100 00000 n +0000778286 00000 n +0000778994 00000 n +0000777752 00000 n +0000774861 00000 n +0000778460 00000 n +0000778519 00000 n +0000778636 00000 n +0000778759 00000 n +0000778877 00000 n +0002866571 00000 n +0000782020 00000 n +0000782211 00000 n +0000782401 00000 n +0000782615 00000 n +0000786534 00000 n +0000786719 00000 n +0000782785 00000 n +0000783321 00000 n +0000781840 00000 n +0000779195 00000 n +0000782959 00000 n +0000783018 00000 n +0000783141 00000 n +0000783262 00000 n +0000786905 00000 n +0000787074 00000 n +0000787786 00000 n +0000786363 00000 n +0000783472 00000 n +0000787248 00000 n +0000787371 00000 n +0000787489 00000 n +0000787606 00000 n +0000787727 00000 n +0000790701 00000 n +0000791598 00000 n +0000790557 00000 n +0000787937 00000 n +0000790875 00000 n +0000790934 00000 n +0000791052 00000 n +0000791175 00000 n +0000791298 00000 n +0000791416 00000 n +0000791539 00000 n +0000793855 00000 n +0000794457 00000 n +0000793711 00000 n +0000791737 00000 n +0000794029 00000 n +0000794152 00000 n +0000794275 00000 n +0000794398 00000 n +0000796928 00000 n +0000797115 00000 n +0000797338 00000 n +0000797542 00000 n +0000797746 00000 n +0000797969 00000 n +0000798165 00000 n +0000798388 00000 n +0000798584 00000 n +0000798777 00000 n +0000799000 00000 n +0000799195 00000 n +0000799418 00000 n +0000799613 00000 n +0000799806 00000 n +0000800025 00000 n +0000800217 00000 n +0000800439 00000 n +0000800634 00000 n +0000800825 00000 n +0000801047 00000 n +0000801239 00000 n +0000801442 00000 n +0000801972 00000 n +0000796586 00000 n +0000794596 00000 n +0000801616 00000 n +0000801738 00000 n +0000801913 00000 n +0000813498 00000 n +0000813616 00000 n +0000813739 00000 n +0000813857 00000 n +0000815845 00000 n +0000815962 00000 n +0000816080 00000 n +0000816197 00000 n +0000804462 00000 n +0000804685 00000 n +0000804866 00000 n +0000805052 00000 n +0000805256 00000 n +0000805479 00000 n +0000805666 00000 n +0000805870 00000 n +0000806093 00000 n +0000806287 00000 n +0000806490 00000 n +0000806713 00000 n +0000806895 00000 n +0000807099 00000 n +0000807322 00000 n +0000807512 00000 n +0000807715 00000 n +0000807905 00000 n +0000808129 00000 n +0000808319 00000 n +0000808509 00000 n +0000808733 00000 n +0000808925 00000 n +0000809148 00000 n +0000809371 00000 n +0000809561 00000 n +0000809785 00000 n +0000809976 00000 n +0000813013 00000 n +0000810167 00000 n +0000810695 00000 n +0000804066 00000 n +0000802124 00000 n +0000810341 00000 n +0000810400 00000 n +0000810459 00000 n +0000810518 00000 n +0000810577 00000 n +0000810636 00000 n +0002866697 00000 n +0000818510 00000 n +0000818627 00000 n +0000818744 00000 n +0000818862 00000 n +0000821989 00000 n +0000822163 00000 n +0000813206 00000 n +0000813915 00000 n +0000812860 00000 n +0000810887 00000 n +0000813380 00000 n +0000813439 00000 n +0000813557 00000 n +0000813680 00000 n +0000813798 00000 n +0000815553 00000 n +0000816255 00000 n +0000815409 00000 n +0000814028 00000 n +0000815727 00000 n +0000815786 00000 n +0000815903 00000 n +0000816021 00000 n +0000816139 00000 n +0000818218 00000 n +0000818920 00000 n +0000818074 00000 n +0000816368 00000 n +0000818392 00000 n +0000818451 00000 n +0000818569 00000 n +0000818685 00000 n +0000818803 00000 n +0000821044 00000 n +0000821270 00000 n +0000821472 00000 n +0000824218 00000 n +0000824444 00000 n +0000824670 00000 n +0000821697 00000 n +0000822514 00000 n +0000820873 00000 n +0000819046 00000 n +0000821871 00000 n +0000821930 00000 n +0000822046 00000 n +0000822104 00000 n +0000822221 00000 n +0000822396 00000 n +0000822455 00000 n +0000903334 00000 n +0000824863 00000 n +0000825088 00000 n +0000825280 00000 n +0000825483 00000 n +0000825675 00000 n +0000825901 00000 n +0000826105 00000 n +0000826331 00000 n +0000826535 00000 n +0000826761 00000 n +0000826964 00000 n +0000827190 00000 n +0000827394 00000 n +0000827619 00000 n +0000827822 00000 n +0000828048 00000 n +0000828252 00000 n +0000828478 00000 n +0000828682 00000 n +0000828907 00000 n +0000829110 00000 n +0000829336 00000 n +0000829540 00000 n +0000829766 00000 n +0000829969 00000 n +0000830195 00000 n +0000830398 00000 n +0000830624 00000 n +0000830828 00000 n +0000831053 00000 n +0000831256 00000 n +0000831482 00000 n +0000831686 00000 n +0000831910 00000 n +0000835085 00000 n +0000835311 00000 n +0000835515 00000 n +0000835741 00000 n +0000832112 00000 n +0000833405 00000 n +0000823741 00000 n +0000822694 00000 n +0000832286 00000 n +0000832345 00000 n +0000832404 00000 n +0000832463 00000 n +0000832522 00000 n +0000832581 00000 n +0000832639 00000 n +0000832698 00000 n +0000832757 00000 n +0000832816 00000 n +0000832875 00000 n +0000832934 00000 n +0000832993 00000 n +0000833052 00000 n +0000833110 00000 n +0000833169 00000 n +0000833228 00000 n +0000833287 00000 n +0000833346 00000 n +0000835945 00000 n +0000836170 00000 n +0000836362 00000 n +0000836553 00000 n +0000836779 00000 n +0000837004 00000 n +0000837230 00000 n +0000837455 00000 n +0000837681 00000 n +0000837906 00000 n +0000838132 00000 n +0000838357 00000 n +0000838583 00000 n +0000838808 00000 n +0000839034 00000 n +0000839259 00000 n +0000842676 00000 n +0000842902 00000 n +0000839485 00000 n +0000840658 00000 n +0000834761 00000 n +0000833544 00000 n +0000839659 00000 n +0000839718 00000 n +0000839777 00000 n +0000839836 00000 n +0000839895 00000 n +0000839954 00000 n +0000840012 00000 n +0000840071 00000 n +0000840129 00000 n +0000840188 00000 n +0000840246 00000 n +0000840305 00000 n +0000840363 00000 n +0000840422 00000 n +0000840481 00000 n +0000840540 00000 n +0000840599 00000 n +0002866823 00000 n +0000843128 00000 n +0000843353 00000 n +0000843579 00000 n +0000843804 00000 n +0000844030 00000 n +0000844256 00000 n +0000844449 00000 n +0000844675 00000 n +0000844868 00000 n +0000845061 00000 n +0000845287 00000 n +0000845479 00000 n +0000845703 00000 n +0000845895 00000 n +0000846088 00000 n +0000846313 00000 n +0000846515 00000 n +0000846708 00000 n +0000846932 00000 n +0000847124 00000 n +0000847348 00000 n +0000847540 00000 n +0000847731 00000 n +0000850922 00000 n +0000851124 00000 n +0000851317 00000 n +0000847954 00000 n +0000849013 00000 n +0000842307 00000 n +0000840810 00000 n +0000848128 00000 n +0000848187 00000 n +0000848246 00000 n +0000848305 00000 n +0000848364 00000 n +0000848423 00000 n +0000848482 00000 n +0000848541 00000 n +0000848600 00000 n +0000848659 00000 n +0000848718 00000 n +0000848777 00000 n +0000848836 00000 n +0000848895 00000 n +0000848954 00000 n +0000851542 00000 n +0000851735 00000 n +0000851961 00000 n +0000852153 00000 n +0000852346 00000 n +0000852572 00000 n +0000852774 00000 n +0000852967 00000 n +0000853193 00000 n +0000853386 00000 n +0000853612 00000 n +0000853805 00000 n +0000853998 00000 n +0000854224 00000 n +0000854426 00000 n +0000854619 00000 n +0000854844 00000 n +0000855037 00000 n +0000855262 00000 n +0000855455 00000 n +0000855648 00000 n +0000855873 00000 n +0000856075 00000 n +0000856268 00000 n +0000856491 00000 n +0000856684 00000 n +0000856909 00000 n +0000857101 00000 n +0000857326 00000 n +0000857519 00000 n +0000857745 00000 n +0000857938 00000 n +0000858164 00000 n +0000859222 00000 n +0000850463 00000 n +0000849165 00000 n +0000858338 00000 n +0000858397 00000 n +0000858456 00000 n +0000858515 00000 n +0000858574 00000 n +0000858632 00000 n +0000858691 00000 n +0000858750 00000 n +0000858809 00000 n +0000858868 00000 n +0000858927 00000 n +0000858986 00000 n +0000859045 00000 n +0000859104 00000 n +0000859163 00000 n +0000861704 00000 n +0000861906 00000 n +0000862132 00000 n +0000862334 00000 n +0000862560 00000 n +0000862760 00000 n +0000862984 00000 n +0000863186 00000 n +0000863412 00000 n +0000863614 00000 n +0000863839 00000 n +0000864040 00000 n +0000864242 00000 n +0000864467 00000 n +0000864671 00000 n +0000864873 00000 n +0000865076 00000 n +0000865301 00000 n +0000865504 00000 n +0000865705 00000 n +0000865909 00000 n +0000866134 00000 n +0000866337 00000 n +0000866538 00000 n +0000866742 00000 n +0000866967 00000 n +0000867169 00000 n +0000867395 00000 n +0000867588 00000 n +0000867781 00000 n +0000868007 00000 n +0000868200 00000 n +0000868425 00000 n +0000868618 00000 n +0000868844 00000 n +0000869037 00000 n +0000869241 00000 n +0000869465 00000 n +0000869658 00000 n +0000869851 00000 n +0000870077 00000 n +0000872774 00000 n +0000872967 00000 n +0000873193 00000 n +0000870270 00000 n +0000870562 00000 n +0000861191 00000 n +0000859374 00000 n +0000870444 00000 n +0000870503 00000 n +0000903511 00000 n +0000903629 00000 n +0000903746 00000 n +0000903864 00000 n +0000903982 00000 n +0000904100 00000 n +0000904218 00000 n +0000904336 00000 n +0000904454 00000 n +0000926748 00000 n +0000926866 00000 n +0000904572 00000 n +0000906761 00000 n +0000906879 00000 n +0000873386 00000 n +0000873610 00000 n +0000873803 00000 n +0000874029 00000 n +0000874222 00000 n +0000874415 00000 n +0000874639 00000 n +0000874832 00000 n +0000875058 00000 n +0000875251 00000 n +0000875444 00000 n +0000875668 00000 n +0000875861 00000 n +0000876084 00000 n +0000876275 00000 n +0000876466 00000 n +0000876690 00000 n +0000876883 00000 n +0000877107 00000 n +0000877298 00000 n +0000877489 00000 n +0000877712 00000 n +0000877905 00000 n +0000878131 00000 n +0000878323 00000 n +0000878515 00000 n +0000878741 00000 n +0000878934 00000 n +0000879127 00000 n +0000882536 00000 n +0000882762 00000 n +0000882954 00000 n +0000883147 00000 n +0000879320 00000 n +0000879553 00000 n +0000872342 00000 n +0000870714 00000 n +0000879494 00000 n +0000906997 00000 n +0000907114 00000 n +0000907232 00000 n +0000907350 00000 n +0000907468 00000 n +0000907586 00000 n +0000907703 00000 n +0000907821 00000 n +0000910109 00000 n +0000910227 00000 n +0000910345 00000 n +0000910462 00000 n +0000883340 00000 n +0000883566 00000 n +0000883759 00000 n +0000883952 00000 n +0000884145 00000 n +0000884371 00000 n +0000884564 00000 n +0000884757 00000 n +0000884950 00000 n +0000885143 00000 n +0000885529 00000 n +0000885755 00000 n +0000885948 00000 n +0000886141 00000 n +0000886334 00000 n +0000886559 00000 n +0000886752 00000 n +0000886943 00000 n +0000887136 00000 n +0000887362 00000 n +0000887555 00000 n +0000887748 00000 n +0000887950 00000 n +0000888152 00000 n +0000888341 00000 n +0000888531 00000 n +0000888756 00000 n +0000888958 00000 n +0000889160 00000 n +0000889349 00000 n +0000889538 00000 n +0000889764 00000 n +0000889964 00000 n +0000890164 00000 n +0000890352 00000 n +0000890541 00000 n +0000890765 00000 n +0000890967 00000 n +0000891169 00000 n +0000891356 00000 n +0000891544 00000 n +0000891768 00000 n +0000892001 00000 n +0000881978 00000 n +0000879706 00000 n +0000891942 00000 n +0000885336 00000 n +0000910580 00000 n +0000910698 00000 n +0000910816 00000 n +0000910934 00000 n +0000911052 00000 n +0000913488 00000 n +0000913611 00000 n +0000913729 00000 n +0000913847 00000 n +0000913965 00000 n +0000894860 00000 n +0000895062 00000 n +0000895264 00000 n +0000895452 00000 n +0000895641 00000 n +0000895865 00000 n +0000896067 00000 n +0000896269 00000 n +0000896458 00000 n +0000896648 00000 n +0000896874 00000 n +0000897075 00000 n +0000897300 00000 n +0000897502 00000 n +0000897703 00000 n +0000897928 00000 n +0000898129 00000 n +0000898333 00000 n +0000898559 00000 n +0000898762 00000 n +0000898988 00000 n +0000899181 00000 n +0000899383 00000 n +0000899586 00000 n +0000899812 00000 n +0000900016 00000 n +0000900242 00000 n +0000900435 00000 n +0000900785 00000 n +0000894473 00000 n +0000892167 00000 n +0000900609 00000 n +0000900668 00000 n +0000900726 00000 n +0002866949 00000 n +0000914083 00000 n +0000914201 00000 n +0000914319 00000 n +0000914437 00000 n +0000918095 00000 n +0000918213 00000 n +0000918331 00000 n +0000921460 00000 n +0000903042 00000 n +0000904631 00000 n +0000902898 00000 n +0000900965 00000 n +0000903216 00000 n +0000903275 00000 n +0000903393 00000 n +0000903452 00000 n +0000903570 00000 n +0000903687 00000 n +0000903805 00000 n +0000903923 00000 n +0000904041 00000 n +0000904159 00000 n +0000904277 00000 n +0000904395 00000 n +0000904513 00000 n +0000906469 00000 n +0000907880 00000 n +0000906325 00000 n +0000904770 00000 n +0000906643 00000 n +0000906702 00000 n +0000906820 00000 n +0000906938 00000 n +0000907056 00000 n +0000907173 00000 n +0000907291 00000 n +0000907409 00000 n +0000907527 00000 n +0000907644 00000 n +0000907762 00000 n +0000909817 00000 n +0000911110 00000 n +0000909673 00000 n +0000908006 00000 n +0000909991 00000 n +0000910050 00000 n +0000910168 00000 n +0000910286 00000 n +0000910404 00000 n +0000910521 00000 n +0000910639 00000 n +0000910757 00000 n +0000910875 00000 n +0000910993 00000 n +0000913196 00000 n +0000914495 00000 n +0000913052 00000 n +0000911249 00000 n +0000913370 00000 n +0000913429 00000 n +0000913552 00000 n +0000913670 00000 n +0000913788 00000 n +0000913906 00000 n +0000914024 00000 n +0000914142 00000 n +0000914260 00000 n +0000914378 00000 n +0000917803 00000 n +0000918449 00000 n +0000917659 00000 n +0000914646 00000 n +0000917977 00000 n +0000918036 00000 n +0000918154 00000 n +0000918272 00000 n +0000918390 00000 n +0000921227 00000 n +0000921518 00000 n +0000921083 00000 n +0000918625 00000 n +0000921401 00000 n +0002867075 00000 n +0000923655 00000 n +0000923875 00000 n +0000924063 00000 n +0000924283 00000 n +0000924471 00000 n +0000924691 00000 n +0000924878 00000 n +0000925099 00000 n +0000925287 00000 n +0000925490 00000 n +0000925711 00000 n +0000925932 00000 n +0000926118 00000 n +0000929557 00000 n +0000926338 00000 n +0000927454 00000 n +0000923394 00000 n +0000921681 00000 n +0000926512 00000 n +0000926571 00000 n +0000926689 00000 n +0000926807 00000 n +0000926925 00000 n +0000927101 00000 n +0000927160 00000 n +0000927219 00000 n +0000927277 00000 n +0000927336 00000 n +0000927395 00000 n +0000953216 00000 n +0000955864 00000 n +0000929778 00000 n +0000929965 00000 n +0000930186 00000 n +0000930407 00000 n +0000930628 00000 n +0000930849 00000 n +0000931070 00000 n +0000931290 00000 n +0000931492 00000 n +0000931679 00000 n +0000931882 00000 n +0000932103 00000 n +0000932306 00000 n +0000932527 00000 n +0000932748 00000 n +0000932969 00000 n +0000933190 00000 n +0000933411 00000 n +0000933630 00000 n +0000933834 00000 n +0000934055 00000 n +0000934243 00000 n +0000937494 00000 n +0000934463 00000 n +0000935401 00000 n +0000929206 00000 n +0000927620 00000 n +0000934637 00000 n +0000934696 00000 n +0000934755 00000 n +0000934813 00000 n +0000934872 00000 n +0000934931 00000 n +0000934990 00000 n +0000935049 00000 n +0000935108 00000 n +0000935167 00000 n +0000935224 00000 n +0000935283 00000 n +0000935342 00000 n +0000955982 00000 n +0000956100 00000 n +0000956223 00000 n +0000956341 00000 n +0000956459 00000 n +0000937715 00000 n +0000937903 00000 n +0000938124 00000 n +0000938312 00000 n +0000938533 00000 n +0000938720 00000 n +0000938940 00000 n +0000939135 00000 n +0000939330 00000 n +0000939517 00000 n +0000939737 00000 n +0000939932 00000 n +0000940120 00000 n +0000940341 00000 n +0000940537 00000 n +0000940758 00000 n +0000940979 00000 n +0000941198 00000 n +0000941385 00000 n +0000941605 00000 n +0000941793 00000 n +0000941980 00000 n +0000942200 00000 n +0000942388 00000 n +0000942608 00000 n +0000942796 00000 n +0000942984 00000 n +0000943205 00000 n +0000943393 00000 n +0000943581 00000 n +0000944286 00000 n +0000937080 00000 n +0000935541 00000 n +0000943755 00000 n +0000943814 00000 n +0000943873 00000 n +0000943932 00000 n +0000943991 00000 n +0000944050 00000 n +0000944109 00000 n +0000944168 00000 n +0000944227 00000 n +0000956582 00000 n +0000959121 00000 n +0000959244 00000 n +0000959426 00000 n +0000959544 00000 n +0000959667 00000 n +0000959785 00000 n +0000947200 00000 n +0000947421 00000 n +0000947609 00000 n +0000947796 00000 n +0000948016 00000 n +0000948212 00000 n +0000948408 00000 n +0000948595 00000 n +0000948815 00000 n +0000949011 00000 n +0000949232 00000 n +0000949420 00000 n +0000949608 00000 n +0000949793 00000 n +0000950144 00000 n +0000946939 00000 n +0000944426 00000 n +0000949967 00000 n +0000950026 00000 n +0000950085 00000 n +0000959903 00000 n +0000960021 00000 n +0000960139 00000 n +0000965489 00000 n +0000952924 00000 n +0000953334 00000 n +0000952780 00000 n +0000950372 00000 n +0000953098 00000 n +0000953157 00000 n +0000953275 00000 n +0000955572 00000 n +0000956646 00000 n +0000955428 00000 n +0000953510 00000 n +0000955746 00000 n +0000955805 00000 n +0000955923 00000 n +0000956041 00000 n +0000956164 00000 n +0000956282 00000 n +0000956400 00000 n +0000956523 00000 n +0002867201 00000 n +0000958829 00000 n +0000960197 00000 n +0000958685 00000 n +0000956847 00000 n +0000959003 00000 n +0000959062 00000 n +0000959185 00000 n +0000959308 00000 n +0000959367 00000 n +0000959485 00000 n +0000959608 00000 n +0000959726 00000 n +0000959844 00000 n +0000959962 00000 n +0000960080 00000 n +0000962236 00000 n +0000962451 00000 n +0000962679 00000 n +0000962907 00000 n +0000963093 00000 n +0000963320 00000 n +0000963505 00000 n +0000963733 00000 n +0000963927 00000 n +0000964155 00000 n +0000964349 00000 n +0000964577 00000 n +0000964772 00000 n +0000965001 00000 n +0000968535 00000 n +0000968738 00000 n +0000965197 00000 n +0000966194 00000 n +0000961966 00000 n +0000960347 00000 n +0000965371 00000 n +0000965430 00000 n +0000965548 00000 n +0000965723 00000 n +0000965782 00000 n +0000965841 00000 n +0000965900 00000 n +0000965958 00000 n +0000966017 00000 n +0000966076 00000 n +0000966135 00000 n +0000989901 00000 n +0000968967 00000 n +0000969196 00000 n +0000969392 00000 n +0000969620 00000 n +0000969849 00000 n +0000970078 00000 n +0000970266 00000 n +0000970495 00000 n +0000970683 00000 n +0000970912 00000 n +0000971108 00000 n +0000971337 00000 n +0000971533 00000 n +0000971762 00000 n +0000971991 00000 n +0000972206 00000 n +0000972420 00000 n +0000972649 00000 n +0000972864 00000 n +0000973093 00000 n +0000973322 00000 n +0000973551 00000 n +0000973780 00000 n +0000974009 00000 n +0000977187 00000 n +0000977390 00000 n +0000974238 00000 n +0000975238 00000 n +0000968157 00000 n +0000966400 00000 n +0000974412 00000 n +0000974471 00000 n +0000974530 00000 n +0000974589 00000 n +0000974648 00000 n +0000974707 00000 n +0000974766 00000 n +0000974825 00000 n +0000974884 00000 n +0000974943 00000 n +0000975002 00000 n +0000975061 00000 n +0000975120 00000 n +0000975179 00000 n +0000990078 00000 n +0000990196 00000 n +0000990319 00000 n +0000977619 00000 n +0000977821 00000 n +0000978049 00000 n +0000978252 00000 n +0000978481 00000 n +0000978684 00000 n +0000978913 00000 n +0000979142 00000 n +0000979338 00000 n +0000979567 00000 n +0000979771 00000 n +0000979975 00000 n +0000980204 00000 n +0000980400 00000 n +0000980629 00000 n +0000980858 00000 n +0000981054 00000 n +0000981283 00000 n +0000981503 00000 n +0000981732 00000 n +0000981925 00000 n +0000982154 00000 n +0000985703 00000 n +0000985932 00000 n +0000986127 00000 n +0000982350 00000 n +0000983348 00000 n +0000976827 00000 n +0000975378 00000 n +0000982524 00000 n +0000982583 00000 n +0000982642 00000 n +0000982699 00000 n +0000982758 00000 n +0000982817 00000 n +0000982876 00000 n +0000982935 00000 n +0000982994 00000 n +0000983053 00000 n +0000983112 00000 n +0000983171 00000 n +0000983230 00000 n +0000983289 00000 n +0000990437 00000 n +0000995150 00000 n +0000986517 00000 n +0000986711 00000 n +0000986899 00000 n +0000987191 00000 n +0000985505 00000 n +0000983487 00000 n +0000987073 00000 n +0000986323 00000 n +0000987132 00000 n +0000995268 00000 n +0000989609 00000 n +0000990560 00000 n +0000989465 00000 n +0000987353 00000 n +0000989783 00000 n +0000989842 00000 n +0000989960 00000 n +0000990019 00000 n +0000990137 00000 n +0000990260 00000 n +0000990378 00000 n +0000990501 00000 n +0002867327 00000 n +0000992505 00000 n +0000992752 00000 n +0000992999 00000 n +0000993246 00000 n +0000993493 00000 n +0000993680 00000 n +0000993927 00000 n +0000994115 00000 n +0000994363 00000 n +0000994611 00000 n +0000998053 00000 n +0000994858 00000 n +0000996038 00000 n +0000992271 00000 n +0000990748 00000 n +0000995032 00000 n +0000995091 00000 n +0000995209 00000 n +0000995332 00000 n +0000995507 00000 n +0000995566 00000 n +0000995625 00000 n +0000995684 00000 n +0000995743 00000 n +0000995802 00000 n +0000995861 00000 n +0000995920 00000 n +0000995979 00000 n +0000998300 00000 n +0000998548 00000 n +0000998763 00000 n +0000998958 00000 n +0000999179 00000 n +0000999432 00000 n +0000999685 00000 n +0000999938 00000 n +0001000158 00000 n +0001000345 00000 n +0001000565 00000 n +0001000753 00000 n +0001003731 00000 n +0001003918 00000 n +0001004139 00000 n +0001000973 00000 n +0001001736 00000 n +0000997792 00000 n +0000996190 00000 n +0001001147 00000 n +0001001206 00000 n +0001001265 00000 n +0001001324 00000 n +0001001500 00000 n +0001001559 00000 n +0001001618 00000 n +0001001677 00000 n +0001040950 00000 n +0001041068 00000 n +0001041132 00000 n +0001041196 00000 n +0001043748 00000 n +0001004325 00000 n +0001004528 00000 n +0001004749 00000 n +0001004968 00000 n +0001005188 00000 n +0001005409 00000 n +0001005629 00000 n +0001005849 00000 n +0001006070 00000 n +0001006291 00000 n +0001006477 00000 n +0001006698 00000 n +0001006901 00000 n +0001007122 00000 n +0001007325 00000 n +0001007546 00000 n +0001007767 00000 n +0001007988 00000 n +0001008209 00000 n +0001008397 00000 n +0001008618 00000 n +0001008839 00000 n +0001012249 00000 n +0001012470 00000 n +0001009060 00000 n +0001010059 00000 n +0001003362 00000 n +0001001888 00000 n +0001009234 00000 n +0001009293 00000 n +0001009352 00000 n +0001009411 00000 n +0001009470 00000 n +0001009529 00000 n +0001009588 00000 n +0001009647 00000 n +0001009706 00000 n +0001009764 00000 n +0001009823 00000 n +0001009882 00000 n +0001009941 00000 n +0001010000 00000 n +0001043925 00000 n +0001044043 00000 n +0001044161 00000 n +0001044279 00000 n +0001012690 00000 n +0001012911 00000 n +0001013132 00000 n +0001013320 00000 n +0001013524 00000 n +0001013745 00000 n +0001013932 00000 n +0001014151 00000 n +0001014372 00000 n +0001014560 00000 n +0001014781 00000 n +0001014969 00000 n +0001015188 00000 n +0001015375 00000 n +0001015595 00000 n +0001015791 00000 n +0001015987 00000 n +0001016174 00000 n +0001016394 00000 n +0001016580 00000 n +0001016766 00000 n +0001016953 00000 n +0001017173 00000 n +0001017369 00000 n +0001017556 00000 n +0001017776 00000 n +0001017972 00000 n +0001018159 00000 n +0001018379 00000 n +0001018575 00000 n +0001018771 00000 n +0001018957 00000 n +0001019176 00000 n +0001019361 00000 n +0001022311 00000 n +0001022498 00000 n +0001022718 00000 n +0001019546 00000 n +0001020368 00000 n +0001011781 00000 n +0001010199 00000 n +0001019720 00000 n +0001019779 00000 n +0001019838 00000 n +0001019897 00000 n +0001019956 00000 n +0001020015 00000 n +0001020074 00000 n +0001020132 00000 n +0001020191 00000 n +0001020250 00000 n +0001020309 00000 n +0001046301 00000 n +0001046419 00000 n +0001046537 00000 n +0001046655 00000 n +0001046773 00000 n +0001046891 00000 n +0001022914 00000 n +0001023100 00000 n +0001023319 00000 n +0001023514 00000 n +0001023701 00000 n +0001023921 00000 n +0001024117 00000 n +0001024313 00000 n +0001024500 00000 n +0001024720 00000 n +0001024916 00000 n +0001025103 00000 n +0001025323 00000 n +0001025519 00000 n +0001025706 00000 n +0001025927 00000 n +0001026123 00000 n +0001026319 00000 n +0001026506 00000 n +0001026727 00000 n +0001026913 00000 n +0001027099 00000 n +0001027286 00000 n +0001027507 00000 n +0001027703 00000 n +0001027889 00000 n +0001028109 00000 n +0001028304 00000 n +0001028491 00000 n +0001028712 00000 n +0001028908 00000 n +0001029104 00000 n +0001029291 00000 n +0001029512 00000 n +0001029708 00000 n +0001029895 00000 n +0001030116 00000 n +0001030312 00000 n +0001030532 00000 n +0001030720 00000 n +0001030908 00000 n +0001031129 00000 n +0001031317 00000 n +0001031505 00000 n +0001031691 00000 n +0001031910 00000 n +0001032095 00000 n +0001035403 00000 n +0001035589 00000 n +0001035809 00000 n +0001035994 00000 n +0001032280 00000 n +0001032572 00000 n +0001021717 00000 n +0001020535 00000 n +0001032454 00000 n +0001032513 00000 n +0001047009 00000 n +0001047127 00000 n +0001047245 00000 n +0001047363 00000 n +0001047481 00000 n +0001049417 00000 n +0001049535 00000 n +0001049653 00000 n +0001049771 00000 n +0001049889 00000 n +0001050007 00000 n +0001050123 00000 n +0001050241 00000 n +0001050359 00000 n +0001050477 00000 n +0001036179 00000 n +0001036400 00000 n +0001036588 00000 n +0001036776 00000 n +0001036996 00000 n +0001037183 00000 n +0001037403 00000 n +0001037623 00000 n +0001037810 00000 n +0001038102 00000 n +0001035151 00000 n +0001032711 00000 n +0001037984 00000 n +0001038043 00000 n +0002867453 00000 n +0001050595 00000 n +0001054737 00000 n +0001054855 00000 n +0001054972 00000 n +0001040658 00000 n +0001041259 00000 n +0001040514 00000 n +0001038316 00000 n +0001040832 00000 n +0001040891 00000 n +0001041009 00000 n +0001043456 00000 n +0001044395 00000 n +0001043312 00000 n +0001041435 00000 n +0001043630 00000 n +0001043689 00000 n +0001043807 00000 n +0001043866 00000 n +0001043984 00000 n +0001044102 00000 n +0001044220 00000 n +0001044337 00000 n +0001046009 00000 n +0001047539 00000 n +0001045865 00000 n +0001044596 00000 n +0001046183 00000 n +0001046242 00000 n +0001046360 00000 n +0001046478 00000 n +0001046596 00000 n +0001046714 00000 n +0001046832 00000 n +0001046950 00000 n +0001047068 00000 n +0001047186 00000 n +0001047304 00000 n +0001047422 00000 n +0001049125 00000 n +0001050654 00000 n +0001048981 00000 n +0001047665 00000 n +0001049299 00000 n +0001049358 00000 n +0001049476 00000 n +0001049594 00000 n +0001049712 00000 n +0001049830 00000 n +0001049948 00000 n +0001050065 00000 n +0001050182 00000 n +0001050300 00000 n +0001050418 00000 n +0001050536 00000 n +0001052513 00000 n +0001052728 00000 n +0001052954 00000 n +0001053182 00000 n +0001053370 00000 n +0001053598 00000 n +0001053794 00000 n +0001054022 00000 n +0001054218 00000 n +0001057896 00000 n +0001058091 00000 n +0001058320 00000 n +0001054445 00000 n +0001055620 00000 n +0001052288 00000 n +0001050780 00000 n +0001054619 00000 n +0001054678 00000 n +0001054796 00000 n +0001054914 00000 n +0001055031 00000 n +0001055207 00000 n +0001055266 00000 n +0001055325 00000 n +0001055384 00000 n +0001055443 00000 n +0001055502 00000 n +0001055561 00000 n +0001058516 00000 n +0001058719 00000 n +0001058948 00000 n +0001059177 00000 n +0001059406 00000 n +0001059634 00000 n +0001059821 00000 n +0001060050 00000 n +0001060279 00000 n +0001060494 00000 n +0001060709 00000 n +0001060938 00000 n +0001061153 00000 n +0001061382 00000 n +0001061611 00000 n +0001061840 00000 n +0001062069 00000 n +0001062298 00000 n +0001062526 00000 n +0001062729 00000 n +0001062958 00000 n +0001063161 00000 n +0001063390 00000 n +0001063618 00000 n +0001067057 00000 n +0001067261 00000 n +0001063813 00000 n +0001064990 00000 n +0001057509 00000 n +0001055772 00000 n +0001063987 00000 n +0001064046 00000 n +0001064105 00000 n +0001064164 00000 n +0001064223 00000 n +0001064282 00000 n +0001064341 00000 n +0001064400 00000 n +0001064459 00000 n +0001064518 00000 n +0001064577 00000 n +0001064636 00000 n +0001064695 00000 n +0001064754 00000 n +0001064813 00000 n +0001064872 00000 n +0001064931 00000 n +0002867579 00000 n +0001067490 00000 n +0001067686 00000 n +0001067915 00000 n +0001068144 00000 n +0001068339 00000 n +0001068567 00000 n +0001068788 00000 n +0001069016 00000 n +0001069204 00000 n +0001069390 00000 n +0001069619 00000 n +0001069815 00000 n +0001070043 00000 n +0001070238 00000 n +0001070628 00000 n +0001070819 00000 n +0001071005 00000 n +0001071710 00000 n +0001066742 00000 n +0001065130 00000 n +0001071179 00000 n +0001071238 00000 n +0001071297 00000 n +0001071356 00000 n +0001071415 00000 n +0001071474 00000 n +0001071533 00000 n +0001071592 00000 n +0001070433 00000 n +0001071651 00000 n +0001074511 00000 n +0001074629 00000 n +0001074752 00000 n +0001074219 00000 n +0001074931 00000 n +0001074075 00000 n +0001071860 00000 n +0001074393 00000 n +0001074452 00000 n +0001074570 00000 n +0001074693 00000 n +0001074815 00000 n +0001076737 00000 n +0001076984 00000 n +0001077231 00000 n +0001077478 00000 n +0001077726 00000 n +0001077914 00000 n +0001078162 00000 n +0001078349 00000 n +0001078595 00000 n +0001078842 00000 n +0001079089 00000 n +0001079336 00000 n +0001079584 00000 n +0001079798 00000 n +0001079994 00000 n +0001080991 00000 n +0001076467 00000 n +0001075107 00000 n +0001080168 00000 n +0001080285 00000 n +0001080344 00000 n +0001080403 00000 n +0001080461 00000 n +0001080520 00000 n +0001080579 00000 n +0001080638 00000 n +0001080697 00000 n +0001080756 00000 n +0001080815 00000 n +0001080873 00000 n +0001080932 00000 n +0001083463 00000 n +0001083695 00000 n +0001083928 00000 n +0001084160 00000 n +0001084365 00000 n +0001084547 00000 n +0001084735 00000 n +0001085557 00000 n +0001083265 00000 n +0001081143 00000 n +0001084909 00000 n +0001085085 00000 n +0001085144 00000 n +0001085203 00000 n +0001085262 00000 n +0001085321 00000 n +0001085380 00000 n +0001085439 00000 n +0001085498 00000 n +0001087750 00000 n +0001087972 00000 n +0001088194 00000 n +0001088416 00000 n +0001088638 00000 n +0001088827 00000 n +0001089048 00000 n +0001089236 00000 n +0001089437 00000 n +0001089657 00000 n +0001089860 00000 n +0001090082 00000 n +0001090299 00000 n +0001090521 00000 n +0001093865 00000 n +0001094087 00000 n +0001090743 00000 n +0001091741 00000 n +0001087480 00000 n +0001085723 00000 n +0001090917 00000 n +0001091093 00000 n +0001091152 00000 n +0001091211 00000 n +0001091270 00000 n +0001091329 00000 n +0001091388 00000 n +0001091447 00000 n +0001091506 00000 n +0001091564 00000 n +0001091623 00000 n +0001091682 00000 n +0001104486 00000 n +0001094283 00000 n +0001094504 00000 n +0001094699 00000 n +0001094920 00000 n +0001095108 00000 n +0001095330 00000 n +0001095550 00000 n +0001095738 00000 n +0001095958 00000 n +0001096147 00000 n +0001096367 00000 n +0001096556 00000 n +0001096776 00000 n +0001096964 00000 n +0001097135 00000 n +0001097357 00000 n +0001097546 00000 n +0001097768 00000 n +0001097957 00000 n +0001098177 00000 n +0001098366 00000 n +0001098587 00000 n +0001098776 00000 n +0001098965 00000 n +0001099187 00000 n +0001099376 00000 n +0001102818 00000 n +0001103040 00000 n +0001099564 00000 n +0001100563 00000 n +0001093469 00000 n +0001091908 00000 n +0001099738 00000 n +0001099797 00000 n +0001099856 00000 n +0001099915 00000 n +0001099974 00000 n +0001100033 00000 n +0001100092 00000 n +0001100151 00000 n +0001100210 00000 n +0001100269 00000 n +0001100328 00000 n +0001100387 00000 n +0001100446 00000 n +0001100504 00000 n +0002867705 00000 n +0001104663 00000 n +0001104781 00000 n +0001103229 00000 n +0001103451 00000 n +0001103640 00000 n +0001104017 00000 n +0001105193 00000 n +0001102620 00000 n +0001100715 00000 n +0001104191 00000 n +0001104250 00000 n +0001103829 00000 n +0001104309 00000 n +0001104368 00000 n +0001104427 00000 n +0001104545 00000 n +0001104604 00000 n +0001104722 00000 n +0001104840 00000 n +0001104899 00000 n +0001104958 00000 n +0001105017 00000 n +0001105076 00000 n +0001107045 00000 n +0001107227 00000 n +0001107419 00000 n +0001107639 00000 n +0001107891 00000 n +0001108143 00000 n +0001108394 00000 n +0001111311 00000 n +0001111530 00000 n +0001108646 00000 n +0001109406 00000 n +0001106838 00000 n +0001105346 00000 n +0001108820 00000 n +0001108937 00000 n +0001108995 00000 n +0001109171 00000 n +0001109347 00000 n +0001147576 00000 n +0001147694 00000 n +0001147758 00000 n +0001147822 00000 n +0001147886 00000 n +0001111716 00000 n +0001111935 00000 n +0001112121 00000 n +0001112341 00000 n +0001112528 00000 n +0001112731 00000 n +0001112951 00000 n +0001113169 00000 n +0001113388 00000 n +0001113607 00000 n +0001113827 00000 n +0001114047 00000 n +0001114267 00000 n +0001114487 00000 n +0001114673 00000 n +0001114893 00000 n +0001115095 00000 n +0001115314 00000 n +0001115515 00000 n +0001115733 00000 n +0001115953 00000 n +0001116140 00000 n +0001116360 00000 n +0001119751 00000 n +0001116580 00000 n +0001117638 00000 n +0001110942 00000 n +0001109545 00000 n +0001116754 00000 n +0001116813 00000 n +0001116872 00000 n +0001116931 00000 n +0001116990 00000 n +0001117049 00000 n +0001117108 00000 n +0001117167 00000 n +0001117226 00000 n +0001117285 00000 n +0001117344 00000 n +0001117403 00000 n +0001117462 00000 n +0001117521 00000 n +0001117579 00000 n +0001153554 00000 n +0001153672 00000 n +0001156688 00000 n +0001119971 00000 n +0001120191 00000 n +0001120411 00000 n +0001120631 00000 n +0001120850 00000 n +0001121035 00000 n +0001121222 00000 n +0001121442 00000 n +0001121638 00000 n +0001121825 00000 n +0001122045 00000 n +0001122241 00000 n +0001122428 00000 n +0001122648 00000 n +0001122844 00000 n +0001123029 00000 n +0001123248 00000 n +0001123441 00000 n +0001123643 00000 n +0001123861 00000 n +0001124047 00000 n +0001124265 00000 n +0001124485 00000 n +0001124672 00000 n +0001124892 00000 n +0001125079 00000 n +0001128404 00000 n +0001128624 00000 n +0001125299 00000 n +0001126122 00000 n +0001119364 00000 n +0001117777 00000 n +0001125473 00000 n +0001125532 00000 n +0001125591 00000 n +0001125650 00000 n +0001125709 00000 n +0001125768 00000 n +0001125827 00000 n +0001125886 00000 n +0001125945 00000 n +0001126004 00000 n +0002862486 00000 n +0001126063 00000 n +0001148009 00000 n +0001148127 00000 n +0001153318 00000 n +0001153436 00000 n +0001128811 00000 n +0001129031 00000 n +0001129218 00000 n +0001129405 00000 n +0001129623 00000 n +0001129807 00000 n +0001129993 00000 n +0001130212 00000 n +0001130398 00000 n +0001130584 00000 n +0001130802 00000 n +0001130993 00000 n +0001131179 00000 n +0001131366 00000 n +0001131570 00000 n +0001131790 00000 n +0001131983 00000 n +0001132168 00000 n +0001132354 00000 n +0001132557 00000 n +0001132776 00000 n +0001132969 00000 n +0001133155 00000 n +0001133342 00000 n +0001133546 00000 n +0001133765 00000 n +0001133958 00000 n +0001134144 00000 n +0001134331 00000 n +0001134535 00000 n +0001134755 00000 n +0001134948 00000 n +0001135134 00000 n +0001135321 00000 n +0001135525 00000 n +0001135745 00000 n +0001135938 00000 n +0001136124 00000 n +0001136311 00000 n +0001136515 00000 n +0001136735 00000 n +0001136955 00000 n +0001137247 00000 n +0001127873 00000 n +0001126291 00000 n +0001137129 00000 n +0001137188 00000 n +0001156869 00000 n +0001156987 00000 n +0001157105 00000 n +0001157223 00000 n +0001157341 00000 n +0001159824 00000 n +0001159940 00000 n +0001162404 00000 n +0001162522 00000 n +0001162640 00000 n +0001166820 00000 n +0001140342 00000 n +0001140528 00000 n +0001140690 00000 n +0001140982 00000 n +0001140180 00000 n +0001137413 00000 n +0001140864 00000 n +0001140923 00000 n +0002867831 00000 n +0001143714 00000 n +0001143947 00000 n +0001143570 00000 n +0001141220 00000 n +0001143888 00000 n +0001146655 00000 n +0001146880 00000 n +0001147065 00000 n +0001147284 00000 n +0001148185 00000 n +0001146484 00000 n +0001144135 00000 n +0001147458 00000 n +0001147517 00000 n +0001147635 00000 n +0001147950 00000 n +0001148068 00000 n +0001438902 00000 n +0001150264 00000 n +0001150450 00000 n +0001150670 00000 n +0001150856 00000 n +0001151294 00000 n +0001151523 00000 n +0001151734 00000 n +0001151921 00000 n +0001152360 00000 n +0001152589 00000 n +0001152800 00000 n +0001153026 00000 n +0001153736 00000 n +0001150003 00000 n +0001148374 00000 n +0001153200 00000 n +0001153259 00000 n +0001153377 00000 n +0001151076 00000 n +0001153495 00000 n +0001152141 00000 n +0001153613 00000 n +0001539295 00000 n +0001444395 00000 n +0001156170 00000 n +0001156396 00000 n +0001157459 00000 n +0001156017 00000 n +0001153862 00000 n +0001156570 00000 n +0001156629 00000 n +0001156752 00000 n +0001156811 00000 n +0001156928 00000 n +0001157046 00000 n +0001157164 00000 n +0001157282 00000 n +0001157400 00000 n +0001444513 00000 n +0001159591 00000 n +0001160058 00000 n +0001159447 00000 n +0001157611 00000 n +0001159765 00000 n +0001159882 00000 n +0001159999 00000 n +0001162171 00000 n +0001162699 00000 n +0001162027 00000 n +0001160197 00000 n +0001162345 00000 n +0001162463 00000 n +0001162581 00000 n +0002867957 00000 n +0001165050 00000 n +0001165251 00000 n +0001165465 00000 n +0001165692 00000 n +0001165919 00000 n +0001166106 00000 n +0001166333 00000 n +0001169599 00000 n +0001166528 00000 n +0001167349 00000 n +0001164843 00000 n +0001162851 00000 n +0001166702 00000 n +0001166761 00000 n +0001166879 00000 n +0001167055 00000 n +0001167114 00000 n +0001167173 00000 n +0001167232 00000 n +0001167291 00000 n +0001169826 00000 n +0001170020 00000 n +0001170246 00000 n +0001170441 00000 n +0001170644 00000 n +0001170872 00000 n +0001171100 00000 n +0001171328 00000 n +0001171515 00000 n +0001171743 00000 n +0001171970 00000 n +0001172184 00000 n +0001172398 00000 n +0001172626 00000 n +0001172840 00000 n +0001173068 00000 n +0001173296 00000 n +0001173523 00000 n +0001173750 00000 n +0001173978 00000 n +0001174206 00000 n +0001174409 00000 n +0001174637 00000 n +0001174840 00000 n +0001175068 00000 n +0001175295 00000 n +0001179073 00000 n +0001179276 00000 n +0001175488 00000 n +0001176546 00000 n +0001169212 00000 n +0001167501 00000 n +0001175662 00000 n +0001175721 00000 n +0001175780 00000 n +0001175839 00000 n +0001175898 00000 n +0001175957 00000 n +0001176016 00000 n +0001176075 00000 n +0001176133 00000 n +0001176192 00000 n +0001176251 00000 n +0001176310 00000 n +0001176369 00000 n +0001176428 00000 n +0001176487 00000 n +0001190134 00000 n +0001190252 00000 n +0001179503 00000 n +0001179698 00000 n +0001179926 00000 n +0001180154 00000 n +0001180349 00000 n +0001180577 00000 n +0001180797 00000 n +0001181025 00000 n +0001181219 00000 n +0001181446 00000 n +0001181641 00000 n +0001182030 00000 n +0001182224 00000 n +0001182410 00000 n +0001183056 00000 n +0001178785 00000 n +0001176699 00000 n +0001182584 00000 n +0001182643 00000 n +0001182702 00000 n +0001182761 00000 n +0001182820 00000 n +0001182879 00000 n +0001182938 00000 n +0001181836 00000 n +0001182997 00000 n +0001190434 00000 n +0001190552 00000 n +0001185497 00000 n +0001185730 00000 n +0001185353 00000 n +0001183206 00000 n +0001185671 00000 n +0001188061 00000 n +0001188434 00000 n +0001188668 00000 n +0001188896 00000 n +0001189130 00000 n +0001189350 00000 n +0001189596 00000 n +0001189842 00000 n +0001190968 00000 n +0001187845 00000 n +0001185917 00000 n +0001190016 00000 n +0001190075 00000 n +0001190193 00000 n +0001188248 00000 n +0001190316 00000 n +0001190375 00000 n +0001190493 00000 n +0001190615 00000 n +0001190791 00000 n +0001190850 00000 n +0001190909 00000 n +0001478811 00000 n +0001478933 00000 n +0001192921 00000 n +0001193167 00000 n +0001193413 00000 n +0001193600 00000 n +0001193847 00000 n +0001194034 00000 n +0001194281 00000 n +0001194528 00000 n +0001194774 00000 n +0001195020 00000 n +0001195267 00000 n +0001195479 00000 n +0001195867 00000 n +0001196688 00000 n +0001192660 00000 n +0001191120 00000 n +0001196041 00000 n +0001196100 00000 n +0001196159 00000 n +0001196216 00000 n +0001196275 00000 n +0001196334 00000 n +0001196393 00000 n +0001196452 00000 n +0001196511 00000 n +0001196570 00000 n +0001195673 00000 n +0002868083 00000 n +0001198713 00000 n +0001198935 00000 n +0001199125 00000 n +0001199348 00000 n +0001199538 00000 n +0001199742 00000 n +0001199963 00000 n +0001200153 00000 n +0001200357 00000 n +0001200578 00000 n +0001200768 00000 n +0001200989 00000 n +0001201179 00000 n +0001201400 00000 n +0001201590 00000 n +0001201779 00000 n +0001201999 00000 n +0001202189 00000 n +0001202408 00000 n +0001202597 00000 n +0001202786 00000 n +0001203007 00000 n +0001203197 00000 n +0001203387 00000 n +0001203576 00000 n +0001203797 00000 n +0001203987 00000 n +0001204177 00000 n +0001204367 00000 n +0001204590 00000 n +0001204779 00000 n +0001204969 00000 n +0001205159 00000 n +0001205349 00000 n +0001205539 00000 n +0001205760 00000 n +0001205950 00000 n +0001206140 00000 n +0001208871 00000 n +0001209092 00000 n +0001209282 00000 n +0001209472 00000 n +0001209662 00000 n +0001209883 00000 n +0001210073 00000 n +0001210263 00000 n +0001206329 00000 n +0001206679 00000 n +0001198227 00000 n +0001196827 00000 n +0001206503 00000 n +0001206620 00000 n +0001213212 00000 n +0001213330 00000 n +0001213448 00000 n +0001213566 00000 n +0001213684 00000 n +0001213800 00000 n +0001213917 00000 n +0001216250 00000 n +0001216368 00000 n +0001216485 00000 n +0001216603 00000 n +0001216721 00000 n +0001210452 00000 n +0001210673 00000 n +0001210863 00000 n +0001211053 00000 n +0001211243 00000 n +0001211463 00000 n +0001211652 00000 n +0001211841 00000 n +0001212063 00000 n +0001212252 00000 n +0001212441 00000 n +0001212630 00000 n +0001212803 00000 n +0001213976 00000 n +0001208547 00000 n +0001206804 00000 n +0001212977 00000 n +0001213036 00000 n +0001213095 00000 n +0001213153 00000 n +0001213271 00000 n +0001213389 00000 n +0001213507 00000 n +0001213625 00000 n +0001213741 00000 n +0001213859 00000 n +0001216843 00000 n +0001216961 00000 n +0001217079 00000 n +0001217196 00000 n +0001215958 00000 n +0001217376 00000 n +0001215814 00000 n +0001214116 00000 n +0001216132 00000 n +0001216191 00000 n +0001216309 00000 n +0001216427 00000 n +0001216544 00000 n +0001216662 00000 n +0001216784 00000 n +0001216902 00000 n +0001217020 00000 n +0001217138 00000 n +0001217260 00000 n +0001219366 00000 n +0001219570 00000 n +0001219785 00000 n +0001219999 00000 n +0001220202 00000 n +0001220406 00000 n +0001220620 00000 n +0001220816 00000 n +0001221030 00000 n +0001221225 00000 n +0001221418 00000 n +0001221632 00000 n +0001221828 00000 n +0001222042 00000 n +0001222237 00000 n +0001222430 00000 n +0001222644 00000 n +0001222845 00000 n +0001223059 00000 n +0001223259 00000 n +0001223452 00000 n +0001223666 00000 n +0001223847 00000 n +0001224033 00000 n +0001224237 00000 n +0001224451 00000 n +0001224638 00000 n +0001224842 00000 n +0001225056 00000 n +0001225250 00000 n +0001225454 00000 n +0001225668 00000 n +0001225849 00000 n +0001228851 00000 n +0001229065 00000 n +0001229253 00000 n +0001226047 00000 n +0001226512 00000 n +0001218925 00000 n +0001217502 00000 n +0001226221 00000 n +0001226338 00000 n +0001226396 00000 n +0001226454 00000 n +0001311345 00000 n +0001311463 00000 n +0001313467 00000 n +0001313585 00000 n +0001313703 00000 n +0001313821 00000 n +0001316041 00000 n +0001316159 00000 n +0001316277 00000 n +0001318895 00000 n +0001319010 00000 n +0001229456 00000 n +0001229670 00000 n +0001229852 00000 n +0001230056 00000 n +0001230237 00000 n +0001230451 00000 n +0001230633 00000 n +0001230837 00000 n +0001231051 00000 n +0001231255 00000 n +0001231470 00000 n +0001231640 00000 n +0001231836 00000 n +0001232049 00000 n +0001232245 00000 n +0001232459 00000 n +0001232655 00000 n +0001232870 00000 n +0001233066 00000 n +0001233281 00000 n +0001233482 00000 n +0001233696 00000 n +0001233896 00000 n +0001234109 00000 n +0001234306 00000 n +0001234520 00000 n +0001234707 00000 n +0001234904 00000 n +0001235118 00000 n +0001235310 00000 n +0001235507 00000 n +0001235721 00000 n +0001235907 00000 n +0001236103 00000 n +0001236316 00000 n +0001236502 00000 n +0001239969 00000 n +0001236715 00000 n +0001237769 00000 n +0001228356 00000 n +0001226651 00000 n +0001236889 00000 n +0001236948 00000 n +0001237007 00000 n +0001237066 00000 n +0001237125 00000 n +0001237184 00000 n +0001237243 00000 n +0001237302 00000 n +0001237361 00000 n +0001237419 00000 n +0001237478 00000 n +0001237537 00000 n +0001237596 00000 n +0001237651 00000 n +0001237710 00000 n +0001322259 00000 n +0001322382 00000 n +0001240184 00000 n +0001240398 00000 n +0001240613 00000 n +0001240795 00000 n +0001241010 00000 n +0001241225 00000 n +0001241440 00000 n +0001241655 00000 n +0001241841 00000 n +0001242055 00000 n +0001242250 00000 n +0001242465 00000 n +0001242660 00000 n +0001242874 00000 n +0001243070 00000 n +0001243274 00000 n +0001243478 00000 n +0001243692 00000 n +0001243888 00000 n +0001244092 00000 n +0001244296 00000 n +0001244483 00000 n +0001244698 00000 n +0001244894 00000 n +0001245097 00000 n +0001245300 00000 n +0001245515 00000 n +0001245711 00000 n +0001245914 00000 n +0001246117 00000 n +0001246304 00000 n +0001246519 00000 n +0001246701 00000 n +0001246916 00000 n +0001249717 00000 n +0001249930 00000 n +0001250111 00000 n +0001247097 00000 n +0001247507 00000 n +0001239510 00000 n +0001237909 00000 n +0001247271 00000 n +0001247330 00000 n +0001247389 00000 n +0001247448 00000 n +0002868209 00000 n +0001324641 00000 n +0001324757 00000 n +0001324880 00000 n +0001324997 00000 n +0001325120 00000 n +0001325238 00000 n +0001328168 00000 n +0001328286 00000 n +0001328408 00000 n +0001331483 00000 n +0001331606 00000 n +0001331728 00000 n +0001250297 00000 n +0001250512 00000 n +0001250725 00000 n +0001250913 00000 n +0001251128 00000 n +0001251314 00000 n +0001251527 00000 n +0001251720 00000 n +0001251935 00000 n +0001252128 00000 n +0001252339 00000 n +0001252532 00000 n +0001252744 00000 n +0001252939 00000 n +0001253154 00000 n +0001253350 00000 n +0001253565 00000 n +0001253761 00000 n +0001253974 00000 n +0001254162 00000 n +0001254377 00000 n +0001254565 00000 n +0001254777 00000 n +0001254972 00000 n +0001255187 00000 n +0001255382 00000 n +0001255595 00000 n +0001255791 00000 n +0001256006 00000 n +0001256202 00000 n +0001256414 00000 n +0001259528 00000 n +0001259741 00000 n +0001259937 00000 n +0001260150 00000 n +0001256602 00000 n +0001256835 00000 n +0001249267 00000 n +0001247633 00000 n +0001256776 00000 n +0001334962 00000 n +0001335080 00000 n +0001335196 00000 n +0001338037 00000 n +0001338272 00000 n +0001340717 00000 n +0001343472 00000 n +0001346386 00000 n +0001346622 00000 n +0001349291 00000 n +0001260338 00000 n +0001260550 00000 n +0001260746 00000 n +0001260959 00000 n +0001261160 00000 n +0001261373 00000 n +0001261574 00000 n +0001261788 00000 n +0001261989 00000 n +0001262203 00000 n +0001262403 00000 n +0001262616 00000 n +0001262802 00000 n +0001262967 00000 n +0001263180 00000 n +0001263372 00000 n +0001263537 00000 n +0001263750 00000 n +0001263932 00000 n +0001264147 00000 n +0001264329 00000 n +0001264541 00000 n +0001264721 00000 n +0001264936 00000 n +0001265117 00000 n +0001265332 00000 n +0001265513 00000 n +0001265726 00000 n +0001265906 00000 n +0001266069 00000 n +0001266283 00000 n +0001266464 00000 n +0001266643 00000 n +0001266858 00000 n +0001267044 00000 n +0001267240 00000 n +0001271005 00000 n +0001271220 00000 n +0001271406 00000 n +0001267413 00000 n +0001267646 00000 n +0001259024 00000 n +0001256988 00000 n +0001267587 00000 n +0001349407 00000 n +0001349525 00000 n +0001351693 00000 n +0001351811 00000 n +0001351928 00000 n +0001355400 00000 n +0001355518 00000 n +0001358321 00000 n +0001358557 00000 n +0001361582 00000 n +0001361700 00000 n +0001361818 00000 n +0001361936 00000 n +0001271602 00000 n +0001271776 00000 n +0001271990 00000 n +0001272175 00000 n +0001272378 00000 n +0001272573 00000 n +0001272744 00000 n +0001272959 00000 n +0001273145 00000 n +0001273349 00000 n +0001273740 00000 n +0001273911 00000 n +0001274126 00000 n +0001274322 00000 n +0001274526 00000 n +0001274722 00000 n +0001274892 00000 n +0001275106 00000 n +0001275301 00000 n +0001275504 00000 n +0001275700 00000 n +0001275870 00000 n +0001276085 00000 n +0001276270 00000 n +0001276466 00000 n +0001276857 00000 n +0001277044 00000 n +0001277259 00000 n +0001277445 00000 n +0001277641 00000 n +0001278032 00000 n +0001278219 00000 n +0001278431 00000 n +0001278613 00000 n +0001278778 00000 n +0001278990 00000 n +0001279203 00000 n +0001279384 00000 n +0001279545 00000 n +0001279756 00000 n +0001279937 00000 n +0001280097 00000 n +0001280309 00000 n +0001280491 00000 n +0001283722 00000 n +0001283937 00000 n +0001284119 00000 n +0001280652 00000 n +0001280944 00000 n +0001270411 00000 n +0001267772 00000 n +0001280826 00000 n +0001273545 00000 n +0001276662 00000 n +0001277837 00000 n +0001280885 00000 n +0001365222 00000 n +0001365337 00000 n +0001368344 00000 n +0001368462 00000 n +0001368580 00000 n +0001372066 00000 n +0001372184 00000 n +0001375409 00000 n +0001375527 00000 n +0001375645 00000 n +0001375763 00000 n +0001284315 00000 n +0001284475 00000 n +0001284690 00000 n +0001284872 00000 n +0001285068 00000 n +0001285230 00000 n +0001285444 00000 n +0001285626 00000 n +0001285822 00000 n +0001285984 00000 n +0001286197 00000 n +0001286401 00000 n +0001286613 00000 n +0001286815 00000 n +0001287027 00000 n +0001287207 00000 n +0001287371 00000 n +0001287583 00000 n +0001287775 00000 n +0001287988 00000 n +0001288192 00000 n +0001288405 00000 n +0001288578 00000 n +0001288791 00000 n +0001288977 00000 n +0001289181 00000 n +0001289393 00000 n +0001289585 00000 n +0001289771 00000 n +0001289986 00000 n +0001290199 00000 n +0001290381 00000 n +0001293229 00000 n +0001290592 00000 n +0001291001 00000 n +0001283263 00000 n +0001281124 00000 n +0001290766 00000 n +0001290825 00000 n +0001290883 00000 n +0001290942 00000 n +0001379169 00000 n +0001379287 00000 n +0001379405 00000 n +0001382927 00000 n +0001383042 00000 n +0001387043 00000 n +0001387161 00000 n +0001387279 00000 n +0001387397 00000 n +0001391755 00000 n +0001391878 00000 n +0001293442 00000 n +0001293655 00000 n +0001293870 00000 n +0001294085 00000 n +0001294289 00000 n +0001294502 00000 n +0001294706 00000 n +0001294919 00000 n +0001295134 00000 n +0001295338 00000 n +0001295553 00000 n +0001295734 00000 n +0001295948 00000 n +0001296163 00000 n +0001296377 00000 n +0001296559 00000 n +0001296741 00000 n +0001296956 00000 n +0001297137 00000 n +0001297352 00000 n +0001297533 00000 n +0001297715 00000 n +0001297930 00000 n +0001298112 00000 n +0001298294 00000 n +0001299175 00000 n +0001292860 00000 n +0001291154 00000 n +0001298468 00000 n +0001298527 00000 n +0001298586 00000 n +0001298645 00000 n +0001298704 00000 n +0001298763 00000 n +0001298822 00000 n +0001298881 00000 n +0001298940 00000 n +0001298998 00000 n +0001299057 00000 n +0001299116 00000 n +0001395458 00000 n +0001395638 00000 n +0001395756 00000 n +0001395879 00000 n +0001396001 00000 n +0001301959 00000 n +0001302140 00000 n +0001302307 00000 n +0001302477 00000 n +0001302769 00000 n +0001301788 00000 n +0001299328 00000 n +0001302651 00000 n +0001302710 00000 n +0002868335 00000 n +0001305107 00000 n +0001305340 00000 n +0001304963 00000 n +0001302932 00000 n +0001305281 00000 n +0001308170 00000 n +0001308403 00000 n +0001308026 00000 n +0001305514 00000 n +0001308344 00000 n +0001311053 00000 n +0001311581 00000 n +0001310909 00000 n +0001308577 00000 n +0001311227 00000 n +0001311286 00000 n +0001311404 00000 n +0001311522 00000 n +0001313234 00000 n +0001313879 00000 n +0001313090 00000 n +0001311782 00000 n +0001313408 00000 n +0001313526 00000 n +0001313644 00000 n +0001313762 00000 n +0001315749 00000 n +0001316336 00000 n +0001315605 00000 n +0001313992 00000 n +0001315923 00000 n +0001315982 00000 n +0001316100 00000 n +0001316218 00000 n +0001318603 00000 n +0001319128 00000 n +0001318459 00000 n +0001316462 00000 n +0001318777 00000 n +0001318836 00000 n +0001318952 00000 n +0001319069 00000 n +0002868461 00000 n +0001321845 00000 n +0001322026 00000 n +0001322441 00000 n +0001321692 00000 n +0001319254 00000 n +0001322200 00000 n +0001322323 00000 n +0001324290 00000 n +0001325356 00000 n +0001324146 00000 n +0001322579 00000 n +0001324464 00000 n +0001324523 00000 n +0001324582 00000 n +0001324699 00000 n +0001324821 00000 n +0001324939 00000 n +0001325061 00000 n +0001325179 00000 n +0001325297 00000 n +0001327561 00000 n +0001327748 00000 n +0001327935 00000 n +0001328472 00000 n +0001327399 00000 n +0001325482 00000 n +0001328109 00000 n +0001328227 00000 n +0001328350 00000 n +0001330820 00000 n +0001331005 00000 n +0001331191 00000 n +0001331786 00000 n +0001330658 00000 n +0001328598 00000 n +0001331365 00000 n +0001331424 00000 n +0001331547 00000 n +0001331670 00000 n +0001334489 00000 n +0001334670 00000 n +0001335260 00000 n +0001334336 00000 n +0001331912 00000 n +0001334844 00000 n +0001334903 00000 n +0001335021 00000 n +0001335138 00000 n +0001336898 00000 n +0001337069 00000 n +0001337263 00000 n +0001337434 00000 n +0001337627 00000 n +0001338330 00000 n +0001336718 00000 n +0001335399 00000 n +0001337801 00000 n +0001337860 00000 n +0001337978 00000 n +0001338096 00000 n +0001338214 00000 n +0002868587 00000 n +0001340060 00000 n +0001340231 00000 n +0001340425 00000 n +0001341011 00000 n +0001339898 00000 n +0001338456 00000 n +0001340599 00000 n +0001340658 00000 n +0001340776 00000 n +0001340893 00000 n +0001342815 00000 n +0001342986 00000 n +0001345423 00000 n +0001345594 00000 n +0001343180 00000 n +0001343708 00000 n +0001342653 00000 n +0001341137 00000 n +0001343354 00000 n +0001343413 00000 n +0001343531 00000 n +0001343649 00000 n +0001345788 00000 n +0001345959 00000 n +0001346153 00000 n +0001346797 00000 n +0001345243 00000 n +0001343834 00000 n +0001346327 00000 n +0001346445 00000 n +0001346563 00000 n +0001346681 00000 n +0001348634 00000 n +0001348805 00000 n +0001348999 00000 n +0001349584 00000 n +0001348472 00000 n +0001346923 00000 n +0001349173 00000 n +0001349232 00000 n +0001349349 00000 n +0001349466 00000 n +0001351401 00000 n +0001352104 00000 n +0001351257 00000 n +0001349710 00000 n +0001351575 00000 n +0001351634 00000 n +0001351752 00000 n +0001351869 00000 n +0001351987 00000 n +0001354097 00000 n +0001354268 00000 n +0001354462 00000 n +0001354633 00000 n +0001354827 00000 n +0001354990 00000 n +0001355576 00000 n +0001353908 00000 n +0001352230 00000 n +0001355164 00000 n +0001355223 00000 n +0001355341 00000 n +0001355459 00000 n +0002868713 00000 n +0001357313 00000 n +0001357478 00000 n +0001357664 00000 n +0001357835 00000 n +0001358029 00000 n +0001358734 00000 n +0001357133 00000 n +0001355702 00000 n +0001358203 00000 n +0001358262 00000 n +0001358380 00000 n +0001358498 00000 n +0001358616 00000 n +0001360582 00000 n +0001360753 00000 n +0001360947 00000 n +0001361111 00000 n +0001364410 00000 n +0001361290 00000 n +0001361991 00000 n +0001360402 00000 n +0001358860 00000 n +0001361464 00000 n +0001361523 00000 n +0001361641 00000 n +0001361759 00000 n +0001361877 00000 n +0001364585 00000 n +0001364760 00000 n +0001364930 00000 n +0001365455 00000 n +0001364239 00000 n +0001362117 00000 n +0001365104 00000 n +0001365163 00000 n +0001365280 00000 n +0001365396 00000 n +0001367770 00000 n +0001367941 00000 n +0001371230 00000 n +0001368111 00000 n +0001368639 00000 n +0001367608 00000 n +0001365618 00000 n +0001368285 00000 n +0001368403 00000 n +0001368521 00000 n +0001371401 00000 n +0001371588 00000 n +0001371774 00000 n +0001372302 00000 n +0001371059 00000 n +0001368802 00000 n +0001371948 00000 n +0001372007 00000 n +0001372125 00000 n +0001372243 00000 n +0001374343 00000 n +0001374507 00000 n +0001374668 00000 n +0001374841 00000 n +0001375003 00000 n +0001377875 00000 n +0001375176 00000 n +0001375822 00000 n +0001374154 00000 n +0001372465 00000 n +0001375350 00000 n +0001375468 00000 n +0001375586 00000 n +0001375704 00000 n +0002868839 00000 n +0001378037 00000 n +0001378209 00000 n +0001378370 00000 n +0001378543 00000 n +0001378705 00000 n +0001381871 00000 n +0001378877 00000 n +0001379464 00000 n +0001377677 00000 n +0001375961 00000 n +0001379051 00000 n +0001379110 00000 n +0001379228 00000 n +0001379346 00000 n +0001382032 00000 n +0001382205 00000 n +0001382420 00000 n +0001382635 00000 n +0001383160 00000 n +0001381691 00000 n +0001379603 00000 n +0001382809 00000 n +0001382868 00000 n +0001382985 00000 n +0001383101 00000 n +0001385885 00000 n +0001386050 00000 n +0001386265 00000 n +0001386450 00000 n +0001386636 00000 n +0001386810 00000 n +0001387515 00000 n +0001385696 00000 n +0001383361 00000 n +0001386984 00000 n +0001387102 00000 n +0001387220 00000 n +0001387338 00000 n +0001387456 00000 n +0001390590 00000 n +0001390763 00000 n +0001390976 00000 n +0001391152 00000 n +0001391337 00000 n +0001394484 00000 n +0001391522 00000 n +0001391999 00000 n +0001390401 00000 n +0001387703 00000 n +0001391696 00000 n +0001391819 00000 n +0001391941 00000 n +0001394659 00000 n +0001394841 00000 n +0001395044 00000 n +0001398297 00000 n +0001395225 00000 n +0001396299 00000 n +0001394304 00000 n +0001392150 00000 n +0001395399 00000 n +0001395520 00000 n +0001395579 00000 n +0001395697 00000 n +0001395820 00000 n +0001395942 00000 n +0001396065 00000 n +0001396240 00000 n +0001398524 00000 n +0001398751 00000 n +0001398932 00000 n +0001399158 00000 n +0001399352 00000 n +0001399579 00000 n +0001399807 00000 n +0001400002 00000 n +0001400230 00000 n +0001400412 00000 n +0001400594 00000 n +0001400789 00000 n +0001400970 00000 n +0001404019 00000 n +0001404259 00000 n +0001404454 00000 n +0001401152 00000 n +0001402091 00000 n +0001398027 00000 n +0001396463 00000 n +0001401326 00000 n +0001401385 00000 n +0001401444 00000 n +0001401503 00000 n +0001401562 00000 n +0001401621 00000 n +0001401680 00000 n +0001401739 00000 n +0001401798 00000 n +0001401857 00000 n +0001401916 00000 n +0002868965 00000 n +0001404649 00000 n +0001404831 00000 n +0001405012 00000 n +0001405198 00000 n +0001405424 00000 n +0001405682 00000 n +0001405940 00000 n +0001406198 00000 n +0001406423 00000 n +0001406616 00000 n +0001406841 00000 n +0001407032 00000 n +0001407257 00000 n +0001407449 00000 n +0001407641 00000 n +0001407867 00000 n +0001408054 00000 n +0001408257 00000 n +0001408483 00000 n +0001408702 00000 n +0001411943 00000 n +0001408928 00000 n +0001409926 00000 n +0001403668 00000 n +0001402269 00000 n +0001409102 00000 n +0001409161 00000 n +0001409220 00000 n +0001409279 00000 n +0001409455 00000 n +0001409514 00000 n +0001409573 00000 n +0001409632 00000 n +0001409691 00000 n +0001409749 00000 n +0001409808 00000 n +0001409867 00000 n +0001439018 00000 n +0001439081 00000 n +0001439145 00000 n +0001412169 00000 n +0001412395 00000 n +0001412621 00000 n +0001412847 00000 n +0001413073 00000 n +0001413299 00000 n +0001413485 00000 n +0001413709 00000 n +0001413912 00000 n +0001414138 00000 n +0001414341 00000 n +0001414567 00000 n +0001414793 00000 n +0001414986 00000 n +0001415212 00000 n +0001415405 00000 n +0001415631 00000 n +0001415834 00000 n +0001416027 00000 n +0001416253 00000 n +0001416478 00000 n +0001416704 00000 n +0001416930 00000 n +0001420481 00000 n +0001420707 00000 n +0001417155 00000 n +0001418212 00000 n +0001411583 00000 n +0001410078 00000 n +0001417329 00000 n +0001417388 00000 n +0001417447 00000 n +0001417506 00000 n +0001417565 00000 n +0001417624 00000 n +0001417683 00000 n +0001417742 00000 n +0001417801 00000 n +0001417860 00000 n +0001417919 00000 n +0001417978 00000 n +0001418035 00000 n +0001418094 00000 n +0001418153 00000 n +0001444636 00000 n +0001420933 00000 n +0001421158 00000 n +0001421350 00000 n +0001421574 00000 n +0001421765 00000 n +0001421958 00000 n +0001422184 00000 n +0001422378 00000 n +0001422570 00000 n +0001422796 00000 n +0001422992 00000 n +0001423184 00000 n +0001423409 00000 n +0001423604 00000 n +0001423808 00000 n +0001424034 00000 n +0001424227 00000 n +0001424452 00000 n +0001424675 00000 n +0001424867 00000 n +0001425092 00000 n +0001425318 00000 n +0001425511 00000 n +0001425737 00000 n +0001425930 00000 n +0001429972 00000 n +0001430197 00000 n +0001430390 00000 n +0001426315 00000 n +0001427020 00000 n +0001420085 00000 n +0001418366 00000 n +0001426489 00000 n +0001426548 00000 n +0001426607 00000 n +0001426666 00000 n +0001426725 00000 n +0001426784 00000 n +0001426843 00000 n +0001426902 00000 n +0001426961 00000 n +0001426123 00000 n +0001447198 00000 n +0001439268 00000 n +0001439386 00000 n +0001444277 00000 n +0001447380 00000 n +0001447498 00000 n +0001430583 00000 n +0001430809 00000 n +0001431002 00000 n +0001431194 00000 n +0001431420 00000 n +0001431646 00000 n +0001431838 00000 n +0001432130 00000 n +0001429747 00000 n +0001427188 00000 n +0001432012 00000 n +0001432071 00000 n +0001447616 00000 n +0001447734 00000 n +0001447852 00000 n +0001435021 00000 n +0001435254 00000 n +0001434877 00000 n +0001432381 00000 n +0001435195 00000 n +0001437973 00000 n +0001438191 00000 n +0001438384 00000 n +0001438610 00000 n +0001439444 00000 n +0001437802 00000 n +0001435455 00000 n +0001438784 00000 n +0001438843 00000 n +0001438960 00000 n +0001439209 00000 n +0001439327 00000 n +0002869091 00000 n +0001441438 00000 n +0001441631 00000 n +0001441857 00000 n +0001442053 00000 n +0001442282 00000 n +0001442493 00000 n +0001442686 00000 n +0001442912 00000 n +0001443108 00000 n +0001443337 00000 n +0001443548 00000 n +0001443767 00000 n +0001443985 00000 n +0001444700 00000 n +0001441186 00000 n +0001439633 00000 n +0001444159 00000 n +0001444218 00000 n +0001444336 00000 n +0001444454 00000 n +0001444577 00000 n +0001446712 00000 n +0001450075 00000 n +0001446906 00000 n +0001448087 00000 n +0001446559 00000 n +0001444826 00000 n +0001447080 00000 n +0001447139 00000 n +0001447262 00000 n +0001447321 00000 n +0001447439 00000 n +0001447557 00000 n +0001447675 00000 n +0001447793 00000 n +0001447911 00000 n +0001450294 00000 n +0001450527 00000 n +0001450759 00000 n +0001450951 00000 n +0001451184 00000 n +0001451388 00000 n +0001451621 00000 n +0001451821 00000 n +0001452053 00000 n +0001452253 00000 n +0001452487 00000 n +0001452687 00000 n +0001452890 00000 n +0001453124 00000 n +0001453358 00000 n +0001453592 00000 n +0001453785 00000 n +0001454019 00000 n +0001454212 00000 n +0001454445 00000 n +0001454645 00000 n +0001454879 00000 n +0001455113 00000 n +0001455333 00000 n +0001455553 00000 n +0001455785 00000 n +0001459224 00000 n +0001459427 00000 n +0001456003 00000 n +0001457121 00000 n +0001449688 00000 n +0001448226 00000 n +0001456177 00000 n +0001456236 00000 n +0001456295 00000 n +0001456354 00000 n +0001456413 00000 n +0001456472 00000 n +0001456531 00000 n +0001456590 00000 n +0001456649 00000 n +0001456708 00000 n +0001456767 00000 n +0001456826 00000 n +0001456885 00000 n +0001456944 00000 n +0001457003 00000 n +0001457062 00000 n +0001478693 00000 n +0001459661 00000 n +0001459863 00000 n +0001460096 00000 n +0001460299 00000 n +0001460533 00000 n +0001460767 00000 n +0001461001 00000 n +0001461202 00000 n +0001461436 00000 n +0001461670 00000 n +0001461903 00000 n +0001462137 00000 n +0001462371 00000 n +0001462605 00000 n +0001462808 00000 n +0001463042 00000 n +0001463244 00000 n +0001463477 00000 n +0001463711 00000 n +0001463912 00000 n +0001464115 00000 n +0001464348 00000 n +0001464549 00000 n +0001468368 00000 n +0001464783 00000 n +0001465841 00000 n +0001458855 00000 n +0001457260 00000 n +0001464957 00000 n +0001465016 00000 n +0001465075 00000 n +0001465134 00000 n +0001465193 00000 n +0001465252 00000 n +0001465310 00000 n +0001465369 00000 n +0001465428 00000 n +0001465487 00000 n +0001465546 00000 n +0001465605 00000 n +0001465664 00000 n +0001465723 00000 n +0001465782 00000 n +0001468602 00000 n +0001468803 00000 n +0001469037 00000 n +0001469263 00000 n +0001469496 00000 n +0001469697 00000 n +0001469898 00000 n +0001470132 00000 n +0001470333 00000 n +0001470567 00000 n +0001470768 00000 n +0001471169 00000 n +0001471370 00000 n +0001471563 00000 n +0001472091 00000 n +0001468089 00000 n +0001465981 00000 n +0001471737 00000 n +0001471796 00000 n +0001471855 00000 n +0001471914 00000 n +0001471973 00000 n +0001470969 00000 n +0001472032 00000 n +0001479115 00000 n +0001479233 00000 n +0001479350 00000 n +0001474688 00000 n +0001474921 00000 n +0001474544 00000 n +0001472241 00000 n +0001474862 00000 n +0002869217 00000 n +0001477326 00000 n +0001477711 00000 n +0001477939 00000 n +0001478173 00000 n +0001478401 00000 n +0001479532 00000 n +0001477137 00000 n +0001475108 00000 n +0001478575 00000 n +0001478634 00000 n +0001478752 00000 n +0001478875 00000 n +0001477519 00000 n +0001478997 00000 n +0001479056 00000 n +0001479174 00000 n +0001479292 00000 n +0001479414 00000 n +0001481346 00000 n +0001481559 00000 n +0001481809 00000 n +0001482061 00000 n +0001482313 00000 n +0001482566 00000 n +0001482758 00000 n +0001483010 00000 n +0001483203 00000 n +0001483456 00000 n +0001483709 00000 n +0001483961 00000 n +0001484212 00000 n +0001484465 00000 n +0001484682 00000 n +0001485082 00000 n +0001486081 00000 n +0001481058 00000 n +0001479671 00000 n +0001485256 00000 n +0001485373 00000 n +0001485432 00000 n +0001485491 00000 n +0001485550 00000 n +0001485609 00000 n +0001485668 00000 n +0001485727 00000 n +0001485786 00000 n +0001485845 00000 n +0001485904 00000 n +0001485963 00000 n +0001486022 00000 n +0001484882 00000 n +0001488014 00000 n +0001488220 00000 n +0001488446 00000 n +0001488672 00000 n +0001488898 00000 n +0001489086 00000 n +0001489312 00000 n +0001489506 00000 n +0001489732 00000 n +0001489959 00000 n +0001490153 00000 n +0001490380 00000 n +0001490607 00000 n +0001490795 00000 n +0001491675 00000 n +0001487753 00000 n +0001486233 00000 n +0001490969 00000 n +0001491144 00000 n +0001491203 00000 n +0001491262 00000 n +0001491321 00000 n +0001491380 00000 n +0001491439 00000 n +0001491498 00000 n +0001491557 00000 n +0001491616 00000 n +0001494816 00000 n +0001493641 00000 n +0001493838 00000 n +0001494077 00000 n +0001494271 00000 n +0001494465 00000 n +0001495285 00000 n +0001493461 00000 n +0001491841 00000 n +0001494639 00000 n +0001494698 00000 n +0001494757 00000 n +0001494875 00000 n +0001495051 00000 n +0001495110 00000 n +0001495169 00000 n +0001497882 00000 n +0001498101 00000 n +0001498287 00000 n +0001498505 00000 n +0001498708 00000 n +0001498927 00000 n +0001499130 00000 n +0001499349 00000 n +0001499566 00000 n +0001499785 00000 n +0001500222 00000 n +0001500440 00000 n +0001500618 00000 n +0001500837 00000 n +0001501270 00000 n +0001501472 00000 n +0001502235 00000 n +0001497585 00000 n +0001495449 00000 n +0001501646 00000 n +0001501763 00000 n +0001501822 00000 n +0001501881 00000 n +0001501940 00000 n +0001501999 00000 n +0001502058 00000 n +0001502117 00000 n +0001502176 00000 n +0001500004 00000 n +0001501054 00000 n +0001510325 00000 n +0001510443 00000 n +0001510560 00000 n +0001505166 00000 n +0001505602 00000 n +0001505806 00000 n +0001506025 00000 n +0001506244 00000 n +0001506463 00000 n +0001506648 00000 n +0001507018 00000 n +0001507428 00000 n +0001504941 00000 n +0001502415 00000 n +0001507192 00000 n +0001505384 00000 n +0001507251 00000 n +0001506834 00000 n +0001507310 00000 n +0001507369 00000 n +0002869343 00000 n +0001510678 00000 n +0001510796 00000 n +0001513702 00000 n +0001513882 00000 n +0001509854 00000 n +0001510033 00000 n +0001510854 00000 n +0001509701 00000 n +0001507580 00000 n +0001510207 00000 n +0001510266 00000 n +0001510384 00000 n +0001510502 00000 n +0001510619 00000 n +0001510737 00000 n +0001513410 00000 n +0001514351 00000 n +0001513266 00000 n +0001511020 00000 n +0001513584 00000 n +0001513643 00000 n +0001513764 00000 n +0001513823 00000 n +0001513941 00000 n +0001514116 00000 n +0001514175 00000 n +0001516310 00000 n +0001516536 00000 n +0001516763 00000 n +0001516990 00000 n +0001517186 00000 n +0001517414 00000 n +0001517641 00000 n +0001517868 00000 n +0001518054 00000 n +0001518279 00000 n +0001518465 00000 n +0001519462 00000 n +0001516076 00000 n +0001514504 00000 n +0001518639 00000 n +0001518698 00000 n +0001518757 00000 n +0001518933 00000 n +0001518992 00000 n +0001519168 00000 n +0001519227 00000 n +0001519286 00000 n +0001519344 00000 n +0001519403 00000 n +0001555561 00000 n +0001555679 00000 n +0001521715 00000 n +0001521942 00000 n +0001522128 00000 n +0001522355 00000 n +0001522548 00000 n +0001522775 00000 n +0001522963 00000 n +0001523166 00000 n +0001523395 00000 n +0001523624 00000 n +0001523810 00000 n +0001524039 00000 n +0001524242 00000 n +0001524471 00000 n +0001524674 00000 n +0001524903 00000 n +0001525131 00000 n +0001525360 00000 n +0001525589 00000 n +0001525817 00000 n +0001526046 00000 n +0001526275 00000 n +0001526504 00000 n +0001529404 00000 n +0001529608 00000 n +0001529837 00000 n +0001526700 00000 n +0001527580 00000 n +0001521364 00000 n +0001519614 00000 n +0001526874 00000 n +0001526933 00000 n +0001526992 00000 n +0001527050 00000 n +0001527109 00000 n +0001527168 00000 n +0001527227 00000 n +0001527286 00000 n +0001527345 00000 n +0001527404 00000 n +0001527462 00000 n +0001527521 00000 n +0001558972 00000 n +0001559094 00000 n +0001559217 00000 n +0001530033 00000 n +0001530262 00000 n +0001530491 00000 n +0001530687 00000 n +0001530915 00000 n +0001531109 00000 n +0001531338 00000 n +0001531534 00000 n +0001531730 00000 n +0001531923 00000 n +0001532151 00000 n +0001532346 00000 n +0001532540 00000 n +0001532769 00000 n +0001532962 00000 n +0001533156 00000 n +0001533385 00000 n +0001533570 00000 n +0001533766 00000 n +0001533960 00000 n +0001534189 00000 n +0001534374 00000 n +0001534560 00000 n +0001534754 00000 n +0001534983 00000 n +0001535179 00000 n +0001535373 00000 n +0001535602 00000 n +0001535798 00000 n +0001535994 00000 n +0001536187 00000 n +0001536415 00000 n +0001536599 00000 n +0001536784 00000 n +0001536978 00000 n +0001537207 00000 n +0001537403 00000 n +0001537597 00000 n +0001537826 00000 n +0001538022 00000 n +0001538216 00000 n +0001538445 00000 n +0001538630 00000 n +0001541414 00000 n +0001541608 00000 n +0001541837 00000 n +0001542033 00000 n +0001538826 00000 n +0001539412 00000 n +0001528846 00000 n +0001527720 00000 n +0001539000 00000 n +0001539059 00000 n +0001539118 00000 n +0001539177 00000 n +0001539236 00000 n +0001539354 00000 n +0001559399 00000 n +0001559517 00000 n +0001559635 00000 n +0001559753 00000 n +0001561772 00000 n +0001561890 00000 n +0001562008 00000 n +0001562126 00000 n +0001562244 00000 n +0001562362 00000 n +0001562480 00000 n +0001542219 00000 n +0001542413 00000 n +0001542642 00000 n +0001542838 00000 n +0001543032 00000 n +0001543261 00000 n +0001543457 00000 n +0001543651 00000 n +0001543878 00000 n +0001544073 00000 n +0001544269 00000 n +0001544463 00000 n +0001544690 00000 n +0001544885 00000 n +0001545071 00000 n +0001545265 00000 n +0001545492 00000 n +0001545687 00000 n +0001545880 00000 n +0001546106 00000 n +0001546299 00000 n +0001546494 00000 n +0001546688 00000 n +0001546915 00000 n +0001547109 00000 n +0001547295 00000 n +0001547489 00000 n +0001547716 00000 n +0001547910 00000 n +0001548104 00000 n +0001548331 00000 n +0001548527 00000 n +0001548721 00000 n +0001548950 00000 n +0001549146 00000 n +0001549332 00000 n +0001549526 00000 n +0001549755 00000 n +0001549951 00000 n +0001550180 00000 n +0001550376 00000 n +0001550603 00000 n +0001550798 00000 n +0001551187 00000 n +0001551479 00000 n +0001540838 00000 n +0001539524 00000 n +0001551361 00000 n +0001551420 00000 n +0001550992 00000 n +0002869469 00000 n +0001562598 00000 n +0001562714 00000 n +0001562832 00000 n +0001562950 00000 n +0001565968 00000 n +0001566086 00000 n +0001566203 00000 n +0001566321 00000 n +0001566439 00000 n +0001566557 00000 n +0001566675 00000 n +0001566791 00000 n +0001566909 00000 n +0001574153 00000 n +0001554186 00000 n +0001554381 00000 n +0001554567 00000 n +0001554752 00000 n +0001555210 00000 n +0001555738 00000 n +0001553997 00000 n +0001551631 00000 n +0001555384 00000 n +0001555443 00000 n +0001555502 00000 n +0001555620 00000 n +0001554981 00000 n +0001558680 00000 n +0001559812 00000 n +0001558536 00000 n +0001555939 00000 n +0001558854 00000 n +0001558913 00000 n +0001559035 00000 n +0001559158 00000 n +0001559281 00000 n +0001559340 00000 n +0001559458 00000 n +0001559576 00000 n +0001559694 00000 n +0001561480 00000 n +0001563009 00000 n +0001561336 00000 n +0001560050 00000 n +0001561654 00000 n +0001561713 00000 n +0001561831 00000 n +0001561949 00000 n +0001562067 00000 n +0001562185 00000 n +0001562303 00000 n +0001562421 00000 n +0001562539 00000 n +0001562656 00000 n +0001562773 00000 n +0001562891 00000 n +0001564761 00000 n +0001565219 00000 n +0001565676 00000 n +0001566967 00000 n +0001564581 00000 n +0001563135 00000 n +0001565850 00000 n +0001565909 00000 n +0001566027 00000 n +0001564990 00000 n +0001566145 00000 n +0001566262 00000 n +0001566380 00000 n +0001565447 00000 n +0001566498 00000 n +0001566616 00000 n +0001566733 00000 n +0001566850 00000 n +0001569458 00000 n +0001569681 00000 n +0001569936 00000 n +0001570159 00000 n +0001570414 00000 n +0001570923 00000 n +0001571178 00000 n +0001571399 00000 n +0001571621 00000 n +0001571825 00000 n +0001572047 00000 n +0001572251 00000 n +0001572443 00000 n +0001572834 00000 n +0001573038 00000 n +0001573260 00000 n +0001573463 00000 n +0001573658 00000 n +0001576850 00000 n +0001577072 00000 n +0001577276 00000 n +0001577472 00000 n +0001577668 00000 n +0001573861 00000 n +0001574564 00000 n +0001569134 00000 n +0001567093 00000 n +0001574035 00000 n +0001574094 00000 n +0001574212 00000 n +0001574388 00000 n +0001570669 00000 n +0001574446 00000 n +0001574505 00000 n +0001572639 00000 n +0001603561 00000 n +0001603679 00000 n +0001603742 00000 n +0001603860 00000 n +0001603924 00000 n +0001603988 00000 n +0001604111 00000 n +0001604229 00000 n +0001607776 00000 n +0001577871 00000 n +0001578093 00000 n +0001578283 00000 n +0001578505 00000 n +0001578694 00000 n +0001578915 00000 n +0001579105 00000 n +0001579308 00000 n +0001579531 00000 n +0001579723 00000 n +0001579946 00000 n +0001580168 00000 n +0001580391 00000 n +0001580613 00000 n +0001580836 00000 n +0001581032 00000 n +0001581255 00000 n +0001581457 00000 n +0001581679 00000 n +0001581902 00000 n +0001582125 00000 n +0001582328 00000 n +0001582551 00000 n +0001582742 00000 n +0001582965 00000 n +0001583153 00000 n +0001583376 00000 n +0001583571 00000 n +0001583794 00000 n +0001587268 00000 n +0001587491 00000 n +0001583990 00000 n +0001584753 00000 n +0001576400 00000 n +0001574745 00000 n +0001584164 00000 n +0001584223 00000 n +0001584282 00000 n +0001584341 00000 n +0001584400 00000 n +0001584459 00000 n +0001584517 00000 n +0001584576 00000 n +0001584635 00000 n +0001584694 00000 n +0002869595 00000 n +0001607893 00000 n +0001610608 00000 n +0001610726 00000 n +0001610849 00000 n +0001610972 00000 n +0001611090 00000 n +0001611207 00000 n +0001587694 00000 n +0001587917 00000 n +0001588118 00000 n +0001588341 00000 n +0001588563 00000 n +0001588750 00000 n +0001588954 00000 n +0001589360 00000 n +0001589546 00000 n +0001589768 00000 n +0001589954 00000 n +0001590176 00000 n +0001590399 00000 n +0001590602 00000 n +0001590805 00000 n +0001591028 00000 n +0001591251 00000 n +0001591474 00000 n +0001591697 00000 n +0001591920 00000 n +0001592143 00000 n +0001592346 00000 n +0001592569 00000 n +0001592772 00000 n +0001592995 00000 n +0001593218 00000 n +0001593408 00000 n +0001593630 00000 n +0001593853 00000 n +0001597342 00000 n +0001597565 00000 n +0001594076 00000 n +0001594897 00000 n +0001586836 00000 n +0001584892 00000 n +0001594250 00000 n +0001594309 00000 n +0001589158 00000 n +0002859395 00000 n +0001594368 00000 n +0001594426 00000 n +0001594485 00000 n +0001594544 00000 n +0001594603 00000 n +0001594662 00000 n +0001594720 00000 n +0001594779 00000 n +0001594838 00000 n +0001613550 00000 n +0001613668 00000 n +0001613786 00000 n +0001613904 00000 n +0001614022 00000 n +0001618423 00000 n +0001597788 00000 n +0001597991 00000 n +0001598213 00000 n +0001598403 00000 n +0001598626 00000 n +0001598816 00000 n +0001599038 00000 n +0001599228 00000 n +0001599607 00000 n +0001599802 00000 n +0001599992 00000 n +0001600182 00000 n +0001600710 00000 n +0001597072 00000 n +0001595051 00000 n +0001600356 00000 n +0001600415 00000 n +0001600474 00000 n +0001600533 00000 n +0001600592 00000 n +0001599418 00000 n +0001600651 00000 n +0001618599 00000 n +0001618717 00000 n +0001603046 00000 n +0001606874 00000 n +0001603269 00000 n +0001604347 00000 n +0001602893 00000 n +0001600835 00000 n +0001603443 00000 n +0001603502 00000 n +0001603620 00000 n +0001603801 00000 n +0001604052 00000 n +0001604170 00000 n +0001604288 00000 n +0001607097 00000 n +0001607320 00000 n +0001607543 00000 n +0001608011 00000 n +0001606703 00000 n +0001604498 00000 n +0001607717 00000 n +0001607835 00000 n +0001607952 00000 n +0001610093 00000 n +0001610316 00000 n +0001611265 00000 n +0001609940 00000 n +0001608162 00000 n +0001610490 00000 n +0001610549 00000 n +0001610667 00000 n +0001610790 00000 n +0001610913 00000 n +0001611031 00000 n +0001611148 00000 n +0001613258 00000 n +0001614080 00000 n +0001613114 00000 n +0001611403 00000 n +0001613432 00000 n +0001613491 00000 n +0001613609 00000 n +0001613727 00000 n +0001613845 00000 n +0001613963 00000 n +0002869721 00000 n +0001616283 00000 n +0001616470 00000 n +0001616695 00000 n +0001616899 00000 n +0001617103 00000 n +0001617328 00000 n +0001617523 00000 n +0001617746 00000 n +0001617940 00000 n +0001621134 00000 n +0001621359 00000 n +0001618131 00000 n +0001619009 00000 n +0001616058 00000 n +0001614219 00000 n +0001618305 00000 n +0001618364 00000 n +0001618482 00000 n +0001618540 00000 n +0001618658 00000 n +0001618776 00000 n +0001618950 00000 n +0001633330 00000 n +0001633448 00000 n +0001633570 00000 n +0001621553 00000 n +0001621778 00000 n +0001621973 00000 n +0001622166 00000 n +0001622391 00000 n +0001622586 00000 n +0001622811 00000 n +0001623007 00000 n +0001623200 00000 n +0001623425 00000 n +0001623614 00000 n +0001623818 00000 n +0001624042 00000 n +0001624222 00000 n +0001624407 00000 n +0001624609 00000 n +0001624834 00000 n +0001625015 00000 n +0001625218 00000 n +0001625443 00000 n +0001625630 00000 n +0001625834 00000 n +0001626058 00000 n +0001626251 00000 n +0001626454 00000 n +0001626679 00000 n +0001626872 00000 n +0001627076 00000 n +0001627268 00000 n +0001627494 00000 n +0001627687 00000 n +0001627879 00000 n +0001628105 00000 n +0001628296 00000 n +0001628521 00000 n +0001628746 00000 n +0001631736 00000 n +0001631962 00000 n +0001628938 00000 n +0001629406 00000 n +0001620648 00000 n +0001619174 00000 n +0001629112 00000 n +0001629171 00000 n +0001629229 00000 n +0001629288 00000 n +0001629347 00000 n +0001635625 00000 n +0001635743 00000 n +0001635861 00000 n +0001635979 00000 n +0001638294 00000 n +0001638412 00000 n +0001638530 00000 n +0001638648 00000 n +0001641107 00000 n +0001641282 00000 n +0001632155 00000 n +0001632348 00000 n +0001632538 00000 n +0001632730 00000 n +0001632920 00000 n +0001633629 00000 n +0001631538 00000 n +0001629572 00000 n +0001633094 00000 n +0001633153 00000 n +0001633212 00000 n +0001633271 00000 n +0001633389 00000 n +0001633512 00000 n +0001635333 00000 n +0001636037 00000 n +0001635189 00000 n +0001633795 00000 n +0001635507 00000 n +0001635566 00000 n +0001635684 00000 n +0001635802 00000 n +0001635920 00000 n +0001638002 00000 n +0001638706 00000 n +0001637858 00000 n +0001636150 00000 n +0001638176 00000 n +0001638235 00000 n +0001638353 00000 n +0001638471 00000 n +0001638589 00000 n +0001643526 00000 n +0001643749 00000 n +0001640815 00000 n +0001641517 00000 n +0001640671 00000 n +0001638832 00000 n +0001640989 00000 n +0001641048 00000 n +0001641165 00000 n +0001641223 00000 n +0001641341 00000 n +0002869847 00000 n +0001643973 00000 n +0001644196 00000 n +0001644401 00000 n +0001644628 00000 n +0001644821 00000 n +0001648528 00000 n +0001645048 00000 n +0001646046 00000 n +0001643319 00000 n +0001641670 00000 n +0001645222 00000 n +0001645281 00000 n +0001645340 00000 n +0001645399 00000 n +0001645458 00000 n +0001645517 00000 n +0001645576 00000 n +0001645635 00000 n +0001645694 00000 n +0001645869 00000 n +0001645928 00000 n +0001645987 00000 n +0001648755 00000 n +0001648981 00000 n +0001649208 00000 n +0001649435 00000 n +0001649662 00000 n +0001649864 00000 n +0001650090 00000 n +0001650293 00000 n +0001650520 00000 n +0001650745 00000 n +0001650972 00000 n +0001651176 00000 n +0001651380 00000 n +0001651607 00000 n +0001651801 00000 n +0001652005 00000 n +0001652232 00000 n +0001652426 00000 n +0001652630 00000 n +0001652857 00000 n +0001653051 00000 n +0001653278 00000 n +0001653472 00000 n +0001653697 00000 n +0001653888 00000 n +0001654115 00000 n +0001654303 00000 n +0001657713 00000 n +0001657940 00000 n +0001658121 00000 n +0001658307 00000 n +0001654507 00000 n +0001655152 00000 n +0001648132 00000 n +0001646212 00000 n +0001654681 00000 n +0001654740 00000 n +0001654799 00000 n +0001654858 00000 n +0001654917 00000 n +0001654976 00000 n +0001655035 00000 n +0001655094 00000 n +0001792524 00000 n +0001732532 00000 n +0001735274 00000 n +0001735392 00000 n +0001735515 00000 n +0001735638 00000 n +0001735756 00000 n +0001738282 00000 n +0001658511 00000 n +0001658737 00000 n +0001658916 00000 n +0001659117 00000 n +0001659344 00000 n +0001659531 00000 n +0001659734 00000 n +0001659927 00000 n +0001660153 00000 n +0001660346 00000 n +0001660571 00000 n +0001660764 00000 n +0001660991 00000 n +0001661195 00000 n +0001661421 00000 n +0001661625 00000 n +0001661852 00000 n +0001662040 00000 n +0001662235 00000 n +0001662459 00000 n +0001662655 00000 n +0001662881 00000 n +0001663075 00000 n +0001663300 00000 n +0001663496 00000 n +0001663723 00000 n +0001663950 00000 n +0001664144 00000 n +0001664371 00000 n +0001664564 00000 n +0001664790 00000 n +0001664983 00000 n +0001665178 00000 n +0001665402 00000 n +0001668711 00000 n +0001668908 00000 n +0001669134 00000 n +0001665587 00000 n +0001666351 00000 n +0001657227 00000 n +0001655319 00000 n +0001665761 00000 n +0001665820 00000 n +0001665879 00000 n +0001665938 00000 n +0001665997 00000 n +0001666056 00000 n +0001666115 00000 n +0001666174 00000 n +0001666233 00000 n +0001666292 00000 n +0001738400 00000 n +0001738523 00000 n +0001738641 00000 n +0001741217 00000 n +0001741335 00000 n +0001741453 00000 n +0001741571 00000 n +0001669321 00000 n +0001669517 00000 n +0001669742 00000 n +0001669927 00000 n +0001670153 00000 n +0001670380 00000 n +0001670605 00000 n +0001670832 00000 n +0001671059 00000 n +0001671286 00000 n +0001671513 00000 n +0001671699 00000 n +0001671926 00000 n +0001672122 00000 n +0001672349 00000 n +0001672544 00000 n +0001672770 00000 n +0001672966 00000 n +0001673170 00000 n +0001673374 00000 n +0001673600 00000 n +0001673796 00000 n +0001674000 00000 n +0001674204 00000 n +0001674390 00000 n +0001674617 00000 n +0001674813 00000 n +0001675016 00000 n +0001675219 00000 n +0001675446 00000 n +0001675642 00000 n +0001675845 00000 n +0001676048 00000 n +0001679258 00000 n +0001676235 00000 n +0001676821 00000 n +0001668243 00000 n +0001666531 00000 n +0001676409 00000 n +0001676468 00000 n +0001676527 00000 n +0001676586 00000 n +0001676645 00000 n +0001676703 00000 n +0001676762 00000 n +0001741688 00000 n +0001744008 00000 n +0001744126 00000 n +0001744244 00000 n +0001744362 00000 n +0001744480 00000 n +0001747127 00000 n +0001747249 00000 n +0001750108 00000 n +0001679485 00000 n +0001679710 00000 n +0001679898 00000 n +0001680123 00000 n +0001680319 00000 n +0001680544 00000 n +0001680740 00000 n +0001680965 00000 n +0001681153 00000 n +0001681377 00000 n +0001681571 00000 n +0001681796 00000 n +0001681992 00000 n +0001682217 00000 n +0001682405 00000 n +0001682629 00000 n +0001682817 00000 n +0001683041 00000 n +0001683237 00000 n +0001683462 00000 n +0001683658 00000 n +0001683883 00000 n +0001684069 00000 n +0001684234 00000 n +0001684458 00000 n +0001684649 00000 n +0001684814 00000 n +0001685039 00000 n +0001685232 00000 n +0001685457 00000 n +0001685650 00000 n +0001685876 00000 n +0001686068 00000 n +0001686292 00000 n +0001690323 00000 n +0001690550 00000 n +0001690744 00000 n +0001686485 00000 n +0001686777 00000 n +0001678799 00000 n +0001676960 00000 n +0001686659 00000 n +0001686718 00000 n +0001750231 00000 n +0001750354 00000 n +0001750472 00000 n +0001752746 00000 n +0001752864 00000 n +0001752982 00000 n +0001755186 00000 n +0001755304 00000 n +0001755422 00000 n +0001755539 00000 n +0001758381 00000 n +0001758498 00000 n +0001758616 00000 n +0001758734 00000 n +0001761668 00000 n +0001761785 00000 n +0001690923 00000 n +0001691149 00000 n +0001691334 00000 n +0001691529 00000 n +0001691693 00000 n +0001691920 00000 n +0001692106 00000 n +0001692302 00000 n +0001692464 00000 n +0001692689 00000 n +0001692873 00000 n +0001693075 00000 n +0001693269 00000 n +0001693445 00000 n +0001693671 00000 n +0001693866 00000 n +0001694069 00000 n +0001694265 00000 n +0001694442 00000 n +0001694669 00000 n +0001694854 00000 n +0001695050 00000 n +0001695442 00000 n +0001695629 00000 n +0001695856 00000 n +0001696042 00000 n +0001696246 00000 n +0001696638 00000 n +0001696814 00000 n +0001697041 00000 n +0001697237 00000 n +0001697441 00000 n +0001697637 00000 n +0001697812 00000 n +0001698038 00000 n +0001698223 00000 n +0001698418 00000 n +0001698809 00000 n +0001698996 00000 n +0001699220 00000 n +0001699414 00000 n +0001699583 00000 n +0001699808 00000 n +0001700033 00000 n +0001700227 00000 n +0001703529 00000 n +0001703756 00000 n +0001700393 00000 n +0001700685 00000 n +0001689720 00000 n +0001686916 00000 n +0001700567 00000 n +0001695246 00000 n +0001696442 00000 n +0001698613 00000 n +0001700626 00000 n +0002869973 00000 n +0001761903 00000 n +0001762020 00000 n +0001765326 00000 n +0001765444 00000 n +0001765562 00000 n +0001768904 00000 n +0001769022 00000 n +0001769140 00000 n +0001772645 00000 n +0001772763 00000 n +0001772881 00000 n +0001703950 00000 n +0001704117 00000 n +0001704342 00000 n +0001704536 00000 n +0001704699 00000 n +0001704923 00000 n +0001705117 00000 n +0001705344 00000 n +0001705538 00000 n +0001705929 00000 n +0001706092 00000 n +0001706317 00000 n +0001706511 00000 n +0001706677 00000 n +0001706903 00000 n +0001707097 00000 n +0001707293 00000 n +0001707460 00000 n +0001707684 00000 n +0001707887 00000 n +0001708112 00000 n +0001708315 00000 n +0001708540 00000 n +0001708733 00000 n +0001708904 00000 n +0001709128 00000 n +0001709320 00000 n +0001709545 00000 n +0001709749 00000 n +0001709974 00000 n +0001710164 00000 n +0001710389 00000 n +0001710575 00000 n +0001710779 00000 n +0001711002 00000 n +0001711193 00000 n +0001713985 00000 n +0001714189 00000 n +0001711378 00000 n +0001711670 00000 n +0001703034 00000 n +0001700892 00000 n +0001711552 00000 n +0001711611 00000 n +0001705734 00000 n +0001776263 00000 n +0001776379 00000 n +0001776497 00000 n +0001779930 00000 n +0001780047 00000 n +0001780165 00000 n +0001783783 00000 n +0001783901 00000 n +0001784019 00000 n +0001784135 00000 n +0001788252 00000 n +0001788370 00000 n +0001788493 00000 n +0001714416 00000 n +0001714643 00000 n +0001714870 00000 n +0001715095 00000 n +0001715288 00000 n +0001715481 00000 n +0001715707 00000 n +0001715900 00000 n +0001716126 00000 n +0001716319 00000 n +0001716512 00000 n +0001716739 00000 n +0001716932 00000 n +0001717124 00000 n +0001717317 00000 n +0001717520 00000 n +0001717745 00000 n +0001717936 00000 n +0001718129 00000 n +0001718323 00000 n +0001718527 00000 n +0001718752 00000 n +0001718944 00000 n +0001719137 00000 n +0001719331 00000 n +0001719535 00000 n +0001719761 00000 n +0001719954 00000 n +0001720147 00000 n +0001720341 00000 n +0001724451 00000 n +0001724677 00000 n +0001724869 00000 n +0001725062 00000 n +0001725256 00000 n +0001720545 00000 n +0001721131 00000 n +0001713553 00000 n +0001711836 00000 n +0001720719 00000 n +0001720778 00000 n +0001720837 00000 n +0001720896 00000 n +0001720955 00000 n +0001721014 00000 n +0001721072 00000 n +0001792706 00000 n +0001792824 00000 n +0001792947 00000 n +0001793070 00000 n +0001795751 00000 n +0001795874 00000 n +0001795997 00000 n +0001725460 00000 n +0001725686 00000 n +0001725878 00000 n +0001726071 00000 n +0001726265 00000 n +0001726469 00000 n +0001726695 00000 n +0001726889 00000 n +0001727276 00000 n +0001727479 00000 n +0001727706 00000 n +0001727910 00000 n +0001728101 00000 n +0001728452 00000 n +0001724145 00000 n +0001721270 00000 n +0001728275 00000 n +0001727083 00000 n +0001728334 00000 n +0001728393 00000 n +0001798698 00000 n +0001798821 00000 n +0001798944 00000 n +0001799067 00000 n +0001731677 00000 n +0001731864 00000 n +0001732052 00000 n +0001732240 00000 n +0001732650 00000 n +0001731506 00000 n +0001728656 00000 n +0001732414 00000 n +0001732473 00000 n +0001732591 00000 n +0001734876 00000 n +0001735041 00000 n +0001735874 00000 n +0001734723 00000 n +0001732852 00000 n +0001735215 00000 n +0001735333 00000 n +0001735456 00000 n +0001735579 00000 n +0001735697 00000 n +0001735815 00000 n +0001738049 00000 n +0001738700 00000 n +0001737905 00000 n +0001736000 00000 n +0001738223 00000 n +0001738341 00000 n +0001738464 00000 n +0001738582 00000 n +0002870099 00000 n +0001740866 00000 n +0001741746 00000 n +0001740722 00000 n +0001738826 00000 n +0001741040 00000 n +0001741099 00000 n +0001741158 00000 n +0001741276 00000 n +0001741394 00000 n +0001741512 00000 n +0001741629 00000 n +0001743716 00000 n +0001744598 00000 n +0001743572 00000 n +0001741885 00000 n +0001743890 00000 n +0001743949 00000 n +0001744067 00000 n +0001744185 00000 n +0001744303 00000 n +0001744421 00000 n +0001744539 00000 n +0001746894 00000 n +0001747372 00000 n +0001746750 00000 n +0001744737 00000 n +0001747068 00000 n +0001747191 00000 n +0001747313 00000 n +0001749875 00000 n +0001750530 00000 n +0001749731 00000 n +0001747511 00000 n +0001750049 00000 n +0001750172 00000 n +0001750295 00000 n +0001750413 00000 n +0001752454 00000 n +0001753100 00000 n +0001752310 00000 n +0001750669 00000 n +0001752628 00000 n +0001752687 00000 n +0001752805 00000 n +0001752923 00000 n +0001753041 00000 n +0001754953 00000 n +0001755598 00000 n +0001754809 00000 n +0001753239 00000 n +0001755127 00000 n +0001755245 00000 n +0001755363 00000 n +0001755480 00000 n +0002870225 00000 n +0001757576 00000 n +0001757738 00000 n +0001757903 00000 n +0001758089 00000 n +0001758793 00000 n +0001757405 00000 n +0001755737 00000 n +0001758263 00000 n +0001758322 00000 n +0001758440 00000 n +0001758557 00000 n +0001758675 00000 n +0001761034 00000 n +0001761213 00000 n +0001761376 00000 n +0001762138 00000 n +0001760872 00000 n +0001758932 00000 n +0001761550 00000 n +0001761609 00000 n +0001761726 00000 n +0001761844 00000 n +0001761961 00000 n +0001762079 00000 n +0001764577 00000 n +0001764741 00000 n +0001764916 00000 n +0001765093 00000 n +0001765680 00000 n +0001764406 00000 n +0001762277 00000 n +0001765267 00000 n +0001765385 00000 n +0001765503 00000 n +0001765621 00000 n +0001768308 00000 n +0001768495 00000 n +0001771820 00000 n +0001768671 00000 n +0001769199 00000 n +0001768146 00000 n +0001765856 00000 n +0001768845 00000 n +0001768963 00000 n +0001769081 00000 n +0001771997 00000 n +0001772184 00000 n +0001774969 00000 n +0001772353 00000 n +0001772940 00000 n +0001771649 00000 n +0001769375 00000 n +0001772527 00000 n +0001772586 00000 n +0001772704 00000 n +0001772822 00000 n +0001775136 00000 n +0001775304 00000 n +0001775471 00000 n +0001775639 00000 n +0001775803 00000 n +0001778805 00000 n +0001775971 00000 n +0001776556 00000 n +0001774771 00000 n +0001773116 00000 n +0001776145 00000 n +0001776204 00000 n +0001776321 00000 n +0001776438 00000 n +0002870351 00000 n +0001778969 00000 n +0001779137 00000 n +0001779304 00000 n +0001779470 00000 n +0001779638 00000 n +0001780224 00000 n +0001778616 00000 n +0001776708 00000 n +0001779812 00000 n +0001779871 00000 n +0001779988 00000 n +0001780106 00000 n +0001782723 00000 n +0001782894 00000 n +0001783119 00000 n +0001783305 00000 n +0001783491 00000 n +0001784193 00000 n +0001782543 00000 n +0001780376 00000 n +0001783665 00000 n +0001783724 00000 n +0001783842 00000 n +0001783960 00000 n +0001784078 00000 n +0001787184 00000 n +0001787374 00000 n +0001787564 00000 n +0001787791 00000 n +0001787960 00000 n +0001788555 00000 n +0001787004 00000 n +0001784381 00000 n +0001788134 00000 n +0001788193 00000 n +0001788311 00000 n +0001788434 00000 n +0001791695 00000 n +0001791880 00000 n +0001792066 00000 n +0001792232 00000 n +0001793193 00000 n +0001791524 00000 n +0001788706 00000 n +0001792406 00000 n +0001792465 00000 n +0001792588 00000 n +0001792647 00000 n +0001792765 00000 n +0001792888 00000 n +0001793011 00000 n +0001793134 00000 n +0001795518 00000 n +0001796120 00000 n +0001795374 00000 n +0001793344 00000 n +0001795692 00000 n +0001795815 00000 n +0001795938 00000 n +0001796061 00000 n +0001798465 00000 n +0001799243 00000 n +0001798321 00000 n +0001796246 00000 n +0001798639 00000 n +0001798762 00000 n +0001798885 00000 n +0001799008 00000 n +0001799126 00000 n +0002870477 00000 n +0001801352 00000 n +0001801589 00000 n +0001801793 00000 n +0001801997 00000 n +0001802234 00000 n +0001802430 00000 n +0001802667 00000 n +0001802861 00000 n +0001803098 00000 n +0001803294 00000 n +0001803531 00000 n +0001803727 00000 n +0001803963 00000 n +0001804153 00000 n +0001804356 00000 n +0001804593 00000 n +0001804786 00000 n +0001804990 00000 n +0001805227 00000 n +0001805409 00000 n +0001805613 00000 n +0001805850 00000 n +0001806031 00000 n +0001806217 00000 n +0001806421 00000 n +0001806657 00000 n +0001806843 00000 n +0001807046 00000 n +0001807283 00000 n +0001807477 00000 n +0001810345 00000 n +0001810582 00000 n +0001810787 00000 n +0001807680 00000 n +0001808030 00000 n +0001800938 00000 n +0001799382 00000 n +0001807854 00000 n +0001807971 00000 n +0001881290 00000 n +0001883494 00000 n +0001883612 00000 n +0001883730 00000 n +0001886006 00000 n +0001886124 00000 n +0001886242 00000 n +0001888764 00000 n +0001888882 00000 n +0001888999 00000 n +0001891472 00000 n +0001810990 00000 n +0001811227 00000 n +0001811432 00000 n +0001811635 00000 n +0001811838 00000 n +0001812075 00000 n +0001812279 00000 n +0001812517 00000 n +0001812721 00000 n +0001812958 00000 n +0001813160 00000 n +0001813396 00000 n +0001813585 00000 n +0001813755 00000 n +0001813992 00000 n +0001814230 00000 n +0001814426 00000 n +0001814662 00000 n +0001814858 00000 n +0001815095 00000 n +0001815291 00000 n +0001815529 00000 n +0001815725 00000 n +0001815963 00000 n +0001816158 00000 n +0001816393 00000 n +0001816578 00000 n +0001816774 00000 n +0001817010 00000 n +0001817196 00000 n +0001817393 00000 n +0001817630 00000 n +0001821417 00000 n +0001821655 00000 n +0001817816 00000 n +0001818873 00000 n +0001809886 00000 n +0001808183 00000 n +0001817990 00000 n +0001818049 00000 n +0001818108 00000 n +0001818167 00000 n +0001818226 00000 n +0001818285 00000 n +0001818344 00000 n +0001818403 00000 n +0001818461 00000 n +0001818520 00000 n +0001818579 00000 n +0001818638 00000 n +0001818697 00000 n +0001818756 00000 n +0001818815 00000 n +0001891590 00000 n +0001821893 00000 n +0001822131 00000 n +0001822369 00000 n +0001822574 00000 n +0001822812 00000 n +0001823049 00000 n +0001823287 00000 n +0001823473 00000 n +0001823711 00000 n +0001823907 00000 n +0001824145 00000 n +0001824340 00000 n +0001824577 00000 n +0001824773 00000 n +0001824977 00000 n +0001825181 00000 n +0001825418 00000 n +0001825614 00000 n +0001825818 00000 n +0001826022 00000 n +0001826209 00000 n +0001826446 00000 n +0001826641 00000 n +0001826843 00000 n +0001827045 00000 n +0001827283 00000 n +0001827479 00000 n +0001827682 00000 n +0001827885 00000 n +0001828070 00000 n +0001828308 00000 n +0001828513 00000 n +0001828750 00000 n +0001831957 00000 n +0001828953 00000 n +0001829481 00000 n +0001820958 00000 n +0001819026 00000 n +0001829127 00000 n +0001829186 00000 n +0001829245 00000 n +0001829304 00000 n +0001829363 00000 n +0001829422 00000 n +0001893927 00000 n +0001894045 00000 n +0001894163 00000 n +0001894281 00000 n +0001894399 00000 n +0001897105 00000 n +0001897228 00000 n +0001899942 00000 n +0001900065 00000 n +0001900188 00000 n +0001832195 00000 n +0001832431 00000 n +0001832619 00000 n +0001832855 00000 n +0001833043 00000 n +0001833279 00000 n +0001833467 00000 n +0001833702 00000 n +0001833890 00000 n +0001834126 00000 n +0001834321 00000 n +0001834555 00000 n +0001834749 00000 n +0001834984 00000 n +0001835179 00000 n +0001835415 00000 n +0001835611 00000 n +0001835846 00000 n +0001836042 00000 n +0001836278 00000 n +0001836474 00000 n +0001836710 00000 n +0001836896 00000 n +0001837061 00000 n +0001837297 00000 n +0001837489 00000 n +0001837654 00000 n +0001837890 00000 n +0001838095 00000 n +0001838331 00000 n +0001838535 00000 n +0001838773 00000 n +0001842921 00000 n +0001843157 00000 n +0001843362 00000 n +0001843599 00000 n +0001843784 00000 n +0001838977 00000 n +0001839269 00000 n +0001831516 00000 n +0001829620 00000 n +0001839151 00000 n +0001839210 00000 n +0001902437 00000 n +0001902555 00000 n +0001902673 00000 n +0001902790 00000 n +0001904913 00000 n +0001905031 00000 n +0001905149 00000 n +0001905267 00000 n +0001907727 00000 n +0001907844 00000 n +0001907962 00000 n +0001910862 00000 n +0001910980 00000 n +0001911098 00000 n +0001911216 00000 n +0001843979 00000 n +0001844157 00000 n +0001844395 00000 n +0001844581 00000 n +0001844777 00000 n +0001844956 00000 n +0001845194 00000 n +0001845380 00000 n +0001845584 00000 n +0001845780 00000 n +0001845957 00000 n +0001846128 00000 n +0001846366 00000 n +0001846552 00000 n +0001846756 00000 n +0001847147 00000 n +0001847323 00000 n +0001847665 00000 n +0001847902 00000 n +0001848097 00000 n +0001848300 00000 n +0001848496 00000 n +0001848673 00000 n +0001848844 00000 n +0001849082 00000 n +0001849278 00000 n +0001849482 00000 n +0001849678 00000 n +0001849853 00000 n +0001850023 00000 n +0001850261 00000 n +0001850446 00000 n +0001850642 00000 n +0001851034 00000 n +0001851221 00000 n +0001851459 00000 n +0001851645 00000 n +0001851841 00000 n +0001852233 00000 n +0001852420 00000 n +0001852655 00000 n +0001852860 00000 n +0001853027 00000 n +0001853189 00000 n +0001853425 00000 n +0001853660 00000 n +0001857016 00000 n +0001857252 00000 n +0001853865 00000 n +0001854156 00000 n +0001842282 00000 n +0001839408 00000 n +0001854039 00000 n +0001846952 00000 n +0001847494 00000 n +0001850838 00000 n +0001852037 00000 n +0001854098 00000 n +0001911334 00000 n +0001914242 00000 n +0001914360 00000 n +0001914478 00000 n +0001918836 00000 n +0001918954 00000 n +0001922899 00000 n +0001923017 00000 n +0001923135 00000 n +0001926912 00000 n +0001927030 00000 n +0001857456 00000 n +0001857692 00000 n +0001857895 00000 n +0001858131 00000 n +0001858335 00000 n +0001858507 00000 n +0001858837 00000 n +0001859072 00000 n +0001859264 00000 n +0001859500 00000 n +0001859704 00000 n +0001859940 00000 n +0001860131 00000 n +0001860367 00000 n +0001860553 00000 n +0001860757 00000 n +0001860990 00000 n +0001861180 00000 n +0001861364 00000 n +0001861602 00000 n +0001861838 00000 n +0001862043 00000 n +0001862279 00000 n +0001862515 00000 n +0001862751 00000 n +0001862989 00000 n +0001863227 00000 n +0001863431 00000 n +0001863667 00000 n +0001863869 00000 n +0001866672 00000 n +0001864103 00000 n +0001864806 00000 n +0001856575 00000 n +0001854363 00000 n +0001864277 00000 n +0001858672 00000 n +0001864336 00000 n +0001864395 00000 n +0001864453 00000 n +0001864512 00000 n +0001864571 00000 n +0001864630 00000 n +0001864689 00000 n +0001864748 00000 n +0002870603 00000 n +0001927148 00000 n +0001931418 00000 n +0001931536 00000 n +0001931654 00000 n +0001931772 00000 n +0001935681 00000 n +0001935799 00000 n +0001940277 00000 n +0001866910 00000 n +0001867114 00000 n +0001867352 00000 n +0001867590 00000 n +0001867828 00000 n +0001868066 00000 n +0001868304 00000 n +0001868542 00000 n +0001868779 00000 n +0001869016 00000 n +0001869253 00000 n +0001869491 00000 n +0001869695 00000 n +0001870103 00000 n +0001871157 00000 n +0001866393 00000 n +0001864986 00000 n +0001870277 00000 n +0001870336 00000 n +0001870395 00000 n +0001870454 00000 n +0001870513 00000 n +0001870572 00000 n +0001870631 00000 n +0001870689 00000 n +0001870747 00000 n +0001870806 00000 n +0001870865 00000 n +0001870923 00000 n +0001870981 00000 n +0001871040 00000 n +0001871099 00000 n +0001869900 00000 n +0001940399 00000 n +0001940581 00000 n +0001874819 00000 n +0001875057 00000 n +0001875262 00000 n +0001875500 00000 n +0001875705 00000 n +0001876112 00000 n +0001876350 00000 n +0001876555 00000 n +0001876961 00000 n +0001877151 00000 n +0001877342 00000 n +0001877523 00000 n +0001880392 00000 n +0001877676 00000 n +0001878086 00000 n +0001874549 00000 n +0001871296 00000 n +0001877850 00000 n +0001877909 00000 n +0001875910 00000 n +0001876758 00000 n +0001877968 00000 n +0001878027 00000 n +0001940699 00000 n +0001945662 00000 n +0001945785 00000 n +0001880630 00000 n +0001880811 00000 n +0001880998 00000 n +0001881408 00000 n +0001880221 00000 n +0001878288 00000 n +0001881172 00000 n +0001881231 00000 n +0001881349 00000 n +0001883261 00000 n +0001883847 00000 n +0001883117 00000 n +0001881559 00000 n +0001883435 00000 n +0001883553 00000 n +0001883671 00000 n +0001883788 00000 n +0001885773 00000 n +0001886301 00000 n +0001885629 00000 n +0001883973 00000 n +0001885947 00000 n +0001886065 00000 n +0001886183 00000 n +0001888472 00000 n +0001889057 00000 n +0001888328 00000 n +0001886427 00000 n +0001888646 00000 n +0001888705 00000 n +0001888823 00000 n +0001888941 00000 n +0002870729 00000 n +0001891180 00000 n +0001891708 00000 n +0001891036 00000 n +0001889183 00000 n +0001891354 00000 n +0001891413 00000 n +0001891531 00000 n +0001891649 00000 n +0001893635 00000 n +0001894457 00000 n +0001893491 00000 n +0001891834 00000 n +0001893809 00000 n +0001893868 00000 n +0001893986 00000 n +0001894104 00000 n +0001894222 00000 n +0001894340 00000 n +0001896813 00000 n +0001897351 00000 n +0001896669 00000 n +0001894596 00000 n +0001896987 00000 n +0001897046 00000 n +0001897169 00000 n +0001897292 00000 n +0001899709 00000 n +0001900247 00000 n +0001899565 00000 n +0001897490 00000 n +0001899883 00000 n +0001900006 00000 n +0001900129 00000 n +0001902145 00000 n +0001902908 00000 n +0001902001 00000 n +0001900386 00000 n +0001902319 00000 n +0001902378 00000 n +0001902496 00000 n +0001902614 00000 n +0001902732 00000 n +0001902849 00000 n +0001904680 00000 n +0001905326 00000 n +0001904536 00000 n +0001903047 00000 n +0001904854 00000 n +0001904972 00000 n +0001905090 00000 n +0001905208 00000 n +0002870855 00000 n +0001907272 00000 n +0001907435 00000 n +0001908080 00000 n +0001907119 00000 n +0001905465 00000 n +0001907609 00000 n +0001907668 00000 n +0001907785 00000 n +0001907903 00000 n +0001908021 00000 n +0001910278 00000 n +0001910443 00000 n +0001910629 00000 n +0001911392 00000 n +0001910116 00000 n +0001908219 00000 n +0001910803 00000 n +0001910921 00000 n +0001911039 00000 n +0001911157 00000 n +0001911275 00000 n +0001913593 00000 n +0001913771 00000 n +0001917120 00000 n +0001917297 00000 n +0001913950 00000 n +0001914536 00000 n +0001913431 00000 n +0001911531 00000 n +0001914124 00000 n +0001914183 00000 n +0001914301 00000 n +0001914419 00000 n +0001917468 00000 n +0001917658 00000 n +0001917835 00000 n +0001918006 00000 n +0001918196 00000 n +0001918373 00000 n +0001918544 00000 n +0001919072 00000 n +0001916904 00000 n +0001914675 00000 n +0001918718 00000 n +0001918777 00000 n +0001918895 00000 n +0001919013 00000 n +0001921752 00000 n +0001921943 00000 n +0001922120 00000 n +0001922290 00000 n +0001922480 00000 n +0001925936 00000 n +0001922666 00000 n +0001923194 00000 n +0001921563 00000 n +0001919248 00000 n +0001922840 00000 n +0001922958 00000 n +0001923076 00000 n +0001926123 00000 n +0001926290 00000 n +0001926452 00000 n +0001926620 00000 n +0001927207 00000 n +0001925756 00000 n +0001923370 00000 n +0001926794 00000 n +0001926853 00000 n +0001926971 00000 n +0001927089 00000 n +0002870981 00000 n +0001929540 00000 n +0001929778 00000 n +0001930016 00000 n +0001930188 00000 n +0001930516 00000 n +0001930754 00000 n +0001930940 00000 n +0001931126 00000 n +0001931830 00000 n +0001929324 00000 n +0001927396 00000 n +0001931300 00000 n +0001931359 00000 n +0001931477 00000 n +0001931595 00000 n +0001930352 00000 n +0001931713 00000 n +0001934818 00000 n +0001935009 00000 n +0001935389 00000 n +0001935922 00000 n +0001934647 00000 n +0001931969 00000 n +0001935563 00000 n +0001935622 00000 n +0001935740 00000 n +0001935199 00000 n +0001935863 00000 n +0001939007 00000 n +0001939245 00000 n +0001939459 00000 n +0001939644 00000 n +0001939829 00000 n +0001940044 00000 n +0001940762 00000 n +0001938818 00000 n +0001936073 00000 n +0001940218 00000 n +0001940340 00000 n +0001940463 00000 n +0001940522 00000 n +0001940640 00000 n +0001943410 00000 n +0001943595 00000 n +0001943824 00000 n +0001944052 00000 n +0001944281 00000 n +0001944510 00000 n +0001944738 00000 n +0001944966 00000 n +0001945167 00000 n +0001948937 00000 n +0001949133 00000 n +0001949362 00000 n +0001949557 00000 n +0001945370 00000 n +0001946319 00000 n +0001943185 00000 n +0001940913 00000 n +0001945544 00000 n +0001945603 00000 n +0001945726 00000 n +0001945849 00000 n +0001946024 00000 n +0001946083 00000 n +0001946142 00000 n +0001946201 00000 n +0001946260 00000 n +0002021062 00000 n +0001949761 00000 n +0001949990 00000 n +0001950186 00000 n +0001950390 00000 n +0001950619 00000 n +0001950824 00000 n +0001951027 00000 n +0001951223 00000 n +0001951452 00000 n +0001951648 00000 n +0001951843 00000 n +0001952072 00000 n +0001952268 00000 n +0001952464 00000 n +0001952692 00000 n +0001952882 00000 n +0001953085 00000 n +0001953314 00000 n +0001953507 00000 n +0001953711 00000 n +0001953940 00000 n +0001954122 00000 n +0001954326 00000 n +0001954555 00000 n +0001954748 00000 n +0001954951 00000 n +0001955180 00000 n +0001955367 00000 n +0001955571 00000 n +0001955800 00000 n +0001955981 00000 n +0001956167 00000 n +0001956371 00000 n +0001956575 00000 n +0001959730 00000 n +0001959934 00000 n +0001956803 00000 n +0001957271 00000 n +0001948451 00000 n +0001946500 00000 n +0001956977 00000 n +0001957036 00000 n +0001957095 00000 n +0001957153 00000 n +0001957212 00000 n +0002023559 00000 n +0002023677 00000 n +0002023800 00000 n +0002023918 00000 n +0002026258 00000 n +0002026376 00000 n +0002026493 00000 n +0002029305 00000 n +0001960163 00000 n +0001960391 00000 n +0001960620 00000 n +0001960849 00000 n +0001961078 00000 n +0001961307 00000 n +0001961503 00000 n +0001961732 00000 n +0001961961 00000 n +0001962147 00000 n +0001962376 00000 n +0001962572 00000 n +0001962800 00000 n +0001962994 00000 n +0001963222 00000 n +0001963418 00000 n +0001963622 00000 n +0001963826 00000 n +0001964054 00000 n +0001964250 00000 n +0001964454 00000 n +0001964658 00000 n +0001964845 00000 n +0001965074 00000 n +0001965270 00000 n +0001965473 00000 n +0001965676 00000 n +0001965905 00000 n +0001966101 00000 n +0001966304 00000 n +0001966507 00000 n +0001966694 00000 n +0001966922 00000 n +0001970137 00000 n +0001970366 00000 n +0001967118 00000 n +0001967704 00000 n +0001959271 00000 n +0001957424 00000 n +0001967292 00000 n +0001967351 00000 n +0001967410 00000 n +0001967469 00000 n +0001967528 00000 n +0001967587 00000 n +0001967645 00000 n +0002871107 00000 n +0002029482 00000 n +0002029600 00000 n +0002029718 00000 n +0002032072 00000 n +0002032189 00000 n +0002032307 00000 n +0002034950 00000 n +0002035073 00000 n +0002035196 00000 n +0001970562 00000 n +0001970791 00000 n +0001970986 00000 n +0001971215 00000 n +0001971410 00000 n +0001971639 00000 n +0001971835 00000 n +0001972062 00000 n +0001972248 00000 n +0001972445 00000 n +0001972673 00000 n +0001972859 00000 n +0001973056 00000 n +0001973284 00000 n +0001973471 00000 n +0001973675 00000 n +0001973902 00000 n +0001974105 00000 n +0001974331 00000 n +0001974560 00000 n +0001974789 00000 n +0001975016 00000 n +0001975241 00000 n +0001975427 00000 n +0001975654 00000 n +0001975842 00000 n +0001976071 00000 n +0001976259 00000 n +0001976486 00000 n +0001976682 00000 n +0001976908 00000 n +0001980360 00000 n +0001980589 00000 n +0001980784 00000 n +0001981011 00000 n +0001977104 00000 n +0001977573 00000 n +0001969696 00000 n +0001967843 00000 n +0001977278 00000 n +0001977337 00000 n +0001977396 00000 n +0001977455 00000 n +0001977514 00000 n +0002037601 00000 n +0002037719 00000 n +0002037836 00000 n +0002037953 00000 n +0002038071 00000 n +0002040397 00000 n +0002040515 00000 n +0002040633 00000 n +0002040755 00000 n +0002040873 00000 n +0002043522 00000 n +0002043640 00000 n +0001981199 00000 n +0001981425 00000 n +0001981613 00000 n +0001981841 00000 n +0001982026 00000 n +0001982253 00000 n +0001982448 00000 n +0001982675 00000 n +0001982871 00000 n +0001983100 00000 n +0001983296 00000 n +0001983523 00000 n +0001983709 00000 n +0001983874 00000 n +0001984101 00000 n +0001984293 00000 n +0001984458 00000 n +0001984685 00000 n +0001984911 00000 n +0001985106 00000 n +0001985335 00000 n +0001985531 00000 n +0001985756 00000 n +0001985950 00000 n +0001986179 00000 n +0001986375 00000 n +0001986563 00000 n +0001986792 00000 n +0001986978 00000 n +0001987174 00000 n +0001987353 00000 n +0001987582 00000 n +0001987768 00000 n +0001987964 00000 n +0001992181 00000 n +0001992410 00000 n +0001992596 00000 n +0001992800 00000 n +0001992996 00000 n +0001988143 00000 n +0001988435 00000 n +0001979874 00000 n +0001977712 00000 n +0001988317 00000 n +0001988376 00000 n +0002046692 00000 n +0002046810 00000 n +0002047046 00000 n +0002049851 00000 n +0002050087 00000 n +0002053460 00000 n +0002053578 00000 n +0002053819 00000 n +0002053937 00000 n +0002057619 00000 n +0002057737 00000 n +0001993173 00000 n +0001993402 00000 n +0001993588 00000 n +0001993792 00000 n +0001994184 00000 n +0001994360 00000 n +0001994589 00000 n +0001994785 00000 n +0001994989 00000 n +0001995185 00000 n +0001995362 00000 n +0001995591 00000 n +0001995787 00000 n +0001995991 00000 n +0001996187 00000 n +0001996363 00000 n +0001996592 00000 n +0001996777 00000 n +0001996973 00000 n +0001997365 00000 n +0001997552 00000 n +0001997781 00000 n +0001997967 00000 n +0001998163 00000 n +0001998555 00000 n +0001998742 00000 n +0001998968 00000 n +0001999164 00000 n +0001999333 00000 n +0001999560 00000 n +0001999788 00000 n +0001999984 00000 n +0002000155 00000 n +0002000381 00000 n +0002000576 00000 n +0002000749 00000 n +0002000945 00000 n +0002001174 00000 n +0002001370 00000 n +0002001564 00000 n +0002001791 00000 n +0002001985 00000 n +0002002336 00000 n +0001991596 00000 n +0001988574 00000 n +0002002159 00000 n +0001993988 00000 n +0001997169 00000 n +0001998359 00000 n +0002002218 00000 n +0002002277 00000 n +0002057854 00000 n +0002061583 00000 n +0002061701 00000 n +0002061819 00000 n +0002065649 00000 n +0002065767 00000 n +0002070016 00000 n +0002070134 00000 n +0002070256 00000 n +0002070378 00000 n +0002005166 00000 n +0002005393 00000 n +0002005589 00000 n +0002005816 00000 n +0002006020 00000 n +0002006247 00000 n +0002006450 00000 n +0002006677 00000 n +0002006872 00000 n +0002007097 00000 n +0002007288 00000 n +0002007515 00000 n +0002007719 00000 n +0002007946 00000 n +0002008173 00000 n +0002008359 00000 n +0002008563 00000 n +0002008789 00000 n +0002008981 00000 n +0002009167 00000 n +0002009370 00000 n +0002009598 00000 n +0002009827 00000 n +0002010015 00000 n +0002010242 00000 n +0002010430 00000 n +0002014174 00000 n +0002014370 00000 n +0002014563 00000 n +0002010619 00000 n +0002011206 00000 n +0002004788 00000 n +0002002544 00000 n +0002010793 00000 n +0002010852 00000 n +0002010911 00000 n +0002010970 00000 n +0002011029 00000 n +0002011088 00000 n +0002011147 00000 n +0002074764 00000 n +0002074882 00000 n +0002075005 00000 n +0002075123 00000 n +0002079687 00000 n +0002079810 00000 n +0002079990 00000 n +0002084958 00000 n +0002014791 00000 n +0002015019 00000 n +0002015211 00000 n +0002015406 00000 n +0002015789 00000 n +0002015971 00000 n +0002016167 00000 n +0002016349 00000 n +0002016578 00000 n +0002016760 00000 n +0002016942 00000 n +0002017171 00000 n +0002017353 00000 n +0002017549 00000 n +0002017731 00000 n +0002017960 00000 n +0002018156 00000 n +0002018384 00000 n +0002018579 00000 n +0002018969 00000 n +0002019197 00000 n +0002019388 00000 n +0002019584 00000 n +0002019775 00000 n +0002019966 00000 n +0002020158 00000 n +0002020340 00000 n +0002020535 00000 n +0002021180 00000 n +0002013742 00000 n +0002011386 00000 n +0002020709 00000 n +0002020768 00000 n +0002015598 00000 n +0002020827 00000 n +0002018774 00000 n +0002020886 00000 n +0002020945 00000 n +0002021004 00000 n +0002021121 00000 n +0002085075 00000 n +0002085193 00000 n +0002085310 00000 n +0002085427 00000 n +0002090886 00000 n +0002023326 00000 n +0002024036 00000 n +0002023182 00000 n +0002021333 00000 n +0002023500 00000 n +0002023618 00000 n +0002023741 00000 n +0002023859 00000 n +0002023977 00000 n +0002871233 00000 n +0002026025 00000 n +0002026611 00000 n +0002025881 00000 n +0002024162 00000 n +0002026199 00000 n +0002026317 00000 n +0002026434 00000 n +0002026552 00000 n +0002029072 00000 n +0002029776 00000 n +0002028928 00000 n +0002026737 00000 n +0002029246 00000 n +0002029364 00000 n +0002029423 00000 n +0002029541 00000 n +0002029659 00000 n +0002861892 00000 n +0002031780 00000 n +0002032430 00000 n +0002031636 00000 n +0002029954 00000 n +0002031954 00000 n +0002032013 00000 n +0002032131 00000 n +0002032248 00000 n +0002032371 00000 n +0002034717 00000 n +0002035259 00000 n +0002034573 00000 n +0002032569 00000 n +0002034891 00000 n +0002035014 00000 n +0002035137 00000 n +0002037309 00000 n +0002038129 00000 n +0002037165 00000 n +0002035398 00000 n +0002037483 00000 n +0002037542 00000 n +0002037660 00000 n +0002037777 00000 n +0002037895 00000 n +0002038012 00000 n +0002040105 00000 n +0002041049 00000 n +0002039961 00000 n +0002038281 00000 n +0002040279 00000 n +0002040338 00000 n +0002040456 00000 n +0002040574 00000 n +0002040696 00000 n +0002040814 00000 n +0002040932 00000 n +0002871359 00000 n +0002042865 00000 n +0002043036 00000 n +0002043230 00000 n +0002043875 00000 n +0002042703 00000 n +0002041188 00000 n +0002043404 00000 n +0002043463 00000 n +0002043581 00000 n +0002043699 00000 n +0002043817 00000 n +0002045732 00000 n +0002045902 00000 n +0002046095 00000 n +0002046266 00000 n +0002046459 00000 n +0002047104 00000 n +0002045552 00000 n +0002044014 00000 n +0002046633 00000 n +0002046751 00000 n +0002046869 00000 n +0002046987 00000 n +0002049032 00000 n +0002049203 00000 n +0002049397 00000 n +0002049559 00000 n +0002050205 00000 n +0002048861 00000 n +0002047243 00000 n +0002049733 00000 n +0002049792 00000 n +0002049910 00000 n +0002050028 00000 n +0002050146 00000 n +0002052514 00000 n +0002052679 00000 n +0002052864 00000 n +0002053034 00000 n +0002053227 00000 n +0002053995 00000 n +0002052334 00000 n +0002050344 00000 n +0002053401 00000 n +0002053519 00000 n +0002053637 00000 n +0002053760 00000 n +0002053878 00000 n +0002056606 00000 n +0002056794 00000 n +0002056972 00000 n +0002057151 00000 n +0002057327 00000 n +0002057972 00000 n +0002056426 00000 n +0002054134 00000 n +0002057501 00000 n +0002057560 00000 n +0002057678 00000 n +0002057796 00000 n +0002057913 00000 n +0002060429 00000 n +0002060618 00000 n +0002060795 00000 n +0002060985 00000 n +0002061160 00000 n +0002061350 00000 n +0002061877 00000 n +0002060240 00000 n +0002058148 00000 n +0002061524 00000 n +0002061642 00000 n +0002061760 00000 n +0002871485 00000 n +0002064615 00000 n +0002064792 00000 n +0002064983 00000 n +0002065170 00000 n +0002065357 00000 n +0002065885 00000 n +0002064435 00000 n +0002062053 00000 n +0002065531 00000 n +0002065590 00000 n +0002065708 00000 n +0002065826 00000 n +0002068969 00000 n +0002069138 00000 n +0002069303 00000 n +0002069475 00000 n +0002069628 00000 n +0002073366 00000 n +0002069783 00000 n +0002070442 00000 n +0002068780 00000 n +0002066061 00000 n +0002069957 00000 n +0002070075 00000 n +0002070198 00000 n +0002070319 00000 n +0002073539 00000 n +0002073736 00000 n +0002073928 00000 n +0002074100 00000 n +0002074286 00000 n +0002074472 00000 n +0002075181 00000 n +0002073168 00000 n +0002070606 00000 n +0002074646 00000 n +0002074705 00000 n +0002074823 00000 n +0002074946 00000 n +0002075064 00000 n +0002078145 00000 n +0002078365 00000 n +0002078594 00000 n +0002078809 00000 n +0002078994 00000 n +0002079180 00000 n +0002079395 00000 n +0002080108 00000 n +0002077947 00000 n +0002075333 00000 n +0002079569 00000 n +0002079628 00000 n +0002079751 00000 n +0002079873 00000 n +0002079931 00000 n +0002080049 00000 n +0002271680 00000 n +0002083186 00000 n +0002083576 00000 n +0002083768 00000 n +0002084159 00000 n +0002084341 00000 n +0002084725 00000 n +0002085485 00000 n +0002082970 00000 n +0002080259 00000 n +0002084899 00000 n +0002085016 00000 n +0002085134 00000 n +0002083382 00000 n +0002085252 00000 n +0002083964 00000 n +0002085369 00000 n +0002084533 00000 n +0002087544 00000 n +0002087774 00000 n +0002088004 00000 n +0002088234 00000 n +0002088464 00000 n +0002088661 00000 n +0002088888 00000 n +0002089085 00000 n +0002089315 00000 n +0002089511 00000 n +0002089740 00000 n +0002089937 00000 n +0002090167 00000 n +0002090364 00000 n +0002093703 00000 n +0002093900 00000 n +0002090594 00000 n +0002091767 00000 n +0002087274 00000 n +0002085624 00000 n +0002090768 00000 n +0002090827 00000 n +0002090945 00000 n +0002091119 00000 n +0002091178 00000 n +0002091237 00000 n +0002091296 00000 n +0002091355 00000 n +0002091414 00000 n +0002091472 00000 n +0002091531 00000 n +0002091590 00000 n +0002091649 00000 n +0002091708 00000 n +0002871611 00000 n +0002094130 00000 n +0002094358 00000 n +0002094554 00000 n +0002094750 00000 n +0002094980 00000 n +0002095177 00000 n +0002095374 00000 n +0002095570 00000 n +0002095800 00000 n +0002095997 00000 n +0002096194 00000 n +0002096390 00000 n +0002096620 00000 n +0002096817 00000 n +0002097014 00000 n +0002097243 00000 n +0002097439 00000 n +0002098380 00000 n +0002093397 00000 n +0002091934 00000 n +0002097613 00000 n +0002097672 00000 n +0002097731 00000 n +0002097790 00000 n +0002097849 00000 n +0002097908 00000 n +0002097967 00000 n +0002098026 00000 n +0002098085 00000 n +0002098144 00000 n +0002098203 00000 n +0002098262 00000 n +0002098321 00000 n +0002102780 00000 n +0002100291 00000 n +0002100521 00000 n +0002100751 00000 n +0002100981 00000 n +0002101210 00000 n +0002101406 00000 n +0002101636 00000 n +0002101832 00000 n +0002102061 00000 n +0002102258 00000 n +0002105479 00000 n +0002105708 00000 n +0002105905 00000 n +0002106102 00000 n +0002106332 00000 n +0002106529 00000 n +0002102488 00000 n +0002103545 00000 n +0002100057 00000 n +0002098519 00000 n +0002102662 00000 n +0002102721 00000 n +0002102839 00000 n +0002103015 00000 n +0002103074 00000 n +0002103133 00000 n +0002103192 00000 n +0002103251 00000 n +0002103309 00000 n +0002103368 00000 n +0002103427 00000 n +0002103486 00000 n +0002106726 00000 n +0002106922 00000 n +0002107152 00000 n +0002107349 00000 n +0002107546 00000 n +0002107742 00000 n +0002107972 00000 n +0002108169 00000 n +0002108366 00000 n +0002108596 00000 n +0002108793 00000 n +0002109793 00000 n +0002105191 00000 n +0002103712 00000 n +0002108967 00000 n +0002109026 00000 n +0002109085 00000 n +0002109144 00000 n +0002109203 00000 n +0002109262 00000 n +0002109321 00000 n +0002109380 00000 n +0002109439 00000 n +0002109498 00000 n +0002109557 00000 n +0002109616 00000 n +0002109675 00000 n +0002109734 00000 n +0002111864 00000 n +0002112055 00000 n +0002112440 00000 n +0002112644 00000 n +0002112865 00000 n +0002113069 00000 n +0002113289 00000 n +0002113493 00000 n +0002113714 00000 n +0002113903 00000 n +0002114098 00000 n +0002114318 00000 n +0002114514 00000 n +0002114735 00000 n +0002114929 00000 n +0002115150 00000 n +0002115344 00000 n +0002115565 00000 n +0002115761 00000 n +0002115982 00000 n +0002116178 00000 n +0002119733 00000 n +0002119934 00000 n +0002120155 00000 n +0002120355 00000 n +0002116399 00000 n +0002117455 00000 n +0002111522 00000 n +0002109932 00000 n +0002116573 00000 n +0002116632 00000 n +0002112248 00000 n +0002116806 00000 n +0002116865 00000 n +0002116924 00000 n +0002116983 00000 n +0002117042 00000 n +0002117101 00000 n +0002117160 00000 n +0002117219 00000 n +0002117278 00000 n +0002117337 00000 n +0002117396 00000 n +0002120575 00000 n +0002120772 00000 n +0002120992 00000 n +0002121179 00000 n +0002121376 00000 n +0002121596 00000 n +0002121782 00000 n +0002121978 00000 n +0002122197 00000 n +0002122383 00000 n +0002122604 00000 n +0002122825 00000 n +0002123046 00000 n +0002123265 00000 n +0002123451 00000 n +0002123669 00000 n +0002123890 00000 n +0002124111 00000 n +0002124332 00000 n +0002124518 00000 n +0002124739 00000 n +0002124935 00000 n +0002125156 00000 n +0002125351 00000 n +0002125571 00000 n +0002125767 00000 n +0002125971 00000 n +0002126175 00000 n +0002126394 00000 n +0002126589 00000 n +0002126792 00000 n +0002126995 00000 n +0002130279 00000 n +0002130500 00000 n +0002130696 00000 n +0002130899 00000 n +0002127182 00000 n +0002127886 00000 n +0002119265 00000 n +0002117622 00000 n +0002127356 00000 n +0002127415 00000 n +0002127474 00000 n +0002127533 00000 n +0002127592 00000 n +0002127650 00000 n +0002127709 00000 n +0002127768 00000 n +0002127827 00000 n +0002208652 00000 n +0002208770 00000 n +0002208888 00000 n +0002209006 00000 n +0002211374 00000 n +0002211492 00000 n +0002211610 00000 n +0002211728 00000 n +0002211846 00000 n +0002131102 00000 n +0002131322 00000 n +0002131517 00000 n +0002131719 00000 n +0002131921 00000 n +0002132108 00000 n +0002132329 00000 n +0002132517 00000 n +0002132738 00000 n +0002132924 00000 n +0002133145 00000 n +0002133364 00000 n +0002133552 00000 n +0002133773 00000 n +0002133961 00000 n +0002134180 00000 n +0002134367 00000 n +0002134588 00000 n +0002134775 00000 n +0002134993 00000 n +0002135180 00000 n +0002135401 00000 n +0002135587 00000 n +0002135806 00000 n +0002136002 00000 n +0002136221 00000 n +0002136417 00000 n +0002136638 00000 n +0002136833 00000 n +0002137054 00000 n +0002139822 00000 n +0002140041 00000 n +0002140236 00000 n +0002140455 00000 n +0002137250 00000 n +0002137483 00000 n +0002129829 00000 n +0002128012 00000 n +0002137424 00000 n +0002871737 00000 n +0002214504 00000 n +0002214626 00000 n +0002217223 00000 n +0002217344 00000 n +0002217462 00000 n +0002217580 00000 n +0002220087 00000 n +0002223260 00000 n +0002223501 00000 n +0002223622 00000 n +0002140650 00000 n +0002140870 00000 n +0002141063 00000 n +0002141284 00000 n +0002141478 00000 n +0002141696 00000 n +0002141890 00000 n +0002142111 00000 n +0002142307 00000 n +0002142525 00000 n +0002142720 00000 n +0002142941 00000 n +0002143137 00000 n +0002143356 00000 n +0002143544 00000 n +0002143762 00000 n +0002143950 00000 n +0002144166 00000 n +0002144360 00000 n +0002144579 00000 n +0002144775 00000 n +0002144994 00000 n +0002145180 00000 n +0002145345 00000 n +0002145564 00000 n +0002145756 00000 n +0002145920 00000 n +0002146139 00000 n +0002146327 00000 n +0002146548 00000 n +0002146736 00000 n +0002146954 00000 n +0002150772 00000 n +0002150992 00000 n +0002147141 00000 n +0002147374 00000 n +0002139354 00000 n +0002137609 00000 n +0002147315 00000 n +0002228726 00000 n +0002228844 00000 n +0002232061 00000 n +0002234766 00000 n +0002237443 00000 n +0002237564 00000 n +0002237685 00000 n +0002237806 00000 n +0002240587 00000 n +0002240707 00000 n +0002240827 00000 n +0002243810 00000 n +0002151179 00000 n +0002151398 00000 n +0002151584 00000 n +0002151803 00000 n +0002151991 00000 n +0002152168 00000 n +0002152387 00000 n +0002152575 00000 n +0002152795 00000 n +0002152982 00000 n +0002153160 00000 n +0002153381 00000 n +0002153567 00000 n +0002153763 00000 n +0002153942 00000 n +0002154163 00000 n +0002154349 00000 n +0002154545 00000 n +0002154724 00000 n +0002154945 00000 n +0002155131 00000 n +0002155335 00000 n +0002155531 00000 n +0002155708 00000 n +0002155929 00000 n +0002156115 00000 n +0002156319 00000 n +0002156711 00000 n +0002156887 00000 n +0002157108 00000 n +0002157304 00000 n +0002157508 00000 n +0002157703 00000 n +0002157879 00000 n +0002158100 00000 n +0002158296 00000 n +0002158500 00000 n +0002158696 00000 n +0002158872 00000 n +0002159093 00000 n +0002159278 00000 n +0002159474 00000 n +0002159865 00000 n +0002160052 00000 n +0002160273 00000 n +0002160459 00000 n +0002160655 00000 n +0002161047 00000 n +0002164146 00000 n +0002164364 00000 n +0002161233 00000 n +0002161583 00000 n +0002150151 00000 n +0002147500 00000 n +0002161407 00000 n +0002161466 00000 n +0002161524 00000 n +0002156515 00000 n +0002159670 00000 n +0002160851 00000 n +0002244052 00000 n +0002244173 00000 n +0002247683 00000 n +0002247804 00000 n +0002247924 00000 n +0002251530 00000 n +0002251651 00000 n +0002251771 00000 n +0002255435 00000 n +0002255556 00000 n +0002164552 00000 n +0002164720 00000 n +0002164939 00000 n +0002165158 00000 n +0002165346 00000 n +0002165510 00000 n +0002165731 00000 n +0002165919 00000 n +0002166115 00000 n +0002166284 00000 n +0002166448 00000 n +0002166668 00000 n +0002166855 00000 n +0002167050 00000 n +0002167220 00000 n +0002167384 00000 n +0002167602 00000 n +0002167789 00000 n +0002167950 00000 n +0002168168 00000 n +0002168356 00000 n +0002168577 00000 n +0002168765 00000 n +0002168960 00000 n +0002169130 00000 n +0002169291 00000 n +0002169512 00000 n +0002169698 00000 n +0002169894 00000 n +0002170064 00000 n +0002170224 00000 n +0002170443 00000 n +0002170647 00000 n +0002170866 00000 n +0002171069 00000 n +0002171288 00000 n +0002171474 00000 n +0002171645 00000 n +0002171863 00000 n +0002172055 00000 n +0002172273 00000 n +0002175317 00000 n +0002175536 00000 n +0002172476 00000 n +0002172827 00000 n +0002163615 00000 n +0002161764 00000 n +0002172650 00000 n +0002172709 00000 n +0002172768 00000 n +0002259044 00000 n +0002259165 00000 n +0002259286 00000 n +0002259407 00000 n +0002263274 00000 n +0002263395 00000 n +0002263516 00000 n +0002267298 00000 n +0002267419 00000 n +0002271317 00000 n +0002271438 00000 n +0002271559 00000 n +0002175727 00000 n +0002175946 00000 n +0002176132 00000 n +0002176336 00000 n +0002176553 00000 n +0002176744 00000 n +0002176929 00000 n +0002177150 00000 n +0002177369 00000 n +0002177557 00000 n +0002177776 00000 n +0002177995 00000 n +0002178214 00000 n +0002178435 00000 n +0002178656 00000 n +0002178859 00000 n +0002179077 00000 n +0002179281 00000 n +0002179500 00000 n +0002179721 00000 n +0002179925 00000 n +0002180146 00000 n +0002180334 00000 n +0002180554 00000 n +0002183889 00000 n +0002184110 00000 n +0002180775 00000 n +0002181657 00000 n +0002174939 00000 n +0002172966 00000 n +0002180949 00000 n +0002181008 00000 n +0002181067 00000 n +0002181126 00000 n +0002181185 00000 n +0002181244 00000 n +0002181303 00000 n +0002181362 00000 n +0002181421 00000 n +0002181480 00000 n +0002181539 00000 n +0002181598 00000 n +0002276100 00000 n +0002276226 00000 n +0002279444 00000 n +0002279568 00000 n +0002184330 00000 n +0002184549 00000 n +0002184753 00000 n +0002184957 00000 n +0002185176 00000 n +0002185364 00000 n +0002185568 00000 n +0002185787 00000 n +0002185982 00000 n +0002186201 00000 n +0002186397 00000 n +0002186590 00000 n +0002186809 00000 n +0002187003 00000 n +0002187221 00000 n +0002187415 00000 n +0002187607 00000 n +0002187826 00000 n +0002188005 00000 n +0002188191 00000 n +0002188395 00000 n +0002188581 00000 n +0002188801 00000 n +0002188989 00000 n +0002189210 00000 n +0002189398 00000 n +0002189619 00000 n +0002189807 00000 n +0002189995 00000 n +0002190216 00000 n +0002190404 00000 n +0002190592 00000 n +0002191120 00000 n +0002183448 00000 n +0002181824 00000 n +0002190766 00000 n +0002190825 00000 n +0002190884 00000 n +0002190943 00000 n +0002191002 00000 n +0002191061 00000 n +0002203488 00000 n +0002203606 00000 n +0002203724 00000 n +0002205880 00000 n +0002205998 00000 n +0002206116 00000 n +0002208475 00000 n +0002279750 00000 n +0002279871 00000 n +0002279996 00000 n +0002194011 00000 n +0002194197 00000 n +0002194360 00000 n +0002194550 00000 n +0002194743 00000 n +0002195066 00000 n +0002195358 00000 n +0002193813 00000 n +0002191273 00000 n +0002195240 00000 n +0002195299 00000 n +0002194904 00000 n +0002871863 00000 n +0002197770 00000 n +0002198003 00000 n +0002197626 00000 n +0002195534 00000 n +0002197944 00000 n +0002200340 00000 n +0002200573 00000 n +0002200196 00000 n +0002198177 00000 n +0002200514 00000 n +0002203196 00000 n +0002203846 00000 n +0002203052 00000 n +0002200747 00000 n +0002203370 00000 n +0002203429 00000 n +0002203547 00000 n +0002203665 00000 n +0002203787 00000 n +0002205647 00000 n +0002206234 00000 n +0002205503 00000 n +0002204047 00000 n +0002205821 00000 n +0002205939 00000 n +0002206057 00000 n +0002206175 00000 n +0002208242 00000 n +0002209064 00000 n +0002208098 00000 n +0002206347 00000 n +0002208416 00000 n +0002208534 00000 n +0002208593 00000 n +0002208711 00000 n +0002208829 00000 n +0002208947 00000 n +0002211082 00000 n +0002211909 00000 n +0002210938 00000 n +0002209203 00000 n +0002211256 00000 n +0002211315 00000 n +0002211433 00000 n +0002211551 00000 n +0002211669 00000 n +0002211787 00000 n +0002871989 00000 n +0002214212 00000 n +0002214749 00000 n +0002214068 00000 n +0002212035 00000 n +0002214386 00000 n +0002214445 00000 n +0002214568 00000 n +0002214690 00000 n +0002216990 00000 n +0002217644 00000 n +0002216846 00000 n +0002214875 00000 n +0002217164 00000 n +0002217285 00000 n +0002217403 00000 n +0002217521 00000 n +0002219311 00000 n +0002219482 00000 n +0002222295 00000 n +0002222466 00000 n +0002219676 00000 n +0002220325 00000 n +0002219149 00000 n +0002217770 00000 n +0002219850 00000 n +0002219909 00000 n +0002220028 00000 n +0002220146 00000 n +0002220265 00000 n +0002222660 00000 n +0002222831 00000 n +0002223024 00000 n +0002223682 00000 n +0002222109 00000 n +0002220451 00000 n +0002223199 00000 n +0002223319 00000 n +0002223440 00000 n +0002223561 00000 n +0002225373 00000 n +0002225545 00000 n +0002225740 00000 n +0002226279 00000 n +0002225205 00000 n +0002223809 00000 n +0002225915 00000 n +0002225976 00000 n +0002226097 00000 n +0002226218 00000 n +0002228123 00000 n +0002228295 00000 n +0002228490 00000 n +0002229086 00000 n +0002227954 00000 n +0002226406 00000 n +0002228665 00000 n +0002228785 00000 n +0002228904 00000 n +0002229025 00000 n +0002872117 00000 n +0002230971 00000 n +0002231143 00000 n +0002231338 00000 n +0002231510 00000 n +0002231705 00000 n +0002232182 00000 n +0002230782 00000 n +0002229213 00000 n +0002231880 00000 n +0002232001 00000 n +0002232121 00000 n +0002234042 00000 n +0002234214 00000 n +0002234409 00000 n +0002235008 00000 n +0002233873 00000 n +0002232309 00000 n +0002234584 00000 n +0002234705 00000 n +0002234826 00000 n +0002234947 00000 n +0002236840 00000 n +0002237012 00000 n +0002237207 00000 n +0002237865 00000 n +0002236671 00000 n +0002235135 00000 n +0002237382 00000 n +0002237503 00000 n +0002237624 00000 n +0002237745 00000 n +0002239774 00000 n +0002239938 00000 n +0002240103 00000 n +0002240290 00000 n +0002241008 00000 n +0002239595 00000 n +0002237992 00000 n +0002240465 00000 n +0002240526 00000 n +0002240647 00000 n +0002240767 00000 n +0002240887 00000 n +0002242601 00000 n +0002242773 00000 n +0002242968 00000 n +0002243140 00000 n +0002243335 00000 n +0002243513 00000 n +0002244232 00000 n +0002242402 00000 n +0002241135 00000 n +0002243688 00000 n +0002243749 00000 n +0002243870 00000 n +0002243991 00000 n +0002244112 00000 n +0002246670 00000 n +0002246850 00000 n +0002247029 00000 n +0002247209 00000 n +0002247386 00000 n +0002248045 00000 n +0002246481 00000 n +0002244359 00000 n +0002247561 00000 n +0002247622 00000 n +0002247743 00000 n +0002247864 00000 n +0002247984 00000 n +0002872250 00000 n +0002250367 00000 n +0002250558 00000 n +0002250736 00000 n +0002250926 00000 n +0002251103 00000 n +0002254392 00000 n +0002251294 00000 n +0002251830 00000 n +0002250168 00000 n +0002248222 00000 n +0002251469 00000 n +0002251590 00000 n +0002251711 00000 n +0002254570 00000 n +0002254762 00000 n +0002254950 00000 n +0002255138 00000 n +0002255677 00000 n +0002254203 00000 n +0002252007 00000 n +0002255313 00000 n +0002255374 00000 n +0002255495 00000 n +0002255616 00000 n +0002257803 00000 n +0002257973 00000 n +0002258137 00000 n +0002258305 00000 n +0002258475 00000 n +0002258639 00000 n +0002261481 00000 n +0002261652 00000 n +0002258808 00000 n +0002259467 00000 n +0002257594 00000 n +0002255854 00000 n +0002258983 00000 n +0002259104 00000 n +0002259225 00000 n +0002259346 00000 n +0002261816 00000 n +0002261985 00000 n +0002262147 00000 n +0002262316 00000 n +0002262487 00000 n +0002262808 00000 n +0002266059 00000 n +0002266230 00000 n +0002262977 00000 n +0002263575 00000 n +0002261242 00000 n +0002259607 00000 n +0002263152 00000 n +0002263213 00000 n +0002263334 00000 n +0002263455 00000 n +0002262649 00000 n +0002266390 00000 n +0002266559 00000 n +0002266780 00000 n +0002267001 00000 n +0002267538 00000 n +0002265860 00000 n +0002263715 00000 n +0002267176 00000 n +0002267237 00000 n +0002267358 00000 n +0002267479 00000 n +0002270121 00000 n +0002270294 00000 n +0002270516 00000 n +0002270702 00000 n +0002270889 00000 n +0002271081 00000 n +0002271801 00000 n +0002269922 00000 n +0002267740 00000 n +0002271256 00000 n +0002271377 00000 n +0002271498 00000 n +0002271619 00000 n +0002271740 00000 n +0002872383 00000 n +0002274909 00000 n +0002275100 00000 n +0002275320 00000 n +0002275492 00000 n +0002275678 00000 n +0002279037 00000 n +0002275864 00000 n +0002276350 00000 n +0002274710 00000 n +0002271990 00000 n +0002276039 00000 n +0002276165 00000 n +0002276290 00000 n +0002282719 00000 n +0002282939 00000 n +0002283159 00000 n +0002279208 00000 n +0002280241 00000 n +0002278878 00000 n +0002276502 00000 n +0002279383 00000 n +0002279507 00000 n +0002279628 00000 n +0002279689 00000 n +0002279810 00000 n +0002279936 00000 n +0002280061 00000 n +0002283345 00000 n +0002283565 00000 n +0002283785 00000 n +0002283971 00000 n +0002284188 00000 n +0002284406 00000 n +0002284625 00000 n +0002284842 00000 n +0002285061 00000 n +0002285281 00000 n +0002285501 00000 n +0002285721 00000 n +0002285908 00000 n +0002286128 00000 n +0002286347 00000 n +0002286566 00000 n +0002286751 00000 n +0002286970 00000 n +0002287190 00000 n +0002287395 00000 n +0002287613 00000 n +0002287818 00000 n +0002288036 00000 n +0002291743 00000 n +0002288254 00000 n +0002289403 00000 n +0002282310 00000 n +0002280407 00000 n +0002288429 00000 n +0002288490 00000 n +0002288551 00000 n +0002288612 00000 n +0002288672 00000 n +0002288733 00000 n +0002288794 00000 n +0002288855 00000 n +0002288916 00000 n +0002288977 00000 n +0002289038 00000 n +0002289099 00000 n +0002289160 00000 n +0002289221 00000 n +0002289282 00000 n +0002289343 00000 n +0002320539 00000 n +0002320661 00000 n +0002291961 00000 n +0002292180 00000 n +0002292400 00000 n +0002292620 00000 n +0002292840 00000 n +0002293060 00000 n +0002293280 00000 n +0002293499 00000 n +0002293718 00000 n +0002293938 00000 n +0002294158 00000 n +0002294378 00000 n +0002294598 00000 n +0002294818 00000 n +0002295038 00000 n +0002295258 00000 n +0002295478 00000 n +0002295698 00000 n +0002295917 00000 n +0002296135 00000 n +0002296355 00000 n +0002296575 00000 n +0002296795 00000 n +0002297012 00000 n +0002297231 00000 n +0002297450 00000 n +0002301176 00000 n +0002301363 00000 n +0002301581 00000 n +0002297666 00000 n +0002298755 00000 n +0002291324 00000 n +0002289556 00000 n +0002297841 00000 n +0002297902 00000 n +0002297963 00000 n +0002298024 00000 n +0002298085 00000 n +0002298146 00000 n +0002298207 00000 n +0002298267 00000 n +0002298328 00000 n +0002298389 00000 n +0002298450 00000 n +0002298511 00000 n +0002298572 00000 n +0002298633 00000 n +0002298694 00000 n +0002320849 00000 n +0002301767 00000 n +0002301985 00000 n +0002302172 00000 n +0002302390 00000 n +0002302577 00000 n +0002302795 00000 n +0002302981 00000 n +0002303201 00000 n +0002303387 00000 n +0002303605 00000 n +0002303791 00000 n +0002304009 00000 n +0002304228 00000 n +0002304448 00000 n +0002304668 00000 n +0002304887 00000 n +0002305107 00000 n +0002305326 00000 n +0002305546 00000 n +0002305766 00000 n +0002309506 00000 n +0002309726 00000 n +0002309946 00000 n +0002305986 00000 n +0002306893 00000 n +0002300797 00000 n +0002298895 00000 n +0002306161 00000 n +0002306222 00000 n +0002306283 00000 n +0002306344 00000 n +0002306405 00000 n +0002306466 00000 n +0002306527 00000 n +0002306588 00000 n +0002306649 00000 n +0002306710 00000 n +0002306771 00000 n +0002306832 00000 n +0002320971 00000 n +0002321097 00000 n +0002321224 00000 n +0002310132 00000 n +0002310350 00000 n +0002310569 00000 n +0002310788 00000 n +0002311006 00000 n +0002311192 00000 n +0002311378 00000 n +0002311597 00000 n +0002311783 00000 n +0002311969 00000 n +0002312189 00000 n +0002312376 00000 n +0002312596 00000 n +0002312783 00000 n +0002312970 00000 n +0002313284 00000 n +0002313469 00000 n +0002314071 00000 n +0002309157 00000 n +0002307033 00000 n +0002313644 00000 n +0002313705 00000 n +0002313766 00000 n +0002313827 00000 n +0002313888 00000 n +0002313949 00000 n +0002314010 00000 n +0002313127 00000 n +0002872516 00000 n +0002321346 00000 n +0002324256 00000 n +0002324444 00000 n +0002324566 00000 n +0002324687 00000 n +0002324809 00000 n +0002316181 00000 n +0002316417 00000 n +0002316032 00000 n +0002314225 00000 n +0002316356 00000 n +0002319396 00000 n +0002319583 00000 n +0002319803 00000 n +0002320242 00000 n +0002321411 00000 n +0002319207 00000 n +0002316530 00000 n +0002320417 00000 n +0002320478 00000 n +0002320600 00000 n +0002320727 00000 n +0002320023 00000 n +0002320788 00000 n +0002320910 00000 n +0002321036 00000 n +0002321163 00000 n +0002321285 00000 n +0002323959 00000 n +0002325110 00000 n +0002323810 00000 n +0002321564 00000 n +0002324134 00000 n +0002324195 00000 n +0002324322 00000 n +0002324383 00000 n +0002324505 00000 n +0002324626 00000 n +0002324748 00000 n +0002324870 00000 n +0002325050 00000 n +0002327109 00000 n +0002327335 00000 n +0002327563 00000 n +0002327790 00000 n +0002327995 00000 n +0002328897 00000 n +0002326920 00000 n +0002325250 00000 n +0002328170 00000 n +0002328350 00000 n +0002328411 00000 n +0002328472 00000 n +0002328533 00000 n +0002328594 00000 n +0002328655 00000 n +0002328716 00000 n +0002328777 00000 n +0002330755 00000 n +0002330975 00000 n +0002331196 00000 n +0002331395 00000 n +0002331614 00000 n +0002331819 00000 n +0002332023 00000 n +0002332243 00000 n +0002332447 00000 n +0002332667 00000 n +0002332870 00000 n +0002336546 00000 n +0002336750 00000 n +0002333089 00000 n +0002333990 00000 n +0002330496 00000 n +0002329064 00000 n +0002333264 00000 n +0002333384 00000 n +0002333445 00000 n +0002333506 00000 n +0002333567 00000 n +0002333746 00000 n +0002333807 00000 n +0002333868 00000 n +0002333929 00000 n +0002344333 00000 n +0002344516 00000 n +0002336970 00000 n +0002337188 00000 n +0002337408 00000 n +0002337595 00000 n +0002337799 00000 n +0002338018 00000 n +0002338205 00000 n +0002338425 00000 n +0002338611 00000 n +0002338831 00000 n +0002339050 00000 n +0002339236 00000 n +0002339455 00000 n +0002339641 00000 n +0002339827 00000 n +0002340014 00000 n +0002340201 00000 n +0002340984 00000 n +0002336217 00000 n +0002334143 00000 n +0002340376 00000 n +0002340437 00000 n +0002340498 00000 n +0002340557 00000 n +0002340618 00000 n +0002340679 00000 n +0002340740 00000 n +0002340801 00000 n +0002340862 00000 n +0002340923 00000 n +0002872649 00000 n +0002344699 00000 n +0002344821 00000 n +0002342993 00000 n +0002343213 00000 n +0002343432 00000 n +0002343664 00000 n +0002343850 00000 n +0002344037 00000 n +0002345184 00000 n +0002342794 00000 n +0002341149 00000 n +0002344212 00000 n +0002344273 00000 n +0002344394 00000 n +0002344455 00000 n +0002344577 00000 n +0002344638 00000 n +0002344760 00000 n +0002344882 00000 n +0002345062 00000 n +0002345123 00000 n +0002347416 00000 n +0002347641 00000 n +0002347866 00000 n +0002348053 00000 n +0002348276 00000 n +0002348461 00000 n +0002348646 00000 n +0002348850 00000 n +0002349076 00000 n +0002349302 00000 n +0002349488 00000 n +0002349714 00000 n +0002349940 00000 n +0002350144 00000 n +0002350370 00000 n +0002350574 00000 n +0002350800 00000 n +0002351026 00000 n +0002351250 00000 n +0002351476 00000 n +0002354582 00000 n +0002354787 00000 n +0002351702 00000 n +0002352849 00000 n +0002347067 00000 n +0002345337 00000 n +0002351877 00000 n +0002351938 00000 n +0002352118 00000 n +0002352179 00000 n +0002352240 00000 n +0002352301 00000 n +0002352362 00000 n +0002352423 00000 n +0002352483 00000 n +0002352544 00000 n +0002352605 00000 n +0002352666 00000 n +0002352727 00000 n +0002352788 00000 n +0002356164 00000 n +0002355013 00000 n +0002355206 00000 n +0002355431 00000 n +0002355623 00000 n +0002356469 00000 n +0002354383 00000 n +0002353003 00000 n +0002355798 00000 n +0002355859 00000 n +0002355920 00000 n +0002355981 00000 n +0002356042 00000 n +0002356103 00000 n +0002356225 00000 n +0002356286 00000 n +0002356347 00000 n +0002356408 00000 n +0002358158 00000 n +0002358310 00000 n +0002358462 00000 n +0002358614 00000 n +0002358765 00000 n +0002358917 00000 n +0002359068 00000 n +0002359221 00000 n +0002359374 00000 n +0002359527 00000 n +0002359680 00000 n +0002359832 00000 n +0002359984 00000 n +0002360136 00000 n +0002360289 00000 n +0002360441 00000 n +0002360593 00000 n +0002360744 00000 n +0002360897 00000 n +0002361050 00000 n +0002361202 00000 n +0002361354 00000 n +0002361506 00000 n +0002361658 00000 n +0002361811 00000 n +0002361964 00000 n +0002362116 00000 n +0002362267 00000 n +0002362418 00000 n +0002362570 00000 n +0002362722 00000 n +0002362875 00000 n +0002363028 00000 n +0002363179 00000 n +0002363332 00000 n +0002363484 00000 n +0002363637 00000 n +0002363789 00000 n +0002363942 00000 n +0002364093 00000 n +0002364246 00000 n +0002364398 00000 n +0002364550 00000 n +0002364703 00000 n +0002364856 00000 n +0002365008 00000 n +0002365160 00000 n +0002365312 00000 n +0002365465 00000 n +0002365617 00000 n +0002365770 00000 n +0002365921 00000 n +0002366074 00000 n +0002366227 00000 n +0002366380 00000 n +0002366533 00000 n +0002366686 00000 n +0002366839 00000 n +0002366992 00000 n +0002369376 00000 n +0002367266 00000 n +0002357429 00000 n +0002356609 00000 n +0002367144 00000 n +0002367205 00000 n +0002369528 00000 n +0002369681 00000 n +0002369834 00000 n +0002369985 00000 n +0002370136 00000 n +0002370288 00000 n +0002370440 00000 n +0002370593 00000 n +0002370744 00000 n +0002370895 00000 n +0002371048 00000 n +0002371199 00000 n +0002371351 00000 n +0002371502 00000 n +0002371655 00000 n +0002371808 00000 n +0002371961 00000 n +0002372113 00000 n +0002372265 00000 n +0002372418 00000 n +0002372570 00000 n +0002372722 00000 n +0002372874 00000 n +0002373027 00000 n +0002373180 00000 n +0002373333 00000 n +0002373484 00000 n +0002373636 00000 n +0002373789 00000 n +0002373942 00000 n +0002374095 00000 n +0002374247 00000 n +0002374400 00000 n +0002374551 00000 n +0002374703 00000 n +0002374856 00000 n +0002375009 00000 n +0002375162 00000 n +0002375314 00000 n +0002375467 00000 n +0002375618 00000 n +0002375771 00000 n +0002375923 00000 n +0002376076 00000 n +0002376229 00000 n +0002376381 00000 n +0002376534 00000 n +0002376687 00000 n +0002376840 00000 n +0002376993 00000 n +0002377145 00000 n +0002377297 00000 n +0002377449 00000 n +0002377602 00000 n +0002377751 00000 n +0002377903 00000 n +0002378056 00000 n +0002378209 00000 n +0002378362 00000 n +0002378513 00000 n +0002378664 00000 n +0002378815 00000 n +0002378965 00000 n +0002379201 00000 n +0002368597 00000 n +0002367353 00000 n +0002379140 00000 n +0002381273 00000 n +0002381426 00000 n +0002381579 00000 n +0002381730 00000 n +0002381883 00000 n +0002382036 00000 n +0002382187 00000 n +0002382339 00000 n +0002382492 00000 n +0002382645 00000 n +0002382798 00000 n +0002382950 00000 n +0002383103 00000 n +0002383254 00000 n +0002383407 00000 n +0002383559 00000 n +0002383711 00000 n +0002383863 00000 n +0002384015 00000 n +0002384167 00000 n +0002384318 00000 n +0002384469 00000 n +0002384620 00000 n +0002384772 00000 n +0002384925 00000 n +0002385078 00000 n +0002385231 00000 n +0002385382 00000 n +0002385534 00000 n +0002385685 00000 n +0002385838 00000 n +0002385991 00000 n +0002386142 00000 n +0002386294 00000 n +0002386447 00000 n +0002386600 00000 n +0002386753 00000 n +0002386904 00000 n +0002387057 00000 n +0002387210 00000 n +0002387363 00000 n +0002387514 00000 n +0002387666 00000 n +0002387818 00000 n +0002387971 00000 n +0002388124 00000 n +0002388277 00000 n +0002388429 00000 n +0002388582 00000 n +0002388734 00000 n +0002388887 00000 n +0002389040 00000 n +0002389193 00000 n +0002389346 00000 n +0002389499 00000 n +0002389652 00000 n +0002389802 00000 n +0002389954 00000 n +0002390107 00000 n +0002390260 00000 n +0002390413 00000 n +0002392908 00000 n +0002390566 00000 n +0002390802 00000 n +0002380514 00000 n +0002379301 00000 n +0002390741 00000 n +0002872782 00000 n +0002393061 00000 n +0002393214 00000 n +0002393367 00000 n +0002393520 00000 n +0002393672 00000 n +0002393824 00000 n +0002393975 00000 n +0002394127 00000 n +0002394280 00000 n +0002394433 00000 n +0002394586 00000 n +0002394738 00000 n +0002394891 00000 n +0002395044 00000 n +0002395197 00000 n +0002395349 00000 n +0002395500 00000 n +0002395653 00000 n +0002395805 00000 n +0002395957 00000 n +0002396109 00000 n +0002396261 00000 n +0002396413 00000 n +0002396566 00000 n +0002396718 00000 n +0002396869 00000 n +0002397022 00000 n +0002397175 00000 n +0002397327 00000 n +0002397479 00000 n +0002397632 00000 n +0002397784 00000 n +0002397937 00000 n +0002398087 00000 n +0002398239 00000 n +0002398392 00000 n +0002398545 00000 n +0002398698 00000 n +0002398851 00000 n +0002399002 00000 n +0002399151 00000 n +0002399303 00000 n +0002399456 00000 n +0002399609 00000 n +0002399759 00000 n +0002399912 00000 n +0002400062 00000 n +0002400215 00000 n +0002400368 00000 n +0002400521 00000 n +0002400673 00000 n +0002400826 00000 n +0002400979 00000 n +0002401132 00000 n +0002401285 00000 n +0002403823 00000 n +0002401438 00000 n +0002401674 00000 n +0002392199 00000 n +0002390902 00000 n +0002401613 00000 n +0002403976 00000 n +0002404127 00000 n +0002404280 00000 n +0002404433 00000 n +0002404586 00000 n +0002404739 00000 n +0002404890 00000 n +0002405043 00000 n +0002405196 00000 n +0002405349 00000 n +0002405502 00000 n +0002405655 00000 n +0002405805 00000 n +0002405958 00000 n +0002406111 00000 n +0002406264 00000 n +0002406417 00000 n +0002406569 00000 n +0002406721 00000 n +0002406873 00000 n +0002407026 00000 n +0002407179 00000 n +0002407331 00000 n +0002407483 00000 n +0002407634 00000 n +0002407787 00000 n +0002407939 00000 n +0002408091 00000 n +0002408244 00000 n +0002408397 00000 n +0002408550 00000 n +0002408703 00000 n +0002408856 00000 n +0002409009 00000 n +0002409162 00000 n +0002409315 00000 n +0002409468 00000 n +0002409620 00000 n +0002409772 00000 n +0002409924 00000 n +0002410076 00000 n +0002410228 00000 n +0002410380 00000 n +0002410532 00000 n +0002410684 00000 n +0002410836 00000 n +0002410989 00000 n +0002411142 00000 n +0002411295 00000 n +0002411448 00000 n +0002411598 00000 n +0002411748 00000 n +0002411900 00000 n +0002412052 00000 n +0002412205 00000 n +0002412358 00000 n +0002412511 00000 n +0002412664 00000 n +0002412817 00000 n +0002412970 00000 n +0002413123 00000 n +0002413276 00000 n +0002415752 00000 n +0002413427 00000 n +0002413663 00000 n +0002403044 00000 n +0002401774 00000 n +0002413602 00000 n +0002415905 00000 n +0002416057 00000 n +0002416210 00000 n +0002416363 00000 n +0002416516 00000 n +0002416668 00000 n +0002416819 00000 n +0002416972 00000 n +0002417125 00000 n +0002417278 00000 n +0002417430 00000 n +0002417582 00000 n +0002417734 00000 n +0002417886 00000 n +0002418039 00000 n +0002418190 00000 n +0002418342 00000 n +0002418494 00000 n +0002418645 00000 n +0002418798 00000 n +0002418951 00000 n +0002419104 00000 n +0002419257 00000 n +0002419409 00000 n +0002419562 00000 n +0002419715 00000 n +0002419868 00000 n +0002420021 00000 n +0002420173 00000 n +0002420326 00000 n +0002420479 00000 n +0002420632 00000 n +0002420784 00000 n +0002420937 00000 n +0002421090 00000 n +0002421242 00000 n +0002421395 00000 n +0002421547 00000 n +0002421700 00000 n +0002421853 00000 n +0002422006 00000 n +0002422158 00000 n +0002422311 00000 n +0002422463 00000 n +0002422615 00000 n +0002422768 00000 n +0002422921 00000 n +0002423074 00000 n +0002423227 00000 n +0002423380 00000 n +0002423529 00000 n +0002423678 00000 n +0002423831 00000 n +0002423984 00000 n +0002424137 00000 n +0002424290 00000 n +0002426953 00000 n +0002424442 00000 n +0002424678 00000 n +0002415033 00000 n +0002413763 00000 n +0002424617 00000 n +0002427106 00000 n +0002427259 00000 n +0002427411 00000 n +0002427563 00000 n +0002427715 00000 n +0002427867 00000 n +0002428019 00000 n +0002428172 00000 n +0002428324 00000 n +0002428477 00000 n +0002428630 00000 n +0002428783 00000 n +0002428935 00000 n +0002429085 00000 n +0002429238 00000 n +0002429391 00000 n +0002429544 00000 n +0002429697 00000 n +0002429849 00000 n +0002430001 00000 n +0002430153 00000 n +0002430304 00000 n +0002430457 00000 n +0002430610 00000 n +0002430762 00000 n +0002430915 00000 n +0002431068 00000 n +0002431221 00000 n +0002431373 00000 n +0002431525 00000 n +0002431677 00000 n +0002431827 00000 n +0002431980 00000 n +0002432133 00000 n +0002432286 00000 n +0002432439 00000 n +0002432592 00000 n +0002432744 00000 n +0002432896 00000 n +0002433047 00000 n +0002433200 00000 n +0002433353 00000 n +0002433506 00000 n +0002433656 00000 n +0002433809 00000 n +0002433962 00000 n +0002434115 00000 n +0002434268 00000 n +0002434420 00000 n +0002434572 00000 n +0002434724 00000 n +0002434876 00000 n +0002435026 00000 n +0002435179 00000 n +0002435332 00000 n +0002435485 00000 n +0002435637 00000 n +0002435789 00000 n +0002435942 00000 n +0002436094 00000 n +0002436247 00000 n +0002436399 00000 n +0002436552 00000 n +0002436705 00000 n +0002436858 00000 n +0002439296 00000 n +0002437010 00000 n +0002437246 00000 n +0002426144 00000 n +0002424778 00000 n +0002437185 00000 n +0002439449 00000 n +0002439602 00000 n +0002439755 00000 n +0002439907 00000 n +0002440060 00000 n +0002440212 00000 n +0002440364 00000 n +0002440517 00000 n +0002440670 00000 n +0002440822 00000 n +0002440974 00000 n +0002441127 00000 n +0002441280 00000 n +0002441433 00000 n +0002441586 00000 n +0002441739 00000 n +0002441891 00000 n +0002442044 00000 n +0002442197 00000 n +0002442350 00000 n +0002442503 00000 n +0002442655 00000 n +0002442808 00000 n +0002442960 00000 n +0002443113 00000 n +0002443266 00000 n +0002443419 00000 n +0002443572 00000 n +0002443725 00000 n +0002443877 00000 n +0002444030 00000 n +0002444182 00000 n +0002444335 00000 n +0002444487 00000 n +0002444640 00000 n +0002444792 00000 n +0002444944 00000 n +0002445096 00000 n +0002445248 00000 n +0002445400 00000 n +0002445552 00000 n +0002445704 00000 n +0002445857 00000 n +0002446010 00000 n +0002446162 00000 n +0002446314 00000 n +0002446467 00000 n +0002446620 00000 n +0002446773 00000 n +0002446926 00000 n +0002447078 00000 n +0002447231 00000 n +0002447384 00000 n +0002447537 00000 n +0002447690 00000 n +0002447843 00000 n +0002447995 00000 n +0002448147 00000 n +0002448300 00000 n +0002448452 00000 n +0002451675 00000 n +0002448602 00000 n +0002448838 00000 n +0002438537 00000 n +0002437359 00000 n +0002448777 00000 n +0002451828 00000 n +0002451981 00000 n +0002452133 00000 n +0002452285 00000 n +0002452438 00000 n +0002452591 00000 n +0002452744 00000 n +0002452897 00000 n +0002453049 00000 n +0002453202 00000 n +0002453353 00000 n +0002453506 00000 n +0002453659 00000 n +0002453812 00000 n +0002453965 00000 n +0002454117 00000 n +0002454270 00000 n +0002454423 00000 n +0002454576 00000 n +0002454728 00000 n +0002454880 00000 n +0002455033 00000 n +0002455185 00000 n +0002455337 00000 n +0002455489 00000 n +0002455641 00000 n +0002455793 00000 n +0002455944 00000 n +0002456096 00000 n +0002456247 00000 n +0002456398 00000 n +0002456548 00000 n +0002456698 00000 n +0002456850 00000 n +0002457002 00000 n +0002457154 00000 n +0002457306 00000 n +0002457458 00000 n +0002457609 00000 n +0002457761 00000 n +0002457912 00000 n +0002458064 00000 n +0002458215 00000 n +0002458368 00000 n +0002458521 00000 n +0002458672 00000 n +0002458825 00000 n +0002458976 00000 n +0002459127 00000 n +0002459280 00000 n +0002459431 00000 n +0002459584 00000 n +0002459736 00000 n +0002459888 00000 n +0002460041 00000 n +0002460194 00000 n +0002460346 00000 n +0002460499 00000 n +0002460650 00000 n +0002460802 00000 n +0002460954 00000 n +0002461106 00000 n +0002461259 00000 n +0002461411 00000 n +0002461564 00000 n +0002461717 00000 n +0002461870 00000 n +0002462022 00000 n +0002462174 00000 n +0002462325 00000 n +0002462477 00000 n +0002462628 00000 n +0002462780 00000 n +0002462933 00000 n +0002463085 00000 n +0002463237 00000 n +0002463390 00000 n +0002463542 00000 n +0002463693 00000 n +0002463845 00000 n +0002463998 00000 n +0002464150 00000 n +0002464302 00000 n +0002464453 00000 n +0002464603 00000 n +0002464751 00000 n +0002464902 00000 n +0002465054 00000 n +0002465207 00000 n +0002465359 00000 n +0002468728 00000 n +0002465509 00000 n +0002465745 00000 n +0002450616 00000 n +0002448964 00000 n +0002465684 00000 n +0002872915 00000 n +0002468880 00000 n +0002469032 00000 n +0002469185 00000 n +0002469337 00000 n +0002469489 00000 n +0002469640 00000 n +0002469792 00000 n +0002469945 00000 n +0002470097 00000 n +0002470250 00000 n +0002470402 00000 n +0002470555 00000 n +0002470707 00000 n +0002470859 00000 n +0002471012 00000 n +0002471165 00000 n +0002471317 00000 n +0002471469 00000 n +0002471622 00000 n +0002471775 00000 n +0002471928 00000 n +0002472081 00000 n +0002472233 00000 n +0002472385 00000 n +0002472538 00000 n +0002472690 00000 n +0002472841 00000 n +0002472994 00000 n +0002473147 00000 n +0002473300 00000 n +0002473453 00000 n +0002473606 00000 n +0002473759 00000 n +0002473911 00000 n +0002474064 00000 n +0002474216 00000 n +0002474369 00000 n +0002474522 00000 n +0002474674 00000 n +0002474827 00000 n +0002474980 00000 n +0002475132 00000 n +0002475285 00000 n +0002475437 00000 n +0002475590 00000 n +0002475742 00000 n +0002475893 00000 n +0002476046 00000 n +0002476199 00000 n +0002476352 00000 n +0002476505 00000 n +0002476657 00000 n +0002476810 00000 n +0002476962 00000 n +0002477113 00000 n +0002477265 00000 n +0002477418 00000 n +0002477571 00000 n +0002477723 00000 n +0002477876 00000 n +0002478028 00000 n +0002478181 00000 n +0002478333 00000 n +0002478486 00000 n +0002478637 00000 n +0002478789 00000 n +0002478942 00000 n +0002479094 00000 n +0002479246 00000 n +0002479398 00000 n +0002479551 00000 n +0002479704 00000 n +0002479856 00000 n +0002480009 00000 n +0002480162 00000 n +0002480315 00000 n +0002480468 00000 n +0002480621 00000 n +0002480774 00000 n +0002480927 00000 n +0002481080 00000 n +0002481233 00000 n +0002481386 00000 n +0002481539 00000 n +0002481692 00000 n +0002481844 00000 n +0002481997 00000 n +0002482150 00000 n +0002482303 00000 n +0002482456 00000 n +0002482608 00000 n +0002482761 00000 n +0002482913 00000 n +0002483066 00000 n +0002483219 00000 n +0002483371 00000 n +0002483524 00000 n +0002483677 00000 n +0002483829 00000 n +0002483982 00000 n +0002484134 00000 n +0002484287 00000 n +0002484439 00000 n +0002484592 00000 n +0002484745 00000 n +0002484898 00000 n +0002485050 00000 n +0002485203 00000 n +0002485354 00000 n +0002485506 00000 n +0002488729 00000 n +0002485657 00000 n +0002485893 00000 n +0002467469 00000 n +0002465858 00000 n +0002485832 00000 n +0002488882 00000 n +0002489035 00000 n +0002489188 00000 n +0002489341 00000 n +0002489494 00000 n +0002489646 00000 n +0002489799 00000 n +0002489951 00000 n +0002490103 00000 n +0002490255 00000 n +0002490408 00000 n +0002490560 00000 n +0002490711 00000 n +0002490863 00000 n +0002491015 00000 n +0002491168 00000 n +0002491319 00000 n +0002491472 00000 n +0002491624 00000 n +0002491776 00000 n +0002491929 00000 n +0002492082 00000 n +0002492234 00000 n +0002492387 00000 n +0002492540 00000 n +0002492692 00000 n +0002492845 00000 n +0002492998 00000 n +0002493151 00000 n +0002493304 00000 n +0002493457 00000 n +0002493610 00000 n +0002493761 00000 n +0002493913 00000 n +0002494066 00000 n +0002494217 00000 n +0002494369 00000 n +0002494522 00000 n +0002494673 00000 n +0002494826 00000 n +0002494979 00000 n +0002495131 00000 n +0002495283 00000 n +0002495434 00000 n +0002495586 00000 n +0002495739 00000 n +0002495892 00000 n +0002496045 00000 n +0002496198 00000 n +0002496351 00000 n +0002496502 00000 n +0002496652 00000 n +0002496805 00000 n +0002496957 00000 n +0002497110 00000 n +0002497263 00000 n +0002497415 00000 n +0002497568 00000 n +0002497719 00000 n +0002497871 00000 n +0002498024 00000 n +0002498175 00000 n +0002498328 00000 n +0002498481 00000 n +0002498633 00000 n +0002498785 00000 n +0002498938 00000 n +0002499089 00000 n +0002499242 00000 n +0002499395 00000 n +0002499547 00000 n +0002499700 00000 n +0002499851 00000 n +0002500003 00000 n +0002500156 00000 n +0002500309 00000 n +0002500462 00000 n +0002500615 00000 n +0002500767 00000 n +0002500920 00000 n +0002501073 00000 n +0002501226 00000 n +0002501379 00000 n +0002501532 00000 n +0002501685 00000 n +0002501837 00000 n +0002501990 00000 n +0002502143 00000 n +0002502295 00000 n +0002502448 00000 n +0002502600 00000 n +0002502751 00000 n +0002502903 00000 n +0002503055 00000 n +0002503208 00000 n +0002503358 00000 n +0002503511 00000 n +0002503663 00000 n +0002503816 00000 n +0002503969 00000 n +0002504122 00000 n +0002504274 00000 n +0002504427 00000 n +0002504580 00000 n +0002504732 00000 n +0002504885 00000 n +0002508277 00000 n +0002505037 00000 n +0002505273 00000 n +0002487510 00000 n +0002486006 00000 n +0002505212 00000 n +0002508430 00000 n +0002508582 00000 n +0002508735 00000 n +0002508888 00000 n +0002509041 00000 n +0002509192 00000 n +0002509345 00000 n +0002509497 00000 n +0002509650 00000 n +0002509803 00000 n +0002509954 00000 n +0002510107 00000 n +0002510260 00000 n +0002510413 00000 n +0002510565 00000 n +0002510718 00000 n +0002510871 00000 n +0002511024 00000 n +0002511177 00000 n +0002511330 00000 n +0002511483 00000 n +0002511636 00000 n +0002511789 00000 n +0002511942 00000 n +0002512095 00000 n +0002512248 00000 n +0002512401 00000 n +0002512553 00000 n +0002512706 00000 n +0002512858 00000 n +0002513010 00000 n +0002513163 00000 n +0002513316 00000 n +0002513469 00000 n +0002513621 00000 n +0002513774 00000 n +0002513926 00000 n +0002514079 00000 n +0002514231 00000 n +0002514382 00000 n +0002514535 00000 n +0002514688 00000 n +0002514839 00000 n +0002514992 00000 n +0002515140 00000 n +0002515291 00000 n +0002515444 00000 n +0002515596 00000 n +0002515749 00000 n +0002515902 00000 n +0002516055 00000 n +0002516207 00000 n +0002516360 00000 n +0002516512 00000 n +0002516663 00000 n +0002516816 00000 n +0002516968 00000 n +0002517120 00000 n +0002517273 00000 n +0002517426 00000 n +0002517579 00000 n +0002517731 00000 n +0002517884 00000 n +0002518036 00000 n +0002518189 00000 n +0002518342 00000 n +0002518494 00000 n +0002518647 00000 n +0002518799 00000 n +0002518952 00000 n +0002519104 00000 n +0002519257 00000 n +0002519410 00000 n +0002519563 00000 n +0002519715 00000 n +0002519868 00000 n +0002520021 00000 n +0002520174 00000 n +0002520327 00000 n +0002520480 00000 n +0002520633 00000 n +0002520786 00000 n +0002520939 00000 n +0002521092 00000 n +0002521244 00000 n +0002521396 00000 n +0002521549 00000 n +0002521701 00000 n +0002521852 00000 n +0002522004 00000 n +0002522157 00000 n +0002522310 00000 n +0002522461 00000 n +0002522613 00000 n +0002522765 00000 n +0002522917 00000 n +0002523070 00000 n +0002523223 00000 n +0002523376 00000 n +0002523528 00000 n +0002523681 00000 n +0002523834 00000 n +0002523986 00000 n +0002524137 00000 n +0002527604 00000 n +0002527756 00000 n +0002524288 00000 n +0002524524 00000 n +0002507078 00000 n +0002505386 00000 n +0002524463 00000 n +0002527909 00000 n +0002528061 00000 n +0002528214 00000 n +0002528366 00000 n +0002528519 00000 n +0002528670 00000 n +0002528823 00000 n +0002528974 00000 n +0002529127 00000 n +0002529279 00000 n +0002529432 00000 n +0002529585 00000 n +0002529737 00000 n +0002529890 00000 n +0002530043 00000 n +0002530196 00000 n +0002530348 00000 n +0002530500 00000 n +0002530653 00000 n +0002530806 00000 n +0002530958 00000 n +0002531111 00000 n +0002531263 00000 n +0002531416 00000 n +0002531568 00000 n +0002531721 00000 n +0002531874 00000 n +0002532027 00000 n +0002532180 00000 n +0002532332 00000 n +0002532485 00000 n +0002532638 00000 n +0002532790 00000 n +0002532943 00000 n +0002533096 00000 n +0002533248 00000 n +0002533399 00000 n +0002533552 00000 n +0002533704 00000 n +0002533857 00000 n +0002534009 00000 n +0002534162 00000 n +0002534314 00000 n +0002534467 00000 n +0002534620 00000 n +0002534772 00000 n +0002534923 00000 n +0002535076 00000 n +0002535228 00000 n +0002535381 00000 n +0002535534 00000 n +0002535687 00000 n +0002535840 00000 n +0002535993 00000 n +0002536146 00000 n +0002536298 00000 n +0002536449 00000 n +0002536602 00000 n +0002536754 00000 n +0002536907 00000 n +0002537058 00000 n +0002537210 00000 n +0002537362 00000 n +0002537515 00000 n +0002537667 00000 n +0002537819 00000 n +0002537972 00000 n +0002538123 00000 n +0002538275 00000 n +0002538428 00000 n +0002538581 00000 n +0002538734 00000 n +0002538886 00000 n +0002539039 00000 n +0002539192 00000 n +0002539343 00000 n +0002539496 00000 n +0002539649 00000 n +0002539801 00000 n +0002539954 00000 n +0002540107 00000 n +0002540260 00000 n +0002540413 00000 n +0002540566 00000 n +0002540718 00000 n +0002540871 00000 n +0002541023 00000 n +0002541175 00000 n +0002541328 00000 n +0002541480 00000 n +0002541631 00000 n +0002541784 00000 n +0002541937 00000 n +0002542090 00000 n +0002542243 00000 n +0002542395 00000 n +0002542548 00000 n +0002542700 00000 n +0002542853 00000 n +0002543005 00000 n +0002543158 00000 n +0002543310 00000 n +0002543462 00000 n +0002543615 00000 n +0002543768 00000 n +0002543921 00000 n +0002544073 00000 n +0002544226 00000 n +0002544379 00000 n +0002544532 00000 n +0002544684 00000 n +0002544837 00000 n +0002544990 00000 n +0002545143 00000 n +0002545296 00000 n +0002545447 00000 n +0002548787 00000 n +0002545598 00000 n +0002545834 00000 n +0002526275 00000 n +0002524650 00000 n +0002545773 00000 n +0002548940 00000 n +0002549093 00000 n +0002549246 00000 n +0002549399 00000 n +0002549552 00000 n +0002549704 00000 n +0002549857 00000 n +0002550008 00000 n +0002550161 00000 n +0002550314 00000 n +0002550466 00000 n +0002550615 00000 n +0002550765 00000 n +0002550918 00000 n +0002551070 00000 n +0002551222 00000 n +0002551375 00000 n +0002551526 00000 n +0002551679 00000 n +0002551832 00000 n +0002551985 00000 n +0002552138 00000 n +0002552291 00000 n +0002552444 00000 n +0002552597 00000 n +0002552750 00000 n +0002552903 00000 n +0002553056 00000 n +0002553209 00000 n +0002553360 00000 n +0002553513 00000 n +0002553665 00000 n +0002553818 00000 n +0002553971 00000 n +0002554124 00000 n +0002554277 00000 n +0002554430 00000 n +0002554583 00000 n +0002554735 00000 n +0002554888 00000 n +0002555039 00000 n +0002555192 00000 n +0002555344 00000 n +0002555497 00000 n +0002555650 00000 n +0002555803 00000 n +0002555956 00000 n +0002556109 00000 n +0002556261 00000 n +0002556414 00000 n +0002556566 00000 n +0002556719 00000 n +0002556872 00000 n +0002557025 00000 n +0002557178 00000 n +0002557330 00000 n +0002557483 00000 n +0002557636 00000 n +0002557787 00000 n +0002557938 00000 n +0002558090 00000 n +0002558243 00000 n +0002558395 00000 n +0002558547 00000 n +0002558700 00000 n +0002558852 00000 n +0002559004 00000 n +0002559156 00000 n +0002559308 00000 n +0002559461 00000 n +0002559612 00000 n +0002559765 00000 n +0002559918 00000 n +0002560071 00000 n +0002560223 00000 n +0002560376 00000 n +0002560527 00000 n +0002560680 00000 n +0002560831 00000 n +0002560984 00000 n +0002561137 00000 n +0002561290 00000 n +0002561443 00000 n +0002561596 00000 n +0002561749 00000 n +0002561902 00000 n +0002562055 00000 n +0002562208 00000 n +0002562361 00000 n +0002562514 00000 n +0002562667 00000 n +0002562820 00000 n +0002562973 00000 n +0002563126 00000 n +0002563279 00000 n +0002563430 00000 n +0002563582 00000 n +0002563735 00000 n +0002563887 00000 n +0002564040 00000 n +0002564192 00000 n +0002564344 00000 n +0002564497 00000 n +0002564649 00000 n +0002564802 00000 n +0002564953 00000 n +0002565106 00000 n +0002565259 00000 n +0002565412 00000 n +0002565565 00000 n +0002565718 00000 n +0002565871 00000 n +0002566024 00000 n +0002566176 00000 n +0002569405 00000 n +0002566327 00000 n +0002566563 00000 n +0002547488 00000 n +0002545947 00000 n +0002566502 00000 n +0002569558 00000 n +0002569711 00000 n +0002569864 00000 n +0002570016 00000 n +0002570169 00000 n +0002570320 00000 n +0002570473 00000 n +0002570625 00000 n +0002570778 00000 n +0002570930 00000 n +0002571083 00000 n +0002571236 00000 n +0002571388 00000 n +0002571541 00000 n +0002571694 00000 n +0002571846 00000 n +0002571999 00000 n +0002572152 00000 n +0002572305 00000 n +0002572457 00000 n +0002572610 00000 n +0002572762 00000 n +0002572915 00000 n +0002573068 00000 n +0002573221 00000 n +0002573374 00000 n +0002573526 00000 n +0002573679 00000 n +0002573832 00000 n +0002573985 00000 n +0002574138 00000 n +0002574291 00000 n +0002574443 00000 n +0002574596 00000 n +0002574745 00000 n +0002574896 00000 n +0002575048 00000 n +0002575200 00000 n +0002575351 00000 n +0002575504 00000 n +0002575656 00000 n +0002575809 00000 n +0002575961 00000 n +0002576113 00000 n +0002576266 00000 n +0002576418 00000 n +0002576571 00000 n +0002576724 00000 n +0002576877 00000 n +0002577030 00000 n +0002577182 00000 n +0002577335 00000 n +0002577488 00000 n +0002577639 00000 n +0002577790 00000 n +0002577942 00000 n +0002578095 00000 n +0002578248 00000 n +0002578401 00000 n +0002578554 00000 n +0002578705 00000 n +0002578858 00000 n +0002579010 00000 n +0002579162 00000 n +0002579314 00000 n +0002579467 00000 n +0002579620 00000 n +0002579772 00000 n +0002579925 00000 n +0002580078 00000 n +0002580231 00000 n +0002580384 00000 n +0002580537 00000 n +0002580690 00000 n +0002580841 00000 n +0002580993 00000 n +0002581146 00000 n +0002581299 00000 n +0002581452 00000 n +0002581604 00000 n +0002581756 00000 n +0002581908 00000 n +0002582061 00000 n +0002582211 00000 n +0002582363 00000 n +0002582514 00000 n +0002582666 00000 n +0002582818 00000 n +0002582970 00000 n +0002583120 00000 n +0002583272 00000 n +0002583424 00000 n +0002583576 00000 n +0002583727 00000 n +0002586634 00000 n +0002583877 00000 n +0002584113 00000 n +0002568306 00000 n +0002566676 00000 n +0002584052 00000 n +0002873048 00000 n +0002586785 00000 n +0002586935 00000 n +0002587087 00000 n +0002587239 00000 n +0002587391 00000 n +0002587541 00000 n +0002587693 00000 n +0002587844 00000 n +0002587995 00000 n +0002588146 00000 n +0002588298 00000 n +0002588449 00000 n +0002588600 00000 n +0002588751 00000 n +0002588903 00000 n +0002589054 00000 n +0002589206 00000 n +0002589358 00000 n +0002589510 00000 n +0002589662 00000 n +0002589814 00000 n +0002589966 00000 n +0002590118 00000 n +0002590269 00000 n +0002590420 00000 n +0002590571 00000 n +0002590723 00000 n +0002590873 00000 n +0002591025 00000 n +0002591176 00000 n +0002591328 00000 n +0002591479 00000 n +0002591631 00000 n +0002591783 00000 n +0002591935 00000 n +0002592085 00000 n +0002592237 00000 n +0002592388 00000 n +0002592540 00000 n +0002592691 00000 n +0002592843 00000 n +0002592995 00000 n +0002593146 00000 n +0002593298 00000 n +0002593450 00000 n +0002593602 00000 n +0002593754 00000 n +0002593905 00000 n +0002594057 00000 n +0002594209 00000 n +0002594359 00000 n +0002594509 00000 n +0002594659 00000 n +0002594812 00000 n +0002594964 00000 n +0002595117 00000 n +0002595270 00000 n +0002595423 00000 n +0002595576 00000 n +0002595729 00000 n +0002595882 00000 n +0002596035 00000 n +0002596188 00000 n +0002596341 00000 n +0002596494 00000 n +0002596647 00000 n +0002596800 00000 n +0002596953 00000 n +0002597106 00000 n +0002597259 00000 n +0002597410 00000 n +0002597562 00000 n +0002597714 00000 n +0002597867 00000 n +0002598020 00000 n +0002598172 00000 n +0002598324 00000 n +0002598477 00000 n +0002600964 00000 n +0002598628 00000 n +0002598864 00000 n +0002585695 00000 n +0002584226 00000 n +0002598803 00000 n +0002601117 00000 n +0002601270 00000 n +0002601422 00000 n +0002601574 00000 n +0002601724 00000 n +0002601877 00000 n +0002602030 00000 n +0002602183 00000 n +0002602336 00000 n +0002602488 00000 n +0002602640 00000 n +0002602791 00000 n +0002602944 00000 n +0002603097 00000 n +0002603250 00000 n +0002603402 00000 n +0002603554 00000 n +0002603706 00000 n +0002603857 00000 n +0002604010 00000 n +0002604163 00000 n +0002604315 00000 n +0002604467 00000 n +0002604619 00000 n +0002604771 00000 n +0002604922 00000 n +0002605073 00000 n +0002605226 00000 n +0002605378 00000 n +0002605531 00000 n +0002605684 00000 n +0002605836 00000 n +0002605989 00000 n +0002606142 00000 n +0002606292 00000 n +0002606443 00000 n +0002606596 00000 n +0002606749 00000 n +0002606900 00000 n +0002607053 00000 n +0002607206 00000 n +0002607358 00000 n +0002607511 00000 n +0002607664 00000 n +0002607817 00000 n +0002607969 00000 n +0002608122 00000 n +0002608273 00000 n +0002608423 00000 n +0002608573 00000 n +0002608722 00000 n +0002608871 00000 n +0002609020 00000 n +0002609170 00000 n +0002609323 00000 n +0002609476 00000 n +0002609629 00000 n +0002609780 00000 n +0002609931 00000 n +0002610084 00000 n +0002610236 00000 n +0002610385 00000 n +0002610536 00000 n +0002613112 00000 n +0002610687 00000 n +0002610923 00000 n +0002600175 00000 n +0002598964 00000 n +0002610862 00000 n +0002613265 00000 n +0002613418 00000 n +0002613571 00000 n +0002613723 00000 n +0002613875 00000 n +0002614027 00000 n +0002614180 00000 n +0002614333 00000 n +0002614486 00000 n +0002614638 00000 n +0002614791 00000 n +0002614943 00000 n +0002615094 00000 n +0002615247 00000 n +0002615400 00000 n +0002615553 00000 n +0002615706 00000 n +0002615858 00000 n +0002616011 00000 n +0002616163 00000 n +0002616316 00000 n +0002616469 00000 n +0002616622 00000 n +0002616775 00000 n +0002616928 00000 n +0002617080 00000 n +0002617232 00000 n +0002617385 00000 n +0002617538 00000 n +0002617691 00000 n +0002617844 00000 n +0002617997 00000 n +0002618150 00000 n +0002618303 00000 n +0002618455 00000 n +0002618608 00000 n +0002618761 00000 n +0002618914 00000 n +0002619066 00000 n +0002619219 00000 n +0002619371 00000 n +0002619524 00000 n +0002619677 00000 n +0002619830 00000 n +0002619982 00000 n +0002620134 00000 n +0002620285 00000 n +0002620437 00000 n +0002620590 00000 n +0002620742 00000 n +0002620895 00000 n +0002621048 00000 n +0002621201 00000 n +0002621354 00000 n +0002621504 00000 n +0002621656 00000 n +0002621808 00000 n +0002621961 00000 n +0002622114 00000 n +0002622267 00000 n +0002622420 00000 n +0002622572 00000 n +0002622725 00000 n +0002624910 00000 n +0002622878 00000 n +0002623114 00000 n +0002612323 00000 n +0002611023 00000 n +0002623053 00000 n +0002625061 00000 n +0002625213 00000 n +0002625365 00000 n +0002625515 00000 n +0002625668 00000 n +0002625821 00000 n +0002625974 00000 n +0002626127 00000 n +0002626279 00000 n +0002626431 00000 n +0002626582 00000 n +0002626733 00000 n +0002626886 00000 n +0002627039 00000 n +0002627192 00000 n +0002627345 00000 n +0002627497 00000 n +0002627649 00000 n +0002627801 00000 n +0002627953 00000 n +0002628105 00000 n +0002628257 00000 n +0002628409 00000 n +0002628561 00000 n +0002628713 00000 n +0002628865 00000 n +0002629017 00000 n +0002629169 00000 n +0002629320 00000 n +0002629471 00000 n +0002629620 00000 n +0002629770 00000 n +0002629920 00000 n +0002630070 00000 n +0002630220 00000 n +0002630370 00000 n +0002630520 00000 n +0002630672 00000 n +0002630824 00000 n +0002630974 00000 n +0002631124 00000 n +0002631274 00000 n +0002631424 00000 n +0002631576 00000 n +0002631729 00000 n +0002631881 00000 n +0002632034 00000 n +0002632186 00000 n +0002632422 00000 n +0002624281 00000 n +0002623214 00000 n +0002632361 00000 n +0002632522 00000 n +0002632565 00000 n +0002632693 00000 n +0002632720 00000 n +0002632825 00000 n +0002633283 00000 n +0002633914 00000 n +0002634323 00000 n +0002634471 00000 n +0002634510 00000 n +0002858050 00000 n +0002634549 00000 n +0002635026 00000 n +0002635379 00000 n +0002635406 00000 n +0002636043 00000 n +0002636145 00000 n +0002636425 00000 n +0002637118 00000 n +0002637147 00000 n +0002637746 00000 n +0002637906 00000 n +0002638161 00000 n +0002638644 00000 n +0002639315 00000 n +0002639887 00000 n +0002640073 00000 n +0002640971 00000 n +0002641618 00000 n +0002642011 00000 n +0002642587 00000 n +0002643280 00000 n +0002643319 00000 n +0002643981 00000 n +0002644881 00000 n +0002646727 00000 n +0002646960 00000 n +0002652975 00000 n +0002653573 00000 n +0002664770 00000 n +0002665165 00000 n +0002666982 00000 n +0002667219 00000 n +0002669773 00000 n +0002670003 00000 n +0002672781 00000 n +0002673013 00000 n +0002678293 00000 n +0002678565 00000 n +0002680381 00000 n +0002680617 00000 n +0002683406 00000 n +0002683681 00000 n +0002687724 00000 n +0002687974 00000 n +0002689886 00000 n +0002690110 00000 n +0002700049 00000 n +0002700457 00000 n +0002702591 00000 n +0002702828 00000 n +0002707026 00000 n +0002707287 00000 n +0002713496 00000 n +0002713818 00000 n +0002718328 00000 n +0002718625 00000 n +0002727106 00000 n +0002727735 00000 n +0002729170 00000 n +0002729419 00000 n +0002731969 00000 n +0002732244 00000 n +0002734358 00000 n +0002734646 00000 n +0002736666 00000 n +0002736914 00000 n +0002738525 00000 n +0002738777 00000 n +0002740750 00000 n +0002740979 00000 n +0002744010 00000 n +0002744244 00000 n +0002746124 00000 n +0002746364 00000 n +0002750745 00000 n +0002750989 00000 n +0002770866 00000 n +0002771504 00000 n +0002779728 00000 n +0002780022 00000 n +0002799382 00000 n +0002799941 00000 n +0002815328 00000 n +0002815711 00000 n +0002837776 00000 n +0002838483 00000 n +0002857470 00000 n +0002873171 00000 n +0002873293 00000 n +0002873420 00000 n +0002873548 00000 n +0002873676 00000 n +0002873804 00000 n +0002873932 00000 n +0002874060 00000 n +0002874188 00000 n +0002874316 00000 n +0002874444 00000 n +0002874572 00000 n +0002874705 00000 n +0002874809 00000 n +0002874944 00000 n +0002875079 00000 n +0002875163 00000 n +0002875250 00000 n +0002882884 00000 n +0002883055 00000 n +0002883397 00000 n +0002884127 00000 n +0002884857 00000 n +0002885587 00000 n +0002886317 00000 n +0002887047 00000 n +0002887777 00000 n +0002888507 00000 n +0002889237 00000 n +0002889967 00000 n +0002890697 00000 n +0002891427 00000 n +0002892157 00000 n +0002892887 00000 n +0002893617 00000 n +0002894347 00000 n +0002895077 00000 n +0002895807 00000 n +0002896537 00000 n +0002897263 00000 n +0002897974 00000 n +0002898656 00000 n +0002899338 00000 n +0002900020 00000 n +0002900702 00000 n +0002901384 00000 n +0002902066 00000 n +0002902748 00000 n +0002903430 00000 n +0002904112 00000 n +0002904794 00000 n +0002905476 00000 n +0002906158 00000 n +0002906840 00000 n +0002907522 00000 n +0002908204 00000 n +0002908886 00000 n +0002909568 00000 n +0002910203 00000 n +0002910965 00000 n +0002911727 00000 n +0002912489 00000 n +0002913201 00000 n +0002913979 00000 n +0002914757 00000 n +0002915535 00000 n +0002916313 00000 n +0002917091 00000 n +0002917869 00000 n +0002918647 00000 n +0002919425 00000 n +0002920203 00000 n +0002920981 00000 n +0002921759 00000 n +0002922537 00000 n +0002923315 00000 n +0002924093 00000 n +0002924871 00000 n +0002925649 00000 n +0002926427 00000 n +0002927147 00000 n +0002927885 00000 n +0002928623 00000 n +0002929361 00000 n +0002930090 00000 n +0002930864 00000 n +0002931818 00000 n +0002932715 00000 n +0002933517 00000 n +0002934319 00000 n +0002935121 00000 n +0002935923 00000 n +0002936701 00000 n +0002937439 00000 n +0002938177 00000 n +0002938882 00000 n +0002939620 00000 n +0002940358 00000 n +0002941096 00000 n +0002941834 00000 n +0002942572 00000 n +0002943370 00000 n +0002944324 00000 n +0002945164 00000 n +0002945966 00000 n +0002946768 00000 n +0002947570 00000 n +0002948348 00000 n +0002949086 00000 n +0002949952 00000 n +0002950690 00000 n +0002951443 00000 n +0002952178 00000 n +0002952924 00000 n +0002953670 00000 n +0002954416 00000 n +0002955069 00000 n +0002955823 00000 n +0002956577 00000 n +0002957259 00000 n +0002957989 00000 n +0002958719 00000 n +0002959577 00000 n +0002960307 00000 n +0002961044 00000 n +0002961924 00000 n +0002962832 00000 n +0002963626 00000 n +0002964420 00000 n +0002965214 00000 n +0002965976 00000 n +0002966706 00000 n +0002967436 00000 n +0002968117 00000 n +0002968807 00000 n +0002969497 00000 n +0002970187 00000 n +0002970877 00000 n +0002971567 00000 n +0002972257 00000 n +0002972947 00000 n +0002973637 00000 n +0002974327 00000 n +0002975017 00000 n +0002975707 00000 n +0002976397 00000 n +0002977087 00000 n +0002977822 00000 n +0002978573 00000 n +0002979415 00000 n +0002980289 00000 n +0002981067 00000 n +0002981845 00000 n +0002982602 00000 n +0002983596 00000 n +0002984533 00000 n +0002985375 00000 n +0002986217 00000 n +0002987059 00000 n +0002987901 00000 n +0002988743 00000 n +0002989521 00000 n +0002990299 00000 n +0002991011 00000 n +0002991701 00000 n +0002992391 00000 n +0002993081 00000 n +0002993771 00000 n +0002994461 00000 n +0002995189 00000 n +0002995917 00000 n +0002996639 00000 n +0002997361 00000 n +0002998110 00000 n +0002998912 00000 n +0002999714 00000 n +0003000516 00000 n +0003001318 00000 n +0003002120 00000 n +0003002922 00000 n +0003003724 00000 n +0003004469 00000 n +0003005287 00000 n +0003006041 00000 n +0003006795 00000 n +0003007549 00000 n +0003008303 00000 n +0003009185 00000 n +0003009939 00000 n +0003010674 00000 n +0003011452 00000 n +0003012230 00000 n +0003012967 00000 n +0003013713 00000 n +0003014499 00000 n +0003015285 00000 n +0003016071 00000 n +0003016857 00000 n +0003017643 00000 n +0003018429 00000 n +0003019215 00000 n +0003020001 00000 n +0003020787 00000 n +0003021573 00000 n +0003022359 00000 n +0003023145 00000 n +0003023931 00000 n +0003024717 00000 n +0003025503 00000 n +0003026289 00000 n +0003027074 00000 n +0003027948 00000 n +0003028822 00000 n +0003029696 00000 n +0003030570 00000 n +0003031444 00000 n +0003032318 00000 n +0003033192 00000 n +0003034066 00000 n +0003034940 00000 n +0003035814 00000 n +0003036688 00000 n +0003037562 00000 n +0003038436 00000 n +0003039310 00000 n +0003040184 00000 n +0003041058 00000 n +0003041853 00000 n +0003042655 00000 n +0003043457 00000 n +0003044259 00000 n +0003045061 00000 n +0003045863 00000 n +0003046665 00000 n +0003047467 00000 n +0003048269 00000 n +0003049071 00000 n +0003049873 00000 n +0003050675 00000 n +0003051477 00000 n +0003052279 00000 n +0003053081 00000 n +0003053883 00000 n +0003054656 00000 n +0003055466 00000 n +0003056276 00000 n +0003057053 00000 n +0003057863 00000 n +0003058595 00000 n +0003059333 00000 n +0003060071 00000 n +0003060809 00000 n +0003061547 00000 n +0003062285 00000 n +0003063023 00000 n +0003063761 00000 n +0003064499 00000 n +0003065237 00000 n +0003065975 00000 n +0003066713 00000 n +0003067451 00000 n +0003068189 00000 n +0003068927 00000 n +0003069665 00000 n +0003070403 00000 n +0003071141 00000 n +0003071879 00000 n +0003072577 00000 n +0003073305 00000 n +0003074033 00000 n +0003074761 00000 n +0003075489 00000 n +0003076217 00000 n +0003076945 00000 n +0003077673 00000 n +0003078350 00000 n +0003079080 00000 n +0003079741 00000 n +0003080469 00000 n +0003081199 00000 n +0003081975 00000 n +0003082572 00000 n +0003082918 00000 n +0003083264 00000 n +0003083610 00000 n +0003083956 00000 n +0003084302 00000 n +0003084710 00000 n +0003085312 00000 n +0003085914 00000 n +0003086648 00000 n +0003087514 00000 n +0003088380 00000 n +0003089246 00000 n +0003090112 00000 n +0003090978 00000 n +0003091844 00000 n +0003092710 00000 n +0003093083 00000 n +0003093298 00000 n +0003093509 00000 n +0003093726 00000 n +0003093928 00000 n +0003094132 00000 n +0003094335 00000 n +0003094599 00000 n +0003094845 00000 n +0003095109 00000 n +0003095442 00000 n +0003095805 00000 n +0003096061 00000 n +0003096404 00000 n +0003096681 00000 n +0003097018 00000 n +0003097369 00000 n +0003097646 00000 n +0003097846 00000 n +0003098173 00000 n +0003098405 00000 n +0003098644 00000 n +0003098911 00000 n +0003099129 00000 n +0003099573 00000 n +0003099931 00000 n +0003100200 00000 n +0003100481 00000 n +0003100752 00000 n +0003101124 00000 n +0003101503 00000 n +0003101828 00000 n +0003102098 00000 n +0003102381 00000 n +0003102676 00000 n +0003102951 00000 n +0003103440 00000 n +0003104099 00000 n +0003104757 00000 n +0003105415 00000 n +0003106073 00000 n +0003106731 00000 n +0003107389 00000 n +0003107937 00000 n +0003108116 00000 n +0003108302 00000 n +0003108485 00000 n +0003108668 00000 n +0003108854 00000 n +0003109038 00000 n +0003109224 00000 n +0003109408 00000 n +0003109594 00000 n +0003109778 00000 n +0003109964 00000 n +0003110148 00000 n +0003110334 00000 n +0003110517 00000 n +0003110700 00000 n +0003110886 00000 n +0003111070 00000 n +0003111256 00000 n +0003111437 00000 n +0003111623 00000 n +0003111807 00000 n +0003111993 00000 n +0003112177 00000 n +0003112363 00000 n +0003112547 00000 n +0003112733 00000 n +0003112916 00000 n +0003113099 00000 n +0003113285 00000 n +0003113469 00000 n +0003113655 00000 n +0003113839 00000 n +0003114025 00000 n +0003114209 00000 n +0003114395 00000 n +0003114579 00000 n +0003114765 00000 n +0003114944 00000 n +0003115130 00000 n +0003115313 00000 n +0003115496 00000 n +0003115682 00000 n +0003115866 00000 n +0003116052 00000 n +0003116236 00000 n +0003116422 00000 n +0003116606 00000 n +0003116792 00000 n +0003116977 00000 n +0003117163 00000 n +0003117347 00000 n +0003117531 00000 n +0003117717 00000 n +0003117902 00000 n +0003118088 00000 n +0003118273 00000 n +0003118465 00000 n +0003118655 00000 n +0003118847 00000 n +0003119037 00000 n +0003119229 00000 n +0003119419 00000 n +0003119611 00000 n +0003119800 00000 n +0003119983 00000 n +0003120159 00000 n +0003120337 00000 n +0003120512 00000 n +0003120687 00000 n +0003120865 00000 n +0003121041 00000 n +0003121219 00000 n +0003121395 00000 n +0003121573 00000 n +0003121776 00000 n +0003122039 00000 n +0003122306 00000 n +0003122572 00000 n +0003122846 00000 n +0003123119 00000 n +0003123393 00000 n +0003123666 00000 n +0003123940 00000 n +0003124213 00000 n +0003124487 00000 n +0003124760 00000 n +0003125034 00000 n +0003125306 00000 n +0003125573 00000 n +0003125839 00000 n +0003126111 00000 n +0003126390 00000 n +0003126672 00000 n +0003126952 00000 n +0003127228 00000 n +0003127502 00000 n +0003127776 00000 n +0003128050 00000 n +0003128326 00000 n +0003128600 00000 n +0003128873 00000 n +0003129155 00000 n +0003129431 00000 n +0003129708 00000 n +0003129985 00000 n +0003130261 00000 n +0003130543 00000 n +0003130824 00000 n +0003131106 00000 n +0003131387 00000 n +0003131669 00000 n +0003131950 00000 n +0003132232 00000 n +0003132512 00000 n +0003132792 00000 n +0003133074 00000 n +0003133353 00000 n +0003133627 00000 n +0003133901 00000 n +0003134175 00000 n +0003134449 00000 n +0003134723 00000 n +0003134997 00000 n +0003135275 00000 n +0003135557 00000 n +0003135838 00000 n +0003136115 00000 n +0003136389 00000 n +0003136666 00000 n +0003136942 00000 n +0003137216 00000 n +0003137494 00000 n +0003137768 00000 n +0003138043 00000 n +0003138317 00000 n +0003138599 00000 n +0003138880 00000 n +0003139162 00000 n +0003139443 00000 n +0003139725 00000 n +0003140006 00000 n +0003140288 00000 n +0003140569 00000 n +0003140845 00000 n +0003141122 00000 n +0003141398 00000 n +0003141675 00000 n +0003141951 00000 n +0003142233 00000 n +0003142514 00000 n +0003142796 00000 n +0003143077 00000 n +0003143359 00000 n +0003143640 00000 n +0003143917 00000 n +0003144191 00000 n +0003144465 00000 n +0003144743 00000 n +0003145025 00000 n +0003145306 00000 n +0003145588 00000 n +0003145868 00000 n +0003146148 00000 n +0003146430 00000 n +0003146711 00000 n +0003146989 00000 n +0003147263 00000 n +0003147536 00000 n +0003147805 00000 n +0003148073 00000 n +0003148347 00000 n +0003148620 00000 n +0003148894 00000 n +0003149167 00000 n +0003149441 00000 n +0003149714 00000 n +0003149988 00000 n +0003150260 00000 n +0003150530 00000 n +0003150796 00000 n +0003151065 00000 n +0003151339 00000 n +0003151613 00000 n +0003151890 00000 n +0003152175 00000 n +0003152461 00000 n +0003152749 00000 n +0003153035 00000 n +0003153323 00000 n +0003153608 00000 n +0003153893 00000 n +0003154181 00000 n +0003154467 00000 n +0003154755 00000 n +0003155036 00000 n +0003155316 00000 n +0003155596 00000 n +0003155876 00000 n +0003156153 00000 n +0003156423 00000 n +0003156689 00000 n +0003156960 00000 n +0003157234 00000 n +0003157506 00000 n +0003157778 00000 n +0003158052 00000 n +0003158325 00000 n +0003158597 00000 n +0003158863 00000 n +0003159129 00000 n +0003159395 00000 n +0003159661 00000 n +0003159925 00000 n +0003160183 00000 n +0003160441 00000 n +0003160670 00000 n +0003160888 00000 n +0003161105 00000 n +0003161323 00000 n +0003161540 00000 n +0003161758 00000 n +0003161974 00000 n +0003162190 00000 n +0003162408 00000 n +0003162625 00000 n +0003162843 00000 n +0003163060 00000 n +0003163281 00000 n +0003163503 00000 n +0003163727 00000 n +0003163949 00000 n +0003164158 00000 n +0003164368 00000 n +0003164576 00000 n +0003164784 00000 n +0003164994 00000 n +0003165203 00000 n +0003165413 00000 n +0003165622 00000 n +0003165832 00000 n +0003166041 00000 n +0003166251 00000 n +0003166460 00000 n +0003166670 00000 n +0003166878 00000 n +0003167081 00000 n +0003167268 00000 n +0003167690 00000 n +0003168328 00000 n +0003168903 00000 n +0003169131 00000 n +0003169353 00000 n +0003169588 00000 n +0003169832 00000 n +0003170075 00000 n +0003170319 00000 n +0003170562 00000 n +0003170806 00000 n +0003171049 00000 n +0003171293 00000 n +0003171526 00000 n +0003171767 00000 n +0003172041 00000 n +0003172317 00000 n +0003172588 00000 n +0003172857 00000 n +0003173127 00000 n +0003173403 00000 n +0003173675 00000 n +0003173943 00000 n +0003174211 00000 n +0003174479 00000 n +0003174752 00000 n +0003175023 00000 n +0003175296 00000 n +0003175578 00000 n +0003175866 00000 n +0003176156 00000 n +0003176446 00000 n +0003176736 00000 n +0003177023 00000 n +0003177313 00000 n +0003177603 00000 n +0003177893 00000 n +0003178182 00000 n +0003178472 00000 n +0003178762 00000 n +0003179052 00000 n +0003179342 00000 n +0003179627 00000 n +0003179918 00000 n +0003180214 00000 n +0003180510 00000 n +0003180801 00000 n +0003181083 00000 n +0003181365 00000 n +0003181641 00000 n +0003181835 00000 n +0003182096 00000 n +0003182357 00000 n +0003182612 00000 n +0003182861 00000 n +0003183110 00000 n +0003183369 00000 n +0003183640 00000 n +0003183913 00000 n +0003184186 00000 n +0003184462 00000 n +0003184741 00000 n +0003185012 00000 n +0003185302 00000 n +0003185592 00000 n +0003185888 00000 n +0003186151 00000 n +0003186420 00000 n +0003186689 00000 n +0003186945 00000 n +0003187196 00000 n +0003187458 00000 n +0003187739 00000 n +0003188020 00000 n +0003188282 00000 n +0003188547 00000 n +0003188826 00000 n +0003189099 00000 n +0003189399 00000 n +0003189671 00000 n +0003189946 00000 n +0003190232 00000 n +0003190529 00000 n +0003190826 00000 n +0003191114 00000 n +0003191393 00000 n +0003191672 00000 n +0003191952 00000 n +0003192224 00000 n +0003192487 00000 n +0003192750 00000 n +0003193011 00000 n +0003193271 00000 n +0003193450 00000 n +0003193647 00000 n +0003193909 00000 n +0003194123 00000 n +0003194253 00000 n +0003194392 00000 n +0003194530 00000 n +0003194659 00000 n +0003194814 00000 n +0003195016 00000 n +0003195200 00000 n +0003195325 00000 n +0003195450 00000 n +0003195574 00000 n +0003195699 00000 n +0003195824 00000 n +0003195949 00000 n +0003196072 00000 n +0003196197 00000 n +0003196322 00000 n +0003196447 00000 n +0003196571 00000 n +0003196693 00000 n +0003196828 00000 n +0003196975 00000 n +0003197122 00000 n +0003197269 00000 n +0003197416 00000 n +0003197564 00000 n +0003197712 00000 n +0003197860 00000 n +0003198007 00000 n +0003198154 00000 n +0003198302 00000 n +0003198450 00000 n +0003198598 00000 n +0003198746 00000 n +0003198893 00000 n +0003199040 00000 n +0003199186 00000 n +0003199333 00000 n +0003199481 00000 n +0003199630 00000 n +0003199778 00000 n +0003199924 00000 n +0003200070 00000 n +0003200209 00000 n +0003200341 00000 n +0003200474 00000 n +0003200605 00000 n +0003200736 00000 n +0003200865 00000 n +0003200999 00000 n +0003201140 00000 n +0003201284 00000 n +0003201431 00000 n +0003201580 00000 n +0003201731 00000 n +0003201882 00000 n +0003202031 00000 n +0003202139 00000 n +0003202327 00000 n +0003202591 00000 n +0003202869 00000 n +0003203144 00000 n +0003203418 00000 n +0003203695 00000 n +0003203964 00000 n +0003204157 00000 n +0003204283 00000 n +0003204408 00000 n +0003204530 00000 n +0003204666 00000 n +0003204814 00000 n +0003204961 00000 n +0003205101 00000 n +0003205238 00000 n +0003205384 00000 n +0003205492 00000 n +0003205695 00000 n +0003205909 00000 n +0003206057 00000 n +0003206164 00000 n +0003206206 00000 n +0003206410 00000 n +trailer +<< /Size 13024 +/Root 13022 0 R +/Info 13023 0 R +/ID [ ] >> +startxref +3206743 +%%EOF diff --git a/doc/ppl-user-0.10.2.ps.gz b/doc/ppl-user-0.10.2.ps.gz new file mode 100644 index 0000000000000000000000000000000000000000..e957f5879c6711f4770339975182505d082331f4 GIT binary patch literal 1193762 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:c^lr09jAe&dwh6nEbK2&INwetes!-90+O&bE3K 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≻b5WqbR$d6h9^qF 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

Fl-e=~7N=v|$Xh*egN79tI7 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 yFer>H;!br5d&+E;? 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

4G?!9f@2i1rOTvw9>s9rQJ()n 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

&Ws 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≫&L4ixlPB?$#9!6LOz70KvRp73Q;8uaV2Mf{y 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%0DHcw8Qcf1+tdG}qMVA{FPx_S4#m8OlN-!tqT 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 #m=kHRG6DVJI7je-qALj<;sS0_G^XTC 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

|=*RcSNF+Y*=;mSh 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 Tb1Ujy{@4El7aGQHAm@Yt=fm}D literal 0 HcmV?d00001 diff --git a/doc/ppl-user-c-interface-0.10.2-html.tar.gz b/doc/ppl-user-c-interface-0.10.2-html.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..8243722a0bee65332bf0eeaed6476ddbfb24eca4 GIT binary patch literal 166485 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ξuuRVVx^ocZmfBs z0iC;^4-wuhibIEy3-xVN3;UqX7H4?}d{IQK!N!kdORZ3XAeZPgaZ-@PA-W>-I}gV} z@~;=iTea3EGSTBDvu zu>G}Q+q2T}GJ)SQHaBE$!&08&YzMYX4NGI=@0{i$F%~gNtz@yni4lfLx3pEA39ulQ zZvtQ&+S&|Ce2y@8&#ozv5XMuCB~pw@6Vnt)C4@2vVWpP|jvK9$U8648{L8|IW>xi` zSG0TWs0xd6lCd3Fkeiq|f61z0iLa(E6J{{AHt`oWx|lC*yJmqXNMtRhYbk7PXjvVU z_H04!VEwWLJDWMwHa-=57xVUXmSP*`y{ zWDodz5}Z$WXH$jFf(lxM*&RsXCO%P#(wH$0gEyhh`0QUT{PjOnxMvv1#o!tw{Hox( z-Q?|{4i{I??wMke5{n_L zD{m>TcOcc$V(WyH#84Xxjr>8c!crh1V=AmzwY{FkbdZDBj_Ix1^00oNp}HMBs}ejx z+A&JCq%Mu6rUnb9CFg|3lB~|C&posXaj>mn5ZLx#vb&o)#|rB68NBbnffh-%7Brzg zn=s}y9QmG`fIH9RajAl&AVr7W;{f%L_XCFUY-&~zue7L#wH=5mEo?lD_z8|aUfrJm>*v$UHE^Xd=RyicV(d}^3k(e` zVQQsQ)~7aj4gqx5G_oJ z0X!wnaRF#DL>uLh(qPEAG%PJq_4E0M^Q+SvfO}~oE{bdcTq!uI+8;f{aWN;;^;+Q3zV-SxbbS5jGKEkkD12ZrLtYVyL zff05ImWsxlaK^!Nw-)P}%$!|*y#9PO!qnOZz0K0p^Na9V&bUc#5!0ZI|A@zR;Ka^uC_Ab06WVKyD%^p72|~{J zqZu$9F^WZ+T8dRniCE@>mIwXY6;a!A0EChSL@*XtUXgRB#b%z z+}s_LAdOXxiof+>#hv>V@v-Sxck*z2RQxUm33M`h0Q)|1t0;Vy<;~T(Mz^DT-L@^a zx$D+2)36>xRuCF%K~gDYj1r|47S1e_x6C4amQnClBFqH4wdO_SO$sIu>9%b@;v$>@AsU3coS_Iq+!v_?sbXM z@viJ1X1zObmwj>V`XcHY#JaMk;9>{_nEnm zGQS1eAN1Pr+LufZ5#QY~-jU!;BgYZ=bj&&=bxa+%G{Hz|f!T6+_Xlsa)^E$fd|Tft zUt>Q=an!MZHs`fhdBoj~;Xf>@1*EXF-+?6|iB5@f*2Pk&6dUfW5GgV`R&q%7Nja51 zb9ZIq;o9}fy^hLa*Tg)+6Bi9~z;)W`Ma6)DK@ip4jriG{hPt65@%vZ88f0XW_){g& zpTf?&j>Iho^}7Y29;CP&)PLx14(wrJEg*-jg567N#Y@C7L+;UU2EAgRuV!b~aHzn( zCbXBc>blohoPxuumBevOCH2>5A_~BeCZP^v-KfQLds|L>)udm9LX=GAJ@Y0SwEgNC ztV7neAh}!Xy8Zi+$6esVfl%#jn)UMjZ7XZL+m>tJ&3S9&^Ob4)b3bck{l}pey(RPN z_TB4xYt~64Pq^6H?YrN`&P*2(*OGg-|5h8%4eiuneB+-Ue{ue(QGHU~oN95}2WY`OLslh zhs?++Nfp(pLJ1~mOj&}sNnV7Y(+|HiTbdy<+d@yc|MR-GF60c_*%#N#w}=VHs7f`* z!rv25a7iN-o+q`;ys#w9Z;51eijbQ|fmEgr#g*u$!Dopbm?Kg-kVOKv3Y z4CL$20rUUv6hUa4Dh-QadIw|e1DG)4h-l?66hR#9xsdinD7(J7x;VRmr=WuKtLyW# zo9kh{*Z|$Fp)Dwoh5Nc4)D`Qq+?i^BVnOh|DJDf|IV%tOvbJdrY$0)Yy0H{wh7qEP zONmS{iiy@FiHQ;#{%4t$FSU6WAI>g6zdL`|WFCj;Z3~5AK?M7_CG_QE&{+b38?$&6 z!;jF4q(%!E)tsk}GDgyrTlB(t_4@SY^VR9i`OwaVsBO*81;r5P;kS#gfzKe>8orR$ zh7d=rp_n)cP71@)S_w;Offm0XypjIT=cCg9{Fm#`?}zXT65AHM!cus;gBwDZwzft} z6PyUE#zD&#v!J=x?K?Mt!D%2J_5J1){Bhs&GAe;^Yh7Pwt-R9rJvn(-JOJ^R(URSA zhZsKCyD8J;@@Av0j{mZ?SPN&eNMG>hYL5>|rp-{5 z1c%W^^ZTNMiH|{RXWc>BD7^IGbUUwCK&I2{xf~YFg@ig2NnQ<4{?&S)F!u}YUyIj^ zq4{v=nL4(uS}Pz^w_mKNwCSH5TlgwjC;!0OlbcSIXRzwZ(voqIq$@Wf zfj9W}1N;S@yX)zP2T$!G11bFK@;A{}SNA#s(B9Yl9`rj0? z=uI9xg2C45`3x4{f7kYE^@pyu)2(gfMEk{&i6`QKbNHUN2c357G1A7kJol}7b$hdT zWId8?s{$|pvchBZu44v3tgnYqoxf)qJi3@~_li8m+k4>A^$zcwBc>-0Ihx(m5Z#61 zw2r|c>-5;+DZvlXR!)mH z76>*X4{t#CM*h`EYiLi8K>kx&upJ<=*Vwy4kuYo~PM-3o&R{EZdD@;juk!B?k7^$V zexUlZuSgf?9DWXIQpa@jjoI-KUY}s+VDu#e9}xd0Y7bhi19$*d%g0Y3}?>%pYr5thxD@m7w0nUeV&%iGO zi1%GJQ&nm$eibvs{Z#sIE8F2@uU5?rPEb2jGrgv;nNT z)&Ft-k1jfn&>#1syl2XfZ~0-jeYfw!2&R{EE7VFjIsF-0sq?WH)=ZF#g)}ov17Epz z{H>QkdcsLrfVmx ze$d=a4H~r}H3f?_JWowaO*cU%7FE%jW}K4=-C#6JIU~+Y%eyU8PVL-EPQiTgXE>_k zY1vJ&rVy!D=%>D{I>j2@)IgnqZ`D10c?FKAO~#BQ{l-$fnD(Tlm{}2Ej)53%_+~z` z)yFfw)cn4@g2+;`ygL152~h?}2Si!aF3k9*C-}n!8p>hpQt!L(*fj*^4`92kuA)v#DBQw`C=uZvb8H|+glu-u7i!Y=Z8f-II zXucAa?=?CvS}3&LD0@}RJ(n%rYE{vL9)d;cT*GJweC9F!CY+6t(7!SgWh(gZs(3sB z*P9ysO%0JMBxSO|NF5I|62dmazo{PF_o6)eA8=ay0vvGO^I>p#|FH#+yrd5b*}aX5 zXx~4>JGrNKQmrh38sOzx_oLHpFTyfH;w@%xV-XRAR3Rzw;-a(YQn&90`p!icO$1-^ zSPFZu$&tSA_q%V8j=p~Vdg$FEaN-U-y}Kh1&EKj^3-*d*isBTae#M_cl&2Kcll?kE z`608`SJxR1@51kj@L_x?4lxL*>0vP0d@D!u(5`EW(8EEc%q0e9G&+$LK`*`NpYtdhC-d{$aKL6$N;w;)fI6C?p zJv%yjck{0NfE^+n-Sjj#Kz{Pkt)rv!4}PE*1Mt`{gielO`UWEb=HbBoeUN?masR9g zoI5CY{Hidz(qa`O_s`x<&t3n=&o@6E$YM_@>w^iNXN}%Q?+dI&ms#EidtJP|cMRtJ z*UC86=Emf?Ux2lK+%K$Te(zj=zlgW2$om(@zY5krU-)}RWsfT}GPGc$ zv0;;ot+xJ>-RZL2OlGS&&(A?4?|6P{PiD|+oU>MT(wO20owX~Id+ZBOoV6T8S@ zlgGyiymsR&^On*0RaSW4yG41CepDIoG8{N~pV6#2VC1r*X=cg_;$`ZS_lLY!mbLGl zk4?5Uai4B+TsdHcr#Q0W@Olr602+?wKJAj_;ytY2O0;j zWU?1&uQRz>Uxc2|>TqQ9ep&CYyt!!VbMTA4A1=ezBky7RWsvlLRQWgmRYgsYd%kOs zwn|t`jAMz`DK?lhrnyTf>T;s?Y{I(tR*$dG2$poD5ehkxJj2X zCXg2KOy+fNvh3Cl9=ah3{`MvstxLN5^27?HW*8TOV<8zOPAa2f659k(rIRP*+3ILJ zf2{xRB&n3vra0pU+i4BuTqKF5HsR7qOW923O~<8aW-^$!f`fZrsnqiM*{~&exxM@H zmWkpv=7=Gdh(tJtoDoiA?NW(|L^GN9IivXkhV*wTQ!Slh1R0{NG$M9F#D=AoBPA)U zOw~;0KmN-<=A}Q#Sj94?GQ~as%QEdaPmIMvS;2(HGnt=p9met&;D_IVZS|4HJfR6u zoW~ekC*lZEB$h1Y(jYmT`8o~q_l-=N8XRNz9~ecVV`m*zu~RTf#W4aoP8GPG;d4$E z?4IX7?Y=mX(f`lhv&P18oM$<CdC_!$^>N?8{q6g$XXg*^rsK)0{DdzbA}8xA&5Uj zaTgOqy-@kEO^xx)NJqs*r|PZ3yF?1jU*+cIW}Usvgij{eQ=2<_m@SN(?Krv^nQr zPyZjGlzA=wKc5kQ=>Hq~|Azj*q5p5_|Lf`hvsAf8l&`Y$uZ;mT@cfo(TvNAS=Xu=| z2+$QoAb9AyAx2obz6k=Ogd1{7YEo0~^J|=cDxNkRsLM@F583MKYd+bhpRZ5QUL%RL z3t(*x2_mHSJdXohJtPB)K_2x8LR3oBK3TYqU-=~IA2nxft)cT1tuO+(iZU#JmMgHgR4S=AX_c0o0vp&NRNaUgpPb1&ptQ&$NtF_m5~U?zP- zb73v1rkBWMV4(`Umjkn9lrUc@WdxuzRf>56Gh_UqGgMpLaY=!fRKZGPsuz%3TykoF zai4}p8|(?63GEBt4?;?X^aI~|i^I-S${3>enHEU4c1p zZ4@3gN>iW;gh?7u3BRH6t)*Xe0CTqxrxvcX^{AZd3V>P|ID0N51Mv^zlu+8@)dR<7qE#)S#6>jBOO41PmxI_y1J)V$Iikq4K{h)^&@JfoO! znFhwfKxYX#1CbvDeah14wGOYiGQ2BWT$(t+~e%1Xv39`!Uu(hUiti~xi8 zLcnY(Jn1T&wI4{Qee%SS*{S2U#@yn`6SM1u4GMGc3a4j|&deQaexdR&-Ne>fW3r4;1Jb z?7F9Ep+D|Blbc%X|1hEoJ0H}^E`TBSYiaiXQc?b9}zCz0*I&>TU~C;a=2FSx#7 z%9IR!5Bb=J$7#ZKptV6fz=7*~T(?i#c3!uhoJw3Q)GG`12Cc0KYs*RuuCS@NWlPfc zs0cl(DE2{6Cqxnuixlf1miJV-`;j=U;ytjil}ZRuwu#{`7op)=Vc$q9w8x}GssrXn zNg?Zbm-ZCdwZ0pl2P%}Vv|g^jM=t14D3C0`-17sXeC+zH zecD$hadnELJy0$VF2j-}1aiuy0D|Bd>bVqIoqz<23F3DWr`i&Ub`K%N!qWjl1N zd~Az<1j?5I3n*|Q4r)E=5af}>#g*O5YZP`t3_{ePfO-glSZ+Megp>wInNW6+%{R`Z z-u22(U@#X%fj%iY!;~ols-)r}_Fe80?6=$H7ZxWLPc0Nq%rDLypZTS!$w9Wl2LKer zeCqpJXawSojTImWly4ORp$of0=hWPh6Q|}T2OK)uDAzEh10%2y+Si0|1Nw>Q2B4k< z8$f4zYGPpq4h=GR3=Lh|6AeTVYTt05OB#C0BbqC0*n0Y5@1Xeu<*w$}-obpEN!m?0 z?chf8BI#4CLO)~#crEwC02YKGPIZU~5gnIevk46iYqQ(fv9R?b45Lbg%ndM;fh~am zdW+#&bICS3u)AGL8vs**D*HCD2qNh^LJkQUQ`7XT;5eS#th6u{d*Lu5kRs z&VM>Sj-#ae2OKlgfr&8w^3ZATASc<))Gqw)tGa% z7|C2p_U zj2z9oy&{)-_4ny<*QGw-|LnEI|4JNJH@dFZ`Q1_ff8KgHtmPBlt?Ekp?x_7xTsx~( z1?1UWZ74+5*1|BuW(&J?{d?4ZAwU6|`9C4d$3y-`3hWr(yrrKK7mQI}M`zg$+O zCc7~0E?3H18Yd6iE7C4=+{rpX_BMoUf|=E=BTh;!K04BEPIek?Pid#q_@GYaj8Dc! zHUs$F{xaq`>sE|=3JPd!RD|_A9#{0(Sf)VOR$=?{zTR7W(oSMqQ*pPE@!7m$kS*j> zFW+PLU&r=*4ej`v+x0c{eje}8N!My~u(NGjKcJ9Vd)J((IJGvfN!r=9$IbW7#Z}O| z&hoVDTcT6l46rnx`}zWo-RGnO*}oq1X~3kk`S-`t2CyUJnXh6w{k~Da4`7nKm&*$CUI*e2|EY4K*(yTVXJ4&%_CRZ~$rG~PRmQHzH+S>{#Xy6+q1l9t%TDnLg zEke&Vo?xbDC-=T_Hfw@w?c;sjn)k`=Io(>D+%3$_IZ%$OdCOb4vAKI-3)oLKgIL7X zYP>WuzAe#l@5R~@Y*UNmy;pbcBU@o2>BQ1iX~2UvL{K`BDH@D-Su%S;wqWB& zmZPGwU8Dg>&gqN=)W-Yy6a`mp;W2x~S@={;EizHn0qRh*OlJmem{e}r9&@^pgl$Ds z#5`XRW&$KVq5Xgfq$E{Z`ECgM5#A|?nz_0k@2f&!iJt+kV<4 zr4t+9_?HxPysR{)gRRiaM)-6r&zsFc&9o)d1Q zMVs0kRi~VXo%Bn3%E=CwJ9@9~78j#Ct?7cz0rn}Qgiz1(DF{IXWFSI3&amPxVY&}& z&d}Gc*-oW(>Au)5>N1g5FHJ1P$Z14UClYmSxHbW2Bu!F?tY15KMy2aj%A2*@1BrfQ z+3NK6bCYUa`}%83fs_iQ&vob$&NMLy{=2pd9wve#kCPoifpkgb^rz=^hxDf*JgDc| zZfPlo)Mw{YpE6HU!;Ay#wNojN@C{*91e_}x08g~hmWT_%IB-pUwKTK5YVuaBC_QJ~ zH}PqsDLb8_^jx#8g1B#@al)KMv5_%XVr-q%mE7$B z16pgVtmq{eX4IL~`P)>bntB8Vj;d?UqE0N$*=ED*4&DELXpEE+d5RF1U`<>ex;XT? z;fe)nD{Mp60j_r-67*#>5E9rsh!~#q1PeSG*qVAoDPfchH1(UO)56pbsBJ^I^*yYU zI-1q6%-RCdjtM#YTsH|=d;<(yE~e*eEVA89pz4frJy>lMTO(y>*MhS$L_Jry*v8lk z9Jqqm>ItF5u8%!IGRb(u3sb3S4dAOPlO&15MmU$SRg}?0Ii6GKEXQzL6vSs(4LbXUG zU{?U&U4x)?0kSUyEm!nP6fY;&8cBT|5MP8Yg*Ty4L4bq_4Z(=|+*4Zb49l36!V92S z)UdSYtgl>0JwLeq!rp6sB}=s9#QXCD>JmJutIL&=_4k!y8&bQXoxG%-6J@rr+R#ah zf?YSXoo{p>wt5snH&0jfLBP3eB$R*gTArg~QuU()smhc1Z2F$v%o(X!k2_0A%2^Dg z(jL%hXp^i&^1G}ut_!({07$v=&LO>& zN?`CZ+Vc3djO<=3k$&Ady*4u534GfQy(_aX^$i@A!ls_0-Rb^bfa(aB`?>d|k5p->Gn8%7%#BD;7_Zs^4M-jb(_9RjJaM#8zttx9XIT)#A_Uh>5rW~*&dvXX9llg> zJ-Z37R{aNx8}mO&TK@rFhWVe@;OF!6bH{Gocb6ptx6XWQ@+7=I2!HRp>0R*utFQlw z{eb3Y7pE>?zWn;@ufP2A%a<-)dj9$6FJ8R()KgDgxNxCdE}uSqdVYTX@ZrO-mcZk0 zzx{T&>8?HA@59TU>dCo<8xDW>pACHYhndNV#r;pq(-&_$jW2!VTi>~G>dznh+Rd{+ zyyuo9FJ3tO31{EzuYLLKe`x9Dn8L+>7rz{Nc~NIl1>g=l1M<`@WyOAc|l3iEq5}=6hfL@y#DR{K}2vA9y0T zY5)13`QQcd*SGCO(YG(Z=XCVhg7YZ*^qzaa`Q~rlIQz`Z56DBWz4WP{{FP@u|Dy+I zpLycT@Bh%!)0dooe9srZEB@=I$G=s0;kh4t{mEPY&hh6j{Rcw-cDKIi@n5|8#F3kR z>UZJvo*TaKB{cTgzj*3<7LYSjbCb^wXs|NG(ZPK*D03X6~24OyR) zAV}*Q&O`>oo^kM)H-`W46UT0YD}LRQf%C6@=E;fM9!0lL72f@$yYFB4r*H0m^~wFO z?tSI%i(mVf%kMtu{M_w-5dZN1Es3;Q0vsRi({2$hTXsiElZ0?jZUD3MPZtBcNQkRlpQHLui>d?KK!aG{zVH=A&^e%_c z&GO!b2#$KGxMT2IOq*x5(p@>*)D zaPB>NpFM|0;h$^&VJDkQjrls$@p4J=T28tg+egzHZl!au#hr!fs52dz>RD&H7{`@S z=SZAX?UlzT90x=&7v1jyX&!Z)QwtMg`=(ZOWi2jgYt1U_%2HId`??xuIc?UlqN1c) ziNtbMJ8-RlahL4LNGJQ!@NT%Vn8T%J02+1RatDY&>5R4NL{eq%lT#DN(_+gaJ8TU~<>g8_PP9`Srw0EhjZ3%jst$*j(lRfOIu>U|9G@F? z;))Yj&o-0-;KlSwfFYXYVttm*h^bh&bX3ZN)Jxe=_Na=N4%#tbZEZZPu0bgcY=`}l zwqB@R*#xeNZUC4yA+AQS7BD6I8ZW240wS}P!DZCZQ94r@FD>bcjM9i&xVRLT8V`** z3mW#c;+3elHrfmfTO?UmR`j~#i!Z}Sm2@`cWl@Y0I|6rB`C3}8&X(4*v#i!`h+uMY z1pv2tHY#Sd6oj@Dv{u;2IxXyDSx;r!FEYI?eTqo(%;mPkm9>jyU{A*K1#Dh1?wpIV zlzZ`W2oFy16CAw&zT4d``U&gfb zpB;3}nW?7M-eMm5VNYAk&ggg1nYX}^wK>-264f#~?F`qqwzl~Y)@lh4pN^O0=$Jk2 z$8B)+O2c){8@A-6raTM(W&1gUeYSOz_U{A)(vsUNn+`iA*l$U8tjXAV@c-HSmKeFR zETN`H^z<|%XjW)8@RWtrb}5|w{-3HI3zt7t+3m6mJ8P66&WukUWC)x zVle_1AhBSDnB5E-!N3BsK}diQqXB7PhcrS0^@0^6u|Q%qEIH@g&-+E>%dpewbUC`Z z%8rQlIrrT2Kj)qUAk(+=MRl}bCnhiqtCxxZ&8y&o=cO=lUP6|p;@bAqXx=9(kn7Gz ztL1?IkVvK_rrStb*gN!lKEx$*HpAUn)f#OW2}dr43pBwkf`C~8?b}xY5h2Gggl{Ttoq`mA-Kx&mba{4*C~a!EW;HW(0ILwI zg;q?O(rGEU$QA@B$x0ZZ{PW{S~-k!Iaf?zIKM0$_?^%_(ZU;F+miBl zH7yahk;Lo*4dn%;P*A5*6MKz-X4|IhRMFNQXYW%IrvQ$&752<3?pd)%A`;h6uhP_E z7};KiZ05|Xg(Bmkt7GQ)2BX9$Mk)1VIbi7fs29*FP(=;EW{7!3uv2ZlThNVWIzt_$ z?OY;SkSzkq9~iQHp#Uou0QN1--?iih%FYtB8bE0!U-0Rw23-KGOQ5Pe;8cNnT+Tb2 zje4%87m)(2hfl6LpT7rJJV#A1wW8-nMKW3^KD8vOZxY#9hD1y##1osMpe^trCgDb) zk~)IldvDlxZX6!3>WL`_vapc^a^`FSR+6=4a0LJZC_7j&4oP6n0Ns=@L~$%%fPgTP zq`7JTCb3lqYYOOGnNLdC77mDmWwii0nBr1r`so(!21SNydN@*MSK&-Sq=PlqST7T2 z4rWDFSMUeNk08?NC2;+`nt~v}52{=W-ltT8rt6b^YYXn-S*Aq^V#zGL-lLKyE*H2h zL&O*vPrjpW;Y->X!JZ)FD=TMttZmHU8z#o8&|;Bx6y$76SGG6MW>k%=YYW%|tc5Z( zkBXHxtti!FSYDC!P?WRMa7DACC1z*`W;9Z2-d+^0$u2@k(?)&(m1qifekK>yn$;4F zoi$l7LH^H{DEW}MhIc9em(&qiwd0z}*4EucCU6dcsC#<`W(v^z9IR|~Hi=)cD4vju z*I_4qy;l!NbhMs?^z#wpU$wux%>BAEcqQQwnFft`FhU~~#iCY9h4q2yU+wG5t>C1v z3otwtx|tsGWiGw_mw-%BKRk}pVXd%h=pK0C8(7HK6bxQ7ko4l5^XN|NF<(>>33SfCbejQ ziXXaLc)}K6t>z?ISzenH)aKh`l3>7hYynR>Qu1JVe2OYW87Ls;7Z_**(XEbPFFU#( zEy)EPzO0R8X~BawmD)1{)bJYAVjc4y-?RkDP@>CyQmtl7!_*cJW@GSCT^@ihu|5VK zxA%C?0Ny>tEB9Y8bmFv+(BPal0pHw)NQEW<(O@|UvY7$rcb?uoIA}a@jX>bia#mD& z>(m1$&O>%6f86`->BpZwM4bK@{#ezjL`iW?hYs%@-c!VfH~_&dZh^$bXW$)miHo4H z>%{pCB*IfFuf@lHcJD#g!8~4pecRcqeW#6uWqS)+Thy%kvqv9KoFCtPK;ZoFvyb;3 zh0?)=z-)7*Y*aJmH)Yr;CjtqC9)iq8Wixo@_pEat$~F9ggGpVXDbU6jxm@H~lWaS@ zXDm#8gDQTmrnPP4sO3@{wT7pqm4!_m(I$+-^TkR#OiFHa!6e9l9&n?zA6V1!TAJ$+ zZ3hQKp?gXiPZX(loKICIMrH3Xgrm< zityk{L4F`3b-Y>ST4;w7jBB-+5sD+;V2ORqcYP2+0(!AdkF(n<;1~Yu2q@ zM-Xi|n@homS`E+%)J;dT2^gk@l<|qc#-1o|2{H@*7B~3=myi?c}a8 zMa)U5g*?%ri4EHWesr}k=NgE98`HL7ua0qQ1kx9z&Op=N0|f@s`vlb!os~4_CY5cc zsF?x?*1TIEcWEz#tm1mZTgWtRVxG#p)^G`>Elv40@m%vd74at7$ZGAw(77>sHsaw_ zy%0cBC83I5P$w8|+-hmN7CJ-{aV@;|c~vT@j7Gq$(lKdMS&ExwS*vZ+>PVKq@BG^R zCm-E8JowbP`}ngj4<3DNgI5>@QNF@3{@=BqyD_Va1+phP04c?A%O<_BmfGjK5&b42 zqX|IAyDqZpw6ka~YmI=gPp8^eXxWQM{Y(hNXr-59Lsh46L0w@cKs|j;VnW4`j6Y7{ zFUgN*}f^%~?xIYU_r$6w@D_K-9kT3Alw+ zCw!*i(D5v^xdA}!3SeDk-v}_Mr(8Qeb)*CnPUf?Uz}hHNyaIF!s*uax|^OOErl* z2alY;`uUwlhX;pWT5{Km*6|~&*7X8!SoGjJkkpxp`kb5)w-ZA)cRi0z3+gV3v>8hUAOOi1gvBrYN%xmJWZ5=_^|Fq_B2*&X?OUr z3z2%bc8L|ZD_kFGe{xT8x#WXeLqk~xzo9zWv}_pw3f*3?JR6=y!JwpqwaoNt_2N*f z2%&Y{UCp@kV#RHBJ7dz^N8ycWg-%7SPV&v$`dY!*w`|DE0Di8OqORNAGBLLM5(J74 z3$;_XDovo>P|EDlDLBIqN)i#(2{L+=?P3KyqMFg@s|xhcbOkuWL(;G&3}#u{!adY! zDDsSPKgtERnx7FSFtX#^V5rw-q%{jNELdI5z~Vof{#RN zSp1Z6#EmL!SjXPoxV`p>G~4tsypd-c-qRMPHeA-kX?l(+%Dl?ZgoKM*Ae@oqMsiN2 z3)f#oxychis9fBd$tC3irj@oJ=tM>1Ynk|tzV4RtTyKWyzK-8*+SH>6_tcH%uD1#TSSQ)HQCfwvp zm3FfGu!84L@kb0V62UuX=ryrosrB2Gy5xafH&D5=&TikZIR#49FGvr=E%2-(%4t)C zj!x`a#luwSO-HVpRG8)n9r=V;sMsnRu4t|pmY+1H5cx%X*(xd+vdO8W(?mr@7FL6N z6lcKK%7Exw4utxnQc1WIB&K6>9N}ASAJY4k&<1?Y1tIvkE~M$fV0C@C?|l0B-ob-| zyLY-7+4GEA=JbVFcto$tpwQ>$8rDFFJJCRW_uw_KDd0zw;XALeD65w3rq_5t?V!96B|we%7|UZTO)H4Gci-Ws)8QPS!pJ=` zb`{*Zu%Qcv$rV=M7nL&;uy1T4Se&^Md8%$Do$=%z;Z!5`BZXKs@}-YiGDI|=Pe^J} zp%1JS9#|92gBgIb6D4WCB1qrZO3HTg${ThcMZuA(@=)w4n`@W zM)3;V-hQ5X6SqwUc5nZU_tYD0Oh?=BL&tfInCv|0zIxCdfsq9CoGGG<>*zm<_LsCy zuT;QTTw2dm)@AJg(tq&-_2L6%H^JtdkY}}|q>fdQ>jD9N=LpE%2taMtwCXKv1Deb7GXV4c(|$dV;Rx*D^s6D{i8f6!Z+s+m+W&IbQ%9)SUNEe0-JS{AO%odaVtKh+*SJY*F@vXpm@{eag)U?}XBB-UPq1=Qak{i% z51>6C(#C~rL1=NL1u^B*nc_^sk)UoYxq08ZMZvnwcQ4&cN%sIsK?+bM?MA z3K`u0C5;;D`&AUWr|(of8|xG!T8)Jg5=o#o25~oFs=v zHKAtor&@^ws_N=u(LS)dj!)G(?okVe4ZGOM_t?VCx>pU>&RlFTz4|YIq+ecXe^8sG z0EB!&_ViH$J*7rAz~rbRI?R28WS~qzI|#R~f~XJ5%HT7k!szB5uHY}(sEp3B~hSqFceyQv!73*k9xKyGV z0a50x@}De(tftl=roO9EE>?-EMu-lj8k20QhdZuegbh@&#*k3bR6m$pyS(pWH7TtD zfwx2csL{qqy5&EY%VE_e#w%p&dR!ghalXwl-uPW^^SSUbvd8 zh^jgVAymo0ATn=i&jvS|YBP0PFHAo%)X|#JUZZR}^_e7c$%XZVYo(raUC?hM`ojZmn|# zA_qO(x@8O^a;Ugwq0dlBRg#9;?z1-Y5=X$!uF*^?q8DNI?$eJB9%26O-s8KUe|rDX z;kvlq37Ez`drKX>BAI0B7SApDoD94|VqK*_jm!#lrEYTus)mq+9J5ZW{6++6a zt)$Vv-cD&u0LSM5SEl4yU32k9G812+$vMq0q&L^42 zu6bBf>W)lKVH;#tdqC8jbOzK@^1YLtBh!{DY7D8YW+le)bCNIGzikO!Jekq0HJS{< zMRwQqkv_v=o!FmwA2=0gMbF5?kW;LNFfb@I2afK4l8;-{d?+b1Ksy4%p~xDC+@ zZ&(YzMF2YcFyMk#yx4GY%j~VsamtNuU&k7z=#u>Ojqd%2jSo8V?lomtqT&af4&9CKi|yv(Vd;c+$_hq^=EhFWrQvI4tHs8m>dNU8qtZq(0eNS*gxukyKHD zVc)-QhQpw!yD`Icwocxx!cmK2d@SjJA z&KHlL{HP(+JCrmor)=%HFKQ)Rw+;Z;Z53WiY?8T@+AS9n9W`aJnC&w)uM?d>M-{6o z6r?e|E2@WYmjRH^tZUes0(7wK_t?=9qGX9j#EV`?y6Ht}&9e5=ba^|K#>4(l*@qI8 zcsfe;B&=Iv(%cBX7j|tySL3Y0>9NKKX)&8B>s4p<_nj~F!JFPevWAH;v~L#DJ2`Go z_h8lBSvQDpi-*afF%Qti1t!GNI)%OI*mgHZtF88yC(uf*v@)trKnGUlR2_9G zDtS9{MCox=NwoHGVCyc_Z{UX6b0n0!QpHuOCLBQQR;3L=Jw3*pu?5cZbP5jtlRJ-| zJ|v!QPBphq#2}+I;jQLme>*)i!O;rF(PFWc*T%}Gw++Ceh`upb7p>P$*56N6K z>t27}+jX(LB6-4%J>*CDK{-=W=#~6pt(w76R=Lt3U}Xm@cH5APwqQU z?*H1sQ{zM&esb{Cd3bR5{-dYemOGm|4K=ma!0R(fO&Ok-bu0K`Wcf(%BqeyU@(raT z{HZe-7?!t>GA*iWFr239gi}2)7v-`wnun@iH0OWD)&~Ub$MUdy2|sF&#rc zS^-kE-CZ}yrD2d$A09Hv38n~vuMkD*o_>*Bi`e#bS`g1IEzDJW?GqEFPEZ(XG}#F{ z@@h{(S>3F&AEq8oSHs$R(87fKIv}XaZG64StKJ~f6eGD}!HVTg6N24DqURi6 zSHNKLY!}5tEo!trKd!1;g#*kjssip6z*D`_{o9|QKW5^mJ!h4KkacPF;1J}^HP_Rb zZ|i^Box?8rONqIAYdEx%@ICKbv;zXRP}^>IV;rdnW7n?uDOsGhWT!bwsB8MDwVCSq z)@pFZZ#vGG_wPJ`|33cwiSy{rr}y{uRi8B$8nOx6CQUoCNw-jzGQ{?*TG<2`^t0C1 z_>9S?iPP%VrXRG9aax2hvhN@2r;vR*tJZdzfUgH@0bJCHi2Ws zOFxKWtOKb{68)UL^HH(aY15`_wTZ&kEn#?OWZn6YNhgG~hd9~a-&YITgC)$QiNcn3 zpN4FBc8#^II(a-iczOt`?f$_N=kVb0;r*vg^(;MM2xD`fF%a}S1_xW3E4M(4J#yYb z0oM7G^I%TQ*^GcWmI8_hC=sktDj}rvJ*SmJWePJL8o{PpD;-s+OEBje8FNr{#Yj7c ziZvI{(HD}f-YZnm;cgV`J6{{OC>|M2i{d;c9i{AJ{SVEgl*1hU}izyFKBwf#7V_tiKE z{*&L{|DWIbX!*^5`sDCie=>7^^Z)*S{_}@F{Nc}k{_{WFbEALsKmO~leB)oA{o?oj z`Jep5U)V{4tL1+@h5GU`U{wEyef{r6;couZ8|D9RBLDxvAN`=zvF!CAN=Rv`&XZR_rHAe@3BAijg!Cd&42SB zeqR3Jj=QfB|8G5dc{sEDeEtvoxIh0T2og8k@&9iA%W(e71!gI?Cs?=QFHcNMuHBHB zmmd;yO@_j3o>lY8Lt?hZ+=QAVg-fJKDrmrEDwa}(_`%c}C-SvQ<}Yo%pW)t*XC{p#K(Xb^zG%IG*u>v?)Y zbG^TJ5j4ZQRX*5hLc{MpQ(0-)Eu87RzrT-{P=Zg*t7b2|(vEt*r6wU5ihHQ*x3N0N z{6b`=I_WlXWrxe@bgrt^?Ps7$u0Nw7U$jPr(*$t+71q2W0srcr4>X>`cgMbw9nJ%T zY)WX3+ZU_4!hc8LX)z2jdj9`D`0TQyTZaF|kwor~>p zE+CV8(*CXoUaxtR9dv%MlqU~yunoX_x?pn?!l$&up7UIPB=Np!c2pvRBIQx;%h(Hf zB)l|91MbTr$=%GCo}Me!;ZKE`tr_%#5AcSWJiX{ms0)h=fCyW51Pi;d6+F)S^KyBU zgvNK^me$bwA(EeT5t>)aWp&cV=_?40p{4uY_?~QuNJ`+`cunB$ZKnkY7Q%gtwg<$G z4G4&|Z*SNbyg+Ts?T=RFR8V(bdFuScyy<%?!@4M!bUg1EKB>xHJaoUbRXS?KJ%FQ! z-0wS^82nP%E=y%nxRJ}EB$JttGEY2~L`jtTL7MsLn`FCZSTxmV!cl-+QS~}tmf2~#vF7;U>`CQJH>OelV6H$E- zHnZkMVvF~r85aXDq)F}SJm18*C-q;+Z@EuR#+GN!p`_D5mmFujX2k9RJ-JcFxbX5K zb_Fj&E|}|vA?I0`N88DNVR0<46~%Amfag5&r57gPRpdz;Mrj^$FAyRx1W#oYcLC|C z;`ha+aaTjIvbH>BSPH#sHTaGIX*t&i}XQwD5pJzyHLX88At%+et8Qn$!s5v0t|L=qNJmieg{6}c!}H-2MGCuEoDMgjeL zG2QsSyc9CO&P->mx~-Vbc5}R9#>+u=<~ai&BNC)_;s2}P0&b)=!Ns^n|+)v86Y?$<+@&qaSU5%c11?K2-?O`C6n|B{`ZJCXx`xK1e>AKtoz5{RXmqm5Y-|MCi8|3x{9i}&7Fj?$S^O%g2`3I|p8cFy{yIgp4KlW71o=5=7(Jr^kII&-QMw zL)@j~?bSjyTO&shZj2IHi`+3pt;NgDjmYZ$MQM^>Unsft*R^Wd3_zneh6T&OC!*qe zy5jZ9Vos{QR!nWleYK>s3nz2Nm$!c);NSci9b)CS8X?dFK~KAdWdL!}hT@nE zO4|s>4D$Sd+V=I*53QVo8fQv(nRZ(}(5UN)!RdE8Cj(T6sm1NXR%54Tgb`&$tQAF5 zjE?Ln72C(Q>HSo|_J3gKGTwb=Z^gbQdg98i|H`%Ozp~}|KUD_L;LB&vo}SfUCk@XL zYMc~h7LPoxuh%A&rl(H}gvMk~>qrM%e%2*@s6lF zafo%7fSGZ#aiw18CS1s2Gk)6Z+5+kOT%?kPF&DCMrJK2aB4e-z3Z4e(rX{eNm*q16 zIzYw0u{xPsd~ZhSi;45#;NgAeefUMPlXnQcJoVftjKka)xs+jAq;VMM+~FZA6TY zfLa;kf$&1XWl`i&o_d8BhDpvh+74<0S?h-psk^}-hM(RgL(R*=G-YWK$~feCk|lW> zx<1&&VIG2?vS|sAf3zdpE+$2mXR^q`Aj%UK0G*1=hYy?=9_OyfQ4W`YjZ5S+QJ%9@4riSuq*sDm!ZdalExwjGeQPD_d^K|M-+uY=P=4k(^gqofqzEh+BRSmVC$QTFjB1}D= z6&AbaA$NyPTbt=+X(}ZbQO;Q=LMBp?3(rq^nnrn+H+@L9i$K0Vf2SlW__v|(m{KBE|@Nm=?0gw?Ozs z$$3l)zgw}0EKU+Xku1sF!V{5~NH6j;37e41B$Mai|7UVhp*7o!^1MA_#1xY4>P)t) zGugiW<7h$kVa;YL_B*GsOXe%AG`XGUH!+d{^LURA4V!~$Pc{s za*zvYg|5yY1^KGWMJ~RE_c9K4mKS)rpGHh1jDda2J?ZlzO0vlF`}HH|uhm$;=U&w| z%0^JPrr2ccj_qqtUe}IaohiM=ekX-j@W4;=A}w6uOP={Gj#P{F1W;A7m^!W zZ4oawZ7Lb%yX`w?`!FEor!sdlDHAV^aOP0P@-WEb2>jCvF0p&gb-Ueru_Z&E?e_DW z{bbzBq7ZYEex6AIo`c6j-w#;~A2W8rC3aeTTvWDhpJ{)mwgwAJMCN8in&)B81(O0Z z$RdrnS44%^PYYd4=WQb-ce`_r-NK4g7Tik%7O{|vFiavZ#2{Uf`8;Kv7}2GfBcPpj z+j8Ev1gYdQ^piwHX&PmrE5b;`JPqTBGcVg>TQ1+0q|Mt>dA*g}y$d1kMuqR@|BcQ6 z8+OfjwfUb>5Ji6P{GT6riMxyc?&80j=Kr<3r|d@j?Lx!5(D3FFf8)Gz{uICV{pSwq zqoxZL(jE1BxJ#EjdUO~0{<(bN%=M$#!twh~xi-eT!cHO1@i064VC-W$j1g|T$;R-BthMf4jR5#F|FqZIgD`Y!XarpV)g zGaIu3rS+A1)k|2Lr?n9so>(pX<5q&0%3k+&T3XZ$L=w$ zTd%Cqs3?j&W_}UnewYNp7e3>e2*Z@ek;pDj479(oy+cP{egPSFM?I4UoO zoa?~)uhc;e@c(+5UUlmo4xF<*{NZ5SoUxTQa_YGf;Zj-gYN;~xQkE52%maZPXX7mA zL6&imx``A*<`<>PXQ$=z_?fC%cu}fy#kZVFm6mFj^mU`!)*y#*D!BAP4p(e?#gXR= zSHv!Ny(CNh9M%?iGRsp@1VMZ*nXfB>e$%uqqDWv1i7?Y1hAeq~-Yn2dBlB@8c+1H=_Y;}Lp_g+YiI~YE zmVqCI!Uq!r2qfG<<_pQs_*A}OO232>^{XRmg)-CR@fy(f_}0JWw4J!v7(eraG>LHD z8qbR~$3qn?aQ!UzM?`oxGkG0Ec*t1lyF4h;B==p9%ODPA8o}2=B61e>M0hW?`o=}L zhUbdOe4Gm2ax%{ZXrmzZz$eT&pd|1Zc#WPH`J5MSoR5p}H%RH@B?My?1J^@@zZu#d z-});Xr`t(|&owejAS&*|5Xoir?U+cDQJ@=^{}tM*}*Sk<5AY=nbTE zV8{FrJo?aQSuQ;p`AHo5pgeOgE{c@DY#g_{nDY`kqY%7>37v7QZh@y=N@tVmo>9hn zm({s6X&`f%q&$>D1|rOO93*ih6OR`%3oH*%?RY#Syg2?p%QX zcL|=06KCpW!VdzOD1@7a zF^jXS`Yzk^5~O|Y@;&3*|F-8c3op;Zkb@>qP-SrzWL_K=nMh^oCE2Jb-(`F* zU6j9>xcE3Fyyc{xW?|}ufhf|{<59|!Ot2sfQnyI4d%AZKQNGLiT!JWnGxR;a{a2Rv z@vtH$=6>c2H%j6>3q=4%RPK985WBJW3VELk2Zu&sc&l!@Otn`;bFEy7%nqF`LV0 zC-dKUMmU-{a>@5^?mKsJ&d~I1(nC;dop`LPnt=dk&sjNDbD9eWnEqI)2b%Ot@*h9K zLXYHfWJNV-i06oRIdkL;AE^fe0{}&Nv|1S5qqhSmMt8T5_Gihy(o_R4rD?!K=_XR8 zr~v>30Ll~CM!laj(;7f}Ua~39f954V^ZT+WN?w9?J9EHa5%N}56!m`V=-QR!A=4x) z{KC)OB8!uPB>~T)4198t=AQ7Q=k0p4mEPq1h|`zXfNO(bLk&3k`nO60jwAD;=-Fw&mr7l3sHNNK zxgo8_smmniiB|;R{1?m>xf}3Acs!S3+%D`Mqt%_ByDVDnsJgF%q8lf&^Az1hLL2v_ ziEI$mH|{#BruC*{u*a^dMF~&1h`c}sUY>vo5G-JR#K0F4DN7RnWi+YofjUr|qwi{~ z&FiBd$5FI)(VGRzHP>7RGen#qc1C{E>}8nw0~-UxKKm!^E4Yk&HWeLO0DsM^8TGY? zzf$CBuzy~cH|6WG|1gO?S4gN*O4nC4jMWRrSC=Hf%?1% zq>QsPi)C!R(3fQ|RutuI&B2SYx4u>UHIBm(tn3)K#MYzg)7p~mj!=C`{+n6pS8+$O-gv|r57}h zHV?d|;jC{YKRk-h^D%U-x%4uQMYP7|UYgy+l&)x1C9%ayuQ+{kY&nk4^D%V2 zmFFdtxW5**+{{L6Se9)l3vTiS458Iwtw%Gl+e z2t`~l7P?s)i?qm@pNi-bgnaAl*YxZe7BN_fKl<`(YSN72>|$7Wcf@~Z^^RKo#Z3Bj zcU}=|c%jDwKMjQRSr`|7!E=y!f(!7}q9`r?KYLfgpp$)3%{9juMD%}gn#ohZ56%6K~oixQ;ZRceGCNDo3WtYoDtHV zZV}b)=*G#K9q(YK-GPY9_onEkylob^gHXIeW>Q-bl?m<6EUN{4i?`rWmYGA((rcN2 zwET*lZ)od`O^K(LF|An)F)->F3zSpCWGcpZ>IFx2mMZJaIAbU8o1G>*?29foz8{Q( zDf-_&PLo5sk`6F+yE%+!@ysD~(bpLSPF_~Prpj?dkqhj+_YvkQgba#q1d8rim1;;> znKt=447+ZCy8cZCcWg($Lz4z z%EvsOIfQO}Y>ST-+#T_;We*m0At21SCR`At7$zbj0sDmv(OR=3l_T?5UAorc*`2tr zI*`lbs#rD!vu3;HD_3tVirT@mj$h?l7kyPepH?e1A00EuDkgnvi0xqYYQ4KVIWBKD ztAO>7-BlAny$=rq_t0~utW$Xbxgr2siC6Qwc$=wbo9eI?VP~)+8213Sb7~S()G7V* zS#rp%cW29ztGz0n-Xmls;sVYzTxzfig_JQEYLxJTp17MgTA^{@dF*_)ERWF>nxm6*ypmcZCl!!f_}-u3K!R%J>~;P0fz;BU}FtMZRc znULYc)d@khHru1}Kzr6Y&0n=ag96ixrT&+J8>O*`aQxNMU?+7TboWZGi6XlhG$*lQ zFpjUlwe+nkuBDawEgLk4jwSmH8bEGvZhI!rt=8QVD3z(0 z|151;(T$boWo3i)ik=t7M?;Ygn#*WX^enSP3lJpcC<<6;>CX~P z_P1m?)R$*Fbj&`$mC-Q|=c;ZJe>5Eta^qZPbaEb^oeBSTf|5Uk;V}6TMj?4U z-i3E}3*)FXvq2dLDYG1YBGsQ9q~h$!?@;?12IKdp7?|;_TqjPV+cXppX1XjJJsBmv zJ}ASX%&=ne_b`6f`_D4OdG#S z6{P1>dl{)U3Xa0zL~6_?vxB_I4t@E&$fI`*9yd~)PKsk14*XbELH}l1f%z{*C__=T zCf({q@F(-sX(Iw|v_%3t#!yN$@e&#AgVCUXBN#rX1~?hNUY={|W6zA4&DYs2WZZKd zxz}^>Jqt+pSvwa}IQlE^x0_uZECjtI_IlyKrU2ZYGU;t4dul8hlblAWt)|*3FL25r z;ZiE=)p?k-sMpj44Ccl>o=HvNs;-!nhwoWHE+GHS62WPZz#-rf#)M1Qnj_^l$Y_l| zP$;Y&CM`zW!=$w;U!75hM1?#PNLgeh*GyTCyjOx4%zPB$teeoXo@Q>)m+wN$qI_M| z(ahrbJTl#r=o}?7&sb}351IDwItyNvm%T-SiDFd>yot;RNj+!UfB_RF^nnM%NBXItWtS^XRVd0Y+25<(<59}PcoZ-<&(g7^+3#d(>w3|Gy=8-U(MlAV z;?`JA2-m{8fSr1koo0E#m>c~1d`Wpck3;C@Q+g4NHg7)4Rn}tLjZ>W9+&F5OW{yQo ztVP5l5CP4s_lm#DCe-jLJNWhajPiIMhtSP;^f7!|o~%0K6D)b8PJ78!AO?dl5F?@q zjuFZwJGt9KTKqCpp#^;y9v)~Jb(tCXAeSyJUOx|E9+X$0&sD}if7d`$ZU;P94a9dm z4NvRw&^44z%iMB4oUNj99zO-gYg!nvdV~v}Gl6YtZRLCnaBgrG%%UAhm`|sns7ue? z1Z~sP)yT?ZH?qE0!L|t3nj8^&zv1S}FH&o6E~&ACy6wMR3G5@#M}0v%x6z!_Z92t&Kc8?$zj} zJc3zFZp!FlmC;XWvA(Sr>xXGw5$?^GX$jxfOISf*!|X!{~9dF{%{Bf_S1hN8Fv9hqP=rR5fXu7h7D;$^!qZg;AH@)f zj&Lg!;(}xBq974dse}+lsn=uoGDJJ~1TUqxFaP)dmbstfZlXW3sJ;NFE2jF^QruX- z#rj1aZaQqH<8YdkPq&2WN8_LzDr!L;+q}!)E_UnB zSJ}2O<1&?zDKml2cZ*6Ft*ldLr%_ zjf7H~x*1W&&HjdU!QXbh6X<7KA98N5lJU>@xT>=6N%;08x$WE-b>@PuJCO|GJmdRc z)r|RT7*-~K`R2>})w_*`npHY36!7%J)t%VC4o3IQ(Q=WL|+> zxrTHoaF2A1DPcFNV0ds+5iU{M8~E=1`PzDZQWj(w&qpsAEpQ=qV3A>ODY4RO?4whd zOBNk&64TSSt|$5Y)QkzDUp|d)=f;~Ac}5+%ssCyb+fsqU@SF-HwFglAIp zs^%FjwZCvkq>N({4P%HS4wOgU=pe1b0-szF8MvDw{>Jd%W)ett+^b3W$|IP?yUqYGSn>F!)^)`U(mNbmINseHg-XfB;9$t<%}-xwPPkaFQTwsDvmV4I#S}f z43wRttoe38c;AeDKYfL7GGubk@Zu2qZt`QYP`(J9YmS>gZ>`@&ym!N!arm$if<9Rb zO@}RfI9V32IvkT%rBLqARSUz|R#6AU8H-doq7{l1DG;52q9#m55GMUv+?y7Yzk#{X z)OE-`#dWYR59SNux$*B6`PWvyGAzC_AO_SB!K7xIVHq6p20JYSJGl_!X!1TB$_&d6 zeubG~c|ebY=#~_=TZ%CORrX>r8CB$YU!Ul~} zGSg2MEd?Y^F&mg+FD_iJ3CFbI0Wq4F5=mBjseOWN!mMUr(NoR{3zYH}*jaH6Q;J;?}qx>g>Nq<_T=%3Y_O|y;M zXzMz4&mI0_H;py27#*1PVU_qAH|>vS(pVhIxyK#8S13(u#-ozNJu?Ev9BB(A# z({}89Kw1dSoq7;-u((_H_^b{PUl`{(Y~3!yG=0J~zxy;V~7_O9%Po2*W{{Hl`}j--hAj z!yWupHD;-=UR-mkUkfbqljK_{@8BOm!&%cd#Z8KoQZX6(>JSgd_Q@<=u$EzD#xwY) z`!E>=*a2NHAzuupvo+6U1>0GV*ezT48pz&3*pd0FOS2A{?{9> zI}oIPodr@|k5yeqUx7HEPhaS~6G&*_J~bW*!x4!RrW6?ns>2R9*CzEov;F*wG4Icp z>+^^CV3-J6`M$qi7slnCeOV2i#Pz;;oW?467D zHYY}`2er?7#`~1W)VTE4g6h`mp=Cwj+6zrsr$|svihvE1!8wAQ;sGO+I_CHTGF}At z*eNs(Zdflx!CxxYm!`w> zOW#_glfYC)Dx`x=B=yk6pqdnOS}RY%e4;0wzwg7Wze2h3GUdk1c$u0If!7&1dmx*Z^9}xd{K?4LhqL8;&+N7|jDTZ1*8ntz5EsaXS>gFWdEq@gR{# zRMQZ+LfC7kmGV}2VgPt{4n~duicwYOV27L8(XW=9d0dY~>c-M@v2=;Q z=@^DbHVA7+yyG@vw4ZJZ7GrO1DpG8{Xq zloA$u4m+o})*4Mt)c46=>_5zh!|m?rnNhE%a8@3_3?jF(SqI7%K5kSkgn{2C)b<1& zBnM$96|0bN66{Te7XHY}(CHDU0um5xa6# zu(c@XQVieyKYQ2y9Jh_6f6rgRQ*GVZDOmt1HLJ*~;Zo>(msUBW~uQ zkTaIGsr>H;fREw4#Cb}Z5nOqAI2@wU1iHVk0d(ud5xkqm>9MJ!ZBK?-pne~-p0OoQ z7ytIlOg-lZWp-u;%E`;(!n5ka8kXj~x@&aR(3aig=T;#tE-81epWa`8f39YPn+g|& z@pxJFwn*~Xm>^R1*iA4};&PDwK34AVplQKom2kHf9sYXKWA>S)JzEL5e99deV5nji zCI}E569|M5iXo+uhTO0xur)*Z2T4}2zO6zWsP%1E?t1F-rq`QZ^BS6?uOqh$yEdOd^S+#O4pSAu7HX)LR{DZEO2rsBOCzSJI28wjRN5i(v02Sr-)u zP)vx%QjthYYWI1Nh=!Od&7$2ywJK9rTf+xqGTK$xt`u)CJnY&WcHK?Fc|zha3^B3g z4ihP39nug9g$2+AL$IZ#=%xL1q-5n!)t8Zxb6C{aSx)j=h1!hdHH(PW6{qSQ3L<|1 zG_d`3Y^UIZr-f@YCF58sg(!-ILO4N8GY%ocKtpV(HJGj{J2xO)i*tj*o5cHuP=On% zxe}v_tJyw@`UN%;a*4?vfjaxSnHhPNv9&7cQ&j(%Z{1Vh`=q`JR!keJ#vuV5ON|pQ zLJ46=v|(^W?8r4)U%jedYLn=A{Zi|@*h0JBDS4-KusGejqetS7C}l)ILKIg~#3G3x z28sR0%v~8NwST5m$5>hf*^d{xrzlLD($`m`cQ@<08}DEq7wfqbdnyPO5MqjPEJ$eJ zB^4ox2{)J$0KHj;)-?cVRXMm#iX$?n?HXTGhu)HUOX{KeJ=#!8VlxO8jkQW}Ofj@& z7$S`l3e8-A+a^Qh!|_0_9ldWA>S&`R?XP1y1$%qz10^2Eu4;o%13k`MhR?Y+tDiR8 zEzh&sx=1ZGls;YcgU`XIp87q=rpqbeqMTCE?-ic$V)g-~c))2H`ndHGS@6l|>eK(^ zYBc>2T0O*vnGP?^!~qTyNHl<0CNTv-g^8v_gdox~;(SLgeT`L*R*8<*pSQn@Ewt;M zxp(HCN_jW#-S{!O@i>V>ErGxk6G~coMRIW?p5lYZK&%0-WtiUtf*h zP5T(9XW8C8@7_J%&G|9JDUdqCT7b}44nzcl7@!cS7(g2CnNC(G$=akiA}7?Y@ilem zJ&^Z6o*H`Jvrpgid}Jw-`O9Ty?Ox$KI#QXD-OEcKaT&gR<1Uy+-b@N)y?AcE`0Bz= zVy6{7RUOQVQP$(Ka=do8*jfa_!+?I%Zdle-p{hM@wKaKHZQ9c zQ>OVSE#wQh8eJ%%^n1rG%yR?ToMI=dS&#j8InJp4qqY z5BAxruhy?D&9!-@s)!`mhKo_SsOy4R)dV_I%5>Ph9dXG9T_wLU)~~AJHYwn4$BFsR zz!=cepg+tH$&lCVUq#B3~(VxS)vmxBB_yZ z8|9-U5z^34C8gRZe!sXX+td{oJ+b}jsW0j1ro>&X!YsvIMVXUZGTNJ$8BE$Mkyf*$ zpXpR;obt)sRWoZxLvuNBe_lAt)A-t|vHsS6pG`j4k8+9zJRWr>#Rug+NLY?>(L|xebw!SPB{pr&FO#h{D6#vW$gZOLd8%^cG+>3hH3aS0+P%M017gfu=)ofHm2j9$Kw=3oBuy}9_! zi|5={0JRsTD^l7pBb67jq8leV%#<{q<+-$~ls((yQXNGF(W~X|L*f{Q5=aaLfFz+I zH^w@GD&f>{$_Ve!eazCQimSItu(Hp%m6Sh7S1~KF_YZgPA9fG|Sl`~}$8Tp>sZ85s z%d-@H_vPPe!e>Qm{OCG0{52gIUY{0Al@7lL6Z~Gg1(7!%wyKHcAyElNkP9=qFjE?< zD2$N|slaBep`Do6sv_YsE88l>3Rd=z?CVl}coVxv6FaSfhVGY?cJTIe3wye(q~_ro z)fsGj%`z7ko`uIh7uRPIvcbYt)F$W;r497tGcnmpOJ=YZNylCIvJ&H)N=xG_r{2*x z8=MA%p$(jm`!4ucMVR_bs=$0qjgCLF-dJr2zX^y$ER!&zB!)o5f@{hR@{lY7VZy_m z!tZW2c6sxs97C%F>%i~n77hS@PYdjQ!`;Jg#25{Mh%_ZU1W>35BSm9#IUle74qQVH-(7|qevwjA`~is1qE0t2I4Scp-wjS4e#I2 zqs^IXix*H^1vJ0}|`)>R?>USp*KvDvVFvFqXh$WgN#&jz~ zZiP~@+@&X37UOS~;aFBuS5k_16MilAn8?SB#eJ-+sXB=SQIU#cW8gwXZB|ADMl=dB zl#1`l(6+6owu*81>#3`1#2Z?_qIxV=)vu`@{+cS+kaL8DA*aNKQUr?=btRTPqB z$54D>yuVe3V_8*QNh#h#_;uAs2gQ$nWtAp~LKI0&DHJgkB#|sa5e1qef&kn-6klj- zTg5p1wbfNM;tj1|U3~;l+^?@5%K9n~DUcw<${-OGDFI}p<2Zy;G8~Z|o-SH#b+t{L zM{qpVudVvERll}+SO-+ul`#@u(mu0}ZF&OFuCty7W0!%#*m2hD4vlxZ><8DE!+dJp zvrea=z6hHwqI3}rB_F_|?WyTkDlVPR8nNG0;i;;2fBf-X=k*WY|M>3h|D9j_(s}*v z)yI#WAAflF%ljX`KY#VER@W_ee>`^==F?X!y!+MrU+RZWmXmEJ3*nMS7+srQmVvXe z7#U4ovfSxzFzlzS*XZMh?iN$Pln?~!h=))!AUTKxkx+1j@a9`x7Y2FS-EFHlk76^E zcemc%dUtzZTbZUjuJ^az-!5Khf)YduFea#Bkcc7282USqPd zTdgs*wcd2EOZ@1kD($-17Fr$G5L9KAtXr*!la{ z?|ypo_RXnN!ICGwy7=kCtBbcEpB6omE~O+_i#5GSwez}MnV5;#p5EYy7z+&z5t3Sn zL}0}eo`joiT3c!z|E>lqVJSHM8`xR zNN~geOhhO}%r%_aBHS2j8)>HNoy2k{(XD4kaYy$qeS}L-TifZsziry-pZ@ysr|;hy zb8jAbWtfej9$T91?k2~^Bg51HL~#n>JEpz?OybYFh-hQ!~vtqqyab4y%LO3dkC@FO#<$v5k7!-IPnlOZ*W^^=WO}W!n+SO+PWI%=@imR=Z@A^ zMfQwK9o;lgkF|954Q0`nVy`OWL-)k_V79qd1$pxVW|@hSDKprLXs>%bE1bQpB#^1O z#xljkrOJb}C=_9XtmBbAS38MDPY0lXw69j#dK%MV=&x#2z=xT%xC)#ELiKuft5rJa zes>ZUpRbsd?lUL>Lsf!hx?)jPcV+tO#A!~KXK_*R28^y_DmL0b)8}s+r7bpSzjR3p z+V451XNx$LPOq#wP~jSBUXLrvFsbP>IdQ$6P!lgPBiGM%=bMqCsNbMuS=_N-l8F-L zPY;_N$RbykMJgNLAM8z+8uQ zKrpn`W-No+R_5AVuA;$WdfN&py_=1>?bJI5wS^ z>kvzzP=b(6{H0<>6Noj^Dj^IClBh7+wo<1V`AdjpYr}gYmgzt*CYJV#39+)F^PUR-LSAsrZVp$krPb@vL+=y6m)f--~NG#1nNja&|h_1&9iRps6K{PnYRFsZsbsSx~4 z;Xd8=d;>)DQzvi%L4oxLm9<|l4~7UMiV%THfe6M}5RM>{LMcTxL|YnPgF>r}53L$`t&9^M(MV+pSL+;clOv9F}e*GMfl8s2jAe3Iq)6F-k2-J7P6 zk{D}(G{IPEos#d>sSt2m>#JDbhnjk51vPl<>(dP#xbS)``$y zTi~g6I#8Xo&$_BQ8q(HcE7+{#BON>DjUUKX-P2Q@+ih;(kq-`~Hgx8Z=^b0nC=@CL zEJPAUP((`5kRYA_0tx0?i9#vUBXA?Nm{IFDBOT;sq$L{CP@n`vN^;0>h*^Xg2}1xP zsuLUuG@UtM+Z{UcXr1mw#s;|_X8pW{xSWtVB^GG z+h@UT%ld09#jr$$LgOS7%$8k17%9yGGERuon1s8*WJc;HENgAl!?G#0d1U61nMYJt0BOAKjxj$V7`I5f9?N+w_js`!_ZqrgLu2mI?&CwdbBlkI;~4IwigO(E z+t&hnnA&)23v5Rf%5A>B4@#dnT+memhXy;w z+4pu;u^0)(A;O+L3DtR3c)Jf}y1D%1Wq0yzg_H`!sFBJFo8=`EZc_t^Qs z3_{i$eRuMgPda1bk57Fzy3G22^!T5D)*s}be+Hj=>i3|!V2tsf|5aX^`q_BqXMZ^f z@=O%Xbs#*u8gx%ydS0*zFQ|?M@ta1z#M|Hcw(Nkf%no|P>uL$z@x&dIh4Jc=G#2ys zA<0tO^27|~{&4Vg5q~MPV>c4CNtf@6*ERek5zkqENYj-$-Wc3;}RG*7Tz*jvn?&u{uiwHIfZmOat&L}!0` zano!K<)|2wL?Ml!Iep6vLoOP=ib#hi_p&NPcD z49X0V>8aa@Ojr<^(<&ocdvk`i{86?v^Q@?NR&^e(E|p~NA;Du-%6RISZ1jca)cF&Mz7J^y@@FZzNlH?bJJWujG$@3)7lRQuIi$b0%d8*{8 zlBY_WQzeA8NF)RXxx_J|EY?&Tx5ISE00AN0(_&JmcbRvx%PM_is}!w#=@!OwneT== z8F3F~6{%9MXGxC%=U(QXFnPkX{XohtbH9AzIf2FfmwA&DlvmC8m_hBxGk}N604lH0 z&H#3ebMF$~XUlteXAl}|W1j`49HE3KD5g{~5+*|+A|XSdU@SO9nr$17?z5|o9g}LZ zQK16Qtu3#+WyiFY|MS;Vqp*J~bJyUZq25Kh@G$pSch%U@=oDjzE-?O8BgY{@2dtkY*2G}2dW()&W|#lWp9n`Z3hv`iCuSyvXR zYCs!YGs;pkw+aB`V8M(KwneF|^OCj*Q?2syNoie@x94_m zeCI6dU^wcq$xN-Pv`?yh2dP6P_M~TP`)9#sD^v(v^FN8AY@Am0hZY zsFY}Y{J1wGe6677`;kLcl=3bBrmbK*tAED<3ZgK)Qszr#JC=(q<@TwA`y&PGjP2F$ zbwr^Y<7J`va(MTPX9QLacIp3QouW4~i4hSTqX>{N3=x)!5gjuEVvGgYsM_K{U3XqL zzp;hbI|WyA{c#o0syv=;0xX3~Utdi}8)q9Zw{#yyh;TK9JUq-4e7!zuIxN_P0Zt4D ziI@bK#URwg3_y*TR00Z!MKh=~KfX2sP~GDV>HKw^_N1*hZU%htx=E$&fS;+<*sauA zdEai{^o`eIKxE1a-)zEgbta{yk#(K0nYxY_#m}2Rx=wpN z<1CD4HBPli!fhea#GlpCr&_votZT##4p&qVtRO=~2@wK8V+8?-K!oK^tZP}ub(w)} zm0<+~dqAdjnKrz2y|dc36V)#%ZR;)R=9aV=-;TWgn>vN}?^g!hts)!==w3x7-Z6OC{r~J;ZF3tplFsM+iaBNL zE}OC?ybcCV;ws0Iv#OJ9mn~QJuC7jnSBV>n!{ZEPdw=}_m>F{T3QD3#%1c)zk~qV` zpwUlv1L%J64LJ*^^83L10Km*?69mqt3B)X?8WFCsU#J^aoHRK{4~3^GKTD$cEPVK3&wU;^wzSr6T)HD*v>jcSy4|posiCPz{oA~Ag$9eb8<}bGM;=Vbndp)R1k#jY4UZ<>fDl2#A zUVEgc$!AeCuj^iJG)=L2x0`?V{?&H6=EW~V*UB&5&db-Aqpu!1v;50ZxKOu#JqXEB zzaBu3j@oS&<=3wJs5D>7=OIJwMU{Q_v%9Cb5#8>~-$%{6SN!Na?yLSFfms6B3rJp2 zmLLFlc=z}3&yv^4ndn^&eM;)-s2B2UrSsm~R7kuo%l?a_qtBl|AJ&`Ahxy>@sMFKt zOO3$qLrP}IvTSbgS(a5sX8no(D`eH(bhHZ?4q6G3!9OMNkRGx_=tiUJjQg7iX*%%}0D=J| z-$4i&LMdR#-G|Z?!S52V2>}d?QVf#hJ1MSu&ekrxFLwQj{`=+Mj^Dk$_^`LjaR-1aHTi7tuXBI(h4H74-d=Ya^V2x-q50 zq(kF#^MAw6?XL$;T}o$>p8J{wZ)w9{m4OIA`B`0yL1D^YKV7_ep83a>ozgjrMc{uC zqMnu#HojC`wJgMk#sWLv6CUTyS?|xrGeHaNvftJQzPt^m=*eUt{8dul?-{9$0xW|1OFwjasylQ6kx%6dE7X@BS7vZ{{qI-h z&vjH4zVLlL1)Ue3FYo|PK(W7D&#PHxGY)?IeDLU;d(vD9!k=3p(JF|TESLbnkPTXa zbBKqVlzx@_TYJ8+!kGv6*)?hqmAq+$=f(lWzWn3cyfjtGgp1<}<0i5ur0`YmJ|2m~ zzb2s}|6k;NT51$F68;v1eekj>KpXnxxZ+t-6%zSiGYt8$X|B~#>6}JJ5&x+Z{+Y4P zX7=*W1JQ4yt`I36OqDh)SWvL3lFUut6$Ba9mhsd|h=d?1b`yIOU2C4J$E{qC>C5#} zLbTcTQo@`zlArpjSvYX|Ia#bRC87_L;*fb+<~OU%M3;qVKg0#MPzE6c{_$b$A1pFP z)%viPPD^)Yl*cEV2Gx1FKy?0wN^mcm6~$g+-1O>eYoa(dNyXfSLN~MQlyg=C)p%EA z5t7!b~{U;fh!a-Ri#86;NgeDp1LUgzU-Tva4b z6atCw#q-gUwCFxdhP}eYmW8e8<7S-nZsUSl1c{~y2xt*Th(c)$=4nP{iUe9aEyWkpYbc0iZV)JEP$&$If`+(g1#zYy8`4u@UhHiifb7vd+YSVy62GhPb`a=9hztRR zZN?-5P#K&OlTr6EW?Blm0O%8qK88P@1$k5VJ_dJ<=;EnDI?c4f%34LFv;qmn6-X6@ zLQ7|S>$|<0>sb%C6ajRzVJiHf^up$9t3X%;Wfr=EP)R2@aWf*oQ6mY9`rY+PQ zNwHQWNORR`JW;gayLqD7Yt?t0iK?KdWqC_$|=P=T|IX!{piGSdbFzc z-H5Gw&Ngya?%|{Ifh07aG|eXm{oM62q>I*hr(qDPMcL)Ey-m9^q*CDAzCnul+CDcw zQ7#CeT1z)ck#^0ltfy=EMw|WS;2Rh8LYeKsyCv}UMNw7hxIx%8;L=obYe>dPnmTvj z;&z6l;#?BTIYjANf&1=18@C&4^+^PvaoH^r!@pMa*(s9GrrS*_X5D8==g=HJ^EYLqZ@Y z%6+(2h^wvj?QTi)RLXO$;2D)d-K_?`+0TYp)$|!+84nQ+oWe4#tSj{`Y_LT+UpO?qj$s7 z{b;9?Z^Xett|4bcYbp`Pf@CtYNSo9OtdPp&1K{4tFZ%<3{>h?!#c12BMY3PE3h1~1 zm&;-+;p~^S!R@{8Rg<#vWoDPWD0M#E@J2bIR#GEPCb+^_LpQyk9817;CS=Cg!&KTX z*Xd~EjZVKgJv&K$DoSThZemF)+tu*6JR_p1RD80--=4yU(sDPO>m_+*${Pgu4sR9# zSW=Q9;!j}0(xxd<7(!xY$|z+J(uW~H6w4tHZM}hjFC|TW@+#5aZ3M*S852zffr$=( zdk7GTFS5_o^YH&Fxv_LNUp)(p9YNs!zUo8)7fw}c67II!ju^wGzge(IBbm}hNK2fE zk;X!}pI8CHxwL$}Q+!dVPUlh&Z~8S@qOGqO13gRH_I0ahi3>C)o9)CzQzBd!T#j9b zLRDMnpBr_5iqmL`Zj?7X0@CPwh;4X|EKNC7iV#DLKjjcJZWJPnAp|YZ<`KZq%|){% z6>U8>?cXIB#6=mC%HvP*A4})Y+}qzp=fgVLN?JeSCb}N@0jjiiT#_EN^BTQ84j-6M z=&S~vesv^{yYT&8%HBs5a^=cj@+Ym_hC|zWEgqjT|11VhA{#tvCA9Ni3~t1j>dXCl z){z4-_<9L1;jG%!8Z$R~aYOM)tVNR?0ejM-Z;`ZU|8HCTPc53eDDBgV{7=|jqEq}& z&aZ(z|I?oTX+HncSPA#MPkY{{J@3;J-lr9yvW)L(;_FL!p2qB(Tj6(_^h9Bl zqzp_op(?Xd0w6S%DNKbRm=G%&kJb!NsOz}=fAn#^Fc58~y)e*vX7W@2s=c&)*6A5B zxI7u1r0s6$nrDgW4R6A2{+HGRJa&?)8e(H@M|GUUeSz^~uQ1Gs-hPP7d`66`t|ZK9 zZkh|ZDeS+x(+W1CmdKRSj6%PPo zAStBZ%*s;32+O2JAO==`$Er#y`WPxYx{}2 z=7p7qy3z2_v$~M%wo|x^b=`C;tx!0D__K&d+r^{zIZWR8H}<78_2SDsZt3>33ZMJ< z)iqWO%$0EdK_4cs<}fd`dg5~{2c6P+;5qCISEDz%n14pV+~>I{T69ND*NYAoXmxWl zrQ=orZZi%s#f)Tvq*Dybf7rN^XOVc46p@mQ-%jP^F{YFtXOjz5N(UAtKb z$3X|cHWViQlicZ3XQbED^kcOuht;k6(LN!0*cGR}ZoRzqm;d?T=7s+Y{&G+)fcYCP zQCRm`!w^h;-3VGAQffmvftYCPJBFCJ zv{n_sQ$WtML=^Kq+#XJg_SUgA8H7?|feAB|V#-o2w6*S6%*})0Gls0r@$68-{i=;1mJ`G70iK#mY6dN_mS$7F zw(g1I(wW!cyXSH3gtu7Am38&RsIppvv6+fVpdn@`HCX!d`=oJki;;i|mOOF8Y z{%AfWRH4kTT=`9t=W&!tY@m(!G26V&B%E)SJw6ZB-mPj`aDNzstiO`<`i|RW96Xdym%Gc%%m24LJ%LZ#}0$Q*XR&7(?PlCpD=}-Pj|l7(qe_1}){8 z(fDC7t~dLd3g1{$D?xY%pc02LS^+R-I?jl(6fYxMr)VoX7>>myGu_!I9*iyHY`WSyWz*GW8Jo7s zTS0ZkA;W?&16}-|a;I^aU}a?n7=rgnJR5N|OfT3)+gc9IFWZ1-Tt4%=yitID(=-&R zhAyPnQfAZz2rdR@Ql`L(iD?6w(D&0&J6}bkjm2muwyv;oaV?O*L)j&ETYqXrJa$;IDk!B*J$oLRA!{&Yp-B2b>Yjm`=2#dtl6*?}iMG|-*S;THD^wT7XNCgKF zrzE4yZ+j_VA%p@suj;7{d>-)w<^VIK5Yg5m0mo*m;OAQNsJs@5V6y?pp7Y_?1D$G= zDgi8_sRWw)Ba#?4%o`~~lv;ysw>Tc6tu4wG*#WJNOKMT)*PaowXKt8V$QEU6Xw?ur z9j1oS;MWQ<5h?768UD418SYsBe}4MjsnsBN*t=Po0$^$VKSVGEc&h%NB8K<%|NHv? z`St%^2^$^UGXU%v0QL+3OBeuF0?RTEfT;&8WdU&a`asCvyB!{Y8UM7W0$6ne=Hu5J znRh!X37i0a&uBxNFWP3QkvN4=Nt0rUiLsDVsWK)QhS5TUDFuD;!g-I&ckeGw&rkpR z)y3(%x0mPdj!!PnU;TabNi%zlwOr30A9->(KdAa4E|+*mD+98woE2@Fqwu!BZ4piAfp*%nNomSj3`f$u$mCFHq|+OJFPm=mba=pak<1h z`gp3->Ft2(WX5Xfw}Ub(k#qnv7z=BmCNLv_W%p8@@ZpDdznz_&Uw*uJb@A!r<)^oA zPF{UHbssgfq_Kv#syT77MEm(@iZkq4BZ`i9)U80{AaUNR92OfpDp)W#d!?zf%?9wy zS}YX?OcKpu#`*g6=C^mB-X5PEk4_4Xw7XrkiAp8b%}3N4nGbu~g?l0-p`9;`I4-@U!~@b2vL{i_eJ&QC5*K3u+aKi%ci*QalPZwfnNZ?RPsip%J3 zonE^_HD%r{HTsVtIp_~MDx65_XY7N#oAkxN4Z7d0_JhA64ddDx&W+!4GDt$ra0-M3 z5OS#@GV&2Ltd{fT#mV0DhsKe;^l`>WR%&Acu4 zQrn%kMMd@?8Eio3%om|b=O>Nno1%Pf^p)9?`YFt~%^Xw_R=^tfr{-DabITdA*3gZq z-zSLILFD|kN$zTKOXS=z$xB5Lj!c@tr;np8I&l$`RQ<>l*l>}K~j8N>( zI^HkOpuTva-&=I6|Rk%QTNo0=>s zNNf|ulY0GJN#&q(+Y#M1U@H#Mrb2#-gwx}x;Y{i^q#0%I%U))wk(^*QTvksxBv4Dj z4fVf>R4B@cCfL~tWY+?`W&###>RuR|IwH^6E#b3<7aV!Ki0RlD*WGLhuJIw5Bh#mk z%sVxsDb>c1j9_I*%89T-LMT#TVQMS^Qzw~CYr%aEZeABRbER7AHbcE>`!mhcF=d6W z#cjxBYu23y=4yP`=!EBINiP54sgQ5YXiIi3C-Tf@#}swQEKS_bSUd()N|EL%XV?v< zNO|UuAp^oWO@OgnU#Kx_0;6rOWCAOlo4o8UZpnPb<++N0cEz3?dIG$0w) z8F3a`DyB$g+Nhsx&yT|6B7G4*;}}M(GBj2vv+V*RGpPlXnG_sCjsQ|HwOMAhgj`Te z?}x~mi*N-{Mw?#@$|<78$%`AHYFxA*5f$i)5_%j|-j%lTVVHb;;>I>UcZj-Cz%<3u z#Y=<;rvwD3j3UJe!2nRDz`bBqa~aN}DB9X=an`PQu(+V+_x#Q^S-az0mU20|hMpLk zC0@rx$$?QpMkKR& z6nu>p|Jl3t=eBJvouBhp@VYa1ZnLpWfFMC8 zPG-}j-J98@%{J-W+3j>Rc*>kgqL!rMc>nqZz=x;@1%)bJivS=hJ%-rUL>o`_&HY67%iJ}K6D+IBP}q8McHFaLyE#~obli@P z1;Uz(RVt;0otSk9jiiIObcE(LzCM`}d_F&wl^o zNF=ml+7+aSNG`w{Yp0j8Hq zVc_~mNE{HtU=T{rqwWrsGOKsNKFRwgYe1!iZB5^ofN_g6S9?E>wU=tg zxdU(ym6`EoDY(2)M*|9grHBylrCMzSf{DO)nOf?5El%9ZmBV%|1(sbO^{y=`L_ouN zso7uL6<_8z)qS(Ew#tdsJH-c=8z53s7zr$S;1VR>478a9?Vm8MWjOqmaY&Q zhb~)8eU~uoV;V3TL1;!FaTY`@3Ozpvw`Xu8xTCLwJE|Z_Tf?X8;<0091>uanJ$qnnr)5unyRR4slKcFII>^)VGMRJNBFNVxUPu8-+hTRPpTYzJxitslVLU6*6N zA)b$xWq!U72gozO;1vBx?vCpb)m3-}5F8-nVnSsI0g9vuvHBMYx&7WS8!B~P<({`S z)*iESJm%UFTKUTR3BuVeM>COUOIk$PVN^6C=GR24x`)~|L4^2BSppsowC$=ExvtN- zTJ1ut%=hhWCuJKh?aTL-1nKLCRLNegy;wVYPwK3R9nj4X+S_D5xAP`%IL{V?xOEx( zhP$C$=PWwv?MoP?&}KWJ4ZW3TVki%Fs5bDG?2}L}C@~cQ4T3Q8eaeC`@CCldq1sjR zEKh76MQbE91AT+fipgE|OIil1v>FweWd4Nky$WCO#Z0oib1(sGjh=LWa3wAUK zU;}YIDyKpCt$YT%^B9# z5)=_3e84GT&}V4JRIAjkwb}b{t#Rh_SSvg$nihCYgLJz&ZFx@QYbe9|Fyx_5V0$PM zp{w8pK7}qoTuE+Empt|Z7sBn8om!i>JLRmccP8TMqt(YcQ*8yc8%n3a$K4!7-o4R# zPZydgcQt=}@z6drFA@lO0Ssk8u?Jm`x(ZAXMl_@huwXZ&Yw@F58@F)IoG4e1JC&&hDQz`g@-{xeRgFS#cPAT*Lh za2QDDQ-LsJF5ljB7iay_eWUZ+S6)0@t0(NmvjVmrfxnbTukqeZ$6TW3dU_jYyWW;K z_#V1P015-8&LKrU40*sp9QpyH1aac6ST$tH@as8GfzP`CnN@H;F9+LL?qf%M(@xwn zbFDKg$zjLO2%mGFB07Jf@49Y81yk!W3Ry&40KAA22oYQnAud$gQ<97Gi!$4)w*Bgs z<}rSo2q|M03$tRNah$!a*5kx$}b`Td-Z7TE)Dy4N{ZFR$V)n?VsXOqE^3=cb& z>%n=z!b14Kmb>WJHo$zgE-1wB5Fp*-me_QhGWjRl#2Tt(m;ZUupA}n-@SM2$m@(@Oh2aF0H zh0%Sdt8AOE)&{Hj`qTRlKRVB{JQZZro*?&Fv)7JWD-gx>oqxTDG?}%PGl;(mwK^_D za5cO2s~$MZEdld-t2~?&NDp$CZ{*M z?YOlAQB3c-*Lz5_n>cF8JWSZ7`G1iGJy$mmo*QShfmh#mdlR!8?RYNSkLtFsF_}@} z(CN`Z%GxaZ`fiEL>`-7DvV{zQ))6t~bbhWi;wM(8mO&NKtT~;e_ z?MNKjPFVnKS5$bXUd7Z9FmI+tw>Sz?o_DTYgWnpC!Q)AMK_v$eKtFK9hyoq$?@<;+ zT3h>+(j86oVM3~dnAR5C7pbQ)#qE%_W3Zp4>Aq(22i4pWhH}Lg4^MNqM@mLy9ibx7|;prDG2F$5SS)a+*JF*QwLe_JhUQg7m z%D&1w+^&E48go&cz$!;Wsis?!>SLjeG5b}>3qyy27#kW~PBW2Sx;^0b;H4g^p5{WY zceU!;RW;;o*G)U0NID{F4kW|78^KfcO?BtB0H2Aw82< z3$J}B$%c$r)2HH0}`_WRbSzb=G`^LtuM*gr}^GJk6!OX{CXiDI^` z7RQ$->_Q7eB@T8F2WOsh&4*P3#htny_h>>`{`#7$|7f+1{o?wHs-El5c=cv2wdsHR z`KKS>e15M!syF?XL!HY!wsQfRmZ$#k%Wprw(-rU6J+$#aa}ZTWdWxboN9XX;=Tnnu zagKd%XMS}Ml%-R@eERbK)xvUqo1t1w z&VSmFaPzCq*IyP?z9n7g%f=$|9-SDpbzx8mDUEEg71=Txrr;J8PNl2(mR+jYz0j$D zmCY0d1J#nPOqO2tvd!u$tgBh&RypFTKmoeyL@n392T-q$Zd?+T2c)*;{^X)^)Qw`!^}+fXL5$_%fS%vOJ)j1pcp3F!@!}d5 zn(#aQUAOo8>62rA)!qwsS&#jkCu3ezmuXU(c~WYL-P(q$zJdUm?>GqNzPqmP``CQ~ z0KgCiE{5tp7zCdC#BmP+z%Nrm*8H|+}Y`xER{Y<~E|Mu>ew_pDI(~r(SzkK}Q zeERK&5AWYP7nfI8|MK2mUA_DAuDF1DE^xl2WL)H2B*Uw#AAip?+K*=R>pMypqr_ zj6u61R}UF9SpTb#BGri-l{7Su(-La@XDIIjQI6O^+6#NKPhOHc+wx5#nzSjyH$^vsQa?HXOuq3*<-RU&lx3r zI$U_t$Ktd0Kd)YuO;a_b`NiyUWIRrC-Ho{izSXz4Jh0G8`n%Cf8)Lbq#R7^Cu`X6` zN1}FMw>{{iS?YFrixoy<$ulzxZ@}vfDWm>ke%)Oe)@_e5Yuq+x{!%p=or7Ygj=!4) z417#d(d+f}%NBO3Frbt{C$wWEKOVU2T#ilhgD0A7QJ;@>?u^^ zpvO;JS-Q?ab;W?c(gSxB0Z~5bY{G8;X$e624vrL%0 zx!SK-^nErGz3+?Yjjb{#>70L4UE(@>?z}N3sc&l0?6|{ zH^7`AM1UI-2CT7tE9Y^si8L0s%a_XyBx|$H4Wwh$*;;3!eP;)*6@#vEPwU#hXcI=e zuW|J@6{I-Btkb_Q7qw!EQYhIZ8Jh%`r9a$kJrOmlU42xCIR7WoPBmCx|92uiE-Bw-H!OC;GH1hPb_Qh57T(4BbZlE&{)24)}9r2EvJWf4l{y< zpCr364}1@Y*o~x5T!uY?0g%2ALof8B$lVXS-!4{nuy$ipS|7H^!&*AqA?}RU3G(kbt?F>jM2-l>6u1!ugc0Efm_@*+fYZ>UdaCV*$aTnG$zy9THs$eL(CSfX zYzMe2R;S3~ZL)eEg~YQstogvUbLKE$KH^BtG3iA<_Msrq3!z#W3D&#N~)j2kRW($?s zmRVUIMfofIPaE(9+VPFwo>8yfZy20CSqdbCAG^0C}8n zKVV2eL_H`VLy-@N5SRpNxwQocmoF{U!Y;{Z?Lt>FuJi;y8y%ISc6>WQbtJML#xeYC zwCg&q{CHIp!+-%43Jw%h1mX|~7gIrswLkLEPD#gRCuXX&WVYtFBHUM! zt~?WWR2te5w}SVeDQE_5*JS{97w?fwblGCnmx|ZpCa)WVq&cnLrAT;Eh z*4qK@iq%Px{~S0u2ce@O)YLo~=7nlNbcK20p@4Z&pzJeGaE2I17;Y6QwS4K9|E!p1 zYxOKvop$WnU^w>`XP1JjL(!v#}AOJa1(mwPBqzHs=#8`)HzZ+4UaNf_86{fbe7q$&w zn~`042v0}p+JWzi;r=&$k8WPKIg$WFk*lOC1tfq0@dAP&bX_l$QQ$E&?;YNsl7GW_ zwxr#YeHqc~#Un!#~h`dk$1_K&+S{*UraqaudOc+!S!p!do$=By}q63dGd~4 zeXNu~SNKur^MI3(FhU9Uu$nNgh_;D%&Zaa^3ClN)#ISbh0npJ7`@Il+WTmzKUkPbv zYBq{29GsjXz>rDb!;A^0R%#;QLF7uxxGyAzE))R@sORzsQcgHyFxrC2 zbqUHgeQIsH+uruK;|6P30bGy8Q8u_AbZJf$VC+!{1Foct@F|sn^tc~lCSk-G+HOkA z^>fCJFEo)&1fEZlh}6aIwCcls`6Qb;OYeOw5;kwT8RkU;?j1pscxfU0(7 z8wISbTS|GJ9s}%n+MwC4xaXNL;5Glu4RqLwh-=wm2h@hmacrW;GN7+6Bo0A{F$PM%i^ydFBOxg9F(ycVxCb&cN`hKj zx2@$*i3WBkZK&*j!TwkI9}MjF+O0=ws6N$E5EozIs=^ ztAGEHj0bA!{JEz#iahUb+jkfEu>RS64uBtcPn-{j%>SMyNxtqr+x0X3+A#mWImX^N z$KL;Zm*u*?bzz|OnQip=;< zk!k<2y2E32hsWv;!^Pw>rA#hFaxIZ{!G}5as6YN<%>S&6@YQD$a_vSfsvwloyQn2* zUCC~w85--`u6@@qJ$H&~5T>BJK1ngY5&8r$pH*v^l*Jl~+GS~DyFkCzMNyMs4=?kb zgpmgclq7Pck7VGY|7Y)7gXAdg`w0<&WrP*;umm9)-vJTg?le8q^Ev_1NhidGlQ{Ii zU>i>Tn!Abic2_%lr#l>|0YA6$+Du?ni<2M!S= zPE}GsNItl1C$Z8!Gdugf+1c0aMYEK+-I<<#{NLTv{rfW&%2Z|wL&U(S3CqU zjv@wF9kF;Ei)YhLKH*uTJTrlch^%XXVg45=vZ>01Q5!I%nX0A57%OGDVnUrJ8MiF7 z+t%!K!q|pQvq=pIC{%%FW1vvmhME9XH7wgSP1%ewRvy=))Ks3i`R4e#(1hV#OgP;z zry-%XYGVd0!$1n;&e-CPSXP)#4GZ8HW95-X&O4zQ*SjV*HwMFGUFGo+A{ryQp<6&^ zP*r81>%hV)GqoZ}WG4b4ZbcJjHO?%esMuDZL2Vf;h60#n5R)-%T2MpWPsU?b=i*zB ztxXu()h!H#_iM=um{s)xrq|bhi|a!zz5l7d{wpg`H7fG|@@p_z|4r6^tJi-g{omYf zB+I|eFaOqGcU{rt;5IJ*MlYNeQmzI=;#Y3rGj>0pRH`HqY~XP#HcxnTD(-}+6)o(U zoS34H?X3gkr-T-j1Oj{Z9STGyB~8xZltZKmhp@EkEf}n?U+K+b5w+f&V~h)6X=lr8 zPPSjC_H5&|E-fu>dhNt<{%uWu|Goo#JO1^Dwx~6~`_BA< zjGaG*a;$IKu@x>@&&9mNwW7qX%&f3oeTP!q$x3_1ZlgUsf~sn+IeE|X`3cc(+FEv>$C#BiAr z+fI(*oI{Sl7KRM#4B46I4CvH=!^$g%t94#?wVDGylrBsnTNmfRWEGp#J3lJDwuZ9V zZ0ZJaia@%l{e1LlujHT+nj^h>u$dg6Y}OklMed9se$e-_Zr2^RvD~;1c5T#Vgkj3$ z$c#hP#zsCn#lt@8t*Atd-mERlZtF5!J#JBJIPCk9Mf%>D|7TlU0EnFb1G#ekuj_IW z|M$xL|7tP+KXvL<jkex$lzx+nE$)Ig-i<>m1(D*zA8i`^wp~pH{!}?ni%ia@~*L`{Z+%^gX&`?Sb@&)M^pSx`K zrN^F4|6-Cpm;KAh^{*{_@~P+ExcixFUisBOeP`{7OD=or@V6d#e_}cs)qmo@b8BS> zK*aek{-0j8{%<7ff64p*8t?x{Q`s3l0m(ZArIJ%%$tkep6qvV}!K=5hFNXgX=b%bT zANAg$m*S!XSAxzCq*$J-*wkeIO_P34JOsUN5;K|_;!rt zyl=aTSSbQSCxT324PgblN*|9$G*66*g59S4ZEc{_E-{Q85~y~K%1_B79TcEQ(dmTL zREh1f;@TxSZBjrxC7MOM*0{VB9_gIC)RN;Uv2C-Q)|1b6G}9CYSa-xTmQZ$F7NbP3 z-Lh6!#yaXn+jx4Ur4H^LpX9=j%kb!^iuU4O;Z}P@vA)d3lCQ!Un6`z#$u`+!o9sEg z{?|f?(AfH)q8JcX;6Et})ROhTWc{yt{jbrWv&4e#FG4XSONGf&VFDP{iUx_b#WD!# zppiyv^YI9;w)LxtX%ReSu~AEQY7G( zXO!?ak+OfoQrnO0!0>);qGi3rJjd3o}#S0*YRBIrFE<2!o1YP|Y+o3(6E~R3|3X zHG+WEWo7aaMjBMP$gVe|a^>j>BcJIxC5`51dwJ0#svIlB4>NTjbNgjlnnG+qi2<;t zXo{-Yx~-XNc`C$)I?)kpQf^3mU+?%gvWvyU4n>=>J+w3Ff}!zK1~6fnQi~GFF)z}n zsJRF1kVOoJfC{i;YKR&LF&h)WL`qJ>(xS6yHExFjK+m?CqR8IIG({D7pA9_Gg;d5d zqlHL@ww)O(Z;RsQMecwlYHRXxk2|Fn$A=v*GafyZ#+))8Q%kmN6Jv-8MT|m97&SEl zY)!zOwabVEIIsf>oaeu{*97Frbe=g@_Zgz6&@ zzGu-9Ue2A%u|VZ=+&gD8X%9%7f6dJ02rqEVNu?w<&!^&ZD8>CdW@2HJA+hVfr8LQ7 zAsnukQE|C>2UMCdrW-PsB0iyX6m$p4(24Z=26)U>PT?#ZC0u2B~Gmr^w zRl}SN7+H0?5Kd>>mkqH<$Evx4H&yV|IdJI3l?h>SxQ!8s+WGyGRoxo%gzh?c0})_p zP{Srru*ImN=zu^)fk@{++qqg1Su#W$E@*#L*J4fqdd|B?(>@;ERz6y9uX_)MRjp`l zCYZYCrG76luiIbHvNT)Bmnc}bvxUL?a}61x|?>cUFTlo#8k{QJGs+OC&)TkN)&XI_TRX_k{5f6iQJ z+N}uX!?|*pomE8F{-wq65}yTlyxSfm@pdISsCd!48KO&eF@;0pN%2+QvQS-!@*Ct!_)-{vO1aBnV`+9I}OP2u5b$L_yQq$Ou4 zKeQnEL6Y~}ERW@!^pJnWe-36B1dLGFG3n5R-#5Q(S^Kgm%fAJCafU=+!>$GQ1R;hz zQiYGDGig@d#>Dub6#lsRw*7nkCaL3QQ)scYNhd9`kZ*6SLshp*+blLygX+H7D=R-5 z&7$SlkPFz5&J6jS@Y~?-H0wX>8LKi@fb4?gVT?%wCfq6SGQ5HU9BN3|?qUbbVA$TR zV;-VZ;TF!MsCUmZ>Qul)`tGGBA4W%JGV?6wkF+?NAwR0hqsMOHxlV>5iTLt-BqD@wYUB9@O~eBb1ugHeJPDf~600I=EemJW^u&9q-) z*01MQFaRCq#&0Jls>{Q!8R-`OO`73>qbud+#OrSnq>S&@hV~*NeVkjoGG0ob@JSHV ze4nUwH|I>@ff-R-shKQ@ONk`Z6w^9FIx#*RY=bSRbF`2bb+c%JYnYRgsvGZHiR}y( ze?-zt>Q1BiEXvPRR##z5!#sFBL4fCGiOepK7H!csgoy9o;Y#h`0?XQOH0{o_VD4ularG> zcI@E1sZ@b{vuKL2_ z6Ca*Dz4mWkdGo~&^?j-D!7~ro_nrFF+p{~a`ut*xfkG=fQzq%X{h;q=+nVNHg&4R6~qkx5Taa2@YZ8-beF`zwRM zHiXv!(71V!Cc3HrxyGa-2Ik&K(}-jtys5u136;gWkJYH`pFLn-!a?!z`GA^Y-3^_AENzpyZ$T z_BJ7=Qv6qtAF6o#Ivbq6ZY^Vj8y6L;~6)0n{WqVir)5!Bku3{|C^Jk)mQGL!>q{e3qt(sb6)Hpev@T zV+&~fi-oCa%GkDSRgpCvLCRQDl2CTgq6Jg1kOYP+FCm7kL4bjPxU#Tf0<0ngZHp*C zS0GkNGs7=C1(yT^B_~yq69Nf-bMk2`{&U?_3{CF;fl!l`iv2%&lK(Y%|F<0eb9J_l z1n@a|LzuiFTn6yDQI&~6c&@HySx9FRKC#j$&b9nj0@}PfL7OqKOp`G}HB692A)+S5 z6euP!O$}SP0nCYNIW7a1Ex#SWNkleVfyz?ZhJfR7y8s4JH$)qVCR|+_#6VbypRKC^ zR^+xF_cSfB*=&BXaFU;EchMxd@z9jr?!pr(mTnk|!H{9eHlP|X7|;}pskV-pVX<}# z`P98Emzko@?372bK;|QR(epANO~*z_vPxAz5~CR6qhM**i`@sMxwOk;OV@Th$5!Q} zds;7atU(Hp%#D_YWM_#JsQGp~BCYY1RimFUB zi5sR?cXTEe`VUl1h_K0kVKWN?%@&CV7-7056Wbz{=szJ-e3-9xtEbp<=kmBQ#qvJ( zO@%6oXrBM}v2g@)O$eV`QZ|4It3vKx9=N-p>?^L)mI-aDbD1+R&@Ekqrt> zo7uS2DqSAtMfRoz%?`_~uv3htcwFN3prTVvql`fla?1sE3nCj~z)ctr19WCXxsIZj zHQEV(T&?7F(fHlfs?wTHfkl}nM9P9p)l39c)v`3gEJKw^3o2cNd5@#jksXTC>S`GM zsv_ON&9AT3(L`^8ew|nBxIp*q(CaQC+m~s14}sguR53Aw01?B~DK-_tRDu=A6pA$s zsx7Ez5t6;89!9oY6O*&o{AV=%mLo-M#LOP^WXr?PyS;@zAFiqTUUn=a?aSn)y&3A* zi(Ze41d|Hv>B=f5wXnr(3#uA6kcx>(ErtIe#0G@O)M!Bmt8aNwPE+9`Kp~ezR2Ldm zM&C1r)lUiGmA1~VsE$U{w;@ukkg~=DiRbo5k&z<8ctBJ}OvQlMk_}+!*k*y_FK3S* zQ_r@|D15{ZP(zm>bjC}u@sm&!*wNh%yGMg<_<7qCL;-=Y1HDLz1Q~Z)c z@>5Ql`AJ|L<_5YE*_BnH8_@)fMVoU}TTptjLS1~?NFi+&S5j+`WoXPcG|Gd2RkJKz zw`~P5MhJoypmJNa#ybWU=tyM4@#44Ydn=Slq`p2ylX@Ad^;9SqJ?QAfBoW+ddt#Ep zN=F#vm1HKVN-^r^Cvn8aL zmEraVfN5HIxgOQ*|2y@KCUjkzCCa-(%9}-Q-cOT}roE=P1X$2Ck!eGwLxK&Roet#Q{ zcrhnHXY#J(2=ts{<`XA9k8%!5=iSl(RqU_HvfK>HhU=r5S+RMO$E`SuPLC7jz_bos+$RK-} zr+qbw#j3FY+cGSBW;VY*#g^1+sk`-E`jhP}Y{1sVeL2Oh%Q<9`wBg=zrt~lLk8fd` zREspJ>{xQDIV6S--FZ#QEpYXlhB&_!y1!_5@{Olf48L-GPY>KPWAO5;ew)VgyX#-> zV(@Wwx_P)+XtHGOqVh&Y4BOw^naPKFORJjhOD)c&jGjTTVfW+GW7RfpN>m?0Zd^9? zc$3%i@zZgC+a!o-@Bc=-+op$i=16^s82SI$+4kdZpq^O|f84G%YVY-N!^^HQ?nw~t zZV(&2E;qYEtgqh7xW|n?{^PRB_v8BypFjQk-#&k`FNd2jzDR)!=u=1W+Jh5C2s&

}+KCTqD5u+$zG~zvpwfVeb}*FeN*wA0-l8x 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

ZEY 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�qcgHe6^KXL4c7}S$ew7 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 literal 0 HcmV?d00001 diff --git a/doc/ppl-user-c-interface-0.10.2.pdf b/doc/ppl-user-c-interface-0.10.2.pdf new file mode 100644 index 0000000..70529af --- /dev/null +++ b/doc/ppl-user-c-interface-0.10.2.pdf @@ -0,0 +1,21645 @@ +%PDF-1.4 +%ÐÔÅØ +5 0 obj +<< /S /GoTo /D (section.1) >> +endobj +8 0 obj +(\376\377\000M\000a\000i\000n\000\040\000P\000a\000g\000e) +endobj +9 0 obj +<< /S /GoTo /D (section.2) >> +endobj +12 0 obj +(\376\377\000G\000N\000U\000\040\000G\000e\000n\000e\000r\000a\000l\000\040\000P\000u\000b\000l\000i\000c\000\040\000L\000i\000c\000e\000n\000s\000e) +endobj +13 0 obj +<< /S /GoTo /D (section.3) >> +endobj +16 0 obj +(\376\377\000G\000N\000U\000\040\000F\000r\000e\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n\000\040\000L\000i\000c\000e\000n\000s\000e) +endobj +17 0 obj +<< /S /GoTo /D (section.4) >> +endobj +20 0 obj +(\376\377\000M\000o\000d\000u\000l\000e\000\040\000I\000n\000d\000e\000x) +endobj +21 0 obj +<< /S /GoTo /D (subsection.4.1) >> +endobj +24 0 obj +(\376\377\000M\000o\000d\000u\000l\000e\000s) +endobj +25 0 obj +<< /S /GoTo /D (section.5) >> +endobj +28 0 obj +(\376\377\000C\000l\000a\000s\000s\000\040\000I\000n\000d\000e\000x) +endobj +29 0 obj +<< /S /GoTo /D (subsection.5.1) >> +endobj +32 0 obj +(\376\377\000C\000l\000a\000s\000s\000\040\000L\000i\000s\000t) +endobj +33 0 obj +<< /S /GoTo /D (section.6) >> +endobj +36 0 obj +(\376\377\000M\000o\000d\000u\000l\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) +endobj +37 0 obj +<< /S /GoTo /D (subsection.6.1) >> +endobj +40 0 obj +(\376\377\000C\000\040\000L\000a\000n\000g\000u\000a\000g\000e\000\040\000I\000n\000t\000e\000r\000f\000a\000c\000e) +endobj +41 0 obj +<< /S /GoTo /D (subsection.6.2) >> +endobj +44 0 obj +(\376\377\000L\000i\000b\000r\000a\000r\000y\000\040\000I\000n\000i\000t\000i\000a\000l\000i\000z\000a\000t\000i\000o\000n\000\040\000a\000n\000d\000\040\000F\000i\000n\000a\000l\000i\000z\000a\000t\000i\000o\000n) +endobj +45 0 obj +<< /S /GoTo /D (subsection.6.3) >> +endobj +48 0 obj +(\376\377\000V\000e\000r\000s\000i\000o\000n\000\040\000C\000h\000e\000c\000k\000i\000n\000g) +endobj +49 0 obj +<< /S /GoTo /D (subsection.6.4) >> +endobj +52 0 obj +(\376\377\000E\000r\000r\000o\000r\000\040\000H\000a\000n\000d\000l\000i\000n\000g) +endobj +53 0 obj +<< /S /GoTo /D (subsection.6.5) >> +endobj +56 0 obj +(\376\377\000L\000i\000b\000r\000a\000r\000y\000\040\000D\000a\000t\000a\000t\000y\000p\000e\000s) +endobj +57 0 obj +<< /S /GoTo /D (section.7) >> +endobj +60 0 obj +(\376\377\000C\000l\000a\000s\000s\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) +endobj +61 0 obj +<< /S /GoTo /D (subsection.7.1) >> +endobj +64 0 obj +(\376\377\000p\000p\000l\000\137\000C\000o\000e\000f\000f\000i\000c\000i\000e\000n\000t\000\137\000t\000a\000g\000\040\000I\000n\000t\000e\000r\000f\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +65 0 obj +<< /S /GoTo /D (subsection.7.2) >> +endobj +68 0 obj +(\376\377\000p\000p\000l\000\137\000C\000o\000n\000g\000r\000u\000e\000n\000c\000e\000\137\000S\000y\000s\000t\000e\000m\000\137\000c\000o\000n\000s\000t\000\137\000i\000t\000e\000r\000a\000t\000o\000r\000\137\000t\000a\000g\000\040\000I\000n\000t\000e\000r\000f\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +69 0 obj +<< /S /GoTo /D (subsection.7.3) >> +endobj +72 0 obj +(\376\377\000p\000p\000l\000\137\000C\000o\000n\000g\000r\000u\000e\000n\000c\000e\000\137\000S\000y\000s\000t\000e\000m\000\137\000t\000a\000g\000\040\000I\000n\000t\000e\000r\000f\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +73 0 obj +<< /S /GoTo /D (subsection.7.4) >> +endobj +76 0 obj +(\376\377\000p\000p\000l\000\137\000C\000o\000n\000g\000r\000u\000e\000n\000c\000e\000\137\000t\000a\000g\000\040\000I\000n\000t\000e\000r\000f\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +77 0 obj +<< /S /GoTo /D (subsection.7.5) >> +endobj +80 0 obj +(\376\377\000p\000p\000l\000\137\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t\000\137\000S\000y\000s\000t\000e\000m\000\137\000c\000o\000n\000s\000t\000\137\000i\000t\000e\000r\000a\000t\000o\000r\000\137\000t\000a\000g\000\040\000I\000n\000t\000e\000r\000f\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +81 0 obj +<< /S /GoTo /D (subsection.7.6) >> +endobj +84 0 obj +(\376\377\000p\000p\000l\000\137\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t\000\137\000S\000y\000s\000t\000e\000m\000\137\000t\000a\000g\000\040\000I\000n\000t\000e\000r\000f\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +85 0 obj +<< /S /GoTo /D (subsection.7.7) >> +endobj +88 0 obj +(\376\377\000p\000p\000l\000\137\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t\000\137\000t\000a\000g\000\040\000I\000n\000t\000e\000r\000f\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +89 0 obj +<< /S /GoTo /D (subsection.7.8) >> +endobj +92 0 obj +(\376\377\000p\000p\000l\000\137\000G\000e\000n\000e\000r\000a\000t\000o\000r\000\137\000S\000y\000s\000t\000e\000m\000\137\000c\000o\000n\000s\000t\000\137\000i\000t\000e\000r\000a\000t\000o\000r\000\137\000t\000a\000g\000\040\000I\000n\000t\000e\000r\000f\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +93 0 obj +<< /S /GoTo /D (subsection.7.9) >> +endobj +96 0 obj +(\376\377\000p\000p\000l\000\137\000G\000e\000n\000e\000r\000a\000t\000o\000r\000\137\000S\000y\000s\000t\000e\000m\000\137\000t\000a\000g\000\040\000I\000n\000t\000e\000r\000f\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +97 0 obj +<< /S /GoTo /D (subsection.7.10) >> +endobj +100 0 obj +(\376\377\000p\000p\000l\000\137\000G\000e\000n\000e\000r\000a\000t\000o\000r\000\137\000t\000a\000g\000\040\000I\000n\000t\000e\000r\000f\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +101 0 obj +<< /S /GoTo /D (subsection.7.11) >> +endobj +104 0 obj +(\376\377\000p\000p\000l\000\137\000G\000r\000i\000d\000\137\000G\000e\000n\000e\000r\000a\000t\000o\000r\000\137\000S\000y\000s\000t\000e\000m\000\137\000c\000o\000n\000s\000t\000\137\000i\000t\000e\000r\000a\000t\000o\000r\000\137\000t\000a\000g\000\040\000I\000n\000t\000e\000r\000f\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +105 0 obj +<< /S /GoTo /D (subsection.7.12) >> +endobj +108 0 obj +(\376\377\000p\000p\000l\000\137\000G\000r\000i\000d\000\137\000G\000e\000n\000e\000r\000a\000t\000o\000r\000\137\000S\000y\000s\000t\000e\000m\000\137\000t\000a\000g\000\040\000I\000n\000t\000e\000r\000f\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +109 0 obj +<< /S /GoTo /D (subsection.7.13) >> +endobj +112 0 obj +(\376\377\000p\000p\000l\000\137\000G\000r\000i\000d\000\137\000G\000e\000n\000e\000r\000a\000t\000o\000r\000\137\000t\000a\000g\000\040\000I\000n\000t\000e\000r\000f\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +113 0 obj +<< /S /GoTo /D (subsection.7.14) >> +endobj +116 0 obj +(\376\377\000p\000p\000l\000\137\000L\000i\000n\000e\000a\000r\000\137\000E\000x\000p\000r\000e\000s\000s\000i\000o\000n\000\137\000t\000a\000g\000\040\000I\000n\000t\000e\000r\000f\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +117 0 obj +<< /S /GoTo /D (subsection.7.15) >> +endobj +120 0 obj +(\376\377\000p\000p\000l\000\137\000M\000I\000P\000\137\000P\000r\000o\000b\000l\000e\000m\000\137\000t\000a\000g\000\040\000I\000n\000t\000e\000r\000f\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +121 0 obj +<< /S /GoTo /D (subsection.7.16) >> +endobj +124 0 obj +(\376\377\000p\000p\000l\000\137\000P\000o\000i\000n\000t\000s\000e\000t\000\137\000P\000o\000w\000e\000r\000s\000e\000t\000\137\000C\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000o\000n\000\137\000c\000o\000n\000s\000t\000\137\000i\000t\000e\000r\000a\000t\000o\000r\000\137\000t\000a\000g\000\040\000I\000n\000t\000e\000r\000f\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +125 0 obj +<< /S /GoTo /D (subsection.7.17) >> +endobj +128 0 obj +(\376\377\000p\000p\000l\000\137\000P\000o\000i\000n\000t\000s\000e\000t\000\137\000P\000o\000w\000e\000r\000s\000e\000t\000\137\000C\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000o\000n\000\137\000i\000t\000e\000r\000a\000t\000o\000r\000\137\000t\000a\000g\000\040\000I\000n\000t\000e\000r\000f\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +129 0 obj +<< /S /GoTo /D (subsection.7.18) >> +endobj +132 0 obj +(\376\377\000p\000p\000l\000\137\000P\000o\000i\000n\000t\000s\000e\000t\000\137\000P\000o\000w\000e\000r\000s\000e\000t\000\137\000C\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000o\000n\000\137\000t\000a\000g\000\040\000I\000n\000t\000e\000r\000f\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +133 0 obj +<< /S /GoTo /D (subsection.7.19) >> +endobj +136 0 obj +(\376\377\000p\000p\000l\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000o\000n\000\137\000t\000a\000g\000\040\000I\000n\000t\000e\000r\000f\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +137 0 obj +<< /S /GoTo /D [138 0 R /Fit ] >> +endobj +140 0 obj << +/Length 1141 +/Filter /FlateDecode +>> +stream +xÚÅVIwÛ6¾ëWðÒWò= @‚K{‰â%uj÷¹–ÜCÓ +’Øp+Ց}ˆ’lÙí­'b™™o曤ÞÊ£ÞÇ}åûa6zw%¨Ç™ˆ¼ÙÒcYFh’xqÊçܛ-¼Ïþl­‚1Ô¿ ˜ð¥®¤Û6åv­ÚmoŠ¹–z|™}òxB²ˆycÎHÆR4sîÄd½Úȕ3y]¥—£¾ÌªF„ª ª>tJáw¨u+ë,­ø»+z D…à}”’4å^Lxä”ÿ 4DÑãXnj +BEP)a±ØI ú·Sé®hjÄ£„QÂáŠí `†¬ðÆaDDÌÐÌ}3WÚ4¨þA®j 4õºaâ9 eVh#îE$ KÛSãÄñÉRf1Jb6Œ.òÂeà–à÷§¢,O€%à_Ôceháé4°ÇÇX—µr¿ËeÀ…)«UYž + Lˆì(¬o§¡8IC .$\8¤I«‹¡Xz† Nifõ‡Ê½œþ1X‚9/³Y$†rÍ«Ñç/Ô[Àù'‚û©÷ØKU‹3²Ö¥7ýŠÅÞ p:‰w¥CyÖKR~¢vöñA`ÌÖ IY¸ë‘ÂÖ&ÏüGËL£¿ân-Ýñ\)[L<õ[©M¹ÅÓnÓ¶6jᄶ?À"Ëü‡º°,…hœ|³ÄïЉCWÀáÕõ³šª68Ïs<ѪSRçkçnþT¹Á+[ðʚû†û˜~×:^rÞm´Â¬Ÿ“¶- t:…f4ëqߺcÄDP:‰â‰Q•4Eށ¡èÇZDø·÷Ó,Y¸w$dQ¤ÔŸlLÓ+¡ÌnVZV(sM…q€íN+1ßâådÞ-Ñ\ˆ“¥ÕÊô’§ð£Cüpÿ†™³>NŠº‰1³JÛVYyáO·QU‡ö{ÂìéySݔ㫲±y}ÄÓI-ËmWìÉI^qNœ&B^­tŸ¼U`g£ô€û˦‚9pêï•ìšº¨W¨¹lôεªÝ8‡Ò‹ÂÌ_ê¦:ŒÒåñBåEç(OýI¹jtaÖhêÛIg¿§%¯¨ î]ò*›ø „W·›Ò24yqû¥sߖV;#øžœôœ´'ç9™Û)g巀1mtX8/ÓØ·4𔛃ñ.­Î.†LÙË}? q¢ŒìéqÕ!gÀiW¬jÀނEß[èå.õ/ï¦÷ç¯ÀA–!º\–xtRÔnlž_fsÚ,M?¨¤vñ³Z´G$=„¤=äGÕTʾ=NÛkÆ“¾¾ìb +~Éy¹û…Øuó€ùó͂÷ŽdÙA“,cÏßÇý8†÷æv?ŽÝܞã‹û>ïȦ.Zm§$)Œ{O.”Á•ª]@˜zÚO27¯œäÉ9| 1Ìa'm ¢ °ьŸÑ<½{\Öðž¿Ï¡OI©Ô¢#2'›¯g;z×MS{5´ôŒâÆZÝɒŸÿÍ÷ç/ú[®?½ø]øŸsòêß0üSü·>ñ +endstream +endobj +138 0 obj << +/Type /Page +/Contents 140 0 R +/Resources 139 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 147 0 R +>> endobj +141 0 obj << +/D [138 0 R /XYZ 90 757.935 null] +>> endobj +142 0 obj << +/D [138 0 R /XYZ 90 733.028 null] +>> endobj +139 0 obj << +/Font << /F50 143 0 R /F23 144 0 R /F37 145 0 R /F38 146 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +175 0 obj << +/Length 1838 +/Filter /FlateDecode +>> +stream +xÚíYÛrÛ6}×Wð­äLDà=}©­Ê‰RÅV%¹L’ñÐ$qB‘*IÕq¿¾»\P"i9¾4½¤É€ÅeÝsvAiKi/:'ÓÎÑ©ki¸ÂÕ¦ -`šçrÓ\›Îµ·zïülÚ?›NŒ÷ÓWš-˜),˜YvE(ëô§ß:dLãålÇ3=ËÑfëÎÛ÷L›ƒü•ÆL+ðµërÔ–Á5bmÒù¹Ãê;qXk'Â2™ë¨¤ƒ3ý&‹–«Âè +‡éï„é&ãï„p¡ H2N¯dV¤Ô8 —I˜…jsØ ~˜åæ6‰6™á8ºÐÅÍò¨LërÏt…Mʧ«(§Ùót¶]ËDí`.óY]IÕY¬$UFwô0[+•£4¾YÉyµƒat•…ÙÍ~;£ÑðNÕ#™­£<ÒÄèZ‚é¸,—Y˜rŽ ®ãAQ8SF2\G"Ë×çQ^À èÝ’†…Éü(ͨ¾NçÑâ†êŪZ}L\~›ÌeV Qk°/58]4ú¸þâì‚$§™”»Cq3p\:ԏjù°(Ï%ÀüÃh&“\>Ö«ÿbpÎu™å»~n +ꍣ LÐÈ7ԈÃB*ùï(®ÏÜl¯â(_¡­°y¥¦ànÁ\æ­ªýÔÑޖCÊ헵Iº(®Ñ´a¦$§¨&ËÐh%3ð{äë×Q±jœ_9A`úž>H ›ÁŽ¢% +KXx"g¸hŽÆÜÝèÓ,MŠn/EÍê”ØáêSÃcºDÉG£ h0¸Ns=t5©9 gn¯áÕ×(rÓèÚàÇcêÚ¡ª\½R;Tbò5Jž`™Ìâíl~àôQÒ¢KNç¥À"*bòr\Xʸèžl©B͸4s 4VyŠÝ†« Õö,mßÁvÄ18xI•’P.J5–èy àlË(¦[5 ªdòûp±‚Ê í kýë@[Qí¨b­Xg³}±+2‘Y2ý¹0C‰Y Áõ0'a, .ÉâûÈC” `R‹,Øw/YªÈBh-ÚÉ |¢¯‡€Ql)Õ° ¡à–ìP J7¸Œ»è>{OЗ*ž ¼¶ …Ç-¤vìi­ÒP’;p‰Ê¼(-„eE‹r¡6ÇÞ{"àØ'½èŸõÇÇþ¿8zŠƒ^ÿlÒ%„%„íÑAÐDø\u&ÔInÁ*ÝÈJT:$¹Žâ˜jWjô6—‹müL iijü:˜¾<¿˜Ò°ã³7Jjps<ŸM߁(eSøM«©£,939d)ðÑzGD[W8Æd{C‚ £¿î{/A¡"NÃÁôQy:˜žõ'Õ8S嘊nóxl¸LŸzÃcÕ=ºÎ'}“tL¤Ú“â_ûøWQž®Ék±¯l,(wb¸Éduƒ)Â(Î:X›µ‚õ:ÍÕíg»éi8­z¢¬k7¯‚òS.FyTÈç €îËÛAî±NíöÈ-fúÌÒºp…t=užUQlž]__›ÕÅ.}G›M|ÔÐSމ¹mZ¶+p±în5Ë7}·ºC2Šæw²u±Ó +Ï ,å8ˆ9œ1¦¿«d8*¶le)›û&ãAuçæwE€n5µ8¾GÅÒòp˜4ã@>,s‡VÖTgµÕf÷õGgfèBðó‡êµ+c¦óm¬” y~lÛ>',ogKïNÏ5>Dºðíb²ÀjrÃ6K:•Ö¼}º€Åûz ;5¡eA.€;/UÔ¿‡g]àm`ÛM€8 + ½8ÌóÎ5¥CȕíSzÂû îÒ Wíøž«sÿa©T–Q× wŽ0Yn1(|ÂtQæ„Ù­øèØÞWŽ‹ƒHðïABû~ãšB¹ qñ$Q…qôG-QÑg4¦´(Ùwµvá»þ—nÞÏdWKÙµýŒ`_Éه(Yނ´+¾E¼û<Ô»c+Gô³¬ºÈ¿,Ç<ð¥ ÷?àÁÍçP¤ù1„ìr³9tyüƆ{ >Câ÷nß ?™÷-†y_ü…¼ïíò>|w^öR¹Àw‰wŒ‰YZ/‹pyè@?5äBf2¹}!páséKuøAß>6åx»TNVM–Ù u9¹É ¹¾œ¥I^\F`Ñ°H³§Ùñü¿×.-<ÚÖ'-ñÄ£{_x,öÈ4éíÒdËdO²•ðÄÿŠ‹–8ø×þñëúfÀý‡þ÷­þ÷ºfàY¾úßë¦ã4œ-«ñbh‰Æ‹!ôîÓ)4z4¤ö!¶ë@t‘Ëì;üå›Ó„×a²-Å ÿ4>€™œ™‚~ÑB +°ËwÙ»~‡”/‘ûs Û7™¨þÙ0‡Lâ»g@zDž©w\8CííµéFðӟ>¤A± +endstream +endobj +174 0 obj << +/Type /Page +/Contents 175 0 R +/Resources 173 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 147 0 R +/Annots [ 148 0 R 149 0 R 150 0 R 151 0 R 178 0 R 152 0 R 153 0 R 154 0 R 155 0 R 156 0 R 157 0 R 158 0 R 159 0 R 160 0 R 161 0 R 162 0 R 163 0 R 164 0 R 165 0 R 166 0 R 167 0 R 168 0 R 169 0 R 170 0 R 172 0 R ] +>> endobj +148 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [385.063 672.708 490.947 683.612] +/Subtype/Link/A<> +>> endobj +149 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.426 650.855 322.585 659.702] +/Subtype /Link +/A << /S /GoTo /D (GFDL_GFDL) >> +>> endobj +150 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [231.464 619.218 337.877 630.122] +/Subtype/Link/A<> +>> endobj +151 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [440.112 607.263 513.996 618.167] +/Subtype /Link +/A << /S /GoTo /D (GPL_GPL) >> +>> endobj +178 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 597.365 169.87 606.212] +/Subtype /Link +/A << /S /GoTo /D (GPL_GPL) >> +>> endobj +152 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [219.806 513.098 383.194 522.996] +/Subtype/Link/A<> +>> endobj +153 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 445.813 151.499 456.692] +/Subtype /Link +/A << /S /GoTo /D (section.1) >> +>> endobj +154 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 420.129 229.087 429.105] +/Subtype /Link +/A << /S /GoTo /D (section.2) >> +>> endobj +155 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 392.542 252.131 401.518] +/Subtype /Link +/A << /S /GoTo /D (section.3) >> +>> endobj +156 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 364.955 165.446 373.931] +/Subtype /Link +/A << /S /GoTo /D (section.4) >> +>> endobj +157 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 347.35 163.723 356.197] +/Subtype /Link +/A << /S /GoTo /D (subsection.4.1) >> +>> endobj +158 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 319.743 155.484 328.72] +/Subtype /Link +/A << /S /GoTo /D (section.5) >> +>> endobj +159 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 302.139 168.435 310.986] +/Subtype /Link +/A << /S /GoTo /D (subsection.5.1) >> +>> endobj +160 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 274.532 206.393 283.508] +/Subtype /Link +/A << /S /GoTo /D (section.6) >> +>> endobj +161 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 254.87 215.06 265.774] +/Subtype /Link +/A << /S /GoTo /D (subsection.6.1) >> +>> endobj +162 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 237.246 279.109 248.15] +/Subtype /Link +/A << /S /GoTo /D (subsection.6.2) >> +>> endobj +163 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 219.622 199.967 230.526] +/Subtype /Link +/A << /S /GoTo /D (subsection.6.3) >> +>> endobj +164 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 201.997 189.447 212.901] +/Subtype /Link +/A << /S /GoTo /D (subsection.6.4) >> +>> endobj +165 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 184.373 201.063 195.277] +/Subtype /Link +/A << /S /GoTo /D (subsection.6.5) >> +>> endobj +166 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 158.823 196.43 167.799] +/Subtype /Link +/A << /S /GoTo /D (section.7) >> +>> endobj +167 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 139.161 288.404 150.065] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.1) >> +>> endobj +168 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 121.537 386.605 132.441] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.2) >> +>> endobj +169 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 103.913 326.84 114.817] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.3) >> +>> endobj +170 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 86.288 292.519 97.192] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.4) >> +>> endobj +172 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +176 0 obj << +/D [174 0 R /XYZ 90 757.935 null] +>> endobj +180 0 obj << +/D [174 0 R /XYZ 90 466.284 null] +>> endobj +173 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +200 0 obj << +/Length 2713 +/Filter /FlateDecode +>> +stream +xÚÝZYsÛÈ~ׯ`U՚ð8“Tª¼*gK^{W±”¼x·T9$ €–•_Ÿîée›´]k牍ž³¿¾G“åDL~:ùñêäé?"=Iý4RÑäj1IÅ$Ž¤*9¹šOÞxòtªBá½Êò’¨‹S)¼liN¿z1 d⠙Â^<˜'ϯNޞHà‰‰´û…±ëp2[Ÿ¼ù]LæÀ1¾N“ɝµžJÃo1¹<ùç‰à»Ñúzɽæۆbp[)? ‚I¬´/¢nûáéT +¸ëfS\ŸUeÓÖpýöúò¾iÍúz†œë¼5uÖVõu›-I²óX +ÞÌëµY˜Ú”3+mw³É›ijÏ?†B|ñŸ Mû¯c¥‚Ûé`Ä~ˆüNeìG*p€DäHÔ×Bàó ûráÁÈÅû‘; +²TÇß dŸŒã‡àŒ>ÎÎ3“œ?™’]ð :f©?Î1“ƒÍ+ýG ¿?¿LN +ØðpG!¦ÃèÛvËã¼3{§”Pë|þu\4ŒÓ/ Ê^ùÕáF¥>&ÿ‘'ß²÷úpCяuB*ÖߑÓíñðÒB=ˆ/óÒdõõó÷›Ú4M^•GZZø"Ž\Ø#÷êüâú¢®nŠc½ó¬Êôéáõ^TPÑ6¦âT…ޝ©ñã >‹û•™×`Œ_¤eŠôgÇôPn+ñA’~žŒ‰ +¾N2 /ÉA‚©Ó?®Úï>d:„ä3EOõÿU¹Ž›û,$_ƒŠñ¥e*é¥eªS_ Õ=I!{Úy«m(hxtDkŸ,‘ÚkWµTÞÜ̊ œ²_CC¥1s3'zQÕ4mÛäår´T{/OSåýù4 ½†¦ÑH¾£R`ý ¤ÙM]Í ×ºm›ûõMU4OàK ožµŸq¿1Žû'«ó ² _1+çö% mMúiȶ¶Ø–3+†Oh ̬ ³ª(̬µ‚%xCú%a€X™lnj¢BŒf_¾¢Øâؽ¼¡EÏüÕØé'vóÐ.Dê]­òfxÊøÝ­òيoÅãsÓäËÒݵ­è÷­ê[þÊ[^°NŸýryn!™*‘úZA¼¦* +=;ÍRgô3«Ö›¼€ÈDŸ™ý VYCé80?M™áö:ûᇝ=P (õšUµ-xҍ¡ß¼œ[0+žbàòmšç5(¦¸§“+æ¾Ë3"šjmFÊfS®x°ÿNw@÷ÐÂcé:-G›zw*CÏìijÎà øM,¤ó¢ÀSMGÿ‰¥9Fà‡c3øû£î'ÖÃù5–Âm¬¦Ó}×±æ•5u Êª¥™NûÖjp SҌûj[åA rÞa[¢çðÁ!JVö2<ø¨ÙkøI¢1{•x—ßnef·t|»ÊÚþpk¶òüvÙm‘ßÔY–‘¨Î9r¨Š2pæ9±1°ä žÒŽ§xÈpkžÐ3š±Îxw oVò|Àé! J ?èžÝ×Ù-o¾Xú±–nŸ½1õ*Û4c/V^]¹Ënj²P%šÄÒP<#˜„ò•’c˜0˜i™µ ¼:_®Zâm +‚‘ëB¶E™ äX$Ó#a÷¬xKå(ZÈr[›ã:5!—3òyDá Ä}+kyÅ&kWe¶æa›e܂‡¸ïDù)Ä»Eþ~Ÿù¾”‘ƒ»Ú`.@èþ +¸j¹TêÌl“}¨ïÀ×mI%[CŸwj ‘9¯Ìyhh*í­†Èúè"ºÈt6g‚ü…/XõCVí,Ù(Rè¨,î"â;>D/Šü@$Ÿà»àãièæ¡x¸kQÍ2›4µˆÉ€IzæJœÔÅFœÀ!ÅÒ ôژèpŠ +ZÑ:àXhWò™Ûf ˆ²Xóª44l]Å¢!-ôØ,öÛPQÔI5=ß#8L ‚=Vãs>Mz9®ó¯,±ò؆j6äg@V úmݬB Ygô³S(YV³OŒD[Iù’°á5ÍRz ü´‹6½Þ#mâGIWÀãÅr†•™•§«Ì¡LÄë37+‰e³òûMQå¼+ßRô;¸KeEÞæ,àN³Q"rÁˆ>‹Âǽi‰ÈN©‚Ú/Ÿ«/˜ñk•ùf[€FlÚݳcwp-9PM[og-$s. +¶q7ÆmRÕÕv¹²~ˆl¥ [Y{·MM(nîwNìœèQçëw÷¼Ã\‘i>HFøG€3Ù!æ†Ôƒ1ÿ—`ãÖìæ +åÜú1:ÒàŒÊµ=q9‚ÜØ¥•ƒY•¡²Ýœ‹ã{"\š:ýp©$0R§- Ð`1n Ñî©A’З©vNZ°ÎðÀޛh{2!éyx85¶3ÃM&Ìe§hhÓâò‰ª\SëÔ­,vVÕcÔSJŽ½ÈËÇÔcñ%÷*:òž-Z ¯=˙âXçŽû¨Re¨ èzÒ²bceÍufÏ&o͘R¶“<,2­Ã ÕitN ɾGà¬«6·e›ŸIØÍk3{bèìr°”êÍù㧇ãâWëԏB=%ÏJ”ÜÖ8zlšàà]ÿ'\ƒ(è¥Ð®‰Ð@ÛÇ#ÔVÚU6ÃÀŒª,îwvBpÊ95$šŸLê†*vÁï~vébgaŸ]a4sg™þá¥ÞíQ‰öU—QK9<¬iKY·DâÆ0cɑaEÃꜦm¾æ© vyÛ0]ÑQÜ@£uÍꊱøÿ÷óחç¿þrýêً__?=aíþ#`”@Y•|êÿºÿö‹ü4Ö ÿo"XR[¥5>:£ù¯ñ™NCZá—ýŒF_vÑCS~)/!o³%¯ß}öÖ¿š¾•Ä¯²rkKOM9~„<2…/…¯(çYÅ^÷žGÜNõ3½éõr©:„.â®Úvó—§OïîîüYão¡¤ªý¼} +Æýtç…~»0MG}^l]Ù÷Ñ˜ëŒ¢ÚŽžþÈmi” +endstream +endobj +199 0 obj << +/Type /Page +/Contents 200 0 R +/Resources 198 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 147 0 R +/Annots [ 171 0 R 183 0 R 184 0 R 185 0 R 186 0 R 187 0 R 188 0 R 189 0 R 190 0 R 191 0 R 192 0 R 193 0 R 194 0 R 195 0 R 196 0 R 197 0 R ] +>> endobj +171 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 719.912 379.98 730.816] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.5) >> +>> endobj +183 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 702.288 320.214 713.192] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.6) >> +>> endobj +184 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 684.664 285.894 695.567] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.7) >> +>> endobj +185 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 667.039 378.296 677.943] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.8) >> +>> endobj +186 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 649.415 318.531 660.319] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.9) >> +>> endobj +187 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 631.79 284.21 642.694] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.10) >> +>> endobj +188 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 614.166 401.539 625.07] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.11) >> +>> endobj +189 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 596.542 341.774 607.446] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.12) >> +>> endobj +190 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 578.917 307.453 589.821] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.13) >> +>> endobj +191 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 561.293 319.637 572.197] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.14) >> +>> endobj +192 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 543.669 300.838 554.573] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.15) >> +>> endobj +193 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 526.044 440.054 536.948] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.16) >> +>> endobj +194 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 508.42 414.042 519.324] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.17) >> +>> endobj +195 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 490.795 380.289 501.699] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.18) >> +>> endobj +196 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 473.171 290.317 484.075] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.19) >> +>> endobj +197 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +6 0 obj << +/D [199 0 R /XYZ 90 458.567 null] +>> endobj +201 0 obj << +/D [199 0 R /XYZ 90 423.898 null] +>> endobj +198 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F65 179 0 R /F23 144 0 R /F72 202 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +210 0 obj << +/Length 3192 +/Filter /FlateDecode +>> +stream +xڝÙrÜ6ò]_1•Te©Š$ÁûypTŽWŽlkm%©­$墆˜®yLxXž¿ßntƒÇˆRœ< Ð}หíÊ]½<ùþöäâ‡Ð_%" ½pu»Y%î* +¥Pž\Ýf«_ïôÜS®óòÍO<Еn҂&7ý]‘¯i|¯uÕj˜Äqùßo_¼¸=ùãDÂUîJÔ*‘¯Vëòä×ßÝUðW+WøI¼º7»ÊUàùð[¬ÞŸüçĝ’©Ü#2=_¸¡"2on®?üüâÝû«·o>¼¾zóöÝÊü݋Ÿ¯p€+®“VÙÃ-ß¿¸=M|ç9Ÿ¾ßåëmß槞r>Jåh³8n÷z}ŽŒ•çRŠD19Ýdwq •éÿêæ4p3žçÕlÞhs&oóº"‘ƒ;Ý¥4ªúòN7-Mê ýv;Íú¸¹¦ÝÜ *qzîK×¹Ýå|Êþ¦|‹Æ½ŸÓr_èhó††}«Ÿ…ZØ_°µŠD¹Õbð”p“Äðu¨Bם«çù«·ïüÝwôëÒÏ7ß,ìFeø_ôZ'"°êÿš–tӀHÍð+# }"9ðM"¤Ý·©‹¢¾Ï«-MQ8øÛè?ú¼ÑÙWÓ˾LW0 GF‰ÜGBÅí»¬Ë}^èó./Q²nè¬wzýîBƒÐw5jü^¶2؃ IOp¨ª;;hÊ´0æäFŽ®ê~»cLû´éòu_¤ -Ã銶-Ã\WˆúSÞÔU©«ŽïwºaÒºqHGNvX´í*-Ï‡Ê)ò +ÙAS¾ó®¯,¯°fy%_Y:|§ °×Íøуô[ê´ji‡1C‘u`ÓWë4ْèA÷£è}‹8R ‰û}ñÕþÜ¤+E(‡#g HÏÏÊM˜ÿp¹ñ῅<€Q¸Dp£9, •‰PÊў{j1L<ÄïI{ÁÒ&šld!£x.‡e]ÉHHwÆÖ]ZAž]àJ%"ŠÔ”«(™qùNJ?7RŸvfsL‘weYŽ‚fGš€ ¿¹ÊÝ×F½ éj€I×1hÙ„Bã¼B·N;’ 6ä «ó(q,ò¤Í\E~פÍaÈ6 ڙÂO$B£ïs”¾¯b$xÛ¤e‹³Î^qÁ ÅÁ‘Íâ¶KZ1L6‰ ²o;ڃQ`÷y·#؀Óä ¶‡ûˆö\·Ï–“¯„Œ—…½¨Þõ’f%ÔAƒÿ¡ðÐýäcq(TäÏӌ)TÔbØñDâ«99 Äø±€ô1žé¬n½GùýÉ=ÛrÿùóÛ®ÑŒí—¯o¦·\~û- øøcñOJ ÀUs +ãT=qÿhš–ëÁ„âœõ[°|?’NY‹Š\ç§*ÿ|^ä‘vM‹í¡ítÙ +Á¼0éâVú•NVWš ˜‚þ +&·éY΋Çì+€„øO¥¤P±?C´€ÆKÀã?CŒhSü1=Fä²@¨PÎP.i҇ÚkØÕÕ$6ô\ÒU’?öçºZSÖ +WTRLªHc³U8Q…9lÑ\`ÿ€ÑӝÔÔ§nÞ®×T†–Žr¢&€Uï8±Có8ùóúô + ,/dãó ¦eµ‰ýž-:1Ì¡êæ£ñ5éä ¶uš9žv4:Ô}CËV¬£ i‹½‰ñ‡àp®We”§ 2M† Jp[©ÂJÎ'IÆЁu­)V<çùöT9³Ï[2âàºî‹Œ†¦5¿ë´oylÐS—Œ­¡æhR”AÛ.5E@ÄÙcœ€‰1„).>£ù⼛&ã˜Rv b©Îa_•¥ o,êµI¦Èb8WÕxë”I6œ"í¨˜1%wË¥8 ûÜP £JÛÊÛ0ÞîêítÆ·oò´c@½§ÂÌlÃHÙ·½iHÀ[]è52¸Pj¨«¼-Ñܔ’ÐßUm_t´™l÷‡\ÍêumW:¢Cã¢5(Çó¢=•ŽÁë9ojèåô² Wƒ4LJJ|nùb¬~ï°ïó¢£uª‹(ÑCÌǕýxrœ3ÝØ<©°N®ó»®®‹Y;âzF%R\"L··ƒ ùÚVƒ°@} Ø{‹:gBÙ?a‰S¼å´¦õ6ßV9F @љ.ÛBl¾9ŒB¡²[yÐüÌeǽ*¥ñýœÃDÐy¯5™Ýiî?Ò‚ŒÞÌéÍ`QÐ(ÕÆ8ýh™Ãm}•éÆÞQõŸ¹”H#…@§„¢0!æ¦ FTb/ØÄ¼à†¶Ì¾ñ덃„=(Hlõ<­¾)غv^­‹žã2€ZÁúŒ'Æû֏TÍæe€_(PÔi¦³£ØÏa9¯–"ëð‹¬5áh¬7–!̀×6ãäßo¹}û”KȽÊKÆ֗Œ(€Ê4 æÝǐåý$šfù– ƹ“x”=M%¿Fö`š Ø6öº>iÁ2‚˜Úozâ’æ³RK'? (‰‹iÃ÷4z£›Æâ"2l{€,o{¾¬›¥ .cúCé—i(p/°)öm]\,=)@m=ÊÕäºÐ>W …˜iž ÁÊrlW)xÙ|}ôUGË܍·üvKwEޔ8ŠhìŸ^çŸ)AöäÛ¡ Ú88£N!ÅÉÇ+: @Á¸sÛ 2Ò²ªîoØ܊PÅÇÙ¥°/yæ½á¾É!#W41Ð„ +š_1¼n2»ßø)Êóf×gîì”ñJ쀛û•­V¾Ð«¼È3O,Ǘ×7?>å;^(fÍpö‹‡¾h¤l¨c'µ"!‚‰¨0˜ ñǼC<£Âº{ðr ŽÄaÅðhÞÎÓIEžr>¾˜Ó_ß¼§ÅMÁ†îc<ñƒÐãJÙO¤á#ˆtÝ¿òä±â;ñ9Îý|*¥à¨ÏÕKè÷U_ñãˆçºÑÒSÈe½GC=4ùv×ÑVTÁ%›³=iF?4š±½¯7IQ&N˜5Ô K¥ö=H¡q®ÅÛ Ö jˆ »®Û?»¸Ø´Q7ۋ§ÌçÜ%ÆØ^°•Lì%Š«›ŸKô¨ŒÀT`¿A’ M\†¨yPaLŒúx-i;¦Ô«&ß"❽±¾k!B®Î0éG\kuLT‡[J˜ w)‰ix–ÞÐkÖWj_“t61D³s0Ä@H۲ݘ†D§å]ñ˜¡'´ûÖ¾®ý•¯wÓ/Dì'`:g¶ù%9zÓY›ÜØþ·}`cCËlß aRvô)ËÖNíüíOM +}{kK3ºô₣#ÂßûƇËЃe&–,´2\Î'ìÑLcñ©ù<5Lð›Ú÷³͊n<„»a¤˜Õåü¸)¢–lƒ•lPšÆüúN„ÁÓùþÀ›!A6iky½áµZ±êq0¨&ƒêa<ªÞ~t Uo’Ý ~·}Ú@õ­y3s –ÃÅZ? sËFCâ0žpˆ@“Á`0yUo bŒ¶§4å°þ›ç…y9ê¯êé&öÂ?Ֆ\=ÀdC¡7έ׌)á]–œ¼ãcø*R¤ïür»øx±GÃò +¼”".Žæ׬G\ßW\ÊxDa”gVy8±ÊÃñ <œPK i–_dz\ü5Ý©Œg,ÿߔ=#$\2͚^ŒWüÁf’q¡y|ÚÚ§Í˅NÇl=dòÑQ=pš°ÓÙ¸Ów»ÚÈóÿ!Sʞ#ýlÔç´±]N*€3»¡³ltüÿ„0‰Œ¿ôï öo ¡H"¨‹éo +?ÑÓxåC—nJI(7pê97uqØé¬Iiõz|aöÍW5Ør žÑ§[>5ÿ^ ŸÚÉ»$xV½qoŸ¾ÜÌ?NºWxôx Ù+0ï“ ~äË K{Gùýþþ^¬[ÑWù¾y‡­ÀB®‘H(°T2´ÜHcÔ6Þ> endobj +203 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [197.068 422.575 240.904 433.479] +/Subtype/Link/A<> +>> endobj +204 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [103.669 387.332 231.19 397.613] +/Subtype/Link/A<> +>> endobj +205 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [361.468 345.175 387.371 356.079] +/Subtype/Link/A<> +>> endobj +206 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [297.062 248.367 388.718 259.27] +/Subtype/Link/A<> +>> endobj +207 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +211 0 obj << +/D [209 0 R /XYZ 90 757.935 null] +>> endobj +10 0 obj << +/D [209 0 R /XYZ 90 318.525 null] +>> endobj +212 0 obj << +/D [209 0 R /XYZ 90 286.596 null] +>> endobj +182 0 obj << +/D [209 0 R /XYZ 90 286.596 null] +>> endobj +213 0 obj << +/D [209 0 R /XYZ 90 180.885 null] +>> endobj +208 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F65 179 0 R /F72 202 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +217 0 obj << +/Length 3230 +/Filter /FlateDecode +>> +stream +xڍZIsã6¾ûWè6T•­æ&‰Ì-“NRétz¦ššJr€IJB™".Ñx~ý|oIÑt*xÞ¾@öWǕ¿úþîïwï¾ÛE«t“îÂÝêñ°JýÕ~l¶a°zÌW¿xáú!ÜúÞ÷Ÿ~ÖAQ)eò¹*m&ã6+ª¶À$Iâċֿ=þp÷íãÝïw®òW£Þî7ûh»ÊÎw¿üæ¯rÀXù›(MVWÞu^Åa„o¹úr÷Ï;Jæ֟‘F·2ÿ}**\½ßzW"a{í¥0Ϫ:4E!¶>t×uà{¦)î‰ä`8ˆìiŠCÑ4¶:Ê´«G$y}ÖSUÝÉò¥ÿ›õC”DÞO}#ÀQX˜ ÂV++t%¤V‚`“n•§¼hí±*rlŠc¹ß3¸áDd Fz&—ÖO¦“ÑKÝËàdÖ¡ïý±¶n{·¼Óú!ðô2s{CnÛ®±Ot¶ïtcV_,“«8ãAœMÅ)_ý­o*%=;™f$ÞQ©8ԍ£¹8/qnYar‚ÁÕ¶'  Hêûãuº£)²Â®ÃíÈ.€mÝ7™Ž³:×ßNSÉàX(6뾯îgæªaÓ±_¢c@ +¦«£Þ>A7‚bг#Á« õŒåŽ1Ë_¦’¾•|«‚ø¾ÊD•BG›úؘs{/SÑJ4FB4ÏU=A1€… òÚ-aÝ žÑnâ÷›]¨Ä?®KÛb"¢+²N&@ÜȨ±ÇS'”©ÇXlë[µD>]Œ*­K *šVƇ†£þ]/â¯[çÛx$Ú]«h”Ó>/œQà^MQåÅ¢’X«Q°S´pþ­Ÿx ®€…S\‰¢PpÒ®[o$HV4!-2’¢½ÔUkŸli;ö5‚’%ÒwÀ2wNÆ£ÎIãZ ÄÍB]EÌúùç:·‡gs_Ñ^L¶5ZUuûjõj“e&V,j¼5 X.þŽdÄúIÈ +“ÿšó¥dòýT¼+¢­tÿ:`aqXó•Ø×öÙI Fê"÷ÂÚõTM²xgÝy%EâÎ G’’’xç¾ídt1m+»ëJ Ò[VÂc"½"³ »bMœ÷©×š³îRY¶W_NœÓ4 „9å¤4õþ³À"oÂn%Û'épØû:p“9§ (²Þm=Î}0±ºæÑ~!øRhä‰"P˜ +`7,bˆÖz­7¢–¯]àâ’ROGNÓÀÅéäU *šsë. “bÅRðÚmԘխ,ôý$.•õEâåWMÂ[à âÁNK(@¾ÿüQcpÄDƒ#FC”Âøj»“âa'®WÛ—–<Òßsª (9Ê>˜ŠŒátè…1ÊI6Ƒ¬y)´` C⠋B½H28ÍL;È í¼$Ää(¢±v²¿de× ]ËJÈólÛÖÖÕmtqì8¤Ì4w}Étïj¥ê6†-¦«1ÚÄ»Q[¹Óp ÃüYÉ£µ½J›Lߝjïœ:Aö½ìU/ß{YY˜¦|¨D¶K‰кÛM7Ð!¥ÔÞ³ºX©îUY ÊE¤õÔމž@T,(sªí …¥Ý„€Ÿj¶7„4°p†±0L§F†}ŠJ;ˆÝÀ± €°ëS,ú½· ‡aV‘V~õý°P´âH i\÷>ºÓ4r‡#@×¥ºÊï—yœ:§†’žÊÂE„«-Õ椐ÇàÉYQ71,õôuUÔ}[¾ÜZ¦Êå6ùêÅâ€@¦|.ƕ/5Çù4rög¥úKC­yeh 0c +°ìꁲòô\íts„ʱí sŽ ’Ô"¯é+ÜhfÚÁI¨‘j[fu­\aó⍄wv5i ±õÇÓ´^ˆIéU`lY‡þ¦y£mk͏jö©ç"Ï¡¯r¤ÌŠ¸tÞ_eõù‚¤õ;åKlMÇdìy®CñiD­…Ô5øHM[)4¾C;aa0óAŠáÃÚ BûTf2ÁH`•L¤ñŠ\ƒ‘mõte½¤¢Hºƒéµ¸ÍÜâsyŸ!Õ,hIb +ZU[å¹óޔ\wDC3Œ›ï%¹_O–‰¢º öŸÙ¶`|ՐF;:Ù!;ÑÓÖRŽaEözé ´ÄÝtpSPóM…žu·ûxêûX‚ágs&1hy8X®SUcB‚:¡âífû. Ôfjµ…QçêVaNÂ)?èMNÉ4afëN¶ý|´ê¬Z0VE£©T΋õ™r É)R9…T+HøéIÃä/eÖ­&¡®-;—BB®Nhí«’šr¤w +Üê¾CßÉ»ÄP$ Ñ#”E°(Èû^@F·P+=.EúÆ1ÿJ§Á^ºœúmÅâ•z"JBoR×5T´Ýº&A&$úv'ÈR#c£yVW¬®’í¼'=|c‹ØÑ/¦ŠÅl_*>NG4}®<%¼zZ‰Xl(o‘¹H4‘?©c¤R=sM l4àèAnýݜf_ŠFúå=ëáÒ7—Ú£°ŠِÝEðH͙²ÈÝ­¿wC IËL[­G®ºDÏ<ºi‘5õxü©m.GµÏMé½/³TA4§°ÛȂÞè(<€ÍåRÚÂa©(SyD!À¨üêOцcÛD»¬^PhIŒ¨0‘úˀêÒØ¢3 =ª% Ì.<~Hq}?3z W”½ZzlçÕÏÀ¶fÑW¥, Ÿ÷ñüèq{Ï ©—ªÓò Ðx„SÀ«Nlè)à7¹í46»ÂÝÕúȼK¥þÐ ˜\Ւ™qñPÞéüÜ-bé!”Gñ&HöJù·ÿúñ‹þúÓ{|óÓ§÷?üôéˀ`|ˆÆù0ÞDq*ç}-IÞDK%¬éÅ7سs¿†aô8oœŒ>E3{k¹ÍcD·ao´¿úv¿X’eßLûH¡*Ú¡´,©ÔŽv( C$àMÏùPÚÁO°­4DóUwªc"øâ‹laOH’ƒžQ‚èQøJ/ܧúúŸ‚¿Ü\:E)­[ 1]’Nǽ࿺— ž‘(iZړ¸dh,ošä=fÁ(Ǘ{iÎÕ Â„ÊJyHs6ÈB‚c¦4¡Ç ùê»)—H˜NßN ø8 5Jóó]ۗ݀iÂb¢Ï„RbÓJäý9õ Í"–&QIu&´½ùòImµiŠÕP&·OÌÇ,-ÒýOfH^ÍÓ෈{Ñð¾‘fRù ++½;<ñµ:ºÆª¢¦w÷Սt(èNSèŸòvÃ× ¯bùÓ_¢HX¡ªÃ°ÛušO¢Pêœhz%Í\¥ñ!P®_ pü£åæ™örñIÁAá +-Ö½Âol:ÕRjúM»å‡ºÚ"èP=½`9òFŒ O!]“ÔXH0V.-Ü.[È ­}±Mã--r˜§fO¦Ò¬åº,¾E}ªì9›K֋#ñÅz—Ït—»B +æ79‹}·Ti'¢/êµ® YŸœyö­ïçQéŠh›­²²Ï¹×ˆÒYyí–Ê+:Eo¾ªê(¨›è7™^ò+íÒ¯I.V±ÅKmi†™®žWœ\£ÌÀt¿{¶òXÆÅb_øá‡Òэ+Å'?V÷øW”埦 ~]çpP­ãᩁA=ÉÍøӘI@çIþ~, N•Œ€¥×âþÿVSþ~h”ý$Åä*":…üd¼SJ'~䫪ü…ŸfhQ~cއÿ±˜ÿ«Æ.Ù¤AòWÿSÃý‡Æn“î£DÿCc›n¶ÛxÚD‘÷™è0͙¢^zŸëòåT䍑Տö©¡‰'ßȖhæzsÔó*¸Ž¾*èg4ø[S-~4UÏe.ÖȀo+eýMàoø§ ®®b–ßïÄÜóʍþAÿ ³ðÆÉƱÂlºîòÕ»w×ëu“µ›¾²—fc»w*ïn¤;Němš:,ÒõDôôÊÏ&àA«nÎl¯ôô5è±> +endstream +endobj +216 0 obj << +/Type /Page +/Contents 217 0 R +/Resources 215 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 147 0 R +/Annots [ 214 0 R ] +>> endobj +214 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +218 0 obj << +/D [216 0 R /XYZ 90 757.935 null] +>> endobj +219 0 obj << +/D [216 0 R /XYZ 90 331.491 null] +>> endobj +220 0 obj << +/D [216 0 R /XYZ 90 307.166 null] +>> endobj +215 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +224 0 obj << +/Length 3354 +/Filter /FlateDecode +>> +stream +xڍ˶۶q¿B»JçØ2Ið!v—ø4iR'MEO’DBb>‚ôúõøº´Û À`f0/(Ø]wÁîÛ§¯?<½ù&U»ü˜§QºûpÙåÁ.KÃc…»åî—}tx%ÁþÛ–†iL§+îü4œ+[pû-Lã tN§ø´¿}øþéožþx +a«`ÒÒIvÌT²+ê§_~ v%À¿ßG•ŸvτUïâHÁ·Ú½ú×S0'3 VdFê¤ “ùƒé Óa›,zÛ6 x¶ý[š?ƒ3·ú[××åhÑÖ÷¡÷éŸa°o»¯ÖË5­¬ÒéÆ]üŒö²ZîŽó‡4ÙË +Öùù½Çiq°ÿt“½ÁŸ‡m®Gd œþu˜Ó(æc~…g +’鐇(ñóh@ÎæQ.¸·.d°´î^én¤û_£HNÁþ«û½kïÕ½ ½#®‡dOrȏmÒu0#f@ßÊ÷&shʟ½iz? ¥e{ÞÎ6E5”Æ1TógqòÆâtêð˜'"\ݔȨx„Ö¶¬êµÿd=W†G/F÷«òø× Bø ¹;c é†¡zÁx¹uözë·!.O“¢å£iùÞT•“æMhñ +3U'T$\)Öü¢vá—ÔOw cýƒ! TÐGnÓ#h)÷(Iaî½ ¶«)s™ñ€î_ìia3#$iO#ð +ç~²¥)ñèÀ•Ì¨Øø‰µ~,Nò©_꽗1.šŠØؔÌÇ0¬PÌÎ+/N‘Ê­Å›ñ,Ø­×3B_Ðhº äÛ $À±×{á0áiÿÝÅÓ â]ß4Ý;〯Ž15+ë6…ï-Æd—ÀÕp±­·,w4jN¬ˆ +o¸ÜÂâÔ¦^- ãµûӛÚÛJoÅx‰²Šéõ«è`nDqZy8•ŠŽa.¦*$vû÷íЀm…lñ¶-L_Xt˜ÅG%<ù@EY)KÒ/`ºØ!è]ˆ7³8 +ç +Àڀaæfï×ɀ©îL9.Ps‹¤0Ç\®5îTë`y»º-í¯Aš$# ´üµ=r éÿ<ÿnŠMéÏDlg’QxÍx%Ð4¯G6@_è~éo<ÕÛîp²œz߃‚é®dÈwsj²ÓH `¡„ïZÙ$¦ZÆ¢!ã¹v5脻GܲäWæD`´!ÑÀç‡,ÀŸÎíµ±ÿ1å4÷õCqAÜ[%ûs[ŽŽWð"¹¡Nƺ¯¼ ƒF¡´ˆ¥*^žU–twSÌ‰°b(vi0é®;pC¥ —ïÚéºf¥@¥›ë ¯ÆÕž(l +{=ƒ}­[gSQŠØë–†fi¦h jï¦sK•°qºöZn»§i©5‹»˜ŸXoŽÍôßÙs§;;"ÖÁ—¤_ö1DR1ôš}5Àg— z€Á¯C<À2¯þ`|šë+6%­hÌÒßÚ\’Œ"~eðÖVF–‘cãÀMjòÝ<&Gœ|àRb/'Þ!”½(¸‰¨Ïä[©XÛ r×ÅG}%ÎcWóèúwrày áf‹¶ˆ‹Ãp>Dà z|¾Y4ò´¯PCA#PÏä÷÷;®¿q¦ùnQ棘,$Nœ%ŠÉÀ¹˜ŽõÈñpÛPĕq_ӈ0at ‹“‰-ʼ?Éö8Cg€{“xV`sI\º÷p¿¥­ï•©ÙÁzë€3³vJ—f A™\WÞ"ŒT @ãZ²£»cåò /˜¶•†‰6æàîS"\OÖ 7ÀÐ܏”ÔGzNv x¿þ·èð²¡&GŠ•18‰‡Æ„T½Äu‚6®VƒWKp4jQBh‡Ñ +™e^D¶â.êÆGd¢éSɲ϶)}Œ…HŽì F¬V*#ÝòhÛ°nQû² ŠÛ=M¶à>2»\¿¶3"Ì^.æBTç5üõrŽNÓ›V)Z˜X¾8ØRŠU1bk#È [Š1Æ Zþ‚Í/‡ÂL»nÈs•Vú O‹mn9`p°œ'·ŒùéäzÉFjæmÆlÍGo[…»÷”S¼6ÆÐÿÆ~>3©\¼h>‘ m!—çÖÜò‘ø_]U ë=%ãýXLnŒ)ÙÉæ|8ø^©úЃ%ß2Ø ÄUE†4!¯Ý:ǔ¹¯ÌæÑʁâ03•ùšKCzžÄ— ¡°`Ã*Ÿsí.ÇPŠXÅa +¯º( +± ¶P׋òQmr5ãTùWùB¢B¡ø—`®³–†Çm/¡åZÇ„žëm?ô\) +9^7hUKÄ(ÜC¸—yÕ¸Hñ±aS^™òê—qBk¼GHø…¿ìà­``rþ™(keÛÑA‰jãӏmV`^i3@Ώå+×øZ‚%%Ä}ÆòÛ¦ü÷!D hU2z! êz­ÙO£Ÿ„’£ïð$á5`â;¦Ç)6秗F4ÏaÇ8ÞIÐU`PÙ2@üÌië9‚k‡H†:í kÌï+Ît²TÕ²S¢òÓÓYnJ¥þ„;$ƒgËÝ\V­--­$.Uþ 7y¤§9ëY§ÒÍ熯ù£Ò ËCBŠã…9iR©1Â(¯’–å7.•£ ï½qÄÎ~:"ËW󈗱ô¦":>ÌÔ1I×ïfwüutÚ"'J(Î8oàäÛk)Xâ€Ëá*MçØV>”Ÿ/9'EÙ{뾘¿S²ÇëËGÞáƊ)@È A[‚çØ[՘]–ã&]f³™ìB±óÕöÓ1£pžã‹>ÚPÍf°£Äý¥0M¡OáØ8ª«BDJóù+>ÍMW’îi Kâl†QB<ïÿhg,ęg“Lõãp³Q3ȚÝìÙöN©4´ÄUÆ3îÅÙìI(FsuçÄuÿ2£mó‘i&+o¼gzŽ`èõÑ#bÅ+t¦â×­›½¯ÿÛmûo?£• ÏHt1ãi ãýPï ÛCï;üêɋH”p¸Òó ¢„ìQõx±°Ôù’e\+1ŒM%9y(ðЈPñnÅuãßOÖÿbIOÇ<<ý¿bñ^Iy¦Nòç•$?&ɲ"!òCw5EŠ¶ÕãfÊNó(WWÜyË(ïä݆ër7€~†”h*×Dût3ÄÿsA Žap¤ÿ3HlòÞasàãηþÿJfç­<ŒÐ±n}ÿë›7ÏÏÏÇÂ!o½wGÛ¿¹ß«7 †ñ1És¿Š”±œFA±BÛ‡É )åq-§ÿ‹KP +endstream +endobj +223 0 obj << +/Type /Page +/Contents 224 0 R +/Resources 222 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 147 0 R +/Annots [ 221 0 R ] +>> endobj +221 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +225 0 obj << +/D [223 0 R /XYZ 90 757.935 null] +>> endobj +226 0 obj << +/D [223 0 R /XYZ 90 618.581 null] +>> endobj +227 0 obj << +/D [223 0 R /XYZ 90 270.678 null] +>> endobj +222 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +231 0 obj << +/Length 2842 +/Filter /FlateDecode +>> +stream +xڕْ·ñ}¿‚o&«vGsö“¢Ä.9²²±Öv¥$?€3 ‰Ò40#†Ÿntcî¬JyáF£/ôú›ãÆßüt÷·§»W?¦Ñ¦ðŠ4L7O‡Máo²4ð’0Øï+y»âÝCÛÊR#ôu—&[¥ºÑ˜¿yˆB/(bâ$òvPzÔ» ßv=æ˜ûÍHm¾c}É£Sã¯êxêùài[C³×m¯Þ( +‡æ‹e±¸'.»Ìwl-4l…±Å±õ¾¶’b[v» Ù~Á©eEÀ Òíôgš™茆{IßJÊÆ!Ÿ…îq\"ZúÊ*ú€ã€¡%Péíêî¨JÁ´)Ì y}h+©Gj°ïʓó2`“Rº½¯^'ò"ê Põ÷tjy[;ã 2 ƀ0loŒªà¶¬ä$Л€„ÈlΪºÁÔH2ä+…kçtwÖJô’ÖÀ°¸2'šXëÃ)ʓ£Fو÷·ÏèІ›¤…8PAÀÀb( +¶TõÈ3-Á­ëƒJ‚8á݆&¦”opB"ÓH1špB$Žg‘Âl 4ʘe@BgJ¢ªl\‚!ZÇ‚Ê²Ó £°gyråN2Ƅ2âúb \ºRë2?à¦b¦\`ÕØ1)“2.æ´ÄÞȶ”ËÕIv˜PöÓZ´ý•O%%ÁÚq©ù±à¼ +nEÛóÉÂñî\bÉcEô)kØ*¹s·Hâ’Öùt͖õAòì‚ÃatÁåò$lÕz”´0Ý$˜€ƒ– ·3@/x¶t µÔ9=RœÞJfîü•¸eûýü¶Íљ]«,›•™3œÏîç,.µ¦P¸yý¼µ8¸ÊLð\ÊoˆÅÉ×cñ/œmñ󘂰;ËXm°äýÿâ3tm¤¬Æg€£(q6Ë¿Ü cف¡•¾ä:0`×¹çe}³¼Ìö†W;:Z %cڎ ¾m›£—ÏP3V¬Vin +á1cøcƘ*­ù=àp´Ø<·x|?ÖèSr`‚;JÎ@xåLç2µœšÕ%y8ڌ¬µ•²ZúÞöÖ®9Þ©G9˜5ó’<#)?…a²Äúø€cˆO~½''Õ̘ÈÌ`˜™|ý: +Ô¨–Š]j®)ìY ¸ð‚œÍÇr’õù:€#ÝHD¸†Š&CÌL·‚Ôæ-EC ƒƒ»ˆô’ì{’=Ês’=ʝ/€Iv±ì8œÉŽÓ)äÃö)ÿå¹Ë9ùªý2JBw¡®µ[%Ÿ%ÊÜ债¨‰~œ{qZ,}yr ÐM¸á辝\à„—8ŠA¶{(°úkPú{«aÀ Æäþ°pƒÒU»=!&˜½Ä0kDc&]©Ï]^]¸?+öÆ7¶~pjøƒ—ììY1sùè㯧W«±¹+l½­8k‚Â<£BP}.§®–¼äTžO½Y1s]äøÄѵr¤Be×HÞzaà¹3/y€‘Ɛæsîoà+1N–öáê!ö#gõ|Þ3Â䢬âIZBˆäª›8ƒ¢cr™`÷Ø2!÷g©w¸œO®“Œq*òÚõÆÛY" +RX’¹œ’¾ F!r\Ë–J +^2çU\KClÍ舜zlÌtUƒ:—ÔOôÒ0åú «¥#W~GYa憒š• NÉ+RΫ;ÄN3*R8 €Ôâβ)gD@™Ü5u‚Ãê,€Ø^JøNfI‡†a‹ÑªÐRîw!仞·÷„Vu_ýHÙÖŽkUQ¨üö®Ž¾WdV‡›Ôpxòԁa:Û¸&Èæ€E›6¦¯E…ôëQ¡â¨Û·ÈPè*‰p¡IX>ÙËæö1C‹›gMÄÀǀÊÁª*6ŠÆnÍeÜR)s®m™à×Ëv ÂÅò™PÞS(´íZêÜQNŒh´ÉýKñA¨šäžd,åaⳀ]p\År´lžƒýUGë!8…ÃÉB8D_ +‡(,>0… ?§ |´ÃŠµÒ¹ÁøÆïïǚ‰+¼ªsµ.Xù~¶,•^c¹ˆýtsV5?:!ÀF€8¤’7xþB†Ày<†DÜË×-Ffb-ïT,Î~l.‘²¾GéTÉÔ(ÐÄ ûdÛÔ¬øœVôøš¾¢°ñ©Òð38חØm’_Øêòö0.€™ëß±b$Þl»ª™ù@Œÿ04{¨—*õåü— +®S´@ˆõ¾˜¢|D SÃ+´P»Røì +ýµàÂåGÇU+G}¾`¤éê¡áZÆZwZ6}§ÅÑ­i‚7÷Zqtë›ñ(òCzՅ-%$Wz‰vª|Äñ8K0½ÄŠ†v¨Ã¢º +o«¹– bÞZ©œ´4CÍ¥7–¬7/=X>RÏÙq°ö¤N-ç”_~‘µ £‹²¤D˜sˆxËȄU­‚,‡[8/°ïo¥"dFl&×øNGœhî%—CÌÚÌꛚJöòpËP J¦'aC(6õXöÉöm[ÖeS\£—‘žMVnöœœ;w0…[³Ò*¥L\瀈~1^åZ?˜Õ^Ü­>·Ù‹ÂYwӅºà‚ ™g#Ó7<.Sæí?³iîAþ­̺?dS¯È õ¤?d“ÂKþ׈šKHÈÐ Þ³(Ü>võõ$+-hõÚka›L˜¼!”w¢=tøvž€„ÿ¢Žž~­õ\ƒÜî³%¹z ï¾bÚÇ +͏·¤de>oÜèŸøx2“+ŒsÏaŊuêûó÷¯^].¯4ÞЪ³öTÿ +Œõj¡ÝåAì%Eá¨ÐÃ0ÖP¡mÿ.Áàg/É3;ýˍw +endstream +endobj +230 0 obj << +/Type /Page +/Contents 231 0 R +/Resources 229 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 236 0 R +/Annots [ 228 0 R ] +>> endobj +228 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +232 0 obj << +/D [230 0 R /XYZ 90 757.935 null] +>> endobj +233 0 obj << +/D [230 0 R /XYZ 90 682.124 null] +>> endobj +234 0 obj << +/D [230 0 R /XYZ 90 536.224 null] +>> endobj +235 0 obj << +/D [230 0 R /XYZ 90 402.28 null] +>> endobj +229 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +240 0 obj << +/Length 3363 +/Filter /FlateDecode +>> +stream +xÚ¥ËnäÆñ®¯˜[(@âòýð-1²†ÇP²ò!°}è!{4Œ9ä˜MFž|}êÕd“¢ÖF ,všÕÕÅêzWQÁá徺ûËó݇Y|(ý2‹²ÃóéP‡< ý4 +Ïõá/ºŒÒÀûê»ïe¡;=¨–ž¦cÛT¼þ¶©tg4<ERxÙýOÏßÜýõù^B"æ~§‡êr÷ÃOÁ¡ø7‡ÀËâðJX—CÅðÛ>Ýýã.ø,›QìYÊlfþýcޗ}wŸÞîa­oM÷ÂÌ}×wŸúi¸ ¯Ò ûx¥^?\Œ¬~ø˜ýàð%~œ”Lþ_÷!ì'8‡ÞEÝpx¼-.ñm©§ñ?+Æ«z„ñî k¾"kýð3?5ŸèÿÖÕhÕšW'`WSWëQdz쎘çeâ=Dš¾hÂ?ª“W§ø›xׁkjËÔxVòò\āC¿LE¾ª5=H8à;³„—;#œØÂÅEU÷¡wn:ý8hU«c+_öà͵ïjÒ ‚P'•lËW´ì˒®È{á•XÜj>"I"´ïäìr@ƒYî܉4¡næ 2Ukk‡0ó“¸ýç~ZäŒúc¥k¬S ­~ ÒùKËsl¡ÌD]€0«Ö¢bX5òä` Зc_7¤8-Û™<_Ï÷@Ù4•·úz²”¡ éªvb!#èÍіáucÆ¡9ÞG {´’Qá'Y¹–ÓE×ÍtÁ›¢ý$`PUÕ_®ªc.ãÂ;’Ý—Ö4Ë­ªǪ· ‚èWT̀¾c$ŏõ4°ÙàÚo@b~x³šÌØ_Ԁ—xÜSrÓÞØÝ'C/ƒÕ‰D ӟF6‚AbBӁÅUgÕ½h­ïG+ˆ">gGkÑ;VZ«ˆ«ˆf«­Ú#±ŠheѲ­øy£ÚÐ5‰è­Iȹp{.ú?M¢(7&QDlEHo‚ÇסGÝ1 <Bï ¼DƒJ”€TÛԌÂ:‚ƒ—ÐjeFçAk†Þ´Œ vrtE)²”€Al{’‚y'æ-l>Faæ™+› ,a5^ö²Ë†8ãN×k?Œüp²8eC×eáájoQ Qì=Ã^|·˜ ATGæCá Ÿ_ςzíÑøϾDIJv.fLééÐv+4“P,¶Ä«þŠrcÎ3¿ßÑùêH­çOnœ¶8:Ä)ÑANQ¥×ËÚ:½îܔ¬0*$iàjIQq܉8îÀÏwàaíQ¾ÄØ´q‡Ã $¼ÀŠï ‹Í £Â /ÂÀŒ,\àou‰5]϶z鉹êfûo„kúNîP`D1ãìsqnE¬#HXh°‰pcìñmôš‘,=CÚ'¶N‹¦‰)¡kVèž~ÈÜÓÀµ²ÔV8雊A³ua ú ¯ÿtztÊ+Œðzû¼Qí{ϊjÂχûôóá¾²á>'Ü£âkv覞8Öæx熜¶¿˜¤…ÜI ŜrïܕWÊnÍrÃC'†ÎT–¨Ë»s8C¤žÁN1¸â¡@é/iu' ¬TSXÕ`!åÚ3QŽ®Fß©qџ­,ÀØÐãÞ+yPŽÕ›&(²ª”Âîýôr~Y¤Aì[ŒvŒó4 œ›cH~nœzLóØiHq»Ó$l\õ#/¦ +~¨6-øŒ—'²søˆcq|o5'©ãZq…K¶ßXòú^ 5»NF–å³.¿ÆH•ÚX{V,°äœ¯rB¶`.óÙ3Ž%)·I°±I™›¬G Í7y&sòLNýþ^qaÚFRÚ$T7ÖÙð`g›†ÐzH»ì$¡B0çd{ÅpÈÉ6f`ñy“”C;6©IÑiøi× ’¥ ›3ê‰Ì·jÚf„|ô°W|¬!4“Ä'.. +Š…ށO”é/k°>;ŒÀçŽ"ϯ#>±û…¶;ƅU+Q!µâÊ(æׯà ¶§±ìê ¥µ2wôæä©Èû'±õE‘ê–ÃC. 9‡ Ê҅ÕJ‡€q†ÒÊðÛQþÆqpïÓ\‰h7G‡¼Ì£?¶ ½ŸéõŒ…ê4ìºÕ¢ôÆþk/‘m¦šV +A·çU‚']Á 2§>© ÆêÓR–m&E— †”?P9éß®œ~£"šŒDk(d´æzeìiÍçՙKc°Š ¦¹ÜŽ¿à(ë…ê4¹á ¥5ÒR©±¾“‡ÄœYOžXf*µËÛ\“;¹OŸøw&çÄ2@åvÀG-ÇÓ%² %bC—yp »W;¸Í% åoҐ¸þ’ydŒ"ƒÈ½’¥&S Éiäë ڟù%FCø³D> ^ñùùÚɞyböÀÅt¾F0Œ#5+ç„}!;úV*Ò1¸rù ]¨Ý¾EBý§›õÅæ:Tʶâ¥ÇyÎ4såT†ïµ[¿£ñgfs?‹’EôE‰NoHyðôĽ5p5îŒðˆ3(8Á !`ÕL‹w]ˆ=ð´öõÜPM ›­:¡-3 ~¡ n¤S-± Åε `L&¶7Ü3<íÀi¹EÀ'nÅqÅueÎÔ©”´)ïÒÌm7ƒÀÎ}+4®Óp{3,§ÅÅÈÍ Móh;“2Ørb™™îɂÀú÷ç—à!Š]$Ž—K7*t°f«_uÛÂ;±,Ì ®¼Zãä¼é¤~£äi«Éùì<^!ÊÆÙÃlõë`¢ ªûé8ž¦–÷ AÓr֜q̳DŽšgÜàh};÷XqPÈÔ>Hî²RÎe†_¬G=Šªà¤½÷a2ã*þÁò¨©¦V x¹ePì4zˆBŽ¥P¼¡0™¹jŒ£ˆÌß58B¨É‘vô7èåŽ8â¼ó¬‡oW.áÝ"’ör!móLI6Or‚Ò>nU­2f½é()AQ¿©k֔42£§÷6W’ˆD{UþÀ’³ê’ï7åÒ-º.llp·2/øMDBU#ŽLB¥]â–Uô‚Áþ +Ñ#B¦‘çÁé‚_DÄb‡$ÙX +ÑsÏ+çÉd.¥WΣî0Ø. ™Æ°‚Ä«É)a}ԕšÌ†³JíÖKy¶âQk]T­w}“ç;©g¤»5€p˜:¥~:ò }w†“.­Gj?Q¤©çt ò1†D‚‡÷߀ d¹0•v²›‰JŠŸÅÈaõdÓìžm£;ÆY$¹$ ß+駯ª‰*ƒŒ¿D" Ó C(•f<E‚ØÆ*¹*îS2… ›L³Ð¾4ò†æå¼!# åxd9 ¥ÆÈ"Át¨|ÿN²Z +ªRlÉüá ëüZ.¥À<ƒ”ƒ4ãz¸êqjƛ›¹K[—\”mþd€klÔy+ öʝ¹ )¡¦§ –\¡ºÓ‰í_-e…_†Åïý£%úc¥NùeòÇJi駩ôc¨âØ{Bž„*þøÔ··³®Å»¶¡¤‡/å[è™&õ"ç¿&oçñ€PiºG3çWpŠyú¾³ ü0ð©‘Á0@󫵃%ðóÁ®þ†„•:÷Š’Â"Ø¡kÇñúŇ¯¯¯~eü©k®ƒßŒ®×öÃJºá„aâ§ei©ÈãØ~èŒ#7žû[=ý"‡: +endstream +endobj +239 0 obj << +/Type /Page +/Contents 240 0 R +/Resources 238 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 236 0 R +/Annots [ 237 0 R ] +>> endobj +237 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +241 0 obj << +/D [239 0 R /XYZ 90 757.935 null] +>> endobj +242 0 obj << +/D [239 0 R /XYZ 90 714.318 null] +>> endobj +238 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +246 0 obj << +/Length 3098 +/Filter /FlateDecode +>> +stream +xÚ­ɒã¶õÞ_¡[¤ªiwŠÎil'.;cg2Ó®TÊöMR-d(RÈé(_Ÿ·ÙÇ_ZÀÃðöìp÷´ wßÜ}ùp÷ú¯y²+ƒ2óÝÃiW†»"‚,Žvõî§}|¸³pÿÍ?Ê é£Zž¼[]ñø­®šÎ609Óã¾8üòðÝÝ_î~½‹àªpÑÑYI¶«.w?ýîj€· ƒ¤<îž ë²Kã~Û݇»܅>™Y¸"3N‚0ϘLm÷i2ª£ÿÛÔ?‡Yô +àI±ÑþÜ0ÎW½1½ö]­»'}èGSÁrR–ûªïi¸ÿtˆ²}ƒnMÍXcW7†‘†³»Ñ6Õ a M.£áQ.SUÕ_®ªÓx-Üxar@DÀß}e&Œ|ÛÙAµ­â3ã¼È©7pDží¿^b*pdš_GmšKÓÑÒq_÷,u½€ÔõÚÞ¦O²Öh Ãðú­Ý¨ŽøŸ.35¯Ê 7F1Í tgÊ&OêQ·7$ àôð òÕÌ(/}­؄‹ýã¿A¬¼Võu#ÐNŽ8 àGKúÐ;Ó×#í0è=<õ²B*üº\ÛæŠ/ž·?"8Ô|dij² ~l¹HhtTén‹»÷h-ÿ-˜Ö‹ eý¯‹³ãJGYA¢À…«é‘ÈOºnxae€â£ˆ~a‰õ ÝUíXËeêÿÜ V>ènl>OÉ«v¼^{#'ì?Ï¿ÂYɲTƨ 6*`²$8x¼Öj`Š‹ý‰¡Yxz@Ôá¬äÒX#8ò ‘ÝIž¦hÃMøše ÒW ‚@ÒòpڊÔlðÊ[óBŒ G“‘áDwìÏg]$KLw>ѝ¯è†yoÜ)BwÀ¶ù¦ª+»I)9K ~ºfð…gª›»F|¾á0ƒ°ç³»ú3Né(ªÄ¨’0lӞx ÆQ¤äݤºZ5GGènítˆ³ý ¼Ö2€½,L÷ýÆ|GZ¬gK¾ÃðÆOºoÙhøfl Ú` ¬x諾µœ™ÄÜ 9ô—ËØéjr# Ϧ·‚'Æúmzô*$Q<'(ÚL zâB$øKgˆçáxŒç‹¼ý¸Gu:æ#‡=CçÄh@±<™2N(3mȊl§<²9—7à‡iá±8dYP–Eȕò>%“SM5b€!Ӄ9†_b'L,7h ňïÔP¢‰Ç(0° ¥[õØ +QäDAã_¼¤Ø²è7xãÌ!&p‘j€´NÔe._ãH¥@Ï¿öÚTÚ;We­˜…ìvvõ¡K•¾ÅÝUUÁJ^¹[ی¿½ê¯xÀ ÈÜV0•ÄAT +SF +@S×èÈ{8”1xäÅÊ‹r ÎˆÓ IK>ãç8NÇÕÇ|žzÑÖÄJÊ@ERÁ€§ËMF˜Z—_Žâ¦+ltyÞ¥â‹9kø½¨,sÖ®š+’'›N¦¿l©¹ïÐñhc5aäÄMQ)¦âŽY1Ýgi¹"x"à#˜U\RîT,¤ Š™â•4‰€4´C†¤ñdԅìYJ¬26³X;R’·.‹õãәax‡34ˆò ›lî’ífn'I<›$þJrl¿ÈNރ” ¹—„ý 1˜µÕr¡”Æ„âI1[…ûŸ±(6+^´Ž¤ê#ÌšˆåT¿–X º‡ˆJRY“óÄK§Œ¡a8E3 gÒ2äh[FËÁ Ë{@•¸û£tAo7•èQŽíGï1¾a՞‘˜ &3ñl&E aâÂE5®L[Þ4ù‚1ìöîBC|:€ÂŒl'“-â™Oú>Gù Ž–1åõRµ‘„ 7 °ü2 2‚âô™‹oÑc™8 KɨG<Ž/JXy´yàÃ`Å0¤¿ºº#A™z§2&ö7©£Á·?ÜàÛ߆’)ÝÇIä,*‰f¦¤NRò°4£ÏMLÄ%T!D—?˜FÑ>‘8˅²\ø}6z¨ôKXˈ5'7"·ÑBTNü,ȳ€È³·xæš7ÝWÁ®' ,e¹ÕL§¢3q½dJeæéÆ@)©ÓI•ædà6‹öÿ:DSJÛtmU%›ñ!OV²„¾s›±rUí+)Ÿk‹€N³aÜLk&±Ë——WVˆ@Ï +™Þµ0œÎ;KY÷HùJêÏ'ÒöQ ʙþ +ôͲ<0úé,ÅÊÌú¦7þÐèÿPaJ…¹gv0é¥ë/²¹Ì´\’¯‹)_‹ìqŒ…é"Ÿ$Í3毪k>›Šþy)Pú=Æó!l0@?ЧÍw…‚½ô°Xo«B~Ct羅.?1šM9 Bሠ“j@¿ÀñwÎâmׯah\»=_ÐӘ{ÛÚEy&G(Њ ;S–-±~ºÏð5Iè³þZÛªUú +΋eNý k2[À&¼VOï18÷äÎ͋­%Zå®B€Ã»Ø¼žøW F™ø['-h” 'w”æHz Ò¼\ªRäõçÉMÌß»PÑÆùo‹èÑ©.ۿǦÿW°§ˆ:'#•7Ú|ƒ¯è\/˜Š3®úçG†«v qG*šlßÎù´eŒ®€ËËì䩘'ÃÔ0-U€ˆ 0´Üìì/›=ê3rrDw+k|³oWD†‘!¨ÝBl½­]Çy£uÔa ŸZ=ü e¿­¡Êi(Ū笝q"ÿښ†ÔCý!hµ“‰vRÇ1fVý¤_,² ÓE˜t’I&”ëø‹‡¥)JÙYYýésJ±£ ý^@̤š$¨á±^*oiW"|uÙ«ISžƒJÖa÷ôõÏÒp7{Ôÿ +«çhøv%þí£mVù;uŽ245×Þ6«xÙ©ËÔR è§-DZ/½·ÍRìŸá5ü}‘£6“lÿuSµÎ졈ã: +¼ ƒ+)¥X»ž1ªÒ7­¸Þ‡&,Ä'i%q`ûKÃ#ÚÏCU‘Å|,$´ãN~„ýœeҖ?ÀNR¨A û~ö ꬁ÷K·|I°k¼=uR Mï_ñqÖ§<·Ú³áŒzÚM% ÷û0>÷SW¿ê5¬;ñ7D3¹*¿Xd°LÃe(€µU(ÀºyªÕÉLIžº€nÀP£;\Y;^¦—Œi¸HÅS¹. "×íޓõlAs±QÍúg.J8Õ6sXŸ)¤XãSHAîær֝WÌhÊ<hå³Óëš(™kT|€*ÃbYç¼i©v ç‚ߺ{)p˜¸ýú¸X=s†KFp€?«k©1ó’Þ»N£™ï€ù˜«yé*X…› [`ï¥Q +‰<}ô»ß|¾‘:ÚG!¶qEÂϮ돡åž:}„R‡_){± «çš¡š,Ks#ûæj>vMd!†åãK—[ÿpµÂc‹i–Ù›:Y:€Ö²óå#D̏›_NhW\xUp M@ÛÓ=_‰¹3*‘BB,Í3ʬ?˜ˆþÀ>Pâä®uˆ]ë@h˞y^pïOJŠùS à´3ÝÅô¼½ýÂìě@8Ç׋$™)E˜gi ˜Ÿ‚`BvNo“ ¾Pð½[åí_†· Å}’N÷À¹[K2÷P’¤òP˜ÔŸ%’טðMÞÖÝZ’ùŸê’lCÓ-ª,÷0ŒqØDʶd*Ã0aN’‡‰“¼ä<ÿƒˆ;S¡ ¬.˜-ó´'ÿ &ÝgÔÐ}FņRêº+ŸK¼…––ÏøZ +Ùtýïù1(£ãïýo÷_yPÐ0òAdee©ÿ¥ü¯Wæ¢Ø1ÞõííÜÔFñê[ýh”¹ñä+Fy«º§Q=Éþo;P҉ªÑJ@øôOìŽxÃ÷ª“ü–Pòô’$ÃB`Ì_Åé=ëCӈ0Xwnô7ü'”Ìã+NAà +±u†ë¯_???• ÆN_M ‡×Ж¿^Hw%œ(Jƒ¬,Ý)’;ù:€> endobj +243 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +247 0 obj << +/D [245 0 R /XYZ 90 757.935 null] +>> endobj +248 0 obj << +/D [245 0 R /XYZ 90 541.181 null] +>> endobj +244 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +252 0 obj << +/Length 3072 +/Filter /FlateDecode +>> +stream +xڕɒë¶ñ>_¡[¨*I"™œÇkl—)Û Gz\¬L¾>½5ô’Ë@7Fïœx÷²‹wŸ?üõéáÝgGµ«Õ1=îžÎ»*ÞÇ䐧Éîé´û1J÷iGŸûƒ LgzÝðä»é¹±5¿¶µé“²ÌʨÜÿüôÕçO8*Þ%D:/…ÊwuûðãÏñîë_í⃪Êݍ°Ú]–*ømvß?üã!ÙÌã;6Suˆ9³ùåNòèÕM8È"}:ñÊhúv¡Ok·‡¿¿àÓA¿í“8rý{Æ´¯êºv½Ç°ã…¡ãÅ +åÁÔ£uÝG0KӅ‰vFF¸6º6f¢¸Ý0°7Ù§È +üÑÝÈàÁM}-?ÅqژAh”-æ1IU.F=šÖÐî4‰Ü™qùXXä‘Þ"-»ôõÚ¼ +Üy £W…%ábŸDÄH r’müÓ¹ÑÖÆ_òdk=Úî…a· ÈxMÉu'Š‘Øø Ù¸$1}˜!Åá˜f ù8¼^‘0&²Y£+Œí0X–1>7ãûE |Ë$Ñ#\ì-*Ñ(¢V¿2ò³l&yŸxL/Zø[ÀàìúVÎ8ó6-»ÌU÷°‘¤ ó[oÇÑÈö†Mè£Õ͏|?âÌl>Æzà_ƒŒþ§6WÀð^d^ë9Ðs^ê͇Éö¤-BÂ?mÈà‘é$G—/”H¥p0u£Eª*~\»ã aŴà¾v$åøLB(%ÒôJ)璸6n8;LÖnRxUÒížùv8EŸ®;P¸ù^d5g†²f©â ÿóüãøL®Ð6ƒlsü‹1 Æ÷aàÖ´ËPQpú,× +BÚ¢¿{b\­Ñȵ·> ð{Œù÷¤_½7?o §†W\Üñ½1|ãzºM±ô#‹K˜u'¬«$wqZ®âü^ž°4˽×ÀïÀډ(‰Äa…ƸgqVó{´7´ŸŒµIžIÅÛk\z®Vöó3á/?"ÏDz4”Tͱ Û閤Þý02t´­¹cä¢Ñuû ÞÔ&HBN¼ê,a~㮡¢¢ˆEé3U-~º`C9sT&>\ŠÁŠ¼7£tF÷ÏPÌ&#êSæb•E%ց»¦ÞxJ2¸cÛ+y!v¿*Þºî¦Ê‹ÂRžR¼Žëø0[KsmB÷i)ےÁ ™3÷ôaeŽ‘0öÁªÈgigA,‚ÉÉY¦¼†0ƒè[øŠAP,>8c ó4nǃµò þåِ<‘RYƹT¶\ÇŠ`ÄZšÍ7Ä¡è:Œ–¼'¯*ÃdÏÍ;5‡•gC)zIœxΡ!ó9 B¯°q¡ÙPþÃj ~ÑÍï̓“nØi^ôNh²…²ƒÛV¦rv÷vЭŒ Ç2½õUrÆ¬s“ø·rj¹V%9õÇ5f«º«åˆoýeþI¹ü>)#Ÿ6‘gÏÝšî4çaŸÐ»ÿ)¹R‘F“U*•ç€©!N]Œïˆh2gi£ØîŒÏ/GÝÇF쉜Ğ 'a”…Œ¼°ùl¤€"UWÅGd¦7à‹Œ¤µœZVrCº’N ,‡ªÎ°Šô~Þ^]-yÀGsyÈÈÒÞ1<“ˆø:tSª’L¸z[6æe£wÅÞaî4Ћ²‡Ü£¯•7ìIξÏgsx«„ ö›ºõ®´¶àAÝ~Ã? +ãŸêêN…MÎç +‰8¸¾ÏæHÇڅëڃïI‡’Îbi%!rï™ëwÞû°:k©/ Ÿ³«" ï@?-vÍ~µ¼r=e¸’‹¡ÏO,+s÷%—~ƒÊÕ}³eŒ n©Š"¦çCHd˜'/qF‹ª“"ŒH¹H¹HȖ®`Œ–³s@Á½q-Ó žµ¢v-T¥Kd}~Ýê4Hâ…=1îÿ2Æ°j~ow&ÑSû?¥©‚g´#Ê ÔŽ|9;eŒD7 æi€l:g,[»±w O($”ËóœœÞ¢³ÿÕÒ£VJúg ½dMÀ–è,q{© ƒ7»=lI`Þù£xV´@ïÄÊh}ó§"v}“ô(ý-Àh £Ì[7¶ hðêÈ=ÿ¼|¾i›0¨å­oXÐêϱ´¦fÜtR>NX®ð;¿c–„o„²=*p(ä°’ÅñhN~ÙÖyRzE5ñ‹ÎØ¢³$Ì{2I2oÐY&%¸§~æÆEo4Ù „Cl‹UŠ•–R«àBpà²ÌÅÊëŸöyÉÆ+Þ` ]J`;Ȗ •Ç% '0æyS#K/ëä°\jdl>¹ç;X7mÞrî’üf"³„«Èw×`È> <€[ðiW&­ƒÌw¿(¯îÙÿ°Ö#ì{ù€£$ô,øYµÊgÇ"¬Å8 ®­&ŸOŠ{_ä®ÈàÂÅ5°¾.@­¥.y1ãcñxaÿƒ¾P­ît6ë谈H¥¯¿µWçë‚9Ãìý<õü‚ˈÔÖ§Z¸âºU¶ŸJw‘µ¶¶žä]Q.Õ(ŒçV3aJ‘¡éBÔ¯i=Ìë˜J/ÁbœÙgȇ§Èœiˆ1ÔÎ}A­2/µU‹<—9YÀQ,Æé)‡yÕÍ87kól>ÔyáAºÑìB=‰5ck‘e"2å%µq×¥EŸÎßBp(Ñ0=]ïTù¶¬o¥ã€¿¥Á@òÞ´ØBâ,ýWmèÏéEÖ_Ҝ?:æQ݃i>֍¶-/8áüÚÆ 9òg:Ú¹•ìhÅm˜ì(M¯Ta($1I<¢.+UaÝ –/XCø79ñWJƒOŸeW«ßê|L¥âÆU4˜¦Y Ž­Ìô3Ü|€Á ³úË:ÔSv¿õÕû)×.`ý‘©ø^…OíHv>™¿ÿÀ,URþÑïûþ»þñPª”ïúyuÈsɝž¸Õ<2¦û–j•4úÎ5¯sê5C¿¶Ï=Öö4ù„Q¾ÖÝˤ_dÿ—¨ +ܯeé‡Áô>>á†ot7QË`¨n¥¬„ÅøµFÊߓèëß÷ƈ0Xïw~ôwü·Š<¸Wš•‡8]ë2Ž×?¿{w»Ýõp˜:{ív|w½6ïVÒ½N’d‡¼ª<V`¬uT—So¿> endobj +249 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +253 0 obj << +/D [251 0 R /XYZ 90 757.935 null] +>> endobj +254 0 obj << +/D [251 0 R /XYZ 90 630.537 null] +>> endobj +255 0 obj << +/D [251 0 R /XYZ 90 399.665 null] +>> endobj +256 0 obj << +/D [251 0 R /XYZ 90 283.345 null] +>> endobj +250 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +260 0 obj << +/Length 3484 +/Filter /FlateDecode +>> +stream +xڍZK“㶾ϯÐÍTՎ–ïGn‰Ëë²½v6µãCÊö#B#ÖR¤Ì‡'ʯOw ’’8Ž/"Ðh4€F¿!ó²ñ7ß>üãéáý‡4Ú»" ÓÍÓaSø›, vIlžÊÍ/^¸} ßûö§ŸµaۙOãs]íÑþXímÓ[êäyœ{Åö·§ï¾yzøý! ¥üM ¤“l—EÉfzøå7Süû¿‹Š|ó*X§MFô­7Ÿþõàÿé6Ãhç§ ¶»ícЖ¶ôcÛ ýŽ·ðþCâ/æù›Ç0ÞEqiçíÆÞ¯aíÛfèªçmè{ãÐvŠy0ñªHŸ}{æ%.]õr€qlëÒv~=¶Š>Ƕ«þk{ àMìÍ„<+ýXmob`ⵇ¡³>uíKgN:Ú]mé•7Ôv_t°ásóI‰)E¢ z=Vû#n +4ùú&šÔ‘Ð÷Ùô¶Tf>9ÌÅ +B`Tä—^^“Ø›ºv°i±þ~µMOñW؏?¶AâÙ®¯Ú†ïc7,Û¥a<]aì¿Iž‡˜¼í{‰Š7* +ï,¢3kSzÜ7÷MgµQ×hÜcƒJ» ïµá£òïzÚJ pÿù‚¯°be¯ÛØ÷ޭߙ¥9D5¢Ã˜º³¦¼hgÿûXu¼@”IJ0C ךÃ0ÍP¤wÔÍZÞ ÀmŽu‰î³Å·j]Õ¼8ªÏºVߞádR~lWHžmwª†Á:B—«S¤8„-Ù{¸X*“»ãæÙt†¤ä|dvF±8n†³.MZ@}½WÕ«±G¦tjÞÐ@ÈÓ¹£»€h[‘ntEÕé»oOd®«±C;Ka·Æ¹Ò6í©jh_ì:ÂXí%7D ˆ?¶¡[eÆ@ƒÏ$;ÔþÕOü~­‰aåÛàKˆåd}{½q%}/ÆnZ‰©vf?T²”\YÌVOô“¶a»¾}$§w€Տ"+Êj²P:ËΜ¤ƒ!Ҍ½§mNâ¾H16=> |f’áBi`hx¼t7\9YÓôK¤Y],Ò`|–…•›uâ=Kú`Oâ¯Ü/uŒÞд‰âUM?ÜDyØ|šxëjÃÌYÉvŠÃ £ñúÅ󝲨Šg¥9.}‡ ãK3éx\Âèl} ñžŽälFTÏñÅ;bY"gE¹ñuۑ’Û¦Tj‘÷¹…/Bùð¦Ý‰üeTù4™ =|ÞOÈgõ­jó\ë,‘@ž *ß6: ԟóf2ï<È<8 ”‘Ž¦Û¹÷b±ê,„àQ)`<õ×ó5 Ö"f£•È¦µãËqM‡˜¿>™:qär~º~ÈÄkì°äù&Û9ƒ$óÀ„. Ž~+ÐåÐvOÖ¯šŠ¢ðC‘ÅPˆý*¶r1R+4º{#)c½GÜÈ'[N¸ ‰xšÓ²^ûwL·k‡}„؇$u’—š¥=w‹è@:_G~÷°L“9e|¦TÃ·au[Š¥‘$3Ìñ43¢0UsŜNœF ÉYÜ¿7ÛPˆ4žéÜÙn.êԓ»O+ˌ‘B1gØxEl.^¬<±vªõvÍۉÀG³BÜo)¿ÚR®[r••»-á2w>bôÄXKC 4§¶S…÷g³: 2 ¬ÖòVŽ4í\.ŽBE4:ÿ¹b‚oD…Ü1Éd/Õ·?Ûº²W¦$Ñ¢"_¶SuU¾áÀ%­Î8ìGdriߔ暱C©¹OrÒؽf°×L-EZGÎöņh ³Ð›6¨åÎ`¸@¶HÕ°cÛøAÝb‘M»¹ÊdÚM¡Bå…ðöcWï¯Ñ6ÈÙ}ΛÅÙDðzùJ âWJ8ùà|J}°ÁŸãYMV†àôsWƒñµZà»ÛÏa„%k¦©‡…›Ðc¼™ßëBq¥ Å\Á„n¢H' ‰,‘æ',™üN½®KÛ +Uˆ"^ øxÜ`¸?“~KÝà)Ø‘ƒ®. +]¬Ù˜"^°}=:kîBÖ9Ô_Ä徚`jè…Í%΀yӞ y?S‹5ç˜yò!SíS5N +‰PGç@e.CL¹êínŠ¯&À p¿f +¤Š«oã2Þ·ê§5Íiè‚ <€)NYõû®’Ü°í..M%œpªý²µ: á.£Le6‚²ú.…¦\†.[×l'z=W|1úr–,t¡AصÂ5€õ'x3œ[Ò_Æö|b…>É[0±`žNÇʂùέ˜ +)eEÌ5.žç¶ö†JÏN«<¹Icñ®F g¨ÕܬøŽ™‚d¥Ô;tí -â¢ÔÐBTî"ïÚ6›ÐhiB#I€Œ&š!bLì`ŠŽÖ öRæ?ËYC}à¯zŒ|ÍcW£X¹^‡÷|ÁW=êv(]/{2¥®ž` -<¥CåJàxŽÓ{ÖÔ/áb^u2]U벜|¬œ²%PÙ(½ +#®¬¡ÖU¼@˜äÊqb¼>“FR=SæÍzà©y±f0•ÖúyºÂÕè:½%ç365,G”¸²?%’d—»u•­èêv/C[ñÖÝ-βîvŸÀõ‹[žÓU!]4ÌñýÑtî!8ôýlõÁ㧖ýóËò¦Œ:JOý…lG„7‘>ÀS2 £ã›ÑiÓ;H9Ñv7T“* t¶D¿:)_)Þ´òèëT/½ù“m< +wAáþãê³üOºÜ籓*ŸWså?yÿýWè|–-ÛÓ_øO„i³xŽƒäE.ç~¼‘è’¡’¬e®¤K Vùùá:KðŽ,ôÆn@³íÊé9æ2áâ#Ó÷ì,™/Amg»GYl2ƲÚ@~3ÏYžŽ%‚cRÈ\áŒ}ø­CӘ<ÓWŒC'è½¢¡¾B(ëØ_^šßiɧ~w¸¡¹7 /¼~ªûº¹ Ÿ ÖÒÑàªHqRfôøÚïÉLö%×W§±LcÛ±¯†€"òé<Ï5¿Ÿ¿l)Uäò„ž”F¦*s0U’ƒÙjȲMé‹íC“×ü½%ßhôËÊÈ5yM Æ"—Úqi]â9Ô¥b¾xqg€h±ª»«Ê+î}ìKðJǍûÖõŽÓÍd~]g0ÄÐɲº+ …]-Zf¾àIWKúò•<ÿ_ÊýáéöSi¾+‚ü¯þmJþ.E*žîŠ,ÊõïRI±KÍùžÜ;ñ'Þ¯éNòZzŸÚúr´e§×«çÎHŠ:_å#ù«Ñ¼èüïØÝÄíôsoç?÷ЄMƒje„@hñ´ + ¿ ü]èֈŸ­Uf€_6®õÿ ,Yœ+ŒóÒê_ÃpþÛû÷¯¯¯»}¿›êÜíªá=à÷WܽaNÄ»¤(•ƒ{×לÎPñsØI¤mw{Oÿí ±œ +endstream +endobj +259 0 obj << +/Type /Page +/Contents 260 0 R +/Resources 258 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 236 0 R +/Annots [ 257 0 R ] +>> endobj +257 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +261 0 obj << +/D [259 0 R /XYZ 90 757.935 null] +>> endobj +262 0 obj << +/D [259 0 R /XYZ 90 716.221 null] +>> endobj +263 0 obj << +/D [259 0 R /XYZ 90 153.741 null] +>> endobj +258 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +267 0 obj << +/Length 2850 +/Filter /FlateDecode +>> +stream +xڕY[wâF~÷¯àmÅ9¬;hß0–m%ãÌÉäAat"$"‰8Þ_¿uk!i”=Þ«»ªººº._Wc}ð6ÐW·ë«›{×x#Ï5ÝÁz?ðôÁØ5FŽi Ö»Áoš9üb:ºö°ØÈ Îâ"Jyò|~M“-çÉ6ÎÊ&˞h†>ü}ýӕ¿¾úóʀ½ôAºñhl9ƒíñê·ßõÁè? ô‘åMï$uئßt°ºúåJoÚéè;Mk¤»ÛY¢ +öÖ'Z6½ -ªÐÝÓ>ò3sªœ¿Û4tí#J«&ìó‚öç¢:ąZš m]ûkh8ZŒ>’ìMäŠü(ûrrD½¥§½³¶æGU, +›±Às‘¿ÑñfƘÈàQpÇÃyŽœ;ÏR\76´w<@$ÞelÂ.çtÇ´2ª’r/¯yuà‘²‡qq,ye;ÅNJVu‰°Úí¢ûUiÈù[Äû"J2žÄY•1Ûi*?½ß™=‡d—`±KF(ÔI\Xb™#Ó%†5~±ÀÆM)kß:1ŒjuuVO÷{ˆ°Éó¹,Z ˜öȲ=6`‘W¸cY'9G\¼ªí:Z.iô¦Ÿ£ý•”Iž1)ßóWüò²7æÃX—ƒÀ!šµIðaLʋ* + +|Ó$ûC”,¹Í¯Iÿ`œ 2ˆ´ñ®/*œª{ʽ* + -vÊÆïXäœíèèÀ-ÄZ X,Bç«r€k‚ÁšŽ˅Q &u°&MHF’U"1·L††–½¥1OÁ_úN‰þA«Ýq}¢ëf‰Ôþ÷W´;–#€`—ç´’l¸èÃLuumÍb㺠aØ͂qãP¨!IS/(²ì¬4ˆEÑé”~´¬Ô.§¨¨zÃzH¶IÃÖhO8¯B7+ˆØt‹ij¯˜ŽçŠyõÊòo +LŠøÏ3 €Av s6å9ÚÀiEu´aRGƍò+JxL©žÖ53ølÇæ" š× PùùMP#âOWÌ&\I(”·qeށ®´è¢;*ù[ž·‡Ïà™-xƂä~Pð¬Ñ¥‚D'y“vOÊÿ·( ÏÒF¦¶Ê÷|æ¨P<´!‡*–!íˆwŠŸ0(偩°Â¬ÍETÍ ÂJfÄ|gFJ¦à1P¬R&QRÐ@%²U CUGOØåÞ1¡’c,£\Q Ž1ºX·´Õ™ +赁¦év D¶„F¯¢°LŽI<¡û‰§¤H*VRïx'¨ž4¶ÀµŒF5›\Œƒ]¢ª¢½Ó.®¢$mÞ•+T2Úí`ÃRå²:LàzMã£J¡¢U#å¨V:¹¦ÍJýeã6Š#¿o şØŠð33”…gHªÀ^5Ùùø +‡t bã†ì™AþÁ´¤€ZrÕ~&~ûÆvÞYxiD`’Be²ƒpöÃZ¥ûõãb|Ï1Ó° hc6mLC(ð&”nȬ»:Ýp²Ë1,ÈÏòŠI”Ôd_:¡¶Ñ(ÍYM̼»ß|­¾fR7¡=•Ý¸÷Õ€±+øçª¾xÖéÆñ¥T¥ú›ÞuÄ»Í[Mü £Ž?ýكä][¡=ix×î3rUB„à ëïæm£Œi;X´uª•òþ\É2{ÜrÌ»†p€r Lêv$þÇMöØó­àjg¸ýÏå ¦ËÆÿ ¡­‚Òcx6TÔñ”ìƒo´ÝÆ'xQlã½s}@Íär%àc Ê@µ&({†_‘ü'–m9cê«ÉU Óû#ãûrg¯.ŒÞ·ZxQ4—Š†|Ië~V÷º‘1Tày‘4ßõÝi„EÜÊÝßúA]”ìK ^^Gp©}1½±öÈÈ×JÀyxgù?ìRÿÎ@Öö¸«.…äxÊë~­n›µÈAé^½'úM¢HÞâöCžîTmªRúR~[´û?ðPсºÑUÍÀõ[ªäBêÄù3Mª#Mê]RnÓÚ¬¢mÐ˝QQDYõ1„GìgúÑG?ô‡_lÃԂKþ¾ ¸ñ¦a8]¬¿1é~ò–ñà9ÄX.ÂéÓ5R,mýeGÌÿuí/ֲğ‚õÚ¿ãé­èž>?σÞ7âlz;÷±wX˜=<'ô¥ÔMz yæ?¯™ûòè/˜ºD«ðl/ÁJ–¯ÖCèb§CZ2‰¬y ƒu°x`"YŽƒÙòù[<<®Yèq9¿óÃUŸ™ÓÅÝ úÇX¸ìOÓg4xñø+!²ë†øÈî|&ò¾ Ç2œ!¾Ïey°’Æ/Áúq¹Yˤ72瞿ÓÅ·>ËwØïè®æb5Ž}ýՊýäjK!O(_-³ùæü&ó[,*2& öOæ„])ã,‘5âìZuŸÍS‘ mÃ¥sÙPBO~8{E÷6˜œ°.Ƅ%îƒõÎÂTIc`3³žÙf>öó&|^®üÏÐʞò:ÀÂ.8 V?sïKQŠª¤ñ1aþ ù]3eSišŠ\¨0ðiº˜ùÌ¡è*'q'7€¬˜yÀ”oC $6£>W® Wæwüs!éÄAK'þþÒLO‘¹óïýÙ:øê_ó\6áÉtµÚ<ù-­T”‘ð$6Ÿó`áÏ èuGëÍÊäákcÆمú« äùR¾³e¢iËÅgpԝÃs²jüh ptžD¯Iš|DA°¥Dä4ÇÍÿJ`‡¤ÍbNi‡ãÐçÀCºÜ± brûæp®`Ž„èŒ(„ñx}^ìÕ©…2ʂÃh€¯{ +·µí&¶á”±íš'´+|EØjBқ5#ê^—ð ùa9hDRí×ò 1¯à|×½é ] &¨÷ôÔw6š/±Ȳû>0eðýÌWu+{ÙDžs$B9L%396®šÍ6¡ºøÛJÑ&•««´Á‚uX\£Àº€]cíú1{¯«o|×âh¸&šÓû!Æ7˜oèú@þ=ó9 +@蔂ÕÈg@T¨‡Ë‰+ð;`ՒÊF#ÒV¸‚ˆ×ôoDõÀî¿ÝÉÈ3&Ÿýo¢ú/¢;òÆÖDþ‹èx#DZ¿}šXmo'œÂՓ§ð."æΓ×"*>x2c‘y”½£7Yà/É{zo…´)ã¢~íÁ‚§(;ÓSx˜ºíõ‘¡Lô5’ú8g°þ¨ÑÏø_\§q.x Žt8t¬CUþ}sóþþ>ږ£s–œŠQRݜNéMË»ç†=r> endobj +264 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +268 0 obj << +/D [266 0 R /XYZ 90 757.935 null] +>> endobj +269 0 obj << +/D [266 0 R /XYZ 90 660.116 null] +>> endobj +270 0 obj << +/D [266 0 R /XYZ 90 555.752 null] +>> endobj +271 0 obj << +/D [266 0 R /XYZ 90 336.835 null] +>> endobj +272 0 obj << +/D [266 0 R /XYZ 90 196.605 null] +>> endobj +265 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +279 0 obj << +/Length 2530 +/Filter /FlateDecode +>> +stream +xÚ¥]“Ú8ò}~o1U‰ÇؘÍ™ {“™¹Ù«T²U'ŒÀªËk›þýu«[Æg7©{Am©Õjõw o°xƒ÷Wo–W×ïâp0q'q–›ÁÄŒcߍ°\>9ÁðUyÎûûgd!+‘ÓÇã~•«”à;•Ê¢–ð‘„£ÄñýáŸË߯fË«¿®|8Ëø†v4vÇa4HwWŸþôk˜ÿ}à¹á$ Ön0 +BóÁâêßW^—ÏÈ»à3]/ŽˆÏÙ³ûá«pœ8ów4.žon º}¸{;{"øÁŽÃ‘ç,oíôãp8Ó§a “y×tAÀ›‘ž8Ó·¸ëùbö–©ðY@ˆé<,ó7ó»¹¥ ¸Ä+ßw'sK¼¡Ø Åé‡)ïg ±/T{ÃÀõ&#Úë] í{μhd5 „ßđh”.ˆ¬Þи)NÖôåG4ŠbÍ1x&[80¹!ó:R¡7qšL"8kU§¹P;8Ü,hF8 /¢ªDÑiƜƒ[rµS–½î–\‰•Ê•Å/+=ô#ç«ZKÞ(V4ƒ?’RQº!xÅs[5 ,VÁGêÍԜ"qa;Œ;#7ˆ¿áôiG¤©®ÖªØ‚F¾Óh=€ªxJV»ú%¡SIs¶2áݕê}ÕÔ´³ÎDžÓ´(ËüH sˆ¹@L< A;]3”準´ÑC•þ¦v¢‘5S-x\Õ:ß7²ïV¤žŽ P}á˜tƎa'RÂQüÙÕ ©‚±tQqÑüA5­¡ðXém%v §0Jœ}‘˺¦Á{Î-™a¦D]ïwå‰:1Ùeæzە¢P’í]Аê:ž»†aÓD1b“>;P%›}Åð¹êÐÛHé¶çÝ8`Ϝݿ% 8.gONíÚÍÃýÛùrþp¿h]îX_¹^’Å[Œ˜aͤP=lFxH&k¾É£šæù†Cß÷°Gú¼—{qŒæòõÃÀhrŠA8qŽzOf¸–'[ÊAÄfUÐZAÞ@sekÁ(àà8D(´£hèK5ìnš¾ÑÇñ[óù¤7˜ØV=€·•º®Õ*çµ½ bŸœ—ñLÎb^ÚÙÑyÌL¯}YyŠ4S»[sR,vu!þø‚4Ï\¨’ç‘ àÜ16lÑØ\[àÙñúÝ8$‚↠ v“ÉâPìz!Û¥q‚Øó˜O„·ê«É`{QÓg!v¼`îfV•ÊžÔ?A+8ƒÌæh<²—ºs÷‹¶¼9y•5È5´*¯Ná­Ûlb”(lð¬d*!’žÇGHÇÿÛ{d.rÅ‚Õ§%}a‘Vs>Ò +{N-%ߙž¾ ,ô¯«Á'ڕ5MùÛõõápp·ÅÞÕÕö:'Žêë3?} ñ«Àw#óЄÈ/#Ó¼¶õàzm›Ð̮ۆó˜i[w'tPPÌp9HÅpd~9•.ìûJ›‹KQÚ¼•Ÿ×nžÝŸpòG ulšÜÅë_UÃ/“ÜEÊQ-ðFÒÕ¬74‚Ï•{† `HÏ،'媻Ÿ´ŠÔ Å9MS±Õ–Ú-Š ¾:5wOõ)²Ô¯V¼Ù +èûŒ>JÜ( +mNþÕd>þÅd~™»}h¡E¢ ed.:)b‚Š&´• ,IìH¨AÌ#ÎÑmXС6-Ävõ…)Ö<ÒÀÝɊŠ>œÓL¿N3­s|bóbǒ…ËB<ãÈá“s]m‹3Úßu…}b:½øšž$nÅŸ)ñºÏ> endobj +273 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [314.956 295.063 472.963 304.17] +/Subtype/Link/A<> +>> endobj +274 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [152.087 86.911 321.452 97.192] +/Subtype/Link/A<> +>> endobj +276 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +280 0 obj << +/D [278 0 R /XYZ 90 757.935 null] +>> endobj +281 0 obj << +/D [278 0 R /XYZ 90 670.268 null] +>> endobj +282 0 obj << +/D [278 0 R /XYZ 90 557.938 null] +>> endobj +277 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F78 283 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +288 0 obj << +/Length 3166 +/Filter /FlateDecode +>> +stream +xڝÛrë¶ñÝ_¡ñK©›æ]dúäsqƉÏéiíÓN&ÉDB{(RÉ(ê×wo )™ÎtúB‹Å»Ø+è-¶ oñýÕ»—«»‡$\dn–Éâe³È¼Å*ñÝ8ð/Åâg'\Þ±ç|ÿù+wÌÒO­yô¡Éû½®;ՕMÍ §2×u‹ó‰Ǝ,}ùáêãËÕoW>ìé-|Ú#^¹«0^äû«ŸõÀXxn˜¥‹#aíQB[-ž¯þ~åMÏ{ç B×Kb>ï˶ö³LNìÁÑu­ªú¥_WeÎýá¤8(Ý2~Ýt :h³/¥_ÖycFë-㝚Þ¢i¶Fí-f× àƒ)u§Ì‰W^ëÂ0 Ç Šøºõ}7‹…&€²d[*¶ýÚ4=F3¸*×÷Ibç AŒtu¯NŒ“7u[ÚÁŽ¡ûÆh†ôíÒwô¦¯xˆlÐ1D «Êú €Ï7áfÕáÂU·sl¡‚ AæËn‡½Ôéð²49>'ôH8‚RÊ2Ûwªã9fAKßsT-`:x€WŠ¢C`L¶‘ýRQ€<é¶%‰ Ð* +NXE!¤A¥«¬ÛN«‚gšÙ+´gŽíJâÉwÞõƒñ¼À´ԢҊ©ÇŽAÒh0h'h߶÷#šjœ.É¡E 0xpÃ-B \Îñ½oŠrsâ ¶J…H +G-EÐ+Œœû½6y š…GYÉmÀLÝÔg“À²ØyÖo eÊjˆÊib5d5Ր¦ +‹Cæ7v  ©˜0s<°`V1h%D­VΑj”Ãã‰$Zh·ºc¤¥Ù1P6qÓÒLV7†ô0õ ü–•æ²8쬵È/’ ]0u`쀠µ]4l‚Ç@˜+Î æîF8Ö'nIûÛљ™&‰6¡x™Œd¡b [Z’:Á ½ȵճJoºkdt"£ùŽñöZQò’àmPö@`R”>êB¡ÓÊ­=ߋ¯393LïûVè¾ՕU†±¬5º-ŸL†/Bˆ8vZµ—©V( œÇŽgAe!éÀÍÛ³u·2$C8°ÉbˆÞ‚Â ±BB¤²ee÷EʐjŒô—º-·5é \2«vŒMZ «¤ÆFÏÞþ¿–)yÔ0B¿`ï!#}±bo0B¡m %ɄÙpÛ8·tDì°Ûn/ r3ЛdAš¼Ö¹ÎcÎɨÿزÔeQ°•ÈwȌÀ5GIHwp†7ÔnÁV÷A´\%yMDy0¬¤Üª,ÈÆÄڂ„XË`‰xïÖ"¨n>1ž¹N¦t+јÓä1œž•±7„Sv?1&¯èbdg·¶þ*Td“\I6¹òp5BjÐC@œÎcsOafG9ò!ìí\„)*¨6€G¸ ôØB÷oˆ†<Ø+ȺŒ H{ÜiŽC8(±*ÖÝkKÇè D:×oäpSÃ÷Ekî¿|yz|ÿîñéñå'&sÿùƒ”??¾<þíóóŸ¤xÑ4Ž„áj┋[-3ä 1X¿x‚®[¹¼0ÆÑ0ÎØÛ¼"¡¸ß ‡ā Ú©²–Íã‚úÃùt¨TN7 ýµÐBc›¹=뗥ÂÁaæü´ôñ”½`ä¹>tÜgYCg¨&qPn¸=Ù%CQ!ró")xšœ´¯JŒé“ûÆ-j9ÌdR 9£ëKƒ65çJ±ÔnÇ «8±÷ÊN1Î)¼#ÓH<×=£]’Ìšó)ÿìåäZ<톧†ˆüaÌFad^ÀcßÄÁó”¸%ö±7O̼ºâá¡1¿±Ñø†g¥ìšw\¥Í¥Â¤Ç†›óØ!Å2qQ`H(/î,j^¥­Ä )ÙäAÕ¶Ì&±×Û^mçóÎ{ÔòŶåމÇϚÂÚ585NØ$§†´©ÈáÁ·üG1Ûሷ1 àÛ!+ð±&—h‰¶B›ŽAg;ƒ•ô +Íٜõ9æ.yÕÏzÍvRÄPpÇ°Åò ­W 4ºÂzn¶nw偁t“#V:Ö¢-IêH©ŒmßX5QPžrç¦ÿ²Œ!cãÛT,#ÚÄj†K|Ðkl¤’'bÉF2–xËo~rj™±D¨Ý,%e×ôBCž ²O1%¤[ 6bÁ–õåâ×ÌD™e†ž‘3:ÿË®oåaˆü[ôf¼Ÿ(…'™#8<Ê>`|P¦cˆbÀôå‰'HÍ<ÊN¡2…‹ÏqçÐ_Ù%SÕüçAGi‘@)YGӇ„ÅaŒOèˆÇM\’ÿ Gü—%¢‡ƒf«Aô0¹$Å3֊DJ-d"]cʜù k¡º¶‡Ç5¢ú™}À‚ΐ¯ã|#ôF¼Q†-IXžE^]þ2¸WeBuc€}WÀðš'rþ‰ <4dïrô¸gÉÔuïgc + ;„‚áú±^Fž¼v˜’þ¶ \®»½æ!U[!ä4¹6ß1# *2YÃ#)°Û•]¥Û J\¼£\©€¸ÎI=ûì„8ÝHcþŸÌÜéƒx8 ^R$fÄ6±‰Ç$;ˆ¬C($É­E´°aÉÄà`T +"hþå)x$qž×Y”1ŽÃ˜~€!Tɖ¢˜s'ôë2ŒVbdÐÁ°']>tÔzâ[ThD¬E;BÆíô˜ˆ ”B¶¼Ü_Ý)%#©‘¢¿VÑföePxu3X¦zþ[yð$@¤â_$½fuCè´i¸7síˆm¯Rî”6¦6½ƒÎt“Àþ8?9@ʋºã”Æé­-ÃQçg¬ŸÅ+vh$‰R¶S75çÃÿ«Ë¿éIêf~ú¿þL·?Ñ7[…©üD37Ž§6?N¿ [Êìч†ó¥©N;]ųOòӖïåIr%>Öà9æúÚj3ïÀù$eÎa`“Ð')1=×÷Ückã‹þó?¤#_]/˜ùA +Ñ¥¯ËƒqËîêú»×?CG"¾¹q–Y*üØ“ç!–‹ÜS(zuOÿ®¦ +endstream +endobj +287 0 obj << +/Type /Page +/Contents 288 0 R +/Resources 286 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 284 0 R +/Annots [ 275 0 R 285 0 R ] +>> endobj +275 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [225.562 684.047 508.501 694.951] +/Subtype/Link/A<> +>> endobj +285 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +289 0 obj << +/D [287 0 R /XYZ 90 757.935 null] +>> endobj +14 0 obj << +/D [287 0 R /XYZ 90 669.352 null] +>> endobj +290 0 obj << +/D [287 0 R /XYZ 90 637.423 null] +>> endobj +181 0 obj << +/D [287 0 R /XYZ 90 637.423 null] +>> endobj +286 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +294 0 obj << +/Length 3695 +/Filter /FlateDecode +>> +stream +xڍZI—Û6¾÷¯ÐëËPïuË\DRÌÍ{:c;qg&ž$Š‚Z|¦H…K:ú÷óÕ’¢éq."P( +@퐻x\¸‹·W/®ž½‰‚E²J"?Z<쉻ˆ#oúÞâa·øÕ –·~è:o?ü,7õÒÛ8ÆHïU•uGS¶i›W¥€Þå™)Ü t¼`ùûÃW¯®þ¸ò°¦»ðx0^ÅA¸ÈŽW¿þî.v€ÿ°pWA²Y<1Öq±ö|‹ÅÇ«Ÿ®Ü1¿¡;á×Vn +¿,x‰sý²Zz¡ó'ý˜Z`ËØu Aþj›k¥µNÈLݦy)æPÕ­4OiÓ¤¦‘^µ—o«d´wHÛ ¹"oZ³»A'ˆœTg¿©«²½ýgº’½H³Ï“)8Qǭ筒Ðî{L«úëСÍøëÜi”U‹Û±@b™ZMzn¦0²îoXÀ¹"Ö¦0icvÒëÊíCæY•ƒ6ánœçœÝ? ŒÙ—…éY†¶fn¿Ì(ÄíX5Ú +åó´ô\œÝŽý´ÜiC>3ÇÉð Dš9@c«ÒþåšþtÑUÏk¼Šüµðúœ„ v®–Pˆ:-›¤¤lIƒ“U'š}$–/@ù0\Óe UHšòÒÜÖ&Ý¥ÛBgõD£Ð!Œ\ÜÙ©6 (ѵË:(¤ÒÝWõ1ÕežUsyì‘l¥9™,ÿÍuý̪|‹TDò¥ïâPý5Zž“Âa´•~ +x4¥©ÓB:§n[äÝWìY9!;M—·©=é5 h>î0oòòQ&ôÔwƒÐÒü¶NóÇC‹™|Oi½+Îs2õ”·Lñ#a/ϨT†Ì.o«º‘!æÀßÜÐÆ̏b.h «Ž§JŗË%è)ÿ‹E¯h0ѓ±Ñ’@€!j~ª«Ç:=*=»ÆhÁÈÙÕ)‘{ÂAŒ6ÕÑÌïrg +Õ-{c¡“ö×µöÇO6½\»Îh§hՅÉÅ÷Çר0IÃ婳ƥÌÑÁ +&ä¯5µ™èÒ®­€ÁgDTH“ +ÙmÒ"A´féŽÝd›ö,pV´È.Ûpà]‡¬¼SSÈcûèÀ;ì]ƒð\à#ݎȤí”2«1WJ¿‚èÖOyc<1sÛ#d>}Ð\´Es¹yLëÏ݉´íŠ7ñqˆ[˜€L1ø ¦˜vV€n)¥•Ö`æ‘íz|ô=¨:µBZ–€ôäMVu5”@úM‡5ÿè¾²‘cµ›\ÏÈsȦ‰<˜ëNL“S"O³öœçJƒµPÈØóù;TdF¾—ÁNT-5;].þ,PÚZ›–mS6c-ÓcՕê*X÷ñµ‚Cìz,(…qÖÕ0»¡e'2ÆËÒ¢0êð®<¥8öëYŸôú¯ôx*8ªqÕë¸ÑXþÝx¤®Ú]ÂùâÀhüç–X^fEǒìS!1àÏ?¾¼»“&YڊU +(ƒôùÞØ çå¾²Iÿf„G8¤©aè¼Keò/äÃ¥ Öc´Èùøöý;óŽðýÅ:ñ%ÔLå#®©8[àæ’À¯^qœŠY$IÅŽæ6«JZèÎðßät ¸®$q¾x¯ùîFz÷ˆ1>fu~j¥Ïâ—lœûWo°3MþXò],â ð¡;’Q!Ø¥fAÞÖØýpï„ÂB‰Yí…`Àjƈ4¶};«¼,~è —î‡¾sÿá퍀yùF†ùÎ÷oWñh/jZù¿™í´>Ï ZMñ ù¥Œou"ÉÚäÆpb3šZ•ì“PlO²ž¬‹ãIÙiD7"Å"V4S®"±"ÀÞBžyv¦Ä* @Àå3‹¨ÔÅÿ&äuª¢Q´ÚHƒLÂ̕hdÅÛñ7_Š,]Làë™øhRÃ’B 5:±d™DóB&Ñ·ÁˆÈ$`{×evæVYà@„[£#llrV®‰°BkwÉ~v­hŸºš¢*Eá»Cœ;kçäœ#5œy[hÿžl „üZºXßH²¢÷qʀä@¢fêl«ê³âµ–v;=©Þ |mSìo݊®pӉE-ŠŠnFã,­x©ýÖJ¯4f7/¼Om|çP”púdŸlBómaS?q•áGz‹`“ãïo“6À‡äàN;¯™Ÿ¯‹@™N'“ÖãsãYº~hÒVÈæ¸kç ñR镁ÏÍ%‰A« ‡õdF.vÄDÜ{o˜;•oŠ¦eh䟓žÀõb䓍]¾ N:ÂKáÊX8€©YS<(½Qð +p)g»‚f‰„ Ãˆm%ùSŽÂh˜°Îœ‹×õÀþ±„S‘ç}i‚‹¬*'"Úõ%ke(Ë~¬AzœjwþÊЧÌg´>Ī1™ Úp†¯Kf‹&8ÕOÿ½–þôBV(|Êô(h!EPtƒ]™·`F(Жd.W ¢ÐÆ·Ô´—‹¦É)€–‰¹®E炈š !ºàG˜­ŸÀOSõ‡æzًD<ßx0bt˜*/pGá…Ö3QKó5âiY)û舴;Ñò¾”è}oØŒ§6(Äh¤»ŸlÊƟ¤N›QÒ®ýþÚС»›qMl#|9€lî±·!±µ_˜Éz¬ëçÙçRðpû†.«¹VôëWM‰@¶!IÙÁÀ÷ˆ3×Á¡YÚßç 2ÏóõJÛ(ˆ"n ¯4R÷TÓ¨­ )R9 §×ékés‹¯ì€Z©ìyPçé`´u®:Y„©ýyB}T—AÏÖe¾ˆV>ë ksTAŠRÍPÜ>R$tU‘9Ëà<M¯¬ÊÚèg薡Jï}ÕFîX©ˆûTó™Qä•8ÿ¡sæÔ¯ÕáWÈìÏûœ¬Ì­òô6$êÚ؇²¦–êC¢QŸíDÃN’‹*2̂²‹¯¹¾Ø¬®Ý¥W±Of*@™l'žn(âkр5hr¤ž|±Û/³Õq='å@'¦ˆs)b×ÉÚõ\éë®f%^Ì`+©Œ„£Ôâd<\Sµ‹¬ù’À]#c;å_’–PCTÙ"Îë»åmHië™°jRê‘Û¬›Vp98å"Ö½<5¼85ôÌlhâšGIêŸ4På»I– ’ìÊ×ìɨì¡6Лø(Òºçf×éKÐànòÌ1Ñ _³ñ¿þ׋e@Y9쇻÷Bçå÷Ÿî>¼2¯–ŒnùÓÒ#_Mfc³­ +6ñ¸ +Df“sD€q}më½ó²¹(ûÌ)4ϵw øм;¦®}¿÷€„•UGÜN–K@¨•Ž”Uy1Èf}æî±p<ßDVI7q-Fƒ8K –8pØqMuWA[Ð(²\úÆÖlÑ(†Ð3 šô,wÌزv<ŽT£Þ@Neùœ §Fëj6E ªŽÛä…úR´BQHC*7úÊS*šê Zâ-hÆNÇÊJ¾Vç\*—HAsœTÅî 'Ph*©e÷/BD¹²+HAÏ µJÊ)ÌlmxrYÃMÂè'¾šø$ÐАŽO/¡Rfv(a +Å4iÓI؟hؤj aí2+ ’ÏQS]JGÒ!Ÿ3oMi,jàì»Zƒž'ò1`í³Ñ™–—ë–×ô>ó™ˆK1'™hÎ"Œ‘ÄJxrqÊRÌ"_)ê‰4<­9µ¤>ŽÕJ@X6Ö¶L•¨6*#{˅0¬«ßíŸÖ™ñaS;0Š Š”Ÿ[jʪ{<¨‘ìŽ[ûveMŸ=&jó¦ØHvöµ*-šÊfÕ6zXTÐÊÆ'y9 ³±ÅHÞƏgⅱ–¾×%êØ×Ã1¥3 !vhmd”nGÏxÓç¾óœ µ<Ž•òæTØ!{]ßt: +ëxöÝùþDâøóËówŸ¾í0X2ü@% æ±9hÇÖ¨Ó«Ú”؂þ΂‰/y†Tšj ñxÔ¸Â_O¼óÌj£R}TâÿޒÕY֜κ‘QQò˜âh‰¯8F.æ¹îq¾¹Ø–Uâ!Äî3_ n"ŗU+Л>ðÆɗ/äXS„„X%A ñ[Q5=Ÿÿ×É»–Ê7úB÷'tŠýȹü­÷vûÞ¦éÿ-°§ÉÊþ¶œsoò¶ú=÷ÆNð鿨_ÊWß»×Îs¥u¹hH¾ÛæúEÅ¡Æ ’Ò”Ëä‚=ƳÎ`ËèøÀåÑ`Gð^{êÖ…+—sá’h­D֞&šþF{ƒ?ˆ¼µþGP=aÂÍ&§…QÝ×Àùᾧª³;ŽM¨ +.••7l¦v´ÿs‚`wž¥ãsà6€qh8ã¨Fu¬`£¦6€–Ðü¶ _»î8Ž­K%l‹(s·ª;*C*‹ÂƵ1°ûåÝÆê{…œ¦¹·Q’@Fë9öϳSÜI¼I ‘N`å?˜j4×Í%£Á¢b«F•ôf˜§•GôNu‰ º¶nhØ3åå}‘ Š>¨ä³?÷øMÏ¥uÌa¤!ÿ•?δˆÎÚgd¼É-–9^>Hö镍l©*¤”Pe©¿ÙÿGkúW¯h³J¼Íßý§—ý‡W´Jâ`£ÿð +“U^”0‚@k´õ1•ÝÞWÅù`èŸ <ú.ßÖòtƒÎKAy§¥5ÞÁÛÕ{Θ3ýŒ+ë &¼OˎÃâ@|®•‰„tWž»òÉ=òÿœÖÎGcô0ä>/lëŸôO»p´/½Y¹>F$[nÛÓwϞ===­²fՕù©^åí3$6Ï.Nwr8ž·^…Ib©ÈËSWP]Jë¶$4¾§ÿ'ˆàê +endstream +endobj +293 0 obj << +/Type /Page +/Contents 294 0 R +/Resources 292 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 284 0 R +/Annots [ 291 0 R ] +>> endobj +291 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +295 0 obj << +/D [293 0 R /XYZ 90 757.935 null] +>> endobj +292 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +299 0 obj << +/Length 3241 +/Filter /FlateDecode +>> +stream +xÚ­ÙrÛFò]_ÁÊ˒U `p1o‰¯(±ãlYÞª­$1±G¸úûíkR²vªTÂLOÏÑ=}ýÕýÊ_½¹úþöêùëD­¶Þ6 “Õí~µõWixq¬n‹Õ¯kµ¹cýæçÜxÝn‚l­5÷^6»á¨ë>ï˦fÐÛr§ëÇ_Åë Úü~ûãÕ«Û«ÏWìé¯Ú#N½TÅ«Ýñê×ßýUðW¾§¶ÙêLXÇU*øV«Wÿ¼òÝóÆþ켡òü$æóÞìaçp»îš­þ<”­.°—­{½ âõûŽ÷MË ]ÂiïÄùÿ1([ç­¬Ö7 7þ؄þº©†cY7Cgùû›ï‡=O¬h¿ûò®zØ$ñú@•Z?4cv‡f¨ +nŸ†~vt\§íd¥¦Ö²MUv½. Jìç²øsÞ6Fó·~à[É;þš£A³Õy×Ô9œ  f.‘€óvýWܞò%ò‰Ä© ƒP÷e=èÙ­îz³<±çÿÉAN~ÊïuçY*R/ £ñ:ÐIS +P‡; ÿÀP¼=üÀ‘¶¼Ã+à† ñý)ÿŒGQt£§¹GsdE:"fp=ït[Ö÷Ü=6­ õ`(ÁßÊUäœê8t2_iáBÊzW òÄÖ9~ÂõqÍÝ¡¬õ5\G—¡yàvºÓæuwÑ#6Á$ cøt¥¸DÕà)±y†Myž†ÕfèŸL bNè@w«¬ùËCO®ê’—0yãáHΟ]s±~ÀÍ\׺?#JÓ~ÂÑd]5;1ˆ»o›#·Î‡÷Ã&ßàÞëZ·(‰uVº:¾,“lì¸}@‰§“ìvºëx”>„Í&„mêªÉ‹¥«2kf‰¬y lª‹¼-8¥±Ú¦ovMÕq7çR_éîX3àâVË2z$žðe¡aÄî-.î[­§˜yQèbÙç˼òP2#¶Œq,Æ'Ž€JÍÑÔx]å}O&ÚÍ ¯æÙdN,‚N“òOxlÍkÆ„GO-ˆz-¨`®N­”ÀÝꚧØ5ïÄFÖܝ(3JÇi ђB§VÉÎk¥ëÏC&©·‚Ÿøl¤aœÔ@VÐA·{Ó*;¿Ô@v4PÎeU1¼Õǜ÷Ä%Y‚E¯d¥†Þ$5üÎXùïnT0 ց;e>¯  +Þ3<ÃtÞr+ßó=fÆ ã ;¡/fÝ4收’Ý-“3ßeŒ ÷)À¹îúJ Ýµm†ûƒÝeÑ"‚Õ¯{qL4‘œEŸ—•n;Ç)íCÉÅ_è¢ãR¬¿a•ºàZÓ%ÃôN ¡ÊG¬…8®ë¦1Š ${”À¸rh óoÉ> 4ò?4­lH´¸£÷ÁÞY“DÁÎwzO®‡7Ÿê™}\\<ü’üä§Ý KØ«MÙÉúòlÊÄû-#ûxËÖ£øl™Žp§§ÓÀþQlP2 Êí'‹8Áw89Ç/Бh¢³·9^ö,Ĥûœ«³`!BKÒùîý˛×7/¾ÛlãõíÍûŸ?ðÔIÜ8Œo´çxè(e·üÀmGâ£Db_(LDf‡Þ5E‰qÑàÁÚÁH$`‘‘y8Rà¡.è²"c*"ô5 }7]¢å¡áì”jQíîœ@Ž"Ò̽@œªb#âÊ´†­Ž6ãҘ ý¹1ô(ô zWvšÌ-Bš-Iä8"5e +-–È”ý“”‚ÞªbµI O¡Ñ6d™ö¥“!Çë†i`l: TtN»Ö…³"(óÖ=Ê¡­1OÒ˽&”AÂÀŒҝµU´ûÔtÆ¿©Î:~kÔ±²…¹©MTÎ2öl¦ÄÆëû9õ쬁nÈvå<˜Ð}—¶o)34©Ý*H¼He+à·g)“ú[Ƭ™ȼ(ÙÂ!ç-èyzihQ>⡕ŸÐAñËa–³»/ûJÆAžæ÷Ò£, ï;¯ú&4õ“i^„U4”{ÆÍÞ ±sÙxÜ e’ƒž'HLgË{Ùr?;­#ž¸ž åZ¨ˆ /¦xâ†.-OII„JNbaıÈã õ’#ç¬("YHdòÒº•¥ÏÒ²´›à+C¯Æ#6…Mù*d üƒMûÀP±oöÔ ™‡dr¡å +2$;†`r´ëˆpD£Ž +}• +ƹ]~”–¹hR_Fž2 &î tí¸ÈA6hÚ"[J\,Ù+*+v‹ 7½ éÞÑuÏ¢r'ÝËQ¼©>]³r\  ÆÍý_úôý#úÖ× ¼-)ïÅ|²æ¯$lÁD¡ kŠ$6eÎâ# Žšp$«$;ů¤ßÐ2;’HwXcpϙ=ôZݝ…ãmì/4»ʓÌß[uAb¦Ö•ãåíÌv#··bà2S£ÙÎ  ¸…~‹e¡{-Õ¥­ ˆ•ü+@l(ÏŸI¶km·„Æ©kQž¨,ãBò– ð‚@¹µŽˆÍœØáºHWÖqÃÙ»ÎME"ç„Í_N·¡±'9“„C×TM¢i¨¢´”‚è âÐµ­°gã ìp­w`IØe·d$X·Qãߨ/щ  Ê©¨,•Ó¥0u¯FMvh1vŒÇâøS¾öÙ´ ¸°&Ë9³BßK"õÜz‰qÑ"Çà¶RkE~ÍÕ­›täU5;¨‰`Àœ$ä ‚±î¯ä S¢¢(ú +¢^=BP6) +©ÑÕ\@ËO`ƒBÙZۜ19Üޛò¥Îº4G¸þXF…†¾8ªä‰ÙYڐ’۝”^o’@X”|‹^“×]ä“ï…qjðn¸$JÁÇ#$ºÀ"ÊÒÌV1RcüÒì‚9 U¨òˆÀÊ>CX ^@\(GðîʦzˆÀÑ©òp–V,Ô¦( ‰"†þ<#Â\A2"wÐz¤*Xq£ô(ôÝô(”É òräDg\Ûäî&ˆ¦®‹A°ïtÅè£ýݶòÍ¢(Ϗ’G4J):Iú ñ&3GI²p¬lí2„ÛQA) Äm†˜ÛDXg*sPÀZêgƼ8aƒ†óZH/f/AæS,zÚG$Àrƒ²Z䄩œÕÿ±Pÿ@Û+fl$Ö¸§®åK”ó‡ÇÒ$ÎôrV·(dTO¥”¦~j%öÂü˜£¯ª›¥ão½LËB¥¢L‚Ò(³ „¾ª)Ô/¸÷¤ß`X’† «pd ëÅ•SCȋ‚÷¡‡š"µéc1 [X^|6¥w†ˆkÃøå`„ˆ‰º NòÙnsٗŸã°[sÆxNÔF YÁ`7‘ÛSF4Õ,”Pñ܂)‰$Ô,#‘!F ÆÕÜTº&€-ÁâÃ~±ÈÁ ¥Õ(i«ԁûã%.qƒõð‚öe²àÉa¦©3èó®Õä”qˆÓ@îì͘×jžÃ4—çY8²y©ÜF¶%$a*¥àԘ±4t‹€0L¡@g ¦™5‘@bà +aÜɵÈyñ“ +j!GÉe%–G„ºÛµå¸E{*åŠÂB¨=smNˆ)oËe¡YÙсp]?mí¾Ä\üøhêCóG¤R#½Ð˜>öõ7o3ø"‡Ï¦{ƛV;pd®)¿±:«O^ŸS“±BÃ>eâÂæ3å‚;Áøã>R…Ðk¡m"†¼‡¯Ü÷F_IiI™Ò’šèG ¥d„W¥¼÷¡q);=™θ„øT±;ç€Êú‘­¹Ç¼€ÆDXž®’Ðf)›]ø҉rÞA*I´ào)ÀöDàºo¹Œ‰Ã\‚Á;œ*­ Y°æ¯5XßúZ5t‹NãÂéº9ò¹2®¦ž=ý; ¢ŸŠ,·ù=‰¤¢‘f“SÈTyf2ZvuѤÉ4÷ñI^ª¢ÙKØ]íå͌¦¸èαկÓñgéìEñ«´?\Ùë¶{üÝêO +cóŸ"%™· ²¿úK$ó ¤X•É/â­ÇòuËÆ +·G¼/ñDS=ÀE´9¾-ïڜŠœÐyÁ(oóú~à’oÀ ¶{ºÍ€>‚²Ñ"Lx—×üëÃbΔeô=ÌX¤ªüÂ^-Ì`|Z™ÖOhFc‡®0Ê<߆„‡¾?}ûüùù|öv7Ôå©õÊþùéT=ŸÙâ s‚ òâ­µÆ,Äp0.ì! eÉKÞ/ÝÓÿkÜ9É +endstream +endobj +298 0 obj << +/Type /Page +/Contents 299 0 R +/Resources 297 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 284 0 R +/Annots [ 296 0 R ] +>> endobj +296 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +300 0 obj << +/D [298 0 R /XYZ 90 757.935 null] +>> endobj +297 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +304 0 obj << +/Length 3221 +/Filter /FlateDecode +>> +stream +xÚ­ZY“㸠~ï_áê—ÈUÝjÝGò”93»}Lª=I¥vö¶è63²äÑ1½Î¯@€å–g·’y2 ‚ ‚ÀGÈÞâiá-Þ_¼Z]ܼKÂEîæI,VÛEî-ÒÄwãÀ_¬ŠÅ/N¸¼bÏyÿ‰Ÿ9RRïM½é÷²êD§êŠH·j#«Ç/Œ?^þºúéâíêâë…kz _¯§nƋÍþâ—_½EôŸžæÙâYsíQÂo¹x¼øû…Çúz¶Þ±géí{‰…Ù" B×KbRþsÐòfÞÉf37JrÐÌ?»Èz*6pã<1,ï–~ìÔ ì-LQaÔiå†M#o«Nu¥,hèò¯›/U½ bçhOíÕ^§‘uùFj£­Ø^^!-w>6²•Í7\D’¤n'‰}µËâD¯·DÆY›+ÜÐâš÷píûn³eD…Úe¡s˜®’EŽªh„¤AcÜŒŠ²<î×m'ª O$wuÅZ?’bé;›uˆhÉÙÔUרõ2ðœ¾Ó†Ai3¶Ó»ò^ìçFÏ,F[áI¡Ú#{)¬ÚHU¹ïX\“C\û™›xÙÿàC·g|(óBÃ2=Ö0ÉȤØЦÀƇjy 0h-%ªɹóHÑp2Ë\Fð¸GN_‰²ƒ]4ŠÇÊìªá¦D-~ëXj™O8ÑÙZwð'ÜÏÄþƒ€q«~¿– ߜ +34äמÏ·WJÜÒEà UÍðˆV´ìDÃ#Úyl¡­½¾¥í<Û»Ù³\ð]ÃòF–²Càô¬ð[êÁˆ wù¶*ê¦å°à‚½½Äyìõ5A13öâH ² ¯yQUmʾ0¢õMs¶îêB}ö¼è$IûÉIþcéû¾ÇËýhޟ¹iä&¬Ñ)m ì(Òag0*‰¼Wµªžhx°v:–´æ¹£Ù±75;ÑÐUǙ úX+TVEÉ£BϪÛMU3W÷41ìÌ¥Fgå›ó£MýpÎÔa0‰ô|:ÿ\fx)Д)oT»)…Úƒsp(S7 AÍ)xŸp7ýœã6,¯ƒ~:ñ0â`·m©i>u¶ ¤…ë½è ”Ñôvˆ‚8^7ô+YAÜ7Bºè¨õµ¥‚ij=2's€áëªÍqè’Øùì‚ÐÑ }­â\”ˆ œ„- ËAQÀŠQù=Q9P%vâÔ9Ö½r¤9¢#Œ4Ôª&´ÅÛZõT‰Ž¥µõž[fcÎÏHØ+›ÙÔhÇ #«YŽ>>õRˆHtVè 5ñ5ñv;Õâ>ШEAcœ4tS‡af­‡aj”poiˆ€ÀlÒCò£¥fÎàĒc;2ØÎõ§%dö@ˤR¾.F^ßsVÚ\V¡ö¾où¾®y´ÐgÃTsÒ'w¨Fœñý ¥Uƒk°jÿ‚ ÀDp‹0HÉ-°¡ ¬ô3†º`ڂÓІh JçÕ¨×7U6ÕÑ/ûtK=0Ǝâ)tŒQGZR‰¢H’«ÎXÙ>›Ð‹N.>RÖGú5§^÷-0Õ+ÙBÈK¶–#Ž÷b(%n +ž!€;»A!0¥ž-%Ïit,ù¦LHÑ\¦ôk¸åCz§d¢1Ó9uf³þJs&Ç~¼ +-9vøŒ?atXtÂ@;#ÆrbèiÀ¿dxàÓ§žÁQË*Ûù“‚ /l›(¡‹œ}+$Â}¸ +xÐ,êښZ€ÞÆF™wÅ@jµÉŒð@é¦c +ò?ϳÉI.´1Ø!BÿÅ÷äu’3c†¯î^}¸ÿpÿžßB¯?ݽ½_=Î<³Î"ºÀ3@ßCܵ_+–<ó>ðûà†ç%Ò ’„fÁ,-ñ4²”¢Õ»ƒÁ¾* .°ðáâE»LXÌúp¾Ì̃k'G¨TÚð3p"¢‰µ̈DØ {;ÁŽxxíå©S„€­#ááÐD`b”¡l„lRa4 ¹´p†¶Y§¯ëùW®î‡vÝÍgéفd#¡QO FIäá¸pŸÚûj4“(ÃÂLÆ $lO4^'$8„¹êà‰–Œ‘üè,6gïã;Áˆé _1ŽƒªãX7ó\º27­8ü¤õNKËÈMSoˆ¬Ìpr#)V¦±½‡4¶÷½Jz­ñQÚ¯÷”Á I9àÌ#“·ô˗ZÖåÉL(aû¾ìÔ¡d!ഐ-7ºݹ·,gk ŒG !å!¤<2‰­ Þ3–0t­)×ÈZHÀ%s» d“ +Ddæ!Õºy¢iŒÚcoΣ€lyˆáRWnžK¹Á1ت†–IÞ3>W¨-.±u(bSџïv÷â îBRÓgh +nؤ:Rè +iŒß†ÖøĆ÷J¥¾özRÀO1ýÐ!̂íîdI®<.¡:ÖJ±Hx”‚®X }É3%kŒU˜t¬ÿŒ±{”퉥ærÏXØLeÈÚfâ(6ŸI*­Y6H“eË+ bí’p¡«$.¢;ËþCÑ*¥sž‹Å¿û¶ó¯ÉÛß+ËOCÌÀÉõ +‰¿^z^΋Puæ“Á|œ8tÕÉ$KíD£ `1G½,1•¢ÌNð™ýµFZ¸ËVYË.à ïåßÀus¼¤.Õ¼ŒaR-A‚åTÀg%œ™8)yO— J8Fö÷Ëhòý2²´AtaåŽ}ÝM魐Œq¿‘½ß(±KQz*~öóè±b´Í̾k'a ‡Þä»*9 ŽM +{…ùxc'ªï +·ëlîåïCÉd€’··o_¯><Ü?’¤‡wÿ¨L#ó´ŠíšÒ 5ÅÜP–Ãùê~՚Ï&cÎ3ïShX 45_t‘1(Ðl šF6…ž˜VÆ4z®¾îçÉø˜Ã@€äZô QENŽƒºÌÞR»Þš ª¥ÃkɪšÈ;¹?ÈníÇ)ÓaKЏI´¼0Ãœi>3À*­Y?ÁEÏüA. =ëd4Î_€à|Á¹Á9\ᲬMA3ô ¨Í¦×›ÿé1ŔÁ&$¢¡ñ5ܑ½Ñ‰6ÈU`¿”r‘ÅPΤ?Û9¬=\*«*ñh§\àBpу‹+ÐÅ÷ ¤BL8œ¶‹I‡ôÁ̤hzAÀŸÁµ¸"Ãÿ¸\£xÅ©GR&ü^—z´ßqÖï“iÙXñ'[S,‰°ÔÄO߈®qÚ@5âÿODÃJQd=áõ|Œ#s«£‰ÝÌr…õ5*âJÒmÃ¥Ï. +ê“E¥ôÉÎVièœÍ©£*ºÞD杸"¥h˧Iܼ6̦ßOOÿn”dnîgôßFæßE‰›§aÆÿŠŠs7Ž'/0t>¢Ê¢Ùë¯ôó±.;Y4‚FoÕºÑß±óšXnEõÔëÚ,?úm¶¸G*aéœ;¸ÒîD¥ƒŽaÕÇz9Ñs}Ï °äÒ7ŠG)Ùd/ Óú?ÇÖ¾ Ÿ»ÞðAx×u‡?ßÜ> endobj +301 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +305 0 obj << +/D [303 0 R /XYZ 90 757.935 null] +>> endobj +302 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +310 0 obj << +/Length 3215 +/Filter /FlateDecode +>> +stream +xڍZIsÛƾëW°t YeCØA䝛²•Ø²ŸDǕJrÁ!9O À`±Âÿzl‚_„™ž­§§—¯›²gû™={wñÓúâê&ôf±‡n8[ïf±=‹BÇ +\g¶ÞÎ~Ÿ{‹×n`ÏßÝ}áÆM¹p–s¥¸÷¶H›£Êë¤ÖEΤ:Uy…ã¡ís'\ü¹þùbµ¾øë3í™Cg‘yÁ,=^üþ§=Ûýç™myñröD³Ž3ßõà›Í.þ{aÿ#¿®gÙaÀüFÖâµçØóëEÌß½»_½»^ÄÁ|}ûéŽùûz»~Ï­Û»·«Ï+øs·–¡,ütÿ˲|uؽsìÙk'²B×çc®a…ÌÓâxҙ¹½ëϋÔÅ #!î%OÓuń­*õ¾ßðìÃm'˜+™ð¤ëƒl {–L¬Ô))“ZŽHò-7t¾U'ø8¾•Ã«þé°'Þ³(«WxQºšcŁHPÃU<Û£Ùô•~Âàg°¯ ïÃU]”É^ ·Øêª.õW6,+¤ÕV7ÇWø^Ñ\WLL“,S[ÙR&^&û}©P*ûJI]2]ËÑ$lZ\œðjçRï5“JU5Y­óýÔUweq‘,}y¯¥7zQAÆð›5Ïh*äüÍôQˠ촎ߌ)ÄTÅÓHMºcýî؅ÿaøóª=®6´ç¹Èåü§C2>T@¿\5ä«~Óۆ9YvïÝx~R%ðvãƒn|=¨œÉ²ç²¯ÂÐÓ²JçiÖlYKR¤&9÷Ç/¯ìÆKØÓ,ïÜÌÞ¤îÐ)ÃF§Svf‹™šxDc`Àý‹AW‹Kâ›@c̕¬:èô J¡1¼öX©¬³I ½l´“lÐc÷Ù0µÚëô<Ë-*u,âÇƛ·æýK&­‘=§‹ü]3¥T5ºTüLH(d›J¥bqÐñøC¶³Œušl29 -GWB‹ÒªnÙrfîë{Òåݛ9ñbB9±GÜ81ZLU1¥> !­È“I¶ÒÎLRL€t)Ó¦ÔÎÌ\¯=ùŒrîH¾8­/_™uLÎ<¶‘cOY’¢ö#­vÓþVÕÔÕk1Y0æ2IQQT=òÄ$ø19Ÿb€ÎG³&-Ìeߟ§2Ѐ²Èu*}P”Ny³övIÞøìUvS,¶Ku5åqŒõ €þ®(¤?¡é>éJu‚Ž{Ǧ=U‰˜¸§Rç5yè<ã™6KdùPÒ}C|:Ù ®Áb 0À#K]Ê-Ö÷×w:˜ñ¯àa½`T&yÕÆßf¿êã]òJƒ‡¡»A?áϣ΅@ßc±Õض›š¨:8G-ðyUðœsÑÈdT_l B±bZÝñR Ï`IùvÿÁ¡×Æ(§Þœ]ØV 1ÝF²Û@sk=t|g~¯ÐŽ0<ÓÜÛ|Û³j–:!g³xiÅ=†D8}È8Ž‰”^uR©Æ¨‡“)́ ªJ¸9þOZ©ÒèjçÂñç 4pý +‹ÏE”<›ä ’7N–0ÉÔ¿Ž '˜VG™SÈÁ€ƒxhJ&0ޓ ô´áªíV‹”(Ó·C‡—Ò9¡èó-Màjã6'˜A²a-Â[Î[8dÝ íNHMdïep²@… … +¨Ú¡#h&€„½©kf-Âp#ŒçÐ%²gr#Ò£N»Ù€<×`ꍸ$˜÷u±DŒ,×By««4Kô‘õÁõpLìŒ4c#:†<lÆæ¤$# …V'oj_fâ^«|Ÿé +-ÀûÆR(?ña«EZØ¡{ñ¸P:%íW7,Ì&­0;n;Q€€ön…§41+ÍfÉÔÅ`ƒœ°€ìs£ê'Ex40¯5´záÇ +Œü‚h Ù#!ÑðÎÌgë ‰W31á._—I<õ.‹ö€O,Ÿ)¢8Å>3ö˜B:ËLLS]dÖًðеÙ|ìeçT‘Fzm/E vÜ÷Ú¶ w ®0Քd!õò:}Ì <ò h{’~u‰7‚¬ìò-äh);,C#àÂ÷“½³¡·§ö±èÄ3ÿavÇ6\ÛŠ#‘¹àïgpáªìcjΘ¡AÁùçî³Ýœn·N²õù¤1³h! +x´¹§4ÌÒº1oFòúDD°ºÿx{‡á{PÈ¥ç4#GœfäJ&‰a@ +Ev!œWÍ&ë¼e$‹Ÿ…}ؙ¯ +ƒ=5ãÞTjž–T}:èhU‘£g¾(;>Н€môáT?06‡‰'pzm­g‡&§ÃYI]«ã©f:e(v0–…çÄCYxpÏN¼†‹á3Qx&AÀÁNHfNC©yè­Å.è¤`wLšº8‚ÕˆÊyÎ}ä”sz³ ”<`ÊHe¡ñ|Sh÷ÄBh}ϦªºœÓx oÍOIYs¾ºåÆ!Aþ5áA¥JU/mÝò”Ï3uȎ¤T=÷ôœ#’/ Ù¦M;°Xׄ…Þ†—2‹xÆå×âñu-^œÒç1 ¤C<ê>SfZdÇô҈/n3} I*€UÜÓPPZâ¹/UDڀå÷D¾å¡Ñ#ƺaÀ¬Eéø$èéL-4‡`Œ©˜´Á„bÂÅ=.ãJ +PØ¡µ®CŠÝm™ìj†™Øݜy”EâÚâ ±5tÑ46pѨ“°’tÒ5OâöGåqlµ‘Ìvç[ýÛO<¢XDÁ ÷ûÇ蠟dǞ‰çRöÄñôPƒ^N 3†ùÌÕ«MhJO´8¡-•1åü„?=ÑR‘TNo h€4íÄuǂž àžc…KYÈʱã5®¹éj“ºÿÀ‰`aa~W Žb§‘^÷ãÛdpw} ÔÑ—`z\b9Ñkñ“×ÇOX'„¨˜w¥AÞvðÝ3P #T”'ˆxµÊ¥FØUº­Z\M=ÒÏü4`ēl³õ휔CãÔÔ/– +¹> endobj +306 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [258.676 310.234 428.041 321.138] +/Subtype/Link/A<> +>> endobj +307 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +311 0 obj << +/D [309 0 R /XYZ 90 757.935 null] +>> endobj +312 0 obj << +/D [309 0 R /XYZ 90 195.555 null] +>> endobj +308 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +337 0 obj << +/Length 1531 +/Filter /FlateDecode +>> +stream +xÚµXÝsÓ8Ï_áéË93ĕ寘GJ[†£á^€é¨Ž’xðGN¶ ½¿þvµRꄤ$7åÉÒJÚÏßîJfÎÂaÎõàÕtp~Nê¥1éÜI™“ľqߙΜÏn8ñˆ¹ïêYWHOª™ü1ü:}ë„~à± Vz¯Ÿ up9ü3ðÈ_ó‹/ "'+Ÿ¿2gô·ó‚tì¬õ®Ò yß¹ü5`[ºEÎt‹CÔÍçÜãIê$ÄŠzvýþÓp3æ^))iôºÎºRV­hóº"ÒMžÉª‘gªx~±žÍ£€øŽxZ¥Äw2=pêÜ]Š!gî÷¡¹’–&Õ0D +\¡rQµD¾•Êm^À4ôA­ºjG5¤ÓŠöM‡ V@ùÑ6$CT3Z{%²o¿¤4õœ.”¤µ‚Jjž„àÞlItÑÐ r3t%Eʵ¬¤F‡Ý=p …›-V:b°c%U 1Ûú¥ÌÅ°kL0µ¥ÑFe oOe“DГüИc× õ¸MpèI>cšÕ:سò‘ÍYÏß:ÝìIZ< o¤²š¤ +úyc€ª£ Á]Р$Þ h¿ã‚~èJ‘ú ɼ 67¢Ztb±1RgŽ•ž¸b{U Óg?^œÏ˜–,týñ^¹ö«íCaÆ%7ù½êÁ +É[ȋü_["SqpÅa³tP Ä ?U‰¿!þ%ªÙH½XÊì¦Òaky˜&®Ÿž$èRéªUX¾ãŠ'¤À-ÅC§3Wî?-ld÷öðk÷’‡!ïa>ôηdí&ÅȧŸ‘÷E!šæ´Ìˆ6™Ñ;|ƒ?˜!aº›"Â6µ;CfۏNõVuYkg]ešYd¹†¹.™í ÷’{•K“m3Ùd*_é†øò@XvûTî?¬VÅÝE-ç_ãY]䮋-öˆqÿ…E Zlèê`n1ïªM§Æ)ö ¹¬ÏÜl^þa<ø±ÈåOgԞ“lŸeÕBu²ÊäÝíCÓÊòÚcÓÞåàtÑÖjŸ±!Kw }c,®õŒÕSk,n"¾º#â&7~3­ÆH÷ B†Û4ˆÑZ妀GÁØåé©nY ~í¬g‡‚p²±I%"`Ï ‰ßfÞq0áAéüÿڔlÙ¥n}íñ0‡ÂºkiFæMk=KõÔZŠ“Ìñ ÂÉÙFŸ‘“¶G‡<P¬m# +“Q¾ÝšžtÖóãÀºáT˜ÇÀ> endobj +313 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 448.891 513.996 457.867] +/Subtype /Link +/A << /S /GoTo /D (subsection.6.1) >> +>> endobj +314 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 426.973 513.996 435.949] +/Subtype /Link +/A << /S /GoTo /D (subsection.6.2) >> +>> endobj +315 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 405.055 513.996 414.031] +/Subtype /Link +/A << /S /GoTo /D (subsection.6.3) >> +>> endobj +316 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 383.257 513.996 392.114] +/Subtype /Link +/A << /S /GoTo /D (subsection.6.4) >> +>> endobj +317 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 361.339 513.996 370.196] +/Subtype /Link +/A << /S /GoTo /D (subsection.6.5) >> +>> endobj +318 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 243.862 188.187 254.741] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +319 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 245.765 513.996 254.741] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.1) >> +>> endobj +320 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 221.945 293.88 232.824] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__const__iterator__tag) >> +>> endobj +321 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 211.892 513.996 220.869] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.2) >> +>> endobj +322 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 188.072 229.144 198.951] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag) >> +>> endobj +323 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 189.974 513.996 198.951] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.3) >> +>> endobj +324 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 166.154 193.727 177.033] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__tag) >> +>> endobj +325 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 168.057 513.996 177.033] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.4) >> +>> endobj +326 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 144.236 288.351 155.115] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__const__iterator__tag) >> +>> endobj +327 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 134.184 513.996 143.16] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.5) >> +>> endobj +328 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 110.363 223.614 121.242] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag) >> +>> endobj +329 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 112.266 513.996 121.242] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.6) >> +>> endobj +330 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 88.445 188.197 99.324] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__tag) >> +>> endobj +331 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 90.348 513.996 99.324] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.7) >> +>> endobj +334 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +338 0 obj << +/D [336 0 R /XYZ 90 757.935 null] +>> endobj +18 0 obj << +/D [336 0 R /XYZ 90 549.704 null] +>> endobj +22 0 obj << +/D [336 0 R /XYZ 90 515.718 null] +>> endobj +26 0 obj << +/D [336 0 R /XYZ 90 344.656 null] +>> endobj +30 0 obj << +/D [336 0 R /XYZ 90 312.593 null] +>> endobj +335 0 obj << +/Font << /F63 177 0 R /F65 179 0 R /F50 143 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +378 0 obj << +/Length 1381 +/Filter /FlateDecode +>> +stream +xÚÍXKsÚH¾ó+t[éàažzìq½!嬓b×äd§(c¬$"‰ç×oÏ $^!6®ø@ifÄôtß7Ý3ÂÞÔÃÞÛÎ_ƒN·2/AIHCopï%؋B‚%Þ`âÝúapAöß“åLšößÅx9—yÖY‘ ÃTŸÄÁ§Á»Î›Açk‡€mìmKD(bÂÏ;·Ÿ°7ñwF,‰½•þ×Üã”ÁsæÝtþí`ë×îSÙ+§Öðû<'˜#1/¢ áP÷‹Ùð­Ìe™ÖE9¼y¬j9Ž‹¼ª‡YmGëtª}w‹y·,áþxDÜ\È +ÂL˜Ÿæ“@¿»_æc}e»~QšŽ±›åS3GCÃSç…ZË#%œ{„ DX_+í]e@†Õ‰õj;tÅ %ºz‹[Þÿ:ü‰QÂò–'ñ¨ö`c½kb£†46ªÑÀFw6ª³AwOŽøö"!aè³äWCÅ6Æh_Œ/ÜI‹Äçä©5Y+³É“TíËÂĪ]¦Skî*‡­ŸŽ¥1%pãΨ,)­¥C¯á§åÜÆÞoCqÊ´|tÐÍCòë2[,¤w•ÕoóÌ´' +cå!o‡8ÃÌƀÀÌ8rP @˳«<«³t–ý°õõ½,ß¼rK¦·–\›á˜$DœÅ0‘¢ÐÝ¿ï(ÛúXCñó4š¹ä¡-òÍ$‰ICœíÝÙíEԋÁE¸í‚‹Ê5N×T»¸†ÉÑXoT㦠+Tw½{…ßPƒ‘Ëcy ©£)eU{»šÞ|YÕ¦5²«ŒÓÙÌif$• XäKG—岧ʶ=t4-mqsá"§ RÒ¸¹Ã˜æ/ÎM/àÂ7J}ì¤÷µ#ᅈ93ª^–Å2ŸÀagröû×/Éэ¬·©éõ?šF©ø³¾X„‹‰ýSU¸Yi½M-xl`Uµ¡¯YñFiå(qāYáÎwºx)¬t3_ÎG@°n§¯Šò‹ËÝ¥Ùmãzfåñ;÷T)+8ùÊá~ÁšÅ×È^jgeå•ØNaٞ*äÎ#MC¿ý]9ŒõmøÄÏÊúc1p¢$‚ +e>s‹ Á›…Ÿ±Vág´Uøáí¦¼BçÒü¥q؀Á«­C+Yþ¡ÄU™ ïÓ|™ÎÌ;Ã", §Zƒ bD0¢ŠT•­0Ž\’5|ñ\ëuʍ¸(^~¨ëşÝîjµBã +-ólQ¢¬î‚Öº»…|c„€@D’8+挎ÍAœ&†,‡Áyº›í€§ÿ”.£ +endstream +endobj +377 0 obj << +/Type /Page +/Contents 378 0 R +/Resources 376 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 339 0 R +/Annots [ 332 0 R 333 0 R 347 0 R 348 0 R 349 0 R 350 0 R 351 0 R 352 0 R 353 0 R 354 0 R 355 0 R 356 0 R 357 0 R 358 0 R 359 0 R 360 0 R 361 0 R 362 0 R 363 0 R 364 0 R 365 0 R 366 0 R 367 0 R 368 0 R 369 0 R 370 0 R 371 0 R 372 0 R 373 0 R 374 0 R 375 0 R ] +>> endobj +332 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 720.047 286.677 730.926] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__const__iterator__tag) >> +>> endobj +333 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 709.994 513.996 718.971] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.8) >> +>> endobj +347 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 686.174 221.941 697.053] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag) >> +>> endobj +348 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 688.077 513.996 697.053] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.9) >> +>> endobj +349 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 664.256 186.524 675.135] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag) >> +>> endobj +350 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 666.278 513.996 675.135] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.10) >> +>> endobj +351 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 642.338 312.141 653.217] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__const__iterator__tag) >> +>> endobj +352 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 632.405 513.996 641.262] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.11) >> +>> endobj +353 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 608.465 247.405 619.344] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag) >> +>> endobj +354 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 610.368 513.996 619.344] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.12) >> +>> endobj +355 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 586.547 211.988 597.426] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__tag) >> +>> endobj +356 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 588.45 513.996 597.426] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.13) >> +>> endobj +357 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 564.63 222.897 575.509] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag) >> +>> endobj +358 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 566.652 513.996 575.509] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.14) >> +>> endobj +359 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 542.712 202.952 553.591] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag) >> +>> endobj +360 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 544.615 513.996 553.591] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.15) >> +>> endobj +361 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 520.794 350.557 531.673] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag) >> +>> endobj +362 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [230.478 508.839 413.122 519.718] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag) >> +>> endobj +363 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 510.742 513.996 519.718] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.16) >> +>> endobj +364 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 486.921 323.439 497.8] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag) >> +>> endobj +365 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.069 474.966 359.713 485.845] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag) >> +>> endobj +366 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 476.869 513.996 485.845] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.17) >> +>> endobj +367 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 453.048 285.821 463.927] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag) >> +>> endobj +368 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 442.996 513.996 451.972] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.18) >> +>> endobj +369 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 419.175 191.146 430.054] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +370 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 421.078 513.996 430.054] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.19) >> +>> endobj +371 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 244.269 181.496 255.173] +/Subtype /Link +/A << /S /GoTo /D (group__Init_g7c98bac1ccfac398657571409a3fcd9c) >> +>> endobj +372 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 205.415 175.957 216.319] +/Subtype /Link +/A << /S /GoTo /D (group__Init_g4af2931282f6a5f1b3444fb8e833d6a1) >> +>> endobj +373 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 166.56 237.396 177.464] +/Subtype /Link +/A << /S /GoTo /D (group__Init_g635128363efd9f4c8c63e21702f40183) >> +>> endobj +374 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 127.706 254.542 138.61] +/Subtype /Link +/A << /S /GoTo /D (group__Init_gfdb2c887a3a2d1daf54a764d0d7f7f76) >> +>> endobj +375 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +379 0 obj << +/D [377 0 R /XYZ 90 757.935 null] +>> endobj +34 0 obj << +/D [377 0 R /XYZ 90 404.48 null] +>> endobj +380 0 obj << +/D [377 0 R /XYZ 90 372.417 null] +>> endobj +38 0 obj << +/D [377 0 R /XYZ 90 372.417 null] +>> endobj +381 0 obj << +/D [377 0 R /XYZ 429.872 328.623 null] +>> endobj +42 0 obj << +/D [377 0 R /XYZ 90 311.896 null] +>> endobj +382 0 obj << +/D [377 0 R /XYZ 90 263.243 null] +>> endobj +376 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F72 202 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +407 0 obj << +/Length 1306 +/Filter /FlateDecode +>> +stream +xÚåXYoã6~÷¯¶•Š&%Q²ö-ͱpš«Ž“—daÐ6«Ñᕨé¯ïH$uØÚbÓ Ú¢}0xg¾ùf†6ž l|ü<ŒÎ<ÇPàٞ1[6| jc¶2L9C‹`ŒÍû!4&Ïò0M†–M±y¼áËç0yZñ|l’`øyv>8 ¾ ÈÇ©äQù5–ñàá36V0n`äccWíŠ ×v ŒÛÁ¯ü§ºÙÂպو(íN¸`aÄWR³ž/³p+JUA¥ÑÅ-9Ø°l9n ŜɲܙÃY—šë4“0 EÈ¢ðwV®Ž1¶“z(·¤kي —(\d,{zÔü©œñL¦Äîxugr. 7ʸêueÂ}NÊÊyk›†‰³YZ$«r/˜UB +¨Â#NWI{;¸Á6ÇFصØl›¶]Á–.‹˜'‚iàö¡ªŽÖ˜K¥àÜvÍk´¸œ{Ä¿eÌ4\AŸôûøȳ•ú“ZB.EHT¡s3$ÔdYÌÔ0^7|•©áEƒ9*©ˆÍÙ&T"Öûâ"W/”ä%‹jÒ,8¸^ͳ¤¼òURP$ëÊ«`®©º‡·…QxrcìHã¦\Y)3É?­³dŒ|0c„©rØÍÍÅüt:½žÎ'W÷G““ùÑôÓÝåéÕ¬TÑà1ȮΆë=,5C«Á®tSX±(ãl¥Vw®ú(Ž£à9bX.A„vèa÷Ñ£Žž·ÓÃUa&ÿ 9ØZhüï¹ÑøòÍÜpú¸éoöM•Ûæë¡ y0›ƒq•-·\ìåìæNvê*ýYSöòTŸ`bŸdZ¶ÈEÆêzQ²…åš$šJMêVF¦µ½I/ †¶ N³gE·4ËøRDŠ¬:Á·ŒÒÔ%¦n·<ƒ¤KˆÉ +‘ÆpqÉÜW5%ԉN5³Dó* ló6+U X¬E·££¹0á|¥oK}‰d1¡” È¡ó-ü¬N‰òºjøK§Vά¬ßhª-8W0‚”’/aZäÑk;&¿µÊ!·o×*M«h+ÛJ¹ÿNîiëCÑ}íÊÔõ£âÝú®]©{¤²˜7®€”zxö:L·¼£J›²Íå>`‚Wހù„/yžË”C‘6²å*´ë°–!Ýò;ì­mƒ~‘×5IæËèëyï¼S,ÔÝv‚ 6užè¾ UpiŠJ•mÍQa‡¾áqÝËôö£ì„W×Caì֎nê÷ëŒá ÄD ‚ñѶiçŒñ`QP㇕’¨Ëw|ö¤ôÓj›"Ùüþtz;¹¾Ú—R.Àˆ`dè¬5Úù¶1í<·Ô´ò p-â"ßWQt¤’²Èjß-Sx›Bèñaz~zƒ/óƒ2|¨@Kkÿ/|—¼7>óË£óëiJøÍðP] ”í1û-ÍڄþzNø—c4¹êLj¼Haòßizz?ùZÄÙß S6t|“—™÷%lRÑw"¶ÿ=ÀeÈø[?TŸb>$0ù€ˆR·­¼ãtþ8v珬^Ôo[Ë-,y*ؓ:?I 8®«º»TSw9Ï~Rø¯.\²¤`‘\SïÚdm˜”9¯¬neUÁ.¼´s%φîý"Ÿ÷]¶ ïz[?Î7Bl?ŽF»Ý-sT$á6C¡Áûet˜ç!üJƒ@K‘3@±XY°!LÊ¢ÆDŸŸþ>᥏ +endstream +endobj +406 0 obj << +/Type /Page +/Contents 407 0 R +/Resources 405 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 339 0 R +/Annots [ 399 0 R 400 0 R 401 0 R 402 0 R 404 0 R ] +>> endobj +399 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.731 217.587 213.038 227.514] +/Subtype /Link +/A << /S /GoTo /D (group__Version_g79bd3696a302bb721ef8168fa5d650fb) >> +>> endobj +400 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.731 179.071 251.782 188.999] +/Subtype /Link +/A << /S /GoTo /D (group__Version_ge19dfe022c51c874d905e2a7c81c18f1) >> +>> endobj +401 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.731 140.555 251.225 150.483] +/Subtype /Link +/A << /S /GoTo /D (group__Version_g8458e58a5e857de11c35ce3076a70ab8) >> +>> endobj +402 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.731 102.039 264.505 111.967] +/Subtype /Link +/A << /S /GoTo /D (group__Version_gbadfeba0a415d210cdd6d7309365e800) >> +>> endobj +404 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +408 0 obj << +/D [406 0 R /XYZ 90 757.935 null] +>> endobj +409 0 obj << +/D [406 0 R /XYZ 90 733.028 null] +>> endobj +410 0 obj << +/D [406 0 R /XYZ 90 672.244 null] +>> endobj +395 0 obj << +/D [406 0 R /XYZ 90 647.875 null] +>> endobj +411 0 obj << +/D [406 0 R /XYZ 90 647.875 null] +>> endobj +396 0 obj << +/D [406 0 R /XYZ 90 558.617 null] +>> endobj +412 0 obj << +/D [406 0 R /XYZ 90 544.199 null] +>> endobj +397 0 obj << +/D [406 0 R /XYZ 90 456.979 null] +>> endobj +413 0 obj << +/D [406 0 R /XYZ 90 442.561 null] +>> endobj +398 0 obj << +/D [406 0 R /XYZ 267.991 379.889 null] +>> endobj +414 0 obj << +/D [406 0 R /XYZ 90 363.315 null] +>> endobj +415 0 obj << +/D [406 0 R /XYZ 487.773 300.643 null] +>> endobj +46 0 obj << +/D [406 0 R /XYZ 90 284.068 null] +>> endobj +416 0 obj << +/D [406 0 R /XYZ 90 235.415 null] +>> endobj +417 0 obj << +/D [406 0 R /XYZ 90 197.019 null] +>> endobj +418 0 obj << +/D [406 0 R /XYZ 90 158.503 null] +>> endobj +419 0 obj << +/D [406 0 R /XYZ 90 119.987 null] +>> endobj +405 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F65 179 0 R /F72 202 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +431 0 obj << +/Length 1708 +/Filter /FlateDecode +>> +stream +xÚÝXYsÛ6~ׯล&Œ“GßrØ»v’Únúd<”[¬%’%©xÜ_ߤH›rìæ˜I4„pî~»ØýÔ»ò¨÷ëèÅùhï ^Lâ€Þù¥S/ Qœyçsï½1ž0J©ÿn _—Ušgã WԹгë4»O Bês:þx~4Ú?ý=b°?õ˜ÝO…$ʛ­Fï?RoýG%"Ž¼;kåI.à»ôÎF¿¨“mÛ×ʬhGfF"E䅌B_„‚à\YqšuÞû‰~šë”òL»A#dyå¤=µÓŒnoß_¼Û?=;|óúâÅþù8þó»Û™y´×Ù|÷BîE L €œ“@roÂ$¡QŒò/4 ÇþT× ¶²õjªKlç—ø­›i 6>ÁF}c2žHÀVi…cÍ÷˜#•Ÿã¿Ë|³)‹|£þ,M–ØWŽEèë¥N*í'ÙÜɓg[6šë1S É2/V:«±³Ê’bbà&ÆÊ©Z-òº"[€êyßDĀ7‘œˆHáêƒu6«AÙª·Á]@˜pF"ö°¤ /ŠåÅ'£úúÅ*ù ô°ýªè§1§~žÎ¡Ížê +žS]¯Ë¬Â;…ö†žj›­_@ÛúEwú4z~1$Éè&H\ª‚¯ ^š}ð¢‡Ñ³Çþðè•zÌឥ6æ~w14؛žn¢þŒ§µßû&»ÿcC· µæåž-{Ó÷x7¦3!bXˆQ*Ìgö0-ÑÌ+kH5’Aß¡ÿ,ÓZ7†Èñ¬HvV I¢°+Î TglKÛ9Nè’€óf‚³q‘´‘ë¿nlfð4(Á'™µ³ªº´,ÊNɳ:I³öÿWt &¡d_Ñ=¦I–éòK»]Móe:ke¯ê$«îÈ0¡qÙr;L8z™ÔÍq BËtZ&å­sþNDr®…5qV}‘#’Íx«™+P³|¶6<6it»«]Ú²)!î– +رC Ð_¾3Œ3¾áÀ~þŸÀÒÒm³©#ÌǺn]¶Çƒ uɓÁK&T¦‰6J +,7gõ¹Mæ:ËkÂ?ê!d“+ìMª*‡ZÄÝ £›þnùuòüèÍ)[ǹ7~øúÍé®Eb¢Ày¥¹ð ʇG©«Bƒ›Y*e±[ގwdð 1eT7«¤6me³³éëÙÖt¤Õ,±"ÑFíØÜd‡ì`c'©àʵ!$uÇMózt<Ýw¸‘ÀÄÖ!”„ª½•¡8S‘8Œ6‘ ‚¨ÝЙÂe$T¢Þ`! SÅVA 膬ÖÓ-‚„]A ºvO¨7ó݁M¥è*w`ü_”Úõ  lô7›‡6#¦˜ndÂV‹óEqø¤D€e¹ÁõóÛÔd2†xÅ>§góÈÈ#"f=Ç +é6wº'[;uM×F]A¡¬ær  pðݪ%¤XEÕãµ|ŒuÁ¼¢g^!Ó)Džÿ ¢€Ra8\ÂhKÈaUm&+]t6º>”ƒÔ&‘4jÍÃÆrÐ&5§™ãV"öꁒJ5L½€Dwq%R‰;\§§¢$qÄzaå¾u AQ" ×èfª!.ÖSĄÇ|Œm9¿ºDñSÈ`ö¥$L)ä`’ Ú:±“÷ññxZk9ÆýµçM3ÌIè$БLóuM<–áÉÐÓỦ§y<„! b:«@êþ÷—Éì§ØzÔ‘™mnqøÆTIYu»Åá›ERW¹ÞäÒr yy·å!‡Hé¿|öÌ4 ·*€O–ؽ®,Ճ–ÅƧ¦_§Ë¦7-„¤m +ÄÐ¥î.–æ‹¼¬»]U8‚tí*Ñ®Zæù5¶ðq†.×%† ÓÛ1AŸSß}å€ü³è±ÜÍ#v™PDîá]ÅD©ž‡ÈO¶$Ì_°v¾¼]èy™àèqKŽáÏKœrœdWëäÊ­?4n~ií8s]TºüÙxh… N’lmŸƒ…p/!]’ ÈgÍÕÎ$¨ôÏtó|Ž\{M뷑½½¸Œm¯ð¢®‹_öönnnȬ"ë,-J’Ö{Äöî?ïn6aPÀ©¸½Ãh*l•[{‚Ùé_†Ž": +endstream +endobj +430 0 obj << +/Type /Page +/Contents 431 0 R +/Resources 429 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 339 0 R +/Annots [ 403 0 R 421 0 R 422 0 R 423 0 R 424 0 R 425 0 R 426 0 R 428 0 R ] +>> endobj +403 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.731 708.792 243.105 718.719] +/Subtype /Link +/A << /S /GoTo /D (group__Version_g7a529f51bfebdd4b3e69c866dced9bc1) >> +>> endobj +421 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 618.572 204.032 629.476] +/Subtype /Link +/A << /S /GoTo /D (group__Version_gbdf8f4e9416010573d48e21cf0584762) >> +>> endobj +422 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 581.426 204.589 592.33] +/Subtype /Link +/A << /S /GoTo /D (group__Version_gb51f10ea37de5299e9bc840afa206d4e) >> +>> endobj +423 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 544.281 212.639 555.185] +/Subtype /Link +/A << /S /GoTo /D (group__Version_ga50f472bf6d1869a2fc1500d2fdf8213) >> +>> endobj +424 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 507.136 197.387 518.04] +/Subtype /Link +/A << /S /GoTo /D (group__Version_g676f27ad949159a3b79577f78870f60f) >> +>> endobj +425 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 469.99 175.808 480.894] +/Subtype /Link +/A << /S /GoTo /D (group__Version_gc6abee034f6ac000f15d1206fdeb8316) >> +>> endobj +426 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 432.845 173.736 443.749] +/Subtype /Link +/A << /S /GoTo /D (group__Version_g63fef7041da34ac5bb372a2535d99377) >> +>> endobj +428 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +432 0 obj << +/D [430 0 R /XYZ 90 757.935 null] +>> endobj +433 0 obj << +/D [430 0 R /XYZ 90 726.054 null] +>> endobj +434 0 obj << +/D [430 0 R /XYZ 90 636.691 null] +>> endobj +435 0 obj << +/D [430 0 R /XYZ 90 636.691 null] +>> endobj +436 0 obj << +/D [430 0 R /XYZ 90 599.665 null] +>> endobj +437 0 obj << +/D [430 0 R /XYZ 90 562.52 null] +>> endobj +438 0 obj << +/D [430 0 R /XYZ 90 525.374 null] +>> endobj +439 0 obj << +/D [430 0 R /XYZ 90 488.229 null] +>> endobj +441 0 obj << +/D [430 0 R /XYZ 90 397.148 null] +>> endobj +442 0 obj << +/D [430 0 R /XYZ 90 339.217 null] +>> endobj +420 0 obj << +/D [430 0 R /XYZ 90 316.905 null] +>> endobj +443 0 obj << +/D [430 0 R /XYZ 90 316.905 null] +>> endobj +444 0 obj << +/D [430 0 R /XYZ 90 189.393 null] +>> endobj +445 0 obj << +/D [430 0 R /XYZ 90 166.105 null] +>> endobj +446 0 obj << +/D [430 0 R /XYZ 90 166.105 null] +>> endobj +448 0 obj << +/D [430 0 R /XYZ 90 89.441 null] +>> endobj +429 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F72 202 0 R /F23 144 0 R /F84 440 0 R /F65 179 0 R /F89 447 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +463 0 obj << +/Length 1974 +/Filter /FlateDecode +>> +stream +xÚ½X[wÛ6~ׯàے§L¼ˆ}óZrâ֖¼ŠÒËIzt`’¶¸‘H$ãº{ö¿ï R"-Yqš³/€ÀÌ73ßÌе,×z3øçbpvp+"QÀkqoE®”øŒZ‹Äú`Äs†Ôu]{"¥CGv!!ó]û­È“u–?8Cμ0°u~_ü8˜, (îZTæ‡$ä¾o~w­æ´\£‘õ¨vm,qø_[ïÿ¸=Á(%‘ï³F2Ɖø_*ÈÓÓε†Ì#܋ô“¼Þ¤RTY‘—Júæú³KßÝ{Â]|ï24×dÌï¼c}ú L +gšy„@>,æjÊ·Ý®—¸k™JYÈe\$iÿ ÜöŸc§ŒˆD֐ú$ò´,··×ËÉ|îx®=›/gïËÙåòfr3›;oÿÖ;Ýþþ¸|ÔõýÞqWӟÊ}ûüúj¼<Ÿ¿y3™.^wdÐ;rˆ»ÑÚ¼Z‰ñìæüjºÛõŠ+®î דé›ÅÛ¯8Ì}ìùüjñöf²¸ºXθèçÉüòzæ"¿¼BDßÕiïã«ÙW)ٜ°o™Åd>u”m¾RUÄ?8äDï§?Mµ’SÙ‰¸}>ãÚù|¼œüz1¹]\ͦÖý«&¿ÞN.“ñQ%”…ÿۙ܅jÈ $¢ ðT¨z„†nóà6sÝ8ýèº,OKÍÕ*Õˆ?Çó[ÞÀ@l·ˆJDþ¤÷u#Q觍0ÓÒᡝVµÌÉñ:4äqI3ë_æ̌ƒ7‚kwöÚ¼L¨ÉÌã´Ùºp¼Cñà½ÜüîisW¬³xϪ"¯Ê&*“nTšy™®E‹GU´6àÉt[È +jƒ³•)Èá*£Ñ®Ð ¬)5vƒ>qᄞý´561¬ç•htìk¥ÎjáQþÿÌÏu-Óúús˜À©všÛNðšC}û·ൾ ¸$ŠÐÑ'A¿ª*äG¼híÁ(Áë¼å @óۋ4 å¦çµl´@8<ŸÛŸ3YÕbž½I7…|Ò C(ηÁQÅÝ:Õ[Ðwp¹Z™‰­,â´,õìJ˜Á]šæz=E8ÿԅ͐rІ±n~]‰ºßìÃÙÁbH#â±ð…d‰ÕØè¥b¬HH!!† ç‡ ®ÔQÌ¡ÔÁQ–ã}šú?9üÉÕcV­Zên×YÃEʋT0œÐØx\å þºÞXŒ3u‹º*³ÄÄTÖÐORlDf^-î͜Ä ï9¡±‘ñ¸Æ/V¯/k¬<ž{T3¦¬Ao‡ÚàÍÔÎqA ŒDó|÷ï4®ôœæœ}DŠzèíÞqš&zYA ñg¶ÑYb#å~›ÊMVµ¬\f8Ս-ìØl_ôd‘£_^¦ NBÔÆ]Ц4ï/ߤ•Ê>ð\ öŸñ'•X.è쏸Lǵ”J;|37MÄ0ˆ‹Í¶®šŒ/ìÔV«yː åt°+Ó?jˆ 5rD±°^¯5Lt}0wVêµXämNßS-¶uL‘¯Ÿäæù¶¤¹Û­ + u#þ3{ÝI!Ÿþá@{X6K±¹h²/lªKõ=ïŠ:O(Flï!•f§(Ò”ü«s\¤÷ˆ/†SœöåWQæKVOý½vÔq‚nݳ1Fz-µžè¶ú0õpü™7·¦Z{q°»!$È?&¶2³²!˜<Éba"ŒˆÏi›‰5´óØfôG€ÊŒdÑȗ5áõ<ÍáôçL´µâ~¯Áó<‡¼8ä4ŽŒ}1PÂüçqû¼™u7³‡rý®ó@»qêé É1×㓱" ¹Á¨ A|H2ñ¥b6x„êÙìF"¥êkˆ9¸*Óõ=Òw™¼]²Y×PڒUZvÜä­P?´9§[²ÁE³8ÐM;’žjÚ!V±i£oÚûF…þ”t/rPKïDÈD?5¹@òjJ¥Tî6NI‘iLa¬;t¸‰{=Ÿnô¿øî;SwÖù°Ê6M%«ssN­« H†øÚ ùÿC}â£Å³:Ì#žëïë1(/ ì±e@Ÿù§\g–zY/ö—9,kැ­Xœ3ލCÍÚ&¢àÐq†£n úAëë €GéèK?õªO¼€QrBã©¿ðú@zM#©Jƹ}‹z ¹A)9³o‹õÓ*M¤Ð«×:5é‡ ½åZäµx0ï_!#Ü«˜ÍÔ{h¶Ûd/܈\µ¸¦?z¨d_j¾…I—P—0lüÑ]Ï~—6_"4Ÿ¬fôÓ@ñéN/æa;ЦתÚþpvöøøHâ’Ôy¶•$«Î <{î@»C(õˆ¿c»{•›@0“J@‡,‡Éx^€‚þÓ®þ +endstream +endobj +462 0 obj << +/Type /Page +/Contents 463 0 R +/Resources 461 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 339 0 R +/Annots [ 427 0 R 449 0 R 450 0 R 451 0 R 466 0 R 452 0 R 453 0 R 454 0 R 455 0 R 456 0 R 457 0 R 458 0 R 459 0 R 460 0 R ] +>> endobj +427 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 672.898 228.51 683.802] +/Subtype /Link +/A << /S /GoTo /D (group__Error_g0c0ab09a97e49f85f42c966e14cfdee6) >> +>> endobj +449 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 657.675 263.2 667.862] +/Subtype /Link +/A << /S /GoTo /D (group__Error_gg0c0ab09a97e49f85f42c966e14cfdee6f29a62bdfcf44dbeec14afb409035438) >> +>> endobj +450 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.213 657.675 437.728 667.862] +/Subtype /Link +/A << /S /GoTo /D (group__Error_gg0c0ab09a97e49f85f42c966e14cfdee6093ae02f8ceebbc40321d1eaf186f726) >> +>> endobj +451 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [448.741 657.675 513.996 667.862] +/Subtype /Link +/A << /S /GoTo /D (group__Error_gg0c0ab09a97e49f85f42c966e14cfdee68c65fedb9893ebb49394a3cff2f19a49) >> +>> endobj +466 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 645.72 194.647 655.907] +/Subtype /Link +/A << /S /GoTo /D (group__Error_gg0c0ab09a97e49f85f42c966e14cfdee68c65fedb9893ebb49394a3cff2f19a49) >> +>> endobj +452 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.636 645.72 337.212 655.907] +/Subtype /Link +/A << /S /GoTo /D (group__Error_gg0c0ab09a97e49f85f42c966e14cfdee66aa28e72200f879cbb83a36b60644fb2) >> +>> endobj +453 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 629.78 258.956 639.966] +/Subtype /Link +/A << /S /GoTo /D (group__Error_gg0c0ab09a97e49f85f42c966e14cfdee6bd22c4eaabb49bcb6c654a25e402c64a) >> +>> endobj +454 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [265.002 629.78 356.269 639.966] +/Subtype /Link +/A << /S /GoTo /D (group__Error_gg0c0ab09a97e49f85f42c966e14cfdee60860beb1b1c54c9f774b532d92404992) >> +>> endobj +455 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.316 629.78 511.506 639.966] +/Subtype /Link +/A << /S /GoTo /D (group__Error_gg0c0ab09a97e49f85f42c966e14cfdee67dae659f72f654afae1c5c6f331192a3) >> +>> endobj +456 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 617.825 346.278 628.011] +/Subtype /Link +/A << /S /GoTo /D (group__Error_gg0c0ab09a97e49f85f42c966e14cfdee603b444004b1031ddb1a51289b9d83106) >> +>> endobj +457 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 601.541 278.951 612.071] +/Subtype /Link +/A << /S /GoTo /D (group__Error_gg0c0ab09a97e49f85f42c966e14cfdee6b42a97917f263e8305d561f52cbd9c57) >> +>> endobj +458 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 520.405 216.893 531.309] +/Subtype /Link +/A << /S /GoTo /D (group__Error_gd6765993c08a2ae2f0ef377f822f4d33) >> +>> endobj +459 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [282.766 520.405 372.738 531.309] +/Subtype /Link +/A << /S /GoTo /D (group__Error_g0c0ab09a97e49f85f42c966e14cfdee6) >> +>> endobj +460 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +464 0 obj << +/D [462 0 R /XYZ 90 757.935 null] +>> endobj +50 0 obj << +/D [462 0 R /XYZ 90 733.028 null] +>> endobj +465 0 obj << +/D [462 0 R /XYZ 90 691.872 null] +>> endobj +467 0 obj << +/D [462 0 R /XYZ 90 539.378 null] +>> endobj +468 0 obj << +/D [462 0 R /XYZ 90 483.085 null] +>> endobj +469 0 obj << +/D [462 0 R /XYZ 90 424.384 null] +>> endobj +470 0 obj << +/D [462 0 R /XYZ 90 400.169 null] +>> endobj +471 0 obj << +/D [462 0 R /XYZ 90 400.169 null] +>> endobj +472 0 obj << +/D [462 0 R /XYZ 107.713 323.242 null] +>> endobj +473 0 obj << +/D [462 0 R /XYZ 107.713 295.346 null] +>> endobj +474 0 obj << +/D [462 0 R /XYZ 107.713 279.406 null] +>> endobj +475 0 obj << +/D [462 0 R /XYZ 107.713 263.466 null] +>> endobj +476 0 obj << +/D [462 0 R /XYZ 107.713 235.57 null] +>> endobj +477 0 obj << +/D [462 0 R /XYZ 107.713 195.72 null] +>> endobj +478 0 obj << +/D [462 0 R /XYZ 107.713 167.824 null] +>> endobj +479 0 obj << +/D [462 0 R /XYZ 107.713 139.929 null] +>> endobj +480 0 obj << +/D [462 0 R /XYZ 107.713 112.034 null] +>> endobj +461 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F72 202 0 R /F23 144 0 R /F65 179 0 R /F89 447 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +508 0 obj << +/Length 1455 +/Filter /FlateDecode +>> +stream +xÚÝX[—Ú6~çWø­æœ"t±l«omšíIšœ¦]ú”äp´¶7`YÞ ýõY2–Ènš¦O–å‘ôÍ|s‘ó¿ ~š ÆW1 1ƒÉ,8Hb‚8%Á$^‡1âÃÁ‡/Š-õf8¢‡?K#Íf­êáˆ*XHéðíäùàédð~@`ov/ž „ñ [ ^¿ÅAóÏŒ˜Hƒ»VjD”Ás\~àO⢠á˜w¸"Ä<²«¦ÌLQ•Z•5+U>; `ÇéHô–"⥎DBÂõz9­•™*­‡$ +=]È2_*í>¿Áß «"·c»óøŠö1’T Gp^{ÎŒ™“ÚÓ$B"¥;NìnªlV;ö­‡#«rå>ÚÑ÷œp +ã²öг…ÔGðŒˆˆb$8? ‹t°rUgºX[ Z„N<=qÎP„E'¿8²!Gœ‰¾žN†ã>˜!ALPL#'û ô’Ëeíè4 åM TPŽr*ÐRånìTi7Üf_ÖPÛ Iãž7”÷PP#Šù2{@9IÒ  Ö«F”PD€JÞ[wbá2Î:Xv¸…Å€6#ßY/j#¾Éòž¸£Û}ÌÝ"éލ~0\º‰O^ba5µ£y1¤<¼µ ÜY4œ5¬éO)ÊY¥Wr·TÞTévQ]àô=GfîduVçŒ1b8qzÛO샄µÑE9wSà©FåöÝQ +B{úØ/{ú؉¢v’ZÉ|T•Ë›n Ó~7^ÀíTÔF•™ê¯ÅaY'3o¤–ààÇ´›™Îu¶>·çP é]R+Óhð?´õz·µž»²ÊÏ̟÷}í ]M†)A4W3þ¬:ĹìïïrsëúeÞÁ^Êm@ԛÕMµ,2÷Öæ0MŽ²Õ<±Omñ؜ß%í5äY–‚.qû4@)ß[¼q°qûyhÅßjj¼˜­#zî Êí‚6¸!Kæ¤ù\ej—ïm{ø_%4Hdgðő Ü¥‰‡ö£/ l9ß&›B†àCsmý«uSîàP¡‡, ÕÚ=j(?ÎÛ­:k™yé-bgçOÀÝϒ^(€iD.0¥¯íðxH! ~X²ŽþS‚¢d[Å,E5½µGêBÞ,Õ’ɺ1ә¯Í÷9òLvµô(קxö{øƒ»"sŠþQœ¢ÔñßOÜûäVފNO¸×§Þ¥üÀ֐øvìßz{<„qzIðÝdgϓ +V€Õl)Í +ðש‘óƒpÞ¿ÜD1@IÁSŽ}IðŽ#(NÒ}ú~[Ë÷êW~ˆXBÂoÎì^ØEî‘;f·çäXhx8œ#zš XÕ½¤TÝü¥2óãèEQ*©§O?¬µª]Þ9IŠðîòüRŽ}1E‚/䫘ýDhP yÓG‹“‘ÚÐÁ5ã_òE2àÓp?£bÀ-–=NÅ؝yT «¥â£†>U#â¥\0¥ß|<|Äì'ëƒí×|‰¨ø<.ÒaòcãìêARô1’œ± +ÐDšJŸ +ÊÒ¶wò$±„}:T‘\ÄÓ¥<†ü1òÈ9ì‘Ãߨ¿<³EÞ¶ÆAõ‰Š«ks8ú?²Œ…¯Ú–…^IûJÃWÕr³P¹–îë®/OœÈ YÎ9÷ëŸY}f¶Yé0õg­ôw¶ëW»/eézwðÍ7Èy¨tíúw0‰ÁˆÚó¶O…תûƒwxt£_m[v§àZ½ ¼…1ëÆã»»;”Õ¨)‹µF…Õãû]¨Ý&‹‹m-télUiåtè5B÷yžþ Xñ +endstream +endobj +507 0 obj << +/Type /Page +/Contents 508 0 R +/Resources 506 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 339 0 R +/Annots [ 482 0 R 483 0 R 484 0 R 485 0 R 486 0 R 487 0 R 488 0 R 489 0 R 490 0 R 491 0 R 492 0 R 493 0 R 494 0 R 495 0 R 496 0 R 497 0 R 498 0 R 499 0 R 500 0 R 501 0 R 502 0 R 505 0 R ] +>> endobj +482 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.012 511.245 255.368 522.149] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +483 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.908 472.529 351.956 483.433] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g1822baf29ede5879f1c6ed77f0ca5984) >> +>> endobj +484 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.771 472.529 439.128 483.433] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +485 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.906 433.812 251.792 444.716] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +486 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [259.762 433.812 331.243 444.716] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ge50df8ccfc72a20b58ab7854ad2ccba9) >> +>> endobj +487 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.906 395.095 251.792 405.999] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +488 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [283.283 395.095 380.777 405.999] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf1c4903edb1a626a36a7220038f963c4) >> +>> endobj +489 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.906 356.378 283.024 367.282] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag) >> +>> endobj +490 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [290.995 356.378 393.708 367.282] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gdc58d1f680927df3786f41bdb47fa26b) >> +>> endobj +491 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.906 317.662 283.024 328.565] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag) >> +>> endobj +492 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [314.516 317.662 443.242 328.565] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +493 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.906 278.945 249.281 289.849] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__tag) >> +>> endobj +494 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.251 278.945 326.222 289.849] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gedee0800f6e695c36ace737095ccef5b) >> +>> endobj +495 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.906 240.228 249.281 251.132] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__tag) >> +>> endobj +496 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [280.773 240.228 375.755 251.132] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3) >> +>> endobj +497 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.906 201.511 283.602 212.415] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag) >> +>> endobj +498 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [291.572 201.511 394.863 212.415] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g84f27605574583d674403f6d71a73a24) >> +>> endobj +499 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.906 162.794 283.602 173.698] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag) >> +>> endobj +500 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [315.094 162.794 444.397 173.698] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +501 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.707 124.078 343.168 134.982] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__const__iterator__tag) >> +>> endobj +502 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [350.94 124.078 513.996 134.982] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g5a7338130cf6d33d28dd40ed560a24d6) >> +>> endobj +505 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +509 0 obj << +/D [507 0 R /XYZ 90 757.935 null] +>> endobj +510 0 obj << +/D [507 0 R /XYZ 90 733.028 null] +>> endobj +481 0 obj << +/D [507 0 R /XYZ 90 716.221 null] +>> endobj +511 0 obj << +/D [507 0 R /XYZ 90 716.221 null] +>> endobj +512 0 obj << +/D [507 0 R /XYZ 215.408 627.602 null] +>> endobj +54 0 obj << +/D [507 0 R /XYZ 90 612.994 null] +>> endobj +513 0 obj << +/D [507 0 R /XYZ 90 528.248 null] +>> endobj +514 0 obj << +/D [507 0 R /XYZ 90 528.248 null] +>> endobj +515 0 obj << +/D [507 0 R /XYZ 90 452.836 null] +>> endobj +516 0 obj << +/D [507 0 R /XYZ 90 414.12 null] +>> endobj +517 0 obj << +/D [507 0 R /XYZ 90 375.403 null] +>> endobj +518 0 obj << +/D [507 0 R /XYZ 90 336.686 null] +>> endobj +519 0 obj << +/D [507 0 R /XYZ 90 297.969 null] +>> endobj +520 0 obj << +/D [507 0 R /XYZ 90 259.253 null] +>> endobj +521 0 obj << +/D [507 0 R /XYZ 90 220.536 null] +>> endobj +522 0 obj << +/D [507 0 R /XYZ 90 181.819 null] +>> endobj +523 0 obj << +/D [507 0 R /XYZ 90 143.102 null] +>> endobj +506 0 obj << +/Font << /F63 177 0 R /F23 144 0 R /F89 447 0 R /F50 143 0 R /F65 179 0 R /F72 202 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +560 0 obj << +/Length 984 +/Filter /FlateDecode +>> +stream +xÚíYM—“HÝçWÔNXðRß.DZ=~ÌљŽ«Ö“ƒ Žv 2}úßû ˆ&hšɌÝÇPTÕ»Ü[w¡(™Jž þ †gZNsMF—ÄQb4ÅMÉE A…£”¯æò8¿ #®hðg\ÄÅí2Y…‘`܉€‹ðýèÅàéhðyÀpnJX5—2`„"“Åàâ=%SlA(gÉMÕkA$x¼&烿´ÆE·ñ)º…Q RXb¸ª•ùŽsU…ߌ#‘BÈ%ÂirFRè`UäëIQw+áå³ç?Õ)L°\^Ÿd)vçi1>¿]Éb<)[Æó"Éã"ËÇE]©‡îÍ!tFÂvPˆQ¬‡$ÑW †Ö‹™ßì®lC;Ë×I:IZ돢x.zȬí˜Ç½ï„ãÄ}¬=⟙V`éãK¨÷H×@Áð_ç˧GÂی›u ™íïgÁOɀ.’Kû â0ÿVþÃá½È²'ü)jîÅhÔA¸³Ùz)ÿ +[o aqUªVrtUÊ(Dð&d*ˆóE\^òàMv}{•LóØßý¶m„O|—Wq:[dzzüór\†Œñ¤nz»JòG¡RÁÊø+N×ñµ¿÷Ž*úo2ÉWó,õèJ‘b¼Å Œ•Áy’Ô¤x>‘ÍÙËrËKm=®Qøö‘UËÇÃáÍÍ LV°NçËæÅÉ6$Þ!M1(÷u»æ2Ë=°E–'þæ)6.â1ï.iÔé æè +endstream +endobj +559 0 obj << +/Type /Page +/Contents 560 0 R +/Resources 558 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 582 0 R +/Annots [ 503 0 R 504 0 R 563 0 R 525 0 R 526 0 R 527 0 R 528 0 R 529 0 R 530 0 R 531 0 R 532 0 R 533 0 R 534 0 R 535 0 R 536 0 R 570 0 R 537 0 R 538 0 R 539 0 R 540 0 R 541 0 R 542 0 R 543 0 R 544 0 R 545 0 R 546 0 R 576 0 R 547 0 R 548 0 R 578 0 R 549 0 R 550 0 R 551 0 R 552 0 R 553 0 R 554 0 R 557 0 R ] +>> endobj +503 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.62 719.912 347.081 730.816] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__const__iterator__tag) >> +>> endobj +504 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [384.145 719.912 513.996 730.816] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g88e874dbd26b94133467d81b006f0c3f) >> +>> endobj +563 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 708.933 178.437 718.861] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g88e874dbd26b94133467d81b006f0c3f) >> +>> endobj +525 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.906 669.103 247.598 680.007] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag) >> +>> endobj +526 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.568 669.103 322.855 680.007] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbf20fcbeb06790546a112b72eb0811f8) >> +>> endobj +527 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.906 630.249 247.598 641.152] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag) >> +>> endobj +528 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.089 630.249 372.389 641.152] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +529 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.906 591.394 281.918 602.298] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag) >> +>> endobj +530 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [289.889 591.394 391.497 602.298] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g747bcaa4d01a8065758096b1ff0eb551) >> +>> endobj +531 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.906 552.54 281.918 563.444] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag) >> +>> endobj +532 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [313.41 552.54 441.03 563.444] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6069aff3ad06a502f746df4adec1c16c) >> +>> endobj +533 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.906 513.686 341.684 524.59] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__const__iterator__tag) >> +>> endobj +534 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [349.654 513.686 511.027 524.59] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gc803b1dab9dd0072acb6fdda204efd26) >> +>> endobj +535 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.967 474.831 346.745 485.735] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__const__iterator__tag) >> +>> endobj +536 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [385.828 474.831 513.996 485.735] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd8582d9f10213d638e87de8f0aa91a01) >> +>> endobj +570 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 463.852 178.437 473.78] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd8582d9f10213d638e87de8f0aa91a01) >> +>> endobj +537 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.906 424.022 255.907 434.926] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__tag) >> +>> endobj +538 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [263.877 424.022 339.473 434.926] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g64dda1bda497aab131fc204ed9e55894) >> +>> endobj +539 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.906 385.168 255.907 396.071] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__tag) >> +>> endobj +540 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [287.398 385.168 389.006 396.071] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g3b2653e715f41511257a84f35be7fba9) >> +>> endobj +541 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.906 346.313 290.227 357.217] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag) >> +>> endobj +542 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [298.198 346.313 408.114 357.217] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g5e59406ab43e2f1851ea2e066137b4bd) >> +>> endobj +543 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.906 307.459 290.227 318.363] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag) >> +>> endobj +544 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.719 307.459 457.648 318.363] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4aa820c3f87b201ce364e854aa37dba5) >> +>> endobj +545 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.684 268.605 359.771 279.509] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__const__iterator__tag) >> +>> endobj +546 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [377.519 268.605 513.996 279.509] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g5e128d772c07f54f135cac19e9a6ffbe) >> +>> endobj +576 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 257.626 152.425 267.553] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g5e128d772c07f54f135cac19e9a6ffbe) >> +>> endobj +547 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.048 217.795 362.135 228.699] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__const__iterator__tag) >> +>> endobj +548 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.84 217.795 513.996 228.699] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ge8610cd48952cf1dc71b525235f6f583) >> +>> endobj +578 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 205.84 212.758 216.744] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ge8610cd48952cf1dc71b525235f6f583) >> +>> endobj +549 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.906 166.986 270.84 177.89] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__tag) >> +>> endobj +550 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [278.81 166.986 369.34 177.89] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gefc9900fe07bfdee6310e4705ea0bfec) >> +>> endobj +551 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.906 128.131 270.84 139.035] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__tag) >> +>> endobj +552 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [302.332 128.131 418.874 139.035] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf78df97484e374abe5d4e0f8973a622d) >> +>> endobj +553 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.906 89.277 305.161 100.181] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag) >> +>> endobj +554 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [313.131 89.277 437.982 100.181] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gc0d389ac714f0d4d3e6950fd692e7443) >> +>> endobj +557 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +561 0 obj << +/D [559 0 R /XYZ 90 757.935 null] +>> endobj +562 0 obj << +/D [559 0 R /XYZ 90 733.028 null] +>> endobj +564 0 obj << +/D [559 0 R /XYZ 90 688.196 null] +>> endobj +565 0 obj << +/D [559 0 R /XYZ 90 649.342 null] +>> endobj +566 0 obj << +/D [559 0 R /XYZ 90 610.488 null] +>> endobj +567 0 obj << +/D [559 0 R /XYZ 90 571.633 null] +>> endobj +568 0 obj << +/D [559 0 R /XYZ 90 532.779 null] +>> endobj +569 0 obj << +/D [559 0 R /XYZ 90 493.925 null] +>> endobj +571 0 obj << +/D [559 0 R /XYZ 90 443.115 null] +>> endobj +572 0 obj << +/D [559 0 R /XYZ 90 404.261 null] +>> endobj +573 0 obj << +/D [559 0 R /XYZ 90 365.407 null] +>> endobj +574 0 obj << +/D [559 0 R /XYZ 90 326.552 null] +>> endobj +575 0 obj << +/D [559 0 R /XYZ 90 287.698 null] +>> endobj +577 0 obj << +/D [559 0 R /XYZ 90 236.889 null] +>> endobj +579 0 obj << +/D [559 0 R /XYZ 90 186.079 null] +>> endobj +580 0 obj << +/D [559 0 R /XYZ 90 147.225 null] +>> endobj +581 0 obj << +/D [559 0 R /XYZ 90 108.37 null] +>> endobj +558 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F23 144 0 R /F72 202 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +611 0 obj << +/Length 1008 +/Filter /FlateDecode +>> +stream +xÚݙÉrÚJ†÷g²¨V‹ñi<ŸŽOƒ0ˆý$ŠÇç7ë$XŽVí!­0‰ÂuÖæð„ícbæŠæÂkz® Oc:ÕÒp²ê‚j®DÄcÄ`©,ò¨ÀVˆz&ÙM¹{#Ì~F—ß‚Iòø´”´Ò2õ´rÑæIñ´ +¯ +KS¬eX”‚Sô>­Ãáxis X (¶²0E5Ô.H$Õ¼èMÖÚeª…ËiÅÍ¥ÎAtEµ¾3+ûøNêFÛí8†­UeŽ5_ÞcàüÓþì2›~xs6>‹£ËŁ9´ÂŽJ‹AÚ#̙¥N;͑TʞŽ¥Ž$uÃrEá‹6„m¹z¥±â™ ΢ÅÍu0£°ÑÂ`ÈïŽb¿Ïn8Çdxl ü¿:7@3˜{Žg€þêCBNésøþ™læÂDÁb^©,.TÛqzó²ƒ/×Øê^¾`Ԕ}ÑK·´ԓ²:¦°ýãnª™ŠÐ}©dµU}ö¥|¼ýf/®¹èp„»< 6ÂD›r֗ãsI¾ B‹ÍmK¸õɀ>F÷Û#UW¦û©‰- ªß >éR[†¼yMSüá ³fê=C¾Õ‹)»KRøµ@É)ˆ"mÕ Íãø+wM†6O͆´…ÞñˆÃZ,zMÌZ«fóî¬k!{¥ºìÝ{£~¾6’7âLËtÃéRç3§í՚Y(Lú  +m~7óÎÃYYµpçÏó©9ºz® {H[žƒgçÝ "d|š›â\^Z,eîè:•sçÌ¥Òñ㥟޲ۅÌÏßޝÙÃÍ˼È{?œmüYQÿM:Ò+—ǟþ[ñ WBúWøà‡‘¿ûB$ù™v HæQ˜?$˜ÌàŮljp΃ 'Wà;Úýz—þß ÷ÆÅ`CJn—ïë$Yý3n·[> endobj +555 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.906 696.002 305.161 706.906] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag) >> +>> endobj +556 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [336.653 696.002 487.516 706.906] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gb49861123b31a74dddcdffb4b8fd110a) >> +>> endobj +583 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.757 657.148 372.777 668.052] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__const__iterator__tag) >> +>> endobj +584 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [388.598 657.148 513.996 668.052] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g56e2574a7d2f006333151867599e8fa3) >> +>> endobj +615 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 646.169 178.437 656.096] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g56e2574a7d2f006333151867599e8fa3) >> +>> endobj +585 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.101 606.338 365.122 617.242] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__const__iterator__tag) >> +>> endobj +586 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [396.906 606.338 513.996 617.242] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf02dc1cffb4d3d79720ebafbe872be03) >> +>> endobj +617 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 594.383 212.758 605.287] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf02dc1cffb4d3d79720ebafbe872be03) >> +>> endobj +587 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.906 555.529 264.225 566.433] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag) >> +>> endobj +588 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [272.195 555.529 356.11 566.433] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g12c368fa0bdd20b907d9ab8e92e999d2) >> +>> endobj +589 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.906 516.674 264.225 527.578] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag) >> +>> endobj +590 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [295.717 516.674 405.643 527.578] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gec4f5c405067bcd0483d84591bc7c48e) >> +>> endobj +591 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.906 477.82 253.705 488.724] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +592 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [261.675 477.82 335.069 488.724] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g97b246f11809448c53f089779c0019a1) >> +>> endobj +593 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.906 438.966 253.705 449.87] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +594 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [285.197 438.966 384.603 449.87] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +595 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.398 400.112 343.168 411.015] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag) >> +>> endobj +596 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [350.63 400.112 513.996 411.015] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gdb1edf876e8c62fb7d2630a9280224f1) >> +>> endobj +597 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.834 349.302 343.605 360.206] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag) >> +>> endobj +598 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.989 349.302 513.996 360.206] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g82657533544652eb3ec1334a72da137e) >> +>> endobj +624 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 337.347 169.591 348.251] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g82657533544652eb3ec1334a72da137e) >> +>> endobj +599 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.707 298.493 385.23 309.397] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag) >> +>> endobj +600 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [401.001 298.493 513.996 309.397] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g2f2a1aa8fbda2e53218cecba593f7427) >> +>> endobj +626 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 286.537 203.344 297.441] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g2f2a1aa8fbda2e53218cecba593f7427) >> +>> endobj +601 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.486 247.683 385.009 258.587] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag) >> +>> endobj +602 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [427.87 247.683 513.996 258.587] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6d1de7e82c3d57a0a6229187078537d7) >> +>> endobj +628 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 235.728 256.225 246.632] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6d1de7e82c3d57a0a6229187078537d7) >> +>> endobj +603 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.514 196.874 404.049 207.778] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag) >> +>> endobj +604 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [412.628 196.874 513.996 207.778] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g576b0ae433a83ef58a3c174a86623582) >> +>> endobj +630 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 184.918 240.983 195.822] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g576b0ae433a83ef58a3c174a86623582) >> +>> endobj +605 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [182.917 146.064 415.452 156.968] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag) >> +>> endobj +606 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 146.064 513.996 156.968] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf2faa73b338e8563f6c022739e5ecc6f) >> +>> endobj +632 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 134.109 319.328 145.013] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf2faa73b338e8563f6c022739e5ecc6f) >> +>> endobj +608 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +612 0 obj << +/D [610 0 R /XYZ 90 757.935 null] +>> endobj +613 0 obj << +/D [610 0 R /XYZ 90 715.095 null] +>> endobj +614 0 obj << +/D [610 0 R /XYZ 90 676.241 null] +>> endobj +616 0 obj << +/D [610 0 R /XYZ 90 625.431 null] +>> endobj +618 0 obj << +/D [610 0 R /XYZ 90 574.622 null] +>> endobj +619 0 obj << +/D [610 0 R /XYZ 90 535.768 null] +>> endobj +620 0 obj << +/D [610 0 R /XYZ 90 496.913 null] +>> endobj +621 0 obj << +/D [610 0 R /XYZ 90 458.059 null] +>> endobj +622 0 obj << +/D [610 0 R /XYZ 90 419.205 null] +>> endobj +623 0 obj << +/D [610 0 R /XYZ 90 368.395 null] +>> endobj +625 0 obj << +/D [610 0 R /XYZ 90 317.586 null] +>> endobj +627 0 obj << +/D [610 0 R /XYZ 90 266.776 null] +>> endobj +629 0 obj << +/D [610 0 R /XYZ 90 215.967 null] +>> endobj +631 0 obj << +/D [610 0 R /XYZ 90 165.158 null] +>> endobj +609 0 obj << +/Font << /F63 177 0 R /F72 202 0 R /F50 143 0 R /F23 144 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +667 0 obj << +/Length 1627 +/Filter /FlateDecode +>> +stream +xÚ͙ÝsÚ8Àßù+üvöLQôaùãÞr)É¥—&)!sÓi;x +Æg›¤™›ûßoeÉSCLBÚ¾`0òîj÷·«•Œ‰³ÎƒÎÑ©Ã ùuŒÁØð±á:qJŒÁÈød:ˆ[]‚16/¢»4L­.åØ|æaþ˜ˆÌê2B}fRn}¼ëô:dcƒ²¸‹\ƍá¼óé 6Fpÿó=ã¡57lÊà:3n::x§]”!ìpeW/^ÎEæÑ"Î +Íå£G§¯=Gd3ÏèRŠœòÙÏT[[>c|êr˜¡™ú¾4?èyô‹rÚI2 ä¨àÔæiÅy0°çÛ­}ž`å¨&ygýÞ±E1½þË ßí嚞oþW»¹‚Í¥Kßqì6—BjoE6L£;™)RN>êKj1×3MðÚ­D]2çb¤þ¸ÓYªË°€Ï"ܔ¢F˶¤C‘6…+C>!/É×#«|8±ÌÆEº5\nO%Mç¬wÙëëpXÄ3!îŠÞóËÞLIm[ÄuåSU®1]葃17?î“q6Ùmûõ°vH'W7·ýžžÊfj6h{„GÑXZ5ŠØ8W·¿FñH]ŒÕu"3W"R@ ˜ÈßÙ È} ¸Œ±5pÓhԂ^ÆvÒ+E럿=Â5™[¡ÝʜåSó¸ü¾UíÅxçL~IÄ ûöÑet™0t 6C„kÓN—ñð mÔ짻Œyø-Ȓp(‚Q4q49ü3æx«°BPõxor}tJ×'O‰Âá/e>ÆLߘ)Í#å˜9è'mbÞ¥XBk×£þwåUÈJxoõ³‘çVÊԀš\9´²¦¢œÍ¡? +/–4•®Ô”EZù zۂ–²¿†zÌ4ŒG3!ÿÛ¯Z9ÆZU«V<ċ< Äw‘íy¯Ãq}äQ÷UYЭÒ}8[Š2Ú¡®£E©¼ªo‰,šÄa.j<]•Êu?ƒh$©ÜuÜ[Tâ…w3qp´ ­£m\Ëz=ª×ªnçùc·°;k¬-·ˆN¸û0mˆ-ñ[¡Öȇ(©øÈòÑb™7bQ×/‡íLÂ0¢°ð¶jžÛ†sÜ>ž§ç=5¥z®Ú`a-r•®Ü“ŠpþæiI—&œ³„I½›˜D÷B×u #)©©q€#æÕuhŽ|˜ë´*„Y{Ž†ÓÒyÄ°¿ÎÑ–ä7¶æ¢ä'‘ä!燂–íÅl¶v‹Ï°Ú¤ƒ¢¸è=ßÔF' °šÑre+®Óh(›Š©úÕNòe—Ra +”:ûöz&A â䙌2æ æ҃2š‰:ŸJÂ`¬;ìç­c x—Ð'[F¡ÁdŸV'iÍ(#‘®÷Fä›Û]Šï•7jÀÜé‘ˬ$c¼ÐL KôtÏ¢ü°«•‚Õšñ*ƒ›ØáhU÷ܧCñݯ’“_h|춬˜Õê›ìχè®VyW‘©ð.Óúþ¹„¤} ô` Ž¤‰‚‘ë<Š\¯]áÙ²Áº`Ûßí]0ØÐí"oµýÕ|<¤aèҾɘg«åTǂ¿<¾Í ¹Ra¶W‰ÉÒ¡\F|f.c¹5)²Fñ¢ŒD’Op¨b,ÒTŒPCÓ,fQ,ôR—8ŠS?Cš‰x¢¤É³’VԖRZ!ElKoÓAÏmÍ¢ü± ¶ª UÜ>¨My’TÕ­<í‘ÖlÁލbóÛçá›/¨0—xmßOï¥ hT8Hõ^ŠûÐÐêé +Óåɝ:N˜ËüdÔ¼^̧b”†êßÕ»4øq¢†\„ñdNôóç2Ç²›P§pë6éoçf¦xÆËp¦þ“ÞK•"Õçp#ÈC*£…¬.Ã6¬> endobj +607 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 697.247 251.533 708.151] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ge5679e4f41db32b7b91dfc81574fc1d6) >> +>> endobj +633 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 681.681 291.912 692.211] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gge5679e4f41db32b7b91dfc81574fc1d681067f9cf8984d1b3febca4488a137e1) >> +>> endobj +634 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [309.096 681.681 511.506 692.211] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gge5679e4f41db32b7b91dfc81574fc1d6f8c3e04d66cd611db5efcd92a6c52425) >> +>> endobj +635 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 669.725 269.267 680.256] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gge5679e4f41db32b7b91dfc81574fc1d6a166787e251ef2cbaad9213d8e9d2653) >> +>> endobj +636 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [272.256 669.725 496.245 680.256] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gge5679e4f41db32b7b91dfc81574fc1d69e4eb4979711bf6699ec8e0f335de476) >> +>> endobj +637 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 653.785 313.491 664.316] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gge5679e4f41db32b7b91dfc81574fc1d69029c33b6876c560bf78b5b86d0367c0) >> +>> endobj +638 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.833 614.557 255.144 625.461] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf449476be1ec42bab45fb86e7478bdf9) >> +>> endobj +639 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [273.505 614.557 414.236 625.461] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ggf449476be1ec42bab45fb86e7478bdf9132c76cbee67b5bc2ac9e09af9c68c4f) >> +>> endobj +640 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [422.52 614.557 513.996 625.461] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ggf449476be1ec42bab45fb86e7478bdf91304ca7fa8d3e734d1677709a37d5d28) >> +>> endobj +670 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 603.319 165.776 613.506] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ggf449476be1ec42bab45fb86e7478bdf91304ca7fa8d3e734d1677709a37d5d28) >> +>> endobj +641 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.33 603.319 327.707 613.506] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ggf449476be1ec42bab45fb86e7478bdf9fdbee5cd06ff135cbf9614b661c9e923) >> +>> endobj +642 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [342.261 603.319 513.996 613.506] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ggf449476be1ec42bab45fb86e7478bdf9b32d9464a7101eb1893562646a3cdd1a) >> +>> endobj +671 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 591.021 145.233 601.551] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ggf449476be1ec42bab45fb86e7478bdf9b32d9464a7101eb1893562646a3cdd1a) >> +>> endobj +643 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.362 551.793 273.916 562.697] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g5b805182b79b6fb873d0624f7dfd2ee1) >> +>> endobj +644 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [283.335 551.793 453.397 562.697] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gg5b805182b79b6fb873d0624f7dfd2ee159042baec996bc386154a1825ad56de0) >> +>> endobj +645 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [457.21 551.793 513.996 562.697] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gg5b805182b79b6fb873d0624f7dfd2ee1a05a8932097b094ca179e99e2d80b6ae) >> +>> endobj +672 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 540.211 269.227 550.742] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gg5b805182b79b6fb873d0624f7dfd2ee1a05a8932097b094ca179e99e2d80b6ae) >> +>> endobj +646 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [272.216 540.211 448.922 550.742] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gg5b805182b79b6fb873d0624f7dfd2ee13e5170687052e3962de866e2ab44d8f8) >> +>> endobj +647 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 459.075 237.386 469.979] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ge8e2db00ec6575b865057ffd3195327b) >> +>> endobj +648 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.202 459.075 324.558 469.979] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +649 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 420.221 215.259 431.125] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gdc14acd60d7235a72f88850b9a917eca) >> +>> endobj +650 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [219.075 420.221 302.432 431.125] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +651 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 381.366 215 392.27] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g7593947fa164900140d09c08b56c6cd1) >> +>> endobj +652 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.816 381.366 302.172 392.27] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +653 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 342.512 218.318 353.416] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g56026e685fb0fe336a5f346580f84ff0) >> +>> endobj +654 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [282.178 342.512 365.534 353.416] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +655 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 303.658 223.299 314.562] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g13f1f84a46d70b91637cb9d6af54af6b) >> +>> endobj +656 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [276.638 303.658 359.995 314.562] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +657 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 264.804 275.881 275.708] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g0764a0e607ec4de08a53e6d3b109a714) >> +>> endobj +658 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.697 264.804 434.744 275.708] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g1822baf29ede5879f1c6ed77f0ca5984) >> +>> endobj +659 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 225.949 276.987 236.853] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gc37b94ca7dc0c8bb9797e6d91e16492e) >> +>> endobj +660 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [280.803 225.949 435.85 236.853] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g1822baf29ede5879f1c6ed77f0ca5984) >> +>> endobj +661 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.704 187.095 221.734 197.999] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g763a5fa98155383055703dc08cb3e11a) >> +>> endobj +664 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +668 0 obj << +/D [666 0 R /XYZ 90 757.935 null] +>> endobj +669 0 obj << +/D [666 0 R /XYZ 90 716.221 null] +>> endobj +673 0 obj << +/D [666 0 R /XYZ 90 478.049 null] +>> endobj +674 0 obj << +/D [666 0 R /XYZ 90 478.049 null] +>> endobj +675 0 obj << +/D [666 0 R /XYZ 90 439.314 null] +>> endobj +676 0 obj << +/D [666 0 R /XYZ 90 400.46 null] +>> endobj +677 0 obj << +/D [666 0 R /XYZ 90 361.605 null] +>> endobj +678 0 obj << +/D [666 0 R /XYZ 90 322.751 null] +>> endobj +679 0 obj << +/D [666 0 R /XYZ 90 283.897 null] +>> endobj +680 0 obj << +/D [666 0 R /XYZ 90 245.043 null] +>> endobj +665 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F72 202 0 R /F23 144 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +706 0 obj << +/Length 1849 +/Filter /FlateDecode +>> +stream +xÚÝXësÛ6ÿ®¿‚ßJ͜`¾@‘ýæØNG©âø,¹ÓLÒÑÀ$dáÂWø°ªÿþX€"e]îf.î´ýD`,v÷·/бž,Çúiòf=¹xúVLâÐ ­õ֊kº„z®µN­OvHètæ:Žc/ÅcÍêÃtæQǾf-ko¦3ßõbßöÂéoëw“›õäëÄގå*^tNæ>µ’|òé7ÇJþÎrˆGÖ^íÊ­Àóá›Y«É?'Î7åò|â„åúe{6«{Ì@yµ9{ñ–:ƒƒnH?²fžGBsø³çÑÑëӌ‚Š]ш§‚§¨£(Z½I*S?i­îÕv¹áîn¹¹úðþnyóëbýqsµ¼\­6w–S°—ýñöÃûÅårtÍé÷âíܳ"5 ¤¨RÄÀ³fn@â @Q¯Ê”£8å¿íNöe 7ÙM;KX£iU™Š2,ÃyRæUƧžcÿ.Z]’±¦!ÿE°‘ gF2@ v_߆«…"üÁ¶C3UeÁ‹¶7à£$v­>~¨D²ìðw2öåíÇW4tWˆgŽ¶~M3};õq »ÝÜß,/§®ëÚëÌ«ÍõbõîÃâvýÿšnQ¤âY¤]ïoBûZâx2Ödí‰]¥ïíxZOj—ÒX‘žìjx;Æ¥*AùÆÜЊf;¼…€Š¦̨ͤ©w=õç¶ÞŠæ_’џɯ¿…×j}¿¸Z›u@íæ~usµ^}Oð|'FðäÀ€'ÇŽ8NÁ“4PRÇ O$B£ +G߉ŽÈqÄˎ8ŽNqü½à˜ÐÔ¥æ«Y¥²4è5ŸÄ4F=E‘d]z„Cÿ2øC¼.n¯–×7צxÑïœy¿kÿe"Uîõàfõ7D¬C\ÚWDí5aûéæloVïÿp¬Xš¾4á“L¢¼àÚÆÐè鎯˴º2Ë¡µå–+ðÈ7ñ?ÅÉ#eæÇā·Fà—úýŠ¸ú uÍ[&2cõkÞ$µ¨ZÞÌOà„ìÄt +^O#džWʷڏ¶F³^âløBK/´QoPóŒµF„æ?–™HÎÇÀQI_æ$ôô£i­®qÂg˜Vu)Í°)®@y<àsæÁ€Úì4r§f™³BTlÀ"ç¬Ð÷¨XrMʺæ ôëÚ äžŠ}í4OsàFê™Våœ]z+n»"‘˜è {éeý¥w´òí99yyŽ½*hŒ]Ãx[¶üÇo>W#2wb7"õؗP¡×n4Ïb{À–z¤¼åJjœª6¾Ðjç†8=Õ,ϱOB.í/ÊõÙ„½çý^ƒ)Ëv§—´Y¡‹˜µåLù ®HSž1öɁ¢,Ì÷˜ïÎÍF%‹ïÙ{¡®„¥r"ô8= ûY +»)¹³ªBå`ÂY²±=[ŽDµ ‹Ñ—.üýåæýŽ¸§à§)ILMÜP»kxëèÊôxÏÒç­D„%zEUX‚­5‡×äšKhy!c—&A–Õ˺vV|ޚç1¨/4j¬lRKgeaž¿,Ixӌ £ŒW,[§Á©dîú"=âÆÁ17z:7®§ó@'8ˤ !×èiR"îSk;<:Ð)Ù±Åñ†â¸.%~4–X&Ç?#ôœP²ôžªÊ6¢Ü<+xðÇÓ¦ìÚªk7&el¤ŸêȽ©éCEiôaØâžIù3jbDcwƒaÞÁcÚ +¼þlÚgKOêDUð}{–ðšhㄯ/¾”‰Ãú[äØÜ¢g’µŒ˜IRlç]£ÏìkÑr2üÀÜê÷N@¨yqփÝ3GHèÀF^ +C ʳAwdHÏ%¾Ó'ƒap¹ô–ÈPS|m¥[ AfQ¹º„.ËfÊ.)(‰¼è$Æx ¹”)Õ<ù”’ç‚+Š¤Ô½Ç ?&öÔDÉåE:‰áQ™åI¦1 ©DîŃ=cq)µ!ÍÐ`­nÀÿY£3eÅkcX˜b‚Y£vl겖äLZD…”_…®®œ0î;V5gÀŠBˆÖØàÀëº(Ï !ˆzDûö8«ö¾ØO‡ºÓ–wãGf0Õ¶Ëp®j5;LCe?ðtðÀÒ±IZªòªVp‡!!«Š#G­9vÎ;”K¸P £€Ž]â‘7P1›sá&Lû¹©å¦Ç껀Óÿæ!ôÉnô¿þ6W¿ËÁ¦!‰ç~¤—Ó˜P:Ê!¾oß©¦¸Î¥¡ÆÞé—áêñ?L®pËÚãŽ=éó‹“ +¤(k?HGlðÀ{V`ÿk2 +5â:ē9P‚µmŹ6Zà‹eF?O”Gõòè‹úÈÞµmõãÅÅ~¿'IC:è!k"Ú È¾/{¬#ž4îý$–cyDÄ\ÅÌ œþ t¥( +endstream +endobj +705 0 obj << +/Type /Page +/Contents 706 0 R +/Resources 704 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 582 0 R +/Annots [ 662 0 R 663 0 R 697 0 R 698 0 R 699 0 R 700 0 R 701 0 R 702 0 R 703 0 R ] +>> endobj +662 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.387 697.247 359.547 708.151] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g1fd59c6502c8cbb9dbb802e4af34c940) >> +>> endobj +663 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.387 658.393 337.311 669.297] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gb9fc89c0e89d4487a1f69a26849b682a) >> +>> endobj +697 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.387 619.539 316.27 630.443] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g735949470e98393af90b12f534b06cba) >> +>> endobj +698 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.387 580.684 356.768 591.588] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ge439fa617415f2153f4793041c41bd9f) >> +>> endobj +699 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.387 541.83 410.028 552.734] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gef15021f65d2810602a9a1bd06fc878d) >> +>> endobj +700 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.387 492.017 363.961 502.921] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g841003bef28b1052aa2b5297a529d4d8) >> +>> endobj +701 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.387 453.163 354.566 464.067] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ge311117a92fca76fc66fe3442ff6d09f) >> +>> endobj +702 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.387 414.308 351.249 425.212] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g0aac22e2dc312e8c41418dd8d59701f8) >> +>> endobj +703 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +707 0 obj << +/D [705 0 R /XYZ 90 757.935 null] +>> endobj +708 0 obj << +/D [705 0 R /XYZ 90 716.221 null] +>> endobj +709 0 obj << +/D [705 0 R /XYZ 90 716.221 null] +>> endobj +710 0 obj << +/D [705 0 R /XYZ 90 677.486 null] +>> endobj +711 0 obj << +/D [705 0 R /XYZ 90 638.632 null] +>> endobj +712 0 obj << +/D [705 0 R /XYZ 90 599.778 null] +>> endobj +713 0 obj << +/D [705 0 R /XYZ 90 560.923 null] +>> endobj +714 0 obj << +/D [705 0 R /XYZ 90 511.11 null] +>> endobj +715 0 obj << +/D [705 0 R /XYZ 90 472.256 null] +>> endobj +716 0 obj << +/D [705 0 R /XYZ 90 433.402 null] +>> endobj +717 0 obj << +/D [705 0 R /XYZ 90 376.988 null] +>> endobj +718 0 obj << +/D [705 0 R /XYZ 90 209.141 null] +>> endobj +524 0 obj << +/D [705 0 R /XYZ 90 184.927 null] +>> endobj +719 0 obj << +/D [705 0 R /XYZ 90 184.927 null] +>> endobj +704 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F72 202 0 R /F23 144 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +723 0 obj << +/Length 1460 +/Filter /FlateDecode +>> +stream +xÚÍXÛrâF}ç+ô©*Œç>ÒV’*Çfo¼6‹ñÃÖfK%ƒÀª‰H"Žÿ>­+º!À•½¼ØF=§Ïœ>=3X[jX»ü>œ½•L³%©Ô¦ Íš’ J´é\û¤K$Œ!Áë7Þcè„/Ɛ +¬_:±¿lÜÈ2B-¦Se|ž¾Œ¦ƒ¿bc¤±„BŠ m¶|úŒµ9|ÿNÈY¦öœŽZkœ2ø¿Òî¸eKQâB,G6ò·k7tb/ð3tSCqÐåXƒüîÇÙ@ S )GŒ[•XˆäÑ\ˆ–½¸Ù¬ìäɾü(Ϗí24Ä9{+p"D% +Iʳ¨—n4 ½Ç„¢$Xü”à ÝUŠ$*7¡Óii4S"¬Èëñï¯% ÝW ¨%‚L¨©²–x^Io·þlw®<ê$É˓äìÉ ;öCà:ŠªÝ†³h ^^Z^RÅ^`?‡ÎƆ݆ç/á؍¼+pºIÍ}󦐰D{ÂÚÒÕ&ŒÂY&BQ嘟¡ä\ßú‘·ôáðÚ)0Œ/— ̨³çî&~ê.Ç|mp8C/’°†îܦkA™úؐÀIAˆ2}F±Ô¤½rýe' ”qYA#`={ÐÀá†H³MÿL&ôvÉv‹#H‡'ƒPUÕ­ù!öV^œ_,jJ]¥Púu"žMªœª?'ؚ;V× Bÿ÷ôë†q’raÑQV &­°U7ë\{û½AßnyAlÃYñ9/‘äóS°š—%EŽùS°£èM§“×ì­©ë}ÀœÛ®ìíÊÝU§E©¢®¸=ßK)Dfû¶& š̵’Ú£¯|Ν¬ŽSUƒßIOnGædqæëRrV«Fn•*y4(Aܗ|ÐnöõÚ!Î[‚׫gâÆÛ0áÈo”N«¶KfZ+ò"¹jx~­#®!Ç`6Lÿ:»›Ç4·b[×nöÍË]i"‹˜ÇÞí¦wºŠD–bf~§+Àý¯fÁXb$Œd€eT«—'w:Ù¯»{hx¸È†Ü8þrë,ó÷¯}0 T2Î,ÿê!rߒŒ¢ì…÷Ž¿uVÙoIý'™\++Cøº F4±c”4W®ß»nNFÆÀ­øôg²À¢’…n°»˜zŠã͛³³ççg4‹ÐÖ÷6!òâ3èégíuÞ!l•›¶Ll¤GÈÁó“;…Ô:ZëôüWò% +endstream +endobj +722 0 obj << +/Type /Page +/Contents 723 0 R +/Resources 721 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 582 0 R +/Annots [ 720 0 R ] +>> endobj +720 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +724 0 obj << +/D [722 0 R /XYZ 90 757.935 null] +>> endobj +725 0 obj << +/D [722 0 R /XYZ 90 733.028 null] +>> endobj +681 0 obj << +/D [722 0 R /XYZ 90 714.318 null] +>> endobj +726 0 obj << +/D [722 0 R /XYZ 90 714.318 null] +>> endobj +682 0 obj << +/D [722 0 R /XYZ 107.713 639.496 null] +>> endobj +683 0 obj << +/D [722 0 R /XYZ 107.713 624.398 null] +>> endobj +684 0 obj << +/D [722 0 R /XYZ 107.713 609.3 null] +>> endobj +685 0 obj << +/D [722 0 R /XYZ 107.713 594.202 null] +>> endobj +686 0 obj << +/D [722 0 R /XYZ 107.713 579.104 null] +>> endobj +687 0 obj << +/D [722 0 R /XYZ 90 570.032 null] +>> endobj +729 0 obj << +/D [722 0 R /XYZ 90 555.84 null] +>> endobj +688 0 obj << +/D [722 0 R /XYZ 107.713 480.211 null] +>> endobj +689 0 obj << +/D [722 0 R /XYZ 107.713 465.113 null] +>> endobj +690 0 obj << +/D [722 0 R /XYZ 107.713 450.015 null] +>> endobj +691 0 obj << +/D [722 0 R /XYZ 107.713 434.917 null] +>> endobj +692 0 obj << +/D [722 0 R /XYZ 90 424.903 null] +>> endobj +730 0 obj << +/D [722 0 R /XYZ 90 410.712 null] +>> endobj +693 0 obj << +/D [722 0 R /XYZ 107.713 336.024 null] +>> endobj +694 0 obj << +/D [722 0 R /XYZ 107.713 320.926 null] +>> endobj +695 0 obj << +/D [722 0 R /XYZ 107.713 305.828 null] +>> endobj +731 0 obj << +/D [722 0 R /XYZ 90 289.48 null] +>> endobj +696 0 obj << +/D [722 0 R /XYZ 90 267.168 null] +>> endobj +732 0 obj << +/D [722 0 R /XYZ 90 267.168 null] +>> endobj +721 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F89 447 0 R /F11 727 0 R /F8 728 0 R /F23 144 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +759 0 obj << +/Length 1902 +/Filter /FlateDecode +>> +stream +xÚÕYYÛ6~÷¯ЇÊ@Íå!êHŠɦ)r5éfû”†,ѶYr%9Îæ×wxè°,{׉7iŸDQäp8óÍ|C +[ [Œ_.žºÌ +PàR׺ž[¶<— N‰u[ïlo<¡ۗiX–ºù$6+‘Ua•äÙxÂÌ´©?þpý|ôûõèŸÑØ"J÷Ç¸­Fï>`+†þçF,ð­­µ²Êà™ZoGpO-â 渴֋2„]ÞèE0>¢¨£ep®d`kBa§Ô7"1BÖëtz™‹ù{Œi”€ˆi.´ÐgY%Šy ýz%æ¢ßt©58î˜O.!•ô×cÛ7ka4 ³X7æ›,’Zšþy^èFJŒ)·EJd6Âw!r©£ù)É¢tuéŒä y`k¬þ: üʚÒÑt)ÂXh9 ÏgÈõÝzøo‘ÛâpD³&Œ"o]‰4¬„ÙüÓfó·Úï=æøϼ2Ư–aU·Di:ÃÂ4²Ü|\‰ÕL=C#EFkÕÏÞsÄõ)G¼VÿTÅ&ªò¢üE ~T–É"“pë¹ö‰¨‡î¬ÖÛ'aÈá°€“xf¯”ò)Ö» p&°„î–AU,Lt]©rEéµLHØlŠwԗ('H«ÙΘiÕÛ Ý±™OcN ˜Å|ë À§ Ô¢#ñ¨åÃ4×шräz`-0Zà˜à½,Æ̳  +bˆaj‡òÁl0Cè>N¬­5T÷6©–zô§0Ý݉éGùi[$»²©½„©ÐŸUÈÊN€¢n˜•Ó= Ò +Ž‰­‘¯ú†õ ëgëIeÙDjkõrYPPÙ± ðšðDƒÖ=È Db¤Iç>!9ùjºZ™~tRæ"îNåZIÕürg¼R/6ã•ú®Äõ½¯²orŒÆ« À&» peß"ù$2Ý;»ÙæÚ¼z£¿€ÇÄØÁöbL°-ŠxQ‡*­ ¾  ËSÛ1tƒ5ê@‘Ë„º«Ù¥¹­«{(°„L´ù€êtG¹â3öL#Óný<:»Èã¬uïÐáÁ×Åq0"œ}¿àù1ižrôïŸI·n6’ôz«2fÂÝyƒ2a˜84,ûx“¤q]Ž…V[m$ýñëÝÊçC`cPà: ؆°Æk¬øP‹j¢¨]§‰¢n…¨£H–;-Ý(¥Î02…9P à{âßCÜ L¼ð3ÄK¨Ê±À5FP\Vß@`×!»@Õ¦qz>à#(òš@†|äҚœÞ`§fhÖìÍÙMbš=8¾{8XQŸc.èOƒ …3æÁ9Ò+ã5\ 0;‚˜Û,ãgBs4zŽ(ퟘ&A·²ˆ¾ +}~}GòÞ.Rö“ÍDˆ‹ü" àí€Â=x·ÀÞEÄùJ*‡#.)ç£òX¤¢ç¢ìûáÊ!<ËdÈCªHâ°¡¦Æ㆜öÝã(¶^ˆ ¹‡!΂6+Õüº +?ªc^ˍ9Bõ±VæZçYœdæ¢ÆôåzRT Ù&iª[Š/!ÙU›0­Ys&º“S–">Ž—·`9‚(vÛ€Úêë‹+Ɠ×Y½Ú£Ô*k&ß¹¹Ë=0'ÿz< Žç¢Hc‰·¢êòÃl{Iê$:£¨-b‡ÏB.¥4~®ƒ|ì& ÿ)~ÂÏwÁOøy?ý?¥®¯*¼;þ(U?Ha·. +<¨ôÿQ ÎÍ>¯U%˜ýFÚ-,VwŒÚoòôf)â"Ô__&³",nôË¥ò2Ì›paæëÿŸ—ú(tA".~K¦Ò^…”Ôú›N`°¤(JÍKЉxšJÈTŽ(܄1†¶ÀG«n½)p¶û¢Ž¼Ä«q·¬ªõƒ‹‹ív‹¢m²d] ¤ºç\ìWÑ­Bㆇ4{€b«\ý> endobj +733 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 543.954 223.166 554.858] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag_5fa6bcd4ec3cf844646033688f2fdf0a) >> +>> endobj +734 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [226.982 543.954 298.463 554.858] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +735 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 496.134 277.402 507.038] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag_af38dc5a17ef89e16c45f363397afb59) >> +>> endobj +736 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.218 496.134 352.699 507.038] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +737 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 448.313 296.52 459.217] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag_fabc584f4f391708d6c0d7c47030471a) >> +>> endobj +738 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [300.336 448.313 371.817 459.217] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +739 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [391.682 448.313 489.176 459.217] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf1c4903edb1a626a36a7220038f963c4) >> +>> endobj +740 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 411.451 285.96 422.355] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag_39db5035590b4bf7017a43cdcca6a49e) >> +>> endobj +741 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [289.775 411.451 361.257 422.355] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +742 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.952 374.59 304.924 385.494] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag_1ef606afeb25edded051be3b0c728086) >> +>> endobj +743 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [308.586 374.59 380.067 385.494] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +744 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [396.896 374.59 494.389 385.494] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf1c4903edb1a626a36a7220038f963c4) >> +>> endobj +745 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 337.728 230.608 348.632] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag_cad04388edea0d80b20c40266a3c3f14) >> +>> endobj +746 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [234.423 337.728 331.917 348.632] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf1c4903edb1a626a36a7220038f963c4) >> +>> endobj +747 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 264.313 244.456 275.217] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag_be5af687ddf08c6379bd115d210ac22f) >> +>> endobj +748 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [248.271 264.313 345.765 275.217] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf1c4903edb1a626a36a7220038f963c4) >> +>> endobj +749 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 227.451 221.203 238.355] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag_001b2a61c18a500a446151a9024de3fe) >> +>> endobj +750 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [225.019 227.451 322.512 238.355] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf1c4903edb1a626a36a7220038f963c4) >> +>> endobj +751 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 179.63 252.755 190.534] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag_474cce1b8348a126a8496cea7952a1f1) >> +>> endobj +752 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 142.768 222.319 153.672] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag_526a2d8ad27e00b633408a36830dc2ae) >> +>> endobj +753 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 94.948 223.973 105.852] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag_f0b12578ecdb0571ca51ee09789b2fc3) >> +>> endobj +756 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +760 0 obj << +/D [758 0 R /XYZ 90 757.935 null] +>> endobj +58 0 obj << +/D [758 0 R /XYZ 90 733.028 null] +>> endobj +340 0 obj << +/D [758 0 R /XYZ 90 712.582 null] +>> endobj +62 0 obj << +/D [758 0 R /XYZ 90 712.582 null] +>> endobj +761 0 obj << +/D [758 0 R /XYZ 90 612.125 null] +>> endobj +762 0 obj << +/D [758 0 R /XYZ 90 559.033 null] +>> endobj +763 0 obj << +/D [758 0 R /XYZ 90 513.235 null] +>> endobj +764 0 obj << +/D [758 0 R /XYZ 90 465.414 null] +>> endobj +765 0 obj << +/D [758 0 R /XYZ 90 428.552 null] +>> endobj +766 0 obj << +/D [758 0 R /XYZ 90 391.69 null] +>> endobj +767 0 obj << +/D [758 0 R /XYZ 90 354.829 null] +>> endobj +768 0 obj << +/D [758 0 R /XYZ 90 279.391 null] +>> endobj +769 0 obj << +/D [758 0 R /XYZ 90 244.552 null] +>> endobj +770 0 obj << +/D [758 0 R /XYZ 90 196.731 null] +>> endobj +771 0 obj << +/D [758 0 R /XYZ 90 159.869 null] +>> endobj +772 0 obj << +/D [758 0 R /XYZ 90 112.049 null] +>> endobj +757 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F65 179 0 R /F11 727 0 R /F23 144 0 R /F72 202 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +790 0 obj << +/Length 1821 +/Filter /FlateDecode +>> +stream +xÚÅYYoÛF~ׯ ЇR@´ÞƒgRhœNÖMܧ$Pir%áUVüï;{Q$M_Ý¾x.?Îì|sÉØÚZØz»xy¾8zã1+D¡G=ë|c…Øò=‚\J¬óÄúdûˆ.WclWU¶>.‹mÝñ"æëWMËóu\M»N[^GmY¯Ûh»\QÛ'lm¢˜«å¾áõ’¶x‰G™MÃå—ów‹×狿äÁ‘ßw}ä3׊óŧ/ØJ`ÿ… k/Oå–CŒ™õqñÇk]¦£ÔͧVºyŽÐ8Q˜ú”!ì¹JÁ¼íê¢1=fGj¨Ê&mÓK!»çØ)¨²t°½]lƒòHºQc\òÐë3Æ4NyѤzÉ|›«ÅEÙ Ož‰•xjw¿Kã%qíFŠ.î ΩŽ‹q@%)n}S‡ÆšÈ Cs&Õ24¼U“¶Tš´;žjù'Í»\-.£¬ã/®%Ö( Ì££Ð ¢RÆ\Ø«¡ÄzŸ‚à ’Ö¼ÉfœðmÅ<„C£*¨¯ý®àßtEܦÀ°òÑCŽ rà3¥îèëÓÊ +ƒ%õ¶ Z½Õœû ˆ +Ž§åºªá$LK݃i§âÏØÅ7bJ<å!×ÀÖ³pߏÌÞãÄâ”"ρkíC(µÏ„ØÍ,‡ñz +ÍÈG¥æÐå:Fˆ(ñ͉¦MÊ®ÁaQ¿'â팘Øqº  +T Bçq,¹y )ߜœ¾VjÑ!K‰K!þôê S§F8( ÈáŠjåÏî–òiøÄp ŠúOÆ)¸¿šl!Z:&tme¸1ú†bþø~™BÄ9†Cîãp(jH¢xÑŽD©B6$Ñ D’³ÁEUÿ# g~ž”F‘ò(ËÊx%ÿF-OÔ.èŸ2÷>®J‘˜kMD4Ì©°Luº:ä/ƒz™FsòS‘Øðêgt ¢>º ×² ‘[+‡"ÂBS[DtuõŠ·Qšé^ñ&®ÓJä¾z`ස˜I—çËÛW׺F…ÙôÙS-K}Wñ”#ÔAÀazÏ¥o‡P5hl˜*l˜ ±ÅRbÃä:¶Ú¯êR˜å2M$(ÔG…z m¸ÖUµ¢ø^)ör¯NšÞ‡  rÆÇÓ +l.23à¥0ÙÊq(\rŋDpK~¶,Œ +…€Úv+U1¨™')‚HǨvA{ $#¾Š‚ ;öÙÙ©šÌ]ƒØÏ£+5¹Ðo¤y•ñËËò;`v…®Õ²ªyœ6‚ê}Q›ÂÅnyݘýM ûíû³ÞÎBÏÄ!'\™ ËZ´£Â9A¤û‘ž6ÄDÂ}ÚjOŒw<þ:e¢’Tüáµ…ÊðáJ‹IwâÖ¤& íÎxý”[">ȕ~¾å…h[ŒF›ºÌ'imSB,’B)šHµ0ÍøóqT%rXné"×½#íÈ`½Þñ(àåBټӁˆYŠaT^ iœøá6c_Ô÷û 3Š{qu\—2«Ø#ÃðH€¡ÙH‹8ë-*!ƒ“R}è µcÿ4ƒ½¤ÓWû7÷> òÏÿ¹·Ì°Æ€†Œ2&"gºÈì@¤QÛrûÝ +'ù­l¹á]Ôö lôfTëIQê‡9Ï/Lâ덀nIé#ˆ sõX§îb`M£ÿ—¦I·…p²‰Ù!7é£ÿEWF(Ql/¸ôÃ;Y?ý‚¸»K»Û™&ڎJ;h¿½`œ!îÓ#TqÚÞ·  é¸ {Ù¥YҌŠ¢Bá½Zü%U88¥x$tùqbÑ} OÇ8;x˜ñqm•&˜1IT]Õ̖‚ \Ó†ªÞPJ‘YìSßG¡ŒºßÝ02Ï}ÉÖ"W<ŠCŽ RïSҒ¢òÒ¶ +;ÝÒm€ÐQ»1/ž.Hˆ­“ÒéÑugò0lÎ%d·H Ú ÄtèjGE\ùlø–oUWj£ÜÌ°›8>rýþÖæÉ )üðÃÝ @siïkòS…³‰ùæ W’h—δ8±ò9•mîÔ/jµ%<ðFBÆ¿êÝáÀ! +°ó„þëƒÝåûݗ¸Ø“¤ŒdÎzrïuŸÈ{AvÒÜæe÷pÀ›¾0©ý›:¾æmӟã=°6 îûk¼üÕìì¡Ð‡Ø¬þ£à†PjŒjxÆì3ÉÔ:‡Qû¬Ì®v<©#õô4½¨£úJ-ŽÕ‘Ó¨ØvÑV¿2©îaëφCrƒšºQ/¼Š.ÊÔ3a-Ýjè®61 ªß=ÒGÎõe¨øj™Ù¯ 齨 Üw¡»¶­ží÷{7¨+ÒªFi{–:º^&@1÷ð˽ª¡A°¼”U萰™ËFMíôO¦ì +endstream +endobj +789 0 obj << +/Type /Page +/Contents 790 0 R +/Resources 788 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 801 0 R +/Annots [ 754 0 R 755 0 R 773 0 R 774 0 R 775 0 R 776 0 R 777 0 R 778 0 R 779 0 R 780 0 R 781 0 R 799 0 R 782 0 R 783 0 R 784 0 R 787 0 R ] +>> endobj +754 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 649.574 238.369 660.478] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag_a1816497499ee569563a6d97a4ff553a) >> +>> endobj +755 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [242.184 649.574 339.678 660.478] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf1c4903edb1a626a36a7220038f963c4) >> +>> endobj +773 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 612.752 241.686 623.655] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag_1e3bb22af6b60660fcb8d201b09ec7ed) >> +>> endobj +774 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [305.546 612.752 403.039 623.655] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf1c4903edb1a626a36a7220038f963c4) >> +>> endobj +775 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 575.929 246.667 586.833] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag_249071ec2d19ecedaaf4e32ca8fc4a8d) >> +>> endobj +776 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [300.007 575.929 397.5 586.833] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf1c4903edb1a626a36a7220038f963c4) >> +>> endobj +777 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.672 230.668 330.933 241.572] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__const__iterator__tag_9af8efc183a5a4cd4475146207f92c8a) >> +>> endobj +778 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [344.314 230.668 513.996 241.572] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__const__iterator__tag) >> +>> endobj +779 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [159.18 181.89 513.996 192.794] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__const__iterator__tag_38ece4277d5885940d45d6c8465ca19a) >> +>> endobj +780 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.412 169.935 298.094 180.839] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__const__iterator__tag) >> +>> endobj +781 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.507 169.935 513.996 180.839] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ge8610cd48952cf1dc71b525235f6f583) >> +>> endobj +799 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 158.354 163.61 168.884] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ge8610cd48952cf1dc71b525235f6f583) >> +>> endobj +782 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [150.623 110.199 513.996 121.103] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__const__iterator__tag_9c7ea131b285ad7aaefbc1e2cf579512) >> +>> endobj +783 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.412 98.244 298.094 109.147] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__const__iterator__tag) >> +>> endobj +784 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [318.302 98.244 513.996 109.147] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ge8610cd48952cf1dc71b525235f6f583) >> +>> endobj +787 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +791 0 obj << +/D [789 0 R /XYZ 90 757.935 null] +>> endobj +792 0 obj << +/D [789 0 R /XYZ 90 666.546 null] +>> endobj +793 0 obj << +/D [789 0 R /XYZ 90 629.843 null] +>> endobj +794 0 obj << +/D [789 0 R /XYZ 90 593.02 null] +>> endobj +795 0 obj << +/D [789 0 R /XYZ 90 540.64 null] +>> endobj +341 0 obj << +/D [789 0 R /XYZ 90 403.864 null] +>> endobj +66 0 obj << +/D [789 0 R /XYZ 90 397.234 null] +>> endobj +796 0 obj << +/D [789 0 R /XYZ 90 298.77 null] +>> endobj +797 0 obj << +/D [789 0 R /XYZ 90 245.737 null] +>> endobj +798 0 obj << +/D [789 0 R /XYZ 90 198.981 null] +>> endobj +800 0 obj << +/D [789 0 R /XYZ 90 127.29 null] +>> endobj +788 0 obj << +/Font << /F63 177 0 R /F72 202 0 R /F65 179 0 R /F50 143 0 R /F23 144 0 R /F11 727 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +820 0 obj << +/Length 1776 +/Filter /FlateDecode +>> +stream +xÚÍYÛnÛF}×WéC% Zï•·(Ð$M‘4-RG}J!W2ŠTHʎûõ½Q$EÙJì¦}¢H.gçrfæÌ +{k{¿Nž,&gÏ}æE(ò©ï-V^„½À'HPâ-Rïí4@l6'ãév›/Ÿ–źÚÉ"‘Ë77u#7Ë&^ÏæTà鋢‘Õ*N¤¹½+YÍH8U‹ABH(™2<{¿x9ùe1ù4! öˆÞP(`ÂK6“·ï±—Âó—F, +½k½jãqÊàš{o&N°U~xÕÆÔ ÁŸ+cLjÂπ2„}a,ú¹®³uQ5csIÊíùU®Ìµ¹”îUQ7ægÖ(“Ä4nÊJ®ÝÝhˆ|¥¦Þ¦®³¦¯QˆXHܚ¦!JB·"…½G¤øˆ°È­AکǼrö\àN|ç$ãțSŠ"ˆw”Šžïí\@̳¢±U¨ªµÙ…^@HjT¤2—‡öÝR¹Í¹¬»|Lßan¡¥!DŽÏÕÇàî‡`A‘°av».›á¾:ªY;“QÏ€‘€p†"á/ŠÇÓ«8ÏÒ¸‘õ2—q‘ær$´!$V໸ç#Á¥Ѩ@s™Yñ›øãŒà©Û­ÞU3Lå\+ó¼Þ–Eš6;í³Ò|”8!×Yž›_RûJÍ.Îs› d÷ã\ƵLoÛޅ½¢2'"®˜³ ӞÙ±/ îcWMóp*µV€_͏_>šYcõ\Ì" +Æéu]íЇrP‚*$¼î™ï©†}ÀCbTÊ:]‡àg¾¸øÂ~ Á1ð?>nžZ1ºu3p.톘„á@8ؾØl÷BÀQR·f›œš‚sP†¼Ÿ„ +? +˜+{µ^äðeÔɹ;«òu•u wÐlv›´+égól—ï%$­­D+'NS»ºQ›*˜FÁÞWcjcˆ¯lŒDÈ÷ƒ‡h¾mw¦CI­ú ü“:Áÿ­$&~΢AYˆ¨ø"àÕ-šâ–q˜ë£m 1¨A]!gO?7€ƒšþe°€}€B÷Góùi ª”/¡‰ÄH‰øèÁ篩ãöÊ¿¹ð.d³«e¡®Oê²-k(ZWÒÜAd¤"(kM*xDÓle^jÔèU]: ­Ä¡?+T)ÎZxˆ‚°¥<ªg…¢m7w +qÄG©¥áóÃlι°Å·ã|h9ç[ÏY1 + hBaF,AIáCà miБõɎ0CǜSDDàÆ(¸±ƒÔ3ÙÄY.-•y&ë¤Ê¶MV# ƒj1G™3Püfëè[ˇV»"Qìó´Xâ}+‚-F[R­‘[kóԖ$@>µ‰²Ðpálژ}çf_õ¬³¯¾UûªÝ Ô »¹q©a…m«RsÏ,µ‹+§ó²P,TÝÆI¢Z¤^«*ŸÖÅ)¬T•_+Y oZ¿Ö>31Ú2]Ë$3=ĪdˆË&5»$Òïrøƒô??ßçVìsQΑ A¯wC¨a@À³à(åÒ2Ù)cc•~ ÷cB×ûáµ¾³ïײPîwð[UåfÐMVež—3*`:pÀ:GsyÞ/e¶œ…*wˆÄí½BÌå%DÜ" +]Ú:À<#jxžÉ ì…ÁCž@šªõã õ×.=uv îA‹yPŒ ìÎclák˜ñ­ÃðRD±°FöH}ò´FaÚÜﳖ'»,OÛ䲇›­›á»Õ؝ÁíSl˜”jD“ý#¼±±ÌÑçG®€ ŸñŽÅ|ôƀ\p`Õ÷g×wÂhù·¬Êešm–ÆÇßUŒ`öo¡ŠA¦cÎnA•¹€å3 ƒå¬—E Å$ÎmØ54ÏZu³øC.o+äßp@UÀaÑÃnx°î‡ú¨ëÄsu}~±òQ@6@¥¢ÇD›¾Ö̦Ú(O0:}]æ7—2­bóöUö¡Š«sóÔ,yë]¼¶ß¿pxôW-«ï3¨Í¿Ç{óN!õJm)«ÚPxˆdUèA@ú0Ÿ¾‘îÍxà£ç~ý6юßÛEyˆp{uÙ4Ûó³³ëëk”ÔhWdÛ +eÍdÀÙaKØ !€Gµ‘1Ä۔ºÃ Y7š®õãqúëñœd +endstream +endobj +819 0 obj << +/Type /Page +/Contents 820 0 R +/Resources 818 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 801 0 R +/Annots [ 785 0 R 786 0 R 823 0 R 802 0 R 803 0 R 825 0 R 804 0 R 805 0 R 806 0 R 827 0 R 807 0 R 808 0 R 829 0 R 809 0 R 810 0 R 811 0 R 812 0 R 813 0 R 817 0 R ] +>> endobj +785 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.547 696.998 338.25 707.902] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__const__iterator__tag_de6bd909f8bb4bcdaed4dced85c1f5f1) >> +>> endobj +786 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.507 696.998 513.996 707.902] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ge8610cd48952cf1dc71b525235f6f583) >> +>> endobj +823 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 685.417 163.61 695.947] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ge8610cd48952cf1dc71b525235f6f583) >> +>> endobj +802 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.221 611.628 362.589 622.532] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__const__iterator__tag_7f1fc328bf8f0d2ec92a6599ce7fe2d3) >> +>> endobj +803 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [377.519 611.628 513.996 622.532] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ge8610cd48952cf1dc71b525235f6f583) >> +>> endobj +825 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 599.673 189.622 610.577] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ge8610cd48952cf1dc71b525235f6f583) >> +>> endobj +804 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [205.064 599.673 306.672 610.577] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g3b2653e715f41511257a84f35be7fba9) >> +>> endobj +805 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.528 562.811 359.281 573.715] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__const__iterator__tag_7ac19545b812b9ed2261c4224a6b9e9a) >> +>> endobj +806 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [377.519 562.811 513.996 573.715] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__const__iterator__tag) >> +>> endobj +827 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 551.229 163.61 561.76] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__const__iterator__tag) >> +>> endobj +807 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.243 513.994 346.554 524.898] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__const__iterator__tag_74f9a28eb09ee718502409ab43b657d4) >> +>> endobj +808 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.507 513.994 513.996 524.898] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ge8610cd48952cf1dc71b525235f6f583) >> +>> endobj +829 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 502.039 163.61 512.943] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ge8610cd48952cf1dc71b525235f6f583) >> +>> endobj +809 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.07 502.039 369.765 512.943] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ge8610cd48952cf1dc71b525235f6f583) >> +>> endobj +810 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 157.611 261.602 168.515] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag_f6cb7e34c1083df796fb12aa463739e6) >> +>> endobj +811 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [265.417 157.611 375.334 168.515] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag) >> +>> endobj +812 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 120.749 334.099 131.653] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag_ed43bafe74e2b291d7b980c6ee8f3d5f) >> +>> endobj +813 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [337.915 120.749 447.832 131.653] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag) >> +>> endobj +817 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +821 0 obj << +/D [819 0 R /XYZ 90 757.935 null] +>> endobj +822 0 obj << +/D [819 0 R /XYZ 90 714.099 null] +>> endobj +824 0 obj << +/D [819 0 R /XYZ 90 626.706 null] +>> endobj +826 0 obj << +/D [819 0 R /XYZ 90 579.912 null] +>> endobj +828 0 obj << +/D [819 0 R /XYZ 90 531.095 null] +>> endobj +830 0 obj << +/D [819 0 R /XYZ 90 455.752 null] +>> endobj +342 0 obj << +/D [819 0 R /XYZ 90 330.854 null] +>> endobj +70 0 obj << +/D [819 0 R /XYZ 90 324.253 null] +>> endobj +831 0 obj << +/D [819 0 R /XYZ 90 225.781 null] +>> endobj +832 0 obj << +/D [819 0 R /XYZ 90 172.689 null] +>> endobj +833 0 obj << +/D [819 0 R /XYZ 90 137.85 null] +>> endobj +818 0 obj << +/Font << /F63 177 0 R /F72 202 0 R /F65 179 0 R /F50 143 0 R /F23 144 0 R /F11 727 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +869 0 obj << +/Length 1929 +/Filter /FlateDecode +>> +stream +xÚíZ[“›6~÷¯`úRL8è•åÊ5kqª¹“띣x.ǔûë̪bÙiÞ[!ÆþGÌñÁ%Ùµ7ÑÕKÚu ŠôXÅ0fzôŽG¤SNë¯k)BaĘè!ބ ±yBP̝ù¦E^«® jWUíö)èJz[BêE Œ‹DÌ ÅAd—x¾Êi ø "_Ýi ±_gù|!U‘ÛöéÖÒæwmÌe‡BŸJ²>°}E¾Ø؞¤ù¸Ü¸®YûIÇq ¼##0Š„ΆS;¤§CÅ̀¯íœë*SÒ©‘ئ»$ONâYQmU4ö¦‘€iB0¬Ç1qg4І­Æ,ôe¢djZÅá=QvX]¨Cˆuh +Á4CР'·íámB8G¡ö)¥(&‰:>0ê\óîB,¤O|aäÂ/}ZYDXԏ6-×^Ä J×^}Vä…;‘Ǩ,#ý@ƒæoð®î â`TÖýˆ6`ж5@ŒBэ(m# +&v+µï6¢ Ï’´tƒG‹Õ ØUƪBOτ„œ¸ Òø‰bˆE(ÜØ +B84 Jê:›ççGLóør¥µ: +Dą̂«éc‚àcªÚQ©£] hx3žc¦« [B@}!"Ú4Ra&BlKª˜'F”´±¶¼,ò(˜„ƒ)=m í»TBޖ§1¦ÇŸÆر!h+Ò¯C^åãû÷É"KË;]¿;æÙ÷Oe󖺦õ³a7Ǥ-Ô]æf_&Œ ö›Åꕥ¢=ÈUŽ¢Ê"OmÍ®­°M›IÖÙbaß ÞË\­’ESPÜÊîÇ ™Ô2=Ž˜­{;0@ÊQÈd¨É_/WùTeEÞ¯)Q¾-ìóÇÂ5¼-Òl¶ÙQôÅNl g·äg(àÅ`ßðàoî­.ass“fK™× ÙîÌ—D±–ãhÍݚ}€>[IoÔ¦”Ç*¡Yƒ|BAÓ֎ËO ¯ ‡š“÷yö·&›k PÔÝr Šôîn˕ h¶®&ì{9U¦RÐV¶;UpâлŒ!ê挞,Xx|&邪œ² ’î>´ä²T›=羓jUí$ßÜ¢²{ç'P_j^ž¢t~ÌËLLP@¢ã^cãCnçè–ÏGiåE>QUvŸ% £ÞNêÿºK¢ °Ã €¯Zgµ!àM±¸2 ãֈ5Ïö¸LpvIth ŽrY¸/â>­¹Ìⱋ‘T õDfê1ǽzp˜¨¢Î1 ¬v²®k«JÞXéc2î'-5}QàOà£/ڕûµË‹\Æ ù§&<¸”›Rò)SóO¯ÿCy™ØÓLxtò2‰ò2 ÌË1˜7fÇFQHZenݵ4;bO—2ý +~PîgÈæUó3ÐkZ”['*Ý1•øÍ,™r-Ù²\H¨U¢lÝhô±»¿*KrGÌ!{9ÞÛ-,Žû'B.ñ' ¾KYÝ%å]^±”MÅ¡k„# ñ銆öL§“E5¸_Øus4ž0xùµ–³•ÛΚ¨Måí˜beü8oSK¹ªÀß²>so +Dµ{à >±9|›lžlS=IOaã\ğ)|—…öç}ƒ¹¤9 \7df!³<›˜1lšBö€ò»–ZªºÉ*õÞNmgƒ×Fø{® @Œð‹Tև`[ Y©#ׂâR"GkkÜÉ‹’'½Ø{eÌqÎÉêÐ-VŒ0=z)×;ƒWˆœÊE»7]òaÞ,o®j›±,¹[¾—muRmÆüÔ¾ð ³F1 AY_ååJ]ý´Rð°+m¹ö3òdVܔŒüGÎ~ÿÚCêîÿ DdôüÄ¿4/(Yäþ#ÁcĹãŽk{ëÄüŸM\-ÝÕÏÅbs'Ó*±½o²ÛJ{Üüxa‡¼Iòù*™»ïí_(4][lAdêêK wÏö6ÉWÉÂöi»Ýë%eåЍl©6Îõ8ð߈|¬þðš·×#[½h¡mq§Tùìêj½^£iVyVV(SWà«},m'!ú!nKw7ÇüeQ¹Ë¹,×Uœ©¸Ð®Ÿþ¨Òß +endstream +endobj +868 0 obj << +/Type /Page +/Contents 869 0 R +/Resources 867 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 801 0 R +/Annots [ 814 0 R 815 0 R 816 0 R 872 0 R 834 0 R 835 0 R 836 0 R 837 0 R 838 0 R 839 0 R 840 0 R 841 0 R 842 0 R 843 0 R 844 0 R 877 0 R 845 0 R 846 0 R 847 0 R 848 0 R 849 0 R 880 0 R 850 0 R 851 0 R 852 0 R 882 0 R 853 0 R 854 0 R 855 0 R 856 0 R 857 0 R 858 0 R 859 0 R 886 0 R 860 0 R 861 0 R 866 0 R ] +>> endobj +814 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.501 719.912 342.466 730.816] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag_e5f214d520a1f232251bee39685b62a2) >> +>> endobj +815 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [349.676 719.912 459.593 730.816] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag) >> +>> endobj +816 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 719.912 513.996 730.816] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g3b2653e715f41511257a84f35be7fba9) >> +>> endobj +872 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 707.957 208.989 718.861] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g3b2653e715f41511257a84f35be7fba9) >> +>> endobj +834 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.316 660.136 374.601 671.04] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag_f03d1a4f7f355971ac31ec1e4cb7297d) >> +>> endobj +835 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.627 660.136 489.544 671.04] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag) >> +>> endobj +836 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 648.181 261.024 659.085] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4aa820c3f87b201ce364e854aa37dba5) >> +>> endobj +837 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.675 600.361 382.518 611.265] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag_68de3cffc4bbfa2a79c06c51adb653a8) >> +>> endobj +838 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.903 600.361 496.82 611.265] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag) >> +>> endobj +839 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 588.405 261.024 599.309] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4aa820c3f87b201ce364e854aa37dba5) >> +>> endobj +840 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 551.544 269.043 562.448] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag_a8fd21a451fe377a328d750951ce36f3) >> +>> endobj +841 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [272.859 551.544 408.788 562.448] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4aa820c3f87b201ce364e854aa37dba5) >> +>> endobj +842 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.653 478.128 319.422 489.032] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag_8cba47c10a4d9a84b170b37932dc04e5) >> +>> endobj +843 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.785 478.128 464.714 489.032] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4aa820c3f87b201ce364e854aa37dba5) >> +>> endobj +844 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 478.128 513.996 489.032] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +877 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 466.173 190.738 477.077] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +845 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 429.312 270.159 440.215] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag_8ce02af4c13862f7988ad3e43b5290cf) >> +>> endobj +846 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [273.975 429.312 409.904 440.215] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4aa820c3f87b201ce364e854aa37dba5) >> +>> endobj +847 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.127 392.45 271.261 403.354] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag_5a6326e465cce738cb09fdd8df1d92ba) >> +>> endobj +848 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.098 392.45 415.027 403.354] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4aa820c3f87b201ce364e854aa37dba5) >> +>> endobj +849 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [437.852 392.45 513.996 403.354] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__const__iterator__tag) >> +>> endobj +880 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 380.495 223.943 391.399] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__const__iterator__tag) >> +>> endobj +850 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.915 343.633 265.449 354.537] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag_2c60071e2c7adec51fc7175ddb7a3bff) >> +>> endobj +851 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [275.074 343.633 411.003 354.537] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4aa820c3f87b201ce364e854aa37dba5) >> +>> endobj +852 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [437.852 343.633 513.996 354.537] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__const__iterator__tag) >> +>> endobj +882 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 331.678 223.943 342.582] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__const__iterator__tag) >> +>> endobj +853 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 294.816 259.639 305.72] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag_56b9fe489466e7376b72bc99b4f99126) >> +>> endobj +854 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [263.455 294.816 399.384 305.72] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4aa820c3f87b201ce364e854aa37dba5) >> +>> endobj +855 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 210.442 264.61 221.346] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag_3ce50d0fcf796935652563144194ccf7) >> +>> endobj +856 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.426 210.442 378.343 221.346] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag) >> +>> endobj +857 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.092 173.58 324.496 184.484] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag_e88c914d522014d2d181278bcfa9222f) >> +>> endobj +858 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.297 173.58 442.214 184.484] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag) >> +>> endobj +859 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 173.58 513.996 184.484] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g3b2653e715f41511257a84f35be7fba9) >> +>> endobj +886 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 161.625 182.977 172.529] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g3b2653e715f41511257a84f35be7fba9) >> +>> endobj +860 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 88.21 276.804 99.114] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag_19d1974dd5b293a48b8f2de6fa3c2c8b) >> +>> endobj +861 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [280.62 88.21 416.549 99.114] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4aa820c3f87b201ce364e854aa37dba5) >> +>> endobj +866 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +870 0 obj << +/D [868 0 R /XYZ 90 757.935 null] +>> endobj +871 0 obj << +/D [868 0 R /XYZ 90 733.028 null] +>> endobj +873 0 obj << +/D [868 0 R /XYZ 90 677.237 null] +>> endobj +874 0 obj << +/D [868 0 R /XYZ 90 617.461 null] +>> endobj +875 0 obj << +/D [868 0 R /XYZ 90 568.644 null] +>> endobj +876 0 obj << +/D [868 0 R /XYZ 90 493.207 null] +>> endobj +878 0 obj << +/D [868 0 R /XYZ 90 446.412 null] +>> endobj +879 0 obj << +/D [868 0 R /XYZ 90 409.551 null] +>> endobj +881 0 obj << +/D [868 0 R /XYZ 90 360.734 null] +>> endobj +883 0 obj << +/D [868 0 R /XYZ 90 311.917 null] +>> endobj +884 0 obj << +/D [868 0 R /XYZ 90 225.52 null] +>> endobj +885 0 obj << +/D [868 0 R /XYZ 90 190.681 null] +>> endobj +887 0 obj << +/D [868 0 R /XYZ 90 103.288 null] +>> endobj +867 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F23 144 0 R /F72 202 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +909 0 obj << +/Length 2050 +/Filter /FlateDecode +>> +stream +xÚÅYÛnÛF}×WèC) Z¶)Ð&q‘Ô-ÒÄ}J +!WQŠTHʎûõ½âÊ´,%Jû^.‡;3gΜ]aoéaï—ÉÏד‹Ë€y1Šx× /Æ^$(ñ®3ï">Œ±¿ÙógU¹¬·²Lå¼M–ÓØY¶²^$©4¾‘ YOIä«Y0D‚0ðþuýjòâzòqBàËØ#úK"D!^ºž¼û {Œ¿ò0bqäÝêYkS×Â{;ùc‚íª÷¯Ú‹zxpåáQ¸ )C8ƕ×u^¶Zø,³)GöÉÌpì…( ´›ÐV#6bDIØÍhÚ¬Ú¶#vE4Œ»iHå!¯..$f C0f”"†©±ðžRáñÞÍä +µÃ*Òõ҆üž ²¤’™WóÅFÅd˜Ö·wM+×û6Õ+ï±À—/¯^·è4$Æ(b}€ÞcÌÌ,ÇŽâˆîBTËdýäñU¦Uٌ¬pގ­ñ,’ŒFu/32ÿà†!Ƃ³#D/§]Ù¢Xæ7²4·ŒM‡ ç@ˆ…n|Î !"C¼Ã;†’æD¥«¤€GC=$uǁÚüŸ0‚¬‰¯‹¢Ä\ÖIQTéLÿŸ´23£à~^.§ûOœÙ›*W¼lqh-Ý®òtJ„¿2捹ÖSú²ÝÖegõ&OÆÖO„c'ò#>PÕ=>ŸÀkó3RÜý|'Mšçól»Þ<Ï­~ŽlN MÆ#Dcrm—Ž†'cŒX|†ÆÆspÞf>±¤¤£2ÃÆ\Y¶I›Ww-FPA á–ú¬{À؈‚(Ž¾.ùÅE¡øÐUTIöyè:®H²*>½+ÇÒåÐÞx}NX@ †Õ¢žráWë1S +Ãà8pE‡Áµ§–gŠEx3¬†fmaUósÙ&yÑñêsÙ¤u¾Ñ®ßÏ{13×ÓûwÙÕYlËTY°ã‹Ê²|ڃǶ F;¢l«€Rnmwʤýò؆SWªµÜä™tA ûÐBu¨~ýˆ +ÿVÕYÓçbaŒî{娶؋^D tÂI ˆ +w>«ÒíÚÅbïl»êÚãˆféöùR–²ÞuäE tåߢ‚¦­]V½Úr¦…üέn¨[Î"ƒ‚ð†ÒÍh¾’I]^­,ò™"ÓX@Ö¬gM2†bBϲ§ûŠÀ5`ÕåëXfL‹mf×AÈ`¦`(Œû +þaÄì7yOŒÃvásìE QO?öv.@¶ƒ¤fJ½š‰od±ƒÃeïô£qSýá÷ªíŠd•´=Žš®¨j{SVöáZ®?t:¯0:ÀäÎú 7» 8Òpä6m«º±æ§¦É—¥*•½”¡Ù©Î×öü„6ÁUã%cò—āNZ)u1  »oŠÄáií¶Ý[¿»5‰ Kˆø¡¶ImJp8“Wy)“zþâÓ¦–窼ßô•ã…<Úâ̐‰âÀ#3C]våBEOPšCFÇ%ÆÑZ CÐP +<3mŠJuL8÷!sD1¿Mô]\Flh‡ ûxÀX`ÒN¤®tä;Þ:ñPø.Â@`­6?±Ÿ|ƒsÀeÿ‰õˆñ2È» É^@lõ:J†òí¶Î÷àtb†Vð°æ^sŸºÉ[;§5'Yf5ÒØ’°¢,v YtÎP 4ò,À±iyÊ~³IL¸±h„°ÊÖàÖÓ³Š¼*3·“õùÓ]Ô·Iáî<{æû¦ûÞûÖؖY@ßê½)䟲)€Ýb`ÿ|›‚ûÜ4ÿGÖÕ¼Q4ò‹w銊E8®Ž×þ€AŠÅŠ§"êúÛ²yÕ(ºI>Òî!EœÒ3žÿB»Ò͊-–uRäíÝWÆ|¨DNÙóž‚ù€hz8„yÑa>ðAI3¤>Šrá¢<8Œrŀr2@9IðT]„Ay8‚ròʅ:wêãðÄâºh*³°¿ËêÖ®1ÙÉÖÁëJE÷¯ï§Y¿gœ±:„a"&ÜrØ9ê‚ö+t€nÐÕ ?MåìJÎÙ§¹­©¸³Í©ÏNv¸[©Ún»Óù㊔²á!Î[¥t[ŒÏҔy¨LÕ6õ€€Vož±:Ցøù4‰ÇOcÛ1?N¨s®z›:ºBôJ~Þæ…:Ùb„i)G¸ƒ%5löjêI¾?qsgƹ8 ÖÃd G±~Gû½*k±Ó–ðÄXïµ% m©WeG¥¡ÆÒs§sfWÐ«Ç +Ao9 ÜÒ>µöà-û«°þõp 8„P™ß°EŒ„pŽ{ó_«($õZupFý×Uq·’Y˜§Wù‡:©ïÌÏ̔«¤\n“¥}ÿåÞA ýÙÈú[uüҘ~KJ£}á™*ŸõIY[҇Au¬…¨¤â6Ìý·²«=¿½îî׉ŽöÎ/ÊA°÷¬³jÛÍw···(mжÌ75ÊÛ (‹‹û{ñ6÷rÙð(,l]é£ð!/ap­ÏÄîåé_x¬ ‡ +endstream +endobj +908 0 obj << +/Type /Page +/Contents 909 0 R +/Resources 907 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 801 0 R +/Annots [ 862 0 R 863 0 R 864 0 R 865 0 R 888 0 R 889 0 R 890 0 R 891 0 R 892 0 R 893 0 R 894 0 R 895 0 R 918 0 R 896 0 R 897 0 R 898 0 R 899 0 R 900 0 R 901 0 R 902 0 R 906 0 R ] +>> endobj +862 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 697.61 280.122 708.514] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag_45fb5ebe8a9c33d1e73593b09d8ab877) >> +>> endobj +863 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [343.982 697.61 479.911 708.514] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4aa820c3f87b201ce364e854aa37dba5) >> +>> endobj +864 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 661.971 285.103 672.875] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag_3b54824f0f53bf664c3114fb67557115) >> +>> endobj +865 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [338.443 661.971 474.372 672.875] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4aa820c3f87b201ce364e854aa37dba5) >> +>> endobj +888 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 626.332 291.19 637.236] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag_beb7cdeabf40c32d3aa0c33c0499bf97) >> +>> endobj +889 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [295.006 626.332 430.935 637.236] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4aa820c3f87b201ce364e854aa37dba5) >> +>> endobj +890 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 590.694 285.651 601.598] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag_86691cc44e4ef41d379ec2477221f0de) >> +>> endobj +891 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [289.467 590.694 399.383 601.598] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag) >> +>> endobj +892 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.571 274.286 226.746 285.19] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__tag_6d24fa81c885803e34fadd9332287d2e) >> +>> endobj +893 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [230.027 274.286 305.623 285.19] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__tag) >> +>> endobj +894 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [324.525 274.286 453.251 285.19] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +895 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 274.286 513.996 285.19] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf1c4903edb1a626a36a7220038f963c4) >> +>> endobj +918 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 262.705 178.862 273.235] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf1c4903edb1a626a36a7220038f963c4) >> +>> endobj +896 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 215.734 293.581 226.638] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__tag_6871446de8be708c37b2bedbf12c9b76) >> +>> endobj +897 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [297.397 215.734 372.993 226.638] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__tag) >> +>> endobj +898 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 169.136 315.678 180.04] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__tag_08a4701b629d734ea0e11231a34514b0) >> +>> endobj +899 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [319.494 169.136 395.09 180.04] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__tag) >> +>> endobj +900 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.716 122.539 304.36 133.442] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__tag_b67c8dacaa1610fe5ea9efe67263477d) >> +>> endobj +901 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [307.786 122.539 383.382 133.442] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__tag) >> +>> endobj +902 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [402.546 122.539 504.154 133.442] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g3b2653e715f41511257a84f35be7fba9) >> +>> endobj +906 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +910 0 obj << +/D [908 0 R /XYZ 90 757.935 null] +>> endobj +911 0 obj << +/D [908 0 R /XYZ 90 714.405 null] +>> endobj +912 0 obj << +/D [908 0 R /XYZ 90 678.766 null] +>> endobj +913 0 obj << +/D [908 0 R /XYZ 90 643.128 null] +>> endobj +914 0 obj << +/D [908 0 R /XYZ 90 607.489 null] +>> endobj +915 0 obj << +/D [908 0 R /XYZ 90 556.559 null] +>> endobj +343 0 obj << +/D [908 0 R /XYZ 90 446.062 null] +>> endobj +74 0 obj << +/D [908 0 R /XYZ 90 438.513 null] +>> endobj +916 0 obj << +/D [908 0 R /XYZ 90 340.316 null] +>> endobj +917 0 obj << +/D [908 0 R /XYZ 90 289.059 null] +>> endobj +921 0 obj << +/D [908 0 R /XYZ 90 232.529 null] +>> endobj +922 0 obj << +/D [908 0 R /XYZ 90 185.931 null] +>> endobj +923 0 obj << +/D [908 0 R /XYZ 90 139.334 null] +>> endobj +907 0 obj << +/Font << /F63 177 0 R /F72 202 0 R /F65 179 0 R /F50 143 0 R /F23 144 0 R /F11 727 0 R /F83 919 0 R /F82 920 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +954 0 obj << +/Length 1928 +/Filter /FlateDecode +>> +stream +xÚÕZ[sã¶~ׯà[©™Œ ÁËö©õf;N6ÉvãNv3š„$LH‚åŎÿ}eÊV¼Ò¦})8À9ç;W;[;ÿXüývqõÞgN„"ŸúÎíƉ°øqJœÛÔùìÈ[®ÆØ-Ël}­ŠmՊ"ë&Þ.W”c÷¦hDµ‰a¾~Q-IèêY0DüÀw[þzûýâ»ÛÅvÆévâ +w’|ñùWì¤0þ½ƒ‹B硛•;eð̜_ÿ\`{êcώŽ÷¸!$@>PEÄ K_(åÝqúuÎçeÑØa}¼jkÏù©›ÀÑXw×µÜû²ØT*ßû~H\¯ý‚9>Jý‰lç(¤5lÞ¼yæˆÔï%ª¨›gȅÈóCgEŠ87"©«H&óúçÕû€ÂšÈ÷½N¤"ƒåE#ëRýÇ摨òѼ©y6;Ñÿ´/(Àß'O)Îûƒ™IÓ3„ˆ…¤ŸÓ¨:¢$èg¤u3GÅG„Eý4Ëü(„ ®V$)bâ¾Qø_,-­µTd¢Ï HO|E/)ßÐ9YÛ  ß#FÛ82lÞK»÷q&Ó¸õvwq‘fsš Á«€¤¬¸“·saˆivÒÏãߖ»ý^u[-YàŠ'¸ªÌx]ª"•…õOvL™EIOäAf™yKÂÝ{Q4mœe´wbq&âZ¤Ï#dàğ®#ˆbßY1yÌ"å}[$TÅ ¼¸1oï”yþ¤ìÀ*•›ÇN€äÐù1äq@(8TŸœ¡{ ªKð÷ëT梨‹BõÍ ¶ÓdÝ<–‡2¡ûê`><@ì ÆÌàp"9E£{ÉOµÐ0¨Ø‹¦ÖòïJŽF2ç©áà©ò«Ð!ltv=:˜×Q½Ã±>í¶Gë›Ù†ƒO}¥3äòÃð ΐGO –(±YR®UE)Š' áat°é½Ÿ›ð—ÀfOs¯ÏWÚKž@o¥§L‚²•àõ!çóR¼&r÷è¼V¥ìÑ š™Ã§Çó†€\(}ÐNqŽŠ›¤÷q%ã»ÙHã +†aâ‹)€,NH-8Ct´´óšÓ'48c>°UYìT®¶¢ª­×mç¶Ã=74÷Ó rqdyêŒbÛ¥\­‡ÖàôùlŽÀ1¿¦@*^D.ƒ©\¥m\ÿ)ÿ–@ÊOR/ÄÓEˆv¡0„GÑeðòóÿ³õÈ'Ñ´•I¥¹)?=·Tµlä½0ƒÀ¬ÐÑؘ{e¦È¹4‰`šöžS@Á4(í¶ÂTž»QU.Ò7ú‹ïJÔ¨ÿº±[7fU7²ÖÐ7øôÜØP7–°ÌËLä:z7nlŽ§925ÄТ©ÿª[¬aèœb™nòàÒ ++.lëô"5/¥¨vqy¤ÒR¹…z¡dÝ»ÏYÁÑ?zAp£ õ¥Ý¤IÜUf×-W ^þU‹Mk«3§ÍrÅݒb·í”¸Ê»²­@Ù¢~eu`†tZÝeÛ\ýÜ6ð0›ŒõÚ7¬·¤Z—ÌüF=ß¿Æ?êƒÖ3¸ ùƒ=ýþ¢k}±—S7©jçÚ9Œ"¼²qAx>Ï ºÛœª¼÷7¾3üLJUÂ}Ä ý#¥jÝT"ÎO»gFĊ°…œNâî!1í~lÁ¯÷¥®±Ñ§{ø€LårfÌ ñÎ š¸>5É®¯‹PÂÃÁ>jŽ G¿±= •n lŠhtQÜÄ}dË2•¬ºÏ¸6øß:’]©ïÏ.•Îª¡mcZ†;™èp¾³q°Þïê°ÛS½—ñÜù©ùÙDä3ÕîI×ÐØs}êh$ð›Ó¿ý°èŒä«ó†CαkšòíÕÕÃÃJjÔ²¬l®@ÖWO«ß‘!âÑà †à`¹ª„áAº7Òá êé¿ë/F +endstream +endobj +953 0 obj << +/Type /Page +/Contents 954 0 R +/Resources 952 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 801 0 R +/Annots [ 903 0 R 904 0 R 905 0 R 924 0 R 925 0 R 926 0 R 927 0 R 928 0 R 929 0 R 930 0 R 931 0 R 932 0 R 960 0 R 933 0 R 934 0 R 935 0 R 936 0 R 937 0 R 938 0 R 939 0 R 940 0 R 941 0 R 942 0 R 943 0 R 944 0 R 945 0 R 946 0 R 947 0 R 948 0 R 949 0 R 950 0 R 951 0 R ] +>> endobj +903 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.709 708.995 313.911 719.899] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__tag_2845e4528b7b42c6c6527daceee21312) >> +>> endobj +904 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [318.329 708.995 393.925 719.899] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__tag) >> +>> endobj +905 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [412.388 708.995 513.996 719.899] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g3b2653e715f41511257a84f35be7fba9) >> +>> endobj +924 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 662.254 234.723 673.158] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__tag_0399dc1a987546af5d0491e72a6a05e4) >> +>> endobj +925 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [238.538 662.254 340.146 673.158] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g3b2653e715f41511257a84f35be7fba9) >> +>> endobj +926 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 594.548 279.554 605.452] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__tag_5e1c7e98053b2262c5f56c46e2f04f05) >> +>> endobj +927 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [283.37 594.548 384.978 605.452] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g3b2653e715f41511257a84f35be7fba9) >> +>> endobj +928 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [394.881 594.548 478.237 605.452] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +929 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.49 559.762 256.12 570.666] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__tag_553952be8bff48ab2a4a8b2820efc047) >> +>> endobj +930 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [263.32 559.762 364.928 570.666] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g3b2653e715f41511257a84f35be7fba9) >> +>> endobj +931 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [382.446 559.762 465.803 570.666] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +932 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 559.762 513.996 570.666] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +960 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 548.181 178.862 558.711] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +933 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 513.022 297.268 523.926] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__tag_b76a7c2b32bbc5472f87b3fae17f5a0d) >> +>> endobj +934 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [301.083 513.022 402.692 523.926] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g3b2653e715f41511257a84f35be7fba9) >> +>> endobj +935 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [412.594 513.022 484.075 523.926] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +936 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 478.236 245.253 489.14] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__tag_10d11983038c7047547f4a68f8ea2b70) >> +>> endobj +937 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [249.069 478.236 350.677 489.14] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g3b2653e715f41511257a84f35be7fba9) >> +>> endobj +938 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [360.58 478.236 432.061 489.14] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +939 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 443.45 225.318 454.354] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__tag_caca085247f8483085877e21527a9cd6) >> +>> endobj +940 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [229.134 443.45 330.742 454.354] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g3b2653e715f41511257a84f35be7fba9) >> +>> endobj +941 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 364.785 242.484 375.689] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__tag_f61686ed9ede21b05016ee29f9de882b) >> +>> endobj +942 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [246.299 364.785 347.907 375.689] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g3b2653e715f41511257a84f35be7fba9) >> +>> endobj +943 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 330 245.801 340.903] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__tag_4ea3e6a8b8e929e318a5c1c450667d10) >> +>> endobj +944 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [309.661 330 411.269 340.903] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g3b2653e715f41511257a84f35be7fba9) >> +>> endobj +945 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 295.214 250.782 306.118] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__tag_dd70a09fb9b3cb0b8b7ce79d8d9ec14c) >> +>> endobj +946 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.122 295.214 405.73 306.118] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g3b2653e715f41511257a84f35be7fba9) >> +>> endobj +947 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 260.428 256.869 271.332] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__tag_29295feb65378f2ba04c202f4b9a1bb3) >> +>> endobj +948 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [260.685 260.428 362.293 271.332] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g3b2653e715f41511257a84f35be7fba9) >> +>> endobj +949 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 225.642 251.33 236.546] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__tag_f39f78c492db753013cbfd0177ffea60) >> +>> endobj +950 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.146 225.642 330.742 236.546] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__tag) >> +>> endobj +951 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +955 0 obj << +/D [953 0 R /XYZ 90 757.935 null] +>> endobj +956 0 obj << +/D [953 0 R /XYZ 90 725.577 null] +>> endobj +957 0 obj << +/D [953 0 R /XYZ 90 678.836 null] +>> endobj +958 0 obj << +/D [953 0 R /XYZ 90 609.108 null] +>> endobj +959 0 obj << +/D [953 0 R /XYZ 90 576.344 null] +>> endobj +961 0 obj << +/D [953 0 R /XYZ 90 529.603 null] +>> endobj +962 0 obj << +/D [953 0 R /XYZ 90 494.818 null] +>> endobj +963 0 obj << +/D [953 0 R /XYZ 90 460.032 null] +>> endobj +964 0 obj << +/D [953 0 R /XYZ 90 379.345 null] +>> endobj +965 0 obj << +/D [953 0 R /XYZ 90 346.581 null] +>> endobj +966 0 obj << +/D [953 0 R /XYZ 90 311.796 null] +>> endobj +967 0 obj << +/D [953 0 R /XYZ 90 277.01 null] +>> endobj +968 0 obj << +/D [953 0 R /XYZ 90 242.224 null] +>> endobj +969 0 obj << +/D [953 0 R /XYZ 90 192.339 null] +>> endobj +344 0 obj << +/D [953 0 R /XYZ 90 83.547 null] +>> endobj +952 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F72 202 0 R /F65 179 0 R /F23 144 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +991 0 obj << +/Length 1844 +/Filter /FlateDecode +>> +stream +xÚÍYY“›F~ׯ œ£*kv†M*Uñ•²ã¤œµòd» #-e2 •÷ߧ灄,ÉÞµóÌÙÝó}} ØY8Øù}ôx:ºxî3'D¡O}g:wBì>Aœgš8oÝññ„`ŒÝÕ*›=)òª.£4¯gon«Z.g±j™¥µ,£º(gu´O(Çî‹šæQ,Í畜ËrL„+sÕD( „˼ñûéËѳéèӈ€<Ø!z €q'^ŽÞ¾ÇNí/ŒX(œµt<Êà™9oFðŽ.„ sÚ(CÂ>¿Ge@…‹çwlˆ õóB³ët,°{»’•™å‰y™¯ó¸NaKûY”æÅìŸævó"7ϸ×|WZæ +@Ş$@>õŒ?¥yœ­+*!‘œ¡ìŠÍÀ_ւ³Eìe¶xv-£D–èz`=Á/üfø¯v½.À&Äãˆ2æLABµ©‘W2‹ji ó¼5ÌQÛ¾ÃÿUÔö`êë¨nÞde£Ò¾ä…í\ÊåYî‚¥ˆÆc¨æ¹£ñ @|VÈ­… ”Ö1 ¦zdþ­ªÒE¾”ÍqµÇþT6C{»íèIò8l‚ÁžÂêJ)ïMqÞN8`Y!Â4+• ˤ+=@í¨N-—cÊÝÍQÐïn æ+#ÜáD*íèJ»e>Gžà jÞaÌNÞC¡ -ã´þÔ0Ñ÷4â˜ÒÀš`TB­5¯Ó,i(i"Çld>þÕl©º”*wŽsSBokèÌHÍvHóL’rÌWVUKº­ÈÀ¢«­ÕSŒ‚Ÿ&-7Ñ -ÀkBƒ…LÀ E8ô¾a°âY›ÍËbÙ5&î ¼²û^NA¤Úï8"'ªlåù £ ]ª~-T•ó9ªŽÔHq¦tvþ9d ÌG>¸ÏA20j‘yXø«×.üM‹q´º¯;+€Y«[ÓPÌpM€‰`Í,e_ ar„qx>Ӈ™ÈLÖò|x +Ÿž€Ï/Cå zïÌkaèE>ö°{eiµH ë÷V€ë üŽ¾òO¢Û² ¾NíòËèã˜`·Ù­ZG¸×Ò:ÈU‘'m!cÛ +3)nÙ¤Yf޴ǾŒye™åÂٝœÉ¨’É—Áv m‡ºNLñaa}ùS[Èm :÷QSõŦQ%ñ­mâ÷숙ÖVÎé8¤ œ÷ÒúR­“o(ԔrM¥ÚÝD­ñã ÿ5úHj"‰óR³ÓÓ&#êù} +*ô(XÎí³½è1N¥Œ"<’óô|²Êv¶€Û‹CõEK>˲u¶]ÁÜè¨ÑÞœX‡€—÷pÇ^C¢c´õ'çÅ~ ÃbwP„øái|HÔšÐ{e…/î¢Ð=Hˆû 6­mÚ9>&åg!¯*voRšÂõÁª­«`§ª?ì~®‡wf~ Ét¹¦'‚B*W>ƒ ºwHzä$?ßs{û-л’õºT,ÚE©Çª¨ÀoÝHóÒH•¡,tÆ  +« tÓ¹é4ešØÉga ]q …Ðӆ’U +ՔÇZ¹@ÁöVREðÌÙG‚·wP·Gi2%–ÆTªžÇ­ÿíïkÎÀøÖrv]mR‘‚‹~µ™ÀDUà6!æ›v³áJU‰ô°@´×ßˆØ ð§²ŽÒLnï$ã2]©‹ÐÿÅ}v{ƒm‰25pòÞìËD`öUm}õ§.âEÐÛ@uØ ÌGC »Øª,tò™&v£RFɤÈõõ|Fq¬"¤«|Ÿ–¥Jfcb|°]¼˜ÛY­.Òëm³]›M¦ú‡ƒâCیRƒ±“íPxç-èŸô®õ——[7ЯwrR½çí«ÐAúÿ¦³OŠx­Ô4`ú§½-ºJ؉ýeû2WgÐ`P]/ì•y‘e…¾UlÑiÍäeߟ©,Eße²­™…Œî/Œ1ç®ùÑŽÚýv¡>ñ_”þÆõQ€@æç=2æ¾ÖR.UvǨûºÈn¯eRF¦÷Uú¡ŒÊ[óñÄ yå‹u´°ó_ìšþ©dùP©T™ F9¸%Ó§B؍ÚR–•93hÄ UQ^±ç¾‘M‘`,ðÑiÞþiw¹Õ‹zaڠ溮W—›ÍÅZçéªDi}¶¾Ø¯†¶‹ˆ,> endobj +970 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 577.122 314.741 588.026] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__const__iterator__tag_061420fd93cf031e877897142071c67d) >> +>> endobj +971 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [318.557 577.122 481.613 588.026] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__const__iterator__tag) >> +>> endobj +972 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.849 541.9 483.414 552.804] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__const__iterator__tag_60ac68b3806bdf2e8b4805d661c52def) >> +>> endobj +973 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 541.9 513.996 552.804] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__const__iterator__tag) >> +>> endobj +996 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 529.945 270.438 540.849] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__const__iterator__tag) >> +>> endobj +974 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [295.842 529.945 484.911 540.849] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g88e874dbd26b94133467d81b006f0c3f) >> +>> endobj +975 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.57 483.764 487.693 494.668] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__const__iterator__tag_dc0293455632f1e58de03ee68caa785a) >> +>> endobj +976 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 483.764 513.996 494.668] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__const__iterator__tag) >> +>> endobj +998 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 471.809 270.438 482.713] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__const__iterator__tag) >> +>> endobj +977 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [287.543 471.809 476.612 482.713] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g88e874dbd26b94133467d81b006f0c3f) >> +>> endobj +978 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.173 436.587 338.25 447.491] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__const__iterator__tag_18f6401539b34122053f5d76da0c3282) >> +>> endobj +979 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [358.132 436.587 513.996 447.491] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g88e874dbd26b94133467d81b006f0c3f) >> +>> endobj +1000 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 425.006 163.61 435.536] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g88e874dbd26b94133467d81b006f0c3f) >> +>> endobj +980 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.84 355.727 349.582 366.631] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__const__iterator__tag_93c2b042e4c644ba6052c0a0130c74ff) >> +>> endobj +981 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [358.132 355.727 513.996 366.631] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g88e874dbd26b94133467d81b006f0c3f) >> +>> endobj +1002 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 343.772 163.61 354.675] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g88e874dbd26b94133467d81b006f0c3f) >> +>> endobj +982 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.051 343.772 274.034 354.675] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3) >> +>> endobj +983 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.277 308.55 342.404 319.454] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__const__iterator__tag_bd830cdbf47ea1e5f0cb88ba4e3dddd7) >> +>> endobj +984 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [350.392 308.55 513.996 319.454] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__const__iterator__tag) >> +>> endobj +1004 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 296.968 129.857 307.499] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__const__iterator__tag) >> +>> endobj +985 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.869 261.373 346.554 272.277] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__const__iterator__tag_9427aa22f07ee35e906d05bcd352e1e9) >> +>> endobj +986 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [358.132 261.373 513.996 272.277] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g88e874dbd26b94133467d81b006f0c3f) >> +>> endobj +1006 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 249.418 163.61 260.322] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g88e874dbd26b94133467d81b006f0c3f) >> +>> endobj +987 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.07 249.418 363.139 260.322] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g88e874dbd26b94133467d81b006f0c3f) >> +>> endobj +988 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +992 0 obj << +/D [990 0 R /XYZ 90 757.935 null] +>> endobj +78 0 obj << +/D [990 0 R /XYZ 90 733.028 null] +>> endobj +993 0 obj << +/D [990 0 R /XYZ 90 642.422 null] +>> endobj +994 0 obj << +/D [990 0 R /XYZ 90 591.79 null] +>> endobj +995 0 obj << +/D [990 0 R /XYZ 90 558.591 null] +>> endobj +997 0 obj << +/D [990 0 R /XYZ 90 500.455 null] +>> endobj +999 0 obj << +/D [990 0 R /XYZ 90 453.278 null] +>> endobj +1001 0 obj << +/D [990 0 R /XYZ 90 370.395 null] +>> endobj +1003 0 obj << +/D [990 0 R /XYZ 90 325.241 null] +>> endobj +1005 0 obj << +/D [990 0 R /XYZ 90 278.064 null] +>> endobj +1007 0 obj << +/D [990 0 R /XYZ 90 204.73 null] +>> endobj +345 0 obj << +/D [990 0 R /XYZ 90 83.111 null] +>> endobj +989 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F65 179 0 R /F11 727 0 R /F23 144 0 R /F72 202 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1041 0 obj << +/Length 1867 +/Filter /FlateDecode +>> +stream +xÚÍY[›8~ϯ@݇%RãñhW+m۝ªÝ¶êvfµm1à$¨R eýcsIB’™N2êÆ6ö¹|ß9Ç[S [¯/®—‚Y>òÖõÄò±å +‚8%Öud}¶]$†#‚1¶‹dü2K‹2â´_­‹RÎÇe0Ž(Çö›´”ù$¥~ý$'2ϖ©ê"žp…ÍøðëõÛÁŸ×ƒï`‹Tr¹Œ[á|ðù+¶"èkaÄ|ÏZU³æ–C<ëjð÷o Oò9§µô”!,ø)¥™/.9îX [#ê æøz›ë¡‡íõBúë tc²LÃ2†]Ík–ëFآߋJšé@øhA½Ó/q&ËÈÈDHg&gÈ‹a=ñ·žµÀÊ ±™  Žg2ˆdŽf=ëy OÔÓ7ëu±2"G”1kÄ(ÂÄ æ“L‚R \68jÄ/˜ãYi˜ ¬Æ™Æ‹eœD ¹ôSÎåºKÝÎ&]Š ·•fÛÄ\åqÙ°U?f0˜ÔàËô3®^?£(2זEÑЫ• +0ó;ZëI +H;õÚdŽFä_ qÌÏ ¥ñ2ÏÆQ<k;?²ñ€(ô\ÈbC€¤¥ ùÐáv6íeZ@@ –i”1l‰ipSƒei»ˆp3ê¨,ªEœNYf©~ÝFo5Š׌—0é÷,M֪ńõ„ÅÚ Mz—ì ”)ê6¥E؃XŽ˜Ûö9¬+Hõ‡Ù¼æjWՕL©ZYœzʯÊâ,nŒèÉV‰É¡æV[±lP÷N$@/ß§ç£ áêzÖ¸<C©l_A£—ŒYc0NÁîéYë]SÑQ%õ&5W ZÓ²8/©¨€LßM"¢¥¡7å0ôƅî ô«¦Ÿjýz° G+Ҟ +ú¡ y‘wÉF]Ú&«VÆ&Y C6Õ¨âŠíòJɵÁ+oµq4¯”y5"Âÿ¸›üÝO/眇\ÀÑÃÉE|¿YPŽ§·=Œw€QFž¨(ÑûZ@õ%¼¢È”­ô)k³>2èîÔõo‡Ë®8à\—ÕIû0ä!Ö(Çv×ñ%MX۞‰Ã2ü”q>’êå©¢ø™B¤ª¾bÀài­ß¤CÛ·AGAS47¾7‘h×?7·…Eñ¬ßÍ>iÂ]9‹ÍêóàېÀ¹Ò¼Kšv`—›µÈÒ¨*‹T·éËôGa½È*Ns\UH½•i¹ ’ºö¸‘ݏ2:Œ˜=÷`:¸' ˜ Ä •Vª]nÞ>µ7*¯ÌIãC}‹ò>‹âÉzKӗ[—T=È9pÑñ @Jè¾ »b„rܜÌvB!þ)\Ir°² |w0†6ŽËõB*{„ +äUOSkÎï|úåP£nݪüÛ9öF;æ ¯‰vó*©*ª ˜5pZïôGî[Yݘi–-š;W™†I¦N'½eŒ‡£÷(cîyAUNÙ #ï.¸p‘ò×¯ooËe¾•…à–2¾5~‚ý¥ +ÎÓ*Z?ƽÅ'&È!GŠO†0n0dN›E}Ë;l ”fé¨ÌãÛ8H*õzj€çÝhÚÑóU\T‘øž0æ",ΊŽYPŒ¡+ËqœÊï%Àä²øéõτ— ]Œ¶p-—1óú‘€#FèàÜTbMã\È;%T”3!£Þ/ åd„=ðŒË:Ux=§Šþ,ç¡ö7ìvôdt‚O}e+ujòړE€dödór·I‚7šqš65äÎ8ÔqþÙR$ƒé“@Ùñ÷AY¦ÑΕ/L>!ˆÕrAÌ9},oÿê\âÝõ'xõó<e«°^ýûæ>âÜüb¼®PĘý±P>W°eÔþ˜%뙌ò@¾‹oò _뗗zÊ» .ƒ©ù^ÿWÁ[—jÐõO!ó_‡œÛ…þà}B$ÕcÊ[·jK™›:1èQe4T¿±ì+YWÂÚ߬ºõ× v«u<„›ÒoV–‹g«Õ +…Z¦ñ"Gqy>»Ø=š´‹ˆ Üo ¯¯¯@°yVýRâ:ç:0¡m?ý`N +endstream +endobj +1040 0 obj << +/Type /Page +/Contents 1041 0 R +/Resources 1039 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1061 0 R +/Annots [ 1008 0 R 1009 0 R 1010 0 R 1011 0 R 1012 0 R 1013 0 R 1014 0 R 1047 0 R 1015 0 R 1016 0 R 1017 0 R 1049 0 R 1018 0 R 1019 0 R 1020 0 R 1051 0 R 1021 0 R 1022 0 R 1023 0 R 1024 0 R 1025 0 R 1054 0 R 1026 0 R 1027 0 R 1028 0 R 1029 0 R 1030 0 R 1031 0 R 1032 0 R 1058 0 R 1033 0 R 1034 0 R 1035 0 R 1060 0 R 1038 0 R ] +>> endobj +1008 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 575.498 254.976 586.402] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag_b1988eecd5bca9d4ad8dbd128c885b9b) >> +>> endobj +1009 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [258.792 575.498 362.083 586.402] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag) >> +>> endobj +1010 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 539.454 327.474 550.358] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag_2967727ea790f1d517e1529e3f6be79e) >> +>> endobj +1011 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [331.289 539.454 434.581 550.358] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag) >> +>> endobj +1012 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [140.057 503.41 327.771 514.314] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag_6b54d1a028c5a0eff158b33ce1a6670f) >> +>> endobj +1013 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [333.538 503.41 436.829 514.314] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag) >> +>> endobj +1014 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 503.41 513.996 514.314] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3) >> +>> endobj +1047 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 491.829 176.352 502.359] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3) >> +>> endobj +1015 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.102 444.452 360.136 455.356] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag_984fd654d7b169e74d13f6207d48fefb) >> +>> endobj +1016 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [363.948 444.452 467.239 455.356] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag) >> +>> endobj +1017 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 444.452 513.996 455.356] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +1049 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 432.497 236.685 443.401] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +1018 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.596 385.494 368.188 396.398] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag_56d19de5207d94e358a433995ce9730c) >> +>> endobj +1019 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [371.494 385.494 474.785 396.398] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag) >> +>> endobj +1020 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 385.494 513.996 396.398] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +1051 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 373.539 236.685 384.443] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +1021 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 337.495 262.418 348.399] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag_0d28be41ac786db82ce3cb24e2db5543) >> +>> endobj +1022 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.234 337.495 395.537 348.399] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +1023 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.771 266.329 315.914 277.233] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag_d9b9ef9435b7a3bc8d92435ccf1cc0d7) >> +>> endobj +1024 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.395 266.329 457.699 277.233] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +1025 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 266.329 513.996 277.233] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1054 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 254.374 190.738 265.278] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1026 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 218.33 263.534 229.234] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag_442076de6b59703f82c552f7e70aad72) >> +>> endobj +1027 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.35 218.33 396.653 229.234] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +1028 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 182.286 327.732 193.19] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag_1b4e8ec21c2f4b2b925c4e11474062b9) >> +>> endobj +1029 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [331.548 182.286 460.851 193.19] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +1030 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.728 146.243 261.237 157.147] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag_a975ef75ddb5359966ff21eecca491d0) >> +>> endobj +1031 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [265.675 146.243 394.979 157.147] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +1032 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [410.157 146.243 513.996 157.147] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__const__iterator__tag) >> +>> endobj +1058 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 134.661 189.622 145.191] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__const__iterator__tag) >> +>> endobj +1033 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [140.517 98.244 255.424 109.147] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag_27f2fdd3945057760e252740c98573eb) >> +>> endobj +1034 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [261.651 98.244 390.954 109.147] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +1035 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [410.157 98.244 513.996 109.147] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__const__iterator__tag) >> +>> endobj +1060 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 86.662 189.622 97.192] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__const__iterator__tag) >> +>> endobj +1038 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +1042 0 obj << +/D [1040 0 R /XYZ 90 757.935 null] +>> endobj +82 0 obj << +/D [1040 0 R /XYZ 90 733.028 null] +>> endobj +1043 0 obj << +/D [1040 0 R /XYZ 90 642.237 null] +>> endobj +1044 0 obj << +/D [1040 0 R /XYZ 90 590.372 null] +>> endobj +1045 0 obj << +/D [1040 0 R /XYZ 90 556.35 null] +>> endobj +1046 0 obj << +/D [1040 0 R /XYZ 90 520.307 null] +>> endobj +1048 0 obj << +/D [1040 0 R /XYZ 90 461.349 null] +>> endobj +1050 0 obj << +/D [1040 0 R /XYZ 90 402.391 null] +>> endobj +1052 0 obj << +/D [1040 0 R /XYZ 90 354.392 null] +>> endobj +1053 0 obj << +/D [1040 0 R /XYZ 90 281.203 null] +>> endobj +1055 0 obj << +/D [1040 0 R /XYZ 90 235.227 null] +>> endobj +1056 0 obj << +/D [1040 0 R /XYZ 90 199.183 null] +>> endobj +1057 0 obj << +/D [1040 0 R /XYZ 90 163.139 null] +>> endobj +1059 0 obj << +/D [1040 0 R /XYZ 90 115.14 null] +>> endobj +1039 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F65 179 0 R /F11 727 0 R /F23 144 0 R /F72 202 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1084 0 obj << +/Length 1779 +/Filter /FlateDecode +>> +stream +xÚÅYYoÛF~ׯ ҇R€µÞƒË#) +´I]8’&ÎS ¹’ˆˆG—”ÿûμdÊ·ÝsI¯†s|óÍÌ;+;Ïþ<™ù̉PäSß9Y:vŸ N‰s’:_ÜóÁ»Uµ9}Yu#ã¬hN›x5_PŽÝã¢r'ÂÜ~K!ç$tE¡QʈËüù·“׳¿Nfÿμ;D¿‰ƒxƝ$Ÿ}ù†ž¿v0bQèœë]¹ãQ׍óiöÏ [­w¯ÚŠ€:!Xá{Ê +âaDaP†°Ï)Ôu¶*j£fS*Àx>ø QèƒH½=ɳe,9D,$ížØK”[Ì2k”õ܍›Rš'Ϫü•«g澊۽ÍÚúL©Y”˝ÿhÉF 1Ïꋺù„ú”FÈ;ýë)õ1 +: ‘Ê>¯q<ƂQˆ ¥„EÄ3"¾RÊGRœ/ `QʚÇ*ÔrecþQoÐ^£é“¶éôý›]ajïWÌñ^iZ’vӄ¼fJ\Rƒ@2iûŽ·ÀRß#΂0y±ø£h¶R£0›KUÖY“©˜‘HÙ.ævWs¡•fK¶œXîØÕ£( ]Ä2ûÞs±Ù˜Õ²”¹HT¢q7CBAé[O½Ó(Ԙ½uÜd`;¦¢U¿•’5öI–W‘‹¢­eÑÚ£¬9‹eCT‰[¿Pâ#WÎYàZo€âà&¥,Ž`QÄ#£26 [ˆWB®ãÊfaÿÐN²·u™[ÜeVÛå¤ç ñ£«]¹ÉÈu {Ü-Í{ 4_0X|®År»1–mâ¦âûœbw«ã¸‚¶l%Ä[ÔWgO¨½.Hà3¦X€¸%¦£m‘(w·Ô´Žm¦¿‹/ì¢L³åÅ7ôp7÷Ÿ:^ؗÃàCHàðQ8وXÞ-‡Ÿ({óR…ó¬…œIý”k·- jòûÐ3‰ä…ô˜í’¦­"Y»¨«®ä¦dlmòՔ6}Å·ãwÊ"Ô³üÎïB€5¦CšµC¦Þò@`ÑZ$õÁz2 °¾|,4‹…ȃ +¿ +³Nv=“¼)"‰‡HÀƈ<ÖiÑتº¸YC02•ä¬/* O{^,&[!â#r]iö/vôÜϖˆ³"1$®M3\oè_$¢®cy1çܽ#цÂÐH‰ö¸¨¶Íáûmó¢žzŸ6³ò´’ +M—PüÝÏÏ;ѧ5ûƒÔ”8Ñz²aeÁðsè:\„( Úu“–Û©œQDƒèn-lÄQóÄÃu°Éå-Cytüö/câUÁ•âÎ|èҘÙ5²ÀCQ?|ÀûDœ\¯åãàcA|q ±= BƄ²‚þÚ2Hiøò;|€ Æþy`òCq}K%kÓe]G ³!ˆöI¯ŽªþG@4ªïx$¢ÖÚ½2Yè¿q#Úª»‡¶ð`´[îBŽ»ªóu–¨ò»W³~j¥žeñäŒîCYbC×OØ@Õ ÌÇtLöuJë$ËNÓm^=E½²1Ùیqeî­ióÆðd$@,£ó˜Þvl–“´O†P¨Ì¥ÌÒ¦Ÿ›f tÞþu î,aS}ԏðq¹/òPð'ÀÖ¦ŒÓG"¯C†–/ o+zGXQ êFc\½³W]ß nŒ«nȝ¢ oö¯FWx5ºvuň<ô…GáA{ì ó‡=x~%š8Û´´úJԉÌ*múå`ç!æÙç“yˆÝ‹ªöÛyz9>qéŽ|’#3˛£%[9”ZàŸ´IsÿØz#KUYβTŒA ËÐR¨n¨‚rD¹{®ŸÉ´Ïv0ܧúËÑà8è/v<pà¢`B5C…ÈǾußq@Z&Û|ŒÇÎàfÝÏ{—Œ0êÛÿ¯D!d_”—òÒi˲„º­ÍîãÔiæF<§8Ì®ž¢lʏ®¡)]N×"N¡Ð«asmÑÏs@m¯kD2h?ÂàA>ì/¿/v ^u„Ñû Œß›mjÕ d°“3D]ÿ6! ,÷:` =Øzo$/dÈï?«ü>ŠÂî!?Ô3ö ?é?àBEDÇ|¾âÌû£eÌý /sÕÙ1ê~(7k‘ÊØü÷mö]ªÃ}óÒly«m¼²¿?Þ/<ú\ ù«‚Lm~ð..¶ñÆüOÕ©3õJ!íÁ<Ĉ`DU…P§ÎØs? aa<ðÃiWofÚã½]Ô îjͺiªç‡‡ççç(©Ñ¶È*‰²æ"qxù£Bˆ ÑÎ ËK)Œ Y¡¾'è> endobj +1036 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 696.998 253.014 707.902] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag_c19488a8f4e64cb797b8402ea44b456d) >> +>> endobj +1037 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.829 696.998 386.133 707.902] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +1062 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 612.624 257.985 623.528] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag_f8ebe9c0ce769746c2d2d01f6fcb4c91) >> +>> endobj +1063 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [261.8 612.624 365.092 623.528] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag) >> +>> endobj +1064 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.768 575.762 315.922 586.666] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag_06731c2e3b3d14dceffb5b81f1447bc8) >> +>> endobj +1065 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.4 575.762 431.692 586.666] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag) >> +>> endobj +1066 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 575.762 513.996 586.666] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3) >> +>> endobj +1089 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 564.181 176.352 574.711] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3) >> +>> endobj +1067 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 490.392 270.179 501.296] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag_4316d3e1fd40ef324f4f9ac970481c9f) >> +>> endobj +1068 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [273.995 490.392 403.298 501.296] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +1069 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 453.53 273.496 464.434] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag_7a018b29b6f334f666391ec729265c25) >> +>> endobj +1070 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [337.356 453.53 466.66 464.434] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +1071 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 416.669 278.478 427.572] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag_3bd9634d21689bd4b0cbcb476a101e92) >> +>> endobj +1072 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [331.817 416.669 461.121 427.572] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +1073 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 379.807 284.565 390.711] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag_5e22cd8ea46cdef0e09027e6177fc838) >> +>> endobj +1074 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.38 379.807 417.684 390.711] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +1075 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 342.945 279.026 353.849] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag_c8105464b2dbee48f8646bc2c2f1f2d8) >> +>> endobj +1076 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [282.841 342.945 386.133 353.849] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag) >> +>> endobj +1081 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +1085 0 obj << +/D [1083 0 R /XYZ 90 757.935 null] +>> endobj +1086 0 obj << +/D [1083 0 R /XYZ 90 714.099 null] +>> endobj +1087 0 obj << +/D [1083 0 R /XYZ 90 627.703 null] +>> endobj +1088 0 obj << +/D [1083 0 R /XYZ 90 592.863 null] +>> endobj +1090 0 obj << +/D [1083 0 R /XYZ 90 505.47 null] +>> endobj +1091 0 obj << +/D [1083 0 R /XYZ 90 470.631 null] +>> endobj +1092 0 obj << +/D [1083 0 R /XYZ 90 433.769 null] +>> endobj +1093 0 obj << +/D [1083 0 R /XYZ 90 396.908 null] +>> endobj +1094 0 obj << +/D [1083 0 R /XYZ 90 360.046 null] +>> endobj +1095 0 obj << +/D [1083 0 R /XYZ 90 307.617 null] +>> endobj +346 0 obj << +/D [1083 0 R /XYZ 90 194.674 null] +>> endobj +86 0 obj << +/D [1083 0 R /XYZ 90 188.074 null] +>> endobj +1082 0 obj << +/Font << /F63 177 0 R /F72 202 0 R /F65 179 0 R /F50 143 0 R /F23 144 0 R /F11 727 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1131 0 obj << +/Length 2104 +/Filter /FlateDecode +>> +stream +xÚÍZY“ÛÄ~÷¯ÐrU¦§7I-nÝ„ +a(r)_Õö¨bKBË8ïçô¢uäe&vàIR«Õ}–ï¬-ì¬ì|7ûúfvýÊgNˆBŸúÎÍÊ ±øy”87±óÞ P0¿"c7Ï7‹—YZVE”¤Õ¢ŠÖó+êa÷uZÉb-¥y|'W²˜áÊTQʈ˂ù7ßϾ½™ý9#°3vˆÞɃå™ç,·³÷`'†ñïŒX(œžµu8epÝ8¿Î~™áƒTS†°ïªßÉMTÉØPôªN—U”+®_y¸÷!v®(GŒ‡æ»ÿaÿ”U–•ê.ªš;YÚÁ¨°7if_nåöXÖ÷«f/KÍtCus‘N8"2<„©%ȹ^VYQ¾0 U–É:ÝÊÔn¥–»od3u°ÛˆOÂ÷`‚xÈ,¯”zƒOœ÷Wè”k‡•–ŠµU×;=c_!•sê¹» ÆKqìiqî]ë FôӁ”û^Y=a6¡MŽBAš9ùòÅ>¸§÷_ªýo’TFÅâۏy!AÎYº˜dg#AêK™ÖÛã2ºRSœ+Ä…`Á³U+ô™¿™ ì>är¼­Òp!7ÀPG€|Þ¨Ûoláe1g+ÁJ@ ˜á†‚圀ͨ–D¡´6õØÿŒa¥Þ#Ÿ5BÞH3h4sä0‚HØ*aæèÂþ»"i‰ŠÌå^6k®²ÂÌK,9QscÃSYNÈ XRÐÁ`‚0‚Qà73ÐüŠÊn±”¹qf°Sœ€Å)@˜ÇleTJÈ 3•Z£5bõúb…‡Gb…±¤4Wùgm¬ƒÉZGcn"à¶O<"ÆL‡aÌ{j9Êôœöxðâ P7 |ò Dq0í@É"[³‹Õœ€ƒÛ”“Öp>ŸB9h‘ð§ù”S-Q‹,ôø![ «ïÀw봌ª¤"ht«-Þ*^A*sp9ÙUðˆ¦FOáLó!úQâ#ÊZýc=óÝÿš ™€ ÄEѯ1Zب5Z !2C­Ñ1ZÔF Wm´jîA£Ã_V;0©Sl÷)0f1ùL(γ2©õþ>©. eŸ"†Ù P¦Ï2çÈç¡ì‰ÆuÁMQÛ»½ø…w}üÂãQü¡ò´ Ã¯™Â{S×ɀò‰eB$üÖä§`¬âv•|ùÚe†Ìi¶³ D]>Ù} ­à­Fè1Ú19Ø< ˆ1¯˜w¿2Z+Ó&¯dh-ÆôúAÄF¢ÍƒE­ÊâãÁIÙy%mÌiòà#‘7„È ¹;¾ŒõRðH< /k¾«"ÛÈjρ"žÿ4³}qœ/“Õî¥ÂÎ|‚`$ À×u²‰-X¢ýxꊨd<98”ÑP0UÑÊf +K`-ØþÓ¡V÷i£“*ÏÎb"§Y%(î¸5xá3ƒ™ð‘¯Œ³™C¤kÌÏg v…¸¬Î†é²8ÕJlœ 1mªì8‚g*h A Iïj n +pÜ&ZP <^'D”´HyM­â#ž %"(Ø?#”b¹‘•üdèœÙ‘M©üu:‡šï>Ú$qÔºŽVÃ]ÐiDäulùå”Fò:TwÿÛFTÓìUÖƉ<ÂVaKž¥q’Ún›ËÌGËf‘]²±•¤ög÷2­ ¶l¼Ú­ì¼‘Q)ãÃÙÓ¬ÉDR˜l‘Ò5ØFÿ[ÕþÔ´Ê~Ìâdõ0âtH.ÔÁjÚ•NE]~zI¨žàéZBÕ¸#4ÊäÂO©`·'}¦»7bh-¿÷â뤧bP5¶þn;•â"ŸvÎî™í¡ú\'çOt†”·Ïç û ØÓãûW¸Âw²ª‹tì5Ƀøw<ìa^»~ÀõPzŽ`„|¬Ÿe&Wª&P}˜e"Ç­ ô΢,µ÷!g²£ÎÀRs¯è +ÅNXÏ4¥â¾°i¿9sq> °ôY­hÞì‘'÷©LùΠÊo èt¡ˆV=Å {‰î«MäVX‚vG˜x4EKÒ퀭!½ŒP& ½ Ö èyÝT’ÞeÛl-S™Õ墒ÅöŸŠç†çÀÿ]žF *í[ëÜO ÖúW%Ý'úW¥%¹® ¡\ýüÿ/øñGÁÏ3¥·ý»{ia_©¼¬Ñ`a¦$“½ Lü‚&Ý)Zb·ÝI“ÅsÕ¨ØÊXŸýún‚tRšÇ•Ýº2_µ»ÜÌ*@qeN¶ùFêÃcâF•Í­G¦öߘV¥n¡¶H0Â0˜ÊO1jÍãÑ1t.‹»(ßSádÛöÌ> endobj +1077 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.658 649.041 222.207 659.945] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__tag_0ed54f6ac264a58059f51c7fe33ab787) >> +>> endobj +1078 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [227.575 649.041 296.546 659.945] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__tag) >> +>> endobj +1079 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [319.903 649.041 448.629 659.945] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +1080 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 649.041 513.996 659.945] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ge5679e4f41db32b7b91dfc81574fc1d6) >> +>> endobj +1135 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 637.086 220.377 647.99] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ge5679e4f41db32b7b91dfc81574fc1d6) >> +>> endobj +1096 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 589.831 286.956 600.735] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__tag_b93e22d57d1f5d94ae97ba1b9de9e3f9) >> +>> endobj +1097 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [290.772 589.831 359.742 600.735] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__tag) >> +>> endobj +1098 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 542.576 305.646 553.48] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__tag_bfb19498f2647b44344c6a84fdd6cd2d) >> +>> endobj +1099 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [309.461 542.576 378.432 553.48] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__tag) >> +>> endobj +1100 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 495.321 291.499 506.225] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__tag_702543ee828ef523fb5fe5ffdaf25925) >> +>> endobj +1101 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [295.315 495.321 364.285 506.225] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__tag) >> +>> endobj +1102 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [384.151 495.321 479.133 506.225] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3) >> +>> endobj +1103 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 459.025 300.057 469.929] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__tag_2d4948b195e743f39601a13610fcf94f) >> +>> endobj +1104 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [303.872 459.025 372.843 469.929] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__tag) >> +>> endobj +1105 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [389.948 459.025 484.931 469.929] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3) >> +>> endobj +1106 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 422.729 228.097 433.633] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__tag_c21bd81d2f33da4dc915020bf16c801a) >> +>> endobj +1107 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [231.913 422.729 326.896 433.633] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3) >> +>> endobj +1108 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 350.87 272.929 361.774] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__tag_380ed65a246cd38c5ca3893b40eb4603) >> +>> endobj +1109 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [276.744 350.87 371.727 361.774] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3) >> +>> endobj +1110 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [381.63 350.87 464.986 361.774] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1111 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 314.574 221.462 325.478] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__tag_8c466c744746ef7249afa54667470cf5) >> +>> endobj +1112 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [225.278 314.574 320.261 325.478] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3) >> +>> endobj +1113 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.529 278.278 251.533 289.181] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__tag_1c416a6d6a359f2f9e9d33af7dc32ea8) >> +>> endobj +1114 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [260.772 278.278 355.754 289.181] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3) >> +>> endobj +1115 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [377.86 278.278 461.216 289.181] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1116 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 278.278 513.996 289.181] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +1144 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 266.696 178.862 277.226] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +1117 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 230.026 290.642 240.93] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__tag_adbcd3b735dae0f714d1134cf8e6b911) >> +>> endobj +1118 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.458 230.026 389.441 240.93] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3) >> +>> endobj +1119 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [399.343 230.026 470.825 240.93] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +1120 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 193.73 218.693 204.634] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__tag_414a473844efce3515611fdc6b26e4de) >> +>> endobj +1121 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [222.508 193.73 317.491 204.634] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3) >> +>> endobj +1122 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 110.912 235.858 121.816] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__tag_9a30e394a9c84bb9d2debda31433e6b4) >> +>> endobj +1123 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [239.674 110.912 334.656 121.816] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3) >> +>> endobj +1128 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +1132 0 obj << +/D [1130 0 R /XYZ 90 757.935 null] +>> endobj +1133 0 obj << +/D [1130 0 R /XYZ 90 716.221 null] +>> endobj +1134 0 obj << +/D [1130 0 R /XYZ 90 663.978 null] +>> endobj +1136 0 obj << +/D [1130 0 R /XYZ 90 606.79 null] +>> endobj +1137 0 obj << +/D [1130 0 R /XYZ 90 559.535 null] +>> endobj +1138 0 obj << +/D [1130 0 R /XYZ 90 512.28 null] +>> endobj +1139 0 obj << +/D [1130 0 R /XYZ 90 475.984 null] +>> endobj +1140 0 obj << +/D [1130 0 R /XYZ 90 439.688 null] +>> endobj +1141 0 obj << +/D [1130 0 R /XYZ 90 365.807 null] +>> endobj +1142 0 obj << +/D [1130 0 R /XYZ 90 331.533 null] +>> endobj +1143 0 obj << +/D [1130 0 R /XYZ 90 295.237 null] +>> endobj +1145 0 obj << +/D [1130 0 R /XYZ 90 246.986 null] +>> endobj +1146 0 obj << +/D [1130 0 R /XYZ 90 210.69 null] +>> endobj +1147 0 obj << +/D [1130 0 R /XYZ 90 125.849 null] +>> endobj +1129 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F23 144 0 R /F72 202 0 R /F65 179 0 R /F82 920 0 R /F84 440 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1168 0 obj << +/Length 1805 +/Filter /FlateDecode +>> +stream +xÚÅYYoÛF~ׯ ЇR@´ÞƒË#- +4q\8u‹4QŸ’@eȕD„"’²âßك—LY¶l·/&µ\ÎÎñÍ|34¶V¶~›¼šOÎ.\f(p©k͗V€-Ï%ˆSbÍcë£í!:#c»(ÒÅo"eXçåâÃMU‹Í"ʳª^$µY­ÃÕtF9¶/3XZ†‘Ð?ߋ¥(§Ä·E&—eŽk3úyþvòf>ù6! ¶ˆ:ž{Èc܊6“Ÿ±Ãú[ #øÖNíÚXepM­“¿&ؘ‚û&qÜ3‰¹ð†GÂ.×v}¢”«ã›÷¬3V&Ym–¥:åÊèõ^m¦H7$ùbY”°uñZÚ_†Ý[­0¹÷æøâòê|vvAû~&N€|߅ÝZŒ™Þ5PÝAO›=p7/Ž«§ƒÒ©¶Uî;hGšëمG-”p©ÄŒ0Š(õä rGkóNÚ_iÁ©Ývê wFéïzÇ@  GkUkˆÔkƒ•Ur-2}›oëb[œáˆ2o蘑ƒ¤Þ^ÐlC£ÆvFp‹?ä9XmBšÂ£Üя~¡/•Èê°Nò¦>-G`@ „ºÇpܚÂF„D±ÿ¼.pïñ',p·ð”æa|ž‹$¶9Þs" š +âïqâØû”H’KgÅQ$-Ë©Ãí|3& +pï¹÷Ó7žöƙ,{:™™COM×Þ1}㹨Ã$mJ繨¢2)”å·#‚eŠ"æZÌ|êcû¦­Oå6‹¤³¾ÌM!ZÔTJw)O5&>ó¦Ç¨Oj¸£Ì%K\'±ÆZQÊR’MÛøµPnïÔZW­Ë{Põb¤e |)¿éöA Ùê"Ä@ W©ãÆÆy´Ý áÖW¯–Q^«mž¯tëßÄqYΆÛ2îUæJÊ5‰Ži*^3˜¸È‘5˜Êü î®;Š[kÆ@֜ÛhmÀÍd‰ 8P©ªeF$¤=æÏ7¸<9`õù­»šð¬mM£T֐Vy=8_ÅÜýC’Eé66šBQïvr†¼Ž[‘Ië´\Òw|ãô<ê^7¿ü҆¥Ï0‡6Zh(+˜ûzç{‘v(ºhýrÔµ’3þÌë&¯Öaݯjò°47YnnÄæKÓåµ1@wyw8£!â1T¿ŸŸÛ‚Súµª’U&3l/êPëÌÖÁiûã)CŽda‚8ýñ,œ •ƒÇ /Í£=K¬Ì\ŠyPW¬’úޜÌ\¹×ݽÚ&iKÊBÖםþñ² KGUzÁ”÷‚¹+áéPΦb8C$ škÂydeG¸ÒÚ#9±Ë£ž‡UmÛåy¾’!nmšûå1Çq8SÄçCÊÈp+&Ц= + DøƒzïÉúaʙ×’~ »Ò&ÐX¨/óò¶y½¢k«zÖ˃·Š½0Þ®:â^ë™q,S“vÆÿ ¤qÚ¦–:*Ó×&·äý²ÓLhML§FH§˜æ•£ö…µîšˆ É)]àÇÐ̑| gLWh×y‚le®ÎÖP‘ÓiÉz$SåÿY¦šdˆ«g檌î›mM{ÐgÝ iB§™ò†-óîýªà£Þ÷¼2Ë-±®2#Ý Ú08ó@†²“¿)p„qð„øE*jñ<Ð< &#H~@…`ÆÔçËlê`û:L“8l[Œ"¦Þ¥e¦éA‡—cµÈA´ëú»io~•Ã]sZµÕEï (§öõµÛÿ7• N†Tºç©šÿJ¹0§C7¦ÿÑÆÄù`ZgÌ~§Š@¹‘ŃQû]žÞ¬E\†úéUò¥ ËýãµÞrf«m¸2ï_îÍñ°ôw% …é¹Ò/üf`±~&³äZ)ÊJ€EŒ€©Ä4ÊĎýAã 큯Vs÷ûDÁ²³K~bÅíçŒu]/ÏÎv»Š*´Í’¢DI}Ùwv{&ê„È´EHÏË Ø&W#ؐd°¸QŸ4Ð~œþÍ¡hî +endstream +endobj +1167 0 obj << +/Type /Page +/Contents 1168 0 R +/Resources 1166 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1061 0 R +/Annots [ 1124 0 R 1125 0 R 1126 0 R 1127 0 R 1148 0 R 1149 0 R 1150 0 R 1151 0 R 1152 0 R 1153 0 R 1154 0 R 1155 0 R 1178 0 R 1156 0 R 1157 0 R 1158 0 R 1180 0 R 1159 0 R 1160 0 R 1161 0 R 1165 0 R ] +>> endobj +1124 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 719.912 239.176 730.816] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__tag_90e279d0af3491d3cc793595e3e1bbff) >> +>> endobj +1125 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [303.035 719.912 398.018 730.816] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3) >> +>> endobj +1126 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 683.657 244.157 694.561] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__tag_87fc73217faaf213d5b5a810272be545) >> +>> endobj +1127 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [297.496 683.657 392.479 694.561] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3) >> +>> endobj +1148 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 647.401 250.244 658.305] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__tag_08451f3fa991dc14b1b8874bdefd7cf2) >> +>> endobj +1149 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.06 647.401 349.042 658.305] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3) >> +>> endobj +1150 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 611.146 244.705 622.05] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__tag_94ca29d276a68f3f75aa62c8ab6109e4) >> +>> endobj +1151 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [248.52 611.146 317.491 622.05] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__tag) >> +>> endobj +1152 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 292.164 313.058 303.067] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__const__iterator__tag_b823e62915ff895212640119f062252c) >> +>> endobj +1153 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [316.873 292.164 478.246 303.067] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__const__iterator__tag) >> +>> endobj +1154 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.532 255.908 481.73 266.812] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__const__iterator__tag_cd03b90ea728537b78a669806309a5c0) >> +>> endobj +1155 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 255.908 513.996 266.812] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__const__iterator__tag) >> +>> endobj +1178 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 243.953 268.754 254.857] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__const__iterator__tag) >> +>> endobj +1156 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.717 243.953 482.102 254.857] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd8582d9f10213d638e87de8f0aa91a01) >> +>> endobj +1157 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.254 196.739 486.009 207.643] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__const__iterator__tag_e2334b2eefe8cae2ad750dfea1f7cade) >> +>> endobj +1158 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 196.739 513.996 207.643] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__const__iterator__tag) >> +>> endobj +1180 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 184.784 268.754 195.687] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__const__iterator__tag) >> +>> endobj +1159 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [285.86 184.784 473.245 195.687] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd8582d9f10213d638e87de8f0aa91a01) >> +>> endobj +1160 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.254 148.528 321.648 159.432] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__const__iterator__tag_51dfb5223b7487379681d4cc1583917f) >> +>> endobj +1161 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [326.611 148.528 513.996 159.432] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd8582d9f10213d638e87de8f0aa91a01) >> +>> endobj +1165 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +1169 0 obj << +/D [1167 0 R /XYZ 90 757.935 null] +>> endobj +1170 0 obj << +/D [1167 0 R /XYZ 90 733.028 null] +>> endobj +1171 0 obj << +/D [1167 0 R /XYZ 90 700.606 null] +>> endobj +1172 0 obj << +/D [1167 0 R /XYZ 90 664.351 null] +>> endobj +1173 0 obj << +/D [1167 0 R /XYZ 90 628.095 null] +>> endobj +1174 0 obj << +/D [1167 0 R /XYZ 90 576.41 null] +>> endobj +383 0 obj << +/D [1167 0 R /XYZ 90 464.679 null] +>> endobj +90 0 obj << +/D [1167 0 R /XYZ 90 457.609 null] +>> endobj +1175 0 obj << +/D [1167 0 R /XYZ 90 359.273 null] +>> endobj +1176 0 obj << +/D [1167 0 R /XYZ 90 307.09 null] +>> endobj +1177 0 obj << +/D [1167 0 R /XYZ 90 272.857 null] +>> endobj +1179 0 obj << +/D [1167 0 R /XYZ 90 213.688 null] +>> endobj +1181 0 obj << +/D [1167 0 R /XYZ 90 165.477 null] +>> endobj +1166 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F23 144 0 R /F72 202 0 R /F65 179 0 R /F11 727 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1203 0 obj << +/Length 1880 +/Filter /FlateDecode +>> +stream +xÚ­YێÛ6}÷WíCe æò*JIQ Iš iZ¤Éö) ŠE{…Ê’#ÉÙøï;¼èjy×»ë']L9ÃsfÎÈØ[{Ø{={~9»x0/BQ@ïråEؓA‚ï2ñ>ùEóÁûÛmvõZ媌뢼ú¸¯jµ¹ªãõ|Aößäµ*WñRÙÇj¥Ê9 }•ëW$ 9÷Y4ÿrùvöÇåìیÀúØ#f=!‘dÂ[nfŸ¾`/÷o=ŒXz7fÔÆã”Á5ó>Îþ™a·wÜ÷Aàž„HÀ I°Ž|¦T˜å›yÞ§…·Ò¼v¯õvʵÛ×3 Œø´ßË"¯ê«´voUj‡³£5´‰ÏX࣋˜¬½#Ë,ô\/D<½!(Χvýz¼ª>ƒuZ?9îš1µòÐÔÅ+ÚGá!b„ÂO6¦3=|Ž¢4c¶k𞠌vÆ%·¢ àzڂ°q¸¢K;ý%ÀˆIßÀI_]„µ¢7• †Q³$8nÇ ÌØz·­›2­Ó܁7¶ +{{çIæ°\îzí^؝T»¬³°žìëΉðuag.N7©šØ=%1v›Ú=FR´¢ÉxvqÇN E°C)’òQ|`áI|Hóe©6*?ÀeA¸› w™?Jˆc<8‚„#"فoÀsv?£Óc!¢â^Ø«Z@5øHÝõ§mñ¯~:¼\Í)öÔÇ0G¹'4d„(lÌ"ƒ?„D§AC}ÛÅÙU­ªƒ³2&Ξ*ƒSRå$Êi÷&ÍªÞ•y5_°Ðd*}Ù¤¯ïÊ>ÁÁ¨9o©‡ÉÈOWöG3ªî#ûÎâ²(]jÚybš™VL%*Jg-ŽL =D2 šD'¬…@X7f§»=»-ƒžgóçÂ¥á^pð¡ç ‚ï"çÌh|À¡@Á" م˜Š¥­45:rdÁÔ@¶½àaÊÕ"âtÓKUÇi¦KڗªZ–é¶N‹|¢rbØGÌe³Ë9ì{¿U•+"¹³±ÚåKmÀ½_5ÕƂ°­I°‚Í dícep[çô‚F,¹}_°D‘_Ûeõ­YVßô–mf—Õï{öõ£³o^¸ÇmYh~O·N©âdQäÙÞ­µ\êiìëìg¶ÒìIe&;SÅÊMiýèՁI—íý×½ –¬šñR‡¬AaOìPÈì²-˯û©Ö±ÿéӎþ-·•0ixݯÞpҁ@\‰ÐûKŠåN»¨ º¾N«C/ÜÄóT ξAߪ,6£š²*²¬˜Sáß´ÀYG3õt˜É€µœi Z…Ü¡!Lº¼º†³…°á£k—˜gO‰Z½çL2ÈzsÎÐo%Ƭ[(d’Û`!sœ.B?ƒÊv‰Û!½‘‚!µèúu´E¼ý˜6ñØ  +º¬ù[ñ^ª" “)ƒúÂ("Œ4õ%ëòª À1ԕúï¢Vc-ȪÜ˸l„Ká~ܨÍWUŽ‚n)Á°ý°å±Áš€ån©“Ìkø÷ªJ×¹‘kÃã…ä놎šœ[–°A²©Á’DpЪ èuæ)¥ðm|kÃF¡*‰0¼_ÃVÜ±QDDC'XBkàù.͒–Yöª6Ûz˜Œu?"e@œžnÙZÆoÓ-}bïð¾ç§ä{€`–,8ƒÂ†¬y+œ®trïÞ؇éçF£Ð•vuíDtÝ¢µ*{Zۊyh_%4)Á°Âû`Ñô|RÜ#3Ö¨¸© ²Ð暆 $§C釧éXƒT“øåô÷6øµÅÜ;EƒÓþ\âh§ï€vˆ +p÷A§ºókP ØÒÕ§n›m}‚W«f“VzÃMŸMr̦‘7/·³ $µD,5¶ç/jºA?ÇW#F™ÁYlÛCEùãå6“T·}3g¼O‹‰ï÷áDU.C ++r«Ñìí~(¬Ú6ïÈꪍ蘜 .[ˆÃfïü¬9ùÉikQRÕ÷ÌîãÿŠ˜öNü«¨ùkJŒ„ŠhÿÞbÐm3æ¿7a)7:Œúï‹l­’2¶¿¾K¿–q¹·/ìwq¾ÞÅk7ÿͨ‡WÿVªüEw¿•ðWœïâÌþ¦áú]/©Êʶ÷ð# -՘@P‹1÷?ªæß$ÿ¼æîϙ sçå!Âm½®ëíӋ‹››´¬Ð.O·%Jë €îÅaãÓ!€3µ'allS˜>|Hsx¹1Ÿ$Îée6LA +endstream +endobj +1202 0 obj << +/Type /Page +/Contents 1203 0 R +/Resources 1201 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1061 0 R +/Annots [ 1162 0 R 1163 0 R 1206 0 R 1164 0 R 1182 0 R 1183 0 R 1208 0 R 1184 0 R 1185 0 R 1210 0 R 1186 0 R 1187 0 R 1188 0 R 1189 0 R 1190 0 R 1191 0 R 1215 0 R 1192 0 R 1193 0 R 1194 0 R 1217 0 R 1195 0 R 1196 0 R 1197 0 R 1219 0 R 1200 0 R ] +>> endobj +1162 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.524 719.912 349.582 730.816] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__const__iterator__tag_cb94e9072062c0827a16766cef2c1a5e) >> +>> endobj +1163 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [359.816 719.912 513.996 730.816] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd8582d9f10213d638e87de8f0aa91a01) >> +>> endobj +1206 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 707.957 163.61 718.861] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd8582d9f10213d638e87de8f0aa91a01) >> +>> endobj +1164 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.609 707.957 272.909 718.861] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +1182 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.961 671.375 342.404 682.279] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__const__iterator__tag_7d4bec3e6101e95b57973dcab5880a51) >> +>> endobj +1183 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.075 671.375 513.996 682.279] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__const__iterator__tag) >> +>> endobj +1208 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 659.42 129.857 670.324] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__const__iterator__tag) >> +>> endobj +1184 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.552 622.839 346.554 633.742] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__const__iterator__tag_c5344d92361779d92fcb36acf2d406ae) >> +>> endobj +1185 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [359.816 622.839 513.996 633.742] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd8582d9f10213d638e87de8f0aa91a01) >> +>> endobj +1210 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 610.883 163.61 621.787] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd8582d9f10213d638e87de8f0aa91a01) >> +>> endobj +1186 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.07 610.883 361.456 621.787] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd8582d9f10213d638e87de8f0aa91a01) >> +>> endobj +1187 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 267.624 253.293 278.528] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag_33e20d1de127c9232d2d1188bee532ef) >> +>> endobj +1188 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.108 267.624 358.716 278.528] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag) >> +>> endobj +1189 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.114 231.043 325.461 241.947] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag_7752ae55e7cd4d014f6498348ef47865) >> +>> endobj +1190 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.285 231.043 433.893 241.947] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag) >> +>> endobj +1191 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 231.043 513.996 241.947] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +1215 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 219.088 174.668 229.992] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +1192 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.159 171.547 357.827 182.451] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag_b1316806c765a595ddfa4de5e8d971f6) >> +>> endobj +1193 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.696 171.547 464.304 182.451] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag) >> +>> endobj +1194 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 171.547 513.996 182.451] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6069aff3ad06a502f746df4adec1c16c) >> +>> endobj +1217 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 159.592 235.001 170.496] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6069aff3ad06a502f746df4adec1c16c) >> +>> endobj +1195 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.838 112.051 366.064 122.955] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag_f5253fb7ef85e1875cc453d9a9998459) >> +>> endobj +1196 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.612 112.051 472.219 122.955] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag) >> +>> endobj +1197 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 112.051 513.996 122.955] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6069aff3ad06a502f746df4adec1c16c) >> +>> endobj +1219 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 100.096 235.001 111] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6069aff3ad06a502f746df4adec1c16c) >> +>> endobj +1200 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +1204 0 obj << +/D [1202 0 R /XYZ 90 757.935 null] +>> endobj +1205 0 obj << +/D [1202 0 R /XYZ 90 733.028 null] +>> endobj +1207 0 obj << +/D [1202 0 R /XYZ 90 688.406 null] +>> endobj +1209 0 obj << +/D [1202 0 R /XYZ 90 639.869 null] +>> endobj +1211 0 obj << +/D [1202 0 R /XYZ 90 564.87 null] +>> endobj +384 0 obj << +/D [1202 0 R /XYZ 90 440.531 null] +>> endobj +94 0 obj << +/D [1202 0 R /XYZ 90 433.714 null] +>> endobj +1212 0 obj << +/D [1202 0 R /XYZ 90 335.305 null] +>> endobj +1213 0 obj << +/D [1202 0 R /XYZ 90 282.633 null] +>> endobj +1214 0 obj << +/D [1202 0 R /XYZ 90 248.074 null] +>> endobj +1216 0 obj << +/D [1202 0 R /XYZ 90 188.578 null] +>> endobj +1218 0 obj << +/D [1202 0 R /XYZ 90 129.082 null] +>> endobj +1201 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F23 144 0 R /F72 202 0 R /F65 179 0 R /F11 727 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1251 0 obj << +/Length 1921 +/Filter /FlateDecode +>> +stream +xÚíZ[“â6~çW¸ò²¦ªQëbÉvò”ÝdRÌlfg:•‡™T—ÚP_ÖÝáßï‘e šHv«ö_¥sùÎwΑ½¹‡½F¿ݾ̋Q,¨ðîg^Œ½PÄ)ñî§Þ'?DñxB0Æ~Q,~P™*¥ÉˇëʨôÁÈùxB9öï2£Ê™L”»ü fª“ÈW™½E¢(ü»ÿqôýýèß#ëcÔëñ…Œ{I:úôö¦pÿG#GÞs=*õÊà¸ô>Žþ5쇎µNoéDHˆÌ‚AbŸ)åµ8ísÞ§ 5ufšÛV¼rÞÈù¡`U³v˜ª¥2jÏ»óÙáŸ1Ç'¬'Kò¬2¦šm^Á|¤÷O{¼}R/¥E`•¦‰€x…Óù.Ø’K=•FUÎUfÑøl!³éRÙ¹|kªð +X¤žd^}íÆô–#pJâvŒYèföTþ>&Øo«V嘅¾ÚY:ÉKw¿*òlª³TͽÜ=”´“<ëåҝ©1áþ“ÊÌJ.—kwïQm?¼T²RS4h±} öBL'„7c3§Ú›U– .kUÆ}—»ã?óæÆ»|ªgëM;7»ËÜ삗¡€{J ¾¹„Db8„«¢öaªS•U ×îÌõƒ—q=ݼº9"i@]Mì€X "ðA1çΝ¬f]¨ãÑm +H@ZT~Ƙ9èö, 8¢í˜ô¥ñ5á$êÇׯ¥Þ„U>I,@QØ-5F–¨È&ŠÐlœS_æ³P=©¤CTíÎ&:²d™W6šö%!몦Üó°@Xˆ°¸÷¡0&þTþG8q.|¬å›ë=³Ï^à0#¬\ÁÊGÈ,d¼ÉÍI<â†CR›—b’ˆ„¬Éo«Jϳ£<¡h“ðµNø,ê€&Û<Â76[øªï|Uäà] £¯º•û4öèâ@gYWìQÝ>vëuytG00¿Ï1ÆPD.nGx.›îMc/f;Ûє,"þ@q!Û±F­Ã.„^Õè)ôŠW‚—Ä–¸f’þù§ÿ œ.Ýa+CCÚØÏÐ0d0CÇ`ܘwE!éü¥›uŸUÝÒÀÙ,/S5½ Ê}\º­/»¦ȸ±•4tÇTµâ·³hÓÜÑi±TP=i\ýXëãÚÀRKð)q©ŸÆ½Ôoã"„Å1œ`í¦ýhêق¼PåBÚ½–ã€û¹[7Cc@5ö©ÔlÕ4‰³6̦êq ½Åªöã¼Ë1Ū«ê•Mb(¤iƒMâ;¹¾RsÅ×ßúçòuüçÄnš[g>µ€“íÎÀʵÅnƒ ô YšÄQÌÏÀn<•2U›iª½n§ïk &|n+†Q„`yBéMè1Ti¹d«6ßíüí׀M=щ-oe‘ƒUÊf­al~IyrW[¤ßø%y±~qe0€3 cÆ6yjÿ|9TÈ©$µ]S|³#êa€¶”¬³Äå»÷vÓ±¾K*QU%Ëõ˜Ÿê#Rndƒ)èSî]V¬ÌíÏ+·Ò†„¯¿½Ö¨ÎŠFþ[Ã| ‘¾·BWƒý¤å … ×í# ŠLÒízUfš¯†JqF _مÇÝl?ÎÎs䛻·ß;­z;$‘hð‚-H²±P©dzsZÈ« c)hðÁ/Žރ*»ÝÖt±»¿†±°ož ˆp@PpaÉê<% YBˆ!±y·b!tFöŒmÙ©øë@BÇpE’ÙΪ)}y2©¥QmeeJ[áCV½ÙÙ|µí\Ù¯¨ž:±‰wÑÏc›†¨õIËÁ6] ÷,? µ¯U_Ù¨cŠl»^Ÿ.«Dë‡é*-þ„LÕxäe2FÙù”ùbt2(Ø0Ù)ؾÝÛr­a¤Ú(ÛP(š7’[ý´+æ†Z‚§@Ý©àÞ¼íU|ÐXD×e¾Ø¾“â×ÇÖ2—Ókv’§P…1øã¬wg¢ŠBª·ŸôPõ´¾$ªì§ AøbTuîÀT +7EþqlE/ÃÖî—Â~½ôÎöà âEÍÇ(_®jZJ÷ï[ýXÚþ¢¾ø‡òVfó•œ7Ï»Ulnp Üúºµ¿Ù–¤r¼“ÙJ.Ý¡OvIU6½Ü4aD-8ì–üª}í,ð»×žý4ªM¿Ñ‹ÂÌÆ_ßÞ>??£¤B«L%Ò搻߹l&!@b<î¢Þír`i^*§ƒÎìfb ©¾ßÀOÿ{ª +endstream +endobj +1250 0 obj << +/Type /Page +/Contents 1251 0 R +/Resources 1249 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1061 0 R +/Annots [ 1198 0 R 1199 0 R 1220 0 R 1221 0 R 1222 0 R 1255 0 R 1223 0 R 1224 0 R 1225 0 R 1226 0 R 1227 0 R 1258 0 R 1228 0 R 1229 0 R 1230 0 R 1260 0 R 1231 0 R 1232 0 R 1233 0 R 1234 0 R 1235 0 R 1236 0 R 1237 0 R 1264 0 R 1238 0 R 1239 0 R 1240 0 R 1241 0 R 1242 0 R 1243 0 R 1244 0 R 1245 0 R 1246 0 R 1247 0 R 1248 0 R ] +>> endobj +1198 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 708.309 260.735 719.213] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag_540cea530eaa9c142b16fbf01f781673) >> +>> endobj +1199 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [264.55 708.309 392.17 719.213] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6069aff3ad06a502f746df4adec1c16c) >> +>> endobj +1220 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.432 636.83 314.892 647.734] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag_eeec098f7c1e5939b144f3d42a2c65fc) >> +>> endobj +1221 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.033 636.83 455.653 647.734] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6069aff3ad06a502f746df4adec1c16c) >> +>> endobj +1222 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 636.83 513.996 647.734] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1255 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 624.875 190.738 635.778] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1223 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 588.717 261.85 599.621] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag_888341fcf1079aaaa4dd7b532662729c) >> +>> endobj +1224 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [265.666 588.717 393.286 599.621] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6069aff3ad06a502f746df4adec1c16c) >> +>> endobj +1225 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.785 552.559 260.611 563.463] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag_a7260438cfc5fa383c7fb80b127f8315) >> +>> endobj +1226 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.106 552.559 393.726 563.463] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6069aff3ad06a502f746df4adec1c16c) >> +>> endobj +1227 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.84 552.559 513.996 563.463] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__const__iterator__tag) >> +>> endobj +1258 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 540.604 189.622 551.508] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__const__iterator__tag) >> +>> endobj +1228 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.574 504.446 254.798 515.35] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag_fcc12e4f52a8ff85d16ebfc424447b63) >> +>> endobj +1229 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [262.081 504.446 389.702 515.35] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6069aff3ad06a502f746df4adec1c16c) >> +>> endobj +1230 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.84 504.446 513.996 515.35] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__const__iterator__tag) >> +>> endobj +1260 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 492.491 189.622 503.395] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__const__iterator__tag) >> +>> endobj +1231 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 456.333 251.33 467.237] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag_e9bc39a46753f158644428f3c01e73a3) >> +>> endobj +1232 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.146 456.333 382.766 467.237] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6069aff3ad06a502f746df4adec1c16c) >> +>> endobj +1233 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 373.895 256.301 384.798] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag_f5911dc31286d92c979c7ff89c249bc8) >> +>> endobj +1234 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [260.117 373.895 361.725 384.798] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag) >> +>> endobj +1235 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.825 337.737 313.612 348.641] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag_3f5244b219701d5ba5939982a1d11d97) >> +>> endobj +1236 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.147 337.737 428.755 348.641] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag) >> +>> endobj +1237 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 337.737 513.996 348.641] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +1264 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 325.782 174.668 336.685] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +1238 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 254.302 268.495 265.206] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag_3d3687abfb3878a67fca687b8e4ff0b9) >> +>> endobj +1239 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [272.311 254.302 399.931 265.206] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6069aff3ad06a502f746df4adec1c16c) >> +>> endobj +1240 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 218.144 271.813 229.048] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag_e12a1e70aa5010e6617de857f51574a8) >> +>> endobj +1241 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [335.673 218.144 463.293 229.048] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6069aff3ad06a502f746df4adec1c16c) >> +>> endobj +1242 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 181.986 276.794 192.89] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag_ba231f6ac03d82cbf693a6a29a5c2665) >> +>> endobj +1243 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [330.134 181.986 457.754 192.89] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6069aff3ad06a502f746df4adec1c16c) >> +>> endobj +1244 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 145.829 282.881 156.733] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag_067f83ba740e5b6c0c585a5175723a0b) >> +>> endobj +1245 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [286.697 145.829 414.317 156.733] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6069aff3ad06a502f746df4adec1c16c) >> +>> endobj +1246 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 109.671 277.342 120.575] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag_ad90ffcd536cd0d48ee183bca02103fc) >> +>> endobj +1247 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.158 109.671 382.766 120.575] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag) >> +>> endobj +1248 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +1252 0 obj << +/D [1250 0 R /XYZ 90 757.935 null] +>> endobj +1253 0 obj << +/D [1250 0 R /XYZ 90 725.234 null] +>> endobj +1254 0 obj << +/D [1250 0 R /XYZ 90 651.732 null] +>> endobj +1256 0 obj << +/D [1250 0 R /XYZ 90 605.641 null] +>> endobj +1257 0 obj << +/D [1250 0 R /XYZ 90 569.484 null] +>> endobj +1259 0 obj << +/D [1250 0 R /XYZ 90 521.371 null] +>> endobj +1261 0 obj << +/D [1250 0 R /XYZ 90 473.258 null] +>> endobj +1262 0 obj << +/D [1250 0 R /XYZ 90 388.797 null] +>> endobj +1263 0 obj << +/D [1250 0 R /XYZ 90 354.661 null] +>> endobj +1265 0 obj << +/D [1250 0 R /XYZ 90 269.205 null] +>> endobj +1266 0 obj << +/D [1250 0 R /XYZ 90 235.069 null] +>> endobj +1267 0 obj << +/D [1250 0 R /XYZ 90 198.911 null] +>> endobj +1268 0 obj << +/D [1250 0 R /XYZ 90 162.753 null] +>> endobj +1269 0 obj << +/D [1250 0 R /XYZ 90 126.596 null] +>> endobj +1249 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F72 202 0 R /F65 179 0 R /F23 144 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1299 0 obj << +/Length 2109 +/Filter /FlateDecode +>> +stream +xÚÍYێÛF}×W؇P@Ôþ±Io°@bg'NŒg‘;h±%¡H…¤f2ûõ[}ãM”ÁP÷‘±{AQšÏGæ§å갓E“èˆ Ím¶Y}Ò£}=pŒ òº*wN„tBóÜX¸ïA×\¾ÐÈtÐòpˆÊ(¥ì{BøpÖ»· ±Zne’‚s8÷ÑÖø ‰1Š9'Ê) '’‚w‹dÕó׀LàCá}èþ++Vù!µj`ܛÉ)¼ßLȂ„%턾óò"ŠÂ(tÓÿÓº·›±ÀŒ#B)¸—€{…™y#ó ×­ÑõÛû€¿”K“mÒ´0ª]ZUö¦(í˝Ü}ÕÈÁDáhÜudf jgÕ šê°RùÚþ¶®³M¡2eR 4;u°ÚÈNLã°F,&çQ ¹f‡KWK×7zcTG­:—:äŽ%1Æ´7OŠ¤=øHÄH¸t"– Ån¡µùúŒ11ØS~^¾É +™TËïÿÞW¼\#e¬Ù¹„P¨/eqØ}ÜC Ã~X„Ïn4#唄ží.[Ç«jä1CÓ~kÆËR®UP­­2ʱšpÏJ@î Y˜=¢YÍ©ð%ä–bJýD]ˆpÀª è±bæ~Á0ÃåÚ\ÓÌYu5¢·.…BNÛ`ç²-O½9EL¸)&@tc8’ÌÀ[ÿ́8ŽhÔU­ ˜ÿÚjk +È)«ˆ*¥úõ;mÕzÈê”ͱßw £Ìt+ŸX)öÍ*/ëƒ`Ñ„ÐcIJ¯h…V=ÆÁ«wYmÒpd}Hp¤3/0_ .ZûuɁ +ÓFÀXy,˜A]ãø|œ$xÉù×!ÉÍ­J}Ý:lsÀOć>³zh¢êôP Ç±Ý>⣠-éñ¨™ ´B5ƒAÍþôªéˆú¨j.ÿ'«r –. )LðõŊ(aÐ ‘§ÕÐÇÖ +ð¸*FùBÙàvÜus)L×Õ걨Vcxˆisˆt¤Cä#cŠ£´(8…€pܦøäf2F·¬ +›’"L?µY‰0ø‚ÍJ*sÙÈÏEÎe‰l*ä¯ µ™½Kò,MZÞh#ܕÒQ8À]¼KÚ͋©pPÄ»ptgõ»äOûØë\ú+¯ÊÊÒʾ,ÒöLގ•æ£•rŸå¹¹Ódv'‹6–ŽÒ>ÈþǹLjµi?g±à9Œ¬ ¡Œi×ÃCóŽî_•æú‹; þ¹L³õÃÈÒiˆ<Óù¬ƒg)ݹ-»Íô3âô,×ê±lÆž£Þ²ݯ‚Çô»GW|J#ÅÃTù½WY'9Š2µµ›> endobj +1270 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [140.032 456.32 220.898 467.224] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag_ce16d45c8fbb00ad5b616aa4344fb798) >> +>> endobj +1271 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [226.641 456.32 293.928 467.224] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag) >> +>> endobj +1272 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [318.686 456.32 447.412 467.224] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +1273 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 456.32 513.996 467.224] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf449476be1ec42bab45fb86e7478bdf9) >> +>> endobj +1304 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 444.365 218.693 455.269] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf449476be1ec42bab45fb86e7478bdf9) >> +>> endobj +1274 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [226.942 444.365 324.435 455.269] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf1c4903edb1a626a36a7220038f963c4) >> +>> endobj +1275 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 375.194 287.046 386.098] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag_afa09f891353748a46868d342cc91cbc) >> +>> endobj +1276 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [290.862 375.194 358.149 386.098] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag) >> +>> endobj +1277 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 327.941 320.799 338.845] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag_048cb229297e24f6d0f7ab4e4351e2c2) >> +>> endobj +1278 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [324.615 327.941 391.902 338.845] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag) >> +>> endobj +1279 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 280.688 288.132 291.592] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag_b3fe811bb3a347e553576dadff55339e) >> +>> endobj +1280 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [291.948 280.688 359.235 291.592] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag) >> +>> endobj +1281 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.658 280.688 472.957 291.592] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +1282 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 244.394 296.69 255.298] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag_297969dd313ebb370c9419915398aaf2) >> +>> endobj +1283 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [300.505 244.394 367.792 255.298] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag) >> +>> endobj +1284 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [384.898 244.394 478.197 255.298] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +1285 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 208.1 226.414 219.004] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag_278a22338f8428e328daf84dea4f94e7) >> +>> endobj +1286 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [230.229 208.1 323.529 219.004] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +1287 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 136.246 271.245 147.15] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag_30d13726e3b27f1be7e5eb05a7814bb3) >> +>> endobj +1288 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [275.061 136.246 368.36 147.15] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +1289 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.821 136.246 462.177 147.15] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1290 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 99.952 219.779 110.856] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag_f2fd5edcf647f4bc5b64cf0f4f712a51) >> +>> endobj +1291 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [223.594 99.952 316.894 110.856] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +1296 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +1300 0 obj << +/D [1298 0 R /XYZ 90 757.935 null] +>> endobj +1301 0 obj << +/D [1298 0 R /XYZ 90 733.028 null] +>> endobj +385 0 obj << +/D [1298 0 R /XYZ 90 628.882 null] +>> endobj +98 0 obj << +/D [1298 0 R /XYZ 90 621.841 null] +>> endobj +1302 0 obj << +/D [1298 0 R /XYZ 90 523.497 null] +>> endobj +1303 0 obj << +/D [1298 0 R /XYZ 90 471.256 null] +>> endobj +1305 0 obj << +/D [1298 0 R /XYZ 90 392.153 null] +>> endobj +1308 0 obj << +/D [1298 0 R /XYZ 90 344.9 null] +>> endobj +1309 0 obj << +/D [1298 0 R /XYZ 90 297.647 null] +>> endobj +1310 0 obj << +/D [1298 0 R /XYZ 90 261.353 null] +>> endobj +1311 0 obj << +/D [1298 0 R /XYZ 90 225.059 null] +>> endobj +1312 0 obj << +/D [1298 0 R /XYZ 90 151.183 null] +>> endobj +1313 0 obj << +/D [1298 0 R /XYZ 90 116.911 null] +>> endobj +1297 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F72 202 0 R /F65 179 0 R /F11 727 0 R /F23 144 0 R /F87 1306 0 R /F34 1307 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1338 0 obj << +/Length 1802 +/Filter /FlateDecode +>> +stream +xÚÅY[oÛ6~÷¯°‡É@Íð"êÒ ¶v)ÒfkצOma(mÕm’œ4ÿ~‡7Ùr”&MlìŔ(òð\¾sá1öVö^Mþ¸˜œœ†ÌKPÒлXz ö¢ N‰w‘yŸü2Œ±_×ùüU#³ù+QŠ&íªfþá¦íD1_TeÛÍegg»t5QŽý³¦–éB˜×÷b)š)‰}Qª©„&ØèôËÅëɟ“'xÂÑ<ðEŒ{‹bòé ö2˜íaĒػ֫ +/  ÆÜû0ùg‚­dҘA¿Œ: ‰"D·Ì–ã(‹’GŒb²ÀŒfoß]OÄ{Ñmc nl€©ZÙÉ+a&AT¡¢® Y"ǐD0¬÷€)dC0qÿZä¹!»¬šBdÏÔKèK$TÄAîuiîÌ®6íd«¼Å„ÚÀO î E‹¨øe««ÒI¤äѱ²ìÚ_Ôdä¬e¨ÜõD‚h©H‰a[—™EµhÖim\¤_µŽìk[ûe%[û8®8 +%L˜ü°^B:ä~eN-ÑtÆàác+–›Ü,X:ÊÄå”b£¸’¥-~êMÆí÷=e §A6#FqL½h—_ÏÊzӝ¼Ýt0˜3N7åB龜±_ê@vâàz©I|דռn`åÖwŽè€ßžâ€ï›í((TaïLßî-Æ"& ˜DnEÛeÕ¦¡Ã(„ÕGF̈́£JÔÃåf°Üò¦;=;ÿӈCwqI‚QÜG̬p d[ê´]#ÒâYú°x `ă½òñ€ˆ0¹Ô+ˆé¶¦«ŒƒÞ>#È°h¨—C†pÀLp`̤íA³X»Òw4 ø¶‚U ¹8ê‰í(¨þ?`‚¡‹šÔå´<¯3ý›v¦=[å¢îb·êA±­áôx½– •È×6ÚäµM¸Žê•LÇø§!ÂÉ@ã#2PÕx¦G¹^¤íBÊy¶)êc¦kƒ;Â! Œüx8|0i Ên2ÄãKÚ]JW÷ƒ6v_›¡;噾̎•H`õ÷"Tå‰!>npKGüˆhÊ«4{šžˆ#FPFŸ˜«£sö(Rµ z0Š–¦À.ÆHÅ(ŠÂ‡aéžÆÇ~]­"CoPDxÜ791rmΗ¢KeîâæKÑ.YkÙo›+E,°7˜‹iŒý›Z´{7™e_¦o+sIPät[ÒBûÂÝ£hÚ´ÑT*A\ÉL m­³ÉR噾A Y…•QÏ5YÛ«|¨\CY￯n·®†…Ì ANRU×jYùž¬YµØC¸õ²ukÙÞɼa»hÁYqÙΆÛ²‚´«ÅíolꛋçCÿ%¡mqē{bŽN+óµH3Ð +\†Ñڂ›y¦OJM³$Tqtì>ûÁQkÎïµæ¬´–÷ h ͼ¸vô'» øI–‹|“Yž ÙYÉŠ¶%ä¯#´"=0w-á¬0 3Æ}ˆù­·ÓnºÔKàâ q¦/ò-¬×ïï+Ye¿«Î9Ú:íz<ºöEÚô- û±Å¥«øzk ïýpXv›ö¹Fnߢ5›…Š6%ý®;†Eßïîí¡Ï.œ¶ÿWMë¾Âÿ©qÿĄ(‰ÀÌ?N> endobj +1292 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.961 707.957 250.281 718.861] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag_318f5f2972203c84ea0fdb4b82bbab1c) >> +>> endobj +1293 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [259.953 707.957 353.252 718.861] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +1294 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [376.887 707.957 460.244 718.861] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1295 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 707.957 513.996 718.861] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +1341 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 696.376 178.862 706.906] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +1315 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 659.14 230.05 670.044] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag_140a26e6f6dc525c742aca71f598ed3c) >> +>> endobj +1316 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.866 659.14 327.165 670.044] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +1317 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [337.626 659.14 409.107 670.044] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +1318 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 622.278 217.009 633.182] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag_74a772b49c2c3190ad8501ffa0337d2f) >> +>> endobj +1319 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [220.825 622.278 314.124 633.182] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +1320 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 537.904 234.175 548.808] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag_5d89173a47e10f469337343cfb807218) >> +>> endobj +1321 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [237.99 537.904 331.289 548.808] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +1322 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 501.043 237.492 511.947] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag_6d184edbb85d3c2747bb6097f7de17ad) >> +>> endobj +1323 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [301.352 501.043 394.651 511.947] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +1324 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 464.181 242.473 475.085] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag_30161047ab7c47dd7a68a852e98ed83e) >> +>> endobj +1325 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [295.813 464.181 389.112 475.085] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +1326 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 427.319 248.56 438.223] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag_6a901364857f84dc0f111a29330c33f9) >> +>> endobj +1327 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.376 427.319 345.675 438.223] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +1328 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 390.457 243.021 401.361] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag_d6d26ca0f256b0d9a45173e7d83ee4cc) >> +>> endobj +1329 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [246.837 390.457 314.124 401.361] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag) >> +>> endobj +1335 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +1339 0 obj << +/D [1337 0 R /XYZ 90 757.935 null] +>> endobj +1340 0 obj << +/D [1337 0 R /XYZ 90 725.058 null] +>> endobj +1342 0 obj << +/D [1337 0 R /XYZ 90 676.241 null] +>> endobj +1343 0 obj << +/D [1337 0 R /XYZ 90 639.379 null] +>> endobj +1344 0 obj << +/D [1337 0 R /XYZ 90 552.983 null] +>> endobj +1345 0 obj << +/D [1337 0 R /XYZ 90 518.143 null] +>> endobj +1346 0 obj << +/D [1337 0 R /XYZ 90 481.282 null] +>> endobj +1347 0 obj << +/D [1337 0 R /XYZ 90 444.42 null] +>> endobj +1348 0 obj << +/D [1337 0 R /XYZ 90 407.558 null] +>> endobj +1349 0 obj << +/D [1337 0 R /XYZ 90 355.13 null] +>> endobj +386 0 obj << +/D [1337 0 R /XYZ 90 242.186 null] +>> endobj +102 0 obj << +/D [1337 0 R /XYZ 90 235.586 null] +>> endobj +1350 0 obj << +/D [1337 0 R /XYZ 90 137.113 null] +>> endobj +1336 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F72 202 0 R /F65 179 0 R /F23 144 0 R /F11 727 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1367 0 obj << +/Length 1813 +/Filter /FlateDecode +>> +stream +xÚÅYY“ã4~ϯpÁNÑè°,i ¨¶–£ +v‡§… +&V2.;k;;;ÿžÖá+ñL’žlËR«»õ}}Ø8Ø8x9ûæfvõ}Ì…TLãàf(ˆ˜ NIp“oC/Æ8ÜíòåË*K—/u¡«¤)«å›ûºÑÛe“læ ÊqøªhtµNVÚ=¾Ök]͉ ua†R†›ÿqóÃ컛ٻ-p@ì®\ Áx°ÚÎÞþƒÆ0bJwvÖ6ˆ(ƒk¼™ý:ÃÞ<´„ã%„à +AÂ1wæüN)·Û·ë‚· ¶eE㇍:ÕÆëõÚN LHk}¡ç”‡wxaUu³Ì7z¸ áï˜ã÷yÄÁNôÂ, $Šb,AŠ{«Ú=—Íh׫ïéðh™B˜:O`lâÀkR’´sv›¬•ÉHj/]PPFÅqd.¨BP†"I'à›}–§µCâ.àC>tZÃܽ1¼2†|æ—©»¹«àíXÎ-¼Ì=Κ²᧴×4­æL„º®©ƒ^cÊBu³FvQ Qí$4éŠÞ%#_.¨H18,J‘"ÑS ¨(½‚ËuUnŸ†¨#cÁžˆâóÀJYŒ°Š/Eë珸 +e•sj¨è<± AXˆ±3ÎQ60ˆ»€0$BD°i¾0ˆ™‰»x†˜Û!CÜHs›´ï†«¬ÚÝ»r=} ÄEç¹iä“fý”/@§íV…»¶L4÷ë^3í4ñ|Ͻ:+GȤÑéö%;U‰ .ŽE9•N°ÂŽþEr 87ò ÜÆ1³ÀLê:Ûÿµ©ÿ³­ì8LëÇØIUü09ý.Î$<6çVÖÕê)¬üڞË8ý8‚™; ˜KB·º}5™Ó¦hH%Š»Œ ZN±P"ÖÇ8ÈtÇb¢¤Kcàæ¸Ì>èDq„±z¤ãȞrªsÝ菫£ŒŒÓ8=£ jüþU1pø>ɳ4éJš:>”±„@%âA¼¾žŠf¢ªBs›yñÛäï9Áa»[½wa󶕧»²H³Â—ô~¬t‹V­»,ÏݝïïuÑì“<÷œøKç:©uú8èzŽÚ‘„¬À +ò‘ÿ…ï*úîÔý¼mAVnp *uVt•äwï@ͬñzÞÌãì¼q12n%Š@ȊȧàŸKu~Mue,´½Ó! Œ $Áƒè¿¬Ìy,–süðö'ª>‚¤”—U}çw(Àb¨)G„4X2 ]û«÷öÿ"z©õÒ(R›J©‡ßQf˜j_:*zÎíó^¼èï,—‹a©tIÏCQԗջ͔õ¡æ²TÁF$ÏÒð\À” 8où~Ä%ÿãžû¹²„¯“[£Ž‘IDùEp¬;Œ%͸YþdWÂIԟ<€EÓpâðCs†„KKh¨\@Åg@‹Tì|¸h“–}ñbäüqõÃÇFÕ ö¸ +0_ëf_™R˜IÕÌeWÖêÞk÷ç¤M‰ãðaú8h»³µ{éºByPÃD/q¢±Ë¦ª^ +é8bÀ?LP@"!»HfJ€‰FŒ;ÓqÅE4ª ½c„¢þh¢áр’i¹Úë §1úfdhŠ_xgŸê‘7Z„šïi]æyi¿‚v؂B‘æúzî€Ú‘ýøÊW'¾ÿÛÀº¼…£·p¢[+Xàºnċd¥xö?$ÏNÁ³¸f#âhËáñ~ +ÅU¾O½r„ frhè ÷å„,€Kԕ)C·þɓ Å}¨ýjtN‡¿‹bi{±3ÿµ‡b5œŸûÏÅâ|bÆÂ_,)ª­©Ø )óû[V‰{ûSöW•T÷îá[7姤Ø쓍_ÿêÞ0ô[­«Ï ¨j·à礀¼áޙZã½ÙRWµc B aܤiéGáÝv€Îíݏ3ëñÞ.I„iëÃÛ¦Ù]_]ÝÝÝ¡UöE¶«PÖ\ÁI\÷»½©Ÿ«îàœ@±mYigCVÀàÖ2žÓ?w' +endstream +endobj +1366 0 obj << +/Type /Page +/Contents 1367 0 R +/Resources 1365 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1314 0 R +/Annots [ 1330 0 R 1331 0 R 1370 0 R 1332 0 R 1372 0 R 1333 0 R 1334 0 R 1373 0 R 1351 0 R 1375 0 R 1352 0 R 1353 0 R 1376 0 R 1354 0 R 1355 0 R 1378 0 R 1356 0 R 1357 0 R 1380 0 R 1358 0 R 1359 0 R 1360 0 R 1382 0 R 1361 0 R 1362 0 R 1384 0 R 1363 0 R 1364 0 R ] +>> endobj +1330 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.34 719.912 347.535 730.816] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__const__iterator__tag_0632eaac5ec676910e433016619b3e85) >> +>> endobj +1331 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.585 719.912 513.996 730.816] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__const__iterator__tag) >> +>> endobj +1370 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 707.957 163.61 718.861] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__const__iterator__tag) >> +>> endobj +1332 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.767 671.095 513.996 681.999] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__const__iterator__tag_c23bf247df0b2721e97c8eeb8945adf1) >> +>> endobj +1372 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 659.14 155.859 670.044] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__const__iterator__tag_c23bf247df0b2721e97c8eeb8945adf1) >> +>> endobj +1333 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 659.14 352.491 670.044] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__const__iterator__tag) >> +>> endobj +1334 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [396.906 659.14 513.996 670.044] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf02dc1cffb4d3d79720ebafbe872be03) >> +>> endobj +1373 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 647.185 223.943 658.089] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf02dc1cffb4d3d79720ebafbe872be03) >> +>> endobj +1351 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.209 599.364 513.996 610.268] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__const__iterator__tag_f2932a2fa90f54f604e340d0e2eac7ba) >> +>> endobj +1375 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 587.409 155.859 598.313] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__const__iterator__tag_f2932a2fa90f54f604e340d0e2eac7ba) >> +>> endobj +1352 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.041 587.409 344.656 598.313] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__const__iterator__tag) >> +>> endobj +1353 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.585 587.409 513.996 598.313] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf02dc1cffb4d3d79720ebafbe872be03) >> +>> endobj +1376 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 575.828 189.622 586.358] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf02dc1cffb4d3d79720ebafbe872be03) >> +>> endobj +1354 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.62 538.592 351.256 549.496] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__const__iterator__tag_1842c4ba3cd1adb1e1bccef3cfcfa57f) >> +>> endobj +1355 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.585 538.592 513.996 549.496] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf02dc1cffb4d3d79720ebafbe872be03) >> +>> endobj +1378 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 526.637 189.622 537.541] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf02dc1cffb4d3d79720ebafbe872be03) >> +>> endobj +1356 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.447 453.222 379.749 464.126] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__const__iterator__tag_813ac0651ebac0120830cedf1ea58395) >> +>> endobj +1357 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [396.906 453.222 513.996 464.126] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf02dc1cffb4d3d79720ebafbe872be03) >> +>> endobj +1380 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 441.267 223.943 452.171] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf02dc1cffb4d3d79720ebafbe872be03) >> +>> endobj +1358 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [239.942 441.267 356.484 452.171] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf78df97484e374abe5d4e0f8973a622d) >> +>> endobj +1359 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.595 404.405 359.281 415.309] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__const__iterator__tag_f4cdf3fbe1977a24a90904e02efd791b) >> +>> endobj +1360 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.585 404.405 513.996 415.309] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__const__iterator__tag) >> +>> endobj +1382 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 392.45 163.61 403.354] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__const__iterator__tag) >> +>> endobj +1361 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.476 355.588 376.72 366.492] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__const__iterator__tag_f8d741d4315fb12dff45b47979f88808) >> +>> endobj +1362 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [396.906 355.588 513.996 366.492] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf02dc1cffb4d3d79720ebafbe872be03) >> +>> endobj +1384 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 343.633 223.943 354.537] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf02dc1cffb4d3d79720ebafbe872be03) >> +>> endobj +1363 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [234.403 343.633 445.031 354.537] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf02dc1cffb4d3d79720ebafbe872be03) >> +>> endobj +1364 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +1368 0 obj << +/D [1366 0 R /XYZ 90 757.935 null] +>> endobj +1369 0 obj << +/D [1366 0 R /XYZ 90 733.028 null] +>> endobj +1371 0 obj << +/D [1366 0 R /XYZ 90 688.196 null] +>> endobj +1374 0 obj << +/D [1366 0 R /XYZ 90 616.465 null] +>> endobj +1377 0 obj << +/D [1366 0 R /XYZ 90 555.693 null] +>> endobj +1379 0 obj << +/D [1366 0 R /XYZ 90 468.3 null] +>> endobj +1381 0 obj << +/D [1366 0 R /XYZ 90 421.506 null] +>> endobj +1383 0 obj << +/D [1366 0 R /XYZ 90 372.689 null] +>> endobj +1385 0 obj << +/D [1366 0 R /XYZ 90 297.346 null] +>> endobj +387 0 obj << +/D [1366 0 R /XYZ 90 172.448 null] +>> endobj +106 0 obj << +/D [1366 0 R /XYZ 90 165.847 null] +>> endobj +1365 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F23 144 0 R /F72 202 0 R /F65 179 0 R /F11 727 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1420 0 obj << +/Length 1940 +/Filter /FlateDecode +>> +stream +xÚíZIã¶¾ûW¹ÄÒl.¢–äô²Ì Ëd™éàæ µE»‰h‹$·áŸâ&ɲ¬îžØ‡ï$Š¢ÈZ¾¯XE {[{o_ß-nß̋QÐÀ»Ûx1ö€ N‰w—z—!"tuC0Æ˪ÊîßÖ2½+ +Q'mYß84­ÈïÛd»º¡/¿/ZQo’µ0·ïÅFÔ+-E¡º£héû«?î~X|w·økA@ +ì½*Qȸ·ÎÿÀ^ +ý?x±8òözTîù”Á5ó>,~[àY (C8àFƒ÷"KZ‘‰ÞìŠu+Ë¢Q2ܾáxð"ön¨˜›÷þ‡9þ¹l­*ícÒº–hlgRÛFQڇ¹È@eÝÞ¸µLE´ÒNjw‰N|DB¦ÅˆcfÄø&hëÝÌÝ|a&þOÓÈm‘‹Â.šV»o…z´ÚHOÏa‚ü °ºRʏ^ñ>Þpp¹„%L·òR½µîz¯¨& +±¢|¹ŸÆÆxVõ’²ìÙiç`6ҊmG£áPÄz³ ƒa#âÆTÛfÆ3!õ"x/ðÕ{74sð X/ðC3Á×;™¥s‚¹Š¼j¦Ù èv¹1×-hf[+£ E¾TjªûfäÑ}-[á:Íåf•¥¹J‡wMÓzÅÂ¥h,Ё ½24¢ûl`3èHc â»!hÒFgðuÃ(FõÁh„ýˆðèó»ßÔe>z4^ +f¢×^4ŠŜ¿ +|_<Ï­µbÿXªvŠTۗB9F$¦Ó8f„ªðf,¶™hËÂÜàêÖ pÍøÊ, àÕ-HÞ&²€IÌ}YdÓJ܀Êv(nLO<Ý˜  ƒîv¸±È=ÿ +&öYÇ¢ÁêŽEª½1+^ãa¶ÁàK» h{è/”Xû̒{mÖo-C¶¿Œ‡„aðÅÕhH˜&$¡¡Ï?†gv=á«Ùx£½4ä›Ý¾^BS#Þ³ïÊ Èõå›àƒE±åj0â*à:1KM՚ ¦O;hª!&‘Q-y<‹å#´€`0¤ ´cÞ$X1 +ƒ!÷¢¸ç^¿RÇ=hoŒŒÌÆhXžA0ɬ^>%™L“.ïaCØ©£"¨û¸m¾œöwÜïûí£´³çɟ^ö¶Ù™Ø5Zz]Ö6¦Ue‘êüJuÛ¾Ò¼´v“ìe–ÙÂDAö ŠÆ]’¹$æA _ÎD҈t9g*W0]Ñ×Ά}µ=ª¡¿µuËÏ®n~W¦rsiú¶£]ŸÖëÛ ]©Æp4S4U²÷©„R¼5dzG8¼4®•<3iÉDn¤Éè$¼o•˜-fŠ ¬¿"KÊ_œÍ„>„BvœÍüwPßN>棨 |ù™BPÒsÉB§÷ÉtDë>xW݁•(ÖY© +Ÿs¡œ=ŸñOÁ *§ìù‚‹ÁӘ2ÿ†ü^´»z´KWàžV>Y„ +Óf[¶þ”“é+Vç7Ѽ÷¸Ò-`wÂw&øjAòb‹<€\½—Ž¾¯¬ßT£—Ø“Á°3xxТmåIø +ü‹cBI2[U…loÏ&œ' ! ”̐Èöb)ãt¨ŠPÔïü²=—éuëOޝã3ËϪ| é³ã¿.’=È¢èR æ¯4€tpÞòlÕ÷ʓBN€rüèlÌ+ғ”^ÝjÊYtÇû?ºçÐ]%M;®pGá—DµÏQò«må ’`Ÿ\²œšFà/?þËöqiXÀe°“xb‡!“ûxëOc³ž£($T¥]w/t!­MYç"UßÒ(_Jdvf}ë«5@­Û$­Ý1N|7‹lmÌ«L¨qIkòM­)k™ê¦QY²sj¥„Åññ©}ªDý˜TgŠÄ2ï¾AJ÷]r:¢!"AüŠ ÈÕ¥õÊçËÒ¬[ uhŽ—¿7b³³¥åÆ1.+‚;íÇm·!U»ü-šO,-Ãр¼°´|—®_R†W£ôŠðúzM/Äç¼T~ê¾Lº3†>6Ï|ÜÜ8å— ç@"ö\PPÈŽZh·95'åਊt¹žÇñøÏõ*þØ hà(†dØþÐÀcĹ- ï´Á[þªÍSç*¢2ºüµÌ"­óô'ùP'õÁÜ|c†ü”Û]²µï›Ÿ5”­ÂФ®?_q®]/¼KŠ]’™g +€OjIQ[“@'F¸¨“ + Ø_~î|ÁXàOϵ~\h·õzQ?B½KÛ¶úòöv¿ß£uƒv…¬j$Û[öí)+ûId3<‰D X^ê3@Y¨€¯ƒó±ßÀOZ,ô +endstream +endobj +1419 0 obj << +/Type /Page +/Contents 1420 0 R +/Resources 1418 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1314 0 R +/Annots [ 1386 0 R 1387 0 R 1388 0 R 1389 0 R 1390 0 R 1391 0 R 1392 0 R 1426 0 R 1393 0 R 1394 0 R 1395 0 R 1428 0 R 1396 0 R 1397 0 R 1398 0 R 1399 0 R 1400 0 R 1401 0 R 1402 0 R 1403 0 R 1404 0 R 1405 0 R 1406 0 R 1433 0 R 1407 0 R 1408 0 R 1409 0 R 1435 0 R 1410 0 R 1411 0 R 1412 0 R 1413 0 R 1417 0 R ] +>> endobj +1386 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 649.104 276.535 660.008] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag_303533574d5d5d4d8f58e2d8646baa69) >> +>> endobj +1387 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [280.351 649.104 405.202 660.008] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag) >> +>> endobj +1388 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.302 612.844 377.134 623.748] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag_c64c8548738734fedbc94f03519b803a) >> +>> endobj +1389 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [389.146 612.844 513.996 623.748] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag) >> +>> endobj +1390 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.895 600.889 265.437 611.792] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf78df97484e374abe5d4e0f8973a622d) >> +>> endobj +1391 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.028 553.669 411.181 564.573] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag_95c612736a3e7524077dd5c81bf2a105) >> +>> endobj +1392 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [422.919 553.669 513.996 564.573] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag) >> +>> endobj +1426 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 541.714 164.178 552.618] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag) >> +>> endobj +1393 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.476 541.714 339.339 552.618] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gb49861123b31a74dddcdffb4b8fd110a) >> +>> endobj +1394 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.749 494.495 415.46 505.399] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag_d4d88d3daaa672264c63c83071c2021b) >> +>> endobj +1395 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [422.919 494.495 513.996 505.399] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag) >> +>> endobj +1428 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 482.54 164.178 493.444] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag) >> +>> endobj +1396 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.283 482.54 332.146 493.444] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gb49861123b31a74dddcdffb4b8fd110a) >> +>> endobj +1397 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 446.28 283.977 457.184] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag_9fc89d795c20b4270756269edf1b9604) >> +>> endobj +1398 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [287.793 446.28 438.656 457.184] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gb49861123b31a74dddcdffb4b8fd110a) >> +>> endobj +1399 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.663 374.52 334.366 385.423] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag_121252cea61436e0df74e008b80c13b7) >> +>> endobj +1400 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [343.738 374.52 494.601 385.423] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gb49861123b31a74dddcdffb4b8fd110a) >> +>> endobj +1401 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 362.564 208.451 373.468] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1402 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 326.304 285.093 337.208] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag_3094a8093769d647b9f477e14d53a3a0) >> +>> endobj +1403 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.909 326.304 439.772 337.208] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gb49861123b31a74dddcdffb4b8fd110a) >> +>> endobj +1404 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.998 290.044 286.066 300.948] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag_e2c6fa9b0155fd9428ff3abcf1a66805) >> +>> endobj +1405 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [293.774 290.044 444.637 300.948] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gb49861123b31a74dddcdffb4b8fd110a) >> +>> endobj +1406 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [467.73 290.044 513.996 300.948] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__const__iterator__tag) >> +>> endobj +1433 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 278.089 268.754 288.993] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__const__iterator__tag) >> +>> endobj +1407 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.786 241.829 280.253 252.733] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag_3671e52fd03a1c456c630b7c5c632df8) >> +>> endobj +1408 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [289.75 241.829 440.612 252.733] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gb49861123b31a74dddcdffb4b8fd110a) >> +>> endobj +1409 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [467.73 241.829 513.996 252.733] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__const__iterator__tag) >> +>> endobj +1435 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 229.874 268.754 240.778] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__const__iterator__tag) >> +>> endobj +1410 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 193.614 274.573 204.518] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag_68cdbff6e2262bae3295484dbee9ee42) >> +>> endobj +1411 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [278.388 193.614 429.251 204.518] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gb49861123b31a74dddcdffb4b8fd110a) >> +>> endobj +1412 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 110.894 279.544 121.798] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag_4578b5352510727810a7c3be32208aae) >> +>> endobj +1413 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [283.36 110.894 408.21 121.798] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag) >> +>> endobj +1417 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +1421 0 obj << +/D [1419 0 R /XYZ 90 757.935 null] +>> endobj +1422 0 obj << +/D [1419 0 R /XYZ 90 716.221 null] +>> endobj +1423 0 obj << +/D [1419 0 R /XYZ 90 664.032 null] +>> endobj +1424 0 obj << +/D [1419 0 R /XYZ 90 629.794 null] +>> endobj +1425 0 obj << +/D [1419 0 R /XYZ 90 570.62 null] +>> endobj +1427 0 obj << +/D [1419 0 R /XYZ 90 511.446 null] +>> endobj +1429 0 obj << +/D [1419 0 R /XYZ 90 463.23 null] +>> endobj +1430 0 obj << +/D [1419 0 R /XYZ 90 389.447 null] +>> endobj +1431 0 obj << +/D [1419 0 R /XYZ 90 343.255 null] +>> endobj +1432 0 obj << +/D [1419 0 R /XYZ 90 306.995 null] +>> endobj +1434 0 obj << +/D [1419 0 R /XYZ 90 258.779 null] +>> endobj +1436 0 obj << +/D [1419 0 R /XYZ 90 210.564 null] +>> endobj +1437 0 obj << +/D [1419 0 R /XYZ 90 125.822 null] +>> endobj +1418 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F23 144 0 R /F72 202 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1458 0 obj << +/Length 2010 +/Filter /FlateDecode +>> +stream +xÚ½Y[£Æ~÷¯@ÊC°4îé+—œ(R²7M29g³;çi7±Ð¶QÌeÏåߧúŒ=ž'/š¦ºªú«ª¯ÚØY9Øy7ûåfvùÖcNˆBzÎÍÒ ±ã{ Jœ›Äùäúˆ°ù‚`ŒÝ²Üܾ«ÒäöÌe5EuÛD«ù‚ +ì^卬–Q,Íã¹”Õœ®ÌÕ g.ó?o~½¹™}X;D/'|ä3áÄÙìӟØI`üW#νž•9œ2¸nœ³?fتŽû&Ü3yð…Ož0v|¦Ô,ß~ç|Z0*Í;¬Ô©VV¯zB(¼)«?>֍ÌnÓ¼–U3z9^#¾û |p‘# 4ûš»bi®ÍÚBdúØ»9Á®RlN„Ûú`)ú Ò0éƒ.z­•™2ÐIm:m'À¶Sb<Xì¤ÔbF¾Û)ÿi]—Ɠ4“y¹yL­åiWsæ»2ªeraǬñ¹Œe]GÕã\M:zßñƒð\PŒÁê,˜@‚ñÖõ嶹ü߶‹Yéí6Э,2†¸P"QH^%j=…³´¸-+˜9æ)¼=“Ø=Jäé¦yœXÛhy¯Ô¯'pCïpgAñðú&±"J:×MRl› 9Œ‚:üŽcd´Pyo¦QÎ^°£l·£Ëgl)ã¡ÞÒ·W×oŒi´]Šäó.ú>cÌ̬…ݹ©’QvqDSŸ?'€w¨ð‡‰òá%©ïŒ¸%ÉôNÚüR˜èÞ_Ã`1è±3‹@o‘E_’+hÐ"+ªŸ“-¨V¼ŽªIhyýèRÐ:/}×sVy\”±oHB`áÉ`RÌÒ8m +˜d䟁“-ÆY´ÙñBÿF´Õ|æº_ f—Eª8¤•t¿NcU¥×Úg +^³­òVê]MéO=„wõW¹Âªèç·•aŠ0?N}0ò01‹ê8Mo“mVŽûÄ;wUSª<ÀÞŒº2ëñ;’]É0WœŠÕÐðŽ~Þ{ h ŸMSÚ5}T”æR˼‰šŽ-œ"yÐó |wúƒ° !A¡ùgÓaÈQà‹s¤CŸ„Ù¦ˆ’o#OÏ¡M6øŒqyØ?¡t#¸ŒÂ÷‡øºÓω/Õrÿd|-«9n‘M‰*ã{§¡,8Ž²=†IRž³àIصáۈ¿–M”nÚTûZÖq•–Úöý=Á #`fFÎÍ<Àîc);¯Z!Ë®_0Eµ×¥u®)Lµ6I-¢{nێܴô¥9ãJ¶*U…ª?wi"‡¸ÐÅj©ÊX× AѢ½×cU²ëõz°†Ö ÝîÏ.^ÚN´ÇFÆ<ÂGV)µc"<°Þ#o$E¼Í†0í¬oÖ»þqÏcB=ðN»ûË +ð9$Ë*¼6]v›+0ÝȆ‘Í0×ԃ~¢ÔUëv-£œ£š×µ +昪CMf´"CAÀÏw‚t×âl°6PÖa>X¥ìï ¹ßl«!½™‚!?ì"ýÇ Y>4?]Áéû³õå@^ÀtÈü©óv¿ qŁ•3‚‚Ж¡r³ÇààxbPÕä¿EӆÎ:j:TÕm¨Uö&/ìËLf_ZŠØ¹ÉùÚNª¿WŠUÛXmˆ-I?×uºÊUàŒ6Ÿú/ra—\êÈzâÔOÍ~v}nFf ;"…Ï©ÀåêHoã1Ñ£¢×i.£êöÍCYÉZií³eÒF^˜D§jtH9e¾Íž¦:jÖØò6|§˜Isñ´LcÄ«B.Õæ¨d§€—iª“¼¤ÓeÏöj˜§»%XUkô˜Í.ênïhSÏև¡ð:I¸xW¼‡,C`DCÑnèFNWRà¢.Lp€èƺs$‰*Lmƒ8!O Ö#,ÐQ ÷jiÔ6æu¿¯¿ØâÎmö;]í`(2ºÙ4·&˜TÀB3†AåˆÙ,¥¦{0=2ëeRu¨„Ý»úm ô”gïÒzò$9 »:™ä€¾×e^­(Œg©Ö&Ï÷¸0aÇ÷ +£iT΅˜ÒΙic¯zA¿5u“*h©æ|E¨9!žmJfåæ±õSm¶fΡFú>‘‰Õíg£ÊPµ±Ž5%Tù uu }³kDhŠ=Ø5 —€M†µfp½¯Ò¦Ñ^ð +PÀÝ(I,ş:!PüèŽÓ—«ÜÎqhYˆ¯çĵ‡úðÔ?Ôt ÂÕ 7»8W֜j—üº6fV¢öáa<òØá¿&>õýç@¯ŸþÆÈyð Ný?®ýÿÍ s˜¿Eˆ„tŒ¹ïµsªLÇ> endobj +1414 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.144 719.912 357.416 730.816] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag_22e81aa8cd862935e9a0abab515cf838) >> +>> endobj +1415 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.27 719.912 493.12 730.816] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag) >> +>> endobj +1416 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 707.957 241.637 718.861] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf78df97484e374abe5d4e0f8973a622d) >> +>> endobj +1438 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 638.237 291.738 649.141] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag_bc859551651eca1bcc3839f62d45dbfe) >> +>> endobj +1439 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [295.554 638.237 446.416 649.141] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gb49861123b31a74dddcdffb4b8fd110a) >> +>> endobj +1440 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.098 602.719 296.048 613.623] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag_f29295940b1ad0b6b48cc44e92f04060) >> +>> endobj +1441 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [363.133 602.719 513.996 613.623] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gb49861123b31a74dddcdffb4b8fd110a) >> +>> endobj +1442 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.891 555.246 299.822 566.15] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag_d00a2a1877537fa49a41013078ee2bb6) >> +>> endobj +1443 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.559 555.246 503.422 566.15] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gb49861123b31a74dddcdffb4b8fd110a) >> +>> endobj +1444 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.743 507.773 310.762 518.677] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag_a6324c2e330df63ad428eec9182fcc4d) >> +>> endobj +1445 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [319.215 507.773 470.077 518.677] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gb49861123b31a74dddcdffb4b8fd110a) >> +>> endobj +1446 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 460.3 300.585 471.204] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag_af6f8270e3742973e0df7dcc9132f7ae) >> +>> endobj +1447 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.4 460.3 429.251 471.204] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__System__tag) >> +>> endobj +1448 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.175 144.396 245.284 155.3] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__tag_9c2a70f5f90ec3da123f549d6ca9fe4a) >> +>> endobj +1449 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.168 144.396 342.698 155.3] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__tag) >> +>> endobj +1450 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.027 144.396 498.753 155.3] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +1451 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.722 132.441 284.277 143.345] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g5b805182b79b6fb873d0624f7dfd2ee1) >> +>> endobj +1452 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [292.526 132.441 390.019 143.345] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf1c4903edb1a626a36a7220038f963c4) >> +>> endobj +1455 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +1459 0 obj << +/D [1457 0 R /XYZ 90 757.935 null] +>> endobj +1460 0 obj << +/D [1457 0 R /XYZ 90 733.028 null] +>> endobj +1461 0 obj << +/D [1457 0 R /XYZ 90 652.98 null] +>> endobj +1462 0 obj << +/D [1457 0 R /XYZ 90 619.484 null] +>> endobj +1463 0 obj << +/D [1457 0 R /XYZ 90 572.011 null] +>> endobj +1464 0 obj << +/D [1457 0 R /XYZ 90 524.538 null] +>> endobj +1465 0 obj << +/D [1457 0 R /XYZ 90 477.065 null] +>> endobj +1466 0 obj << +/D [1457 0 R /XYZ 90 426.283 null] +>> endobj +388 0 obj << +/D [1457 0 R /XYZ 90 316.026 null] +>> endobj +110 0 obj << +/D [1457 0 R /XYZ 90 308.385 null] +>> endobj +1467 0 obj << +/D [1457 0 R /XYZ 90 210.215 null] +>> endobj +1468 0 obj << +/D [1457 0 R /XYZ 90 159.139 null] +>> endobj +1456 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F72 202 0 R /F65 179 0 R /F23 144 0 R /F11 727 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1504 0 obj << +/Length 2117 +/Filter /FlateDecode +>> +stream +xÚÕZK“ã´Þ÷¯ðî:UµÞ¶a350À04Åb RîXIT8¶¯ítÓüzŽ,ىÓγ“áÞM¢ÈzœÇw>£{s{oo¾¾»¹}#™¡HRéÝͼ{$HPâÝ%Þ'?@„ÆcìE:y[êdòVeªŒë¼œÔñ|4¦ûï²Z•³xªìϏj¦Ê }•™.1Î|.GÜ}wóíÝÍol=Òl'0áM—7ŸþÀ^ýßy±(ô›QKSß©÷ËÍÏ7؉¾ë»QIà • „BÁÌêõ;¥¢§ç} PRgµë6â•s'çÇf€QÍX!S#*üÇmkü­Ê|’èå¤È×Ët«›É¿cw.?hàÞ*·o覯h"<²*aÌÌð-õ9ŠBڎ)æ é-º^< ^Ó$7ÓÆ4À(äÒƒÙ"!ìü×刾ŠkU§Cî× ãòùVg×׶S÷Gq?/õ\göa>Ûzø·¿qáçc0£Ê*gqjV…AW£^lÈIY€"´ +~´C÷Š‚ ±€D …8²ƒ°Ôӗ#"ˆ7Þ…FcNˆÿ[©¶Ì­,‹8KR'ô,/í³N @tØsð§Ù ìÉÁ[{b°§Ûc>"Ø7Þ6SŒÇmü4ö3ßIb ^UVd)6D@1¼áÚ­`/P· + ù}íÿl@ÌlÁ@p‚¢–Î + D°'lfe¾ÜêÛÞ¬pÙØa‡ `"Ü!l‚±ÎÌ_š’þ£ )³AlWoCÊ´gk©\ ©ôÉ Õ±P«Õ!ýâÚz„HŒh(ûA¸?ʨ ~­(“ Q ð—xÀ¸ªô<;#ÆÌ/Œ1·JRÕ{"Eñ,RBÄexz˜Tåô%òUcªÊQ­ý²x7­æx„MP6 kZÏ@6ŒBÕ±3ˆ:œ‚£#˜:X'B”t§Xvh‰?“ä#X“ à¯Í•ªZÀÚq¹EÈEù’R$BހÁ»lıÿ§:qyͦ×1=wLYò:êç_ 9†!Á¢Î½ í_Æ6r?«•¥Ÿ­§yéh©È³Dg.Õv}¹4myÔij[ W>¨¬^ÅiêÀ|¯6'§*®T²)köêƒ1a ”qÐß!æÍ*›Ö¬uÆk˜orûýcî:~È={ÚÒômYÈÙNèâ†21âp‚ŸYÈ!Nk2ÍI—€n/kf] +»f­}Yǁ ªV˜IýT¨}y͓“Û,  ‘ˆöã§KK‡( v¶ˆSŸ­Y°E…Íø›æÚ-5Ä£aø£3‘iÒ†¤Émdl»õ$?ªzUfÛä؈Ý;-O<$)GìZ.£ˆÑKœl@áC.›æjfê/:ÕêyÁ/Xx1ÿö…„BõQ8‰ŒÌqiŽ¼ë ˆYüõ¶ÆÃ8Ë^’“½Î ݒ xeˆN8ƒ¢ªCM¶ƒOè3>iÖ’­ÃzÈ}ˆKßõ8A·# <˜Êéìœp€b ¯DaÔP´¯Fa‰6ØxÐÕgH÷^–îÒ`̇ΡtŸ {àÔýꣽD3°,ûOb œ%$×í“ÍòE×U{TZì>Ž‰žø”љ0Ò „^f?}ÿÿrN +ë;(ËóJ×úAÙNPZöµ„PÚ!zðrÀ +?&Éú`þ£²¥@s9¹TÉ+óCú5•jÎÜÖµUŵ®L´Xúå~lW-¶ ±,Rµ4ÌI€Â\:f4²ðgVW_šÎÀUÖöêC) y`ïê;(gŽ% U.âbG™”/“g¹®\sØp4@DF'Gá½½|¶»fh4fÐøµR³•+­fm`%ê~D±¿jœ8ïj³bU‚³UufienÜCÚ/­ÞeŪ¾ýiU×Ýd]l}†©BOŠF~æÂþ¯—Äâ#ðà•$²‹«¿fïeª:ÉWCW3Œ"z.•F”]IÁ‡³SœøæÝûo­N½“q~ÒßNU]ªxyÄ©}d@%`Óªkacë–ˆ¾-SmÐäyôsaðèáFO\Ÿé¢M”·àC‘àd>; dZlÃJÅ¿ …’]@q{æ¥i>7Ÿöÿæè«KsÆS³=ËÕ:Ù³7 =5ýÕæ՟9ÛUt<$?•G=»è@Í;çA“aŠ0¿^†WS­'ÉjY\ýtrÞØA” 2AäéDyüôA¡úÈü4oˊ¬-À$›0(Ü-2är]"·ã^€Ÿ•‡Ýtž -b.Ãë2^d®ŵq•æqr…W;ŽC h‹Sþµ>Q#fþÜDÔ{Ðù’ˆ2/ä¬_Ù8ˆ¨™M˗CK…(X_ú^WÛï'IX†„ǾžÔ¾~$Q°Ð½Qç‡Ün~×$ +Œùšz¾\*gÔÿ§O •”±}ú^ߗqùd¼¶CÞÇÙ|ÏÝ|ûʕ9ì59tA©Rþgdj9;á‡8[5ïÏÀ3ƒÏ³¥*ÝE:tbÅ5à0Åæþ/ª½4´øÓk[ßß4¦_ëeÞgY¿}²¨ëâ‹ÛÛÇÇG4­Ð*ÓE‰t} ¸¿}^¦¬!J¨óŒ­¯@°e^*«ƒÎLÛ@ªï7ðÓ?(/™I +endstream +endobj +1503 0 obj << +/Type /Page +/Contents 1504 0 R +/Resources 1502 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1314 0 R +/Annots [ 1453 0 R 1454 0 R 1469 0 R 1470 0 R 1471 0 R 1508 0 R 1472 0 R 1473 0 R 1474 0 R 1510 0 R 1475 0 R 1476 0 R 1477 0 R 1478 0 R 1479 0 R 1480 0 R 1481 0 R 1482 0 R 1483 0 R 1484 0 R 1485 0 R 1486 0 R 1487 0 R 1488 0 R 1489 0 R 1490 0 R 1491 0 R 1492 0 R 1493 0 R 1494 0 R 1495 0 R 1496 0 R 1497 0 R 1498 0 R 1499 0 R 1500 0 R 1501 0 R ] +>> endobj +1453 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 708.95 310.289 719.854] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__tag_6cb7351e1bb87181f7e6c946db398b5b) >> +>> endobj +1454 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [314.104 708.95 404.634 719.854] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__tag) >> +>> endobj +1469 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.77 663.115 338.282 674.019] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__tag_cc700387404f10208584c1a847a6f328) >> +>> endobj +1470 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.762 663.115 436.292 674.019] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__tag) >> +>> endobj +1471 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 663.115 513.996 674.019] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf78df97484e374abe5d4e0f8973a622d) >> +>> endobj +1508 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 651.16 197.911 662.064] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf78df97484e374abe5d4e0f8973a622d) >> +>> endobj +1472 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [140.537 605.325 345.607 616.229] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__tag_2a64fe7b9774c990bd9db8aecd2dacea) >> +>> endobj +1473 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.854 605.325 442.384 616.229] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__tag) >> +>> endobj +1474 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 605.325 513.996 616.229] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf78df97484e374abe5d4e0f8973a622d) >> +>> endobj +1510 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 593.744 197.911 604.274] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf78df97484e374abe5d4e0f8973a622d) >> +>> endobj +1475 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 558.494 249.656 569.398] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__tag_9b452ce4baaf1c1644a6eb33658ae48a) >> +>> endobj +1476 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.472 558.494 370.014 569.398] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf78df97484e374abe5d4e0f8973a622d) >> +>> endobj +1477 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.361 490.54 295.743 501.444] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__tag_85958538f17770d4ae66bcd179d747a1) >> +>> endobj +1478 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [300.813 490.54 417.355 501.444] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf78df97484e374abe5d4e0f8973a622d) >> +>> endobj +1479 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [430.64 490.54 513.996 501.444] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1480 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 443.709 243.021 454.613] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__tag_dfc86b3b2966514ba2e2292584f68c08) >> +>> endobj +1481 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [246.837 443.709 363.379 454.613] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf78df97484e374abe5d4e0f8973a622d) >> +>> endobj +1482 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [140.981 408.833 270.544 419.737] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__tag_99aac01eb1b8adc3667bbd3db68e8d34) >> +>> endobj +1483 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.235 408.833 393.777 419.737] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf78df97484e374abe5d4e0f8973a622d) >> +>> endobj +1484 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [410.708 408.833 494.065 419.737] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1485 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 396.878 196.576 407.782] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +1486 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 362.002 253.293 372.906] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__tag_8b96d560404b7b7ee0ec7ea1aef80280) >> +>> endobj +1487 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.108 362.002 373.65 372.906] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf78df97484e374abe5d4e0f8973a622d) >> +>> endobj +1488 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [384.111 362.002 455.592 372.906] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +1489 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 327.126 240.252 338.03] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__tag_a8e9420c29d8c75e775c4fd609830769) >> +>> endobj +1490 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [244.068 327.126 360.609 338.03] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf78df97484e374abe5d4e0f8973a622d) >> +>> endobj +1491 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 248.213 257.417 259.117] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__tag_fb6f23292760d6d55c57b5722f604897) >> +>> endobj +1492 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [261.233 248.213 377.775 259.117] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf78df97484e374abe5d4e0f8973a622d) >> +>> endobj +1493 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 213.337 260.735 224.241] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__tag_0ca9a6d6894e381babab8f958c194f07) >> +>> endobj +1494 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [324.595 213.337 441.137 224.241] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf78df97484e374abe5d4e0f8973a622d) >> +>> endobj +1495 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 178.461 265.716 189.365] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__tag_3fc151fc10282a5ede395e9b8a5502e2) >> +>> endobj +1496 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [319.056 178.461 435.597 189.365] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf78df97484e374abe5d4e0f8973a622d) >> +>> endobj +1497 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 143.585 271.803 154.489] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__tag_c5a83c9e42e34b313e12a6cef4470a75) >> +>> endobj +1498 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [275.619 143.585 392.161 154.489] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf78df97484e374abe5d4e0f8973a622d) >> +>> endobj +1499 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 108.709 266.264 119.613] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__tag_190a7c46776178432e89c9525db039ab) >> +>> endobj +1500 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.079 108.709 360.609 119.613] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Grid__Generator__tag) >> +>> endobj +1501 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +1505 0 obj << +/D [1503 0 R /XYZ 90 757.935 null] +>> endobj +1506 0 obj << +/D [1503 0 R /XYZ 90 725.554 null] +>> endobj +1507 0 obj << +/D [1503 0 R /XYZ 90 679.72 null] +>> endobj +1509 0 obj << +/D [1503 0 R /XYZ 90 621.93 null] +>> endobj +1511 0 obj << +/D [1503 0 R /XYZ 90 575.098 null] +>> endobj +1512 0 obj << +/D [1503 0 R /XYZ 90 505.122 null] +>> endobj +1513 0 obj << +/D [1503 0 R /XYZ 90 460.313 null] +>> endobj +1514 0 obj << +/D [1503 0 R /XYZ 90 425.437 null] +>> endobj +1515 0 obj << +/D [1503 0 R /XYZ 90 378.606 null] +>> endobj +1516 0 obj << +/D [1503 0 R /XYZ 90 343.73 null] +>> endobj +1517 0 obj << +/D [1503 0 R /XYZ 90 262.795 null] +>> endobj +1518 0 obj << +/D [1503 0 R /XYZ 90 229.941 null] +>> endobj +1519 0 obj << +/D [1503 0 R /XYZ 90 195.065 null] +>> endobj +1520 0 obj << +/D [1503 0 R /XYZ 90 160.19 null] +>> endobj +1521 0 obj << +/D [1503 0 R /XYZ 90 125.314 null] +>> endobj +1502 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F23 144 0 R /F72 202 0 R /F87 1306 0 R /F34 1307 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1548 0 obj << +/Length 1771 +/Filter /FlateDecode +>> +stream +xÚíYIÛ6¾ûWè¡6Ps¸KLŠ͊¤i‘&ÓSŠ¥±…Ê’+Ëq§¿¾›6kfœŽç”žD‘Ôã[¾ï‘ÂÁ*ÀÁËɓËÉÅ É…”¤2¸¼ +BI $¸L‚Ó>›Œñt»Ío²"«Åó¿·ÕŒDÓt·ËÊbQǫٜ +<}UÔiu/Sûú.½Jí¼Bw‘ˆòhÊÃÙ§Ëד痓¿&´À1«Š…LËÍäÃ'$Ðÿ:Àˆ©(8˜Y›€SÏqzҙ) +Õ?ŽÈ‚€7ëº×»¶'/bHFÒOÿ©q~;cN¸@”øEÄÇó]š·XyÑxáNG~ÄÿV֞Bë¸n@¶ó”«\£(Ýà&Ý|N«Çˆ"=HùçÀ˜ ™ƒ£óðSPWû¥fþVðÏžU¡y4ˆ1ltnjoµ°Or‹hIt;恉®[oßÕÊíãï̳ AԊÔ0­ k  ¡DKCo9d‡gÆÀÚõå5(’³‘Èr¤"Ò-Oo‰ìŠ|'¹¥šº,†wd~ZÍX8MSšJ +ܯdZöl_Ã*¥YE±f•ùÌ:Æô/ËÊõmË"±ȁÍÚ ÛÍÌÌÄ&Ø0ŒmgVtÇÓt\LËy’.ôqnçﶰ“<žÍl ‡*ëhís†ÍËa~ PÊÓ£Ù£¼±ðhß±PÓ4IüX³ ´^&!A‘”ø4 ª3IB~W½ds½ðHÇHr©Ã ç÷€™h3\«¬§œnÊ5Ö®§C9£V—rSm®ÄpîŽhŸZ÷Kz¡#ÉÃå<éHU÷&`'‘B:Z€=ç(œbÏX”JBÆ9Gés®1tœr«³PNÓÃ>ÊA7J9˜3F9è6”ƒçJßoß· XåfËºÕ ¬ãa˺V߆uж¬Å-ë §Ë:­xu­µŽu ü²Žqvbª[U{y×+1ùCœ©@˜Ó3–˜RŽÐŽ8úˆ£Tç,}ÀTG¥É´jJ.9žêtÿØ% |j.YÌp78G„Óz;Ò\[ÎëÒ2ló\GÓ¦´”.Ïé†--a´[ZÊAžÓ}Æ)düþ Nb~Ršk~^Œå:‰ÅC\À„(TâÒÑsœë8bXëú֞šð†¿åà`¢/ƒOü+gþƁi©Žý'40{ÿºàlúÖä³j£yÀèôm™_¯Ó¤Šíè›ìsW×ö婝ò&.Vûxå¾5ø]ìÒê{ýfg?ø5.öæ²Æt`¿è%ÓÊÑ:1àQí¤ëF>}Ÿú­ØzàÏÀ·~™r´vQ¡6å®ëzûèââp8 åí‹l[¡¬¾€@]_¸·BìgB5ô±(¶)Íÿ°!+ scþŠ¡aœþžö— +endstream +endobj +1547 0 obj << +/Type /Page +/Contents 1548 0 R +/Resources 1546 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1565 0 R +/Annots [ 1522 0 R 1523 0 R 1524 0 R 1525 0 R 1526 0 R 1554 0 R 1527 0 R 1528 0 R 1529 0 R 1556 0 R 1530 0 R 1531 0 R 1532 0 R 1558 0 R 1533 0 R 1534 0 R 1535 0 R 1560 0 R 1536 0 R 1537 0 R 1538 0 R 1562 0 R 1539 0 R 1540 0 R 1541 0 R 1564 0 R 1545 0 R ] +>> endobj +1522 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 454.503 254.399 465.407] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag_a891671c2b9414353067da44a108ac1d) >> +>> endobj +1523 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [258.214 454.503 360.928 465.407] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag) >> +>> endobj +1524 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.099 406.682 332.581 417.586] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag_512810c3e349a2f01217c6e426645260) >> +>> endobj +1525 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.39 406.682 448.104 417.586] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag) >> +>> endobj +1526 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 406.682 513.996 417.586] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1554 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 394.727 190.738 405.631] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1527 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.77 346.907 359.65 357.811] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag_fc650c1c744fbfc4dbd15293b9827776) >> +>> endobj +1528 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [364.13 346.907 466.843 357.811] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag) >> +>> endobj +1529 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 346.907 513.996 357.811] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +1556 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 334.951 236.107 345.855] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +1530 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [140.589 287.131 327.725 298.035] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag_7d65378709f5a0c73e711f5528385990) >> +>> endobj +1531 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [334.024 287.131 436.738 298.035] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag) >> +>> endobj +1532 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 287.131 513.996 298.035] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3) >> +>> endobj +1558 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 275.549 176.352 286.08] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3) >> +>> endobj +1533 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [140.985 227.355 326.438 238.259] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag_9ab7b109b1acae567c915b1db83b5283) >> +>> endobj +1534 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [333.133 227.355 435.847 238.259] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag) >> +>> endobj +1535 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 227.355 513.996 238.259] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +1560 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 215.4 174.668 226.304] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +1536 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.03 167.579 332.792 178.483] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag_1c54d4109f395752ea23822cee000d04) >> +>> endobj +1537 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [337.532 167.579 440.246 178.483] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag) >> +>> endobj +1538 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 167.579 513.996 178.483] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g3b2653e715f41511257a84f35be7fba9) >> +>> endobj +1562 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 155.624 182.977 166.528] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g3b2653e715f41511257a84f35be7fba9) >> +>> endobj +1539 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.637 107.803 350.332 118.707] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag_f99b9dc1c16751ce872dab5245c22fdf) >> +>> endobj +1540 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.679 107.803 460.393 118.707] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag) >> +>> endobj +1541 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 107.803 513.996 118.707] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf78df97484e374abe5d4e0f8973a622d) >> +>> endobj +1564 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 95.848 223.923 106.752] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf78df97484e374abe5d4e0f8973a622d) >> +>> endobj +1545 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +1549 0 obj << +/D [1547 0 R /XYZ 90 757.935 null] +>> endobj +1550 0 obj << +/D [1547 0 R /XYZ 90 733.028 null] +>> endobj +389 0 obj << +/D [1547 0 R /XYZ 90 627.746 null] +>> endobj +114 0 obj << +/D [1547 0 R /XYZ 90 621.146 null] +>> endobj +1551 0 obj << +/D [1547 0 R /XYZ 90 522.673 null] +>> endobj +1552 0 obj << +/D [1547 0 R /XYZ 90 469.582 null] +>> endobj +1553 0 obj << +/D [1547 0 R /XYZ 90 423.783 null] +>> endobj +1555 0 obj << +/D [1547 0 R /XYZ 90 364.007 null] +>> endobj +1557 0 obj << +/D [1547 0 R /XYZ 90 304.232 null] +>> endobj +1559 0 obj << +/D [1547 0 R /XYZ 90 244.456 null] +>> endobj +1561 0 obj << +/D [1547 0 R /XYZ 90 184.68 null] +>> endobj +1563 0 obj << +/D [1547 0 R /XYZ 90 124.904 null] +>> endobj +1546 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F72 202 0 R /F65 179 0 R /F11 727 0 R /F23 144 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1601 0 obj << +/Length 1960 +/Filter /FlateDecode +>> +stream +xÚÕZK“㶾ëWðª²Â ‚ÎÉÞxS¶wgwR9캦8"¤a™…¤FÖ¿OãAJ”(J3’Í‰$6Ð读¿ˆ½¥‡½¿M¾»ŸÜ½¡HPáÝ/¼{¡ ˆSâÝ'Þg?D„Mgcì¯VÙÃû´Pqõðýo«jJ¤¯ê:-‹‡&^Ng”cÿ‡¢QÕ"ž+ûøQ-”íWè&")“>“Ó_îœ|?ùτÀ,°G̨ùü öhÿÑÃ(ˆ¤·1½rÑ®™÷iòÏ v^F!õ$h$˜Öˆ0Œ(܆4@Xp«Öwë4Kêé,ďõ…ú™QÍ6©)žÖ1Ž¶Ï¼¬ Më½*‹$-–¶¹)ígË*MlËrJ0h­µç~ܔ•Ö–šïMŒR‚Ñ*™)-m—ÞÜ9 +dûþ/Ó#¡¿©ÒFõgþI¦lÓ¢¬Üœž\K¡ô6ÙÖ>έRq£= 7£T ( +<02ŠxdkC[qh1t{ܸk’´ï´$˜¢PÐV‹LôXO"fmdðqÊÀwï8ÞÃëŒ0@+ ´(!FÄJyOŠ÷yÆÂiѸfºjéà÷Ñt ŒŒÇ ãŒYì£Ý!}Q•ùqóáPZÒÌñɱ}©õ£cAÌOêæÍؤ…63Ɣˆ kBÀ’é󲨛‹ÆSÖÕæM päVˆ„5Š˜´c} ¢—Eí`a/órµµwåÂ^ 2õ͐ ` l-¢(0Û!,IpÒö×<–!J:¿‚õ=È z$)–‡7$·a7Q™jÔÀƒþç÷"HdêRD€¶‚‡ˆÐjýC1eØŽ³4‰MØêÀ®cIðéP´«Ÿ©o†í‘ÎBÍSê¤çñ¯&øºÇzm1u0´äá~$×Í®­´Í[!›4ËZœB0}VE³Ž³ÌûQ휩¸VÉ8bv+ØK¾°tq)¼Y¢Öß­‹yæ鯍»-íõï¥køP&éb{ èû='ë§íÞ 0 6d „È+L Fœvõ +xÂC’檂²ùò†X6ò25J(°ñXÚMö¡Ù®ÔÁúÑ}K +Ðº ôãÀ"¸·È E²KŒù¥n6㐯y?ðþۑcù¡ˆ0$Ãn¨o +‘ » Ù‚ÇØÈÞî Õó·Õ9aÏm‡¼£¿2®Á…7ˆ«¤'P9/ÕbJuúÆtžªâG[n K=“QT2bA9‚½!¨>k%Àï!ú¾9Ÿ_Þj=œ ŠkÈÁÛr•¶ã ¡”(`!.NÀ”ÁÔ âÚÎh=ÂñWiü8˜h"ˆsa7"t‚×#Œ`†(–g˜¼ÇÀöGïÒ y !½$Ù §þ½/èª"z¿*‚G)àZ«Æͱ´Ÿ<*·ÙÊ"ÄÀ›zq®sË<þ-Í×y»«Ðl”*†wGöŒq iý³Ij7p™%§ ¾i:dz[iœ =z$þV{°z£!Bhϋÿ74<çÞ$d—“Îò/"ŸWlïJŽø9Rs (Œ0ù5u‘ö `8 òü>­–ppjAã2 +¿‚‚}|^‰’è¹Í@xþ ൧RPP±èÄlõú±©âyóêC)-è&˜Ó‚Æ0·1áNý^Zh]‰³Oz±ÌÑë¼¹pº6‰v›£— na+…|0È¡pÁnøD¤D’Ë I›óuÖ¤«l;`»Çí1k=G‹¹ î˜<³ÄÝî©D,þ¸DüÁ­ÙÕØÃââÜYe{ÛA9P^‹1°ÿ«Á8âÿÜÒԃþ¸a~ÐÈ +…0¢ý儃–ÜaÕÒì ð6\åz§$ þÏe¶}RIÛ·ïÓÇ*®¶öá­íò>.–ëxé¾·?£hÂb9-4A±^ýiʹ_Û>ÄÅ:Îì;Ñg=¤ª¡‡F NQ]îcæRmñgWàW¯½ûibÖ|§eí6žšfõÍÝÝf³Aó­‹tU¡´¹¼Þ×Ü;!ê€u±Àî0ÀÄò²RV‡´Ð9fÓ¥o7°Ó$[) +endstream +endobj +1600 0 obj << +/Type /Page +/Contents 1601 0 R +/Resources 1599 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1565 0 R +/Annots [ 1542 0 R 1543 0 R 1544 0 R 1604 0 R 1566 0 R 1567 0 R 1568 0 R 1569 0 R 1570 0 R 1607 0 R 1571 0 R 1572 0 R 1573 0 R 1574 0 R 1575 0 R 1576 0 R 1577 0 R 1610 0 R 1578 0 R 1579 0 R 1580 0 R 1581 0 R 1582 0 R 1583 0 R 1584 0 R 1585 0 R 1586 0 R 1614 0 R 1587 0 R 1588 0 R 1589 0 R 1616 0 R 1590 0 R 1591 0 R 1592 0 R 1593 0 R 1594 0 R 1595 0 R 1619 0 R 1598 0 R ] +>> endobj +1542 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.052 686.039 367.489 696.943] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag_bbbdd7f3c4800ef97b642142cd68648d) >> +>> endobj +1543 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [371.251 686.039 473.965 696.943] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag) >> +>> endobj +1544 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 686.039 513.996 696.943] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +1604 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 674.084 236.107 684.988] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +1566 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 637.222 261.841 648.126] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag_f232ff2f43109950ac1b0f5d124cf4cc) >> +>> endobj +1567 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [265.656 637.222 394.382 648.126] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +1568 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.303 563.807 315.869 574.711] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag_643dad56c4e24b32e2c4951aee7a6822) >> +>> endobj +1569 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.881 563.807 457.607 574.711] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +1570 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 563.807 513.996 574.711] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1607 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 551.852 190.738 562.756] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1571 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.417 514.99 281.164 525.894] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag_86c148ed14d1a2781e07bea5be7fb434) >> +>> endobj +1572 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [286.291 514.99 415.017 525.894] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +1573 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [430.64 514.99 513.996 525.894] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1574 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.151 503.035 213.632 513.939] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +1575 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.135 466.173 329.415 477.077] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag_e7af7908bffe9b331262dcf8fd020b7f) >> +>> endobj +1576 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [338.259 466.173 466.985 477.077] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +1577 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 466.173 513.996 477.077] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +1610 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 454.592 178.862 465.122] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +1578 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 417.356 252.436 428.26] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag_e861c5919e346c3966c43edc4cd47276) >> +>> endobj +1579 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.252 417.356 384.978 428.26] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +1580 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.97 332.982 311.817 343.886] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag_225478fba412d40b785e2b41809cc90d) >> +>> endobj +1581 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [315.497 332.982 418.211 343.886] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag) >> +>> endobj +1582 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [430.64 332.982 513.996 343.886] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1583 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.151 321.027 239.644 331.931] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf1c4903edb1a626a36a7220038f963c4) >> +>> endobj +1584 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.051 273.206 336.188 284.11] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag_84c2e36e2ae01775ce542ebc83739726) >> +>> endobj +1585 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [342.948 273.206 445.662 284.11] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag) >> +>> endobj +1586 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 273.206 513.996 284.11] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf1c4903edb1a626a36a7220038f963c4) >> +>> endobj +1614 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 261.625 178.862 272.155] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf1c4903edb1a626a36a7220038f963c4) >> +>> endobj +1587 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.266 224.39 350.567 235.293] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag_bfe9ef58fb96938e1c26b63e2b4ce0d1) >> +>> endobj +1588 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [359.543 224.39 462.257 235.293] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag) >> +>> endobj +1589 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 224.39 513.996 235.293] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +1616 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 212.434 236.107 223.338] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +1590 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.666 175.573 379.739 186.477] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag_3530a20e5985d6da8acabad37bfe0e93) >> +>> endobj +1591 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [389.115 175.573 491.828 186.477] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag) >> +>> endobj +1592 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 163.617 253.821 174.521] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +1593 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [140.455 126.756 338.122 137.66] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag_8172cf537ccecb7826eb21837b8d7e7b) >> +>> endobj +1594 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [344.288 126.756 447.001 137.66] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag) >> +>> endobj +1595 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 126.756 513.996 137.66] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf1c4903edb1a626a36a7220038f963c4) >> +>> endobj +1619 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 115.174 178.862 125.704] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf1c4903edb1a626a36a7220038f963c4) >> +>> endobj +1598 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +1602 0 obj << +/D [1600 0 R /XYZ 90 757.935 null] +>> endobj +1603 0 obj << +/D [1600 0 R /XYZ 90 703.14 null] +>> endobj +1605 0 obj << +/D [1600 0 R /XYZ 90 654.323 null] +>> endobj +1606 0 obj << +/D [1600 0 R /XYZ 90 578.886 null] +>> endobj +1608 0 obj << +/D [1600 0 R /XYZ 90 532.091 null] +>> endobj +1609 0 obj << +/D [1600 0 R /XYZ 90 483.274 null] +>> endobj +1611 0 obj << +/D [1600 0 R /XYZ 90 434.457 null] +>> endobj +1612 0 obj << +/D [1600 0 R /XYZ 90 348.061 null] +>> endobj +1613 0 obj << +/D [1600 0 R /XYZ 90 290.307 null] +>> endobj +1615 0 obj << +/D [1600 0 R /XYZ 90 241.49 null] +>> endobj +1617 0 obj << +/D [1600 0 R /XYZ 90 192.673 null] +>> endobj +1618 0 obj << +/D [1600 0 R /XYZ 90 143.856 null] +>> endobj +1599 0 obj << +/Font << /F63 177 0 R /F72 202 0 R /F65 179 0 R /F50 143 0 R /F23 144 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1637 0 obj << +/Length 1492 +/Filter /FlateDecode +>> +stream +xÚÕXÛnÛF}×WéC) Zí…ËKPˆc¹P*Ûª-E“€ ¥•D”…_úõå.)Q–;ÜæE¤–ÃáÌÙ³gf ¿uŽ&þ‰Í y6µÉÜð°áØqJŒÉÌød:ˆðn`ŒÍÕ*òO‡cœu‰k¦×‘ˆý"Xt{”cs˜"›S¡þ^ˆ¹¨ÌDR a9hyÝ/“Á¤óµCàûØ Õ÷¸ƒƍiÜùô3ÿh`Ä<׸­¬bâ ®‘qÙù£ƒuìÛׇ¹l!â0á a›«„†Éª,úçeëI™L‹0Mò*ºÚ]ÿ„ãM_ YÜèQ‚lK{úL)o½b|êqÀ)L +=,Ì:ӋÊ@~P¦þ*K&"ÈüÁÝ*yal»”o|Æ?ê³ò7…øw8ó‹]îîÀi=XgíPŬmKfM)¤KŒdïԎeØV7ß4´á+³;eÑrç ›ÒÚ Hwøð%Nm‘³´,vøaQÇ«ÍÐÎL™ÇžÇ‘lêAjcû™Éù §òd8¨´h‹¯.C6«ÓúŒ1SF­,ä¹dP&‚øí·ƒ< =zÄ4ƒñ£Š¦XjMY„7"Q·©Z¾¿a˜Ó†gÏ"r¶öÌ  !…¦Ë ÛI! 9”orèÉ;¶Ôê?d‘C¶L£@]⠊Òi¯ú +1S£˜,º›o[Ö«4”uMQ{º]†Ó.áæRý suͺÌ1EQfIíõ& vÅOm„½ô;r ²A–p'<ȧaèÏÊxõÕJÏÉ#ªÉC®Ë_.›Ïæ'#6üÚü<†äõÌZ•*T6É°R—\$E ; -^ó¬ 0áBý­›”2l;!ˆb÷°êçYÈuø+°+JƒÙ÷±kO¼‚eÜz¯èwòŠ‚XێÕæÕÒÞ'¯ÐÆržÍ«yÖµ¸™Æ»\¹Èqìç±Ë}š][zOj"wm£gÀ“7[z½ù8EFµ²‹|š…«"¬—AkN08´³<ågÒu±y¿ ªÚɼéûÕßTë|TÑGÝ )ô ò*é_¢J-í¿nPŠ½|DWž,•£7áL´ÉP¤¹,UÍf +åæm5–ÍòfNֈP¶XkýÛX ŠHùn ›»5• †«z,…ßÂ`–N˸ÍË&çbY×ÊI¨ðõó…HD¶.Ïó Ùnç)Tð*mY¸µ0`‰wí¥Òm1Á!è§Õª*LþR3¨øœ›h©“Âêq¨ÇªçUÛ{Ü%ïÈFC&‡¢oµª[ßØ$óOa2Ê™Ž† K*å5 û—¾€dVSW6ᬡlù“»·aׯ ؛ÕƒÓ½6ˆ +!zþ.D´¦Fkóþ4|²pœ¥E½h–AÑp*¯Y¦o’T?ŒE|]7€ Îè ‰oŸ@¨Å>}¢ry_§´•Ï² +t§û‡ãñÈ?O†§Ã¿Þw !ædx~柞üÓ÷¶‡¿Ñ<~T —Ň´V/¨Míõû&îÂ8ü§Ò‰7Ú½ÒèK ƒ/ëQêPª…¯áÙ+â&? ^•þ]t-lž§þå¤ë1Sãtué_ Þ_Tßu(ÄÊd.‚<å{ ‡U#%ñM½ÿ Š2ÿߣvt~uv<8>,h×i™ÌjyýÑ1Ó+÷̶O¢mÀ¸Ï=ˆ®œ!?y4êðœ{ˆóVcȘ9–k2ÈbyªÀ¨9N£û¥˜ez: +¯³ »W>(“Q,Ê`¡ßnµK0t•‹ìgÙ¥äê…Ó )ƒH=“…îF~Rdº¡„A Ý +¢²p¡na˼Bƒ¢øÛ¨ï~ïTu}µ\„›]β(VïúýÛÛ[4ÍQ™„« …Eê}ÿa[;!P ¹×´ªKÀâ´*ºC˜À`\ÉY›V0Oÿ)"< +endstream +endobj +1636 0 obj << +/Type /Page +/Contents 1637 0 R +/Resources 1635 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1565 0 R +/Annots [ 1596 0 R 1597 0 R 1620 0 R 1621 0 R 1622 0 R 1623 0 R 1624 0 R 1625 0 R 1626 0 R 1627 0 R 1628 0 R 1629 0 R 1630 0 R 1631 0 R 1632 0 R 1634 0 R ] +>> endobj +1596 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 698.267 269.601 709.171] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag_690fbcd5ef7202e646b30d92bdadcc29) >> +>> endobj +1597 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [273.417 698.267 402.143 709.171] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +1620 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 661.769 272.919 672.673] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag_46773b226d490e5bbf6f3d587cf29dc4) >> +>> endobj +1621 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [336.779 661.769 465.505 672.673] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +1622 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 625.271 277.9 636.175] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag_50bcfefbf053e770951fa02c2e2eb112) >> +>> endobj +1623 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [331.24 625.271 459.966 636.175] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +1624 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 588.773 283.987 599.677] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag_c21bf6dd42b915ff6f157fb73fe396e0) >> +>> endobj +1625 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [287.803 588.773 416.529 599.677] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +1626 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 552.275 278.448 563.179] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag_f78187771d58e90c174eeba577a471d5) >> +>> endobj +1627 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [282.264 552.275 384.978 563.179] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Linear__Expression__tag) >> +>> endobj +1628 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 233.256 346.513 243.184] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_df86eb3611cbe63b34ef195bc87a7312) >> +>> endobj +1629 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 196.759 342.637 206.686] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_32423400858178cc05f325962afd44e2) >> +>> endobj +1630 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 160.261 338.045 170.188] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_8efd1f7de8fb2bbe6e33aff1d4184078) >> +>> endobj +1631 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 123.763 340.247 133.69] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_8ca7076566ebe098ff3bc307b4d91899) >> +>> endobj +1632 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 87.265 330.842 97.192] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_8f2ab3d77bca7257df14bda9261a1326) >> +>> endobj +1634 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +1638 0 obj << +/D [1636 0 R /XYZ 90 757.935 null] +>> endobj +1639 0 obj << +/D [1636 0 R /XYZ 90 713.255 null] +>> endobj +1640 0 obj << +/D [1636 0 R /XYZ 90 678.779 null] +>> endobj +1641 0 obj << +/D [1636 0 R /XYZ 90 642.281 null] +>> endobj +1642 0 obj << +/D [1636 0 R /XYZ 90 605.783 null] +>> endobj +1643 0 obj << +/D [1636 0 R /XYZ 90 569.285 null] +>> endobj +1644 0 obj << +/D [1636 0 R /XYZ 90 517.303 null] +>> endobj +390 0 obj << +/D [1636 0 R /XYZ 90 405.087 null] +>> endobj +118 0 obj << +/D [1636 0 R /XYZ 90 398.204 null] +>> endobj +1645 0 obj << +/D [1636 0 R /XYZ 90 299.814 null] +>> endobj +1646 0 obj << +/D [1636 0 R /XYZ 90 247.268 null] +>> endobj +1647 0 obj << +/D [1636 0 R /XYZ 90 212.792 null] +>> endobj +1648 0 obj << +/D [1636 0 R /XYZ 90 176.294 null] +>> endobj +1649 0 obj << +/D [1636 0 R /XYZ 90 139.796 null] +>> endobj +1650 0 obj << +/D [1636 0 R /XYZ 90 103.298 null] +>> endobj +1635 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F72 202 0 R /F65 179 0 R /F23 144 0 R /F11 727 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1685 0 obj << +/Length 2045 +/Filter /FlateDecode +>> +stream +xÚÅZmsÚ¸þίðô˚™¢H–ä—½ŸÚ”v²MšÜ„Ý™¶Ã8X€oíµM²Ù_^l0¸í~’-K:çÛ"¼? c;ϓñÕÅÍø¦èßÎî±Wá¬?p8¶/ÒJÓp"ô뭘 +5L¤ª ËNŽû_G¿õ†£Þ_=ò±E”<î!rk²è}þŠ­ú³0¢o=ªQ ‹9Úĺëý·‡î›­²Ås,lq™´…0ŒxôŠ°ËµAçYdțº­æ¦ãU–Wñ"þGDúŒÕyÑg\[üJ÷”UX-K¤ìùžBgï9^Cvà8ÈeDµÜ×Ê|qÞZÃú<àuœV¦[bTÌ X·j€”ss©÷â¶Ï°}ýörx5>¿þ4Ò¯—ã›~àØonß\ GÃÛñ§>å6<Ãð‹ó‹Oö¨Ý±ÖšP䶉á4+6@ìí©Ui@΋x§3ä$K+=01ÓBà ·Ã…Bé®^dßp“ŸŠ·y<þ9z{}ýñtxל݋r%ú¶ÿ®î³ìÛ«z¨^¿¼ó,ú—ìú/ôn4Þ ïFãá»ÃñðÏ7rôùè%ø:q7x1¾ÞpRÕñ@ˆ\”Õ@D³>Á¶ø!˜ÅbF½Olƒ;äû=¼^^«¸Ò'>ý ÿ‚1ÍÂSïÀJçVbPဨ–³†8iYËI•åk-âMYƳt!R£W˜šlòNÔC[â76 a¶› F¼#¶›—«ŒS¹ýh2·ÎÚÓ"[ŒË²õ8ŠAÕ2ÎÒM j/Øäì.k)6 sÖñ£Œ|ÒFÁÞÉáæ3ø¤“/âüõiÀ”96Æ Ð@up“îûÆÕS.6”û‘¤“[å"m³öí2N"ÃÇÐdÂ"~ˆÃäûn³¼µÀ9¾.‘3(`xG¤‡´”òë4€5\{,âJÔj¥ºÃ×ĸX•é6®IZ·QTô©g‹²ìR‡R@À[ߞ€ºœõ Ã¢¥r€6LJ;Nð÷迵„¯Ý!’ÄÞ ‰Î=W©°›ËÒâè«Ld̪}Æ_ámÑ1-tÇwOU7Í5n3)_ï.™V².ãT„Åxøw^±”þ]+&„иŽ‹S¸&õ©òÙ*w”-w”Òe«¢¢~Üé™.”Ùå™>òIãºóðA%!¹îT„e|Ÿ)ÚßdZ›u‹ò9¢N7'e‡(‚‘Ç—qÁ¸ÿ‰I?9Óe +o<†\Lëé‰è’l=ÎèËÁ_}€Ç@ “Í)*TÒô>Êܾ-×õ‘LjbÁt¿þþŸŽÐv²ÈF|ˆ;ÁŒlŽ,€šGÏ;»óúŽH'çž2Ò J!~ÂHG _‹R‘:NaÀMG*W/Ö­¤‰& è$‰*b•A¡ÕÉ<؈òK5W<ƒ§¸ž£GN²üIw@€éàÿÁ :Ý´#."lÍ (¡+/¡Ðx<ëc¹RÌô¤êý˜<½´3„•ºë€ï¥ +õFwcËnŸÈHU¿æü?Àul{¼ã0ÇSÜ +U~ß0Ç=ÊoŒô¨¬vpŸy¤“û>b®ßNÑ;‰_“cˆ¯Ï/íkXÜugÖYàvÝñÏ¢ƒŽ]D÷!Ü7c ’o¯îBšÒ +ðÜç.‡1 R:IõY×?‘HD%vQKŽÜO­'NóºŽà©,CÂ$ŽÂ&Ç6;mâKG¾í¹k1ì×®ÈM.¯æ±Y~~S§uóZ.M=Ԗ=É +‰ò,šã¼éËô¤I½Ècœ˜ã— +zp_†Ib(|/Ö''PŒ‰Þ> P´®ޛ:«¯®@ޙÊäSf:®²(ž>mûÓúûϸ*` oů=—rÊIX+Ú]0ßÛwøÙ(K:æsJ“g6(…¶çü±V”vÆ-ÊÐêH¸ØwŽoذڀîèû Ô}’v¼ùõE¤“$+¥›tÝ)øÈ¥Îþ’ƒ¾¸Ò…|Š(Ê<‹˜érq/Šq6ÃTåÞ3xÝ k¹E3/8_A¥]|íàށ䥐'*©ŸÍہ<ç¹ôç0WïS›¶jÇäAWEümÚ®í_=¯‹¿y88 d>”¾Ý£ëM‚±»EßCH«xkûÄÞ&®ZlÏ}* øÚ}ê:•Ýg_¦–Ÿûp0ðì¯ÇÔ  )0–­g˜àN!TVº#‡PWg\¨ØÝ̈́°Ð¿(>uÀÔAlUQv‘ÉAþꌪÚbµ¾×AkøZÓ[´^SpOÅÌ]äFs8ßSûbºWË|yKî!æñö©­®ÆÒº6¹gu*ɖ³yûnež%æž9¬ ­­Ìô|_½1ó^È˲:«Õš-ÓHȝO7‹µÍ¸ñŸûgõ§. +<ê›?@ðqn¨8RjQjß(‹…<QǾɒ§¹ˆŠP½Œï‹°xÒ/çzÈe˜Î–áÌÌאhh  ë÷R¿ô9W?hÁ„«0]ªà›ôû)R&ÿC'F°iŽô,µÙ̾µj¾YõÓǞâÓÊ.‡ù7i^Uù¯gghR¢e犫3ðþ³í’sµoåAÃJ}͊-²Bhâ:êîokŸþæLŠ +endstream +endobj +1684 0 obj << +/Type /Page +/Contents 1685 0 R +/Resources 1683 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1565 0 R +/Annots [ 1633 0 R 1651 0 R 1652 0 R 1653 0 R 1654 0 R 1655 0 R 1656 0 R 1692 0 R 1657 0 R 1658 0 R 1659 0 R 1660 0 R 1694 0 R 1661 0 R 1662 0 R 1663 0 R 1664 0 R 1696 0 R 1665 0 R 1666 0 R 1667 0 R 1698 0 R 1668 0 R 1669 0 R 1670 0 R 1671 0 R 1672 0 R 1673 0 R 1674 0 R 1675 0 R 1676 0 R 1677 0 R 1678 0 R 1703 0 R 1682 0 R ] +>> endobj +1633 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 698.308 426.413 708.236] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_f63454e50c1937573c75495f3cb4c1d2) >> +>> endobj +1651 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 662.114 451.11 672.041] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_9dfe99ee7d8e2b1d7360ab0119bd12eb) >> +>> endobj +1652 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.287 625.919 513.996 635.847] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_34e5d32c224ab8293ff78c85d86e5f79) >> +>> endobj +1653 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.032 577.769 511.579 587.697] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_c379f873623c0fec37d988c2c374ffe5) >> +>> endobj +1654 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.223 505.213 342.668 516.117] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_b95e9f75dd971827c8a9a6b42faeeac7) >> +>> endobj +1655 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.601 505.213 439.515 516.117] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag) >> +>> endobj +1656 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 505.213 513.996 516.117] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1692 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 493.258 190.738 504.162] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1657 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [140.701 457.063 238.195 467.967] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_f59141db49e5141da6ac594d43ead2f7) >> +>> endobj +1658 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [244.606 457.063 328.52 467.967] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag) >> +>> endobj +1659 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [365.304 457.063 448.66 467.967] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1660 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 457.063 513.996 467.967] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +1694 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 445.108 210.673 456.012] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +1661 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [224.451 445.108 353.177 456.012] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +1662 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.625 397.954 321.906 408.858] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_70c652d969734f6a69841d30a5e9033b) >> +>> endobj +1663 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [326.24 397.954 410.155 408.858] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag) >> +>> endobj +1664 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [442.266 397.954 513.996 408.858] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gec4f5c405067bcd0483d84591bc7c48e) >> +>> endobj +1696 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 385.999 168.601 396.903] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gec4f5c405067bcd0483d84591bc7c48e) >> +>> endobj +1665 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.867 338.846 331.706 349.75] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_8bda1b8ba9119202c16f88fdb19a535b) >> +>> endobj +1666 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [337.283 338.846 421.197 349.75] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag) >> +>> endobj +1667 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [442.266 338.846 513.996 349.75] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gec4f5c405067bcd0483d84591bc7c48e) >> +>> endobj +1698 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 327.264 168.601 337.795] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gec4f5c405067bcd0483d84591bc7c48e) >> +>> endobj +1668 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 290.696 243.041 301.6] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_a1663bce444a20240c852c9443005cc0) >> +>> endobj +1669 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [246.857 290.696 356.783 301.6] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gec4f5c405067bcd0483d84591bc7c48e) >> +>> endobj +1670 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.998 219.116 289.765 230.02] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_d2154705f0854002a4f44f95580df9c7) >> +>> endobj +1671 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [295.473 219.116 405.4 230.02] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gec4f5c405067bcd0483d84591bc7c48e) >> +>> endobj +1672 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [430.64 219.116 513.996 230.02] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1673 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [140.382 170.966 375.219 181.87] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_0d5a001977b49f77a4514de614bf3c4c) >> +>> endobj +1674 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [381.311 170.966 491.237 181.87] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gec4f5c405067bcd0483d84591bc7c48e) >> +>> endobj +1675 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 159.011 208.451 169.915] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1676 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.636 122.817 331.776 133.72] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_4da79f8c645b945d52635733c3f63d7d) >> +>> endobj +1677 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [343.122 122.817 453.049 133.72] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gec4f5c405067bcd0483d84591bc7c48e) >> +>> endobj +1678 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 122.817 513.996 133.72] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1703 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 110.861 190.738 121.765] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1682 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +1686 0 obj << +/D [1684 0 R /XYZ 90 757.935 null] +>> endobj +1687 0 obj << +/D [1684 0 R /XYZ 90 714.266 null] +>> endobj +1688 0 obj << +/D [1684 0 R /XYZ 90 678.071 null] +>> endobj +1689 0 obj << +/D [1684 0 R /XYZ 90 641.877 null] +>> endobj +1690 0 obj << +/D [1684 0 R /XYZ 90 593.727 null] +>> endobj +1691 0 obj << +/D [1684 0 R /XYZ 90 520.124 null] +>> endobj +1693 0 obj << +/D [1684 0 R /XYZ 90 473.997 null] +>> endobj +1695 0 obj << +/D [1684 0 R /XYZ 90 414.888 null] +>> endobj +1697 0 obj << +/D [1684 0 R /XYZ 90 355.78 null] +>> endobj +1699 0 obj << +/D [1684 0 R /XYZ 90 307.63 null] +>> endobj +1700 0 obj << +/D [1684 0 R /XYZ 90 234.028 null] +>> endobj +1701 0 obj << +/D [1684 0 R /XYZ 90 187.9 null] +>> endobj +1702 0 obj << +/D [1684 0 R /XYZ 90 139.75 null] +>> endobj +1683 0 obj << +/Font << /F63 177 0 R /F72 202 0 R /F50 143 0 R /F23 144 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1741 0 obj << +/Length 2106 +/Filter /FlateDecode +>> +stream +xÚåZKã6¾ûWè¶20fó)‰É);ÈI&Øٙö0j‹îVbK^IžNç×oñ¡‡%Ùm·Ü@€=I¦Éb±ø}õ²±wïaï‡Ù?og7ïæI$x·kOb/ ”x·‰÷ÙóÁû»Ýfùˏ–Š9‰üün£¶Ë*¾Ÿ/¨ÀþY¥Šu¼RöãGµVfšÊÌփ‚Ì¿Üþ4ûþvö߁ý±GÌ~"D!Þj;ûü{ ŒÿäaÄdä=šY[Sύ÷iöïvº{š3 Ü9!! +@BH"î\¿Q*Œ6õ2ïóBÀ!Ó¬rÃZ»âÞ©ùÑL „w¬`-í·wªXæëå*ÏʪˆABٗ¬þ†>*ڈ5„Wc‚¶éîÍ )1’t«²2ͳåBOö"ăÈ[€ ¤ÖÕÓNlpóŽv±@$ +xßX‹aÌôìžq9’­çláä@d+:¤ ƒ ®W¢=„!É#»ú?EZ©Ò¨Êí^è¬bEa³—p Vß3©'TŒöŠì{¾¶O{Ys"|{af0QpHš¥™u#a­â2…±ŸŠ9 }5çØ¿û6r‡úìQ  ÂōèLDx=¯5âé4ëQ¸UJ‘!ÙÙ-ž—qµL³Disý9€$,½¶ñ³Ø&´‡í„Çpžž)pG¿·í‘«“ÌÀ QFÏ FƒÆÝêlnHŽ0§ ¤Wúùq’X$–åö‚EAØî>†<ØÖ¸)±•n a7xˆ³Dc^íóAlQDCYKJÕÃÈvØK›í h…wù§0üÓ_´üӟúüÓS5¯kýÌ @Íø½‰$Â,0.G +éìQ̹°1lÌÏšˆó m™|oCŒfW -‹†)¿û]­ªtN…ÿU›W-×û ÀR=ñ,×a®Vã4s9¤­°÷i¦ââx`úþÏ]¨6?ECÁ‘ â"nÔÙ4ä1Øn–ù¶. ò´t¯ãv‡ÕÍ1ÉړºMî,sìÆ‚óÁ˯¥Zï7®¤È‹ºè¸ÓÑ`o®ñ¾©=vû®[•§Óꠊ‡\Zß&$‘,DuT}ç‚Fãt"iè?¹—Æeå6¶ITUçõ®Y¾Úç{·*·îóÂ@‰9 +¡¸z"D;¶ÑúzùÍô¨›¹š’)é³. .o°¿¬H  +¹$Ôܹî¦ ˜qý³Áîéˆ>½†æˆ&ô´EêèˆÔxY©Ì8 ‰é(•„´¨š¨ƒ¨¦WMDª$øÙ¨ãP=æ>=‡8B‹U9%ˆýÿ`ù¤ ‡“µ?®F]8ֽ—Á: (‚˜6Ö:_(Û.h—DN…¸Vâ4ÄC÷×ÄF¹CøùÝîSiZ·ØéCk¨·}è)°àhü"XץΔGÒŽmªñÖóË1JŽ„x­.¥ÁèuúÏçå ŽëUÛ%žÒÃÐk´¢CÉ² !4”#%í? œ¥ûÇ$H3;ÚGûsÒjAúsoóín_ KôOùfšdGûsý¿ÚÑ$‰Îý§MýOšÉòûï !Aar[0æ0¡¢ØšŸÄ¨ÿ!ß<=¨¤ˆí·ïÓ»".žì‡·vÊû8»ßÇ÷n½ý÷.rlC¿–ªøÇ\¿´ ~‰³½éŽ1ûw묋ú·3æc¦«ºJÁ WóÄZà¯~ûyf®½=åj‹Œ‡ªÚ}ssóøøˆV%Úgé®@iuºv?[!|¨ 0lƒÛ慲gH3ÝD7ÀGý{úš`b, +endstream +endobj +1740 0 obj << +/Type /Page +/Contents 1741 0 R +/Resources 1739 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1565 0 R +/Annots [ 1679 0 R 1680 0 R 1681 0 R 1744 0 R 1704 0 R 1705 0 R 1706 0 R 1707 0 R 1708 0 R 1709 0 R 1710 0 R 1747 0 R 1711 0 R 1712 0 R 1713 0 R 1714 0 R 1715 0 R 1716 0 R 1717 0 R 1718 0 R 1719 0 R 1752 0 R 1720 0 R 1721 0 R 1722 0 R 1754 0 R 1723 0 R 1724 0 R 1725 0 R 1726 0 R 1727 0 R 1728 0 R 1757 0 R 1729 0 R 1730 0 R 1731 0 R 1759 0 R 1732 0 R 1733 0 R 1738 0 R ] +>> endobj +1679 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.748 707.957 310.757 718.861] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_6a8d9c1c40c886054ef76aac268f33b0) >> +>> endobj +1680 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [314.215 707.957 424.141 718.861] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gec4f5c405067bcd0483d84591bc7c48e) >> +>> endobj +1681 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [444.478 707.957 513.996 718.861] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1744 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 696.002 144.243 706.906] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1704 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.64 659.14 297.22 670.044] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_4b9b7034fd7b17eff672d49a7c85ac2f) >> +>> endobj +1705 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [300.57 659.14 410.497 670.044] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gec4f5c405067bcd0483d84591bc7c48e) >> +>> endobj +1706 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [430.64 659.14 513.996 670.044] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1707 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [132.846 647.185 227.828 658.089] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3) >> +>> endobj +1708 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.445 599.364 294.901 610.268] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_19ff64e7fd60a4e08c782a4683d62167) >> +>> endobj +1709 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [300.056 599.364 409.982 610.268] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gec4f5c405067bcd0483d84591bc7c48e) >> +>> endobj +1710 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.977 599.364 513.996 610.268] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +1747 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 587.409 179.112 598.313] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +1711 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 539.588 296.739 550.492] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_b50ac757b6cb922c40504dc69c983568) >> +>> endobj +1712 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [300.555 539.588 410.482 550.492] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gec4f5c405067bcd0483d84591bc7c48e) >> +>> endobj +1713 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 502.727 233.637 513.631] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_c39a1aacb6aa4f54150e2b138d7b36f2) >> +>> endobj +1714 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [237.452 502.727 347.379 513.631] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gec4f5c405067bcd0483d84591bc7c48e) >> +>> endobj +1715 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 418.353 238.608 429.257] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_5357e1ed14407abf82149fe878789efd) >> +>> endobj +1716 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [242.423 418.353 326.338 429.257] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag) >> +>> endobj +1717 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.867 381.491 366.786 392.395] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_44aa5cc75376dddfb9005dd74b27ff68) >> +>> endobj +1718 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.363 381.491 459.278 392.395] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag) >> +>> endobj +1719 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 381.491 513.996 392.395] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1752 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 369.536 190.738 380.44] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1720 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.204 332.674 362.443 343.578] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_3659fef24b67be6b668955bc6865e779) >> +>> endobj +1721 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [372.357 332.674 456.271 343.578] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag) >> +>> endobj +1722 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 332.674 513.996 343.578] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1754 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 320.719 190.738 331.623] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1723 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 272.898 277.91 283.802] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_36c57e3007fcb2340dc415f8431df7aa) >> +>> endobj +1724 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.726 272.898 365.64 283.802] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag) >> +>> endobj +1725 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.621 272.898 481.604 283.802] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3) >> +>> endobj +1726 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.687 236.036 288.366 246.94] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_5e359194d7a21e72a49aee51dbac25c4) >> +>> endobj +1727 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [298.763 236.036 382.677 246.94] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag) >> +>> endobj +1728 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [418.466 236.036 513.996 246.94] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +1757 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 224.081 164.178 234.985] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +1729 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.789 187.219 313.294 198.123] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_f349e801a615b2014d36c30fdb56022a) >> +>> endobj +1730 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [320.794 187.219 404.708 198.123] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag) >> +>> endobj +1731 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.977 187.219 513.996 198.123] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +1759 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 175.264 179.112 186.168] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +1732 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 138.402 312.789 149.306] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_39e443628f6b73203b0f66189b8bc1c6) >> +>> endobj +1733 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [316.604 138.402 400.519 149.306] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag) >> +>> endobj +1738 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +1742 0 obj << +/D [1740 0 R /XYZ 90 757.935 null] +>> endobj +1743 0 obj << +/D [1740 0 R /XYZ 90 725.058 null] +>> endobj +1745 0 obj << +/D [1740 0 R /XYZ 90 676.241 null] +>> endobj +1746 0 obj << +/D [1740 0 R /XYZ 90 616.465 null] +>> endobj +1748 0 obj << +/D [1740 0 R /XYZ 90 556.689 null] +>> endobj +1749 0 obj << +/D [1740 0 R /XYZ 90 519.828 null] +>> endobj +1750 0 obj << +/D [1740 0 R /XYZ 90 433.431 null] +>> endobj +1751 0 obj << +/D [1740 0 R /XYZ 90 398.592 null] +>> endobj +1753 0 obj << +/D [1740 0 R /XYZ 90 349.775 null] +>> endobj +1755 0 obj << +/D [1740 0 R /XYZ 90 289.999 null] +>> endobj +1756 0 obj << +/D [1740 0 R /XYZ 90 253.137 null] +>> endobj +1758 0 obj << +/D [1740 0 R /XYZ 90 204.32 null] +>> endobj +1760 0 obj << +/D [1740 0 R /XYZ 90 155.503 null] +>> endobj +1739 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F23 144 0 R /F72 202 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1793 0 obj << +/Length 1838 +/Filter /FlateDecode +>> +stream +xÚÍZ[“Ú6~çWø­0³]}iߚd3Ûn¦›d;}H2Œ‚u ¶k 6Û_ß#K66x¹­Iû‚G:çûtn6vævÞö~¾ï®]æ(p©ëÜϜ;žK Ä¹Ÿ:Ÿú"b0$ã~š.ÆïnîÆwـøýäëB.Ç*œ†TàþM¬d6 'Ò|ý g²˜&ãbëAA_îé½¹ïýÝ#°>vH±žðÇ„3Yö>}ÁÎÆq0bï<³–§ ® çcï}Û½ãº×t ÄC.üã aWE>S*ŠåËÿ9Ÿ†´Šbe‡õv²¹Ýׇb‚ÞõFm£r”óPEùgŒi#ÛBõ>cŸ•ZHœ$q®rU› e”‚,Òø©¼Ž®=êø µËµÖ”"—gH@f•þ Õ*‹sƒIh.i’G*Z[ @}9à¸?ÜÈÌàL/Ì5ùĉK¢agfRcÄGÌ'åœÈ®Ü°×Of,0¯_ß6—D=Èì1Ê倈>jU|c€ìCÂ)âÜ‚%HÉßÎ`ϓÅZoéÿ‡7E¢Äû#lRZ{‚Í ,j‘Ï\˜ƒÛ‚¯ï#ʽ𺈰 œsµd[oÆæ*÷¿EÊÒ@…j•Ÿˆ)õ¦€ª} ¨”í€ +ûýµþ«PÉqòõO9Q‘Öhg«’x-Ê;‚öÖ¾Ú·ó &l¨'&ÜõÁ<%øoe,³P%Y;µæW‡ ÿ*‘3­»>«“Hƪ]T¼Zv'l*ãc)O8"kRþÍÚ@·Íz‹déç*͏­ŽºˆºìWÊKK½-‘Œ ßåìy‹<˜W¨ÓŽÅ tp4¸¿ëïf2Ì#¸WºÕEr/è†ýzéýìà]6Â6$ö4×]Óz~#âÒÜ@Lf i–£À§åœt~,9 +ØVøý#‹*bÚè[hanÂxº°ôTIcViü:»ÌIvžw§.J¥ªCø*‰•©ó­wº@ ³p)¡ÐÏ·‰¢ñtµL/Š,Ï8F@ÐöÝSæüÍIêùH‹i¸³× vÞì/ö¨ µõ=”„áÁž0„ÜCT®7„[„D±Y/@ҕ]gÁq—Q‹$œ^(k>Ä%²ú ñ¹¡kûÕ¹t +wÉ%ýXzó„í —f&ùn˼‰¼MOu?£üýŒÚI¶Á÷ 8·C]J‚ªÞ@ľðZª0Z”ôµÌ'Y”–È¶0ÁÚ´ˆq›lß|ÜJ«>aÉ·Ú~µn_ÁóðPK-ñÛÝݗ)‡z‰èê›ëh*›ÈQfV4A&›F&Tv¦12Í+jÄõ=Ä«8b_žhVT s °ý†!MÀ¶_›pgâûÖDù–„‹ùöMÝ #2¦=PLfK_íß%‹§9ÍBóëmô5 ³'ó啙rÆóU8·ÿ¿Ù2 ýžË쇁ýÜüá]¯Šæ3íFó¨5ËÍùAŒFTŸ^4€`É¡ü-{•Æ9åݯ½âllô‚4á*.?(•þ8=>>¢IŽVq”f(R#ðJ£ÝBq#„ŽDP9cÃØØ2ɤÑ!ŠapYœùœþàü»f +endstream +endobj +1792 0 obj << +/Type /Page +/Contents 1793 0 R +/Resources 1791 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1565 0 R +/Annots [ 1734 0 R 1735 0 R 1736 0 R 1737 0 R 1761 0 R 1762 0 R 1763 0 R 1796 0 R 1764 0 R 1765 0 R 1766 0 R 1767 0 R 1768 0 R 1798 0 R 1769 0 R 1770 0 R 1771 0 R 1800 0 R 1772 0 R 1773 0 R 1774 0 R 1775 0 R 1776 0 R 1777 0 R 1778 0 R 1779 0 R 1780 0 R 1781 0 R 1782 0 R 1783 0 R 1784 0 R 1785 0 R 1786 0 R 1787 0 R 1788 0 R 1789 0 R 1790 0 R ] +>> endobj +1734 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 719.912 270.727 730.816] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_cdbb5fd3fa1ab9faed26fc5be47cc0d2) >> +>> endobj +1735 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.542 719.912 384.469 730.816] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gec4f5c405067bcd0483d84591bc7c48e) >> +>> endobj +1736 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 684.636 240.132 695.54] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_43a14864f62b4528d6c87856cba4da34) >> +>> endobj +1737 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.948 684.636 353.875 695.54] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gec4f5c405067bcd0483d84591bc7c48e) >> +>> endobj +1761 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.842 650.559 330.976 661.463] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_3ff750009bec94ab2c9a01139ba22420) >> +>> endobj +1762 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [334.528 650.559 444.454 661.463] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gec4f5c405067bcd0483d84591bc7c48e) >> +>> endobj +1763 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 650.559 513.996 661.463] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +1796 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 638.604 174.668 649.508] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +1764 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.129 638.604 256.61 649.508] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +1765 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.803 638.604 351.284 649.508] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +1766 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [140.394 604.527 277.987 615.431] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_e5845918fa5037ca4e9bdde4a4a3ecf2) >> +>> endobj +1767 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [284.091 604.527 394.018 615.431] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gec4f5c405067bcd0483d84591bc7c48e) >> +>> endobj +1768 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [420.149 604.527 513.996 615.431] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +1798 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 592.572 129.857 603.476] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +1769 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.069 557.295 297.856 568.199] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_894587e76b98f15a8ae120327dc9d532) >> +>> endobj +1770 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [311.635 557.295 421.562 568.199] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gec4f5c405067bcd0483d84591bc7c48e) >> +>> endobj +1771 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 557.295 513.996 568.199] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +1800 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 545.34 174.668 556.244] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +1772 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.837 510.064 277.739 520.968] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_2b4edec92d54747f5f1d2904407e744a) >> +>> endobj +1773 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [283.286 510.064 393.212 520.968] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gec4f5c405067bcd0483d84591bc7c48e) >> +>> endobj +1774 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [418.089 510.064 489.57 520.968] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +1775 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 498.109 196.576 509.012] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +1776 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 428.26 309.441 439.164] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_e7dc964062c194e3ae8eef0a828164ae) >> +>> endobj +1777 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [313.257 428.26 423.184 439.164] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gec4f5c405067bcd0483d84591bc7c48e) >> +>> endobj +1778 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 392.984 308.336 403.887] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_396b429302ce49ea9915778c317b81d2) >> +>> endobj +1779 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [312.151 392.984 396.066 403.887] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag) >> +>> endobj +1780 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 323.928 250.802 334.832] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_7397b715c2ccf3f6fcf2f3900efe10d6) >> +>> endobj +1781 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.618 323.928 364.544 334.832] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gec4f5c405067bcd0483d84591bc7c48e) >> +>> endobj +1782 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 288.651 254.12 299.555] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_3789c297e202c735dbd829cd6cbed989) >> +>> endobj +1783 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [317.979 288.651 427.906 299.555] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gec4f5c405067bcd0483d84591bc7c48e) >> +>> endobj +1784 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 253.374 259.101 264.278] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_086e697a92a664c83721e0c442d45271) >> +>> endobj +1785 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [312.44 253.374 422.367 264.278] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gec4f5c405067bcd0483d84591bc7c48e) >> +>> endobj +1786 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 218.098 265.188 229.002] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_8190bd5fde521e37c585c5c59b65f90d) >> +>> endobj +1787 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [269.004 218.098 378.93 229.002] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gec4f5c405067bcd0483d84591bc7c48e) >> +>> endobj +1788 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 182.821 259.649 193.725] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag_ebfd121256089b1415f3bc6989c25bbb) >> +>> endobj +1789 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [263.464 182.821 347.379 193.725] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__MIP__Problem__tag) >> +>> endobj +1790 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +1794 0 obj << +/D [1792 0 R /XYZ 90 757.935 null] +>> endobj +1795 0 obj << +/D [1792 0 R /XYZ 90 733.028 null] +>> endobj +1797 0 obj << +/D [1792 0 R /XYZ 90 621.232 null] +>> endobj +1799 0 obj << +/D [1792 0 R /XYZ 90 574 null] +>> endobj +1801 0 obj << +/D [1792 0 R /XYZ 90 442.942 null] +>> endobj +1802 0 obj << +/D [1792 0 R /XYZ 90 409.688 null] +>> endobj +1803 0 obj << +/D [1792 0 R /XYZ 90 338.61 null] +>> endobj +1804 0 obj << +/D [1792 0 R /XYZ 90 305.356 null] +>> endobj +1805 0 obj << +/D [1792 0 R /XYZ 90 270.079 null] +>> endobj +1806 0 obj << +/D [1792 0 R /XYZ 90 234.802 null] +>> endobj +1807 0 obj << +/D [1792 0 R /XYZ 90 199.526 null] +>> endobj +1808 0 obj << +/D [1792 0 R /XYZ 90 149.039 null] +>> endobj +1791 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F72 202 0 R /F65 179 0 R /F23 144 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1818 0 obj << +/Length 1693 +/Filter /FlateDecode +>> +stream +xÚÕXÛrÛ6}×Wð­ÔLãB`ò”ø’qj'®-Ogêd4´ÉL%R%©¨é×wq£HŠvlםNŸDBÀb÷ìî9 °·ð°÷~ðn<88 ™£8¤¡7ž{1ö¢ N‰7žy7~„H8Œ±¿^/'CŠý<ͪRVöeH°¿•…8´CËïwrV ‰ðól2ͳ²š¤•,’*/&U²Ž(ÇþiCód*Í륜K½Dfjˆ,ð9~ 8Œ=¢äŠ÷¦«ÁÍìÍ`üƒ‡‹…·Õ³V^@ü.½«Á/ü`°”!ò:XŽ¨ ÷¤He6+wo³™ss™TÒ¾œl²i•æ™y;ʧ›•ÌªDã°ëˆˆqÓ<"v@Ñ,TÀžŸ^L. d·K¹š”ùò›BÖ¢ós¬¦0»“+µÛÁ‰ˆ±QÁ¡1ø ÷^¥k3©øÃ1qs`b'ñæ$‚¥nÒMaøbfrܘ9b„¢€SoD"ÒÀ¬¸Ò¡p_Z,«;„a(t={Ç1 +¢p/ˆÖ®°W̘›óʘ,dµ)²4³Å–ØIåȟ©¾„\mJ¤‹ÌUI¡!˜C&9ÂÌfòRYW¦²òuwu :"ƒ0À¢×^\œ™^~zwv|>¹¿__M®?ž¿½:…¡ž)ƈ:™éü‘E ’ðàÔ/ii~³\Å+B¿„Ò,?cL˜ô¦/՜ ¹mœ§#]Ì#BECPÌmËìEñîÓõǣ㣾<ږ¶‚ Â&xØAm0ØòÝ Ý*²ÙTµ™ÂŽ»%YnL¨U]•ot3«5ù΢sфG¿ )÷“åÖ³Ømn~µßzàö«P³L›á¹%‡^œAT.Ð0?]ŒOÏOë3PŠ&˜-§4˜ê¡Ñ[B(â8è¤0™­Òªl÷I¾®ÒU²´m’/7*Ôà ªÓ#¼QÅ¥Ó$:Ú$º8æ½D§;RS@ Ä2qpˆaÀɼ¦Ù8[T8$þãØ:a,žÂ†¯ dÅ0ځlGÅïe愭g[²3·èÙ0@±  ââVes9WE;ªz P-R7j¶Yõ…#`/`}&³>ëà|¼¤t€d'çc×{°¬«=m§†ç-M†fíñ*À( +Èêi7‡=ÇÙ[«³OIÆavÔÉuË4^T×ßÒC1C65o:´œYFЍa6½Ïgõ´ïòÂ5¦uÉ&p{—NïžSIÛtiéðVº³„^PèìḌ›­°lßޛ †©Ëô×!°ùžIY¦‹ÌHëÀr+úùsB®…ï 3n¶"³œq_diø¬ÈÀr¾J³—­Û 8Îz}¢ÆZ§wУ>Q³ò9qº¦\ˆ£gœâ•` >B·š:’ð‘LG8ñі·ûõd÷AñtA/%(äQ‚B¨Ø}pÏö¤¤yÚi÷tÙ@õùCDô)&?ø̀’‹A“ZŸÿ”óéKrþÓYû?¤·Þ„þÏh¬7dò– hNJ¨“¹Yë"¢®bk>µÕŸêû]aîf«ßʖ€:ÏçE¾êx8ϗË\9¶­Š–²]© E….m‚-²Ÿ)åíY75ŸL'w2™Ébȹîjª0 EM»X“,@8ÿæUU +Ò¸ªŠ€ZÍU‹|óaÌ(haè`› }‰Õwʵs›×Bã¡Àþ÷µ¬?ÁfmÁ*;)4þՐ»ïJ+-¿ª¥e»°ó£c´È«û´ba/Ö.uÜ}ÔEœÉpšE ÐRð´3è÷}!b55÷\ •=Xu.ϔv~Ì+é‚Mª:ìÒµZáè!·®äêV8‘Ó–.í*‰˜­[›ØC_±Ñ–^¹‹Ì´J“eúW£ßê$ÉzzkËîf(P +ùÈ+M}• h©îWú*“Ljó ÉŒ) â(V*ûŒú.}‰ù÷,½-’â»y94SΒl±Ivýi‡%`躔ÅOª7K³à<É6š§à?•%sè*J b€Q…:Žü+)-ß=÷ô³¹AÛÅE²Zgïªjýúà`»Ý¢i‰6Yº.PZ@Áìóô΁Lò¸>º˜NÇV¹®ˆ!Í`p•Ô·Í<ý ¤ÖòÆ +endstream +endobj +1817 0 obj << +/Type /Page +/Contents 1818 0 R +/Resources 1816 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1825 0 R +/Annots [ 1812 0 R 1815 0 R ] +>> endobj +1812 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.557 167.829 500.327 178.733] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag) >> +>> endobj +1815 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +1819 0 obj << +/D [1817 0 R /XYZ 90 757.935 null] +>> endobj +1820 0 obj << +/D [1817 0 R /XYZ 90 733.028 null] +>> endobj +1809 0 obj << +/D [1817 0 R /XYZ 90 716.221 null] +>> endobj +1821 0 obj << +/D [1817 0 R /XYZ 90 716.221 null] +>> endobj +1810 0 obj << +/D [1817 0 R /XYZ 90 590.626 null] +>> endobj +1822 0 obj << +/D [1817 0 R /XYZ 90 576.166 null] +>> endobj +1811 0 obj << +/D [1817 0 R /XYZ 90 429.43 null] +>> endobj +1823 0 obj << +/D [1817 0 R /XYZ 90 414.969 null] +>> endobj +391 0 obj << +/D [1817 0 R /XYZ 90 233.717 null] +>> endobj +122 0 obj << +/D [1817 0 R /XYZ 90 226.739 null] +>> endobj +1824 0 obj << +/D [1817 0 R /XYZ 90 132.053 null] +>> endobj +1816 0 obj << +/Font << /F63 177 0 R /F89 447 0 R /F65 179 0 R /F50 143 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1851 0 obj << +/Length 1864 +/Filter /FlateDecode +>> +stream +xÚíZM“Ú8½ó+\¹ª‚F߶³§|ÍV²Ùªì„=MR¬ƒã ØÄ6Cø÷Û²dÃ0@R9ì [–¥îÖ{­~2ؙ9Øù½÷rÔ»º–Ìñ‘/©tFSÇǎ+ ”8£Ð¹í»ˆÈÁ`ŒûËå|üa@q?‰âË(ûIcÔzt—‚u¾”\¿@“È."œš^®¢y˜˜æÂKÀKsóO္Ö^èGړ§ö•84ëž6ǹƒ‡s‹À<)‡°]Êß°ÌܾÊ2ã* ¤6™2†\×ÛrÖtjøE$"Ì/û ÎPÔ!i„rH]Š„€Õ£ìŸN)ÝóÀ9ž¦Éb@úaVOô0f`ó±vÄ,…ð3á=³ÏRH“‡¹ëFƒÕ?‰~0›ÆàæXŽˆË,Ø^þL’åÆ\%ÓPKŒve06ˆÖ ³ŠÖe¡’>{˜aüD‚1˜t/@0&½ƒÉxÿ¢)òÙ,ŠÛs²£˜t‡{YÖ°§uËì Š'9»g®ã·‰Èí&ñ"Ë¢YœU@ÛÅó'+e0‚ʟ +×%Y:·Óòd©ýâٓ&Æó; zXZŽõÒÆЩâ\³O¦¾­Lݳý8Œ²Wñ$Ï0•J1Bk·º¸aO=q÷a’Aòb ‡Ëýñ¢ ½´fӃýO‹#rÿ¯B‹ePö­@¯Ê]ã’t¹”=Hy"¸‡\..ÀêšR,Ts•«óe‚ïgâ̞—ÈßÆ:_Þó( ªb¢‚†-'vWÞÑZ/k”?ïZy¸$U"Ìï";ú"øªUl9Y¶2ÕHkêI’Ú*e™Äa•Ìm[b^š”ƒ¬£ùÜâ\3ã^Åù*˜Ï7Õ¦°õò\™ +C±Ž`C¯Cè$@à!T1„qãÚk+¥kI æ>+u÷Ä4.À$ÛöZmµµTӛo`w”[ÃGŸ‚·šÙ­’»©¨*hT#ç(JNͦ¡JµûEiË=ê£Ér@­œ“à +r3)MÙ³/µõŽë#*#w£:u1ÂZP¥Ü¯á¦q<µ¿±fÁ.E¹˜ëÖíb(CWՌ–Ïvw.iQ±ÕÒr5¯G(7GÉ{ì!!+evØ êÁ;Qyøz¼ÈYçN>?‘'¤Cû6K|vÑs'y’ð=w/™˜µÕvB’À~~$+¦d΂¼)fMœí“úÌ÷¿çM(>/.ÔúžêCž —P큋òT¸ü*¥G± „ G.c?.K[‚èÒ!JVÙ9°ñ0äÝK­DSq£t1†zn7ÏèA…ݘ€%ýïÏî‹#Žý¶¦4Vâfüqç}Æ7*_¥Zó1¯Ø6õÏ2eÝ+s†›S‰¢ìÉÆ\¿MÍÃE¯mUíˆupñZ—¸ÔgŸœUtøÞAPTµþ â°ëP"OˆCǑÍAÊò]›Uï·Ásak‚­àà]ÏßFÎcq…4Ö0¬¤%Q/BÕ\•={xÙ.ÙFTïú°ù0ŸÖßÙ±_Ú^«<ˆæ*,‹ól’FË-uºa}2·òЮèÞ-Æ.q¢? 6y`j©VìÀ[FÇØVÔ¨Úu©¸<ç~Q:~£æ #í͵‚ l2YéL”¡mÓ _-‹ÎCâ +z¡O¡áŽJSÅø¦îªM3‹”yîü/±&¾PPlIª¿£îD5HÔß²@@zÔßΊ»óÚAZß]$kR‹”†9šÖ´U{7li¨˜2gÙc{*äÑj”ÛÔâs—†L‚rý•9ˆêJܔB2ëòÞ- šb˜#ÎåEDͱ‚f[Ìl¯®ñZmØ*_K´f:k†—ú4Å;ö+|ùÕ] —Ì_ „YØ3‹Qá$c€l½ç¤ F+Á˜§ï£/inÌÍ+Óå}ÏVÁ̾oþX É`þ\Mg*}:Boaú…?ƒvóLsí^O Ì1©1TJˆj@!Ø 0ïTå1‚‰ÀW§¼ú£WD¹ö‹rÕö.ϗϯ®Öë5šdhGËEùæj÷¥„h„_ÑÌäk0l‘¤ÊøÅи(r×Î:ý5Mðû +endstream +endobj +1850 0 obj << +/Type /Page +/Contents 1851 0 R +/Resources 1849 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1825 0 R +/Annots [ 1813 0 R 1814 0 R 1854 0 R 1826 0 R 1827 0 R 1856 0 R 1828 0 R 1857 0 R 1829 0 R 1830 0 R 1859 0 R 1831 0 R 1832 0 R 1833 0 R 1861 0 R 1834 0 R 1835 0 R 1836 0 R 1863 0 R 1837 0 R 1838 0 R 1864 0 R 1839 0 R 1840 0 R 1841 0 R 1866 0 R 1842 0 R 1843 0 R 1868 0 R 1844 0 R 1845 0 R 1870 0 R 1846 0 R 1871 0 R 1847 0 R 1848 0 R ] +>> endobj +1813 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.291 719.912 386.001 730.816] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag_bcb586fdbb2eb01ec10c0eb941f4b7f1) >> +>> endobj +1814 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [401.001 719.912 513.996 730.816] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag) >> +>> endobj +1854 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 707.957 240.541 718.861] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag) >> +>> endobj +1826 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.22 672.706 473.043 683.61] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag_0746b37f80c4be687b0dc5ded6190002) >> +>> endobj +1827 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 672.706 513.996 683.61] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag) >> +>> endobj +1856 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 660.751 330.512 671.655] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag) >> +>> endobj +1828 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.989 660.751 513.996 671.655] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf2faa73b338e8563f6c022739e5ecc6f) >> +>> endobj +1857 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 648.795 240.541 659.699] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf2faa73b338e8563f6c022739e5ecc6f) >> +>> endobj +1829 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.278 613.544 381.627 624.448] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag_8d39b1769491b0ee262118bfa31bcc67) >> +>> endobj +1830 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.615 613.544 513.996 624.448] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g82657533544652eb3ec1334a72da137e) >> +>> endobj +1859 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 601.589 192.402 612.493] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g82657533544652eb3ec1334a72da137e) >> +>> endobj +1831 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.738 601.589 429.869 612.493] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag) >> +>> endobj +1832 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.079 566.338 377.826 577.242] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag_dd8c6ae913a7e3f0a7e1470a23ba04a3) >> +>> endobj +1833 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.615 566.338 513.996 577.242] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g82657533544652eb3ec1334a72da137e) >> +>> endobj +1861 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 554.383 192.402 565.286] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g82657533544652eb3ec1334a72da137e) >> +>> endobj +1834 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.738 554.383 429.869 565.286] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag) >> +>> endobj +1835 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.377 519.131 382.529 530.035] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag_db6f375b8aad58a31f6a60abb7a9b1e2) >> +>> endobj +1836 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.615 519.131 513.996 530.035] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf2faa73b338e8563f6c022739e5ecc6f) >> +>> endobj +1863 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 507.176 252.167 518.08] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf2faa73b338e8563f6c022739e5ecc6f) >> +>> endobj +1837 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.672 438.19 414.488 449.094] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag_d69ffccc04d33132e31a91296afad78d) >> +>> endobj +1838 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [427.87 438.19 513.996 449.094] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf2faa73b338e8563f6c022739e5ecc6f) >> +>> endobj +1864 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 426.235 293.422 437.139] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf2faa73b338e8563f6c022739e5ecc6f) >> +>> endobj +1839 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.44 426.235 403.847 437.139] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +1840 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.545 392.171 397.746 403.075] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag_70541b12c8a9b281b3aa4f9c21624b3c) >> +>> endobj +1841 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [401.001 392.171 513.996 403.075] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag) >> +>> endobj +1866 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 380.215 240.541 391.119] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag) >> +>> endobj +1842 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.531 344.964 404.386 355.868] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag_bc4dd4b94a80075012b0f30b13339632) >> +>> endobj +1843 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [412.628 344.964 513.996 355.868] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag) >> +>> endobj +1868 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 333.009 252.167 343.913] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag) >> +>> endobj +1844 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [150.701 297.758 411.46 308.662] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag_62836b9156289bd880bf9f32056a4dee) >> +>> endobj +1845 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [427.87 297.758 513.996 308.662] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf2faa73b338e8563f6c022739e5ecc6f) >> +>> endobj +1870 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 285.802 293.422 296.706] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf2faa73b338e8563f6c022739e5ecc6f) >> +>> endobj +1846 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [324.07 285.802 513.996 296.706] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf2faa73b338e8563f6c022739e5ecc6f) >> +>> endobj +1871 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 273.847 189.622 284.751] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf2faa73b338e8563f6c022739e5ecc6f) >> +>> endobj +1847 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.557 184.005 500.327 194.908] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag) >> +>> endobj +1848 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +1852 0 obj << +/D [1850 0 R /XYZ 90 757.935 null] +>> endobj +1853 0 obj << +/D [1850 0 R /XYZ 90 733.028 null] +>> endobj +1855 0 obj << +/D [1850 0 R /XYZ 90 689.404 null] +>> endobj +1858 0 obj << +/D [1850 0 R /XYZ 90 630.242 null] +>> endobj +1860 0 obj << +/D [1850 0 R /XYZ 90 583.036 null] +>> endobj +1862 0 obj << +/D [1850 0 R /XYZ 90 535.829 null] +>> endobj +1865 0 obj << +/D [1850 0 R /XYZ 90 408.869 null] +>> endobj +1867 0 obj << +/D [1850 0 R /XYZ 90 361.662 null] +>> endobj +1869 0 obj << +/D [1850 0 R /XYZ 90 314.456 null] +>> endobj +1872 0 obj << +/D [1850 0 R /XYZ 90 229.131 null] +>> endobj +1873 0 obj << +/D [1850 0 R /XYZ 90 170.793 null] +>> endobj +1874 0 obj << +/D [1850 0 R /XYZ 90 148.481 null] +>> endobj +1875 0 obj << +/D [1850 0 R /XYZ 90 148.481 null] +>> endobj +1849 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F23 144 0 R /F72 202 0 R /F65 179 0 R /F89 447 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1903 0 obj << +/Length 1858 +/Filter /FlateDecode +>> +stream +xÚíYI“›F¾ëWP¾UzzڷıSÎgR9Ø© #z4Ød@‘•_Ÿ× „furÉE¢›î·~oé‹ßL¾º˜œ¿ŠX ‘Œh\\qD $¸È‚·aŒH<Œq¸Z—?O)«¼lÕºÁ”àp£j=ñÂMÛ•ÕS’„Uy™·ªNÛª¾lÓÅtF_—0uÎ•¾Q×Ê,V¥žJˆˆB!¦\|;yy1ù8! *ˆMÄ(f"˜/'oÿÀAóß1™³jpÊà¿~ü2ÁNM|TÝD"ŒyÓ‘ˆ[•ŸF"LA"–y¹xn$éHœ¿xg?IPŒe0#0%„ÝÿS zq*MáSޞé! Û­/§a–7ï×å¼ÕtA±+E ‰‘!”Ù{ ÄÚ-ÈË©i󢰏ՔŠpSªÌòºÚÚiǜ„+»ÀøË.©®Þ«yû|:cÔ.µÐnÓµ–2¯J»nžz倨c +ƲK÷˜€ÁLD¤¶éíd_ÆÂeºµy9å8üKïO‹Þs_+¿üdaˆ àDò4àÁ/'Üʼnñ_©ŒÛîâÇÄCf†–6ûQv'‘23‰'Aó6<ßþö÷Ëôƒ>Çw̚µm¬çUíڊUUf>/»¹ÊnšwDì=ŽÁ¶¹«Re»N‹bëóûÎf{¿s~GN `º ÕüSƬj_»+…þjÄõ‡Ñ¹Ô÷9gÝtgnpZyùäÎ['øÅTRÐÖÜ(ü §UÎïßeªÖŠw÷)»üø§âãQÇ÷hõÔžÁ‰ƒjQvŸpvçCÅŒ€¾ðÇl1Ýk÷_jä†%—ˆÅq–cQÉÆþt {~[þxQvc¬ÿ÷êBq]ôüUû}ŽÒ8A"⃋ã=™¡ÅOx<š +7±ÉÇÄáòþÝQÑo£|ÀÎPûOîrž¨jÌ­Gµn£@$(æw¢¦^$vçLÛÏ4Çzw}­ÃOí>8~¢»ÂIô€ z$@í)A=$Ã/„‘.òÉ]?š‚`ûÉBÚ~ÿ Áw?0þlšÚz©s£^äÔ¾ý>¿ªÓzk/ì’ïÓr±NnÿëÁǘú­QõS!ÂÆnø!-¡ÖÚwÚÊîWc/a#hX©6Ò_ëxø«êjœµÀ‡ {únb × A¨O³7m»z~~¾ÙlмAë2_Õ(oÏÁ{ç‡u½'B ö„ô-”ýÌ ¿ÞUæftÈK˜\š‹n4ôÓ?l÷† +endstream +endobj +1902 0 obj << +/Type /Page +/Contents 1903 0 R +/Resources 1901 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1825 0 R +/Annots [ 1876 0 R 1877 0 R 1878 0 R 1907 0 R 1879 0 R 1880 0 R 1909 0 R 1881 0 R 1882 0 R 1883 0 R 1911 0 R 1884 0 R 1885 0 R 1886 0 R 1887 0 R 1888 0 R 1889 0 R 1914 0 R 1890 0 R 1891 0 R 1915 0 R 1892 0 R 1893 0 R 1894 0 R 1917 0 R 1895 0 R 1896 0 R 1919 0 R 1900 0 R ] +>> endobj +1876 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.035 569.601 476.806 580.505] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag) >> +>> endobj +1877 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.297 467.279 372.995 478.183] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag_7e3f8c5b2e614c5d18783c2ef7b092e1) >> +>> endobj +1878 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [401.001 467.279 513.996 478.183] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag) >> +>> endobj +1907 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 455.324 214.528 466.228] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag) >> +>> endobj +1879 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.059 419.34 407.858 430.244] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag_98e7f050a579e9deeb71a75758238928) >> +>> endobj +1880 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [412.628 419.34 513.996 430.244] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag) >> +>> endobj +1909 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 407.385 226.155 418.289] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag) >> +>> endobj +1881 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [247.136 407.385 470.267 418.289] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6d1de7e82c3d57a0a6229187078537d7) >> +>> endobj +1882 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [159.477 371.401 375.814 382.305] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag_79d1cb9751d21f7b364c4c41c4715737) >> +>> endobj +1883 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [401.001 371.401 513.996 382.305] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag) >> +>> endobj +1911 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 359.446 180.776 370.35] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag) >> +>> endobj +1884 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.112 359.446 392.23 370.35] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag) >> +>> endobj +1885 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.093 323.462 346.828 334.366] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag_a82f0fc73b5f98fab74070ee92a100cf) >> +>> endobj +1886 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [350.63 323.462 513.996 334.366] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag) >> +>> endobj +1887 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.933 311.507 336.051 322.411] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag) >> +>> endobj +1888 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.57 275.523 363.709 286.427] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag_acb1e10c50be6e9dd36e3aed93c7a222) >> +>> endobj +1889 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.989 275.523 513.996 286.427] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6d1de7e82c3d57a0a6229187078537d7) >> +>> endobj +1914 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 263.568 214.528 274.472] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6d1de7e82c3d57a0a6229187078537d7) >> +>> endobj +1890 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [140.05 192.568 380.855 203.472] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag_1785059acd1bf60dcf4cda0044cc94b5) >> +>> endobj +1891 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.615 192.568 513.996 203.472] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6d1de7e82c3d57a0a6229187078537d7) >> +>> endobj +1915 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 180.613 226.155 191.517] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6d1de7e82c3d57a0a6229187078537d7) >> +>> endobj +1892 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [237.173 180.613 336.58 191.517] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +1893 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [150.551 146.182 384.74 157.086] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag_64b1a8e66388915a57bfd0b53a2e46c5) >> +>> endobj +1894 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [401.001 146.182 513.996 157.086] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag) >> +>> endobj +1917 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 134.227 214.528 145.131] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag) >> +>> endobj +1895 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.724 98.244 385.567 109.147] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag_35180fb6d38a29d74f5992815fbdf006) >> +>> endobj +1896 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [401.001 98.244 513.996 109.147] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag) >> +>> endobj +1919 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 86.288 214.528 97.192] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag) >> +>> endobj +1900 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +1904 0 obj << +/D [1902 0 R /XYZ 90 757.935 null] +>> endobj +393 0 obj << +/D [1902 0 R /XYZ 90 622.82 null] +>> endobj +126 0 obj << +/D [1902 0 R /XYZ 90 615.539 null] +>> endobj +1905 0 obj << +/D [1902 0 R /XYZ 90 533.912 null] +>> endobj +1906 0 obj << +/D [1902 0 R /XYZ 90 482.427 null] +>> endobj +1908 0 obj << +/D [1902 0 R /XYZ 90 436.221 null] +>> endobj +1910 0 obj << +/D [1902 0 R /XYZ 90 388.282 null] +>> endobj +1912 0 obj << +/D [1902 0 R /XYZ 90 340.343 null] +>> endobj +1913 0 obj << +/D [1902 0 R /XYZ 90 292.405 null] +>> endobj +1916 0 obj << +/D [1902 0 R /XYZ 90 163.064 null] +>> endobj +1918 0 obj << +/D [1902 0 R /XYZ 90 115.125 null] +>> endobj +1901 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F65 179 0 R /F23 144 0 R /F72 202 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1932 0 obj << +/Length 2092 +/Filter /FlateDecode +>> +stream +xÚ½Y[›H~÷¯@ó² ÅÕu*û4“Lvç¶3“ô*IÔ¢MÙfƒ8îίßS7 wwi¥–0EÕ©sû¾sª›ÿZüp½¸z³@"Ó8¸^IL $¸Îƒwa‚H- Æ8Üï˛?"ŠÃº¨ºVuî%"8<ªF¼pCåýVåMDÒ°®nºl-©ÀáOU§šu¶RöõµZ+3GUzˆÉh(âèÃõϋ¯TÄ1*‰%L«ÝâÝä0þs€“ip4³v§ žeðfñç;ó¦OcnBƒ̍¹6—pŒ(üL(C8Öæ—jÕD, ÕN¡Z!p’¬â´ÑۙéEg§Œƒöu[tÅ'eß@;qn40aK–È°Xۏ&±Ì¬NƒO„ZM=ÑI\Ս͸v_WyQmܲz”ÄYŸãw3(HQ’Æ~BVå3RHŒRˆ—›sÿ¨£–IªFKÎEhÇÎÁç–3p¾óœ£‚"@;rGڍrXä¤9JϬ.€mBŸÃ'KNP*“žCáϱèKÕeE©r‹ä—ª]5ž+êÊZ>‚,Ý8b.ô×(~¿WŽ´;͏µ¦àÆ×PG1: M õ+ì0æÏ"n]½vr  Yœû!rÑgc E8!OQç©WM¡ªÜi÷½·öµ*³Î»ï•3Ý9³^4egޝZé}$4Ç]òµ•­‡yî +Ù¤  jˆm@Ã=–^Ã!c}áÆ®ò¤ràRØ¥I<­N#· $˜ô3žE†ò§jŽ‹¸B‡Bˆ®q²‡î{ŒÙŒ: â€f7'ŸÑ…#™’“K†$†[¡”öRÞ56>Ì@fI¥¾€2±Ž)÷½ÑÁсigÄþñy=É.æ¼wê±)NÀÊìÃøÎþÜ6Ku¡¤7ª=”§Õ…N–æ9̛ӕR‰I'é*L?aL[SºbR!1(‘±£«ÿԝz>Y5ö02–àáaAí¢?éj¢4“$ì"nëÃf;çl†–9;LѐÄ@xVxUWKïlö`Ð5R™¦,Ìûp[7âÂͶÞoÝ`å$ÛG6mAí?g,1œ{ý¬.çV€OSÙgö©gƒ$ÃëmÑÚêøD±`c06‹4¼U«ìÐ*û²;tÙmé^¼Ùnb֘qîTVuv̦|+KËÓöÕˆÔ§$®óàKW™'Óԕƒ~’ [¨¶–Ù†ŸGE$5|§Ð=›#·Û{—òM½ß÷P¥í³5ôŸÙ¡ã¶(ûXiÕ]v aÓ(š±ú“rv©ÜéqéT2]¸ìÐñÙ?„ÌÛ(º§¨ø4ôȓg~×NçÄ6úwE§ýÀ™ÓÓIœÃ)¶'ÉCt"–Ò˜`§¶+ÊÒþ´¹Q™š +{™(Á°Ûªã ÈÛ)õí_àü瑦 KçG˜»>d˜·Êú=ª‰P·©'Lmbp! "RŽ3Èn û2î²{ûP Ðÿ¤×ge‘CeÐãX¹¿ÕªÍÊd‘cŠ™*ÃÁUS«DTöÎnâʹ’öôUÕ³͈跺U֔À`šóbR¼¼?sÃ`­ +«®dæõh© öR <ª¬U¹ën1Gq<á—ãV¹¦ÉlÙêGË(> §ø +LHÈ¥1’Ø÷¨=ÚF½Ø¸1í¶…aa®t»Ó_ ͛û¾Q•f9ßz7Ñs]{rëUÕTPN*˜>fp–ê^až>|ø}q3Ò åõ]dëDj™ÀÉdütwðÿº/¹xXàòëN ½Gg›û1§;}÷ų}¨Å§þ;Ó¿·Û£+‹îL¦) wë] Är¶2¨Ý­j&†£Îß#Íýù{˜3ß;Íÿ]¯¦&Ø]´Ï¼OŒ¾ÇÉ.+¬ý C\_ÛÓ7}ýµLéSOoõÎT¢M”zÓ¨ü`3n¸4íßxmóâòÅÍð 9w…²o¿êş @ö>döuÊ,Ã~ç”ú“.¢¨æ®48v~ûöÑûA['‡»ë&w—Ý»¬·IN¹á…âŒ@I<k0î ܾöÆ#?TyV}á#£ ¡öŽ‘~C² +ÁŸš¬mñù,;õòoÍÎÁõBvº>Vk6{tæp4`äüä÷ñi??5ã—L }EtcèÔ| çU_ fïò _ÒS_óùф=åéáÄ°_‚8¥3INPŒN×ã4œþ †Uи=ñßæßàjè[¨ßö¿B"HšaÔ抴Ùé"£=-eöë¯Åm“5÷ö兝òkVmÙÆ­ÿiÒßÀÐ[Õü#B߸ê¿eÕÁ`¾éŒu=jkÛ&ÄAuôõÑóðòén=ðwàý²0^>ÙE¡£=a|ÛuûçWWÇã­Zt¨Š}ƒŠî +pu^NBp¨}?k;݀צނ Eƒ;ÓêÅé¸äÜ +endstream +endobj +1931 0 obj << +/Type /Page +/Contents 1932 0 R +/Resources 1930 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1825 0 R +/Annots [ 1897 0 R 1898 0 R 1935 0 R 1899 0 R 1921 0 R 1922 0 R 1923 0 R 1941 0 R 1924 0 R 1925 0 R 1942 0 R 1929 0 R ] +>> endobj +1897 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.079 697.271 377.826 708.175] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag_be46bba93c5ddcf4cf4cafdb0d74f942) >> +>> endobj +1898 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.615 697.271 513.996 708.175] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6d1de7e82c3d57a0a6229187078537d7) >> +>> endobj +1935 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 685.316 226.155 696.22] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6d1de7e82c3d57a0a6229187078537d7) >> +>> endobj +1899 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.616 685.316 459.746 696.22] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6d1de7e82c3d57a0a6229187078537d7) >> +>> endobj +1921 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.035 594.435 476.806 605.339] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag) >> +>> endobj +1922 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.395 159.329 363.884 170.233] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag_26a124537b8995832b2cb157abc7cf07) >> +>> endobj +1923 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.989 159.329 513.996 170.233] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g82657533544652eb3ec1334a72da137e) >> +>> endobj +1941 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 147.374 180.776 158.278] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g82657533544652eb3ec1334a72da137e) >> +>> endobj +1924 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.136 111.058 317.224 121.962] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag_0bf696420bbdc5c2ef0993f61f2273b7) >> +>> endobj +1925 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [324.07 111.058 513.996 121.962] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g82657533544652eb3ec1334a72da137e) >> +>> endobj +1942 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 99.103 129.857 110.007] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g82657533544652eb3ec1334a72da137e) >> +>> endobj +1929 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +1933 0 obj << +/D [1931 0 R /XYZ 90 757.935 null] +>> endobj +1934 0 obj << +/D [1931 0 R /XYZ 90 714.235 null] +>> endobj +1936 0 obj << +/D [1931 0 R /XYZ 90 639.562 null] +>> endobj +1937 0 obj << +/D [1931 0 R /XYZ 90 580.984 null] +>> endobj +1920 0 obj << +/D [1931 0 R /XYZ 90 558.672 null] +>> endobj +1938 0 obj << +/D [1931 0 R /XYZ 90 558.672 null] +>> endobj +392 0 obj << +/D [1931 0 R /XYZ 90 315.269 null] +>> endobj +130 0 obj << +/D [1931 0 R /XYZ 90 308.246 null] +>> endobj +1939 0 obj << +/D [1931 0 R /XYZ 90 226.544 null] +>> endobj +1940 0 obj << +/D [1931 0 R /XYZ 90 175.014 null] +>> endobj +1930 0 obj << +/Font << /F63 177 0 R /F72 202 0 R /F65 179 0 R /F50 143 0 R /F89 447 0 R /F23 144 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1963 0 obj << +/Length 2120 +/Filter /FlateDecode +>> +stream +xÚíYYsÛF~ׯÀۂUæsáÈ>ùXo9›8YG[û`»TCbD!!M)¿>Ýs J²¤JRµûBpt÷t}L# +VAüóìÕÅÙùۘÉbWAIL‰d4¸ÈƒaBh:›Ó(ŠÂº^_þ8cQXe×êÎ f4 +wºÁ‰×nj}{­ófFÓ°*/;µšÍ™ŒÂwe§›+µÔvøA_i³G—8EiÆY(“Ùç‹oÏþqqö룀‘dB.ƒåæìãç(ÈaþÛ "8L0⒈ލ¸”ò¯‹üÔ꫚)^`þ¢{³žÍdÄ o“»§øÛf&dXÕèÀþÊ7¨ŒÈ4½Û5IÒÞ5 lZ¢=2`CèÆԒÛ%ÏṸà˜Q’d½£€Ž§XޅßòˆqÈgm[¬Ê¢\Y†“Ž.2’ ^*´GEJp8H™¸;dqú\áy}Š"ִݝ “Ãñà R``X«öÙB»+4àÕák’æڗs×z?[ÞÏ+IHõþpU€ž'øA§bˆDS #Œö¾‡ºš"ÃI÷dµ›&7Ëõ6צùÊz¦$~w¤ꎵ*LõzÙè|»Ô‡¼ ©?¥ | +6¿¯ò½L·–圈"§ðÈÒ~Ëk·ÔV)ö°ÜÚÛ\‡Öö¢e6l´Y^Ùܝ¹ðÛ{ ^ܬ5üAÝûV MmÏ1Úa¸»®Z÷¶®@l¾¨¶en'‹ö€l«6îŸ2‡ æ"&q†ˆÀYŸ wo[ÍaX¹+^®ì¶,ª’œ°Â^³@IV–PPHZ}ǑP×s|£;U¬Mf—8j—MQw…½”xÄ:&NԋY +ÚZû iéˆ\¡–€‚ Us7&a¹_ˆÁ­,~Ö |ÒG]¼Œ:Ø^ eŽùb ÎäÕF( +‡…%8»pûa¥SeW(Sۘ•[»µS¿¼àœjÝÓmQ­¶›,q·Xb…qkˆòÓgtd[½A>Kû^ß@q2êÉ\2˜ Î_ã_áU-Ã÷ïÝLí´¥°š’qøêÝàvŠ°ZvjU•B2l¯Îm^TVÖö€úª)òÖÆK“‡/$z­7ºììÀZLxëÊ}LË+I6ºnt ´ kj/fƒ«HÉökíÂê²O÷jqî Ok$âb§Qk…ô.Œ‡zaç\Z£áµBþb£„ôŽ+{Dž-míšëH +T0m6(}¥Û"7Jf‰/<“=o1óÊÕ ªq;¬\¨ +ðTµX»i£C\6€?Æp4ÂRËÏvœP3>ˆÁ0¯–[´ªrªEngYMŒ§­ã0…GµW«ðÚсK2AÀªZ·•Û×Øî¼S‘Àø7˜¿1ÀÅ<»ji©õúCFqøÎQ®UºØ®Uƒ 1#¤òE˜u&ŠMtkÅ?ÊL{éFmŠÒëm ÁE " K>¾õÑœ;6à„u’C@Ïä( 3Ðß6….}»ä¥—äƒ^;SÁà­S™‹ù{†wJÇyK¾ÏXã@"ùc¿WµÅoÚQ@ ŽJø{hMWÜĬʠTT&3'ñay±§Õ”¤Ã½ƒÊêé±ñf(Wɇ"3âL"’¾/Õþ6Á35•|ie +£ñ—3’²žÊÇÆZòóD~žSì„qu\©úß°~Ü=jêìHÊýw‚ï·€\¹Ý,|“ù·¾!=u¢(&’Õzß ÁÄñô ú°ÈB“0† [IbÚ÷U§¿9xmŸCJ +/§$CšwÞùN¹MJ/ì臍ñòÕ ðëñ2W¥«W\*t§ÝþŽ´èÝ{[ö~×UÕþA¿ÂÆPëÒô¡aýG֘d OÝ·eÀ¹”bT1ÎÁG°ùÑl0½rÖWùÊ®~W,ÕÜÚÁk»å;U®¶jåÞ·–Ñmþƒ©ÿ´ºùÛ + ûÂ÷ª´ý~n½Úeµa&#e.óÕD$Ÿ´¿ÖX üøÿ:3€ÎÅ©‡èu×ÕߜŸïv;²l ÃuCŠîâÈù±½"P,³ájb9¶©L¢…3%LnL<²ÓïÚSf +endstream +endobj +1962 0 obj << +/Type /Page +/Contents 1963 0 R +/Resources 1961 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1825 0 R +/Annots [ 1926 0 R 1966 0 R 1927 0 R 1928 0 R 1967 0 R 1944 0 R 1969 0 R 1945 0 R 1946 0 R 1970 0 R 1947 0 R 1948 0 R 1972 0 R 1949 0 R 1950 0 R 1951 0 R 1974 0 R 1952 0 R 1953 0 R 1975 0 R 1954 0 R 1955 0 R 1977 0 R 1956 0 R 1957 0 R 1978 0 R 1958 0 R 1959 0 R 1980 0 R 1960 0 R ] +>> endobj +1926 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.661 708.953 513.996 719.857] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag_eb8456ecf06307c108046a8c665154c9) >> +>> endobj +1966 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 696.998 173.025 707.902] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag_eb8456ecf06307c108046a8c665154c9) >> +>> endobj +1927 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.898 696.998 369.276 707.902] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g82657533544652eb3ec1334a72da137e) >> +>> endobj +1928 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.615 696.998 513.996 707.902] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g82657533544652eb3ec1334a72da137e) >> +>> endobj +1967 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 685.043 192.402 695.947] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g82657533544652eb3ec1334a72da137e) >> +>> endobj +1944 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.91 648.181 513.996 659.085] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag_024a52502b35029ff2ba102323d8ae5b) >> +>> endobj +1969 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 636.226 173.025 647.13] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag_024a52502b35029ff2ba102323d8ae5b) >> +>> endobj +1945 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.898 636.226 369.276 647.13] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g82657533544652eb3ec1334a72da137e) >> +>> endobj +1946 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.615 636.226 513.996 647.13] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g82657533544652eb3ec1334a72da137e) >> +>> endobj +1970 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 624.271 192.402 635.175] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g82657533544652eb3ec1334a72da137e) >> +>> endobj +1947 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [161.888 587.409 373.403 598.313] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag_91f0ccf4325f53430d7347ca73182f52) >> +>> endobj +1948 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [401.001 587.409 513.996 598.313] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag) >> +>> endobj +1972 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 575.454 180.776 586.358] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag) >> +>> endobj +1949 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.112 575.454 294.518 586.358] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +1950 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [159.951 538.592 375.341 549.496] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag_ae5f47efa7c023e45aed9be161dce99f) >> +>> endobj +1951 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [401.001 538.592 513.996 549.496] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag) >> +>> endobj +1974 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 526.637 180.776 537.541] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag) >> +>> endobj +1952 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [205.211 526.637 428.342 537.541] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6d1de7e82c3d57a0a6229187078537d7) >> +>> endobj +1953 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [453.882 526.637 513.996 537.541] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag) >> +>> endobj +1975 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 514.682 267.41 525.586] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag) >> +>> endobj +1954 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.013 477.82 377.278 488.724] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag_1b2ee4d834f0651a41647ac5b5e0f912) >> +>> endobj +1955 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [401.001 477.82 513.996 488.724] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag) >> +>> endobj +1977 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 465.865 180.776 476.769] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag) >> +>> endobj +1956 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.98 465.865 431.111 476.769] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6d1de7e82c3d57a0a6229187078537d7) >> +>> endobj +1957 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 465.865 513.996 476.769] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6d1de7e82c3d57a0a6229187078537d7) >> +>> endobj +1978 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 453.91 304.5 464.814] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6d1de7e82c3d57a0a6229187078537d7) >> +>> endobj +1958 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.705 417.048 380.586 427.952] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag_b595ea1166752d23aba600af43417bd8) >> +>> endobj +1959 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [401.001 417.048 513.996 427.952] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag) >> +>> endobj +1980 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 405.093 180.776 415.997] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Pointset__Powerset__C__Polyhedron__tag) >> +>> endobj +1960 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +1964 0 obj << +/D [1962 0 R /XYZ 90 757.935 null] +>> endobj +1965 0 obj << +/D [1962 0 R /XYZ 90 726.054 null] +>> endobj +1968 0 obj << +/D [1962 0 R /XYZ 90 665.282 null] +>> endobj +1971 0 obj << +/D [1962 0 R /XYZ 90 604.51 null] +>> endobj +1973 0 obj << +/D [1962 0 R /XYZ 90 555.693 null] +>> endobj +1976 0 obj << +/D [1962 0 R /XYZ 90 494.921 null] +>> endobj +1979 0 obj << +/D [1962 0 R /XYZ 90 434.149 null] +>> endobj +1981 0 obj << +/D [1962 0 R /XYZ 90 358.806 null] +>> endobj +1982 0 obj << +/D [1962 0 R /XYZ 90 205.081 null] +>> endobj +1943 0 obj << +/D [1962 0 R /XYZ 90 182.769 null] +>> endobj +1983 0 obj << +/D [1962 0 R /XYZ 90 182.769 null] +>> endobj +1961 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F72 202 0 R /F65 179 0 R /F89 447 0 R /F23 144 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2014 0 obj << +/Length 1905 +/Filter /FlateDecode +>> +stream +xÚíZKsÛ6¾ëWðVj&‚ñ$ÀäÔhšNÒ4“&î)Éh‰–9•H•¤¢¸¿¾‹_¢-;V;íL.BËÝÅ÷í.ã`ààçÉóËÉŋˆ1Š#—WAŒ$( .WÁ‡P"Ogcîv›ÅÛ)Åa±¹¹NW唨°Èu²žÎ¨Àá˼NË«d™ÚÇwéUj椹"œ‰P¨é§ËW“Ÿ.'N¨€b>)$’LËíäÃ'¬`üU€‹Up0³¶§ ÚMð~òÛwÕx >eGªyí´YËý6Íë¤ÎŠÜ]¥íÔ×Ye{™1aJpؘq0Oîý:ÍÓ2©Ó•“P[/"õB7›bJExÈr痏ÓMúÔî5H„8SL@"æVُ”Šþ¬3ŽŸ/zz¡UñUO3+GŠ… Úö™—É8"JžwýÌ÷z®Æ ²ú=Ö†¸€Oˆ¼¡€O7¬ ]®³ß™ œZìå©áÅôp:ú4…ÕP·Xe x• ”r´ïoý„…v+´˜E».e#E¼r‹ŠÙÈÒs+âçìv×Oî°/bFFÿÅLOÏÅ1MHCÒÈʪ#C ž4!ÈvÒí®¾¹'’ +ԍx'°f1w‹õ|ŸmV!R„‰mæ¶ñd™ršhc†yÐöVÐ(º_qïܲ²SzŠH¤xã[‹Kz(³:õª¸^ÃÛMjûuaÛ¬vs|»%™ÔL«jT#®û…Ñ â"a±Ÿƒ¦3¦DøòjTŠX#ͬÀˆ<#=7+«¼ã®4§tÐÔ[F@à Y,ai0€ÀE’+ëz—<þJíã“AdÌM€;ln\賂ÛÐu´Œ:]e›í}N;8zæÂ+È.D+H%põm¿Ll³Ï³/:àÐG¹þ‡Ñ(@o *3JQĉicÂV‰Ä‰¸ÒÊ7??cT!aFÎU±Üh°Ôáއ†œ»â­:ºÐ²»þ¦0¢a„+ƒ›0OGøƒ1—¡gx“û¸,v7¶WŒ2C‚– ©ÆyŒ‘lÈùÌJo"‹×Nµ^ÛrÃè•ÚN—TZ­©àcFy“šp4‹fD¦ïSýöÄۈô1…¤:¤bàÏâÕ×Æíncë®ÌÆÆî'¥¢ç¤” £³QjÆ¢q9àNË°Ó,fè¾3Ì1°Nîß9öæØck_Éø)Ž™j>ÑRH¸xSÕéöˆW 圩J"ŽÏX+!Zi+`Ãú„¥S ÔÀ­ÍÎàqÆ-«oâp*²å/4—ú‚E#µ0ŒuÊ3x²°†_TvqÌ )—¡56—Z¬6g ²ÇÝ0¶¬Æ Ê Beý²9ê”ÍÞÞO«iˆ×j(zăÉ]âÙ‰>‰‡ì)#ýÖön6*‚$&§‹ïod!¡qE Õ£jEvÇ´L—Úm7ËMÚÐ`Ü ó¸tdgݐB´á*:gé¨c,h0k· q÷ß¿ÊAÆ# `ÆeËA=6·Ízž…ÝŤéiæºã‰¨çi"ê±{‘1$AåDTívÒQ ÷DÔLì'¢î"êw†--︄¥êóî^û¹û‘€\q&v·Á¢"m2âc¨(¤<×å^Ÿ:ÞÂ?-âœé¶ó‚Ÿ~‘ˆG6nD²äû–ž•ƒÃڒÙ=Ý<ÈìQ+ÃÝ<ȈË20ÜäAæl™9—u¦ŒRôŽÆ©G‘¢ƒ‚›تßä@æϓ™?55»9á±(•ÿËø˜J4–ìÞðnúiIg¤ Ù}èGï™ýˆàýì™ÃŒaú2o˜ýˆ.Ãq'ûÃ<=v”ýàÕ0ûp=¿É~ÄÒO ¸Ky*ó Ö?¹Õh26»L=Ôd>âè§ßYí>Î|1Šýžù 0mbHÌ-̓Ï+á׏ ±ªê;KG%/(O#õ°#Ǫ\>æÌÑÞcU½chw¸Ñ¹$lÊç£( U6« äXbmª77ßò-Él´›«’ª~\bޘGÊ ñžæþ¢"¡„2Ô^”‹ Á»÷䌅oM]nMª¥Í:'öíëìs™”7öan§¼Nòõ>Y»ß¿Ü ÃÐïUZþ0"¬ì~Mò}²±ï4 í]nYًyÄHM5~ô] æáûÔ_™YüøÞ/ãöÖ.ÊÂM¦¸®ëÝӋ‹ÃဖÚçÙ®DY}¿8¾ùl…À¤ˆ›€áj n s½ 6d9 nÍ?ô× ÖéoÔBks +endstream +endobj +2013 0 obj << +/Type /Page +/Contents 2014 0 R +/Resources 2012 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1825 0 R +/Annots [ 1984 0 R 1985 0 R 1986 0 R 2018 0 R 1987 0 R 1988 0 R 1989 0 R 2020 0 R 1990 0 R 1991 0 R 1992 0 R 1993 0 R 1994 0 R 1995 0 R 2021 0 R 1996 0 R 1997 0 R 1998 0 R 2022 0 R 1999 0 R 2000 0 R 2001 0 R 2023 0 R 2002 0 R 2003 0 R 2004 0 R 2024 0 R 2005 0 R 2006 0 R 2007 0 R 2026 0 R 2011 0 R ] +>> endobj +1984 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.801 531.725 336.353 542.629] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_da9021952b7c7ad4ca6fc4ff082ec9fe) >> +>> endobj +1985 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [341.864 531.725 415.258 542.629] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +1986 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [444.478 531.725 513.996 542.629] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +2018 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 519.77 144.243 530.674] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +1987 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.223 471.95 332.716 482.853] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_bedffb6a2f5b2473d2d2ac9d448c65d9) >> +>> endobj +1988 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.649 471.95 419.043 482.853] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +1989 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 471.95 513.996 482.853] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2020 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 459.994 180.776 470.898] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +1990 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.413 412.174 401.265 423.078] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_418a9f96c3df4cf69bc399cd807eddeb) >> +>> endobj +1991 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [410.388 412.174 483.782 423.078] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +1992 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 400.219 224.501 411.122] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +1993 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.924 354.39 346.688 365.294] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_d6512d0d60c017982bd8031e9b8df336) >> +>> endobj +1994 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.321 354.39 428.716 365.294] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +1995 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 354.39 513.996 365.294] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +2021 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 342.435 210.673 353.339] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +1996 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.869 296.607 359.878 307.511] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_b27e9641bc6946aef6e3254d28c6fab4) >> +>> endobj +1997 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [372.457 296.607 445.851 307.511] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +1998 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 296.607 513.996 307.511] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag) >> +>> endobj +2022 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 284.652 210.673 295.556] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag) >> +>> endobj +1999 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.365 238.824 351.754 249.728] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_703c5d92387510c5cbf8b0f1da3029b2) >> +>> endobj +2000 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [358.829 238.824 432.223 249.728] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2001 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 238.824 513.996 249.728] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4aa820c3f87b201ce364e854aa37dba5) >> +>> endobj +2023 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 226.869 217.298 237.773] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4aa820c3f87b201ce364e854aa37dba5) >> +>> endobj +2002 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.31 181.04 364.945 191.944] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_9d9b8361c659cadd31afb61152ccf06b) >> +>> endobj +2003 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.964 181.04 449.359 191.944] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2004 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 181.04 513.996 191.944] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag) >> +>> endobj +2024 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 169.085 217.298 179.989] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag) >> +>> endobj +2005 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.162 123.257 341.213 134.161] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_bd393bd3febd678f09a51a0364756787) >> +>> endobj +2006 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [354.084 123.257 427.479 134.161] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2007 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 123.257 513.996 134.161] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2026 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 111.302 180.776 122.206] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2011 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +2015 0 obj << +/D [2013 0 R /XYZ 90 757.935 null] +>> endobj +394 0 obj << +/D [2013 0 R /XYZ 90 688.32 null] +>> endobj +134 0 obj << +/D [2013 0 R /XYZ 90 681.72 null] +>> endobj +2016 0 obj << +/D [2013 0 R /XYZ 90 599.896 null] +>> endobj +2017 0 obj << +/D [2013 0 R /XYZ 90 546.804 null] +>> endobj +2019 0 obj << +/D [2013 0 R /XYZ 90 489.05 null] +>> endobj +2025 0 obj << +/D [2013 0 R /XYZ 90 140.358 null] +>> endobj +2012 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F23 144 0 R /F72 202 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2062 0 obj << +/Length 2359 +/Filter /FlateDecode +>> +stream +xÚíZK“㶾ϯà-œªoÉ)»‰]v¿vrZ»T +’X–D™¤F™üú4Ð )JœÍJ)Wªö"<4Ýýu7ÑhÑèë›÷÷7w_i¥$Õ\G÷ó(¥‘ÑŒ(΢ûYô)6„¥·F)·ÛÕôÇ[Nãrõ´´³ê–%q¹™6Ùâv¿Ù4¶šg¹ÅæÏvný»ñ]L +«ôö×ûooþ~óû hÄü’Ê#T”¯o>ýJ£ôQ"Ò$ÚûQëHrå*úxóÓ ì—§ÛaTfDd¸ T+ÜӇrS7Õ.oʪF^³Í +­ëb±YÛMƒíù-WqYaãûï?ŒÀo¨åàî+E—DªöNT*pñ_8Wƒ)ѧ‰é°$v;™T‹ œŸýÆLâ忱Ž¡ýÔ³ØÌ«r=­· ûé¬îëâˆ/¤‘Æ¿PEŸ]5ÜSmŽ¶Æ%+„!‰Ñð ·E©pÏ IšðvÌv»|÷Â%cžƒ‰M„`ðMR4×mnÚF&úU3ì;^B&ꚆS"Sq=£¤ô äÎýw^†Bgèf4Òy–Åàd¶ËÏr(lèPO=„]éŠàɉ ºÍÒ¡ØՊvÎËív”£ Ԋ0ÖákєôN¬Zè¤ó1ÝJiçbܪs‘/‹•`¹æX®ãtS‰sL^Ì(GÀî½Õ˜«â)I¨|“§z ¢tBT¢¢’ •ð䍈šî‹f ºÞ®¼Hÿ] ß<\6oþ&”¡¥'àݓa4}~Šð+wš{¯ãë8ŠEr.úItF‰_À÷>FvöD*_Åž2 3ýøT7v}¼Š#r̀ƈ瀊*)èX@K@øGyóÉNÇq—×oŽkcÐ2Ú[.Á6±03§I³ëë38×Bã6&®[HXí›.µvßýŽ+GÛíiÔL!M{;Íë13…M>H±ñý>::N=™ìè5À!·§âTg%›Yðv/#]EÏÈÔáôôYó!=¨ DéG‹µk= ul7Žñvï—Ømœ` ïâ‹]\ƒi½À$ìž[!Èß·ŸGî:Ë@*û­#‹GÙ.víàË؞…;lÚ¿A`p–€ÕÚÉ¥XÛÐ<òá¹µÜL@vE¶êFùÔªpÌÞYÿÊëvŸ=…5ÂuHºÄWàšœñ –‚N/zªQƒ,ý­ B¯z:fîßüz™yªÇŽÇwùÿ†ôâ3Ÿ>þK!$^­JÀÖéAØ´A¾ú§ipŽnŸ^d¸–í]¬›S%oˆ‹"w†çǯÊz×ù©Ã4ÓNk殮y=³\‘´ÏhÏ{×IÕÁ‰ZÄœ5ÑéÑ U—â«p̾ø/ gfó‰&´O™.Ïæÿ㥁 KÎý‹—ÿ+˜;äUF$áŸi*%JI\ý ®D¹ÎðXÔp†_¿'êóק¾ï²Íb—-Â|üۚ³üëtý«¶ÕŸœÏ­qÂ?³ÍÎ;1øæPþè–ìÒ5è¤TÈCdTÆmûï$”ÀoQ[ûǍ|¿/UÒáxÙ4Û?ßÝí÷{’×d·)¶)š;ïÝ©ì‰0@›J;̈́³¡ˆ×eŽ‹Å:י SC½žþ W}7& +endstream +endobj +2061 0 obj << +/Type /Page +/Contents 2062 0 R +/Resources 2060 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2077 0 R +/Annots [ 2008 0 R 2009 0 R 2010 0 R 2065 0 R 2032 0 R 2033 0 R 2034 0 R 2067 0 R 2035 0 R 2036 0 R 2068 0 R 2037 0 R 2038 0 R 2039 0 R 2040 0 R 2069 0 R 2041 0 R 2042 0 R 2043 0 R 2070 0 R 2044 0 R 2045 0 R 2046 0 R 2071 0 R 2047 0 R 2048 0 R 2049 0 R 2072 0 R 2050 0 R 2051 0 R 2052 0 R 2074 0 R 2053 0 R 2054 0 R 2055 0 R 2076 0 R 2059 0 R ] +>> endobj +2008 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.356 698.319 358.294 709.223] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_52e2499c42a9be1e527642cbfb16ff8c) >> +>> endobj +2009 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [371.36 698.319 444.754 709.223] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2010 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 698.319 513.996 709.223] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +2065 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 686.364 190.738 697.268] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +2032 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [140.453 638.976 354.718 649.88] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_ebe78c4ede3d49c63765e71cfe93904e) >> +>> endobj +2033 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [360.881 638.976 434.275 649.88] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2034 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 638.976 513.996 649.88] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2067 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 627.02 180.776 637.924] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2035 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.86 579.632 430.484 590.536] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_819d233e9b1442e06c806dea0523a2f9) >> +>> endobj +2036 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [440.054 579.632 513.996 590.536] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2068 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 567.677 129.857 578.581] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2037 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [155.262 567.677 254.668 578.581] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2038 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.539 522.065 357.689 532.969] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_304dd0846a62cb4a9f79806ea82cee5d) >> +>> endobj +2039 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.937 522.065 436.332 532.969] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2040 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 522.065 513.996 532.969] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +2069 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 510.11 210.673 521.014] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +2041 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.484 464.498 370.879 475.402] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_f93c7e3e554a92e8d3eeb4cf4261debd) >> +>> endobj +2042 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [380.073 464.498 453.467 475.402] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2043 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 464.498 513.996 475.402] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag) >> +>> endobj +2070 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 452.543 210.673 463.447] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag) >> +>> endobj +2044 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.965 406.931 362.74 417.835] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_bf1bb44cdbf733e9ca39164f9d8e8179) >> +>> endobj +2045 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [366.415 406.931 439.809 417.835] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2046 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 406.931 513.996 417.835] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4aa820c3f87b201ce364e854aa37dba5) >> +>> endobj +2071 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 394.976 217.298 405.88] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4aa820c3f87b201ce364e854aa37dba5) >> +>> endobj +2047 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.925 349.364 375.946 360.268] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_8948143df881c58c79da34380f847401) >> +>> endobj +2048 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.581 349.364 456.975 360.268] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2049 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 349.364 513.996 360.268] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag) >> +>> endobj +2072 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 337.409 217.298 348.313] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag) >> +>> endobj +2050 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [140.392 291.797 363.215 302.701] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_1bd806c292d0576b94d3084b21736061) >> +>> endobj +2051 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.317 291.797 442.711 302.701] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2052 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 291.797 513.996 302.701] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2074 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 279.842 180.776 290.746] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2053 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.838 133.893 343.717 144.797] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_879f2f2b0f967fa73cb59ea8d8b1d255) >> +>> endobj +2054 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [353.265 133.893 426.659 144.797] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2055 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 133.893 513.996 144.797] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2076 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 121.938 180.776 132.842] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2059 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +2063 0 obj << +/D [2061 0 R /XYZ 90 757.935 null] +>> endobj +2064 0 obj << +/D [2061 0 R /XYZ 90 713.289 null] +>> endobj +2066 0 obj << +/D [2061 0 R /XYZ 90 655.968 null] +>> endobj +2073 0 obj << +/D [2061 0 R /XYZ 90 308.79 null] +>> endobj +2075 0 obj << +/D [2061 0 R /XYZ 90 148.848 null] +>> endobj +2060 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F23 144 0 R /F72 202 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2120 0 obj << +/Length 2025 +/Filter /FlateDecode +>> +stream +xÚíZIã¶¾÷¯Ð-6³¹ˆ•ÜÒydżL?ä0 ›¶…±%?I§óëSÜ´YmËÝîä$ŠæR¬ú¾Z(ã`à໛oîonßÄ(T÷Ë ÆA$â”÷‹àý$B$žÎÆx²ÛmÞN)žä›ÇµZS"'yöP%«éŒr<ù>«T±Læʾþª–ÊŒQ™é"!でÜÿpóŸû›ÿßÄlÉ#1Ì·7ïÿÀÁú0b± fÔ6)ƒç&xwóßìÄÇícpÜ:!0#¢ aÁíY~§”›íý¼àýŒÃÁÒ¬rÝZœbåäúÕ `˜˜“gjJùäðp÷ð֝ξ,òíÃ/¿túiµ~˜çÛÝFM Ÿü™VýM¦“ß1ÇOîjuݬYuV¸}CÛ&c…¶Ö¦=%ÆLïi$D±¬Çìvë/ŸÚ|ÆDŒÂ( f„ ˜s?c‡ÊÊêi±à`ÚîziÓÐj5®2àà¤3¯9VD ‹Ð˜0D$b œŽ;4~³O7‹r:c4ž$öqg;ʐ(m_µN*ݒ“d·³¿ü™n“J¹Œá¦²´kt˜iD¡Dë‘×Ú[Û1]q1Š„`a<ٗi¶rÒfN’Í*/![Û}X祲M§%à—‡L0£ V¥”€A ±]|‘ëhÅf¹Ó°6Wj1 =—HRéE³Ûø-z‡à Eq=ôk»øäõ;&ö±N²ÅÆñ|™¶Q­]Ofl}Ø<:óSMè}a;ú¶2 »“$‹…^–C† üQ؂ñ%",öcÐ ÖÌuH2cCôÈ'ò^C‚¯h{ž0~£ÝÓß@RqM*¡‚ŽðtŒ‡x?‹EÜò3 VL€¿qÞ[\ìŠCÙõ”sÃ0ýUÛÆ1̸s º•úiö1Ïw¶•/ýPçp2¼Ü8D,zÖKð¸C°¨E°Zœ†`ܬ–ˆw Æ;snt>³ã6žÏ:IP„Éy҅Ïã¡…€¼;†E®«Ï±îßXýÄj*¥å&<-7¡qFèsܔCáZ÷Ž Ö༥Œ. ¡ÖA,}´nËۊÖúÕEkÝŽÖ‰Pü­_+Z7èëÔ,3&#„¹~"ú7+}«ÊªØÏ+Þ¥v þEúÎ6}@Ӡݼ´Ëœ¤ÇçnÁPȯ/Emj£*u"1ðҟvGcÙ?–ßT›tcï÷Ù4ēOÉ&]$5âjT9Ì Þ$Ê»õWC˜€&©1Q­S·ú6ù8%À÷Zî-øz[Ïór—g Ëièv}¹4÷‹ÒÍÆÓxðIeÕ>Ùx6|PíÉ•”jñ<Œ&—B§˜RçÞì³y•‚±ü<±¾Í*½Ïø9_¤ËÇÞI«ñ«-x•;(ûéVeeúÚ ýr¼$ÕãN Ȃ!òKòv,k ä`sÞåÍo-]å ä­ _Ûzè« Ò°Ã¡Ñ¾õkËX>©Æ{9ÔgóMn"ß±$‚‘`—d´—e~:Oå`Ž—g~˜LŒÇƒÒìó…&çáëASÆá048»ah +6x¦D!¦lêÅÀàž¬-lO ­úÐ:*D3·.ÉVa˱ɲÜÌóƒÛl¸Ü—:«Ño:ów㬐ҋ4%ö z4‡ô´rJiÈb^¥LòG@¡Tôj.ó&­ðôÃ>ë:5§:—9shÜÔc>8ªí²D(/ã ¤N"¾FñEH(ú,Ô&ÑñÍZwšEEÒ¬R/næ^ƒ†VˆS<$,ÂGw€Z!»ET#ì0Ùç/©îÖj®c÷Ç~Úäò £4ŸT¥²Þ¸³—ÚuǂÇQMH؎)­y›õ6b¢vPó¡±è¹ÁA¯‰ÒËBäd~§2U$ŽË]<ÉkSò3À é(`Ö²ãrõ,\ÒÏ —+SdÊBÓY­MhD­†‘)Ÿ LX›û[âèÀŒ£#\®Te`\OÙ_RϸÍÎ'цj­Õò†ÇÀt÷»Ç²RÛ3÷_1$ė]ÍËñI £Æ.§‰ŽÓí¤å׎¯Fªü´ÿ³™³9¤Ë¸•Éhê +s< (mn=Æ°`ԍ ¨Ó¶ê®ýy’^#[‚=ýU±×_Œ ¯g\ú †ÓЏ„è"ßIôY#|DˆDž„jÇ1*9æŽ/OÛ·c;w¿Ïá”M1eã?Ö^H‰MNór +ÄÇ5«¦À6ÍÒmú—ZœŒW*[ãse+!îKæSY‰8J—Ç°J;ÜX`ÔÉ Ø $ëk——ǁÚ"¯b)/¹ ø» ,ÐW rÉ0¼'¢8<Ë ç/ N?¢…ž~ Z1N~§ñÈ"ҏ1¬ˆ)Š0}iŒèÿ¹JHS?üo•ÿ/•@q²ýKÍM”ÙòÞÀ™±É[Cb«ÙÄhý¥?±¿þ”~(’âѾÜÙ!?%ÙjŸ¬Ü|û1ËÛËHèú_©Š/ôFi'üœdûdcÓvý¤·T…»å„NŒÀ•S­4… NÞ)§f5ð1ð­o +šsÑP¢FÛëªÚ}u{{8мDû,Ý(­nÁȷǗêÍ"Ê(×¼±Ÿ×@°m^({†4ƒÎ­©œPßN€Xý† +endstream +endobj +2119 0 obj << +/Type /Page +/Contents 2120 0 R +/Resources 2118 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2077 0 R +/Annots [ 2056 0 R 2057 0 R 2058 0 R 2083 0 R 2084 0 R 2085 0 R 2123 0 R 2086 0 R 2087 0 R 2088 0 R 2089 0 R 2090 0 R 2091 0 R 2092 0 R 2093 0 R 2094 0 R 2095 0 R 2096 0 R 2097 0 R 2098 0 R 2099 0 R 2127 0 R 2100 0 R 2101 0 R 2102 0 R 2128 0 R 2103 0 R 2104 0 R 2105 0 R 2130 0 R 2106 0 R 2107 0 R 2108 0 R 2132 0 R 2109 0 R 2110 0 R 2111 0 R 2134 0 R 2112 0 R 2113 0 R 2114 0 R 2136 0 R 2117 0 R ] +>> endobj +2056 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.618 719.912 410.855 730.816] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_8b280d026e0c343ec0d3f5521dda6376) >> +>> endobj +2057 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [415.183 719.912 488.577 730.816] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2058 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 707.957 224.501 718.861] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2083 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.838 662.129 343.717 673.033] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_f29cc9becde5f28a37567093174d6855) >> +>> endobj +2084 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [353.265 662.129 426.659 673.033] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2085 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 662.129 513.996 673.033] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2123 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 650.174 180.776 661.078] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2086 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.618 602.353 410.855 613.257] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_680aecc71f3b21fa0db03c7d1cbe466b) >> +>> endobj +2087 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [415.183 602.353 488.577 613.257] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2088 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 590.398 224.501 601.302] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2089 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 506.024 232.521 516.928] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_dc7cd513e31b7ecdda3a25a967d8a772) >> +>> endobj +2090 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.337 506.024 335.743 516.928] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2091 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 432.609 277.352 443.513] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_9947be8614cba5c2e8b02771d48fc7d2) >> +>> endobj +2092 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.168 432.609 380.575 443.513] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2093 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [396.017 432.609 479.373 443.513] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +2094 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 395.747 277.661 406.651] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_50d5c68064e215d3f2cf3ee69896e676) >> +>> endobj +2095 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.477 395.747 380.883 406.651] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2096 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [396.326 395.747 479.682 406.651] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +2097 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.033 347.926 317.283 358.83] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_b1d03e0aac8dda484b102c536c612a45) >> +>> endobj +2098 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [330.026 347.926 429.432 358.83] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2099 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 347.926 513.996 358.83] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3) >> +>> endobj +2127 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 336.345 176.352 346.875] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3) >> +>> endobj +2100 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.429 301.102 315.995 312.006] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_6c5a2f9b4702c1a0ddfcc9c6eb9b92bd) >> +>> endobj +2101 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [329.134 301.102 428.541 312.006] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2102 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 301.102 513.996 312.006] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +2128 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 289.147 174.668 300.051] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +2103 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.341 254.277 276.288 265.181] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_85417db0eb420d402acee4ef0d842efc) >> +>> endobj +2104 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [287.339 254.277 386.745 265.181] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2105 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [418.466 254.277 513.996 265.181] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +2130 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 242.322 164.178 253.226] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +2106 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.223 205.461 279.796 216.364] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_2dc649f0ee90ea5af999e3c0bae54bcb) >> +>> endobj +2107 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [287.728 205.461 387.135 216.364] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2108 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.84 205.461 513.996 216.364] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4aa820c3f87b201ce364e854aa37dba5) >> +>> endobj +2132 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 193.505 164.178 204.409] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4aa820c3f87b201ce364e854aa37dba5) >> +>> endobj +2109 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.08 156.644 323.629 167.548] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_27fdc62bc2cae150c7d710a8e312a40d) >> +>> endobj +2110 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [334.419 156.644 433.826 167.548] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2111 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 156.644 513.996 167.548] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +2134 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 144.688 210.673 155.592] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +2112 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.521 107.827 328.695 118.731] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_6d147411700f558d74d8273accfb8e04) >> +>> endobj +2113 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [337.927 107.827 437.333 118.731] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2114 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 107.827 513.996 118.731] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4aa820c3f87b201ce364e854aa37dba5) >> +>> endobj +2136 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 95.871 217.298 106.775] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4aa820c3f87b201ce364e854aa37dba5) >> +>> endobj +2117 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +2121 0 obj << +/D [2119 0 R /XYZ 90 757.935 null] +>> endobj +2122 0 obj << +/D [2119 0 R /XYZ 90 679.23 null] +>> endobj +2124 0 obj << +/D [2119 0 R /XYZ 90 521.102 null] +>> endobj +2125 0 obj << +/D [2119 0 R /XYZ 90 447.687 null] +>> endobj +2126 0 obj << +/D [2119 0 R /XYZ 90 412.848 null] +>> endobj +2129 0 obj << +/D [2119 0 R /XYZ 90 271.378 null] +>> endobj +2131 0 obj << +/D [2119 0 R /XYZ 90 222.561 null] +>> endobj +2133 0 obj << +/D [2119 0 R /XYZ 90 173.744 null] +>> endobj +2135 0 obj << +/D [2119 0 R /XYZ 90 124.927 null] +>> endobj +2118 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F23 144 0 R /F72 202 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2191 0 obj << +/Length 1932 +/Filter /FlateDecode +>> +stream +xÚíZ[ã4~ï¯È©Äx|wo ‹Ë vWU¦uۈæB’Nwøõ_ÒÛ¤éeº0Hó”ÔuÎñ9þΗώq0 pðýà›»ÁíɂŒÊànÄ8P’ AIp7 އ +‘xxC0ÆaY.F¿ )‹Åã\Oª!‰Â"5ÉlxCÈ]M“±v?ß驶}tn›g"”døñîÇÁwwƒ¿†€b] +…Á8¼ÿˆƒ ´ÿ`Äâ(XÙ^YÀ)ƒë"ømðëûáï_m8Š„#¹ ‡pŒ(Ü*Ê–ÂÅôG•6º†!É(L@@L…º®Í!+bˌˆHãß>_Ž}Ÿ]Wœ·}gv\äµ÷0OòÉÂ$BÆaSx¯îR?֍ÎÜ}1u×,ÍÓ,ý[OֆfÕÒ¤²xYVC.ÂâSš%MšÏ¼å¹vÿ—v–nÌ@ƒ›ˆ!…Uóˆb»NÜãyG¸ŠRrî¼+ZŒXò]ÕCÓrûFà-ˆÝŠ˜¿¡©Èæ¥bÇHðþFèÒ¼ñÍ*ÕÌcæí``fQé hLë‘ÎÊæqߖéú |И5d§kÛ\Óe§œƒ%Òò^– BÉ ä¡ðk#}§›e•×®Hw)‹:mÒ_9³rΆ‡PC®qÚ5Q˜ N¢þ™äcÒvI½c›¤¯Ý½þÖ¨pK%‘¤â¸Gºï1/š-×C!ÎD ¥à9R6×GÍ2O‡T„C" çµ~P?€¼cHۃ¡yÖºŠ=Xv91wõØØËyè LÁ6N¹/–ù¸ø偂¿$Pø4]Â+‘D8æø\æÞë™tÂ$"B|ÄÀŒ7Iš×#›t`”™®Fe±1óJ+{³ÙfÌ»÷t°ÐIío‹¼o6·G`W€6ªVim'ärv¹>¹4pf1KÇÉbñ8/ŠúE2͋zý¸œ>o®Ù%ïþ!T!Ç e-lzÇt&;)…ägÜ$­Ç•n^5ÎiǦËaÉ;¯usÆ0¬|bõŒõ éLˆÁ2ŒŠè³½ë¦²„~Ǝ£ëËã㙤™ÎëÔØx,;Áþ`$Rý¯_›góBks½g’ňË5«=$U—IPBkåu ®¹DqLÏö¤ÐûÀމ¤k &BLœÈyÕÀà O$y>ãFüI1X}Z¦U‘’ûÂÄ薙ûÆͳ×à_;†¾ +‰#µeêmšë¤¹½¢ð¤@Š…ß/ûîSYéÚRW-ô©D8"Šýk´Ðç®\܏©[¼f~L÷ö¾M‡ã˜¢øè~™<±Æž!T)?ô +(¦²Å÷tPçê ò ñ*6þ{,ãWŸŠ`3]«#荣—‚߈DÏ°ÂtÀYòÉVi3ï^›§®_…I?|#ÈÌuà+””ô¸’"²®¾-ôthËÓqªó¦ÛV½,Gy¯¹øtsҚ›|9´ù„ß¾¡Û_œ–ˆ‹5¶Às½vÁQm†ÊevBÔþƒtr¶—Öïu®«¤)ªÓ äl^ (jÅôšU†¶xÁ4>áÛØÍ  ÕXr³…–zÇVa×fß}HÂG÷+É']*‹#̎²O‡—5ûÛö±‘oޟ.æ.’ˆI~:¢·¶¬ÍÕ<²™»Ÿã¤öÎÌç0Ìt÷€Óq`ÉQ×C²XzÎ6 Úetƒ_{»~³ÏØGˆ8=ƒÀ©ÄÐêâvC<ñŽ¼FÎÊesî^‘zāS Š Ð.'U¦ØRDy^Ý7gz_ƒL­×>2å˜=%Ó>ÎdŠöqfŸÈxv!~„@ÛÕéæ zÑA ¸G0~’}=•Ýn(ˆqº«{îÌ·f&IX'™½£aR»wV ڜ°ƒº^Á¦’£8¼7 –{Úü[´?šÖ ´”®‘ú²˜-aï»M‹j¯ÿ¢'Mê>pCP;•¿©`·s7owQú¡UZ»{îΞßCxö®‹âäI1ú3} +žºŠÂáÇŽd§(y\áHqDá¨Ó%‰±•æÓÞ½Àœ)PŠãÂQˆr^š©ìU8í0× +‡"ÓÿZáÈç)qtóKFñ…#ýÉ7˜ƒò†œ ozԍÜS7~mÕ§l8‹ÎT6²[ÙȃÊF°]~KsƒÚkÊ#E^’ªðFÔ«ñJ¤§ît\Oš#Ò ÌQ:J@ýóKˆôt¥#¡`ãN¥c–³NéÀU:JT:O¡q¬¶”<½Q:ð£i½¬•Žñ³«t Å)íþ—(Ã q‘ÌÙ?Ñ)!¥À´'è´7a%Š¥;‡*b$ߚÊXø‹ýBPe†½ ÛÊJÜ¿oÓû*©ݏo]—·I>[&3ÿ¼;¤j^Fî *4ý^ëê s­vüœäËdáþ3Þ 3 ¶A‚©A‚ücþ¦ÛŏËÀŸA{÷ÓÀòè&.Ê#´97ošò«ÛÛÕj…Æ5ZæiY¡´¹LÝîd{/9Ä(þÍ·j 3°¬¨´‹j©¨2 ŠÝyƒyú•Û© +endstream +endobj +2190 0 obj << +/Type /Page +/Contents 2191 0 R +/Resources 2189 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2077 0 R +/Annots [ 2115 0 R 2116 0 R 2141 0 R 2142 0 R 2143 0 R 2144 0 R 2145 0 R 2146 0 R 2147 0 R 2148 0 R 2149 0 R 2150 0 R 2151 0 R 2152 0 R 2153 0 R 2154 0 R 2155 0 R 2156 0 R 2201 0 R 2157 0 R 2158 0 R 2159 0 R 2203 0 R 2160 0 R 2161 0 R 2162 0 R 2204 0 R 2163 0 R 2164 0 R 2165 0 R 2205 0 R 2166 0 R 2167 0 R 2168 0 R 2169 0 R 2170 0 R 2171 0 R 2172 0 R 2173 0 R 2207 0 R 2174 0 R 2175 0 R 2176 0 R 2208 0 R 2177 0 R 2178 0 R 2179 0 R 2210 0 R 2180 0 R 2181 0 R 2188 0 R ] +>> endobj +2115 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 686.164 245.263 697.068] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_4b5f126aef2ca062b034f795f6e5cf6d) >> +>> endobj +2116 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [249.079 686.164 348.485 697.068] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2141 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 649.551 253.711 660.455] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_357ddb19493a385970c56bf4847a07a1) >> +>> endobj +2142 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.527 649.551 356.933 660.455] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2143 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 612.938 254.668 623.842] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_b4f7535037080c7f5db32b2e85fdc80d) >> +>> endobj +2144 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [258.484 612.938 357.89 623.842] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2145 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 576.326 299.898 587.23] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_9e5f40dfc278c52da81291b30fbe75f7) >> +>> endobj +2146 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [303.713 576.326 403.12 587.23] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2147 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 539.713 303.374 550.617] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_39ee8e60c1d4d6faa40986d8fba28d5d) >> +>> endobj +2148 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [307.19 539.713 406.596 550.617] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2149 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 503.1 251.34 514.004] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_141c3283de2a46f2fcb278dcdca0558f) >> +>> endobj +2150 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.156 503.1 354.562 514.004] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2151 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 466.488 249.128 477.392] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_e1e938f0c844231dfe2098ab8fbca67b) >> +>> endobj +2152 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.944 466.488 326.338 477.392] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2153 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [341.78 466.488 425.137 477.392] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +2154 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.983 429.875 296.212 440.779] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_b32d3b44994fefe43c44e353a47cb4a4) >> +>> endobj +2155 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [305.905 429.875 405.311 440.779] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2156 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.977 429.875 513.996 440.779] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2201 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 417.92 179.112 428.824] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2157 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.84 381.307 296.676 392.211] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_7135823ecf68cedd5236d53e2b5541f5) >> +>> endobj +2158 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [306.226 381.307 405.633 392.211] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2159 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.977 381.307 513.996 392.211] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2203 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 369.352 179.112 380.256] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2160 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.607 332.739 300.683 343.643] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_93cee014592562084126f06fe47efbba) >> +>> endobj +2161 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [309 332.739 408.407 343.643] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2162 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.977 332.739 513.996 343.643] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2204 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 320.784 179.112 331.688] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2163 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [199.11 320.784 270.591 331.688] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +2164 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [307.197 320.784 378.678 331.688] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +2165 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 320.784 513.996 331.688] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag) >> +>> endobj +2205 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 308.829 174.668 319.733] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag) >> +>> endobj +2166 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.327 263.125 249.243 274.029] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_1dd00b705631c579994677fea3a86d63) >> +>> endobj +2167 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.28 263.125 353.686 274.029] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2168 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [371.875 263.125 500.601 274.029] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2169 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 251.17 196.576 262.074] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +2170 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [225.856 251.17 297.337 262.074] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +2171 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.996 203.598 299.418 214.502] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_0e494452cce5a8916f4fe97a1c79e237) >> +>> endobj +2172 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [308.125 203.598 407.531 214.502] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2173 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.977 203.598 513.996 214.502] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2207 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 191.643 179.112 202.547] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2174 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [200.908 191.643 272.389 202.547] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +2175 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [308.024 191.643 379.505 202.547] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +2176 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 191.643 513.996 202.547] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag) >> +>> endobj +2208 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 179.688 174.668 190.592] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__tag) >> +>> endobj +2177 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.996 133.984 299.418 144.888] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_ee4d567631589e83063cfb8f80c2bd6f) >> +>> endobj +2178 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [308.125 133.984 407.531 144.888] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2179 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.977 133.984 513.996 144.888] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2210 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 122.029 179.112 132.933] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2180 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.784 122.029 263.265 132.933] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +2181 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [289.776 122.029 361.257 132.933] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Coefficient__tag) >> +>> endobj +2188 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +2192 0 obj << +/D [2190 0 R /XYZ 90 757.935 null] +>> endobj +2193 0 obj << +/D [2190 0 R /XYZ 90 703.202 null] +>> endobj +2194 0 obj << +/D [2190 0 R /XYZ 90 666.59 null] +>> endobj +2195 0 obj << +/D [2190 0 R /XYZ 90 629.977 null] +>> endobj +2196 0 obj << +/D [2190 0 R /XYZ 90 593.364 null] +>> endobj +2197 0 obj << +/D [2190 0 R /XYZ 90 556.752 null] +>> endobj +2198 0 obj << +/D [2190 0 R /XYZ 90 520.139 null] +>> endobj +2199 0 obj << +/D [2190 0 R /XYZ 90 483.526 null] +>> endobj +2200 0 obj << +/D [2190 0 R /XYZ 90 446.913 null] +>> endobj +2202 0 obj << +/D [2190 0 R /XYZ 90 398.346 null] +>> endobj +2206 0 obj << +/D [2190 0 R /XYZ 90 280.164 null] +>> endobj +2209 0 obj << +/D [2190 0 R /XYZ 90 151.023 null] +>> endobj +2189 0 obj << +/Font << /F63 177 0 R /F72 202 0 R /F65 179 0 R /F50 143 0 R /F23 144 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2255 0 obj << +/Length 1788 +/Filter /FlateDecode +>> +stream +xÚíšÝ“Ú6Àßù+üV3“ÓI²$[íS›ö:M“iš»L’̍¸›Ø&ò×wõaóe Ð\oú„mä•võÛÕ®dì =ìýÚùé¦sy%O")¨ðnžÄ^(â”x7}ï""»cìO§ãÛ×]Šýl<©~Þ%‘Ÿ¥·e<ì^PŽýßÒR僸§ìí5P¦JÍ#Âî Úýpó¢óËMçS‡À°GL—^Vƒã%5 ‘€7B ,¸Õå=¥Üt_½ç½»à X’–î±N>tãzcX֠͝q/KË8I‹¥gëb‰¤þ{ÌñV¹F&*ÊeÉ妜Àÿòlûè(fHšÃÈÊÕïåUH½Ì'˜6¥H0âÁ<":ë½Qå,O ;¹±ý™fER&ŸÝŒƒU—aØ%؇¹·ºC Œ/É'˜ F"èڈþb›¬ AÏ©T·"³J´»WŸfñØ^–YCoEŒñJÖ¼¡3Ž‚z0?XIy7ýe•q­ý-ío?S®Aš•¨Ñ¸ #¯0 +.!Ç.(âQx¤—¤]âW ežôÊñ|`µ„Sñ¨X˜y²$êB·„‰`"ò.A’;ÚÚúÐÆÞe  ¾9ÊÕ¤X‘5؛‚¹Da=>j‰(‚Ž-µâ(j£õК·ý¤ø;ƒ÷ny6i%6:±r±¸•XqNb¿=°qÚo’‘¤N-„ÖB,˜>7Ã{2[ŽT7û9í—%/gHÊà!—H¶¯]‡ˆßž°%ìd‰;<1 …QôáÔ´™‹"ž¨J—ð2 ïñÔö¡ äÅ:=ÖÓ3LPÈÙ åVþã÷¦Øu +bMg£ƒAk +‚`¼Øþ,qFdgФ‘3) ÓQ"q"ª&‰ë÷^ÇöjåÕ7”û R]Â}dn™…@¨´m‹¸LŠ÷SU ¿’’”îI2™ŽÕ`€¦6œ>Z›ÏqžÄ)´#f•§r…=½Á:ƒÅ.0,HÒÙ©]Ä_å£xêhÄ‘Üm‘MꐚªÍC)”„B¶›Š.LWLâî¬Ù~SÔ½àâm¡3—¼ªÄ¾¯ît93ó8LRW`Ng9Ì·*tAQDè B~ƒ»˜Yÿuoo'j’åóÛ$½½›—ª8¯#=s—|U¶Éå].äéaXOÀØV+ցH-RÓ¯ûzçE„Ú¨KþùWž”OuXÀØ¿îl8‹àne³ûj͸ËfÍÐÃZ¼KTˍk=¯Ç“ ÖZÛ¹ª|! i†Ì~õrƒB.%a;ü¢r퇱`(U£è<¬–Yùè "‹Ò¼RúH'ÊJí÷?¥Sº°ïÊV!ؗ#©+Á@ .\6x=­wN`=+ìj·¯ín`¡waU«ÃúÕ,íé5¯š”QìŠÔW±SýU)Ó|Í6›[‘+J¬o +ܤLŒŠÓúUÜï[‡ÈãÅ«:Ô>®´sLÖ+Ÿ×CiÕ{P +æ¼çÇ~5ÑïeÓùx­MôYÙe#Ù&[©6ùvåé›Î4/J5Yí~µ×…c5u×<:[0§Ô äy‚¹ƒn˜ÏÌöú#€Î å”Ð=ˆ¹%“¬O8dÉ +¦Cy[­ÿZˆ°š¶(ñ@ž3eí9yr‘£xLQìÚxù®Š ¬}BMq„/òë^±3™øF!N<4]àÃÉ@—Ö·$#ìH MŸm@2.š#œrëÙő¤6XœÕeKnì—AZ„ù1œ®ÅȆØÈ–â|‹-TùŸ¢Êgib1W=íqóÞXµFJýú‘`ê´‚Z07cäّ\Úö] yl„y2z²Q’ +0N°_+©ÜÍm1SÒèH4ÍF­‡e2ªØ¬ÂåV(O³°Çf[T$ÑÅ&ñ2*êm:yž“‚\é íTÝÞ'åèéÀÕ„Uº‰!„»7Æk\fE½²³V&ÚJ½Ýû@L•(Àì<•Å'O»f%ge{ Ñ$dd$Q3#ëŸä x‰Dû~‘W}' ¡û!!—¦Ü6Ý˜þky>Ñyl@ë¯&bûïËä.ÍŽ'Ü<·M^ÆépÝûö+C½ƒh÷áÑÛBåßu9÷ û«8µ„Áš¨ÏºK•»Hx¾„ÕÓ«O¡0ó¯U…£µÀG¯ºú½cl¼Ð‹²-ζFe9ýþòòþþõ +4K“iŽ’ò »Ü܍\!°hqY{«=ø‚M²\Y’TŸ/š³Àyúÿ*r, +endstream +endobj +2254 0 obj << +/Type /Page +/Contents 2255 0 R +/Resources 2253 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2077 0 R +/Annots [ 2182 0 R 2183 0 R 2184 0 R 2185 0 R 2186 0 R 2187 0 R 2259 0 R 2213 0 R 2214 0 R 2215 0 R 2261 0 R 2216 0 R 2217 0 R 2218 0 R 2219 0 R 2220 0 R 2221 0 R 2222 0 R 2223 0 R 2224 0 R 2225 0 R 2226 0 R 2227 0 R 2228 0 R 2229 0 R 2230 0 R 2231 0 R 2232 0 R 2233 0 R 2234 0 R 2235 0 R 2236 0 R 2269 0 R 2237 0 R 2238 0 R 2239 0 R 2270 0 R 2240 0 R 2241 0 R 2242 0 R 2271 0 R 2243 0 R 2244 0 R 2245 0 R 2246 0 R 2247 0 R 2248 0 R 2252 0 R ] +>> endobj +2182 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.536 719.912 292.284 730.816] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_5a6342bc4e04c1f228d210e5c363b6d4) >> +>> endobj +2183 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [295.53 719.912 394.936 730.816] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2184 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [404.37 719.912 503.777 730.816] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2185 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.168 671.75 331.574 682.654] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_bcf3ccb8e2e224496d1326e47e15fdc6) >> +>> endobj +2186 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [341.452 671.75 440.859 682.654] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2187 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 671.75 513.996 682.654] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2259 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 659.795 180.776 670.699] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2213 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.166 623.587 331.582 634.491] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_a309e957fa5f404b296e2e4c30e1697d) >> +>> endobj +2214 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [341.458 623.587 440.864 634.491] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2215 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 623.587 513.996 634.491] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2261 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 611.632 180.776 622.536] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2216 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.543 575.425 284.541 586.329] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_f777de5ca96f8d1631d3500008bf84f8) >> +>> endobj +2217 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [287.794 575.425 387.201 586.329] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2218 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [396.649 575.425 496.056 586.329] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2219 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 540.883 223.116 551.787] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_f98013213e01ca8514b6dbd20116af4d) >> +>> endobj +2220 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [226.932 540.883 326.339 551.787] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2221 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 493.717 317.601 504.621] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_3e07a3e1a6e6c9f281227b4e215a3dc7) >> +>> endobj +2222 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.417 493.717 420.823 504.621] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2223 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 457.51 303.375 468.414] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_01daecb5bf8e498e7d539d7f3ba8496e) >> +>> endobj +2224 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [307.19 457.51 406.597 468.414] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2225 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 385.894 267.39 396.798] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_5a9b061c4408ab8d70a1dea91a6ff983) >> +>> endobj +2226 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [271.206 385.894 344.6 396.798] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2227 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [360.042 385.894 455.025 396.798] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3) >> +>> endobj +2228 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 349.687 274.015 360.591] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_191744753f79b939c8d61efe45778bd8) >> +>> endobj +2229 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.831 349.687 351.225 360.591] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2230 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [366.667 349.687 468.276 360.591] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g3b2653e715f41511257a84f35be7fba9) >> +>> endobj +2231 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 313.48 271.265 324.384] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_2f80d4608b0b75948b50dd862a14df66) >> +>> endobj +2232 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [275.081 313.48 348.475 324.384] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2233 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [363.917 313.48 493.221 324.384] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +2234 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.747 277.273 279.532 288.177] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_8abb894f6f4a673d549aa9bf7456b638) >> +>> endobj +2235 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [284.989 277.273 358.384 288.177] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2236 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [377.519 277.273 513.996 288.177] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4aa820c3f87b201ce364e854aa37dba5) >> +>> endobj +2269 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 265.691 129.857 276.221] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4aa820c3f87b201ce364e854aa37dba5) >> +>> endobj +2237 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.909 229.11 311.644 240.014] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_89c2384471ee03156c7b414dceee8f14) >> +>> endobj +2238 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [317.263 229.11 390.657 240.014] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2239 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [410.157 229.11 513.996 240.014] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag) >> +>> endobj +2270 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 217.529 129.857 228.059] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Constraint__System__tag) >> +>> endobj +2240 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.867 182.613 323.227 193.517] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_f818756f74f766dfb937e586565db8d6) >> +>> endobj +2241 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [333.804 182.613 407.198 193.517] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2242 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [437.852 182.613 513.996 193.517] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag) >> +>> endobj +2271 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 170.658 164.178 181.562] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Congruence__System__tag) >> +>> endobj +2243 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 136.116 298.383 147.02] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_d024f037803a208b74cd150eeaa5649d) >> +>> endobj +2244 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [302.199 136.116 375.593 147.02] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2245 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [391.035 136.116 486.018 147.02] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3) >> +>> endobj +2246 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 99.909 305.009 110.813] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_8ffc5459233ed9781c0ca910e88fa1f9) >> +>> endobj +2247 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [308.824 99.909 382.219 110.813] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2248 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [397.661 99.909 499.269 110.813] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g3b2653e715f41511257a84f35be7fba9) >> +>> endobj +2252 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +2256 0 obj << +/D [2254 0 R /XYZ 90 757.935 null] +>> endobj +2257 0 obj << +/D [2254 0 R /XYZ 90 733.028 null] +>> endobj +2258 0 obj << +/D [2254 0 R /XYZ 90 688.687 null] +>> endobj +2260 0 obj << +/D [2254 0 R /XYZ 90 640.525 null] +>> endobj +2262 0 obj << +/D [2254 0 R /XYZ 90 557.82 null] +>> endobj +2263 0 obj << +/D [2254 0 R /XYZ 90 510.654 null] +>> endobj +2264 0 obj << +/D [2254 0 R /XYZ 90 474.447 null] +>> endobj +2265 0 obj << +/D [2254 0 R /XYZ 90 400.809 null] +>> endobj +2266 0 obj << +/D [2254 0 R /XYZ 90 366.624 null] +>> endobj +2267 0 obj << +/D [2254 0 R /XYZ 90 330.417 null] +>> endobj +2268 0 obj << +/D [2254 0 R /XYZ 90 294.21 null] +>> endobj +2272 0 obj << +/D [2254 0 R /XYZ 90 153.053 null] +>> endobj +2273 0 obj << +/D [2254 0 R /XYZ 90 116.846 null] +>> endobj +2253 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F72 202 0 R /F65 179 0 R /F23 144 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2334 0 obj << +/Length 2329 +/Filter /FlateDecode +>> +stream +xÚíZ[“â¸~çWø-P5¨uµìä)™ÚMe3[µ™é<ÍLQÔàlâKw“_Ÿ#É ›žJvóùèèè;ß¹HØ[yØûóèO£‡}æ…(ô©ï=>y!ö¤O Ä{\zŸÇ‘p2%ãñn·™ý2¡xœnökµÌ&$§É¬ˆV“)xü—¤PÙS´PöçGõ¤Ì•˜G„31öÙäëãO£GÿP{ÄL)$’Lx‹íèóWì-áùOF, ¼3jëqÊàsã}ým„+õÏ}še |°,B$òA‚$ÑÀ.í ¥ÂhS¿æ}ž +XgœÕc­]¶ªÔühØ·†¨ŒÈÔŒi¢f/q±ž-Ò$/²„äÇÂõ»_°Àg¥K.N%Èñnýî¼z!FˆÑbö¾Ñe6Õïxâ~àMÁ¡Ö +Ÿöy¡¶§Sé-\ä .éüS>ü()ˆ }ŸûrD$É IZÉ+»;ÌÄÁx Â|dFîÖvHW$Cðz=¤Ìã¤ÂY±®fM=!blÍmƉcºÀG˜‡µ¬Eîš#Ù(„œkn×ÞÁ֔ø‰ìJ)’œß€.²^t­²R{Ô ºxÈoD—™ýº„à]tUº|Wtß]©Ï#+$ȇ-3dùˆ¬B–¸YzGûk¾ÎÕ¢ˆáG”çñ*qmÓm˜Ò^ßõëe!Õ'i?1`/Ÿ“.bL|š<ÖkvÁ†I„ «wêÕ±•:ˆz€vH‹Œ]}SJ€ ˜¬ß۟Ü 1J–V®Ý”ü˜Ù„ɱÊËMQý‘º/D8/­E€Já·Á’ÒЄëÛ ÏËr·SÙlž–ÉòW‹JŠ_Z³ý±³Ç®­dŒŒÊ(±¢ŒíWcKû5}r¡3@”÷â¾ÏS!D ?$—0€ ¾±Ð– €±ûâm?M¨C²jBÙo€?E[Ṳ5É$hS{Cd3ÍkÆ>Åëd^óNk#mXQ«Ïµ$b5»9´vš“çñv·‰Ÿö3ÙµQ ¥Å×âÌ!·í0ˆ·˜y¸Çg“¦»m¾+ojù†ó³|#¹¼LÂor—ÌØÞN~ExC[¥Šé.S¹Êžm¦“Û=ÒYÜbBƑNC\ÙSe™J’“ÀBD|Ò§°8ŠÛ AIwèLÛÃüañ¥îkክq~ÕM _-ʬ¶{d§Û¥y\ÄÏÊ>Ôù؄ãñJç(àmS*…Y>”àðYUV±ËQ*¯gIœö%*uô\‰ýHÒDmwžN˜.ØÝ?æ/Ö~4h‚ût[4éߨô±“ØË8ÿG +Ê\ÉOØG’¼MŽSÄ[5S›h—ÿ&νsœó”6­6ñԚØ!Ž3$Ú¢l®Š¥’£<»ÉêuƒÁE €ÜÃãÞ(m¢PÐR¾MõX¤`Ÿt/"€Ð&ÍËìm¡¼[Gžo´¼S4Ò´!4ÍcTÍcËAŸëöMr$0½Ã¶q_Ö¶…ÛXt2Ö175ßrøfº„³|Av·ÏIò*wúC îÆ“ï÷t˜(1BfÅ~§ºbÓ³Îà£ì–¼èçtirgC‰µ´ÐtÌ÷.‚ÂHâceÒ´ŠuJäp|DÛ5hhÉlRØvê8à`ž†8ž£Ì¥³IÚ·¶à]|“â¤Кæ“'mOýúm 4 +\%¯ê‹¡ ô­5–ùgp/ð™¯U‘”ÇÿV³ªi“¼V) +ڎ¤«°g”÷a•Óà¬R¿ U6P…¯h~먰ßÚTͼ¡viKû NêñÕý§M*]©9‘ºõÛ8Mâ ÊìÀ<&o´JŸŽf‹2þ÷Ž¹¦4„ &ëäæË-à)ý›<£*Cªs2Û¥±þ]B´ˆŠ‹h»‰iSݸç¼“´¿DyQM<×5OYA´î$ÅI’.Ê´¬Þ‚ÿúF8•÷8"!Á±GG¦S“ÄÛh¥NâŽÎM‘KO{‘$|ÜKV‘*XéRo€¼ž^Á‡8QQ6ûáUW×vZWö´Qƒ+÷©j칈UR¸%.¯&°ƒ¦çãDˆ±õ¬$J³m~.÷>×Q!]ãâ2ˁӉ¦xwØRoN{jŒG¦Çe!dŸØò¿öMdë䱫j—²àÄÚ8šo¾ÅK€»)÷èsyÑK-NG¡Æ +7åê¤çˆšR>ÀQ´˜aŽRËû¿£ÜÕQòržqQ¿~_Á'¾bNLÔr@d¡øf‡é»ÓA‰?Äað`‡©äu ï¡3ì0%–óÿ*¼ë q@”阆ï…:î#^S~¶GÓÝ÷‘Ož¦ý¾Dm7j¥•E¨Z–ç7îPIÉ4/Ս™Ú´ñ÷ +¥´° ^ä0†|Y¥›ùé]0Î +æ ÙɅ06Âtíʛ+aæÊWgFV á ‘×Ù¹U-à‡}< ÈÜV,‚)¯ÆÑÎ)ƒlìÏ!ÇuQ͂ÎJÍéCA=)vL +õh?=ÕÎÚ5Ô”Ú­tÙ-ä pˆÙ„rÉlPÔź¬vTFQ(t¬v}³6:dw oNÈ ú>—òè÷o­ HOm Ƞڀ bpc_űÌ.³6 åõËá{YwWw'ú†Œò}Sé÷6LŽè[§¹–\Y\_‹u±¸ý·Ò`±8ÌÔeq˜À°¸^›Å}(²™›Æá¥#×âZ׳]¢qaNçúh\膩0·ã‚ÛX\è=•ú' {H\þ“¸Àqжßj}$.03G«]CâÇ×´}x“Coi×·°! K0®½\.B$DeÛclü‹)p²­nH1Ú܈ì¿âye{ûã½ò!JV¥&sóÐÞ<×þgûðèï¹Ê~§‹§Ü¾ðs””æpþÓlÿ¬§TYU«ÀCŒ`“¨½Æ2e˜?©š¡­þéÕßþ:2žÝ®‹rؐ&?[Åî÷///h‘£2‰wŠ‹࿇ŽuŒC€½D{~ ŞUl›fÊ®!Nth\ódŸþ ±äz +endstream +endobj +2333 0 obj << +/Type /Page +/Contents 2334 0 R +/Resources 2332 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2077 0 R +/Annots [ 2249 0 R 2250 0 R 2251 0 R 2337 0 R 2277 0 R 2278 0 R 2279 0 R 2339 0 R 2280 0 R 2281 0 R 2282 0 R 2283 0 R 2284 0 R 2285 0 R 2286 0 R 2287 0 R 2288 0 R 2289 0 R 2290 0 R 2291 0 R 2343 0 R 2292 0 R 2293 0 R 2294 0 R 2295 0 R 2296 0 R 2297 0 R 2298 0 R 2299 0 R 2300 0 R 2301 0 R 2302 0 R 2303 0 R 2304 0 R 2305 0 R 2306 0 R 2348 0 R 2307 0 R 2308 0 R 2309 0 R 2310 0 R 2311 0 R 2349 0 R 2312 0 R 2313 0 R 2314 0 R 2315 0 R 2316 0 R 2350 0 R 2317 0 R 2318 0 R 2319 0 R 2320 0 R 2321 0 R 2322 0 R 2323 0 R 2324 0 R 2331 0 R ] +>> endobj +2249 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.648 708.127 307.801 719.031] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_0b031bedcfb70f485bab922596bce1c8) >> +>> endobj +2250 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [317.159 708.127 390.553 719.031] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2251 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [418.466 708.127 513.996 719.031] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +2337 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 696.172 164.178 707.075] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +2277 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [140.53 659.649 311.309 670.553] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_c655ac3a494c4f92bb02d0b9294bdd85) >> +>> endobj +2278 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [317.549 659.649 390.943 670.553] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2279 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.84 659.649 513.996 670.553] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4aa820c3f87b201ce364e854aa37dba5) >> +>> endobj +2339 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 647.694 164.178 658.598] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g4aa820c3f87b201ce364e854aa37dba5) >> +>> endobj +2280 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 611.171 285.103 622.075] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_f92f3c9d758e2a155a2a6faec4235741) >> +>> endobj +2281 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.919 611.171 362.313 622.075] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2282 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [372.774 611.171 472.18 622.075] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2283 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 574.648 291.191 585.552] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_784570f6ced5461b4d82cdfefa1cb31b) >> +>> endobj +2284 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [295.006 574.648 368.401 585.552] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2285 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.861 574.648 478.268 585.552] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2286 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 539.949 278.747 550.853] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_7918c3a73aed2529e1e57b8983264bad) >> +>> endobj +2287 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [282.563 539.949 355.957 550.853] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2288 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [366.418 539.949 465.824 550.853] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2289 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.629 503.426 343.088 514.33] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_9fb38e66323fe6cb24b32e32e66dba78) >> +>> endobj +2290 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.428 503.426 430.822 514.33] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2291 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 503.426 513.996 514.33] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2343 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 491.471 180.776 502.375] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2292 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 443.99 286.209 454.893] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_bc350d1ab1c6e4da0df6bb130364af7b) >> +>> endobj +2293 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [290.024 443.99 363.419 454.893] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2294 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.88 443.99 473.286 454.893] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2295 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 407.467 317.202 418.371] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_ad69d01217b9ea1043883162d285505c) >> +>> endobj +2296 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.018 407.467 394.412 418.371] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2297 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [140.263 370.944 330.976 381.848] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_db06752e755290368c9bb00ad14a0984) >> +>> endobj +2298 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [336.949 370.944 410.344 381.848] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2299 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [430.64 370.944 513.996 381.848] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +2300 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.351 322.467 333.94 333.37] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_8402fc25b68056511cf62f1378666a88) >> +>> endobj +2301 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [339.001 322.467 412.395 333.37] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2302 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [430.64 322.467 513.996 333.37] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +2303 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.783 263.03 262.173 273.934] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_9563155e281915a8bc2eea34ceff9cf0) >> +>> endobj +2304 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.666 263.03 341.06 273.934] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2305 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [360.276 263.03 443.633 273.934] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +2306 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 263.03 513.996 273.934] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2348 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 251.075 210.095 261.979] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2307 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [222.767 251.075 320.261 261.979] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf1c4903edb1a626a36a7220038f963c4) >> +>> endobj +2308 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.781 216.375 272.893 227.279] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_8a9e2cf693ca3e9c464efb04071b8572) >> +>> endobj +2309 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [276.384 216.375 349.778 227.279] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2310 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [364.635 216.375 447.991 227.279] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +2311 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 216.375 513.996 227.279] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2349 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 204.42 210.095 215.324] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2312 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [222.767 204.42 320.261 215.324] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf1c4903edb1a626a36a7220038f963c4) >> +>> endobj +2313 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.681 169.72 299.364 180.624] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_d015c9afd4968005d43f233359253c5a) >> +>> endobj +2314 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [302.755 169.72 376.149 180.624] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2315 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [390.826 169.72 474.183 180.624] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +2316 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 169.72 513.996 180.624] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2350 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 157.765 236.107 168.669] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2317 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [249.338 157.765 378.064 168.669] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2318 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.506 157.765 490.999 168.669] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf1c4903edb1a626a36a7220038f963c4) >> +>> endobj +2319 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.71 123.065 314.115 133.969] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_6ffd595f3e1d85275962dde5f8401c7f) >> +>> endobj +2320 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [319.534 123.065 392.929 133.969] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2321 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.98 123.065 495.336 133.969] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +2322 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 111.11 253.821 122.014] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2323 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [269.693 111.11 398.419 122.014] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2324 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [416.503 111.11 513.996 122.014] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf1c4903edb1a626a36a7220038f963c4) >> +>> endobj +2331 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +2335 0 obj << +/D [2333 0 R /XYZ 90 757.935 null] +>> endobj +2336 0 obj << +/D [2333 0 R /XYZ 90 725.143 null] +>> endobj +2338 0 obj << +/D [2333 0 R /XYZ 90 676.665 null] +>> endobj +2340 0 obj << +/D [2333 0 R /XYZ 90 628.187 null] +>> endobj +2341 0 obj << +/D [2333 0 R /XYZ 90 556.965 null] +>> endobj +2342 0 obj << +/D [2333 0 R /XYZ 90 520.442 null] +>> endobj +2344 0 obj << +/D [2333 0 R /XYZ 90 461.006 null] +>> endobj +2345 0 obj << +/D [2333 0 R /XYZ 90 424.483 null] +>> endobj +2346 0 obj << +/D [2333 0 R /XYZ 90 387.96 null] +>> endobj +2347 0 obj << +/D [2333 0 R /XYZ 90 339.483 null] +>> endobj +2332 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F72 202 0 R /F65 179 0 R /F34 1307 0 R /F84 440 0 R /F82 920 0 R /F38 146 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2397 0 obj << +/Length 2496 +/Filter /FlateDecode +>> +stream +xÚíZKs㸾ûWðªj ã 2·Íd'•ÍlÕfÆÉevJEKÅD¢’²Çùõi„6® ¥‘T +ñDà›J[|ˆÁÄá,‚õò# #RQDÁ;¬ÎyàààXæ~Yï`S?/µ;¹€Ý·ŒKD¸)7 ™ÞS&QÒìy^9´w.N‹?2;qþ°Y¹kà‚ÍÜ>|yx ¸&¡€Ði{¦'«`° *m¦¡`4vQÙ#ƒ[’(„a/”PJ’+Ø@x¤=‡ ºrpë'1×q‚]È)N"å„ø÷▋d„8éèà.àDsQ{˜Uœä‚¾Äÿ?Ð!v„ ˆv~©)€ïsˆÛºHRáaJ€ ÓäEž@SŸ@¥cQ˜´Ó4L pӀŒ8G ¥×vŠJ¹z;> œŸËA~kù€Ÿà â,’ò]ž\ÇÑT( +QËÇù€v|@É8¤Œ}'„Ë !IÉeåÁtµ¬¦å²j2‚®£„$) × +8à ÀMÆÁw¦TLøG˜É—pDzGX½$DöS†X]Vo“àKu4Á'2K¿‰}PqC4‡¡p‚/!—ehðhòúhîLpŸa4O *ŒæpÓ͍˜Í¥:æ«¶vX¹"9AŒœäî:Šä}µ&·…OÙh2!-ÖHUtR¡,ÿ©¯È±/€T“cŸBU‘âkm³š“‰¶’ßAõí@u˜)3N ʱ-±G /!¢ªF\8SfPò±U‚"A.Pä°Õhêa«Q`°ÕZÄVE€'X[ÍM}lµâZlµÚNa+À6¡o­©”ž‹­©D]†­Æ×n™‚MOy>O.T åtýž@Kßh» é5î!«çˆa{GË}‹ûŷ†eµ»ú9{ñ›y¾xØýç¦Ià¾Bôÿ'ÄØ?«7¥ø¼5}ÿýeð ‚Æ“º‚ Œ²D6ͲZð7Í,L„ðç:Ô7¾½_–ÃÉ1I/ç"!¸ä¼ÞÔµžC?káTƙûØ6Od¸ˆÍ™1 +‰W՛RéÚ]˜³4¿×»íJû9foòºj„ÁX¬~g`DÄY ½ôHÚR¨ïýðï<³…Ãlµò²,›‹v-Ê»¨e…»xðÓ65PšE?˜è\ŠAÒ{ÐÐù„Ù+b›WfçóbàÉâsíýø1҅Ÿ›ù©fqmb\¤Àîò”ùæÙdÚç+Z[Ð| –ø,y]–F9H!&0k ¿*0:¡Ù|>­ 04MÇ ÷¬¦Y1ŸêõƒžÆFruœŽ´AéAôh†zföºŽß^ôþ0ŸW¡Â0µ¥«ùj‰øžˆøÙ9MkJò›Û3h)kµ©,~ô¦ $àå)ðüøC)ÜMSn×0˜£'ãâ:n®+½Z³/ôð4AøMœ¦£Þx÷¶ÜüËäxCïWú7Ã#þÍØwÿþ­ü#%_‰³B¡$MßgªáR¯7f¿žÌ?}à‘‡gL®FY:†²äŒ̬yõÊ[©â¯Gß?¨ â™ú´µ¸Æ7?Ù}Âñ“ö͹…ó‡µù&»&ÛS“ØÂ`ã[0ÜùV( À@Òd¼ávÐÑkȾ£Ë&2¿d¾ÎñwèYnª¾¦Çf“)m%X«:´D™@ˆµ[cP©Î°µnüÇ4°0Ôeý,ë .ÈÊÒø`ª…8Gœ·á3¯Æ얁-÷mûâÙ¿N´W–Ì!ÊMºWµI^À|óľ«Ãú{ÖTƒ>M{ΪÚ+~0oAí¼KfE£µØÌv›¿kã0ìB˜À%Æm¯† –ИXæP?¢…tZ°„¼®ëù=9« JxV> endobj +2325 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.922 708.953 313.211 719.857] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_c0e5d09ffe586f8ea5ec782570015c5b) >> +>> endobj +2326 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [318.843 708.953 392.238 719.857] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2327 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.767 708.953 495.124 719.857] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +2328 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.858 696.998 267.853 707.902] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ge5679e4f41db32b7b91dfc81574fc1d6) >> +>> endobj +2329 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [312.006 696.998 440.733 707.902] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2330 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 696.998 513.996 707.902] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf1c4903edb1a626a36a7220038f963c4) >> +>> endobj +2399 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 685.417 178.862 695.947] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf1c4903edb1a626a36a7220038f963c4) >> +>> endobj +2356 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.369 639.215 327.38 650.119] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_381b0e6e2e58df417ff578ed6d715520) >> +>> endobj +2357 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [334.46 639.215 407.854 650.119] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2358 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [430.64 639.215 513.996 650.119] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +2359 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.509 627.26 283.504 638.164] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ge5679e4f41db32b7b91dfc81574fc1d6) >> +>> endobj +2360 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [319.832 627.26 448.558 638.164] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2361 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 627.26 513.996 638.164] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf1c4903edb1a626a36a7220038f963c4) >> +>> endobj +2400 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 615.678 178.862 626.208] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gf1c4903edb1a626a36a7220038f963c4) >> +>> endobj +2362 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.494 569.476 351.546 580.38] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_46fc9d1041d5548a5f8f220af2a07028) >> +>> endobj +2363 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [361.75 569.476 435.144 580.38] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2364 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 569.476 513.996 580.38] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2401 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 557.521 210.095 568.425] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2365 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [273.43 557.521 386.425 568.425] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ge5679e4f41db32b7b91dfc81574fc1d6) >> +>> endobj +2366 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.977 557.521 513.996 568.425] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2402 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 545.566 179.112 556.47] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2367 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.501 499.738 361.275 510.642] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_6ff56c68b449b94588ea7290d01625d5) >> +>> endobj +2368 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.485 499.738 441.88 510.642] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2369 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 499.738 513.996 510.642] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2403 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 487.783 210.095 498.687] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2370 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [273.43 487.783 386.425 498.687] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_ge5679e4f41db32b7b91dfc81574fc1d6) >> +>> endobj +2371 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.977 487.783 513.996 498.687] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2404 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 475.828 179.112 486.732] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g25f4b655851f0f561cdddf94f667e833) >> +>> endobj +2372 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 391.454 285.641 402.357] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_c06aed22fa4405051df0da9e7bc16138) >> +>> endobj +2373 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [289.457 391.454 362.851 402.357] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2374 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.312 391.454 472.718 402.357] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2375 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.181 343.633 351.58 354.537] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_dd9c4afcd6f6bd78509219f32d57e348) >> +>> endobj +2376 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.471 343.633 428.865 354.537] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2377 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [444.478 343.633 513.996 354.537] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +2407 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 331.678 144.243 342.582] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +2378 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.899 294.816 352.403 305.72] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_90544f38c2980f308cd6e0f9248fdd99) >> +>> endobj +2379 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [356.013 294.816 429.407 305.72] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2380 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [444.478 294.816 513.996 305.72] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +2409 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 282.861 144.243 293.765] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +2381 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.118 245.999 315.801 256.903] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_a48f8ae0f3a2647949417ec2da1c97e4) >> +>> endobj +2382 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [319.629 245.999 393.023 256.903] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2383 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [408.494 245.999 491.85 256.903] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +2384 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.424 186.223 347.542 197.127] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_402bb86dfedf35933c2a29cc07210741) >> +>> endobj +2385 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.676 186.223 426.07 197.127] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2386 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [444.478 186.223 513.996 197.127] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +2412 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 174.268 144.243 185.172] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +2387 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.166 126.447 303.425 137.351] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_abb79ab0a7936b6f14cd20e15cb14fa8) >> +>> endobj +2388 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [307.3 126.447 380.695 137.351] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2389 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [396.272 126.447 479.629 137.351] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +2394 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +2398 0 obj << +/D [2396 0 R /XYZ 90 757.935 null] +>> endobj +2405 0 obj << +/D [2396 0 R /XYZ 90 406.532 null] +>> endobj +2406 0 obj << +/D [2396 0 R /XYZ 90 360.734 null] +>> endobj +2408 0 obj << +/D [2396 0 R /XYZ 90 311.917 null] +>> endobj +2410 0 obj << +/D [2396 0 R /XYZ 90 263.1 null] +>> endobj +2411 0 obj << +/D [2396 0 R /XYZ 90 203.324 null] +>> endobj +2395 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F72 202 0 R /F65 179 0 R /F82 920 0 R /F38 146 0 R /F83 919 0 R /F34 1307 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2453 0 obj << +/Length 2250 +/Filter /FlateDecode +>> +stream +xÚåZIwÛȾëWàð½a«÷æ–Qì‰'ž‰3֜l?>€D¼€¢•_Ÿê .’¨ø0@£YÝÕõ}µ Ø»÷°÷óÕO·W×o%óBJ*½Û;/Ğ’ J¼ÛÄûä+DÂٜ`Œý²\->Ì(ö‹Õã2Mª ü"_4ÑýlNößåMZÝEqjOïR3'ÍÍáLøR̾Üþrõæöê?W¶€=b– +)&¼x}õé öÿÅȅ·5³Ö§ ®+ïãÕ¿®°Ûþ¡«QKàZ„($A‚"1XÝ>Sj·ÓþÎû4 h–7nXo¯ºwûüÝNPҞ„;8tF„ÿ­ŒòdQ— ÿ"ÉÖi^gE¾'])ÿ3ø ø]Ñ;X~ùÃáýI!ÝÍc™N‰IJ —7'…Bس:-RÛ| ʑыöjì€=$7öàˆ(K0XŠÛ%ޘ#¬õϯß*:˜Í"”‚3¯Y¦vNÀ†aÀÅÍI&¤p¤”h'̛¥…io+óXÜÙ«^ÄÜ<¤qSTöÞX×Þ¨WEå÷v!)†[4K&Û¥ÊåÄf`»“N¥bBLˆ(éZOÈАîDä…Û½vúÕhÒ0#õ„™Sð”P¸¡ˆ³—†à]Tß«=ªÔ{‚áw/äŠ^ùW„çp‡~R/(•ÿň›bHý7…=˜CϏ,ªßŸÇ¦ä›Æ`š`Ó¯E’}Ƙ¦õ´GT‘㙢›òõÑN“˜ @t0×Fíø0EÉ¡ÒwÎTЂTßPÏ¡yeyšØ×Yn¯ÝOµb[èÍÿ$E’¨Ž[ +Àôú‘›vñÀ¸€Áj¡U•æVô8±VÀT¬s;õɓ®²{s&`³a@Qè$ CÇ®ÕBD0=æâbÇ@°y8¡Û֑•ÕŒ)?­]8øºdS®²8j*æ9›Zœ@äÄT×täÔ2'.²—mT7ná¯:‹Ø8®Dy»j^ěbã~UX‡vÜiõ|%1sŠag,ÝѾËËMsýÏMS¶K¿Ýäq³ç{vS ‰ˆ/ô~°å}V,Ê +f\×ùO»> IÝu€ZηsøyÉÉ؉|Нr 0 wÎÒß'z2¾u$­›¤Ø4S±Ÿ‚« +{P?%†……ô½8„ Lww®íÞ¾{ÿƪC‡Ð$‚#ÖQüëk?‰£0 ýÉTi´># \‰¤x5@ŒÓ¬ûì!mS0ËÐý5$ †©ñ¹\1Ddx rÌDõ¹ ‰—Q5 8–CÔ@Ž¹œPù=pÃ)RT½.p\PYG«UÏÍÿÀ—þ6•ÎD úý0š]™®Qôœ¤í2‹u¤qõ@µl´l6UÞJ}È¢©ýSbØð̧R ]R?’ Càå—sbCGuœe‹d³._59#ðˆT D¹|ºK<ê1È1 ÿZ×ã ÄÇÐú}ÊÔDÍ°DœHt~@å)w*Ó9¢8x]r(ñŠpZQò<8½Hrñ¿&4×é=è{I éNWg鮚qáë)QºÊ‘çÁ)8Nn¨8aã„û¯Îqþ½ˆwómóx7£°sçŽ5=fƒ=LØÑC¶)„e#@|mMƒޟOHÆ N2ì9k©×h 9Ш%¤¾7„íÕé»ztäã +Aõ6âސ¡®.{. È簑=7_æ!¹9ã#6Bvs",‚Å÷¹¨Å\Šºlá¤"ðTh„”UðïIØ,+èé¨Àöf? ÁQ?56Ÿ ºÈ¨ïm<ˆ°IÕÿ-`šˆ‰"ê5Z"ti‰hv«‰8ÚhODó8™¦*þs…Å€ác<<'騥]Žj±¾ÙuLUi§ðW°ý>>æs‹ï—ªJ›Ý‰aª*-õè~²*w¤rY ¤«Ò¥«r—” þ± JÈ©IûνËXå cV'9ÈXE›±v{•{RSmYæIݧ+¶Ü§ üsÀ¬÷\¨K©Ž(@å0ª`ʧ‡Ÿ +È'ðz‚i»ŸMI° Îýjªý* +jaÅ÷±—‘|Ð3\Ñÿ`(S­5žõ?tmóö}öµŠªGûpc§¼òûMtï~o¿Ód³Ÿ¡ÀÐuZýe¦sYûƒ_£|­ì;m½dZ¹q`#.ÕG ÿ ÷Ç´ýHžÀ¿½öîWó½^”¨ÿCù²iʯ¯·Û-Šk´É³²BYs ö¼Þo†ôB80ї¨–È°±uQ¥V‡,‡Áµiè¡];ý¡1Ó) +endstream +endobj +2452 0 obj << +/Type /Page +/Contents 2453 0 R +/Resources 2451 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2467 0 R +/Annots [ 2390 0 R 2391 0 R 2392 0 R 2393 0 R 2418 0 R 2419 0 R 2420 0 R 2421 0 R 2422 0 R 2423 0 R 2424 0 R 2425 0 R 2426 0 R 2427 0 R 2428 0 R 2429 0 R 2430 0 R 2431 0 R 2432 0 R 2433 0 R 2434 0 R 2462 0 R 2435 0 R 2436 0 R 2437 0 R 2463 0 R 2438 0 R 2439 0 R 2440 0 R 2464 0 R 2441 0 R 2442 0 R 2443 0 R 2465 0 R 2444 0 R 2445 0 R 2446 0 R 2450 0 R ] +>> endobj +2390 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.357 709.195 314.208 720.099] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_81cc2a565346ce8ee12124224ddd8d6c) >> +>> endobj +2391 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.274 709.195 394.669 720.099] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2392 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [417.426 709.195 500.782 720.099] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +2393 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 697.24 208.451 708.144] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +2418 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [140.695 661.346 304.848 672.25] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_d6b383704ed3f314864c52f5b715cbbf) >> +>> endobj +2419 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [311.254 661.346 384.648 672.25] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2420 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [405.917 661.346 489.273 672.25] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +2421 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.79 649.391 244.147 660.294] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) >> +>> endobj +2422 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 567.677 240.282 578.581] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_f8a9392f205531631b3a98c332f594b1) >> +>> endobj +2423 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [244.097 567.677 343.504 578.581] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2424 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 531.783 243.599 542.686] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_d20b13c4f378bdc5aa64c3e833a62cba) >> +>> endobj +2425 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [307.459 531.783 406.866 542.686] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2426 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 495.888 248.581 506.792] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_6b5c73b1f3f864c8a10c39810b4711ce) >> +>> endobj +2427 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [301.92 495.888 401.327 506.792] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2428 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 459.994 254.668 470.898] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_658545ec6169d2843323bfe1ff078e6f) >> +>> endobj +2429 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [258.483 459.994 357.89 470.898] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2430 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 424.1 249.128 435.003] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_affebaba13f6fc73438bdccde0966547) >> +>> endobj +2431 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.944 424.1 326.338 435.003] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2432 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.32 327.442 345.4 338.346] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_d9547cb6430722246dea7f5a70566c06) >> +>> endobj +2433 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [354.43 327.442 427.824 338.346] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2434 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 327.442 513.996 338.346] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6069aff3ad06a502f746df4adec1c16c) >> +>> endobj +2462 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 315.487 208.989 326.391] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6069aff3ad06a502f746df4adec1c16c) >> +>> endobj +2435 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.265 270.142 358.591 281.046] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_3bc82e8c76e1a47ecc20c85e1003036d) >> +>> endobj +2436 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [371.566 270.142 444.96 281.046] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2437 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 270.142 513.996 281.046] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag) >> +>> endobj +2463 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 258.187 208.989 269.091] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag) >> +>> endobj +2438 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.935 212.843 356.401 223.747] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_7573064b44c45d804d398aec02e7a64a) >> +>> endobj +2439 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.046 212.843 435.44 223.747] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2440 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 212.843 513.996 223.747] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6069aff3ad06a502f746df4adec1c16c) >> +>> endobj +2464 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 200.888 208.989 211.791] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6069aff3ad06a502f746df4adec1c16c) >> +>> endobj +2441 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.88 155.543 369.592 166.447] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_0184ad10aeca27f95d249d3a7e061b46) >> +>> endobj +2442 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.182 155.543 452.576 166.447] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2443 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 155.543 513.996 166.447] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag) >> +>> endobj +2465 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 143.588 208.989 154.492] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag) >> +>> endobj +2444 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.184 98.244 267.458 109.147] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_6137f367c0c83a73146d84c998d37cb3) >> +>> endobj +2445 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [271.352 98.244 370.758 109.147] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2446 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.376 98.244 513.996 109.147] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6069aff3ad06a502f746df4adec1c16c) >> +>> endobj +2450 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +2454 0 obj << +/D [2452 0 R /XYZ 90 757.935 null] +>> endobj +2455 0 obj << +/D [2452 0 R /XYZ 90 726.054 null] +>> endobj +2456 0 obj << +/D [2452 0 R /XYZ 90 678.205 null] +>> endobj +2457 0 obj << +/D [2452 0 R /XYZ 90 582.513 null] +>> endobj +2458 0 obj << +/D [2452 0 R /XYZ 90 548.641 null] +>> endobj +2459 0 obj << +/D [2452 0 R /XYZ 90 512.747 null] +>> endobj +2460 0 obj << +/D [2452 0 R /XYZ 90 476.853 null] +>> endobj +2461 0 obj << +/D [2452 0 R /XYZ 90 440.958 null] +>> endobj +2466 0 obj << +/D [2452 0 R /XYZ 90 115.102 null] +>> endobj +2451 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F72 202 0 R /F83 919 0 R /F65 179 0 R /F23 144 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2514 0 obj << +/Length 2197 +/Filter /FlateDecode +>> +stream +xÚí[[“ÚÆ~çWè툪0;÷Ëy;IŹœ¤*±7uªŽÚ’A ª€ÀH›5ùõé™Ñ ! X°ËÞøeZ©§§û믻gÌ|7úúvtóB²À #© nïƒ% ”·³àu¨1ã Á‡›Íòî—1Åáz¹[ijí˜èpÞåÑ|<¡‡?¤y¼½¦±ÿú2¾Ý3qênÎD(åø÷ÛGßގލ¨€â† +)&‚éjôúwÌàþFÌèàÑ=µ +8eð¹ ^~áBýö§›Ž¢†éHn§C8F.eKáçô¿m’Ç™×2òÓušåþr¥³e1‡|]|.Šó1Á0!;1Fùzëog»,Wþz¿Á˜¦I:o½»)íÆØÍÚl/ÊRÁá¦âÔÜ,ü3û‚y`Z>:G3ËTgY‡\f¦¤;ϺäJD˜)ŸAÎK}f¾y!p2Æ2\J‘!܋xC©Ø“¼ž@Q’æÅmëûí¼ÁK÷€1Ì +S¼æq~·JÒd•ü5&a<ƒ`~kú¬-Þ¾ý Ü+ßÉv®nŽwÉÙ,¾êW“Ų&öI°%—`Bо+U½{åÒêæm†žæxVº@ļŸöŒÍ‘ÑMWÂ|I§³Zþ((& Ÿ÷Õ¥P¸$ž}Œ¸0Q®>¿¸Ð ”¸BX8+í‡̬Ž„¶@ûüñ@ +7âP”*ù¨Þ)i~*JÁR’— UÞbÿ™ÍÚÝìüÕúþ(=z`´¬XvÞát…$­°tý&¨K †ïYõL—ñÆ4FJ> zTp$%ýØË>!ðu²l‰ÁìI Ôçƒð |tà‚ƒãhåõnNÚãºÏŸF#Ùð)H'>·ñÔNu7]– ‚ÓÀ +µø›„`dÎì˜Ð¦+¸:œSjÁB 'ù»½µÄ… &ö&`oAÛ ¾v±A‚ðg]ɐ4@ÜCôu¹ÕCw‹‡åò.ʲdž~v}2¹“´»(µ»)fU‰ÙQ¢MTnzߓª«n¯¤œX+ ZNÌÄɲ¡pP(žÙuˆé§áŒ@×Ü|˜îp6KîÇT„ЧÛýY#N8ĕMÚÉS5 Œû¦î‰BTWpìD¬A”èO°JÿË+–cÖFÕ×ß¿ü?fwÉ,¶=dVøž/îòõ>Gäw+è2ðrÌÁË99e)à(ªÇR„_y\>¤vjqá¾½5‚Ìòœ5‚|sòáõ~Àü`“°æµÂÅÑn]rÁÀ2´z’y±`¾ˆ×e²JòxVfÚؖ+ïómX‰òÄn¶rf̅1muëéŽêŒ÷Ýԉtñý»…PËwˆ§ÙñþŒ»o¤>PƒF¡ìP:Y{n+pT‘#åƒ:¾§8öjCH±†Ã,žæþ”–,W¸àªØ)“þ¼—ßY…W23éôeH³jÓ¾Ýݺ¯Ëþ– # +Ëɀ†2{¬Tëí®xÊï×5´sëz…RÝ[½Œ èOEt­ Z‹î®ÕîŒócm+ûŠù…ÉBm»<  A.ŒÀH«ÝÈöbe±ÿ}ˆH¡‘Ò¬c±Þ(]‰‡ûXetŠíÅJûVk±n%å —j±²§«eHjvB«Zׅó•úWCVê +éՂ¥'½Ú²ø©¹•ÑKs«Ul¨^fÜ+Þ»^ù©çYeCí”ðô)yV•ÙÓq—çÙ/uÿ3¬û‡‡º½ª0H´¦bgS¦2ӑh%îO´¦>œÔ›hõA¢5ÍDkZ‰†ó‰Ö”‰¶¡]hM¢m¸á”DËtï VähZÐ|?њ2іjÄ\Rõ)ŒÆIËÁ'gZNQ½tÿ%і¼Ùþ™ŽÔîÀۉ¿Òq¿Æ3K@3 Ãÿ¸H@¬Š"%ß:72þâÂb»²gk­öÒ"ÿߟ’·Ûh»ó_¾ñü¥ó‡h^¼ïyd§à}·~Ëâí¿ÆB¸ƒ‚ðÂÏQê)µØpúÓo³Äá´71äP˵»˜‡¯â¸0†·ÀAyõߑ3=/Ê5ªùl‘ç›ßÜ<>>¢i†Òd³EI~ξiýücÏ8„@:©O Ý»\Š­ÖÛØÏ!IáæÊ~ú If4 +endstream +endobj +2513 0 obj << +/Type /Page +/Contents 2514 0 R +/Resources 2512 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2467 0 R +/Annots [ 2447 0 R 2448 0 R 2449 0 R 2517 0 R 2472 0 R 2473 0 R 2474 0 R 2475 0 R 2476 0 R 2477 0 R 2478 0 R 2479 0 R 2480 0 R 2520 0 R 2481 0 R 2482 0 R 2483 0 R 2484 0 R 2485 0 R 2486 0 R 2487 0 R 2488 0 R 2489 0 R 2524 0 R 2490 0 R 2491 0 R 2492 0 R 2526 0 R 2493 0 R 2494 0 R 2495 0 R 2496 0 R 2497 0 R 2498 0 R 2499 0 R 2500 0 R 2501 0 R 2502 0 R 2503 0 R 2504 0 R 2505 0 R 2531 0 R 2506 0 R 2511 0 R ] +>> endobj +2447 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.474 696.998 322.349 707.902] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_5e7090393ee5801d9c988db6d2a06a43) >> +>> endobj +2448 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [333.533 696.998 432.94 707.902] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2449 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 696.998 513.996 707.902] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6069aff3ad06a502f746df4adec1c16c) >> +>> endobj +2517 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 685.043 208.989 695.947] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6069aff3ad06a502f746df4adec1c16c) >> +>> endobj +2472 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 648.181 265.716 659.085] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_ea399d3df97c711c758c8bf715e0c763) >> +>> endobj +2473 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [269.532 648.181 342.926 659.085] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2474 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [358.368 648.181 451.668 659.085] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) >> +>> endobj +2475 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 611.319 269.592 622.223] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_612142029eeee3dd72bb0d37c670d6db) >> +>> endobj +2476 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [273.407 611.319 346.802 622.223] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2477 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.244 611.319 489.864 622.223] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_g6069aff3ad06a502f746df4adec1c16c) >> +>> endobj +2478 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [140.699 574.458 310.76 585.362] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_841ceef027f12d5c99fc2e739ae340fb) >> +>> endobj +2479 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [317.169 574.458 390.563 585.362] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2480 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.84 574.458 513.996 585.362] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag) >> +>> endobj +2520 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 562.503 129.857 573.406] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Generator__System__tag) >> +>> endobj +2481 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 527.633 276.814 538.537] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_ad3749930a51c38886b1d5a01dbbba92) >> +>> endobj +2482 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [280.63 527.633 354.024 538.537] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2483 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [364.485 527.633 463.892 538.537] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2484 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 490.772 301.442 501.675] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_06c7c974043c12bcf349c119e73cc681) >> +>> endobj +2485 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [305.258 490.772 378.652 501.675] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2486 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [389.113 490.772 488.519 501.675] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2487 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.632 453.91 372.328 464.814] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_69c0a9ffd5b8910a90a91943a10fe3b6) >> +>> endobj +2488 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [377.67 453.91 451.065 464.814] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2489 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 453.91 513.996 464.814] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2524 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 441.955 180.776 452.859] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2490 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.192 383.175 357.51 394.079] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_1e5a2940765710cccea4ef4f1b7f1092) >> +>> endobj +2491 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [367.412 383.175 440.806 394.079] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2492 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 383.175 513.996 394.079] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2526 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 371.22 180.776 382.124] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2493 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.88 312.44 316.987 323.344] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_d184bea5f8f38b87293d639d57ee340b) >> +>> endobj +2494 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [320.577 312.44 393.971 323.344] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2495 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [404.026 312.44 503.432 323.344] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2496 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.106 252.664 297.836 263.568] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_88c408677f6de73fd80903738268efa3) >> +>> endobj +2497 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [301.651 252.664 375.046 263.568] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2498 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [385.506 252.664 484.913 263.568] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2499 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [140.594 204.844 421.847 215.748] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_977522267df419dd5f2824ce6c0f7610) >> +>> endobj +2500 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [428.151 204.844 501.545 215.748] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2501 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 192.889 224.501 203.793] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2502 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [234.314 192.889 363.618 203.793] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +2503 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.887 134.109 400.763 145.013] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_96eaf729b170b6df69bc2d1127f8727c) >> +>> endobj +2504 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [405.36 134.109 478.754 145.013] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2505 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.973 134.109 513.996 145.013] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2531 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 122.154 206.788 133.058] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2506 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.601 122.154 345.905 133.058] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +2511 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +2515 0 obj << +/D [2513 0 R /XYZ 90 757.935 null] +>> endobj +2516 0 obj << +/D [2513 0 R /XYZ 90 714.099 null] +>> endobj +2518 0 obj << +/D [2513 0 R /XYZ 90 665.282 null] +>> endobj +2519 0 obj << +/D [2513 0 R /XYZ 90 628.42 null] +>> endobj +2521 0 obj << +/D [2513 0 R /XYZ 90 544.734 null] +>> endobj +2522 0 obj << +/D [2513 0 R /XYZ 90 507.872 null] +>> endobj +2523 0 obj << +/D [2513 0 R /XYZ 90 471.011 null] +>> endobj +2525 0 obj << +/D [2513 0 R /XYZ 90 400.276 null] +>> endobj +2527 0 obj << +/D [2513 0 R /XYZ 90 329.541 null] +>> endobj +2528 0 obj << +/D [2513 0 R /XYZ 90 269.765 null] +>> endobj +2529 0 obj << +/D [2513 0 R /XYZ 90 221.945 null] +>> endobj +2530 0 obj << +/D [2513 0 R /XYZ 90 151.21 null] +>> endobj +2512 0 obj << +/Font << /F63 177 0 R /F72 202 0 R /F65 179 0 R /F50 143 0 R /F23 144 0 R /F84 440 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2556 0 obj << +/Length 2355 +/Filter /FlateDecode +>> +stream +xÚí[Ksã6¾ûWè¶TÕÆd*§8›É&©dÆ{É$å¢$ÈæF"5$5ÿûíÀ—LIö8©­ÕEA°_èþºtr;¡“\|s}qù“„$šëÉõj’Љь(Î&×ËÉûÈ–LgŒRm·ë›Ÿ§œFÅúáÎ.Ë)‹£"¿©ÓÛéŒ+½Ék[®Ò…õ—oíʺ16w]L +i3ýýúû‹¿__|¸` 0ÇRb„š,6陸%ô?¡D$ñäލÚL$𿞼»øå‚ñý;µí©Å˜!(Æ ªýƹrÒ4MÞÏè™åuèFéÊÛ æ[?€soˆ`0À:Ûdµ]Þ|óúí¯TÜØ)SѧºL·Å:­3VUv›?b”~£ŠäµÏ§£ðéÕY?i‹"¯ê›œÄDêx23$Jy;cù0Õ*:ÂÇtl®ð·LÁˆ7ïªÚnƉ.*Н î4ÿ—ßr&ZK7u’0#@dA{‘߬À¡bÕwÖ7¶OJ>‰dÁ¯UŠ–D¡Ã¹Çü€C®šYåɂJ5¨b—þ2Ëý?N[Qú¶ý°K×ØQ]8ž)ÓX7œ?ˆ¦ˆˆ›û¯€jÂ#ïRAʺ!+B#‹ëfÊë†@ØôdDÑV6ïà³ûlió,¿!9T™ ƒR*ñÏ«ùÂY|\<ÍÛKóå˜éÑɉYÕ¼•?C€š2UvQ»9G¼Ïê;ßòS†¾é\ÃݸòÙèÜq0 ƒE5"ؐv6¬ïÒÚLË©0Q`YR@DPވ5£Öë=é¶E'Ô¨e™ DÇâ©EFƒ° ÆŽÎÀ§ˆ„y™qN&_€¤IL!ék“<F“¼FQc0ʘægíá(Mþ ã@*_¤Ìœð{“üEPªž¥àáÇpTI"dÁðSuðøi‹µ!Bé€ÅñÿÊÓ@ʾ e1Q1@ª^¤<Ñû7/vùòtIzƒsvSà\Ú¼z0‰y!¶¢l‡±uD;ü/Áé+ï» dC°ðþ‰'”Ýâ 8›hã½%Iwκ}*J +Áê˨€Ó¦‡Ó\߅Æiœ¯âññˆÆåU§n§áÒá4ü·8 í§Qœ§¹~†hLibè³*^A{0íÁ4#†‹ã0ÝSùLƒÝŒzzÅkáJEjb3¬‰ÇÅSâtÁ{|N•`‡QZ¶(-ÉJË#(Íh|¥Îö@ZöAZîƒ4ˆà@Z6 Ý +'{ -4‡˜Sò9Þ$y´Ú•À¢lt +ë;XÉpB™ÎZ°žn$Õ,HªÇ’v"G­ŠrãEŒå@ Mbª{˜¢Ã(1˜^¦[M>ŽÁùW.Gˆ€¹hk®rÄ\2yä‡CqÁ¡cùiM'íLH} T²åŒÄÿã(*`t¸žÆH·6|¥….ä«]¾@ +¡å’JÿÛ®e±Øé>îrÿW{T~úéªýNm +eþG 9_‡4_ˆù”:K pîA(®‘¬¢ÚKˆMG= Ý%Jˆ1VØß² +—e7?BÎÀ…þ +È:°u`³B´qg.lÒÅÂV•ÛÃËyhãd-€Sq›-À£Z­zeÍb]T8W"öÇ®|nÆK¯4Üv„M”[d“–ÐrwöŸwϏêó¾™g†š`X¸±Ìª:óvôs[ß[›{æW{RátŽ(Ô³,,ÄAdŠõƒo͝ט Ôv-²º¹WÕiÝ>tˆ4HØiä7‡’¡›(jc¬sñg:¹´"´KÞXææöþf䅨4$î +›ïC ‘†m|ôLYϘ>Ãðšz„'î¶tùá)ï`I° 5Á.=xâ™¨!ÖB¤Š^¤Šh™‚H„«Â£… q]8¾å¶®9(£6P!¢Eóè<Ð_•Öºx¤Ò­ÈXdËÅ]šßÚåWәd<*ȸµ‹ÙXÌd]IÅCõÞ¤è@hõ]›4‡*ÞUB4ÚUí»×Ù¼LË?ºÕpYB៕¶%™•¾?ugÅnwª4†Õ¹»5|‡Ø冀u.‹@¡ÚŽª³Ì€j•ùx@¸ßl!:çk;Ìpû§Ò4¾8‰Ÿz(­9t†ér¨?K§ nW²—/¸ÑÏ®´+7®‚· ÉÔßý¡5žpN€C~€ÙÛ¥·áù7CàÇ®U¶üÛT©¨òüè&ÆßCö˜[@'%2±™xOygm0†·À“¦õÏ k^Xntk›»ºÞ~uyyOÙåÙ¶$Y} !x9°îžq,PUÒV‡>…ƒ`›Â9‡@¿Ã×í<š§ÿWGB7 +endstream +endobj +2555 0 obj << +/Type /Page +/Contents 2556 0 R +/Resources 2554 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2467 0 R +/Annots [ 2507 0 R 2508 0 R 2509 0 R 2559 0 R 2510 0 R 2533 0 R 2534 0 R 2535 0 R 2561 0 R 2536 0 R 2537 0 R 2538 0 R 2539 0 R 2540 0 R 2541 0 R 2542 0 R 2543 0 R 2544 0 R 2545 0 R 2546 0 R 2547 0 R 2565 0 R 2548 0 R 2549 0 R 2550 0 R 2551 0 R 2567 0 R 2552 0 R 2553 0 R ] +>> endobj +2507 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [140.816 707.957 368.48 718.861] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_88a7c177ebe33a3d41609609660fd3ee) >> +>> endobj +2508 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.007 707.957 448.401 718.861] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2509 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 707.957 513.996 718.861] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2559 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 696.002 180.776 706.906] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2510 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.589 696.002 319.892 706.906] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +2533 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.376 648.181 353.663 659.085] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_c78c1168665c72eaf8c2457b12700fba) >> +>> endobj +2534 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [364.748 648.181 438.142 659.085] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2535 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 648.181 513.996 659.085] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2561 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 636.226 180.776 647.13] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2536 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.589 636.226 319.892 647.13] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +2537 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.568 588.405 425.899 599.309] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_875b11e85fe96586152f53f498158b1f) >> +>> endobj +2538 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [430.177 588.405 503.571 599.309] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2539 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 576.45 224.501 587.354] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2540 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [234.314 576.45 363.618 587.354] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +2541 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.027 495.753 412.981 506.657] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_b062917f016d95800e29f87c203fd3bb) >> +>> endobj +2542 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [423.718 495.753 497.112 506.657] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2543 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 483.798 224.501 494.702] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2544 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [234.314 483.798 363.618 494.702] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +2545 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.386 403.1 373.128 414.004] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_5932fd0c6867d83e3a34d5e680225807) >> +>> endobj +2546 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.224 403.1 451.619 414.004] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2547 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 403.1 513.996 414.004] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2565 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 391.145 180.776 402.049] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2548 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.589 391.145 319.892 402.049] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +2549 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.946 321.407 358.31 332.311] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag_d4b80df36fc02b4c47ca160420e50182) >> +>> endobj +2550 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [367.966 321.407 441.36 332.311] +/Subtype /Link +/A << /S /GoTo /D (interfaceppl__Polyhedron__tag) >> +>> endobj +2551 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.961 321.407 513.996 332.311] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2567 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 309.451 180.776 320.355] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) >> +>> endobj +2552 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.589 309.451 319.892 320.355] +/Subtype /Link +/A << /S /GoTo /D (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) >> +>> endobj +2553 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +2557 0 obj << +/D [2555 0 R /XYZ 90 757.935 null] +>> endobj +2558 0 obj << +/D [2555 0 R /XYZ 90 725.058 null] +>> endobj +2560 0 obj << +/D [2555 0 R /XYZ 90 665.282 null] +>> endobj +2562 0 obj << +/D [2555 0 R /XYZ 90 605.506 null] +>> endobj +2563 0 obj << +/D [2555 0 R /XYZ 90 512.854 null] +>> endobj +2564 0 obj << +/D [2555 0 R /XYZ 90 420.201 null] +>> endobj +2566 0 obj << +/D [2555 0 R /XYZ 90 338.507 null] +>> endobj +2568 0 obj << +/D [2555 0 R /XYZ 90 241.247 null] +>> endobj +2554 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F72 202 0 R /F65 179 0 R /F23 144 0 R /F84 440 0 R /F83 919 0 R /F87 1306 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2572 0 obj << +/Length 1721 +/Filter /FlateDecode +>> +stream +xÚí™]“Û4†ïó+|‡3ÓhõaYR¹¢ ˅)t.ÚΎë(‰‡Ä¶Ó°ÿž£ÇVÖÙd;¥ W¶dÉ:::çÑ+GËGßN^ÜN®nR)¤RšF·‹HáH¤qJ¢Ûyô&ˆ¨éŒ`Œãív}÷jJq\­ïWz^O‰Œ«ò®Í–Óå8þ®lu½Èr튿腶mti«HÂxœÊé»Ûï'ßÜNþ˜0GÄÉŒGùfòæŽæPÿ}„S2ÚÛV›(¡ ®ëèõäç ~Ô|ÊNyo>¢~7u¡ËyãÌûªœwv®³VûÂÍ®ÌÛ¢*]éë*ßmtÙf¶ + ‡Qg4A,QÃ×#â(Êv:×YW•zw=氅»ÙŒ?Ýíê.¯6Ûµþ³hïÍûpüs|ÊýÆ®«:ôBB$ÂDµÖÊ·3×JªA«Y×lFRÜ{l»]¹¶_ GÓî…ÏÀ*yU6í#v#K£x÷šñ‘0ßÑ@ƯßF!Låa’—=|i’ *’ÞœøF<°IJºFojï\KŽ‡ž£$Eðœ@)M\»bm¢‹á$ÎÜåÚ]¶Þ5&®L¹]e­¹cq¶Ï«í”àøޕªÅ˜•)CT‰cöùõôM¾„·1ïë¢Õáp«¬œ¯µ³dQ՝qÚݔzJy¼_{kòZ»<›‘›\çóZ7͈Ýà*Ž(,íx´…ö ¤ëìG]έì bXQˆaʦÂõø©jõó£^á ¬lg &ÙN·+.ISÂc—€¦.³a½´4p5…çH±,«ZÏÑHԙè„A¢"¸ A‡ÈH¤º&Ýê zݽ¾oZ½1åSùÀRŠ°”gø Léu!V©ÊÌârƤ@ ;BŒcƃ©œ@x+= ‘7#VHHyIrӋ’›0…˜¤§’[ºì]~¸ºkw óBċºÚ¸'>­dÜøu3!Ãm]~ðÅXêÐCü$Ç>#ڄ×"+çî½}Î gµä¼ìr^ôÆ9/9oגrŽP4LàÁ„m¢øô8  ·ýJ\  $a\·.ü(k«a +ÇVí‹õÚ§k¹ÒàWh»ÎÍö [æäxs£ ¦š²Ç$`ð((ˆ Y|PIÀ6äãôq>8•ßçk=†ÓÿɈ€Ž“3ˆ(é1r!"ç!ΐ0ª.cƒ·%ÉgEr§I‚(ìܙ»ôÁˆ•Aƒ© bʵÎÍkV”KWåâºtŒ0•†æzŽboã!™ œ¤$̋;H˜½ý$̽…Do]?; Ó'„„ÙZ0ù‡@"ù÷Aâ¤Ð¡ ‚™$VétǛߦ)·Ú„Ç%DÑešGõ s»²N,‹ÃÁ‡6Õ¼€”§Ú?uû¡{pØ̨ h8ð™ÃÞÜ={?§0e:ˆÓç#n¡%ô qw[gÚ]]>3z¶ªÊ ›5Ín³íl'qžùI¼×]H‰íXxn²¹_Ën‹Ö+º&F²õNŸ×t"`vh:ÐÔkºe½3Žë5t~2°¹=öž¶RO¶”,”t +ñ”ŸtáLÆ%œ …"g¹­>Ýy ¶ ¤9ÁmA,÷ĐPwí.& ì$iíÈ ú,0÷×ÂfŠ÷Å8®ÍIXžÃuÊYˆkџãÌ ™«:àژgq-Hg]ˆk¨?ÒtÎü\ÿMš.ø +…ø4OÒtLj iútDÀ‘Žžû, ÁÄÁj: +måMw /Øgeƒ!ºb'Ž{œÙƒ\úã¨ékW÷ |¤éL•Û:ᦈq{3H%’Œœ;÷%‚„?xñáà×ÙOûƒï>ö ­ë!ḠaÏÄݞ™zº/@céx„{~üJÀ‰Hñ_uÝWåO£ê¨UgJCUgÊ~‡ƒ0tå~?ª3åªć8§êâ\†ªÎàUUu¦r¨ê¬‰Ù”Äþ¾v)°Š}¤°;xôøgd‚_ø/Âþƒ€y¦H &ý?‰qÊXüÊ,hVo̦ÍhüÊGj枾,Þ×Y}ï +×®Éˬ\î²¥ïïþ¯˜ïÃ.d¡ê×F×_Lá@ݸ?få.[»gfsø`†Ôµj¨ÄGˆh"÷ÁöµÖÞοGÝÝ»Èý¼h"ߘVm»}~uµßïQÞ ]YlkT´W° \=Œ×þ%T ïñíÔ +¶©jíæP”P¹±¿\¬Ó_T âµ +endstream +endobj +2571 0 obj << +/Type /Page +/Contents 2572 0 R +/Resources 2570 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2467 0 R +/Annots [ 2569 0 R ] +>> endobj +2569 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +2573 0 obj << +/D [2571 0 R /XYZ 90 757.935 null] +>> endobj +2574 0 obj << +/D [2571 0 R /XYZ 90 733.028 null] +>> endobj +2027 0 obj << +/D [2571 0 R /XYZ 90 716.221 null] +>> endobj +2575 0 obj << +/D [2571 0 R /XYZ 90 716.221 null] +>> endobj +2028 0 obj << +/D [2571 0 R /XYZ 90 601.983 null] +>> endobj +2576 0 obj << +/D [2571 0 R /XYZ 90 587.413 null] +>> endobj +2029 0 obj << +/D [2571 0 R /XYZ 332.797 512.786 null] +>> endobj +2577 0 obj << +/D [2571 0 R /XYZ 90 496.059 null] +>> endobj +2030 0 obj << +/D [2571 0 R /XYZ 90 353.811 null] +>> endobj +2578 0 obj << +/D [2571 0 R /XYZ 90 339.241 null] +>> endobj +2031 0 obj << +/D [2571 0 R /XYZ 332.797 262.557 null] +>> endobj +2579 0 obj << +/D [2571 0 R /XYZ 90 245.83 null] +>> endobj +2078 0 obj << +/D [2571 0 R /XYZ 90 103.581 null] +>> endobj +2570 0 obj << +/Font << /F63 177 0 R /F23 144 0 R /F89 447 0 R /F65 179 0 R /F50 143 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2583 0 obj << +/Length 1672 +/Filter /FlateDecode +>> +stream +xÚí™[ïÚ6Àßùy[†ÿ¾Ä·î­Õ:­ëªneÚC[ý•Ñ aI(ãÛïØÎBªª6©O±oÇ>çü| 8X8øiòt>yx.X ‘Tóe q Aœ’`¾ކ=Œq¸Ûm_O)óÍqmŔ¨0Ï«x5QŽÃŸ³ÊË81¾ú»Y×ÇdND"ÆC¡§ïç/&?Î'O¨€â–äIƃd;yû ¿0bZ×kD”Áw¼™ü6ÁŸTŸ2„ïÔG‰z iV&TûÍdæðøêÕ³±M-}a{©ýVëÇ$ßî6柴:ºIIøsl'žÙM‚†3Bæµ*cGgû=<§ýp„0Ø z‡1ó”îu’(’´é³Û­}—ÁIŽ8nû|?ñڄIž•Õãem ‡©y»ÔèJÜåd!{Ðç³Qp,Ô]{Çw>i!*Yw œÔø@;¤h»ôÛÂlâÊ,Þûž÷zΨbHGL"‘ ‘ñtŸn%Ó0Îü î »útr×ÀÂjW¾%m†øO’驪G_˗cŠJ†xDOq bí+u—lĨðP¤•.·Ž³ÅÆx–yá…ÕÚøBf¦”‡‡M­MR{$c;‚ ëýċEaÊrDïQEZ=y7®¿DšµC.Λ@=1.L‹4cPŽ0•~Ä«¼2ONF PHbícp87h¾®iãiJxXÇ#ÈbçÙ«ýÖ¸°‰³œý®²¼0 4âxÖA$aÁ,¢ˆp9Àˆ`Dˆ›)òÌÆ\øÇ7Dz2[;\¶¼¸ Lh¤Xt• ‚‰{Ù‘°׌iŠ4Æ[]4áj¹q¶“ ؀ãí +I9¢„BðþÅœ0˜¢œJ>T5âe>ØA: hXùÖ·øÈQÙÊä®1iOc,zh$ êÕé) 8GIÓBÛ/ÐÆ=,{Q÷ òqÂZ;5ˆ{7qïÌIFRè“ îïØK"—a  HÏok€e±D +Ö˜¦ÜÎ P9Õên6uÈfk‡â+U3¸ÜµùÆ"…8/Ófä(‡)‡ +öi‹ 8<ŠÊ$:C #ô0ÕP}F@Ns>EJŽÉƌaB2q7& z…ÖW0A(bXßÀ ÒqÂY3¢pßãSoõnE¶°¯‹I «ýÑÀ°Cƒý´žh+ ¶ÐwI[/Lb¯0Xš­¼È¹£-4Œ°eËû½ÂIÝøI„[’DF؉FôvÐ0–#ÚuŒðXPሠÙ% #ÑxR<"£Ïð@ñÿ…ÄÅd‡2ðg°ŸÍv¤ nȟSÁ]‚Âà üè¶ÄGw·ñ|msFI¸ÜgIåvÄÛ|‘BÄSS·zãSÜsCßк*´ö©fŸi ßöá8z›Áž)ïŽåÉȹPŠ¢Î›÷;¯ª}‘A¦ÁÜU¹_6.Ëýv×èNÂ$®7ñÁ4W„§CÝƋژÓªNë>Z'‰7{sob§ûÐVDߓحŠ½=º–Ø +Zî&6ÀL^6C„©/ ì6£naÛC7$túj“Û¨-’ŒC[ºç“¤mY?Þ¬tmhðùœmñ¢6@èX-íS®9‹QV /Ý«¬\ Y ·¬†Åb/jY "ÏjIíÈ9«ÁúŠ}cõ×OèîÃ!#ݗѝò!’ä~>pÄè5@h$ù Ý-d ¢ÿšü*h`üîÒ[Oø'“è¿õ âßzb˜Ðن“„Ί¼;B¡}ôAÙ=ú„º !ÉùµGŸU{ðè½{º´>Ñ<ú„ì´;ƒ<¥þOB‚Kè.$t¼ŸÐQ){ ­õ:[÷‡ eÏ }½uU) ­_Hèà]!¯%tq®† _¡N訊\Bg…ý„ΩOá&«Uhs:ˆ]Æ>3§kOôô¡€ßø‚ûãö)ìSTÕp [\fŒ…¯­Aãbkã‘Ñðuí©±o}™~(ââè+Ï|——q¶ÚÇ«z¼ÿSÄþ>ì]D”¦ønÊyXú¿ÆÙ>Þø6{1|´Kš¢vjbˆ#D-6‘}ÈEácêÃð'ðWД~™8#wû¢‘Bœ×Uµ{òðp8PR¢}–î +”Vû‡sí&!,Þ܃Ûæ…ñ{H3nckú3;ý _ÔÐ +endstream +endobj +2582 0 obj << +/Type /Page +/Contents 2583 0 R +/Resources 2581 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2467 0 R +/Annots [ 2580 0 R ] +>> endobj +2580 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +2584 0 obj << +/D [2582 0 R /XYZ 90 757.935 null] +>> endobj +2585 0 obj << +/D [2582 0 R /XYZ 90 733.028 null] +>> endobj +2079 0 obj << +/D [2582 0 R /XYZ 90 626.332 null] +>> endobj +2586 0 obj << +/D [2582 0 R /XYZ 90 611.762 null] +>> endobj +2080 0 obj << +/D [2582 0 R /XYZ 332.797 537.136 null] +>> endobj +2587 0 obj << +/D [2582 0 R /XYZ 90 520.408 null] +>> endobj +2081 0 obj << +/D [2582 0 R /XYZ 90 378.16 null] +>> endobj +2588 0 obj << +/D [2582 0 R /XYZ 90 363.59 null] +>> endobj +2082 0 obj << +/D [2582 0 R /XYZ 332.797 286.906 null] +>> endobj +2589 0 obj << +/D [2582 0 R /XYZ 90 270.179 null] +>> endobj +2137 0 obj << +/D [2582 0 R /XYZ 90 127.931 null] +>> endobj +2581 0 obj << +/Font << /F63 177 0 R /F23 144 0 R /F89 447 0 R /F65 179 0 R /F50 143 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2593 0 obj << +/Length 2221 +/Filter /FlateDecode +>> +stream +xÚíZm“Úºþίà[a¦h-ɒíÛO áfHÉîޅ6“d¯àlj›KÒ_^ü"0,›I§Ó6ŸlÉz9çèÑóHœîªëtßv^Ï:7¿rÚ PÀ ïΖÝÀéz#Fpw¶è~ìyýv§·Ûmæ÷}âôÒÍ·µXd}ì÷Òd^„«þ€0§7N +‘-ÃHèâƒX +ÕF$ª +»”õ<§ÿyö®3šuþÙÁ`‚ÓÅjJæ!²n´í|üìtPÿ®ë ø݃jµíº„Âsӝv~ë8Í'9œÕæ#‚06>ÄI¦xœ(oq˜Û|Zê—íüö¶õû!.Öó(Ýî6âk\|SCÒÞ'‡9r؁ô `Œf,i‹œlwó+i:ÀÄ=U§OŽCu#?h4òë‘²Ín·ÖM¬@`†˜SµùsÀÌ +Fi’óóÖXa ± X5UëL åh"æÓÑà +*LÓFøNu]D P&4i¢«‹uX˜v»]–~·0“é© R·?5“P·‹ƒhhRG‘à ·Ïãd¥ +!áf•f¾­.Öi.ô«g³žA$ôZ¤`¤Ä‸€«€ÛLÒBoUÝ-bÑb¾ËPäãE³œìz5vÿ¢Ç>€¹*TðêÇ:LÃË4Ó/ÅÚÔ$¢OXï°ù¦‹Q&äªê‚µ.r@ã@¸Xd"ÏۂHâ'[Ŏ½‡Za )‚*æ–Ê}@;“UT—Û´¿u³gð‘çHðùȁ½¢:ͤ¿Œø' 'ëBµ)Wû­H +¹¥–:ŽÖ¦‡D#^¯¿ô±\>Uý»Œ[¸Ù‹Ö8€—nPðþ~2Þ½¿ŸŒþ>ž}˜'¯¦ÓùýÝäÃíÝûñ«I[”|†¨Ó€èé×!È;FYëTÓ±ªh] Œh"€JÛÎ÷A.;óêöCÛè.E.oÒØ܋só\%i&±& °ù@·ÔÂl¿*Àêµ #ƒEE°Ù>*Jd¯Ã¼Fo’nãpS¶´Vž3 ¾cÌÁÊy˜Bt!0˜ØºFÎêÚåª”í§®ýÏ륾ù8ȗÀ¢PùAK›jjI›¬yNØF¿PØ(wJa“æ”ö5„M°É×£]¢åŒSÄxI4\®ÔNKÈUÂÆ +¼ŸÊV*›„âyFÙÈOeû?T6þŸT6l+µ”-pÏ]?õ2.õk¨Ì MGVÉ׋‚2Ø]Ô‘B6¤h`" 4ƒ™o#§6±urƑG¼Š™Útéûð’(*Ô*RÚ¸їüˆÂ2i]zÅAˆä¨Íî’f`¦ ä²f€w®µOì ¢zO'ð(¢ „vìl2_}‹ôäÞôm/}<ÞË÷Q¼Üoä3‚Pì³$—_™d~Ù(I“A¢¿êCeKÊú]–…nÖêÏ"Ó=´ðÊ·Ø •>à”Ü¥²64µÊmYñ‡87Ã¥f”tYŽf>@«\WIÜGë´õԖ«UÃ^/ܦúŽÉÙQï:=àš»ÛùÃhòªÕ³1”ÆÓù›ñôÝÝøv¦û>×a:{gå÷V;`¬ÑÃt4œM%a÷#Æ·ÃÉã›ÑÓCá㚮¶†ë¦¦ÁãƒyMÕv2ˆ+ex!ò(‹ŸÄUÛ¡õ‡ó^ˆú–q8ò=ï9p{¸I—Pù`ˀ’Ó<™Ûd] +¾šuߊDd¡’Ùï;I—6ý;Oº¸Éº¾×ƺ®ÊZ`«Ll']G˜ŠSW­¤øø’.4eü¿…tWÕú¶p.Ü> +Ý3°”‡x8U;ü”teîË"]»»"]ù5ԏ‹¤KgéÊe"/P¤+›Ô¤«6µÚm¨¨HWÔ¹GöY–£Õ­LG‰û4QG|¨·)©•ߎNhóñõôñýH2bó&°ƒ{šÿ ìDa(ÿAìğƒ‘Ô¹‹—ìÄmvbMvbþÙ3á6„klü/¡™i—Ví¿•\¸`ÔGŠëX SÊZh‰ÁÌe6&¿0›¾î4«æy|ƒö™_]T6¢Å*ÚÌZpmÆ0ËOŽC¢Xœ9tÊL©Ï÷»yÒ2¾¼bþƒ&X´O@™4AuÔ³rJ„ÀÅïùœ’Gë…BÆ~ÛFî±æ%°r¬\ºn€Ôý~EÑ0lq#ǽJVðU²âÄ0³eå¡$OÐEIžò±KóØfLYk1¦ªX¶š×T‡_f †˜_iNl&W©ù"¶;™Pµ² äqÍ&%د˜â)Ý' Iè²°ÌÒ­™å)•ŽÙζùæȟJ‚fµ*GS£š|†|ÂÜL%IYãÈ€Æ÷Àí•Š§«d‡¡ÿR‰ÃRèõÅV& Ö"mÀ}:àτÎâóL„ѺÌeÅeê)õm~p»œ@ÂÀm®ãÛ ¤{™Å ³p+ +‘åv*©ÈÎÍ6SJ´¹g“PVNxÖr$²¯2ù؆i8£þå¨é›C•´²Ü`Wny¼ap:¢ÍQÏ:ç±G6J š)yÈ+e/ÒRáõ³”?œ|ÿôQæp mûõ$à쐿ì:f–éuíº{¤(ç¼'òëøÿ­ï7ÛµÜ^%âøpšì·ååCÕù¬ùý̳½8þS÷Hýkÿ“ þ‹þp8âPßüpís›ËI©Ü0}¶•š’^™bõ×Iü”…Ù7]ê&“0YíÕé¯ÿg¡6Vdªs‘ý©ÏX/×އÉ^åâ¨þõF“^f •‚ ‘bƒ€Ÿ·7%2u¾tË·¿vZj¿ˆ ;³Únë¢Øýrss8P”£}ï27 œ7§‹]‚€XͲ:Y†mSÅ:àCœ@åV`Ññ:ýÄë( +endstream +endobj +2592 0 obj << +/Type /Page +/Contents 2593 0 R +/Resources 2591 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2467 0 R +/Annots [ 2590 0 R ] +>> endobj +2590 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +2594 0 obj << +/D [2592 0 R /XYZ 90 757.935 null] +>> endobj +2595 0 obj << +/D [2592 0 R /XYZ 90 733.028 null] +>> endobj +2138 0 obj << +/D [2592 0 R /XYZ 90 603.233 null] +>> endobj +2596 0 obj << +/D [2592 0 R /XYZ 90 588.792 null] +>> endobj +2139 0 obj << +/D [2592 0 R /XYZ 90 453.492 null] +>> endobj +2597 0 obj << +/D [2592 0 R /XYZ 90 439.05 null] +>> endobj +2140 0 obj << +/D [2592 0 R /XYZ 330.436 340.513 null] +>> endobj +2598 0 obj << +/D [2592 0 R /XYZ 90 324.289 null] +>> endobj +2211 0 obj << +/D [2592 0 R /XYZ 450.246 249.289 null] +>> endobj +2599 0 obj << +/D [2592 0 R /XYZ 90 232.691 null] +>> endobj +2591 0 obj << +/Font << /F63 177 0 R /F23 144 0 R /F89 447 0 R /F65 179 0 R /F50 143 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2603 0 obj << +/Length 2233 +/Filter /FlateDecode +>> +stream +xÚíZ[sÛÆ~ׯà[ÉsµìÊSëI2IŽ«“Ç£ˆ¥„– ­þúž½àÊ)ÉNg:ÓXì圳g¿ó}káÅÃ/¾¿úËíÕõw‚-b *·ÛEŒRÄ)Yܦ‹K‰H¼ZŒñr¿ßݽ_Q¼,wO:­VD-Ëâ®IVkÊñò‡¢ÑÕ6Ùh÷ú³ÞjÛG¶‰DŒ/%Y}ºýñêÛÛ«ß®˜€Ä.É%’Œ/6ùÕÇOx‘Bû ŒX¬GÛ+_D”ÁïnñáêïW؛‡n¨xàÁ0!a I‚;_êÃþ.µë·¯¿ãx0ŠÆˆEðÁöþeáe¶Û9oî½WI]g…NÝ[óè›S]”yV$MY¹†r;é‹W:?äîí÷åËdwÐßLìy±v­I„8gά}ž|ÎÌ# Á(m—J'›G]OLÑ+—Ÿ›P!3%$ ˆHˆ¡n®¶“ŠyýcØ *»“`w˜±¥Î÷͓y¤&§óF)|ÑÓÀÄEÙ¸iïËC‘Ú]€ÖmUæî)¹/÷¿›´É&&lâ°.©ÌXíZ*ݪ¢$)Òà¦ÄHÒÎT EÀZ8~J©¶×›ËHEl8MúÜi(›LÓEåWŒYp©X‘n×(0=ü·Ãþ¯#¬ Z$Ÿœ¤ÉŒŒ"&»'‡g§·þŠ¦<@ò¦È/:tríçY3¨/rP_EDø"cÏX6Wmd³<û·¾;fÍã?¦ÿ¯˜c3fSu¬SΤ 0HY!éô,ŒÌ&ØVÃn÷|ˆ+†n©µ;}ŒWØ8¢ï²B'ÕÝ·Ÿ÷®ÊÌX›œœ‘!nþÞ¡¸5ãm©·3t“é¢ N®8¸šÛ6ÛGóS0¡G¡/\ -û®âÉ]ʍ„08ãU%ƒa2£=£u#8^œk·.À}Œ¶î{]èÊÔó Ãœ#<ÀÐþàLÆé½à$„E©>¿>Vz—4:ý8‡k¥„;%ÔÛù³…;R& »Ÿ}YgMfʃƒL× +6Ú"ò´Ì5lƒæ(D¸8_8”_:Dq3Eqóàë„5(?HY¿D¸P—èêƒyqõÁ6ë]i¼=¶Žý—ýrûß' +S±¥GfÖãc¶yt›¤ö15åÙå$YDå8‡²Â›Ó‚í9GáéFò|2Áà•ºL&xLd~ú¤å/›2ß×þ4ÆmňnƒÊ3‹÷+b&Jr ¬¿¾M0Cß ³$†iàs:܇9êf²wYpÛÓ2‡ì–¡Z7ˆ« xn½D<¾5³m]vœg¡$â6 †³Î:‘“üđ­C‚ÌÚ ÏþÊq¥m«_ÚjŠûêMÓõ Ø$/gýAB1d3ð® Ì2p(]T½Š‡ÜÁðŒ¬š;bÜpx‘^І¶ü1òð•~8“F‰8,„s®ÀVlFµâ Ik[klæd Í÷ δ£¼Böô¶¾ñ°2ûˆ=O!zÏþ¯¿X!ŠË +‘Ï*D6¯ ½¬ŌBds +±g‚/à +‘½\!bñu"ÿ: +‘?C!Òg*Ğ–þ¯(D9TˆJÍ*DýÛ€&ðŌb¯Õ‰†ˆt!ûCyn2{'*ê'lÒ(ªÏ4‚ÇÀýºŒ| +Úõ0vNnÐgÉ ÉQL‰—ÑDnŒˆëTn¸"0¾L„Ì¡È<Ž#;²C¡H\¸Ï €+'¡93I‹Îýí,ðØ)·üÆ5TCñiÅŸ&´:…ï-à}Ñxìi >Ön+;‚ÃDIð‹ÅˆÅ‚Ó«¤ÙØÄ4>›~Ž´á1ß*mlcï]àÛýS *’+&×MˆæP{GâûöÎ,⏰¹oa +¨ž[÷èdÖvÚ$މ{åBE„ŸÔÒ¹äpÿa¸f +a!Çxñ‚É^ÕÁ¯ö#_ŠPõ•/B ª°ÝoJŒ˜ã@½í,»; M„dÿMÈ0—5ÒÞ£¿ +3ºh‡.ϤŸøÔ\<n5)’R|=`0•+Žÿ` R€Á¼ Á¼;á¡©{ïÂÏC`0ï3ÀÀ–—€\åj n È´Ó8kâÊÜ3{:lH0öJlè":ý;˜¨çþ™‚ý³ð˜dÊÿuœçîªÆÝ‚}o64©òÄýWæû–<¹¯ï²û*©¼®~뺼KŠ‡CòàÇ»?½°7²ßôZWZ…ªÝ€Ÿ’t‘ûf0ÈQõÊß5B#ˆBŒ¨9ÀpG˺½Òtø×¢}úë•ÝäÞ/jvôØ4û›ëëãñˆ65:Ù¾BYs ˆt}š¯ý$ÄÜÙôP²µ4 ËÝUøИۛ§“}ú‘ÓÎÛ +endstream +endobj +2602 0 obj << +/Type /Page +/Contents 2603 0 R +/Resources 2601 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2609 0 R +/Annots [ 2600 0 R ] +>> endobj +2600 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +2604 0 obj << +/D [2602 0 R /XYZ 90 757.935 null] +>> endobj +2212 0 obj << +/D [2602 0 R /XYZ 215.12 657.884 null] +>> endobj +2605 0 obj << +/D [2602 0 R /XYZ 90 642.403 null] +>> endobj +2274 0 obj << +/D [2602 0 R /XYZ 215.12 423.747 null] +>> endobj +2606 0 obj << +/D [2602 0 R /XYZ 90 408.266 null] +>> endobj +2275 0 obj << +/D [2602 0 R /XYZ 137.91 333.017 null] +>> endobj +2607 0 obj << +/D [2602 0 R /XYZ 90 318.971 null] +>> endobj +2276 0 obj << +/D [2602 0 R /XYZ 90 211.179 null] +>> endobj +2608 0 obj << +/D [2602 0 R /XYZ 90 197.233 null] +>> endobj +2351 0 obj << +/D [2602 0 R /XYZ 90 89.441 null] +>> endobj +2601 0 obj << +/Font << /F63 177 0 R /F89 447 0 R /F50 143 0 R /F65 179 0 R /F23 144 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2613 0 obj << +/Length 1621 +/Filter /FlateDecode +>> +stream +xÚíYK¯›FÞûW°+HñÜy¤«6Jª¦©”6î*‰,l¯Qmp_Çýõ=30¾¶o¢V©²ãáœï<¿™öî=ìý4úq2º{%™¡HRéM–^„=% ”x“…÷ÞWˆDÁ˜`Œýív=}PìgëÃJ/ò€„~–NËø>SýŸÓRçËx®ÝÏßõRÛ5:µgÂW4ø8y=z9ý5"{Ī +)&¼ùfôþ#öðüµ‡‹BooWmuË?`ÏÙo,º{F- +D9Å'·¤ƒ”£(l< Ƃ8Pó,-ÊkõŒã(÷Ƅ HTFÕ9Ú` ©ÖˆÖÒÓû\¯ãR/>º•·õ ö ¸*$A½}áë¯ÂE¿ÌpŽhÈz^é—Q½ N,wk#ãn³å€%„ë’†ð¨a1ä‰BÕ9 (Rd€+D„£•OªP¼ +ˆð3žG~¹Òîf‘mâ$u÷`†½n«hÇÏêÅIáîêkózoª»8 ~1dAÄ9:Òfn%2ɨš®vëu•â&¹?Z r8æFÇbJ "Štlî¥Ø˜Žä"£Pu¼[€¤S€’+Àxùcšêi²ÛbxË¿7ÆJzk Reú@ƒx»€L0tºv2b-’N‹ÄH>lõ€ðò7ðçCÂdû€ð±Ë|Q·t]õ¿IRçӗŸ¶®ÊBB$8¯µ¬õÖÆQõr§ëE¦­Ëç‰NË3:0"LÖgšùr݅ +Š¤’ÝRšÀyœË,ßÔ]fU‘ͶÉîAÍIÌû™ÐÑiƒ [^2R]y$iEpu?Š—¾ËS÷D›2‡h¹H5°‹±ØêybÞÒU{0bâ<‰gkm ª!¶~eà4ðà5$yä@¾ `É¡ïÏ;Ž‚º¡ ‘Â&åB„!ñ[îh½Ñõ‹@7Q› ø»22.Ý]R‡¦•^|ßSÐ¥°Jƒ¹ÖM£ª§³˜BýàS۝ÝìWÉ|ՋÆuA¬­q™pÑ̙BÚ%yÖh•Jœ˜’î6:Ë,o¨î6ð`:¥m/iîØ Æ…N³M’~ÊA¡Ê•>Àä¡máR]$‘ª&›ØˆyãV&͎:O"¤Õ:æô:!Ä3vXòà”ây›ú ÂÈþo¢àƒÅN ÅnV”I¹+¿qÈ7i’á&ù:X„|M4ÂÚ4u}ŽFìaS/ÚgË#³›PtŒ©›#„…¼G#õс ‚Uî†bì4ä6†ï„øil÷èØé׳A69¦êçëjDíf×QsG[íO‰Eן—yMH¤ˆúi N´¢7`¸uè2Ì]qÞD­)¼*ÝÏ[ 4â—%71Ú'eÕB¡tÉÊS–³"íŽtB҈¸7„¥S3Y„F½Nþ®‰ºäK»K”n 0H==ʦ|ãߤ¦yåI):¬Ä&/CeíîŽ+9ƒj!‘GUˆ~tf)‘´[7µ´ÓʶBÎ̼D$ÓJ£NÑÎTñˆ.ÎDJ”W ÙËv҄ñ!ү˝°¶¡Faò$¬¶kñ€R TCB­UG­·¨ÚöÚnÈk¡¯Ék¼¢ðŸ… +q+çÔgÌƒ6ɶÏßqì&:c +º ~Û]µ;ª(²úqè1÷½)Ô^‘ö¨ÜÑhUœ·ïföGŠ±›÷GëÌ ÝwfÏǍüçnž ¢¶ »Ù²ä’ ýÑù—‚ßΨ§ïýÌ&jžm6Yj¹ñÊý`/,qýAàɶÝÖÐÿ8%C‘ðÚoS¶cíǖ"DG/Þ¶ž1Ó]L5mbó“úõ€>vÿ¾Ifyœ܏nɛ8½ß9N†‡î{›mQóêÑ…ο „ð ÷¯qº‹×î?ãì£Z™;›ÀC8˜cD÷Q0f°~§ë“†óÀŸ^}÷ËÈÒÿÑ.Ê¡Ç5)¹*Ëíó»»ý~æÚ¥É6GIy{­»ÓÄh³G"j¾T,mÔØ&˵³!IM³má$NÿÒ:;i +endstream +endobj +2612 0 obj << +/Type /Page +/Contents 2613 0 R +/Resources 2611 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2609 0 R +/Annots [ 2610 0 R ] +>> endobj +2610 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +2614 0 obj << +/D [2612 0 R /XYZ 90 757.935 null] +>> endobj +2615 0 obj << +/D [2612 0 R /XYZ 90 733.028 null] +>> endobj +2352 0 obj << +/D [2612 0 R /XYZ 509.915 675.861 null] +>> endobj +2616 0 obj << +/D [2612 0 R /XYZ 90 659.134 null] +>> endobj +2353 0 obj << +/D [2612 0 R /XYZ 90 510.446 null] +>> endobj +2617 0 obj << +/D [2612 0 R /XYZ 90 495.875 null] +>> endobj +2354 0 obj << +/D [2612 0 R /XYZ 90 347.187 null] +>> endobj +2618 0 obj << +/D [2612 0 R /XYZ 90 332.617 null] +>> endobj +2355 0 obj << +/D [2612 0 R /XYZ 90 154.754 null] +>> endobj +2611 0 obj << +/Font << /F63 177 0 R /F89 447 0 R /F65 179 0 R /F50 143 0 R /F72 202 0 R /F7 2619 0 R /F23 144 0 R /F8 728 0 R /F13 2620 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2624 0 obj << +/Length 1776 +/Filter /FlateDecode +>> +stream +xÚí™[ÚF€ßù~«-…Ù¹_Ò§6Jª¶©”6Û§$B^0`lj`·Û_ß33¾‚ KhR5Ê،ÏmÎåó€ƒE€ƒFßߎn^Id$•Áí<08P’ AIp; ޅ + Æ8ÜlV“7Åa¾z\&³"":̳É.^Dc*pøc¶KŠyi>eKј(¢¼ô!Ívјq>äÌ]¾ÏfÉlÏßcL³d²ñ.¤ëx‘Ø'Eø < +ëÜÍ+mZ1F2ìum–~MÇj‚]ÀË%Ï¢±bÒY8K×I¶MAôØ>€1"‚1!ȈÒÉÝã&éÑìâÀ*©÷qѧ™!ª[Š Ö~£§y¶ÝM^§Y“—•aØ:[úÜ$‚"Ãd%ju×£ öXü{ºjQû»§„ô@[O‰×ñ|‘'nû§i’íz-)¢*é³ý]«‡”!åѶ‘ Miµè]‘¬â]2ûàW +ÜZ  +IÊýúï @‹lë‹m—÷Èç6—f^G0áˆóz×v˲v7E•ñö*Ÿ÷—a"/þî–^^‘l7ÉtW[î?—e+ÚN4©‹g íĶÆ«ôïdæŽç6e|ɖâüšlk›×1ÚCZ•š‰ŒbÚÛJ\þ2d`KZ9ÜíUœ d8 ¤æC~hXI!ë–åZU[!ç +ÊÓRi„èdí´4Ä »8XWf´3Ÿ“ ßìÇ}$dXUï<ßÈéö%6P¥` íÂh=Ñ­ˆ3®;Àm]~åXD-k#.«%­ê½°©ëdö큂ŽIãRƒý´yÛƒFiDå±Q÷…‚*ÒønUÞ)‡eyñØÔ±û²°…zP¤Ti§@Ëâ<㐷Î;Ô)Ô!w( ;r'Û¯Á¼]^Ô=®kþ*·Ö>TÆ9_Ól1äJbÛ Œ.?¶Î¸à-j»°¿ûˆ49çÂ~³ù$æ·SªUƒCÖÛoÇñ·5Í×ëBB“#ûÒò´n'¦ƒòe}£/iŽ\žÌEºXžˆýÕðkmº’ϓâ•NœÇBÕÅBÙÆB‚ée\Ø=ftñaDÂ3ˆ(aH°Ë‘ræÅ*„QÜ!oa~`Di`R˜ËQèš5»œ-ü™ËQèeDy ºXr@gp°Q~ !`°òÏH†S }U²¡8:idƒlÈØùÃ@ENY礑Ÿ4qðꤑµOK<´ 4z树4Ò£ƒFv–1Òü²ƒ:yŠ%\[«NÑ!#ÜÑ!;A‡Ê\ò€j 15×à¡Rˆ ’(à;‡Üá¡húráõüåª[XØ=O5Åùßá¡x"j¨&ñåÓ!ùŠ‡Ÿ ¿Ò᧧Ãڦó¥F†è§þ™íú&8Õ4N! ´LÞv‹1ÛlV¯c{IÃ7e]Æþ××é]þâ…_ò:Î{?]á¦ÿƒÞu’iyë÷mR| ný¿ÄÙ>^ùß,€Þ[•Ðq|ÂMŒ ›R (3Ì÷I•d>Õ·ŸG®Y6~Q­¨.åån·y~sóðð€¦[´ÏÒMÒÝ ðÑÍñŽ·ÿqâH4¬9w[ †­ó"ñ>¤™mE®vŽöé(82 +endstream +endobj +2623 0 obj << +/Type /Page +/Contents 2624 0 R +/Resources 2622 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2609 0 R +/Annots [ 2621 0 R ] +>> endobj +2621 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +2625 0 obj << +/D [2623 0 R /XYZ 90 757.935 null] +>> endobj +2626 0 obj << +/D [2623 0 R /XYZ 90 733.028 null] +>> endobj +2413 0 obj << +/D [2623 0 R /XYZ 90 560.67 null] +>> endobj +2627 0 obj << +/D [2623 0 R /XYZ 90 546.1 null] +>> endobj +2414 0 obj << +/D [2623 0 R /XYZ 90 357.561 null] +>> endobj +2628 0 obj << +/D [2623 0 R /XYZ 90 342.99 null] +>> endobj +2415 0 obj << +/D [2623 0 R /XYZ 90 154.451 null] +>> endobj +2622 0 obj << +/Font << /F63 177 0 R /F89 447 0 R /F65 179 0 R /F50 143 0 R /F72 202 0 R /F7 2619 0 R /F23 144 0 R /F8 728 0 R /F13 2620 0 R /F11 727 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2632 0 obj << +/Length 2239 +/Filter /FlateDecode +>> +stream +xÚíZ[ã¶~Ÿ_¡>UÖÞ)&íC³H‚¤[`›>M‚Ö¦m¡¶ìJšº“_ßCR7jhÏ ºE O¢$êœÃsùÎGÚ8Ù&8ùþ曻›Ûï$K4ҒÊän“hœ(I $¹['÷©BD/–cœžNûüã‚âô¸ڙu½ Yz¬ò¶Ø.–Tàô‡ª5õ¦Xû“Ù7ÇTîáL¤Š/î~¼ùöîæ_7LÀ q*…BŠ‰du¸¹ÀÉžÿ˜`Ät–œÝ¬CÂ)ƒë>ùtó÷|Õ|Ê–b4QDU·†²jKIù¥ÅlMeêb_þbÖy±ùcZ™¼<[“ïwM^ïû¹HÆ_ò‡]áíw™ž˜ÅC‚)0ÚYuÚù9éƒ×ûïÀ^Τ3si''K–q„…J–„ -ºõ­ŽUÓæÊÊuþíNÞáMS^0„PŒ4ÔÀšb–PD2>5ka|<,–<˜Qö.oµ×85¿[(ž>LL§”ˆ1Ö˫;y:DÔRÉæj­²`•½;¨DbîŽWx2MÊј¸¢ºŸ¡&Ý1CP6:òVU´fýàg +<™¹Ì(RJ€¥ šrÿÁ_ÀÂmÙD9MÛcDçˆP2O™@2áˆÉ!PíÎxq._ýð¸‰Ha®_–,ú)ç²ÝyyµiNfÕfÕ8ÅN„¢J ž Z¶ ‚S[\ "R_`^H±±ó•Ö‰õsªÆâ‡SP/ä8‚Ú…4°#Nijœ&,‘H+–u9MM8â}®àn™z I“ådZ©ÒۈV‚°z–F¡8QMšr–žw¦6Ռ@^± ԆÙÄ!6€Ñ'¾ôóËƃ®ÏÔ½»ÜÜçãޏŽkç}¸ùüKm&AƒŒl` +(“r4Ù"{ͳŠ‚Ü`5HBò¹O>Ú¤(êâ` s4_FA!˜dHa ò2C:ÍàÉa ¨x(Ô»ÞA§µ{µ»¢õ£Á—µÍÁc}0ë¯g +“–{Õ:ÄTm]šùå-d~ã@‚h6ºœh>qœ}eg¯kãAbí'õ¯‡‰¥¤gƒÅeÄbd ÍeŒtAÏ"|&" ]¼ºŠvf¤¨¼æ¸À ‹’!ÀÇ ›Fø¾|X,%äÔþì¯Pªc›ùÌ+³>¦£ƒW¾öñá°Ç ,̾#äZ}.WQ$-- ê®×Âýc5‰‰}ás\‰Ðî4õJLÜUPVŒ¦?l¼Š®òIP]¤3 §A¤3_76:‚²WôÎÖ±;{{…p C.¯ÉÎP¦¦|ÐÃ[ˆð¨ B~ê à±r$^\×®Ö8™§Ìs8@7g#ÕCñðHÁ2G'šÇ}ëÇÚÄ,܋X=¬~ªkú)ë£i¼@Hn?ðlØ«-ü£Bì͘öÎïƒìܶ·ÿTO>è%¯M³ªËσåݗñ-Ғ0ØkhVË€ì« Ñš¢¶Ø(ú¦dߞº•m`‘J‚ÙAß3†ÞÍqtM‡¿¾0<åBœ¹C€Ióʜó÷¿)©}8¥9?8äß»°.ÿôÔ´æॼLèÔF&í¦xÂ0‹°¥ñ¨%N¢‚E¨C-uøCÝfØYË|ñcÈt‘{ßÂrÁë"¯bBÄ2Çð'EöÍc¹_Û¼$Ê%7\€K>û›÷þ2Ý ÙûM}<ø‘Ïr4]ÐìØq'¸n{WÄZ<…MùˆÛèöX 2ö!Çè­Øs]¶&4ÚÒý}gÉÆ1´©mݒöOþvUë%I*¸Ãäÿ替~ëW¬×v¯kÝzzlvŠŸ˜@ëeÏ°0*1²bÁˆmIÏå¾Û±—tϲÕÏPèî¡"ØyÓñä+‘€€DQ‚2›ˆ,Ž$8mÅ~c2…ˆ ÂýQÝêiµ7x°Ÿ¿`ÿÄè ðaRúø © +Ïb©KÝ^… #®þŸ¸0ì©ç?Ѓo4Ä핿ϻßå!7Æ4„Kˆ ‡³‡8ÐvêCaoiú± Sáß~(?×EýäoÞû)ŠjûèÏ'á¡ÿρ; Zuþјú !ÒÆð·¢zt»(xgSÂïÕê.áá!F°-¦ÖYÈ&O?Ó9Ã{àŸI?úëóå¸.ʁ—±Þµíé«ÛÛóùŒV z¬ÊSÊöbûüÄbrºHfF*â0Êv8ÖƯ¡¬ìY’ëçh§ÿÒ,“Ÿ +endstream +endobj +2631 0 obj << +/Type /Page +/Contents 2632 0 R +/Resources 2630 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2609 0 R +/Annots [ 2629 0 R ] +>> endobj +2629 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +2633 0 obj << +/D [2631 0 R /XYZ 90 757.935 null] +>> endobj +2634 0 obj << +/D [2631 0 R /XYZ 90 733.028 null] +>> endobj +2416 0 obj << +/D [2631 0 R /XYZ 90 565.934 null] +>> endobj +2635 0 obj << +/D [2631 0 R /XYZ 90 551.364 null] +>> endobj +2417 0 obj << +/D [2631 0 R /XYZ 90 378.765 null] +>> endobj +2636 0 obj << +/D [2631 0 R /XYZ 90 364.194 null] +>> endobj +2468 0 obj << +/D [2631 0 R /XYZ 245.645 236.078 null] +>> endobj +2637 0 obj << +/D [2631 0 R /XYZ 90 219.47 null] +>> endobj +2469 0 obj << +/D [2631 0 R /XYZ 332.797 144.724 null] +>> endobj +2638 0 obj << +/D [2631 0 R /XYZ 90 127.997 null] +>> endobj +2630 0 obj << +/Font << /F63 177 0 R /F89 447 0 R /F65 179 0 R /F50 143 0 R /F72 202 0 R /F8 728 0 R /F13 2620 0 R /F11 727 0 R /F23 144 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2642 0 obj << +/Length 1400 +/Filter /FlateDecode +>> +stream +xÚí˜Ioã6€ïþºUj†‹HJ¹u‚v0Óé m\ô†bѱPYr%y\ÿû>’Ú¨hâÌ È)'q“ø֏ÂÞ£‡½÷³wËÙÅ/‚yŠÞrãEؓ‚ N‰·L¼[_"Ícìï÷ÙêzN±_d§­JÊ9 ý"_Õñã|A9ö?äµ*7ñZÙîj£Ì•›!0îK>¿_~œý¼œý3# öˆÙ’K$÷Ö»Ùí=öÿèaÄ¢Ð;šU;/  ž™w3û}†‡âs<Ÿ2„·â¿;¤YRéÝ#?¶\Í)÷¶seûF¥"·ýR­ç„û§u–æZ;PºÞ*;WªZíl»ØØç£ÊU×EYiõÀ¤|  $¢„‚ÄF¤Çf#7 aa»$ÎûÝc™ÖÊ “Y#ʦ(áæÄ7òA»Ñ/;Ù5ëRŵJôžÞ‚‚kÁÌ BPÄ9ºƒßâºy&I©ª)…BhÒNŸý~;¥Dcíd·'X¢ëý%4°sËm0½c 3–ê˜f™m¥ùVYl§n_®ö]à%éNåUÚ¾ >šð åˆ +ö¼O¬‘†*t‘7ʚe!ø8€G"ˆì+Í÷ãRGRqt9ú‚»Yˆ$ŽÀ2Qï™å6ß3FýÍ!_×F#ƈ¿+’ôcªšYc=х¡o#UO•:u&&vîá4©°7Êå„U(E»æ°·BQØ >”ùÐáÔÏ »k\U‡Ý¾•œúë¸QáAµɐ”¢‰Ha?º‹“Æ•­Óº²/:Dâì P#¾ã+ ò/Š—=ÀEŒ6Ks:Äâ,WÇÕçÏWSXÛØÆnõ¾5êê¦Ë|ìßaŽ¿D+ŠÆ$AÄEc6ð³«Âh°J",ɓ¼rt$qÜå˜;`¨²°eQ€0$§“âë"¯ê'Š´‚:"°!Ãqb82„Ä²W…“‰P‚íCÚér[ªLSè~" DçŽ.:p3iȏž 2x͎: €þ¦,v¶eÙk;bà!6<Ï›£çˆÍHà¾Û»•[ôÄÖÒb÷ÂI×°x„kŒ ÝìxãõËyýÓú(ƒ2 DÄ]B°!!Pì !lq³†"AM@Bpö͐ˆ^â $@Í ¤/ é)a¼P £Ñèôñ^ FŠ¢W…Ž”Ó``Ä$˜~t¨; Œ'"õĨ¦ÓCöà„FwRKý|žÀsÆÂçã‘CòR‡ú»-! +´„ÐmC-'\O …P `TõԘLÅó€ Î}|!X„€‹ø[E÷VÑ9ÿ?+ºÐåu0äu€Å×.¨÷CV'«Af›÷ÎcÚ!!,IÖ×i“Ô«´0Â#Ô¶õZ€åÄ5×3B¤¿&…áÊaæBø§$©ÆéÚY6AÍóY„¸§*ÏYAšuñm{~ŽBÁÄ؅ß 8ˆxcÅ«Þþz:P}g‘£Ã')Ö86ê¸î[}›J«öìÑ?­æp£ëN›£éUN8µgks»á¦È²Âœsö_חCL3åzÜ#plCÅ c„GMÝA.»«nvµräBIñ¯³lüÿL„(‚²ö…¿ÏÚßfª+Èþ6ãâÜ)ñó¯uôÆåÎÜd¨ÝÀ1¶³ŸÒ‡2.O¶se—|ŠóÇCüؼÿad]ú³RåsÎýʾð[œâÌÎiÑ[ª²9ía®@€HÍ1уÿF©ÆÖ{mëי é^/„¨¿-oëzyqq<ѺB‡<ݗ(­/€ËO“³ÿ +ñ¾òm®p ±TV‡4‡Á 44öÓ¬ó† +endstream +endobj +2641 0 obj << +/Type /Page +/Contents 2642 0 R +/Resources 2640 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2609 0 R +/Annots [ 2639 0 R ] +>> endobj +2639 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +2643 0 obj << +/D [2641 0 R /XYZ 90 757.935 null] +>> endobj +2470 0 obj << +/D [2641 0 R /XYZ 90 625.864 null] +>> endobj +2644 0 obj << +/D [2641 0 R /XYZ 90 611.294 null] +>> endobj +2471 0 obj << +/D [2641 0 R /XYZ 332.797 534.61 null] +>> endobj +2645 0 obj << +/D [2641 0 R /XYZ 90 517.883 null] +>> endobj +2532 0 obj << +/D [2641 0 R /XYZ 90 375.635 null] +>> endobj +2646 0 obj << +/D [2641 0 R /XYZ 90 361.064 null] +>> endobj +2640 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F65 179 0 R /F23 144 0 R /F89 447 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2712 0 obj << +/Length 997 +/Filter /FlateDecode +>> +stream +xÚÍXߓ¢8~Ÿ¿‚G¨:Ýá‘Óèp‡à"ÎíÖÞUŠÑèQ5¬ˆw7÷×o‚ŽS:BðÜ=L©LøúËםNwe¥eôN>Ž> ͎»íN×ԕh©Ø@é^»kð_ å›êÒùGû#úåðÒ§¡»m›º)^JKín×Ü­ïk-ݪÓÕ6^‘Ý/—f„-5ÔxN~Ú£*L@Š/áèAù–¯…Ö‘µ¶mØÛáâ,Î^×d#V)óÐ ¥ù +cÏ`2ñp?ð§Qè¸~„£¯„Ñga|¦uêxzïÞ(†…ÈÑ „j„BÜzgf¿„7iÃ¼NôèøuQðÐtŠƒ³Ö÷njD‰œFé>Ï!U67B> +÷RkÐÎÍö½`: Q‰ö“€s¼×®‹hx®® vSŽ~Í@uòâ0Ô¯w°ºƒ:4ªj¢$ +4[WÐ#~RoŠ³"—r§]}ÖëLèö;î§t“±8¡Ž4 ¨> endobj +2647 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.191 683.853 192.146 694.757] +/Subtype /Link +/A << /S /GoTo /D (page.18) >> +>> endobj +2648 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.274 650.354 279.23 660.884] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2649 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.91 626.444 197.865 636.974] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2650 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [161.502 602.877 173.457 613.064] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2651 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.091 578.623 179.046 589.153] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2652 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 556.396 140.809 565.243] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2653 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.165 531.146 175.121 541.333] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2654 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.649 519.191 264.605 529.377] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2655 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [259.294 507.236 271.25 517.422] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2656 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [249.95 495.28 261.905 505.467] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2657 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.979 483.325 293.934 493.512] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2658 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.252 459.415 205.208 469.602] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2659 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 436.845 140.809 445.691] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2660 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [224.913 422.832 236.868 433.736] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2661 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [223.23 410.877 235.185 421.781] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2662 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [246.472 398.922 258.428 409.826] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2663 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.965 386.967 278.92 397.871] +/Subtype /Link +/A << /S /GoTo /D (page.26) >> +>> endobj +2664 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.947 375.012 203.902 385.915] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2665 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.963 341.856 268.918 352.042] +/Subtype /Link +/A << /S /GoTo /D (page.21) >> +>> endobj +2666 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.599 329.901 264.555 340.087] +/Subtype /Link +/A << /S /GoTo /D (page.21) >> +>> endobj +2667 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [261.108 317.945 273.063 328.132] +/Subtype /Link +/A << /S /GoTo /D (page.21) >> +>> endobj +2668 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [275.434 305.99 287.389 316.177] +/Subtype /Link +/A << /S /GoTo /D (page.21) >> +>> endobj +2669 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.494 294.035 263.449 304.222] +/Subtype /Link +/A << /S /GoTo /D (page.21) >> +>> endobj +2670 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [261.207 282.08 273.162 292.267] +/Subtype /Link +/A << /S /GoTo /D (page.21) >> +>> endobj +2671 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [276.958 270.125 288.913 280.311] +/Subtype /Link +/A << /S /GoTo /D (page.21) >> +>> endobj +2672 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [189.178 246.214 201.133 256.401] +/Subtype /Link +/A << /S /GoTo /D (page.21) >> +>> endobj +2673 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.185 234.259 215.14 244.446] +/Subtype /Link +/A << /S /GoTo /D (page.21) >> +>> endobj +2674 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [201.89 221.587 213.845 232.491] +/Subtype /Link +/A << /S /GoTo /D (page.21) >> +>> endobj +2675 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [201.89 209.632 213.845 220.536] +/Subtype /Link +/A << /S /GoTo /D (page.22) >> +>> endobj +2676 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.577 197.677 166.533 208.58] +/Subtype /Link +/A << /S /GoTo /D (page.21) >> +>> endobj +2677 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.953 163.804 172.909 174.707] +/Subtype /Link +/A << /S /GoTo /D (page.19) >> +>> endobj +2678 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [166.492 151.848 178.447 162.752] +/Subtype /Link +/A << /S /GoTo /D (page.19) >> +>> endobj +2679 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [239.538 139.893 251.493 150.797] +/Subtype /Link +/A << /S /GoTo /D (page.19) >> +>> endobj +2680 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [222.393 127.938 234.348 138.842] +/Subtype /Link +/A << /S /GoTo /D (page.19) >> +>> endobj +2681 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [166.193 106.02 178.149 116.924] +/Subtype /Link +/A << /S /GoTo /D (page.22) >> +>> endobj +2682 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [244.239 94.065 256.195 104.969] +/Subtype /Link +/A << /S /GoTo /D (page.18) >> +>> endobj +2683 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.413 672.615 363.368 682.802] +/Subtype /Link +/A << /S /GoTo /D (page.21) >> +>> endobj +2684 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.232 647.988 382.187 658.892] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2685 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.232 612.122 382.187 623.026] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2686 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.232 588.212 382.187 599.116] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2687 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.232 564.302 382.187 575.206] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2688 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.232 540.391 382.187 551.295] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2689 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.413 517.198 363.368 527.385] +/Subtype /Link +/A << /S /GoTo /D (page.21) >> +>> endobj +2690 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.413 493.288 363.368 503.475] +/Subtype /Link +/A << /S /GoTo /D (page.21) >> +>> endobj +2691 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.413 469.378 363.368 479.564] +/Subtype /Link +/A << /S /GoTo /D (page.21) >> +>> endobj +2692 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.413 445.467 363.368 455.654] +/Subtype /Link +/A << /S /GoTo /D (page.21) >> +>> endobj +2693 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.413 421.557 363.368 431.744] +/Subtype /Link +/A << /S /GoTo /D (page.21) >> +>> endobj +2694 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.413 397.647 363.368 407.833] +/Subtype /Link +/A << /S /GoTo /D (page.21) >> +>> endobj +2695 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.413 361.781 363.368 371.968] +/Subtype /Link +/A << /S /GoTo /D (page.21) >> +>> endobj +2696 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.232 337.153 382.187 348.057] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2697 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.232 313.243 382.187 324.147] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2698 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.232 289.333 382.187 300.237] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2699 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.232 265.422 382.187 276.326] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2700 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.232 241.512 382.187 252.416] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2701 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.232 217.602 382.187 228.506] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2702 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.232 193.691 382.187 204.595] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2703 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.413 170.498 363.368 180.685] +/Subtype /Link +/A << /S /GoTo /D (page.21) >> +>> endobj +2704 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [360.827 146.588 372.782 156.775] +/Subtype /Link +/A << /S /GoTo /D (page.20) >> +>> endobj +2705 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [389.36 133.916 401.315 144.82] +/Subtype /Link +/A << /S /GoTo /D (page.28) >> +>> endobj +2706 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.56 121.96 499.516 132.864] +/Subtype /Link +/A << /S /GoTo /D (page.29) >> +>> endobj +2707 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [427.795 110.005 439.751 120.909] +/Subtype /Link +/A << /S /GoTo /D (page.30) >> +>> endobj +2708 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.474 98.05 405.43 108.954] +/Subtype /Link +/A << /S /GoTo /D (page.32) >> +>> endobj +2713 0 obj << +/D [2711 0 R /XYZ 90 757.935 null] +>> endobj +2714 0 obj << +/D [2711 0 R /XYZ 90 696.969 null] +>> endobj +2710 0 obj << +/Font << /F63 177 0 R /F50 143 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2769 0 obj << +/Length 1110 +/Filter /FlateDecode +>> +stream +xÚÍY]sâ6}çWø­f¦ɶdÜÇfÓL¶Ù Ý°3ÉîxÄ­¿*‹²ô×WF@°‰m6|X–ï=çÜ{%Y‚Æ€ÆMï×Ioø± xÄ"ÆdnxÐp ØBÆdf<š·÷®ÿì›|4dh»ò¹Í ×Í[{דÞ?=$¡6c¸66¦Qïñ4f²ý£íŒÕ¦Wd8–-Cã¡÷GÁ°Ē VþÒ4ô¯’8œ±ð֙`‘?Í[ü@0NEÂ}A?o`)<|±öù¦g<, MÛÙÞW~å×!àáZ/fq³öH£=/£C£“þšë”m‚…¤.>ô +*d‡¬Á·å} +ÆH ã\ +?MfՎ¯ó.MNQÓ2ío#~!ÖGx0»<Ší¿BhÅ4 þ«öy¢Áò4I¿P=¹ðF}äDê×Âj³95›+Fþ$9 c:ÖëžH“' v[6›Ç·@¦[p¹Œ ÿß¾…MÊú2?YŠt)üù2žŠ ‰}ÑI9Ír”hVœ¦¾Œƒxq¹Áè.ˆåþõ÷”³,ÛðnŽ¥ÛËO·cÌ©«às••Ôᒠ+©ôÓ_Lj¬š6Ù^ôJÞe›Í ±­©ü¡Ù$ADC‡–] P…Ù, •D?ˆFV” +OǪFj ^˜“bðvIs]Rì(Z:šaí*TñFɕ叓pýÌf\Vòœ'Q±E‰i{`„QÑÈ*ÏrŠÒåÀ¾b½é[©ÖÕæÜ #Íb¬á‘Ä ¾dñ”Õ°PSÜŀcMàÅ·ÚR¾4ºòòà9œëœ îþþ}d¯wΦ9¦õT®1ꓘ\&‰Ë¿2Ü`éXâµã³ËíEù6iONˆÇKö·ǹð_/Œø¥2ènX?› ¬cB4™œ4°ã7©é¶Aø1éïu zmæ¿rw zÞVù ÷Ûæ~ý ÔýiὖÀ;˜¼îbð¾ bœHi3&äŸ Æ󋵃T ~¿·4cœÍåG¦Û+TH+§ƒÊÅlëý=\ž_#ѵ¾-w©ÖAˆÎR­]0÷«Ï®ÔhÒ]Öhðׄ5_u»Q¨E¦t¨TVؤ=m¼ÒÒíntlŸIg8Ëå©ôöZ>1­ŽÍÞ Í'°Y>èmWYClÚÌPH;µÈ¶«ƒ¬`­|öKFÀC#Ý£ßݑ/žk¶G¾Ø“¯²Ž‚5yfýeÛæ8‡ByDóKk¿F¤êî]ðÄ)_«‹+ÕåŽÆ‹%]lŸ¿e¹Íûštºmú’1þSc3S|¢ñ’†êÞWˆ¡ÚÞãùŽºj„A`É[ô6tÌƶb(þ6vÿ~ÏÏÔñ/ËhíΟ…HW«˜f`)Ê ê–ÄAÈØóvVæ WÀ¢„3Å!ˆecDó=UPŽÓÿŒ¿¡p +endstream +endobj +2768 0 obj << +/Type /Page +/Contents 2769 0 R +/Resources 2767 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2771 0 R +/Annots [ 2709 0 R 2715 0 R 2716 0 R 2717 0 R 2718 0 R 2719 0 R 2720 0 R 2721 0 R 2722 0 R 2723 0 R 2724 0 R 2725 0 R 2726 0 R 2727 0 R 2728 0 R 2729 0 R 2730 0 R 2731 0 R 2732 0 R 2733 0 R 2734 0 R 2735 0 R 2736 0 R 2737 0 R 2738 0 R 2739 0 R 2740 0 R 2741 0 R 2742 0 R 2743 0 R 2744 0 R 2745 0 R 2746 0 R 2747 0 R 2748 0 R 2749 0 R 2750 0 R 2751 0 R 2752 0 R 2753 0 R 2754 0 R 2755 0 R 2756 0 R 2757 0 R 2758 0 R 2759 0 R 2760 0 R 2761 0 R 2762 0 R 2763 0 R 2764 0 R 2766 0 R ] +>> endobj +2709 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [264.454 719.912 276.409 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.34) >> +>> endobj +2715 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.689 707.957 216.644 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.35) >> +>> endobj +2716 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.368 696.002 182.323 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.36) >> +>> endobj +2717 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.75 672.092 165.706 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2718 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.931 648.899 146.887 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.21) >> +>> endobj +2719 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.75 624.271 165.706 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2720 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.75 600.361 165.706 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2721 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [127.748 577.168 139.703 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.19) >> +>> endobj +2722 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [262.77 564.495 274.725 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.38) >> +>> endobj +2723 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.005 552.54 214.96 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.39) >> +>> endobj +2724 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [168.684 540.585 180.639 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.41) >> +>> endobj +2725 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [285.56 528.63 297.515 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.42) >> +>> endobj +2726 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [226.248 516.674 238.203 527.578] +/Subtype /Link +/A << /S /GoTo /D (page.43) >> +>> endobj +2727 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.927 504.719 203.882 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.45) >> +>> endobj +2728 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [127.748 481.526 139.703 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.19) >> +>> endobj +2729 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.75 456.899 165.706 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.26) >> +>> endobj +2730 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.75 432.988 165.706 443.892] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +2731 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.111 421.033 216.066 431.937] +/Subtype /Link +/A << /S /GoTo /D (page.47) >> +>> endobj +2732 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [205.237 397.123 217.192 408.027] +/Subtype /Link +/A << /S /GoTo /D (page.53) >> +>> endobj +2733 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [205.237 373.212 217.192 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.53) >> +>> endobj +2734 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [205.237 349.302 217.192 360.206] +/Subtype /Link +/A << /S /GoTo /D (page.53) >> +>> endobj +2735 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.312 337.347 197.267 348.251] +/Subtype /Link +/A << /S /GoTo /D (page.49) >> +>> endobj +2736 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.041 314.154 178.996 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.53) >> +>> endobj +2737 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [249.819 301.481 261.774 312.385] +/Subtype /Link +/A << /S /GoTo /D (page.53) >> +>> endobj +2738 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [213.944 289.526 225.899 300.43] +/Subtype /Link +/A << /S /GoTo /D (page.53) >> +>> endobj +2739 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.717 253.661 206.672 264.565] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +2740 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.717 217.795 206.672 228.699] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +2741 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.717 193.885 206.672 204.789] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +2742 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.717 169.975 206.672 180.878] +/Subtype /Link +/A << /S /GoTo /D (page.74) >> +>> endobj +2743 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.717 134.109 206.672 145.013] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +2744 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.717 98.244 206.672 109.147] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +2745 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.198 696.002 423.153 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +2746 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.198 660.136 423.153 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.74) >> +>> endobj +2747 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.198 624.271 423.153 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.70) >> +>> endobj +2748 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.198 588.405 423.153 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +2749 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.198 552.54 423.153 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +2750 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.198 516.674 423.153 527.578] +/Subtype /Link +/A << /S /GoTo /D (page.75) >> +>> endobj +2751 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.198 480.809 423.153 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +2752 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.198 444.943 423.153 455.847] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +2753 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.198 409.078 423.153 419.982] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +2754 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.198 373.212 423.153 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.75) >> +>> endobj +2755 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [422.256 325.392 434.211 336.296] +/Subtype /Link +/A << /S /GoTo /D (page.54) >> +>> endobj +2756 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [396.244 301.481 408.199 312.385] +/Subtype /Link +/A << /S /GoTo /D (page.53) >> +>> endobj +2757 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [456.537 278.288 468.492 288.475] +/Subtype /Link +/A << /S /GoTo /D (page.54) >> +>> endobj +2758 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [396.244 229.75 408.199 240.654] +/Subtype /Link +/A << /S /GoTo /D (page.56) >> +>> endobj +2759 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.491 205.84 374.446 216.744] +/Subtype /Link +/A << /S /GoTo /D (page.55) >> +>> endobj +2760 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [430.525 182.647 442.48 192.834] +/Subtype /Link +/A << /S /GoTo /D (page.56) >> +>> endobj +2761 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [501.17 158.019 513.125 168.923] +/Subtype /Link +/A << /S /GoTo /D (page.57) >> +>> endobj +2762 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [481.244 146.064 493.199 156.968] +/Subtype /Link +/A << /S /GoTo /D (page.56) >> +>> endobj +2763 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 124.211 357.291 133.058] +/Subtype /Link +/A << /S /GoTo /D (page.57) >> +>> endobj +2764 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.198 98.244 423.153 109.147] +/Subtype /Link +/A << /S /GoTo /D (page.71) >> +>> endobj +2766 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +2770 0 obj << +/D [2768 0 R /XYZ 90 757.935 null] +>> endobj +2767 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2833 0 obj << +/Length 1102 +/Filter /FlateDecode +>> +stream +xÚ͙ÿ“¢6À÷¯Èoՙ0úcívg¯ÛíÞ­wә½†Å¨ÌAäÖ³}ˆ‡»€D£ö'4À{Ÿ÷%ä9@à¶óë¤3øšÀ†65(˜Ì€ÀˆbH &Sðܽ{øíæïޗÉ;0Ä&DæH¾—ÝYéhçfÒùÖÁrœ½LFpdà…ç/Låø;€ i[`=‚¡aÊkž:ï;¨ BP #ùÛ `dHµ”äJ£(p—ÁfÁ¦bɝĝÿœQäêÅ|ËñᶞûAÝÞÞÏՀ>Î¥ö1†6©–êN§Ž`^“îÆ Øԙ3΄›,Eœ9¢…ˆ`ä°YÏ ÝÏœ9~èΙF£‰‡æ‰»(RµÔ—åŠOeÈ®ç*®K»¬:ŠìÛÊ â҈Fœ#f_>ÙÿßsGÑÔÍæ‹Ø‹øRŒTñ ٦ӅžÓÏMZï‹*û7×EOµ`¨nAèFN¹s¦~Èxì/yEÈéE‰¾û¡ô¨³ö“…-}žh 2:ÈçgÂê“B°ÀMd r ±ŒX"Ü«»iŸê¶Xe\ê°TbíK­ÊY:½×θ,~&–¡éÿ0’îG®ôlæoFKcßýdsZUS%¶%Ÿ‹ã«‚ÜŠxÚÄ /³ÍÔÿÌ.A¢×Š¥ºÆ)±<<ŒÞ;"Åñù¼vOxÇýCñÄmwÎ1K&„\-\> ˜¨uÀMúÔµ†¡ ¶°Ó™IíÒðZͺìMûéæÃÓÝ_µ¾ýÔÃw™H+Ë!cë6‘r—fãÑ[yµJS¼¸\N#E•¨ÖÀcÙËâöس×Æ æ}•!S‹Fq}}@M-é'«íùtq.M¡=2­í9±åÆx˜ãNLRšf÷1] º"tÓ¿Æn7çæwïýáŠMþgœ?rïòù*=ÉïxÂĬ‡QW~hò¡1?õéÆù º\.~ò{ŸAÿ¤*wž’ƒb y Ã^ßDÃîc[§äø +Š_¤ÿ¤d—1´ 2ŠÓýE’D¿ ëõz1\q?ÐO2g{^~匇Øv!Eα,”¥&·Áçr0Ì +9ܓ$ãôpU¸ù +endstream +endobj +2832 0 obj << +/Type /Page +/Contents 2833 0 R +/Resources 2831 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2771 0 R +/Annots [ 2765 0 R 2772 0 R 2773 0 R 2774 0 R 2775 0 R 2776 0 R 2777 0 R 2778 0 R 2779 0 R 2780 0 R 2781 0 R 2782 0 R 2783 0 R 2784 0 R 2785 0 R 2786 0 R 2787 0 R 2788 0 R 2789 0 R 2790 0 R 2791 0 R 2792 0 R 2793 0 R 2794 0 R 2795 0 R 2796 0 R 2797 0 R 2798 0 R 2799 0 R 2800 0 R 2801 0 R 2802 0 R 2803 0 R 2804 0 R 2805 0 R 2806 0 R 2807 0 R 2808 0 R 2809 0 R 2810 0 R 2811 0 R 2812 0 R 2813 0 R 2814 0 R 2815 0 R 2816 0 R 2817 0 R 2818 0 R 2819 0 R 2820 0 R 2821 0 R 2822 0 R 2823 0 R 2824 0 R 2825 0 R 2826 0 R 2827 0 R 2828 0 R 2829 0 R 2830 0 R ] +>> endobj +2765 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.717 719.912 206.672 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.71) >> +>> endobj +2772 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.717 696.002 206.672 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.75) >> +>> endobj +2773 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.717 672.092 206.672 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.72) >> +>> endobj +2774 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.717 648.181 206.672 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.72) >> +>> endobj +2775 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.717 624.271 206.672 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.72) >> +>> endobj +2776 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.717 600.361 206.672 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.72) >> +>> endobj +2777 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.717 576.45 206.672 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.71) >> +>> endobj +2778 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.717 552.54 206.672 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.73) >> +>> endobj +2779 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.717 528.63 206.672 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.73) >> +>> endobj +2780 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.717 504.719 206.672 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.73) >> +>> endobj +2781 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.717 468.854 206.672 479.758] +/Subtype /Link +/A << /S /GoTo /D (page.74) >> +>> endobj +2782 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.717 444.943 206.672 455.847] +/Subtype /Link +/A << /S /GoTo /D (page.74) >> +>> endobj +2783 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.717 421.033 206.672 431.937] +/Subtype /Link +/A << /S /GoTo /D (page.70) >> +>> endobj +2784 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.717 397.123 206.672 408.027] +/Subtype /Link +/A << /S /GoTo /D (page.71) >> +>> endobj +2785 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.717 373.212 206.672 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.70) >> +>> endobj +2786 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.717 349.302 206.672 360.206] +/Subtype /Link +/A << /S /GoTo /D (page.70) >> +>> endobj +2787 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.791 337.347 186.747 348.251] +/Subtype /Link +/A << /S /GoTo /D (page.58) >> +>> endobj +2788 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.131 313.437 264.086 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +2789 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.175 289.526 175.13 300.43] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +2790 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.175 265.616 175.13 276.52] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +2791 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.175 241.706 175.13 252.609] +/Subtype /Link +/A << /S /GoTo /D (page.74) >> +>> endobj +2792 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.131 217.795 264.086 228.699] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +2793 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.296 193.885 228.251 204.789] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +2794 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.175 169.975 175.13 180.878] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +2795 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.175 146.064 175.13 156.968] +/Subtype /Link +/A << /S /GoTo /D (page.74) >> +>> endobj +2796 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.131 122.154 264.086 133.058] +/Subtype /Link +/A << /S /GoTo /D (page.70) >> +>> endobj +2797 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.296 98.244 228.251 109.147] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +2798 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [426.151 707.957 438.107 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +2799 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [424.468 684.047 436.423 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.75) >> +>> endobj +2800 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [468.612 660.136 480.568 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +2801 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [432.777 636.226 444.732 647.13] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +2802 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [426.151 612.316 438.107 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +2803 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [424.468 588.405 436.423 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.75) >> +>> endobj +2804 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 566.552 357.291 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.71) >> +>> endobj +2805 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [500.134 552.54 512.089 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.71) >> +>> endobj +2806 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [498.46 540.585 510.415 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.75) >> +>> endobj +2807 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [450.789 528.63 462.744 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.72) >> +>> endobj +2808 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [463.511 516.674 475.467 527.578] +/Subtype /Link +/A << /S /GoTo /D (page.72) >> +>> endobj +2809 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.082 504.719 502.037 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.72) >> +>> endobj +2810 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 482.866 357.291 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.72) >> +>> endobj +2811 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [475.397 468.854 487.352 479.758] +/Subtype /Link +/A << /S /GoTo /D (page.71) >> +>> endobj +2812 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [501.688 456.899 513.643 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.73) >> +>> endobj +2813 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.099 433.706 391.054 443.892] +/Subtype /Link +/A << /S /GoTo /D (page.73) >> +>> endobj +2814 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 411.135 357.291 419.982] +/Subtype /Link +/A << /S /GoTo /D (page.73) >> +>> endobj +2815 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [421.15 385.168 433.106 396.071] +/Subtype /Link +/A << /S /GoTo /D (page.74) >> +>> endobj +2816 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [493.658 373.212 505.613 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.74) >> +>> endobj +2817 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [486.475 361.257 498.43 372.161] +/Subtype /Link +/A << /S /GoTo /D (page.70) >> +>> endobj +2818 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [484.821 349.302 496.776 360.206] +/Subtype /Link +/A << /S /GoTo /D (page.71) >> +>> endobj +2819 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [498.649 337.347 510.604 348.251] +/Subtype /Link +/A << /S /GoTo /D (page.70) >> +>> endobj +2820 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [496.965 325.392 508.921 336.296] +/Subtype /Link +/A << /S /GoTo /D (page.70) >> +>> endobj +2821 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [481.484 313.437 493.439 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.71) >> +>> endobj +2822 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.198 289.526 423.153 300.43] +/Subtype /Link +/A << /S /GoTo /D (page.71) >> +>> endobj +2823 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [344.229 266.333 356.185 276.52] +/Subtype /Link +/A << /S /GoTo /D (page.19) >> +>> endobj +2824 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.413 242.423 363.368 252.609] +/Subtype /Link +/A << /S /GoTo /D (page.22) >> +>> endobj +2825 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [344.229 218.512 356.185 228.699] +/Subtype /Link +/A << /S /GoTo /D (page.19) >> +>> endobj +2826 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [360.827 194.602 372.782 204.789] +/Subtype /Link +/A << /S /GoTo /D (page.20) >> +>> endobj +2827 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.213 160.012 387.168 170.916] +/Subtype /Link +/A << /S /GoTo /D (page.20) >> +>> endobj +2828 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [395.706 148.774 407.661 158.961] +/Subtype /Link +/A << /S /GoTo /D (page.20) >> +>> endobj +2829 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [381.579 136.102 393.534 147.005] +/Subtype /Link +/A << /S /GoTo /D (page.19) >> +>> endobj +2830 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.024 56.166 451.992 66.129] +/Subtype/Link/A<> +>> endobj +2834 0 obj << +/D [2832 0 R /XYZ 90 757.935 null] +>> endobj +2831 0 obj << +/Font << /F63 177 0 R /F50 143 0 R /F65 179 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2835 0 obj +[329.4] +endobj +2836 0 obj +[631 507.9 631 507.9 354.2 569.5 631 323.4 354.2 600.2 323.4 938.5 631 569.5 631 600.2 446.4 452.6 446.4 631] +endobj +2837 0 obj +[611.1 611.1 611.1 611.1 611.1 611.1 611.1 611.1 611.1 611.1 351.8 351.8 351.8 935.2 578.7 578.7 935.2 896.3 850.9 870.4 915.7 818.5 786.1 941.7 896.3 442.6 624.1 928.7 753.7 1090.7 896.3 935.2 818.5 935.2 883.3 675.9 870.4 896.3 896.3 1220.4 896.3 896.3 740.7 351.8 611.1 351.8 611.1 351.8 351.8 611.1 675.9 546.3 675.9 546.3 384.3 611.1 675.9 351.8 384.3 643.5 351.8 1000 675.9 611.1 675.9 643.5 481.5 488 481.5 675.9] +endobj +2838 0 obj +[777.8 722.2] +endobj +2839 0 obj +[399.7 399.7 513.9 799.4 285.5 342.6 285.5 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 285.5 285.5 285.5 799.4 485.3 485.3 799.4 770.7 727.9 742.3 785 699.4 670.8 806.5 770.7 371 528.1 799.2 642.3 942 770.7 799.4 699.4 799.4 756.5 571 742.3 770.7 770.7 1056.2 770.7 770.7 628.1 285.5 513.9 285.5 513.9 285.5 285.5 513.9 571 456.8 571 457.2 314 513.9 571 285.5 314 542.4 285.5 856.5 571 513.9 571 542.4 402 405.4 399.7 571 542.4] +endobj +2840 0 obj +[513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 285.5 285.5 799.4 513.9 799.4 513.9 543.7 770.7 777.7 733.6 847.5 756.3 656.2 804.8 850.1 449.3 566.3 870.4 699.4 992.9 821.6 782.1 656.2 810.6 777.6 627.8 599.6 699.1 599.4 970.5 849 596.5 699.2 399.7 399.7 399.7 1027.8 1027.8 424.4 544.5 440.4 444.9 532.5 477.8 498.8 490.1 592.2 351.7 420.1 535.1 306.7 905.5 620 497.5 515.9 459.2 463.7 478.8 371.1 591.4 499.2] +endobj +2841 0 obj +[500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8] +endobj +2842 0 obj +[500 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 777.8 500 777.8 500 530.9 750 758.5 714.7 827.9 738.2 643.1 786.3 831.3 439.6 554.5 849.3 680.6 970.1 803.5 762.8 642 790.6 759.3 613.2 584.4 682.8 583.3 944.4 828.5 580.6 682.6 388.9 388.9 388.9 1000 1000 416.7 528.6 429.2 432.8 520.5 465.6] +endobj +2844 0 obj +[556 556 167 333 611 278 333 333 0 333 606 0 611 389 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 278 250 389 555 500 500 833 778 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 832 667 667 667 722 667 667 722 778 389 500 667 611 889 722 722 611 722 667 556 611 722 667 889 667 611 611 333 278 333 570 500 333 500 500 444 500 444 333 500 556 278 278 500 278 778 556 500 500 500 389 389 278 556 444 667 500 444 389] +endobj +2845 0 obj +[513.9 799.4 513.9 799.4 799.4 799.4 799.4 799.4 799.4 799.4 1027.8 513.9 513.9 799.4 799.4 799.4 799.4 799.4 799.4 799.4 799.4 799.4 799.4 799.4 799.4 1027.8 1027.8 799.4 799.4 1027.8 1027.8 513.9 513.9 1027.8 1027.8 1027.8 799.4 1027.8 1027.8 628.1 628.1 1027.8 1027.8 1027.8 799.4 279.3 1027.8 685.2] +endobj +2846 0 obj +[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] +endobj +2847 0 obj +[500 500 167 333 556 278 333 333 0 333 675 0 556 389 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 214 250 333 420 500 500 833 778 333 333 333 500 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 422 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389] +endobj +2848 0 obj +[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] +endobj +2849 0 obj +[556 556 167 333 667 278 333 333 0 333 570 0 667 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 278 250 333 555 500 500 1000 833 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 581 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444] +endobj +2850 0 obj +[638.9 963 638.9 963 963 963 963 963 963 963 1222.2 638.9 638.9 963 963 963 963 963 963 963 963 963 963 963 963 1222.2 1222.2 963 963 1222.2 1222.2 638.9 638.9 1222.2 1222.2 1222.2 963 1222.2 1222.2 768.5 768.5 1222.2 1222.2 1222.2 963 365.7 1222.2 833.3 833.3 1092.6 1092.6 0 0 703.7 703.7 833.3 638.9 898.1 898.1 963 963 768.5 989.9 813.3 678.4 961.2 671.3 879.9 746.7 1059.3 709.3 846.3 938.8 854.5 1427.2 1005.7 973 878.4 1008.3 1061.4 762 711.3 774.4 785.2 1222.7 883.7 823.9 884 833.3 833.3 833.3 833.3 833.3 768.5 768.5 574.1 574.1 574.1 574.1 638.9 638.9 509.3 509.3 379.6 638.9 638.9 768.5 638.9 379.6 1000 924.1 1027.8 541.7 833.3 833.3 963 963 574.1 574.1 574.1] +endobj +2851 0 obj +[472.2 472.2 472.2] +endobj +2852 0 obj +[500 777.8 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8] +endobj +2853 0 obj +[556 556 167 333 611 278 333 333 0 333 564 0 611 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 180 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541 0 0 0 333 500 444 1000 500 500 333 1000 556 333 889 0 0 0 0 0 0 444 444 350 500 1000 333 980 389 333 722 0 0 722 0 333 500 500 500 500 200 500 333 760] +endobj +2854 0 obj << +/Length1 837 +/Length2 1516 +/Length3 0 +/Length 2088 +/Filter /FlateDecode +>> +stream +xÚ­Ry<”k.TT¨E^_Œe6˘²Sjìcæ3̼¯ÞšiH)N©šÊ‘-KŠ£²œŠ´•6#Dt´JßÐéôû:ÿ~¿çŸç¾®ë¹ŸëwÝ7ZߋfjτÃ@˜° +àH¥ºð€üŽÇ£ÐhG¤ 80äD€€@&[¢¹Ñ À“(f  + 8ÂQ"„ΆŽ˜ °ç‡A‡*]Àyò : Á (a{.Ø2ó‚lù 2±(`r ç@(܌'wˆ¤o03:ê;"|¹)ÀpÖ&›dÂW0A +·–ÿʽü?lýÜÜ%šËÝHçÍ´ŸMê_<ÇáŠþVÀ¼¨hˆT˜ "ÐÏR?ð›9*ÈäDó~fÝt.‡a…sAÀ”`ŽÅ›Ã9|Ždzq 6À¢sùà,B̟Èó›õ£Ú{ú¸m4þ{´³¤ ¼EQ €ÿ¡ž­ ?jyHGlÅcñx‚\(?ßoÁ?}æ 1`& +ˆ–Aè"”|‰ä• &ˆ +P(wŒÃB°@þ'°`53W‚¼+œÁfKK"€ ŸÙr×Ý^™Ê1æê癨àœKž ï‹§éw&†\á|XVØ´<èø˜æ”LûZwKd—š„œšCUl“Ø|YˆÇY}wQ„‘z2ÿßÉheËG¾§$Àœ6úÛÚêåþ‡r¿¾DµÅ=1.ÓÍÏÝçãÊÒ\ FÉJ®k¡ö\°âZ`=ÏjØ7P±9Q#²âÑæ(!ª:½%ôóWôû5¿*ONö|šNÕ®aˆõçhSð3¶:achüӌמך"Õ ³ØÛ¹õ¨¬Omäݳ닭§þ䶄¥‹SVˈ¨—”ϼ¬S&Ô@ãÊé‘ gárÀ h]_ÞÛW7êSO·¹8ní ½ìÝnÜTvñj¾“fÙ>¥`i‹Kþše¸£ßa¹¾­¦Žõ²%öAÞû ¬¡E˜>ľ«a1ñY÷ Å2»å‹õóû™>Òêá"KÝøyϓVFÄy‰­Þ(Öy”…ŠX•—ÞúemÓ;ÖtsV䙏’½<Ñ;òŒRrÅ[‚â©Ø+£ö57Y9H:Pnè±kÌӈ¹]öN°$Ýk2/‹Ø]®¿!ÐÀ¹ÏââåM!ÖAáS-¶E[ + +Ňv¼k7×Ý‚¢¨ôuô“µ£œwfÆOïùØá­¢î\Ó¼U –JºoõrÈýIW +Ô£WÛøŸ5°­×.¿úl|ýfS¢:Ë[Œç˜Û7fÖæñʖ¢™Kšèá†2-)Uóºû¨$­JÝë"@Ÿþz>?Ó?бþ‚¥¾Às<Ñ Ü«¸Fsº•Æ?dj Œ!»³[ÝHOdÚuåz~̝°yúp":Aóöð»O.™QYÔé­´ŒÐå,d{Ã×ùOò"¤^›îîÎÊÎ<„žÎWì§Ë*<Ž•X»Äy}6ïÛùÒm;L=ëz.\çÃÍk|<™¨pÀgE\Á/z‰Güü%Ɏ$ˆã¸ý‡Ÿ—eä$ÙvÏO™6ȓtn›Ø©U±DtþÄ{Õüˆ‹u™ƒz‚'¡ïƒïö¹?¯ýÃsEr‚[ûd綰²âcçý3Zùèô«+Ââ¬ÇLdE7—’ éCM£59j˜=®»ÌPՁÏÀÌ_/¥>jr +v¨ Œ©Å·/OP:ºÞ/Q¼Ãd$æ·:Zò§&6S#ēÃm‡«¯“î¶çH¼êCššD­£ ›ôq¾NS¬ì…Úú”¾%Ó­†˜\½3 + qgå{•;¦ñbUSm±´·4 åU™8Ã7ŽŸæק“&nÚ©WFÔijÇLžnì54v-ÃU±U·ô/R¹" ˆ)[ô°©—ß×µËR;[Úً¿sù¾Åþ\»U}ë­Ru…Ð ˜MÏÔþSÛ-ýô +WšXñJÔ¾A¹zûÏýL%ÁÕìÃD}Ÿ±›VÎSÎëWö£Dì?#Twr+_tû%³Ê{b‘“&\á˛dz5ù;·(Ïèôdxtei½«Ä»Ýštþpî­ç»{Ϊº¤#9­žåÍ%ÞVG·^›:ÉØQý*aüMSY!þÙb·fݑûºiV¾Z­;;ttDmøÞg·X׺>HÛ½½u®«Í=åÆàù¡‚®OÃ_ÞǏ·êñþ2ˆÛ—÷kd$U9…Ckr»h‹GÿHYÉÎàœ”.òqüd§>[A7¿×¸¨pÒüÜ0a݅´Ø€¡ÚaÃô‚hpøªºF +emÑïÅtËb÷!çž;í±ivAbë…j·—ÁSIÍɏVƒ¼?‹õÃll×Xï¶éÕvŦÕz¥J‹ü§'¬+º¢Øx¨îɍš5“ Š÷…™”îeOœŽÕI S½dõÄø¤SÃÑj0 +endstream +endobj +2855 0 obj << +/Type /FontDescriptor +/FontName /MALUHN+CMMI10 +/Flags 4 +/FontBBox [-32 -250 1048 750] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 72 +/XHeight 431 +/CharSet (/e/greater/less/triangleleft/triangleright) +/FontFile 2854 0 R +>> endobj +2856 0 obj << +/Length1 889 +/Length2 2479 +/Length3 0 +/Length 3083 +/Filter /FlateDecode +>> +stream +xÚ­Ry<Ô[VÙ²S?»É23¢RYY#Ҙù†1Øqmɍ±«”}_n$1–¬Y²FQʺÖTDY"‘åêÞÛ}{ÿ}?çŸó|Ÿç|Ïsžï‘•´´VÖŒ\AC‘¢ŒPAhú(”±ÀØÂáYY}2ˆ¦àIÄÓh +¨ ´´4*PUàšÚH5m$" 蓼üÉx·K@AúM¤ èz‚d<MPhÊ%Гу&Ö$ ¤ø«º`õí„`ú€d_«A ,C\A7<ûfɘˆ#š?ÊXª×ߔ/Höa˜¾Û„ “X‘à`AfNbÜ2¼ü?lýÚܐJ ˜£=¿µÿÔÿÐhO<Áÿ/ÉӋJɊ„ÉÄ_¥öào(‹§zþÊSÐ`z6&º6vŠ?û³Dã‰/€ÿLjŸ˜ïœ‡«Àᆐ±þÞ9ÿr—CÂâ‰n€*R@“ÉhœÑJ‰žˆýЏa¦B$QGF0—‰ ù6UÆ ö[í/ˆ`à¿àQFøj0´ÐÇç_¼óü êŒüT×`Œw ¿Iq”Ÿ„ÆOâÇ/ùفq¡ïwø¿‘êé‘ü•UµeU$ãpM$ ‰„_þ/!†J&ƒDÊ÷_ËÌ߇gÌý@ ddˆ„9æž\^lßw—ê#žZÖÓD»ŸzLe~üß¹æ™ xh…—ÆëŽ/æIú`ZÃ␓"ÕºA­a´aÞG\¡¹iÖ¬‹˜y§ {»²;[¹=3£ÞžñªQ\•^›ðmb¡›Í!4óD>Dï+z9´ý)ØãJïäG +VúMÄ9ûY"h7;qãÉæ‚)Ÿ4r»KÈ)mgD¤uì…ÇŸ\©Z1Ù(æÁÔ[ìp¨nª‚H÷8XaÜK"ˆ¬Üûp1Ä¢;Út÷eó®b"ôíȀtÈÞ­¶ ®‰™$µßwöOºŠEdº¼©Òpñ±pÑU0~Àѧûõ‹«`xˆ:r®ÛhPìŖ3,H|¶}9ӘéIQ.­Èu_}—4_ªÆõÑì°èr:tÉ2˜¸·0 s9¼¨çÕ>tùVkB:–O©6 Ö[%jŹg%c¨ú"‘tš>ý>OŠ…/ç@‡‹¾ã5ÖO‡r¯I‘1–HʐÐaq/.ùÎ%E[±xÅúø}é×ç"WMþü² +ˆÔ^‡øFxìz—4ë׎µ ‚_ÚÕ¶OÔ¾=³GØÒÉv킖T,˜r±A¤gœï|Ý[ÍÆê(|`•åÿ7ñü<͙×B)t¨ä85‡æÝÉ2ï쬓å²f{ªºñêø+¿ÒúÄw2&×Ëí|Ay·ð§JåÓ±{¾º?÷—ÈWÈéHi:’µe²mßZq°HrYL?‘¶æ>n>måh|((Z–5ð„O•¿ ¯kÆÍcá*'_“Ô}ӈÙCgù«#ut« X&ÞPsŠIEª|4a¤½%ÔÇN&à9Ó®ãç·s]»I!ªÛ÷¶#Öú é Å­ÁÝÛ}ÃOm'®Ž[eCn2—šŸÑÎ(¨3?X ™4;U÷.,±Óh:()_©þd‡¦›á5–£KÛbw÷É»®díÔáLÝönž¸áÚ̔…¹vŸžâx ¾G‰vF]„ÛÞ½Y×=F8šÌÙ~DDt˜èÞPUÌ,¹ÙqʍûÍbtqÕb÷|b:\Üs)Q¡ÙKè鸐žäéÛ¯Uú‡>Nîañ”ëWÓ«EUåpÁ/qyHòÎv|â:cš£ÿHØ1_òç€Yºúaü†œ²°­®ÂõŽÌƒfʼn¶ì­â:g½#­´yâþ0﫳@_ÂKŸàcÆ–5ŠÈªˆübÚ(ã ºá¢ö ‡þÉB`k8¤/cß+›qLÓ>¡%'Q›îù€nÑo¶ïfLdzWN[õð= ˜Jh+¤]7ž;)$QٙÐ%¶ãw»Ùëyõø\?è˜<©ß¨¤qŠ©’Y(õՙ²nOÌÈ»Ëz‚ug0z‰¶+Üо +͖ò£ÆUðkJ¾49{Mž©áÎãе=Èw +^Aß+x©þ†ýMÑå qˑˆÚJÑ|ûdfûsY¶HBÕzTÙK#ñ,'xIÕVÈ5ÖºpÆ_%K.øŠi2RYî®,4F]uö2qœº—š±ÀÉýGÙµ Pö«;8n/ßf싳È£«z]êVÇ×Ãml®´¡‹=Ófó@H¯ßöÐïËvé1I±‘kUau;ñŸå ´¡†AÒbfIK·eÌ¿àn%Kw–›Æ𽯿S#lÛruÕ°«™·‰«ó1«¤f–g@ž»öÛÒ¼r+z‚ßú1µÓqgÂE"]m3É å‡ìj<‹k¨—ï&̊¶"“¯Aéÿ?ÿí« +endstream +endobj +2857 0 obj << +/Type /FontDescriptor +/FontName /BTJATV+CMMI9 +/Flags 4 +/FontBBox [-29 -250 1075 750] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 74 +/XHeight 431 +/CharSet (/d/e/l/less/m/r/triangleleft/triangleright/v) +/FontFile 2856 0 R +>> endobj +2858 0 obj << +/Length1 851 +/Length2 2927 +/Length3 0 +/Length 3514 +/Filter /FlateDecode +>> +stream +xÚ­Ry8”mû6 cOÈöÆ#Y²ÍŒ}ËÙƾÕ0ƒÑ˜a Y“¥le' +E²f+[([¶"eËÒKd—- +}Sïïý~ï×÷ïw<Ïñ÷yç}Ýçs^·¨°…µŒ +ïŠ6ÀãH20Y˜ ·‚A˜,ªË$*ªG@#I<î’„V`ªªr€ڕº ¾jŠ +jŠrL¢€އBÀxx’ ½s?EʀŽ7š€qCâ8’ä‰ö¦öpCbk¼M¢È:X,`õs°BÑ?4J– P7àŠöÀà˜ ?-áÜñ€ò_eÙçoÊM RM¿lž¨&Qx– ÐîL3<õ44ÕËÿÂÖïÍ ÈX¬ÒûgûŸAýôÆ`)ÿ'À{ûIhÇ£ÐÜïR{ô_Þàh†ìý;kDBb1n:8,€þU 0h”†äæ ¸#±Dô¯:‡úÝ5¹_ Öö&¶vRÍôgÄàH6Ÿwý)þ…aÿ©é0€3”/Œ*¤>¯\~;Kç†Gap€œ¢€$&êí¡"E `p(t€ †Èâð$ꀚI0àŽ'0ý(u&äÏÒ/¤ h_2u$W`Pâù¨@þÁ¨,áP€ÿ©b¿C* +Dð¿ +ÿ˜®.> HFNP?Ô_€BUU%ÕàÿPº‘ 4Žôë>Rsÿ»c¨SB£ÐnLcïñnê‘^éuQÅ!úoÓI‚t=ž&™U·¾mf¾>z„-ì1ñ•œªrøV’ÅÉ6O7/ä @¼ÙtͲß`=Ü7)ãÝѼߕù¬Àz‡Í,8å“Ï™¯×—Ù놷WAæCS½Å)Ž:r6:—ó,$.Ø,0|¦isö«iˎTRv0ÈÂÚFߨ“¶:‘á[£=é"åÎñÉ××C¼¢ÁϤ&¾à›È'¿€ï'!¾r'r¸5 É[ý)Éeµ µòèAô ö'?Ú»+´³k0O7¶ê1ºžËU‘ȯypƒg@?î·.]ßä |(ªä2U8wY^ê²çãчЍ;øÒxñ}pàѐ¶§šßd’zv&lý{2)/ÞqΉN˜µÞK„Ç©#+û W Œmû®-¿NÓ­”Adí,àB"föÄ7/Ýs!æ®Ìì흋¹<¹µ‚¦&íV<ˆ`‚ö—º ي„“ÅÛ8+øÁÜæصѓ“øãnSÚVEeÖu:ù!ásá)‘ŠîFÜZy¹L’Q,AHÛ(_èùùrúGlfúl<ô~~ó5’YgK›4+{‚Տ™¯ªö}÷¶q®jjϽt*ÅP’“b‹ޟ]·Ïö¤©û VɬÕ!APJP×%MÒ÷(U$º´ èuúÎBԅ¥MF@ñ¾yE¦Y)«4É¿£í·gÈ'.VŒ+ gåžìÊiŸÂ¿ÐsYN;“ËåC jÉN*µ é’%m"ô÷ù3öxs|ŸMl§Z4,ÝýR­¥«/Í(¡/ù?ω:tð¢H¡ãD´=W“!=Qbavÿe0oLUd’HŸe¦‰{m‰f.®ß-fë@}ÑÁ1ÿgªo_uØZ®ó“ÀQ³›«Š1Ì£ N]cG¢íž±ýŒòi³Æ®ûš¨î…tÄ!ÒWø¬qå½ý_µÂÝù‚Y¦d—«ÃK²GåR)/NŠxîx/Ç6àt;Æþdí3Ž+ˎ½ÉÔ™Œ?‘%́½ÆGöJŸ¸" ³(°lƒ—š,…V~J¬-¯unÍ>iMº…¬™a¹(¦àВ¯Õ›¦D’ú]ש4í`ÕÙÔŸ|\è1k#ßU¦3Ì j÷zp5;­]äN?Ì-2ûÕ ³zˆö¼{‹ÌŠ k€bûÙTaKÊàpÜך‡Y³—çmž~-®—wùf²Š'2"ÑÕr“¾žóÔӂÃJÆw,BÎ9æ/ò¯½¯²:Ÿø]óèz4󣓘WkË2ÏXá µÒ‹\cãÓNÖ ÒNm·¤ìénSqÓ$s¼o‡ú`ºŽIÉsS‘\gñm´Ënµ‰òsð7æn3¦ +4 |zÏH¯ŸNì,;i¹#œ2vî«Fj^I|ÊâÈÝÃ:‹¹?Â!õ[nכ½›9¾u㞔Átz9ÝíK¡?>q›Z·kkâù/¬´yð±Ë‹5(VÝßG¼Q¸3‘Ÿ¤[RWµ|/=T Ža†}ޝ…\"ð7sxicŐ`ë…C›€ôìuÝSX˜lЫf¦œז‘Ǻ•´C» ‰æWŸŽ(Z®É¿(½TÊN† +®I+‹wê]U#ró×¼Œô_,ÜhMä ãœßû"%"¸orÅÓrëj••–ºf壘„éñ;µÓ.±œÌ÷IßK/o‚ä²:stüíxY’rŸ·KLKsÝ- •՞pqÏ´%­°øû‡²;Ó³M4^ÏØÔÆC$G.¦†O×_u4 H;˜¼4úíK|E³QÐì]¡Ñ½i+ + _ˆÝЧë¤Gi² #¤úîÏ^ˆ†¤T80fk~Œb½Ì‘¯Ós¯»uW¡§¡‘2+қ5ôû]Ì÷© ·8ËhïiÇñ·‹e*t¬þ‘µŠåÞÄçnîêËÜôgÏmØßøðùÌ»ýãGl´ð!£#÷÷†mÝʑï 5æ~¦ £#·è@ÇÐô {‡ÖÞ¬&ãiHóÆN¤Ô¥‰’7ÃÜF|Ÿf䇟ͬŒ?Ôµ¨ ++8ÝÇ|}…Ì«ryÌ(ðÁ?in +t +tÄ»ø,Ó[` §J4€U‰|x2¹É÷M8§-½¯iÌÕ_ô*ÎÎkò}£Áóù¶­ÈpÎÌÙåpʌ¬ï‚‘]óc t‡!Å8³é¥ïlðÛ:ÑÓ(QV‹ýŽy·?÷ù¼Ì*¦½¬[áe‚ÎœŽÖk4{˜-Æj ðJÈ¿¾¢ÞU%r™.鉑Ҕձx»È¬8ºÐ9Ę,¬É®›n‚D¿ ¢![³°²kvÐ÷«Ä +h±ÁvM¢~ÕÇßú¨cm¸‘’ K¬3»†² _W‹èñó)YÎ_± Ÿ×™vfÁâ{^ar±ÅÛ [0q҉ö}[­ˆˆ.[Yöœ´~΅ׯÖÎÇu;ž{Å·=䙞Wïx(䃄óšØq”¿­ lj ÚW'Ÿ\¡¯n^;¶Æóý¿g’KþàCÛðU6®ˆOŠ«©‘.ÇQÎ>ôÂǤ7ˆ/‡L7K÷O5­cOý&VEè±50kæ9ÏYÉü”†`6ùXüÑÕ­2˵‰&ÊŽsŸ^HÚSîóEìÁó:m¦Ñ“ñþ1<JE3jøÀ·0Pý);s¡ÜhQHÚùžêÑݹ›Ó ϾË1{l~°ü¥¤ðRÜC>û!ÿ¡Óz‘2´’5áÓÚÕ«4½«qM3¡oK.žÇv]ÐP΍ oÕÞܝ~þE'HJøBÙ=3òI{Ìë Wǧ__˜['÷Þ'‡«~îÛ¥#ˆõRÁàø— ûùÃe3 Êü¾ƒ¯ÍÍVãÁÚlOÕ_¿5‘ÔžÌèÌàñ n¬‹;†Õ¢geåZ\ +¾aCl¸Psù)Ÿr¬Z5ã3Š’}rÆi>"­ebÃÝÆPø ®CqÚ³ýZ.z›¼ÉÅ£R”©ñ±qVJÆúb»Ó[½Î8Ýè‹Ï›§þh)kÅÛÛÑ +¤©¿LW™Â©[" a‹Í鬷 •ÿ€•ëV>|Þçcª’$µ¡­4Ñw57V®- XL²Q<¾s·©ó­oOšIЬ¨îl,‡¸v)ÁŠÃº|Қ•4¿pÒm¿|ð ›ΗEñ:žC¤c~žÖ¹Ý=ŸMYéFqõ·÷0&e,-ù˜¾?SÉ#ôYÖX­b´°Œb\c¬Zi½vűT°{Ç¥“gÈÌðuõb¤™Ô#•Éܝ'î:z¯^Ų$ +2$+⦆Åöê÷g=iÍf®œéýT9xøîÇ«q›’ÆE˜3>Çî®lË_µ¦46 LX|•Jv—®f7>‚`:r}Åâèû7ÿ´ü^ùãґÿŒ-²b6, q¶«hÄRd3ìÑ$5÷~‘gÇ]™þG‹¡Ëȉ1#g43«#2®ÉÎ +F¬B5£” +µÕ ÅK÷ƒp*Iabó§qÉ~ž=P\%n½Û.òl·pº"¸H7ñH+`ê0‘}´¯ÆBìì7ÇG«*ȗn¿“â­§Í\Ø äJ›|T!)mFÅwwŽù[\sÎ*E.‘4ô.ðšòLœX¡…I·a:‰’çݝ› ‡͘_’ Ò3j~Ä“ë}Ã/èK¡TèÆĪ’Ã[{Šr¼1_8“%rI:k¥—¬¡àeXê+f ¬7À‘á5X®Pþ½ÜÎÙºfÆÅI¤ÚæãGM^u›¦)绾Aãh +Ö$ƒÐÛòežñÀÉTÖàbÚy¨’§2úeÆz!$ê–ÓHþ̈́ykö\ÿ¥-Xó·%Í$¥rþš‘Ö½~÷¢Aì}µ[³Q µÿï ¯Ù +endstream +endobj +2859 0 obj << +/Type /FontDescriptor +/FontName /SWKUVX+CMR10 +/Flags 4 +/FontBBox [-251 -250 1009 969] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle 0 +/StemV 69 +/XHeight 431 +/CharSet (/a/equal/h/l/r/s/v/zero) +/FontFile 2858 0 R +>> endobj +2860 0 obj << +/Length1 810 +/Length2 1751 +/Length3 0 +/Length 2308 +/Filter /FlateDecode +>> +stream +xÚ­Ry<”kN ­ç N/Ž=fc_²–0ÆR$d̼fF³˜­PF–6Ù)b$ÙB„“±¤”½3¶d‰’­3*u†Ê’Ãô }s¾Î¿ßïùç¹îëzîçú]÷­¢ˆr׶ÂR@{ +™¡ ׁ›6În\QQ±¡hB¶E3@nl ¬˜8@À LôŒM`ºÀ†J#àð @ÝFcMdX‘@ƒ&Îh$ {`ÐDÀ‚!€ŒPÀŠHÜÖ^Ð7ÒN‚X` âdt͏9~-c™Áߨ“ .4¨ MjB‹X +™ +`Á@Iþ +ü?L}ßܞI$"ѤµöŒþÅ¢Ibèy +)˜Éi€3 ÒÈßK=Á¯ÖœA,Iúžu` ‰ŒGØׁnO±(ƒÑD:¸^ÉØïMc[·uAY; j­OsB¡ d†Ghð_M×´ëþ7fC#„Ç`:0\(žo7ßï¾²#c(XY¸M£¡C!½"pÈX0C„~¡:d +CøFRhµaЀµÒ:‚Ã`û à? PLü (ó/¨/$Ã@e½ðï8¬­)!§µ…;«­‹„ë†Xøÿ1L $3Ö7Mê7HŽC@ dx‚1 Jçœ/fÙåõ–ˆiŠXãj’¿>|z_2úY²±ð7GªæË*¯åÒÌíÒ<1ÞÞS+ +ô؆3®]öüHjRƀ€wҟ—V§àõ!Ó9ô÷`¥Åè™{œþOï".}/¹ÅiGó[³gÛfrQê¶Óâ/7<:vòC/ûLâá çªTõÝd3¨Åõ/Œž’MKí‰f]¨Õz>Gi`n[Γ¸‘*ðùô¦oÿ±]ì_r÷À~DÄ£/ÇÔÒß——UW¿²\ƆZöêqT“2ÈýæìT´]­rÊÀoògîf³t¢^ôŸãæ†Ëù|Üú—V÷+ŸÆšŽö3J7vë£Búâ-¸K¢]M”Êòb­ü‡-K,îûí£c‰ú¯D?QÛFulôöÐ_g5P§/椆Zò½¦ÌêN…8'´Y,ÛnïU*×5¢KZCXÙRó½“.¨®Ÿ»ÞM@'\æ|\¶}\Éî2 {¿ÓU$\yûî-ïeÄ·øüe3ŒQ=qÎÉ|ªþÃ[„yêÙ CÀ©‰=_üO +°·š­rŠÌ1J–ËVÜr¶yú‰Ô±»â™/Î gé›>IŒ/¸.(t.^9,–i˽S´•”!aÆ÷RþÁ£ì ‘ÑrÓs%ؤ'9J®· ½`á,gó+~ZÙRcrÁ– ³$òq AqtzŸ&#U§F?ˆíè÷Ɲkv¶㸢^’ì8ßòáÚ)ÐR‹ypyÞnãLñþ¬PåÓì#p1Tììå +òm¦oP>ï"òFIe ØÐ%ùEÍ¹cÙD#o+ý"虋êÆ*®úZ˸DTWŒäÖË áÈì¹£·é*üë‘Z|æÞ.²[fùZMz·G–r|ïòè‰k}z· êÚ³Ã?ß|Þ7.a,Z8Œ(7}r´Waì“ö®­ + ~l;a“œu1͜þsk¢›ê³í§ª¡Ð“{âYÙ3“§Üá÷Õ¦LùÙ­¨ö(ùË ¦9c—²Y%’i¦éwÞ¶nšñ**ÅÄ•¡FeO+áâåf;ãíMr3ê~u$ä7‹¦J­‚ㆼBõ°ÇÌzÏ'åçÁó»Dvr»ô .Jf21.—덷±ª›“¼ì_*^´:—FzšðwÚ¢¬MÌÜ Oÿqô”¬{9þD6á£mIj•Ë®V'îÛ í/Ð`5ñj´¹AÏ4ŒmºP3u¯nKö[Ø´€S±¶/2#zbfwØ8“ò‡“ºÿhë•?ï„_xà~.K&±hÙéã…ô +³K}ÚÛ:Ç.®· +jî5q8ŸGZ:ËzK͕Ž•{GQM6×÷‰çVϕ:W|ß+íf4dÝSYÿ¾rõŒ¢ImϔÎé'î2É&I) y°ØŒ©#= 7ѕèh‹d\ÑIÊòðcËÝ܈Cn‡%ÂUÛêÿç ¼i 6gü€ot§-ÉK͜£èB.›J«±£Î! íMüœu É}á‡b®ÏY­Ï–bo‘.9Õdl,ñY|ƒ{0d¾ª§€„‹Dz³E:û>¼óLÛµÜp¹E +û–)Q}N÷Z«ã¥@–Ú ™Š# +endstream +endobj +2861 0 obj << +/Type /FontDescriptor +/FontName /OPBINH+CMR6 +/Flags 4 +/FontBBox [-20 -250 1193 750] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle 0 +/StemV 83 +/XHeight 431 +/CharSet (/b/d/e/l/u/zero) +/FontFile 2860 0 R +>> endobj +2862 0 obj << +/Length1 793 +/Length2 1596 +/Length3 0 +/Length 2144 +/Filter /FlateDecode +>> +stream +xÚ­’y<”kÇ©”¦Ì-'â¡dgfÂXŠƒŒ&ٗL©ÌòàјaÌ03–„9I»”Cá±d+´Øª#K "T£DZF„P¶ÎÐÛ{ÎÛù÷ý<ÿ<¿ëúÝ×ý½÷­®êì¦gE¦A,ÊÐCé£ÌW €ÒGÂÔÕmè Ѩ» Ð @™š¢+¦€F(c³¦fhL°¡±éŸ?дÑZ4a«@‘TÀÀðÅ3H +àF#A ƒ­XQ(€ëâŠÀ é¡ Y†BdˆÄˆ D…,òਾ4ó½Lfýh…‚ô1 )†ÔĈd•ÂÈ /ÌÀ‘&Þ “ü? ~ŽeR(Ž„ÀÅñâŒþÕ%Böú´À &¤42H§þlÝ~GsÉ3ðç.ŽA @$+ªßKPbdgˆAò| ”p©RÉ?Cˆc[B0ðÀïÙgo¥³t›K-gDe¸³ƒþ;tÑ»¤Qkq6tˆDê#‘(±Qüýø;ôÓV¶T QÅÏÁÈ Ðé6Lü.ÄÊG• ²%æ5ЧÒâ%€8’HÀ—F‡-^¦© `@\,-) ÿ!Q€ø)6Sþ–( `À\’ÿ>½µ5®‡Æzh#1 +0FÈÈÿ1’˜t:He,=,q†?´/$NY Öû”F2 ¸TϏ²Íj˓Җ´ö«Hq,«}Rµ&¶çŒ$%§É>X»¯Ôk&?M>$5¤6§rò^„K vôxpJj×ÂP¨ÏP綢×xšûMÚt¬q·¼ó󰑤SG_3ÿ<>ûÏôOõ¢kΚ»Ýß®z¡*Qw0ôfݕ8cŒ6â‘p¢tûUWÙÔ`>×0A&{þì +¡ 6* AºRçùísÝL–tæ¹ïÉʦ»s”cïo Ç E> ‘¸ %ß\­“yk“;çCÎy‹:áð Z.ÇVYqsƒÝ>«3Ÿ' ´Í#N0{¬N mí´x.eS[nDpcL¬cæŸÊj¿Yè#Ûí˜Ù¤¢‘³ßԍôT€Y¥ñã[5ÇočnÚ5(wõW`.¯nÆÝ‚i¶ßdÄËú4HÈXö×ØÊïübdzwŠ#çìü 9—§6/q˜%i}Ô?åÂæÈöIØô‰þ¯^c*>Á_ÓF"H—“¯¡“ã”ö7¬Ævܟ;nHÄ吇g¥y­«œ[s2š”Sj§âÜÕ™±íÚ3]µjßœà[ŸñÞÌm›¼Ëؙ|êq´p-®ÓÒX }gàlÌëŽÃoë¯\רâñŽñŸ‰&Tœm¢K¥×ñä"9ýûi–eUÇ£3êµ rm—U²;nVaÏë”l3¹¸ÝN­¯@±«ð·%:¥iòîEqhÕµÔ_¼ìjá ŸÄæ’(ÿ¸Cá™.R#ƒ„è˜ Ö»:ûÈc«]r¨?š©4ÕK}`RU¸¿ËÜuÒQñÊ6 %cmXJ,X›ŸmN=3e¼AY¸äiæœ×?v›`:îçÏ?®ì¶7j̈́“…ºg"²ð b°Àœ´·óNžÏfœ5 ØùÙÁCDªË1ÚÊÞü¨žÏ´ºø¤#»ŒY/ƒóÂtǦ…jºGÇғ? *riõí°'[ëBåq«ò1GA‹/§øüëGͪ쇚;´Þf+¯Ðn»“‰/ûBÜJˆ.s°líÙa§v§ÅNÇßU¹i é.O€G“¾2ŠŽ]S:ú¡T&BV€M†>’y,·W(Æ*º½ôÑx¥÷©úøUðª/ò®dÉ$1äN̅ß'^À®ìEâ×IÙ°2Oú'Ö¡ú;R:Í¥ùQ¥™oe¼§a~:LåÐÑzXùµÞëí‘|Èg‘JëªZŁØMËã«k¶LíëÝdÂÌR?Šn_Ž‹°6"­+/œ˜L´º‡fô͞~v}ÌâƒìÕ:ÇHÃKÃM§.»ïßéøZyn6ø2üÜ-'Ÿ\¹5U®r»„ýqòü—£³#¸¼¼WEëdR(éÂ\—ÜYݘÖÑ-ý¥çÈ5p›êûÅZ‚ù‰B}“²¢²»rXJ;{b}܃´³>#¶+ëo¦ ÜâNTq>ð_aòä#kWŒ"ú¹ð:¦ÎŽÈ¤§¦HîƒÛ®BtÏ®?žGÄ·~SƄxòûb>¦âœöCŽ„‹SµÌô|Îúݯ¿¼xó2'Qn7Ìó$|3©á1œãN¾[ðp¶¶ ¸ã¶}×09N¨ $õŠÄÕñ)ˆÁ”=×-«‰ðµyËږÙÿÎÉðàW—Ä„x[]ÚÃsоÞÔ@=¤gÜÀywŸJi93Ìç.(Õ¼x™šf˜ýìÛúŽüÈ¤½•F˜5CÝ5 +Ó ….ï[wÆŸ»•!å8WӕÄ=YöÁb £ÚíD#¬ÛrÊ~ø[·ÆéŒÊ÷fú× =äÕ,ÌSï/OGwå©âo^užHµ<¬yI+0ғšU—‹<’`–­ D „ó¢±'Ä¯º4»ÓÀ ºßNg`3w¨>›!­­¬ùKø³ïîSÛNêhpKnŸt̚o‰ï3ðŸ²íMD׆gŽÌš›+»¤×¾¯[áÏõñ¶oî× SèŽjÄ(U⊏™¼u{Þƒ›~à úX ë¹Ò+u@·«Kô1¼|ƒ™ ½ëšÖðLApã×[Ü?FMZ +ÚZwmÿ½KeNR0¼h¥öB¿LóiQ‚M1ð£†õHśL’§ÞjmÂr7‚> endobj +2864 0 obj << +/Length1 949 +/Length2 3050 +/Length3 0 +/Length 3677 +/Filter /FlateDecode +>> +stream +xÚ­Ry<”{û¶edËز=ˆl͒u,Ù²ïÆ6Í<Æ cìªc‹DIŠE¶l!¡Å9Ê^–´(Y²‘2õNõžÓùõþûû<ÿ<×}Ýßë¾>÷uËËØ94“ƒædõ +ŽÒL¬Ð +Ž„Ê˛P@,•@&™b© €B£Q€Q¸?p  4uÔÐ:h¨<`B‰¦ü¨€¢‰Ò÷&-À(¤pX`¥€Á –8’q ŒˆDÀáû‹0À ) E¡<GŽƒþñݏɏ hý,ãÃCþ¦"@JàÈ0©0,âÉ$b4€ý 2cÈpòÿaêwqóp"Ñü]ž±£ÿa±ÁbôyrpH8¤Öd{äÓqå~j9·!ß:`ðÂ[´˜=/þxá“š»6Öp±NVÃÒ¸­¶Û°tä΢[@זøá£öb+<ÖßT³6ß¼¼\ÿª‹švå›uÜ‘êY’\Él·wA¢czE­Œ˜g­ûª•ÁÒí~4›gbTtsś˜lµ:̂裠Ëú}ºÃ‡ÅΊç¨ð Õä^>·Üy薧ž/‰öŸ)Q3|Âþq:Üh=Ä7¿;*[*ÿ{¼ñýTå"‚ž-ÊLòÙ'¹"+_¹PÛ©î!IJ_Êsîèˆ]cç­Ô;¢Í•!uL2Æ÷ÞK«yиPºš¸UþÎMj_a~³q²5¼×ÛT%äëºë捽¬îl•4ø°®G‚”ŒRQbâUš¼·|rTu<BSº-mjͯy«UÚbâ‰'²P…GçÙ}»W7M/è×êµ+¥6YgÈG/Vó©œ59ãa<ßM 8ò¹a¡àé™ðZV‡áEŽ´ÐŠZ6üÀ©CÓÊTÎì~‰%œ§gÞ­ÅsUOªÚ¸u·_Ɏœ :ƒ”(I™‹fâ!K¬±äÄÏ]£êEØX†­ö²¤nû¹àÖiY8Àuuùc'B‚ÐÒÆ͵iÚ&u—¼Iñ~DÎÕ/yÛb´Ö/ìa§Ï[½üéÛ1^q"²GÃèê{Ÿú6ë-ûÈÒº‰9‡ȁÏOXZ¬ýÅʚÆ"%=¼PˆÂF‘ûó—JI0Ú¶àԊó¥+õá9´¼eû‘ì>ÌT¤áÛÇz=Õ¦ÆÃËÓ*Œ@a¶úïÀY}d Øô lú-A:žp>™$8szĞñÙ)g‚ѽÙ{ã³JÑb/{Ú¡û›‚¿æΧ]Õz…’ÛkGé•ÝT§+˜ïÓ#Ùbìº/ºÙ¢¦¦L¬lJºm­`;³­µÂ-“{„D +³0ìù¬KdŽ˜³‹õêlK¸ +•Ü»Žc§ûÞTdØ´ !FF‡‹%)Æ;Ž2ºk¦5–µ5 YwϱÎÓ1W6 +Ò#ÝËLôÏÚðÐK‚ÚT¢$óçxOÆcãÎ +Gª =ºDÁ-ØgëÁË£EpŒöÐgôu¯£ ˆ t6œø)xë)b[*Ãqê’h«^Øx›Øú|æ3ŠVBôfdòl¼],gæè¾áàˎÇ>ˤ0ÛÓ»BÝ1eÓb^~”™>¹«Éýºþ+êmÌþdyØ=Sæ­ÅqFK GÔ¼ýÖÁxÜGu3̍۔¯}&Çì ÎÎ7 |»r!¯¤ªS‰xßHQšG¯Þd}÷K‡‹í ÁšS> pÙ¡/,²¯o]ÏáÏ©ÚÍ>ÃQ^ˆfÚöՙҮÉK®ÓˆñÙd TòGÖÄ4dŠ‘ y_Ú_Éü&¸ÅþE +(7‹îá»Ý¹x®¯Ë£Åvò=ʆ½Äuë!¸ÿVD”hÅYû"– ØtO·ñzö~ãÇI'™Ÿ=j=å ýÍ¿Ì_Uö`µhñ‘—G¥í1¿Òsñê–Oà雟&xxŸù§/é«süeq#@¥XÄj¸CÄJÈ¢|Ÿ‡ÙV2óÃ<0g#Óeü˪ý´vØaéòŒÙk ¨¼Û…š¸oôéoå[מNõ:9_7ï-+}´"úŸï«z`XØ×Fo‡KͤïxËùsbUa¹=È–Iœ+´~Âì€|Ê| aG”j=˾Žøò\õ„~÷¦ð#1µü«5qnLÖY¶<¦cW¤ÉÙ¢ÅYòŸ½ë·¡Çãï|°q˜õò–v>ÁÔmè™2ëI÷ɽî´m?þ¢®¼—hÜðÜÂøK<ì¼ùՁX}´~n´Pšߛ^åèú<ä°ÀŸ* OßX¾AHO^ÍwN  T=äêÈq;Å{áÏų úI˜ÙwRÇWÖæÞ´B¿aGwV𱵓ši %\yÚ¶Uá§ÐԘ°ûþe×`?b(‰çz¤ÝëÎÔNkÊáυ蔇ì¹/œÊ#MÛƒ¢.Ӿݭ,Õ¼gÔêù‡ò…W{ù€ÓõÈ¡GY¯«¸Ç‡vû—þJQZ/`´{ÓaA3nGêЁ/æ»êÙÍÛæÇVÏ݀‡gµÇ´¥°œ«i=Ì؞©æœžSŒòœÎÍê=ƒoC©¾Ím6”j“ðIáϤRvL!<]Ñf”×Î …÷)ƒw×'o!ê–ÅJúÁMHÕÇ2ó»£ái"rÖJv¶Ûò¹/¬2y æZEÌ-? =¼7úžµ,‚.¯ò^(koŒîåîz|ýh‚¨žÇ¨OM`×ß@õþ“ì;ÄçÅcèÚœR%EÏD[¶S».Ñpã@{° Ð^ª›Uð6ÌI-y~EA(YŽ°Ñ˔¹îÑk9µÄGëæ{p2*¡OÿÄ]«è³bË?^ÛÚ?ѯŠ| Ç7¯¸$±“þq®Ð‰UØ֜o¨Ç—yG¯ÒZ#åò’ïÖº`å‚æéÇN®ùý\=®…wòµ¸þ{bkI]‰sò·m·–c±ªWø¨ã‹¾ðQåþ)ßà º*øoú¿n,~‹Ï™—ÊÆ®Rd>5nÉoï=#S«81±;Ô"ZR6o7×ò7ñHªkÔéi¡†ÿ ó§ +endstream +endobj +2865 0 obj << +/Type /FontDescriptor +/FontName /KKSFXT+CMR9 +/Flags 4 +/FontBBox [-39 -250 1036 750] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle 0 +/StemV 74 +/XHeight 431 +/CharSet (/a/d/equal/h/l/m/o/one/parenleft/parenright/r/s/v/zero) +/FontFile 2864 0 R +>> endobj +2866 0 obj << +/Length1 802 +/Length2 1027 +/Length3 0 +/Length 1582 +/Filter /FlateDecode +>> +stream +xÚ­’{\LiÇ ]&÷ÐMëU*ºÌ̙šF¹VJÑLj„N3ïL§fÎç̤©$a)’b•KÉV.+l-يØ"¬Ôg¦%—Be¹ížÂúlþÝÏùç<ÏïyŸ÷ûþžÇzò"¡£»˜…Þ®tD˜ˆðä ƒ6@˜l†µµ' Q%FàóP%tˆ«+ÜUR€p›çÆa»qy kàI(Ô$& S‚©žÓúŠxÀ]IL„‏*àœî!Be@Hˆ0¨T3»LûNP RŒ„b&A€)A(”b8ƒÕGä‹KÀûœ«_¥HHR4˜JCN4¢˜Àej †K@ÐwAšäÿ€ØÜ[%“ Py_û~—¾ÓQ9&S© ä +•’€Oˆ!‰,] +?Ãñ¡Sɪ¾JT†‰Üq© GęÉvâ~0Ê‹‚âE˜R$¨Œ‚ýyˆ‹¢Ðöõƒ°–-÷òó±ÿ2×~qŠáÊÅjìoÕý1ò-¦]"±(°‚Íd³ºþ¾þ… ¸Ì b —× $‰ªôÑÄ ÃÅ0 +À(š˜ÅÄ %}ÐÖ¬‚dôÕ °PŠ¶ +£"詄õ‰ýyXÒ¾ „$\«¢gõ¯À,¤¨oÙïïáADÅ8r\£« ƒ .€Çã®ÿO¡HE’Wöïmá×X‚ѶCEŒF !š±9<½èÇãq^9·~Æ2è­>ù¬Q¯bYIÜL¼^ÈÍ +˜,Uæ¶n>»³Ò8¢ÖdhÆOFäÓdÁŽUÝ?åŸMÊ>²lW<·œÙ 4VoJÚ;⓽m›oåÚ%·4›»•“-û­»­6TÏ?õXžSö¦Ic8Ö.0ÍÎҌ×xLO;x‚±Zû¤nÒ«’ éU³D/oÜõó]dLy'ÙÖJf†v£=!’ÈÚZû€ÇîëŸ6¯3í¿£|EÔs‹m–[­». D½NŠ3¹sM¡g|{[{òá×±þŒr +Ú[•›«šY)ñóË,ü&V·8…½7«¶ì'e79é>.1­ TpÙú÷S=³¼¸·GЈƒÅ{,æ=^{´t֛ ãäõ̅EÁ¹¥•†šÒñˆÑœúFϔÞC‚ëºI¾êlÏޒ°í,ãÖÎ×5·æç¶ÄË 7͌ )f$û£ÞŸt“/¶6m¿¢@¢O]°Ùá£Mo°‰äuöÁÉ wõO^ \<ªŠí†PŠ±9¬ýmÅ_²KuÛ«ü-ÕørßÛ-W&uÖiþ˜¼îü¦Á/S2ÀÑþÜÆiç‚®:uڴ׸%ä¾ +õÔÍ<¯›ôPŸs ágæFmk¤=¦VsžS +nŽvȿт§Ä¨‹øqñw\—NŒJj©üñpÜԔ˩ÍÚì»Mr¯gEÎ2•ÃÙqKó5y+Û_¯zbÒDҋpɞ7`»ÖFsžŸ/pï´êþ¸,ru‚ÜSÉd¼VÈm’d¦Î´Ön/Ln™âÈ}¾:¸Â‡Ó6½Óäªþ¨ºé¥ÂÎËÙ7ÔÞÕªVûúÄþrìZºùdž(TsìRLjû3›'Ü5Õþ˜Ã¼…ƒ‡OÈ=xǶ‰žÍñbו÷Fÿ¾ŠÙõ´Ͳ.¸^cÑ0"ÃÜ«!•©2‰Õ}’V§_j8Ä*½ã$·s_ÓLqGçñƼ7c>-­5­Ð5Wü©eXàÑkJrI-dTTïÞ¸&¼U_z`Žž½ßÖÅCƒN{ª4ˆ¶;Ë—Ï-Nr +Q‘@Œßâ–ÙÎrŽýšaàô‡ýŠ’„ÄwÞ!ãX®éw÷¦s²ë¥•‘åÌîxSËé·u<%²‚tüï­d(-ە¥;äÁ‰Â«ëÞ]¸æîpßæáYùŠw¹¾‰;:bòzc }꺂WžR½n>µU1;uݹ‘±™þ•#­ft™ +·˜:¶%èN9RÝØ5ç‚@hÔ´½Â{“¨år°õ×ûÚ´è£2³›ïíÞÙaÉ´K¨É›û!BØz©´½7zbÕûºÙÌÔ¹¤ó¬ª$3çzÀ&=¾~¼¦¾'z¡eٜ¢HÂÇîDé•Cic¸Óÿ„¯ +endstream +endobj +2867 0 obj << +/Type /FontDescriptor +/FontName /VUZELH+CMSY10 +/Flags 4 +/FontBBox [-29 -960 1116 775] +/Ascent 750 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 85 +/XHeight 431 +/CharSet (/asteriskmath/greaterequal/lessequal) +/FontFile 2866 0 R +>> endobj +2868 0 obj << +/Length1 833 +/Length2 1649 +/Length3 0 +/Length 2223 +/Filter /FlateDecode +>> +stream +xÚ­Ry<”k–¨*¥"*l!fƲ~öCÖÆ6֌™×f33–9ÖEƒ²FBL +9¶²v"´œ(”¬'2eù,:C__¿¯óï÷{ÿyïëºîû¹žë~äeìTðTȜJaª"Ô:ÀÄÆÁU ÔàBòò&tË$R)¦X&¤ÚÚ`D€ké¨#tBòÀ„Jcщ?&8b¢´.ÒFdˆNÄa)ÀËôƒÈ¼8, 8PqDˆÉRF$@¯w0b@ô`¯&„@<Ç>H‚­²¤øRÖ7DûNCtÏ8Â3©xñT +‰ð¯̖Ê; â9ù˜úy¸y‰d‹%¯_é4–L$±þ# ’iALˆl¨xˆNùYê}ófá‰AäŸYK&–DÄQ$¨"4ÔàHÔ7‚È0'†Bx{"ç|±$´CüÏVxém9š»˜º¨|Ûêg%R˜Ž,à?Ä5âGÍˈN îp58Áò¾ïž?eFÁQñD +¨£4–NDz„à¼Qê(C"…(”g¦F¡2y-€—Lð¥Ò…Ö—Š0,ƒ—‘Àۉß:¹#ԆǼ`êß1¼é¿°Æ1£Ñ‰¼ëþÂŒáÖïøÏxŒ©¡aª@U›×Ž@ªk­cšÿ£ÃÑé…¹ñþx¯}‰¼½@P(„êë¥âtÏø§UÇq"Íò;o +¶-µß~ß·µS™EÄG8 rNȘyoªˆtIÇé^£Wî¿h{Áëãu±[Uñ×n`.E£šÔ^9ˆ³bâ¯l_SQœ°|蜞ûFJ§‰>šy^öhßGÙ¨v‘ü;c·üÆÅ¡^áÝÊèdåÒZ}Å[7íg r{V¤d¶Å丣‡k¼=à +]ž z-&!©˜Q{"Úýýå >¢sTSØòU{™§ý/™ý!;¾lmq5̓ŸòŸ6ñTBzîDÁI´¤µ¡ÉÒÁ3îêlŽÆ@qøaBò.QŒ¢ë攒/ñ]>úâXÿæáƒÇrÅ°w2*Üߑ±ÜQ¯$$méTíZŽÞ‡¾° ¹ª)vr=ìp‹ˆañì©)4¦%ÒJÝ!)5¾| c©Ç²#°ü4pþ]Û{çýÑ·¦Oâƒj]æ¼èÁ +;ºö¶®:ítøÓ)†©k_¾TÓòYsèÃÎbqë+[)¬ÕöúÕJ ¤QSv`hó¯ìð¶â-*‚!FXHÏɐ~Eã™èè¬AΪ72¦Üb¼°¦SlL6;‘¯°3g2â_QúÚº»ùŽ<§¸)q§;¸¢3á´ÖRR7°@·Tæy”GN¾ÔÏ{n‰´Û£©®'åÜë+Xë`ï=;œö|ÇŠÇ؇šæÕ¥NܗšZ»LŠÈ&Æä“‹»/Î{g^½ÎÙ3tîþön!Ô§•Ê‚³·ë./‹¹•¥³m ö‘žn/™âñaõgÄG,ÃMMnX=2îŸÈ$T°;§q%sIÙ)À^4¡m´?Ye©ýjX–sQßʧbf»ø^>«P5ž©¶ kTýAí^ô²UýþÅí×>‡ÃHÁþÑ|á¬éõd»³-zŽ.Wº¾ ¸1Z‘ÐhâÞ®5'PèS•Ñ»m£sõ,fiJ“°W￈„ï̈́k ›¥;ñuÅ:ybhtFXOžË¹üdÌ%”7ôK«J^6¸i7‘e1Þ!W»Ýõ쵨W¥m בÛl0Ùdá%]ßs‘óiÑ]ŒÞ-¾™ñØÁhæ>ófdk:ñáO+¬®›î—xÕÖ±-séC–æ9Œd=A|wëS{ݐÉ/‡Îvi,rˮߞcF5þjH¤²: ““Üvm‘«˜õºk³Ó†×­…øúBZ”qdÄ= OÓÛ?Çiõïßq‘ƒ¯¿Kž¯7#ßé—JÒÆN¼^vÎðf_м<ûÚÍþ¢léjÙ¤&Îáuq¹³{±ÁcŠ©ûÖ_òÕü³¦Œ±gÜÃ¥Z ²"Šú¡€>±Ï}»KfºRù´àÜÂ1*dgû[ZYý¸ä€ßà\š†‚€¿ÅŸ)[fîÞ2]mà ‹Šà9¥ÕÇ@Cu¡áÄ´`QÂU§¦4…µôl­ø¡Â€‰óû +Ù!Øg„ü±;óIEr½îJV©©nka;ŸˆXç‹š~ÑcØhÜsEPp4ü]¡™ã$9lŽpȓFév³¯Y6Ë«ü¨Ú<ÚZ™ØXE‹›´”GÇÒNyàG™3oOeþbüfEÿx2¢+|Þ|Þ3õ^¢pl¤cX눫®=â ´ IÚ÷°JTGÇ)YULê´èÞÒ'hï²ìµ,dʓyî`AþWs´önC“Ì-r­¥Uˆ…ždU›û£]m¾M¯÷¯¡ŠïëםÇP§ߛ' Å·T÷Ædv( _áÇZÙF¤P4Gå–ˆzu2¦ü¶π­\½ToÍCC\£š]p”ÿœËˆb³V+£„LG]OÕ®xšËæ慫R´ „¹‡¶`2AÇü©ÂËÑÜD͓ñ:î=#bʄ ›¡ôGèm. Á3—^Z9rJÏL‘ÿ—1T1h]%\€“Žµñ_m6}”›6[ß÷7Q£J +endstream +endobj +2869 0 obj << +/Type /FontDescriptor +/FontName /ATFWDW+CMSY6 +/Flags 4 +/FontBBox [-4 -948 1329 786] +/Ascent 750 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 93 +/XHeight 431 +/CharSet (/asteriskmath/dagger/daggerdbl/prime/section) +/FontFile 2868 0 R +>> endobj +2870 0 obj << +/Length1 746 +/Length2 603 +/Length3 0 +/Length 1117 +/Filter /FlateDecode +>> +stream +xÚSU ÖuLÉOJuËÏ+Ñ5Ô3´Rpö Ž4W0Ô3àRUu.JM,ÉÌÏsI,IµR0´´4Tp,MW04U00·22´25âRUpÎ/¨,ÊLÏ(QÐpÖ)2WpÌM-ÊLNÌSðM,ÉHÍš‘œ˜£œŸœ™ZR©§à˜“£ÒQ¬”ZœZT–š¢Çeh¨’™\¢”šž™Ç¥rg^Z¾‚9D8¥´&U–ZT t”‚Бš +@'¦äçåT*¤¤¦qéûåíJº„ŽB7Ü­4'Ç/1d<(0¤s3s*¡ +òs JKR‹|óSR‹òЕ†§BÜ曚’Yš‹.ëY’˜“™ì˜—ž“ª kh¢g`l +‘È,vˬHM È,IÎPHKÌ)N‹§æ¥ ;z`‡èû{¹úûhCb,˜™WRYª`€P æ"øÀ0*ʬPˆ6Ð300*B+Í.×¼äü”̼t#S3…Ä¢¢ÄJ. QF¦¦ +Ն +™y)© +©@ëëå嗵(C¦V!-¿ˆ ©& +úE™@·…¹0½áä”_Q­ Lrº–¦† +†F¦F +æFµ( +“K‹ŠRóJÀ 0~Z&0SS+R“¹n^ËO¶nɚ¾­meëâ «Xõ9žXûò&ûˆu³3SjƒMç*¦—,yµðÑÖ¾ÃâÙ%¼’­§ +m‘ìõë‰û²HxÍÖ®Ë"&4˜î×»,^ÙÜ5÷Ÿ¶ú+ÏÅa3æ´>’¶Ú_ôxV§²ÎÍ/Êõ'x楼pŠZ¼ïû½kÜBZA“´”¤Ìo®`¿Ë(&^y÷ù¥@O¹ý©+{æ?Úx¾·(ª@CÒ³ßëÿ3‹ÝË6*·ÿ¬½8àšÞ"‰«›üž :Äï|Öú/ïm‰èLÝjõ}Ç5ùÞßù©?õî뀂Œ{ÜǗßìxâüLp—ãÂ'æXÌ6Õ1q^Ÿ·&ŽçˆÒÜ7"†§:ùLœ£nW¿Èa_µÞT©íՓ¢÷lg¶cx­'´ñÄÓÏkå]–K†¯Õ9j;±ú/§r£hDÛ;³ ‡ïæU-z?çÓñú!ófÊ>$ø̯_Í6aiÝ|m÷ÇÜÓ»Ö'·u½R½e"ìV]véƒ~ÃôK-r·Òʋ¥²Î¿á^ý‘1‹c¶®ÊKǧÏS¦9mÕàUZ´ÐsÎʂžOn×ܔ┓á—:'j9'<`Ú·1ÐôÌü×O‚~~;¦>­koêßU‡$žu*ì<¿)ᅑ„xòœÄђw'˜.9»%ÿŒc˜ñîI~G9æ}{˜íÉkßCDnofÒ57>ýZzý55Û¼Òœ–1(ysx'j‡–N[ +/³½Î.ù¥©Àòy¼ÂB…ö¦?û›æŠ4뼫}›!ähªú;smãÝaÅ,rXn1hÝ> endobj +2872 0 obj << +/Length1 792 +/Length2 1349 +/Length3 0 +/Length 1899 +/Filter /FlateDecode +>> +stream +xÚ­R{<”i-‹Šä´y«03ï0äXÃ&ì:‡œÒ˜÷ñ2ޙfÞ)ói¬-_QZiË9’*»Õ†VZ2jÊ7‰(ہrh‡¶ß~Ÿý÷û=ÿ<÷u]Ï}_Ïõ<†z^¾fT˜Ž8³1Ü "@6ÀÉÝ7p €$%CC'.BÃQ6ö Gldm *Ÿ + YِÉ6TœØeFàÀØiÓ‚È +P£.J§aÀ†G ÑÒt ø²é(‚ €ÊbŸ…<àƒðî>&(A€Q:Â&Š) ¹b 6°úÃ|ÎgjÂåIMc©ÉM@jfc,€†у-…Hü?L-mîÌg±× T7‚Ä t%Q›n›y¦îHIÜö‚ÎÒ/ˆŠÓw*†E +×wÕÇe¡°Ð—’í­ÇÄ Gò$µ©­ZQ÷׺ÑmO¯áÖh§x$ïÏ_S^›”{a׉xJ ¡×WKp()cå¼É×#®­{ýæg×`*šûóJÊ}[Š¶¸Ò"sºÁƓc…ËYhȃW4-îî” ^—¶µ^)„O}×[ðÐâ7…)§åJ2ÚJço]ó+n8ðkë3X¹½)ëŒÚýTõ7£1Ê -ù7¡é~Ûáü²šcøÊeùÓ#s—Mšö[¼k~ÏÜy7¦¢,ªÐ›,‘¿M.sÁucÛÝ^®^?AýCü±ÉäçeË*‰F;ˆ™p<&ˆêÚúí;ÃXWèÄe‰Mù› ­[éÝÇOn\Ïg8%9§QúÒDa@¡…ø…wÌYÛÎñøù…¡ô]b¹íW*ðD~b³Ø!fŽý!úbDé ;jæ¹Í”]š¢— +”¹¤QΚ֙vÛdyú«Ëäwžöí.@à +ís +úãŅš¡õ‰­{þM\Ç°mŠ«„έûr¨ +Möó¸Jåù+ë0š•äù¹™Qyû¿Â%3B,3ùÁö1A¢ÑÆS¯1|³'kÊËjîŒWUÆUPùÃÚ«”Îæ0ŽÈÕój>:÷Uꚤ·7TOQUóW%’¸ï—ÕI*îN5g&e®ÞÜê±ùIpÏ åÌì-ª¨x ]7“±©IlÀÍÛ˃'ßÿLÁ?v( M½ö>m\¼Ferbäⶨg$è]¦ŸÝ°Ÿ‹Ú‡Ñ¼´ÁÃsñÜ:þkí–úî܎xúó²Èõ萕¦l¹¤¯ÊI·3îõK¢GÙ3ý¡B,E#ÖËüö›ÅÇ\¯OÉãqEäœûâÙÁ銻õý§¾ßý'=©1 +endstream +endobj +2873 0 obj << +/Type /FontDescriptor +/FontName /JRVZXP+CMSY8 +/Flags 4 +/FontBBox [-30 -955 1185 779] +/Ascent 750 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 89 +/XHeight 431 +/CharSet (/dagger/daggerdbl/section) +/FontFile 2872 0 R +>> endobj +2874 0 obj << +/Length1 815 +/Length2 1151 +/Length3 0 +/Length 1723 +/Filter /FlateDecode +>> +stream +xÚ­RkXSW•axl u°DD +y\ D8R )/AžIîM¸c’›Çcx¶¨È` (XE”Q¨8 P°â +Eh‹( D|4Zµ-ö‚ãôúw¾óçìµÖÙ{}kWgA •c"$SàTˆ±72&Ñ@4ÉՕ«F„8Š)>â@~~àh¥b‹íåÅöb‘\SêÔ¨4k¸î³"àÈ5**@¤Ï@äD±Pb01Šà:àÈd zö…D#D½ i$0*Ɓ‘¢ +}ÖP˜B‚ÖÖ*ßR›µ†0Ö&ÝaÆ2€ ‰ÎLjYáäÿaj~ó­LÆÊgÛφô;Z(Geºÿ0¹R‹#j‰ÁˆZ1_ºyã-Q­|>† e¨˜£Ê@…|h oæՄ ™,@qqedGð|+DzsFè¡Ü`AP¤Ç›­Îq!ªÀcuJ0~ÏÕÐo5‘‘ÍI ƒBâ¼½¥Ì›¬c0ª/¦/ªÕB‰A´òb2¨F2’I¦ÓN<D2 ÁÔ¤Ù¥zºPC$…j6;ɘ%çp&Ð"Gø1/“! ¢Ò«{‹úºR¦ÕÈQ…V3þ>‹  ,SOõfªs-€ _Àb± ÿ#kÕjbØÜo#}[KPb ’‰ˆIC˜Øÿ㿕Ÿ+8‘\Õ[cA_ø²»vbȪ-¡1«… 1Ìʏœ¥øÑÉã Å픍ח†‹ýw“Õg—ý_”j:B>ÕPxèX§9ÌVÚ` E—_¸ç·É°vUüÞýŸŒþ™Ýª3îpñ2¹dw/ª„¿ÚPÕòã­›%ïG—¼¿r9k¨ÚjǾ¢¾ßçô´1»¼+P<}훈0ERèv]²ÎFd>'¥H6õš¼Ÿòé§<,¬ È\{у|Y­ÓµËí®Æь{S?láoŸ:,7-ō£†=Þ%çÜÈm^µ©9ø5£lã*Ã/ÙëiÕY‚¯¼s»GFJ¶ìßüÚîjø +y«£¼×WÄRºÂôŒ{Ž­¨7•æjì·uª–c;.ºó.ƒg1Eöq;Š|<–8ʯÉÒÂVÍþ!¼7êh}<÷¡ÅŽc#Ÿ5¼³´©¾2ʲ@}—¾Üò²ÝcD©»šûy8^oúø Oá¾ù˜Ïs¦4ë³=¯;iÐôÉígFÍþhŸ\÷Bb½CG¾ì'ܙ7¸A¥><²/:î’Þ4â "¶®»tÇAw¹¡ì`…´ßj•`A]Û6—±·@ßÑí +“{ ç|֖F» ÝnÕÔH¥Eû™æKôÞ'šúÓé+ãnÞl†ñ¼Ÿ¨ž¬ ¶=ZJ‰XnÀ2°¤ÉÖö^¥±ÏEÜýÉâ¶Ê²ÕA.éÇÏN)µ?7Ž·ßõ YŒJ‹yû¸%™ìÑ |ãͯ¶6L܂’;,.0[½èî ø #»xKÃNfx—¿ª_ŸT­z7ìT떼 wÍã뿓eøøë~•ü\5á«/±–«ñ%NÅ£{9ÀômÜÀ5o‰M; ÉyðËàPi§õhè·+ÖÒ¿vʏg5|­¬ÑÒ": +#‹ö¼² O[ÁÿX9“<ÙP{.?:íüê›çË'GØ gŠojøpÅí`Šö89"j`¢zPS¾u—òžðÆ¡¦öËó÷*þ•#ê%Ž‰´åò”!gѳ_ž¤šU=¨îµýî‹PÛij·¬\=`™¼~Ê~×HùÑæZUozçRrÁÎóÊ.%×íÃrUsÍ þéšýۏåYì8½­ía¢ y€ž«¬³I5gɜžTˆ'x• +Ì%k®t¶^é¡Ù$wÖòI>E-¨ãpRšy¥ñ‡Ó›×¥g^ÕkO·ÑÅ}V‡G xN£±ž¹QOÿäÆã÷¿S,¬²yö‡Ý‹'”{ãVÝyì™ÒžÑŸt¤2¬Ãj&.ý;ûë@Î=ƒ]ÐDx ïmjE"·,~KOͧßv~.¹([”¾Bí¼?Ä(ÌsÏ=×ú„ b-ó2R VI]Yì^­èwžœ±Hà&”Ñö¹Ÿºà¤·÷ÜzñóÆ|œRX´ì$Ñý[øÉÝ©¦ ÿ¤Æ_ðÿëúG—ÏöŽ«ô…ãAS¾u´bö}]göý#kJ}'tà aøthËO “g²;^^¥y¶Ýáµ\I¶ò=´{¦h(çf-3ØáWcK7; +endstream +endobj +2875 0 obj << +/Type /FontDescriptor +/FontName /GCEPBM+CMSY9 +/Flags 4 +/FontBBox [-30 -958 1146 777] +/Ascent 750 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 87 +/XHeight 431 +/CharSet (/asteriskmath/element/lessequal/plusminus) +/FontFile 2874 0 R +>> endobj +2876 0 obj << +/Length1 815 +/Length2 1545 +/Length3 0 +/Length 2105 +/Filter /FlateDecode +>> +stream +xÚ­R{_Z±®Ya,эHòò±ú×=ÌÉT˜Íß&äü›v=ƒÿ‰[á±@0ƒÃ + âûñ +™'¶‰MCè0;°±³¨\.U¨SPÙØÙ{@fÓ¡XŠU8ÆbØ_Ñpüxőq5f~£`}gRs‘ €õ›þ:‘«+»ÇZAkmk£¸m¼-p´ÁÅÿ&àr!6öH{ù3`Å!(¢iôӛjO8©t+ùñråWÍû¬7òFƒ“n›†ÅoÈÓ9|žâŠ?âáy¾YcÖĈ«ŽÇköâ’[ã©ôð‰rD~ޟTÇÕRz.ÿ(%]°ßu +;/ßL]âùË;÷Ãs1F¸’æ„Ö"=µ6÷;kÝÌ×ÏêJoådä›Êw÷½_%ë×]ÆM®îçnª e…m‚®TžãýÔUÌܦ»wvç#ħM-¯0v… ©JÛÃ!¥‘©AïgcR¿‰;®ñù™ÜђÐEY¡´K³V™ðE{D-|c@ßOº’«;:c‰ÎšØÂaÃzÛ³bç)x{GYE†ð†Ê䒈¯LÏ ¬ žQ’ÏR­³\–©IÕgø÷ÇÖ܋ºÍԜ +TÅv~Omè‡ÁÐC¶ŸÉêXõ¦A×J8‹¬ò +͝Ÿd¿æ÷­öêüݏ÷ øubĐ»Qmʮܶ±¢*Ì` "—šê­ÛnHØù8HBx…*™6œ®†TÖʆª3-àñ,iR¹¨·Àßä+Rg‘=ýOB9q°Í£\*+n +ë‡"Eò U2¾¡ÓäÃ>|íã8@Ùfoh²á×ή*]økÊÑvoV_ÒÉÀt×:\‹pd’8z×ëè¤ÞT‰ŽOù-¹…`ü·X,ÎI—íð _,ÚĈ'­zæ.M;`ÅÑĽ/nÌJõî&I%Ñ&ì³ÏhÂ#¦{.Ä,ÅâÈ°YmSåŸWáÜݏþ*8}â£úñמòòš,óÖs.«-Okn~œÙ¡‚Ú,R½1v¿2¨Á9p"fi[šOF”hn(5•ª})+^d¨U=J%Jt*ÆhM’øR¢oc‚/ɱ¶é >ËÌø‰Ø »òÍkÇèzíc7Aª·Yȑº£Ø—å$ûE ÝvúÁgš‚o¼[eλöAÝG¹Ör¼ðR@ì±þK«=•[îc=üÅ>¢"¢ú¨É¡{oÓ²6Wê“2 Æh} £%ámß³ËLŸO':äz4»ûãíƒãCûèåÖîp]âŸRx ´eŸ$21÷|ö–7„ËF_}8¨ŒJ³dY¥ÅNŠÛþç·×£ï¨üܗþi+El —%}æ¢Ó!ã¡Û# öú¡<Œo›»¡­¥%â0&š|¿û-ql æþzek@éÃsû‹ÿ6XÑþÛT㍋giöÝSV£]ððş‘:ÕβOøhڍxm^—£ÚȐ;÷›Ô-Õ­¶…¯íHI}tç3¾ƒ7qˆ²ž÷âxH•ì(ä¼Òñ{X.­”>)Üe.ÅļhöqxŸèñÔaWƒåþ1nàežqNæþR6ÿ)Jë™àAjAZû#)§„P¾z•¹´¬´éňmݽ‰ÑOÓ¹>ì±n:i¢¦ç~úº`rÔòÑ=qƒ™'·„šM§/3çN|kJÎW1î xM;î®l§mV_tñ궢›}šõÊ:èg[DæÉå¹í;Q¡’"É âìÁï{õ¢½Û.“¸Rp™Ïzý-ì2ÅöÒ£`NœZW[P‚~qà¸Î`קo­9´\HC™­é^egÉ-J‰ n ‹;«|5M +‘àzÕ¬—Ú¥ÉWÒ«2 V¨×rÌm†wý9­­?ÕCý‡ù^1èõt)½š•U´º¹¹¾ì°vXro÷<Ûuƒ1-1ªƒ8ÂqŽšÛOêRêØî +Êõ«õè•Å¹!µ»"OïsAšÆíS™Èij£f{y¾Õ†Ö{á +endstream +endobj +2877 0 obj << +/Type /FontDescriptor +/FontName /CDCNLO+MSBM10 +/Flags 4 +/FontBBox [-55 -420 2343 920] +/Ascent 473 +/CapHeight 689 +/Descent 0 +/ItalicAngle 0 +/StemV 40 +/XHeight 463 +/CharSet (/Q/R) +/FontFile 2876 0 R +>> endobj +2878 0 obj << +/Length1 1612 +/Length2 16918 +/Length3 0 +/Length 17756 +/Filter /FlateDecode +>> +stream +xÚ¬¸ct¥k´&ÛvVl;Û¶mÛ¶+FŶmÛ¶S1+Ö­½OwŸçöýÓ÷üXc|ïÄ3ñÌw~k-2"e:A{#S1{;:&zFn€œ¥­‘«³¬½ ’©¹+ௐ †ŒLØÉÔÐÅÒÞNÄÐŔ nj1503˜¸¸¸`ÈÂöžN–æ.JU%u*Úÿ”üc0òüŸš¿žÎ–ævò¿n¦6ö¶¦v.!þ¯•MM.¦3KS€°¼‚¦¤œ8€R\N njgêdhPp5²±4ÈX›Ú9›RÌì6ÿqÛۙXþSš3ý_,Ag€!ÀÙÁÔØò¯›©‡±©Ã?*Z€ƒ©“­¥³óßg€¥3ÀÜÉÐÎåo\ì–vÆ6®&ÿ$ðWnfÿoBNö-lÿêþ‚)Ø;»8;Y:¸þFUû<], ]þ‰ílùW °7ûkiboìúOIÿêþÂüÕºZÚ9\L=\þ‰ed +0±tv°1ôüû/˜ƒ“å¿i¸:[ڙÿg´'SsC'Sgç¿0±ÿéÎÖ øߪ7tp°ñü×Ûþ_«ÿ•ƒ¥‹³©= óߘÆ.c›[ÚÁ0ü3(’vfö&Æÿ›¸:üO›©Ó¿ ¢ügf¨þ&ahbogã 015ƒa³wù@ùÇ2ýÉÿ ÿ·üßBïÿ?rÿ+GÿÛ%þÿ{Ÿÿ+´˜«œ¡íßøø»aì2€vŒ¡ÓÿËÜÐÖÒÆóÿàð_ ÕMÿ#ÉÿIÿÍ´3ÿK#=ã-Å,=LM,]Œ-f†6;õ¯\ÕÎÄÔÉÆÒÎô/£ÿ6@ÇÄÈø_t*–ÆÖvÿ´ží?T¦v&ÿ5ù¿$ý›:ƒ’´ª¢˜ÍÝ©ÿZ)üåÞEÅÓáobÿ£Y{“ÿuøCHÈÞàM÷÷Ò1³pØÿädbòý?Dû†é?ϲ†.N–í¿%32ý[øÿøüçI÷¿ÀˆÚۛü3+Ê.†v&Çë þQ»:9ýeõßÿ·àÿyþwÐMM=LaÖW썄X¥ge¸ÔaæŽL‰hô1Ž„:”6ªÔØ÷ú§GìqU|ԆÒ7Ípµ{.Ÿ;|IQõaØPô¦š^çãù’Põ o“wrÐ1è•Âg\¨Çxß,Éì‚i±3ªïO)*é•|@àÏt²8AÝ9 ø§5Ä£w!5¡Ôž_'>?Q Ž ÷ށ÷áÒäÄC“ýpƒ'pÌÁå×R­ôŽ¤‚Èh†Ã½ë¸ù"TïñÖË##Å!²•yS0Ïß°ëùHÏèàçI’u’h;ªÒÀ¸]˜‰æLšášÏýÞt%uÆäiƛ¸Ÿ³& žÍ‚l y¹¥pŽð®³­¡~ëGÈ]Uì*mpo…8"c¤t­Bnsp&óÒY’¶0ý(ˎ°‹OzZR7âí웷®½1ÉÕuªËÂR ?o ?C?kf/4lºœ– n¾Õ’›” )¾Pôìô»ŽvÀ%ýYîõÄ­¡ [þ‡¡©Tµ«UfQå9y¬§¸±Ýw9$[”ԏ+ .‚4Ãhñ×D¸ö÷ùàïL;”ôʳ@¯³0×! b˜¹ÅBӀkj̊|RA[¢a†NòŠ‡–g –Ú8îòT¢ØÚbÇ÷щu„™_<¼ñ1zaoˆ0:vltGy/‹ÄþNÃàÖïÚÖ¯# ^"æ0±<]™Øž±°Ž„ŠQ1®–D8£pb× µF…þ$ÑsÝ(+ Ì'Î#¿C/ +ïd$µûEq¾(H$ù¥Äã­}ؙ!I¨²©µ!½>!·›¤@ၩÐ=݆îŒ`ońL©[ðQ¢f£9ERìÏëS¿Ü²ÏÖ®Ë$nôî!"uæ«vAؽHq4CDlÜÛá\ù¹èîþBX´>RQ­y%Œy ©%ÅÚ#ÂÒäWùÂRð~ƒMjžžZçìÙ!ž.¹¦g¢%ˆ- ³S2zÏ PA¡ŸüÞF3øÉOùüø>¾úú”$Í÷ós²%ÞºK¯YOÏÛÙÄûÛÁŒ¦¶MçÍt—·M£‹ؽ¾;zT¾­÷ͱQêºÑ6î åÍ^ï¡ŠñÓwT” qÐè9ˆéƒ{ÿ~eÍs¥Pxs«xñ ïxö\dÿH”/)’àDIñ0¦?Îäeä"dÛí·"ôäꑈÖ^}ÖíV~gzU»3Y\—b„2 ”.’ñt“КT¿gáýxX÷Jÿ(—¬ßp¬¤ˆP ^ë¨ïra¾¿¢^U"P]€Ü!9óÅ4˜þ¥ŠDZ§o,~:E•sE¹Ê”Ùµ[Tà¹ü$3€Nø3¯''8¨P[YËZ_ðÁ!Ð2”åçˆù: +n¡uÍþeËz-þNjÒªƒ ²à Mšÿ#J†•ús€š eýn ­ìUBGå ‹yO׳زl\‹×­7†°KFÎÁ÷xKíY¢ º,@‡ùƒÇd[0…bÛÃõ¢C±j2S;–GRs¢Rn}Ë0ö#fz×Ù±M1pèCwhà/ndåÍ4E\ìª?Ë>_ÚüR<’×_دºy»¨&N¯ïêÒD5·/‰íä@À™?ï ~Óò5•s`SñE±L;üòï/øMWM6áðî›èÇ^pTò ç*»vNæ8.´6ý „ÈÑÕR +›™xdsqúd‚gÞ%–›¶§„!†²¸õ»ÇüͱÁîìY³4›û¤Ô,o5Èý±.UØNY”¶jk ÜòÎ4êø°cpé¶óRÎ)&i~f§ož{.NI©¯.“°ôÈã? +Þ*0- +SÞdPÎ@ &Œv@Í„“j®Q4`$|Õÿ…gB$'ùãÏ­ڇr:+öaéÏüÐÀæT|‡c5ô©ãñ}1[wa= {tLÿoÓã@ŠæAé¤þÔŠy* ™šù[Ý´Ícž^¶|?ÄjHönôX@ÁT¬bÁ;¨Æ¿<úÁTòϲÀ÷§re­ß:˜L±µ\‚HAŸ:}êŸykl¬dóÈ¥gPs}ޕÓã²Ûêåç#¡AÑ qº ×ÔK·…Úâ:DÿÌòÀ$Š¢ÍXXPöLðÔ¶¡óK2™D®›<ðaîO„A57Ðí°y$øºàRüÍIzÍ:)Œù&é¸â›Pð0_ß&ipû~-pŠ§äØÜ.ÚϘ’nÕºI‰6•ÇHh졚v[·®C÷•\‡´ ƒ±™Ož·d¾5‚Ñ{å!½…d$¾ø>YÛ3·?Êm$±©9½=sLÚòZ¯!y]ôÆïX80ng± "Q.7%\3q”¤¤à` ¡{=ƒÑWt5„¨uüÅê«ômÜ`ュe‡‰"R”b–œœ­d䆩å‡*°HêÓUt¸«l‚oËEÝe8¦E¼g³9öëÁû{7ʓÏv%ÇÜŝÁ2+ñ¹K +èsõÁ¾-/fú¸s¢ÑÕl°UÀ L–ïþ¢’9:ºOÐ¥ã&ö®SŠ€0$GÑãRã܈Ð>ÊxîãuÓó%´ÊôWNëdzKŽ•GÅtŽèàÒ.¶Í\¨jÏ2¾Ïc +˜S°Úl ¿ª(f•åɘ0!›/Ù £k¼c7’0»ö†.~"ÚX½æÜË»å‚}Ӎ˜EeRû6 {C“LÓQñŘ9-Œ"³—èUAáG=y…,úãjÀ9Å]Ûlá¶3ß÷lµÕš[vKÿ.qÕ©˜Kà¼]ÔÓ£ó8\<ЌYm»,Gl$_ @âîHÁä¾ð,)ì•kO7£®×÷íÈYÒÜúxÏoAEåOC”ð:»(¯¹Îõã†2oƒ^Ÿ×öè)›ntT'´î¶á8~ÁæyŸº\Îø"Æê.èxÚjQùhIa¾é%Þ!Æ)`Ÿù'*õ†Áò| ‘Xåª;ù©hJ…(ˆ¯rýñdfO³{÷V»ÚifÁ|%)Jtæéžm.ŒmeR÷óuÃ+™qYÝ©üMé8uêEõ¯½jDŒgʹjÉ®z¡täµ \­ƒ,_å$‚溦%IŸjáó¬Ë—?DÂ]˜2JÚ«ì­¾Ñ~HÎf ?¯7 ̤Ü1ƒ&L v~¥ÉhamD49×hܽ[À Fe3´¦hóoü íñ£èߒ:g´¬ÿ} `1ŽáÔ6^Xèkg¿Iúcž‘)ýµ­:P¥ñOÑ}U½ÓßתÙE*0­ū¬ õOü߁j|ä}¡œ{œÛq¯¤ly*¬QہjáÛíÙwÃîÓÒGþŽ•…+S| Ys©iÎ/Ý°#Øx¶u‘Éüׂ.ÇoeB9<²8Š{üaH* ü»–'ЭùÅe5G ÚÛgŸ¶à…zôÉø?$÷‰v#ï5;ÒñÉ1YÊëôÂ0–f‘)©ÈîõšIlÀîØàPOd Ö +¡}ÒÌzþ-¢×=?Ƈ‘åý±“ÜØVqœ¸ò@@Ýd‘&~hŒàþA®ˆ×uôž½çoäÜИç)#¬jd²¥Ñ6× +×yWRÌ(À¹—È'ÕI¼æ°ˆ±s+W ÿ!ˆ‘–n–|2U½ó°ìˆ6»ã`}âét5¿™²N²ç.=ã3êþÚ¡DþîIIUßvž¯løíq—§Æ¿‚S%¢t OÅg©‚1b6ÿ÷—g êvV[Æ}·ëýSÒ­áô9ꚑٿÎJøK-⸅8y²Æ%¢F ‘Vȸ‘ýw硽{}HÒ(‰ù/KI¬êÁ®Íºç«œ„:}$º»k**y'ËkB*œ,¡šÜ¾Üq°¬”ºëºi7l‹p°˜H òɦt´°Á˜8 +§[QÓ^ZìN©3ƒŸ°jQj;.³à¨|ÎÞxÎhõS™·Üä×㛈È>ÅŸ»IÙ:çkxöÝF§×&©—2¦üÏLj-ùD¸dô‡4«xiçdiZÉï™-,% ›:ÁÃëä›äõ{h;·»a?P("2öˆ²UÜÒ 4A‡tѽè`/$ô·ð ß:ÒÁ’åó=“1šåÜøÉÌJ‹QKú Uæ?ûüZFš¤ÊU<ÎYÄŒFzç 'Þ¦Yza¦ú²JIyØS¾ø±sÍýLdL6Ç%¾Y"|xj+QDö…¡N›ú(ù•&ß0Õh»Réý×eÞ»–x¨g)p&‘´?ýI‘óqßèìeÄ|äÁ×TV£ÖÆ·j†êÞBVª…›ÐÊèy`UÈ¿èø¼BÅÔғÁî¥_‰¶¸x:—=Lö(yZ$¹+¦@3H®€t¶f@!°VfUAýKüðw ,ñ‚¼Î²xl…+¦ ÈsT¼ÓÞV۔IõÖ0Ýí. ÑúØ~xòË×Ò;Khm¾Ç›ÎoËÒ ܬÇî„RÙñ”ô³Ô^[Ǎ -Æ64©ésd›'Õò_3r}¸cyª}„v9Mád+{ ¢{ÏSlí¿í÷ -0Ÿ“¯bed¼@ö½ç­@Xý)™b&j÷ÔÕYÁ‰«L.ó ¬4î1@`è&¨8, 4µßò¸dE"%›Þŏ‡÷V8ðšŠ0«‚emró€côÞ1s˜Ç"ÌV¥aÉD–fXƒ†^lÙ^ð†¤Y`@ýp¶ß *$¿É–ðiôöo¹ ¸10Q‰¬^د8¿c³ ï"«±qàAÙñOkq¿D©³D:®v5?¼¿8k­‰¦®s'ž÷ôê#Øá=¹ÞÙ:5êœ?ÈÆWaFᯑL€I\*'2¡ä^£;/=³Zó7³-¾õT3œ|%zÉ9OO²“ü@<¦ì+ïœÍö¥·>Yt|W^ÙðÌ¡;­K]¼¾ÖòSÃç„|»º \joo¡•‡ÃÈa|SJÍï3[ÁŒú…(Ʊ$º¡…P=?cäÕ_WÑ×_´ËTš”ƒNNJM³Ë[þ¼Ž˜®ù‘ùZÑYyt”Mç¬Ïª‚’5¾Ýÿ,C¯þtâXÕÜ0wÝûE_+sf–/¨~NÐuHš,¦ÎÔÈ7<D\Æ|‹(x]h) Y/MÙuÎh:;g=ÃI"îý͹¨*äfVFéezÀTÀæu°àe¨G»I(2q³ÒBõf†&0h¸ý;ÐQœ”½Ðº ÷!è$4헨E}€ »@¾£B +=_4¡cðªxÁ:ôŽØ—yòf3e5½áÏÅ{z}×¾Ì{t™í®ñ,´_¶^Õþ;›$cà·id-°z£~Qã)Ül <$ù©Ê,…ö•´ù)‡iAL!¬g÷!²˜[˜ž‘ŸQOø›bŠt´«A؂õÑ>„¸û¶O'=Kù¦z[µÆ@oá¦g uÜ)¥0~¶ª¢þ¢8î{gã5có.!|ÜW–a‘À9©“bÁ¤£Ä"ÕÔªFü¦Í±+o¾9HKDÛãtɨüé„·??Uٟ¸Š¡nŠÔÔéDw$œ‡݊èßò²´À«‚/DáÂÁ‘ýÞ뮜Qd<1@6æ©<‡CҐ +Ãæ‡æÍfW(ÈàÖ×Bw4—˜þ¸¨㬃+×ZÉ&JèÚù;´’Žä º]Éå<{Ö6#ƒÔsòeïärÊc&"ñË!Ø.+€Œ4ßÙÒvÂØ×ýþ‹ƒ÷‹ –t¡%ñ$£úl–(ÄT²æ~ó^dwMªzÚ·œÌÈِ{É|ÈxÕ!=굪 êô0¿žüK0ÊÏaà­éÃý~ñ”œ"Gå¾f…›Ô*3bJ+Š‹^ôя-õÍæŸÒub°vpˆãÑä’dë¶9ðLï'víGë”Àú´(U›¾î%&P÷n>à¯Ì‰oG*‰Ç[ç,>bAãàÛuÅ‹.°<¼Ù«U +Ìö Gµ2økIöiæ›ÂÞJ¥+$~JC¥¤ õÏÙ=Á-­ÁÙ‚?¤6îvE´ÖµF5{jJ .»8BÊ{gš¬jËÙ-γ<]ŒÙQ&ƒì&xÐB`‰ ¨¼`©lì}mÜD*õéÄëˆþ4gÉ»—÷½.ÝÏ¡ã¦èƒU„Hhdä}áÒ:.ô±&ƒ8w]ý»Üì,èK6¯é”øSt Sg9ÐZ5`ú‘¢åّÒøgmd6CRЉ8‘úl ·¬æÜäôî6-Ù=Åv¸>ÕÊ#·àÁוhSÙ.¶ÐÚ7Á8½¬…qºÜ*¾¸>"‚nmçw­¥Ýc­–’®á¢–k‚„ØìHæÕ³Æ1pž X¥4û:×°Ìl3Z‘cÒðÒ§OÌ­4çP¤îáõ¾ìû nç¹)#˜}äêqßėRËЩ¬˜þÉ;(®Ä:Ø0 +¼(µ án;ԁPž.°Vfƒ²mÇ.â'p¢êÕ4“Ëìv^š5Ëä;5¯ªßÂÓ}È$O£cë͈Gñ‚+Ö%6ÊdE$üJçX\ýï*CŠ? ¡øOó…O‘ñK‘(Ƶѣ¢‚VËÀà*ÁÈÀ'Ì-±L5;Gî«š.Ÿí]B¯ï‘y‚dWGÆ¡KoÕÍR6k¢cr½õ\!/ì?nG‘I§jcJ‹:ùtš3qó!o9ùF´Œ6«+´ÚRÉuÀwé‡ÌНšbµÏufs’AÚ­ÁX…1|ãå?†šê)!úóŽ{0sxá´7Låì\önp¢Qú£o—OpâA…íÑìd+Û­c¼ö¹þÐÇκÓ6»U<»=lcw¬vݛ¨«Le™éÝ g)€g£¶áqíºåUŠƒY3sÄ'³å:Ž¡\Hptõò£¥÷Æx§Ÿ4S¾FÆîÖº6³E9—øC:ø×ÿ 1øÞRÓ¼Šs¸ìhE^ˍ1Õ0¢3wöF†ªVäª'/í‰&sÈ-¢6҂Lm‹F¾M¿jCŒÊ‹R³¨ù)7ä°9åîZÊß곙© ‡B'n:Q¶¾¨ŠÆ—Å’Ù'åÁJe§#¹Y4YoÚÔÏõÛ:b rJZ·µ‚‡!à ÃAÒ 8xDx¸¦A@W7Úܹ¨`1‹gnÕ¸Ÿ~ 5‹‡»ÃÔ~ªxý÷Æhj’7­Ô&akŸ]%‰§ì\¯öD•˜¹z £5p˜ú0j€úŚ®·ŠWŽÿ®—¹hø®Cî'Œñ\(}Þ-ê)h¸ÑN;×NÎ|• ђÑ¥‘R…9ULî#òé9T6çÍ^ +ëb瘅Yìè/5›+,¨`¨3'dw7M¹_ +VÌ$K3K)+Ä¿².1‡õ$r&j:¬Pu‰œÉdw¬og2½/é3ÿT¯©ÖC/ÊyÀì"ú$P-ÌÀëøÝ^+£`ŠÂµ>˜°ª¹“IV tXirc~º+¢]‰\Zé¯#Ã¥ælçØGK¿§p_yæoüñqâ 'UvZKÇ*`•kÝÕ®éXˆc ‡WZ÷2ÛU˜.iíO•A¼•]<k*ôšÌUÇzn)\0·”}é¨èæD—Åè7º8ú!ÎI%v²â)t _•…u ½REú¢KéWx0œ‰H‹o]Í~`´ÇTµ˜QÐ^š µ¢ÆÐ-h‰cÕsÁ™Cw "l+ü†l؊4BQ‹“cÏu¥vÚkœAXšPL{ˆRqu×£~؏Ž?džøå'nS¥Ï: +ÞÕMö@UsÅ­Ô»j¶;”¯€R?•]jä´::ïé$e¾£: /:É.°IíyÙ"^ðI—ˆv]Þ±ÂD‚ý²©UmÐ@ʵ¤nàŠ ö¸££“ ‚\•ÍØ.š=§w] p›v;À£(„j€vÒ¥`̋0ë.CsíãZÜ1 gÈx4'P»Ô-7ڞÅQ¹’Â,©½}&Ûö0ÊÝÚÂ( Bfئ¤5̯ÈB•Á‚ÿݨÙì<ˁ±ÚXL߯Ǩÿ4v¶„í ¬Ðˆ€›ãN¡-íeº;‚œÖwüŠnøpàR¸ú´9̙$8ŠÐPa\ÌèËò–r¡iÑ|ق«Ô¢JûnwfÕ&»‹Ê]Guy³\!Ñs)¡xÌÅ@Ոj÷}h?æ»?~8JÂlkñL島Ðb/–` êÍìa„õÐH¨ÝüàéÛ̼ñåKâ I’þ”ã?À—%';“Ë}"ûtá¼øùÉx¶5‹…â×yrEö\A¨÷þ%Çö¨U|őT +Ï䏁D¤_(Ö¿Ï4?=¹ »…ÕÙ71÷«O%¸>ÔÖòø¹Dei^>—ÚåV7çtÞÑzî[–Û= d¸þe")¿Ç:xµ|;¤gþ}Ñ LÿÎ;?(}6C•†rÞw44ymÏx¦1¾“‡><ôõ<-‚PôŠ™bà¿çOqcX¼sSäáâÁ¶t “¿ ³Ð8‡d9å-.Øø€Jè«S;ҘÃo5¾ ,M!fÓJ˜GÀc®&Ɵ³-Ò¹!Ø!m…X¡ˆ 1îòNž#ØÂåUŒŒ U4üϒ¡c°°Ýülã|ò†ö>zª¹i¹,~¦jÒ>„$aHtÆCdp×tL<¡Fè8¥|Ûvï¸Ü"P£«U3`“CØÖvtïŽË&}öS²3I™]JeYŠ97Ùq”ÓŽZØ«ÿ^&ØOM¼2Ócx`îTéîue²‘ÆáædbX‘<2ʐ»“¾Uû†Ûq—EØ 94k…ÂŃ:PÚӓ4ϱñ#:ã ;®5yü%ßÂÀGïñ­ÜÙdǛ…H%,Û\Œ”, ¼Q©V©ÇÉL ©4ö†é°XõHWŠ°°<Õ^›ÚÙ(B½[±[Éi¦Cî•C>iÃd«d<Ñy±U"³Cæëp/—…l“°`AôÍ&@ çVㆊX«†þœ»Q·ÊªÓ0(Xh}ƒloA‘´-þ „cm²ªâ6ߥô‰&Xe:’Tk®Ø¢¹‹å"Ô*vÃM×±myàz^®B$^½Œ‚¢ŽYÂ%Õ œD[hAN[,ÀÁ4žáê®ø×ÒÝ,›ïxáXÒCŒàÎðD!‚þX£|ª>_ʃi^.½ê"¡´¢Y #CÒ ÜÌÑ$âÆ Þ°ÏL(µº YzäñHjüŠõ@ŠEòþ=nÁͱê`äû›* Eù·IßtZÉ+Ñc6v÷ÎÍQ]‚Ñ5ÈҀu¼“RãÔÙà#i*Lþø†‘†G™T ܟÀ([‚¸¨ë;öK‡ífÁ­¨ÃX’ëÅ÷öð±‚âéx>ç„;¸6 ÈB§>C7ˆ< ôäöZ£yÙeXœ>k>à 3JöýøÌÿ¾X~Ò¿àU•·çSñÝZ±ƒñ¿¬ Ž}鎦;Ç32&”ÎC¬ ‚yÃ¥îÞ9øF9HAGr¦@v´ p_b‹ñ\V„ªß4à}yً޾ö®•¯ã={”# ×vJ|óŸÊ_QùSzC`âëà*¿ŠHº%1zÝÜ,†Í²•Ã‰*™2; xKœ^sU×U1mÄñ®e×|"¡ø* -+¹t|m¤¼AÑu(*]fÁÀ‡‘!FØ[—ùɔ¹†%ˆÿ!&9jôG©†,ds6ж +pÄ ï6tŒÊ »ß7U+,í«VçËÒφ‰Œ(”í+ÝÙê?A–Oǟñ¦v&9\šöÓø¡Ãa’±C³£ÏEÍV %ƒ‰ÞWæÞs$ºì½°q ×!ðó⩌09:)T~#MCëY„Ráü$ö&£âåÑÄ¡þ¸AŒւ™5BÁ"T¬„½»fŠ—œ“뜎)ÊDŠî«jŠà!–§ÿ}ïNÏÊaÏƋ§„ð¢-j{\E„èÏ¥‡žÌ “pßÎ8ìyõ,|?ªº7tß()÷.êÙò5×A©N Ì¹Âeö‘¾>ÁÜîÉBÖ=ÛºÈ8ݦñ +¥yh¬‹Áû{U[–!v¾L\=M©ëq¬ Hsºkl3d2N¾ÓááñfÃ'O|Ʊ)‰ìæÔW!ûíÑ̛§ 1mr±&@`k“6k¶³d–eE†7‚”üPW +û(R³¯r rÚ¬N8u„všgpO_즤\²TÓfc¶Ü§ÎýÖk5וgœsø&ÂOµ<I—'˜_Ën6^lب¸‡1[7ÑêxÄÙHCt?‡¥p˜oa‡·Lc]Ý F—¬ÏJÄBK´²Tš8^eD3-˜Ã£x‡z˜,ZˆUŽ|¼»÷J^ÞKí¶dïÉI&¶ú]’ôó/S˜¸—ÎÑ+™êk¢¹bù&{„©ß“UÄ\UW_îGÐ| >øͦiu›YhðLsX†¢5&¤CÏâRÜw~O Q|Ë +5 îDâ÷´CÎ ò›ø&¨º=ߔü.ë¯5˜7À§²0ø¾ +ô&Ԗ=Úx9ë<ª‚Y×ë8棼j0ácmBíüÓY3@ð+Xòü´ÚŽBí8Ox”×Ù2Ô®Á»‹®PëzWO™[gä@tPÕëEN‰<ž6ŠIۅ,’œ&„½6ÓÄQu•+øÈHóf@wM?Vе“EöÊ>X/Ò¡¥‹Å¸vöü¨Æ†ëÓ»”MJó ÒèEeÛM²•¡÷µqZñç ÅZa_ž•p-­î:|Ïk–ØX]‡ºdñQJ-IŸ§rŸœh€áÜ툂{¢mu¼Ê{]Õdi’ÏGðÞE9šqÓEùn–5ßâÌaÛíº`ò´âw ¸×,‡1WV;ž¯ã1ž¨ù¤ÛcÖóŸa7!S‰y%zÒÓŇ]ꄏ0ȂN°.múªr+3ö®ü!úç”N¸À~MˆËBëVWø`V`Ýˆ°;õ~yvÚf Y1ˆñ¢¹€\±;V›ôì绉‚£Ø[y­PŸ÷‘%ÖÓíùfvw ®*À¥\‚¹&¡¸ÿûg!WB<Â{Ã×-”o¶j¯FfU³üŽO1§OÂàÓ·_Ú˜úƒÚF9#¶«s´„‚ïý +ì÷ž‡ ôGfxÙ²ŒÂÖûùò²€{Áé#O)Øö‹‹e7Ù¯¾( ”_4ìÖÌE¯wO„ºßëv¨ ˆ£›…w°ºAÚ(¢ÞOŸpd׃#ìßÉÐt˜vŽ‡ýKä9Ï8©u„¢–ãÀGžÚ¢ïß[´a¼Ã_æÂÕínSª•ïp¡1P·¬ŽdI~O†ÉnÔeí •q¯Á kãmSØ]é{Ɠnü¬Ðm`0fý·zú°ðL›æó:¶Á'«üœ@=D²„ýzWØÌ àæØÀ”ú–˜6“ž1FŽB–n쎃L‹Û‚^¸vtzG¶7£gZ~ +ØUæ³ÛŽªk‘ÎËÇknÐtÜߦv]-?1Ϙ©Ÿù‰|ÊÚ|‰—føø­Kö‡¤Çhö±U b¥– ÔaR ˜ØijÞ»ö¸ãصFö³‰¦áX‡€yÂs[nOoƒ‘S§­8F¾ô¡¨C1²õá±£Üe 9°_6P +?ñ}oÃU¿H ÂASÈ2;"à ãÅ,ô"Ä»Ã+ž1pæî§õ3ð>bã2AͧùúËrxÊÙÃå*Øw…3¶cz%aq]3¡Û˜¥¡×ˆŽ{¬Ltȕ¿’ƒ—}Ö=àÁ•dЛµœÙ{5Œâ¢¥!œPÀã«2”Âûè/Aކã™à»i3Õ ÍøJU:Y<~ùUéä?ā~RñҔ&7T­i°s€;mað~Ⲑv8円”ý¡4Š &Y¿eÞ×»«iÛ„yÜh"ò¬ÖâF·\Íg‡C-àÏ*’VQ‚6ÀAñÿ +Â1[;ÌϏÇZ˺­îA"O۞”¶í£o҅ÊÒ2q \ ©&îD È^ÑŒ#†êŠ²µæ]Ç« Ò&xT¯â"À©ªÆ(ª>¥¨` +œ*»ãdYºàciÜ°oc +÷¬Žbæ ãÆÁ¯˜VµSª¥ º©*©kJCE#ÎZä}îëvm¬³BÚülñü4êb•]"ˆ7&Ò,C俎cêŽ0@ð#ê‡±&ßé2—ê~?¶aœ«Dyd&žƒçøÖúø~ýUÛÐ=…®ÉÔg?2r0Ës–WeÁáL#B*_?,xx¨Xæ +?]¹‚¯i´WãÓK‘Hw8Ö䜽sXÖÌ#‰¸¤äK¼©5V@…" {B $—ÔN(5_ysAé›Ë;g2³ ™¶ˆ“«”{"ò1~»!~!õÂ膄Ð$Q¶žà•ü/¹[UNDÕv4EÒd{3 F|w®ÝÆȘÇnna¾x@9« Z1¥ÃqÙoO ±)›b1ø»ß.V[Çw‘t82Wo8Aìm>¨ÄƔ|Àˆ{îŠlSyX *’_Šz¶ Ȧ ÙÌšJ2oâ„Ýø à½älI¡¶mR|Þw¡ÁÛ·˜Ï¯ñc-8ž§‡ò¨å ‰v°{ª_î?kWÚ0  ŒR1D%þÁÿ©¸?Y\šðº¢æÕÃcD"ü·…»ÁMä_÷3r‚@{{â:®Äox1wC¸ÊíUáB¸½θ\<û¡bŠõbMÛ¨í"ß åuꪻ/®éË>¸»W\pCôHI–Ü)2Y™n–e-”úÑàÄÕRçŀ@šɗ°åËIR¨Ô>Á(Êý »”]˜œG̞ P +ϟÎFÀjœ!Žàk‹>/S«=ÈÙë5Ô"{ïll85^fM+¿qIÒK¾Ô©A‹l4+;y^7{‰Åå +!ò]¡äŸTª€-`ÜBcM½¦sÖ÷S»Ôd®‚¡™@̂W›rå'™oDOnm8EÔb¯wfôi%þ(¢"‹4µø–Y1ЁÚîÊq1"箑”}·ÿ. °Éq_'Êh˜ãI¼ýÆòˆ—8hûÐ? ÝO”øáM‘»ôŠuÙAŠÂÁÑÓê®:G™*%ù1àD^¼ÿ)%YàêÐÀr× ^l©ÏþD|GnNàª< +AwxHvNÒ¿ùé°Lm]­°ßæyN—,€†N¤ÇÚÁ†·Gú+µC¬`šD¤ÎŸ0U&-5áóóÏn,ÅråÛÀlŽžh÷%œèñ7MяrˆŒù¦¨ô-[;x½ Úιν¸Ø¨i5U6;ðƒG!лs×HfE +q¡ 8OÉ/i/ì§ÞYPǘ¨Þ3ü¶éP§&½n”Lo¨!U^·ö‡ðUlyÓýÍè÷å_Õ"ýə=ŠAõD¦áCF(» ©2SlvÛºëä°|Kºô&ìÇ××;„YRRé·ãԏ1á6Í#i6aÆ©‰Ó'6içcÙê̝a£¥jÕÁuÉ5ÁÙlñl¿ôâVWº•«˜'ÝsÈì¹e}“MýNRôeÙ¦Øgý^t"vê3ɪ_+§ XýHz&dÚ0T; Œ¤`8}!Gê4)k,¸G*‘MÓç¦1êqoC¦5:¿º +ÀT£X Ðëvý˜4Ž€3E}ÿ})+¯¯ø#Ýug'‰¶N&¡!þ4LSãÞNS„4p‘dN¨·hk®ŸbúuÄÙÄ/% ™LTw)°ëÛeþë=™ß/hãȜìfiçuÝa‚¯Òñ(o°þ«°¾ÎM4‚NsnÓÇh.6W‡.Žeï䫉 H{ÜÜ ´'!oÌP..Oûi ±S¹vñeŠû +ý…tMÜefFœ´ä6fÝÂL\T#S+.6_¥<6ä·uî„áZЋ½ŽCÇ;˜ðò×Á#0¿·Ç{7øRí^¸óӔÔõ[kúM¶/#eÈ"7é‘L²ºN®Q±kÈi„`éHŠoEýéŒ=¡é<èé÷‹2½ÝͧU¶Ö§ B¿h¾¬µQ¿‘+tþ +u®PŒ0FpÞK­è4#µ ^-€­¥¨l…ß!´º¡¹0%JA²f@æÎPÚÃñåKDgSõdìÊQ9Y·èÓð¤M5Óµ=ÖÝq;7F=uG+o®?Ìõüڐôq+æ×¼²väìWR“tÜÎÝFͼí C3޳͛Ê–t‘+f<„•SЧ/Þ¢˜§#§">TZz‡N¤PÅùcœÒJÉðdšáá]h~QØdÏ÷1$Ãl'p½ècÊçïÖUìøH.R#ó2ˆ… ^k?ªqÀaßt9_ñU£ˆAìÅ>"ö〳hm€æ^—d«ë‚ ^¬Æ‰„@ö(?Òé]¿\ ůP:ÓÕ”ÿÀTçù•eöqØ"* MóÅÇ :@N™}<`3¼Ÿcœ ÈÕGï¥Ð)d„N=œçÎ/V"¥ä bÆ7E'#¼*Oc«©bǨç"$ÑýȔ¤q÷¼d’º§z*úY¼%þ'lìQ~‹9ìƔ§UöA¨æe'8TÎËlŸ.(¿Xr‰v0è Jýj5j]PÍTºÚgÔ¢R±àyRÚ籦^Í'ö©)§å’Æ©„Ou3 Aè»áÞóg' +ѝ+/ÕI»Ñ…‚ö")Öª‡¹¨í?"]B…®kÁz«Ñ&77ukŽÙŽ·qè:0ˆ±ü×Hs­òڅS‰n5ð«)¤ï!|¿šî]òK×£– ’j¤Kj,g…™_ºuƒïn˜bÏÑ… k·}5´²uÄÏ^…­Ò{äAÙ¾èµ Mßß÷e¸õR[Ð_`JºŠ@Ê³œ¼ÎD Ê¿“MÊ;O¶Ü\ÏÞܨ¹Ž~JwU‡Õ…ð`Ô½â6Àó„yQˆ£Žá·W]'_PáÇkùtŸ½ ý,8’Žë¸wÍ&3,ÉÖ §l=,¡cÁ…Û'¤˜êܭړÔyW1+­*ùÉõ?]0Ý÷$¨-¥¢°FŌHæâcX]­''kÜ0PA[ª%›hÓú6ÉsºÁÍx7jrÏ9Á™V/Ñ&™X$?–QaÔKÌHRU˜ÕqYGT1…'âç?öÎ*öv“O;Y›-xB*VÂñx¸nÿL…¹ë_¢RHžœÎmËU1èeZp‚Q¼”’&u×ojò7Ÿp0¾BÐè³íÄA dú÷ј£ëìN²R* ‹øŠ6]Ú?tÜV¯íÆo—ûµ½f퉦-û/bŽàC}Nh†°Z=_­ÉÏÒ«Zä Ké^ASy6/§eoFµ¢€°‰ÅN#¨4é­Ô—ƒ<ÈCæÏI£³(D!UÑS¤ì¤¥À§8_:úê¨ê¦âÛ{kFtðâ¸Qa1õiA‹vց•Ã0ÛSÉH½ä][Y†-o¶ÿàdI胁¢ä%º +­6˒º*8îMö¶R¯¤ØYn"æ_rÙ±»Xcƒ‚%ï þÁ$‹Š¦k! ·þÏÖyU‚Ýýÿ¥b·Í¼¡ã²+%UiÅv¥«Šew@äº"VÜDaÇ£¨¢uqЭÄïƒq“Œ¹j¿ÊÞ°Èw|{Ñ5áïÞ:gx.cS{§´#Ô2ê^–ÅMìíJÀ`Z +\Õ?¢øB`ÊÖÌxV¹wZ»¨½ð óÊž&: q˜ ºÎ½ãp½À]Až­®r}a󀿢âڜÑBoþò¼_Ö?¾ [yú¹"%S©§—U°(È8 ³sîÅQŸfuA÷¤r~1~¡ØQiy`Ä(?±Ñ®ÑÄ ˜æ߯$f*äÚ¬ý“¥æy=ëGiÚ;ežÎ°ŒÎíOªéðh)pôà{©£hò¶ä_"+\eSXC(=æ?æÕ)fFøz¤}ÄO&ôëçÞßʔ_ElT°)æM†¬¾rcüì9F G¶@#ë VˆN:˜§¤‘D Øú³ñFÛ§Íï!ÆRAÇaضm—FHëÌì´ló—ÌýÈùïñéÃ'Û +-~8‰ñ ʘ^‘¥'V;ÓÁõ¼¯ç͊’NlaO“|vˆñîI4:0_8%¶\¦PñƒAÏ%SQѦðU:.XÝÝÉ jý²K„\‚¼ýµ€†÷UE'ã”kž«2?8éó€Hwýu‹b÷ØÏ#z¢ƒG®Ußܬ÷ý3wב>!­“¯\¶~ƒ^?ÊÚ~ÕúЏdñ%øHt¢ûƒPtS®~îB–Þjy,£Þä]ÐHƒŠa–~™M7RôŸ$œŽ3–ìê,Ó6P³ÙwNÓÝ/Œb|7Œ´ÛLi±´Ð©€±àêÄê›_ Dö¨Sû@pÚâe„:³­Ö›F4•Þ¸ Ó¸ÐwfVÍ — ´ko€PúRêñ”Õ»lò‰ò|PZ +­‘ªÐÿýƂ¥7y‘ù +ÀŽÒ$çIÓk ]ÏÕ{î¿MޙÚ6ZAv¦?Ò£uùnŠHºÈL¥'2Ãԟ*Ô-¯÷Ø ?ïeMe‡ NÎ +´ÛöéÒù|üSSšøP oLÉÐTRØ[í7[ÛA÷–¢¸£(gᦁA}ys´V·ùÐtŸ ÎÓV¼=5a¾&‰ºÚ¹¸Õ t±Ã~à ±Œ–ó¸ZîÇ˨A`ø’jÏ$ŠÎ&?qÊñðè¤Uˆ•bÊcWC¹ýTŒ®!rÆ#õú]  +Lò᳓:¨¦n͉»í 0ǃe–VNG4¸$Ì5`ÜPÕˆ}\OO,·ò¬xÆ5+ŽŽ$eÙBèÚᑶæèVÃÙØÊ4é~¤i¾gû÷¨D9ù½Çôw©@ó\æ‰*ßÐ1±ÂVo“ЅÈr ÄKÎ/…ÛžpLˑѢyÑ +|ÑzýˇŽ ™ÂleíPy³FÙ[~!µÚXÝzlñw‰D²¡0P•MO‹¼Ùæ—é;O%ÛG5°4̪ +.R•ƒ×Bí£:îw+¶Pd>úðS¯ »+Ì/7ë.T;(Itß³t3üž½èuŽ Çœq¨­«ª•háò³ÜU0oß ,¶®dU©#4ñ›ÚÕz,BénMzÍ>ùT~73Ÿr=#5(ÃyùÖz§¯¼c}ùVâ_ó>CßK< íi¢„/ü@ë¯Æ6à0¶zÝI܁ޏnSÅa9ô¹Sd!2x@ézÐÀ‹qq$ód-qïžn…=Ì¥ÁiT^_òt¯ÙÌ¥4pJë† 2Ç×é{qbôëÁ!Jµ­ÕÃ\•,ݕ—!¾ý‰’îýµ…v Ü y-òۃNR6cÿšè_ÀWÆ#M퍇ðD›4J¥=eåsÛDªß‰ô¹­'šð;>{ÀÓq•8Ðå%Ò[ôò¬(7³ñh…(Ÿê9‡g¿•©¿¤æô˖µ{¥×B;ã†Ã9‘’C‰íúlž$Ò)#¾Gþ‹¼9†ú)†å’igm­ÁË|R·¶ÔpBN`%;ܝ)f^kG'ºLh Ô@þ11Ë|úr0á=x‰ã\{QpŸF1܅ì­w„åõ‹þõšc‹s‚BÓêjÖIӟkýQG*šyÍFiÝÿº‰ËSGH­¯4|xÿS>hco£Áòo¨ëŠ‹&„[{÷©d!¼ºvkX_Š¨í0PZijQ·ŸÏD¨-`ø1kuFAÁÜs5¡MÊÉl•³©rv8Þ{>1ô_ïÍvõS[€iýiWP8Ú×Â0‚™@¹ÞÔmn^ŸkOöKy—±)üš?Ñ­¤C×ôº¤ø:­5löyØÏ®‹ÓÖXnýÙCÍGŒÛÖk¥ðª{ÆÈ"ï™6´ñãóŸð¯¯¬½eõwN·mÍ*¡°ÒÛúG@„VʹžK‰V˄‰]­}t¸-JNbr*5U©[Fžßiˆ,£ +q×¼,Vd•Û¡Ïr+t6WáÉ·ðv\â±ÝC¤F7g¿Rcqr3ê²!:2²¹FaW½é¦RHóûôÜ 5¦`6Ô³Ü%g¶W;è̍KùQœ§\â­í +endstream +endobj +2879 0 obj << +/Type /FontDescriptor +/FontName /RKUQFJ+NimbusMonL-Regu +/Flags 4 +/FontBBox [-12 -237 650 811] +/Ascent 625 +/CapHeight 557 +/Descent -147 +/ItalicAngle 0 +/StemV 41 +/XHeight 426 +/CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/R/S/T/U/V/W/X/Y/Z/a/ampersand/b/bracketleft/bracketright/c/colon/comma/d/e/equal/exclam/f/five/g/greater/h/hyphen/i/j/k/l/less/m/n/numbersign/o/one/p/parenleft/parenright/period/q/quotedbl/quoteleft/quoteright/r/s/semicolon/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) +/FontFile 2878 0 R +>> endobj +2880 0 obj << +/Length1 1630 +/Length2 7267 +/Length3 0 +/Length 8102 +/Filter /FlateDecode +>> +stream +xÚ­VeXܶ¦AJi$‘î.%¤»»f`†în¥¥G@%•¤»[¥C@@ºC¼èwÏ9÷ùîùuïù1óÌ^ïZïŠwíý “Ž>œ=̤ƒzððòK´À®vžMTƒGäè©mî|y8ÈÖ ƒ*Øz€$Æ {€HHHà³äan¾p°£“€ÝPϘƒ‹‹û_–ß.;ß w‘°#Àz÷à ¹¹‚ wÿç@}àá8€! €¼¶Ž©ª–2€]YË  ‚‚඀Žç]+@€‚"@ùë öàß­!xï¸ä[ ߅|€ ·ß7À w#w¿`Àn õ¸› †!žö¿ ¸³;Àþä‡Ýy¸Þawd:0„»yî²ê((ýU§‡“­ÇïÜð €9ÜyÚÀž¿[úƒÝÑÜ¡¶`(àòñøË°#Ü ¶¾w¹ïÈÜàà?ex"ÀPÇUÀ €ƒmáöqGsÇý{:ÿêð?º·usƒøþ‰†ýñúg `âÀ‹/ x—èq—Û Åçû½,ªP@€ÿ/»½§Û?0/üπØï Ç]¶ö0(Ä`rÀçӂyÜ¥°ÿßTæýωüø?"ðDÞÿŸ¸×è\âÿï}þ;µ’'¢eëz·=2€»WÐü~g ¶pÀï·ÆÝô¿Âl]ÁßøwGcÐ_Åþ7ßßaUÛ»¡ÈAï„áäåÿË F(}@ö:` ÀÁr7³?vC¨=CAwÚþë]?ÿß0'0Ðú[‘¿ ÔþïåßÉõ§x>5mSEy®÷ÂþñÔ¹Û_7à¿ÓkÂìÿyøÍóìÌàÏ#*àˆ‰ ÄÿMÆ?4ÿ:kÚzÀÁ>s~^~~ÀÝ÷?>ÿ:YþF +„ÙÿÞ}[¨ýݲýÓðzÂáwÿ¹ÿwMÿãügíA ÿë (᜙“åQEõªgHÁ¼£M³'Ò­¸ÆàMaH¬583fY¢Üæ¦2’·vDò¶ÑwzÛíç75Îõ¾6J[ëKÐ^] 3G{!É+JŒk=ŒÏª˜(kÇ8ÁJc ËL”ßh}eHWϪè‡~%ÇÛ?çaö* !|æFÌøHÑü ´êõökê÷ó3¶®þޞîÖCìöo´\ÈÄ{,R^XD¬ñ!îHZ3ÃrÿX®5ŒêuÆí)¯DmIö”.Ó#(‡C3§Êòu] ŽDƒš‘¹êb˜EéŸô6ñŠ¬Nóœ)P9ÔrÇq•~]«,ùþtÎäõ±ï\²ë#¥šŠ¥?ñdD03~i¯ÎRæÕaœþÌùéXæэZ‹·L¦^S(M ¹¦¢U×õÛ]‘5 +‹åX®²8M³uãö7KíuꉨŽwZd;éØîbˆßÀ€m,ûV=ÁCÄBŠIG#ZÜR%6ƒQÁøÌ·ò7EiÍLgÏ¡±³Ší£õÇÕ!ÌÞT¶/¤ŽRôÃ՜³í$ó©²·ýË¢Jó4x–5ìs¥ðüÀW“'+Ó_}›CxOX³ˆGˆsœÔ”÷“’=—#F&«U>þìu †Z §­nõ’á Ë\–œYcÌtÆñÍ¡=©iǵ/‘äç3+,M×9|}A¹ãÙ{3dܲTÙò/ð&Î7¶‚ µÑw¸_KW²E%W·ûnÎu€§p֎ k>OÜÃ>î¼G6*ºKÄÆx¶pwa£.0ˆÛ˜w>üë#³´‰D?–{¥™È‘“èØ,³u³fT¥*®l×^X;¢Vð[MÌ×·õ•lpy8MÀÈ@âþ‘1a˜þh¿ÙFlêëí“óp/¼[HòÍc{E»ý#>†ù'dÐuu³éCÞfF½ÒL­å¶ãd°ɐó¤ô¢IJ¼i‰ç¬êgR­i/ړmÎ÷a¹ž6IÓÇUÙܬZ_’ˆ¨¾Úá%À«7­{Ÿ,w‹ÕõúvŠIV‡÷rö°qÑa^ºr‘&Sz›bZo3ª´–%¦8*L5ücòX`púûiÕk$â4CQc‘¤Rú$ìI +'ÂcR´š¥uQ!½Â©ÊJ£ãëS–Ñ•¾½G̓¾açûF {ƒ_?[°T/F߯Sž1n$‘ÉÊمÏ•196sˆïö’ë- F•¹Í +#KÔëÕÙfý¿ˆ²Û¤õ^tgN°> +.i÷i'J*Où«ÐÇh2rÐ[î‰ ó© '¾Ãµï½²Qbš´n–¶]\½­áL/'|À{èãà“sùaʾƒ¢ô4^rIÖû‰¢ æî<îÍæ¹/ù”àV1ZO¶Lü]R )–BÀµ¢‹nîÁ'™ ýº£'Ç4¶fµ¢¤`O§m¢ð…Ï+_d*øGO+ûŠF‚—½Ü[|VËib™4p÷§ *¿¦Ü¼;d<,í=Yèr{uh¡ÿÓ¤…“2DM5ãýíÆòýˆ‹G­a±Ùß'r„‹ðéϝŸèMH…ˆœ…CSÅ/fZ:ëŸXeeµ¹#‰ÈèYÙ‰T„Ñ4åOm(V«},úG¨Þ¶ –ý ꎑϪõÒ南³ÉHÃ曲$vñҊ:¸E0ÆÞ«6 ˆ +×åÙô*]8SV¸ØV:ðox³Ìvó2Ô ?„%jã{Å™iE{~0CœÞæR»Rå‡ÁO~’øƒ¯³ë).Ø寅ï‘l(«ˆD!Ê +ÿ–˜è pküx[ÁIÄô‰b™ûÃÉz=Æ©E"ýjYùִgÁÐCjVî‰Iô°Zœùº,ø¯fcJU†›ÖBüñÚ³y[¯ª+¤LÍ_ºëö„­bdþWÌ6Þ.îý•Qåt ƒ¹“?R„æ2NßÜӞÀñQ›Üú 1—­wÑَÇõI¤iEW,ŒöE$¡­òõ|º„%Q£Yè;Æ3Š¤×öÕÖ䧂ki#N lÚĂ(܇ºrÝa·±ÈïŠF!‘^ +BÊâ£Ï«V3ÞÝ(ÏÏvY§Œ§}G–!ÖTÌüxôÀ”FqòÙp풭w½jHEMV‡|ÎK€ä4¡ øÐç#ö6i!FÔ Ùޖµ-%e³hcäé‡ÚɐC`YS[µŒµe –Ú‹HæP,®l$Îø\á`+ÀˆÈ››üv’ÓõÁK»gÞjÄ õ6@Âc Ä=J»‡Oª›䛮"ŠÔ9_^W‹Üºé-¤Î Â~tˆs8Œ­[«Ô:¦+S ×V«6n½Ì°žYaÕ¿]|©gúú‡‰òäJÅP÷Ü×t:9“¢4.v·Iï×ç#2®ÆLµêñ‚jߜs9¿Ÿ²žö}Ä՛x\¯¯æ9¹êM8ýw퉪KæÙù{ð÷)ü&Ø|üNZXÆJv·H…¾y_‰<~cü<å¬äÄä ˤLh££„F2áö¯–nÞgï ʧñï?âKfm&L¸×¹A¶œú(ʇ]R`ëú }ÄÙ9©L™¦AjÊYœ §×óø-_PIó­ñº[c½A·Šxaå^¥ÿ»84&Ãl"w3–Î%+3öáÉlû#¦Ô­"*{ßný/y­É³5Â`.§PǨ÷òúÉ z +¦'G쉪gQP¡i#³íŽq×ù÷Óª”š½gÁÀâÐ>ùð‹¬öŽÐ'ôW({‹F¸ }@B܃ËHôâ‹sìØ°üª2ªñ4»Ö5R–¢L-±$-P—-âš-&½!¸§Hå&Oàû{SÆ,— ‹Ö…_é p)„=›¥Þz„•z´Ã@Ss">`\8•QGÀdÄÁõ¼*<ËQ†¨×švî;Î:-‡²f‡Á5j>=ëù>o ËŠsï]Û1±§cJ?üõrIæt‰#Ú\’½š$§ðçI6€c·¢°ÿé±Ýæ%mÁzkfÆÊûµ&ÇTÓ{Ø,*“o_õô”{8I|Ÿ&õ¸-QQ¥‘J($Ī;Á`¡T5¿§0[§÷h€ +âð¯¸ï5Y ôd,¡·¤--¼’/kˆ’ÛösvÀLô£šm͉¾ÝUN!ƒš”l¤O±HùDíDä½.3W ‡S**—FØ恾“ه/ÂôãÎp +Ö?1y‚2Nƒ³~Íî¿eB5ˆ 9,óíæVU| ‘xþ*SêóÈ$¤¯ /Û l@¿pôá.]ò§±ýª5á ¥oº¾cD£°ùÏê%åÚóÅ[Â×æBOÙ)Û¸ów(·žÅQÅqrbÞti˜=9ôšXš ï%C1&m4³xŒ—®IkRL8óDZ!À“Ô{Dó´`ŠVåQt¨”äøÛ¶Xô‘ æ(QCñâãÞóñJQûƒGÍÙÌ2g>›,ސº@kÁoèÞäæ´áҊ ‘«CI`p§ìV¸2Äás³ý¨Ëã´9d*ÇûU š4z~|Tëõü֕O¿Òq-zÌ$Ûó+•¸Ì/…G-Hƒ@hÆûè3þÍÈXc¬ô°W1C{ Ôêu~¸ã,M{KêùÕáo ¦ÔZËÏðyפ4k¢0`"mè^Ë Œžbäùòµ6 çÞÐææÀ/a’+Wò6š†t‰ >J>Ëæy9©˜®ýÛô½Oô«VïŽfJ¥Í“Zðv²˜q­G9p¿¥=Ñ;;"âÅ7üŠ÷†O ÷•ÚF……×{¿Å©Õ‹×ÓN¼’_Ý‘Þ ÍS©›_ +e7"†å®=Û¥£æ`ó¼+Ö_ §ëÞ­Ô¸÷Bêüqi®ë:™)ó^έ–°,3 hÄýP UŠ0ÅkT%#YŠbû.·|ñ²T>5@ÃћÛ䙼T×x£Q©ˆíðHŒjü O™£9%åþ"\o¥}bÏÀ­)ìJÖxÅGKÝêÔe:~èðXñeŽÌ~¤wötӈ棇b. Yê*•WʍÉÍ#óû1]\O8UÁd5SPJÐS®çäÁöªBé®»Qòa‰cp±/<Ž<[Ù \ºøp25ÝìUÛeíknÀE[kX‚%r„çß¼+aá¦TdH°Ëa%¥úedòÔä6* +ãqQ™@{6"/QÜ\Üå8ý`e‹ºÉ”LИBÆÉo¡¥exÄRWÁV,sð,úæešf]NV2îLðy_f®.O¾ÃÌLÃ`§Ø+Ú¥xÚZ®L|òú•Õ‡ëý¹gœ7ˆh˜Æ0oŠQm;È§†Ô*8éÇËÖJñüfÍo¡¿ð3>ô‚Ù>{–…‘cü¸!‘XÍJrg]Õâ¬Þòûd›Fse9gòà?34ú¡‰»aƒÕ"îè;jíSW³R‘w™ßÉÅg$ÙV›9¸ûˆEC'?*Õ; +LRi¬´Õ&×$—¤†@Q½”ZõùŠÛr[¹ ÛÏßÖ®[þ@‹µ»ÚˆŽ{½ýî~µ‘ïX…]ÙFlìóFýþž¤m*áÇ-Ö}È¿£úàŸp³fÆZuíBDå¶>Ë Ûbø8?ÖwByV¬LÛÂÓµÑÑæÏŽy#ŽL†-¼Î¢öþnãàÜPÑÄ0,½Šg{>ð˜ÜNZÕ ¢™ 4™VÀȵZyZ¼}R]Ø¢xtgIò3ám6óY¢Lُ ˇU[[Æ·œõf”˜OlèmùæN1Ðë§Èܨ÷pŠ—ÕÕËvl9‰ò½d‘EˆÏMŽÓ‚@Ôtø¦(‰$%èo\"‹` rĘɊv—QûÀYÑ°‚b¢:ú\jb œ‰ŸKAz?¯^à2°>iL}λ…‘3bÌ/ï~·r´Ú¾Ð2tá  ÂËû÷¦i WܞÊEQî{ì¡Îý­Rá©x!†fȤŸŸ™äÓPsŽ#rŒ®PƆ÷ç¿\8!®EèÈñ> V’3¹8zþ@žLòÈ ç_={¨íŠd–'&³ºDÎfÒ°aY©§!Ðç +õ—SškøV#]+–±¾,¶ ¼{SBy’_˜°ç¤×¤rN ÄZ;k‰¿:UĞñ`®dBo $`•ˆëéxюρuµD +_θwc, “îji2âž>4cܜ“Í5kárÞØÅO¢?B|ßïµë²Xå€lÀšB ­ï_Ó>ýf»Ð+¨,=€uß Äk¡—s‘ý[@ $ë…/³ÿ;©øji#îSlƒ‚¾%U£i¡å|ǀ'h²Nj8µƒyW§C†ÔJ +nkzÃbýÀWÚ +”6Œ³kš_E”!PR<¨k´<°¼8!›^¤ñ³V¡"¯4D"+¿­8؇Rç”ᶡUF}Ë-k¯a¢¹±Ÿ®c“8Û'ÆØDñb‡µËHeJ½:e¥Ð÷W S¾‚Z0¬ý2È]ÑAþý›ÕŠÉ¦Â¸Ëà%žóÓù¯ŸöpÓ¬†{M‘.ѝΈ|±—Zþ-˜¬ºFõ¤~}Žº¾¥ŸbXó¾ÿ½müÇÌëÂñM?ÿx'ä*Agi)ƒ*¡6‹¯Ó›¶%èb×&Ïî¡w.†¯Û '0ŸyŠtÐ\èÊ5_1JÃ)t*¨BñøÝz|âõ}yÌg[…¯~…®çãå7Eæ,—\5T´ÙП~¬v'¬Ë¬DÎ Þ&ÎZ#®ÓÈÇ;¶RQ“<ðïr.޳ˋ,÷5éÏZ•Î…d/ÐLg¯”’t5ªüyKƒ‹¸ûó}2ÂÉ<®eHõØCå(+š(Mî±{ÇQ=üùøqm’2ð¸Lï8€9CúYe‰;>+&ù&JÔWýröð O‰L;Á æu¨A8¯ˆã¢Ñã7ƒ¢éøêFärÀÌԆë†BbìßìdM-KxN?c[ NbÅ£÷çGN•_³ëÔH+|ºš=¼Zç-üeµEŠ%ìb£7™C©9$]è컖–÷s2b~ÊG¦Ê5¼Œ—?+[¦îÇbîˆViàÅõp•GsÚ#EfC$¤‡%y0pú4”•MÓ[™¦É lI(¡ÆFÒƒø…uUàՈšñ%ˆŠÔ0€¤AÈÚÅl*W®GL´ŒgNþ±ì±±íÚÆsK #íæBIBjÒ3ö„HqÒòÍ]’œêú~Z켉˜.¦<ÝÚÓ*Ä1[-´ëilTÂяîiÙu!GÕ8,gôídQœ?*SȽѨsZ2°:z¶ìôiâ„E&ä䐥ØW'”7ù_„!P6«&f6‹otd“5igÕ|ˆå(ø‡  Ü¤ïïÐ ,sJğà3ì;˜íÀÑQûú7”ô 6ÃêÎ÷3Ñ õ O™ˆ +BŸx‹¸§ß +f"ë÷nHÑC§¶Cþ¦Úù+|JãtħœAÖT׽훯Cô›~ + ãe!Î<Ç]¡9‰Xýéؾz1씯Ax©·M”+ç5ýîºëyœ +®¼qu͕!9üLV¦3g o4)®æÌó*:’×€ŽFò—†qUÓC—¥Ëú§;¸‡ÃoåË«—M±A*‚]R‹DŸ"XœÎPñ»œ6 ¿HêM’ŠáíE—ŒÒzèŒ+Ðg§8ïtÈ|¡ˆ«Ø¹¸Ç©ýéeá¾òåkˆ¶Åµ÷€Ï{Ôô2Â<«hK«Ó³W#^ A6;I‹ãD•vËôP.ÑípG¥¬Rp$Ÿ­ä"^º‘RåEǀÁ—I©ÛÐBž-›ˆÏÔYœ^ß¥Å›Ö?`ˆw϶i£;§¬ó>RãE5 +à 1×¼€­ß¦ôù+R¶x¶™ÎýdÒ¾¼U¤"i>ÄdÄo{6’Z²©&[þth>ë•D}Fè‡ðok „¥˜“©óo>G¹.Ÿ²´$e ¾R§'’¥D1Ãë¤U©U^Ùљõ_Rîh†é6>MÔÖ2[²ÁOùô3›ó8]‰¥.JªêOHýˆÂ|KONÈq´ãåÌb>ë홾(RÕí#u“xïÒ‰‡fœ¾ñJ—§í#”¬§0aоŸx!‹Ð…6CWyÌ(#oFýªFQîîÈ-´ý©NAFÓãÚb˜É&¤ÿÑá~ãµK·Ê¡ûæÜ£IÂì^p«ót¼‡-Y¹‡¥ó­K©;eS¤°’åzVÙ¶-’ìŸn±¸\°q6ïl2¡uç<Ÿì×[ëVEåPىiÖvX=¤åYt^Ú{23ÿÎá{±§^*ä ÒØ-Ö± åãB÷ÇO¾àùµCóÞUá.’æ®T@¯‚7³Ê(¢ú‰­± fZNìžÊªú$ô» À9^ 'ÝÒúü É¢¡î¦ÉNÖçAü«ù&{¯Þ€!{ Lù™¶¶®)¯µ1Mþ¤Þ³‡èÚߋ#_ŸÁ®Üé†íÅñ +¨¼Í·Ø©¬«åÄ®XùZ˜¡é„‡”¼yÀFu\Un&À|Yëeõ¬R«¯Ëíqàk™¶ E>¨‹i_ïîÞOGûŸ¼5“uSð/|Î yÜ7%÷C#FAã2×xîÆ­X¯3ßn^Ú¤‹æA@Ã;tßÁ.ÕMRy;£pøè¾'q§HN}‹óÇÀ™ó—sl2 ¾q6 Ã:È¡ê5ǽ¡÷ 3=IèfÂPk/¶üJZíCkåÍ8Ïms.ÐUÙ}mò)* Óz–¶l›Ÿ]r@ü¾&múì”øƇû\üàA¿ñg鯞MFl¬$Žml£»sîàUPä=«TbëØ1ÇÙS–P;9òGÏðtžr¾Ôº4âÃ÷´9RGu~¨7ÿX/[_AK˜ÊgÖèa#‹#³X›…U—$ùÃۆò ðkº¶_em³;šÆbhd³”ÿŒ~aA™›Ù= «œsèN|ÏÜ6˜Kže¾oFV¸òÒmÝi¥ÿ\U+¬±IcÌ雷Gïí¯…&ÑÜêçIò×É7âW’r}ۆ˯€Rž2cµ >PîîÑGxºÿ +œ‰®ÖÎ玷ҚԀð˜ôsöõˆïø©–vp\R÷ \í)¹lm¿™Qº´¢£i­Ëœ¼ƒîp#=csm™…®´Á!ˆöºo}K?ÐÓ· –zIÖB!õb$´¡Èý×?Z࣭f'_ÙÏl؊ÂâÈ÷U'+kŸ£óáó¼éÐ^J#×ê<"ؐxLt«tÓ™Ú?û$÷#!u&ñceçÀj/X LJo´t[üBQºû?Ÿ"ˆ¸ +bʦ[Im¥ ~ƒ&1|PÁÝž1ÖÒñÄαÑSʦZ<èXÉttHV‚ldJzCRO•„èyqyâÆ*͟PÿT=Û[Ç°§ïWÅJíÃm|è7ç;†e/d5°RŸ]ëñ{÷ô範¿ÈNÛîX‹|ô%OyÊç–*¦Ò+‘B­Î–¾D«=ꁉdÚZ÷é}õ¢ì+Ê\2ÁŒò„ÕjC´J ÞØD +õeÜ¢ºÑu^7:>O¢ÅNSt¥¥«t°åS‡0¸<>ay쏆<ð€ç ‹Í·)X¸ÆNFù&Ð6Dïg–¬ŠqôRåýŒ»ÊD64>ì|e±Õk[%{Xg¿YÔ&eÀ­ñÜ&úâs˕·Û›‹7åso ýçÃz”Ì—¹ºðYü4¢§aPFL÷nقÔÙXÔꍄ¹ÁßQ‹K@ºlbbš561"PÙ|x(­3Ì{hpŸ¿^«2•§ñ½>oÆ Jkú ƒá/t?R3úº˜ÀÔ׋¢‰ø¬¥2ŠMðˈ +›MÆÎýþ Ìe¼³Ÿõ^PÚTÛæŒN?ö%TJ¢ö„8Ò[¾æ{m·ÆNO«¦‡u씳טòÉÁãJŸ9gðˆŽÎŸ-‰n‹`–HZ]mƒñcËàc©wª¡%ÏE4Q·ˆ³(cb“.j&ù¶Uåù_ÿYZÍ +endstream +endobj +2881 0 obj << +/Type /FontDescriptor +/FontName /JOTYEC+NimbusMonL-ReguObli +/Flags 4 +/FontBBox [-61 -237 774 811] +/Ascent 625 +/CapHeight 557 +/Descent -147 +/ItalicAngle -12 +/StemV 43 +/XHeight 426 +/CharSet (/a/b/d/e/f/g/h/i/l/m/n/o/p/period/quoteright/r/s/t/u/v/w/y) +/FontFile 2880 0 R +>> endobj +2882 0 obj << +/Length1 1626 +/Length2 16490 +/Length3 0 +/Length 17342 +/Filter /FlateDecode +>> +stream +xÚ¬·ctfíÖ&³bû‰m'•TlÛ¶mÛ¨§bÛ¶mÛ¶NÞ½»ûë±OŸ?}¾Ï랼æ¼æ=×zH åiùl ŒElmœhé¸2æÖΎ +¶Ö2¶œR´ÒÆFæ€o9+ )© ƒ±¾“¹­¾“1@ÕØ dl`b0rrrmíÜÌM͜Ê +ª”ÔÔ4ÿ%ùÇ`àþ?5ߞŽæ¦6²ïc+[;kc§ïÿ׎ŠÆÆ'3c€‰¹•1@PVN]\F@!*£ 5¶1vзÈ9X™¤Ì m)&¶«†¶6Fæÿ”æH÷‹ß p´364ÿv3v34¶ûGE°3v°6wtü~˜;Lômœ¾{àd 0·1´r6úÀ·ÜÄö_€ìl¿-¬¿ußÁäl ÌíœßYå„DþÓÉLßéŸÜŽæßj€­É·¥‘­¡ó?%ýK÷æ[ë¤onãp2vsú'—1ÀÈÜÑÎJßý;÷w0;óÁpv4·1ý/4cS}#+cGÇï0ß±ÿéÎÕ øߪ׷³³rÿ—·í¿¬þs'Gc+:F¦ïœ†Nß¹MÍm`èÿ™q[#ÿåFÎvÿSçbìð¯Qü33”ß ôlm¬ÜFÆ&0ô2¶Nß)ÿw,Óý÷‘üß@ñ Áÿ-ôþÿ#÷?9úß.ñÿßûüŸ¡Eœ­¬dô­¿àß;ð½dômß{ øgÑ8[ÿ¿\ô­Í­Üÿ¿œþÓZÕøßhl­ŒþS'î¤ÿÝ~ÓoZèþ-4w1w36’3w24˜è[}÷ë_re#c+são^ÿÕR-#Ãè”ÌÌ -mþ!€õß*c£ÿ„ÿMÕ¿ÀÓˉIÊËËSÿ–ë¿ 徇ÀIÉÝîÛÿ(EÚÖèþ # `ëð¤edãÐ2³0~ß½o@œl Þÿ‡”ÿ +Äø_gi}'s7€æwÝ Œÿªþüþë¤ýa„m mþE'}£ïIû_‚ԆÎßÿëòWý?Ïÿšycc7cC˜•E[Cî ‹ÔŒ4§jŒìÁq!ÍÞnFÐÁ`»¢:¥‚<¿JÛ.ßÔ°mÎ2½÷ª`ºúI®Ï÷…S»} ªƒánt+ò®dãË\\obʞ<¤ ²6vêƒz"¸´3Õ(Ï«y©-0 6•ƒqy¿ïx“mÌPWO”~Ä.y~¨$vð>†)µ±híˆõ@ÈÕù§gd ÇOäý#Cƒ]7à=û8ÔY±Ð¤Ü.`pd‘~öY8¿4”Ë!a,Qfʂ†Ä´ÉŸIüEßfý^÷ñ•E0ñWR”’ÓmèGVwRM B×:K}gfBBÐθ%&ÔßFüþ}ÏÆrÔ悁‹“tܜ:½™Â^„6åA[5¤Â Rc%c,÷âþ>}€&îЄÀÌÊh©Z<æâЄNqIÎ ç‚b"Ã<(æ}ç*võ®‹¶Ð½&adÍ·'WŸP†Wïncœ m³3§Ÿò+“ J  xÂO^e:>áÔ<¡ÚÅV 0Ä¡bÞ­ÃîªâÇâç ‚™YDg€<ÈUèË•Íh¸`å›êóÔ! +Ã:—9AÄMúš²DÅÕUà?cFÓêe\Iµ‘‰‚r`#Å¿šá©ÿlï1L³q­×SðZûå¡O”u+%Lþ’SöUöÍØÖüJJ©x˜égêþ Ó;Äf¦)y·‹¨þj5ÚäÂNšÜ{ÏáP×5 Œ¤ÞK·f/^ÎÄ–Geb£¢ð›C”â [,N)Š—¥åo¡\aŒï” ¹Tg°>Öd°¼®ÎêބwιàQn¸]Äõ˜mk-Õð-Ø×ù6Ç0‡(MÌf”hž0<äË&Ŭöú_÷½×–|Â"76- šr#(!çrš)òQt)QÂGOÃ:ŽH dz´ƒ-Nt§ñƑ‹=È¥,N ³„í2BPvå`¡ãQõÎjž6c‚ùhôU:‚U”R…õl +ò֞²Ýç;¢õ¾ +qºÞŽ[¯l²}2]í gP-3rqð#žÒÏuŽcS«¥â2UªŒ/(­cÊK؊Zq}\A¶d† BT\ñ&ÍP˜=ƒŒºÁDÑ (Þ<’æX¥5 ‡÷RzM¿ƒ½$ÊvU·˜ë/:¥—Ãʀ,± w%8§)Ü*|jí_ñ»9/íÝ®\ŸáÔ ,¨|=Ö¹k^Vj©òv ×kÑ2Œ¨#šÉÒl e%‰cþ¨ájàz6y 6wÒ_ÐU;š^RÎÝÝÂâ³rÅËÓÍô]›KªœyV°ìtºû +HŸùÜNœ‘{x¯Î ñ¨ È4ÚeíXÄEô‹4¢0.m˜³´˜Ü›¢$_"‰[ub'ü Z¹ìt"‘[c²ÀÑtªØ˜ÇEª˜™îÐs` ðÚۂ.üÎÏï™çGâp`´)Âj³-e\*?íµ_Õ4ßp§Þ]H³HC`Øéø½0w÷Þ*¸ÛQ|ˆ&Ï5½JÎßðÝÎÚ­TŠ÷ÅÐ8’òa%ªÔEžÛ¸œæ,—HüUç?0Qüp>>\`ÀÇdBˆ!éSƒ.܋gó])̯l?·&2iN¹0­_{P9Q *XYA*xKLà™çÕ2×À÷cvUÔ·yÖ.Þß.ë4¦•_!f!šC ®˜ô‚YÔC”R·*ƒsÝ8F‡-/^®I¯?© ÒPã~:՞Ñ}šnóœûƒÛá9׆À"EE¦ ;ã¢sW™ÿ˜XϔÍrÕ²uvL`³õå÷Ý¢l0žÉPßw—¨Á!@ýFâ[í~é;¥Ö>$f${¿Pç€g–(½´ö@ÒWŽ]ÌN2ð°ÖKÃÂ˕ÅúÅ«ú×¢Ì +³p?‡Ç_ۗ4_Ï{Nä¶ùX—§—ëÁjÅ,@r€– +$´þ;hšƒÊ¡‰5Æ£&m5:½Ê*$òh°KN©pñ+.NÕc°2ĄPR‡d†o ä®òv»^?D†æê?фÊ{=°gF¤f¢Çë HT#‘*ÂéõQ¹ëQ;<ˆŠ{ ûËâY…]c +¢€ý™EäԄ~5Ÿ¡7¶ß±'8aŸu7j­_ €ŸâGøë‡ç™9/7¢èË×ð2 Þ®~ñèéó–G6ö¸`øèî„3T¼=6ÈKN£RÜïÿÀ¤¨”®¹€Y5ßéĘKÊVo„pˆ÷L­£î™I^ +ø×´ Wá+_^bÆDª ="š'W±&­¨­dɞ®Ëtê×@¿{ËUUp:ô^CA ‰×‹# v¬Äßbj{ôGC%,µn;nÐeêQÏLCV—ÖĄF•Û¶!­‹S‚ú4ž&{0PŽ ð›YK’‘G⣍úY_iÔÒ,ðѝ¶#vŠ ƒ¬’ýt1k™]"Bœô6ûX4Jè«È j¹%5ë0°6•²ž-t­übZ¼°\>`Ù| .¬³Ù+ÈðGd›¶Ç=ÊùÍô/Uñ€}û1°Hz·`¯Ð§½Ð»Èç® i*‰6^:@xž«Akaf͌֝Œ€Mˆöp+ Ü¢{"*æü\ç w9òù¥Æ :ó՚®A•_‰êqVU2€e^ãвQƺ¿{ ͙ûp¬Í>ŠÜâ‹9càxUY¦ ›°„ü +IiDSèå…!íÔ- :êAënèÃ<–ÜËvÐEšõ¯:ˆù~iæmøX¬’˜ŸöÉÁ ¹Ò[Ž§p“Œ¿Â0"eehãö/Æîj.S¨%aÊypç«Úœ!ÄÆáN^à ¼â´y«ŒÒÄ}áÖñè¨ØØMv6³—c[öÛ¿og3(é/ø›ÚêÀ4]VÔs2´iÓcŸŒ£\ý@Bl }i̾û+|~ÂfŽ,Y±Žÿ¹€Tî}+Xa®N"ŽAš]-ˆÈ/šÒ÷6óÞÄ +´Õûaì‹!vÕ©`ÇÍÁ‡IÏz^W>½‡Zÿ9×É>˜ss£x¤ø6k${z¾j„=ªÿúlՏ³ÝFiL´3S"Á€ÇÕ¡gÃ1Î÷³EÁu{e)ì¤'á3ûcåNZaåÞf¯êñ¼Øº}1ô|ÝQ‡ +ÊbÚ:=Ähß­¥‘éïV±ç*?„¦ò_ÿVtŠEÊdác%‹G ˆú1ˆÇÌï »z{æ×T7lxÉ Äõ/°àÀ ÅÌâ(e+–Š‚ó)qÙ'KØ1º¨"Á%¨Sþ {“I9ÿYºªCÄ?š–×U’PɱláSef—“Û WAw{iF5EþŸûâÀ´¿19ÿRhš…‡2 ò¨Z~¥ûLq”j“âùÔ>’!]‰ýLABùـ²çáî ÷HËx^ eV\»‚=wr +bJy]Wõ ²Ø¦U(ˆŠ œQ‘’º`ºÛ†(ÌWa&|ægîÿ1¸w_ćh8uÿ—§“cD' Ì£¦0EÎ+°Â©Ýð–ØÓ%=]að.[58 +ÞD´ÆU ś×2¬{{½ž`ôýlÁëñ²«.ô´ñD™b­û„wòYåB;¬˜0,ªôp¿M똚ÜîÀÄ LÍpÛ!·@䝌„0¨Yj(>×»?‘0xþ_!KãÊëаØO°JŽ“2Ó~)®Â%涓hLÉ) -‰´8i³¾ÁIbD´eˆð9ÙÚm?lïEb¥1MG/˜¥lµïå‹Ó°Øoù_¥Àý-s +Îs^¨˜®™Þ{gA•£_žRæ&—, +F¦?eÄOθ9N®¿#b F¯¸éoX‘l±¥æ~3´Ý,ça‰2(©X™†Kuあ8›§µµv:QáÌM§ôQ†qÞZ Ўãà+ڟ¡ñÃÉç|!¡û-F$…ÞŽinz¥vÄPîá©=ù“ ý¬1 “ø5yÅI'E6‹pfñ*,à%Ñús¥@¥y‹7Áþˆ—”LÏLÎnqÖì³c{ÎgŽ5}”ÜÙs(¦*e.]Ydû²¶Es•œ´,®’â^õm˜–i”Nö2˜)«NÈf=v¾ú'љlypꝔÚÝöŸLFt7¨Eu‚¶)%/v ‘Rjý{rmjAÇ +b“{rD¦Z¨ŽQ¾ûr@£(N-ûá#ò™Ò‰Ésç©·œèVjŠŸ]¬·ìyøƒ‡qðïŒ?òòßë7 9ëð0ž°\F> uUóeÔd(”íÔ\ŠÞí`tÜù´zP]FpŸ¥+G·q‡q쿉¸¨ò¸Ž@AÁÄ Àw|ÀßØóƒyՉ¡‚È…úë}t$¦ˆ Ädø_Î÷âs +H “TÚ¸{ëwëp‚!MXgñ,ÇØiμ-D7ï0À–Ê™hҤų6‘®=ËAYÓžª/ˆ©Õü6?§7Ãå-ÖÕ-«Ð›2:*æû"ò r©¨ü¸a:Éñ¦õَ~¬è x‘Û§&ä>/MžŠ}5Z±ú×U­“ñÎTêÉXÿÍï…-óGdj{ÂZ!MVõ5§(I]f¾QKdÏôJdÐiƒJÅ@aÉAzóÿ8öÀ…|&¯1¤ôMwÆ ñ‘‚™áÉ`“.$usŽ±ƒ¡ +É>¼z%Ê,ÖÇÚC uþ䂻Kh®!ÙoG Ы+÷zLy—@£ù!?dí£øeý9¦ýÍíUÎêåÒ_~ÿø<¸–Lj™‰g‡¨ˆßÙÒw¼ã'[·¯kÃބøËgÖLÀ]*K„]IWGsIRnÿBÀ1ùýa`͏CbyÊIswD× Q´ f›±Œ×þÝ&™üâcÁòˆaÎ Ù¾t0ø2Ó½%‰Ûù"~xÃ+yôC:h5l·þ–ôx,ƒ{ÙùmiFA ô£u¶Þ¥w#çúøûcf÷‰`ÐB3ÁLöM"~ÏŠ!‡]â!ûaqâ‰ÛÛ,çŠ;‹ŒQ’ÁDüm©!©ÌÊeü–!øéB:8ÜgY ðÔú%¨}kÒ'.Vµ?Yø!È-‚ Úe £cC1‚‚Ì‹ÙÈLU§ÍºMY6_!®À‚W%Ê¥¥Ì6¾¢èº=÷™µ£^ÎÚ!!šDîM\’èAOQ\ðçgq\Ú&àÝùvËÚ‹†<ÔØàÒ}øPñ ²sPgCÄÜæƒIQc¢Å} »% + rDX5ŠŠpØÅ覯Jz,×8§‡ƒ5Õ-jÙ0q^-eYšôæÊS«‹-Û:Ù峅%½¡S ŸRgÛY^b*åvêC¸†`¯q'•§©õ©­ú«®·‹‡|êõäôº© 7]zÔ ÈÇ¿{MÆ¥-Ø,h+£,Þîó×­ôaiÕP4ûº»…?z¡›ï.{F;/ó–x#õë1ReTÉØseˆ8ØúòÔS0(Fæ“%’mùl£²N(÷¨„ðêzšR9Ò èáóCÐÞʆ¼ØÛE90yV–öM­´JE¼QžÃ>#o€À~CÓ;ϓ£üIŠ·-Õ=̳(WÑOc,愤ÈpK{ug{>dœËþ@R`‘¢º"ÈúRš-Ðà ªÑ0C᪠@1΢}\C’C`Z&äNK^-nOt\ØÞ±Ý8ÉõÊc(àã2ôVJMÆͱ°X9’y@;î—e­ôP`'iGU¾|V£Ž¤í…BA"‹žPBEÍÏñOåo[„VŒ&¤Ékk;rR@“ñ ½6‚­öóáÞªØe“·"Æ"UˆßÔë=ó!þøÂF廛¨bRbw³ÆHFš†(¢œ +l†86čÆÄaè óõóˆN¹4œLø)ÒWnƒPPÏcO¬p_7ÚDŽʝì0I-óëDHìºx7, †>¤Zâw§i`ѧø RTâSú¼V_hô'*ѱ2[(„U2'Ð`£©£ +àÜX8œÁƒT”^°c# ’¬gB‹+2Ý/՟&mûþ•é& ²´äòûÏ¼ß Fš²ÒŠË\«u$Ì&“N±8=R<.ñõí©$M•8䞏ª²Nð´F _/֝‚­_¹b‰ƒþWÞ ‡yhÝS™n«=;MŒùk.r¿f–iö§ƒXéR®“ÓJ¨éi3qq·ýÀQ8†r\ȔRuö–@•»}ÇÁ’áõÔ;Épò:·ÏÑ­°þØMAPÂÑ]ó@¯‰³Gyd ôÍ¡½nÒrüš×L+±ØKֆ6Ð".Ä‚õ¿Žç öɐÝYWõh?ÂwÊØoà[1¼­—?P8›x»sGН.hWo˱7}›ÊO¤h@|,ESd¼úá">=M¶Â@W¹nb•ØЄ\Œõ„-Ù7ì.¹^OVß,å«ŒÌ Ïa|6§Xsk¿‡ÿÈ(ÜÅo†NcfïíÚz4ñ2¨›xÚsLd0鬄ܛ$m»ôSŠ¦œ3¯~rð·Åρ²²ü~ ñ[zXáÝ£~eQ X³›´›™&WÂÅå“üC5ÿ8íuKâY4…êÚ'’ŒNŒ úŸ}[$ÏKÚÌÑ·æ†ùM'@‘µÐÖ¢Tù_ï(103ç¸ý©(¡8ß3Ü#ezÑH\=‡g‚Öƀþ½¬{‹ë—ÖÏ#£š]Ó빺«| pôœFÇhz4—ªð,Õ5–ÅWI¸@w–)¦Cûù,›ÅAQo“=ɎL Ù, Œ?eŒ°àS«?¹è/°¼ŒŠö¦úâˆÏaÅސK¢ùE ªbpÞ +&z#fÕ'&NؔÚBKĨÔÀ²íÓ±_õk[Ù¥`]ÂÀ4rò,JàÃQˆ`œméŽI0:Bø 7ÆÎ(Ê=–ßÚy‚…ßMÂÀàXÕ9§.UZã>8»Ég—×o˜€Ã—ïÈð©(1¦p~:.õ(¥7^¾#ûÇ*‹—ßî¾$ÔÛL%_ð5v_"±½{â1• €ã,œ~õußÈè`î"l,hःøRRQr8RÝ^̪ÑÈÎÇ~)ýF&ž¢ü°rÌËO/Žÿ9Óçã‰;À04[¼H!£$˜†™Ao`ÊPRÈX@õ—F²*{Ö§ð$IâÚÏá‹>Béf¸mØrù0ä5²†½ˆI+…ôî>}_ç5üð’×µåö[L„JLÏôTjgÕI,Š‘J« ûðj|vŽ21›w8ÚÊ|SE©¦M…T=¹&ø'«‰®Ê¥èxZÎ^DÜ8¥P—g¾oõ&`£¢q̘|¹M âüzòd(™Û_ïùžDX¬kHÙÎEE6w­ä"?øQï\ø•¦ýÄY—¸ƒO‘"Ù6qäµ|¢W֜´3|nÄ|•Îˆs'ašÇ\b¶À֐þŽr>®ÄúÚ$ü^„|–OíëÒЃª ê2bŠÆ½éjCr¨jGÿ¤ž%h¡äž»à†Kïîµ)I\@ÌC`LE]|Y‰<Ô÷¼é±p)úkæÌÇBοãŒìÛû”­<ùµž«ÒÇ8>•ñ+E jÃée!͙° xíÃ&SKmö4¬e×_ Õ¦¸5×£¹ë/Èx„)>îH°Î/2‚vŒ 2ï‰óe 1;rDº7%¿Òó>ê»h¶áñY+ é¹'!$àUiÌlƒ…ÆnïH¯Ü• +÷…?Røô™`×váÀ@p‡²Ì-ÚºÅ^ŸôaøX$›A½*Ï,™$‰FsJ Û`+¼ 3r¶±Fæ÷Uq퓥S² b§Z §²æ!8´eÉqÊÁøÚš4–@e$“ieÝl¡s Ø«ît?YXß1ræîl.q" Z*ou|áÂÞŒ~¢]!Ž"ÇDf‚ zé9 ÂÝ7{†f6=„ƒ Ê/× J5îÿÁÔroý=­­7¥ðuãêÖbñûûmù°oI <£^áRÈ_PEtʙ‹çxYٛ>?✊O‚‚µá¿áV¶Žã=¨]} +åoÿë|ä³c"›ióDo¥°ýGw:ŽqÁ`yޒ…No¯©ù1 Ü 5ÍO¬II Ϫ«Ôíž³(½üñK‹ðŒ£fڛ ž ªJ]žHÇx‚‰ž³-—áP§âþ¢t¤Ûñ ƒª:â9“ììVŠÕ;á5%©e¨ûŠÜ¤£’ó—-1‰Š:æË1ÖR«ÜzakèNŒ,$ƒ_úÝL„Ž\=Æ# 'âÊ[=‘NÕÓo?ÈC„)_Þu´ƒo^å{§Ä0mÕå³M£C‰œY®˜ÕfÉ%üI½3Tx°ƒK\O…w„OJá4âÐRËÖøUáúTn“š¨Œ5i =ðÝçA£¦uíÑÂA\õ²³üdÈüîš äµñë(p—‘؏!œ~·5ïÓrìƒëRÀˆXæcÓlaÍ*®äÈU~çö"/\ÿá­â_XjL*ƒT«å(.úrQb|ODæú‚.ñý‚‘h¤“Õõ^x|Ã:Wçâ+2VÛ8àkÒqüÂ',÷·†^ئÛïÁç…ìr‘œ¿P3è:Æ|“|ö€ô&p÷N͚³ÛI¶ÐŽM"ËIƒKV8íԕÛÍk±æ•?>j•V5¼|þ&݊c¦)Á2ÜF:ùBÜÒ)¥ÓI)<ÚyèƒÞQõ`Š‡g[ú zÔæ´?êzá¬~Åfªå»ÁìÜu7FRܗÔÞ]KŠ€Tÿ+f×Ð ¹òßœƒ#ÙL úræXÿªj £¨}Iªû©]U“œ= –4½öD/•ü…kDpã ·—Ð×j›æ©¥Ó×× ÛIãèœæº1'M7ç¥ 6¡=›sâRïç+ž`îÄ{kl:åæŠߛýŒEËNCšÒ27n„8½´â"²ÌT¥ç¹Ê4©ÆߏރI¶¥Õ›3ሰ"ڃâÚ¶†‰u<éðT>yµº!ʍã2€ú¬Ïô%ïþ®љEn<d¢L(Ï_ àCF-ϲ86c‡‡õgô¥¬ÒºîåSÀ)‡´Ó ÁoGÖ_¿KڀóM²x"¾\w­q…i=’GSár%5B€•[,¥f¼I{ãCÐ'E­»bw¯0i@p½Æ»°ÌºîhR|íb÷®}°ã¢œC~ÄT“”’w-‚Ø e©óхºyŠ¢“ÂÏKÍoo* ±œÑ¼GÚ í¤” I\65RŸŽÎ}võ²SzWy8¨¤üT×ý)Ä%|ú˜ãßü\52¯­FOšÍ¥®ãÞ)Ý#Û¥R›+Š¤MLÕ`ÌÔWÉJ”ˆ¶˜½GœÀ€þ’ÐhB­AZ.þ ZT@ÛÈ(j½#µÙx?™ót÷]×QC m©Y楥uìáa‡Ò4.ԘCNŽ‰bÊ°=Rzò™åÁ‚ã !ÅDŽ“±ë"œbÂϤ6M« +θÆë÷%“9ëÅ{j„môFIHkÂl]Ž>®G;J´#R´Ï=öt-€*Ÿ/Ǭݴ4)pÓ‚s‡a|üÌ]§†]jÃ2dàoµØý¤ÉøMž±gM`ÁÜ*†P ~HçÒJ×d%d%oк0¢>ìIfÖ`ääA1•¼Ê Ï$ˆzÀm¦?<5ðø‘ïh ?{,)=éGÊ)d5î„ü¨óƒ×§ò‘ìË'=T~H)Ä3yÁ˜,R¯„C¨þ¹¶Ý[­„‚5H³çà¢Ë%”€€e’û9rÒ%jˆUí%÷m¦ã…^µ¨&m̟(ð ·ÄØqŠ@ÉK.„€NEPb“÷ÖÀK+aV˜<” +Ö­é<‚Qþ\£mtöä/aGD™¬n™à=Æ3ê*ƒqÇÈv³«7¾X"rµò\à™-a*ãê'¿]ý¡]³3ó9×à ‰¿®1ØÔö 5°¥Ü2Aõ›Ã3ƒB˜“­š<´PžSsý”R}/Æ8È5x²£0= ì’Òä+·oSÍÔ ‡€hceþ¯ÍüÈé†P÷?ªD6ØKÚñ¢2úËí­.âmàšŠ˜[[°í¨šnÇ ;½î\´HÌQd K¢Ü*ÈB¸ÝÖë½ußJ_üÞ^ƱÿçÄw"÷¥õÔEQ€žm-;½z_h¤5ÖÄÿðû«wî)õV(5o÷ނŠ­–Š ¯I À›I.ëÑ)$äûèýì@‹‰!G¡5x’( ì8y̦ȁ4¯E MèüÃO#æܨ*äâ‰}œÿ¯V Ñ̳S)0p˜Æ£yº@¡…,­QÁïÉ*•¦nûI¥¬]j Y†ÄNúk0_ÖO¥’¶¢Þwyû¶¢Ô;¸‹hùg´Ÿ&Üã!䡼ˆmEáîBKƒ5cáz´=$ËÔэ¤6= Òô×P|Ð0ÖÏe²s&­hHRÚ[ÄÀ+î°%æ©äô¸‚fbË=¿#D8·px•‡ÈÖ*Œ­Q&~ül}OŸ,a†sl›Ž OóÖ9ø̅üýLn¯`ûþWqÌåzÎ9²•Í:ÒsQ6„ªFMaÌޑEœXE€’ÂÙV"ÑØ4]ᄸ™†IÊ`4ýZFµ”óÓô`ƬÑkZèx +¼<Ŭ·§Y=9Ž)b~ü7í¥„F,ZYtfº i¿Ëü÷Ê©ŒÚÜð‚ ãðW#°Ë·ñԆ|eNò˜šïU/n:äòÝ ç8ïDä=ÉÉ‹Ç! +¬ÂJ4瑐ê¡oÎ80„´!̐€ÎÈÑ5U߶ú!¹ð֔d!ÜÒôpŠ!©:•–™ys*—ra€Ž~Ç:‹&Ä Ý+:x¹ž g2Ø:˜V;åAק®ùã +aª•ô;âQDë—¦ÙsÉÅtÉ>N>ÄX)+¼-2¿:~‡5‰ux &§YÅ£å8]ÕÓü®‰Ú‹¬Î¿PƒvÜËðw²›¿­H},J‹µöîi¤,e˜s2±ï”C)ž +ƒzxdv/ ö/­ßٝ7ªsãތÇœâ!íOÌÌŸ7vR=\À¾¢;£™ÄÅ*qpwX´°sG2²p=탺—[¯¦‘&ÎÆzS1‹è*ú¸ÀFêò­ ‡{É;)þò^Ü(U ¬­oä¯ “NãTB8-•ïÕleõñ]ü2£L ¿= LOR#˜Ä¡›ÔÉúøÖ5Œ½Öþßжo*Ÿöè÷#Ê÷,õN¢ôÔê•qdVý¢ @ŠÝ_mõÝZÖdÊTòàÂó¼äÆÑý /œno¾÷áÇ7Šb†7â,%^?RA§‹D‡õ+7ë[]ߛ~¨Q%b5¨@uÊ\O¨o$(x@ÂÀ’¢>ôj«è¿àË ë·cX„tÛd6M)»ÃhéGB!õ ¢‹$¹ž­ñÓ’ßU±_Sތ!FSÿFXx9ëtœCV9¨74ʏià»*œÇmíR9*Oð˜Ép+.W1“•KàֈñBԔœ&«’õêTú³þM£(¬RÍ|S¶¬Üdñ¨–íAæ@Gm÷¬ùbßîRz¦ ìšéRÒ¥bòîúòäÐØ÷³krh:W”åB9Ÿ½íƒ?F÷÷6Ikú²†®>ƒ¯d-O‡ñá>¯w~3' W<ɋgž]úûËÛU)ß%ÏÂÄQÇK—¹§=´›ä.ÕzxÏ&^dÏ÷†Œ( …Í\ ©Å[œAïì⍛S—Ýê¶O£†ÁÍp¹¾Y6O2áÖgøͪ-Êg¾Ì>mc°ÀHgâÍH^W /&P.3Õµ K-¼‘¥¥1’¥I{„öþ%èÌü@_º¹¼*¨Dþñ™ãY òÛ×]œÉ~±’»Âðx±ÜN 'ûác¨¤àɇLÅË*¤U‡°§úþ#gŠ’”üZ§·HÞLÂR5ë! ý³Üž[ª¤.K +Þޓb…´öJ(· µÄ_£iÛÍ¥GŸ+ Õ.D¹¥)»ŠžÆ?àŸ0†Ýùü¼”$¡+ú[©Øwi¦R½ç' §Ñ½ÿ åN÷„Àµ“ÓØû2ðKԖØRR¬g~.Ä2ɁvÙÎUTôÿsh #€'¤}½¾Ù­¥´Y²eŒ?–=ªzC.¤ÁÀ³Ùùs“.:×=K[KÐeè1 '›í9Emƒ¼úq⠫ȧµŠM ]»@†1·ïGMzT¦­žNaŠüþðK¨†GI&ŇHÃÎ B½©î7ìYsªX;#*kŒXgG|Eâµ tzÐ1HËΏdK<¡Ab¦Ê ©÷ÀfëlÃ< |h½ò¹ +ÁÿÈ<Òuâ°Õ èe£[ïp€lçP¹²h)/F— {:¿˜˜“ Èþú;ÿõuˀ¼E<ù+û,Âxӑôå·-\ÙJL‰å))ßÖ0íA#¥™h.ÂÛ%é¨^°ä “h™Vñҏªd$ÂÁ©FÞ¿š2{û·Î   +nÎ8Ւwž›sèÀ×!5{ہ~b•FŠãðI/ÏÈd Às3ª9ð³­³“-Hîy‹¬Â±KˆÂuµt¦yó릫OòÔÏ +ilkdZϦšYÄ%UtF¤m —K‡; ΁µ{¿ùZñmåfó€þG>Ö âR¤ 3å—Ìeêã&փŸmÐû&É4½z3Fž°Û?* =Óo;,#1è!eòŸd dµ#–ç* ~ª·Ûãò4wn2ê`ÊAžÔ7‰BÞâÄìÇüóøþ`þ~¤÷RönÖ,=ZfAŸlÎÒ.…¤<ÇÑI³lyiCÇ'æÍ ÿ€ƒ-‰=Ù} „3ùbäƒj£7+`¾>ñ«6ŽÈ„[amFçCv?ú\£ž+‚iés½UføÇ¿lvŠH5Š´w"ºšcáù±97U}ê*nŠ>Í6ó8‹/ °JÏ¤i.°W b ã¹\iðîëòwdÍ4†€˜Ä· õ×AŸ˜ûzÝ©˜£ÉØ«²Vt𢏛q‡SæJüP«púzzc—PÌxÎñX4õ³‡~ÒþÚu®D°¬8ì:!ë0 +RÚý­|dA¸¥¢SŒy'„tK©d>+&ßCÁW°ç5òå¯éfBƒÊÄolýcr뉠OägB†žæ„+tPêM:ƒy¡§câm×%}'GÉ,L¾u)ÓPÒ¢ÄCî¶ÝÏ,íþá½Iµh¤Öº·Z…õ*LF¤vÐÖ*ëáx¬’?¼I´‰ýèÉk+¤¯Æ°œÒþ4a<ƱôeR¸… Gô阑e¿äÿå•Óّ¬\¡ìIP ƒjDWçØ©¤?ç”`qÂ\âWiÁ0oÒh¸w#Æ^p /×v×R4d©„{íe +fÜtËÇò&æ½e”ö$L°¡Í,A ÊÆ®ÚɚèLâGæ#øÂ0Ö`¿جê®°õfÄðÀ òÜFo”T˟?É%Z>í¢JT=ýÃVl=†š҅õžDÿ<ï}y1g·»9ô€Ð¼¡)íÂ%*« ¬RƒY+‰]w”6IumðœF1ºI!e™=–?Š;*1¯Ï)à=Èf× Û„ä)É®ñ~ ,3_ R6$zèõ®AÜýgC,’çoÎ0O%øXeLüÐÙ¶ãosæ— P/Ù~ˆ|ßPsnB ˜˜%n4Xò:íÎ5O9y`j+cч tB Ó0gU cM}±­k¯bçúåŸI4q¤½¯tú®€œã±ŠÊ’¦Òk–/‘¡…»ß«†õƒõ–ÙßLçÞôOŸçÁ™R¯K?o⺻.!Bùý?rÑý‘:ßÇf²u>üŬ­:Œuk-‰¬³œÊÜ¥˜Èˆ_Kµ ¶@ÑúœT¸¯^ƒžG†°?Ž˜rŸµ} "¶FwÆß(VÌähH$×S'ŸÌñ'©À¾«ö:"Eóü8Í"K‡r£u+q2இ¬©Žþó[X9,¯Ï=͊"]ÕÚå £Z‰Š 1´èÝ0ýœG2¿Ÿ‹vâã`IֈÖüɗ¡C•…)Jq¶Ž/ë6J7F5ú¹þÃd@!|ì_ø3ÅÛHÞõ=J y3b[Ú>² +ïñ%×wӐÚy¸¡9ì=͏'®7 Y¬(¹÷1Vd½ªø%4¤‡²Ás¨¦îԂUu‹®ÚŽXÂîRÐRp -¿ßH« ]Hí@í9‡]¥‡3ôïêJB7³Z4}ÕêqtÀB»g;ºç_„^‡.£ÑóG‚äâöSÖÿ§Ô«÷hªæÚb#ëœUBì¤0_Åz¦»nUt½fkÃ÷7Ëja»T·î\‚hf¡ŒÒSD©ÀÕ%Õ®ðsÚ;vðV¼sŠ¬)]å0”!àÅ +áĺWܒž{·øG_,Ç>A7ù1B3Š‰ ž,ËTqwƒ™ý y_¼ã¾­†ñá´ð ÷f[¡Œg°ö…øpº²ñY×XË©)‡¸a¥¢pˍª +˜þJ|xµk,Ö.bn þc5ÊÚ‘J埰‹ÑǓ~Âa#L¬ø +áÎN±ø±9Dà±êKL7a݆Öûöa¸±Ó‚ü=Böh *¦£Ö×c›fS§Û̚ïöéí¦5®çUÖNÄiX-«~‰Ëû•0>?·ß–v}Ò,³" ‰?Š•`eþ}ev»ì™¤G3ٗ´Ùœk,YÚMFP¨“?\ÑÖ|Û}V)–†Ak¤¤¯ûšR„áú£ÙθmêÏâ #i‡=)k 2ƒ õ÷4t%{ýíwaµd®’¹ìñB¯¬Pa­]MKj{†Ÿ¹Éæda„$–-WìW¶á:ºDü›^ÒQ߁ýNvh9˜Äí1ÜsVd`¯yHÛi…eñO‡_~ºÖX¯<–Xv÷¥E~÷()Fy¤2 <‰Az +ҝcNlBY&L~vøޏ›¹¢ùdgP¢*.ԔNEОÚÈS.”ÌŽ ux”<¤?çZ¾CǪ;<E½ç&å-`‘爮ø¬í·gHtt`ë׬ôÚÔe+4 +»±ý ¥®3kŒ……},Ãù‚…-ú¬tî"Gԝ!ÔæésŸuÐÄd~¢ô­×{ULTèÖ=Xž+¨¼â€§¦¢ëT¹'á_⠇_mEÆT!NøC0ù_%f &™F¥*Äþ}\®ícZV_£9áôIJÙ+M¬pip”¡¼(”¸ïÃm³AãЭ<®`mºk§£îñcÙ ©õCÔÖÜál¾E†‡íß„S¸[ `¶î]À9ɲìÈefQròTùƃJ~ÞV¿s—ÞeÿØÞ&‘>rñ½NÉ"ž•:_ZƒYxólfá[)ºJdŒ(¬uA;4çfƒiìi) ú{3Æ_£&ç(ª"xwGìuI¦äšf…?7å_!í] +Ùøb`Ғõo‚Ps5YÑ,öüPLwëÖZ4®|Éäz¥yã+x&ƊŸá¼a8$”àœíʵ71 ÔÌÇ Åë _!_PuäZKÂi`'\úF«£³ ËK)܆–Ëx¤@è²wVVåUM 0_|ê‹ÝÅ·a@|,ᦹöúrE(Žvè%èq‡ÜF—Þ×摱¿‰…Ï6l©‰ª ùU/²Ä.*ˆbËÙ1Àäžþ +‡Æh ‹žàŒ¤œtˆ"ˆºS,kR&©Z²œÄì´Ôß4^êópqÇb½[Ypj.{U Á¦ž acÊÂä4É®¼~eòjºPAÒ§õf6þ5a=®¹D07 ¯/iŸ*¬Ê)Ôé³j–+nú²J©«HS{ßõvƒ0‚uuõԐzð…iLe×ÈpÒ'd¸†™h”Ë~†–ÎœÀÙ/VϞË(4bJaÕxe¦›$'úîln)o[KÄ;:sɶ;&!ŕ’ ·èdíÎכ#ZÑ8֞ýc´¿[_Æo\ø¬ çæ£ÄVr~lò=Ýv¦s­Éx9£"!k +ÁpFG"gñ¨’Q‰‚óWtûÈ,¦1îàyÄs{R19ÅåŸ6òb*h’¿²/èå×k”à«£ãe§¯„¥Î®Þk_½Xïr½ûO+,nMÄñ¯¸ÂõPŽô¹ýUVûúFŽ3Ž†º +«Ôͅö—hÎ<(=ômìEéæ?-ê.‡ÿä4{Í¿ôÕÊÜÆ®£XÞle°}&h É©è©×(x§é ŒÊ‰D€îôÑoCo¨Û·wٜìëPgècô™9Lâš<ˆ¥ÆõL€ %k—‘ +zx2£“4h*PÀrbõ3ƒ5¨ö`~àɬÐy’ä¼ÂaÔh|:ŠÖŠ{lʃæ=kWX´èu¾³:,™›mS‘Øþ¤BTHUèí÷ÀÒ«œ.OºÄ˜¼ó³àDýᤂ¸ížg¯?…ÊG{~§IO +†{þD¿œc。1‹Àûä #Wp¾£8òÌŸ˜zþµJý€ŠT¼½ì±9?Oü´±6mÐοɤi€ $1³¬íÖrKS1—-bê0¦UÝ¿(eń7VI{ë1/áRý¥§ºÿOª›’Ök;†¾­±m²Fq| 0ý`‚õýð‘Ý?æî:Á2´©Î1Œ?Ž;þH©Ì›‡@Iá °µà½qÿkh9Csvsj…ÙŸúÿ¥< Úõ¡2é,•?â–éQÖ¥\ {órќ–D›¨€VÅö| +64¤¼Ýf˜«­U«Ö֑DX?[Š"›°뙧,Ÿ°ÇÜé.öêV*Zgd+B|üÉà›|»ÏAÏÈòM3/U¹²&]…µyԊ¢€+bŒ @v¯h\³eâTømzòªVó)Ȥ¢$›i–l˜Û8ëjÓ;u½£$¨øµ"¾*YÖ¤—3Žê%yÎE{q´± º%wx­9ȧ˞ÌΡµ)“ ‹×g*©€ë#©Ëq¥în¼qªðY¶Ž6¦EQ†Â—Lo,- pÂ1²:ãá&)9øJîވãs¦‡ç„¤a¹,D<;kç"E×(€qn’]Þ3 +[Õ»0íñÒÀ<ˆ2âM¡„ § ®¡ÓãX?i½ÕLZ>KÝЋ>dVOV‚Ân ‹-§ò•2c¸Wb!2‘gI¢ zmçTÇ à™›Ýs(é +’âñÛÝÎ0©«'ïâ_…÷²¹—)h^·vÎSÛìÕÎÊþ‰a,épbáփüÊڌŸlRz€äz}àHàß®t1~¯"£ e+›MÅ[±ëò²:ïT×a‘ÇyêË\ñ@+Çaü¶š„7ÓššuW‹}6ñOj1âq¸¥\°bKÙ»JÏïE”qZÓ¾°ՓãÐû6¨(£š§Ký +endstream +endobj +2883 0 obj << +/Type /FontDescriptor +/FontName /PHKQQQ+NimbusRomNo9L-Medi +/Flags 4 +/FontBBox [-168 -341 1000 960] +/Ascent 690 +/CapHeight 690 +/Descent -209 +/ItalicAngle 0 +/StemV 140 +/XHeight 461 +/CharSet (/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/a/b/bracketleft/bracketright/c/colon/comma/d/e/eight/f/fi/five/four/g/h/hyphen/i/j/k/l/m/n/nine/numbersign/o/one/p/parenleft/parenright/period/q/quotedbl/quoteright/r/s/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) +/FontFile 2882 0 R +>> endobj +2884 0 obj << +/Length1 1642 +/Length2 12436 +/Length3 0 +/Length 13290 +/Filter /FlateDecode +>> +stream +xÚ­tUT]í’-nàÈÆÝÝÝÝ!8›ÃÆÝÝÝ5¸»Kpw‚‚\‚k¸üÿ¹§Oso¿t÷ÃZc}5«fU}³VQ(«1ˆ˜‚M@’`;gFf^€¢¥­‰‹“*ØVÌ#Ï 2µ”q6¶¼cHbŽ cgK°¸±3ˆ 2ˆƒ€VV @ lïáhiná  ÖPÕ¢¡££ÿ—å/€‰Ç?‘÷H'Ks;åû‡+Èlo ²s~§øoª@g ÀÌÒSR֑Q”PK)j¤@v Ç÷&”]Ll,yK ÈÎ D0;lþqÁv¦–µæÄøÎ%â08ك€–ïa w Èþ/ˆ`r´µtrzÿX:̍íœßïÀ °´Ú¸˜þUÀ»Ý üwAöŽàwÛwìLìäìt´´w¼gU—üGÎÆÎåv²|‡`³wOS0Ð寖þÆÞiÞQgcK;'€3ÈÝù¯\& €©¥“½±Ç{îw2{GË¿Ëpq²´3ÿWôG¹±£© ÈÉéæû¯ÛùWŸ€ÿÔ½±½½ÇßÑ࿽þ£Kg'# ë{N ó{nsK;$¦¿æEÆÎ `aþ‡ÝÔÅþŸ˜+Èñï ¢þkfhދ06ÛÙxLAfHLŠ`ç÷”êÿžÊŒÿ{"ÿ/Hü¿"ðÿŠ¼ÿ3qÿ]£ÿôÿOÿ秖t±±Q4¶}€ìÀû¢1¶¼ï€<à¯eãb økßXÿŸHc[Kÿ*öß½µ@ÿ(ZlcúïØ?øEìÌßÕa`á`dû‡ÙÒIÒÒdªlé ´˜Û¼_Üßv ;S£¥è]à¿ïö=ˆ™ùß0u K µÝ_Jpüٙþ{ïšý]>“¼˜”¤œÝ±iÿvV~Ÿgu{àÿfÒR›þÇá/*QQ°;À‹õ½6Vv'€‡“Ýçÿ“õo–Œ-ݺ̌ÌÌ,€÷÷?ŸôÿFÂ6ýk„ÔœíLߧî? Á@GÇw±ÿ^ïÿóü÷üƒ@î ÒêÈl•ž•á\‡›7<)®ÛßË=b_Ú¨^Tà_îñKßâ©4z© alšæýÓî±xlÿº'K»?ڋcCՓ +:ÏÿäCFÓW€þ“²“‹n?É %ãD+ÚëbA~æ '³æþö¤ŠªAÉ Ñt'›#ÂÅ=?™k?ùýG_`ZCvZF]áñ eÒáýÕàØÈðPÏoؾ=BºÜ8D +>WÊ(‡\B¡/•^±DúNôOój» +ý')ø:ø”ò’¤»ø«U/Ý:Ò¦È૳Ð/ƅ +š$§qi왌üë¦)¼NóôF0Š+C¸úÞÂèv8ß t…µ8Š¾ÅÛ'Ǫѵ†Š‰,}¥¯2¦fÙ$Ÿ’ñ—H÷«Úg­Ž¢~ŒÞ‹¾z”2ÛLñƒ³º)݈@ š&„ò™?¶Î*º Ì»ž´ç&º“ê‚2œ*ÓZ‡ÿ ,ÕÚ°;AKЂä%uT /k{Kå]ÇQ)®O>jÂzZý¼ko™¿“rŽ>TÒØ!)Ó†ù«²øƁÒæHÝÈCÃPú-Þ8]–)¤Rmä|m0‰óï?Íҙ¢)¹`v ký2xѼlßI] Ðpi¤J÷ ìÄHÆ ‘Ýñ£!|8ß=ù†ÖvÐT߈ÛҀn–®Néò@°ç} N@y‹ œυ«#¢Ô[ð ùÔiK4փ­Ó§‚~´ã$XSäyžï7^©s`ÙÅn[Hžú™ì7ÑDΚ~]²L`_Nœi–ÉI…Co²÷¹“¿á"'gj‹ Úi qõsΉxaø"ê?˜Á´„<ìø¤¬n‰'G2,ò)Ès°jÚµ¨oéÌI‡È#ž5Çaè•qéüåÌóIZ5ã|3^ÿ‹jðñB»‘]d.7‘‰ ÷ˆÒÒ£às)jçL)(\~‡§¸)TQZµå¼ìûñJaê yÓ<^ÇidUöÍ;½-3¡ÿ‚yŒæ\ˆ¯“m×øâ*€Ê}²gŠÑïmä÷0»#4)>Ì͂3Â.àþ¢|¸Ð ŠŒåã߆l¬•‘Õæ㏸C ÆM•{쨥¼†U¼ŠyĦèwÝhÊ +¨ÄûÙ.¡g²>#ýVðÄó +³ØØVëI#æØ 8ÎÕBñ™s Jüƒx‘ý^á Xí"Þ(þ4°ÏØ͒!Í:5¢ Y Þs¦––R™•­~qDœžKu‹“”XŠ9Ûõ8°šÕ&BL¾,ïؘZJe;ÇyÞ0Jú=™»3ÊOE¶G;ëÛ~—Ýp¼}ž—ÐéÓéÉÌ,A'có™[.>ó—,ròX5TÝ¥}Ô'Žœ>ۀ­æ¢¯– 9@æQ"Ï%´µ +~Ä© É}9”Ê{Ì«•¡ƒÀúüóù'uoA(Ëk«´óáìú.Ü/æ©`U?©Ø_A>/ŠÐÝÊ@¤,fbЎ}x¤›ðoCº)R™e؋Äòt?‹Rt:árQ +íσ¯õäõ„|ÅÒòÃý›a—¿aGÒ—p°Óq¹K0÷æòó;1«Šž‹ðîÅ.A s[Ė°ÒŽÒh¥Gozz…ÁPP /´òkÜ,cbJ“UÔÉÇq]’‡úŸÁ4,ËQ§×r/7DP#Ç|0ڔ9棂%í·xØ¿ŒCþ\Ø8Œ*kwŒ$dû¢›Ñ/QÛb0Ìîx f±{L>óá‡À}ãè¬UÕ$; X ¢3ظä5âÅÁÅ$±zt1$1¾;%<~žù™Åfõ?8šAJÀU“Yç1% + stÝXÚ°±ÆHt?¦6õtÍß< +(—½i~ï6iûy9þäOuºˆX‘¿¾é¤ß‘äÒºß CÁ6ðuû¨gFaÍ,¹æ`‰µ·l¤,Ÿ\³<ҒÊõòRýÉvæn-IƒQ¤µ¯æÕüýì€á}ƒÈðª‘_ª²)í­ >»CýT·6QËk-ö37ÚgV<P’OuÓóá ·’™– î4†µd띂æ5_»Rðâ½PÇ픁RÏQ}W®Ä±…Ào5ÎYρ¦{ñ­BÌ3%^Œý’B§Ò½yè +éЋQ}ÞsqW”)"¯ÒÞz‹ÄB²°¹ ¯!ώÚf,ŽPK=xXQ3ªË2ôâå_ë¿ù;¤@é”R„¶7ÖJŒcsá›`ÌñcË!I¹ßTWŸ¤dsΒU~y)¹"ڇ‰¤‰ aP´àžìÏ¥?«,¯³©ú·}a €$Û}ÙÖ‚éôuÚNä¦å£¯ßV„ҏ“ŽF.#¿RÚ½•ë[(µK,ƒweš#ԔÚ;<‘qZë„ö,~g)à çæäÀ)<ˤJ×kWó®’z +ºXÅ]ç+Ü'³£ÑV—|¡¿)Î}ó¬qo®†: ¨‚‚4¬!C<Ì5MQ5MXŠÐ<ŒEvôÉ?hh´“ ˆcêÃÇgüC +-õ¸"ŒÌ—ÇóÚÝVG†ŽÜà-ê‡{r,ö‡-ïò¸výR¯þ‡ í§yñzM‰"¢RƒWúòžÈ×3ü+Dö +~;M?OPëùSØx:1•å …œì ™Àðµ j¡XqJ: +ǔ‡n) ¥‘hýlü‘]HÑr¤ØHZ¿CÏ:¾qÐoE{>näÚÆ£Ë#´÷ÍÅC"†×©†]?“C¯wŽh…ð’õŸÏç;zx¢r–¹Õ лcwK‘À²SÆÁԌn5wöÀ „t¶æW[‹'¥mö2f?2›0¹ïp¼DÈê¡ô“Ì>5è«Ñ?Ô÷g]»’s×ß8?8¥©eŠÜ5} …ÏkbxØÝÊ퉨?ÜK ߦ,‹¡¸[^¬< ûi€{ýrŽêHó +–üÕ8P,ñˆàØ|ô "âs\gÙGïR*«3ÜWU!ay‡‰% ¹UÇü@©R“K´X‹3yÉÖñ¦Lk`<˹v|(xэB[[u÷d}1‘PUMÑm& bú +þ>š!œ[ïq“m=’án„#I¬èϧ\ßã‰}jg=ù²0àQÁº:ÿÄ}«hÙ²ãÚ%¸'›yº$ÀÊ¢Û4- DîŽéÎ4ÚøCL£~é¡`KíµèÅKžC¿î„ªX9™H ~L]pH­[„;¯ž¯£ÀOXA&?E²Ž Ò¡Êq!™vó+¼~d¾‰š>Úocª¸Øm/OO +ˆÛ‡Œ/£‹Âr•ÙÚ·ÏÃK…éT£Ά¶+KBž]zçø¬fÂæô‹vð:Ôÿ´ðJ]ê³íåõXÿ{ÇʓÊÒ¥°¯ç?ž¼éëbªë˜v¡º¼ª›{2:›@úyR)l"ÍÔ·rsÚ-èfZGùŽ=˜J(w[^¨$|è­¾Éù!=ë«Ä’¡š'TRÕǶ–Z´8>¥Ñ¤;ù։n—Qý`ˆõÁ«á-¢\F¼µàÇ·Ø¦SŸÊŠŠPZ_&™ž`ƒJK nâ§Æp”:½]#^ò¯AZña[ª9ÚÂí3L÷/¢(CÄðß™HO~…RôÜƏžÖ¬}íp0Î¥·=F|”€ÆÒ®9—P$½sqÈ՗jõ¥Ã lðÞô]½ÕåÃÞðd3û¯š;%ªÏ’dÛdš¦¨clpä…³2Ó&+sŠGŒ¥Ãã˜k`FÎs9 ¹¯-jHŸ[Xv]Ž Ïr Çkox ‘—t!b@°úaõ— sz¡â"(”‰I±Q&³=4B$L'vP•#9¿".Åù-kŽUgsêd5áÉÙ•‡}¿ÉZhwÊMHšp…þÙb5Z¯¡Ð¸‡ÀÓUÔ«”eYÂDsí 8E«|•Oí© ŒŽXà÷)h¹¤åådûÚ}£ëÅ ¹?H¢¾WîTÀoXDæ_SlLX¥êDiØyàj‹M˜¡³E»®QXÑ®T¿xdìáS„ûïEMÆñxXž$‹Ì×[ªPäÁ(‚Vf~¢ªtVZ¥ê,:÷)±`ú„+\yÝÏ>žÇú¨³­1´ù‡ñ1½ckÔ@ŽÊÎ-~ +Èvï}‚ƒ$‘'wM}+•®dƒ®r°oŽ¿5G%nÐÛ.(àß=ˆ6³_Îr©]Gý꺐ÓhcKBfó‘⯶ÅÓ¿»ñ.¤>ÐŒ/?Çrbâ÷0EŠó3È«Á ¢‚Ìí9 gU9Ó{ë5³Î®f¯ˆnÿî6S%$¨`*“¼eUÛ …‡´,A`ê=cœ8©üõ”{eÅÝ?r+o°e51½c@,Šy ¦„”å_…â‹Bä0qØñO¤ ¦ê"»nYsoEq!Ãál¼Ms›»=+ŒÄ2ٯ¦ێÈqØÚ[ߓçC,­d$;ƒöc?=ìÉ8¢ÿØÖ¾úÙRf‹ÀáŠBJ áûña^9—'ÈI§ƒÃd/&xÞږ5³«º6û„f+Ӄ‘ _^¬óׯâd~Ø1ŒÖèôêb²Ñ᧺õƒ(½ÌÒk´֛?:j9ªš)ñ!¿ül¶ Vš3Iƒ¦ä“3.å"Z2`FNf‰R¨L$’Ù;2dbéâÖv>‡='µ +vz¸*éü颂ÿŽ&èÿ5×ìeË¡ÙeÝœˆp´Ýˆî©×=çv¢aVY¹ŒP;F˜Íô”}©/põjßW/@æ‹Ïþ“ꤘU£§è¬^²Õ\ šƒ³GÉ`ù·Ïñ杲ìý›TcŠ•…•ÝfH5\ [µ–…œL­»F[p2Kmd¼¦ÓZ ¶¨B +—“”ä³ó‹öƒº<–.£O­yî +âoA¤îËÂg†?ôN<ýO'àC”ï½ZnC/G4û¬<\iBìÌƃ›êmB?~bǦAoÄklo_pÄ FéÐäæYæ Ÿ=crxƸ<-¬c/)Ö[ÚÖ»Þ`{îFÖòaÜj†‚°¼ƒÕø¹QN,gí¹!Ÿ"Ì^|ýì»;ùO’\s«UÄ|AÔÈ´N QbLîéyD~l¦FqÎÜź³·I›äã1oÙ0™Ÿ‘¤h{7e“TE~££ÓT±>T8ÓN :B0µpKàÀ-u½õ…Vé`.ëG›\÷šíœ^VlžªÔh4þ:ïOªÄ]Kõ(wU®M Íβ»à[‘ knAŽÚ7]â¼hÆÕw¥Uuí`:¥{qtÄó€†äìžgN6m+òC̶›i›^ _8E:>àÆ5}l™‹…¨÷뗵˜ Šg£H$ZBI£ò„OÈÖ2ã]”É–!÷Â+ÑÞué·Ì%xð|âj_ȃï¯ýÊt>õeQ¨SHJhDEÕèßß«~}¢hëŸÜ–W±ïNax«£¾o<ì=’Kˆu1 +ÃQ»9û,|0ËT›ü„[ÇÏ}ï —Ÿðð“~”M96®ÅÜ) “Ð_ГŠÛ/藬ê2!+™È#¤I0Àch›¹w3[ù&£ßXƒÝc­Vþä?ãD6±ºÓ‚¡ûDg÷½°×($­þ§³Ds°úÊbg‘K5’ QWgðY¸ý,GÆu¶ÍâèåAÕÝ£ÏH ÐLuØ¡•œ²O„ Š¦a»ÈVüHù™Q°ñ÷­–;ÇéÏùðái¢Ú@¯Ø‚j6¸\ùR™CDO)¹yY¶:ßQî1ƒ![h˟¹IÃHÏÈ% Ö!æ'üðB…ã°V}FDgù²ƒþ ‰ïç£`©Æ“©špˬocó‰šf—€Å5KLÙÅÇøõ%XexœŽ3ê4’æYš÷Ø_Cu³7ÁêÝþóÄ4 +9pðv¥ h"҅Xæð¸>©bSí‚þÕµ§´#ãÔÆ¡4£FI¯éá]Ñ)ˆðç-Ff¨½]íhchwãDÒ½«ú‡©õnP¥tRf’vØ;»Y X‹Ýâ>ìê’ü¶íC˜ð…NszÁÈÇóœ/‰-â|HZ Moµ±!øü¢¸…¶t&ØK^ÞfpGö{Ý&0]É¢‡»<…š¯rY-q~¥2dµÊr„¼Bè¸\2ÍüR%ã!Ÿ‹wE&$ª@Øûøk9*DÖSGív„0.êç 0‡£œ÷úšå¢™Òe¡ÓBւ v/6mÈ8ºñYË$ØçŸ+ß VØ#_‡½9+†úcK78”`ðZ«¤žÝ™üÏï2q –áec<ìÓÊè4=pÃW5|s ƒ›^|Ãé Lj›Tß`âw€Ä¦'$ÖíÊþ‰ž‡ÌìÞ΢uvdâ>ɪµ!ànâ(¶Bb²äOáºyü iVi_z¶§DËþˆ±Z×çC-ÜÂaW)]?­ėÑ1ޓ¤f{µJ²Â!‰Ç4P¤0j·Í§‘1'ÞR/1îVÔÜ"qõ×ãBäæ½®Œ¹†Ë=É㍧F ؎|kS/%Q^V +Sr.× ?ÔMM,µ¬ÂYúÃêr¤È TTK ¥šÜ7OÍí¹u!ú ÂõN|-6±3œô˜¤ÅGÂÉi;¼Œ&Œ§¾aØiûÆ,ü¦Ò©³Õék_Rǔ4p¬`_LF‚CÇÂS"èúžXéyä@{¬8Ä6‘ÕˆŸÅr¢qJiëƒhAxóMb†`ÝPBÿF6à¨âщØِ®ì ju|ˆ^'‰=ÀEJ¢)Ć!ìXbÃö?ñ_×|J=?‚ÐLï¿«Á¹K(öîD"6®%§œgC«paê;zãó½“÷Áy'‡¤ÃÆ?pc¨y‘E'8S¥”öVwí›8w|¶Ùå|T­w ÈÙ ^£‰dí´¥ªì‚Õžè{.Ètì4—$è\0t’"îʵƒ Ñ©óˆl}Psx}Н§ô|åñÖɦö¦É‘Ňƒ¦eyl{Ë@ƒÏ{G,‡õ§ýŸ±æ1LìºfµŒ`ÇZD|Î<3®s« rU"P&"†¼ˆ;tœix”ü¸B~É®L`)—Âj +?VùѤ¿VX¬§S ^Hâín_@†Ìy“©GÂ1>†™ +¨³œÝX6V%î¦û¦± }Ê8Õ:’&JÞ{- +d-‹|ðÇèz»%3‘¤ßO^ô HÕáa?ænèMÏPdÄËçü:#Uñ‡èã,ÒEÇZ/êï™j y„ d~ œ43Üg9ªü÷Ùù€¨ 1ÊWB•únjÚðá‚œ¬,´»[ìËÆ_á”ZGê[©©‘yZP$ å8! £G¢¯5ûý¯=ÃâMÊ\ OÝjCoF§PP Ô9Í%Ñ¢”Ü|Ý¿Ñ@S; c^Õwú^Q>˜ŒÞI)ôOûD²¦he…[‘ïê\[ l°¬%`ù}V™ÑÎpë`…®æY¹}ô¡Ø5‚´ ÎócºÛ›’|„æ"”ïívV­Ø£ó +£`£­&ÄGš ÖF˽É}ñ——EÇ*Ç.)ày5w›šJ7[CU  >PÎíÇ×x¹"»¸MrÂ5åµ·œPÿ!‡_صÅù»ùKp”±×)¬×Òˏ]ªøš67jïÇK8û" þzò“>˜çú3dÕ¸Ë5¯Æò¢’²’£`Ò`4‘0˜»Š'’ÁòZxú[v´¾úˆÍÉ ü¤&5.32¯öuí£ëv*ã×6m˜`Þ´3ñ™ëŽßï®æ2Ä•ÕhÕÍU‚zžЏÂX.(ӈ7^»‘õömú'-Ò°Lüü(»Bì¯é-ÊWôñU½‡zÛñ;õ þ¼õ>>´;³··?ëWe3v·a7B‚ DÕöĸ–Þ?MÉ©Ãæ¹7EÇ,gY#1ö[mS»ü·e†{©›.²²½ÔêƒÇØìq¹],7E‰¨Yww‘ÐÉÃþgoJ<¿g 4w‹\«*ó´Ê¢=šõMåuá.÷~ÇٙՓ°<û’Ì2šä÷„ã­é]@zU˜f® Ÿa5Ùp7¸(«ÅG´¶‰×GU'•"¦˜Ö(Y²8Ÿr&§UAí®½@†ÃZ9ð”«j«äÔäã—Òéën¤¼höÍ#{Èb5¤IøßGÚFòV}:}Ð3±ø’Ü©UùнŠ• 9¼‰ßèßZJ~þ°É«Hd¡!…êÊîN$Ç +Áwà ‡“SÎIÕ:ÂY1~bQg‰¾k‡±´y®ö&ÌSÛç{F`ÚÛîZJô¢¬Ò¸,V{±ZBþí3~Xõ[]9ºàЧµI»Åí9ûê_sÑ3þ2ù}—øV=13‰ÎЇ=ÜîV´H· „݊\.gs¢£ +KwøslÊ0gRÃïGóÍN²õ˜¡,š×r™?Ÿ9噜…=®´|0pÔr&ð"ÕÄ5fˆ6ƒåü_“h#pç (ºñ33[#-ÈŒ„HÍqy¡×ʙ}€ &fòºA®Ðß-e–6'‡J¤O¸ËËî5ÅSÏŵ=VDûX ,>¥òP6O](žN ˆúäúÁ‹”ŸZ±Ò Ѭ:)Š/i“‡Ô°¡Ô¡jôÉaG4ºöûwHOøƒ5SÔ­¥8MMTAž.lC¦ =Ž³Çæ ¢ SѦsó!5ìÈfDntǐJ<ãÛ܊Ï?vîƒÈÜ+lʔ æ:Sä0ߍêv GŽu!·¦·çoÌÖ(Xûu8”OPnn>µûUMµÅl”@Ë$ßr·éÉþD¢){vՓ…™• VÊ3~6GÕ ùóù¢ßèúˆ²&òäI¤„wKRÁäê™–wÁ^¹Ž"œú‹X]4?Íl¦Ó¶R©ÌYÝnCË îJ\áþ«L¥‡Fë×17„°^_0Xy4 £‚d¹?ü^¼C?¬‚ýNϤÛM»[ÓfõéÒÑ7ˆ ÓÇǨKR;ͦ\÷¼“âÉqfÊæǯñI$¤ÂÂø78™[φûükΦ™Ã<Ô¨î߸Až{ØWƒz +*¤JôY*Ç{­¼²{´"‘ît'>‰²þøvæތ°„&€Îú-þ÷Hæt: _j±H]¥^õUÀ’Ò¥æjԅüèAiè;¢!e)³lfZKÆstxõ¼«dò–Ÿœ‚Šñ“òփF‚¹B9Õ§ÎIItO?6ØãSôÝÍMhð±€4†ðD.ó³_äÈ#i¤bÎ _›V0÷E$»0 ¼|ˆ‘IËxwä©¿ÈI3CS1¢e@ƒþ¨ÜܒŸVâóKÜë_¥¼\¾=9_§±—ïT‘p‹xä3¤OÚÝP Q8ò Sª$õ")Æip0%–Åã7õóù‘3ìo—•Bߜ$np:žB¢õUyþÁv˼Ø?;2ڂåAýµý;ßó<ú3Aþƒ2ÝCµIžìÁcìÚÐ.è©ò÷mØú¹u+TœÂ´¦R˜5¢©8saͱ1¦JÎI')Àx7ôÐâ׎"8 ­‹ÉaKë×ÏÏü¤”ZSÍçp…ã(M¿<î8Ìï Öz7ƒn@Ñ?  +å UáÝ~ˆ¬ ÔåYŸhQñ%c&s‹ÑŒÀ-aÔO¬»X¬“áf\lt˜‚R…™Ê¡R>N'ē(r,ž _‚ÙF‹Xù&ÐÄ&RÁÕ³ãÁ@ _ º!ê§½±ÆËvëëáþcø‹GDÅMVˆ—‚–¾Ô%G¾&þŒ\ôM—\:VÖ9Œh¹ÄÒ ]¡tW¼ՈɷÇl>=ª7]À!n»Ê³©i¤ÉŠÙ‘þò@U°l8Jñî2ĉÕ©ÛDz”.GxÎc—0!ঠ{¿åbÃp҇‰Ô§ +ÿÌÿكôc\À3|›'¶1íQw¼O’_ñ¤ 1¤g,2ú•žó>ÃÙ®'üpß(óš&Ï¡}1¥1æ®h& ?P-Ä¿µd7‘mç}5hÄìä]Ì@'èMêïV9­î\úøÙóK6õS?·'(aöǵdÀ S¦a«½Ã3. :´¡°0ð_ Ø©’´‹ˆd}X€ª¢u:ž£©ëñ?ôŽ9AŽ_[½£ã¦~8·FÒá?™5òk+ƒ”3 + ˆëÁèIýºª`N•D™}}éÓMêŽb¯KûùǎçE.c¢É7/•„ ÅÄ¥9pe„ä}ö7#ÒÐ̎ȟº1G3¦Ä^bjuto AIdÁL»X­OvVTɗOâ^üñkQ]@l¦hz»C•OP-C,¹¼†eØ^'E- +†øƒ®Ú‡¡dÀ1ݕ䏿í‘ý•ò`r¾õŒ7[ç^ µáô».CÔ ÚÁ™£½w'ŽþIOº8oõ?×pRœ›éi*jâ=’½ }ìçÆ+ˌrñ/†­û¨…Èt H^ÇԾ댲øE„扜YG—&fñŸ¤ü¨æïÙÎÙV…™Y†®ÅÃí"Ý\æ>` 4ׯ C!Ø·ä~ÀCØ]\ýZ3q(âA“B†òËÕ«Š¼£¨;øðì(‹ÆBé0j*̳}âÕè­c”„Ú;FJ5Ü +ie!/ dQY­Í‘mçŸþb;ìš÷ -ÂêSØ0pôœíSe?*ÅÏÎ3¾h¢.HˆëDz™2Œ²0ƒ&Œ›ù‘wøÛ` 笕wåp¾#Ò{!B¶,È23{p!ÜÊùU¡„É@öô4ÿÛ¬Ò\ñT¬+LúaúNu\s¯–©aÚnò|¸ÎâSßI!^îY­Ym³©ð˜³%(˜d®}„ñu#]x¼¼­½¿pF•7[žì +þ¼§.cÑ_}ïŽÎb»Á_õ[™¡È¨ÐR´ÌwÙB6‘²„;rùú†é:@’è4í&•ö$)Èf´ˆhål/¾GÀ‡3›gàÛBÅ[kãÌԌœü©¶[K`ß5»zrå_ð\3wÓn¼w>;¾ÉÐËeú1›iôºwüOdÐŒ!ÿè²ì'®H~¼x©zÇâhþÑÎýŽk†'vëGñ‰Î] ‘ÈóCëؾÕ$Ÿq^åŠú5MƒÒCYúÇ'ô1o>N‚rìcêm‘WyèSötÿP|îФF5ê׸-d#Ü·<±´òåúF¯Žã&(v¬Éü;p±|ï$G‘àCZ€œl¥8‡½¬'¡×‚±¡>ÄZ$-·åäU§•e—ó#lªE1¿z~{ ?Zm"}¼»Ø— +¸´ƒú/x#„ÄðiÈÛ +½x•\ç˜}ˆ_%^!ðe¬ + E{Z¾æÚÀÉ(_Qyv-<8žÇ%ëaØF â/+ºœ:ÊÅè}]Vh›o¶,Æﶙ?öe;iȔnЇ àø^1 b|ÃñDH¢£Ùz¶x¶H{}B•jü•q¤"|©ßvVé*òa´³ÑÒñ®`±-Ñ(øBŽHŒaÖóÇt䒬Á3!–¹c¤å¯5b\q4ñM ©Cï¢&bŒÊ¯É½ÃOäŸwPW’ûŠd6äψOzH‹’y$9Ä©¶ó/+ˆDmJ²ÊpåÛðÉù7ê7`¬šŽg»ÆsÕ¶;exאt†Rѱk´IcãæÆk@AÕÜYTºèT¾ÓUá[‡Ù®›u0Ωã`³-¥…×°' ÉÜ1ñ\ÊÜæ"CÕÙ¦¿QNÇ .)“ )bj|j˜¿Õëm¹OÖZŒ^s»ðû¨ìOÈ®­Wי< +ŠXHz’Öø=Žî/ÁK.q?éû©œO”LÙúüd;µ!ü’P"÷F[¨È4–k´†Å¹r2†ä·h„Æè?Ú`õ1ªÌÀ;ƒ_°©päw*Q—#Â#ù +Œ×QM¥î™I¿ÁSp}cž×½ÐpN¨s&zØ5²‘,7i9ÉÏb•ZxœÙ¦ß’ñÀô}ÉÆ4ÈØz5ýU iÊμ{¿)òû3D__ß±ØêyV¸ÁlŸÄ¢Ÿi,Qqé; ´pðBÀ¬²Å9=†ÕÌ@-Söže,œ¿Y[êåÆÝpÖ4+nkü乑–gªöÌh;_}xñ?™QàÁé~bÿÜ}qP¸ÐB™…ÛÌ!/æ³ÖbJùñR¹‘ä(¶ö­ µÀô:õçݓÿïO‘¿žñ\Ж̰^FSˆ¸ûW8ÉÉ抭˜X’’X]–ž4c¦]Øužwý¨‚RåöWýöù᧏áã±{Ðú¤sã!©n.DÝug(ƒ¿e£×o²íÇzpnÂÁfȎÙuRæñ•}ü–aTX|°r{Ž»N)9°gz"’%¤…êfEŠ%ˆ¨M·ÒoÏÚ’Ú +K[{I¡Ñ/¥5é4ð4D§J¿BjÍ-2Dfiäð^=^~ð«òàñgr±²OÙv‚´Çù¿8)!Kv +ÒQ¹AI-ºÐÒ·¼šq¯X1Í BÊãJd>:jüþ§–®­o…+ŒQŝµ†}2yvbv«C8¡©®ñ wD ªX2‚O-9MŒ#“#°!x[0MËV ñ‹Äræ­Ë/¸…·ïk"P¸¡2+§¡Bä‘H—pW­{_S濅%[ ó…W®çGås\`S±­%õhØŒ~çÿ±ã9Öx bJœÃÃH5¡ŸŒ>Ö~ ¦ˆw|âý¹u±cĤ]}#ÝVQùMz0©jE6S‹ ‰‰¨–¼Jd²-<»5'ƒàxޔZU÷[oތÈ6!1—ÜÍÅ£2ÃCÔ%O-‰÷Y)"#טz½žGý  MËât-£¿úz1ð³êùìÜnàÅÞܛ5*Â4ä„ãæmVX)c‰øî|IÏBXé®iRËLS sÏËÙYeñʋŽ<Íké EØðv5ž® +g~A·4K°Ã`ª«™>>¸ kÆՑìr'>»`'ã¬Ò2–Ú®ËpîÕüÃS¶}T*°ÔLRö,5¾øQi²…—®+Q’^†ïXÒ5:r¸ÌçÕjó,³qE/².¨¹7Ž.‘…´ÀÐÚ'sIun/aÏq¤Z<€Ví1ÌgšˆÈ9Ìå" ¿Z +û~йKÖeWÚdkâe«[àõñ…}Ý÷E‚;¢”þ0Gjw9+绉sò!=¢²Öè¼L¦.…vµukŸ^ª(!üÀˆOx#Ϟ]Nöš`V»T+dSvÞᩚ·E…zà§úÌ2±±Âì}xL3ÉB1¯Â`±›iA”2>pРDÜlˊP͝ýêÝ bNYÚWÍñ¬œ”Êd¬LÚiþ©bŽx¢¹>â1@Gæ÷‚vUÜ+9@àx…ˆkPãğ@ò|E¿ÊW'20édÍзrqù­ÂgG9'}æ’R 2³ãmc`Q·¢›N÷â`ÐÐðg·Aô´“p£Ó.¤…9)úhvþ)d¥uÞÒ(žèpff©Uÿǔ”Úà ›SMü±<À/DZÊ– ­ê81a”ƶ(§q蔓Æó’UªÝê(§%‚ÕWïÔÄ-ê\⨆®5ÓíפxÆF³ß¸àjŸHÁqCb> endobj +2886 0 obj << +/Length1 1630 +/Length2 19973 +/Length3 0 +/Length 20820 +/Filter /FlateDecode +>> +stream +xÚ¬¶ct¦]·%;©$óŽmÛ¶íܱ͊m§b;»bÛ¶*¶ýÕó¾}úô8_÷ŸîóããÚ sa®½Æ&#RT¡2µ7ŠÛÛ¹Ð1Ñ3rä-m]•ímåí¹d锁殀¿r6822' ‘‹¥½¨‘  4ˆMÌÌ&...82€ˆ½ƒ§“¥¹… €RMYƒŠ††ö?%ÿ˜Œ=ÿCó×ÓÙÒÜ@þ÷Ç hcï` ´sù ñí¨\,€3K @DAQKJ^@)!¯ÚŒlŠ®Æ6–&YK 3 +`fï°ù÷`bogjùOiÎô±„œFg ‰å_7 ‡ Ðá-Àèdkéìü÷`é 0w2²sùÛ{€¥‰«é? ü•›Ùÿ+!'û¿¶uÁí]œMœ,\£*ŠŠÿ;O #—b;[þUìÍþZšÚ›¸þSÒ¿taþj]Œ,íœ.@—b¦–Î6Fžcÿsp²üW®Î–væÿ™-À hnädjtvþ óûŸîüg€ÿ¥z#ÏyÛÿËêæ`éâ ´1£‡cbþÓÄåolsK;8†fEÊÎÌÀÄøo¹©«Ãè܀Nÿjå?3Cõ7 #S{;O€)Ð ŽAÞÞåoHåÿËôÿ}$ÿ7PüßBð ½ÿoäþWŽþ—KüÿzŸÿ+´¸«¼‘íßø÷Žü]2Fv€¿{ øgÑØ9ýÿ|Œl-m<ÿO^ÿÕZøïtÿ`R.FÛ"dgþ—FzÆ -Å-=€¦Š–.&3#›¿=û—\ÍÎèdciüËí¿Ú + cbdü/:U Kk»H`û· +hgú_+øK׿ògP’“S§ùß,Ø*þUO‡¿¹ýjäìMÿçáaa{€7;'€Ž™“éïýû›3«ïÿ&俀˜þó,gäâdéÐù[7#Ó¿ªÿßžôþ Œ˜‰½é?££âbdgúwÚþ§àµ‰«“Ó_’ÿµþVýçÍ=è4[]²7á ¶JÏüéR‹™;4!ªÓ×Ã>âPÚ ZTàÿ˾Û/=|‡«Òð½&„¾qŠû³ÍsñÔáã@šúp¤Æ¢;x™çKBÕ[€²IÞÁAsÈ _ŠøóL#ÚûjAvB›QýpwBIY¿ä +ªƒÅ æê‰ÊŸÄ­ÀôÑé‡IZ}úoäFÔÚÂÓ3ò¤ã§GŠÑá¡ÁîÈÞ\šœ8X27Dò(Ç\mµJïXtjÁÃx¡D©Ûƒ~#­çCR‹}K`a¨¸NmËcá±ÒòXQÆvï¡8Ãܹ‘↶2£â#Zd±Qu =ÑÕs±Ã8‹8œ‹N¢MxDOšJßr\íXʆíaë ©+m!Á\çm3(—kín Ûò®ˆ[†ÓNr`ê7û¦ß̉±¨Œ}¨‡KY—ð,(ùΑ(.^{&Ȗ+'dõ:2C5µ<ž•mzkJQBEɚ(øÔh,="Æ?^Ä™>‰“ lË¢¢~¥4ÈÃF²žÇV ›ñ󓑆þ8™‹·x&qº—€¿l\꺔{Qïš@hñ ŽGñ&®s开ÓĄÿ欯ŒÊz»Yd n¾ç»c—$ƒ+XdòèÙ]XiqøqEô#¹ô%™î‚bå¸öéʶ 7á(êõ¨Ó"¹a#cØgëX¢Bnä܃”@‹üÜËÐÒH©à— +Ù2ûIhçø–¥Fnâå9±Œ¹Æå†i©ªZ‡™Þ=5’ìQ[æÝђ}Ü{ô÷—åü/¯lƒ§*.sϼLh–>ÉfÜðZ&ˆ:aXsµ¬"FZ‚cD笞d’n—‚z­‰Ò>C”֝湬¾ÜaŠÄâ£Å•Ø—¸ìöT„TY®,ÕPýÊÐo;KÃ2jüUè.‹úž.r‰_oÞD€¿©€ô9k«;g×̀u!íÕÀ´‡_A«ÃÈ"fGräÇ\ÃbA"àÚ® þ\áð‡V܂²Æ‹ÞÁٔþ²]ß4ƒE´‘P7Fۅ¤;œiÞ~‘8€>hlŸ8µÃpž¹VHC"æSu~uÇ£ôª+Ìzõ†ÖX‡^-ìõ’YØdè£È§ Ždè FtVAøO?a°*çDô×þø¼K‚êôÄzI.U­'ìˆg!D`/sëAçOÔ9ï#¹YÀÃ‚Áñ£$¥wZÞ؅³|S´¤CÔÂ<Éñm â'­8‰- +>ÐLûóKÎ2­ù¸ã/êcÑ2dœf.í¸êÝnšŽ8 :ØÒÚǦ)¸3dЎV=ÿ›Ÿl=UnšøŒ÷íZvqŸé'A¼ëuÓ%Rp&+ˆâŸÌ!ÓÒÀ5©uú§›¤º^q¶¾Mñ-MÍsæ†ú£laW(4¿ªMúÃÒQfÄxÎõî<ýäw6)XÜ#ܽ¢ÊBô'iÇ þð¬ÏP¥•\¼ÍW] íêœL\X°WAÁ¿Êú(؎¡¨s@«gÉ +‰Þ€\Y¿WGÿ|»u¬¯;÷¢íQmoó_PÇÏ+ô_´ÕmX…;ÎÀ–œ ”¯;ª2¢(Y/<>¼†ÛŒpÉv?G:Û³_:Ջžz"I hX•L'±:a¸K ‡û nÞ `íÕllü5Öt[BùǗe›©Ñ¨ Ø>hÖ³ƒØ(–spVëMkóêÅ ó7-;/YŽ$ªêóšÛЌŒ4®XÀÃ5æXvK{C{ MXis·ÂÙ ó ´.!@:(u;|#Aü;Ù#ê4ÑlÖ¤g-lrâÀµ#‹mº.;<ƒ¶¦ûHó ½Êæv>f (éeLÉøZ2¶íJ#$gÄ:íó~À™È•I¡êˆu”8I¶6]s2™Ëž8>Ã/` 3HRA¡TjO‹#‰"Ά1ß ­è›¯Œ`狥&1ùìù§èajð=­8¿¥±ÙÛt ¾,üˆ”>±wV=žè¥m)•Ü4ÿdo ·,núáþ¢ê[ ¤#V¤æ5›´u΃¿E¦Gވ’nž6[9ƸøÇ8^F«f¸J@C¹¹€Ðñ±ß5 +¡FV'bI”:?ÛÜÙËm²`à¾Qÿ»Ë#ÀAa|3·ÛI½ +–£õbºÑ®:þŠRbÉ;ñ¬¶ö5O^Öv‰µÂ=el¶'ùQ™™Ví—i‡^€˜2ýTÚëw­zgL¢@-îßùäýÁ¦Ï¢~ò]MWž‚s&NԄo•¾fØÁXÛ´¾°ðèäðùpv±~S‘L%È*š(+Áã†õÒêýx&%¡ð‡2Ö;“ÿ={ŽÁæŒé#ÞåZA|ì©7"—>z2\¼Ó^ϟQü¡á+­k"’u¾¾0s=gtúý!–´‡ScðahõŽT‘¨ÐÓY[Ǽb[?U'+p_¦Ö+T×1S 8˜óA¥£G}Åcgœe`,­+1‹g—qM‡„5#©Äy£- TÐ=Ÿzfár»Èäˑ•éRtC7—’ZÍà;1ëëN5jÐ뜐„‡¶T\zP¤eÅÚ.Af¹Éœ;EL#q÷Ô³ãžbe«ªÖY×V± +A û 1=0X¬]j¢~2uõôFPøƒ!à$J q/ßtØÝÚ|/´½PږöMjÊ]ˈP[éì¶.už1ÛKœ"_ݖéTà<…pRùù±kÅD¥Dnôÿòlò$¼–«`þT…„+Ÿ‡º±q7ÙrGèçÍ7á« ©ƒ‡åà‡àª åÅ÷z ã OÒYù)ÄyÚ÷|ÒsÂ)Ù©èïùq“ÎþÉR¿·j«H7Ù=¬ÊŠŠgÖ_“„Í°'ك¶K˗,øµ½À7=X>¾"Øn¯!b·L%ª§Öpe]é0 ’)'ÃՒ Ñ4ü2ÁŸSw e¿¾ôŠœ¢î§ð#ʸ’­„š§¬ò±Ý»<ã"SÒiفdBn’æôFÐgÞLÏx4B씁 òA*òÕ×* ¯·weZî´Üª}T(¹×dŁ5ò¼[x?ÝråEø21c7Îo„«¿*ló Ê¿©HVÄ X¿?ÕÒ/Ã÷ÏOrÃÆ\H‘Úâøüz­xc˜iÚÎ ¤eŞÖk?+2â‘؈–š¨«ê³d <°ó¯ºxŽfZ÷ªÎ%ö£×‘¸-•ˆ°2‚˜˜5ŒÇ±,4ўp*`ZsÄm\,~çá®F™œûôW mB v¬…{½÷>yZ„Eˆ÷²u—j§¯ãj|ãHsøE’nÿzÑm&º­Y Ü—1Bt¯)“Ú´YSސ_ô8ë×{¤…áÊ32üSêªç¹™íô¤jS4 LJj–"H&Õáðæ¨=j ï ·ñª#î灄R€h.Ã8™^‰€WmÚ(L»@/íVRUÛ§PÊv%±pûNŠ-ì~ø,bÁ‹ –Ùh¢E艿²Þ°²Ö^¹¾<ŠBp(½u 5rù¼iÝä÷ÂùV֟ÃèçËZafõè ß@H4ßÙg:%éO&X‚o¼ùmuæ±L* ¤àãMòŽùù-3±(su½Ø¿û{ÖK'•à;f4lkké6’Ñì¢r +O€ªQÝb†Q7çaR%<ϟÎÿ&ö›Ì”N —Àk[ђ -€eÎÇ£éDœ°63“¶¢Òaª¡¦Øe$sÀˆ2¢®þȳ™6BAåLђŽÀ°SU×/iVÁ«ç³§qV8Èw̵:î]l°»Ùí ÷f½+’–¨€%<;Ÿ_ø'ÚӃ#s’‰VÞðð'or<ƒÛ“žM£í/ü1¢Øí°x7‰9‹8Àÿm#Z¿+-à^»Ý¥ÆŸ¥äŠfã©6 ÑÚΧôudº~»2Š/Ù]Sôø­i§¶ëd@1“„Æj“Ì̓¥­ÔÁž‰Ð0ú—×敹!âñ´ŸÁoc×v²¶OnŸþ"^¤O"‹xý÷ÍFnò,í4>F¾n#íþ±Êw®O"Q Ÿ%HëaߔrŒá í//nÙïç%81ä¸Ü.Œ^UœMHjÄääG˜ëv¨d ­¥foa¾—§Êç{G2y´¥æöHà>_5”΂½™Ý«1±_œ…oÏhÕJ/n¤8N!ëÆFßNÒÏF}Sq^–áÌCé=™‹¹n @E,Ôn)å¤#t‰šx[Á㙄ö¢Ü]RoƒÒ—|±1I!;e +ô8pOÞì{„õâ8d ÇÑ ¿=eAü¦*´a1åì”kùPÖð’ªZç’íèµ –^Í iª!ðNJGT ¥óñ†Ð?èöt:ƒ¬PO̓¸;Ï<ѕEÃBðñO/ÌåE|­N8é/t…­7«A¡kq„n[»=ÐwÚX5\\4Ě¼9ópMêÇ¡³{!Ûÿ!ôÃâZæ”™”ëD·Á ©*]æ«íœÁóÈÊ ,ë!pnÆÑ †Ï/oõ՛ÀƶüS˜ç6E"ª0·søÈ»€ñÒ;Â): Րn-—àN¡ñ읙F2³ÚBðg¤ DÙ¹¸d¤ìµ»¾Í^ûY¦á;°‚—7àùDµ8Fš7ý0黕,—§ñÎþtIÆy$4f¢Y’PPÃ'FÙïi?×Ò¼£ Qà·3& ÷áp`yxk‰`ÕÂq²³‰ßä׀ÊNcú…­&ø=¥ +}ô"š¡‚–Ë,#§җWÔÛöÿ§Æ‘vÁÝ­ 3aL ßz¯ÚÝ®:u£œµ’À˜OÏÁe +BøMóò¾+š‹äß9>=-áEËXJßGQwc?¤þ`€5o;èy³1'ðŠæëˆëeòŠ¯õ¹€‹qŠt¾2W½¡zšùÌàîmÆÖk8³¿ä×} ƒX_ž-™ªËU•M^ið{9!g®þ{^<çëÐüŽ”Óþ …€”ä·âÏÖIfO.ʵfþ§ãÝ퐁$ +,¿¸Pì^éVÒQ^‡ûßp¸2»õ-7÷–ÕWŽFތ2Jƕ¼6HAxóãþƒ;3¯ÐÙ~ +¤zªôe‰CŸ¼|¶8}£$Ž-…Ü•Ú•A®c'fxÙLR?ay¨!NñšG¯L½• ïŒsj¾œcªfª»Ÿá÷ÿ¡Þ»kÆz¹¤ÏàE7‹‡ŠBbé,#]¢ñMEîl˜ºÇ¶ƒHêåª%©³¡‚‚°ÅôµÕñ©BÛ`BU…KILᨦ kó*õD©¢¼õ²á¥«ó;•Ëhó+•~¿$Ú{@þn1º–R/€¸bã0ÐŒk»žØ}&Ög¸Ìû¦õ\ º‘÷ª%;t‹ç÷ف ©pe­ðIv’u¶ÌèXeƒÑcS%"ŒZqEOsêøë,,9^ˆ_ó™¯:/®$¥.öN2 ’S[ˆpœÎKâk?Âý}7 ¼‚W4†b×ðҕfgAî[Ps·)­¥t1ãɯWuÌK¯Óv׶2[ŸÚ¸…Å)‹… Éq¬¸ìVÕ(IAFGFÏßÇʹ põþgcGÛ¹rc®öÙ¦¾ tE¨$pÆLŒ?\R„ÒGo¨&¤™­øVÜvcÌì“?U.F~H<®Hw˜ +Ü5ˆr¬‘7¤?cß7òoV¡üi{œ© ðFÜ(£M–á/Šðèm½ÿ’pÏP#y™ç‰°f1Ý?>mÿú¶ûÌ·…õ䧲ŽÇ^ûxßt6^ß<¯ÒM[‚LäܼÝþMŒ”Ðæiɨȡp+‹ è]&ÉéÂüJ~µ¸-.dd™O +”¥…ºÍ­0dj²à,bùŽ¡Ó°'*´ »‚*ü)Ç$Šæ˜«÷eîk+pl‹5ùò;¦Ú‘MÏ8·´š¼Ž§Sìæ»Iý…îBÇÎ@?ÐU2F Ls +üœ¾<%¬Í>eˆQp<†§fˆcZ|¿òrm–ó®p à ÒD«-çx[®¯ ÙùööÚÖánv/ê!O›9WÔ59Ý,¨ò+2–LFÏº^+—nín>¦«¸ûbB*)¶- ¼p`ãò•1Dëɑvš2{¨páò- `ðFõ緕ë´ïy*ȘË2»/^%×w‰S:-ºæÆ‹Þu +n782:êÒ}Ö¯Ù!£ãh¯oý:â§Ó.›© +kõqËŒ2™÷»´³:<|Kv·ò¦!C§&ìzTñ~Öå¶L™Ô-³®‹R÷$ê*Wiº&ãv‡ý,œ^H+1Œ«Dió80Épuz‰E&e#2Üé¶\v@Æú“vTï&3ÚrɲëA“¶ S™P(¹æ +'XÄ5H¢?ËØÔѶrâ\ÇHŒ Éãnïzâèw©›!µöŽÛÃwd9Ì´ú¾”¦&ȧ£ôVKиDÌäñ69%GL§8¿mHÖ+-Ò(&Ÿ.ÉqÂ[`íÔÅeaUoÙÚÉînÝþŠ#—º9¬ÈÓj–Êc¡[äëØ[´äQQ„¡öKOwÔ TðWÈÅvïÁ×"GÉWIcðÃ;E¤»>ëö§®îEàÇ"Ú©9.\¡XxN2¨†l´-|3‰äNÙÒÛD«îrz訾^MÃ60ý`†Zðoqˆ Ñ+·i:Ù%ÿfösU¬¥ô”5¦aÄú ¡ÏÂ}`ÄR4F8æ‘Tš°¹<¸;b¹zÏÿ¶¾ƒÖÑ¢–Vþ=}I%99f˜Ý…0Lôèx6¸´9WÅ(Ùmû%ÒfYT¬‘Žœ´°¬?'ٖg‰½ tú×Sy1A e àÔЈ$±æ}?Î;È.ì˜L26I©§NeÂQä›×ËÅñ蕍ßR¨N¯;÷ùq¹+¸?kÉãÜĒÚ˒Ÿ~)šH˜?)]`qWýêákYµ¥™E‰ëJḨ}v˘-«ìŒÁë8<ÊRéALçµ\ ÕOj–Òf@¯Î¨[sïÔ 9Ûój}"P—¤9Y`¥îS§‹µ%u5ºR´˜u†Z²R~2•L+¯3Ñ[ÀÀ)\U?JÅ)ƒ0?² +âuÙ§.h¦Xb!8X—êNad4 ¸g,æ*כ {BMö³²Ø̃Œ¸bÆÿ•\³Bѱøä`Ø<×Kÿ˜S?ÖÔDVõH ¨„… °Vó ”DÉß²Ùù̽@•i­-ù/I‰yÿBÏMð×S~³.ž©2q~ "+ÃT罈È÷Þ:iQ²çŒ¶‡DǼNÆk_'æBâ§Ç\¢-ñã˜ùî>˜¿“y¥ã©#*®Ú„Í¢´£¿Ò±R[Ç9m\D9&ªI_„dz -ï<Ú@_”dC„jÙnÎ'Vgð\“gj%Ète9-ÅΨ®¡ùÉú'MDø~Ž¹ L®©>m¿‚?ç:IgÁ3pº":¼ÏN¤î¨{Ý*E?9ò‡Äþ­RMø~¹‡ m·‡,yon…åºmitýîC¶©= ðŒ.EºÎpªKIÁ¤~‹i+NÙm+,P .ü}® É™ +Hє4̍@Eð“ÂÛbk›õ¼Á¯ïwø® ‰p#ƒÕc[݇ŢÓÜ gTÀÛE6s2MNø¢ÓÀƒ¡Á G·åJ3Dϵ&°½o¤ö +v…+Á—A)9ºØØj’Û}@G.;y,à(`{돏 )©Õ 0îØæ6§@o~ŸR“Oß& Úá3µŒøýÌÓS–¢0x1Gô˜àËøÊþz™þH|ÅÄ;"‚Í´ÂGwŽØÝʜ÷=ø§|ª0Ëí^ö>d(S³ûv»(‘\IÔúÛOTªÖ²?âC'6eY1Îo¦k°s9çQ˜<0j)¨ðšoÂØC52‰îvÏeDxýn…®fÂ4·{e‚]…•™kP ‹¹Ä1 ÞÍPﯡÎÂá +“ÂVNc²z°F4]ä«ó#ŸèÅú°:搷·y¹xí»Ö »ém¶Ú¬µcð–•&Ò$:SpÔÎ&Pâ"ߘÌ* óp-]¡?¡UfBËT¦Ç[¨Z ¹¼÷š;¡‘V]f¦ý4®u¯8ÈpÊÈòç]´ˆhq…p­•^‹M×¾ÝÇþ¤áÍmñUd0úÌ„ÓŠŸ¤Eòs¬ ÷ÊP[~ ͳ®`$(ZØ+:ª§ÇT‘ØDôºf;=º¶ËËϛaŽ$\8X9(ïŒC* caî°! Eo/ƒsFE£é{Ÿ±mvk£k7ó×ç.ÄezYÞ¤X€¬;§^•³»)醞«ÞÏÁŸ™U¶ÒVíu3Zƒ?X_œlï¨:[%õ¹&ÒÇoÆ + +§×¶È]=jàÁïiª\’)(és§4O?5•‹á5Ý´~¨íæ§yç0ÀGÆÕ^srm9·HU)æ\BþØÑ5ƒ¹xzQ8b?ÄsÏm…\üə‰sýýlü‹ÓÏ.Dîspý&[>Í ºˆ8¬`}Úã0"l¢èG+°Sß'½ƒ;Äé馧 Añ›‘n\&‘ABÕ¹˜ê9þÌý÷¶½ÍÍé¹ÎT½Á<‘"]ølÞÐ*ÆzBÖ±½y‰ü¶Ð³”ùÙuGzܳtLaVxï‡1FfÛÑLLéªÅžÀO’¹¹å¹”äã|>ª0b—W{É^¯{¬Þq¯IÕ "ýŸ¥»±/a&ç=áL+ä±,N‡×ÇÂ>CvÕ;:\¸!bÙw7'‰ÝäI¬aA£ä斍“ž ¯°_ÁHá/YÝxø6#ì$sŸþŽçždö·ÖbOÊó[©ìù¬ü¤r÷%$CÜìÐL±µ€$:3êKú܊ÚhZ¢Ä—_USVOiODšX‚±l‘ S€ƒàèþ8‡dµîa”?&·ÃËÞâ#GP–ÕŒXÍÏÌËÒ$#¢p'A¬‘ð'ÊÌî aTÍÏj>_#KrQ“‰ª±ÌUa$xì7؛o·‘­Qd܄y¹ aïTÍÀLÁn¾Õu»êèh~EägŽµê;('’´Pß;†½Ñl!+AFöȕ8Hˆl 9•Šg_:_ŸµÕHªnö“ç\Aò'•†GK–˜n³( ›‡È#ñxcf‘{@ÐÖìg½#wÁêÞ€… ™Ëúg[ü$nòz]¦å!!kÔÒ/[ڊbZ‘ñúG­4핛ˆ‰*Jóy СfïÊ`5† žxøp:×Æ<éè­ó->\ipŠÙÍEy_Uû‘†{c--Õx߄Kåò$43èøª·2ëJ¸%N›»È¹áêX +Âê?e!—TâC½[¹ìGV Ï¶ÞZäӓ»‘†“,s‘,È9C4q0G|9ðù$ƒ›PS1ßÕÛ:¬eIê…'¡-…™‹«@"Ó¦26bæÿÀ谙Âb»9q̼8ðvZâ¤{Áå‰Jë筄¹–’†'=šŒxÍ>SuØáDÄ>8“|pŠæ’̝,õæê‹X6Êþ»ñ³Êºüþ6ÕBâZÈSßë  DtŽ sUWâttÊ°k¡ c¨Ò,.±Eã¼rWxý}ÜÃÏ"\·¶Ž´ +:ÆGPÚV4¦c•ÀÝ"; Õý}í_2Á'¼õ7 k8™I©ÙØЛ$ܘ[›{Xªxhž°Tý|Bƒ`îâ­/„˜êpiЎüX,L ƒI8& SS¤p;¶)pUÄä¬\5³mužë¥ï%ÙCE÷™Ê¢ŸøÚ³_íýop®©xZW]ÕkfãjùáɛEˆÝE„ÌPùü!$aoPt‹u ŸÉgöA&uŠíÃ÷ZA³÷§ðŠe3Bä ³²Ãë±:¸ë%ºfä+õW’¦.þÜ©G­¿sµñ Xxh¨«î)¨!‹pN!ê{#놬]¹9ÄânÖ+¥Ïžæm Uf±þŒ«ù³a«óèh¸æVÁ….Y¸Çn«'~q®oú¥‡uÒå+p‚Ž‰hêû —<ð¦QXXÑsøú‚Ü«hÎÕ`Ìà"8ގulvÖ5ò€Zƒ+¢Q·¯JšuàíÝÝæÀæîýÁðTÃ@)Šë!@Æ)ÁünaDáqù|¤ؐ„>>Íóµ/T_»Ã‰4Èþ.¢‚¸_ÙÁs‹V¬™µº. 0PדmkŠRaéêrº4/A.ÉÿLu®¥q‹QDًÅnJBVAc›9m§O­¹©UcÀàŸ¾#U,‰m6®ËïeÀ•¦Ä'ï:¡Ž CLt.”Iwña'´ ‡Å{)…aMîù™®A5OùóìXO¬éªò;S¬-‡½6՗Å0©¨%Ë1؍Øð4>+½rö?=Šoá VPj8Æâ…‡Ž¸$ÞE$ÓFèÃ֐ôZç²l«™à¬>Þë͟§³'¸#¨w2ÐdzEÐê§Qî& 2ªýú Ó³øDéþ{;¦$Èô’‡ÓTœƒÑ9$Î>|¼±Iᯙõ4S·zø*óïkZ‚՝Õým….áþRXŠ¦ö8;AÆà)Žï”6ý¹<‹&HùÖ傧¾ Í>òÈïã?~Ù´Pçõ˜ÎyàÇ?’í“Ò'êkÎ>ìøÜ6ˆ´ºþI) ŠôOçsÚ:†CZzTƒúF`&ט”oø–€Qç:–³7tê£ÊBö:„@RœY0\%ŸHØ.´Ì6Yjs®Yd´ärŸ(tB÷^œnl—jæ)_³º:ùRÎÙ±q1 Æ!ú^‚] ¤V½â7 +û¹ùRÔÀu©ŸÞ…eT†ß›4©†伔ïì:PŠçVA2þÝP[˜€øM]ó¡•Ñ´ó‹[½µbŒÊ¾‡,û¬õ8RÕBOšQ¿Átāð}á͊?j36L^¢÷P귟/VÂ( A 8Ïޜ5xàxඳ ÕåCÇúôÏ4‹ˆW_0NÖO=•¾ÔàëìéÎ?T/ûŸ¿ÌéZ—Π̏_ÖÖçUsÊ?%~V¢¸S^±®¹¦í *ñm2|ù–aÊÊpïEIGË,âÑl¢—ÆG#µR(¾`#_Ä |†â.ëk")¿Ð…þì ÷+‡0YM»3ÙÚf“hßh<ëdWèã>äÚÄN©Ô}Ӑ/Vº„ƒ²I?4 *hã7 ¤S1wâf’ëz§t­f-š¼D[`ûR¤ï[ jCÜ«X¯‰} +Ké©Ñ׏˦Tœµc +_pâ)%ˆ÷ ñX\~êP°¦ÛÇߣƒ*8ÊÈB{ä ‹Á¤ %úƒ"s@qžJm—â~èõq¢—‘T€…“‰J50p0l©ÜL º›1@Ö±”0:pDä6pÜAèpW,NO‘dиlõ&tHoLÎíí嫲 ê6x1i¥àt^m°$–{™ºy0ŸT`G¡s›Ýó·O”$jƒmñsDõ"sØmcÆ/”D9Y5Äü”¼Õý†Êm´_›byðórĝ6U1º35ÔcœóI®‘h™sB{²Ã·dŠBëjà¨±ó €¥\»™¥²´ão +™Ý`¶¶ŽÈ1¼.þå?\¶ôŒœ½Çg–Jv‘Í*<ªÝ¢¯1‰(>ž3ª8J¶G"{àw@ðÃÉ­·µWK-¡]%?„̏Cŀ¥°äÙF£S?®ƒ ºþzà…!YØŠ(BXÎKÎ-àÂ:·¦'G6Ÿqyñö‘<)Ü$|ŽÌBðw˜½‰-£Ý×]DÝî^]°¡½ÇìüË&ž,¶erRÉ`xKkû–n7kÌa£a=³vþÓü¾ä¯E„íi'ñuVþô,Õi òtWh_ъÊ>̵y1ä,z=âP™!œGøB«XŠ;ô°{å»`ϺL㇠»ýÏf!Ùªê);KÅÔäöŒjõÒ_¶ îò-zö~IÚíÙ´•ƒLKÞºN2JïÖfÁÉC2û’=SøCì¨*B‘s=–%ýWà"¤Æ‚Z‡?kë¶Z=‡2IIÉ_ +–×C&P¡žíÝìvÓÎʄº,5kJâ6‰«…)oiªØó4^ÈY GÖ¥±}³ýq‚€$-beÑå%̝IçŒôò ûHiW@m•1¶ÿ-ddü0]íPçêK;H—':9NhÒLýËZâ?4’H“’Ç@‘ÖWT¢üøÄ.õ´Î§yÁâëHU±p•è„Ør‘¸ã]ÊC{ÝK BᨙxxϒJ¸û\ò‹oj*àŸ´»%c ƒÒ®%AÃZéçi°Ì´× ® ǃ¿ ñ”Bll»×¢å€kü0ñ○£ï^Ä!Ÿ½óòûiÀ9LFhUlwôÂ<í÷’;ÌÏë2®…À;´§ˆb獬ëNŠêÞ?'µ-:|+9÷óZsË¡ÐΗ9¿ÙŒh£@-j…»:i ò^GøgŽa‚ÁÇöëéOÈðÍOñ¾ï€g»˜š´}u" xÓ¥îN´ðfnqÀíÎ ‘UxpÒÌ +ö́š°’J¨û½åÝÍÒ;ÈgBR`±E*v“™3µ‡zÎdfö°¸º"´ëóÌ£‡t<‰ÌµƒÂá í«ŸG +g@ä„טÛãú#ƒ& 8ÿõSxÓ9N:gÐó»s'…vú«H¡+æ3ö¸CŠ*Ÿþ¯O˜á +pöû”oc'ÇTËÚ?){kX©"åCrˆÛ-ÍéP°çwUŠêÑVì·W#<Ñ‹çŒ [ î©NBé'×RÚǂáf5€5·aÂõÞOÄh8Bð¼ä~…ðë®rž¾î£ýaóçCÄÁ®¾íÕº‡éëjYׅ®á@ÃR0¬Ñ»ÎӃÏ4¬™«Þ¾ªåYÏh<¹ÁÆ9Œj(b7¢Ã¦?Ã&ÑãH‡êáâ·"ç.v¼“iOúcø8•¯y’ÃqàÎ3Ä M¦ç¾ôs8³gAàT|÷œõ·Æ:0 ‡#c1»ëCÓl…ܼ$)ÌnÊ{¬D6N¦·?ؗ•s´XKtŸÄ…4FíWÚ=¢SCÏÚ©:9¼»]f^7ÁŽ½úTƒ*„Þ±;†hDþÊÉÅÒ%prúerߎUŠçÞ¤zªY† *»?/Ü¡¸¥mtž±Ï–U«&»Òw)ðÞË©bç‹þ +S8ù‘ T\±÷•ŠæpT¨.©áK†Ùx Kt(Ì…¿’¡’ŠN,™øyÔò}pQY™H˜Ÿ_[Õ&z€ aÜíEǛ;fCøX"ô…‰…TÖö$ÓFÑ­°¹¡…áÑVØð;ò>ÆÉ ¢¬§ß ÅøeŸþ;Œ—å¦óX5™?ÿ?“ªlA—¼ã¾¦z§iUjc?î6ù÷g¦JÔ/sÆÓC®¥µHˆ¥ ,’û(2ƒÛ^S£õ¹ŸñuJGOÅPÉ ÄO÷UØz‘Ó?ْyH,ÂÏÇ@K¤±­8®í8¶ÎÂTe­d Ǭ +¹ßí–’Ÿ½†êÌmê~\c‚]òd9µ§SÀWœ‹œ¬“µUÅìFα)X›Yê‹áj¸o fæc%vͯ“O킳%Ì·Šùú¾-LÆ÷RV êØI»y=yãã–BZ  ~2ÍÎÓT!^X2ƒcâ…T|Z—åS5E`z¬fèE3G}¶¥z ”±tººñt³°iItA5ƒ¬Õß·Oªf-–r¤XV;QYÚ)±ìk9ü_¿Ñ„Q¨Ÿìez3ƒö¨ëº1FÈÅ1oÄ,ß/Ua5T‡ù n[k¿ižóõ" ÉNj(9%ÓtRÍ°êŸÀoôDu·‚L$Ž}H©1g,€ÕyÓgìº%ÿºn1@‚Ñ!‘ô{UVªùêŸý9–˜¨?0,LëòEÚá››~BíčHZ™vzDÛÿ¥R5NE +c/Ɍ=S¶–¡è! Ëá©­§]¯õþ´kŠ.$ï]Ód,7½$Æ÷ÜÈ=ü8Ï$oîc='˵+BׅA½ã[ â9rÄÖüì֛_ âµoþ¤½j˜'Ä¡ÍÀàϫܽt=G*÷e¢ >æ§ëǬasëƒuºö¡u6ñ`µcUÚ>·¾À– ^ádi‡Ò-²79ÿvž™ìbÖʯ­ý ÑÞí]Ôº~çÛDɪ^5…•Ê·×ÞL'K€Éµ«)ŸV¼m÷0ÿÕSÞëƒÂj”oh—vݔ¾î'ƱËB¾{IåЪ’泫zp·v·Q™äbaY}bŠßá á%Òú¡«u¸ðìQFIÃö=SƒÆ.v‰yW"ÃÚ2í†ê7{ë“á wxÛ ¥B4„Øð<Ñ4^õþ: ².ü;¨È\”¾ø*˜`ç¤6“ºhBƒ,p)½Õ4„ºÐ}ø{îhœ#r½Jñ ßwî2›Ù >z‹’‹·KdÀœBºÍYrƒ$“°xˀCŸwK O“d‚áƒ]í@µ°V/Ž@"‘ÑÕIHÞüy¸iÏEœ†‰€™¥„¬‰ÌF8ˆ£”†ˆ “¤z6wïÔê Ÿê‘qNá×h×w2Rk4 ‹€G©IóȇlÒmXß}ÒH_@ÿ‘=WÔ%½ööÄkµùPí>¶™‰ßŒ1UÙ£ÿ× ß;Ÿ…°o§û,̹ꄞ}†átqFšr@S§{½#»b³þ”½ªh+çŒùÉòdz¶U—¨ô-‚×x7Xð#Úý’xë +‰¥’ ä„÷4ë“n%” {­Ü¾\§Ào‹šp²[èBn ¡]¼#£Bì¯ù“†ºÒË O§½gqkBC¬™OHÊW ûRQžIùì7F§ âzE šË‹Ù2 }íz\ÑE`x½Øò[3°ÙË}6°/JèÒí•éð´mÞ :C ¯*©êÂñ€ÏÁ-=).êí–E7š‰º‚r +óÄ^Øéšþ,÷1 ›OëØ4± 'ãm„¡kÓ×n$üwÞsá"ɛ¤q7iÌ®„êYW~á'£Ü󏂳”°ø5¦„¡©ÜºŒùæmÍ'ZHLÄ©Ö4‚~&)ç,Ó$Nû¬V2¶yíòê+?-¸7{Ñ´k͙÷¾ð‹¶îF`¦úÎÍ¿<²¿ð·f4WTqR ~}HbÍÝ»„–­:¿em£H …{~/Žù$d¯ÀÿLq‚¯k>†¾*3Óç„5Äôå÷V_AˆùLÄáM4Y:|g— ^‘ˆœlå‘$þ-ߺýîYKõ'‘o´*º|°ñRÁ,„P¬á÷Ðæý\d°Fªˆ5ÑSø_ÉòÿéíÉ '5Ú_”|†¥`Ü'Š3z&fjBÕåykº4 yþËQGÚ“UÕ5hÉÏåúý›§ŸRýj:¥8¥¹™nxt¨ðœœ/ÿ‹²‡@,VᤴFü­ã6 ßékÞ)w–Ã`wüì-·ÀyÞu8 ¡WòÌw;Zö¿ćÞóý±Ž\Èy²nڜuªC÷‚ÉÇóê«Î™½›*Wîy2£Áxw'N§gDeVKB<¿L›æ)ü œè/+?bUü"Ã2‘˜ƒ|¼.“¢Q‡ÄéL—¸íisøµBq¼ˆìÄ(µF k¬*“Ÿxˆ:@h¨¿: àâXЛ¶(,sÆ,fÙ&¥;>ÏüI ÕX¤öÚ=|cþZ¹9•AN9’û¾ró +¼ñ¼gqžÜ?¦v·^Ös9>>dßö°g\w™‚[¹;Õ·HGÒ2 h4^š÷é9.-xْ£¿75&ÏUoý˖›#'5×ÿ†¿Yx¥ó‚àÉÎé*±Ä¹!8­bo©ºý']&8žÄTËâ04{UIsSÆl›—6ñ1ìß|ŠðqÌ»¶LÅ¢EÕ¥`| ÐOCc±<ìWìcc͝áâTöSæa¢ë“îé%s’ŒÖPcraY*=B§p“X¯ñuÈ<·]öpyÛNÞ~ªÈá‰ÍÁåJ£ç,™•2WN ÙFF†•¤Ê}¹¥+(‡ºÈ÷§ ¾‰ zf^RÜû«„ ´ôu{Z„Þ÷o™vî…È_µä=Šå$/ñ‚ƒ.¹§¤RâÈ©¼¸#–äKæ7WºzC)l›ýVD‰·hÃØ\YœL®oü­ 5’­1ì”ül¹3c¦®~Ëáô.s›d…S—4SN…"©ºOFq[ò‡é‡mW雠áÓÖÎKí™[Ekš"¶ÙõæúUQìK»$x¢m9C•Ž9ð©.£±ŸE­4ßÐn¨”·TÛß«sZ:EìÏñ gV\Úù?zx¢©ÅM!Ë þåyTH¢B8·}ºzÙ$p¨¶8¬wAï‰ò7Ë sþ‚Î]L ¼‚¨B’‡u¡ª’ Üâí*0@2í¦ã™óö\šnÊÔ+ yOH¾^âlRyù+Õ«òàñõÚ±eà«‚ô½ŠmŠ¸^<~ä+¶ålãS5éÊ_¢ÇÁqûå›ãT¦Åùg÷.=xC4°… Î) ۛ>v¥‹,ã Ì`®ñqpxé)`U€Éä³D7øу‘…t–óºôvEæ9cé7xß[MŸe—5 Züþ9Ìgrœ½ë;=äòmÝðq¹Ý,€Â<´}˜ayœÜે¢zßQ +¹Ê³ŽAVÀàIÙ1á Ù?rÁ¸[JžêA ¿ìx¯±à$ T=‰ñ®ÜOYƑäP“à ÒŸô‡ë•"ód¨Š«ulʲ0…¯~D½›Q‹@m)`&‹þM·~[óÒyA¼ð1’íœÓ¨ÿÎåJ›4%<ŒHês)Äâ6ýÆØAgX©~V¦õ2‚'F› +lÁÌA*… ++J®2C¶¾„ŠžROeç_øÞ[ƒ*9G¢kjydÈU„ ­¦v£9à[ϲ!]Nj ể7¿Ôý³)‹l -טÛYnúÜæd¾ZÍè{™WxÎq +[­ù{礪µêUÂ3~1–𿦨=Ô$‰çCÆxµї9àš®MÁjh0XµÌ2HY¬Ó"öK1&ö,!?}üw(>ý øFðU±bQ¤U}dµ,ÖÐ4kòÍ¿ÃÙ`Ñ£+î@µgÑá+\õi‰2K&=èþ^v]+«Úúœ&t½-" iN›>ŸÝ‚…³'V1ý|æ‘gy/a›Ÿüáû~À :Øþ¹£¾Q{Å‹35™QÉõ{¾¾ ˜Áò÷QÛÍ.›ã‡ ¬ÅYÞ¤Òbj +֏îæA›¿_Ë}Ê/¾Ù 6=U®€ªÙ2‰[kã߸¬5Y8Yn±3Öœƒßë3îEðí…¿ÁçÇ7Õ;sir$;„ß«Çj^z>ӤДÛÿr=Oã€V‘'ZIx/MÙõµ¡õû"ÀâBžLVʋÓtØâÖà º|X?/b$Ï»êT&c?K£Õc˜áŸ4nGL ˆ*·: +àK$ËÔÍZ„`_Etý8]/UÇL)¤â;^øæV´ƒTÅ¢+ñ”6,†,x²_{. žó*]Š²V1ñ0ÏÊÕÃw$h*U! Á•d€:.êMkÅmsDàíz?S¡F"âÆ´R%çÆ4~k:®d©IC‰„­J^ø¸~Ætgdž«ãŸ;>P§_±Ù6…{¾å3²€hœÚøj‡EY3>êw£ñ´sˆ±%p·cd'eSˆíBöskÖà³¾`âʬëëqëìÎÇô/:V¼ÖJ‚±ª‘ +h/7_t?Â?Ycݗ\wP-~òН£igàòS·Zw9ÆãM¦ Sù(":Œæ!áßQ†^œoU„¤>/ÿ’DÙ† Jƒ®µ×mÔ²—kèK}óNj¡å…å©ïcXù´#Ž´U:Ýï†ï=ßI%×7A0RA¦^“3†¬„ÎMa5= yhc{&)?íŠêI=©>nI•µiu{FyzNwöaèíTD®.®Çp³‚NŠ¡Î?àÉbg2OÏX[0¦6F-#»l¿C^‘èO–”Ë…SBÿÇϺâB]yuO2­4q_õëÑuϺ–”ó,¬Ev‰Í ,<´Á +UØý¯V'ÖÊ?XüJ^˜zêñËqðÿdÚôÜÑæ7„.[ãu6ƒêHE$ńá ᥃— •3ð95"`·iòf÷_„ø“7’ñœøœ ý`©Qz6~ËÒ«.¥ï¥?Î,pá%)c²]O,Hî.Ý +öœJLísµQj8ËÞEJó4›mMêÁ–œ_Bä·Ôg8Å*>;¶èsËCö,ÌÁyØЕ-lz:;ÂHŸddd`Jԣ݃ÿŒ¨hhξ‰ç›CÊáNìç.š¶9¢n> ÜÊíguiÆFê#ã´ò÷êè˜A†àNè7·¢œÓ fâWÅM0 <Õ ì¨¥¿¾¶‡¶¹ýÚé Âl Ì%µß•ô†¦,¯c ¤Èêīв&ÔáO•±•Ow ¾ý?»jùú7(ìÿWY–Ì„Û7Ec꿱cû&%pZÓùA֎«ööREâµe&·’>GX+œ©,•ÖlÔC˜O'YnÆÅIގãº77˜‡CO·¿¨&ÐÍqˆ¥·¿ø2Ú±­tæ“AŽ9Y²•Öςuô˜–ê)g¶ƒüºÔhí<4h³øºÃÝz×Õ¦Ûy2}˜”Ðv§C£1ENuk(èÆD”J»_m¿jSÜvä0ÜýyÚ8l“ض̑ÛÀ‘´š¦aßNur,Ÿ7äÉ´•htÌ!"gZ‰V09®àïð=Så¨ ºrúy×6~võú‚ŒÀ")¯Å"©Ïô±æÁ€;Ápë3j™KjÈO$g 5Þ¿¶…zâ:¸Ý°Da’Sì G¨léÛr3Ó4.TVÇÎ-¦[³9%·Ò•°æ՞µföG©Šé¦a›,Gù8Cd+b‘U˜{Rë)l"¢Ø†‡Hµ#Jc¦œpþ*”í¸$lN¬éV&wÃn;éj³ìA"N€i€{íW·xÌ +Ч9„1%.™<¾|¨æ>¤°¬h.úiõ´s²wVa6˜¯uCîí?ß»O…Ðô í-Éàü"Gߺ}|Û Øx .*F؞£Õ•¢!d¤kĹ`ä%QdJ”V¯Vø_‚‹ÑÓlG¶±Pe¼ÅñÇ~âb ¤/fÁeµ"žŸ1ùäZö(À|æ“l$ÿ‡~"÷X-¡åÑPùÄÀˆš¾ŽFjF Á1X +ZÖqÔ÷ðk˜³L]xá2{A‘W¿Ì·_GÉHð@O9YI$Ñ܌5T&÷FÈQ¤?̄1ž6 y“ã\nž2M .º£>Nl%¨OåVþIËü QþY›|ü{–{mo¬µÈ»úqáéòÁ´Ðùç:Û˜¹ÃüÕc/û¾¬¡¬Í-Ñ˙#·ÜNy¡œÑ‘”E®§30mÛo1µ+eBÞuGÉ>Öþý«Ù(¯øäYê#•zi7m×Êl¬‹ÊÆ*“8Ûµ_Â)þI÷ÉÌ[#¬·³,湉pkïKè¯þ°îÀ°dˆ\L*‘³n潛\‘ý2®g;€´…à>¡ŽÞBŸÊ[e»YŽÁsŒN²aöqŽ?74"ß.£¹#R2Ü~ËÔL9‚ÁŠ¦’Š+Âë$©>ҀIÏ#J(ÊçŽ;¼¬æ‘{쓬÷Wåú"#ŵdT£–6oèW>îú;L— êà‹¤ÜjWýo:7òy¡oÍj!”Óöä <Šˆ¤—â LŠ¼6P5e.vHÁÃ?<Æbš'­œ”ã ۊû%DJˍÒ +endstream +endobj +2887 0 obj << +/Type /FontDescriptor +/FontName /SAGEMV+NimbusRomNo9L-Regu +/Flags 4 +/FontBBox [-168 -281 1000 924] +/Ascent 678 +/CapHeight 651 +/Descent -216 +/ItalicAngle 0 +/StemV 85 +/XHeight 450 +/CharSet (/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/a/at/b/braceleft/braceright/bracketleft/bracketright/bullet/c/colon/comma/copyright/d/e/eight/endash/f/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/numbersign/o/one/p/parenleft/parenright/percent/period/plus/q/quotedbl/quotedblleft/quotedblright/quoteleft/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) +/FontFile 2886 0 R +>> endobj +2888 0 obj << +/Length1 1647 +/Length2 14693 +/Length3 0 +/Length 15548 +/Filter /FlateDecode +>> +stream +xÚ­wctfë²n̎í/¶;NǶÑ1¾ØFÇvwlwlÛ¶íŽmãf­}öÙgì{ϟsϏ9Ç| OU½OU1ɉ”ém b¶6NôÌ LÜ9skCgG%[k9[.z% ©³¤“àSÇGN.ì4p2·µ1prԁÆ €…ÀÌÅÅG¶µsw075sP©*©SÓÒÒýKò— ÀÐýŸšOOGsSÅç‡ ÐÊÖÎhãô ñ?vTNf@€‰¹ ,¯ ))' —Sˆm€ŸE(8Z™d̍€6Ž@j€‰­Àꀑ­±ù_¥92|b : Žv@#óO7 ›Ðî/Àè`mîèøù 0w˜:Ø8}ށ“-ÀÜÆÈÊÙø¯>å&¶'dç`ûiaý©ûS°utr4r0·s|FUûGžNfNÅv4ÿTlM>-mœÿ*éoÝ'̧ÖÉÀÜÆàtsú+–!`lîhgeàþûÌÎÁüï4œÍmLÿ•Àhjà`lttü„ùÄþëvþU'à¿To`ggåþ··íßVÿ™ƒ¹“#ÐʄŽ™å3¦‘ÓglSs8Æ¿úEÒÆÄÀÌô¹±³Ý?u.@‡¿/ˆê¯ž¡þLÂÀØÖÆÊ` 4c”³uú  úŸ±Ìð¿GòÿÅÿ+ÿ¯ÐûÿGî¿sô_†øÿwžÿZÌÙÊJÎÀú³þ±gŸ‹ÆÀð¹k2€¿–•௅cnô¹X›[¹ÿwÎÿn­üGÖÿùïê„´1ýdˆž™íbsG1s7 ±‚¹“‘ÀÄÀêóòþ–«Ú¬Ìm€Ÿ$ÿ}¿ŸNLLÿ¦S137²´ù‹ ¶¨€6Æÿ^Ã'oWÀ¨&¦ ,!KûßlÛ¿>»ÂIÅÝøH겶Æÿyø JHÈÖ àIÏÌΠgá`úÆÏqäbùêõÿû7ó¿Î²Næn-&&&fÀçûŸÏ¿N:ÿ#jcdküW);Ø¶Þ +þR9;8|2þ÷6ø¬üŸç¿‡tÁ-/ØñZ$§¥8Uae Œ‰hõt1ƒÙÖªäçúVØvú$‡nq•ê¿V1ÔMp¿7»ÏÛ½íJÑì uaZQv&Ïsð½H©»sQÖ)Z9h÷üu RNÔ#=/æd6!¾³3©ím)*é¼BL´²:À\ÜSö ôw^AvïâÑfÆÀ’ó¸@ PDøÚgâñW-õŒF“•©/˜M`[!Lùڝ\øÔ|BU¤›ºA¼¹tœ×Ê#-³«ˆ'õœÇ†}— …©>¯a/+ò̺?ÙoŽ/€»[ø1&Ô®æJ­ýÕ¦n€vðšaË«d™j³ñ«êå¯2˜3c¦f',3îkpûp ~Oy?WÞ%úÕ[UÞÉÛ! +‡‹3«~âÜ!aË>1…zwÚCÝܧ°ëdsÈ¢¼ˆÄíÖ!¦Fs ¤ªúäÂø7ßi;©Çbº¯j{Nlˆ6<{Á|9A'š/!µ@“J{¼ÍlØ4•—\¬.k 'ߔNÈ\Pð~òKÿ¼áYF8ì)_ Y% ‡Ÿ"÷xÍIÜ~%°ö—,o5åÀ‡8Ô „e+ ÚViüe»˜§ýŒC§<à9ð0ÃIç µ(h ¶ÅaëŽéLîa:Xš×Ä{9„JˆƒÎnu‡0÷åS+ê u”’þ«»iˆ•Y…Œ ôEøô•Ý/Cdp.©Œ$<³—Wæ?>Ýn'IÝ5ÙwŽåˋ]ñr@jGÙÇ  ­<í^ÄL–0aGÞv6Ún-¨!­©Ä¡_ƒ4ˆ/ HxdS¨zMÝÖúj­…ëï ’•_ĄÐõ³6SÑ©bÿ 9ËÏ|¨íO¥è²,õØEŒÙè‡Ôlúêȅï âK¯¢Ô÷ƒ^„þ(û¼òg1ñƒã;!áeÅÞHßmÐkÅvø©†n†ï-¶ýz¾Þa…3v²ç‰læWmÊAÁ¬}] å:HŽ%’?òW[íT83„÷Ðɨš‡Yȹ‹0‹bœ%Ê~Ω}·ë5°¹nïúíä0eÙ·d© J»ƒx¦æÂã}Fm’(ÆõõjéšSê“4‘oT´îmü9LáâËxoFÓ-m,VòáB#0âä‡à~˜k Pk#Œßƒ‚|q„¢ºW<|„ÐÐpzª",ãzyƒTRo»—#òiŠ1õk*Ô[–ï+Ò¦¿ ó‹¬Avþ|ØîÒN飉[+%Vs® “£ApÖ·É(ºÄL`†è$ó4)l…Z4²N@ãlçHQ£‚ÅÙ¾«0ýÚQê–Jʀ쿑Íɗ\p§i?Q<­*çá Vÿñ ‡a:‚Ä '¢ÛíL#~y{^@MJú§—=#‰M—‡¥—w4‹ëª©‰Ù[NáIî}!„IìJ.©íÖB2÷ÅHûI¢ \gwËòb&øȁ¬)Y¬¸ºéý­Ë l^ù)'ˆù·ËWï÷V¼gL ˜ˆRj˜-*%¥î<áöR­nÏ~M+8ú"ÛK҇tV¦±³¥´1N ‚Öd)%Uj\-f2a«¾ÞGòàÊÊýîÖé~>·õŽ;8¯TvŽn¹×I8‘qØ(FXÌ/$Î7ò ðaó×¥Wý ë@܍©¯Ñ—EÂS—ÚîÜÑ£ºQÊ·¸±j0¯V"¯áYæsAfQʵì– 6ãIßív‚"W{ò˜¸ü¤¿(]–WQæ‚þÑ«`ž êE¢ÍR‹Èœ!_^Hú˱á\)‘…ªböäþ*ÊGc”%oê WxVá ÚÆ'ÞíAg1å@$CÔ <_·Šb*RâÑbC¥q(gd‹µÄÑè(e×m{“CQIÞY£¿®ÃŽ¨IUӘëŽÏNAlÑHur[¶¼êõÔõ‹rQqB<֥ؑGWÄg|®ÒßÉá”qï¾U=ѼÏh&?›Žn¾)¨ªªÁ¤®Ô­<5Q´)/{ +´ö+m0“rtÓÈž5…!ºG¸Æ)ušIp%!ïè"Ëo¬7[—ÜÈÉQmÓiR©óè†Ù¬²=ö×÷óÌÉ;©¼ïª·¾)‚ÓSþ*d²í³F:ÔåÖh´ c“ÆŸ¯¿¨*IQ-Q,çÌé Àßbñì Š’æórÉíp¸çnP=3Ê\Ñ^Ë°ˆÝ½'^¢¥_¹Ç'¥‡–¾é€Ù¦&“Æé£a[¨BMM²NÛ‚Ö +— +‹O’¡ðÖ_‰N¨™‹ó)ž’ë¿ûŒ77̋¸tn֌í®é ɸ4œyQŸ'ᓵW‚{1Šè-»^&Ϧ1p»`*rãæKó¶ïðk¿`0|\Ÿ‰Oû!m"ÇÆ"uìqNe]¦ötœ ÅîC¥ë;¹ðÔq´™fE¼¼²²ÉÂlL„ËëUQŽt£êOû÷•h/ي± Cíño·ïð-þ$¬hèÌ(fTÌÔ¼X(ϲ5¸šþĸ%­ÅîþR‡ñ„±JƒK +d¬¥Caj éhbaeö,Yð=ÐfÙFz˜:½?7j笷Ócò&´¼„ÆF=èÛµ–©gŒ g«òt;¸b‚ +_ Ïq,1K £¿$¨‘hÞ~¡MKt¸0”' ÄâhÝûm1êƒæél¤õK:÷ò;i?|Å×ÄmÃÄRA‰t‹m÷م›˜VföŒ†SØæëÕ'uÊÙ'ìN—.ӈì§thM¨ê]ãžr¡þÖÆ©ŸÛÓ¡Û<1X&°—ƒŽøx.0Ï"qìw™QöjFºè<¦$˜ËZ7=²_?¾§ÜæQ¸"sišwƒhKÍ7–FÕOšý‚§E{´”°|`Ž¶iâ²W¨¥§‘ºì=n+:󄺈ƒ!sOö-RùÖÿÞ~§²i¦´÷gl…δè"‚œƒPÀ+  ¯µ²ßjTr«}³ûÖÚ`aO-‹˜3Â6`å6ˆÂ¶zHÊ´Ù4Ü]¦P䏄É5ŸÏ/„Š ¤œobƼ¡½76ãª8t·O”ë{¡il†“`‡­‡ÍcÞV><±/r&ñĆºËE(ËÊ[¥Ãw¾ªh¢ã® +±ö«X]ôiVitڂ<—@ŸäBUjçÆ—$D œ…ür3 Dd,y»Ìáã)x““ׇC;µBÜâg¨h“¶ 'ßÞÃ{o‰Ì”‹–œÜZHÈPD?ÖC:Æv»¿HN(ƒ>n¿êʉFJ¯l´.ÛéoŠ÷ۊgù‘ë8¬#ê£D{äÒZëGËQÇÄv¯ñÇÔ¹¦m¿)BP׬@ݏüvvË.%-|£™Ño}£ã±ÝRdò •k`-¦¬Ž„oŽÐÃ{°‚ôëJZþ‚O¯«äâÙm-0ån‚¾°ÒϤQ™#„f¨þ×u“«ŽR4)—F«ßˆâ^»¢Q îªý0<úYöX¥É{7ti“Ý„.u€D™OUè£lça|C-˜9¿TµÅ&åÞî¬3 uBö^Ÿ,«³]ÿT±Åf-ȯ|\CæU֏ÃÀ“å}³É#„¤ú$ìê3®ñݧq¢ØO•nkŸÝ¼e®–‰±….„Ñk Lx!ê u»â”î‡Ó–ÖÒ×_ÆÃ!ÿhqّƒ‹ýOÍ`©ÿ¢VOÚ´‹Zº‡Ó¨dº«¦ˆñd‡àHfah¯® þ\iSƒÔ0ú …@V]Y:°l²–Û­ËÊNgƒ_+*{å°;»·6´=Ï󊵕'hT}öXǀè4Z½(Y«I˜/Ý ‹–³¥êá%´Óì{j¢îVã™lïT-bçµµÏÿ¡Ã?MW®7:¨Ù”]«ÉÕsÀݜžèƒ«c)öú%3)¦€o_²s²ìQ#¡K~·ö-ƛ°Pn-2¬cSc¥U^Ä\ c±×SE~Üf Cãñ RQB]ÃқT™ušN}:”îÎïF©L4 NF•×k–nÓ2w›c¤ø`5:'~EÃ=F ºv})–oÇGÊW­K­<`c2`y —e¡uNu-ŸáéýÇ#៕NŸ>vÍf¿\Œç³=.ÌZº¡÷ßÓrv|woæá›p‘JL?XŽû…{”­qE‹Ÿ\rLfÙ¬î—vùGÉPyÍ\ÅôߎÈÌoC +•«ÏŸ8á:¡b±©ºça¸éŒw×C¯¿–Þ¿ª:̝͚٨,b;‰¥ ÜxŽBÕUx†Ÿ­aµCHa}i)ij·§w‘̀ê[據ñQZb_…Žûñ<6}GF–.QåÛygjkdÓ§3¿óƍºÂF¢ïý–_¶ý“$J=a©ö‡Á+VrŽ¢üV/䇓å:‰`Kì—Þ²ŒÛÐ5ÄISÕ8;Õ)#ÈduîiçXº Úaâ÷תB™Q´ð©.©ÍH.j¼4_ˆë,âšâ¥c„rÒm…]bbi§j²úwö6?ÄŒzMé îkˆ… %PeI•ã;¤Têph@q/ð7²<îñãIۜ”þu«$Q¯µ¯JÐÎ|L?» ¿ƒ \‹’»úuçåW‘è +"ú­=ß³Ag5Mîç#''Z—‰$21mÉ5‚û²¨‘‘¯gûÄEz~}d؏ O‡3Pp¨kK]«þ›ÇÂÖ'âñeK¤#áÈyê âgÆëõHfß\b +$ã{¯VxäÓÝ ¸ï*X!&ìêŽ^Õ®°³xëk"MH;c$Õ}e¯»ß,)·• ¿äUŠ—1UY/ˆÃžÚNû3อHª!tþԗ7uŽ\ù©Lâ•ÿ’Ç$R;ê¨^ujzh¶ul:=ºÀ¦)g$=m+úðý ï´Á6“ð§‡äˆ%r«'¦º:w-h>O³÷cĪJŠ%Y‹¯]„Øû:M¿»bIÝïºÂd™¹!7 Ç¨.ýzþàZ,¿ê¡*wP³Q¬æ§#…Ûظö4¨ÞzÞCü#[ëã‚×::ãÙ.Rƒ¡ÍP'ú¥ÛOìêFpÙx؋™¼_}‰÷#GIúQð“õþ7¦cïoøB¨Ë⛞èdE³|äś~›¦Ø£QNNNÂFð)ˆÛõ.R`$5Ž_O—÷@µÛ­»*ê’ K¡QÅ䎕ZøÈNwE¸âÎãóë@mŏÚ%qgIZó(æþ\­i¯V“KΈrPO» +l™éBXl7g)ºÞ[IIÓëåЇÚù¢ùÀ«„‘‰øløÄ.?ÖM ÷Ô +’nëïë0Ìnrˆó§-Óóìx ”ð£Acýø-:Ù¥‘Ga×Ê/dêfi¹P².ª¥.©ÓÇnòQ0s…`…âè:B²<—ò1tƒÍ4‘}W`¶ KFŽ3?óÌ´ÌÕÝD© +A°ŒTßi¦ÌÜߟ’öýÔwo@I6I2ôœ|ÒþI‚Dçð·É¸QJZv¤¾øÐ"#.#æp ¿-õh0ο ¼òœmÿ]½?sžþ‰à©Ø 9J.¯dï]rï&Õ±l-B*k6"ÄÔZKÁJ~ødDʕ`ü½$4[ ýe Ž¡ÀÞé«o3j—ì¡C”/Ö$È õÄ«M¤”Ž6ÝÒTÊq0Å ‘Ó*ß‘è´èã^ÙñøÐ܉_—Û¡’B%g®õ€Y§êü[·J ?³ʨãk„_kQP#|.T ¾ÀBŒÿÄÁñ^*{¶ý&ùmBÏíà¢nu þW†¼àvü0A4ø}T½î°ô¯,iN{?ý€ð°#Þi¬ï±Þ[l’ä‘wl|ŠDGˎq ”TJ.ûÍlk_þPãäÊÇoªií5M=„.ñV݉ðˆ—ݘŲ؈©Ž…º3°;¿IR’Ä–&/ÏAꏲ·ä~w€¿°1égªI1s¨ámÚû{bN³-©-¤ 6ÂÂô3‹ù#t³C'ñ™-´¹ŠzµîTÀ¹ ΜUg“‰‚›Ž» ÓÄ'6cÁ ‡;ÒlfÔÐÆÒtѪÉh0ñ5u_éE$¿wS[†tmH´Oô’wø]¼–l-¤”ãÐÄ ;ÿA&î†ü©cÄƔߎi5¸Þ'UT¸@€Ur¦g0±Q®ï–ˆ¡É? +,@{žä мªoé {P–äþ)¾dõ˜6ët.9=±Ç“ä: +£zPþ&?v'\KZ#ÿu…í|_õ&l´¾k=.ۑ/„Q™¯á¼,‘c¦9Ñ Ñ91áú‘ ™n…CNClçw‡Äó9F¾÷®ÆÈ+oÁÏkK‹Ôèc™[6½oŠÚ@?‡ˆå¯#øÊØõ??ÈÍØ8tá3Ѫ?6§‡0g"?¸j› ‰½ÎøS&–€áÇ Äö¶ø ž™"ßíÄ·¥«Hñô7™Ù=,:þ€¥áºÇñ0"î¼Á·a=ãöU²ÙŠ’ØܕÙ!†¿X|ÏÓ¾tàæšöG}eä ýåkûÎyjw¾3ê|óB†ôG o¯ÆÑj¥›Úôd¹t{2ñ±)Ó¾Jr…ö÷½¾SáÖ…·€TÙIAiéiö7‡½8Á>üïÔ¬†e4®: `œ÷͙Š@xò›¶Ù>D´~vޕòæ<;’ˆu‡öìP…JÖß#ß;¹ÇÚûüæª+1®S)_9+Ÿ+‰¶~µ`^µ:>hÄPo0dü 6˜e5˜_¥Œt5H^3Ó•‘<7~eÑÃ%¯Ç·†RÍÅßú:yÐëkºEÌ!rÞ¶Ò!¼2B3–v¦Uî0!|i5ÐÌ3CŒÝíámY£Íå8—Ѷëy‘dƗöä~‹Oo˜ì¦öí¹pïeÖ+7±O“.¤ÏËã‡ÝÕ_ ƒ{ë¼äj¾‰s@#¥Ä¨ZŒ7£¹×áׄj»?5ED²ÏœÅþX2w‰ûzõx†£mˆ †Þó±u”’¡]ëº?áåÂn©EUb°0ýU߯ù„’}NyÁFø¤ä„æ÷·rCüiY*؝2=÷Á +•_K7lö[˜€JúîᑟÀ%.ïø_Ååù6NîxV&=DHÍü=ˆ)ëU°Kå49ßIÿ$Õ<8âSÁ ³?ËÑV@²Ýt»'If™@äúú}Ðï=_ëi&¶˜=Û^w?JAðtVÝ®‘9êc2õ|‡OQ'ãïœÄÆòj ˆd“açHl4>¸§ì}HìÏъé ËféɆGTöôäš=ßRÀ™‡?ð?{?BéT֔ܚlUg<ÿI:møóA¦RÖNìkÝ“¢gn]•Ræ~ø§D$ÀDj³uJ?Tx‹Ò‡x&Gp–à`Ü{ÍǛ苗 ëY ]zxˆ¿+öÊØñ2òR{‹~ é;)eLò’½cñ~0©´M„…`þV!¸E‡yp;#Œ’ª&:(_qh[Íêôn«+Eê<Ò+nÒ }.Y°ºs‰'Õ/ª»óë?÷}hHô_ªÂoF}阢ëÏó‹;s³ V܅ÍΥäÃ%]pw)4áÉY ñd¯Ãѐæ']l³)Íäu+AÇÞ/d‹msRõNyϤ‚¹ªBunÀº³àCj¹ž|§ țU‰ç0œTžòG}­Úq†Nàì~‚ñ¶@® õ‘¢™\ȚÙ¡Q(“ +äe¹0sö¯è Ñ†ÐÃE~3Ôï8Û·¢pŽ;ñ¬¼6Eã)·¶ O?øâÛYd&EÎ/Bb/.-ûû,;†yƒ¼æÑè„ÇCB/Å´/úCaÔ4Èj˜Ðèûà÷²ï– -É°>3 +?Ü¢(2Ê; šêõXÚ‹ËõA18¿Ùê„Èeۀ.¦“÷E;ĒÛHówô>}É +6Œ¸ÓÅþ“S9kKSjJÒ¾.Š²¦yƒ”ÌÒc•ïž ËNƒZ§Ö¸·B8›ÙpáF{›L%m¨­óg54(Ʀ½‘ÑF_nGIe‘ç=@.HÍÛ®²@Ðiè¼2§›N´A¥Aj4öȟ=«Ö馽§4ÌöÔº£`LŽ¼‡¼lUÖZþ°ã7·€,;&’Sž@¤åZK@y!ô©¥–‘ƒß„-HOêÕ~ˆJÓ1z&çÕ¶ýŒ%hø±VYTù F0QOòýŒi3œ¬}¦qjuÔL:ùëÒMw†2N¾äV9ñ”Î~õMFßܘ Ej6Úc5gÀ•ÌYJ螒`À™kê ¢3vìÕRí Ð4Ò÷(EH0Ž ošÊ(§þÉÈ]0ÊÌ&)õ32DÒÕ69F:ô5±Ÿ¬"˖W\WæŸbdÛuB_Æ<ô22%»DŒÍ- i&®¤šÍ&Ç9gØò(?B«¨§†­B¹ýŸŠoy{®`€^¼·}ÿ´ž%3EtÚjž×uˆÑ™—rqËÆ °#ΟýHÈòk½º »œi19ŒÈ³D™{fŠ>3¾€‚¨Yª·Ä0TWÖEH6[Ú¢Z×êÎ\-4^ÉÏ`}ähÎÃ˸óà²FÒ ûz;Ù?ntŽ”¬AsA}™ËÖ&„Ý1«¶Ù5=žµY-­HÄ?1ÌÔ%§Cݟ‚–½kò¦«j·‹¬\Q8&Q…„‚kY]ʀµ6MûƒnÝðB#±œ\Kͬ­ _b]ȀÉ}Kaø½hûbM¯½‹BÔ ÿb^¹çíΟÒ\M&¾]ëFno‰¯ÔÀM Zóqv0:g*kËu䎺LAŸs7¡ŒuôU2r¿K-՘€¤RÎtöù,cê VÏõH)—à†…&4/aÙÐlµ‹»+NrÁ;OþŠúQ¹Là³úç—W"&.CXk'>”ˆfáÙY ÆôÀ8s›±ÄÙxà#üz·˜œÀ€ nûc«iËkˆW%³ç¥ýoAôRl¥ZJY +,ê•BB’ó¢²Üôp- -ëZèqJ?ðg˜`=ž‹¸ùb<¬Rô°1±Q@JVòÑ÷˜¶Ö›}ÎT–À +”ë&å%í’Æazk‘g¨´îÍð‚^E7 +÷~¾W…tÐ;s•Ĭ…°CÙ íÆ}uÜÙ,”%¾W®’Á3 X¿ºC¢Š†"*éU— +ÙEÖ?ÿ÷x ÞY:Z|Ñ]2Á’/Ké1ͨ[ºñ}š÷¼SHš BwÌ NÞNgh™wÃľÉÄ¥˜®‰Î ò—^°N“ŒÿÖ¸ˆB$RÎ +Ô+œó » U“JziL넦¼–©ê´šã?ó|æíŠeS4sô”Õˆ)wå,šã‹ŒV둸öPÖQڗvëdèïÞ˜œÌœÀ9‰Ó!vЈKq+‹ µ “é +¹Äf±ÛÅhù ‰Œn÷&àk’d›GÖêÑ$׺H+F3ÿù²t˜}ûK5_æþþÚµDÑû¥–|ŽJ«Ù܇%*Ì;v9:u;7z RÞªV%´µæ4Œ)‡ë©Mr€ÚÆáâuW¾ŸDžÍ?+x ”ò¦pk=ŽÙªZ^\.Ãjpèåђ+æ´s­¥ò<»™v`:ˆè+4þ‡ë}c«øUá­v[Ïé‰}„ä5µ— 5ÍWЕ +gä–ÖC|w¤ßVU’•ÜaÚïÙuÓ³l3¨–ËíEù¶Oˆ*elÈ.PrÊw®ègµÄG3’Á¾)ÕKJ‰«ªúµH4=Ë ÐR>´¸Øò"jó<q”}¨Ä H[#t¨tâDLâ×=Òi×ÖÈÒÖýÍ<+Ì2‚¦=jàôWYD¾êñd8™M'߈´ ÉjýH Œ]Q²"d|ß2g ¿(4 ºJ÷À•‡—#ì(ÊWcsYx¤S¸Õ)l, \B ¶ û’5)ppXI^ʼV^—ÑóQŽ&¼Ïí&*øŽð„n`É{_ê5ædÞ­mÒ·‚)×s/;»Ãɦò®‡¹Z‰S›=u7ÅX‡3~\+»LÚ(ONa<àãÓ‡0¤Ð%ÝýP.âk,¶ûþł‹CázÏUNþTáwÉU‰ó˜ƒ¢m(JJÙ,¿{·4Ø%Ù ÐÍ‹•»W׍€Zûizΐã—Çrãw ÜÁʳEø#+i~œ˜è<—û”o~clÔò£YÑÔz;X—Féß×ì«¢o›ÝÌfµpÕ¼¨ [kX|!Lqίy|¼.¥Ö‘ûÜ3[¢‹=Ùµ¥sÌiæaÙ2ö…sFÒmj#ÈF.±Ÿ'çQ’Êl̈́£íz[ ×$¶Êø&¢ Ö"1®™*{Œù~.ƒ«œVýäè’C¹gn•ˆÜj-lY«ÅÍ%€›dÅPc7÷Xvð]>7ÛÝ4-¨”ý„‹@›;HÉÍÞ4ŽIS?b|A~.æÀÃeŒ±Íí @•çσ{ñþb¨¸¿7!؁¤>A³ûùcžÄëw<Û­¨³*¯H†ô["Ñ,ëOˆG „ÝRO؄ӽʵ“qï–\ÔÇ7ÑXþˆRóú=0ÙÚÐX±åv¤ ‰UoW¼yÚòæq’åý;²›iC>gá n/·¯Ë?nœmÑ^b#ŒuÑÊðE"¡Ç†“›ªPøì<ÓK*lø)ÕO¿[¦ßŒ^Ý×ò±jê€Q8ðÀ>¹{]… P¬Zã‡À<+ç_;úÆÕ Û; à¤Ìe…2_¶²k>rIâàƒ¶×/¼K%P¸Éâ~WÕöñ9¤8ל«U]“&´=Žªì™{¬Yq­6†¬Ï—Š©&l´Mñ°°t•J7ùŒÀ"šßUMA[áéÒ±k¾ @dɍqS"SK&‚p“Ocsγ¨,é¦fYkBa„ Eu€w$#yG1=ß}~3VP +€aßÉju1[wç9ýzƒ÷6QnØöEÝQ„CsÑXäwWˆ*ZeßĒ=¨Ÿ™%ºFªZôEYf«´¸xé9Q–äs¿QæiÜ!—TÆlµCEQFû5ŠÌê—ƲŽ‡@Ë՞ɤÈÙl§lWP-fÅ@ðHG܈ãVÖqŽJú#¹ˆÌÅr â#ìbù2?ÂÔr2ãÇ*IÆ{> +3è~¡Ã¾Ã÷±âšÞ#{—3½Š°³@&ÝGü7L5J©ðGÔÄÓ/”ûcÀÐÚÆ×µgcÆ«Øj2 òòUªNÝ9¨¤D.X• +íVÅÆWs©†rÍð"\Me©žfÊ«„•K\ +™›—këV†êZk ^ÊâÖĨ®ç.zYÌõ‚D-¢±° -ùp„P«Àðïs;\iTCøѐ# çA–Eªx®Y—Œvv»Ôpfe—5|‡+W‹U,UJGñ‚°‹Éo;!fÚsà¼wW3C˜),ÌÄjªÑ¬HÁx ¾Ûn6½ì;Ë®x9`/ØUºŽuH?ðv̄êîk‚¹ õ“ëŽö4Ä·¶§Ä¬WDŠ†cˆ¼#­Û®Òqå“s„&Oká<‘êÿIó„8b_w4‡"D¬[H”l´±œ)ûþ[|ã֌éR¦ÙzªWÍ­©d\öp+ß-€ÐBÿ4§šx«¨iuFN’ì£8åå`ø¾9žNw̍$b¨©ßRÄ¢ËëivëŠbéœsä‡2‹SyK‰Wໍ‡”Ћƒ¨<óm њ2™”[¯$¨»S;òÎrT&0$yx÷¼÷C¡C&@Þ]ÒïÀHZêœÎ{X’Ë™ ¡)G•¦Ñáz󻱐* Fè•/Èî×¡B3ˆ'|ƒ'™†¨k—5RðÄTºåyÚ^¨"i;ŸtÊ ƒ¥û’§=gçþ GõVÂÉ£Ij!OT†'™u|5Vé f’LtTç˜x}ˆÂx‡ +CÁÓ}dTzóD§;j…4bÌÈ[³å©f¸ˆ¹¸ÿk¥åÜ"Âݼá1¾’˜%ß ÒJ”ÄZëOÿ"¬fši•êȈ¤WŸ‹@œxPc¢£— ‰’=݇ð˜ò¢«ªb¢Ätnù:žyÊüßatX¬./|ÌùxT]öÚ8Ö¯Sõ<'ë™V|[É¿£«—y] +÷ÛVæ„r¼Ñ©—ôÌa7MrÙ˚BiǾ7®¸’ÖBXL‚Ç B£¢³6Dõ*ÜÝö÷n¡CßûôT)#˜>\’]ڎ’`ö+r¾¿Á Nó~—¼½ÐGáµ³=˜Ã¡ån0Ê+Ó°¸ +‰ՖÐÛ»º}ïõ**É|l’ƒÔƨ`¼ iùm?!'¡1óəæèí줣`”ÛJWî⠛y³©Êâ‚\ü9«ÙÒ6øÖlõ^4Ão7ñÂÀlúPúö7¢žpm3y1{íÖÅUùYún3”#Œ¯¡£ÝGû{·µ á{KnÿãU’@”!Gˆ„×g$+E§ñÊh®âöLøJÞÊÐ{”k¾Å'úüF’އʳ4¸¬šuÕOðŽ%ö©"¬&­ÆïUÌ +í¡Y#íë!Ž–Ëê* ©9z¦íߘ_Pf¿ÅjQQº›ˆ4{í ¢×À…ß T´%Ê0š]œ…§;éÔùÏÁ6N蛒ÚÝë.׆áQixº¢PfԖçë†~_“jªU µJA£äe'Êi; TT¼Û½_¢Éa0çȆItØÛ×ô‡ýŽóRÑÊ£© ZÁDS;V›†$þí°–=&Y™ ªöõĪ}Ñ<•$–ï4¤2Ÿ¾w¢(bHo@#Kï¹®7²ª-Å»;ZZuøÐJ½¾.h3Ùk!ÿH©¹FŸÆàpf*ÍýX¡Z/ã"vw¶È´‚:^Ւ݄ÓÈ^YC»³†_Òvρɢ”L*Ûíoóèèe¤n¹N¨ìZm*B0X‘ôêƼ5XÛtÂÁ°oVI ‰üöDÁ"tÜÄ2TS]¡.ZCk#žÑ¶uÛ¥z„ +ÔKë6+zMÞе ²ÜE/†÷æ\´«(v.Dü*ÈJ§ ÚHz4ÃWKnìç…Û ‘6ª>`‘kȲ%•»¬a۳јÝ+Ml+¼C°³Ðk'¯¢}Éq¯ÈÛÕ/ü¡DºŽ®K3•[Á§ B—Þ  :cÀ‰óÃNٛc«[Cð.HÞ/1íV%¥ô܂Hµí~k3‚óm±$ªI3=Žòã|Ç& +^ô!¥fßÔۍ¢sô=o(žûúÈi¸N‹¶`¤L£.²JâxЁKlGÏs¢B‚³’6}l¼tV…J<þ¡p¶ [ï ñ£ÒŒºº#þðCBfIJâ½ßËèw=1¶‡eZ['t§ÊæÒx­3S¡nu³‡ª8ææ¦ãåÛ{Û¿núª$Æß³….ׯ_›Î›“ñlîd` :΅ãG±‰ J¸l’–ùÕk_è~gÛ£ä¥RØtŸÍO„; ,ÕéŒøUCBàÁ“jºkŸêžK´3”¥.ý\XÎ ìŽ73ùâmÿ”/š Õ/«ÌÙqíê Öûð]eØFLƒüNó >i•ÜÒè‰Põ„—DÁÏÄúÀŸ;¤è…i…#h+æz-Öb{Éõjóv«“o—×ÙÃçt^‡Cø㨱#¾7_ ±¶#ff¤ä ÜDӝº‰$ò¹Ò NÉ>΅AyiOɐŸ3x¾Šr풷V^rÅÓ`-£E6±ë,ªØ:,5‚kqNíó×õ›­0\Tfe`=®iµª°f`xƒï V6Âý³û—ºMi·¬³>r=c„­ŸÉ¾5‹Ÿâ†EHvê€×\__ds€âÔ›uéëTÌR§e¤ ÜÓ³ŸÛ®ú™¡ §÷t G_yTýtí”e“Û4ƒlñvÆÎdù´ %eQKŠXÊOÞê•·GäzŒÔþŽ>IǨ(#FbadOVV.>fù¬°†„œ|é÷¹ûÐ_> ã_FˆÖÊÈXª<͜gUοxê”k©a´Q׉áÁv­ÈsÏþ(Z˜–´ñîšÚ¥7âŒa¶g+ÓYpÏ +.Áµ…aS³ eeBÎ/(¡Ëi|¸ª‰0ƌYP77g‡x¨ ŸR¥Ó´ à^óÆ ^32u¢•vg^;šlágȄ fbʼ¦•UE—MzïeæAc5ð»PV|"(q–[î}e^~<ƒý)Šó!>7ž)²¹tý4;E¸¦Ü\è(<­n$ƽ +J¶yg£ûkÅ—ÀÏkÛÇMŠA0®ÑÄ ×ÉGÑÊn<éÈό9és u N“1 í"ã67¬Î.¢Lû.b!’{–¿3î¥F]Z!˞äS]OûÊX¨j­äz{6ö‡mD CS!ÇÑN4\å¿8„#¹ñQ’ U‘Ib&òýÀݾÓAy†° ºä©z÷©èb4q\¸y@L̔8ˆ~5®±|ڕԼÝ>åEó‡TO_ªU­ûhGÔPçœt ¥Ù5ê6ìD¬‡¥ð†˜Ò™§¬’D·ú ·ÅóE#Ì=x¸[°u˜Rëñꃑ½óßáÞ­’¾àÆ kA:=ìÞÿ(AÓfGãjiLj­9ŽÇkª”Ï•¼žÕY´A·5uªó—¼°Î´™w±0B±°Íe/–:Ó(bgÝýÊø1”È|M;P¦òh-u]_uÚ *ÜÀØøá#s%J ÚjôxÄCóÃþ¢´JV( â»ßéÏæö¼äÆÊlAªkÉk¸4•]ÖJ7IF0=äùb:¯¤ zée8ô=°GÆ@ݯ$û7º=f钍2›Pð íœÉ:§ó¢z’§[ÜHá>]Ì7æÈ:û¸ +"¶ŸHƵšzŎ>H+?Žÿx+ˆõzU± #΂Ò;Ôd“ ¾–h ´°\Hþø *!¶ÿœ`»SdäeòµUø­gç—CòÍé\5¯äxöGOÖ?>ÄÛÀŸÁ“î®°C©kú”åûÍÞ_oºO¦‹Ây×°ªNCCH|¤7‹#éØHó½Ê5ܑ°ÑïОİC ·Ð !Ç:HÓ¢).âÍ CÊÖ?ß¾Ùx1+ÒuàqƒF•e-¢`û22^Q|U찋Þ@z5)P•vÍïözÛi+J~ '¶q`â ¬çàt^‘ÇSÓôò€׀h7u™?¡„êÚº˜nHÒÅy[Š”Še=aŽn‚ ѧŠÍU—OD‹SÖ˗)*F´ÃÈZÝ?¸+PÉØ!TžFU&£`AÃ/ÉñûŽx§2(Sý%£ÆºÂË0Y5¼èÄ4ðmÆJ$ÚAÂ\ct>!-›ì Ñ%Hj¨Ô Î%( +Xë1>e³Ø@H‚hH¼Vð¥9*âÁø‰—ÊEú×·ÌJ|¢S” y²øyµÀämõ¤¼¯o`ˆ-§ú§<°2µV2/y˜XôtÙA{±¶ Ê«gl…·]Ào3§MüçQ¡KHΏ '9üQӀU¾pÉÌA)çKº Ôhl®a2däq²Nê‘isoéÐÜ=«G^ =º­ëË´®o~çZÊÁŒÔQI ‰Þ+ f¯X]•óýªì=8ð|„ÅgÄ|™PÏ!)i^ƒÞØþs¤­^-pmD…"ÆÜ ÅþZÜã®»7»óönݎNØoŒþ¯ñf¡?¨h‚@$¦YÅooýVFË[»“4Cc¨%E&ôËnàDƒ¢ž‡ç>×fÑz՝âú ۖƒ¯¯X'ã¬êz¿¥›ªSèQñ¾À‰³@WåM˜&æ6·ÞÞµ»H„íxàÊËèÂ<¢°ùâ؏g,f!¦j…}"W63{˜™~EªYðÂÌ feÞw·§ª5S>¨µ:•Ø1uõU¼uÙaØðDŒƒWEMÿ®¯— L/ÆÁìå~©Óõé(~#z6Õ»2-¾Ë³äq›eTò(ûIz?ÀÉjgÝâåû´åXØvnZ@ÔµÁkÙ£2F9ï²ñ> endobj +2843 0 obj << +/Type /Encoding +/Differences [2/fi/fl 33/exclam/quotedbl/numbersign 37/percent/ampersand/quoteright/parenleft/parenright 43/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater 64/at/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/bracketleft 93/bracketright 95/underscore/quoteleft/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/braceleft 125/braceright 147/quotedblleft/quotedblright/bullet/endash 169/copyright] +>> endobj +727 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /MALUHN+CMMI10 +/FontDescriptor 2855 0 R +/FirstChar 46 +/LastChar 101 +/Widths 2842 0 R +>> endobj +919 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /BTJATV+CMMI9 +/FontDescriptor 2857 0 R +/FirstChar 46 +/LastChar 118 +/Widths 2840 0 R +>> endobj +728 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /SWKUVX+CMR10 +/FontDescriptor 2859 0 R +/FirstChar 48 +/LastChar 118 +/Widths 2841 0 R +>> endobj +1307 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /OPBINH+CMR6 +/FontDescriptor 2861 0 R +/FirstChar 48 +/LastChar 117 +/Widths 2837 0 R +>> endobj +2619 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /UYHLKA+CMR7 +/FontDescriptor 2863 0 R +/FirstChar 98 +/LastChar 117 +/Widths 2836 0 R +>> endobj +920 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /KKSFXT+CMR9 +/FontDescriptor 2865 0 R +/FirstChar 40 +/LastChar 118 +/Widths 2839 0 R +>> endobj +144 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /VUZELH+CMSY10 +/FontDescriptor 2867 0 R +/FirstChar 3 +/LastChar 21 +/Widths 2852 0 R +>> endobj +146 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /ATFWDW+CMSY6 +/FontDescriptor 2869 0 R +/FirstChar 3 +/LastChar 122 +/Widths 2850 0 R +>> endobj +2620 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /NSJEOL+CMSY7 +/FontDescriptor 2871 0 R +/FirstChar 48 +/LastChar 48 +/Widths 2835 0 R +>> endobj +145 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /JRVZXP+CMSY8 +/FontDescriptor 2873 0 R +/FirstChar 120 +/LastChar 122 +/Widths 2851 0 R +>> endobj +440 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /GCEPBM+CMSY9 +/FontDescriptor 2875 0 R +/FirstChar 3 +/LastChar 50 +/Widths 2845 0 R +>> endobj +1306 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /CDCNLO+MSBM10 +/FontDescriptor 2877 0 R +/FirstChar 81 +/LastChar 82 +/Widths 2838 0 R +>> endobj +179 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /RKUQFJ+NimbusMonL-Regu +/FontDescriptor 2879 0 R +/FirstChar 33 +/LastChar 122 +/Widths 2848 0 R +/Encoding 2843 0 R +>> endobj +283 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /JOTYEC+NimbusMonL-ReguObli +/FontDescriptor 2881 0 R +/FirstChar 39 +/LastChar 121 +/Widths 2846 0 R +/Encoding 2843 0 R +>> endobj +177 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /PHKQQQ+NimbusRomNo9L-Medi +/FontDescriptor 2883 0 R +/FirstChar 2 +/LastChar 122 +/Widths 2849 0 R +/Encoding 2843 0 R +>> endobj +447 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /LCGFKO+NimbusRomNo9L-MediItal +/FontDescriptor 2885 0 R +/FirstChar 2 +/LastChar 122 +/Widths 2844 0 R +/Encoding 2843 0 R +>> endobj +143 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /SAGEMV+NimbusRomNo9L-Regu +/FontDescriptor 2887 0 R +/FirstChar 2 +/LastChar 169 +/Widths 2853 0 R +/Encoding 2843 0 R +>> endobj +202 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /VFPSHM+NimbusRomNo9L-ReguItal +/FontDescriptor 2889 0 R +/FirstChar 2 +/LastChar 122 +/Widths 2847 0 R +/Encoding 2843 0 R +>> endobj +147 0 obj << +/Type /Pages +/Count 6 +/Parent 2890 0 R +/Kids [138 0 R 174 0 R 199 0 R 209 0 R 216 0 R 223 0 R] +>> endobj +236 0 obj << +/Type /Pages +/Count 6 +/Parent 2890 0 R +/Kids [230 0 R 239 0 R 245 0 R 251 0 R 259 0 R 266 0 R] +>> endobj +284 0 obj << +/Type /Pages +/Count 6 +/Parent 2890 0 R +/Kids [278 0 R 287 0 R 293 0 R 298 0 R 303 0 R 309 0 R] +>> endobj +339 0 obj << +/Type /Pages +/Count 6 +/Parent 2890 0 R +/Kids [336 0 R 377 0 R 406 0 R 430 0 R 462 0 R 507 0 R] +>> endobj +582 0 obj << +/Type /Pages +/Count 6 +/Parent 2890 0 R +/Kids [559 0 R 610 0 R 666 0 R 705 0 R 722 0 R 758 0 R] +>> endobj +801 0 obj << +/Type /Pages +/Count 6 +/Parent 2890 0 R +/Kids [789 0 R 819 0 R 868 0 R 908 0 R 953 0 R 990 0 R] +>> endobj +1061 0 obj << +/Type /Pages +/Count 6 +/Parent 2891 0 R +/Kids [1040 0 R 1083 0 R 1130 0 R 1167 0 R 1202 0 R 1250 0 R] +>> endobj +1314 0 obj << +/Type /Pages +/Count 6 +/Parent 2891 0 R +/Kids [1298 0 R 1337 0 R 1366 0 R 1419 0 R 1457 0 R 1503 0 R] +>> endobj +1565 0 obj << +/Type /Pages +/Count 6 +/Parent 2891 0 R +/Kids [1547 0 R 1600 0 R 1636 0 R 1684 0 R 1740 0 R 1792 0 R] +>> endobj +1825 0 obj << +/Type /Pages +/Count 6 +/Parent 2891 0 R +/Kids [1817 0 R 1850 0 R 1902 0 R 1931 0 R 1962 0 R 2013 0 R] +>> endobj +2077 0 obj << +/Type /Pages +/Count 6 +/Parent 2891 0 R +/Kids [2061 0 R 2119 0 R 2190 0 R 2254 0 R 2333 0 R 2396 0 R] +>> endobj +2467 0 obj << +/Type /Pages +/Count 6 +/Parent 2891 0 R +/Kids [2452 0 R 2513 0 R 2555 0 R 2571 0 R 2582 0 R 2592 0 R] +>> endobj +2609 0 obj << +/Type /Pages +/Count 6 +/Parent 2892 0 R +/Kids [2602 0 R 2612 0 R 2623 0 R 2631 0 R 2641 0 R 2711 0 R] +>> endobj +2771 0 obj << +/Type /Pages +/Count 2 +/Parent 2892 0 R +/Kids [2768 0 R 2832 0 R] +>> endobj +2890 0 obj << +/Type /Pages +/Count 36 +/Parent 2893 0 R +/Kids [147 0 R 236 0 R 284 0 R 339 0 R 582 0 R 801 0 R] +>> endobj +2891 0 obj << +/Type /Pages +/Count 36 +/Parent 2893 0 R +/Kids [1061 0 R 1314 0 R 1565 0 R 1825 0 R 2077 0 R 2467 0 R] +>> endobj +2892 0 obj << +/Type /Pages +/Count 8 +/Parent 2893 0 R +/Kids [2609 0 R 2771 0 R] +>> endobj +2893 0 obj << +/Type /Pages +/Count 80 +/Kids [2890 0 R 2891 0 R 2892 0 R] +>> endobj +2894 0 obj << +/Type /Outlines +/First 7 0 R +/Last 59 0 R +/Count 7 +>> endobj +135 0 obj << +/Title 136 0 R +/A 133 0 R +/Parent 59 0 R +/Prev 131 0 R +>> endobj +131 0 obj << +/Title 132 0 R +/A 129 0 R +/Parent 59 0 R +/Prev 127 0 R +/Next 135 0 R +>> endobj +127 0 obj << +/Title 128 0 R +/A 125 0 R +/Parent 59 0 R +/Prev 123 0 R +/Next 131 0 R +>> endobj +123 0 obj << +/Title 124 0 R +/A 121 0 R +/Parent 59 0 R +/Prev 119 0 R +/Next 127 0 R +>> endobj +119 0 obj << +/Title 120 0 R +/A 117 0 R +/Parent 59 0 R +/Prev 115 0 R +/Next 123 0 R +>> endobj +115 0 obj << +/Title 116 0 R +/A 113 0 R +/Parent 59 0 R +/Prev 111 0 R +/Next 119 0 R +>> endobj +111 0 obj << +/Title 112 0 R +/A 109 0 R +/Parent 59 0 R +/Prev 107 0 R +/Next 115 0 R +>> endobj +107 0 obj << +/Title 108 0 R +/A 105 0 R +/Parent 59 0 R +/Prev 103 0 R +/Next 111 0 R +>> endobj +103 0 obj << +/Title 104 0 R +/A 101 0 R +/Parent 59 0 R +/Prev 99 0 R +/Next 107 0 R +>> endobj +99 0 obj << +/Title 100 0 R +/A 97 0 R +/Parent 59 0 R +/Prev 95 0 R +/Next 103 0 R +>> endobj +95 0 obj << +/Title 96 0 R +/A 93 0 R +/Parent 59 0 R +/Prev 91 0 R +/Next 99 0 R +>> endobj +91 0 obj << +/Title 92 0 R +/A 89 0 R +/Parent 59 0 R +/Prev 87 0 R +/Next 95 0 R +>> endobj +87 0 obj << +/Title 88 0 R +/A 85 0 R +/Parent 59 0 R +/Prev 83 0 R +/Next 91 0 R +>> endobj +83 0 obj << +/Title 84 0 R +/A 81 0 R +/Parent 59 0 R +/Prev 79 0 R +/Next 87 0 R +>> endobj +79 0 obj << +/Title 80 0 R +/A 77 0 R +/Parent 59 0 R +/Prev 75 0 R +/Next 83 0 R +>> endobj +75 0 obj << +/Title 76 0 R +/A 73 0 R +/Parent 59 0 R +/Prev 71 0 R +/Next 79 0 R +>> endobj +71 0 obj << +/Title 72 0 R +/A 69 0 R +/Parent 59 0 R +/Prev 67 0 R +/Next 75 0 R +>> endobj +67 0 obj << +/Title 68 0 R +/A 65 0 R +/Parent 59 0 R +/Prev 63 0 R +/Next 71 0 R +>> endobj +63 0 obj << +/Title 64 0 R +/A 61 0 R +/Parent 59 0 R +/Next 67 0 R +>> endobj +59 0 obj << +/Title 60 0 R +/A 57 0 R +/Parent 2894 0 R +/Prev 35 0 R +/First 63 0 R +/Last 135 0 R +/Count -19 +>> endobj +55 0 obj << +/Title 56 0 R +/A 53 0 R +/Parent 35 0 R +/Prev 51 0 R +>> endobj +51 0 obj << +/Title 52 0 R +/A 49 0 R +/Parent 35 0 R +/Prev 47 0 R +/Next 55 0 R +>> endobj +47 0 obj << +/Title 48 0 R +/A 45 0 R +/Parent 35 0 R +/Prev 43 0 R +/Next 51 0 R +>> endobj +43 0 obj << +/Title 44 0 R +/A 41 0 R +/Parent 35 0 R +/Prev 39 0 R +/Next 47 0 R +>> endobj +39 0 obj << +/Title 40 0 R +/A 37 0 R +/Parent 35 0 R +/Next 43 0 R +>> endobj +35 0 obj << +/Title 36 0 R +/A 33 0 R +/Parent 2894 0 R +/Prev 27 0 R +/Next 59 0 R +/First 39 0 R +/Last 55 0 R +/Count -5 +>> endobj +31 0 obj << +/Title 32 0 R +/A 29 0 R +/Parent 27 0 R +>> endobj +27 0 obj << +/Title 28 0 R +/A 25 0 R +/Parent 2894 0 R +/Prev 19 0 R +/Next 35 0 R +/First 31 0 R +/Last 31 0 R +/Count -1 +>> endobj +23 0 obj << +/Title 24 0 R +/A 21 0 R +/Parent 19 0 R +>> endobj +19 0 obj << +/Title 20 0 R +/A 17 0 R +/Parent 2894 0 R +/Prev 15 0 R +/Next 27 0 R +/First 23 0 R +/Last 23 0 R +/Count -1 +>> endobj +15 0 obj << +/Title 16 0 R +/A 13 0 R +/Parent 2894 0 R +/Prev 11 0 R +/Next 19 0 R +>> endobj +11 0 obj << +/Title 12 0 R +/A 9 0 R +/Parent 2894 0 R +/Prev 7 0 R +/Next 15 0 R +>> endobj +7 0 obj << +/Title 8 0 R +/A 5 0 R +/Parent 2894 0 R +/Next 11 0 R +>> endobj +2895 0 obj << +/Names [(Doc-Start) 142 0 R (GFDL) 290 0 R (GFDL_GFDL) 181 0 R (GPL) 212 0 R (GPL_GPL) 182 0 R (group__Datatypes) 512 0 R] +/Limits [(Doc-Start) (group__Datatypes)] +>> endobj +2896 0 obj << +/Names [(group__Datatypes_g0764a0e607ec4de08a53e6d3b109a714) 679 0 R (group__Datatypes_g0aac22e2dc312e8c41418dd8d59701f8) 716 0 R (group__Datatypes_g12c368fa0bdd20b907d9ab8e92e999d2) 618 0 R (group__Datatypes_g13f1f84a46d70b91637cb9d6af54af6b) 678 0 R (group__Datatypes_g1822baf29ede5879f1c6ed77f0ca5984) 524 0 R (group__Datatypes_g1fd59c6502c8cbb9dbb802e4af34c940) 709 0 R] +/Limits [(group__Datatypes_g0764a0e607ec4de08a53e6d3b109a714) (group__Datatypes_g1fd59c6502c8cbb9dbb802e4af34c940)] +>> endobj +2897 0 obj << +/Names [(group__Datatypes_g25f4b655851f0f561cdddf94f667e833) 518 0 R (group__Datatypes_g2f2a1aa8fbda2e53218cecba593f7427) 625 0 R (group__Datatypes_g32ce20a24d131c3ec8274b907176bfec) 514 0 R (group__Datatypes_g3b2653e715f41511257a84f35be7fba9) 572 0 R (group__Datatypes_g429b479c97f57c41763a019c2dc5bf10) 565 0 R (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3) 520 0 R] +/Limits [(group__Datatypes_g25f4b655851f0f561cdddf94f667e833) (group__Datatypes_g4384ab8e17fe9415f5146ece650cf9c3)] +>> endobj +2898 0 obj << +/Names [(group__Datatypes_g4aa820c3f87b201ce364e854aa37dba5) 574 0 R (group__Datatypes_g56026e685fb0fe336a5f346580f84ff0) 677 0 R (group__Datatypes_g56e2574a7d2f006333151867599e8fa3) 614 0 R (group__Datatypes_g576b0ae433a83ef58a3c174a86623582) 629 0 R (group__Datatypes_g5a7338130cf6d33d28dd40ed560a24d6) 523 0 R (group__Datatypes_g5b805182b79b6fb873d0624f7dfd2ee1) 692 0 R] +/Limits [(group__Datatypes_g4aa820c3f87b201ce364e854aa37dba5) (group__Datatypes_g5b805182b79b6fb873d0624f7dfd2ee1)] +>> endobj +2899 0 obj << +/Names [(group__Datatypes_g5e128d772c07f54f135cac19e9a6ffbe) 575 0 R (group__Datatypes_g5e59406ab43e2f1851ea2e066137b4bd) 573 0 R (group__Datatypes_g6069aff3ad06a502f746df4adec1c16c) 567 0 R (group__Datatypes_g64dda1bda497aab131fc204ed9e55894) 571 0 R (group__Datatypes_g6d1de7e82c3d57a0a6229187078537d7) 627 0 R (group__Datatypes_g735949470e98393af90b12f534b06cba) 711 0 R] +/Limits [(group__Datatypes_g5e128d772c07f54f135cac19e9a6ffbe) (group__Datatypes_g735949470e98393af90b12f534b06cba)] +>> endobj +2900 0 obj << +/Names [(group__Datatypes_g747bcaa4d01a8065758096b1ff0eb551) 566 0 R (group__Datatypes_g7593947fa164900140d09c08b56c6cd1) 676 0 R (group__Datatypes_g763a5fa98155383055703dc08cb3e11a) 696 0 R (group__Datatypes_g82657533544652eb3ec1334a72da137e) 623 0 R (group__Datatypes_g841003bef28b1052aa2b5297a529d4d8) 714 0 R (group__Datatypes_g84f27605574583d674403f6d71a73a24) 521 0 R] +/Limits [(group__Datatypes_g747bcaa4d01a8065758096b1ff0eb551) (group__Datatypes_g84f27605574583d674403f6d71a73a24)] +>> endobj +2901 0 obj << +/Names [(group__Datatypes_g88e874dbd26b94133467d81b006f0c3f) 562 0 R (group__Datatypes_g97b246f11809448c53f089779c0019a1) 620 0 R (group__Datatypes_gb49861123b31a74dddcdffb4b8fd110a) 613 0 R (group__Datatypes_gb9fc89c0e89d4487a1f69a26849b682a) 710 0 R (group__Datatypes_gbc52e1474c4b78458b4c13ddbfdc8e56) 621 0 R (group__Datatypes_gbf20fcbeb06790546a112b72eb0811f8) 564 0 R] +/Limits [(group__Datatypes_g88e874dbd26b94133467d81b006f0c3f) (group__Datatypes_gbf20fcbeb06790546a112b72eb0811f8)] +>> endobj +2902 0 obj << +/Names [(group__Datatypes_gc0d389ac714f0d4d3e6950fd692e7443) 581 0 R (group__Datatypes_gc37b94ca7dc0c8bb9797e6d91e16492e) 680 0 R (group__Datatypes_gc803b1dab9dd0072acb6fdda204efd26) 568 0 R (group__Datatypes_gd55dee4843ce4694afab11a60f16ef40) 522 0 R (group__Datatypes_gd8582d9f10213d638e87de8f0aa91a01) 569 0 R (group__Datatypes_gdb1edf876e8c62fb7d2630a9280224f1) 622 0 R] +/Limits [(group__Datatypes_gc0d389ac714f0d4d3e6950fd692e7443) (group__Datatypes_gdb1edf876e8c62fb7d2630a9280224f1)] +>> endobj +2903 0 obj << +/Names [(group__Datatypes_gdc14acd60d7235a72f88850b9a917eca) 675 0 R (group__Datatypes_gdc58d1f680927df3786f41bdb47fa26b) 517 0 R (group__Datatypes_ge311117a92fca76fc66fe3442ff6d09f) 715 0 R (group__Datatypes_ge439fa617415f2153f4793041c41bd9f) 712 0 R (group__Datatypes_ge50df8ccfc72a20b58ab7854ad2ccba9) 515 0 R (group__Datatypes_ge5679e4f41db32b7b91dfc81574fc1d6) 681 0 R] +/Limits [(group__Datatypes_gdc14acd60d7235a72f88850b9a917eca) (group__Datatypes_ge5679e4f41db32b7b91dfc81574fc1d6)] +>> endobj +2904 0 obj << +/Names [(group__Datatypes_ge8610cd48952cf1dc71b525235f6f583) 577 0 R (group__Datatypes_ge8e2db00ec6575b865057ffd3195327b) 674 0 R (group__Datatypes_gec4f5c405067bcd0483d84591bc7c48e) 619 0 R (group__Datatypes_gedee0800f6e695c36ace737095ccef5b) 519 0 R (group__Datatypes_gef15021f65d2810602a9a1bd06fc878d) 713 0 R (group__Datatypes_gefc9900fe07bfdee6310e4705ea0bfec) 579 0 R] +/Limits [(group__Datatypes_ge8610cd48952cf1dc71b525235f6f583) (group__Datatypes_gefc9900fe07bfdee6310e4705ea0bfec)] +>> endobj +2905 0 obj << +/Names [(group__Datatypes_gf02dc1cffb4d3d79720ebafbe872be03) 616 0 R (group__Datatypes_gf1c4903edb1a626a36a7220038f963c4) 516 0 R (group__Datatypes_gf2faa73b338e8563f6c022739e5ecc6f) 631 0 R (group__Datatypes_gf449476be1ec42bab45fb86e7478bdf9) 687 0 R (group__Datatypes_gf78df97484e374abe5d4e0f8973a622d) 580 0 R (group__Datatypes_gg5b805182b79b6fb873d0624f7dfd2ee13e5170687052e3962de866e2ab44d8f8) 695 0 R] +/Limits [(group__Datatypes_gf02dc1cffb4d3d79720ebafbe872be03) (group__Datatypes_gg5b805182b79b6fb873d0624f7dfd2ee13e5170687052e3962de866e2ab44d8f8)] +>> endobj +2906 0 obj << +/Names [(group__Datatypes_gg5b805182b79b6fb873d0624f7dfd2ee159042baec996bc386154a1825ad56de0) 693 0 R (group__Datatypes_gg5b805182b79b6fb873d0624f7dfd2ee1a05a8932097b094ca179e99e2d80b6ae) 694 0 R (group__Datatypes_gge5679e4f41db32b7b91dfc81574fc1d681067f9cf8984d1b3febca4488a137e1) 682 0 R (group__Datatypes_gge5679e4f41db32b7b91dfc81574fc1d69029c33b6876c560bf78b5b86d0367c0) 686 0 R (group__Datatypes_gge5679e4f41db32b7b91dfc81574fc1d69e4eb4979711bf6699ec8e0f335de476) 685 0 R (group__Datatypes_gge5679e4f41db32b7b91dfc81574fc1d6a166787e251ef2cbaad9213d8e9d2653) 684 0 R] +/Limits [(group__Datatypes_gg5b805182b79b6fb873d0624f7dfd2ee159042baec996bc386154a1825ad56de0) (group__Datatypes_gge5679e4f41db32b7b91dfc81574fc1d6a166787e251ef2cbaad9213d8e9d2653)] +>> endobj +2907 0 obj << +/Names [(group__Datatypes_gge5679e4f41db32b7b91dfc81574fc1d6f8c3e04d66cd611db5efcd92a6c52425) 683 0 R (group__Datatypes_ggf449476be1ec42bab45fb86e7478bdf91304ca7fa8d3e734d1677709a37d5d28) 689 0 R (group__Datatypes_ggf449476be1ec42bab45fb86e7478bdf9132c76cbee67b5bc2ac9e09af9c68c4f) 688 0 R (group__Datatypes_ggf449476be1ec42bab45fb86e7478bdf9b32d9464a7101eb1893562646a3cdd1a) 691 0 R (group__Datatypes_ggf449476be1ec42bab45fb86e7478bdf9fdbee5cd06ff135cbf9614b661c9e923) 690 0 R (group__Error) 448 0 R] +/Limits [(group__Datatypes_gge5679e4f41db32b7b91dfc81574fc1d6f8c3e04d66cd611db5efcd92a6c52425) (group__Error)] +>> endobj +2908 0 obj << +/Names [(group__Error_g0c0ab09a97e49f85f42c966e14cfdee6) 470 0 R (group__Error_gd6765993c08a2ae2f0ef377f822f4d33) 481 0 R (group__Error_gg0c0ab09a97e49f85f42c966e14cfdee603b444004b1031ddb1a51289b9d83106) 479 0 R (group__Error_gg0c0ab09a97e49f85f42c966e14cfdee60860beb1b1c54c9f774b532d92404992) 477 0 R (group__Error_gg0c0ab09a97e49f85f42c966e14cfdee6093ae02f8ceebbc40321d1eaf186f726) 473 0 R (group__Error_gg0c0ab09a97e49f85f42c966e14cfdee66aa28e72200f879cbb83a36b60644fb2) 475 0 R] +/Limits [(group__Error_g0c0ab09a97e49f85f42c966e14cfdee6) (group__Error_gg0c0ab09a97e49f85f42c966e14cfdee66aa28e72200f879cbb83a36b60644fb2)] +>> endobj +2909 0 obj << +/Names [(group__Error_gg0c0ab09a97e49f85f42c966e14cfdee67dae659f72f654afae1c5c6f331192a3) 478 0 R (group__Error_gg0c0ab09a97e49f85f42c966e14cfdee68c65fedb9893ebb49394a3cff2f19a49) 474 0 R (group__Error_gg0c0ab09a97e49f85f42c966e14cfdee6b42a97917f263e8305d561f52cbd9c57) 480 0 R (group__Error_gg0c0ab09a97e49f85f42c966e14cfdee6bd22c4eaabb49bcb6c654a25e402c64a) 476 0 R (group__Error_gg0c0ab09a97e49f85f42c966e14cfdee6f29a62bdfcf44dbeec14afb409035438) 472 0 R (group__Init) 381 0 R] +/Limits [(group__Error_gg0c0ab09a97e49f85f42c966e14cfdee67dae659f72f654afae1c5c6f331192a3) (group__Init)] +>> endobj +2910 0 obj << +/Names [(group__Init_g4af2931282f6a5f1b3444fb8e833d6a1) 396 0 R (group__Init_g635128363efd9f4c8c63e21702f40183) 397 0 R (group__Init_g7c98bac1ccfac398657571409a3fcd9c) 395 0 R (group__Init_gfdb2c887a3a2d1daf54a764d0d7f7f76) 398 0 R (group__PPL__C__interface) 380 0 R (group__Version) 415 0 R] +/Limits [(group__Init_g4af2931282f6a5f1b3444fb8e833d6a1) (group__Version)] +>> endobj +2911 0 obj << +/Names [(group__Version_g63fef7041da34ac5bb372a2535d99377) 445 0 R (group__Version_g676f27ad949159a3b79577f78870f60f) 438 0 R (group__Version_g79bd3696a302bb721ef8168fa5d650fb) 420 0 R (group__Version_g7a529f51bfebdd4b3e69c866dced9bc1) 433 0 R (group__Version_g8458e58a5e857de11c35ce3076a70ab8) 418 0 R (group__Version_ga50f472bf6d1869a2fc1500d2fdf8213) 437 0 R] +/Limits [(group__Version_g63fef7041da34ac5bb372a2535d99377) (group__Version_ga50f472bf6d1869a2fc1500d2fdf8213)] +>> endobj +2912 0 obj << +/Names [(group__Version_gb51f10ea37de5299e9bc840afa206d4e) 436 0 R (group__Version_gbadfeba0a415d210cdd6d7309365e800) 419 0 R (group__Version_gbdf8f4e9416010573d48e21cf0584762) 435 0 R (group__Version_gc6abee034f6ac000f15d1206fdeb8316) 439 0 R (group__Version_ge19dfe022c51c874d905e2a7c81c18f1) 417 0 R (index) 201 0 R] +/Limits [(group__Version_gb51f10ea37de5299e9bc840afa206d4e) (index)] +>> endobj +2913 0 obj << +/Names [(interfaceppl__Coefficient__tag) 340 0 R (interfaceppl__Coefficient__tag_001b2a61c18a500a446151a9024de3fe) 769 0 R (interfaceppl__Coefficient__tag_1e3bb22af6b60660fcb8d201b09ec7ed) 793 0 R (interfaceppl__Coefficient__tag_1ef606afeb25edded051be3b0c728086) 766 0 R (interfaceppl__Coefficient__tag_249071ec2d19ecedaaf4e32ca8fc4a8d) 794 0 R (interfaceppl__Coefficient__tag_39db5035590b4bf7017a43cdcca6a49e) 765 0 R] +/Limits [(interfaceppl__Coefficient__tag) (interfaceppl__Coefficient__tag_39db5035590b4bf7017a43cdcca6a49e)] +>> endobj +2914 0 obj << +/Names [(interfaceppl__Coefficient__tag_474cce1b8348a126a8496cea7952a1f1) 770 0 R (interfaceppl__Coefficient__tag_526a2d8ad27e00b633408a36830dc2ae) 771 0 R (interfaceppl__Coefficient__tag_5fa6bcd4ec3cf844646033688f2fdf0a) 762 0 R (interfaceppl__Coefficient__tag_a1816497499ee569563a6d97a4ff553a) 792 0 R (interfaceppl__Coefficient__tag_af38dc5a17ef89e16c45f363397afb59) 763 0 R (interfaceppl__Coefficient__tag_be5af687ddf08c6379bd115d210ac22f) 768 0 R] +/Limits [(interfaceppl__Coefficient__tag_474cce1b8348a126a8496cea7952a1f1) (interfaceppl__Coefficient__tag_be5af687ddf08c6379bd115d210ac22f)] +>> endobj +2915 0 obj << +/Names [(interfaceppl__Coefficient__tag_cad04388edea0d80b20c40266a3c3f14) 767 0 R (interfaceppl__Coefficient__tag_f0b12578ecdb0571ca51ee09789b2fc3) 772 0 R (interfaceppl__Coefficient__tag_fabc584f4f391708d6c0d7c47030471a) 764 0 R (interfaceppl__Congruence__System__const__iterator__tag) 341 0 R (interfaceppl__Congruence__System__const__iterator__tag_38ece4277d5885940d45d6c8465ca19a) 798 0 R (interfaceppl__Congruence__System__const__iterator__tag_74f9a28eb09ee718502409ab43b657d4) 828 0 R] +/Limits [(interfaceppl__Coefficient__tag_cad04388edea0d80b20c40266a3c3f14) (interfaceppl__Congruence__System__const__iterator__tag_74f9a28eb09ee718502409ab43b657d4)] +>> endobj +2916 0 obj << +/Names [(interfaceppl__Congruence__System__const__iterator__tag_7ac19545b812b9ed2261c4224a6b9e9a) 826 0 R (interfaceppl__Congruence__System__const__iterator__tag_7f1fc328bf8f0d2ec92a6599ce7fe2d3) 824 0 R (interfaceppl__Congruence__System__const__iterator__tag_9af8efc183a5a4cd4475146207f92c8a) 797 0 R (interfaceppl__Congruence__System__const__iterator__tag_9c7ea131b285ad7aaefbc1e2cf579512) 800 0 R (interfaceppl__Congruence__System__const__iterator__tag_de6bd909f8bb4bcdaed4dced85c1f5f1) 822 0 R (interfaceppl__Congruence__System__tag) 342 0 R] +/Limits [(interfaceppl__Congruence__System__const__iterator__tag_7ac19545b812b9ed2261c4224a6b9e9a) (interfaceppl__Congruence__System__tag)] +>> endobj +2917 0 obj << +/Names [(interfaceppl__Congruence__System__tag_19d1974dd5b293a48b8f2de6fa3c2c8b) 887 0 R (interfaceppl__Congruence__System__tag_2c60071e2c7adec51fc7175ddb7a3bff) 881 0 R (interfaceppl__Congruence__System__tag_3b54824f0f53bf664c3114fb67557115) 912 0 R (interfaceppl__Congruence__System__tag_3ce50d0fcf796935652563144194ccf7) 884 0 R (interfaceppl__Congruence__System__tag_45fb5ebe8a9c33d1e73593b09d8ab877) 911 0 R (interfaceppl__Congruence__System__tag_56b9fe489466e7376b72bc99b4f99126) 883 0 R] +/Limits [(interfaceppl__Congruence__System__tag_19d1974dd5b293a48b8f2de6fa3c2c8b) (interfaceppl__Congruence__System__tag_56b9fe489466e7376b72bc99b4f99126)] +>> endobj +2918 0 obj << +/Names [(interfaceppl__Congruence__System__tag_5a6326e465cce738cb09fdd8df1d92ba) 879 0 R (interfaceppl__Congruence__System__tag_68de3cffc4bbfa2a79c06c51adb653a8) 874 0 R (interfaceppl__Congruence__System__tag_86691cc44e4ef41d379ec2477221f0de) 914 0 R (interfaceppl__Congruence__System__tag_8cba47c10a4d9a84b170b37932dc04e5) 876 0 R (interfaceppl__Congruence__System__tag_8ce02af4c13862f7988ad3e43b5290cf) 878 0 R (interfaceppl__Congruence__System__tag_a8fd21a451fe377a328d750951ce36f3) 875 0 R] +/Limits [(interfaceppl__Congruence__System__tag_5a6326e465cce738cb09fdd8df1d92ba) (interfaceppl__Congruence__System__tag_a8fd21a451fe377a328d750951ce36f3)] +>> endobj +2919 0 obj << +/Names [(interfaceppl__Congruence__System__tag_beb7cdeabf40c32d3aa0c33c0499bf97) 913 0 R (interfaceppl__Congruence__System__tag_e5f214d520a1f232251bee39685b62a2) 871 0 R (interfaceppl__Congruence__System__tag_e88c914d522014d2d181278bcfa9222f) 885 0 R (interfaceppl__Congruence__System__tag_ed43bafe74e2b291d7b980c6ee8f3d5f) 833 0 R (interfaceppl__Congruence__System__tag_f03d1a4f7f355971ac31ec1e4cb7297d) 873 0 R (interfaceppl__Congruence__System__tag_f6cb7e34c1083df796fb12aa463739e6) 832 0 R] +/Limits [(interfaceppl__Congruence__System__tag_beb7cdeabf40c32d3aa0c33c0499bf97) (interfaceppl__Congruence__System__tag_f6cb7e34c1083df796fb12aa463739e6)] +>> endobj +2920 0 obj << +/Names [(interfaceppl__Congruence__tag) 343 0 R (interfaceppl__Congruence__tag_0399dc1a987546af5d0491e72a6a05e4) 957 0 R (interfaceppl__Congruence__tag_08a4701b629d734ea0e11231a34514b0) 922 0 R (interfaceppl__Congruence__tag_10d11983038c7047547f4a68f8ea2b70) 962 0 R (interfaceppl__Congruence__tag_2845e4528b7b42c6c6527daceee21312) 956 0 R (interfaceppl__Congruence__tag_29295feb65378f2ba04c202f4b9a1bb3) 967 0 R] +/Limits [(interfaceppl__Congruence__tag) (interfaceppl__Congruence__tag_29295feb65378f2ba04c202f4b9a1bb3)] +>> endobj +2921 0 obj << +/Names [(interfaceppl__Congruence__tag_4ea3e6a8b8e929e318a5c1c450667d10) 965 0 R (interfaceppl__Congruence__tag_553952be8bff48ab2a4a8b2820efc047) 959 0 R (interfaceppl__Congruence__tag_5e1c7e98053b2262c5f56c46e2f04f05) 958 0 R (interfaceppl__Congruence__tag_6871446de8be708c37b2bedbf12c9b76) 921 0 R (interfaceppl__Congruence__tag_6d24fa81c885803e34fadd9332287d2e) 917 0 R (interfaceppl__Congruence__tag_b67c8dacaa1610fe5ea9efe67263477d) 923 0 R] +/Limits [(interfaceppl__Congruence__tag_4ea3e6a8b8e929e318a5c1c450667d10) (interfaceppl__Congruence__tag_b67c8dacaa1610fe5ea9efe67263477d)] +>> endobj +2922 0 obj << +/Names [(interfaceppl__Congruence__tag_b76a7c2b32bbc5472f87b3fae17f5a0d) 961 0 R (interfaceppl__Congruence__tag_caca085247f8483085877e21527a9cd6) 963 0 R (interfaceppl__Congruence__tag_dd70a09fb9b3cb0b8b7ce79d8d9ec14c) 966 0 R (interfaceppl__Congruence__tag_f39f78c492db753013cbfd0177ffea60) 968 0 R (interfaceppl__Congruence__tag_f61686ed9ede21b05016ee29f9de882b) 964 0 R (interfaceppl__Constraint__System__const__iterator__tag) 344 0 R] +/Limits [(interfaceppl__Congruence__tag_b76a7c2b32bbc5472f87b3fae17f5a0d) (interfaceppl__Constraint__System__const__iterator__tag)] +>> endobj +2923 0 obj << +/Names [(interfaceppl__Constraint__System__const__iterator__tag_061420fd93cf031e877897142071c67d) 994 0 R (interfaceppl__Constraint__System__const__iterator__tag_18f6401539b34122053f5d76da0c3282) 999 0 R (interfaceppl__Constraint__System__const__iterator__tag_60ac68b3806bdf2e8b4805d661c52def) 995 0 R (interfaceppl__Constraint__System__const__iterator__tag_93c2b042e4c644ba6052c0a0130c74ff) 1001 0 R (interfaceppl__Constraint__System__const__iterator__tag_9427aa22f07ee35e906d05bcd352e1e9) 1005 0 R (interfaceppl__Constraint__System__const__iterator__tag_bd830cdbf47ea1e5f0cb88ba4e3dddd7) 1003 0 R] +/Limits [(interfaceppl__Constraint__System__const__iterator__tag_061420fd93cf031e877897142071c67d) (interfaceppl__Constraint__System__const__iterator__tag_bd830cdbf47ea1e5f0cb88ba4e3dddd7)] +>> endobj +2924 0 obj << +/Names [(interfaceppl__Constraint__System__const__iterator__tag_dc0293455632f1e58de03ee68caa785a) 997 0 R (interfaceppl__Constraint__System__tag) 345 0 R (interfaceppl__Constraint__System__tag_06731c2e3b3d14dceffb5b81f1447bc8) 1088 0 R (interfaceppl__Constraint__System__tag_0d28be41ac786db82ce3cb24e2db5543) 1052 0 R (interfaceppl__Constraint__System__tag_1b4e8ec21c2f4b2b925c4e11474062b9) 1056 0 R (interfaceppl__Constraint__System__tag_27f2fdd3945057760e252740c98573eb) 1059 0 R] +/Limits [(interfaceppl__Constraint__System__const__iterator__tag_dc0293455632f1e58de03ee68caa785a) (interfaceppl__Constraint__System__tag_27f2fdd3945057760e252740c98573eb)] +>> endobj +2925 0 obj << +/Names [(interfaceppl__Constraint__System__tag_2967727ea790f1d517e1529e3f6be79e) 1045 0 R (interfaceppl__Constraint__System__tag_3bd9634d21689bd4b0cbcb476a101e92) 1092 0 R (interfaceppl__Constraint__System__tag_4316d3e1fd40ef324f4f9ac970481c9f) 1090 0 R (interfaceppl__Constraint__System__tag_442076de6b59703f82c552f7e70aad72) 1055 0 R (interfaceppl__Constraint__System__tag_56d19de5207d94e358a433995ce9730c) 1050 0 R (interfaceppl__Constraint__System__tag_5e22cd8ea46cdef0e09027e6177fc838) 1093 0 R] +/Limits [(interfaceppl__Constraint__System__tag_2967727ea790f1d517e1529e3f6be79e) (interfaceppl__Constraint__System__tag_5e22cd8ea46cdef0e09027e6177fc838)] +>> endobj +2926 0 obj << +/Names [(interfaceppl__Constraint__System__tag_6b54d1a028c5a0eff158b33ce1a6670f) 1046 0 R (interfaceppl__Constraint__System__tag_7a018b29b6f334f666391ec729265c25) 1091 0 R (interfaceppl__Constraint__System__tag_984fd654d7b169e74d13f6207d48fefb) 1048 0 R (interfaceppl__Constraint__System__tag_a975ef75ddb5359966ff21eecca491d0) 1057 0 R (interfaceppl__Constraint__System__tag_b1988eecd5bca9d4ad8dbd128c885b9b) 1044 0 R (interfaceppl__Constraint__System__tag_c19488a8f4e64cb797b8402ea44b456d) 1086 0 R] +/Limits [(interfaceppl__Constraint__System__tag_6b54d1a028c5a0eff158b33ce1a6670f) (interfaceppl__Constraint__System__tag_c19488a8f4e64cb797b8402ea44b456d)] +>> endobj +2927 0 obj << +/Names [(interfaceppl__Constraint__System__tag_c8105464b2dbee48f8646bc2c2f1f2d8) 1094 0 R (interfaceppl__Constraint__System__tag_d9b9ef9435b7a3bc8d92435ccf1cc0d7) 1053 0 R (interfaceppl__Constraint__System__tag_f8ebe9c0ce769746c2d2d01f6fcb4c91) 1087 0 R (interfaceppl__Constraint__tag) 346 0 R (interfaceppl__Constraint__tag_08451f3fa991dc14b1b8874bdefd7cf2) 1172 0 R (interfaceppl__Constraint__tag_0ed54f6ac264a58059f51c7fe33ab787) 1134 0 R] +/Limits [(interfaceppl__Constraint__System__tag_c8105464b2dbee48f8646bc2c2f1f2d8) (interfaceppl__Constraint__tag_0ed54f6ac264a58059f51c7fe33ab787)] +>> endobj +2928 0 obj << +/Names [(interfaceppl__Constraint__tag_1c416a6d6a359f2f9e9d33af7dc32ea8) 1143 0 R (interfaceppl__Constraint__tag_2d4948b195e743f39601a13610fcf94f) 1139 0 R (interfaceppl__Constraint__tag_380ed65a246cd38c5ca3893b40eb4603) 1141 0 R (interfaceppl__Constraint__tag_414a473844efce3515611fdc6b26e4de) 1146 0 R (interfaceppl__Constraint__tag_702543ee828ef523fb5fe5ffdaf25925) 1138 0 R (interfaceppl__Constraint__tag_87fc73217faaf213d5b5a810272be545) 1171 0 R] +/Limits [(interfaceppl__Constraint__tag_1c416a6d6a359f2f9e9d33af7dc32ea8) (interfaceppl__Constraint__tag_87fc73217faaf213d5b5a810272be545)] +>> endobj +2929 0 obj << +/Names [(interfaceppl__Constraint__tag_8c466c744746ef7249afa54667470cf5) 1142 0 R (interfaceppl__Constraint__tag_90e279d0af3491d3cc793595e3e1bbff) 1170 0 R (interfaceppl__Constraint__tag_94ca29d276a68f3f75aa62c8ab6109e4) 1173 0 R (interfaceppl__Constraint__tag_9a30e394a9c84bb9d2debda31433e6b4) 1147 0 R (interfaceppl__Constraint__tag_adbcd3b735dae0f714d1134cf8e6b911) 1145 0 R (interfaceppl__Constraint__tag_b93e22d57d1f5d94ae97ba1b9de9e3f9) 1136 0 R] +/Limits [(interfaceppl__Constraint__tag_8c466c744746ef7249afa54667470cf5) (interfaceppl__Constraint__tag_b93e22d57d1f5d94ae97ba1b9de9e3f9)] +>> endobj +2930 0 obj << +/Names [(interfaceppl__Constraint__tag_bfb19498f2647b44344c6a84fdd6cd2d) 1137 0 R (interfaceppl__Constraint__tag_c21bd81d2f33da4dc915020bf16c801a) 1140 0 R (interfaceppl__Generator__System__const__iterator__tag) 383 0 R (interfaceppl__Generator__System__const__iterator__tag_51dfb5223b7487379681d4cc1583917f) 1181 0 R (interfaceppl__Generator__System__const__iterator__tag_7d4bec3e6101e95b57973dcab5880a51) 1207 0 R (interfaceppl__Generator__System__const__iterator__tag_b823e62915ff895212640119f062252c) 1176 0 R] +/Limits [(interfaceppl__Constraint__tag_bfb19498f2647b44344c6a84fdd6cd2d) (interfaceppl__Generator__System__const__iterator__tag_b823e62915ff895212640119f062252c)] +>> endobj +2931 0 obj << +/Names [(interfaceppl__Generator__System__const__iterator__tag_c5344d92361779d92fcb36acf2d406ae) 1209 0 R (interfaceppl__Generator__System__const__iterator__tag_cb94e9072062c0827a16766cef2c1a5e) 1205 0 R (interfaceppl__Generator__System__const__iterator__tag_cd03b90ea728537b78a669806309a5c0) 1177 0 R (interfaceppl__Generator__System__const__iterator__tag_e2334b2eefe8cae2ad750dfea1f7cade) 1179 0 R (interfaceppl__Generator__System__tag) 384 0 R (interfaceppl__Generator__System__tag_067f83ba740e5b6c0c585a5175723a0b) 1268 0 R] +/Limits [(interfaceppl__Generator__System__const__iterator__tag_c5344d92361779d92fcb36acf2d406ae) (interfaceppl__Generator__System__tag_067f83ba740e5b6c0c585a5175723a0b)] +>> endobj +2932 0 obj << +/Names [(interfaceppl__Generator__System__tag_33e20d1de127c9232d2d1188bee532ef) 1213 0 R (interfaceppl__Generator__System__tag_3d3687abfb3878a67fca687b8e4ff0b9) 1265 0 R (interfaceppl__Generator__System__tag_3f5244b219701d5ba5939982a1d11d97) 1263 0 R (interfaceppl__Generator__System__tag_540cea530eaa9c142b16fbf01f781673) 1253 0 R (interfaceppl__Generator__System__tag_7752ae55e7cd4d014f6498348ef47865) 1214 0 R (interfaceppl__Generator__System__tag_888341fcf1079aaaa4dd7b532662729c) 1256 0 R] +/Limits [(interfaceppl__Generator__System__tag_33e20d1de127c9232d2d1188bee532ef) (interfaceppl__Generator__System__tag_888341fcf1079aaaa4dd7b532662729c)] +>> endobj +2933 0 obj << +/Names [(interfaceppl__Generator__System__tag_a7260438cfc5fa383c7fb80b127f8315) 1257 0 R (interfaceppl__Generator__System__tag_ad90ffcd536cd0d48ee183bca02103fc) 1269 0 R (interfaceppl__Generator__System__tag_b1316806c765a595ddfa4de5e8d971f6) 1216 0 R (interfaceppl__Generator__System__tag_ba231f6ac03d82cbf693a6a29a5c2665) 1267 0 R (interfaceppl__Generator__System__tag_e12a1e70aa5010e6617de857f51574a8) 1266 0 R (interfaceppl__Generator__System__tag_e9bc39a46753f158644428f3c01e73a3) 1261 0 R] +/Limits [(interfaceppl__Generator__System__tag_a7260438cfc5fa383c7fb80b127f8315) (interfaceppl__Generator__System__tag_e9bc39a46753f158644428f3c01e73a3)] +>> endobj +2934 0 obj << +/Names [(interfaceppl__Generator__System__tag_eeec098f7c1e5939b144f3d42a2c65fc) 1254 0 R (interfaceppl__Generator__System__tag_f5253fb7ef85e1875cc453d9a9998459) 1218 0 R (interfaceppl__Generator__System__tag_f5911dc31286d92c979c7ff89c249bc8) 1262 0 R (interfaceppl__Generator__System__tag_fcc12e4f52a8ff85d16ebfc424447b63) 1259 0 R (interfaceppl__Generator__tag) 385 0 R (interfaceppl__Generator__tag_048cb229297e24f6d0f7ab4e4351e2c2) 1308 0 R] +/Limits [(interfaceppl__Generator__System__tag_eeec098f7c1e5939b144f3d42a2c65fc) (interfaceppl__Generator__tag_048cb229297e24f6d0f7ab4e4351e2c2)] +>> endobj +2935 0 obj << +/Names [(interfaceppl__Generator__tag_140a26e6f6dc525c742aca71f598ed3c) 1342 0 R (interfaceppl__Generator__tag_278a22338f8428e328daf84dea4f94e7) 1311 0 R (interfaceppl__Generator__tag_297969dd313ebb370c9419915398aaf2) 1310 0 R (interfaceppl__Generator__tag_30161047ab7c47dd7a68a852e98ed83e) 1346 0 R (interfaceppl__Generator__tag_30d13726e3b27f1be7e5eb05a7814bb3) 1312 0 R (interfaceppl__Generator__tag_318f5f2972203c84ea0fdb4b82bbab1c) 1340 0 R] +/Limits [(interfaceppl__Generator__tag_140a26e6f6dc525c742aca71f598ed3c) (interfaceppl__Generator__tag_318f5f2972203c84ea0fdb4b82bbab1c)] +>> endobj +2936 0 obj << +/Names [(interfaceppl__Generator__tag_5d89173a47e10f469337343cfb807218) 1344 0 R (interfaceppl__Generator__tag_6a901364857f84dc0f111a29330c33f9) 1347 0 R (interfaceppl__Generator__tag_6d184edbb85d3c2747bb6097f7de17ad) 1345 0 R (interfaceppl__Generator__tag_74a772b49c2c3190ad8501ffa0337d2f) 1343 0 R (interfaceppl__Generator__tag_afa09f891353748a46868d342cc91cbc) 1305 0 R (interfaceppl__Generator__tag_b3fe811bb3a347e553576dadff55339e) 1309 0 R] +/Limits [(interfaceppl__Generator__tag_5d89173a47e10f469337343cfb807218) (interfaceppl__Generator__tag_b3fe811bb3a347e553576dadff55339e)] +>> endobj +2937 0 obj << +/Names [(interfaceppl__Generator__tag_ce16d45c8fbb00ad5b616aa4344fb798) 1303 0 R (interfaceppl__Generator__tag_d6d26ca0f256b0d9a45173e7d83ee4cc) 1348 0 R (interfaceppl__Generator__tag_f2fd5edcf647f4bc5b64cf0f4f712a51) 1313 0 R (interfaceppl__Grid__Generator__System__const__iterator__tag) 386 0 R (interfaceppl__Grid__Generator__System__const__iterator__tag_0632eaac5ec676910e433016619b3e85) 1369 0 R (interfaceppl__Grid__Generator__System__const__iterator__tag_1842c4ba3cd1adb1e1bccef3cfcfa57f) 1377 0 R] +/Limits [(interfaceppl__Generator__tag_ce16d45c8fbb00ad5b616aa4344fb798) (interfaceppl__Grid__Generator__System__const__iterator__tag_1842c4ba3cd1adb1e1bccef3cfcfa57f)] +>> endobj +2938 0 obj << +/Names [(interfaceppl__Grid__Generator__System__const__iterator__tag_813ac0651ebac0120830cedf1ea58395) 1379 0 R (interfaceppl__Grid__Generator__System__const__iterator__tag_c23bf247df0b2721e97c8eeb8945adf1) 1371 0 R (interfaceppl__Grid__Generator__System__const__iterator__tag_f2932a2fa90f54f604e340d0e2eac7ba) 1374 0 R (interfaceppl__Grid__Generator__System__const__iterator__tag_f4cdf3fbe1977a24a90904e02efd791b) 1381 0 R (interfaceppl__Grid__Generator__System__const__iterator__tag_f8d741d4315fb12dff45b47979f88808) 1383 0 R (interfaceppl__Grid__Generator__System__tag) 387 0 R] +/Limits [(interfaceppl__Grid__Generator__System__const__iterator__tag_813ac0651ebac0120830cedf1ea58395) (interfaceppl__Grid__Generator__System__tag)] +>> endobj +2939 0 obj << +/Names [(interfaceppl__Grid__Generator__System__tag_121252cea61436e0df74e008b80c13b7) 1430 0 R (interfaceppl__Grid__Generator__System__tag_22e81aa8cd862935e9a0abab515cf838) 1460 0 R (interfaceppl__Grid__Generator__System__tag_303533574d5d5d4d8f58e2d8646baa69) 1423 0 R (interfaceppl__Grid__Generator__System__tag_3094a8093769d647b9f477e14d53a3a0) 1431 0 R (interfaceppl__Grid__Generator__System__tag_3671e52fd03a1c456c630b7c5c632df8) 1434 0 R (interfaceppl__Grid__Generator__System__tag_4578b5352510727810a7c3be32208aae) 1437 0 R] +/Limits [(interfaceppl__Grid__Generator__System__tag_121252cea61436e0df74e008b80c13b7) (interfaceppl__Grid__Generator__System__tag_4578b5352510727810a7c3be32208aae)] +>> endobj +2940 0 obj << +/Names [(interfaceppl__Grid__Generator__System__tag_68cdbff6e2262bae3295484dbee9ee42) 1436 0 R (interfaceppl__Grid__Generator__System__tag_95c612736a3e7524077dd5c81bf2a105) 1425 0 R (interfaceppl__Grid__Generator__System__tag_9fc89d795c20b4270756269edf1b9604) 1429 0 R (interfaceppl__Grid__Generator__System__tag_a6324c2e330df63ad428eec9182fcc4d) 1464 0 R (interfaceppl__Grid__Generator__System__tag_af6f8270e3742973e0df7dcc9132f7ae) 1465 0 R (interfaceppl__Grid__Generator__System__tag_bc859551651eca1bcc3839f62d45dbfe) 1461 0 R] +/Limits [(interfaceppl__Grid__Generator__System__tag_68cdbff6e2262bae3295484dbee9ee42) (interfaceppl__Grid__Generator__System__tag_bc859551651eca1bcc3839f62d45dbfe)] +>> endobj +2941 0 obj << +/Names [(interfaceppl__Grid__Generator__System__tag_c64c8548738734fedbc94f03519b803a) 1424 0 R (interfaceppl__Grid__Generator__System__tag_d00a2a1877537fa49a41013078ee2bb6) 1463 0 R (interfaceppl__Grid__Generator__System__tag_d4d88d3daaa672264c63c83071c2021b) 1427 0 R (interfaceppl__Grid__Generator__System__tag_e2c6fa9b0155fd9428ff3abcf1a66805) 1432 0 R (interfaceppl__Grid__Generator__System__tag_f29295940b1ad0b6b48cc44e92f04060) 1462 0 R (interfaceppl__Grid__Generator__tag) 388 0 R] +/Limits [(interfaceppl__Grid__Generator__System__tag_c64c8548738734fedbc94f03519b803a) (interfaceppl__Grid__Generator__tag)] +>> endobj +2942 0 obj << +/Names [(interfaceppl__Grid__Generator__tag_0ca9a6d6894e381babab8f958c194f07) 1518 0 R (interfaceppl__Grid__Generator__tag_190a7c46776178432e89c9525db039ab) 1521 0 R (interfaceppl__Grid__Generator__tag_2a64fe7b9774c990bd9db8aecd2dacea) 1509 0 R (interfaceppl__Grid__Generator__tag_3fc151fc10282a5ede395e9b8a5502e2) 1519 0 R (interfaceppl__Grid__Generator__tag_6cb7351e1bb87181f7e6c946db398b5b) 1506 0 R (interfaceppl__Grid__Generator__tag_85958538f17770d4ae66bcd179d747a1) 1512 0 R] +/Limits [(interfaceppl__Grid__Generator__tag_0ca9a6d6894e381babab8f958c194f07) (interfaceppl__Grid__Generator__tag_85958538f17770d4ae66bcd179d747a1)] +>> endobj +2943 0 obj << +/Names [(interfaceppl__Grid__Generator__tag_8b96d560404b7b7ee0ec7ea1aef80280) 1515 0 R (interfaceppl__Grid__Generator__tag_99aac01eb1b8adc3667bbd3db68e8d34) 1514 0 R (interfaceppl__Grid__Generator__tag_9b452ce4baaf1c1644a6eb33658ae48a) 1511 0 R (interfaceppl__Grid__Generator__tag_9c2a70f5f90ec3da123f549d6ca9fe4a) 1468 0 R (interfaceppl__Grid__Generator__tag_a8e9420c29d8c75e775c4fd609830769) 1516 0 R (interfaceppl__Grid__Generator__tag_c5a83c9e42e34b313e12a6cef4470a75) 1520 0 R] +/Limits [(interfaceppl__Grid__Generator__tag_8b96d560404b7b7ee0ec7ea1aef80280) (interfaceppl__Grid__Generator__tag_c5a83c9e42e34b313e12a6cef4470a75)] +>> endobj +2944 0 obj << +/Names [(interfaceppl__Grid__Generator__tag_cc700387404f10208584c1a847a6f328) 1507 0 R (interfaceppl__Grid__Generator__tag_dfc86b3b2966514ba2e2292584f68c08) 1513 0 R (interfaceppl__Grid__Generator__tag_fb6f23292760d6d55c57b5722f604897) 1517 0 R (interfaceppl__Linear__Expression__tag) 389 0 R (interfaceppl__Linear__Expression__tag_1c54d4109f395752ea23822cee000d04) 1561 0 R (interfaceppl__Linear__Expression__tag_225478fba412d40b785e2b41809cc90d) 1612 0 R] +/Limits [(interfaceppl__Grid__Generator__tag_cc700387404f10208584c1a847a6f328) (interfaceppl__Linear__Expression__tag_225478fba412d40b785e2b41809cc90d)] +>> endobj +2945 0 obj << +/Names [(interfaceppl__Linear__Expression__tag_3530a20e5985d6da8acabad37bfe0e93) 1617 0 R (interfaceppl__Linear__Expression__tag_46773b226d490e5bbf6f3d587cf29dc4) 1640 0 R (interfaceppl__Linear__Expression__tag_50bcfefbf053e770951fa02c2e2eb112) 1641 0 R (interfaceppl__Linear__Expression__tag_512810c3e349a2f01217c6e426645260) 1553 0 R (interfaceppl__Linear__Expression__tag_643dad56c4e24b32e2c4951aee7a6822) 1606 0 R (interfaceppl__Linear__Expression__tag_690fbcd5ef7202e646b30d92bdadcc29) 1639 0 R] +/Limits [(interfaceppl__Linear__Expression__tag_3530a20e5985d6da8acabad37bfe0e93) (interfaceppl__Linear__Expression__tag_690fbcd5ef7202e646b30d92bdadcc29)] +>> endobj +2946 0 obj << +/Names [(interfaceppl__Linear__Expression__tag_7d65378709f5a0c73e711f5528385990) 1557 0 R (interfaceppl__Linear__Expression__tag_8172cf537ccecb7826eb21837b8d7e7b) 1618 0 R (interfaceppl__Linear__Expression__tag_84c2e36e2ae01775ce542ebc83739726) 1613 0 R (interfaceppl__Linear__Expression__tag_86c148ed14d1a2781e07bea5be7fb434) 1608 0 R (interfaceppl__Linear__Expression__tag_9ab7b109b1acae567c915b1db83b5283) 1559 0 R (interfaceppl__Linear__Expression__tag_a891671c2b9414353067da44a108ac1d) 1552 0 R] +/Limits [(interfaceppl__Linear__Expression__tag_7d65378709f5a0c73e711f5528385990) (interfaceppl__Linear__Expression__tag_a891671c2b9414353067da44a108ac1d)] +>> endobj +2947 0 obj << +/Names [(interfaceppl__Linear__Expression__tag_bbbdd7f3c4800ef97b642142cd68648d) 1603 0 R (interfaceppl__Linear__Expression__tag_bfe9ef58fb96938e1c26b63e2b4ce0d1) 1615 0 R (interfaceppl__Linear__Expression__tag_c21bf6dd42b915ff6f157fb73fe396e0) 1642 0 R (interfaceppl__Linear__Expression__tag_e7af7908bffe9b331262dcf8fd020b7f) 1609 0 R (interfaceppl__Linear__Expression__tag_e861c5919e346c3966c43edc4cd47276) 1611 0 R (interfaceppl__Linear__Expression__tag_f232ff2f43109950ac1b0f5d124cf4cc) 1605 0 R] +/Limits [(interfaceppl__Linear__Expression__tag_bbbdd7f3c4800ef97b642142cd68648d) (interfaceppl__Linear__Expression__tag_f232ff2f43109950ac1b0f5d124cf4cc)] +>> endobj +2948 0 obj << +/Names [(interfaceppl__Linear__Expression__tag_f78187771d58e90c174eeba577a471d5) 1643 0 R (interfaceppl__Linear__Expression__tag_f99b9dc1c16751ce872dab5245c22fdf) 1563 0 R (interfaceppl__Linear__Expression__tag_fc650c1c744fbfc4dbd15293b9827776) 1555 0 R (interfaceppl__MIP__Problem__tag) 390 0 R (interfaceppl__MIP__Problem__tag_086e697a92a664c83721e0c442d45271) 1805 0 R (interfaceppl__MIP__Problem__tag_0d5a001977b49f77a4514de614bf3c4c) 1701 0 R] +/Limits [(interfaceppl__Linear__Expression__tag_f78187771d58e90c174eeba577a471d5) (interfaceppl__MIP__Problem__tag_0d5a001977b49f77a4514de614bf3c4c)] +>> endobj +2949 0 obj << +/Names [(interfaceppl__MIP__Problem__tag_19ff64e7fd60a4e08c782a4683d62167) 1746 0 R (interfaceppl__MIP__Problem__tag_2b4edec92d54747f5f1d2904407e744a) 1811 0 R (interfaceppl__MIP__Problem__tag_32423400858178cc05f325962afd44e2) 1647 0 R (interfaceppl__MIP__Problem__tag_34e5d32c224ab8293ff78c85d86e5f79) 1689 0 R (interfaceppl__MIP__Problem__tag_3659fef24b67be6b668955bc6865e779) 1753 0 R (interfaceppl__MIP__Problem__tag_36c57e3007fcb2340dc415f8431df7aa) 1755 0 R] +/Limits [(interfaceppl__MIP__Problem__tag_19ff64e7fd60a4e08c782a4683d62167) (interfaceppl__MIP__Problem__tag_36c57e3007fcb2340dc415f8431df7aa)] +>> endobj +2950 0 obj << +/Names [(interfaceppl__MIP__Problem__tag_3789c297e202c735dbd829cd6cbed989) 1804 0 R (interfaceppl__MIP__Problem__tag_396b429302ce49ea9915778c317b81d2) 1802 0 R (interfaceppl__MIP__Problem__tag_39e443628f6b73203b0f66189b8bc1c6) 1760 0 R (interfaceppl__MIP__Problem__tag_3ff750009bec94ab2c9a01139ba22420) 1810 0 R (interfaceppl__MIP__Problem__tag_43a14864f62b4528d6c87856cba4da34) 1809 0 R (interfaceppl__MIP__Problem__tag_44aa5cc75376dddfb9005dd74b27ff68) 1751 0 R] +/Limits [(interfaceppl__MIP__Problem__tag_3789c297e202c735dbd829cd6cbed989) (interfaceppl__MIP__Problem__tag_44aa5cc75376dddfb9005dd74b27ff68)] +>> endobj +2951 0 obj << +/Names [(interfaceppl__MIP__Problem__tag_4b9b7034fd7b17eff672d49a7c85ac2f) 1745 0 R (interfaceppl__MIP__Problem__tag_4da79f8c645b945d52635733c3f63d7d) 1702 0 R (interfaceppl__MIP__Problem__tag_5357e1ed14407abf82149fe878789efd) 1750 0 R (interfaceppl__MIP__Problem__tag_5e359194d7a21e72a49aee51dbac25c4) 1756 0 R (interfaceppl__MIP__Problem__tag_6a8d9c1c40c886054ef76aac268f33b0) 1743 0 R (interfaceppl__MIP__Problem__tag_70c652d969734f6a69841d30a5e9033b) 1695 0 R] +/Limits [(interfaceppl__MIP__Problem__tag_4b9b7034fd7b17eff672d49a7c85ac2f) (interfaceppl__MIP__Problem__tag_70c652d969734f6a69841d30a5e9033b)] +>> endobj +2952 0 obj << +/Names [(interfaceppl__MIP__Problem__tag_7397b715c2ccf3f6fcf2f3900efe10d6) 1803 0 R (interfaceppl__MIP__Problem__tag_8190bd5fde521e37c585c5c59b65f90d) 1806 0 R (interfaceppl__MIP__Problem__tag_894587e76b98f15a8ae120327dc9d532) 1799 0 R (interfaceppl__MIP__Problem__tag_8bda1b8ba9119202c16f88fdb19a535b) 1697 0 R (interfaceppl__MIP__Problem__tag_8ca7076566ebe098ff3bc307b4d91899) 1649 0 R (interfaceppl__MIP__Problem__tag_8efd1f7de8fb2bbe6e33aff1d4184078) 1648 0 R] +/Limits [(interfaceppl__MIP__Problem__tag_7397b715c2ccf3f6fcf2f3900efe10d6) (interfaceppl__MIP__Problem__tag_8efd1f7de8fb2bbe6e33aff1d4184078)] +>> endobj +2953 0 obj << +/Names [(interfaceppl__MIP__Problem__tag_8f2ab3d77bca7257df14bda9261a1326) 1650 0 R (interfaceppl__MIP__Problem__tag_9dfe99ee7d8e2b1d7360ab0119bd12eb) 1688 0 R (interfaceppl__MIP__Problem__tag_a1663bce444a20240c852c9443005cc0) 1699 0 R (interfaceppl__MIP__Problem__tag_b50ac757b6cb922c40504dc69c983568) 1748 0 R (interfaceppl__MIP__Problem__tag_b95e9f75dd971827c8a9a6b42faeeac7) 1691 0 R (interfaceppl__MIP__Problem__tag_c379f873623c0fec37d988c2c374ffe5) 1690 0 R] +/Limits [(interfaceppl__MIP__Problem__tag_8f2ab3d77bca7257df14bda9261a1326) (interfaceppl__MIP__Problem__tag_c379f873623c0fec37d988c2c374ffe5)] +>> endobj +2954 0 obj << +/Names [(interfaceppl__MIP__Problem__tag_c39a1aacb6aa4f54150e2b138d7b36f2) 1749 0 R (interfaceppl__MIP__Problem__tag_cdbb5fd3fa1ab9faed26fc5be47cc0d2) 1795 0 R (interfaceppl__MIP__Problem__tag_d2154705f0854002a4f44f95580df9c7) 1700 0 R (interfaceppl__MIP__Problem__tag_df86eb3611cbe63b34ef195bc87a7312) 1646 0 R (interfaceppl__MIP__Problem__tag_e5845918fa5037ca4e9bdde4a4a3ecf2) 1797 0 R (interfaceppl__MIP__Problem__tag_e7dc964062c194e3ae8eef0a828164ae) 1801 0 R] +/Limits [(interfaceppl__MIP__Problem__tag_c39a1aacb6aa4f54150e2b138d7b36f2) (interfaceppl__MIP__Problem__tag_e7dc964062c194e3ae8eef0a828164ae)] +>> endobj +2955 0 obj << +/Names [(interfaceppl__MIP__Problem__tag_ebfd121256089b1415f3bc6989c25bbb) 1807 0 R (interfaceppl__MIP__Problem__tag_f349e801a615b2014d36c30fdb56022a) 1758 0 R (interfaceppl__MIP__Problem__tag_f59141db49e5141da6ac594d43ead2f7) 1693 0 R (interfaceppl__MIP__Problem__tag_f63454e50c1937573c75495f3cb4c1d2) 1687 0 R (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag) 391 0 R (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag_0746b37f80c4be687b0dc5ded6190002) 1855 0 R] +/Limits [(interfaceppl__MIP__Problem__tag_ebfd121256089b1415f3bc6989c25bbb) (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag_0746b37f80c4be687b0dc5ded6190002)] +>> endobj +2956 0 obj << +/Names [(interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag_62836b9156289bd880bf9f32056a4dee) 1869 0 R (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag_70541b12c8a9b281b3aa4f9c21624b3c) 1865 0 R (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag_8d39b1769491b0ee262118bfa31bcc67) 1858 0 R (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag_bc4dd4b94a80075012b0f30b13339632) 1867 0 R (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag_bcb586fdbb2eb01ec10c0eb941f4b7f1) 1853 0 R (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag_d69ffccc04d33132e31a91296afad78d) 1874 0 R] +/Limits [(interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag_62836b9156289bd880bf9f32056a4dee) (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag_d69ffccc04d33132e31a91296afad78d)] +>> endobj +2957 0 obj << +/Names [(interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag_db6f375b8aad58a31f6a60abb7a9b1e2) 1862 0 R (interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag_dd8c6ae913a7e3f0a7e1470a23ba04a3) 1860 0 R (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag) 393 0 R (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag_1785059acd1bf60dcf4cda0044cc94b5) 1920 0 R (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag_35180fb6d38a29d74f5992815fbdf006) 1918 0 R (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag_64b1a8e66388915a57bfd0b53a2e46c5) 1916 0 R] +/Limits [(interfaceppl__Pointset__Powerset__C__Polyhedron__const__iterator__tag_db6f375b8aad58a31f6a60abb7a9b1e2) (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag_64b1a8e66388915a57bfd0b53a2e46c5)] +>> endobj +2958 0 obj << +/Names [(interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag_79d1cb9751d21f7b364c4c41c4715737) 1910 0 R (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag_7e3f8c5b2e614c5d18783c2ef7b092e1) 1906 0 R (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag_98e7f050a579e9deeb71a75758238928) 1908 0 R (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag_a82f0fc73b5f98fab74070ee92a100cf) 1912 0 R (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag_acb1e10c50be6e9dd36e3aed93c7a222) 1913 0 R (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag_be46bba93c5ddcf4cf4cafdb0d74f942) 1934 0 R] +/Limits [(interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag_79d1cb9751d21f7b364c4c41c4715737) (interfaceppl__Pointset__Powerset__C__Polyhedron__iterator__tag_be46bba93c5ddcf4cf4cafdb0d74f942)] +>> endobj +2959 0 obj << +/Names [(interfaceppl__Pointset__Powerset__C__Polyhedron__tag) 392 0 R (interfaceppl__Pointset__Powerset__C__Polyhedron__tag_024a52502b35029ff2ba102323d8ae5b) 1968 0 R (interfaceppl__Pointset__Powerset__C__Polyhedron__tag_0bf696420bbdc5c2ef0993f61f2273b7) 1943 0 R (interfaceppl__Pointset__Powerset__C__Polyhedron__tag_1b2ee4d834f0651a41647ac5b5e0f912) 1976 0 R (interfaceppl__Pointset__Powerset__C__Polyhedron__tag_26a124537b8995832b2cb157abc7cf07) 1940 0 R (interfaceppl__Pointset__Powerset__C__Polyhedron__tag_91f0ccf4325f53430d7347ca73182f52) 1971 0 R] +/Limits [(interfaceppl__Pointset__Powerset__C__Polyhedron__tag) (interfaceppl__Pointset__Powerset__C__Polyhedron__tag_91f0ccf4325f53430d7347ca73182f52)] +>> endobj +2960 0 obj << +/Names [(interfaceppl__Pointset__Powerset__C__Polyhedron__tag_ae5f47efa7c023e45aed9be161dce99f) 1973 0 R (interfaceppl__Pointset__Powerset__C__Polyhedron__tag_b595ea1166752d23aba600af43417bd8) 1979 0 R (interfaceppl__Pointset__Powerset__C__Polyhedron__tag_eb8456ecf06307c108046a8c665154c9) 1965 0 R (interfaceppl__Polyhedron__tag) 394 0 R (interfaceppl__Polyhedron__tag_0184ad10aeca27f95d249d3a7e061b46) 2471 0 R (interfaceppl__Polyhedron__tag_01daecb5bf8e498e7d539d7f3ba8496e) 2264 0 R] +/Limits [(interfaceppl__Pointset__Powerset__C__Polyhedron__tag_ae5f47efa7c023e45aed9be161dce99f) (interfaceppl__Polyhedron__tag_01daecb5bf8e498e7d539d7f3ba8496e)] +>> endobj +2961 0 obj << +/Names [(interfaceppl__Polyhedron__tag_06c7c974043c12bcf349c119e73cc681) 2522 0 R (interfaceppl__Polyhedron__tag_0b031bedcfb70f485bab922596bce1c8) 2336 0 R (interfaceppl__Polyhedron__tag_0e494452cce5a8916f4fe97a1c79e237) 2212 0 R (interfaceppl__Polyhedron__tag_141c3283de2a46f2fcb278dcdca0558f) 2198 0 R (interfaceppl__Polyhedron__tag_191744753f79b939c8d61efe45778bd8) 2266 0 R (interfaceppl__Polyhedron__tag_1bd806c292d0576b94d3084b21736061) 2073 0 R] +/Limits [(interfaceppl__Polyhedron__tag_06c7c974043c12bcf349c119e73cc681) (interfaceppl__Polyhedron__tag_1bd806c292d0576b94d3084b21736061)] +>> endobj +2962 0 obj << +/Names [(interfaceppl__Polyhedron__tag_1dd00b705631c579994677fea3a86d63) 2206 0 R (interfaceppl__Polyhedron__tag_1e5a2940765710cccea4ef4f1b7f1092) 2525 0 R (interfaceppl__Polyhedron__tag_27fdc62bc2cae150c7d710a8e312a40d) 2133 0 R (interfaceppl__Polyhedron__tag_2dc649f0ee90ea5af999e3c0bae54bcb) 2131 0 R (interfaceppl__Polyhedron__tag_2f80d4608b0b75948b50dd862a14df66) 2267 0 R (interfaceppl__Polyhedron__tag_304dd0846a62cb4a9f79806ea82cee5d) 2079 0 R] +/Limits [(interfaceppl__Polyhedron__tag_1dd00b705631c579994677fea3a86d63) (interfaceppl__Polyhedron__tag_304dd0846a62cb4a9f79806ea82cee5d)] +>> endobj +2963 0 obj << +/Names [(interfaceppl__Polyhedron__tag_357ddb19493a385970c56bf4847a07a1) 2194 0 R (interfaceppl__Polyhedron__tag_381b0e6e2e58df417ff578ed6d715520) 2414 0 R (interfaceppl__Polyhedron__tag_39ee8e60c1d4d6faa40986d8fba28d5d) 2197 0 R (interfaceppl__Polyhedron__tag_3bc82e8c76e1a47ecc20c85e1003036d) 2469 0 R (interfaceppl__Polyhedron__tag_3e07a3e1a6e6c9f281227b4e215a3dc7) 2263 0 R (interfaceppl__Polyhedron__tag_402bb86dfedf35933c2a29cc07210741) 2411 0 R] +/Limits [(interfaceppl__Polyhedron__tag_357ddb19493a385970c56bf4847a07a1) (interfaceppl__Polyhedron__tag_402bb86dfedf35933c2a29cc07210741)] +>> endobj +2964 0 obj << +/Names [(interfaceppl__Polyhedron__tag_418a9f96c3df4cf69bc399cd807eddeb) 2027 0 R (interfaceppl__Polyhedron__tag_46fc9d1041d5548a5f8f220af2a07028) 2415 0 R (interfaceppl__Polyhedron__tag_4b5f126aef2ca062b034f795f6e5cf6d) 2193 0 R (interfaceppl__Polyhedron__tag_50d5c68064e215d3f2cf3ee69896e676) 2126 0 R (interfaceppl__Polyhedron__tag_52e2499c42a9be1e527642cbfb16ff8c) 2064 0 R (interfaceppl__Polyhedron__tag_5932fd0c6867d83e3a34d5e680225807) 2564 0 R] +/Limits [(interfaceppl__Polyhedron__tag_418a9f96c3df4cf69bc399cd807eddeb) (interfaceppl__Polyhedron__tag_5932fd0c6867d83e3a34d5e680225807)] +>> endobj +2965 0 obj << +/Names [(interfaceppl__Polyhedron__tag_5a6342bc4e04c1f228d210e5c363b6d4) 2257 0 R (interfaceppl__Polyhedron__tag_5a9b061c4408ab8d70a1dea91a6ff983) 2265 0 R (interfaceppl__Polyhedron__tag_5e7090393ee5801d9c988db6d2a06a43) 2516 0 R (interfaceppl__Polyhedron__tag_612142029eeee3dd72bb0d37c670d6db) 2519 0 R (interfaceppl__Polyhedron__tag_6137f367c0c83a73146d84c998d37cb3) 2466 0 R (interfaceppl__Polyhedron__tag_658545ec6169d2843323bfe1ff078e6f) 2460 0 R] +/Limits [(interfaceppl__Polyhedron__tag_5a6342bc4e04c1f228d210e5c363b6d4) (interfaceppl__Polyhedron__tag_658545ec6169d2843323bfe1ff078e6f)] +>> endobj +2966 0 obj << +/Names [(interfaceppl__Polyhedron__tag_680aecc71f3b21fa0db03c7d1cbe466b) 2138 0 R (interfaceppl__Polyhedron__tag_69c0a9ffd5b8910a90a91943a10fe3b6) 2523 0 R (interfaceppl__Polyhedron__tag_6b5c73b1f3f864c8a10c39810b4711ce) 2459 0 R (interfaceppl__Polyhedron__tag_6c5a2f9b4702c1a0ddfcc9c6eb9b92bd) 2140 0 R (interfaceppl__Polyhedron__tag_6d147411700f558d74d8273accfb8e04) 2135 0 R (interfaceppl__Polyhedron__tag_6ff56c68b449b94588ea7290d01625d5) 2416 0 R] +/Limits [(interfaceppl__Polyhedron__tag_680aecc71f3b21fa0db03c7d1cbe466b) (interfaceppl__Polyhedron__tag_6ff56c68b449b94588ea7290d01625d5)] +>> endobj +2967 0 obj << +/Names [(interfaceppl__Polyhedron__tag_6ffd595f3e1d85275962dde5f8401c7f) 2355 0 R (interfaceppl__Polyhedron__tag_703c5d92387510c5cbf8b0f1da3029b2) 2030 0 R (interfaceppl__Polyhedron__tag_7135823ecf68cedd5236d53e2b5541f5) 2202 0 R (interfaceppl__Polyhedron__tag_7573064b44c45d804d398aec02e7a64a) 2470 0 R (interfaceppl__Polyhedron__tag_784570f6ced5461b4d82cdfefa1cb31b) 2351 0 R (interfaceppl__Polyhedron__tag_7918c3a73aed2529e1e57b8983264bad) 2341 0 R] +/Limits [(interfaceppl__Polyhedron__tag_6ffd595f3e1d85275962dde5f8401c7f) (interfaceppl__Polyhedron__tag_7918c3a73aed2529e1e57b8983264bad)] +>> endobj +2968 0 obj << +/Names [(interfaceppl__Polyhedron__tag_819d233e9b1442e06c806dea0523a2f9) 2078 0 R (interfaceppl__Polyhedron__tag_81cc2a565346ce8ee12124224ddd8d6c) 2455 0 R (interfaceppl__Polyhedron__tag_8402fc25b68056511cf62f1378666a88) 2347 0 R (interfaceppl__Polyhedron__tag_841ceef027f12d5c99fc2e739ae340fb) 2532 0 R (interfaceppl__Polyhedron__tag_85417db0eb420d402acee4ef0d842efc) 2129 0 R (interfaceppl__Polyhedron__tag_875b11e85fe96586152f53f498158b1f) 2562 0 R] +/Limits [(interfaceppl__Polyhedron__tag_819d233e9b1442e06c806dea0523a2f9) (interfaceppl__Polyhedron__tag_875b11e85fe96586152f53f498158b1f)] +>> endobj +2969 0 obj << +/Names [(interfaceppl__Polyhedron__tag_879f2f2b0f967fa73cb59ea8d8b1d255) 2075 0 R (interfaceppl__Polyhedron__tag_88a7c177ebe33a3d41609609660fd3ee) 2558 0 R (interfaceppl__Polyhedron__tag_88c408677f6de73fd80903738268efa3) 2528 0 R (interfaceppl__Polyhedron__tag_8948143df881c58c79da34380f847401) 2082 0 R (interfaceppl__Polyhedron__tag_89c2384471ee03156c7b414dceee8f14) 2275 0 R (interfaceppl__Polyhedron__tag_8a9e2cf693ca3e9c464efb04071b8572) 2353 0 R] +/Limits [(interfaceppl__Polyhedron__tag_879f2f2b0f967fa73cb59ea8d8b1d255) (interfaceppl__Polyhedron__tag_8a9e2cf693ca3e9c464efb04071b8572)] +>> endobj +2970 0 obj << +/Names [(interfaceppl__Polyhedron__tag_8abb894f6f4a673d549aa9bf7456b638) 2268 0 R (interfaceppl__Polyhedron__tag_8b280d026e0c343ec0d3f5521dda6376) 2137 0 R (interfaceppl__Polyhedron__tag_8ffc5459233ed9781c0ca910e88fa1f9) 2273 0 R (interfaceppl__Polyhedron__tag_90544f38c2980f308cd6e0f9248fdd99) 2408 0 R (interfaceppl__Polyhedron__tag_93cee014592562084126f06fe47efbba) 2211 0 R (interfaceppl__Polyhedron__tag_9563155e281915a8bc2eea34ceff9cf0) 2352 0 R] +/Limits [(interfaceppl__Polyhedron__tag_8abb894f6f4a673d549aa9bf7456b638) (interfaceppl__Polyhedron__tag_9563155e281915a8bc2eea34ceff9cf0)] +>> endobj +2971 0 obj << +/Names [(interfaceppl__Polyhedron__tag_96eaf729b170b6df69bc2d1127f8727c) 2530 0 R (interfaceppl__Polyhedron__tag_977522267df419dd5f2824ce6c0f7610) 2529 0 R (interfaceppl__Polyhedron__tag_9947be8614cba5c2e8b02771d48fc7d2) 2125 0 R (interfaceppl__Polyhedron__tag_9d9b8361c659cadd31afb61152ccf06b) 2031 0 R (interfaceppl__Polyhedron__tag_9e5f40dfc278c52da81291b30fbe75f7) 2196 0 R (interfaceppl__Polyhedron__tag_9fb38e66323fe6cb24b32e32e66dba78) 2342 0 R] +/Limits [(interfaceppl__Polyhedron__tag_96eaf729b170b6df69bc2d1127f8727c) (interfaceppl__Polyhedron__tag_9fb38e66323fe6cb24b32e32e66dba78)] +>> endobj +2972 0 obj << +/Names [(interfaceppl__Polyhedron__tag_a309e957fa5f404b296e2e4c30e1697d) 2260 0 R (interfaceppl__Polyhedron__tag_a48f8ae0f3a2647949417ec2da1c97e4) 2410 0 R (interfaceppl__Polyhedron__tag_abb79ab0a7936b6f14cd20e15cb14fa8) 2417 0 R (interfaceppl__Polyhedron__tag_ad3749930a51c38886b1d5a01dbbba92) 2521 0 R (interfaceppl__Polyhedron__tag_ad69d01217b9ea1043883162d285505c) 2345 0 R (interfaceppl__Polyhedron__tag_affebaba13f6fc73438bdccde0966547) 2461 0 R] +/Limits [(interfaceppl__Polyhedron__tag_a309e957fa5f404b296e2e4c30e1697d) (interfaceppl__Polyhedron__tag_affebaba13f6fc73438bdccde0966547)] +>> endobj +2973 0 obj << +/Names [(interfaceppl__Polyhedron__tag_b062917f016d95800e29f87c203fd3bb) 2563 0 R (interfaceppl__Polyhedron__tag_b1d03e0aac8dda484b102c536c612a45) 2139 0 R (interfaceppl__Polyhedron__tag_b27e9641bc6946aef6e3254d28c6fab4) 2029 0 R (interfaceppl__Polyhedron__tag_b32d3b44994fefe43c44e353a47cb4a4) 2200 0 R (interfaceppl__Polyhedron__tag_b4f7535037080c7f5db32b2e85fdc80d) 2195 0 R (interfaceppl__Polyhedron__tag_bc350d1ab1c6e4da0df6bb130364af7b) 2344 0 R] +/Limits [(interfaceppl__Polyhedron__tag_b062917f016d95800e29f87c203fd3bb) (interfaceppl__Polyhedron__tag_bc350d1ab1c6e4da0df6bb130364af7b)] +>> endobj +2974 0 obj << +/Names [(interfaceppl__Polyhedron__tag_bcf3ccb8e2e224496d1326e47e15fdc6) 2258 0 R (interfaceppl__Polyhedron__tag_bd393bd3febd678f09a51a0364756787) 2025 0 R (interfaceppl__Polyhedron__tag_bedffb6a2f5b2473d2d2ac9d448c65d9) 2019 0 R (interfaceppl__Polyhedron__tag_bf1bb44cdbf733e9ca39164f9d8e8179) 2081 0 R (interfaceppl__Polyhedron__tag_c06aed22fa4405051df0da9e7bc16138) 2405 0 R (interfaceppl__Polyhedron__tag_c0e5d09ffe586f8ea5ec782570015c5b) 2413 0 R] +/Limits [(interfaceppl__Polyhedron__tag_bcf3ccb8e2e224496d1326e47e15fdc6) (interfaceppl__Polyhedron__tag_c0e5d09ffe586f8ea5ec782570015c5b)] +>> endobj +2975 0 obj << +/Names [(interfaceppl__Polyhedron__tag_c655ac3a494c4f92bb02d0b9294bdd85) 2338 0 R (interfaceppl__Polyhedron__tag_c78c1168665c72eaf8c2457b12700fba) 2560 0 R (interfaceppl__Polyhedron__tag_d015c9afd4968005d43f233359253c5a) 2354 0 R (interfaceppl__Polyhedron__tag_d024f037803a208b74cd150eeaa5649d) 2272 0 R (interfaceppl__Polyhedron__tag_d184bea5f8f38b87293d639d57ee340b) 2527 0 R (interfaceppl__Polyhedron__tag_d20b13c4f378bdc5aa64c3e833a62cba) 2458 0 R] +/Limits [(interfaceppl__Polyhedron__tag_c655ac3a494c4f92bb02d0b9294bdd85) (interfaceppl__Polyhedron__tag_d20b13c4f378bdc5aa64c3e833a62cba)] +>> endobj +2976 0 obj << +/Names [(interfaceppl__Polyhedron__tag_d4b80df36fc02b4c47ca160420e50182) 2566 0 R (interfaceppl__Polyhedron__tag_d6512d0d60c017982bd8031e9b8df336) 2028 0 R (interfaceppl__Polyhedron__tag_d6b383704ed3f314864c52f5b715cbbf) 2456 0 R (interfaceppl__Polyhedron__tag_d9547cb6430722246dea7f5a70566c06) 2468 0 R (interfaceppl__Polyhedron__tag_da9021952b7c7ad4ca6fc4ff082ec9fe) 2017 0 R (interfaceppl__Polyhedron__tag_db06752e755290368c9bb00ad14a0984) 2346 0 R] +/Limits [(interfaceppl__Polyhedron__tag_d4b80df36fc02b4c47ca160420e50182) (interfaceppl__Polyhedron__tag_db06752e755290368c9bb00ad14a0984)] +>> endobj +2977 0 obj << +/Names [(interfaceppl__Polyhedron__tag_dc7cd513e31b7ecdda3a25a967d8a772) 2124 0 R (interfaceppl__Polyhedron__tag_dd9c4afcd6f6bd78509219f32d57e348) 2406 0 R (interfaceppl__Polyhedron__tag_e1e938f0c844231dfe2098ab8fbca67b) 2199 0 R (interfaceppl__Polyhedron__tag_ea399d3df97c711c758c8bf715e0c763) 2518 0 R (interfaceppl__Polyhedron__tag_ebe78c4ede3d49c63765e71cfe93904e) 2066 0 R (interfaceppl__Polyhedron__tag_ee4d567631589e83063cfb8f80c2bd6f) 2209 0 R] +/Limits [(interfaceppl__Polyhedron__tag_dc7cd513e31b7ecdda3a25a967d8a772) (interfaceppl__Polyhedron__tag_ee4d567631589e83063cfb8f80c2bd6f)] +>> endobj +2978 0 obj << +/Names [(interfaceppl__Polyhedron__tag_f29cc9becde5f28a37567093174d6855) 2122 0 R (interfaceppl__Polyhedron__tag_f777de5ca96f8d1631d3500008bf84f8) 2274 0 R (interfaceppl__Polyhedron__tag_f818756f74f766dfb937e586565db8d6) 2276 0 R (interfaceppl__Polyhedron__tag_f8a9392f205531631b3a98c332f594b1) 2457 0 R (interfaceppl__Polyhedron__tag_f92f3c9d758e2a155a2a6faec4235741) 2340 0 R (interfaceppl__Polyhedron__tag_f93c7e3e554a92e8d3eeb4cf4261debd) 2080 0 R] +/Limits [(interfaceppl__Polyhedron__tag_f29cc9becde5f28a37567093174d6855) (interfaceppl__Polyhedron__tag_f93c7e3e554a92e8d3eeb4cf4261debd)] +>> endobj +2979 0 obj << +/Names [(interfaceppl__Polyhedron__tag_f98013213e01ca8514b6dbd20116af4d) 2262 0 R (page.1) 141 0 R (page.10) 268 0 R (page.11) 280 0 R (page.12) 289 0 R (page.13) 295 0 R] +/Limits [(interfaceppl__Polyhedron__tag_f98013213e01ca8514b6dbd20116af4d) (page.13)] +>> endobj +2980 0 obj << +/Names [(page.14) 300 0 R (page.15) 305 0 R (page.16) 311 0 R (page.17) 338 0 R (page.18) 379 0 R (page.19) 408 0 R] +/Limits [(page.14) (page.19)] +>> endobj +2981 0 obj << +/Names [(page.2) 211 0 R (page.20) 432 0 R (page.21) 464 0 R (page.22) 509 0 R (page.23) 561 0 R (page.24) 612 0 R] +/Limits [(page.2) (page.24)] +>> endobj +2982 0 obj << +/Names [(page.25) 668 0 R (page.26) 707 0 R (page.27) 724 0 R (page.28) 760 0 R (page.29) 791 0 R (page.3) 218 0 R] +/Limits [(page.25) (page.3)] +>> endobj +2983 0 obj << +/Names [(page.30) 821 0 R (page.31) 870 0 R (page.32) 910 0 R (page.33) 955 0 R (page.34) 992 0 R (page.35) 1042 0 R] +/Limits [(page.30) (page.35)] +>> endobj +2984 0 obj << +/Names [(page.36) 1085 0 R (page.37) 1132 0 R (page.38) 1169 0 R (page.39) 1204 0 R (page.4) 225 0 R (page.40) 1252 0 R] +/Limits [(page.36) (page.40)] +>> endobj +2985 0 obj << +/Names [(page.41) 1300 0 R (page.42) 1339 0 R (page.43) 1368 0 R (page.44) 1421 0 R (page.45) 1459 0 R (page.46) 1505 0 R] +/Limits [(page.41) (page.46)] +>> endobj +2986 0 obj << +/Names [(page.47) 1549 0 R (page.48) 1602 0 R (page.49) 1638 0 R (page.5) 232 0 R (page.50) 1686 0 R (page.51) 1742 0 R] +/Limits [(page.47) (page.51)] +>> endobj +2987 0 obj << +/Names [(page.52) 1794 0 R (page.53) 1819 0 R (page.54) 1852 0 R (page.55) 1904 0 R (page.56) 1933 0 R (page.57) 1964 0 R] +/Limits [(page.52) (page.57)] +>> endobj +2988 0 obj << +/Names [(page.58) 2015 0 R (page.59) 2063 0 R (page.6) 241 0 R (page.60) 2121 0 R (page.61) 2192 0 R (page.62) 2256 0 R] +/Limits [(page.58) (page.62)] +>> endobj +2989 0 obj << +/Names [(page.63) 2335 0 R (page.64) 2398 0 R (page.65) 2454 0 R (page.66) 2515 0 R (page.67) 2557 0 R (page.68) 2573 0 R] +/Limits [(page.63) (page.68)] +>> endobj +2990 0 obj << +/Names [(page.69) 2584 0 R (page.7) 247 0 R (page.70) 2594 0 R (page.71) 2604 0 R (page.72) 2614 0 R (page.73) 2625 0 R] +/Limits [(page.69) (page.73)] +>> endobj +2991 0 obj << +/Names [(page.74) 2633 0 R (page.75) 2643 0 R (page.76) 2713 0 R (page.77) 2770 0 R (page.78) 2834 0 R (page.8) 253 0 R] +/Limits [(page.74) (page.8)] +>> endobj +2992 0 obj << +/Names [(page.9) 261 0 R (page.i) 176 0 R (paragraph.6.2.2.1) 411 0 R (paragraph.6.2.2.2) 412 0 R (paragraph.6.2.2.3) 413 0 R (paragraph.6.2.2.4) 414 0 R] +/Limits [(page.9) (paragraph.6.2.2.4)] +>> endobj +2993 0 obj << +/Names [(paragraph.6.3.2.1) 443 0 R (paragraph.6.3.3.1) 446 0 R (paragraph.6.4.2.1) 471 0 R (paragraph.6.4.3.1) 511 0 R (paragraph.6.5.2.1) 719 0 R (paragraph.6.5.3.1) 726 0 R] +/Limits [(paragraph.6.3.2.1) (paragraph.6.5.3.1)] +>> endobj +2994 0 obj << +/Names [(paragraph.6.5.3.2) 729 0 R (paragraph.6.5.3.3) 730 0 R (paragraph.6.5.4.1) 732 0 R (paragraph.7.15.2.1) 1821 0 R (paragraph.7.15.2.2) 1822 0 R (paragraph.7.15.2.3) 1823 0 R] +/Limits [(paragraph.6.5.3.2) (paragraph.7.15.2.3)] +>> endobj +2995 0 obj << +/Names [(paragraph.7.16.2.1) 1875 0 R (paragraph.7.17.2.1) 1938 0 R (paragraph.7.18.2.1) 1983 0 R (paragraph.7.19.2.1) 2575 0 R (paragraph.7.19.2.10) 2589 0 R (paragraph.7.19.2.11) 2595 0 R] +/Limits [(paragraph.7.16.2.1) (paragraph.7.19.2.11)] +>> endobj +2996 0 obj << +/Names [(paragraph.7.19.2.12) 2596 0 R (paragraph.7.19.2.13) 2597 0 R (paragraph.7.19.2.14) 2598 0 R (paragraph.7.19.2.15) 2599 0 R (paragraph.7.19.2.16) 2605 0 R (paragraph.7.19.2.17) 2606 0 R] +/Limits [(paragraph.7.19.2.12) (paragraph.7.19.2.17)] +>> endobj +2997 0 obj << +/Names [(paragraph.7.19.2.18) 2607 0 R (paragraph.7.19.2.19) 2608 0 R (paragraph.7.19.2.2) 2576 0 R (paragraph.7.19.2.20) 2615 0 R (paragraph.7.19.2.21) 2616 0 R (paragraph.7.19.2.22) 2617 0 R] +/Limits [(paragraph.7.19.2.18) (paragraph.7.19.2.22)] +>> endobj +2998 0 obj << +/Names [(paragraph.7.19.2.23) 2618 0 R (paragraph.7.19.2.24) 2626 0 R (paragraph.7.19.2.25) 2627 0 R (paragraph.7.19.2.26) 2628 0 R (paragraph.7.19.2.27) 2634 0 R (paragraph.7.19.2.28) 2635 0 R] +/Limits [(paragraph.7.19.2.23) (paragraph.7.19.2.28)] +>> endobj +2999 0 obj << +/Names [(paragraph.7.19.2.29) 2636 0 R (paragraph.7.19.2.3) 2577 0 R (paragraph.7.19.2.30) 2637 0 R (paragraph.7.19.2.31) 2638 0 R (paragraph.7.19.2.32) 2644 0 R (paragraph.7.19.2.33) 2645 0 R] +/Limits [(paragraph.7.19.2.29) (paragraph.7.19.2.33)] +>> endobj +3000 0 obj << +/Names [(paragraph.7.19.2.34) 2646 0 R (paragraph.7.19.2.4) 2578 0 R (paragraph.7.19.2.5) 2579 0 R (paragraph.7.19.2.6) 2585 0 R (paragraph.7.19.2.7) 2586 0 R (paragraph.7.19.2.8) 2587 0 R] +/Limits [(paragraph.7.19.2.34) (paragraph.7.19.2.8)] +>> endobj +3001 0 obj << +/Names [(paragraph.7.19.2.9) 2588 0 R (section*.1) 180 0 R (section*.10) 242 0 R (section*.11) 248 0 R (section*.12) 254 0 R (section*.13) 255 0 R] +/Limits [(paragraph.7.19.2.9) (section*.13)] +>> endobj +3002 0 obj << +/Names [(section*.14) 256 0 R (section*.15) 262 0 R (section*.16) 263 0 R (section*.17) 269 0 R (section*.18) 270 0 R (section*.19) 271 0 R] +/Limits [(section*.14) (section*.19)] +>> endobj +3003 0 obj << +/Names [(section*.2) 213 0 R (section*.20) 272 0 R (section*.21) 281 0 R (section*.22) 282 0 R (section*.23) 312 0 R (section*.24) 382 0 R] +/Limits [(section*.2) (section*.24)] +>> endobj +3004 0 obj << +/Names [(section*.25) 416 0 R (section*.26) 434 0 R (section*.27) 465 0 R (section*.28) 467 0 R (section*.29) 513 0 R (section*.3) 219 0 R] +/Limits [(section*.25) (section*.3)] +>> endobj +3005 0 obj << +/Names [(section*.30) 669 0 R (section*.31) 673 0 R (section*.32) 708 0 R (section*.33) 761 0 R (section*.34) 796 0 R (section*.35) 831 0 R] +/Limits [(section*.30) (section*.35)] +>> endobj +3006 0 obj << +/Names [(section*.36) 916 0 R (section*.37) 993 0 R (section*.38) 1043 0 R (section*.39) 1133 0 R (section*.4) 220 0 R (section*.40) 1175 0 R] +/Limits [(section*.36) (section*.40)] +>> endobj +3007 0 obj << +/Names [(section*.41) 1212 0 R (section*.42) 1302 0 R (section*.43) 1350 0 R (section*.44) 1422 0 R (section*.45) 1467 0 R (section*.46) 1551 0 R] +/Limits [(section*.41) (section*.46)] +>> endobj +3008 0 obj << +/Names [(section*.47) 1645 0 R (section*.48) 1824 0 R (section*.49) 1905 0 R (section*.5) 226 0 R (section*.50) 1939 0 R (section*.51) 2016 0 R] +/Limits [(section*.47) (section*.51)] +>> endobj +3009 0 obj << +/Names [(section*.52) 2714 0 R (section*.6) 227 0 R (section*.7) 233 0 R (section*.8) 234 0 R (section*.9) 235 0 R (section.1) 6 0 R] +/Limits [(section*.52) (section.1)] +>> endobj +3010 0 obj << +/Names [(section.2) 10 0 R (section.3) 14 0 R (section.4) 18 0 R (section.5) 26 0 R (section.6) 34 0 R (section.7) 58 0 R] +/Limits [(section.2) (section.7)] +>> endobj +3011 0 obj << +/Names [(subsection.4.1) 22 0 R (subsection.5.1) 30 0 R (subsection.6.1) 38 0 R (subsection.6.2) 42 0 R (subsection.6.3) 46 0 R (subsection.6.4) 50 0 R] +/Limits [(subsection.4.1) (subsection.6.4)] +>> endobj +3012 0 obj << +/Names [(subsection.6.5) 54 0 R (subsection.7.1) 62 0 R (subsection.7.10) 98 0 R (subsection.7.11) 102 0 R (subsection.7.12) 106 0 R (subsection.7.13) 110 0 R] +/Limits [(subsection.6.5) (subsection.7.13)] +>> endobj +3013 0 obj << +/Names [(subsection.7.14) 114 0 R (subsection.7.15) 118 0 R (subsection.7.16) 122 0 R (subsection.7.17) 126 0 R (subsection.7.18) 130 0 R (subsection.7.19) 134 0 R] +/Limits [(subsection.7.14) (subsection.7.19)] +>> endobj +3014 0 obj << +/Names [(subsection.7.2) 66 0 R (subsection.7.3) 70 0 R (subsection.7.4) 74 0 R (subsection.7.5) 78 0 R (subsection.7.6) 82 0 R (subsection.7.7) 86 0 R] +/Limits [(subsection.7.2) (subsection.7.7)] +>> endobj +3015 0 obj << +/Names [(subsection.7.8) 90 0 R (subsection.7.9) 94 0 R (subsubsection.6.2.1) 409 0 R (subsubsection.6.2.2) 410 0 R (subsubsection.6.3.1) 441 0 R (subsubsection.6.3.2) 442 0 R] +/Limits [(subsection.7.8) (subsubsection.6.3.2)] +>> endobj +3016 0 obj << +/Names [(subsubsection.6.3.3) 444 0 R (subsubsection.6.4.1) 468 0 R (subsubsection.6.4.2) 469 0 R (subsubsection.6.4.3) 510 0 R (subsubsection.6.5.1) 717 0 R (subsubsection.6.5.2) 718 0 R] +/Limits [(subsubsection.6.3.3) (subsubsection.6.5.2)] +>> endobj +3017 0 obj << +/Names [(subsubsection.6.5.3) 725 0 R (subsubsection.6.5.4) 731 0 R (subsubsection.7.1.1) 795 0 R (subsubsection.7.10.1) 1349 0 R (subsubsection.7.11.1) 1385 0 R (subsubsection.7.12.1) 1466 0 R] +/Limits [(subsubsection.6.5.3) (subsubsection.7.12.1)] +>> endobj +3018 0 obj << +/Names [(subsubsection.7.13.1) 1550 0 R (subsubsection.7.14.1) 1644 0 R (subsubsection.7.15.1) 1808 0 R (subsubsection.7.15.2) 1820 0 R (subsubsection.7.16.1) 1872 0 R (subsubsection.7.16.2) 1873 0 R] +/Limits [(subsubsection.7.13.1) (subsubsection.7.16.2)] +>> endobj +3019 0 obj << +/Names [(subsubsection.7.17.1) 1936 0 R (subsubsection.7.17.2) 1937 0 R (subsubsection.7.18.1) 1981 0 R (subsubsection.7.18.2) 1982 0 R (subsubsection.7.19.1) 2568 0 R (subsubsection.7.19.2) 2574 0 R] +/Limits [(subsubsection.7.17.1) (subsubsection.7.19.2)] +>> endobj +3020 0 obj << +/Names [(subsubsection.7.2.1) 830 0 R (subsubsection.7.3.1) 915 0 R (subsubsection.7.4.1) 969 0 R (subsubsection.7.5.1) 1007 0 R (subsubsection.7.6.1) 1095 0 R (subsubsection.7.7.1) 1174 0 R] +/Limits [(subsubsection.7.2.1) (subsubsection.7.7.1)] +>> endobj +3021 0 obj << +/Names [(subsubsection.7.8.1) 1211 0 R (subsubsection.7.9.1) 1301 0 R] +/Limits [(subsubsection.7.8.1) (subsubsection.7.9.1)] +>> endobj +3022 0 obj << +/Kids [2895 0 R 2896 0 R 2897 0 R 2898 0 R 2899 0 R 2900 0 R] +/Limits [(Doc-Start) (group__Datatypes_g84f27605574583d674403f6d71a73a24)] +>> endobj +3023 0 obj << +/Kids [2901 0 R 2902 0 R 2903 0 R 2904 0 R 2905 0 R 2906 0 R] +/Limits [(group__Datatypes_g88e874dbd26b94133467d81b006f0c3f) (group__Datatypes_gge5679e4f41db32b7b91dfc81574fc1d6a166787e251ef2cbaad9213d8e9d2653)] +>> endobj +3024 0 obj << +/Kids [2907 0 R 2908 0 R 2909 0 R 2910 0 R 2911 0 R 2912 0 R] +/Limits [(group__Datatypes_gge5679e4f41db32b7b91dfc81574fc1d6f8c3e04d66cd611db5efcd92a6c52425) (index)] +>> endobj +3025 0 obj << +/Kids [2913 0 R 2914 0 R 2915 0 R 2916 0 R 2917 0 R 2918 0 R] +/Limits [(interfaceppl__Coefficient__tag) (interfaceppl__Congruence__System__tag_a8fd21a451fe377a328d750951ce36f3)] +>> endobj +3026 0 obj << +/Kids [2919 0 R 2920 0 R 2921 0 R 2922 0 R 2923 0 R 2924 0 R] +/Limits [(interfaceppl__Congruence__System__tag_beb7cdeabf40c32d3aa0c33c0499bf97) (interfaceppl__Constraint__System__tag_27f2fdd3945057760e252740c98573eb)] +>> endobj +3027 0 obj << +/Kids [2925 0 R 2926 0 R 2927 0 R 2928 0 R 2929 0 R 2930 0 R] +/Limits [(interfaceppl__Constraint__System__tag_2967727ea790f1d517e1529e3f6be79e) (interfaceppl__Generator__System__const__iterator__tag_b823e62915ff895212640119f062252c)] +>> endobj +3028 0 obj << +/Kids [2931 0 R 2932 0 R 2933 0 R 2934 0 R 2935 0 R 2936 0 R] +/Limits [(interfaceppl__Generator__System__const__iterator__tag_c5344d92361779d92fcb36acf2d406ae) (interfaceppl__Generator__tag_b3fe811bb3a347e553576dadff55339e)] +>> endobj +3029 0 obj << +/Kids [2937 0 R 2938 0 R 2939 0 R 2940 0 R 2941 0 R 2942 0 R] +/Limits [(interfaceppl__Generator__tag_ce16d45c8fbb00ad5b616aa4344fb798) (interfaceppl__Grid__Generator__tag_85958538f17770d4ae66bcd179d747a1)] +>> endobj +3030 0 obj << +/Kids [2943 0 R 2944 0 R 2945 0 R 2946 0 R 2947 0 R 2948 0 R] +/Limits [(interfaceppl__Grid__Generator__tag_8b96d560404b7b7ee0ec7ea1aef80280) (interfaceppl__MIP__Problem__tag_0d5a001977b49f77a4514de614bf3c4c)] +>> endobj +3031 0 obj << +/Kids [2949 0 R 2950 0 R 2951 0 R 2952 0 R 2953 0 R 2954 0 R] +/Limits [(interfaceppl__MIP__Problem__tag_19ff64e7fd60a4e08c782a4683d62167) (interfaceppl__MIP__Problem__tag_e7dc964062c194e3ae8eef0a828164ae)] +>> endobj +3032 0 obj << +/Kids [2955 0 R 2956 0 R 2957 0 R 2958 0 R 2959 0 R 2960 0 R] +/Limits [(interfaceppl__MIP__Problem__tag_ebfd121256089b1415f3bc6989c25bbb) (interfaceppl__Polyhedron__tag_01daecb5bf8e498e7d539d7f3ba8496e)] +>> endobj +3033 0 obj << +/Kids [2961 0 R 2962 0 R 2963 0 R 2964 0 R 2965 0 R 2966 0 R] +/Limits [(interfaceppl__Polyhedron__tag_06c7c974043c12bcf349c119e73cc681) (interfaceppl__Polyhedron__tag_6ff56c68b449b94588ea7290d01625d5)] +>> endobj +3034 0 obj << +/Kids [2967 0 R 2968 0 R 2969 0 R 2970 0 R 2971 0 R 2972 0 R] +/Limits [(interfaceppl__Polyhedron__tag_6ffd595f3e1d85275962dde5f8401c7f) (interfaceppl__Polyhedron__tag_affebaba13f6fc73438bdccde0966547)] +>> endobj +3035 0 obj << +/Kids [2973 0 R 2974 0 R 2975 0 R 2976 0 R 2977 0 R 2978 0 R] +/Limits [(interfaceppl__Polyhedron__tag_b062917f016d95800e29f87c203fd3bb) (interfaceppl__Polyhedron__tag_f93c7e3e554a92e8d3eeb4cf4261debd)] +>> endobj +3036 0 obj << +/Kids [2979 0 R 2980 0 R 2981 0 R 2982 0 R 2983 0 R 2984 0 R] +/Limits [(interfaceppl__Polyhedron__tag_f98013213e01ca8514b6dbd20116af4d) (page.40)] +>> endobj +3037 0 obj << +/Kids [2985 0 R 2986 0 R 2987 0 R 2988 0 R 2989 0 R 2990 0 R] +/Limits [(page.41) (page.73)] +>> endobj +3038 0 obj << +/Kids [2991 0 R 2992 0 R 2993 0 R 2994 0 R 2995 0 R 2996 0 R] +/Limits [(page.74) (paragraph.7.19.2.17)] +>> endobj +3039 0 obj << +/Kids [2997 0 R 2998 0 R 2999 0 R 3000 0 R 3001 0 R 3002 0 R] +/Limits [(paragraph.7.19.2.18) (section*.19)] +>> endobj +3040 0 obj << +/Kids [3003 0 R 3004 0 R 3005 0 R 3006 0 R 3007 0 R 3008 0 R] +/Limits [(section*.2) (section*.51)] +>> endobj +3041 0 obj << +/Kids [3009 0 R 3010 0 R 3011 0 R 3012 0 R 3013 0 R 3014 0 R] +/Limits [(section*.52) (subsection.7.7)] +>> endobj +3042 0 obj << +/Kids [3015 0 R 3016 0 R 3017 0 R 3018 0 R 3019 0 R 3020 0 R] +/Limits [(subsection.7.8) (subsubsection.7.7.1)] +>> endobj +3043 0 obj << +/Kids [3021 0 R] +/Limits [(subsubsection.7.8.1) (subsubsection.7.9.1)] +>> endobj +3044 0 obj << +/Kids [3022 0 R 3023 0 R 3024 0 R 3025 0 R 3026 0 R 3027 0 R] +/Limits [(Doc-Start) (interfaceppl__Generator__System__const__iterator__tag_b823e62915ff895212640119f062252c)] +>> endobj +3045 0 obj << +/Kids [3028 0 R 3029 0 R 3030 0 R 3031 0 R 3032 0 R 3033 0 R] +/Limits [(interfaceppl__Generator__System__const__iterator__tag_c5344d92361779d92fcb36acf2d406ae) (interfaceppl__Polyhedron__tag_6ff56c68b449b94588ea7290d01625d5)] +>> endobj +3046 0 obj << +/Kids [3034 0 R 3035 0 R 3036 0 R 3037 0 R 3038 0 R 3039 0 R] +/Limits [(interfaceppl__Polyhedron__tag_6ffd595f3e1d85275962dde5f8401c7f) (section*.19)] +>> endobj +3047 0 obj << +/Kids [3040 0 R 3041 0 R 3042 0 R 3043 0 R] +/Limits [(section*.2) (subsubsection.7.9.1)] +>> endobj +3048 0 obj << +/Kids [3044 0 R 3045 0 R 3046 0 R 3047 0 R] +/Limits [(Doc-Start) (subsubsection.7.9.1)] +>> endobj +3049 0 obj << +/Dests 3048 0 R +>> endobj +3050 0 obj << +/Type /Catalog +/Pages 2893 0 R +/Outlines 2894 0 R +/Names 3049 0 R +/PageMode/UseOutlines/PageLabels << /Nums [0 << /S /D >> 1 << /S /r >> 2 << /S /D >> ] >> +/OpenAction 137 0 R +>> endobj +3051 0 obj << +/Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.3)/Keywords() +/CreationDate (D:20090418071524+02'00') +/ModDate (D:20090418071524+02'00') +/Trapped /False +/PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6) +>> endobj +xref +0 3052 +0000000001 65535 f +0000000002 00000 f +0000000003 00000 f +0000000004 00000 f +0000000000 00000 f +0000000015 00000 n +0000022488 00000 n +0000726196 00000 n +0000000060 00000 n +0000000134 00000 n +0000027112 00000 n +0000726109 00000 n +0000000179 00000 n +0000000345 00000 n +0000065541 00000 n +0000726020 00000 n +0000000391 00000 n +0000000577 00000 n +0000086896 00000 n +0000725894 00000 n +0000000623 00000 n +0000000713 00000 n +0000086952 00000 n +0000725833 00000 n +0000000764 00000 n +0000000826 00000 n +0000087008 00000 n +0000725707 00000 n +0000000872 00000 n +0000000957 00000 n +0000087064 00000 n +0000725646 00000 n +0000001008 00000 n +0000001088 00000 n +0000094567 00000 n +0000725520 00000 n +0000001134 00000 n +0000001264 00000 n +0000094679 00000 n +0000725446 00000 n +0000001315 00000 n +0000001448 00000 n +0000094797 00000 n +0000725359 00000 n +0000001499 00000 n +0000001730 00000 n +0000098210 00000 n +0000725272 00000 n +0000001781 00000 n +0000001891 00000 n +0000108458 00000 n +0000725185 00000 n +0000001942 00000 n +0000002042 00000 n +0000115777 00000 n +0000725111 00000 n +0000002093 00000 n +0000002208 00000 n +0000159626 00000 n +0000724996 00000 n +0000002254 00000 n +0000002379 00000 n +0000159739 00000 n +0000724922 00000 n +0000002430 00000 n +0000002664 00000 n +0000166339 00000 n +0000724835 00000 n +0000002715 00000 n +0000003063 00000 n +0000173108 00000 n +0000724748 00000 n +0000003114 00000 n +0000003381 00000 n +0000190947 00000 n +0000724661 00000 n +0000003432 00000 n +0000003661 00000 n +0000208382 00000 n +0000724574 00000 n +0000003712 00000 n +0000004060 00000 n +0000218532 00000 n +0000724487 00000 n +0000004111 00000 n +0000004378 00000 n +0000226026 00000 n +0000724400 00000 n +0000004429 00000 n +0000004658 00000 n +0000243423 00000 n +0000724313 00000 n +0000004709 00000 n +0000005052 00000 n +0000251745 00000 n +0000724226 00000 n +0000005103 00000 n +0000005365 00000 n +0000269929 00000 n +0000724137 00000 n +0000005417 00000 n +0000005642 00000 n +0000277589 00000 n +0000724046 00000 n +0000005695 00000 n +0000006067 00000 n +0000286548 00000 n +0000723954 00000 n +0000006120 00000 n +0000006411 00000 n +0000303425 00000 n +0000723862 00000 n +0000006464 00000 n +0000006717 00000 n +0000322386 00000 n +0000723770 00000 n +0000006770 00000 n +0000007038 00000 n +0000339785 00000 n +0000723678 00000 n +0000007091 00000 n +0000007329 00000 n +0000375230 00000 n +0000723586 00000 n +0000007382 00000 n +0000007802 00000 n +0000394914 00000 n +0000723494 00000 n +0000007855 00000 n +0000008242 00000 n +0000400819 00000 n +0000723402 00000 n +0000008295 00000 n +0000008634 00000 n +0000419214 00000 n +0000723324 00000 n +0000008687 00000 n +0000008917 00000 n +0000010191 00000 n +0000010424 00000 n +0000008969 00000 n +0000010310 00000 n +0000010367 00000 n +0000720804 00000 n +0000719228 00000 n +0000719661 00000 n +0000719372 00000 n +0000721160 00000 n +0000012785 00000 n +0000012951 00000 n +0000013103 00000 n +0000013269 00000 n +0000013567 00000 n +0000013742 00000 n +0000013893 00000 n +0000014044 00000 n +0000014195 00000 n +0000014346 00000 n +0000014502 00000 n +0000014652 00000 n +0000014809 00000 n +0000014960 00000 n +0000015115 00000 n +0000015271 00000 n +0000015428 00000 n +0000015585 00000 n +0000015742 00000 n +0000015892 00000 n +0000016049 00000 n +0000016206 00000 n +0000016362 00000 n +0000019955 00000 n +0000016517 00000 n +0000016804 00000 n +0000012454 00000 n +0000010535 00000 n +0000016690 00000 n +0000720448 00000 n +0000013419 00000 n +0000720096 00000 n +0000016747 00000 n +0000065654 00000 n +0000027225 00000 n +0000020111 00000 n +0000020268 00000 n +0000020425 00000 n +0000020582 00000 n +0000020739 00000 n +0000020895 00000 n +0000021052 00000 n +0000021210 00000 n +0000021368 00000 n +0000021526 00000 n +0000021684 00000 n +0000021842 00000 n +0000021999 00000 n +0000022157 00000 n +0000022315 00000 n +0000022600 00000 n +0000019696 00000 n +0000016902 00000 n +0000022543 00000 n +0000720980 00000 n +0000026168 00000 n +0000026352 00000 n +0000026539 00000 n +0000026720 00000 n +0000026882 00000 n +0000027339 00000 n +0000025997 00000 n +0000022724 00000 n +0000027055 00000 n +0000027168 00000 n +0000027282 00000 n +0000030900 00000 n +0000031244 00000 n +0000030761 00000 n +0000027450 00000 n +0000031073 00000 n +0000031130 00000 n +0000031187 00000 n +0000034916 00000 n +0000035260 00000 n +0000034777 00000 n +0000031342 00000 n +0000035089 00000 n +0000035146 00000 n +0000035203 00000 n +0000038420 00000 n +0000038820 00000 n +0000038281 00000 n +0000035358 00000 n +0000038593 00000 n +0000038650 00000 n +0000038707 00000 n +0000038764 00000 n +0000721278 00000 n +0000042501 00000 n +0000042788 00000 n +0000042362 00000 n +0000038918 00000 n +0000042674 00000 n +0000042731 00000 n +0000046204 00000 n +0000046491 00000 n +0000046065 00000 n +0000042886 00000 n +0000046377 00000 n +0000046434 00000 n +0000049881 00000 n +0000050282 00000 n +0000049742 00000 n +0000046589 00000 n +0000050054 00000 n +0000050111 00000 n +0000050168 00000 n +0000050225 00000 n +0000054084 00000 n +0000054428 00000 n +0000053945 00000 n +0000050380 00000 n +0000054257 00000 n +0000054314 00000 n +0000054371 00000 n +0000057596 00000 n +0000058054 00000 n +0000057457 00000 n +0000054526 00000 n +0000057769 00000 n +0000057826 00000 n +0000057883 00000 n +0000057940 00000 n +0000057997 00000 n +0000060918 00000 n +0000061093 00000 n +0000065116 00000 n +0000061267 00000 n +0000061611 00000 n +0000060763 00000 n +0000058152 00000 n +0000061440 00000 n +0000061497 00000 n +0000061554 00000 n +0000720270 00000 n +0000721396 00000 n +0000065311 00000 n +0000065711 00000 n +0000064969 00000 n +0000061722 00000 n +0000065484 00000 n +0000065597 00000 n +0000069724 00000 n +0000069954 00000 n +0000069585 00000 n +0000065809 00000 n +0000069897 00000 n +0000073513 00000 n +0000073743 00000 n +0000073374 00000 n +0000070052 00000 n +0000073686 00000 n +0000077282 00000 n +0000077512 00000 n +0000077143 00000 n +0000073841 00000 n +0000077455 00000 n +0000081053 00000 n +0000081229 00000 n +0000081516 00000 n +0000080906 00000 n +0000077610 00000 n +0000081402 00000 n +0000081459 00000 n +0000083517 00000 n +0000083674 00000 n +0000083831 00000 n +0000083988 00000 n +0000084145 00000 n +0000084302 00000 n +0000084475 00000 n +0000084632 00000 n +0000084828 00000 n +0000084985 00000 n +0000085165 00000 n +0000085322 00000 n +0000085494 00000 n +0000085651 00000 n +0000085848 00000 n +0000086004 00000 n +0000086184 00000 n +0000086341 00000 n +0000086511 00000 n +0000089059 00000 n +0000089255 00000 n +0000086666 00000 n +0000087120 00000 n +0000083226 00000 n +0000081614 00000 n +0000086839 00000 n +0000721514 00000 n +0000159682 00000 n +0000166282 00000 n +0000173051 00000 n +0000190890 00000 n +0000200802 00000 n +0000208953 00000 n +0000225968 00000 n +0000089412 00000 n +0000089591 00000 n +0000089748 00000 n +0000089919 00000 n +0000090077 00000 n +0000090279 00000 n +0000090437 00000 n +0000090622 00000 n +0000090780 00000 n +0000090957 00000 n +0000091114 00000 n +0000091293 00000 n +0000091451 00000 n +0000091625 00000 n +0000091783 00000 n +0000091995 00000 n +0000092190 00000 n +0000092348 00000 n +0000092551 00000 n +0000092746 00000 n +0000092904 00000 n +0000093099 00000 n +0000093257 00000 n +0000093429 00000 n +0000093587 00000 n +0000093775 00000 n +0000093963 00000 n +0000094150 00000 n +0000094337 00000 n +0000094910 00000 n +0000088680 00000 n +0000087218 00000 n +0000094510 00000 n +0000094622 00000 n +0000094735 00000 n +0000094853 00000 n +0000243365 00000 n +0000251687 00000 n +0000269871 00000 n +0000277531 00000 n +0000286490 00000 n +0000303367 00000 n +0000322328 00000 n +0000339727 00000 n +0000375172 00000 n +0000400761 00000 n +0000394857 00000 n +0000419157 00000 n +0000097687 00000 n +0000097801 00000 n +0000097915 00000 n +0000098029 00000 n +0000096579 00000 n +0000096770 00000 n +0000096961 00000 n +0000097152 00000 n +0000100589 00000 n +0000097343 00000 n +0000098494 00000 n +0000096408 00000 n +0000095021 00000 n +0000097516 00000 n +0000097573 00000 n +0000097630 00000 n +0000097744 00000 n +0000097858 00000 n +0000097972 00000 n +0000098091 00000 n +0000098148 00000 n +0000098266 00000 n +0000098323 00000 n +0000098380 00000 n +0000098437 00000 n +0000102665 00000 n +0000100780 00000 n +0000100971 00000 n +0000101161 00000 n +0000101352 00000 n +0000101542 00000 n +0000101732 00000 n +0000105454 00000 n +0000101923 00000 n +0000103006 00000 n +0000100394 00000 n +0000098605 00000 n +0000102096 00000 n +0000102153 00000 n +0000102210 00000 n +0000102267 00000 n +0000102324 00000 n +0000102381 00000 n +0000102437 00000 n +0000102494 00000 n +0000719807 00000 n +0000102551 00000 n +0000102608 00000 n +0000102722 00000 n +0000102779 00000 n +0000102836 00000 n +0000102893 00000 n +0000720624 00000 n +0000102950 00000 n +0000105642 00000 n +0000105861 00000 n +0000106083 00000 n +0000106525 00000 n +0000106746 00000 n +0000106966 00000 n +0000107187 00000 n +0000107408 00000 n +0000107629 00000 n +0000107850 00000 n +0000108039 00000 n +0000108228 00000 n +0000109412 00000 n +0000105211 00000 n +0000103156 00000 n +0000108401 00000 n +0000108514 00000 n +0000106305 00000 n +0000108571 00000 n +0000108628 00000 n +0000108685 00000 n +0000108742 00000 n +0000108799 00000 n +0000108856 00000 n +0000108918 00000 n +0000108980 00000 n +0000109042 00000 n +0000109104 00000 n +0000109165 00000 n +0000109226 00000 n +0000109288 00000 n +0000109350 00000 n +0000115601 00000 n +0000111392 00000 n +0000111585 00000 n +0000111778 00000 n +0000111971 00000 n +0000112144 00000 n +0000112337 00000 n +0000112510 00000 n +0000112703 00000 n +0000112883 00000 n +0000113076 00000 n +0000113256 00000 n +0000113449 00000 n +0000113621 00000 n +0000113814 00000 n +0000113986 00000 n +0000114179 00000 n +0000114359 00000 n +0000114552 00000 n +0000114732 00000 n +0000114925 00000 n +0000115122 00000 n +0000118088 00000 n +0000118284 00000 n +0000115314 00000 n +0000116459 00000 n +0000111085 00000 n +0000109549 00000 n +0000115487 00000 n +0000115544 00000 n +0000115658 00000 n +0000115715 00000 n +0000115833 00000 n +0000115890 00000 n +0000115947 00000 n +0000116004 00000 n +0000116060 00000 n +0000116117 00000 n +0000116174 00000 n +0000116231 00000 n +0000116288 00000 n +0000116345 00000 n +0000116402 00000 n +0000149410 00000 n +0000118669 00000 n +0000118840 00000 n +0000119033 00000 n +0000119204 00000 n +0000119397 00000 n +0000119576 00000 n +0000119769 00000 n +0000119947 00000 n +0000120137 00000 n +0000120332 00000 n +0000120524 00000 n +0000120720 00000 n +0000121104 00000 n +0000121276 00000 n +0000121469 00000 n +0000121641 00000 n +0000121834 00000 n +0000122014 00000 n +0000122207 00000 n +0000122387 00000 n +0000122580 00000 n +0000122777 00000 n +0000123162 00000 n +0000123359 00000 n +0000123742 00000 n +0000123917 00000 n +0000124107 00000 n +0000124283 00000 n +0000124476 00000 n +0000124660 00000 n +0000127609 00000 n +0000127794 00000 n +0000124852 00000 n +0000125993 00000 n +0000117661 00000 n +0000116596 00000 n +0000125025 00000 n +0000125082 00000 n +0000118477 00000 n +0000125139 00000 n +0000125196 00000 n +0000125253 00000 n +0000125310 00000 n +0000125367 00000 n +0000125424 00000 n +0000120913 00000 n +0000125481 00000 n +0000125538 00000 n +0000125595 00000 n +0000125652 00000 n +0000125709 00000 n +0000122970 00000 n +0000125766 00000 n +0000123551 00000 n +0000125823 00000 n +0000125880 00000 n +0000125937 00000 n +0000721632 00000 n +0000127987 00000 n +0000128189 00000 n +0000128574 00000 n +0000128776 00000 n +0000129161 00000 n +0000129335 00000 n +0000129527 00000 n +0000129701 00000 n +0000129894 00000 n +0000130065 00000 n +0000130257 00000 n +0000130428 00000 n +0000130620 00000 n +0000130815 00000 n +0000131007 00000 n +0000131202 00000 n +0000131587 00000 n +0000131791 00000 n +0000132176 00000 n +0000132381 00000 n +0000132765 00000 n +0000132977 00000 n +0000133362 00000 n +0000133574 00000 n +0000137165 00000 n +0000133959 00000 n +0000134930 00000 n +0000127206 00000 n +0000126117 00000 n +0000134132 00000 n +0000134189 00000 n +0000134246 00000 n +0000128382 00000 n +0000134303 00000 n +0000128969 00000 n +0000134360 00000 n +0000134417 00000 n +0000134474 00000 n +0000134531 00000 n +0000134588 00000 n +0000134645 00000 n +0000131395 00000 n +0000134702 00000 n +0000131984 00000 n +0000134759 00000 n +0000132573 00000 n +0000134816 00000 n +0000133170 00000 n +0000134873 00000 n +0000133767 00000 n +0000137358 00000 n +0000137583 00000 n +0000137809 00000 n +0000138034 00000 n +0000138260 00000 n +0000138485 00000 n +0000138678 00000 n +0000138904 00000 n +0000139354 00000 n +0000139579 00000 n +0000140030 00000 n +0000140223 00000 n +0000140449 00000 n +0000140899 00000 n +0000141125 00000 n +0000141318 00000 n +0000141511 00000 n +0000141704 00000 n +0000141897 00000 n +0000142085 00000 n +0000142277 00000 n +0000142470 00000 n +0000142663 00000 n +0000142856 00000 n +0000143049 00000 n +0000143242 00000 n +0000143435 00000 n +0000143628 00000 n +0000143820 00000 n +0000147012 00000 n +0000147205 00000 n +0000144013 00000 n +0000144755 00000 n +0000136762 00000 n +0000135054 00000 n +0000144186 00000 n +0000144243 00000 n +0000139129 00000 n +0000139805 00000 n +0000140674 00000 n +0000144300 00000 n +0000144357 00000 n +0000144414 00000 n +0000144471 00000 n +0000144527 00000 n +0000144584 00000 n +0000144641 00000 n +0000144698 00000 n +0000151615 00000 n +0000151729 00000 n +0000151791 00000 n +0000151853 00000 n +0000151913 00000 n +0000151975 00000 n +0000152037 00000 n +0000152150 00000 n +0000152212 00000 n +0000152274 00000 n +0000152336 00000 n +0000152398 00000 n +0000152512 00000 n +0000152574 00000 n +0000152636 00000 n +0000152754 00000 n +0000147398 00000 n +0000147590 00000 n +0000147783 00000 n +0000147975 00000 n +0000148168 00000 n +0000148361 00000 n +0000148554 00000 n +0000149524 00000 n +0000146809 00000 n +0000144879 00000 n +0000148727 00000 n +0000148784 00000 n +0000148841 00000 n +0000148898 00000 n +0000148955 00000 n +0000149012 00000 n +0000149069 00000 n +0000149126 00000 n +0000149182 00000 n +0000149239 00000 n +0000149296 00000 n +0000149353 00000 n +0000149467 00000 n +0000151328 00000 n +0000152868 00000 n +0000151189 00000 n +0000149648 00000 n +0000151501 00000 n +0000151558 00000 n +0000151672 00000 n +0000718358 00000 n +0000718649 00000 n +0000152094 00000 n +0000152455 00000 n +0000152698 00000 n +0000152811 00000 n +0000155307 00000 n +0000155513 00000 n +0000155686 00000 n +0000155892 00000 n +0000156065 00000 n +0000156270 00000 n +0000156443 00000 n +0000156636 00000 n +0000156841 00000 n +0000157014 00000 n +0000157219 00000 n +0000157391 00000 n +0000157583 00000 n +0000157789 00000 n +0000157982 00000 n +0000158188 00000 n +0000158381 00000 n +0000158587 00000 n +0000158780 00000 n +0000158985 00000 n +0000159191 00000 n +0000162776 00000 n +0000162982 00000 n +0000159396 00000 n +0000160478 00000 n +0000155000 00000 n +0000153017 00000 n +0000159569 00000 n +0000159795 00000 n +0000159852 00000 n +0000159909 00000 n +0000159966 00000 n +0000160023 00000 n +0000160080 00000 n +0000160136 00000 n +0000160193 00000 n +0000160250 00000 n +0000160307 00000 n +0000160364 00000 n +0000160421 00000 n +0000163175 00000 n +0000163381 00000 n +0000163574 00000 n +0000163780 00000 n +0000163971 00000 n +0000164201 00000 n +0000164398 00000 n +0000164626 00000 n +0000164823 00000 n +0000165208 00000 n +0000165438 00000 n +0000165634 00000 n +0000168898 00000 n +0000169127 00000 n +0000165826 00000 n +0000166621 00000 n +0000162517 00000 n +0000160615 00000 n +0000165999 00000 n +0000166056 00000 n +0000166113 00000 n +0000166170 00000 n +0000166226 00000 n +0000166395 00000 n +0000166451 00000 n +0000166508 00000 n +0000165016 00000 n +0000166565 00000 n +0000721750 00000 n +0000169512 00000 n +0000169742 00000 n +0000170128 00000 n +0000170321 00000 n +0000170551 00000 n +0000170943 00000 n +0000171173 00000 n +0000171558 00000 n +0000171750 00000 n +0000171963 00000 n +0000172143 00000 n +0000172356 00000 n +0000175908 00000 n +0000176121 00000 n +0000176301 00000 n +0000172536 00000 n +0000173334 00000 n +0000168615 00000 n +0000166758 00000 n +0000172709 00000 n +0000172766 00000 n +0000169320 00000 n +0000172823 00000 n +0000169935 00000 n +0000172880 00000 n +0000170748 00000 n +0000172937 00000 n +0000171366 00000 n +0000172994 00000 n +0000173164 00000 n +0000173221 00000 n +0000173278 00000 n +0000176687 00000 n +0000176899 00000 n +0000177078 00000 n +0000177271 00000 n +0000177484 00000 n +0000177663 00000 n +0000177856 00000 n +0000178069 00000 n +0000178262 00000 n +0000178475 00000 n +0000178668 00000 n +0000179054 00000 n +0000179267 00000 n +0000179460 00000 n +0000179672 00000 n +0000179864 00000 n +0000180257 00000 n +0000180470 00000 n +0000180663 00000 n +0000181057 00000 n +0000181269 00000 n +0000181461 00000 n +0000181673 00000 n +0000181853 00000 n +0000182065 00000 n +0000182244 00000 n +0000182629 00000 n +0000182839 00000 n +0000186495 00000 n +0000186707 00000 n +0000186899 00000 n +0000187112 00000 n +0000183028 00000 n +0000183941 00000 n +0000175481 00000 n +0000173471 00000 n +0000183201 00000 n +0000183258 00000 n +0000176494 00000 n +0000183315 00000 n +0000183372 00000 n +0000183429 00000 n +0000183486 00000 n +0000178861 00000 n +0000183543 00000 n +0000183600 00000 n +0000180060 00000 n +0000183657 00000 n +0000180860 00000 n +0000183714 00000 n +0000183771 00000 n +0000183827 00000 n +0000182436 00000 n +0000183884 00000 n +0000187305 00000 n +0000187517 00000 n +0000187710 00000 n +0000187923 00000 n +0000188103 00000 n +0000188307 00000 n +0000188478 00000 n +0000188670 00000 n +0000189055 00000 n +0000189260 00000 n +0000189432 00000 n +0000189636 00000 n +0000189806 00000 n +0000190010 00000 n +0000190182 00000 n +0000193847 00000 n +0000194052 00000 n +0000194224 00000 n +0000190375 00000 n +0000191288 00000 n +0000186196 00000 n +0000184065 00000 n +0000190548 00000 n +0000190605 00000 n +0000190662 00000 n +0000190719 00000 n +0000190776 00000 n +0000190833 00000 n +0000191003 00000 n +0000191060 00000 n +0000188862 00000 n +0000718504 00000 n +0000719084 00000 n +0000191117 00000 n +0000191174 00000 n +0000191231 00000 n +0000194417 00000 n +0000194622 00000 n +0000194815 00000 n +0000195020 00000 n +0000195212 00000 n +0000195405 00000 n +0000195608 00000 n +0000195800 00000 n +0000195993 00000 n +0000196339 00000 n +0000196544 00000 n +0000196737 00000 n +0000196910 00000 n +0000197114 00000 n +0000197306 00000 n +0000197477 00000 n +0000197681 00000 n +0000197873 00000 n +0000198078 00000 n +0000198271 00000 n +0000198472 00000 n +0000198661 00000 n +0000198866 00000 n +0000199058 00000 n +0000199263 00000 n +0000199456 00000 n +0000199660 00000 n +0000199832 00000 n +0000200858 00000 n +0000193460 00000 n +0000191451 00000 n +0000200005 00000 n +0000200062 00000 n +0000200119 00000 n +0000200176 00000 n +0000200233 00000 n +0000196166 00000 n +0000200290 00000 n +0000200347 00000 n +0000200404 00000 n +0000200461 00000 n +0000200518 00000 n +0000200575 00000 n +0000200632 00000 n +0000200688 00000 n +0000200745 00000 n +0000203242 00000 n +0000203472 00000 n +0000203669 00000 n +0000203897 00000 n +0000204289 00000 n +0000204482 00000 n +0000204711 00000 n +0000205105 00000 n +0000205298 00000 n +0000205527 00000 n +0000205913 00000 n +0000206142 00000 n +0000206528 00000 n +0000206721 00000 n +0000206950 00000 n +0000207344 00000 n +0000207574 00000 n +0000207960 00000 n +0000208152 00000 n +0000209009 00000 n +0000202907 00000 n +0000200982 00000 n +0000208325 00000 n +0000208438 00000 n +0000208495 00000 n +0000208551 00000 n +0000204092 00000 n +0000208608 00000 n +0000204908 00000 n +0000208665 00000 n +0000205720 00000 n +0000208722 00000 n +0000206335 00000 n +0000208780 00000 n +0000207146 00000 n +0000208838 00000 n +0000207767 00000 n +0000208896 00000 n +0000211545 00000 n +0000211759 00000 n +0000211940 00000 n +0000212154 00000 n +0000212335 00000 n +0000212548 00000 n +0000212728 00000 n +0000213115 00000 n +0000213329 00000 n +0000213510 00000 n +0000213898 00000 n +0000214112 00000 n +0000214293 00000 n +0000214681 00000 n +0000214895 00000 n +0000215089 00000 n +0000215303 00000 n +0000215497 00000 n +0000215885 00000 n +0000216098 00000 n +0000216290 00000 n +0000216503 00000 n +0000216696 00000 n +0000216910 00000 n +0000217104 00000 n +0000217500 00000 n +0000217713 00000 n +0000217906 00000 n +0000221600 00000 n +0000221814 00000 n +0000218299 00000 n +0000219295 00000 n +0000211095 00000 n +0000209146 00000 n +0000218473 00000 n +0000218589 00000 n +0000218648 00000 n +0000218707 00000 n +0000218765 00000 n +0000212921 00000 n +0000218824 00000 n +0000213704 00000 n +0000218883 00000 n +0000214487 00000 n +0000218942 00000 n +0000219001 00000 n +0000215691 00000 n +0000219060 00000 n +0000219119 00000 n +0000219178 00000 n +0000217302 00000 n +0000219237 00000 n +0000218103 00000 n +0000721868 00000 n +0000222008 00000 n +0000222222 00000 n +0000222401 00000 n +0000222615 00000 n +0000222794 00000 n +0000223182 00000 n +0000223396 00000 n +0000223590 00000 n +0000223803 00000 n +0000223995 00000 n +0000224209 00000 n +0000224403 00000 n +0000224617 00000 n +0000224810 00000 n +0000225024 00000 n +0000228857 00000 n +0000229063 00000 n +0000229236 00000 n +0000229430 00000 n +0000225205 00000 n +0000226083 00000 n +0000221294 00000 n +0000219433 00000 n +0000225379 00000 n +0000225438 00000 n +0000225497 00000 n +0000225556 00000 n +0000222988 00000 n +0000225615 00000 n +0000225673 00000 n +0000225732 00000 n +0000225791 00000 n +0000225850 00000 n +0000225909 00000 n +0000229817 00000 n +0000230023 00000 n +0000230196 00000 n +0000230401 00000 n +0000230573 00000 n +0000230779 00000 n +0000230952 00000 n +0000231146 00000 n +0000231352 00000 n +0000231525 00000 n +0000231719 00000 n +0000231925 00000 n +0000232119 00000 n +0000232324 00000 n +0000232517 00000 n +0000232709 00000 n +0000232915 00000 n +0000233109 00000 n +0000233315 00000 n +0000233509 00000 n +0000233702 00000 n +0000234050 00000 n +0000234255 00000 n +0000234448 00000 n +0000234621 00000 n +0000234826 00000 n +0000235019 00000 n +0000235225 00000 n +0000238778 00000 n +0000238984 00000 n +0000239178 00000 n +0000239384 00000 n +0000235419 00000 n +0000236416 00000 n +0000228407 00000 n +0000226221 00000 n +0000235593 00000 n +0000235652 00000 n +0000235711 00000 n +0000229624 00000 n +0000235770 00000 n +0000235828 00000 n +0000235887 00000 n +0000235945 00000 n +0000236004 00000 n +0000236063 00000 n +0000236122 00000 n +0000236181 00000 n +0000233876 00000 n +0000236240 00000 n +0000236299 00000 n +0000236357 00000 n +0000239578 00000 n +0000239784 00000 n +0000239977 00000 n +0000240182 00000 n +0000240353 00000 n +0000240583 00000 n +0000240780 00000 n +0000241009 00000 n +0000241403 00000 n +0000241597 00000 n +0000241827 00000 n +0000242221 00000 n +0000242414 00000 n +0000242644 00000 n +0000246243 00000 n +0000246473 00000 n +0000246860 00000 n +0000242838 00000 n +0000243774 00000 n +0000238454 00000 n +0000236567 00000 n +0000243012 00000 n +0000243071 00000 n +0000243130 00000 n +0000243189 00000 n +0000243248 00000 n +0000243307 00000 n +0000243480 00000 n +0000243539 00000 n +0000243597 00000 n +0000241206 00000 n +0000243656 00000 n +0000242024 00000 n +0000243715 00000 n +0000247054 00000 n +0000247284 00000 n +0000247677 00000 n +0000247907 00000 n +0000248294 00000 n +0000248487 00000 n +0000248700 00000 n +0000248880 00000 n +0000249093 00000 n +0000249273 00000 n +0000249661 00000 n +0000249874 00000 n +0000250054 00000 n +0000250442 00000 n +0000250655 00000 n +0000250835 00000 n +0000254688 00000 n +0000254901 00000 n +0000251219 00000 n +0000252097 00000 n +0000245874 00000 n +0000243912 00000 n +0000251393 00000 n +0000251452 00000 n +0000246667 00000 n +0000251511 00000 n +0000247481 00000 n +0000251570 00000 n +0000248101 00000 n +0000251629 00000 n +0000251802 00000 n +0000251861 00000 n +0000251920 00000 n +0000249467 00000 n +0000251979 00000 n +0000250248 00000 n +0000252038 00000 n +0000251029 00000 n +0000255093 00000 n +0000255305 00000 n +0000255498 00000 n +0000255885 00000 n +0000256097 00000 n +0000256291 00000 n +0000256504 00000 n +0000256698 00000 n +0000257091 00000 n +0000257303 00000 n +0000257496 00000 n +0000257888 00000 n +0000258100 00000 n +0000258294 00000 n +0000258507 00000 n +0000258687 00000 n +0000258900 00000 n +0000259080 00000 n +0000259468 00000 n +0000259681 00000 n +0000259875 00000 n +0000260088 00000 n +0000260282 00000 n +0000260494 00000 n +0000260687 00000 n +0000260900 00000 n +0000261094 00000 n +0000261307 00000 n +0000261487 00000 n +0000262487 00000 n +0000254238 00000 n +0000252235 00000 n +0000261661 00000 n +0000261720 00000 n +0000261779 00000 n +0000255691 00000 n +0000261838 00000 n +0000261897 00000 n +0000256894 00000 n +0000261956 00000 n +0000257691 00000 n +0000262015 00000 n +0000262074 00000 n +0000262133 00000 n +0000259274 00000 n +0000262192 00000 n +0000262251 00000 n +0000262310 00000 n +0000262369 00000 n +0000262428 00000 n +0000265154 00000 n +0000265358 00000 n +0000265529 00000 n +0000265722 00000 n +0000266109 00000 n +0000266303 00000 n +0000266508 00000 n +0000266680 00000 n +0000266885 00000 n +0000267057 00000 n +0000267262 00000 n +0000267434 00000 n +0000267628 00000 n +0000267832 00000 n +0000268004 00000 n +0000268198 00000 n +0000268401 00000 n +0000268593 00000 n +0000268797 00000 n +0000268989 00000 n +0000269182 00000 n +0000269386 00000 n +0000272889 00000 n +0000273094 00000 n +0000273288 00000 n +0000273482 00000 n +0000269579 00000 n +0000270515 00000 n +0000264803 00000 n +0000262612 00000 n +0000269753 00000 n +0000269812 00000 n +0000269986 00000 n +0000270045 00000 n +0000265915 00000 n +0000270104 00000 n +0000719950 00000 n +0000718794 00000 n +0000270163 00000 n +0000270220 00000 n +0000270279 00000 n +0000270338 00000 n +0000270397 00000 n +0000270456 00000 n +0000721993 00000 n +0000273830 00000 n +0000274033 00000 n +0000274226 00000 n +0000274399 00000 n +0000274604 00000 n +0000274798 00000 n +0000275003 00000 n +0000275196 00000 n +0000275401 00000 n +0000275595 00000 n +0000275800 00000 n +0000275994 00000 n +0000276198 00000 n +0000276392 00000 n +0000276597 00000 n +0000280126 00000 n +0000280361 00000 n +0000280766 00000 n +0000281237 00000 n +0000281439 00000 n +0000276769 00000 n +0000277706 00000 n +0000272565 00000 n +0000270681 00000 n +0000276943 00000 n +0000277002 00000 n +0000273656 00000 n +0000277061 00000 n +0000277120 00000 n +0000277179 00000 n +0000277238 00000 n +0000277297 00000 n +0000277356 00000 n +0000277414 00000 n +0000277473 00000 n +0000277647 00000 n +0000281826 00000 n +0000282298 00000 n +0000282501 00000 n +0000282889 00000 n +0000283124 00000 n +0000283512 00000 n +0000283748 00000 n +0000284136 00000 n +0000284330 00000 n +0000284566 00000 n +0000284970 00000 n +0000285205 00000 n +0000285593 00000 n +0000285787 00000 n +0000286606 00000 n +0000279739 00000 n +0000277844 00000 n +0000285961 00000 n +0000286020 00000 n +0000280564 00000 n +0000286079 00000 n +0000281002 00000 n +0000281632 00000 n +0000286138 00000 n +0000282062 00000 n +0000282695 00000 n +0000286197 00000 n +0000283318 00000 n +0000286256 00000 n +0000283942 00000 n +0000286313 00000 n +0000284769 00000 n +0000286372 00000 n +0000285399 00000 n +0000286431 00000 n +0000289198 00000 n +0000289417 00000 n +0000289603 00000 n +0000289822 00000 n +0000290008 00000 n +0000290202 00000 n +0000290421 00000 n +0000290793 00000 n +0000290987 00000 n +0000291205 00000 n +0000291576 00000 n +0000291769 00000 n +0000291987 00000 n +0000292180 00000 n +0000292398 00000 n +0000292591 00000 n +0000292785 00000 n +0000293004 00000 n +0000293198 00000 n +0000293417 00000 n +0000293611 00000 n +0000294016 00000 n +0000294235 00000 n +0000294428 00000 n +0000294833 00000 n +0000295052 00000 n +0000295246 00000 n +0000295465 00000 n +0000299111 00000 n +0000299330 00000 n +0000299514 00000 n +0000295649 00000 n +0000296588 00000 n +0000288766 00000 n +0000286744 00000 n +0000295823 00000 n +0000295882 00000 n +0000295941 00000 n +0000296000 00000 n +0000296059 00000 n +0000290607 00000 n +0000296117 00000 n +0000291391 00000 n +0000296176 00000 n +0000296234 00000 n +0000296293 00000 n +0000296352 00000 n +0000293813 00000 n +0000296411 00000 n +0000294630 00000 n +0000296470 00000 n +0000296529 00000 n +0000299708 00000 n +0000299927 00000 n +0000300121 00000 n +0000300340 00000 n +0000300534 00000 n +0000300752 00000 n +0000300945 00000 n +0000301164 00000 n +0000301358 00000 n +0000301575 00000 n +0000301757 00000 n +0000301966 00000 n +0000302142 00000 n +0000302334 00000 n +0000302528 00000 n +0000306406 00000 n +0000306616 00000 n +0000302722 00000 n +0000303601 00000 n +0000298805 00000 n +0000296713 00000 n +0000302896 00000 n +0000302955 00000 n +0000303014 00000 n +0000303072 00000 n +0000303131 00000 n +0000303190 00000 n +0000303249 00000 n +0000303308 00000 n +0000303483 00000 n +0000303542 00000 n +0000306793 00000 n +0000307003 00000 n +0000307181 00000 n +0000307568 00000 n +0000307779 00000 n +0000307957 00000 n +0000308345 00000 n +0000308556 00000 n +0000308750 00000 n +0000308960 00000 n +0000309153 00000 n +0000309345 00000 n +0000309556 00000 n +0000309750 00000 n +0000309961 00000 n +0000310155 00000 n +0000310349 00000 n +0000310523 00000 n +0000310734 00000 n +0000310927 00000 n +0000311101 00000 n +0000311311 00000 n +0000311504 00000 n +0000311715 00000 n +0000311909 00000 n +0000312120 00000 n +0000312314 00000 n +0000312525 00000 n +0000312719 00000 n +0000312930 00000 n +0000313124 00000 n +0000313335 00000 n +0000313513 00000 n +0000314568 00000 n +0000305938 00000 n +0000303739 00000 n +0000313687 00000 n +0000313746 00000 n +0000313805 00000 n +0000307375 00000 n +0000313863 00000 n +0000308151 00000 n +0000313921 00000 n +0000313980 00000 n +0000314039 00000 n +0000314098 00000 n +0000314157 00000 n +0000314216 00000 n +0000314274 00000 n +0000314333 00000 n +0000314392 00000 n +0000314451 00000 n +0000314509 00000 n +0000316952 00000 n +0000317166 00000 n +0000317347 00000 n +0000317561 00000 n +0000317741 00000 n +0000318129 00000 n +0000318341 00000 n +0000318521 00000 n +0000318909 00000 n +0000319123 00000 n +0000319304 00000 n +0000319691 00000 n +0000319905 00000 n +0000320086 00000 n +0000320472 00000 n +0000320685 00000 n +0000320866 00000 n +0000321254 00000 n +0000321468 00000 n +0000321649 00000 n +0000325590 00000 n +0000325804 00000 n +0000325985 00000 n +0000322036 00000 n +0000322915 00000 n +0000316574 00000 n +0000314721 00000 n +0000322210 00000 n +0000322269 00000 n +0000322444 00000 n +0000322503 00000 n +0000322562 00000 n +0000317935 00000 n +0000322621 00000 n +0000318715 00000 n +0000322680 00000 n +0000319498 00000 n +0000322739 00000 n +0000320280 00000 n +0000322798 00000 n +0000321060 00000 n +0000322856 00000 n +0000321843 00000 n +0000722118 00000 n +0000326373 00000 n +0000326587 00000 n +0000326781 00000 n +0000326995 00000 n +0000327189 00000 n +0000327577 00000 n +0000327790 00000 n +0000327983 00000 n +0000328175 00000 n +0000328349 00000 n +0000328563 00000 n +0000328757 00000 n +0000329105 00000 n +0000329318 00000 n +0000329511 00000 n +0000329724 00000 n +0000329905 00000 n +0000330098 00000 n +0000330292 00000 n +0000330505 00000 n +0000330685 00000 n +0000331072 00000 n +0000331285 00000 n +0000331465 00000 n +0000331852 00000 n +0000332066 00000 n +0000332247 00000 n +0000332441 00000 n +0000332654 00000 n +0000332834 00000 n +0000336079 00000 n +0000336293 00000 n +0000333221 00000 n +0000334101 00000 n +0000325095 00000 n +0000323053 00000 n +0000333395 00000 n +0000333454 00000 n +0000326179 00000 n +0000333512 00000 n +0000333571 00000 n +0000327383 00000 n +0000333630 00000 n +0000333689 00000 n +0000328931 00000 n +0000333748 00000 n +0000333807 00000 n +0000333866 00000 n +0000330878 00000 n +0000333925 00000 n +0000331658 00000 n +0000333983 00000 n +0000334042 00000 n +0000333027 00000 n +0000336487 00000 n +0000336701 00000 n +0000336895 00000 n +0000337107 00000 n +0000337300 00000 n +0000337514 00000 n +0000337708 00000 n +0000337922 00000 n +0000338103 00000 n +0000338311 00000 n +0000338519 00000 n +0000338727 00000 n +0000338934 00000 n +0000342912 00000 n +0000339140 00000 n +0000340197 00000 n +0000335800 00000 n +0000334226 00000 n +0000339314 00000 n +0000339373 00000 n +0000339432 00000 n +0000339491 00000 n +0000339550 00000 n +0000339609 00000 n +0000339668 00000 n +0000339843 00000 n +0000339902 00000 n +0000339961 00000 n +0000340020 00000 n +0000340079 00000 n +0000340138 00000 n +0000343120 00000 n +0000343327 00000 n +0000343535 00000 n +0000343743 00000 n +0000343951 00000 n +0000344126 00000 n +0000344514 00000 n +0000344722 00000 n +0000344896 00000 n +0000345089 00000 n +0000345477 00000 n +0000345671 00000 n +0000345879 00000 n +0000346053 00000 n +0000346441 00000 n +0000346648 00000 n +0000346822 00000 n +0000347209 00000 n +0000347415 00000 n +0000347607 00000 n +0000347814 00000 n +0000348005 00000 n +0000348197 00000 n +0000348404 00000 n +0000348597 00000 n +0000348791 00000 n +0000348998 00000 n +0000349191 00000 n +0000353322 00000 n +0000353530 00000 n +0000353724 00000 n +0000349578 00000 n +0000350514 00000 n +0000342462 00000 n +0000340335 00000 n +0000349752 00000 n +0000349811 00000 n +0000349870 00000 n +0000349929 00000 n +0000349988 00000 n +0000350047 00000 n +0000344320 00000 n +0000350106 00000 n +0000345283 00000 n +0000350165 00000 n +0000346247 00000 n +0000350224 00000 n +0000347015 00000 n +0000350282 00000 n +0000350340 00000 n +0000350399 00000 n +0000350456 00000 n +0000349384 00000 n +0000354112 00000 n +0000354317 00000 n +0000354509 00000 n +0000354701 00000 n +0000354895 00000 n +0000355103 00000 n +0000355297 00000 n +0000355685 00000 n +0000355893 00000 n +0000356087 00000 n +0000356295 00000 n +0000356489 00000 n +0000356697 00000 n +0000356872 00000 n +0000357080 00000 n +0000357255 00000 n +0000357642 00000 n +0000357850 00000 n +0000358025 00000 n +0000358413 00000 n +0000358620 00000 n +0000358794 00000 n +0000358988 00000 n +0000359195 00000 n +0000359369 00000 n +0000359756 00000 n +0000359964 00000 n +0000360139 00000 n +0000360527 00000 n +0000360735 00000 n +0000364363 00000 n +0000364571 00000 n +0000364765 00000 n +0000364972 00000 n +0000360910 00000 n +0000361850 00000 n +0000352827 00000 n +0000350639 00000 n +0000361084 00000 n +0000361143 00000 n +0000353918 00000 n +0000361202 00000 n +0000361261 00000 n +0000355491 00000 n +0000361320 00000 n +0000361379 00000 n +0000361438 00000 n +0000361497 00000 n +0000357449 00000 n +0000361556 00000 n +0000358219 00000 n +0000361615 00000 n +0000361674 00000 n +0000359562 00000 n +0000361733 00000 n +0000360333 00000 n +0000361791 00000 n +0000365165 00000 n +0000365373 00000 n +0000365567 00000 n +0000365955 00000 n +0000366128 00000 n +0000366302 00000 n +0000366510 00000 n +0000366704 00000 n +0000367092 00000 n +0000367300 00000 n +0000367494 00000 n +0000367881 00000 n +0000368089 00000 n +0000368283 00000 n +0000368456 00000 n +0000368630 00000 n +0000368837 00000 n +0000369030 00000 n +0000369238 00000 n +0000369413 00000 n +0000369621 00000 n +0000369815 00000 n +0000370022 00000 n +0000370216 00000 n +0000370424 00000 n +0000370617 00000 n +0000370825 00000 n +0000371018 00000 n +0000371226 00000 n +0000371401 00000 n +0000372278 00000 n +0000363895 00000 n +0000361975 00000 n +0000371575 00000 n +0000371634 00000 n +0000365761 00000 n +0000371693 00000 n +0000366898 00000 n +0000371752 00000 n +0000367688 00000 n +0000371807 00000 n +0000371866 00000 n +0000371925 00000 n +0000371983 00000 n +0000372042 00000 n +0000372101 00000 n +0000372160 00000 n +0000372219 00000 n +0000374819 00000 n +0000374937 00000 n +0000375055 00000 n +0000374331 00000 n +0000377864 00000 n +0000378110 00000 n +0000374527 00000 n +0000375347 00000 n +0000374178 00000 n +0000372403 00000 n +0000374701 00000 n +0000374760 00000 n +0000374878 00000 n +0000374996 00000 n +0000375113 00000 n +0000375288 00000 n +0000722243 00000 n +0000378536 00000 n +0000378780 00000 n +0000379205 00000 n +0000379593 00000 n +0000379839 00000 n +0000380227 00000 n +0000380440 00000 n +0000380686 00000 n +0000381074 00000 n +0000381287 00000 n +0000381533 00000 n +0000381920 00000 n +0000382165 00000 n +0000382551 00000 n +0000382744 00000 n +0000382990 00000 n +0000383416 00000 n +0000383662 00000 n +0000384088 00000 n +0000384333 00000 n +0000384720 00000 n +0000385107 00000 n +0000385303 00000 n +0000386244 00000 n +0000377405 00000 n +0000375459 00000 n +0000385477 00000 n +0000385536 00000 n +0000378323 00000 n +0000385595 00000 n +0000378992 00000 n +0000379399 00000 n +0000385654 00000 n +0000380033 00000 n +0000385713 00000 n +0000380880 00000 n +0000385772 00000 n +0000381727 00000 n +0000382357 00000 n +0000385831 00000 n +0000383203 00000 n +0000385890 00000 n +0000383875 00000 n +0000385949 00000 n +0000384526 00000 n +0000384913 00000 n +0000386008 00000 n +0000386067 00000 n +0000386126 00000 n +0000386185 00000 n +0000388718 00000 n +0000388914 00000 n +0000389153 00000 n +0000389565 00000 n +0000389803 00000 n +0000390214 00000 n +0000390408 00000 n +0000390647 00000 n +0000391038 00000 n +0000391242 00000 n +0000391481 00000 n +0000391676 00000 n +0000391882 00000 n +0000392120 00000 n +0000392508 00000 n +0000392746 00000 n +0000393134 00000 n +0000393327 00000 n +0000393565 00000 n +0000393977 00000 n +0000394215 00000 n +0000397986 00000 n +0000398225 00000 n +0000398612 00000 n +0000394624 00000 n +0000395444 00000 n +0000388322 00000 n +0000386382 00000 n +0000394798 00000 n +0000394972 00000 n +0000395031 00000 n +0000389359 00000 n +0000395090 00000 n +0000390008 00000 n +0000395149 00000 n +0000390843 00000 n +0000395208 00000 n +0000395267 00000 n +0000392314 00000 n +0000392940 00000 n +0000395326 00000 n +0000393771 00000 n +0000395385 00000 n +0000394420 00000 n +0000400643 00000 n +0000398805 00000 n +0000399001 00000 n +0000399230 00000 n +0000399618 00000 n +0000399847 00000 n +0000403740 00000 n +0000404198 00000 n +0000404392 00000 n +0000400233 00000 n +0000400995 00000 n +0000397743 00000 n +0000395569 00000 n +0000400407 00000 n +0000400466 00000 n +0000398419 00000 n +0000400525 00000 n +0000400584 00000 n +0000400702 00000 n +0000400877 00000 n +0000400936 00000 n +0000399424 00000 n +0000400040 00000 n +0000410379 00000 n +0000404780 00000 n +0000405236 00000 n +0000405429 00000 n +0000405816 00000 n +0000406045 00000 n +0000406437 00000 n +0000406631 00000 n +0000406860 00000 n +0000407252 00000 n +0000407446 00000 n +0000407857 00000 n +0000408085 00000 n +0000408476 00000 n +0000408669 00000 n +0000409054 00000 n +0000409283 00000 n +0000409675 00000 n +0000410497 00000 n +0000403335 00000 n +0000401133 00000 n +0000409849 00000 n +0000409908 00000 n +0000403969 00000 n +0000404586 00000 n +0000409967 00000 n +0000405008 00000 n +0000405622 00000 n +0000410026 00000 n +0000406241 00000 n +0000410084 00000 n +0000407056 00000 n +0000407652 00000 n +0000410143 00000 n +0000408280 00000 n +0000408863 00000 n +0000410202 00000 n +0000409479 00000 n +0000410261 00000 n +0000410320 00000 n +0000410438 00000 n +0000413045 00000 n +0000413251 00000 n +0000413424 00000 n +0000413811 00000 n +0000414016 00000 n +0000414188 00000 n +0000414575 00000 n +0000414781 00000 n +0000414954 00000 n +0000415148 00000 n +0000415353 00000 n +0000415525 00000 n +0000415912 00000 n +0000416118 00000 n +0000416291 00000 n +0000416653 00000 n +0000416859 00000 n +0000417032 00000 n +0000417420 00000 n +0000417624 00000 n +0000417796 00000 n +0000418157 00000 n +0000418363 00000 n +0000418536 00000 n +0000422540 00000 n +0000422746 00000 n +0000422918 00000 n +0000418924 00000 n +0000419506 00000 n +0000412622 00000 n +0000410635 00000 n +0000419098 00000 n +0000419271 00000 n +0000419330 00000 n +0000413618 00000 n +0000419389 00000 n +0000414381 00000 n +0000415718 00000 n +0000416472 00000 n +0000417226 00000 n +0000417976 00000 n +0000419447 00000 n +0000418730 00000 n +0000529553 00000 n +0000529671 00000 n +0000529789 00000 n +0000529912 00000 n +0000530030 00000 n +0000423306 00000 n +0000423511 00000 n +0000423683 00000 n +0000424069 00000 n +0000424274 00000 n +0000424620 00000 n +0000424814 00000 n +0000425020 00000 n +0000425193 00000 n +0000425580 00000 n +0000425786 00000 n +0000425959 00000 n +0000426321 00000 n +0000426526 00000 n +0000426699 00000 n +0000427086 00000 n +0000427292 00000 n +0000427465 00000 n +0000427827 00000 n +0000428033 00000 n +0000428206 00000 n +0000428594 00000 n +0000428800 00000 n +0000428973 00000 n +0000432583 00000 n +0000432789 00000 n +0000432962 00000 n +0000429361 00000 n +0000429829 00000 n +0000422072 00000 n +0000419631 00000 n +0000429535 00000 n +0000429594 00000 n +0000423112 00000 n +0000429653 00000 n +0000423876 00000 n +0000424447 00000 n +0000425387 00000 n +0000426140 00000 n +0000426893 00000 n +0000427646 00000 n +0000429712 00000 n +0000428400 00000 n +0000429770 00000 n +0000429167 00000 n +0000722368 00000 n +0000530152 00000 n +0000532526 00000 n +0000532644 00000 n +0000532767 00000 n +0000532883 00000 n +0000433156 00000 n +0000433362 00000 n +0000433535 00000 n +0000433923 00000 n +0000434129 00000 n +0000434302 00000 n +0000434496 00000 n +0000434702 00000 n +0000434896 00000 n +0000435102 00000 n +0000435296 00000 n +0000435490 00000 n +0000435696 00000 n +0000435890 00000 n +0000436084 00000 n +0000436289 00000 n +0000436482 00000 n +0000436869 00000 n +0000437075 00000 n +0000437269 00000 n +0000437657 00000 n +0000437863 00000 n +0000438057 00000 n +0000438445 00000 n +0000438651 00000 n +0000438845 00000 n +0000439232 00000 n +0000439437 00000 n +0000439631 00000 n +0000440019 00000 n +0000440225 00000 n +0000440419 00000 n +0000444243 00000 n +0000444449 00000 n +0000440806 00000 n +0000441510 00000 n +0000432061 00000 n +0000429954 00000 n +0000440980 00000 n +0000441039 00000 n +0000433729 00000 n +0000441097 00000 n +0000441156 00000 n +0000441215 00000 n +0000436675 00000 n +0000437463 00000 n +0000441274 00000 n +0000438251 00000 n +0000441333 00000 n +0000439038 00000 n +0000441392 00000 n +0000439825 00000 n +0000441451 00000 n +0000440613 00000 n +0000533006 00000 n +0000535929 00000 n +0000536047 00000 n +0000536164 00000 n +0000444643 00000 n +0000444849 00000 n +0000445043 00000 n +0000445249 00000 n +0000445442 00000 n +0000445647 00000 n +0000445839 00000 n +0000446045 00000 n +0000446238 00000 n +0000446441 00000 n +0000446633 00000 n +0000446839 00000 n +0000447012 00000 n +0000447205 00000 n +0000447411 00000 n +0000447605 00000 n +0000447992 00000 n +0000448197 00000 n +0000448391 00000 n +0000448779 00000 n +0000448985 00000 n +0000449175 00000 n +0000449563 00000 n +0000449736 00000 n +0000449910 00000 n +0000450254 00000 n +0000450460 00000 n +0000450653 00000 n +0000450847 00000 n +0000451020 00000 n +0000451193 00000 n +0000451399 00000 n +0000451593 00000 n +0000451981 00000 n +0000452155 00000 n +0000452329 00000 n +0000452673 00000 n +0000452879 00000 n +0000453073 00000 n +0000453461 00000 n +0000453635 00000 n +0000457252 00000 n +0000457458 00000 n +0000457651 00000 n +0000457844 00000 n +0000458049 00000 n +0000458242 00000 n +0000453809 00000 n +0000454690 00000 n +0000443649 00000 n +0000441635 00000 n +0000453983 00000 n +0000454042 00000 n +0000454101 00000 n +0000454159 00000 n +0000454218 00000 n +0000454277 00000 n +0000454336 00000 n +0000454395 00000 n +0000454454 00000 n +0000447799 00000 n +0000454513 00000 n +0000448585 00000 n +0000449369 00000 n +0000450082 00000 n +0000454572 00000 n +0000451787 00000 n +0000452501 00000 n +0000454631 00000 n +0000453267 00000 n +0000536287 00000 n +0000539227 00000 n +0000458629 00000 n +0000458835 00000 n +0000459029 00000 n +0000459417 00000 n +0000459623 00000 n +0000459817 00000 n +0000460011 00000 n +0000460217 00000 n +0000460411 00000 n +0000460617 00000 n +0000460811 00000 n +0000461016 00000 n +0000461208 00000 n +0000461413 00000 n +0000461584 00000 n +0000461778 00000 n +0000461984 00000 n +0000462157 00000 n +0000462351 00000 n +0000462556 00000 n +0000462728 00000 n +0000462921 00000 n +0000463127 00000 n +0000463300 00000 n +0000463688 00000 n +0000463893 00000 n +0000464065 00000 n +0000464426 00000 n +0000464632 00000 n +0000464805 00000 n +0000465167 00000 n +0000465372 00000 n +0000465544 00000 n +0000465737 00000 n +0000465942 00000 n +0000466114 00000 n +0000470439 00000 n +0000470645 00000 n +0000470818 00000 n +0000466307 00000 n +0000467246 00000 n +0000456685 00000 n +0000454815 00000 n +0000466481 00000 n +0000466540 00000 n +0000466599 00000 n +0000458435 00000 n +0000466658 00000 n +0000459223 00000 n +0000466717 00000 n +0000466775 00000 n +0000466834 00000 n +0000466893 00000 n +0000466952 00000 n +0000467011 00000 n +0000467070 00000 n +0000463494 00000 n +0000464245 00000 n +0000464986 00000 n +0000467128 00000 n +0000467187 00000 n +0000539349 00000 n +0000539471 00000 n +0000539593 00000 n +0000471206 00000 n +0000471411 00000 n +0000471584 00000 n +0000471971 00000 n +0000472177 00000 n +0000472350 00000 n +0000472543 00000 n +0000472749 00000 n +0000472922 00000 n +0000473116 00000 n +0000473322 00000 n +0000473495 00000 n +0000473689 00000 n +0000473894 00000 n +0000474066 00000 n +0000474453 00000 n +0000474658 00000 n +0000474830 00000 n +0000475022 00000 n +0000475228 00000 n +0000475401 00000 n +0000475607 00000 n +0000475780 00000 n +0000475973 00000 n +0000476177 00000 n +0000476349 00000 n +0000476541 00000 n +0000476746 00000 n +0000476917 00000 n +0000477110 00000 n +0000477497 00000 n +0000477691 00000 n +0000477897 00000 n +0000478070 00000 n +0000478264 00000 n +0000478651 00000 n +0000478844 00000 n +0000479049 00000 n +0000479221 00000 n +0000479414 00000 n +0000479801 00000 n +0000479995 00000 n +0000480189 00000 n +0000480394 00000 n +0000480567 00000 n +0000480760 00000 n +0000480953 00000 n +0000481146 00000 n +0000485430 00000 n +0000485636 00000 n +0000485809 00000 n +0000486003 00000 n +0000486197 00000 n +0000486391 00000 n +0000481339 00000 n +0000482102 00000 n +0000469782 00000 n +0000467371 00000 n +0000481513 00000 n +0000481572 00000 n +0000471012 00000 n +0000481631 00000 n +0000471777 00000 n +0000481690 00000 n +0000481749 00000 n +0000481808 00000 n +0000474259 00000 n +0000481867 00000 n +0000481926 00000 n +0000481985 00000 n +0000482043 00000 n +0000477303 00000 n +0000478458 00000 n +0000479607 00000 n +0000539711 00000 n +0000542033 00000 n +0000542156 00000 n +0000542274 00000 n +0000542392 00000 n +0000486779 00000 n +0000486984 00000 n +0000487156 00000 n +0000487349 00000 n +0000487542 00000 n +0000487735 00000 n +0000488122 00000 n +0000488327 00000 n +0000488498 00000 n +0000488885 00000 n +0000489078 00000 n +0000489465 00000 n +0000489671 00000 n +0000489843 00000 n +0000490231 00000 n +0000490424 00000 n +0000490812 00000 n +0000491018 00000 n +0000491191 00000 n +0000491385 00000 n +0000491590 00000 n +0000491763 00000 n +0000492151 00000 n +0000492356 00000 n +0000492528 00000 n +0000492915 00000 n +0000493121 00000 n +0000493294 00000 n +0000493487 00000 n +0000493693 00000 n +0000493865 00000 n +0000494253 00000 n +0000494459 00000 n +0000494630 00000 n +0000498324 00000 n +0000498530 00000 n +0000498703 00000 n +0000498897 00000 n +0000494824 00000 n +0000495350 00000 n +0000484845 00000 n +0000482267 00000 n +0000494998 00000 n +0000486585 00000 n +0000487928 00000 n +0000488691 00000 n +0000489272 00000 n +0000490037 00000 n +0000490618 00000 n +0000495057 00000 n +0000495116 00000 n +0000491957 00000 n +0000495175 00000 n +0000492721 00000 n +0000495234 00000 n +0000495291 00000 n +0000494059 00000 n +0000544922 00000 n +0000545037 00000 n +0000545154 00000 n +0000548160 00000 n +0000548278 00000 n +0000499090 00000 n +0000499295 00000 n +0000499467 00000 n +0000499660 00000 n +0000499853 00000 n +0000500059 00000 n +0000500253 00000 n +0000500459 00000 n +0000500653 00000 n +0000500859 00000 n +0000501052 00000 n +0000501258 00000 n +0000501451 00000 n +0000501655 00000 n +0000501826 00000 n +0000502029 00000 n +0000502201 00000 n +0000502589 00000 n +0000502795 00000 n +0000502967 00000 n +0000503327 00000 n +0000503533 00000 n +0000503705 00000 n +0000504093 00000 n +0000504298 00000 n +0000504471 00000 n +0000504831 00000 n +0000505036 00000 n +0000505229 00000 n +0000509075 00000 n +0000509281 00000 n +0000509474 00000 n +0000505422 00000 n +0000506127 00000 n +0000497847 00000 n +0000495515 00000 n +0000505596 00000 n +0000505655 00000 n +0000505714 00000 n +0000505773 00000 n +0000505832 00000 n +0000505891 00000 n +0000505950 00000 n +0000506009 00000 n +0000502395 00000 n +0000503147 00000 n +0000503899 00000 n +0000504651 00000 n +0000506068 00000 n +0000722493 00000 n +0000548396 00000 n +0000548518 00000 n +0000550677 00000 n +0000550795 00000 n +0000509862 00000 n +0000510068 00000 n +0000510241 00000 n +0000510435 00000 n +0000510641 00000 n +0000510814 00000 n +0000511008 00000 n +0000511213 00000 n +0000511386 00000 n +0000511745 00000 n +0000511951 00000 n +0000512123 00000 n +0000512317 00000 n +0000512523 00000 n +0000512696 00000 n +0000512890 00000 n +0000513095 00000 n +0000513266 00000 n +0000513653 00000 n +0000513858 00000 n +0000514031 00000 n +0000514418 00000 n +0000514622 00000 n +0000514794 00000 n +0000514987 00000 n +0000515193 00000 n +0000515366 00000 n +0000515560 00000 n +0000515766 00000 n +0000515939 00000 n +0000516133 00000 n +0000516327 00000 n +0000516533 00000 n +0000516705 00000 n +0000517093 00000 n +0000521138 00000 n +0000521343 00000 n +0000521516 00000 n +0000521904 00000 n +0000517287 00000 n +0000518167 00000 n +0000508544 00000 n +0000506265 00000 n +0000517461 00000 n +0000517520 00000 n +0000509668 00000 n +0000517579 00000 n +0000517638 00000 n +0000511565 00000 n +0000517696 00000 n +0000517755 00000 n +0000517814 00000 n +0000513459 00000 n +0000517873 00000 n +0000514225 00000 n +0000517932 00000 n +0000517991 00000 n +0000518050 00000 n +0000518109 00000 n +0000516899 00000 n +0000550917 00000 n +0000522098 00000 n +0000522304 00000 n +0000522477 00000 n +0000522864 00000 n +0000523057 00000 n +0000523263 00000 n +0000523436 00000 n +0000523629 00000 n +0000523822 00000 n +0000524028 00000 n +0000524201 00000 n +0000524395 00000 n +0000524589 00000 n +0000524793 00000 n +0000524964 00000 n +0000525350 00000 n +0000525544 00000 n +0000525749 00000 n +0000525921 00000 n +0000526309 00000 n +0000526503 00000 n +0000527149 00000 n +0000520742 00000 n +0000518305 00000 n +0000526677 00000 n +0000526736 00000 n +0000521710 00000 n +0000526795 00000 n +0000522671 00000 n +0000526854 00000 n +0000526913 00000 n +0000526972 00000 n +0000525156 00000 n +0000527031 00000 n +0000526115 00000 n +0000527090 00000 n +0000529261 00000 n +0000530211 00000 n +0000529117 00000 n +0000527314 00000 n +0000529435 00000 n +0000529494 00000 n +0000529612 00000 n +0000529730 00000 n +0000529853 00000 n +0000529971 00000 n +0000530094 00000 n +0000532234 00000 n +0000533065 00000 n +0000532090 00000 n +0000530336 00000 n +0000532408 00000 n +0000532467 00000 n +0000532585 00000 n +0000532708 00000 n +0000532825 00000 n +0000532947 00000 n +0000535637 00000 n +0000536410 00000 n +0000535493 00000 n +0000533190 00000 n +0000535811 00000 n +0000535870 00000 n +0000535988 00000 n +0000536106 00000 n +0000536228 00000 n +0000536351 00000 n +0000538994 00000 n +0000539769 00000 n +0000538850 00000 n +0000536535 00000 n +0000539168 00000 n +0000539290 00000 n +0000539412 00000 n +0000539534 00000 n +0000539652 00000 n +0000722618 00000 n +0000541741 00000 n +0000542451 00000 n +0000541597 00000 n +0000539894 00000 n +0000541915 00000 n +0000541974 00000 n +0000542097 00000 n +0000542215 00000 n +0000542333 00000 n +0000718939 00000 n +0000719516 00000 n +0000544630 00000 n +0000545213 00000 n +0000544486 00000 n +0000542628 00000 n +0000544804 00000 n +0000544863 00000 n +0000544980 00000 n +0000545096 00000 n +0000547868 00000 n +0000548641 00000 n +0000547724 00000 n +0000545403 00000 n +0000548042 00000 n +0000548101 00000 n +0000548219 00000 n +0000548337 00000 n +0000548460 00000 n +0000548582 00000 n +0000550444 00000 n +0000551035 00000 n +0000550300 00000 n +0000548818 00000 n +0000550618 00000 n +0000550736 00000 n +0000550858 00000 n +0000550976 00000 n +0000552932 00000 n +0000553083 00000 n +0000553233 00000 n +0000553383 00000 n +0000553534 00000 n +0000553685 00000 n +0000553836 00000 n +0000553987 00000 n +0000554138 00000 n +0000554288 00000 n +0000554437 00000 n +0000554588 00000 n +0000554739 00000 n +0000554890 00000 n +0000555041 00000 n +0000555191 00000 n +0000555342 00000 n +0000555492 00000 n +0000555643 00000 n +0000555794 00000 n +0000555945 00000 n +0000556096 00000 n +0000556246 00000 n +0000556397 00000 n +0000556547 00000 n +0000556698 00000 n +0000556849 00000 n +0000556999 00000 n +0000557149 00000 n +0000557299 00000 n +0000557449 00000 n +0000557600 00000 n +0000557751 00000 n +0000557902 00000 n +0000558053 00000 n +0000558203 00000 n +0000558353 00000 n +0000558504 00000 n +0000558655 00000 n +0000558806 00000 n +0000558957 00000 n +0000559108 00000 n +0000559259 00000 n +0000559410 00000 n +0000559561 00000 n +0000559712 00000 n +0000559863 00000 n +0000560014 00000 n +0000560165 00000 n +0000560316 00000 n +0000560467 00000 n +0000560618 00000 n +0000560769 00000 n +0000560920 00000 n +0000561071 00000 n +0000561222 00000 n +0000561373 00000 n +0000561524 00000 n +0000561675 00000 n +0000561824 00000 n +0000561973 00000 n +0000562124 00000 n +0000564271 00000 n +0000562390 00000 n +0000552239 00000 n +0000551160 00000 n +0000562272 00000 n +0000562331 00000 n +0000564422 00000 n +0000564573 00000 n +0000564724 00000 n +0000564874 00000 n +0000565025 00000 n +0000565175 00000 n +0000565325 00000 n +0000565476 00000 n +0000565626 00000 n +0000565775 00000 n +0000565926 00000 n +0000566075 00000 n +0000566226 00000 n +0000566377 00000 n +0000566528 00000 n +0000566678 00000 n +0000566828 00000 n +0000566979 00000 n +0000567130 00000 n +0000567281 00000 n +0000567432 00000 n +0000567583 00000 n +0000567733 00000 n +0000567884 00000 n +0000568034 00000 n +0000568185 00000 n +0000568336 00000 n +0000568487 00000 n +0000568638 00000 n +0000568789 00000 n +0000568939 00000 n +0000569090 00000 n +0000569240 00000 n +0000569391 00000 n +0000569542 00000 n +0000569692 00000 n +0000569843 00000 n +0000569994 00000 n +0000570145 00000 n +0000570296 00000 n +0000570447 00000 n +0000570598 00000 n +0000570749 00000 n +0000570900 00000 n +0000571050 00000 n +0000571200 00000 n +0000571350 00000 n +0000571500 00000 n +0000571651 00000 n +0000571802 00000 n +0000574143 00000 n +0000571952 00000 n +0000572185 00000 n +0000563668 00000 n +0000562476 00000 n +0000572126 00000 n +0000722743 00000 n +0000574294 00000 n +0000574445 00000 n +0000574596 00000 n +0000574747 00000 n +0000574898 00000 n +0000575049 00000 n +0000575199 00000 n +0000575349 00000 n +0000575499 00000 n +0000575650 00000 n +0000575801 00000 n +0000575952 00000 n +0000576103 00000 n +0000576254 00000 n +0000576405 00000 n +0000576556 00000 n +0000576707 00000 n +0000576857 00000 n +0000577006 00000 n +0000577155 00000 n +0000577305 00000 n +0000577456 00000 n +0000577607 00000 n +0000577757 00000 n +0000577907 00000 n +0000578058 00000 n +0000578208 00000 n +0000578359 00000 n +0000578510 00000 n +0000578660 00000 n +0000578810 00000 n +0000578960 00000 n +0000579111 00000 n +0000579262 00000 n +0000579412 00000 n +0000579562 00000 n +0000579712 00000 n +0000579863 00000 n +0000580014 00000 n +0000580165 00000 n +0000580316 00000 n +0000580467 00000 n +0000580618 00000 n +0000580769 00000 n +0000580919 00000 n +0000581070 00000 n +0000581220 00000 n +0000581371 00000 n +0000581522 00000 n +0000581673 00000 n +0000581823 00000 n +0000581973 00000 n +0000582123 00000 n +0000582274 00000 n +0000582425 00000 n +0000582576 00000 n +0000582727 00000 n +0000582878 00000 n +0000583029 00000 n +0000583262 00000 n +0000573468 00000 n +0000572284 00000 n +0000583203 00000 n +0000583361 00000 n +0000583387 00000 n +0000583515 00000 n +0000583954 00000 n +0000583986 00000 n +0000584455 00000 n +0000584911 00000 n +0000585312 00000 n +0000717847 00000 n +0000585634 00000 n +0000586110 00000 n +0000586432 00000 n +0000586784 00000 n +0000587260 00000 n +0000587640 00000 n +0000588118 00000 n +0000588810 00000 n +0000588848 00000 n +0000588973 00000 n +0000589616 00000 n +0000591824 00000 n +0000592088 00000 n +0000595291 00000 n +0000595556 00000 n +0000599190 00000 n +0000599433 00000 n +0000601861 00000 n +0000602094 00000 n +0000604358 00000 n +0000604586 00000 n +0000608383 00000 n +0000608655 00000 n +0000610357 00000 n +0000610615 00000 n +0000612958 00000 n +0000613222 00000 n +0000614458 00000 n +0000614685 00000 n +0000616704 00000 n +0000616950 00000 n +0000618793 00000 n +0000619055 00000 n +0000621280 00000 n +0000621501 00000 n +0000639379 00000 n +0000639913 00000 n +0000648136 00000 n +0000648428 00000 n +0000665892 00000 n +0000666401 00000 n +0000679813 00000 n +0000680163 00000 n +0000701105 00000 n +0000701726 00000 n +0000717396 00000 n +0000722832 00000 n +0000722952 00000 n +0000723078 00000 n +0000723167 00000 n +0000723249 00000 n +0000726269 00000 n +0000726457 00000 n +0000726972 00000 n +0000727487 00000 n +0000728002 00000 n +0000728517 00000 n +0000729032 00000 n +0000729547 00000 n +0000730062 00000 n +0000730577 00000 n +0000731092 00000 n +0000731673 00000 n +0000732452 00000 n +0000733089 00000 n +0000733737 00000 n +0000734348 00000 n +0000734740 00000 n +0000735239 00000 n +0000735652 00000 n +0000736205 00000 n +0000736824 00000 n +0000737506 00000 n +0000738217 00000 n +0000738892 00000 n +0000739567 00000 n +0000740242 00000 n +0000740787 00000 n +0000741398 00000 n +0000741993 00000 n +0000742807 00000 n +0000743487 00000 n +0000744168 00000 n +0000744849 00000 n +0000745464 00000 n +0000746081 00000 n +0000746698 00000 n +0000747401 00000 n +0000748125 00000 n +0000748798 00000 n +0000749471 00000 n +0000750086 00000 n +0000750695 00000 n +0000751304 00000 n +0000752003 00000 n +0000752759 00000 n +0000753480 00000 n +0000754201 00000 n +0000754839 00000 n +0000755496 00000 n +0000756153 00000 n +0000756788 00000 n +0000757469 00000 n +0000758150 00000 n +0000758831 00000 n +0000759454 00000 n +0000760087 00000 n +0000760720 00000 n +0000761353 00000 n +0000761986 00000 n +0000762619 00000 n +0000763252 00000 n +0000763965 00000 n +0000764902 00000 n +0000765770 00000 n +0000766651 00000 n +0000767385 00000 n +0000768060 00000 n +0000768677 00000 n +0000769294 00000 n +0000769911 00000 n +0000770528 00000 n +0000771145 00000 n +0000771762 00000 n +0000772379 00000 n +0000772996 00000 n +0000773613 00000 n +0000774230 00000 n +0000774847 00000 n +0000775464 00000 n +0000776081 00000 n +0000776698 00000 n +0000777315 00000 n +0000777932 00000 n +0000778549 00000 n +0000779166 00000 n +0000779447 00000 n +0000779618 00000 n +0000779787 00000 n +0000779956 00000 n +0000780128 00000 n +0000780303 00000 n +0000780480 00000 n +0000780655 00000 n +0000780832 00000 n +0000781007 00000 n +0000781184 00000 n +0000781359 00000 n +0000781533 00000 n +0000781751 00000 n +0000782002 00000 n +0000782260 00000 n +0000782528 00000 n +0000782801 00000 n +0000783073 00000 n +0000783346 00000 n +0000783618 00000 n +0000783885 00000 n +0000784102 00000 n +0000784305 00000 n +0000784506 00000 n +0000784707 00000 n +0000784910 00000 n +0000785115 00000 n +0000785324 00000 n +0000785531 00000 n +0000785725 00000 n +0000785906 00000 n +0000786127 00000 n +0000786356 00000 n +0000786591 00000 n +0000786812 00000 n +0000787062 00000 n +0000787329 00000 n +0000787603 00000 n +0000787884 00000 n +0000788165 00000 n +0000788435 00000 n +0000788584 00000 n +0000788745 00000 n +0000788980 00000 n +0000789170 00000 n +0000789372 00000 n +0000789614 00000 n +0000789872 00000 n +0000790121 00000 n +0000790351 00000 n +0000790584 00000 n +0000790814 00000 n +0000791042 00000 n +0000791268 00000 n +0000791494 00000 n +0000791720 00000 n +0000791891 00000 n +0000792007 00000 n +0000792135 00000 n +0000792267 00000 n +0000792390 00000 n +0000792517 00000 n +0000792652 00000 n +0000792747 00000 n +0000792944 00000 n +0000793194 00000 n +0000793369 00000 n +0000793482 00000 n +0000793594 00000 n +0000793634 00000 n +0000793834 00000 n +trailer +<< /Size 3052 +/Root 3050 0 R +/Info 3051 0 R +/ID [<3C58E1122DA7973E82A6EE9D402B5436> <3C58E1122DA7973E82A6EE9D402B5436>] >> +startxref +794166 +%%EOF diff --git a/doc/ppl-user-c-interface-0.10.2.ps.gz b/doc/ppl-user-c-interface-0.10.2.ps.gz new file mode 100644 index 0000000000000000000000000000000000000000..2fc37bbd8cdb7320198bac898525beb0763d6a93 GIT binary patch literal 325241 zcmV(rK<>XEiwFq%Vd+T%18{I`Ep>BcaxG&mX>N37a%N#;Wi2o+F)%JNE^u=I)LL6} z+%}ee=dZv%c*>c?765`E;J1vOi>K^F8#(c8rSgEQ#DwbZ>85NcD*yNW0A8AGwPHK* zPSx6$)eRgRoa=WEKtA}d)3Zlk`n3&@%Ez>L@Zjk-m~Op&LSC3x;a}u!(_N5@n@!km zLnIsHelzC*WG~F>{0bjmgg2pmLO6z=t=-jSSaoMtn@!sU|3lcVueL7io{)#83oHNG zjOb+2^NrXvZaPO&RkswC`JEB|zT znfUF}qHx}0p|NDUcDvA#>y3{Dwt*DMJnPNP zwmHA(o{;GyVOq;aoKiu)X>T?cE!lOjQgMRmXP`Z6eh-9IX-OVC3*FU*+!lnCgb~Qx5>Cu^Yi@|y!C?V2Cy;jo zrG0qQxIo@sgl))62-&PRSeS+A_a^zzNwQJiDqOpZyxB1E{L-8!2fzblb%ot#bEoUJ zaZT7kkX|iFmbuROm04MMeYWtHoIJbQwBed`+pCZX-jSxCbytY6RhRjtRSQ)>@ouIF ze)32YL%R#byS!xj=o{^t_8RQ$s{uS5TOLF^eHhk7?*T02B z;(qi9dE!ETrgv!%1{2-)rz9HaaEJED#0&U2^FB5)>~J{sDqMFjO-FuaIg9fD3mMj{ z-ad3T`1HbT&yebH|6)8b`vJZQ+q=WfZpq{Idh3tz_;$T*em`@jO%v>Z%hR^moEiYm zVCcPLk+;2Db8PhEefBtH?{>@`w@Wd$@Z=cRIY?)YKZtjPTjsQb%wgEz1Z1~&e0_)E z6doVKa_7Ku?#$J?>qiE;4p%iJySe;(AxyhAzE6s|)+3jG?IL=n)VnWqMp4h6?nNDF zCSfO?-z)C0^0>fryB-&LSbj(7Wg?6sgX`@)w+=iqUpv_xWY~KBCTus`X4PdKMt+#P zT_)vmj)Rml)BF+F_;lTl0JV&RV&Hi!7UpvwVDki=I7t{6u!e&`=k=z65s2P)4x6Ej!*Z+ywuV1cx_>(d}Am>}NxoCjs8QaMk zEof>?cg4xSvGw`Ryb1SI_%YA^yH^zj<9r*Y9%&vK2OUyz2PF1seqSoRn-kq1s8h4D z%q5530VQnZOgBpHF@ojZ>@LQkrXPy!p6b_r2xT<&~IZ-n5EO&YaV_Z?P z9T?C)Scb2ISy$nFM&jD_E@bHj))#5FgTX=m4SN1ArOix%RM9hl?Rvx*YhA>6ygNP( z#}p3Z;NQp5u%3-SfE>+cbFks-EMK#M9&hJzzfMfT`sh^ZVtP69@DZ8^q(i@SH#J_l zpxT*FI{9h%lrgmcN01ql#nm_E)Ua?wj{yRyL_UdL6$T?2cNcDeD zLQx@69K`r!*M$=&0;WOyq^~3A6Im0{h++eX*H^JHAhu z(d(Gp&z3RK+pq6Hnm3CMgw9QMkk-dgjLtWo?OpPD<9C3g#~7t3qy;(7F56~^tXIFX zy=8_jY_JXgGq&jgqIvWGMBktOq{3OvqgvA=dVj2jS)0uC<5kKEO?J&y=C}m=G#lV> zvrZ>MHMB$forh`$Xj}O?K*}D>Og7X2ze6f6SC)BYk6&2bqhI>8-VUq|GkbvmX_xoF zcG&|&Zhqd4t<(agdfdr~v`}~GtELT)Dj){cS7TGIAl9sBJlJ760xmC)$l=Iz&>Zg} zPX<79Z?4}>V`GOo9~=AF<>1tAPQ&S2kK5#z!^2Lm|Jc9H3^1y=K+gr}FT*Q!!halM zV|4!Wa=71^uJ;~O%5nmypWIT9_2~~el0Co{oo7>wvE`w!rRa`W`6YKkK z45w}>KbA;1bD3@pXZ;e^J-__NRV0kksV)y^!C3#Ij`cq8KgQm^7-7nk*<5Q?) zVTKDaRG@I(bo=|ShYuco_5HI)pY`c7&Edaxy*QUYzkE3%W54sI+5PsP**$gABNUIn z%khwg_5@)Ywr@@X0{&329m?x^-nPwB~gEc$!rE? zHUB$y!!vxm-G_29H`f>pxdVAz?T^;)BUp6nho(K|jI(cx{=~CfBHzD69$ z#J?YTG-<9I(~j5XebTkv%nltrNIP~13fSQpv&&ZM=oDJV1MmnCETsBiBv9`|g2_*# zvUdjdsq(EEG{xkdU6x)syy(iD*UnRz7Mv%w_#5M=%N1H1a`Z2s$P z{$cng58doNGVS@nD?pU00VdL~^Dr}Rmha|ev&uDNSnB)YmpJCB%YppnrMbSB4pZ$R z+Ycju-}WQjkOuSUnALA`J+bL+0&XLlJk_V~u<&}4?Fg|Ma=kse%SSByAd!x!cQ=B^ zD{nLs%bf4tm-OBJS>MDD&gy>SPoLHcz#)@*A4c_`O#RUSM{<8Q^~cG71YY;Lj99R8 z?J~UYOY<~5PxWDVn}@b^b~8yyDe-;l$i?g~@vrer95c^V3fw#1ojU4Iv6q4Kc;4&N zvE-R+7XQ=B`RT=+8TmeNNY6dF z%WWDbqy5`%4}bjO^=F@d{>9?`H%;u#ID?hD=6pr|h7UM~uQ%x_B3S(Cg=ZmHj?c?i=#(o9})k--HzoYArdvvTftYi^hf3E_{~GNu=$+q~}mRKbzS-2Cpx7 z#7wW;!JA=|roJFJ@Le{$9X^w0mmWUj@asvp2B^69$|nIZo*$P#Nbd%M;u3RUcDmkm zJGX5%T{;baoCb*7qRXu4f!PI*M!l7m-~v7H({F%^f1NDXZbE-y=rgzy7S$-OD`Qh{BvG@{OO$h30(Y19Q;Y# z``4U%=%ZN@|J8gxWc~G3+kR&*5db~L5P*zX5#S7YK@!lkW_xFixop~-`&J!NzYe{) z_b_|j8JOkE)p?umCWkjCc3(Hw!Jjr=dcZur2Xyjdx^7PQXs5$-TkhA37a?Dx54-d)$Iv~S{HE>gBPJDj#1%^yl$2;L-W}O8 zGh+MiFZ+k=KlgXCN&Dev|LvCpHq$#rXPsGjMB6lwrVrl6E#`NTAwRA3+DjQ_Sz0Be z(MnsbYhfv?b#&4>Au8**qa~xIld7tzscl&aBMev6ghECe>!_7dftK1>Nux7SRXkYX zLTO^Ky4Jo5rl!#cfpsQSPC3e?bi6KX)KXR<7{*-fdC9e7hBM|pm)4dwx1my;$IQWN z9c)!ASKAQ15YESfiprF-q?HU+V9r&n;vkmMQOUduU;-{wg&1qD73F0ulkiM%5oJva z8tNcRU0bdqgSw1b0h4n}O&LtET+n}HskHJ_kU_e=E1O{RS=7onj>;MTJXFOD1Y8OI5Ar51P)ulox)S@ph#Go&*fqw$xh|^+ z$9tpTA*-1IZ(9mTpafM0pPUNDl~Gn!no!~|hvrJwA!yGvl`1N@9YGa^sHqJIbuVow zLJ&Uc3Ll+=dFwhVp(&KHoLe4kT{&H<;Hjws0@6bOS1QX*lEXz?MCPj!VptgkOk0*x zU?*p&F&r~s1mh#F1M|WoNj;*XrjRRg27idcq*SaJ}#t^J0nU8V$S?S;_7!}Fa8glwYY@^7Nm>e5 zYV9gS2w=x5Sb*NK9jd?E=yQaavgqqy;}~3m$av z#>2S5M##dcw}K(TwBou3ngmsP;1EjzE@5WyhL=6tlfJy>!jVa-5ps`X)6aotoX52d%-3TU-YIVtNv`9fzNeiOd$*a$RlzquC0fnF=YaP4md5~gxbJ4Oep|RlrUO?^MDavNhJ}H z1+bh6q$adPY-m&Y03)M7#ZVb!wxSO4!DJ~aj=18G7&Z&CcF|#y6@VImer<$8sF%j2 z1PBzl54@q^$TUJ2Y$*cHISb$kB}##msB6w5kZ3|`KrUl|Af^>k22p5|p;cMJP{;`G zsjqZOK8>xA3ni}w17Zl+AZP%IP$B@8G-`|iK1kG83l7!-ot+jGNd$naB=Xjwjv(yn zpbV6dp>UCVjxGYo3aO<{g~wLF2M=P$sRhj8>{@G@$?2)BGhy*VfItBz3?1{cY zQ=n9+@gpjaCc_q{WEDWw)-Wk*2qdf#Y$${Zkclb;ERd!)7C@m(2h&D@<{*WrMcpe^ z0q3()BL#Gbh*DvKQ2?kK@uH~YMn}ykOzaVRrsOPINPa@MZ$sU5KuFqlCk#*5%1gZm=t zcuFZ(*6=185L-%=9N+?1QXBjQ$^t%JB8})G(LZ?fJ*Gf#paJ4m)o37P!rx#$fV<=| z1tdB_7CB5xYoM6)sGKxaCicJV{ae!}OLCS8pXaZr??7WxgpdFY zjE#-Ow!1#9O|v$ldocd{TvwL5)shfsKw~q4MWgPus^0f`G9x_P@7u%ub{>>qvo8ql z*tqy}r@-cndGp`6_gZs}BX6J<;c|M4f?kGr3+Q?yvw5GmON$5ziM!guM*>+1Xor3Tw!N07r5LRt!7_ zz8Vwb2WtVou<4w$BN7MkjvSW=47q&AcoL;6L7jK0^%{a2;9&{LFvx1B$x;zYK~NVi ztrU?OL8XE@9zEm*7l-MiVv<2BoHeg2yikcWCRF#5&?;r0|fOPKvn=4!JG%eh{}Bu$FQ{>Bu2a@9uv>P z>)%f!(m+UnaO_mUZ(Qefa85apMB|-C!h2yNY$%8jKikg>GfNxn1$w(Thv+2M-aI9t zrok!-Yp@b7oHqt!KOGbh*iSgbb0?x0?zAP~D?7edZrEeT+1>;i@N?pa&g1Gtt>@x{ zF$h`GI5Ex|Wlb@1`dewd4sjjJ-0ix+Zp2$o21uNvcMt^e?*wa*eGhwIx%Yx6;XHEu z3{rs0#kyeULk!x8JmT&L#@WwyY+&G(ICdQ`n-Xq-s0KDUf%Lh95MqX-V8?h-2r0kD zSM6}Fat!T=&}IJ6U_S#ZukFg^>$0@=WG8catefQ|%%Ce{Z~ zGSQJpKHvoesdT~@fdvmo0iVZ)o}2K_2D18mb}a>Wi5ubk@0c-mHu&7Q-pmsK6P`$T znHb`R1)W61irL)<2)QOq0rUnUfHrjqY`HJu9?_VsZ@lh{atRB7hRvbB^;KCYP|icd zHPfA?02^DxsdMyN!Ci%ohq-x<0&pmz6d)m|U=uvxk?P(F@0YXw*Ez}>n8VNN|KfrT@VJ#!Ws zu`Wb*C7CElSRwde;0j<8Ktve(Vkvk_q4&ZX0t-XT!tEwjlgI?35yG|!lEXOzdM~05 zfNyYG@SdKJs|TWatoRkE-&pwPDczmv0G$e)F>O}9E#8rH!2+#I(AR*b0D)7cJUFjc zx=%fL6Ce&YP$8r$z>&=tQ-`+5}2)v z+xG+ABSsD*h^*#>DS-DdGS0z$KVbNTN4j&{@Zd^d0R+Jfu+<0H!ap`X7}}EByfHs9 zp6LpBJYNkd;34NxunUnZF|hh(d=#XuwucvJ3^cskUHA1%bRUnEcB|!ZU z_y%KHd`^R`aaaKLS1$*T|C9;F1*Nj?8<(|+01u|mj}pKjSrsnU^yrI|6M+rbrv!YQ zSLQIKmVhAOH2ESFoEL_Aa4f(PIbKfzg5jN@jR3s?Qn*-G+~?K}Z@@Ou7EH))5C&u9 z)MJu3=?BP5kOPZ!HnH7ojkX$y*930N`yoa{zKOmZU-lj#Ix{DT%`h~K##Y?>rSg-_ zVX=X}yxS&9;QTP~tj!!8&`QYT;1JlZr>R+S zoBqV{;Wc>^_L3F60LT0xM+R?S+1cx*1Lk%@I7}@O%2$7ke}#7}ydoh8AWA@*&>(n& zN8$!`kHW4(tg;B7!`S0N2!Np6oEjbgH#k;+B?6#F6Y>riHD_`xQ!ac6W`eC0Fg5%I z2vrZb&+72VC=9yT&+1+@-V9C#W#%-s%DI4l^O|EONESH3tPT7*aTfSz0Q~HkbCfU+ zz!~Qi$Qd#=wI(Pu-<%~t_QYS@+85Xp>;Vl8*HQ7!K#%Kr*c1Z0}Ox}wu7TPgc2FI490nM+k_bq715X#YR&X#W?gbKJN?9nCF48J`!dmo z=RJ=AHon=){hWh?W&9=%JyFNb6SALpATTipHk8D^N)!@E7~UIk5%>dQdJN!z^W@Y8 zKyj%JpcvZ*7PG`e_6p+X-!d_@;&oY>v0kFn=CL{FoEnx)xLANN{Nuwm2+%+vn?v3S z6O$t_;1aA|S+#E63WqfxfZ__s10| z1zSnD6Zi>0448?FhP|g}WcDO@h5@~->M|N&fK&Gt3&9@W4940TS@-iMw6B3S+IjGB zrcck?Wcv+=#JidF*)AnB&nQs8vi-S9-7>hy=77Uj%501tY|<^N$cc)}PNUlfxKI0f;(UG^YwJ zCHBM1S^IVMM+Y4Yc0fG<_L+3i#GcY0Y209^p--$AIO;l}Sgf464u~C&7V-&8$8=_f zx~yt|B-lPU)uIQf1!FBN7kJmm%V{L~-gu~vW%AXnO@dJKu7WeYajl%yg~{~^#gX~3 zZ>(N0h^7_}PAg6x%oeK40=}8ij8+0n4@Q6}cfT@3Ai*jz zq>FdP9+NBv>Z|=htP7m8;8!Zo4;LtX>1R!G;bVIQS`Zb(egFp(V}=Z4w#5CTzB!}? z*k%EMBa@ey+0^-Rp-=3cBa)@01P(DHjsjeYYj}X-@J5~($NBi%5CN73u#q@x98U-r zM*lQu_*$-S#*skBOr8%Z2?6{tapUIbesH!EZo~skaY*DW69}RDddx{c!@=Tzzo%=Xq$Kk&V!+Yv;pb+d_ZEEgN<*8$t2tyC#beOuN%I^;s%^FfrYc)@v|BF z%t?fk;Ln6M0XpKV6wor{e@GM}UIn62pkx>W&pYPbBn9k?0be1`E zFW4$UilxT=U2ha<2Tw*M5nQlEUV?!#Vb&Yg&-npaOz=TqkqMNzU;ZYrgu~b0Zp{Ha z<}o8+Cb^RB4KlDz-ga^DaLVj4L2Y|!&~f$vRE`72!z1G{4}$W7T@rg+#3f&5Y5|-D zlErFXubYbRJ|rzc+63m^tCo37*hx&R=~Dw7q$W zlxqXIii=^T8PdXoq#&0CzX4WSz$^~dg&kiKJ05+{B>lWXxN(xVRI>$q-3E4n6}>Yn zkmUw!zP)ao5RN;ax>@`R$P1eRUJ<*Vo8Jb*!^a*I4j2RI2|t0S5mEyav6_1KW6Awl z$c|4RH$)3d8Wlf{1Hjp6%qJ0i05AsxB@)dz5pjW##B}i>Ru?u!2Lpc%kDD^0>^fGpf+0?&_hDJDFt5T-Id2s03QLS^LWcV779WUx1vDfof6 zeLcuk;7mNpb>V{gBg_F>;M+Mv`0vH%@#LILIN}9)s*#^*Z4uu%2@qc%8%yMilO!-L z58d?;*IL2z+#KUXz(zhe`^YPUP`dRqI3jTlnEOpB5v~b9bsJ~r z#gQTYLtCK5Q~JcZ&tS?t!ED=FnZIp8=Yk zozKHV-Z#8(7kK#Nmp;)OGZMi<4MI8ZU(Jx3ASKEzfHVhiT9{Fnmy>KS zcp@g;Ne)0T9-LKc`8{L`Q+q-J=G1Wmcb; z2W8;iEH=V3g1Fe86m!aZfCC|=co@DFr-}u`M2VNFtrJ=eYX^L?8i4=%6#w6N50KF% z(glEeYmS2?8byvMhv@|L&A_=}nXc0s8IUs3q6Xm1Bh>{UVSEF(nJpDq*~C)Ui}uTF z;{i$G_+rIuqXi;>Oeh47Et@~B7+yB(1Q%sbB}9<#>c$tKu4yC)KVfUe_YRZ~gQ{H| zxP*rRoOvA`}j9^V6NT%)dc3Z=;bn z-Cj;7}E| z-U6G96T!$*A)F>6O0r}Li|i|k_*u;6rCYa7W8(PlNxeE~yo6){ z8V4?o6|MY(eZGZ295ZVHF&kLTJizcR5E~XQ21+=aRA)%XFLRWvYBLZEl?EIhUMak| zAx*eT&e4%dsvyw2oo~gOC19Mz%;zU!Bu<7?4o<&T_F@_64x+uR`Y<*8EL_@I!g(#T zb|r3nXm|~$S<2CgC~LBT4-|{MoMx9z z#Z|tZs5p6o(P3Pf|FGDc3(z$Ng;Rwf0q3ATGg#rn=>bS$6D%22;fz<3ydG;Lt&6A= z)?2s0f_MSJQ;t2Y$m4&L^>OE7|4w#ifU)pk82A|V=vAr<1-r24t9r2qp9gNki?A$! z^~v%_xfgU2CITfTe1wa@Lx790cZt5)Tb7k*oAVjL0-OwBS2XP(L*3r~Utr-#96v?s zFt5S!i#L|oy&}g0URF;U!ub?vre2ble;|q+U_e=cNDvPP-eT4QBIcdKeL$OWko$_2 zbHX}RpeC=(s`SQ3-6kgq`jYjGPXdEfj#)4fEA?#$-)WiL7Kz|q{C!r5;+Xh7HOuCOhf54JxySgR0*iS)(cGU)nT%z73y*G zBCQ^r;9@dSk6~%tdm){89M3#wR?-iD33qFj6&AwfdVR;`ZS8p<#4=7C$m#B>bL_kn z2Ylju@E%c<@T%3qtT#cv0|y(>XkzoZQx3;C;Vnesbc+U``Z;gP0qj5nD0eyaYBA$! zjf;Xn9xE6Mp4Bm=8xH}=YrBGv8V>S$Q~k?o5~6+;`|}H|L9p7GJ+Xqot4zIrTZgxe zxc3%J#<0(@+zq$m6QDF^V$W#l@5XPOxxRt8K;I@zU`h6XID~vCoaMouF7^-vH;N(m zEHDpO7Ve^LS&!#+$at*8lzr!RWcV6ElAwy8@+ZC5!aH{y;{_|r=0V{iolU}A!wDt? z{)Xp@;_Gg`GO-HQUhfFp<75^fhFM+<4(gi`Vq-HN6*vy25H^7OAf_T*#rlzTCoBrfyqt$h*x~mz{8Ua*=Ii3-WR(L13&i4X(BS**#08YUHB%} zu3O*6aju;E!N2Tj!CA3j;UM}!2)0OdL|z2WX}+J3y5V5ZrO1&xVK0xl=N4v#c6D6i zusC?Ljh0|WD*{0UK$dC};apsq@0K{q=dxgg9f`+0_gnc`Va$Y8 zd`MvJaWL(INd@f12%<{}tD4NUqIt4I_ydr^eeC4r*VYmWP7%MGAuO_24#JHqg!5Y1 z33h>4fnL`+ht3b@{Iu7l@i(9cxEvo*Oq594IB$^d#4l}YPC0Smg|QhR2T&c>pYP0? zm=+EzUlnhbLcJ;$5BFyqs<$=g1Q}SV6a^u~eW9M0UI`@c>R(<^+}rCK4~OQyap9e~ zNo*R?xI2i=9T!P_;MfxQ-ppynOK=FzqvN%8G8U1+jG>pjWwz~ka5=V6jz zv#>LoY{MA9?t~UN$>m)bgrVHHS*rv)K}*_hQ4ZeD+NP%--upo>!4B9Vn|Db{aUv67 zO7!r0&m0x(xqbw_m z5SR|;lDfi<7ZAtvDh|xnf@ii4b=voOT*{~T9u`$V=-7s5KVFwvO$+xN6<#wAo+ntH zWb_c^cg%+Kyew4ZEd_)p4jXp_EOiGv3n0W+nC(T};y`=P z1zsfT0SN;@fUUr?D__bQ15S)xSMci5a@;}h|Z1O@9U;3pTEc>LG!d5w z!6I}Y#B(Su(bS@2!MPF4*UOV9b(SKH#yCVBasS28&P2 z;s~FRzQhB8I48%zyEHIQD_Aib453?(b>!zhf;HSczpW*aSOU<&|27cyqvI+(>B2r* zHdA*8IAtNs8Tg1y9Q9*kC686RoNmy~!}s&p85S1_373AkK#0Q3>@c5g9p`0{2%w(m z9S&GA;1$XPsyvCv@MKfL08+2UZmp#RJngiY;hEVC5PxVLIEY|ae^4?&%HmJnceBLi zE0$Q>DqYUy6P6bw_rwW3UQhG!7r%VrJBA6#IC&|a19*W&CY@xi#a^FEJlUsZ{kbJ* zbee#ee1nM|fh(@mA`S@Wcr3iy*EF|<@5MJI&>gWoL1Dn{78%(DQg?C93UEtGh ztM$xaJh-K|03r7Sd`CdIZd}lU0TeHh2`Mml0-U!zP_U#U0_-)cXb>^MF`$`8-;)j~ z<-CBORz<;o<5`<4_6QY3Z9!iBKv=+woEy+A6oSX)RNz_HI@mV?uk8{SgoWeu79QNe za$sPCIdky=>rR|DiHSvl@vu$P0WjAaJMx+_M2|=`E6cetNA>i#vj+kIAlw)s4%Q$h z8UPFuaWMaVz$S0@%aYu;Tmam}I`Xcjcg!o-1i9xu33K+lEso%ls?-=#IBg& z=YaBw96BqbEtc3;&yKMVixr4A8aitV)CcXsvd_Zrhdu3AyA5+-hj0>kc><0(2)==! z1KVhcRO!-fURzv$+bx3GnI*r7QM?a0_kz+}jnJxX36NFx4!^wn0q^9kO!?h;&WgA0 zypDZ#EZZB>fSGxDfeouoozK27@#}iq$MQO^?23cv0pLI^p8K|p%Z!}OLbgub6GI`= zaTa4T+l{ODNMRSFAB3IqR$rwALk(+U6-higS(=+q!8w}u!7Bn#%dBAL=H>ANoW$sW zx&ojJ;HiIKwYSr>ZMm#s00lIb5loOeEa8HjTB-_=z;0kEAR*X0K7d7zz~5=LTLp5A z_uiDah~+H-m;{0)U!&zna?@({3XjU);K!`~A5Ujjmo*4@WpB|yY1euS zYZeTdU=!g4Kyfn)q1@gN7Pw?KWPpt@=w8ybucyC^AVM{)-G{;fpRuNfi)l7iHt@N5 z8TfMO9p?vf?mQ5GjTNlWIpFZd8)toZz#dad*R0|`aG(uV&|6j~FH8~ELY$8c$YPFYn}Zdgin2xj8`PQjrbd zuhYEjh56r>6>&1bhgau2Q{0>cfZi#EGwF`wcx)(`$L9R-X7CM=C;`fH_31rju=spO zU|)~J>`1rRJp?Z;2u!eI(I!|KpX+58^ng!-OH|;}xx-_>2BtNEBcLW}%Nkqaj_V_1wmwe0b(W#OPjVbVucscd)b?NKM<=lwV9kQ%PC>+rfW|EX*SEn zgX16pl>u?okqwM_dx z=AOI#JXQp-uspDrDZJvUL}us_20j!21quSC0Yc_;+Wi>bHsKA5g^b%o0RjOsnZW{< zTpVmjO*t3Q8Ke&C86nLBkH;|xI?eY^1-J*+H*ElSoS=cn#4<=9Uef`UV0WPA;&_w< zqMNuh2n4>`enq~Q<4o+{Z+l_u=d@vv{VUzep~bR+98QBIj{YHTS8shY?;p#B{a^{K z|LOGu8&V!gq4mSEz(b1v3s4PKkC!Zh$>dBNI7#p7`ZYBCRpdn7u-#2?cj z-CI=FavxKHo2U=>d$E&{e5kq)ehpMW2y=;as({r#%@7y!iZUTE9J zu%a1dh&MI}UoVzoKVHY#qKHw=S=!LgLQ5W)M_7l|4|nXu5C|e3b$fXz;VG6KPtJMs z4mCUvWFpCB@T8A5uvQK83bhn#>aL*x0D%Fo!x9m^7cX1q`F1`}n;GDM$xey~Iut-P z+xua{I|mI)8hu6LS_UX_wgFe~9WovwyaktrZ9aF;&rQFOOME29={n$;*-ANqjwJ`0 zsjV`XrSTkes4PbtLSuPc;ycfVorAqC5-xcj%RZvQ(nYUaSTk6lU^AIk!6*Sq#LKt; z;RN~jxpCUJwV6rNJJ5+sjhE(VZk>)5u`7733L);^BR?-l zFQ>`WXS2R`7mw>`EH-G#>K)e0smmNy4WIe=WZOanLH>^d~Td%y=yN?2KH+V4Gu2WtDKnxs zoQEX=Pd+%+VvR_*M;(N411&6R;DuJSU?Et-!?#R~e*vK1OQPG-_4QWy9?=ZX1Ed6L z+1FHRBu<{)ibx*z+$P)EO}LsRS&*;@c&i(@XH(KXIO`^d-lQ{er?7-3*AihQ@a{Tt z{u?B!Wq7uv@Hk3{1Aw9=6H%J$xwoz8{KVe&2qb_ecnsdh`rHLOCwST~Ccp+i>;lF! z4RcuSk*v+G_a=PU3=NM+mN|L_x&U>CJy?y!4o(+F? zZ#WS)WS+|tC4U_%T#!`2%BAs>9m+wwrM4kbvzZ=S6?-e0eKAgME+rd`*0q3!?&LlpV=*^ zJ#p=T`O|(ky6!m=kZQ zgaQGLQ=*0ip$BgOtL@&EHcremr}modU2gdUsPn*8v)Pevxbgg#KF11U0(SKBsRC%43VsI2MQ+KR(~9G+^4A z5PbaB0{{n?;p}bk@V*A`q@)3c0rbLLpir>&gCK2^Mj~5=4KqY;KIP8a{>a@nOKC-^ zb*4~9{`7%2L+f+{K+Pj8_#w0l5F~1`(+QBZyhHSY=E|)+rh$9(HrW=#TbTm2es1e- z55f|pjX24Qq$W~gIt!Mt!luw+T8?_5kvn1xQqa)wTw!d{h3aUUl z2qus`tMGRo??pXc0?#b>SAgNUV=^x}puRR56L0M`Rrg`qVvHZR{A2daGxA9bkC|YB zqgW)vK{k|wIPnxf9Q(95OVHhDD;HmWu?LrJ6PQ+DFYouZv~#A_cCs9eka3zKA|iWT zXmv+P_P?K*le=qtBV&_x1`v`hw>cGscS5iu6J+kK5#|VInkp;d`D}Zat^qy9stqPu z>^|*w=j5`N%$ms6!)5Ie7LRkf@!f}11=O8vzSO*l@x24xaB2MKJQo(SwV~;0;MD`Z zkkBNiwc*VBMthqDjS$@y%`Vw?^A_tsRlOS^EGnvVZq6_6zh9O*VGb~wdRV>al}U;2 z{i~Z{ah}zn#9K^7osDSWB9ZOkbY3h#<-LK8M7ngS#dLC*_!jGp@>~2{EH$m&!otUf z))S|?mg{JSjx)IL=g;b}4@>+BUqBf`ml6aWzr3O1ihsSDDg+3yvc9Ey$iS++{8Cc` z9^JqPaYh5E#Z2Cd_I3;X&Fx)7lOZw^w0t!hkgLu*BSl2jKL%IQ>u@hvRFuvf%gOzi=dzFK-rj2V8QyY)dKc zO@>weZ%@MT8W1vdaO&_InKj0__kG&nhlzm-S(0cC%YEYr{5}|1*Mt1Ou9_wlx$BexswhR&L zWL1MA1BIyiLb9t_Fs?zVw=4mXmsq@2eTcdbOjBeaL}$_4$sc>qgj3(`0xWg>o0V5ySaNF5 zhag4}geo=LogQoFhrX%-0Us-b)JeK+--2nttWTc_5SYthF?o7!uPaae)=-Gef|+bv zUxYNtiDR^Ko!CUQGBI5(0aa9BsnWb(B{1x&Wh7~6S;5GJy^zbus+ic53rU!#kLAATds-n?2}!s zKsaweEDq)^JQCH0+zGaZ?FAx2g5PB69>aAo^ewykC zOL@3>+;=^_=mK0^W;zLrV}scTHgi9oSzJqGPgaUxqG3!?z-gO!o2r$?rxANB=~j#Z zqR(MJaWnTGeyGwA@RhAPfTc%p^`Q`o6_Wtx=kPWSoY>5z1iLhF_ZE!d47SBOO;HyX zV6iPP+-Hx~)?hi5=!=Ks>~6OX;AX4Mcd!c4LMx6fGzs`i6p780`U3*_tvo#T5CQb`sx>zBpHVcN#fr6}EMa~JJ z=*hgBoou(FUfC;eD7@QZb{d}qR(_u8)p;wn>%p!S=&+0#UVje}scrIaRU(M#^AS3WI4!ZwF@Z8rvLnZ4u%fm30v3!0~3dfTpD;xO2vT z5`NFOCR81kH-BY~H<62{hc={b#e2q2v*m#uJWY#Xb(=MKz&{?D$Br$Ilt+X^(K_T2 zH^nEXBQVd*?66Q^JwJ?%^1N zeibOuC$OtuXe*- zgC+fn{}HJy7THVZLHQXvkTMBOv^U;my%tk4>+XQ&^-gh2xg@mo5A>29?=#GHRBqP z;8D5(#@X(eO>$cVhl{(s!g~u@+;)Je5^!FT666MfdRlJm_NZt1*hojfvw7@R(d&G! zK?K0;9^MUHq{`^9%;f^aPjx^!X-B?-75(t^06sv$zhz9@_`fso8gG;313+3t8+@xR z{jY|Gw{C@law+A6KZxqD@@#O7>W$H(6ylzbsPPOphXJB3*DrQG+K&wQ0Fh#{>~60I zXaYaZhn~R}Y<#|V@x^3tkaU5jIC(bF4;ZVbAP3k!Uaf72NVFBFC9N5D4M~C*gAyS| zoHlVJ{DWm7CgTAzYms%okI*eCLa`RC4Oeo)#gt3SP(6h#A8R=tb8TitUg;+5sZ9nd ztX2}Zhj4qfyBy_#8&7+ALAx>gT4(Xe`}$`ftdHwAmKCam~S4uRNd zQ9C|B7OUeU(qB1QqmxrsxBy@L1T5#_;SFo*G=avS8<@A>jK%WESU&F^7=|mEhIG^i z_rCKooCY)Z(~=ulRpjez8?ui@Pz@TKU_sEyQ2tWCOk9Pf+5PoiD)3HNTS(SfU%D0i z%BcIWDd26s(g-`STlJ;eDs^aK@Tk}F%OfM!Q>%f4Cq=d^d?sDSbUx3Ds5yHns7UKkyo#8PNhX{dV;AS^Q7_BlVR@$kLQGp#4SW=j`^)}Vb zyKq|kII+rN|GJ=H_8h6taNU*Q;4Lgs=doCDDdX2JAf=|lQyfb1vee+Dg3sbbPoQXG zoBP<1o@v2T)=aH*#+HXS*Vs3Xg0Rr~p`wVDG$-L5KZ`%MEs7`(%Pd!!knh^dgZZ*e z_CB93qJ49!u(sbL8&EF-9dDLlCV0i1c@lO?I07?(G>8ti@ zYqnjQp7Ex>G7QNJoU#-U03T>K6JN5`e~MMhwL&&$J7m~;9)rV+(>bSdoZf)e7vn@? z&pnTpy!A4+K#n=pi&F4?c!0z7oaHQ2!t++N`xxiS! zSbTnvitx4ywVt5lC*QV+0$w=tUb^BXEodcL@n2pkUX6!s;?E+u%xT6W zaF#4Li8pqjs+_gl`0!=QghS`GS6Sh(9sqZa*#mtpuY9BKBk0TSsQ7QNK89~DL_k|D z)FbS=Ta%ZSn9kS=dS@_v zlj-siFfdcTZ}wzcAy%ORDcPD=?CZd2)OfOK;#A%bE((J!LAsO(K<5qb8oAvd&#TF! zI0ct}Hy(;Ls@dkXWjE*ryPibFfSkuW`e*}058aDJPQk0@f%k{Auvd%VY76bOPl&Iv z_i<)RLO4g=azqZR5mi<1+KDx{m3gOKe8jy4$g*|Q26A1cDfWl;0{kcJ+{;~+>k8-F zi@ZnCSpp3hilA?W)-7LvGDo#}I%rP8K)z~uTk}}e1$TM`2~Evzi1hXn8zjWzEGzf( zec&c@wNl`;zcj+)RS&ZJ2-{Ii$Q~E~JCSD!3>*JBVS!L2OKb9B<#SU@$#OmzAwS(} zwEewQvqAAu8QH!EB4Eu|1D_3u^I9A{?Eng7kh4VtD_wy%_6i$Bn&4-EA3#g88ROOW zf}$&FcH5J|+qANd)BBdq4_H*RiZG9Jr81>OAZu|FEWaRt+rj|Al8u*SmMumO=>c9V z>F>pk@ z(JK&|RBEp42u4l}%*vc;T4I$6Jcp4002EJowGiR|S%u)}ea2P{PWg@)u5^^$v0R(= ziQj}fJOdE=1QBHMu%ZmXT+U>xmxyJl(OvB!oYrU@Me(O%*O?LSvWnGeHn3>5k1BIY z#(786OI6lXR1<6$G1)$W0b19rbVop+P&x0n?Hu>rC4(8PhEJ%jIPNVia|2$-5Xn?w zxRv^POE;{Uf?7^<#v4$N?~89$5vN+Ikoim(C)>mm-pmwW`d0q@0A$?OL1)~Qx@Rgi z+^U3ZmQ1NhJc+deTP++(euZptQsGRzSiKHD5+Xxn#NF9uZlPq?Ln`9vPg;X%B~Ezj zBJ+9L4P3T4zvcXe7+CvgopJ5r5MZOjZFP`r)fOsdI;b_&V1%#2?S|coQoTb`-fo~XZN;n*^#NY{P3%Jza-Sk-($C>XXG_&;ZFvZ%kZHTZFrBw#+VKdq~k8OrvmI1-> zzIm`|hPJpbrBjv__~vYfrDX9lD?7beb)o}j=CZtyN5LBN*uVDd6nY4`?79FfxuzZ8%+Vmc0d0FLVx*%m!bx1jT?@V{umlUiJH%Bt9=69=^I9aN1&rmRX1wD0V` zi#12rTfG(S%a4|||i~hTBVl=v@{rI$)&r<&xMq_FxNp z1Y`~TUO!{A3lu=(=#i%bPN3(O6KBgGf^Aspo~~eoKM5`>x)9F`i)drRX?~_CnvM%( z9|h$K`dJPGm$Ms=Ckyk{ZOQ`L?EHs@Aw`SbqXF+xT){-5S0L;^8(w^pcR0wNuPBu1 zcfiftKw(z}C=KlFteICyz=mUQU%g@>vO)ucmx8BV-qETDwdx6d{ON^pDYzXE0-SkP z^Z)*t?huFfxE6|R<9UU z1E*G9YOL5M9}GE!q?!}(!R`=oM+Oex9b_rQ@gg)k+~)>h+YYK`_H>4cIS~l@?Z6aF zGpVHpTjZI&;9NFVrg$h9#ov30tQazEzr6C+gSS!*7i-um!w|MT<%6J}g#`Qvf6g|B z=Av7n$f`d4Ml*p5E91c8yse$>&cosGf*|-GEWCg$)qGEHuWvGWhg^1&;h5Gf5Vr9!G9si@|=n0B&>I1+_N)UBLoH^U4iJbgIvr17v zH0^CV2QmG?selB^SumITey3+#slYmj0Lqo_RpHUktC+*L;Pz~exJ~L#i`Ndb{a#Yn zsd!kqZo4yYj?km#eX{?$JxO&`)6DE5K23(Wo43~%Fqmv6eArZHXS%a&pt&353kfok z@I+wM$F?QKf>~-42YZ;_^A*)PldYGJ-XX=VX$aE_EHhh zVOFaiRv1l1C2IuQG{U?UM*v|WSB$_AfP$)_!~Q({_p--Ev|;HW;QW|-R@hjz#Ll9k zV0HE0*&1 z(XjJStnOdhVlh;Kd>pA_Q#wf7BW}mFt=?7+@eq$jvf?Y1zz1!WxKr}Z&)yVXj*y?; zniv2L5Sa6F6cwT#3zZ38m)cEAeFO`Y>uBxDLs6qa@Rwl#PdLMbHEa*7$9o-ECNzBe zwYOdGDnbDfRC;=4jI&H*FBZ^-weS|qt7s3>y`w2n8~Q5VX(f{uxP;ScQ155i7qF%E zVUt5$;24fUP_w^-0{c5#OKoGGROwI{*4r2 zA(C}hws{+<~2|<+bxH3(3eqz7+Q~^ zPV#(eFe6OJuBtEcMfg?K!EGvRDq5#X2x?wr!4jkTX?d&mcX(amd^(#&Fmk^5vXL3L zp4BCqiY9MS^JMKM+QKOPLjw#OK= zf(H+$Py}0oFmkiayvDig?TYClD9?eX)LhXv8FL_64oWeSI<%*7Mr@3Wp`kG9Bnrh22AIN@IaRJ zDYFu?k{UiIu5rUDIRrr+-fft>6)CS4?AfaN_VVz}c8!*%>~d4~q3bNv?Ftwue-AXmQaFvtn%{@uiNWIO%u6@rMdvGpRaIA4t-L6UuiB02 z^?Nv+#a1Jpz`pf`T}M@3y^K~K0LxGmMi{g~y1d?*2tRmpr-xndsl}y%osX$+20g&F z8ekiDHyehiCNAJm^n%N`73;oU_g?#x)>|#w73l}=Ul~&8Er$6I0_}QBBnVE#BJUaB z!qD!BDt1HNx)-Jc1G7@<(>|6{wKjVjKngHhP?nl_|5Fs zJEY6jQhS?DF>qVDnV^Q<^8TB5a}rD|mbddt&-Gvn7*n^w(mc#DUU`1yS;g-}Qy1`6 zNz&TA3dhUOnC;mHR0t36DCpV6tH*vs?~aH$j=}Nv8yMrvjH0A~V-&nwA=KDaN9YsA zI5|x^U`k`12Yy5bsHF8f)kFbc&N7aEE6&9C>-_kw^um+3%=ohElQXo=oDTT06_}W? zP4=0{ji0_%SFxkbME(1xz#G$VcB|P*kWWA+*eR96t9j0HRO)2gPHOqqt5T_4*=<vf|~|AP!IH2OFJ0 zxA`WxUYgcBJf~oe?|d-u@4?!R%I-}u*zt-QrLMpco*xbo)FM3z$^|E7kHUbTDEv@tAMr}sW*H-PfO!RV zajFfAQF^Bof+EdZ0Vj6d2Df%s-H?^;3h40dRw8nC>}pnkQE?<|Hu%@6RzrBmAx&s|59OfhoP!2?aZJ&?1O{EXYUl>9uQSI3b?*H!Ns~;7D_o- z@S(Ms1#UMFdj{A!a|ajz*lTl^35?(yTo|8MmD5l0W$^@ugr~Q@!S-6L2Rm>yDg?7D zRW=V{(tRX;Cf3^va4u@AV*EO8?o!hq3-ssc7%|5n*%C>o1* zjT|O|>ZzJNtnQt?87puCpqMewgt@;J5mtc~2Mi^zFs9W<=4{UAI#@Z*2?V`KnVh~< zSX4D_Zp;Eu-(2r&sLz(zc)ka0dp#T|%e8RpuVjZaermRpgeL~LJBYXw?r!HsuB48@ zO`L_9gM#0SN;bw!TRu$wsgf7HJ>wY?{?JAi5IW~I;5=YzR;%OH)_i!VOTcnno@E%v z;n)%UpQ$FNg;_QdcnVMo5V^qH&v?+JveU(v3UxM7 z!CUI291S=qgPM;nUxH*T)6DjX?`o${hWHhy^;ysaHnOHPS~sDxd$Av2d-2nsBk2Kd zd&q|rcEaAQKhL?@g5t2gmk|=ip6tBg4Fm&e34TDt<`Xe~D~&MmyiMVCPDn6Ela>3x z>8IyS;+VEoF}?7?uQpM(apF8!=KIoMD{q(Bx}=h)jS%o@wWjc(9LvsmbEKbsXa(MD zJBxU?`^fmSVWIbYuT`vr!q3>VVXHEJ$7V)2B6M9EVcx>-PB6=fZy7v+3K7e)%ooEu zCzd$4ZKzQIT$PxHOI1V!z^&9_>9+L{vCR~4obBMV0B|@F%hn&&$?+CdH7|AR#^c4v z6od7ln7(s%0b7>}aPu%JXz>HF(owz5AlBc>7XT9e8N8v^z~k-2+#-`5UTvi9tYB~d zIp5A|%w|;|r+KP3k=v=uc!yu!rV|Crtn;#^C@Ml~4QPduS~Y&IFgT7*g|OzhzezAc zF>WUl4efTeg#-^Gyk66>-W(XCQy+(F6t;Cr@OxI=Ty^nRoEHmZ*KAo)d{Ta?teu+p zAR;rrZ`=CycJ^~bOgTC_^1aPvM}w1o4QE8S0wh>N6XrEI(BJblkjc`0= z0FJ6uXH-_(Cf57So7z2WVN3Mt$>JxVCZR`}Qm;o&Q&7ZGH9H`lYErR3=R1kmo$jE% z=v->3R5iuy&xuJm%Ea(${=6KsO6YzYRXaS>Tz|2IxZncq32Qc$ za~fYgFy6-jHjgz5pj6IgAou`2ISk>QIrVsn<4JN$M%_^^4oQ7t zTGGMUc=bn7tOHkM&88AH(ky<|&9*t@iB*%O9>gS#Ap9@Ij9-rTbqx+Z)b zZWWIK-%#*g*-x7t9J;O8IicLdi6v`QrNizOR5f3-oj(BBfcOH+4o;t%;||>gnp>X; z^BM%dWWMjwNm`!!G#qzw1gBC)(SQNkydvx!iaxG)vg0-Dsj^#1{jHgVqNz`Bk=f~0 z6wv}MQ*Uq3?ZuM^)uX<=6-ej!QYWz9CmZtW1f{^*@pdQioP|;xQU&DuvMRzRW)s>6 ze1ym$*K|CV*Fd#Cksw$t>BDxtoV~M2WsBX#lLlB^ucdi}B`R-?Q;5Q#`cEjo?kj&fcgMB1Ip;eVQ@}PqA7+qaFJg?QK3QZpJ6;B@) zEJ)g)`9ZS8?_L%GBpjaV3DK;IwNze8tqySk@viz#ko0ieGz`%{%XT<6>d8fLR5al|?gkb-lCIi?ELH z=%w6xylt|O6t^4Hc>=w&0J=_~WwYzNIH42})UE4Nbxak??){}BfG&G}9V!5QU}v2q z058eiww60v=y})$`_{kcuH)9ayp+YwfTryuH|>-iD&!sd+g#Zki)7=fn{=$~bb;-7 z6hM{}b9rn&CtnIO6eX>}_>ek++J0^)6gLMVcys~8ZlmW7XC<2;$_V5pvG1`Fp^Qq< zE#9@6;+H#!c*sFfvj{+Dp? zJPj<)(W#p7cJ@qm5;O0Yl&4cTpbi@!mI!Sp)c7L*)d!%nMM6{$Jf`HtmX zs*pL!1?zKO8}uKrR(L-CwOEfha(7T9XWdH~sP~)YtUJIEpqpJCN~MU*&xQ#FJT7Hl zK~n{O<#;8IwQ}Jq9d8ZvGO(LdQ5&>6Q_dW}l;e~s&cpe~Jf?-tOB4+obh;LxRjCY@ zc)l}P@ycqf;qu%8+bN9!B9wI6aA|qvG;7$Mucrb;tPbZXPH?ME4|&@jp<@kOhW!!S zW`o#sm_iH|epMY3c1U<}Shli9=0f;T$Dl{wDf7GddSSFmVhTKh)|+*#)5`nq(3tS3 z6#&k{uL?y7Sey>diqa~$c*jU~Cn)0cLwVxi*ipxp+U2N1i7Aw2j`vd7*5O+vrFTda zpqD6AaSp1|F2|{-gdyDxTBafn_Ov4>%IvnOE-_78Z!y^YUc^b>t**vDS%m-s;Tw-) zc~xT_6vZh7tlW6^T}^=U%x7|DWqL;n7B!|>OFNS^U)JHij#eH;<-ot{MK}}N8g#FF zoS3z&VGmeXu-Xou?WLef2WpT!Ch-ouQwgT7z#D{+tX3KRs9q59q^AB3HUf1Uy)Cjz zJV$Zx!K+kp-mF0|H9jn-a!7k(ZIeBhZwbbHf4@7<*=YcR4uYh@m$x}Tz~(XS>Si{)p^rSnS3q1i$9Zu6z$F|P}ak)sFEP(#{6$;&o92gU0DAP+*W zaso6R4scCZJ6_hd_8sb0GJ zTu}(`tea(_#y<8d1@P9qI}o%g;tb&Gm)Ts1vm#bOtzif2hGx0FQ`2^jUQdqucsjq| zfU1}cZaMF1;mg}prZW3&mY@*v_FIx@5#cMf^$r5WKi<}*dEpN5Hn>5Y@bb!6zaw;} z*;F9EJsnE!K_#2jES8{q%??33avJaKt5Af1K4A4ga%h9aAif!YI|gfkcW?4J2ZkuY z&hdn~I&#U;r?+~Xcl1m;r`~&-CtIU+>a6=KxK)7t<*nxA6N>Y|@X8Jva~cGoemd@9 zs<`O2TrvrT36=|5x1h1b=ANPemXhw#R^9@8x3gAFT)t^~WdMk2xH0bqax~>_FMo{Q z>zgOT^Qe5yrUFMlvvncmZ}BXEs`o22fi$Jx=4+mZqx7BSsx}BwTrp$ik-YW*#p_?}{9vJhjx)Vu07B)+?(KMZwlOO&5!j#8 zya1^Au?I?t+wI&3RiTQek7tV3_yk-t&cUH9>CVS=UhYyeBXnsnP{Ki{xWdn(2VJRO zixHOzX(3=sb`(^*#yFLSaLgRF{UeUX^Riygo>d@%EjUs}OnNyO3v6(!Zt7G;_=II_ z2X3a?BMe)QmV`NarFT|ciXgR)9Uu7GIXMIwcf-U9^+$t&FWPD zNlBZLtc1Jxg{Zc*SEbgUzI~1k&JLW$d38G*u4#Ru)yQi)*{nFv^vsu;di#sIE!3x_ zKkU~9Aj!#!zJ9>Nv7DwjYI>AH&cyoWs}QY|oa6R7<$kW#1xr%G0?d}SLi+2GuIDvh zYkJfbzoZO+TJMPL^iEn0yn}~2iApTA90^M&-~pAhRid^~Tbvf&83mlA+rEyA72?R8 zN~Sv-)NxMy7XLkz$_7Qg4MR@ZHU(=A`ZSqU&r{)Ze39)ItTi;Am}nO5QWv?t+|ut< zuw%z#zNy0S&TPLpxjSmj#WD8;FSF~-VmrH)y!?2SXMf&wqSFb=`CitY*}9yd_U+b< zH!n9gXwH;TmM5JA_l@p)`6nAVgMCZ#ct<6nT%oQ_C{U-tgL z3Y1epZalC36>3r|_FWXpxa+N2q9gR=?LNx;1(@Smv>kslwI_i@@+XpU4Vrt+rz=TG&BTf9HObOCnQ+hrKpv4=lk=J(&tcTUy(lLfcIA5 zZWGt0wKn!#6Sp0*hQZIr^0k(qY?9nNW?R)yaUx_Ug57X9R_T@a7NCK8yakLG%ofmi z8R?wluGAF%Vero&u|3rmRyHEMUFVpi#m?4l;~JFw@g_uplc9no0nR(QtZ=&`zj5T} zSayr9Ilb1aR-ljNuxDF*Te3%Hd24DfI7qK6pADKId=mO1E-oGl8sk)*<@XFR%5tZc zWk@}nv>HP|3e=kBjyOWsaE6jqSCG%=0Kn$=KY=r;+_3Wj(gus$tOkFC(VGldcYXCm zmNVzXB+!T2U~MXNJ8$`XRQ=}%6gw-{%c_AMeISSD-73~OKaNvid-8)t-%hDGl#jTa z$bFAu|C5t!>`gRT)1FpNpkr58>hAWwC;)^F$MD`q@ph2!UQ`DJB7$fvHNgkLQ=C9M z)YbxpwmuzHq3WR0e?{EuU~g>vK3<7fr|xYP>2}=~P}-2~JVc8R5^?$_`m3sw?GS;t zTAZe+7{7F!-ar+n0Zcp&!N}gPt_;}rUgjN%#Xnr^749W1JqEUPn9_cZw~TQsuI-$ADIGw6-YU%6ghD7N zPEB&a@pe?~&Q;Z+W;-uSn~rV47Qt(&xau%^Lojg~yarTryd<#|MrRfkxHdm`3}&fy1+LYaoki#jE+*Y=^<+7}BAX1r(qi0wr6Cu}Je!n>HEpj1>K%8xU&$E7 zmbW)H^H%0BK5#^54Ib89nbH`RBRaRq@qR;H%Uj-+)G*KebZtMsxR>?I0clDt=oU{8=cifa9WxZ==-*}0C5=p3F`xl{SC zqAaty42a9HDb_m3mfu#PCoTuHZ0Dcj6LlI6VLhtJPF3jm1aLAZ3ebxW0m-Q>f`^QA zRPVk3>u_`LTkMQv&7s?lq&;n?igt>ZcZky?ko?^H4f607Dt9QzB1jbriCF=K=TydW zq|)JhoSE4EnDsfQckIRa=)*x0fDyAPkYE75=!YNV@1SG$@hC5P=zhR8Hu$vD;>*Wz z9-hTZ)h|VMmlX_KKQKYgwz-`Ji?>E$gyStV=j>;1axRZK7IYS~C5n+ke4PNWv0uPi ze}E&9%B05a4O&*_iWB0@JV(^oInRLyabvR~J8=zfVB`6;GhH@eui32u$lx&fedy^P zzEfTd9uDr}N{*$l+BHK|l)c0^H)!v|&kWd~QoY3DRe*WCykcaWWgP8*!(o!O--?^{ z*Xc|z{Y+Xo;c2J|gjWMEo|rde@le24)td#(x8g|wUgdS=1oq#?{ZfX}PCiCZGp(Q; z@Mec)&Vec4m6&D=s#9p7R82WIW&Wq*moM0h_pzq5-t<7XAj^BG?9~)lSz!Po1Hr?7 zHS7|`;H*=^8syw!dJ*A08sKC+okzJX#^D5l%hGequ2PEFJ2=aS6;Y%CE9%NV*_Ndo z$a43*Ru2GPBGCz@U4Gd*IREx$1dHb(5|0BGyh^E#Vc0!c@&2Y;h8ovN^2$nF&TI+r znsTTr-Bevu@l1(<{!RwOS{){VV*@q-V4X?`_Ojk7zXI+!VufwJv=ud%dSfE)^D8KI z-G&r=F%B%w{ib7Cbp_TOXeSkuK0Z#6RIbH_2l%Ko_2PFYxaI!?Z%+^o1=DuLsue!BtLde zuokcQZt&jl&Dd2=+vgc4Q%zZT@e9C@@Zb3Ve)xd@K0aW4vD!D^ef?$o=1-1a`?cTx zYX0H+_UrGz8SD7?J7-S+NBHpZkACx?{Pyqt>wob3pT6whfBT1DfBE}g*Wdm1KU_cl z{=@m#3;`S#O~zxp`8{^E=F&BvcER`#p!KDICUr*GR=^YagX^XbPw z`OeSzY5Qh<^~KuXeg3ES&p)GMB*vA+HGAJw|C9IOfAOckc;oTu)A;nw`2Nd}-+wh(s`2$V z%a3@M>;2XCv40#N=SSY~Wf^R+g=8{=(kg_xZ)Ye14t&J%9S$ z$Mw~8jsKr{oX=K2zy9}MeSB?OYyINWS3mx^Syqka07_-yPtgh{d>&+e6KzqB$w+~ADD0Fgtqbhcbv!9@b?$%XCFUX;+JiF!!q`7IJ|h0 z?`&T9>V3%hiTCike(^cqxbRRDo~Zru4}bFgS3hpweE;Pa?fdUOe*I(o!=HQ{?VHcr zu)h3N+xUOkw14xrfBBDJe=|2O>Ge>5gHQO~&u-+O|Jnciw!i-+r}_IY{)Qj$i$7|A z{ZCJA@!M}d{ilBYi_c&D^`HIE`iRAS$YIzd66|@2~v&`J?kU zK79VG59g2g>tFjV{WfOykMZ8W@!_oX{P3IK|MV)%`6AHVkDw|;T%KK#Ak z`uqOS{oyyi#x4} z`3G0<C1lmtMT>3V|<9^`p~}lrv3cDg7~-c;Xj-oJ`s6;_5t_) zlV6^W4=l}p#3H{r+}8Brm)L||`H6q|{&_q<`~o?=Fyhbu0yOCf`tv{it1thL{?XSz z`wzb!>xW;j7Y}ou*N6Kq|M4&U;OEfs-D_Vg;V=Gue`49!`q>)CtkX=D;`;e&)!d^0 zV2Rvkf0Xx+CarRD`ji(_?OtcUyJ?F%IM02?S6p|tQx$~F{v4rM zik+iFa%WH(V90uO>b6D!!cd_(o+9hY_ZB>0@HwQ1K(48B5va6OT z%sjmmeWgoyg{%ZWt7)?8E~cUF8@Vid?{S~^Dr+XEPG2)P%*eZK{!uBdYTwUM&N7`f zw!q6qy31lf_CnFna8&1d&U;&K)}|fv$+^+D@|D4S zemEnKx2tz~s>Y@~%Pt;@GGi`Bw_KM$o+_ffYSyD*Kw-WEk<~kYY+>?-k|W?q?D|B< zmoE<6bvm}Ou_&=}QtEt0^_nYQPKHqL){)p(%qd*e5n<6v*L4PaES{v;R6F|H@}#P) z3euKLL>9WGrAT~N?dlBP;C+@`P);w@yE+|Ok&XvDxL?uF!7*nAo$GtsLsl-QPCiyZ zS6d%gqS@Y|P(??;F&KA=P9QzAD*S39%&Qfr+?kZyUOM+0FUvzu%eQOZ(<<84l_;1_ z`p08dzH7w7a*IeZF#{GvNf>o2KYR5(8LTu=tM={lo6Ld&zx_RWtt2`sF?TwjpDHV{I zG3>}8Qi#|lw4kW_rE_xb<9;vL)aB^|S$!Py*qir2f5tyz%+HipIh^9i#)XU}Cm z^*rLb->UTB)Ja~-=8Mona`b?;N2%;r5jQRe;mlj9;pc1$?kQ8Zj)F(x7>97-Is&GS zFFz-r)^L4JzYXb?NwQheVyDMGU1xee*KJRWDkeRRw~?@ z# zBSqFAnMK?gC+0+A1ruV3%C|UrvN(TnD-e@{R%iXbT)%jje#K}^rdnKHF#Zjlt52!|y`rFmujADrPHu+dB zV!PIk@g1zk5o@oG$kkst9jD{<{Yqbr`_$<;UeD1rY6He2*sy;)@VupgGqN@!Pn8!{ z+Tu*A{uBF37H41f)U&l+DHz-G&+~XVZRzgK- z|3|Wzzr@{t0h<4Jot6FJBYyaZA3oxTkNDvue)x#L+aK{aNfH0gfB3Ke?f?1*FF<+z z+6?jYH%bu4-!RGiKWu{d`8$yx{?+~d|73djG!Ojw?(LTu;4{V#e|{hLD}M~a{13g%7`8`F=IJKiqfyAus&5ninp6m>qH~4X@Z08ty%|n?Eh{u@jf4wx=&Rn9B4K zAAYuN_G;!@W0=pr)hu<2aJZsV4Oxv5oC^5dO~t8wJYk#At+q?C7UziSrZuN7G!^5r zlVpZHV59H(&i{(x9r2Q`b%y&mt&A(VUZ)LpZ(EIX2cw$33XNR0r7HVlVQsL@I6nDt zB!(k^cR%J^BF7JHo4)Ou+2@`1=<8Z@c10y7c0LrZ80tC4GpFhgINBkGgFP`zQJ&{o zj;%_=3gG;tVP3JO{FLSd9hHve?VO0}*kC(_XYKnu#wcp16{|$cRa~RK!fckv^9Q!? zKiMGzui9h8;FbcQYD3x#(~j*_y2(S?W-&Hud|YooXIDrpsg}7muUYbFw@L-wB(yn4#q3{Y;n+H-fnB(L z0w>j-*2Z3rPrDubxBJAVa&V^GjyqoYj+^(%%7^Ww^wl((joXUlxYeGn=~U9!!t=&L zu&VcPs)8*tuO^M65#A>GP-!{i>kbzA>y@K3Eic8Q_y!gU z-sYO8Y8J~{Y*tm>Np?;BuzK08>QwS*SC0Y23-T z5Yw(}y%!L~lG(9QzZzCA!ph-bePbFf<;J z{pScT{u6GG3l_?E*2a3O`{Xr1SFsdtsf`9jWoJ2T2E@7uj<)ZtU^h}zmztnL{7zSR zczlh=ksmDUQX!qQGtL%>um>ls0u_n_^HLy6q$aO`t|AJM6rc{5SyiDh@y$j+toAe*7%B9&DCxGoQCDbv3LbIEUt3?E)JG zC)TBIdw?T+rd9p+MK~A;n4qku)2(b>x0B?)uTcQ}PYau1$1%1mYZG|8y3m}I*lc8< zmlF9Ez%tZ6CDd#$ZkogE^X;U0N253pCOfp006iQ;?o_2@KP@pWv|G75eVrZijyX%1 zku&Do(QN71g1x02Y^?5%{Uqwi6LJ>u-!FJDF0ZpX%en|H3I$K^Ocm$6?AhsR@Lv}H zTT%~Nu|bBX2I_d@G}Mr?%LljmUI?;Dg|l*8?|h-#x_gJmhAnGIj!~I-8Tw(k_euZ&glJef1 zN9Gve>&SIGo~fL#D!7w9px@4ug8ye{9_M08Fsm*e9qxCk?qV+NiPml(HRLj)in7@W zOCvw^Rfr1Fa!RG8*b-+SJH6_B1?e18;ZKH~Mm)}~Mx;~Y6%%ZZcXBY2@^+WAU(fSY z2lFltxN)(({>Y98Ns~P~kE=QV^_=M}xm%yz*AvhCbd-xKagP#e`Bb`YJE=*L=>DkQ zod(}6A9a9oHF0UyI8XKBQwsTEO&!ramIA`DIKWP#mq{c-hS`*9J69lAOu5xDAGV}b70&CqYT2*6lOsgpG)a9I zXO}%W)E0WVoBaz;-#Bxc@rY_$rk2~O&XZ&2)Q3~HD@to7aCjr8nD1c?_~0RKC$`=> zDA6)^!Oe8(E3egznhxRltfDU5L5 zY4tHU8=T{r9<#DeT2|jT&-FYGNuSyAS*a+z=!Fb+pe!(7UpX1eyN;Q9w)mXG8HU5! zgR>W}tF)=$uj6bw--8dao*cKnRq@R^HOG{zypL}#cRXz*;AqzvnhI0Hv64yyUftVA zPSU;7?1$T-_PB>Csy!6=xuuF{?w36@TPcpm*>fC9PHA-RbeyW@))v>X@lE;c*E{0X zN#;1+QSj~RSP+da#c7nju9;V1p=Tff@X(#dngo{5b6b?HPncS{tJ4?fVkZ?P?vWQ+ zteKYy?cR&uyz~dGea}xgJY$b&v>gsa)YIL3OjPnhT5BGS5&Q{)N9_d7ao3riw=`+Po>pZrDx)L9QM$$-Ej~*oEWL-cvsCX+S0JczJjuX>B3(I zC!6wkvtQm>ar_>R#XV}Mwc(X_syz{Uoel?T z&wUy}4<`Wu9U758tHhr<(g25jt0fX@eC#Un);z0@>g@Ke2A8vk?!?C*{ZX26I{7SP zc+07ns_k929ZZ7OqmUqvT|HK6`)IJ8-QM0hmgC~@rjr2h9|RQD`V@!6Mv4LePe8E0 zDT4!bKI6S<3A2^Pw&((t$k{5x9A3*i+qdz~u~pXw|MW~dMbu|ISym@&IZc7ZTh7JWS8-&=4Gwce;JOYzoj7hB zRi->TU99D2EIb4Uw%0bYJst`tCI?|BrDB$H-Vw{}ibrRsYfd7Q^FN7`Hbi*eCx{B~ z;7<`=E3coc_UPz59Di_~W2=8n@am@n2ixrxSLu$xQM1!e)pi3$n76WqkG)HrQk@wK zcRQ3&omJdAVJI{k#>RShs`qN@0#0qvqg`kOie+H~k^2S;InON{WsVV+S~=c6@g{_Z z@Bq5hoGekXoac1Vh@;_gE#*0#Ae)^iHE=l?&5_RO<+~RqxY06s`ok`{+tbmi*A?+*hw@2;iBmx!4%(TDI_Rh3aA2a#Rva~bQUeA!O=1uk!H~1# z!kr{`!aRrSnCZc$aNdZ}LKNb4M;6C8`ZWj)l^e7_Uh~60UgJZIUP;xzczO1({_v0g{y+E!|M1WM z#2@+4fBuWV;Ww2p{O~{V4}ZG8`1+?`Dm?aU|MkE4M{9lf?kDTRd!O-J|NIaB%|HA7 zfAZn){gdDSS0Db#`f7dCzWDG5-}f&*jSs*3X{@ilU4P#@n-5=n{+AEq>#yb~U+vo; z@mat5?T7Z^+n=uSiCpp$^;m6;!ufAgqzWe&ar?18r z-%lTaKi}_0eE8`%U-J`R@^^gLAAJ4oci)b0KK=B&4}9w%{NvyG{G8wYqe~%zbA0>n=3^>vs7^e|ww!x3I;3D;xZ`vc3OpoBNmd=vObB{~OQqUw`HN*~fgq z$+WLN;AcMk?uY;M?eVW(L;uxZ`s;3@|Iyc9%>Udybof#D&)z|Q{8ws&D)7g?zDxSy z*Uu3C(%=2dpL`mB@|7Dv#>wPVd@SJ zIYSzb>dqc}T@E3BCjea`hv}p_wZ-Z>d)lRy(z;`K&-+meXohvB zvTs{k%E7CxZZ){Y@aZfn+V@_anB%;i=Pqrn8honcRHwG{I~8S^rffMMtY~xE&TV(r zJmY$2A~YxeMt*ed?xfgjm)ABxJ8aeghsKK$1+TzX?3pnriDD0!$+kEbDUyg`y zK;|7Tn;sn9w{uYbDUaRm>;UO`oZj1}lyiKg$3|ZBsmkwo>6B~DA$J?rPIkuzjySQK zt8zN#d0w+Pg649nr&nf zvvGRwGw+ zT3LBnnQ`Whk#4qW&8zVe?Hn!i^v=C2Bjy#hooPdWzQB=P@toPSG#p5HIN?5a zPQm8fOh=tK)hi~4jyOEkdEIO&2bTY18FOMWS9C;)wm6S)&t@;Ay^ZDa;^mpa3zD)= z&e5psOMI@>ow~rU+mbrpCY;u5F6nR*V>s&^{lde{fW3B3PVoY>=A4QX>FPU=ZsQ~t z-eazyQsE5git$Kosza8Ya(GS5BUp07fnax9AEB@SdL;*Dl~BsPi$Zr}c)uG;KehsZ z@4QZoJ0~1?aCn2G7UF1*Xt^94+ILzJ1LM`i{4<^ddfM% z(&L)_K67oJ@Q5urfKx#;_WbE<#&R#b@>>-Yos?X{#;p)h?vzevL#L>w-r^))IPKt2 zYx2Qgd_>mhfc7{?_4c z=X%fOJs+<0$zF9nao)Fgd1r0-62JelsED(~rV?r#8UHvZ_IT{l%r?0-CI7;(!TEFo z^l-qo1IPGmJeHDl3;Q_V`^~lzr{hWez=~45Z8>YFgEbuBjZHYe+P-Hzd9uV}uR-j5 zoSDcojFv-lmJi37C$^5nVWGFhHs=$csWjkd*In6sLTSEIZs~43x1;BtbQLEE4z}bz zuIw~a$JXHsFoUrPVeQ1x@=eaq=ni>|>m9F0Oo*1~l)00`DYM!d0wV zVbdMTG&livfQ@)?2%q<<^XY)E?By7dV!fpyxnGZUMxBuL-btrx;wWwh)m#qag%Hm~ zXkpLdt*RY?c0WLehS^88)4I?GzK02{2_2Q_P*it(jAm|WdeBd=sPRTnw%(2yvH3+Gz$U5H}yK2uQ zXz2>qCh|E2uEygLs0_o3J0JmYM57z_sO|f2QCnI zb^|^ZesVunDPU(CAk^-SqZkSQyN!*?=JDLl83}O*tBbDn*%IF&uow}TqweSQP!xyx zJ=r=6444NwJ4d5{db>~V+_@PD(8mHcoc{ zd_q~?bhms&r{BF}lkWoJIN4SEs?#~6cib2FYUF)m+sTn%cd=;celKC~wRi=m;uc)b z4Rj%*bqjc6>dpE%+x?~&=vQaM{8qPb#8|N;*p6a;w2{; z5{}i>e6GXR`v{!4$LZ9_sJ>yFPOCZ7Z3lZCYYi8=5!x*8xCJP}Rizp-J`qHtx@7|6 zD!mHA!d@TFg9`_mBVyPtEm{dcj@wzm1pS2fXM>JC!H~Qc3xWwg9EV_M_~RRc6mEwy zJ5AgPy$&h8wpANLfP~p_7I^UKyd^%-fzcc#QCqU!$^nh5fqD&vcs)lk_Fyd(2iPWT zD`}22r^Q0N-C8ga958XYSpye{i2Wg4oe+U-soql@OhC&iEi*6h){$`=6#9? zfCAtMHl^3M`mNcyU!@~N)sAPafVJ)@v|+K?1HZgLHPI2kENKHO4Zk~VP$i)d1`@Ju z=8=HxcstyG7nv_z$x%UqpkAoVg&%&L%PmL|vsNHYc1Dvk*DBt*+;`(|6hcsk1LP3% zF#W3#G2?(^&mRIvpqhU zy0#!mJUmd`^8(j-)L*`1$?3p_Ikpkz$uR@v2f;MJBJQg=M~-)SrA0zH@$$~UOSfa^ zSu{wyW4SbSD>ogMc|AIpj_(8aS%Az_Z>N)6(eG4uUVMt&Zio`bb`9YE1h6%-I??d+io zu2%*}L#mx$UN{Os@yJT;dduA!9%?I7q7=-N0crzp&QF51W9U5PK8S(51e^^AGfq&T z<0`lMHe))EyAfZAhDCu0H~{b#b_Z4hZGrW80^&CY6fDdH7gpT*JLnSAx|X$R6U&PF zYaoR(@PVJ@+$0AmJ2&xQ@r9%t#{yGn7FP8;R0oK1&hRDo=!yam`mB??#-*hA>qH4; z!-0{-+?SQPz&~83a^)a07KNBZP{K{MWCiOSCkJ}oJTeFnDEhdA$Ca?q4xz{QTfGGa z;7Q!Z;cDd==+;4ZOueWWwygdmPl(6?0j7QnWmB2D;5r}4oc{QU-*!fhb;$Y2=*x+E6QK?!YE**WAnnQ>AF zgz%GI4o@U-o+i;?)F0447Eo5i88f>tf=g?~3 z8L9h{8bd>YfPluEN9-2pa{vQi8Qgg}bHOq5?detq?|&A^Qe zugZ%3@TV)C4#H$Pa7zJOe{95obR18z1%sV{977NMsfDA3$nivM)tlQfDpZUBmktaB zS5D`%vPXFxW^?m(@(yR7N`ow+b;OOIVEAA^kJBs*9tqg#$;#3*n`>Az5Q@Vp6`(3x zM>j7gRfH@H<;b$IU{j1i|;ZD2r&QK6`{1 zVq;K%W8D_G1K{!qin*VUv)V0%ulpT_alXOV(%1EwqBiFefF4-qeAQ#MVXkPx-w8!m zAEP?8U_>>EB=b#oaGo5dZlZ_Hy@=~P0<8Xt&jEzS#}~HN$<6SLB`10CNBr?>`v?81KSs1eRu}G_AuXYVmEC%@&YR? zCwK)89I+eRV&UYO&^8uV&M)U!Z89R^P<J`*?6{WyV; zhus&J5ik58@kB+p3B2S8RL%udWN`Ecusb@AR~4zphJ~{x@zmKMUADGlb^`mXJDVa` zR7`T&;8PuQ#FZ20cuyJ3g9*Wis@)cawZY$7(f*MnKw7v`+sVjqglI*;k_X1CvP zVmvII(CVOQRphY5Cpb)$&_n2hI^GUC!C&0iFY%w)3lwG}*#gY{;V@3y=q~AI2RBTu8B|bh6qZ9EuY6^{hFvG;ClK6L28N@ z5q6Xg0?~2i_{aGUh1YT5{nmc?LWoVO^#E<1001DEB0OyA8K>#I^qdj0gxY$g!`@uHorI9@1293%KWO%_jBHpPPfyiQEha_~yDIn58SkQfU{k`TpF%p9p> z!x5_m;*di>9haWeFACkJgxiU{w-F`7JS+HM6EKP~4pISxoQL@N9r=;%P9%Dn$HPwG zNzslzXhxBTr34I?7;r{SgsrsSEX|>y+htP0=1#sE+pDlVUL;uUl>GA5f9&Cw!Ckr z^MFS|rS{D{PO3jw;BDYH&Swu!Y+lK^($kSY@FSr_T$V;qYL0+8G~^ zdaxV*`*>9wM{dfJ3G6OA;UG$b_+@W_%27|9DYM`BaSQj~vxr5=1J-d#5HKp$EO{0% zT#FlDQO#<`ax21!W3koFjtb6?lA1b?@D3h6$}66y)Ze4JA7KkC#budVBSI1@WAu{I zmN8HlHrV^)l?)pXmjPt)CcGa@Z4=xDTDtuo9BBjXg>Wi^c;jMmWRQ2@6CU5|6ICsN zH^)@QlD)x2!t%lJPD2iMS`GLqqy-p&Tk9M+r5SD2;)oc3S#Qqz;Y1o39ZYRN`&G+4 zukOSYU_*Z!JvwkKZb5Hyu6+U*8V^}lupW^KK#q^DwgT#h(gdyr$2w1^!vh#pBg@$t z^2zbr&2nygPC3%^3zWuuh^i*KOx&=DUi(E`tvF;vUq{VD-?u4@6o`!v zobZN(z+2$Af)Ti0_d*bc&R60KKveiiFB_dGlvR)mu%5_n9@9363v|hIY&h%um?{l(dkZ_wQ57KEU~IwMq+ZTr0or$MkNR__5!lB@7#!<#cphhO?)(ij0Oa!1{z3 zRUzLvu;Au^99_cAYA@)ZdWRDR1oyJ{HI1nNWFMx5ik)jf(YVA^c;zbuGcDO}_x3jW z!3y#B#Ht(Pvdc9lM+@1Zb_akYRG-xe0BE})i3>yuxXHYXH#}G-021Y4 zam1l|6A{f+Sk_l}DD4+}kuitmS-Vtt@I1}EvPaP|%cG%-CvG_FD#t9(-Z3ft~VM}>J zsG0r5pbZui|7h5JyTaRvVyQ2?}iR~ynmD426Sy|p{2eZ`T<_GwdpdK=sScFTeqd3kouuhcC-+=+N3TUK`(|@&Tu6eeU-H zE&}d|PoN0G-gXF=Fu0$K55P+~H4dDqJOcDgP;(PffkU+e1gAJ-;lr{4f|w&;N>0WD zqU7_y0pR?6Z2}rmb2vgRdfx+~!QW=HiFWmODNVWATQ&v29r0(1*_u-ajAL3L6_a?c z^eMYGc*zM5;Rji^cUIgE*!-K{S#isTF#e--pzwaP-+Qwz3A0wqm7wiVJC2A`_p(rAb6k)3mbQ4Q# z1bWpDq9-M**kHfH(i99;-0MV{~pjsQz~h6&aQ z_4H!4m?;Q=-3bV1CkyC4@l-Z<%VCZwby*8v0>Hu2Kr;=uV|k9NK}&h8kdj*=lV=< zW+tG=T_z8{7XafA5$yr{y4ko!-^s0AijC z|{hFJwlr zk#h+AHefF#)k#=3nc+J4*bR{;qoo_xCs@|nY~ATOj{p*H1J#fG!$c_S`&rvo6y@-a{-a8oczV#oWlH(y!dtWIgN`hno*OlBkWj9st zcvP$$Z?23@^!YF!p~I>go6)4Mh6RM+}k7w{0ESkQV{t|1did4gRp6=9n5MRAF}f$yU89#5w+ zn2@d3EEE|hkA`8ddMGW^x+P|yCSCylvjO&Ig7G*o9S$vPB-kTVE8IlP;%F1<<)-_n z5Voz3x0L->tqD(Npu^WL&M01hSZ9uPInI$F1_irSldsj<$OGd|Z}I3=9S<-R*bc=Z zvr^&)-%?%(x)G~U!g9@95qCk_&E{B_22WFFWrH*T(j7vgfb%fh^p4!+LBoaPolZst z*j9`a7Ut*Ibqw?I-74K}5(TOW!{VWdioN0&aq-P00uXch+=NCJw7o^QIPiuc1@j*# zVb7Z1IFxTtKU4@Xy+!Ul%7Vmg89RF&b3g4}~y&;&7W6W;nv?C{c3`DVZ!5cRAI z-t!H~>d7N}8Df1REWSIFxtjYsBfd|`2#4RYeixzD(wy5DD?$Bux4Mke(mLXz*Bp4= z=M|9I&-vgi*3FAmr9vu9v zB%l%~{K4b(hY$++@=}~A1?aYz$YcVnzRm?^C73#=S`D$`7T*uvw*cDKp^O4QX$7pT zbwzXE9)47J8@1fd#6zWIX^Y zNi>4FDv30Rbf*QGNtF#V)ybK}(B|xPaNa?tD2s`E&9mNvh<&R$P2^=g1a!)6^g8{DFT5LzhcURfJw3q;5{P)l)ol{;{) z(UM&6fg2XmoOg?vA4(?$GtVFuM>NEI-jJj31r z{Yve?Y(UGnJHpjk1^!#jXHEVckQDD3r5OJ*!LX@(XdL4aeU<}r(!E#SOp%~ynza@^iF1ttBaIe~|*E7_9Hy&b#*cY`JY`Z&1rxGk-_W{6x$v3!W%V4AB?L+lWRf#1Q z88&tQyX{H`gbDOBZilN(r%nJL-je$*$YeFDMfUHwgD8I5RvhXx zl#&CGA13aFaVjliv)(Kaw&a``>>fZQ4Fgf~HTI+gVbHD{4?Xov{fJ855ruvH+o~^%Dw9fL z!{`ifw&3!%K#Z5I7!cmZA>7O2jZhC9%`$`QX>jZl@H228y~cRw;dGD&*8xH-w3)qwqV9p)|G-5@}_16T!>DoyZ#66V3Fsn*;F z;6sn5P%_XUdUN0Bd!dbKT-#!3!Z@B3L-yisZ&TnS9B>IIF|B&J^w^JuMoktpo0^nf zMgmJXn$Rrb1yB3P+}U{?`h6eHN;+Vr~zJhlU%@jqqE>kTy1fFuh`$SU&EI_itkYK*7KZbb} zyVD#mpRNh)IweBGn?2_X-SE0siw!>)WeqPILl#&VeI* zhn2AX>^B=3y%1(~R~tkSVBS-}!aT=M`fgQgH zT>!ZpsXIP~m=K-1Q#m8=tQJ0`T3-T4wyXjwemomC#;NvDh9mZyMKRX4+Yo8pF zDQUc+)_Gb!bU$9G-*tmW4$0&2dWq>7lzYqzdwg&x z<=$ZGY!?z#)_ZE6o_8Q3Y|GM!bvWIk4r2$Dm?HxL0(l8IO(i)i5{dI}pA9YqK~4#g z8Hb#08L@_^;xqumb-lOvwnMzG|1vfL0QDkZOv3+Vdt#Lkr3&ob5DljzO?x;5XOpPK z`V*ci=<>9V#aS250|2hL=O)@_MZlDWs_G`DP7-!d&rgeflieRP%;`!v(Vk#p!24&vN8siZU@ z7`t+Y<>e(Qn|j^vMG}1Z4sRh#@fwdWJ{9kR##(0 zh)z|Cs&9&{!3)W&5v^L8z--z0#(E&lVr`Al$xEBNX>$^?g9CZceqLa(oUp{Z__htFW_u4H&!LYd zc6sBNO$Uu+Ii^*L!wTG%?6Omi7-nQn^;%wWf^cs|nsoqPVPgN~x*G7?>gb^$HNHh5 zLsoQJC8l=lb&PH_EHK{AtE$q>(RzCH`Zbs>zMMP;ptt-QyB^t&Yl*Yt?#ei9r(#13 zC*_(@c~7uO9Q%(gu?&}#_^z*i#|SECyi_@o?bSDoqZV!-11Hunk9=@!6*umKkKQ?a?GAlU+oQ#yYL z7csjLd4=av&Ck*g_di+*z`5ixB+z*4f=x--@a4et5wca?LQ9)Ql!=?mIfUwyPiOgA zpU8oIhz+s^R%%2boMqc10tv1RH?whoC7o&-CI?IgbI!H|tKnUp#<-kaNT^D7Sh(6R z2>?SqQp)M(*Pzon6uz{CD%$TcgY9sTg$y0AK{F9F?N9Uc0eNg}#d{@NKaCxCd#^~? zWz6NBUU#tx063PxW+e+)AEGNeoYT zQ+mBiE5JPLbwd)PS9SpHeFB%3jnRNVLPj%%2ms>5Lv=J%7W_HQ>ge+zwd z)?8&ztbO)AGTZrbVR=VuJhiLzuuE?Ku)yqo8^N98O5hj8D`{E0cuwu@!k>G+p|+#FV1Sr#gYo5?{ajm%js=jwo?FR(VHlm^FvHBRA5o%#?Whe=h#9u&28B5 z3_chBK+}r5(Dt?}e+{BIrqe8DusbxH`3An-@IiGObd{DWM|F0g8%pTk*5YuK9+STW zQlO^k)Kxo=&8Ai*sO|J0-Tt+61 z-q~L$OsF!!A{{Rsj$4S%mjuw#nlK$^35tXL;>f0I3^ynXCo!5WY?rkc1~-_`{WucS z4&lS1)>Rw{+SFmK*@{B12P0Upbo-k1a7m$$}jV-@_KLT9+Tf4E2MWuz0E{TTfP$IPQ|e81VDstruYpRICtc zc3kGP5f}&o2*;B?tV({zAVBWD69C#k4C~AQXX5|qtztfuVutQJ*HCF@r|CYby@&37 z8Yh6IZ+hKm0iTlL-ooQ_9J&gaJA%N*8^QXHfB+|$rN7@Q?jE80?1^cGllWt|FzkW1 zyA>kADj=TYv3bKnreJJssY_+)7aQIT&`EGZ4%(r?(h(sOinwA~Yn9hW-bGR73)xHLU)r{3V-~ zEi=Uho)@ud*#uKXqv1Mb(D0}7&IjSRqm(dH_ITm#V{k6+O{g^UWJ6eRB5<^j z?1JoD7!otjXZ9NFdFj&!>>JYAUhSsV)7cZlTxUxd8Y+=OXYB#|UNhovUd zi{)sY?eks`nuLF>C>iGRIaSNn6Fi^Iampm*c=CGJ4Z1&ITTie#5*Yqm;3fFM)iY-W z5LFbI#du47?o2 z@X=T@?&p@CaTdJAUIl->w%s>&=-NLKmFI?LaKxMe&5l)z;Vr8NC0g?4oRWD!!0`hR zFdNti9XD*Cw6}Xh#hY=fxB|?6IMoA>jzhEOsAb#Ch|3VqsM2-QI#a3+P>$QoE*mp$ zJpdkyr@%w909dcW>aZ*@6JG~fUk+@6U9@J2+{;w)B+k0MoCV`WtDR~M6npP%9Sr2F zTAgg?l%@CJYxc-qMdi!mSsb1Y9&RE=C$;al`*2!>RBxrB8${~C2t8!yF_niHmVUu{ zaCb{Zag56$zED1%KENn08@kP5JIS4+gcl~Bfwm)VJ$QkXy%>EI7O|koKH+xS#c~?g zC(C6yHevg`&XKAq?eg}soyXmsJpsb<1_Lb5$@A8g2&PPuT{VxR!<({0xSIhiyzCuP zsJ|2ynu^s)la1$%aF!fB8x4!C&Zpf(Lq&YHqC4RR)>~EV0h&S8z{Kl_7=i`CI33jy zHdsFSgCMsRit8TNZF3In7Te?;0JF}WwK<1u9Hm;%=M)f3+1p_6+AZHnPxJ2KH66t{ z+;({i&j!Mm0q;?^4h1L8(z0OD7MN_sp3~{=p_g}Iw+b%d+%0^-IGZLP)y4oPw8IWg z*kmZ#8trPgV^Lt~QtSNTRAg&GLs$6$R|TKq(5qZ!Cpb%Y++H&7(tyovd6 zU9We>*IkY@u%r5&n`EbEc~j}p>iB#r$3bwnk?pS6I|$nzmZk6yoUbhJYWs1kqHf6G z@g95n6|}-oAEIf*gMe>N@%eOUQG=O;ZKD+=d%#GS)xyi9X@!@7Fdr7EpSYWgf9BN2 zw~DW;ebt=0WYco~yjja?i$P=(zCGZS=74E1NP!V>(1u2+s|W4F5vy7~r=vuSQ}6tj z@rni=$&LccOK;F;^nw~2=4@Ib5Z`iPFL<|w-n`-jqX>lo`-F*$X9Oo+R%|ORVztY4 zoo2AR369!1sioU-$fIp-0cV5_2)p@$b8rFGKb?;juq5o7XsCaO1&weC zzsKyCz4^ge5TKSFZ3^Qcay0DoP_ZCZ6SBo3yQsK6c#IXxa0#1Tz(}{_leWc(aF|?= zJlf>3yeYBd(d~ciD^;c_+dc5sKV3R%oba0;N-UVSH(2KN95tor{h~4->(x>c%0NSK zu9(t$Hcplg*KHZn$-bmwO9Ma0foMEIfU-Na>T<@39jXg=2uV;DZPaF75+Dv{6Scvl z8%N-l-?7sGjM0=QIHQ^?a97OEN9B}Q(+FcpDPL+v;c@LCHfshL~blOxUA}%P-yU~&0YGPXfmvkv7Bp^KDGiHrI4$GEpr@C}M zRb?S4q{GGRTIUcv$H|Yz$D}qcHmZB$%=N%qMj5=%!fVV&Vq(dVnVatxQ0TsuE4NT91za-u1YrYK| zgdB&LD3~_-;cTX8GqtJk{y6WY2`s9WQ(kkK5pg{qtH6W(b6{C`J1Dfb(^2=pD|Q}G zW_F}n3Dc}rdZJ-vIN~L%9N~nX(?nkvjn(Oe|0>YF+gW7R6<EgVj`OV)j0w=5M;jl;bAya<>a z{w`WCfFZ9cmCcDsofQjy9T0X&qq0-bE*zSrSPoC=k1|VydY*FF6b325g%r4Ns;^K= zfqpzTP$_BvEjj@P%|c*vL4%{#A8*8~cNTX@N01mPInpEKJGbhG*Aj9;`hht%cHd2}1&P(=0&YNi?S9)sIG@G{&dR|F z2$f(|WwOzBv9s2!o=k>>5Z0^%f2wnXk|XHgzIZ#BTIanuSBKIxmS5m}%2xWQV8BJh zrf}tH;k#-EmDd?CDp+te2}+Q?BA^kBGfkkzo-JKD+!D!lmt)fW_?06$f;zxX;166`*4x=(Wphaag7 z!En4>V2dnJ_2;}TCjJE#Kq}72iYbmO(K9&$M!#VJ*I@$nR`)N07TFPA@3N}rOfO`c z%UeFH?Cr_}QF0tqElOaB_qzVDf;Y(|-+`5W6}Hk$zS|*GHxUeG(-g|te3g1R4~Ppq zkS#|XhXQj3cTdDNfn{3Xy8w7348!ZaR;|W+R9IjkI2vAuf@8cgy^n0}Y?`1|Q;|=> z!x1NMtl8;o#Uv><$cCwKb}Cm%EC=scD|W4PRB#G`@+{{)i0`(xC)0<-5G>LnHg8b} zF*RFbTi=}8JG+OcjXfU~>~8^cwCQ$i6enDdx2A~4kR4PxfBy4te#y(-d*n4ITged`vf=|HYbIHm|#Z3MjPu#LIJT{ zlkf|yRG;Sb!aJu|zVVsEVy{=Ma(geIADe}3j|Qs0c_+mlIHo*+wUq67d%+$H@7CqT zSGP;>wnsaRVtIZ$szqZ~6sibv>p-)`iqoFcINsD%|l{R`zWGA05rgy>rWR}XO2 zI+b@i@#8=RIbw%Idf%*;L9y7)T$J}R1iV0~Q<&}aG5~8oOqB%-$%)!*9NUPc22AiY z4gX9qtEE$A*X6{cgv<8o?plDLD_v~ka_*yrn{Pfd^LuQu@24lnhO>z5hTAsYn)vW$ z1&PDKZ-6^n*2Foi3St3Luc4+b%!th?X4mo)P3G)U-)<$V&Rj6n6x8d>@P(obE73cf zA%d)(&XyW#x9t7)(Cjxg1VVh^JyXF7c2>>C1VTUhhJA6wIZo`Vopta-OIC*!%gwrO zj`8YFh|>vb3lJ`W865XfOB5Dn2I=uCLg`+m-k#^J5LccC0t47f&Vz&z!|^iyalxjZ zQ<ZmwcQ7s!I zc*<7cUd7faKt3oL&UBh}O6{%mnX(38ESVEtB!cXJo`jb#Z#QOzg3 zC49?{eooS(;^z~AoN_qW!wn*|-r(@cC|t>|`FD1nP1hwkln(eg-=dtM^x&zm(Xz-D z-d5~2!Q-A+JRlp{jNcP*qyv0lWZg&;XHUSz8Jy@RCoOfz@pyHViz8TVW@+=%E zJVs@SpKLRqH*8agabH>vCk#u?e&wqq0jxZoHfoCV*j`!TL9B{cDoQI2GyqG%WI3?W zF@MgNi>!Zrr`}nNnjf`1zd>*(7O|}}` zwz??v6z|yt;EdpTGEZPZcMhuN+;DStptfn} zHovQvi0X_~*81Q~0X)YxdBf3DKHbEk~eJZ=Krd`4j zhLUVOBP`nol#?x15j64uT=0M(0N^AC{7u7O=KgxcZ5?W)fy`~dH??}HPY61N0@i93 zuZ+s6f{8tvSVd3Uyy48a2y7x8^3IC4b>!eDi8Zz49+9z+-+B%d?x1>{`RJB<@vDDsG>WVg_FBuR$2M9 zmp4H;oT&Uj@&J5x+6?M($T8qCnnt~? z0?)<7g@~H1!L)WzbV_)itRCPGhXWLeMz40Dr0BFDQqcihT7!z}m2>Bq!U`->0T)-1 zRbLuJ<(D0^hVwbBm|?NI^)=JU64Q6F87 zjy`}>iv@nRkrkfMk=F3Fw3fh|-LxjATDNcVz*g*SeWG$fR|MdzwF%?|z7lGI{PsLK z9<)7gW1A`06ScB}lyNYk{FZbBur}~ydIr$SL zkzc6J!rkT0ya?{hO1p#CkL%&oU5>o(mUavUnON$^yWd`1oOTi`4CkHKvhtF!2V4NG z@(ROLx}vi-m7Q2lQ1n)*T#iZ*RbjqtDWP^+e=e*m79sF8P!bDWd18Xe zLfThKESc431S{o@n*|MgraI^q;NQ->;Pd{Kt5I2yFsEMOH*T6Ly7 zN;aZdkO}hO$lA8}us1B2a!B`i6jer)(}SDA3-4+2GJ9)pmT2%P&8sIKZS(d;!QjhW z!m{^<=R1a6;vF5(h*%@;b1v1}l-G`$Zu!h!i|Ot6=#JC!Wo4MGOFV!OoV1xS&<*bAGLxoYhbi21y!~H8 z-7lg6SX(DMvTk7X6hJ7|ZUjY$B~q-OS}3nf=G>nvksjMgot28uzLel43Uo-1O>pTj zm^dCHTh!caf?Y%RP?Y`#1sj>0c-g_$A+=^)!Us$fUlw^{Tq?7&`uJugORT)~^nuav zOW6xmyAS0(?QN1T#A5g*R@hbIm}V;XW0zP8xzX&kh?+Aa#EZ!i0? z6bQCN=?T{ADv)KC2;Y&Wb#$R0@ zRPY0cvu)0DkZ*mns9p|jvw+|}-vg*hfS3uNSQV)ojz_p1YOS~_XW?|Jdw&JCFO{v* zXh2NQY3%mv+^_H!Pj$R~*=jH-cD$?7g#MirIKsLJJr}hH8rYz0P=LUjTD~LqM=LJp)KFGj02M@xszM;a~zKl}{(X zJ6hyaY$%`hjo9p+Lz&K1IW57kaIrZ~e0bm=0t>_}WaXB@yx=B$-?Tvfy6j62Y6*E5 z&B0!fz3S*A>p+Or%`%T;o~PM9nCE>iUiA)+Ww6!Rp%tu*XMnV^>3u3%2-7B(5$?=jfykQ|H&Bmk69}Gas9^$7b1I3_ zzp5qJysA_@G2AQI+jg<17)+G@-)|j5;}y305K3@?vOA#soQmM_^T7Ajy=p8b5aAER z8T?vS@7(DJ-Psc7p(-Xv$@`Dw2$}TmcT?lq8d#RM`%)H36IVmVR+PDR9*`0%z zAfUoo$5!{+o&dInBg2btcUUTqHv(sKt~o6bx<_d;tF6*u1I1(M*4@p8CSr6^o<3gc zyY4EB;t&$zULqKr_+inqbrzt-beJhN8*=hhd{L!a_wlw%$fn4Q}OXGJL?8hLg9xLx=-&$u>0QXw59HiM3JO2nT3ELg#$j z2-NmFy}&YVHCMdn0ruU1tXJfh!?7I?0_U!P&TL1t;%=&8cn_xB$gK$8v(yh-tkx}i zsF?ERH>9t`LKV%k>c;_GLin%-qu8fPWMPG!62+lY$4ttEd+yi)th&i=04K$Z9o7lr zo8t19EumJZ74n4Lbk#dCiO2Z{9m9m19v85BFViCI!LXTKRa}MNJIh#|Vez?cxCp=a zcJD8|3UQ>yBk_c`*j182Q%)%}LF`R{P0l#>+i^T#istqPWzSTBXkI0-)clUZ{g6vF zLcE-9gcL#ppV{pO?WW+0O?9|k=&C`TKfF}aH`NE@Jg!%#!~CUJsGNA1(cWe+gAC0Y z2z%BFk>1%_gTvAnROU+18{+GcqFPvGDj>}{x4qHY2Agt}-!+{v!0iTbz;ku>mr{gh zHJRS`ILdQ5?8-*6nI@mvlp3mhRWSc&Wj05^3cvo!{y-R}l37@Au>$abF5@UKoV*u9 z7goM((RvGGyo)v~+`M`>+zdHNi3-qykXxL?5fZo!PB6fjLzsadchO`|b4M`ot^yAJ z`Wbee&ggU#IR?>|KP&riN{=+a`CbkP8eVLuNb_b9aL2c)V4Ugcy~3LV$I|LngqTx# z9*@Op1m1nwQ+xA3D*l@ZA9`l1Qi%5Ty|M6+Vas6UY>7B-jMJ!LW;{dNu5TbDv36qP z>ZQx+csj3ln;_G9Ezz`rf)dG&sI`DNS6A%x!d9zi;>jdtxg^8hgZC^4#P=Ita9Or|-7584Jcv&*tAVznLm-hjf9_=dyV(kej8 zYD)%!y|OUvfyd37EU=B|JA%TV#>B%$3v3A$)|h~XFlFLqat_BO$$yo!h;Sf9#oFH6 zWH<+izS&`mcWLr$@OE8FDB#v{RNXFJP05b4t%aR7c_~8b1fWv!YB=`$y|+7+Jy5C4 z%da~f_EX$%?1x8j5N$8DZoV!<5?@~}#kR6X)!Fg7+3SwtE{Z zjRsKJS!(;N<;!t-75GMU6_~daPMxX@sy_hIJQ1j>&xtJnXCdM1TmcK+_74<0Y_JbS zB0)Aw`5iBDPbFPTIaty@Uqoz09BvU-XtqF6ghzEDnYxn&@thIJ=0rT@=3gc98P6j~ zBt-#ZI2Z{4q$+^G9K@|UfV00Y#X3!@sox00!?7vnW%}#jz2OFnn7=q>P`$R4i{tfX zUlzCxvomd{oz;@I;LdyY)0r_F0(oFJ@aFA3!Ygj(Yn4of|r==_)!tGZ;W;oCTYAwqAxUm`j>!k}1G(#|(sW#^gofny)#EhADE z*qp}lmO&m22JkwDXKiBvdSM+3@eu&v_* z`_9gq_EGzr?Wj1NZYdm$gs(W1j*shB>U}$Rgh={IzHv4}H7RHdDS>JcA@Gi%q^z{U z;~YK@#NogSM+mCZ7-PB=l4RA*BG0Z!fNC%Vn=;;3HB;z(mO|oKbjP7wN*xAO#G8L)39q8;1kRF<485*A1tn^OpwjOiV<5Rp)?yP^DMa;!+~T0am!~ zqrTGwc2|+Wk_a>D+d%=%VI))k%Avru2fI+ztRfs+#`_LIJMUu_JKntsyKK9&dr<{h z<)km`W{zy8n&jeYQQobzIS&^ z4e#5+9D=v<(P_@(R%XU>#G)s?^Q-y8>TVM%0#;TV!%)3FDZ1vou=`f_BX}H15 zp-r$YM} zrs8Sgo`=dDcy%`4mT#*jZHeYkv`gZc_uFA-1C&#K$s zoJ!1X!)g%h6vKJLNrGV;L0uA=idR?Z@j4AdI+t^r9A}Enc{||*$%h~7J4@G`40BuA z!gf6!Yy!eN->!swfoTtjH1X7A7k*$_tCpIbzqq(-Sb-r@2l>9R&KV!XoW1Q7_HGBT zeNP?u-K`SNb~ZWA%ZV6}M%)7Uc5#Hey7X!#pK>hXB{rW~k24-?s@}|Fs4A5n$@#58G!43ESG-eL`@T^pknXU1rTx!S&{NM6)#v) zVzmGp2C#yvotG)Wzw5{u=$jm-cv>-P z>u1D2_G^Jm3tl7Jw#yMbK#(tHy>@F>ihI$AaV{k@N4K=ik-mi8$xGm|Y^TZIBJk@l zFWZ$lehSbiDHoi;WcyrJ9d~2a(xB>iCVSlRtXAt;O0qbwR>wXE4pvpfDlB{XtKD@l%~3>Syc_rP^SNWzAtKK01UxH9uhJg$pjjwyLau{J2TS5 zeYuDGT7|@xtvbu6yeFG0qiiABwvWiwlAz#Uh`#J0JA`InU4t0u0w%DDeD&!?wy2(wK+}1LKj1uAK>d$&q2F#PM z&O($78urp~ABRJNeCc)&(qzyioH+b%V!z8K$y$R%i8SYCr!2N2oo#GHR%PQxhdmLeglNk)1hvQn=b^nKz#~EM8cnv`%F|Y=NttE)((n-Ah2R<2 zyb}neMk(9be2mAOWUs;f0=Q%YY4|jC*DlHV<Cf9qwU_az@VS^kpQUNvK zA=!zzC~;SmN6*5PeOA)mSeys`pANe=+ceYGiVfVd>C0)!f{@k{zGGCNY#U6Tmf$gL zq3V=3{&5`DygR#B0Gm;IA2MCJ7h0`{CuY*~UEI1>yS(ug9BOq;GuFXQmosHEJG3^( zYVm9Zmqddxf|(^4l@HQ-B%gASL`A0{i3_8#Ws&HaweN0QBkdCoJgN$P z65dZy&@Kumk?n?`*~w1gU9j1hM`@v0PAtdRv319lSG&QbSF(59Nl}Xkhi&sxOF3`^ z;!zQP6sfWWDpiC*nbtWIXkB8AeUM@qy?*kRvAMufKyqz) zPlu|ytc25fATXS)jPL59>ngiNPL+K(!U*fQ=gX>}EtWV#whr0$rp~ui^d5TKGdxSZ zci4&#(ook^sK$%V#U>IUEB|8xs|f!c;#eHK_ zO5S-u>7eXVr|M*2aRRByG$)7D7=Br-dO51G)Bv=^MzAg!iK}8Ody+i7Rym?9#FHs+ zT`~@7mPizxKd#B%26d@{OF1eVyh^XT4q0WpJj)5_o!UuSNNV4PE{p+XwVsqN>1UQ| z6Aw9=vmxsVTv?i2)AB;e)B$vxY}+6dpYwVum7}JM?6A%jDk)9OWs?XD6(3^Xb$l}b zK$3aM6xQkV(C}=V6|**P_*qp_r9(VzP;;yVRLPe)w1+ikDO*GP}=sL-Lci zQTVkSWW`J&CX0d!p0+UAETJD+$@+2k$qL&v|2zNp|32XVjt?jgEj_?^`}3(f0sYJ{Nm}|&z`QIeCwyJ-rp^E z%k;N*w{Jf_z1G&h`m^8P`olkY^=p4lcX$8NTmH}ah?n53Rqx{cXH{ zOE13T<z5@5}vj`S9-c;jyw* z<>|Tk5o5W=uclkRm0P`WhqsUY(I>b2+kd}(dV9FNyFK2X#&X{N{`P!(xxL;#+eV|9)H*Idq< z)z_zgc)ShU)>&j(@Xp6(thtBZ{Pmag}(i>Jv`jMf4P70%U(Zu`Y^WnZ=coMMsm4+_k#I$ zc4#UeUfGYs@cTpi?Dl4f?^1bY8S^un7fYg5S8eg-<^B)-`or57KYj5>yJ2zfc=Gw-tznk9I z{?qhn`{5H$^&8*#Zu|KD@yjs$=Xae~?|$)@zxt~m{>2wD_@_^gKl#=#+Q%QJZ~TXk ze)+BM)Tcat_gl-i=Rd#u+I#MJapzONrz^+uzK=uy^SfWSdiVWS?$-4VxOq+AxclCh zyYTLtzxu_m|Kv~q^v{0#if_5gpMUuie$$|K_aFJoZ`#At`*)h-H~#Iv_{-MrUO#Df z{r;ideedTV{mqYm_M^LR{^)1Fy8BUkY|rW8?xPR+;lAAcILw6ACKVf{qqy=c*oE9u#cWzUSG=d{rlHDzV)N;|M2ZPUq4B&emC3i_2urV^UnIj z#^sjA&-fUA`kL+^U+!MpXRm%&Zg=(m<^4nYobTqt-m_o5j1M}R-(JC=-90yUY}MNM z7(Uz8`R#q){m$K|_wOG*AHV%H-u2Zr+`qoGhyLwpS^3WL%6DT{pgKPP$B+H#ZkgX+ zuOHrj`Lo}MR#>2KYBPVrMWp)l`0)9iHh%lr(<@(j_sxIXQ~vfJ?;-yY9`PUL0sm1R z@4xTie*GE!&L;l%?&q(6^bd)QKTGd0fHwzohlhE(`^lX?259?F-k#pwKYacNe&OqH z{B?V~$baT@e*BtPjPDSJ+ui)_`R&E~mml7L*6K(1ujP}wo*r1K@%pdCiaLCr=vd6V zZ!PouwV(a#kN0)wo`w?K_>le>M8kc_i!+!VeT_5r6U;p~^_gvT)xAN1c`qe-D zjPHK;>9f24@hx`Xx7Kjp9eiP2mjC$&zHNNW^4ov^G=U~QyZc*id0xhifARmn{ny`p z?PGrMSe~l3^2=A^4(9dM3;y^GZM}{i&kcY1?_ubzeI}2R5*z&pA=^=U#mfSU$}8v9 z%NT#&bFm_{%%L0(HOafWZ`R!GcbtxHKll}$iwX)fj2^P67Ry$KAalOXOPPgp?zPDR zJ0t=fOi-MD%KbW&q){7PD%SNXiznu_u7}42(g($L?c)<1m(9DPGr9FDGtJO#v94)5 z{%+HkqXfM9=pM`f`}hz(#Um!0RN~A-kaO1=}r}d9Oo~4?tPi}vb1edSL3oDb~#YieXuB!6VO?%}YxE^mFA)FqZw8Z!-f z?=tMGSw6;$F&g_n97$EY6T@4aTXNDS&QSrLI7F1KaMmmK%|@DZ%ITO-tW1J)yA$p2 z*z+~_d>v8skhn?rxNav4J=t>`BcH42s4T6kHDhk|)LPW(ZKqR?wH?j*@|1_HMdH7b zRbWWcd!;(pVDrEr=j)OYrIb{v<&hpTd5sh9>?wQdAv*vTL$EPp3MpOJv8rH;<(!hh zpN=HVD#u&YEpZ9e%5W?)S>|j%{haKOK3dq7n%Hc!uvtyLi*vP`;gDFLN6nvCadszI zp4~QfPm*Lm7qx^{U7DPR%fZ$hjCzUAeeB1z4taV94x5Mg?4+cU@*AI(!{EmphL%p4 z%3(b_ho*_Iqs3fN7YCbc|HlSY{KNouZlfqXb4b&#zPg>j`!qy?)uQPASQZ}CcI~rz zfZM*Um2IrJ_3q%oaw&6SpNL}-p{`2ygozy^g}tZqr&HK<*?9_%W`}KEi`|9tAS;-g zJmXQ*7N0RB49dRm6Bc|N%B*`JCSB7JeIOE3&r7nUOKk-SaxV5r4U%Ac9Dp;p@Eh0U zX}{coPLwvs^W%O6hcO#}Q_k1NmRS|{R2jtnYqTSltJ6`mX_a(No{;AJwB1X)Jn4#E z?UxPlNzJI0{h>m^EHkUxTWubkO5k2uti|upu^*n@iF!ecCC-LXTIeRR!w9j_fX(~ zFXqLzpeR#%u{U_%R~w~sKCU>0&Cbfyic)!JIB}`h%uj6DnU76&P@>hQPI`;Veam*f zN;kRlw68qL9^qNA1pPKhA93X&s*x9EFWpyp+B0jc2Lrrdm~Ifkjk!jC->GGReDoDN8ql2EZKN zd{F~y(5ADS@i-xELGji3BBV@s8TXQMIr1!AVbG+BPOdcs2>@(#Pm=A~)O0yzg-cyz z$(2cWl2-Q`ybHjip@V??Q1xcV2-$gH-x zr?jqPxl|wZ$T;P?Nwvu4Qy|ZFm^RxU&GRPiPhcVSXvZX~ns$eZhdWTD)q@R`WyMQ_ zpL7mYIZ_$?PYT}tg?n8}e9rEF{{G?>}mV&p#+F0kXsc9e^NTCT~lL20u>boPJS2om!# zNdKG$+3dl*mLB941(h9qiM`z6lz-BJj>+Tps@`EGZYw6c06mUAG{WtVc2Ibh+&_C|<-N*| zzt?qkmL)hirJ_}-N;cWHCjWxeqeozwBVP>GC0Gv51nKjEx}t8ubRQSC?A(E*R85Y) zNJzE)awkg5Un=7Pcu*6t1EKcZM4RbGHkJUr#Bb7S%f% z$QGYqC}-K(OiA|_XIE*H2tBd_Js)i2+N$zlGl5(7MV_8L80;O)>Ts^v6Zz>(j@2y( zfpNPWCE-Z{%T{}Y6y!N={z!bmEKrvfb1u%2E0I}wbQ4R2uK`pGzHD+*_NF>rIXisY z3cim$CBJo$!v@#7N{Q0(*cEI#CE)u?QlR+MCf7-E@}w`}QonL7vYYY|EyO|jLIm9H zV3>#G6F_vjvg+xFQ?Rk*LDuO^f9!$h72Nvg>PV6@D|T!dr!R+GJKo_?v*c2e!_H}S zdk@={i0f6*scf|kL`l8fsyqiDt>khl?2cw%@>!>q4QhujSCrS#FH$DL8>TQJoI!C%1`I5>>g6Nleia1R#r2e4CDYq1qsxpnv(2_jD&ZR zwJ0|jWrCL8;#5Y%c7~Po~go-H>4e_K;rcz5Dn&XY1u#2u+1cUi|? z0~rii#77MSS17C3jtx|%RK28M~ z4G8Z`uFbEngx(USd36}q;nWNNOG?!7ttLv-Gg+RaVCK-jWpvIaVO?qB}Hi-#7*4}^8VPzkZqnzrd+ikhn7Asc{)>G|s z>`>}3QlI^tlKOL5pF~1Gj1yQ|t4%sfGozLqM1kh32;za) zCs@-FO_p=twh2rlGoQno`V5tp!IDntN%{8H1ET{a^Q)WMZ}XC zpi4O-;Sp<#xi(WZ_CJ`x&dw^E14**IVUqQqMi>&DiJVJ~GaIgDC*tlw?vi*8?${*z z_pAzIV#x@axG2JQx2s=3D?pk#@S>B0tqigaz?dI?Q0EAjwlyIoaW)G*05|=0J2PT(#B7tZJq=O+g_D+ zP(amt-Nkg+Wsomn-<+fXW?eXQwTzZo)7sUp@xE{v>}GJ^E`7FSfaatC4p6w`t5#?( z+l}jP2FG5pEfW;9VMv%>%DbKMW&|WQo5SL}TToV~GMYef6MPYuNxnLRSox&Qc6hcs zhJ=R(6!)fbn|xI~fo^H0E>1-57xym73O=WqNR#&BQabr@bQE#gX8i4Z;e!v5+Pd3< zsyG&_xH?aIs+UU~-C69YK!-etQ5hOs;I`n>c3F?+>I64XS;E&`KqqmC8K&;=)|#EY zFOEaUR5Uq$N%8i@$Ry`V#^WAj>c?>b%x0-ev;39?XAf37m3#+4tsn>mR>&iq2*GQ$ zge9_T6tAo%(flK_UY7(`_=iO<12W}ZJz$b{b+vegQZ64#oL90oi$9I$OwP+yB$Ix8 zw&G?IJ;vPCsJ&#J*;F6|h$Zn}tG4gLV}ifWl&6#=7{_&<2_)#+MmySw$jz}nRt4m!MvAn7 zv{bv8Scq}mbY6^r4kr(zQ2sDn((BoZodsV|A2 zwI`TIqV!psmBid+LX(1?Co7j`*e{YU^+x~>#lcTy2tcR!W1ioMgBbO(Lxj6q|GGx0 zx2x5t-l4il7*domD#mL=zmfpBGKYxey2>n}K{FlWQ_b6_q3mP80wl11s*%|_(39zE?h$@+j~`-DxZ1n>O~%7bx&mc8 zTOLGAiAQD(vT7NXGHsA(aRD3bNf(M~7QS~{ zB+*cWXb`w8c28PC!8l`-(@REawaVC9r{LsJQ`bI9X{v0+wB5Ar7OuNh7Dc{+h=9YS z%vVqXK1h&wv;&+lTe+7z-pTG`PJpZ^<2k{{($zT+S#0U1763$3ZmrldUu6k-k2)vR0xV|5v5RI1iNq&$fUfRD+QynJj(-9Dq?LqD#fm zIL=&-K?%98GBa1Q`b$Y+%YY93UE#0`z8)7a``nZ=^t58SR;f1zk%8LSq&|oBJ2pX) zC~fe%%hG)u1&fj>8y8-KGljWGDIOfH$Bzn{HnD}eywZIe&e~$Fw7B`PMt6KVOi;O^ zBh=ZPds;#@OOrdj$R!%(_;<9IJSv&qwnOqwb*vqAjwFMjD%eCIRkUNO_zJ?cL(gV| z(s8XaEUM=TG$#81pKt-G>}`$8Q}ENGuHJ#sgnb$kH!>*`Mj}r=*Ja+Eipn+Z)$z~8 z0|Ibvm0w@BO>MoaLPHWpwFv;i>D?8mZo!0C@@;Z;!N@w0mSdmBz_o88HGP{Ha{%a1Oi7NAwW3HO>u=nV3EJZ%2l~R1t+8|2 zy(osp3(kGWgx+eBa9!~Vw&*(H>-AjD2zRpVa`_?VNeUJ#df%kF?K1X~ci`Vh0C9_T z?UKOnY9L#v$H5gx1y|+WBnbdo95`8D^3XKQt$O*VFa%S>Sa24cD8>kyk_rOhRO?3tUTy)5%_2F$cyO09 zhJ~lwV>t%n`(n=PdnI!k8L!k^%4b<&0EJ9EX-DuJyCuu` zmk&-kozMnF`aV#>Wc?iw#o`fljv*?@W~r@vSfh|d$3RHjFGbMQDz5nYH(KN%iQ%-V zm_(X!g7dLN(nxdbbCB~3eOhu_?T}q6_MuykvGHKIH`^=LsX5xM%uX;gYs+2kSz^iYJA{=#X)+0)=% z%sfeRvYwUDc{=>fbrP4NB+tr{R7-)WI#MWeCb3yMOYAF2uYIj^k)K~qb~*GVGxZ#6 zA;u|HX-N}=w@7E^M6x`TL0NHp%%Kz&I8>XvBIJRDkbG5@S1FDi zGTvuU_!?HJoq!WP^giu{ouONWzhKo-SDxlOkWX$_B*-%$nB?4304aAr4J77idG7HM5c zZOqtJ5wUGYrhP$uI&cfiDW|Av2pH28bvcHU&dS-8P#w|pyMcaS$wL`H`DemDXwRE; zAEw2|A&`?t=a|1}^pt)AFNWP(-;T~2vplVy$6;vCaySB-iCY9YNe8&;b#R6RPb;%z zK-C#=XYUqVT4P-$C``KO#l&?SM@pe`DT-qnc1`3GAr0+zPeC1MEXp*g>byp!ax61~ zk(Kb{%S44)adRyXfSjjQmIa>bUYyKSReRp08sHrUh=u%1iG;3hdi5#Go>863Cn+Kz zOeVFf1dvLlDU#9lFjVyvhql*Cs#EaIX@P9;Q}Ws154H3Zl%A^R?&nr54*;)^!*Th} zo+d4;>2lg{mVtPaPZJlSQm>qsT<)bx^ILN z*M?M03VW_Vku`HjaVx1`;7(Fk8pyJIly2_=3d@6)s-+Xsdy7^!T2!7;nk12tSu>iE zOQ?c>l1YZ(!a6C@vRY>H3`Q}!m51MFdy`7HsJ2XpomXM7@^k;u<}WPI3cWNVq{f)i(HWfgK_tB}_wpmo^9V)#@ptc_AokiHi@z|zly>S+TR zZ`km(pMsvCOq87bYMrkY)MaYG zlUT??#4U0y;8n;PTA12p*UHf5y=I>v`xG}i$2S@)X&0kR`Mb$@uwo1_iqc`Ki5im> zK$j|8`0ybyFJ&zG09#Wgb09)JGQN@wYSS<6vN(kzPt_?y?>a@*%RNZp;RC7&W7*m% zS<^BmvdKT|e8|qQN#6`CA-(`4xGG#oJ|~-E4v*7iyk(`L?Q@ARN&-@k?pY~!wMcMd z=SpNPK>oOm?ZBQd5ARoxvZdnY9@&e!&V3(^mmqMbt}Oy)wVhY2*GfD9GDHHKLI9KO zK^Lwk8($hvNO&q^2a9fvS~{vhhJ7ls6FjyrfG*YOS%^enSud7UU0aLK_-ppb1>Pm6 zkdaxzM|S;HWW?A?1NNq6vsBNsjdL!O6;YKr*-$02D+237+C{!>_NJ;mk+^#Tlfp5Y zG_&E~F=ZK)=IH<}c{!Kk%TYgOP@4f6I0m-=sXkkjxW-|3;MyAYGvNfmhC>G$7bgh` zyJ_j8T#P+S`lV!{tPNPL1=~}_cuVlIyC{Q~Z8hZ^xdo-|E?bt!WHKNM-)2vXzkodv zRq@b->@J0B46KX-Wox|_`7?0qs+tn=@tNaDFt(vHqi%dqz8bX9iEYv`XB8+Xty#i-K|1!Z58YX_xAs^n$ynwJZUDudR3 z$^^c0k~*&HLMfk>tdZj-K}gqO2Ur)CdMG7Q&vN3}Pdwvzdb3AU5p5O5cTBtsRxhQ~ z*7@`<1ykIilE@zLMGv{~Oj2KL4)>GxiT9#xGQe$~bG%5246qlE4j)eHz6V>h=fmRt zVH+_~OC~s5c8E;-LAIl=NS3!wH4YMK9D`+^CP(|4+n|cHp$tbz^dg-nc`XEz5~g$Z zm~ovAjrb6DLFz*!FFPG~uZRou0422}%7$$@I-Ad4B--TAAp0vEYhDzC1p>vntDK?qfUt8N z8n@tIY*|AZBy5&Xqf#IqD1xT|d>cs*`vTMRxUd$5-3~cpJwQ{>bWqxmJFBu(1raPd zm##l&;kVV@DCft%&$5-3b;TQPs&qzcoa;GQh7?I0R92^Z@xs@TR@nJw`lbSg{87gy z*MrQYl~Aif96_axvQ7h`T(-gQo;I%_xojf>zGSH9p7Mo|&jv{all`fn1m(r0EmXFP zG;NYq+ZqiUY+gJrwL7BWQL-HX!S)e$TeYUDKtq?Qt!+A3F~k+5*Ef~m7Dl5iF+~Nb zRfTU%14~va39FSQ_o_;80>g>!I3v>bkSDBSWO`L821OjDeoPXI?4Ayo!;?7L@pz8Y z&tt=>kthqH$P;Yp>JoHdcdLA&t17$K?8)}(!L{w&o-AVh(vOhA0Xjgfty;jwWlna- z@Z52!(pZFLmfDB7D-*I6c`G=PUA?lNJkv#mJxdmwHA?PevgmI&bX1oKtid)`+NH{z zD0E_3SCy3x+b?+ZgR*Q>i6rw`gm)5C;@z=3g<)^SX+1}oAELR%0DK*Guo>(~k1v}^ zE@hh)c}>!uC~4enx@6Ct9*wW|#1ZreYU~CRM|>$TZv;y+3;XUtY9uAr4C@5033hGS z8%&5NPM?C}E-}o^UXM||qbj!`H$gIid-JaLw2y3HsN$=8 zP1p~4l(rcv>@tlim8sZsm4V(u{!A7K{<{>9U)H$}Nokc7d%mWbV7MvhS=H#2 zoPH!}^VK`gBCaRNk<+HIO9^+Me z&9Dn%?#edA0g?V2koQgUdU;=;L=P@ut3J+`tk6h9Mv9H^h<;f&Q zLs1OyM?zt`Mq*wzQbRpF{u?A>H=qLr6|XF9wLLi%zmL`IdiaUuvZohZoK6W+R|)@c zB)h^}9f(8Nt_q+XisyN-u*;~mvNBe%^OV7cJ7Dlo+->-3k=#tv%2z7Aep_napg_E<0eKVv`Y^DIq732#~XC+g-gG9wV1Cnnq)iOGr3ApG4=A z{5E9$h4TSm6jcgsGSl-*nL0RDEpPB_s^!X)=qShj&W%s3)xpj5?qexwRI_ z$I69oy%Jto65?PZJg$AW2?(bznd=M+j+X4~WQW;fmBOJF(AmG;B_aLd?aJT=K9cLm9c z6k+q2%dqTxlev!iAa>hKvquFgU!<&X)Cd50`2p__;%zh)$vglFC`q%69QbyJJF=jh zH#dlD(h+PbPIjLIo@kt@I-qC4K!xuXM_CoSi>hy(MpvG9n^=A+9Wh*7pn{D?$pxp! zM`BCrNq{V610`8G=E!3pK+8$GItgNQUY#E+z)tsRuB3N7cLa zNghBRv_RsruE81#m>l1YnSrqFIXtzC)7-3kBq^0GHbByB|C(aKPMeXO3+KbsXL32^ zXBHcS?V<7@XSY&-3#@jm#(DT?B`?;?;kmi`(NasbHVs_q!JkQ==ia0mpkHzpAfMD^ z3b2sF6}hy*Pvf8iM+?-mg|Gv%RHo&LH=7a<>Dlr2rZ}w{YllB9#O4@D3dl_rUYqUv z_e_SY4X4G&d7MhjY@?E*3=EqC$9W0ZYA=#v8+Z@TPY4c&diG5XjY@EJ;1Z7+PRC5T z{jPXOmYA#pzrV>DpHj*^zQwvQK9PJqJH5BD@jNo^YGygT6~#zqfNK*WW6c_F%Q3s0 z5zGbl!3xP^K~kQNu^VS0rqs<f{ zJXtBSxG5(fn8CX?v57ldEgWZm_p|<#}#V18T|WaB#sva%=!s!Vazq zzF${oQyi8g6$4dlWV8Tt46xXV=b+tX*X{)%<;EPM63TYF1MLIHNjm&TzCZ?O!;7LA zM|RJV_2A)&N0#1fR>m&Xu=ANV`<0iVmf|)z#Oq=+ZXFT-@&Fd=%1TRdH)Oz}E)MXJ zJDr_Sn$Et?6SqFA1xgl{B{n37mxFD#(sZh;laxg1QtmnHhl9s2dpC zm_*1MM-(9i#d#j5B@_UbGt7YvX>#OvhOB=nfL|o!Rp`O94p3tr-3}z*HYlCNJYZh9 z&O>g|CZle&(~GD-OYFQj$!rVNV9!h`Q+S5E;6dxyA09Us2 z3g}_q_mE{EE^{3^;wRoub)MOpvbx(DvucwJnnX1mAj$f%9hQ%}vV=tF%MLl`maS@m zSNH*Vc~$?e0#LYgd?G0Iuu6_?x-Ey=hogWpF5^X0+MNZt$ouAC;?0vdSb;?qxs@B8 zb~(U>TwpQ@k0r9+*%?-z$?$REDjYXwdQ88#SVHjy2Jlc#S$B2{kLpy4!A_`=Iy>f= zt6kJ_J(lWuMV#54%EfLn_|KMKnhmm|_1$3#LbB%0DbmC!u9L zWJ(6NhBzra~am{jl2Rtz2Xlp)nz>Hv4QN6Np)9-b(x&HY4QOR z+5uoB%{U4hS=rxQO|t{kW2M70B61N`lvJ?>4zuUiZR+lsRZ{rTL*4D=bu3XKhGWBn zEb0btAv)Qvyv$?x(> ztocimyztq3$PxmOhy_o(98Uq#uqBQ_h`KDx;Fcyk|Fa5MX)uPb>*{Es4SF7Po(|L( z-LPGcQ6dSlY-|cNguf#1pZpTGr2^6zmt&CGgJR%@V_FWZ#S)VBW!ikWeu%E$~iz-}T8hc1aH`yr% ztd}TlHV=9Q?rX;miHWRLV^&*ck%rc@DTToKmEwLS|8(kUu0y>HYi{_MNyc`-WhGu_ z5N>i3FIcm+v@3(Nit@Y(+)diOtJS!-E`#xS7)M-^XPfu{bU=&0>^hX8&dG*~V^eb{uv_gMzJPFtwaZxsZ6`r(n6Km7aht8F zOiNmAEo|;nFUn`^y2Tw}j@xlWgRDkrGvE@4d9as+F`us#p=V(@S0a(U*0z!KO@x|d zJ!#G}5#DzdVkCQx=a8MhJpTjtDO|Ct9CJGUqWaXdsv;>z1nHmT^&rD&ON|vIH3W&b zmo?QEB_`gua-tUAcrW&&k~f;{j5)fl*v(w6mF+BnN84lUS}ijfRZ=_zLuXUgJbM;O zFtw(t&WdSQ_v9RlA^6w?>$&QDIKa(TRHv@l%;D*l9h-0R#Zjm$Av;mDXD3!b_e!iD z4!x<;WfkdE6DrIbk0KCEq^t1o&EekNMRcZl-#6A{R*3u@V-OYOhw4-Pzw+E^*Zq z7n$B2GrIbLA+4;G^x%T?rt%Ki0SUAsO?-LcsvP^Yg>b2Zx?Tzv?3zrhT+8I>wY>tH z!e}azU1TWTV`*YqR2^f(c0o(3so5sjnrCX2JdmhMU{R87mT+9LhzFu zxZkpborkc@eRBoK^LP}*Jy|6t)r*qTuLLS`CL3A3itfnjb*g&O@nwt0Hcg#N8|}#0 zW?2?6;bZb}&LW0WRHscT*lQtiQc^kLAMxrVQ0r~%jti0~kbD;~vwgmkLBIh)$Jo|# zURL>&6*-`4myAZ9>><6epZ0Fc8Xr|8A@K(0^Ayfi@_)p4H}RV-R&7GhMt(Wmb_- zon{Aa)+|BK4gjf&-1b$0+{&hOx{GuHr?W+w;QQd}S5zYt#CxmrBs;@yeJ1;P5y-Dz zibBKnQY}T2s}V<&&u`ho11ncc0@Jrme}2Kg{0poYPT9xx~(P z+3o6|s!uR;nWP2BI@JES--#4!Rt!!VHLSj1<0(1|!^17k4BBrkyZkviw46&j)J$$3 zbts~INs7S+cb|=u|Dux7=_t&VoW_`KrYDsgZ6stSCc=cEdGsS*q`pL!Xp1$@Pf$SU zYc2ym-2A57%-pU`_NT6E7N=(kNqC2O=;RUE;$Q<fnSKzvi8IPh8{yH`TtEWOMpr z61Y?e`8`T#)rkq|&Pb;`G9jeMngUuO0c5+90uk(14+Yl4R1Z5F2fYA_oQIZ4TiSHl zkEiB%bi`#n@rw5P+wRY021gk#31)DXtLl$rP=NL^aV1&U0?68fgeZmI-h7yID%n0R zlE?*+ON#0dg&o!&-pGaFtd(atS9LcIp&?fO>Rz2f1}rTP%dYL+mTAz8#B;J@5HEtt z#_>`qd9fcq=2`!S2Ipo-T)pE&JqW9p1*B<4A%vy07bV+A~-3{W`!G7G6zlWb_mYu zu5L~*ltd2i`3A7_7;59P&nP&2_Am+bJ+`;R8}?=cL{MeK(K2pzNm9ExL{A#C+b$w^ zPu;9FT^_1VVe5`OU1OlqmV36gOj-bHl4w9h*vE7SkkvCjiDZVP3)ZsQJU^+up*luC zgu#35yIS$`Oj(~}Y zS1-jFwNV_A_N2EW@dV@G4(sah6)^UY)=Hi|`*LR)XslnCp^)b+9-n*RYj+PH&SNHP zBi73=V!=4`#X~G545dsidbOXxIk%_^u~ZeMDUS|Zu;X~!@+2UvgOfVda-VlHJ4;$8}mx zXIq22L}_daJKM$xD1Lh#YU`|+odDn|2m9=JwG1@|AS~-8Sq*?raup~*3PuVFZ0iOO z;yBxXG?B`3fg`w98+Gs!veIOntz`;zG3~#|?XZi`2BF}{bhNx_dBbsVQhsZ9a!Hx1 zpCKHR?t?JcJgBr%xeSHf(a3fwHCiO$EUGLQu`Mg4hSlo)hvU=76s$#WgLV}_h!KoN zSsM*U*0jvQnL&5ACx6-2Gsz7c=ig64^(0jRDJM8EcrS@`5`-VObdY$F4IZm0A@`}m z!V5SPWuZOq#S4^PFs zgv2J17pbwTN0)Qtkv+8;>Q?1>32n_{fyd3uo2ZYd{!SpOmclVsQ0{Tw`xSl7V@ zco5!;BToKLHY*G-sAtI5!__&41d8FMi>K{Yn=QV|Gf-qdBk#wQiEQZt6IEGHW}ugc z64((&p`JX^M^YjyLPuDYm%P+_R68+{|I8B)e&o31hI+=l;0_WoP|{UFYFeEq4@Aq_ z2Hg+{K1zbO+x%z^Ws}h>MAFVxQb_{Vc7k{v#kJwxflkopVO8{4_%HeM(zP=1da{j# zC%{9=B3Dl&+YnbIqRy*Y$Z;V-8G>xvZlRf!{*aKw-oJWsWs{SA9)>7tYD=SL-qo$s8cq;vhP*^4T? z$s*u7x*RQDS>?sW;eOd5#fiE}ab=NPNw)NlR=+md){o%9D2o{KRyNh`u%AVj&MrBD zWT$$Zp7H=Ij-jHx36R_F2%6=C!^zWTDuU;>2TBRo*%&cY&piHQ-%W=D#IciA9!_0{ z9b62)--%t;QJw2tM4Bp(l>oW}k|wOM_0?m&IDy-^J)8j+XdBoU1GD)UO+w_PW+T$i z0J7|6z{PD>R7fotcIK(_>>Yea;3LJ;R6zI4<&x#G4(b)TNHz)EilIv8qfi&49=Sdk ziL5mO0cOv!395im;hSt3LktiEi%Ahsx~H;$4B26W*dpH`*s_{+!&*a%nlSICD5u>r~m^ z8my$=e56CJ(WXCk*%6047C|o*!8e z+2RGr3Jzdl^d!Rvn;yrme0cN_h8!_AfuS7ktLQyjCH4{9KeUtJ0ddsTvsq@d*?qmD|DpX9{48h&zDq;&R( z+=KkI%IZUwD|vh63JgS1Qs1M>*u{I&>amF=9MO(ZyQ8Cgc}_@d+}|#hp^2#)nUk~D z=k6>NUiVzX8#k-%zCfbOgC=`ryM)_TpOh;P#u`=O-5HaW{u}`|*?@(0D?aQXMmn?H zMBrzf%z0Q~c5ZIDHtV%`ol00H<>4*~9+$)rTefA4CzjieA0``IMhE~sFJKk9+N822 z?=Id(mEEX1J#fq<{GgVKcLOstn~gADr#LSsC#6Z9<*8>&?t|o2Aw-aglvPtyZ(SqoA zD(t}xh-(3QnBS8-6Gg#rEQsU_=>5G*<&cy(SVb8_)~yZw=!Mb_sU7l;sjU zR%MklPgU9==PE^|Zd%EM2Xh~{aGH}Hp2vh8jAbhkTO;kDANlR2zviLg(h>CVh@w^c(5sOb)`SDW*-BZzW5g4<0E6`ec9#Fy z-Xt!};ln2QIqgHT?|vCmU)+GI?c)@B-q^O=r2DHXTc2clpq|5)5L=fVBO~8hWM%dE z6hw7Z(pF&oI0$a0Yge1{Vxt?WN|SKV<=P$cp8<=DmAth%%U*1*D2}oxLHt1CWCq-h zEtd0XP1Amw>S63**JTN8><`%IGKIl@%k>%tAPtfI4kRCHy*H`zCWkT)?sX-VCbu-J4H$!CZ_!qHwT+`%z-lWi!=YR| z$pwk>Qb1@^*0&7?f=CWL520z|%bVOspY0SPhnCT?%W2!IHDdC&K-!g)BbsX_$8QQ5 z@W@BMjs#7fcyK4OU*OjU+0Se*`);p=sk>EAKWegrFGyU>yFmTp@Y2a(l6a-Rc^0g7 zaWL#~7+gD(=_pHn<_~~4>hTQj09m%JyKL(r+amveD1UDdrpA#Kl=u ztT=|+Lz8|VE3#=su9{6gwq@{5E-TpF!nCwTCwmcBfukLV4M0Pk3#rXqRM*L#soJ!~ zspKJ3obVw=dW=VumR?7zkwkRjE9PC^ zib6JOmu_#ibP_ggzIT9N-PlZ)_5j@5n775H6QHXHR)^X9ZY_N$FyQ@`T}0!y9Js2m zH!s;Sh=FY#ZLn4Z`A~cHrA6C}n3EAp>Xhz74@z!0 zwyPkIQcq%@o)+ovoeo$qmvD;X@g^O3(9^U_78aESIHf3*n_G?sz`!|(BS$yN4`yGHB*=IK8&ga@ai+2Wd zVg=Zx9_Dx}!ucrAW0szv22@Av%$b%YO%l&`=X1e?OWmbsTP1dY)WF?lrH@UpZztv?e`G!*ge46-WcuYL1w82!;WjPSd61}UP?kXsn&P| zvot4@g%l4Gc^VhH(gE{0QU8+s>N)1)H&(G0F zgPWZDDu=6cYl8zKJ0g}R3xKPl^|t684k$RSPeOQE$U4G??H22oJbNV{yecVsopF>n zY8pq(wE+;F4FSExhoXjS#1(%!8Sz_|& zEIui;O$B7b-3HMKZ@k&83#?TLXeVJw>^M6XueOa@eEd{AOxS{x9^G@!#nVjtSHK6+ zOWvg09sR7S3^uU5;VBK{QQG&CZL7nHU8*k(KLtABv7EaaRc&(y)nh7~jAXZq`D}rA ztgDTT^4kvY5K5_<}Y<8%W{WPE* z5`sA+l{_^bNJE<=~Z zV!&=tJn4UOh&Y06F3VMRrQ@pPHaQfkuy4ED@^O&USvDYH#VjoJb|<^0sC*HwTKc=- zDTI?tS9hudKVuKWY(GE&wig)^aAyDpm2f2PIn#tal27o{^N>sF1co&11S~CI8F|AY zDkn&7E56RY$D#y~ELBP%#fj$;ox^2Wo3!pm5;mNp+Iwq`rYfU_AuOH}R6f7p*zJ(t z_LEH~RtCwzf)RelDZ&5akG;=x~IS5X(E`Yaa zr++ucC1Z#(0IF=D{@G>0jYLci#Uk&?>6CGb(<0@8L->-JF7^(}z7X-6gyhR!EAra& zz^FV3p9j&PJLV7H~L#VZcHbg2QV>;n?14th`G-%Ro;lY~)%6z`F)Tbe3Ze2z@zLRptG33_V^|vY!|yr)N}n zGixXkMd1<^RO3nxS=DU*o|UDrt$H17YnHu?(LIgqJ$T|;Oqo?E2~y*c-3*H5g`}N; zV5mKTsYxZ4Rc;XF#LO!3g_EpmJg`Qh5yk-V6^G7I9P(OnGF5Br9!Kz)aXZ3RJUymu zriWYSe>j4GkMq>{MRTjap7B;U8`=tNUK@o4baFtNAV<&b5R)_Vi|KfFV z`ZoRWd^`aUm{0@kD-y9yLoNbVmIRP+ctgRsqu?3aDM+`5v@{2oB%8cECg=Kg zQc)?My7hsiL}0BJ)1^m=?w}0}i5a-8R~(%>i^u8d3r0Rb$6>~z&I;f<0;=OGLa5T! z>|^SdG)L7VmSyOf9c~ihSFAYq%VJrb8h+jWgECzD7Nw^eRFCprkp-FP%!dS=rg23{ z&2pYuVi=%Hk5k|y2bCGQ&=vTZLt=}~Qvi!V40z+-#~*fk`0ISihT@b+007{Xdk=&A zW|8%gtCfDGTE)14M1&$a0#(ddS;tvE6LO^uC<|t5Vu4A-g4eZ2b~fc1R4_@71nEJg zHR|$9taybydrp(p*HSkNLs*Y>VwZQjqVhF5OuM6<7?p(?apF3NSXG(}W5n^gWDF() z0qsQ+%rZ%gvRiDi*$S|Q-`X4jU#&+rB{gCI#qy{}&to3KYcaCA9$0$veHretxJ@pn z!_HJ3tKpC*N3Lyhu-gA`aNJhUyoM5NSsmJ1YUr@z;JX2C*`>s zkWv9CwcM(VeZb7s@w{`L933XR-{NISYPQLtE4ZWU!7x=&QM6b^#9dlIoW^k(-K#}x z7IB=uCd)bsfdH7SW-gu>EY9mF?d7>Pu&ClKaRx!A^C&g=_Yj#y{M zra>j-7p2MxLv$s6kb#yA*BwF4wSuEBLbBm7fkm11+y9 z`7>F>QUN(!85m&|w+zr`6&5EX3&I%ZvqUb(IeDRHm}Kj#n{}Pc1MRAHw)sj}>h9Bb zwsm(%N7+PE6*-qI2B>3f@gDP^#ihrj>3A}^txJ-)XlZ+rprzYt^}>hLcjxH^Bzi9uX^*Ya7m4Jt#^f{*30=P5a2{2TAc(x z?2MPINus|%WCuKvTQsR9PMLCzwTcK3OxbBR>jc|hY%e4^+`0HXiaAbBo$?I<_LA+I z#!?)M+uvy%%kY-{suN}oNbb(rCGndFk<9@E;LzDHS9|0!N43{1xPWgvd)ZSf#ncC1 zfSoXQkR>%dEh^g}CaL~VR=28osi8_DTqSN;^pmp`F}!R`Fgs#0TL9DBl*fN?Xhc0{ zFL5-|#V;0U9Dyi<^t?E6Dko4{Hu=38i)cYJlJD?5ogF;FZbumKdB^Pm676?qn{-yf za*^|xjtnWd=otN!)O!Q|7hB-eO{s*qGdgc|j5(7b`H-b=^{^PoMFI{ckB+3^(WkBJ zT(XB%t1YGF5Xw51i{TmHNPg=zsFM=GmP+Z0HUT_s-jCZB z6b-B%HxQ)p1qs|>_nX^%mF7kHgy2lFeAxK2#c_Tdf_>ulpcW0r`bkp))4nManW4J5 zShzgdT54FzyX+()uI{>={m`y<{vj`3#S@G{*Il|RED}=`s>_B57&T`~<6zLUeL#r* zi%`ftT|-;V_81E$XV`Uz5*?EQ+KyzV3e=LpaUCZyl60KWdK-RJMFu^oJ0>a90kpv? zb171{HJP7y)+=^7S-LVwnQ?So0AeTgK5poX&bm`R3lNBO;5-~pXPwY5l0L|0+Ut;- zC*5!MHzc)ixpq8Aw^}xDp#QWgMSRJQWoJyVB)1u%!iiT_RPn?LLzUK%2ch1)jqW@| z;3gm+kAZnOKy7lgAD-r$ZfvB8lU)l0jS7@r9bkT=Gwq~IxM$LR{K4!7TB;Hvn_A!Q z?oRR^%6=@93|$iONN}V+)i#R+NqkoazRMi5e&8I(juQW@RZCOJM}wUE#A>MBxsjD# z3NT6OAP2O}+i4F{blH%4%pS!!_J}_)Y3UX;Ls=$;+BZ<6L>Fq6d9E)fzH~^rNpx<0 zNj6WC5*-k?mLLfn?vV@{0v2qGPnaA92jlW|0YzDfj%;iZ*m8_z-QxR=BAUugQ z63CgNCQy)P&V)=ZyG7P4vSdHiF$13sTh_5JOsab*i%!( z=;ARbost2wv%oy03?_60#7L4iX)8*MNVDyHy4>D7c8<&E!Qui53IzQ15D1!W0+J)Z z@zm`R%qNHH?M^xm7urT=k)Z0GqrSVygt{*ZD3L0Y0j?5gEF_RTs&n6tX#-HOJ&L$T zX+$#SL=r5f(Ou$5SwHS^5Yn_TPGxs)zF17eAxyT%9_o!KIIVyR>r^}p0phZ+v zr)J~7JyYgMvq!PTZn}-fc(FUkR=QFz7Pfc!I(!%;v(7S`rc1$TWuOkxrsFgs^rVg> zKJifdli!rD*coOFB9@w~2ouZeGadzhQsTM}iCtUnNxhfhb4mMJ=sc|Mv~*WZlT>0S zwKyf;I%=_>X9#sv?fMj}tKFNg%ad)KuLCv`@L%ZsEYtwU4?Vd60lJ*tY~Q&1_~l@0v9?&yXcAQHj3qt913mMq3;BVb(JI`tnyH2JKa3`k~6oq%RXE7a_H(eTNNJ^oYOHcHf3xUW8{%hc|@8y1*vBT zGThm$UOGuK=YQw_{@(}u-|+$Ep{3{7r+4Z3)9D-E_`zfSMSFSr@Lbw-`{8n4|82gz z{o*fw^;bXqi$DF@{k#0(<)=@NKl#=#+Q%R6mb+#8+q>JhAD>=p>tFrZ?{EF#pS=3D zKc~C9f9Wm%=X}J=d(ir=eO4aQyW8J?czSI$KinQayvyzR<^JQxTYY+XNYA(Tjb(j& zy`^{j?Ik_dw>LlEfBea-pYuLFx5tOpU*G;VUcaRm-|_P4?ft`tms@#y_b%N&`TYGS z?a|M>f2y~ahxGD^zyFWz`RVrb*lw@?@N|3q@#S1)dwIQo8o!xdZ{N9n_x8Qp_isPA z{qXi9U;9tDAK(7s_LsMx+(hB zoXV%|b=+mIS*r5%-28~KT;o^ME#Jzm-nhft$NuP( z+x_jo-#)!P+}_Ix&4DLeRli&_K)M++80;w{PwTk`R3RA zhuZ$nvC}W@ZQRe7|9HEd{DD_rZ|$+V#{X+B=gsQt(?2}khHY!D5BHBB-#W{x(cC`A zQv1Wx^SxG9zOg{Z{^zn0g|H&5%_LZfL@5t$;eRXNS_m8)4|LQ{D z{@ETL?%%)MzxZXZpFDjS+x)lB>TM&rT)%t4d^MT@Ym}-_u+Sa`8m%nd});{N?*PB$%n^})ANUS59!0}?dfCu!>6~Bp5Gor zd-uDx@xR%$zw?8y{`&M>J1%K>sDH&L{N&Az{QQeQe&FxFV>f?z_*Z_wmoKG%{@qnu ze0jP5L%;s;_Qg+M{LyY$+&i9pet7wpzWwi}_qG2tecFEb#8dsoH@@3GzJL5O2LJh8 z=heIa{KJoa`JaCJMF9TA)4QKNU2ie?$FJ#O`o@3w=$GI6PJPPbBfhnKd;asgKm67^ zezx-+-_x;Uhu_D&|M}goTfO^!D|hR9w_MjXedF$XU+&4fZ~p2Rzy6ay{nJ1D?JK_J zE`R>zPxwtk+}(fVFTZIIPw(GpoZtAj|KcxOyL}wm-Z(t(evHI+du9Ko9o_Nd-*n>^_`cybocVUm3w{- zPu1T0qd&W2Z@#UXmlUtjK?I`6DcY-4U|{EUy`r?2V$@#XHdefH{i z<#t!^U*12Y&-rdX>^-~J%lM$%`Rx__+1+zv|5j~}kKwajo!{Q)-S6CedjJ06^YPnH z<6U1}!~N?^d+6VumX+@;uY5N~2EgOUY4Nw8J-zakci;TCJ>_rz@gDLY;Sv8)9`GOK@&5ZB?$@8u?`-0K?|%OJNB@vG z`Lpy6192~+6W&ig6_VWG95AQ!~^`raO^2uFK4=mnz{a1oXBLWY3tS`Sb&tLo5Uw?96 zK7I6Q>~B8;O?>?xcy8kkZvS5$^V^$0!YW?>`t$eg?u&2w^-rJbSO4&%zWd#$&+h)m zx0d6&`__8SY(}=@wQm3O4}9(Tpyjv!{%Hbte0KM@^S9@Dx#PcI{{L_P^><(Um>)cr zr>Y(O@|6gM>3#KrKYqhyufrQ~=U@JNY=YK4Yh`kz#aY(i0dA79`MORIN-R(vD&*~! zLguiHvyuIrlRU^nsUps)O@{@4^-dJ)y;45rUQ(CTK5wPj=q({v-KF~Us8cB!NzfhG zJj!}bxsSS_;)PCX*=ylA$WrTi_?FAD>X2P}@&66xtBcsC}BZJ%uC8yQQq9 zIEnAX;?av#I_k6pK4p%r%LFTJ=XrSX%eHR)IPIrB2bqse_zSmdCnrn3=GngZX2+bJ zv1dQVtk6}?p>gNTk%PzEv{=-U%i^-ydD>N~N>q;Xxi}CnNtVnd(pE2Ft6RytT4Ytu zCi=GqunpW$-dtVB{pKsojtHD;OGW!8w;K6# zp7YYA;5<@MXZ7m#6WVKfZOLAVy&g7+Z7aX%n8Yfv-*))e4hL42rjA&f?PXV!5Nb6 zkl3K-(PJjLMVBLCnUxTa8w+x-r!r#B&1}PRY<~;8GeAL$J9y+dc_7RuNJE#yVee)i z;^^{=i%sEBdwr9y_Ryha4+_;H;)@6!^hdGBG;9RdWhO28C%?fc} zk^+`vKsBr9HO{)zSk98pO;J$k8cub6 zs)w6}{XHvmlRXx{4mN{rzAmF2W*Y{xO!JtLu6O|ZTFP?N1Lv}+%^+jNS;=N>W=u+W z65N_MzDTK5rYYX!b;lub=2~;J(QK;DSOiznXmPHPn+R8rf`=w;?dBkmU zX3^1)cq$yfZ%T04d4V;vDOZce4kvb*qw6UTT~Iu?v1iA?1syLRY1EOKq*TJyA3ryF+c33K!~Tz0Rx+tG+E*wWeTFZYtv6TK=n z(MMM!tA;O>qEI5GRh`i4Oqcsy_Nzs9oH9gtYpqR*356Z`20v<-O`J!)P55Y*c-}J) z8S6Q7m)GRDJWeQsDSW$@MHPW8F}p|J#W|(@EOwHYNrs_ zuSckZWHzjabk}E0n=O}vAZ6XBp~kW}g;L+zqDsN}?DnSa4hQj!ag#OKMB~AwBH)Fn z5i@=(lrSBelyv=YL^baFrVz)LI#ybM`g>GgJ;lLYh_YUCL?$2v!eZD-w_YQ$aksd6rM71w1SGZ&cS zZVRy|d9h7%dYh4O_JdvV)2?_Gfndq*1|9~z4m4n2YTTpfjk~4>0MlFwhe%Vn>;rH z;VKQ}$wdPQ2wSr%T-+C*K3_PLG+0aK`EXc#b{HC1lQE&h158r##Lf*!^~Gjf9Ql+_ zuSs>Zw8=g(K$E&RN0xFZESsI+_6~R48%~`VarH}1UVC)i=8Ho>a|Ms|Nl{fkTDh#S zsGHo9D>a50FCIX(%{X=SA7zUxjoS~{<*MY}HM@vglKXRsSq0~7Z>m3^u1n%!Z-Zmj z-E=vW#IwRFt-F+7T{W9)IvfXxK*BlhgM&#LC-t@MWS{L=lC+TD0PCENvJSSN=*p>@ z9H$tt)x*gyj7!kc*l_h153tpqiP?6+s>Gr*>TO1k#d<|wZ z1oXnHOee46f|&tju$5w$uyHxu=v4r2{Csflk~ z3fo=Yprlf~Gs&Rb#oki383?0kz7pIMU)U72*kF+H*U@xM%usgVspbjLM!OuJrr-syC z?Q%x2fctgfP#hu3@&YQgBK4It+X^~lNklKzF0xI(!093Xx$ly^dJ3vCgAMwdy;W7s z8*m7>K+KRI!tmUWI2aYr#h$LFXaGhgC9bslp2;g{zJj9HA|1R;z`^?k`&G;!&4koL z#VIMBY?1)dpF#t`@S?xp=Sflsx%GI;xQ;_E>5A#?f=jpT7Niy;{5XYn3`Y5~&T@qH zEDzUY>Qfa6KAho9i?kaHNdsZk^VzkC;|c%vY6dA-!9QwiCK(sjeoTQhNddw`fuyt- z`y&puzc(4gRA+QR3#6=MuEhJ*sk0uOAm`SvY2COib?K4>L;)xdZdp~gz9iC@*%;3c z0^^%D8yO^nT!OOWi&SWnqX2}`GqhbfuKgHY7_Kv+3LK^O54XFPB0a%jH-~yahtwX9 zt528ucE>6c0(*jVLdu6+#+?z+?U4q)DC%Y|99EIj%CQ zTpP)t+IIFT5!J|qSlAM6C=`gU4L=8@nKl`UC6F_1?hb0r4lK^xlYAD39#5@8{5-3E zR6IXk2?y42w{=^mA{`|ljmMa)H?~MO0xpmYJD33PO`2Fc_(+&T>zL{$0F)7PA@$u< zPy;yN9=e*?Sdd+j%>ia|70|J}0(e8>gQ@WNcD|AYJu{&$O#1+1Tb8D3mu85^mB5x} za~RJt1|p*Ot1hGy^vax*R5_&vR+yZ)B$aU>z>bJhqBFUYvJ=Dep?(Ee;VLt@b3OnY z_-uK!Q?+5Z+5VQD%y&{E8;VNy4Ryct?&*DB$D$>?S468Lb5&hE%7l1@8%m$kFq zTT;|vzEq1RzMY_NfW>kaIkWvp!UV1@TsxUZA^X{7kWZ7rFJ-mGY!`ldRIz!1mk(?tBZMRMB`k>~U zRM4|c&^)58llZQdROHBGWhOiW8$>Z*pt2iSb%F2*rz%r5WPzI$>R1UVtd~OR!s0 zWzAOkA~yfA4B;7m!+uS6F94UdBiPGq#tYlDvDJq#brX24)}9JrzN-R`d&2c>QZ10& zn51lqAzuZ*W2+ZyxlBWo1b`}ufy`nc!agSKPh|)|7R^{E`*)LX!inKs+SijbWSw$RnI~o?!SF;wBy)X} zENg_0at(pHstxwIj0CWeR};XU0CF_^Q3`tLaDZapky>FYMA8 z%znxtYQ+wScGsNMlT1TB;y4_u5>W&(hvEdQGrl|~1q!1xy5+R|wAuTAIx^68>=JX! zQ;O9mM-o<sPZrkK_>co8P$4W#~4LvF$3Wr-t2Qja3x#n0@(C{}w_$5e^KSJtzE zm&+xDoa|v<*W-=5ugromIYLapH~e1>P9jM@Sr^cq4WzQkSm`+NYbo#n!RnA=nND_| zQX>G`Okl{QyMuO8#14wqEG>q^RJdM}stEYVlZ|U5a$EA+)lLg+-j%e~sgg@4n4ERT z%M>ym0WvqJcw>wj`ozO>94c1A(x9Z$qr3l|{+5G%Js0~Mx6>VUG)X;Xb9g13Pn_yd z1H#S|c))3q!saT17*e3xV|+UnXjaEGN% zRTp@#T9U*O@RS&BeZfqO;na!vmPLSkMELqGoO+4Eu zmm;x+Y|<`AlK5Tq?m>)-Zzhc({Uf1qE)6W39otlD+OkEMvY7Wu#`2;9o*C!~wz8wx zs*jW6O^)r;g1ody-Mq*iZSsK=n5US1!axG{vD<@vHdVKeLyQ7mnM-yOUEQq6Q?d{{ z<9e-xS*@SKS+p?8hiwE0q1h0p z(!!U#H(i<&A9DMFyTvhbjLcRyltsZ8A3mY550c&HAj&zdP6M;ER;gpL zv>g|S_r~8iQzGT#;DRkx4)E0p1HKUKlP*U_)!M|%J3ny<#)t;Qv)lU~ zl`)^+=mE*v8~}1qgqR;zPdES!#1eK`V)^@}x2)DK~Q^fGAildIEH*(8zu6 zfhg|mnYfJjRuur9gQ?VRmveNQ1lz}l%x4M8BfmR5rm`1=5}MV6iY!)5XTAzDA;iL79!SjJ>`z^4F6fThtI5MCW% zAcHW@Ns%AY*PvL!zD*Sm%pQn*uoJikup}28`J6zK;C>uRGTX&v)LC9#BFaz$j)T_Q zl!wfTT{j=Vx{HS^)rIIXC zJnO1djS`!ZJQeG`F-{}bY&MLCb!P`*B_3jNx5v;=wP?(WrD~aYU9HpuLQcSxE$(@q z*eb3T06@t;#lp12T1YPF z)>J$)Ms(g$CpHRuwT=#ONnaII_qdD%^T5E!r_W0rwAB$q8J0K8HC&2bX^-=SuaNdt zDpgOib{vhIrPeIf@5Wyanf0=IW=N=69ky_cfTU)|A}7!RE*4-S2gOD*6IH_?+2v23 z23LVS5V}d|W-B$-5n?XAt@YBEIRKJ?SH_{Y$PR|Jq1>hn6P0iRVf|6MP8q+ zI1Wx$!s32r;{|BokXANLYC#m9oSfGi(PGP%U1UL))oaO$Ns}Al-uV*t1zRymc$c%> zPq;KZ#3{cD0VG&NDl-<8rLpENtVUvcOGaf?n#&LozG7o3EeN9x8bxQC5sy(Ohw zu{Nm)Sw(;|0NjnavdPabWC9N1apts+7$!NMe0-bZe{pF16j`e4qOwRIC$!yzQ&sXr zHir*FRd9UrhWX37iW>oz@h$TiuX#}e`c&y$;SZHU)QZ6r@i?+9;(;Ce%LP!OaNBXp z3(x!B$WZVqG6|oxJ5A&9Jotwgw(e@$$OnQo<3o9_eaMkVMcF(w8%Ior{ZnC>Fz0!* zI7-^kE>;k~Dbf3i>5$U|(no=Yg7>*ja?*iIwksawlPXNBLEMxV_i(%KgBeWpz zp`)0FwcH4uC!sj;Y!?kv{n|2-7VK&Zjas?$jU@Qwd1U5F`;pMec1Rvj4dARNxWqud zNe0=4ICaHy*Q3ZkY0-J*(pVPx#K(|738FNQz)pNaRZ!lTJ##y&lbO38AX}-B%2Qya zvZa$&K?!5AFih^Yu%f#e9Vx&=n=2Qviya?WfFZw>1!@oFvOn(;Z)Qqx!`vF%6$zz!ACkKXz$|C;p2-m2D_* zd`PlnZ$OV=V5353rA{}lhHPYJAj6Hu*d1;^GV&t?OIXrUfM!p20XedGh$4()d(552>S`(W46fp78f(&`>Lz`YBE{ub`Hghh zayX8VJbbjdT!%q>S1x&fkA9`5Cl6x3WF7zNYZ-pc3Owhq0H@mky-*I^G$mLCha1Z@ z+(t+!4<|)SBZGhnl@@S%Y&sq;hH-K|mjY2T`O4Ux(KJh5#8}8%as5L$b}|+{;zsch zi$0bd#fmlKca4;N1VbCmr@(u~1J!}sF^ZsLNxHxf#tCO|!+Tn<8Y4~~hz5-o^8QWx ze2+5{i6A_)%4c<&cun^O@m=K@%0AJgb%4RO5}Is!4x^^2A%lL?oqYAF%_^8KLNm>7 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

q%S)B3~dhaYdY*w?m;L!QqtMSL(0-w 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 z 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�FIP$V^am^br!_q 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
QZa3`0cq+75%SNemG^9D(;T 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 +endobj +8 0 obj +(\376\377\000M\000a\000i\000n\000\040\000P\000a\000g\000e) +endobj +9 0 obj +<< /S /GoTo /D (section.2) >> +endobj +12 0 obj +(\376\377\000G\000N\000U\000\040\000G\000e\000n\000e\000r\000a\000l\000\040\000P\000u\000b\000l\000i\000c\000\040\000L\000i\000c\000e\000n\000s\000e) +endobj +13 0 obj +<< /S /GoTo /D (section.3) >> +endobj +16 0 obj +(\376\377\000G\000N\000U\000\040\000F\000r\000e\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n\000\040\000L\000i\000c\000e\000n\000s\000e) +endobj +17 0 obj +<< /S /GoTo /D (section.4) >> +endobj +20 0 obj +(\376\377\000M\000o\000d\000u\000l\000e\000\040\000I\000n\000d\000e\000x) +endobj +21 0 obj +<< /S /GoTo /D (subsection.4.1) >> +endobj +24 0 obj +(\376\377\000M\000o\000d\000u\000l\000e\000s) +endobj +25 0 obj +<< /S /GoTo /D (section.5) >> +endobj +28 0 obj +(\376\377\000N\000a\000m\000e\000s\000p\000a\000c\000e\000\040\000I\000n\000d\000e\000x) +endobj +29 0 obj +<< /S /GoTo /D (subsection.5.1) >> +endobj +32 0 obj +(\376\377\000N\000a\000m\000e\000s\000p\000a\000c\000e\000\040\000L\000i\000s\000t) +endobj +33 0 obj +<< /S /GoTo /D (section.6) >> +endobj +36 0 obj +(\376\377\000C\000l\000a\000s\000s\000\040\000I\000n\000d\000e\000x) +endobj +37 0 obj +<< /S /GoTo /D (subsection.6.1) >> +endobj +40 0 obj +(\376\377\000C\000l\000a\000s\000s\000\040\000H\000i\000e\000r\000a\000r\000c\000h\000y) +endobj +41 0 obj +<< /S /GoTo /D (section.7) >> +endobj +44 0 obj +(\376\377\000C\000l\000a\000s\000s\000\040\000I\000n\000d\000e\000x) +endobj +45 0 obj +<< /S /GoTo /D (subsection.7.1) >> +endobj +48 0 obj +(\376\377\000C\000l\000a\000s\000s\000\040\000L\000i\000s\000t) +endobj +49 0 obj +<< /S /GoTo /D (section.8) >> +endobj +52 0 obj +(\376\377\000M\000o\000d\000u\000l\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) +endobj +53 0 obj +<< /S /GoTo /D (subsection.8.1) >> +endobj +56 0 obj +(\376\377\000J\000a\000v\000a\000\040\000L\000a\000n\000g\000u\000a\000g\000e\000\040\000I\000n\000t\000e\000r\000f\000a\000c\000e) +endobj +57 0 obj +<< /S /GoTo /D (section.9) >> +endobj +60 0 obj +(\376\377\000N\000a\000m\000e\000s\000p\000a\000c\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) +endobj +61 0 obj +<< /S /GoTo /D (subsection.9.1) >> +endobj +64 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000\040\000N\000a\000m\000e\000s\000p\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +65 0 obj +<< /S /GoTo /D (section.10) >> +endobj +68 0 obj +(\376\377\000C\000l\000a\000s\000s\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) +endobj +69 0 obj +<< /S /GoTo /D (subsection.10.1) >> +endobj +72 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000B\000y\000\137\000R\000e\000f\000e\000r\000e\000n\000c\000e\000<\000\040\000T\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +73 0 obj +<< /S /GoTo /D (subsection.10.2) >> +endobj +76 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000C\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000o\000n\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +77 0 obj +<< /S /GoTo /D (subsection.10.3) >> +endobj +80 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000C\000o\000e\000f\000f\000i\000c\000i\000e\000n\000t\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +81 0 obj +<< /S /GoTo /D (subsection.10.4) >> +endobj +84 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000C\000o\000n\000g\000r\000u\000e\000n\000c\000e\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +85 0 obj +<< /S /GoTo /D (subsection.10.5) >> +endobj +88 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000C\000o\000n\000g\000r\000u\000e\000n\000c\000e\000\137\000S\000y\000s\000t\000e\000m\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +89 0 obj +<< /S /GoTo /D (subsection.10.6) >> +endobj +92 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +93 0 obj +<< /S /GoTo /D (subsection.10.7) >> +endobj +96 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000C\000o\000n\000s\000t\000r\000a\000i\000n\000t\000\137\000S\000y\000s\000t\000e\000m\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +97 0 obj +<< /S /GoTo /D (subsection.10.8) >> +endobj +100 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000D\000o\000m\000a\000i\000n\000\137\000E\000r\000r\000o\000r\000\137\000E\000x\000c\000e\000p\000t\000i\000o\000n\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +101 0 obj +<< /S /GoTo /D (subsection.10.9) >> +endobj +104 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000G\000e\000n\000e\000r\000a\000t\000o\000r\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +105 0 obj +<< /S /GoTo /D (subsection.10.10) >> +endobj +108 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000G\000e\000n\000e\000r\000a\000t\000o\000r\000\137\000S\000y\000s\000t\000e\000m\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +109 0 obj +<< /S /GoTo /D (subsection.10.11) >> +endobj +112 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000G\000r\000i\000d\000\137\000G\000e\000n\000e\000r\000a\000t\000o\000r\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +113 0 obj +<< /S /GoTo /D (subsection.10.12) >> +endobj +116 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000G\000r\000i\000d\000\137\000G\000e\000n\000e\000r\000a\000t\000o\000r\000\137\000S\000y\000s\000t\000e\000m\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +117 0 obj +<< /S /GoTo /D (subsection.10.13) >> +endobj +120 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000I\000n\000v\000a\000l\000i\000d\000\137\000A\000r\000g\000u\000m\000e\000n\000t\000\137\000E\000x\000c\000e\000p\000t\000i\000o\000n\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +121 0 obj +<< /S /GoTo /D (subsection.10.14) >> +endobj +124 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000I\000O\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +125 0 obj +<< /S /GoTo /D (subsection.10.15) >> +endobj +128 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000L\000e\000n\000g\000t\000h\000\137\000E\000r\000r\000o\000r\000\137\000E\000x\000c\000e\000p\000t\000i\000o\000n\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +129 0 obj +<< /S /GoTo /D (subsection.10.16) >> +endobj +132 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000L\000i\000n\000e\000a\000r\000\137\000E\000x\000p\000r\000e\000s\000s\000i\000o\000n\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +133 0 obj +<< /S /GoTo /D (subsection.10.17) >> +endobj +136 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000L\000i\000n\000e\000a\000r\000\137\000E\000x\000p\000r\000e\000s\000s\000i\000o\000n\000\137\000C\000o\000e\000f\000f\000i\000c\000i\000e\000n\000t\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +137 0 obj +<< /S /GoTo /D (subsection.10.18) >> +endobj +140 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000L\000i\000n\000e\000a\000r\000\137\000E\000x\000p\000r\000e\000s\000s\000i\000o\000n\000\137\000D\000i\000f\000f\000e\000r\000e\000n\000c\000e\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +141 0 obj +<< /S /GoTo /D (subsection.10.19) >> +endobj +144 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000L\000i\000n\000e\000a\000r\000\137\000E\000x\000p\000r\000e\000s\000s\000i\000o\000n\000\137\000S\000u\000m\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +145 0 obj +<< /S /GoTo /D (subsection.10.20) >> +endobj +148 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000L\000i\000n\000e\000a\000r\000\137\000E\000x\000p\000r\000e\000s\000s\000i\000o\000n\000\137\000T\000i\000m\000e\000s\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +149 0 obj +<< /S /GoTo /D (subsection.10.21) >> +endobj +152 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000L\000i\000n\000e\000a\000r\000\137\000E\000x\000p\000r\000e\000s\000s\000i\000o\000n\000\137\000U\000n\000a\000r\000y\000\137\000M\000i\000n\000u\000s\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +153 0 obj +<< /S /GoTo /D (subsection.10.22) >> +endobj +156 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000L\000i\000n\000e\000a\000r\000\137\000E\000x\000p\000r\000e\000s\000s\000i\000o\000n\000\137\000V\000a\000r\000i\000a\000b\000l\000e\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +157 0 obj +<< /S /GoTo /D (subsection.10.23) >> +endobj +160 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000L\000o\000g\000i\000c\000\137\000E\000r\000r\000o\000r\000\137\000E\000x\000c\000e\000p\000t\000i\000o\000n\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +161 0 obj +<< /S /GoTo /D (subsection.10.24) >> +endobj +164 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000M\000I\000P\000\137\000P\000r\000o\000b\000l\000e\000m\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +165 0 obj +<< /S /GoTo /D (subsection.10.25) >> +endobj +168 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000O\000v\000e\000r\000f\000l\000o\000w\000\137\000E\000r\000r\000o\000r\000\137\000E\000x\000c\000e\000p\000t\000i\000o\000n\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +169 0 obj +<< /S /GoTo /D (subsection.10.26) >> +endobj +172 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000P\000a\000i\000r\000<\000\040\000K\000,\000\040\000V\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +173 0 obj +<< /S /GoTo /D (subsection.10.27) >> +endobj +176 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000P\000a\000r\000m\000a\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000L\000i\000b\000r\000a\000r\000y\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +177 0 obj +<< /S /GoTo /D (subsection.10.28) >> +endobj +180 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000P\000a\000r\000t\000i\000a\000l\000\137\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000I\000n\000t\000e\000r\000f\000a\000c\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +181 0 obj +<< /S /GoTo /D (subsection.10.29) >> +endobj +184 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000P\000o\000i\000n\000t\000s\000e\000t\000\137\000P\000o\000w\000e\000r\000s\000e\000t\000\137\000C\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000o\000n\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +185 0 obj +<< /S /GoTo /D (subsection.10.30) >> +endobj +188 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000P\000o\000i\000n\000t\000s\000e\000t\000\137\000P\000o\000w\000e\000r\000s\000e\000t\000\137\000C\000\137\000P\000o\000l\000y\000h\000e\000d\000r\000o\000n\000\137\000I\000t\000e\000r\000a\000t\000o\000r\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +189 0 obj +<< /S /GoTo /D (subsection.10.31) >> +endobj +192 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000P\000o\000l\000y\000\137\000C\000o\000n\000\137\000R\000e\000l\000a\000t\000i\000o\000n\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +193 0 obj +<< /S /GoTo /D (subsection.10.32) >> +endobj +196 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000P\000o\000l\000y\000\137\000G\000e\000n\000\137\000R\000e\000l\000a\000t\000i\000o\000n\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +197 0 obj +<< /S /GoTo /D (subsection.10.33) >> +endobj +200 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000P\000o\000l\000y\000h\000e\000d\000r\000o\000n\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +201 0 obj +<< /S /GoTo /D (subsection.10.34) >> +endobj +204 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000V\000a\000r\000i\000a\000b\000l\000e\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +205 0 obj +<< /S /GoTo /D (subsection.10.35) >> +endobj +208 0 obj +(\376\377\000p\000a\000r\000m\000a\000\137\000p\000o\000l\000y\000h\000e\000d\000r\000a\000\137\000l\000i\000b\000r\000a\000r\000y\000:\000:\000V\000a\000r\000i\000a\000b\000l\000e\000s\000\137\000S\000e\000t\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) +endobj +209 0 obj +<< /S /GoTo /D [210 0 R /Fit ] >> +endobj +212 0 obj << +/Length 1152 +/Filter /FlateDecode +>> +stream +xÚÅVIwÛ6¾ëWðÒWò=@‚K{‰â%µk÷¹–ÜCÓ ’ØpQ@(Žüë;à@›M»½õD,3óÍ|³€Ô[xÔû8¢¯|?LGï.õXJ8±7{,Ï MS/Éáœ{Óï“?]ª ä‚ú·¾ÔµtÛ¶Ú,ՃvÛër¦¥ÞŸ§WËHšÆ^ÈÉY†f®dÀ©ÿ-à`ÃiÈf±– gý²1JÏF}Y¨ÞJN3g%E+÷Ò?BøjÝÈf-++þî‚GQ!x ¥$˸—;å¿(Pô8ìQA¨H*#,[iA¿Ù•îʶA> endobj +213 0 obj << +/D [210 0 R /XYZ 90 757.935 null] +>> endobj +214 0 obj << +/D [210 0 R /XYZ 90 733.028 null] +>> endobj +211 0 obj << +/Font << /F50 215 0 R /F23 216 0 R /F37 217 0 R /F38 218 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +245 0 obj << +/Length 1725 +/Filter /FlateDecode +>> +stream +xÚíYßoÛ6~÷_¡·I@­ÔïîeIæ´î\dz E[ŠMÇBeɓä¥ùïw§#e[±Û$-ŠíÉ#yGÞ}ߑ”˜qc0ãEçlÚ9¹ð#²#_øÆtaDÌ|n{‚Ó¹ñÖ<¿N{ÃéÄz?}e¸‚ف™uW‚²NoÚù§ÃAÆ ^Ïö;pY]@ƒÅMš`¨iŒVrÏ>Þ×ìê¨JÛêºÇSêjPU+Âh£”À•”"Gš'Xf³t3ŸØ}’µèRÒ~©°Hª”¢…Žr.†§¸Q©f\»¹ӑb÷¡Å4´Ú1Õî¶#Ž!0ÀKªÔ´€rQ›qœÈ,wÁvB€b¾¡Q³8£J!ﱕUT6,twX¸Ó¯YÖ*½"Í:W±ÎeÛ>bVd&‹8=äúra†![ Á͸$á.Y@\“Ä_" Q!€I-²`ßÉP•@B£h‘t:$'ð >¾›6"F¹¤˜T㊆BXŠC9(_ãZ0ïbøÜm>ÁXª|‚ò¥-î -°cK lÕဒ*´{QZKM‹zagŽ»%6¶DÀ± NzÑöƧƒƒ±¿:ôÏ%úç½á¤÷8J7"J7$¢ƒ`ásՙQ'… Ë|-µ¨ ªHr›¤)Õ®ÕèM)›ô™’jjüݟ¾¼¼šÒ°Óá%µ8Œ9O‡Ó7V$jD¹”~s=Ub–¥`f‡Ü£ 1Z­Ó„àš +ÇxØޑ„ 虯{ãó—`ЊgýAúF (¨¼èO‡½ÉD5.ÇT9¥b„Ë<[>3§ýó«Á©ê]G—“žM6&R­Iñ¯á&ÿiÊÓuC“|'÷Ս˜n +©o0Uœ¤åÁ k‹V²^奺ýlÖÝ*ï§UO’ÕNâ-uR~ÊŨL*ù| Ûò~‚{¬·s{ä³Cæ Éö"µŸeU­ŸŸœÜÞÞÚúâ—¾“õ:=Ù³S߉¹k;®/PY·ÑæD¶ˆ}!…ûWV•GHÙºXƒkE`GŽ +äÎ3_Çú0Õ@»iR.mÆ#}çæÇ2@WD+^Ðp¡¬<&ûù Ç¢Ô±ÊöÍ9ms…ÅCóÑ'3t!øùCíºÚ™ù|“*c}8@<a¼’å:žÇÈ[x¶¸Žx08´µê ñh´ì à¨l›óï'"¾#|…ó4.Ëï“*ü;F_&ˆ‹ÙÒÂ+gîÏ,ñ=1< ѓ0¡rDp‡òC ‚ŸçÇלÑ7Hxà‚±›i_`¢0ðMÁžpˆ¨¤6y㈾)œÄÙͯŠ +ªðT]Ô·ÇÙ½›Tà ‡`Єâk`¾F| ¡#„)¼§#!j°Æ‡Ó‡µ~3}HwŸK­EåB2»'pÿ×±<=ïD32±“p?9‡Õ÷äíß>äv?|èßý—÷£À Õ_/²=oï3ËãÞɏ˵誔Å/øÏCùáuœmô«?µ>¡3“ٜقþQtP5‘Ç¿ÖOñí…çÛ!oÎ͇?Â÷Å!¤Áö!¼ÿ%¿]°¹íÁûº Ïì€ë/ÍÍ »ÇÿÌJ@Ë +endstream +endobj +244 0 obj << +/Type /Page +/Contents 245 0 R +/Resources 243 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 219 0 R +/Annots [ 220 0 R 221 0 R 222 0 R 223 0 R 248 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R 230 0 R 231 0 R 232 0 R 233 0 R 234 0 R 235 0 R 236 0 R 237 0 R 238 0 R 239 0 R 240 0 R 242 0 R ] +>> endobj +220 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [385.063 672.708 490.947 683.612] +/Subtype/Link/A<> +>> endobj +221 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.426 650.855 322.585 659.702] +/Subtype /Link +/A << /S /GoTo /D (GFDL_GFDL) >> +>> endobj +222 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [231.464 619.218 337.877 630.122] +/Subtype/Link/A<> +>> endobj +223 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [440.112 607.263 513.996 618.167] +/Subtype /Link +/A << /S /GoTo /D (GPL_GPL) >> +>> endobj +248 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 597.365 169.87 606.212] +/Subtype /Link +/A << /S /GoTo /D (GPL_GPL) >> +>> endobj +224 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [219.806 511.177 383.194 521.075] +/Subtype/Link/A<> +>> endobj +225 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 443.46 151.499 454.339] +/Subtype /Link +/A << /S /GoTo /D (section.1) >> +>> endobj +226 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 417.776 229.087 426.752] +/Subtype /Link +/A << /S /GoTo /D (section.2) >> +>> endobj +227 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 390.189 252.131 399.165] +/Subtype /Link +/A << /S /GoTo /D (section.3) >> +>> endobj +228 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 362.602 165.446 371.578] +/Subtype /Link +/A << /S /GoTo /D (section.4) >> +>> endobj +229 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 344.998 163.723 353.844] +/Subtype /Link +/A << /S /GoTo /D (subsection.4.1) >> +>> endobj +230 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 315.488 180.928 326.367] +/Subtype /Link +/A << /S /GoTo /D (section.5) >> +>> endobj +231 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 297.729 192.764 308.633] +/Subtype /Link +/A << /S /GoTo /D (subsection.5.1) >> +>> endobj +232 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 272.179 155.484 281.156] +/Subtype /Link +/A << /S /GoTo /D (section.6) >> +>> endobj +233 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 252.518 192.714 263.422] +/Subtype /Link +/A << /S /GoTo /D (subsection.6.1) >> +>> endobj +234 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 226.968 155.484 235.944] +/Subtype /Link +/A << /S /GoTo /D (section.7) >> +>> endobj +235 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 209.244 168.435 218.21] +/Subtype /Link +/A << /S /GoTo /D (subsection.7.1) >> +>> endobj +236 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 181.757 206.393 190.733] +/Subtype /Link +/A << /S /GoTo /D (section.8) >> +>> endobj +237 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 162.095 225.67 172.999] +/Subtype /Link +/A << /S /GoTo /D (subsection.8.1) >> +>> endobj +238 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 134.642 221.874 145.522] +/Subtype /Link +/A << /S /GoTo /D (section.9) >> +>> endobj +239 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 116.884 321.39 127.788] +/Subtype /Link +/A << /S /GoTo /D (subsection.9.1) >> +>> endobj +240 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 91.334 196.43 100.31] +/Subtype /Link +/A << /S /GoTo /D (section.10) >> +>> endobj +242 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +246 0 obj << +/D [244 0 R /XYZ 90 757.935 null] +>> endobj +250 0 obj << +/D [244 0 R /XYZ 90 463.931 null] +>> endobj +243 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +290 0 obj << +/Length 1243 +/Filter /FlateDecode +>> +stream +xÚ͚]sÚ8†ïùº[{fú¶œÙٙmšd’& hoҎÇ% +ñ,V˜¦ù÷+ƒ $a#KȕÁ²e½ÎÑ9ú@ 8i|è6Zǂ‚Ƃн1‘À º7à:8¼üÜ=úÜí„ß»g€a ŽÍ«³2\Þluÿ6°¹‡ž½Î#QzÃÆõwnÌý3€ %¸Ÿ=5ŒPs€Nã漢2_÷«Š®ªÆq´Ò8ŒŒ¡ ^µA69GÁ8ÕÃ4wêF§É û¡Sýppðá!¹R·J«¼§Ê6·Ž1^­V +(Ló*YÌyöeHØâîš:$äQ´xàO[ ‡ƒt2 ›Ä4úIÃi€ë¦ 4€FBotyö=LPùäöËNM‚9Œ8MAa$-:X:á0iW7Gù\z +±$oK¡Éâ؎£€Ä64èjc2R·!áÁ7„H/SyQŒdøÁøa¢¤.¦¥ÿ2+¦¼¯§3 +µù0"ß'ênF¼6Ÿ¤ó0)Ô°>¦ˆÒ·E±-ÂÎ`Rè4sñ!ÊèNmÄÕT˜»+Eµ19›Š`r'DÖ¢àî#-(>Ž††Cr¤õH'G¿zj\d.¡IFôh^vlÑ|¢r¥Ób¤ëË䘼k'QYc JÎ>"q´?‘$°…„În£a$ރ™lFee>A\¨xÄ\¶å +¦¯+?ÍC†‚ŸeΚ „¿tˆeПMîê3†Æ‰_§š!ÕÌ¢úÒÁò9ßÇp¹¡´>ºWᯣ;Wy¿¸ó²Û‰>V_aØÃj„Ez–«´=Öj2qR!±·³>Š+ˆQ$Ì|‰Œ¶=fÞ—®’?f3Å U#ŠØ¶^ùŽ]õv¦.“ ²?÷˜R䪼RdC5qðø͖s¶(|eE» +ÿ’›‚ä"˧ÒǛ[´ÇüWy_CŒqê,ý1P.¶Í6ïÛµª…‡5[2¼óQ?ëùÇk"È.c•ÇäX’½‹ÓvÒÖ#ÓÃÃw¸’T;—‹ܒ’¶GY^LTaÌ`6Z)]þñۇXn®Ñ#ZQ´©Æä´p]½‹ ·8¯Gt¡Ø¦dð`¦…yr¥©c0‰ö·¾È=V])©âDù¡ÀûC{Xµ£pöU¿Ëõ5îs‚À’­zNIv½;îLz¬åRîl’tTá²¹Ç3µÍ¯Ïd ‘uOd-Î] GTV‡Âx 9¯(wï*K{L´ª¿ Úó¿OR®³4$‹ƒª8ÍûÓ´¯þ7Aù2Qú·ó ê–‹4Ÿ¦ƒùïoˆ£j6²\Y-7ö 1EØ@£¦ªŽZtáÆ?`ñëSyH$\@‰OpÝÅø Õº¿¿‡½ œæÙXìhÇƒÖâÏ@aÌ`´< w»ºÃ‘žµ”ã3äT€¦Im£êŒ]–›‡³þi7›~üw7N6 +endstream +endobj +289 0 obj << +/Type /Page +/Contents 290 0 R +/Resources 288 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 219 0 R +/Annots [ 241 0 R 253 0 R 254 0 R 255 0 R 256 0 R 257 0 R 258 0 R 259 0 R 260 0 R 261 0 R 262 0 R 263 0 R 264 0 R 265 0 R 266 0 R 267 0 R 268 0 R 269 0 R 270 0 R 271 0 R 272 0 R 273 0 R 274 0 R 275 0 R 276 0 R 277 0 R 278 0 R 279 0 R 280 0 R 281 0 R 282 0 R 283 0 R 284 0 R 285 0 R 286 0 R 287 0 R ] +>> endobj +241 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 719.912 386.152 730.816] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.1) >> +>> endobj +253 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 702.288 360.165 713.192] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.2) >> +>> endobj +254 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 684.664 346.625 695.567] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.3) >> +>> endobj +255 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 667.039 350.74 677.943] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.4) >> +>> endobj +256 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 649.415 385.061 660.319] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.5) >> +>> endobj +257 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 631.79 344.114 642.694] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.6) >> +>> endobj +258 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 614.166 378.435 625.07] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.7) >> +>> endobj +259 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 596.542 406.082 607.446] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.8) >> +>> endobj +260 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 578.917 342.431 589.821] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.9) >> +>> endobj +261 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 561.293 376.752 572.197] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.10) >> +>> endobj +262 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 543.669 365.674 554.573] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.11) >> +>> endobj +263 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 526.044 399.994 536.948] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.12) >> +>> endobj +264 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 508.42 420.757 519.324] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.13) >> +>> endobj +265 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 490.795 313.111 501.699] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.14) >> +>> endobj +266 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 473.171 402.207 484.075] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.15) >> +>> endobj +267 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 455.547 377.858 466.451] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.16) >> +>> endobj +268 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 437.922 426.863 448.826] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.17) >> +>> endobj +269 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 420.298 425.18 431.202] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.18) >> +>> endobj +270 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 402.674 401.11 413.578] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.19) >> +>> endobj +271 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 385.049 407.397 395.953] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.20) >> +>> endobj +272 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 367.425 438.181 378.329] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.21) >> +>> endobj +273 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 349.801 416.034 360.704] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.22) >> +>> endobj +274 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 332.176 397.225 343.08] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.23) >> +>> endobj +275 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 314.552 359.058 325.456] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.24) >> +>> endobj +276 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 296.927 411.213 307.831] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.25) >> +>> endobj +277 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 279.303 358.347 290.207] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.26) >> +>> endobj +278 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 261.679 408.144 272.583] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.27) >> +>> endobj +279 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 244.054 382.58 254.958] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.28) >> +>> endobj +280 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 226.43 438.51 237.334] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.29) >> +>> endobj +281 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 208.806 472.811 219.71] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.30) >> +>> endobj +282 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 191.181 381.205 202.085] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.31) >> +>> endobj +283 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 173.557 381.195 184.461] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.32) >> +>> endobj +284 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 155.932 348.538 166.836] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.33) >> +>> endobj +285 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 138.308 335.796 149.212] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.34) >> +>> endobj +286 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 120.684 357.384 131.588] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.35) >> +>> endobj +287 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +288 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F11 291 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +295 0 obj << +/Length 3094 +/Filter /FlateDecode +>> +stream +xÚ­ÛvÛ6òÝ_¡·•öX4 ðÚ>5É&ÛÔëfkçeÓŠ„%6©Tdõëw.xÓõ9Ý—Á`0˜;ä.¶ wñîêÕÃÕÍÛP.' E¸xxZ$î" +='Þâ!_|Zz«µÜå¿Ò¢âև•ç.Ó­Zýöð~á{±ãz à"`ƒWÿx¸úråÁ˜»ð_9‘ ÙþêÓoî"‡ñ÷ בI¼8Ô~á ßrqõï+wB›ç;Ò…!NHÇ Kœçºß¢îæmàNæ.Ö"r©×>ì, c\,ÓfŸb7Y~¨ËóNåMʳ·Å¦I›3Ïeõ^µ<®¾‹ÃA嶪aäû´:c.U.rXZëàGþòŸªÑžô÷÷cÛ“@ÒQÙŘW µYSlP:*OÝêfÚTÖµf<íôp£çqºøÕuE¦Ajª&º$&º„ªçÊåÕdY ʯÊk>0Ø¢1¯bayRðT<Ï0FƎçG¬h'R2'Øjà™{Ç*ž3§$p(3ê´+²ÛAFÒÚ/èìҖ¥´Á,ª¶K˒ tQµ»ó½<ÏЋ}'-ԔßÛfæx"t|×3@u3‡Èu¢8â¹)ëlVŠ‚ĉ"»%ÚG#:®µˆÑmìHáx‰fÉÏ_ñ.iðûµP§oø”º„W°xk4³RÃɶãVýÄߪÑZÖ°0wÁèïÙ +0®J3:Í¿™ÞÈLÚK;¶j¼“™H,m1’XtÀƃ.<¸“ß âHóOˆ` õi€}`3 F–Îõ¬¥ã^^£•hr@KQ¦›R1 ÙN×XcSÆvzk +ã-³2m[¥§ÁÝ´ÄœA®˜ .íÚZyi‹=x‹9!M t±`y½ÖŠ{r¬YtèëYãèD¾U÷úĒÖ*°J—;úº¸±U <…ˆè¸ðÑtR›¹¬§Ab.÷M'ú›•~=Øܾ2rÂèbßË [t‘àÉî@®yœ*· ¨ba;–z®F³N€R‹xÌ9´^Ûc£U@úT¥,¹UW%:._€OÒâ£)ÚãبŸø D´ŠWô‚ãhµ + s®Ü¨¹Gƒ–ˆ×(x¥_ì Ñ^sÐÕ*5}À‰ÇÇ"U=_?±t1¸ÏÞ|­ù¨k²»UWhÇ~yiøÀ½4{Vo/ìŸ+O K€AXm'«F»PËìñ`¬Œ l[F“ÕjÔwcã;aˆWŽM0š¿!p ¹Žp…eßeèȇ¡#ÙÔޝYõÅ׏&V¿°®wwÃÉïÇ­™¢5XGÏXýoÒ¬Ó “J?£° + ·Q%ÝZZ"¡Â³„Â\O¨ç3¡0øêÍã=†¸wÜg2àgçO;öAмc@rEЭ«ÙÿÂMh®GÏã¦Úb[©ü1Û¥ ^ft»«›îÚºÝ*ëj;h>úûÏdžmÿ ÷ÿœÞÔÏ$@qèFÈ[Hƒ½Ø³ìÅž:tCˆÏºøñUý Ą u½ÐöìK1žýAÿca×Ï°g-:ô“8Y”fÌâā·evºï'ÉòM}¥Ü"G‡£3[ÿGÃ#‡Ñ‡Cß÷Âþ—¹m%æ]SäC…ÿ¶&v‚· +œÄ¹¥‘–æP£I·I–xÎÞè¼¾ hu¿àñÞ +³Ýφn—öìϏgùWN‡ʁ³Jî B'9Œg„gÞ ä3xÕãýãà +ò¥kž¼ß§ín4Gˆtº(–¯#jȦÇõœ8–γÍÚχ ûgÂ$Ô 1æ‹bM̨dbROh<ÕeÉ[‘ñ%–AÐœ€X4\‘n8 f'BCÃÀ• là +½žû ›SÌtæCàüÁôv&¦ô]Nje,ö¹ò8ÒÂôÏúS¾Ä­¢sÜÀ d8¾Å±ƒÓÒKwÏù±„gƒä-¡ÜóÁŒrwÚaó;HÚ\ˆê;‘}Æ>¾cÂNÀuˆ¾$¡Ó,G&Å1€ª¤hß×r‡£)…Š´Â¦©ÜåogöÈIuêf.g˜mËxœ”ß@b|s8Ìå›°…q8¨ZQ´¼/*"ÕG/KòCddå‹j|±žt$\èèb[pµDµky€F~®Ò½Î±iÜEn 8c/¸ &}ÐÂÄþH[égJk¹Í¯ÁS1fÖi®4LŠ¢x"Þ7)|é`3–CßT‡¬ÄòGe¤NWq$åþ»»7·Eu|æÑöÜvj§ 9ÄZŽ¢Ýa™Sñ¢¬ÞïAí손ÀØbÁk¬!HX™;m=W0ˆ7‘C-œ©?@NÏ`ÃüTlçjYãBT­W<Õ¦CŽM +1ûÚÖúÀT™bÇ“—©Õ,é"Á8˜m“¥:eÌ•r@ˆѺrGk?µ©(m#S9 9h¨ë«!\4˜gnê|0$OÖ5GT¾–QX”= ƆÄ/sè³²ºiT{¨«œSÄZOâÙ9§=æ`ðç|‹ROõwSü°5„†á¶u!ÅöÀ•{hæçv>½óМV0>ÏÉ£“ôé7tR;2Ä]ä`÷©J©8ú”s‹Ÿ ¤Ûƒ[¢Y š³I½Ž ¶ÊBƒoTwÂZɪâۉ?f¿‹€a¯%ž7Ô<ÈÉÙÄ0VŠÀ/ú}’êº b#_ZoNµ)’‘ÓDŠz¹Ð«y\³"ÝʋŒÏÎÂ`XÓ¶uéµÒè^§M§Ú‚Þgð¼:Ëp¸=P'¥)†¬b˘Éô 9W +„ãúþ §]PâD‰?ÇÌÍû·Qýqõ•'ñåfήÆ/³«?舍UæPÂf\usÇ:ÔWâ܁œqŸÞ%h øÉ×i\] Kêí™{¯9ú"7ãS±çÚDfT®ô9<Æo® ÒÜˆê ¤ æ@ ¬gŠ/Ë*X,:ÂyCUtEZh‡¾`)gRÅòËQýñ»•;m“Æl&ÀóQ…éiK—/Ív¡fG¡ßK¦ +0m%F´%™m&ßo‹6ʜè3ŸYÙF Ä+À>•mœ{™l‡ù£"udü؈1a£$ƬnìÄ^46fs²=ýkB&ný…ÿL $Õ!øsÈ'ø Aîߟ”5†ÿ) êEo=¡{;|“»|ѹÅ?à¨÷ãä0ôþ·U,[óç zµx¬rMkkӐ¼ºŽà2Dúïsaû +ـçü¼0­Ÿ®(¾é(àb·úbv]wøîææt:9Yë«âÐ8E‡™ÔÍe}¤ÇâyXöḠFÊ|‡‘Çiq‹<óJþèîñ¿‡~ +endstream +endobj +294 0 obj << +/Type /Page +/Contents 295 0 R +/Resources 293 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 219 0 R +/Annots [ 292 0 R ] +>> endobj +292 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +296 0 obj << +/D [294 0 R /XYZ 90 757.935 null] +>> endobj +6 0 obj << +/D [294 0 R /XYZ 90 733.028 null] +>> endobj +297 0 obj << +/D [294 0 R /XYZ 90 709.842 null] +>> endobj +299 0 obj << +/D [294 0 R /XYZ 90 596.315 null] +>> endobj +293 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F65 249 0 R /F11 291 0 R /F23 216 0 R /F8 300 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +305 0 obj << +/Length 3179 +/Filter /FlateDecode +>> +stream +xڕÙrä¶ñ]_1oË©ÒP¼Í“íx·v³N6µr\©µ(3ƒˆCŽ rý}ú/QûE4@£ïnÊ۝vÞîýÍ÷÷7wï’p—»y$»ûã.÷viâ»qàïî«ÝW'Ø‚ØsÞÿýg¨FuE͓ÏÃC­KÒ¥jŒ‚I–E™î»ÿxóãýÍï7>\åí|::NÝ4ŒwååæëoÞ®øǝç†y¶{"¬Ë. +Bø­w_nþy㠙ޜÜ؛‘ë{‰…Ù. B×Kb¦ù× ˆéz»o÷õ{žó]³÷cçHL}§¸^ö¢×mÀÁèæÄÃþ¬xðùó'˜s;ԏ/ÅãÞ÷A1C§ì®¢çQÛÔtK0¤›^5•’#¾!!ª3pù¯^ìøãËÖ㊄Z?tEg‰†»àa»Ì’|wð}7åÑjÄö\–È`Tå.ùp°ƒÁÿáÖ/g…œÉS¡Ÿñø¢»2më糪:™~)…‰6ü[â ½à\ªn÷‡ÐËÝóғ®kCß^@eQײ¿WFЎm·"C!ÿÕ8Z +ˆØ&8¯0èc±<à° áó G\p9(†¡©•1¼6Ñ-*‚Híǂ² Áµ0‹}Ë°J›â¡"W‚A×ÑèÅúKQmº#ª[Qª¿,J£øÞò}/(‚\(Ft°óxf8YèúðxïA5Hƒ« oYÙZêÆyb÷ Îº(ÑÐù€Ü½ýx?©ü–mש²'é¢nL²&s@,¡¶àUXkª¢“źe+½¥Gƒêz.x(y{´ôg°]”Kî‹Z…yà<(†]W4'@MËP6W„0ÿ´â?,-øÏHÚÈé"Ì^.i*YŸÞ†hdßJö¾Ô*ÀxUF+žt>ü§øVl' Ü e£ìžÛ"^Ã5ÍU•úø̓B°Úæ0c>@,óyƦˆ‡)Æ/$Žç’Q±r𓝹a”Hç!K]? wðr7ÈÃ1Èøž÷g¢ÌK³‚ÔÍCшí}ßË[Ã[þ r!}häç¥£E¥nD|Æí%ÿÜéÓ¹gT”æâ­íN½ë”œö¥=öO¤1@Þ¡¿j`+ë1?4¥uÎ wvô·›•"^æzqf¥{îûëÛ»»£9ºmwº[8ïWvëâa?Jœxn‰y,î:q®ª»è¾'e0)KŽÞ9ÁH¤ê/×wš ¡—“äèxë…Ña³V†WÙO£Ë³7Öcހ¶åpQMO‘"녆31‡h$¸çíÚlù¦y!¶¨œO +Y 3­ #×Ï2Þ÷¹Ûû™£Š úîmCUÎûÞZÁŸÉŽ`BOŸ¬îª#Jaù\«£< žoíϼÐ1– Z°MÁzÔM%WµâhSÛ=wKáùAIho5<ãkapi)(ÃhE@˜X’À¹vEIQWÆËe‡ÝZ)£O’ý¤sø;¥YˆŒjÅ7>3|›… ¬ÚËr»9Ûdi¥L¨/ +¥xÌÍOæ ýʜmú®0¨™AZüXDƒQô0EãIô~¢—¸.é /f¿§¡€HÕ+A–‚}áÆshoÉ{iÈ/Ìf/D %[0˜åž†!¤{p˜^»öÔÈ {ø,åÅ«8åÍÄ +Ò©K¡íqGv…ˆ¸Ô\#U»,9º—m®vÈõȝ_öÜv»xïê)YÊÄãâhéqimíqÃ0Æ xu<‚„G+<œXááxNˆøÐÏÅÄ)üæOÆ|-ˆI¸D‡ÚôWEmÚex.ÆZeiÓV?yÖ©Zf ígëY&CÉƒü2§ñì¡?·ÄëÐþ ‘Ž”D¡,$\"µãÆ%m¢—0U1·¡Ýô+RJ¤è‡ñ7Âì£xdW<£ÚdÎC<9óÇ}¬H€Ó©£ê:©ØĂä0ÙÅa–¯Èߛ…Î?ˆøtn±éÌbáO“÷Kcç72sZçýø;3”(¶†‚ë\ˆS2œ%uBkdô~ï;gH…Ù4ùµÙ /b.ÀÆ ;£‘Ñ +Œ¸Øa'›Áq`Ô; l¢D³ºlY –•_’bÆmΘ!×ÓdVû+=¨R9ƒ•2.ÛJFt;B +©ËOJNÓö÷Åýô¸fD#:Ò-:ÆCGÏ8/µWŒbb6D?Øx \/Õ*ÂZcэͼ)ÿ˜Bý¦åŒá[ˆžçîM;;âù…¥V혔[¸ڎñèZiyúª2žX«oŽù.S& @[Aˆ&ÒîYÏ¡‘SÈU;R^UŠÝÛkl­ Ž&¢íµrŒR˜Ç=B˜W‡QtSHâä9Œ?ö2ÌpÀs´äWÂ0à3ki)U׺‘C”¹B¼ÔºÖ=ÙBõ‘ÇSÖÆIçˆq⸕ #q+W†¡ÃAfyøÆû.m5–oº˾ü%™s¿«"îY 7y™™³— +$slí8=âVLq¹ÖÊvwŽ¼ÂÒÊӍ"!›•Ùغ1Cyfˆô“ÄDnùiOg%Q–NX?ÛýBÊØ'*d®,IBJæ\n*eÔ³‘ÎQÃ`ÒkZ€Å€‹t `²NX,ÓÜ1ÅE°„—†áb˙5Z­a…1)Ïç1°…L@Ÿç]êûÞ·“ép + °};ûŒÅ4J7œ/z€Žo`/t³¯2€JñÖT¦TJ²‡ï¬ãý’P[ÎsÇEá䅣‚zÓØ &ŜRŸ¥óƒ5-©‡5ë ýëÌ/Õí•ýÆW ’ +2ˆ‰äñyO-ß(ž9G˜ˆs„Ñè¥`Œ 9‡ó2>ËôêjÞr ‹¡Ö—†àa«°“3ËU{v’2Nd­S¡W«éLSg¬ +xp´iã()G\”¤'Vñµ3üš„qÚcÆ.‘ [fê«Xï2öD12­MŸ#ݝ-c—>l3\MÞ&J&iUVÂHԟ„ü×Rá Išû†g"NiÀDéLô,ñÔ)!™î(é({¶k-uM4æ5L§RÒçP#²aa'I>•ZÖ#¨ÛnáÎ¥írcz?€ZÒ7piT,½á±´ÞüÁz%öø\ß>ü\}ÑïƒîÈ {£³òr’ +v)•»*«„Yt|‡%@Ö9»ªn·ß¸NtfF Bz¨•õò€“‚û`µ¨Ÿ)–XÔm£ÚÁغe¬¥˜/Ëg³ 2ç¦_ùҒŸÏC«š³¿<Œ1_ô2riFÀ²ÍJ“}e©8YäÐ6ƒZètCÅta%Àà€j{Ôñ^äµ|…®Ô+þþbsÒØ6œÎó|!B¡7ƒtÄ{¨oºW²QÓJ„¸µÏǾ× slóÉçʖËör… NMXøì[ó)ú²–!Û4x­í4]¬Þ"Š„Ñð;‘eV®m}øý¸F½müPÅs XÃ.¼B›ÇÀ¨`5²»-ˁCQÈÕÁüZ¸­Xž«†²ßì°ORU7•xîj(jÊ;±†›o9¸?5…; ô¿ÔFñ‡ÊÓ«Njl®³BÁŒl×lP_¯=~+¢jÚ_$Ôt“âÍ«ê6æ–‘Fì 7^6Sgdƒ¤‡£@Üu.b̐QgÈxûž4EkÅ có§5³v9Mü 7Yfsw³¢Óv§ð;I¯Eƒa•%šK¯f£lõÃXrË߸ˆOAÂߺpˆ-¢zf(=-ˆ%a«PàlKe'¸öM §f›ì $w2\ Þqè¹/1}0¶Þ#à…O‘3€ß· *KAãkÍÈÉ0ÿH¥!m¿­Ð¯b/ça,¾q?cs-¶EOèÓ\Œ´/kô .¦æ-‰«¦M uľtŒtn#Hà¡_z˜Ê™ö?pLáãç>Wv íâÃÌú_!’Ìõ’ìþ'„ýχÄÍÓ0“Ԉs7Ž£Õ·ˆù7zœÎ¾ÑSÒg¿Ño~¼ûq(NÊ~¢Z|üDÐÏ ­7{dÏ‚``CÌ@—æ @Ïõ=7°ßŠá¨/œú¼þÙkzb'n槫Ï^OOOniÜ¡Ñ×ÎÕýÝõZo|›NñýÈMýܞrœ’OiìÂÔwã0ÙRØ$ÿ÷¢@¼PûØ]ËñÞ|º +endstream +endobj +304 0 obj << +/Type /Page +/Contents 305 0 R +/Resources 303 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 219 0 R +/Annots [ 301 0 R 302 0 R ] +>> endobj +301 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [297.062 555.358 388.718 566.262] +/Subtype/Link/A<> +>> endobj +302 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +306 0 obj << +/D [304 0 R /XYZ 90 757.935 null] +>> endobj +10 0 obj << +/D [304 0 R /XYZ 90 625.516 null] +>> endobj +307 0 obj << +/D [304 0 R /XYZ 90 593.588 null] +>> endobj +252 0 obj << +/D [304 0 R /XYZ 90 593.588 null] +>> endobj +308 0 obj << +/D [304 0 R /XYZ 90 487.876 null] +>> endobj +303 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +312 0 obj << +/Length 3116 +/Filter /FlateDecode +>> +stream +xڍZI—㶾÷¯Ð-Ò{Ý.¢Hæ6;Î8ãñ$Ó>Ù> I¨I0\ÜQ~}jHª™‰/"PØ +¨í+@áîyî¾»ûËãݛ¿ž’]§ø´{<ïŠp—¢ £Ýcµûyâ4Ü÷ñ')èV÷ªæʧé©6%—?˜R·ƒ†Jžóýñðëã÷wß>Þýë.‚¥Â]DS§Y%é®lî~þ5ÜU@ÿ~I‘ï^¨W³;Æ |ëÝç»܅K6Óð†Í8 ÂSÊlöz{SŽ‡‡$<í+}ˆÓýï‡(ÝëÚvn¥Aµ&ä öÌßÁžÇ—CîUïZZþ>󎺩ï¬VÚ¦›FÝ÷PÃýÓ~&YÅÐÈl?^|ÿñ¢oV†¼HӋ.ÒÉâ¡ÁŽ¢((Rٚ©Çk*:^plTì‡N—¥ÔJµÏºçY¨aû“U×ÕF»Y¬¹zîµÌÚõö¹W “K;Õ2 Q_ð„¤—‘ôû¬ËÑ,Nýê§êz£GÕ_§tR >rØÍÖf»~!:”ªÖx1xÎ\Ô¢‡Ÿ>pA ÃÒwÍJÆømc¥Tmk¥áI& ¨dåo¯Û +ÏoµŽ? ¬´¶}Àc +<ëYpŠÌúã<„2Ht¤.HùˆÛVf4¶•†³í]C‡|5í³ì·2¨×¢]Ur5Sc+óKÆ¥š϶®-⠟8°J6ÎÇ£õçÉ1ˆò\8ÿöŸ?|æÁo?~Åw?~üæýãû?~öÌÖããc (ìpÿF^Zޚ,¼²Ú›q¿Äqò²]9 <Î``k±bôƒßmÂ4ãµ~üQ‡µ)Kä읣7ϗ‘¹JNñ^ÕÚÍ)Ù7Z¡‘X.û>ÔÆÛ t«òü"=Å0q"°Å+w!K’ö{&}1m%CÈEÁ—Ü“í¿Ï)¢ý0•™jàAƒn *×TŽ RæÕ¨áË°Þqº”^í?±Ò‹(’…( ‘D_Õâ¾®Üau꩖‰Ë\«ùÄ+2‰µá”¬PòB‡˜ì¿U¸ÃÅP™Ö`÷ÂEUõˤžÄƶqsW;á~DU‘"kéaV9oX؎fÜô"s‡F]×nÄÄnÏT¨†hcï¿Q¾>¤0±ùšíâ•ï`‡øƒXqi´ëóU–šâÏâ8¡&ú‡ÅQÆ:1píÜۆKÄPû«T7ʔu½l‹ÀcöÒDƄ³’>¼ZÃۂ©3EÍáÂ& „^ÿk2=ø°5O¤›>\¤ФÑé'g$Ð\pÖ<f Qˆç†2q +_×I£Jþ[!Àª?=Ç8/ m 5S=ú™[„©#N§Dª…k0GN<èê\ÓÂ+‰Ì˜·åfO¼Yï ´ê!‹¢,V_¨ÚjÄõŸ”^~Å¥óۜ{SñÞΓ–w![qÓ»Á ­ÃeŒj¹öÔ®Nî2„~uo«}ÝÌ+³|Õ|’„·‚¨C‘ٍO’˜qN²\kΉCû(3TòÎ •„†Â†¹/Ÿ„ºãcAvúJ§¿QRÅJAoðM²´§3BXØÐKÐîN]¼ê c,0†.6ž]/Ӟѵ`_è&þ –󨵉I¢ZÎ=³Ì¶UêNzpÔ¥œØhaYŽà3®å–`À¼åˆç$߳דÓÎY^9À)Á•1ɓ‰7–fGT'trEØÍ´e=Uˆ“¤¸WÉi ^á¨_Â4QCÍq·o~¼`@t¿oÅW‘Æ3ŽM-!rlfÄIåþ& ±‡Á6ځũæôµ³-*ʼn¹f%ß]×_·!H\Ø´‡£\dbI!K&\úL$:K +³ ‘ “9×Ê÷Ý­¤(Wâ)؏‡#39D„£ >G…Ó……"ª}{©É7‚ôax°%¦tïÃ9è(žŸó?¬ yƒwy½ž×­^Í9_У;£ûÛéZ'÷ŽíìF8«Ö ˜!q8¸ñ£Ï&n*·‰ñÞâžÂtÞäòˆ°Aöæºpd/¥l¥«Õ—‡\U5æmÇ)Y&vû@<tk¦|´# -¢€@*ß‹ŒaW2rÂG JJfäåfCFªâÏjç-"µÍü™MèˆjטzՄᰏÁˆ‚çÔjœX ŸGÉDhß\]t#ؑ’?]BúÊ¡bߖN„˜:žš>ž§Á:)^„§pGæjc‡h#IÌÀßÖ.‚êAÇÆ+S@¨âÒÜ=«˜ˆL­¼}úàè‡,eæ"á«5¨kaI9á¬i˜JWì9)BÎ8°/soìúµÞ;ÙÑÁÅ+láÃ6HºDIî8E*ɟ¹·uÚ¢=5a—€ˆl½Àlûv J<òýû³ãAÄ{ki@꛺ˋ˜WÂ(?Œ›°à|ë—À5Š²ÇU.ÒQú!^„sÇe`PÞµÓýŠâÍFüϨ›uHò‘‹X”Yô8̗7ÂWc{`"ؾRHâ *$E’§}¶åP¥,ñÎVúÜ,0ʸnj€9J©—0^Ôøâ%æ3ŽWyҍ´ ÐQ&Ìð˜'h¸DbXö\ÏåWòˆ–[ƒ·”å¯) æ|ðǧßn[A¥7ÁùœžËŕ?¾qj6Îv²ÎÉBVCŸG…´bÊû¥ 7™G؃<%|oµ=sW•XòùŒ57-Ý2Òiх'҆ß>‘h`‚§«LÀ€ö’p]Íc¶'¤»…tÿd+y‚¿¡JÆʟ¸…R R¢#MŽë½Ê”taë“# °b$Ó`¡œrª•åþ±a¥B­ÚçI=kÇT«y #ô0²Ö 8ØzÓuÎwŸª±ŸÞ\šû«7§ÈÎvï.[O›ZöXpæüù:°ÿ€úóÔ+°îž#—›‡œ¥ßuŽ! èË Fùàq!‡Šp@ËVÉÛ=û‡ ­@¥Í)É+9ßq@ãÅÖZ¦‘mœ'( +ÞgL‘8ó)B`Ò¦rB –Hø@d«LXۉҩò‹zæŒ(cÜ ­?¨ß(‚åàM‹Î˜;FÑâ"C® ÝâºÂ ¡F$ðm’ÜZýü{Z®gÆdÄ“À˜ ¢‹îYn¶-A®L²ø2ÈçVz‹A"I?s%[ùãÌcç,ò.#tGÅ5s§½£»%MÓՒãjkƒ ·–ŸÖn/uØ\¡MÎv¾|:Í ¸Ëx‘tÚLþrNc°Ù_nuî‚:çg$¤yǝŸÈÝ{N¼ÓŠ +òË9gmÿ_thl”Ñ'òN•Kˆæ ¶ÌÀNú€ÓjÑ´†EòÎ]”3¶á +¿CÑ$²WQ78Ië[]Ë´/:…ò Ô»W:pÒVòº–u‹Êçÿ1l泃-¹ŽŽLÉ5_ìÖÁrFŒ™3ÓÅ]ˆ +㸖¿NÎq>¯±é•â• éû‰ÑV’°*ÆìMâŒÈÔZˆâŒqË_ðùÕTêyÕ Øw“Wúk5ñ͖ƒàÁj™Ý„ñ êÆ#ØÔ:œ÷•W®¤'€BC‡ÏYž +l@]âÇaø,_ +‰¢ÅÌ.ÝÒTڏm¸äÄ_¾·N +y‹Ù>Vƒ[­+²…> endobj +309 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +313 0 obj << +/D [311 0 R /XYZ 90 757.935 null] +>> endobj +314 0 obj << +/D [311 0 R /XYZ 90 640.475 null] +>> endobj +315 0 obj << +/D [311 0 R /XYZ 90 616.15 null] +>> endobj +316 0 obj << +/D [311 0 R /XYZ 90 292.774 null] +>> endobj +310 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +320 0 obj << +/Length 2903 +/Filter /FlateDecode +>> +stream +xڍْã¶ñ}¾Bo–ª2Z¼¤ì“½Éº¼±IvWÊöDAjy™ WÑߧ/ðÐp¶öE@£Ñw7ƒÕy¬¾øîùáÍû4Zí·ûT¥«çÓj¬²4Ü&*\=W¿­ÕæQ%ÁúûŸ‘©L« ž<õ‡Âæ<þÑæ¦r&»]¼['›?ž?<üýùáχ® +V!¡N²m%«¼|øí`uø‡U°ö»Õ•v•«XEð_¬>>üë!˜’™wdªh¤ “Y·›Ç(H×g&¯¸á4Yë +֟7 +F¶Ð‡Âð®SkdÔ´õ¹Õ¥ãí׋Í/¼ [ðޙ#ƒúª¬ö÷ Pb+ÞӘöT·¥­Î ï.µ“ tÞY¼ÿ³í¬‘kHUßñ¾˜/} Ãí>‘'* ×UÝñ Ñ-Ôº>1¤»Èžë& € Ÿ¶€4‹×ï7aB<Á5ƒ“ÿé²)Ì_’­ßÕmk\SWG"7}¬û6d¶Ê‹þˆÔò¬ƒç!~í7 r¡‚'Õ„óŸÐÎÕ¹Õ°iá]WۏU˜®¿Æ# öD¤‡©¼þ}ø­uuœmHf¸òú(£‘»;åLa­n­¿lÀu¼Uº´9ko¬>á½þ ëƒ¾,<¬»hÏ~ÏTEA0Í`ëê““ù»` ØmÏ+V°îj†¶æÏÞ¶(¶(Tp?k'HÂñúáÆsÑ$UÏpԝæ-y]–}Ïbaá"1…–ª®­ =Qšz]zÛÁtWc*6uQoNYBæ& j`BËCÔ[Y&Å%‚`T\k¶M•ÜúL|„—ß),‚¼ÂF!Xˆ!Æ”l¢Ã<ÑšÀ­»ÈéPd…k`ß­ãa®+´d2ìK:¹C÷] üõúÛNm]òˆ»À·/=ýÞ +ďšó"žðâ‹ÇxÌ*’˜3˜gVDè&'Ä\øl)ûœ'–tOèrIdwሎÔ6ÜËóú#Øýv>N<¡ó3à,…t‚dæ܉Š·Q¼g$ßnR‹=_ˆ›0•«:2L˜ôՑt † cÙ1$˜°3Ÿ …WtJ–ÁՕ<"qÁ^7øÞ].KÕÝ©'6tN©w(ÓK-HŒ‚¾½~\R”œ£“J)&¡ú}¶G¦3óêtç9jµã5¹-[—¦C¶'{Ð+‹fdݶ#ÿƒ§OH :¥–L¶Ý@Gx±¯ +[Z¹9Åp'âòꥵ=.ï#¡~¯î(. ã€Ü8ÊDÅ\÷]Ów|ˆ ¡€°b•°fXάÂÃÖ¦^7bUÞ«¥­9P\µÈÈ©=Jšý3`9Íޘz—£P(FˆÀqpħ›*^·¤·Q@>×T~'Ì\g»¾£`û4ÿ½¤5šÇø Fá‚Ï—s#Ո$ÿT±+/ÌñìQ‹8a4Ø~âðVv€S\©w-ߎJT4¿§%¢Ðùϵ Äsò;sËP¡qïuV´èÿ» ‘=zPtMŽxŽÓ'£˜5ád‰¸ˆhôy²;ß½ä0nóv¼Ç 2kHœA<Õ&E$^ÁT§îÇÔ^ñ¤TEÍAi‡,[`:Ë-Š0!ã„dpµ4iüw5oyU…ˆ”êuU OsÑʼn¤»Ғ8›ì8B>ŸKáSNâ̳IŽúåA¸Ù äÍ.ö`;GÁ‘„ÊxÂ=ºAÌñÿ¹ðAÝ?Mh[JI¦²òÎ{¢úÎYŸ=!V¢Bk +ª7ÜÅ6’4²â®[Löß½¢• ÏH 1Ãk`â㐊׹mó¾„ü¨Êé}°jåŸÒ•Ž_ òGÅíbÖ'•Ìó*À<ä\°v0…ÔH¡ C!BM°²Å¼nÈÑ}F-v ©1.s|+)ö 0 Ïpö{rÜÊi0/uº½ Ñò•\\bg$¹øS»XSwx™'î,‚¾‘FŽ9{ñþÛ' +0~ÏǤ>ø¶êìã;K0àûg"±©ÿQ_7Y°þBv/üù¹æTõe¼à˜Èá jxôN8<þ?SúÍ܉’€P9ÿ†rۓñ­Ö0Z.\ªº¨ÏX×1¨4Úõ­¬‹‚6 8i0}–ŽÌ}â² §¾ æFÁá!' +ÃɈ®,.Ê0‘‡*“gÙ: å̉ÿ9¬ÂàמþÉ£»<ŠvµFw7Aw¬R`DG-ª€ÿÿJTüÍá~Ÿ‚Šƒú܅·8( +ÝΒµ1Ï#§4èT=ø×µv¢llª’*ãëcîrê³$Üb*øëÅP–#2ŠÔ+¹L„I5/¿Hi¢ic)J\×s}‰ÔD `OÁm”dÁˍXtË8AR~V.\x=n!ù⑙B.ˆÀ3[mÒ(Ê|S! $za‰Ásáf.²=¿„#!g—Iž> d¶åÖIË0ˈ,)‘b¥8&Ù2Rˆ®Y¬§„a’<~Ì”dùSE8Z—ږ/d¦¨›9a»¿ê[ÆR7ØõÓòÿ$ã¼ڄ܉ÃB½sBÀ+r¬„O¾›k*L؁¿Ò¦åŠ²úî•nï7›$Y êcÉAÉ6uëÚö8v‘!ø†gsFÈ(ÖPÔkTàWõˆ±Ôû×VýåöQ,!kL @oƒ#ù̱—t‘”¾9†ùÍW4•ÆrH%ŠË!,¹„‹7©1“¯Á®Ë7„’¡!4È@cÇM 7%U²O¦l=æfæuh¹¨Ž¤}7Qi"Þm_ʎYEñz“Z…r¥ +© Ñؼ¯{Çy‘˜®AœƒÒ¹Åf>¯þ`¾ã.#|af|ZùÑ?ð³y2y¢JÒí.Ì`‰žxéºæ¯oÞ\¯×mî¶}e›vk»7`íofœ¾cTÆÛ,Ü{,ƒ Êºåvdéá6‰ÒÕc‡B_bâwJK^Èñÿ8® +endstream +endobj +319 0 obj << +/Type /Page +/Contents 320 0 R +/Resources 318 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 325 0 R +/Annots [ 317 0 R ] +>> endobj +317 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +321 0 obj << +/D [319 0 R /XYZ 90 757.935 null] +>> endobj +322 0 obj << +/D [319 0 R /XYZ 90 589.002 null] +>> endobj +323 0 obj << +/D [319 0 R /XYZ 90 363.8 null] +>> endobj +324 0 obj << +/D [319 0 R /XYZ 90 217.9 null] +>> endobj +318 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +329 0 obj << +/Length 3065 +/Filter /FlateDecode +>> +stream +xÚ­ْ۸ñ}¾Bo‘ª,š$Äkó´qÅ[v¼.§<›ª”½ Iˆ)R ’ž¿O7ºÃq9Ù}ÁFãèû ÂÍyn~ºûÛýÝËשØA‘Æéæþ´)ÂM–FAG›ûjóiïöqnzÿ T£Œ¬éåÃp¬uIãwºTM§à%Ïù6Ýýzÿöîï÷w¿ÝEpT¸‰ìÖId"ٔ׻O¿†› +ào7a Š|ó`±®›C,àYo>Þýó.üæ5c„iB×L‚Ý^DáöUÛìáöëÆêQ7gºÜÏm¥?‡a¬*zÿØfåÛRÑû¿˜N·MàÕ_¾NÂÉyáfq(è¸ï"8 `5Ðz•4(ýéÉVáÃ%>²íÞª5_x”½ a™}öEƒ¦=y}ÁÓf1}erJÙã…y¶¥Sn¦­†’1uOϓi¯ß:Ä·œA¨lÈöPóàs]UxSD[Y‘±W_€Ž* +ð ÜËA€º#ˆQ¿ Ú¨+Ið½ÀÔ&˜1™Úò„Á¬Ã+HC|±NLÝfö˜ ºée¹Tf2¬=,d½wlø—¬ìY1us¹×q€×£¯wvP è$ ÓTÚ<ÛʎP$=.m­xʱÜî¤ïÝ쀖“XÛFù]¡l¯Š_xk»ýsЩ®#Îç9 xJ·Ù ïþ¸K“-J=Nê€3¹W´}ЖñÄ£ÀEò„¼Ýj»Þ’¯[k¤vM¡5NIý +]ÊcÍ;Œª/ãT¤µ|W´u²ÖEÄ°$s8%~Œ\¤ŸËf’J +ç^2§U˜eGƒ›4=‘ƒRãíÏ;p1¦ªóÝA2à}Æ£˜TÜ×(·]ùEžU…‘[DŽÉ0ᘼB%û<_;Í@éñ °‹Ày°dSŽˆ€2ªkê‡Ù‰°5JxŽb—;Á–^ªY´=îbˆw=/ï ­jÇ{õ~g› ;®5:bBí†òBxu¾÷š©Ÿ¡á"ñdN28œ‚l`ãúÑŀRM8åCÈð +{…¸Ø¾Á Å.“ˆgœ„é‹5öS +PJðR“›ÆÐY®:”“e-8.d¬[%-cbYpI¥»[mÓ,ÿxƒèr3šX ³ïFm¬ å=¹Â¿âŽ©SG5^Ä L^<çå˜MZ +qÀ¹¼„L BW ôž,·—s°¾j b5ž8|™‡èsâ…‰v‰â`îå°b9rj@Š‰)†¤ãs&ÎðªÖexV_læ[„ÙÒvpŒæsÙfÕÕX®ÿރã LAp~ 5ë…Í.äáìÄ£Š,á´3Fº¢Ø» ' „#/9TËa–æÉ[ Äj߁¼<¾Sj.(ĉZÚÚælÓ%JC)Ñ_Í#(ßh9ëq鈤ÇWô4m=\9—±Ò§»¾5àÂyδ¹7š½£Ïo®ªÒ"Œ·š3¯‚ŒK½d3f>ò|ž˜^aFC+ôi–]Å Äl®á 1n­ÈÕ¨n¨9õƔ•Ã½ÑçKO RJZi0P¥–sHg­¯š'é*¸®,)æ\²!ÞÜ3aV«!JÁáÑÎE'(%!“Í&týe—$ÛÎßÄðð¨8â«= ƒYË È‰YãᒡȕģýŠD=¦=E²}Ӕõ@Ñç¬òGVöøúTõ'Û¹yï°+ÍRÈÄyvˆ¨CdzœëG“Ü˂Û5R)ñ"wÖ.ªPç\Ð 0‘yR1r2½¸#7fÍ8UÄATð©é·{ïÛf¿ì7¼F9€Ýþ½H“¨× la»Å¢× ¨ kŽW̯ ñàŠöøek »ÌVò0âŠF.CŽMs5½`Ÿ |MÏÐ=ÈaØà~Xù¸¿0 gMª¶äa¸Ú_A8©xˆ!­›º u¡™5jo”¬(¯ÆùW­û¿ahëϐZA%O»sº¥£´ #¥9«“¡oz½ ¥´úP[¡Ø_ ÖóYÎ*ÿŒÞ쫵öS‘:g™Œ’†1KFº±n9ck¯G(fÉ1§n:%§Ÿno°ŒÇʕšÐ©áÄÛÂmBŽƒ8Œ çÖ= Ïdc:ÌÙKôŽ²¡+Šœ»(œzK9#Ž“3Ncþ»O`ƒ‡ F¼VƒáZ ^æ÷$ºM–¡¶W¸@Ä~5À:‡Ä1„¶K°N=i€a¿`Çò"›³ú¹úÑ©DüŒJDcüU"ö*9™Ç>¨OU"§9Xˆ6šªDüT%x]´\ÿŸ*%öL%ò˜TÂUõ˜Œî!—ó?¸ß“+àäI}F($#Xh}°Õ¨¿Åuú£’Ž]Ž +°ÙN±Û)¢Æf€ƒ<ã÷Ækîã(Ýv7RºÖgI=îp»µ¦§—“ÃaO‹xùÀËÄ^#bAa`çyѐY÷%J¹û‚{µöSTçaÖ¬Â\)¶JsT³B5‰XsEáLÑ·c,Śï7t"w«Ùxýʅñ nO7¹$r¦ +Ê^íÕæ!vÅú®TÖ\#1ù˜ü,d®T‡‘tSžowÿŠ|Üeôº4ëÝYÁ•T‘MÂÙräþVW‚ÀL4¹ &㐫Ýû^²¬Aé¡ÎŸ{4À'-³ýsîU´¢mH5Ae);Ûsuró€Ô´ „𸥶³®Ý›¹HNö²uEû|Go½_7–.N³Om, Ô2ê$ڏC¾¬™G8›[0„JS=Ýã8û(—qé·´2ý®†¡ˆÄªV"œ+Sá Ä$šDè‘Ñ<1”³ÄUÚ8&#´P®'U§Ï oªIÅöV˒wD¿p6  +¼¶5¼ ¸¶³äCÄÔFgª 4þ6èñ\Í~’±AcRÿdÌ͗¾¦8Œ¾Æ&é üN^yäZәxö»õh:©Õ¬€dùæ´øBâØC÷õdÒsÜ1óƘ’/I¨F‚‰E H§ÀYd>îù$Τ“8“ÙšjaËU¤y¦ù÷þ©Âþ™"UA‘A‘I¦HŠ IÄ3ÿ‰ûÞXš+G·mýxQ•‘îG#ݧî·üM"N\,|YÆ@ÍAx{3íˆèà‰omá4d3¸?– ¡2¿:ï’ +Ö¹áòQ)æ 1ãËƍþÿI&$Kƒ<Ê`ʒxéûÛ/_><<e ¾™@÷/o·úåŒÓ FEÑ!È¢Âíâ 9›ÙV¹È¢ éfŸÁ¢ÈõX1½±­¼`)Çÿ?ÆxX +endstream +endobj +328 0 obj << +/Type /Page +/Contents 329 0 R +/Resources 327 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 325 0 R +/Annots [ 326 0 R ] +>> endobj +326 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +330 0 obj << +/D [328 0 R /XYZ 90 757.935 null] +>> endobj +331 0 obj << +/D [328 0 R /XYZ 90 714.318 null] +>> endobj +332 0 obj << +/D [328 0 R /XYZ 90 375.452 null] +>> endobj +327 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +336 0 obj << +/Length 3436 +/Filter /FlateDecode +>> +stream +xڍ˒ã¶ñ>_¡[¤ª.ߏÜìTìZ'N6Þqå`û‘ÐYŠ¤ rg•¯O¿À×rÊ9Ìh4F£_x9ø‡ï¾}~x÷] +¯HÃôð|9þ!K/ ƒÃsuøåžžÂÄ?~ÿŸ¥¡Ý«š;ÆsmJnÿݔº±:yçÇìôÛó}~øý!€¥üC@¤“ÌË¢äPÞ~ùÍ?Tÿáà{Q‘^ ëvˆÃ¾õáãÿü%›‰¿`3b¯ð³CFžŸ&ÌëY3+m߸8*îVær +“ãE÷ºxÄêþó)HŽºg”_ýÄo;ØØ +†œïŒyoG!*¨ŠáÃÕô‚Ú©~¸…À¨ìØum?XîéßGƒ||ƪžx)ÛîøÇ»i^ñ‚]UšÚ FÛG$Há)¼"‘v}‹ì6ò)󉍛2ÍÜ+k­znV¦×å`ÚÆr¿ÑHâˀ½ä8´ ®šíù?€.TÚJ V1ŸØ~½‚De–ÌþÕ÷æÚPúKÛ÷ÚvmSáԝÝ|lǾÔÞé)*ÂãOÄÖË dÔWµ¶(½,?¶üf°(IZ«3ŒkkIÔ0DK#l½4ñb¨§±œ. öúF2CŒ”šÖge@z-c‚°å-̇nÜ×:} }9sS«s-:z™ôIðê֝¿ƒ4ZWN‰T)5{¹ 𪭐ëQ»` UÖ£«çîÎá)÷â´váö„Âî¯a˜¬±~yJ|ÐQQã"Ñ5§9Gã?\´ÈE¶E6)YA:Z–44; G›Ú'jóü^5öf¬M„Sˆüb£Í8•Ï°M‚ºÉ‚°t?“¶ŒÁZˆGâö‰Ç’ºc!EHff³Ø1 PÕTÜøJObÑ™}áïDî¯hÛbTÕ ø¬e:M›S1ëЂÆËdIa´s–¹øÛ´{šV^áB9Lç“›ÊY1;ž-_qÂÌ K ê%yÆt¾áE¬ó%j‰|€½âùÓ¶ã=)&$EºE>AkÃ.¤æäó]ÈD¾”õX9©\úö¶‘Ëœ܎©ˆ©ÿx·ƒ¾9‡tîU?¥Éñq¾PÒjå–:—aš‰+êñ·üêLFšÙE¿àdBø•@‚x³™—†ñ,ú¼ÀKýléð ÷¡o«±3€„_mDïq +ø©@îhÎN«v¼9¼n&†{/ +8#S^yð¦U#´Uãn6tÕ¼Ö$7¬mH?™ ÁdbËcû†ø¸´ª®ïÜ- +[dõ"?™¨£Ë»™Ú7îm-4º±ï@ßì E²hpÙ¸i<1D¨´5/ãÄM³݋.´l¸v]o Q]‘(B\¼×ØRøɎի®kX¼Y’Ç÷‚WéA÷7Ó079O>ÖÅ\95¡lcè‚Ýù.0Q ¬ÙŽçá2Ö•µ²v=¸8¤EýU\³¦¤™Ô0¾5¸’D(’ØÙ$A>WKvIݗg;Û°@ÜÊ<畈„*‡„YÚY9ŠVpØÐw`­0"dŒôg§xt¼‹¼° IÇ°žû1+U˜Iè•d3qu¸Âì÷‚Í@Ÿ?_RŠƒò—‚ã•¢µŒ/XÐÁ°KHqt_2rè¹LSvè'„¶ß3¡MÛ<-8FÏòeg/L’·'ƒ.. ìàJsj±rRM-1#Ú@ƒaz©ÖmòZ´o&¸L„¦£Øqkxß7 „º Æ)X@Œà ¾-[‹ ÅqƒpM>L°óTˆ8y*‚׶"¡ÄtÏJ]A`îj„áÞüwÁÅ'Ô{vá˱ÀaåŽN™™sÀL§ »ât) ´eîpD™¢àdÔÊqÐ< +’&Ù;b?-'e!§œe¦þÚ̺Y‹à3•XÙá –al&t(Ôz+tŠÖ¼AÁbхˍm  9“ŸñÌJm‰kÁ=à–)N&…lNu"—l1LÒ+‹îÈ`šØÝÙÓel(fÆb¶¤øåéÐXm7^d3qæÂ8hÑ>2ô›V0”ÕNùô쾚a"'ê ñî]ýW渎WÓ¥„öY—j´ÎJõ´gæðþêųÖº©JïÞÍ÷tx‰+g$;¡-ÃUÃß9¬yþBõ>¥½s¾‹ Ŕ É#ÕJõ$¡ýo@¼€l¸®…‹‹K´ ¤¸/J­ÎÍîé6^Ç( ŗ¤Á[!=â´e9RdhÊ2 Ý CȕD ALc•lÇə€s¦ià ½y¹nÈ@ VÛÊôÐqHŒì\6T~~ÃÙ˜ªBlÁüâõkÿZÌ¡„^¦3ä+hb#ɸî;=Œf¸/=wáÂゃ²‚®ì—9hÂuJü½pg +H +ˆéñÖ¼nXZ +õì"ö}JKƒ‰‡8B~P"ß‚$…8ㄠ—EFE±£¸ Ä¥F$VjNJ¶^ˆp–ÅT ξS!YàÀpg;'¶ñ’”'L&­'$AߎÉÕJ‹e‘9þZ†8¡ê:ºD3›2Hg@32{Öt.kB“ÊšŒÒk¬(Z‡²»'uƂ%*MT°²Å ߈À¥ÉÅAgbpŒM A!qßt͊sɖu2rñ¦ºu5Ó…—ÞÉf"˜m&‚„GǕiöv÷jË?DeÛµ¯âëòÍ%R;Lòe‘‹6J(ï×~2sç CR°È\¡‚¡êÖt>òmNvn™T­yY —K—=ôpK‡¹®Rˆ%‡Ð½«ÔÀg΄gÌd¶rùäÐ3çŲɋm|s’¥ÅIф»ìk–} €Ú£ÄSýÌÍnٖ"³lŠ™–hšIp5eH’!æ;øN7|§¤ ¾=ÖÍoʒ£øT%e)Á§ÑÃ2¼šê;¯ÙÌ òYúK9Çâ¨üã7]_¸ ÊV„ærg©‰R£r! žÆ¤¨)i]â,7‡ôx2­Ñ^VãÉz_„ÑóÄϦ­YiVøýX;2´Ÿñ mÙÖvSOÇ´klL©æ@I•}벦)“Yp´¾ÑBã@¢ œHì:GNÊY‚€¿¾á YÜp$³,}?rŽÇ!èèWz!Ƒ#¶ÀFŠåÎ䙰CžérWÓù«øü¸²>·$æ—¤k)ûWm9Þ\€ }4¿œì` ž£Ú"çðWBSŒøîŠl÷%¤àÀdñ°ÏµðÇRWÞ«‡OÙ+nG¢:õFª¹.ۘ8W–ŒãO÷¢Ù)kE-ªõ»ß"ƒÜhÜØtªüZòèVQÕT'žÕrzå#uÛ<»Â¦¢Ð +ÙT†–п©*ƒtì=ŸŠnäÍ +Õ›¨O…þ(.ætü”ohä)xòüb]±9•' h`g¥É*-t µó/¹«Õ¯±)âYF ‹ᔍuŽÏ“ŸX6ЖçÝÉ«$ÂÞÊRÛ/^$•È£‰ÞA. ¡Ä%^Z¢‰UظX‰"`®ŽW° „XRSà:¯ïjqf{Æ!ƒÓxéՍ¸êJðóþc!hˆ<4§Gçþ†k;¾\†k8E+¯YeÓÕ+…$¥4“s¯Iââcەtò$LHNx¹ SËSµ‘§|/]I1k…ó_1(ðv#^Ԏ¤ºTFè¯N‚^$$~-¦¢U!¥–—lŒÆ„žhbáN€^§bÈj +{ÒBÞ|òBž%`ƒv빍Òø¶µçfÎ1ýðÃãíF푫bcRhÏj’…òälyäeYèáG +€RœˆQZ“¦;…`4»­[p•pÉ´–'M¼,¤¿ø-v´ãþ›¢È8‰ˆ`Ë{UDPüqF‘9(X nj[t.Ï1HÜBM˜Œô i;wD(ÓU·úÓ vl,UǗ*¸WJâÊ(pJó¾$Žøчfô9¯‚Ž¨¡X+„¬gc„žte£}u-"§¼0BÊ ß×Þ E4bÍþØÕF˜âd[gÑå^ý `û{4÷ü4ÿ®ã~¦“zEåòk¢¤ð’d%½DDÒmëûUW½Z¿ÜRç‡EØ Ãªy•{ÿ~O6þɌ€0˜ÿÓ KKÜÿQ5£ó (íMiÓ?ú^à{!'wäw?j-raa|:¸ÖßðSÉb‹` ½<È`ˆ¶x†îÏïÞ½¾¾z¥õ ízÏ ïÀª½[Iz#(ü=SŽÊ[—£7|¸¿^¥‡§ &_U¨½í9þ’Žm +endstream +endobj +335 0 obj << +/Type /Page +/Contents 336 0 R +/Resources 334 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 325 0 R +/Annots [ 333 0 R ] +>> endobj +333 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +337 0 obj << +/D [335 0 R /XYZ 90 757.935 null] +>> endobj +338 0 obj << +/D [335 0 R /XYZ 90 201.692 null] +>> endobj +334 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +342 0 obj << +/Length 3028 +/Filter /FlateDecode +>> +stream +xÚ­˒ã¶ñ>_¡[¨ª.Á‡HÙ§M9qì¬]N<>¤v}ÀÐµ©)ËÊק_àKg¾ F£~wCm^6Ñæۇ¿>=¼ýû.ÙìÃý.Þmž›}´Éw*Ìbµyª6‚xûgQð폿ÈÀ4Æéš'?]žk[òø½-MÓ˜EZÅöקïþöôðùAÁQÑFé,ó$۔§‡¿F› +àßo¢0Ù›+a6iœÀ·Þüüð¯‡hzÍ,Z\3NÂh—ñ5mïÒ 4®××ædš~AOwtl·ôS´ PÆdÏWä´Þë6j¦I±^ìș³qœÍ±>Ô ùðLE GšºsۙE¼lôi ª)´C„rìKwáÖÌÅþ +¯Ñ—Ù¥6“,øƔµ7û$å<à ®<¤”ÒñøÒT”MÓéʐ¾i¥Ö¨ˆ+OX6ˆOÒJ$â kO†G´Ÿ‡$4ß$É2@B;î„0{Í2i˟à²)Ôâ=ÕÁƒpj÷SC®SJ,E0r†ß‰:qJ¹!‰‹QŸSdöF~„3 N¼›J˜¶1<¿[@˜Ú¦C¥…8§h^Ë8WM,Óh +`m +Âzƒ¬Ò{“’<@1h:]öO\wÝåtî—û£Y*0›™»N0@”ölÁíßÌ,H ÅÜJQ4¥9+m€jgÆ°>ސbÍô†tàl.0`ÐyŌ†Ì3€>ËÀè´\£>Æi¸òyó®¦Ú1 R +mó(î÷´>†åYe.9Áþ:[I¹Û£Y'‡‹πù˜«XLŠ*¤ØœûØ{OFK È%òÀ*ŸÇ5áK1‘«@E!˜`žßÀósđC)ÈÃWÊ^…*7ž+†Z²,͝ì«ù88k×3¸=,ð%Ë)š?\­ð¸Ã4Ëì)o,D€I[Ùù2-Ý­õ~Jªà8ŸTÁ14uKç\|%æΨDÈÆD”Q0ý} ÄÉ;|ëûցÐN“{/ÀCQIQÌJfœz¼7Èmy¡ò…ÕQ¼ „sŸd¼)Â&–Æ)yBvÞw¼Ï>—c+¦¡qÞI=¸ÅŽÀ±[K²ŒÅ‚` bR–H^ã‹OyÛyޖÝZ’ õ!Ϧ14]³À¡Ê3Ûѧ8qØDʶd(Ã0a’‡‰—¼ä¼¡S­H©Ë®|,ñfZšõôkZZíÏÉڔh&V©4Ìj”’ÞY‘Qáô^j¦ %Ý@uY¶Îc°§©Ô{¥Ê|ۆRãñ§K×3=ºÈ2õe·BB¹JÒÁî‰Ê!Xîڋ+sgÍ¥ ÐkbǨã{êXÂàò!˜y\¹ÄCŒB$hÌo²ÞúENJšÞ"g%ÅãI$+[ú kW°3'‹´(©Å>Ž#cpVXؾÂy¾ù£;¤–ÐÛ·?vöLx´®òTœüóqÞÆJ<æ‰RØR¬¦´èäW3ººÃ„ƒi>ÍKM”O÷PĔFw†‡º®yñ7ÛÖC—¶“ÆË?ô"¤tH)¥ +&‹1† `~ˆH¸JÃU,Emy©µ“KÌ_`Ä/°k›&z;”T=¥v6aV<~âtöhM¶—V +”a_(q¿¡fz‹6µçž`Ë×aX“»Ñ²¸½bñí÷#=Êb”HÓ¥œKâZmΆwôÔ7JPÙ wþÝ  ¦~Že¾Èk¼*uN~wXó÷ÇñB¡­;ÙÖòS9$Œ9÷'òD;Ò.¦†‚ÓgÙà*ŠéÛÕ +ŸØ4‰ƒœõ©Àÿ¾²‹¤Éߺýã” Å1/á‡Ö™iØOÀ82†„±šL‡G³”S[ÍlçKy¦Ñ(OŒ^ëA¬“>fÚbăDª£ù„WœõC¯dJ¢£$’W’¨ðö»Ÿ9sÄ:Â/ë¦ï‹¸BZA/‰‡n°l7£[m»®çÕޞÌâ"óŸµpé¾iE¨/²äò+f2µ²\¬0/†ßŠIÎÙK䧧bÚC®ˆ(›ˆqO[Ü©!üEl§ÈÄ%ó½oÈa×ÅOI‹k{ ÏÅÉà›D«Íƚ½‹µR‘R<÷¯¼q²4W}ái õÚX¾àäm1Ï<}€ 2úFú‘N¤NL¤3Ê¥¨!ÌIêÍ}KƒIFÌ¥©(¹—§AOu8Xü&šg÷ƳÚgŸ‰T’JWœŽìàXòŒØJÓ±3N‡¢'M'EO¶Wԇɞš 3ȳ¡tˆ½$*žs^H}˜¦³¨°âåcy³øѸjýè狮9bOBèBh²…JƒëZ™2¼ËöÔé“YûÑbRÃÌ “(œ½ /ÿé`W„Ñ®øÒÿ9ðÿk° ÷yRÈÿdû0˼Mû{þ„ j¦LÛúv4•Óþ÷ˆg§ç{ÑXœùŸðßëæå¢_„ÔwP©9N‹¥€~éŒûËôãùºE1ÞLÞ~… ˆ˜k4ê~6FäÂÂø´ñ£â}dãl*‡%bñØ÷ç¯Þ¾½^¯aم—Æž]hû·ÐؼIz!(¥Ò0W{OeÐì 2"¿´&¹ +³d·yÌa“òÿº-ޘO§züöŒq +endstream +endobj +341 0 obj << +/Type /Page +/Contents 342 0 R +/Resources 340 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 325 0 R +/Annots [ 339 0 R ] +>> endobj +339 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +343 0 obj << +/D [341 0 R /XYZ 90 757.935 null] +>> endobj +344 0 obj << +/D [341 0 R /XYZ 90 285.07 null] +>> endobj +340 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +348 0 obj << +/Length 3279 +/Filter /FlateDecode +>> +stream +xڍɖã¶ñÞ_¡[¨÷¦5ÜEæ6I¼;~“LûgûÀ&¡&2)ƒddùëS@PÍûD P(  +µKáîeî¾zøÛÓÃÛ/ódWÊ<ÎwO§]îŽytÈâh÷Ôì~ +âýcœ…ÁW?ü(Õ+Su¦žÜØé8Sˆ|Õ¤æ€Ó jäuzoÉ{ )§¨žE|=µœiöi¼Aô‰´¬@FA‹álj«ži²º l±8Ã#ö“,Ü@·ÞO'“8ŽHâ8ößUñ +Y|ÏC£O7ÃùpßoyõΈaßy Ãà©Ut¹Õ5fd4ݟðùå(+f£_ډ±õ‰— 4rQ2ޅÍgƒG‘NRZéÐer¼ŒQ§Á(uÏ7ÆbYèIÁŒØWu^+I/àóšuØgYê|s@Ö}£k+Ìl¿òݬ f㗮ﳕ3[ËSƒo¢wƒo#ßq?µò@!‰Q™2…(´r[æi8k+×í|]¾ÿ«k?Nì7«³u¥µïêö'üãUÝÂÁGP7}F;>†,…£ú‹õ±z!¼²Ë÷Þ6{¢NÃH {+!aY¬:r/°óÎÚÇÕYó½€y2ÃY.mÉ  º‡À·ñ:¼w0ãÄ-ØOƒÓW,kHäÝzò‹ÉÝ‘—j«‰×<.“ã1ççÿªZÖ,y 0Zt=Ž~HÊlHÊlHÂk©ñÖ¨Ÿ;Å(`[¶¤zX¨ZÔÃùÒé%´’ ¡:¶ÚHH½TfÒäarÕSë0ÆU’ppÇy,ú]5\ÿç8Nàõ„ò½#gΖRF"Îa±â©‡ãm:)htm2CÇŠ$¸]ÎHÃé-zý;Å7”| bÀ Œ`°“}Œ„Ê8ªiÜ!›ØwOŽ'× +‘è5¬Œº—tBß¼Nœ‡²ü–b·ucˈŸäÁ7'>ò>~Ó6¹`Å(¯¬-ñg =s·Í­˜M±\áëÞ1ü7BÙæ xò °†ŠcÑù²-¬72àÚ +ΆE§lÑiä'>©ä©5è4ò³ÜӍŸ¢¹að×M֋áÜSëBð…Xi‘ʁE⸀Sfý/û, dãwÇAèR& ºŸàQƉ¡mÕð€Ñ0ћ;½¬³C€Ì=g‘x1w²aô0o>'ܬ‚´âҒün&²„A8fã}x€lÁæ]i)b/åPJ¬ ûÖz\ûa±–å5~Z®’Gç˜}„µ¸ĵÁŒÞvDúd]“x³´•ø,-„]¨ÙJÃàEMkŒÅãUC_‘‡Å¹¢bÜ©ÄÌ{ßçWqp®n«*R¢3V +—ˆaú~šÍÔr}@Ž}2ÚæZúUºs”ýµ¶Ö–ä]UóË + Ê,¹€‰]•QC?‡alÎvÍêXÿQƒÕ8³/ñ–"߬‚ƒ®2ÉRI’ÔÊ#YªªE ×9©ÀQ,Ê1”ÄܪüKžµ‡Vxï·»PKb}±µÈRYb%µ¡qNn1HJdƒC‰†qn¥*™„œ ‚ä½óI|3Ðb ˆÓôXž´ïÏéE²P÷u7KPPşڀi>Ö]¥Ï ä>à7Ð6ÜJN‡wn°ÕU(Šë8ë ‹3ÁPHb’x'â¾im)À¹Áå{Éó݉IÀI\mÐðôYv«E9ÅW4.ƒQuݲ2°•)ãnqb&“`¬H­K@¨C†ÒûÍ:B,Wêãµ XX"—gl<]rg=}.'—Cà@ÎÉߣŽ’dþLJý{,)åI”Ôèg¬€!ß5œÅEƤŠ?÷U`´CÇ* ËP }žZÈt§fnè¸øSäÒ²ú½†Õu}2fÞÆ6,Â+Dߖ+yY.n:ík«ëöÎQ¯Äæ•ÏÕ¨æ“Åôó$0 ²xŠfM  s‡ÝÉ׆i\Ú?/HN0J¾ºëbñòIò¸DY0ÄRÊ8±²t¶C;ÑvF~oœS–OLJqð›©p¢GVq oí®2°pŽ¦‡_ÅÆ]¹m±™)qªÀLÕA$ln2©]+̺`€ba^&·CÞpÃÄVD™¼&§80}Vüõ<R}–³Æá,çªï]—IRd∆„nŸî#$yé9i’Þ‰¡Î#!Ðz$B0Œ ž‰'zb¯žÂAàe,óñËÁªS´:rñR­º×ÍK+¯¼ôäµÁK¯\K\cÏ­¸RZq\_eå}+®V\éåW¹˜Ô®A(ƒ5I·D«ž°ˆ…¢eÉ °r™ Æûёüô‹A` +/‘’šFž±ÔGdž„(»¤Ò/\V{”¬¾Êy՚‚GjۜŸ(2RÅSQ=£õh÷’+ڃ7{“dgÅm=/¶üA9ù—˜:À÷^*ñú…IjÛUÜú¤4«ä¬4zµe*¹u¬]sÕ ÃŽ~žõx2J1%î“dIÐpbãIb£Åë{Š7ÜjL,~1.âåBr +ìÃÄ¥4Ê +̧¹yKàƒš  ‘ÊÐå¼…ØÄP8a`0'k0  R:…mùà)®wêc¯Z>ŸK;P¯_^[ÀžÍ ó j'% Š'ð÷ØSѽ]ùGm­”7ÂіœÀ\ÞUì*æÜ#4r)TbiïýUÖ82h+Ònž’©S6zïŒp9µÝh™o„FõÃY÷p¯†š°â/c©M©£~–b`ŧ;0ÆÜyœÉjRö€ôíù ¤ÄxßQžaÕQ·'QMŠíŠÏEO–zÍänW¡_ß?BÐ{ÍÀ†®Œ3éJ$ºšy†-]v”$æ锥ÁÓ¾ub|Hr’6â¯1Ì>ÿ ƒŸ…dìp&?X¼Ø6prVµúÒb€ õéy}х­šqýGÑ ž÷ö§½×ïË- +îHNnžîÇé¾ö§ËCu¸m6'®ønöG¾Í®u’ÚBôu×:Y÷sÁ­}ìÝu7ûCaÇ¿CPuÙ{$7êÕ¹RÈr3ÙzQÜ7X`»k°pÝú)¿“„~Vž„\–!”Sï#ãh¾ºãö‚¹V]­7ô²@4ô~L“<:$p‘R„ð®'b /ØÆBhلEHÏãz¿daêçlØnÍ0¿´[^å‚«£@N/æÛLB®&_:›”Yú°…¹¦€0ûÕL7£}FÛv‡9 +Þ1&]ìÊj†Ë3µú€ŠÒ–"øÞ8­+*Ñëyĝ>`±eõÇ#9ŸÆ²l”ù+!PXK¥Šã{ÄÒÀ¢Î€#y¹£Ù¨‹Yÿ¼ZâîÉ/³¥d|V=¥oÓæzæ{Œ<[[/•fâÓÜæLiÆ¿QÔsWž¯~º;Šgfþá¦ÂŸ Qƒ$åÖJêJ :ÈÏóˆ<÷SËBšßgv©p™ºÖP굆¶Œu`©pTcy”–H“{N1¾#Eà8þUnµüªúTPxøní§ü”Ä Xt9‘X+ê#ψ3%l0¶Þ¯£çsÿò¸ÿ³H^¼ø³ÿ¡ÿˆd°ëP“Bþ#’•‡,?îúïñZ•9Kˆx?t·V5¦²9õ³Á?@Ðä[Ï dÔ`®^„Ô7Ø9;Q÷ÆžÁ-ø}‚Výlÿ/ƒJåei Qxˆ]ŒƒJ‰\Xwvôþ &óXŒ³üPDGX"ÛiºüõíÛëõz¨ÇÃÜë‹9èéíåÒ½]IúNPQ”ŽQi©œlÄ=†] +þzȒ|÷x„M‘í¨â™J½Ãý;þ.Rò? +endstream +endobj +347 0 obj << +/Type /Page +/Contents 348 0 R +/Resources 346 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 325 0 R +/Annots [ 345 0 R ] +>> endobj +345 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +349 0 obj << +/D [347 0 R /XYZ 90 757.935 null] +>> endobj +350 0 obj << +/D [347 0 R /XYZ 90 714.318 null] +>> endobj +351 0 obj << +/D [347 0 R /XYZ 90 597.999 null] +>> endobj +352 0 obj << +/D [347 0 R /XYZ 90 376.602 null] +>> endobj +346 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +356 0 obj << +/Length 3237 +/Filter /FlateDecode +>> +stream +xڕɲã¶ñþ¾B7KU~îKnN•í²ãؓÌ8U)Ûˆ¤$Ôp‘AÒÏÊק7€ _jrî&€Þ»A»Ë.Ø}ûô׏Oï¾Éâ]y,³(Û}<ïÊ`—gá1ÂÝÇz÷Ë>:gS_pï,ÞOW5}‰Ãl:DÁ~žp’ìσ±BySSÓOñL÷üTö¹ŸÌý¥{ّ—x;›¦Ò7 ü␦û‘3Hä +ByÃc™ +÷Ùä.G*’#«#r$ U<}8R ùÜ֖þl€wÖð~èíÀð2Ý`¢k8´þ5"ujÆ¢™”wfM­7'ôt÷‚!yl1|U¨ZÑ +ٟiÔ8ô<ž~žšV7‡(]*#ƒ?£Z]Ýù1‹Þá»3ˆ!.óým6ã¬ÐNâ,§¥ã¬ ¶qŽ¼àì¤oªI=Ã_ôteŒbÀ²Ci h2ª•GÍ«­Ì¥é@V´;Y¢ÛàÁEUxF{š›nêr¶&Ùêt_‰/c怮š Yrl­­ú +J0-Ü#"ÓeÚËB"kY–´¯™øbXp‹(­Ï!¨µ!$XŽC×ðš0Wܔ™t3òܣѤ[aƒ 7låµ/”+_(Áæé:ýöí’©cÙRIž‡ÜÉJÈJÁøk}¾3!9D™l)ŒðŠÑã ü¤bp5ÜðHv‘³ìN]nÅÀ.bß`^µîp‹w/ á#‚¬ ¢0ê‘ A6C§&]©¶½3ŠØùÖªé$žÇuG‰^² +1äŸå5Cô´‚;÷àq‹Ï“íëÖÿõ´éÒ_¡u.Rˆ#O +ˆ@Žøkŵ+£;Ý«i0w€$Bsf=ñ¼y«¤ûªë†¡(FDÂ;GP¶ì9¸õF¬ä¢.daqFwÕ'¡ +_™ºø5+†ß­4icºp”‹i€T›•h¢µÆ(ÄI«`b€âÔVSýó[‹ÚW„Ô..‰À#q«}¹’AB<=A/.!¦–Iãm(~óÃ=sˆÊWb)/lrĸíÿ})‡1U§î< Uá`ÓGs +VŒ~´Qz6 +”h½ÛM˜›e Z²-9 bzKꢽ,MIƒPL |™MÞíªAf #’>{‹ixÀud fR <ÁÌ'£¥NâèÐq8OÄ&0ƒ¦ü[aö媫+™ktêÒÓ~Èó]˜ÂS §a¦hè±Án¼Uې´By.úL<'^òȖNÁÔÊ©EoiÂ7Ë9}/™‘*( +ÜÙ[èD°¼9¶æt²ýŽ´”ˆÏ×;[‹ÜÑÞÈ^K҃Äúrd°Ôf8]’¡:”p³‘;–Ќqv6CÇ#"†œ$¢Œ €u$dØBc?„Æû_ƒ4Pðò”#_ìWG,ŠÙ§nÄ+Ž9c”6c[£\eŒrC½–îtç§dº’NJ!ëaÛNÕ²˄0p¦´¤È!îáÞ®ë˜sœÞ@dÊèV¶Åæc#^³mÅ)»lœ­ÊH„‹h`´ª€B=WMK§€g5t7Ý*\`d: „ë'¥ea–*íø(UÜÖsH>sßrä ^ 6ª{[ÈîTvû¥-ekóH³Ô'Áº>á`4z5JSË* h·lüü»2ä¥ +‚|³&øqÀü|ñµÚt£¥«¡d»ryðSãd +t¶rSò‡(,ÜÚVC-¸Òä K$€õuwƒ~¥¶tnçåe8l#ú9#^6Ö7õÀ-[示Ț“!ª×|ÑVÔ'Û&qƒ…-7ržŒ]Åh£"¾rƒóW íJ +}Áž…ôðp폣cXÊÁÃ8èüGÙîÃlÌ!,öͲ›­(Âó_ðä¦jꡓmV·°M”㤴=ì’'K„a6O9‡#42Pu‰PjÖòDZ2 Ë¿\Ö R`áõf3ñp0x`ˆI`® ¤9u1èƒÑ²¶U‚ÄÎ<UÉñ c¬u51ñ›}ŽÏ'–˜“@~p—IÀùqõÀO.ca 6{kPk9õ»óڕêqãm®^•hqr?nµ£¡ŸÛ`6òÆÈÏIæ#„Éñ,ˍº›ÛIõÍ0­À¸ ˆàçÔê$ó´Šx=!œF̟ÖefaôÃÒ؆¶ö²>Nؓ·Zóò}/ÕSB;s¯‰{R1ÛÖÐp U<ÅpÔü>7Ô½#@ +´DÜ\ûoô§×‚WöÙ¶Gl7Óý7HE¡Àl +BV#§¢R8H—=ÉÖyÈE <ӍÛÝ*ïWxÓ»6e†ÁB m›jb¬b˜¨{V-ד…\÷Á|‘£ææM‡½¥M÷¸¤{·e‰…— Ýi¶ågë xoHUI'Ëi‡¾½{e§’‰´èY|—{öŠ“Ó0¹”O‹C’®”˜µEsky¹Ì¹ní“]A*TӜ × +Xp÷“6M+õªÈéÍbzû*B.ŒY$Ÿ“bÉ?»@ªDïÁÝJu>7ù‡Ï»¥þŒÜ…î8BL$že^ºÎ–dœQ1FaH\¹eÒae™•–zÑ7Êm‚‡«L „ÐéqYŠ”ÏV÷ŸüÛb*÷NšðÕá^—u[e·×ȖV¼EÀ½gù€–r¤f× +•v 9-b&á¶Æº XY* « +PØ §,˜8eþ'@HM™³ÇvĈÌwª8QXAî1E·ÄTP’¾ÀÉúÙ® 'Šê¾>ädwÁÆpS­Ò›† _„¶Ø·> „ÉJ,Qä}4 “åMj?HI01c "tr½‡Yáü@ÏÚÌJۈpچ‰Ó6Œ=÷€SŒíbfC×ö +òœéYx퇉½Vç@a†ùrµ-=úfò{ÆÀê@ê×ûºÌõ®+ÑÓÔ²¶íFƹºþ¯x&}F˜H<ûg#‘Â^Zþ NˆëÒV¬æÿŠ[d…aC)ÜÐ(Úð®sG™¼XBUH~C¥ŒW†þ~ÂÇExÍ; ?HÙò…^ ‚l ÙdDFAkˆ¶F€ëj—¼ hüD@£ÁB ttë…퇙àî€Q”=Ñ¢zdA(¡Û1<¡ü‡À›6TEÙ²ãUÞ¸APàj &ÞÔ:‡ž7Eöµ¶^±Þ©n Co7S¨½`¯ký8Ù²ea¨œšn\7×â#ãfóûµBAÅa¾Žâ RžïZIPXyCªÅ«Cp½L…¿Àl-ÓÏÝ ˜L±ë{NÐ+)‡h %OÜ%G3Z2j‚Bþ~`†/1–Õ·³Ûú( ‡¨8‘{H5ÒÀZ#¢­5"b©ã_¨]K¼¶'-Tª†i¼Må“c[L %l?Ôô/“ê1ë:iÜI‡›|*L¨®Ør(‰2Ž†‰½˜„|fÓQbS^¬6D4ZŠ™D¢-@%9Œœœ ¿Îø‰\y/.…LZðLÎ^½+ÁÆ®}º/‡ßP*Ç4,Ö1 €uL£™"]âÌ 'üññòE@¾AP‘½TBëC#5[5!‡Ç8ó­êšÂ¡÷Ï*öO*Ù±ÌãBþ¤’–Ç4M¼ÔL 2 L'%Éû¡½ƒŽŒ²¹þd”U}ïÝà ZAÐUYê;¬yΤ¸J@Ð1÷ŸºígÛ á•Õ+» ŽapŒðæIj”• ãÓΎþ†ÿJ=£4;a(þ_Æ4ÝþòîÝËË˱s¯o樧wß­$ý ¨Ê£<,í*g›½è["Þsœ‡Ç4ÎvÏ9¼ºëÍÁt‹yúzü/ ôb +endstream +endobj +355 0 obj << +/Type /Page +/Contents 356 0 R +/Resources 354 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 325 0 R +/Annots [ 353 0 R ] +>> endobj +353 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +357 0 obj << +/D [355 0 R /XYZ 90 757.935 null] +>> endobj +358 0 obj << +/D [355 0 R /XYZ 90 451.826 null] +>> endobj +359 0 obj << +/D [355 0 R /XYZ 90 323.551 null] +>> endobj +360 0 obj << +/D [355 0 R /XYZ 90 219.187 null] +>> endobj +354 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +364 0 obj << +/Length 2780 +/Filter /FlateDecode +>> +stream +xڍY[wªÈ~ϯðmp­„pÔ9OÆ`£ÀÉš=1²ÁÇóëOÝ@pÜë짮®ê®®®Ë×t£õ>{Zïéæ!¸¹ŸÙfo¬ŽmÃî›ÞXë m]µ ½¬{¿+Fÿΰ4åi±"Îâ"L¹ózøH“ˆéyÅYCgdFŠ®÷ÿ¾Ü8ÁÍ_7:¬¥õtÒm Õ¡iõ¢ÝÍïh½5ð¿ô4ՏzGµë Ú´çßüz£µí´´ ; SÕl‹íŒÂ –6lå#æöPÆë[ M]©¶aÅÌ}‘ÿsú©oYJ)Œz@—UXÅ»8“±ù†Û0Šâ}fQ|ÁÇf¨üÝ×-%.ʤ¯+yƼ}\ì 4¥'{¨¶y‘ü7–eOù‰*ç6Úæ98\û½ÓuulÉÆÄxðp³-ŒM^0Qmc H‘áNm UÛ°¢9ìÇ뚒6±ÒÆmµ%‹w቉ϤoX2€³á +×뤂)” +ÐÏEõý°Ái›¸`_’”´„ +œñPyÎqÌ1>/Pôš‚ӇJ–gˆÖgßRŠ¬½â®°W$»=xt͝Úc$°ÔI: m”ïû°Î©H>·âömž®c‡¥´ÜqyHe¥´à¡ZÆ4É>%Fy´4å½wT¥nœ) +6 Uˆu î«ûè0“טh9–%ß Ãì 2Ýõ3`úÍ ž—«@:ݸ‘93n'‹÷Žå6[þ‹»x¼ÅýيãŠÕHÿöê9¾Ï~²•¥°Ý”SOpÓùêü&ý,*2: öwæ.„½VÆY"sÄٍêkÞmïŠ\8ÐmÚ×JèÅñ¦Ï  è>¸s—ÖƘðˆ™,`/̕41 ;᙮æ¿®¼×¥ï¨ÜC+¯yíb ™°!ÏõAjÈQN] ÈãmBÿWòºfÂ¦Ò 4¥P`àËd1uXBÑÓëœÔ‡¹×gæsÞû&ŒX©×,ö!W氘1” +E¢£Óêô”1Î̙îWç–û²w&¾¿zq:Zu¨(9bá&hØ|ÎÄ™B@Ðë–ò~ÕLÈÃÖƔ³ Îs8V®Çý¥´Ó¥ç¡iËŏà¨-8:OvIELGçIø‘¤Éƒ("ˆ1rÑâ|%°CÖj1§´CÚs8ð.<±%„}sدaŽÑqÆãÉsxò¸I-S[Ð`u\ðõU Âeƒ6¶a—±í–;´*´2ØlCòÛ5#êޞ—L¼,Ý)k`\ä_w|§ ºÙm âAÛ:8L üñ ÉyËâ‡Û¹+çšV—ÐM¶âd‚ä>R¾°s_t5¨&\ÇÍ'gáx“9ÎÿՙºÒ³P€º@ҜGКCò‚/¹€èÁbëÒ;La;P+3žò®èÀs}` ùaZghDVã ›ñ 1£ñE@òM³´¶W€u†z蜡~¬µ þb¡ù‹,›]3œ]Àç3՝d¼*6!òœó0ÂsÃT"Гmã¬étåÕW)ÚT窿’OwÁ:L®QÁ®57xv½«ÇÕ¿O|ÛähØšÝYãëÎWt| |ÆrŽ0.JÁlå3 *ÔÃyG(øÇ°jIeëC¤«Ð‡ˆê·WO´¯ô…°2ãÖ_MŸ™bŒ`zY·­5 { 4‹JÏaÕP½˯.^ Y‹7z .n“±<âÚ1A¶!l_ÔϏœC9 Ü ¿ÉñúR ‡ãk§‚G•Üœ §[õ=C.xªüÿ“bߑtÃÏËuëS¹ 8¢1õ§ñfÜpúûLNj¤.~õùM­óŒºØª>²Æç ?vïè ¤.²KÙI€0†©ÙðNˆÛÜüñ±Þ8m¾ü10Ìú‘ÒpÝzIÁÅ$ Y–Åõ#‚Ie-y` AŸ&ŠÌ8è5zI%å–sŸžÌ7SpŸEŒ ÓöyY&©Èä}.^GojbKÃý`=MŒ9]« ÚŸa´MâÎÛ¥S"nO.Ü¿ ÿDõˏ¼ÈlŠX8e¾©¤„sÜ&іÉöÔ)Ïd¿'RšWEòч›&~à£m˜} +ó5EÕ9eÉ®fs€7܂=PÖԚ`*:Άú¬ªL!;¤çÇ#FAR'•#È«¼3aP'h`Š[1—ümn8*­©çuMT³…yÑ©UXˆ6JÅ½%TBtõ5ó›¦))éĖ1ØÔôÖ¡ÑÑôÄÃèyVfn… cçŸ(=”rðrðmäëëˆLºò~ï3Óƒ‘j›UnóC*#¶!Fý|6þW,Iã°¬.¬ÁǘÎ"½Å\ñBšd—y$À·Ï“¬y¬Óû¸‹øR7‡Tá9º…±É!)çš'ôº½Ÿ íÞ È ¶:‡lÕ˛?­ib'Rh +¶ŸÉß5g+„¤ØO%w³p'ÚÜ| ˜Høüf.œ#É$“vÇeýµfµ,¾³TsþÔÀŸœÓ|_¿ØâL¼•LñC–gwö;ÒT{<OÐÄS‚¯õœg»k“ä}øº»&‰ÖŽ‚«–‡d{ÂdtBŠÐ égîh#A„DA?m‹ïñèDz—¯“ÍU[î©G >u¢WñaÖÞw#£Ÿ>DÔ?}°SÿôAºùéCÆÔÛÅå6–èœ:.¼ü#dTÍýè¡úG­Ž‡ü#È«–Ucjó́E;)¬×<=IEX?æ|a!çû©r€œZ  ~k\§{À†ð¤.´UÍ$迄١þ+†é÷¯5š +10)åráDZø…ñg¯¦~áô:oÑ° Hõa´ÛªÚÿ|<Õ¨TY²/Ô¤º‡ï•ûŽ§/¥ëu¨k-Í'×./ªá:¥«–i÷î†0I²8É`àŽ.êeÿ–Sz +endstream +endobj +363 0 obj << +/Type /Page +/Contents 364 0 R +/Resources 362 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 371 0 R +/Annots [ 361 0 R ] +>> endobj +361 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +365 0 obj << +/D [363 0 R /XYZ 90 757.935 null] +>> endobj +366 0 obj << +/D [363 0 R /XYZ 90 640.589 null] +>> endobj +367 0 obj << +/D [363 0 R /XYZ 90 500.359 null] +>> endobj +368 0 obj << +/D [363 0 R /XYZ 90 348.174 null] +>> endobj +369 0 obj << +/D [363 0 R /XYZ 90 235.743 null] +>> endobj +362 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F76 370 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +378 0 obj << +/Length 2614 +/Filter /FlateDecode +>> +stream +xڝYÝsÛ8Ï_áéKí™X‘¨ïî“ÓKºé¥I6qö¦Óݙ£eÚÖD½’¯ÿûP¶\µ›¹‹Iññí–wðéìrzvqùƒÔI# ¦‹AêâÈsBá ¦óÁ·¡?‹Ð~º{¦Æu5ò’¡RÔû—ζkU6²ÉuI¤Û»šžýuæÁžîÀ3{„±ûá [Ÿ}ûÓ́þyà:~š vfÖz¾Åàéì·3·#o8H@Þ(@y=„õÒA,|Dž#t³‚ý#¥UÜzҋf'+K×Ûrn„>'‚ÊaMEíWUÕæ8Øñé£ôm9ó1y¹®ð” âØs4LIŒ?ÜЕ ÍØë-³×ÜÆ<êËrOB6'"8Fwöðö‹ÛˆÈ±»LWyM«6•^VrMKœçuSå³m£æÝß>O¯n9šÝÝ÷†Ò6¢pa7ÜÛ¸þ_¸àó~ïôùñA(û]´©³æÔynóÕ¼MiL±al§ +<o¯m<:¤ 6¹ôˆÙ¦¿LUpŽÒ*¦œçhÕõ/?9Wö¾_oSt6ôšÕ(î7œ<K¸!ÞÎ^ÓÜ׆èîÞӗœfŸŒgECƒð>î;–I6(YÊ©Xˆ„E¤ÇâcHurxJÎËìwg +*£#"Ʉ¾’ÉFpWŠªð}y@áý6 Ü‚' ± ýâ`(fR[~켬%ç4¢}ÁÁʧ pòKUKŒKd< ‰k+—Ìêæ¸\'Ò3¸û>ý/&P‡ÔöqH¨a ç°§*ÊGaä$^ܳÚٖù¦ròæÀ|OQvà⌽Ôri/ͦ@ócÏ ýh0{6Í´ÂßÝãÿßÝ?p +endstream +endobj +377 0 obj << +/Type /Page +/Contents 378 0 R +/Resources 376 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 371 0 R +/Annots [ 372 0 R 373 0 R 374 0 R 375 0 R ] +>> endobj +372 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [314.956 612.712 472.963 621.82] +/Subtype/Link/A<> +>> endobj +373 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [152.087 402.893 321.452 413.174] +/Subtype/Link/A<> +>> endobj +374 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [225.562 348.78 508.501 359.684] +/Subtype/Link/A<> +>> endobj +375 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +379 0 obj << +/D [377 0 R /XYZ 90 757.935 null] +>> endobj +14 0 obj << +/D [377 0 R /XYZ 90 334.085 null] +>> endobj +380 0 obj << +/D [377 0 R /XYZ 90 302.157 null] +>> endobj +251 0 obj << +/D [377 0 R /XYZ 90 302.157 null] +>> endobj +376 0 obj << +/Font << /F63 247 0 R /F65 249 0 R /F50 215 0 R /F76 370 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +384 0 obj << +/Length 3712 +/Filter /FlateDecode +>> +stream +xڍÛvã¶ñÝ_¡£—RçØZ^DJLŸ¼×x»»q•6i’ˆ„,t)’ËKõë;7L·yÁ` æù³Ç™?ûpõz{õê}ÍÒeš„Él»Ÿ¥þlË8 fÛ|ö‹-nÂØ÷>|ù‘ï›E°ñ´æÞÛ*돺ìTgª’AŸL¦ËÇ?Š½ Zü¶ýxõn{õí*€5ýY@kÄëå:ŠgÙñê—ßüYð3¥›Ùag«0‚o1{¸úû•ïî7ö/öFK?‰y¿ÿ\l|V6±wP‹Ð÷~_±…äº5¥Î¹×LË­aÓØ1%«&׍`Vü휎¿ûJ0ŽªìUÑ^@÷– mµïžï©F_/nVAêít¦‚Ó˜È;8øM,ÓXNXjã:ab'…k/—‹XÝÅw°Dyê¯nªÇFܪ¾È¹UGÍ­'Óy<€a&2òw“›ò‘AÝA¦´ê(ôq¥¼:¶AuSG ‰(,gg½ W)D·K˜ °×}Ç0¾§sá‚a¸¬:æh:¼\šT½´„ë¯BEɔðNÈÃÕ)ºN +°à$ hìüÑ-¥UªæëõԑÂ~\Ä°¼Ð-r.¨Úó·íwÿÖYǝ£ê:’YNÈ­=*{gußÔÕÙâ·l»¦ÏFbé4z¯]fz‰ë_X*ÜÍz™„²›@¤æöþþÓݛÛ×wŸî¶?3™Û/oÅ\½{÷ån{÷×&xfJ,ÁÜ2¢µc¢§êº0ZFÈ.Àw Ä`ùâº>üÊåÁð(&7Qœ²µyFBç¦? +iád˜Zà–Ì`\؃êBetÓÐÞ -T¶‰Û˪7rjÌãT`㪂,Jw«N¤ç?W쬲¸8³C+ۋâm¼¾"ÑsҕæØ2 %ÞQj€{åþúìÀp5¨7A`»Ê®=vùÍÔ)ŸLŽæ6LA˜*:¯*ºÓ Äp€Í Å§/G² énð›÷ YUÄڈi0olð aË^.·¬ Á…;Ì k¹ß‚óäõdD›±ò¿ó{KøDsësç×rϺ¨a K'±'0R“€w…ŽñB`K\Fð ­%i Gý…Ä¾ugõq§¬.ÁŽÀgC”1´×å®0Z_[qÏyÐ&îMåyF’“²EÃïüTõsäO”z?/Üe/Y¦ëŽÛÌkhƒ»€ŽÙó÷d§X °|óWÞ±ÊÍþÄÃd„à{.ä+8÷K”²gP ¹FëMƒ:5eJA?LÛÐ +4/õýœÂû û^ÔËuËhóÏpš_}?$.Ɓ÷àXà`À:s±´{<²•.îµ"9ŒÑ÷9ž‡Ä,±½€ÑIbÁ`Õwëªq,þÞzãkՆ,æ´á2|"Û5;ÐÎãõ¹ïà0†!lȔU;råù+‹ÚUi QCòG6xP¥nf{ùØ«G}Îóxày$ÞüA£‚«æÄ}èvÌmì‘JÀWñ§„°)H]ƒó5`/f=ñö 0øfˆ +Òjñ–Øa-´á4F¶3XI+×ÍA“c—¬è'­fkР0sɹ£Ûb~FÖªƒ6˜f ä®LÍ@ºÉk3'h°O\GGÚw‡Š³ÑApõÂð_1DÌBƒâS–JÑV§üՏýÊzªŠ½ Éz2æx x¸œRFFG,ê08Kñ„DÑ56÷d hOä6!Üꈱ+f¬)/'?? :e> zJ?¥ýo}{̓dßV/ú{G(|‰ÁàQôýZ5Clt‹ñ"˜ù4ü˜ WŽ‚µâŠ>à? 2J“JÁ:B˜>,v £BC<.²$þOxÂ-áDäpÂt=°w‚¤xÄj‚Hèà ‘HW5&£@>Å\¨,íæqŽˆ~šX»ŸŒñ:ŽWBoÄÅhX’˜å[ä5.>qKŘ&×Ö@`ÞdfÔSTmŸl€Ar ûwL`]i `¼ÍhqÏ×t'} +1;‚„a~W.VhyCœiIÀåºÛ9w)ۊ ¦ÉtÓñ3Ò "ÎîIš€ÍÎt…n/(qòŽ|¥:ää­þÖ¿póŠ=•Q¹6LmËC"òėx#ñ/¹„žf`ŽÑ´$cùóg¨ð Ê“áÝ#±õüÄ­ýÖA8 ɤ“:V½-ÙªŽ[¢?¯lوǺû,0¼ëL8œÂ–næ?Ô +Ø>ŸŒ“Þý¡Ž5ç¾x?qåß_;ªá‹ÝEœg ÃQ*D ¦)³¢'Iì!©]{·oî–¶"•”QúÂÀuæÜW–"ê߄’óémrœB6*m´rÑïáÃçO 払÷“ôìK°©øî©8Yà3s‰à·Û·çÅRÉJ¤ +ù Äà¸ú µÎÖà%`œzßo?ƒ×ütͽ{ˆ1²Æp7•TyãÝ¿}πñùÁ,ž>ôGz™Ø¹faX§ïQ8ëOٖ +V{R~ñƒcOÇX<°F9\z‡Þý—RºüéÍ{[2Íyìãý‡%ƒX<:ˆÚ­ý_f›ò®g¨VSûfJ´ÆÆãbmtcÀ±‰ƒT%¹Ä4fۓ®.ÖMã!Æã gºm+©eX±Â™|1‹öòt0ô “ƶzBÂС +;Rgÿ›¢×©ŠVÐ(J) Ÿ:‰DVtœpó\dñb¢PxÚ2b8’L€+6±$™„æ™L†›!a™l;ï3;s'[ @„Z 9]tåË}GsÁÄør*(twÏêÿñEaŒ 'ÖR¸6„|Î] +¬¯9YÙÛ"–âÏðhL5´ªú*xC¬ÉÖ¢7¾v­.öR骋¾µÕ2´¨¶< ÷̳OÙo#ôð¿ÓÂkßàðÍRžå¤vfv…MðIOrùõ‚MŠ¿é=ŽÜÀÇÿ˜_i´¼Íñ"UçUã¾ マe4kz¸Yù+ïýBêøî«`{NbÔjÄ!=™,ë`’0xïôâo-8äøçtØÀåbHœ]ût”tÄçÂ(®p¬Ç§ŸDž÷æ¯.™'kD,AÐÁ°mÅEa8LFXfNÅë°¡¼KMЖ@ *÷üÁi'"PŽQC 2àTù酡1N™ÎhÃd,ÀQgþ®¤mQÀNõçÍy`àîð#=D¢ç×ĒÖ@Á@›“9·vˆ=ûÿ hÚ˅¦¼ÑD#k!_ ¢&C]؏,ðÂKÚðŠXd|¥*À¾ñ Ùèñ3åÅÇ¥Q"[¥–}R{‰øø²ñe¼/&zßsý˝ÚB¨€!FËÝ=jøoØå_̒ÍÒO6öföŸeÉ2]GùgYœ.ãØ-²¡°ž€æJ·*NÙ£üCi׈Ûö½Ž'’a9)÷îÀÄ6ü6” èÇV7®Ô–çyl#_¤~3>ûËÀ_†˜Û?Ph-|af|ÙÖßðÏ~±sÄ0N–›` CtÄC×Õß½zõôô´ÌÚ%ˆgÝ,M÷ª®‹Wgœ¾`T¬–ë µTïu¬äl7Ñ:XÆQ2»YÃ$ùc¡)ÙüQ˜vqÿ؟ +endstream +endobj +383 0 obj << +/Type /Page +/Contents 384 0 R +/Resources 382 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 371 0 R +/Annots [ 381 0 R ] +>> endobj +381 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +385 0 obj << +/D [383 0 R /XYZ 90 757.935 null] +>> endobj +382 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +389 0 obj << +/Length 3631 +/Filter /FlateDecode +>> +stream +xڝZY“ÛÆ~ß_ÁڗU"„ Þ$˲ױ%9^9Ql? !‰ÄÐ8Äðߧ¯ÁµíJ«0èé¹zúøºAwu\¹«oî^=Þ=«³‹ýxõxXíÜU{Nä{«Ç|õË:ØlýÈ]óö7ÞÔ/]kÍo¯M֝uÕª¶0“¾/2]5Ø»A´öÂÍoßÝ}ýx÷ûkº+Öˆ' ¢Uv¾ûå7w•ý»•ë»tu%®ó*ôx–«Ÿî~¼sÇûÜÙ~ýÀqãˆ÷«`á4]7¿º®ŸÉ»Îd‹ðR©3î/Ý­Ïo ۇ3e¯K³ñ£õuGëg@Û%ë¦ËNþû^˜³ÌÔyQùµ5ò<2[®ñ–«çrúµ'öC^ûñĺ8Ú½»W7&UVv¹fê?QΪ®UÕJ÷ë¢ÉJUœuÝ0¡Ò(øÿÊ4´¡Øe!¡2-¯§‚šM«@ÕZÝXv·ø$»‰á¬ÕåRÀ=fÌ¢%O–L†ƒ9p‰¦Y€evœd~`Qµðf ­E®kºƒÄí—ÙK¿ÈIz÷7¦ÖúCª¬g’Á|* È©5~¿ñÝuGš­MUÞ¸¥H«B˜%}Ü¥ÎîËeÿ¤H¸n<{D×‹Í6ò@É+)ÓTÍÍâ R͔Õü¨W\l‘ÔpÝ©Ô°s"5$ ö,è¤ðDÖ2Q=­š~ÆSˆ~«J'%ý•(¶> S9€mð»5Ñ/—¬®74ï©9ˆ¸Éfž}f>ª Èîç¯ÿñj¸ë—›]´~|øçùêÝûo¿ái&×N#Gþ¸ñ`ràɪ‚4mºàÅܘLçE2\_[rïš;Ù½@çȽU‰ÇÚ»–3xÖî >5ôýµ.äf+3g¸¬Pe)¬Fz*SM:É­/ÜÝ¥6¸Ðç‚u<­‘Â\"_ õê ^8À¦ébF'®‹ã©efö0ó¥Ó¼šeoñ0¾wÐѨß1qóÚÉÈAÙ:æ1vŸzéh#Áº[<6j gλ ϋï$qd(KnÀ‘ +Ú~@6%lb3Ðâh#réC5Ƨµ97F¿’ƒwI +@ºÂ Ñ¨él+µÌlì +¦‘=R#RÑ,­×÷marPF狋ß(Z¦t$= ´:;Uà JáÔªéj’&¼‘4ÉìAY»LÆ¢>áÎÓÖ¦”yè*Zk%Qªg և®f9ð8֏ë0̱p2>œ>°a9ëWŸpÍdRqxN­ +d%éú[†')à x›±/3qjˆ´úÒ2 æbµŽ(¤!®ŒÁ/;©ê(›8Ø]ð†eõ‡óã: 1lîF¸ T„0BՕéŽ'q’ÝyOâ¹>+&lÓ¡ÈIvøOU6âY¦´ÈnêQEAÅ'EµP‚El1Ò7\•ôm²h©­§ïm _º*·çè·Ñ0(]Ø`‡Ö"#µg/EúlMnOvréöàdJy©_JÛe¯ëOE Â†ýð–Ÿ?¢:~ØbyùöñáñãŸ Ò ? „í±9ÉK]TtX|éMڀ…]Ò´ž7ÅAãù,¸ÂgÑyaµA²uÃØéæ`§•Q֝.†ÖQ6òq4ã+ÂÈÓ<×}&Nœn.I-– öß6€2îÂD2—ÐQëß»‚ݼ}5Þ?3?nk²m#k²’àÖØH ø­4M¿Ï?tG~È2÷C&1 ­ ÔÍfQa¸ÎJ­jREÊ'®’A^±/Ǽ‚x:³0d~>蝜ï—758èíŸ13ÉÈAXü@8à`Ùþdòœ bᨄëW*û4_é³U‘Ä>5…‚ÆÆrkº(¨ºSpׯ A&™“/[ì|ˆÏ +œÈv£c`烼I`…Ë.—à[-#kOM€ÑÞb/ä, ©"aäÍf҂^9´.˜äZζÝ6¥‹Ü{ÈDe{)+0’5ø²;ÏÎãp&3"h¸¨!A®! T\mVò¹h@‚k׃àĆTä&X„™»ªèš[p<•T!u-vŸÞm"±—§“4wïv`#@ý"œ…âó"`*!wâhÒ ¬þs‹Fc 8ÃÎҐWƒ–¥à8çøv™Ô%&óÊma“÷¸o”—Ö1@ÑG×t¸õüM¿K i‡€1ɵBÏ~QW[@gCí32:ä–9÷q„ÐFH@®›pÄ à‚f`hó})˜`C4®ìƒ“9_€6lƒí™Mà0ÎÐqZc¸ÁÉdفfš®±üÄjHË\k q9›“éʜۗ®mç©™ÉTZ–›gIKäªE%;÷IÛXâvk$F՘JÁÎ8Î.¦º*k;B葻䍧ØayQuz6ÜWŸIÛâ‘Êÿ£2)DRG=»Î R±è;pÇHEÀ·¿{šÒ㻋ú½ÓÜ?€)ÇY)#ã(3ò;à+cdcì€4ÆA8ڕøÌA‘.d(r¹mקڧÊNàݶ˜½Àehî "b­ªæªGbr½QBOSˆ/€&{§U»€fÏ?(*èyœÁ¶ÌE¦æÚ®?œuœØj(ˆâ&1p#5Þ̶ҭÄŒ´äÞ¦¯/D¥3·¤f‡M¾%à=êJ×䲁:šiÛ5|Y@f¤ÍmªêÐN §jž„’[ åœ„T¥QùÒYìœÕxÎ-ˆ©ÊU3qzäªMk2S6üªø§/5Æ9̈́'·Ê\C™&fõ´ +l Hw‚µÖSNI:_öæ†Þä£Èf(¡dâQd-5‚¼¯mÙËBÖÁ«y6õY êÓ`Ÿê„Ö™pï¥îr1oÀЭ¾pÚK‡ôsîÅGVü:1fԎHÀ™g:(y”Œ²ÐT¢F²PEí^ñc[¾Npc¹Ù0S‹«xɂFé؁åZDŽR)®Û):™‚U¯`£†^$±òNmV¹zÓðSrÕ¶À•€´L\I7È¦ÒL»Öä–:ð=ZXC#úmíºh<)Ðâ¾^È©;ô`ôÉ!¸fm)Ó¯ZK̀WYôˆàõ«V“éƒ{«Š²Oþ¦V%ñB3ô˜Ðã„{à^À%ax"8À蚣~øÞP÷=_ªVˆ(‚˜ú­x6”{?• •÷ ÕQÒ`jYÎ2f!/x»jÒ(QԁÓVZ|jäöqr‰ð 2«à|¹jól*Äc1Ôªz±ž'Å!¶™žnge "‘¨^.ù€-Ìíos¸ìÙçÍ¿P% ¥Jòû×o¾’jú»·?ýAEäi)L8,߸=ÒøÐV §Utêä®LNŸ=éŒ@þæö†C2´Uèp\vG²-M…ÖU„ñ´ 5šB*dBõg» Ín^¿ +Òyå=°%flñ]¢7Ôèu´í—Æä¸ð>;.PìyŒ :+Mî"ˆ¬»…Ö¨¨Û­ù+Ë´X2Y?Nô–%›Mle +ÚgŽ9–NºFQ—¿ó‘O‡.õs= VDeùügÙtïÌãäéZ““ÁûD€K©”Ýõ4«ß“%š¦Ñø›Úì(n 6V´b0•Eå¬cϾXËÍgÛô¤1«ÛöÖ;9¼Ïö‚þ•`ÿV°òb' Ò°‘òIõýhÂ4³ÿÔ ãtóKgÁÌ=ßIüžå҈å3‹EYn4|´gú{©:Ê%Yüé%ærk‘)}\™åë(C!ßLÄEK%Óehˆ k¡ +An ßs»qÿGÞx·#íÄÅpo¨'[9íÄ xB?é?éø‰è{BæHTp =#‡Ü0žÞ~ENY©éÓ1yj]ËÔWiõg·Ø+õå;v4d°I,Ÿ«­¡AþzÁÔáïzÉ8‘Š(l¬Ù–…ù… B¾Aà c¹ò e’@J,ôdæ©°°c½@×n +8ÆÔ[Ê[°:3*ØI†¹Õâ_6žÇqt‹»èú\4ýçÅ`N[6Ž­·s@ÿ‡=½ú‚=óµ,ß”öb:YñSò5obPðj Š46aÉàb#¢Æ dINñ)Ù7´à˜ »ucÍ´åÄÞó¨,„ÿŸØÛ5ù«`)YåT\dü¡7<ÌSm¢¿%M\7}–ÿ–ÚÍnæß cìßè›3V…ŽÚ~‚ìñ°Rxݹ’ç‚ÏíÄY÷KB?˜dŅ¿›ºöpÜÇß3][0îïyþׯ8uÜ8ý«ÿü²ÿøŠ]šÿñíœ(šü¿´‘¯¹>KØyoÊÛIçµ²ŒØת– ô| ò#¤¾WÕ±S²>TÂèŸ%m‚û®û2\TÕ§ÐK=±×ñ\Ç€î'måÂÂø´²­¿£-D£#B²ê¤^bUýÔ¶—ϟ_¯W'kœ®*.µS´Ï/—òùÌ¢&‚ò¼ÐI¼Þ¦6Í!Í&% ω‚xµM`gKEÀxVí«†{üq¤ÛC +endstream +endobj +388 0 obj << +/Type /Page +/Contents 389 0 R +/Resources 387 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 371 0 R +/Annots [ 386 0 R ] +>> endobj +386 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +390 0 obj << +/D [388 0 R /XYZ 90 757.935 null] +>> endobj +387 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +394 0 obj << +/Length 3100 +/Filter /FlateDecode +>> +stream +xÚ­]“ܶíý~ÅνT;ãÕIÔwû”äìÄNœ¸s—v:I´÷VµV’õ‘ëö× @‰ÒjN|O"A_”³yÚ8›oo¾~¼¹{z›ÄNBn›ÄÙD¡kÂÝ<æ›_,o»c}ûãÏÔxÓnÝؒ’z÷u6œdÕ§}QWú¡ÈdÕ!>t¼Àrƒíoïn^?Þ|ºqaMgãª5‚ÈŽ¼`“n~ùÍÙä·ql/‰7ϊê´ñ…ßrópó÷Çä7p ~]×·'ÚD³0 ¦5[۝'|ëW'pÒ²¤N} oÑwÔhڢʊ&e|:ôǺí^AÏV1RÓ÷˜ò¨ƒÜŠÀz–-uûcZ飨߷n`IXÚUSyÖP•²ë4¹Dô™z­,eŠÃιx…¶>iê¢C!‚v®k'ﲕŸ†¢•¸Q[ YKi³‹m?L€ä$˜úW!‚ÕâàiˆCÄߨ —¢¶ùšäµ@=nK5·pòE_r·IŸä‚¢JOzðaj†}YtGí*þ}(e™Sÿ[×u-Ùv ‚¯„§teÎ °–ÂŽúÞHë~+kUbpZQ É>´²“-)ó‰Z9c4«›­ëXç¶x:ö,ªº‡+Õ]‘†Võ•Mù¾Ï› +ÿĦ^_ِ뻚䫏Àq-T~á+mš¶† EšˆåvDÛ¡ö¡ni h}K Ÿn¦LJÇóçÿN3uŸ±××4ˆd€º'mY[P¨·€‘ÝRF ›Ðý‚sšwåà[‘¦{[eåKTÎ8´ŠÓIæ(¢b+=ôŠý(á-l¹À±¨Y+%`9Zۑ‚&x*”*ª§ÅÌê*dld{*ºŽl7à@²hgvÌþÌÚ j¡UO,.¢˜_D‚ U®vfŽ‚½žðX݄”Y኎Zì–﮸°È‹{ɶ˜ùª´ÕÞE_Ä¥ù-ºY¸sa~]ÌÑ°ÿvýĎ½uòü˜$ŽŽ;‘õºêÑ焺ýT§nÏ·•Dbe +Œ 1:q&Uʃˆ4çb\BEGˆ¨ôòĜ`dˆ&ÉR&Ãh§'Rš™ÚŠx\%™¶¨ÞÜ­(ø":#`19"<>8Ok¥·ˆ"¼`i¼<"ð;×{šM}Ýi6#àÁî$† ÇÞîBPž·‡µð –¢‡‘j©nõ§  ø/>CŒgȃ™Ž™ Æ ‡"«œµRùcDՕ$âé`:ŽeÃL™£éÐb6wÂWžÌ +¨ˆºEݖH[0hLq9¢U”Ѕ€ÕȊPJ±aF”€×~Å~ë(y€ÒMÕà™H’Ë.k‹={đ+ÏT…•cZx5#ºDj3qaõšV’®M—Õ˺wW£OšW|ií…F%ûg4ruû`žk +¿@¼>U* ŠT˜§²p¢ŒYÞ *ªÙ쎙ŒEòaCÇ!jâ,£ÜȕQA}ÔÁ·iÕ5 Ž°ÑÝ¡àÞf'Ek8ža³±§®>|‰!h˜÷à Ùd¼,>â02.E'gÃÄBJH_A*v—²PQ]Yšz$ h̔eEÙ5wz16¹ðU¥ ÜC©öÃÛãƒ×~¥¤'Pi+9 Zj’¦ ƒðc†ÐY*6 #-‚ˆÞ=h’3Q¡¸6 ­ºÑ¦-Àl®xªø ¼|}â™Ù@×ÖC6‘jeˆ„W6Õ52’ŠˆÔñ¹–bè GԆšhóšh±„ûH¸8‚8vª©Ì0“Ö#šXË#ñz)/ž•òŽLŒyfÕX 0•‹KokøZ!Ò"G'“¡öièø¾î›+Ó1TŸôâéýg<”b ®‘ð‰5#Ç:ǀUŸ°AŸÉԉ™iKÓ¦ÞáBò¨ÚY䚌÷"­Óõ@G²§Ðá`Œ:Ҙ• ô¨‘ª®hجØäøËb@ögúêSWU «/d&/ätÑg{Ÿž*Ö¸Tgrø•GKÉct†9–ΐŠqd"¨%¹1EDŽ~öD6¥d†Óf·šò´F-™£•ýy^a­ÕòÓ«uō§ã‹g;*:X«šWÛ¢@«b­C¡t¬Î QËçº\è–/X·|OW6…Ò-è7iש·K„)™âCnC}ª~z‹_Âqêšw<]ÇóS÷2勪;âͪ;žl¨ šÓXƒ%.mpɸÇK6TÁmͦ#Òµ¾† ã’'qɓÏËè4d•›220dÝ°¥y½XÂ]>6 HE¾˜&š]!èÏ£³])ÒOUyæµ*y!-ÅÁÊö×à f\„+EºŒŠ}W…·:×JŽÆÔ9ÉÓî…?,ÔÔåù(ó6ÕÏyûVEÂØy—¢üÉ%3´gÿfy[A¼{PÕH-÷Ÿ!‘0:ߧՐòOx­/J~Žíxu9îz’åBÂø¸Ñ­ï1Ï Œ-BTkÇîø›Á±ï›¿ÞÝ=??ÛYgUÑ´vÑß5My·È–f‚Â?¨"w̗ºNqÂ)'7®xáfÁ W?óâc|z™±Á9þ‡­  +endstream +endobj +393 0 obj << +/Type /Page +/Contents 394 0 R +/Resources 392 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 371 0 R +/Annots [ 391 0 R ] +>> endobj +391 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +395 0 obj << +/D [393 0 R /XYZ 90 757.935 null] +>> endobj +392 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +399 0 obj << +/Length 3140 +/Filter /FlateDecode +>> +stream +xÚ¥ËrÜ6ò®¯˜Ò%œ*kÌ÷c÷äX²"ǖ²Ö8©­$jÈÑ`Íǘ 3«¿ßnt)ÊqÕ^†@³ÑhôÍqW+wu}öãöìõ»8Xe›,öãÕv¿ÊÜU{›È÷VÛbõ»¬/üÈu®o?Óà]·öR§,ivÙlú¼mC bW6ßÇn9^¼þsûþìj{öõ̃=ݕ§öˆ’MD«]}öûŸîªøû•» ²tuRXõ*ôxV«û³¹6¿‘;ã×6n¿ÛƒÚÚwò¡?´ÝnäJøñè9ySÐÛãðP y(§¾Óî ±×dô iV´ôlڞðžÐ„¤‘u~Ïyk?rþZ{‘ÃôŽeW )I\¸°%ÌA–šR):Þ%¯K‰âƒ³_xÞ&‹øû¶#a«cìDÿDS×OEž¹”e×O߉úXñº²)ÚN–|NÄÙóºYg¬m!þp]¿,hþëÚó<§ìð0dsfJÈt²‰ý˜Ž6ë‹Às·w¼¹½¹½fº{ûùãÕíöž(L”«)ð±ÿ o,tc§Î‘/7qvmý š’ ¤8XŠœ“èo££aÁ(’pº²*s©N/‡¦Ðx¬\@a徂Èe‚¢÷ý2rQ¢´ ¸ BúüÀ‘åŽ|'ð}'$XþТص٠Hiµ¥\BHJØ +BÏ9v´\„wyO£'”D³«†¢$"šu +HsÍ°TU„Š–1A½iÖ¡ l€ç¸X:kŽZ¼À¹§ÃJœ…DÊÓ´-ÑF@'µç0†ÑÕÏ@£<¤\qÁ¿{C¯&o{2Sî ˜¯…×- Ýâ´F#í¾°—qXÊÊ`P™øˆ#0}¥)ºp¤Ô¥½+ÁƒM Al< +aSÀ€áoë^tœƒ}öRÈ]•‹,dcX·œ’ÂeÙg€™u˜5¥†· +I øõÕáØP9âÊ'ïéÉþ#ËRX=T½8VL춱äMT„`£"[!1J…† ‡’ž]y¬òr˜Ä#fì~ý¥iQ¶§Fq–je%yçœG¹ÄN3Ô°O¤LÑGKþ:AÀ¥ç¥ Yügý˜‚uê慮ͪKZ”Óc0)òÙy|ɇ<å tž…ª)Yƒ¹§‡Ïyƒ»¤Z ibç”wqÔK1.¨ƒ¤vŽðX•À ¾<WNA¸ç?0Úî霦ꌩ¶!h™´ƒ$€eT€g%œå:¬&'c‚ab) + 7¡ÅÍ?qž‚„ÙFÐÜ0*I¦1ž7´Ï‹•„7#ÿf§m`ª “篣íbr¶J<91‹8ÌÎ/Ë¢²zεœU‘« F”RýÄwÜçŽÀo°æ¹¾þtuýf ^Œ¡˜o#7۟¸ü¸½¼úå +~n·ú¢ ï>ýüÁù ª^ÝOŽ¢Ò}&ŸuæG¬Xfm§­L̉›1°z«1ÃÜ"ðCãS”%ªyÏ[°=«(Z¡È5^a»©Ù}¼G-—*„¹ÂVOžçôø Ý¥­upù:¾ÆB",§$&Ž&4Á2÷PcXô\,•~IF<Ï-kêËs‚ ޚ¢£;úK‡ž@`“xÛZª”(j¤Ú…Ò`¦Qx£|žÔ\Œ² .jéY‰ZðK¦°‘ߊ Š)IhÊLÆmÃq[ôÉæ‡5Ü<¤Ù®cͧ¶áýOä ö¶¶»:³úi:ê§5ÿÀ·.B°ßeC`¦™Ú& 3Á«L$(/ÊšÏ5¦jèT‡˜ÔÊUˆ]´ÊÜaÄRBGêŒÄüb.²r}°¥«Ãœ+^ut¿téöÌ÷ +³¶–e5ú¤ª#_rÚE6žÝK.ípöì&¢îôº‚€Á[«íÖh»N\ì ҕ_Ñq¯-“;y0 è¡|-#CíüPñN(hÞZ2Ha6IÃÙå˜[Â@Ý^xaa.hl4(/ ¸¬B‘’ ø‚©Û ‚yµgÐ^#•À¶LÇhKfçF70;ÿ€Ù÷ÉÑlù2–ªMðÝo«[7k™ÝMj±GÎ9 ²4Uòý,(&ñþØðÌ¢™a-z˜O1ÞÆ+±øéÚFìx†2oe6¡ÌÏ@Qe¿Ä¢Y*äKyDµñmès@ÍIú]÷$ôeɏ·¾ñÞvZæúB£[Pÿè{Ú3ž'ÕÃTÒ¶#žmõBhøV©ÁLùÛOonï?ŒeÆËŃno®ƒÈéòFš<ºWC—®na¨€s©4t/¢a•…®é¹ïtÖtT™ö–p¸Øt¹´†Á³š`ýȋœîÁ•¥k+fT/š7†ð-þàp{ Ac$‚I²á8ŸÔu."€»Ô¦Œ"»Mé’ѧŒã;Žƒ<ÃrT`ÖCd•æ°™!™‹˜òÿò1°y]öyIá… _7ûu7TaÓÎã« "_4°å?å×jâ˶fœ¶›}ø®ªhó¨ÿÉRöTò’’ü(›t*³É7õ”—É8\lÙe†ôˆ 4`2¶½ØeÐœiOü Êø[§¾Ö"ÄjϏKÍeóy–ávûØ'ôîª:˜Ûm¾n·ÁÀX79PàëšÚîrÞìK®¿d¨•óï\´ŠD@ŒÜ@y¥<F£LüxdÈhfA}Wp= Œm¥@T¨;%8»ªiWè÷ `FOÎ ¶šˆæ„baÔ¹ˆ Ú»ažv¹^©‰åËdAØ|ð!×ö§RÕ£vƒ}f2‰þDeµ³§=ø‰Ôë½Æ'³„d÷鹟>ö˜cG·òÇâ?pGþ¥ÕbƝ3IHè®É±+ÇÌ,ªËCß%÷qS««ëfd×nª?ûf“¯Í\¹Ôêqôåî,ÜÊ&ÝU†)àBÝ5f¸ÙÕ®EÄ¡þÛ`5ùÖç…_ž}X4_*UòÔ_‹ÜçÔ¼‘Ú(Ùþ鈟îô? ˜C. Ú|4͇ñ®°ë­3%¯ïh>dº"¸úôñæä*0™ÿï$N7nœ~ïßNôßMâM–)ÿÝ$Ê6Q4ù|ŠbDæ]ó´­žeÑåú?1Pu,’÷9²K¦Ç¯A,ƒºÊÓ·Hé{L…¹þÞòT¤ iõOŒ¼1Cµ<³twã¹õÃrº/K– ãËJ~ÆEÖÁù6©—À+uÄCßÿñúõétÚìäfhıۈþ5\h^O$=”ç…›ÄË4óϔºíÈu/‚ÄÛDA¼ºH`‘§+Y¬Y•læzü†Ô +endstream +endobj +398 0 obj << +/Type /Page +/Contents 399 0 R +/Resources 397 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 371 0 R +/Annots [ 396 0 R ] +>> endobj +396 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +400 0 obj << +/D [398 0 R /XYZ 90 757.935 null] +>> endobj +397 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +406 0 obj << +/Length 2432 +/Filter /FlateDecode +>> +stream +xڕYYsÛ8~÷¯`ùe©ª˜æ!’âìS&ë$Î:ÇÚÊTMeæ!‰;<´<¬èßo_ H=›}n Ñèn|݀\ko¹Ö»«Ÿ×W·o£ÀJœ$ò#k½³׊#Ï }ÏZ§Ö7{¹¸ñC×þX¥]®¹}_¦úûâ÷õkéŽÄ ŠÆz1R¯îÖWÿ¹ò€èZÉ c'Bk[\}ûݵR °\'HV։FÖÒà›[OWÿºr‡º…îD7VŒB^ïׅç¹vՁZ±gêŒ ß.«–)Û글çEÚ¯ÛE•f» !²›n“g[]6ZFT5ON³¦­³ÍÂwí®Õ,¹=hfþ£Úv….e½ðBûûV[¦š!ýXë¦ÉÏL:ÖŸ³T§LÙñ‚¾ÝYk2«kÝxž“„²ÍöÀÀ íÖÔYÜ,AÓ×%Š:#+²+ЭæQªmuº ½­˜8±Eà%c[°Ï‹-xNU³Œ©)G¦@æÅHfM#ûWY*K©2eú)Ëó¹=ª®­ +Õf[•£©‚ȵ[]Y©hÁ0±ÏUW3£Îö‡¶a*Ç³™ u1S¬ì÷ÕÂí“Æßg´LXº´çUlUÝfZ&ž7 +õçѼP­·:»ˆHyX&‹¨jÖ{¬-W²²wuU@kEÛÁÆÊìi¼l=7಑9²4֏çêLĈڛ1enS1=¯Ê=S”,ÚtÛóz£ ¹Ö…Êʹ­•aב‚!Ú£8æ™*·`|˜0Áœ;‘/Ó=×Áèpí·_×_ïXÂãÝ/÷O÷Ÿ?=q÷ó[þ®ßß åáþÍݧ§;?‚#~Éâ×tX½Ø~[kjEöSµkOx Tmxh +|±W•<Š˜G<́©%ÐÉ@‡€a(²†L ã%ºÔð¤jÇ ¼ûôuª”9@½qïþ›Kù 3+´´*CY bÜn`?±;nT‡N4UØ_ÐڈÀ&+²\ÕÜ!/#ñ˜ÕYËBú2AŽñÐÙMx¶`³Ù¾ÐøAÅvz²Rª[•Í­ A ÒQ•;—íAv“ëBX„­—’uÙHÀ=i²í&(L@X¦õOÌ‡á ¨¼(q¢Ø7)îжǟnoO§“³/;§ª÷·€ç\ïÚ[ÉÙk›^;ÁE ë&bÇ].ÇÇâN¡ß‚åÈULÀp +–|Ðãvþà»àTÉsȳrßAPgxúg)»b CÐò&Lbû~nj~Õäƒì樷Ùo®ëëƌS-·Ôœ \¶Åb(¯gu¬hÏxàˆäëJĨ>B'¼«ÿ$ðZF£ ䷂øY+(NÀ<“HiTÇv¨ßÜ1­òœóŽze̗"7Lã¼4Ð4kùL"Cg’ρÇ^_õvM&O™5qb©f.ZgIցŽ±ÎÜD³昆I­gá_à‘tKýæ†.%(ìÐ\ߣÀƒnZ«] <înÎÌe“Ñ[cˆ&Þ¢1&a&Ťo\â+2Z¯"ÿB«×ˆl¶;Ôî~fƒr †Œä«eŸ£ûbŒ2{`òùRÐ øÛCUq +/Á‰#F6Gî¨4¡!Óâ€Þ´ÈS²¾âÏÀ´ÈÝÈêŒÌ@D¤‘i‡Ûx»SCÏ&ðÀw¼D2,TV M€×@s×È5A,ºƒj‹ܬÁå3u:é¥âÃf>¹ûKÂQ’ûbG“K"+}ý ë'¨ô0+–ÜTÌN/å{`J1hLª* œ 㵚²Ø҃ü´Í»TDõu5õ(JH=U:”ßzîҝèA`€#dÊÿð44á\8Á±TmJŽ$qÐȇæ‡0‚®8æß]cïØoƁYk®|Gµ×?òÛ%ÏAº\›¢%º ÂÏðUä„âª7E­Èe˜Ør¼z>ô½{ýhšŸ¿>ò O¯?Þ9½ \°û‚ÕlÃG¢Ãñ»¯UI%.v0ñ‹™ù7å +C×ìƒqn1±-÷ žz0{ßÌh!5;O‰‚êØÄ(ñ¨êÃFlMª>$]{¿„ÀŽçøsz˜¨RÔdÇæópþO°»9O¼èE AØKôþ>·þ ²,Åä÷峪á Î~Ò[Jj¯Æ£ÞÖUÙÞ¼©ž²ký½5ƒ(n‡£VÛ?dðŒ4Ցz}qü ®èÃ0zä`§¦7™Óð.¸>Ãs‘Îérý9úڙÁ¹›þÅN¸ŠY.g;I2ïOk`ݗx©}FT0@òÀ ˜1<½A˜„ƒã֋ؕ÷ +ºZÃ\›Oìÿ×sdZsµÕ,A’s`_c 8Ž3šá\33ÏÊٛ—É$?„>¾ç„žAo£½?_R9š@•ütÿ´–ø|w/д¾_?Ü=I¬Ž…ÏDÄ|¤Ï®4 ÿÅ'á› ­Þ<“Ðò“H’`N“ °fB ɳá4Ô¶ê„5 $ý)X\yj^SÑM¤È+·U±Áw ®’¹K'¦²Iðž‡LD0Í[ÙûžUÍ_Ÿ¹2·ÈЗ¸Ô_͸˜iº¬dÅ&k»K4}t s­€_«°5Èñô`H‘Ñð꽚WÏTÎ4¶‘*Ž9)y¼ñˆ®¶æ +#(¥Ò3òñi‹ÆÕlK¥<¢Ö¹V W|y¡`ºÄKï:Q‚75•ç癇ªÈ¼Å!ŠÜl«™JzmÇg„oM£÷–¸‡_zk]š§˜ï 8C^X%e"å.u­D‡/ôBɌ‡‘(òŒ8bðRù”Õ“µÁb•Ñ½•/%°‡¥gä›8q äïßÇ=×}ၜç’eÍ\Σ¿’¹Ž7šýuï{]Õ%T•)òL)Gn è–G¹‚…¿ˆ Ã +6êÅAE≚0\”œ‘~ÁUî;µï· Gi‡Èϋà{J½—ÿß]Yß`çË8²}wVéÑÊq£Õþe`þ*ˆœ$VòWA˜8a8z =¿Ð^êB6ñ¥ÊÏPÕfOÙ¦Võ™;ýð¯¶LÙ +ék£ë¿áˉøæ£*;%^Àºw|ó¢ë@²ð±þї©Ëý0rV^<ó2µmœ®ÌŽµ“µ·Çc>ó0u‘âÇcH +®y·¨MÐÈ%ñ&ˆ!m‘uÃ$Ï  ,.08ôã8ËÿC +endstream +endobj +405 0 obj << +/Type /Page +/Contents 406 0 R +/Resources 404 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 409 0 R +/Annots [ 401 0 R 402 0 R 403 0 R ] +>> endobj +401 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [258.676 612.933 428.041 623.836] +/Subtype/Link/A<> +>> endobj +402 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 103.07 513.996 112.046] +/Subtype /Link +/A << /S /GoTo /D (subsection.8.1) >> +>> endobj +403 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +407 0 obj << +/D [405 0 R /XYZ 90 757.935 null] +>> endobj +408 0 obj << +/D [405 0 R /XYZ 90 497.744 null] +>> endobj +18 0 obj << +/D [405 0 R /XYZ 90 203.883 null] +>> endobj +22 0 obj << +/D [405 0 R /XYZ 90 169.897 null] +>> endobj +404 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +437 0 obj << +/Length 1057 +/Filter /FlateDecode +>> +stream +xÚµXÛnÛ8}÷Wðm%`Có"ê,ضÙ4Ùô²»/ia06m•%•’ãúïwD]j¾(…ò$JâÌ9s4äpDÐt=x5 ÿö9Špä3f("(ð)Œ¢Ñ=8½`‚8ïåR噜¨êö&™ªî×Ñ-ò(DŽàÍN§aùtp5|PxHµ.E€.Ðd9xøJОß"‚y¢µµDãpÑýàßÙ£G=Ì=Ÿ5ü@ú¢åG 9N°²§8ÂÚtÁ ZÖæ˜vp§ó¢²dKžÒ¼$Uæo•©ç뼺Êê—æv”Îêq\ ¦édµTI¡¦Õ}Ò×ÖºXT£G£Um=UùÄè¬Ði’_Z‰~^K­Í¼ýÓõþ—iÀ?ˆAëð3i–rœ¥ñf¡¦FŽcýh¤Ùì Ëà d´¨£ýøñ®ܺT@ÌL8O.m£×™µZBpßä¼¾?´ö¿O(u˜Øa°ŸM(<Â,âU(~ý_Ç2ϟ—~›[Æoµ)\:“Eäæ|6ŒMèd¡Œ.dÒHð3š)yjÚ0éj¾ˆ7®/œßëOï2â¬j“$­“t™ÅªP;Seœ-ä£*ôRls89~=./_mƟÔLY)TÕÒm#"šMàVó­)3¯™0:à#”·þ<’!{NaX„­[Yu"C¾„8ô½Ž¿NÕì !l¢aµOYÆEÄÎNc“ΠÉܬ!ŽëpÞ 1èŒ8¾ßä…ZžX‘²ÎÀBÍ #õ9qÑëñl¨ŒXE?ÀoÒ% Ž¯Œ]E©_ý˜(»›Ÿ; BôÆàZ%°Ÿ©9¥uà‡ûý¤U ØAjF а§@žŽ»DKñ^õüB +|/rxÔøMâz¤.À1ðø˔ù=etÊ4!ÀÞ#=±ùpBô€p¿7¤;•Ì‹ÅsWCÇ£ý$ùN”,q³ª<æùIpF(‰Î‚?«:d0îXº âãõTºSy£g{‡‡c\Ÿ;I.÷«SkÒgs<ï% ŒÊ±†óþÉÅyiüR‚Ž?'ðrüN'«SD˜ÕC¼¤ÿ¹PÝ¥Ñò1>•ž¦‡ Ó~«é‡Ð†];MÛa™ί°1Ô ¦ˆ0ìˆÍ™¾iyl§ÑÕ·MˆM»X5NUS$ËÓûSÙ5¯e2_µ-ЍmìvÝôŸse~s¡Þ×ÝÁ;™¬dÜvLä©DWÆn/ö!Á剺l¦°{ÁÁÕ½j¬Äø†šÑ?å±Yl…È„CÚö싢È.‡Ãõz'9^%:3XÃ,‹‡{m؎Pö©€F—[Ël™ËŽÛłûè"£ú‚N`âR–›4ÞñßñBKO@ +endstream +endobj +436 0 obj << +/Type /Page +/Contents 437 0 R +/Resources 435 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 409 0 R +/Annots [ 410 0 R 411 0 R 412 0 R 413 0 R 414 0 R 415 0 R 416 0 R 417 0 R 418 0 R 419 0 R 420 0 R 421 0 R 422 0 R 423 0 R 424 0 R 425 0 R 426 0 R 427 0 R 428 0 R 429 0 R 430 0 R 431 0 R 432 0 R 434 0 R ] +>> endobj +410 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 643.852 216.421 654.731] +/Subtype /Link +/A << /S /GoTo /D (namespaceparma__polyhedra__library) >> +>> endobj +411 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 645.754 513.996 654.731] +/Subtype /Link +/A << /S /GoTo /D (subsection.9.1) >> +>> endobj +412 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 530.266 513.996 539.243] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.1) >> +>> endobj +413 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 508.348 513.996 517.325] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.3) >> +>> endobj +414 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 486.431 513.996 495.407] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.4) >> +>> endobj +415 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 464.513 513.996 473.489] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.5) >> +>> endobj +416 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 442.595 513.996 451.571] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.6) >> +>> endobj +417 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 420.677 513.996 429.653] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.7) >> +>> endobj +418 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 398.759 513.996 407.736] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.8) >> +>> endobj +419 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 376.842 513.996 385.818] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.9) >> +>> endobj +420 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 354.924 513.996 363.9] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.10) >> +>> endobj +421 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 333.006 513.996 341.982] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.11) >> +>> endobj +422 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 311.088 513.996 320.064] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.12) >> +>> endobj +423 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 289.17 513.996 298.147] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.13) >> +>> endobj +424 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 267.253 513.996 276.229] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.14) >> +>> endobj +425 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 245.454 513.996 254.311] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.15) >> +>> endobj +426 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 223.536 513.996 232.393] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.16) >> +>> endobj +427 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 201.619 513.996 210.475] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.17) >> +>> endobj +428 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 179.581 513.996 188.558] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.18) >> +>> endobj +429 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 157.783 513.996 166.64] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.19) >> +>> endobj +430 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 135.865 513.996 144.722] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.20) >> +>> endobj +431 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 113.828 513.996 122.804] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.21) >> +>> endobj +432 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 91.91 513.996 100.886] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.22) >> +>> endobj +434 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +438 0 obj << +/D [436 0 R /XYZ 90 757.935 null] +>> endobj +26 0 obj << +/D [436 0 R /XYZ 90 733.028 null] +>> endobj +30 0 obj << +/D [436 0 R /XYZ 90 709.842 null] +>> endobj +34 0 obj << +/D [436 0 R /XYZ 90 629.157 null] +>> endobj +38 0 obj << +/D [436 0 R /XYZ 90 597.094 null] +>> endobj +435 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F11 291 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +480 0 obj << +/Length 1300 +/Filter /FlateDecode +>> +stream +xÚµXßs›8~÷_ÁÛá™ZÑ$AææfÚ\’kšÎùš\_Ҏ‡`Ùaƒ+pÿ÷]!plÇܳ_l!V»ûí®VÂÎÔÁÎeïÃmïäB0'@ Â¹8v¤ ˆSâ܎;Wö”c÷, óÜ?¦cõÜÿ~{åx„!Ì$h*EI`f{ç·½=“Ø!¥:.‘d܉f½»ïØÃü•ƒ |穔š9eðŸ87½z¸rmûÿµ«{ˆHæH +nn˜‡zŽæY²|PcŽ’ø^‡zyzzMãht®uŸøn¦Gçϑšq––N[oõ´rûËeϹsîz¢’Øíü (A‘-|þ8 ­õûDÍÞ6K)!Äõd7³~‹Ù¿û»JØefø´g§Øåô0Þ a¬¶“ BÖÓÉÂ^PWÓïVd+㈲•Ä§w¶ ¿îPF)òˆ¨%ÿxޖzÊ0zYÄY3äT0ò…·rór؇€®®­@c„lõf¿è"“ÑÅ"š“OqÀ¸Ëù¡làqZ䪨¢P¤Òfâl#0e6•%“sùöæþž>J‡E¦ßv1°p¹…Ø@™-Š8‰‹¥y`6v>žÍ'©´ˆÓ©™-Šr”’& †…B»¡È÷ L¹k ÍÒÁ‹¸Ém˜$ƒûåÀ†d=4åkpˆ4Ô8ǒ»´¹îXiÊ>ð¼ŽIkh5Õö½«}Åï«ÒÍ@a¶€nYq–«ª>#Pàa×RÀg;7ßÔß=cÂkëi;ví5g™š;¥Q ¹nÁ;^×ÈÖuA¼À÷\F‡"êE½× $qªB½ÊO½¨ Fq;>„ÑÍ2/Vß(o!É­P9Î&ۈò.¤ï‰ã"‚.Æ­uµžõcV ÉÓu«ßœoÆp¸¼_Å%;ãú_™ªttʔ­ÕeüX™ú3›+ Ÿ¦/Ш(¡­Œû0… Û÷¨tï—vn\jµcU«®ä›árÈñЏÞøzh*ˊèpÙçÜ}W7ñ¸n{uš¾¿°§Ú+™–ÔràQLì¯×ê´VÑ©TØ4<:ºfp +¯r ªÃ™긙ÁÙΩó¤¼uû"Nø ¿ë=\yß<H¢d~u5È ßó*:X³æaŸðòf£z¬#V“r{¿Q>\…†à<ö),¨^‡étNUMÿ×ø´ú7Wú7SùUê?‡)´áUlð£±ßéqÍe02×D&l¨?` êFÕG² ÆN=údH*_ƒH¹@>Yڇ¢˜Ÿžœ<==¡(Gð0×(.Næóäd‹ênŠë“duO5©ó;Ë´²”•I‚à„pU7­q +‚³òÓmh‡<þÅ£Œ +endstream +endobj +479 0 obj << +/Type /Page +/Contents 480 0 R +/Resources 478 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 409 0 R +/Annots [ 433 0 R 440 0 R 441 0 R 442 0 R 443 0 R 444 0 R 445 0 R 446 0 R 447 0 R 448 0 R 449 0 R 450 0 R 451 0 R 452 0 R 453 0 R 454 0 R 455 0 R 456 0 R 457 0 R 458 0 R 459 0 R 460 0 R 461 0 R 462 0 R 463 0 R 464 0 R 465 0 R 466 0 R 467 0 R 468 0 R 469 0 R 470 0 R 471 0 R 472 0 R 473 0 R 474 0 R 477 0 R ] +>> endobj +433 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 721.95 513.996 730.926] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.23) >> +>> endobj +440 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 700.151 513.996 709.008] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.24) >> +>> endobj +441 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 678.114 513.996 687.09] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.25) >> +>> endobj +442 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 656.196 513.996 665.172] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.26) >> +>> endobj +443 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 634.278 513.996 643.255] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.27) >> +>> endobj +444 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 612.361 513.996 621.337] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.28) >> +>> endobj +445 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 590.443 513.996 599.419] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.29) >> +>> endobj +446 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 568.525 513.996 577.501] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.30) >> +>> endobj +447 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 546.607 513.996 555.583] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.31) >> +>> endobj +448 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 524.689 513.996 533.666] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.32) >> +>> endobj +449 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 502.772 513.996 511.748] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.33) >> +>> endobj +450 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 480.854 513.996 489.83] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.2) >> +>> endobj +451 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 458.936 513.996 467.912] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.34) >> +>> endobj +452 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 437.018 513.996 445.994] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.35) >> +>> endobj +453 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 319.627 310.042 330.506] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1By__Reference_3_01T_01_4) >> +>> endobj +454 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 309.575 513.996 318.551] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.1) >> +>> endobj +455 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 285.754 284.117 296.633] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron) >> +>> endobj +456 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 287.657 513.996 296.633] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.2) >> +>> endobj +457 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 263.836 268.984 274.715] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +458 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 265.739 513.996 274.715] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.3) >> +>> endobj +459 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 241.918 274.523 252.798] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Congruence) >> +>> endobj +460 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 243.821 513.996 252.798] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.4) >> +>> endobj +461 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 220.001 309.94 230.88] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Congruence__System) >> +>> endobj +462 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 221.904 513.996 230.88] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.5) >> +>> endobj +463 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 198.083 268.994 208.962] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint) >> +>> endobj +464 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 199.986 513.996 208.962] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.6) >> +>> endobj +465 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 176.165 304.41 187.044] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint__System) >> +>> endobj +466 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 178.068 513.996 187.044] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.7) >> +>> endobj +467 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 154.247 334.119 165.126] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Domain__Error__Exception) >> +>> endobj +468 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 156.15 513.996 165.126] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.8) >> +>> endobj +469 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 132.329 267.32 143.209] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator) >> +>> endobj +470 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 134.232 513.996 143.209] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.9) >> +>> endobj +471 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 110.412 302.737 121.291] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator__System) >> +>> endobj +472 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 112.314 513.996 121.291] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.10) >> +>> endobj +473 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 88.494 292.784 99.373] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Grid__Generator) >> +>> endobj +474 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 90.397 513.996 99.373] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.11) >> +>> endobj +477 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +481 0 obj << +/D [479 0 R /XYZ 90 757.935 null] +>> endobj +42 0 obj << +/D [479 0 R /XYZ 90 420.42 null] +>> endobj +46 0 obj << +/D [479 0 R /XYZ 90 388.357 null] +>> endobj +478 0 obj << +/Font << /F63 247 0 R /F11 291 0 R /F50 215 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +542 0 obj << +/Length 1624 +/Filter /FlateDecode +>> +stream +xÚÍYYsÛ6~ׯà[əŠH‚G¦Ó™ÔMQÇÊi±¤“9£ƒT ç–CLµ~wØ5—£/ÿ¾•Òè#7˜þzéQŠ|ä¹& N{MhN:9Øß±„îlã> endobj +475 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 720.047 328.201 730.926] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Grid__Generator__System) >> +>> endobj +476 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 721.95 513.996 730.926] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.12) >> +>> endobj +493 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 698.129 349.212 709.008] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +494 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 688.077 513.996 697.053] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.13) >> +>> endobj +495 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 664.256 234.683 675.135] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1IO) >> +>> endobj +496 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 666.159 513.996 675.135] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.14) >> +>> endobj +497 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 642.338 330.801 653.217] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Length__Error__Exception) >> +>> endobj +498 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 632.405 513.996 641.262] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.15) >> +>> endobj +499 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 608.465 303.693 619.344] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +500 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 610.488 513.996 619.344] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.16) >> +>> endobj +501 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 586.547 354.602 597.426] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Coefficient) >> +>> endobj +502 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 576.615 513.996 585.471] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.17) >> +>> endobj +503 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 552.674 352.748 563.553] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Difference) >> +>> endobj +504 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 542.622 513.996 551.598] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.18) >> +>> endobj +505 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 518.801 328.051 529.681] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Sum) >> +>> endobj +506 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 520.824 513.996 529.681] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.19) >> +>> endobj +507 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 496.884 334.507 507.763] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Times) >> +>> endobj +508 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 486.951 513.996 495.808] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.20) >> +>> endobj +509 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 463.011 367.902 473.89] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Unary__Minus) >> +>> endobj +510 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 452.958 513.996 461.935] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.21) >> +>> endobj +511 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 429.138 344.838 440.017] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Variable) >> +>> endobj +512 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 419.085 513.996 428.062] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.22) >> +>> endobj +513 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 395.265 324.156 406.144] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Logic__Error__Exception) >> +>> endobj +514 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 385.212 513.996 394.189] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.23) >> +>> endobj +515 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 361.392 283.748 372.271] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem) >> +>> endobj +516 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 363.414 513.996 372.271] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.24) >> +>> endobj +517 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 339.474 339.449 350.353] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Overflow__Error__Exception) >> +>> endobj +518 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 341.377 513.996 350.353] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.25) >> +>> endobj +519 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 317.556 281.622 328.435] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pair_3_01K_00_01V_01_4) >> +>> endobj +520 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 319.459 513.996 328.435] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.26) >> +>> endobj +521 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 295.638 338.981 306.517] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Parma__Polyhedra__Library) >> +>> endobj +522 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 285.586 513.996 294.562] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.27) >> +>> endobj +523 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 261.765 295.464 272.644] +/Subtype /Link +/A << /S /GoTo /D (interfaceparma__polyhedra__library_1_1Partial__Function) >> +>> endobj +524 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 263.668 513.996 272.644] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.28) >> +>> endobj +525 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 239.847 366.617 250.727] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron) >> +>> endobj +526 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [435.501 239.847 498.554 250.727] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron) >> +>> endobj +527 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 229.795 513.996 238.771] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.29) >> +>> endobj +528 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 205.974 405.341 216.854] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator) >> +>> endobj +529 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.84 194.019 338.393 204.898] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron) >> +>> endobj +530 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 195.922 513.996 204.898] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.30) >> +>> endobj +531 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 172.102 305.327 182.981] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Con__Relation) >> +>> endobj +532 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 162.049 513.996 171.025] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.31) >> +>> endobj +533 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 138.229 305.327 149.108] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Gen__Relation) >> +>> endobj +534 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 128.176 513.996 137.152] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.32) >> +>> endobj +535 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 104.356 271.943 115.235] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron) >> +>> endobj +536 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 94.303 513.996 103.28] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.33) >> +>> endobj +539 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +543 0 obj << +/D [541 0 R /XYZ 90 757.935 null] +>> endobj +540 0 obj << +/Font << /F63 247 0 R /F11 291 0 R /F50 215 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +587 0 obj << +/Length 1164 +/Filter /FlateDecode +>> +stream +xÚÍXÛnÛ8}÷Wè­PѤ$ê ´iZ4ÛÙÆۗ¤0h›v”•%—’âøïwx³-'uR$)ü$S¦gΜ!‡ƒ™ƒ½wƒ^ÿC:Êâ vS'ÃNDâ &΅›z~@±û¥š´׿ßWãvΈ5yUz~ˆáS7 ޏÁiïdÐûÙ#€¢°h‚’:ãyïâv&ðþÔÁ(ÌRg©f͝(áY8ç½zØØu÷)ñÄÌ»Ïr‚#D’ÐI‚á˜jóLÌÙpQ«+>lXä#ÁÄêè軗.9[Òr»”s¡œ¼Ä¿ÕþNrð¶V¾Êa5ÕÏæÊðqãìòqS =®llþbÐw€u²4#nŠ;Ë?ì9<ý€ Œ$¿áb=<çÍ~^3/ Ú†Ú&/ÐÀK"Wx$u9—ßwü× ü+ý./'ü–׏q> +ât×yQ¡0ŠRŸèúa†‚,Z+’`¼O’©‘€%J’ä ¤¤ƒrêên9®ñ>³rÖ²™AÿT6\LeP-òFuXœiàã‚Õ5ÐõŠâmÆ( +Sø,@±•éeÐÝèP°n,á~Í¡4î—á·~ãS.xi 'dی ¸•™ª x£gt Å(ˆì„Á=)¢Ij'üµWÆý †ùYG:°€§±Šp™È¾5&µ—7+=ÐhuÍ—aÎ˙~3o•ÀjÀʉþQV¥ßùg̊­|ᅉ+9QOÉ =`x‡µ(€gørÁ;®øTŠòã`œƒË¿Ã®µ±Ã­fâì쳡D.‰½^à@i(g¢µ +~ÿ‹¼äLX +ÖàO“Á!`x¾ª>&j ÖÙÐ7|ԇ*†º,¶dØÿٲͦcr˜`ßӃÝ),+D!°–:1a½ú0Sæ}5ë†'BTbxr;æ [<…•5Pm”¶ææ¼ÕLÔÊFOBx•B‚ªâ0óé̼z:9[ +Ÿz!hãÆTQ#Vó;‡øÔ斬<wNî¯_UÕhÕæEPgr/Àî­~gÝP<Ì|>¯&› +Ö©¤f¹,e֕Qµ–à^®¤ËÃLÖ³Jn$¼Òd¹³äB^€ÃEØ*·î1{m#¼¦m“xß ª]ÃåïPSü!z‡ŸànÃäÝõ©<›/o¸ÎÎõ}ø¾ä__ž'y}ݖÀ_÷¤aû֑±¾©Á&¼ÃGDî0Ïò¼|¦`l +IÊk=ÔqQ¥Ìk›²šê”> endobj +537 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 720.047 259.22 730.926] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variable) >> +>> endobj +538 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 721.95 513.996 730.926] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.34) >> +>> endobj +566 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.177 698.129 281.357 709.008] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variables__Set) >> +>> endobj +567 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.041 700.032 513.996 709.008] +/Subtype /Link +/A << /S /GoTo /D (subsection.10.35) >> +>> endobj +568 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 581.759 328.111 592.663] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1By__Reference_3_01T_01_4) >> +>> endobj +569 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 542.905 288.583 553.809] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +570 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 504.051 292.698 514.954] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Congruence) >> +>> endobj +571 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 465.196 327.019 476.1] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Congruence__System) >> +>> endobj +572 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 426.342 286.073 437.246] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint) >> +>> endobj +573 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 387.488 320.393 398.392] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint__System) >> +>> endobj +574 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 348.633 348.04 359.537] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Domain__Error__Exception) >> +>> endobj +575 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 309.779 290.496 320.683] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron) >> +>> endobj +576 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 270.925 302.123 281.829] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron) >> +>> endobj +577 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 232.07 380.468 242.974] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron) >> +>> endobj +578 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.55 217.45 232.722 227.355] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron) >> +>> endobj +579 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 193.216 414.769 204.12] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator) >> +>> endobj +580 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [265.94 178.595 389.318 188.501] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron) >> +>> endobj +581 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 154.362 284.389 165.266] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator) >> +>> endobj +582 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 115.508 318.71 126.411] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator__System) >> +>> endobj +584 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +588 0 obj << +/D [586 0 R /XYZ 90 757.935 null] +>> endobj +50 0 obj << +/D [586 0 R /XYZ 90 683.434 null] +>> endobj +589 0 obj << +/D [586 0 R /XYZ 90 651.371 null] +>> endobj +54 0 obj << +/D [586 0 R /XYZ 90 651.371 null] +>> endobj +590 0 obj << +/D [586 0 R /XYZ 90 600.733 null] +>> endobj +585 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F11 291 0 R /F70 298 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +613 0 obj << +/Length 1090 +/Filter /FlateDecode +>> +stream +xÚݘYoã6Çßý)øV ¨i’2uE´M‚\ˆÛx÷%YŒL+DuU‡½ÞO_^rbo²õÂnàì“$Š"ÿúqf8€ÀYï·qopê{ ‚‘O|0žÀǐ ÆSpç„»}Œr.\LæêÌ]Œä]ŸPä\±5Úï ¡zúî;pקòOâ”Õµ}¡U‰Uö—î¢~¤dUÆ&e‘.ù´b“T%‹¥’×±Ô:I›ñ¼™œ|Žyو"ߕÚj ÚŠY[s ëai®Â(Q*Lƒ´>/°RÞ͞ÌɈ0·Ešò¸ybƒÚàÆÜÌÚ<ÖÅϓæqrRUÒÕv·›áövÓ…mYªµ jñÅn Ò¨Z¾7ýàdÌe +YYñºÞ³ã§XÎl´æ.AŽœ@ù“™ä0mhÅä÷‚ÏThºGˆÄBƁ=ùÛ·áXsRí­Hë~•;¤Nac>ëœUê“ñr¥ïpýCh¬3^ñ\¦K;B?Z?› +MC«aæ1_ß!›E± ÿúP¼m³½¡«Ûì‡f5v=ꈌ×{#V‡œ¶q³NŽmïã,Ÿþþü!—/&×"oë]·_yùXš­ïüNvÛÉGc,sMÁRþ&{ïöÛ˼“%‡i‰E"â½%}¯¦-ï2=‹´2°Ì±juz0è‹EߛóÔ4™Î­L©ùaFËëóÑdTr¡÷u<½Ÿ»4YE´#ë3©5Ê{D‘1Ry‡MÛÈpRÝ{îÏV§l•ÄƒDx3WŠ¹üä*µY¼¹Ujrs+añ’¥$¹‘^j¡‹IƒSŒŸ—µ¨¡r$=û/¦ËFå /êz\ÚÂÑÇ#X² »ž¿~Ïrô±Oà0|ÑÒK%}mw2‡½djYÚÕºÜØøeø'‘sÀ+£^ŽV/¯ÌË=íSß(;(fþåf<}¥±YeõCˆüpÛ"kWTõax¡­ÓÒ¯ò’ûر±a H?\0µÉšâÖëc]OîŽ*j^ýäRÚí+×,oYú5mœyÚÇT> Â(tûžê–wi„ñ7èî.U¹›>ûEB}™îS<6My4, ×°ÍEYAÑ Ê2¬‘Þ…åÊx儳®F›•Vú^€!õ|ÐäG¶´.rÙ1ÓÙÝWëø/‘«ï’ +endstream +endobj +612 0 obj << +/Type /Page +/Contents 613 0 R +/Resources 611 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 409 0 R +/Annots [ 583 0 R 593 0 R 594 0 R 595 0 R 596 0 R 597 0 R 598 0 R 599 0 R 600 0 R 601 0 R 602 0 R 603 0 R 604 0 R 605 0 R 606 0 R 607 0 R 608 0 R 610 0 R ] +>> endobj +583 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 719.912 307.632 730.816] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Grid__Generator) >> +>> endobj +593 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 681.239 341.953 692.143] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Grid__Generator__System) >> +>> endobj +594 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 642.566 362.715 653.47] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +595 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 603.893 255.069 614.797] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1IO) >> +>> endobj +596 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 565.22 344.165 576.124] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Length__Error__Exception) >> +>> endobj +597 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 526.546 319.816 537.45] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +598 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 487.873 368.822 498.777] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Coefficient) >> +>> endobj +599 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 449.2 367.138 460.104] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Difference) >> +>> endobj +600 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 410.527 343.069 421.431] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Sum) >> +>> endobj +601 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 371.854 349.355 382.758] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Times) >> +>> endobj +602 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 333.181 380.139 344.085] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Unary__Minus) >> +>> endobj +603 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 294.508 357.992 305.411] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Variable) >> +>> endobj +604 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 255.834 339.183 266.738] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Logic__Error__Exception) >> +>> endobj +605 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 217.161 301.017 228.065] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem) >> +>> endobj +606 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 178.488 353.171 189.392] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Overflow__Error__Exception) >> +>> endobj +607 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 139.815 300.305 150.719] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pair_3_01K_00_01V_01_4) >> +>> endobj +608 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 101.142 350.102 112.046] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Parma__Polyhedra__Library) >> +>> endobj +610 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +614 0 obj << +/D [612 0 R /XYZ 90 757.935 null] +>> endobj +611 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F11 291 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +650 0 obj << +/Length 1332 +/Filter /FlateDecode +>> +stream +xÚÅX[S£H~ϯè7¡jÓéš‹oQÑÂɅMpJי¢0A¥†@H\ËÚÿ¾Ý ÄÜ@“Ù¡ÛÎùÎåës'€ÀUãÌi´.UÐP%8À@@S1$ÎÜ :Äb#„„kÁ%"ÌEŒè[S"HèxÑÓÌ{òó•e~òèØRWCdñ§sÝ0Æß L!À‚hP“ M÷?Óýk€ lèà…ŸšE’é3ÃƟ T¨[õäf´dF*TdhAŒ•Ü–’D¸:åïÀ}“PË®57Šjž`Š&O…Æ~”8õ’‰çNãðõÙ'ž‰—¼žžÚÜ;Ix¡{9‹FYG+XëÏÖ¥†€NV¦°$AU‘@+ÐP +}Ûb‰ÉÄæ‹ÇR6_•Ïtšûœ¾Žƒ‰¥‹A4F~ +?ÐeÅyÍRI†®÷Ý(ôÒt_ŸÑ-÷<ŽÜz‡p˜ó\8!eM(…ò?{ñýbQp·TITÈ“^4^93Š£4Kxp)M¾àÆ#úñ»ˆ1¦ä ¼‡Ð?éÖh?æϬôðÜeq²Ì>ê¢íîYË0MـHME†˜È9hϛø\Jº"aýRçwšûU%õþŒJ‰{ùô`D´íNþr-ʔBs¯¼•ïy’k1%$üòXzbötgoF³‰ŸpöÌ¡>•YíKYU«ùyO¦!·èŸ £7~‰ê YՄ·=åÛýõîzý®Õî¸M&‡FHQ  RØvÞïÚóÖrîÖà…?ª¡±*ájì¡ÅEº‡kV5_àµ{wÕXœLÿV°f…´”¬X“WIk‹:½èi°,ÂE£Ô¤ ŽXEêÉ¥Ðü\C®(KâÐ- +0½öôj¹,¡¬)ŠRG±Z{`[½«U‘[¶·óy\͵]Ë.ÒC^¡hX&éÉ¢,eùn¸h¸¸ù,ƒ¤Ç«Uõђ²k´ŠÎ6bƄ½í‰UĬ: Ó´Í¡ãšW¦{Ùé³Ýæº8»ÜbdHk± +fÞ¶E…^°Ïã¬%„ñóÖ9ë÷¿9EÌYÔ +â>– Á6æž0{ÓßÁÞ¯W#5¹þ‚×°'?bµÕwMj•eë µçmO„›žõÝ ÍO³b™ÕêÌ0»ö+Æ7úu±–´Æ>‹sÞÃD~Õ¬àŠ÷P¶Ò£,ßñsþ_і$­ææ^偎×a´nf'I“kÓS­üŽÕÛ/Ð¥€Íaˆ»t"’ŠºËê9_•VßלwúہénƒúI½ø)Ëd•±ÀVvÛ¿¡^êz “`ì~‚ˆTÆ۞;ÑpYVe]Ý:¡5²=hwMÇì‚V;?8"W¨ßÍš/}oÉjM·Jë¯k'¼ìºÃÌËf›Ÿ[²ZÛXm•_ð¥úui¶‡ÖYÇt¹V útÙÝ%æ‘êJäYÿ¦wa^p„­IeOØ:ªõmÇêZ¨Õ‡n¯âY6Š7¾ S˜<Ћ«ÇÄáœÑ•¶±«ì\ŸÂª:DªþÙ!l9dU¡¡Éz1+&$dcè‘7÷“bØa—î,&Æň%‹xìërΦÊ5år4Ë·nR?9 )›É®ÍÊéèDМ¡ûÉûì +AŒ Dÿ…¡Ø”©¨¡_&ÐÜ¿@ùöMWȒ‰Q¡Ž5ú/nâs–MO[­——8Já, +¦ ²Öt¶6ç,ïR0 ²†RÊ¢OžÄ ×4e C"« ©Ñ™!ˆèÁ ŸâlÄñ? ) / +endstream +endobj +649 0 obj << +/Type /Page +/Contents 650 0 R +/Resources 648 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 661 0 R +/Annots [ 609 0 R 615 0 R 616 0 R 617 0 R 618 0 R 619 0 R 654 0 R 620 0 R 621 0 R 655 0 R 622 0 R 623 0 R 624 0 R 625 0 R 656 0 R 626 0 R 627 0 R 628 0 R 629 0 R 630 0 R 631 0 R 632 0 R 633 0 R 634 0 R 635 0 R 657 0 R 636 0 R 637 0 R 638 0 R 658 0 R 639 0 R 640 0 R 641 0 R 659 0 R 642 0 R 660 0 R 643 0 R 647 0 R ] +>> endobj +609 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.15 706.961 326.212 717.865] +/Subtype /Link +/A << /S /GoTo /D (interfaceparma__polyhedra__library_1_1Partial__Function) >> +>> endobj +615 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 668.107 323.163 679.01] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Con__Relation) >> +>> endobj +616 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 629.252 277.754 640.156] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variable) >> +>> endobj +617 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.107 548.49 263.359 559.394] +/Subtype /Link +/A << /S /GoTo /D (namespaceparma__polyhedra__library) >> +>> endobj +618 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.697 467.727 321.961 478.631] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_g0cd3c405aa537a001f59e642f2acddd3) >> +>> endobj +619 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.05 467.727 513.996 478.631] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gg0cd3c405aa537a001f59e642f2acddd3d48fce92c56bf2ff6ee0ffeeba90de18) >> +>> endobj +654 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 455.772 180.102 466.676] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gg0cd3c405aa537a001f59e642f2acddd3d48fce92c56bf2ff6ee0ffeeba90de18) >> +>> endobj +620 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.749 455.772 417.34 466.676] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gg0cd3c405aa537a001f59e642f2acddd372e00beade5e3123d604866d4318562c) >> +>> endobj +621 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.987 455.772 513.996 466.676] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gg0cd3c405aa537a001f59e642f2acddd3e0c67618b9d2e22a193c392f031ddbc1) >> +>> endobj +655 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 443.817 238.761 454.721] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gg0cd3c405aa537a001f59e642f2acddd3e0c67618b9d2e22a193c392f031ddbc1) >> +>> endobj +622 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [140.477 404.963 353.705 415.867] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_g9006be5f6c0f7616400b3554738e732f) >> +>> endobj +623 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [365.355 404.963 513.996 415.867] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gg9006be5f6c0f7616400b3554738e732fe64f42c3dc2245c0a2dfdfdf81804916) >> +>> endobj +624 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.08 354.153 350.202 365.057] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ge574051d412d3ee587c872f48de81663) >> +>> endobj +625 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.056 354.153 513.996 365.057] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gge574051d412d3ee587c872f48de816632ac9e83af49bbfe366e6d82f2f3cde52) >> +>> endobj +656 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 342.198 230.124 353.102] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gge574051d412d3ee587c872f48de816632ac9e83af49bbfe366e6d82f2f3cde52) >> +>> endobj +626 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.5 342.198 511.506 353.102] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gge574051d412d3ee587c872f48de81663829fa1b449ab43dfd7a5fbd21bfbbd21) >> +>> endobj +627 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 330.243 321.211 341.147] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gge574051d412d3ee587c872f48de8166354806b7252847b0cb5c2ca71e1ab43b3) >> +>> endobj +628 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.526 291.388 335.713 302.292] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_g16616f4113ae69d86cdaf2b7b10cc0d6) >> +>> endobj +629 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [353.46 291.388 511.506 302.292] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gg16616f4113ae69d86cdaf2b7b10cc0d634c41f8889b9f0e04d597dfeaa1d356b) >> +>> endobj +630 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 279.433 256.464 290.337] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gg16616f4113ae69d86cdaf2b7b10cc0d6985226363a0c8f82ffd9eccd025e9d79) >> +>> endobj +631 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.685 240.579 331.964 251.483] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_g464c2bc94f19f4509ffedb8b7b60439a) >> +>> endobj +632 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [380.03 240.579 511.506 251.483] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gge444adc8164dfda0378177ddab117095d72cf0b414b10649e6ad6f776273beff) >> +>> endobj +633 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 228.624 242.686 239.528] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gg464c2bc94f19f4509ffedb8b7b60439a4f9ea739b8717fe026aba79a67be5cc6) >> +>> endobj +634 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [269.276 228.624 407.397 239.528] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gge444adc8164dfda0378177ddab117095569a186f6e30ceae8ad51ca3bf7a8ccc) >> +>> endobj +635 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.987 228.624 513.996 239.528] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gg464c2bc94f19f4509ffedb8b7b60439a8e71cc2282a035560ecc13c306e79a99) >> +>> endobj +657 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 216.669 227.703 227.573] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gg464c2bc94f19f4509ffedb8b7b60439a8e71cc2282a035560ecc13c306e79a99) >> +>> endobj +636 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.916 177.814 335.438 188.718] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ge444adc8164dfda0378177ddab117095) >> +>> endobj +637 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [343.965 177.814 475.441 188.718] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gge444adc8164dfda0378177ddab117095d72cf0b414b10649e6ad6f776273beff) >> +>> endobj +638 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [478.809 177.814 513.996 188.718] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gge444adc8164dfda0378177ddab1170956c4381dbaddfd9e2c92dc85a43dbec0f) >> +>> endobj +658 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 165.859 252.24 176.763] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gge444adc8164dfda0378177ddab1170956c4381dbaddfd9e2c92dc85a43dbec0f) >> +>> endobj +639 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.229 165.859 393.35 176.763] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gge444adc8164dfda0378177ddab117095569a186f6e30ceae8ad51ca3bf7a8ccc) >> +>> endobj +640 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.568 127.005 364.156 137.909] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gd7cbdacd9a5e2c068c25c12f47f8936a) >> +>> endobj +641 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.987 127.005 513.996 137.909] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ggd7cbdacd9a5e2c068c25c12f47f8936af8a08f4943e38d19a2d06ad647e37729) >> +>> endobj +659 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 115.05 283.214 125.954] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ggd7cbdacd9a5e2c068c25c12f47f8936af8a08f4943e38d19a2d06ad647e37729) >> +>> endobj +642 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [311.129 115.05 513.996 125.954] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ggd7cbdacd9a5e2c068c25c12f47f8936a50069f21f8a038aa6bda4255c9e1e79c) >> +>> endobj +660 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 103.095 162.558 113.999] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ggd7cbdacd9a5e2c068c25c12f47f8936a50069f21f8a038aa6bda4255c9e1e79c) >> +>> endobj +643 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.546 103.095 402.346 113.999] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ggd7cbdacd9a5e2c068c25c12f47f8936a6ceb40deeaaaf0f057da97c1aaac0a3c) >> +>> endobj +647 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +651 0 obj << +/D [649 0 R /XYZ 90 757.935 null] +>> endobj +652 0 obj << +/D [649 0 R /XYZ 90 565.561 null] +>> endobj +653 0 obj << +/D [649 0 R /XYZ 90 486.701 null] +>> endobj +648 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +696 0 obj << +/Length 1350 +/Filter /FlateDecode +>> +stream +xÚ­W[w›8~÷¯à­pN­Hqɛ›Ð¬S_Ҙî&›öø›$œr+à¦Þ=ûßw@1Äv.ÍHˆ¹|3óÍ+· +VNz¼ÞÁGSWä˜ÔT¼ÅÁŠeÄ(Q¼¥r¥Úˆh}‚1VO5ÂT_£Lý© o}Ê°:ò“Û•ðÕ0)ƒüÆ_TKÛ4•Ú7ï´çz½=*±BjÌB–ΔEÜ»ú†•%ìŸ*鎭ÜקbÅ :<#eÖûÜÃÂÜ]ÏÚ †7Ü ØD†n+Áˆƒûò•RV›#ÿS®ú < ’U,ö+ûò[aèy}Bg:U3?ýy–Fë»`™ûó(¼Îý|}x8ÍÊ0ÿñË0MæãttÀïDý÷…âûÕyÅF†é(}BÃw¡Ñ;N†ãáߍ¢zÃ餣W}¿[e©{×ÿ×ڔσ£Ó4êˆX:Øo Ç!8Ól¬¦E^G"eÒ ùN (h«†M­h÷)E¦Aá©#‡ß‰ö^l΃ˆz¶Ž¯Óh2;#-ƒÉ nàN5#w6›{ ^S†­'NÏçîçªr¿hV£ ·…pž˜¸”[4¾VÓ^øOÎ]‘–îùëÝÁÏ BKٖ`ü^ÈLâ_Ôé´#ç;Ýׄm¥oèˆ0£!醦ƒÒ£`É%Å"³ZïÔ @A ¤ã݉š<«©€K‰Ž |_,Ò8(økðcf™Ô|–wüÍ^†us¨{ÇB(ºIsþRJÕ§Ða0tÊd‡‰D‡A܁à€Nq6p Ê<È7@ö4ËPיÐsœ.à{Rú ÛՀZsÆþäçÓeQŒ’Þðçxx&”æ)L\¼“~ª4j âzž_:ì­*ç|x4œœì‹ŽýÀ6et¦Íòp&·|‘¯¢­,×7à¸maÑß",jUýhµ/6leq–†‹›wãõ®Êýâmbövtǃ6Ÿy®{æμ¹{|âÎ?Ž¦õw1@ׇ´m_¼¥®¢Ž’'ÆAµZ³÷bPÑÄѓ8¨gåí¶ o¨€½£àQÜTIÑEÌܝòžp·6°Õ7¤»ž{á}˜N?íõ[ˆà¦kÀE›(¯ÓôûNÿÚFuï¾&ä i?÷ê+¯¶&r,¸Ïò:s“³ßk†¶ÇCÖ¶k|kRûRùfýd%z•¢?+íPÇ͸÷nŒ(Oɾ¢f¼s0¾+òíSUïlÃEÊLd“¦—Ý•evxppZ%a–£°<Ȳèàqø¤À½Y¤IІâ4x9éL:‹?‰ 8×cá£8þ& hT +endstream +endobj +695 0 obj << +/Type /Page +/Contents 696 0 R +/Resources 694 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 661 0 R +/Annots [ 644 0 R 645 0 R 698 0 R 646 0 R 686 0 R 687 0 R 688 0 R 689 0 R 699 0 R 690 0 R 691 0 R 692 0 R 693 0 R ] +>> endobj +644 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.232 706.961 360.829 717.865] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gb884929ad9e98d94cac675f7fe3e9771) >> +>> endobj +645 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.987 706.961 513.996 717.865] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ggb884929ad9e98d94cac675f7fe3e97716123d48765236f5a4dc9b6589f3009a9) >> +>> endobj +698 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 695.006 218.826 705.91] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ggb884929ad9e98d94cac675f7fe3e97716123d48765236f5a4dc9b6589f3009a9) >> +>> endobj +646 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [221.815 695.006 405.305 705.91] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ggb884929ad9e98d94cac675f7fe3e97713b313393fbe3b2f84daa5d5e440d5fc9) >> +>> endobj +686 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 656.151 317.076 667.055] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gccd1fa9f287c6fe48bd8dfd920a5397b) >> +>> endobj +687 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 640.211 278.601 651.115] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ggccd1fa9f287c6fe48bd8dfd920a5397b8d1443a727b974ff807ec5bc5cd1dece) >> +>> endobj +688 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [284.155 640.211 473.255 651.115] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ggccd1fa9f287c6fe48bd8dfd920a5397b671181c4f0b106836b2bfa9c51d75464) >> +>> endobj +689 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [478.809 640.211 513.996 651.115] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ggccd1fa9f287c6fe48bd8dfd920a5397b7efe7873dcfccf876422dfa5f1fdc5a8) >> +>> endobj +699 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 628.256 226.079 639.16] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ggccd1fa9f287c6fe48bd8dfd920a5397b7efe7873dcfccf876422dfa5f1fdc5a8) >> +>> endobj +690 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [229.068 628.256 439.746 639.16] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ggccd1fa9f287c6fe48bd8dfd920a5397b468e42a8760cc57fdc62aef53af8908e) >> +>> endobj +691 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 612.316 300.18 623.22] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ggccd1fa9f287c6fe48bd8dfd920a5397b8b42d305e53e64514a7f004b4e55f862) >> +>> endobj +692 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [428.767 145.258 474.784 156.251] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +693 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +697 0 obj << +/D [695 0 R /XYZ 90 757.935 null] +>> endobj +700 0 obj << +/D [695 0 R /XYZ 90 574.996 null] +>> endobj +701 0 obj << +/D [695 0 R /XYZ 90 516.295 null] +>> endobj +662 0 obj << +/D [695 0 R /XYZ 90 492.08 null] +>> endobj +702 0 obj << +/D [695 0 R /XYZ 90 492.08 null] +>> endobj +663 0 obj << +/D [695 0 R /XYZ 107.713 415.153 null] +>> endobj +664 0 obj << +/D [695 0 R /XYZ 107.713 399.212 null] +>> endobj +665 0 obj << +/D [695 0 R /XYZ 107.713 383.272 null] +>> endobj +666 0 obj << +/D [695 0 R /XYZ 90 371.153 null] +>> endobj +704 0 obj << +/D [695 0 R /XYZ 90 356.582 null] +>> endobj +667 0 obj << +/D [695 0 R /XYZ 107.713 279.789 null] +>> endobj +668 0 obj << +/D [695 0 R /XYZ 90 267.67 null] +>> endobj +705 0 obj << +/D [695 0 R /XYZ 90 253.099 null] +>> endobj +669 0 obj << +/D [695 0 R /XYZ 107.713 176.306 null] +>> endobj +670 0 obj << +/D [695 0 R /XYZ 107.713 148.411 null] +>> endobj +671 0 obj << +/D [695 0 R /XYZ 107.713 132.47 null] +>> endobj +672 0 obj << +/D [695 0 R /XYZ 90 120.351 null] +>> endobj +694 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F81 703 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +719 0 obj << +/Length 1095 +/Filter /FlateDecode +>> +stream +xÚÍWےâ6}ç+ô»*ɶ|™7&ã™bv¸,˜T’É%@0®àËú²„|ýʖÌe ’Úì–±NŸî>­V#°üêNgnÃð‰‡<6)^îðÞ¤ yè˄…%);qåg±ò!ƒò1«öíߢ|{Wœ¾X§1—G3't%™.&Ð1¤ÝáÄû½ÍƒûÍÕô€qv¸–víã”eP(á4A¼6 Ý]Cƒ˜XuёëE÷$t% Oµ å³Ë¢;z´­6Kò|÷wԔ.^£V=é|‡õ^O "y–ìüð‚2$¬P†ÀžöU )­ÒÐLž+íF2 =¨&QÚùHä:ŸÉx0òZCcAÙ7²‰#?Ì.ÄFàÖ¹üò2žÍ§îâ"'ۆ¶nÞÈiµ‹Ò&nS5½ JJ&ÅՐOôü~×åÍҒ]ßù‡=Öu=_^:j +endstream +endobj +718 0 obj << +/Type /Page +/Contents 719 0 R +/Resources 717 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 661 0 R +/Annots [ 715 0 R 716 0 R ] +>> endobj +715 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.841 297.174 249.291 307.101] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem) >> +>> endobj +716 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +720 0 obj << +/D [718 0 R /XYZ 90 757.935 null] +>> endobj +721 0 obj << +/D [718 0 R /XYZ 90 733.028 null] +>> endobj +673 0 obj << +/D [718 0 R /XYZ 107.713 661.74 null] +>> endobj +674 0 obj << +/D [718 0 R /XYZ 107.713 645.799 null] +>> endobj +675 0 obj << +/D [718 0 R /XYZ 90 633.68 null] +>> endobj +722 0 obj << +/D [718 0 R /XYZ 90 619.11 null] +>> endobj +676 0 obj << +/D [718 0 R /XYZ 107.713 542.316 null] +>> endobj +677 0 obj << +/D [718 0 R /XYZ 107.713 526.376 null] +>> endobj +678 0 obj << +/D [718 0 R /XYZ 107.713 510.436 null] +>> endobj +679 0 obj << +/D [718 0 R /XYZ 107.713 494.496 null] +>> endobj +680 0 obj << +/D [718 0 R /XYZ 90 482.376 null] +>> endobj +723 0 obj << +/D [718 0 R /XYZ 90 467.806 null] +>> endobj +681 0 obj << +/D [718 0 R /XYZ 107.713 375.072 null] +>> endobj +682 0 obj << +/D [718 0 R /XYZ 90 347.013 null] +>> endobj +724 0 obj << +/D [718 0 R /XYZ 90 332.442 null] +>> endobj +683 0 obj << +/D [718 0 R /XYZ 107.713 256.625 null] +>> endobj +684 0 obj << +/D [718 0 R /XYZ 107.713 240.685 null] +>> endobj +685 0 obj << +/D [718 0 R /XYZ 107.713 224.745 null] +>> endobj +706 0 obj << +/D [718 0 R /XYZ 90 212.625 null] +>> endobj +725 0 obj << +/D [718 0 R /XYZ 90 198.055 null] +>> endobj +707 0 obj << +/D [718 0 R /XYZ 107.713 121.262 null] +>> endobj +708 0 obj << +/D [718 0 R /XYZ 107.713 105.322 null] +>> endobj +709 0 obj << +/D [718 0 R /XYZ 90 93.202 null] +>> endobj +717 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F81 703 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +742 0 obj << +/Length 1179 +/Filter /FlateDecode +>> +stream +xÚÅXKsÛ6¾ëWðVò@ ><Î8ŽâÖq]GVNvFɐ̆¤¬øßwA€õ¨œŒÕêD$v¿Ýýv±KlÍ-l]öލzýgÅ(h`fVŒ­0 ˆQb­{;v\Ê°}Ã3Q.øTèÇ÷Åt™‰¼âURä°ãÚ4p¾Œ®zƒQï[€xl‘Z Qè1kšõî¿`ëÖ¯,Œ¼8²VõW™åS®©u×ûÔáQá€ih"ˆ"H0ƶȗ™·à2ããE‘¾<‰GÉÇi2‘\¾œ EZß½d“"Uhûî¨À–KBP_kh6h¹e½«Dµ• Ì-Œ.FqX.õák)@&$¯ +y¶±u-""¬Œj׃»»ñè÷ó›-ÍÐÅ>¼Ð;DYjÐÕÏ·o¨sõF—0D} ǃOÁögÇgöùõ!ÝQ„(„s¯r}WH}ߖ<5/‹Ã¸ŒÐ.°äcØ6€?®ÔlÔJM +\çcöh0ü)¯‚‘ï³Å¥¼òžiw]ÓùU¢áµwvp!Àkâ#ϨVŠˆ±\/F$ ÚêP'ßÁòÐJ#(fŒš<£€‡ð Ñú—ÜÝ[„†b°I©K{“™*LŽžÌ¾ÛÛk}sÅŠíg‡2›ë•$OÌT|[- ï+Ÿ‹µS6xáÐXq‘ò²åAJÈ÷€Ó”"æ™2ö@)ÛØcÝ» \1UâÌ UJåÜÔÔaý‰Âöîe\;aíÒ%J"Ð&οîq‰zqóÅhŸ ÄÂ6³Û[¿Ö¶†¾ƒÀ× ì!¿Î%EÄTÔsÃúe•¤Ieâª-ÕÈ©PÔIò¹^ɖŸ¤&<Ô7y‘»o¦ÁÌ4É—¥­ð“µA½DY‰ìH֖Z˜>fÛV—o0™Ã沒<9ƒ»¡­O¿¶ 4g"|Ь³“Üÿ¿t)Š+}å)Í~_d€a<²ãÁ÷©X4'ú[lo•Mí^–Âö‰¡Àc­ÙCJÕm+à`>©?nMcòv´ÝȕãA ŸM2á¥Ø9gM><`†/¶N›› X&-uZ¡›ï¦1˜kB4‡ÆÇsßyÓ)ƒu…¢Åª¬c"eD­ËžªjqÖï¯V+4-Ñ2O%U±Hû»#ÆZ +Ø‡¤íéÛڑ²F3KH`ú,7„M†ÁIfõ¼¶Çþd` +endstream +endobj +741 0 obj << +/Type /Page +/Contents 742 0 R +/Resources 740 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 661 0 R +/Annots [ 726 0 R 727 0 R 728 0 R 729 0 R 730 0 R 731 0 R 732 0 R 733 0 R 734 0 R 735 0 R 736 0 R 739 0 R ] +>> endobj +726 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 448.45 221.312 459.354] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1By__Reference_3_01T_01_4) >> +>> endobj +727 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 411.913 181.785 420.76] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +728 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 371.262 185.9 382.166] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Congruence) >> +>> endobj +729 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 332.668 220.22 343.572] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Congruence__System) >> +>> endobj +730 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 296.131 179.274 304.977] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint) >> +>> endobj +731 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 255.479 213.595 266.383] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint__System) >> +>> endobj +732 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 216.885 241.242 227.789] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Domain__Error__Exception) >> +>> endobj +733 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 178.291 183.698 189.195] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron) >> +>> endobj +734 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 139.696 195.324 150.6] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron) >> +>> endobj +735 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 101.102 273.669 112.006] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron) >> +>> endobj +736 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.55 86.612 232.722 96.517] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron) >> +>> endobj +739 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +743 0 obj << +/D [741 0 R /XYZ 90 757.935 null] +>> endobj +744 0 obj << +/D [741 0 R /XYZ 90 733.028 null] +>> endobj +710 0 obj << +/D [741 0 R /XYZ 107.713 662.39 null] +>> endobj +711 0 obj << +/D [741 0 R /XYZ 107.713 646.71 null] +>> endobj +712 0 obj << +/D [741 0 R /XYZ 107.713 631.03 null] +>> endobj +713 0 obj << +/D [741 0 R /XYZ 107.713 615.349 null] +>> endobj +714 0 obj << +/D [741 0 R /XYZ 107.713 599.669 null] +>> endobj +58 0 obj << +/D [741 0 R /XYZ 90 582.88 null] +>> endobj +439 0 obj << +/D [741 0 R /XYZ 90 547.27 null] +>> endobj +62 0 obj << +/D [741 0 R /XYZ 90 547.27 null] +>> endobj +745 0 obj << +/D [741 0 R /XYZ 90 467.294 null] +>> endobj +740 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F81 703 0 R /F11 291 0 R /F70 298 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +766 0 obj << +/Length 1038 +/Filter /FlateDecode +>> +stream +xÚݘ_s£6Àßý)ôV˜©e ,À}»^s7I“žï⻗ä†Q°LԂ ⦟¾ú‡c{ÒIZ3g·O !¤ÝŸvW»B ¼ý¸MÞE!˜ÁYD`±3âC`°X‚o±?Æ!¯¦²¤i]÷l)iZð;Iå£?ò~¡%kjš1ÛüÄVLú8ñ˜Ð]8™’Ð bÿëâbt¶ý>Âjy°YŽÄ0 ÈÊÑÍW–ªÿ ΰ6£J0 Bõ,Àõèã9ÑÿîiT"hK%Œ"8 cñtjõº bÄéÿ7c¢´Ì +Ú4îƒPæNÒOfˆVn^qÑ6¬Mç•oͤn¼UM‹¦éyË$m+¹³Âþsò.F QbFS-fÀh€1žÂvR¾–'o5Nâ™9M•Ó¼®ú¾öÞá_òæ×Nd­P­ì“¾ —Ÿ¨±½n¦±ÖË"Ïégº¬Žþ”x•ØèÁôÝٖq¯pÂ$9xWÞ31s «à‚iÝ¿·M‹ÿÑ'¤ï©5*x³)UÓI?Œ=¶5æ$¨¤×MËʁà4v²ëÊ5-½ÜÆPµåUyɗéáv«IŸµæ%ÓκcOÿjx`(‡šEø²Ylt?=9þy:ŠÓBaycά¼+™hÓ³?2V·|/Êý ŸÙLäÂqF»†9&wîüäV-…‹Õ&ŒXQŽËèÃ@1cëÄʪ¢`YËEnÛç“î(Ó§–&uL/™ÈÛûôLJåßÔ +Úªrܑ)Œ,“†ÿéNe";.ö¨SKÖ4Ù:p© ˜Ì§0G©Yä¤4NßVl¥£Æ-BAƕ‹~Î6tÇ —{¬l.Vö)žs0%Ÿ +eùN ßOÜÐS5‚©d·xJ{ÒºôÐÌD_ôGQ»®^ƒù´¼+½îÊÁ5]ù@²ðCâqUq¦¶^´ì²v¿fzµcR±ü/9ág¡ª÷ôŠ‹n8Œ*!ViLNÛ ”Äñ´}ñ1Æ*ãô®`eÈCø‡^,•Jµœ¸¬rž –+…ÏçJˎõ ’C'-[BlRh‹¸Z-˜VôŻܩ„ó ÔépZWçót.+µqÏÇôý»±((J^{5Ö_}Ep‡‰»Í#3HȾŸÎM &KgMý͕k^nßì]PmŽ¶FrŸ©È;š»©Î…*wWz6·Ÿ&¿Ó7%ng®¨è¨ÛŠ[DЃ^É'‹G#¨OúãPMuÍz‡³0~ýÛÏú’l©&8VŸŒŠ÷m[ÿ0™¬×k˜5°¼–·“º.&;Ä÷@ae~1žõ³l®ÔÊJIÀ8Œ1$aƱúÉYj`i¢Ý®Y©}ü êÀ*f +endstream +endobj +765 0 obj << +/Type /Page +/Contents 766 0 R +/Resources 764 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 661 0 R +/Annots [ 737 0 R 738 0 R 746 0 R 747 0 R 748 0 R 749 0 R 750 0 R 751 0 R 752 0 R 753 0 R 754 0 R 755 0 R 756 0 R 757 0 R 758 0 R 759 0 R 760 0 R 761 0 R 763 0 R ] +>> endobj +737 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 706.991 307.97 717.895] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator) >> +>> endobj +738 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [265.94 692.4 389.318 702.306] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron) >> +>> endobj +746 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 670.254 177.591 679.101] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator) >> +>> endobj +747 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 629.403 211.912 640.307] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator__System) >> +>> endobj +748 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 591.586 200.833 601.513] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Grid__Generator) >> +>> endobj +749 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 551.815 235.154 562.719] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Grid__Generator__System) >> +>> endobj +750 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 513.021 255.917 523.925] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +751 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 476.285 148.271 485.131] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1IO) >> +>> endobj +752 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 435.434 237.366 446.338] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Length__Error__Exception) >> +>> endobj +753 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 396.64 213.018 407.544] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +754 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 357.846 262.023 368.75] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Coefficient) >> +>> endobj +755 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 319.052 260.34 329.956] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Difference) >> +>> endobj +756 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 280.258 236.27 291.162] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Sum) >> +>> endobj +757 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 241.464 242.556 252.368] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Times) >> +>> endobj +758 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 202.67 273.341 213.574] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Unary__Minus) >> +>> endobj +759 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 163.876 251.194 174.78] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Variable) >> +>> endobj +760 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 125.082 232.385 135.986] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Logic__Error__Exception) >> +>> endobj +761 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 87.265 194.218 97.192] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem) >> +>> endobj +763 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +767 0 obj << +/D [765 0 R /XYZ 90 757.935 null] +>> endobj +764 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +804 0 obj << +/Length 1372 +/Filter /FlateDecode +>> +stream +xÚÍX[o£8~ϯୠM0Õj¥N‡V™æ¶ SµêŒ›¸)»X I«jÿûÚØЄ6I›*ûd0æøœïÜTf +TΟ½FëÔ28–n)Þ­â@¥m!€u¤xSåZuҚB¨&$?‰Ã‡;:M‰7)I´¦Ž¡Ú'sš%dBÅëˆÞÒTC¶J#¾…lªnk?¼¯ ×küÓ@ìz¨ â:Üm+“yãúT¦lÿ«áØʪ85WLÝ`k¨Œ6 d½¾¢´¡b3Q,“‹‚t@[ië€â þzÁ=ŠÇN”S̈́êLCPeL›ß!†aQ’²'$ö†©fb5æÇfL6¬’ù<ˆfâc">ބt +)·±Ù:Åp ËÔÙjGBþ]×ñ 庉™&!É2ùc—Î$ˆ£âgc°äŒQÆ54bMÇêÊwÓ4N}÷~B“<ˆ£Ÿ0·`É2cš‚¹ŠP&Ÿ.¤ÊóX¬@KÉÂJìÑTÀ“òoÙ!Š R~ªuŠÐÚM¦töÅ¿‹¼ t³$þJx±¶äsÉò3‰f 2£O£Ø§‰§Mx— CYD‹r|Á‡´rÞùÔWAÀ§t|j ´¦ÁHiiNŒ¿•òéœw xMD[ÀFírnw—çÉo­Öjµ“ ,¢ IA·’$l= ¦Õ6rJ*U‚œÇiÁ kLÚ`ÃRšmö“ô¡ bçEg²©W¦Çÿ*Œ–ÿ +endstream +endobj +803 0 obj << +/Type /Page +/Contents 804 0 R +/Resources 802 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 661 0 R +/Annots [ 762 0 R 768 0 R 769 0 R 770 0 R 771 0 R 772 0 R 773 0 R 774 0 R 775 0 R 776 0 R 777 0 R 778 0 R 807 0 R 779 0 R 780 0 R 781 0 R 782 0 R 783 0 R 808 0 R 784 0 R 785 0 R 786 0 R 787 0 R 788 0 R 789 0 R 790 0 R 791 0 R 792 0 R 793 0 R 794 0 R 795 0 R 796 0 R 801 0 R ] +>> endobj +762 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 696.002 246.373 706.906] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Overflow__Error__Exception) >> +>> endobj +768 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 657.865 193.507 668.052] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pair_3_01K_00_01V_01_4) >> +>> endobj +769 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 618.293 243.304 629.197] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Parma__Polyhedra__Library) >> +>> endobj +770 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.15 580.415 219.413 590.343] +/Subtype /Link +/A << /S /GoTo /D (interfaceparma__polyhedra__library_1_1Partial__Function) >> +>> endobj +771 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 540.585 216.365 551.489] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Con__Relation) >> +>> endobj +772 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 501.73 216.355 512.634] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Gen__Relation) >> +>> endobj +773 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 464.933 170.956 473.78] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variable) >> +>> endobj +774 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.768 424.998 192.544 434.926] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variables__Set) >> +>> endobj +775 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.448 343.259 214.914 354.163] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_g0cd3c405aa537a001f59e642f2acddd3) >> +>> endobj +776 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [224.506 343.259 360.535 354.163] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gg0cd3c405aa537a001f59e642f2acddd3d48fce92c56bf2ff6ee0ffeeba90de18) >> +>> endobj +777 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [364.434 343.259 478.227 354.163] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gg0cd3c405aa537a001f59e642f2acddd372e00beade5e3123d604866d4318562c) >> +>> endobj +778 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [482.126 343.259 513.996 354.163] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gg0cd3c405aa537a001f59e642f2acddd3e0c67618b9d2e22a193c392f031ddbc1) >> +>> endobj +807 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 331.678 180.102 342.208] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gg0cd3c405aa537a001f59e642f2acddd3e0c67618b9d2e22a193c392f031ddbc1) >> +>> endobj +779 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 292.823 244.968 303.354] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_g9006be5f6c0f7616400b3554738e732f) >> +>> endobj +780 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.738 292.823 294.581 303.354] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gg9006be5f6c0f7616400b3554738e732fe64f42c3dc2245c0a2dfdfdf81804916) >> +>> endobj +781 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [150.585 253.969 255.909 264.5] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ge574051d412d3ee587c872f48de81663) >> +>> endobj +782 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [287.774 253.969 448.819 264.5] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gge574051d412d3ee587c872f48de816632ac9e83af49bbfe366e6d82f2f3cde52) >> +>> endobj +783 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [463.855 253.969 513.996 264.5] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gge574051d412d3ee587c872f48de81663829fa1b449ab43dfd7a5fbd21bfbbd21) >> +>> endobj +808 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 242.014 232.286 252.544] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gge574051d412d3ee587c872f48de81663829fa1b449ab43dfd7a5fbd21bfbbd21) >> +>> endobj +784 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [235.275 242.014 335.777 252.544] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gge574051d412d3ee587c872f48de8166354806b7252847b0cb5c2ca71e1ab43b3) >> +>> endobj +785 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 202.786 223.927 213.69] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_g16616f4113ae69d86cdaf2b7b10cc0d6) >> +>> endobj +786 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [231.698 202.786 282.945 213.69] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gg16616f4113ae69d86cdaf2b7b10cc0d634c41f8889b9f0e04d597dfeaa1d356b) >> +>> endobj +787 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [285.934 202.786 321.69 213.69] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gg16616f4113ae69d86cdaf2b7b10cc0d6985226363a0c8f82ffd9eccd025e9d79) >> +>> endobj +788 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 163.932 205.018 174.836] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_g464c2bc94f19f4509ffedb8b7b60439a) >> +>> endobj +789 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [212.789 163.932 237.466 174.836] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gge444adc8164dfda0378177ddab117095d72cf0b414b10649e6ad6f776273beff) >> +>> endobj +790 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.455 163.932 262.433 174.836] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gg464c2bc94f19f4509ffedb8b7b60439a4f9ea739b8717fe026aba79a67be5cc6) >> +>> endobj +791 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [265.421 163.932 296.744 174.836] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gge444adc8164dfda0378177ddab117095569a186f6e30ceae8ad51ca3bf7a8ccc) >> +>> endobj +792 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [299.732 163.932 381.426 174.836] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gg464c2bc94f19f4509ffedb8b7b60439a8e71cc2282a035560ecc13c306e79a99) >> +>> endobj +793 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 125.078 228.261 135.981] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ge444adc8164dfda0378177ddab117095) >> +>> endobj +794 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.032 125.078 260.709 135.981] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gge444adc8164dfda0378177ddab117095d72cf0b414b10649e6ad6f776273beff) >> +>> endobj +795 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [263.698 125.078 325.107 135.981] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gge444adc8164dfda0378177ddab1170956c4381dbaddfd9e2c92dc85a43dbec0f) >> +>> endobj +796 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.096 125.078 359.418 135.981] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gge444adc8164dfda0378177ddab117095569a186f6e30ceae8ad51ca3bf7a8ccc) >> +>> endobj +801 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +805 0 obj << +/D [803 0 R /XYZ 90 757.935 null] +>> endobj +806 0 obj << +/D [803 0 R /XYZ 90 362.233 null] +>> endobj +802 0 obj << +/Font << /F63 247 0 R /F70 298 0 R /F50 215 0 R /F11 291 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +825 0 obj << +/Length 1306 +/Filter /FlateDecode +>> +stream +xÚÅXÛnã6}÷Wè­°fHêœÆÙ:µ¯íE³ C–™D]]¼º$pý÷/²e­cç´O¢hòpæÌÑÌÐX»×°ö±s6ëœ\8¦æ#ß¡Ž6»Ó|¬¹A6%Úl©Ýê]jcý×8( +9<ÏÂ*ai”Q–]“êèÔ7¾Ì.;ýYç[‡6ֈÀ²]䚶&Û/X[Âü¥†‘é{ړX•h5ákÓΧVvá¦}6nØG°ƒ,ÓÓ\j"ìØÒÈϔÚâøzŸvÛµ1ÖYZ%jžÛ“ß+Ã&bñm}4ÏÇy¶ˆY2Ÿ‚GUÑÆ᫾¹¹ºè÷¦ƒ³a.ð&†…õkxµÀôǀήo®ÎûçoÆñåøZ—äۊœëñl0üyTÄöŸÉúyráb€öÇ1°qM8ÅB¾eÉSƆ‡õ¬(" RÊ$«Ê0K˜Mv'ŸåƒúY2oX¶.ؗ“E?²Ü „èh¯%[‹vTÑ¥9…§‰|òQp+®We”D }ÏGْícêûaŒÑàŠ³Þ¾Ì×W¯‚Øßûãàþ—G«¦æH´>˙/þÇ(LX,#0]'‹,~U êÏÀ—•!Ãþt:ŸýÖ{m ľëɼÿÉ X¿á_OoøJŒ÷ìý8é+ô'o·+2$;˜{8y_*¨§>i½g„Ô*>]ÓGØÓº–‰ˆmJ4DŒ.Á šsVQ̖ª±"Ì£•8 +À[b©…L•guڏ‡rp돵õ@ÎDiÉò;ÎnªÕ« üÜ3a¼àÐEUnöâ™®òÒȊðfµP +¹"H¹É¦'T¯ærΒp^ÊL=…™°pl°+O9?Îâõ[æêu-ò _˗–#°¹í· Wƒ( ãjɖõÊúܨØøبMÿE¬ ΦåPE0„‹úæ¶QAz¶SØ`ˆj +!£^± õŠ;?_Õ~ÏcéòééÙz>aw¼Hp:C&a¡]iÀRËFÄám…€ýyßф"ìo–ÌöÁ€9þå—ã( ×÷ØØʕ´A„J•Z¾Ò”úhª2Š£r-_Â-j”¬ V£Qz¯²tU›$.uƒ4K»;¿„AwënÎÍâ&mCºóɘA#¢ŠDµˆ£PUk–,À1¾¨Òt·Uj÷i²M%áÙ6moÒãÕ¡rM^;7}Æ6ž©Âµø‹…å\ê?®üDÞZϪ(^5—M|9s‚UQñôüKíf6$ДºV-‡Ú4n–\½cc!Ûöêů¬´# +'½¤Ô>òüEËÃu¦`å¦×ï¡vÊÊçyéž ¦vxu}dYä? •8˜N­Gx&ôþyBßC䄕Už­nZ’!†,VY`±ÞÃ¥o"ÓÛH´NüíƒáHüök7Tlä{ænõË*ċˆ´©W–y´àŠ¬Jöþ ò²P€bŽÈà¸~Ë,7 R²6óR‡eÖ¾;Ü]½—^ŠëK°ƒ|‘—tÛ•[íæ¦Ñ5ð×F×À;ÙM×°·ýé}µ‰ÓàÇfè¦`ùO†m늂QVAllTýÈOgy±iý šC–âbGüo I Î撌¯Z=ú½#dºu‘Úòˆ[Kð¡,W§''OOO(,P•F«EåÉjŸü¨¡- +º[!ßey}·É…%Pð\ºéh]6©>Jaa"š–ݸBÿ¡ø"ª +endstream +endobj +824 0 obj << +/Type /Page +/Contents 825 0 R +/Resources 823 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 835 0 R +/Annots [ 797 0 R 798 0 R 799 0 R 800 0 R 809 0 R 810 0 R 811 0 R 812 0 R 813 0 R 814 0 R 815 0 R 816 0 R 817 0 R 818 0 R 819 0 R 820 0 R 821 0 R 822 0 R ] +>> endobj +797 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.99 720.286 225.779 730.816] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gd7cbdacd9a5e2c068c25c12f47f8936a) >> +>> endobj +798 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [232.454 720.286 369.659 730.816] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ggd7cbdacd9a5e2c068c25c12f47f8936af8a08f4943e38d19a2d06ad647e37729) >> +>> endobj +799 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [372.099 720.286 511.506 730.816] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ggd7cbdacd9a5e2c068c25c12f47f8936a50069f21f8a038aa6bda4255c9e1e79c) >> +>> endobj +800 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 708.331 243.912 718.861] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ggd7cbdacd9a5e2c068c25c12f47f8936a6ceb40deeaaaf0f057da97c1aaac0a3c) >> +>> endobj +809 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 669.103 221.336 680.007] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gb884929ad9e98d94cac675f7fe3e9771) >> +>> endobj +810 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [229.107 669.103 301.924 680.007] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ggb884929ad9e98d94cac675f7fe3e97716123d48765236f5a4dc9b6589f3009a9) >> +>> endobj +811 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.912 669.103 381.604 680.007] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ggb884929ad9e98d94cac675f7fe3e97713b313393fbe3b2f84daa5d5e440d5fc9) >> +>> endobj +812 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.538 630.249 210.278 641.152] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gccd1fa9f287c6fe48bd8dfd920a5397b) >> +>> endobj +813 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 614.682 171.803 625.212] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ggccd1fa9f287c6fe48bd8dfd920a5397b8d1443a727b974ff807ec5bc5cd1dece) >> +>> endobj +814 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.792 614.682 257.093 625.212] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ggccd1fa9f287c6fe48bd8dfd920a5397b671181c4f0b106836b2bfa9c51d75464) >> +>> endobj +815 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [260.082 614.682 295.329 625.212] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ggccd1fa9f287c6fe48bd8dfd920a5397b7efe7873dcfccf876422dfa5f1fdc5a8) >> +>> endobj +816 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [298.318 614.682 402.198 625.212] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ggccd1fa9f287c6fe48bd8dfd920a5397b468e42a8760cc57fdc62aef53af8908e) >> +>> endobj +817 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 598.742 193.382 609.272] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ggccd1fa9f287c6fe48bd8dfd920a5397b8b42d305e53e64514a7f004b4e55f862) >> +>> endobj +818 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 337.912 172.889 348.816] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1By__Reference_3_01T_01_4_b4470b84b8b57bae591239910d220c70) >> +>> endobj +819 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.915 299.058 146.976 309.961] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1By__Reference_3_01T_01_4_133f3756e88145e6ff5bf3d1b41838d9) >> +>> endobj +820 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [122.488 260.203 136.655 271.107] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1By__Reference_3_01T_01_4_a3a5f10fed94188b162073ef8efff393) >> +>> endobj +821 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [122.488 179.441 137.213 190.345] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1By__Reference_3_01T_01_4_d35d7381bcd3c4cf029d4b76bb6545b8) >> +>> endobj +822 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +826 0 obj << +/D [824 0 R /XYZ 90 757.935 null] +>> endobj +827 0 obj << +/D [824 0 R /XYZ 90 561.048 null] +>> endobj +66 0 obj << +/D [824 0 R /XYZ 90 471.647 null] +>> endobj +482 0 obj << +/D [824 0 R /XYZ 90 439.719 null] +>> endobj +70 0 obj << +/D [824 0 R /XYZ 90 439.719 null] +>> endobj +829 0 obj << +/D [824 0 R /XYZ 90 356.886 null] +>> endobj +830 0 obj << +/D [824 0 R /XYZ 90 356.886 null] +>> endobj +831 0 obj << +/D [824 0 R /XYZ 90 318.151 null] +>> endobj +832 0 obj << +/D [824 0 R /XYZ 90 279.297 null] +>> endobj +833 0 obj << +/D [824 0 R /XYZ 90 196.512 null] +>> endobj +834 0 obj << +/D [824 0 R /XYZ 90 196.512 null] +>> endobj +823 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F21 828 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +859 0 obj << +/Length 1840 +/Filter /FlateDecode +>> +stream +xÚíYQsÚ8~çWøí`¦I¶l“· i:í]{¹$÷Ôvcøjlj›PþýíJ²ÀàÐ6i.י{[–W»ß·»Ú•©3w¨óªs~Û\ú®3$CŸûÎíÌR'ðœ9·Sç}—QÂ{}F)í®¢bWyº]ÈiÓdRDÅöìl4¾êqÚ5z,ìæY¯ÏíŽÒ¨,õ嵜IõLf±‰nÀx×¥½·o:/o;Ÿ; 4¢Sˆ€®pâeçýGêLaüC‰; šµt<îÂêÜtþìГÖp—P_Xkaƞ YEI*§Z¿ YÆE²ªÐt\ +º'ˆ:}î×j9¿ûÖU’&ÕVßÄ;c“å*•K™UI6×#ËuMR©o¢Ì,šåY¿ñ$ŽÒ´?Ùö D ‘"¨ .ÏâsO/»0Ó§y¼Æe"¥¶šå…¾¨Iy¤Ø¦Ç`ys3—™,¢ªF`VäËúUY KÓ¼ÇEwc ù@)Oå™â­Þa>ñÜPa4r­äÎEsÖû¾ØÏ·ãkkÝßzÎ.i؁?ÆÈPŽ¸÷kÉ®G¨xZŸü:ëÖËç re©ÏËÆòÐ&&º¾èñZÉo‘7æ=S@S}£„$„CñjÑâ°þ`È ÷ýg +Sµ+DIVo¶e%—­ì•ÏÄØLß–B¥Ö´‘eceŠEcÊ9 ‰ïÚ\—÷Ð;ñƒxälã ÿ¹xœk¬Nñ8‘ÿ2ÆŽV +¡Ìá.·Î[9ô sÊ¡€±æ0<]=gPêcµlÊK¥ÿªt“éé´9+¤¼ãÇì‹×2•Q)k–ÒT_=7èÊ2_«‹¸~¾Œ²{9þÔ%ódۖy@qAmI_->çzø²ñ|×ãlôÕð]”¤ú¸o“™ž0~õˆR/v™Ï¼‰/ε3*½†ö€Ê¼e§8NØs£é"º“mî?‘ý‡sÈa¨ñTßlzØE˜ð0g¾.´Óó:¤áb?¤f¿¾K™9w‚ÇíÙ˜ÈGQÑ'+Ve3XѬŽ¬Ì“Zž*Õ!¸¿èã4«ëúCÃJú[“"RÌî` @»K¢ÔÎB>ã•Èžú õqÞ⦔›Ê~®žÏJò gl¸;Äù±•×»wYOÒÂ>ºui–WúlLmðx>¶;[۝¤í5°´UãªÀ…␇OÓ»´Æü);ãVJ–ž÷_ió•gh¼^éCȼ8ÑwÍ‚þYïoÙáÜÖFC/ ܚ©yù¸ÓÃïM~H(4^ßø¹I}fgðÉ0ïџ™ÄqøyæJo¡Kƒ`M¹¹ý]ŸÝë›7ûBôã(›¯£¹õ:«d1S_ob3ôW)‹_pw6<½²uFè?ºEÜkÀa)ᦆrAԍí5Ÿœú귎b`g"> ™­/Uµ: 6› ‰K²Î’UA’j°Z¥ƒã-s'…A/ìÚ5û­j™ÒÔ©PÇ +êÔ^2Θd0q©¾q5yÿz<8y +endstream +endobj +858 0 obj << +/Type /Page +/Contents 859 0 R +/Resources 857 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 835 0 R +/Annots [ 836 0 R 837 0 R 838 0 R 839 0 R 840 0 R 841 0 R 842 0 R 843 0 R 844 0 R 845 0 R 846 0 R 847 0 R 848 0 R 849 0 R 850 0 R 851 0 R 852 0 R 853 0 R 856 0 R ] +>> endobj +836 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [121.93 576.922 276.658 587.826] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron) >> +>> endobj +837 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 500.884 184.651 511.788] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron_1c91471f55b22735023d37417f0bef70) >> +>> endobj +838 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.633 500.884 304.022 511.788] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_g16616f4113ae69d86cdaf2b7b10cc0d6) >> +>> endobj +839 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 466.316 184.651 477.22] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron_509185b3d326e5d4496fbe8953b82f88) >> +>> endobj +840 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.467 466.316 248.023 477.22] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron) >> +>> endobj +841 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 430.057 184.651 440.961] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron_5491f9cbaf4f0215196fc05ce17eaec9) >> +>> endobj +842 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.467 430.057 248.023 440.961] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron) >> +>> endobj +843 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.836 430.057 333.302 440.961] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_g0cd3c405aa537a001f59e642f2acddd3) >> +>> endobj +844 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 395.49 184.651 406.394] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron_d008d79cb35b51e7dfbee0dcc3741dc3) >> +>> endobj +845 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.467 395.49 266.294 406.394] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint__System) >> +>> endobj +846 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 360.922 184.651 371.826] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron_bf571357a5156e495293957a44145a9b) >> +>> endobj +847 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.467 360.922 272.919 371.826] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Congruence__System) >> +>> endobj +848 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 326.728 189.015 337.258] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron_173c08eeeb4a96b0060d5f023e4ba4a6) >> +>> endobj +849 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 180.874 184.651 191.778] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron_558341813be1d1bf607bf1c50e6e1ba3) >> +>> endobj +850 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 144.616 184.651 155.52] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron_a37dcee4fa14c58b76c8d3c4227849e8) >> +>> endobj +851 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [272.222 144.616 347.688 155.52] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_g0cd3c405aa537a001f59e642f2acddd3) >> +>> endobj +852 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 110.048 184.651 120.952] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron_e79d42cfe6b21bcf264fd9ea84e78fb2) >> +>> endobj +853 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.467 110.048 264.61 120.952] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator__System) >> +>> endobj +856 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +860 0 obj << +/D [858 0 R /XYZ 90 757.935 null] +>> endobj +861 0 obj << +/D [858 0 R /XYZ 90 733.028 null] +>> endobj +483 0 obj << +/D [858 0 R /XYZ 90 646.577 null] +>> endobj +74 0 obj << +/D [858 0 R /XYZ 90 639.509 null] +>> endobj +862 0 obj << +/D [858 0 R /XYZ 90 541.172 null] +>> endobj +863 0 obj << +/D [858 0 R /XYZ 90 483.266 null] +>> endobj +864 0 obj << +/D [858 0 R /XYZ 90 343.304 null] +>> endobj +865 0 obj << +/D [858 0 R /XYZ 90 195.787 null] +>> endobj +857 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +880 0 obj << +/Length 1734 +/Filter /FlateDecode +>> +stream +xÚÅX[›F~÷¯à©ÅR˜;V•šMR%í¦Ûìö¡J"‹Åc 8Žûë{†°Áx/íF}±¹Ìœëw¾sì,ìü2yq=9{-™¢PRé\/œ;¾$HPâ\ϝ.ÁˆN=‚1v‹¨\G³"Ow+5/£YšÜ”Q¹{þü|v9¥Øµ/¦$pólêQÝó4ª*sù^-TóNe±‰Ì'ÔedúéúíäÕõävBÀ"ìÆá#Ÿ '^O>|ÂΞ¿u0baàl›Uk‡Sÿ©s5ùc‚­7ÃÿcïæˆøÌñ)CX +ãâïõ +,kŒ¼Põ*ŸWQ­”³×Š`ˆ Ç£…Ä7>R*z[œž€€eQL©p¿L‰p•Ñp“ç©Š2»\û[.­ãzѦ(T9»É7Ù|L–Ù,Y̔ó5Šë¡.½å#ø¤P2d³“gc»w°ô^ì½÷±€÷’kï)E’Ç#…‚÷ß,¦܅0ê fÌ7ÏÌe¾Ð + !â@^ò0M¤z•TfQ_)G2$í¢ "IڭٍH ÝÐÓ¥4p›˜6–'µyܾ6ÁWփ:Q’ü§÷ .7ê^A­™å”ù®ª7%˜úÃÔãX¸¹õ6©Ôˆ&†PáœC1¤14ÂQZª á=•1‡*Ñ äôJÏóC†9gˆf¤]ÕP"±‘x¹¹IÛë µ¾ikòõ&‹ë$Ïî®J‰8 À3ÀS[קʲ²J9÷JT?»Ô×QRšXr Æ…xÙXüx¢à†¶QD÷¿£Ýg`@(ÝË<ÉêJÕ°RÛ¶U¥¾y÷n¸u`%!òE«ç§c\šd**gÀôu¢c> ŸÏ}Lã闎ǀ(C)!À”Bùw³PñìnZ¼ÅnÊbÄtþCn¡x9 °Ûú]T ó›d#u;R)>0ml“zuX*U¡4Ëè£<"8‚ŽØî.FÄ Äü{«9ÂÁSà StÜzjZt öhfûæõ6Ö¿4C2¿;á1¦Y”&«S-ïQ}‹ÚŒÛ8¼WЉ+e -JÓ^ºòMs·ï×QM v—ú§ÛÍnŒÈ©LGïk @Áä±é „ñ zBCÄÎh/U%ikÞKUÅeR´•<È!†ôqĸåÿŸ[p„—/“²3â4¯Z‘1ˆâ¸Í¥HÌó¢«LdCÂúªšÜŽ•ç5èvq[~×ß{ü27k•iò6î 0R»P> endobj +854 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.568 697.994 306.942 708.898] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron_3665335e295bd7c05eeca13be606616f) >> +>> endobj +855 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [310.757 697.994 370.313 708.898] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron) >> +>> endobj +872 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.905 608.266 255.461 619.17] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron) >> +>> endobj +873 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [427.859 608.266 491.28 619.17] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron_ef6bc45c4726c7fb386547c6ec104cf5) >> +>> endobj +874 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 608.266 513.996 619.17] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron) >> +>> endobj +883 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 596.31 161.84 607.214] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron) >> +>> endobj +875 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.301 596.31 231.857 607.214] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron) >> +>> endobj +876 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.356 515.921 191.678 526.452] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron_1f026c17289bb2174eaec0d61a4a2e67) >> +>> endobj +877 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +881 0 obj << +/D [879 0 R /XYZ 90 757.935 null] +>> endobj +882 0 obj << +/D [879 0 R /XYZ 90 627.239 null] +>> endobj +884 0 obj << +/D [879 0 R /XYZ 90 534.522 null] +>> endobj +885 0 obj << +/D [879 0 R /XYZ 90 534.522 null] +>> endobj +886 0 obj << +/D [879 0 R /XYZ 90 478.228 null] +>> endobj +887 0 obj << +/D [879 0 R /XYZ 90 419.527 null] +>> endobj +866 0 obj << +/D [879 0 R /XYZ 90 397.215 null] +>> endobj +888 0 obj << +/D [879 0 R /XYZ 90 397.215 null] +>> endobj +867 0 obj << +/D [879 0 R /XYZ 90 320.551 null] +>> endobj +889 0 obj << +/D [879 0 R /XYZ 90 305.981 null] +>> endobj +868 0 obj << +/D [879 0 R /XYZ 240.245 241.153 null] +>> endobj +890 0 obj << +/D [879 0 R /XYZ 90 224.426 null] +>> endobj +869 0 obj << +/D [879 0 R /XYZ 332.797 173.709 null] +>> endobj +891 0 obj << +/D [879 0 R /XYZ 90 156.982 null] +>> endobj +870 0 obj << +/D [879 0 R /XYZ 338.775 106.266 null] +>> endobj +878 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F65 249 0 R /F11 291 0 R /F81 703 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +901 0 obj << +/Length 2000 +/Filter /FlateDecode +>> +stream +xÚµYێ۶}Ÿ¯ÐÛ±˜CR$%¥hÓ¦HšÓfú”†Æ¦m¥²äHrœùûnÞ$S¦íÉAƒƒL‘û²öÚãháèכŸîon_Š8ÊP&¨ˆîWQ†£DÄ)‰î—Ñû Á(žÎÆx²Ë›m>ßÕåãF.›|^MÞ<>þ¢–«ÓE!«n:£O^”yۚË?åJ6S’Ndµ°§1™ÄtúñþõÍ/÷7Ÿoˆ‚#¢æ Jb-¶7ï?âh Ï_G A–F½j1Ãg½»ùã_TƒÆ Þ«Aá_Ue~7¥xb¿PR×Uø)(Ǩ˜|Àÿþ{p(xû2%GR1"NȬ…z4K<Á2 +êÏԂhÆ(Fgь”q«Ñ‹z»+å×¢{œcŸ—d°q›-úBÇ2D斂RÄ,âøhь€IEÆá"A‚2³ø§}Q.­¯së}óá쫍÷Ý&·ð(üõ‹z7%ì¡ïê•[.íE ;Õëb‘—v}Y·ûFžYî89ßh̏”‰YŠøØžºeIâ ㊘3ÄãÄZÀºâޝlL<%|¢ÍlTÔpXï·}l8å‹uU7rùÌܵ…O³U¾èÜöUÛ5ûEW7æÁ&oM«z[ôòÜÈ?r:}èIŒˆ5F@"¿ÊJ69>÷Øvr@kœ¸î1¸n§(|v¥qÊQJ}@ZÉ)å“ÃEÄ®šz;òIkä÷ ·vÚµ Q°±â´‘^žÌ6°}¬QJ‘ùÁÖC͓~,ö¡(-Šj#›¢ë°Ë֖³-ܛ Q@Êñ·j0òÝŒÆ ¢$ €Îe˜·rû -¶_î«E×Ëõs½Ð”ëGʲïՒœ@¤’8öµx#»PLs”$äÒ~L?>_ÛäÁõ0µ_°åh:‹áq_Ö­¼ªÇº_¶îT°›Zíá“\„Ô¤ŠCúj®IØ혘£8AiÌÔÂn(ð*ÂqŽáçРUÑ´]@ +¨oã8ö’æq• +l£èåÈáR%†>N|w§zÐûad%"SªCèCü?FEk'š0ÖÉÁ.ì[¾ÞL»¦†²Îµ›C÷=@g_‘¥TIØáÉe,…(]•ØüÕ~RDoé*ñä±î‹=5Æ(IÓkœž3c,8âLX;¦g콟ql ³lh7ÐKwfD î+uD ¡ÀŽé0ÊÁú#2S›j몋^ŒÁºçûd,}ŠÓU=ßÃm]¨ºç‹bfl1"8»„Þ 1~<ÞÁ’èY; ’ã—¸ÃÛªh+˜$Çf£$ÝȐ߾y½sOk}^>ézü4L©>_ƒ—ʐ.I¨¹ Ï|ëYwéu—ánÆ¢KH;uêgššË]$Úî_.ÏÎ VuYšÒµ¨Ön(‚i)ýr[±Ø_æZ ÿ—:Oÿ­KA3œƒÌóŸë¯ ú”«šã‹:4ï+ ãjfyö¬˜!ÌÓï3ì ªkg–#4oÝݽqs+¹R"÷\[ÙÒænÿPª +Y½ ´#ö[ gq:Œ¼O,~ÚþX¼‹;v”õÄY¸ª-Ðû$rB&33$˜*âJ19;ÄÒs<]×þˆ)†m3®.ûè5+¼ƒïR¯Â +tƒASêép–*cÆ(Éw3fY» *O¬9þAA¤”ô©¿'èß@)h;•~ôï<æßl•¼µn¸sqbnߘ`17¯#Ñ|Wë}¾¶[½ReÎJŠÊýÕÊæ?Sh¬³ßæÕލv•L&h†±Fªä3|§ ÊwRZ»cü¹«ßL2¨H9Ô>¤Ï5›®Û=¿½=hÑ"H£»ÝínWޞÒ°  &C¢ìés iÙe$÷^²ˆ.*X¸Õ´‹Æ~ü>A¾i +endstream +endobj +900 0 obj << +/Type /Page +/Contents 901 0 R +/Resources 899 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 835 0 R +/Annots [ 894 0 R 895 0 R 896 0 R 898 0 R ] +>> endobj +894 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 464.739 230.651 475.608] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +895 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 125.229 159.927 135.76] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient_ac1766c4ad4a4697f6f9d4a92b200cb2) >> +>> endobj +896 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 86.288 159.927 97.192] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient_ffb4611ad564f09455819718964b6e80) >> +>> endobj +898 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +902 0 obj << +/D [900 0 R /XYZ 90 757.935 null] +>> endobj +903 0 obj << +/D [900 0 R /XYZ 90 733.028 null] +>> endobj +871 0 obj << +/D [900 0 R /XYZ 461.214 675.861 null] +>> endobj +904 0 obj << +/D [900 0 R /XYZ 90 659.263 null] +>> endobj +905 0 obj << +/D [900 0 R /XYZ 90 591.949 null] +>> endobj +892 0 obj << +/D [900 0 R /XYZ 90 569.637 null] +>> endobj +906 0 obj << +/D [900 0 R /XYZ 90 569.637 null] +>> endobj +893 0 obj << +/D [900 0 R /XYZ 90 456.365 null] +>> endobj +907 0 obj << +/D [900 0 R /XYZ 90 441.924 null] +>> endobj +484 0 obj << +/D [900 0 R /XYZ 90 231.45 null] +>> endobj +78 0 obj << +/D [900 0 R /XYZ 90 224.405 null] +>> endobj +908 0 obj << +/D [900 0 R /XYZ 90 143.686 null] +>> endobj +909 0 obj << +/D [900 0 R /XYZ 90 143.686 null] +>> endobj +910 0 obj << +/D [900 0 R /XYZ 90 105.238 null] +>> endobj +899 0 obj << +/Font << /F63 247 0 R /F81 703 0 R /F50 215 0 R /F65 249 0 R /F11 291 0 R /F70 298 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +927 0 obj << +/Length 1489 +/Filter /FlateDecode +>> +stream +xÚ½XÉrÛF½ó+pJˆ*s4 ‹ªrˆeË/‰b+'Ù¥‚À!  3$ëïÓ³ P¢1'lƒF÷{Ýýz€µƒ7³——³“sŸ9Š|ê;—+'ÂNàÄ)q.—Î՜`ä¹ ‚1žoc™Ç×Û2»ßˆ¥Œ¯³ôFÆòþôô¬,Ö²E"Üåx~–ÅUeN?Š•. çæ)ñü€Ïs¿\¾½¾œý3#àvˆþ.PÀ¸“䳫/ØYÂý·F, +;½*w<Êà˜9Ÿfΰa|Ô1Ø !&ßS1!:eûÜÄõ²I³¥u26‡¤+åêgŒi’Š¢6·oã¬Kå1@Å{f#N•ÿÚ`fV >Ì ÛçHǼÏé“sŽ{,,õP2g>?ÚÂgJùȈBN®-„ß̜«¦ÎT$”÷"é¿‹T\Ÿ1Ç/ÓõoE-\ÂçkàIß¿Iá ™ôv¥È÷(8ë!ÿh¸Þ¤ÀBVþ"Ë ¥ü£#û©–i±6‘Vÿ +éz|^ææªÞØj\Š$ÍãÌ\H—s±5‡ +^ë´,̳´˜ ƒœx-ÖÕt–я‘A!Í9”ü‘É°÷š9ÌDòìümïÍY¹š€ÜLj]þ'ÏÚWÂÑè‰ä·èŽzÃ>ukQO.ÀÄAò£¨YT£ôÖmĜnD¶´=ì~ª¯0€­Ëäz“N%3í#OdóH2„3Ó¬=Š"L;ádˆXé|%ê8̈́õ™nuåia`ÇC̋Œ_Í;ï{ÅßÏXí£z‹ȧžy돛¯"©+F¨Ê2}¬ï·b?Œ°§ËA™‰¥0öšJE¤-—æ˜æÛLäº#)sµKæaÎÓ69¤êEjñ­ú’}ý ²Öý$i¤é¦ú…1˜¥…ˆ¥¹§-[tHq›5[)ª +®^´øU-cp§½³…q]ʶJ ËSUÚ*-M'6ä‰Áw<Öã›Z¾ÏôGšŒ?uÌn¿*“&ﺰõ¾Ï¾±ÚåÑ##˜Xu¸.ݱ(éXBҋzâ¡?êòƒp +w’Û–±®°ÝÀ=¤]çºJ Åї‰_0!ªJF'íR7HH+uOȜP´ï•·^à$Bž7–·¯EÁžn;n”úÈ#¡¦r;A¿þ–]ëÕéžn2 ‚„(Àírøk|£,.Öè÷&¿òÜ +!êÎøȯA„cˆµ1\nd©0½kYM­Œí†°)\Bäù.ËRX⊲î + š^1 Ó–|º|’3ÓÕŠNԀà#Fm-çƒò1™Ñ––îïƑÝväÎ%àK5¨û¶+OäÔªÌ2U7Ë©DÌĐI‡íÌÐîüqY}ÐbÑ×Ø¥-4]á™F¾Xó d†ùGؗ*Bm˵ôZã4Njæ&Kóâ¡R؜Ÿ7E¢KãÑômх” ù÷‰ß=¾×ñ^¿þ֊Ȕ A^<>f…>aå I5þù*àÍ*ì™ äá®±« !ío  &ì’_&ŒD( AgƒNÙu"=íÁ¹Ræh¾œ°¦Òv7ÀåÖhÇmWŸìz,HO×8Õd'‹Cv˜“ېšàæò½»LƧáQ©ËÁª#òagÓÞÿ… ”?#äãy~ˆ0LþÊÓ¿ì€3_)¡ý ÉAù¹7Rü E‹Ò;{يžk;­V>sñ¶/«æ1LPM¼¶¦ÔnU®ô@Ð +ä_•?»œÏ-Öâ¢ióZ‘h’BVºSÅ-RHÑʌão§={7Ó$ìB¤ÜG!éò~S×Ûӓ“»»;”T¨)Ò­Di}²Ýf'Åqg…@¢;–ºñ'/¥0# €G¼dgÒ´05ÜZ}ÿ±±m +endstream +endobj +926 0 obj << +/Type /Page +/Contents 927 0 R +/Resources 925 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 835 0 R +/Annots [ 897 0 R 911 0 R 912 0 R 913 0 R 914 0 R 915 0 R 916 0 R 917 0 R 918 0 R 919 0 R 920 0 R 921 0 R 924 0 R ] +>> endobj +897 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 696.282 159.927 707.186] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient_4445a4d60c39e32b6f6d3e2dcb901e55) >> +>> endobj +911 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 657.987 159.927 668.891] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient_7c968f7ba606e8b99863ae8cdef3c686) >> +>> endobj +912 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 620.065 159.927 630.596] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient_2ae111e41ccba8a228746939bb1c595f) >> +>> endobj +913 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.743 620.065 209.76 630.596] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +914 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.861 581.397 215.488 592.301] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient_aff569442866d78436e19428b4cb8e75) >> +>> endobj +915 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.225 481.857 200.241 492.761] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +916 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 188.502 164.042 199.406] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Congruence_71cf9ab9ae4f184bf520137a8209ff3e) >> +>> endobj +917 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.858 188.502 245.107 199.406] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +918 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [259.991 188.502 337.241 199.406] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +919 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.125 188.502 398.142 199.406] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +920 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.2 150.207 215.13 161.111] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Congruence_6bcbe60c7d20f1fee7847e262993b626) >> +>> endobj +921 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.2 111.912 201.302 122.816] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Congruence_1a974f4ed60693790cec91f324a85b05) >> +>> endobj +924 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +928 0 obj << +/D [926 0 R /XYZ 90 757.935 null] +>> endobj +929 0 obj << +/D [926 0 R /XYZ 90 715.095 null] +>> endobj +930 0 obj << +/D [926 0 R /XYZ 90 638.505 null] +>> endobj +931 0 obj << +/D [926 0 R /XYZ 90 600.21 null] +>> endobj +932 0 obj << +/D [926 0 R /XYZ 90 544.608 null] +>> endobj +933 0 obj << +/D [926 0 R /XYZ 90 456.579 null] +>> endobj +934 0 obj << +/D [926 0 R /XYZ 90 434.268 null] +>> endobj +935 0 obj << +/D [926 0 R /XYZ 90 434.268 null] +>> endobj +485 0 obj << +/D [926 0 R /XYZ 90 295.259 null] +>> endobj +82 0 obj << +/D [926 0 R /XYZ 90 287.792 null] +>> endobj +936 0 obj << +/D [926 0 R /XYZ 90 207.196 null] +>> endobj +937 0 obj << +/D [926 0 R /XYZ 90 207.196 null] +>> endobj +940 0 obj << +/D [926 0 R /XYZ 90 169.02 null] +>> endobj +941 0 obj << +/D [926 0 R /XYZ 90 130.725 null] +>> endobj +925 0 obj << +/Font << /F63 247 0 R /F70 298 0 R /F65 249 0 R /F50 215 0 R /F81 703 0 R /F88 938 0 R /F82 939 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +955 0 obj << +/Length 1646 +/Filter /FlateDecode +>> +stream +xÚ½XI“ÓF¾ûW蹂۽¨[Ò¤8`¨RE`rjJ–Û¶@‹ÑÂ0ÿ>¯ɒ,ÏŠ™“¶§×¯¿ï­­ƒW³?¯fËKÁœ…‚ +çjã„ØñAœçjí|p F|¾ cw•Yt½/Ò۝\—Ñuš¬Ê¨¼½¸x^äÛ²‘y,¯ßßVµÌæ ʱû<ªÊܾ“YÎIà*!PGÅ.ó柮^Ï^^;Θƒ¢—ç>òwâlöávÖðþµƒ çFKeŽG\Sçýìß¾s+”!,¸ÙÊ[mAQ˸–kc׳º.“ÕŒijYisZ}ËKŽ{ʈ@ œ¥H´ +?RÊÿ˜=”[»™w¯f·èžr3§Üýˆ1™×÷ÿ¦Ìˊu“6ÕHxx]^úØ ÀNá);•}uÄC¡ç;¯vr>ЧŠ¹Öí׸£qN¸‹&WA¼`!€ŠÇáÌÂ<'؍â/ÑV>.Èo’\FåõËïûRVURä灜î~Àߢ´‘'àMå¦6w»(·þW%ëƒ8ðòÞZ„„ˆ{>˜¡—©wIe¤†©pmeÐ={འ‚!‡€8C!y$ÀËG¼L¶»Fœr38qÞ ù8RH ¡¾¯Ë®"6¿¾u”¤mjz!«¸Löµ…uÄÊ<ļÐèyf]L2ŽfmŸúƒøHP»ò³Ü¢°ú ùðTFÐÜìÜ?@Á~Ml®‰&V+¥rY'ùÖ + ¿ªì²PžÊËË S€<Ññ«uBê>5x’žøXÀˆã#ϧm3BØ(ôaYåP ‰@«Mv–Âzb৔·‹BÆÇփz"QX؊‰¥ D‚—gᣠ+Ÿ–KŽõ€Ù¤sÖ§v!ÒßD2–¢0°¾M,Ç°1‚¼Ð,6ÐÅ#¾Óú>©JÀç U}^€A€»'óûÄrú®ÝÜêX‰°ÇºÍ·~àâùÂó<@ã¬€W»žÐìþ¤Ã?;V ÿvA™AHž>B¬CڍÜìd)'–¤{SS"FI+ â†1n"‘1ᮓLæ:Åê÷*RÕkû»Õ>Šå“)þÁ8tîxù|ÀØÀ>œ¾ÐØÆ$¯u簅VO‰º-gŒçî7õ-*“h•ÊIÏ ’Ž¥{|íËnk…¦pàL|äl-ÀñOòs´÷$ß xÌ;U‘…˜¹°NWle. Ռ1DÊ2Sw¾«*Õ±y?yì°w¢ºEî(ZµCá‹íÿ€€’Í8ÄÁDœZ?½¹xÊ:€Ïë¸|&„Ú¸üX'D +eA/iOhƒzØ«-$y=Þ³üÚDiRߚ×ñ R ó?$ +¢KÅÒeÀ«ø÷—zN ï/ôœàŸUÄã–öÃ%`Òý s±'¦×˜t{pÀ𐠬×Ó~3GTÿçµâØ.|ŽMöôB¶^ùé±ì¸NÁ¨|w¤P„Ù +è&8Jl—Y溒ƒl_{y¢‘„Y"TÜë'»Ž|]Ä Ôª:ҝ«~µ)ÊvO­ñálàFϋöA%Å2êæóMYd#86EšªrÜt£ª/éOu‹ÝxÞmñs¤USšì|À¸!MÕ7z4îÿp‡$çöüUOYÛÀ(«P·‰"F!ƒ¶ç"Í*Mbóç?2[µÄ_6y¬H|Ðs‘1(C„jæÚìg†År5iÝASÕe×Eyu\ϜL$éz4«Èl¯JǹŸ=s·&Þ5r[xr"å‰ßTå¶þÿ¾.•ãß9”EUœ$×ë&Û?žïdݔù-½dîYTw1¬:2R;õÍæ½¹TÃ<1=‘‡A1ÿùIB˜™ù’‘ºH= ÖcÍj? 9AýË/€||Æ+„a:óˆWíò~‡*xˆ8Ÿ·Š•íc›†Íã“‹ÍÃë~¢7Ÿ£|Ût§–)·Ý˜³Lûê¿J–¿Í9L[6YFyÓúµ"Ñ8EYuèb•*n‘É5ïe{LbÀøâ´wÏ4 ½¾Ž èì:¿ßÕõþb¹¼¹¹Aq…š<ٗ(©—û}º> endobj +922 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 699.305 159.927 708.151] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +923 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.425 699.305 196.739 708.151] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Congruence_7622929270f419e884d16cec2fc172b5) >> +>> endobj +942 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 616.485 191.16 627.389] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +943 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 616.485 205.277 627.389] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Congruence_637fe9105c9bc0b2722544d16453e87c) >> +>> endobj +944 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 577.63 191.16 588.534] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +945 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 577.63 205.825 588.534] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Congruence_240b9d144edd0d6dca5cb42904f9b279) >> +>> endobj +946 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.82 477.559 227.951 488.463] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Congruence) >> +>> endobj +947 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 245.845 198.363 256.749] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Congruence__System_392557cee71bc7b2eb23f07a9d788062) >> +>> endobj +948 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.2 206.991 215.13 217.895] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Congruence__System_2da6d6ce1ce4057b0332826381042d4d) >> +>> endobj +949 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.2 168.137 201.302 179.041] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Congruence__System_6b7400f7e25b1bb473b2fc16c0c90b32) >> +>> endobj +952 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +956 0 obj << +/D [954 0 R /XYZ 90 757.935 null] +>> endobj +957 0 obj << +/D [954 0 R /XYZ 90 716.221 null] +>> endobj +958 0 obj << +/D [954 0 R /XYZ 90 716.221 null] +>> endobj +959 0 obj << +/D [954 0 R /XYZ 90 633.556 null] +>> endobj +960 0 obj << +/D [954 0 R /XYZ 90 633.556 null] +>> endobj +961 0 obj << +/D [954 0 R /XYZ 90 596.724 null] +>> endobj +962 0 obj << +/D [954 0 R /XYZ 90 540.31 null] +>> endobj +486 0 obj << +/D [954 0 R /XYZ 90 352.267 null] +>> endobj +86 0 obj << +/D [954 0 R /XYZ 90 345.667 null] +>> endobj +967 0 obj << +/D [954 0 R /XYZ 90 264.819 null] +>> endobj +968 0 obj << +/D [954 0 R /XYZ 90 264.819 null] +>> endobj +969 0 obj << +/D [954 0 R /XYZ 90 226.084 null] +>> endobj +970 0 obj << +/D [954 0 R /XYZ 90 187.23 null] +>> endobj +953 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F65 249 0 R /F8 300 0 R /F1 963 0 R /F10 964 0 R /F13 965 0 R /F7 966 0 R /F11 291 0 R /F23 216 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +987 0 obj << +/Length 1229 +/Filter /FlateDecode +>> +stream +xÚÍXKsÛ6¾ëWðVr&„ð HÑ=%Nœ©›Ì¤¶zr2˜‚$$|( Õÿ¾P-ɯ(í‰ìãÛo»„Þ܃ÞûÁ›ñ`x/iŒco<óRè%1#o<õn|A„Bè/™,ØdYåw >•l’‹[ÉäÝÙÙyU֍d¢l‚SèŸç¬®ÍòŠÏ¸ ÐÈçeƕŠ ô ¾Œ/ïƃï¤ì€jõÒ$„zY1¸ù½©zéA@ґ·nw^„‰zæÞõà¯<ê&Æ´ód½xË&r>5ö½åu&ŲU©m^P¸%z!Ž‰R#çµ9SßÕ /̺š™gV•s¹ÒNÖ@ ÒGQbÙ£e‚ýêö+Ï»ž™g³àf‘µ¸ih &rnÁ¹z?ðnÔâŸwz&×Æ ³Ý@Ñn¾¨7­²UÁˆµ¡k_Í*iÍBXúe&®}fÌyÉ%k f²*ÜQî„åy`ê¯E97¯>Cˆs~¶k'ŠADFŠ'ÐÔû3Æ´ +áýà¯,ÀÐÿ¡õ0Ã?Edƒ Ö x4JN’%}.JÎ,¾üûŠå¢¹³)`ߪ î}LMôzy©$ Pjcùiu›‹Ìþȋ[n]¬ÊLGµÞÁ°ge‡;±Ëó{¸ïe„ƒ§'h +²ÖÿÐ"1y÷ÏRòº¶…£/"çèÕqâ_ñ¼å®¢Bq[åû„HžOê»âA´+¯P‡l½‘B6Ž4²Ñ+êE ,£ß¬D>µüa]ÅSH1·cÙLõ»\ZW{¸£ ¯L Hâs]~Šf±£ ^òLèœsYjÎä[_·Ð½^àMèÜSDŠžÊ›ãX QÎgÍdÁÊé¤S~ˆr/ ÐoVÒAÙ1­×¬´r‹™¶ÀÝ]&Gé–p @+½­Ü¶”¶»vMPJݦ§E À ±øU!b¾øObÐ*~rRSrÊ P0ž™Çj×Á|Êû_ûbq uÝ'žóHÝUè8æáR®»‚ºÀZ—®©{‘£—«3!&ÓU±<9ÔÌâÚªì:°‚5][¥î.K–oGÄUþÝÖm> endobj +950 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.91 677.939 266.363 688.843] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Congruence__System) >> +>> endobj +951 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [110.861 665.984 160.993 676.888] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Congruence) >> +>> endobj +971 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 509.369 157.417 520.273] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint_0b1d26f53dd99cfe4e2f8a4fc3e8b5d3) >> +>> endobj +972 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [161.232 509.369 238.482 520.273] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +973 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.135 509.369 327.876 520.273] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gccd1fa9f287c6fe48bd8dfd920a5397b) >> +>> endobj +974 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [365.454 509.369 442.704 520.273] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +975 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 470.515 191.16 481.418] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +976 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 470.515 252.31 481.418] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint_e62d06b1c82e9d9f4f12bbb3c6f4bcae) >> +>> endobj +977 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 431.66 191.16 442.564] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +978 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 431.66 257.849 442.564] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint_148544cb9ef5bf6b9a60ee56655bff26) >> +>> endobj +979 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 392.806 185.651 403.71] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gccd1fa9f287c6fe48bd8dfd920a5397b) >> +>> endobj +980 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [186.149 392.806 205.855 403.71] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint_dc27929d7731cdc3beeba475147e3127) >> +>> endobj +981 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.2 353.952 215.13 364.856] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint_1112ff3331d87019a2df0fb9a83cfeb8) >> +>> endobj +982 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.2 315.097 201.302 326.001] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint_4738abd11cb0fdcb233ed4f18c874d56) >> +>> endobj +983 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.82 215.026 221.326 225.93] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint) >> +>> endobj +984 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +988 0 obj << +/D [986 0 R /XYZ 90 757.935 null] +>> endobj +989 0 obj << +/D [986 0 R /XYZ 90 733.028 null] +>> endobj +487 0 obj << +/D [986 0 R /XYZ 90 615.791 null] +>> endobj +90 0 obj << +/D [986 0 R /XYZ 90 609.191 null] +>> endobj +990 0 obj << +/D [986 0 R /XYZ 90 528.343 null] +>> endobj +991 0 obj << +/D [986 0 R /XYZ 90 528.343 null] +>> endobj +992 0 obj << +/D [986 0 R /XYZ 90 489.608 null] +>> endobj +993 0 obj << +/D [986 0 R /XYZ 90 450.754 null] +>> endobj +994 0 obj << +/D [986 0 R /XYZ 90 411.899 null] +>> endobj +995 0 obj << +/D [986 0 R /XYZ 90 373.045 null] +>> endobj +996 0 obj << +/D [986 0 R /XYZ 90 334.191 null] +>> endobj +997 0 obj << +/D [986 0 R /XYZ 90 277.777 null] +>> endobj +488 0 obj << +/D [986 0 R /XYZ 90 91.418 null] +>> endobj +985 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1010 0 obj << +/Length 1075 +/Filter /FlateDecode +>> +stream +xÚÍWÉrã6½ó+p Y5„’à¢ÛÄ[ÅÉTM,ådO© +’8áEÑ#۱ǕT( —×Ý vãç¥1»ö]ÁÈw|°Ü‚Àǐ8,7àÞÄ–BfIyFWe‘÷lÃé*M֜òã|~Qä•à4ÉÅjq¬Ë,Û!ȼHiU©éÛ2náÐdy̤8ìÄt}ëËòÖ¸ZXšƒnՓ.qfÜA`#¿ßÝ(‡vW<Ǖc +Æ‚1Œq:_"Ÿ¼Ÿ/҃Ù5A#°º^¤”~T§ª‘°b«Æ¸×UA%è$Rë@yJÐçz&±:ù‰ekiD;¿®óX$RT‹fÇÄ(ìCÏ ¥eô;8‡œœQ!à;‹»ÜÛD¢õ”ñ1¹©±ã$x"²3'@ ”æø^cNc†ç{0ò´—lKëTŒ¡©cQð¹e»™kËAf¤š«‘e¥8>‡±…‰9àüȺ3 Ù™2‰"ŒÏ ¦1Ê©H,‡˜ß]L)_žä;½û;ض~Tq’¬6uV¾¨wLÔ<Ÿ@ÖªTÓm!ë@¶QK ã9MՊ[n`²R Ëmò¬ÇWe,Y€# ]?ÆµÊÅ>©Ô®S;%½à¨Ûô/#âÉM¡ÉûDD'»Þ1:m•¶WB.ÀŽ÷ȝ§ŸCR°íIÄbÍ¡—LÐ$íRç’U1OÊÖÜIŠÍQ@ßÑ&|lбY¬¿²XèùVbÏÔ$néú|”å–ç9MnJ*%ª¡·w¤sdï‡æKh&Ávuç2ÉkIÅ&Ö*ª×¸Ð`ÒÞs +“Á—‰æ)„zûr¯«aSÄuvšd’Ô¤Í$‘áî;X¸¡µØ±œqÚsǖYw”uÂÒ´hJðÐ'øBNÊæ§vö·“,îîº;WՏâ¿ÒæjøÖè¡ý5:jìN¼ëA}&‡Ïõ—E&õ¬®x{Ý|uõwÌÊ«×7½ bZWŽëcœF»¾ä8/ø“Mùϛ„­¤ÎèbDzÕ[õbè,Œñ Ù͍ +q[ø#¸í ±rÝÿ»PÉӅúý|xuµFÏUëò²ƒåÍ{šä샾•éÑò‰©WeÑ­º´x‡|Q՜þ?MÃéÇå«$|é§}ÚH‹}õ²!$dš'ŸÛFW¤—Jjù›‚J-nÇqPÓ|WӝõKÓ +nÛ4Šõ§?*Ʋ15®Ÿh^w½bSÓªÑâUŸ£ÊÀ9MuCÕÄ/Ó¸(0þÝìW£mlâÃ÷½ä^ˆr>›W°Î“’ÃDÌÊ2=¦´A +–T Íf_4YÁ[Kdš²7r}`òî(“\õÅM¾Nãø•¤èþ +endstream +endobj +1009 0 obj << +/Type /Page +/Contents 1010 0 R +/Resources 1008 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 998 0 R +/Annots [ 999 0 R 1000 0 R 1001 0 R 1002 0 R 1003 0 R 1004 0 R 1007 0 R ] +>> endobj +999 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 640.704 191.737 651.607] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint__System_8be9b5793c5bcbd09cbe45d5def529d0) >> +>> endobj +1000 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.2 601.849 215.13 612.753] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint__System_ad362521f7fba585112f1a2a5aea3d96) >> +>> endobj +1001 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.2 562.995 201.302 573.899] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint__System_f2e1b75d9c8484321bfc25bb122970b7) >> +>> endobj +1002 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.363 462.924 257.19 473.828] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint__System) >> +>> endobj +1003 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 453.026 132.51 461.873] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint) >> +>> endobj +1004 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 294.354 219.384 305.258] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Domain__Error__Exception_3d2371e510d8b88b2660a631d6857953) >> +>> endobj +1007 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1011 0 obj << +/D [1009 0 R /XYZ 90 757.935 null] +>> endobj +94 0 obj << +/D [1009 0 R /XYZ 90 733.028 null] +>> endobj +1012 0 obj << +/D [1009 0 R /XYZ 90 659.677 null] +>> endobj +1013 0 obj << +/D [1009 0 R /XYZ 90 659.677 null] +>> endobj +1014 0 obj << +/D [1009 0 R /XYZ 90 620.943 null] +>> endobj +1015 0 obj << +/D [1009 0 R /XYZ 90 582.088 null] +>> endobj +1016 0 obj << +/D [1009 0 R /XYZ 90 525.675 null] +>> endobj +489 0 obj << +/D [1009 0 R /XYZ 90 400.776 null] +>> endobj +98 0 obj << +/D [1009 0 R /XYZ 90 394.176 null] +>> endobj +1017 0 obj << +/D [1009 0 R /XYZ 90 313.328 null] +>> endobj +1018 0 obj << +/D [1009 0 R /XYZ 90 313.328 null] +>> endobj +1019 0 obj << +/D [1009 0 R /XYZ 90 257.034 null] +>> endobj +490 0 obj << +/D [1009 0 R /XYZ 90 161.715 null] +>> endobj +102 0 obj << +/D [1009 0 R /XYZ 90 155.114 null] +>> endobj +1008 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1040 0 obj << +/Length 1346 +/Filter /FlateDecode +>> +stream +xÚÕXMsÛ6½ëWðVrƄà‡zJÛ7™Imõd{<4Ùl)R©8ίï‚(R¦dŶšéACR‹·oÀ֝…­ÓÑoÓÑø$ð¬Å ¬é܊±1J¬é̺´ F±ãŒ±½LÄ"¹Y–ùã=Ÿ‰ä&ÏnE"'“S^p‘Ô¥p\Ê°ý>OªJ½žó9‰l^¤Ì0/Žl/t®§g£ãéèŸ7°EšiYˆBYébty­üfa#¬‡¦×Âò©Ïܺý1Â;—@=„¦–ðeu›g©rè3_ÜríçɪHë¬,ªÆco|ÂpÇ ïE–K) +ŒÁ+JYoŒZƒ¸Ó‹9?Y—.Èޗ|îPf_aLӌõóäg³LúšUiw€n¾Â Ïl3þ‡ØŠÀÿÀ—þK¿}j¹ÄG±ï+ÿ?ÎåH@u:ø 4êû¬R]ú¶<Ü02cžÕ÷ÒD=–eKm^Ë~Kš—ÕJ8^hóN×#õ®þ¯W¢Ð¦³Z¿Ì2!ÄFƒËÞ>—ùˆk\ð=&[§ƒU$µÂÝ!̸wQ‹¬¸Ó½·D+©Ò,»™­ËCë¼ HR8ë)Õ뼄¬¬k>Ӑ5E’w]ªGüK$áud†X@b‚¼ |Ž $6~, Ôc .ÑA#R—½^Œ‡zTj¶B@ÊÞò tI K}Ëõa¦ý¿i5<¼2ê@VjҝA[ï"{i¤R~£´fK ·ÎhÊ +žˆ›ãoKÁ«JFhÀ?Úíòny7Ž¾Û@gw©¨¦d=Ä1 ôñ|C>@°´Õöñ€ vçÖÂlÀC@‡iñ hÙK@¥¸p åüí£ß¸kôDoŠ MÒ†Ÿ‚æÆ»ÂÿŠày1öӂwÈüÏßDfoOçò=ô¥áséNVº˜iÆü÷”Éãÿ(݅,~ÀãÌxŒ¢8|]Æ?©'|ÃB]Oxë""úˆø×I–›Zô¯R‘-×.öh€!þ>òüXÙy·7s€EÌ>Úz¦Ð%@§½Y‡´L$¿uQòÎT_·^};[ª<´¾€eºÑœ†ÊMmng˜—y^J±x€ZqÒ·ÑÖRPÇþî„HÖ@ýÚo—ë|)ÛËÀ»e|°×øðWy°%~Oh§Áñ("1밎jÖ •®šeºZ´5¸æF—uÊNË_-6.aa؉·üŽö¸ÿ˜Lte&oCÝ雵hj|ivKHTýi²U}~R)«>·bû«„À4'ÅÝ*¹Ó¦>Ê«”¹C€d©þëϊ‹_Æl½ÎÏI±2w-2¿ÕE…¨Z†ʬAŽë© nŽ +Œ¿-óöû¨~½DÊ‘–c÷u½œŒÇ(­ÐªÈ–eõx¹ÌÇOƒ¾¶B Â×7s³y.JÑxºÊÃa`¹! ÒÕXV¨{%Xȓ8þ >¦` +endstream +endobj +1039 0 obj << +/Type /Page +/Contents 1040 0 R +/Resources 1038 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 998 0 R +/Annots [ 1005 0 R 1006 0 R 1020 0 R 1021 0 R 1022 0 R 1023 0 R 1024 0 R 1025 0 R 1026 0 R 1027 0 R 1028 0 R 1029 0 R 1030 0 R 1031 0 R 1032 0 R 1033 0 R 1034 0 R 1035 0 R 1036 0 R 1037 0 R ] +>> endobj +1005 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 697.621 159.927 708.151] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1006 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.425 697.621 189.845 708.151] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator_cdcf46a226e15d398fe41d10873779ca) >> +>> endobj +1020 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.2 658.393 215.13 669.297] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator_d96733e3e3c9087e06a052e5af198ba6) >> +>> endobj +1021 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.2 619.539 201.302 630.443] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator_ce05db6f6b402898007ea5bf6ea4a831) >> +>> endobj +1022 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 538.776 179.254 549.68] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator) >> +>> endobj +1023 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.752 538.776 235.981 549.68] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator_0673eda2d88204107796ffacffe269c0) >> +>> endobj +1024 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [239.797 538.776 317.046 549.68] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1025 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [326.949 538.776 372.966 549.68] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1026 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 499.922 179.254 510.826] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator) >> +>> endobj +1027 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.752 499.922 196.689 510.826] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator_80f1c0111cb5ffc8bfc06f7d4ad88b06) >> +>> endobj +1028 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [200.504 499.922 277.754 510.826] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1029 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 461.068 179.254 471.972] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator) >> +>> endobj +1030 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.752 461.068 202.228 471.972] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator_2a43c640dcbae8922c616491ad95e906) >> +>> endobj +1031 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.044 461.068 283.293 471.972] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1032 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [295.966 461.068 341.982 471.972] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1033 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 422.213 179.254 433.117] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator) >> +>> endobj +1034 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.752 422.213 194.467 433.117] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator_01ffce41500b158f8a1272d73418822e) >> +>> endobj +1035 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.283 422.213 275.532 433.117] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1036 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.82 322.142 219.642 333.046] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator) >> +>> endobj +1037 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1041 0 obj << +/D [1039 0 R /XYZ 90 757.935 null] +>> endobj +1042 0 obj << +/D [1039 0 R /XYZ 90 716.221 null] +>> endobj +1043 0 obj << +/D [1039 0 R /XYZ 90 677.486 null] +>> endobj +1044 0 obj << +/D [1039 0 R /XYZ 90 638.632 null] +>> endobj +1045 0 obj << +/D [1039 0 R /XYZ 90 557.75 null] +>> endobj +1046 0 obj << +/D [1039 0 R /XYZ 90 384.893 null] +>> endobj +1047 0 obj << +/D [1039 0 R /XYZ 90 223.198 null] +>> endobj +1048 0 obj << +/D [1039 0 R /XYZ 90 200.886 null] +>> endobj +1049 0 obj << +/D [1039 0 R /XYZ 90 200.886 null] +>> endobj +1050 0 obj << +/D [1039 0 R /XYZ 90 96.202 null] +>> endobj +1038 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F65 249 0 R /F81 703 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1060 0 obj << +/Length 1318 +/Filter /FlateDecode +>> +stream +xÚÝXßs›F~×_Á[ÑL8Ýo@o­kg’&3©í>Ù–N-õ€8Î_ß=î@B¢’Üi§™<ÁÁÝÞî·ß·{€½¥‡½·£ŸnG“+ɼŒJïváÅØ %A‚ïvîÝù#‚ÇÁû›D¯“ÇM‘½¬Ô\'Yú¤ý2¾U¹ÒIUèǛ—²Rëq@ö/²¤,ííµZ(=&‘¯ò™k„qæ³hüpû~ty;úsDÀì‘f{¢ o¶Ý=`oÏß{±8òž›YkS×Ì»ý:ÂGC¡ a)ºPbDuєUR¥³q…¡ß`‡§N³4Wfväßc?À(я—_66̲L‹Ü„7¹ŠÈŽOœPÄcp¸ñ(SvJÏ푘¶3À6qsÄΜ€“Ɉz%Š… ð.͍WoƁìâ{°«ÞYaYˆ$åvÙµªj»LU+eol|æ®XØë<ÕjVuqõ"„#µ^«MŠÃnj2ߦn€€P‚¨à^ٓ<´K.¿ÌÔÆì^N{‹·Fz@“…8[ñŸë:¯ÒµºÔºÐ¹=Oz>,‰DëõíJc*üç|0úéÂ^̘”þªXK HQ—ö ©²wâj#Iø1Ø Í¬cƒV­J•Weoc°®Óeš['ŠÅÞËÏc"|Ȱ쪜!AXŸ;å&™)4@ǀPŽ""¢ž”Øž”(íIÉ ¥4&þ¡š6EšWvÅkäÄb†(a'õÔÍmpÉü‹"°XpŒDz…ZÜcLg)=´§D”w9›ìÈQ‘ +†ý"ÚM:W¹€zÆå9úm…Û¤p Â(‚ÀP/B\vŠ ˜ˆÊ=þ±ä1ô9H>þ&%o L‡d Ê`G0HvE?u™úªt1(82ÒpPq|Oq1»Š3Ãsš—N^Ìdùö®&¼ó[EXħzWx&‘!8 û[&òwÓ»ä«zWØS’pJº(v˽-g(h} ûŸÓ²it°È(éoÏ°D| •£ú`}o§öHþnÿ‘mõ­VPUÍQ0†É~áQ)Àë¼NšEÑ3ˊ²Ö»=åÓØ®òÒªl…fHfaâ„V “ +8ÉÿkR‘ÿWÍüùqüó“ @V +$&HBÝ +hˆD¶¾»™óbV¯ÑI|óhÑZnÜuÆ»O´gÃçÄ ––èjîVêb½WbE–Y”Ò|Ù*ÓLõÓæÀ€Ù¾.bÇç{JEÖ] @ŠÛFf¨ó{2¦ 0³GÒiÛ¶ jK­3Í8d/üï>W›刵œýÑ®*wŒµgÙnUÕ'°Ã 2ŮƪŸ²æ ?ªõSK’«:ošWy”Ä-ÐÉö‹÷hû‘­—îkûúú’½ôìW¸]†Î9±”¼¡>xÁM‹‡³0wiÿY-’:s4ŸA8•®MeŸB©î=™t×i6wIHmÕzS½AØðÖxo:EC—hÐÉöºÿËAFÃQ÷Ì?͟À^©·DŒ„à{"üÔø,t֊vøÁòÑÞï²Ý¾Nòe,©wy¥ô¢ÑèÌ=ú­Tú#ØÇ$¯“lۍlïÔeWŒ65)Dò¥NŒ?¼öî—QSï¶!R!QDºCЪª6ÓÉäùùÍJTçéF£´šl6Ù䐤[+æ7AHº³VW‘Ö…V¶ª±> ²!,rÿ Ò&®›JÖÏ+äñ/:ÐÏ +endstream +endobj +1059 0 obj << +/Type /Page +/Contents 1060 0 R +/Resources 1058 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 998 0 R +/Annots [ 1054 0 R 1057 0 R ] +>> endobj +1054 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 116.175 190.054 127.079] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator__System_b1265553cab293b2c77d31f57682ae2b) >> +>> endobj +1057 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1061 0 obj << +/D [1059 0 R /XYZ 90 757.935 null] +>> endobj +1062 0 obj << +/D [1059 0 R /XYZ 90 733.028 null] +>> endobj +1052 0 obj << +/D [1059 0 R /XYZ 90 625.809 null] +>> endobj +1063 0 obj << +/D [1059 0 R /XYZ 90 611.239 null] +>> endobj +1053 0 obj << +/D [1059 0 R /XYZ 90 508.593 null] +>> endobj +1064 0 obj << +/D [1059 0 R /XYZ 90 494.022 null] +>> endobj +1051 0 obj << +/D [1059 0 R /XYZ 90 379.172 null] +>> endobj +1065 0 obj << +/D [1059 0 R /XYZ 90 364.602 null] +>> endobj +491 0 obj << +/D [1059 0 R /XYZ 90 222.597 null] +>> endobj +106 0 obj << +/D [1059 0 R /XYZ 90 215.997 null] +>> endobj +1066 0 obj << +/D [1059 0 R /XYZ 90 135.149 null] +>> endobj +1067 0 obj << +/D [1059 0 R /XYZ 90 135.149 null] +>> endobj +1058 0 obj << +/Font << /F63 247 0 R /F81 703 0 R /F65 249 0 R /F50 215 0 R /F70 298 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1087 0 obj << +/Length 1227 +/Filter /FlateDecode +>> +stream +xÚíXYoÛF~ׯط’@´ÚƒËÃ}J“ب›©­>ف@S+™)EªKªªûë;{iY6\»-Ð6xhvö›ýæ$AKDÐÙè‡éhrr”à$d!š.PBPR,EÓ9ºò(Á”úcJñÖ©Z¥³uUÜÝʹJgE~£Ruwrr¦òùìL–R¥M¥ü1Ä{W¤umo/äB*ŸÆž,3 º˜ÇÿËô|ôa:úmD AÔl."q²Õèê AsxŽæIŒ¶Fj…ÆáZ ËÑÏ#â !û ²g%!xŒ"Æ1 …µêš1a¶oס«± Ë´É}&¼ß}*쥶»=óÈá ( žpäìø‰‚yLcŽ#P<`ìBþ\P¿—Mš­ï¼—u¦òµÁkô˜#@Y€yXEoéwu#Wyæºl“Am€ê•4Â!sÞêÓH¯ºù*³ÆÝÃR€š[i_d&ƒ<Ì2ˆt9gviA Ù™¼¶êR{iÑê­ Zx·Cû~ Ô˱Ä斵ËV›¢Ék¹‡u‡¿~ŽúD(N„ËH»ìù€Ãy)5<ã`é]{»® Ü»ÔàX̊ªÞ(¹/¡ý½O…ÛxzëäæU¶YõuÑ&sã‘Nu—Ö·>Õi¨GxëG U­Ú¥²UV•åm(ׄ°BžôM¦6_ƒIp<; ùÇ_SŸH°Mê#{ÎÌF„ÓÎLãèµjÜSCg J흦·¥4UéJBw!¥†²†Qܙ×ۄ3LGíçÍM‘gvÍ'¹ºi5žnÊL“\÷ŽtX7[ ~+›ßÊæ¶lŠ8ò'ÕÍK ȅÓ?ZµÝô(iƒÔÔ7ð5:›ÌtÒyˆé·ô>ªTÍ>ü±V²®]§0T!_ÌSºbÐöºŒyn%Ûõ+}! "¦ã^ð‰g…#å AŸŽ¯Åâ®T¼‹oŽc~WɅN3ºg9„ì!%Ù˻ح[¯L>Õ'Xˆ¡9;æº;¢­@×TÕùŸò€>i?îÚr9™POƒg&}`ÿª—™\ašŽÿ›››m½jpqÌXô˜+uÎ19 "Àï\cþ¬u¯xAb"¿?ôÑúþnçzp"Ôkډp/¤;>›û·“h'™jXMO*Ǧ“Gjwê÷Kí÷=¡á—¯0Æ$ŒŸúá«ýÐâ$<ö˝H "ƒ¹î³É”ÐêºÇv´±í|cÎ÷§'ûsZ.7éÒ©úQ·È 3öeîÕ/µTßùBxîT?¥å¦í¡uf° ¨ª»NÎ||`v…ÚRÙö ö0~EíÝO#,;™qL»€»mšõÉd²ÝnqVãM™¯ΛÉz]Lî·_;-?Úu„ݐ»ª”ACT=#Ñ8‚E.é楝À<äñ/A¤B˜ +endstream +endobj +1086 0 obj << +/Type /Page +/Contents 1087 0 R +/Resources 1085 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 998 0 R +/Annots [ 1055 0 R 1056 0 R 1068 0 R 1069 0 R 1070 0 R 1071 0 R 1072 0 R 1073 0 R 1074 0 R 1075 0 R 1076 0 R 1077 0 R 1078 0 R 1079 0 R 1080 0 R 1081 0 R 1082 0 R 1083 0 R 1084 0 R ] +>> endobj +1055 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.2 719.912 215.13 730.816] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator__System_7695c9f42b5164da2b71e7a2b1382d06) >> +>> endobj +1056 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.2 681.058 201.302 691.962] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator__System_58d5c27c8e3d638fc7d25ee54d04b08c) >> +>> endobj +1068 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.27 580.987 256.414 591.891] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator__System) >> +>> endobj +1069 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 569.032 130.826 579.936] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator) >> +>> endobj +1070 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.2 412.417 215.13 423.321] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Grid__Generator_a32ef5503c68b0c2ccbd8d69251ecfd7) >> +>> endobj +1071 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.2 373.563 201.302 384.467] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Grid__Generator_e846d01ef7cc5222216fcac8f2d255c9) >> +>> endobj +1072 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 292.8 202.497 303.704] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Grid__Generator) >> +>> endobj +1073 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [202.995 292.8 240.962 303.704] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Grid__Generator_27971df55a7b8e685f759f3001b0aef8) >> +>> endobj +1074 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [244.778 292.8 322.028 303.704] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1075 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 253.946 202.497 264.85] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Grid__Generator) >> +>> endobj +1076 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [202.995 253.946 244.818 264.85] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Grid__Generator_3043f8c7edfaa1e5c98955234589301c) >> +>> endobj +1077 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [248.633 253.946 325.883 264.85] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1078 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [335.786 253.946 381.803 264.85] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1079 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 215.092 202.497 225.996] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Grid__Generator) >> +>> endobj +1080 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [202.995 215.092 246.502 225.996] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Grid__Generator_5dcfc9bdd9d995b7be67da9f47e731ca) >> +>> endobj +1081 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [250.317 215.092 327.567 225.996] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1082 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [337.47 215.092 383.487 225.996] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1083 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.82 115.021 242.885 125.924] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Grid__Generator) >> +>> endobj +1084 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1088 0 obj << +/D [1086 0 R /XYZ 90 757.935 null] +>> endobj +1089 0 obj << +/D [1086 0 R /XYZ 90 733.028 null] +>> endobj +1090 0 obj << +/D [1086 0 R /XYZ 90 700.151 null] +>> endobj +1091 0 obj << +/D [1086 0 R /XYZ 90 643.738 null] +>> endobj +492 0 obj << +/D [1086 0 R /XYZ 90 518.839 null] +>> endobj +110 0 obj << +/D [1086 0 R /XYZ 90 512.239 null] +>> endobj +1092 0 obj << +/D [1086 0 R /XYZ 90 431.391 null] +>> endobj +1093 0 obj << +/D [1086 0 R /XYZ 90 431.391 null] +>> endobj +1094 0 obj << +/D [1086 0 R /XYZ 90 392.656 null] +>> endobj +1095 0 obj << +/D [1086 0 R /XYZ 90 311.774 null] +>> endobj +1096 0 obj << +/D [1086 0 R /XYZ 90 177.771 null] +>> endobj +1085 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1105 0 obj << +/Length 1407 +/Filter /FlateDecode +>> +stream +xÚíXK“›F¾ëWp T™Ñ<˜”Sü¬8v•³ÞœÖ®-$^ÀÊúק‡Ðâ•\NIù$5=Ý_ýÍ;[;¯O¯˗‚91ŠÎõƉ± +‚8%ÎõÚ¹q F„z>Á»u¢Šä¶®òû\«ä6ÏîT¢îW«W*[ß¾’¥TI[©Û÷÷M+ ϧ»Ïò¤iÌã•ÜHå‘È•e*=? +£Ð °÷ñúõâÅõâρ°CúxˆBƝ´XÜ|ÄÎÆ_;±8rö½Uá”Áoî¼_üºÀ6|œÇGi,PÀ"'¤ aÁMn(åýôÃw΍Ï!ÏÄÄ é&…l¥úqj„ŸÄ(ÑE^¶›ºÊÊi«¸}bâòœÙs‚ÔßÊâp락ìʴͪҼ=¯Ò®e›ôCà\‡FÄøÄ"ÖS£-SÏgAìNK¦Ç¢Kë»Zõ9åY)¯˜ã7ð–¨[&Ž¹ãÅ_µ©{ÓØ@—/#r„B#&ø¬7—38( £ÌG¬ ?®1A%ƒÑMVêŸx¾Sÿh¾š0à CÄ!0Gÿñ•l;UZÞ¶;iLÆú©Ú˜ßu¦dڎI„ $5™š£8 ЄChB¡<€ò2øe®©¬õìÍjòñÁÉe¡°O4>”æª+Û¬/”ªÔèî$’“FâˆD|ˆúz§*rw”d"t³ùí1cB¸»ª¨¶ÀœªkÌ?@²Ö<ˆ3¨qŒ ƒ-F‚ÑÁ@ÉZÉš ™L ÞU¶ÍJDµ9ùó“G¸ •æk¾BÓ0Ä ³´ÆuS'©œmZ¦C Ž$âiӎm;4¥ÀüÓnƒÁøòv…h®¹ŽšïlŸE 6?×gl0€ÞÑBö¬’›Ó4˜g¼rŽ¢xø&=çô±æ¥_ݼD€žcvI÷P¼¼…¡ÐDˆÇÈ¡@ŒÉ'åÚ8m²ÏrÆ PÄGk¹\Ï8„D⽑å'ƀ¡°iÚÊ?­ÚÝÌ$ <>39è˜g2 Š#SÖ_pŽN”™2·ê$Éõ…aMÇm¿H5OôXìî³Ö#îΘ¯åÆ#°Tvyk>i1IòN6æýˆÙ†Õ«Õg©*MúžHfšv°ÖLÕF¶ÞV¥lŸ(yðÓßµ&þÖHC~ï ~F“1ŠF¨7(2ÿvEÿ¼"k*fs*PXp¯î­3ÛJùùMLÈPHÃyAd1œÄð+÷ýžê»"~‹"ööI;A„Q„Ϫ߸ƒYθ€Þx”g·@Žf ,Æôÿ!v uíw±û/‹Ý‘¼ÑxÀ†©m­'§°~hS©¡Õwéá¼ïY`_¶FÕ¤Ý8lTUœté¦Ês“dVn͐.y.§¨;ÃIR—èÌÑôD}9ÿ÷Ä£Ø2r,C:=¨ ëâ_¾xX#{² b3óOvŸuälØÐéÅa‚m¥š¹U ÛC·•ÈwÝ]Þ/O|þÈÝ> endobj +1100 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 101.154 213.297 112.058] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Grid__Generator__System_84738aa470464f9f3192817554d26d30) >> +>> endobj +1102 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1106 0 obj << +/D [1104 0 R /XYZ 90 757.935 null] +>> endobj +1107 0 obj << +/D [1104 0 R /XYZ 90 686.641 null] +>> endobj +1097 0 obj << +/D [1104 0 R /XYZ 90 664.329 null] +>> endobj +1108 0 obj << +/D [1104 0 R /XYZ 90 664.329 null] +>> endobj +1098 0 obj << +/D [1104 0 R /XYZ 90 550.355 null] +>> endobj +1109 0 obj << +/D [1104 0 R /XYZ 90 535.856 null] +>> endobj +1099 0 obj << +/D [1104 0 R /XYZ 90 404.417 null] +>> endobj +1110 0 obj << +/D [1104 0 R /XYZ 90 389.918 null] +>> endobj +544 0 obj << +/D [1104 0 R /XYZ 90 207.67 null] +>> endobj +114 0 obj << +/D [1104 0 R /XYZ 90 200.826 null] +>> endobj +1111 0 obj << +/D [1104 0 R /XYZ 90 120.049 null] +>> endobj +1112 0 obj << +/D [1104 0 R /XYZ 90 120.049 null] +>> endobj +1103 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F81 703 0 R /F65 249 0 R /F70 298 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1121 0 obj << +/Length 1187 +/Filter /FlateDecode +>> +stream +xÚÕWÛrÛ6}×Wà­äL¼Óon{œ6ÓÔRžìŒ¦ ™)E± Åßō%ùÒ&îL4)`÷ìž=K€ "èrôËl4¹HB”ã< 4[¢œ 4¡8(š-ЍG ¦¡?¦„¯abÍæͦz¸ç ÁæUy'˜x8;»ªýˆx_}J5˜ɇ…ekl23ôàÁŸñ8ðjփÿY½H½s¬§™1@½uWɲåè.œ¶é"§8Dz-ç碃%ÃèÂòN&væÌ/6…î×{E ÃLt¥íÐÓ­n÷í€>WK±Y»­Ü«ª’è¶À-!AÅφ8©éðÇù3}ø$›ø óõ5_̪(D:¥  ]îÖEašeÿõwîY½ô†\ÎY׺ÄÞ=¸æm¨+§!¦8FFBG!HÚ¥õcwW•…Ùû¯ï¸¥û¢« ã?ç‡LÇt>èR§y:Y©Š¹«!~Éì8“tåé^m¿§E¿ ¥è +¥Jé Ûe˜c’7ËðG4ËHþÿKêñÓRYÁüCí§;ò¢gµÿû÷êúü(¯$ +úŸ¥«‰u²t +|JÅ6cSÅ£Uñë+ÚÒÑZ§Q”½¢(}öì¥ömkæíÉã—2±/tµVª€Ïj”§êôj<•õB•À +à~ø_æ5B1$øb®êO´è¬ù¼âõj°X‰%ÃQ’ÛO¯ ~·}oÛKÛ ´š†ÃvóI–U)† Ъh+T>YÓôåáNM +M;|%¹ªûoòéöá­*É0I²—^ªÜ¥)Áy +ub.‹qŽãø°Á|ÔÈAHöÑ©É<þf$eÞï ÖüÍêUÇVÖԕº¥,uÿ)ì«O-?ùqìÙ|`uç®1ªhLŠ¶Ï-țà@‡ýq¦¦œÛ<™dü‰Üìב>sïB âg´¿æÜKٜM&Ûí-î겸”“¦©&ÇÒÚY%Nw÷ žìõFh$ èŽía‚Æ)l²—²6W6ÕØցǿš  +endstream +endobj +1120 0 obj << +/Type /Page +/Contents 1121 0 R +/Resources 1119 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1130 0 R +/Annots [ 1101 0 R 1113 0 R 1114 0 R 1115 0 R 1116 0 R 1117 0 R 1118 0 R ] +>> endobj +1101 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.2 706.961 215.13 717.865] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Grid__Generator__System_183f982bd3198d2c455e51e7cedd4e33) >> +>> endobj +1113 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.2 668.107 201.302 679.01] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Grid__Generator__System_4f9d506f39d5a65a2c2cec090a1578f0) >> +>> endobj +1114 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.907 568.036 278.294 578.939] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Grid__Generator__System) >> +>> endobj +1115 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.526 557.057 190.592 566.984] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Grid__Generator) >> +>> endobj +1116 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 399.466 234.059 410.369] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception_df699afd1b4f9dbc15fd31424e9d15e7) >> +>> endobj +1117 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.627 160.404 246.21 171.308] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1IO_2080ebe48063615d891b98ef65f2ca71) >> +>> endobj +1118 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1122 0 obj << +/D [1120 0 R /XYZ 90 757.935 null] +>> endobj +1123 0 obj << +/D [1120 0 R /XYZ 90 726.054 null] +>> endobj +1124 0 obj << +/D [1120 0 R /XYZ 90 687.2 null] +>> endobj +1125 0 obj << +/D [1120 0 R /XYZ 90 630.786 null] +>> endobj +545 0 obj << +/D [1120 0 R /XYZ 90 505.888 null] +>> endobj +118 0 obj << +/D [1120 0 R /XYZ 90 499.287 null] +>> endobj +1126 0 obj << +/D [1120 0 R /XYZ 90 418.439 null] +>> endobj +1127 0 obj << +/D [1120 0 R /XYZ 90 418.439 null] +>> endobj +1128 0 obj << +/D [1120 0 R /XYZ 90 362.145 null] +>> endobj +546 0 obj << +/D [1120 0 R /XYZ 90 266.826 null] +>> endobj +122 0 obj << +/D [1120 0 R /XYZ 90 260.226 null] +>> endobj +1129 0 obj << +/D [1120 0 R /XYZ 90 179.378 null] +>> endobj +1119 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1145 0 obj << +/Length 1373 +/Filter /FlateDecode +>> +stream +xÚÕX[“›6~÷¯à­0S˒@\ö-Í¥³iv’f¾l2Œe›ƒ+ Îæ×÷èŒo&íL_ldKçœï;W­…­_'¿Ì'³W¾kE(ò©oÍ×V„­À'ˆQbÍWփM0"̙Œ±½Å.^ì‹ìqËW"^déRÄâñææ Ï7ÕvñR‡„v!/¿$|_¥EîL)Ãöó,.Kýøž¯¹ÚÅó„;ӐQßö¨óiþzòr>ù{BÀ.le Pà2+ÙM>ak¿¿¶0r£Ð:¨];Ë£.|gÖýä÷ ¾ˆ‰ºûìˆÉCÄ zÁ«8ÍøJÛ÷‚—‰Hµí`ÔìÃIؚR¹^¤=Óg’#¼¤È2žTi¾ÑëÛÙ[ý°®óD +-‘Û3ĺa×ݦä\¶BKRFÐ'äÀY:%ª˜&…*†0-èLlGn¯‹¨½Æ’¿3î¦ÈCÌû>Hq–•¥C±]W—À9¿œ7„¸ˆ2ÏdŽé2ïyU ÉQ>H›¡³ºéBðT‚7àt + ]Š¡fÄ• Q¨!ýc«^ç:8-OÚêA¥¹YlxÎE\5j×¢Ø èYC.ÊìC›†’±Œ÷‘ZÄGž*^‚¦|¤”õw=¨Z}ûýKg|–‚ã¶úêVC5ÑFž ò÷¿ ¾9¢´‚Rãºl˜[>6åÈÔ£eºéÆé¬L¿F5è¬æWÌ/ïêe¦Æ 6>½”íq E³3.Ñ#¢Ø˜Yñ}ë¤#=îÔñÐN,:x›n9Ò>l…` ï5cƒ'+²‡¼ÐÓ>P•¨“ +‚˜b£3‚úiéFRÂ”Û™Ø؏˜Lÿ·K-jðþ í]NèñXùþ$÷¿™äPÕc©j¯ó·,@~?;vŒØ®;t¥`Ôq·ù–‹T3Ž=*CB34’W°Á½ +´,bK•‹çtP Pú(I¹žr;üÃü{^‘uÓDg°·Að"UúÉ†Å+µêùW‚UŠîëÝÓ¤Fú(¢«TΗÙ鎗OQúîS`}ÈᏁ¦‰ß¥y=¢ZO2ùê‚c~Š ¨J‹4^f'ìØá‹F˜W¯|o Þ@Šù( + ¯õû7)6¬rïdbIfÙÀÐË7‹^¼îVýwœoêxcDÝæp_QSfÜÜ >”\üä0f›Bpçuœ9m·ú,µÃ%§-Ps0¢²o!ú/¶ïyC”&ã/«yúm¢.Gˆ”ù($A3¯n«j3›””¨ÎÓ½@i5Ûï³Ùi³>J!ÐÒ^Uے¿+77ò.³.\Ú8Dšû lÜ©VqâǍfè¥ +endstream +endobj +1144 0 obj << +/Type /Page +/Contents 1145 0 R +/Resources 1143 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1130 0 R +/Annots [ 1132 0 R 1133 0 R 1134 0 R 1153 0 R 1135 0 R 1136 0 R 1154 0 R 1137 0 R 1155 0 R 1138 0 R 1142 0 R ] +>> endobj +1132 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 320.85 215.509 331.754] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Length__Error__Exception_5b5e4c1fe8b8af4696ac7cc839fb3b40) >> +>> endobj +1133 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.625 122.154 408.678 133.058] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Coefficient) >> +>> endobj +1134 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.987 122.154 513.996 133.058] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Difference) >> +>> endobj +1153 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 110.199 245.674 121.103] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Difference) >> +>> endobj +1135 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [258.591 110.199 465.892 121.103] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Sum) >> +>> endobj +1136 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [478.809 110.199 513.996 121.103] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Times) >> +>> endobj +1154 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 98.244 272.713 109.147] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Times) >> +>> endobj +1137 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [291.772 98.244 513.996 109.147] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Unary__Minus) >> +>> endobj +1155 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 86.288 116.46 97.192] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Unary__Minus) >> +>> endobj +1138 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [136.326 86.288 358.55 97.192] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Variable) >> +>> endobj +1142 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1146 0 obj << +/D [1144 0 R /XYZ 90 757.935 null] +>> endobj +1147 0 obj << +/D [1144 0 R /XYZ 90 733.028 null] +>> endobj +1148 0 obj << +/D [1144 0 R /XYZ 90 682.403 null] +>> endobj +1131 0 obj << +/D [1144 0 R /XYZ 90 660.092 null] +>> endobj +1149 0 obj << +/D [1144 0 R /XYZ 90 660.092 null] +>> endobj +547 0 obj << +/D [1144 0 R /XYZ 90 427.824 null] +>> endobj +126 0 obj << +/D [1144 0 R /XYZ 90 419.797 null] +>> endobj +1150 0 obj << +/D [1144 0 R /XYZ 90 339.363 null] +>> endobj +1151 0 obj << +/D [1144 0 R /XYZ 90 339.363 null] +>> endobj +1152 0 obj << +/D [1144 0 R /XYZ 90 284.404 null] +>> endobj +548 0 obj << +/D [1144 0 R /XYZ 90 192.768 null] +>> endobj +130 0 obj << +/D [1144 0 R /XYZ 90 184.741 null] +>> endobj +1143 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F81 703 0 R /F65 249 0 R /F70 298 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1186 0 obj << +/Length 1342 +/Filter /FlateDecode +>> +stream +xÚÍXMsÛ6½ëWðVr¦‚Iߒ8Î$­gR[éÅÎh +’˜R¤Ê(þ÷]õMɪåä$’"‹÷vßî[ [:oûÞ w­…œr«?¶Blùœ F‰ÕY6ÁˆøN—`Œí¹Ègb0ϒ§©åbÄÃ\äOWWÆ©ùàýyîÀ–Egéà]&ǏÓ(–iét)Ãö»D…¾¼“c©ßN#ét9q}Ûs¯ýO÷ýοb‹Ô1ù.³¢Yçá+¶Fðü“…‘Ö¢~kfyԅßĺïüÕÁ­›£.œéÍ}®†IinålÕ×7U•°…¢vgi¯wÃðš1‘çV—äs® >RÊ6¾Ñ{È'f3w:ÖC—–ki¸Ž¦<+ªÙƋæñ#fØ<ßýðÈZÆÄØ [N,÷íc+€}sOí›RÄ=ju‰‡°g€¼“e•§†Ùr*ÆÙú"+Ã@[³ÃCD]V¨-”Ó¸Ð/m.æ¸dù’HG{ †xؼó´Ç +C@”ùíÝ㎻ÄåÈ'X†°!äÕX–¹ˆÊ_ŠjÞFõ(«\V) y¬Sú ó!h +ã§0ñôñ~x&ó :œ†¯Ì|Ïdñ|ڕÔ:”Ù+¹Ýc"zù ½÷˜ª¨lá; ˆî³2½Áaˈ-i4#ziÆ(3ŒÓWb¼J¡„fqZäýåyK¥ãa{"T‘k#Ž¡€MTèȹS¸ñý#IfÃb]ày& Q’(—&@èŸ(›?5°o2“ÔîëkéPl«žJIj½—ç¡»t§5ž ¸)ĂRïa¶ñå¾ÌãtÒ·(¢8ŒªÙüòà™P­—Ô—ã :Ò²”#}§¥ÌS‘è;Û>ÅcáNB‚\î_0ÞA^ µ.KI™m¼uñh.ôjgbHꝀ9m‡|«Õï’ + +îz¹ž·šf8"fž¹–¥ˆ“eð\Ë"Êãyi$c‹: œy`(ԆÞìËV ©QÚIõQm„AïB"„‚9ü&ëŠr­ðL+\DõŒt˜aøæx—vr©þ + +½Ðæ—C¶å²~­œŠÒ8"Œ»C©ÿ*=ªâÄü?γ™¾'¹Ûm !(d’Õ;„[ä±&ÛRlÿ~x‰<ØAdp¬%z¾ÅûÙëù6öbpמBó\7Χ¯±·Þ ¾ÔÅ힎ÂÞ•ý¦‰Ï¢j¶™³ °Ë›¬V3üÂ!JŽõÍD¦2›èX¯mã,I2µÓE£ŠD^mú¹6Y‡aØ.’;ÛG߄ +Óïjaǵ4ÜT+ƒ1ïºÐ+¯zÌñÿuE?[ÏÄ ¬›c+ø7‰7jø1Ê<.‹ö;Ž½*¤£mK—ÁªlÀ½˜ÁISÔÏÄÞí£í~¾)(5÷¹)¿ó,5™Vf§¶ uð@Änìagƒ²Ð#“Ø™‡.Ô#ˆbïÜA¬ƒÃl¦“Z/Þ:íb¼¿}ZÑ÷Ó„K ×Ÿ½Ös¥%î㢶íóh ̃S£ëchÀÃ¤ ¡¡Yˆó¶êïg¥ôJmÍíRrSèkÝÕ7ŸÖ‹œþ[¤“JLŒ©j×åyy÷¥ùoc¶äV¤ÕrTR@ë1#_(‰Q…?r@´aøK–4ÿXË«?:µ>¬¶HGÁê¤fZ–ó«^o±X ¨@UÏs—½ù<éí +üÊ +2ýÕ¬Õ4#³,¯=ZâÃdàr«ëÃGæü NõX¸“Àã³B)6 +endstream +endobj +1185 0 obj << +/Type /Page +/Contents 1186 0 R +/Resources 1184 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1130 0 R +/Annots [ 1139 0 R 1140 0 R 1141 0 R 1156 0 R 1157 0 R 1158 0 R 1159 0 R 1160 0 R 1161 0 R 1162 0 R 1163 0 R 1164 0 R 1165 0 R 1166 0 R 1167 0 R 1168 0 R 1169 0 R 1197 0 R 1170 0 R 1171 0 R 1172 0 R 1198 0 R 1173 0 R 1174 0 R 1175 0 R 1176 0 R 1177 0 R 1178 0 R 1179 0 R 1180 0 R 1183 0 R ] +>> endobj +1139 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 698.146 191.16 709.05] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1140 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 698.146 210.258 709.05] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression_d3d011ec5cd66a3e9bf71053d6b818b5) >> +>> endobj +1141 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [214.074 698.146 291.323 709.05] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1156 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 661.09 191.16 671.993] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1157 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 661.09 225.192 671.993] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression_3866453e844ec10e038e9ae2b336159d) >> +>> endobj +1158 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [229.007 661.09 306.257 671.993] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1159 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 624.033 191.16 634.937] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1160 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 624.033 215.239 634.937] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression_af751a048f4895ec1ca6eb753a196908) >> +>> endobj +1161 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [219.055 624.033 265.072 634.937] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1162 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 586.976 191.16 597.88] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1163 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 586.976 245.675 597.88] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression_2a76c9ab182bf0cbd015cea16a24c635) >> +>> endobj +1164 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.384 549.92 224.634 560.824] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1165 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [225.132 549.92 248.703 560.824] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression_f5d9b1e4dec7faf038dd87f36773252b) >> +>> endobj +1166 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.2 512.863 215.13 523.767] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression_0c0b91260da0f4729a335faa3747c397) >> +>> endobj +1167 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.2 475.806 201.302 486.71] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression_491b55e596bb0dc1e707355a1b2169b5) >> +>> endobj +1168 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.08 377.443 257.33 388.347] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1169 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.703 377.443 513.996 388.347] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Variable) >> +>> endobj +1197 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 365.488 173.446 376.392] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Variable) >> +>> endobj +1170 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [182.861 365.488 309.116 376.392] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Coefficient) >> +>> endobj +1171 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [318.531 365.488 419.033 376.392] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Sum) >> +>> endobj +1172 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [428.448 365.488 513.996 376.392] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Difference) >> +>> endobj +1198 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 353.533 133.337 364.437] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Difference) >> +>> endobj +1173 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [136.326 353.533 273.899 364.437] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Unary__Minus) >> +>> endobj +1174 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [121.93 238.558 305.978 249.461] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1175 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 185.406 240.166 196.31] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Coefficient_b531066aa6dba222c8c61a8c3978257d) >> +>> endobj +1176 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.981 185.406 289.998 196.31] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1177 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 148.349 159.927 159.253] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1178 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.425 148.349 199.867 159.253] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Coefficient_24d3c42f7ed7c7a99a8a2bb5369eed4d) >> +>> endobj +1179 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 111.292 240.166 122.196] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Coefficient) >> +>> endobj +1180 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.664 111.292 264.235 122.196] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Coefficient_edf10f9d2de45d7e8de1809d4417741b) >> +>> endobj +1183 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1187 0 obj << +/D [1185 0 R /XYZ 90 757.935 null] +>> endobj +1188 0 obj << +/D [1185 0 R /XYZ 90 716.221 null] +>> endobj +1189 0 obj << +/D [1185 0 R /XYZ 90 716.221 null] +>> endobj +1190 0 obj << +/D [1185 0 R /XYZ 90 679.284 null] +>> endobj +1191 0 obj << +/D [1185 0 R /XYZ 90 642.227 null] +>> endobj +1192 0 obj << +/D [1185 0 R /XYZ 90 605.171 null] +>> endobj +1193 0 obj << +/D [1185 0 R /XYZ 90 568.114 null] +>> endobj +1194 0 obj << +/D [1185 0 R /XYZ 90 531.057 null] +>> endobj +1195 0 obj << +/D [1185 0 R /XYZ 90 494.001 null] +>> endobj +1196 0 obj << +/D [1185 0 R /XYZ 90 440.194 null] +>> endobj +549 0 obj << +/D [1185 0 R /XYZ 90 310.531 null] +>> endobj +134 0 obj << +/D [1185 0 R /XYZ 90 301.144 null] +>> endobj +1199 0 obj << +/D [1185 0 R /XYZ 90 203.481 null] +>> endobj +1200 0 obj << +/D [1185 0 R /XYZ 90 203.481 null] +>> endobj +1201 0 obj << +/D [1185 0 R /XYZ 90 166.543 null] +>> endobj +1202 0 obj << +/D [1185 0 R /XYZ 90 129.487 null] +>> endobj +1184 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1220 0 obj << +/Length 1116 +/Filter /FlateDecode +>> +stream +xÚíX]s›8}÷¯ÐÛÂÌZÖâ#omÓtšÝÎdSïSÚñ`,lº¼Çñ¿¯„l'n’ú¡Ó'@ˆ«£sν’@`ø0x;Œ®\ +¸Äãx.†Œ`0ž; #ˆ}{ˆBÖ*Ëp²ÊÓí‚ÏD8I“©Åöââï$㡘¼X û/Š$Ï&—IsݐE܆¬wiXúö–wÞº”PËqì¯ãëÁûñàÿ–À"æA2-w_˜Éök€ |°©z-C¨¼¦àóàŸztv„Bä2=»› +@^ò¨ä3 ëMYŠdjd­K^Tpêx£+†v‚a:ÔCB <ð !¬óžƒ˜›ÉÜ~€»!“d¾Ëylf}AˆD Ïʧ?Sð"óYÜëÞ½Ž®<|‰ÔuR‰Ðub2Ï /Œ$UDÉB ¤j6õ,¾Ò—B6'Ù\¿)ë/ÓJv}Ïcuw¥?<ˆ°'ȐI}©`c9bcºK^†IZ«sɋH$«RÆWá{Š )†©÷Í!”˜)”¡nÓZ'©™w,ò¥¾ íã ?ÕÄÔX¥Kœ³)ÈVÁGŠÕ“eô­¬3ãÉÐä{>ý&”:oÃcµèe¶²¦4´òµê²o϶b¯¶Æ lò!’ÅidºKgʯ¤îf³Q0ƒn€ë>ÛA”>1ïáËPÇb|©'¯2‡¾Øc§­˜)ËÉBNvR$³£F|‰ny¹Y_N5®¾Sƒë» +A-êî…7UËÅ>ÿDnÏpð<°ãAâÑ3K ’ùâ·?KƒÇJíñ}dšg?EˆNAÜ©W½R–ÏÞ¾Þ¦Ý?W Z¯¶]¿Óõ±…á9vǁ4¡w‚ÝÉ3ÝîRè¡àÜçLŒW•íG)'L²é¿B…é' ö]¹Ù÷öSþKŽSgØC³_òÕ­Ë{'¨&@ÿw‡+÷q®êߎê/‡Ôͅ'±ê¿r£ÅXÿhz£$PóXŸBl³W®Ž"úáz«~fóu87¡>f%qEzí€ .þ°³Œ +ŸÂl¦v³¨Ü«Ñ¹hÞҗµÖ@[žcõ™×+’&ã?Pßý5¨r¨"a.ôqS¶e¹º6› Œ +¸Î’•€I9Z­ÒÑþbÐFÁ2ß½6É‹-sQ!‘ˏ'Ӑº`èɏÌ/±$“—•5a_Çï®OÏí +endstream +endobj +1219 0 obj << +/Type /Page +/Contents 1220 0 R +/Resources 1218 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1130 0 R +/Annots [ 1181 0 R 1182 0 R 1203 0 R 1204 0 R 1205 0 R 1206 0 R 1207 0 R 1208 0 R 1209 0 R 1210 0 R 1211 0 R 1212 0 R 1213 0 R 1214 0 R 1215 0 R 1216 0 R 1217 0 R ] +>> endobj +1181 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 699.672 159.927 708.518] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1182 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.425 699.672 182.632 708.518] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Coefficient_ab30b6ef6e87a1df35c14d15237af04c) >> +>> endobj +1203 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [121.93 498.285 305.978 509.189] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1204 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 444.123 238.482 455.027] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Difference_d6e4fdbf5475e6d24aaffaceb4a4abf9) >> +>> endobj +1205 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [242.298 444.123 319.547 455.027] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1206 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [330.008 444.123 407.258 455.027] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1207 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 406.003 191.16 416.906] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1208 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 406.003 252.31 416.906] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Difference_d213660ecdcc0e4142a2fd7536489781) >> +>> endobj +1209 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 367.883 191.16 378.786] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1210 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 367.883 257.849 378.786] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Difference_f0e7fc37eefdbd145c4e9203cfd5e5e7) >> +>> endobj +1211 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 329.762 238.482 340.666] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Difference) >> +>> endobj +1212 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [238.98 329.762 262.551 340.666] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Difference_6e2a52ee587e255b6172f976f5a823d1) >> +>> endobj +1213 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 250.065 191.16 260.969] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1214 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 250.065 205.277 260.969] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Difference_87e8e31d3cf9dbe3c2e1041ea8ccf873) >> +>> endobj +1215 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 211.945 191.16 222.849] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1216 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 211.945 205.825 222.849] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Difference_2b2271e2f858709aef3d3705ac8c075d) >> +>> endobj +1217 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1221 0 obj << +/D [1219 0 R /XYZ 90 757.935 null] +>> endobj +1222 0 obj << +/D [1219 0 R /XYZ 90 716.221 null] +>> endobj +1223 0 obj << +/D [1219 0 R /XYZ 90 716.221 null] +>> endobj +1224 0 obj << +/D [1219 0 R /XYZ 90 660.992 null] +>> endobj +550 0 obj << +/D [1219 0 R /XYZ 90 568.61 null] +>> endobj +138 0 obj << +/D [1219 0 R /XYZ 90 560.871 null] +>> endobj +1225 0 obj << +/D [1219 0 R /XYZ 90 462.729 null] +>> endobj +1226 0 obj << +/D [1219 0 R /XYZ 90 462.729 null] +>> endobj +1227 0 obj << +/D [1219 0 R /XYZ 90 424.729 null] +>> endobj +1228 0 obj << +/D [1219 0 R /XYZ 90 386.609 null] +>> endobj +1229 0 obj << +/D [1219 0 R /XYZ 90 348.489 null] +>> endobj +1230 0 obj << +/D [1219 0 R /XYZ 90 268.671 null] +>> endobj +1231 0 obj << +/D [1219 0 R /XYZ 90 268.671 null] +>> endobj +1232 0 obj << +/D [1219 0 R /XYZ 90 230.671 null] +>> endobj +1233 0 obj << +/D [1219 0 R /XYZ 90 175.322 null] +>> endobj +551 0 obj << +/D [1219 0 R /XYZ 90 82.94 null] +>> endobj +1218 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1259 0 obj << +/Length 1130 +/Filter /FlateDecode +>> +stream +xÚÍXÛrÛ6}×Wà­äLáBðâ·æâLÜf&µÕ''£)HbÊ[AÒ²þ> R#YŽcÙ}"H‚‹ÝsvÏD` ø0z3MÎ} +"ùÄÓˆ| Á`:×FGî#„œ’ËŒÏÊ"ݬÄ\òYšÜH.7gg%¹àröþ®”.QUI‘Ï®šÌ†œ·)¯*3¼ aæä±pÇaˆˆã1÷ëôbô~:úo„•[`í `@ˆ³ÑõWæêù@F!XëYðU×\þ¡AHÈ1ÒÅD(D>{˜T(“s†îAŠÀ˜xz‘Y}º滪³U,̵^»Xݙ›T¯oÆÂÅÌQŽ'*Ø.ҚÅô‰gÌ~ÌWB&u¥±4 Ê¥EóòÃ\kK ׬bíP•}h"ÛIå% +K‹ëçæ&Mbãò'‘Ýëþy“ÇuëøŽÍJ؇ TúQ_a;ß썋)p_3µ‚öå bè DÎ1´‰»ßÆøQF6Ê<ˆ­Ã%@ T¸ø^‹K‹‡G׌<Ëõ›&Iç6ûxn“è曈k›H+nGÒ¥#Js©D^W݌ƒIؽ‰‹rÓ¿2ܳ{~áȇ”zÊeíҝ™²ãz›¤›Àóù>+ úîælöaPe…}÷v ¡TÑ)üH (Œð/gÔñÏtيE=[©`gU2‡2ðWÈ¿u#ó!íºfÔ.n¹m=x€AD!Æ=Aõ*©öàOT3ÀÑÓÀŠЗe@&ËÕ«P þi"ˆ"zJ…„y–üüÂzˆ8-ò“À¿#{ÄÊҒTðÀ +;MlLªñxªµL÷ó¢VŠ*,‘ÔµLn\‚œ¦/ÙÉ©;«êHZ…µß˜Üò´ºÂStGyÁ#rœ<1Å} +ôÂB/_ð'© +a +ÌðTeX+8ô!&­ïÞ~b»£~'jž¤]Ù¼U,“²¶¸¾ÊÖ¸7;/â&S› ®Ýя…Üê…Õ’íÖ^¯ÊíÍRäBò^²È\-Š4-\œu’/]«uˆ¤âlW{…P4E‡â!†ßx«D·íZ¼ß˜ß;òŒ»%¨qô<ô´sÏ´'™¨žíôSÊbÞt֎f~ŒànÏ;¨¿X´P´`lj"x7 Ø럐¼ÿá iêRf8=Í9)=rNz;dmŸ‘ø”ç¤v‡ÒWj_ÅI^6vק¥ê'O֟gÚvôô1üõâ‡ùácÿ¼è?.*xFÊOóÅ©žÏ†úû¹­å¶¾ìmWd®=7ëJ37÷μæù²áKkêc^ ¹ÐòÛGÿTBþæ2æXÆ?ñ¼á©Û‡}Û®.äVFTÛRŠØ¢Ý1U¦®D‡™ã_Ѝþé» ‘0†¸ßÔ¬êº<›LÖë5Œ+ØäI)aROÊ2üXÒ[+Xek°íÁ}3Ê +©=Qê¨.M}0ÔG6’\MÌtƒC¿ Sñ= +endstream +endobj +1258 0 obj << +/Type /Page +/Contents 1259 0 R +/Resources 1257 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1130 0 R +/Annots [ 1234 0 R 1235 0 R 1236 0 R 1237 0 R 1238 0 R 1239 0 R 1240 0 R 1241 0 R 1242 0 R 1243 0 R 1244 0 R 1245 0 R 1246 0 R 1247 0 R 1248 0 R 1249 0 R 1250 0 R 1251 0 R 1252 0 R 1253 0 R 1256 0 R ] +>> endobj +1234 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [121.93 677.939 305.978 688.843] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1235 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 623.079 214.413 633.983] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Sum_ef62be6cb1c9f4c4f3aff2c5f456c374) >> +>> endobj +1236 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.228 623.079 295.478 633.983] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1237 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [305.939 623.079 383.188 633.983] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1238 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 584.225 191.16 595.129] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1239 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 584.225 252.31 595.129] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Sum_8bacbf073ef0e1064e8c53ede4ad59bd) >> +>> endobj +1240 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 545.371 191.16 556.274] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1241 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 545.371 257.849 556.274] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Sum_e42dcbc09bb42d181a19512206d15f70) >> +>> endobj +1242 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 506.516 214.413 517.42] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Sum) >> +>> endobj +1243 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [214.911 506.516 238.482 517.42] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Sum_26114c4deaf17e8a12123a0a8f760d5d) >> +>> endobj +1244 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 425.754 191.16 436.658] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1245 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 425.754 205.277 436.658] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Sum_8d44f98f79421126eba1448fb80331b4) >> +>> endobj +1246 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 386.899 191.16 397.803] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1247 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 386.899 205.825 397.803] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Sum_e1191ef860c3201d40fa4e20fd02ba2d) >> +>> endobj +1248 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [121.93 185.073 305.978 195.977] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1249 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 130.214 220.699 141.118] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Times_6dec5edff0aa73961373ed7e1b9e0729) >> +>> endobj +1250 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [224.514 130.214 301.764 141.118] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1251 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [310.013 130.214 356.03 141.118] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1252 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 91.359 191.16 102.263] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1253 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 91.359 252.31 102.263] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Times_015f6e2febd260a93299564dfde659e5) >> +>> endobj +1256 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1260 0 obj << +/D [1258 0 R /XYZ 90 757.935 null] +>> endobj +142 0 obj << +/D [1258 0 R /XYZ 90 733.028 null] +>> endobj +1261 0 obj << +/D [1258 0 R /XYZ 90 642.053 null] +>> endobj +1262 0 obj << +/D [1258 0 R /XYZ 90 642.053 null] +>> endobj +1263 0 obj << +/D [1258 0 R /XYZ 90 603.318 null] +>> endobj +1264 0 obj << +/D [1258 0 R /XYZ 90 564.464 null] +>> endobj +1265 0 obj << +/D [1258 0 R /XYZ 90 525.61 null] +>> endobj +1266 0 obj << +/D [1258 0 R /XYZ 90 444.728 null] +>> endobj +1267 0 obj << +/D [1258 0 R /XYZ 90 444.728 null] +>> endobj +1268 0 obj << +/D [1258 0 R /XYZ 90 405.993 null] +>> endobj +1269 0 obj << +/D [1258 0 R /XYZ 90 349.579 null] +>> endobj +552 0 obj << +/D [1258 0 R /XYZ 90 254.26 null] +>> endobj +146 0 obj << +/D [1258 0 R /XYZ 90 247.66 null] +>> endobj +1270 0 obj << +/D [1258 0 R /XYZ 90 149.187 null] +>> endobj +1271 0 obj << +/D [1258 0 R /XYZ 90 149.187 null] +>> endobj +1272 0 obj << +/D [1258 0 R /XYZ 90 110.453 null] +>> endobj +1257 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1291 0 obj << +/Length 1159 +/Filter /FlateDecode +>> +stream +xÚíXÉrÛ8½ë+pò@ ÁÅ·ÉâTM”dZŠå-‡©9¨J €~ïu÷ Z ‚>ŒÞLFãӀ£Ç ÐdŽb‚€bÁ(šÌÐ¥C fÔõ(!Ä©’z•L«2¿]ÊYLóìªNêۓ“OY!“zúþ¦ª]9²i²²˜~-àÇéç¬h×c‚8oó¤±Ã 9—fn‘J×ó#Â?p¿OÎFï'£GŽGÕÇ!¹@éjtù |†æq„ÖzÖ +ùŒÃ5G_Fˆ mxÕ¡†Ejàw¡Rc¡qLa½ª­ {Hµ”fË¹2£eRĮ̀Éfö×rޝp»‹Ž)e°µ^W-³Æ̺sHÓ¸Ÿ„uü‡Ÿ +²C”Gý³#ΊÀ,ñ11X¥ƒ±^XŒÐ¥'€ÌÎ _?Ö[g‹¥šv0L5»Ù)߈ ð¡{£Àpà³.ÆôWèM0ó×$Ap̄ÿb$L'.N¶’Íqt¤yY¼ + oÚ,ŸYsIËêv¶%'kðîTëTó|H5jSí\ç©dª¤¥óO¥êìÊeÄiՁð4À>‡áè‚ÒçÃþ¶”s— €°4“…:þ|Ù< —Ã@›COz}_'y+‡ð>£þÐ ?L µÞ&O°mËðµmÌï¤J²¼Ï¢w²Ië¬RÔqó1÷‡pTu9kSu›ù¹&ˌ¥K…³eÍLë1ÚTŠA6éH»­iˆæ¶ž•i»‚Y‰Ú¬8/ëm‰±‹nÝÃÚ¥°—½YÈBÖɦ†Ìër5`s^æyٝg זGÂryr·rnŠŠÁ\ìôÅÿHº +vÝm˜X¡pŽPoRÇìÃ}Lz^Êgñ8î}–OzŸÅCÇÓ ðG]·¢ǾÍYíÀîëÄëçvjÆ +­‚… n9;Z4{Õð±XÊ:S}zÈÿc ÙSOúdä3Lú¾}Þ^åYjNüY®®¤=ýi[¤]˜Çw$öüŽ´Ëêþ~*ç!4ô7Oò{ìAÏÿÕÙµLìH«OVæÒ@–hɇ,Þ#¤Íí<î—\;ˆƒ¾œÞì©·'OêoŒSÒè7÷·D'öB—õu¿²Ö;PóvéˆbÅõ6* ý¤ ­²y¤±`!1{9K}(“þ7Õ¯kª¥ø'»:zØÖ3üe;¨ub~´–‡ï.‚“ :öՅ~EŒ8ó6F€­CÇtÞõÓ®ÚÛ¾šÛO¦)š›³]7b~NŠE›,ìR %ë¹6T©ýêk#ë?\!+ÕÏIÑ&¹»IënwYoý8Q°/]f`p °ÔÙçãԏþi6¶!2àˆnèX*UŒÇëõ§ n‹¬ªq¦ÆU•ïKw» +í´°ý¿±«²Ö'd Ázóy!> endobj +1254 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 696.156 191.16 707.06] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1255 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 696.156 257.849 707.06] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Times_ffc79b9a795454f61542224d1b0dea1a) >> +>> endobj +1273 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 657.609 220.699 668.513] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Times) >> +>> endobj +1274 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [221.197 657.609 244.768 668.513] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Times_7f106ecc8b4f062f0b2b53cd3098e50c) >> +>> endobj +1275 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 577.292 240.166 588.196] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Coefficient) >> +>> endobj +1276 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.664 577.292 254.282 588.196] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Times_121be923ed152a60238e69a8296bf966) >> +>> endobj +1277 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 538.745 191.16 549.649] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1278 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 538.745 205.825 549.649] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Times_4b0fc20a0d733d684c6a4e7e8f49c174) >> +>> endobj +1279 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [121.93 324.016 305.978 334.92] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1280 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 269.448 251.483 280.352] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Unary__Minus_a51b2de39e7e3568d5c9322de4b0454b) >> +>> endobj +1281 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [255.299 269.448 332.549 280.352] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1282 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 230.901 191.16 241.805] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1283 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 230.901 231.1 241.805] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Unary__Minus_ab53a108e173a6657e2af82a66ea3737) >> +>> endobj +1284 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 192.354 251.483 203.258] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Unary__Minus) >> +>> endobj +1285 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.981 192.354 275.553 203.258] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Unary__Minus_2834d46309af2717b28dc79843e1331d) >> +>> endobj +1286 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 112.038 191.16 122.941] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1287 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.658 112.038 206.194 122.941] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Unary__Minus_2f88b2137b58031e4838f19daff12f4a) >> +>> endobj +1288 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1292 0 obj << +/D [1290 0 R /XYZ 90 757.935 null] +>> endobj +1293 0 obj << +/D [1290 0 R /XYZ 90 715.095 null] +>> endobj +1294 0 obj << +/D [1290 0 R /XYZ 90 676.548 null] +>> endobj +1295 0 obj << +/D [1290 0 R /XYZ 90 596.112 null] +>> endobj +1296 0 obj << +/D [1290 0 R /XYZ 90 596.112 null] +>> endobj +1297 0 obj << +/D [1290 0 R /XYZ 90 557.685 null] +>> endobj +1298 0 obj << +/D [1290 0 R /XYZ 90 501.717 null] +>> endobj +553 0 obj << +/D [1290 0 R /XYZ 90 407.627 null] +>> endobj +150 0 obj << +/D [1290 0 R /XYZ 90 400.55 null] +>> endobj +1299 0 obj << +/D [1290 0 R /XYZ 90 288.268 null] +>> endobj +1300 0 obj << +/D [1290 0 R /XYZ 90 288.268 null] +>> endobj +1301 0 obj << +/D [1290 0 R /XYZ 90 249.841 null] +>> endobj +1302 0 obj << +/D [1290 0 R /XYZ 90 211.294 null] +>> endobj +1303 0 obj << +/D [1290 0 R /XYZ 90 130.858 null] +>> endobj +1304 0 obj << +/D [1290 0 R /XYZ 90 130.858 null] +>> endobj +1289 0 obj << +/Font << /F63 247 0 R /F70 298 0 R /F65 249 0 R /F50 215 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1316 0 obj << +/Length 1148 +/Filter /FlateDecode +>> +stream +xÚÍW[s›8~÷¯àmaf-KÉ[/ÉN³ÍL6qú’v<2–mu1Pqóï{¶Y»¹4ÛÉ ¤sùÎw¾ØY:Øùkðv2…¾£8¤¡3Y81v¢ F‰3™;·.ÁˆRoH0ÆnÁ՚O‹<½_‰¹âÓTÎW÷''e&¸šž~/”GÆ®(K™gÓO^L]®$Ÿ¥ÂR†Ýw)/Ks{%ÂlÎx¹Aä}™œN'ƒoña‡èxX„"Ÿ9Ézpû;sX?w0ò㱳ѻÖN@}¸¦ÎõàŸþinÔG8dÛÜ"6»÷¢â2sß{Q&J$Ò5:cxÇv†4@~C“•M0aîÒc.×'õb¾0Wn.©ËÜë퀚A 5žÛ$B! z¶çyR¯EVíX^äÖNµ’×d ñÆ#àÔ>,E&¯Úô*_·GEk,Ms2w#³¥YúŒ1Mʼn®J «CBøcÀGA™ ?SÊöwÝ`ºC KŠ› 3½Y]¢¯Ü£Ø½k|r2”‹3F”‡­+ßGÿNB>Xò7Ӭ͚ k™V}Ø-Lò&¤ƒåÿ­„’UiÑmZB-mo\iœ3†µ_%uÀï¥ê‘ЄpYÏR™˜x/Äz&l¾gu–4\,÷lö`ëØBñý#l9˜×aþ|ò!]{”3œeø(XîƒÇïà<é×&ag ‰…A“$Š €P“Ø[¨ô¼ìõU>û*[`[žÈmVyos’÷j˜Ê°§„AӑFë´¿;³e/.†nûLäH¥†dL VLw¶ÅO­ÕqhÒ–ë†[jY;VËgÕï+QÕ*ëänO”çG®(Ì¥„@:õëì794ô÷v{§Ú¹ óy?¥Ž¢ž¤y&^îôçø܍*tÄÞ + ýèðíLlúûwÉ÷ëžÞáS§÷۞8¿ãm ýçw¾”ÉôTi}țQl‘{þØî ÙãóZì+±P*Wö¥´î,°Ch0¸Þ5<©U¼Áå+£-œ{PQ€ëJu*EÞAN•ª“ +xÞÐ旺Þ‰®ÿ_« õËÆ< ­´hßq{X^ó{s3ÓûضÍÿ„g¿UØ I·ë3{Ît?”ŸÉTVv]k-,«…º‡bŽ’<«(„)ìîɳ˛6†•ig NÛtt/›t6²ZÙ¬EYt_4-rE6ïx³Îç}TØëÄþÏf8†ÿÃñcÿ5õ?&0.Dqíiþ1YŒëëÿeCFîìc«yæñ£>óp¾+«æ5ϖ5_ZS²J¨…F#±K7¥PxŒ¹ž žÕ<õºž6¬UÛÁ†QÓTMw#T +»×¢ý$0`üë´wôGè6EÊB4&Qû‘¹ªªâd4Úl6()QÉB!YŠ"ýWѶVHEDâÖJWûu®t$ A̝a‡ìÌ`ãZsõëøÆ÷X; +endstream +endobj +1315 0 obj << +/Type /Page +/Contents 1316 0 R +/Resources 1314 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1327 0 R +/Annots [ 1305 0 R 1306 0 R 1307 0 R 1308 0 R 1309 0 R 1310 0 R 1311 0 R 1312 0 R 1313 0 R ] +>> endobj +1305 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [121.93 578.79 305.978 589.694] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1306 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 524.942 229.336 535.846] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Variable_642f2ab97bf846e69686a874001a9930) >> +>> endobj +1307 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.152 524.942 268.34 535.846] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variable) >> +>> endobj +1308 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 487.151 149.098 498.055] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variable) >> +>> endobj +1309 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.596 487.151 189.038 498.055] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Variable_5c54fa6c29a576ab9de69361d15f8b17) >> +>> endobj +1310 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 449.361 229.336 460.265] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Variable) >> +>> endobj +1311 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [229.834 449.361 253.406 460.265] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression__Variable_e2482d18059a20a1cea2423a8b3d1043) >> +>> endobj +1312 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 214.928 210.527 225.832] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Logic__Error__Exception_11bc5303b1d7a594017971538e60858f) >> +>> endobj +1313 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1317 0 obj << +/D [1315 0 R /XYZ 90 757.935 null] +>> endobj +1318 0 obj << +/D [1315 0 R /XYZ 90 733.028 null] +>> endobj +554 0 obj << +/D [1315 0 R /XYZ 90 649.627 null] +>> endobj +154 0 obj << +/D [1315 0 R /XYZ 90 641.377 null] +>> endobj +1319 0 obj << +/D [1315 0 R /XYZ 90 543.383 null] +>> endobj +1320 0 obj << +/D [1315 0 R /XYZ 90 543.383 null] +>> endobj +1321 0 obj << +/D [1315 0 R /XYZ 90 505.713 null] +>> endobj +1322 0 obj << +/D [1315 0 R /XYZ 90 467.922 null] +>> endobj +1323 0 obj << +/D [1315 0 R /XYZ 90 413.052 null] +>> endobj +555 0 obj << +/D [1315 0 R /XYZ 90 321.989 null] +>> endobj +158 0 obj << +/D [1315 0 R /XYZ 90 313.739 null] +>> endobj +1324 0 obj << +/D [1315 0 R /XYZ 90 233.37 null] +>> endobj +1325 0 obj << +/D [1315 0 R /XYZ 90 233.37 null] +>> endobj +1326 0 obj << +/D [1315 0 R /XYZ 90 178.619 null] +>> endobj +1314 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1353 0 obj << +/Length 1447 +/Filter /FlateDecode +>> +stream +xÚÝX[sÚ8~çWø­öLQ$Ûò¥oÛÛNºMË6Ù}I:Œ0Ôõ…• ýõ{dI'@z£ÓÙŒeIçœï;7 ;s;¿ž_ Î^G“¢4ò#çjæ¤Ø‰#‚¨Oœ«©síŒüÐŒ±»d²`ãe•o|*Ù8ÉäæÙ³‹óÑx$=’¸Õ$ç…7ô)v_䬮õß|ÆÛϼÌ8løaꆉ÷ñêÍàÕÕàßm°CZé4Fq@¬\ÄÎÆß8iâܶ³ +'ôxæÎåàÏ6–à]‹(Þ±ˆà…AâÄ~€pDµY7¾O[ñvs=¤`âÛj.²ñ+)+9~u—ñe#ª}bžÝµçS—©U-f„ ”R_‰-b„ˆ$ñɐkE÷ŒÃÎÐQ¦ZæozՅ¸óuùT¿ž— Wïsت¸Áç¢äLÂ?¢ÇF²šKV¢œë¥lUBJª’Cbù¡–s^.¸Qò u£ÑÛñûÉ'ž5¨ƒ­§{à#’J^TeÝÈUÖTÒìËJcÀKn¿ô8»O´!Á÷QtgígrnîCǼfB³pÏ1:È*‹ÍT-rý­V1vÐ* +•VJ›ÐøB”†¾ç+‘O­‘úÑH±,7ü,^HÝ-„€bh¥‚ϧäBá` +õP<5³öl¥¾!–‰²_nêfÿ¦Y}tâ¾mý‚r)y]CTîÛ¥š|zD™÷хøÌT\/ª)ïo“ 0J¬6¶5nLúR²dȎðhõ Á0°C°X°µŽ@˜U/™J—jP極âˆî +)¢D¥ÄVLՓúš%ˆbbçÌ´X#³Yp-0k™R©B±¥?Öe÷Ħ1ÂqhwÌê}B1Šij§èž†±õ¡f%·xqë+w¢X™óƒít£jT1õq ž]K²GÿŒ™½P[óodk15¬„NJĝM¿½fئ_[á&ÜÛBŽÖó_ƒÂã'®ƒË²nYýób¦æ0_ 9.3皭”ñîÑæçԃݳ•jT¿®ÇÏà‡qÝ]V<8ºŸÒIœzí»l¤x¬ú±:b<]Ë/ÆçþlM_”|鬽rUÇZ8®éKdš"jûÅ+ 㨠sY˜l=²7†ž ·öÚP¿¼Ù½r՟Y9_±9ßÞiʙꌻ’ûWÍåR×°wÁʕ½QSfk å¶(c¤îhÈ°ÕewœÓ`üãØ ږ{k¢O#”ØvӋ¦Y>;;»½½EYV¥XJ$š³å2?{ؔnw!ÐÇ۞|VIë]²ÕÄêØDÎ0†EæØ#J˜X°‡ <þ´òՉ +endstream +endobj +1352 0 obj << +/Type /Page +/Contents 1353 0 R +/Resources 1351 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1327 0 R +/Annots [ 1328 0 R 1329 0 R 1330 0 R 1331 0 R 1332 0 R 1333 0 R 1334 0 R 1335 0 R 1336 0 R 1337 0 R 1338 0 R 1339 0 R 1340 0 R 1341 0 R 1342 0 R 1343 0 R 1344 0 R 1345 0 R 1346 0 R 1347 0 R 1348 0 R 1350 0 R ] +>> endobj +1328 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 588.892 172.361 599.796] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_4dfc6347addaec85187c46bff12def97) >> +>> endobj +1329 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 550.038 172.361 560.942] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_ee14b86bac3475fb14914092715b5916) >> +>> endobj +1330 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [228.298 550.038 306.125 560.942] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint__System) >> +>> endobj +1331 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [327.82 550.038 405.07 560.942] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1332 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [431.198 550.038 513.996 560.942] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gb884929ad9e98d94cac675f7fe3e9771) >> +>> endobj +1333 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 488.269 172.361 499.173] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_64a91a5f142efd873b50d2cb7d27e660) >> +>> endobj +1334 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.176 488.269 234.626 499.173] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem) >> +>> endobj +1335 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.356 449.789 177.83 460.319] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_c2cab9caa4fff25fd03b1012a0c8cf5b) >> +>> endobj +1336 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.356 410.934 191.678 421.465] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_4cdcdb051551e8a23b6ff80a3294c5de) >> +>> endobj +1337 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.739 307.88 264.491 318.784] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_e0371bb311150040a06e7839efb57a83) >> +>> endobj +1338 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [292.672 294.256 345.558 304.161] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem) >> +>> endobj +1339 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.739 271.019 242.354 281.923] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_49981873be6474f7f399f1f54bc8861d) >> +>> endobj +1340 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.535 234.157 208.312 245.061] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variables__Set) >> +>> endobj +1341 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.81 234.157 315.797 245.061] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_23fb2ed36793d2fa8974d9b6c3f93705) >> +>> endobj +1342 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.535 197.295 229.362 208.199] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint__System) >> +>> endobj +1343 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [229.861 197.295 275.021 208.199] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_1a896ee4273234f7c7181d76bdd9260f) >> +>> endobj +1344 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.535 160.433 228.785 171.337] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1345 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [229.283 160.433 305.586 171.337] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_caffbc7bc53bf538c9d8a75cb4a7e872) >> +>> endobj +1346 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.535 123.572 234.334 134.475] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gb884929ad9e98d94cac675f7fe3e9771) >> +>> endobj +1347 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [234.832 123.572 314.313 134.475] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_e1db1d48c605e6f79aa78ea2a4a9cda7) >> +>> endobj +1348 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.384 86.71 226.314 97.614] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_7fa63d4674ffff39446dd46ed0c26e6f) >> +>> endobj +1350 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1354 0 obj << +/D [1352 0 R /XYZ 90 757.935 null] +>> endobj +556 0 obj << +/D [1352 0 R /XYZ 90 712.938 null] +>> endobj +162 0 obj << +/D [1352 0 R /XYZ 90 706.338 null] +>> endobj +1355 0 obj << +/D [1352 0 R /XYZ 90 607.866 null] +>> endobj +1356 0 obj << +/D [1352 0 R /XYZ 90 507.363 null] +>> endobj +1357 0 obj << +/D [1352 0 R /XYZ 90 468.508 null] +>> endobj +1358 0 obj << +/D [1352 0 R /XYZ 90 429.654 null] +>> endobj +1359 0 obj << +/D [1352 0 R /XYZ 90 348.772 null] +>> endobj +1360 0 obj << +/D [1352 0 R /XYZ 90 322.959 null] +>> endobj +1361 0 obj << +/D [1352 0 R /XYZ 90 288.119 null] +>> endobj +1362 0 obj << +/D [1352 0 R /XYZ 90 251.258 null] +>> endobj +1363 0 obj << +/D [1352 0 R /XYZ 90 214.396 null] +>> endobj +1364 0 obj << +/D [1352 0 R /XYZ 90 177.534 null] +>> endobj +1365 0 obj << +/D [1352 0 R /XYZ 90 140.672 null] +>> endobj +1366 0 obj << +/D [1352 0 R /XYZ 90 103.811 null] +>> endobj +1351 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1400 0 obj << +/Length 1799 +/Filter /FlateDecode +>> +stream +xÚÅY[sÚ8~çWømaZI–|éÛn¦íô’i¶ÉîKÛñ8X$Þ›Z†”þú=ºØ`ÇÐ@ }`,céèœó«„[;¯]Î^y®¢Ð£žs=uBìøAœç:q> F”Æc<œÇå,ŽæE¶ºIGYzSÆåêŋ‹7—Ñe9"Á°¸ÉÄl4¦ϳXJ3ü(¦BùD1—²pÈÂї뷃—׃oÜ`‡èݹ|—;“ÙàÓì$ðÿ[#7 œ{=kæ0êÂ3s®°•¤ûԒùØ @2)ÉQ`èSañ>ŠjQæ–Í8·O9IS3œ rU‰Ä¼¦y%Ê<ÎÌ[9rý¡˜›‡yWiaiS%(—o²äz>0¨7¯îRifµ¥ ~֓ÖÒ61Ï^q¼Þ˜º°óa@‘O,†Ÿ)å-*Χ1óú1iv;Pç7¡ü„:'žhÀ­Îéþ:ϊŸk¼Š³h&fE¹ŠÒ<ºYUBUý}þPÝYõö‹ô‡¨}Á< /5텆cûq2YÌÓړnV©‹<e¶j€>öÌ®»ùOLª=ÝÀŠv("7E‘ ;Aùðîœß‰ÉˆâáW«ÓÔê4βŽÆ†‡Ë¸L㼪=Æ8†Å +$“Ÿ1¦"Ù­¾5{­\0v=„C¢Ÿ!s ¯ùD¹\c#qeF±…ô¢HÒiÞnŠØd§ƒhƒ)o"È#lì–J{Ešìoø–GÏ¢€“Úƒ¤¨dO ¢‘Ÿ†!04“ +kV2ñmQ»aýií¢eºL믠l3€8ɸÑø~äC<äTƒïT ÄIÉy<Q’ÎD.•YEqžDbv#’mèèpiÂËS€ú3Izaˆø¬†`Ö’LB¤†5Ä} ÕTh§™säbÿÔ C‹L©¾A šÚjqÌߧ9ThÑËïóRH¹…lxÜXn%XÚ׆ýºèêÁƒzYS؁>=DÜCÛKÆtû+ð›Wé,ý¡[êhV@òÚ¶›$.¶P¤ŸÒ#õ·±ï¨Ùd'n> +XsSKû„sm]ñ844~»:/fóEÕt»WE¶hhü®6êQ-p*£¦ÉT%Ð)ªnC¼±aš¥Õª}ö° r‹è:÷ÇòðcŽäèîëRȱáAuõNÝSÐf]Uqµ¾¶9z‘µÈ,ëþB=5G:´' ûˆ‚ {0Y/SmB¶ˆ+±GJS›ìŽ¯E.ÊXõi=K;;CdˆæÔÏw0Ì<ˆ#bª)‡˜¤âa¥«¤Ê³=ȌÕTÀ™y€KPÈ­º{éë6Bä5ÉÌw¦áží#Êçúò* Ý&÷ª»‡Žt¼z°úS:Š0—Ps¶¥'»žÃQèûÚi€|â¸ÈóY‹·öUe¹.ÒTÓîÞgøasŸA8âšCs¥¡¯.Ú;2 +%€ *Ž vµ-’ø:MBQÉì¹'4+0{v¾È*õNt’Qÿë†|Y[_gÑFa¤^ׅ‘¦Ð[üâë“ÑPŽŒ]€-(Ã`c¡™¦m¾/{(¬ Xú=~îwç­Ó§"–)Ľ¨ñøGïNê]môÕ[×7[=“`ešÁ±SæóöYvjy0‡#©¬ä¾%qˆxÌï†ÔM¬>=¨ùFµ[ŸööÚ)ur½`¯+°'"Ö½Õõ„ƒG^êêC½ì»½–æàÅÜFÜ뺮¸Ômx9³Ö~YßM›×÷æ‚Ú¼¼ï&ÃÚÏq~»ˆo-©7ênwªʚ㱤(ÿq>”õGޜÀ+\I•²©×1R÷å +n¤"#”ó¢¶8£Œ¯N=z7Ð(­E¤ÜÓýபæ/ÎÎîïïÑD¢EžÎK”Vgóyvö°ê_S!`ý5ŒÓúPxV”†]u¶éeìÃ"kdin.ºA6®€ãÿJäÄË +endstream +endobj +1399 0 obj << +/Type /Page +/Contents 1400 0 R +/Resources 1398 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1327 0 R +/Annots [ 1349 0 R 1369 0 R 1370 0 R 1371 0 R 1372 0 R 1373 0 R 1374 0 R 1375 0 R 1376 0 R 1377 0 R 1378 0 R 1379 0 R 1380 0 R 1381 0 R 1382 0 R 1383 0 R 1384 0 R 1385 0 R 1386 0 R 1387 0 R 1388 0 R 1389 0 R 1407 0 R 1390 0 R 1391 0 R 1392 0 R 1393 0 R 1397 0 R ] +>> endobj +1349 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.384 697.2 212.486 708.104] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_5b935844aeba5303d77ca82130998245) >> +>> endobj +1369 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.739 660.743 268.376 671.647] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_52edb70858467236238aaec3b1884d37) >> +>> endobj +1370 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.568 624.66 201.946 635.19] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_2d9c6ed1390e4148c2fccb3491c7b4a7) >> +>> endobj +1371 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 552.357 192.89 562.888] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_f27bf62f81d315063d66dc394ef9559c) >> +>> endobj +1372 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 517.317 316.306 528.221] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_4c0dddb2c112aeef626eef4d7e539d2d) >> +>> endobj +1373 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 482.65 310.627 493.554] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_7c8c10d940074e8ec96a4d319b88e490) >> +>> endobj +1374 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [314.443 482.65 371.219 493.554] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variables__Set) >> +>> endobj +1375 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 448.356 232.192 458.887] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_f66f20c1209205a55c53e42c83761b82) >> +>> endobj +1376 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.008 448.356 279.514 458.887] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint) >> +>> endobj +1377 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 413.316 236.068 424.22] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_203692374bea9a641aba897049f2ae03) >> +>> endobj +1378 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [239.883 413.316 317.71 424.22] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint__System) >> +>> endobj +1379 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 378.649 263.893 389.553] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_cf903011430930b9c3afca546ecb07db) >> +>> endobj +1380 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.709 378.649 344.958 389.553] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1381 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 343.982 267.071 354.886] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_d202d113166e7f68344ee82ba6e7b0fd) >> +>> endobj +1382 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.886 343.982 353.685 354.886] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gb884929ad9e98d94cac675f7fe3e9771) >> +>> endobj +1383 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.568 272.053 239.036 282.583] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_ab8f9339a589d7ecd8eba424cd8c8d3f) >> +>> endobj +1384 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.535 237.386 239.325 247.916] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gd7cbdacd9a5e2c068c25c12f47f8936a) >> +>> endobj +1385 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [239.823 237.386 262.697 247.916] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_31c3eb3b5ccbe373dc04fe4d86234b87) >> +>> endobj +1386 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.663 202.346 288.644 213.249] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_81cb4962caaa75c19cdf6c8a5af4e46b) >> +>> endobj +1387 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.021 202.346 335.844 213.249] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator) >> +>> endobj +1388 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.306 202.346 457.323 213.249] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1389 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [484.029 202.346 513.996 213.249] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1407 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 190.764 146.454 201.294] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1390 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.535 144.764 193.358 155.668] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator) >> +>> endobj +1391 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.856 144.764 252.296 155.668] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_fa2c94e0b2f7b773f7d2daf6d53f9874) >> +>> endobj +1392 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.535 110.098 193.358 121.001] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator) >> +>> endobj +1393 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.856 110.098 264.491 121.001] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_75aa539f287d460bc26a347512e51760) >> +>> endobj +1397 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1401 0 obj << +/D [1399 0 R /XYZ 90 757.935 null] +>> endobj +1402 0 obj << +/D [1399 0 R /XYZ 90 714.2 null] +>> endobj +1403 0 obj << +/D [1399 0 R /XYZ 90 677.743 null] +>> endobj +1404 0 obj << +/D [1399 0 R /XYZ 90 641.286 null] +>> endobj +1405 0 obj << +/D [1399 0 R /XYZ 90 360.982 null] +>> endobj +1398 0 obj << +/Font << /F63 247 0 R /F70 298 0 R /F65 249 0 R /F50 215 0 R /F84 1406 0 R /F36 1408 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1432 0 obj << +/Length 2373 +/Filter /FlateDecode +>> +stream +xÚµYKsÛ8¾ûWð´CUE0>@zO“×Öd7[™Ä»—$¥¢)HƆ">lgý4ÐER”ãdjNF£Ñýõ ¢ÞÞ£Þ?.ž__\¾Ž/%iÌcïzç¥Ô1#gÞõÖûè3Jx¸Z3J©_gÍ!ÛÔUñíVn›lS¨›&k¾]]½ýíÝæ]³b‰_Ýò°Zóˆú/Š¬mqø^î¤Y–e.YÀÃԏèêóõ›‹W×_/HC=fNAä凋Ÿ©·…ù7%Ašx÷†êà…<€ßÂûpñûµ7¡ãEtt#Ɖa‡à¡q„×úÄydŽwû¼ë®XfZñÈ¿[±È—(ý݊S¿R[K¯ålöVà÷f§¦ªêN²bs§·gE/çì5Ñ'jo½ÄÆQɝÞý‰Rž+YvK,ÊþðìqIžÄf+K†M–ÜïåkA½‡Zœ“8dޚqÂYŒúû »VïôD#R“8‰‰!Q‘fŽ%$H˜£ÉÊ퟈Ä)w4 ëwù´«»Í:$b/"©0@™X„á¦øだ”Fž`€•”€P¤AÄ(ŒÜM "Rá *HBÅ£W„¥Z:r¤S­»Ža[}§ª¿ªÝlÙ Oý?;’ÔÍ*ŒÐÉ¢•O­> k1’°È[!Iâåú½—Í7Uî/üZW¯ÊÝ¿À‰w+Fý¬É²“M;9~î á –Áøùæw|$ªŠÍ;MëÙüwÅ;uγ\ö²Ûä–Sí¸üŒ_/ óoø]tp˜ÿ × …uÍ÷²ë›rŽŸ;së xÌÍ H¬ÕàŠFÂášs¯  Ùѽíæ2éìáh‡Þ k–€S ᭁGU¨nÿJ³žÁ˜å8d‡Ÿ²°ߟ3a$IuóCc’¤éã6< P5P0ü:¤ÄAÑ„Ùòá¥ì2UÈ-JúR¶y£j°Œ(PÀ@H‚0EF¿âž·êÁÛ²ø­ì¤þÞÃU{ª”Ycԋ¡¨©ö`›Ã¬êæõ9¦<°eÁ¯à.úN@‚ËVdٞÏNè¢yWY;µu–Ë¿OYjáÈÑÏÜɬU üjPŠ³é]2s±Ð‰•9°P^ªÎåWÙM©ÐB8–_û¬Pe©KŒÔU¹n»Fåv+옂wÂrhÏ\6|ÂeYùmcdihÔsv1ôûòKYé¸r_â +™Fe žÖgv{“•{ËQ`lÓàâpà´–ƒFípd£æÌa¡¯u¡rÕߐD©­1 +·ŽÓ)N§bL€ÓȬhµ—Ìô·vl~1èÔ'9cחywÎÖÄ¥›¹Ïd§”´l^=ԍl[ÓF’øËõÝâÎ1êI…1+ÙÌÖù„—aEkcàzâó6ëbÄáC° X:ŠÚÒz±íëºj:üØécôÀH­7hÉT™7ÂC—î̾¡šÕ_&Ž÷™(§g†(§?n²V[Åì(‘pŸf֞r[ˆŠ)4ò¢Ìo5\ Øô‡ÑÝVvÑøº˜a:Þ2¿]Ãüú¦êÝj'óÛR}íe ;ŒC«> 8ôEgyì,õhñ¨X€ëæÒh>T‹D(Úzé.l¨.«¥9´8…ªHàø-¡é‘MfÑ„ó&XGÁ`€ÁUa(CÛ IQÇÜ_nK”x8nD3Aí¢ü.ɅÐ<ñ$vã‰pkqÁšÊŒ'"ê‰N¶ŽÎàŽH¢]âOYáôXE»œÙ]÷²(päfÐý@ ´ÄòÜ:•æ¶³Ä‹W³ÏGSÕäÙ4w«”º‚ˆûlžž]²P>~ð}e¡êtݤSÀ6l±@z®ñÀB«º¨v œûBü?ºŠ^ W2ü܏NùˆaÇy+úWk©Ÿ÷Mz…ÄGZUœÅSmk6㨢%ù¬ž ‹Ùv«ìa‹ a 55^«Ï¶þÐ+Ë[GÅÏ|C~‹5l _JÎ☜íI¦òô„Õ’î˜ÄöFÁ´ç w ‚qóÂmóòÂ\§?Ö°ژÉôË*ï1Æ1oÜÊX¶CWôÔGÕ3¯¬¦™¨°¸º|°Ñ}ý¨’&Ã+š:,\Z?cÑ¡]w]©éÇO¨$áÑGUêâøóBÛ¦s +a@ŠAÃV7Ï{UlÛIñ U3¦a"MÊÿn{$:ÃM6óÄn†ÁP/pž‚|íU£K³©Â_[I;{kKøƒé¨ÞÑUy ïtA‚p@£%0èãx2m‰àÛyÈ­³ª-­Ð#g’ N ùÌ|Øö!YQ\é87®µW?Ԟ­&™#+WãWîé›$™=ðM(IÓØ<é¤Â6”ÓçÁ«3ï 0Cµ,(VüÔõ¥Ñ瞓8%a8ý_ÿ©fÕöe^T­rÞ6õcºãÌkÁ)$x@R¶ü°2×BÅLs¯riÞLž®5f^W¯Ýöꪐ徻ÝȦ©šÇT("ÂE|Ta3ô™»=„œ1; :'–áƒe°–ȥܶgòãìˆ ‰¶ƒCoŒ6ƒeuPo»®¾º¼¼¿¿'yKúRÕ QÝe]—§V9ra,ÄVÙ kÕ`–_Bçhp ›ìŸ”ªÂCv‹ÀŽ` +endstream +endobj +1431 0 obj << +/Type /Page +/Contents 1432 0 R +/Resources 1430 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1327 0 R +/Annots [ 1394 0 R 1395 0 R 1396 0 R 1420 0 R 1421 0 R 1422 0 R 1423 0 R 1424 0 R 1425 0 R 1426 0 R 1427 0 R 1428 0 R 1429 0 R ] +>> endobj +1394 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 719.912 230.289 730.816] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_053b3ad9ab9c0920ee835d51589cb703) >> +>> endobj +1395 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [234.105 719.912 280.122 730.816] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1396 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [303.315 719.912 349.332 730.816] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1420 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.535 653.116 256.859 664.02] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ge574051d412d3ee587c872f48de81663) >> +>> endobj +1421 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.357 653.116 349.541 664.02] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_54d7ba808dcfc372e231fe597f5daf1f) >> +>> endobj +1422 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [353.356 653.116 459.786 664.02] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_g9006be5f6c0f7616400b3554738e732f) >> +>> endobj +1423 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 619.196 262.618 630.1] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_caf3268d04168d4d22ebe73d9578d7d5) >> +>> endobj +1424 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.433 619.196 371.757 630.1] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_ge574051d412d3ee587c872f48de81663) >> +>> endobj +1425 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [265.411 422.06 342.66 432.964] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1426 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [264.006 333.133 322.456 344.037] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem) >> +>> endobj +1427 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.912 303.553 329.362 314.457] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem) >> +>> endobj +1428 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [278.651 94.73 406.173 125.575] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_e0371bb311150040a06e7839efb57a83) >> +>> endobj +1429 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1433 0 obj << +/D [1431 0 R /XYZ 90 757.935 null] +>> endobj +1434 0 obj << +/D [1431 0 R /XYZ 90 667.459 null] +>> endobj +1435 0 obj << +/D [1431 0 R /XYZ 90 635.562 null] +>> endobj +1436 0 obj << +/D [1431 0 R /XYZ 90 586.737 null] +>> endobj +1437 0 obj << +/D [1431 0 R /XYZ 90 266.731 null] +>> endobj +1367 0 obj << +/D [1431 0 R /XYZ 90 244.419 null] +>> endobj +1438 0 obj << +/D [1431 0 R /XYZ 90 244.419 null] +>> endobj +1368 0 obj << +/D [1431 0 R /XYZ 90 89.441 null] +>> endobj +1430 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F65 249 0 R /F36 1408 0 R /F81 703 0 R /F8 300 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1445 0 obj << +/Length 1931 +/Filter /FlateDecode +>> +stream +xÚÍX]“›6}ß_Á[í™X+ „Ðö©i“NÒìt›Ýö%ÉxX#{i18€w³ýõ½ú„±w“igúbÒý8÷Ü#p° pðóÙ˛³ó×q$b7ë@à€Ç1J‚›,ø0#Ñh¾ ãÙ.­·érWw2«Óe‘ßÖiýxqqùæjyUÏI2«n ¹/(ó‹´iÌå{¹–zX–+ ‹…43FæŸnޞ½º9û|FÀ½;㈇,XmÏ>|ÂAÏß…" ô¬mÑþ‹àúì·3|Ò"³'ˆ"ú•ÞL¹GÄì#fxNfEUn”ç¯2Ø<$®ÌÔ{gùÖLò,$ 1LܜóE¤ÂV•M[§yÙ.¯›Vn'V_„a„b B`ÖÁU3±G‚¨ƒ-xþ./eZ/_}ٙ¤4M^•ÛŒXÿruû甲EGüºkómþwÚºËË*“S‹3ę{oÛÍñ§‘»Iqb'±¡%´³àC^àÞ'3‘áaÔhDP +ˆG1Ì /÷y‘)œR6KKó WñlW»ŒÃÓ»tNñì>‡„ëûf—*4«Kȯ,û(úö Šbr€Ï4Š-£ëº²[¶wvƒU‡ +cXóØø:tøbŽ¢¤Ãžƒ…·¡ÅMŸ6â~7Hµ\µù.ïç„ͤÙt½/Wí´“€H¨,Ê|Dv;k*XÏIË̐D5y2@Åp/¡0Ž¡ão"Ñi¦qT1Б@±Ó)CŽ,®æÏÒ:ÝÊVÖͅ÷~¿Žh’ Ž¸„õ²=xå }¢ntøÁïM&0kóߺq““U[ÕæÞ.`‹ªÉ'ù¸àp ¤a·kïòækç³¥*\fHDC´s˜„ˆ&äÀaÝÊ!C|&ò#Æ´4U7ŒÂZ¦MÕiîj©‚² ¶ÙZ04Ù¢ô¨ÍЏHt`óT(«lbÀ˜‰‡÷W_Vr§Öx>ÖUE_ëM›]\²Ü´wKY׀ÍÎp†({gêJÅñÁz¯'ÐQÀÚÓ4:`ðKf“JbÔ«5ÞëÀ ·C”ô={›~YêÊZvõ¨z¾ëBGáQeT<³‚P5$gȼœGPèi‘gË´ÞìÁ€öÔ®ÐMŠgˆ…Š§þ×¥£.†õ¦î]½Ù±Fs‚øh§µu¾²¯@ý¼óZ;¦¸hr/CN`z°à‚Rö[ÄS\wŠT:jÙìЋÑKOÔ¦N¡Aš¨Æ³âÑÜmj™í»EÓ©†2hÙIxPæ¢GhBá,"hÖ<Š¡‚ÖžT ­P½”Û[gÍkׂõÝOÕJ##u]¶Z¨7#á-„ˆ]ª„™ª³Ý«Ÿ¾›@ÄrۅŸ¯ŠWˆÈ>½:óB€}µõ^6²m&âIÐÂáS½)FQ/˜ÛÊì~ëzŸ¤MZ5BäW£!w3ŒÄS‰‡ DY„Ž¬Ílĵƒ>;‚­ÃQ­ÜëL0¢×ã>ìxÂEØ?!'C”ÒŠ©ELä'šI4Á„2­oŸŸê4ËÆTØ,A¸-tÒVpÍz`9!A¤¹èÚêÔñ +ƒ‘Cñïkú˜"1?a?dÙ$ÄB f:ÚÑ[-2N܄Rj=žz›óNÀj¿›1Ù4à,pÊÑ|o×I¡wº·(D›ÞîXàÅ,ñµìöt×»Š)÷=u9jÇÏÕ*€ì ׊"À=ä1¦üÿ¦[âX÷>õžL+pNÁƒè4ÕÅaQ‡@¸ô"«ª®÷i0¼J÷i`’üÕtüc6K† +IšÇÚõ³U¤:>û  Dbujãˆ%|¼±>t!‹œ³êù0tjè!/ +3r+͓ö®jìäáß ¹|s'›Ö<ÍË̄N‡¸13T]{¯xi.PO-|?`²eÕŒ¥µœb×¼Ì[èbN«€p +IfSýOJ‹N\(*â¡$…ú•¢­– ÖäFÖ6ٓMbÌ +Ì·ók–ײh„Dˆv]!_Þ§õÔg/ªú8ªy¨“?!Üï×J ŒÜêã5Ì€f³Zú ß8wFgrŒ„àSþx¦† +Y|Lù¨xë㯬O´«ÓìJJ7zã_¢×o9Í ÏºšM¸¡Ù8¬ÚJû¤Ë€½ü*äÛ·¨S‘æý2«tBaѲjͶ«ªV‡ŽJ·}ÐɀÿÔü¹Ð'±O–* ÆÇå> endobj +1440 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [278.651 541.376 406.173 572.22] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_e0371bb311150040a06e7839efb57a83) >> +>> endobj +1441 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.639 261.173 300.161 271.455] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1MIP__Problem_e0371bb311150040a06e7839efb57a83) >> +>> endobj +1442 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1446 0 obj << +/D [1444 0 R /XYZ 90 757.935 null] +>> endobj +1447 0 obj << +/D [1444 0 R /XYZ 90 733.028 null] +>> endobj +1448 0 obj << +/D [1444 0 R /XYZ 90 499.782 null] +>> endobj +1409 0 obj << +/D [1444 0 R /XYZ 90 477.47 null] +>> endobj +1449 0 obj << +/D [1444 0 R /XYZ 90 477.47 null] +>> endobj +1410 0 obj << +/D [1444 0 R /XYZ 227.842 424.716 null] +>> endobj +1450 0 obj << +/D [1444 0 R /XYZ 90 407.989 null] +>> endobj +1411 0 obj << +/D [1444 0 R /XYZ 184.963 224.162 null] +>> endobj +1451 0 obj << +/D [1444 0 R /XYZ 90 207.434 null] +>> endobj +1412 0 obj << +/D [1444 0 R /XYZ 90 94.711 null] +>> endobj +1443 0 obj << +/Font << /F63 247 0 R /F81 703 0 R /F65 249 0 R /F50 215 0 R /F8 300 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1455 0 obj << +/Length 1682 +/Filter /FlateDecode +>> +stream +xÚµXÛrÛ6}×Wð­ÒL zK=I&i:Ic÷)Íh` ’ÙH¤ÂK÷뻸P¼ˆº$v_$»{ÀÁ:ÀÁëÑo·£«W" $’‚ŠàvHD‚ NIp» > F”M¦c<Þ©|«æ»lóx¯—¹šo’»\右Ùo>Ì?䏳»ÞN¦”ãñõF…{ü¨WÚvët¡ÁXH™s:ù|ûvôòvôuDÀ;;Pò`±}úŒƒ%´¿ 0 +e<ØQۀÑþ7ÁÍèÏ> ¼ +QMªÊdBðø›ùÑÎQûœ%K÷vi¼³™Z.ç‹,-Ê\%ié¾þs|Ý´A¬W¯bÒr0”ðÌ"pßú·pC:10äbµÀ qc8n™2 aEÁ”DHPæƾX.=öÊý-²‰íѽe«ºµë`Õ&`7¢ç_gî1×ÊÌ-ï=š“2·8!»àõŠõBÂ  Á¤3ùòûBïʼœu¾mlt%1Š°SÐÄý²år6KÒ ƒÕU›d9WùºÚjqËP'.ɑ¤u\·÷y6¡|üN¦!ãdeþ¹‹Ó4œAr’S(J Û~¶¤pF•› '‹ÒOœê¯ÄP>º÷,÷í2^ùÇÒ^ìÔ»·L Ü@tap@ŠâŒàÛh™é6>MÖ¹V%0×/«J{ ì'1­I|‚ @1„Úu¾Ü;Wzhg%Ùã…X1¥a„x)Ï("<îò›᷐Q‹ßBÆ?ÍïÂë|>µ°â.ž7E ‚8@~ +Öp«3FTʳä'ˆRþSäß/c'2ÓtX½°eqßåŽ;@aÆÄs ‹ðTA ^Äõ€È!A „YA0ÿ.NÂǝ­:ŠVt1¥"2<‡)ÞO –K°[8»@H˜íÑOâ•Â8ÐV +Óg”¢í©• 3Ð1Øê¼"÷ô GëÄ'ÈsËm/<5 D¢É|@ǐŒÉ%RrZI`eA +¼’D]%G”$ŒHKIˆþ€’ºœgwÿèEÛä|U¥¶alE my«¨òa]yù}ç +ªÂ‚y¨/L¢P°:v˜q zB¡Ò:[^ +ùW—µ¬éZ*ö‹\¼øf²Ò7»ÈêõE °4$üÀ×. "$_Ïl”±gSþ?)Gìù(kåˆ÷TÇ6U`ÈðŽ2Ðäè4t#Ò(ˆ¥°™©¡0Xo( ]žÂöI»þ¾_S¯4F6àn qº + ÅqüdæJ¨ä©&nt¢Ä¿Ë²®%êrÞ&żk¨UÐÔÔøGxƒ»Œ¹¾×‹/µz6†¯ÑÇ´¢ŒIô\RH.ä Ž0ïòç£.«Ü»O ~JzâÄsê]Ê+=ä’@ ï]J|U¢RúÊÒzIVgêˆÞæÔ^§ÁÜa œÁ܉OäN/+æ7¥*«âGS©È6m£—çÐ{Яmò¯.žTVa(ªÄÅkÛáõ}LbXzhº°0‚mʪµ“¤Ëd°¦k×g0YU.²­v­¦<5®×4¸°•ÛFL—*¡œÚ•îÅàW¥+­Šfÿ‰*Ü6ï²*]ê:Á|Åâí×ÍD³$ƒÉ+6|öG’‡0L[%¼†?0Ú,ýZm*é£„«úA€^ëT窄KŽŽöçOýÍN‹¾5GÚ6B¢ýpÀ›CÀי^Ê-=x×Á9ˆþ~J«íP9£8|’Ý¥N‡ì‚>2v®Ì¡‚¡NP“”­s¶]Øõ$;ˆ¦¿ëâ=JFỒ6Àï?n¦0*K åÁ 8HFaìwV"diHiǵî%‘澈D(9uÓš ¾l³—l)‰(‡2‡H~*#‚€s,­Jï‹<ÎuQmJ×h©–<¶ „Ÿ:-{ ՝Ðߪ;µ¡-Åq,N'~¿˜ìÈ&Ú¿Ç&ÞøÒkL‹,o# &¸Dœ³ºrôbÿÁi¤Ã¿Öúá^ß9q/oՄbžïVéºRkoêM +%ßÊêJ}>û«Ðù/sïä·•Â9²Ù¨ÄySâ™ÚQ'–ÓLÝhíqq`| ê§ß]©ÐÊW.ÚÕÍ}YîfWWhQ *Mv9JÊ«Ýnsu¸)µRø5%öª–õm–û“-œ×‡¬›Â"ò÷ÚI +·vO9XÇÿa0í! +endstream +endobj +1454 0 obj << +/Type /Page +/Contents 1455 0 R +/Resources 1453 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1327 0 R +/Annots [ 1452 0 R ] +>> endobj +1452 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1456 0 obj << +/D [1454 0 R /XYZ 90 757.935 null] +>> endobj +1457 0 obj << +/D [1454 0 R /XYZ 90 733.028 null] +>> endobj +1413 0 obj << +/D [1454 0 R /XYZ 90 635.762 null] +>> endobj +1458 0 obj << +/D [1454 0 R /XYZ 90 621.192 null] +>> endobj +1414 0 obj << +/D [1454 0 R /XYZ 90 506.466 null] +>> endobj +1459 0 obj << +/D [1454 0 R /XYZ 90 491.895 null] +>> endobj +1415 0 obj << +/D [1454 0 R /XYZ 90 379.172 null] +>> endobj +1460 0 obj << +/D [1454 0 R /XYZ 90 364.602 null] +>> endobj +1416 0 obj << +/D [1454 0 R /XYZ 90 273.686 null] +>> endobj +1461 0 obj << +/D [1454 0 R /XYZ 90 259.116 null] +>> endobj +1417 0 obj << +/D [1454 0 R /XYZ 90 158.248 null] +>> endobj +1462 0 obj << +/D [1454 0 R /XYZ 90 143.678 null] +>> endobj +1453 0 obj << +/Font << /F63 247 0 R /F81 703 0 R /F50 215 0 R /F65 249 0 R /F23 216 0 R /F10 964 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1467 0 obj << +/Length 1635 +/Filter /FlateDecode +>> +stream +xÚÍXےÓF}÷Wè ¹*ÏE3’üŠ¥ ¡ØÀæ (—,m]IŽ!_Ÿž‹®–M¶ØPy€Ksé>}út°³w°óröóÃly'˜¢PPá<ìœ;¾ ˆSâ_PŽÝçiTUføN%óXξàËÙüÓÃëً‡ÙŸ36b‡h›¸|Ɲ8›}ø„-<í`ÄÂÀ9ëY™ãQSçýì·¶þá«~!ÂØs|*žñõ^™•Q&kYV+mÈx§å]@zېù8tðsj¶‘Eé)ª“|X%y=ØgyÇqo½ï!(?õʇƒ4ȘuzØàv>$ñÁ ëfZ±ù,ã:™SîB¸kïNyÜ~NÒԌ6ö½4 à?m¨Ü¢‘‰ÖÆáÈþ±4?e·Ü¢ ¤uëmޜ 6~Iê±]q‘×Q’œƒ#dÕEi}ݍÞ_xa7Oäm§¬…§¶2¿å!Œ¾Ë)8¢È’ü Ý°zÁ$ M”"ZZ· øHJÃ#ÎÍU½]­À ‰Òd»ŽÊ=„ç6·CxuÔ. åÂY!ún²SKÁ|Þ[á1Äp»¤>$•™4ä–@ßNŠòíÄFÄGÌ š9S 9¶pìݴ”ÆÊmNVÝ"Éã";Â&›Ô¾ƒÂ>µÀˆP#`É8¬{™[6_Z+ÀmNg-aí‚ÄÊi^XF=Aö¼K(&ˆ ‰‡x§ôbˆ`+÷ÀÒD)¢w³çËÖ sĵŠðæÕýúÞT,[­v2ªv랴}ÄÃ?2á!8}$¨¥ð;YŸÊ¼¸×ìx¡˜»dÚwš€!oC¬JÕQØÉñ52¶s~2g6ñntÀªBUW·ó•@"Èñ´ùº-2 µ,Kȵ< T‰'µçYËd­…¼Ô±µÓÆ$¬€= L#˜4ÉÂÐG!$ò4 ÉAÂ`͒¿»Ôú.Z€ô¦Qz†Ce‚‚ÃBñƒ)¦TõÿÊ1q­P8“}»ð®l YåÏTÀk³±a# ќâ®I‚':|"p;N˜ç:‚ +rŸ¸ ’H©A^›4€Iµ MåIeŠ$lS,è§|SœòmSÒþ>"eXåØ”ñF)C¯¥ x©ÇE¢Nác3&J×z½j?Ìv*ežr§ŒÙ©g<(2¢­Á¶a9¼ +hØ]cçQðN³­WP¿yZ€<Ҟf;¹ñi îž×U€É”_¨j,¨M|{ú{YWSÉ —ˆðÒÅ!C127“[íŠjiü ã/÷i¯ŠF•#‹ÁŽ=ež ë`CP8zа.V$ÈC‡AÛÈñÍÛ˜èÌ悥/Tƒ# 4%>àÅ…” o¹Q÷À†<Ƈ-L[dª"=uW˜‹&Ù&mÔM±Yø )¤Ð8•”#þí±xZ)d¤•ÂAïâA"„OÒºD‰?-—ŒZ%+Fr ¯"kß@.áy+—Œ·r©†;óÚD Ö¹T Z¹TÞ6rÉâŒSþñrÙ ¤r”{£[õ¶ˆõ¥¥G›]³«Ì\ܺg­zÕ ƒoÌٕE6bå®HSLî-0MåX*—û³a ùù«¡¡ùñºOró:Ê÷§ho·z•×²ÜéČí£ß+Y>›sîZ^½‰òSӐ+pmTª–Âpa‡¬P0£9pC}—'ÆN3úe¦e¶WZ9ëNCu}\-—çóÅ:åɱDI½<Óå%ÏzÕb擶 +´2”¥´Jæ+I„Z¥nIöcl’ÃÄLË×0®Ç©‹‰ +endstream +endobj +1466 0 obj << +/Type /Page +/Contents 1467 0 R +/Resources 1465 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1474 0 R +/Annots [ 1463 0 R 1464 0 R ] +>> endobj +1463 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 111.925 224.515 122.829] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Overflow__Error__Exception_6c67cb8304bf0e784ad1aa328e82e20e) >> +>> endobj +1464 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1468 0 obj << +/D [1466 0 R /XYZ 90 757.935 null] +>> endobj +1418 0 obj << +/D [1466 0 R /XYZ 90 612.307 null] +>> endobj +1469 0 obj << +/D [1466 0 R /XYZ 90 597.977 null] +>> endobj +1419 0 obj << +/D [1466 0 R /XYZ 90 509.827 null] +>> endobj +1470 0 obj << +/D [1466 0 R /XYZ 90 495.497 null] +>> endobj +1439 0 obj << +/D [1466 0 R /XYZ 90 397.449 null] +>> endobj +1471 0 obj << +/D [1466 0 R /XYZ 90 383.119 null] +>> endobj +557 0 obj << +/D [1466 0 R /XYZ 90 218.667 null] +>> endobj +166 0 obj << +/D [1466 0 R /XYZ 90 211.24 null] +>> endobj +1472 0 obj << +/D [1466 0 R /XYZ 90 130.632 null] +>> endobj +1473 0 obj << +/D [1466 0 R /XYZ 90 130.632 null] +>> endobj +1465 0 obj << +/Font << /F63 247 0 R /F81 703 0 R /F50 215 0 R /F65 249 0 R /F23 216 0 R /F10 964 0 R /F70 298 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1485 0 obj << +/Length 1204 +/Filter /FlateDecode +>> +stream +xÚÝX[oÛ6~÷¯ÐÛ$`¦yu †]› KZÌK¼¾¤…!K´­T–ò·âÕàö#¶¿´0ba`m©•åRÏ̺ü1À'¡¤ ao¡äˆ0߈*J3‘h߈2–éºJ‹\‡ÅqO¶†ÔEÌ µ¢ó/±hDMtI-ôKUègánVÿ„ü€1+Ê퍞R²DʊÒK|ädÞÉR”JS8©Å}30G¹~™¡b!äMðµY +3_-€Iý±ŒÊv¹ í¸ÈÁ=º¨e«¤‰žuëHšW/ Ø?íE!æ*µ0NE^•­z‡bûsš/ºÐ +¹Á~VÔy҂]¦‹]x€A´ˆë莚 i†æ…4 /Sƒ{¼M°MSæc!r!£ª57—Ū]*ZeY¦7EùÛ ©x2qÖ¤d›SP=ÈeA³ûaÀ´“(å»R·C õûƒ Ÿž«½žvé‚î4Fj2êªGÃDUž [{ÌE˜ÿkîè)¥˜"BØCèÉŠpȎpÀž:aøŽj;Jë „"a°[n¯ôⵊO—×\?5Y-ÊÝñê~möùJ?¢e,×Ïà ñdl÷¯Þ^·åà©7ïæÆ a{(ô¡ÿè7çû=X÷3h4æ³í4ús§Ý\ö»žŽòE-Œªßà>*çMãŠÍП¥?¨Vivþ]”×Qæta÷àу©ö¨Ð@ΐª! .ŒOVûv¥Žr¼"åpÿ!Ýï)˪ZŸF›ÍÅ%ªót-QZÖëlô°Ilµuø$Ý-ª;¬ +ÙxýÍ'ˆ3Ïú°ÈœRÓWÍAíïã?'‹S +endstream +endobj +1484 0 obj << +/Type /Page +/Contents 1485 0 R +/Resources 1483 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1474 0 R +/Annots [ 1475 0 R 1476 0 R 1477 0 R 1478 0 R 1479 0 R 1480 0 R 1482 0 R ] +>> endobj +1475 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 510.407 156.032 521.311] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pair_3_01K_00_01V_01_4_5c1e588b7f6a9f94b053a5cec723dfe6) >> +>> endobj +1476 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.594 471.858 167.091 482.762] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pair_3_01K_00_01V_01_4_637f0b668a07b52f0fc9454c13f4d16e) >> +>> endobj +1477 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.068 195.041 247.464 205.945] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Parma__Polyhedra__Library_51207bdf0804635cce036bd6b6459abf) >> +>> endobj +1478 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.068 159.164 248.022 169.694] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Parma__Polyhedra__Library_952c4e092ec518368be278c13c689acd) >> +>> endobj +1479 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.068 122.913 256.072 133.443] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Parma__Polyhedra__Library_9f9880633bb81d02f27e6fb22dc83bdc) >> +>> endobj +1480 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.068 86.662 240.819 97.192] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Parma__Polyhedra__Library_0f295b8b6083b12c373b48417ae8a466) >> +>> endobj +1482 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1486 0 obj << +/D [1484 0 R /XYZ 90 757.935 null] +>> endobj +1487 0 obj << +/D [1484 0 R /XYZ 90 733.028 null] +>> endobj +558 0 obj << +/D [1484 0 R /XYZ 90 617.013 null] +>> endobj +170 0 obj << +/D [1484 0 R /XYZ 90 609.939 null] +>> endobj +1488 0 obj << +/D [1484 0 R /XYZ 90 529.228 null] +>> endobj +1489 0 obj << +/D [1484 0 R /XYZ 90 529.228 null] +>> endobj +1490 0 obj << +/D [1484 0 R /XYZ 90 490.799 null] +>> endobj +1491 0 obj << +/D [1484 0 R /XYZ 90 434.828 null] +>> endobj +559 0 obj << +/D [1484 0 R /XYZ 90 323.106 null] +>> endobj +174 0 obj << +/D [1484 0 R /XYZ 90 316.033 null] +>> endobj +1492 0 obj << +/D [1484 0 R /XYZ 90 235.322 null] +>> endobj +1493 0 obj << +/D [1484 0 R /XYZ 90 209.967 null] +>> endobj +1494 0 obj << +/D [1484 0 R /XYZ 90 175.738 null] +>> endobj +1495 0 obj << +/D [1484 0 R /XYZ 90 139.487 null] +>> endobj +1496 0 obj << +/D [1484 0 R /XYZ 90 103.236 null] +>> endobj +1483 0 obj << +/Font << /F63 247 0 R /F11 291 0 R /F50 215 0 R /F21 828 0 R /F70 298 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1505 0 obj << +/Length 1627 +/Filter /FlateDecode +>> +stream +xÚÕX[s›F~ׯà­hÖ»À‚ð[šÔ¦ÉŒë(ONF³B+›±ê²Xãþúž½€]’qÜÎôAÃa¯ß¹|災;{¿N~žO.®’ÈËP–„‰7_{ö҄ o¾òn}‚Q˜N‚1ö·LnØb+ʧ{¾’lQKÉäÓååõ”`ßL^OCìw >ØÓ ¤Ø[²º¶â _s9%3ŸW9ŸiŠ©Oéôëüýä—ùä¯ pØ# MQQ/ßLn¿boãï=Œ¢læí̪‡C”ÄÄ<3[H_ñn +ΨSEî`8 ©ÿ8%Ôwh>)YTwn§6¦¼sV½1g f½Ô@ÇWèé/˜bø‘£:ŒÌÙB'Êâôˆ5k Ëȹ¨+ªîýlÉ%«*ÀúRFÔ4|)#:l„ÿ¼÷¨)!ˆ„3€ÍgLPë†F3k%®Tâ Ƒ`ú=؊¢RvÔP^4Õª[·+>Ä4r$„SLÁÜ8û17>šÔT¬Î;²æj!ÆÅZȅ6ãKºÕåU0ø4"™u˜®®?[ANcº·“Ñv²R-àj735Úo®¶„Ñš³\sÜ=KVó•îæ¹w“}w¾Ò¢Ëtš|v`'䃕r!µ)­:¨ µÔʬZr¥>ÏUù4¥Ô&gÿ3gK^+!ùb ?°^çøÏᆇ[bôÞÃQÞí*‰víÀ’Cxs»U¡ +V3íôÓ5 +Ð`Èyj«cGˆÐ¸× ⺁wP‹R‡”>ø¯sYl•+%#ßB”„1Šb%o\êÚw¹(K›N×Z%ß{¶´S릲aìEÜpQ"’Ñ>âÐ!þÈ÷ÕûʝâЋ¼ÙðJ±ÿ±;¨S¾?šf6þˆ©¦X;C¹šÐÙóÛ¦ËK—¹Í‰ýø¥éPiœ¡Né[ îëq?%aüµ¥åzwƒ27 ð´š„$ô·Rh>+^ÛÙ¢‚PÞ´q l)eE{'l³wÂH¯ky­G²v °ÉyUÞáDè—,°K %ô•>æÉNï¬'$«Ô“ÞA~­E/ú€£ØÝ)Ù³·½$Žý·¯^i!»m¶@ i‡“wµ¤„_jw7EÙÛ¢6ê§ õµv÷\òþæ’ÖVHÕ?讶3¬rv»¢nW)ă•tÖ0SëFÂÍdÏ'xǐ †lGl I8;  ¦öEçc»æù”Ðõ98æ…~s±Xk¿¹â}½GìÉfC¹Áß$OàV(t6­ŸH麆ÛL"–©á]ý¶T«ÛdÛ¦­~ýÖï½^ËÖo·Õ„·©ß–ÕRڝœ¤mav3ÝsË¥Ž ÈÓ(¡ƒ%geù䆔Û1(C*6ÐáAßúoa±ƒªiݽîeâý…ç«ö6Qµ—ës +úÑ(éWù£ÝUûû}•åÎØp¦É…hêÒý§ÕúóÕ¹BÍÒÂè±=_ôÛóébÿek£ cŸCã$=ãôèg¨3È&Ñ÷PÇ­üaêtCÆýŽè9Ýи.¾Y+““™ñ°Å‘dmÐÂp/háÍ ÑÏÚ®òŠ²Q܄ ŒW<çum¿„À«ÉÉîì3ñ û7r2láÄÎ 7u‡{_ë`Üý¡;ÿ…Žá:î2öÛç ƒàà ‚ý6Â%a5Î G¼4oݸto¶I²õu  ×m¢æŽCgÂT l-Åf&khN…æþ®ÿ7,ùåÐ$Aqõ!¤ˆfßøèpmþŸæ|.ÓiùO¦ ý¨oeƒýãd ¥dö½ßÇÌw0 f‚² Ú~4C”ŽÚt¯-Jû:ø²÷¾ÕN³ê®awî¨ß* ÓÚØ> endobj +1481 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [201.906 696.998 233.078 707.902] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Parma__Polyhedra__Library_8219b76f7582cc02ef563bf70b045ae6) >> +>> endobj +1497 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [201.906 660.136 231.006 671.04] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Parma__Polyhedra__Library_4254863fcee52d3a2ee594e14999fc21) >> +>> endobj +1498 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.062 586.721 287.823 597.625] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Parma__Polyhedra__Library_3d5082778a4123e14fc66912860bb420) >> +>> endobj +1499 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.062 540.893 304.969 551.797] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Parma__Polyhedra__Library_868e2f5d243f0fa2bbc4abef8f68fc74) >> +>> endobj +1500 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.893 253.382 513.996 264.286] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Parma__Polyhedra__Library_868e2f5d243f0fa2bbc4abef8f68fc74) >> +>> endobj +1514 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 241.427 155.753 252.331] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Parma__Polyhedra__Library_868e2f5d243f0fa2bbc4abef8f68fc74) >> +>> endobj +1501 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [325.473 162.029 424.869 172.933] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Parma__Polyhedra__Library_3d5082778a4123e14fc66912860bb420) >> +>> endobj +1502 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1506 0 obj << +/D [1504 0 R /XYZ 90 757.935 null] +>> endobj +1507 0 obj << +/D [1504 0 R /XYZ 90 714.099 null] +>> endobj +1508 0 obj << +/D [1504 0 R /XYZ 90 505.566 null] +>> endobj +1509 0 obj << +/D [1504 0 R /XYZ 90 446.865 null] +>> endobj +1510 0 obj << +/D [1504 0 R /XYZ 90 424.553 null] +>> endobj +1511 0 obj << +/D [1504 0 R /XYZ 90 424.553 null] +>> endobj +1512 0 obj << +/D [1504 0 R /XYZ 90 335.934 null] +>> endobj +1513 0 obj << +/D [1504 0 R /XYZ 90 321.364 null] +>> endobj +1515 0 obj << +/D [1504 0 R /XYZ 267.991 244.58 null] +>> endobj +1516 0 obj << +/D [1504 0 R /XYZ 90 227.853 null] +>> endobj +560 0 obj << +/D [1504 0 R /XYZ 90 99.881 null] +>> endobj +1503 0 obj << +/Font << /F63 247 0 R /F70 298 0 R /F50 215 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1524 0 obj << +/Length 1658 +/Filter /FlateDecode +>> +stream +xÚÅXmoÛ6þî_¡o“Š&%Q/A1`EסY:d­÷)- Ʀµz›$Çõ¿ßñMe9M€µýˆ¢ÈãÝûç;;Ì^-g‹7Qà¤(üÈYn;qDõ‰³Ü87.ÁÈOæÁ»5k +¶ª«üpÏ7 [åÙmÚÃÅÅõœ`—5]Æò՛]¹î²ªœ{>ÅîÛ²ã͖­¹z}Ï·¼™“Ä奘"8ŒB—FóOËËÙïËÙ¿3ja‡H5hŒâ€:ëbvó ;˜¿t0 +ÒÄÙËU…úŠ v}ŸZ{œŽyUÞéyq͝¾È÷r…8²`_WY¹ZW›ª`Y9"–|Äñ¾•‹±“€rQ(”J…¾ã‘¥¡¶ö=ïv Ø$…u÷<88+v…zy`ùŽ›¬S£[.Ô7ûªÑþ^cu;ÛÑçɛD“&œÁÙ3¶€“¦„<ômU圕ߺnÏ|%nJ¹Ñ õ|uXI'>:0(1pD +Q‡•b/'|\DTh\iW‰ã«èE¿~KÊç§:‚Gbx¡±í +x×êð ƒÅàÒQõg¨–¸EG-O|aà>ËL;+RÝgxˆëÑ|îc÷ë”Î EI² ¥) +âÔ,@gP³xN ÁÒÔñÂhº¤·þÂîøwâ‰'¹ï=kW¼¨»Ãa‹SÄŒdã͎O`þ ™²¿•Þ6æfóƒ¾ÛgøXn䨧„aŠ‡¤û!>'ÔE:Ž3Mg™‘‘ïÙAwà`1öK¾˜=ÍGR¥q¤]$$ODtú|Í;–å\Ûüš·ë&«¥9?< +ùDD¯Vô-¬¡AèVÍFd=1á,žmÍ×Ùö ^¨{_Í}êîÍy”öGµúÓ}µË7j|«×ÏÖÜÌôïî«M«„—¬€ïÆÎXÀ©~ï9+yôʓ¦x滧ʵj Ñ)º4EqÜ3ۋ‘ËíZ“ù¾¢Î9ÈìÌjã9™,qp4Š}ÛG" çŠÜE‘‰ý¿ªŽ_qUؾ„ÌTíâ’=°…Ñ.–ðu=*ÑgX0qU~¡ô˜é¦Ê8/À@ÏA¬«¹aáŠ|{SõœŽÃj½;¤cc{ZPƆ•¡ üçÕÄl­ä úqPoj•t>MÓÆ0¬Ç¬=ˆ©…IxÊÚ6ö«ðOgíóŒ-ÞK˜cnǃpOª¡Ñ(.UüâDs§î>Ës5{"«˜ßÖ,W4.ç¶U£ç•ù0YÁ¨J×dµ3\˜Í‰kӇ秱ûDV"´Ä?bÉR$PO1$¤lL¿u¥IO£ÆüFúß¼Ðd +"M}Ûå@_}'eUò3•›1zL‰º±èq€ ³ì&ôÍKHkÒì°î»Æ0¡Ï FYùˍ}­/ÏO†¥xŠ‡Œ*JKEX}LN’¾O°›]«È}t,œ^N[H(ò)±/ã\Ë 8Ðn,Kì–aڎ¨¯Œdd÷_QÙÞÎz!„l˜>½€&(—1µ©g­L­”¯šGË1M7òM¿ã%oXg,Û6U1‚g[幪s3Óý«‚Ǯӎ­Æ o宅Ÿ–<¢U8Z›Æ?ïEPûAœ<ñ×=ù«` …S ú©õ R:öG­UÁô«!Nõz¥ØS½\uUŸYy·ë›ß·§°ÿuô/sJ]ü;VîŒ×‰XÖÉíØ¡ÑBô¨Äí êçÆnjþœI;šèÓ%¤ç¿û®«/‹ý~Ö-ڕYÝ ¬[Ôu¾8-¶Rô¼1éý¶w¯Bäx ¢ð_ ›ˆ)saaÁN˂{üIå³? +endstream +endobj +1523 0 obj << +/Type /Page +/Contents 1524 0 R +/Resources 1522 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1474 0 R +/Annots [ 1517 0 R 1518 0 R 1519 0 R 1521 0 R ] +>> endobj +1517 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.114 640.704 210.268 651.607] +/Subtype /Link +/A << /S /GoTo /D (interfaceparma__polyhedra__library_1_1Partial__Function_c89f45a1ba3b8814dbd6be95e571cdfa) >> +>> endobj +1518 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.942 601.849 170.966 612.753] +/Subtype /Link +/A << /S /GoTo /D (interfaceparma__polyhedra__library_1_1Partial__Function_e268ac659921ee5731b202d530b9d35d) >> +>> endobj +1519 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.942 521.087 237.376 531.991] +/Subtype /Link +/A << /S /GoTo /D (interfaceparma__polyhedra__library_1_1Partial__Function_b3b4fbf99544ba087c9b1bb423043849) >> +>> endobj +1521 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1525 0 obj << +/D [1523 0 R /XYZ 90 757.935 null] +>> endobj +178 0 obj << +/D [1523 0 R /XYZ 90 733.028 null] +>> endobj +1526 0 obj << +/D [1523 0 R /XYZ 90 659.677 null] +>> endobj +1527 0 obj << +/D [1523 0 R /XYZ 90 659.677 null] +>> endobj +1528 0 obj << +/D [1523 0 R /XYZ 90 538.158 null] +>> endobj +1529 0 obj << +/D [1523 0 R /XYZ 90 483.767 null] +>> endobj +1530 0 obj << +/D [1523 0 R /XYZ 90 340.453 null] +>> endobj +1531 0 obj << +/D [1523 0 R /XYZ 90 317.518 null] +>> endobj +1532 0 obj << +/D [1523 0 R /XYZ 90 317.518 null] +>> endobj +1533 0 obj << +/D [1523 0 R /XYZ 312.673 240.854 null] +>> endobj +1534 0 obj << +/D [1523 0 R /XYZ 90 226.184 null] +>> endobj +561 0 obj << +/D [1523 0 R /XYZ 90 108.11 null] +>> endobj +1522 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F11 291 0 R /F65 249 0 R /F81 703 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1557 0 obj << +/Length 1935 +/Filter /FlateDecode +>> +stream +xÚíYK“Û6¾ëWð¶T•…À·÷äØ묝×ę=Ù)DB&ɐÔÈÚ_¿ 4@‰J3£Éd÷°•°Ùhtý¨³r¨óí䛛ÉÕûÐs’„ æ™YZîÏOö ª°®¦<0ràLµÔ +DÍ5+£ÂOßNœÏ¨ÿùµ„DJԕy_-~“i×-%#r£«å­lòΘﴶ®¿Ÿÿ¤ÙÜÎmÀÓã„z>ò¼Þ,ŠÕlä˜Oyò»%²P¥ —UYìz”ß_By-rÛÁ+å;‡JGö©Ž°wƵF–ŠB’ðžËndâ¬}ÿD ª|xF'Œÿ¨A¨Åÿ!öËML:5­yµª‘àK!Í÷I^†´³àzólD5ÎPà XWäå<ûî¹uÉ!´jAµ¸^TÏ`r†"¹É!ÛYÓ ìS%pÙÓØüÓÓì ”ÑôtX%‚GÊèì!ªNé2dx,!Ï/*þZdÈ2ûÇD-ÚîÈò²7&&(¡ì1˜`É¥ P­ »<1=®‰Y6·~zFz(÷dÏÛ,kÏÄjž@ŸÏŸ”„-8êݸÉG– –A6ž¢ mÌ|UÙx/mc°Ný #_E så¾ÏÁAÿÉ£xßŽÔ ðÕ>;Ÿî$);(*$²íÕ£ä À`kˆ4‹ÝÈ¢qx÷u¨z(ü¸%žYÃÆ;`¯ãüÅ»8ï€HÇ;õH-UEQmsìU;€B½a;ۇÁÌh¸–}]¦+€gt³OÅrăe `ù~ ±3,ÿ…RÞ´Ý«sBF'Á¾˜øa †ÐG¨¥G»RÉí±®dOÂN¹’:ø:ëJÔ{LlÉ ’ëQ=³Xu~£—9èwlµ„0¿—h´x'œõÞ¯Tõ`>PP‘ +v_Ób“I­ž +zÈBáKðZäÍ6oåKœòhüPe¹·íõâf•~íkQ®6beX}(¡Xª€'l›ú¯V6›*ì˜Û1Qö‡ZJËö;·W«”¨¨bñ¬~‘6… 2~wìÓwù÷[XBnîogn»®~}uµÝnIÚuuCò‹«û×a{. Š‘h_/m¿®u½Jd•H#øÈ\<å%®E7fÇÿÖª¿¤ +endstream +endobj +1556 0 obj << +/Type /Page +/Contents 1557 0 R +/Resources 1555 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1474 0 R +/Annots [ 1520 0 R 1535 0 R 1536 0 R 1537 0 R 1538 0 R 1539 0 R 1540 0 R 1541 0 R 1542 0 R 1543 0 R 1544 0 R 1545 0 R 1546 0 R 1547 0 R 1548 0 R 1549 0 R 1550 0 R 1551 0 R 1568 0 R 1552 0 R 1553 0 R 1554 0 R ] +>> endobj +1520 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.683 681.615 207.239 692.519] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron) >> +>> endobj +1535 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 588.085 231.425 598.989] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron_307f552cb6559fb3316979350f0698e4) >> +>> endobj +1536 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.739 540.976 189.224 551.88] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron_d3ecaaf79c9a60ab4848342458e261d7) >> +>> endobj +1537 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.568 506.463 273.029 517.367] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron_cb627ec2ad25203404db2046bd1b415c) >> +>> endobj +1538 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [276.844 506.463 414.746 517.367] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron) >> +>> endobj +1539 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.568 470.313 272.779 481.217] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron_91754711e181bd642b50021a3750ba1b) >> +>> endobj +1540 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [276.595 470.313 414.496 481.217] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron) >> +>> endobj +1541 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.535 434.162 323.738 445.066] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator) >> +>> endobj +1542 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [324.236 434.162 381.969 445.066] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron_6a0c0235057e5bd924816e77fbe24f13) >> +>> endobj +1543 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.535 398.012 323.738 408.916] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator) >> +>> endobj +1544 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [324.236 398.012 374.367 408.916] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron_b86276be6b184ca176f526bdce7db8cb) >> +>> endobj +1545 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 361.862 224.451 372.766] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron_43f91b349368a1f43667546d2d844941) >> +>> endobj +1546 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [228.267 361.862 287.823 372.766] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron) >> +>> endobj +1547 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 325.712 228.327 336.616] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron_25fcf44b7620128ac3646cf9cb7ec333) >> +>> endobj +1548 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [232.142 325.712 404.345 336.616] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator) >> +>> endobj +1549 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.974 278.603 232.636 289.507] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron_0ae5c861cdc8a2fed1057cb873c928fc) >> +>> endobj +1550 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.669 278.603 408.872 289.507] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator) >> +>> endobj +1551 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [430.341 278.603 513.996 289.507] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator) >> +>> endobj +1568 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 266.648 218.952 277.552] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator) >> +>> endobj +1552 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 230.497 238.817 241.401] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron_1deba0aacc90a96b069e32f8c3d4559e) >> +>> endobj +1553 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.683 139.778 207.239 150.682] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron) >> +>> endobj +1554 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1558 0 obj << +/D [1556 0 R /XYZ 90 757.935 null] +>> endobj +182 0 obj << +/D [1556 0 R /XYZ 90 733.028 null] +>> endobj +1559 0 obj << +/D [1556 0 R /XYZ 90 628.265 null] +>> endobj +1560 0 obj << +/D [1556 0 R /XYZ 90 603.728 null] +>> endobj +1561 0 obj << +/D [1556 0 R /XYZ 90 523.386 null] +>> endobj +1562 0 obj << +/D [1556 0 R /XYZ 90 487.236 null] +>> endobj +1563 0 obj << +/D [1556 0 R /XYZ 90 451.085 null] +>> endobj +1564 0 obj << +/D [1556 0 R /XYZ 90 414.935 null] +>> endobj +1565 0 obj << +/D [1556 0 R /XYZ 90 378.785 null] +>> endobj +1566 0 obj << +/D [1556 0 R /XYZ 90 342.635 null] +>> endobj +1567 0 obj << +/D [1556 0 R /XYZ 90 295.526 null] +>> endobj +1569 0 obj << +/D [1556 0 R /XYZ 90 247.42 null] +>> endobj +1570 0 obj << +/D [1556 0 R /XYZ 90 184.905 null] +>> endobj +1555 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1587 0 obj << +/Length 1513 +/Filter /FlateDecode +>> +stream +xÚÝXËrÛ6Ýë+¸+5ÁIðá]“4§ñÄMÜU’ÑÀ"$3!$­¨_ß  D=œºŽ³èÆ@ð¾Î¹{+{¿Ož_OÎ^Å¡—¡,bïzéeØKb‚h@¼ëÜûàŒB<Œ±_3U±y-ËÍ-Ï›—ōbjs~~5 °/ Ñ6¼›Å”`͕Þxa·ÌkS’úRÌ/Z®X+ÕtPì¿(YӘŸïø’÷‡¸Xp­8Š|šN?]¿žüv=ù:!`8öHo(MPRoQM>|Â^û¯=°7K½uªò¢ „ÿ¥÷~òçï:MñžÓAˆpLÓÏySä¼7ˆøí-7–U¼½•ù°ËZó‹)ûœi/ï¦õYQ²›’›ç…°ËÒl4¼b¢-fµâ+³Ä>¨]¨¢n )¬¦˜âõ­l¬¸\.ºŠ‹–é#æÂž²Õq'g„ ŒZo¯9ky‡bâßrÅA$y¦—‘õök©-7é4U¬7ž²²‘öœl©gkô›wz0-í N@è˅YØ¢é,ŒBÿÂÊZA4º’©i„ý±]_l‰gÛM j8 Ñ5˜,³ô¸¶ï« +±9&r‹-E &lÉ垀…,K¾8<ÍçN,Zp ìÚK'°2 ÉèMA†›O—¼ºáÖÎWZÄ ûådën¡0ÊF‚±¢´S:åîôkp)ÅÊüú‰{~Þ[š™šJÆïQFit‘1÷o;%š½ˆŠnëÿñhrlü.ì©ZñÂó̬ÞV=¸«)dÞLñ¼9$˜…½ä:Võº0Iˆý›ÕN˜ÜЖI9VkÍ¿vI¾¦VËb[ÍÖ:œÌ.V\h.;mK%«½ˆ,¥£qá°ûˆqPòó¾º +æ‘Ea +” ˆfÖȏA@ǧ>Ì(P㕎 ûÒcÞÚ9Ø<)¿mÀ ôy§l 6™h$gNW!’¦?©+hÂ¥4B”E‰Q|²QRpæÞß͛_]ɵŸÀ ÇÀÈ1Q™µîEje›Ò»>êúñÕàøN]ÕN[‡MZï`å'¼€z]8ݧC}õfþöæ3”§ûŠ%ÊUwSºvs¬5#Ëö¢:0/@±k—Ì;ÍÅïGeD]*»‚s2쏾q¥lÇ ‚{)„ Žt´ëQ8EÀKÓç]Qæc†­,õfLMº>­ݑ›f(I2ÐØKܘ#ÍAèístÔÔ¨A«LPŠ àÉDÈý£o&CK·õRʒ3q?éù×…ŸŽ\ѪÇ`çšÓ!"!FæKñVuü(Q˜˜Ý¡b¹7YHQZÀ£Cà9º‡|O…}(ˆPg[3ZuDI@[9j&ߺr*ÕE%±œz8¥îLÈïç”0ƒ[{ŠUAþRæ…î¯ü(ø!"y2ýŒÜ÷Öº”7ÿM¨û†…}7Éýyˆëˆ|kÇ}ça $ÜÝ¢'ÆÆ/óâÿ“Ú&Iå‘]óðy8÷Âqrª8ùÆ +Ê«óá)@<>ï÷¯ÿà g æÍæXuƒ!Žfô{ÈDIö;dœ¢„ÆOœ9KÅùÓºsÛÝÐ6²ë,ÜöГìsÞË1‚SD“àAIæ҆¹‹»f€¬#†Nx9Za &("¡7‹ éihgWsShaÒu|yšöÑHë&X©/ËOŽ÷a'€¯˜`ºÈ­úKàýy—¦ì¦Ùþ7;È2§ÿö“ûT£,Ȩ̀: +e”îß̯úÁ®GvéîHfùÆ\”Ìâõî×> endobj +1572 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.181 488.507 379.083 499.41] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron) >> +>> endobj +1573 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 416.023 286.113 426.926] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator_041438b5dfc0a27bb1ef8944ccef9b20) >> +>> endobj +1574 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [289.928 416.023 462.131 426.926] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator) >> +>> endobj +1575 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.383 377.168 201.83 388.072] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator_d6b10e19a21f12cc1e19304c400cbcc9) >> +>> endobj +1576 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [205.646 377.168 377.848 388.072] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator) >> +>> endobj +1577 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.356 338.688 179.355 349.218] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator_8f633594965f90e853f0a0b7d9667e7a) >> +>> endobj +1578 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.356 299.46 179.803 310.364] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator_1063791d47e047aeeb186ba499482460) >> +>> endobj +1579 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [140.351 260.605 199.907 271.509] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron) >> +>> endobj +1580 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [200.405 260.605 251.105 271.509] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator_5204a6f9136985b1cf438bea23fd9489) >> +>> endobj +1581 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.356 222.125 177.83 232.655] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator_3e689b13a25dfaf0b6f22b21127bf4f9) >> +>> endobj +1582 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.356 141.362 191.678 151.892] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator_4b29f6a5bfc34297ed8cad2fc85141ef) >> +>> endobj +1584 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1588 0 obj << +/D [1586 0 R /XYZ 90 757.935 null] +>> endobj +1589 0 obj << +/D [1586 0 R /XYZ 90 682.428 null] +>> endobj +1571 0 obj << +/D [1586 0 R /XYZ 90 660.116 null] +>> endobj +1590 0 obj << +/D [1586 0 R /XYZ 90 660.116 null] +>> endobj +562 0 obj << +/D [1586 0 R /XYZ 90 554.017 null] +>> endobj +186 0 obj << +/D [1586 0 R /XYZ 90 547.417 null] +>> endobj +1591 0 obj << +/D [1586 0 R /XYZ 90 434.996 null] +>> endobj +1592 0 obj << +/D [1586 0 R /XYZ 90 434.996 null] +>> endobj +1593 0 obj << +/D [1586 0 R /XYZ 90 396.262 null] +>> endobj +1594 0 obj << +/D [1586 0 R /XYZ 90 357.407 null] +>> endobj +1595 0 obj << +/D [1586 0 R /XYZ 90 318.553 null] +>> endobj +1596 0 obj << +/D [1586 0 R /XYZ 90 240.844 null] +>> endobj +1597 0 obj << +/D [1586 0 R /XYZ 90 159.962 null] +>> endobj +1598 0 obj << +/D [1586 0 R /XYZ 90 159.962 null] +>> endobj +1585 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1617 0 obj << +/Length 1622 +/Filter /FlateDecode +>> +stream +xÚÕXKsÛ6¾ëWðVj&‚’àC·Ö®;I›©ë¸ÓC’Ñ@$$!¡H•£èßwñ¢$ZR2™l °Øý¾}Ø[zØûmôËÃèê6½ eq{ /Ã^Dâ=Þ[Ÿ`’ñ„`Œý kÖl¶©Ë݊ ›•bÞ°f7ÞìÃô캮f÷¼dRÔÕxPì_—¬mÍã=_ðfLRŸW9‘§¡O³ñû‡W£_FÿŽè„=¢u  JBêåëÑÛ÷Ø+`þ•ªd©·Õ«Ö^„ð[zoFðE{‚á˜îíÁÈYtÃ%%/Œ‚7¼Í±ÑʃRW·HÂÞ$ˆPeFÐÏÖ@!yÃdݘQ¾7wáæ䊛‡B´º*—vA½0¿L#`Lo–ƒûßFÞ[ýú®•l¹œÝÕã€ú[Þ¨Á5 FÙP ípíC‚"šÂX^óõœ[mo•†=}7uÞ­y%™eƒÔ#ZÁÊ1Áþ'õìÎh샮ÖA”¾Ê”øŒ&_ò(g¸({ã œMœz„ ŒZº_Zv¦Ó%ìsÛÞaŠáœæš$("#åžË®©Ú3tšQ£¼[y¶u¦ùβ@ä’0C$N@¾–+W¢=q:økFÜtÄî€Õ ‰#„“8˜³åŸqL}¸P¿Õr:ptIQ‚3”íAûØ ©¢$|ò “X~ÖSÕú > ï 6&¾ÃLM€õzc+EYšGãã•BQ­õ´]=l‚À,©çx.§ã a•ÒygÞ,zWV;sfÎ ¾›± }ƪÈ“!„ØiÞ®ÙÎLŠj)¿‡µ¬“Ü,Áq8ò_× ¯•zŸÔ?ˆ7XþB­‰¬O…äЧ”È֞ÁYe§dm¦æNúzÝI6/¹yͪÂÌ·«º+‹#óbc^U+à¢X‹P¿ëºï04æQ¢ Ñó{,a°UáÇì@EŽPiL ÞÖ]“s;Ü*{ù ,(9ktx¿âV~óR£¬F†ax8„_áWá +hÒ,ó_.Nq×p`yg"°â¼àŋ‹QkØSáj_çõF¸†ôS»m%jUlúÖN`ÅoW"_ÙG À¡Ì®*\vÍëJ6uy\zݺÖQjb^§ „¨ØQ”Ù|ûÐÛq”™‡G´ê‘aЖ¼R‰ÑYºhêõ@—E]–y:aâ äÇéÄ#1ŠÂ” PXÞ& +ÅáV9û¨KÃLw3ÐyvSށBèSYÝDP_ »Ív次ÏÝ |±è©hŽιÜr^9ÎfŸÍtU½·heÃÀá¾¢vßuóRäfã©ÊÝ^Ì÷Ž.‚Ò(=C×É ¯¼{„á€eWWEeÌæCWgŽpê%ØKA½8Ò¥/@qÓ"MXל®ï›9©ï–õ±ÊUB]j粈|be§‹:yöˆ&N Õ7fáe—ž×5d·êr '֛RðöXg7Þ»ÿnbX囦³ž,ÿ¬+—MÅÂxfHŒcDIàZÈaßôìE(Æ'ZžcÕB׷证¬ E$¢nÝî„$ŠÀ½OöNç{¨E)õ&Q€"bqy£« ²ç8ëL­9ô ׁK.qvTý•Jäg\ð[â³ÏƒHy³O„rÅlhÙÎÆ®SãYcòa­¾D¨›É“B™  tCgºaÑèk´iH:‰¾29Ð¥h»¾z÷»L±Ñ¥¸OÓp[ÿ Eª]-úÑÓD.a«ªÐ3ª²ñœNŠ)}´*Dæø§'ÍvsÕÖtÒ}ˆ°¿ûPsÚäeWì›Z·üG ÀޞïNk{ Ð'%øÇ =&;u©h¿{j|"f:ƒ¿ü6v†ß2ãá8ýÚO™ú&У,¾Á|¤¢4q§Õϸ'M_{Ìðs÷1ƒW‡7+óšUˎ-­¨—*a-ô1·SC-ÿI5‡ž×¬êX¹ÿrf?b´}¹Ç®b½¡‡ ê wߋ =÷ôûH·u{£”ôMâJÊÍôêj»Ý¢¼E]%6 òj³)¯·Z{)ü%!™“Ò_‡×uc>ôL„ ÆÞ$Mö)*X¸Ön~Ì+ðøݤå, +endstream +endobj +1616 0 obj << +/Type /Page +/Contents 1617 0 R +/Resources 1615 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1631 0 R +/Annots [ 1583 0 R 1600 0 R 1601 0 R 1602 0 R 1603 0 R 1604 0 R 1605 0 R 1606 0 R 1607 0 R 1608 0 R 1609 0 R 1610 0 R 1611 0 R 1612 0 R 1613 0 R 1614 0 R ] +>> endobj +1583 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.181 695.563 379.083 706.467] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron) >> +>> endobj +1600 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [159.072 568.659 218.628 599.627] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron) >> +>> endobj +1601 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 375.862 194.507 386.766] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Con__Relation_5703e74effb8a5b4090be08699d6b808) >> +>> endobj +1602 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.942 338.643 179.274 349.547] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Con__Relation_86ef4d8f3963d0e41bd32e5745b2b161) >> +>> endobj +1603 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.09 338.643 263.687 349.547] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Con__Relation) >> +>> endobj +1604 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 260.251 218.029 271.155] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Con__Relation) >> +>> endobj +1605 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.527 260.251 250.965 271.155] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Con__Relation_0b8fd6b1ed827658839d73fcb11d4755) >> +>> endobj +1606 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 223.032 218.029 233.936] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Con__Relation) >> +>> endobj +1607 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.527 223.032 262.043 233.936] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Con__Relation_d487a3b3a0d3590dd3678cf333549f47) >> +>> endobj +1608 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 185.812 218.029 196.716] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Con__Relation) >> +>> endobj +1609 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.527 185.812 290.804 196.716] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Con__Relation_103c1a923368f15f9846bb63c5fc8bcd) >> +>> endobj +1610 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 148.593 218.029 159.497] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Con__Relation) >> +>> endobj +1611 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.527 148.593 266.456 159.497] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Con__Relation_0ce79e66e5f99bf6dae5077d3eeb15a8) >> +>> endobj +1612 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 111.374 218.029 122.278] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Con__Relation) >> +>> endobj +1613 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.527 111.374 255.378 122.278] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Con__Relation_981388a9978a768d9859bc6a05b59612) >> +>> endobj +1614 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1618 0 obj << +/D [1616 0 R /XYZ 90 757.935 null] +>> endobj +1619 0 obj << +/D [1616 0 R /XYZ 90 733.028 null] +>> endobj +1620 0 obj << +/D [1616 0 R /XYZ 90 682.725 null] +>> endobj +1599 0 obj << +/D [1616 0 R /XYZ 90 660.413 null] +>> endobj +1621 0 obj << +/D [1616 0 R /XYZ 90 660.413 null] +>> endobj +563 0 obj << +/D [1616 0 R /XYZ 90 483.265 null] +>> endobj +190 0 obj << +/D [1616 0 R /XYZ 90 474.131 null] +>> endobj +1622 0 obj << +/D [1616 0 R /XYZ 90 394.018 null] +>> endobj +1623 0 obj << +/D [1616 0 R /XYZ 90 394.018 null] +>> endobj +1624 0 obj << +/D [1616 0 R /XYZ 90 356.919 null] +>> endobj +1625 0 obj << +/D [1616 0 R /XYZ 90 278.407 null] +>> endobj +1626 0 obj << +/D [1616 0 R /XYZ 90 278.407 null] +>> endobj +1627 0 obj << +/D [1616 0 R /XYZ 90 241.307 null] +>> endobj +1628 0 obj << +/D [1616 0 R /XYZ 90 204.088 null] +>> endobj +1629 0 obj << +/D [1616 0 R /XYZ 90 166.869 null] +>> endobj +1630 0 obj << +/D [1616 0 R /XYZ 90 129.65 null] +>> endobj +1615 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F65 249 0 R /F70 298 0 R /F84 1406 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1644 0 obj << +/Length 1105 +/Filter /FlateDecode +>> +stream +xÚÕW˒â6ÝóÚ/’lùÑ» “žšNτt3«ž)Jî›Èvþ>’%lEeBj²Ëò½GçžûK€À‡ÞϓÞðÞwA#Ÿø`²!%Læॏt‰3À¡þ†‰5›nòt·âsÁ¦i2LìîîÆA}¹<ýÀ³éOY™ä™3 õG)+ +ý÷‰/¸ppØçYÌ¥IŒB·ï#çÛä¡÷ˤ÷gKLà `àR¯{/ߘËõ ¡D!ØÖ»ÖÀ#®üMÁsï÷ºxâBäÓýy0ÄæDïyɒ”Ï5À÷¼ˆE²©ÁKPÃ{Š,!0 t½Hš¬¸þJ´Î;ãå–sóÀôeÌîaÙ¼õ>γ¢,ÉJ¨ü*O8€>ñ¬§Ä0ïÉL֛”¯yV×*‹³’/Œ“¢àâpÝ (oÚ¡jžÇ•Â|àn‘ çÄ)·VÐKžqÁJ­…Èם“,ò4ÍBûÛ$[ꥯ‘”ßÕ"³*؇žÊxRH#ÃòWBh{×ˀJ‰Œ•®Gù^×ð•)¹¿)?LëD*cQJ”PÖ¼ëA7ΣÿR¨&2d”öasö–k—@™À«YšÄúÛO|=ã&Ö÷R ï£ ¾ÍÞ£ é‚!–¦r<µÃÖ¢±[-Š¤h5(ÐT®áŽ /@ ”ð|OÁS°<"ƒíÁÈ3ÕyPÅ6)ÂñhßÊԐ(rǓd*m[FÞXZqV|Ÿ¡h`AÈ +áË:žåyʙ¥ák¶ª$¼8ÇÕُ¯£{÷=ÜN”æDe´œ,: +ͳt×¼ª…z}RL¤/ÍB®Q/=ØäAvO]ê=mh.”ýÑn:à«c‹„{Ôî۝°D¡T·yÏ°ÒJ.YWè… <bjxyVÕÔäØíó͈©ÐN/jé²$Î~–å’yY½ÏHð»$d+aÓmÿ`¦lgR׸eJސޚ²Õ· ñÝ|޴צõêj–©Æ$«hi»ú6¯Òyèéïjˊeú“Žۂê™]—nQØΊºÝþ`cÞq÷üÿMzלáGöèÃÞa¶ýóaϽvØ«Õ.§¹qÒ{8­cÍ +~DxUF€þ<ª‹„ÕœYÞTæÖcÊ_m¹°“sÿÇlÅEbu{žˆñãô·Ù+O_Œ«„ÙîrÁ<ëf4ïÅݎ}§Äw/£~(ïáµwÑú*ÃäÃ(ÂÐwPAJ»2®k¥„ë4¥¾Æ¬5ðs}”´bKcê£*Å¢N Ø,}‘Åà'•¦†ÿO,«Xº¸¦(šìDPꖨ CgàJSϜ^4ûï×^=îìH¨CÜ O«²ÜÜ ‡ÛíƬ²d#`R7›tx<‚ì­`ÙfY+>×¹¨‘È, 0¤®üÈ´×$“×:]»qüU»[ +endstream +endobj +1643 0 obj << +/Type /Page +/Contents 1644 0 R +/Resources 1642 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1631 0 R +/Annots [ 1632 0 R 1633 0 R 1634 0 R 1635 0 R 1636 0 R 1637 0 R 1638 0 R 1639 0 R 1641 0 R ] +>> endobj +1632 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 521.324 194.497 532.228] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Gen__Relation_a542fab30058371e9f17fca3eb84724b) >> +>> endobj +1633 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.942 482.47 179.274 493.374] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Gen__Relation_ba48365387e24282c5facb79d544df54) >> +>> endobj +1634 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.09 482.47 263.677 493.374] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Gen__Relation) >> +>> endobj +1635 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 401.707 218.019 412.611] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Gen__Relation) >> +>> endobj +1636 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.517 401.707 250.955 412.611] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Gen__Relation_52e2da847dc03a6a0bd03eb718bbc2c5) >> +>> endobj +1637 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.432 362.853 218.019 373.757] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Gen__Relation) >> +>> endobj +1638 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.517 362.853 259.253 373.757] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Gen__Relation_c9b4e9cbc50b16d0b8eae819ba758bb1) >> +>> endobj +1639 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.912 125.778 306.267 136.682] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron) >> +>> endobj +1641 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1645 0 obj << +/D [1643 0 R /XYZ 90 757.935 null] +>> endobj +1646 0 obj << +/D [1643 0 R /XYZ 90 733.028 null] +>> endobj +564 0 obj << +/D [1643 0 R /XYZ 90 627.746 null] +>> endobj +194 0 obj << +/D [1643 0 R /XYZ 90 621.146 null] +>> endobj +1647 0 obj << +/D [1643 0 R /XYZ 90 540.298 null] +>> endobj +1648 0 obj << +/D [1643 0 R /XYZ 90 540.298 null] +>> endobj +1649 0 obj << +/D [1643 0 R /XYZ 90 501.563 null] +>> endobj +1650 0 obj << +/D [1643 0 R /XYZ 90 420.681 null] +>> endobj +1651 0 obj << +/D [1643 0 R /XYZ 90 420.681 null] +>> endobj +1652 0 obj << +/D [1643 0 R /XYZ 90 381.946 null] +>> endobj +1653 0 obj << +/D [1643 0 R /XYZ 90 325.533 null] +>> endobj +565 0 obj << +/D [1643 0 R /XYZ 90 212.589 null] +>> endobj +198 0 obj << +/D [1643 0 R /XYZ 90 205.989 null] +>> endobj +1642 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F84 1406 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1686 0 obj << +/Length 1671 +/Filter /FlateDecode +>> +stream +xÚíZK“7¾ó+æ¨2Z=Fš'•ƒ;ÇN9ö&—µ‹ `*óÀóXL~}Z–ec\k×(4 µZ_Ýjõ{s{¿öž]ö.^ +æE(Tx—3/Â^ â”x—SïªO0bl0$ãþR©-ód½PÓBŽ’x\ÈbýôéÛÅ}÷ó€„ý< )Çýç‰,KÛ|§fÊü§²‰y¾Ïü¾ ƒ—¯z/.{ŸzÂ1 +ðŒ{“´wõ{Søý•zD¡·2½Rϧ ¾ï}ïϾu1”!,¸]ÌÛzœÄ«Ð•ŽA#Ó~Yg“*γҨÓÈk¾=â#0oH)â¡oEu7ÕBV¶õKn¿ÿÈÝoòi<[7ݔmt ×Vãâ%Ç­5†|º$‚ÐêòR¾3Ä»r°W&«x@yÿz@xßM–äÙÜõÕhsû;3J÷(—r¢FÓ8UYïéâº|ÀÇtÂuñ2À^ú +_ë   ŸxCÐ;«ð;UÕÅ.§ÚvJó˜Ïöþ¿V“*w%m•äel—à­ÉI¢@ —™·ZÄ¥íµ«"ðDM'Ô¹ªÖRFQDCŽ€ûç0ˆœé10¦ÙW²‹(¤­Þ #ÂDîÑG‡M‡'vmñ¬Ë&8:fÐJ¦S쨢ÒeµþÑÑxQ¬âR næ+,èïsËçxGÞ^Mß}&ÞÔLP„Ùf¡y× +#DÉ99Ç0t¸ã;‰s·2í9Ä°ªqVÞ¯ËJ¥{j6Ù +¿(+ÃÛ¢EiÜ V½P£Ì‰žì¦>¨ó¢ÖÛÞ© ºaçU†TÏ£>Õ2‰«µ™ï†rv(RjRSûÃxÝåú¸¥ç Ç>C "×Cq4Îâ4þWMGÕI\è\ÅÕ¶²¼L§u6•YÕ5ô›v¯Ã|%GãÖÑxË,ܙEt:ßw4¾ïhü°£ñˆäh†&€ôV)Ë~“ šÉÌi´×C=›¶5A„€7Â)"â‘ÛÌ!ßÙc©L] ¶bH€»·bÛ¡ìÌ(BBb~|µô~Q…8Dø÷Ûpm4ÌóDÉìv&ÇåÈ$8gÏìvÀÛÍì*0éñtÌEgq-Y²¾%ãóRq¯ŒOf­ÌÏ6›óçÀçÉN4¤"Bùý³õ»²ÎZC‹R=Ú´eSû]ë’ø¿ú†,;Î! +Bð}4è¾Ad¾[NãrR¨êÑ;[Æ4˜Øs´Ò>PÓU90,ŸÇ™$둮=úd‡OZ˜tuP¹DÞâe³¯z\ªêÎ5·J HG+8””#8˜%çª-sxzdÅÕ7‘³6 Z6†oòmŸtќi +ÜÇju{¨>xt;8¾ÿ÷€җE,ÇIçp­U’ÅÉ<¡( ȃãɵ,:f€“ os~'â¬cAàäÅÏwò¢T b_w„,<‹LâRŽfEžŽä8×Ãw*'ê5à%‹Ñ‹ÏËB•‡Êô&>Aï„Y +–rç}i'IœÙôШ ôz˹…oEÑ9ˇ‚"îûŽoÁWàÛXÁö BV‘kô»åš†}u„gQxƸ&4Îì~Dc‚'´ŸÊϦȹ/T øŸÜÒâné|áÉ-šD¤ÿ> endobj +1640 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.739 675.65 242.354 686.554] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_8b521c98491fa559861dae11ad3ec3f3) >> +>> endobj +1654 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.739 639.109 242.663 650.013] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_84625e35d755ced248ffe55750614f09) >> +>> endobj +1655 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.535 602.568 229.362 613.472] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint__System) >> +>> endobj +1656 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [229.861 602.568 275.021 613.472] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_56bf9c6096c448f27d61416f27a05db1) >> +>> endobj +1657 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.535 566.027 235.988 576.931] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Congruence__System) >> +>> endobj +1658 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.486 566.027 288.271 576.931] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_dd544c3d22008bb22d0b6fa536c651dd) >> +>> endobj +1659 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.535 529.487 229.362 540.39] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint__System) >> +>> endobj +1660 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [229.861 529.487 322.621 540.39] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_d0f0c9ad050583abd703aaedb6e5cca1) >> +>> endobj +1661 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.535 492.946 235.988 503.85] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Congruence__System) >> +>> endobj +1662 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.486 492.946 335.872 503.85] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_81c4315daec6710e58a0617d92839e81) >> +>> endobj +1663 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.568 445.446 224.093 456.35] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_25143e2f87da1099e3cb5c065a2e0890) >> +>> endobj +1664 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.568 409.278 232.541 419.809] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_ad130af7dc19af625d583e25020026e1) >> +>> endobj +1665 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.568 372.737 233.497 383.268] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_1d1b69611f06c6e9aa03fd1b951573f8) >> +>> endobj +1666 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.568 336.197 230.169 346.727] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_951904ccc728d261cf367a0bc613478d) >> +>> endobj +1667 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.568 299.282 282.204 310.186] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_9f7d55f53c6ca0b56163de733c0bca5d) >> +>> endobj +1668 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.568 262.741 278.727 273.645] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_50926d4c45d6e451ccec518c8051733c) >> +>> endobj +1669 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.568 226.574 227.958 237.104] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_b7c4fb00dc7b0fff7edbe9d80ad15ae6) >> +>> endobj +1670 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [231.774 226.574 266.961 237.104] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variable) >> +>> endobj +1671 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.568 191.491 269.164 202.395] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_4949285de47134b38f894d92823a931b) >> +>> endobj +1672 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [272.979 191.491 350.229 202.395] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1673 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.568 156.782 269.771 167.686] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_c72ffc5f5715e6a10e6d5e63a43b6e9e) >> +>> endobj +1674 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [273.587 156.782 350.836 167.686] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1675 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [187.81 122.074 229.095 132.978] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_c4f92e1418a46d38b818059a3dadab69) >> +>> endobj +1676 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [234.031 122.074 311.281 132.978] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1677 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [336.439 122.074 382.456 132.978] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1678 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [414.259 122.074 460.276 132.978] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1683 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1687 0 obj << +/D [1685 0 R /XYZ 90 757.935 null] +>> endobj +1688 0 obj << +/D [1685 0 R /XYZ 90 716.221 null] +>> endobj +1689 0 obj << +/D [1685 0 R /XYZ 90 690.649 null] +>> endobj +1690 0 obj << +/D [1685 0 R /XYZ 90 656.13 null] +>> endobj +1691 0 obj << +/D [1685 0 R /XYZ 90 619.589 null] +>> endobj +1692 0 obj << +/D [1685 0 R /XYZ 90 583.048 null] +>> endobj +1693 0 obj << +/D [1685 0 R /XYZ 90 546.507 null] +>> endobj +1694 0 obj << +/D [1685 0 R /XYZ 90 509.966 null] +>> endobj +1695 0 obj << +/D [1685 0 R /XYZ 90 462.466 null] +>> endobj +1696 0 obj << +/D [1685 0 R /XYZ 90 425.925 null] +>> endobj +1697 0 obj << +/D [1685 0 R /XYZ 90 389.384 null] +>> endobj +1698 0 obj << +/D [1685 0 R /XYZ 90 352.844 null] +>> endobj +1699 0 obj << +/D [1685 0 R /XYZ 90 316.303 null] +>> endobj +1700 0 obj << +/D [1685 0 R /XYZ 90 279.762 null] +>> endobj +1684 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F65 249 0 R /F82 939 0 R /F11 291 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1742 0 obj << +/Length 1713 +/Filter /FlateDecode +>> +stream +xÚíZ[“›6~÷¯à­0˺ ™N²“dš¶Óm²}J2֖mR.àuÜ_ß#$|a1^{×é&Ù'°‘ΑÎ÷OGlM-l½î½¸ê ^ f(TXW+À–'â”XWcë½M0bÌ錱=ó$γx5“ã<ÆÑuæ«çÏ/Šmó·C|;K>åؾˆÃ¢Ð·oåDVÏd:’`Ïu™k ê|¼zÓ{yÕûÜ#0 l‘jÜCãÖ(é½ÿˆ­1üÿƂq¾µ¬Z%–K\cë]ï¯6“Ùw­&ÉñÖ$ ñ ¡ˆx¾žéJy5œºŸõ¾ÏaÖiXFåöC¸ Cw™g_gY,ÃÔ4WÃΧfüo«Ž.v¥Qý+›F•˜ã½½íߣT†ùðå—y.‹"ÊÒÛ& Æ-ÛÏ:Fâ»öE&'j +0¦£È!BÙ6ª( ÓN[¬a«ÃÐø™Sux±öUËG®ð­>!(àBǼbEÅh0xEÈH. Ø`ÝògÝbFŒ¨[7x±¤aˆq$^·û吡 +¶E‘©Õ×Á+Ã\!\Õ·ïSÄÔ´(òýzVå"O íHð­Æ #/ðjOe¾0ß±H]äRR7Š&NŸQ×Ó±ºa\ñJÿn»à¹³¨8ì¡ÐæÒ¬Ôd2/W¯·}†‚uw©8¸Çmú¸ÎéXš™L€»ÜÎóHÆÙÒL,mqÄ0=43%]u s©²VY]΢‘Ê™YÅÆ>cQÐ>Ð6 d »ŒÂBjÁ*gæ&JՁúçM/ê'FÛFY2_”rŒZù²áÍçú”"á¸ä»â8 b‚Ö &¨„_Z5H¸§)ówÔ Ãº¡ì‹y§eH êðÍ Âl‘t„A‘îµLe–Yޜ¾z8=—zù[Ø¡^Þõr×êÅ÷«—ÜE¾¼=òÅ+ù‚5θٯ`ì. +æu(o(Xx9Bv«ew1ì¨ëT1Nª$DîÀÊ,ۄ¬B§ºÑ—yAZU·Ë™ÔýZæBx€(á‡ÂÈT”u#m,ÔSF@#ã,4®î£ª’x§ÉêSi÷C”vRYŸêÂï¦.}TrJd÷$9íL²Ë,^ /²tøVÆЭ¡ƒ{»å¦õp•³¶üìV_pX”yݖ¶*DwÍíºt¯r›ì&÷.I4zÌæÙ,‹ÇQ:Õ?®e¹”2môªXª4hã< \D½ƒuÄUÖ¬\»UÑP`Õi泇`£Pµ¸àJãÌóã˜ÅC.ñÏÄ,Ðð¯Ë¬ÎEãG#ÖT•Á* ·LPšÜ•]¯GÓvjyÁ©Ü‚µ—~Oª5…’ÀÔRC®oY´¶‚ÑpáQX²ýs V€0a†TÞq;‹*l‡vfz%¨qqSïd]Pè`ücÕw¿õ*6S¤\ Ÿ¬A˜•åüù`°\.Ѩ@‹4šç(*óy<؉|#P„¸ÈÛ ¤J +-Y.Í+A(¥8”™}¨+> endobj +1679 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [189.286 709.025 228.916 719.928] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_a8a9da2a38c61eb14ed1922e970552ba) >> +>> endobj +1680 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [234.591 709.025 311.841 719.928] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1681 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [338.658 709.025 384.675 719.928] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1682 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [415.369 709.025 461.385 719.928] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1705 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [187.81 651.384 229.095 662.287] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_e4e82dc62f09b889cc2c699b6a8abda1) >> +>> endobj +1706 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [234.031 651.384 311.281 662.287] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1707 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [336.439 651.384 382.456 662.287] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1708 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [414.259 651.384 460.276 662.287] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1709 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.037 639.428 308.86 650.332] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator) >> +>> endobj +1710 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [189.286 593.743 228.916 604.646] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_f212c66bfb25b5b1949ee91f0e4b48ab) >> +>> endobj +1711 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [234.591 593.743 311.841 604.646] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1712 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [338.658 593.743 384.675 604.646] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1713 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [415.369 593.743 461.385 604.646] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1714 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [265.383 581.787 307.206 592.691] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator) >> +>> endobj +1715 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.535 536.102 232.132 547.005] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Con__Relation) >> +>> endobj +1716 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [232.63 536.102 287.753 547.005] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_3dec267cc9fa523feea43a8c0acdbe00) >> +>> endobj +1717 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [291.569 536.102 335.075 547.005] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint) >> +>> endobj +1718 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.535 501.375 232.122 512.279] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Gen__Relation) >> +>> endobj +1719 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [232.621 501.375 287.743 512.279] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_0debe61d4b261fe21a4109f8920557e0) >> +>> endobj +1720 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [291.559 501.375 333.381 512.279] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator) >> +>> endobj +1721 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.535 466.648 232.132 477.552] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Poly__Con__Relation) >> +>> endobj +1722 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [232.63 466.648 287.753 477.552] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_7817a26193f804a89ffeb2dbf18fc702) >> +>> endobj +1723 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [291.569 466.648 341.7 477.552] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Congruence) >> +>> endobj +1724 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.568 431.921 220.765 442.825] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_bc5704127ba61d2413c9bff4fd30f323) >> +>> endobj +1725 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [224.581 431.921 272.511 442.825] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron) >> +>> endobj +1726 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.568 397.194 253.422 408.098] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_269b05089d9f1a4c329d5f5f1fe87dec) >> +>> endobj +1727 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.238 397.194 305.168 408.098] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron) >> +>> endobj +1728 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.568 362.467 253.432 373.371] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_c302814cfa610b65b7e92426d20b7efd) >> +>> endobj +1729 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.248 362.467 305.178 373.371] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron) >> +>> endobj +1730 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.568 327.74 213.014 338.644] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_4ee0954f71183611c9b29ad07ad9fba2) >> +>> endobj +1731 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.83 327.74 264.76 338.644] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron) >> +>> endobj +1732 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [159.127 291.163 186.574 302.067] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_b8b346098cc00bd96852efadc70e42d3) >> +>> endobj +1733 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [164.546 254.959 205.831 265.49] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_45dd7fcc9b518abdc94c454b66ba1d5b) >> +>> endobj +1734 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.739 219.859 282.603 230.763] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_3eced5e4c9a959bf44ba28393466ed15) >> +>> endobj +1735 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.739 183.282 268.376 194.186] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_101725c81694df74ced9b4f2cca1fbad) >> +>> endobj +1736 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.384 146.705 212.486 157.609] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_4b3c940e8c7c8981b9b2124a75e011c1) >> +>> endobj +1737 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.384 110.128 226.314 121.031] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_5d5942488536d6a9095fc4bdebb9f7ed) >> +>> endobj +1739 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1743 0 obj << +/D [1741 0 R /XYZ 90 757.935 null] +>> endobj +1744 0 obj << +/D [1741 0 R /XYZ 90 344.77 null] +>> endobj +1745 0 obj << +/D [1741 0 R /XYZ 90 308.193 null] +>> endobj +1746 0 obj << +/D [1741 0 R /XYZ 90 236.889 null] +>> endobj +1747 0 obj << +/D [1741 0 R /XYZ 90 200.311 null] +>> endobj +1748 0 obj << +/D [1741 0 R /XYZ 90 163.734 null] +>> endobj +1740 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F11 291 0 R /F70 298 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1803 0 obj << +/Length 1933 +/Filter /FlateDecode +>> +stream +xÚíZKsÛ8¾ëWð¶RÕƃÈÜf3ÉÔdfj³‰g.ɔŠ– ™5âcIʎö×oƒ’!É´#GUكK4‰G£ûëÝ `oåaïçÑ?¯GWoóB +*¼ë¥bO +‚8%ÞõÂû4&16™Œñ8Š$šåÙz{«E4[Ç7ETl_½z?¡xl_OH0ÎÒɔr<~½ŽÊÒ<~PKUSé\Áx¾Ïü±`“¿®ßÞ\þ3" öH-—H2î͓ѧ¿°·€÷ï<# ¼ûºUâù”ÁïÚû8ú÷ÛÅàþ¢8î-Š‰ô”!,¸YÙgJy=}ÓÏû4å°Ê4ªâ åã» áce¤¿É²µŠRÛ\‹Y¬¬¼ꎺѿ~ÝN¿ýŒ9†?²ó­ù½z+±€œÂ×rRŠ„O¼)a(ô¥óõ­škõþm/Ío´^›‡êÖ +§ï¢"ŽÒʶŽŠ “Í*JXYùcªÈ)ÎCñv°1eáäcq«Åy4·Ãÿ'*-ãÆøKmv+NWæýï*¹wõóÛM:¯ GÙ,%ªl£hk²E¼Üî­Ô·þrö­ÏÏ½)%($ÁpÛßՓŋãƏ‹ÙRQœV‡€ppŒñë£}çƒDQÈ­ ÿ¸X4h0?ó,·͖Í=»^t#˜ž÷Æ Z€ëç¦ÅÎÌÚÃÚU¶g±r[V*96iÙ~|8;Áð̃vôÛ¸tH@wdÔ꾏«Ûlc!•ÄiœÄÿmqØÊf\¤Ü¬+­å㞱-è/ôé ¡kUljú| +ºŽô¯Î¯ÞôûÐ +㢅ÖÊaYð`ŒûàrŒ‚(9 Ø×HØ4ú¡åSà’d€HóȒލ5«ÒfýÍ«õ¶²ÜbM¥•ZØÛå5»ëÄç@kÃÀHBŒ|_¼,ՕÏáºÙGà .P–O%Ý%‘µ^‰h@ /jPÂãÿðâ!Á×8uÂ6>xÓXÝ2Bâ]"„9ìd¢#ž$ä!"”ˆ<†ýCD#"œ±åÂN<ÙãBøþ: „Žâeé°|Càªü +¼(Œk‹–…åEÑlA¢O¶‹~”£ ìñ’ò%=Á• ËÁ\)˜‰=E{]€aDaQì3¢8ĈÂ2b­6 t*9"A”žC“±Î‹ÑBéH;U3í{—þQª¯R ÝŽ£2ÀŸÏÒê÷J)üGÁE†pƒÁ‘.@÷‡…p‚@'²á·¢‚Ë †6ur¦pB§A‡NOƈ?h7¸]@ÌiA"_š).-ºyJzÁÁA„PI.OF7,¸<ˆ€XÁù«àbª(U]1›Ee¯Òáàxo#§ÌÙwû¬ˆ·©©å¹"OzƒÊ8½êfe*‰VGÊEB ›&J.Hr$ºx{ë…;ÌLÈwý°®dW`5“föÅj5å€ÒM!ÁV­NUl–ä¹Ñ¸ÉsUÌn²MºøîÀX¯½9£Äˆ2ö À8lÃˆÑ³Cf $t\ª¢Þœ. 5ô¼¨©Ûð½`‡„­¹t>;ÝUËÀÑnr'ÜtT~×ÔGqˆdÈϯUq¢fjååwd§y»$1É7ÕÎ ËCàC²ˆýnbPãÔ¨Ñ1¿Ï—mÛUÝ+•º#Ô¹^¦®Õ1’­•ÄI´zB-õÏ àh¬/ÊܬÝïô¡øxüÃqq~‹S³7_4˜ËØí Æýónj÷:Síç±r×ü*Í :Šª¬ø*)ÓÇ¡. ûöjrʗi]ö`´+ƒ¶ºÒ·¡™½5ä~ ‘”'¼=8}˜µ#!äk:ycÍ°~XڋHæ¿$Êóš•Øí®‡“}ïe…6î’U¸s ·;3è‚;º0'eÓƏ9h@î~Yšê.[iƊÍÕ®öZ#q»ì@iD~0©G†ˆÈ'†L$”(‚åpäÿÓÊZÙ¿£) ŠÁc¯h6W2¸lŒæž)ƒs„]wWûtVX$¶ªÜ>ößß̍SóÏ»H×èÔ~ŽRH,Wv¨_ô&·Ô»\{Eñˆ7þ¡w¶²¹f˜nšÀRÛÖ@§èü +#ð;j.BÔ)îGÕXÖ(ão¯yúuT;I·D}7,èÜí¶ªòWWW÷÷÷h^¢M犫«<__=¼½ØB`#—]az™ÙºS’ÊR„$u1•ÐÉR{œB䎢оÿ®°² +endstream +endobj +1802 0 obj << +/Type /Page +/Contents 1803 0 R +/Resources 1801 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1631 0 R +/Annots [ 1738 0 R 1760 0 R 1761 0 R 1762 0 R 1763 0 R 1764 0 R 1765 0 R 1766 0 R 1767 0 R 1768 0 R 1769 0 R 1770 0 R 1771 0 R 1772 0 R 1773 0 R 1774 0 R 1775 0 R 1776 0 R 1777 0 R 1778 0 R 1779 0 R 1780 0 R 1781 0 R 1782 0 R 1783 0 R 1784 0 R 1785 0 R 1786 0 R 1787 0 R 1788 0 R 1789 0 R 1790 0 R 1791 0 R 1792 0 R 1793 0 R 1794 0 R 1800 0 R ] +>> endobj +1738 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.568 720.286 201.946 730.816] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_c5dfab82eea6ba1f83cbebca0237b084) >> +>> endobj +1760 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 646.871 232.192 657.401] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_af462d898fecd8d545ce48f6a0632c3e) >> +>> endobj +1761 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.008 646.871 279.514 657.401] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint) >> +>> endobj +1762 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 611.628 238.818 622.532] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_db6d91da0ca1b3f0f9b755297ab69722) >> +>> endobj +1763 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [242.633 611.628 292.765 622.532] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Congruence) >> +>> endobj +1764 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 576.759 236.068 587.663] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_f31626a3fd875ced253836666b29990b) >> +>> endobj +1765 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [239.883 576.759 317.71 587.663] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint__System) >> +>> endobj +1766 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 541.889 242.693 552.793] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_0db3ec1fb2ff3022b06cd0760dbc9b11) >> +>> endobj +1767 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [246.509 541.889 330.961 552.793] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Congruence__System) >> +>> endobj +1768 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 496.435 263.186 506.965] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_2a7c7870e8a2d07650293ccce8893174) >> +>> endobj +1769 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.001 496.435 310.507 506.965] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint) >> +>> endobj +1770 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 461.192 269.811 472.096] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_3e3093f0cebb7f7d4b1ac1f1dda4df5b) >> +>> endobj +1771 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [273.627 461.192 323.758 472.096] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Congruence) >> +>> endobj +1772 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 426.323 267.061 437.227] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_5b00da433f9d9473b1fbd2cdf6c5976e) >> +>> endobj +1773 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.877 426.323 348.704 437.227] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint__System) >> +>> endobj +1774 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 391.454 273.686 402.357] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_d453d2930f64cc40ad0b5dbe4ac50c07) >> +>> endobj +1775 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.502 391.454 361.955 402.357] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Congruence__System) >> +>> endobj +1776 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 356.584 249.905 367.488] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_ea3d6d51b260b5aa832a1a3a68ac98a0) >> +>> endobj +1777 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.721 356.584 301.651 367.488] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron) >> +>> endobj +1778 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 321.715 255.993 332.619] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_0f157e4c644b4ca57dc6d0ffe0509ae2) >> +>> endobj +1779 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [259.809 321.715 307.739 332.619] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron) >> +>> endobj +1780 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 286.846 243.549 297.75] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_be395df0f967ad2074e87c95cab973ee) >> +>> endobj +1781 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [247.365 286.846 295.295 297.75] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron) >> +>> endobj +1782 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 251.977 251.011 262.881] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_6e6eb647853269db9de88ed234a16656) >> +>> endobj +1783 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.827 251.977 302.757 262.881] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron) >> +>> endobj +1784 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 217.107 282.005 228.011] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_5b12ca4fb2557b59516d1bbb2e30fa43) >> +>> endobj +1785 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.568 180.246 311.394 191.149] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_0c39fad28012b1e32b3bb3f51aa395e9) >> +>> endobj +1786 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [315.21 180.246 363.14 191.149] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron) >> +>> endobj +1787 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 134.417 225.298 145.321] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_6e67cd103e4b330d46ded91f0ed0ec2b) >> +>> endobj +1788 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [229.114 134.417 264.301 145.321] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variable) >> +>> endobj +1789 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.856 134.417 359.105 145.321] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1790 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [381.74 134.417 427.757 145.321] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1791 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 88.589 238.02 99.493] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_a7225f4984a8ca7b4701b78e9aa545b3) >> +>> endobj +1792 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.836 88.589 277.024 99.493] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variable) >> +>> endobj +1793 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.578 88.589 371.827 99.493] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1794 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [394.462 88.589 440.479 99.493] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1800 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1804 0 obj << +/D [1802 0 R /XYZ 90 757.935 null] +>> endobj +1805 0 obj << +/D [1802 0 R /XYZ 90 733.028 null] +>> endobj +1806 0 obj << +/D [1802 0 R /XYZ 90 234.208 null] +>> endobj +1801 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1860 0 obj << +/Length 2730 +/Filter /FlateDecode +>> +stream +xÚÝ[[sã¶}÷¯à[¥™Œ;ÀNg’4i»If¶k·/» -Ò6[‰R)yUõ×÷^Š”ät7}±(ü|—s@OþtóíýÍí’! +%•Áýcâ@I‚%Á}|œŒ›ÎÆx²‰òU4߬—‡ç$Σù2}È£üðöíû)Åw{JôdMgTàÉwËh»-.?$‰ý_’-°Ç9ãɧ¿Ü¿»ùþþæ_7„b RL‹ÕÍÇ_pÃýwŒ#ÔÁÞ¶Zœ2ø\w7½Án2ÝO;9… ““ÜLŽpŒ(\*Ê–¢˜á7Ûmú”Á0#“Ýڌ|"ÁSÌ Ï6ß=§Û¢MË4åˆkY7JŠ6¢Õ=C¡·m=N©˜|˜fIÑù&OÒUô”x̋̇å£ëGÏ(!†œž5ʗ,†˜ó~vcx|É»ÔÐ|[E›M:%“ì©øþ9ÊÓèa™xº'L!&+ÛÐÒÓ? Áµ—֝ÎÁ%!Î%ðt0cÔ<¡H@Š°x.1éöïM>ej’@ôÊtÛn’EjžNââÆÃÁ3P >(G+71EP*‹}óH†U›8ÉÖ«4‹vëÜ=¢tÙÙ¤ïËZ›3u=Î(†Ž ‚B¢ +Ÿ(-+ÁǙ€ +…¤&«>O‰7ÍhˆáÚg»ö¦Æò'Wl쓦ÕÃÚdCþÙô ÂñäÍ©a…“ŸÒ,‰òù÷'i¹åÃ<16Á£gõ±OwυEWÅPº;¸¡C‹ +v:^ •!ðQeÆemñ@P©š7£Ã‘$fŠ9sè)w i3Á0â58ž +5)AœéÆ <ÁÆnØÓ-´§¼nUwۚҌ ‰4ìL#–牅FX“¡XèÓ± œ@®R +zU(*Sa÷40¥l$è%T ¢„;&Ðç1”z˜V^&0ÒdjôÀ1˜g®à7°| æcn<4Lάàh¢¿Ó‡'¸€ü·À „õpƒFó!Üfˆ3Öæ0èÔW—"÷S(zLÕY]9Š€¾Ú]XŠ0³òS„D"ÔÇt(L¢ ò: ¡‡‚k$€Ü®#gŠ!*Ø(~€25‚B¤ê^OÜöÚôp%S;H¡§Ë×`„Cúµ³åbÌ:óÉS’%y´Lÿ3n­ÀÅUk…bXcÖ +\N>¸RžßVëå±1[íÛÃjÀÎ Q.H¿ršë[PÃr(I›À`úá–u Q’1}t ¶‘¿˜|ö"¿F +WÓi¤jñpýýú·ÑN‚Àæ×ÀkÁ¤m¸CS¢ÈäÖTiG<ä$k˜µ(bÁa1¿Š6*[Q©ÎÄ+Çoܞ‚…DÈÛ{6û礦Ç9|My½=ÒpL«G;Z%Rê6‹|åBÒųØ*pÀ^'ÙbŸÜ"”ÁTËØ*<£€Uᅛ9à-ԅž²1Zõ‚ts‡±¥š)¿JÃ#£áÉ N›± â´±spÿÚ0›v0[PÙ³m@dPµô¢-Ì6ýª]ÀܼР’‚S}VWv›¾ZØmº0ØmgåÅn¥ªU{ »ÍCmì6æN`7õ‹Åka·ÙX×#±Ô*F +”î XO«b“kl ¿‚ØäJ ðÌebóM'qZ#†ÕׁÓlN_ºéëՐ° 7ÝÙ(1ÍÎÓlHL‰åóöÞ1=(¤Ù! v®èüyû*@ +±ìÝþ0%:(L5mñ »ânõ‰_¡é˜>xGý‚Ŷú-¦Q|ö©_"…_ýl«_cÿ„úÍiCÊøÐ0„ŒP¾æ­`/zvw Yµ +ȟ}¾‚³zÅbA+-.†1kƀ찑fMÕúeÁëB‘I€JI^g‹L:8ñNJß[A©þ„µ ð¸výÜYøkN¡›’Fì\¸?7ºä·{³HŠ6¯^ë×ðàÝ>Úø˜€ +gåY¹Ó„'å™þ)¯“fGz|îÍ©=Ô¥„±üŸÔƒ‚Ê«xg¹ä{p)PÑê,Í :@–ý9‚LxÎ¥ Xۅô×æ (ŽäÛÜ37%÷¥ér]ÂÞêš5È7qìÍ;ŒˆªDϪ'U 2ëâ}ybߪœV8´˜  S3µîZv½Œ½™kï¥Y§u«ÏÏ ˜)ú7!?+Ú#ÎÔ ö&_ÿÃHÉÿ§p[ۍ˜ù[åD¼NÜsÙz×HÿÝ+åA÷‡I°K걿K²ïé q$¬¯‹W sVƒ¾¹/ÇõÞtm~\徖¿°*¾þTü̪øò.šÒrGÁý;ʞ^Ìv«ýf¤^þhi«tõ߶Iþ»©“mIÕÙKäv}L¾™™×ô ÁW€ Eò»¤äâÂÿ Ê«olzÔS¤æ´^}Îÿy·Û¼½½Ýï÷h±E/YºÉQº»Ýl–·Çì^[!„#U+ÜÇ2N«u^þ0HÁ‚É`¦êc2i Wv‘wÇÿ”…`’ +endstream +endobj +1859 0 obj << +/Type /Page +/Contents 1860 0 R +/Resources 1858 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1631 0 R +/Annots [ 1795 0 R 1796 0 R 1797 0 R 1798 0 R 1799 0 R 1822 0 R 1823 0 R 1824 0 R 1825 0 R 1863 0 R 1826 0 R 1827 0 R 1828 0 R 1829 0 R 1830 0 R 1831 0 R 1832 0 R 1833 0 R 1834 0 R 1835 0 R 1865 0 R 1836 0 R 1837 0 R 1838 0 R 1839 0 R 1840 0 R 1866 0 R 1841 0 R 1842 0 R 1843 0 R 1844 0 R 1845 0 R 1846 0 R 1847 0 R 1848 0 R 1849 0 R 1850 0 R 1851 0 R 1852 0 R 1853 0 R 1854 0 R 1857 0 R ] +>> endobj +1795 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.335 687.036 265.386 697.939] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_2c5d0c7fb2c1bbaa9359ed0b497152cf) >> +>> endobj +1796 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [269.599 687.036 304.787 697.939] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variable) >> +>> endobj +1797 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [323.235 687.036 400.485 697.939] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1798 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [436.747 687.036 513.996 697.939] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1799 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.176 675.08 208.193 685.984] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1822 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.864 628.049 285.637 638.953] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_52cb475c174028850d7ddd0998e089bf) >> +>> endobj +1823 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [293.615 628.049 328.802 638.953] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variable) >> +>> endobj +1824 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.721 628.049 432.971 638.953] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1825 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.703 628.049 513.996 638.953] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1863 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 616.094 171.361 626.998] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1826 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.94 616.094 254.957 626.998] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1827 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.436 569.063 276.092 579.967] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_ac326b042c380a004289377eca7d2342) >> +>> endobj +1828 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.856 569.063 315.043 579.967] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variable) >> +>> endobj +1829 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.503 569.063 404.243 579.967] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gccd1fa9f287c6fe48bd8dfd920a5397b) >> +>> endobj +1830 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [436.747 569.063 513.996 579.967] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1831 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.232 557.108 193.249 568.012] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1832 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.977 511.28 296.356 522.184] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_79d4ff349ca7b314602b79a2d74fe976) >> +>> endobj +1833 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [303.89 511.28 339.078 522.184] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variable) >> +>> endobj +1834 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [364.999 511.28 436.739 522.184] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gccd1fa9f287c6fe48bd8dfd920a5397b) >> +>> endobj +1835 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.703 511.28 513.996 522.184] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1865 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 499.325 171.361 510.229] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1836 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.996 499.325 240.013 510.229] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Coefficient) >> +>> endobj +1837 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.237 453.497 275.893 464.401] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_94e51c5141f6c2a46e4c8d8aaea539b4) >> +>> endobj +1838 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.557 453.497 356.806 464.401] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1839 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.639 453.497 445.379 464.401] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gccd1fa9f287c6fe48bd8dfd920a5397b) >> +>> endobj +1840 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.703 453.497 513.996 464.401] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1866 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 441.541 171.361 452.445] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1841 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.922 395.713 296.3 406.617] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_9a21e654ffec08b0a79e6aa5ec29d72d) >> +>> endobj +1842 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [303.807 395.713 381.056 406.617] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1843 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [406.466 395.713 478.206 406.617] +/Subtype /Link +/A << /S /GoTo /D (group__PPL__Java__interface_gccd1fa9f287c6fe48bd8dfd920a5397b) >> +>> endobj +1844 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.095 383.758 202.344 394.662] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Linear__Expression) >> +>> endobj +1845 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 337.93 293.621 348.834] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_5e9ac1ca10b983f0dee8146e6e95370b) >> +>> endobj +1846 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [297.437 337.93 332.624 348.834] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variable) >> +>> endobj +1847 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 292.102 297.497 303.006] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_f3ff44da0089b15593e3ce719e37e677) >> +>> endobj +1848 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [301.312 292.102 358.089 303.006] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variables__Set) >> +>> endobj +1849 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 246.274 240.501 257.178] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_faf7844389329a23b58abf355ae79ded) >> +>> endobj +1850 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [244.317 246.274 292.247 257.178] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron) >> +>> endobj +1851 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 172.859 193.906 183.762] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_5f7cb393111807edd0542e1e4367f249) >> +>> endobj +1852 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.722 172.859 245.652 183.762] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron) >> +>> endobj +1853 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 137.989 316.306 148.893] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_250dcd46824fa3fcc48f2dd92a8293ea) >> +>> endobj +1854 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 103.12 317.412 114.024] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_40f85671a746d80dd6a5a14292f6df72) >> +>> endobj +1857 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1861 0 obj << +/D [1859 0 R /XYZ 90 757.935 null] +>> endobj +1858 0 obj << +/Font << /F63 247 0 R /F70 298 0 R /F65 249 0 R /F50 215 0 R /F34 1862 0 R /F84 1406 0 R /F82 939 0 R /F38 218 0 R /F83 1864 0 R /F11 291 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1914 0 obj << +/Length 2065 +/Filter /FlateDecode +>> +stream +xÚÕZYsÛF~ç¯À[Àªp4‡kk«lÕʎ“M9–²k§X0¤PÁ—ùõé9pQ LJ¦WyÂ5G_÷|=l­-l½½¹™]\¹Ì +PàR׺YY¶<— N‰u[Ÿl‚cóÁÛeXeá²,Òݝˆ«p™&·UXí^½ú0§Ø6¯çÄ·‹|¾ ۗiX×úö£X õM䑀ñ‡9¶Ëç¿Ý¼Ÿýëfönj€@Ø"Jî!q+ÊfŸ~ÃV ïß[ Gà[[Õ*³ÊàšZ׳_fØ(s誔äx $!raPD°«5ýL©§íg}ZpÐ:›dN¹}?'ÜZ›{¥p›öRîjmø¨zÊVQ‘Ga#`±C$ë||Ùê3æøà8öcÖb²ï:“чözqåaˍ]GjL)rb-@á€×¾V"ÿ4…ÀÀ½˜|†S͛»¤ÖmÆ#3€é ݆Û†8Ï´é͒h­öFäa§±XM J¼“ óxb‘tmvSÂ Ö þ½1Uøûœ`²~LÌU‰¡îŠjÎ<;–x'ÄF“þéý4Bæ‚bqW‚⟠™•È +ÙI÷\Öe‰eœd"¯Á'õé0ýR5¬’ð6õòZ4Sc4ÅòV,ǓÇρðG5h-ŒéÃ4m½a R—"J>cLE¬_ ÔTÏ«jîp»Èöú݋¨Gš1À>RÚ}i$þ¦¾¼KÖw¢:Ú¥i‘¯õl¹óoû>_Í1,ð´]卖Oß]!Ÿ!ÖǍ['È{í}[´íÂf¯‡ +=QoÒ&‘ŠíuÜ&,pí»ð^ì 1‘0h…A«@k•‹y&’… ÎïÓÅi` (â^pn°(ÿ¯„l¸gÆüT÷{)cá…ÛÔÙ£-{º¨¶Ë¥ö2,"õ„Óh€|ì´^È&ü$WÒ/GeÒ¦ À½ì¡°3Ês³¸Wke‘ÇI«×ä:J<Š<މt6y(qaÁÓÀC_¡T£Ç;zVEãÅBN)âï—ëX$>sWÎ`™HãúˆÔ5˜€StŽª9•R\ä]ã$ŸÆ@'8'¼AÄ¥çNNYX~t}ó†U“„éòj“ǴäV®àã3׸°ÜGÃ>d”‡¼B—(2´q˜Jô§ FMe]ætî,µ¾†Ð ”Þg³a(¬ŽAo‰Q¸`˜ ÇŠ +ÕwLñôڐ«wE¤oZË·$K"¢U[úï²£ÊêúóϗÊêaXN†½rU毦¾‘–%AÐé-§¦IÝHÎ'?IÆ!sµþr+Òb;÷µ*ផÍeÎ-Fº©tŸ|¯Ý'kà¶Ì•œ1×ã" “¼–£å‰ ý6/3¹¢²s¨_Œ—Uƒ’J-ˆ/`ÿ&֍‰ŗ^qy“¯URd¢©ÚW±¨£*)•ÆÞݯ€rÀ…ÞÐÓêßG#ø­ÈE¾—×;°~¶°½Öm¯ƒÑ~r˜2€‡×†i³©òY[Ë7ŠQmÐ\ÖmAd”ÂsýDΉ‚8ÿoËfIždɟ"^žÉÆþ×±±¡‡Û¤¹3ňÉ}:NâMðŽpz•ýt/°ž…ñÀî§/doëº~—y·,&lÉl¹û’Ÿ&va`h·Û†Y Ú´g:OÆG×fŠNyÈóœ“6ƒ¤Ý%֊Á”‰“~émEìËIiïAÆä¸üܤ|„²ú0›Ê,-Úê¯7FÜàbàƨv;¼Ñ‡›ƒþ‡oÓtšxˆádë)ïƒ0>c#çìp8è19à˜ºË¾ŒC°iÂÈ#E|}Ôÿìì]2£åÝ&M_Ì^÷€\‡YK´M2ٔ¥¨–·,-Fà—¸„(£Æ‰¢Ï+QI®ø¢Ìë2¯”™øRf…Ü^î—hå7ï>þ³å62±w. Ï]Þn„½Ù-ՉXKþ/®è-C6è3Ö?º +pÀà1¢Ýª÷CÞ¨½µ¨&FcqÞU}ÿ<0X¿9ДÇbaÁ µ2cœïÏt°´·"‰CTd妭àËæÀGØé&Ön_´nŸâ/Pêvû¹·¢Ù +1µ1<ÇùæçQ§…)©ãœ›Ž¼ó‚—H®q »}[¹_:ÔãüÛÝ¡Sÿ²0’Ü6 Pœ_Ê5òG¨ãÒÄþ?L.äG€û‘¿0µ¿(¹(ð 1éÿ°x nrë½quº‘™›Ý6¹züIÿ‘¥އ2Óè£/ó9Ìכpm†’!S­$D»Sˆ_kQ}7ç¼Ýqùw˜oÚc™Vt«úSPŒdàèšR#¶¯E»‘©ñ»ÕÞý8S.èU¤ÜE~ÿÏ]Ӕ¯..¶Û-Šj´É“²BIsQ–éÅÝì~éHtž\µ' +YQ ,΀£zЉ´›ëÐ0S11ö+øñ/!U™Ë +endstream +endobj +1913 0 obj << +/Type /Page +/Contents 1914 0 R +/Resources 1912 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1920 0 R +/Annots [ 1855 0 R 1856 0 R 1879 0 R 1880 0 R 1881 0 R 1882 0 R 1883 0 R 1884 0 R 1885 0 R 1886 0 R 1887 0 R 1888 0 R 1889 0 R 1890 0 R 1891 0 R 1892 0 R 1893 0 R 1894 0 R 1895 0 R 1896 0 R 1897 0 R 1898 0 R 1899 0 R 1900 0 R 1901 0 R 1902 0 R 1903 0 R 1904 0 R 1905 0 R 1906 0 R 1907 0 R 1911 0 R ] +>> endobj +1855 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 708.953 250.443 719.857] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_b492b453a39228bad565e4964c7ad257) >> +>> endobj +1856 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.259 708.953 302.189 719.857] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron) >> +>> endobj +1879 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 674.084 280.59 684.988] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_88d0ec91f9e05922238463630dccc296) >> +>> endobj +1880 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [284.406 674.084 341.182 684.988] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variables__Set) >> +>> endobj +1881 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 639.215 311.026 650.119] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_95849529fc06d893870e1b39fe009db8) >> +>> endobj +1882 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 593.387 275.759 604.291] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_178d863fdd91da50df37aac742b5f89b) >> +>> endobj +1883 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.574 593.387 314.762 604.291] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variable) >> +>> endobj +1884 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 558.517 267.061 569.421] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_e44edf9029d653931c7a450481127e14) >> +>> endobj +1885 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.877 558.517 327.653 569.421] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variables__Set) >> +>> endobj +1886 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [385.705 558.517 420.892 569.421] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variable) >> +>> endobj +1887 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 523.648 268.167 534.552] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_beedcb4af89476e04d9b358ae522dab0) >> +>> endobj +1888 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [271.983 523.648 340.246 534.552] +/Subtype /Link +/A << /S /GoTo /D (interfaceparma__polyhedra__library_1_1Partial__Function) >> +>> endobj +1889 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.535 424.33 227.679 435.234] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator__System) >> +>> endobj +1890 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [228.177 424.33 271.664 435.234] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_f15807720fca193200fa6ea8627ef10b) >> +>> endobj +1891 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.535 387.468 227.679 398.372] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator__System) >> +>> endobj +1892 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [228.177 387.468 319.264 398.372] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_dd26476af2dfda6abbb7508ef88cae2d) >> +>> endobj +1893 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 350.607 230.519 361.511] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_0c70e4b9986758a2c5cfabd0968c80a2) >> +>> endobj +1894 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [234.334 350.607 276.157 361.511] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator) >> +>> endobj +1895 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 315.737 234.394 326.641] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_d8155c4d2baca71b59e67eb7396bb18c) >> +>> endobj +1896 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [238.21 315.737 314.353 326.641] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Generator__System) >> +>> endobj +1897 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 280.868 241.617 291.772] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_2d8112f8870851653e56b12e910f7e45) >> +>> endobj +1898 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [245.432 280.868 293.362 291.772] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron) >> +>> endobj +1899 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 244.006 266.244 254.91] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_6661b721ae109cee00992746554acf53) >> +>> endobj +1900 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.06 244.006 317.99 254.91] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron) >> +>> endobj +1901 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 207.145 282.015 218.049] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_894ed94e4bfdc07cd6ef5d45e5c464b7) >> +>> endobj +1902 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [285.831 207.145 333.761 218.049] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron) >> +>> endobj +1903 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.54 172.275 262.638 183.179] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_a9a506db5b2ca3606ffdc72bae993831) >> +>> endobj +1904 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.454 172.275 314.384 183.179] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron) >> +>> endobj +1905 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [173.765 137.406 332.797 148.31] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_5c870a4502b7d88bf273472936bf4fb8) >> +>> endobj +1906 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [337.725 137.406 385.655 148.31] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron) >> +>> endobj +1907 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [397.971 137.406 475.798 148.31] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint__System) >> +>> endobj +1911 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1915 0 obj << +/D [1913 0 R /XYZ 90 757.935 null] +>> endobj +1916 0 obj << +/D [1913 0 R /XYZ 90 439.394 null] +>> endobj +1917 0 obj << +/D [1913 0 R /XYZ 90 404.569 null] +>> endobj +1918 0 obj << +/D [1913 0 R /XYZ 90 297.969 null] +>> endobj +1919 0 obj << +/D [1913 0 R /XYZ 90 261.107 null] +>> endobj +1912 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F65 249 0 R /F11 291 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1946 0 obj << +/Length 2220 +/Filter /FlateDecode +>> +stream +xÚíZ[oÛÈ~ׯà[) ύCÒ( +l¼IwÓd‘MÜ>4Y5’ˆò¢%);ú÷=sáU”l§Ù P¿XCjæÜçûΌ…­ƒ¿Ï^Þή^ æ„(T8·'Ď/ò(qn×Î'—`ÄØ|A0Æî>*³h¹/ÒãN®Ëh™&«2*××ïç»öõœn‘ÏÔÃîMU•~©¿“y,A猻B̹}3{u;ûuFÀ ìm€ç#ŸyNœÍ>ý‚5¼ã€aàÜëY™Ã)ƒÏÔù8ûy†­3¸ï”‡{Nâ#+|Êžñì3¥žV߬s>-<ð2êdN=÷nN<L”ÀX9˜¬í|eg¹µÐ+Õ¬4ɒZ®—?øáRªÕ_ê2‚pÀ"_B(’m>Ö¨Ö}Æ>+Ù}o[L®=΅ç¾8o—O¸{SäU='n%y½üx¬j™MɊ«s½àåq¹Pœq8 BPèÙ°éDê$„«×„ôâÌ!I~"õÌ¿šÃL`Dy3áǼÖaÚBeœ +cy ÔÎýÛa,lfÔ{ˆ#øÕ|^½ö1ø +ÁÕº…ïë… BÁnÉöåœ{n1'ؽ“ºlC·ÞI3(çÌweuHkó\lº e†!î7†A9,̓|kæ¬ñ8"”6“ã"Ûj]1FÁêh>£´*ÌHæ›B›+ÖŠ¢²†Æ*Ù¥ +«Ê¶u#ɍb¨ýN1 @³­æjÂ8&`mˆw‘u?2ñÐE²`œ£€ˆ'†: ÍÜ +|¨>cLåÚ €qƒ#©ØØ®¥XÅuÂRŒaÿv™Þ%S¶R€-ÒNB“•ÐUÄ ’!?€’!”§! ð#‚Ä]‡| ñò‡ÿÆìÑ ¡|-H¨µ —B Ò¡f?#„FFl3Ú à¬ x¥AÂΙ Ým|S—€Â'ˆ2  Dï/P¥`‚Æ +xc…6Æ` O±^žÁ +Š8 .cEã¬0ðà°·¼!<4² ¡7 +x¡}Oƒ00Q†A‹0žÆ +àzFē°ŠšaáîÓCuNïi¨ŒÃYìÌh øEDKà©°³X?¿€Æm„¿Lˆ  ÜI'„ò !c¶Þ—Se„°×zåë){¡÷sýÎÜó lhý1¥–ªQÄï“z7!JöFK¦œ°T ÐoKŽÚ þ f>nùëç »^4Ìdx÷ʾ)¥1¯¿ß€Ò(L¬ý*Jóøc(ÍcaKiOiz•ô¯å3¥ó!>„µ|`x–Ò”šÒ¡Ï”öÜô~㦗±)§æ…mX‡¦O8µ4 ‘´^¬¥1ÐaµÒNëã3Û¦ôf£1 +c*žÆ §bàpßE÷ …ȧÁ%È{€Ã<ä1ñ4ʅÖÖSF1Ía ”Â}†Ã`nò‘ Oç.þw±ÎS—¾êø°.Bƒ3ZÀ¿¡n¤€È¨îžœÂb¿w/…ˆ½™ú^ÖQ’6^|/«¸LöNNƒDŽ˜EöÛÆÁ7‘¢»;E‚‘ FTÙïâîK¡(þº±ÑÊ­âŸ~ºÑplvÍ¢šQ16‘´÷gÚ{eŽ¾â}{pØh‡‘Ñ~þð†ƒKÇ?°/ ¥ÿà¸2"ׄ–píãˆÊŠª6¯4,à†`I€Üµ]˜i¸†5uѳT^´5to–ç¬ÅCÒÕae˜«°öÖ ù‚ûëxTmŠ›a ®êÕ¡vÕ¯ª]qH­u2Âî½ú+óý*ÈU‡¶V˜¬eÙëˆÖf¶uP›@ÜwE)MdõœR¥[5¶ÄwoÌü¾ m¶{.¶µ 0‡ºq”›A^Ôf°’æsSJ¨!7=šG؋²ŒwQ¾•ëkÕsƒs•ùªÚË8i÷´žk>MaEæQ~ˆR…c!nì½®Õ|Èã¦N౔¿’RN9 +’²E¸ÛC&[ÐÐ5¢v•lžÁùb›Ä€5ÇfÇd{¨ÉU*‘6Ü· У4ÔÀ;™­¤UþÚZlÁ ˆµQ ð¡ Kt+LôÆÅ P®Š"•‘•ø„kðë븹V©:Øø×<„Ž L"ðÔÂþ ô)ÐLKKwQ9 èQ ƒ½™&p|`@°ç†óAև2¯Z ïi†®áåAN¥qÜjN6# ,ò&ÉfB4~´£åÖ·¡`°Žf“ªÅSÉæ{ý]·V@wN°ÐPCaw“2d¡ö¡Ð7s¡ˆÂW_b©ù¥º>s&ƒß(ÇDq»ÊKØíŸ _Di²^~WšÍ³l5¡ÊáÙrÒ¶#¸Ýð„Ýç¤Êºsù…„°qB H©ÜÛnbÅv¿¬0¾j÷`1¥˜3 Ãiª™'ˆ(ˆÂ@ 75=³©=.ºM­ž´©õ™·Zn̋l­Š±pµÏßB­F¥=UŽÀò՗½ùwXUµmÊ Bxyi£#Õô ô!jó‹?-t¾]RQ5H¬¯l3V™Õ¼êñx ˜#LŸ\sçÑA„ˆóàÿ•©ö86 ¼@ï?ø¡ rŒ&‹$¿Ü#Àt„/¦Á€Öú¿ÁJ¦…é3µàg ø]@G_Uõ ¨ÿ QÎÜúŒ +´¾ŽI"„EðØ’4?Ñ×*ý5Œ™ƒ. Þë4 ûØ;ÆÁãÛöü4y¯ðŽm‡hkE©ûàr£Ï¤M÷ôO8½þeîy®-õwú˜Öìq³ë¯0R·Âj×#uüÄîG)m\L0þã4£ÌtJ:b¤ÍÉ®®÷×WW÷÷÷(®Ð!Oö%Jê«ý>½mA  ê‘ß]ì´·$YQ6÷¥>Ñr fßþ7"Q—º™>™äñ¿¸+` +endstream +endobj +1945 0 obj << +/Type /Page +/Contents 1946 0 R +/Resources 1944 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1920 0 R +/Annots [ 1908 0 R 1909 0 R 1910 0 R 1932 0 R 1933 0 R 1934 0 R 1935 0 R 1936 0 R 1937 0 R 1938 0 R 1939 0 R 1940 0 R 1941 0 R 1942 0 R 1943 0 R ] +>> endobj +1908 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.932 719.912 318.587 730.816] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_0d6e2bbaaefe11efb5429fe1a61e3d22) >> +>> endobj +1909 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [326.098 719.912 374.028 730.816] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron) >> +>> endobj +1910 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [392.157 719.912 469.985 730.816] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint__System) >> +>> endobj +1932 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.144 663.543 337.254 674.447] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_27c32393002b42d894f964a5d60af964) >> +>> endobj +1933 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [341.371 663.543 389.301 674.447] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron) >> +>> endobj +1934 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [399.794 663.543 477.621 674.447] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint__System) >> +>> endobj +1935 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.311 596.215 323.044 607.119] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron_d078549415d6b45298d374eb3b6f5c7d) >> +>> endobj +1936 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [329.745 596.215 377.675 607.119] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron) >> +>> endobj +1937 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.981 596.215 471.808 607.119] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Constraint__System) >> +>> endobj +1938 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.806 465.607 195.736 476.511] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Polyhedron) >> +>> endobj +1939 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [454.44 465.607 513.996 476.511] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron) >> +>> endobj +1940 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 314.265 230.651 325.134] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +1941 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 204.631 230.651 215.5] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +1942 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 94.997 230.651 105.866] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +1943 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1947 0 obj << +/D [1945 0 R /XYZ 90 757.935 null] +>> endobj +1949 0 obj << +/D [1945 0 R /XYZ 90 528.358 null] +>> endobj +1950 0 obj << +/D [1945 0 R /XYZ 90 416.804 null] +>> endobj +1701 0 obj << +/D [1945 0 R /XYZ 90 394.492 null] +>> endobj +1951 0 obj << +/D [1945 0 R /XYZ 90 394.492 null] +>> endobj +1702 0 obj << +/D [1945 0 R /XYZ 90 308.71 null] +>> endobj +1952 0 obj << +/D [1945 0 R /XYZ 90 294.776 null] +>> endobj +1703 0 obj << +/D [1945 0 R /XYZ 90 199.076 null] +>> endobj +1953 0 obj << +/D [1945 0 R /XYZ 90 185.142 null] +>> endobj +1704 0 obj << +/D [1945 0 R /XYZ 90 89.441 null] +>> endobj +1944 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F11 291 0 R /F70 298 0 R /F65 249 0 R /F84 1406 0 R /F83 1864 0 R /F87 1948 0 R /F81 703 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1963 0 obj << +/Length 1761 +/Filter /FlateDecode +>> +stream +xÚåš[oÛ6€ßý+ô6¨ÞIeÀµè†uеÙS[ŠMÇÚlɓå¦Ù¯ß¡H]-ù’¦C†½$ºPçFžs>‰ÆÁm€ƒŸFϯF?J„(”TW‹ ā’ J‚«yð~L0bl2%ãñ&ÊÖÑõ&]Ý/Í<‹®WñMe÷——o&ýå Ñã4™L©Àã«h»u‡oÍÂ÷L23 sÆÇRM>^½½¼ý5"`Ha€PH1ÌÖ£÷q0‡ë¯°#ÔÁ]1jpÊàÿ*x7úm„:CÂR4œAqïPåñ„àñ'û¬’„oÒte¢Äž°s<¾¼\GŸãuü·—ó ü:NL”]¿ü¼q®o·1„\¾øQ“†8˜‚BáÍ4v|1ªå шJ¦bгÉT€ /R³ø€1Å&É{D tX>³Ým®“ɔ£¨Hn‹ž÷‹f"ìˆ~~Ý^Ås¤)]JīǾë‹F”U#žûYÛÄ$҄–ã¾ïqÄJâå€bwë…Üf+ÇÁô7HàÆ )ãI +ó©àwcߚ|—%[/S4càeåDžíLL +¡ ²/lBÑq”Ì큥·ºw—àÖ¾ +Á «¹Í—ñö¸Š­“—¤¹Sa֛ü¾V»¯Dj$Ã*6õú=AÉMºKæÆû²ÈÒµ×s“Nˆ°™)lfڛqÒ£™`Žp(ùÇ`7a­Ä‰½[Ƴ¥»4‹¶ÅÀ4J†gí¼Ì—Æ3X왱«¤8û4¡b­vþfì+Þ,]ov¹™£¢Æ•Eª³¨¦…`=<€Ê"õÆ£(‹Ö&7Ùö²õt-¥½‚5R8c5‚¶'¡ñL7$”WSvUº¶*J–;66ø Æ×­âZžºÿ7~|Yôæednþ0³¼Û3a¡‚ã³&ìێ-ߧ” Dˆõ^ w +Ý ÷!”E½ç}²[›,ÊS€tá92ñG tººö͏ØÇøžys“¤ë8ù +‚²¦}*Ø\¹Íyä ,N(]˜´K.K®J®n 8RæT´Ú¦¥©m‡']H$¢•u/?ÏÌ&‡e>qN²[O)o‡s0¬ ÆÏɄƒQÑ*ž_ÿÝÂâJòëJÓ@f·H ‚!m¤i–Zï’*lûÆ)b5'(ÆõÌôWu­SÒ:‚²r©Æà¬-Ó8±•Hëfå¦ÅÆ]"©lÙSHh僵è-ïHÖUjȨ(D7 Ç´lZö0Íú#ïŽö¬^ÑEcä˜ÕÍË^uÍ˵š×³>·`•pQÁ¬ë¾ô<СìjÏ +œ(µ4d Õ½ûöª Öu_ì‘Ó\ Æ;`f¿A`+0áíŽÚ¢­–LÀ(VWÀjY­ÌÂ7—]’§»ÙÒ÷×n†ûǧŒ"vè_ Ñ¿ ô'çÑœ”ô>Eú“E?ýCŒ¸úRɽðȬŸ>üגŠI쥩¢ŽÂ?SˆSuýËèŸé6ýsí[(Ë +—†èŸ(q¼„7UlHÿ՟DÀ¿B³ƒðßtäË?ïxò“I> endobj +1957 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 541.376 230.651 552.245] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +1958 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 290.978 230.651 301.847] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +1960 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1964 0 obj << +/D [1962 0 R /XYZ 90 757.935 null] +>> endobj +1965 0 obj << +/D [1962 0 R /XYZ 90 733.028 null] +>> endobj +1749 0 obj << +/D [1962 0 R /XYZ 211.842 504.862 null] +>> endobj +1966 0 obj << +/D [1962 0 R /XYZ 90 490.137 null] +>> endobj +1750 0 obj << +/D [1962 0 R /XYZ 211.842 254.464 null] +>> endobj +1967 0 obj << +/D [1962 0 R /XYZ 90 239.74 null] +>> endobj +1961 0 obj << +/Font << /F63 247 0 R /F81 703 0 R /F11 291 0 R /F50 215 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1974 0 obj << +/Length 1921 +/Filter /FlateDecode +>> +stream +xÚíYmã¶þ¾¿Bßj1—ï"·EÞ!9Ü%®—-ú! Z›¶Õʒ+Éõm}‡"õBY~Ùä‚"h¿Ø%g†3ÏÌ#áháèÝݛǻûo$‹4ҒÊèqiŒ AIô¸Š~˜Œ›/Æx¶OÊ]ò´/²—­Y•ÉS–>—IùòððqNñÌOωšù|Až½Í’ªrÃOfmš{&_Ç9ã3©æ?=~¸ûúñîŸwÂi1Š™ˆ–»»~ÂÑ +æ?D ‡VѱyjqÊà?‹¾¿ûËöÆà¡QŠ Œ"Ŕ!,…³l—|Nw‡]£A»œ!ë¸DK¸Ó,¨Ëƒ±Oß#ðà!*Ǥ}(];{“|åEž½¸Q{«Þ7¨ûÒXÜmï©$«ŠÑƒ­ªÍÅ¿æTÀCóû‘êÉ‹˜"ãhAŠ•tÊmF+;숵fümkìjíöNÿÔ©=U†­ÚË¥1«ê+¸$dvL³ÌÝx6n zºÉÍÊÍ:+`z_¤yí†Eéî-³¢:”á};ܚÒû:8Î&²;óy_NŸˆÒ)¥I–[S¹=Òº² ¢ãÌÁ?iáC"<ÎÑh#ÄYpŒ$GS¨äNÐן—fo=V=kûêåÆÇü§“ã# +ÅXƒvº×î}>ç U’¥«§?•›ÃÎäõS·Óä>#ÇðŒ¦g·eam<æ]€žºœSÄ$¹îñAØØ?DàTâ¸K¦mZ]TúX¥`lV.Ò|YìöÏ™;ëx‰d,a#Š=n½Ÿ²E!MÔu ˆæ]:Û¸¡zfvûúÅ ‹rÊKÅ×}4!8/j7x.ùÊæ ex¶.‹›Nž‹9‹ðc¾šr+ 4×]J¬>¦PŠQDb:Þ½4õ¡l2µÙkòÜ ณ)ò”OY§‘Ro§åH1³úÙb:m>´` +\Äa‚ß™› i +q©N¢23ëڍy]eVȋq*ÁP9¨«ˆ¢Ø×ÖBzN,èÀȗ҆D‘™$w¯(¾»4· íåüˆþ.ÍMR\ì]®*#àÁ¡ÃúXLx¢=(@!P’ÎÞfý#Æt9'³°iBºÄH³> +óuKt +~âq ôÒ/‰&CÑ«)ÑÐÚ(=ýæå)lOšud(=ÆëNú¦\BP"oüɝ +bà9Ñyà†‚šƒl<؏A¦Œ}ôÎä¦LꡱBÑ©Q9Òª3b†L¥‡Š$… ÖHÄÚ=ü©‘jª`3È}½ƒbJW¾ƒâºí `j²@ È&®£úp‹ÊÉsàË{x÷ÛN€ kéu„gJ„› ¤{`‡Ñ³É\ñuO¥ù0aŽD-çlcHsыkv9nÓåÖM-W‡$C +úk—é²îQ-ÍmšvA£¾6qmS'Î7m„+À?úª¢oÚ¬F~ƒxm p¨=ڞmÌ *€Fhߙ1'ø£ÅפLv¦6å™îì\/¦,4â\§gBù Ñj+FƒÂnllI1Š]Çï;ÿç¶ñ÷8¾j ÃóßͲðµ†$¯Š˜Ë4¬€ !è€û¬ù1T:ub~=«Ã'GÆ„è\è]QÑmv¢áꢆ@íbr¢áÊä8ýËëè¶ t`ûY +ÝÎ ÿ¿4Ùr‰z]_Å@ ”:öË(“²M‚–J0P-Z +7lÞØ%j¯Ü͖_ÂLÃ?á¿ãŸ£ûçù'¿Ê?c@íSþiø'´í|Ä?ÏÅ֍0ËÿÐÿ2¥— (%·PyŽ€9$6ñ!ñ·“|sH6^Ôû¼6åºy·²ôS­Lù»¹¶æ®ÿœä‡$sc î“FÙ¿üÀ6ˆÚ|FöË"ž}oŒ÷‹sÆ?¢vô­#ʽ‰¶W¤+fÛºÞ?ÜߏG´¬Ð!O÷%Jëûý>»?% ½B8¤×íK€]Q¶¯Î ÷°aéÉœh£øäÿ¬“é× +endstream +endobj +1973 0 obj << +/Type /Page +/Contents 1974 0 R +/Resources 1972 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1920 0 R +/Annots [ 1959 0 R 1968 0 R 1969 0 R 1970 0 R 1971 0 R ] +>> endobj +1959 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 647.077 230.651 657.946] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +1968 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 360.728 230.651 371.597] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +1969 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 214.648 230.651 225.517] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +1970 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 98.147 230.651 109.016] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +1971 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1975 0 obj << +/D [1973 0 R /XYZ 90 757.935 null] +>> endobj +1751 0 obj << +/D [1973 0 R /XYZ 192.853 610.949 null] +>> endobj +1976 0 obj << +/D [1973 0 R /XYZ 90 594.914 null] +>> endobj +1752 0 obj << +/D [1973 0 R /XYZ 192.853 324.6 null] +>> endobj +1977 0 obj << +/D [1973 0 R /XYZ 90 308.565 null] +>> endobj +1753 0 obj << +/D [1973 0 R /XYZ 90 205.942 null] +>> endobj +1978 0 obj << +/D [1973 0 R /XYZ 90 191.441 null] +>> endobj +1754 0 obj << +/D [1973 0 R /XYZ 90 89.441 null] +>> endobj +1972 0 obj << +/Font << /F63 247 0 R /F81 703 0 R /F65 249 0 R /F50 215 0 R /F11 291 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1986 0 obj << +/Length 1347 +/Filter /FlateDecode +>> +stream +xÚíXߏâ6~ç¯È[AjŒÇFº‡vuWí¶•®»ôézBY06$4 Çîßqœ–ÕJíJ}!$qÆ3ó}ߌmì-<ìýÔûqÜ~’ÌÓHK*½ñÜÓØ $A‚o<ó¾ô FŒ |‚1î¯ÃlNÖiü¼4³,œÄÑcfÏ£ÑçÅýêñ€¨~š |*pÿ&óÜý½7sS¾3ÉԀ=ÎïK=ø:¾ë}÷þîp{¤t@(`›®z_¾boÏï<ðC+o[ŽZyœ2¸ÆÞCï·> eK± ¢ˆà*¢$,¢ÁýoöÜ¢R÷ë`&7i2¹71 )ã‘ꚌF.Z÷ùdKgþ,0Xömäà¶OÒ¢òo‘mÊôÀ«á'Eö"aQÎa|9nêF´båÈ夓7Fà½1>ÇHÊ& ¤Ü½7Å&K*˜Š¥q²Êóêù2gQ²p7¦Ø“|Q§’å¼{3S"!ëªö¯XFy‡T"ŽI=(LfSLÓ¤•¢Öüåú E-óé q•Ô«¹sLŸQ8£L‹$X-?ùø45ë2)£ÖÇ»«%p¶¨˜|oͶP$ +XCúõóÛdÀ€aÍ&?d‹ÍÊ$Ť™©sžƒ°¤Mï°/³t@E[Í;’Å)b’¼Ž³(H¨çPPˆË…0« ExûQ2MWk ßclPÑ}ªD6ƒ’…:69%mKÜ4MXåå*1CÌEÕj°î¨y²UgÖ@ó|B·ü’n™’ªb·pA€LpÕ-¬‹èKÊДÓ$~>C Áeò*59ìpT¦åAšŽ´¼L»D1D4yïÚä”v$øEí*¤5Ý×î±!…Ëà\Ö¡9aÑ«u«HA6éâ¹¥U÷*ÍÜu§ç²Ñù”Pèìêw²"Ý%©3$«•(žR:&{JÇô:¥çEM hÿ{’ƒ/–<'P…¾$ùË­БÊv D ß§äëd6ãT€¶¡$½T^ؼ)aˆmË þ×ÿOÿâ-ôÏNéŸîwz¢¯Ó”OfQþg”s÷tålþ»%@½Ï +p‚y©à,óN­2Ì[®½ïlOÀR¢Íû©K·PÏ#@ D£Îj߆ÀúsBùö•U¾½) ¬zKåó3k|`Ç+Ö÷Ë0_Þ¤3³[ߟ%®Öà¢cóV{e°U7¼Úâ²s ‚–Hˆà’žÒ¤ÕøÀŠËÒÝÚÜvqEÃ:Iž£J[hoªÖ|3]Ö;ø°è&²Úu²§/Ôܵkf— M8ß7ǝGRÓxý„,,‹Hƒn{ºŽ¢4b´½9¢®ÝÍ@ôPU=‰3Ü}€åR}Èr}Ã|E“Ùfµ~1ùiç{nTk¶æ¾»*åƒøá +1ˆ¾‰ë“£ufr(„õÁ™í+]Ô¤Pú(Ó¯ ?˜„" ÛRü=7óM¼“›kæѦk³Xì»ÉÖinòv9<ƒ” +–+ê¥GåÑ#¸ µ<€RçŽtmÁëº^AüÙ¦ÊB[ÝÖøºÛ_Èîæ.´®³ ®_‡Éb.*S·Ia²¹¥O8­A²ïBô+@ “Mï8á€ÊòÈ#FÔR |¦Œ©òâ’ñ—Wÿû¹Wâ· ‘ +¨ ¤Qز(Ö£áp»Ý¢iŽ6I´ÎPT ×ëxxЭ[‰"„£€4,h[¥™qh³€ Ë?€HÝ?`àªdØŽÿ›ýÏ( +endstream +endobj +1985 0 obj << +/Type /Page +/Contents 1986 0 R +/Resources 1984 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1920 0 R +/Annots [ 1979 0 R 1980 0 R 1981 0 R 1982 0 R 1983 0 R ] +>> endobj +1979 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 644.853 230.651 655.722] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +1980 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 539.467 230.651 550.336] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +1981 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 410.171 230.651 421.04] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +1982 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 280.874 230.651 291.744] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +1983 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +1987 0 obj << +/D [1985 0 R /XYZ 90 757.935 null] +>> endobj +1988 0 obj << +/D [1985 0 R /XYZ 90 733.028 null] +>> endobj +1755 0 obj << +/D [1985 0 R /XYZ 90 635.762 null] +>> endobj +1989 0 obj << +/D [1985 0 R /XYZ 90 621.192 null] +>> endobj +1756 0 obj << +/D [1985 0 R /XYZ 90 518.421 null] +>> endobj +1990 0 obj << +/D [1985 0 R /XYZ 90 503.851 null] +>> endobj +1757 0 obj << +/D [1985 0 R /XYZ 90 389.125 null] +>> endobj +1991 0 obj << +/D [1985 0 R /XYZ 90 374.554 null] +>> endobj +1758 0 obj << +/D [1985 0 R /XYZ 90 259.828 null] +>> endobj +1992 0 obj << +/D [1985 0 R /XYZ 90 245.258 null] +>> endobj +1759 0 obj << +/D [1985 0 R /XYZ 431.18 194.542 null] +>> endobj +1993 0 obj << +/D [1985 0 R /XYZ 90 178.437 null] +>> endobj +1807 0 obj << +/D [1985 0 R /XYZ 218.507 127.098 null] +>> endobj +1984 0 obj << +/Font << /F63 247 0 R /F81 703 0 R /F50 215 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2002 0 obj << +/Length 1576 +/Filter /FlateDecode +>> +stream +xÚÕXM“›F½ëWp‹TÍÎ÷0{s\vÊNRµ±•“ãÚb+Q‘@dYþõéaÁ°HìÆÞ¸r‘`õt¿î~ýV~žü´˜\½–,ÐHK*ƒÅ} q $A‚’`± >L FŒÍæc<ÝEÅ6ºÝå›ã:YÑí&½+¢âx}}3£xê–g$œæÙlNž¾ÜDei/ß%÷Iý,ÉâìqÎøTáÙÇÅÛÉ«Åäï ‡p@j„BŠ‰ ÞN>|ÄÁÖßà‡ƒC½kpÊà{¼Ÿü>Áƒ¡ a):Á ŠˆteQ•Îž~2‰õ´¾ÎÓ¥½{BÌ××ÑryçYYQšUÖÀŸXà—íÄ{õ:$'™fˆÔáÔ>Æv‹G¼Ý‰Ý#pgϜi…—Áœ($)·›_,—.‘ýŠó‰ïhïòûfÕwk-̑’²ç wxˆ¸ › UnVk‡hy,«d{îÄòô`àhJ#'Ãë´8œJÄ1éÀƒiµÎ÷.Û4K·é—4[õÜ*’r¿© œ¨.æŽzàÏ©¤HsI®í17Ũˆ¶I•åµg 5ä%š„Ha ù ´fç^`âM\‹Æí~UëÈ]ÒÍÆ^ݹ½P‰+äo˜*Ž¥…!MNi¹ 1ÃÐñ˜Yˆ]³¾ú'»*†ÑµtQ¬o¼;7, gôM6ãÐâÑ&]Þ¾(Vûm’U·§“ÎdÑ ‹@¹é¶ë"ŸQ1=å‰ON¦C˜ñ~%Ç ÓH†¼Ùe:¡ôåî”Q*.5'!H‰S"¢"±V«X-_çiçÛ0áÝ&±Aä…1c*#¡¡òÁÄ Âe + •€–÷C4@[@IHBûÎ9P®P=Vg8˜cÖá`s÷o8xUìí¤17k9˜ƒW´­èx5éF>Fœ˜R€N#>•ƒ=}"„ 0Mûúy†1Áe‡…‡¨QNӸ͞­sé ;3$„~‚Oq”ùü”̈˜~Žâjsl8y´ MÙÐÖÝу®)‚<»L($„~Ó>eÿÿ…:Œ<ä5Ë£B˜(MŒÁ‹u&%D^N©AE=:1f‡iʇQåƈI‡B÷e0‰‡ýx¡´R¿ÅvE¾½Ùo,;&×i¼veí~•% šýÎDí«š gR4måE¯“3 æe›dR h S`x†aRt(PC5|… -­=_‡ÞÎë„`— i{o%Á€F¥Ýé—‘†ˆj=Nõ°’¨œ× rÑ¥GX¬éV­n_£ÀBš r«ï¹Ü¯ ¦=Õ +ÖÜ9¢ÕG'ê³a·NjsÂ`Ub\¹2.†•+œê)×.V®Z¢P²o¢\IO¸–—”+Lzê^¨º +ð*{úóÖüBVs(ö”y8¢cˆžAǒç™:thêp&ÎL‰0WchpOÃtDD/·¦„Òސ1nÑ¬æ‘afóÝÎ!7rL—cÑ9_¥\õÚ¢KÛBˆ¯Q®¥µçK×m‹§Ñöjˆ·½V=ËېܼZ]ÞfXÞ„;¼mM'šïºMíãNhæÉ0os¤øì×r ǔ®ÒòIQk­RKÝÚßÈpP'ُ@X=kžÜ¹žž5;<=[ï<6˜ÕÕI´FŠS?Ÿ¹€„ø侺ÌîÐ⒠½˜háé2µGâ# +¬¤È3èö†@å@ Tò3 +bpœ@A‚¨‘öz´I„T…ÇÎêt*C;>­÷ð]+Žæw¶´O¤J +{e›–Í°ìlˆ S:ê3§mìßY˟RßA-¡WdøØ÷Óõ{iӔ6 Ý{i¡á¿3ïuЍÁ، wÛÌ {û«öæmd&È'SrÍã([í£•3õ(§¸¯Ù Áê2)~˜ÁTr@ýeûhÓ¾¥þdNÖH›×÷™÷VfÂ<<}Ÿ$ Æ_AsõˤÎv" =ÛŸëªÚ]_]—hŸ¥»¥ÕÕn·¹zÈ4­Ã[µ…~ߤl›‰­D¦ XPÕÄá¦;lÜFƒyü7 ]w +endstream +endobj +2001 0 obj << +/Type /Page +/Contents 2002 0 R +/Resources 2000 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 1920 0 R +/Annots [ 1994 0 R 1995 0 R 1996 0 R 1997 0 R 1999 0 R ] +>> endobj +1994 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 613.107 230.651 623.976] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +1995 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 483.81 230.651 494.68] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +1996 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 310.813 230.651 321.682] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +1997 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 125.86 230.651 136.729] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +1999 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +2003 0 obj << +/D [2001 0 R /XYZ 90 757.935 null] +>> endobj +2004 0 obj << +/D [2001 0 R /XYZ 90 733.028 null] +>> endobj +1808 0 obj << +/D [2001 0 R /XYZ 90 592.061 null] +>> endobj +2005 0 obj << +/D [2001 0 R /XYZ 90 577.49 null] +>> endobj +1809 0 obj << +/D [2001 0 R /XYZ 90 462.764 null] +>> endobj +2006 0 obj << +/D [2001 0 R /XYZ 90 448.194 null] +>> endobj +1810 0 obj << +/D [2001 0 R /XYZ 90 289.767 null] +>> endobj +2007 0 obj << +/D [2001 0 R /XYZ 90 275.196 null] +>> endobj +1811 0 obj << +/D [2001 0 R /XYZ 90 104.814 null] +>> endobj +2000 0 obj << +/Font << /F63 247 0 R /F81 703 0 R /F50 215 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2015 0 obj << +/Length 1300 +/Filter /FlateDecode +>> +stream +xÚíXK³Ú6Þó+¼+,z[b—f’Nnۙ4—®’ ã <›Ú&”üúYÂÆ`ó¸å&әl0’¥ãóú¾s$ìÍ=ìýÒùyÔ¼•ÌÓHK*½ÑÌÓØó%A‚o4õ>v FŒõúcÜ]é*¯“ånNÓ`¼ŒžÒ Ý ‡ï{wÝt¨n÷úTàîëeeöï‡pïÂx‚<Îïú¤÷yôÐy3êüÝ! öH¡€ð‘Ï„7Yu>~ÆÞæ<ÐC+o[¬Zyœ2x.½ÇÎ|ÖÊ–âÀDÅ΢8È£ÁÝ/æÔ¢RØÿI45#y‹Íá5ðÆ4ÇÛ(_Œ'IœåiŹþ üºšëo9P{}BNã‰]R³Š#k}±»Fàƒ5}»¨O|$)·KÿÌBŒÀ>&ÉÚغ³£d¶Ÿ­«ΫäÌÁtÿõIçâRï䉚:¯4ˆdq"Ë ‹(k +QԄì¡"möq?rØLÒÜëÃ&¥”ÝòæŸI¸Î#°mXÛ\=Mò¥s—…ŒØZ`ˆB>Ö ]WÑy÷8$O°Œ¦ãWé|³ +ã|\~©ñ;Gv*‘®¢9Z¤IŠîÖ(š58ŒSÄ$¹ä0‰8.ñôŠà +…¤ÐWÇ6HC+táX܏âI²Z¨ž–!jHÝ>U¸EB~b„}}KÒKNø,9aw€å<ÝX*2Â,a®o´.Q(­‚ÅÂS¬R‚ÊÈMæ æjˆ¸„T†!±Äs¡º7£ ªùT+XO?  .¿+X¨ ý+y¬Òo‰ÕöèJ¨7÷YhÕÀöT· •¶Q¿^Eý;–Ѭ†OQBë ªŽwY®«|DdU¼²›¢Z_‚¬Hâ +n‚l¾™Øm‹â&3¨eŠ«|û׀ø: S,¡p°:†ßãƒ4X…y˜¶à¸µ +aA nE$äaIp9¸3»äçM:€¸ª¾3³iÔÒeå‹SC㈸G3 +<âÿ`É:K6ÀE"Uùý +´<‹9‡ÂJZX‘µ±"_YÑ ïÖŜcE·¤5ERW¬8o¢ÅÒÚh‘`´Oÿ3/–FãE…9ѹž0øð ô=xE¡‡| ^œŸ'F(c Ú™±îéoÁŒ¾9?²;2# N+þƒocÆ+ó,j¸DµP#o¡FFûE3º‰!åIáÄÄadY4­C€ WS§ È tÓÕÉw×réÂ/^º@ÂHe!„ËÅW…BY‰«†sàVvSŒK$Ú~v>¨ÏîžE»)¦¨ +º ™îé$Û,s§¹sIœ¸‰ùXÌ9æ '·yÅÑ*úN/(¡9gRþÏ A6Bð‘àôR(ÒúR(5œaΆz ,TŒZy¸Læ»ØWIjŸc} BŠ°dõöä„LJ7ßK(|R]{\\ƒ!à[Ÿ)w ,‚ïýì2 +J±è¦qÃ=ÝØáo–sìà!0<òńgÿ:ˆ!cçNÔ;ƒÃYQÚ'n +Ÿô§ž]—è¿ñ&XÚÿ†™¾˜¯xKäb¨Œˆnq¸y Cç댿¼ý¿_;E4+¡Í@ªê]y¾ÛíM2´‰£uŠ¢|°^/§mC%…@s쓒g&žô’4´‘d>A‚º|ØDö„…«ÀdýIÿjP,¤ +endstream +endobj +2014 0 obj << +/Type /Page +/Contents 2015 0 R +/Resources 2013 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2022 0 R +/Annots [ 1998 0 R 2008 0 R 2009 0 R 2010 0 R 2011 0 R 2012 0 R ] +>> endobj +1998 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 646.614 230.651 657.483] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2008 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 533.112 230.651 543.981] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2009 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 377.67 230.651 388.539] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2010 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 222.228 230.651 233.097] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2011 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 108.726 230.651 119.595] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2012 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +2016 0 obj << +/D [2014 0 R /XYZ 90 757.935 null] +>> endobj +2017 0 obj << +/D [2014 0 R /XYZ 90 733.028 null] +>> endobj +1812 0 obj << +/D [2014 0 R /XYZ 90 639.284 null] +>> endobj +2018 0 obj << +/D [2014 0 R /XYZ 90 625.031 null] +>> endobj +1813 0 obj << +/D [2014 0 R /XYZ 90 525.783 null] +>> endobj +2019 0 obj << +/D [2014 0 R /XYZ 90 511.529 null] +>> endobj +1814 0 obj << +/D [2014 0 R /XYZ 90 370.341 null] +>> endobj +2020 0 obj << +/D [2014 0 R /XYZ 90 356.087 null] +>> endobj +1815 0 obj << +/D [2014 0 R /XYZ 90 214.898 null] +>> endobj +2021 0 obj << +/D [2014 0 R /XYZ 90 200.645 null] +>> endobj +1816 0 obj << +/D [2014 0 R /XYZ 90 89.441 null] +>> endobj +2013 0 obj << +/Font << /F63 247 0 R /F81 703 0 R /F50 215 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2031 0 obj << +/Length 1640 +/Filter /FlateDecode +>> +stream +xÚíY[¯ÚF~çWø­ Å{öj¯éS%UÒTJ“Ó¾$Ú ¬Š/µÍ!ô×wÖë sà$Q*Ey¯YÏÎ|3ó͌ÁÞÊÃÞ¯£_nG7/æE( +hàÝ.½{a@ Ä»]xïÇ#Æ&>Á3•Çj–¥›ýZ/r5ۘ»\åûéô̈́âq}{Bä8M&>xül£ŠÂ]¾ÕK]ý¦“¹yœ3>éäãí«ÑóÛÑ?# +aT +ˆ…Lxóxôþ#öpÿ•zDÒÛU»bSßïÝè~ÐÊā1ˆ"*j‹Uš Áã{ûjq¹ëÔ,ìJ>Ææét›e:ŸÝ¥Ûd1ËÍ*q"?`0Ûo^Hr 0ö|BP$j}÷nKÏ&ŽœíÕL܁öøn“OBPî¶>­ô©½Q¦µdq(™#*[ÑåÚ¢i€8&Ý&íV–»ËÊ|w™.Ž %Â4|Ô1 +ž +"’a+h? E (”ÍTÅZ,G¨ú$’°Ì¨@Lº'žšë¬4iRL{Ïvß6`óU¹o­Ôž;‰D!Ž¬ðΧ/“ ‡€S³˜=ÍWÛX'å¬=iðœ#«€u1p»ÎÓ ã›€Ð5C ó N.DôèâÁƒ CcÑ¢®ríÔ*SH¢tµ÷M2Oã ïnSÿ”æî{aŒPð­Xp¡»¬Ÿ‡£üðY„F ’ü(ïƒ3yO1>È{ú8®›NfyÀnmê[9W§>Ç 1LýŒÔÇ@žT|£ä¯ö„=÷s€äzÐx¬Ù"ºp*;°´4Ï 2¸1”ÑÿÁ>ƒØ¸mÈ.×ÅvSºkSƒš¤õÕVå*)µ^´h;Z¬ŽMbbó¯^<ÌGKðà}W|Ä¢#B +Ï#‐ìêQ„T‚æ3½QYѱ‘r=é}9I» ù-:‘Ã䩾­‡¶¥IVõ™Ãą#$Eט„¾ƒpàp.t‡ÍÞ;]î´N,a̾e_©Ùa@Ò2úA.ß9¹ÈsSN@—žn´JÜâQÜR˜8ۘå~¶- £fóŠÝ§²¡kËÑs5éh"~‰sø%Î"›®ǜ#ÙYΉ¿œ©!m³P °Hˆ:c­K?sMO¡ó{G@ €ƒðÆt®šD8‰{à@.î‡*®Q¹á)×NàÉLÏ-QJ:Œtd„^¤œð KâXŽ_.‡Ù ãVÔRmI•Q`=S4Š–Û<ы'°Œ*òvQæ3"Ùµ¶ +ʼûLó.¢iÔtœ•ûI .P$vøAß9AFgZÃ÷@„> endobj +2023 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 645.122 230.651 655.992] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2024 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 528.369 230.651 539.238] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2025 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 399.66 230.651 410.529] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2026 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 258.996 230.651 269.865] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2028 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +2032 0 obj << +/D [2030 0 R /XYZ 90 757.935 null] +>> endobj +2033 0 obj << +/D [2030 0 R /XYZ 90 733.028 null] +>> endobj +1817 0 obj << +/D [2030 0 R /XYZ 90 624.346 null] +>> endobj +2034 0 obj << +/D [2030 0 R /XYZ 90 609.824 null] +>> endobj +1818 0 obj << +/D [2030 0 R /XYZ 90 507.592 null] +>> endobj +2035 0 obj << +/D [2030 0 R /XYZ 90 493.07 null] +>> endobj +1819 0 obj << +/D [2030 0 R /XYZ 90 378.883 null] +>> endobj +2036 0 obj << +/D [2030 0 R /XYZ 90 364.361 null] +>> endobj +1820 0 obj << +/D [2030 0 R /XYZ 90 238.219 null] +>> endobj +2037 0 obj << +/D [2030 0 R /XYZ 90 223.697 null] +>> endobj +2029 0 obj << +/Font << /F63 247 0 R /F81 703 0 R /F50 215 0 R /F65 249 0 R /F70 298 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2044 0 obj << +/Length 1987 +/Filter /FlateDecode +>> +stream +xÚíZIoÛF¾ëWðV ˆÆ³éžÒ ’¦@š¸½$AK”DT¢XŠ²“þú¾Y¸ Mj‰ã(r1 ß2oû¾q° pðrôËÕèâ…dA„"Iepµ"(I $¸šÆ#Æ&S‚1çq±‰¯óíúË*™ñõ:½)ââËååÛ Åc÷zBÂñ6›L©Àãgëx·³·ï’Eb~K²Yò8g|¬ØäÓÕëÑó«Ñß#ငBŠ‰`¶}ø„ƒ9¼€QܙU›€S×uð~ôû;gð Sa„0恢É­cÏ?ϒ¼L·ÙîÒѕb­)–άw/AhHZBIˆŽ‚)WBX¡¯² ÇãÛxÎ¯ŸËý&ÉÊëZS¯ž‹·¥‚‘qμZÛ ã;ØQI£qºÐBÀ=Ñú†Ã-‘Õ'ó$ÛnÒ,.·…]ëÉWaJ«µéΊý'5æ>šJ†ûI†¨¨¾M>ç} +FDEÕ¢8›÷È¡IÁ«5å +Ì8*¨Hôš`ÊA ØwÒìû<…ÞÁOÓl¶Ýäq™Þ¬›yÚ#}íõˆè(’Ú”Û¸Ï%0—7!I]FgÛÒÞÄö²Ëã™SY›ã,è× ›ÛÊ ´ÕäÄ´S{ÊCLÒ`Ê âmU-¢ˆaWºé„@jê?`¥âÌÞoÓ¹}:£¸//ãÅGŒi–\綦ÓM¼tR?bÿœD"–Æ:Æf¯r8VˆÒèÞ¦{Ž[4¬–<±±ç ajNÇ^ÚßÞ¤YPeΖÝΕZGkÈ¡ê~öúZCD%mÔNlÞ³mbü¥PÎ=’…@a4X~ž|A‘ˆjù°W¤'èSŠ#*~*$©kXOÁ±eÉÇB1.·}}Z‡TÇ2 +z+gÍ" å5! ý²n(ñBï« ¸Õ[ǔ‰ºN¡¥Í©ûª¤lgxPD9Ëä}6‡Ibwae âãÅ>›™k^oân8ßDÈqŪµ÷!† NVH÷(U@ C[«¥m¦Ú‘H…Á¬T¢*Àž8„(<u8 +A$‹tYñ Ԓ Oë7Çg5‡úÛ!8 r¸BX@¬:ûJ´nظ†ëôt¸NO€ëû|—-Rt <®O@ä ÛêùCV3CâlP¾¶€,q¿›vbxéû³Èsd‚#1~¾#û<'¬5?:‡vpÏFˆA€ê6ÛÌ 7xס"zÑ¢º)«ÏZÒ_h(jÞ;¿õmã·Yáù­÷ýÞ5æl󩃣ÂtzÏ|GbÃDRõÄ滞Ópžs +°O6BÔp +ÒAª%6TYb3¬'B¬1ÍÃ‹ÝŽÜ 9… '}ЖP½àЗH±.xÓU„¡ýÿ¬éÀñÏÑBÿ©è2•³‰Ó´#<8ñG!Nìât„9i& ¹ÿŒ1'`6-æOcNþY»–×&P¶ËàNô³*ØmŠùYçï?HÕIU¨ §UGú¢Cª¨Â¤ŠŸ’ÁÀ!‡:Ì©QՀ^äTp¿<‹TÉaR˜’QKªä養RE È0TÝÃIáÒPdzH•øAªþ¤ªû'€ 1t—ÿíÄd˜—í J\Þqé­¶A~÷XÍûøƂûð:ÖHÀFÎýg˽íãðô*ƒD²\ BBì’⧉cš~‹³}Å)4@¸ÕÚ!ûj¬„´ jƒa3ï“Äí‹ÝŒ¿‚êîב‹T@/#uÑ®Ê2¿¼¸¸»»C³Úgi^ ´¼ÈóõÅýзÚá*õ|]TÁÞlÛg÷‚[‚©©ÜQušÁIHԍ㿲-c +endstream +endobj +2043 0 obj << +/Type /Page +/Contents 2044 0 R +/Resources 2042 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2022 0 R +/Annots [ 2027 0 R 2038 0 R 2039 0 R 2041 0 R ] +>> endobj +2027 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 703.18 230.651 714.049] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2038 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 488.591 230.651 499.46] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2039 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 243.289 230.651 254.159] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2041 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +2045 0 obj << +/D [2043 0 R /XYZ 90 757.935 null] +>> endobj +1821 0 obj << +/D [2043 0 R /XYZ 90 682.698 null] +>> endobj +2046 0 obj << +/D [2043 0 R /XYZ 90 668.229 null] +>> endobj +1867 0 obj << +/D [2043 0 R /XYZ 90 468.109 null] +>> endobj +2047 0 obj << +/D [2043 0 R /XYZ 90 453.64 null] +>> endobj +1868 0 obj << +/D [2043 0 R /XYZ 90 222.807 null] +>> endobj +2048 0 obj << +/D [2043 0 R /XYZ 90 208.339 null] +>> endobj +2042 0 obj << +/Font << /F63 247 0 R /F81 703 0 R /F50 215 0 R /F65 249 0 R /F70 298 0 R /F7 966 0 R /F23 216 0 R /F8 300 0 R /F13 965 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2056 0 obj << +/Length 1898 +/Filter /FlateDecode +>> +stream +xÚíZKsÛ6¾ëWðVi&‚ñ&éžÒLÒIÚθ‰ÛKšÑÐ$qJ‘*EÙq~}>@‘–3ΡÍø$°ØXì~Ÿlü<ùézrñF² F±¤2¸^1BI $¸^§#Æfs‚1žî“r—,öEv¿U«2YdéM™”÷——W3Š§îõŒDÓ"ŸÍ©ÀÓWYr8Øæ{µVæ›Ê— +ìqÎø4ä³O×ï&¯¯'ÿL8„b! +™–»ÉÇO8XÁûwøGÁµ 8eð̂“ß'؁Á]Pé€" „”!,…Ev¼Y¨ÏûÒxPO½x#pg‹PÈ|1®·Êbɏ;U&UQÚn±¶Ïªþ~Üï•ûvSóUšol/YϨ˜þ…1ÍÝP5#b +^¨Ã!-ò{Îx æΛ9(æÖ¥•Ê‹]š_Àû)Bîá`„€#/‹Ý®È¡Eô;ìY4ƒÖu£ª§e…Fq§J;#ÉWö½ƒ­›-l3ƒ­¿û°­;Å~®X¤– X¸«`l’¹­4Á´“È+ûæ.­¶¶µRë™^ö˜¹O·zý$;ºM'.êm˜w æ#IÆ#Éc»üëÏKµ×>.½¹íSÇo¹qüþä  ŽSÜbz›Ï88˜déjñ²´xÍJƒëô—P‰bsÜé–ö|ôŒð4]k#€Otæp +4SzQÔ³/#$šØIÖê«ÌiOÍ-]'F¬u-ko\o Αl†é8€ÈØ£)ÜdÖCã Šx×$qqa?°tŸ.E$ŠÂf©j ØOׁÍç˜Ôƒ’Ò…Ø*…ƒÔ±=Os¸bû¤Jo2÷­Îƒ;FCLFµÁÛdňSÿLtZ*\¸'öqØ'˾;MÆXR½ŒØ9¼ ŤÁ‹œï C¢‚(#"êÔDÛbá–ê[z«ÿÑ!Žl»HWº~M¹¹¼Ü¨rr–~Q«E²¶¹f‘3­ƒêÏYLáˆÒD…qÜ»žØŠfë=t@4§ób6X׶,Ñ·uñá~wSd¦#¨;í´Re‡û݀qnBúÖMs•”ö¶~š”9°FŒ‘ˆãzr{-|÷#D%é­ðªPfǖ©N¦§–…@Q<š,<û‚‚´íz14g^Cò9 !ͺZö€ml-ˆ§U1”MtMˆÏhˆpµƒ”5èBA7£_pÄ Þ<Âvã€-8Ú¢ÎVjY5®ÛçÖYØ5B6• ¥Ø˜àÏ53ÒJG¯ %“D’ kÌX8uæÎÈc8Q÷^Þ΄œÖñ Ä*DÈ"¿¶‡!I\œc7ª{âùßÎ(4#2œ^8Dƒ&!ÇGœs?ô|^Ç¥Ð9^@9a’?Èí`و7ôÎй%Š8‹S ¼Da  9 r‘oª‡L*LIÖß}»ÛªR l +¤úˆÆmêëlˆ_!¸cÖÏÎ ;,ëC´IÚ¦ K¡T¬tæx?X$’±J$>q…+¥—¥G©ìt<ªseøS™ìT¥Êº3Fn"¨¯ÔK¡£ÌE'#zB¯3µv…lk¸¥Ù¦t¥º\Î%ñaþÝ©c¼»>„‡·s°Ë¸Û- PõN0 ú¶¯ÍtW>'V 2SξZ¬”éfûÀv?M²8Ÿ, òTÍ¢I§Oô H?«z„¤›nY@ºåÒo|@öÕ"µà0ó<Á¡ßØüojǨzy’¡¡ø¿ŠIãQqù8R P´›SµY«BtKGƒd#œZBŠSbäßZŒHØ$÷aAÅB¶Rh„#ô ÙJâH1~¥S œƒˆó1•@¡ÞvÊý°J¶íkT‚6œØ¾S úMG%†W†“ϒ0(òõ „ AZ:ôk5ŒÄEe?ڃÊ«Eýw„ Tœw¯œxèÅ6Ì5)oððt0,ÎWÞ¨Ë#ëâ_+²ªL—ÕxE”SøNmåTؓS|DNQÌ;rJ÷ž.§œqTZÛìª*»á=5"µà&Áô“ð}VZß\iI ¼™:¥%zJ‹r9¢´¸IVgÿôÁZúf „BZGô“ˆ>G1O|±¥-6bËyoŸÃbK—áèA±¥'ûbˬqFlI²¯[r\l P„ÔŠ-yNlIÄ#iĖx„Øb’µøb‹dB¿Vl‰Ėx[Ïbë?(¶Èw¢¶žÅÖĖ|[ߏØÏbëYlˆ­ÆþÿAPYeôØÿ‚`h¸Öò&0!b$ïˆ+C>A‰¹n-Çl÷W«Élç]¢…™Ídîs’oŽ–ZCïm|ÁæÂúw¾?ªüa&ÄÔmÅoI~¬1×YöV¯$£Ù +¸? Ålv4¿ÕPÊí‹ÝŒ¿ƒºõËÄR‡Œ +àh¤ùt[Uûˋ‹»»;´< cžîK”Vû}vqZz:™p’&Æ×uéÜÝÛ,ôÏ!Lrå9ÍaàΜéÉ9þ ¬‚¾ +endstream +endobj +2055 0 obj << +/Type /Page +/Contents 2056 0 R +/Resources 2054 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2022 0 R +/Annots [ 2040 0 R 2049 0 R 2050 0 R 2059 0 R 2051 0 R 2052 0 R 2061 0 R 2053 0 R ] +>> endobj +2040 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 646.537 230.651 657.406] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2049 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 402.182 230.651 413.051] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2050 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 390.102 513.996 401.006] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron) >> +>> endobj +2059 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.635 378.147 176.565 389.051] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron) >> +>> endobj +2051 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 145.872 230.651 156.741] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2052 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.06 133.792 513.996 144.696] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron) >> +>> endobj +2061 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.635 121.837 176.565 132.741] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron) >> +>> endobj +2053 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +2057 0 obj << +/D [2055 0 R /XYZ 90 757.935 null] +>> endobj +1869 0 obj << +/D [2055 0 R /XYZ 90 625.491 null] +>> endobj +2058 0 obj << +/D [2055 0 R /XYZ 90 610.921 null] +>> endobj +1870 0 obj << +/D [2055 0 R /XYZ 90 369.181 null] +>> endobj +2060 0 obj << +/D [2055 0 R /XYZ 90 354.61 null] +>> endobj +1871 0 obj << +/D [2055 0 R /XYZ 90 112.871 null] +>> endobj +2054 0 obj << +/Font << /F63 247 0 R /F81 703 0 R /F50 215 0 R /F65 249 0 R /F70 298 0 R /F8 300 0 R /F13 965 0 R /F11 291 0 R /F7 966 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2072 0 obj << +/Length 1757 +/Filter /FlateDecode +>> +stream +xÚíYMÛ6½ûWèVˆ¹ü&µ=¥AR$mm²í% ­MÛBeٕ´ël}‡"m}X²w“M¶¹Ø¢D ‡3oÞϗ·k“•ÓÃJk‡X0ª:·O¾±;ßAJ˜a²è'nÍé9v…^ÀI£¬Áç ¸h8I P×[ÈþMjÜZ÷Ô+¤œ×̔ö2%Uòs6yoÝCKNܑ™á @’¢‚vj¨ÕpÜ +F2Ÿ nâƒ÷NªM¯¼”é¤Ò_·°=ö+¢öÎқz•Ç¹:(ódV—(êQ +€KÝ!²Ô´î¨;9 îˆ¢¡îªá—«;/|¾‰¼¯&òDWäi1(ò"WbJð¶Êƒ@¶{¡§e¿Ð“D {”y¯ôÀ~­ôÀ|¥ôì.ú•ž­*O+=¸¹£ôÀì9¥§P„僕žVzQ"Ò“ç•žª)ÿ¡R/âƒRoÂ"€‹ÚUvZòE¬K>O£î ÷Êè‰åæ@–äIäñêŽ>\݉^݉ÏPw¸¦™/ÓwÖУù(<òuýŸ<ö}Ǿé»'×wjHßQ%›úŽ*õ8}w (ÊÀß8ɦÅ6ž™éaCÊî÷qD™“ØïXûQý@xçŠHŸSDb† z¿- 7åZB(„HžÝ§I6ÏKD³†Jh-%(ÀjûÐ +‰T×A¤+ƒÀËZQædœ¬bí[?ª9¸<Žf·‹EŒ5µÂ¸’ŽI¶¬CU9Þܦ¥?Ù§(Aj0}v« Õ/æNS9RX|îîÃqªqÉãƵ=Ö¡÷ +)öU»KR/‰nüÔF¡˜ùùæ¥þíÍËyÙÇMr‘#Ny—³MÙ¦ÉÁDô× ¡Ôì!ÈlCó(?°LD?Óê!¦Åš6™ÖŸŠi‹‡Pm1}gʾ•\?n¦7fÚkO´{ù{†€‰€4v¿;Ô ,Y4ÀÀÐÙa£`xäò4ó¦DH?à Ve›„­£®¼ÞÔÞW…ñW`aø×{hÚSí,u|¢˜!)t;ú÷Ši‚ˆP>«^k÷dFt„UÍg¾^\Þ~ó\nOör9„ŒóÏçòîgJ ä+õC¿RV_'a©úQLˆ Á;”|U=èC1ùá¾¢ÜðgWVnð&¶µugij9Ζ·î5Œ^gÐQU{ٓËo…É¿ zú%ÎncOï¶ÊîìêІôƒ¡¢µe@Á‚©wÆø¸¸`üì~U!¯·H…Dšúçª,·—»ÝÍ +t›%Û%åÅv›^·®Æ; »",¬”¶ž­7î KA[e2˜¨ªÙ8¢Í`âº*±£<þ |¾ÍÔ +endstream +endobj +2071 0 obj << +/Type /Page +/Contents 2072 0 R +/Resources 2070 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2022 0 R +/Annots [ 2062 0 R 2063 0 R 2064 0 R 2065 0 R 2066 0 R 2069 0 R ] +>> endobj +2062 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 557.974 230.651 568.844] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2063 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.086 545.895 230.642 556.799] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron) >> +>> endobj +2064 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 342.077 230.651 352.946] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2065 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.086 329.997 230.642 340.901] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1C__Polyhedron) >> +>> endobj +2066 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 169.827 230.651 180.696] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2069 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +2073 0 obj << +/D [2071 0 R /XYZ 90 757.935 null] +>> endobj +2074 0 obj << +/D [2071 0 R /XYZ 90 733.028 null] +>> endobj +1872 0 obj << +/D [2071 0 R /XYZ 90 537.164 null] +>> endobj +2075 0 obj << +/D [2071 0 R /XYZ 90 522.636 null] +>> endobj +1873 0 obj << +/D [2071 0 R /XYZ 90 321.266 null] +>> endobj +2076 0 obj << +/D [2071 0 R /XYZ 90 306.738 null] +>> endobj +1874 0 obj << +/D [2071 0 R /XYZ 90 160.972 null] +>> endobj +2077 0 obj << +/D [2071 0 R /XYZ 90 146.444 null] +>> endobj +2070 0 obj << +/Font << /F63 247 0 R /F81 703 0 R /F50 215 0 R /F65 249 0 R /F70 298 0 R /F8 300 0 R /F13 965 0 R /F11 291 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2085 0 obj << +/Length 1746 +/Filter /FlateDecode +>> +stream +xÚÕYێÛ6}÷Wè­6PÓ$ERÒ¶(°)’6ÛH“m_ÒÀ-®­F–I^ÇßáEוÖÞ6A›—µ.äˆsfæÌ!;;?MžÝN/„ë(T8·wN€OÄ)qn#çݔ`亳9ÁO÷a¾ —û,9me”‡Ë$^åa~ººz=£xjψ?ÍÒٜr<ý1 ‹Â\¾‘wR¿“éZ‚=Æ\6õÄìýíÍäùíäã„À‚°Cô¸‡<—;ëÝäÝ{ìDðüƁu¾sÔ£v£.ü&ÎÛÉolÁ£Nù˜9ˆf{=#xæáN–2/®ôBú–/|Ò2C|äáÀ™Ã/æԘ)³åJ.é:K‹2ãTFS‹·á%§oôäÛ­4è²4ٝ}°×ö]ïdZĦå6´cq’˜«•ÚYê­£ƒÈœ@`1ÌC‚›å<ÿ´–û¾4‡ P¾±‘z3<âÖèËtÆðô>LâhyoàL¹¬¿4{3a t¼-hy6£|z@\ˆa|§Œ€¼5‡¹ˆó šRnã ê¦u ൶Uc=ÊÝ>,ãU"Í»c\nÍU–ÚG*Z귄8Gú9ï`™þ1#ð7ÌãP™kû `yqÈJIƒZ¶úK®K[;ÔÒd–¾Ó‡}ŠˆOj‡uVær—Ý›|ìyîy:Pv4²öº šæ ,s¯ÅˆB)ZJH!UH÷ê "ˆk®³82wO ««cÉ4N7Kàx“ bŽF¯¹“~Œ„}Q¹up‹!ÖdÒ·j€r#®Ó¶€g§e—²´-ÒþV!~eìû¯\”U^¦¥Ü€Á‡†RæÕã~ðLr›tÞ| "Êëødd ìs®z”ª¤C‚ZW¯5Ö6×Êl¨š¢¾{®šb¸ÉÀŠÚrY’»©Ò:”çŠÒ,¼^§ìq€|^—èÏ^0¯Òcàë ԃW²‰†ÅbœöFv¾ÑâSØتfRÿœ4™)¾ˆ2Þ]®þꓚZªµ¶3}è´SFga\PÇ vcBA½ÏH>¤Ë=¯dº)·ËçyžåOä؄áFÁw8Te|gt&xZoË:ÉéěëprÂæçar*­l“ìw†Wºsf‡ÄÊÜu’×ê㭝ÒIµ¶5a÷¸‘B D¯ÌÕ<€¨ªõæømÀ;†0nJ/üÔ§E#%N ¡9}ü öüˆjyÑïñ"ýðâÞÌSçUçÙ: ÿžâ o ;²ÿ‚«¯i®Ïƒ5}F™´sÒ¬l1ª¥Ëò3Ñfÿ ]ÉÑX!:>©ëø®ŠÑ.Ë¥¡W“ Ќ“HµA‚»PÑðƒ8þ ¦µw +endstream +endobj +2084 0 obj << +/Type /Page +/Contents 2085 0 R +/Resources 2083 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2022 0 R +/Annots [ 2067 0 R 2068 0 R 2078 0 R 2079 0 R 2080 0 R 2082 0 R ] +>> endobj +2067 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 659.479 230.651 670.348] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2068 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [478.809 659.354 513.996 690.323] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variable) >> +>> endobj +2078 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 458.586 230.651 469.455] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2079 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 341.244 230.651 352.114] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2080 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 182.224 212.778 193.093] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Length__Error__Exception) >> +>> endobj +2082 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +2086 0 obj << +/D [2084 0 R /XYZ 90 757.935 null] +>> endobj +1875 0 obj << +/D [2084 0 R /XYZ 90 638.433 null] +>> endobj +2087 0 obj << +/D [2084 0 R /XYZ 90 623.862 null] +>> endobj +1876 0 obj << +/D [2084 0 R /XYZ 90 437.54 null] +>> endobj +2088 0 obj << +/D [2084 0 R /XYZ 90 422.969 null] +>> endobj +1877 0 obj << +/D [2084 0 R /XYZ 90 332.154 null] +>> endobj +2089 0 obj << +/D [2084 0 R /XYZ 90 317.583 null] +>> endobj +1878 0 obj << +/D [2084 0 R /XYZ 90 161.801 null] +>> endobj +2090 0 obj << +/D [2084 0 R /XYZ 90 147.231 null] +>> endobj +2083 0 obj << +/Font << /F63 247 0 R /F81 703 0 R /F50 215 0 R /F65 249 0 R /F11 291 0 R /F70 298 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2101 0 obj << +/Length 1685 +/Filter /FlateDecode +>> +stream +xÚÕYKsÛ6¾ëWðVi¦‚ñážÒLÒIšÎ¤‰›K’ÑÐ",±‘H•¢¬øßwA€A“r<‰;ӃÍ€%öÛÝow!­"ý6ùõjrñR²H#-©Œ®n"#% ”DWiôqJ0bl6'ãé.)·ÉbWlîÖ&-“Å&».“òîòòíŒâ©=#ñ´Ègs*ðôù&ÙïÝí;scê1“/ Èãœñ©R³ÏW¯'/®&ÿLlG¤Þ€PH1-·“Ÿq”Âû×ìCÇѱžµ8epÝDï'N°W*k„1•ˆHî{;#xš”ÉÖT¦Ü_ÖéKºx“Ž#…u4‡+ԉÙ /^ +Ü]@A»ÑzêÕÚ8,òÃöÀ¨ï‹wÝN³­É÷Y‘{èªÂ]“4E½¯ZÎAœÓhN9±r}ñuiv•6¬¢½\yôߍ+ ¯„tBߘ|U­/ʲ(íF Á` +qB¤,fTLÖ_˜œf &¬¦Y¾²ò@EÑY®À3™n–o݌à1b´•Ÿ›ZºÞ ò„aèh}¡8lR7¼L{ãFªµ_r;#bj–UQö¤IkØ $%ÒZ ¨„Û‚±ë!“öŒ;¤7¥­vÉ×Eý•E»æþȀބ +ÚäÅþA™ÿáiÌ;Ž(âM”çI•Yy:°ÄýåT¬µ³$O‡I+Õ8Ü Ò§ ?{´’/µ‡x®ÏüµÞ‡£¶2–bzžµ(³ñSҖÅWùŒƒ_'›,]<+Wˆªê‘ôpjÊùËb0d&N“ä?1SŒ¸Œ[!¥iÜBµXÝͳ|Ylwàq׃zê>çœR‚0<fȦ&\`B9òµ/Â`©_u(»žá(;XÕ¥lûì)ÛÞڔjçvÙÙ¾O³¹ãòX!ÂhHåãÄÍ$0BâƐ٠!n>BÜ+Þanx£nW¯m‹“о^µ+ÃÖœ¬²fš‚f ¸Ú~ñÞTÄ.9?h£X\›EY®I·éPœJ?DöUd2' +Iê7ö.îY*Ùlâ2M)f–Ù'ÈÄ÷r¶_rSÛޚ ? +endstream +endobj +2100 0 obj << +/Type /Page +/Contents 2101 0 R +/Resources 2099 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2107 0 R +/Annots [ 2081 0 R 2091 0 R 2092 0 R 2093 0 R 2094 0 R 2095 0 R 2096 0 R 2098 0 R ] +>> endobj +2081 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 660.541 212.778 671.41] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Length__Error__Exception) >> +>> endobj +2091 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 533.56 230.651 544.429] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2092 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 518.045 212.778 528.914] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Length__Error__Exception) >> +>> endobj +2093 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.708 392.842 250.895 421.908] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variable) >> +>> endobj +2094 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 348.424 230.651 359.294] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2095 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [478.809 348.3 513.996 379.269] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variable) >> +>> endobj +2096 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 211.491 230.651 222.36] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2098 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +2102 0 obj << +/D [2100 0 R /XYZ 90 757.935 null] +>> endobj +1921 0 obj << +/D [2100 0 R /XYZ 90 641.18 null] +>> endobj +2103 0 obj << +/D [2100 0 R /XYZ 90 626.8 null] +>> endobj +1922 0 obj << +/D [2100 0 R /XYZ 90 498.683 null] +>> endobj +2104 0 obj << +/D [2100 0 R /XYZ 90 484.304 null] +>> endobj +1923 0 obj << +/D [2100 0 R /XYZ 90 328.441 null] +>> endobj +2105 0 obj << +/D [2100 0 R /XYZ 90 314.061 null] +>> endobj +1924 0 obj << +/D [2100 0 R /XYZ 90 193.509 null] +>> endobj +2106 0 obj << +/D [2100 0 R /XYZ 90 179.13 null] +>> endobj +2099 0 obj << +/Font << /F63 247 0 R /F81 703 0 R /F50 215 0 R /F65 249 0 R /F70 298 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2117 0 obj << +/Length 1883 +/Filter /FlateDecode +>> +stream +xÚÕY]s›F}ׯà­h&Zï'°îSšI2Iۙ4qó’f4ki%ÓJ@Ùq}ï² bXö4i§6 ì×=÷ÞsÏ"l¼žýp5»x±@"Ñ(¸ÚqD $¸ZŸB‚cóÁ‡…*÷jYä»û½.Õr—^—ª¼¿¼|7§8tç$ ól¾ ‡/vªªló½ÞèæÎVæãœñ0N柯ÞÎ^^ÍþœØH³£˜‰`µŸ}úŒƒ5<À>dÜ5½ö§ ®»àÃì—vÆà¾Q éE0LHXS†p$¬eûfívÐÅ+û#(ìÀ,Ñt½ºÑ֊찿3šv¾±×R»t¥œun¯×nĪԪÖk4XÌÃ|Áâœ0E\Ú5_~Yé¢Nó¬ºôƯ­rë`{ÿúÄèÅX „³ùM6ç8¼U»t½|^n{ÕËn¥ÑuN€‰¤=dÊ|NExg<ŽY˜nÌ$`Ÿèá`åí[UÚ>þ¼f—QÛgëÊN˜åµm¬ò²ÔU‘gk{ß We/ël©ÒÜí£qŽéÕx·s"B½ªóÒÞW…Zi4°ø ¢ ’$ˆa $·[ýIgÛúfù²,óò‰Pb‰°E’EI¸ŠP­×i¶A5†,e²¾Á6K»ù3ÝÌn'o¬·ówÀUöÕݜ@lvkûz¥•¶o,–ðÌò?[d¼û€"Aƒ£O›q€^ÛÜ8úlÄ:Ž0¦uê˲Yeٍù d,– í Anz/å(“ˆDsœ""’Ù!Šxì/Sujð¸5ÿŒ‰ ‰íMž®ÝíXñòrcœïÖCkª6ìãeLü8—4Teª®wºZ~е5Ƌˈ#ˆ¥ÖÜ:_^ëå¦Ùän XŸZ/Œ‰]?›/ØÚ_id!Èý“$öæ%^Òv™p΂Đ5ï?Î !ý€éròë߁$œ·ŽômØÌ+•qö°¬Z—~?°Ïgkg`Ÿ¬÷&9A4¢>$Œ@ÂCÒ¶†Âzb tjvh®7®ONJÄ+NMUÛ>iå ‚žºªSÃ:¶/µ…¬ßÃXî…·….›ÎgôqLþ÷úBNé  #5Õ7i5’¢0orTt ð²'i¶Ê÷€i,yx—Ö7£íä !PŒ’£œi +%¬ÖÌØ̝gÚ>²Y.ßÈFZô +€qúd2,ÎAÓ¡ËAs³Ê³Z¥™)¿ævœ@™@4NK d29òނÇ"|¾«r»BÝóÃѸ÷" ދÏÂ)cÏyµ'¢è¨Àš…ƒ[H éÃý¥‚¡X>,)$CœMŠdBPp*{zÂÜ=INìUqª$šiŒvpE¥NÕÎÙ=¯Ùªîô—_î1Š’Î+ÅzŽØ ç©“sô ü÷ö>¬öCÖoX]OyúC­€”O‹‹²Š½hŸ°c8"WXXÎaK +ÞE̶± ñ9¶ä $æÈR<‰,;’Ø„À%<îØÏ,<úVÿ× +…‰‰¯¬MhÎI:¹Èº¤yaå{uÆ‹î´ ­»t·ó?@8·¿ž—¨„Ã>ë%àR2.‡¿gDpÅ#Îh~¾€¥Ì™À²¿É˜š'ø@н3ºÌd¿»m)ÀÞþdyÀÞ¼U† ì‡ ÷Zeۃں©Þdàöæ»Q'æ~­tùÝ\ˆÐaõ³Ê­z4AiµxYu"h#jãoÁ`ªº=“Z0þÚ֏³ó£‰TÀñœt˜ßÔuqyqqww‡V:diQ¢´¾(ŠÝÅi|g!¸1é +ܦ-,û¼ÔîÜ×|5‚EÜ|qßý ã~ä3 +øñoý0ìº +endstream +endobj +2116 0 obj << +/Type /Page +/Contents 2117 0 R +/Resources 2115 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2107 0 R +/Annots [ 2097 0 R 2108 0 R 2109 0 R 2110 0 R 2111 0 R 2112 0 R 2114 0 R ] +>> endobj +2097 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 674.432 230.651 685.302] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2108 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 658.492 212.778 669.361] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Length__Error__Exception) >> +>> endobj +2109 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.502 530.974 241.69 560.04] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variable) >> +>> endobj +2110 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 469.554 230.651 480.423] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2111 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.849 457.475 179.037 468.379] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variable) >> +>> endobj +2112 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 224.82 230.651 235.689] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2114 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +2118 0 obj << +/D [2116 0 R /XYZ 90 757.935 null] +>> endobj +1925 0 obj << +/D [2116 0 R /XYZ 90 638.069 null] +>> endobj +2119 0 obj << +/D [2116 0 R /XYZ 90 623.499 null] +>> endobj +1926 0 obj << +/D [2116 0 R /XYZ 90 437.4 null] +>> endobj +2120 0 obj << +/D [2116 0 R /XYZ 90 422.83 null] +>> endobj +1927 0 obj << +/D [2116 0 R /XYZ 90 321.115 null] +>> endobj +2121 0 obj << +/D [2116 0 R /XYZ 90 306.545 null] +>> endobj +1928 0 obj << +/D [2116 0 R /XYZ 90 203.774 null] +>> endobj +2122 0 obj << +/D [2116 0 R /XYZ 90 189.203 null] +>> endobj +2115 0 obj << +/Font << /F63 247 0 R /F81 703 0 R /F50 215 0 R /F65 249 0 R /F70 298 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2129 0 obj << +/Length 1734 +/Filter /FlateDecode +>> +stream +xÚíY[Ú8~çWämA*_b'ž]­ÔV½î®Ômg_¶­PD…„&¦”¿Ç—\€ƒÚ©Tí¼Ä±Ïõ;f^ôžÜô®ž H$ÁÍm q ‚8%ÁÍ4xß'16Œq•Ëd´ÊÛ¹šÉh‘Ž‹¤Ø^_¿PÜ÷Ã÷ól0¤÷Ÿ.’²t·oÕ­²ïT6Q / Y؏äàãÍëÞ³›Þç…p@¬ ¼¿†Œ÷Ó[#Ìã­5¡@8Œª%zž–nҎ`#†Õ¤$›v2&ÑjʬK +ˆÆ²–R(§–Î!+òÙv˜f“|¹Jt:^øWyá®ÓœQ‚†Fl0¤$D sðiü×^þh0d±[ÏxÔmy$Q,È9Ë#Fµå0äA.WzëDgØ1=Wî¦Ü–Z-ÝÛü֍ÍT¦ŠDçEÙå9¡fÄißqĉÜ×#˵ÛÇ)$xß>6EµÖnÖ<)ݬ,÷î‹b±÷žp"WyšéyõÚ0d Fà!FX«´¥|}gàøü5?à Ž…»ÏÓ©y◠Àõõ“—oÿÅl´I§*K³Ù° eNìÌqµÆ%Þ̈́”XsvJQQyrÛapˆÂ¦ˆ™=qÿÉv´‹Bvi …u„~ë >£u*½Ê´š¼C9à×VÊýÞa‚Äê­ôªc/A^ç68ŒtäԐŽl5$ÔcÛcëi¼:ꘝ+ðnU—r U®Úݛâ0WS¶k Qö{νw£ÀP®MÜ\~ «üèP Š­÷+½Q*ë0†q$bq‘1GðO 8ÚÏ«)ÉfÚôƒ’ ¨¤C<ô‘ycÊ))’¥Òª8ÒyŽõ™aÎZªk! 啎]@ª’­:³ž'º#BQˆ$¨ì×.×¥îò$AaÓƪʀL'i¦¦î1í +”Ìô\ ’¤Ô¯{–î¸z/C„›&ù ô ULÇ,p ÖvÒ€ Ž™PÛÎÜp’¹çufêÉšÆ $BCNŠ4±=Ό”Ð\î›Ås?š­—c@;hëÄH4˜ç¤‹F€Î?Y̵5 Ó AÍdþ}ù}à߃OÐKø„°|€ê[(…ð”‚ß3¥”âRÜ¥߃R°#”"”rçàâBJ±H—©Vӑ?ÀP_u‘ÀÒĄtÔyZQm˜<½3éˆÁ|ñ)ÆSH`Ð'…<{çN©%KΪ%OÊÑ1à›¼':Ó°oå3á·ÓF8 +÷ÎG^-WPe„›$á}eŽÖñ§¤¡#fОþ‘ãü*1/:шIRÇql^¹ÝÆ[·[²(s7¢²Û¼˜Xujä¥ro&u"”î]g‹„ CÍ éäȹ$n‚Zuò`bÃö€E“æ%¨]~À˜Vzìq:Y,šáɂSÒÓ»¢€×äNün\‰@‡äáìå‡s%—`G{ ^Ütº*“üaû.ûo%·ðTÅýûpVîñ^ÎÙ¬–48c’ÕïþÉp¿ôü=¿SäJr„üAÙEò¢B~Ô!ºbû˜_ ÿ]ã3ô1‚z§›KÐù4–áæ•áæzÈc$°8s$U{zÿ£²ñ]¿)ÛoÈ`„'b±ÿ0Î%â<ÜC¯7} »ôÅt:žé^·ªÕ¿N²Ù:™yQ†-·¶KMüÐ?¥*~pÞ÷0øW’­“EC4öeZ5Œ orUbYÁ;¥¼_œ3>ÕÝ=ÎÆDÊ°“š7ε^]_]m64)Ñ:KWJõ@ÄÕ!&6R„> endobj +2113 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 703.18 230.651 714.049] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2123 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 505.028 230.651 515.898] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2124 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 318.832 230.651 329.701] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2125 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 106.382 230.651 117.251] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2126 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +2130 0 obj << +/D [2128 0 R /XYZ 90 757.935 null] +>> endobj +1929 0 obj << +/D [2128 0 R /XYZ 90 674.284 null] +>> endobj +2131 0 obj << +/D [2128 0 R /XYZ 90 660.453 null] +>> endobj +1930 0 obj << +/D [2128 0 R /XYZ 90 488.088 null] +>> endobj +2132 0 obj << +/D [2128 0 R /XYZ 90 474.256 null] +>> endobj +1931 0 obj << +/D [2128 0 R /XYZ 90 301.891 null] +>> endobj +2133 0 obj << +/D [2128 0 R /XYZ 90 288.06 null] +>> endobj +1954 0 obj << +/D [2128 0 R /XYZ 90 89.441 null] +>> endobj +2127 0 obj << +/Font << /F63 247 0 R /F81 703 0 R /F50 215 0 R /F65 249 0 R /F11 291 0 R /F70 298 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2140 0 obj << +/Length 1899 +/Filter /FlateDecode +>> +stream +xÚíZYoãF~ׯàÛJÀ¨Ý÷á d‚d“ILfœ—h‰–‰H¤BRñèߧúà)ʒ7ž]$ñ‹I6»««ª¿ªúŠŽÖŽþ3y}3¹úR²È #©Œnî"ƒ#% ”D7«è§)Áˆ±Ùœ`Œ§»¸ØƋ]¾9Ü'«"^lÒÛ".××ogOÃðŒèižÍæTàé相,ýí»ä.qï’l™€<Οj<ûåæÍ䋛Éo +áˆ8„BŠ‰h¹üô ŽV0þ&=ŒŽܬmÄ)ƒë&z?ù~‚5†2„¥èƒ(‘ 'By=áë¬JÖ ïXœWͼØ`±f«j7²€Jz¸ø9wæÌ©–ÈPg¤Õ¼bÛ]‘ψ°ØÓ ͨšV÷‰¿)’r¿©ü}~×¾tâîi©ÇÍNæé*ÉÒl=¢Œ›d3y™owûÊÁÉoq{ð×xSæþ.Éîòbi…ò2¨¸l`”OÄ 4Ú )¨§„"¡§ˆ’F©ê>†Ç…38š3C‘d¼òô.Ƙ&+Ÿ¬òöo6þÆyÓÞìr¯¥½okIEL¨V…tLOˆ{CšãF.ÑԙbŒ9a +< *Sê\ñÖ¦¸ˆ·I•åuo}+§Að6 N#,h'N; z:CãíÏjó}¨s¨óð1’GF7¹Ý—Õ˜⺠ŠÛà`ÀBH¨Ob ’!&é“\üÉÀҞkæÄ0D sÀá]|rLÝxS££ôI¬FGmP n;°/kãª<ُàä\ ÖKÚ8c‘Ó¯kÏ:'í¡PÔX÷´™„Ô ԗDʄW†ãÌ?ï3[6œf0úûŒ +€dßn?RVyáÂÝ-¾£Ù~{ iÔ :Y‰¶Äxé¦P忺җ•~º­Fµ·aNð&¼}¸O² n·Ûæ.à "Zô£Ý«<|Œ]jn±Û$ÀpÕ}}tjÇЃ,-Ú±J6qÈ'U²¼ÏÒßö‰Mðg¢h†šÑú/>,“M±'"Þs”bÈÊ»Ó9À´îø:›qp~¼IW‹ÏŠõ~›@5nv:‘YرU‰µÑ`†£|°§aÈ4K“N™'…ð«1*8°ŽþQ ­šdg«±Œ éUËÇË +Gº­<¶˜8˪Â1_æifëT]x•þºJÁŸ%8ÒÃqNá$–CD¶ËÑ7€ªE‹DsN!M©]§è"å=¾H¹ya¼Í÷Ù +ãë¯ÞýˆÙb>FG‰ä\B^L‰ ÝCº„;.ùEä‘`ŽT[*N²G3~}Tá|£ü‘#¬ÉRŕȞ¤“òäøRS€¡ABŸ¤„úØiè# :úHðIú¨@h“öÒò–»œùD.þŸÈTÎ_¾?Ór9ö…\IÏ• +ÌQoÚ7 sTêÔrHv-{¿°±¡š…Ʀ³­¬·xȾq%·«Ø©Æ†Kĸù³g‘s} A ý±¾Z*Ïö5„“'ö5ö„? hs6GŠê·Oô5P¦•Ø0ð¦gÚmζ3ºW mAÀH¸ŠÞIĽǁ”Ìåsö8Ò Mɳö8/ÿÌùõ8äâ&‡>¥É‘®É™‘éŸésB҅—·Ï‘…>gø» ¡*õ¥?q? ßPL‡Ÿ‹ƒ„à˜¾µ0³d7<֌×?~ëi¯xÓ9–ð:ÎÖûxDYþVܹl´ C?”Iñ¯™Ӏ÷ïâloZêëA^”iD0²LλÃ}…}Ÿ$Á/Þ¿FõÝ7— +Z©H·Lö¾ªv×WWhY¢}–î +”VW€…«cð·Rô0Š4¹èÎ5( Ù6o(Ž"H0@‘‚E¤‘厞ã0© +endstream +endobj +2139 0 obj << +/Type /Page +/Contents 2140 0 R +/Resources 2138 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2107 0 R +/Annots [ 2134 0 R 2135 0 R 2137 0 R ] +>> endobj +2134 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 545.361 230.651 556.23] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2135 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 292.662 230.651 303.531] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2137 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +2141 0 obj << +/D [2139 0 R /XYZ 90 757.935 null] +>> endobj +2142 0 obj << +/D [2139 0 R /XYZ 90 733.028 null] +>> endobj +1955 0 obj << +/D [2139 0 R /XYZ 90 524.315 null] +>> endobj +2143 0 obj << +/D [2139 0 R /XYZ 90 509.744 null] +>> endobj +1956 0 obj << +/D [2139 0 R /XYZ 90 271.616 null] +>> endobj +2145 0 obj << +/D [2139 0 R /XYZ 90 257.046 null] +>> endobj +2138 0 obj << +/Font << /F63 247 0 R /F81 703 0 R /F11 291 0 R /F50 215 0 R /F70 298 0 R /F65 249 0 R /F23 216 0 R /F31 2144 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2155 0 obj << +/Length 1707 +/Filter /FlateDecode +>> +stream +xÚÝXIsÛ6¾ëWðԐ3 €ߒØÎ$mfRGÍÅÉx +–™P¤R^úëû°pe;nré‰$<¼÷}o°³v°óföj1;: }'AIHCgqå$؉B‚%Îbå\¸#?ðæcìn¹ÜðËm™ß_‹•ä—y¶”\Þòêr™ñe.¼9eØ}óª2¯çâJHÄ®(RøKXDˆïËâÝìt1û>#  +vˆÞšE(ò™“nf_°³‚ñwhÄݞµqêÃ3w>Îþšak>hNœ Œ'¢!"a`L:½KŶÎÊ¢:ÖJŒ¥mäÚªuþ„Ƥ'”Ä(‰3'0Ęú¶ðìÞð<[]¾”ëÝFõe»Óä>Gg ÷¥‚Ž‰6N \\Ëң̽-Ƅ¸Ù•æ±ÞšÀG$Jš%õuV™IÁÔG !ͤß'Ä0$íÆ÷"bGQ3« $B4›9é”"$@1àՈ‘ÂXV—àRåú~ži¹Ùò:3n¿Již« ð¬È¹ëÌ)Pâ( ýåÈÌóúæ-m€µ>º*SM× é¡+½!¼h(õ[Úyò­G°ËíÇZBòZ¬ìJYnš¥¢–ç†Â¬X›¡ÏÓ\ ÝÎ!! +ü”ôQZ%?Sʆ³.æ BðÌ#Ìåߔ"âRÙ%è|yRÞ݃Bè+÷(x¡Ú”[Ž|Ç`Dóf/ߎ~Mˆï5~˜ _ZüRÍgy5ÂïFÙ*Òºá¤ÚòÔ; +rïëvË Õf—ÌÌhÏjÿ£w’‹9 ±fA…†E‡†‚Õ O£­Xbä¿ðp.ê,ÆDtˆMûöAÈ!¦Ê4ëò +µ9I0Šƒh?ïµ…2N’g"ï3(œñOB^çe)^ P"᠈ǣêæ§èû1dMý(„ªæk¨ 7ŽìL"Qï½RÜã|”=ÆI€XÐr¸»±ª R¥õª6õ5/&¶ÞÌÇ´p3n]Kð; qcÖ?`AÀ€‚Ãf@ÅÄáY!¾ïx^M¥È¥ÁsuݖUvþÃúC»"¦š3 U/yØ (‚!‘Ñ”é– ·“d0xõÙ#>’ûFµlNh„ƒÖ&_‚^‰FÄéQó,o2ĉ¨R™µmæ/.½J ´z!µš½ ÜrùæÛ÷+óÔâԋ顦? +Žq%CŠ­´k•‘ÉÍ£gÉäÖZsð¬ë²fVHYˆëz Zïv§©: zç@w%™1ÓÝú,tw•"JUfdÉ+՞¨¡e^¦ßìpV˜±R®´§ÃªÔzš*%ªÞ›áMi„3X.PíÎüʳBpi~šq…šÂTŸ‡4rOyzmþ›6±i´ +ÕÀ¼ÐÖô ž©˜Ð–È]ޛ'7úòBï¶ö@b)ÁƅԄXó[å¬Ý:Fug¢ôáE—Ok±ìôÿ«Î¦×Õ¨¡>a°¥©¨ê‡ª-íBÙU=ÅbWƒ¯›¿§†úÔ}ÂP­ÔFëkÀ¾–».˜~kãv0|28ŽXû±kŶiàI½úTçÞ4¡ÚÁɖ†ÂI4êæ¶Rԝ›²;> +Ó6ï_d…òÊ/ÉiN#8ÇÅÉ0¥Lw¶gmºÛŸÓÙj†÷Í ŒñŒ %сü>Îë4¤(ÆTŸ,’ø‰WO¸x8ßAmÄ©”¥œ¾oŸp0C$f“÷ +‘É{Šüð! b8º¶…|/Ž&‡ŽÙ|לÙIe™FöÐNþ‡öA}xþýHÜW—Eý܃:4 }…Ñ®Îr´ð|é[´[4áԏÒêÅ8ĺ +Ú"4¾ ch?ã§Þÿéû>0 „0ÄÌõ%KcÁÈm>è{ÀÍ~6à™Ï? ‚æã]Ÿó›ë_[Qo¡˜É+íU©ú»ò…%ÕÂüžÐwÉÖ¸»ì.8ÖbDM9ÒÝ¢iz ߜæ폙ŽÅÎDÊB“6_×õöøèèöö¥ÚÙV¢¬>Únó£ý,ÐI!pŠºÓaCº·0wgœ!êç,"ÍLÜèØÛãñ_(Ç¡³ +endstream +endobj +2154 0 obj << +/Type /Page +/Contents 2155 0 R +/Resources 2153 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2107 0 R +/Annots [ 2136 0 R 2146 0 R 2147 0 R 2148 0 R 2149 0 R 2150 0 R 2152 0 R ] +>> endobj +2136 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.717 703.18 230.651 714.049] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Invalid__Argument__Exception) >> +>> endobj +2146 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 531.187 149.098 541.718] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variable_293bf4ae6670add8afd68cbca2edd0e5) >> +>> endobj +2147 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 493.399 136.665 503.93] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variable_df4acacc53bd647f2c4ccaac0aa7643a) >> +>> endobj +2148 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.921 455.238 173.486 466.142] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variable_a771ef39be258755e151cd5edb617e94) >> +>> endobj +2149 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.302 455.238 212.49 466.142] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variable) >> +>> endobj +2150 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [184.141 345.221 219.329 356.125] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variable) >> +>> endobj +2152 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +2156 0 obj << +/D [2154 0 R /XYZ 90 757.935 null] +>> endobj +591 0 obj << +/D [2154 0 R /XYZ 90 637.876 null] +>> endobj +202 0 obj << +/D [2154 0 R /XYZ 90 629.623 null] +>> endobj +2157 0 obj << +/D [2154 0 R /XYZ 90 549.255 null] +>> endobj +2158 0 obj << +/D [2154 0 R /XYZ 90 511.586 null] +>> endobj +2159 0 obj << +/D [2154 0 R /XYZ 90 473.798 null] +>> endobj +2160 0 obj << +/D [2154 0 R /XYZ 90 407.972 null] +>> endobj +2161 0 obj << +/D [2154 0 R /XYZ 90 296.635 null] +>> endobj +2162 0 obj << +/D [2154 0 R /XYZ 90 273.949 null] +>> endobj +2163 0 obj << +/D [2154 0 R /XYZ 90 273.949 null] +>> endobj +592 0 obj << +/D [2154 0 R /XYZ 90 139.504 null] +>> endobj +206 0 obj << +/D [2154 0 R /XYZ 90 131.251 null] +>> endobj +2153 0 obj << +/Font << /F63 247 0 R /F81 703 0 R /F50 215 0 R /F65 249 0 R /F70 298 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2167 0 obj << +/Length 686 +/Filter /FlateDecode +>> +stream +xڍTMSÛ0½ûWè†u°"ɖ?r+¥0¥e†— 0Œb+Á­üQÙ&ðï+[rpÂÐé!ñJ–žß¾}»lÎiê,ÎC$( iÒ H0ˆB‚% ÍÁK0òôÆØm¸*ùcSË×'‘+þ(‹µâêu¹¼… u¹*øZŠöq%:èQ†Ýϒ·­ oÄF(HbWT™Ðp~'nLáCzé|I?Ñ|0 ã÷Y„"Ÿ¬tî0Èõþ%Ð4’ìÆS%¨¯Ÿ¬œþg.ÔG8d&—ë~-‹ÌºåZ3ãó¾Êº¢®Ú‘΄·8gxFBø1ð(EáxO);¸crP[›Ìͅî<¦¥»…„C‰æ÷ô©È=fXÿÈæÄ' Ö|Â`à3ð(ðH€’ 0|NûBæVñîI˜@”M÷jÂvªL½1ÏgËȬŠ*b÷E´è +úz~‚°–$ðaþÌ/ˆXǜ‰ŽRäÿL´™*šAêþH`¬µ $蓹󋌞!e.G}WH”BŸ¹JˆÕ»dÆCVâ“YJ„¹/ßMkø‰PHmÓI©¼ÎúRTŽ[›ZMrVØìÍÕ;H°Ëíb+*¡x7%»QuyT‰M-e=ÜÕڊc*ÅòÐ {«1Ēà«}h,4—ìàÊq£…±îøûlì/]±%‘fgú‹%ˆ±àHÇëAìaVØå40Ìò»™fq9çj^ójÛó­…úZuBmF™3»õ³ê2æZݯxÕs ÷ ô<–Zµûb¤MI‡¾BÐó5ÔJ«‹ã7˜¢oƒÅÙ,EÊB“H¿S|êºf¹Xìv;”µ¨¯ŠF¡¢[4\¼Ÿo(D7iD’ eoª²V#ÝI‘ž¹~¼H_²£·¨ôÁr4#:®ã_ׯn– +endstream +endobj +2166 0 obj << +/Type /Page +/Contents 2167 0 R +/Resources 2165 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2107 0 R +/Annots [ 2151 0 R 2164 0 R ] +>> endobj +2151 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 697.621 170.687 708.151] +/Subtype /Link +/A << /S /GoTo /D (classparma__polyhedra__library_1_1Variables__Set_961dfccd93ec291961f9938db0c86b2d) >> +>> endobj +2164 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +2168 0 obj << +/D [2166 0 R /XYZ 90 757.935 null] +>> endobj +2169 0 obj << +/D [2166 0 R /XYZ 90 716.221 null] +>> endobj +2170 0 obj << +/D [2166 0 R /XYZ 90 716.221 null] +>> endobj +2171 0 obj << +/D [2166 0 R /XYZ 90 659.927 null] +>> endobj +2165 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F70 298 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2225 0 obj << +/Length 963 +/Filter /FlateDecode +>> +stream +xÚ͙]“š0†ï÷Wp‰3Õ& ½ÛZ»kÇÝ¥[Ûi»íd"D› LÀÝÚ_ßD¨‹htD{¡¨äÉ9'ïɉ@›h@»º+׷Ë×ïmSƒí–Ù¶ m8Ö\ 9Àiµ-ñ-Ðô~ßŸÃ‹F¯ß[@s[®mزКhµÛvþ<ä³x§$ö‰l¨Añ°aiM[®eå%˜G%,œý"Ç(¤#Žùìͯø‰Å¯ŠQ5.‡–î¯.´‡¦aÝv—¨D÷†Y¦Iÿœ4ã˜ÆÙþ47}yœBíÀ±À2(F°6ßÎÞóMk0Ü<áÓ;xBbÂqÆxÑæ8Û`ì 0éÙhJ¦IìЈÄ)qp HpŽµp¼ù[ŠÞØ8ÿ„³GâguúÇRôOƐX§¤-}Bøî)´™qÜ0,ýFLð¤Îã@¯–‰Nj‡2Ìtyû uïn¼Aïkø­’Æóèn@’“Àsßóq]ø}ˆÑVñWêSŠ‚i”Ô™y«2‘!†|˜Ž…@!×Âü¦·¸Ù|éÆ^Ž†AÞlW¨¯šÎt[ .½½¾ÿLôLÓx‚pšÒI\gd©$ô›Šý`€N»Cɪ¤}¸Â©sý-6Eb`œ e=wÝ=0¯÷ÿc´KŒ)s!ß÷w׿VÒԐjWR²tʅ䱥ÊRÕ*Wÿê„,¦£bF*ìSrÏZ»¸ %®( sa£Ù uC!i5¹ÌTq‹}œ‘X¼ÖÄÕ>º¸Ú +ZÔêi$›…k$«›££à£®àà,DÅ>GDº×s¬ukԗ„PÇáôÔhå„ó®(çjBPO¨ì¶õ_¿­:ב1áòðë *DU@%ÓM?ƒT—ýÕ»ñÊâÉÝÓû(;ûÜhýrP‡ŠÞ¹C杇S¹l$er?Í÷—h<}¹®¬þj8Ŭ`•,‘gG+'4çÈåhœR1ÍCw!{J%ߏYl9IJOsºb£\CúgG}|:SÁd•t르}ôRÚT®!Š* +³K4lt€>KΙ¹'$¡˜>J)9ÄÕò_ÑE³úL/¯; —•ë7Ôϔ²†ÕÙZ‰õ†’Š—n +endstream +endobj +2224 0 obj << +/Type /Page +/Contents 2225 0 R +/Resources 2223 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2228 0 R +/Annots [ 2172 0 R 2173 0 R 2174 0 R 2175 0 R 2176 0 R 2177 0 R 2178 0 R 2179 0 R 2180 0 R 2181 0 R 2182 0 R 2183 0 R 2184 0 R 2185 0 R 2186 0 R 2187 0 R 2188 0 R 2189 0 R 2190 0 R 2191 0 R 2192 0 R 2193 0 R 2194 0 R 2195 0 R 2196 0 R 2197 0 R 2198 0 R 2199 0 R 2200 0 R 2201 0 R 2202 0 R 2203 0 R 2204 0 R 2205 0 R 2206 0 R 2207 0 R 2208 0 R 2209 0 R 2210 0 R 2211 0 R 2212 0 R 2213 0 R 2214 0 R 2215 0 R 2216 0 R 2217 0 R 2218 0 R 2219 0 R 2220 0 R 2221 0 R ] +>> endobj +2172 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 671.898 278.601 682.802] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +2173 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 647.988 278.601 658.892] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +2174 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.166 624.078 289.122 634.981] +/Subtype /Link +/A << /S /GoTo /D (page.50) >> +>> endobj +2175 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 612.122 278.601 623.026] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +2176 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.166 588.212 289.122 599.116] +/Subtype /Link +/A << /S /GoTo /D (page.51) >> +>> endobj +2177 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 576.257 278.601 587.161] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +2178 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 552.347 278.601 563.25] +/Subtype /Link +/A << /S /GoTo /D (page.77) >> +>> endobj +2179 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 528.436 278.601 539.34] +/Subtype /Link +/A << /S /GoTo /D (page.77) >> +>> endobj +2180 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.166 504.526 289.122 515.43] +/Subtype /Link +/A << /S /GoTo /D (page.50) >> +>> endobj +2181 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 492.571 278.601 503.475] +/Subtype /Link +/A << /S /GoTo /D (page.75) >> +>> endobj +2182 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 468.66 278.601 479.564] +/Subtype /Link +/A << /S /GoTo /D (page.75) >> +>> endobj +2183 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.166 444.75 289.122 455.654] +/Subtype /Link +/A << /S /GoTo /D (page.50) >> +>> endobj +2184 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 420.84 278.601 431.744] +/Subtype /Link +/A << /S /GoTo /D (page.71) >> +>> endobj +2185 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 396.929 278.601 407.833] +/Subtype /Link +/A << /S /GoTo /D (page.72) >> +>> endobj +2186 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.043 373.736 204.998 383.923] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2187 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 349.109 278.601 360.013] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +2188 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.713 303.28 175.668 314.184] +/Subtype /Link +/A << /S /GoTo /D (page.54) >> +>> endobj +2189 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 279.37 278.601 290.274] +/Subtype /Link +/A << /S /GoTo /D (page.78) >> +>> endobj +2190 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 255.46 278.601 266.364] +/Subtype /Link +/A << /S /GoTo /D (page.72) >> +>> endobj +2191 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 231.549 278.601 242.453] +/Subtype /Link +/A << /S /GoTo /D (page.72) >> +>> endobj +2192 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 207.639 278.601 218.543] +/Subtype /Link +/A << /S /GoTo /D (page.79) >> +>> endobj +2193 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 183.729 278.601 194.633] +/Subtype /Link +/A << /S /GoTo /D (page.79) >> +>> endobj +2194 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 159.818 278.601 170.722] +/Subtype /Link +/A << /S /GoTo /D (page.65) >> +>> endobj +2195 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 135.908 278.601 146.812] +/Subtype /Link +/A << /S /GoTo /D (page.65) >> +>> endobj +2196 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [283.069 102.035 295.024 112.939] +/Subtype /Link +/A << /S /GoTo /D (page.30) >> +>> endobj +2197 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 92.137 140.809 100.984] +/Subtype /Link +/A << /S /GoTo /D (page.31) >> +>> endobj +2198 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [493.648 671.898 505.603 682.802] +/Subtype /Link +/A << /S /GoTo /D (page.50) >> +>> endobj +2199 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.524 648.705 421.479 658.892] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2200 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.02 624.078 488.975 634.981] +/Subtype /Link +/A << /S /GoTo /D (page.37) >> +>> endobj +2201 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [481.214 600.167 493.17 611.071] +/Subtype /Link +/A << /S /GoTo /D (page.32) >> +>> endobj +2202 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.524 576.974 421.479 587.161] +/Subtype /Link +/A << /S /GoTo /D (page.23) >> +>> endobj +2203 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [483.127 552.347 495.083 563.25] +/Subtype /Link +/A << /S /GoTo /D (page.76) >> +>> endobj +2204 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [483.127 528.436 495.083 539.34] +/Subtype /Link +/A << /S /GoTo /D (page.65) >> +>> endobj +2205 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [483.127 504.526 495.083 515.43] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +2206 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.524 481.333 421.479 491.519] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2207 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.524 457.422 421.479 467.609] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2208 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.524 423.549 421.479 433.736] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2209 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [483.127 398.922 495.083 409.826] +/Subtype /Link +/A << /S /GoTo /D (page.71) >> +>> endobj +2210 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.02 375.012 488.975 385.915] +/Subtype /Link +/A << /S /GoTo /D (page.37) >> +>> endobj +2211 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.524 341.856 421.479 352.042] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2212 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.524 317.945 421.479 328.132] +/Subtype /Link +/A << /S /GoTo /D (page.25) >> +>> endobj +2213 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [493.648 293.318 505.603 304.222] +/Subtype /Link +/A << /S /GoTo /D (page.51) >> +>> endobj +2214 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [483.127 269.408 495.083 280.311] +/Subtype /Link +/A << /S /GoTo /D (page.76) >> +>> endobj +2215 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [493.648 235.535 505.603 246.438] +/Subtype /Link +/A << /S /GoTo /D (page.52) >> +>> endobj +2216 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [483.127 211.624 495.083 222.528] +/Subtype /Link +/A << /S /GoTo /D (page.77) >> +>> endobj +2217 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [483.127 177.751 495.083 188.655] +/Subtype /Link +/A << /S /GoTo /D (page.73) >> +>> endobj +2218 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [483.127 153.841 495.083 164.745] +/Subtype /Link +/A << /S /GoTo /D (page.73) >> +>> endobj +2219 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [498.071 153.841 510.027 164.745] +/Subtype /Link +/A << /S /GoTo /D (page.74) >> +>> endobj +2220 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.524 130.648 421.479 140.834] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2221 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [483.436 94.065 495.392 104.969] +/Subtype /Link +/A << /S /GoTo /D (page.58) >> +>> endobj +2226 0 obj << +/D [2224 0 R /XYZ 90 757.935 null] +>> endobj +2227 0 obj << +/D [2224 0 R /XYZ 90 696.969 null] +>> endobj +2223 0 obj << +/Font << /F63 247 0 R /F50 215 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2298 0 obj << +/Length 1362 +/Filter /FlateDecode +>> +stream +xÚÅZ[oâ8~çWäm‰´uí\œ¤Z­DÛ´CZ†2Òh:#ËC³K.ㄶ̯_çSRÚ8Üú$ö9ŸÏý•‰•ËÆé q|uÅÖ°2+T,Œ€©!e0Rîšíës÷«úcp¥HP·Ä¾ì…m¤Oî ñ³ÄC¨ l³iK7•¡ß¸û•‘x~¥@ ;¶ò”­òCÓÅçT¹m|nÀ—@LX¢ ŽØÌù]öݖŠjÜ>¹é÷³Š`ó‹jÀf«“Db³f*GÇ,võzrEU 6UÍlRâ ããt+²?³#äØù¤8Dÿ²¡Üi&ljfñ>Ç((¯á°‚kð©uý‘X¸7"—,`œ&!'ՆÍyÄ^#»@dH š¤ˆ¦^ÀޔJD¹OINçlÄ©X|Ï)ŸŸœ¬¦ŒîȂ‰BqȏB£¥ž•súd9äɱÀ &„Ʊ7 ê£êÂ ‘eKÈçÆ„ùQ2'ÃpúÔÛ‘Š„!ñÄ£Sr1 †‰÷¶Œ2^¥l– ]w€m¢WHÎÂÑۖ½½Ä°ýŽ‘“³Éü%fÙ) D(¡D/&#/þ7µr2æ¡¿G<ø]£ÂK<1M¼ø;„½ŸnºíéñPìõ+™HBg/žšmëÐ`2£–ÿj׉%ÀUV÷öV"WáCå‡ Ï稩ç{ ‘ÓOýoP',Ï §Bñô@nd׀™†iyŒø ;íkwOš4¤D´QZ—Í¡–$ÊI”&œT1õ5rF¤u¢ËDŸF$Ž„„EöY Pñ>mYFJS|ÈLŽkdònëk»ÛþV”Ð훏 M>}^ÿ‹í3e–pÜ5«6` àÝöu•–c|/X +q¹t¹EÓ10 ¥`]X3v&V\W¬ký—ź,<~ ï¼j1œzXÈmB“YüÒþº:œ9Y9‡0J<_„…œþtÆÞIJ‹¢N“ÏMŠÈû•gçîJg€÷FÊXzƒÔÝs’²Ÿ–}7§·û˜Â\>i¯Yj€¨°—&ÔS­Ùê·ºîÀíؔKþK}&ˆÖ÷ðŒäXÕ4(‰ÿtNúlÌ8 †™»_ ôb‡°,ÛXÌûþʗ¬ÌèÚrÁ` ˜–½Xð÷ +°Œå‚ªs¾®‰!ÐeStBO+éjeÖ©aÍäT.4áûEïvÔfQÄ8¹gÁ¨hkˆ7.Z:L6ª‰e=è,dãÔ¯ÓÙÀÐcA%7íÅ̶¥yT+*ž…Á„ÏRªb£o椿ÛyœTß-øÄ¢ÃõªåelË@ò FµólpI\ÎCNŽ²¨¾®ïpŸ‡,’ñžw›¼«fWöpÆ3Îòü]³y. oä¥òèŵ»ð5¡h; +;8 §óf ¸®% ×ÞÌpë•vµÁ,ï^j–&ð­[“íè,+­=VJe)® …ºåtéHŒ0ÞÄÒÒÒ¿h’¬W‘ÝœÌ|‘•vš ¸¸›šäשቧ㮄‹¾¢ŠÚÆ;,˜$; ê¯ÀԒ\'¯¿Ü爳8®ÍmñY¾9Ç6€Ø–½8_\˜càXº]\˜›0Íb¨2x(î3Š9ž_\v,ÊÖÅÝG~ªüG­«‘üї˜ñ?TÓlÆùï. ftšÿMø˜rg<Sþ‚´k¯PtAê–-fE¹0þSßþIÿœ`¾8¢fb`£å_’$:9>~zzÃÌ/âÀKŽ£hz¼"ñ’ 2€…œ•qÈsd~Èó±Á‘n!`êÂ8-± -®úÄB?0€êBÿéúŒH +endstream +endobj +2297 0 obj << +/Type /Page +/Contents 2298 0 R +/Resources 2296 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2228 0 R +/Annots [ 2222 0 R 2229 0 R 2230 0 R 2231 0 R 2232 0 R 2233 0 R 2234 0 R 2235 0 R 2236 0 R 2237 0 R 2238 0 R 2239 0 R 2240 0 R 2241 0 R 2242 0 R 2243 0 R 2244 0 R 2245 0 R 2246 0 R 2247 0 R 2248 0 R 2249 0 R 2250 0 R 2251 0 R 2252 0 R 2253 0 R 2254 0 R 2255 0 R 2256 0 R 2257 0 R 2258 0 R 2259 0 R 2260 0 R 2261 0 R 2262 0 R 2263 0 R 2264 0 R 2265 0 R 2266 0 R 2267 0 R 2268 0 R 2269 0 R 2270 0 R 2271 0 R 2272 0 R 2273 0 R 2274 0 R 2275 0 R 2276 0 R 2277 0 R 2278 0 R 2279 0 R 2280 0 R 2281 0 R 2282 0 R 2283 0 R 2284 0 R 2285 0 R 2286 0 R 2287 0 R 2288 0 R 2289 0 R 2290 0 R 2291 0 R 2292 0 R 2293 0 R 2295 0 R ] +>> endobj +2222 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.043 708.674 204.998 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.25) >> +>> endobj +2229 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.043 684.764 204.998 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.25) >> +>> endobj +2230 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.043 660.854 204.998 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2231 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [283.782 636.226 295.737 647.13] +/Subtype /Link +/A << /S /GoTo /D (page.39) >> +>> endobj +2232 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [283.782 612.316 295.737 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.39) >> +>> endobj +2233 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 578.841 278.601 589.745] +/Subtype /Link +/A << /S /GoTo /D (page.78) >> +>> endobj +2234 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 545.033 140.809 553.88] +/Subtype /Link +/A << /S /GoTo /D (page.55) >> +>> endobj +2235 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 519.065 278.601 529.969] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +2236 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 485.591 278.601 496.495] +/Subtype /Link +/A << /S /GoTo /D (page.70) >> +>> endobj +2237 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 461.681 278.601 472.585] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +2238 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.166 437.77 289.122 448.674] +/Subtype /Link +/A << /S /GoTo /D (page.51) >> +>> endobj +2239 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.801 416.251 202.756 427.155] +/Subtype /Link +/A << /S /GoTo /D (page.20) >> +>> endobj +2240 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.043 383.494 204.998 393.68] +/Subtype /Link +/A << /S /GoTo /D (page.25) >> +>> endobj +2241 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.043 359.583 204.998 369.77] +/Subtype /Link +/A << /S /GoTo /D (page.25) >> +>> endobj +2242 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 334.956 278.601 345.86] +/Subtype /Link +/A << /S /GoTo /D (page.78) >> +>> endobj +2243 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 311.046 278.601 321.949] +/Subtype /Link +/A << /S /GoTo /D (page.78) >> +>> endobj +2244 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.043 287.852 204.998 298.039] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2245 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [260.539 263.225 272.494 274.129] +/Subtype /Link +/A << /S /GoTo /D (page.37) >> +>> endobj +2246 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [278.272 239.315 290.228 250.218] +/Subtype /Link +/A << /S /GoTo /D (page.31) >> +>> endobj +2247 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 205.84 278.601 216.744] +/Subtype /Link +/A << /S /GoTo /D (page.77) >> +>> endobj +2248 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 172.032 140.809 180.878] +/Subtype /Link +/A << /S /GoTo /D (page.55) >> +>> endobj +2249 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.043 146.781 204.998 156.968] +/Subtype /Link +/A << /S /GoTo /D (page.25) >> +>> endobj +2250 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 122.154 278.601 133.058] +/Subtype /Link +/A << /S /GoTo /D (page.65) >> +>> endobj +2251 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.59 122.154 293.545 133.058] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +2252 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.043 98.961 204.998 109.147] +/Subtype /Link +/A << /S /GoTo /D (page.25) >> +>> endobj +2253 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [483.127 719.912 495.083 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +2254 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [498.071 719.912 510.027 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +2255 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [493.648 696.002 505.603 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.49) >> +>> endobj +2256 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.524 672.809 421.479 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2257 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [493.648 638.219 505.603 649.123] +/Subtype /Link +/A << /S /GoTo /D (page.52) >> +>> endobj +2258 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.524 615.026 421.479 625.212] +/Subtype /Link +/A << /S /GoTo /D (page.25) >> +>> endobj +2259 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.524 591.115 421.479 601.302] +/Subtype /Link +/A << /S /GoTo /D (page.25) >> +>> endobj +2260 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [493.648 566.488 505.603 577.392] +/Subtype /Link +/A << /S /GoTo /D (page.52) >> +>> endobj +2261 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.524 533.332 421.479 543.519] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2262 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [500.263 508.704 512.218 519.608] +/Subtype /Link +/A << /S /GoTo /D (page.39) >> +>> endobj +2263 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.726 496.749 423.681 507.653] +/Subtype /Link +/A << /S /GoTo /D (page.25) >> +>> endobj +2264 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [500.816 484.794 512.772 495.698] +/Subtype /Link +/A << /S /GoTo /D (page.28) >> +>> endobj +2265 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [474.829 472.839 486.784 483.743] +/Subtype /Link +/A << /S /GoTo /D (page.29) >> +>> endobj +2266 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [387.955 460.884 399.911 471.788] +/Subtype /Link +/A << /S /GoTo /D (page.30) >> +>> endobj +2267 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [402.899 460.884 414.855 471.788] +/Subtype /Link +/A << /S /GoTo /D (page.31) >> +>> endobj +2268 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [391.82 448.928 403.776 459.832] +/Subtype /Link +/A << /S /GoTo /D (page.31) >> +>> endobj +2269 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [449.773 436.973 461.728 447.877] +/Subtype /Link +/A << /S /GoTo /D (page.31) >> +>> endobj +2270 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [461.289 425.018 473.244 435.922] +/Subtype /Link +/A << /S /GoTo /D (page.32) >> +>> endobj +2271 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.416 413.78 386.371 423.967] +/Subtype /Link +/A << /S /GoTo /D (page.32) >> +>> endobj +2272 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [465.404 401.108 477.359 412.012] +/Subtype /Link +/A << /S /GoTo /D (page.33) >> +>> endobj +2273 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [499.725 389.153 511.68 400.057] +/Subtype /Link +/A << /S /GoTo /D (page.33) >> +>> endobj +2274 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [458.778 377.197 470.734 388.101] +/Subtype /Link +/A << /S /GoTo /D (page.34) >> +>> endobj +2275 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [493.099 365.242 505.054 376.146] +/Subtype /Link +/A << /S /GoTo /D (page.35) >> +>> endobj +2276 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [390.715 341.332 402.67 352.236] +/Subtype /Link +/A << /S /GoTo /D (page.35) >> +>> endobj +2277 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [457.095 329.377 469.05 340.281] +/Subtype /Link +/A << /S /GoTo /D (page.36) >> +>> endobj +2278 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [384.628 317.422 396.583 328.326] +/Subtype /Link +/A << /S /GoTo /D (page.37) >> +>> endobj +2279 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.818 306.184 369.774 316.37] +/Subtype /Link +/A << /S /GoTo /D (page.37) >> +>> endobj +2280 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.335 294.229 357.29 304.415] +/Subtype /Link +/A << /S /GoTo /D (page.37) >> +>> endobj +2281 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [350.875 281.556 362.83 292.46] +/Subtype /Link +/A << /S /GoTo /D (page.37) >> +>> endobj +2282 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [343.114 269.601 355.069 280.505] +/Subtype /Link +/A << /S /GoTo /D (page.37) >> +>> endobj +2283 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [491.416 257.646 503.371 268.55] +/Subtype /Link +/A << /S /GoTo /D (page.38) >> +>> endobj +2284 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [480.338 245.691 492.293 256.595] +/Subtype /Link +/A << /S /GoTo /D (page.38) >> +>> endobj +2285 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [366.366 233.735 378.321 244.639] +/Subtype /Link +/A << /S /GoTo /D (page.39) >> +>> endobj +2286 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [371.906 221.78 383.861 232.684] +/Subtype /Link +/A << /S /GoTo /D (page.39) >> +>> endobj +2287 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.222 209.825 382.177 220.729] +/Subtype /Link +/A << /S /GoTo /D (page.39) >> +>> endobj +2288 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.656 185.915 391.612 196.819] +/Subtype /Link +/A << /S /GoTo /D (page.39) >> +>> endobj +2289 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [390.715 162.004 402.67 172.908] +/Subtype /Link +/A << /S /GoTo /D (page.40) >> +>> endobj +2290 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [427.775 150.049 439.73 160.953] +/Subtype /Link +/A << /S /GoTo /D (page.40) >> +>> endobj +2291 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [377.983 138.094 389.938 148.998] +/Subtype /Link +/A << /S /GoTo /D (page.41) >> +>> endobj +2292 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [390.715 114.184 402.67 125.088] +/Subtype /Link +/A << /S /GoTo /D (page.41) >> +>> endobj +2293 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [492.522 102.229 504.477 113.133] +/Subtype /Link +/A << /S /GoTo /D (page.41) >> +>> endobj +2295 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +2299 0 obj << +/D [2297 0 R /XYZ 90 757.935 null] +>> endobj +2296 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F11 291 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2399 0 obj << +/Length 1583 +/Filter /FlateDecode +>> +stream +xÚÍZ]sÚ8}çWøma¦8–lÜÙٙmš¦¤IÃ6´ÓnÛÑ[€ºþZÉ,MýJ¶aÁ%–ÓÎ>äÃ6œ{îÕÕ¹W’-ciXÆeïÙ¬wöÂu ßô]Û5f ÷ Ï&´1 ýÉëçïŸgWÆ8¦åxâ{Ń1”w{³Þß= nZ(¾ =Ós ĽŸ-#÷¯ Ëtü±±)>#Û#ã®÷GÏÚ'­[Xtai/Ã,Æ(K£û F3ÌîŸ>½¦ Á ]|Íᜦ |ßC` 0}Xœ§d1°aÿ“eÙ%Iþ¤p¢dϖ•o.{ÆÇ¡ ­þÈ®ž—,á1Г0{N b ÂH-ç‡ÓrK»u¬â2úY!š ا1áÿFoñtC“µ’üY#önècFñn›³êx¹)Éé7¥ôy?ÉAXwMr°H÷G1¬yºfCÊ¿ÈdS፻yÝ£sÁþ ‰°N^'|³K¢o§¹h´£—p¾v7½dkå¬ëëtÓ? ˜^›ïŽ•¹~›¯AlI­‰àyúP¼Vý¯(é®9ۆë8¦kN°&ñ ’ýQ쌥²9숾ÛÿI½ðR•œÐÇÅZ ÒnN+PŠÂuœ=2=+jÏ^¾ùÓrІ†$‘õsN—ªÉí5cÎeó@BÔ>Œv{܎á¬AWá(º_ŔXÈ©f\üÆ1Ûyéù§¶°ïG –ÆÏSiCkEãBmØ9‰ÊâÝ RHb Öé‰\«ëyîªðJ‰åyå:(Í¢lÔj:;2a2©q5áë¸E…m÷s¥¥,+‘è&£Îã°uu ¯\_z͋%9—O#žînÕ²:OCÒMÖåfh®ƒÊb©öªdÃ,øBºÑ‹hLóîr«g¤‹ÜŽU+ÂSMw‹øUn–µÕke»Í"ÓDˬÛÖl³P0RMÞ ÍWúKEª>„ÊO «¹<ð[8ÇQ;“­Ò\Âv¤x¯‘@+º\µ?P¡šÓ‚sg]Ü£5—"-+|%')ÌbÀhG÷è4­ß €ÕÇY·L.b‡Ddü4ÝÇ:Ù¥fÛöcôX`Þ9ËDž­ëI*`Ë*›¶¡TÛ9mÎgÇ֑–Ú~W¼£hzÌ9º#yKsµ¨Oo'¯gÅöà1rÓû +l«:û+)Ù¢˜AÊ2bt•Ï÷öUx©¹IãèìVNo¯…GVÿÃëۛÉï×èüöfz}ñ~2ûðƒ£s~Ñlá þú;6-w¬ûöÏö­×ô=g\½õ}ÂjŸi¶"åaÓî,§ºÜKyYÝ”ûÌ«Ç8Y®Åú¡¼š8SÜzË ûeaŸ—×78Yã¨üÿ“­êXO*WyÓ2噘xÌÁÐPwd—2Ûÿ^É7¬àž‹6tÍ1ؽGµÊóìéÙÙf³1n®š1“ægYDº(F¦v'i‹”•Ìâ”LŒ¡ã:bh=ñ%°];ˆÆEû`ÖÇñ_U"™J +endstream +endobj +2398 0 obj << +/Type /Page +/Contents 2399 0 R +/Resources 2397 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2228 0 R +/Annots [ 2294 0 R 2300 0 R 2301 0 R 2302 0 R 2303 0 R 2304 0 R 2305 0 R 2306 0 R 2307 0 R 2308 0 R 2309 0 R 2310 0 R 2311 0 R 2312 0 R 2313 0 R 2314 0 R 2315 0 R 2316 0 R 2317 0 R 2318 0 R 2319 0 R 2320 0 R 2321 0 R 2322 0 R 2323 0 R 2324 0 R 2325 0 R 2326 0 R 2327 0 R 2328 0 R 2329 0 R 2330 0 R 2331 0 R 2332 0 R 2333 0 R 2334 0 R 2335 0 R 2336 0 R 2337 0 R 2338 0 R 2339 0 R 2340 0 R 2341 0 R 2342 0 R 2343 0 R 2344 0 R 2345 0 R 2346 0 R 2347 0 R 2348 0 R 2349 0 R 2350 0 R 2351 0 R 2352 0 R 2353 0 R 2354 0 R 2355 0 R 2356 0 R 2357 0 R 2358 0 R 2359 0 R 2360 0 R 2361 0 R 2362 0 R 2363 0 R 2364 0 R 2365 0 R 2366 0 R 2367 0 R 2368 0 R 2369 0 R 2370 0 R 2371 0 R 2372 0 R 2373 0 R 2374 0 R 2375 0 R 2376 0 R 2377 0 R 2378 0 R 2379 0 R 2380 0 R 2381 0 R 2382 0 R 2383 0 R 2384 0 R 2385 0 R 2386 0 R 2387 0 R 2388 0 R 2389 0 R 2390 0 R 2391 0 R 2392 0 R 2393 0 R 2394 0 R 2396 0 R ] +>> endobj +2294 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.86 708.674 189.815 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.42) >> +>> endobj +2300 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.176 684.764 188.131 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.43) >> +>> endobj +2301 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.107 660.854 164.062 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.44) >> +>> endobj +2302 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.393 636.943 170.348 647.13] +/Subtype /Link +/A << /S /GoTo /D (page.44) >> +>> endobj +2303 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [189.178 612.316 201.133 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.45) >> +>> endobj +2304 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.031 589.123 178.986 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.46) >> +>> endobj +2305 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.854 566.552 140.809 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.46) >> +>> endobj +2306 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.241 552.54 269.196 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.47) >> +>> endobj +2307 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.57 541.302 184.525 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.50) >> +>> endobj +2308 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.445 529.347 188.4 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.51) >> +>> endobj +2309 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.684 516.674 268.639 527.578] +/Subtype /Link +/A << /S /GoTo /D (page.50) >> +>> endobj +2310 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.005 504.719 262.96 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.50) >> +>> endobj +2311 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.267 493.481 145.223 503.668] +/Subtype /Link +/A << /S /GoTo /D (page.50) >> +>> endobj +2312 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [225.899 480.809 237.854 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.51) >> +>> endobj +2313 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.358 468.854 182.313 479.758] +/Subtype /Link +/A << /S /GoTo /D (page.52) >> +>> endobj +2314 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.386 457.616 177.341 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.51) >> +>> endobj +2315 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.368 445.661 182.323 455.847] +/Subtype /Link +/A << /S /GoTo /D (page.49) >> +>> endobj +2316 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.667 432.988 182.622 443.892] +/Subtype /Link +/A << /S /GoTo /D (page.52) >> +>> endobj +2317 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [182.552 421.033 194.507 431.937] +/Subtype /Link +/A << /S /GoTo /D (page.52) >> +>> endobj +2318 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.27 409.078 216.226 419.982] +/Subtype /Link +/A << /S /GoTo /D (page.51) >> +>> endobj +2319 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.792 397.84 146.747 408.027] +/Subtype /Link +/A << /S /GoTo /D (page.51) >> +>> endobj +2320 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.234 373.212 186.189 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.52) >> +>> endobj +2321 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.53 361.257 268.485 372.161] +/Subtype /Link +/A << /S /GoTo /D (page.53) >> +>> endobj +2322 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.713 337.347 175.668 348.251] +/Subtype /Link +/A << /S /GoTo /D (page.53) >> +>> endobj +2323 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.018 326.109 152.974 336.296] +/Subtype /Link +/A << /S /GoTo /D (page.54) >> +>> endobj +2324 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [221.825 313.437 233.78 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.54) >> +>> endobj +2325 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.679 301.481 216.634 312.385] +/Subtype /Link +/A << /S /GoTo /D (page.54) >> +>> endobj +2326 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.054 289.526 279.009 300.43] +/Subtype /Link +/A << /S /GoTo /D (page.55) >> +>> endobj +2327 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [201.352 277.571 213.307 288.475] +/Subtype /Link +/A << /S /GoTo /D (page.55) >> +>> endobj +2328 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.941 265.616 146.896 276.52] +/Subtype /Link +/A << /S /GoTo /D (page.55) >> +>> endobj +2329 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.773 241.706 191.728 252.609] +/Subtype /Link +/A << /S /GoTo /D (page.56) >> +>> endobj +2330 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.402 230.468 141.357 240.654] +/Subtype /Link +/A << /S /GoTo /D (page.57) >> +>> endobj +2331 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [214.074 205.84 226.029 216.744] +/Subtype /Link +/A << /S /GoTo /D (page.57) >> +>> endobj +2332 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.617 193.885 174.572 204.789] +/Subtype /Link +/A << /S /GoTo /D (page.58) >> +>> endobj +2333 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.388 181.93 291.343 192.834] +/Subtype /Link +/A << /S /GoTo /D (page.58) >> +>> endobj +2334 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.378 169.975 291.333 180.878] +/Subtype /Link +/A << /S /GoTo /D (page.59) >> +>> endobj +2335 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [246.721 158.019 258.676 168.923] +/Subtype /Link +/A << /S /GoTo /D (page.59) >> +>> endobj +2336 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.195 146.064 191.15 156.968] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +2337 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.071 134.109 195.026 145.013] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +2338 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.57 122.871 184.525 133.058] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +2339 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.445 110.916 188.4 121.103] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +2340 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.896 98.244 182.851 109.147] +/Subtype /Link +/A << /S /GoTo /D (page.77) >> +>> endobj +2341 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.772 86.288 186.727 97.192] +/Subtype /Link +/A << /S /GoTo /D (page.77) >> +>> endobj +2342 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [473.165 719.912 485.12 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.75) >> +>> endobj +2343 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [474.271 707.957 486.226 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.75) >> +>> endobj +2344 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [382.157 696.002 394.112 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.71) >> +>> endobj +2345 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [394.879 684.047 406.834 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.72) >> +>> endobj +2346 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [376.329 672.092 388.284 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +2347 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [438.874 660.136 450.829 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.78) >> +>> endobj +2348 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [421.45 648.181 433.405 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.72) >> +>> endobj +2349 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [434.172 636.226 446.127 647.13] +/Subtype /Link +/A << /S /GoTo /D (page.72) >> +>> endobj +2350 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [493.509 624.271 505.464 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.79) >> +>> endobj +2351 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [474.132 612.316 486.087 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.79) >> +>> endobj +2352 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [411.995 601.078 423.951 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.65) >> +>> endobj +2353 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [412.603 589.123 424.558 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.65) >> +>> endobj +2354 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [407.302 576.45 419.257 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.76) >> +>> endobj +2355 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [370.79 565.212 382.745 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.65) >> +>> endobj +2356 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [363.597 553.257 375.552 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +2357 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [400.408 540.585 412.363 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.71) >> +>> endobj +2358 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [432.617 528.63 444.573 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.76) >> +>> endobj +2359 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [423.92 516.674 435.875 527.578] +/Subtype /Link +/A << /S /GoTo /D (page.77) >> +>> endobj +2360 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [433.056 504.719 445.011 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.73) >> +>> endobj +2361 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [445.778 492.764 457.733 503.668] +/Subtype /Link +/A << /S /GoTo /D (page.73) >> +>> endobj +2362 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [460.722 492.764 472.677 503.668] +/Subtype /Link +/A << /S /GoTo /D (page.74) >> +>> endobj +2363 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [419.497 480.809 431.452 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.78) >> +>> endobj +2364 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.684 469.571 381.639 479.758] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +2365 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [406.764 456.899 418.719 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.70) >> +>> endobj +2366 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [396.264 444.943 408.219 455.847] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +2367 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [487.431 432.988 499.386 443.892] +/Subtype /Link +/A << /S /GoTo /D (page.78) >> +>> endobj +2368 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [468.054 421.033 480.009 431.937] +/Subtype /Link +/A << /S /GoTo /D (page.78) >> +>> endobj +2369 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [425.026 409.078 436.981 419.982] +/Subtype /Link +/A << /S /GoTo /D (page.77) >> +>> endobj +2370 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.684 397.84 381.639 408.027] +/Subtype /Link +/A << /S /GoTo /D (page.65) >> +>> endobj +2371 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [384.628 397.84 396.583 408.027] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +2372 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.03 385.885 379.985 396.071] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +2373 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [382.974 385.885 394.929 396.071] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +2374 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [426.67 373.212 438.625 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.70) >> +>> endobj +2375 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [430.545 361.257 442.5 372.161] +/Subtype /Link +/A << /S /GoTo /D (page.70) >> +>> endobj +2376 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [420.044 350.019 432 360.206] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +2377 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [423.92 338.064 435.875 348.251] +/Subtype /Link +/A << /S /GoTo /D (page.70) >> +>> endobj +2378 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.522 326.109 395.477 336.296] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +2379 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [467.885 313.437 479.84 324.34] +/Subtype /Link +/A << /S /GoTo /D (page.76) >> +>> endobj +2380 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [437.449 301.481 449.404 312.385] +/Subtype /Link +/A << /S /GoTo /D (page.76) >> +>> endobj +2381 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [454.226 289.526 466.181 300.43] +/Subtype /Link +/A << /S /GoTo /D (page.71) >> +>> endobj +2382 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [396.254 277.571 408.209 288.475] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +2383 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [350.765 265.616 362.72 276.52] +/Subtype /Link +/A << /S /GoTo /D (page.75) >> +>> endobj +2384 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [407.87 253.661 419.825 264.565] +/Subtype /Link +/A << /S /GoTo /D (page.71) >> +>> endobj +2385 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [450.48 241.706 462.435 252.609] +/Subtype /Link +/A << /S /GoTo /D (page.74) >> +>> endobj +2386 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [454.355 229.75 466.311 240.654] +/Subtype /Link +/A << /S /GoTo /D (page.74) >> +>> endobj +2387 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [412.852 217.795 424.807 228.699] +/Subtype /Link +/A << /S /GoTo /D (page.70) >> +>> endobj +2388 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [397.36 205.84 409.315 216.744] +/Subtype /Link +/A << /S /GoTo /D (page.75) >> +>> endobj +2389 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [450.46 193.885 462.415 204.789] +/Subtype /Link +/A << /S /GoTo /D (page.80) >> +>> endobj +2390 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [363.587 182.647 375.542 192.834] +/Subtype /Link +/A << /S /GoTo /D (page.80) >> +>> endobj +2391 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [472.048 169.975 484.004 180.878] +/Subtype /Link +/A << /S /GoTo /D (page.80) >> +>> endobj +2392 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.524 146.781 421.479 156.968] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2393 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [477.02 122.154 488.975 133.058] +/Subtype /Link +/A << /S /GoTo /D (page.37) >> +>> endobj +2394 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.524 98.961 421.479 109.147] +/Subtype /Link +/A << /S /GoTo /D (page.23) >> +>> endobj +2396 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +2400 0 obj << +/D [2398 0 R /XYZ 90 757.935 null] +>> endobj +2397 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F11 291 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2470 0 obj << +/Length 1323 +/Filter /FlateDecode +>> +stream +xÚÍY]w¢8¾÷Wp·pΖ&`@{gmêÒQaç´Û™“C5*»,à¸Î¯ß𡫝ªXpì… yòäýܔ\§vkÕ®ï™kŠMER8kÂ5§*PDä¬1÷Ìký;ü(|³¸:”E «l\ÚÑP’Ö¶jÿÔ kL#UTečæµço€³öˆr³Á-Ó·æ\]’Ù¿Ë™µÏ5°M-"°{ qªÄ¦UP6i«ÿDÚzÏèâGÍzú=eMNsƒN{¾’à¥zޟMÁ.WŠM”cµ»º9`bèZß*…{FY6ø³?ê€ouA¡ƒPn BÞ¢HÐÊÐÖ­~9¦]lšU1܆¬€™ÖÇåÚk=j=íÏ\\š^’POëW—+R7¬ߑžfcˆ^¿íâ^9–†Ð”øÖ ÕÃÌ@Êɯ·4ô.³+À?õõžÖêž9äø­­õ;%Ée Ä´06°i|×Á?¶U´ß»råø}WdÄç6T } ?Z·ºþ©ڀqˆ/CM-Õoezöoõ!Ë;É°[¦Æ€*ÂUÖ¸Ú<0O[W0K´»ê5ºäÁ$À$ÄÛÄñbN’0mhZ¼5¬íÏ— +ñÿ:ñŠ´];ŠÊé í{qè»ÄH@íОSƃôÙÉìÿ&î—Ô5lwAËùß]*ƒ)õhhǔ`—Ω—cÜÉÐüXBð« ¤:¡3&Uƒ¦ú/lÁČíx•ÃӃؙ;?ìØñ=ÒóÇ´œë ¨›A™«ù‹ïž¶ë)»¡v¯Kö¤J|õp&ùpÌvÓÐ%è)oç°_LEb3ÀÆn¼ ²B{µwöÀç6 |w5£ãÐ&®óÚáêæf?Ž0Õ" èW$’¥ÏÈÈ÷¦á‚zÒÍ^ZFÞä{Gx© €ìã]ŒØ>Eqh3Ã8#/¥Y‚W´3vƒ!ɊX*§ÈPd¿óŠP9˜þ—œR¥ÿ¡LÂ5“Dh?óP*Ó ZˆÌÜOJ˜ïɅ’™3±ò( +ØZÉØaÅLĘF{¥Uò”ÓY~z›¸±ÈHIÀ~‰ý„þÂ;Þô¼²*•u›Î«½^Þ͆Yzä¦Ø@0ÍK63¨ˆÆÄù‹Žb'1û\Г…7JLõô…lՇÇèÁNè­¥J&¬ŠebþàÒ=¼a=Sü‘ 8Sä°½›3Y‘E”H“Eí8ÛÉńí✩wƘ¤ÂBÐ÷¸t’x˜ìרá'"]Ò0y­M +³FjG¾›yÍå%Qì®RÕ²t|Îø¨4Š(t™šopÎ8½/ón9¶Å¤„eß ¢4õmF{¿<]°>a1]ȽδçT`½€e ]ŒÛѯ}ÔåúSá™(ÒY°Šò%IÞ{ýÒ­Àόˆ3!Y´GñéôNH%r‘¨ ›¥„ÓCÔÎð#| Ÿ¥3¦^R+œ_è͝ãëÃg¥!¥Qôìy}欈MUnä‡ß¨)"TÏx[3*¤Óo +Äüq½’ì1/³‡m§É»moº°§9”¶ó=mF4üM@ˆ²çží-l7»ÿ +Èʇ0 ´i#!%ÖEáJfP&¥¹|2aüÍ­ï>%çûhk‰RÄܜâÏâ8¸¹¾^.—â(ž„¢_{½#ñW‚‚°.ªÌ rVygÌæl»“šÁ•¬2C‘™!¨lP¾¥w<öâ<ÝäŠ;èLÿ1/Ž +endstream +endobj +2469 0 obj << +/Type /Page +/Contents 2470 0 R +/Resources 2468 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2228 0 R +/Annots [ 2395 0 R 2401 0 R 2402 0 R 2403 0 R 2404 0 R 2405 0 R 2406 0 R 2407 0 R 2408 0 R 2409 0 R 2410 0 R 2411 0 R 2412 0 R 2413 0 R 2414 0 R 2415 0 R 2416 0 R 2417 0 R 2418 0 R 2419 0 R 2420 0 R 2421 0 R 2422 0 R 2423 0 R 2424 0 R 2425 0 R 2426 0 R 2427 0 R 2428 0 R 2429 0 R 2430 0 R 2431 0 R 2432 0 R 2433 0 R 2434 0 R 2435 0 R 2436 0 R 2437 0 R 2438 0 R 2439 0 R 2440 0 R 2441 0 R 2442 0 R 2443 0 R 2444 0 R 2445 0 R 2446 0 R 2447 0 R 2448 0 R 2449 0 R 2450 0 R 2451 0 R 2452 0 R 2453 0 R 2454 0 R 2455 0 R 2456 0 R 2457 0 R 2458 0 R 2459 0 R 2460 0 R 2461 0 R 2462 0 R 2463 0 R 2464 0 R 2465 0 R 2467 0 R ] +>> endobj +2395 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.669 720.63 216.625 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2401 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.611 708.674 205.566 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2402 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.673 696.719 159.629 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2403 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.166 684.42 159.121 694.951] +/Subtype /Link +/A << /S /GoTo /D (page.25) >> +>> endobj +2404 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.798 672.465 227.753 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.25) >> +>> endobj +2405 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.389 660.854 203.345 671.04] +/Subtype /Link +/A << /S /GoTo /D (page.25) >> +>> endobj +2406 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.219 648.555 206.174 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.25) >> +>> endobj +2407 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.81 636.943 181.766 647.13] +/Subtype /Link +/A << /S /GoTo /D (page.25) >> +>> endobj +2408 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [136.595 624.988 148.55 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2409 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.61 613.033 200.565 623.22] +/Subtype /Link +/A << /S /GoTo /D (page.25) >> +>> endobj +2410 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [184.734 601.078 196.689 611.265] +/Subtype /Link +/A << /S /GoTo /D (page.25) >> +>> endobj +2411 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.919 589.123 253.875 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.25) >> +>> endobj +2412 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [173.327 577.168 185.282 587.354] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2413 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.24 565.212 155.195 575.399] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2414 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [247.947 553.257 259.902 563.444] +/Subtype /Link +/A << /S /GoTo /D (page.23) >> +>> endobj +2415 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.761 541.302 165.716 551.489] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2416 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [275.125 529.347 287.08 539.534] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2417 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [272.963 517.392 284.918 527.578] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2418 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [212.42 505.437 224.375 515.623] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2419 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.895 493.481 145.85 503.668] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2420 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [225.71 481.526 237.665 491.713] +/Subtype /Link +/A << /S /GoTo /D (page.23) >> +>> endobj +2421 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.324 469.571 263.279 479.758] +/Subtype /Link +/A << /S /GoTo /D (page.25) >> +>> endobj +2422 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [249.122 457.616 261.078 467.803] +/Subtype /Link +/A << /S /GoTo /D (page.25) >> +>> endobj +2423 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.165 445.661 175.12 455.847] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2424 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [187.384 421.033 199.339 431.937] +/Subtype /Link +/A << /S /GoTo /D (page.23) >> +>> endobj +2425 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.348 409.795 230.303 419.982] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2426 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.242 397.84 229.197 408.027] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2427 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.307 385.168 209.262 396.071] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2428 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.398 373.212 190.353 384.116] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2429 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [201.641 361.257 213.596 372.161] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2430 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [199.708 350.019 211.663 360.206] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2431 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.716 337.347 206.671 348.251] +/Subtype /Link +/A << /S /GoTo /D (page.25) >> +>> endobj +2432 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.658 325.392 195.613 336.296] +/Subtype /Link +/A << /S /GoTo /D (page.25) >> +>> endobj +2433 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.043 302.199 204.998 312.385] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2434 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.043 278.288 204.998 288.475] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2435 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.043 254.378 204.998 264.565] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2436 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.043 230.468 204.998 240.654] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2437 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.043 196.595 204.998 206.781] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2438 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [260.539 171.967 272.494 182.871] +/Subtype /Link +/A << /S /GoTo /D (page.37) >> +>> endobj +2439 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 148.057 278.601 158.961] +/Subtype /Link +/A << /S /GoTo /D (page.70) >> +>> endobj +2440 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 124.146 278.601 135.05] +/Subtype /Link +/A << /S /GoTo /D (page.70) >> +>> endobj +2441 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.646 100.236 278.601 111.14] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +2442 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [483.127 719.912 495.083 730.816] +/Subtype /Link +/A << /S /GoTo /D (page.70) >> +>> endobj +2443 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.524 696.719 421.479 706.906] +/Subtype /Link +/A << /S /GoTo /D (page.25) >> +>> endobj +2444 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [483.127 672.092 495.083 682.996] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +2445 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [483.127 648.181 495.083 659.085] +/Subtype /Link +/A << /S /GoTo /D (page.76) >> +>> endobj +2446 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [483.127 624.271 495.083 635.175] +/Subtype /Link +/A << /S /GoTo /D (page.76) >> +>> endobj +2447 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [380.195 588.405 392.15 599.309] +/Subtype /Link +/A << /S /GoTo /D (page.54) >> +>> endobj +2448 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [493.648 554.931 505.603 565.835] +/Subtype /Link +/A << /S /GoTo /D (page.51) >> +>> endobj +2449 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [380.195 519.065 392.15 529.969] +/Subtype /Link +/A << /S /GoTo /D (page.54) >> +>> endobj +2450 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.524 495.872 421.479 506.059] +/Subtype /Link +/A << /S /GoTo /D (page.23) >> +>> endobj +2451 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [483.127 471.245 495.083 482.149] +/Subtype /Link +/A << /S /GoTo /D (page.71) >> +>> endobj +2452 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [449.136 435.379 461.091 446.283] +/Subtype /Link +/A << /S /GoTo /D (page.57) >> +>> endobj +2453 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [493.648 411.469 505.603 422.373] +/Subtype /Link +/A << /S /GoTo /D (page.51) >> +>> endobj +2454 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [483.127 387.559 495.083 398.463] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +2455 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [483.127 363.648 495.083 374.552] +/Subtype /Link +/A << /S /GoTo /D (page.75) >> +>> endobj +2456 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [483.127 330.174 495.083 341.078] +/Subtype /Link +/A << /S /GoTo /D (page.71) >> +>> endobj +2457 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.524 297.417 421.479 307.603] +/Subtype /Link +/A << /S /GoTo /D (page.25) >> +>> endobj +2458 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [483.127 272.789 495.083 283.693] +/Subtype /Link +/A << /S /GoTo /D (page.74) >> +>> endobj +2459 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [483.127 248.879 495.083 259.783] +/Subtype /Link +/A << /S /GoTo /D (page.74) >> +>> endobj +2460 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.524 225.686 421.479 235.872] +/Subtype /Link +/A << /S /GoTo /D (page.25) >> +>> endobj +2461 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.524 201.775 421.479 211.962] +/Subtype /Link +/A << /S /GoTo /D (page.24) >> +>> endobj +2462 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [483.127 177.148 495.083 188.052] +/Subtype /Link +/A << /S /GoTo /D (page.70) >> +>> endobj +2463 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [494.754 153.237 506.709 164.141] +/Subtype /Link +/A << /S /GoTo /D (page.31) >> +>> endobj +2464 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [470.385 119.763 482.34 130.667] +/Subtype /Link +/A << /S /GoTo /D (page.80) >> +>> endobj +2465 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [483.127 86.288 495.083 97.192] +/Subtype /Link +/A << /S /GoTo /D (page.75) >> +>> endobj +2467 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +2471 0 obj << +/D [2469 0 R /XYZ 90 757.935 null] +>> endobj +2468 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2475 0 obj << +/Length 415 +/Filter /FlateDecode +>> +stream +xڍ’]o›0†ïý+ÎÝ@Æ؆\Nëªdíº­Lª”V‘—‚„Ô?;S©R¯ìóý¼ö!Pkô)GñÉ!Ùdò-d”¤X0 +ù–ÁüÛ竇ð)_@B9&\Ùº)ª“]åè/¢ÖI€NÅBaŬ´|"°±þ̳Æ)«„q{Öp~ òD f'JáæFw«~0U[N8Ô¦2¥8>§Ó¦Ñ«n_?ѫºúm´yžÍæw'Z‡iJÏûóÁ2b‚ õq‡óÖy©V¦0}¯Ø³H‰3ÅS/RdXˆÄñç»"œp¾‡T'1Þ<+r捓包 Ž!³>¬Ûò KßjÞ…Ù†”zí]¿úÂ|…zgßêö kw$‚OÓ ÓWûÖ9 ¦3¢8Œ¸mu_þ½Ücüóíëi¡Ä ‰LHœÒÿk³†nÇã8âumÕ\ q×Õñ«¸x(J¬hvî²ÝGÖìÍDWvk¹„HÙ"¿¼Uk=X!øUwûÿÅé¹X +endstream +endobj +2474 0 obj << +/Type /Page +/Contents 2475 0 R +/Resources 2473 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2228 0 R +/Annots [ 2466 0 R 2472 0 R ] +>> endobj +2466 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [231.219 707.957 243.174 718.861] +/Subtype /Link +/A << /S /GoTo /D (page.41) >> +>> endobj +2472 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [345.82 57.047 460.789 65.278] +/Subtype/Link/A<> +>> endobj +2476 0 obj << +/D [2474 0 R /XYZ 90 757.935 null] +>> endobj +2473 0 obj << +/Font << /F63 247 0 R /F50 215 0 R /F65 249 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2477 0 obj +[777.8] +endobj +2478 0 obj +[777.8] +endobj +2479 0 obj +[513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 285.5 285.5 799.4 513.9 799.4 513.9 543.7 770.7 777.7 733.6 847.5 756.3 656.2 804.8 850.1 449.3 566.3 870.4 699.4 992.9 821.6 782.1 656.2 810.6 777.6 627.8 599.6 699.1 599.4 970.5 849 596.5 699.2 399.7 399.7 399.7 1027.8 1027.8 424.4 544.5 440.4 444.9 532.5 477.8 498.8 490.1 592.2 351.7 420.1 535.1 306.7 905.5 620 497.5 515.9 459.2 463.7 478.8 371.1 591.4 499.2 736.6 582.6] +endobj +2480 0 obj +[611.1 675.9 546.3 675.9 546.3 384.3 611.1 675.9 351.8 384.3 643.5 351.8 1000 675.9 611.1 675.9 643.5 481.5 488 481.5 675.9 643.5 870.4 643.5] +endobj +2481 0 obj +[642.5 589 600.7 607.7 725.7 445.6 511.6 660.9 401.6 1093.7 769.7 612.5 642.5 570.7 579.9 584.5 476.8 737.3] +endobj +2482 0 obj +[513.9 799.4 513.9 799.4 799.4 799.4 799.4 799.4 799.4 799.4 1027.8 513.9 513.9 799.4 799.4 799.4 799.4 799.4 799.4 799.4 799.4 799.4 799.4 799.4 799.4 1027.8 1027.8 799.4 799.4 1027.8 1027.8 513.9 513.9 1027.8 1027.8 1027.8 799.4 1027.8 1027.8 628.1 628.1 1027.8 1027.8 1027.8 799.4 279.3 1027.8 685.2] +endobj +2483 0 obj +[569.5 569.5 569.5 569.5 569.5 569.5 569.5 569.5 569.5 569.5 323.4 323.4 323.4 877 538.7 538.7 877 843.3 798.6 815.5 860.1 767.9 737.1 883.9 843.3 412.7 583.3 874 706.4 1027.8 843.3 877 767.9 877 829.4 631 815.5 843.3 843.3 1150.8 843.3 843.3 692.5 323.4 569.5 323.4 569.5 323.4 323.4 569.5 631 507.9 631 507.9 354.2 569.5 631 323.4 354.2 600.2 323.4 938.5 631 569.5 631 600.2 446.4 452.6 446.4 631 600.2 815.5 600.2] +endobj +2484 0 obj +[892.9 339.3 892.9 585.3 892.9 585.3 892.9 892.9 892.9 892.9 892.9 892.9 892.9 1138.9 585.3 585.3 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 1138.9 1138.9 892.9 892.9 1138.9 1138.9 585.3 585.3 1138.9 1138.9 1138.9 892.9 1138.9 1138.9 708.3 708.3 1138.9 1138.9 1138.9 892.9 329.4] +endobj +2485 0 obj +[594.7 542 557.1 557.3 668.8 404.2 472.7 607.3 361.3 1013.7 706.2 563.9 588.9 523.6 530.4 539.2 431.6 675.4] +endobj +2486 0 obj +[1055.6] +endobj +2487 0 obj +[399.7 399.7 513.9 799.4 285.5 342.6 285.5 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 285.5 285.5 285.5 799.4 485.3 485.3 799.4 770.7 727.9 742.3 785 699.4 670.8 806.5 770.7 371 528.1 799.2 642.3 942 770.7 799.4 699.4 799.4 756.5 571 742.3 770.7 770.7 1056.2 770.7 770.7 628.1 285.5 513.9 285.5 513.9 285.5 285.5 513.9 571 456.8 571 457.2 314 513.9 571 285.5 314 542.4 285.5 856.5 571 513.9 571 542.4 402 405.4 399.7 571 542.4] +endobj +2488 0 obj +[525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] +endobj +2489 0 obj +[761.6 489.6 761.6] +endobj +2491 0 obj +[556 556 167 333 611 278 333 333 0 333 606 0 611 389 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 278 250 389 555 500 500 833 778 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 832 667 667 667 722 667 667 722 778 389 500 667 611 889 722 722 611 722 667 556 611 722 667 889 667 611 611 333 278 333 570 500 333 500 500 444 500 444 333 500 556 278 278 500 278 778 556 500 500 500 389 389 278 556 444 667 500 444] +endobj +2492 0 obj +[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] +endobj +2493 0 obj +[388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8] +endobj +2494 0 obj +[500 500 167 333 556 278 333 333 0 333 675 0 556 389 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 214 250 333 420 500 500 833 778 333 333 333 500 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 422 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389] +endobj +2495 0 obj +[500 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 777.8 500 777.8 500 530.9 750 758.5 714.7 827.9 738.2 643.1 786.3 831.3 439.6 554.5 849.3 680.6 970.1 803.5 762.8 642 790.6 759.3 613.2 584.4 682.8 583.3 944.4 828.5 580.6 682.6 388.9 388.9 388.9 1000 1000 416.7 528.6 429.2 432.8 520.5 465.6 489.6 477 576.2 344.5 411.8 520.6 298.4 878 600.2 484.7 503.1 446.4 451.2 468.8 361.1 572.5 484.7 715.9 571.5] +endobj +2496 0 obj +[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] +endobj +2497 0 obj +[556 556 167 333 667 278 333 333 0 333 570 0 667 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 278 250 333 555 500 500 1000 833 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 581 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444 394 220 394 520 0 0 0 333 500 500 1000 500 500 333 1000 556 333 1000 0 0 0 0 0 0 500 500 350 500] +endobj +2498 0 obj +[638.9 963 638.9 963 963 963 963 963 963 963 1222.2 638.9 638.9 963 963 963 963 963 963 963 963 963 963 963 963 1222.2 1222.2 963 963 1222.2 1222.2 638.9 638.9 1222.2 1222.2 1222.2 963 1222.2 1222.2 768.5 768.5 1222.2 1222.2 1222.2 963 365.7 1222.2 833.3 833.3 1092.6 1092.6 0 0 703.7 703.7 833.3 638.9 898.1 898.1 963 963 768.5 989.9 813.3 678.4 961.2 671.3 879.9 746.7 1059.3 709.3 846.3 938.8 854.5 1427.2 1005.7 973 878.4 1008.3 1061.4 762 711.3 774.4 785.2 1222.7 883.7 823.9 884 833.3 833.3 833.3 833.3 833.3 768.5 768.5 574.1 574.1 574.1 574.1 638.9 638.9 509.3 509.3 379.6 638.9 638.9 768.5 638.9 379.6 1000 924.1 1027.8 541.7 833.3 833.3 963 963 574.1 574.1 574.1] +endobj +2499 0 obj +[472.2 472.2 472.2] +endobj +2500 0 obj +[777.8 277.8 777.8 500 777.8 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 275 1000 666.7 666.7 888.9 888.9 0] +endobj +2501 0 obj +[556 556 167 333 611 278 333 333 0 333 564 0 611 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 180 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541 0 0 0 333 500 444 1000 500 500 333 1000 556 333 889 0 0 0 0 0 0 444 444 350 500 1000 333 980 389 333 722 0 0 722 0 333 500 500 500 500 200 500 333 760] +endobj +2502 0 obj << +/Length1 754 +/Length2 1067 +/Length3 0 +/Length 1597 +/Filter /FlateDecode +>> +stream +xÚ­’{O ‚1>ãÑv€.ƒ ‘rËaY,°#A |¬ƒ#”d?‚ä‹ +1àô9-PH¿–¢`™œ€äÊù€``¨8`!ɞÃ`åÿ ۜ©‹Ù<ÉHûQŸ¾©ó$ˆ8ú‹“H8,˜–¡c¥¡ðg¸X€($c«¾8OŒðéh„”Ï)DÎD”°€ƒà|òÄrx4£‚±„s£ö,P¯Ð_Þt´Èá!(¾º.„-_c!B˜ÃJ˜OúãÆ_œ´>çLrq£ ¥DÇFÛ#¢"“]^wëܤĶÚâÂ&ÿH›Ž²°¡£¹S»uºÍ6¾7‘o«Ž]ÖÌìIˆÌTµ~ìŽZ۝»é7“°þ܀èGR‹ÁÄçÓªÎÜ~õÂQ;ðfÇïÅÙÜC÷õ^z~€CöZþxb»¹V}xÔ©ú_“9…1sÅ+R¶–Y;˜é«"‹Si)šúÙYã5×ãÖ§èV.¸×‡U+f èîßõqåëʦKE5§[,¢MÿtܦËH¿c"62Ín‰U_°X›?÷€‰¦(+~€ÊMþpâèýÆtÿ¥Uiæ­Ë^èF>ßÏy¨¾°c{u†[9Ù@ÓZN?ž+Ô&ŸuöËùYåãÊßÖò ºûCâÔ8½÷T›6ð+˜ÎïóÍoyçoµ‘ÞÝ«y¤ž´ñuqv“tҚi}ïâ/¹è´LpìõÛ.©NÚt +£.¬›i\R°»¹‡äÛ9Óԁ ÷ÓU¾9{®]m,Ye$P²n‘Ü·ìNM>?¤¹{¶áǗ/›?mò>’Ž´±òB­gÕ«‘ÿ5S¦Sº8õxßV;kŒî&õ[ñ¨IºK]²–ò`_FöUí¥W}±ÁÉÙ΁œSz]ÞzXYB³)=ô6¸á\¹§úÐÓ·T²A‚hoA{ãå¼Xà™oØEå8—O´`m¨˜þ–Åcé{±D÷Cî”Øëî' #]¤ÀógW}(Ÿï3¹á8¿vÁY;ϋ½óÇqV×,:onô~㌸®4÷á˜È­E§†æÍ<Ì0½Tö7îúb +endstream +endobj +2503 0 obj << +/Type /FontDescriptor +/FontName /LBWBDW+CMEX10 +/Flags 4 +/FontBBox [-24 -2960 1454 772] +/Ascent 40 +/CapHeight 0 +/Descent -600 +/ItalicAngle 0 +/StemV 47 +/XHeight 431 +/CharSet (/summationtext) +/FontFile 2502 0 R +>> endobj +2504 0 obj << +/Length1 925 +/Length2 2998 +/Length3 0 +/Length 3616 +/Filter /FlateDecode +>> +stream +xÚ­Vi<”mû–¥4ÈÆzKj¤13ûš]¦,“!똹‡É,C–lªÇZ”­,ɒŠJhµ$-Šì#²W²?R†ðNõ>oï¿÷ëÿw¹Žs9®ã:Îóí¢äà 7#Ò}A+: G©£ôs Æ…8g$¢¢bÎñL2fg‚úJOO° ¦šRG­©Ö¨æôÀ0Ùϟ ÀÌUéfTA&àiÏô©ž8Ó d¦˜Q(€ÓŽ À ! Q‚BD2 ø‚~dñC“-Dt~…‰Áÿ¤B@FGû)Sàˆ$Òi”0€’ ˆCtÎm GËÿ‡¬?É­‚)”CxêúŸNýOO%SÂþ]A§3A€¡AíÏRøK$’ƒ©fm™x +™`Fó£€¥¥ŽÔú'Y‘CA¢™IðHxJø3҈*áø÷Sâ0ÖãèªöïÑþL:àÉ4&6,¿«bÔoÌ1‰AܑêH$ŠSÈùþ9yþq™%@'’i~€ZÀ3ø0g‰8 D 2†`(G1BFgrZŽ3‘‰Î€ü˜+g4üÐ/¤ |ÿƒ´5„ߏ5äùO …ä4ü.A +ô_y=Aý 9ÏFÐþ jˆßdZ.ÎCñ?¬¦€$æï„öïįEúƒ‡0ô'ü_Ó ‡FÀ55¸šcRKÐA##ÿO!!˜Ái̟‹ÍÝ?˜DæLCA„ÕK'Ä»x/¡<ʲ¸£‚O5H.»4¾íñé»ÙêÓï ĺµíXPáoÑÓ¢ÇÈ×E²fÞ@Ièè=³“­ΈÓý¢­Bª…9ÎÛæ Ó^Üϯtù4œöjuƚ^Lg•<—òÈYß`A›†:…²õÎ]Áðôd}ߎT %¾† rY®—õìœõùå´»] +².#¥lWãúºƒ˜9þñ·ªzãJق¶§"³lp¶G¾ÊVŠÊe)FÖ%Ð-`UÓÑ'TcZcâD•ã)±€ª £ ¨ÀÚL'öºÊß»“y¿x®­½ÿ¶yúdž¡Ä%}“§¦›kS›VmCBùº’Z•Üðþç?2ÍLlÞ ˜ž{F}c2z²~¸êõÄHô–%)³4 Súlêłý˜£j·ëZ3<,C¹ôÜžÒ G‹>?}r.WÃËÊÜý½ÏClŸÚóʚ†b ñÊD^ÏÖ:+«âÝuüôþñRJÆâr;EÌ<&°€ +«±34mÆÿÑI1ô*[þº¾v~çwƒÉö¬#­µ³¥ÚòQ|“q²)ê3Ø}ºs<Vú„uèVÞi}!¹÷"{îx1àzùÁòjØ¢ÞöÌ +½ªOÁÉG_ÌêZHWiÀ-ØÁèå}ªÏT¼_V.2EÒ֊|Ôn&Ÿ4Ñ´‰›ìˆ‡‡½Ñ~Æ¥NWK"R£çû´äÏxCôFûÇõ –áYQ›ñ_û­ƒD-ëÚÜY´ÙC/FÈzãq®Š+¹ÞØcüz«alÅÔ®!JÂF )njg·Œ®ª단•*D‰‰çð~0–t+F¼Ùö‹4­µ>ð\‚SåÚúâ,DÔD¿é]m%¦ýJ‘>Íyí=Ê>.î!ޕ¥,é‰eFl~—NMA +Ñd°Ðáè×ÂU£á·«Á1â/gϾ~÷@CÂlº;gúH‘‚S¾Ž ·ò >N–˜ #_eÎ-‡»9rÑʎßسœ4[Šu¬v:S|¦¶ûø¬4+ùˆý-Ém_¬¾zOíu ÅËÉJâbiû⸾žœÖŸÍÛë]îgÂdÞÂ/ˆj}íÕ;ù%ŽnЙ,Ɇ˜¼ªøÂó vêžGN¦wö‹Kž§$J¼O'šµä•]€fEìÎ]}¹m!PºE'[feÀ’áù"ÅcV£÷È«o0RÊI÷§KnÛ7*îowœh/ +>ÐU)=ö@îÂDž°<ô ¡Î@q¨ü’HìX“BüŒbžé¶SáX鵍êý·â÷põ›âgÎxé~œ¸æv¾ä‚(ïqs§ ï³_ıWhy½|›]Tƒ…d ù3ïo¡\åÌæõ{çžõNéóÙË ¡àý£ß·¨Ê5÷ÌK‹QÌo¾º³ÿfDJw‰b;<(aHùnjcÚvyç“DÚ• Gaåf±Fkg!6·¹ZD>#}wqÓ«ª +•àÛז†¤V^ˆeÏ ²Æ<š#w‘íW²à9õŽ½¡V§«òR —]T5;ו+­õ÷XÌ"Ò¿.§ËIÜäÎqòÜꔿã‰g`l¸îô€è*×^£‹šÕTt¶~ isËܼ ¸4çôQ§;©÷5Îâ¯æýÄôU¼;$l” +ÞeÂNQMEÔ+ô›jƒŸVëúoM¦¡Š(QßÁaá5;µ®R{º^øj­“×ËŸã›îèèóWªw”ÕŸÌm:'~ª0OŒþÊ6ôY ;žrö饘èÆQH7¹¨üÛ»w/ù²Ú…Ç×zŽV.b#Û+E›ÚfdŽæéwªœ1ˆH[«—ì_#›Â^ߊ$뀷õc +½®_TÐHœpÇ] ;ð…ôºëîž9ôMÚ·~®X©UÇ]qDùK{&*= GJÚ¹T¾«v9äwi¡Þ/uÛàˆolCÆG,àÊ?ÒcȅÜÔ85øùvYK“&¦ÖFê .ÇIÀÏ£zç%┵|´óƒõü÷4+ýôX3_/q˜®Ó¸²»wzš§¯\z !Š2]vÊ9åždݧT—‘LLd|ÙÍ÷ÜßM3êÄÝ·v¢¾í^¾pž¥J_p&ViÍêE)Ô*m1NUH{­]ºYm+æùÊwëÃ)h>w‡ð¿z*—TÛÚó_õÀNÈ<¥|Ê7§¼Î8šEý`Ŷ{³0 ¾Ïø±µ‚_wQŸ–åéÑ Ó©•7Y£Î\ÍÍø@~¼V(º\@xeëCeë|vœD¨`×ëØcgÕ¼ïí¯Âa•c.ÄìԌ?g2–¼Æ×Ñp¹”kGÄ”hÇC/^DY†‰ +öÜVB ûíÚ6Åí6ŒCô¥…²N¤–õoÔK Y‘~lV`a»`LjXütäëòçg}‡2JÖíúoá؉» dþœÄ‹!ù^}ŽÌIeCØU +Ãe²rÓS PŠ»”†KäɅm$nlç5Æà—wa}2†hæÊd×Læ•,åGËÞ*Ð)çܦÀ½&nݐ~Á<Žp„úL)ÃB/#¦%pŠHH)ޘMãÜ*çoEI²ø͔ˆ´Þ½ð)[‰5•íûL÷òYGŸ_Zw€–¬è¤ûÙ™ñ”ï?ÍÝrãþÒÌŽÑ\`[ó´Æô…#§mHƒ×4ñ¯eX1Ɖ‡Åñ0o´{˜9¸g±}®ÓÄ»4}S +Ö-Z! ×ÇßîòIœ'õîå(É÷Ϗ.ׄûC—Tc{xB-ÞoÅ-V]/‹¸Cpx¯ÎŕÝ=ј¯h$V©âæ¯:Ê· ÆkWÕÈpÐó¤Aߺîb­'oÅÍh»íðŒ•¿^(ÓgԔ“ì-»fïúæےe Zç;¸ùØßwO†×Rêû‚‚ÞÀ¨î–¶*^Þ`ÞŒQM#Þ\'íz<¬ZÚúÒKZºó‘¬¯2t¹ñPD´P*oü&;Ԏ.PÓ~m›óo﹋Ë=~èjž—¨nxi¿¤ÝŒõâ)cmÙ//pÇ»tc¯h/„ÁðI)è–‹Ÿ[xQ“•0o-$=é`ðPŒ/+aðodƒ-̙§á½°©!°a±}?š›Q±ÞSÔÚ"Ž)|dç»±œžk5D@šK¾ìU(ÈoRëpz3›Å YO‡€HÌM{µÇ ÃÞl{“œ€ûxKƒZÉeóÍIÙv/ Õ.ú߆ì”6–¿ڛÿüˆØù'Âýeo6a…~ûmf2{ƒl¹ªñ‹î´åˆtUÅù$™ Sƒ‘+—õY«¡™ºR(æMÖeÝípÕàDŠ[‚å¾Q9JÍùÛó´®qör³Mô[Í’·æŽ§êɦÌOCÇäEÕc­aò|:Zµ†Ï0Ïә'w<’qøŒ8­\½ÁõVêÓÓ+WG›?Î3¼ZãÖ0’?숶ª«¸xga!ûÒÅõ¡ÓÇÂSAûrÅSW-b‡…p³u¸Ï€ÈuI£ Ù\°þ’æÔú~Iq¾«iÕØÒ§]‚aK¡õBaªÃíòìâ!Ë<¯B£¬$)FõÄÖßÑDÙªÏpˆË"¶Dà­À6¨r-¼ybÁN.9²úÁ'¹}&]é<%’{ï¿=˜ÑQ0=ŠÏCÄc^ª*/YÇ^éí¥Xhè“Kú³’7çbu6“ѱ|Y±‰i8ý¶BØ^³óòäépóg`[i—ǹÒGã9;ܸëf÷J’îýäÅ%óÜ¥©nž8R<îiFÃ23Ño›'B$-DÇ5]Šúr›?<1¿=`XiºÆN8™{©¡nû®ŸƒdÓ¶ CƎ¤}ô×uòè +endstream +endobj +2505 0 obj << +/Type /FontDescriptor +/FontName /OTQMQX+CMMI10 +/Flags 4 +/FontBBox [-32 -250 1048 750] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 72 +/XHeight 431 +/CharSet (/a/b/greater/k/less/m/n/r/triangleleft/triangleright/x) +/FontFile 2504 0 R +>> endobj +2506 0 obj << +/Length1 771 +/Length2 1151 +/Length3 0 +/Length 1696 +/Filter /FlateDecode +>> +stream +xÚ­RkTSÇÅë2ȳ"¤òõ¦U*ä!%H1€¤T‚hxHE.!gŽ&ç`0@”]( +ÈC ¹PA[ +"ˆ*ˆ¢UQ¡‘X¬b±Fñ”{ÀººJÿÞ5æÛ{Ï÷íÙ3”…a|7‚Çà S¸ÑÝélÀãÓ€ØÓh$ +%@ +Ç +Ètoo/ðU’0X€ö9›Éb3™$ +ÀU2Tœ K–NŠX€#…2T(ÀO H€R¢‡P |\ˆB…Êp$°vò„¬…r(K†ˆ;‰N*T€x(F1uÒS0&Âë=Œ$%~ ’¡LN˜K¦l.„IÇ$*€@‰ŠÓ áåÿakzó $‰$T l?•Ô?x•¨þTàÒÄ$”Ž@6]ߛãAM’Ngƒ *ä`b ntOwšç{•¡Jˆ„¡ +a $r8…C ™î„ÈoÊõk.7t͗Ÿýù´Sd˜ÅáªDh©§jú_5’ U‚õ4wN‰õa·aÚ°•˜GPL L/ É*hÅ`2A* •* ÇTw WG‘Lá2Òä»z1U<ùՈ°â=FT ”˧€^ÍßW¦ºyЀƒIŒ¢1¼‹IKû›P˜$“AL1õ}ˆ€>Ô"”ÈB%’ô]¸ÐgûÆüºé+KoTÎZ*w,üvûÕFmm¡ûà/>¶·eõ×áós­ÍFô¸õÁáUßQó>¹Ž£¾”ʧj¶¹d1oiIöˆp0&vF{q[‹•ôHæc½K_býg#w¿ìMnœU2@g%ï6«èî7¦oÒ\»¯7/@?:HÚP|6$Fö÷fw¼â⥸¾¬Ý>¦èåGèÉ-÷:7, +½÷ófv{¶ž[•7²¤¢UÐc(¸¨~¹6Ìԉ<à…ՍÛù²­çVÆÛ>¼£÷Ζk²RÏÔtCÀþ˽3´§ßÙ±,¸MÙת<`hÕ¨fêfï_ݨ/·k±[þ/çSœQ‰Íã§[ît«Ím~=aíT‘|õÄq4çéÍøYÑò„.»ÁÜõŐúÓå¥T›²f|”S{tŒš ŒÉéù&Š©©Ú¾¹£)Li¸ÝgI9úâQUP‹çõhWÇ~£nAIMY.3’Õ§˜Ÿþ/ÿÎÇώÖìüu<‡Í`—ŸQÌò,³®MŒ!Ù!)cÆGìŒ ½˜/<Ôw˜ª*)Ø%ÉOÝ:÷È©ZàÝòÅi”¿ÙOn9óÉ¢‰Ôšf}šÇø–êóW]㪗½Úó.»µa^“‘$ö}³N“Ó§~͸G¦EÎ]m‘žzmë©60¢šÍ“g¥Fº©#Ì\¬:sÏW:xfXeúÃrñ£ËiyvúH>e_$kåŒJ7µŽ©ñú[ý=és¾Žu’JŸÎy1hÕm±Åu)x{›íŒœÑnèÑA„æ/çÏ÷³ÞíŽ3IpIñN¨ë¨Õ™òý”}±©³kíí”3ß5*®~mõó‹$è^d„ÿ¹«iEÎ'C4ÁÿƲd;¹ji}TaՎŸÎuÇÅ|™brmٍœ9Û2 Q5Ê¡û×Ùæ¯÷žiõ«Î‹<«šže¹Ž¹ˆÚïùÊÐÍeM`ÃiëùҊ‡®ô¬èQÇYþ÷¦É­å>ª¯kÓM—…žL<“‘qʄ{m݀ío鋚¨œýÓïÆäc¿uږwì2O丢ۡcN°Bû¶ÔßlQÑÐHHÎÄÝðK™}¯ÖøRȯ:tªšã­ž¾½•tؐ 9iXâ1Üô&¨Öåy–lâyÅ麥­þüdۍV~ qŽ™òÌÃýâ2îk™Éb"ۆbjïû¦d@Ÿþº|ÎÅ^ק5•+ÍŸœ½'¹Ôc/tÿ±íbùÆ»£çëƒ)³ÛbäBñ ?ëïíÉE›I»Ü¸ùÅG8•Ëês‘=} +Õ³,.˜ð ÿ©y᪪ÒCu±¦Ÿ'eê +Mëw¹Íï|p9åÓ+¡|¶É¶>C|Ê2¥ðåN!š½ïü[›þ®÷o2±Ã™ê¡q' +t•zTñ]^….°tö]°>ͯáfû…¸5©ôöNÇOVž+2êϬÝzS°wø`³sçjeqå'¹mëz¯d ÜNÓ9ì]HÕ5^÷Þ= 9®«¨2ýÞ~^ÿ†vMÆÿ§b=  +endstream +endobj +2507 0 obj << +/Type /FontDescriptor +/FontName /ZGGNQH+CMMI12 +/Flags 4 +/FontBBox [-30 -250 1026 750] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 65 +/XHeight 431 +/CharSet (/greater/less) +/FontFile 2506 0 R +>> endobj +2508 0 obj << +/Length1 805 +/Length2 2096 +/Length3 0 +/Length 2657 +/Filter /FlateDecode +>> +stream +xÚ­’y<”kÇOQû¾–GfÈ0dKvÙ²/M3Ï0ŒÍ Íا‘­}çH§…JŽ=:²d_B–^1ö%$¼£Îùœóvþ}?Ï?÷ïº~÷uŸß}ËJYÙ*êaˆ—Ac"¢ˆ€#4 35€±TV†Èʐ@G$¢( &€ÐÐPÎùã•S€²º¦ê)MUˆ,`@ô£‘pž^j;0©z¾ ‡F Å ôeÌ@£ð€-)48 ‡Ç6;Ȁ HI A M.ƒž8DéɌ€%êßË¿¿Z ‰Ì€ ß0aC$àiÄB”,‰ŒÓ@ËÿëÇáÆþx¼%Ê÷`üAPÿj£|qxڟ¢¯Ÿ?$D H"ühu¿³Y€œ¿ï]3 + +Cë<ñ  ˆ@•‘ßë8²1Ž +b¬p´€EáÉà·:HÀüHˆï‡Ò ‡ ¬¾_췞 +G ØÑü@@ùoó7ø[3""ᨀ‹2\YÁ02¾¿Vn?œeD@18‚' ¢ª H$ ¢Ì¥¢ª +!RÊV‚ˆÆ€L€%’ ·Ê¸C@ sPûS"%ðRPòý["fÂ?¤: äÿMþûÿõõ‰Ô ƳRTQe𨠀ºªrÈÿøÐþ$H |{aŒÿÒX#w¤‚hÈP?­é}¯ò—’P£¼®Ò#0²DjQäÛߣž¦jÁécZ|½¤ªN;ðø*o¯7®Œ'eÁ¼\ ƒUý Z©Üd«5ÈÛÂ)ËI³eYBÓ]Ý·f½nàö͸53$9íW¥°4,³1ðû‘Šó³õ\хÛÌ%ý»k¡>aí†Øïcd>¦@ܲªÏ'ƒöŸÆã۾̛óˆC­Â®iü{C¢ £Ý>ï9S5¢³,˜ú‹—]L*’— %ͨ‘÷÷›‚7l¬U#Tî +êhòp”^æ›ê҈'‡Åªø"ƒBßÜ}3nx8êùWÁ ®û½²qÍԄÑeäÉVƒìÖäëÞý;ŠMõº,aÂÔ¤€éÈÃ4‚—5KÅ¥BÝGc‡±}®+±~—Dý6/‚½‰ãf¿ˆ÷7 ‰O-'ÖZªy «»¯§å{:˜Œ£&” ÜaÁË"òº|۬ΫL¦T†q7“pžÑb}ßòáe¡?ö٩¹ÎÌõ€1Þ<ñ+‰Ë§X%ÿDC¨c9%֌ՙÞmÐ$fq«pÙujƒ&[ϗ÷64n‹çy}væ‘õ”ºzr~¤1àMœ®¥¶.wí×TëÎjmìNävӂܸß/‰6ýâ}‚¬,÷žûÿ‡ËËÉÎݚª +¿PÀçœú‚'‚'ÝêÑÕÂᨖ/Èhãýæl;º•m»O.EYîݬ—A§Ž4ç5×Þ¬sm±©>Pû:º¢Ûs‘ZgX[#EógøÇìvU쐽=Bè^ã›åF'§+%ÕùÖtžª‰Ë_¯L¬~«wüa£½ùŠL4ašý³4^„…gzˉlŠ|;¿ÊLS‡œә³á>¤óʲ9›:7Æ:†÷?~ÌÓW6>°úé'‹Æ£{ÑüfE8k#‡¯Àšâ%Ӑ1méñ›†zòÄNÚiÉ»Õ$(S'<v‡#¢gS[„| ™;ÜõŒíQqÒò<ï•Ë¤wàQ™“#Z’Ä :‘*îשò-Sw#C^Äa‘,5U>·>Cü OÏú9^^ÒÜÄ3ÕÊÆÒF²úŒÔ$sUæWyË{ñ—úžªü#zž‰ Zsz{x¹x?º‰œ<ƒ´‡˜b4ÙŒîÂÛž6¯ï°Þ¨W ]שe?Á÷X×¼•WÀiÔÉߣuºÍbs…Þ—¤?-ïw¸•9qh¹£l,d E0ì49§º»á¨ÃMéXâ[ŬˆP©1­‘›sQKæ{O9‘j{ÐGŒÐ$K£}²Ù“4‚×ö;·ïA'fÓâœx…¶ad3zP`Û`=û¤ã«á¡ìEñÖ³íô¡:ýq¾µ  ŠÂ|¬™ŒrYø§k(óiÈfK3œI½O/M5oX v]>1j~ê +{HÆî¬gŒ‚òÛyÜÔ©>Ö²Gõ\ú¢å.Sø.ìó‘"áS™­{ió]g™$¦9Æaz˥ڛOòa±f ÎWU›Sïg5=‚Dαt\Ò rÅ?ɬEŒƒç¸’³5nNö÷›s®\„µŒ†ð~ôp + !.6‰É0Û·d”r=Ђm¦J½ )ôñ^[9hw]fò½‘‚îü¶b6b3lÐMý!ɗ[ܤ[3ÓëəÓ3¯¥UM†‹™Ùk°¸\5nôšr˜Ž:_œüØ#ÊÃ~ñEwˆÐØ¥>¾Ê}G÷í‡Ú•èŽ­ôd½$E²@w‘8Õ¯$€ÏÃÂF¾fb÷Ók¥0Ïÿãdù +endstream +endobj +2509 0 obj << +/Type /FontDescriptor +/FontName /OMWOOP+CMMI6 +/Flags 4 +/FontBBox [11 -250 1241 750] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 85 +/XHeight 431 +/CharSet (/d/e/m/n/u) +/FontFile 2508 0 R +>> endobj +2510 0 obj << +/Length1 819 +/Length2 2291 +/Length3 0 +/Length 2854 +/Filter /FlateDecode +>> +stream +xÚ­Ry8ÔkÎ^–,‘$õË£˜Û`NKÖ±¯E1óF³0#K²¯å„Œ¥œBe …81•¬)K†"[‹±%%[¾ð:ç:çëüû]ïûÇ{?Ïý<Ï}ÝÏ«tØÞI …£xƒ'(dš\®˜ Ñ–€ó„Á•”L¨ †F M14P€ëééVAD@C€!ôµ59WP 0¡ø‡R >¾4@ŲMB(H%`1d¡ù‚$N,†8Q°ª ˆDÀq»"pAj0ˆS„ÃK¼AYº-ɒŒ§ˆa\ÿ_©`È¨|— 8"q21ÀxA¨-…3 ähùÈú¹ù‰ "ÑCÚn¿mԿҁú'Bò¢TMÁTòÏT7ð‡64ˆ#‘~ÎZÒ0DEö!‚€\K¦õ#N€†¶€¡R1¡‚0N+ mm È8€tŽ`¨:™Bã”c"<…*¸½UÎ(n;ö'„PðP€þõ(éoçԒÿ4è;ü·ÆÆz PÓІmáBñ?4l• +’ißÿÇÒ¿0žÀÙÒA¬àÐ ‹ŒõË®‹/‰4+ì-åƒȹûŒW“ƒTŸCJ°¨÷{œÁƒ‹âqâ~„2±+óÖP^{B¦Þæ{%Þ." ¹žë$°€ó<ÍÝQÐÖ,Jºš45tè½ÿý£ à +ËãÁL¾J›8â†Ì|2oÉËÁ/‘gÏ?Ÿbà&¯z<°É]§ÇÓ»Ö?˜S +)CÅҞ¹Ë{6‡dšG_œÉÑK)@ó¼ Ö—Ð(TÐϯ$T;Œ÷>º¢^N6xX_¡ä÷ h[úµXØ¡‘R"„©ãåjÖ®, «¢¿²N&çÙÑC°%¸nåC:ìžy^KL/u­nüuÚw86±ÜT›]Û­5›8Ã;ÐIw@GšŸ]˖Ce`%¼,ÄщäёÑÛ7«6Š{øyf ŠYzȹ»äýÕÔh[77ß­ÿ§íÓ©¨4‚«Å¢–¹õ¸kÁŒ/+Õ_B³y.é4¼+ nž‰¼þigد^2/7i™ÉÜcÚ½i¢œ»ñËÞðL•¤BÇÅ­("tíޜåÎz©{Ï7´¬¤Ç9þ’ÌùXÉÓwÉ4Vq|>,®Jpˆ²çÒ ÿÙ>Ç°•ç¹3ô4Fü‰ac*d¹;a·AÛÎ)úԝ «ÄÇ:’Ǧòlóà 'g¢­)¼}¨É¤{¿Y©pÁœõâ%×2êž(ßú¨ ó“Ê®ÊWºÄwD¶MkŦ 6ä¹Öú¦Å7ÿN‘GƏëRûÆu¥¿xןtiíÔ+Ó$¹õöV H¿ÁÔ4R"ÝÈ&4ïbjbvÂóæMY+EÏÜۄãï\(=y.îf)£UZ{]CÁo|öՐ}‡(©26ï YÛ¸6-ZÇt- òUy$µŒ+{t-ØÆ9NEéƒûy¢õ`Ém¶çû~ôÕ7É{ÏPû~öЛ+¸°«".²ù­ê%ñîȧ¥Ù6녲˜ßŒ×°êM̶ V.ºS~1éxSQ";¢H-&õD]ú‘U›ŸèK֍ôìˆoH*\­3´ÆŽQ®òV>ÆÊ9bs™W¼)W-f²š¢k8¥ËŒ8lשM{ +IÏNª­Ø4ç$‹2±_íuV}_¹‡tswUÛ 1|¾.¦Æýî ¼q¤ª4v#¼eÚµ.ÙPN†äO}Rû´AI¹û.OÛ®,Òúú^šŒd}®Ø®øëjà u‚þ; õßÝ¿ ‰~ð‰ÉÜWpýc4—ñdé­ú®Ñ¯¨—ä\{çT²Ö߄L#K+|†JÍ”Ïmž-X¿§€»ÖÑoG¯_ÞP¤x±"”궴īX) ¾¥Ø{L³áÑ¥ÍIïV2F¯Øê7ÎÎvQÞ{äF„:ê4ûJ0Ù³YS-§| ¿tÍZéº|J²,°Z8ٌ`µN˜ÄŽ0¨Å_¿¨°aõ–]©´x17‡&“cãÞ2U1½µWŸoZ½äØï1WSޱij¬¢?<Ò2êfÓ{G)¦YÿlÙXŠR„ïq½„ûŠ0ï „BŸRÂCî¨öÜ×j«‘Š>>WY †º‘–óÝoÙ󗵦WÈ}Õ:ŠºIŸtÑu26C–/Íz˜q9“.¬Œ~Çç>np\mÑÚ?ü”eÀ3s(zg®¿d†úµO{G÷£í_ã(ú‹æ 9(©M² ÑE߄K4‚¹’¯dM؇f§­TŠì®âCqÖÏé²S÷fJÝd-ìčöÏ/Ab½ß„]D†Û˜°ª÷…Ë^e%Ó\"Eï¹uLf橬žrbe¹‹TŠÎîÃKóŒI{Vìì¸0êªÙ:oüü5ö,TméqˆD¬¨;v(íVÔã¶O©"w—u¥G,o¶V"-ö¬c!•Â°}K×/ˆrÅuiç ÷ˆ-Éh½ÉIØßmº{ãͯ½ +>™Ï'NÛ3ž¸1ú&Ì Ü’M_Lž Ø°rË#ØËëå)nÉ- dÉ®‘ëð҄ô:çôiÞ[I1"#'PUóÅáÁ´õv+–†#,¿ÏÄF!Dj2n<ž§f…h.^7ZÌzë|ðhm(ŸäîüÚgtEŠZï£óר²ø)Û.ˆ­¥LÁ}—{Ÿ.9n›¸6→=Õß#­e€êKÉ?™s.Äï›r`òMQ#»¶éúx³Xóæz™#˜¸£: ÑDº³Ã°PýŸÅë°M‡«söµí̯i n>û5ÃŽ¼ÈwÞ̖ßìÒÊm§€zæõéW]qö;žíþ(D›æGÉUn–È Xßщ°mq•/ë{¸’p§ˆqø”u‰íòiDxçH­iö­¾NŒÞç$W$ƒTFú^†ßr^(˜8XZ]mí™6Êà ;â¡ü>ËðìÎáðM×K7T«›\Æéq¾yänŒ—f¼±<•LM6qœÍ3J”u…õú…ŸÃˆe%‹.¿Êºy¯A‰àCµuuýÌ灮òά`©ÿã>'­E© +uñ¿Ahµ?÷ë…\éĆD•L÷ê/±O‡±ð_j²Ù +ãiƨٙD3y©ÂcébJ„9¯¹©—ØÚr¾ÑÝÕ< ÿ š÷.?Ïì¥ß¥jva›%q^ù—³Š}¥1|PĞ™¼Ճ4¸¥–]Zšb(s”^?&#å%¬ û¿ÛɊHíϒKp‘ZÙm•(fü2²Kï–æ—Mc šÛ‡´çѝùe;ó#bfwËw}þöÐCV\iO½Ü>Na:]7`Kse"ÏKýµ&ÿsf酻i2QÿŸs +endstream +endobj +2511 0 obj << +/Type /FontDescriptor +/FontName /NNLWPH+CMMI7 +/Flags 4 +/FontBBox [0 -250 1171 750] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 81 +/XHeight 431 +/CharSet (/d/e/i/m/n/u) +/FontFile 2510 0 R +>> endobj +2512 0 obj << +/Length1 829 +/Length2 1697 +/Length3 0 +/Length 2268 +/Filter /FlateDecode +>> +stream +xÚ­’y<”kÇQ‘‘-Ê^OÆ2’Y0£¡d/i†Ð!TÆÌ3LÆ ³Ø·£áH&["JL²Ô„È–­d)Ë´àH'’tbޒ⠽>oçß÷óüs_×ïº÷÷ó»íN.–$ºhG§± Pp”)`ÃÙcቄhk[3@‹B§ÙX )€Âb1ÀA604&¦h#S4¢ XÓÃ_?³Ö[2,@…H 8Ë z TÀ…N¤€¬08`I¥Ϋ7˜€3ÈÁ A¡…È|@_ + ‚XE²§‘é€É·6‰ø] +L![ÃÔ„$:@2§ _…,ÿ¬ŸÍíØT*ž°j¿Ô¿dB…ößz@ ›22h?ºßØp ‰ÂøYµg¨¢%͗ +(c8Òø[ŸÂ´£„‚$' +‹è T&¸Öi¤ŸI„ñ­q lör³Çé[ìšæD ÐX®a €ü1¼V£~Ôˆ”PÀ G"QÂAá÷ýt짷liD:‰Bó Ñ€À` H¡•! D  +†`¨§ÑYÂ+€0˜(€Lg@V·ŠA*Èd®v×(”1€`üS›! a5 *Hfý0?„o›þÇÁPèºVþ;++zh„!00D 9‘&hÀŒúŸA"›Ái¬µ?Oî÷šLîCA"„?D'š>™u;¡4ÚöJßõ zLõœ«§6Æ×ä˜ÁgFÍ6?aðz]ÁmäãåORÊä.Ì:p$2z\å¶edG„ "~D¾CZQïr®‹ÄqÆë¸XgA{‹l@~ÒkþöÉ@žþÜS¨`,¸qCÅ¡i”I‘ÊlòúÒᡯóÑþ1=ã|©lôÕȱ‚úC𗩱ôŸßî§_¡ó‹;•¼r +Ë|•–þÏ¥s°g pësö~‘Dꅒÿ聠òü·óÝ/aº˜nTÇ ºOÌ:ævq'·­_üâüÚ½kÁ#£‘NXì}æÆlϙ’4¹V■rgà“çG9ЇjË[6¼PH¯ÌkÎ ­5k÷kÌÛ)C)õ;b…½“"RQÐðþbïã*ÉCò…û}–Sš§5Ä °êf͇7埠 + ގˆ9šR’˜7y¬ïIí½VøŒzaÙÆ\Îû€ýÕtŽëg~ÑãG¶j!çZó“5^Ì5œÞ¤fU‡ó^‘‘Ýr“§yc&1f!É]£äsj‰½Í‘â3[?–IE+žÈyö•¹Éù|´&hۛÚ:éyE[÷¥ïC»dp ®iÉÑ&‡ØÇETŒÕí ¹[Ú?–˜úôKÑÄ®¶ºW}ØRGVKÃKåŠ|'õ¢í42<¼Œ]ü·K~4Ué˜ÍTreî랣ê$eó 5gOÁÎ}Цe—SÅ¿x¨`4‚èN)×y§å»=pºGv5·¡ƒ¥=’Ñ<õ£æl/™€1Úø´ä”ßײ¯ªE»p#V_*¨€ü—jæII©H‘Û>WÚ995oo> ìôr¨ÿ 1.F§†«|(_ +÷ŽuìJvX¾·¢ÏÑû“ÿ+Vßrä®'Ÿnôë²ø¸Zbþ‰W·,ŸxlcçÒ¢Zõ5¶bR%K±cڞ¤ŒÊ*ÞD³5þ”øÛ«=Ân)ÖdÈeŸí  šž°Ey ?Ýá³ã“ÕWYó Òu-{²qN¿Eøk9ž°4Üb_/Õg¹4¿ÁHbkB¬1zºËÂûÑs4ѽ¯_Czzԇc¦ºóÿÑÚR©ªs¯}ø|ºHۊ̦…“ Y„üÓbWj ï¤sç†\HP·Ý$…çËíÖâÁ`RÙKÐj2–ÆwqéìKªâøÊd4YnÞj;TÓ~¦¯}“ž†ú}iã:q’æ/ÅE^¬óëïÐ3‡ò¡‡1*Ý“Ä©«5WGw6®WKJuÝÝ~y +Ý ¨º·Keëón’‰kóëŽÙ?ó #ªw×MoO;V”ºiûäf»žQ1ïÖ¶³msZ4eGN«Å™Èx™N‹Ið~]q‡[y¢Ÿ‡ô†C#¸Ù–6ùǏ—AÕïû¥¥µ=/Áç^pnèÃä¯?k4=ò6 ûnó„ßüz“q¡É.ëþnP™ÿXW¯,·õ!+âVå\—g”‚±»Rh¹èéÿ.YÛ7`œÑs»óƶ ÎHaKʵ3Ñ_”†ÎHdŒÖ]PŒÒ"½º“y¸íå| h71ö7‰1OA +endstream +endobj +2513 0 obj << +/Type /FontDescriptor +/FontName /DGLWIM+CMMI9 +/Flags 4 +/FontBBox [-29 -250 1075 750] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 74 +/XHeight 431 +/CharSet (/less/r/triangleleft/triangleright/x) +/FontFile 2512 0 R +>> endobj +2514 0 obj << +/Length1 1003 +/Length2 4417 +/Length3 0 +/Length 5068 +/Filter /FlateDecode +>> +stream +xÚ­“y8”ý÷Çí„l‘e”[ö}ßBv²Œ]v5Æ`3Œƚ-[ö5dWÙ×("”ìD!;‘½H$»ßô<ßïó<¿ç÷ïïºçº¯û}Îûs>¯ëœ3<œÆf"jN(G˜6 +‰‘•¸ h€M%Ä QqquJ 4 ‚£š ì& ¡  hÃñøßMé›2’”<€ÊÓ wqÅü¿Mr€š ‡B‚q…yàk@!À …Ã0~¢€˜þ>á ˜Â¼ah˜“(¥„à‡bG˜ I)öIéŒäþ ;a=ÿ›ò¡½ñPÿ˜Ò …DøN0gJ1Cþ6žåÿëßŵ±„!Äãwùߍú?iˆá÷Êˁ¡0Ê †FþÛj û“ s‚c=þÕÅ@p¨ÒÄÿ Á½µá8˜“1uœ!oØqÒéßøÎý ¦a£ ¶²ús¦äŒ!p$ÆÜÏ󯪿Íh‰¿5¾;h8°Ç·WoÄ?ÿý²ÿ×]ZH(Ê Žt$ed ñ£Äo^ÉéÃ0XL‰ÂàøžÎ(4åïâg"ùúS)bп”„¸8 æô—”•Ä`^Xü¼þ6Hb.ÿÒ€˜ë?¤< öO3¾¸Çß¿mb¨¿¤4>‰BÂþÖø«=!hsÆü•øOôϵú+ŒÇðD`½ÿQO‚þ‡”Äþ™Åƒùü}¯üaè?Yþï ÕÕQ¸I ÿÿÝ@AV!è9¡X4ž +óÇÿ¿ÿÕÎpüöÀ`8”rjUŒpËlŠ, Ö*)'$Twy‘dØÐñ±*|2™ñ´_ßKp¾Þê¸"û +Í*é*‡ï)È;¶5ÐdH{'Ô+éÑøùªÏ½ÕlÿfÕl°ßŠç_á[´¯šÆö¿Ê}˜(K³.y—û½{«Ð˜_Ó||–“ ÓÖçygN„¬œ•v6Â"êA=¯§)Ý#¯²hé¨9_º´’¹÷áÁnQ/…fvQ­X†ãbŠ‚Ôs»_L‰ôÐV)Ó%AFÓ5•¯¥%Qt´u]½5ª9€‹X%¦0í× Ï»Y“ëϦuwô;ó°V4ØgG¸¹ÕŠóŒGÖ~þ闻RBw]Kô&ŸˆO)FUÆóQøŸo‡ +E­ú©÷¹CviS1…ñwìlH9/7»q1Û¼ËÎaô— ÙlÁ¦LyÃS%í"«šm¯ôԛ¾Lwì¦.pläHEÛÕ­d¼‘Çœ×xÝ@¿Ë”-v=Au÷³z‚ŸhÍ¢ñÇ8Szðé°9Q`;Ã=Š:¯jú¬Ê¬I­(8ôKh.bXƤˤR˜G)I±ˆôW^­&+¥1Ô¢a&óñY}õ\0›»²õVm€¿ây©Ñ7…ÁsÛúÖ®<‡«™Nä¹iˆ±ïÜ;–9®M³7k"¨TºÃøѲ Šê˜9²~ٚD¨v'H£=È-¦È)¬ÿ‰0Þ«ð™AvÚ7‚Ô''0ËýE,NÍ'àÑ×b—ծô´ä2VBwÉuMl±$’EâgōXùƵLÁŠN.²¶¬ÓC–\¯—3ûéÆ-›w›Û{3tS²1Ó5y‚6¸žZÏDY20RÞ&óæ_[>zÄ]‘¤A¨E½ØÊ´½Ið%n½wª¸}ÉŽ~u)Ý«žµ!d;϶ÎRß0ö›L4Õd‚MÏÔ9O—kÌÐ%©ŒïËzŽG·œz×2íÎ ^œÜzµùG%¿TBYƒ¨çE·B+r&%ÓýÞ0p¹þô؊iAª¿›Z¢å‹ԋùR•u?–r "E—ÉIç dźe®†Ýã_ž2.6éWêoÞ¯]Il¬n´íÈa0Ã<„<_¤ÖL䕶jOWˆlgɐ%N?Q·©Ì8ýfkàƒJ%á(¿üŠÕòUÂÍü~äóŸ=Ø76FÆYC7Şd÷{[²nPɀÍ?½˜ué=!m€Žb°£ÐNdÛRhšq²má=ŸFáÝØTyWHX¢£É²æ+ìé×®Éê=6°.œ&yæۘ/ÿm5ñäÖyxUé¢~tßö–ÈËË`òFá Æ©é…03ÂÊnUhR.âZ¯ŸA‘Záñ™é»9Á#®ÏŒÜ¨Nâ-hc¢ÔðˆÔeÑ@é•4A‹«ÆKÌû3Å[6*Îv6~â +n‡]W½—ø‚Úš©ÿò2¼à½Ð¢úÎ@ÎAÖôރ|!í…ÌjÒd?öu]&³.Õ[g(6Í\§ +­o‹L}Á‘݈tÊLQ’tLESýV~æ}0œJbý`Y,|ŠÍÖFï¦ +Oä…P˜­‘›ã2svÔ¯"@¢qÀ€ +ÅÓ´«Óª"RǀŠ.ïû=b‰Fî/>ɘlK}.#|+›“*~}[X[ö³ÙQ!,¯hÛMWëÍڃŽDzÒ+«‡»B\׏ô﹚ì¹×›ª(Þp¨IX˜Ni\°á¿RCU€9©¼ûƒP2»;WÍ÷Kù$-(¹¾_aP1±_÷~ÄÐë:õ­Üy¢.‹°DӖ¼ÐõÏæÅPýCƒiÊzTo+¹ïø\Ó30b ·:X‡›÷¥ƒv†œlÖÿ¸ r¡13±t9?Xëh‰„±8%¦÷ÌËöO̜/ìdº­3põ{¸øºÞüLð½[ŸôZøåí/ùî|s +å÷ŽÐÃ6lhâ»Þl8û1¡‘a,¢×±Ök6-µ+¢F½+iοDÏ_²—?r>d#jÛÓ=®øq+²¯Íñ”6—[2Žå 2ÇP]ÿƒô—©þ É3¶Ïv[œ7ىŒzIœ·NfhIž{_ +pçž&qÈHêˆct\ ¯¥ÛÍ®´ÓnáŒÐ +䅇ܗ€Ò^·aù3d·¾ižÝ2¨ö³;RÖr¦2¬àÒ_„µ©ÈPh@³C;½Î²O{Œ/4ºö|µ$Æ°!‡!¯Uیw^o|ëC6¥ ,±¤oÑçô}ö³Ìº›Šþ¸ÌÝgBf2µ&ºE@˜9¾Z¬‰9ép—læ£7’^ÈËfåêg ×¥ +š¶Ó/_aóÖQ×AÓq0tý- @)¬Þ°™(ߣþ&’΍-Τ϶Õv›bJXäBDâ\JÚ~'Ìå¼`6=>H Ïé ?eC$‘ë‚nçe'~Wm/Èt±¶%OS~2`âÐ6 ’¡Ìåp½Ò±6½S¯ªQÅy¤ôXª1IV]Y±º6Á]².í7 +áõm³NWjÝJѺY—Å‘&/µ|CZ.Ù£íò)Ûí7¹œ§ƒ:€-‰À– (ùrWàc ·hKÝ>áî`f/¼¿=eµ¨v®Ç+Lø]Ódàbu ÿ¨Š ÈÔGÍVBë/Þ?Öa¬ï°WÒ^Á@¡èüy²ÍḢ¥Œ/}*58Ë¢¸L½{Tø–¸‡8M)”[Z‰Š Jßý*¨ß[ė–|¢?”Þ5«xðÖ,q¯ ób·Ù¶ýA¸ù÷¦ª£”NùuûªK±¸"…§éeÔ#pfùO"áQ&ª?fÛïû=x@¿Ï¼Ð‘a¬±²ƒ> P_zí}W¬àˆˆ^ؽ6a[áï}æ.ÑzPÔ¯‡²Úë~Û²Ú žn›~aºdK‘Ìž‚½µ²Š®›«ößß^Í3I)òbÏIšÒ¿ñÅo£=’qöŽá„Ù‘–¢Â*Ohù²ÆâÍPi_ËôO£G¢®¥Vñh.0)mtL Œ¡†±Bó¬TÚÇ¥qLåuõ¤ÜnÝ% Ûs8Ñ>eö­¾VAƒ$4YòÓíqKå5^JÔ×=|%н(Î3ßجDT)lfÊ­‡éà2î<ÞØwÙO“’w5çzù,Cò«4€Y Ü«E:HWG¬lÆ'Wށ† QöÉcƒ€}3êv³G¯Üû-í ýöT·9‘ÄŽG ‹²h!UúsoE†ÆàaDž²±+Mj§eyF)çt³USO‚„[«³ 5Xœ|æòp¾šøñ/ys±†Åˆ>…ÀLAmŒÂâp3|pDçžE#Š%(ʼ +O·Kž³ÜaE¸#2½¹Iè5'>¿¶®äY +újOžVkFûšÕ8‹yG:ý9ð<µSãõ1Kì +˜¦(¥„/bᵿV¤sîDØÑ·!±Üg4¹õO§K;ÊEͨ&BË`)uóÂÓݧ Ìé›®qòlîí¥..}TuW éûôra-š:Îî”INF‡/Ô +u@¼¯šîò0•(f뼡wƒK³Z¤Ìΰí„óTH®çƒ•|Â2J©átÛ{™­õh¡½ž„8¿D¤ïðL…~þá>·ZãD®FÅÂl•ÁmµD¼å‡Ëvx<_BŸÁÁ,ç4³‹µáMOHZAyáàʯ}—’[çÇ鬛»Ýç” ‡ªëÞ2bجn=A)<ùuj˜íoÓÊT[Rl±ïgu#â#=U‡y¸á…r͟1ñœ?ÅziRþëÑóÀmÜx3²¬$ÞÇÌáød¤{9¹ø(=]G$•hŒ#¡Ksª"ÖÍ¿ÚÌ£·9N¤>Ëú3û1CBƒ{X·Ý€MIÑk¶4¯œ~¦Æ;ÌíJ- يg§éEDC ½]Õ¾¯I>˜²wö´Í.Í-êY1Ï,eWomV Ì#°8‚¶$õŠ†Ý`åtšŠ.1}ëp6T¸­B ¤ÒÁ|[ãåתñö÷BàO±]-qöÞ:ùfr ý+׊ µÝkÒÌj}|ø¹ã$¤ô²Nm„Œjÿ¶¦Ãâ:ƒf<җô˓ÞF¸i;Ÿ¬³…7}‰ÀðØìõ;'œð¸y G=ÃxôÝÓ¥±Àµ¦2z»bKSa•ý9I֝Ñ©7à…oFcøµY:D’ôAp˜©áISñ¯GÔྍíêIŸª[Áöz¸7¾ÌÒÑrñ ŽLs‹F¹áÅ­Õ$92®Ì|t×xgÙyŽ6agx±æ˜€j'×]XsÚâ± +H¹ûJЏ¨¦L»º‹É CÀ÷¨w<ÞâˆÀFͯSd2ºÿ ÐM$ è€tÕuo øÃV¤ +* !_b®¥û:=8ßðž¿a¶r_=q7¦Å1JíEð˜¼ç:ÝË<™ñïKo*x*½¤ÌF/{q$_b8èíÈ6úÛ½ 3Á•- ks‘øùÙ®ï +(¬z~BêÏ2l¨Oñ¯Yƒn¿ëu½]så°>DôÎÚxTt'Xy¬›ÌDÕÆW¬Xb*·ùâ©*Ée%ÎÇmî’R·­õFFK2yxD»›m6NúQ°˜¼ÅJü]uwâ´igË,xövˆ5_:ô×Ð¥ Нo^J¿(¾¯¼7–’^2aã™p¶¹«{|DÉž¾öð½¡àÔkN吠T'0Þ-c997}É[Š„­ÕËËÊÝRÜrÔN;O/lîzúê›,ßdë™.8ÞûÀ°ÁUúR‡³GwIH+¿»fëð븭Oþ¾Œ‹hÆ-ËÄ`¦¨|7œB’)Ö_ù”éõ +4ó©Îo#w$• ƒUÖ¸zˆ¾õðkÆ-ÏÊ>u _Q%Zú°¾Ò®ÜVàŸ¼¡m’Bvµˆ~,M¹è˜Á~\@qt¸É~Þ_És!Y*yo©½ÈÛÂHôαAa’æ(2f¬ÂóNîŒÉ8vzǐdx£øˆ©6:ÀîÂT¶- ­•ÿ²¦3I”¹æ-0Zæz\¾¸þʐm ñ¦Ï`V™üjó"ÙA»Í'ÆjÁ^ï­´œº{Z_µðo´j—]áXÛH~,+¸Õë ›LÈÈXñQå’_єËö껌$Sîkõ+Ö-Ä÷‰å0†Ïq– åãCÂ;üÂôw*:6=¢ä:PjÓ«skôž*?í(ÆbztÕIJ«ÌUyîUð&̶qíˆy¢§Fî[pšÿ{×aÕ䩲´©él`ÁŽFhIWœµv(•ØSñ…Q{Å]³}2òŠf"xCïû¼T©Á}í&ã/ëqŵï|q=Ñ^íÇ°~ƒÙXŒ ”‘a‚ 1ÉO†¾Õ'b¶Ð¼T!vÅìYµD¬îNKɌ÷P܄§æÅ5'Š* +W`âÓgêhøÍå*Ÿâær?Ö³“ï䱩É3V/ËHµK¨ä\š>+»ø·³Rì6YL•¬.úŽõîʞ>ü̘\z¤¿˜P½ízÞzmø>3ÿÚM•<]Y¶Î&†l¯_OØEÕ?§ï,I¶ÒµRêéø9îh©Øݽv˜É¢ð®æ»ÂKÝÀ¿!nÍÎÄÕ&Òš…4wu* Ɠ.ÈÔQÖó?!îý.É´otä0[jtW•)¶@X˸äƾE–3¶:AÈëe½#lJ®s §Ê?S¾r è[êGÑ?X}å +´¦éhiHBçc•DÿsͺF +endstream +endobj +2515 0 obj << +/Type /FontDescriptor +/FontName /CZIMXX+CMR10 +/Flags 4 +/FontBBox [-251 -250 1009 969] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle 0 +/StemV 69 +/XHeight 431 +/CharSet (/a/c/d/equal/g/h/l/m/o/one/parenleft/parenright/plus/r/s/v/zero) +/FontFile 2514 0 R +>> endobj +2516 0 obj << +/Length1 927 +/Length2 3031 +/Length3 0 +/Length 3638 +/Filter /FlateDecode +>> +stream +xÚ­“y<Ôí×Ç)$¡”¥¾È3c_BÖ¸ cw‡³™Á 3cg¬I!Dv +!$[4¤d‰LdKÙ×$Y²o=S÷sÿîžû÷ïóúþs½Ï9×çú¼Î9_1a¨¥¬ï‚4ÄãH²9ˆ: gb¡ @äÀlbbz$Œ„Áãôa$¤:QSƒ:Þh@ @”ÕÔÔÁòlb€Þӟ€A»’I=©ŸE*€Ž’€Ãp€ ŒäŠô kÀaî€%ŽA’üåwwÀâç "`$" >H„ 0pà‚Dcpl Ÿ~Œq(< òWáíùwÊI ÒM’t“RÝ"s÷HÈO Iwòÿaêßâ†Þîî¦0ŸòôýWæq÷ÿß<ÞÃӛ„$&x’€ûw©-ò/k&HÆÛãßYcÌ×Á¡Ý‘ø¯†hˆñC" Ü@Á܉È_q$ñoô¶ý²²¶16³0“ù5Í_)( ƒ#Yù{þGôgí/†üÃôÞ0~€=X †Ð éßß'Ç=e€ƒã}””óg£ï”€@€Á!~ҏî$‡Ã“èWzK‚žÀös˜ô‰€`?C‘*rùAÀ`„ø !ù* ÌoH¿ëþª B—Âý†t)üo(€<CEDø •é7¤[öþé¿Èïþ÷ tuñ~²ô +Yy%zW j +€Š8øÿ½ $Žôk½é“ü›QúܑH?$œmh׈ĦÔD‘ t3K3ê¢kãM+›zØ#>$0ºt\ñ’}j·S’Æs|–yöœïž‘B 2ï2\ +óŠOí?˜õqžM ¨°[M3ñŸñٌXà|^Ó·öU‰ÑìýhgQҟ[2—[r¡’úVsG†…^ÚûT½LTV±3Ls·¾y㩸‚°WªWQ´âÍ_®¤»L#ï"È؛¬Ïd>­à©ÞÜ;XsÖæß_²?•Ñ¯ìˆ£õºx¸»ÂnÇÉ(ž‹yp'½®~o§4¤Ý­P#ŸŠëÓÌH„)<½Ûß1ÁT•I– î»Ñ™ÌÿcÛI÷ü;2mÚáEm{[HŽ "Ôï}¬VçS׫¨Øóۖ¥¦×[äÎEž‘±8Åi¦5¯Ö9=!âçtª×܋èl—Dí¥koFTî.ËO(_õL0ÒÛ,†èót‹”É«ÙuÙșÇÖ»'Í ¼æÛ]_'Ø6'ÌV̸¿ï= êºð%ö¤9c°(àÑE®«Ì€•Å!ׇ;áªõî+W5§êW¿(Iá¦> »øNýpö9@´?jÖÉ.$]ք‹hïèt–9gh¦¸%ŽUI2]&ÞVe)Ú0ßx»™l͜¦ßYYxÂ#•õ⒝(‡U©‘;éužíž§ú»„ð3Ýù)ù¡5,ÓKI¥[/òbC=jLß ”‹"RÞK“åj±W®Ï[v^ -†_ٓ,NŒñ¼ò1öu’ùÛ‰ÈÆÛ뇊ÊûÒýE3l ÌP*xžëöÜcoGìÃÙè¥ÉœâŠà€¡‹ý‡@FMCΎºÔƒÄèW”m.”†ÞwÔå4 ©~ò1·þ̀*—±òçc¢Ø_ݦ)«Ì’÷¤Qsç~m +Í*ÝÁ@4¶{gÄíþ{…ÇIÙ塳yŸºcÆY՘ +†\ûË4zþì[“=uB )Ÿ¯ÕM/1ÓH›Û=ñD‰æåÀ}úé ¿P,9saÒ×R ?¢Õ 1¥±”Ùm ç¿MÕÈ»•I.fO2ÖH)ÿÒrxáú`a ’ðª5¬„ò20i?ópÎät k^4o×zÖGÁœ>¦j[Bræàݍ »ªÚƒŸ¿l?ªœcÌìk¨z<^úºzàÆ8Ïnôx¶Ø‡RüÈÎHÉÍrzûšÑùÓ§ë†lZ ¦)LJæ¼ÊÕ­}¢ÇÆR܆öî•„éÈJÆQÐ2FE&w$x\½œ$4“™“3ëܵ_ðŸQtÊÒïlè%ÔéSçPµËr=­½§ÍM3‘£í”·ÇÔ¹™ϒÓ϶F×W5fBzxkŠ<êբޖɃD•‰¶3Ä5:8\1Ø筐ÙMEk†ñݛ0ô[Ió²OՃ‹«}×êîMY;ÏÓߕ%`Ìî•ßã´Þ¡óÈáÔ÷Ìt¹EÚ*x\rŠŸ¬Ä"Wª ¬õi +Nû&öŽ»Š*~Ú5c i”3s¥ƒ¾Sâ¼G[¼Ö²lrV~“aI`S+Qåµlmút‹ïm¥¼C_›“Èm¤ +TT¾ ™­þ´ÁníZ½T«ë×ÆRî–tjç+§p&¥zÒlÒÌ°ñî‘Ŭ±—:'E×'Ý,øZ3ǪÂ×rrë°Ôº­fät•à¼`8©7¤ôÓª5Ê1s¾…¼< \¾Xg> …Nêç -MÉz,ö%€ÇûSØäð!xt¶¹#ܾœëQr2ˆ¸{îð¤ˆÅM‘×gtz + t§÷E‚_MÅ2_òÓþN€^\õdQÐ-½WRüfÛó1¨Ù0µ}Ú[&3—ZÊÑ”„aǏ¦WŠG7Í”.ÛE%¹RùҒÍs-zºsƒ7C¹³(®DG^Ⴋ±j3]µ7Ö<'Ü¿·ôL2R8½ãËyîöÇ Æ^+5{ï6ØÔ71ˆ§&ü®Eoxƒ/b!ü™{½úÍ9MO ×ènÝ#màxÁŠúí² 13 yë¸Å¤ÓAãaßÐ͝2܁ù綏c£”U9â™Ú¯¬¦' +ºÔ¹#‰ë__9Æފ|Ӊ +ãˆÆê;¥ZÚ›‰z±/>QWqñcMqæ•=”+,·*4Ã~ prèƒÇµJXђ¾ÄKp& Š–¤tY'ñ…îáEkm¿ÊUšCûO +ž€iúæ}5™ýã™^Óöȓ=²ƒÔSAÃ%ç¹$ù‚¨Bg‰+Vá…KmöBTåAýñð‰uC[ºHw­?æý´¤êËâGÂËD锫­]ê£ñà;Ø[íò\›²£&û@ö¹ 2ïv¼öB¾)©IUµuRyhxFBnãüÉ­fàVvŽ9ßs®RaÕ©ÕǔO£ÌD˜±kèÌ5?Ã(“E·£¡£€«M0‹–a +Ûc2ùƒÿ~8mÁÛ¶k[b¢Ö)þøÕ-ëÇó}͗:øûW„–cîiÚ㠃$gÔ\íãÒԞ‚¾E1*A„²q“í@èȱ¦ÝkQ‹­É[ѓa‰~c¦Ý¡n6¾qؾ“Êߞ‡Q‹Ú`¬î2+ZI ¸Ù+OªÏî‰tà>ç†3ieT`TÆ÷Ÿ^Û¾ÓÀÙ!}k©Jbøº3gD]IÉë皽Ÿa–.ñêϛ ÷íÏVQ1FíO5dn¤.Of½;AÎ>ÂÅÈñ)iÕ uÀ*÷åðö6â36WÒMXgm®µûÂÒâð¦V¾¢XOQ2æìòQ7”¸}é{}ÓÀä1‡ñ…BOÁ>rfKÝ%ݕÁ +Ðɒ«:ù›¹ç\v ϯT±AM±!BQŠJ;KÞù{o²Ÿè‘Oê×&·–Çð0ZUNcÅLòÅo;Æyâõ/gŸ3ÏÃHDgÆ%‡™—^¶N:?îl|Ü Ç±0àhøŽ5¨£qõÅùùïæ°¯eõ›g4þêÀÒzsgÏ3·r×èC6åžA¹{‚-©ð’Ž,!™Æ뚁‰^b~*ⶾû–žèçþ©$iN°1‹ºl9fÕñ`8YûZ8¦Nhs¦¬¥?8ÜmyB5¹f·(íJrø61UPM®«VÈNŸ;j¶éÔ'„¿óæàîYþ§#›+nýñ\f +'µà .—@o€¯v\z0D$„Ôú}×(e,¾…¼óÌ5uÝäÌ×!̹®±úøäa³MÉÀ>ëJ;ª}½Ó»)¶»:¬÷” ÇI»ä(êÑûâÌR¨ γ@özŒC]ˆ“ýÿ&o +endstream +endobj +2517 0 obj << +/Type /FontDescriptor +/FontName /UVIORO+CMR6 +/Flags 4 +/FontBBox [-20 -250 1193 750] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle 0 +/StemV 83 +/XHeight 431 +/CharSet (/a/b/d/e/i/l/m/n/o/p/r/t/u/x) +/FontFile 2516 0 R +>> endobj +2518 0 obj << +/Length1 978 +/Length2 3406 +/Length3 0 +/Length 4041 +/Filter /FlateDecode +>> +stream +xÚ­“y<Ôû÷Ç)ZÆ2²oñ±/ر/Bö¸Öef0ŒfÆÙ²†È–Ý${²–,Y²d§Eö,EB2„dùMÝß½·ïýþû}|þù<Ï9Ÿ×y}Îy¿…ø®ý!¡ŽÀ:!µ±‚TªhšÊPI)&éH@a1W H%ª¨Ô½]˜•S’VT‚AAB€&ÖÓ‡rq%¢šb?‹äu$wƎW¤YîˆþÀÂQH‚¿$ ŽF¦?¿À¦H<çƒDH‚ P‚'¤ +‚üô£‹qÆò†ޞ¥|8<Ù J6)-"°´?€@:ƒ FXr/$ÙÉÿÂԿŵ½Ñh#GŸòäýWÖÑ…öÿÿ<ÖÃӛ€Ä†X‡ùw©%òOk†HÊÛãßY]‚#WǸ ‘€ÔŸ!^å‡D\C஀³#üGbÿ6AÛ/  Kkk]‹ ¿¶ù+uÍ…!˜ù{þ-ú³öCÿaòlp(?ÀFJRJ +J.$?½Ùý«•ŽE 0äã +8âpŽþ ò¹ “,PÒ@ú‘ýB$1Xù€<’ À‹ý\&y#ǟ¡?I€8ýMP))‚ø ¡ù7Êý$/oòòþ) ¨ß¬ö{V€xüƒP²8æ7$ËaÿFr-ƒü-  ž¿¡ Áý†r„ð’Êû$_ˆß?ÒdWHܟ½þ{mX¿@ ˜< “•úÙÈËJýG!܇Cb¿nyù±3Š|TH?$41†…+G¸¥?‰, Öz0RF-N©áòô®QmÛëšðñ$JtQŸ¾—ølÕ~y&ýõ¯ï>¶ù¦É öF¨×݌·GK>K™ϸ¬H™†þ=ùwÃWÁMOÞl¯ÉR¿ší/M±.ìÊùÚ½ZpMôŠÙòéi>ŠvŸºö¬9y+íL´yÔíai>S† ¯Òh™¨_†”dª™áð`·¨3 ¦6±ÍތûÎäß;²ýÖÐהw€~±¹R #ɬ:-ê¦VW›j$iÞâïÙ®¾¡§äÙ ÅÃÅùR§rV=i`*ÎQÆ~ÄóPªsË{\=~FKGŒhR»s¾òft˜‚FØáƒø§/G³K·}v^‘Â0ÖÒ¾wR̨~5‘$QReÄû¥ç²/‹xuËÚ÷ÍdQ ÑÑ:B$ƒÃK +:µùV-&•=¢¾q¢Hå3åZDÿ!Å BD0¥†»ëÝTΠÑo {ØíùïV›¼=_é°_nÂï'Àâz#¸-_žÕ~Õq*ã¤[„Xûq†8túšÜP±l^ÏݶÈM"_öµÞ^Ým9m°Dïäfޝ·¢ô‡ “’ŸD*!~ d†Vw^~°·âLãbr؂[€á–¬T’H ‘ú¸tru‹÷šfHÍFâ¹á¼Õs’™jµ-ª¡!yÝb2QÅZ7jü_Õµh§\¨THÖáï·fF«![¬Ÿ¹ª/Ôd2™=fӅñÑb8Ž¬ô¹˜Ûè 1ýÕÁ®vªù&Ô_>8.¢n ‡Û>÷Ðî1ÐIðq…ysïL`^(´<²|«lúM\‘7§å6 +¥ Ӑ©qª -/TvZTô·©D¥[(]+›ßLŽR$¹8D–†òØfêÓl« +YÄH=ÚÓÌT(ÃõÞ4ºYãè ÉrÃ`ÿòB/´ 8ÃäöÔDyðø6¶=2Îþ’œß{¯2ߋ›»3üÝ7s¾?-Æv‚^ ´û0éž.—·†ªRzúùü;E¥Åz?È.òP‰4æ[×î9 8†Ôª Këù6ꈕuåQ5¶ðé³Mgð°&‡&?A—èÃ]âX/Q„Óª9p¸¦'øõJ˜ ¸;Ÿ7¤S3ˆåø2þ{ŠŒÅ'[©ÐGyö©º'8_Õr?|a +؁æ-_õ›[áë¬ú¶†j¡:]÷££ùöú&Þæ&+¡V´vÕ®¦ô€»\C¾iúÇTÎH8›»,»dÖÀ^Š(ãá´Ûb§k°ºUj’_8£ÄÏrgÅPÍ}Ž_Î_ÑÇ^HCŸÒ–n0ZŽç«ò5 ¶~úéæ#¶¹ïþw*i–³Eç¦PËTQ摏2î†ôLøØ>b/•œ¨ÓÜ7Ï¿q¬ñuÁ}Õ9¾KþùRMœlGÚò¾›Ð‡u­$½œÒ‡!šô¨ã¿÷äz3eîՋôß½ec.t%ø]˜i)‰‰CFb‰vó ôª™NU 7mš©5ücoiì¼̐øõ¦P|·â³Då2¯µß„ç=ŠÅx°ÅJk%r¸Bú&ªž“CËíìnrŠêÁBÍuâý{¯±Çžq£•\IócS¸´µ©cs¦xßvîûó–ѱ&ƒ'òõÙÔ` @ÔSÓ¤˜U3SYhꌹەïÉT‰ê÷¼®îEׯó{‹r™A+’(é·4KÃß³¸ˆ­‡qIŠµ|ʽkSp‡™r¹ÿ:dgãò•ý4WÕ]o9šC ¡ûVe'ÎøL§öS­Éc–Q‘·ÏKB‚HpÐü}=ž¡~¿˜ù³¸îw§›D(AªÙBšZ×8² O{ÍÜöJ +›{ë”É»èîÐÛ\•"Z{·':T­K;Z³ÛÄé°#%׀†‹Äú¹µ,Qgš–å+x­á"hRyi:õQÖ*¼éå$ø gµ4ÞÒSy›ÄÈ Sšæb=sÒ¤w!ºÜ¥M‰£q¼«}Û|)B„o\¸H9œ4uitîšRÁt=““ì©\žíêÇA ó,ÃŒ999¾Û½>=OR¸Ÿ½EÁÿtï áC¦ ¥{¾Á¨+œVø¯Ã0aC#ÜôŒô ¯£X0¨j6Ù[öñB}‚ë+“—² @‹¤mñŽï\ÖóûkÄeç‰×Û·¥KQŽ©}·rÇUh„Ý;Áq=ƒ¸¬Ï1o$%S=À'ôw]‹"zt}ÍHñ¡Løçcô>ÌB¯¾h³œÙ™F )ðïÍGݳÖ#Ä[ÛþŽ +5“ÒÌّʩwà jï mԏäõ‰ôUŸ­ÏiÜN0¯Év£@éÐï]©w0¨t<9íè†Æt›¡ÈúñÚiœžäöý+ßp=\Ô½–TM³¦>Ö°.Á+ÈyðãëlT¥D¶>Ë·ZÓ:$^8tµˆ1–X› ý.ð…Sò²Ó«ný᫁&¬ ß{üŠ»BôùGöp/•SÅÅ;ێ"nYÉc‹7¬’˜D‹~j[ù¯°V¤ç3o}t²Z«¤ÉðEŸoç¢ [/S¬Ù³J畤umÚ AGe± %‡s»{|ãX’ÊÓ¬²Å3*EMNƒ ³€Î1q ف§x„[ø&eF¿ö­òهï‹Ï¤‰‘Ý*šUÛ¬_Þ%qHíkc±×Cq¾ë‚‰Ý‹”Wxâl%‘ì`óž&º&„>×å-z8÷ ®K$8ªµ­=zêMgÅÙíwˀTûâÄتu¡xP[hqFT‹@­EÔÚë²±+£ãÝ݁ÑLul“ºw¢×=ù ¹¢‰Õ¯þ´ø6})“æGÛr;×½Sïbš+JK¬'M:½ÁÖ$j•Æ¥ðz’AŒž»Ÿ£ðfu–‚RA^H¥š+RF4ǜñ¢eA ¬vpK +G'邢®I@ñéß ™¦‹k·ª&™ÄøMc•%˜;#Ø:ÙðO»u >Iގ «l­î­%‰xŒ:ˆÎ#˜·W_ŸD24•Úy·Xí/-g% ž&¯M(Œ2Œ;¯®3 z{Ô¤ŒnöÍÄ°6?¿w‰NE2ÍégKÿøLa¡YõgÐÆòÁÉ®MºÎ9=‹w''Ý´iYT±»ð˜U%sy³X3óŠ2Rç·°90ëåDkýªÁԅµäû*ì·RKÄû&‰×©qw´¹£ë}ü#÷ný—(L”M3ëÓR;j¹'zR Å$²Œ8ùeŽVO úÐ÷åçÓô +endstream +endobj +2519 0 obj << +/Type /FontDescriptor +/FontName /VWYYIV+CMR7 +/Flags 4 +/FontBBox [-27 -250 1122 750] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle 0 +/StemV 79 +/XHeight 431 +/CharSet (/a/b/d/e/equal/i/l/m/n/o/one/p/r/t/u/x/zero) +/FontFile 2518 0 R +>> endobj +2520 0 obj << +/Length1 933 +/Length2 2943 +/Length3 0 +/Length 3560 +/Filter /FlateDecode +>> +stream +xÚ­Ry<”{û&d+äXFÄ£"ÙÆÆVG²D–d_cÌ<Æ cÈCˆÈ^a,)Œ-d ÉV–„BB²²d´Øéê=§óëý÷÷yþy®ûº¾÷}}îë–75—ÓBã]@=<Ž(“‡©ÚÆfjL^CBB›"‰ù]¤hy +‰Œ‘DwЋÞ…Äæx$’ä-,0ûþÂ0}A‚?ˆ–ç€Á4E\@7 ŽúݏΨü,£ý¼ÿ¦üA‚/Ý E7y [DãqX€]9 &xú,îäÿÃÔïÍõü°X¤×÷öôý‹ôÂ`Iÿåñ^Þ~DãÑ ÷»ÔüiÍDcü¼~g ˆH,¥…s€ÂÏÆW¢M1D”;àŠÄú‚?ê ý» úÚ~X€êžµ4Ó³‘ù‘æʉÁ-HÞÿ4ý®ýa¿0}7L`¯ ¯ £ éßߎ¿ÒÅ¡ðh Ž~ÊI Iô» #e `ph0è~¡ò8<‘þ ¯$pÅ8¾‡IOŠü^ú` + +ýDÀ(èãGÏç—@ €ºÿ ªÐ³jÔë¤ÿT¢÷öF@t%þªÂþ[ýy'¿ÞÒþ•¨ï¿ }®ÿ¯t~Žúß$ΞÅÉÁÕ9Eeúnà@EY!øÿQ~ºâ#§çù7vÅÐÓÁÅñzÒˆðH­¹V¢›Û_Ì"ÍxÖ­6ѤêñË&Îð‘$F,µÛÐGz¢Òf«„ò×,ˬØåaߘÆ+{õVÂ|ӆöfýg)õÂ6Ÿ(Ƥ÷ÞG×ùj¿,)3^x1ÑStÓ6¯#‹ödñ®©”ŽÅë¸8C‹½ÿƒ–Œ„ŠkY) 7ãIó)ŠVŠzs™çf2ó›¾ð(¶:™±U|£ïV.[NʞÃ:Â!T£ÜlZšÏlNs©0/Š‡»â[{gù™ À̲͜Œ²™u„gÿq­<+ð°®ÓMð¹n´±ÿŠl}£ø®Âq‚úÎ .ãäžw~$_–œ‹/­!õÙ<Ü}ùþÈîK¾úÃΖü¯N~Ú%XvMؔOe!ìù35z½4£¹! &('q±WÄ­—SX|bH‘‰_¾YÁ›ä–|dDÖ½ùæíä ww¿&V§N¬HëWGo"3»¼å¯#\µ‚p[»Éç”Ík*·÷s®Jß­–è½S µÇrdè¼â£^ËB÷7¨Cmï Eٞ¥èŒÖ‚c=gøwÎqÌû.ðMü¡*[Ôw0n¤•,ïRÐ šÆ¾¢ò"ÁëG¾h ãðnSë +»í¿OºJØ!ӆòÝ=¸Xª§Òâs0eþÍ¡ “ s)õ¢Tü˜&õ•jq…Ávåa†ûÒé™â:Ž3‚dñ‘šâ*ULçUäŸÔê%«sžVJÑšÆޘ5´ð\~¯jø6Ë»¬ÉV6¾O\%Ö¢°zl½'ùê”G¾à”¾vbŠZõ\‡=SìçMèó"­NÙ õ¼=Ó°ôÒ,Ù?­UNx ç2ša]ېA·ø†WÅ¥pIm è´ÞÍHU†?ÓPƒð—ò­ö|P¾)½4È`â¹¢’èºK²:ãäQ&¤ÆÖúþئää'oÍžl,v)èú´tM¯Ù@ތIès½A‰cDY:'\éü5Ÿ¯q»#Ã䜺O9#)v„?„êåäÚ2Eùj·µa/U3?!'ŠÚ¡z£„ˆFÈÖZãÈfÛa뙯R8oòêMà]?™NÞ¹÷ü6}¡¹Dë#djB¶´Ïÿy„겤¾L%ä:ՈrpÛôIð>}¶4é˗BvM$Ég;˞6^Z0ÒjLFD…ŸX +<)Y;Ê2üº^½‘}Aÿó-/¬J99¼l“ñNV›ñ‹3ˆ¦™g(+HšÛÑ<ÜW2ÌÇt7Ž(m4¬;ýÔ8Ó?'J°–ï¾al¯²<ßRQ ©@£&…ùû.ë=Žèå+9Ðêm¸Sx5$ÛÜLs›dfŽmî°aË{\ÀŽ(ækGÄÝåS{kêz$!Xˆ?:,źòCD{‰öƒ ¸±,#LÔ¾.Ïuò¢¼ÒKë\Ñ}Úª«Š×úA©÷;S·ß‹Xç…tAÒzîÆ$JˆM¦o\3™µ“‘ñ5ƒø¬“çãƒpÜÅKµp¹üȓ…:œÍûex÷J-¯÷^u2˜ÅMœÛ_ÀÕð@aõÚÂðý‹ “h0Ô$"~¡½˜SRúþõñ™ªù¤µ@ÿZÕþ¥`’ðôGÚÝv¥Fg®„–ßWÝXž=A£Ž¼›# IÝԆmAò“ÛؾY†|*|W4ƒ£ä@¶÷DºÛ‹+Ž™K·›ÔqÀÎôÆpßx¥{…Øo×â²ÙVàöTÔºªl™SAö¨#Ïk?ZŽ"Çæ].Uhe±+ü*ëÒ]mÄîqkåɀPn©U÷j»cs}ð–2[×Îçñ^k¢ùÜEÍúåUÄéiÕç;¯–CÉUS ÛF ¾âƒw·Š-%òçäR¯97Þ +D"•ž6pDãYäÎ +¶å߆íVð–êXlIFßÞ$*ސ +Ï9pIx|ÙÐÈ´k€ç:qh´œõtT™Û^¡«LÜuþÕskzÂv̜)¶Ø•Ï˜æyÄzuö‚õ³9þ5÷‹O—óNÝù8:>ñ<Îûèã‘rÿAÏ«*/¨Ÿ0¦¢O DòË%èŠ~\lNnzD«,#[¶=òèMÊm8â4a+ä^rïJ §‡x´Âatqȓu¾öO£3›gw…˜®¬«²¢ž±•·n×K]bÙJ¿Õª=,eÐòàã¦óuíÜDL‰SH”¶¸È¤š¯·@ ,ÖÜn*0¼"xýM,øÙ·gQ¿aU‚õÓKO²©+ƒe!OADúíwgu¥ßsÍFQµš];.J%×­Ý3´M+lÄŽ2PC<ò!ÎÆNdù÷ömLÉý͖Ò‘ô¶Rí”ã·*sÓ()£…Û¦·oHcgC+i¹IÛ1uóL.¨~țì2Î5Ë©ûŸ'¡s÷ŸKRÙIòa¶ ”¤Å"TÔK†Y)SL¯d°Ê¢œðLUË6c²nƞœ™ù„}ϼ½öp2äRDnj…U$E=M3TbØ^Üg.ü4g£1Ãxo¨$ÉY£í?&;°ñÑmg†ÅÕ¥Óeë2¥añ .¬ñ0µcw‰›‹Y4¡Ÿsאæ®E(Í~Zw +<oÅ됧Z×àÆpƒ”ý¸,ùÊ\ÇÚµQ]í­^á-°Î²6„:½mL³[9u%»lHǯ"(¯mœ<7ýml˜û…~‚ý兓wjì'±M·7yÖÌފE'\!ÅöÞ«÷x8Ã8èQ&Û]iÉH:všÌ×¹Q,cWXâÖÊJá®Ë³Ìry¹æÎÇ"‡¯ŸEµ­ïEö.ȉW÷˚ðÔµÖT¯“’͙ë wQ-è«£ °}ÉÇk92Ç<Ô<½÷V2Iþú\Z¨ü”."ïhÔaZêl(„Y%kféÉ×Í-¾©% +œ8cóÄúþš®Pnd[ñƟj±E¼ë§ø +»[U…o,#=m«Ä|ØZeëk¡ +ˆHg¼n¹z*!žMÏM°ëeÿh}CGºn-:«ÜÒÌááRUqqò‘o|¯µ¡Yzô· …‡›p <ËÑ÷ü«gÞ¬ÛGT.\ÁÇBï穾&ïsËdZ=ñ%ᥭ_Ô·9‹²D|¼Å?W¼‰%¯kl=ë/ÛPïÈ07Üdðzø^u”_BtÄs€$šµñ.ë±^cªNë’W«>Q¼X—1h±0¿Íæ‡á̺ ]À|ëéR’´Ðq¾®0àôU"““1ZvÔÇ#謥ö¾ùìÚθ×iºJ÷)Î1š Ãcá:^+ÅØà ü¢D8FàrϽ”ò´Åã³m8¦â&ÌW"c«#bI­šdl:)º[ْ`ÏÔFR©é¹]½l?Fj†N=zBM1–SRš8.QÍì^Kæó6|Þ³¦¬ÏÝɵ·Í”*¹gh^qê~¼û;]Ÿ1›&Jÿ°Ê;S‡»Ñ$+¦‘@ê³­ó) ÞºËÄXàw"÷qЬÄHSG{ÊuÒG—ml7tÝr¾ÐÑr|àmœ‰*0Þ펹ÛzI+P/î¥ÉÊ¥ÚccLW7šfgҚ}Ŧ2Å»®ÎÉ %+H/§¥!u»EÓRët.aË9Ï#؝GóþóM'²ËTPÚOXøÙW¼DJÏ#Žû×~I®<ÚÄê\ÏÍï•Çr‡¦³ ‰¾ò¤ª(i}ž–ñL®¡¡Öf&Ù-…Â̆õYULI›œ6"×o•t¦[jž<í6¥è(²Èä–u¯“ëEÁ=''ŒÅՎføtµH;ӄ>ƒÝâz—à+OFdŸŸ9±šÅ1þkÇ áå‹tÞÇqñµùLÛÃÕgãÐsˆhe‡£(9Q,‹ 7 cé*KiÊ9ËCŒMzÏó¶~Zϱ€ÑBÚw£&3! ½Ž©ö¾è81“þë—òˆ +endstream +endobj +2521 0 obj << +/Type /FontDescriptor +/FontName /EBURFX+CMR9 +/Flags 4 +/FontBBox [-39 -250 1036 750] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle 0 +/StemV 74 +/XHeight 431 +/CharSet (/a/d/equal/h/l/m/o/parenleft/parenright/r/s/v/zero) +/FontFile 2520 0 R +>> endobj +2522 0 obj << +/Length1 861 +/Length2 1309 +/Length3 0 +/Length 1905 +/Filter /FlateDecode +>> +stream +xÚ­Ry<”knÊҌáÔQɓ8‰Ì"cŠ$IYg²”¨i杙—ÙÌ ™-j +íË …¤tœ¥,'K²œÊ¯t¬’]#Y£ú^:}ý¾Î¿ßïý罯ëzîçz®û6[æM³rb +ö@›|‰G´Î´íD â33gD—ÀþFº²D +…œ¤l@$ÙΚ`G"c̀³@(ÁlŽ˜;¯œ‘Á :xÐ%ˆ‡ô`й€&`ÀDŽN\. NŸ*$†Dá‡!fHÀˆ ó1øiGn|–¿ÀL©ð+‰Äˆ)`Ž˜\ ‹LŸ+Lˆ…Á{ +» ÄÉÿÃÔ÷Í7I¹\O:oºýLJÿâé<˜+ÿG!à ¥H<LHÄÿ^ê}1ç1a)ï{ÖMBç '>› +¢ Ž°šô…€Å›`Äô†% `ѹbh‡øÌï­ ñÍÁûú:o§m³üg®3¤7æK¶É… |SÏÔÄo5’’–@Ž@ "BäûúôÝe.|†€ óÙÀšd è"]ŽA6©H Š`>’H†8Æãø r ÑD–@„™ëj€§‹‘¨`q(2Î49ƒ“q!ėü³F0.$CaRdx_QäÁ|©øÛQ€çCì™åséâoMm^ȕŠ¿ÉÿÛ† Y”•5XQl‘w‰¶€L&Eÿ!‰_3«‰¤ÿµfÁÈÄ H10Í †ýsw]W¸¤?ÍRÇ£'ª³{š5Kòaf4”Ⳍ-¹Ò›Ú–—P®Z«¿…aFWt{q¼ç±àá4Ý_󔗯!•àšhzòýʳڟ,Wôº•‡ùO:ØfhW"jÿåÈòUÍÃË÷UcS˜Ýv¤µ4hýhA=iab@n¾¦ùµHOþ²ë/ã¡ü}çªÖ1Þ֝NeuÝmúÌ©y^ÇJeýF‡MâÌÞ= ]•(†Q…šzÏ÷ŧŽìõBcJŒ6T¼|Z~ ª ŸãZl侤º}5gÒ ÚÒóì6¡eõìÜÎüŏB:|¿IŒûÜ­i¡¿JMº{ÚhcdXfѺ1_½øhÜÖ;ç·«®•k5-$ê:Ö5;'N\B{>ÖPZ{HóFÏæsúðzol7ªRm|ٕÇ‚:ZëóÅ^vQÝ.ýyàʢ܇¥ÚsE&&bÓïW¥hP_Ïqº2ÙԉV9 •UöºG7SÔ_&¼Š; ´ŒÎÊË1_Pæð$Û:eO¼5´Üv®2Þ×× —^0Ò´þÞé¥ûJԓÞbŽ¬Æi'š«žeãZ½geì4ä\Èr؝i¦îÿ½TegÀ&Å¢J\> öbšvèë˛XS´®£Á©å LÂZ»¹Z½Ÿ¿yÆûšºåš³L…Þ‘Ÿ7÷S¦gb^ÿ,Ô­‘V—ãÚ&CŠÆ‹­ÁAÒN-±§tÏ:â³M'¶áh°£ßùØIñÉ@jP- ²÷ç8=š:Ü-ìkiОoô|w#ÕÊKRëMUFôßþ•ÑárŽ-8Úÿi›y%¯ÐIZPwiP”E²•Óm]¯Óö‡‹ÏLä»l<¶làfEMáE*z7k³ÅTíYyXá@[ún$åê´[Ée×ĔÅÙώªÊZbà;e£üè.ԙgõ"¥"3û§½é/eOumn"û±’¤‡æ®ÒÑ1ùK=ÛüºVÍSk©ÎÎ…ñ£Ek/¾_;të“v\ÊtL¶(G#ñ—îþü´¿‚?ÛÑï3Šw®7îz5xHÙ|'rUjÜN΅D‹ªý»|oB]ƒÁo™©¿…1^ äÆoc®s«oÄZPbòÒF5·8;xªßU%¿Îu®ÔЊùÁðE5OQ—«º°Æ³êþïA$X¤û"å·¦….áí!ëï&µMºÖ¾›ó*J©?!9ÒÞ¢Zžœ1'ê|ÍH÷ÂÓUu­êâ ¦‰Ê+ô€ãµÌù‰Q‚Ù[õ5Ëúä¬Ò~ÇÛkÕ[ݱY9?uˆþÈ¿¿krþ…Ðw©¹ƒ+Œ/m>¤VctyÞBVÌΚ'¦æ©ã=ª¿şÑþ‚OÞj]E¥–ç6Ã×OÍe€Ì‹êôZ¦Pٕ×Jçþ°txY¡e½–•Õ勤¸¬¶›b¤[³·Æ?žÀ#,9AÞýáÆ]כï°ëF«Wa?i™¢¼2'\[-¨ì55.Ձ³Q÷.=?‰ï »6^¤}ô?1”£Ã +endstream +endobj +2523 0 obj << +/Type /FontDescriptor +/FontName /UUCYST+CMSY10 +/Flags 4 +/FontBBox [-29 -960 1116 775] +/Ascent 750 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 85 +/XHeight 431 +/CharSet (/asteriskmath/element/lessequal/minus/negationslash/plusminus) +/FontFile 2522 0 R +>> endobj +2524 0 obj << +/Length1 833 +/Length2 1649 +/Length3 0 +/Length 2223 +/Filter /FlateDecode +>> +stream +xÚ­Ry<”k–¨*¥"*l!fƲ~öCÖÆ6֌™×f33–9ÖEƒ²FBL +9¶²v"´œ(”¬'2eù,:C__¿¯óï÷{ÿyïëºîû¹žë~äeìTðTȜJaª"Ô:ÀÄÆÁU ÔàBòò&tË$R)¦X&¤ÚÚ`D€ké¨#tBòÀ„Jcщ?&8b¢´.ÒFdˆNÄa)ÀËôƒÈ¼8, 8PqDˆÉRF$@¯w0b@ô`¯&„@<Ç>H‚­²¤øRÖ7DûNCtÏ8Â3©xñT +‰ð¯̖Ê; â9ù˜úy¸y‰d‹%¯_é4–L$±þ# ’iALˆl¨xˆNùYê}ófá‰AäŸYK&–DÄQ$¨"4ÔàHÔ7‚È0'†Bx{"ç|±$´CüÏVxém9š»˜º¨|Ûêg%R˜Ž,à?Ä5âGÍˈN îp58Áò¾ïž?eFÁQñD +¨£4–NDz„à¼Qê(C"…(”g¦F¡2y-€—Lð¥Ò…Ö—Š0,ƒ—‘Àۉß:¹#ԆǼ`êß1¼é¿°Æ1£Ñ‰¼ëþÂŒáÖïøÏxŒ©¡aª@U›×Ž@ªk­cšÿ£ÃÑé…¹ñþx¯}‰¼½@P(„êë¥âtÏø§UÇq"Íò;o +¶-µß~ß·µS™EÄG8 rNȘyoªˆtIÇé^£Wî¿h{Áëãu±[Uñ×n`.E£šÔ^9ˆ³bâ¯l_SQœ°|蜞ûFJ§‰>šy^öhßGÙ¨v‘ü;c·üÆÅ¡^áÝÊèdåÒZ}Å[7íg r{V¤d¶Å丣‡k¼=à +]ž z-&!©˜Q{"Úýýå >¢sTSØòU{™§ý/™ý!;¾lmq5̓ŸòŸ6ñTBzîDÁI´¤µ¡ÉÒÁ3îêlŽÆ@qøaBò.QŒ¢ë攒/ñ]>úâXÿæáƒÇrÅ°w2*Üߑ±ÜQ¯$$méTíZŽÞ‡¾° ¹ª)vr=ìp‹ˆañì©)4¦%ÒJÝ!)5¾| c©Ç²#°ü4pþ]Û{çýÑ·¦Oâƒj]æ¼èÁ +;ºö¶®:ítøÓ)†©k_¾TÓòYsèÃÎbqë+[)¬ÕöúÕJ ¤QSv`hó¯ìð¶â-*‚!FXHÏɐ~Eã™èè¬AΪ72¦Üb¼°¦SlL6;‘¯°3g2â_QúÚº»ùŽ<§¸)q§;¸¢3á´ÖRR7°@·Tæy”GN¾ÔÏ{n‰´Û£©®'åÜë+Xë`ï=;œö|ÇŠÇ؇šæÕ¥NܗšZ»LŠÈ&Æä“‹»/Î{g^½ÎÙ3tîþön!Ô§•Ê‚³·ë./‹¹•¥³m ö‘žn/™âñaõgÄG,ÃMMnX=2îŸÈ$T°;§q%sIÙ)À^4¡m´?Ye©ýjX–sQßʧbf»ø^>«P5ž©¶ kTýAí^ô²UýþÅí×>‡ÃHÁþÑ|á¬éõd»³-zŽ.Wº¾ ¸1Z‘ÐhâÞ®5'PèS•Ñ»m£sõ,fiJ“°W￈„ï̈́k ›¥;ñuÅ:ybhtFXOžË¹üdÌ%”7ôK«J^6¸i7‘e1Þ!W»Ýõ쵨W¥m בÛl0Ùdá%]ßs‘óiÑ]ŒÞ-¾™ñØÁhæ>ófdk:ñáO+¬®›î—xÕÖ±-séC–æ9Œd=A|wëS{ݐÉ/‡Îvi,rˮߞcF5þjH¤²: ““Üvm‘«˜õºk³Ó†×­…øúBZ”qdÄ= OÓÛ?Çiõïßq‘ƒ¯¿Kž¯7#ßé—JÒÆN¼^vÎðf_м<ûÚÍþ¢léjÙ¤&Îáuq¹³{±ÁcŠ©ûÖ_òÕü³¦Œ±gÜÃ¥Z ²"Šú¡€>±Ï}»KfºRù´àÜÂ1*dgû[ZYý¸ä€ßà\š†‚€¿ÅŸ)[fîÞ2]mà ‹Šà9¥ÕÇ@Cu¡áÄ´`QÂU§¦4…µôl­ø¡Â€‰óû +Ù!Øg„ü±;óIEr½îJV©©nka;ŸˆXç‹š~ÑcØhÜsEPp4ü]¡™ã$9lŽpȓFév³¯Y6Ë«ü¨Ú<ÚZ™ØXE‹›´”GÇÒNyàG™3oOeþbüfEÿx2¢+|Þ|Þ3õ^¢pl¤cX눫®=â ´ IÚ÷°JTGÇ)YULê´èÞÒ'hï²ìµ,dʓyî`AþWs´önC“Ì-r­¥Uˆ…ždU›û£]m¾M¯÷¯¡ŠïëםÇP§ߛ' Å·T÷Ædv( _áÇZÙF¤P4Gå–ˆzu2¦ü¶π­\½ToÍCC\£š]p”ÿœËˆb³V+£„LG]OÕ®xšËæ慫R´ „¹‡¶`2AÇü©ÂËÑÜD͓ñ:î=#bʄ ›¡ôGèm. Á3—^Z9rJÏL‘ÿ—1T1h]%\€“Žµñ_m6}”›6[ß÷7Q£J +endstream +endobj +2525 0 obj << +/Type /FontDescriptor +/FontName /ATFWDW+CMSY6 +/Flags 4 +/FontBBox [-4 -948 1329 786] +/Ascent 750 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 93 +/XHeight 431 +/CharSet (/asteriskmath/dagger/daggerdbl/prime/section) +/FontFile 2524 0 R +>> endobj +2526 0 obj << +/Length1 763 +/Length2 673 +/Length3 0 +/Length 1198 +/Filter /FlateDecode +>> +stream +xÚ­’}PTUÆCJaÁ tìŸûq7pÈeŁmù%©—½g—“wï]îÞÝvÝ@%5RCCE0‰”ÐDHÖb§Æ™4i„00Q Ë&²»ã„ÿ6÷Ÿû>ïsÞó;Ï9!AŠ,ž§ò` +E2<ŒI€,=ëíX€ñ…œ U ¢Èd%[¹R£`b Œ•ˆ0‰XÄ 2Jo¡‘6Ÿa²p§)HuFj ÒUL>Ô±3Ô*dQj H d:W@&4@Úq>ÃŽÔ ÈƒZDrN TRCØ97êç[&HX(ÆB†§HÂp¨áä»dIþ¨…ÃSŒ!Wéœã!=×Véaù×@éôFÒ Â!M.´n€sléGFÝÂn*£"ZJj xX4_ø†x® )È qbÔù@£" pV‡$¾…MoD°1#-;I9w«³=… +‘L¶Eð™y¶ÆžÕlF42ƒ\!_(ÄX#ûÍÿ½»`¯Õ¤šÂ©"q PѴʲ£Db1°b‘84hf|’bØ%€M¦h(šã¼T!èi48ÕY!:ô4báÊóçJJ¢ÌVûy+ÅÀDbˆþǨ6Ò4$™Ù—æ3_k›(„f¨æôݤÔñÛß;ðeYCÑ꺞S/ ܟ8Gû–|s¡èS„f‰di™ãcdžZ>²ûn¾î·N_åCŸ÷ß-ߥœ®õ9ÓRQs"çãbqÿV–¯¥´bÿÒ¿#CÇRíëVïZ!頇Ù¸Q}ÓÜ­Ï#ø½¤uí¿ÜôðŽÈܼ<¶¯~I¿Ëk¾–þ»½©°a×Ñ¡æîÝôF}˜j座#q—N4s˺¦"ë7ùµ~7¾xwv.“]‹ŸYú0Ò/ñ¬¡í]á/OÜ~"¨êWèó<<\3†ï_¸#ñjçHýᨎ¿²Y-;Mi”g”žWƒßÿ+gpLJÛSš¸µvU»•_µ¼Õv=4/·­Õ5ñ…bœïÝìøeª10ù¤ÿ†Æ¨oöXgܹë]^Í){Ócï'·ÔNT_]ÔµõQö‘M‡ +í^#òÊ×6}Vt4rÍðZM겊±Ÿ²}R¬¦Þ‡‚â½ÛG{l“V,-R_痕6T7¦4>p®½´¹rôGúÉþî[®;Å~W8ùm‡´M:aö›Ä«º>T*#î՜R¢AtmàbU¥-‹ëÐع.¥Ë\ïúp›þüþpGŽl·r|[ýÚË?,ˆ¹ ×šê¿B—ŸÞ1¶OޖŠÄ8§ºløÛú4ojzD[I2XÑX½ÈÃ`_¼—´E„:ÒgpfòҖOüß\t›Þq¾©|_ÒXÁû?¿Rø8x[IKܨçèŠ'Ñçj+oíK´µNˆ~}qh$È´×Ԑº“”ŸEnM õ¡Ž}ÅÅk„Q›„5Í X™wPým%å’i-å4uš‹¿³q;²›ÚM븉·‰sécó⯓nœõŸŸå½åòè^Šíà?sž=ö +endstream +endobj +2527 0 obj << +/Type /FontDescriptor +/FontName /ZQLTBN+CMSY7 +/Flags 4 +/FontBBox [-15 -951 1252 782] +/Ascent 750 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 93 +/XHeight 431 +/CharSet (/minus/prime) +/FontFile 2526 0 R +>> endobj +2528 0 obj << +/Length1 792 +/Length2 1349 +/Length3 0 +/Length 1899 +/Filter /FlateDecode +>> +stream +xÚ­R{<”i-‹Šä´y«03ï0äXÃ&ì:‡œÒ˜÷ñ2ޙfÞ)ói¬-_QZiË9’*»Õ†VZ2jÊ7‰(ہrh‡¶ß~Ÿý÷û=ÿ<÷u]Ï}_Ïõ<†z^¾fT˜Ž8³1Ü "@6ÀÉÝ7p €$%CC'.BÃQ6ö Gldm *Ÿ + YِÉ6TœØeFàÀØiÓ‚È +P£.J§aÀ†G ÑÒt ø²é(‚ €ÊbŸ…<àƒðî>&(A€Q:Â&Š) ¹b 6°úÃ|ÎgjÂåIMc©ÉM@jfc,€†у-…Hü?L-mîÌg±× T7‚Ä t%Q›n›y¦îHIÜö‚ÎÒ/ˆŠÓw*†E +×wÕÇe¡°Ð—’í­ÇÄ Gò$µ©­ZQ÷׺ÑmO¯áÖh§x$ïÏ_S^›”{a׉xJ ¡×WKp()cå¼É×#®­{ýæg×`*šûóJÊ}[Š¶¸Ò"sºÁƓc…ËYhȃW4-îî” ^—¶µ^)„O}×[ðÐâ7…)§åJ2ÚJço]ó+n8ðkë3X¹½)ëŒÚýTõ7£1Ê -ù7¡é~Ûáü²šcøÊeùÓ#s—Mšö[¼k~ÏÜy7¦¢,ªÐ›,‘¿M.sÁucÛÝ^®^?AýCü±ÉäçeË*‰F;ˆ™p<&ˆêÚúí;ÃXWèÄe‰Mù› ­[éÝÇOn\Ïg8%9§QúÒDa@¡…ø…wÌYÛÎñøù…¡ô]b¹íW*ðD~b³Ø!fŽý!úbDé ;jæ¹Í”]š¢— +”¹¤QΚ֙vÛdyú«Ëäwžöí.@à +ís +úãŅš¡õ‰­{þM\Ç°mŠ«„έûr¨ +Möó¸Jåù+ë0š•äù¹™Qyû¿Â%3B,3ùÁö1A¢ÑÆS¯1|³'kÊËjîŒWUÆUPùÃÚ«”Îæ0ŽÈÕój>:÷Uꚤ·7TOQUóW%’¸ï—ÕI*îN5g&e®ÞÜê±ùIpÏ åÌì-ª¨x ]7“±©IlÀÍÛ˃'ßÿLÁ?v( M½ö>m\¼Ferbäⶨg$è]¦ŸÝ°Ÿ‹Ú‡Ñ¼´ÁÃsñÜ:þkí–úî܎xúó²Èõ萕¦l¹¤¯ÊI·3îõK¢GÙ3ý¡B,E#ÖËüö›ÅÇ\¯OÉãqEäœûâÙÁ銻õý§¾ßý'=©1 +endstream +endobj +2529 0 obj << +/Type /FontDescriptor +/FontName /JRVZXP+CMSY8 +/Flags 4 +/FontBBox [-30 -955 1185 779] +/Ascent 750 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 89 +/XHeight 431 +/CharSet (/dagger/daggerdbl/section) +/FontFile 2528 0 R +>> endobj +2530 0 obj << +/Length1 815 +/Length2 1151 +/Length3 0 +/Length 1723 +/Filter /FlateDecode +>> +stream +xÚ­RkXSW•axl u°DD +y\ D8R )/AžIîM¸c’›Çcx¶¨È` (XE”Q¨8 P°â +Eh‹( D|4Zµ-ö‚ãôúw¾óçìµÖÙ{}kWgA •c"$SàTˆ±72&Ñ@4ÉՕ«F„8Š)>â@~~àh¥b‹íåÅöb‘\SêÔ¨4k¸î³"àÈ5**@¤Ï@äD±Pb01Šà:àÈd zö…D#D½ i$0*Ɓ‘¢ +}ÖP˜B‚ÖÖ*ßR›µ†0Ö&ÝaÆ2€ ‰ÎLjYáäÿaj~ó­LÆÊgÛφô;Z(Geºÿ0¹R‹#j‰ÁˆZ1_ºyã-Q­|>† e¨˜£Ê@…|h oæՄ ™,@qqedGð|+DzsFè¡Ü`AP¤Ç›­Îq!ªÀcuJ0~ÏÕÐo5‘‘ÍI ƒBâ¼½¥Ì›¬c0ª/¦/ªÕB‰A´òb2¨F2’I¦ÓN<D2 ÁÔ¤Ù¥zºPC$…j6;ɘ%çp&Ð"Gø1/“! ¢Ò«{‹úºR¦ÕÈQ…V3þ>‹  ,SOõfªs-€ _Àb± ÿ#kÕjbØÜo#}[KPb ’‰ˆIC˜Øÿ㿕Ÿ+8‘\Õ[cA_ø²»vbȪ-¡1«… 1Ìʏœ¥øÑÉã Å픍ח†‹ýw“Õg—ý_”j:B>ÕPxèX§9ÌVÚ` E—_¸ç·É°vUüÞýŸŒþ™Ýª3îpñ2¹dw/ª„¿ÚPÕòã­›%ïG—¼¿r9k¨ÚjǾ¢¾ßçô´1»¼+P<}훈0ERèv]²ÎFd>'¥H6õš¼Ÿòé§<,¬ È\{у|Y­ÓµËí®Æь{S?láoŸ:,7-ō£†=Þ%çÜÈm^µ©9ø5£lã*Ã/ÙëiÕY‚¯¼s»GFJ¶ìßüÚîjø +y«£¼×WÄRºÂôŒ{Ž­¨7•æjì·uª–c;.ºó.ƒg1Eöq;Š|<–8ʯÉÒÂVÍþ!¼7êh}<÷¡ÅŽc#Ÿ5¼³´©¾2ʲ@}—¾Üò²ÝcD©»šûy8^oúø Oá¾ù˜Ïs¦4ë³=¯;iÐôÉígFÍþhŸ\÷Bb½CG¾ì'ܙ7¸A¥><²/:î’Þ4â "¶®»tÇAw¹¡ì`…´ßj•`A]Û6—±·@ßÑí +“{ ç|֖F» ÝnÕÔH¥Eû™æKôÞ'šúÓé+ãnÞl†ñ¼Ÿ¨ž¬ ¶=ZJ‰XnÀ2°¤ÉÖö^¥±ÏEÜýÉâ¶Ê²ÕA.éÇÏN)µ?7Ž·ßõ YŒJ‹yû¸%™ìÑ |ãͯ¶6L܂’;,.0[½èî ø #»xKÃNfx—¿ª_ŸT­z7ìT떼 wÍã뿓eøøë~•ü\5á«/±–«ñ%NÅ£{9ÀômÜÀ5o‰M; ÉyðËàPi§õhè·+ÖÒ¿vʏg5|­¬ÑÒ": +#‹ö¼² O[ÁÿX9“<ÙP{.?:íüê›çË'GØ gŠojøpÅí`Šö89"j`¢zPS¾u—òžðÆ¡¦öËó÷*þ•#ê%Ž‰´åò”!gѳ_ž¤šU=¨îµýî‹PÛij·¬\=`™¼~Ê~×HùÑæZUozçRrÁÎóÊ.%×íÃrUsÍ þéšýۏåYì8½­ía¢ y€ž«¬³I5gɜžTˆ'x• +Ì%k®t¶^é¡Ù$wÖòI>E-¨ãpRšy¥ñ‡Ó›×¥g^ÕkO·ÑÅ}V‡G xN£±ž¹QOÿäÆã÷¿S,¬²yö‡Ý‹'”{ãVÝyì™ÒžÑŸt¤2¬Ãj&.ý;ûë@Î=ƒ]ÐDx ïmjE"·,~KOͧßv~.¹([”¾Bí¼?Ä(ÌsÏ=×ú„ b-ó2R VI]Yì^­èwžœ±Hà&”Ñö¹Ÿºà¤·÷ÜzñóÆ|œRX´ì$Ñý[øÉÝ©¦ ÿ¤Æ_ðÿëúG—ÏöŽ«ô…ãAS¾u´bö}]göý#kJ}'tà aøthËO “g²;^^¥y¶Ýáµ\I¶ò=´{¦h(çf-3ØáWcK7; +endstream +endobj +2531 0 obj << +/Type /FontDescriptor +/FontName /GCEPBM+CMSY9 +/Flags 4 +/FontBBox [-30 -958 1146 777] +/Ascent 750 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 87 +/XHeight 431 +/CharSet (/asteriskmath/element/lessequal/plusminus) +/FontFile 2530 0 R +>> endobj +2532 0 obj << +/Length1 781 +/Length2 1493 +/Length3 0 +/Length 2036 +/Filter /FlateDecode +>> +stream +xÚ­R{<ÔY֛٩¡ä²J.—)3c.FL½¹…b"—%«ešù“™ß13L.]f ±¹%Å«­´TV©”Z"]DlRéFmØÑÅmß¡m÷ó¶ÿ¾ŸóÏy¾ßç<ç9ÏùbM}üNld'ä†ÀBɚä\þþö€dmƒÁb]SÈE`W¦r${{pqِhTš™ŠÁ$J"àr"„ÀÒ7G²N|HÀe1aÀ` +# ¾JƒÅä?„Å…„kàÄãß¹1ÀŠbˆm!‘›Ë‚‡ cˆs†6Ãá°ûTf‹¢>·Ä Fe +XªLâ€Ê"yÀ†Â1Ä­ˆê.HåäÿaêKq7·•ÉŸ“Ÿ ém&ŸË“üI@øQ"!$ „ à/©Ð'o ˆÍñ¿ìn2y\–ÌáAÀæS‰ãƍƒØ>\!+"h¾ Áì/=¨b›w@Üîîäåiõé;ç{>L.,ô—Dý%:GžÇ¤¿±*7|kcmcCRUëónÇwm‚Y› «æÁ–˜S‚Q † +قxàÂl(@q*¿DkªŽU$‰ `æ~“¤R%Bsµ?¡= òÿ‚TBà¿Û¶6€(ŒEæñ?ŸììŒÄÅh€@¦P€-• höëÿ‡Æ ,œŸ%UlŸq8W•1ÅA,LO7¢Ëv®‘—&m:Ñ^†Â/pæÔfn­ºÖyECúðÐ^É-ÏhüÓÊ É3ºKP«b§ cÒ.'l»ãöv_tf~×ì€8l `÷Eàñ†¤?Êì½tXëRÍåˆím¥9ÛO6Ž6÷±tõ~lªÖø­¸ºñ¨ŒfäVÀ HI®\M1õ]–]šJMy»,'KýÉ=iÒ®”EuV½cÈe‘Îä‰EÅÙ³¡jY_¥ï';=¬½·kCJÁGººcEsPØ>?ÃÓYö¿œ!֝l{ /ª—@š¸~ºÞÙ¥öøpF™§ÑÈ%BȔ ýP$'¤ ÀÄvlu^É;K÷õa[ríØÏ`\p÷{ÞpvaŽ¶-¥QÜ¡\Y4•cÑ#gšëÖÍK‹&Q+=Þ%ÓMzG­ö)ÝÍ´ž“~éòšJ;ni\?3Õ·­Òßä{[óM ýÁù-ƒg‘b3çÞÁGn5ž‘ÓÚb"Z6®?~t§Þ +vIכèú>ß1ÎÞ¹äe žQÎ_ÔՓD½¹£Ü`èJ=:O?D{Ûå«çûâJ¤j½½Eó¶ýíQ~ÝFo«Ò„ >ÃhĤ÷@x¿ÇµžÆœV2)oٔː¡œLp:ã«5F :½:IÏ<õ› +Õ š’+ñùr´[JCŸ°ՐñʱÕr¨&Æþ蝣‡qOØÍûrÝL3é²K·>4«Ì¶ôáÎýpåJu{(4®õòÍÓí^ô ½e>yͲ¼^Bb•|ÁPc0T»•>Ó½Š@“ìýc`o˜1㤡ۇ=™šºîõÝ'ŽE +/ÆV†ju^ó<><9ÓÐDÒí»ÂQë_·â®zÇ:y]¹èñÈ;¤ç—L¾H\¢ï/ÿÝ8~ÇxRÐ  +y"w㣢©4ÂhԒŒçf0Ò*^®)(2W’ ˜9ƒÙöêi%¿yùEÙ±|¾ëJØÌèA·ÿVìi쥠ŸŽS¾.“âÏ0D£Ì_øؙó6‹iùz*"Š×òº‹‹g8¢Nêcþ°§¯¶"ó¥ 6¹+Qç¡b;5`ª­n—´¥l!Þô*†Öóo^ W‚ÝÀhʁb˜Ù)Í ۜFÑ9FõÅîáoj +óÌý›lp?Àw¹a}¡3´}?­£ùîM? +!j±†¦{ý!ªÑì+Ž&¹Òuñ‚VË ¹r”~ñ¾7X—æ_e\M=6–V_DlåìMÐ0#<ïx=ãþë÷¥Ód»öªf7DØQÞÇ;´¾}cüŒE±ÝZ–¯mDÜ_Á)Šý^|awñ¡}_^¢ÄõÔm–iDy_µÖ)­¤–E7ëû +º×9}óÃÌKùº ,ÆsÊ Õjå¨öˆ¬Þ uSƒMÎ[;~r;¬yBJ|0eÿSö’ów›×Ÿµ¥…kn£·V’ý§ ŠçgÍf¾†ºO¦ŠåNCÒG‡µßÖz=ûxÖؕ°ûWÙõåz¬l‡ÌØNíك•/=÷iØY§£Çk4Âx‡£­’)ÕeãYeI5 +%ö|ðx⏑ (×êæÜ­Y®yîª5Ï]©<ÞòŠ.úÊj­ÂÚóvm?'öé5Nå¦K¤ÂRŸx"ž õl^|=þ]†æ[ǃÍd՚¥dkئsbf(ÄG]ƒ£Š;O¼PßÆÐß~n"Ìoʎ–¬›î“:|•íå7Znð¾zºóɅû:âÈ£ÉÛha£2Æ1]¹æ-·ô‚‡³xGl,ª^²ÔËM.:Ò&e +ô¾v‡÷ҀÈÇå—Çö·E¥îµ@¯]Þ6ÒtVYœ^jeDŠˆN_«x]Ú [¹xßä1[H-C]¿Çk ý€MÆ7KOßI5VǖY÷§;Öÿ¼V_­µPT=ݪ)sø¹,YX¥LÙYï¿ɐþ82XQ°0>µsà¿ó‚И +endstream +endobj +2533 0 obj << +/Type /FontDescriptor +/FontName /YGAXLK+CMTT9 +/Flags 4 +/FontBBox [-6 -233 542 698] +/Ascent 611 +/CapHeight 611 +/Descent -222 +/ItalicAngle 0 +/StemV 74 +/XHeight 431 +/CharSet (/e/m/one/two) +/FontFile 2532 0 R +>> endobj +2534 0 obj << +/Length1 801 +/Length2 1229 +/Length3 0 +/Length 1780 +/Filter /FlateDecode +>> +stream +xÚ­RL8“@À@!Ž Fľä€îîT ’ AâA¥á“#‹B”¢8Dð1) ¡Àƒ¤°@ ñ€8% ‹‡ºBa.G¼ˆ‡D/—#B. ɔ$Œ‡H”(,ˆ—ö ‡1ÚÿéèB!¼Ð!‚!)„&A<̕qãÈ ÎÄ| -¥yrÉÇR„J1s€=fÖÀ¬ò±P‰ ÎǑY¦a“üC-'÷— …,Ž£_Úöoê,T.!üäB]ˆ€–FbB7·Mþ`-=ڜ²ûžÿtFbnÁ€v<)v¼hÿuëȗELå?$ø·ªç¦M ý¯']WõÜ­Ì*k/þgÇóR¶½oèÄÊ¿Úé´F'ÕµžÍr£Eú Ãr²¯n¢Ú›$VvÉN6ËÏÓþ‹*-!Ǩ‘øpi–›Ï©.œÒî™mìl*ùÀ/ÓÁY ¼96ï,ZÇ ®2ÜÞ^ðšzÔïb<ãª.!¶„V~J}*Iy-¢º›ÒÂá Þd±5jmUë:j¦÷P;ÝÃ~Uí’7û3=®²œœ4ÝÁ1 ØþÔ¿Ïærò:JE[ÚÝÒόºü;6|{«xmçvþ‘âÚýŒÌgV,?EUµÑÐP¥¡ýDI€ØׇÇÊ(‡Sƒ ¾óC{‡ŠÆ/‘Ç6:^åçÜÛz©[éMÍ=aš_\Ÿœe0¯u· ÚÆîkO3×Û·ªq"!íµÅ”‘À;|d‹¥ºaO¿‚Ṋ\2Éâ;…>(óœƒ#ú*k(o¾5‰Ÿ +<à%ªHTÏô˜]DEF¬Ö•A“ƒ½NèË6N~­]m„LÓûâIì×.3lc²qkaԏ]bQÉ&Ïû'ˆ×YöK;ËŒïQo£9×—–Úº¸ÏÇã 8ÙLËnÚÞÞ(5mÔ®bÞf¾ö0Ü0ñ¼þ¸<›Û“Q“7|>?*JX£ëÆ«–ªÃ +uí¬é™(kV* ÖÆ"¥Ú7+ÙÔæ~ü‹Lj£×ú@ß9}Ä{}Õ?Pg ¿Ë:Ý͍dœÌñ¹NiWN½e¼ü9ðôÛÏæ*ÖÕÜÖ:ÈgϽ·ùÜÁ ?gbÏNvô•šD?~*ËjLÌùäÐQB¢tjåYYKn6sˆv"¯G„_|ÀU~³ñ@u²é¨H2AÎ횫™±¢øûŸŽÖ3ëØ+,·~1S«u`ýĈ@cKå€Ãùì¤m5­}™{tª õ¯òÊ ¶¥?ÌnywôÖ­—î‡ï'z•ãwôŸ(Ž;ê{90é¸: t»\§³Ù­s“Ý娲þ›·.¤<Œûan}Ógûnâ–ÕŁ- +‹>‹_]0)¥:]S•ê¨Ïü2x󡱤o(î|“Wçz-,v4…p{®¨€ÙÏÍw=¿íº®9!_ß5ò½uÆÎOPEaý‘/Oà¥á1 §BMJ~nîUil 'OIfîäçl(dæ“l-ž3-rö‡ß‰JÖÌ8üñÎ3â—ÄÁ-‰_9v#ò†:«JA]ÑÙ­ïF†uð6övwš¦j·õ µy;Þ;L.Ûš¿¤:¬(nOPG¾÷´£¥hê §Ö>‹5Íÿse¾÷vVYþΘøëο³îA æÚtê¤êB-ýŒ¥.åä_Ÿ_U7ˆñ +{¿š”˜{ažvóüÁÞÇ ¾fŸyš­an>3¦qS4=ºéq¾[<#z'_ùjÜO鈋ÙtCêÁiþ¹/î³3·™k®v&ë½ÿ›W…_æþÍ.\Ó +endstream +endobj +2535 0 obj << +/Type /FontDescriptor +/FontName /OAKMXN+MSBM10 +/Flags 4 +/FontBBox [-55 -420 2343 920] +/Ascent 464 +/CapHeight 689 +/Descent 0 +/ItalicAngle 0 +/StemV 40 +/XHeight 463 +/CharSet (/Q) +/FontFile 2534 0 R +>> endobj +2536 0 obj << +/Length1 1612 +/Length2 15120 +/Length3 0 +/Length 15951 +/Filter /FlateDecode +>> +stream +xÚ­µeTÜ_³%Œkp÷ÆÝÝÝ î§qmÜÝÝÝÝÝÝ%¸w'H @ðÉÿyæΝußy¿ÌܽÖïTÕÙµ«vÕiJRe5FQ3 ”ƒ½ #+ @ÑÊÎÄÕù«ƒ½£*ÐÂð×ȉ@I)»X9ØK»ùZ@3€ÐÀÆ`åååE ˆ;8z‚¬,,]4ªZ´ôô ÿiù'`âùž¿7­,ìT?܀¶Žv@{—¿ÿ×Հ@€‹%`ne ˆ+)ëÈ*Jh¤5Ò@{ ÈØ ìjbke +P°2Ú;iæ €í¿S{3«Jsfú‹%ê 08;M­þ^z˜ÿq1 ;+gç¿ß+g€ÈØÞåo\Vö¦¶®fÿøk7wø!GÃß»¿¾¿`ÊÎ.Φ +GÀ߬ÊRÿæébiìòOng«¿n€ƒùßH3S×Jú—ï/Ì_¯‹±•½3ÀèáòO. ÀÌÊÙÑÖØóoî¿`Ž «Ñpu¶²·øO ÐÂdf tvþ óûŸîüg€ÿ­zcGG[ÏÝvøWÔÿâ`åâ ´5gB`eû›ÓÔåon +{æEÖÞÜÀÊòo»™«ãø܀ 5ˆæŸ™¡ýKÂØÌÁÞÖ`4G`Vtpù›@ó§2ÓŸÈÿ ÿ·üß"ïÿ›¸ÿU£ÿm‰ÿ_÷ù¿BK¹ÚÚ*Ûý€?0€¿/Œ@ðÏck úÿ„ÛYÙzþ.ü×@-à¿IþÿàȺÿm†¨½Å_AX˜Xþm´r–²òš)[¹˜Z̍mÿvê_v {3 ÈÖÊøWÑ5ÀÈÊÂò_|ê–V¦6öÿ´žóß. ½Ù%ÿW¤Qg–•”Ô– ÿ¯oê¿¢”ÿjï¢îéø—Øÿ,嫃Ùÿ:üƒ!&æàðfü»ŒlìÜ®¿ yXY}ÿÙþÃúŸç¯Æ. +€ÞߒYXÿUøÿüýçIÿ¿ÀHڛ:˜ý3+j.ÆöfÇëþq›º‚@Uý×Æÿ-ø?Îÿt ÐhŠ°¾ê`Êb‘éҀ“?6-¡74À +9êXÞ¬^RPçÐÇ[môVÊÔ2Ë÷Ñé¹ráø~$Gw<1€mKݟ¼.$ô%§,BÛ¦êæ¦?b6(GʼԊñ¾YV؅ÒåbÑ<ޟVQ5({ƒ!šífÁÝ<ѐ»`R<:"û™¦7Åcõ ¶€¡7_\R%Ÿ==RLŽöÿ‚<" Ï‹‡§äwƒB¢ŠpÊ#ÖÕ¨öŽ¤…ÉlýBð«ëæƒD«ÏÛ €’Ÿ"ÊNáEÙ¢pþKá-:³KX ù+H¦ã¨Fûvq6Z@4y–w!ÿsӕRÒG •p&xènކ"x.¶‰xìâ–fÈ9»Á®Žîe9i|N¥§¼É½戒…q<ÒµY¼ÃљÒëÛ1yKà[En„}|êÈ㲖‰`÷À‚Mý¥‚Y¾>¨!W™é¢-ü뼕«Ø¸å—ÄðŒÂXpë­®âwòÒKÏn¿ëh·!ŠÄJ¸GÖhm=ÄڌßÌ-å=í +KêO)}¥(–+!¹’~¼É_"(ȑ±M–r¦Âõ>/†O³%gÙÕR´:*⥨hľ¦;Ò©7‘‡dřÙk@?ÿéŠÖ¹ùD1/‹€‰÷Àú%7x±~ì¥!S–`ÓH{ɜ.쁞º4ÝW'Íóý“Ï >ȉCЛ# —!Ó֜®#:.|S¼¾/¼_G²fÅec¼äõã:h‹jom~ú»Ãè#*¹wó؁Øñ14íþ/—]¹s¿‘wJ F ÈD‚qT¶žyùi½'-b¸Ç†4eB…ªz:]žtà[W)Lo®Ï¡ñ‹µ*ïÌ{èˆèÀB—róŠLwsfb„‰¶¾0æ¦>‘´[°E¿©1ÌQÁDùr4ˆTæwe¦Ð¯Ùµ8<ŒeWOy±‰—XsH9ZLɞ.±cé¦ÀxNi#[:ÎÒ; +ՖŽÃ`åMS+) ülŇS&ÄâËf*åhßMÅ׆¢)øEn”øŸ*á –Zÿ<¹͕ßìɑP’„:ÇåÓdôŠI?ïeLÖ ·€“䦲§µý¤ëàÇ-kŸ%S¬#g’nŽìLۃþÉg[ú¢àLî+M½ÖÇԕש[þ«ŸU™%#(îÅ¥‚þv#(0›“a£ÒÝÐY'ü~ù›¶Ÿã™;šFÒõH¹ýÁ§nçZ:ú–T»¥iI¥‘é68³QRðõÆß®x8¥=‹¸Ê­v¡‡*‹Èã¦3œè€·¬Eó¨Ø¶ç י&¿tðèPçBÑ].„¦ KO#†¶Ó¨ÕJ_¦B÷Òl¦Ñ֔•ˆ·±MJÇÁô„å¦Tºãd;”ŠGÍAÅvóýŠÑ= ò; ÅS$Öv¦NÂ<(zó$æTsÆ$ÓJ”³>ùH=ªl…$kg!ñð‡Õ%’ìr¨²ñ“€¶¿l켩¿_ýá7lSk +¡'Þº¿F`>óQüć ú:ÿÙ@Œ±XU‡}îSWÝ{M¶ìó3&=©ªÁ ð¡3Këäe“ QZuû•kƒÃy£)˜œk¢G²´hšÁü²zà‚×µ%Kmc¥JÍYm—%ˆ «¡~cpÝ£‚qº[­^¢ÄÙuó/M<¡÷Wo´0H?”›„}æh½I¥™›š‡—ÿcÕg©NóR‚µ­ D;U¥9ÆwFóãtõÇÀú[Ü„TËN‘þN[Úb&ÂP(LßSÞ(…¦.Ô2ÔyÑ/0rÑjW”Â9üLÅÌ6%¼0)Â]8yVKs2±£×HÜoˆ?ç D +¿T‚ÌÜ9íÍh(RÅÆÝD¿‘ÇgÌ7ˆoÖÍ?öM÷õõ÷†°%oôw³IřS»ï£)ÎPҙ¬Ø¢Žޜd¶µ#ô'Üéý”ÊÒ$ ÔMÈH¹w´ã¶ôÖÅ攉`:l~C±äÈwñ¹S{J#jÅç÷Ø2+7`ˆH¶ 7è§äA§v3Kò®*ÊOÁËDvÏbùVå/£|¦¼ºíž7mkµ½K%£¨¯Îçpô³amZ£yŠÓ’8›Éáú* íöïw_äïýÆÞ¶o"3 ¾°|“pôRœMv2SÃ{ºPXÛCfV_§÷­^äþl̨΢ÀŒÆð›ë¥uì¢ÇÆûP_'%±:ãÂßÝQœR™œÉ‡Ñ•T9S¥P/\[Uäatô È¬¿ê9üöÏÌ~üt¨=Û`šæ䡹âº#“èÞ[^\ ނ/š=áÊÑ\YbᯌJèd@sB^F+­’k”4^ÄÆ)ÍûòÅÂÎŗ$h^¶Œ®QG†p{áÃËykæÒX‡²çWÓÄ[Ã+†³v£;£±êY_‡b/–#¤l^ÀÆÈ\¢Gœ›%õUÍn°icÍímüB*cOlÛ^ò…È~÷».ê”zœÿGûÓ¦^Ã<›XbèrµŠåç)Ý+E¾_eðté“ œ+?I¢Áž¶¦) ï}ϳÅèóB• ŒÎ{t˜¥×>ù©ýsÓfƒ©ï×ÌŽ¬ˆ8LÑ2L¹-/IºN•q»Æ§•¦S$¥*˜ã6U5˜í‹®ª½•y}!¿ÓžH?Ì1µç4«þ^$Í÷è߉h¦åüÜúM½ïa×üpžtʑ$¸1@ш=çë6®$ô‡œG +Ñ-¶ îÇ/íWË^„„òÆßcPý¦šûK¶tæÆEÜÂêc‰¬tñõcÝØN;‹’‰ bÁ`䈬æöía+©ÇÖ ‚éz)†!bH‚ œeŠ73oß“û*á÷FؚQ…»¾áÄkÂ +2‡Ì*XGx4–H*eÑ÷~ÎŒïV¼³„Y™º…Nm˽» ,;û%’ø¹|À;ãï¼úª|tӕ†Òr f?RV=âl!wé.ú3¯¡‰¿üžûH!§™©Íme˜V‘Å Ü>T½³)vHŽD/ž‹kz¯(ù:]‘²š=ö O½xrúe{dŽküí7º¡‰J™V ‹“z@ñ[ L¿Å’‰5 ¯Iº’ê]ÚábŒ>ÕÍÇa‚öGôÌvÆwo Š}™G¬Ûs2Sҕ§=Œàè¸hFpC°þÅ"n5Dœ)RóiÞdVëêšMÑ"ž:¼äg¥i7^¸n¼Ô„&YùvänùI]ƒŽ7Z×MÊ{•ŒÚý[Þ/ƪÇ׬Þ%4-‡ìkŒ9˜"î}\íøE—¸z¶àʋieD…“Þ6å¢_$ƒU±•ã­Ò$bæ”]Ñìxŗê‡æäf†ýµöh"ú ?œÕכ†ñªnñ\Ê × +®ùà¡^?q6ɾĺs:À]@Öà¨u£µÓAeX|ãćkAàk=¹z»[ÎÉ; lc¶ԋû*|–†3±ØC˜÷xlþæKøèèc4•õÂw·ÃؙsѺ2”¦ªTÏðBÐÊ@sŒ[ŽÃw.¿ -Œ½¸pTW¢iš}He~Çhïõ,3x&³tÑêsŽ¼jF‹Zrëzå|Bc$Iá÷Ê¥À=«³œíQØjRH×ZZxLØ\Š%Q-ÀŽ¢m/ê¡ÿÇ?ÂW\Bì[šaΨ®õuahNÿÒÃøb‹—ŸQ˜³«‹ ?úw”¯ˆ +Õ,âóS+Ï(‘X +÷žêæH1RÝ[£¿‘HŒîzCÜø:܂i„ÚzŽ¾ +a¶›OÅîãj­æ\¯¶yzŽ“Æï$›¾ùŽk.ãQ3Øqìvål´ê!ý2‚ŸDÙ\¶Fž_Q ]güpæÒâ+ֹƘÀv¾B¦‚zU+b]‡ÕûÊÝ+íxØׂèi½ä D“#äZæñ,sU+Ù«jÞ£»&ÿÆÖ'^ÒÜ`³^‚½X=r׎6îhŒc’3@’^E€#ìòãäg[­¦ûë(ýXl—+㶠„+þž¸ÎÙçT·«žiɨ»þFLèÆ]ã&¨[<_²ìqV*‚Ÿ…ΪmŸ‚eÿ'Vž³»CÐOÖWë/%6:Qg²¡Á5RxRaÒñeüi»ÂÌ†_ò/~ ¯}Ô­ š„?ì3\G<•¡s’½,^¨UÌs4$³gÞzû!³>hìá½t©uùÙÏ…"LŠéÍzïM't„ðSZpO tÕ® žd8O„É3„a1î,M…Ä1)—P6yá À¤(•ROxk j*”fðÐ2å ¨ Óâe¾{­õ¬õð¨u9cä+¾vjå¤j8oÙ-×ÂÉãJn°$eõ Ϊ|/6郶,–qû®?1ÑvQ°5fµø âCM¹hi‡DÊIAÌËZú—ûðšŠSô„‘“G•OöÆەNný:)% ð»`Àp^éÖ¡¡Ÿ³1-&ɹÀá 2ù1™/¯ßÄWKqŸ¨?êæɏ>üå"Øç)ÇN‘“O‡à'0Šq#‰è9}‚exýŒ–þd$és‡ŠfNCE(¦×¼9À”^ð "ž¤‘“…4Ÿ7ûÂIhB’r‘á‹Ë¥XŒä`s•;\ùΫ´§ËÃ,„o ‹›  {«Îpyëè³diÁžuƒêÞýè)]ÑL +cÅ!¢wႎIÑT3÷ÛW¡„ò؁þZ{ Á} ôÊ%gj£«Pž¶Ø”D–·ùJª+»kèr°½Š,¹«ÜÝ¿f«6¼{ Fÿ{0Z'z/yzF $i¯A‰XÛ;fì%XàƼcglÖ|©W9s Fê§(6©jïurÒ!t‚4ÿ™——Cy°ôp˜˜½á—jÂB:ñ7ÎߗÄxQ“bIûíþ:ƒÞvµpõ&sçŸUä6Ç-p?S¼°$øË¢i…@6²øÀtöCç3ŒDn$}y6#qW¡—¢Bî"ÐÐʍњæßý}júém_֒u(Û MMÏ¢%ChÂê¢y°"ÍM¯GS"ªcûô¦Sï\þÔaa·á%–0AªÝx[ç ¦%"´Èšñ%uzÂÃ! £6éØN„*&£˜¬©(ÑZ:“}Ty þfVÜXŬ²JJ@Q<àW}1BÃMÆ*nÐ5+QNË÷ òÖuÔ±\¢~ÔÿÌ|rƒªé#  Pð^L¤{òëäJ×]ÝZ-+‚gòSeÉBšç๨ «W m— CÝÒùìۆ”,Ý o~+ú4鲇|%q`‘ŒSÑöVuŠ©ßí³´zÜÛªÿ˜ÀJ®{[C{O³#EßÌbˆâÝ@"^Çú²ëÉ4»tEZ <ª½“Pùk;¶hkð£OÎî ŽA Âµç&þœI˜ +ÍþzÀôcTãj« ðÃ|Ù-X91/‡%oôþ~¢¼9&óH|GÃ+óZ@Jr”[3:€6òŒÁd9½)¼~ØÝÙ½ò¹T˜‹Ç8ûøãݎJöDŒÍÛ¥ »Â±ÕŸÀ$Ì£$·îÉଠÛtùzú ÎÖÆÿVÁ3&¿À*ßè$wìõT ¸Z´ÿhÄ×JÜ5B©õ}k0À ]ñ)o­¥BG÷#Èm·æsEé¯{„3dçlYæ\ìC·±^ï՛= U^ÿƒhêe;$“^/‡6Z¨×qu*×ç¨ñP5¥‚‹1μR숯¸ÃX9ö-1_†Ø}Â~ãeÎTŠ;‘t+²£ÕѨQLé™6á ã;68¦ µ¬Ôš§Ïks±7Š[Fñ¼·Ç¥˜ô-õÆøÙäHÒoc<žÙî‚ͼX&Cƒ_È؛ïÅ,ä¯ts§+Z%î:‚WE+rÛNOuG(K•=îËy›†Qôfltñáý^hQY¢_QÞ>^ñ!×ó²à)0" +Öûßò\¨“º¿_‘K¿«–æBªÂzSBîV;•Ð1,ÀWRCÍ-¼Ž;ÃvÚ{ߍ:Õ®ÁâÅE™I¬+¥é‹œ9¸=‡æ/“ŽÔ_„“êL>‘"ØÚ›ýl¼á9–ù³(*{/íÒœÞà Ã`®ºxç0CFºé»¸ ­7¯ZÍ» ýbSj6ahvHè&gÈêhðŒ;OÞË6º}Ïˈ8ð +0SGG/¼ÉÉö!¡=慜¡ð{ÿ‡59-ä'‡‚`O©¤±qDã˗QçkõÌ2m¦’i]0}˜Ù ¡ª1ß9u¨m¿džJüCn5t–s¹ûWä%)v«,M!|‡oš~c§Ì1Ç-[v~ ̇æ4d ¯H—ñÂúë5]y矐—ãyþÊK»ùŠC58JÜW Oç$=WïúXüƉ?ºmñåÙjk'ªµXʺøü~ ƒ?¾)£o•Qý)Âô·Û õvIóµð„ïöô]ÙsêêÀWýÎÆZ~;ÏÓ×.F؀ÎÎö­Pû +Ú'ûÙ½èÞæG²¤?´„Øy6—DȯŒZ‰ÍßʯEuïb¸¢–$ì`$ßnPmÀ½Lt•´Ù%ï›hò0·zãóùG>­±´û9Ÿ}ÀÿÎ=7H·”¨ŽtÊÁ  â™Ï—gËrרùâ¢v'g(_ +M69Yâ’AðCo^ÓÛI »ý>naÅý7³Œ{ÌE…¸ODí ¾øބã Ú$Žjmä4Š,¤mŠ·ÆD­þÍÇû„µdÏWU͑÷ñŸ +yI¦r5I +;l¼1 +ª ~|»þ¡ñXJò,›æÈvËø]á9ÚF¢ò•Â‡½Ü‚¿Ô1°ô,ÌÍIËÒªÅ>*üP:óÂr„~®Xí»YíË¦Z4‹k7–FX˜ÍTºˆ–ìT½6¦¨ONÈá•óÞöœnDX:& LêúÖº G+ïWOç8l%~#p§Þ‘©ù¯Ka×£»ô;Ë,H˜­C +G+ÑV:BB–G”ßF‡aˆ&BcV+Þ¬ò`!µ‡pT˜:óø~¥€cÿô‰ÅqG4Wú`súóAo<ÀP]ØÎú½_º½Œ“s;•C*ºÔo@á·o";êg„háÙÛ¬â÷$B¸WÜ3R”¡1¢’d{ –ÓŒ¬´ù¦ù„‰G? ®V-x[÷ÊN£¡pyNשÆÈï4/Z½ÅJG…­2¨wûo½a€@ÅU'ik¡Sü|©³Ӌßz+¾V£ÞèN®+­W\gÚ 3–>[‘ýȶŸzgÜ£Ú1ûèe‹ÕËߑ­á$(ÓåǨeâf1Âi.–¤Ásšß>³d¾/~®z®x[ÖSÌú…bÍ”#¶|¯{ñ@Ë 0úxY¾Þe ¡+ö\9i(sã±wÍAxåHü¨yfœ›YåΦÁ¬ÊBrø`/¦Ø•f¸‹ž–†µ9€rÈCfõ£ùP£Ïéf1ëaD¥%ŠxMÐT¸PÌg­¸wjðxÎ-6<3<[îAU:Oa£b¨Ö¸KTØ-ºÒRŽºø£´ÂI¦‘WÓ{^/‹/E1M›/þd?rŒÆDÁÚûKMQ\2 iæsÚŸòñÄeÁµÀ#™V)É ’Œ)x™®y݆^¦j,Íí¯k)‡*}”慠™e殂oV[™¢;Mû½²ãتÔ,ØMciÌқ¨yÅ×;¸î¶Ûúۛ‘»õ·˜Ï´+:ñÜÕ)r0­×ÃB- |ž°ÞV a<–>þªD¨Ý _.Ùwq¦L +QL–:A s×Úý©0ďٜm\ß3\Q!‘Ó2†H·w”ñGõNò¡7—.#&šŒ`~™BqœÄO²àávÆ4ƒGÉ/À'T +؝•Éå ~IÍmùR×>Œ±1¾ÍÄº©/ÀNG盞Š +gčêŽ&tLt7ï˜/cXc¾2ÕN"Ô%bŠE'ÊJ~Ä.{ººN.áqxàyó½Àéz}cµ …Ù•K`%ÇEè }‘ýÉ{bm$ý8&Úm¸[T)p1Zxœ‡‹Lùƒû<È"ƒ6ÔªVwƀîùêh­hUŽØóA”mÎy]ýn¶&Å ZêõåÄòð#Ž¾©T(ï¹Í4„˜.ÄiÐãÓÆc"4žÃÌ@ÅbtÐÐi䏻"ªŒ4IÆÕu¾Û˜®ÇŲn†;_Œ$(0Ãøv‘Ð<»ôNjŸBýü†''”ÑÅpÏfg¯åेFLé-?Â-~k _wüÅ\­~vJž¹Bæž9²ëºGîªŸ¤±ÂŒí¼I"xãÉI{&-ËW ‰¡®Vk´ƒB‰@f¿Á!zÀÌRM…¦"Ù[J¡—EMZ3ÌDÁqO¬¶BìLé‘(D/pÁv„ÝNsAÅì]_cÌ$dñì•98ûþ£zëöA·ôSªÈ1žÞ¸Ä¿ü¼v9;ãxo Rc±÷bò:Œ¹±ÔãÓ&­à‚à â¾`\d,®9},q ÃeXçMUh\¼âןrk.ï¦ EٔŒy+òÒ>’_ó… Ð긽d8‹ÏÏí߅÷mð0»Š>t˜æ#êÑ^ö_¦–ÕÝ֋¬ægW~m·$V±x#BÈLËôý©q‡É5#{±÷®¦ë¸¾0UCUÛ¯ZK¿ÉÂáHð ã>°Ñb&ñ2cPêÅß) LX¨UFV!j#&1£| ”ð­Öø%CoDAöÞ7ÌÔínIE=“íÐWgÔ®,H»þRBTÎD:7¿ô«ãç%37`á†ÄaÙª†ëTŒLí`‘< +Œ`N­Tw5nt4ÄtçͽP&CÕô¦vô¾;÷6(à`8yÙ‚½¬¹Šr‘¾OÿŒ[ù![JezEû™.~¸Ö$võ(Myú[²úGOK´²7´õeˆœº¼ŽVÞßzj“êU}éý1–ªMŒuÐÅAe½¯V"OKªj;`…¾eJý'23ç–Ãò"’óÈÆ¡  ø~U¦ñ§Îð€xCÅÇ£øY|x§÷¥”×Iõåû°#-K1½G¾¼°ÐŒ<¼ß‘¬GÁE&Bp°Tû¤ñíCj쌓aÅKA­áo ïϚßþ—Q[xˆ(N“sƒ +çÜg'ëK%ªßT¾‹šôuñˏDhfu» e¬p$®UÂáÙ£3ê¢ûõó‡UòÓ>ò`²k\Âï@ÄÖ¥˜Év&7MEÖD}©+o]8ôr…²; ©ž¾ ÙþèËåïT´ÒŒ +Pè㩌×ݐÑ5“_ጓ’”Aô'ž€ `>ÚÆ1#ôëïŸúæ}bo¸{÷VGÞ"I‡St¨¥ @¡èPa‘ÝûsMTÖrb+¨”Øþ»ù†_£ùȗO§Y!W4˙gŸç¾d6²ã˜ÉzÔÛZÎzŒÇt¨ +*8¾Íd+Ajþ:=§ ¯j€nú”6j×=RœõŠ²ßJc_° e³/òœï2.; BG/̼ѐèëIv¥V"p¬ƒÁqËåܺ&Aüw¯Vλ¾¹p]\ý%5À bÒnäÎ9#³_RMJs’·¥vÂp˔rûá1äd§#}w,Zë»›°óÛÇä:Çÿ å¡N êxÝZV²•µ…ám‘ðÙÑ]›–ä܉¾sò†~™ªU-iLsž ëF ¶‚ ݍ@ɍVÅǜM­ÿԔ挎Q‡ì¾èæÞuú+¬ºTÖ3¾ –w¸ÀûA¶Xìi?ªŸqÆÄQ¥×S¢»(6ւO6ÚÀù¥üUhbˆÀÄ(´(¡7d.3ïžÆô{Ø)5‰¹?ÒÍ£d´0±U€³s}Ä'³+mD¶(mrgڟ;{Üòb<¹`ñ÷Ýu8ì]•ÝWt? ˆÚ‰=®†YØæV‰Éì÷«x£0Ó W›ªûèþØkt†`†lšÏ³9ÕQVYƒE‹ÊؐS´Ír<Ú£5{Jè a)€ÆèP:}PÅ,kƒŽÎåzÈÏòWÓ§–ÿ©ìi[ß~ÁuiRNP’KéÜ`»D²^´. T*œÏŠÇî [^“3’nµke]&|°*­+ƒ²ï¶?þ— À6Ma“Îږ>ºp5ÁhŒ;ÿ¥Ù;Kú ÝCA‡aœ¢þêYÕÎgàw.üAJ‡¨ˆá6W ‘Q¹Çš[ë½Ó·~¶Ô®Dkm(­¯<Žæ©æµ—Ü|jŠ›»ªÌvŸ6õ±øê7³é ¡ñáÄqßtxV/âÏáÎçGƒÅœµý‹õB$áx)A÷쵸4 .Ôðî®n´XXAöú‹&–ß… Ÿ²DM׸¾Šl6‹† –Ð<3À¡DŒÑ,›`ªÎ"ø%É_ha$®qœ´B–×…áùÊ_žTJZmҖÁvDEpID øvAºŽ¡œ*Eí4«ì‚·Õí~Ϗ½\Üõ ·MS0û¾'×jهŽÇáðX>L½¿Ú‚‰m ‰´µlØ£ü¡_%(DŒ‘‰¬Ú\†¾ÛãUë°Kyf†ý±LvßE>̄i'X²Ðfæ>7Ûñ€…¨´ÄȜÎ8²š$¼0éf¼?”móУžvÊÒÒBHyn:#þ{ý(+¿Ä•ÊürÜlJ^Î|øšY"v‚^«f¸¹›p»¿ìäFkpzG]On‰P`±ŠHm=Ëò m[hG‘î¦JðÚ÷i˜õÇ°þ2ævG)ëüñ¸1þ‡½zÒhî×K¡'6´Æt·=‡KPÈ ¬)(31¹?cS+¥×\ÞCåëˆî¥TqMOv²Ã2¿~Új÷ð»âçöŒÉSóâþ¨ô‚©Ô®rê—ŧq´‹…âo†Áf`…o ¶ øç_ŒÇ»ù°ô8Dk•èã×Æ?ÞéçMù~Ãl³ü^À!W ím´%iº6ëàÅ5Ù§”ŒÞ2`ç d¶4¿xà ÏÑ0ͦ˜ÀÍìüêµÎ3Œ›¢°tWææhv¡h(~^NŒ÷ œ‹Ë÷¦³;ðU÷¦†Ž9®ÅCR#¯[ÓæLŒPÝy_ +L²ª¦Xeߪ¹›˜?xe,xB‡J uM±N1·&ÝÖ /~Í|˄«G»Ž_L µØ~DpОð¾IWѯ=}²4€>ðÍw¨ ±%%ô%r•§ö>ÏÇU¹dRj‹yê4ǔ” œòWF=‰‘ˆy×.q’W¸!YBHTÁH¾sõE­‘’\îþ`BÈ¿M÷œgÓ¯ûň;UÂÆVÂÑÛ?ågÁ˜ ˊã>Þþhù`>Ñl~Àd‘ԔɑEgOÚô­²í¯d|0Å69QF·­õnÇH S¶u?LDüýÎ ÍZá‹Íc$q,’ÒlH¬ÀuM †vðQbŸ×p؊°p/ÅÇÛý}1©óðCgŒ3 .À=7Nêîjޗm­4«}›¶NZ {BuqJrë_Cç)d‚¼©5lÎWb)ÏjG]L“ô0Չø:$o£oÆýÄòô‚*‹¤¦‡WÕu±F>´?‹Pq9h.|”7ýt"ß) vZ™Œ@¯{>]©ÜQ {cïTÙ^änR­¾“óùð $¡ãx0ÖßÕã&a¬F¤$RV×_\“‰˜ÅŸ'•؆’«ÂMÔÌ©o11‡ø—D¿Ù\HÒêãg3][¿z—³«}gÊû]]ßå±ï´˜NNÝŽ°Ä«Ú:5ÆiÃ3>ו*϶Èr+;ÅÜÓFæÛK"PíE‡ë¿ÿ•¦é®]m\2ç?T nm’†ðÀ±uªé8f‚+ÑT–·ËÅI;!žájùi׸{5®²'oÊñ‰Ž«“fÝ:©ékEÇ܊ãŠg’M +ñ'Æ^¸g÷!§lÑá¤n'R=+˜@Nj3Úz§^åüéËcYCS‚–+Å™Î&Æ°ÔA¢rûd¹-ˆÒ¦þüˆnžàrŸl¿„¹ ´ý NM^B•hz‹Ö¤÷ ¬½3x”x8EªÔ,쌓~§l”½.py5èfÙ¦|;(£•ë:ÆiY7zý z§Üµ£#iÓÙ«% ãﯷ™ã[ÙÔ=-EÈ1úDœJ­ þì3‘rÕíﶛ“"c>ßmÁ?z¢œx–Öøº'é˯B O7_€A—­#r¸ñ‡ÆqúcPÝðí\*[¤ô¥ªR4V=ˆú9â ¯wåõÞdÔëÏ(5õ„då/üës X#ƒâêÜÞte:Lô¶nØ茥™¹Û…›ÌæxÝo¼?ÌxOØ.Aö#„e1_E¯¾|»-úŽƒ›º×ëÇgßHÉ+A;¸ƒú ±õ‚&PiL9"ÆÌ@»ì•àXêþmOè ]ÖÀÅyå°@ïWÁ‹Z²fT5~ë9õð­Ýž × +œ€ÎpÎ8Tg§î5Âi#¿ÓF£M(Æú¥E»N]ЕjQä ¿F³10žPhb6…Z‚&±<¤ jçU7Y¥úmŝï[ÜÏÇ­ߕz†s|¤¨¤…A Q‡¼¢O¿ƒáŠoF}‡n”:>bm¥¦¸Úb×1v[‹Im›Þ±@¦Jg”XP`¤Þ¬ÝÄæ'”õ}qe/ùêéDêð mk´w5V븫ãBa=´–Â;"ƒ<‘µ« JÎhãiâSeø/ìáœÉ ô?j ›°c^¦/?`¹Lüos‰›%0;Öù>R»Z“Lj 6Y 0fᦀ +ŽYä‹ÛBÆϓğÃíR菸Td³¸7mÛì‘ýòIiQˆï# Ø3ÂqÝ_ìÜwzíWoþ´zrIá½B1Æq€Ë6Oh£;6 ¹V]í [Áa8õeCõÖ­³ð(9ª‘½«sòìÌG°Ê£]èl©µÞ"ÚÒÈÁx4{šcÜê|8§„¡Ã% sx“»”ö“w.±©5ðlïÐ|†Ï¡}5Þ>g¹ä:©Ðl7{÷™g¹^<þA“÷[~hö¹)ðÙsÊùéB°J)ä]pX¯Cç쑍—nÕƘ‚NýÀº{Z^Jë´å9SºïèXkҁfA,ñ§V s~+ߪŒÉë(®ñN¿½|žü? m¹–@Æuû¨¯žâ8ú|î#öSnµÅO¿[(FéÁífÙÜč“aõƕž˜#™Kbÿ`¶èÃ…ç´‡7‡T٘[·@ñâs_ž÷)yÜ<>ÓÝâ֟4«tèT]¶“6ex"×@sǛ³ù›èۍ*ÒÈ)„‹orV˖Š3·«¨¦'‘ÕSñ˜F\›lnçJýe–õYçjž· AU儃–1§0¸ôŸÓ&ØJÛÓüpµ-žO/ÁžþÈìx͎ßÍ#Ö¦ + òȄ“¿àÞC´¾Æò€Dßlw#ðÏÁ ê@Ïwe]«ªÝo!œdœ˜KD²)TðޕòPWupñ!De ¼þÔwÅ×È¥Ayûrx¸ZÀՉ1ìàqõÂy3¯)äLj¹6³ëQŽ‰£)CwC3ÿ-Éûlì¾± .\aÚ¢}Å;ÜùŒaHôç˜ûÚ¼ã¡ßN "k&#\u èz¶VåÂ5ÏÕ +qTwÔà +ù"Ó¬Ä輕C0Ӓх‚¸Ññ ŠËÂôñà¦6*GŽG‚o ’Ñ*û¹þ·H™>ûmmôôMa³®Làƒ<|Œ»Šc¾Ú‰·-vWŸéއrùxyãæ—QLùˆ{0ÉiôE}ƒÁOü@Öf+¡‡GÏR‹®f7± äÉ­##d>Ž‚ jô&a««‰Uë]qÙäXŽ¨nÀtGzlai5ÊâÐåi,*:?Vn%­Û;v¦±þ&6íè9*i#p+ÜÄJ`i‹&Ú-`BUḃ^¼zýW=ò@yœ†×’( é“ Ë‚.„ƒ’Ý0BSižÊ£—úO;Ñ¡I´ ;¯b¦‘¼blQV'ÂU¢{(~UXÓÀBI¸a..÷ËÅG^§W…û•Ý¹õcM5wŽÖJߏ\Üvp‹a‡œôWm&A'z`pjèeû +xJ°LÉÃ3?®ÿ¦^ ö{º^åyÏÍaߋ Îjʖ­oÉn¼Œ™H-çûÂûö†éþn.É@©ÑÉ¡ÊlQmɈN G£óӍ}¨–dO/]Ìu‚™L…z)“‰–/?åÀyúbF²×1q‡ÔRú–Ûä,2'$üVCÜÙ{_µtáá%£&eæ¡ +Û?gE"ª²-V”ÿ„¹ú‚¸¢†õG!å\‘÷afà-OâbBéåc†}€‚³Úõ®›FeýøÖ«ËÂñ{Ê·©§4íò÷b_Gq›(ˆb +{ä]WµéFE£§ ¨c©à0MX£S-E{é2Üó¿ÉØ[„¿ø4)øêPíër +ÈµÏæNàœ2ÖH!7NB-´û¿ÊŒ.Âu#¸„å³¥áAhܾx¡¸€ÁŒÄv\þ¸FÓ5@d°®Î#u…ñ>ý6׳:Y&éÌÝïW&ªUçʏËòGGuåf˜»?r¬Ô͊%O|W€Â(×V4!)Sî·p}šsÆÚ³FE¿!<Œ vN ¼aª<©2Ï\˜™Ó§;Ý^rÑ´@þNw¶$÷%hó +§ú ¶† R¼ã‰w‡À‚ÈVLd)ÃÆ8E½\h0…[óÏ*5ôÏmv>gR”îž í\­àãǺ¸‰P=h.$mWiT)Íå0šå'÷RÙ§ƒ3'םÎÓ¦wx—M †#ã³Ç2ìÁÏó [ô?v7Ðó&žƒ+PpXûˆ•ìT[Þ=ñë íµxk»Ñ"¶2 ƒ“y Kѓ‘º»Ytqª…ÕbfžO-›ÆHN¨…:ûBËäŒçÏ$ÜeÞÙï©à4žOù¿+< h?"yˆêIN²ßÓ" çràÄûƒ14tìÕ7=í „÷ ÓÍÎæDÞ$å"›9´ÿ½Dëqã”C?ͺ"›meSLic®Ê·Î»#9+C^z³9U¦ïíÂøÐt݈.2“©@ì8 +±ŽrAé¸W'ߕ'>ì•H€fáyŠd~ôÍõÀÆfu A +(þƒµVV ¦ó"±]Ù-äšz¼q/U—³ìb¥¬òiÞ§K’ź +^žˆ^ +ò¶ ëD¶^~WroÒ?]ÒVî4F·ÓƒŒÂ€æ£îòÚS¾è'èvˆbŠš÷£uòýŒŽª|É#Aþuå©ǧc™Í ÷~s¹ŠxìZU<\™Ú]‚¤›Þ`”,8Y{ÛôÿsÍÅäUîDV­q~â—“mvµ"¨’è¡Z®mæs.pIJ +6†ÛSÁò>—¾·_jk³ð¤[Š"jYÔþÄM(NhoÓE»—þXqBC~W`Ë7ë¼S‘ù¡’לÖh›‘¢¿N½«1£•Û +ó.A¬,x>nŠ(>¬æðÀ™æ׎D€Wñ¸VûÙcë'xÝÛ²áÄúŽBï ¦ã•Vºá^¥ƒ©–`Iô(ùuµˆý óé\®Ä(zX(´~©g[øç<ÆýÌ + +›ɤUgïA(ůž'=Ì;‘@…ràŠ¯̟ÑÎÓ¸5ä£]%ÎÌ{†«4@éò6°ÝšÛgµYiÂ`±Î.ƒgÀ"Ü¢pµU>…Î.¸2–HTNm=ž0ƒï)Ó¸‘DÑVºZyúqvã/Ÿ P–ØIë¥bx!ÁžÌ>®â±ÁC/8う“œ 9u·ðVÜ1÷yA2‘d¸,ÿèðÔû FT›ë¢Gchø”Å͇@T‘KÏRÝ7î[,EIÒq%yYà3®`ä§NŽ…¼¥´á[ZÚóý¡s=}½†û{E-=±Cø¸ ~‹ýa(-E¨9ƒÖs1ÿz$#+ÔÜ°‚DÀ®AO„¾ˆÙG1èæ«1ÔºÏ@6î‰ï—]CMŠ&A-=è`idjW̐€¬ r÷Ìm +Áz„mEq8éýµí°¬•5͒$µ”¯ƒ‰ßΖ˂†Î‹ÇÓkÿ,ΨõŽxøB¯Bmã7ˆºqÈȲ=ÊÖ¯8Nàð¨¢͢ý©yJÁ2àú‡%™à5çkãüÊn¥áõÏqYâogŒ(íßIXì™ì\‡cWÓö?¿½*H1–ÉP%ZJ=©ówtk\ÙÑNvHЪ4.bü´¥EzR,ªl:™!†ŽŽòVŒˆBpw°KˆÇ ÿxj€i +endstream +endobj +2537 0 obj << +/Type /FontDescriptor +/FontName /FAEEXD+NimbusMonL-Regu +/Flags 4 +/FontBBox [-12 -237 650 811] +/Ascent 625 +/CapHeight 557 +/Descent -147 +/ItalicAngle 0 +/StemV 41 +/XHeight 426 +/CharSet (/A/B/C/D/E/F/G/H/I/J/L/M/N/O/P/R/S/T/U/V/W/Y/a/b/bracketleft/bracketright/c/colon/comma/d/e/equal/f/five/g/h/hyphen/i/j/k/l/m/n/o/one/p/parenleft/parenright/period/q/quotedbl/quoteleft/quoteright/r/s/semicolon/slash/t/three/two/u/underscore/v/w/x/y/zero) +/FontFile 2536 0 R +>> endobj +2538 0 obj << +/Length1 1630 +/Length2 7267 +/Length3 0 +/Length 8102 +/Filter /FlateDecode +>> +stream +xÚ­VeXܶ¦AJi$‘î.%¤»»f`†în¥¥G@%•¤»[¥C@@ºC¼èwÏ9÷ùîùuïù1óÌ^ïZïŠwíý “Ž>œ=̤ƒzððòK´À®vžMTƒGäè©mî|y8ÈÖ ƒ*Øz€$Æ {€HHHà³äan¾p°£“€ÝPϘƒ‹‹û_–ß.;ß w‘°#Àz÷à ¹¹‚ wÿç@}àá8€! €¼¶Ž©ª–2€]YË  ‚‚඀Žç]+@€‚"@ùë öàß­!xï¸ä[ ߅|€ ·ß7À w#w¿`Àn õ¸› †!žö¿ ¸³;Àþä‡Ýy¸Þawd:0„»yî²ê((ýU§‡“­ÇïÜð €9ÜyÚÀž¿[úƒÝÑÜ¡¶`(àòñøË°#Ü ¶¾w¹ïÈÜàà?ex"ÀPÇUÀ €ƒmáöqGsÇý{:ÿêð?º·usƒøþ‰†ýñúg `âÀ‹/ x—èq—Û Åçû½,ªP@€ÿ/»½§Û?0/üπØï Ç]¶ö0(Ä`rÀçӂyÜ¥°ÿßTæýωüø?"ðDÞÿŸ¸×è\âÿï}þ;µ’'¢eëz·=2€»WÐü~g ¶pÀï·ÆÝô¿Âl]ÁßøwGcÐ_Åþ7ßßaUÛ»¡ÈAï„áäåÿË F(}@ö:` ÀÁr7³?vC¨=CAwÚþë]?ÿß0'0Ðú[‘¿ ÔþïåßÉõ§x>5mSEy®÷ÂþñÔ¹Û_7à¿ÓkÂìÿyøÍóìÌàÏ#*àˆ‰ ÄÿMÆ?4ÿ:kÚzÀÁ>s~^~~ÀÝ÷?>ÿ:YþF +„ÙÿÞ}[¨ýݲýÓðzÂáwÿ¹ÿwMÿãügíA ÿë (᜙“åQEõªgHÁ¼£M³'Ò­¸ÆàMaH¬583fY¢Üæ¦2’·vDò¶ÑwzÛíç75Îõ¾6J[ëKÐ^] 3G{!É+JŒk=ŒÏª˜(kÇ8ÁJc ËL”ßh}eHWϪè‡~%ÇÛ?çaö* !|æFÌøHÑü ´êõökê÷ó3¶®þޞîÖCìöo´\ÈÄ{,R^XD¬ñ!îHZ3ÃrÿX®5ŒêuÆí)¯DmIö”.Ó#(‡C3§Êòu] ŽDƒš‘¹êb˜EéŸô6ñŠ¬Nóœ)P9ÔrÇq•~]«,ùþtÎäõ±ï\²ë#¥šŠ¥?ñdD03~i¯ÎRæÕaœþÌùéXæэZ‹·L¦^S(M ¹¦¢U×õÛ]‘5 +‹åX®²8M³uãö7KíuꉨŽwZd;éØîbˆßÀ€m,ûV=ÁCÄBŠIG#ZÜR%6ƒQÁøÌ·ò7EiÍLgÏ¡±³Ší£õÇÕ!ÌÞT¶/¤ŽRôÃ՜³í$ó©²·ýË¢Jó4x–5ìs¥ðüÀW“'+Ó_}›CxOX³ˆGˆsœÔ”÷“’=—#F&«U>þìu †Z §­nõ’á Ë\–œYcÌtÆñÍ¡=©iǵ/‘äç3+,M×9|}A¹ãÙ{3dܲTÙò/ð&Î7¶‚ µÑw¸_KW²E%W·ûnÎu€§p֎ k>OÜÃ>î¼G6*ºKÄÆx¶pwa£.0ˆÛ˜w>üë#³´‰D?–{¥™È‘“èØ,³u³fT¥*®l×^X;¢Vð[MÌ×·õ•lpy8MÀÈ@âþ‘1a˜þh¿ÙFlêëí“óp/¼[HòÍc{E»ý#>†ù'dÐuu³éCÞfF½ÒL­å¶ãd°ɐó¤ô¢IJ¼i‰ç¬êgR­i/ړmÎ÷a¹ž6IÓÇUÙܬZ_’ˆ¨¾Úá%À«7­{Ÿ,w‹ÕõúvŠIV‡÷rö°qÑa^ºr‘&Sz›bZo3ª´–%¦8*L5ücòX`púûiÕk$â4CQc‘¤Rú$ìI +'ÂcR´š¥uQ!½Â©ÊJ£ãëS–Ñ•¾½G̓¾açûF {ƒ_?[°T/F߯Sž1n$‘ÉÊمÏ•196sˆïö’ë- F•¹Í +#KÔëÕÙfý¿ˆ²Û¤õ^tgN°> +.i÷i'J*Où«ÐÇh2rÐ[î‰ ó© '¾Ãµï½²Qbš´n–¶]\½­áL/'|À{èãà“sùaʾƒ¢ô4^rIÖû‰¢ æî<îÍæ¹/ù”àV1ZO¶Lü]R )–BÀµ¢‹nîÁ'™ ýº£'Ç4¶fµ¢¤`O§m¢ð…Ï+_d*øGO+ûŠF‚—½Ü[|VËib™4p÷§ *¿¦Ü¼;d<,í=Yèr{uh¡ÿÓ¤…“2DM5ãýíÆòýˆ‹G­a±Ùß'r„‹ðéϝŸèMH…ˆœ…CSÅ/fZ:ëŸXeeµ¹#‰ÈèYÙ‰T„Ñ4åOm(V«},úG¨Þ¶ –ý ꎑϪõÒ南³ÉHÃ曲$vñҊ:¸E0ÆÞ«6 ˆ +×åÙô*]8SV¸ØV:ðox³Ìvó2Ô ?„%jã{Å™iE{~0CœÞæR»Rå‡ÁO~’øƒ¯³ë).Ø寅ï‘l(«ˆD!Ê +ÿ–˜è pküx[ÁIÄô‰b™ûÃÉz=Æ©E"ýjYùִgÁÐCjVî‰Iô°Zœùº,ø¯fcJU†›ÖBüñÚ³y[¯ª+¤LÍ_ºëö„­bdþWÌ6Þ.îý•Qåt ƒ¹“?R„æ2NßÜӞÀñQ›Üú 1—­wÑَÇõI¤iEW,ŒöE$¡­òõ|º„%Q£Yè;Æ3Š¤×öÕÖ䧂ki#N lÚĂ(܇ºrÝa·±ÈïŠF!‘^ +BÊâ£Ï«V3ÞÝ(ÏÏvY§Œ§}G–!ÖTÌüxôÀ”FqòÙp풭w½jHEMV‡|ÎK€ä4¡ øÐç#ö6i!FÔ Ùޖµ-%e³hcäé‡ÚɐC`YS[µŒµe –Ú‹HæP,®l$Îø\á`+ÀˆÈ››üv’ÓõÁK»gÞjÄ õ6@Âc Ä=J»‡Oª›䛮"ŠÔ9_^W‹Üºé-¤Î Â~tˆs8Œ­[«Ô:¦+S ×V«6n½Ì°žYaÕ¿]|©gúú‡‰òäJÅP÷Ü×t:9“¢4.v·Iï×ç#2®ÆLµêñ‚jߜs9¿Ÿ²žö}Ä՛x\¯¯æ9¹êM8ýw퉪KæÙù{ð÷)ü&Ø|üNZXÆJv·H…¾y_‰<~cü<å¬äÄä ˤLh££„F2áö¯–nÞgï ʧñï?âKfm&L¸×¹A¶œú(ʇ]R`ëú }ÄÙ9©L™¦AjÊYœ §×óø-_PIó­ñº[c½A·Šxaå^¥ÿ»84&Ãl"w3–Î%+3öáÉlû#¦Ô­"*{ßný/y­É³5Â`.§PǨ÷òúÉ z +¦'G쉪gQP¡i#³íŽq×ù÷Óª”š½gÁÀâÐ>ùð‹¬öŽÐ'ôW({‹F¸ }@B܃ËHôâ‹sìØ°üª2ªñ4»Ö5R–¢L-±$-P—-âš-&½!¸§Hå&Oàû{SÆ,— ‹Ö…_é p)„=›¥Þz„•z´Ã@Ss">`\8•QGÀdÄÁõ¼*<ËQ†¨×švî;Î:-‡²f‡Á5j>=ëù>o ËŠsï]Û1±§cJ?üõrIæt‰#Ú\’½š$§ðçI6€c·¢°ÿé±Ýæ%mÁzkfÆÊûµ&ÇTÓ{Ø,*“o_õô”{8I|Ÿ&õ¸-QQ¥‘J($Ī;Á`¡T5¿§0[§÷h€ +âð¯¸ï5Y ôd,¡·¤--¼’/kˆ’ÛösvÀLô£šm͉¾ÝUN!ƒš”l¤O±HùDíDä½.3W ‡S**—FØ恾“ه/ÂôãÎp +Ö?1y‚2Nƒ³~Íî¿eB5ˆ 9,óíæVU| ‘xþ*SêóÈ$¤¯ /Û l@¿pôá.]ò§±ýª5á ¥oº¾cD£°ùÏê%åÚóÅ[Â×æBOÙ)Û¸ów(·žÅQÅqrbÞti˜=9ôšXš ï%C1&m4³xŒ—®IkRL8óDZ!À“Ô{Dó´`ŠVåQt¨”äøÛ¶Xô‘ æ(QCñâãÞóñJQûƒGÍÙÌ2g>›,ސº@kÁoèÞäæ´áҊ ‘«CI`p§ìV¸2Äás³ý¨Ëã´9d*ÇûU š4z~|Tëõü֕O¿Òq-zÌ$Ûó+•¸Ì/…G-Hƒ@hÆûè3þÍÈXc¬ô°W1C{ Ôêu~¸ã,M{KêùÕáo ¦ÔZËÏðyפ4k¢0`"mè^Ë Œžbäùòµ6 çÞÐææÀ/a’+Wò6š†t‰ >J>Ëæy9©˜®ýÛô½Oô«VïŽfJ¥Í“Zðv²˜q­G9p¿¥=Ñ;;"âÅ7üŠ÷†O ÷•ÚF……×{¿Å©Õ‹×ÓN¼’_Ý‘Þ ÍS©›_ +e7"†å®=Û¥£æ`ó¼+Ö_ §ëÞ­Ô¸÷Bêüqi®ë:™)ó^έ–°,3 hÄýP UŠ0ÅkT%#YŠbû.·|ñ²T>5@ÃћÛ䙼T×x£Q©ˆíðHŒjü O™£9%åþ"\o¥}bÏÀ­)ìJÖxÅGKÝêÔe:~èðXñeŽÌ~¤wötӈ棇b. Yê*•WʍÉÍ#óû1]\O8UÁd5SPJÐS®çäÁöªBé®»Qòa‰cp±/<Ž<[Ù \ºøp25ÝìUÛeíknÀE[kX‚%r„çß¼+aá¦TdH°Ëa%¥úedòÔä6* +ãqQ™@{6"/QÜ\Üå8ý`e‹ºÉ”LИBÆÉo¡¥exÄRWÁV,sð,úæešf]NV2îLðy_f®.O¾ÃÌLÃ`§Ø+Ú¥xÚZ®L|òú•Õ‡ëý¹gœ7ˆh˜Æ0oŠQm;È§†Ô*8éÇËÖJñüfÍo¡¿ð3>ô‚Ù>{–…‘cü¸!‘XÍJrg]Õâ¬Þòûd›Fse9gòà?34ú¡‰»aƒÕ"îè;jíSW³R‘w™ßÉÅg$ÙV›9¸ûˆEC'?*Õ; +LRi¬´Õ&×$—¤†@Q½”ZõùŠÛr[¹ ÛÏßÖ®[þ@‹µ»ÚˆŽ{½ýî~µ‘ïX…]ÙFlìóFýþž¤m*áÇ-Ö}È¿£úàŸp³fÆZuíBDå¶>Ë Ûbø8?ÖwByV¬LÛÂÓµÑÑæÏŽy#ŽL†-¼Î¢öþnãàÜPÑÄ0,½Šg{>ð˜ÜNZÕ ¢™ 4™VÀȵZyZ¼}R]Ø¢xtgIò3ám6óY¢Lُ ˇU[[Æ·œõf”˜OlèmùæN1Ðë§Èܨ÷pŠ—ÕÕËvl9‰ò½d‘EˆÏMŽÓ‚@Ôtø¦(‰$%èo\"‹` rĘɊv—QûÀYÑ°‚b¢:ú\jb œ‰ŸKAz?¯^à2°>iL}λ…‘3bÌ/ï~·r´Ú¾Ð2tá  ÂËû÷¦i WܞÊEQî{ì¡Îý­Rá©x!†fȤŸŸ™äÓPsŽ#rŒ®PƆ÷ç¿\8!®EèÈñ> V’3¹8zþ@žLòÈ ç_={¨íŠd–'&³ºDÎfÒ°aY©§!Ðç +õ—SškøV#]+–±¾,¶ ¼{SBy’_˜°ç¤×¤rN ÄZ;k‰¿:UĞñ`®dBo $`•ˆëéxюρuµD +_θwc, “îji2âž>4cܜ“Í5kárÞØÅO¢?B|ßïµë²Xå€lÀšB ­ï_Ó>ýf»Ð+¨,=€uß Äk¡—s‘ý[@ $ë…/³ÿ;©øji#îSlƒ‚¾%U£i¡å|ǀ'h²Nj8µƒyW§C†ÔJ +nkzÃbýÀWÚ +”6Œ³kš_E”!PR<¨k´<°¼8!›^¤ñ³V¡"¯4D"+¿­8؇Rç”ᶡUF}Ë-k¯a¢¹±Ÿ®c“8Û'ÆØDñb‡µËHeJ½:e¥Ð÷W S¾‚Z0¬ý2È]ÑAþý›ÕŠÉ¦Â¸Ëà%žóÓù¯ŸöpÓ¬†{M‘.ѝΈ|±—Zþ-˜¬ºFõ¤~}Žº¾¥ŸbXó¾ÿ½müÇÌëÂñM?ÿx'ä*Agi)ƒ*¡6‹¯Ó›¶%èb×&Ïî¡w.†¯Û '0ŸyŠtÐ\èÊ5_1JÃ)t*¨BñøÝz|âõ}yÌg[…¯~…®çãå7Eæ,—\5T´ÙП~¬v'¬Ë¬DÎ Þ&ÎZ#®ÓÈÇ;¶RQ“<ðïr.޳ˋ,÷5éÏZ•Î…d/ÐLg¯”’t5ªüyKƒ‹¸ûó}2ÂÉ<®eHõØCå(+š(Mî±{ÇQ=üùøqm’2ð¸Lï8€9CúYe‰;>+&ù&JÔWýröð O‰L;Á æu¨A8¯ˆã¢Ñã7ƒ¢éøêFärÀÌԆë†BbìßìdM-KxN?c[ NbÅ£÷çGN•_³ëÔH+|ºš=¼Zç-üeµEŠ%ìb£7™C©9$]è컖–÷s2b~ÊG¦Ê5¼Œ—?+[¦îÇbîˆViàÅõp•GsÚ#EfC$¤‡%y0pú4”•MÓ[™¦É lI(¡ÆFÒƒø…uUàՈšñ%ˆŠÔ0€¤AÈÚÅl*W®GL´ŒgNþ±ì±±íÚÆsK #íæBIBjÒ3ö„HqÒòÍ]’œêú~Z켉˜.¦<ÝÚÓ*Ä1[-´ëilTÂяîiÙu!GÕ8,gôídQœ?*SȽѨsZ2°:z¶ìôiâ„E&ä䐥ØW'”7ù_„!P6«&f6‹otd“5igÕ|ˆå(ø‡  Ü¤ïïÐ ,sJğà3ì;˜íÀÑQûú7”ô 6ÃêÎ÷3Ñ õ O™ˆ +BŸx‹¸§ß +f"ë÷nHÑC§¶Cþ¦Úù+|JãtħœAÖT׽훯Cô›~ + ãe!Î<Ç]¡9‰Xýéؾz1씯Ax©·M”+ç5ýîºëyœ +®¼qu͕!9üLV¦3g o4)®æÌó*:’×€ŽFò—†qUÓC—¥Ëú§;¸‡ÃoåË«—M±A*‚]R‹DŸ"XœÎPñ»œ6 ¿HêM’ŠáíE—ŒÒzèŒ+Ðg§8ïtÈ|¡ˆ«Ø¹¸Ç©ýéeá¾òåkˆ¶Åµ÷€Ï{Ôô2Â<«hK«Ó³W#^ A6;I‹ãD•vËôP.ÑípG¥¬Rp$Ÿ­ä"^º‘RåEǀÁ—I©ÛÐBž-›ˆÏÔYœ^ß¥Å›Ö?`ˆw϶i£;§¬ó>RãE5 +à 1×¼€­ß¦ôù+R¶x¶™ÎýdÒ¾¼U¤"i>ÄdÄo{6’Z²©&[þth>ë•D}Fè‡ðok „¥˜“©óo>G¹.Ÿ²´$e ¾R§'’¥D1Ãë¤U©U^Ùљõ_Rîh†é6>MÔÖ2[²ÁOùô3›ó8]‰¥.JªêOHýˆÂ|KONÈq´ãåÌb>ë홾(RÕí#u“xïÒ‰‡fœ¾ñJ—§í#”¬§0aоŸx!‹Ð…6CWyÌ(#oFýªFQîîÈ-´ý©NAFÓãÚb˜É&¤ÿÑá~ãµK·Ê¡ûæÜ£IÂì^p«ót¼‡-Y¹‡¥ó­K©;eS¤°’åzVÙ¶-’ìŸn±¸\°q6ïl2¡uç<Ÿì×[ëVEåPىiÖvX=¤åYt^Ú{23ÿÎá{±§^*ä ÒØ-Ö± åãB÷ÇO¾àùµCóÞUá.’æ®T@¯‚7³Ê(¢ú‰­± fZNìžÊªú$ô» À9^ 'ÝÒúü É¢¡î¦ÉNÖçAü«ù&{¯Þ€!{ Lù™¶¶®)¯µ1Mþ¤Þ³‡èÚߋ#_ŸÁ®Üé†íÅñ +¨¼Í·Ø©¬«åÄ®XùZ˜¡é„‡”¼yÀFu\Un&À|Yëeõ¬R«¯Ëíqàk™¶ E>¨‹i_ïîÞOGûŸ¼5“uSð/|Î yÜ7%÷C#FAã2×xîÆ­X¯3ßn^Ú¤‹æA@Ã;tßÁ.ÕMRy;£pøè¾'q§HN}‹óÇÀ™ó—sl2 ¾q6 Ã:È¡ê5ǽ¡÷ 3=IèfÂPk/¶üJZíCkåÍ8Ïms.ÐUÙ}mò)* Óz–¶l›Ÿ]r@ü¾&múì”øƇû\üàA¿ñg鯞MFl¬$Žml£»sîàUPä=«TbëØ1ÇÙS–P;9òGÏðtžr¾Ôº4âÃ÷´9RGu~¨7ÿX/[_AK˜ÊgÖèa#‹#³X›…U—$ùÃۆò ðkº¶_em³;šÆbhd³”ÿŒ~aA™›Ù= «œsèN|ÏÜ6˜Kže¾oFV¸òÒmÝi¥ÿ\U+¬±IcÌ雷Gïí¯…&ÑÜêçIò×É7âW’r}ۆ˯€Rž2cµ >PîîÑGxºÿ +œ‰®ÖÎ玷ҚԀð˜ôsöõˆïø©–vp\R÷ \í)¹lm¿™Qº´¢£i­Ëœ¼ƒîp#=csm™…®´Á!ˆöºo}K?ÐÓ· –zIÖB!õb$´¡Èý×?Z࣭f'_ÙÏl؊ÂâÈ÷U'+kŸ£óáó¼éÐ^J#×ê<"ؐxLt«tÓ™Ú?û$÷#!u&ñceçÀj/X LJo´t[üBQºû?Ÿ"ˆ¸ +bʦ[Im¥ ~ƒ&1|PÁÝž1ÖÒñÄαÑSʦZ<èXÉttHV‚ldJzCRO•„èyqyâÆ*͟PÿT=Û[Ç°§ïWÅJíÃm|è7ç;†e/d5°RŸ]ëñ{÷ô範¿ÈNÛîX‹|ô%OyÊç–*¦Ò+‘B­Î–¾D«=ꁉdÚZ÷é}õ¢ì+Ê\2ÁŒò„ÕjC´J ÞØD +õeÜ¢ºÑu^7:>O¢ÅNSt¥¥«t°åS‡0¸<>ay쏆<ð€ç ‹Í·)X¸ÆNFù&Ð6Dïg–¬ŠqôRåýŒ»ÊD64>ì|e±Õk[%{Xg¿YÔ&eÀ­ñÜ&úâs˕·Û›‹7åso ýçÃz”Ì—¹ºðYü4¢§aPFL÷nقÔÙXÔꍄ¹ÁßQ‹K@ºlbbš561"PÙ|x(­3Ì{hpŸ¿^«2•§ñ½>oÆ Jkú ƒá/t?R3úº˜ÀÔ׋¢‰ø¬¥2ŠMðˈ +›MÆÎýþ Ìe¼³Ÿõ^PÚTÛæŒN?ö%TJ¢ö„8Ò[¾æ{m·ÆNO«¦‡u씳טòÉÁãJŸ9gðˆŽÎŸ-‰n‹`–HZ]mƒñcËàc©wª¡%ÏE4Q·ˆ³(cb“.j&ù¶Uåù_ÿYZÍ +endstream +endobj +2539 0 obj << +/Type /FontDescriptor +/FontName /JOTYEC+NimbusMonL-ReguObli +/Flags 4 +/FontBBox [-61 -237 774 811] +/Ascent 625 +/CapHeight 557 +/Descent -147 +/ItalicAngle -12 +/StemV 43 +/XHeight 426 +/CharSet (/a/b/d/e/f/g/h/i/l/m/n/o/p/period/quoteright/r/s/t/u/v/w/y) +/FontFile 2538 0 R +>> endobj +2540 0 obj << +/Length1 1626 +/Length2 16978 +/Length3 0 +/Length 17822 +/Filter /FlateDecode +>> +stream +xÚ¬´ct¦ÿÒ&ÛvžØ¶“ŽmOl£culÛv:¶Ñ±í¤Ó±œþï=3ï¬}æ|™ó~¸×ºÅ«êª* +%U3 „ƒ½+ #3/@ÁÊÎÄÍEÅÁNÁGŽAhfø+瀣 u»Z9؋»yš@3€ÐÀÊ +`ááၣˆ:8z9[YXº¨ÕU4ièèèÿKò ÀÄëjþzºXYØ(ÿþ¸mí€ö®Cü_;ªWK ÀÜÊUTҖVPK*¨$ö@gc[€’›‰­•)@ÎÊh落;8lÿý˜:؛YýSš ãßX".c€‹#ÐÔê¯ÐÓèøŠàt¶³rqùû°rX8Û»þ큫ÀÊÞÔÖÍìåæÿäèìð×Âî¯îo0%WSg+GWÀ߬JbÿÆéjiìúOn«¿j€ƒù_K3S·Jú—îo˜¿ZWc+{€+ÐÓõŸ\&@€™•‹£­±×ß܃9:[ý †›‹•½Å! 8-ŒÍl..ÃüýOwþ«NÀÿV½±££­×¿¼þeõ¿0X¹ºmÍáXXÿæ4uý›ÛÂÊŽéŸY‘¶7w°0ÿ[nææø?uî@ç5ˆúŸ™¡ù ÂØÌÁÞÖ `4‡cRppý›@ýÇ2ãÉÿ ÿ·üßBïÿ?rÿ“£ÿm‰ÿÿîó†–p³µU0¶û;ÿ¾1€¿GÆØð÷Îäÿ7»ÿ—‹±•­×ÿ—ÓZkÿö›ƒ­Ùê¤]ÿ¶DÄÞâ/-̌ÌÿZ¹HXy͔¬\M-æƶûõ/¹º½ÐÙÖÊø—×µÀÀÂÌü:5K+Sûàø· +hoöŸðÿRõ/ðL²òꊒjtÿ‡ãú/C¥¿CàªæåøÛÿ(EÞÁì=þ ó훃'À‡…“ÀÀÆÎòw÷þâádöý?¤üW –ÿzË»:[ytÿÖÍÌò¯êÿÇ÷_/ýÿ#noê`öÏبºۛý´ÿ%øGmêæìü—à-ÿߪÿçû_3zMá֖LùB¬Ó³2\ë±óF~‰éô±€„:–5©Ô:ôú§ÿØå©2z¯ elžæýl÷Zúãøq(C{4ևeK՛ +¼, ð%£é/DÝ¢ìä¢; +b2(CÌ8ӌö¹Z”ہÐádÖ8Úû¥¬bPúE8ÝÉæ sõD@æ^€AþèˆägšÖ‡Ù…Ò ‚V_ôçŒ2é÷Ó#ÕÐøèÈpï dÿ!>]n,Ÿ;"eT€S.¾Žz•O,v8k º¡)æ¿Ö?î" ˜`{©Æ'õ¿ÝjO!@ÐãhëdÂÂF+Ŏ&š-<àÐN|ªÓebߐ¨,ŒîˆFÑøE»bf2™¤­œ…š?¡M™mÄ- T+<‘ïa[ÙgÊäЦ0áÁÙ¿¥$D+¬&½™À%gˏ¢ªô21ôºÇƒÌa-]RʁÚ쑣à<¤ˆý:Ô9G“{Δ÷õU&ú•ù!mS³E梵2%O ;‡½Ã`fµÖmo—fr~'OÀOeh„ˆV—Er£ª¥ùí4#þRàËv*(5¶SxmÀjJ +(SeÁŽ‰Êº-’ MúÃÔi÷Þôñ•K<“Y*«EAÃã9ŠÛ—Ò¬Ò»ÉÞܓ”r@ÿ˦´…hèЧ¥£ò«ìÂú4“ ¿Éh®d@¹S}ÄA µd +Š(¡Äõ*4¨á,€L}›[›¨ÔJÀY2(¯ÈáYRMf^ǹoåY§Æë¥Ûw×»×%‰jHÜË}Ûzòð g~õíâOé[ž¹ò+¯M/©ƒŠ?}¯2ð‹  ×/·‡# —òíóҔþ-}ž$šKz˜#„^G†½LÒXҍA U¿©?O¥6mr_µGÙfj¨JV]_͙4{œÕ®âMiŒJU‚/ïjC¢ËÙ=`žå$å]6S ڍ¢ƒ†NUõ©S&M )©û«ÈŸÈÚÕýJI«y˜bíC€GŒ˜á´Ô•½ÛGэxµ ouç"O¸çvnêEÕ`Üp’®‰`å„ûQHöË4ê‚Â">€µ¦LéÆÙë‰ 5btÒ`­Å^‰F¼§áܲa´«ŒôjÙj€¦1zov²ÄðÅb¶˜[F5ò}‘PJÞ%WÊWÚ÷Ïê£qˆ·~ЊoI挹½†J"·$õQ,žT¼Z´ {3zi‰ÒPI¬ÿŒ¨•\O ¨1ît¨²¡ÁúÁ”_þ•èIA„cäõ¤CG#íØ-'Ä×ù.÷·$}1Üv/Œd¡8ôËõ¼þf©×Áë‘{‘÷^I™'§ž}$•ŒÎ¨[5:ý Õ–œ$É£é#w6æÑ–믖ñ‹è•\Ë4äÝ*p.õP±ßÚ=  ý#vû…׉E‡ZÇLNB·ýíí?¿×A~èk,¶¸Á+eãTÙ –Sƒ¾ë¢û¿æ5,£Ë84¼:9‘¨fvÊkÏTæ(ŒÝ·ø3 |Óä}yē†[1æl«ZӻИ>ÑöÉT­0æî;˜Ó³ýå›t6.úF•ÓÕÀ2Ñð1ܾ‘ ÒOZ4­Ÿªn?Ø ø¹ËÑ畟®¿¸Q°ðìw&—ö´0 êɟó[€„CÂi[ݼïÀTyS;¼Ìì©d¹(±\À =œ”¿ŠŸ¯fí×UõjŸìµ”½?íOBS©§Q‹ÅµœÒ‹-ÔøÀ’Ъ,ð‚_kËzÌ¢RP3<ë±ô趒Š“„»Ø¡ð>øÍ>´Ô¦ä“ÞŒ’~ΘLˆÅ.SkHÔÕϙ¶^G­‹Y«˜òUnž‚v‡h©Ö9Å"dx«k؋$¸›¿ÏÉ-ÁUâ‚Nk·³ ab”ì +ú•ì+çëçT%~9((æ,wR8=ó®7#5Aãp= Ӈ#}ŸgÖkô_ßay¥"Nìï尟=j<è®­×ì§2G"p§Ðf·žíú)ü¥oÎ<$õÚ ‹N@gX€ÓE–˜ÞÑdðáP²Vè$þ..î0G œH‘ TÁXTÆ Á4­ãÊ•ÎÃb×è}ì©O:dÖÚÌÏ..ŸûQt[ïcؚýõ½IÛõS&ˆÜvÒÃø"Š9bÞî[ý/NÑ0ð Ûœ K•îªÊ-›\{|' žÄ6cyÞª[\_¾%åíʯÊxwÞøæ³Ø…¯oZ$땝0sÏé:´­]¾í3¬ þí“U–t7ƒµáûP™tæ,†@òD Òkò«Êu Ö3ó—Ñ‹ŸÞqÆ¿ðGÎäÄ.;ª4–’|+‡½G1Ð‘ÙM¶;»{àð_ê¢Gœ‹5Šy`y<6í0$b¼å„¶ƒT(^\ÌcG¸ÎýŠé#VT·~.nná&UD˜=‡g‡lU‹¥`Ë×Ú ÌaWéfz¡¿ãÈ­€³0¼€˜:TSð£&-9û1*"»» +×Õ7v††,`ã£8òæ˜ ŠÀ®^ +¿Ì֚¤ÚÎ86pºP áPê^j$ìh^óÍl•Ôz™lýC¡¾oB=H`ì*°~ÎÒL4fû‡Ø#-ò3n ’žÚå ?Bjd‹DØ¿Qú‚ ¬9ÀjÄÍ%ã®]ùÔy¶™€ûdöÙæm™È©~+:œð)5ˆÇV ZŠ'œæ àôu®Ïqù”t̙ +Àã•Á1£ãv“ãê‚j¿÷)2kVÁ³ò]Ýßh +ê tO»Œì©úh%Í ­ºÆŒt V¾þ¾e/îõ ü2ÝùFœ8쀪†åŠõÑÑHA‹ÙÈ[¯,$²>UѾ~=jÔñ$¸É͚_äTBl65´ë ¦Pô‡›R&ºÂë$sr'Ñüæ3èZ—êGMÜØ#Š9‘˜úíõœaŸË5Êï'¼Ÿ.â3µ/r= å‰0ÉX-“ıkqH[yÈ_ +¤CÑ>íÑÂeLƒ—: ò«ª6?%4õ¨¦·%&è…Ýð}i]{ÞÃ¥Å:Q­u²²›¶?vÇ~,…Gë›~òj³}§‚®ªX½«ž­Ÿˆ@:^|C6]IýE„;Ê-Zþ"è?q"º‘’ay×,ÛJ÷«.bB¨¡ú•[?»ZSÃØô}zÓû=nµUÈnÄÕ´uÏ^ÒêN‘ÊMÿì¼¢(»¡2¡Òh ,ޔL[uŸ´¿Ê•‰ã]÷ÎmX½'}Ôޗ«ìê…-<ý‰–$“¢J'ý3,Îpùˆ»yäÖzòE̾ªŽä·r¾,ræ`Bð…¸Èçm Ó’Ô‡`ÀQûg䎽HÕÃÎ=õ‰!ÁŸšzz  îhyL<àuålóŒÑ4×êX¡Tä }›úÝ÷wšÏ3þ⚠žÐ¥«“ó[SAãR´–UzI!äé( +Ë ѱôK^y¹œ#ä…cï\aò·38yžì†H»úÙwkŠörèþ„ZH²z%°žz‹òG\ToR¥ÓºÝ|›•¡c:óXÇï*GYH'åKF¦Ì_†-ßï;Õè‡qÄMŒ„|Àë2́•Ffc[ùi²i¯Wø0뀸Ý(9xU®ïˆšB*öéÚRÄ»†å“kõ¿bä赧ž3+ªˆ£Áfk—’­­Ð—’OiÈ®z³ØÜ!ÒÇÜ®Î؊Œ +˜85\ÞÐ.]a0Œ¢CiAë­ý Ë5z랝›MÝ¥¾5« ;žxM ÿ†z¦­©Ã†’”5¦Ô2 ;ý¸§u’ÕAÜßR³¤òM\'ÍP´I–¡hÓ¢µUJ;WUï¡;öÕê-êÈÀ‰ÝÁáH˜'ä¯X8š¼ÿ5h8’DÐ(¼æwtý©'M´Åf›çn1ÿxO!ªEˆíkÅ/,v¼^1û“Ua¥@–œ÷<]²sç8„:¢S(Ån§£Š`ÿ­%“‰ŽÌßü ßüX5ÏÕ¯¡bšVpÁ— +{éÞí!´ñ3õ{Lví¹‡©iYs^Lze„üëA%s”´ ð&»v)>‘Â؅~ úëk”›/ðÄüç’W ½¢Ý^…xwé•*Û$#¡ƒÿüÁ`]A²å3§0º¶#ºyë™ \ϗ¦¶a +;ЂÑs9wÅ?p~âæºQz Òó~6gBo*$¤¬y°ž4ÖS¢ÓÇõä)Ё¼ç80½ûÅOUØqE¶BÕ¼/žHo—e&Ȏ);/Ã*mÞH\1Q¡šÂZo·f¶9`ðüXŒý®sR(”kŽz?5þ=Þ„Žr¨È¥”XàˆñZü¶Rݙ?]øwö7¦«÷â®  ³[u£»0‘)a&»š +Ç-¯(sò™@Äug6hn–ÓŒ›/Áá³k~º6Æ'†vž8@âT±J’ØÅ¥ž­ÖÉÔ1xo±ÃχS¾ª\fþð½ªÃ3PB‹J¬)æÍÛ[)Ñç–Kæÿ˜Ãkèò Ù`ä*0Jó”§öEÏC>(;ÅërÜ€ÓŒ:Çã]ï†lÚ¿£­ÿ$þÓÓËT@c;àÊ¢¶·1­×Q.S¤óôèå®8í¯˜˜h~TÎV·Y@ÄÁBüžõœê‹!ft?ž1ƺCqZ{ì§Ú´ždoö¨EcTêÎU‘d±´ÕÞ;º¥)Ì´æmñÛoå3硡߆‘ö)gâHˆäp.ùl1ôžjGV@¿rî쏫©ä+鯿ð<ʶê‘=©Êãã—Ш¢õQ$|a¼™èý̃R¥4ð;'˜}Ìó¾g)+ìžAÃTxˆ¾%Û²PÂÒFIÙ$9¯gœ!eۖ^ur*ºôõ°<·e³»1‰ðª×54!-˜Ð~Üï¦q}¨Eîwå™ÿ @¬‚̉AE'ì}‰*èŒöËÉÚلïÍ »'ôNmëœÅèm³n+½€Ö¢Ëz¿}„‚qI3Íã܇-$ѵ§—rÞF« ‰qÉ©X8@M}—Ӂñ”2à•÷ùñ"ÙqÉr9O^ÆüÞ=ÞªèÙCóôA\ ®¸ZDî¡ åAÂÒ$){’²¤–Õö¹ÆPÚ[5ÃñªqŽ?tëý±[•?ˆÉ;Y&6q%Ν}ô‹ý¥ë“'új}2×­,éTç.kF§¶ˆ ÿ’¤ë^½3kt5­%(ÚG›È©‹%;ÛÅQˆÉ­X®æõ%¤, ,W¤ —"±¾—Ð̇šÔ/£÷)bÆÔ Þ©rX2Ü2ˆôƒÊé5iêídÏÑȾ+Aª-¸ªzæpÒqâ˘Â}›ˆ ›1¦åk <@ò¢í­UÙ|Ï»¡ oÓ'dÏ·Úh}²œ$ñ"bѥ϶Ò^óGöX>•‚ÿ¥ht¡+ŽY¾Jãڙaá§Ö| :%ü}0“¼*Ì쓃ëûž…Ä:× £¦ô ™×¯3üŒ$¶:§Þ¥ž;ÊéR^£n gd,Œ/¿,¾ã:î†WÇÆz瓼s÷GéŽàŒò矈‘Xد,Åq^i6%°ё?O|ýͪÔÚúµ}s\ƒ××{úú”Tò5¦ìù¤^¬ÞA\èŒü`fB‹Ü¼ÇÈäÊ-Yˆß{¥kÃufÝ#§eþ^QÛÍ 9ÔjÔpP‚?M,µxIÜRV«Øº¬[³šúG“¡ÑŽ%ÔqR°CòZ„a„p‘<ìˆî»‰Ù+ø'¢œ­æ‚^¿ój +¶O‹Ñe÷4¨;SÃRÓ1± z'lê±IA;O<¦™~„>ÈîÖÁ²“Ü8w_$¦…†p¬š‡k³7yÜ,>|¦Yëßð¸ÎEòýw¥'ü4Ó#>-\œ.Œ % “_ä:Õßˌý©Ä¸EöÛ/õÕ¬9NoCä±;7±#¿ê·›¥è.7¥ôŒùrmÿžá*Hv’î]§JgÖ9ì<Â~N¿Ë‰6 uÉ@¸+p0Ú"•IZËV*\n¯,n½ ìVgÔۃØþ(©ù§Ðžú®ü)”¯¨ºGœ»³³+GŽARG€RükQójK|ÀbG—ã;Üf×>te€õaO+N֞Cé]ã†gÿàL :$ëòD ª`0=„þEBÈÒBÈ@q·•Ú¬¦æ]zë(õ­Á(PÄÚîšìÛLßräUçX‚<¼ýg‡ôCí%ÆëdÔ¡^Ρu\ÅùžËɺ¾£XÈjô•ð4 ¸Z›ê1Œ< 6w¤Ï0v)×œ®1¿“×=£Ö«Â÷†&ÊÙ'ˆ'¬`±/b é>ë]èXýÖKQª<ªq’,YÉð˜/tˆF€zþ…RͅóNC›9aMõ¹áÏÃ~ÍÏ +7Ýx‘¦_‘e Ä*XˆÒ Áª=jxt³G]€w¡Rî‡gšNРñ…Í„WÎ=þX(=hÏ:—-Î%)Ì^ý¾™P!¨…,,+îÇé÷{U„~¾ëò›º¦‚§~œñ*Ò«s›® Œ ÷åEÒ9^Æ2 +¡W‰Pê킝µt4g\ˆ|6B¾+”",»ëàyž¾´éê»ÈÅ·@Ì¢¥1»º–!$3D¼Í‰ÁU/–¬=$É_x&žfæ “X³©9¬X#ãIÒÚûûªù^N +¿$™‚kÆk…}þpno¾!_¡¸¶téq )›ËV¨“UºoúW¿³’µ¨¹ÍŸ!® G“/ô_Mµ)mïáN¢c€¤ßã<åúUg¼·åÿf¸¯1íÈJ•Fv좧ŠÝIòN»vxþÂEß +3!Šeå2h \r BŠö˜ª@}]–8Ç^Uõ™Ñ`Öfã£Ú“ÆLƒÏtc03æá“7¦ߔY¾²Oõ„38¨°ô÷üØÃR˜.c?ä'ÿ]ZÈÿUõ—ÀßÉTÔº!:%PY])ï'Ç +Gʶ"逋ù\„©oDaVcÔŒ×uÙ³O’†¼g³Ž´Ý‡\׈zn] /•Í}­ŠEj}9upõ9¦"8üî´»È-`~ë°9©ÞâÙÕ²Cb Gð)œfՎáAžótyt?+øk="0íVÚ'¨·zGø[ͅª'M´Þé¼êjÑO}bÑö‡1ã¥c´÷¸$>¸#‡p¿£Ö&ç¨1æñæL“ä ;hì=rè$ä:üuzçµk0é«Åz>žÚmÊ·Åü™t2¦¦4ªr p}šÉC†¯ U5àBëVx°°”dø!¶nx´°!F×¹ˆ]à2TÞ΢eÓª*zù[ªÌt²ïyBDh1G=¡9á ”LÑ>'CˆÙóQOS0Ë{ðoý˜†ÆZGîï,Ö(8é }.lG?f:`ËLYœéàėÔÔ~‘o[ÜS)yÁ¯Cp‘ļëٟ±.²}¿)¶6³"ŠÅµ]vo’OýÔ9üÔÿnf2ƒ¶°™ñ¶"€Œ-žÅÒÚã}ùü:c[}ƒ:Ôîgìïq×2"\ê"qô¢Äƒã²·¾ÖöFÆòuVÅ'%2žÄûvæ0'ÉK­x2 +gÎ]ÐÒÙ«xsÍx°†wNێS,A-‚«ïݗg ɱO?æö݋*üe}¿›™ +4LðuPèd—Ž#ˆ€Ç+F*A>þвiHM^ÝUóT:s2eL.3[q¡¦¥fÝ Á’ec-ÓmFs OM”óSDå(OÒÀz×½”Ïî°öo rŒEaÞØñٚºwBʼûjz¬ [ø¯ó1#FR°K[Ç èBÔ|”™¿Ê€¯.„83lWÖ6b é¸÷6Œ…â‚®•Ô,*<7Êò_5W†Ú›ë íîÀâ¤lÒR +¯ó¥™òB.t6·yójÕ3:Š£ã}‚H-oÊb*Ó¶ÊÅ'´Pm4»1¨Šv±j:¹|I®ï¦©˜Èƒbí¯»EHÓÈ ä`•t—|r‡è>$GÞh­Ñ,A4”î„DS ӝEnÚ(þÁó~µežYF\š]žL¶ +%{‚Ð"‰˜Y!Ý9®u¬®8ۋ̲'hGh-ˆÃõ ø^î==¶DáE—mȞ~3´³l«1Y[õZ—o4&z©rº7"U.¼¡?,ÐöH’‹ã7ßêxR€a†™(\›ç/âR~°Ý4àԎ쩢4ÐRÄ{ї‹ããm[ޗo(…zï>ô-H5äf•†×Lu>ÆZ‹½ Ä ­ü·éÝ'èmöh ×¨x m¢¨ö[ylHI.@ù”`‘b„åOù´lïõä‹Ú­Qè…» L]‰%¢7gA¦8Ɠ÷¨¼Œ£YôÅÀÈÞvìKªçu¶RíÆWæV¸xZM`Ìoï_ßzzãó\ÞãÒ~½]ƒÉ£wÄ-_* ©÷Òp¥éËT¹RVÕÕ*fúˆVÕVEÑl~rË!hú»@/‚I«Äî^By~ÒAŒ;PØ7$ś€¬óú6”l¬µ‡FÙ«´ý V®€Ö±`ˆá‚î–dͽÿ¢<-amÓCÍ)Њ°ðaY˜©êD-„Sߔo‚5"hpta|ÙPãÁ§—“xöÄX•B•”̼ä»mP%x¶ç-„ë +rê<ܘ@c0©t3”ê$>*ŽSÍ''©@™<¼<~|í!5\jLgzÂdþ-ÁÁ9‰êSº6ÞcߎÒocÝ?´¼u;,¬~©Þ õ¬ãŒYMãŠ~òïèLÑÞÖ"DЗXIƒñ óaSTà2º„ònd[±³r:ëÉrØx ƒó|ô»U’ +ÎÂÔö¶ `°Gp²ÕÇ©nzÓ+ƒÁIç^¿æÇñ`ÀD Ù·U…¶Ën@U9v.JS†›… ]ÁânÅpÉ Ý5[ÒfÔg×cÜ(D|e)[=Zì jÖ¿à+b¢q̕œ…_KVI +ÿ® +ÍáÂd•‚N;«uAôÄðýͱ˜QŸ À¤ß|9·ÞÑö+æÍùç‘UÜèFÇx.½¹ ¿ôô˜ÅMmï^UA«Ákqm3aÜ.û…æ½!:¶ˆ¢ +c¨Œbö^ûH‹9ÉåLÓyÁ…€Ht¡dÁ')°à˦þV™ÀJ²«xñpîzÛE$I%tg³Ìcڅð¸Ùþtnp™°á¦ƒÑX¥—2{¬-Y„366r"•zÿweÈêO<¤V|~|ÚW&ÚG¿„sºNg¥™W¨}’½XœòpA¼rÔø ^ó }ŠVF¹G*MDE$É®õ^ MâʝžYMþ8·?€[ç ?pÛ蓪Å>تb4ÄôÑÚ.,(N‹‰ÁETâ0.ÎEአ®ß%ï%ó»-×çõýYð%aà1–´¦û‡Ä‚)Â^ mu +Ç]`$úãè¸$³ž3’ÃkûòßÄ«û)¼7‡úŸËYm‚R¢Àì¶Ë{4H÷SÑâ;â[e:&õxW¬\Züˆ¶…AhKu>óŠÙyÇeõ°]Qˆ! dókÕ÷K 5V‚$G|'ƒh ·Â?«ò]«Àæ¤}Cð:Š‡qsË>«X*CÏåªÒÀ(o,gÁÓu«ìÇ+¡Ïú|Aˤºcy¶Qx[;/é•6D[ý—/@ÃÞð­‡5¯l}wþÌa‡>‹Ÿ?·ÁxÅnR†å2Áaˆ5Ôá$€^“§W|Œ'V•ý +ۛöD’ÄÌx…q><ú„;ê©d°E„/±¦w87)DA3ž×40gK2¹¥ÂU!D4i>³y²Ýþä-Fc"'åÜrÚ #v×cQOÍÀÅB|Ȭ\xMâÚÇò™ê´)’„q¿£ëî¦WšCÞÁÏÄj‹öG&ÞDñ05a<єÃ~uª©ãÙàÒS…m¨Ì?¤âè·:‰fç„;nm15&¨Úiœ¹ÉÎS-ymÞÔçÞ°ˆmìšsŠ*qÒò_Bî…Û;‘>fS5F0ÉuûÚ-PݓÑyY¥4‰À™Ê%Puƒ!¯¬¤`%ËísÓ]wžvûΣÅncöŠa!CÞA©ñ?ó¶Pã"š¨¾±X_äµ2-%*3‹¯nÓ÷®(ˆ§@¾Œ'~‰·x0ÈòŽx]¡ÆX1Kº“/¤àRhñáa#=-YшHžLA˜ƒiù¹ãí§AÎ`CÓ„¾Å\Ñ;±6®HjG„ÜpÀ؄Š†å±~Ã\¨ÜwK þ–ëÇeHª¬™\oØ0»Òž9‡¯*Œ  ™±Ø˜oÉڝC“­Ü ù–¬ÿÎ+­ö¬m(dAゾl_‚·a„‰XITï42IýT¥çfº˜¶˜ô¯ð—P;¨ò+¢P:Ð8¢Üytè¨=¡eýqöÆoQç +/TШhÎ|GoÖqì§ÅW4ºå!À’“'…˜¾MNûöª'Ü;Ó+^¼ò î%Ê4‹þJûæ2G T©v-Ýã]œ«­›­ì_ÎyØb¡|tôMw"¯¡yl‡× I&4¹À ·üp#hð«¯®öfpŒNŠ¯vÎÞ®ƒ·)¯Ï°´?ᩜŸUæÚ$“2½­e¢Ùp¥ñ¤d¬ÌãÛE[š­›ÒØcœ}f×ìñÌ'´ûAà’C x­«¢^¶™È÷ l&§¾t~D7\r–ž Ú@’ˆF’´?ö¹CžÀœvÝïðÕYƒßo˜xS‚Ö°0¿ù¸9ÿ†0óÆ WYSÚ7³qnŸßлùý³ä(GÒ]EÞM‚\Åðvv±Ò«§½eH­AWæX¸¹O53|Ø ù¡ºÕB>ê€\$ð%Ùò‚ ÜàˆùׁUÝ4°^ÑO~Žþ0v‹÷ƒ”qB­:[Jb­ø?|õð¥ØëcséIpgugB ¦#PáÆ+kÚÅÄ<*<ºô›~ˆ´¸\…ü)/[C}~+¤iÛ{™|íÉ«ÀX…øämGèç“2­GPï5–s(¸ª©–èqí^½Žºd&˧ çv§Yü ÃئY¶ôX}õ•tÐ*Ïäò$GX ¶ Ħm+w dø*®žÿ²­œï8¹ç%÷Ñqc}ZDÉ,¥oK+%rDÅî¿woµOšGÞ·;1Võžw”N¦Â>ŒoÒú= VÂnÍp©’Æ␨âÀx%P§!RPÈ[4¨?Ña—øÒ¸C|Tò8? owÇh/Â-\rV*r\T6½}—È4X·ËèlMÚ9RYM.¯ ·7Uøz2b›¨4í4Í©Ë3ø Ø9 +Cp œšêÓ7M¶ªßMò4´3ç¹K9àeÍè=…î~ŒæÀÛK} '+¬­hOVKEi8¡±m ¼,¦õüàúÇ_’%÷©®‰åígv ¤Â[\ü6†Šð(¿ïMKE¨ç¾öýëFýKƪj+dˆíé–^ʅ +©ID1@Í# šW÷í¯• ´–>þøƒu‚¾ºDS€P}Ûi¸ÚhRÔKmV«þô 帗¤|³ò~ú„¹›…›¤¥¬I;Rö5W!`‰•mççmOØÔÑ¢Îüõo¼×Á&k¼²÷9²§¾æ5ym!sWðë ²f¿p±\(ÁGD[ ÝÛ q/93­Ãz¯ØõG•ªxžj˜yäç79Õiàì>)‚4;¶ÐH™3c¢;‡Ë5êË{;PÞþ¶³ËӜW/ý‰®æ§×ôÐ2'«Ý3xÚRáC?ÐûÞ4+…tLqò>b‰À!K‘¿‡ÚÖmº•þØbd<ÿ½%âO‰¤ÓE-çCŽK^…÷!ù–ÖAìÌ)ÌÔhÙ¹îï#¡ãérkìúȤç™õ;­o>֟Îñ¥N/Vû¢wšfÂ÷i÷¦¿F¸4#šÇl–nø‹Í©‡.ÆX*¾à%ÅCµIô³TEºÙ§P/¯e„IÓNj~µ­Ôüæfït0ÃÑÿÖj¾”˽¸+t“¨hoPçaär9ú~A+K€.lØX)¤}5aQÓP¯1¦[ µ§”õf*"Rªj;Yìm¬6Ž +šÞ2 lÅé"ŒXÀx†‡*iS Í×Éïª.ÂAZ‡xŽJ |Ş—Q5ƒA GÆÉЇ%}Z+W%uTƒ{ñˆŽûɾb‡BLeüHêlìý¼†pRÊVuBMzp–,".*MÓW«Å+ŸƒËjLA»qtɤT]ÐI°¸(z>ÚÐ9ޓmÝXþ½ÍÞട¡õ®u“‹ê~؇åÒ;๽Lãʨ ¶Ãƒ©Ïã›ä›çHÑÇL¦Y«ÆE¡e(ç°dgKùcb²Ð›rÏF¾K©©Ú Rc¯"/¡¾ d¸qŸ7×ßaAmP/ÎNÌ_%›QŸ4LvDã|Ï?NöÄ(¦Â>/FÂ[õÇìüX™Î¶ xþÐ"õs°#)‘à8@Ø°'ÜÜ9•;Ë=Ÿ¨ªƒÉ2çÕ l€ã÷  ôdY "Ó6"{©‘‰QÊ»«˜¾tê[ÏÜ ©´’±~!8KÄ2ÚӚß®oF4.õÓrg€rûeŽê6=7_sóÕæGa æê{´P¡ìo¨ŠB$‚ٝ?y¶E‚¤1ôÜýŸ?H´ý!ï6RÈf«Ùîb,c~¼Ÿ’K:$åPRáÆV”‡žRrŠv8Åe¿¬<@ЃïÍc %Åíᑠ‘5ØZYm¼Bb¡²¨eÁ¹±`iœ¤8¢­.jÁ÷u+†’¤Ù€¸V­ÙŠ¨Œ| /)Ó°†˜eY±#6-tÊx %ŠWÔyω‚Ãúgév(]ö8†P\îÔÙÿ¹d:~›a%ÌöijfƒC Çw„?£ÇÁùé²/ùª«]„B6áÁ›/÷Â4–™i÷¥R#]O.žìeK´Á@Ì ÷ðl³ŽI4h²Ê,é8‘ †j +Áÿ‚îCG†‡koLú+lMUƒû0´®û®$oxØon[C™¾Š¸ERk{ï×2¡®ñtõ.‚âóÀh8iۅ±@'^(È#”UÑ&×xáH¢‰´áIŒmSCá} ©6SµØ“î-E‹™U¸ö…,†ÌpPwW¨%Ÿª*|*/ÞkÉÆ-0k˜J‰¾t×LÂÖDŽrëæ0ìþ ìïÎy5žL‚ÌÆá¿rйƒµ“d¥/œã¡ElqZW -sÈüÔµ<†4{(ì­kZŸ&ÓD˜ßu—Iœßw—ºšïc¦“HèdgHmmÕâè“`ûݺûœ¨’?g,¸(÷ñòSU)Y¹3»/ÿ ÚZþ´[ûQôk™×Gqè§ú2ћ˜(Òê*«:ÿ½MY}¿«³“.oýÓíl†(#â3íc°†$oFß²±ƒÚ¸ãé÷ X­˜— [nÀ¡ß]üæ˙ðlC%ݖº…b\÷Î͂Q^F%|2-Æ¿L¼­©÷¢¬„ÑÆÚ~úÏ?{ÓÿYÚè6 ‚“qO[© [=€Ò»;¬rÔc…é#–¼6>5c¦Ñf ê¾£‰–Ù ÷:Ò,Œ¬ßxÍÐ5#Õ>Sš@j‘ppiâd½ßpb‡JTyø³!| hÚJÃQR¹QÈÅí×Rìš`‘½©Ì­cŽÔ³ó~«Rlڔ´13RDT?ceÆdþZ_“oó ƒ–àØpý¦ªáþP6Á¹t"±P`Iÿ ’ØûöŠw<ôæÌ=£9†%ôù´ü•Çpº8 °Ð-ÚiI4d\”žGu—E®=ùÓ÷›Š•!uÇAæsRBÞÄÀ›¥ï¦ÁÚÍÈF[án% 孌g–Ñû~ϐ?ˆµê­;q‡mW„3•ª(iuìeÝ38P¡Ü´«öºeŽ”¥—E'£•åÃÊå÷z†lOû k5÷ç`£ü—Vƒ-ì ÖRžQ½Ýv® ²gHÝÊÕTµ™¢>eÈwéN!N/JéÐ$OnÏ>¾ô«Ñ‰béì•ÒsØÀ±_ógÊPõ͙˜½ yú–Wø'Ãçü …iíÍ(à†ˆ­z¸ %p ¤xv©;ò7VBF†¦åb`oˆÄçø¡|-V‡s(ê¡ÈoÜ©!E«¸×mt­0R?p.äÉyè¯;ÀΘp¥ ªGGûuýd®ñ|hïu1‡/—á0©ûÜ»Êí΍"¦¢SD”AÕ£j‡pÔiÍÖ ®Ø½3FÀ@lJãøöy ZjœÆ±ÓrK½¬Ó¦©íž‚XAéÅöcy̝)ÞKÜ´)äöýÐÙ«%~áDìÄ*À““”7Ì(ddÂ÷åÉs?‡ 4%Š*ːÍt  üùL–Ú&ñme’¤±.”ã¼°BR_ éÄá÷ü«¾MÝÂïLŽFϛPc)˜ZHîÐp¦èlZÀH â×ܙîèqçÇ'³$4W™{ZÆ)Ì^ŽÈZæOD«w…ò+Ì&`|Á÷ÀK‘œDíáByςÉӉЮõ^ª$¸©²Ñ°€òšBRábÌòÁý¾ô RUŸGõÃJ Ü7Sç2¥ª$èçÜñ œ-+ì& ï6²§3 f֕«çí£I4¼;T'>q7ûPJñ²c­”f±hE_ØÜ`èå ò?÷ ãgI?^Tûñ–˜O9©s<Îá~, ‰¯¼mw¤ä"Z7[˜†v³ñ_HÌ°¿…$ŠÚ{Ñ÷]'0 ¨Ksoå2„íƒ)qéK Ñö˜Kz*ö?'„´ÙNO£Õ|,¸&p/ÊÐ;©ÎpDx”.E¹°eWŽŒçÖ¶£xo[µK7f‘´:ÍÝçzáý>ÌÞfmýzô“ƒºÞ%¦@Øñ`Z8‰ß˜9‚EЅÈbSèmWÓ»ìýô¾rÜøm1ôäPgô«/nƒ}áð†X"¦‹œ^m÷h=Ã¥YãÚ5=©YöŽU§#ûØ^kë;b{9£|Ûg *½l«¿KJ’Ä\5p\ÕXÍFЛ É<*ÝÙc¶^A˜upÛBKÍ«+ø‹¡”fÆo]i…͆Tyf«(ÄÒfÚ1¨R@) mpðËÒVhsyF;vÙYvúµB>´²L”¤Î•ô£ï…۝üvhÂH‚<ô—:aeg7n†z7«•¾ÁxŒ“€#²X9Ü@²¦Ÿÿ¬"´½¥%žx­rYm˜ŽFRŒf|¸QÊüG´©iÏ"g4í› ÅPÍWëôЖ“¿2©²±Ûáõa³ÉÄ À_sØÈÀJž +³ÝÀq‚Û«ÿ܊ú( Ÿ8ù1•YG­¼8¦,¥ÓñÜÐqú}¼ybAvh®±ü>nùtÏÛy{Ô¢Ìó’ ìnŒÊ<°Îœ\¸Ó®4äÃÇ¢¼Âzæ¬ð5_ia'T:HRð݁i²|ÔâN}nW85qʓ?½ey" /§-o‰6;!)ÚÕፉK2âW¶›ŽTÕ`ínè³PÚcüýþÁ"Žú[½öϒÁm¸"ï&8Ø18ÃE0lŠ ­­²€-wõ<Ð9L ØQØ •GwƒTÑY8½“W|zêV»0VMI¸£B¯ëFoÏÉú(š$|DXž]9¿n®’ C!„K´n¢‚ã‚ñ>gvñ³J­×M·Øy#åë2 ©ú(ûKpíÍ5PÏ}UN˜»’/<-M¾7¥$Á¦y«’e¹c!£…ñy® w|;éKÀ« +bÐa‡þ'œÜûR®¹ýDùόÝèî¢n™êéÏÆ%­A„ç­ŸÒ:<µ,™ø L¡[È"܊i» ¾ÙíÅmlVýycˆ71B¬]{«þvM'ç/+4è"JZö û€W¶²¶ÄRÕY %±ÑôN•0àŒG8±ñ=R§ÛeúÓZzÑ~Í<ÿÇ°°Ž9é×Ï҅(ìRæâ¥J 2'¾Nxüâ[OfPR钩YÂV`­ôo|n(˜ÿ'bûúL9¢â;ËÝû­BÁ®dÖËI3Ó|>]¼ª +5œ{Vã2à'݌á°Q`Ɖœ*jxC]& Hžokôص`,ëÚvX¹–›š‘.½ÓÎïì@Ÿ<·I¿)( ‘Æí‡&^áôT¹sˆ€Š€¡V?x0 Zå矹ê|c·T»¿EÑù…y!¶ë_í”ë:·†%õƺ|·þv%´QQ,é–ý†’ú ’F5?—P¸‡·)¹jÓîQ)òÆ>V@•»´­UßhÂa3ÎóV!@ÚS +(ï/ÜULÆÕ}®ÖÖí`¶zÞÞ`~$äu KN|í[ra\»Óƒƒâ»üêbjmƒÑÌYWѶ +¬ôó¡¼³¸DÜ<÷§Eĉ4$ÑGßÊE2{bj´<˜WÒ~åéø*©0•GۜÔ4ù‰Î#Á눨½T9â: æôüÆ¢lKí¹ìQ"Y7ƒ^„?vר¹ÿڞ6Rի醁¦k¢’*åýùâ·þv_ uæŠÆA¶Ó ×'<(Ý帯òuÂl³÷hHéx™hÌ("/!oÕÈÓ{Ïý¤ð9 Ïð­P +qQEU¿ŠØPÄTh¥˜×ðÕîPæ!þU‚ÀÃÀP² +òžD§öÌi·•?ýÂSLQ=‘Ó4 U,âàüDë·|Æ ašÁóO/ Ùæ3Ûña´£¾â+wæêAÛ̙ЍÃ^¼­‚n%^Þ׊R›Ò¬¶¡,Ó b@XŸ©àb/ߒ „£‡$åàˆÐõ“ûʙ9O+sn:˜.¶™]çáŒÍ$)óí³ò'8i̧‡¹˜³ÄnëÑF­jMKƒà%’Sâ€[SQlÅO a£ÊH' (\éÚæ½ ӋäH<š'þT‘lŠˆ*cµYèñ'"ëðóõnÈØiy6Ê4^RÉi/ÚS´ºdóîrÃ2d¤æuÕC£–±¢7F3¢ûÆê1øq +ÏG­Y¸®8ûoR3‘š%gf̸rãÒ «Í•†¼ëm!± \{«tØ xë^™ŽŠÄ­A…”‹"¡¢¶ððk±|_ñ»^ {j‘rb4À/ÉøO›4Jã§t]ò’á¬F°o¢hÂ¥% ƒóL3pÚ@mÜɉoI¥Á•bûXi–Aol¦Bñž:G»·M>ìMKÊFm,ý}A4k5ªyðf銫s0&ÿ:ÓßJdSIzšÝnä6ÄS˜VG‡®s9%8ã—NZ²W«Ò#áæâPƒÙ7ûÁ“õXÉÞ俨up ýìÄ.sÐÎg¤\_JŠyYȎã(࣠+endstream +endobj +2541 0 obj << +/Type /FontDescriptor +/FontName /KMUOGT+NimbusRomNo9L-Medi +/Flags 4 +/FontBBox [-168 -341 1000 960] +/Ascent 690 +/CapHeight 690 +/Descent -209 +/ItalicAngle 0 +/StemV 140 +/XHeight 461 +/CharSet (/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/a/ampersand/b/c/colon/comma/d/e/eight/endash/f/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/period/q/quoteright/r/s/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) +/FontFile 2540 0 R +>> endobj +2542 0 obj << +/Length1 1642 +/Length2 13793 +/Length3 0 +/Length 14651 +/Filter /FlateDecode +>> +stream +xÚ­µcx¥m³-t’ŽmÛF‡¤cÛÆL2£Û¶mvØqǶíŽm›§ßï;k­}­söŸ½×9¯ç®Q5ªêõÔCIª¨Â(l +2ˆƒlY™XxIä6ÆÎŽÊ y,£À(åddMòㄣ¤q9A¶¢FN^ €)‰(À„„„•‡‡Ž’Ddçî4·p"¡QSÖ ¥§gø/Ë?.$ÆîÿütšÛ’Pý}pXƒìl¶N)þU' ‰Ð@"¢ ¨%%/AB#!¯F"°8ümBÑÙØhB" 4Ø:hIÌ@$Öÿ>˜€lMÿ´æÈô—KؑĈÄÑ`üp3Øý1Øl€ŽŽŸI€Ž$æF¶NïÀ D´5±v6ý§€¿v3п +²sýõ°ù‹ý%S9:9š8íœHþfUÿwNFNÿävþ…I@f=MA&Îÿ´ô/ì/Í_ÔÉhëHâpsú'—1€Äèhgmäþ7÷_2;à¿ÊpvښÿW $s#Sk€£ã_š¿ÜÿÜÎõIò¿todggíþ¯hп¼þ³ “#Àڌ Ž•íoN§¿¹Í¶pÌÿ̋”­ˆ„•åßvSg»ÿÀ\ÿº šf†öoF¦ [kwS€³<ÈéoJšÿ3•™þçDþøDàÿyÿïÄýïý//ñÿíûüߩŝ­­ålþÀ¿÷ ÉßEcdKòwאȒü³lœmHþÙ7@“ÿO¤‘ ÐÚýûß½5ÿ.úÈÚô¿cÿæ¶5ÿ«#+'û¿Í@Gq ÀTèdbAbfdý÷âþeW³58Xmþ×Ýþ baùo˜ªÐÄÊö%8ÿ lMÿ{5ûWùÌjrZêb’ôÿ›Mû/gÅ¿á¤ên ù3iȁLÿóðՏ 7OF¶¿¥0²³qððp‘ðpqxÿÿdýëåŒœ€n$:,L,,¬$ÿÿã÷_'½ÿF#fk2ýg„TœŒlMÿNÝþMœþŠý¯Eð·ñÿ8ÿkþ7€ ÜÊ"Ȅ/È2-3Ý©;wp\T§·›r0Ø®¤^µ¨À¯ +Ô囶ÅSaøVÌÔ0ÉûÑâ¾pb÷¾'M·?܍eMݕ¸È'ð&§í)@]§jûF¿À¬_‚˜~ªåy9/»ùE›‹E}{\IYÿç4ád»Ã×ËGZ?r—? Š;$“ÔºXÌv”0´šÂ“SªÄ£Çêþ‘¡Á®k¨ž=|úœXXJ>—/ˆT‘~ö9ø‚Újž1„zŽ /s*»u˽§É¸Z¸T²âd»x¸+x•oZ’¦ ›óm£B9uÒ³ØT}ʧ &þ5Ód^Ç9Ã/òËØz^B¨¶X:B\OEÑBvI1*ôM!"‹y •Ft&™ÖIgäü?%{•í2W†‘‘¢ö¢nž%Ì6“}ab-ïJöI„!ü‘MãCø̟›¦åÝæŒ\N[rÜ ‚Èt鎩ß?ú«­9!Åè²âZʅWÕÝ%² .£ÈTŒ·g‡ŒHêP–ë-s2ý&\ÃO´¶pŠtø¡~ʬ>±€4ÿ™x2·¯!¡ˆ½ñŸ\òÎK”)Ö2>ÖèDùÓô¦( +Îè­¨úoê7ß[vRæ)ÕI¾©¥Hö +ìD‹Ç ’?ð£|%¸Ø=í@i>l¨­Çn¬C5KS¥r~ÂÛóºÅ#¾††S̀fÂTakMûq ùTéJ¾ª­Y¥M®¶`ʼn(s=.öëoT91lc¶­ôÅÏ|÷h#¦MóñlqKiýS¿¥²SÀDPì¼dï¾QP07G„ ìü uñuÊxcÔþáןμˆ0è𢨠+đ!&ˆ7á9\1m_Ð:qÑÃòˆfÎpx¦_yƒ¾8±EH*§_lÆéi+Ì·ÚFäpçRX|þþZ‚Ü6U “Ýá)n‘—Tn¼(=Y.Lé§h˜Ãi=‹¨ÌÚÀ1a÷JëEɈï½d¡½äkcß5º¼ñ§vïš`òýº¾a¶†DÁŅڡXp…ÛAû?^– ºBÐLbøø·Áë«eߤ5ùx@Cn‚±eî;*Éï¡åï"^$"“Œ G»®´¥Ô¢½ìWS™Äp#×rxs×öËlçÈßmʒh‰÷Qz&dæáç¾Bé|,}ˆÅ¯kúÅAÖÌP±h7©Ô¿]1È©y‚ÅxˆÉÔÖ9#5XLkúd +ŒJяջeɔi荷ôZå>ÏE$[)vx€¸뛇ý/…ï´ÂCûSàďe3þ1Bn'ÞQc;§E&ðJÔxujfD´&QÄ¡ÛÞKS¸‘ôÏ::24E¤7¥zÿ'qÈ´öeu-½öR ¢5jŒ k§p•ªÑCÿ7‹HA%%G`i¡õ²Cœæ£¢„D5c±‚eùâ HxšYÓ$ÂmÞ#‹š‹ ÄÇ¥m¸§ÿ¥Q0ñ£ªø¥(mZÏ1æ ßX4M+8D:[¬´Ã²ë»ƒМ¤xiÕm¸¨Kù‘_œ†Ô×ü¾roQæ½ò×g†Q©†ƒ«Øfk>)ÈV„š!<‚ü_MYå•CÄ Þ<ù[‘A|Sµ²XŽ _”LŠmV©¼Õ=ס;ˆ+ԐF²+«'Œ´(ëaÓ46ŵÀWôckŸx¡ó7¸ +i¬Çrv³ˆŠgÅ1]bŸij€=›)f:µÛM»õìÜ/lŠƒ5žÁê70ƒFº¹¾ª>´2Û@Ƅ1³oû&óˆòáw¬eü¬LEæ, b„ú‰y(°uŒ…ïlö‰þ‰Ö5®&ÞK­‹ÃS„v-£"þ« “ŠT¸ß.â‘U¯‘”¹(4N4÷Çq9oÒÈ\/î˜`¹xŠzØ®¯½Âƒ s§2œ•R‚Ü®6ÎödIöæ— ]Šmá‰â†óÏeôᛨÇý•°«âÄ' 7¹"ÉÅeChbhԏ·”é_H¿˜>„ŽÕºÊPIå¤Ì§íÀI¹n½®þ±ñÒ· Q&Ä ³‹m¾ÅŸ¿¬ÛÆ3–ì—m“~"¶ßõ±DІ}?‹ærëùPY–I·+¹e´¿•;D¼•ºàN§ê‡Öbõøbu¿’÷ӇŽAýZ‹ø¨4Sö ƒzÛTÈ»Á}$îùsëçȬªkùZ¨õ]°j*D_ÝБ$ùˆçǁV¡jÔ*\5–¡`înÒ´Å#q±Ç’¨^Õú¶"u׬¡É¦B­&;ìÀqynU£š!º´_ÛÁ­Å꺤Qþ‰ä¿G b^\[µiHnj‹}‘ôê°K¬K‰Á “‰õ!Îò”jå[“hf*¤ÊœŽ!¬÷«w{¢+~ÒH(é ²@‡„¦«ÏútQw%ú> +YwQb°¿ÍMÁqõ6¬©û¾T±w¤CoïEÁ‹U‹[¡ä’\R2¥x§‘A „0ŸÝ ì#¯íöûÚW§}G­•“ êþjµYëS+ð‰[7•6¾Þì|5áœE¯ŽìëUÆ[v¿xª «¢DáY©·V4Ò¶ $Ì «f|þû5¨­£P?F0Ùþ-¼dSFÇ¡žöÃø;n„ÿx@Þ£½/m± ûä¯'󦙟Üöт–’ÜŸ·ZÄtÌÌÚ5>o¨Ó( ´”ê­E9zº'9 Êf´Þ¿…¡ãEµuá>O1I¬ö¿•†R£Ö·“Ay¥LjÉ{rð…q±fK‚Ï¥>:Õ§Qédº ¡Ki”3i}BBԓéCarcÜ{ŠHšñ»4ìãß¼»ììc1!,0¯‘^—Ô°ÿKY͌Þq[ô½&I˞·(¥™Ü´JDÔ¿üð3›Qùösa¯‚ŒÒÓÏayÊó*Œí…I: þ1åœjê¶×Q(ú»S㙟aÿ;#‰”x‚éµåbt…h,Ýps<{SCó±ÖQ¨WJïé7éëºvԈü_égõ'÷¤6¯Ûðà—εÅU˜²º'֔± +)dzU÷Ÿ‹fæ!Ns1´>³&épBTjSõÖB5u5]bºÃYYžXoì—FU^ôbm„‘}4â÷¯+»?gMBŠÌô®áÂS^–þ¼¦î*÷2ôž“©F¬®C:"å¤×•ØÝ·ô̙>å¢[m¼T"€*œÚ.cÍV +T©=b¶¦îc‚ç¯úƝjUÖpŽ®aYçÅw/öj¿RdïÍGfã5í˜Hõ§ÞÉöËùüюLòB÷¿…bÕÙqÜ_ +{ø¼µi Ä)¿WɪÇI®M–Â/kb+® + 5B¶ñö« |w‘<ˆÓӌÓN¥nÿ%¿³1 ¶è”a#‚ªœHq\«L–ùŽÉ-Å~Ë86Ô˜Üùm‘°½–rW܀UŽÌƒ]uù»HПÊÄ8!¦3¡á·?vˆÿN“ +ëˆq¥— +óíX‘XªÏm§^á ¤©ç²Ž4Ÿ~!QN$Räð†mßÐ!ga嘕ñlR&[ÛµuÝÏhü~å†xãˆÏ(ÛH(t¤ô‰Q^&¾”aú&äûÔt.Sn¢Eš7ÙÑÌiå“oÈ¡©C;ї/+,ƒÊ&~®“ù +»±bè¬(C¦°yŸµG|ÃA¿˜ÜLoöI uû­ÄµŽ.s¯¿Ó®A+ðÛ9Â[©{däOÀÁ|—E‘e£„¼õÐnw»†– ¤‘°C$‡HYèИåâ©Õt¡KSMãݏӺ®~@0!©„P†çNNôk¼úe/€Ü+‹DŒtÆeç4Ɵ(ÉBÉI$ø3µ~g ꝯ†¯xOTˆ.åþíþÌ)´‰¯Ü\3¸H !›HøM4Ø +{Ќ€ò®Ök­`PŸçÎi&ÈKƒÜ±7ü⦐»<šw»TÿE’8æh8Øê¬!‹Wb +ßÐæv ÞyvÊoÇr%EÍ]ǪaƒE>ˆ0ñåÜ¡f¶ÚT»ºYbmoOFþ¼"“¶žò˜÷ˆÖ{Þóm‹DÀÚ%E¡aþÝÉIå7[™HÚëËTRíÓæ²3OH1URí‰6¶hi¼ÂŸcbɕֽ“SUÔ¾_Ï«ç[ÏÉHF`þ®;0möK(`Õ/í¶¯0q֒8Þ´Å~Ç´Ô­šÊ*-ƒ%Œ+2S…ŠUÄó>ÆþQ%€ûMbç{Û ­³E©i!J2H˜O÷OÊf +FÒ·öð,0_Á@¶r†ñµö«ü,FÍ2—*aµžbÍ!y©]0xƒ|yîà©NÅ\1כìמ£d3/¹#Þ֏¥BQ²dv3f"m‡±5'šº÷Sew®`Ä5ÂäA²í”°@_©n…n›YÀz­24ðPãbz’ÕhÝZ¥»9B +_®,ŸåÇG-„l{¨¼ÂÊQýõÖЬ¿@PPÊ pDçAËÃ-ŠHf_ oØ"ÁÒ¹÷v‚“†ˆÈ.Ë/×Z,‹È˜­“¾^‡¤ô°=ŠÎdÝðžt/¡Wœ˜ù"b°ohˆŠ”üI?žÃ{›4›u¥Óyb()PbÄ~¢; +Œs¿Ì'û½ÔptœO˜|9„¯mmûx†ƒ3ã0]N“"Y ÆðGFzi3J›m›jÃv…zå u'ʈ¨sÌمï*ü‘P¢í0\SM­˜.ՀもJoø>[Š9$ƒ=*ì +;Wy¡oïÊNº˜Z¹¾•<Ïâ:Í£¹Õ´<ýc,Jè¥'¿Ù¤&l®9iLÒzñ ò1÷‰ç™Ð™:óNë;Ë„OA°*LR¡;$£ß’~E‚r3w“‚$KÎ¨` ¯R¼ŒkZÀ€¬ža“¼×K©ÜÔol%~ÙR)7Ií­vEß²®Muï£ïõîô>’“ˆ_†vCé•po¬òÇ^ãän®¾³GXó1غö;^m²D“ÙúÎPüÞÇÂ:»ºÙoVâÈ·‘x¦+x©8&ñ·J3?BQ‘{­¾Ÿ¹kX<~#½÷U,–´DT€ ~åÂ۔yžQf6Ò Í¼Ajhñä=¼[ó2åRQØq!D8êÝbý ›Q’ˆÐ´Š.?×+Çd°f §çy …Á¼M?y2Å‡›–üгŸvãï¾\èűNCŠ¹ £¡ +rGäõ¬> +šzU?e¦ß¦oñsöf¤KæÎBBðGÛðîår¦ç˜ë!)³åÅHß/7‹:Ò ÜêGœó×á f?6òZés`DÏ-鋬³Û¹Ä9ò '§ÉITw2ÙàҞøõPº{SžŠ,æ;Å' ±9£Éñì/ƒ¦leŸ¡+Ø g[H>ëʾ–_äg%—"CùV8çËyT꫱mI®éÖr(øe¸³¦cY–)í˜5òëâ *±!Ì7#7 ü–ÚëT©HÉLÉp €¾7½Éޕwü@Yd}¦Ð¿P ÕøµñƒÐ@‰¦¢ƒÿ¬áL .͂¶5ȂñéS.ó‚N4Dû·ªú}òÓÄï3å$šÛàAWˆå2Ž4¬LsX¢šqÃpÂð,^ׅ”/£4WHŒ™´XÀ€.Wví[-Ú«‘çfö»€Äb̲whÊõUÅ'[¨œU¸o¦« ð&¯mR±vl3¯Dîé̔ªe}^&܇XIL•+jýwBs&­%"ú¦!Ùñ<ˆú(J]B ¸æ.‘vtîûáTÚÑ:”3ɉ]†_÷µj…8_r–ð>%^¦uß[$£‡%QÙ#¤_hþ ¦ 5Q0Ê ]1pû›ÄhÔ` „ãÚ“ZR¨“õaã¨î –Ê‹eä+†¦•¹. +—+ÚTÇñš]{“0ëo¡sñqÁ|‡±Ò”|&F¢ØØê + +—ÙSócœˆ´ä®÷o•ù|·Žìû‹ïyCÜg ªÜ!6a‡á"жav±ÖV»ª‰¸ÍÂþÞ0I³}Æã͑ŸÈó´OIH9õ~´éP· mïÅ8wèÍ75䨣—\¨èé¼}à +—óµäE˜††lùëVݾrRŠð4%ﶰ´/0–aýž§NÒ_Ì© Ò°Q'‰ ¨ÿxÕEåžI¦zÝG½ÛdìbÒ5 QNåH,¯.·ê‹ƒU'"3+“–š òIX±D¨,YÃB•®hÞ¼\E[ÈÞ/Ý)¨^äc uÞmN£üÍ ~è¢QDrWŽÆ'î·¾’ì1šÝÊáçò´§‹'±ÆXÔ¯b}™ýk"R×X¦¢mc–×u f†Ï«‡Ôe7M; k×/CO]›Ðeú0úŠžˆn´ÚάKp ³zŽ„ÓèdFÁM†á²_ê¾Úñ(Ðp°*@Cçõ\kžyÛÇB‚¿+þ8Ãö2*!K1qÓ¸î煱HOf üB +òâR£"Þˆº5ºT}/+XaßÙöª í=fT:EÆÿ Ԏåð"ŠR’÷wUêÁBëvþTD5¤„“,Ì%gˆ£FÄÅJ¢ùô5ËE„J-鶒}3ÃY¿-,ÀÞåZmzóAdJŽq……dD£i3™;0Ž3YdCÛË{ÿÄ2{‘‡âd0¦frH›È<)Ÿ(¶pÍ{?֋•SᭆWɕ"ÃTFÓùÑúd2ocì\%мàäÖ à ½^BÒ=J¤UYL&cˆÒþüÖærš ÷Áš‡I̵ðê wXÀ5k ”©mÊpÐ÷-ôv„z(Þï¸|u]¼ZéŒì"+Pÿ"äO¨|܏™u}"tùÁª‰^-1kÓ¬œzgw¥Ò‹<Û\†P…gÚ¹ÅMíAl|‰Lw¸ŸŸ¥c~UÓ!>ãBh3/òça-•­“/› ² ØÝlûðÐ$C{øE)ƒuH8›5bb¾Ñ,£‚ˆìÜ¥$êíçM°Ft²!¸‘‘i5ÐWwa z*ÓôèÕiþmև ê>|‘–p¼Vot¨ë-¬¥ØCfÅ4‚@qœaäPŒµKNç'å& Ð@¶Æ"¢Š~yvP QñõфI¤~=sïÿY‡s1/•É™`R%v_*dè֕чËrä'g¨Z†ìRÏ¥ðYÎ{ÝC‚û*Èߦ: £‚´[Ø-¾ŸI(Ñ+Q«Ôí§|¼Àœ·°Í‹ƒ;̆tÂô×Ò»!k=-¯§ßÖ´Ëï}|@ŽÓ«H1ö.õ*«ÂÙ'·‚ðÈñªr¡®¦—‹ö±À@`¶*§­8¿5Þ-ÌóRT‚ý—‹Ä¶Å»-wtpܯ©ƒQ XzFóbs[jA<+vI!òʐñsß~ž8½]СD ìPuˆ•‘ö/N{MíΏ¿n¡ÖMÏ »–++F –%£Ô”6}%1ëÊèk´ÉNݨü ͽë;ˆ>)UоTZ¢ +mÑJ‡p|&¨ß‡ÅA&gêÉ×b–½î´_||W)Ô¨–òH€UÇѺ¼)Æl¸,Ú$6Mo_u—îQì“ÜEð҂qbˆ‹ÉQ*ïixÝÛd—ô'è<U–F¨%D +‘óvÒô7Éߌ—)Žê¦n +¤/ÎQ>Àð֋խ…ï)·åW͇ª]¾WÃSU!‘ƒš"¹Uæ1M°ß¹~‡ó¡}þb΍ Ðu”†x­oe|¬i)–ɳÖ]R9R`ùϝä ã«y_,¶Gk»wÉã}µI Å'*Vä‹Ð7d3Ï€…¬z²ö^·r2ñ#0)¥Vêëf8À@ö:¯ªÚ^ +PÜÂÒ% &åD 7ìÛæruaèub§¥Þy Ü·Ça–åÕRR³D;Hgšër ô¼+qª?˜?1b°Á ÙMÜ\ØHÀžàLEf#:=§ª€]á„ǏWúíúê÷ü"ŽGÑÃOq@!©ŽÙ·8;(Êl^™1ü/5Ɖ§è°³F¼ø/×<8ôð•õþ€/´²+YE ÁÊA£Ø4«H’Lž°V‚| ì1­ä½Àۖ`“7Áø\O²>cø-(‘¢Ž?sdðLfÒ%XN‘b Îtúl!šï© ‘uµ›&*nz¶'?+òGóŠGÚšiz#³ãߝ2Àajó‰æÉÏÑôy•`oaÔkÜÀ·×´Oñ‡´`ï-‡è¡t–ý˜OS{—À³²½¶jÏá-k¾¬P³g ˜cxئ[ÝVL?yÞvŒBŸÍßà\»Óao\J8–=4NNz&äE¸&rm¬.Ê>¹ &ޞ»BÕ`òlìí3d±îð!Òh’à¼áOõt:®«¾)ªÏj±Ë+ M¸ Z*­ø)¶&.—PÛå˜Fªäý˜7L´Êüé>H^É%°§(Yó¬CGHs ]¡sÍÏ¥^ vö²z¢¡Þ‘œ5ώ„­à¡©ù^ÓÔøx÷· ¥Õ!¸êð€uœk’Ǖõ3».6‡¢éNcüNÅèî2ÍEœå)¦xÆÎZу){>Á3솆¬â`í²™5¢CÌ1 /¹7JI:ê¼äjy§üQâӝéeæäÆh|¨:¦Xèï`®ð<òf%0Yàžu|„™ØžÿL–)é¹Ïs~üÚ*ªÝ&”úË»ÇfD\œ¢k[ݜ\C¾°¾Lß·ìR7òÑ©Üo6˜]Cãvך ”üô‹™ü;éIÜ￘ÁÈxÅ¥3tYü®v²h*˼,Ñ&Ejè3b¥•¤XÙݤ¾à¬™–½·. ¡±™:6ðö¼Äç’DH¡xN7xç#~2AY(¦ɉ½ÉgےÊìF‡|óyy~á­ ²‹.–>ð£"õÁ˜Š™9˜^´ÀÔ t›¦’Ïv¯J‰­ Eƒ[Ö®ŠhÒQà:6Ð;óÁ€‡óv_ ËÌ"ýÐú–ȇ¢CÒè¼ÜM?\¾WľçÓ꧞ÄH¢j•^…[ ±çïËWE>€QȘ®QæÓH‰+ºO20^Œf~o¥i¶Gď‚¡ó±ËÍ.b¤%^¢‡í 4èÂM§Ôvµ{Hvä7™%ÚcÌπo×z x„=y!8Ñ´ŸÏ;¼™]Jª?©m4ØoÇÆQe3ð¸ßwºï>©DÇùQ+Õiåqn~cAÒÕj֕Lüe,%H”>ø|)`$:àà¦T.šª©VqÔw º W푠(õϤó#®Jqh‹¤BàÖÊßÛ ‘Ôþ,N»pîR50Û¼ïúúxBD_k*ϐ‹ÈFüM{G18[‡‰Gº–vlaQG$3‚É[7!Á¿bk²%?0r…äž ù&obª1¹ü¡J‰1¼òׅV‰«ZÅÝÜqy)S°Êâ¯lùµ)8-D•`îüŽô¯¤ðA¤u÷>^ZÆ&®Ik*å“0Ïg,îçkø§‚$w6o0cz÷°|^6쳦öCµ¿±ºâý0Úª0Cª¯ðZ…®ÎÃ×k.ÌêrñGQ©k¯cg“zuTI'b±`’…À[ÑwÄZKŸ&’ñeOÁ³@~û•· +SvIœ,¤‚ëcÙéŠcY#Ô´u¢1“Ë¯× ª0><¯Êû1ŽÁûžß{¦Gì¾°µ€¡é°Ìê+=EÿÐð@u6ÊáµXzé=d©…iú|¢¬Ù ~K™áx»üä’Ɇò^qµ—•èµ%¸Óü¼’é™É5ìÛSܪ$þzü•t¾¼þŽVz^˜íh¢[ëaÍ¥Žð%ËÄô{ _nø– d¹Ã=љ>®0™ÿ)ÁŸ•¯!,G‚kˆ/|ŠjM—ÜžšÇ4Õ¾F?³¿ÉªÈ‚mÉóJOl„)»9ûnáÉÃÐFG7溩œž¢òÛ(pdY1Ôöh=‡ØLúä[²mÔ£¹sSÁY˜Ô™ÕôvÎpÁö+J•VRË3üÔR(}æÒ}GÒhBÉþ=Ÿ¶îF ®ßNZê54õ^ºu‡XªÏúök÷p: ö{³X‘´!¸œÔú‡öŒÌù5àÍݨ§ë]Ñ'¾Ú¾Èò5^.ôþdî„Åë×ìÅNBF +.[ÞÌ[Ñÿœi çý,藽ý^íL›ä{?º5ÞؘFˆõû§LÜGf”æ?좣ù½ 98¼×HÓ\æÅU²Jh·£pIE—Á´Û|¦æ×ï=?kwy6¨àñ çîíÄÈú÷âxI£‚ñ±¶k}⠑m_‚±, £¹Ø"#Øt"Ÿ:÷TÖ{]ÙÀµ?<QP °ÆsVOY"«^½;ò÷Ã/ÅÎà0¨¢nÍ¥·C©· ô˜æ6ˆ„IW‚QVö7Ñz,rn.ý8èâaè·Ñ†¾€…3âiÊ:Îáï_ÿšï* ug“ÊaªåBEÞè(Q¹Ì±œ öë>']x$­°SVû]ÌÇ }maÅmX.½}ú,f:ˆ&ÄmŸE@g¹j$ªÔXðK:%“òÏ7p´a5TÊÜÿ"j!=r§¡ŸšÏQÔïD;ê*ғ¸yÍôF«µ ÙöU–8·Q0#fu3㟓:}ÃÚt˜Ú +kt³ùåÒ^–ŽjiXqQEȞð£¹ðRQˆô{®>àQn܌_t§[–1¿p);…¡Þ<Œ†‚‚ï0֜œ:“ j”èa%Åèü‚Ÿí…Ü,ÞJòÏ#£æQ$+7ÛÄ DIV£Hø]áõa®Km µ—¬‰S!ãê¶I°üѝ·çk@ø%@žðÜI¶¿{'ƒ²-ʐà9bÍG/2¢ehX3f™âÀ:Íð*4ÚãRæÍL<µf+%kĎHù0ÐÕðR܇°h͂<]p"xÇ7Ì3Ÿ±åD!¸Odõ+\©eÒû­Æq"t:¤íÙ`_÷Þ¤æؓ-î¼jÉ9×ÚWÛ \‡9çg¿C8Å¢ö +’€Ð‹à ÙÏ8¸ö Þ'^£l Å°?›Ú\~nµ™£Ègœ[p¤»j«äë-/¾½ÊÓæ&ú#ÿ–„Ôy þ$PnIš (!“ ;ÜÖӑ|\·qØîe‰ÂŠ5–{_Xz:v€?‡1}›|º¿}Rm3i-—%EõÓL&”5:p|˜½(5òEµ …zv˜-u-°Ý7 +$¬/ò" &¦RÔXØÅhWˆo–Ñ3ʝ•Q!oç}Aȉ DŒPë1–"¯²iNgó¼ço #Ѻú(ÀÌÑýcHg¾«í䐹½ªÚï&sw[×ij>ò§Wû{«JmS\Åmá¨zWw©0¥uÍÞqØyÎN}1ƒ,3ҏ$a,*¶úè Ÿ#ˆ€¼ÄlñMúwb- Æ=åŽkµM·u£ùëü~rRRVW´¼Ö©d>½R5IeÞ”ùî§m¸|¨sº5eœ%˜µA^Ž¾8b¡Ñ0¸ByÞép <­Î®û袏ñÚʏ[n*$ƒÍÒ+Ñ羀÷£¦ØõÎÖùÅuPâ7—ُát{—ÊØ?m²`¢†äё°L GR›TïP’ýŽzr(륝÷V%E—6ȧpWɍ…xÆc_$s è/75Ù;ö%×ÇÇ×í=D,÷í‚bo ÓçIKn)È]Š”£Æe% ÇzÖ8Êx“zÆ… ²mK+y‚Š»Ü$͎£bìB#]à°«+Dˆ-V7f½›fþÐ>\䀷ÄËt‰µ$荠×Lf)o^u4»qò5‹È5¿üYLQ@ßcCöå¥å²W »«dRù·p¶Ä/ߕœ½×¨³þÒBљ§­NyX‹Š—k”¾°ãÙ˜¤9 .£ŒdæõºÉÓ(# ¶‡}MRÌÑyf<,>ÌÙ5œs"øP®CŠ­|Qƒc…þ¨¨Ô Îûð«%t=‡V2´¤4Yz§IòŒ=øÌc¦«´õO]æz‰ðpÿåÖ¸u×~| ó˜Í'¶©¼pÏm-†G”Z}0Á¤àŸ oÒ^LÇ_îÛnÙæ©’Oæ;fÈsógw¼Ç©ÜÑëÍ:;B–¤èôž$†€f–Õ?<í-ÕWóøRxʖšÔFØ1§ñ{6/‡®š7:J¦tF–‹iµ’Jڈ9 Õ}O®çé2íY±›ñ·Ž ¾xQK{¡£#6–!‘Õƒé4D ç ñ·µDóThéâޓ5ýÏ惡Íï°Ø «]§š±\›þ¢Vw¾)Âß_ڕd  r“UͽNØ´%y âÚ0Áº5kn¸ ›–‘猨û&÷‘°gå¶3ÁWìi=<.eœBļõÙI¦c7Øþø‰Þ¼úwé¼e¬Q0/~f?o‡¬I+¬v²p7tO,xǗ·:?<©2VUQúS‰âìåÑÝ«14CÏBá/øs§ ØÒ8×CrËÎvìaIgF{±¸“Ë? Na•éž¦E:a+ {áå{U/Xt€_t=²™Ê¢ ;†’S×È·®ÿÀ]jð穟>ûÆVáX"¨)IË:г[•§yˆO|_·êC=üBÎq@úÇ'áIß­ƒˆÎ6wCir߃ÑóTǂ™µó”ûb×cEͱÁ-«†pºš¼s°ëô^è ­+âÕ^y‰"¨;觙A”VOÁÒÂ+æèÊò°uª¦…5çn=/ZúAꗭ팼%u“j]oc5,xÝ8ªH­Ñî²òÎÌöi¯Ô1m ¨ý[öN :¿kŽog)üÏ3D¦uôL{jô m; eJ•æï LµåÄ;ŽyÕáŒÛtVüMsˆáÃ-9ð”ÕùwÈ9«¦"™{›Ô˜÷¸]M:­)¤³Ý+?9ÍØÆZ€kf°_._W­Ï½§g­"ÑÃØ3Ûinõ°héj«,Š)ê·¤ð«hX=ÙhÑT²†ZÚfٕ’§ÇÞõü Åu*n81HçÒüt:??ø*2GΔ‚¶*¤~ˬL†>´È÷JŽ–«-^C§ÌôDà±ÖLE£™È-7òM¤äGô?#Ĥ’ã‹…cr´[÷•2âÅÅ4Ú sn—ÀŽŸBö¾9Q`†Ö}Tàš«ƒ°h³¡™¨î k+ÑO´‘ó(¯¹6 !‹ëýìéÃn¥ +Œª”0՞¡C„1ŒflœS}”Ëj•tt_Lë”>\Íb€ãO7qGA›Ô„°?rÞÓR+’äï~õJ…=8s?*D ‰.˪õɸÎ5:bZHÆsÄP‘û«úڄVøLæX¶•Þ·V + +Û«;ø=ÖihX蟠ÓÅÅâ+Õ¯õT;Bâ36ԏàáàáùlPJ> endobj +2544 0 obj << +/Length1 1630 +/Length2 19951 +/Length3 0 +/Length 20796 +/Filter /FlateDecode +>> +stream +xÚ¬¶ct¦]·%œ¤b'óŽmÛ¶UqîØVŶmÛ6*Û¶í¤¢¯ž÷íÓ§ÇùºÿtŸ××^˜ sí56‘¢ +‰PÜÎ֙Ž‰ž‘ oacäâ¤lg#oÇ%K§ 4sü•³Á’‘‰8 -ìlE Ü   @h `f0qqqÁ’Dìì=-Ì̝”jÊT44´ÿ)ùÇ`äñš¿žNf¶ò¿?®@k;{ ­ó_ˆÿkG àl˜ZX" +ŠZRòJ y5€Ðèhh Pt1²¶0ÈZm€TS;G€õ¿c;[‹Js¢ÿ‹%ä08ٍ-þºݍöÿ¨hö@G '§¿ÿ '€™£¡­óß8Û,l­]LþIà¯ÜÔî_ Ù;Úýµ°ù«û ¦hçäìdìhaï øUQTüßy:›:ÿÛÉâ¯`gú×ÒÄÎØ埒þ¥û óWëlhaëpº;ÿË0±p²·6ôøû/˜½£Å¿Òpq²°5ûÏ hŽ@3CGk “Ó_˜¿Øÿtç?ëü/ÕÚÛ[{üËÛî_Vÿ3 g' µ)=,óߘÆÎc›YØÂ2ü3+R¶¦v&ÆËM\ìÿCç +tüWƒ(ÿ™ª¿IšØÙZ{L€¦° òvÎC(ÿïX¦ÿï#ù¿âÿ‚ÿ[èý#÷¿rô¿\âÿ×ûü_¡Å]¬­å mþÀ¿w àï’1´üÝ3YÀ?‹ÆÚÐñÿçchcaíñòú¯ÖÀ§û“r6üÛ![³¿Ô0Ò3þ[há$ná4Q´p66˜ZÿíÙ¿äj¶&@Gk [à_nÿÕV#ãÑ©š[[ÙþCÛ¿U@[“ÿZÁ_ºþ•?ƒ–Œ‚¶¬ÍÿfÁþËPñï 8«zØÿÍíT#ggò?ÿÀ Û¹¼è˜Ø9t̜Lïß߄¸˜YþoBþ ˆé?Ïr†ÎŽu32ý«úÿñýçI÷¿ÀˆÙۙü3:*Ά¶&§í +þQ»8:þ%ù_ àoÕÿqþ×܁î@cØÕ%;cž Ë´Ìtç:ÌÜߢ:}Lß~ۗ6ªøÕØõú¦…ípU¼×Ó7Mq¶{,žÙHSŽôaXSô¦¯òñ~’Põ l’wrÐ0è•"¤ŸkDy]/Ènƒk³3ªîN()땼CâOu²8B_?Sù‘¸ø¡‘>Ù#ú§6Ä¢w!7 Öž“'žHÀ]5-õ\ɽª÷LÀ·úÅ¡x7¼¹Œr^Âê¢Ãº8*#³ÞnƒZøîÙ% Æ` ™¼FúvÖAgZí}®‰|’J_ƒ‘é.)VNê`ž¯mÚqã#ÿw›Ç 7nd {oHTȍ\¸“hñ‘_xX*Ô¨-³Ÿæ€voYhä&\]˘i\m˜”ªªušê>P#Ê·gÞ/ÙžG}]ÎÿòÌÖ®á2ó¸Åˉb)ç“lÁ «c¯և1ÓQË*b¤!8A qÊêû@&éU |í#§×š(0@iÛi™ËȦHø(>^\‰yÍîHOQ‘åÊR Ñ« A*ØYþ%£Æ_…çaï,'‘ðõ¶qô&ìî¢vÒ笭îœß´Ö…´WRkW‡‘EL5ŽåÈO¸4†ÅÂE8¾i»€úqI<…ÁÙZr Ê-zeSúÉö i‰h#¢nŒvIw:ѼՐ؃>jlŸ:v@sž»THC äSuõÆ¡ ¨+Ìz‚õ‡ÔZ…\/ìõ“™[gè¡È'Ždèž…÷VûM?c°*çDô֎¼ß%Auúb<%—«Öãwôųàñ—¹u¡ò'êö]ÍaÇaÀŠ`ùQâ Óº-n lÃX-è´0OsÃÄü +õƒ‚  +˜²ôm#^ü;Ùê4Ñ=LÖ¤G-LR¯›´ðìp ښn -¯ôZ(›Ûø˜% ¤WÑ%ãkIØ6> ”à†ˆ +Nµ tÚ­fƒ€ßd"{@V&…ª«Hq’8ڈ_Wç-0'ƒèSB´MÈÝ`FL{ÔY3O&Ë?:]ZY !Wöƒ{*2Zq*÷Ç?µYCü+H $ƨƬDζÈd]æéxšÄFèn4Îõƒ3¯HÖÊhè­Õ¦¥,õÃøåeÿÝ?².òL-X¿Óq+‚­ÛÌÝÀå‘nÂö±µéZڑɜ÷Äñj€­Ìx ‰…R)}­$Šü9F|3´¢o®¼jЂݯštÄ@äó—tÑÔ szZq~ {bÓ·éh|Y¸)=b¯¬<¿{JwÚR*¹iþÉþ +44nYÜ´Ã-üEÕ·¬Í6i«œG?óL÷¼¥yÚlä>°qO±¼Œ–-°•€P†z33¡“ßB¬n„’Hu~¶¹ó×»HdÁ€}ÃPþwO–':ƒÂ¸n×Ó,«Å4ÃG\uü ¥„’wâYmíž¼¬í+SøʘlòãT2S­º/“NÝ8˜¸ÁqÍ,¸qŒøǗÕuœ»<ãîÊÕA™u{Üv…91û&Áç¶U҃oºë:•ü¹ûŒ^»ßpúyÐÂԌñ“ߎÉëÏð<¿„œÄá¤ÀÓ. Q±üÏçðš›æpŒ('`q¿éõ¤ÞYÁibfÎQ*^p§‰ù)•9Sy/õ3 5}÷Oþ†BHh{þ¦N9ªöø^³lG +6ÅFèvà0;€_mä{§Ä¤á¦ÿÊ¢;œ{«æªÎÜ(͝¿ú]få3ÁĄ)]i¯Þy´ê1‘µxpç“ׇMEýô»6š®<çt¬¨1ß*#\í°½‘¶IC7`áÉÑþ;òáìbæ"%˜JU4AV‚ÇëµÍëé\JBáˆ2Æ+“ÿ={ŽÁúœñ#Îù­ .æÌ K=‰6Îq¯ïh?^hDØßR놅…ƒdÝ}` ÔL× ~ÿ7Kêã™Ñ·a(uŽT‘Ȑ³Y‡¼b£ªÓØ/+ˆª›è)†KÌùÀÒÑãâ±sÎî2°# «JÌâÙÃ¥!\c‡ß‹šTb„¼‘ð‹æ*èÏ}³°¹=dòåÈÊtÉ?B6—ÛLáº1Î4jÑë…o©Ø;÷9 Á£HɊu0\Ìr“9u&ˆ˜Dàî©g=Å>ÇÈVU­³®­b‚@ bºc°X9×F¦3õôõ‡SøÁã$H r/ßvÚÞYê/²¹Tږv—Ml‹Ì]ËW[éîµ*uš1ÛK˜"_ݖéVà<sRzú²kÅùG&Gl Öx4{ÞÈU0ªBÀ–Ï‹CÞZ»o¹ÁòfŒ²ÉiS”„ŽÙ"-KËüø:Û¶œém‡ìKýNY ÁõVLô¨®…É„žB6?Rêr +]<Ç”A‘®q+,ä¾U˜ö°‚HÂÚÅö›°r³çЄK|èkY8² ›«MñipEé-=ÕI}ÜçšÛ“˜)­^#ù5­”¬UºD.ÿùYn ~Ø<`ŠB›Nœ¿`9¢òÐ=Æñüé77ç® +J/kß,_Ô~fÁc¥ŽqžŠSñ‰;fêÀQjf8^ðö5U»­·Î×%Úøºp Ž=¶ÇÙ ML†Ý_jÀ™â˜È_:ɦŽÝ鱈¯º' H(Œ¡ ÄÓ ˜udUx"Ð"âÊßÖ$¨«³5p‡OgðGÔÞÝbèCpUòò{ƒ†Ñ„é,ÈüÂ<í{>éá”ìTÔw{ûüXˆI'¿$©®­º*ҍ'v˲Ƣâ™õ?‰Â¦Ø“ìÛ¥åKæüڞß6›ÜY>¾ÂÙînÀc¶L$ª§Öpd]†è0~A&QN>…©% i*ød~{IفýúÒ-rŒ|˜Â(ÛãJ¶j>ž±ÊÇôîòT؏‹LI§f]º ¹JšÑB{1½à=Ò±S€ åUä«oT@ÿÜݗi¹Ñr«ê€S¡äÞÀ“eÔÊón᥻æʋðebÆl\Ü +WUØ䁗#©ƒHVD£X½?×Ñ/à ÍOsCǜIÛcù|û,x£™iÚ/ +¤eŞ×ë>+2âو–C›©«²âe =°ó¯{xŽgÚöà«ÓçÑëI\JDXLÌFcXæšhÏ8Ðm9âÖÎæ]y¸«‘ÆރUB›Ck!ĞïýÏVú¡áâýl½¥Úië¸Hœ¿RíkHÒìþ\öšŠnk(dŒ=hʤ4o֖7æW >Íúöka¸ðŒ §Kù z\¸ó—ÙÜCMª6GÑðw~8 g)e Sìo;"å=aá6]wƦH(ù‹æ2Œ“é‘xÖ¥^ƒBwôÓ®Ab…"Vµ +%oWb wì$ÛÀì‡Í"¼ +bْ&˜‡œúYÛ#ë+k½è˜éÉ£(…Ð[P#—Ï›ÔO~ß(œncMF¿XÖ +5m@G!Ñ\LxgŸé–¤?` t?C7 L&/v ƒÆ‚ŠL]æÁ7ʯ˜_,wáù¼ðâ·Ñ™Çúe\.gœwÂÏoŽœ‰E˜«ï瑊•R7ì{8ÓI))gx¼çÁ³­ +X- mãÕ Þ&î©aš%IÅƲC»6ö=8®ÿŒUÀ]aÿéº`֓<˜T†…@3vuÅA¸ëÃeE15t£&á®é;¼1yYv½=BË Ñ"„ËÝ›²<Ɍc#(¢¨^© ’ìhÂÖcÜKôFÛóÕ÷B=©%Çڀ—vôóÎÜupiaaÌ{§”¿ÇEYnºÏ!yr5M›v[>,Ԛná8‡¤¶¶¹É%âžþÄ+½Í¿ +}hp·kÖS'…à;z4tkké.‚Áô¼b +O€ªIÝ|†ñG&Îã¤JXžßm ’̤N-—ÀŸö¢%g&Z˜·{ó©8a]f&mE¥ýTcm±óHæosʈºúwôfê•Ek<ÃNUý ¤i¯®3ôžÆyáß KävʸW±þ>îf¯;ZìwšõžZ¢~”°ì|~át´çGæDc­¼ àa:o­rƒë³®u“Í,/Ü ‚ØÝ°x/‰‹8Àïm#ê~Oªÿƒv‡s­KÉ5Í:Æs]"‚•­w韑é†íÊ(H¾d7M]ғ·æºžÓ_Š™$ìø3–›d®î,í¥öîpL„Q5ž›; TžäŽD„'Ó¾ú]Fî:ÈfØ>¹½‹œy?ñ¤õ²ªowt†ÓÈ%Gߨ¤sv5à +*!£¦0‚•© —¨iúÖ$¯’f§¶ è¨:EB¤›[íóeӊ˜+]û=Òâ ¨¯ƒ”@TxŠ§dƒÖT4 ~ÝðÊ?j\¯ÙÕб"¦dß3–f…xK¯ˆu@9Œ}a’‰¿÷8þ®òhø ~þ]‹µ ¯°¡¡îc²Àx“1æu”ê•÷”¡☭.Øy0‡Yùœ¬;fÇílù£æƒ£äg ƒôÔûK@õ/²ÀŠNŠdm3¡'ŽÉ­ØæJ74ѺŠ€M=cÄ­?Îù+¥^×`8*æÃ_f~£ +ßgµë?¼£ Q]-y鉶oÀrĊ‡Lc#¡ˆ'-­ß ¬oÀJyhÁP´Øè¿lÌáB½÷Ád9™ûCîÊ]¿ÙËöm6ü¨©iš6 ´kRW çªL¡mßµ$IŒ&6PWÑëрš† qo–·åFæ¡ÿ‚ke´ñöP桾 ÷Ô'HDnjVR,iØÿ  +ªÔ–#’0ÿ½á¦3ahΉž‘ ³ÊûIh[£·à÷f³NJÆm”ßšÖ[Œ iÖjCÌÒò†â¡€a¤:Î=2Ý¢(œfº~ s4Þ!ùž¬WdŠ” [ qÕo㘶ȯ\l.[¡õË»1*¦¬µÀ¢8T‹Óy`î<*ù~ ÍMéô™\ÎÖä¶Nù’•¢ó'¸(ÿ]Ç9Rûþm¿ fŒƒÝ¹¸()¸Dá 1 +"ûnqHžpF#ûï&Y*7*y{ùä–µ®<––nÖàsOwM†vŒïÖÆgë•ÜdnN±jþß5©^Qbe>“JØpËC˜ÿñÌLå/oޙEY=›f(–!æUìçª Ç^ìPáì]ô‹;sôXé#ò†ð ǚúMƚØ,­vdԇ,Ŝ,ƒ×­¨BäµqŸk^Qê¹w±¦ºÜ ßú1°Ù’2ߺÅcvcªì¹GÛ_c¼‰³@ sô'6Ÿ‹q€N0:eà.ýƒZøyx¦Ÿà«§2_B8~☤MAëÂ)³{¢C^#­±ÅQð±§áU ‚ý­Ì¿u9ëݺD†þã܂© Ž¬I~äÝý4˜à-EjÆTRan×َ +‘YDaR½êÆ>òJà4)š{WÈ9SÂBs_‹‚­ÄvߥÇù{ô8¹ʏ‘ËCCê¶ä©¸ì²Y `Ôâ¯A!´+9ßJYŽ–B¼6ª_ ›àõ¥0?/H g}—$7C¿Êo¤o©á•$²Ó̹íRRu‰Û~ŸIj^­U”98Ó:Ë9Óøí¾ÿ‡qò]»MmÑg…C!Õ¢¤Ù%ë°¢¢écã|©2N˜JvC!HÜ,wÂóKç!Îhª8ö‡)N¸ö±JX¼Šé‹Ýã¾Æ;ëëRKDCÐ`)*Ooܜ!0NI'er¶›ö{Jº"o…ì$ï^Ì7C?Ü Ýò°Ð†Áì6iX¹ãଟ…IU¿RM¦P«#~UéÇX­A¸}š,ú³qÁräkÀ7萴J4°ßßX +<„–úYä™×~/;eRÄ8oPc0 +FXÜvÚ]*JZQC,|›T¿Ðew‚ÁNž’Â^Õ²@S‘ +RËø»G1ÑäÊÔNgñâ-ÿ†p† ç’ô!ïL`Y˜<Šøô„¯¬™tÊÊօWljê¡DÑ)}×jRâ]ú€þ–õK¨W֍jìgwÁVQ„Œ8!d;ʼn÷ÑŌwϬ@°Ÿj]Ù6·Z5ÚΫñƒ] $~7 )ÿË°d*"9\V]gò ª[òÓÏ #JõÝo²Ã襐« +eK¾Nè«kökŽ"®kæöÄQ?!첤cœ_dØ«0¾¢qHUòdrîì%”[ôÞ•æ—`6 uQGØ0Û]±­¼³íidŠ¥sŽ~±öÕXû?ª—[˜‘‚ùõK{¯ ìz4Š,â ß7›¸É³´Sùùz µÇ*ß¹>‰DÍ ¼—X ¬†&—c< +ÇkhyrË~¿(Á‰&Çåvfô¬âl†GT#&'?Æ\·E%“hl+5} ýyu¦|±w,“G[jf‡øÍû«–ÒI°?³w•#:&üðí­ZéՕÇ1x}ÂÈé4í|ôçP +Îë2¬YÈI½s1×­!¨(¼¹Ú¥|£tøQc/K8<ãB”»ã+êmPú’/6&)b D· b.îé›]Ÿ°n,‡ìá8ºÒsQ†xU¡Å‹ g·´Xëȇ²†§TÕ:—lg¿uôjnps-V‚b·¸ÞA¯‡ã9D…zJøýEæéY4,xo¿´ÂòÇ>æ>h™¦R.½ú€æAÈ4aè¯ö cKO°¬Ç4¹Wh>ß¼Õ?^Ö6åŸÂ=-áIËXJ?@Ñ {k7¨ÞÐÇú …o3äq»1'ðí§c®§ñ;(¾Öç.Æ~àÅÊ\õ^¸êY>Ä ƒ›—)[¿ÁÌþ’oï4BCy¶dBÈ®ªlê°Jý®äøœ ؆ïyqœ~ϏàH9î™ HI"¶M2{pùQ®µð?Ÿìn—$R`ùƆ`÷K·‘ŽzóÚÏØuÁâÊì6´ÞcˆVp8£fˆeZ|¿ötm‘óª°'à þ­‰VWÎ/ð¶ÜP¼ƒôö§½ÓÍôAÔ>C"Ž6>s®¨gr +ªEP¥&"†LFÏªN+—ní~>º§¸÷rB*1¦Ý?¬ð×ÆÕBÆ`­gÚiÊì߅ WoþC·ªéH+7©ßóT1—e$v_=Knî¦tZ%~˜I,zÕ+<¹ÞâÈè¨KXýÉGûó6¨#~6í¼™¢Ð½Ö»ÜÉ(“ù°K;«ÃӉÁ·d~'oüû̘]—*Îת܆I “ºuÖeQêD]å:5ã‡ñ¸í!ü §'âJ4ãêQê<tÒ%¬D½nÂF‘qو wš —-±á´իٔ¶\²ìfȸ}ÄÜD&R®¥Âa ‚èhÙ›:ÊFNœë‘1>iÜõ]Wý>e3¸ÎÎa{ø>ƒ,‡™Vï'¥‰1òÙ(½¾åÇ.ё©<Þ&§äˆÉ"'҆dƒÒ"bÒْ'œ9ÖÞH}ÑylVõ–­ìîÖ]M,¹ÔíaEž P³T Ý<NÅμ5Š"uPzº¸³öW…\L'ù\q¤|•4?œcxšsá‹^À`Êê^8~ ‚­šÃÂ5Š¹Ç$ƒjðæAû’qwò–î&ZuãcgõÍj2,¶¾É3Ìï/ñVûØ`ÝrëæÓ]r$ÓôU±”Ò3ÖèÆ«ƒF†s_ô_# ÑÂÑO¤Ò„-åñĽáËÕ3x~w ´æu´‚pïiK*IIÑÃì΄9`¢Ÿ0@‡›Ð¡¥åâaò¢©iŽiº­úÓeû4ƒ¡&¢.zǂ•äâjÑø”šÏ(Pw’-Npvž°Q¼T›gY>(/™.š´îkž­wº¢=ú5×VaÙ]6ª.ð>÷íÞHþ”iSZytBô…—3eŒð…<}ïœ_×Å(Ùíû%Ò¦YT¬œ´0¬é“l˳Ğú:ƒë)¼ P²öà°jhD’Ø@³xŸ‹N²K[¦GãŒMÒEê©3™0ù–õrqB°¥Š?Ì17ƒÉu 6¤îWðçÜ$ê,x¤q€ÎVD‡÷Ù)Õ~œGµIÑOŽ|Ä¢²#R*B  ?,÷‘!£Œùö%Ì,±\¶-# oÞ½É6µ'ÁQ¥ˆ7ŽõÉɘÔoqÁíÅ©8³í…ŠaA…]'Qi +šœ)€dMIÓ¡ÜpTx_)¼-¶öY[üºùÁoößÔ!àoe°úlª°Xtš€›aŒ +xx³ÈFcŽ&Iñ¿é4ð iG0ÈÑDãl¸R Ðs­lš¨=ƒ\`Kð¾É ”_nl5Ëí>¢# —>pû°½ ÆE—Ôéúuns›Q ·¼O©É§mŠîð‹™X„#A½ðô•%+ ]‡Ç=ÅÿdüÃþç*í‰øš‰wD›i…ï: ¡ª9ï{Pº|Š0ËÝ^ö>Ä`Sü‹Ûv‡(‘\IäúÛOdŠÖ²Âc76e'Y1N“ÏÇÌ\øE$f7;´Z2*œæ›06ÆïZ™7ۗ2"¼A×BSaš»½2ÁBÊ̌µHÅ_¹ÄÑ ^-ïBœ„Ã&…-Çdua izÈ VçG>ыõ`tÌ î +îòàsñ:v­âw9ÒÚm´¬´£ñ–•&R%º“qÔ.&Pc#Þã™L+ òp-\ >¡Tf‚ËüU¦Ç[©Z¡¸¼öZº¡Wg¦}5n~\sþ"Ã)#?ȟwÖ"¢ÅµRúSl²†ôs$HÛÛúS‘ÁðóœÙ€® ùO¼Š¯Á.—˜­@‡ +҃§ð*I¿ÊsOÿב÷,ám©q2—M²ËƒšÑ`ù–|¯–$§ƒ×E¹ïRä1N)Wè¢ýÝv2¯í¨w§k½ÄT[*›‰Ï®–ˆ<÷“f¬ÄW*që)’\îÌPûé}¾Bæ[ |‰š¸Ów +&Ó<1:È®öŸ"›r_«Ýo ƒ°#ÆiªöºÚFI²œMI2@™°˜wÉé{D±7óá´â'i‘„ü+胀2ä–ocˬ  ŠöŠŽêÙ U6ýӝ¾6ËË/›¡$.¬”wƏß* c¡n0ÁEo¯Cs†E£i{Ÿ1í¶k£k·ó7ÎÄeºY^¤X€¬{Ç>^•óû)éƾëþW¡ôÌ*éNˎú­!ÖWÇG›{ªî6I=®‰´ñ;øqû‚Â鵅­Fr÷:¸o‚4UÎIÀd”´¹3šçtMåb8MW-µÝüT¯¸ˆØºN®§n5áGè‘K™,P±ebç¶à±ÓSæõ·ÙKÚ Pk Ÿ»Vαù”LW¯…¡”–©ÃύÌ<8XSQ#žÌ´5 Âóÿ³¯ymf~üñòÛU(±ó;ÉVg^ϬþZqÏIÕÀ"o½ôÒnÿݘ×P㋾0¦%r¼X-§ýŸ[‡ÂvÕp[:\ØßIJï®:Ï»I“XÂֆÈ-­§}%ž¡5Aˆa¯Y½xøÖ#ì$sŸ~ÝðdváwVbÏÊþó[)ìù¬Oü¤r%$¿¹ÃõlÑL°µ€ú$:3êKz܊ÚàhZ¢ÄW_US–Ï©æÏDšX—‚1l úS€ƒ ¨ÁXû$µSîa”#ã»áe/ñ÷cH‹jÆK¬–æƒåGi’ŽKQØS÷@Ö8ýSef·øЪ–µK﯉‘%w¹ÈÉÕfªP<ö[ìÍ·»ˆ¶H2n¼\PóÐwª`¦`/ßêºmuT¿¢ ò ÇÚµ¿-¤#IjÈÏ{†Ý<þ„ËӃt·kÍ*û&°"aOïçþå{÷º&Þ¢.SÒeìÛÐôÙòÔl×îƒ÷Tç»%G|ÎýÇaVÊ¥A©­r!K1¸ºqµ¸Ž?ŖìJ‰(›³ã¦ÞT&›¬|["çŒ#Ñ-gªØêíàëñø ¹p€Ì~®‡0÷” ÎŒ„×6Ó¾âìl'áìurq¾o’èöØF ƒ;½ª0º(‰ìâïsB¬KåeñX® )>‰Oª_ÜmàXšz³iÄõ¬/AèáŸh6• #{äJ¿8Hˆ¬!8•Šg_»ÿ¼h ©‘TÝî'͹€äO.* ;–,7†10ÝeQ¶ü&CˆÀ㍞EîA[³›]ôŠØk0|‚f.ëùOœo ð“¸Êgèö˜À—¯QK¿ni+ŠiEÄé·ÑtTn"$tª(Íç5B„˜¾(ƒÕ€xÀãáÃêÜü2âICo›oõæJ…UÌn)ÊûªÚ0ØÛk}l­ÆC.•Ë7”ÐÌ ã«Þʬ/á”8lî"熩wúc)«§Ë(B,©ąxµqٍ¬@o½µÊ§%õ"'Zä"š“skâ`Žü´àÀç“ jFDMÂ|Wo'贒%©W\ž„2Of.®‰H{œÊ؈ž?҇Öa3Ávuä˜yµçí¶ÀIó„Í•ÖË[ t(% Nº·<ñZ¼§êŸÂ±Ãˆˆ½q&ýù`Í$™»YÌ(Ô±¬Ã•ýývãf•ðûYWoiˆCh!O–ê_<4ÏXª~Þ!Ð÷qVWBLõ¸4hǾ,æÆPA$“„)ÉR¸Û¸*b¿ä,]4‡²mt^¤ï$ÙCD÷™Ê¢žù;²ÿØùÝâÜPñ´ ®º¨ ÖÎÆÖñÑ·ˆ»‰™¢òùKB?Ý¢ü(Ö 5x!œûcØ×+v ?hÎ>œÁ) +”Í‘0ÌÊV ¯Çèஃ—üè4… _i ¸~ò‡4qöãžH9n èÊÕÆ×'`á¡¡®z  †(Â9o菨ÿm)èÂ͞*EÞKc ƒ€70Ás^ÔC–ª# +@¹ìt¥ÎL5vúöV_m* ŠS2º;Mø‰Ó‡…€(Z§`őg¨€Ï‰æ7ÖÕIÄ)ówe,ôù“QØyŽØóKs$¬wŠ.íQ/Éòdÿ&:ySGÝ,ä-êÑÇ­ÁDAž\õår¨ GÃl«¶;ÅCÜågÑû÷‘âÔ!†µ”Žª¨’¥ñ€W º&fCO‰€¾Þ‚…¾¿©]þ9„×û·2w:{ÿë­ÚŠÜ=tŠìޑ(ѲåïdNÁh@׊ 3Ý[ü™µ°.˶?.éŽÂÜz2ÙÁ†k-ÖÚÔz ŠÓvA²q8‘(3hZZ8µCQD¯¬’QpV¨ß@Ýv«Òʎ‰®rÖz×ñjßP3ñšQŸKåÙ¶ž~§ÆYPLu ïñ}ã nfZ\Y ?«EBkEÇL +§á„¾ï£iɱRAƇ/ãÓÈ9°¤ýl÷"Ó0\j¥J¡‰®ÌÄ[”,^žBÑõiuamcÎpÃI—˜ˆõ4yÃPYÍÔäS¿¢mß:"¹úOóé¡uÐÁRò÷ˆS\"ÿ̽`¬ ›ój9.I̹xAÔÉ°7ß@SÚó:›1š™ÖŠ.¾.éäô¼Ý™q»r½ˆ¬qãG3¾‰ç!÷øt^n˜3ŠS§æo¤f‡âÎÔ9ïj Æ µùñéÍUM2‚gwg¼­¹JÞKÎ&bæiiûa«l§µS"³òïõ6i?bh\Rˆ¼ë-Á>5¸:øÉXí œ*d6Í/²TŒRØZúÎ]ì5´£o/ÂîɝE¶fä°iõáí ½rÒu1V|øšc2ÏÄۀâe*ψ“…¤—ħý‚²·ª3Ûxvi†.a ³Ó§aosç#5*±‡Œ tý ásš¸Eô´C]ZԈ«rƒµ% @ ;ê@s¿ ^Šî’Öï—ÓPš‰¸îí“㖙‘¢ƒ{\Ù~Vÿ¼+²&÷qPu”À=cÛoŒÊපn©fDœ˜Hâ+i¡NsÌU±Y›a式yí×ÆP_€QÖA¤:—£Z®š¡lšH·qTåP>xéo?qÌWïû:T’å7ß±¹W&:™fŒ!†Ë¤'†93£[ZëÒ>ŸKE撳 î¶j:j#dú¡1æóêpî—5Ž×aÊÂWÙ³£°4Nxøâu֗+Ąö|7ðu*úQ}0>³JtƜÖÕÎðïâs¤!AL[“x¾zZôµÇF•eHh¬äÍ'ÖF7/Ÿ‚}¤'4Ché#Ÿ¿*Qܐxù3¬²sÈ2 µ’pJ>j¶çžŸæ{º,òóù»ãGÓȑ™VZ¾„kðÁ±ÑPTFŽ‚zkÿÓ<¬dð+ÊíX"âAIpˆè·9M÷ÁýH“ÉUœT,cPˆL¢›)×X fÜý«ž÷*¤V- k>bï8®µ‡9QÇñ.Ín$÷½Þ˚J p¨6³† Ð,\Q¾«8üÇžU,µÔ6Ããk™Û°Ñê¦fÃqþTÖaÙs÷çÒ©ÉÏ[Ô ö¶h(rC§|á±а 6 –TlJœü»ŽW Ð"«]Čå^³­-HT Âĺj5ßp`aýኲ‰…G·÷~79ªn0 KFžôÏeRåîIqè>­bêš‘C.xå—]7ºáFˆ#‰Ù—ß#p+¤V7@pxýÞ®ß {f•Ô Ù°ôÓJËEö¾]„«ª—Bã+|­P—#( ­ÍÓN̊ñ§ò‹žôãåÑ·¿ýúШ 'ì ?Oéx\»žŒŸÈÆñÙ¶Ý0P_“C ¡®<úènìðL?žd6‘ƒþ²mðÁƒe¨—°+æÍj:À¬A:Ýi"zGdýÔ@X¬b¸¦)²…“vª[]æ€oǬéf9åíë2¦¹Æ{?v+5do|îYrdm,$ßÙÍ9#¾ðDÆÑÃÆ7·jçcÎ3<ܝX®tp5¥cC]aù¿Ãñ¸³*Ev‚?Æ~ÂÞ¦ múî毩¹1ÛûÕü46 ÿÛxõ„`P•é5î‘/::Ǐ²ÎiM„P»¸§™EKpÿÛ@ÌRD Éê %w³e†û;ËRK¿¶ûöø2W¶ÁËó Ð6‡5§l «ºð# ›ô­u%®J¾¹9Óº5AƒÙ€Š¸:¡Zùe)Ӊñ(-½,q£Q5~»ƒ¸FÿbµµXÝmEބ°ªNþë§w4®ØÔlŸGÛ¡“k—7ȼhgßJˆÜÓÜ +uòÞE±jßQâéxÛîwyWQ¢òmÑQ2ÕÌHÞ3þûþ{þ·„þm×Îriªß ³øß~`ñö/mqª”ÁrÐ=ýFO¹­ºØNÅ®Ä7ÂåeÁ²3ÕWÜ%º–ƒ•&r(Hb¡©‚(`JZhcøÔÜ£8cµ+lS#Ñ&G‡Õ(ûð(ÃSh`Œ\%½A­ÁÎQ©¼*-Th+ʃ¯~¤h¶n•Zª<4<¹—î«O®°šù %éRaåi!«šŠ,Ë,ßÄ»ñ ¤ ¢…z2 ÓkHùG±@qó+“ípøÌӜ·ãb嶖ç¾2¿P΁pØln ¾Æt™õ®$ìë=±l™?#¶'ãf¿Î'21î̞ÏÝܶº-êiÀBª$ĵcã’Av³ôôE”šƨ){iZ€v‘k¤{Ä8©è“Fòú<€½…jm5~OOޏðxj"’€z5*"öT +º­À²¶ä’æ FM$Ž.†€0Ê0µD{JRìyL…ýˆ@¹º0à֘ó\ “D§mý„E¹Så¯×[…ŠŽ°Î#·éV½4›i|r¸ÔZ3Óp‘¦Ï‘Ö­`1S•’êÐÝ¿q:ê|ž•¾®<‘1–WSÏҒ¨2’šÈ½Š®¸Í•»»-˜ÛÓ-‘x{÷R¶zñ#[þR½¤ N‹v< íx2“ôGôæMWÒ¯½T,˜ýjš¢“\œ¹œ?]0!Ê𙝻“‚îÂô¶J"o ‚îèÐÓÈ\‹ýctw!Ô˜9À +KËq[™øÒß1àå¼Û;»âÚ̶܇GÅ{óÇv¬#\“ð¼!U8dšHŸú|¸®lsaH~ÎV–ß9J’qDzEñò#_Z ^ÝÈÖÍÁÈñh[âPžQ„F2Ú´í§ˆ×K¡„q@GÓÎ+*sÕ"“A3M¯8ž€†ç£ÞÑÐ5´üÉȖãÅ%Í[/r\¨df|Þ1CfžL<ù5†Ý˜sg +UÑQĉ§3,ºG³/Ò0ÂÌ'"ùÔÿ'y³kÉ5:nZeö™ÂÊ, +öü°›l§rFW©àªãWH(Ó4XÕÕÁg3moµý@šè@»Šlù÷Ÿvaº}õí&1°Aõ]JK‘Ø8ËPŽ’åùÝë Œ•B‡É±Ût» +dÂkÍÏH€¼²ð×|žÔ¥:m”Ä›jÖ9~q­Ýë…??C Ën¬K¼DºôMdˆ.FÈۖ ´ œÌKHe¨¸^{œ,9ºŸ¦ÊcUŸh°Bê†ÑËà9q¹(âš×»bNA Z=Ùݟ?<ˆy +*q)¬<¸§-]o¾³Ýÿr’¿”~¸UØ&ÌÅHF Œk#¤jðԃQû:øbÃ3_^?ic-1ð)IErnÜÉA©:•¼oèû³vÛ5N܏$:ðòrF©5ûxüvëï:Ñ fó3«Eʪ¡¡W&™¥wP.áô÷¯‚ "‰‡M„ëY–›¦Ã›÷èð)»Cxž…²R¤š7ª}l—>'M.2-u i”Om$)¢ |8~ãyõøÃzƒÏ0ç—X‡•=Ü5B•ËÏ›J²R ±Ñið¹(ú{ÇÅOqoP*^Ô¹Ÿ¦©Ú6#q› ÂSüê´=1 ¿ ó>F»ñ’eÆ>Åê4@‹I¶OÇ÷Üûlû½ÓTmW/ÏL= <[辞f=vT£QI±")µfdM>¼F‹rèÖú"í-ª@ʸãnúÕvõï?dN|êb•vA†Om#>‘.ñÔoœ¿#¬”rÎIã +ãçÑv$RÏÈ·¯‡…Vm0&~×*ðLjóWZ:!òbÉ)2¸R¼žÒº0ҘilN ¡^ö!Gó” OË­:±1Qjª'ÖªMAkñ…`´Œö+ÃqrÁ3.µ Mìò¦ef’_NJž`2Ÿ€°kmÖ¼D•Ž©XiCm4(öݯP¤‡Uý˜b`5¡ö“=™lj¬b½TŠOó»©Tl ž•?iôKϵՁ…ÜâØi8¹gãÒÃõ,/Û¼»ÖÌ6äÑJm)Œ3U]ꥱ2z7 ]Üìm5Ǻ»C±b—–ø¦ûŒñÕ Ë8bpÕ1ª ±ÚG×8¸Öw)lRøö‘, +%ìk* 0ÿ-¿©ìÝÛ!¿r|»1´ ?E©hkÕ>qx–‡² `rã‹ü֜Îý=‹ ORW¿CºÇÖî`­F¤ ‡ö¼éÌ\Î16˜Jd'㥐Õ$ŸD¼8Yú¹ʊ@PîɃž0Žbq<ïå$íw'PUM¤´Î½,Éú!½09•†´ ;µ<¾›÷UQ&Ÿ´ùˆ[Ë´Ê»ir8ї’åºJg¤Ô.:xêN#7{¢Ä/ÓÅt,èÛ[KŽàT*¿FÏ·è@ñ J%™_Ù_Á‹aP‡¤7j…}Z—K2f¿æB-éßßǎÄH!€Šq‚3W"¶#‚Ü [œ­s j}Â;+ Óµœ];ÕÐ $?L' }|cL¨”§ ŽÈøÍG…aÄÈAAø£Ç˜b¡&¿O¸r´+Û²D¨@Š¬2šÇìê]:¬@‹ç“S1µB}—2Ü#—(­;ë—ÔäíK‡r°„úG®•kbÔß%Iÿ–þBߛ2ˆšTN%2óìÓàf<7¬±b¤·³Åc•³õq¼Éæí¥>.Á„U¹¨y4ðlQõ1Ú|z.W8ê œËcñyQ)’eÛ£§"ېц; G,µM¸&8#J3¥•AKž­ßþQ·Ü)h5>–’ï@ +í㬭O~ÇÁãR; +ÙMÜÓǏ[ÔRÙ7Ö?QãŠ_Ë Ï!â8eپФCƇ§F!sŸÍºšþ˜S—ŸßÃùTb*¤à=-8ÑÉ]ö*b”?ñå.”í*ºË­Êä–à >o®.ËåÊÎݖtsdÖ+f&öG=†–ÛåV秎$¨hüðìùÓi耿/Þ=BŠ¹§©#O<+ _å¦i>mʔ3]ÕÒÂĤ^>ät¸{ DÔq¡7³"gúDÜû`BÌ¢m)€jÀ{³€ð¹)‘y¬o!»±Œûð H [J î n{=Y¸¹ —Ý–À 1ŋfq…Iõ¾"𳔕HPȬr¢pñÁׇN‡Ì®ˆ‰4—‡kGæÏ!ÓŠ«ÿ¡=·¤ÉXÏ],¢ÁÅ;£2^Ýÿ:Åïñ2ÛÈò{[º¬²/#¢×EÓ?D ÒG¯2Íoº0kä¸Z‰iâ¼<>ô™ó£“LÂÜ îï&ük´Æ.‡DSEš/¿·T4¬´‹›Îݼv ~™Ò¨õÜUc-‰rN V]§vâǘ*Ó…ÎL êç'§á}Þ͹Û3xtª3Üô_¢ÆÞÛ\n!B¤‘WQKÀgNåò¶/}—]mî™9 9A²ëclÉAïð~/Zj[bpÀ¥Ü²s9…,mƸڗÈÑùcVfßV¸0(åìfÀ‹†”€ùÒ~„ÊŽÂjœ•¨Æ™‘Ÿ;WŒV° ¦Ç’Èú/¬'à“Dåý»"No±@l°™ öW…†Ùògå:Ìý@ÊóÑWè}µç;R„±èÐ<ür#G¦I³"Do»¥H.òúcÖ3p¬ûºç€) †%Å#@]dó£ü +Cî/õE¶féýg¦ô¶àªlI—âktßRHp„JyéB‡QÖ×ÑÉ(e{Þ¨U8}å«ëŒ$”[º„Š1€dè™îú’“/=¥b¶Í`1Š[uéí ÍøãMšŽ ÓÖq6s4=w_-EQ Žè¦·“aï/´D“ùn°W;ï뼯v‹sÑ]CTôu~eYi fŸ&I①…²,ý#”J*d>ªð´3îfˆóŸÌ/¢å§ë ´Ü|à8MþépÈ6‚ãO_ÝÔ\¾<˜–æQfßÕ±m}S{ê‡ð(è’k·!¦Lÿ²ÍWŒÓЄ~J(Êå(ÀË™“ÉÞ#u·üÄÐô:Æ{ðÖ#ø |ÁëtöÍJ˞nIì|*‡lNJU‹µ{ÇG+í£v>1ŠUJÏh.¥Û +x⻩¨©ÃaðÆ]cc’ìlϏž¨ƒ[zµöLs5PK p)_Ä®çú0úæòU«~TàT5¿F£ùÄ»0h¥žì\}¨ÆB,¬'^ȶ[žƆԌµµJ©•ò¼‘Û}ô«ÅPt=ÏhšÉóÿ¥L¬!.ÑÎÉ -I¶ÐYÛ¦+G§šŽX„åIæ2YÓÍþ3R#œß;h“ÃǙP#*áÄô:Q•0K§7`½~uêÜôòÔ"¥¸:¢ê µ´­¥=ÁÖDg¿- HÊi®ÛY@!Gþ*ÄË)ù¨Œ`P◬U1$rïeÖ~ß3TñùÕ°åXT¼1©P«Œ8qýÊ)áè:?Ò !«F vy+Úwý{ÀoïC«Uò+®èVëRì…V!Ê>%uÓ! Ñ×àºÙ%8ë辍çvˆØ^« Î¿/LÖïlî …â‹.6ýj¡”)ù6¨6aÕ^w—#(ÅìGWÚ^yoÁ3oD›µžaOØ¿œÙ—€ g›|a~S2›k á“ r!-°`§£ƒŽ.6$Š˜® ÃzöQª;x»(ÕÚ #ÆrÒÉzx|@àùޓ…÷Gú°½çžÈ’§UIÃ3XB‰£?ã~72ëƳÓÇÄ.Ó´6[R›ÿlÒã$è·[¯©°½“’9ƒ¤S^6°?­o+cPw2Jœ]!SQ€d•þò%2T lÞpe»q\qô µ !3Åút|%1¼' +"‹µš• ,Üä ãûÒJ <¼=®FIå¸$°Ò8ƒ„1Ž6 ø.g±ñÖÁñX„_<wPTöµa)ýލy+Ïlý¿+šî¤S5”•2,kc&#QÑúꢰ·Z Ã=âÅ[2覿†aGúàÎñ6ä¦UY—…¤[K䪰Z$hÜàô­6œ‚Aé"ýܑñÝÙÌÁÛ耷ùiÊY>¤k +ìd£F˸îÍòí¢ãõð&‚å©›ÉUÚ F«¬#ÐÈ5ÛñÙMâ9t³YNü5$F¹rVŠƒšuÐÿ?YÁ݁x¬¶ Jo{£(XÚÛ%¿<ùKØZ 1duÂð…¡1€UۍÝ­ 2Aqãg0Šã§EàlÞ^´‚™÷à° +fî0ƒ3!HfŒ{+ÒþÔK»-pص^³:s߄£Í“½£‡ÃXpMty¤ ,Ò +èØ NØHJˆª–Ô{º@ƒÐhÖÚ +þ!OÆÂN¢¥™Hïù #q§õLA¯®?vtŠ2^Q~†]ìã )šR—ò&°ú?x «¾Ò2Ø`vU×Ît’vuw ®WŒ…ð«ÐŒ4kà(«Ã)9JŸp¹D±}Š=`vŒî7Oƒfh tmk9ÉX^ܬŸ¸Íp·3ËٌR»i§œ’JSEÿ\Õ\«±ÂÛ/Ž«*”Cž8v¼“ˆÆzÖ󕷂VUç©öN6ppQÐ w’Â^‹ãZr™{#éch–þŒ˜š;HølIH›š’è„$zuu‘pòööyw­"ÚJŒHw;Ίî[ ¾z\RþZ¥œã$K͕tyJCnÙL’Ne’Ý«®G#Þ ‘•ø› ËHê̦¨/«†äóˆiëVÉô%ÀH®Á@ˆVÅÚËD̝‚2»Ö7Ëç?P,aÖmŒ6DiüW,D¡l£ˆ½Gæ4Ö/o¯rÊ·Þ±§$ûb#Ä·#ǯEWz—JßÅHº½ª6äz]¿­×³cªï\¤Ú(ê0fWz؆$‹—Q]#QìÝ«“k”h§{‡y6ÿ,ÇNkqf²i±t¹N[UËCn¬Œ<Çh½wÜÙí\i%JÁ¢_Á’ŽJ{ÒºÀJ@C ýôëcólüÁTš§ <›xƒ -,ýRšHž¸lÈ_gã‚X±h݇^2.†(Ì +‘7†½ü6tHëéїT_«ÞWì‹ÙGÞÊm?'Áúsœ¾j#a%«>»D—g‡¨%Z’£ãhŸR°ª+{å1Ò¾¨Éü7Èm"d–é{—ØÚ¾åqöw„ÿHx´Qœ¼í$ ¯Æ´æK(gèÕ¹êUElh÷‹§L+)Jƒ‡”ÂcB”ÏÛ°K&‰ŠÓ̄²j°7ézlÔmìicìm(fï<˜c_§‹ýl¿XÝÎÃÖqïf\¦U Ì+ÙÂ9ïù-™:Ó-Mæ…$²…èŠ[ñ‰~ŸuF,Ÿ‚jÄýƏþSJDžzqkåSà ÍcÙ?»ÒMdNöÉôÌëRIˆ\5¿ÝbKÓê+ˆªhf™Y?,[žX0âRŬlì­Oý'p„B±PŒàRlÇ1c$N>îI¦•›€2ÒºšWÅê|¬kÝÊW”Å-Ê MDz8;z9–¾öaQmø¥M<­©}Ou-à д10ªXv ÓõØ +ÍäO‚6õY8ÃE‹Uº}ûôíÐöU£r¤beÍ9°‡@ôÀI6|ÔðS‡ôF7˜Û(µ$K7bÚp£?¡äßxƇ’S…É6U‰írM$.ŒÉڐëKۍºŽ'ëaŒ%Þ¯3 +À$+¥m÷ûà(ü±—~Þ[y:uÍ{h“C¸fÚÍqÓK°š9§¦ß{Ý­ŠøÛÐ}Í2ªY£­X‰ßùNuµd ST2r[îTµJ½b"j?(0õUœ.I™kԌ‘¬Ç'я}û@ÀƒÀ¢YAÏÿ³æ¢ìÿ™b‘‰:`sÕh1 ¼×Lû¾ÑK̵ây¶üÎX©b%Ý×JaTo /ùnó"v.ª1Ų™´‰¡T²<ßݎŒ­fÈUò"Û¢…O »¬Q(jÍur†PÏâûo±­f¿‰“à¾ +IX˙Ò) +»š;Œ{—ÉíY1ýa<¶Ð›Vô:Êøžê˜ØÜ¡1Oª¾ fޗÅïù¸]?“¯@9$÷—XҎgm€=¬ÇzòÂBóۯͺ°áâÒzû¤mû¦[ý—,Ù}™ÒÃGEß.jh»}”Ö2®cÈΔ5É! äÍN¡UÇJ |‹ëUY¦¶¿µ®°y²”¥_XsSW=µä  5ö$~šìI[Ìïx‚r¢Ð^?,Õñ—?â£~»ptRÊÉvbaPR,ìߥÿïÆñN’»Ó"=Ñgâ`1è¾\·3É;Øwý_ô¸< „ÒA %…ÀÓʁçx‹ú–á"R…‚ó›ùÚKӈrà‹tn6ŒeÉ:Ð1)ëˆ €¶0òjÊC ŒžõäªÌŠOË6 ™†ØÓ3ÖÀ+¹XáÏNéJ绳Å<ÃcvñŸ£ŽÜ¾†ÁøÛó>$-™§_l¸ç—ÙMü‹“Fnxl]ûíV¨ß<;KòȞ2:É †Pf·~^²yu{óŸ\wÝp̦­©½Ä(û`| —ö¬ê™AŸ q/},ù‹ ¡’JH—„ŸÄMu|n©&òu˧cKUœ&ïë7RS×EX³yÊ^¡DU”,žNÐPYS!£(º—˜Îñºhüx°@zßÑ'Øí¤¢¯;Wápd®©³”¹H=™Ä#N`ëŽd¨J3p^ÌÅ]Þ8ŒFëáYm[/'c:á@{)&^p³ ^!ä”ÒÒOåLÖßÏåÈLIucÔ÷r¹ùªk­x†Z9ŽA¬Ó“zŨõɾh:ŠOñµ­àÅezÎûŠ–¸l‹_Ša±þÕß#u±;tö¨Q Ý@Kð¤ruÚ˧÷{Œæ,W¿ è æ ü³'R6tXðÉÉ#rÿ«Û`\[>6’—ªHÆBB¿MHŒj‡˜ +êÀj¿Eb^çˆËR΅ø¨Ã Âo©˜_UF[Õ ¢SÇ@Rýè(H’@Ø)îócT” ÃŠoK£ćè?¼› xÊ/¾¨}†˜fuY[ÿwˆ½9#,ʹ@·D‹2‹íºÛزu¼6 ’¬Zʵã¶î×9Gg4"©[˜‹n€kÀ«Ž×AÒrÿHl “peslôސOµzD‰Ö«<;ð‹)-ێÉà„9 ˜m xÎÊ*lôõqÎSs‡ï ü3:f¢æÎ×øŒLgœçó’‚~ +Ók>~T‰?£)§“•äõ»Yç ÷У¶m“§±ÙE–e9£3hœe5«ò`ЭŠ^zÂ7š|"cÞÔ,^î£$¦0SÔ|)`ÂZŠ=8…:B¢Q2ØÈY°ÔuRÁ7oD—u ‡uIM1]Ônþ)ªæßeƒÞ ʖ1¦ŠR‰k@(ˆ8­zÚt~Ņ¡ePâ° +endstream +endobj +2545 0 obj << +/Type /FontDescriptor +/FontName /YKOZLO+NimbusRomNo9L-Regu +/Flags 4 +/FontBBox [-168 -281 1000 924] +/Ascent 678 +/CapHeight 651 +/Descent -216 +/ItalicAngle 0 +/StemV 85 +/XHeight 450 +/CharSet (/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/a/asterisk/at/b/braceleft/braceright/bullet/c/colon/comma/copyright/d/e/eight/endash/f/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/percent/period/plus/q/quotedbl/quotedblleft/quotedblright/quoteleft/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) +/FontFile 2544 0 R +>> endobj +2546 0 obj << +/Length1 1647 +/Length2 15172 +/Length3 0 +/Length 16027 +/Filter /FlateDecode +>> +stream +xÚ­¶c”$\³%\î²Í,Û¶mەU]¶mÛ¶]ÕÝeÛ¶»lt™ÓÏûΝ;ë~ßü™¹?2WžØ'vDœ+ɉ•Té…ÍìM€öv.ôÌ L<K[Wg{[{n9z …«´‹± à/ÆKN.ê4v±´·3vò4f1 )€…ÀÌÍÍ Kµwðt²´øî RWѤ¦¥¥ûOË?W&žÿüõt¶´°Püýá´±w°Ú¹ü¥ø¿vT.߁sK @TQI[ZA@%© Úþ¡äjbci +³4Ú9©æöN›¦övf–ÿ”æÌð—KØ` pvšZþuz˜þè@'[Kgç¿¿–Î 'c;—¿oàb°´3µq5û'¿vsû%äàdÿ÷†í_ì/™’½³‹³©“¥ƒ àoT%1‰çéòÝØåŸØΖa€½ùߛfö¦®ÿ”ô/ì/Í_ÔÅØÒÎàôpù'– `féì`cìù7ö_2'Ë¥áêligñŸÐœ€ÆNf6@gç¿4¹ÿyÿ¬ð¿Uoìà`ãù/oûÝú_9Xº8mÌ`™YþÆ4uùÛÂÒ–ñŸ~‘¶3·03ýÛnæêð˜Ðé_DõOÏPÿMÂØÌÞÎÆ`4‡eT°wù@õ§2ßÈÿ ÿ·üß"ïÿ›¸ÿU£ÿmˆÿ_çù¿RK¸ÚØ(Ûþm€ïÀßEclø»kr€–±àŸ…ciúÿq5¶µ´ñü?9ÿ×ۚÀgý?9ÿ+üïÂv¢gfg`ÿ·ÙÒYÂÒh¦débú`nló÷ñþeW·3:ÙXÚÿŠü¯÷ýëÄÄô_0µï–¦Övÿ¨Áþohgö_kø«Û¿*`•“Q—§ý?lÛ]VúÛ.jž@ÀÿŒ¤)ooö¿ÿP‰ˆØ{¼é™9¸ô,œL‡ñï8r³°ùþÿ„ýóžå]œ,=ºL LL̀¿ßÿñùϓþ¡·3µ7û§T]ŒíÌþ¶Þÿ2ü›º:9ýUü_Ûàoåÿqþׁ@Sصe{SÞ«ŒìL—¬üáI1Ýþ^fðáP‡òfµ’¢€:ûÿŒˆ]îj£÷úP†Ó<ŸmžKg24‡£½˜6”=iÀ«B|_Rê¾"”-ŠNÚà Fƒr„ÌsÍïëE¹&Ã½Ieƒ²w(‚éV'èë'êR·¢t²GD?Óô¦xŒNä ¨ ÅgçÉ'O”ƒc#ÃC=·}x´yñ0ä¼nÑŽyx‚:êÕÞqhòr?«§²†Ù×A3Ùú2Ê_Ú.A¨* ²v!ˆwVϊ;xeåôÉà¤ÞKØ0Ÿò0 WM5ÞùçGm)e°Ë>“"]îÔzlv?†i7 ïv}«Ö¨vZØÔoÿA_š1µ¹`}ç¹ówŒÂ°´ó¶SdtWâ[¥ß¸W÷⛹Õªózº¾´". +µNPúéI{bPôyn›a YFT¶×1ÊÔ"f‰Ôð3£<å#`ÚZ&ÜɹR‰ŽMãðڅю÷0L º0ô\û-¼h^[ˆœ£òUH2`mâ˜Õ_ ;ÊxZ2¹Ì‚¹¨Â#b#«ô Rmºh;®‡4'Ê4RIB@XwpҀ íV§Üô{Jhq9Î;õ(^CNr]ô;*B'aڝv˜.žæÂdù,@üÖ"@¨DØ9aÆP†â¾=£bêƾ NႠ+PÁ±yZ„Û|¯“þv5wëh‚ .gÎ-“›Ž÷ýí…yß¿Ïã<½¯©àÁ¹vm¥·'EHí,ÿ\~­&¥[Ì©7€˜Ç)êÌ×ÅNÛ§ 5ªû&“–)’8BƒXòŠ„G6‹jØÚgk¤AðÜáU¾õ™*]ßO)"‚n”¿-œ…N•´æª8Ï6Ý<”EÑk]íu€¿=©ÝÊæï +@¯¦2èCgHBZpU…³’öÅ©CHxSw‰7>xú^·u¡¥›pí¸UbxMX4Ɍá}.ŸÇ¦G9"œd ¥ú’s•d_ñv·‹ +gžðñ[ªöI>²PÑ +ôŠ—V•j kÖ`îýÖvL‘ǧQ9tMÁ½Yä/•ƒ‘< KÑ©AÓNi-³Ÿ?Ë4r´g5ghb>¨h=; ™¢Œ%­¾´Öð>LçÚ;Yl[¢DÆ¡%CÈOÀ17—C 6ÇuBCpDbûÖ½üEÐÐpú¢­“̄yumCՆ³îûÖ¢Kh*1šê4Û×Ìë²çøÇÅ6!{žözõReÆi’7«‰5\G"hœdìr+n0S™!zȼÍË; ‡eVLmSѸº835¨`pö'ë,غ«=²Hƒ¶ ¸2Êôc§+çÔ¼<aš>¯q°ãH|°b}®4’ǐ÷Weq¤¤û¹éì¼,|ùÜ'T­­Ì~ +J/ +ŸËáL· +¡L´VÒE‰ã]ç¡Ê°=}ík+yàãÇòdI’šþ»´n#ßaŠk/¸@,ùoÞý>;ð^1­ £ãI¨‘ö¨””*¸K„{«ÍýGMàèˆTìoé_²Cùyf®Ö²†Ä8Mº3ՔTYÉ͘„5¬F†_#³(돗¸»G%<^Ô¿=Áùdj°p ÂÉ}Ï£ˆÌ"ÇA1"㑸>ȧÁŸ„Æ,ßWߍBËlCp·gÙân*Dgoôö<ÑcûP‚kwy°ƒ›0o×£WîàX–Š@PjuVWÊvRI?ž~‡Ælô3qÊ«šÞÔ6Pîþfž @¡Í׈Λ'_[Ά)°ãW€\›ªE¨cö%V” 1ʓƒ·F)½ªŒó…îáŒô£³Xp"’!j^mÙÄC1„V¨ðê²£LЈ9Õ22O&YãhuWst~( ¨eüÞ¤¿ûݔ¥¡µØ—R‰Ø®•åâ±f};àm8™ë>®æ‚xf@q$"«KÉý +;Ù Å-¨(ã>ðכ¾Ð|Îkg¼ZLì|¨–©«k@g­ÿXi¥èT]óêRÙf&åì6£Q<¹l%®ˆDôŒvOVéù.ŝŽüÛYq{kªÍ¶ê‚Õ‘6•&¯A¤Ý: Àëhë¨Ø’¼‡êÉï¡qo™_)œž2±œÉ~Ð!ôÄ@WTªÅŠŽYBà¹õ¦®"Cµ\A±\Y¸¨wÅû{Œm4iTVÀ+,êÅ­¨Ûé‘ç—ú¥iÞºÞf®UÒÁ#ñV, (ýú#>)ý7Ù?ÝÐ{Ôd²8ƒ4£ ìË ¨éâéÀ9{ÐfÑjQÉ2¾Ÿ·â³–’ÊäFŸþSm¿–ÄÜzvš&6DäÜ~]úR_¥ã‡‘ué¨À¾™FTa*Ýo2æM²™¸½ÐuEɋ!Õ%©{øMQð _w—’sH;Èñ€Éý“cGœ y·9¡C}Ár¥çhOõÖoϾ"H8êdÚ¼ïÛ||òò¢ìLNu„k[ ±ÎBtš/GõhoNÆÊI©£]R-Ã)B÷ŸpíA$¬hèÌ(ß©˜©ù0°‚Q^凛¼pµƒˆq«:*!<ƒdNRpÚg ¾¾¸v³Ð8ßþïÁâoAœ LŽwĚ1Š(Ž& ÔÄø·mVë)~õ>PŠßúMì;"E³‘—rhí/ÆÈ 7ɋ]ò ºV$ÏÄ-TFjÒm+~‘¬§2YƐ!ëdœÐïxI»Y\`À•!•”¦ä†îG>ÑÌ ,ߪ‡ë `ŒAz…÷@§Ë&䮏p/NᥒK9Ä-Kº»h?L½²ôrB°hó™p‹à”ÜPPÄ=¡­_’Š#ÊÿVu5՗ô z܈ŒU]ùå¸v?³þfõòØÏNø•[iP¨‰õŠÃ4ÞXÆ~ú~ÒþïPq(7œÙ™wiWIÄv÷u‰£Ž‰ gÇR“¿ãà³³ÐzZå!c€fÌIiÁfé Ù£í~ù¢‘©3ןãc<º;0sώB\· ޫҏùþ ԟkRt@íM!_ëV RÊf®YEÖj×Ñ;0Òe:ÐÇnƦ$Ç:’#£Mù@ÄdFÀChÀáv?S%éK ø¨F´ë4²ÙÝ%£YpQžç—©Šy™ æÕoh?39®s± ñ:ﰎ¨îÞ°ÔõAÊtÖÛ±ær4Ìdm«¯í0 sK1‹Kj S°Jg+𑇠ùÀt{Ô;ªÀRÚÇHV–=n÷J{öœ> FÏç´~fš;ÒAV­ã}$S½¬G¹“0Û àÆè’5áØÅõÔܦâ¡æ8ù·}øx…ô!’ÑÁÿ†€Eı‡”hSPq¤D„S  ¤ÓE¢£kªúÀ“©Â]#¯y_L!ôaÏ·6ˆ1Û¦\tÖfÏçAdBçPÒO1ñͲhšµØ÷”¾gr8Õ¹;ŸïïbñvV ˜÷F£š&Oôëà\'Í®ØÀV[¬7ÚØ]&An ʐ/™§bS«h¯t…e/ú[É$m°Ý÷í&þ¢¾ff۝P­$*½¤s`2‡Œåüpø=àßpg\‚Mû€ïM¼ù7ÈF=ª U“˜+'d&úáîâu£êÔñhd°,ú:µ1„"‰ˆ'’ŸßǏ32< ‹6J&‰<Åß˃õ%ÁŸiRißÅȀ¨‰¬XTaÐAT4ÀÈ»JuÁ*žO)ÌbÃìÎüˆ^Ï>°ðóÎaU¶¸v¥úa|7D¤÷'õGی>g~:ïòÇOíÒ-íDŽ¸4œµâÔ\5œ5áà( -‰˜å‹bPcé¾Æâæ¸ÄŠ ‡£géØnQì…A¸ÛËϞÉ ûu{ÑÝ)Çò3ÌSC¥bXÆWŒ¢ÏNtÖáo&èë¶Õ¤¡BVD ùJßìH:í~BJ}%Š¼ åï$ó–§Ðî꺄Y!£/©ÎÊÈnÕåοãtkNàCä¢`YþxSÂRð‹ReÈs]òÒQi’‰Ã0ÁŠµ bÉ4*d«Åj›ÉKž.'Ý‹\m"Sæch°bYpºÇîºÓì)Òì!¬'ßÀÊޅgwSïÁ4„Ù{ äHY ‹>ѬÔN¿'Û +í8ӊ}¿½ßdžå¨Ê‘€·€;Üû¯Y9¸•Â¯ñ΁>:;e7Gq(Ž­l¨7ÐA]Fýü†„Ì7°,ƒó2b¥<ÓCß}]Ï[m”mWº›S‚´DÏ up,Ÿ§¿Q¿i“”qjg´æêÚÊX%îl5ŽÌÃ6åwrÙý ‡ ÛU<ŒmÉ4¶cÆU¶Íˆ®÷B‡Ñ â´ª€46ú)žkêÓ ]¤±Î[Åái„ЄY%å 2ÕÙªÂKe퉋uN,`ˆÓ®Û[À¼G^Æq³ M;ƒ—¡¿²fZp°œœa,äh³ !ÌLáKËXˆˆ¯Ðkþ gK¬Ÿ9ŒǗSôt«tÒ¾tÂwl´ü¹„œ³nbÚÛúæ˜òjâã6Ëqod°LVá’^§½›­Ëí‚ð÷§©¡÷Ac#Ϊ÷‚èãðÐÿ0Z Ä Öá9 ê£ •ÅE_nŸËÝÞrŒŠ® ¡š®c­Ð‡Z~ jÏݚ“‰ßoŞ˘cÛ`¹‚ŠóieDÐ{Ìw*È@“x$‡<­]…~ÂöTÿBª}J>œc֙éÅ,I¹ˆ`‚#jînïútåúó¶Î}:¿¼ˆ½v4RXî¨ÇÒyQ<Ÿð¢t'|ҝ~Íܾªèja ¼ë·ä-¿]sf2Û­[7jë.f¸Á ªwDIÅ)¾…s‘ŽOڀy[²Z·½ä2›‚ ¾6ã¹ÖJþ©²+Õ7ñ¨ÀåT`þ&ˆí†pÓWÍÏSÌWÀ„ÖHêÓÔ .֞:<àí0¼ð~ú2ŸP‡øbºÒ‰ÒŽrðƒ}C£‚ Wêô³›w1WÅÙKvz®xØ9ž.÷ (%³e ÌvÃÙ؍¿âq1uFè2JGˆcQ ùé 2_Rƒ1ŸgÚ)O1-Å Ú5iVbk¼|2qª«ùiÃeí¼[¦~œÍÍB¹Œ/…²Úð„(‚ÑêsªÇ}ÇðÃE¢õ„æO + Š.(F@Ä´ôFç -¾§Ýîín‹úNó º§2,L%–;¤9$òaҐÅux^ÚúJæú½œÄ%(‹QÛ *àrE¬uQ\\ívt)¾ùAçWôn϶ȑTÚ¤«ßbðó>¦GˆšlµkvÔÆÌYXÅajhåF#îºmjÓµ*åŸf•5´½•CH­ +=4Xž\ˆu+§ü¬ò÷­"ËÑ5Ow,n…aD­ANâ,Ís¤¢½'HNRí§Uk‘±n\t>ó2ȕ-Ê"%Ïv”‡=š /‹«Xp¥ž³„K'Ö§›øW‚àm]nkùa,¤]Ý Ž˜öB܈žn¯yí³{&PÔ·ZfǬÜcý̆%©M¢§ôpRˆ í*7‰«aÍ°æñ–T—'åÛ¢^¸NHáÏÖ ±eDmr™¥Âæ7HóldŠq=JxG» rÚæy~B€çþæ>5ý˜ Õõݓr4²0ënÙ¢· G™—ÄGVÞ¾zƶ9Yì©-ÕgäOýäÀ¶ñƒôƒ˜~ݒ¹e"ÙNê@ ^„ÀÞ¦v§þ*¬ê´•0½%N–ÈuC­õ+ú˜æ»Ìé sËÒÎçìî·£‘†/³¥Kæ¥ÚíF»”'s {ûxN%@}2ۄ5¿ióï7šö™¾„çÚñ‘Êžø7ñ°cñÌôô>‘³FŠÕ-“qFäC³sE¿rŸN²ÏÖÂl¾ÑSVÄE!H´h"B”ÑfÃL}j]v²ß€Þ7%À!ì¹îû†ºb•>’¼ëps¸²"ɏÙ¤R[ñOšã)?F%ªua'+X]…”ƒe@̞ +€IÖÖă§Ê^D8pò 2†zG°_ÐÃxSFf–kÊ/ÎvpL”€^¤)Á׏§|tNf‹Ÿ@kËyÌpÂÔH{¯Ç®p 2˕iáÀ²Ë× p‰ðaZ")­‘>Vö•ån*&'BbহÞNMH(‰³N‰)…Œà”ÚLvI¸#ªÍCÞ3JùÂݚwu£j¼º³`´ð›ÁÄåH/°ºèvG4 +­]æÊóˀﵶ$ ´ÚüæX¡^¸N°?[@'”Ôˆ^Oô7ɀ«Ó,8ïú`øþã¢Éݓ…5xÞ Ö?ºÚQÞú©BÁBz<¶h餶ø +"…a¯RœœiƜ@Cñ ¤œÎ—‘§V˜°å@çê ø kLC*•3&–zd‰_ê;ãŒøï›@ÆÙ}<b-Ú?uƒ¡1 jìú´K¥!üÌ,Ô$ðŦê›K?ª¾KÇ"¯ZJmE¿@ó6évÌÄùEÇæ}Ù³šb°DH:E’™Ûrê ²Y,MVü¬uû¦\Vìk™"1RäsXggÄÍg(íz'à*¸é0ÀàÍ×õ €ÂÎՊëÚ<ã-͝°MqâŸùj8øÅYõ›h·ôKÇ Ss4 +Ùg”¯_.º13¿¾—?²Ãñàyêü$˜Î?à'¹9íz.h¼ òq—LŽÊñí!`÷æžÊ+¾õÞåsæSU ì2Í߇97¦|ê.{fmôñXSKó-ÔBÊÑž&¹ÈnMwÏM}ƒ!ÈË6Aá¨ÉX×5ú¤ oó½^xÿd#­s‰Ž×ó*êüaG¹"b4;ÒÌj_Œ{þvìï>„- ¦ üÈðËs,£(è2ŽU¢Çìù÷–ÌAûqÈãh×?1/n·6)U.…+î%’"îrŸB0…‘þDäÙ3€ÔkŠmóm o ƒ¿Ó ùõú¡‚èvP¬°<Â;k³æ´"°ê|-„>l4<5´• ËXY™Œì“U=ØxG‰Ýmڒ§y´ÅŽgca +|ÛgöŠÒ­ªŸ ¨‡Š÷ÂßN|‚Ep;‰…<輏44ž­£. ‹=Evv㐭ÒßÙ TªÌÛ©£Ö$*I˺0É + +эì'Øñ”P»-’8“;ރîQñ|’vZp0…ÌÖK(,iÑõ˜ JÎ‚O\I‘xž±Ûpã¯g­+qÁìǏŒÿ=±?¯Mó§5œ½g’—Ææ ¶9ЎðUçûMŽV©ØÇ ^„á#ùRX'†±\d…°„\˜]q{œjýwfÅ¡l˜+~{l¼%çló-Bxjs|p?–yrñԙ‡µŒsþë®j§OúÄç;GÄ ŽÏwb.pµ}ÌIGŸ¬VÆïY%‹-}ë|QÂî²OÎÁ¶oÊ54œ£s…F)l ›@4Ráñk$0ú¹ìlŽhxÅ5žècgþXµJ%݋öøƒEBµøc’/ +÷½XŽu7!Ùêa +M«íLäáËn€3Å^‘…qzwZ´.)Aç%­LS6^êÑø«£Í¨@Ð@lƒ­Ò<®ÑڌkÂF~ˆø2éAŽÑ­¥Ð­Ê4ӛ³/›îÞ»üÀ +¢Çx9‘§¾H¶kO‰=éÚ´÷Â0»+ÐìR^jŽõ´°nùÞÛÔ3«Žñ›$§ÔÚ²‚ľ^$y{XÒ/³z†³ÐƒÐŸKN·ãG“DÙÓÆ´ø¦çå¹B|7ÊåŠýš$”óCðÚ[hQT¨5Ô͹¿Î‰_muÆ+_MD՝™Vh‘ÃÛ +Kë¾ÁWÒÆ×,Ë"ß’V-99°ûÏ{•×cîWQßÓ#µ,P†Õ¾k5•*÷|ʄBîBŽéU琳Öôñ˜DQÒ®G؝l¯˜ÏóhÜ»ã¨/OµjÊË #ÀÐ3 ¬/¹8 ÕcÀø"››š}îA”Ý?V"é=‘ЧCÐe“î*‘×?sև Ó/Ú7³FÁ£,£<„¢eɟڑ`4§uuv›Sßül'Q9þG!ºÍ0f²ÓsZwL* +Œ1»DxˆÝ‘Òd•txŸÌšˆ˜+ôã‹æ%î•9±{©:Ô´è H{ Æ£L&Ü<+ÞQÉÊ4 û ’[§[éè›&vpŒc„–pf¸f"˜&¾îwJÐNßê6Ž…)m‘ÝÎÛhÊÉ3Šê°e<ìâ/Ê¡8?NnÀ-4 PU‡;^T¹¬ŒœN,FÝǷ쿆®Í'SšÕÊÌYœ-”çO5)‘’Áä؆Ñ@ÊîÎÞð涥·Ã{“D¯g·ã…XÙ² 1ª>IïùS^€“f)´C8ò†Bb§/sÊKº‰20 ˜R‚’#Â0†¹ÊQµ~”0’`ÚÜ1@(P=¶¤™¯£\¶ÔIýÁ,ÀÃøƒm9dˆ“tzÓ@„¾âìþwàÜ·ˆÁL.N}=~åùÄÁqvŽ‹Â:ÚiYC&å‘2¿{®"¢ñ¢mI ,~µ³;Ge®†³Vó/79ύy#þ]¡+o|PN굗µ´<ÌZ_x!p1ŸÞQ”Åic•Šx}qŽzjÝòRZÒfš.³åˆÒ‰ß§Ýr¥UP½RJ„W{_ÔñiÁœGo– dš9Åeºç–ôȋµÀÜ0ûRñ¾óQݯiUŽ*‹šmÿ¼&?ߢ<`“†VKœÔ‚@Ê@}FíÝâû—„Ä|G"Ñ"=øœôCa›vbÊ¡ç® °Gfé{Â÷~dÙx) ÎüZ-Êòc ãvs%ieúí kÓÔK6`ù¨øˆrstöïò\‰Þ¼W-;φò¢p*œ£nKLñ+O1¶Ù;ˆ¹l6C™–ôC[µ½-(ßa{[߄5ñ(×Áù¼©)è3ýHD›vVýÔ,Døå±Wögó—’'×·ë'a‹]”ô‡9 ´5ôhêDƒ9ÉbÜ3£ùƒiϲΌ Öz0¾X]¯á‡Úå5ajÞéؐì_!8Ô*jWÈð^Q³ñâk‚ETúX£šÒuRk©Î±˜ÖHV꒟ï'&ÐY½+dŽUÙZÓÚñoYŒî wȎ\/£‡/0ú”Ȧ7ùÖ*B'NµPË×ވ‹Ž)Ø(W—ž $="øµà„ž!¡¾#ˆ©ª=ɦ­·ØmµyŒ0ýCö2|`˜z+/—t'Ï6QØXäüÌÒ¹†ˋU£°m¦ ÚÞr3uÊp¹—(^¯ÎU»*¹,_m% A•ùºFÇ hÓïE¥õéèYùÍÛ[Ìý垹“ÔsJ’È°?rREN,û +ÞÂxɪ÷g•·7ðYŸC=(ê€tI“ô–3+×ÈI Økœ•Šë‚eGÐzn%ØÅSesG+ý°z™±Ÿr¹Â»›?Ì\Õ×2¿Ušt”º–i(‹‘ŸÚ®9¬(¤Ž,1ŒR²à¸?…é#O§SºÜ¹³ 定²¼¼?íf$õá4žûÌ\h‘:,Æ)né¿R›fZ1-o¶Æ‚Ú†/42ûàÎÝÓüdN"'G/Ž'Àâ]ÊÜ?/·Ž§ÇZæèû¢è@U):~èè`í{”E܈™\úôPxvH5ÊòŸie(4^ð6ĬW¼+†#‡"í l¨¯ií}‚|ùŠ a͎ü›É1UÚÌ! {)jtgnâ­*añ[Êĵ uÆÂÙèÏõ-ØþñɖóI™ü¼ Ó·Å,/D—DCÑT€€Gm"Ü6ç ~‹CC©®Ê€@eõ9v1oÏx~Hi¦¿L>^êÛ,嘭å‹ù·æÓóiÇg2݃ïø…rÏ9û'õ#=w7Qvê2tÁ®¹Ž²oeHý irV€ +;Y Ú…¾êkjï%ڝ2 ·‚ý2qµN¶‹JÿÀ2ŸkÇ; BŽðµ`!ß×4‰¤^؊kÆ0Cíà×¾V¸F$¼ˆjɁ +_¶ uê=5R¿…nðéôãYꇹ®6!êÁÆ@£¹©g…©…ï4Y¡ì»Ê)1|”%¹VbÎK&Va£êí4º™Ê¬i‰ÑWMMúc+îÏæ)ÄùB»xÑùŽ‡ôW«G¾­Dæ²G #êï~jžëU›LǙÝۊ‡3J²¹Á8èHæW]&0†=!Wò°S§“ׂ5G¯„øÎl¾ŠMW!^Khõ¯sBxj{—¶pìNêP(Ü؇w9|æT ºG ¶`tNð”Áâ}pÏIOÙLlˆµ¡ìØGĂåÝÅ*¸Ýí)œåز&®II|Ž‚”¬ÓÅò͵Ä¥òˆW9äd¯° ÆOaOâÛ×#h:°30b'v}ÎÈÊà&óȞpË Ë¤˜¶ÇÅ´-è’P©øNBúޙ¢‰~ËGPîg·a«§$Éž!FÙ¢î¦Aƒ\É&uåŸ +à¦Þâ™ËÎÒ´C1ö ‚Ž>¸YœŽ „lÐç¶X¿Ò‚sŽÝ ÞÊFgƐý;£uÃßd¬ìK™KÛÆÁ-ƒyÄÙh¡}JƒZ+õ¥CÕºìÔQi ÐÃS!üìXöÌj'®^øÄ¡®WŒâGã•A"X…¯êñ×7Rzõ &¾cL£jOþãہҚDם!p ®ÒðEÓµ÷Þ +à9oêö¢uÛ%Üo·Ü…Vêl WÊðü•±†Ü:=Ä'ä)²®íSëϺ 0àõ¶¦Ãwª oeðÇ$”K=¹6< )´Ñ†‘wÀ²’µól.ißù¾½õ[˜~Aƒª=ÊÚ±8*'­“Ø(UÓó,œiT(T€³bž”m’›ê¡!ÃÆk>ŸH¬ kAMVŸŠÃõ,•FjLWk¬<ª QTl‡‚Яºfɐåæ$Ò-ٍDõ!Uҙ)I®çCóºò$±ŒÛPèñ…ÃÁo£AÝpÍÄâ®äi’BMÎìñu‡q,tN •—á›& ãáÛêÃÆpƒõYŽÙºš¿C å¸öÂ6dë`NtnŠíŒ$ì›òf§Õû>O’žmí‰ÂÞ1­©-âÕ·tä¿hO. ì k‘Ò'¼é¾ ƒ²÷œÛ C9%=þÓ:W/ lˆÁì@:‘Ð¾FØ¡H¼üy€½ä??ðC± ôɒ!çyœPV]:õ·â!`Á6gԀ¹–ïï?QÐè+5ÛqT§'$ÒõN¦ñúÓ ¯,Àƒ—Å$ 9ZøSYi(˜~±ðön›™ÂzXú?¿{¹š‰\v@¢EEŠ®TSÎêç:œâzW +é¨{°ÂBX¶" 鄁jÌkB^öÍÍ †lÿèÑ å9’v²žS†3+t_:Ì^™®ULþ‚y–O»h9Ø­‘b0š¸gz-Ù¶ýú}Ò̾·†ã7G¯ÜÀFãþDALÉOÑU½Å&]·âÀ¨ÙÕ¥_‚í.ó#gèT0Ø-"6›’ÅrK]ûdÆJàjtƒiÝ6G¬á÷a’‡åÝðʲ`sÓâŸYðUùë×DҊMðu¹G…ãeáUw­àáZ¥{” á¥Z)F©* QôJ{›)¦¤¥Ðú0N«;H#y|¸sÈ'>¨B~U’P©ï¥ï`ñþ4ÙyoÐ2ØÔC^ïžÆiªŸœSŒŠVb“tªs¡iv.·z˜>z| ¦H+®±We:…tõ—d¯Ëdò1·âÍ6šäì^`;~é} ›ˆ}q†—_N•€ÒÏ3ÿ⹞ú-Ä?—ò`>…Žº%í1*tU«¸J<d2”¡¤á¸²îµœp„§âwÌiê~R æV^Cº§[ä‚DünDnZªºþò}&÷NhÔ«+Þ\"%d!¶289­ ûî·ìüóô!ã,à˜y%7£ö³`Oþ’Íž‰ñ=ƒ +¡C¢×Ž&-vÄÈ2p$÷î»ßïÇ*Âo4d’ÜšçuóHp^_Ý +¢Í<ÀÖ­ÄDš1 8¹nß)g&âÛ´x®Xpݳ‹w°:¹ÜÜÂvÎßöd<µq]6×Ò'á¹+ÖÝFˆüX‡¡n-x0D‡“æïŸU¤úö{JO@"2û'¥Ç¡§—;0=’:X· ӓ{Iª#›eƒ«' ¤Ü$G¡Q”Ë^ +ÔùKY¡mn©oÖМ2º5 `‰ç6¿Ý €žàv·'ñ,ŽÄV/æ)4C~Ò©$ñ//À ½-E•gª„Aè¿·jƒÖ¦×§ó<Èw¶M©½‹aBug…—|u‘< „Gö`¼øɳdƘWÀ‹æçQpŒYÆGåÙëʵ¡›{½ô¡¨'ˆµ˜‰ OsþY¹PÑ^áj¥.ôOvã¢ËgO_K÷c@â'³oVÿöb8ûÆöó´mò¤ãÉ_úkgaŽ§Ž^1é]kê"W_K—vÏxER@iÞªGð˜—è¦éÆ02=ßò§eÁóÂ~ÍrKj-â=4Pb—­¨ºMşÜIwÛZÓûGñ;êþÿ/Ëʁ,)‚ý3Uˆ3·1© WM”“ÒõfÀ…}Åýd60D¯¯wËÍ!ús†B«¼ù›ÒÁXuKñULøJ’âG^J‹½(0îJèUkõ"OrF†{ˆÙ‡#&4KöÚMïKÎJûè(7%•`öM=0Ä L +õ!¶Ât-–>·h ¾wN”È× ëÁí´S.è A gDË·®~V„–Tý‡ý°œìÚ#ò$A@· +§Ç®U¢z–ˆPºb# ø\¢G©¶°ÌŠ|wzE’ÿP7xíb8ZFu¼hŸ`¾¬ñ5|f…|Çh`ö­L“OK£¬ö|¥…@ÒúØD‘zá%°°æW‰è¼0ÆÆÁÜßGóʲùmQ!aÁ’æ©Ñ;g—òH„–¼ËüÞ< +Ã2Í«Iǒ˛=d4"LQ±ìG¢[ý?4ì…Dqë‚\ºJ) ú2EŽu â‡'ß䜊kvºÊ˜gA¡œNojqY+ð81Áê•-Bê>!ÿ +sR_WÜ©”wÚ åRQ˜¯Ž Â›ô@:QHZ§ Ó)øÛâ5ngõvë7Ün´G{õ'BžÝu^}È[ESxƒ|ùΤé1µ1mIÁ±n§¥"3æzëRÍX°b“+”"¯o7á+ݕÙqô>ñ è ÌÅ:YœœA=„ˆážåÐYØñ ¾“~©”ÈD¦¦ë[õž.ùÒ¸wu‡˜mAíšýܗ¾CÊQËöî!Ž3œÑªÏJê2.Vå%ÙÇHÜÀð)@YöК_‚­(¥_\.Ôµ2òàl5îـ+LÓò|© +ú\%è{,Ü2W$0d…"x§ F®¿`‰›Ú]±ÎÍÄûu÷—Rk´<‰~êçVwô5eeÞ¾WÝEÜe#GrãSŽH(&“ªš`~ "™Fv»™f I¶þPñ¤'ÁýÍO¤á™’o:ÉÞ_ÆÙQ:Ó¼ ÑQ¯Í1$ +Q—ŽÊ>‘SìþÊÊʪHMaÕ8÷¸yö“m*tšS‡soÃèm‘À«f…È%Ðb ò'UM«¯‡àáž +“á•ínè+½¾¶íªÝ†fDÖ-ihIå#¥xºvó Ñì0º^y÷W:xåâ¾F•,ô©·î‚Äçw m˜ÏÁRN“‚j¿§õ»pæãw]AùØå¼%ò÷lsÐïÒÓº£ !ýQmXšóVÌ~¾&Bõ£°kƒŽ_‘e«=Ö Hðã×|Ã3/c`=šñԆ»’¹˜¯[í…þ"ã»ït§oîٞ•¡.ƒXÉ+0^ɵ;Îïk™?nšÚ/¤A³ÂkŽÍH,XO‡B æ/’T +½AŸð¿ÕÉ£VbU«ÐR4I ¼ +5Íml²³M{€+G€ØàèJláô;ÜʞSÐÙRø»p«[=Õ ªO\s}³~ØÝ©ód!U^ü¬ºN&©{œ¨Q~d/Î9qÚ3GŽ uÐN^,4ãM|×¢ÌêlŦ%Q<9©Ó³{o!'ª©ÏBRŽé±a ³D]Ï4xpüɧ¦7((YöÐ\{l¤Þá¯~µZÆ«úä­×>Òpꅅ±"fÀñJm…-Ε\@&gGÍNn‘Ð&8*û 2 Nen‚Çú°qÀPÖE,y V¬èžàî¸øÔwŠ$õvþLôX.Ûmmäa!¹ú죒ÃŽ¡< ˆKÀ]¿5_ÅáãîŠDø6ÔU«ûè¹ìdDÍǕ‘eɚU +dxvœ+rƛM †je ïÊXà°6­‰"+Ë7{þóïú\Ì6Ó‰`'dß~{fñ‹ð˜œ÷qqd›¡|"mõî·B…ÜE²¡¾–üªÕ—”$ݲpQOS†êŽÔ8OøI´ž½jel.§´ò6*܈ҁ׈lÕ]]C­q8·û¨›ï¬6£ã;›1ÜÕY ÒèªÔOTKÌà¹úD)yQ]Ò¥”-5?ö+2è™h#´ð¦Ãw+»"sÔ½ð ÿÁä—K¨Íõv3 5ø÷k·ÕƯbV.[|YFþ¯$DʕXUÌÂ圶*àE–¼mÚ=ÝùŠ$* ÜgôUþ`ÞóC¢ûÂ,˜ä71èp=6‹UáC¢ °ô£1«ÁÏ}"9ÈcMÓ¯õkþ{Ü+h•F sV’ÉÁ–"5ªR¹ÕH²›5 IŸUeí ¢WÄGÄIšð¡ZEºßx´´R_8›,}üø/§è“gì—뽺” ? üH#ü¥ÌÃ'ÔjJójA‰sƒ_¿¡Àè‡- ÖLR?£«¦‹|¼[ºp4‡Ç(7YÅÀžL#j­¸á)|êïca°6p¾Ln„¹Ë¿áÉˆ].[ºp[ò9Ž£ßޜ”¨G³ãjéÝÄ·ZÂäðµ…O=“ý‘p ý†Û~n.°"çI^TððV-¯€k|Wh̓“»±À5žOAÝ5HÆî,=ráå¡WZ=›ÇrF” +Ï ¬À«n t}‰üóC-qòRíKfääfþÅq +endstream +endobj +2547 0 obj << +/Type /FontDescriptor +/FontName /CLJUIE+NimbusRomNo9L-ReguItal +/Flags 4 +/FontBBox [-169 -270 1010 924] +/Ascent 669 +/CapHeight 669 +/Descent -193 +/ItalicAngle -15 +/StemV 78 +/XHeight 441 +/CharSet (/A/B/C/D/E/F/H/I/J/K/L/M/N/O/P/R/S/T/U/V/Z/a/b/c/colon/comma/d/e/f/fi/fl/g/h/hyphen/i/j/k/l/m/n/nine/o/p/parenleft/parenright/period/plus/q/quoteright/r/s/semicolon/seven/slash/t/three/u/underscore/v/w/x/y/z/zero) +/FontFile 2546 0 R +>> endobj +2490 0 obj << +/Type /Encoding +/Differences [2/fi/fl 34/quotedbl 37/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon 61/equal 64/at/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/bracketleft 93/bracketright 95/underscore/quoteleft/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/braceleft 125/braceright 147/quotedblleft/quotedblright/bullet/endash 169/copyright] +>> endobj +963 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /LBWBDW+CMEX10 +/FontDescriptor 2503 0 R +/FirstChar 80 +/LastChar 80 +/Widths 2486 0 R +>> endobj +291 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /OTQMQX+CMMI10 +/FontDescriptor 2505 0 R +/FirstChar 46 +/LastChar 120 +/Widths 2495 0 R +>> endobj +828 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /ZGGNQH+CMMI12 +/FontDescriptor 2507 0 R +/FirstChar 60 +/LastChar 62 +/Widths 2489 0 R +>> endobj +1408 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /OMWOOP+CMMI6 +/FontDescriptor 2509 0 R +/FirstChar 100 +/LastChar 117 +/Widths 2481 0 R +>> endobj +964 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /NNLWPH+CMMI7 +/FontDescriptor 2511 0 R +/FirstChar 100 +/LastChar 117 +/Widths 2485 0 R +>> endobj +1864 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /DGLWIM+CMMI9 +/FontDescriptor 2513 0 R +/FirstChar 46 +/LastChar 120 +/Widths 2479 0 R +>> endobj +300 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /CZIMXX+CMR10 +/FontDescriptor 2515 0 R +/FirstChar 40 +/LastChar 118 +/Widths 2493 0 R +>> endobj +1862 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /UVIORO+CMR6 +/FontDescriptor 2517 0 R +/FirstChar 97 +/LastChar 120 +/Widths 2480 0 R +>> endobj +966 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /VWYYIV+CMR7 +/FontDescriptor 2519 0 R +/FirstChar 48 +/LastChar 120 +/Widths 2483 0 R +>> endobj +939 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /EBURFX+CMR9 +/FontDescriptor 2521 0 R +/FirstChar 40 +/LastChar 118 +/Widths 2487 0 R +>> endobj +216 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /UUCYST+CMSY10 +/FontDescriptor 2523 0 R +/FirstChar 0 +/LastChar 54 +/Widths 2500 0 R +>> endobj +218 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /ATFWDW+CMSY6 +/FontDescriptor 2525 0 R +/FirstChar 3 +/LastChar 122 +/Widths 2498 0 R +>> endobj +965 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /ZQLTBN+CMSY7 +/FontDescriptor 2527 0 R +/FirstChar 0 +/LastChar 48 +/Widths 2484 0 R +>> endobj +217 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /JRVZXP+CMSY8 +/FontDescriptor 2529 0 R +/FirstChar 120 +/LastChar 122 +/Widths 2499 0 R +>> endobj +1406 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /GCEPBM+CMSY9 +/FontDescriptor 2531 0 R +/FirstChar 3 +/LastChar 50 +/Widths 2482 0 R +>> endobj +938 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /YGAXLK+CMTT9 +/FontDescriptor 2533 0 R +/FirstChar 49 +/LastChar 109 +/Widths 2488 0 R +>> endobj +2144 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /OAKMXN+MSBM10 +/FontDescriptor 2535 0 R +/FirstChar 81 +/LastChar 81 +/Widths 2477 0 R +>> endobj +1948 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /OAKMXN+MSBM10 +/FontDescriptor 2535 0 R +/FirstChar 81 +/LastChar 81 +/Widths 2478 0 R +>> endobj +249 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /FAEEXD+NimbusMonL-Regu +/FontDescriptor 2537 0 R +/FirstChar 34 +/LastChar 121 +/Widths 2496 0 R +/Encoding 2490 0 R +>> endobj +370 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /JOTYEC+NimbusMonL-ReguObli +/FontDescriptor 2539 0 R +/FirstChar 39 +/LastChar 121 +/Widths 2492 0 R +/Encoding 2490 0 R +>> endobj +247 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /KMUOGT+NimbusRomNo9L-Medi +/FontDescriptor 2541 0 R +/FirstChar 2 +/LastChar 150 +/Widths 2497 0 R +/Encoding 2490 0 R +>> endobj +703 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /UMYVEH+NimbusRomNo9L-MediItal +/FontDescriptor 2543 0 R +/FirstChar 2 +/LastChar 121 +/Widths 2491 0 R +/Encoding 2490 0 R +>> endobj +215 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /YKOZLO+NimbusRomNo9L-Regu +/FontDescriptor 2545 0 R +/FirstChar 2 +/LastChar 169 +/Widths 2501 0 R +/Encoding 2490 0 R +>> endobj +298 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /CLJUIE+NimbusRomNo9L-ReguItal +/FontDescriptor 2547 0 R +/FirstChar 2 +/LastChar 122 +/Widths 2494 0 R +/Encoding 2490 0 R +>> endobj +219 0 obj << +/Type /Pages +/Count 6 +/Parent 2548 0 R +/Kids [210 0 R 244 0 R 289 0 R 294 0 R 304 0 R 311 0 R] +>> endobj +325 0 obj << +/Type /Pages +/Count 6 +/Parent 2548 0 R +/Kids [319 0 R 328 0 R 335 0 R 341 0 R 347 0 R 355 0 R] +>> endobj +371 0 obj << +/Type /Pages +/Count 6 +/Parent 2548 0 R +/Kids [363 0 R 377 0 R 383 0 R 388 0 R 393 0 R 398 0 R] +>> endobj +409 0 obj << +/Type /Pages +/Count 6 +/Parent 2548 0 R +/Kids [405 0 R 436 0 R 479 0 R 541 0 R 586 0 R 612 0 R] +>> endobj +661 0 obj << +/Type /Pages +/Count 6 +/Parent 2548 0 R +/Kids [649 0 R 695 0 R 718 0 R 741 0 R 765 0 R 803 0 R] +>> endobj +835 0 obj << +/Type /Pages +/Count 6 +/Parent 2548 0 R +/Kids [824 0 R 858 0 R 879 0 R 900 0 R 926 0 R 954 0 R] +>> endobj +998 0 obj << +/Type /Pages +/Count 6 +/Parent 2549 0 R +/Kids [986 0 R 1009 0 R 1039 0 R 1059 0 R 1086 0 R 1104 0 R] +>> endobj +1130 0 obj << +/Type /Pages +/Count 6 +/Parent 2549 0 R +/Kids [1120 0 R 1144 0 R 1185 0 R 1219 0 R 1258 0 R 1290 0 R] +>> endobj +1327 0 obj << +/Type /Pages +/Count 6 +/Parent 2549 0 R +/Kids [1315 0 R 1352 0 R 1399 0 R 1431 0 R 1444 0 R 1454 0 R] +>> endobj +1474 0 obj << +/Type /Pages +/Count 6 +/Parent 2549 0 R +/Kids [1466 0 R 1484 0 R 1504 0 R 1523 0 R 1556 0 R 1586 0 R] +>> endobj +1631 0 obj << +/Type /Pages +/Count 6 +/Parent 2549 0 R +/Kids [1616 0 R 1643 0 R 1685 0 R 1741 0 R 1802 0 R 1859 0 R] +>> endobj +1920 0 obj << +/Type /Pages +/Count 6 +/Parent 2549 0 R +/Kids [1913 0 R 1945 0 R 1962 0 R 1973 0 R 1985 0 R 2001 0 R] +>> endobj +2022 0 obj << +/Type /Pages +/Count 6 +/Parent 2550 0 R +/Kids [2014 0 R 2030 0 R 2043 0 R 2055 0 R 2071 0 R 2084 0 R] +>> endobj +2107 0 obj << +/Type /Pages +/Count 6 +/Parent 2550 0 R +/Kids [2100 0 R 2116 0 R 2128 0 R 2139 0 R 2154 0 R 2166 0 R] +>> endobj +2228 0 obj << +/Type /Pages +/Count 5 +/Parent 2550 0 R +/Kids [2224 0 R 2297 0 R 2398 0 R 2469 0 R 2474 0 R] +>> endobj +2548 0 obj << +/Type /Pages +/Count 36 +/Parent 2551 0 R +/Kids [219 0 R 325 0 R 371 0 R 409 0 R 661 0 R 835 0 R] +>> endobj +2549 0 obj << +/Type /Pages +/Count 36 +/Parent 2551 0 R +/Kids [998 0 R 1130 0 R 1327 0 R 1474 0 R 1631 0 R 1920 0 R] +>> endobj +2550 0 obj << +/Type /Pages +/Count 17 +/Parent 2551 0 R +/Kids [2022 0 R 2107 0 R 2228 0 R] +>> endobj +2551 0 obj << +/Type /Pages +/Count 89 +/Kids [2548 0 R 2549 0 R 2550 0 R] +>> endobj +2552 0 obj << +/Type /Outlines +/First 7 0 R +/Last 67 0 R +/Count 10 +>> endobj +207 0 obj << +/Title 208 0 R +/A 205 0 R +/Parent 67 0 R +/Prev 203 0 R +>> endobj +203 0 obj << +/Title 204 0 R +/A 201 0 R +/Parent 67 0 R +/Prev 199 0 R +/Next 207 0 R +>> endobj +199 0 obj << +/Title 200 0 R +/A 197 0 R +/Parent 67 0 R +/Prev 195 0 R +/Next 203 0 R +>> endobj +195 0 obj << +/Title 196 0 R +/A 193 0 R +/Parent 67 0 R +/Prev 191 0 R +/Next 199 0 R +>> endobj +191 0 obj << +/Title 192 0 R +/A 189 0 R +/Parent 67 0 R +/Prev 187 0 R +/Next 195 0 R +>> endobj +187 0 obj << +/Title 188 0 R +/A 185 0 R +/Parent 67 0 R +/Prev 183 0 R +/Next 191 0 R +>> endobj +183 0 obj << +/Title 184 0 R +/A 181 0 R +/Parent 67 0 R +/Prev 179 0 R +/Next 187 0 R +>> endobj +179 0 obj << +/Title 180 0 R +/A 177 0 R +/Parent 67 0 R +/Prev 175 0 R +/Next 183 0 R +>> endobj +175 0 obj << +/Title 176 0 R +/A 173 0 R +/Parent 67 0 R +/Prev 171 0 R +/Next 179 0 R +>> endobj +171 0 obj << +/Title 172 0 R +/A 169 0 R +/Parent 67 0 R +/Prev 167 0 R +/Next 175 0 R +>> endobj +167 0 obj << +/Title 168 0 R +/A 165 0 R +/Parent 67 0 R +/Prev 163 0 R +/Next 171 0 R +>> endobj +163 0 obj << +/Title 164 0 R +/A 161 0 R +/Parent 67 0 R +/Prev 159 0 R +/Next 167 0 R +>> endobj +159 0 obj << +/Title 160 0 R +/A 157 0 R +/Parent 67 0 R +/Prev 155 0 R +/Next 163 0 R +>> endobj +155 0 obj << +/Title 156 0 R +/A 153 0 R +/Parent 67 0 R +/Prev 151 0 R +/Next 159 0 R +>> endobj +151 0 obj << +/Title 152 0 R +/A 149 0 R +/Parent 67 0 R +/Prev 147 0 R +/Next 155 0 R +>> endobj +147 0 obj << +/Title 148 0 R +/A 145 0 R +/Parent 67 0 R +/Prev 143 0 R +/Next 151 0 R +>> endobj +143 0 obj << +/Title 144 0 R +/A 141 0 R +/Parent 67 0 R +/Prev 139 0 R +/Next 147 0 R +>> endobj +139 0 obj << +/Title 140 0 R +/A 137 0 R +/Parent 67 0 R +/Prev 135 0 R +/Next 143 0 R +>> endobj +135 0 obj << +/Title 136 0 R +/A 133 0 R +/Parent 67 0 R +/Prev 131 0 R +/Next 139 0 R +>> endobj +131 0 obj << +/Title 132 0 R +/A 129 0 R +/Parent 67 0 R +/Prev 127 0 R +/Next 135 0 R +>> endobj +127 0 obj << +/Title 128 0 R +/A 125 0 R +/Parent 67 0 R +/Prev 123 0 R +/Next 131 0 R +>> endobj +123 0 obj << +/Title 124 0 R +/A 121 0 R +/Parent 67 0 R +/Prev 119 0 R +/Next 127 0 R +>> endobj +119 0 obj << +/Title 120 0 R +/A 117 0 R +/Parent 67 0 R +/Prev 115 0 R +/Next 123 0 R +>> endobj +115 0 obj << +/Title 116 0 R +/A 113 0 R +/Parent 67 0 R +/Prev 111 0 R +/Next 119 0 R +>> endobj +111 0 obj << +/Title 112 0 R +/A 109 0 R +/Parent 67 0 R +/Prev 107 0 R +/Next 115 0 R +>> endobj +107 0 obj << +/Title 108 0 R +/A 105 0 R +/Parent 67 0 R +/Prev 103 0 R +/Next 111 0 R +>> endobj +103 0 obj << +/Title 104 0 R +/A 101 0 R +/Parent 67 0 R +/Prev 99 0 R +/Next 107 0 R +>> endobj +99 0 obj << +/Title 100 0 R +/A 97 0 R +/Parent 67 0 R +/Prev 95 0 R +/Next 103 0 R +>> endobj +95 0 obj << +/Title 96 0 R +/A 93 0 R +/Parent 67 0 R +/Prev 91 0 R +/Next 99 0 R +>> endobj +91 0 obj << +/Title 92 0 R +/A 89 0 R +/Parent 67 0 R +/Prev 87 0 R +/Next 95 0 R +>> endobj +87 0 obj << +/Title 88 0 R +/A 85 0 R +/Parent 67 0 R +/Prev 83 0 R +/Next 91 0 R +>> endobj +83 0 obj << +/Title 84 0 R +/A 81 0 R +/Parent 67 0 R +/Prev 79 0 R +/Next 87 0 R +>> endobj +79 0 obj << +/Title 80 0 R +/A 77 0 R +/Parent 67 0 R +/Prev 75 0 R +/Next 83 0 R +>> endobj +75 0 obj << +/Title 76 0 R +/A 73 0 R +/Parent 67 0 R +/Prev 71 0 R +/Next 79 0 R +>> endobj +71 0 obj << +/Title 72 0 R +/A 69 0 R +/Parent 67 0 R +/Next 75 0 R +>> endobj +67 0 obj << +/Title 68 0 R +/A 65 0 R +/Parent 2552 0 R +/Prev 59 0 R +/First 71 0 R +/Last 207 0 R +/Count -35 +>> endobj +63 0 obj << +/Title 64 0 R +/A 61 0 R +/Parent 59 0 R +>> endobj +59 0 obj << +/Title 60 0 R +/A 57 0 R +/Parent 2552 0 R +/Prev 51 0 R +/Next 67 0 R +/First 63 0 R +/Last 63 0 R +/Count -1 +>> endobj +55 0 obj << +/Title 56 0 R +/A 53 0 R +/Parent 51 0 R +>> endobj +51 0 obj << +/Title 52 0 R +/A 49 0 R +/Parent 2552 0 R +/Prev 43 0 R +/Next 59 0 R +/First 55 0 R +/Last 55 0 R +/Count -1 +>> endobj +47 0 obj << +/Title 48 0 R +/A 45 0 R +/Parent 43 0 R +>> endobj +43 0 obj << +/Title 44 0 R +/A 41 0 R +/Parent 2552 0 R +/Prev 35 0 R +/Next 51 0 R +/First 47 0 R +/Last 47 0 R +/Count -1 +>> endobj +39 0 obj << +/Title 40 0 R +/A 37 0 R +/Parent 35 0 R +>> endobj +35 0 obj << +/Title 36 0 R +/A 33 0 R +/Parent 2552 0 R +/Prev 27 0 R +/Next 43 0 R +/First 39 0 R +/Last 39 0 R +/Count -1 +>> endobj +31 0 obj << +/Title 32 0 R +/A 29 0 R +/Parent 27 0 R +>> endobj +27 0 obj << +/Title 28 0 R +/A 25 0 R +/Parent 2552 0 R +/Prev 19 0 R +/Next 35 0 R +/First 31 0 R +/Last 31 0 R +/Count -1 +>> endobj +23 0 obj << +/Title 24 0 R +/A 21 0 R +/Parent 19 0 R +>> endobj +19 0 obj << +/Title 20 0 R +/A 17 0 R +/Parent 2552 0 R +/Prev 15 0 R +/Next 27 0 R +/First 23 0 R +/Last 23 0 R +/Count -1 +>> endobj +15 0 obj << +/Title 16 0 R +/A 13 0 R +/Parent 2552 0 R +/Prev 11 0 R +/Next 19 0 R +>> endobj +11 0 obj << +/Title 12 0 R +/A 9 0 R +/Parent 2552 0 R +/Prev 7 0 R +/Next 15 0 R +>> endobj +7 0 obj << +/Title 8 0 R +/A 5 0 R +/Parent 2552 0 R +/Next 11 0 R +>> endobj +2553 0 obj << +/Names [(Doc-Start) 214 0 R (GFDL) 380 0 R (GFDL_GFDL) 251 0 R (GPL) 307 0 R (GPL_GPL) 252 0 R (classparma__polyhedra__library_1_1By__Reference_3_01T_01_4) 482 0 R] +/Limits [(Doc-Start) (classparma__polyhedra__library_1_1By__Reference_3_01T_01_4)] +>> endobj +2554 0 obj << +/Names [(classparma__polyhedra__library_1_1By__Reference_3_01T_01_4_133f3756e88145e6ff5bf3d1b41838d9) 831 0 R (classparma__polyhedra__library_1_1By__Reference_3_01T_01_4_a3a5f10fed94188b162073ef8efff393) 832 0 R (classparma__polyhedra__library_1_1By__Reference_3_01T_01_4_b4470b84b8b57bae591239910d220c70) 830 0 R (classparma__polyhedra__library_1_1By__Reference_3_01T_01_4_d35d7381bcd3c4cf029d4b76bb6545b8) 834 0 R (classparma__polyhedra__library_1_1C__Polyhedron) 483 0 R (classparma__polyhedra__library_1_1C__Polyhedron_173c08eeeb4a96b0060d5f023e4ba4a6) 864 0 R] +/Limits [(classparma__polyhedra__library_1_1By__Reference_3_01T_01_4_133f3756e88145e6ff5bf3d1b41838d9) (classparma__polyhedra__library_1_1C__Polyhedron_173c08eeeb4a96b0060d5f023e4ba4a6)] +>> endobj +2555 0 obj << +/Names [(classparma__polyhedra__library_1_1C__Polyhedron_1c91471f55b22735023d37417f0bef70) 866 0 R (classparma__polyhedra__library_1_1C__Polyhedron_1f026c17289bb2174eaec0d61a4a2e67) 885 0 R (classparma__polyhedra__library_1_1C__Polyhedron_3665335e295bd7c05eeca13be606616f) 892 0 R (classparma__polyhedra__library_1_1C__Polyhedron_509185b3d326e5d4496fbe8953b82f88) 863 0 R (classparma__polyhedra__library_1_1C__Polyhedron_5491f9cbaf4f0215196fc05ce17eaec9) 867 0 R (classparma__polyhedra__library_1_1C__Polyhedron_558341813be1d1bf607bf1c50e6e1ba3) 865 0 R] +/Limits [(classparma__polyhedra__library_1_1C__Polyhedron_1c91471f55b22735023d37417f0bef70) (classparma__polyhedra__library_1_1C__Polyhedron_558341813be1d1bf607bf1c50e6e1ba3)] +>> endobj +2556 0 obj << +/Names [(classparma__polyhedra__library_1_1C__Polyhedron_a37dcee4fa14c58b76c8d3c4227849e8) 870 0 R (classparma__polyhedra__library_1_1C__Polyhedron_bf571357a5156e495293957a44145a9b) 869 0 R (classparma__polyhedra__library_1_1C__Polyhedron_d008d79cb35b51e7dfbee0dcc3741dc3) 868 0 R (classparma__polyhedra__library_1_1C__Polyhedron_e79d42cfe6b21bcf264fd9ea84e78fb2) 871 0 R (classparma__polyhedra__library_1_1C__Polyhedron_ef6bc45c4726c7fb386547c6ec104cf5) 893 0 R (classparma__polyhedra__library_1_1Coefficient) 484 0 R] +/Limits [(classparma__polyhedra__library_1_1C__Polyhedron_a37dcee4fa14c58b76c8d3c4227849e8) (classparma__polyhedra__library_1_1Coefficient)] +>> endobj +2557 0 obj << +/Names [(classparma__polyhedra__library_1_1Coefficient_2ae111e41ccba8a228746939bb1c595f) 930 0 R (classparma__polyhedra__library_1_1Coefficient_4445a4d60c39e32b6f6d3e2dcb901e55) 929 0 R (classparma__polyhedra__library_1_1Coefficient_7c968f7ba606e8b99863ae8cdef3c686) 934 0 R (classparma__polyhedra__library_1_1Coefficient_ac1766c4ad4a4697f6f9d4a92b200cb2) 909 0 R (classparma__polyhedra__library_1_1Coefficient_aff569442866d78436e19428b4cb8e75) 931 0 R (classparma__polyhedra__library_1_1Coefficient_ffb4611ad564f09455819718964b6e80) 910 0 R] +/Limits [(classparma__polyhedra__library_1_1Coefficient_2ae111e41ccba8a228746939bb1c595f) (classparma__polyhedra__library_1_1Coefficient_ffb4611ad564f09455819718964b6e80)] +>> endobj +2558 0 obj << +/Names [(classparma__polyhedra__library_1_1Congruence) 485 0 R (classparma__polyhedra__library_1_1Congruence_1a974f4ed60693790cec91f324a85b05) 941 0 R (classparma__polyhedra__library_1_1Congruence_240b9d144edd0d6dca5cb42904f9b279) 961 0 R (classparma__polyhedra__library_1_1Congruence_637fe9105c9bc0b2722544d16453e87c) 960 0 R (classparma__polyhedra__library_1_1Congruence_6bcbe60c7d20f1fee7847e262993b626) 940 0 R (classparma__polyhedra__library_1_1Congruence_71cf9ab9ae4f184bf520137a8209ff3e) 937 0 R] +/Limits [(classparma__polyhedra__library_1_1Congruence) (classparma__polyhedra__library_1_1Congruence_71cf9ab9ae4f184bf520137a8209ff3e)] +>> endobj +2559 0 obj << +/Names [(classparma__polyhedra__library_1_1Congruence_7622929270f419e884d16cec2fc172b5) 958 0 R (classparma__polyhedra__library_1_1Congruence__System) 486 0 R (classparma__polyhedra__library_1_1Congruence__System_2da6d6ce1ce4057b0332826381042d4d) 969 0 R (classparma__polyhedra__library_1_1Congruence__System_392557cee71bc7b2eb23f07a9d788062) 968 0 R (classparma__polyhedra__library_1_1Congruence__System_6b7400f7e25b1bb473b2fc16c0c90b32) 970 0 R (classparma__polyhedra__library_1_1Constraint) 487 0 R] +/Limits [(classparma__polyhedra__library_1_1Congruence_7622929270f419e884d16cec2fc172b5) (classparma__polyhedra__library_1_1Constraint)] +>> endobj +2560 0 obj << +/Names [(classparma__polyhedra__library_1_1Constraint_0b1d26f53dd99cfe4e2f8a4fc3e8b5d3) 991 0 R (classparma__polyhedra__library_1_1Constraint_1112ff3331d87019a2df0fb9a83cfeb8) 995 0 R (classparma__polyhedra__library_1_1Constraint_148544cb9ef5bf6b9a60ee56655bff26) 993 0 R (classparma__polyhedra__library_1_1Constraint_4738abd11cb0fdcb233ed4f18c874d56) 996 0 R (classparma__polyhedra__library_1_1Constraint__System) 488 0 R (classparma__polyhedra__library_1_1Constraint__System_8be9b5793c5bcbd09cbe45d5def529d0) 1013 0 R] +/Limits [(classparma__polyhedra__library_1_1Constraint_0b1d26f53dd99cfe4e2f8a4fc3e8b5d3) (classparma__polyhedra__library_1_1Constraint__System_8be9b5793c5bcbd09cbe45d5def529d0)] +>> endobj +2561 0 obj << +/Names [(classparma__polyhedra__library_1_1Constraint__System_ad362521f7fba585112f1a2a5aea3d96) 1014 0 R (classparma__polyhedra__library_1_1Constraint__System_f2e1b75d9c8484321bfc25bb122970b7) 1015 0 R (classparma__polyhedra__library_1_1Constraint_dc27929d7731cdc3beeba475147e3127) 994 0 R (classparma__polyhedra__library_1_1Constraint_e62d06b1c82e9d9f4f12bbb3c6f4bcae) 992 0 R (classparma__polyhedra__library_1_1Domain__Error__Exception) 489 0 R (classparma__polyhedra__library_1_1Domain__Error__Exception_3d2371e510d8b88b2660a631d6857953) 1018 0 R] +/Limits [(classparma__polyhedra__library_1_1Constraint__System_ad362521f7fba585112f1a2a5aea3d96) (classparma__polyhedra__library_1_1Domain__Error__Exception_3d2371e510d8b88b2660a631d6857953)] +>> endobj +2562 0 obj << +/Names [(classparma__polyhedra__library_1_1Generator) 490 0 R (classparma__polyhedra__library_1_1Generator_01ffce41500b158f8a1272d73418822e) 1053 0 R (classparma__polyhedra__library_1_1Generator_0673eda2d88204107796ffacffe269c0) 1048 0 R (classparma__polyhedra__library_1_1Generator_2a43c640dcbae8922c616491ad95e906) 1052 0 R (classparma__polyhedra__library_1_1Generator_80f1c0111cb5ffc8bfc06f7d4ad88b06) 1050 0 R (classparma__polyhedra__library_1_1Generator__System) 491 0 R] +/Limits [(classparma__polyhedra__library_1_1Generator) (classparma__polyhedra__library_1_1Generator__System)] +>> endobj +2563 0 obj << +/Names [(classparma__polyhedra__library_1_1Generator__System_58d5c27c8e3d638fc7d25ee54d04b08c) 1090 0 R (classparma__polyhedra__library_1_1Generator__System_7695c9f42b5164da2b71e7a2b1382d06) 1089 0 R (classparma__polyhedra__library_1_1Generator__System_b1265553cab293b2c77d31f57682ae2b) 1067 0 R (classparma__polyhedra__library_1_1Generator_cdcf46a226e15d398fe41d10873779ca) 1051 0 R (classparma__polyhedra__library_1_1Generator_ce05db6f6b402898007ea5bf6ea4a831) 1044 0 R (classparma__polyhedra__library_1_1Generator_d96733e3e3c9087e06a052e5af198ba6) 1043 0 R] +/Limits [(classparma__polyhedra__library_1_1Generator__System_58d5c27c8e3d638fc7d25ee54d04b08c) (classparma__polyhedra__library_1_1Generator_d96733e3e3c9087e06a052e5af198ba6)] +>> endobj +2564 0 obj << +/Names [(classparma__polyhedra__library_1_1Grid__Generator) 492 0 R (classparma__polyhedra__library_1_1Grid__Generator_27971df55a7b8e685f759f3001b0aef8) 1097 0 R (classparma__polyhedra__library_1_1Grid__Generator_3043f8c7edfaa1e5c98955234589301c) 1098 0 R (classparma__polyhedra__library_1_1Grid__Generator_5dcfc9bdd9d995b7be67da9f47e731ca) 1099 0 R (classparma__polyhedra__library_1_1Grid__Generator__System) 544 0 R (classparma__polyhedra__library_1_1Grid__Generator__System_183f982bd3198d2c455e51e7cedd4e33) 1123 0 R] +/Limits [(classparma__polyhedra__library_1_1Grid__Generator) (classparma__polyhedra__library_1_1Grid__Generator__System_183f982bd3198d2c455e51e7cedd4e33)] +>> endobj +2565 0 obj << +/Names [(classparma__polyhedra__library_1_1Grid__Generator__System_4f9d506f39d5a65a2c2cec090a1578f0) 1124 0 R (classparma__polyhedra__library_1_1Grid__Generator__System_84738aa470464f9f3192817554d26d30) 1112 0 R (classparma__polyhedra__library_1_1Grid__Generator_a32ef5503c68b0c2ccbd8d69251ecfd7) 1093 0 R (classparma__polyhedra__library_1_1Grid__Generator_e846d01ef7cc5222216fcac8f2d255c9) 1094 0 R (classparma__polyhedra__library_1_1IO) 546 0 R (classparma__polyhedra__library_1_1IO_2080ebe48063615d891b98ef65f2ca71) 1131 0 R] +/Limits [(classparma__polyhedra__library_1_1Grid__Generator__System_4f9d506f39d5a65a2c2cec090a1578f0) (classparma__polyhedra__library_1_1IO_2080ebe48063615d891b98ef65f2ca71)] +>> endobj +2566 0 obj << +/Names [(classparma__polyhedra__library_1_1Invalid__Argument__Exception) 545 0 R (classparma__polyhedra__library_1_1Invalid__Argument__Exception_df699afd1b4f9dbc15fd31424e9d15e7) 1127 0 R (classparma__polyhedra__library_1_1Length__Error__Exception) 547 0 R (classparma__polyhedra__library_1_1Length__Error__Exception_5b5e4c1fe8b8af4696ac7cc839fb3b40) 1151 0 R (classparma__polyhedra__library_1_1Linear__Expression) 548 0 R (classparma__polyhedra__library_1_1Linear__Expression_0c0b91260da0f4729a335faa3747c397) 1194 0 R] +/Limits [(classparma__polyhedra__library_1_1Invalid__Argument__Exception) (classparma__polyhedra__library_1_1Linear__Expression_0c0b91260da0f4729a335faa3747c397)] +>> endobj +2567 0 obj << +/Names [(classparma__polyhedra__library_1_1Linear__Expression_2a76c9ab182bf0cbd015cea16a24c635) 1192 0 R (classparma__polyhedra__library_1_1Linear__Expression_3866453e844ec10e038e9ae2b336159d) 1190 0 R (classparma__polyhedra__library_1_1Linear__Expression_491b55e596bb0dc1e707355a1b2169b5) 1195 0 R (classparma__polyhedra__library_1_1Linear__Expression__Coefficient) 549 0 R (classparma__polyhedra__library_1_1Linear__Expression__Coefficient_24d3c42f7ed7c7a99a8a2bb5369eed4d) 1201 0 R (classparma__polyhedra__library_1_1Linear__Expression__Coefficient_ab30b6ef6e87a1df35c14d15237af04c) 1223 0 R] +/Limits [(classparma__polyhedra__library_1_1Linear__Expression_2a76c9ab182bf0cbd015cea16a24c635) (classparma__polyhedra__library_1_1Linear__Expression__Coefficient_ab30b6ef6e87a1df35c14d15237af04c)] +>> endobj +2568 0 obj << +/Names [(classparma__polyhedra__library_1_1Linear__Expression__Coefficient_b531066aa6dba222c8c61a8c3978257d) 1200 0 R (classparma__polyhedra__library_1_1Linear__Expression__Coefficient_edf10f9d2de45d7e8de1809d4417741b) 1202 0 R (classparma__polyhedra__library_1_1Linear__Expression__Difference) 550 0 R (classparma__polyhedra__library_1_1Linear__Expression__Difference_2b2271e2f858709aef3d3705ac8c075d) 1232 0 R (classparma__polyhedra__library_1_1Linear__Expression__Difference_6e2a52ee587e255b6172f976f5a823d1) 1229 0 R (classparma__polyhedra__library_1_1Linear__Expression__Difference_87e8e31d3cf9dbe3c2e1041ea8ccf873) 1231 0 R] +/Limits [(classparma__polyhedra__library_1_1Linear__Expression__Coefficient_b531066aa6dba222c8c61a8c3978257d) (classparma__polyhedra__library_1_1Linear__Expression__Difference_87e8e31d3cf9dbe3c2e1041ea8ccf873)] +>> endobj +2569 0 obj << +/Names [(classparma__polyhedra__library_1_1Linear__Expression__Difference_d213660ecdcc0e4142a2fd7536489781) 1227 0 R (classparma__polyhedra__library_1_1Linear__Expression__Difference_d6e4fdbf5475e6d24aaffaceb4a4abf9) 1226 0 R (classparma__polyhedra__library_1_1Linear__Expression__Difference_f0e7fc37eefdbd145c4e9203cfd5e5e7) 1228 0 R (classparma__polyhedra__library_1_1Linear__Expression__Sum) 551 0 R (classparma__polyhedra__library_1_1Linear__Expression__Sum_26114c4deaf17e8a12123a0a8f760d5d) 1265 0 R (classparma__polyhedra__library_1_1Linear__Expression__Sum_8bacbf073ef0e1064e8c53ede4ad59bd) 1263 0 R] +/Limits [(classparma__polyhedra__library_1_1Linear__Expression__Difference_d213660ecdcc0e4142a2fd7536489781) (classparma__polyhedra__library_1_1Linear__Expression__Sum_8bacbf073ef0e1064e8c53ede4ad59bd)] +>> endobj +2570 0 obj << +/Names [(classparma__polyhedra__library_1_1Linear__Expression__Sum_8d44f98f79421126eba1448fb80331b4) 1267 0 R (classparma__polyhedra__library_1_1Linear__Expression__Sum_e1191ef860c3201d40fa4e20fd02ba2d) 1268 0 R (classparma__polyhedra__library_1_1Linear__Expression__Sum_e42dcbc09bb42d181a19512206d15f70) 1264 0 R (classparma__polyhedra__library_1_1Linear__Expression__Sum_ef62be6cb1c9f4c4f3aff2c5f456c374) 1262 0 R (classparma__polyhedra__library_1_1Linear__Expression__Times) 552 0 R (classparma__polyhedra__library_1_1Linear__Expression__Times_015f6e2febd260a93299564dfde659e5) 1272 0 R] +/Limits [(classparma__polyhedra__library_1_1Linear__Expression__Sum_8d44f98f79421126eba1448fb80331b4) (classparma__polyhedra__library_1_1Linear__Expression__Times_015f6e2febd260a93299564dfde659e5)] +>> endobj +2571 0 obj << +/Names [(classparma__polyhedra__library_1_1Linear__Expression__Times_121be923ed152a60238e69a8296bf966) 1296 0 R (classparma__polyhedra__library_1_1Linear__Expression__Times_4b0fc20a0d733d684c6a4e7e8f49c174) 1297 0 R (classparma__polyhedra__library_1_1Linear__Expression__Times_6dec5edff0aa73961373ed7e1b9e0729) 1271 0 R (classparma__polyhedra__library_1_1Linear__Expression__Times_7f106ecc8b4f062f0b2b53cd3098e50c) 1294 0 R (classparma__polyhedra__library_1_1Linear__Expression__Times_ffc79b9a795454f61542224d1b0dea1a) 1293 0 R (classparma__polyhedra__library_1_1Linear__Expression__Unary__Minus) 553 0 R] +/Limits [(classparma__polyhedra__library_1_1Linear__Expression__Times_121be923ed152a60238e69a8296bf966) (classparma__polyhedra__library_1_1Linear__Expression__Unary__Minus)] +>> endobj +2572 0 obj << +/Names [(classparma__polyhedra__library_1_1Linear__Expression__Unary__Minus_2834d46309af2717b28dc79843e1331d) 1302 0 R (classparma__polyhedra__library_1_1Linear__Expression__Unary__Minus_2f88b2137b58031e4838f19daff12f4a) 1304 0 R (classparma__polyhedra__library_1_1Linear__Expression__Unary__Minus_a51b2de39e7e3568d5c9322de4b0454b) 1300 0 R (classparma__polyhedra__library_1_1Linear__Expression__Unary__Minus_ab53a108e173a6657e2af82a66ea3737) 1301 0 R (classparma__polyhedra__library_1_1Linear__Expression__Variable) 554 0 R (classparma__polyhedra__library_1_1Linear__Expression__Variable_5c54fa6c29a576ab9de69361d15f8b17) 1321 0 R] +/Limits [(classparma__polyhedra__library_1_1Linear__Expression__Unary__Minus_2834d46309af2717b28dc79843e1331d) (classparma__polyhedra__library_1_1Linear__Expression__Variable_5c54fa6c29a576ab9de69361d15f8b17)] +>> endobj +2573 0 obj << +/Names [(classparma__polyhedra__library_1_1Linear__Expression__Variable_642f2ab97bf846e69686a874001a9930) 1320 0 R (classparma__polyhedra__library_1_1Linear__Expression__Variable_e2482d18059a20a1cea2423a8b3d1043) 1322 0 R (classparma__polyhedra__library_1_1Linear__Expression_af751a048f4895ec1ca6eb753a196908) 1191 0 R (classparma__polyhedra__library_1_1Linear__Expression_d3d011ec5cd66a3e9bf71053d6b818b5) 1189 0 R (classparma__polyhedra__library_1_1Linear__Expression_f5d9b1e4dec7faf038dd87f36773252b) 1193 0 R (classparma__polyhedra__library_1_1Logic__Error__Exception) 555 0 R] +/Limits [(classparma__polyhedra__library_1_1Linear__Expression__Variable_642f2ab97bf846e69686a874001a9930) (classparma__polyhedra__library_1_1Logic__Error__Exception)] +>> endobj +2574 0 obj << +/Names [(classparma__polyhedra__library_1_1Logic__Error__Exception_11bc5303b1d7a594017971538e60858f) 1325 0 R (classparma__polyhedra__library_1_1MIP__Problem) 556 0 R (classparma__polyhedra__library_1_1MIP__Problem_053b3ad9ab9c0920ee835d51589cb703) 1439 0 R (classparma__polyhedra__library_1_1MIP__Problem_1a896ee4273234f7c7181d76bdd9260f) 1363 0 R (classparma__polyhedra__library_1_1MIP__Problem_203692374bea9a641aba897049f2ae03) 1413 0 R (classparma__polyhedra__library_1_1MIP__Problem_23fb2ed36793d2fa8974d9b6c3f93705) 1362 0 R] +/Limits [(classparma__polyhedra__library_1_1Logic__Error__Exception_11bc5303b1d7a594017971538e60858f) (classparma__polyhedra__library_1_1MIP__Problem_23fb2ed36793d2fa8974d9b6c3f93705)] +>> endobj +2575 0 obj << +/Names [(classparma__polyhedra__library_1_1MIP__Problem_2d9c6ed1390e4148c2fccb3491c7b4a7) 1404 0 R (classparma__polyhedra__library_1_1MIP__Problem_31c3eb3b5ccbe373dc04fe4d86234b87) 1416 0 R (classparma__polyhedra__library_1_1MIP__Problem_49981873be6474f7f399f1f54bc8861d) 1361 0 R (classparma__polyhedra__library_1_1MIP__Problem_4c0dddb2c112aeef626eef4d7e539d2d) 1410 0 R (classparma__polyhedra__library_1_1MIP__Problem_4cdcdb051551e8a23b6ff80a3294c5de) 1358 0 R (classparma__polyhedra__library_1_1MIP__Problem_4dfc6347addaec85187c46bff12def97) 1367 0 R] +/Limits [(classparma__polyhedra__library_1_1MIP__Problem_2d9c6ed1390e4148c2fccb3491c7b4a7) (classparma__polyhedra__library_1_1MIP__Problem_4dfc6347addaec85187c46bff12def97)] +>> endobj +2576 0 obj << +/Names [(classparma__polyhedra__library_1_1MIP__Problem_52edb70858467236238aaec3b1884d37) 1403 0 R (classparma__polyhedra__library_1_1MIP__Problem_54d7ba808dcfc372e231fe597f5daf1f) 1434 0 R (classparma__polyhedra__library_1_1MIP__Problem_5b935844aeba5303d77ca82130998245) 1402 0 R (classparma__polyhedra__library_1_1MIP__Problem_64a91a5f142efd873b50d2cb7d27e660) 1356 0 R (classparma__polyhedra__library_1_1MIP__Problem_75aa539f287d460bc26a347512e51760) 1419 0 R (classparma__polyhedra__library_1_1MIP__Problem_7c8c10d940074e8ec96a4d319b88e490) 1411 0 R] +/Limits [(classparma__polyhedra__library_1_1MIP__Problem_52edb70858467236238aaec3b1884d37) (classparma__polyhedra__library_1_1MIP__Problem_7c8c10d940074e8ec96a4d319b88e490)] +>> endobj +2577 0 obj << +/Names [(classparma__polyhedra__library_1_1MIP__Problem_7fa63d4674ffff39446dd46ed0c26e6f) 1366 0 R (classparma__polyhedra__library_1_1MIP__Problem_81cb4962caaa75c19cdf6c8a5af4e46b) 1417 0 R (classparma__polyhedra__library_1_1MIP__Problem_ab8f9339a589d7ecd8eba424cd8c8d3f) 1415 0 R (classparma__polyhedra__library_1_1MIP__Problem_c2cab9caa4fff25fd03b1012a0c8cf5b) 1357 0 R (classparma__polyhedra__library_1_1MIP__Problem_caf3268d04168d4d22ebe73d9578d7d5) 1435 0 R (classparma__polyhedra__library_1_1MIP__Problem_caffbc7bc53bf538c9d8a75cb4a7e872) 1364 0 R] +/Limits [(classparma__polyhedra__library_1_1MIP__Problem_7fa63d4674ffff39446dd46ed0c26e6f) (classparma__polyhedra__library_1_1MIP__Problem_caffbc7bc53bf538c9d8a75cb4a7e872)] +>> endobj +2578 0 obj << +/Names [(classparma__polyhedra__library_1_1MIP__Problem_cf903011430930b9c3afca546ecb07db) 1414 0 R (classparma__polyhedra__library_1_1MIP__Problem_d202d113166e7f68344ee82ba6e7b0fd) 1405 0 R (classparma__polyhedra__library_1_1MIP__Problem_e0371bb311150040a06e7839efb57a83) 1360 0 R (classparma__polyhedra__library_1_1MIP__Problem_e1db1d48c605e6f79aa78ea2a4a9cda7) 1365 0 R (classparma__polyhedra__library_1_1MIP__Problem_ee14b86bac3475fb14914092715b5916) 1368 0 R (classparma__polyhedra__library_1_1MIP__Problem_f27bf62f81d315063d66dc394ef9559c) 1409 0 R] +/Limits [(classparma__polyhedra__library_1_1MIP__Problem_cf903011430930b9c3afca546ecb07db) (classparma__polyhedra__library_1_1MIP__Problem_f27bf62f81d315063d66dc394ef9559c)] +>> endobj +2579 0 obj << +/Names [(classparma__polyhedra__library_1_1MIP__Problem_f66f20c1209205a55c53e42c83761b82) 1412 0 R (classparma__polyhedra__library_1_1MIP__Problem_fa2c94e0b2f7b773f7d2daf6d53f9874) 1418 0 R (classparma__polyhedra__library_1_1Overflow__Error__Exception) 557 0 R (classparma__polyhedra__library_1_1Overflow__Error__Exception_6c67cb8304bf0e784ad1aa328e82e20e) 1473 0 R (classparma__polyhedra__library_1_1Pair_3_01K_00_01V_01_4) 558 0 R (classparma__polyhedra__library_1_1Pair_3_01K_00_01V_01_4_5c1e588b7f6a9f94b053a5cec723dfe6) 1489 0 R] +/Limits [(classparma__polyhedra__library_1_1MIP__Problem_f66f20c1209205a55c53e42c83761b82) (classparma__polyhedra__library_1_1Pair_3_01K_00_01V_01_4_5c1e588b7f6a9f94b053a5cec723dfe6)] +>> endobj +2580 0 obj << +/Names [(classparma__polyhedra__library_1_1Pair_3_01K_00_01V_01_4_637f0b668a07b52f0fc9454c13f4d16e) 1490 0 R (classparma__polyhedra__library_1_1Parma__Polyhedra__Library) 559 0 R (classparma__polyhedra__library_1_1Parma__Polyhedra__Library_0f295b8b6083b12c373b48417ae8a466) 1496 0 R (classparma__polyhedra__library_1_1Parma__Polyhedra__Library_3d5082778a4123e14fc66912860bb420) 1512 0 R (classparma__polyhedra__library_1_1Parma__Polyhedra__Library_4254863fcee52d3a2ee594e14999fc21) 1510 0 R (classparma__polyhedra__library_1_1Parma__Polyhedra__Library_51207bdf0804635cce036bd6b6459abf) 1493 0 R] +/Limits [(classparma__polyhedra__library_1_1Pair_3_01K_00_01V_01_4_637f0b668a07b52f0fc9454c13f4d16e) (classparma__polyhedra__library_1_1Parma__Polyhedra__Library_51207bdf0804635cce036bd6b6459abf)] +>> endobj +2581 0 obj << +/Names [(classparma__polyhedra__library_1_1Parma__Polyhedra__Library_8219b76f7582cc02ef563bf70b045ae6) 1507 0 R (classparma__polyhedra__library_1_1Parma__Polyhedra__Library_868e2f5d243f0fa2bbc4abef8f68fc74) 1515 0 R (classparma__polyhedra__library_1_1Parma__Polyhedra__Library_952c4e092ec518368be278c13c689acd) 1494 0 R (classparma__polyhedra__library_1_1Parma__Polyhedra__Library_9f9880633bb81d02f27e6fb22dc83bdc) 1495 0 R (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron) 561 0 R (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron_0ae5c861cdc8a2fed1057cb873c928fc) 1567 0 R] +/Limits [(classparma__polyhedra__library_1_1Parma__Polyhedra__Library_8219b76f7582cc02ef563bf70b045ae6) (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron_0ae5c861cdc8a2fed1057cb873c928fc)] +>> endobj +2582 0 obj << +/Names [(classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron_1deba0aacc90a96b069e32f8c3d4559e) 1569 0 R (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron_25fcf44b7620128ac3646cf9cb7ec333) 1566 0 R (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron_307f552cb6559fb3316979350f0698e4) 1560 0 R (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron_43f91b349368a1f43667546d2d844941) 1565 0 R (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron_6a0c0235057e5bd924816e77fbe24f13) 1563 0 R (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron_91754711e181bd642b50021a3750ba1b) 1562 0 R] +/Limits [(classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron_1deba0aacc90a96b069e32f8c3d4559e) (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron_91754711e181bd642b50021a3750ba1b)] +>> endobj +2583 0 obj << +/Names [(classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator) 562 0 R (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator_041438b5dfc0a27bb1ef8944ccef9b20) 1592 0 R (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator_1063791d47e047aeeb186ba499482460) 1595 0 R (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator_3e689b13a25dfaf0b6f22b21127bf4f9) 1596 0 R (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator_4b29f6a5bfc34297ed8cad2fc85141ef) 1598 0 R (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator_5204a6f9136985b1cf438bea23fd9489) 1599 0 R] +/Limits [(classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator) (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator_5204a6f9136985b1cf438bea23fd9489)] +>> endobj +2584 0 obj << +/Names [(classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator_8f633594965f90e853f0a0b7d9667e7a) 1594 0 R (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator_d6b10e19a21f12cc1e19304c400cbcc9) 1593 0 R (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron_b86276be6b184ca176f526bdce7db8cb) 1564 0 R (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron_cb627ec2ad25203404db2046bd1b415c) 1561 0 R (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron_d3ecaaf79c9a60ab4848342458e261d7) 1571 0 R (classparma__polyhedra__library_1_1Poly__Con__Relation) 563 0 R] +/Limits [(classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator_8f633594965f90e853f0a0b7d9667e7a) (classparma__polyhedra__library_1_1Poly__Con__Relation)] +>> endobj +2585 0 obj << +/Names [(classparma__polyhedra__library_1_1Poly__Con__Relation_0b8fd6b1ed827658839d73fcb11d4755) 1626 0 R (classparma__polyhedra__library_1_1Poly__Con__Relation_0ce79e66e5f99bf6dae5077d3eeb15a8) 1629 0 R (classparma__polyhedra__library_1_1Poly__Con__Relation_103c1a923368f15f9846bb63c5fc8bcd) 1628 0 R (classparma__polyhedra__library_1_1Poly__Con__Relation_5703e74effb8a5b4090be08699d6b808) 1623 0 R (classparma__polyhedra__library_1_1Poly__Con__Relation_86ef4d8f3963d0e41bd32e5745b2b161) 1624 0 R (classparma__polyhedra__library_1_1Poly__Con__Relation_981388a9978a768d9859bc6a05b59612) 1630 0 R] +/Limits [(classparma__polyhedra__library_1_1Poly__Con__Relation_0b8fd6b1ed827658839d73fcb11d4755) (classparma__polyhedra__library_1_1Poly__Con__Relation_981388a9978a768d9859bc6a05b59612)] +>> endobj +2586 0 obj << +/Names [(classparma__polyhedra__library_1_1Poly__Con__Relation_d487a3b3a0d3590dd3678cf333549f47) 1627 0 R (classparma__polyhedra__library_1_1Poly__Gen__Relation) 564 0 R (classparma__polyhedra__library_1_1Poly__Gen__Relation_52e2da847dc03a6a0bd03eb718bbc2c5) 1651 0 R (classparma__polyhedra__library_1_1Poly__Gen__Relation_a542fab30058371e9f17fca3eb84724b) 1648 0 R (classparma__polyhedra__library_1_1Poly__Gen__Relation_ba48365387e24282c5facb79d544df54) 1649 0 R (classparma__polyhedra__library_1_1Poly__Gen__Relation_c9b4e9cbc50b16d0b8eae819ba758bb1) 1652 0 R] +/Limits [(classparma__polyhedra__library_1_1Poly__Con__Relation_d487a3b3a0d3590dd3678cf333549f47) (classparma__polyhedra__library_1_1Poly__Gen__Relation_c9b4e9cbc50b16d0b8eae819ba758bb1)] +>> endobj +2587 0 obj << +/Names [(classparma__polyhedra__library_1_1Polyhedron) 565 0 R (classparma__polyhedra__library_1_1Polyhedron_0c39fad28012b1e32b3bb3f51aa395e9) 1819 0 R (classparma__polyhedra__library_1_1Polyhedron_0c70e4b9986758a2c5cfabd0968c80a2) 1927 0 R (classparma__polyhedra__library_1_1Polyhedron_0d6e2bbaaefe11efb5429fe1a61e3d22) 1954 0 R (classparma__polyhedra__library_1_1Polyhedron_0db3ec1fb2ff3022b06cd0760dbc9b11) 1810 0 R (classparma__polyhedra__library_1_1Polyhedron_0debe61d4b261fe21a4109f8920557e0) 1753 0 R] +/Limits [(classparma__polyhedra__library_1_1Polyhedron) (classparma__polyhedra__library_1_1Polyhedron_0debe61d4b261fe21a4109f8920557e0)] +>> endobj +2588 0 obj << +/Names [(classparma__polyhedra__library_1_1Polyhedron_0f157e4c644b4ca57dc6d0ffe0509ae2) 1816 0 R (classparma__polyhedra__library_1_1Polyhedron_101725c81694df74ced9b4f2cca1fbad) 1747 0 R (classparma__polyhedra__library_1_1Polyhedron_178d863fdd91da50df37aac742b5f89b) 1924 0 R (classparma__polyhedra__library_1_1Polyhedron_1d1b69611f06c6e9aa03fd1b951573f8) 1697 0 R (classparma__polyhedra__library_1_1Polyhedron_250dcd46824fa3fcc48f2dd92a8293ea) 1877 0 R (classparma__polyhedra__library_1_1Polyhedron_25143e2f87da1099e3cb5c065a2e0890) 1695 0 R] +/Limits [(classparma__polyhedra__library_1_1Polyhedron_0f157e4c644b4ca57dc6d0ffe0509ae2) (classparma__polyhedra__library_1_1Polyhedron_25143e2f87da1099e3cb5c065a2e0890)] +>> endobj +2589 0 obj << +/Names [(classparma__polyhedra__library_1_1Polyhedron_269b05089d9f1a4c329d5f5f1fe87dec) 1756 0 R (classparma__polyhedra__library_1_1Polyhedron_27c32393002b42d894f964a5d60af964) 1955 0 R (classparma__polyhedra__library_1_1Polyhedron_2a7c7870e8a2d07650293ccce8893174) 1811 0 R (classparma__polyhedra__library_1_1Polyhedron_2c5d0c7fb2c1bbaa9359ed0b497152cf) 1867 0 R (classparma__polyhedra__library_1_1Polyhedron_2d8112f8870851653e56b12e910f7e45) 1918 0 R (classparma__polyhedra__library_1_1Polyhedron_3dec267cc9fa523feea43a8c0acdbe00) 1752 0 R] +/Limits [(classparma__polyhedra__library_1_1Polyhedron_269b05089d9f1a4c329d5f5f1fe87dec) (classparma__polyhedra__library_1_1Polyhedron_3dec267cc9fa523feea43a8c0acdbe00)] +>> endobj +2590 0 obj << +/Names [(classparma__polyhedra__library_1_1Polyhedron_3e3093f0cebb7f7d4b1ac1f1dda4df5b) 1812 0 R (classparma__polyhedra__library_1_1Polyhedron_3eced5e4c9a959bf44ba28393466ed15) 1746 0 R (classparma__polyhedra__library_1_1Polyhedron_40f85671a746d80dd6a5a14292f6df72) 1878 0 R (classparma__polyhedra__library_1_1Polyhedron_45dd7fcc9b518abdc94c454b66ba1d5b) 1758 0 R (classparma__polyhedra__library_1_1Polyhedron_4949285de47134b38f894d92823a931b) 1702 0 R (classparma__polyhedra__library_1_1Polyhedron_4b3c940e8c7c8981b9b2124a75e011c1) 1748 0 R] +/Limits [(classparma__polyhedra__library_1_1Polyhedron_3e3093f0cebb7f7d4b1ac1f1dda4df5b) (classparma__polyhedra__library_1_1Polyhedron_4b3c940e8c7c8981b9b2124a75e011c1)] +>> endobj +2591 0 obj << +/Names [(classparma__polyhedra__library_1_1Polyhedron_4ee0954f71183611c9b29ad07ad9fba2) 1744 0 R (classparma__polyhedra__library_1_1Polyhedron_50926d4c45d6e451ccec518c8051733c) 1700 0 R (classparma__polyhedra__library_1_1Polyhedron_52cb475c174028850d7ddd0998e089bf) 1868 0 R (classparma__polyhedra__library_1_1Polyhedron_56bf9c6096c448f27d61416f27a05db1) 1691 0 R (classparma__polyhedra__library_1_1Polyhedron_5b00da433f9d9473b1fbd2cdf6c5976e) 1813 0 R (classparma__polyhedra__library_1_1Polyhedron_5b12ca4fb2557b59516d1bbb2e30fa43) 1806 0 R] +/Limits [(classparma__polyhedra__library_1_1Polyhedron_4ee0954f71183611c9b29ad07ad9fba2) (classparma__polyhedra__library_1_1Polyhedron_5b12ca4fb2557b59516d1bbb2e30fa43)] +>> endobj +2592 0 obj << +/Names [(classparma__polyhedra__library_1_1Polyhedron_5c870a4502b7d88bf273472936bf4fb8) 1931 0 R (classparma__polyhedra__library_1_1Polyhedron_5d5942488536d6a9095fc4bdebb9f7ed) 1759 0 R (classparma__polyhedra__library_1_1Polyhedron_5e9ac1ca10b983f0dee8146e6e95370b) 1873 0 R (classparma__polyhedra__library_1_1Polyhedron_5f7cb393111807edd0542e1e4367f249) 1876 0 R (classparma__polyhedra__library_1_1Polyhedron_6661b721ae109cee00992746554acf53) 1919 0 R (classparma__polyhedra__library_1_1Polyhedron_6e67cd103e4b330d46ded91f0ed0ec2b) 1820 0 R] +/Limits [(classparma__polyhedra__library_1_1Polyhedron_5c870a4502b7d88bf273472936bf4fb8) (classparma__polyhedra__library_1_1Polyhedron_6e67cd103e4b330d46ded91f0ed0ec2b)] +>> endobj +2593 0 obj << +/Names [(classparma__polyhedra__library_1_1Polyhedron_6e6eb647853269db9de88ed234a16656) 1818 0 R (classparma__polyhedra__library_1_1Polyhedron_7817a26193f804a89ffeb2dbf18fc702) 1754 0 R (classparma__polyhedra__library_1_1Polyhedron_79d4ff349ca7b314602b79a2d74fe976) 1870 0 R (classparma__polyhedra__library_1_1Polyhedron_81c4315daec6710e58a0617d92839e81) 1694 0 R (classparma__polyhedra__library_1_1Polyhedron_84625e35d755ced248ffe55750614f09) 1690 0 R (classparma__polyhedra__library_1_1Polyhedron_88d0ec91f9e05922238463630dccc296) 1922 0 R] +/Limits [(classparma__polyhedra__library_1_1Polyhedron_6e6eb647853269db9de88ed234a16656) (classparma__polyhedra__library_1_1Polyhedron_88d0ec91f9e05922238463630dccc296)] +>> endobj +2594 0 obj << +/Names [(classparma__polyhedra__library_1_1Polyhedron_894ed94e4bfdc07cd6ef5d45e5c464b7) 1929 0 R (classparma__polyhedra__library_1_1Polyhedron_8b521c98491fa559861dae11ad3ec3f3) 1689 0 R (classparma__polyhedra__library_1_1Polyhedron_94e51c5141f6c2a46e4c8d8aaea539b4) 1871 0 R (classparma__polyhedra__library_1_1Polyhedron_951904ccc728d261cf367a0bc613478d) 1698 0 R (classparma__polyhedra__library_1_1Polyhedron_95849529fc06d893870e1b39fe009db8) 1923 0 R (classparma__polyhedra__library_1_1Polyhedron_9a21e654ffec08b0a79e6aa5ec29d72d) 1872 0 R] +/Limits [(classparma__polyhedra__library_1_1Polyhedron_894ed94e4bfdc07cd6ef5d45e5c464b7) (classparma__polyhedra__library_1_1Polyhedron_9a21e654ffec08b0a79e6aa5ec29d72d)] +>> endobj +2595 0 obj << +/Names [(classparma__polyhedra__library_1_1Polyhedron_9f7d55f53c6ca0b56163de733c0bca5d) 1699 0 R (classparma__polyhedra__library_1_1Polyhedron_a7225f4984a8ca7b4701b78e9aa545b3) 1821 0 R (classparma__polyhedra__library_1_1Polyhedron_a8a9da2a38c61eb14ed1922e970552ba) 1749 0 R (classparma__polyhedra__library_1_1Polyhedron_a9a506db5b2ca3606ffdc72bae993831) 1930 0 R (classparma__polyhedra__library_1_1Polyhedron_ac326b042c380a004289377eca7d2342) 1869 0 R (classparma__polyhedra__library_1_1Polyhedron_ad130af7dc19af625d583e25020026e1) 1696 0 R] +/Limits [(classparma__polyhedra__library_1_1Polyhedron_9f7d55f53c6ca0b56163de733c0bca5d) (classparma__polyhedra__library_1_1Polyhedron_ad130af7dc19af625d583e25020026e1)] +>> endobj +2596 0 obj << +/Names [(classparma__polyhedra__library_1_1Polyhedron_af462d898fecd8d545ce48f6a0632c3e) 1807 0 R (classparma__polyhedra__library_1_1Polyhedron_b492b453a39228bad565e4964c7ad257) 1921 0 R (classparma__polyhedra__library_1_1Polyhedron_b7c4fb00dc7b0fff7edbe9d80ad15ae6) 1701 0 R (classparma__polyhedra__library_1_1Polyhedron_b8b346098cc00bd96852efadc70e42d3) 1745 0 R (classparma__polyhedra__library_1_1Polyhedron_bc5704127ba61d2413c9bff4fd30f323) 1755 0 R (classparma__polyhedra__library_1_1Polyhedron_be395df0f967ad2074e87c95cab973ee) 1817 0 R] +/Limits [(classparma__polyhedra__library_1_1Polyhedron_af462d898fecd8d545ce48f6a0632c3e) (classparma__polyhedra__library_1_1Polyhedron_be395df0f967ad2074e87c95cab973ee)] +>> endobj +2597 0 obj << +/Names [(classparma__polyhedra__library_1_1Polyhedron_beedcb4af89476e04d9b358ae522dab0) 1926 0 R (classparma__polyhedra__library_1_1Polyhedron_c302814cfa610b65b7e92426d20b7efd) 1757 0 R (classparma__polyhedra__library_1_1Polyhedron_c4f92e1418a46d38b818059a3dadab69) 1704 0 R (classparma__polyhedra__library_1_1Polyhedron_c5dfab82eea6ba1f83cbebca0237b084) 1805 0 R (classparma__polyhedra__library_1_1Polyhedron_c72ffc5f5715e6a10e6d5e63a43b6e9e) 1703 0 R (classparma__polyhedra__library_1_1Polyhedron_d078549415d6b45298d374eb3b6f5c7d) 1956 0 R] +/Limits [(classparma__polyhedra__library_1_1Polyhedron_beedcb4af89476e04d9b358ae522dab0) (classparma__polyhedra__library_1_1Polyhedron_d078549415d6b45298d374eb3b6f5c7d)] +>> endobj +2598 0 obj << +/Names [(classparma__polyhedra__library_1_1Polyhedron_d0f0c9ad050583abd703aaedb6e5cca1) 1693 0 R (classparma__polyhedra__library_1_1Polyhedron_d453d2930f64cc40ad0b5dbe4ac50c07) 1814 0 R (classparma__polyhedra__library_1_1Polyhedron_d8155c4d2baca71b59e67eb7396bb18c) 1928 0 R (classparma__polyhedra__library_1_1Polyhedron_db6d91da0ca1b3f0f9b755297ab69722) 1808 0 R (classparma__polyhedra__library_1_1Polyhedron_dd26476af2dfda6abbb7508ef88cae2d) 1917 0 R (classparma__polyhedra__library_1_1Polyhedron_dd544c3d22008bb22d0b6fa536c651dd) 1692 0 R] +/Limits [(classparma__polyhedra__library_1_1Polyhedron_d0f0c9ad050583abd703aaedb6e5cca1) (classparma__polyhedra__library_1_1Polyhedron_dd544c3d22008bb22d0b6fa536c651dd)] +>> endobj +2599 0 obj << +/Names [(classparma__polyhedra__library_1_1Polyhedron_e44edf9029d653931c7a450481127e14) 1925 0 R (classparma__polyhedra__library_1_1Polyhedron_e4e82dc62f09b889cc2c699b6a8abda1) 1750 0 R (classparma__polyhedra__library_1_1Polyhedron_ea3d6d51b260b5aa832a1a3a68ac98a0) 1815 0 R (classparma__polyhedra__library_1_1Polyhedron_f15807720fca193200fa6ea8627ef10b) 1916 0 R (classparma__polyhedra__library_1_1Polyhedron_f212c66bfb25b5b1949ee91f0e4b48ab) 1751 0 R (classparma__polyhedra__library_1_1Polyhedron_f31626a3fd875ced253836666b29990b) 1809 0 R] +/Limits [(classparma__polyhedra__library_1_1Polyhedron_e44edf9029d653931c7a450481127e14) (classparma__polyhedra__library_1_1Polyhedron_f31626a3fd875ced253836666b29990b)] +>> endobj +2600 0 obj << +/Names [(classparma__polyhedra__library_1_1Polyhedron_f3ff44da0089b15593e3ce719e37e677) 1874 0 R (classparma__polyhedra__library_1_1Polyhedron_faf7844389329a23b58abf355ae79ded) 1875 0 R (classparma__polyhedra__library_1_1Variable) 591 0 R (classparma__polyhedra__library_1_1Variable_293bf4ae6670add8afd68cbca2edd0e5) 2162 0 R (classparma__polyhedra__library_1_1Variable_a771ef39be258755e151cd5edb617e94) 2159 0 R (classparma__polyhedra__library_1_1Variable_df4acacc53bd647f2c4ccaac0aa7643a) 2158 0 R] +/Limits [(classparma__polyhedra__library_1_1Polyhedron_f3ff44da0089b15593e3ce719e37e677) (classparma__polyhedra__library_1_1Variable_df4acacc53bd647f2c4ccaac0aa7643a)] +>> endobj +2601 0 obj << +/Names [(classparma__polyhedra__library_1_1Variables__Set) 592 0 R (classparma__polyhedra__library_1_1Variables__Set_961dfccd93ec291961f9938db0c86b2d) 2170 0 R (group__PPL__Java__interface) 589 0 R (group__PPL__Java__interface_g0cd3c405aa537a001f59e642f2acddd3) 662 0 R (group__PPL__Java__interface_g16616f4113ae69d86cdaf2b7b10cc0d6) 672 0 R (group__PPL__Java__interface_g464c2bc94f19f4509ffedb8b7b60439a) 675 0 R] +/Limits [(classparma__polyhedra__library_1_1Variables__Set) (group__PPL__Java__interface_g464c2bc94f19f4509ffedb8b7b60439a)] +>> endobj +2602 0 obj << +/Names [(group__PPL__Java__interface_g9006be5f6c0f7616400b3554738e732f) 666 0 R (group__PPL__Java__interface_gb884929ad9e98d94cac675f7fe3e9771) 706 0 R (group__PPL__Java__interface_gccd1fa9f287c6fe48bd8dfd920a5397b) 709 0 R (group__PPL__Java__interface_gd7cbdacd9a5e2c068c25c12f47f8936a) 682 0 R (group__PPL__Java__interface_ge444adc8164dfda0378177ddab117095) 680 0 R (group__PPL__Java__interface_ge574051d412d3ee587c872f48de81663) 668 0 R] +/Limits [(group__PPL__Java__interface_g9006be5f6c0f7616400b3554738e732f) (group__PPL__Java__interface_ge574051d412d3ee587c872f48de81663)] +>> endobj +2603 0 obj << +/Names [(group__PPL__Java__interface_gg0cd3c405aa537a001f59e642f2acddd372e00beade5e3123d604866d4318562c) 664 0 R (group__PPL__Java__interface_gg0cd3c405aa537a001f59e642f2acddd3d48fce92c56bf2ff6ee0ffeeba90de18) 663 0 R (group__PPL__Java__interface_gg0cd3c405aa537a001f59e642f2acddd3e0c67618b9d2e22a193c392f031ddbc1) 665 0 R (group__PPL__Java__interface_gg16616f4113ae69d86cdaf2b7b10cc0d634c41f8889b9f0e04d597dfeaa1d356b) 673 0 R (group__PPL__Java__interface_gg16616f4113ae69d86cdaf2b7b10cc0d6985226363a0c8f82ffd9eccd025e9d79) 674 0 R (group__PPL__Java__interface_gg464c2bc94f19f4509ffedb8b7b60439a4f9ea739b8717fe026aba79a67be5cc6) 677 0 R] +/Limits [(group__PPL__Java__interface_gg0cd3c405aa537a001f59e642f2acddd372e00beade5e3123d604866d4318562c) (group__PPL__Java__interface_gg464c2bc94f19f4509ffedb8b7b60439a4f9ea739b8717fe026aba79a67be5cc6)] +>> endobj +2604 0 obj << +/Names [(group__PPL__Java__interface_gg464c2bc94f19f4509ffedb8b7b60439a8e71cc2282a035560ecc13c306e79a99) 679 0 R (group__PPL__Java__interface_gg9006be5f6c0f7616400b3554738e732fe64f42c3dc2245c0a2dfdfdf81804916) 667 0 R (group__PPL__Java__interface_ggb884929ad9e98d94cac675f7fe3e97713b313393fbe3b2f84daa5d5e440d5fc9) 708 0 R (group__PPL__Java__interface_ggb884929ad9e98d94cac675f7fe3e97716123d48765236f5a4dc9b6589f3009a9) 707 0 R (group__PPL__Java__interface_ggccd1fa9f287c6fe48bd8dfd920a5397b468e42a8760cc57fdc62aef53af8908e) 713 0 R (group__PPL__Java__interface_ggccd1fa9f287c6fe48bd8dfd920a5397b671181c4f0b106836b2bfa9c51d75464) 711 0 R] +/Limits [(group__PPL__Java__interface_gg464c2bc94f19f4509ffedb8b7b60439a8e71cc2282a035560ecc13c306e79a99) (group__PPL__Java__interface_ggccd1fa9f287c6fe48bd8dfd920a5397b671181c4f0b106836b2bfa9c51d75464)] +>> endobj +2605 0 obj << +/Names [(group__PPL__Java__interface_ggccd1fa9f287c6fe48bd8dfd920a5397b7efe7873dcfccf876422dfa5f1fdc5a8) 712 0 R (group__PPL__Java__interface_ggccd1fa9f287c6fe48bd8dfd920a5397b8b42d305e53e64514a7f004b4e55f862) 714 0 R (group__PPL__Java__interface_ggccd1fa9f287c6fe48bd8dfd920a5397b8d1443a727b974ff807ec5bc5cd1dece) 710 0 R (group__PPL__Java__interface_ggd7cbdacd9a5e2c068c25c12f47f8936a50069f21f8a038aa6bda4255c9e1e79c) 684 0 R (group__PPL__Java__interface_ggd7cbdacd9a5e2c068c25c12f47f8936a6ceb40deeaaaf0f057da97c1aaac0a3c) 685 0 R (group__PPL__Java__interface_ggd7cbdacd9a5e2c068c25c12f47f8936af8a08f4943e38d19a2d06ad647e37729) 683 0 R] +/Limits [(group__PPL__Java__interface_ggccd1fa9f287c6fe48bd8dfd920a5397b7efe7873dcfccf876422dfa5f1fdc5a8) (group__PPL__Java__interface_ggd7cbdacd9a5e2c068c25c12f47f8936af8a08f4943e38d19a2d06ad647e37729)] +>> endobj +2606 0 obj << +/Names [(group__PPL__Java__interface_gge444adc8164dfda0378177ddab117095569a186f6e30ceae8ad51ca3bf7a8ccc) 678 0 R (group__PPL__Java__interface_gge444adc8164dfda0378177ddab1170956c4381dbaddfd9e2c92dc85a43dbec0f) 681 0 R (group__PPL__Java__interface_gge444adc8164dfda0378177ddab117095d72cf0b414b10649e6ad6f776273beff) 676 0 R (group__PPL__Java__interface_gge574051d412d3ee587c872f48de816632ac9e83af49bbfe366e6d82f2f3cde52) 669 0 R (group__PPL__Java__interface_gge574051d412d3ee587c872f48de8166354806b7252847b0cb5c2ca71e1ab43b3) 671 0 R (group__PPL__Java__interface_gge574051d412d3ee587c872f48de81663829fa1b449ab43dfd7a5fbd21bfbbd21) 670 0 R] +/Limits [(group__PPL__Java__interface_gge444adc8164dfda0378177ddab117095569a186f6e30ceae8ad51ca3bf7a8ccc) (group__PPL__Java__interface_gge574051d412d3ee587c872f48de81663829fa1b449ab43dfd7a5fbd21bfbbd21)] +>> endobj +2607 0 obj << +/Names [(index) 297 0 R (interfaceparma__polyhedra__library_1_1Partial__Function) 560 0 R (interfaceparma__polyhedra__library_1_1Partial__Function_b3b4fbf99544ba087c9b1bb423043849) 1531 0 R (interfaceparma__polyhedra__library_1_1Partial__Function_c89f45a1ba3b8814dbd6be95e571cdfa) 1527 0 R (interfaceparma__polyhedra__library_1_1Partial__Function_e268ac659921ee5731b202d530b9d35d) 1533 0 R (namespaceparma__polyhedra__library) 439 0 R] +/Limits [(index) (namespaceparma__polyhedra__library)] +>> endobj +2608 0 obj << +/Names [(page.1) 213 0 R (page.10) 357 0 R (page.11) 365 0 R (page.12) 379 0 R (page.13) 385 0 R (page.14) 390 0 R] +/Limits [(page.1) (page.14)] +>> endobj +2609 0 obj << +/Names [(page.15) 395 0 R (page.16) 400 0 R (page.17) 407 0 R (page.18) 438 0 R (page.19) 481 0 R (page.2) 296 0 R] +/Limits [(page.15) (page.2)] +>> endobj +2610 0 obj << +/Names [(page.20) 543 0 R (page.21) 588 0 R (page.22) 614 0 R (page.23) 651 0 R (page.24) 697 0 R (page.25) 720 0 R] +/Limits [(page.20) (page.25)] +>> endobj +2611 0 obj << +/Names [(page.26) 743 0 R (page.27) 767 0 R (page.28) 805 0 R (page.29) 826 0 R (page.3) 306 0 R (page.30) 860 0 R] +/Limits [(page.26) (page.30)] +>> endobj +2612 0 obj << +/Names [(page.31) 881 0 R (page.32) 902 0 R (page.33) 928 0 R (page.34) 956 0 R (page.35) 988 0 R (page.36) 1011 0 R] +/Limits [(page.31) (page.36)] +>> endobj +2613 0 obj << +/Names [(page.37) 1041 0 R (page.38) 1061 0 R (page.39) 1088 0 R (page.4) 313 0 R (page.40) 1106 0 R (page.41) 1122 0 R] +/Limits [(page.37) (page.41)] +>> endobj +2614 0 obj << +/Names [(page.42) 1146 0 R (page.43) 1187 0 R (page.44) 1221 0 R (page.45) 1260 0 R (page.46) 1292 0 R (page.47) 1317 0 R] +/Limits [(page.42) (page.47)] +>> endobj +2615 0 obj << +/Names [(page.48) 1354 0 R (page.49) 1401 0 R (page.5) 321 0 R (page.50) 1433 0 R (page.51) 1446 0 R (page.52) 1456 0 R] +/Limits [(page.48) (page.52)] +>> endobj +2616 0 obj << +/Names [(page.53) 1468 0 R (page.54) 1486 0 R (page.55) 1506 0 R (page.56) 1525 0 R (page.57) 1558 0 R (page.58) 1588 0 R] +/Limits [(page.53) (page.58)] +>> endobj +2617 0 obj << +/Names [(page.59) 1618 0 R (page.6) 330 0 R (page.60) 1645 0 R (page.61) 1687 0 R (page.62) 1743 0 R (page.63) 1804 0 R] +/Limits [(page.59) (page.63)] +>> endobj +2618 0 obj << +/Names [(page.64) 1861 0 R (page.65) 1915 0 R (page.66) 1947 0 R (page.67) 1964 0 R (page.68) 1975 0 R (page.69) 1987 0 R] +/Limits [(page.64) (page.69)] +>> endobj +2619 0 obj << +/Names [(page.7) 337 0 R (page.70) 2003 0 R (page.71) 2016 0 R (page.72) 2032 0 R (page.73) 2045 0 R (page.74) 2057 0 R] +/Limits [(page.7) (page.74)] +>> endobj +2620 0 obj << +/Names [(page.75) 2073 0 R (page.76) 2086 0 R (page.77) 2102 0 R (page.78) 2118 0 R (page.79) 2130 0 R (page.8) 343 0 R] +/Limits [(page.75) (page.8)] +>> endobj +2621 0 obj << +/Names [(page.80) 2141 0 R (page.81) 2156 0 R (page.82) 2168 0 R (page.83) 2226 0 R (page.84) 2299 0 R (page.85) 2400 0 R] +/Limits [(page.80) (page.85)] +>> endobj +2622 0 obj << +/Names [(page.86) 2471 0 R (page.87) 2476 0 R (page.9) 349 0 R (page.i) 246 0 R (paragraph.10.11.2.1) 1108 0 R (paragraph.10.11.2.2) 1109 0 R] +/Limits [(page.86) (paragraph.10.11.2.2)] +>> endobj +2623 0 obj << +/Names [(paragraph.10.11.2.3) 1110 0 R (paragraph.10.14.2.1) 1149 0 R (paragraph.10.2.2.1) 888 0 R (paragraph.10.2.2.2) 889 0 R (paragraph.10.2.2.3) 890 0 R (paragraph.10.2.2.4) 891 0 R] +/Limits [(paragraph.10.11.2.3) (paragraph.10.2.2.4)] +>> endobj +2624 0 obj << +/Names [(paragraph.10.2.2.5) 903 0 R (paragraph.10.2.2.6) 904 0 R (paragraph.10.2.3.1) 906 0 R (paragraph.10.2.3.2) 907 0 R (paragraph.10.24.2.1) 1438 0 R (paragraph.10.24.2.2) 1447 0 R] +/Limits [(paragraph.10.2.2.5) (paragraph.10.24.2.2)] +>> endobj +2625 0 obj << +/Names [(paragraph.10.24.3.1) 1449 0 R (paragraph.10.24.3.10) 1469 0 R (paragraph.10.24.3.11) 1470 0 R (paragraph.10.24.3.12) 1471 0 R (paragraph.10.24.3.2) 1450 0 R (paragraph.10.24.3.3) 1451 0 R] +/Limits [(paragraph.10.24.3.1) (paragraph.10.24.3.3)] +>> endobj +2626 0 obj << +/Names [(paragraph.10.24.3.4) 1457 0 R (paragraph.10.24.3.5) 1458 0 R (paragraph.10.24.3.6) 1459 0 R (paragraph.10.24.3.7) 1460 0 R (paragraph.10.24.3.8) 1461 0 R (paragraph.10.24.3.9) 1462 0 R] +/Limits [(paragraph.10.24.3.4) (paragraph.10.24.3.9)] +>> endobj +2627 0 obj << +/Names [(paragraph.10.27.2.1) 1511 0 R (paragraph.10.27.2.2) 1513 0 R (paragraph.10.27.2.3) 1516 0 R (paragraph.10.28.2.1) 1532 0 R (paragraph.10.28.2.2) 1534 0 R (paragraph.10.29.2.1) 1590 0 R] +/Limits [(paragraph.10.27.2.1) (paragraph.10.29.2.1)] +>> endobj +2628 0 obj << +/Names [(paragraph.10.3.2.1) 935 0 R (paragraph.10.30.2.1) 1621 0 R (paragraph.10.33.2.1) 1951 0 R (paragraph.10.33.2.10) 1988 0 R (paragraph.10.33.2.11) 1989 0 R (paragraph.10.33.2.12) 1990 0 R] +/Limits [(paragraph.10.3.2.1) (paragraph.10.33.2.12)] +>> endobj +2629 0 obj << +/Names [(paragraph.10.33.2.13) 1991 0 R (paragraph.10.33.2.14) 1992 0 R (paragraph.10.33.2.15) 1993 0 R (paragraph.10.33.2.16) 2004 0 R (paragraph.10.33.2.17) 2005 0 R (paragraph.10.33.2.18) 2006 0 R] +/Limits [(paragraph.10.33.2.13) (paragraph.10.33.2.18)] +>> endobj +2630 0 obj << +/Names [(paragraph.10.33.2.19) 2007 0 R (paragraph.10.33.2.2) 1952 0 R (paragraph.10.33.2.20) 2017 0 R (paragraph.10.33.2.21) 2018 0 R (paragraph.10.33.2.22) 2019 0 R (paragraph.10.33.2.23) 2020 0 R] +/Limits [(paragraph.10.33.2.19) (paragraph.10.33.2.23)] +>> endobj +2631 0 obj << +/Names [(paragraph.10.33.2.24) 2021 0 R (paragraph.10.33.2.25) 2033 0 R (paragraph.10.33.2.26) 2034 0 R (paragraph.10.33.2.27) 2035 0 R (paragraph.10.33.2.28) 2036 0 R (paragraph.10.33.2.29) 2037 0 R] +/Limits [(paragraph.10.33.2.24) (paragraph.10.33.2.29)] +>> endobj +2632 0 obj << +/Names [(paragraph.10.33.2.3) 1953 0 R (paragraph.10.33.2.30) 2046 0 R (paragraph.10.33.2.31) 2047 0 R (paragraph.10.33.2.32) 2048 0 R (paragraph.10.33.2.33) 2058 0 R (paragraph.10.33.2.34) 2060 0 R] +/Limits [(paragraph.10.33.2.3) (paragraph.10.33.2.34)] +>> endobj +2633 0 obj << +/Names [(paragraph.10.33.2.35) 2074 0 R (paragraph.10.33.2.36) 2075 0 R (paragraph.10.33.2.37) 2076 0 R (paragraph.10.33.2.38) 2077 0 R (paragraph.10.33.2.39) 2087 0 R (paragraph.10.33.2.4) 1965 0 R] +/Limits [(paragraph.10.33.2.35) (paragraph.10.33.2.4)] +>> endobj +2634 0 obj << +/Names [(paragraph.10.33.2.40) 2088 0 R (paragraph.10.33.2.41) 2089 0 R (paragraph.10.33.2.42) 2090 0 R (paragraph.10.33.2.43) 2103 0 R (paragraph.10.33.2.44) 2104 0 R (paragraph.10.33.2.45) 2105 0 R] +/Limits [(paragraph.10.33.2.40) (paragraph.10.33.2.45)] +>> endobj +2635 0 obj << +/Names [(paragraph.10.33.2.46) 2106 0 R (paragraph.10.33.2.47) 2119 0 R (paragraph.10.33.2.48) 2120 0 R (paragraph.10.33.2.49) 2121 0 R (paragraph.10.33.2.5) 1966 0 R (paragraph.10.33.2.50) 2122 0 R] +/Limits [(paragraph.10.33.2.46) (paragraph.10.33.2.50)] +>> endobj +2636 0 obj << +/Names [(paragraph.10.33.2.51) 2131 0 R (paragraph.10.33.2.52) 2132 0 R (paragraph.10.33.2.53) 2133 0 R (paragraph.10.33.2.54) 2142 0 R (paragraph.10.33.2.55) 2143 0 R (paragraph.10.33.2.56) 2145 0 R] +/Limits [(paragraph.10.33.2.51) (paragraph.10.33.2.56)] +>> endobj +2637 0 obj << +/Names [(paragraph.10.33.2.6) 1967 0 R (paragraph.10.33.2.7) 1976 0 R (paragraph.10.33.2.8) 1977 0 R (paragraph.10.33.2.9) 1978 0 R (paragraph.10.34.2.1) 2163 0 R (paragraph.10.9.2.1) 1049 0 R] +/Limits [(paragraph.10.33.2.6) (paragraph.10.9.2.1)] +>> endobj +2638 0 obj << +/Names [(paragraph.10.9.2.2) 1062 0 R (paragraph.10.9.2.3) 1063 0 R (paragraph.10.9.2.4) 1064 0 R (paragraph.10.9.2.5) 1065 0 R (paragraph.8.1.2.1) 702 0 R (paragraph.8.1.2.2) 704 0 R] +/Limits [(paragraph.10.9.2.2) (paragraph.8.1.2.2)] +>> endobj +2639 0 obj << +/Names [(paragraph.8.1.2.3) 705 0 R (paragraph.8.1.2.4) 721 0 R (paragraph.8.1.2.5) 722 0 R (paragraph.8.1.2.6) 723 0 R (paragraph.8.1.2.7) 724 0 R (paragraph.8.1.2.8) 725 0 R] +/Limits [(paragraph.8.1.2.3) (paragraph.8.1.2.8)] +>> endobj +2640 0 obj << +/Names [(paragraph.8.1.2.9) 744 0 R (section*.1) 250 0 R (section*.10) 331 0 R (section*.11) 332 0 R (section*.12) 338 0 R (section*.13) 344 0 R] +/Limits [(paragraph.8.1.2.9) (section*.13)] +>> endobj +2641 0 obj << +/Names [(section*.14) 350 0 R (section*.15) 351 0 R (section*.16) 352 0 R (section*.17) 358 0 R (section*.18) 359 0 R (section*.19) 360 0 R] +/Limits [(section*.14) (section*.19)] +>> endobj +2642 0 obj << +/Names [(section*.2) 299 0 R (section*.20) 366 0 R (section*.21) 367 0 R (section*.22) 368 0 R (section*.23) 369 0 R (section*.24) 408 0 R] +/Limits [(section*.2) (section*.24)] +>> endobj +2643 0 obj << +/Names [(section*.25) 590 0 R (section*.26) 652 0 R (section*.27) 653 0 R (section*.28) 745 0 R (section*.29) 806 0 R (section*.3) 308 0 R] +/Limits [(section*.25) (section*.3)] +>> endobj +2644 0 obj << +/Names [(section*.30) 829 0 R (section*.31) 833 0 R (section*.32) 862 0 R (section*.33) 882 0 R (section*.34) 884 0 R (section*.35) 908 0 R] +/Limits [(section*.30) (section*.35)] +>> endobj +2645 0 obj << +/Names [(section*.36) 936 0 R (section*.37) 957 0 R (section*.38) 959 0 R (section*.39) 967 0 R (section*.4) 314 0 R (section*.40) 990 0 R] +/Limits [(section*.36) (section*.40)] +>> endobj +2646 0 obj << +/Names [(section*.41) 1012 0 R (section*.42) 1017 0 R (section*.43) 1042 0 R (section*.44) 1045 0 R (section*.45) 1066 0 R (section*.46) 1092 0 R] +/Limits [(section*.41) (section*.46)] +>> endobj +2647 0 obj << +/Names [(section*.47) 1095 0 R (section*.48) 1111 0 R (section*.49) 1126 0 R (section*.5) 315 0 R (section*.50) 1129 0 R (section*.51) 1150 0 R] +/Limits [(section*.47) (section*.51)] +>> endobj +2648 0 obj << +/Names [(section*.52) 1188 0 R (section*.53) 1199 0 R (section*.54) 1222 0 R (section*.55) 1225 0 R (section*.56) 1230 0 R (section*.57) 1261 0 R] +/Limits [(section*.52) (section*.57)] +>> endobj +2649 0 obj << +/Names [(section*.58) 1266 0 R (section*.59) 1270 0 R (section*.6) 316 0 R (section*.60) 1295 0 R (section*.61) 1299 0 R (section*.62) 1303 0 R] +/Limits [(section*.58) (section*.62)] +>> endobj +2650 0 obj << +/Names [(section*.63) 1319 0 R (section*.64) 1324 0 R (section*.65) 1355 0 R (section*.66) 1359 0 R (section*.67) 1472 0 R (section*.68) 1488 0 R] +/Limits [(section*.63) (section*.68)] +>> endobj +2651 0 obj << +/Names [(section*.69) 1492 0 R (section*.7) 322 0 R (section*.70) 1526 0 R (section*.71) 1528 0 R (section*.72) 1559 0 R (section*.73) 1591 0 R] +/Limits [(section*.69) (section*.73)] +>> endobj +2652 0 obj << +/Names [(section*.74) 1597 0 R (section*.75) 1622 0 R (section*.76) 1625 0 R (section*.77) 1647 0 R (section*.78) 1650 0 R (section*.79) 1688 0 R] +/Limits [(section*.74) (section*.79)] +>> endobj +2653 0 obj << +/Names [(section*.8) 323 0 R (section*.80) 2157 0 R (section*.81) 2169 0 R (section*.82) 2227 0 R (section*.9) 324 0 R (section.1) 6 0 R] +/Limits [(section*.8) (section.1)] +>> endobj +2654 0 obj << +/Names [(section.10) 66 0 R (section.2) 10 0 R (section.3) 14 0 R (section.4) 18 0 R (section.5) 26 0 R (section.6) 34 0 R] +/Limits [(section.10) (section.6)] +>> endobj +2655 0 obj << +/Names [(section.7) 42 0 R (section.8) 50 0 R (section.9) 58 0 R (subsection.10.1) 70 0 R (subsection.10.10) 106 0 R (subsection.10.11) 110 0 R] +/Limits [(section.7) (subsection.10.11)] +>> endobj +2656 0 obj << +/Names [(subsection.10.12) 114 0 R (subsection.10.13) 118 0 R (subsection.10.14) 122 0 R (subsection.10.15) 126 0 R (subsection.10.16) 130 0 R (subsection.10.17) 134 0 R] +/Limits [(subsection.10.12) (subsection.10.17)] +>> endobj +2657 0 obj << +/Names [(subsection.10.18) 138 0 R (subsection.10.19) 142 0 R (subsection.10.2) 74 0 R (subsection.10.20) 146 0 R (subsection.10.21) 150 0 R (subsection.10.22) 154 0 R] +/Limits [(subsection.10.18) (subsection.10.22)] +>> endobj +2658 0 obj << +/Names [(subsection.10.23) 158 0 R (subsection.10.24) 162 0 R (subsection.10.25) 166 0 R (subsection.10.26) 170 0 R (subsection.10.27) 174 0 R (subsection.10.28) 178 0 R] +/Limits [(subsection.10.23) (subsection.10.28)] +>> endobj +2659 0 obj << +/Names [(subsection.10.29) 182 0 R (subsection.10.3) 78 0 R (subsection.10.30) 186 0 R (subsection.10.31) 190 0 R (subsection.10.32) 194 0 R (subsection.10.33) 198 0 R] +/Limits [(subsection.10.29) (subsection.10.33)] +>> endobj +2660 0 obj << +/Names [(subsection.10.34) 202 0 R (subsection.10.35) 206 0 R (subsection.10.4) 82 0 R (subsection.10.5) 86 0 R (subsection.10.6) 90 0 R (subsection.10.7) 94 0 R] +/Limits [(subsection.10.34) (subsection.10.7)] +>> endobj +2661 0 obj << +/Names [(subsection.10.8) 98 0 R (subsection.10.9) 102 0 R (subsection.4.1) 22 0 R (subsection.5.1) 30 0 R (subsection.6.1) 38 0 R (subsection.7.1) 46 0 R] +/Limits [(subsection.10.8) (subsection.7.1)] +>> endobj +2662 0 obj << +/Names [(subsection.8.1) 54 0 R (subsection.9.1) 62 0 R (subsubsection.10.1.1) 861 0 R (subsubsection.10.10.1) 1091 0 R (subsubsection.10.11.1) 1096 0 R (subsubsection.10.11.2) 1107 0 R] +/Limits [(subsection.8.1) (subsubsection.10.11.2)] +>> endobj +2663 0 obj << +/Names [(subsubsection.10.12.1) 1125 0 R (subsubsection.10.13.1) 1128 0 R (subsubsection.10.14.1) 1147 0 R (subsubsection.10.14.2) 1148 0 R (subsubsection.10.15.1) 1152 0 R (subsubsection.10.16.1) 1196 0 R] +/Limits [(subsubsection.10.12.1) (subsubsection.10.16.1)] +>> endobj +2664 0 obj << +/Names [(subsubsection.10.17.1) 1224 0 R (subsubsection.10.18.1) 1233 0 R (subsubsection.10.19.1) 1269 0 R (subsubsection.10.2.1) 886 0 R (subsubsection.10.2.2) 887 0 R (subsubsection.10.2.3) 905 0 R] +/Limits [(subsubsection.10.17.1) (subsubsection.10.2.3)] +>> endobj +2665 0 obj << +/Names [(subsubsection.10.20.1) 1298 0 R (subsubsection.10.21.1) 1318 0 R (subsubsection.10.22.1) 1323 0 R (subsubsection.10.23.1) 1326 0 R (subsubsection.10.24.1) 1436 0 R (subsubsection.10.24.2) 1437 0 R] +/Limits [(subsubsection.10.20.1) (subsubsection.10.24.2)] +>> endobj +2666 0 obj << +/Names [(subsubsection.10.24.3) 1448 0 R (subsubsection.10.25.1) 1487 0 R (subsubsection.10.26.1) 1491 0 R (subsubsection.10.27.1) 1508 0 R (subsubsection.10.27.2) 1509 0 R (subsubsection.10.28.1) 1529 0 R] +/Limits [(subsubsection.10.24.3) (subsubsection.10.28.1)] +>> endobj +2667 0 obj << +/Names [(subsubsection.10.28.2) 1530 0 R (subsubsection.10.29.1) 1570 0 R (subsubsection.10.29.2) 1589 0 R (subsubsection.10.3.1) 932 0 R (subsubsection.10.3.2) 933 0 R (subsubsection.10.30.1) 1619 0 R] +/Limits [(subsubsection.10.28.2) (subsubsection.10.30.1)] +>> endobj +2668 0 obj << +/Names [(subsubsection.10.30.2) 1620 0 R (subsubsection.10.31.1) 1646 0 R (subsubsection.10.32.1) 1653 0 R (subsubsection.10.33.1) 1949 0 R (subsubsection.10.33.2) 1950 0 R (subsubsection.10.34.1) 2160 0 R] +/Limits [(subsubsection.10.30.2) (subsubsection.10.34.1)] +>> endobj +2669 0 obj << +/Names [(subsubsection.10.34.2) 2161 0 R (subsubsection.10.35.1) 2171 0 R (subsubsection.10.4.1) 962 0 R (subsubsection.10.5.1) 989 0 R (subsubsection.10.6.1) 997 0 R (subsubsection.10.7.1) 1016 0 R] +/Limits [(subsubsection.10.34.2) (subsubsection.10.7.1)] +>> endobj +2670 0 obj << +/Names [(subsubsection.10.8.1) 1019 0 R (subsubsection.10.9.1) 1046 0 R (subsubsection.10.9.2) 1047 0 R (subsubsection.8.1.1) 700 0 R (subsubsection.8.1.2) 701 0 R (subsubsection.9.1.1) 827 0 R] +/Limits [(subsubsection.10.8.1) (subsubsection.9.1.1)] +>> endobj +2671 0 obj << +/Kids [2553 0 R 2554 0 R 2555 0 R 2556 0 R 2557 0 R 2558 0 R] +/Limits [(Doc-Start) (classparma__polyhedra__library_1_1Congruence_71cf9ab9ae4f184bf520137a8209ff3e)] +>> endobj +2672 0 obj << +/Kids [2559 0 R 2560 0 R 2561 0 R 2562 0 R 2563 0 R 2564 0 R] +/Limits [(classparma__polyhedra__library_1_1Congruence_7622929270f419e884d16cec2fc172b5) (classparma__polyhedra__library_1_1Grid__Generator__System_183f982bd3198d2c455e51e7cedd4e33)] +>> endobj +2673 0 obj << +/Kids [2565 0 R 2566 0 R 2567 0 R 2568 0 R 2569 0 R 2570 0 R] +/Limits [(classparma__polyhedra__library_1_1Grid__Generator__System_4f9d506f39d5a65a2c2cec090a1578f0) (classparma__polyhedra__library_1_1Linear__Expression__Times_015f6e2febd260a93299564dfde659e5)] +>> endobj +2674 0 obj << +/Kids [2571 0 R 2572 0 R 2573 0 R 2574 0 R 2575 0 R 2576 0 R] +/Limits [(classparma__polyhedra__library_1_1Linear__Expression__Times_121be923ed152a60238e69a8296bf966) (classparma__polyhedra__library_1_1MIP__Problem_7c8c10d940074e8ec96a4d319b88e490)] +>> endobj +2675 0 obj << +/Kids [2577 0 R 2578 0 R 2579 0 R 2580 0 R 2581 0 R 2582 0 R] +/Limits [(classparma__polyhedra__library_1_1MIP__Problem_7fa63d4674ffff39446dd46ed0c26e6f) (classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron_91754711e181bd642b50021a3750ba1b)] +>> endobj +2676 0 obj << +/Kids [2583 0 R 2584 0 R 2585 0 R 2586 0 R 2587 0 R 2588 0 R] +/Limits [(classparma__polyhedra__library_1_1Pointset__Powerset__C__Polyhedron__Iterator) (classparma__polyhedra__library_1_1Polyhedron_25143e2f87da1099e3cb5c065a2e0890)] +>> endobj +2677 0 obj << +/Kids [2589 0 R 2590 0 R 2591 0 R 2592 0 R 2593 0 R 2594 0 R] +/Limits [(classparma__polyhedra__library_1_1Polyhedron_269b05089d9f1a4c329d5f5f1fe87dec) (classparma__polyhedra__library_1_1Polyhedron_9a21e654ffec08b0a79e6aa5ec29d72d)] +>> endobj +2678 0 obj << +/Kids [2595 0 R 2596 0 R 2597 0 R 2598 0 R 2599 0 R 2600 0 R] +/Limits [(classparma__polyhedra__library_1_1Polyhedron_9f7d55f53c6ca0b56163de733c0bca5d) (classparma__polyhedra__library_1_1Variable_df4acacc53bd647f2c4ccaac0aa7643a)] +>> endobj +2679 0 obj << +/Kids [2601 0 R 2602 0 R 2603 0 R 2604 0 R 2605 0 R 2606 0 R] +/Limits [(classparma__polyhedra__library_1_1Variables__Set) (group__PPL__Java__interface_gge574051d412d3ee587c872f48de81663829fa1b449ab43dfd7a5fbd21bfbbd21)] +>> endobj +2680 0 obj << +/Kids [2607 0 R 2608 0 R 2609 0 R 2610 0 R 2611 0 R 2612 0 R] +/Limits [(index) (page.36)] +>> endobj +2681 0 obj << +/Kids [2613 0 R 2614 0 R 2615 0 R 2616 0 R 2617 0 R 2618 0 R] +/Limits [(page.37) (page.69)] +>> endobj +2682 0 obj << +/Kids [2619 0 R 2620 0 R 2621 0 R 2622 0 R 2623 0 R 2624 0 R] +/Limits [(page.7) (paragraph.10.24.2.2)] +>> endobj +2683 0 obj << +/Kids [2625 0 R 2626 0 R 2627 0 R 2628 0 R 2629 0 R 2630 0 R] +/Limits [(paragraph.10.24.3.1) (paragraph.10.33.2.23)] +>> endobj +2684 0 obj << +/Kids [2631 0 R 2632 0 R 2633 0 R 2634 0 R 2635 0 R 2636 0 R] +/Limits [(paragraph.10.33.2.24) (paragraph.10.33.2.56)] +>> endobj +2685 0 obj << +/Kids [2637 0 R 2638 0 R 2639 0 R 2640 0 R 2641 0 R 2642 0 R] +/Limits [(paragraph.10.33.2.6) (section*.24)] +>> endobj +2686 0 obj << +/Kids [2643 0 R 2644 0 R 2645 0 R 2646 0 R 2647 0 R 2648 0 R] +/Limits [(section*.25) (section*.57)] +>> endobj +2687 0 obj << +/Kids [2649 0 R 2650 0 R 2651 0 R 2652 0 R 2653 0 R 2654 0 R] +/Limits [(section*.58) (section.6)] +>> endobj +2688 0 obj << +/Kids [2655 0 R 2656 0 R 2657 0 R 2658 0 R 2659 0 R 2660 0 R] +/Limits [(section.7) (subsection.10.7)] +>> endobj +2689 0 obj << +/Kids [2661 0 R 2662 0 R 2663 0 R 2664 0 R 2665 0 R 2666 0 R] +/Limits [(subsection.10.8) (subsubsection.10.28.1)] +>> endobj +2690 0 obj << +/Kids [2667 0 R 2668 0 R 2669 0 R 2670 0 R] +/Limits [(subsubsection.10.28.2) (subsubsection.9.1.1)] +>> endobj +2691 0 obj << +/Kids [2671 0 R 2672 0 R 2673 0 R 2674 0 R 2675 0 R 2676 0 R] +/Limits [(Doc-Start) (classparma__polyhedra__library_1_1Polyhedron_25143e2f87da1099e3cb5c065a2e0890)] +>> endobj +2692 0 obj << +/Kids [2677 0 R 2678 0 R 2679 0 R 2680 0 R 2681 0 R 2682 0 R] +/Limits [(classparma__polyhedra__library_1_1Polyhedron_269b05089d9f1a4c329d5f5f1fe87dec) (paragraph.10.24.2.2)] +>> endobj +2693 0 obj << +/Kids [2683 0 R 2684 0 R 2685 0 R 2686 0 R 2687 0 R 2688 0 R] +/Limits [(paragraph.10.24.3.1) (subsection.10.7)] +>> endobj +2694 0 obj << +/Kids [2689 0 R 2690 0 R] +/Limits [(subsection.10.8) (subsubsection.9.1.1)] +>> endobj +2695 0 obj << +/Kids [2691 0 R 2692 0 R 2693 0 R 2694 0 R] +/Limits [(Doc-Start) (subsubsection.9.1.1)] +>> endobj +2696 0 obj << +/Dests 2695 0 R +>> endobj +2697 0 obj << +/Type /Catalog +/Pages 2551 0 R +/Outlines 2552 0 R +/Names 2696 0 R +/PageMode/UseOutlines/PageLabels << /Nums [0 << /S /D >> 1 << /S /r >> 2 << /S /D >> ] >> +/OpenAction 209 0 R +>> endobj +2698 0 obj << +/Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.3)/Keywords() +/CreationDate (D:20090418071529+02'00') +/ModDate (D:20090418071529+02'00') +/Trapped /False +/PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6) +>> endobj +xref +0 2699 +0000000001 65535 f +0000000002 00000 f +0000000003 00000 f +0000000004 00000 f +0000000000 00000 f +0000000015 00000 n +0000035191 00000 n +0000670845 00000 n +0000000060 00000 n +0000000134 00000 n +0000039308 00000 n +0000670758 00000 n +0000000179 00000 n +0000000345 00000 n +0000073632 00000 n +0000670669 00000 n +0000000391 00000 n +0000000577 00000 n +0000092970 00000 n +0000670543 00000 n +0000000623 00000 n +0000000713 00000 n +0000093026 00000 n +0000670482 00000 n +0000000764 00000 n +0000000826 00000 n +0000098529 00000 n +0000670356 00000 n +0000000872 00000 n +0000000977 00000 n +0000098585 00000 n +0000670295 00000 n +0000001028 00000 n +0000001128 00000 n +0000098641 00000 n +0000670169 00000 n +0000001174 00000 n +0000001259 00000 n +0000098697 00000 n +0000670108 00000 n +0000001310 00000 n +0000001415 00000 n +0000106969 00000 n +0000669982 00000 n +0000001461 00000 n +0000001546 00000 n +0000107024 00000 n +0000669921 00000 n +0000001597 00000 n +0000001677 00000 n +0000123436 00000 n +0000669795 00000 n +0000001723 00000 n +0000001853 00000 n +0000123549 00000 n +0000669734 00000 n +0000001904 00000 n +0000002052 00000 n +0000152644 00000 n +0000669608 00000 n +0000002098 00000 n +0000002243 00000 n +0000152755 00000 n +0000669547 00000 n +0000002294 00000 n +0000002548 00000 n +0000173500 00000 n +0000669432 00000 n +0000002595 00000 n +0000002720 00000 n +0000173613 00000 n +0000669358 00000 n +0000002772 00000 n +0000003110 00000 n +0000180443 00000 n +0000669271 00000 n +0000003162 00000 n +0000003469 00000 n +0000189277 00000 n +0000669184 00000 n +0000003521 00000 n +0000003820 00000 n +0000194618 00000 n +0000669097 00000 n +0000003872 00000 n +0000004166 00000 n +0000199719 00000 n +0000669010 00000 n +0000004218 00000 n +0000004550 00000 n +0000205171 00000 n +0000668923 00000 n +0000004602 00000 n +0000004896 00000 n +0000208730 00000 n +0000668836 00000 n +0000004948 00000 n +0000005280 00000 n +0000209140 00000 n +0000668747 00000 n +0000005332 00000 n +0000005693 00000 n +0000209432 00000 n +0000668656 00000 n +0000005746 00000 n +0000006036 00000 n +0000218527 00000 n +0000668564 00000 n +0000006090 00000 n +0000006418 00000 n +0000224591 00000 n +0000668472 00000 n +0000006472 00000 n +0000006790 00000 n +0000227632 00000 n +0000668380 00000 n +0000006844 00000 n +0000007200 00000 n +0000231171 00000 n +0000668288 00000 n +0000007254 00000 n +0000007635 00000 n +0000231464 00000 n +0000668196 00000 n +0000007689 00000 n +0000007944 00000 n +0000235988 00000 n +0000668104 00000 n +0000007998 00000 n +0000008359 00000 n +0000236281 00000 n +0000668012 00000 n +0000008413 00000 n +0000008746 00000 n +0000245406 00000 n +0000667920 00000 n +0000008800 00000 n +0000009196 00000 n +0000251207 00000 n +0000667828 00000 n +0000009250 00000 n +0000009641 00000 n +0000257936 00000 n +0000667736 00000 n +0000009695 00000 n +0000010051 00000 n +0000258581 00000 n +0000667644 00000 n +0000010105 00000 n +0000010471 00000 n +0000264805 00000 n +0000667552 00000 n +0000010525 00000 n +0000010924 00000 n +0000268841 00000 n +0000667460 00000 n +0000010978 00000 n +0000011359 00000 n +0000269252 00000 n +0000667368 00000 n +0000011413 00000 n +0000011769 00000 n +0000276180 00000 n +0000667276 00000 n +0000011823 00000 n +0000012126 00000 n +0000300711 00000 n +0000667184 00000 n +0000012180 00000 n +0000012551 00000 n +0000304278 00000 n +0000667092 00000 n +0000012605 00000 n +0000012919 00000 n +0000304630 00000 n +0000667000 00000 n +0000012973 00000 n +0000013339 00000 n +0000312462 00000 n +0000666908 00000 n +0000013393 00000 n +0000013741 00000 n +0000320589 00000 n +0000666816 00000 n +0000013795 00000 n +0000014199 00000 n +0000326329 00000 n +0000666724 00000 n +0000014253 00000 n +0000014705 00000 n +0000332672 00000 n +0000666632 00000 n +0000014759 00000 n +0000015095 00000 n +0000336836 00000 n +0000666540 00000 n +0000015149 00000 n +0000015485 00000 n +0000337365 00000 n +0000666448 00000 n +0000015539 00000 n +0000015834 00000 n +0000450131 00000 n +0000666356 00000 n +0000015888 00000 n +0000016173 00000 n +0000450660 00000 n +0000666278 00000 n +0000016227 00000 n +0000016540 00000 n +0000017825 00000 n +0000018058 00000 n +0000016592 00000 n +0000017944 00000 n +0000018001 00000 n +0000663598 00000 n +0000661732 00000 n +0000662163 00000 n +0000661876 00000 n +0000663954 00000 n +0000020290 00000 n +0000020456 00000 n +0000020608 00000 n +0000020774 00000 n +0000021072 00000 n +0000021247 00000 n +0000021397 00000 n +0000021548 00000 n +0000021699 00000 n +0000021850 00000 n +0000022007 00000 n +0000022158 00000 n +0000022315 00000 n +0000022466 00000 n +0000022623 00000 n +0000022774 00000 n +0000022930 00000 n +0000023081 00000 n +0000023237 00000 n +0000023388 00000 n +0000023544 00000 n +0000025820 00000 n +0000023693 00000 n +0000023979 00000 n +0000019975 00000 n +0000018169 00000 n +0000023865 00000 n +0000663242 00000 n +0000020924 00000 n +0000662890 00000 n +0000023922 00000 n +0000073745 00000 n +0000039421 00000 n +0000025978 00000 n +0000026136 00000 n +0000026294 00000 n +0000026451 00000 n +0000026609 00000 n +0000026766 00000 n +0000026923 00000 n +0000027081 00000 n +0000027239 00000 n +0000027398 00000 n +0000027557 00000 n +0000027716 00000 n +0000027874 00000 n +0000028033 00000 n +0000028192 00000 n +0000028351 00000 n +0000028510 00000 n +0000028668 00000 n +0000028826 00000 n +0000028985 00000 n +0000029144 00000 n +0000029303 00000 n +0000029461 00000 n +0000029620 00000 n +0000029779 00000 n +0000029938 00000 n +0000030097 00000 n +0000030255 00000 n +0000030412 00000 n +0000030570 00000 n +0000030729 00000 n +0000030888 00000 n +0000031047 00000 n +0000031206 00000 n +0000031365 00000 n +0000031537 00000 n +0000025401 00000 n +0000024077 00000 n +0000660424 00000 n +0000034962 00000 n +0000035360 00000 n +0000034823 00000 n +0000031648 00000 n +0000035134 00000 n +0000035246 00000 n +0000663774 00000 n +0000035303 00000 n +0000661154 00000 n +0000038916 00000 n +0000039079 00000 n +0000039535 00000 n +0000038769 00000 n +0000035509 00000 n +0000039251 00000 n +0000039364 00000 n +0000039478 00000 n +0000042969 00000 n +0000043368 00000 n +0000042830 00000 n +0000039633 00000 n +0000043141 00000 n +0000043198 00000 n +0000043255 00000 n +0000043311 00000 n +0000046589 00000 n +0000046985 00000 n +0000046450 00000 n +0000043466 00000 n +0000046761 00000 n +0000046818 00000 n +0000046875 00000 n +0000046930 00000 n +0000664072 00000 n +0000050368 00000 n +0000050711 00000 n +0000050229 00000 n +0000047083 00000 n +0000050540 00000 n +0000050597 00000 n +0000050654 00000 n +0000054465 00000 n +0000054751 00000 n +0000054326 00000 n +0000050809 00000 n +0000054637 00000 n +0000054694 00000 n +0000058097 00000 n +0000058382 00000 n +0000057958 00000 n +0000054849 00000 n +0000058269 00000 n +0000058326 00000 n +0000061979 00000 n +0000062379 00000 n +0000061840 00000 n +0000058480 00000 n +0000062151 00000 n +0000062208 00000 n +0000062265 00000 n +0000062322 00000 n +0000065934 00000 n +0000066334 00000 n +0000065795 00000 n +0000062477 00000 n +0000066106 00000 n +0000066163 00000 n +0000066220 00000 n +0000066277 00000 n +0000069432 00000 n +0000069889 00000 n +0000069293 00000 n +0000066432 00000 n +0000069604 00000 n +0000069661 00000 n +0000069718 00000 n +0000069775 00000 n +0000069832 00000 n +0000663064 00000 n +0000664190 00000 n +0000072858 00000 n +0000073033 00000 n +0000073209 00000 n +0000073403 00000 n +0000073802 00000 n +0000072695 00000 n +0000070000 00000 n +0000073575 00000 n +0000073688 00000 n +0000077845 00000 n +0000078074 00000 n +0000077706 00000 n +0000073913 00000 n +0000078017 00000 n +0000082023 00000 n +0000082252 00000 n +0000081884 00000 n +0000078172 00000 n +0000082195 00000 n +0000085670 00000 n +0000085899 00000 n +0000085531 00000 n +0000082350 00000 n +0000085842 00000 n +0000089357 00000 n +0000089586 00000 n +0000089218 00000 n +0000085997 00000 n +0000089529 00000 n +0000092352 00000 n +0000092528 00000 n +0000092684 00000 n +0000093082 00000 n +0000092197 00000 n +0000089684 00000 n +0000092856 00000 n +0000092913 00000 n +0000664308 00000 n +0000094641 00000 n +0000094818 00000 n +0000094975 00000 n +0000095133 00000 n +0000095291 00000 n +0000095449 00000 n +0000095607 00000 n +0000095765 00000 n +0000095923 00000 n +0000096081 00000 n +0000096239 00000 n +0000096396 00000 n +0000096555 00000 n +0000096714 00000 n +0000096872 00000 n +0000097031 00000 n +0000097190 00000 n +0000097349 00000 n +0000097508 00000 n +0000097667 00000 n +0000097825 00000 n +0000097984 00000 n +0000098143 00000 n +0000100672 00000 n +0000098300 00000 n +0000098753 00000 n +0000094318 00000 n +0000093180 00000 n +0000098472 00000 n +0000152699 00000 n +0000100830 00000 n +0000100989 00000 n +0000101147 00000 n +0000101306 00000 n +0000101465 00000 n +0000101624 00000 n +0000101783 00000 n +0000101942 00000 n +0000102101 00000 n +0000102260 00000 n +0000102419 00000 n +0000102576 00000 n +0000102735 00000 n +0000102894 00000 n +0000103095 00000 n +0000103253 00000 n +0000103443 00000 n +0000103601 00000 n +0000103789 00000 n +0000103947 00000 n +0000104134 00000 n +0000104292 00000 n +0000104485 00000 n +0000104642 00000 n +0000104829 00000 n +0000104987 00000 n +0000105181 00000 n +0000105339 00000 n +0000105540 00000 n +0000105697 00000 n +0000105882 00000 n +0000106040 00000 n +0000106234 00000 n +0000106393 00000 n +0000106583 00000 n +0000109403 00000 n +0000109603 00000 n +0000106740 00000 n +0000107080 00000 n +0000100245 00000 n +0000098864 00000 n +0000106912 00000 n +0000173556 00000 n +0000180386 00000 n +0000189221 00000 n +0000194561 00000 n +0000199662 00000 n +0000205114 00000 n +0000205683 00000 n +0000209082 00000 n +0000209374 00000 n +0000218469 00000 n +0000224533 00000 n +0000109761 00000 n +0000109966 00000 n +0000110125 00000 n +0000110304 00000 n +0000110463 00000 n +0000110664 00000 n +0000110823 00000 n +0000111018 00000 n +0000111177 00000 n +0000111385 00000 n +0000111544 00000 n +0000111751 00000 n +0000111910 00000 n +0000112110 00000 n +0000112269 00000 n +0000112471 00000 n +0000112630 00000 n +0000112838 00000 n +0000112997 00000 n +0000113202 00000 n +0000113361 00000 n +0000113561 00000 n +0000113720 00000 n +0000113909 00000 n +0000114068 00000 n +0000114271 00000 n +0000114430 00000 n +0000114629 00000 n +0000114788 00000 n +0000114990 00000 n +0000115149 00000 n +0000115347 00000 n +0000115506 00000 n +0000115716 00000 n +0000115906 00000 n +0000116065 00000 n +0000116285 00000 n +0000116494 00000 n +0000116653 00000 n +0000116849 00000 n +0000117008 00000 n +0000117204 00000 n +0000117363 00000 n +0000117550 00000 n +0000119583 00000 n +0000119767 00000 n +0000117707 00000 n +0000117936 00000 n +0000108896 00000 n +0000107191 00000 n +0000117879 00000 n +0000227575 00000 n +0000231113 00000 n +0000231406 00000 n +0000235930 00000 n +0000236223 00000 n +0000245348 00000 n +0000251150 00000 n +0000251796 00000 n +0000258524 00000 n +0000264747 00000 n +0000268783 00000 n +0000269194 00000 n +0000276122 00000 n +0000300653 00000 n +0000304220 00000 n +0000304572 00000 n +0000309454 00000 n +0000313056 00000 n +0000326271 00000 n +0000332614 00000 n +0000336778 00000 n +0000337307 00000 n +0000119925 00000 n +0000120116 00000 n +0000120275 00000 n +0000120476 00000 n +0000120664 00000 n +0000120851 00000 n +0000121044 00000 n +0000121231 00000 n +0000121426 00000 n +0000121626 00000 n +0000121813 00000 n +0000122003 00000 n +0000122212 00000 n +0000122400 00000 n +0000122619 00000 n +0000122828 00000 n +0000123014 00000 n +0000125232 00000 n +0000123207 00000 n +0000123662 00000 n +0000119292 00000 n +0000118047 00000 n +0000123379 00000 n +0000123492 00000 n +0000123605 00000 n +0000450073 00000 n +0000450602 00000 n +0000125424 00000 n +0000125624 00000 n +0000125828 00000 n +0000126007 00000 n +0000126207 00000 n +0000126401 00000 n +0000126609 00000 n +0000126814 00000 n +0000127014 00000 n +0000127216 00000 n +0000127425 00000 n +0000127630 00000 n +0000127830 00000 n +0000128019 00000 n +0000128222 00000 n +0000128421 00000 n +0000130824 00000 n +0000128623 00000 n +0000128852 00000 n +0000124957 00000 n +0000123786 00000 n +0000128795 00000 n +0000131021 00000 n +0000131216 00000 n +0000131401 00000 n +0000131577 00000 n +0000131781 00000 n +0000132253 00000 n +0000132489 00000 n +0000132962 00000 n +0000133166 00000 n +0000133403 00000 n +0000133606 00000 n +0000134079 00000 n +0000134314 00000 n +0000134550 00000 n +0000134754 00000 n +0000134990 00000 n +0000135226 00000 n +0000135430 00000 n +0000135666 00000 n +0000135902 00000 n +0000136139 00000 n +0000136612 00000 n +0000136816 00000 n +0000137053 00000 n +0000137525 00000 n +0000137761 00000 n +0000137965 00000 n +0000138437 00000 n +0000138909 00000 n +0000141266 00000 n +0000141470 00000 n +0000141942 00000 n +0000139146 00000 n +0000139489 00000 n +0000130389 00000 n +0000128976 00000 n +0000139318 00000 n +0000139375 00000 n +0000139432 00000 n +0000132017 00000 n +0000132726 00000 n +0000133843 00000 n +0000136376 00000 n +0000137290 00000 n +0000138202 00000 n +0000138673 00000 n +0000664426 00000 n +0000144328 00000 n +0000144440 00000 n +0000144502 00000 n +0000144564 00000 n +0000144626 00000 n +0000144740 00000 n +0000144802 00000 n +0000144915 00000 n +0000144977 00000 n +0000145039 00000 n +0000145100 00000 n +0000147079 00000 n +0000147140 00000 n +0000147202 00000 n +0000147314 00000 n +0000147376 00000 n +0000147438 00000 n +0000147500 00000 n +0000147562 00000 n +0000147676 00000 n +0000147738 00000 n +0000147852 00000 n +0000147914 00000 n +0000147976 00000 n +0000142178 00000 n +0000142382 00000 n +0000142618 00000 n +0000142855 00000 n +0000143327 00000 n +0000143563 00000 n +0000143797 00000 n +0000143985 00000 n +0000145157 00000 n +0000141031 00000 n +0000139600 00000 n +0000144157 00000 n +0000141707 00000 n +0000143092 00000 n +0000144214 00000 n +0000144271 00000 n +0000144384 00000 n +0000663418 00000 n +0000144683 00000 n +0000144858 00000 n +0000148038 00000 n +0000148152 00000 n +0000148214 00000 n +0000148276 00000 n +0000152337 00000 n +0000152398 00000 n +0000152459 00000 n +0000152520 00000 n +0000152582 00000 n +0000146604 00000 n +0000146793 00000 n +0000148332 00000 n +0000146457 00000 n +0000145281 00000 n +0000146965 00000 n +0000147022 00000 n +0000147258 00000 n +0000147619 00000 n +0000147795 00000 n +0000148095 00000 n +0000149930 00000 n +0000150130 00000 n +0000150317 00000 n +0000150502 00000 n +0000150696 00000 n +0000150883 00000 n +0000151078 00000 n +0000151279 00000 n +0000151466 00000 n +0000151654 00000 n +0000151864 00000 n +0000154406 00000 n +0000154625 00000 n +0000152051 00000 n +0000152867 00000 n +0000149703 00000 n +0000148443 00000 n +0000152223 00000 n +0000152280 00000 n +0000152810 00000 n +0000154832 00000 n +0000155018 00000 n +0000155212 00000 n +0000155404 00000 n +0000155604 00000 n +0000155809 00000 n +0000155988 00000 n +0000156189 00000 n +0000156383 00000 n +0000156590 00000 n +0000156796 00000 n +0000156995 00000 n +0000157197 00000 n +0000157405 00000 n +0000157609 00000 n +0000157809 00000 n +0000160184 00000 n +0000157996 00000 n +0000158225 00000 n +0000154123 00000 n +0000153004 00000 n +0000158168 00000 n +0000160387 00000 n +0000160586 00000 n +0000160788 00000 n +0000160985 00000 n +0000161181 00000 n +0000161376 00000 n +0000161560 00000 n +0000161751 00000 n +0000161955 00000 n +0000162192 00000 n +0000162429 00000 n +0000162902 00000 n +0000163106 00000 n +0000163343 00000 n +0000163545 00000 n +0000163780 00000 n +0000164251 00000 n +0000164488 00000 n +0000164691 00000 n +0000164927 00000 n +0000165162 00000 n +0000165366 00000 n +0000165603 00000 n +0000165840 00000 n +0000166077 00000 n +0000166314 00000 n +0000166518 00000 n +0000166755 00000 n +0000166992 00000 n +0000169301 00000 n +0000169504 00000 n +0000169741 00000 n +0000169978 00000 n +0000167229 00000 n +0000167515 00000 n +0000159789 00000 n +0000158336 00000 n +0000167401 00000 n +0000167458 00000 n +0000162666 00000 n +0000164015 00000 n +0000170214 00000 n +0000170418 00000 n +0000170655 00000 n +0000170892 00000 n +0000171096 00000 n +0000171332 00000 n +0000171569 00000 n +0000171806 00000 n +0000172043 00000 n +0000172279 00000 n +0000172512 00000 n +0000172746 00000 n +0000172980 00000 n +0000173214 00000 n +0000174011 00000 n +0000169026 00000 n +0000167639 00000 n +0000173386 00000 n +0000173443 00000 n +0000660570 00000 n +0000173669 00000 n +0000173726 00000 n +0000173783 00000 n +0000173840 00000 n +0000173897 00000 n +0000173954 00000 n +0000664544 00000 n +0000176339 00000 n +0000176525 00000 n +0000176748 00000 n +0000176952 00000 n +0000177174 00000 n +0000177363 00000 n +0000177586 00000 n +0000177776 00000 n +0000177980 00000 n +0000178202 00000 n +0000178396 00000 n +0000178619 00000 n +0000178814 00000 n +0000179036 00000 n +0000179259 00000 n +0000179481 00000 n +0000179684 00000 n +0000179907 00000 n +0000182856 00000 n +0000183079 00000 n +0000180100 00000 n +0000180727 00000 n +0000176056 00000 n +0000174135 00000 n +0000180272 00000 n +0000180329 00000 n +0000180499 00000 n +0000180556 00000 n +0000180613 00000 n +0000180670 00000 n +0000184980 00000 n +0000185094 00000 n +0000185208 00000 n +0000185327 00000 n +0000185446 00000 n +0000188817 00000 n +0000183269 00000 n +0000183458 00000 n +0000183679 00000 n +0000184054 00000 n +0000184243 00000 n +0000184466 00000 n +0000185508 00000 n +0000182653 00000 n +0000180838 00000 n +0000184638 00000 n +0000184695 00000 n +0000183867 00000 n +0000184752 00000 n +0000184809 00000 n +0000184866 00000 n +0000184923 00000 n +0000185037 00000 n +0000185151 00000 n +0000185270 00000 n +0000185389 00000 n +0000188993 00000 n +0000189107 00000 n +0000187889 00000 n +0000188094 00000 n +0000188313 00000 n +0000191446 00000 n +0000188531 00000 n +0000189504 00000 n +0000187726 00000 n +0000185645 00000 n +0000188703 00000 n +0000188760 00000 n +0000188879 00000 n +0000188936 00000 n +0000189050 00000 n +0000189164 00000 n +0000189333 00000 n +0000189390 00000 n +0000189447 00000 n +0000191666 00000 n +0000191886 00000 n +0000192106 00000 n +0000192293 00000 n +0000192514 00000 n +0000192702 00000 n +0000192921 00000 n +0000193116 00000 n +0000193311 00000 n +0000193499 00000 n +0000193716 00000 n +0000196997 00000 n +0000197184 00000 n +0000193934 00000 n +0000194901 00000 n +0000191211 00000 n +0000189641 00000 n +0000194106 00000 n +0000194163 00000 n +0000194220 00000 n +0000194277 00000 n +0000194333 00000 n +0000194390 00000 n +0000194447 00000 n +0000194504 00000 n +0000194674 00000 n +0000194731 00000 n +0000662453 00000 n +0000661588 00000 n +0000194788 00000 n +0000194844 00000 n +0000197404 00000 n +0000197597 00000 n +0000197817 00000 n +0000198009 00000 n +0000198228 00000 n +0000198414 00000 n +0000198641 00000 n +0000198866 00000 n +0000201770 00000 n +0000201964 00000 n +0000199092 00000 n +0000200002 00000 n +0000196778 00000 n +0000195051 00000 n +0000199264 00000 n +0000199321 00000 n +0000199378 00000 n +0000199435 00000 n +0000199492 00000 n +0000199549 00000 n +0000199606 00000 n +0000660279 00000 n +0000660862 00000 n +0000662020 00000 n +0000661444 00000 n +0000199775 00000 n +0000199832 00000 n +0000199889 00000 n +0000199946 00000 n +0000202151 00000 n +0000202370 00000 n +0000202565 00000 n +0000202769 00000 n +0000202964 00000 n +0000203157 00000 n +0000203376 00000 n +0000203568 00000 n +0000203787 00000 n +0000203989 00000 n +0000204208 00000 n +0000204425 00000 n +0000204643 00000 n +0000204828 00000 n +0000205739 00000 n +0000201511 00000 n +0000200201 00000 n +0000205000 00000 n +0000205057 00000 n +0000205227 00000 n +0000205284 00000 n +0000205341 00000 n +0000205398 00000 n +0000205455 00000 n +0000205512 00000 n +0000205569 00000 n +0000205626 00000 n +0000664662 00000 n +0000207203 00000 n +0000207430 00000 n +0000207656 00000 n +0000207883 00000 n +0000208078 00000 n +0000208264 00000 n +0000211344 00000 n +0000211532 00000 n +0000208498 00000 n +0000209490 00000 n +0000207007 00000 n +0000205850 00000 n +0000208671 00000 n +0000208787 00000 n +0000208846 00000 n +0000208905 00000 n +0000208964 00000 n +0000209023 00000 n +0000209197 00000 n +0000209256 00000 n +0000209315 00000 n +0000211752 00000 n +0000211969 00000 n +0000212187 00000 n +0000212373 00000 n +0000212592 00000 n +0000212787 00000 n +0000212975 00000 n +0000213162 00000 n +0000213382 00000 n +0000213578 00000 n +0000213765 00000 n +0000213985 00000 n +0000214181 00000 n +0000214370 00000 n +0000214557 00000 n +0000214777 00000 n +0000214973 00000 n +0000215159 00000 n +0000215920 00000 n +0000211030 00000 n +0000209602 00000 n +0000215332 00000 n +0000215391 00000 n +0000215450 00000 n +0000215509 00000 n +0000215568 00000 n +0000215626 00000 n +0000215685 00000 n +0000215744 00000 n +0000215803 00000 n +0000215862 00000 n +0000218351 00000 n +0000218115 00000 n +0000218233 00000 n +0000217597 00000 n +0000220442 00000 n +0000220667 00000 n +0000217824 00000 n +0000218703 00000 n +0000217445 00000 n +0000216045 00000 n +0000217997 00000 n +0000218056 00000 n +0000218174 00000 n +0000218292 00000 n +0000218410 00000 n +0000218585 00000 n +0000218644 00000 n +0000220893 00000 n +0000221087 00000 n +0000221273 00000 n +0000221496 00000 n +0000221720 00000 n +0000221911 00000 n +0000222135 00000 n +0000222329 00000 n +0000222521 00000 n +0000222746 00000 n +0000222941 00000 n +0000223129 00000 n +0000223322 00000 n +0000223548 00000 n +0000223744 00000 n +0000223932 00000 n +0000224124 00000 n +0000224944 00000 n +0000220137 00000 n +0000218828 00000 n +0000224297 00000 n +0000224356 00000 n +0000224415 00000 n +0000224474 00000 n +0000224649 00000 n +0000224708 00000 n +0000224767 00000 n +0000224826 00000 n +0000224885 00000 n +0000227221 00000 n +0000227339 00000 n +0000227457 00000 n +0000226697 00000 n +0000229400 00000 n +0000226930 00000 n +0000227808 00000 n +0000226545 00000 n +0000225056 00000 n +0000227103 00000 n +0000227162 00000 n +0000227280 00000 n +0000227398 00000 n +0000227516 00000 n +0000227690 00000 n +0000227749 00000 n +0000229631 00000 n +0000229862 00000 n +0000230063 00000 n +0000230256 00000 n +0000230494 00000 n +0000230706 00000 n +0000231581 00000 n +0000229202 00000 n +0000227933 00000 n +0000230879 00000 n +0000230938 00000 n +0000230997 00000 n +0000231054 00000 n +0000231229 00000 n +0000231288 00000 n +0000231347 00000 n +0000231522 00000 n +0000664785 00000 n +0000235812 00000 n +0000233382 00000 n +0000233615 00000 n +0000233824 00000 n +0000234239 00000 n +0000234440 00000 n +0000234844 00000 n +0000235259 00000 n +0000238302 00000 n +0000238495 00000 n +0000238723 00000 n +0000235462 00000 n +0000236339 00000 n +0000233148 00000 n +0000231693 00000 n +0000235635 00000 n +0000235694 00000 n +0000235753 00000 n +0000235871 00000 n +0000236046 00000 n +0000236105 00000 n +0000236164 00000 n +0000234032 00000 n +0000234643 00000 n +0000235053 00000 n +0000238918 00000 n +0000239111 00000 n +0000239339 00000 n +0000239534 00000 n +0000239728 00000 n +0000239957 00000 n +0000240146 00000 n +0000240339 00000 n +0000240567 00000 n +0000240762 00000 n +0000240990 00000 n +0000241216 00000 n +0000241442 00000 n +0000241636 00000 n +0000242047 00000 n +0000242256 00000 n +0000242457 00000 n +0000242872 00000 n +0000243082 00000 n +0000243277 00000 n +0000243517 00000 n +0000243705 00000 n +0000243893 00000 n +0000244135 00000 n +0000244343 00000 n +0000247298 00000 n +0000247486 00000 n +0000244585 00000 n +0000245700 00000 n +0000237888 00000 n +0000236464 00000 n +0000244758 00000 n +0000244817 00000 n +0000244876 00000 n +0000244935 00000 n +0000244994 00000 n +0000245053 00000 n +0000245112 00000 n +0000245171 00000 n +0000245230 00000 n +0000245289 00000 n +0000241842 00000 n +0000242665 00000 n +0000245464 00000 n +0000245523 00000 n +0000245582 00000 n +0000245641 00000 n +0000247728 00000 n +0000247923 00000 n +0000248163 00000 n +0000248359 00000 n +0000248555 00000 n +0000248749 00000 n +0000248989 00000 n +0000249183 00000 n +0000249424 00000 n +0000249631 00000 n +0000249871 00000 n +0000250065 00000 n +0000250306 00000 n +0000250500 00000 n +0000250741 00000 n +0000251852 00000 n +0000247010 00000 n +0000245812 00000 n +0000250914 00000 n +0000250973 00000 n +0000251032 00000 n +0000251091 00000 n +0000251265 00000 n +0000251324 00000 n +0000251383 00000 n +0000251442 00000 n +0000251501 00000 n +0000251560 00000 n +0000251619 00000 n +0000251678 00000 n +0000251737 00000 n +0000253500 00000 n +0000253695 00000 n +0000253928 00000 n +0000254124 00000 n +0000254320 00000 n +0000254514 00000 n +0000254747 00000 n +0000254941 00000 n +0000255175 00000 n +0000255374 00000 n +0000255607 00000 n +0000255801 00000 n +0000256035 00000 n +0000256229 00000 n +0000256463 00000 n +0000256658 00000 n +0000256893 00000 n +0000257089 00000 n +0000257277 00000 n +0000257470 00000 n +0000260465 00000 n +0000260658 00000 n +0000257704 00000 n +0000258815 00000 n +0000253176 00000 n +0000251964 00000 n +0000257877 00000 n +0000257994 00000 n +0000258053 00000 n +0000258112 00000 n +0000258171 00000 n +0000258230 00000 n +0000258288 00000 n +0000258347 00000 n +0000258406 00000 n +0000258465 00000 n +0000258638 00000 n +0000258697 00000 n +0000258756 00000 n +0000260893 00000 n +0000261095 00000 n +0000261331 00000 n +0000261539 00000 n +0000261775 00000 n +0000261969 00000 n +0000262205 00000 n +0000262399 00000 n +0000262641 00000 n +0000262837 00000 n +0000263031 00000 n +0000263272 00000 n +0000263481 00000 n +0000263724 00000 n +0000263918 00000 n +0000264161 00000 n +0000265216 00000 n +0000260168 00000 n +0000258927 00000 n +0000264334 00000 n +0000264393 00000 n +0000264452 00000 n +0000264511 00000 n +0000264570 00000 n +0000264629 00000 n +0000264688 00000 n +0000264862 00000 n +0000264921 00000 n +0000264980 00000 n +0000265039 00000 n +0000265098 00000 n +0000265157 00000 n +0000266774 00000 n +0000266968 00000 n +0000267206 00000 n +0000267391 00000 n +0000267576 00000 n +0000267815 00000 n +0000268020 00000 n +0000268259 00000 n +0000268492 00000 n +0000269485 00000 n +0000266558 00000 n +0000265328 00000 n +0000268665 00000 n +0000268724 00000 n +0000268899 00000 n +0000268958 00000 n +0000269017 00000 n +0000269076 00000 n +0000269135 00000 n +0000269310 00000 n +0000269368 00000 n +0000269426 00000 n +0000664910 00000 n +0000271459 00000 n +0000271681 00000 n +0000271903 00000 n +0000272099 00000 n +0000272293 00000 n +0000272498 00000 n +0000272720 00000 n +0000272910 00000 n +0000273132 00000 n +0000273355 00000 n +0000273577 00000 n +0000273767 00000 n +0000273990 00000 n +0000274182 00000 n +0000274404 00000 n +0000274600 00000 n +0000274823 00000 n +0000275019 00000 n +0000275242 00000 n +0000275447 00000 n +0000275670 00000 n +0000279326 00000 n +0000275890 00000 n +0000276946 00000 n +0000271126 00000 n +0000269597 00000 n +0000276063 00000 n +0000276238 00000 n +0000276297 00000 n +0000276356 00000 n +0000276415 00000 n +0000276474 00000 n +0000276533 00000 n +0000276592 00000 n +0000276651 00000 n +0000276710 00000 n +0000276769 00000 n +0000276828 00000 n +0000276887 00000 n +0000291193 00000 n +0000291311 00000 n +0000279547 00000 n +0000279770 00000 n +0000279991 00000 n +0000280212 00000 n +0000280434 00000 n +0000280655 00000 n +0000280846 00000 n +0000281068 00000 n +0000281256 00000 n +0000281477 00000 n +0000281671 00000 n +0000281893 00000 n +0000282089 00000 n +0000282311 00000 n +0000282516 00000 n +0000282739 00000 n +0000282944 00000 n +0000283167 00000 n +0000283390 00000 n +0000283577 00000 n +0000283766 00000 n +0000284144 00000 n +0000284331 00000 n +0000284554 00000 n +0000284741 00000 n +0000288277 00000 n +0000288499 00000 n +0000288688 00000 n +0000284964 00000 n +0000285430 00000 n +0000278939 00000 n +0000277058 00000 n +0000285137 00000 n +0000285196 00000 n +0000285253 00000 n +0000285312 00000 n +0000285371 00000 n +0000662309 00000 n +0000283955 00000 n +0000660715 00000 n +0000294490 00000 n +0000294606 00000 n +0000294729 00000 n +0000294852 00000 n +0000297233 00000 n +0000297351 00000 n +0000297469 00000 n +0000297587 00000 n +0000297705 00000 n +0000300299 00000 n +0000300417 00000 n +0000288877 00000 n +0000289081 00000 n +0000289303 00000 n +0000289507 00000 n +0000289727 00000 n +0000289930 00000 n +0000290124 00000 n +0000290314 00000 n +0000290504 00000 n +0000290725 00000 n +0000291369 00000 n +0000288025 00000 n +0000285570 00000 n +0000290898 00000 n +0000290957 00000 n +0000291016 00000 n +0000291075 00000 n +0000291134 00000 n +0000291252 00000 n +0000300535 00000 n +0000293695 00000 n +0000293917 00000 n +0000294140 00000 n +0000294910 00000 n +0000293533 00000 n +0000291520 00000 n +0000294313 00000 n +0000294372 00000 n +0000294431 00000 n +0000294548 00000 n +0000294670 00000 n +0000294793 00000 n +0000296942 00000 n +0000297823 00000 n +0000296798 00000 n +0000295034 00000 n +0000297115 00000 n +0000297174 00000 n +0000297292 00000 n +0000297410 00000 n +0000297528 00000 n +0000297646 00000 n +0000297764 00000 n +0000299831 00000 n +0000300067 00000 n +0000300886 00000 n +0000299678 00000 n +0000297961 00000 n +0000300240 00000 n +0000300358 00000 n +0000300476 00000 n +0000300594 00000 n +0000300768 00000 n +0000300827 00000 n +0000665035 00000 n +0000302521 00000 n +0000302754 00000 n +0000302987 00000 n +0000303223 00000 n +0000303459 00000 n +0000303695 00000 n +0000307037 00000 n +0000303929 00000 n +0000304983 00000 n +0000302323 00000 n +0000301037 00000 n +0000304102 00000 n +0000304161 00000 n +0000304336 00000 n +0000304395 00000 n +0000304454 00000 n +0000304513 00000 n +0000304688 00000 n +0000304747 00000 n +0000304806 00000 n +0000304865 00000 n +0000304924 00000 n +0000307273 00000 n +0000307508 00000 n +0000307744 00000 n +0000307980 00000 n +0000308451 00000 n +0000308687 00000 n +0000309511 00000 n +0000306830 00000 n +0000305121 00000 n +0000308860 00000 n +0000308919 00000 n +0000308978 00000 n +0000309037 00000 n +0000309096 00000 n +0000309155 00000 n +0000309214 00000 n +0000309273 00000 n +0000308216 00000 n +0000309332 00000 n +0000309395 00000 n +0000311534 00000 n +0000311766 00000 n +0000311998 00000 n +0000315601 00000 n +0000312230 00000 n +0000313113 00000 n +0000311363 00000 n +0000309623 00000 n +0000312403 00000 n +0000312520 00000 n +0000312579 00000 n +0000312638 00000 n +0000312697 00000 n +0000312756 00000 n +0000312815 00000 n +0000312874 00000 n +0000312933 00000 n +0000312997 00000 n +0000315792 00000 n +0000316035 00000 n +0000316278 00000 n +0000316522 00000 n +0000316733 00000 n +0000316977 00000 n +0000317188 00000 n +0000317409 00000 n +0000317653 00000 n +0000317874 00000 n +0000318118 00000 n +0000318361 00000 n +0000318552 00000 n +0000318795 00000 n +0000319016 00000 n +0000319260 00000 n +0000319481 00000 n +0000319923 00000 n +0000320166 00000 n +0000320357 00000 n +0000321295 00000 n +0000315268 00000 n +0000313251 00000 n +0000320530 00000 n +0000320647 00000 n +0000320706 00000 n +0000320765 00000 n +0000320824 00000 n +0000320883 00000 n +0000320942 00000 n +0000321001 00000 n +0000321060 00000 n +0000321119 00000 n +0000319702 00000 n +0000321178 00000 n +0000321236 00000 n +0000326153 00000 n +0000323245 00000 n +0000323455 00000 n +0000323708 00000 n +0000323929 00000 n +0000324182 00000 n +0000324403 00000 n +0000324657 00000 n +0000324910 00000 n +0000325101 00000 n +0000325355 00000 n +0000325608 00000 n +0000328954 00000 n +0000325862 00000 n +0000326859 00000 n +0000323002 00000 n +0000321407 00000 n +0000326035 00000 n +0000326094 00000 n +0000326212 00000 n +0000326387 00000 n +0000326446 00000 n +0000326505 00000 n +0000326564 00000 n +0000326623 00000 n +0000326682 00000 n +0000326741 00000 n +0000326800 00000 n +0000332496 00000 n +0000329165 00000 n +0000329356 00000 n +0000329585 00000 n +0000329815 00000 n +0000330011 00000 n +0000330208 00000 n +0000330438 00000 n +0000330635 00000 n +0000330865 00000 n +0000331062 00000 n +0000331292 00000 n +0000331489 00000 n +0000331719 00000 n +0000331916 00000 n +0000332146 00000 n +0000333260 00000 n +0000328675 00000 n +0000326971 00000 n +0000332319 00000 n +0000332378 00000 n +0000332437 00000 n +0000332555 00000 n +0000332730 00000 n +0000332789 00000 n +0000332848 00000 n +0000332907 00000 n +0000332966 00000 n +0000333025 00000 n +0000333084 00000 n +0000333143 00000 n +0000333202 00000 n +0000665160 00000 n +0000334789 00000 n +0000335018 00000 n +0000335247 00000 n +0000335442 00000 n +0000335639 00000 n +0000335869 00000 n +0000336066 00000 n +0000336296 00000 n +0000339680 00000 n +0000336487 00000 n +0000337423 00000 n +0000334573 00000 n +0000333386 00000 n +0000336660 00000 n +0000336719 00000 n +0000336894 00000 n +0000336953 00000 n +0000337012 00000 n +0000337071 00000 n +0000337130 00000 n +0000337189 00000 n +0000337248 00000 n +0000339900 00000 n +0000340121 00000 n +0000340317 00000 n +0000340538 00000 n +0000340734 00000 n +0000340955 00000 n +0000341150 00000 n +0000341370 00000 n +0000341565 00000 n +0000341785 00000 n +0000342005 00000 n +0000342226 00000 n +0000342447 00000 n +0000342668 00000 n +0000342889 00000 n +0000343110 00000 n +0000343331 00000 n +0000343517 00000 n +0000343738 00000 n +0000343934 00000 n +0000344155 00000 n +0000344351 00000 n +0000344571 00000 n +0000344767 00000 n +0000344956 00000 n +0000348553 00000 n +0000348774 00000 n +0000348970 00000 n +0000349159 00000 n +0000345145 00000 n +0000346143 00000 n +0000339302 00000 n +0000337549 00000 n +0000345318 00000 n +0000345377 00000 n +0000345436 00000 n +0000345495 00000 n +0000345553 00000 n +0000345612 00000 n +0000345671 00000 n +0000345730 00000 n +0000345789 00000 n +0000345848 00000 n +0000345907 00000 n +0000345966 00000 n +0000346025 00000 n +0000346084 00000 n +0000394263 00000 n +0000394381 00000 n +0000394498 00000 n +0000394616 00000 n +0000349348 00000 n +0000349568 00000 n +0000349764 00000 n +0000349953 00000 n +0000350142 00000 n +0000350328 00000 n +0000350549 00000 n +0000350745 00000 n +0000350934 00000 n +0000351123 00000 n +0000351310 00000 n +0000351507 00000 n +0000351727 00000 n +0000351915 00000 n +0000352112 00000 n +0000352333 00000 n +0000352520 00000 n +0000352717 00000 n +0000352937 00000 n +0000353123 00000 n +0000353344 00000 n +0000353532 00000 n +0000353753 00000 n +0000353941 00000 n +0000354162 00000 n +0000354350 00000 n +0000354570 00000 n +0000354755 00000 n +0000354976 00000 n +0000355196 00000 n +0000355417 00000 n +0000355638 00000 n +0000355859 00000 n +0000359214 00000 n +0000356080 00000 n +0000356606 00000 n +0000348076 00000 n +0000346281 00000 n +0000356253 00000 n +0000356312 00000 n +0000356370 00000 n +0000356429 00000 n +0000356488 00000 n +0000356547 00000 n +0000397562 00000 n +0000397685 00000 n +0000401170 00000 n +0000401293 00000 n +0000401414 00000 n +0000401532 00000 n +0000404438 00000 n +0000404556 00000 n +0000404674 00000 n +0000404792 00000 n +0000404910 00000 n +0000359435 00000 n +0000359655 00000 n +0000359843 00000 n +0000360063 00000 n +0000360251 00000 n +0000360471 00000 n +0000360666 00000 n +0000360886 00000 n +0000361082 00000 n +0000361302 00000 n +0000361490 00000 n +0000361710 00000 n +0000361898 00000 n +0000362118 00000 n +0000362314 00000 n +0000362534 00000 n +0000362730 00000 n +0000362950 00000 n +0000363138 00000 n +0000363358 00000 n +0000363546 00000 n +0000363765 00000 n +0000363952 00000 n +0000364172 00000 n +0000364360 00000 n +0000364580 00000 n +0000364801 00000 n +0000364987 00000 n +0000365207 00000 n +0000365393 00000 n +0000365589 00000 n +0000365777 00000 n +0000365994 00000 n +0000366178 00000 n +0000366372 00000 n +0000370346 00000 n +0000370567 00000 n +0000370753 00000 n +0000370949 00000 n +0000371145 00000 n +0000366559 00000 n +0000366909 00000 n +0000358746 00000 n +0000356731 00000 n +0000366732 00000 n +0000366791 00000 n +0000366850 00000 n +0000405032 00000 n +0000408158 00000 n +0000408275 00000 n +0000408393 00000 n +0000408511 00000 n +0000411573 00000 n +0000411691 00000 n +0000411809 00000 n +0000411927 00000 n +0000412045 00000 n +0000415231 00000 n +0000415349 00000 n +0000415466 00000 n +0000415584 00000 n +0000418915 00000 n +0000371333 00000 n +0000371554 00000 n +0000371740 00000 n +0000371936 00000 n +0000372328 00000 n +0000372516 00000 n +0000372737 00000 n +0000372923 00000 n +0000373128 00000 n +0000373324 00000 n +0000373513 00000 n +0000373733 00000 n +0000373917 00000 n +0000374121 00000 n +0000374512 00000 n +0000374701 00000 n +0000374922 00000 n +0000375118 00000 n +0000375323 00000 n +0000375715 00000 n +0000375934 00000 n +0000376130 00000 n +0000376335 00000 n +0000376531 00000 n +0000376750 00000 n +0000376935 00000 n +0000377155 00000 n +0000377347 00000 n +0000377567 00000 n +0000377755 00000 n +0000377975 00000 n +0000378163 00000 n +0000378383 00000 n +0000381597 00000 n +0000381817 00000 n +0000378602 00000 n +0000378834 00000 n +0000369833 00000 n +0000367021 00000 n +0000378775 00000 n +0000661299 00000 n +0000372132 00000 n +0000661008 00000 n +0000374316 00000 n +0000375519 00000 n +0000419033 00000 n +0000419150 00000 n +0000423242 00000 n +0000423360 00000 n +0000423477 00000 n +0000427030 00000 n +0000427148 00000 n +0000427266 00000 n +0000430802 00000 n +0000430920 00000 n +0000431037 00000 n +0000431155 00000 n +0000382005 00000 n +0000382224 00000 n +0000382416 00000 n +0000382636 00000 n +0000382856 00000 n +0000383042 00000 n +0000383262 00000 n +0000383454 00000 n +0000383640 00000 n +0000383860 00000 n +0000384059 00000 n +0000384253 00000 n +0000384473 00000 n +0000384668 00000 n +0000384889 00000 n +0000385109 00000 n +0000385296 00000 n +0000385516 00000 n +0000385710 00000 n +0000385930 00000 n +0000386118 00000 n +0000386337 00000 n +0000386522 00000 n +0000386742 00000 n +0000386930 00000 n +0000387150 00000 n +0000387338 00000 n +0000387558 00000 n +0000387745 00000 n +0000391105 00000 n +0000391326 00000 n +0000391514 00000 n +0000387940 00000 n +0000388408 00000 n +0000381174 00000 n +0000379027 00000 n +0000388113 00000 n +0000388172 00000 n +0000388231 00000 n +0000388290 00000 n +0000388349 00000 n +0000665285 00000 n +0000435006 00000 n +0000435121 00000 n +0000435239 00000 n +0000435357 00000 n +0000439183 00000 n +0000439301 00000 n +0000439416 00000 n +0000439534 00000 n +0000442828 00000 n +0000442946 00000 n +0000443064 00000 n +0000391710 00000 n +0000391931 00000 n +0000392119 00000 n +0000392315 00000 n +0000392536 00000 n +0000392724 00000 n +0000392920 00000 n +0000393108 00000 n +0000393298 00000 n +0000393504 00000 n +0000393708 00000 n +0000393913 00000 n +0000394674 00000 n +0000390835 00000 n +0000388533 00000 n +0000394086 00000 n +0000662744 00000 n +0000394145 00000 n +0000394204 00000 n +0000394322 00000 n +0000394439 00000 n +0000394557 00000 n +0000443181 00000 n +0000446222 00000 n +0000446340 00000 n +0000396859 00000 n +0000397065 00000 n +0000400115 00000 n +0000397271 00000 n +0000397807 00000 n +0000396697 00000 n +0000394854 00000 n +0000397444 00000 n +0000397503 00000 n +0000397626 00000 n +0000397749 00000 n +0000400321 00000 n +0000400527 00000 n +0000400733 00000 n +0000400938 00000 n +0000401590 00000 n +0000399935 00000 n +0000397932 00000 n +0000401111 00000 n +0000401234 00000 n +0000401355 00000 n +0000401473 00000 n +0000403324 00000 n +0000403530 00000 n +0000403736 00000 n +0000403941 00000 n +0000404147 00000 n +0000405096 00000 n +0000403144 00000 n +0000401715 00000 n +0000404320 00000 n +0000404379 00000 n +0000404497 00000 n +0000404615 00000 n +0000404733 00000 n +0000404851 00000 n +0000404973 00000 n +0000407046 00000 n +0000407252 00000 n +0000407456 00000 n +0000407662 00000 n +0000410253 00000 n +0000407867 00000 n +0000408570 00000 n +0000406866 00000 n +0000405208 00000 n +0000408040 00000 n +0000408099 00000 n +0000408217 00000 n +0000408334 00000 n +0000408452 00000 n +0000410459 00000 n +0000410665 00000 n +0000410870 00000 n +0000411076 00000 n +0000411282 00000 n +0000412103 00000 n +0000410064 00000 n +0000408682 00000 n +0000411455 00000 n +0000411514 00000 n +0000411632 00000 n +0000411750 00000 n +0000411868 00000 n +0000411986 00000 n +0000665410 00000 n +0000414117 00000 n +0000414323 00000 n +0000414529 00000 n +0000414734 00000 n +0000418067 00000 n +0000414940 00000 n +0000415702 00000 n +0000413937 00000 n +0000412215 00000 n +0000415113 00000 n +0000415172 00000 n +0000415290 00000 n +0000415408 00000 n +0000415525 00000 n +0000415643 00000 n +0000418272 00000 n +0000418477 00000 n +0000421630 00000 n +0000418683 00000 n +0000419268 00000 n +0000417896 00000 n +0000415827 00000 n +0000418856 00000 n +0000418974 00000 n +0000419092 00000 n +0000419209 00000 n +0000421836 00000 n +0000422042 00000 n +0000422423 00000 n +0000422629 00000 n +0000423010 00000 n +0000423536 00000 n +0000421423 00000 n +0000419443 00000 n +0000423183 00000 n +0000423301 00000 n +0000422232 00000 n +0000423419 00000 n +0000422819 00000 n +0000425739 00000 n +0000425945 00000 n +0000426136 00000 n +0000426342 00000 n +0000426533 00000 n +0000429564 00000 n +0000429770 00000 n +0000426739 00000 n +0000427384 00000 n +0000425550 00000 n +0000423711 00000 n +0000426912 00000 n +0000426971 00000 n +0000427089 00000 n +0000427207 00000 n +0000427325 00000 n +0000429956 00000 n +0000430162 00000 n +0000430368 00000 n +0000433385 00000 n +0000430570 00000 n +0000431273 00000 n +0000429375 00000 n +0000427547 00000 n +0000430743 00000 n +0000430861 00000 n +0000430978 00000 n +0000431096 00000 n +0000431214 00000 n +0000433586 00000 n +0000433791 00000 n +0000433993 00000 n +0000434179 00000 n +0000434385 00000 n +0000434569 00000 n +0000437762 00000 n +0000434774 00000 n +0000435474 00000 n +0000433178 00000 n +0000431411 00000 n +0000434947 00000 n +0000435064 00000 n +0000435180 00000 n +0000435298 00000 n +0000435416 00000 n +0000665535 00000 n +0000437968 00000 n +0000438170 00000 n +0000438354 00000 n +0000438560 00000 n +0000438746 00000 n +0000441773 00000 n +0000438951 00000 n +0000439652 00000 n +0000437564 00000 n +0000435599 00000 n +0000439124 00000 n +0000439242 00000 n +0000439358 00000 n +0000439475 00000 n +0000439593 00000 n +0000441978 00000 n +0000442184 00000 n +0000442390 00000 n +0000442596 00000 n +0000443239 00000 n +0000441593 00000 n +0000439777 00000 n +0000442769 00000 n +0000442887 00000 n +0000443005 00000 n +0000443123 00000 n +0000445520 00000 n +0000445725 00000 n +0000448610 00000 n +0000445931 00000 n +0000446458 00000 n +0000445358 00000 n +0000443377 00000 n +0000446104 00000 n +0000446163 00000 n +0000446281 00000 n +0000662598 00000 n +0000446399 00000 n +0000448815 00000 n +0000449033 00000 n +0000449251 00000 n +0000449470 00000 n +0000449655 00000 n +0000451764 00000 n +0000449841 00000 n +0000450718 00000 n +0000448412 00000 n +0000446623 00000 n +0000450014 00000 n +0000450189 00000 n +0000450248 00000 n +0000450307 00000 n +0000450366 00000 n +0000450425 00000 n +0000450484 00000 n +0000450543 00000 n +0000451988 00000 n +0000452397 00000 n +0000451611 00000 n +0000450843 00000 n +0000452161 00000 n +0000452220 00000 n +0000452279 00000 n +0000452338 00000 n +0000454139 00000 n +0000454290 00000 n +0000454441 00000 n +0000454592 00000 n +0000454743 00000 n +0000454894 00000 n +0000455045 00000 n +0000455195 00000 n +0000455345 00000 n +0000455495 00000 n +0000455646 00000 n +0000455796 00000 n +0000455946 00000 n +0000456096 00000 n +0000456247 00000 n +0000456398 00000 n +0000456549 00000 n +0000456699 00000 n +0000456849 00000 n +0000456999 00000 n +0000457150 00000 n +0000457301 00000 n +0000457452 00000 n +0000457603 00000 n +0000457754 00000 n +0000457905 00000 n +0000458055 00000 n +0000458206 00000 n +0000458357 00000 n +0000458507 00000 n +0000458657 00000 n +0000458808 00000 n +0000458958 00000 n +0000459108 00000 n +0000459258 00000 n +0000459409 00000 n +0000459560 00000 n +0000459711 00000 n +0000459862 00000 n +0000460012 00000 n +0000460163 00000 n +0000460314 00000 n +0000460465 00000 n +0000460616 00000 n +0000460767 00000 n +0000460918 00000 n +0000461069 00000 n +0000461220 00000 n +0000461371 00000 n +0000461522 00000 n +0000464058 00000 n +0000461790 00000 n +0000453554 00000 n +0000452509 00000 n +0000461672 00000 n +0000461731 00000 n +0000665660 00000 n +0000464209 00000 n +0000464360 00000 n +0000464510 00000 n +0000464660 00000 n +0000464810 00000 n +0000464961 00000 n +0000465111 00000 n +0000465262 00000 n +0000465413 00000 n +0000465564 00000 n +0000465714 00000 n +0000465865 00000 n +0000466015 00000 n +0000466165 00000 n +0000466315 00000 n +0000466466 00000 n +0000466617 00000 n +0000466768 00000 n +0000466919 00000 n +0000467069 00000 n +0000467220 00000 n +0000467371 00000 n +0000467522 00000 n +0000467672 00000 n +0000467822 00000 n +0000467973 00000 n +0000468124 00000 n +0000468275 00000 n +0000468426 00000 n +0000468577 00000 n +0000468728 00000 n +0000468879 00000 n +0000469030 00000 n +0000469181 00000 n +0000469332 00000 n +0000469483 00000 n +0000469634 00000 n +0000469785 00000 n +0000469936 00000 n +0000470087 00000 n +0000470237 00000 n +0000470388 00000 n +0000470539 00000 n +0000470689 00000 n +0000470840 00000 n +0000470990 00000 n +0000471141 00000 n +0000471292 00000 n +0000471442 00000 n +0000471592 00000 n +0000471743 00000 n +0000471893 00000 n +0000472043 00000 n +0000472192 00000 n +0000472343 00000 n +0000472493 00000 n +0000472644 00000 n +0000472795 00000 n +0000472945 00000 n +0000473096 00000 n +0000473247 00000 n +0000473397 00000 n +0000473547 00000 n +0000473698 00000 n +0000473848 00000 n +0000477016 00000 n +0000473999 00000 n +0000474231 00000 n +0000463320 00000 n +0000461876 00000 n +0000474172 00000 n +0000477166 00000 n +0000477317 00000 n +0000477467 00000 n +0000477617 00000 n +0000477767 00000 n +0000477918 00000 n +0000478069 00000 n +0000478219 00000 n +0000478369 00000 n +0000478518 00000 n +0000478669 00000 n +0000478819 00000 n +0000478970 00000 n +0000479121 00000 n +0000479272 00000 n +0000479423 00000 n +0000479574 00000 n +0000479725 00000 n +0000479876 00000 n +0000480026 00000 n +0000480176 00000 n +0000480327 00000 n +0000480477 00000 n +0000480628 00000 n +0000480779 00000 n +0000480928 00000 n +0000481079 00000 n +0000481229 00000 n +0000481380 00000 n +0000481530 00000 n +0000481681 00000 n +0000481832 00000 n +0000481982 00000 n +0000482133 00000 n +0000482283 00000 n +0000482434 00000 n +0000482585 00000 n +0000482735 00000 n +0000482886 00000 n +0000483036 00000 n +0000483185 00000 n +0000483335 00000 n +0000483484 00000 n +0000483634 00000 n +0000483785 00000 n +0000483936 00000 n +0000484087 00000 n +0000484238 00000 n +0000484388 00000 n +0000484538 00000 n +0000484688 00000 n +0000484839 00000 n +0000484989 00000 n +0000485140 00000 n +0000485291 00000 n +0000485441 00000 n +0000485591 00000 n +0000485742 00000 n +0000485893 00000 n +0000486043 00000 n +0000486193 00000 n +0000486344 00000 n +0000486495 00000 n +0000486646 00000 n +0000486797 00000 n +0000486948 00000 n +0000487099 00000 n +0000487250 00000 n +0000487401 00000 n +0000487552 00000 n +0000487703 00000 n +0000487853 00000 n +0000488003 00000 n +0000488153 00000 n +0000488304 00000 n +0000488454 00000 n +0000488603 00000 n +0000488750 00000 n +0000488900 00000 n +0000489051 00000 n +0000489200 00000 n +0000489351 00000 n +0000489501 00000 n +0000489652 00000 n +0000489801 00000 n +0000489951 00000 n +0000490101 00000 n +0000490251 00000 n +0000490402 00000 n +0000490551 00000 n +0000490701 00000 n +0000490852 00000 n +0000491003 00000 n +0000491154 00000 n +0000491304 00000 n +0000493941 00000 n +0000491454 00000 n +0000491686 00000 n +0000476008 00000 n +0000474343 00000 n +0000491627 00000 n +0000494091 00000 n +0000494242 00000 n +0000494393 00000 n +0000494543 00000 n +0000494694 00000 n +0000494844 00000 n +0000494995 00000 n +0000495144 00000 n +0000495294 00000 n +0000495443 00000 n +0000495594 00000 n +0000495745 00000 n +0000495896 00000 n +0000496046 00000 n +0000496197 00000 n +0000496348 00000 n +0000496498 00000 n +0000496649 00000 n +0000496799 00000 n +0000496949 00000 n +0000497099 00000 n +0000497250 00000 n +0000497401 00000 n +0000497551 00000 n +0000497702 00000 n +0000497853 00000 n +0000498003 00000 n +0000498154 00000 n +0000498305 00000 n +0000498456 00000 n +0000498607 00000 n +0000498758 00000 n +0000498909 00000 n +0000499060 00000 n +0000499211 00000 n +0000499362 00000 n +0000499513 00000 n +0000499664 00000 n +0000499815 00000 n +0000499966 00000 n +0000500116 00000 n +0000500266 00000 n +0000500417 00000 n +0000500568 00000 n +0000500719 00000 n +0000500870 00000 n +0000501021 00000 n +0000501171 00000 n +0000501322 00000 n +0000501472 00000 n +0000501623 00000 n +0000501774 00000 n +0000501925 00000 n +0000502076 00000 n +0000502227 00000 n +0000502378 00000 n +0000502529 00000 n +0000502680 00000 n +0000502831 00000 n +0000502982 00000 n +0000503133 00000 n +0000503284 00000 n +0000503435 00000 n +0000503586 00000 n +0000503736 00000 n +0000504866 00000 n +0000503885 00000 n +0000504117 00000 n +0000493203 00000 n +0000491798 00000 n +0000504058 00000 n +0000505017 00000 n +0000505249 00000 n +0000504713 00000 n +0000504216 00000 n +0000505190 00000 n +0000505348 00000 n +0000505374 00000 n +0000505400 00000 n +0000505868 00000 n +0000506029 00000 n +0000506156 00000 n +0000506478 00000 n +0000506914 00000 n +0000507241 00000 n +0000507368 00000 n +0000507395 00000 n +0000507864 00000 n +0000508128 00000 n +0000659790 00000 n +0000508166 00000 n +0000508638 00000 n +0000508990 00000 n +0000509435 00000 n +0000509911 00000 n +0000510343 00000 n +0000510715 00000 n +0000511290 00000 n +0000511982 00000 n +0000512020 00000 n +0000512338 00000 n +0000512981 00000 n +0000514698 00000 n +0000514930 00000 n +0000518666 00000 n +0000518942 00000 n +0000520758 00000 n +0000520993 00000 n +0000523770 00000 n +0000524000 00000 n +0000526974 00000 n +0000527205 00000 n +0000529593 00000 n +0000529850 00000 n +0000535039 00000 n +0000535322 00000 n +0000539080 00000 n +0000539326 00000 n +0000543487 00000 n +0000543748 00000 n +0000547428 00000 n +0000547696 00000 n +0000549721 00000 n +0000550004 00000 n +0000552347 00000 n +0000552611 00000 n +0000553928 00000 n +0000554161 00000 n +0000556180 00000 n +0000556426 00000 n +0000558269 00000 n +0000558531 00000 n +0000560687 00000 n +0000560916 00000 n +0000562816 00000 n +0000563035 00000 n +0000579108 00000 n +0000579589 00000 n +0000587812 00000 n +0000588104 00000 n +0000606048 00000 n +0000606534 00000 n +0000621307 00000 n +0000621678 00000 n +0000642596 00000 n +0000643190 00000 n +0000659339 00000 n +0000665776 00000 n +0000665896 00000 n +0000666021 00000 n +0000666120 00000 n +0000666202 00000 n +0000670918 00000 n +0000671190 00000 n +0000671967 00000 n +0000672722 00000 n +0000673407 00000 n +0000674146 00000 n +0000674811 00000 n +0000675475 00000 n +0000676198 00000 n +0000676965 00000 n +0000677576 00000 n +0000678337 00000 n +0000679037 00000 n +0000679765 00000 n +0000680473 00000 n +0000681292 00000 n +0000682158 00000 n +0000682993 00000 n +0000683806 00000 n +0000684610 00000 n +0000685477 00000 n +0000686251 00000 n +0000686992 00000 n +0000687745 00000 n +0000688498 00000 n +0000689251 00000 n +0000690004 00000 n +0000690747 00000 n +0000691564 00000 n +0000692411 00000 n +0000693332 00000 n +0000694266 00000 n +0000695122 00000 n +0000695931 00000 n +0000696706 00000 n +0000697376 00000 n +0000698113 00000 n +0000698850 00000 n +0000699587 00000 n +0000700324 00000 n +0000701061 00000 n +0000701798 00000 n +0000702535 00000 n +0000703272 00000 n +0000704009 00000 n +0000704746 00000 n +0000705483 00000 n +0000706220 00000 n +0000706913 00000 n +0000707477 00000 n +0000708080 00000 n +0000708947 00000 n +0000709814 00000 n +0000710681 00000 n +0000711548 00000 n +0000712063 00000 n +0000712232 00000 n +0000712401 00000 n +0000712572 00000 n +0000712742 00000 n +0000712914 00000 n +0000713089 00000 n +0000713266 00000 n +0000713441 00000 n +0000713618 00000 n +0000713793 00000 n +0000713970 00000 n +0000714144 00000 n +0000714318 00000 n +0000714495 00000 n +0000714704 00000 n +0000714968 00000 n +0000715232 00000 n +0000715508 00000 n +0000715781 00000 n +0000716054 00000 n +0000716328 00000 n +0000716609 00000 n +0000716889 00000 n +0000717170 00000 n +0000717449 00000 n +0000717728 00000 n +0000718009 00000 n +0000718289 00000 n +0000718570 00000 n +0000718841 00000 n +0000719101 00000 n +0000719352 00000 n +0000719566 00000 n +0000719769 00000 n +0000719970 00000 n +0000720171 00000 n +0000720374 00000 n +0000720576 00000 n +0000720785 00000 n +0000720992 00000 n +0000721201 00000 n +0000721408 00000 n +0000721617 00000 n +0000721824 00000 n +0000722033 00000 n +0000722230 00000 n +0000722413 00000 n +0000722623 00000 n +0000722866 00000 n +0000723107 00000 n +0000723350 00000 n +0000723591 00000 n +0000723825 00000 n +0000724050 00000 n +0000724312 00000 n +0000724601 00000 n +0000724883 00000 n +0000725172 00000 n +0000725461 00000 n +0000725746 00000 n +0000726035 00000 n +0000726316 00000 n +0000726590 00000 n +0000726778 00000 n +0000727047 00000 n +0000727331 00000 n +0000727604 00000 n +0000727885 00000 n +0000728141 00000 n +0000728397 00000 n +0000728651 00000 n +0000728895 00000 n +0000729009 00000 n +0000729125 00000 n +0000729252 00000 n +0000729393 00000 n +0000729535 00000 n +0000729667 00000 n +0000729791 00000 n +0000729913 00000 n +0000730039 00000 n +0000730177 00000 n +0000730301 00000 n +0000730489 00000 n +0000730687 00000 n +0000730823 00000 n +0000730923 00000 n +0000731035 00000 n +0000731075 00000 n +0000731275 00000 n +trailer +<< /Size 2699 +/Root 2697 0 R +/Info 2698 0 R +/ID [<8A8BB657F4142BF37C8ECC8BC9F5443E> <8A8BB657F4142BF37C8ECC8BC9F5443E>] >> +startxref +731607 +%%EOF diff --git a/doc/ppl-user-java-interface-0.10.2.ps.gz b/doc/ppl-user-java-interface-0.10.2.ps.gz new file mode 100644 index 0000000000000000000000000000000000000000..f8b3f3f33bafa4aa64ef033a744743b8e329bf2d GIT binary patch literal 324612 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%0D_>cop03RmIr!kO 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

55UH}9KAlj*FK}3}@t)(kB)DxZ(=;nM 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 literal 0 HcmV?d00001 diff --git a/doc/ppl-user-ocaml-interface-0.10.2.ps.gz b/doc/ppl-user-ocaml-interface-0.10.2.ps.gz new file mode 100644 index 0000000000000000000000000000000000000000..354171ae9a9147afaa66adcfb4d9f977247e6ab0 GIT binary patch literal 196053 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
U`Pf3 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 literal 0 HcmV?d00001 diff --git a/doc/ppl-user-prolog-interface-0.10.2-html.tar.gz b/doc/ppl-user-prolog-interface-0.10.2-html.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..8302564e44767280dbb9055783d081540fd22dc6 GIT binary patch literal 72546 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

RAhg!4`92{YQ3<{n5}<#@=#jDNz6? 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 literal 0 HcmV?d00001 diff --git a/doc/ppl-user-prolog-interface-0.10.2.pdf b/doc/ppl-user-prolog-interface-0.10.2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..648942ee46123f47930ea4c6a768c2bec50b5dac GIT binary patch literal 257972 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%0D4IX)0s6@mSwKZNX8fq2A)d9n_mR3y{ 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

H)tMO9PP!#;6|#5th7#)97#z8RPU+um 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 )cRh! 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 RfiqO|`=5XQn5kp?|34wMwORlG literal 0 HcmV?d00001 diff --git a/doc/ppl-user-prolog-interface-0.10.2.ps.gz b/doc/ppl-user-prolog-interface-0.10.2.ps.gz new file mode 100644 index 0000000000000000000000000000000000000000..9923a8c093f8e834b2aabf3caaf8be07418f8b90 GIT binary patch literal 230915 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%0AbtbOWXk3 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�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¬{;lzAy}yI%$xhGbwWc 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

=`t;q2Wa}K<^9bE?Jl!j+w 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 z +%% +%% This file is part of the Parma Polyhedra Library (PPL). +%% +%% The PPL is free software; you can redistribute it and/or modify it +%% under the terms of the GNU General Public License as published by the +%% Free Software Foundation; either version 3 of the License, or (at your +%% option) any later version. +%% +%% The PPL is distributed in the hope that it will be useful, but WITHOUT +%% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +%% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +%% for more details. +%% +%% You should have received a copy of the GNU General Public License +%% along with this program; if not, write to the Free Software Foundation, +%% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +%% +%% For the most up-to-date information see the Parma Polyhedra Library +%% site: http://www.cs.unipr.it/ppl/ . + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{ppl} +\RequirePackage{amsmath} +\RequirePackage{amssymb} + +%% Calligraphic alphabet +\newcommand*{\cA}{\ensuremath{\mathcal{A}}} +\newcommand*{\cB}{\ensuremath{\mathcal{B}}} +\newcommand*{\cC}{\ensuremath{\mathcal{C}}} +\newcommand*{\cD}{\ensuremath{\mathcal{D}}} +\newcommand*{\cE}{\ensuremath{\mathcal{E}}} +\newcommand*{\cF}{\ensuremath{\mathcal{F}}} +\newcommand*{\cG}{\ensuremath{\mathcal{G}}} +\newcommand*{\cH}{\ensuremath{\mathcal{H}}} +\newcommand*{\cI}{\ensuremath{\mathcal{I}}} +\newcommand*{\cJ}{\ensuremath{\mathcal{J}}} +\newcommand*{\cK}{\ensuremath{\mathcal{K}}} +\newcommand*{\cL}{\ensuremath{\mathcal{L}}} +\newcommand*{\cM}{\ensuremath{\mathcal{M}}} +\newcommand*{\cN}{\ensuremath{\mathcal{N}}} +\newcommand*{\cO}{\ensuremath{\mathcal{O}}} +\newcommand*{\cP}{\ensuremath{\mathcal{P}}} +\newcommand*{\cQ}{\ensuremath{\mathcal{Q}}} +\newcommand*{\cR}{\ensuremath{\mathcal{R}}} +\newcommand*{\cS}{\ensuremath{\mathcal{S}}} +\newcommand*{\cT}{\ensuremath{\mathcal{T}}} +\newcommand*{\cU}{\ensuremath{\mathcal{U}}} +\newcommand*{\cV}{\ensuremath{\mathcal{V}}} +\newcommand*{\cW}{\ensuremath{\mathcal{W}}} +\newcommand*{\cX}{\ensuremath{\mathcal{X}}} +\newcommand*{\cY}{\ensuremath{\mathcal{Y}}} +\newcommand*{\cZ}{\ensuremath{\mathcal{Z}}} + +%% Special letters denoting sets and algebras. +\providecommand*{\Nset}{\mathbb{N}} % Naturals +\newcommand*{\extNset}{\mathbb{N}_\infty} % Extended naturals +\providecommand*{\Oset}{\mathbb{O}} % Ordinals +\providecommand*{\Qset}{\mathbb{Q}} % Rationals +\providecommand*{\Rset}{\mathbb{R}} % Reals +\providecommand*{\nonnegRset}{\mathbb{R}_{\scriptscriptstyle{+}}} + % Non-negative reals +\newcommand*{\extRset}{\Rset_\infty} % Extended reals +\providecommand*{\Zset}{\mathbb{Z}} % Integers +\providecommand*{\CPset}{\mathbb{CP}} % Closed polyhedra +\providecommand*{\Pset}{\mathbb{P}} % (NNC) polyhedra +\providecommand*{\Sset}{\mathbb{S}} % Reals or rationals + +%% Grid notation +\providecommand*{\Gset}{\mathbb{G}} % Grid +\providecommand*{\cg}{\mathord{\mathrm{cg}}} % Congruence +\newcommand*{\gcon}{\mathop{\mathrm{gcon}}\nolimits} + % Grid from congruence system +\newcommand*{\ggen}{\mathop{\mathrm{ggen}}\nolimits} + % Grid from generator system + +%% Function notation +\newcommand*{\fund}[3]{\mathord{#1}\colon#2\rightarrow#3} +\newcommand*{\pard}[3]{\mathord{#1}\colon#2\rightarrowtail#3} + +%% Relation notation +\newcommand*{\reld}[3]{\mathord{#1}\subseteq#2\times#3} + +%% Set theory. +\renewcommand*{\emptyset}{\mathord{\varnothing}} +\newcommand*{\sseq}{\subseteq} +\newcommand*{\sseqf}{\mathrel{\subseteq_\mathrm{f}}} +\newcommand*{\sslt}{\subset} +\newcommand*{\Sseq}{\supseteq} +\newcommand*{\Ssgt}{\supset} +\newcommand*{\inters}{\cap} +\newcommand*{\setdiff}{\setminus} +\newcommand*{\union}{\cup} +\newcommand*{\card}{\mathop{\#}\nolimits} +\newcommand*{\sset}[2]{{\renewcommand*{\arraystretch}{1.2} + \left\{\,#1 \,\left|\, + \begin{array}{@{}l@{}}#2\end{array} + \right. \,\right\}}} +\newcommand*{\meet}{\mathbin{\otimes}} +\newcommand*{\join}{\mathbin{\oplus}} + +%% Logic notation. +\newcommand*{\entails}{\mathrel{\vdash}} +\newcommand*{\sentails}{\mathrel{\Vdash}} +\newcommand*{\Nentails}{\mathrel{\nvdash}} +\newcommand*{\Nsentails}{\mathrel{\nVdash}} +\newcommand*{\entailss}[1]{\mathrel{\vdash_{#1}}} +\newcommand*{\Entailss}[1]{\mathrel{\dashv_{#1}}} +\newcommand*{\sentailss}[1]{\mathrel{\Vdash_{#1}}} +\newcommand*{\Nentailss}[1]{\mathrel{\nvdash_{#1}}} +\newcommand*{\bigland}{\mathop{\bigwedge}\limits} +\newcommand*{\biglor}{\mathop{\bigvee}\limits} +\newcommand*{\piff}{\mathrel{\leftrightarrow}} +\newcommand*{\pimplies}{\mathrel{\rightarrow}} +\newcommand*{\pimplied}{\mathrel{\leftarrow}} +\newcommand*{\st}{\mathrel{.}} +\newcommand*{\itc}{\mathrel{:}} + +%% Integer division and reminder binary operators. +\newcommand*{\bdiv}{\mathbin{\mathrm{div}}} +\newcommand*{\brem}{\mathbin{\mathrm{rem}}} + + +%% True and false +\newcommand*{\false}{\mathord{\textbf{\textup{0}}}} +\newcommand*{\true}{\mathord{\textbf{\textup{1}}}} + +%% Things that hold by definition. +\newcommand*{\defrel}[1]{\mathrel{\buildrel \mathrm{def} \over {#1}}} +\newcommand*{\defeq}{\defrel{=}} +\newcommand*{\defiff}{\defrel{\Longleftrightarrow}} + +% Arbitrary relation symbol. +\newcommand*{\relsym}{\mathrel{\bowtie}} +\newcommand*{\relsyms}[1]{\mathrel{\bowtie_{#1}}} + +% Vectors. +\renewcommand*{\vec}[1]{\mathchoice{\mbox{\boldmath$\displaystyle#1$}} +{\mbox{\boldmath$\textstyle#1$}} +{\mbox{\boldmath$\scriptstyle#1$}} +{\mbox{\boldmath$\scriptscriptstyle#1$}}} + +\newcommand*{\vect}[1]{\vec{#1}} + +% Matrix functions. +\newcommand*{\transpose}{\mathrm{T}} + +% Hulls. +\newcommand*{\linearhull}{\mathop{\mathrm{linear.hull}}} +\newcommand*{\conichull}{\mathop{\mathrm{conic.hull}}} +\newcommand*{\affinehull}{\mathop{\mathrm{affine.hull}}} +\newcommand*{\convexhull}{\mathop{\mathrm{convex.hull}}} +\newcommand*{\NNChull}{\mathop{\mathrm{nnc.hull}}} +\newcommand*{\inthull}{\mathop{\mathrm{int.hull}}} +\newcommand*{\intaffinehull}{\mathop{\mathrm{int.affine.hull}}} + +% Polyhedron functions. +\newcommand*{\prank}{\mathop{\mathrm{rank}}} +\newcommand*{\pdim}{\mathop{\mathrm{dim}}} +\newcommand*{\linspace}{\mathop{\mathrm{lin.space}}} +\newcommand*{\cone}{\mathop{\mathrm{cone}}} + +% Widening +\newcommand*{\widen}{\mathrel{\nabla}} + +% Powerset notation +\newcommand*{\pnonredmap}{\mathop{\Omega^{\scriptscriptstyle\sseq}_{\scriptscriptstyle {\CPset_n}}}\nolimits} +\newcommand*{\pnonredmapi}[1]{\mathop{\Omega^{\scriptscriptstyle\sseq}_{\scriptscriptstyle {\CPset_{#1}}}}\nolimits} +\newcommand*{\nonredmap}{\mathop{\Omega^{\scriptscriptstyle\entails}_{\scriptscriptstyle D}}\nolimits} + +\newcommand*{\wpf}{\mathop{\wp_\mathrm{f}}\nolimits} +\newcommand*{\wpfn}[2]{\mathord{\wp_\mathrm{fn}^{\scriptscriptstyle #2}}(#1)} + +\newcommand*{\smallP}{{\scriptscriptstyle\mathrm{P}}} +\newcommand*{\entailsP}{\entailss{\smallP}} +\newcommand*{\NentailsP}{\Nentailss{\smallP}} +\newcommand*{\sentailsP}{\sentailss{\smallP}} diff --git a/doc/user-language-interface.doxyconf.in b/doc/user-language-interface.doxyconf.in new file mode 100644 index 0000000..012b9ff --- /dev/null +++ b/doc/user-language-interface.doxyconf.in @@ -0,0 +1,259 @@ +# Doxyfile 1.5.7.1 + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +DOXYFILE_ENCODING = UTF-8 +PROJECT_NAME = "PPL Language Interface" +PROJECT_NUMBER = @VERSION@ +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 = +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = NO +OPTIMIZE_FOR_FORTRAN = NO +OPTIMIZE_OUTPUT_VHDL = NO +BUILTIN_STL_SUPPORT = NO +CPP_CLI_SUPPORT = NO +SIP_SUPPORT = NO +IDL_PROPERTY_SUPPORT = YES +DISTRIBUTE_GROUP_DOC = NO +SUBGROUPING = YES +TYPEDEF_HIDES_STRUCT = NO +SYMBOL_CACHE_SIZE = 0 +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = NO +EXTRACT_PRIVATE = 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 +INLINE_INFO = YES +SORT_MEMBER_DOCS = NO +SORT_BRIEF_DOCS = NO +SORT_GROUP_NAMES = NO +SORT_BY_SCOPE_NAME = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 5 +SHOW_USED_FILES = YES +SHOW_DIRECTORIES = NO +SHOW_FILES = YES +SHOW_NAMESPACES = YES +FILE_VERSION_FILTER = +LAYOUT_FILE = +#--------------------------------------------------------------------------- +# 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 = +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 +#--------------------------------------------------------------------------- +# 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 = +HTML_OUTPUT = ppl-user--@VERSION@-html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +HTML_DYNAMIC_SECTIONS = NO +GENERATE_DOCSET = NO +DOCSET_FEEDNAME = "Doxygen generated docs" +DOCSET_BUNDLE_ID = org.doxygen.Project +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 +QHG_LOCATION = +DISABLE_INDEX = NO +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = YES +TREEVIEW_WIDTH = 250 +FORMULA_FONTSIZE = 10 +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = +LATEX_OUTPUT = user-.latex-dir +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = YES +PAPER_TYPE = a4wide +EXTRA_PACKAGES = ppl +LATEX_HEADER = user-.tex +PDF_HYPERLINKS = YES +USE_PDFLATEX = YES +LATEX_BATCHMODE = YES +LATEX_HIDE_INDICES = NO +#--------------------------------------------------------------------------- +# 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 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_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 = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = @PERL@ +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = NO +MSCGEN_PATH = +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = YES +DOT_FONTNAME = FreeSans +DOT_FONTSIZE = 10 +DOT_FONTPATH = +CLASS_GRAPH = YES +COLLABORATION_GRAPH = NO +GROUP_GRAPHS = YES +UML_LOOK = NO +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 +DOT_PATH = +DOTFILE_DIRS = +DOT_GRAPH_MAX_NODES = 50 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO diff --git a/doc/user-language-interface.tex b/doc/user-language-interface.tex new file mode 100644 index 0000000..0c78019 --- /dev/null +++ b/doc/user-language-interface.tex @@ -0,0 +1,135 @@ +% Copyright (C) 2001--2009 Roberto Bagnara +% +% This document describes the Parma Polyhedra Library (PPL). +% +% Permission is granted to copy, distribute and/or modify this document +% under the terms of the GNU Free Documentation License, Version 1.2 +% or any later version published by the Free Software Foundation; +% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. +% The license is included, in various formats, in the `doc' subdirectory +% of each distribution of the PPL in files called `fdl.*'. +% +% The PPL is free software; you can redistribute it and/or modify it +% under the terms of the GNU General Public License as published by the +% Free Software Foundation; either version 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 are called `gpl.*'. +% +% The PPL is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +% for more details. +% +% For the most up-to-date information see the Parma Polyhedra Library +% site: http://www.cs.unipr.it/ppl/ . + +\documentclass[a4paper]{article} +\usepackage{a4wide} +\usepackage{makeidx} +\usepackage{fancyhdr} +\usepackage{graphicx} +\usepackage{multicol} +\usepackage{float} +\usepackage{textcomp} +\usepackage{alltt} +\usepackage{times} +\usepackage{ifpdf} +\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} + +\rfoot[\fancyplain{}{\scriptsize The Parma Polyhedra Library Language Interface User's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}]{} +\lfoot[]{\fancyplain{}{\scriptsize The Parma Polyhedra Library Language Interface User's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}} + +\begin{document} +\title{ +The Parma Polyhedra Library \\ + 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@cs.unipr.it, + Department of Mathematics, University of Parma, Italy.} \\ +Patricia M. Hill\thanks{hill@comp.leeds.ac.uk, + School of Computing, University of Leeds, U.K.} \\ +Enea Zaffanella\thanks{zaffanella@cs.unipr.it, + Department of Mathematics, University of Parma, Italy.} +} +\maketitle + +\newpage +Copyright \copyright\ 2001--2009 Roberto Bagnara (bagnara@cs.unipr.it). + +This document describes the Parma Polyhedra Library (PPL). + +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.2 +or any later version published by the +\href{http://www.fsf.org}{Free Software Foundation}; +with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. +A copy of the license is included in the section entitled +``\hyperlink{GFDL_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. + +For the most up-to-date information see the Parma Polyhedra Library +site: +\begin{center} +\href{http://www.cs.unipr.it/ppl/}{\tt http://www.cs.unipr.it/ppl/} +\end{center} + +\pagenumbering{roman} +\tableofcontents +\pagenumbering{arabic} diff --git a/doc/user.doxyconf-html.in b/doc/user.doxyconf-html.in new file mode 100644 index 0000000..fa09a88 --- /dev/null +++ b/doc/user.doxyconf-html.in @@ -0,0 +1,256 @@ +# Doxyfile 1.5.7.1 + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +DOXYFILE_ENCODING = UTF-8 +PROJECT_NAME = PPL +PROJECT_NUMBER = @VERSION@ +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 = +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = NO +OPTIMIZE_FOR_FORTRAN = NO +OPTIMIZE_OUTPUT_VHDL = NO +BUILTIN_STL_SUPPORT = NO +CPP_CLI_SUPPORT = NO +SIP_SUPPORT = NO +IDL_PROPERTY_SUPPORT = YES +DISTRIBUTE_GROUP_DOC = NO +SUBGROUPING = YES +TYPEDEF_HIDES_STRUCT = NO +SYMBOL_CACHE_SIZE = 0 +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = NO +EXTRACT_PRIVATE = 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 +INLINE_INFO = YES +SORT_MEMBER_DOCS = NO +SORT_BRIEF_DOCS = NO +SORT_GROUP_NAMES = NO +SORT_BY_SCOPE_NAME = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 5 +SHOW_USED_FILES = YES +SHOW_DIRECTORIES = NO +SHOW_FILES = YES +SHOW_NAMESPACES = YES +FILE_VERSION_FILTER = +LAYOUT_FILE = +#--------------------------------------------------------------------------- +# 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 +#--------------------------------------------------------------------------- +# 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-@VERSION@-html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +HTML_DYNAMIC_SECTIONS = NO +GENERATE_DOCSET = NO +DOCSET_FEEDNAME = "Doxygen generated docs" +DOCSET_BUNDLE_ID = org.doxygen.Project +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 +QHG_LOCATION = +DISABLE_INDEX = NO +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = YES +TREEVIEW_WIDTH = 250 +FORMULA_FONTSIZE = 10 +#--------------------------------------------------------------------------- +# 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 +PDF_HYPERLINKS = YES +USE_PDFLATEX = YES +LATEX_BATCHMODE = YES +LATEX_HIDE_INDICES = NO +#--------------------------------------------------------------------------- +# 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 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-@VERSION@-html.tag +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = @PERL@ +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = NO +MSCGEN_PATH = +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = YES +DOT_FONTNAME = FreeSans +DOT_FONTSIZE = 10 +DOT_FONTPATH = +CLASS_GRAPH = YES +COLLABORATION_GRAPH = NO +GROUP_GRAPHS = YES +UML_LOOK = NO +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 +DOT_PATH = +DOTFILE_DIRS = +DOT_GRAPH_MAX_NODES = 50 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO diff --git a/doc/user.doxyconf-latex.in b/doc/user.doxyconf-latex.in new file mode 100644 index 0000000..c8c3253 --- /dev/null +++ b/doc/user.doxyconf-latex.in @@ -0,0 +1,256 @@ +# Doxyfile 1.5.7.1 + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +DOXYFILE_ENCODING = UTF-8 +PROJECT_NAME = PPL +PROJECT_NUMBER = @VERSION@ +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 = +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = NO +OPTIMIZE_FOR_FORTRAN = NO +OPTIMIZE_OUTPUT_VHDL = NO +BUILTIN_STL_SUPPORT = NO +CPP_CLI_SUPPORT = NO +SIP_SUPPORT = NO +IDL_PROPERTY_SUPPORT = YES +DISTRIBUTE_GROUP_DOC = NO +SUBGROUPING = YES +TYPEDEF_HIDES_STRUCT = NO +SYMBOL_CACHE_SIZE = 0 +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = NO +EXTRACT_PRIVATE = 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 +INLINE_INFO = YES +SORT_MEMBER_DOCS = NO +SORT_BRIEF_DOCS = NO +SORT_GROUP_NAMES = NO +SORT_BY_SCOPE_NAME = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 5 +SHOW_USED_FILES = YES +SHOW_DIRECTORIES = NO +SHOW_FILES = YES +SHOW_NAMESPACES = YES +FILE_VERSION_FILTER = +LAYOUT_FILE = +#--------------------------------------------------------------------------- +# 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 +#--------------------------------------------------------------------------- +# 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-@VERSION@-html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +HTML_DYNAMIC_SECTIONS = NO +GENERATE_DOCSET = NO +DOCSET_FEEDNAME = "Doxygen generated docs" +DOCSET_BUNDLE_ID = org.doxygen.Project +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 +QHG_LOCATION = +DISABLE_INDEX = NO +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = YES +TREEVIEW_WIDTH = 250 +FORMULA_FONTSIZE = 10 +#--------------------------------------------------------------------------- +# 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 +PDF_HYPERLINKS = YES +USE_PDFLATEX = YES +LATEX_BATCHMODE = YES +LATEX_HIDE_INDICES = NO +#--------------------------------------------------------------------------- +# 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 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 +PERL_PATH = @PERL@ +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = NO +MSCGEN_PATH = +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = YES +DOT_FONTNAME = FreeSans +DOT_FONTSIZE = 10 +DOT_FONTPATH = +CLASS_GRAPH = YES +COLLABORATION_GRAPH = NO +GROUP_GRAPHS = YES +UML_LOOK = NO +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 +DOT_PATH = +DOTFILE_DIRS = +DOT_GRAPH_MAX_NODES = 50 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO diff --git a/doc/user.tex b/doc/user.tex new file mode 100644 index 0000000..b5d248a --- /dev/null +++ b/doc/user.tex @@ -0,0 +1,144 @@ +% Copyright (C) 2001-2009 Roberto Bagnara +% +% This document describes the Parma Polyhedra Library (PPL). +% +% Permission is granted to copy, distribute and/or modify this document +% under the terms of the GNU Free Documentation License, Version 1.2 +% or any later version published by the Free Software Foundation; +% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. +% The license is included, in various formats, in the `doc' subdirectory +% of each distribution of the PPL in files called `fdl.*'. +% +% The PPL is free software; you can redistribute it and/or modify it +% under the terms of the GNU General Public License as published by the +% Free Software Foundation; either version 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 are called `gpl.*'. +% +% The PPL is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +% for more details. +% +% For the most up-to-date information see the Parma Polyhedra Library +% site: http://www.cs.unipr.it/ppl/ . + +\documentclass[a4paper]{article} +\usepackage{a4wide} +\usepackage{makeidx} +\usepackage{fancyhdr} +\usepackage{graphicx} +\usepackage{multicol} +\usepackage{float} +\usepackage{textcomp} +\usepackage{alltt} +\usepackage{times} +\usepackage{ifpdf} +\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} + +\rfoot[\fancyplain{}{\scriptsize The Parma Polyhedra Library User's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}]{} +\lfoot[]{\fancyplain{}{\scriptsize The Parma Polyhedra Library User's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}} + +\begin{document} +\title{ +The Parma Polyhedra Library \\ +User's Manual\thanks{This work + has been partly supported by: + University of Parma's FIL scientific research project (ex 60\%) + ``Pure and Applied Mathematics''; + MURST project + ``Automatic Program Certification by Abstract Interpretation''; + MURST project + ``Abstract Interpretation, Type Systems and Control-Flow Analysis''; + MURST project + ``Automatic Aggregate- and Number-Reasoning for Computing: from + Decision Algorithms to Constraint Programming with Multisets, + Sets, and Maps''; + MURST project + ``Constraint Based Verification of Reactive Systems''; + MURST project + ``Abstract Interpretation: Design and Applications''; + EPSRC project + ``Numerical Domains for Software Analysis''; + EPSRC project + ``Geometric Abstractions for Scalable Program Analyzers''. + } \\ +(version $projectnumber) +} +\author{ +Roberto Bagnara\thanks{bagnara@cs.unipr.it, + Department of Mathematics, University of Parma, Italy.} \\ +Patricia M. Hill\thanks{hill@comp.leeds.ac.uk, + School of Computing, University of Leeds, U.K.} \\ +Enea Zaffanella\thanks{zaffanella@cs.unipr.it, + Department of Mathematics, University of Parma, Italy.} \\ +\ \\ +based on previous work also by \\ +\ \\ +Elisa Ricci \\ +\ \\ +and \\ +\ \\ +Sara Bonini \\ +Andrea Pescetti \\ +Angela Stazzone \\ +Tatiana Zolo +} +\maketitle + +\newpage +Copyright \copyright\ 2001--2009 Roberto Bagnara (bagnara@cs.unipr.it). + +This document describes the Parma Polyhedra Library (PPL). + +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.2 +or any later version published by the +\href{http://www.fsf.org}{Free Software Foundation}; +with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. +A copy of the license is included in the section entitled +``\hyperlink{GFDL_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. + +For the most up-to-date information see the Parma Polyhedra Library +site: +\begin{center} +\href{http://www.cs.unipr.it/ppl/}{\tt http://www.cs.unipr.it/ppl/} +\end{center} + +\pagenumbering{roman} +\tableofcontents +\pagenumbering{arabic} diff --git a/install-sh b/install-sh new file mode 100755 index 0000000..a5897de --- /dev/null +++ b/install-sh @@ -0,0 +1,519 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2006-12-25.00 + +# 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 + 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 + 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 + trap '(exit $?); exit' 1 2 13 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 starting with `-'. + case $src in + -*) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=$dst_arg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $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-writeable 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 -z "$d" && 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-end: "$" +# End: diff --git a/instchk.hh b/instchk.hh new file mode 100644 index 0000000..af1f251 --- /dev/null +++ b/instchk.hh @@ -0,0 +1,380 @@ +/* Fake declarations to test the validity of the arguments of the + --enabled-instantiations option defined in configure.ac. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifdef HAVE_STDINT_H +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#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 +class Pointset_Powerset { +public: + static bool valid_instantiation() { + return PS::valid_Pointset_Powerset_argument(); + } +}; + +template +bool +valid_BD_Shape_argument(void); + +template <> +bool +valid_BD_Shape_argument() { + return true; +} + +template <> +bool +valid_BD_Shape_argument() { + return true; +} + +template <> +bool +valid_BD_Shape_argument() { + return true; +} + +template <> +bool +valid_BD_Shape_argument() { + return true; +} + +template <> +bool +valid_BD_Shape_argument() { + return true; +} + +#if PPL_SUPPORTED_FLOAT +template <> +bool +valid_BD_Shape_argument() { + return true; +} +#endif // PPL_SUPPORTED_FLOAT + +#if PPL_SUPPORTED_DOUBLE +template <> +bool +valid_BD_Shape_argument() { + return true; +} +#endif // PPL_SUPPORTED_DOUBLE + +#if PPL_SUPPORTED_LONG_DOUBLE +template <> +bool +valid_BD_Shape_argument() { + return true; +} +#endif // PPL_SUPPORTED_LONG_DOUBLE + +template <> +bool +valid_BD_Shape_argument() { + return true; +} + +template <> +bool +valid_BD_Shape_argument() { + return true; +} + +template +class BD_Shape { +public: + static bool valid_instantiation() { + return valid_BD_Shape_argument(); + } + static bool valid_Pointset_Powerset_argument() { + return true; + } + static bool valid_Product_argument() { + return true; + } +}; + +template +class Octagonal_Shape { +public: + static bool valid_instantiation() { + return valid_BD_Shape_argument(); + } + static bool valid_Pointset_Powerset_argument() { + return true; + } + static bool valid_Product_argument() { + return true; + } +}; + +template +class Direct_Product { +public: + static bool valid_instantiation() { + return D1::valid_Product_argument() && D2::valid_Product_argument(); + } +}; + +template +class Smash_Product { +public: + static bool valid_instantiation() { + return D1::valid_Product_argument() && D2::valid_Product_argument(); + } +}; + +template +class Constraints_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..4789230 --- /dev/null +++ b/interfaces/C/C_interface.dox @@ -0,0 +1,1689 @@ +/* Doxumentation for the C language interface. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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 creating or assigning a polyhedron object, + by means of one of the functions ppl_new_* and + ppl_assign_*. + + 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. +*/ + +/*! \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; + +/*! \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 + ppl_Polyhedron_poly_hull_assign(x, y). +*/ +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 i + if i < n and maps[i] != ppl_not_a_dimension; + otherwise it is undefined on dimension i. + If the function is defined on dimension i, then dimension + i is mapped onto dimension maps[i]. + + 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 + 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 *tp 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 *tp 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 *tp 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 *tp 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 *tp 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 *tp 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. +*/ + +/*! \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; + +/*! \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..40241ca --- /dev/null +++ b/interfaces/C/Makefile.am @@ -0,0 +1,251 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +SUBDIRS = . 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 + +LIBPPL_C_LT_CURRENT = 3 +LIBPPL_C_LT_REVISION = 0 +LIBPPL_C_LT_AGE = 1 + +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 >$@ + +BUILT_SOURCES = \ +ppl_c.h \ +ppl_c_implementation_domains.hh \ +ppl_c_implementation_domains.cc.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 \ +$(interface_generator_files) + +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 \ +@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 = \ +@required_instantiations_c_cxx_objects@ \ +$(top_builddir)/src/libppl.la \ +@extra_libraries@ + +libppl_c_la_DEPENDENCIES = \ +@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) + +nodist_include_HEADERS = ppl_c.h + +nodist_noinst_HEADERS = \ +ppl_c_domains.h \ +ppl_c_version.h + +MOSTLYCLEANFILES = \ +@required_instantiations_c_cxx_objects@ + +CLEANFILES = \ +@required_instantiations_c_cxx_sources@ \ +@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..18f2556 --- /dev/null +++ b/interfaces/C/Makefile.in @@ -0,0 +1,1030 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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.am $(srcdir)/Makefile.in \ + $(srcdir)/ppl_c_version.h.in +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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/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 +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" +libLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(lib_LTLIBRARIES) +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) +libppl_c_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(libppl_c_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +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 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 uninstall-recursive +nodist_includeHEADERS_INSTALL = $(INSTALL_HEADER) +HEADERS = $(nodist_include_HEADERS) $(nodist_noinst_HEADERS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +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 +LIBPPL_C_LT_CURRENT = 3 +LIBPPL_C_LT_REVISION = 0 +LIBPPL_C_LT_AGE = 1 +BUILT_SOURCES = \ +ppl_c.h \ +ppl_c_implementation_domains.hh \ +ppl_c_implementation_domains.cc.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 \ +$(interface_generator_files) + +AM_CPPFLAGS = \ +-I$(top_srcdir)/interfaces \ +-I$(top_builddir)/interfaces/C \ +-I$(top_builddir)/src \ +@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 + +@NO_UNDEFINED_TRUE@NO_UNDEFINED_FLAG = -no-undefined +libppl_c_la_LIBADD = \ +@required_instantiations_c_cxx_objects@ \ +$(top_builddir)/src/libppl.la \ +@extra_libraries@ + +libppl_c_la_DEPENDENCIES = \ +@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) + +nodist_include_HEADERS = ppl_c.h +nodist_noinst_HEADERS = \ +ppl_c_domains.h \ +ppl_c_version.h + +MOSTLYCLEANFILES = \ +@required_instantiations_c_cxx_objects@ + +CLEANFILES = \ +@required_instantiations_c_cxx_sources@ \ +@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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/C/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign interfaces/C/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +ppl_c_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) + test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ + else :; fi; \ + done + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libppl_c.la: $(libppl_c_la_OBJECTS) $(libppl_c_la_DEPENDENCIES) + $(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 + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_BD_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_BD_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_BD_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_BD_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_BD_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_BD_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_BD_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_BD_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_BD_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Constraints_Product_C_Polyhedron_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Constraints_Product_Grid_C_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Constraints_Product_Grid_NNC_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Constraints_Product_NNC_Polyhedron_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Float_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Int16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Int32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Int64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Int8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Long_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Octagonal_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Octagonal_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Octagonal_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Octagonal_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Octagonal_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Octagonal_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Octagonal_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Octagonal_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Octagonal_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_BD_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_BD_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_BD_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_BD_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_BD_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_BD_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_BD_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_BD_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_BD_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_C_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_Float_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_Int16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_Int32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_Int64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_Int8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_Long_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_NNC_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_Octagonal_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_Octagonal_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_Octagonal_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_Octagonal_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_Octagonal_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_Octagonal_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_Octagonal_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_Rational_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_Uint16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_Uint32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_Uint64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_Uint8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Pointset_Powerset_Z_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Rational_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Uint16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Uint32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Uint64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Uint8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_Z_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_c_implementation_common.Plo@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-nodist_includeHEADERS: $(nodist_include_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" + @list='$(nodist_include_HEADERS)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(nodist_includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \ + $(nodist_includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \ + done + +uninstall-nodist_includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(nodist_include_HEADERS)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \ + rm -f "$(DESTDIR)$(includedir)/$$f"; \ + done + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + distdir) \ + || exit 1; \ + fi; \ + done +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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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 + +info: info-recursive + +info-am: + +install-data-am: install-nodist_includeHEADERS + +install-dvi: install-dvi-recursive + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-recursive + +install-info: install-info-recursive + +install-man: + +install-pdf: install-pdf-recursive + +install-ps: install-ps-recursive + +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-libLTLIBRARIES uninstall-nodist_includeHEADERS + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ + install-strip + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES clean-libtool ctags ctags-recursive \ + 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-libLTLIBRARIES install-man \ + install-nodist_includeHEADERS 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-recursive uninstall uninstall-am \ + uninstall-libLTLIBRARIES uninstall-nodist_includeHEADERS + + +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 >$@ + +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_header.h b/interfaces/C/ppl_c_header.h new file mode 100644 index 0000000..5394555 --- /dev/null +++ b/interfaces/C/ppl_c_header.h @@ -0,0 +1,2489 @@ +/* This is the header file of the C interface of the Parma Polyhedra Library. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_ppl_c_h +#define PPL_ppl_c_h 1 + +/*! + \defgroup PPL_C_interface C Language Interface + + 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 ppl_c.h. +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 +\endcode +If this directive does not work, then your compiler is unable to find +the file ppl_c.h. So check that the library is installed +(if it is not installed, you may want to make install, +perhaps with root privileges) in the right place +(if not you may want to reconfigure the library using the appropriate +pathname for the --prefix option); and that your compiler +knows where it is installed (if not you should add the path to the +directory where ppl_c.h is located to the compiler's +include file search path; this is usually done with the +-I option). + +The name space of the PPL's C interface is PPL_* for +preprocessor symbols, enumeration values and variables; and +ppl_* for data types and function names. The interface +systematically uses opaque data types (generic pointers that +completely hide the internal representations from the client code) and +provides all required access functions. By using just the interface, +the client code can exploit all the functionalities of the library yet +avoid directly manipulating the library's data structures. The advantages +are that (1) applications do not depend on the internals of the library +(these may change from release to release), and (2) the interface +invariants can be thoroughly checked (by the access functions). + +The PPL's C interface is initialized by means of the +ppl_initialize function. This function must +be called before using any other interface of the library. +The application can release the resources allocated by the library by +calling the ppl_finalize function. After this function +is called no other interface of the library may be used +until the interface is re-initialized using ppl_initialize. + +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 ppl_version_major, +ppl_version_minor, ppl_version_revision, and +ppl_version_beta. The PPL's C interface also provides +functions ppl_version, returning character string +containing the full version number, and ppl_banner, +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: libppl_c (PPL's C interface), +libppl (PPL's core), libgmpxx (GMP's C++ +interface), and libgmp (GMP's library core). On most +Unix-like systems, this is done by adding -lppl_c, +-lppl, -lgmpxx, and -lgmp 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 -L) 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 Libtool 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 +Program Library +HOWTO. + +For examples on how to use the functions provided by the C interface, +you are referred to the directory demos/ppl_lpsol/ in +the source distribution. It contains a Mixed Integer (Linear) +Programming solver written in C. In order to use this solver +you will need to install +GLPK (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 + to be included before . +*/ + +#include +#include +#include + +/* + 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 + PPL_ERROR_INVALID_ARGUMENT 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 + PPL_ERROR_INVALID_ARGUMENT 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)); + +/*@}*/ /* 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 only 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 + errno. */ + 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 +}; + +/*! \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 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 stdout. +*/ +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 errno 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) + + +#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 + d-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)); + +/*@}*/ /* 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 positivity constraint. + 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 an + handle for the newly created const iterator at address \p pcit. +*/ +int +ppl_new_Constraint_System_const_iterator_from_Constraint_System_const_iterator +PPL_PROTO((ppl_Constraint_System_const_iterator_t* pcit, + ppl_const_Constraint_System_const_iterator_t cit)); + +/*! \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 an + handle for the newly created const iterator at address \p pgit. +*/ +int +ppl_new_Generator_System_const_iterator_from_Generator_System_const_iterator +PPL_PROTO((ppl_Generator_System_const_iterator_t* pgit, + ppl_const_Generator_System_const_iterator_t git)); + +/*! \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 integrality congruence. + 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 an + 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 an + 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 \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; + +/*@}*/ /* 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 an + 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 an 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 an 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 + PPL_MIP_PROBLEM_STATUS_UNFEASIBLE if the MIP problem + is not satisfiable; + PPL_MIP_PROBLEM_STATUS_UNBOUNDED if the MIP problem + is satisfiable but there is no finite bound to the value of + the objective function; + PPL_MIP_PROBLEM_STATUS_OPTIMIZED 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)); + +/*@}*/ /* Querying/Setting Control Parameters */ + +PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(MIP_Problem) + +#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..c02c118 --- /dev/null +++ b/interfaces/C/ppl_c_implementation_common.cc @@ -0,0 +1,2054 @@ +/* Implementation of the C interface: variables and non-inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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('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); +} + +} // 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_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_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_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_version_major(void) try { + return version_major(); +} +CATCH_ALL + +int +ppl_version_minor(void) try { + return version_minor(); +} +CATCH_ALL + +int +ppl_version_revision(void) try { + return version_revision(); +} +CATCH_ALL + +int +ppl_version_beta(void) try { + return version_beta(); +} +CATCH_ALL + +int +ppl_version(const char** p) try { + // Note: use explicit qualification to avoid clashes on, e.g., + // Solaris 2.9, where `version' is the name of an enum defined in + // math.h. + *p = Parma_Polyhedra_Library::version(); + return 0; +} +CATCH_ALL + +int +ppl_banner(const char** p) try { + *p = banner(); + return 0; +} +CATCH_ALL + +int +ppl_max_space_dimension(ppl_dimension_type* m) try { + *m = max_space_dimension(); + return 0; +} +CATCH_ALL + +int +ppl_not_a_dimension(ppl_dimension_type* m) try { + *m = not_a_dimension(); + return 0; +} +CATCH_ALL + +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::is_bounded ? 1 : 0; +} +CATCH_ALL + +int +ppl_Coefficient_min(mpz_t min) try { + if (std::numeric_limits::is_bounded) { + assign_r(reinterpret_mpz_class(min), + std::numeric_limits::min(), + ROUND_NOT_NEEDED); + return 1; + } + else + return 0; +} +CATCH_ALL + +int +ppl_Coefficient_max(mpz_t max) try { + if (std::numeric_limits::is_bounded) { + assign_r(reinterpret_mpz_class(max), + std::numeric_limits::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); + 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 + +/* 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; + default: + throw std::runtime_error("ppl_Constraint_type()"); + } +} +CATCH_ALL + +int +ppl_Constraint_coefficient(ppl_const_Constraint_t c, + ppl_dimension_type var, + ppl_Coefficient_t n) try { + const Constraint& cc = *to_const(c); + Coefficient& nn = *to_nonconst(n); + nn = cc.coefficient(Variable(var)); + return 0; +} +CATCH_ALL + +int +ppl_Constraint_inhomogeneous_term(ppl_const_Constraint_t c, + ppl_Coefficient_t n) try { + const Constraint& cc = *to_const(c); + Coefficient& nn = *to_nonconst(n); + nn = cc.inhomogeneous_term(); + return 0; +} +CATCH_ALL + +int +ppl_Constraint_OK(ppl_const_Constraint_t c) try { + return 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)); + 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; + default: + throw std::runtime_error("ppl_Generator_type()"); + } +} +CATCH_ALL + +int +ppl_Generator_coefficient(ppl_const_Generator_t g, + ppl_dimension_type var, + ppl_Coefficient_t n) try { + const Generator& gg = *to_const(g); + Coefficient& nn = *to_nonconst(n); + nn = gg.coefficient(Variable(var)); + return 0; +} +CATCH_ALL + +int +ppl_Generator_divisor(ppl_const_Generator_t g, + ppl_Coefficient_t n) try { + const Generator& gg = *to_const(g); + Coefficient& nn = *to_nonconst(n); + nn = gg.divisor(); + return 0; +} +CATCH_ALL + +int +ppl_Generator_OK(ppl_const_Generator_t g) try { + return 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)); + 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)); + 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; + default: + throw std::runtime_error("ppl_Grid_Generator_type()"); + } +} +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 = 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 to_be_set; + for (ppl_dimension_type i = n; i-- > 0; ) + to_be_set.insert(ds[i]); + mmip.add_to_integer_space_dimensions(to_be_set); + 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(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(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_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) + +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..b85c443 --- /dev/null +++ b/interfaces/C/ppl_c_implementation_common.defs.hh @@ -0,0 +1,216 @@ +/* Implementation of the C interface: declarations. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_ppl_c_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 + +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); + +/*! \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 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 + 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 true is returned. + If \f$f\f$ is undefined in \f$k\f$, then false 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; +}; + +} // 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(overflow_error, PPL_ARITHMETIC_OVERFLOW) \ +CATCH_STD_EXCEPTION(runtime_error, PPL_ERROR_INTERNAL_ERROR) \ +CATCH_STD_EXCEPTION(exception, PPL_ERROR_UNKNOWN_STANDARD_EXCEPTION) \ +catch (...) { \ + notify_error(PPL_ERROR_UNEXPECTED_ERROR, \ + "completely unexpected error: a bug in the PPL"); \ + return PPL_ERROR_UNEXPECTED_ERROR; \ +} + +#define DECLARE_CONVERSIONS(Type, CPP_Type) \ + inline const CPP_Type* \ + to_const(ppl_const_##Type##_t x) { \ + return reinterpret_cast(x); \ + } \ + \ + inline CPP_Type* \ + to_nonconst(ppl_##Type##_t x) { \ + return reinterpret_cast(x); \ + } \ + \ + inline ppl_const_##Type##_t \ + to_const(const CPP_Type* x) { \ + return reinterpret_cast(x); \ + } \ + \ + inline ppl_##Type##_t \ + to_nonconst(CPP_Type* x) { \ + return reinterpret_cast(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..0a3217e --- /dev/null +++ b/interfaces/C/ppl_c_implementation_common.inlines.hh @@ -0,0 +1,149 @@ +/* Implementation of the C interface: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_ppl_c_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(*n); +} + +DECLARE_CONVERSIONS(Coefficient, Coefficient) + +DECLARE_CONVERSIONS(Linear_Expression, Linear_Expression) + +DECLARE_CONVERSIONS(Constraint, Constraint) + +DECLARE_CONVERSIONS(Constraint_System, Constraint_System) + +typedef Constraint_System::const_iterator Constraint_System_const_iterator; +DECLARE_CONVERSIONS(Constraint_System_const_iterator, + Constraint_System_const_iterator) + +DECLARE_CONVERSIONS(Generator, Generator) + +DECLARE_CONVERSIONS(Generator_System, Generator_System) + +typedef Generator_System::const_iterator Generator_System_const_iterator; +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) + +DECLARE_CONVERSIONS(MIP_Problem, MIP_Problem) + +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(t); + } +} + +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; +} + +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..106be62 --- /dev/null +++ b/interfaces/C/ppl_c_version.h.in @@ -0,0 +1,62 @@ +/* Header file providing version information for the C interface. -*- C -*- + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +/*! \brief + A string containing the PPL version. + + \ingroup Version + Let M and m denote the numbers associated + to PPL_VERSION_MAJOR and PPL_VERSION_MINOR, respectively. The + format of PPL_VERSION is M "." m if both + PPL_VERSION_REVISION (r) and PPL_VERSION_BETA + (b)are zero, M "." m "pre" b if + PPL_VERSION_REVISION is zero and PPL_VERSION_BETA is not zero, + M "." m "." r if PPL_VERSION_REVISION is not zero and + PPL_VERSION_BETA is zero, M "." m "." r "pre" b 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..0c24cba --- /dev/null +++ b/interfaces/C/ppl_interface_generator_c_cc_code.m4 @@ -0,0 +1,1196 @@ +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-2009 Roberto Bagnara +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://www.cs.unipr.it/ppl/ . + +dnl No code is needed for these procedure schemas in the C interface. + +m4_define(`ppl_@CLASS@_swap_code', `') +m4_define(`ppl_@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_@TOPOLOGY@@CLASS@_from_space_dimension_code', +`int +ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension +(ppl_@CLASS@_t* pph, + ppl_dimension_type d, + int empty) try { + *pph = to_nonconst(new @TOPOLOGY@@CPP_CLASS@(d, empty ? EMPTY : UNIVERSE)); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_code', +`int +ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@ +(ppl_@CLASS@_t* pph, + ppl_const_@A_FRIEND@_t ph) try { + const @B_FRIEND@& phh + = *static_cast(to_const(ph)); + *pph = to_nonconst(new @TOPOLOGY@@CPP_CLASS@(phh)); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_with_complexity_code', +`int +ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_with_complexity +(ppl_@CLASS@_t* pph, + ppl_const_@A_FRIEND@_t ph, + int complexity) try { + const @B_FRIEND@& phh + = *static_cast(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_@TOPOLOGY@@CLASS@_from_@BUILD_REPRESENT@s_code', +`int +ppl_new_@TOPOLOGY@@CLASS@_from_@!BUILD_REPRESENT@_System +(ppl_@CLASS@_t* pph, ppl_const_@!BUILD_REPRESENT@_System_t cs) try { + const @!BUILD_REPRESENT@_System& ccs = *to_const(cs); + *pph = to_nonconst(new @TOPOLOGY@@CPP_CLASS@(ccs)); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_recycle_@BUILD_REPRESENT@s_code', +`int +ppl_new_@TOPOLOGY@@CLASS@_recycle_@!BUILD_REPRESENT@_System +(ppl_@CLASS@_t* pph, ppl_@!BUILD_REPRESENT@_System_t cs) try { + @!BUILD_REPRESENT@_System& ccs = *to_nonconst(cs); + *pph = to_nonconst(new @TOPOLOGY@@CPP_CLASS@(ccs@RECYCLE@)); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_delete_@CLASS@_code', +`int +ppl_delete_@CLASS@(ppl_const_@CLASS@_t ph) try { + delete to_const(ph); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_assign_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@_code', +`int +ppl_assign_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@ +(ppl_@CLASS@_t dst, + ppl_const_@CLASS@_t src) try { + const @TOPOLOGY@@CPP_CLASS@& ssrc + = *static_cast(to_const(src)); + @TOPOLOGY@@CPP_CLASS@& ddst + = *static_cast<@TOPOLOGY@@CPP_CLASS@*>(to_nonconst(dst)); + ddst = ssrc; + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@DIMENSION@_code', +`int +ppl_@CLASS@_@DIMENSION@ +(ppl_const_@CLASS@_t ph, + ppl_dimension_type* m) try { + *m = to_const(ph)->@DIMENSION@(); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_get_@CLASS_REPRESENT@s_code', +`int +ppl_@CLASS@_get_@CLASS_REPRESENT@s +(ppl_const_@CLASS@_t ph, + ppl_const_@!CLASS_REPRESENT@_System_t* pcs) try { + const @CPP_CLASS@& pph = *to_const(ph); + const @!CLASS_REPRESENT@_System& cs = pph.@CLASS_REPRESENT@s(); + *pcs = to_const(&cs); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_get_minimized_@CLASS_REPRESENT@s_code', +`int +ppl_@CLASS@_get_minimized_@CLASS_REPRESENT@s +(ppl_const_@CLASS@_t ph, + ppl_const_@!CLASS_REPRESENT@_System_t* pcs) try { + const @CPP_CLASS@& pph = *to_const(ph); + const @!CLASS_REPRESENT@_System& cs = pph.minimized_@CLASS_REPRESENT@s(); + *pcs = to_const(&cs); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_relation_with_@RELATION_REPRESENT@_code', +`int +ppl_@CLASS@_relation_with_@!RELATION_REPRESENT@ +(ppl_const_@CLASS@_t ph, + ppl_const_@!RELATION_REPRESENT@_t c) try { + const @CPP_CLASS@& pph = *to_const(ph); + const @!RELATION_REPRESENT@& cc = *to_const(c); + return pph.relation_with(cc).get_flags(); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@HAS_PROPERTY@_code', +`int +ppl_@CLASS@_@HAS_PROPERTY@(ppl_const_@CLASS@_t ph) try { + const @CPP_CLASS@& pph = *to_const(ph); + return pph.@HAS_PROPERTY@() ? 1 : 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_bounds_from_@ABOVEBELOW@_code', +`int +ppl_@CLASS@_bounds_from_@ABOVEBELOW@ +(ppl_const_@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_@ABOVEBELOW@(lle) ? 1 : 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@MAXMIN@_code', +`int +ppl_@CLASS@_@MAXMIN@ +(ppl_const_@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; + bool ok = pph.@MAXMIN@(lle, ssup_n, ssup_d, optimum); + if (ok) + *poptimum = optimum ? 1 : 0; + return ok ? 1 : 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@MAXMIN@_with_point_code', +`int +ppl_@CLASS@_@MAXMIN@_with_point +(ppl_const_@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; + bool ok = pph.@MAXMIN@(lle, ssup_n, ssup_d, optimum, ppoint); + if (ok) + *poptimum = optimum ? 1 : 0; + return ok ? 1 : 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@COMPARISON@_@CLASS@_code', +`int +ppl_@CLASS@_@COMPARISON@_@CLASS@ +(ppl_const_@CLASS@_t x, + ppl_const_@CLASS@_t y) try { + const @CPP_CLASS@& xx = *to_const(x); + const @CPP_CLASS@& yy = *to_const(y); + return xx.@COMPARISON@(yy) ? 1 : 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_equals_@CLASS@_code', +`int +ppl_@CLASS@_equals_@CLASS@ +(ppl_const_@CLASS@_t x, + ppl_const_@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_@CLASS@_OK_code', +`int +ppl_@CLASS@_OK(ppl_const_@CLASS@_t ph) try { + return to_const(ph)->OK() ? 1 : 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@SIMPLIFY@_code', +`int +ppl_@CLASS@_@SIMPLIFY@(ppl_@CLASS@_t ph) try { + @CPP_CLASS@& pph = *to_nonconst(ph); + pph.@SIMPLIFY@(); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_unconstrain_space_dimension_code', +`int +ppl_@CLASS@_unconstrain_space_dimension +(ppl_@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_@CLASS@_unconstrain_space_dimensions_code', +`int +ppl_@CLASS@_unconstrain_space_dimensions +(ppl_@CLASS@_t ph, + ppl_dimension_type ds[], + size_t n) try { + @CPP_CLASS@& pph = *to_nonconst(ph); + Variables_Set to_be_unconstrained; + for (ppl_dimension_type i = n; i-- > 0; ) + to_be_unconstrained.insert(ds[i]); + pph.unconstrain(to_be_unconstrained); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_constrains_code', +`int +ppl_@CLASS@_constrains +(ppl_@CLASS@_t ph, + ppl_dimension_type var +) try { + @CPP_CLASS@& pph = *to_nonconst(ph); + return pph.constrains(Variable(var)) ? 1 : 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@BINOP@_code', +`int +ppl_@CLASS@_@BINOP@ +(ppl_@CLASS@_t x, + ppl_const_@CLASS@_t y) try { + @CPP_CLASS@& xx = *to_nonconst(x); + const @CPP_CLASS@& yy = *to_const(y); + xx.@BINOP@(yy); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@BINMINOP@_code', +`int +ppl_@CLASS@_@BINMINOP@ +(ppl_@CLASS@_t x, + ppl_const_@CLASS@_t y) try { + @CPP_CLASS@& xx = *to_nonconst(x); + const @CPP_CLASS@& yy = *to_const(y); + return xx.@BINMINOP@(yy); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@UB_EXACT@_code', +`int +ppl_@CLASS@_@UB_EXACT@ +(ppl_@CLASS@_t x, + ppl_const_@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(*to_nonconst(x)); + const C_Polyhedron& yy = static_cast(*to_const(y)); + return xx.upper_bound_assign_if_exact(yy) ? 1 : 0; + } + else { + NNC_Polyhedron& xx = static_cast(*to_nonconst(x)); + const NNC_Polyhedron& yy = static_cast(*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.@UB_EXACT@(yy) ? 1 : 0; +') + +m4_define(`ppl_@CLASS@_simplify_using_context_assign_code', +`int +ppl_@CLASS@_simplify_using_context_assign +(ppl_@CLASS@_t x, + ppl_const_@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_@CLASS@_add_@CLASS_REPRESENT@_code', +`int +ppl_@CLASS@_add_@CLASS_REPRESENT@ +(ppl_@CLASS@_t ph, + ppl_const_@!CLASS_REPRESENT@_t c) try { + @CPP_CLASS@& pph = *to_nonconst(ph); + const @!CLASS_REPRESENT@& cc = *to_const(c); + pph.add_@CLASS_REPRESENT@(cc); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_refine_with_@REFINE_REPRESENT@_code', +`int +ppl_@CLASS@_refine_with_@REFINE_REPRESENT@ +(ppl_@CLASS@_t ph, + ppl_const_@!REFINE_REPRESENT@_t c) try { + @CPP_CLASS@& pph = *to_nonconst(ph); + const @!REFINE_REPRESENT@& cc = *to_const(c); + pph.refine_with_@REFINE_REPRESENT@(cc); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@_and_minimize_code', +`int +ppl_@CLASS@_add_@CLASS_REPRESENT@_and_minimize +(ppl_@CLASS@_t ph, + ppl_const_@!CLASS_REPRESENT@_t c) try { + @CPP_CLASS@& pph = *to_nonconst(ph); + const @!CLASS_REPRESENT@& cc = *to_const(c); + return pph.add_@CLASS_REPRESENT@_and_minimize(cc) ? 1 : 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@s_code', +`int +ppl_@CLASS@_add_@CLASS_REPRESENT@s +(ppl_@CLASS@_t ph, + ppl_const_@!CLASS_REPRESENT@_System_t cs) try { + @CPP_CLASS@& pph = *to_nonconst(ph); + const @!CLASS_REPRESENT@_System& ccs = *to_const(cs); + pph.add_@CLASS_REPRESENT@s(ccs); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_refine_with_@REFINE_REPRESENT@s_code', +`int +ppl_@CLASS@_refine_with_@REFINE_REPRESENT@s +(ppl_@CLASS@_t ph, + ppl_const_@!REFINE_REPRESENT@_System_t cs) try { + @CPP_CLASS@& pph = *to_nonconst(ph); + const @!REFINE_REPRESENT@_System& ccs = *to_const(cs); + pph.refine_with_@REFINE_REPRESENT@s(ccs); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@s_and_minimize_code', +`int +ppl_@CLASS@_add_@CLASS_REPRESENT@s_and_minimize +(ppl_@CLASS@_t ph, + ppl_const_@!CLASS_REPRESENT@_System_t cs) try { + @CPP_CLASS@& pph = *to_nonconst(ph); + const @!CLASS_REPRESENT@_System& ccs = *to_const(cs); + return pph.add_@CLASS_REPRESENT@s_and_minimize(ccs) ? 1 : 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_add_recycled_@CLASS_REPRESENT@s_code', +`int +ppl_@CLASS@_add_recycled_@CLASS_REPRESENT@s +(ppl_@CLASS@_t ph, + ppl_@!CLASS_REPRESENT@_System_t cs) try { + @CPP_CLASS@& pph = *to_nonconst(ph); + @!CLASS_REPRESENT@_System& ccs = *to_nonconst(cs); + pph.add_recycled_@CLASS_REPRESENT@s(ccs); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@AFFIMAGE@_code', +`int +ppl_@CLASS@_@AFFIMAGE@ +(ppl_@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.@AFFIMAGE@(Variable(var), lle, dd); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_bounded_@AFFIMAGE@_code', +`int +ppl_@CLASS@_bounded_@AFFIMAGE@ +(ppl_@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_@AFFIMAGE@(Variable(var), llb, uub, dd); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_code', +`int +ppl_@CLASS@_generalized_@AFFIMAGE@ +(ppl_@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_@AFFIMAGE@ + (Variable(var), relation_symbol(relsym), lle, dd); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_code', +`int +ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs +(ppl_@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_@AFFIMAGE@(llhs, relation_symbol(relsym), rrhs); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_with_congruence_code', +`int +ppl_@CLASS@_generalized_@AFFIMAGE@_with_congruence +(ppl_@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_@AFFIMAGE@ + (Variable(var), relation_symbol(relsym), lle, dd, mm); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence_code', +`int +ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence +(ppl_@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_@AFFIMAGE@(llhs, relation_symbol(relsym), rrhs, mm); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@WIDEN@_widening_assign_with_tokens_code', +`int +ppl_@CLASS@_@WIDEN@_widening_assign_with_tokens +(ppl_@CLASS@_t x, + ppl_const_@CLASS@_t y, + unsigned* tp) try { + @CPP_CLASS@& xx = *to_nonconst(x); + const @CPP_CLASS@& yy = *to_const(y); + xx.@WIDEN@_widening_assign(yy, tp); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@WIDEN@_widening_assign_code', +`int +ppl_@CLASS@_@WIDEN@_widening_assign +(ppl_@CLASS@_t x, + ppl_const_@CLASS@_t y) try { + return ppl_@CLASS@_@WIDEN@_widening_assign_with_tokens(x, y, 0); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_widening_assign_with_tokens_code', +`int +ppl_@CLASS@_widening_assign_with_tokens +(ppl_@CLASS@_t x, + ppl_const_@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_@CLASS@_widening_assign_code', +`int +ppl_@CLASS@_widening_assign +(ppl_@CLASS@_t x, + ppl_const_@CLASS@_t y) try { + return ppl_@CLASS@_widening_assign_with_tokens(x, y, 0); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_with_tokens_code', +`int +ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_with_tokens +(ppl_@CLASS@_t x, + ppl_const_@CLASS@_t y, + ppl_const_@!CONSTRAINER@_System_t cs, + unsigned* tp) try { + @CPP_CLASS@& xx = *to_nonconst(x); + const @CPP_CLASS@& yy = *to_const(y); + const @!CONSTRAINER@_System& ccs = *to_const(cs); + xx.@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign(yy, ccs, tp); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_code', +`int +ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign +(ppl_@CLASS@_t x, + ppl_const_@CLASS@_t y, + ppl_const_@!CONSTRAINER@_System_t cs) try { + return + ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_with_tokens + (x, y, cs, 0); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_with_tokens_code', +`int +ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_with_tokens +(ppl_@CLASS@_t x, + ppl_const_@CLASS@_t y, + unsigned* tp) try { + @CPP_CLASS@& xx = *to_nonconst(x); + const @CPP_CLASS@& yy = *to_const(y); + xx.@EXTRAPOLATION@_extrapolation_assign(yy, tp); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_code', +`int +ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign +(ppl_@CLASS@_t x, + ppl_const_@CLASS@_t y) try { + return + ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_with_tokens + (x, y, 0); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_narrowing_assign_code', +`int +ppl_@CLASS@_@EXTRAPOLATION@_narrowing_assign +(ppl_@CLASS@_t x, + ppl_const_@CLASS@_t y) try { + @CPP_CLASS@& xx = *to_nonconst(x); + const @CPP_CLASS@& yy = *to_const(y); + xx.@EXTRAPOLATION@_narrowing_assign(yy); + return 0; +} +CATCH_ALL + +') + + m4_define(`ppl_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign_code', +`dnl +int +ppl_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign +(ppl_@CLASS@_t x, + ppl_const_@CLASS@_t y) try { + @CPP_CLASS@& xx = *to_nonconst(x); + const @CPP_CLASS@& yy = *to_const(y); + xx.BHZ03_widening_assign<@A_DISJUNCT_WIDEN@_Certificate>(yy, + widen_fun_ref( + &@DISJUNCT_TOPOLOGY@@A_DISJUNCT@::@DISJUNCT_WIDEN@_widening_assign)); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_BGP99_@DISJUNCT_WIDEN@_extrapolation_assign_code', +`int +ppl_@CLASS@_BGP99_@DISJUNCT_WIDEN@_extrapolation_assign +(ppl_@CLASS@_t x, + ppl_const_@CLASS@_t y, + int 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@_widening_assign), + disjuncts); + return 0; +} +CATCH_ALL + + +') + +m4_define(`ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@_code', +`int +ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@ +(ppl_@CLASS@_t ph, + ppl_dimension_type d) try { + @CPP_CLASS@& pph = *to_nonconst(ph); + pph.add_space_dimensions_@EMBEDPROJECT@(d); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_remove_space_dimensions_code', +`int +ppl_@CLASS@_remove_space_dimensions +(ppl_@CLASS@_t ph, + ppl_dimension_type ds[], + size_t n) try { + @CPP_CLASS@& pph = *to_nonconst(ph); + Variables_Set to_be_removed; + for (ppl_dimension_type i = n; i-- > 0; ) + to_be_removed.insert(ds[i]); + pph.remove_space_dimensions(to_be_removed); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_remove_higher_space_dimensions_code', +`int +ppl_@CLASS@_remove_higher_space_dimensions +(ppl_@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_@CLASS@_map_space_dimensions_code', +`int +ppl_@CLASS@_map_space_dimensions +(ppl_@CLASS@_t ph, + ppl_dimension_type maps[], + size_t n) try { + @CPP_CLASS@& pph = *to_nonconst(ph); + Array_Partial_Function_Wrapper function(maps, n); + pph.map_space_dimensions(function); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_expand_space_dimension_code', +`int +ppl_@CLASS@_expand_space_dimension +(ppl_@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_@CLASS@_fold_space_dimensions_code', +`int +ppl_@CLASS@_fold_space_dimensions +(ppl_@CLASS@_t ph, + ppl_dimension_type ds[], + size_t n, + ppl_dimension_type d) try { + @CPP_CLASS@& pph = *to_nonconst(ph); + Variables_Set to_be_folded; + for (ppl_dimension_type i = n; i-- > 0; ) + to_be_folded.insert(ds[i]); + pph.fold_space_dimensions(to_be_folded, Variable(d)); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@MEMBYTES@_code', +`int +ppl_@CLASS@_@MEMBYTES@ +(ppl_const_@CLASS@_t ps, + size_t* sz) try { + *sz = to_const(ps)->@MEMBYTES@(); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_new_@CLASS@_iterator_code', +`dnl + +typedef @CPP_CLASS@::iterator + @CLASS@_iterator; +typedef @CPP_CLASS@::const_iterator + @CLASS@_const_iterator; + +DECLARE_CONVERSIONS(@CLASS@_iterator, + @CLASS@_iterator) +DECLARE_CONVERSIONS(@CLASS@_const_iterator, + @CLASS@_const_iterator) + +int +ppl_new_@CLASS@_iterator +(ppl_@CLASS@_iterator_t* pit) try { + *pit = to_nonconst(new @CLASS@_iterator()); + return 0; +} +CATCH_ALL + +int +ppl_new_@CLASS@_const_iterator +(ppl_@CLASS@_const_iterator_t* pit) try { + *pit = to_nonconst(new @CLASS@_const_iterator()); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_new_@CLASS@_iterator_from_iterator_code', +`dnl + +int +ppl_new_@CLASS@_iterator_from_iterator +(ppl_@CLASS@_iterator_t* px, ppl_const_@CLASS@_iterator_t y) try { + const @CLASS@_iterator& yy + = *static_cast(to_const(y)); + *px = to_nonconst(new @CLASS@_iterator(yy)); + return 0; +} +CATCH_ALL + +int +ppl_new_@CLASS@_const_iterator_from_const_iterator +(ppl_@CLASS@_const_iterator_t* px, + ppl_const_@CLASS@_const_iterator_t y) try { + const @CLASS@_const_iterator& yy + = *static_cast(to_const(y)); + *px = to_nonconst(new @CLASS@_const_iterator(yy)); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_iterator_equals_iterator_code', +`dnl +int +ppl_@CLASS@_iterator_equal_test +(ppl_const_@CLASS@_iterator_t x, + ppl_const_@CLASS@_iterator_t y) try { + return (*to_const(x) == *to_const(y)) ? 1 : 0; +} +CATCH_ALL + +int +ppl_@CLASS@_const_iterator_equal_test +(ppl_const_@CLASS@_const_iterator_t x, + ppl_const_@CLASS@_const_iterator_t y) try { + return (*to_const(x) == *to_const(y)) ? 1 : 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@BEGINEND@_iterator_code', +`dnl +int +ppl_@CLASS@_iterator_@BEGINEND@ +(ppl_@CLASS@_t ps, + ppl_@CLASS@_iterator_t psit) try { + @CPP_CLASS@::iterator& ppsit = *to_nonconst(psit); + ppsit = to_nonconst(ps)->@BEGINEND@(); + return 0; +} +CATCH_ALL + +int +ppl_@CLASS@_const_iterator_@BEGINEND@ +(ppl_const_@CLASS@_t ps, + ppl_@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_@CLASS@_iterator_code', +`dnl +int +ppl_delete_@CLASS@_iterator +(ppl_const_@CLASS@_iterator_t it) + try { + delete to_const(it); + return 0; +} +CATCH_ALL + +int +ppl_delete_@CLASS@_const_iterator +(ppl_const_@CLASS@_const_iterator_t it) + try { + delete to_const(it); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@INCDEC@_iterator_code', +`dnl +int +ppl_@CLASS@_iterator_@INCDEC@ +(ppl_@CLASS@_iterator_t it) + try { + @CPP_CLASS@::iterator& iit = *to_nonconst(it); + @B_INCDEC@iit; + return 0; +} +CATCH_ALL + +int +ppl_@CLASS@_const_iterator_@INCDEC@ +(ppl_@CLASS@_const_iterator_t it) + try { + @CPP_CLASS@::const_iterator& iit = *to_nonconst(it); + @B_INCDEC@iit; + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_drop_disjunct_code', +`dnl +int +ppl_@CLASS@_drop_disjunct +(ppl_@CLASS@_t ps, + ppl_const_@CLASS@_iterator_t cit, + ppl_@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_@CLASS@_drop_disjuncts_code', +`dnl +int +ppl_@CLASS@_drop_disjuncts +(ppl_@CLASS@_t ps, + ppl_const_@CLASS@_iterator_t first, + ppl_const_@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_@CLASS@_add_disjunct_code', +`dnl +int +ppl_@CLASS@_add_disjunct +(ppl_@CLASS@_t ps, + ppl_const_@DISJUNCT@_t d) try { + @CPP_CLASS@& pps = *to_nonconst(ps); + const @DISJUNCT_TOPOLOGY@@A_DISJUNCT@& dd + = *static_cast(to_const(d)); + pps.add_disjunct(dd); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_get_disjunct_code', +`dnl +int +ppl_@CLASS@_iterator_dereference +(ppl_const_@CLASS@_iterator_t psit, + ppl_const_@DISJUNCT@_t* cd) try { + const @CPP_CLASS@::iterator& cpsit = *to_const(psit); + const @DISJUNCT_TOPOLOGY@@A_DISJUNCT@& d = cpsit->element(); + *cd = to_const(&d); + return 0; +} +CATCH_ALL + +int +ppl_@CLASS@_const_iterator_dereference +(ppl_const_@CLASS@_const_iterator_t psit, + ppl_const_@DISJUNCT@_t* cd) try { + const @CPP_CLASS@::const_iterator& cpsit = *to_const(psit); + const @DISJUNCT_TOPOLOGY@@A_DISJUNCT@& d = cpsit->element(); + *cd = to_const(&d); + return 0; +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_linear_@PARTITION@_code', +`dnl +int +ppl_@CLASS@_linear_@PARTITION@ +(ppl_const_@CLASS@_t x, + ppl_const_@CLASS@_t y, + ppl_@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_@CPP_CLASS@& xx + = static_cast(*to_const(x)); + const C_@CPP_CLASS@& yy + = static_cast(*to_const(y)); + std::pair > + r = linear_partition(xx, yy); + *p_inters = to_nonconst(&r.first); + *p_rest = to_nonconst(&r.second); + } + else { + const C_@CPP_CLASS@& xx + = static_cast(*to_const(x)); + const C_@CPP_CLASS@& yy + = static_cast(*to_const(y)); + std::pair > + 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(*to_const(x)); + const @CPP_CLASS@& yy + = static_cast(*to_const(y)); + std::pair<@CPP_CLASS@|COMMA| Pointset_Powerset > + r = linear_partition(xx, yy); + *p_inters = to_nonconst(&r.first); + *p_rest = to_nonconst(&r.second); + return 0; + +') + +m4_define(`ppl_@CLASS@_approximate_@PARTITION@_code', +`dnl +int +ppl_@CLASS@_approximate_@PARTITION@ +(ppl_const_@CLASS@_t x, + ppl_const_@CLASS@_t y, + ppl_@CLASS@_t* p_inters, + ppl_Pointset_Powerset_Grid_t* p_rest, + int* p_finite) try { + const @CPP_CLASS@& xx + = static_cast(*to_const(x)); + const @CPP_CLASS@& yy + = static_cast(*to_const(y)); + bool finite; + std::pair<@CPP_CLASS@|COMMA| Pointset_Powerset > + 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 + +') 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..fdfef11 --- /dev/null +++ b/interfaces/C/ppl_interface_generator_c_cc_files.m4 @@ -0,0 +1,67 @@ +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-2009 Roberto Bagnara +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://www.cs.unipr.it/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 +%<--%<--%<-- ppl_c_`'m4_current_interface`'.cc +/* 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 +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..0c71423 --- /dev/null +++ b/interfaces/C/ppl_interface_generator_c_h.m4 @@ -0,0 +1,71 @@ +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-2009 Roberto Bagnara +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://www.cs.unipr.it/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..322534c --- /dev/null +++ b/interfaces/C/ppl_interface_generator_c_h_code.m4 @@ -0,0 +1,744 @@ +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-2009 Roberto Bagnara +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://www.cs.unipr.it/ppl/ . + +dnl No code is needed for these procedure schemas in the C interface. +dnl +m4_define(`ppl_@CLASS@_swap_code', `') +m4_define(`ppl_@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_@CLASS@_linear_@PARTITION@_code', +`dnl +/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_linear_@PARTITION@ +PPL_PROTO((ppl_const_@CLASS@_t x, + ppl_const_@CLASS@_t y, + ppl_@CLASS@_t* p_inters, + ppl_Pointset_Powerset_NNC_Polyhedron_t* p_rest)); + +') + +m4_define(`ppl_@CLASS@_approximate_@PARTITION@_code', +`dnl +/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_approximate_@PARTITION@ +PPL_PROTO((ppl_const_@CLASS@_t x, + ppl_const_@CLASS@_t y, + ppl_@CLASS@_t* p_inters, + ppl_Pointset_Powerset_Grid_t* p_rest, + int* p_finite)); + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension_code', +`dnl +/*! \relates ppl_@CLASS@_tag */ +int +ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension +PPL_PROTO((ppl_@CLASS@_t* pph, ppl_dimension_type d, int empty)); + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_code', +`dnl +/*! \relates ppl_@CLASS@_tag */ +int +ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@ +PPL_PROTO((ppl_@CLASS@_t* pph, ppl_const_@A_FRIEND@_t ph)); + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_with_complexity_code', +`dnl +/*! \relates ppl_@CLASS@_tag */ +int +ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_with_complexity +PPL_PROTO((ppl_@CLASS@_t* pph, ppl_const_@A_FRIEND@_t ph, int complexity)); + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@BUILD_REPRESENT@s_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_new_@TOPOLOGY@@CLASS@_from_@!BUILD_REPRESENT@_System +PPL_PROTO((ppl_@CLASS@_t* pph, ppl_const_@!BUILD_REPRESENT@_System_t cs)); + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_recycle_@BUILD_REPRESENT@s_code', +`dnl +/*! \relates ppl_@CLASS@_tag */ +int +ppl_new_@TOPOLOGY@@CLASS@_recycle_@!BUILD_REPRESENT@_System +PPL_PROTO((ppl_@CLASS@_t* pph, ppl_@!BUILD_REPRESENT@_System_t cs)); + +') + +m4_define(`ppl_delete_@CLASS@_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_delete_@CLASS@ +PPL_PROTO((ppl_const_@CLASS@_t ph)); + +') + +m4_define(`ppl_assign_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_assign_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@ +PPL_PROTO((ppl_@CLASS@_t dst, ppl_const_@CLASS@_t src)); + +') + +m4_define(`ppl_@CLASS@_@DIMENSION@_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_@DIMENSION@ +PPL_PROTO((ppl_const_@CLASS@_t ph, ppl_dimension_type* m)); + +') + +m4_define(`ppl_@CLASS@_get_@CLASS_REPRESENT@s_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_get_@CLASS_REPRESENT@s +PPL_PROTO((ppl_const_@CLASS@_t ph, + ppl_const_@!CLASS_REPRESENT@_System_t* pcs)); + +') + +m4_define(`ppl_@CLASS@_get_minimized_@CLASS_REPRESENT@s_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_get_minimized_@CLASS_REPRESENT@s +PPL_PROTO((ppl_const_@CLASS@_t ph, + ppl_const_@!CLASS_REPRESENT@_System_t* pcs)); + +') + +m4_define(`ppl_@CLASS@_relation_with_@RELATION_REPRESENT@_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_relation_with_@!RELATION_REPRESENT@ +PPL_PROTO((ppl_const_@CLASS@_t ph, + ppl_const_@!RELATION_REPRESENT@_t c)); + +') + +m4_define(`ppl_@CLASS@_@HAS_PROPERTY@_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_@HAS_PROPERTY@ +PPL_PROTO((ppl_const_@CLASS@_t ph)); + +') + +m4_define(`ppl_@CLASS@_bounds_from_@ABOVEBELOW@_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_bounds_from_@ABOVEBELOW@ +PPL_PROTO((ppl_const_@CLASS@_t ph, + ppl_const_Linear_Expression_t le)); + +') + +m4_define(`ppl_@CLASS@_@MAXMIN@_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_@MAXMIN@ +PPL_PROTO((ppl_const_@CLASS@_t ph, + ppl_const_Linear_Expression_t le, + ppl_Coefficient_t ext_n, + ppl_Coefficient_t ext_d, + int* poptimum)); + +') + +m4_define(`ppl_@CLASS@_@MAXMIN@_with_point_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_@MAXMIN@_with_point +PPL_PROTO((ppl_const_@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_@CLASS@_@COMPARISON@_@CLASS@_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_@COMPARISON@_@CLASS@ +PPL_PROTO((ppl_const_@CLASS@_t x, + ppl_const_@CLASS@_t y)); + +') + +m4_define(`ppl_@CLASS@_equals_@CLASS@_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_equals_@CLASS@ +PPL_PROTO((ppl_const_@CLASS@_t x, + ppl_const_@CLASS@_t y)); + +') + +m4_define(`ppl_@CLASS@_OK_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_OK +PPL_PROTO((ppl_const_@CLASS@_t ph)); + +') + +m4_define(`ppl_@CLASS@_@SIMPLIFY@_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_@SIMPLIFY@ +PPL_PROTO((ppl_@CLASS@_t ph)); + +') + +m4_define(`ppl_@CLASS@_constrains_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_constrains +PPL_PROTO((ppl_@CLASS@_t ph, + ppl_dimension_type var)); + +') + +m4_define(`ppl_@CLASS@_unconstrain_space_dimension_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_unconstrain_space_dimension +PPL_PROTO((ppl_@CLASS@_t ph, + ppl_dimension_type var)); + +') + +m4_define(`ppl_@CLASS@_unconstrain_space_dimensions_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_unconstrain_space_dimensions +PPL_PROTO((ppl_@CLASS@_t ph, + ppl_dimension_type ds[], + size_t n)); + +') + +m4_define(`ppl_@CLASS@_@BINOP@_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_@BINOP@ +PPL_PROTO((ppl_@CLASS@_t x, + ppl_const_@CLASS@_t y)); + +') + +m4_define(`ppl_@CLASS@_@BINMINOP@_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_@BINMINOP@ +PPL_PROTO((ppl_@CLASS@_t x, + ppl_const_@CLASS@_t y)); + +') + +m4_define(`ppl_@CLASS@_@UB_EXACT@_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_@UB_EXACT@ +PPL_PROTO((ppl_@CLASS@_t x, + ppl_const_@CLASS@_t y)); + +') + +m4_define(`ppl_@CLASS@_simplify_using_context_assign_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_simplify_using_context_assign +PPL_PROTO((ppl_@CLASS@_t x, + ppl_const_@CLASS@_t y)); + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_add_@CLASS_REPRESENT@ +PPL_PROTO((ppl_@CLASS@_t ph, + ppl_const_@!CLASS_REPRESENT@_t c)); + +') + +m4_define(`ppl_@CLASS@_refine_with_@REFINE_REPRESENT@_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_refine_with_@REFINE_REPRESENT@ +PPL_PROTO((ppl_@CLASS@_t ph, + ppl_const_@!REFINE_REPRESENT@_t c)); + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@_and_minimize_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_add_@CLASS_REPRESENT@_and_minimize +PPL_PROTO((ppl_@CLASS@_t ph, + ppl_const_@!CLASS_REPRESENT@_t c)); + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@s_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_add_@CLASS_REPRESENT@s +PPL_PROTO((ppl_@CLASS@_t ph, + ppl_const_@!CLASS_REPRESENT@_System_t cs)); + +') + +m4_define(`ppl_@CLASS@_refine_with_@REFINE_REPRESENT@s_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_refine_with_@REFINE_REPRESENT@s +PPL_PROTO((ppl_@CLASS@_t ph, + ppl_const_@!REFINE_REPRESENT@_System_t cs)); + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@s_and_minimize_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_add_@CLASS_REPRESENT@s_and_minimize +PPL_PROTO((ppl_@CLASS@_t ph, + ppl_const_@!CLASS_REPRESENT@_System_t cs)); + +') + +m4_define(`ppl_@CLASS@_add_recycled_@CLASS_REPRESENT@s_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_add_recycled_@CLASS_REPRESENT@s +PPL_PROTO((ppl_@CLASS@_t ph, + ppl_@!CLASS_REPRESENT@_System_t cs)); + +') + +m4_define(`ppl_@CLASS@_@AFFIMAGE@_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_@AFFIMAGE@ +PPL_PROTO((ppl_@CLASS@_t ph, + ppl_dimension_type var, + ppl_const_Linear_Expression_t le, + ppl_const_Coefficient_t d)); + +') + +m4_define(`ppl_@CLASS@_bounded_@AFFIMAGE@_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_bounded_@AFFIMAGE@ +PPL_PROTO((ppl_@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_@CLASS@_generalized_@AFFIMAGE@_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_generalized_@AFFIMAGE@ +PPL_PROTO((ppl_@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_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs +PPL_PROTO((ppl_@CLASS@_t ph, + ppl_const_Linear_Expression_t lhs, + enum ppl_enum_Constraint_Type relsym, + ppl_const_Linear_Expression_t rhs)); + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_with_congruence_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_generalized_@AFFIMAGE@_with_congruence +PPL_PROTO((ppl_@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_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence +PPL_PROTO((ppl_@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_@CLASS@_@WIDEN@_widening_assign_with_tokens_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_@WIDEN@_widening_assign_with_tokens +PPL_PROTO((ppl_@CLASS@_t x, + ppl_const_@CLASS@_t y, + unsigned* tp)); + +') + +m4_define(`ppl_@CLASS@_@WIDEN@_widening_assign_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_@WIDEN@_widening_assign +PPL_PROTO((ppl_@CLASS@_t x, + ppl_const_@CLASS@_t y)); + +') + +m4_define(`ppl_@CLASS@_widening_assign_with_tokens_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_widening_assign_with_tokens +PPL_PROTO((ppl_@CLASS@_t x, + ppl_const_@CLASS@_t y, + unsigned* tp)); + +') + +m4_define(`ppl_@CLASS@_widening_assign_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_widening_assign +PPL_PROTO((ppl_@CLASS@_t x, + ppl_const_@CLASS@_t y)); + +') + +m4_define(`ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_with_tokens_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_with_tokens +PPL_PROTO((ppl_@CLASS@_t x, + ppl_const_@CLASS@_t y, + ppl_const_@!CONSTRAINER@_System_t cs, + unsigned* tp)); + +') + +m4_define(`ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign +PPL_PROTO((ppl_@CLASS@_t x, + ppl_const_@CLASS@_t y, + ppl_const_@!CONSTRAINER@_System_t cs)); + +') + +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_with_tokens_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_with_tokens +PPL_PROTO((ppl_@CLASS@_t x, + ppl_const_@CLASS@_t y, + unsigned* tp)); + +') + +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign +PPL_PROTO((ppl_@CLASS@_t x, + ppl_const_@CLASS@_t y)); + +') + +m4_define(`ppl_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign +PPL_PROTO((ppl_@CLASS@_t x, + ppl_const_@CLASS@_t y)); + +') + +m4_define(`ppl_@CLASS@_BGP99_@DISJUNCT_WIDEN@_extrapolation_assign_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_BGP99_@DISJUNCT_WIDEN@_extrapolation_assign +PPL_PROTO((ppl_@CLASS@_t x, + ppl_const_@CLASS@_t y, + int disjuncts)); + +') + +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_narrowing_assign_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_@EXTRAPOLATION@_narrowing_assign +PPL_PROTO((ppl_@CLASS@_t x, + ppl_const_@CLASS@_t y)); + +') + +m4_define(`ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@ +PPL_PROTO((ppl_@CLASS@_t ph, + ppl_dimension_type d)); + +') + +m4_define(`ppl_@CLASS@_remove_space_dimensions_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_remove_space_dimensions +PPL_PROTO((ppl_@CLASS@_t ph, + ppl_dimension_type ds[], + size_t n)); + +') + +m4_define(`ppl_@CLASS@_remove_higher_space_dimensions_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_remove_higher_space_dimensions +PPL_PROTO((ppl_@CLASS@_t ph, + ppl_dimension_type d)); + +') + +m4_define(`ppl_@CLASS@_map_space_dimensions_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_map_space_dimensions +PPL_PROTO((ppl_@CLASS@_t ph, + ppl_dimension_type maps[], + size_t n)); + +') + +m4_define(`ppl_@CLASS@_expand_space_dimension_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_expand_space_dimension +PPL_PROTO((ppl_@CLASS@_t ph, + ppl_dimension_type d, + ppl_dimension_type m)); + +') + +m4_define(`ppl_@CLASS@_fold_space_dimensions_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_fold_space_dimensions +PPL_PROTO((ppl_@CLASS@_t ph, + ppl_dimension_type ds[], + size_t n, + ppl_dimension_type d)); + +') + +m4_define(`ppl_@CLASS@_@MEMBYTES@_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_@MEMBYTES@ +PPL_PROTO((ppl_const_@CLASS@_t ps, + size_t* sz)); + +') + +m4_define(`ppl_new_@CLASS@_iterator_code', +`dnl +/*! \interface ppl_@CLASS@_iterator_tag + \brief Types and functions for iterating on the disjuncts of a + ppl_@CLASS@_tag. +*/ +/*! \interface ppl_@CLASS@_const_iterator_tag + \brief Types and functions for iterating on the disjuncts of a + const ppl_@CLASS@_tag. +*/ + +PPL_TYPE_DECLARATION(@CLASS@_iterator) +PPL_TYPE_DECLARATION(@CLASS@_const_iterator) + +/*! \relates ppl_@CLASS@_iterator_tag */ +int +ppl_new_@CLASS@_iterator +PPL_PROTO((ppl_@CLASS@_iterator_t* pit)); + +/*! \relates ppl_@CLASS@_const_iterator_tag */ +int +ppl_new_@CLASS@_const_iterator +PPL_PROTO((ppl_@CLASS@_const_iterator_t* pit)); + +') + +m4_define(`ppl_new_@CLASS@_iterator_from_iterator_code', +`/*! \relates ppl_@CLASS@_iterator_tag */ +int +ppl_new_@CLASS@_iterator_from_iterator +PPL_PROTO((ppl_@CLASS@_iterator_t* px, + ppl_const_@CLASS@_iterator_t y)); + +/*! \relates ppl_@CLASS@_const_iterator_tag */ +int +ppl_new_@CLASS@_const_iterator_from_const_iterator +PPL_PROTO((ppl_@CLASS@_const_iterator_t* px, + ppl_const_@CLASS@_const_iterator_t y)); + +') + +m4_define(`ppl_@CLASS@_iterator_equals_iterator_code', +`/*! \relates ppl_@CLASS@_iterator_tag */ +int +ppl_@CLASS@_iterator_equal_test +PPL_PROTO((ppl_const_@CLASS@_iterator_t x, + ppl_const_@CLASS@_iterator_t y)); + +/*! \relates ppl_@CLASS@_const_iterator_tag */ +int +ppl_@CLASS@_const_iterator_equal_test +PPL_PROTO((ppl_const_@CLASS@_const_iterator_t x, + ppl_const_@CLASS@_const_iterator_t y)); + +') + +m4_define(`ppl_@CLASS@_@BEGINEND@_iterator_code', +`/*! \relates ppl_@CLASS@_iterator_tag */ +int +ppl_@CLASS@_iterator_@BEGINEND@ +PPL_PROTO((ppl_@CLASS@_t ps, + ppl_@CLASS@_iterator_t psit)); + +/*! \relates ppl_@CLASS@_const_iterator_tag */ +int +ppl_@CLASS@_const_iterator_@BEGINEND@ +PPL_PROTO((ppl_const_@CLASS@_t ps, + ppl_@CLASS@_const_iterator_t psit)); + +') + +m4_define(`ppl_delete_@CLASS@_iterator_code', +`/*! \relates ppl_@CLASS@_iterator_tag */ +int +ppl_delete_@CLASS@_iterator +PPL_PROTO((ppl_const_@CLASS@_iterator_t psit)); + +/*! \relates ppl_@CLASS@_const_iterator_tag */ +int +ppl_delete_@CLASS@_const_iterator +PPL_PROTO((ppl_const_@CLASS@_const_iterator_t psit)); + +') + +m4_define(`ppl_@CLASS@_@INCDEC@_iterator_code', +`/*! \relates ppl_@CLASS@_iterator_tag */ +int +ppl_@CLASS@_iterator_@INCDEC@ +PPL_PROTO((ppl_@CLASS@_iterator_t psit)); + +/*! \relates ppl_@CLASS@_const_iterator_tag */ +int +ppl_@CLASS@_const_iterator_@INCDEC@ +PPL_PROTO((ppl_@CLASS@_const_iterator_t psit)); + +') + +m4_define(`ppl_@CLASS@_drop_disjunct_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_drop_disjunct +PPL_PROTO((ppl_@CLASS@_t ps, + ppl_const_@CLASS@_iterator_t cit, + ppl_@CLASS@_iterator_t it)); + +') + +m4_define(`ppl_@CLASS@_drop_disjuncts_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_drop_disjuncts +PPL_PROTO((ppl_@CLASS@_t ps, + ppl_const_@CLASS@_iterator_t first, + ppl_const_@CLASS@_iterator_t last)); + +') + +m4_define(`ppl_@CLASS@_add_disjunct_code', +`/*! \relates ppl_@CLASS@_tag */ +int +ppl_@CLASS@_add_disjunct +PPL_PROTO((ppl_@CLASS@_t ps, + ppl_const_@DISJUNCT@_t d)); + +') + +m4_define(`ppl_@CLASS@_get_disjunct_code', +`/*! \relates ppl_@CLASS@_iterator_tag */ +int +ppl_@CLASS@_iterator_dereference +PPL_PROTO((ppl_const_@CLASS@_iterator_t ps, + ppl_const_@DISJUNCT@_t* d)); + +/*! \relates ppl_@CLASS@_const_iterator_tag */ +int +ppl_@CLASS@_const_iterator_dereference +PPL_PROTO((ppl_const_@CLASS@_const_iterator_t ps, + ppl_const_@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..29f503a --- /dev/null +++ b/interfaces/C/ppl_interface_generator_c_hh_files.m4 @@ -0,0 +1,80 @@ +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-2009 Roberto Bagnara +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://www.cs.unipr.it/ppl/ . + +dnl Include files defining macros that generate the non-fixed part. +m4_include(`ppl_interface_generator_c_procedure_generators.m4') + +m4_divert`'dnl +%<--%<--%<-- ppl_c_implementation_domains.hh +/* 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 +%<--%<--%<-- ppl_c_implementation_domains.hh +`#'include "ppl_c_`'m4_current_interface.hh" +%<--%<--%<-- ppl_c_`'m4_current_interface.hh +/* 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 +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..08ee6c8 --- /dev/null +++ b/interfaces/C/ppl_interface_generator_c_procedure_generators.m4 @@ -0,0 +1,50 @@ +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-2009 Roberto Bagnara +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://www.cs.unipr.it/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 "_code" must be defined +dnl in the ppl_interface_generator_*_code.m4 file. +dnl The must be exactly as written here. + +m4_define(`m4_procedure_list', + `m4_echo_unquoted(ppl_new_@CLASS@_iterator +pointset_powerset, +`m4_common_procedure_list', +ppl_new_@TOPOLOGY@@CLASS@_recycle_@BUILD_REPRESENT@s +simple, +ppl_assign_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@ +simple, +ppl_@CLASS@_add_recycled_@CLASS_REPRESENT@s +simple, +ppl_@CLASS@_add_@CLASS_REPRESENT@_and_minimize/2 +polyhedron, +ppl_@CLASS@_add_@CLASS_REPRESENT@s_and_minimize/2 +polyhedron, +ppl_@CLASS@_@BINMINOP@/2 +polyhedron, +) +') diff --git a/interfaces/C/tests/Makefile.am b/interfaces/C/tests/Makefile.am new file mode 100644 index 0000000..d6ede19 --- /dev/null +++ b/interfaces/C/tests/Makefile.am @@ -0,0 +1,116 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +CHECKER = +#CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions + +TESTS_ENVIRONMENT = $(CHECKER) + +AM_CPPFLAGS = \ +-I$(top_builddir)/interfaces/C \ +@extra_includes@ \ +@debug_flag@ + +if GCC + +if HOST_OS_MINGW + +# MinGW's cannot be compiled in c89 mode. +AM_CFLAGS = -pedantic -std=gnu89 -Werror + +else !HOST_OS_MINGW + +AM_CFLAGS = -pedantic -std=c89 -Werror + +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 \ +@extra_includes@ + +LDADD = \ +libppl_c_tests.a \ +$(top_builddir)/interfaces/C/libppl_c.la \ +@extra_libraries@ + +NORMAL_TESTS = \ +formatted_output + +# +# 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 + +#watchdog1_SRCS = watchdog1.cc + +noinst_HEADERS = \ +ppl_c_test.h + +if BUILD_WATCHDOG_LIBRARY +WATCHDOG_TESTS = +# watchdog1 + +# watchdog1_SOURCES = $(watchdog1_SRCS) + +# watchdog1_CPPFLAGS = \ +# $(AM_CPPFLAGS) \ +# -I$(top_builddir)/Watchdog \ +# -I$(top_builddir)/Watchdog/src + +# watchdog1_LDADD = \ +# $(LDADD) \ +# $(top_builddir)/Watchdog/src/libpwl.la + +endif BUILD_WATCHDOG_LIBRARY + +TESTS = $(NORMAL_TESTS) $(WATCHDOG_TESTS) + +XFAIL_TESTS = + +check_PROGRAMS = $(TESTS) $(BUGS) + +EXTRA_DIST = $(watchdog1_SRCS) + +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..b765552 --- /dev/null +++ b/interfaces/C/tests/Makefile.in @@ -0,0 +1,771 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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_2) +subdir = interfaces/C/tests +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +ARFLAGS = cru +libppl_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) +am__EXEEXT_2 = +am__EXEEXT_3 = $(am__EXEEXT_1) $(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 +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libppl_c_tests_a_SOURCES) \ + $(nodist_EXTRA_libppl_c_tests_a_SOURCES) \ + $(formatted_output_SOURCES) \ + $(nodist_EXTRA_formatted_output_SOURCES) +DIST_SOURCES = $(libppl_c_tests_a_SOURCES) $(formatted_output_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +CHECKER = +#CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions +TESTS_ENVIRONMENT = $(CHECKER) +AM_CPPFLAGS = \ +-I$(top_builddir)/interfaces/C \ +@extra_includes@ \ +@debug_flag@ + +@GCC_TRUE@@HOST_OS_MINGW_FALSE@AM_CFLAGS = -pedantic -std=c89 -Werror + +# MinGW's cannot be compiled in c89 mode. +@GCC_TRUE@@HOST_OS_MINGW_TRUE@AM_CFLAGS = -pedantic -std=gnu89 -Werror +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 \ +@extra_includes@ + +LDADD = \ +libppl_c_tests.a \ +$(top_builddir)/interfaces/C/libppl_c.la \ +@extra_libraries@ + +NORMAL_TESTS = \ +formatted_output + + +# +# 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 + + +#watchdog1_SRCS = watchdog1.cc +noinst_HEADERS = \ +ppl_c_test.h + +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_TESTS = +EXTRA_DIST = $(watchdog1_SRCS) +BUGS = +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .cc .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/C/tests/Makefile'; \ + 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 + +clean-checkLIBRARIES: + -test -z "$(check_LIBRARIES)" || rm -f $(check_LIBRARIES) +libppl_c_tests.a: $(libppl_c_tests_a_OBJECTS) $(libppl_c_tests_a_DEPENDENCIES) + -rm -f libppl_c_tests.a + $(libppl_c_tests_a_AR) libppl_c_tests.a $(libppl_c_tests_a_OBJECTS) $(libppl_c_tests_a_LIBADD) + $(RANLIB) libppl_c_tests.a + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +formatted_output$(EXEEXT): $(formatted_output_OBJECTS) $(formatted_output_DEPENDENCIES) + @rm -f formatted_output$(EXEEXT) + $(CXXLINK) $(formatted_output_OBJECTS) $(formatted_output_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummy.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/formatted_output.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libppl_c_tests_a-dummy.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libppl_c_tests_a-ppl_c_test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print_to_buffer.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +.cc.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +libppl_c_tests_a-ppl_c_test.o: ppl_c_test.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/libppl_c_tests_a-ppl_c_test.Tpo $(DEPDIR)/libppl_c_tests_a-ppl_c_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ppl_c_test.cc' object='libppl_c_tests_a-ppl_c_test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(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 +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/libppl_c_tests_a-ppl_c_test.Tpo $(DEPDIR)/libppl_c_tests_a-ppl_c_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ppl_c_test.cc' object='libppl_c_tests_a-ppl_c_test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(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 +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/libppl_c_tests_a-dummy.Tpo $(DEPDIR)/libppl_c_tests_a-dummy.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='dummy.cc' object='libppl_c_tests_a-dummy.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(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 +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/libppl_c_tests_a-dummy.Tpo $(DEPDIR)/libppl_c_tests_a-dummy.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='dummy.cc' object='libppl_c_tests_a-dummy.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(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: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; ws='[ ]'; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *$$ws$$tst$$ws*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + echo "XPASS: $$tst"; \ + ;; \ + *) \ + echo "PASS: $$tst"; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *$$ws$$tst$$ws*) \ + xfail=`expr $$xfail + 1`; \ + echo "XFAIL: $$tst"; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + echo "FAIL: $$tst"; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + echo "SKIP: $$tst"; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all tests failed"; \ + else \ + banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + skipped="($$skip tests were not run)"; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + test -z "$$skipped" || echo "$$skipped"; \ + test -z "$$report" || echo "$$report"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0; \ + else :; fi + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-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 + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +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 + +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 all all-am check check-TESTS check-am clean \ + clean-checkLIBRARIES clean-checkPROGRAMS clean-generic \ + clean-libtool ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-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 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..1381adc --- /dev/null +++ b/interfaces/C/tests/formatted_output.c @@ -0,0 +1,63 @@ +/* Test the use of C++ output facilities from C code. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_c_test.h" + +#include "print_to_buffer.h" +#include + +#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/ppl_c_test.cc b/interfaces/C/tests/ppl_c_test.cc new file mode 100644 index 0000000..2333191 --- /dev/null +++ b/interfaces/C/tests/ppl_c_test.cc @@ -0,0 +1,70 @@ +/* Implementation of utility functions used in test programs + of the C interface. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl-config.h" + +// The following inclusion of prior to "ppl_c_test.h" is to +// work around a bug whereby some versions of 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 +// prior to "ppl_c_test.h" we ensure std::FILE is defined at the time +// when "ppl_c.h" will include . +#include + +#include "ppl_c_test.h" +#include + +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..ad729d0 --- /dev/null +++ b/interfaces/C/tests/ppl_c_test.h @@ -0,0 +1,40 @@ +/* Header file for C test programs. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_ppl_c_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..bac2557 --- /dev/null +++ b/interfaces/C/tests/print_to_buffer.c @@ -0,0 +1,65 @@ +/* Definitions of print_ppl_*_to_buffer() functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_c.h" +#include "print_to_buffer.h" +#include +#include + +#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) diff --git a/interfaces/C/tests/print_to_buffer.h b/interfaces/C/tests/print_to_buffer.h new file mode 100644 index 0000000..e1ed2b2 --- /dev/null +++ b/interfaces/C/tests/print_to_buffer.h @@ -0,0 +1,79 @@ +/* Declarations of print_ppl_*_to_buffer() functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_print_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) + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#undef DECLARE_PRINT_TO_BUFFER + +#endif /* !defined(PPL_print_to_buffer_h) */ diff --git a/interfaces/Java/Makefile.am b/interfaces/Java/Makefile.am new file mode 100644 index 0000000..628b4ae --- /dev/null +++ b/interfaces/Java/Makefile.am @@ -0,0 +1,45 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +SUBDIRS = 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..47c0fb4 --- /dev/null +++ b/interfaces/Java/Makefile.in @@ -0,0 +1,652 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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.am $(srcdir)/Makefile.in +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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-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 uninstall-recursive +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(jardir)" +jarDATA_INSTALL = $(INSTALL_DATA) +DATA = $(jar_DATA) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Java/Makefile'; \ + 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 + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-jarDATA: $(jar_DATA) + @$(NORMAL_INSTALL) + test -z "$(jardir)" || $(MKDIR_P) "$(DESTDIR)$(jardir)" + @list='$(jar_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(jarDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(jardir)/$$f'"; \ + $(jarDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(jardir)/$$f"; \ + done + +uninstall-jarDATA: + @$(NORMAL_UNINSTALL) + @list='$(jar_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(jardir)/$$f'"; \ + rm -f "$(DESTDIR)$(jardir)/$$f"; \ + done + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + 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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-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 + +info: info-recursive + +info-am: + +install-data-am: install-jarDATA + +install-dvi: install-dvi-recursive + +install-exec-am: + +install-html: install-html-recursive + +install-info: install-info-recursive + +install-man: + +install-pdf: install-pdf-recursive + +install-ps: install-ps-recursive + +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: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ + install-strip + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive 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-recursive 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..9e2848c --- /dev/null +++ b/interfaces/Java/README.java @@ -0,0 +1,26 @@ +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 , +the ppl_java.jar JAR file and the JNI shared object will be installed +in directory //ppl. + +The Java compilation command for `My_Test.java' should then be +something like: + +$ javac -classpath .://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/ppl_java.jar My_Test + +Note that the source code in My_Test.java should take care of loading +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 =/usr/local/, the call will be something like: + + System.load("/usr/local/lib/ppl/libppl_java.so"); + diff --git a/interfaces/Java/jni/Makefile.am b/interfaces/Java/jni/Makefile.am new file mode 100644 index 0000000..8647b4e --- /dev/null +++ b/interfaces/Java/jni/Makefile.am @@ -0,0 +1,183 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +interface_generator_files = \ +ppl_interface_generator_java_classes_cc_files.m4 \ +ppl_interface_generator_java_classes_cc_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_java_procedure_generators.m4 \ +$(interface_generator_files) + +EXTRA_DIST = \ +$(interface_generator_files) + + +AM_CPPFLAGS = \ +-I$(top_srcdir)/interfaces \ +-I$(top_builddir)/src \ +-I../parma_polyhedra_library \ +-I$(top_srcdir)/src \ +@extra_includes@ @JNIFLAGS@ + +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 + +libppl_java_la_LDFLAGS = \ +$(NO_UNDEFINED_FLAG) \ +-module \ +-avoid-version + +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_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 = \ +@required_instantiations_java_cxx_objects@ \ +$(top_builddir)/src/libppl.la \ +@extra_libraries@ + +libppl_java_la_DEPENDENCIES = \ +@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 = \ +@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..4223a35 --- /dev/null +++ b/interfaces/Java/jni/Makefile.in @@ -0,0 +1,818 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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.am $(srcdir)/Makefile.in +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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +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) +libppl_java_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(libppl_java_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libppl_java_la_SOURCES) \ + $(nodist_EXTRA_libppl_java_la_SOURCES) +DIST_SOURCES = $(libppl_java_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +interface_generator_files = \ +ppl_interface_generator_java_classes_cc_files.m4 \ +ppl_interface_generator_java_classes_cc_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_java_procedure_generators.m4 \ +$(interface_generator_files) + +EXTRA_DIST = \ +$(interface_generator_files) + +AM_CPPFLAGS = \ +-I$(top_srcdir)/interfaces \ +-I$(top_builddir)/src \ +-I../parma_polyhedra_library \ +-I$(top_srcdir)/src \ +@extra_includes@ @JNIFLAGS@ + +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 +@NO_UNDEFINED_TRUE@NO_UNDEFINED_FLAG = -no-undefined +@HOST_OS_DARWIN_FALSE@libppl_java_la_LDFLAGS = \ +@HOST_OS_DARWIN_FALSE@$(NO_UNDEFINED_FLAG) \ +@HOST_OS_DARWIN_FALSE@-module \ +@HOST_OS_DARWIN_FALSE@-avoid-version + +@HOST_OS_DARWIN_TRUE@libppl_java_la_LDFLAGS = \ +@HOST_OS_DARWIN_TRUE@$(NO_UNDEFINED_FLAG) \ +@HOST_OS_DARWIN_TRUE@-avoid-version \ +@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_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 = \ +@required_instantiations_java_cxx_objects@ \ +$(top_builddir)/src/libppl.la \ +@extra_libraries@ + +libppl_java_la_DEPENDENCIES = \ +@required_instantiations_java_cxx_objects@ + +CLEANFILES = \ +@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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Java/jni/Makefile'; \ + 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 +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libppl_java.la: $(libppl_java_la_OBJECTS) $(libppl_java_la_DEPENDENCIES) + $(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 + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_BD_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_BD_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_BD_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_BD_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_BD_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_BD_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_BD_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_BD_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_BD_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Constraints_Product_C_Polyhedron_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Constraints_Product_Grid_C_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Constraints_Product_Grid_NNC_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Constraints_Product_NNC_Polyhedron_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Float_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Int16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Int32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Int64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Int8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Long_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Octagonal_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Octagonal_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Octagonal_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Octagonal_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Octagonal_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Octagonal_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Octagonal_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Octagonal_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Octagonal_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_BD_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_BD_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_BD_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_BD_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_BD_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_BD_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_BD_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_BD_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_BD_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_C_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_Float_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_Int16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_Int32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_Int64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_Int8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_Long_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_NNC_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_Octagonal_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_Octagonal_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_Octagonal_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_Octagonal_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_Octagonal_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_Octagonal_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_Octagonal_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_Rational_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_Uint16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_Uint32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_Uint64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_Uint8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Pointset_Powerset_Z_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Rational_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Uint16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Uint32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Uint64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Uint8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_Z_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_common.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_java_globals.Plo@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -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 + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-exec-am: install-pkglibLTLIBRARIES + +install-html: install-html-am + +install-info: install-info-am + +install-man: + +install-pdf: install-pdf-am + +install-ps: 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: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pkglibLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-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 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..9871f86 --- /dev/null +++ b/interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4 @@ -0,0 +1,1247 @@ +m4_dnl -*- C++ -*- +m4_define(`dnl', `m4_dnl') +m4_divert(-1) +This m4 file contains the code for generating ppl_java_.cc + +Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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_@CLASS@_@WIDEN@_widening_assign_with_tokens_code', `') +m4_define(`ppl_@CLASS@_widening_assign_with_tokens_code', `') +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_with_tokens_code', `') +m4_define(`ppl_@CLASS@_@LIMITEDBOUNDED@_@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_@CLASS@_iterator_from_iterator_code', +`dnl +#include "parma_polyhedra_library_@CLASS@_Iterator.h" + +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@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_@CLASS@_iterator_equals_iterator_code', +`dnl +JNIEXPORT jboolean JNICALL +Java_parma_1polyhedra_1library_@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_@CLASS@_@BEGINEND@_iterator_code', +`dnl +JNIEXPORT jobject JNICALL +Java_parma_1polyhedra_1library_@1TOPOLOGY@@1CLASS@_@BEGINEND@_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@_Iterator"); + jmethodID j_it_ctr_id = env->GetMethodID(j_it_class, "", "()V"); + jobject j_it = env->NewObject(j_it_class, j_it_ctr_id); + @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_@CLASS@_iterator_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@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_@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_@CLASS@_@INCDEC@_iterator_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1TOPOLOGY@@1CLASS@_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_@INCDEC@_cpp_name()(*this_ptr); +} +CATCH_ALL + +') + +m4_define(`m4_increment_cpp_name', `++') +m4_define(`m4_decrement_cpp_name', `--') + +m4_define(`ppl_@CLASS@_get_disjunct_code', +`dnl +JNIEXPORT jobject JNICALL +Java_parma_1polyhedra_1library_@1TOPOLOGY@@1CLASS@_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@"); + jmethodID j_ctr_id = env->GetMethodID(j_class, "", "()V"); + jobject j_obj = env->NewObject(j_class, j_ctr_id); + set_ptr(env, j_obj, &((*this_ptr)->element()), true); + return j_obj; + } + CATCH_ALL; + jobject null = 0; + return null; +} + +') + +m4_define(`ppl_@CLASS@_drop_disjunct_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1TOPOLOGY@@1CLASS@_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_@CLASS@_drop_disjuncts_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1TOPOLOGY@@1CLASS@_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_@CLASS@_add_disjunct_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1TOPOLOGY@@1CLASS@_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_@TOPOLOGY@@CLASS@_from_space_dimension_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1TOPOLOGY@@1CLASS@_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(j_dim); + jclass degenerate_element_class + = env->FindClass("parma_polyhedra_library/Degenerate_Element"); + jmethodID degenerate_element_ordinal_id + = env->GetMethodID(degenerate_element_class, "ordinal", "()I"); + jint j_degenerate_element_int + = env->CallIntMethod(j_degenerate_element, degenerate_element_ordinal_id); + @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: + throw std::runtime_error("PPL Java interface internal error"); + } + set_ptr(env, j_this, this_ptr); +} +CATCH_ALL + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1TOPOLOGY@@1CLASS@_build_1cpp_1object__Lparma_1polyhedra_1library_@1FRIEND@_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_@TOPOLOGY@@CLASS@_from_@FRIEND@_with_complexity_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1TOPOLOGY@@1CLASS@_build_1cpp_1object__Lparma_1polyhedra_1library_@1FRIEND@_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)); + jclass complexity_class + = env->FindClass("parma_polyhedra_library/Complexity_Class"); + jmethodID complexity_ordinal_id + = env->GetMethodID(complexity_class, "ordinal", "()I"); + jint j_complexity_int + = env->CallIntMethod(j_complexity, complexity_ordinal_id); + @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: + throw std::runtime_error("PPL Java interface internal error"); + } + set_ptr(env, j_this, this_ptr); +} +CATCH_ALL + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@BUILD_REPRESENT@s_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1TOPOLOGY@@1CLASS@_build_1cpp_1object__Lparma_1polyhedra_1library_@1!BUILD_REPRESENT@_1System_2 +(JNIEnv* env, jobject j_this, jobject j_iterable) try { + @!BUILD_REPRESENT@_System cs + = build_cxx_@BUILD_REPRESENT@_system(env, j_iterable); + @TOPOLOGY@@CPP_CLASS@* this_ptr = new @TOPOLOGY@@CPP_CLASS@(cs@RECYCLE@); + set_ptr(env, j_this, this_ptr); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@UB_EXACT@_code', +`dnl +JNIEXPORT jboolean JNICALL +Java_parma_1polyhedra_1library_@1TOPOLOGY@@1CLASS@_@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_@CLASS@_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1TOPOLOGY@@1CLASS@_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_@CLASS@_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1TOPOLOGY@@1CLASS@_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_@CLASS@_swap_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@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)); + this_ptr->swap(*y_ptr); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@DIMENSION@_code', +`dnl +JNIEXPORT jlong JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_@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_@CLASS@_get_@CLASS_REPRESENT@s_code', +`dnl +JNIEXPORT jobject JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_@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_@CLASS_REPRESENT@_system(env, this_ptr->@CLASS_REPRESENT@s()); + } + CATCH_ALL; + jobject null = 0; + return null; +} + +') + +m4_define(`ppl_@CLASS@_get_minimized_@CLASS_REPRESENT@s_code', +`dnl +JNIEXPORT jobject JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_minimized_1@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_@CLASS_REPRESENT@_system(env, + this_ptr->minimized_@CLASS_REPRESENT@s()); + } + CATCH_ALL; + jobject null = 0; + return null; +} + +') + +m4_define(`ppl_@CLASS@_relation_with_@RELATION_REPRESENT@_code', +`dnl +JNIEXPORT jobject JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_relation_1with__Lparma_1polyhedra_1library_@1!RELATION_REPRESENT@_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_@RELATION_REPRESENT@(env, j_c); + Poly_@!A_RELATION_REPRESENT@_Relation pcr = this_ptr->relation_with(c); + return build_java_poly_@A_RELATION_REPRESENT@_relation(env, pcr); + } + CATCH_ALL; + jobject null = 0; + return null; +} + +') + +m4_define(`ppl_@CLASS@_@HAS_PROPERTY@_code', +`dnl +JNIEXPORT jboolean JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_@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_@CLASS@_@SIMPLIFY@_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_@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_@CLASS@_unconstrain_space_dimension_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@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_@CLASS@_unconstrain_space_dimensions_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@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_@CLASS@_bounds_from_@ABOVEBELOW@_code', +`dnl +JNIEXPORT jboolean JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_bounds_1from_1@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_@ABOVEBELOW@(le); + } + CATCH_ALL; + return false; +} + +') + +m4_define(`ppl_@CLASS@_@MAXMIN@_code', +`dnl +JNIEXPORT jboolean JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_@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)) { + jobject j_num_result = build_java_coeff(env, num); + jobject j_den_result = build_java_coeff(env, den); + set_coefficient(env, j_num, j_num_result); + set_coefficient(env, j_den, j_den_result); + jobject j_boolean = bool_to_j_boolean(env, b_value); + set_by_reference(env, j_ref_boolean, j_boolean); + return true; + } + return false; + } + CATCH_ALL; + return false; +} + +') + +m4_define(`ppl_@CLASS@_@MAXMIN@_with_point_code', +`dnl +JNIEXPORT jboolean JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_@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)) { + jobject j_num_result = build_java_coeff(env, num); + jobject j_den_result = build_java_coeff(env, den); + jobject j_g_result = build_java_generator(env, g); + set_coefficient(env, j_num, j_num_result); + set_coefficient(env, j_den, j_den_result); + jobject j_boolean = bool_to_j_boolean(env, b_value); + set_by_reference(env, j_ref_boolean, j_boolean); + set_generator(env, j_g, j_g_result); + return true; + } + return false; + } + CATCH_ALL; + return false; +} + +') + +m4_define(`ppl_@CLASS@_@COMPARISON@_@CLASS@_code', +`dnl +JNIEXPORT jboolean JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_@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_@CLASS@_equals_@CLASS@_code', +`dnl +JNIEXPORT jboolean JNICALL +Java_parma_1polyhedra_1library_@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_@CLASS@_hashcode_code', +`dnl +JNIEXPORT jint JNICALL +Java_parma_1polyhedra_1library_@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_@CLASS@_OK_code', +`dnl +JNIEXPORT jboolean JNICALL +Java_parma_1polyhedra_1library_@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_@CLASS@_add_@CLASS_REPRESENT@_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_add_1@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_@CLASS_REPRESENT@(env, j_c); + this_ptr->add_@CLASS_REPRESENT@(c); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_refine_with_@REFINE_REPRESENT@_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_refine_1with_1@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_@REFINE_REPRESENT@(env, j_c); + this_ptr->refine_with_@REFINE_REPRESENT@(c); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@s_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_add_1@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@_System cs = build_cxx_@CLASS_REPRESENT@_system(env, j_cs); + this_ptr->add_@CLASS_REPRESENT@s(cs); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_refine_with_@REFINE_REPRESENT@s_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_refine_1with_1@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@_System cs + = build_cxx_@REFINE_REPRESENT@_system(env, j_cs); + this_ptr->refine_with_@REFINE_REPRESENT@s(cs); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@BINOP@_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_@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_@CLASS@_simplify_using_context_assign_code', +`dnl +JNIEXPORT jboolean JNICALL +Java_parma_1polyhedra_1library_@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_@CLASS@_@AFFIMAGE@_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_@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_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_generalized_1@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_@AFFIMAGE@(lhs, relsym, rhs); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_generalized_1@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_@AFFIMAGE@(v, relsym, le, c); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_generalized_1@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_@AFFIMAGE@(lhs, relsym, rhs, modulus); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_with_congruence_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@CLASS@_generalized_1@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_@AFFIMAGE@(v, relsym, le, c, modulus); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_bounded_@AFFIMAGE@_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_bounded_1@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_@AFFIMAGE@(v, lhs, rhs, c); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@WIDEN@_widening_assign_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_@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 (is_null(env, j_by_ref_int)) + this_ptr->@WIDEN@_widening_assign(*y_ptr); + else { + jobject j_integer = get_by_reference(env, j_by_ref_int); + unsigned int tokens = + jtype_to_unsigned(j_integer_to_j_int(env, j_integer)); + this_ptr->@WIDEN@_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_@CLASS@_widening_assign_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@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 (is_null(env, j_by_ref_int)) + this_ptr->widening_assign(*y_ptr); + else { + jobject j_integer = get_by_reference(env, j_by_ref_int); + unsigned int tokens = + jtype_to_unsigned(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_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_@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 (is_null(env, j_by_ref_int)) + this_ptr->@EXTRAPOLATION@_extrapolation_assign(*y_ptr); + else { + jobject j_integer = get_by_reference(env, j_by_ref_int); + unsigned int tokens = + jtype_to_unsigned(j_integer_to_j_int(env, j_integer)); + this_ptr->@EXTRAPOLATION@_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_@CLASS@_@EXTRAPOLATION@_narrowing_assign_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_@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@_narrowing_assign(*y_ptr); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_@1LIMITEDBOUNDED@_1@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@_System cs = build_cxx_@CONSTRAINER@_system(env, j_cs); + if (is_null(env, j_by_ref_int)) + this_ptr->@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign(*y_ptr, cs); + else { + jobject j_integer = get_by_reference(env, j_by_ref_int); + unsigned int tokens = + jtype_to_unsigned(j_integer_to_j_int(env, j_integer)); + this_ptr->@LIMITEDBOUNDED@_@WIDENEXPN@_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_@CLASS@_BGP99_@DISJUNCT_WIDEN@_extrapolation_assign_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_BGP99_1@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(j_integer_to_j_int(env, j_disjuncts)); + this_ptr->BGP99_extrapolation_assign + (*y_ptr, + widen_fun_ref(&@DISJUNCT_TOPOLOGY@@A_DISJUNCT@::@DISJUNCT_WIDEN@_widening_assign), + disjuncts); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_BHZ03_1@1A_DISJUNCT_WIDEN@_1@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@_Certificate> + (*y_ptr, + widen_fun_ref( + &@DISJUNCT_TOPOLOGY@@A_DISJUNCT@::@DISJUNCT_WIDEN@_widening_assign)); +} +CATCH_ALL + +') + + +m4_define(`ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_add_1space_1dimensions_1@1EMBEDPROJECT@ +(JNIEnv* env, jobject j_this, jlong dim) try { + dimension_type ppl_dim = jtype_to_unsigned(dim); + @CPP_CLASS@* this_ptr + = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this)); + this_ptr->add_space_dimensions_@EMBEDPROJECT@(ppl_dim); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_remove_space_dimensions_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@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_@CLASS@_remove_higher_space_dimensions_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_remove_1higher_1space_1dimensions +(JNIEnv* env, jobject j_this, jlong dim) try { + dimension_type ppl_dim = jtype_to_unsigned(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_@CLASS@_expand_space_dimension_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_expand_1space_1dimension +(JNIEnv* env, jobject j_this, jobject j_variable, jlong dim) try { + dimension_type ppl_dim = jtype_to_unsigned(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_@CLASS@_fold_space_dimensions_code', +`dnl +JNIEXPORT void JNICALL Java_parma_1polyhedra_1library_@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_@CLASS@_map_space_dimensions_code', +`dnl +JNIEXPORT void JNICALL +Java_parma_1polyhedra_1library_@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 ppl_pfunc(j_p_func, env); + this_ptr->map_space_dimensions(ppl_pfunc); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_string_code', +`dnl +JNIEXPORT jstring JNICALL +Java_parma_1polyhedra_1library_@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_@CLASS@_@MEMBYTES@_code', +`dnl +JNIEXPORT jlong JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_@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_@CLASS@_constrains_code', +`dnl +JNIEXPORT jboolean JNICALL +Java_parma_1polyhedra_1library_@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_@CLASS@_ascii_dump_code', +`dnl +JNIEXPORT jstring JNICALL +Java_parma_1polyhedra_1library_@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_@CLASS@_linear_@PARTITION@_code', +`dnl +JNIEXPORT jobject JNICALL +Java_parma_1polyhedra_1library_@1TOPOLOGY@@1CLASS@_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 > + r = linear_partition(*p_ptr, *q_ptr); + + @TOPOLOGY@@CPP_CLASS@* r1 + = new @TOPOLOGY@@CPP_CLASS@(0, EMPTY); + Pointset_Powerset* r2 + = new Pointset_Powerset(0, EMPTY); + r1->swap(r.first); + r2->swap(r.second); + + jclass j_pair_class = env->FindClass("parma_polyhedra_library/Pair"); + jmethodID j_ctr_id_pair = env->GetMethodID(j_pair_class, "", "()V"); + jobject j_pair_obj = env->NewObject(j_pair_class, j_ctr_id_pair); + + jclass j_class_r1 = env->FindClass("parma_polyhedra_library/@TOPOLOGY@@CLASS@"); + jmethodID j_ctr_id_r1 = env->GetMethodID(j_class_r1, "", "()V"); + jobject j_obj_r1 = env->NewObject(j_class_r1, j_ctr_id_r1); + set_ptr(env, j_obj_r1, r1); + + jclass j_class_r2 = env->FindClass("parma_polyhedra_library/Pointset_Powerset_NNC_Polyhedron"); + jmethodID j_ctr_id_r2 = env->GetMethodID(j_class_r2, "", "()V"); + jobject j_obj_r2 = env->NewObject(j_class_r2, j_ctr_id_r2); + 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_@CLASS@_approximate_@PARTITION@_code', +`dnl +JNIEXPORT jobject JNICALL +Java_parma_1polyhedra_1library_@1CLASS@_approximate_1@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 > + r = approximate_partition(*p_ptr, *q_ptr, b_finite_val); + + @CPP_CLASS@* r1 = new @CPP_CLASS@(0, EMPTY); + Pointset_Powerset* r2 = new Pointset_Powerset(0, EMPTY); + r1->swap(r.first); + r2->swap(r.second); + + jclass j_pair_class + = env->FindClass("parma_polyhedra_library/Pair"); + jmethodID j_ctr_id_pair = env->GetMethodID(j_pair_class, "", "()V"); + jobject j_pair_obj = env->NewObject(j_pair_class, j_ctr_id_pair); + + jclass j_class_r1 = env->FindClass("parma_polyhedra_library/@CLASS@"); + jmethodID j_ctr_id_r1 = env->GetMethodID(j_class_r1, "", "()V"); + jobject j_obj_r1 = env->NewObject(j_class_r1, j_ctr_id_r1); + set_ptr(env, j_obj_r1, r1); + + jclass j_class_r2 + = env->FindClass("parma_polyhedra_library/Pointset_Powerset_Grid"); + jmethodID j_ctr_id_r2 = env->GetMethodID(j_class_r2, "", "()V"); + jobject j_obj_r2 = env->NewObject(j_class_r2, j_ctr_id_r2); + 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(env, b_finite_val); + set_by_reference(env, j_ref_finite_bool, j_finite_bool); + return j_pair_obj; + } + CATCH_ALL; + return 0; +} + +') 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..e05f25b --- /dev/null +++ b/interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m4 @@ -0,0 +1,71 @@ +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-2009 Roberto Bagnara +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://www.cs.unipr.it/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)') +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 +%<--%<--%<-- ppl_java_`'m4_current_interface`'.cc +/* 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 +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..2bfa970 --- /dev/null +++ b/interfaces/Java/jni/ppl_java_common.cc @@ -0,0 +1,1242 @@ +/* PPL Java interface common routines implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_java_common.defs.hh" + +namespace Parma_Polyhedra_Library { + +namespace Interfaces { + +namespace Java { + +void +handle_exception(JNIEnv* env, const std::overflow_error& e) { + jclass newExcCls + = env->FindClass("parma_polyhedra_library/Overflow_Error_Exception"); + env->ThrowNew(newExcCls, e.what()); +} + +void +handle_exception(JNIEnv* env, const std::invalid_argument& e) { + jclass newExcCls + = env->FindClass("parma_polyhedra_library/Invalid_Argument_Exception"); + env->ThrowNew(newExcCls, e.what()); +} + +void +handle_exception(JNIEnv* env, const std::logic_error& e) { + jclass newExcCls + = env->FindClass("parma_polyhedra_library/Logic_Error_Exception"); + env->ThrowNew(newExcCls, e.what()); +} + +void +handle_exception(JNIEnv* env, const std::length_error& e) { + jclass newExcCls + = env->FindClass("parma_polyhedra_library/Length_Error_Exception"); + env->ThrowNew(newExcCls, e.what()); +} + +void +handle_exception(JNIEnv* env, const std::domain_error& e) { + jclass newExcCls + = env->FindClass("parma_polyhedra_library/Domain_Error_Exception"); + env->ThrowNew(newExcCls, e.what()); +} + +void +handle_exception(JNIEnv* env, const std::bad_alloc&) { + jclass newExcCls + = env->FindClass("java/lang/RuntimeException"); + env->ThrowNew(newExcCls, "Out of memory"); +} + +void +handle_exception(JNIEnv* env, const std::exception& e) { + jclass newExcCls = env->FindClass("java/lang/RuntimeException"); + env->ThrowNew(newExcCls, e.what()); +} + +void +handle_exception(JNIEnv* env) { + jclass newExcCls = env->FindClass("java/lang/RuntimeException"); + env->ThrowNew(newExcCls, "PPL bug: unknown exception raised"); +} + +jobject +build_java_poly_gen_relation(JNIEnv* env, + Poly_Gen_Relation& r) { + jclass j_poly_gen_relation_class + = env->FindClass("parma_polyhedra_library/Poly_Gen_Relation"); + jmethodID j_poly_gen_relation_ctr_id + = env->GetMethodID(j_poly_gen_relation_class, "", "(I)V"); + + 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(); + } + } + return env->NewObject(j_poly_gen_relation_class, + j_poly_gen_relation_ctr_id, j_value); +} + +jobject +build_java_poly_con_relation(JNIEnv* env, + Poly_Con_Relation& r) { + jclass j_poly_con_relation_class + = env->FindClass("parma_polyhedra_library/Poly_Con_Relation"); + jmethodID j_poly_con_relation_ctr_id + = env->GetMethodID(j_poly_con_relation_class, "", "(I)V"); + + 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(); + } + } + return env->NewObject(j_poly_con_relation_class, + j_poly_con_relation_ctr_id, j_value); +} + + +Congruence +build_cxx_congruence(JNIEnv* env, const jobject& j_congruence) { + jclass congruence_class + = env->FindClass("parma_polyhedra_library/Congruence"); + jfieldID modulus_field_id + = env->GetFieldID(congruence_class, + "modulus", + "Lparma_polyhedra_library/Coefficient;"); + jobject j_modulus = env->GetObjectField(j_congruence, modulus_field_id); + PPL_DIRTY_TEMP_COEFFICIENT(ppl_modulus); + ppl_modulus = build_cxx_coeff(env, j_modulus); + jfieldID lhs_field_id + = env->GetFieldID(congruence_class, + "lhs", + "Lparma_polyhedra_library/Linear_Expression;"); + jfieldID rhs_field_id + = env->GetFieldID(congruence_class, + "rhs", + "Lparma_polyhedra_library/Linear_Expression;"); + jobject j_lhs = env->GetObjectField(j_congruence, lhs_field_id); + jobject j_rhs = env->GetObjectField(j_congruence, rhs_field_id); + 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; +} + +jobject +bool_to_j_boolean(JNIEnv* env, const bool value) { + jclass boolean_java_class = env->FindClass("java/lang/Boolean"); + jmethodID getboolean_method_id + = env->GetStaticMethodID(boolean_java_class, + "valueOf", + "(Z)Ljava/lang/Boolean;"); + return env->CallStaticObjectMethod(boolean_java_class, + getboolean_method_id, + value); +} + +jobject +j_long_to_j_long_class(JNIEnv* env, const jlong& jlong_value) { + jclass long_java_class = env->FindClass("java/lang/Long"); + jmethodID get_long_method_id + = env->GetStaticMethodID(long_java_class, + "valueOf", + "(J)Ljava/lang/Long;"); + return env->CallStaticObjectMethod(long_java_class, + get_long_method_id, + jlong_value); +} + +jlong +j_long_class_to_j_long(JNIEnv* env, const jobject& j_long) { + jclass long_java_class = env->FindClass("java/lang/Long"); + jmethodID get_int_method_id = env->GetMethodID(long_java_class, + "longValue", "()J"); + return env->CallIntMethod(j_long, get_int_method_id); +} + + +jobject +j_int_to_j_integer(JNIEnv* env, const jint& jint_value) { + jclass integer_java_class = env->FindClass("java/lang/Integer"); + jmethodID get_integer_method_id + = env->GetStaticMethodID(integer_java_class, + "valueOf", + "(I)Ljava/lang/Integer;"); + return env->CallStaticObjectMethod(integer_java_class, + get_integer_method_id, + jint_value); +} + +jint +j_integer_to_j_int(JNIEnv* env, const jobject& j_integer) { + jclass integer_java_class = env->FindClass("java/lang/Integer"); + jmethodID get_int_method_id = env->GetMethodID(integer_java_class, + "intValue", "()I"); + return env->CallIntMethod(j_integer, get_int_method_id); +} + +// bool +// j_boolean_to_bool(JNIEnv* env, +// const jobject& j_boolean) { +// jclass boolean_class = env->GetObjectClass(j_boolean); +// jmethodID booleanvalue_method_id = env->GetMethodID(boolean_class, +// "booleanValue", +// "()Z"); +// return env->CallBooleanMethod(j_boolean, booleanvalue_method_id); + +// } + +Variables_Set +build_cxx_variables_set(JNIEnv* env, + const jobject& j_v_set) { + jclass variables_set_class = env->GetObjectClass(j_v_set); + jclass iterator_java_class = env->FindClass("java/util/Iterator"); + Variables_Set v_set; + jmethodID iterator_method_id = env->GetMethodID(variables_set_class, + "iterator", + "()Ljava/util/Iterator;"); + jobject j_iterator = env->CallObjectMethod(j_v_set, iterator_method_id); + jmethodID has_next_method_id = env->GetMethodID(iterator_java_class, + "hasNext", + "()Z"); + jboolean has_next_value = env->CallBooleanMethod(j_iterator, + has_next_method_id); + jmethodID next_method_id = env->GetMethodID(iterator_java_class, + "next", + "()Ljava/lang/Object;"); + + while (has_next_value) { + jobject j_variable = env->CallObjectMethod(j_iterator, + next_method_id); + v_set.insert(build_cxx_variable(env, j_variable)); + has_next_value = env->CallBooleanMethod(j_iterator, + has_next_method_id); + } + return v_set; +} + +jobject +build_java_variables_set(JNIEnv* env, + const Variables_Set& v_set) { + jclass j_vs_class = env->FindClass("parma_polyhedra_library/Variables_Set"); + jmethodID j_vs_ctr_id = env->GetMethodID(j_vs_class, "", "()V"); + jmethodID j_vs_add_id = env->GetMethodID(j_vs_class, "add", + "(Ljava/lang/Object;)Z"); + jobject j_vs = env->NewObject(j_vs_class, j_vs_ctr_id); + 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, j_vs_add_id, j_variable); + } + return j_vs; +} + +Variable +build_cxx_variable(JNIEnv* env, const jobject& j_var) { + jclass j_variable_class = env->FindClass("parma_polyhedra_library/Variable"); + jfieldID varid_field_id = env->GetFieldID(j_variable_class, + "varid", + "I"); + // Retrieve the value. + return Variable(env->GetIntField(j_var, varid_field_id)); +} + +jobject +build_java_variable(JNIEnv* env, const Variable& var) { + jclass variable_class = env->FindClass("parma_polyhedra_library/Variable"); + jmethodID j_variable_ctr_id = env->GetMethodID(variable_class, "", + "(I)V"); + return env->NewObject(variable_class, j_variable_ctr_id, + var.id()); +} + +Relation_Symbol +build_cxx_relsym(JNIEnv* env, const jobject& j_relsym) { + jclass rel_sym_class + = env->FindClass("parma_polyhedra_library/Relation_Symbol"); + jmethodID rel_sym_ordinal_id = env->GetMethodID(rel_sym_class, "ordinal", + "()I"); + jint rel_sym = env->CallIntMethod(j_relsym, rel_sym_ordinal_id); + 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; + default: + // We should not be here! + throw std::runtime_error("PPL Java interface internal error"); + } +} + +Optimization_Mode +build_cxx_optimization_mode(JNIEnv* env, const jobject& j_opt_mode) { + jclass opt_mode_class + = env->FindClass("parma_polyhedra_library/Optimization_Mode"); + jmethodID opt_mode_ordinal_id = env->GetMethodID(opt_mode_class, "ordinal", + "()I"); + jint opt_mode = env->CallIntMethod(j_opt_mode, opt_mode_ordinal_id); + switch (opt_mode) { + case 0: + return MINIMIZATION; + case 1: + return MAXIMIZATION; + default: + throw std::runtime_error("PPL Java interface internal error"); + } +} + +jobject +build_java_mip_status(JNIEnv* env, const MIP_Problem_Status& mip_status) { + jclass j_mip_problem_status_class + = env->FindClass("parma_polyhedra_library/MIP_Problem_Status"); + jfieldID mp_status_unfeasible_get_id + = env->GetStaticFieldID(j_mip_problem_status_class, + "UNFEASIBLE_MIP_PROBLEM", + "Lparma_polyhedra_library/MIP_Problem_Status;"); + jfieldID mp_status_unbounded_get_id + = env->GetStaticFieldID(j_mip_problem_status_class, + "UNBOUNDED_MIP_PROBLEM", + "Lparma_polyhedra_library/MIP_Problem_Status;"); + jfieldID mp_status_optimized_get_id + = env->GetStaticFieldID(j_mip_problem_status_class, + "OPTIMIZED_MIP_PROBLEM", + "Lparma_polyhedra_library/MIP_Problem_Status;"); + switch (mip_status) { + case UNFEASIBLE_MIP_PROBLEM: + return env->GetStaticObjectField(j_mip_problem_status_class, + mp_status_unfeasible_get_id); + case UNBOUNDED_MIP_PROBLEM: + return env->GetStaticObjectField(j_mip_problem_status_class, + mp_status_unbounded_get_id); + case OPTIMIZED_MIP_PROBLEM: + return env->GetStaticObjectField(j_mip_problem_status_class, + mp_status_optimized_get_id); + default: + throw std::runtime_error("PPL Java interface internal error"); + } +} + +jobject +build_java_optimization_mode(JNIEnv* env, const Optimization_Mode& opt_mode) { + jclass j_optimization_mode_class + = env->FindClass("parma_polyhedra_library/Optimization_Mode"); + jfieldID optimization_mode_min_get_id + = env->GetStaticFieldID(j_optimization_mode_class, + "MINIMIZATION", + "Lparma_polyhedra_library/Optimization_Mode;"); + jfieldID optimization_mode_max_get_id + = env->GetStaticFieldID(j_optimization_mode_class, + "MAXIMIZATION", + "Lparma_polyhedra_library/Optimization_Mode;"); + switch (opt_mode) { + case MINIMIZATION: + return env->GetStaticObjectField(j_optimization_mode_class, + optimization_mode_min_get_id); + case MAXIMIZATION: + return env->GetStaticObjectField(j_optimization_mode_class, + optimization_mode_max_get_id); + default: + throw std::runtime_error("PPL Java interface internal error"); + } +} + +MIP_Problem::Control_Parameter_Name +build_cxx_control_parameter_name(JNIEnv* env, const jobject& j_cp_name) { + jclass cp_name_class + = env->FindClass("parma_polyhedra_library/Control_Parameter_Name"); + jmethodID cp_name_ordinal_id = env->GetMethodID(cp_name_class, "ordinal", + "()I"); + jint cp_name = env->CallIntMethod(j_cp_name, cp_name_ordinal_id); + switch (cp_name) { + case 0: + return MIP_Problem::PRICING; + default: + throw std::runtime_error("PPL Java interface internal error"); + } +} + +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"); + jfieldID cp_name_pricing_get_id + = env->GetStaticFieldID(j_cp_name_class, + "PRICING", + "Lparma_polyhedra_library/Control_Parameter_Name;"); + switch (cp_name) { + case MIP_Problem::PRICING: + return env->GetStaticObjectField(j_cp_name_class, + cp_name_pricing_get_id); + default: + throw std::runtime_error("PPL Java interface internal error"); + } +} + +MIP_Problem::Control_Parameter_Value +build_cxx_control_parameter_value(JNIEnv* env, const jobject& j_cp_value) { + jclass cp_value_class + = env->FindClass("parma_polyhedra_library/Control_Parameter_Value"); + jmethodID cp_value_ordinal_id = env->GetMethodID(cp_value_class, "ordinal", + "()I"); + jint cp_value = env->CallIntMethod(j_cp_value, cp_value_ordinal_id); + 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: + throw std::runtime_error("PPL Java interface internal error"); + } +} + +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"); + jfieldID cp_value_float_get_id + = env->GetStaticFieldID(j_cp_value_class, + "PRICING_STEEPEST_EDGE_FLOAT", + "Lparma_polyhedra_library/Control_Parameter_Value;"); + jfieldID cp_value_exact_get_id + = env->GetStaticFieldID(j_cp_value_class, + "PRICING_STEEPEST_EDGE_EXACT", + "Lparma_polyhedra_library/Control_Parameter_Value;"); + jfieldID cp_value_textbook_get_id + = env->GetStaticFieldID(j_cp_value_class, + "PRICING_TEXTBOOK", + "Lparma_polyhedra_library/Control_Parameter_Value;"); + switch (cp_value) { + case MIP_Problem::PRICING_STEEPEST_EDGE_FLOAT: + return env->GetStaticObjectField(j_cp_value_class, + cp_value_float_get_id); + case MIP_Problem::PRICING_STEEPEST_EDGE_EXACT: + return env->GetStaticObjectField(j_cp_value_class, + cp_value_exact_get_id); + case MIP_Problem::PRICING_TEXTBOOK: + return env->GetStaticObjectField(j_cp_value_class, + cp_value_textbook_get_id); + default: + throw std::runtime_error("PPL Java interface internal error"); + } +} + +Coefficient +build_cxx_coeff(JNIEnv* env, const jobject& j_coeff) { + jclass j_coeff_class = env->GetObjectClass(j_coeff); + jfieldID fid = env->GetFieldID(j_coeff_class, "value", + "Ljava/math/BigInteger;"); + jobject bi = env->GetObjectField(j_coeff, fid); + jclass big_integer_class = env->GetObjectClass(bi); + jmethodID bi_to_string = env->GetMethodID(big_integer_class, "toString", + "()Ljava/lang/String;"); + jstring bi_string = (jstring) env->CallObjectMethod(bi, bi_to_string); + const char *nativeString = env->GetStringUTFChars(bi_string, 0); + PPL_DIRTY_TEMP_COEFFICIENT(ppl_coeff); + ppl_coeff = Coefficient(nativeString); + env->ReleaseStringUTFChars(bi_string, nativeString); + return ppl_coeff; +} + +jobject +build_java_coeff(JNIEnv* env, const Coefficient& ppl_coeff) { + std::ostringstream s; + s << ppl_coeff; + jclass j_coefficient_class = + env->FindClass("parma_polyhedra_library/Coefficient"); + jmethodID j_coefficient_ctr_id = env->GetMethodID(j_coefficient_class, + "", + "(Ljava/lang/String;)V"); + std::string str = s.str(); + jstring coeff_string = env->NewStringUTF(str.c_str()); + return env->NewObject(j_coefficient_class, j_coefficient_ctr_id, + coeff_string); +} + +Constraint +build_cxx_constraint(JNIEnv* env, const jobject& j_constraint) { + jclass constraint_class + = env->FindClass("parma_polyhedra_library/Constraint"); + jclass rel_sym_class + = env->FindClass("parma_polyhedra_library/Relation_Symbol"); + jfieldID lhs_field_id + = env->GetFieldID(constraint_class, "lhs", + "Lparma_polyhedra_library/Linear_Expression;"); + jfieldID rhs_field_id + = env->GetFieldID(constraint_class, "rhs", + "Lparma_polyhedra_library/Linear_Expression;"); + jobject lhs_value = env->GetObjectField(j_constraint, lhs_field_id); + jobject rhs_value = env->GetObjectField(j_constraint, rhs_field_id); + Linear_Expression first_le = build_cxx_linear_expression(env, lhs_value); + Linear_Expression second_le = build_cxx_linear_expression(env, rhs_value); + jfieldID kind_field_id + = env->GetFieldID(constraint_class, "kind", + "Lparma_polyhedra_library/Relation_Symbol;"); + jobject kind = env->GetObjectField(j_constraint, kind_field_id); + jmethodID rel_sym_ordinal_id = env->GetMethodID(rel_sym_class, "ordinal", + "()I"); + jint rel_sym = env->CallIntMethod(kind, rel_sym_ordinal_id); + 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: + if (rel_sym == 3) + return Constraint(first_le >= second_le); + case 4: + return Constraint(first_le > second_le); + default: + ; + } + jclass newExcCls = env->FindClass("java/lang/RuntimeException"); + env->ThrowNew(newExcCls, "ppl.java: \n runtime error"); + // We should not be here! + throw std::runtime_error("PPL Java interface internal error"); +} + +Linear_Expression +build_cxx_linear_expression(JNIEnv* env, const jobject& j_le) { + jclass le_sum_class + = env->FindClass("parma_polyhedra_library/Linear_Expression_Sum"); + jclass le_difference_class + = env->FindClass("parma_polyhedra_library/Linear_Expression_Difference"); + jclass le_times_class + = env->FindClass("parma_polyhedra_library/Linear_Expression_Times"); + jclass le_unary_minus_class + = env->FindClass("parma_polyhedra_library/Linear_Expression_Unary_Minus"); + jclass j_coeff_le_class + = env->FindClass("parma_polyhedra_library/Linear_Expression_Coefficient"); + jclass j_variable_le_class + = env->FindClass("parma_polyhedra_library/Linear_Expression_Variable"); + jclass j_variable_class = env->FindClass("parma_polyhedra_library/Variable"); + + jclass current_class = env->GetObjectClass(j_le); + // Variable + if (env->IsAssignableFrom(j_variable_le_class, current_class)) { + jfieldID arg_field_id + = env->GetFieldID(j_variable_le_class, + "arg", + "Lparma_polyhedra_library/Variable;"); + jobject var = env->GetObjectField(j_le, arg_field_id); + jfieldID varid_field_id = env->GetFieldID(j_variable_class, + "varid", + "I"); + // Retrieve the value. + jint varid = env->GetIntField(var, varid_field_id); + return Linear_Expression(Variable(varid)); + } + // Coefficient + if (env->IsAssignableFrom(j_coeff_le_class, current_class)) { + jfieldID coeff_field_id + = env->GetFieldID(j_coeff_le_class, + "coeff", + "Lparma_polyhedra_library/Coefficient;"); + jobject ppl_coeff = env->GetObjectField(j_le, coeff_field_id); + + return Linear_Expression(build_cxx_coeff(env, ppl_coeff)); + } + // Sum + if (env->IsAssignableFrom(le_sum_class, current_class)) { + jfieldID l_field_id + = env->GetFieldID(current_class, "lhs", + "Lparma_polyhedra_library/Linear_Expression;"); + jfieldID r_field_id + = env->GetFieldID(current_class, "rhs", + "Lparma_polyhedra_library/Linear_Expression;"); + jobject l_value = env->GetObjectField(j_le, l_field_id); + jobject r_value = env->GetObjectField(j_le, r_field_id); + return (build_cxx_linear_expression(env, l_value) + + build_cxx_linear_expression(env, r_value)); + } + // Difference + if (env->IsAssignableFrom(current_class, le_difference_class)) { + jfieldID l_field_id + = env->GetFieldID(current_class, "lhs", + "Lparma_polyhedra_library/Linear_Expression;"); + jfieldID r_field_id + = env->GetFieldID(current_class, "rhs", + "Lparma_polyhedra_library/Linear_Expression;"); + jobject l_value = env->GetObjectField(j_le, l_field_id); + jobject r_value = env->GetObjectField(j_le, r_field_id); + return (build_cxx_linear_expression(env, l_value) + - build_cxx_linear_expression(env, r_value)); + } + // Times + if (env->IsAssignableFrom(le_times_class, current_class)) { + jfieldID le_field_id + = env->GetFieldID(current_class, "rhs", + "Lparma_polyhedra_library/Linear_Expression;"); + jfieldID le_coeff_field_id + = env->GetFieldID(current_class, "lhs", + "Lparma_polyhedra_library/Linear_Expression_Coefficient;"); + jobject le_value = env->GetObjectField(j_le, le_field_id); + jobject le_coeff_value = env->GetObjectField(j_le, le_coeff_field_id); + jfieldID coeff_field_id + = env->GetFieldID(j_coeff_le_class, + "coeff", + "Lparma_polyhedra_library/Coefficient;"); + jobject ppl_coeff = env->GetObjectField(le_coeff_value, coeff_field_id); + return (build_cxx_coeff(env, ppl_coeff) + * build_cxx_linear_expression(env, le_value)); + } + // Unary_Minus + if (env->IsAssignableFrom(current_class, le_unary_minus_class)) { + jfieldID le_field_id + = env->GetFieldID(current_class, "arg", + "Lparma_polyhedra_library/Linear_Expression;"); + jobject le_value = env->GetObjectField(j_le, le_field_id); + return (-build_cxx_linear_expression(env, le_value)); + } + // We should not be here! + throw std::runtime_error("PPL Java interface internal error"); +} + +Generator +build_cxx_generator(JNIEnv* env, const jobject& j_generator) { + jclass generator_class = env->FindClass("parma_polyhedra_library/Generator"); + jclass generator_type_class + = env->FindClass("parma_polyhedra_library/Generator_Type"); + + jfieldID j_le_field + = env->GetFieldID(generator_class, "le", + "Lparma_polyhedra_library/Linear_Expression;"); + jobject j_le = env->GetObjectField(j_generator, j_le_field); + jfieldID j_coeff_field + = env->GetFieldID(generator_class, "den", + "Lparma_polyhedra_library/Coefficient;"); + jobject j_coeff = env->GetObjectField(j_generator, j_coeff_field); + + jfieldID generator_type_field + = env->GetFieldID(generator_class, "gt", + "Lparma_polyhedra_library/Generator_Type;"); + jobject generator_type = env->GetObjectField(j_generator, + generator_type_field); + jmethodID generator_type_ordinal_id = env->GetMethodID(generator_type_class, + "ordinal", + "()I"); + jint generator_type_ordinal = env->CallIntMethod(generator_type, + generator_type_ordinal_id); + 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: + return point(build_cxx_linear_expression(env, j_le), + build_cxx_coeff(env, j_coeff)); + case 3: + return closure_point(build_cxx_linear_expression(env, j_le), + build_cxx_coeff(env, j_coeff)); + default: + ; + } + jclass newExcCls = env->FindClass("java/lang/RuntimeException"); + env->ThrowNew(newExcCls, "ppl.java: \n runtime error"); + // We should not be here! + throw std::runtime_error("PPL Java interface internal error"); +} + +Grid_Generator +build_cxx_grid_generator(JNIEnv* env, const jobject& j_grid_generator) { + jclass grid_generator_class + = env->FindClass("parma_polyhedra_library/Grid_Generator"); + jclass grid_generator_type_class + = env->FindClass("parma_polyhedra_library/Grid_Generator_Type"); + + jfieldID j_le_field + = env->GetFieldID(grid_generator_class, + "le", + "Lparma_polyhedra_library/Linear_Expression;"); + jobject j_le = env->GetObjectField(j_grid_generator, j_le_field); + jfieldID j_coeff_field + = env->GetFieldID(grid_generator_class, + "coeff", + "Lparma_polyhedra_library/Coefficient;"); + jobject j_coeff = env->GetObjectField(j_grid_generator, j_coeff_field); + + jfieldID grid_generator_type_field + = env->GetFieldID(grid_generator_class, + "gt", + "Lparma_polyhedra_library/Grid_Generator_Type;"); + jobject grid_generator_type = env->GetObjectField(j_grid_generator, + grid_generator_type_field); + jmethodID grid_generator_type_ordinal_id + = env->GetMethodID(grid_generator_type_class, + "ordinal", + "()I"); + jint grid_generator_type_ordinal + = env->CallIntMethod(grid_generator_type, + grid_generator_type_ordinal_id); + switch (grid_generator_type_ordinal) { + case 0: + return grid_line(build_cxx_linear_expression(env, j_le)); + case 1: + return parameter(build_cxx_linear_expression(env, j_le), + build_cxx_coeff(env, j_coeff)); + case 2: + return grid_point(build_cxx_linear_expression(env, j_le), + build_cxx_coeff(env, j_coeff)); + default: + ; + } + jclass newExcCls = env->FindClass("java/lang/RuntimeException"); + env->ThrowNew(newExcCls, "ppl.java: \n runtime error"); + // We should not be here! + throw std::runtime_error("PPL Java interface internal error"); +} + +void* +get_ptr(JNIEnv* env, const jobject& ppl_object) { + jclass ppl_object_class = env->GetObjectClass(ppl_object); + jfieldID pointer_field = env->GetFieldID(ppl_object_class, "ptr", "J"); + jlong pointer_value = env->GetLongField(ppl_object, pointer_field); + void* ptr = reinterpret_cast(pointer_value); + assert(reinterpret_cast(ptr) == pointer_value); + return unmark(ptr); +} + +bool +is_java_marked(JNIEnv* env, const jobject& ppl_object) { + jclass ppl_object_class = env->GetObjectClass(ppl_object); + jfieldID pointer_field = env->GetFieldID(ppl_object_class, "ptr", "J"); + jlong pointer_value = env->GetLongField(ppl_object, pointer_field); + const void* ptr = reinterpret_cast(pointer_value); + assert(reinterpret_cast(ptr) == pointer_value); + return marked(ptr); +} + +Grid_Generator_System +build_cxx_grid_generator_system(JNIEnv* env, const jobject& j_iterable) { + jclass j_iterable_class = env->GetObjectClass(j_iterable); + jclass iterator_java_class = env->FindClass("java/util/Iterator"); + Grid_Generator_System ggs; + jmethodID iterator_method_id = env->GetMethodID(j_iterable_class, + "iterator", + "()Ljava/util/Iterator;"); + jobject j_iterator = env->CallObjectMethod(j_iterable, iterator_method_id); + jmethodID has_next_method_id = env->GetMethodID(iterator_java_class, + "hasNext", + "()Z"); + jboolean has_next_value = env->CallBooleanMethod(j_iterator, + has_next_method_id); + jmethodID next_method_id = env->GetMethodID(iterator_java_class, + "next", + "()Ljava/lang/Object;"); + + while (has_next_value) { + jobject j_grid_generator = env->CallObjectMethod(j_iterator, + next_method_id); + ggs.insert(build_cxx_grid_generator(env, j_grid_generator)); + has_next_value = env->CallBooleanMethod(j_iterator, + has_next_method_id); + } + return ggs; +} + +Constraint_System +build_cxx_constraint_system(JNIEnv* env, const jobject& j_iterable) { + jclass j_iterable_class = env->GetObjectClass(j_iterable); + jclass iterator_java_class = env->FindClass("java/util/Iterator"); + Constraint_System cs; + jmethodID iterator_method_id = env->GetMethodID(j_iterable_class, + "iterator", + "()Ljava/util/Iterator;"); + jobject j_iterator = env->CallObjectMethod(j_iterable, iterator_method_id); + jmethodID has_next_method_id = env->GetMethodID(iterator_java_class, + "hasNext", + "()Z"); + jboolean has_next_value = env->CallBooleanMethod(j_iterator, + has_next_method_id); + jmethodID next_method_id = env->GetMethodID(iterator_java_class, + "next", + "()Ljava/lang/Object;"); + + while (has_next_value) { + jobject j_constraint = env->CallObjectMethod(j_iterator, + next_method_id); + cs.insert(build_cxx_constraint(env, j_constraint)); + has_next_value = env->CallBooleanMethod(j_iterator, + has_next_method_id); + } + return cs; +} + +Generator_System +build_cxx_generator_system(JNIEnv* env, const jobject& j_iterable) { + jclass j_iterable_class = env->GetObjectClass(j_iterable); + jclass iterator_java_class = env->FindClass("java/util/Iterator"); + Generator_System gs; + jmethodID iterator_method_id = env->GetMethodID(j_iterable_class, + "iterator", + "()Ljava/util/Iterator;"); + jobject j_iterator = env->CallObjectMethod(j_iterable, iterator_method_id); + jmethodID has_next_method_id = env->GetMethodID(iterator_java_class, + "hasNext", + "()Z"); + jboolean has_next_value = env->CallBooleanMethod(j_iterator, + has_next_method_id); + jmethodID next_method_id = env->GetMethodID(iterator_java_class, + "next", + "()Ljava/lang/Object;"); + + while (has_next_value) { + jobject j_constraint = env->CallObjectMethod(j_iterator, + next_method_id); + gs.insert(build_cxx_generator(env, j_constraint)); + has_next_value = env->CallBooleanMethod(j_iterator, + has_next_method_id); + } + return gs; +} + +Congruence_System +build_cxx_congruence_system(JNIEnv* env, const jobject& j_iterable) { + jclass j_iterable_class = env->GetObjectClass(j_iterable); + jclass iterator_java_class = env->FindClass("java/util/Iterator"); + Congruence_System cgs; + jmethodID iterator_method_id = env->GetMethodID(j_iterable_class, + "iterator", + "()Ljava/util/Iterator;"); + jobject j_iterator = env->CallObjectMethod(j_iterable, iterator_method_id); + jmethodID has_next_method_id = env->GetMethodID(iterator_java_class, + "hasNext", + "()Z"); + jboolean has_next_value = env->CallBooleanMethod(j_iterator, + has_next_method_id); + jmethodID next_method_id = env->GetMethodID(iterator_java_class, + "next", + "()Ljava/lang/Object;"); + + while (has_next_value) { + jobject j_congruence = env->CallObjectMethod(j_iterator, + next_method_id); + cgs.insert(build_cxx_congruence(env, j_congruence)); + has_next_value = env->CallBooleanMethod(j_iterator, + has_next_method_id); + } + return cgs; +} + +jobject +build_java_linear_expression_coefficient(JNIEnv* env, + const Coefficient& c) { + jclass j_le_coeff_class + = env->FindClass("parma_polyhedra_library/Linear_Expression_Coefficient"); + jobject j_coeff = build_java_coeff(env, c); + jmethodID j_le_coeff_ctr_id + = env->GetMethodID(j_le_coeff_class, + "", + "(Lparma_polyhedra_library/Coefficient;)V"); + return env->NewObject(j_le_coeff_class, j_le_coeff_ctr_id, + j_coeff); +} + +void +set_generator(JNIEnv* env, jobject& to_be_set, const jobject& gen) { + jclass j_generator_class + = env->FindClass("parma_polyhedra_library/Generator"); + jmethodID j_coeff_set_id + = env->GetMethodID(j_generator_class, "set", + "(Lparma_polyhedra_library/Generator;)V"); + env->CallVoidMethod(to_be_set, j_coeff_set_id, gen); +} + +void set_grid_generator(JNIEnv* env, jobject& to_be_set, + const jobject& gen) { + jclass j_generator_class + = env->FindClass("parma_polyhedra_library/Grid_Generator"); + jmethodID j_coeff_set_id + = env->GetMethodID(j_generator_class, "set", + "(Lparma_polyhedra_library/Grid_Generator;)V"); + env->CallVoidMethod(to_be_set, j_coeff_set_id, gen); +} + +void +set_coefficient(JNIEnv* env, jobject& to_be_set, + const jobject& c) { + jclass j_coeff_class + = env->FindClass("parma_polyhedra_library/Coefficient"); + jmethodID j_coeff_set_id + = env->GetMethodID(j_coeff_class, "set", + "(Lparma_polyhedra_library/Coefficient;)V"); + env->CallVoidMethod(to_be_set, j_coeff_set_id, c); +} + +void +set_by_reference(JNIEnv* env, jobject& by_ref_to_be_set, + const jobject& to_insert) { + jclass by_reference_class + = env->FindClass("parma_polyhedra_library/By_Reference"); + jfieldID obj_field_id = env->GetFieldID(by_reference_class, + "obj", + "Ljava/lang/Object;"); + env->SetObjectField(by_ref_to_be_set, obj_field_id, to_insert); +} + +jobject +get_by_reference(JNIEnv* env, const jobject& by_reference) { + jclass by_reference_class + = env->FindClass("parma_polyhedra_library/By_Reference"); + jfieldID obj_field_id = env->GetFieldID(by_reference_class, + "obj", + "Ljava/lang/Object;"); + return env->GetObjectField(by_reference, obj_field_id); +} + +void +set_pair_element(JNIEnv* env, jobject& pair_to_be_set, + int arg, const jobject& to_insert) { + jclass pair_class = env->FindClass("parma_polyhedra_library/Pair"); + switch (arg) { + case 0: + { + jfieldID obj_field_id = env->GetFieldID(pair_class, + "first", + "Ljava/lang/Object;"); + env->SetObjectField(pair_to_be_set, obj_field_id, to_insert); + return; + } + case 1: + { + jfieldID obj_field_id = env->GetFieldID(pair_class, + "second", + "Ljava/lang/Object;"); + env->SetObjectField(pair_to_be_set, obj_field_id, to_insert); + return; + } + default: + throw std::runtime_error("PPL Java interface internal error: pair value" + " not allowed"); + } +} + + +jobject +get_pair_element(JNIEnv* env, int arg, const jobject& j_pair) { + jclass pair_class = env->FindClass("parma_polyhedra_library/Pair"); + switch (arg) { + case 0: + { + jfieldID obj_field_id = env->GetFieldID(pair_class, + "first", + "Ljava/lang/Object;"); + return env->GetObjectField(j_pair, obj_field_id); + } + case 1: + { + jfieldID obj_field_id = env->GetFieldID(pair_class, + "second", + "Ljava/lang/Object;"); + return env->GetObjectField(j_pair, obj_field_id); + } + default: + throw std::runtime_error("PPL Java interface internal error: pair value" + " not allowed"); + } +} + +jboolean +is_null(JNIEnv* env, jobject obj) { + jclass by_reference_class + = env->FindClass("parma_polyhedra_library/By_Reference"); + jmethodID j_reference_is_null_id + = env->GetStaticMethodID(by_reference_class, + "is_null", + "(Ljava/lang/Object;)Z"); + return env->CallStaticBooleanMethod(by_reference_class, + j_reference_is_null_id, obj); +} + +jobject +build_java_constraint(JNIEnv* env, const Constraint& c) { + jclass j_constraint_class + = env->FindClass("parma_polyhedra_library/Constraint"); + jclass j_rel_sym_class + = env->FindClass("parma_polyhedra_library/Relation_Symbol"); + jmethodID j_constraint_ctr_id + = env->GetMethodID(j_constraint_class, + "", + "(Lparma_polyhedra_library/Linear_Expression;" + "Lparma_polyhedra_library/Relation_Symbol;" + "Lparma_polyhedra_library/Linear_Expression;)V"); + jfieldID rel_sym_eq_get_id + = env->GetStaticFieldID(j_rel_sym_class, + "EQUAL", + "Lparma_polyhedra_library/Relation_Symbol;"); + jfieldID rel_sym_gt_get_id + = env->GetStaticFieldID(j_rel_sym_class, + "GREATER_THAN", + "Lparma_polyhedra_library/Relation_Symbol;"); + jfieldID rel_sym_gtoeq_get_id + = env->GetStaticFieldID(j_rel_sym_class, + "GREATER_OR_EQUAL", + "Lparma_polyhedra_library/Relation_Symbol;"); + jobject lhs = build_linear_expression(env, c); + jobject rhs + = build_java_linear_expression_coefficient(env, -c.inhomogeneous_term()); + jobject relation; + switch (c.type()) { + case Constraint::EQUALITY: + relation = env->GetStaticObjectField(j_rel_sym_class, + rel_sym_eq_get_id); + break; + case Constraint::NONSTRICT_INEQUALITY: + relation = env->GetStaticObjectField(j_rel_sym_class, + rel_sym_gtoeq_get_id); + break; + case Constraint::STRICT_INEQUALITY: + relation = env->GetStaticObjectField(j_rel_sym_class, + rel_sym_gt_get_id); + break; + default: + throw std::runtime_error("PPL Java interface internal error"); + } + return env->NewObject(j_constraint_class,j_constraint_ctr_id, + lhs, relation, rhs); +} + +jobject +build_java_congruence(JNIEnv* env, const Congruence& cg) { + jclass j_congruence_class + = env->FindClass("parma_polyhedra_library/Congruence"); + jmethodID j_congruence_ctr_id + = env->GetMethodID(j_congruence_class, + "", + "(Lparma_polyhedra_library/Linear_Expression;" + "Lparma_polyhedra_library/Linear_Expression;" + "Lparma_polyhedra_library/Coefficient;)V"); + + jobject j_modulus = build_java_coeff(env, cg.modulus()); + jobject lhs = build_linear_expression(env, cg); + jobject rhs + = build_java_linear_expression_coefficient(env, -cg.inhomogeneous_term()); + return env->NewObject(j_congruence_class, j_congruence_ctr_id, + lhs, rhs, + j_modulus); +} + +jobject +build_java_generator(JNIEnv* env, const Generator& g) { + jclass j_generator_class + = env->FindClass("parma_polyhedra_library/Generator"); + jmethodID line_ctr_id + = env->GetStaticMethodID(j_generator_class, + "line", + "(Lparma_polyhedra_library/Linear_Expression;)" + "Lparma_polyhedra_library/Generator;"); + jmethodID ray_ctr_id + = env->GetStaticMethodID(j_generator_class, + "ray", + "(Lparma_polyhedra_library/Linear_Expression;)" + "Lparma_polyhedra_library/Generator;"); + jmethodID point_ctr_id + = env->GetStaticMethodID(j_generator_class, + "point", + "(Lparma_polyhedra_library/Linear_Expression;" + "Lparma_polyhedra_library/Coefficient;)" + "Lparma_polyhedra_library/Generator;"); + jmethodID closure_point_ctr_id + = env->GetStaticMethodID(j_generator_class, + "closure_point", + "(Lparma_polyhedra_library/Linear_Expression;" + "Lparma_polyhedra_library/Coefficient;)" + "Lparma_polyhedra_library/Generator;"); + jobject j_g_le = build_linear_expression(env, g); + jobject jcoeff = build_java_coeff(env, Coefficient(1)); + switch (g.type()) { + case Generator::LINE: + return env->CallStaticObjectMethod(j_generator_class, + line_ctr_id, j_g_le); + case Generator::RAY: + return env->CallStaticObjectMethod(j_generator_class, + ray_ctr_id, j_g_le); + case Generator::POINT: + { + const Coefficient& divisor = g.divisor(); + j_g_le = build_linear_expression(env, g); + jcoeff = build_java_coeff(env, divisor); + return env->CallStaticObjectMethod(j_generator_class, + point_ctr_id, j_g_le, jcoeff); + } + case Generator::CLOSURE_POINT: + { + const Coefficient& divisor = g.divisor(); + j_g_le = build_linear_expression(env, g); + jcoeff = build_java_coeff(env, divisor); + return env->CallStaticObjectMethod(j_generator_class, + closure_point_ctr_id, j_g_le, jcoeff); + } + default: + throw std::runtime_error("PPL Java interface internal error"); + } +} + +jobject +build_java_grid_generator(JNIEnv* env, const Grid_Generator& g) { + jclass j_grid_generator_class + = env->FindClass("parma_polyhedra_library/Grid_Generator"); + jmethodID line_ctr_id + = env->GetStaticMethodID(j_grid_generator_class, + "grid_line", + "(Lparma_polyhedra_library/Linear_Expression;)" + "Lparma_polyhedra_library/Grid_Generator;"); + jmethodID parameter_ctr_id + = env->GetStaticMethodID(j_grid_generator_class, + "parameter", + "(Lparma_polyhedra_library/Linear_Expression;" + "Lparma_polyhedra_library/Coefficient;)" + "Lparma_polyhedra_library/Grid_Generator;"); + jmethodID point_ctr_id + = env->GetStaticMethodID(j_grid_generator_class, + "grid_point", + "(Lparma_polyhedra_library/Linear_Expression;" + "Lparma_polyhedra_library/Coefficient;)" + "Lparma_polyhedra_library/Grid_Generator;"); + jobject j_g_le = build_linear_expression(env, g); + jobject jcoeff = build_java_coeff(env, Coefficient(1)); + switch (g.type()) { + case Grid_Generator::LINE: + return env->CallStaticObjectMethod(j_grid_generator_class, + line_ctr_id, j_g_le); + case Grid_Generator::PARAMETER: + { + const Coefficient& divisor = g.divisor(); + j_g_le = build_linear_expression(env, g); + jcoeff = build_java_coeff(env, divisor); + return env->CallStaticObjectMethod(j_grid_generator_class, + parameter_ctr_id, j_g_le, jcoeff); + } + case Grid_Generator::POINT: + { + const Coefficient& divisor = g.divisor(); + j_g_le = build_linear_expression(env, g); + jcoeff = build_java_coeff(env, divisor); + return env->CallStaticObjectMethod(j_grid_generator_class, + point_ctr_id, j_g_le, jcoeff); + } + default: + throw std::runtime_error("PPL Java interface internal error"); + } +} + +jobject +build_java_constraint_system(JNIEnv* env, const Constraint_System& cs) { + jclass j_cs_class + = env->FindClass("parma_polyhedra_library/Constraint_System"); + jmethodID j_cs_ctr_id = env->GetMethodID(j_cs_class, "", "()V"); + jmethodID j_cs_add_id = env->GetMethodID(j_cs_class, "add", + "(Ljava/lang/Object;)Z"); + jobject j_cs = env->NewObject(j_cs_class, j_cs_ctr_id); + 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, j_cs_add_id, j_constraint); + } + return j_cs; +} + +jobject +build_java_generator_system(JNIEnv* env, const Generator_System& gs) { + jclass j_gs_class + = env->FindClass("parma_polyhedra_library/Generator_System"); + jmethodID j_gs_ctr_id = env->GetMethodID(j_gs_class, "", "()V"); + jmethodID j_gs_add_id = env->GetMethodID(j_gs_class, "add", + "(Ljava/lang/Object;)Z"); + jobject j_gs = env->NewObject(j_gs_class, j_gs_ctr_id); + 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, j_gs_add_id, j_generator); + } + return j_gs; +} + +jobject +build_java_grid_generator_system(JNIEnv* env, + const Grid_Generator_System& gs) { + jclass j_gs_class + = env->FindClass("parma_polyhedra_library/Grid_Generator_System"); + jmethodID j_gs_ctr_id = env->GetMethodID(j_gs_class, "", "()V"); + jmethodID j_gs_add_id = env->GetMethodID(j_gs_class, "add", + "(Ljava/lang/Object;)Z"); + jobject j_gs = env->NewObject(j_gs_class, j_gs_ctr_id); + 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, j_gs_add_id, j_generator); + } + return j_gs; +} + +jobject +build_java_congruence_system(JNIEnv* env, const Congruence_System& cgs) { + jclass j_cgs_class + = env->FindClass("parma_polyhedra_library/Congruence_System"); + jmethodID j_cgs_ctr_id = env->GetMethodID(j_cgs_class, "", "()V"); + jmethodID j_cgs_add_id = env->GetMethodID(j_cgs_class, "add", + "(Ljava/lang/Object;)Z"); + jobject j_cgs = env->NewObject(j_cgs_class, j_cgs_ctr_id); + 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, j_cgs_add_id, j_congruence); + } + return j_cgs; +} + +} // 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..f88fe7e --- /dev/null +++ b/interfaces/Java/jni/ppl_java_common.defs.hh @@ -0,0 +1,497 @@ +/* Domain-independent part of the Java interface: declarations. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_ppl_java_common_defs_hh +#define PPL_ppl_java_common_defs_hh 1 + +#include "ppl.hh" +#include +#include "interfaced_boxes.hh" +#include "marked_pointers.hh" + +#define CATCH_ALL \ + 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 (...) { \ + handle_exception(env); \ + } + +namespace Parma_Polyhedra_Library { + +namespace Interfaces { + +namespace Java { + +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); + +/*! \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 +U +jtype_to_unsigned(const V& value); + +//! Builds a Java Boolean from C++ bool \p value. +jobject +bool_to_j_boolean(JNIEnv* env, const bool value); + +//! Returns the Java int stored in Java Integer \p j_integer. +jint +j_integer_to_j_int(JNIEnv* env, const jobject& j_integer); + +//! Builds a Java Integer from Java int \p value. +jobject +j_int_to_j_integer(JNIEnv* env, const jint& value); + +//! Returns the Java long stored in Java Long \p j_long. +jlong +j_long_class_to_j_long(JNIEnv* env, const jobject& j_long); + +//! Builds a Java Long from Java long \p value. +jobject +j_long_to_j_long_class(JNIEnv* env, const 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, const 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, const 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, const jobject& j_relsym); + +/*! \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, const 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, const 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, const 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 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 C++ Variable + from Java parma_polyhedra_library::Variable \p j_var. +*/ +Variable +build_cxx_variable(JNIEnv* env, const 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 + Builds a C++ Coefficient + from Java parma_polyhedra_library::Coefficient \p j_coeff. +*/ +Coefficient +build_cxx_coeff(JNIEnv* env, const 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, const jobject& j_constraint); + +/*! \brief + Builds a C++ Linear_Expression + from Java parma_polyhedra_library::Linear_Expression \p j_le. +*/ +Linear_Expression +build_cxx_linear_expression(JNIEnv* env, const jobject& j_le); + +/*! \brief + Builds a C++ Congruence + from Java parma_polyhedra_library::Congruence \p j_cg. +*/ +Congruence +build_cxx_congruence(JNIEnv* env, const jobject& j_cg); + +/*! \brief + Builds a C++ Generator + from Java parma_polyhedra_library::Generator \p j_g. +*/ +Generator +build_cxx_generator(JNIEnv* env, const 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, const 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, const 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, const jobject& j_cs); + +/*! \brief + Builds a C++ Generator_System + from Java parma_polyhedra_library::Generator_System \p j_gs. +*/ +Generator_System +build_cxx_generator_system(JNIEnv* env, const 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, const 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::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::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 reference \p to_be_set + to the parma_polyhedra_library::Generator object \p gen. +*/ +void +set_generator(JNIEnv* env, jobject& to_be_set, + const jobject& gen); + +/*! \brief + Sets Java reference \p to_be_set + to the parma_polyhedra_library::Grid_Generator object \p g_gen. +*/ +void +set_grid_generator(JNIEnv* env, jobject& to_be_set, + const jobject& g_gen); + +/*! \brief + Sets Java reference \p to_be_set + to the parma_polyhedra_library::Coefficient object \p c. +*/ +void +set_coefficient(JNIEnv* env, jobject& to_be_set, + const jobject& c); + +/*! \brief + Modifies parma_polyhedra_library::By_Reference object \p by_ref_to_be_set + so that it references object \p to_insert. +*/ +void +set_by_reference(JNIEnv* env, jobject& by_ref_to_be_set, + const jobject& to_insert); + +/*! \brief + Returns the object referenced by + parma_polyhedra_library::By_Reference object \p by_reference. +*/ +jobject +get_by_reference(JNIEnv* env, const jobject& by_reference); + + +/*! \brief + Assigns \p obj_to_insert to one of the fields of + parma_polyhedra_library::Pair object \p pair_to_be_set. + + If \p arg is 0, the first element of \p pair_to_be_set is overwritten; + if \p arg is 1, the second element of \p pair_to_be_set is overwritten. + + \exception std::runtime_error + Thrown if \p arg is neither 0 nor 1. +*/ +void +set_pair_element(JNIEnv* env, jobject& pair_to_be_set, int arg, + const jobject& obj_to_insert); + +/*! \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, const jobject& pair); + +//! Returns \c true if and only if \p obj is a null Java reference. +jboolean is_null(JNIEnv* env, jobject obj); + +//! Returns a pointer to the C++ object wrapped by \p ppl_object. +void* +get_ptr(JNIEnv* env, const jobject& ppl_object); + +//! Sets the pointer of the underlying C++ object in the Java object. +template +void +set_ptr(JNIEnv* env, const jobject& ppl_object, + const T* address, bool to_be_marked = false); + +/*! \brief + Builds a Java parma_polyhedra_library::Linar_Expression + from the C++ constraint/congruence \p r. +*/ +template +jobject +build_linear_expression(JNIEnv* env, const R& r); + +//! A C++ wrapper for Java parma_polyhedra_library::Partial_Function. +class Partial_Function { +public: + //! Constructor. + Partial_Function(jobject j_p_func, JNIEnv* env); + + /*! \brief + Returns \c true if and only if the 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 + Sets \p j to the value (if any) of the partial function on index \p i. + */ + bool maps(dimension_type i, dimension_type& j) const; + +private: + //! The Java parma_polyhedra_library::Partial_Function object. + jobject j_p_func; + + //! The JNI environment pointer. + JNIEnv* env; +}; + +} // 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..ae1194c --- /dev/null +++ b/interfaces/Java/jni/ppl_java_common.inlines.hh @@ -0,0 +1,202 @@ +/* Domain-independent part of the Java interface: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_ppl_java_common_inlines_hh +#define PPL_ppl_java_common_inlines_hh 1 + +#include + +namespace Parma_Polyhedra_Library { + +namespace Interfaces { + +namespace Java { + +template +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(std::numeric_limits::max())) + throw std::invalid_argument("unsigned integer out of range."); + } + + return value; +} + +template +void +set_ptr(JNIEnv* env, const jobject& ppl_object, + const T* address, bool to_be_marked) { + jclass ppl_object_class = env->GetObjectClass(ppl_object); + jfieldID pointer_field = env->GetFieldID(ppl_object_class, "ptr","J"); + const T* ptr = (to_be_marked ? mark(address) : address); + jlong pointer_value = reinterpret_cast(ptr); + assert(reinterpret_cast(pointer_value) == ptr); + env->SetLongField(ppl_object, pointer_field, pointer_value); +} + +template +jobject +build_linear_expression(JNIEnv* env, const R& r) { + jclass j_le_coeff_class + = env->FindClass("parma_polyhedra_library/Linear_Expression_Coefficient"); + jclass j_le_class + = env->FindClass("parma_polyhedra_library/Linear_Expression"); + jclass j_le_variable_class + = env->FindClass("parma_polyhedra_library/Linear_Expression_Variable"); + jclass j_variable_class + = env->FindClass("parma_polyhedra_library/Variable"); + PPL_DIRTY_TEMP_COEFFICIENT(coefficient); + dimension_type varid = 0; + dimension_type space_dimension = r.space_dimension(); + jobject j_le_term; + jmethodID j_variable_ctr_id + = env->GetMethodID(j_variable_class, + "", + "(I)V"); + jmethodID j_le_variable_ctr_id + = env->GetMethodID(j_le_variable_class, + "", + "(Lparma_polyhedra_library/Variable;)V"); + + jmethodID j_le_times_id + = env->GetMethodID(j_le_class, + "times", + "(Lparma_polyhedra_library/Coefficient;)Lparma_polyhedra_library/Linear_Expression;"); + + 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)); + jmethodID j_le_coeff_ctr_id + = env->GetMethodID(j_le_coeff_class, "", + "(Lparma_polyhedra_library/Coefficient;)V"); + return env->NewObject(j_le_coeff_class, j_le_coeff_ctr_id, + j_coefficient_zero); + } + else { + jobject j_coefficient = build_java_coeff(env, coefficient); + jobject j_variable = env->NewObject(j_variable_class, j_variable_ctr_id, + varid); + jobject j_le_variable = env->NewObject(j_le_variable_class, + j_le_variable_ctr_id, + j_variable); + j_le_term = env->CallObjectMethod(j_le_variable, + j_le_times_id, j_coefficient); + 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 = env->NewObject(j_variable_class, + j_variable_ctr_id, + varid); + j_le_variable = env->NewObject(j_le_variable_class, + j_le_variable_ctr_id, + j_variable); + jobject j_le_term2 = env->CallObjectMethod(j_le_variable, + j_le_times_id, + j_coefficient); + jmethodID j_le_sum_id + = env->GetMethodID(j_le_class, + "sum", + "(Lparma_polyhedra_library/Linear_Expression;)" + "Lparma_polyhedra_library/Linear_Expression;"); + j_le_term = env->CallObjectMethod(j_le_term, j_le_sum_id, j_le_term2); + } + } + } + return j_le_term; +} + +inline +Partial_Function::Partial_Function(jobject j_p_func, JNIEnv* env) + : j_p_func(j_p_func), + env(env) { +} + +inline bool +Partial_Function::has_empty_codomain() const { + jclass j_partial_function_class + = env->FindClass("parma_polyhedra_library/Partial_Function"); + jmethodID j_has_empty_codomain_id + = env->GetMethodID(j_partial_function_class, + "has_empty_codomain", + "()Z"); + return env->CallBooleanMethod(j_p_func, j_has_empty_codomain_id); +} + +inline dimension_type +Partial_Function::max_in_codomain() const { + jclass j_partial_function_class + = env->FindClass("parma_polyhedra_library/Partial_Function"); + jmethodID j_max_in_codomain_id + = env->GetMethodID(j_partial_function_class, + "max_in_codomain", + "()J"); + jlong value = env->CallLongMethod(j_p_func, j_max_in_codomain_id); + return jtype_to_unsigned(value); +} + +inline bool +Partial_Function::maps(dimension_type i, dimension_type& j) const { + jclass j_partial_function_class + = env->FindClass("parma_polyhedra_library/Partial_Function"); + jclass j_by_reference_class + = env->FindClass("parma_polyhedra_library/By_Reference"); + jmethodID j_by_reference_ctr_id + = env->GetMethodID(j_by_reference_class, + "", + "(Ljava/lang/Object;)V"); + jobject coeff = j_long_to_j_long_class(env, 0); + jobject new_by_ref = env->NewObject(j_by_reference_class, + j_by_reference_ctr_id, + coeff); + jmethodID j_maps_id = env->GetMethodID(j_partial_function_class, + "maps", + "(Ljava/lang/Long;Lparma_polyhedra_library/By_Reference;)Z"); + if (env->CallBooleanMethod(j_p_func, j_maps_id, + j_long_to_j_long_class(env, i), + new_by_ref)) { + jobject long_value = get_by_reference(env, new_by_ref); + j = jtype_to_unsigned(j_long_class_to_j_long(env, + long_value)); + return true; + } + return false; +} + +} // 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..f7295f9 --- /dev/null +++ b/interfaces/Java/jni/ppl_java_globals.cc @@ -0,0 +1,737 @@ +/* PPL Java interface: domain-independent functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "parma_polyhedra_library_Parma_Polyhedra_Library.h" +#include "ppl_java_common.defs.hh" +#include "parma_polyhedra_library_MIP_Problem.h" +#include "parma_polyhedra_library_Linear_Expression.h" +#include "parma_polyhedra_library_Constraint.h" +#include "parma_polyhedra_library_Constraint_System.h" +#include "parma_polyhedra_library_Congruence.h" +#include "parma_polyhedra_library_Congruence_System.h" +#include "parma_polyhedra_library_Generator.h" +#include "parma_polyhedra_library_Generator_System.h" +#include "parma_polyhedra_library_Grid_Generator.h" +#include "parma_polyhedra_library_Grid_Generator_System.h" +#include "parma_polyhedra_library_IO.h" + +using namespace Parma_Polyhedra_Library; +using namespace Parma_Polyhedra_Library::Interfaces::Java; + +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) { + return env->NewStringUTF(version()); +} + +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 jlong JNICALL +Java_parma_1polyhedra_1library_MIP_1Problem_max_1space_1dimension +(JNIEnv* env , jobject j_this_mip_problem) { + try { + MIP_Problem* mip + = reinterpret_cast(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(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(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 { + jclass j_le_coeff_class + = env->FindClass("parma_polyhedra_library/Linear_Expression_Coefficient"); + jclass j_le_class + = env->FindClass("parma_polyhedra_library/Linear_Expression"); + jmethodID j_le_sum_id + = env->GetMethodID(j_le_class, + "sum", + "(Lparma_polyhedra_library/Linear_Expression;)" + "Lparma_polyhedra_library/Linear_Expression;"); + jmethodID j_le_coeff_ctr_id + = env->GetMethodID(j_le_coeff_class, "", + "(Lparma_polyhedra_library/Coefficient;)V"); + + MIP_Problem* mip + = reinterpret_cast(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(j_le_coeff_class, j_le_coeff_ctr_id, + j_coeff_inhomogeneous_term); + + jobject j_le = build_linear_expression(env, mip->objective_function()); + return env->CallObjectMethod(j_le, j_le_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(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(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(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 { + jclass j_cs_class + = env->FindClass("parma_polyhedra_library/Constraint_System"); + jmethodID j_cs_ctr_id = env->GetMethodID(j_cs_class, "", "()V"); + jmethodID j_cs_add_id = env->GetMethodID(j_cs_class, "add", + "(Ljava/lang/Object;)Z"); + jobject j_cs = env->NewObject(j_cs_class, j_cs_ctr_id); + + MIP_Problem* mip + = reinterpret_cast(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, j_cs_add_id, j_constraint); + } + 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(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(get_ptr(env, j_this_mip_problem)); + dimension_type ppl_dim = jtype_to_unsigned(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(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(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(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(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(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(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(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(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); + num = build_cxx_coeff(env, j_coeff_num); + den = build_cxx_coeff(env, j_coeff_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(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(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(get_ptr(env, j_this_mip_problem)); + mip->optimal_value(coeff_num, coeff_den); + jobject j_coeff_num_result = build_java_coeff(env, coeff_num); + jobject j_coeff_den_result = build_java_coeff(env, coeff_den); + set_coefficient(env, j_coeff_num, j_coeff_num_result); + set_coefficient(env, j_coeff_den, j_coeff_den_result); + } + 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(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(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(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(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(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(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(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(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(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_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(indent_depth); + unsigned pfll = jtype_to_unsigned(preferred_first_line_length); + unsigned pll = jtype_to_unsigned(preferred_line_length); + const char* chars = env->GetStringUTFChars(str, 0); + if (!chars) + return 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; +} 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..dda3f27 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/By_Reference.java @@ -0,0 +1,52 @@ +/* By_Reference Java class declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +package parma_polyhedra_library; + +//! An utility class implementing mutable and non-mutable call-by-reference. +/*! \ingroup PPL_Java_interface */ +public class By_Reference { + //! 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; + } + + // FIXME: this must be moved in another place. + static boolean is_null(java.lang.Object obj) { + if (obj == null) + return true; + return false; + } +} diff --git a/interfaces/Java/parma_polyhedra_library/Coefficient.java b/interfaces/Java/parma_polyhedra_library/Coefficient.java new file mode 100644 index 0000000..e64c8a9 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Coefficient.java @@ -0,0 +1,75 @@ +/* Coefficient Java class declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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 values \p i. + public Coefficient(int i) { + value = new BigInteger(Integer.toString(i)); + } + + //! Builds a coefficient valued \p l. + public Coefficient(long l) { + value = new BigInteger(Long.toString(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 = new BigInteger(c.value.toString()); + } + + //! Returns the value held by \p this. + public BigInteger getBigInteger() { + return value; + } + + private void set(Coefficient c) { + value = c.getBigInteger(); + } +} 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..3351a66 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Complexity_Class.java @@ -0,0 +1,34 @@ +/* Complexity_Class enum declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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 +} diff --git a/interfaces/Java/parma_polyhedra_library/Congruence.java b/interfaces/Java/parma_polyhedra_library/Congruence.java new file mode 100644 index 0000000..96dea90 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Congruence.java @@ -0,0 +1,68 @@ +/* Congruence Java class declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +package parma_polyhedra_library; + +import java.io.Writer; +import java.io.IOException; + +//! 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 modulus; + + //! 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) { + modulus = new Coefficient(m); + lhs = e1.clone(); + rhs = e2.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(); +} 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..2ec1d71 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Congruence_System.java @@ -0,0 +1,43 @@ +/* Congruence_System Java class declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +package parma_polyhedra_library; + +import java.io.Writer; +import java.io.IOException; + +//! 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.Vector { + //! 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(); +} diff --git a/interfaces/Java/parma_polyhedra_library/Constraint.java b/interfaces/Java/parma_polyhedra_library/Constraint.java new file mode 100644 index 0000000..f803506 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Constraint.java @@ -0,0 +1,77 @@ +/* Constraint Java class declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +package parma_polyhedra_library; + +import java.io.Writer; +import java.io.IOException; + +//! 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(); +} 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..f053754 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Constraint_System.java @@ -0,0 +1,44 @@ +/* Constraint_System Java class declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +package parma_polyhedra_library; + +import java.io.Writer; +import java.io.IOException; + +//! 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.Vector { + + //! 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(); +} 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..d953de8 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java @@ -0,0 +1,30 @@ +/* MIP_Problem Control_Parameter_Name enum declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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..222fc95 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.java @@ -0,0 +1,34 @@ +/* MIP_Problem's Control_Parameter_Value enum declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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..6915321 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Degenerate_Element.java @@ -0,0 +1,32 @@ +/* Degenerate_Element enum declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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 +} 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..62a33a3 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java @@ -0,0 +1,32 @@ +/* Domain_Error_Exception Java class declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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..6abf7ef --- /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-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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 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 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 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 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 x == y, + then x.hash_code() == y.hash_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 to_be_unconstrained, + assigning the result to \p this. + + \param to_be_unconstrained + 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 to_be_removed. + */ + public native void + unconstrain_space_dimensions(Variables_Set to_be_unconstrained); + + /*! \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 must 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 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 max_space_dimension(). + */ + 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 max_space_dimension(). + */ + 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 max_space_dimension(). + */ + public native void concatenate_assign(Polyhedron y); + + //! Removes all the specified dimensions from the vector space. + /*! + \param to_be_removed + The set of Variable objects corresponding to the space dimensions + to be removed. + + \exception Invalid_Argument_Exception + Thrown if \p this is dimension-incompatible with one of the + Variable objects contained in \p to_be_removed. + */ + public native void remove_space_dimensions(Variables_Set to_be_removed); + + /*! \brief + Removes the higher dimensions of the vector space so that + the resulting space will have dimension \p new_dimension. + + \exception 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 max_space_dimension(). + */ + public native void expand_space_dimension(Variable var, long m); + + //! Folds the space dimensions in \p to_be_folded into \p var. + /*! + \param to_be_folded + The set of Variable objects corresponding to the space dimensions + to be folded; + + \param var + The variable corresponding to the space dimension that is the + destination of the folding operation. + + \exception Invalid_Argument_Exception + Thrown if \p this is dimension-incompatible with \p var or with + one of the Variable objects contained in \p to_be_folded. + Also thrown if \p var is contained in \p to_be_folded. + */ + public native void fold_space_dimensions(Variables_Set to_be_folded, + Variable var); + + /*! \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 must 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 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 must 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 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 must 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 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 must 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 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 must 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 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 must 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 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., Grid(C_Polyhedron y), + C_Polyhedron(BD_Shape_mpq_class y), 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 + - r.first is the intersection of \p p and \p q; + - r.second has the property that all its elements are + pairwise disjoint and disjoint from \p p; + - the set-theoretical union of r.first with all the + elements of r.second gives \p q (i.e., r + is the representation of a partition of \p q). + */ + public static native + Pair + 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..19189ba --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Generator.java @@ -0,0 +1,141 @@ +/* Generator Java class declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +package parma_polyhedra_library; + +import java.io.Writer; +import java.io.IOException; + +import java.util.*; +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 denominator used if the generator is a point or a clousure point. + private Coefficient den; + + //! The generator type. + private Generator_Type gt; + + //! The linear expression. + private Linear_Expression le; + + /*! \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 c) { + if (c.getBigInteger().equals(java.math.BigInteger.ZERO)) { + Error cause = new Error("parma_polyhedra_library.Generator::" + + "Generator(le, c):\n" + + "the divisor can not be zero."); + throw new RuntimeErrorException(cause); + } + + Generator g = new Generator(e, Generator_Type.CLOSURE_POINT); + g.den = c; + 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 le) { + return new Generator(le, 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 le, Coefficient d) { + if (d.getBigInteger().equals(java.math.BigInteger.ZERO)) { + Error cause = new Error("parma_polyhedra_library.Generator::" + + "Generator(le, d):\n" + + "the divisor can not be zero."); + throw new RuntimeErrorException(cause); + } + + Generator g = new Generator(le, Generator_Type.POINT); + g.den = 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 le) { + return new Generator(le, Generator_Type.RAY); + } + + //! 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 den; + Error cause = new Error("parma_polyhedra_library.Generator::divisor:\n" + + "this is neither a point" + + " nor a closure point."); + throw new RuntimeErrorException(cause); + } + + //! Allows to copy the fields from \p g to \p this. + private void set(Generator g) { + this.le = g.le; + this.gt = g.gt; + } + + //! 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(); +} 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..f3c292e --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Generator_System.java @@ -0,0 +1,45 @@ +/* Generator_System Java class declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +package parma_polyhedra_library; + +import java.io.Writer; +import java.io.IOException; + +//! 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.Vector { + + //! 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(); +} 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..0b16691 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Generator_Type.java @@ -0,0 +1,36 @@ +/* Generator_Type enum declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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 +} 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..404f4b8 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Grid_Generator.java @@ -0,0 +1,101 @@ +/* Grid Generator Java class declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + + +package parma_polyhedra_library; + + +import java.io.Writer; +import java.io.IOException; + +//! 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 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 coeff; + + //! The grid generator type. + private Grid_Generator_Type gt; + + private Grid_Generator(Linear_Expression e, Coefficient c, + Grid_Generator_Type generator_type) { + le = e.clone(); + coeff = new Coefficient(c); + 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 of direction \p e and size \p e/d. + /*! + Both \p e and \p d are optional arguments, with default values + Linear_Expression::zero() and Coefficient_one(), respectively. + + \exception RuntimeErrorException + Thrown if \p d is zero. + */ + public static Grid_Generator parameter(Linear_Expression e, + Coefficient c) { + return new Grid_Generator(e, c, Grid_Generator_Type.PARAMETER); + } + + //! 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 RuntimeErrorException + Thrown if \p d is zero. + */ + public static Grid_Generator grid_point(Linear_Expression e, + Coefficient c) { + return new Grid_Generator(e, c, Grid_Generator_Type.POINT); + } + + //! 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(); +} + 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..c219be6 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java @@ -0,0 +1,45 @@ +/* Grid Generator_System Java class declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + + +package parma_polyhedra_library; + +import java.io.Writer; +import java.io.IOException; + +//! 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.Vector { + + //! 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(); +} 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..4ccae86 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java @@ -0,0 +1,34 @@ +/* Grid_Generator_Type enum declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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 +} diff --git a/interfaces/Java/parma_polyhedra_library/IO.java b/interfaces/Java/parma_polyhedra_library/IO.java new file mode 100644 index 0000000..1b83922 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/IO.java @@ -0,0 +1,47 @@ +/* IO Java class declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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..b11d557 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.java @@ -0,0 +1,33 @@ +/* Invalid_Argument_Exception Java class declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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..982dc43 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java @@ -0,0 +1,32 @@ +/* Length_Error_Exception Java class declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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..4d0e158 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Linear_Expression.java @@ -0,0 +1,65 @@ +/* Linear_Expression Java declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +package parma_polyhedra_library; + +import java.io.Writer; +import java.io.IOException; + +//! 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(); +} 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..17f7707 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficient.java @@ -0,0 +1,48 @@ +/* Linear_Expression_Coefficient class definition and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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(new Coefficient(coeff)); + } +} + 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..8127e88 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Difference.java @@ -0,0 +1,60 @@ +/* Linear_Expression_Difference class definition and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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.clone(), rhs.clone()); + } +} 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..9741d9c --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java @@ -0,0 +1,56 @@ +/* Linear_Expression_Sum class definition and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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.clone(), rhs.clone()); + } +} 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..81e4467 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.java @@ -0,0 +1,57 @@ +/* Linear_Expression_Times class definition and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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 left hand side of \p this. + protected Linear_Expression_Coefficient lhs; + + //! The value of the left hand side of \p this. + protected Linear_Expression rhs; + + //! Builds an object cloning the input arguments. + public Linear_Expression_Times(Linear_Expression l, Coefficient c) { + lhs = new Linear_Expression_Coefficient(new Coefficient(c)); + rhs = l.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_Times clone() { + return new Linear_Expression_Times(rhs.clone(), + new Coefficient(lhs.argument())); + } +} 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..e384265 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Minus.java @@ -0,0 +1,49 @@ +/* Linear_Expression_Unary_Minus class definition and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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.clone()); + } + +} + 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..63c1d1b --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.java @@ -0,0 +1,47 @@ +/* Linear_Expression_Variable class definition and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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(new Variable(arg.id())); + } +} + 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..b2dcece --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java @@ -0,0 +1,36 @@ +/* Logic_Error_Exception Java class declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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..80e6dcc --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/MIP_Problem.java @@ -0,0 +1,324 @@ +/* MIP_Problem Java class declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + + +package parma_polyhedra_library; + +import java.io.Writer; +import java.io.IOException; + +//! 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 std::length_error + Thrown if \p dim exceeds max_space_dimension(). + */ + 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 std::length_error + Thrown if \p dim exceeds max_space_dimension(). + + \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. + */ + 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 std::length_error + Thrown if adding \p m new space dimensions would cause the + vector space to exceed dimension max_space_dimension(). + + 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 std::invalid_argument + 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 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. + */ + public native void add_constraint(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. + */ + public native void add_constraints(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. + */ + 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 + true 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 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. + */ + public native void evaluate_objective_function(Generator evaluating_point, + Coefficient num, + Coefficient den); + + //! Returns a feasible point for \p *this, if it exists. + /*! + \exception std::domain_error + Thrown if the MIP problem is not satisfiable. + */ + public native Generator feasible_point(); + + //! Returns an optimal point for \p this, if it exists. + /*! + \exception std::domain_error + Thrown if \p this doesn't not have an optimizing point, i.e., + if the 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 std::domain_error + 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..59bf138 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java @@ -0,0 +1,34 @@ +/* MIP_Problem_Status enum declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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 +} diff --git a/interfaces/Java/parma_polyhedra_library/Makefile.am b/interfaces/Java/parma_polyhedra_library/Makefile.am new file mode 100644 index 0000000..7153d7c --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Makefile.am @@ -0,0 +1,207 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +JAVAROOT = ../ + +required_instantiations_java_sources = \ +@required_instantiations_java_sources@ + +required_instantiations_java_cxx_headers = \ +@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.Congruence \ +parma_polyhedra_library.Congruence_System \ +parma_polyhedra_library.Constraint \ +parma_polyhedra_library.Constraint_System \ +parma_polyhedra_library.Generator \ +parma_polyhedra_library.Generator_System \ +parma_polyhedra_library.Grid_Generator \ +parma_polyhedra_library.Grid_Generator_System \ +parma_polyhedra_library.IO \ +parma_polyhedra_library.Linear_Expression \ +parma_polyhedra_library.MIP_Problem \ +parma_polyhedra_library.Parma_Polyhedra_Library + +fixed_java_cxx_headers_sources = \ +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_Generator.h \ +parma_polyhedra_library_Generator_System.h \ +parma_polyhedra_library_Grid_Generator.h \ +parma_polyhedra_library_Grid_Generator_System.h \ +parma_polyhedra_library_IO.h \ +parma_polyhedra_library_Linear_Expression.h \ +parma_polyhedra_library_MIP_Problem.h \ +parma_polyhedra_library_Parma_Polyhedra_Library.h + +# NOTE: do _NOT_ add Fake_Class_for_Doxygen.java to this list. +fixed_java_sources = \ +$(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)/Poly_Con_Relation.java \ +$(srcdir)/Poly_Gen_Relation.java \ +$(srcdir)/PPL_Object.java \ +$(srcdir)/Relation_Symbol.java \ +$(srcdir)/Variable.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) + +# 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 = \ +$(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 \ +$(interface_generator_files) + +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 + +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 \ +By_Reference.class \ +Coefficient.class \ +Congruence.class \ +Complexity_Class.class \ +Congruence_System.class \ +Constraint.class \ +Constraint_System.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 \ +PPL_Object.class \ +Parma_Polyhedra_Library.class \ +Pair.class \ +Partial_Function.class \ +Poly_Con_Relation.class \ +Poly_Gen_Relation.class \ +Relation_Symbol.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..eeb223f --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Makefile.in @@ -0,0 +1,633 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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.am $(srcdir)/Makefile.in +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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +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.Congruence \ +parma_polyhedra_library.Congruence_System \ +parma_polyhedra_library.Constraint \ +parma_polyhedra_library.Constraint_System \ +parma_polyhedra_library.Generator \ +parma_polyhedra_library.Generator_System \ +parma_polyhedra_library.Grid_Generator \ +parma_polyhedra_library.Grid_Generator_System \ +parma_polyhedra_library.IO \ +parma_polyhedra_library.Linear_Expression \ +parma_polyhedra_library.MIP_Problem \ +parma_polyhedra_library.Parma_Polyhedra_Library + +fixed_java_cxx_headers_sources = \ +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_Generator.h \ +parma_polyhedra_library_Generator_System.h \ +parma_polyhedra_library_Grid_Generator.h \ +parma_polyhedra_library_Grid_Generator_System.h \ +parma_polyhedra_library_IO.h \ +parma_polyhedra_library_Linear_Expression.h \ +parma_polyhedra_library_MIP_Problem.h \ +parma_polyhedra_library_Parma_Polyhedra_Library.h + + +# NOTE: do _NOT_ add Fake_Class_for_Doxygen.java to this list. +fixed_java_sources = \ +$(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)/Poly_Con_Relation.java \ +$(srcdir)/Poly_Gen_Relation.java \ +$(srcdir)/PPL_Object.java \ +$(srcdir)/Relation_Symbol.java \ +$(srcdir)/Variable.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) + + +# 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 = \ +$(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 \ +$(interface_generator_files) + +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 \ +By_Reference.class \ +Coefficient.class \ +Congruence.class \ +Complexity_Class.class \ +Congruence_System.class \ +Constraint.class \ +Constraint_System.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 \ +PPL_Object.class \ +Parma_Polyhedra_Library.class \ +Pair.class \ +Partial_Function.class \ +Poly_Con_Relation.class \ +Poly_Gen_Relation.class \ +Relation_Symbol.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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Java/parma_polyhedra_library/Makefile'; \ + 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 + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -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 + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +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 + +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 \ + 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 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 + +$(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..9c58eea --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Optimization_Mode.java @@ -0,0 +1,32 @@ +/* Optimization_Mode enum declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +package parma_polyhedra_library; + +//! Possible optimization modes. +/*! \ingroup PPL_Java_interface */ +public enum Optimization_Mode { + //! Minimization is requested. + MINIMIZATION, + //! Maximization is requested. + MAXIMIZATION +} 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..0e5cde3 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.java @@ -0,0 +1,35 @@ +/* Overflow_Error_Exception Java class declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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/PPL_Object.java b/interfaces/Java/parma_polyhedra_library/PPL_Object.java new file mode 100644 index 0000000..93c3932 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/PPL_Object.java @@ -0,0 +1,40 @@ +/* PPL_Object Java class declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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; + } +} diff --git a/interfaces/Java/parma_polyhedra_library/Pair.java b/interfaces/Java/parma_polyhedra_library/Pair.java new file mode 100644 index 0000000..649d3f9 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Pair.java @@ -0,0 +1,46 @@ +/* Pair Java class declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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 { + + //! 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; + } +} 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..7dc0bcf --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.java @@ -0,0 +1,184 @@ +/* Parma_Polyhedra_Library Java class declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +/*! + \defgroup 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, \c prefix is the path prefix under which + the library has been installed (typically \c /usr or \c /usr/local). + +

Overview

+ + Here is a list of notes with general information and advice + on the use of the Java interface. + + - The numerical abstract domains available to the Java user as + Java classes consist of the simple domains, + powersets of a simple domain and products + 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 + --enable-instantiations). + - The simple domains are: + - convex polyhedra, which consist of C_Polyhedron and + NNC_Polyhedron;
+ - 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;
+ - 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
+ - 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 domain + and any element of a PPL domain is called a PPL object. + - The Java interface files are all installed in the directory + \c prefix/lib/ppl. 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 man ld.so and man ldconfig + for more information. + - 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. + - Any application using the PPL should make sure that only the + intended version(s) of the library are ever used. + - 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 --enable-interfaces). + 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 --with-java if you need to + specify a non-standard location for the Java system). + +*/ /* \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 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 (Re-) Setting floating-point rounding mode. + //@{ + + /*! \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(); + + //@} // (Re-) Setting floating-point rounding mode. + +} 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..76ce2ba --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Partial_Function.java @@ -0,0 +1,59 @@ +/* Partial_Function Java interface declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +package parma_polyhedra_library; + +//! A partial function on space dimension indices. +/*! \ingroup PPL_Java_interface + In order to specify how space dimensions should be mapped by methods + named \c map_space_dimensions, the user should implement this + interface. + + \note + An example of implementation can be found in the PPL test file + interfaces/Java/tests/Test_Partial_Function.java. +*/ +public interface Partial_Function { + /*! \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. + */ + boolean has_empty_codomain(); + + /*! \brief + Returns the maximum value that belongs to the codomain + of the partial function. + */ + long max_in_codomain(); + + /*! \brief + Sets \p j to the value (if any) of the partial function on index \p i. + + The function returns \c true if and only if the partial function + is defined on domain value \p i. + */ + boolean maps(Long i, By_Reference j); +} 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..3a4dbd7 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java @@ -0,0 +1,87 @@ +/* Poly_Con_Relation Java class declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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; + } +} 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..5225b36 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java @@ -0,0 +1,57 @@ +/* Poly_Gen_Relation Java class declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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; + } +} 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..f5aa187 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Relation_Symbol.java @@ -0,0 +1,38 @@ +/* Relation_Symbol enum declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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 +} diff --git a/interfaces/Java/parma_polyhedra_library/Variable.java b/interfaces/Java/parma_polyhedra_library/Variable.java new file mode 100644 index 0000000..c73cddb --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Variable.java @@ -0,0 +1,69 @@ +/* Variable Java class declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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 { + //! The index of the Cartesian axis. + private int varid; + + //! Builds the variable corresponding to the Cartesian axis of index \p i. + /*! + \exception RuntimeErrorException + Thrown if i is has negative value. + */ + public Variable(int 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 int id() { + return varid; + } + + /*! \brief + Returns a negative number if \p this comes first than \p v, + a zero if \p this equals \p v, a positive number if + if \p this comes first than \p v. + */ + public int compareTo(Variable v) { + return varid - v.varid; + } +} 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..8360bb7 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/Variables_Set.java @@ -0,0 +1,31 @@ +/* Variables_Set Java class declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +package parma_polyhedra_library; + +//! A java.util.TreeSet of variables' indexes. +public class Variables_Set extends java.util.TreeSet{ + + //! Builds the empty set of variable indexes. + public Variables_Set() { + } +} 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..9590a14 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4 @@ -0,0 +1,145 @@ +m4_define(`dnl', `m4_dnl')`'dnl +m4_divert(-1) + +dnl This m4 file generates the files .java +dnl using the code in ppl_interface_generator_java_classes_java_code.m4. + +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/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)') + +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 +%<--%<--%<-- m4_this_class`'.java +/* PPL Java interface: m4_this_class definition. +m4_include(`ppl_interface_generator_copyright')`'dnl +*/ + +package parma_polyhedra_library; + +import java.io.Writer; +import java.io.IOException; + +/*! \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, + ` +%<--%<--%<-- C_Polyhedron.java +/* 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 { +%<--%<--%<-- NNC_Polyhedron.java +/* 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, +` +%<--%<--%<-- m4_this_class`'_Iterator.java +/* 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') +%<--%<--%<-- m4_this_class`'.java +}`'dnl +m4_ifelse(m4_this_class, Polyhedron, + ` +%<--%<--%<-- C_Polyhedron.java +} + +%<--%<--%<-- NNC_Polyhedron.java +} +', +m4_this_class_kind, Pointset_Powerset, + ` +%<--%<--%<-- m4_this_class`'_Iterator.java +}`'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 +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..f7bcea1 --- /dev/null +++ b/interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4 @@ -0,0 +1,573 @@ +dnl -*- java -*- +m4_divert(-1) + +This m4 file contains the code for generating files .java + +Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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_@CLASS@_@WIDEN@_widening_assign_with_tokens_code', `') +m4_define(`ppl_@CLASS@_widening_assign_with_tokens_code', `') +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_with_tokens_code', `') +m4_define(`ppl_@CLASS@_@LIMITEDBOUNDED@_@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 +%<--%<--%<-- @TOPOLOGY@@CLASS@.java + private native void build_cpp_object(@!BUILD_REPRESENT@_System cs); + +') + +m4_define(`m4_class_build_cpp_object2_code', +`dnl +%<--%<--%<-- @TOPOLOGY@@CLASS@.java + private native void build_cpp_object(long num_dimensions, + Degenerate_Element kind); + +') + +m4_define(`m4_class_build_cpp_object3_code', +`dnl +%<--%<--%<-- @TOPOLOGY@@CLASS@.java + private native void build_cpp_object(@FRIEND@ y); + +%<--%<--%<-- @TOPOLOGY@@CLASS@.java + private native void build_cpp_object(@FRIEND@ y, + Complexity_Class complexity); + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension_code', +`dnl +%<--%<--%<-- @TOPOLOGY@@CLASS@.java + public @TOPOLOGY@@CLASS@(long num_dimensions, + Degenerate_Element kind) { + build_cpp_object(num_dimensions, kind); + } + + private @TOPOLOGY@@CLASS@() { + } + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_code', +`dnl +%<--%<--%<-- @TOPOLOGY@@CLASS@.java + public @TOPOLOGY@@CLASS@(@FRIEND@ y) { + build_cpp_object(y); + } + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_with_complexity_code', +`dnl +%<--%<--%<-- @TOPOLOGY@@CLASS@.java + public @TOPOLOGY@@CLASS@(@FRIEND@ y, Complexity_Class complexity) { + build_cpp_object(y, complexity); + } + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@BUILD_REPRESENT@s_code', +`dnl +%<--%<--%<-- @TOPOLOGY@@CLASS@.java + public @TOPOLOGY@@CLASS@(@!BUILD_REPRESENT@_System cs) { + build_cpp_object(cs); + } + +') + +m4_define(`ppl_delete_@CLASS@_code', +`dnl +%<--%<--%<-- @TOPOLOGY@@CLASS@.java + protected native void finalize(); + +') + +m4_define(`ppl_free_@CLASS@_code', +`dnl +%<--%<--%<-- @TOPOLOGY@@CLASS@.java + public native void free(); + +') + +m4_define(`ppl_@CLASS@_@UB_EXACT@_code', +`dnl +%<--%<--%<-- @TOPOLOGY@@CLASS@.java + public native boolean @UB_EXACT@(@TOPOLOGY@@CLASS@ y); + +') + +m4_define(`ppl_@CLASS@_swap_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native void swap(@CLASS@ y); + +') + +m4_define(`ppl_@CLASS@_@DIMENSION@_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native long @DIMENSION@(); + +') + +m4_define(`ppl_@CLASS@_get_@CLASS_REPRESENT@s_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native @!CLASS_REPRESENT@_System @CLASS_REPRESENT@s(); + +') + +m4_define(`ppl_@CLASS@_get_minimized_@CLASS_REPRESENT@s_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native @!CLASS_REPRESENT@_System minimized_@CLASS_REPRESENT@s(); + +') + +m4_define(`ppl_@CLASS@_relation_with_@RELATION_REPRESENT@_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native Poly_@!A_RELATION_REPRESENT@_Relation relation_with(@!RELATION_REPRESENT@ c); + +') + +m4_define(`ppl_@CLASS@_@HAS_PROPERTY@_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native boolean @HAS_PROPERTY@(); + +') + +m4_define(`ppl_@CLASS@_@SIMPLIFY@_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native void @SIMPLIFY@(); + +') + +m4_define(`ppl_@CLASS@_unconstrain_space_dimension_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native void unconstrain_space_dimension(Variable var); + +') + +m4_define(`ppl_@CLASS@_unconstrain_space_dimensions_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native void + unconstrain_space_dimensions(Variables_Set to_be_unconstrained); + +') + +m4_define(`ppl_@CLASS@_bounds_from_@ABOVEBELOW@_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native boolean bounds_from_@ABOVEBELOW@(Linear_Expression expr); + +') + +m4_define(`ppl_@CLASS@_@MAXMIN@_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native boolean @MAXMIN@(Linear_Expression expr, + Coefficient sup_n, Coefficient sup_d, + By_Reference maximum); + +') + +m4_define(`ppl_@CLASS@_@MAXMIN@_with_point_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native boolean @MAXMIN@(Linear_Expression expr, + Coefficient sup_n, Coefficient sup_d, + By_Reference maximum, + Generator point); + +') + +m4_define(`ppl_@CLASS@_@COMPARISON@_@CLASS@_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native boolean @COMPARISON@(@CLASS@ y); + +') + +m4_define(`ppl_@CLASS@_equals_@CLASS@_code', +`dnl +%<--%<--%<-- @CLASS@.java + 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_@CLASS@_hashcode_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native int hashCode(); + +') + + +m4_define(`ppl_@CLASS@_OK_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native boolean OK(); + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native void add_@CLASS_REPRESENT@(@!CLASS_REPRESENT@ c); + +') + +m4_define(`ppl_@CLASS@_refine_with_@REFINE_REPRESENT@_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native void refine_with_@REFINE_REPRESENT@(@!REFINE_REPRESENT@ c); + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@s_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native void add_@CLASS_REPRESENT@s(@!CLASS_REPRESENT@_System c); + +') + +m4_define(`ppl_@CLASS@_refine_with_@REFINE_REPRESENT@s_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native void refine_with_@REFINE_REPRESENT@s(@!REFINE_REPRESENT@_System c); + +') + +m4_define(`ppl_@CLASS@_@BINOP@_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native void @BINOP@(@CLASS@ p); + +') + +m4_define(`ppl_@CLASS@_simplify_using_context_assign_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native boolean simplify_using_context_assign(@CLASS@ p); + +') + +m4_define(`ppl_@CLASS@_@AFFIMAGE@_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native void @AFFIMAGE@(Variable var, Linear_Expression expr, + Coefficient denominator); + +') + +m4_define(`ppl_@CLASS@_bounded_@AFFIMAGE@_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native void bounded_@AFFIMAGE@(Variable var, + Linear_Expression lb_expr, + Linear_Expression ub_expr, + Coefficient denominator); + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native void generalized_@AFFIMAGE@(Variable var, + Relation_Symbol relsym, + Linear_Expression expr, + Coefficient denominator); + +') + + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native void generalized_@AFFIMAGE@(Linear_Expression lhs, + Relation_Symbol relsym, + Linear_Expression rhs); + +') + +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native void + @EXTRAPOLATION@_extrapolation_assign(@TOPOLOGY@@CLASS@ arg, + By_Reference tp); + +') + +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_narrowing_assign_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native void + @EXTRAPOLATION@_narrowing_assign(@TOPOLOGY@@CLASS@ arg); + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_with_congruence_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native void generalized_@AFFIMAGE@_with_congruence(Variable var, + Relation_Symbol relsym, + Linear_Expression expr, + Coefficient denominator, + Coefficient modulus); + +') + + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native void generalized_@AFFIMAGE@_lhs_rhs_with_congruence(Linear_Expression lhs, + Relation_Symbol relsym, + Linear_Expression rhs, + Coefficient modulus); + +') + +m4_define(`ppl_@CLASS@_@WIDEN@_widening_assign_code', +`dnl +%<--%<--%<-- @CLASS@.java +public native void @WIDEN@_widening_assign(@CLASS@ y, + By_Reference tp); + +') + +m4_define(`ppl_@CLASS@_widening_assign_code', +`dnl +%<--%<--%<-- @CLASS@.java +public native void widening_assign(@CLASS@ y, + By_Reference tp); + +') + +m4_define(`ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native + void @LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign(@CLASS@ y, + @!CONSTRAINER@_System cs, + By_Reference tp); + +') + +m4_define(`ppl_@CLASS@_BGP99_@DISJUNCT_WIDEN@_extrapolation_assign_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native + void BGP99_@DISJUNCT_WIDEN@_extrapolation_assign(@CLASS@ y, + Integer d); + +') + +m4_define(`ppl_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native void + BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign(@CLASS@ y); + +') + +m4_define(`ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native void add_space_dimensions_@EMBEDPROJECT@(long m); + +') + +m4_define(`ppl_@CLASS@_remove_space_dimensions_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native void remove_space_dimensions(Variables_Set to_be_removed); + +') + +m4_define(`ppl_@CLASS@_remove_higher_space_dimensions_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native void remove_higher_space_dimensions(long + new_dimension); + +') + +m4_define(`ppl_@CLASS@_expand_space_dimension_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native void expand_space_dimension(Variable var, long m); + +') + +m4_define(`ppl_@CLASS@_fold_space_dimensions_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native void fold_space_dimensions(Variables_Set to_be_folded, + Variable var); + +') + +m4_define(`ppl_@CLASS@_map_space_dimensions_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native void map_space_dimensions(Partial_Function pfunc); + +') + +m4_define(`ppl_@CLASS@_string_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native String toString(); + +') + +m4_define(`ppl_new_@CLASS@_iterator_from_iterator_code', +`dnl +%<--%<--%<-- @CLASS@_Iterator.java + public @CLASS@_Iterator(@CLASS@_Iterator y) { + build_cpp_object(y); + } + + private native void + build_cpp_object(@CLASS@_Iterator y); + +') + +m4_define(`ppl_@CLASS@_@BEGINEND@_iterator_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native @CLASS@_Iterator @BEGINEND@_iterator(); + +') + +m4_define(`ppl_delete_@CLASS@_iterator_code', +`dnl +%<--%<--%<-- @CLASS@_Iterator.java + public native void free(); + + protected native void finalize(); + +') + +m4_define(`ppl_@CLASS@_get_disjunct_code', +`dnl +%<--%<--%<-- @CLASS@_Iterator.java + public native @DISJUNCT_TOPOLOGY@@DISJUNCT@ get_disjunct(); + +') + +m4_define(`ppl_@CLASS@_drop_disjunct_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native void drop_disjunct(@CLASS@_Iterator itr); + +') + +m4_define(`ppl_@CLASS@_drop_disjuncts_code', +`dnl + public native void drop_disjuncts(@CLASS@_Iterator itr1, + @CLASS@_Iterator itr2); + +') + +m4_define(`ppl_@CLASS@_add_disjunct_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native void add_disjunct(@DISJUNCT_TOPOLOGY@@DISJUNCT@ j_disj); + +') + +m4_define(`ppl_@CLASS@_iterator_equals_iterator_code', +`dnl +%<--%<--%<-- @CLASS@_Iterator.java + public native boolean equals(@CLASS@_Iterator itr); + +') + +m4_define(`ppl_@CLASS@_@INCDEC@_iterator_code', +`dnl +%<--%<--%<-- @CLASS@_Iterator.java + public native void @A_INCDEC@(); + +') + +m4_define(`ppl_@CLASS@_@MEMBYTES@_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native long @MEMBYTES@(); + +') + +m4_define(`ppl_@CLASS@_constrains_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native boolean constrains(Variable var); + +') + +m4_define(`ppl_@CLASS@_ascii_dump_code', +`dnl +%<--%<--%<-- @CLASS@.java + public native String ascii_dump(); + +') + +m4_define(`ppl_@CLASS@_linear_@PARTITION@_code', +`dnl +%<--%<--%<-- @TOPOLOGY@@CLASS@.java + + public static native + Pair <@TOPOLOGY@@CLASS@|COMMA| Pointset_Powerset_NNC_Polyhedron > + linear_@PARTITION@(@TOPOLOGY@@CLASS@ p, @TOPOLOGY@@CLASS@ q); +') + +m4_define(`ppl_@CLASS@_approximate_@PARTITION@_code', +`dnl +%<--%<--%<-- @CLASS@.java + + public static native Pair <@CLASS@|COMMA| Pointset_Powerset_Grid > + approximate_@PARTITION@(@CLASS@ p, + @CLASS@ q, + By_Reference finite); +') 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..560183c --- /dev/null +++ b/interfaces/Java/ppl_interface_generator_java_procedure_generators.m4 @@ -0,0 +1,46 @@ +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-2009 Roberto Bagnara +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://www.cs.unipr.it/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 "_code" must be defined +dnl in the ppl_interface_generator_*_code.m4 file. +dnl The must be exactly as written here. + +m4_define(`m4_procedure_list', +`m4_echo_unquoted(`m4_common_procedure_list', +ppl_free_@CLASS@/1 +all, +ppl_@CLASS@_hashcode/2 +all -box, +ppl_@CLASS@_string/1 +all)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..76885fd --- /dev/null +++ b/interfaces/Java/tests/C_Polyhedron_test1.java @@ -0,0 +1,107 @@ +/* Test C_Polyhedron Java test class of the Parma Polyhedra Library Java + interface. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +import java.math.BigInteger; +import java.util.Iterator; +import java.util.Vector; +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.exit(-1); + } +} + + // This code tests the method `map_space_dimension(pfunc)'. + public static Boolean test01() { + Test_Partial_Function partial_function = new Test_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 new Boolean(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 new Boolean(cs.isEmpty()); + } + + public static void main(String[] args) { + boolean test_result_ok = + Test_Executor.executeTests(C_Polyhedron_test1.class); + if (!test_result_ok) + System.exit(1); + System.exit(0); + } +} diff --git a/interfaces/Java/tests/MIP_Problem_test1.java b/interfaces/Java/tests/MIP_Problem_test1.java new file mode 100644 index 0000000..9ff3baf --- /dev/null +++ b/interfaces/Java/tests/MIP_Problem_test1.java @@ -0,0 +1,278 @@ +/* Test MIP_Problem Java test class of the Parma Polyhedra Library Java + interface. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +import java.math.BigInteger; +import java.util.Iterator; +import java.util.Vector; +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.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); + Boolean ok = true; + + 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); + + ok = 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 && new Boolean(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); + + Boolean ok = true; + + 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(); + ok = 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) { + boolean test_result_ok = + Test_Executor.executeTests(MIP_Problem_test1.class); + 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..f2af48f --- /dev/null +++ b/interfaces/Java/tests/Makefile.am @@ -0,0 +1,89 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +JAVAROOT = . + +interface_generator_files = \ +ppl_interface_generator_java_test_java.m4 \ +ppl_interface_generator_java_test_java_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_java_procedure_generators.m4 \ +ppl_interface_generator_java_test_java.m4 \ +ppl_interface_generator_java_test_java_code.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 = \ +Test_Partial_Function.java \ +Test_Executor.java \ +C_Polyhedron_test1.java \ +NNC_Polyhedron_test1.java \ +MIP_Problem_test1.java \ +Parma_Polyhedra_Library_test1.java \ +PPL_Test.java \ +ppl_interface_generator_java_test_java_code.m4 \ +ppl_interface_generator_java_test_java.m4 \ +ppl_java_tests_common + +check_JAVA = \ +ppl_java_generated_tests.java \ +Test_Partial_Function.java \ +Test_Executor.java \ +C_Polyhedron_test1.java \ +NNC_Polyhedron_test1.java \ +MIP_Problem_test1.java \ +Parma_Polyhedra_Library_test1.java \ +PPL_Test.java + +CLASSPATH = ../ppl_java.jar:. +JAVACFLAGS = -classpath $(CLASSPATH) + +java_test_environment = \ +$(LIBTOOL) --mode=execute -dlopen ../../../src/libppl.la \ + $(JAVA) -classpath .:../ppl_java.jar \ + -Djava.library.path=../jni/.libs + +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) Parma_Polyhedra_Library_test1 + +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 \ + > $@ + +CLEANFILES = \ +ppl_java_generated_tests.java + +$(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..8762356 --- /dev/null +++ b/interfaces/Java/tests/Makefile.in @@ -0,0 +1,528 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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.am $(srcdir)/Makefile.in +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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +CLASSPATH_ENV = CLASSPATH=$(JAVAROOT):$(srcdir)/$(JAVAROOT):$$CLASSPATH +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +JAVAROOT = . +interface_generator_files = \ +ppl_interface_generator_java_test_java.m4 \ +ppl_interface_generator_java_test_java_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_java_procedure_generators.m4 \ +ppl_interface_generator_java_test_java.m4 \ +ppl_interface_generator_java_test_java_code.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 = \ +Test_Partial_Function.java \ +Test_Executor.java \ +C_Polyhedron_test1.java \ +NNC_Polyhedron_test1.java \ +MIP_Problem_test1.java \ +Parma_Polyhedra_Library_test1.java \ +PPL_Test.java \ +ppl_interface_generator_java_test_java_code.m4 \ +ppl_interface_generator_java_test_java.m4 \ +ppl_java_tests_common + +check_JAVA = \ +ppl_java_generated_tests.java \ +Test_Partial_Function.java \ +Test_Executor.java \ +C_Polyhedron_test1.java \ +NNC_Polyhedron_test1.java \ +MIP_Problem_test1.java \ +Parma_Polyhedra_Library_test1.java \ +PPL_Test.java + +CLASSPATH = ../ppl_java.jar:. +JAVACFLAGS = -classpath $(CLASSPATH) +java_test_environment = \ +$(LIBTOOL) --mode=execute -dlopen ../../../src/libppl.la \ + $(JAVA) -classpath .:../ppl_java.jar \ + -Djava.library.path=../jni/.libs + +CLEANFILES = \ +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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Java/tests/Makefile'; \ + 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 + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +classcheck.stamp: $(check_JAVA) + @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 > classcheck.stamp + +clean-checkJAVA: + -rm -f *.class classcheck.stamp +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_JAVA) + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile classcheck.stamp +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-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 + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +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 + +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 check-local clean clean-checkJAVA \ + clean-generic clean-libtool distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-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 \ + uninstall uninstall-am + + +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) Parma_Polyhedra_Library_test1 + +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 \ + > $@ + +$(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..cfde6bd --- /dev/null +++ b/interfaces/Java/tests/NNC_Polyhedron_test1.java @@ -0,0 +1,88 @@ +/* Test NNC_Polyhedron Java test class of the Parma Polyhedra Library Java + interface. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +import java.math.BigInteger; +import java.util.Iterator; +import java.util.Vector; +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.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()); + return new Boolean(true); + } + + 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 new Boolean(cs.isEmpty()); + } + + public static void main(String[] args) { + boolean test_result_ok = + Test_Executor.executeTests(NNC_Polyhedron_test1.class); + 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..0e1d173 --- /dev/null +++ b/interfaces/Java/tests/PPL_Test.java @@ -0,0 +1,91 @@ +/* Test helper class of the Parma Polyhedra Library Java interface. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +import java.util.Map; + +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..ebc1e69 --- /dev/null +++ b/interfaces/Java/tests/Parma_Polyhedra_Library_test1.java @@ -0,0 +1,71 @@ +/* Parma_Polyhedra_Library Java test class of the + Parma Polyhedra Library Java interface. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +import java.math.BigInteger; +import java.util.Iterator; +import java.util.Vector; +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.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(); + + return true; + } + + + public static void main(String[] args) { + boolean test_result_ok = + Test_Executor.executeTests(Parma_Polyhedra_Library_test1.class); + if (!test_result_ok) + System.exit(1); + System.exit(0); + } +} diff --git a/interfaces/Java/tests/Test_Executor.java b/interfaces/Java/tests/Test_Executor.java new file mode 100644 index 0000000..1050df7 --- /dev/null +++ b/interfaces/Java/tests/Test_Executor.java @@ -0,0 +1,62 @@ +/* Test helper class of the Parma Polyhedra Library Java interface. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +import java.lang.reflect.Method; + +public class Test_Executor { + + /*! \brief + Executes all the methods named `test****' that are implemented in + the class \p c. This class expects that the return value is a Boolean + and the test methods don't take parameters. + + \return + true if and only if all the tests defined in the class + \p return true, otherwise returns false + */ + public static boolean executeTests(Class c) { + PPL_Test.initialize(); + Boolean single_test_result_ok; + Boolean global_test_result_ok = new Boolean(true); + System.out.println("Checking " + c.getName()); + Method methods[] = c.getDeclaredMethods(); + for (Method currentMethod:methods) { + try { + if (currentMethod.getName().startsWith("test")) { + System.out.println("Executing " + currentMethod.getName()); + single_test_result_ok = + (Boolean) currentMethod.invoke(new Object(), + new Object[0]); + if (!single_test_result_ok) { + global_test_result_ok = new Boolean(false); + System.out.println(currentMethod.getName() + " failed"); + } + } + } + catch (Exception e) { + System.out.println("An unexpected exception has occured"); + return new Boolean(false); + } + } + return global_test_result_ok; + } +} diff --git a/interfaces/Java/tests/Test_Partial_Function.java b/interfaces/Java/tests/Test_Partial_Function.java new file mode 100644 index 0000000..b78de7f --- /dev/null +++ b/interfaces/Java/tests/Test_Partial_Function.java @@ -0,0 +1,61 @@ +/* Test_Partial_Function Java class of the Parma Polyhedra Library Java + interface. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +import java.util.TreeMap; +import parma_polyhedra_library.*; + + +// This class implements the Partial_Function interface defined +// in the parma_polyhedra_library package. +public class Test_Partial_Function implements Partial_Function { + + private TreeMap map; + private long max; + + public Test_Partial_Function() { + map = new TreeMap(); + max = 0; + } + + public boolean maps(Long i, By_Reference j) { + if (map.containsKey(i)) { + j.set(map.get(i)); + return true; + } + return false; + } + + public long max_in_codomain() { + return max; + } + + public boolean has_empty_codomain() { + return map.isEmpty(); + } + + void insert(long i, long j) { + map.put(i, j); + if (j > max) + max = j; + } +} 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..2ab7060 --- /dev/null +++ b/interfaces/Java/tests/ppl_interface_generator_java_test_java.m4 @@ -0,0 +1,104 @@ +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-2009 Roberto Bagnara +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://www.cs.unipr.it/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) { + ppl_java_generated_tests test1 = new ppl_java_generated_tests(); + // Initialize output variables. + PPL_Test.initialize(); + test1.initialize(); + +dnl ================================================================== +dnl Add test statements (one for each domain instantiation. +dnl ================================================================== + // Here generated tests are called. +m4_divert(1) + } + +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', ` + test1.run_`'m4_interface_class$1`'_test(); +') + +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 boolean run_`'m4_interface_class$1`'_test() { + 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 detected*::exception caught"); +} +System.gc(); +return true; + + } + +') + +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..bb16730 --- /dev/null +++ b/interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4 @@ -0,0 +1,1002 @@ +dnl -*- java -*- +m4_divert(-1) + +This m4 file contains the code for generating ppl_java_generated_tests.java + +Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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_@CLASS@_@WIDEN@_widening_assign_with_tokens_code', `') +m4_define(`ppl_@CLASS@_widening_assign_with_tokens_code', `') +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_with_tokens_code', `') +m4_define(`ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_with_tokens_code', `') +FIXME: This is the pattern used for finalize() which is protected. +m4_define(`ppl_delete_@CLASS@_code', `') + +Define here as empty any known schematic method macros for which +the definition is not yet implemented. +m4_define(`ppl_delete_@CLASS@_iterator_code', `') + + m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension_code', +`dnl +{ + PPL_Test.print_if_noisy("Testing @TOPOLOGY@@CLASS@_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); + if (new_0_universe.OK() && new_6_universe.OK() + && new_0_empty.OK() && new_6_empty.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + + m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_code', +`dnl +{ + PPL_Test.print_if_noisy("Testing @TOPOLOGY@@CLASS@ from @FRIEND@: "); + @FRIEND@ friend_gd = new @FRIEND@(@CONSTRAINER@s1); + @TOPOLOGY@@CLASS@ new_gd = new @TOPOLOGY@@CLASS@(friend_gd); + if (new_gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_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@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); + if (new_gd_ac.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); + } +} + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@BUILD_REPRESENT@s_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing @TOPOLOGY@@CLASS@ from @BUILD_REPRESENT@s: "); + @TOPOLOGY@@CLASS@ new_gd1 = new @TOPOLOGY@@CLASS@(@BUILD_REPRESENT@s1); + if (new_gd1.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_swap_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing swap: "); + @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s2); + gd1.swap(gd2); + if (gd1.OK() && gd2.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); + gd1.free(); + gd1.free(); +} + +') + +m4_define(`ppl_@CLASS@_bounds_from_@ABOVEBELOW@_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing bounds_from_@ABOVEBELOW@: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + boolean bounds_from_@ABOVEBELOW@ + = gd.bounds_from_@ABOVEBELOW@(le_A); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); + gd.free(); +} + +') + +m4_define(`ppl_@CLASS@_hashcode_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing hashcode: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + PPL_Test.print_if_noisy("The hashcode is: " + gd.hashCode()); + if (gd.OK()) + PPL_Test.println_if_noisy(", Success"); + else + PPL_Test.println_if_noisy(", Failure"); + gd.free(); +} + +') + +m4_define(`ppl_@CLASS@_@HAS_PROPERTY@_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing @HAS_PROPERTY@: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + if (gd.@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."); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_@DIMENSION@_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing @DIMENSION@: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + PPL_Test.print_if_noisy("@DIMENSION@ of gd = "); + PPL_Test.println_if_noisy(gd.@DIMENSION@()); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_@BINOP@_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing @BINOP@: "); + @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s2); + gd1.@BINOP@(gd2); + if (gd1.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_simplify_using_context_assign_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing simplify_using_context_assign: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + boolean gd_simplify_using_context_assign + = gd.simplify_using_context_assign(gd); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_get_@CLASS_REPRESENT@s_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing get_@CLASS_REPRESENT@s: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + @!CLASS_REPRESENT@_System gd_@CLASS_REPRESENT@ = gd.@CLASS_REPRESENT@s(); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_get_minimized_@CLASS_REPRESENT@s_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing get_minimized_@CLASS_REPRESENT@s: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + @!CLASS_REPRESENT@_System gr = gd.minimized_@CLASS_REPRESENT@s(); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_@COMPARISON@_@CLASS@_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing @COMPARISON@: "); + @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s2); + boolean gd1_@COMPARISON@ = gd2.@COMPARISON@(gd1); + if (gd1.OK() && gd2.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_narrowing_assign_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing @EXTRAPOLATION@_narrowing_assign: "); + @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s2); + gd1.@EXTRAPOLATION@_narrowing_assign(gd2); + if (gd1.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_relation_with_@RELATION_REPRESENT@_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing relation_with_@RELATION_REPRESENT@: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + Poly_@!A_RELATION_REPRESENT@_Relation + poly_relation = gd.relation_with(@RELATION_REPRESENT@1); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing add_@!CLASS_REPRESENT@: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + gd.add_@CLASS_REPRESENT@(@CLASS_REPRESENT@1); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_refine_with_@REFINE_REPRESENT@_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing refine_with_@REFINE_REPRESENT@: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + gd.refine_with_@REFINE_REPRESENT@(@REFINE_REPRESENT@1); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + + m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@s_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing add_@CLASS_REPRESENT@s: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + gd.add_@CLASS_REPRESENT@s(@CLASS_REPRESENT@s1); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + + m4_define(`ppl_@CLASS@_refine_with_@REFINE_REPRESENT@s_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing refine_with_@REFINE_REPRESENT@s: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + gd.refine_with_@REFINE_REPRESENT@s(@REFINE_REPRESENT@s1); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + + m4_define(`ppl_@CLASS@_@UB_EXACT@_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing @UB_EXACT@: "); + @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + boolean is_exact = gd1.@UB_EXACT@(gd2); + if (gd1.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_@AFFIMAGE@_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing @AFFIMAGE@: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + gd.@AFFIMAGE@(var_C, le_A, coeff_5); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing generalized_@AFFIMAGE@: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + gd.generalized_@AFFIMAGE@(var_C, Relation_Symbol.EQUAL, le_A, coeff_5); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing generalized_@AFFIMAGE@_lhs_rhs: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + gd.generalized_@AFFIMAGE@(le_A, Relation_Symbol.EQUAL, le_A); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_with_congruence_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing generalized_@AFFIMAGE@_with_congruence: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + gd.generalized_@AFFIMAGE@_with_congruence(var_C, Relation_Symbol.EQUAL, + le_A, coeff_5, coeff_5); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing generalized_@AFFIMAGE@_lhs_rhs_with_congruence: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + gd.generalized_@AFFIMAGE@_lhs_rhs_with_congruence(le_A, + Relation_Symbol.EQUAL, + le_A, coeff_5); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_equals_@CLASS@_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing equals: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + boolean equals = gd.equals(gd); + if (!gd.equals(new Object())) + PPL_Test.println_if_noisy("A generic object is not equal to gd"); + if (equals && gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_OK_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing OK: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + boolean ok = gd.OK(); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_bounded_@AFFIMAGE@_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing bounded_@AFFIMAGE@: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + gd.bounded_@AFFIMAGE@(var_C, le_A, le_A, coeff_5); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_@SIMPLIFY@_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing @SIMPLIFY@: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + gd.@SIMPLIFY@(); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_unconstrain_space_dimension_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing unconstrain_space_dimension: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + gd.unconstrain_space_dimension(var_C); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_unconstrain_space_dimensions_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing unconstrain_space_dimensions: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + gd.unconstrain_space_dimensions(var_set_A); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_constrains_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing constrains: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + boolean constrains = gd.constrains(var_C); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_@MAXMIN@_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing @MAXMIN@: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + boolean @MAXMIN@ + = gd.@MAXMIN@(le_A, coeff_0, coeff_5, bool_by_ref1); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); +} + +') + +m4_define(`ppl_@CLASS@_@MAXMIN@_with_point_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing @MAXMIN@_with_point: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + boolean @MAXMIN@_with_point + = gd.@MAXMIN@(le_A, coeff_0, coeff_5, bool_by_ref2, generator1); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +'); + +m4_define(`ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing add_space_dimensions_@EMBEDPROJECT@: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + gd.add_space_dimensions_@EMBEDPROJECT@(2); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_remove_higher_space_dimensions_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing remove_higher_space_dimensions: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + gd.remove_higher_space_dimensions(2); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_remove_space_dimensions_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing remove_space_dimensions: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + gd.remove_space_dimensions(var_set_A); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_expand_space_dimension_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing expand_space_dimension: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + gd.expand_space_dimension(var_C, 1); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_fold_space_dimensions_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing fold_space_dimensions: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + gd.fold_space_dimensions(var_set_A, var_C); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_map_space_dimensions_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing map_space_dimensions: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + gd.map_space_dimensions(partial_function); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_@WIDEN@_widening_assign_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing @WIDEN@_widening_assign: "); + @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + gd1.@WIDEN@_widening_assign(gd2); + if (gd1.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_@WIDEN@_widening_assign_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing : ppl_@CLASS@_@WIDEN@_widening_assign"); + @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + gd1.@WIDEN@_widening_assign(gd2, int_by_ref1); + if (gd1.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_widening_assign_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing widening_assign: "); + @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + gd1.widening_assign(gd2, + int_by_ref1); + if (gd1.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing @EXTRAPOLATION@_extrapolation_assign: "); + @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + gd1.@EXTRAPOLATION@_extrapolation_assign(gd2, int_by_ref1); + if (gd1.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_narrowing_assign_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing @EXTRAPOLATION@_narrowing_assign: "); + @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + gd1.@EXTRAPOLATION@_narrowing_assign(gd2); + if (gd1.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing @LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign: "); + @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + gd1.@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign(gd2, @CONSTRAINER@s1, + zero_by_ref1); + if (gd1.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_BGP99_@DISJUNCT_WIDEN@_extrapolation_assign_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing BGP99_@DISJUNCT_WIDEN@_extrapolation_assign: "); + @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + gd1.BGP99_@DISJUNCT_WIDEN@_extrapolation_assign(gd2, 2); + if (gd1.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign: "); + @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + gd1.BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign(gd2); + if (gd1.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_string_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing toString(): "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + PPL_Test.println_if_noisy(gd.toString()); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} +'); + +m4_define(`ppl_@CLASS@_@MEMBYTES@_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing @MEMBYTES@(): "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + PPL_Test.println_if_noisy("@MEMBYTES@ of gd: "); + PPL_Test.println_if_noisy(gd.@MEMBYTES@()); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +'); + +m4_define(`ppl_@CLASS@_ascii_dump_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing ascii_dump(): "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + PPL_Test.println_if_noisy(gd.ascii_dump()); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +'); + +m4_define(`ppl_@CLASS@_linear_@PARTITION@_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing linear_@PARTITION@: "); + @TOPOLOGY@@CLASS@ gd1 + = new @TOPOLOGY@@CLASS@(constraints1); + @TOPOLOGY@@CLASS@ gd2 + = new @TOPOLOGY@@CLASS@(constraints1); + Pair p = @TOPOLOGY@@CLASS@.linear_partition(gd1, gd2); + if (gd1.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); + 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()); +} + +') + +m4_define(`ppl_@CLASS@_approximate_partition_code', + `dnl +@SUPERPOWER_EXISTS@`'dnl +{ + PPL_Test.print_if_noisy("Testing @CLASS@_approximate_partition: "); + @CLASS@ gd1 + = new @CLASS@(constraints1); + @CLASS@ gd2 + = new @CLASS@(constraints1); + Pair p + = @CLASS@.approximate_partition(gd1, gd2, bool_by_ref1); + if (gd1.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); + 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(); +} + +'); + +m4_define(`ppl_@CLASS@_@BEGINEND@_iterator_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing @BEGINEND@_iterator: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + @TOPOLOGY@@CLASS@_Iterator it_gd = gd.@BEGINEND@_iterator(); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_@INCDEC@_iterator_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing @INCDEC@_iterator: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + if ("@INCDEC@" == "increment") { + @TOPOLOGY@@CLASS@_Iterator it_gd = gd.begin_iterator(); + it_gd.@A_INCDEC@(); + } + else { + @TOPOLOGY@@CLASS@_Iterator it_gd = gd.end_iterator(); + it_gd.@A_INCDEC@(); + } + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_get_disjunct_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing get_disjunct: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + @TOPOLOGY@@CLASS@_Iterator it_gd = gd.begin_iterator(); + @TOPOLOGY@@DISJUNCT@ gd_disjunct = it_gd.get_disjunct(); + if (gd.OK() && gd_disjunct.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_new_@CLASS@_iterator_from_iterator_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing new_iterator_from_iterator: "); + @CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + @CLASS@_Iterator it_gd = gd.begin_iterator(); + @CLASS@_Iterator it_gd_copy = new @CLASS@_Iterator(it_gd); + @TOPOLOGY@@DISJUNCT@ gd_disjunct = it_gd_copy.get_disjunct(); + if (gd.OK() && gd_disjunct.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_drop_disjunct_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing drop_disjunct: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + @TOPOLOGY@@CLASS@_Iterator it_gd = gd.begin_iterator(); + gd.drop_disjunct(it_gd); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +{ + PPL_Test.print_if_noisy("Testing drop_disjuncts: "); + @CLASS@ gd = new @CLASS@(@CONSTRAINER@s1); + @CLASS@ gd2 = new @CLASS@(@CONSTRAINER@s2); + gd.upper_bound_assign(gd2); + @CLASS@_Iterator it_gd = gd.begin_iterator(); + @CLASS@_Iterator it_gd_end = gd.end_iterator(); + gd.drop_disjuncts(it_gd, it_gd_end); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_@CLASS@_add_disjunct_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing add_disjunct: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + @DISJUNCT_TOPOLOGY@@DISJUNCT@ gd_disjunct + = new @DISJUNCT_TOPOLOGY@@DISJUNCT@(@CONSTRAINER@s1); + gd.add_disjunct(gd_disjunct); + if (gd.OK()) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +'); + +m4_define(`ppl_@CLASS@_iterator_equals_iterator_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing iterator_equals_iterator: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + @TOPOLOGY@@CLASS@_Iterator it_gd1 = gd.begin_iterator(); + @TOPOLOGY@@CLASS@_Iterator it_gd2 = gd.begin_iterator(); + boolean equals = it_gd1.equals(it_gd2); + if (gd.OK() && equals) + PPL_Test.println_if_noisy("Success"); + else + PPL_Test.println_if_noisy("Failure"); +} + +') + +m4_define(`ppl_free_@CLASS@_code', + `dnl +{ + PPL_Test.print_if_noisy("Testing free: "); + @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER@s1); + @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(gd); + gd1.free(); + @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(gd); + gd2 = null; + PPL_Test.println_if_noisy("Success"); +} + +') + +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..3d15d7f --- /dev/null +++ b/interfaces/Java/tests/ppl_java_tests_common @@ -0,0 +1,184 @@ +/* Common code for the PPL Java interface tests. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +import java.math.BigInteger; +import java.util.Iterator; +import java.util.Vector; +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.exit(-1); + } + } + + // Common stuff. We can add other objects if we need them later. + Coefficient coeff_0; + Coefficient coeff_5; + Variable var_C; + Variables_Set var_set_A; + Linear_Expression le_A; + + Constraint constraint1; + Constraint constraint2; + Congruence congruence1; + Generator generator1; + Grid_Generator grid_generator1; + + Constraint_System constraints1; + Constraint_System constraints2; + Congruence_System congruences1; + Congruence_System congruences2; + Generator_System generators1; + Grid_Generator_System grid_generators1; + + By_Reference bool_by_ref1; + By_Reference bool_by_ref2; + By_Reference int_by_ref1; + By_Reference zero_by_ref1; + + Test_Partial_Function partial_function; + + // Common initialization. + public 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(true); + bool_by_ref2 = new By_Reference(true); + + int_by_ref1 = new By_Reference(1); + zero_by_ref1 = new By_Reference(0); + + partial_function = new Test_Partial_Function(); + partial_function.insert(0, 2); + partial_function.insert(2, 0); + partial_function.insert(1, 1); +} diff --git a/interfaces/Makefile.am b/interfaces/Makefile.am new file mode 100644 index 0000000..d345f54 --- /dev/null +++ b/interfaces/Makefile.am @@ -0,0 +1,64 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/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 = \ +@required_instantiations@ + +REQUIRED_INSTANTIATIONS_CANONICAL_NAMES = \ +@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..ae6bf21 --- /dev/null +++ b/interfaces/Makefile.in @@ -0,0 +1,637 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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 = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-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 uninstall-recursive +HEADERS = $(noinst_HEADERS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = . C Java OCaml Prolog +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +@BUILD_C_INTERFACE_TRUE@C_SUBDIR = C +@BUILD_JAVA_INTERFACE_TRUE@JAVA_SUBDIR = Java +@BUILD_OCAML_INTERFACE_TRUE@OCAML_SUBDIR = OCaml +@BUILD_SOME_PROLOG_INTERFACES_TRUE@PROLOG_SUBDIR = Prolog +SUBDIRS = . $(C_SUBDIR) $(JAVA_SUBDIR) $(OCAML_SUBDIR) $(PROLOG_SUBDIR) +REQUIRED_INSTANTIATIONS = \ +@required_instantiations@ + +REQUIRED_INSTANTIATIONS_CANONICAL_NAMES = \ +@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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign interfaces/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + 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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -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 + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-exec-am: + +install-html: install-html-recursive + +install-info: install-info-recursive + +install-man: + +install-pdf: install-pdf-recursive + +install-ps: install-ps-recursive + +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: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ + install-strip + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive 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-recursive \ + 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..fb1cfa8 --- /dev/null +++ b/interfaces/OCaml/Makefile.am @@ -0,0 +1,301 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +SUBDIRS = . 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 + +if BUILD_WATCHDOG_LIBRARY + +WATCHDOG_LIBRARY = $(top_builddir)/Watchdog/src/libpwl.la +WATCHDOG_INCLUDE_OPTIONS = -I$(top_builddir)/Watchdog/src + +endif BUILD_WATCHDOG_LIBRARY + +libppl_ocaml_a_LIBADD = \ +@required_instantiations_ocaml_cxx_objects@ \ +$(WATCHDOG_LIBRARY) + +libppl_ocaml_a_DEPENDENCIES = \ +@required_instantiations_ocaml_cxx_objects@ + + +OCAMLC_ENV = OCAMLRUNPARAM='l=1M' + +OCAMLC_COMPILE_FLAGS = \ +-I @mlgmp_dir@ -I .. -ccopt -g + +OCAMLC_LINK_FLAGS = \ +`echo " $(extra_libraries) " | $(SED) -e "s/ -R[^ ]*//g" -e "s/ -/ -cclib -/g"` + +OCAMLC_ROOT = @ocamlc_root@ + +OCAMLOPT_ENV = $(OCAMLC_ENV) +OCAMLOPT_COMPILE_FLAGS = $(OCAMLC_COMPILE_FLAGS) +OCAMLOPT_LINK_FLAGS = $(OCAMLC_LINK_FLAGS) + +AM_CPPFLAGS = \ +-I$(OCAMLC_ROOT) \ +-I$(top_srcdir)/interfaces \ +-I$(top_srcdir)/src \ +-I$(top_builddir)/src \ +$(WATCHDOG_INCLUDE_OPTIONS) \ +@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 \ +$(interface_generator_files) + +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_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) $< + +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 = \ +@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 = \ +@required_instantiations_ocaml_cxx_sources@ \ +@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..5dc5f3f --- /dev/null +++ b/interfaces/OCaml/Makefile.in @@ -0,0 +1,1064 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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.am $(srcdir)/Makefile.in +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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(ocamldir)" +pkglibLIBRARIES_INSTALL = $(INSTALL_DATA) +LIBRARIES = $(pkglib_LIBRARIES) +ARFLAGS = cru +libppl_ocaml_a_AR = $(AR) $(ARFLAGS) +am_libppl_ocaml_a_OBJECTS = ppl_ocaml_common.$(OBJEXT) +libppl_ocaml_a_OBJECTS = $(am_libppl_ocaml_a_OBJECTS) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libppl_ocaml_a_SOURCES) \ + $(nodist_EXTRA_libppl_ocaml_a_SOURCES) +DIST_SOURCES = $(libppl_ocaml_a_SOURCES) +RECURSIVE_TARGETS = all-recursive check-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 uninstall-recursive +ocamlDATA_INSTALL = $(INSTALL_DATA) +DATA = $(ocaml_DATA) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +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) +@HAVE_OCAMLC_TRUE@PPL_OCAMLC_LIBRARY = ppl_ocaml.cma +@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 + +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_LIBRARY = $(top_builddir)/Watchdog/src/libpwl.la +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_INCLUDE_OPTIONS = -I$(top_builddir)/Watchdog/src +libppl_ocaml_a_LIBADD = \ +@required_instantiations_ocaml_cxx_objects@ \ +$(WATCHDOG_LIBRARY) + +libppl_ocaml_a_DEPENDENCIES = \ +@required_instantiations_ocaml_cxx_objects@ + +OCAMLC_ENV = OCAMLRUNPARAM='l=1M' +OCAMLC_COMPILE_FLAGS = \ +-I @mlgmp_dir@ -I .. -ccopt -g + +OCAMLC_LINK_FLAGS = \ +`echo " $(extra_libraries) " | $(SED) -e "s/ -R[^ ]*//g" -e "s/ -/ -cclib -/g"` + +OCAMLC_ROOT = @ocamlc_root@ +OCAMLOPT_ENV = $(OCAMLC_ENV) +OCAMLOPT_COMPILE_FLAGS = $(OCAMLC_COMPILE_FLAGS) +OCAMLOPT_LINK_FLAGS = $(OCAMLC_LINK_FLAGS) +AM_CPPFLAGS = \ +-I$(OCAMLC_ROOT) \ +-I$(top_srcdir)/interfaces \ +-I$(top_srcdir)/src \ +-I$(top_builddir)/src \ +$(WATCHDOG_INCLUDE_OPTIONS) \ +@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 \ +$(interface_generator_files) + +MOSTLYCLEANFILES = \ +@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 = \ +@required_instantiations_ocaml_cxx_sources@ \ +@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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/OCaml/Makefile'; \ + 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 +install-pkglibLIBRARIES: $(pkglib_LIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(pkglibLIBRARIES_INSTALL) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(pkglibLIBRARIES_INSTALL) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + @$(POST_INSTALL) + @list='$(pkglib_LIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + p=$(am__strip_dir) \ + echo " $(RANLIB) '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(RANLIB) "$(DESTDIR)$(pkglibdir)/$$p"; \ + else :; fi; \ + done + +uninstall-pkglibLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(pkglib_LIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLIBRARIES: + -test -z "$(pkglib_LIBRARIES)" || rm -f $(pkglib_LIBRARIES) +libppl_ocaml.a: $(libppl_ocaml_a_OBJECTS) $(libppl_ocaml_a_DEPENDENCIES) + -rm -f libppl_ocaml.a + $(libppl_ocaml_a_AR) libppl_ocaml.a $(libppl_ocaml_a_OBJECTS) $(libppl_ocaml_a_LIBADD) + $(RANLIB) libppl_ocaml.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_BD_Shape_double.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_BD_Shape_float.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_BD_Shape_int16_t.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_BD_Shape_int32_t.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_BD_Shape_int64_t.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_BD_Shape_int8_t.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_BD_Shape_long_double.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_BD_Shape_mpq_class.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_BD_Shape_mpz_class.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Constraints_Product_C_Polyhedron_Grid.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Constraints_Product_Grid_C_Polyhedron.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Constraints_Product_Grid_NNC_Polyhedron.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Constraints_Product_NNC_Polyhedron_Grid.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Double_Box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Float_Box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Grid.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Int16_Box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Int32_Box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Int64_Box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Int8_Box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Long_Double_Box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Octagonal_Shape_double.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Octagonal_Shape_float.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Octagonal_Shape_int16_t.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Octagonal_Shape_int32_t.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Octagonal_Shape_int64_t.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Octagonal_Shape_int8_t.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Octagonal_Shape_long_double.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Octagonal_Shape_mpq_class.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Octagonal_Shape_mpz_class.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_BD_Shape_double.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_BD_Shape_float.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_BD_Shape_int16_t.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_BD_Shape_int32_t.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_BD_Shape_int64_t.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_BD_Shape_int8_t.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_BD_Shape_long_double.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_BD_Shape_mpq_class.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_BD_Shape_mpz_class.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_C_Polyhedron.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Double_Box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Float_Box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Grid.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Int16_Box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Int32_Box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Int64_Box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Int8_Box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Long_Double_Box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_NNC_Polyhedron.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Octagonal_Shape_double.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Octagonal_Shape_float.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int16_t.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int32_t.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int64_t.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int8_t.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Octagonal_Shape_long_double.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Octagonal_Shape_mpq_class.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Octagonal_Shape_mpz_class.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Rational_Box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Uint16_Box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Uint32_Box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Uint64_Box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Uint8_Box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Z_Box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Polyhedron.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Rational_Box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Uint16_Box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Uint32_Box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Uint64_Box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Uint8_Box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_Z_Box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_ocaml_common.Po@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-ocamlDATA: $(ocaml_DATA) + @$(NORMAL_INSTALL) + test -z "$(ocamldir)" || $(MKDIR_P) "$(DESTDIR)$(ocamldir)" + @list='$(ocaml_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(ocamlDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(ocamldir)/$$f'"; \ + $(ocamlDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(ocamldir)/$$f"; \ + done + +uninstall-ocamlDATA: + @$(NORMAL_UNINSTALL) + @list='$(ocaml_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(ocamldir)/$$f'"; \ + rm -f "$(DESTDIR)$(ocamldir)/$$f"; \ + done + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + 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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -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 + +info: info-recursive + +info-am: + +install-data-am: install-ocamlDATA + +install-dvi: install-dvi-recursive + +install-exec-am: install-pkglibLIBRARIES + +install-html: install-html-recursive + +install-info: install-info-recursive + +install-man: + +install-pdf: install-pdf-recursive + +install-ps: install-ps-recursive + +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: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ + install-strip + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + clean-pkglibLIBRARIES ctags ctags-recursive 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-recursive 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_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) $< + +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..bc786da --- /dev/null +++ b/interfaces/OCaml/OCaml_interface.dox @@ -0,0 +1,989 @@ +/* Documentation for the OCaml interface. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +/*! + \defgroup 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, prefix is the prefix under which +you have installed the library (typically /usr +or /usr/local). + + +\anchor OCaml_Features +

OCaml Interface Features

+ +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 +

Overview

+ +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 simple domains, powersets of a simple domain and + products of simple domains. + - The simple domains are: + - convex polyhedra, which consist of C_Polyhedron and + NNC_Polyhedron;
+ - 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;
+ - 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
+ - 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 domain + and any element of a PPL domain is called a PPL object. +- The OCaml interface files are all installed in the directory + prefix/lib/ppl. 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 man ld.so and man ldconfig + for more information. +- A PPL object such as a polyhedron can only be accessed + by means of a OCaml term called a handle. + 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 +

Function Descriptions

+ +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 +

Domain Independent Functions

+ +First we describe some domain independent functions +included with all instantiations of the OCaml interfaces. + +

ppl_version_major

+ Returns the major number of the PPL version. + +

ppl_version_minor

+ Returns the minor number of the PPL version. + +

ppl_version_revision

+ Returns the revision number of the PPL version. + +

ppl_version_beta

+ Returns the beta number of the PPL version. + +

ppl_version

+ Returns the PPL version. + +

ppl_banner

+ 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. + +

ppl_max_space_dimension

+ Returns the maximum space dimension the C++ interface can handle. + +

ppl_Coefficient_is_bounded

+ Returns true if and only if the coefficients in the C++ interface + are bounded. + +

ppl_Coefficient_max

+ If the coefficients are bounded, returns the maximum coefficient + the C++ interface can handle. + +

ppl_Coefficient_min

+ If the coefficients are bounded, returns the minimum coefficient + the C++ interface can handle. + +

ppl_io_wrap_string source_string indent_depth + preferred_first_line_length preferred_line_length

+ 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. + +

ppl_set_timeout hsecs

+ Computations taking exponential time will be interrupted some time + after hsecs hundreths of seconds after that call. + If the computation is interrupted that way, a timeout exception + will be thrown. + An exception is immediately thrown if hsecs is not strictly + greater than zero, or if the PPL Watchdog library is not enabled. + +

ppl_reset_timeout

+ Resets the timeout time so that the computation is not interrupted. + An exception is thrown if the PPL Watchdog library is not enabled. + +

ppl_set_rounding_for_PPL

+ 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. + +

ppl_restore_pre_PPL_rounding

+ 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. + +
+ +\anchor OCaml_mip_functions +

MIP Functions

+Here we describe some functions available for PPL objects +defining mixed integer (linear) programming problems. + +

+ ppl_new_MIP_Problem_from_space_dimension dimension +

+ Return a handle to an MIP Problem \f$\mathrm{MIP}\f$ with the + feasible region the vector space of dimension dimension, + objective function \f$0\f$ and optimization mode max. + +

+ ppl_new_MIP_Problem dimension constraint_system lin_expr optimization_mode +

+ Return a handle to an MIP Problem \f$\mathrm{MIP}\f$ having space + dimension dimension, a feasible region represented by + constraint_system, objective function lin_expr + and optimization mode optimization_mode. + +

+ ppl_MIP_Problem_get_control_parameter handle param_name +

+ Returns the value of the control parameter named param_name. + +

+ ppl_MIP_Problem_set_control_parameter handle param_value +

+ Sets control parameter value param_value. + +

+ ppl_MIP_Problem_swap handle_1 handle_2 +

+ Swaps the MIP Problem referenced by handle_1 + with the one referenced by handle_2. + +

+ ppl_MIP_Problem_space_dimension handle +

+ Returns the dimension of the vector space in which the + MIP Problem referenced by handle is embedded. + +

+ ppl_MIP_Problem_integer_space_dimensions handle +

+ Returns a list of variables representing + representing the integer space dimensions of the MIP Problem + referenced by handle. + +

+ ppl_MIP_Problem_constraints handle +

+ Returns a list of the constraints in the constraints system + representing the feasible region for the MIP Problem + referenced by handle. + +

+ ppl_MIP_Problem_objective_function handle +

+ Returns the objective function for the MIP Problem referenced + by handle. + +

+ ppl_MIP_Problem_optimization_mode handle +

+ Returns the optimization mode + for the MIP Problem referenced by handle. + +

+ ppl_MIP_Problem_clear handle +

+ Resets the MIP problem referenced by handle + to be the trivial problem with + the feasible region the \f$0\f$-dimensional universe, + objective function \f$0\f$ and optimization mode Maximization. + +

ppl_MIP_Problem_add_space_dimensions_and_embed + handle dimension +

+ Embeds the MIP problem referenced by handle + in a space that is enlarged by dimension dimensions, + +

+ ppl_MIP_Problem_add_to_integer_space_dimensions handle vars_list +

+ Updates the MIP Problem referenced by handle + so that the variables in vars_list are added to + the set of integer space dimensions. + +

+ ppl_MIP_Problem_add_constraint handle constraint +

+ Updates the MIP Problem referenced by handle + so that the feasible region is represented by the original constraint + system together with the constraint constraint. + +

+ ppl_MIP_Problem_add_constraints handle constraint_system +

+ Updates the MIP Problem referenced by handle + so that the feasible region is represented by the original constraint + system together with all the constraints in constraint_system. + +

+ ppl_MIP_Problem_set_objective_function handle lin_expr +

+ Updates the MIP Problem referenced by handle + so that the objective function is changed to lin_expr. + +

+ ppl_MIP_Problem_set_optimization_mode handle optimization_mode +

+ Updates the MIP Problem referenced by handle + so that the optimization mode is changed to optimization_mode. + +

+ ppl_MIP_Problem_is_satisfiable handle +

+ Returns true if the MIP Problem referenced by + handle is satisfiable and false otherwise. + +

+ ppl_MIP_Problem_solve handle +

+ Solves the MIP problem referenced by + handle 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. + +

+ ppl_MIP_Problem_feasible_point handle +

+ Returns a feasible point for the MIP problem + referenced by handle. + +

+ ppl_MIP_Problem_optimizing_point handle +

+ Returns an optimizing point for the MIP problem + referenced by handle. + +

+ ppl_MIP_Problem_optimal_value handle +

+ 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 handle. + +

+ ppl_MIP_Problem_evaluate_objective_function handle generator +

+ Evaluates the objective function of the MIP problem referenced by + handle at point generator. + 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 handle. + +

+ ppl_MIP_Problem_OK handle +

+ Returns true if the MIP Problem referenced by + handle is well formed, i.e., if it + satisfies all its implementation invariants and false, + otherwise. Useful for debugging purposes. + +

+ ppl_MIP_Problem_ascii_dump handle +

+ Returns a string containing an ASCII dump of the internal representation + of the MIP_Problem referenced by handle. Useful for + debugging purposes. + +
+ +\anchor main_OCaml_C_polyhedron_functions +

C_Polyhedron Functions

+Here we describe the main functions available for PPL objects +defining convex and closed polyhedra. + +

+ ppl_new_C_Polyhedron_from_space_dimension space_dimension universe_or_empty + +

+ Returns a handle to a C polyhedron \f$\cP\f$ + with space_dimension dimensions; it is empty + or the universe polyhedron depending on whether + universe_or_empty + is empty or universe, respectively. + +

+ppl_new_C_Polyhedron_from_C_Polyhedron handle +

+ If handle 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$. + +

+ppl_new_C_Polyhedron_from_NNC_Polyhedron handle +

+ If handle 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 ppl_new_C_Polyhedron_from_NNC_Polyhedron/2, + care must be taken that the source polyhedron referenced by + handle is topologically closed. + +

+ ppl_new_C_Polyhedron_from_constraints constraint_system +

+ Returns a handle to a C polyhedron \f$\cP\f$ represented by + constraint_system. + +

+ ppl_new_C_Polyhedron_from_generators generator_system +

+ Returns a handle to a C polyhedron \f$\cP\f$ represented by + generator_system. + +

ppl_Polyhedron_swap handle_1 handle_2

+ Swaps the polyhedron \f$\cP\f$ referenced by handle_1 + with the polyhedron \f$\cQ\f$ referenced by handle_2. + The polyhedra \f$\cP\f$ and \f$\cQ\f$ must have the same topology. + +

ppl_Polyhedron_space_dimension handle

+ Returns the dimension of the vector space in which the + polyhedron referenced by + handle is embedded. + +

ppl_Polyhedron_affine_dimension handle +

+ Returns the actual dimension of the polyhedron referenced by + handle. + +

ppl_Polyhedron_get_constraints handle +

+ Return a list of the constraints in the constraints system + representing the polyhedron referenced by handle. + +

ppl_Polyhedron_get_minimized_constraints handle +

+ Returns a minimized list of the constraints in the constraints system + representing the polyhedron referenced by handle. + +

ppl_Polyhedron_get_generators handle +

+ Returns a list of the generators in the generators system + representing the polyhedron referenced by handle. + +

ppl_Polyhedron_get_minimized_generators handle +

+ Returns a minimized list of the generators in the generators system + representing the polyhedron referenced by handle. + +

ppl_Polyhedron_relation_with_constraint handle constraint +

+ Returns the list of relations the polyhedron referenced by + handle has with constraint. + The possible relations and their meaning is given in Section + \extref{relation_with, Relation-With Operators} + of the main PPL user manual. + +

ppl_Polyhedron_relation_with_generator handle generator +

+ Returns the list of relations the polyhedron referenced by + handle has with generator. + The possible relations and their meaning is given in Section + \extref{relation_with, Relation-With Operators} + of the main PPL user manual. + +

ppl_Polyhedron_is_empty handle

+ Returns true if the polyhedron referenced by + handle is empty and false, otherwise. + +

ppl_Polyhedron_is_universe handle

+ Returns true if the polyhedron referenced by + handle is the universe and false, otherwise. + +

ppl_Polyhedron_is_bounded handle

+ Returns true if the polyhedron referenced by + handle is bounded and false, otherwise. + +

ppl_Polyhedron_contains_integer_point handle

+ Returns true if the polyhedron referenced by + handle contains at least one integer point and false, + otherwise. + +

ppl_Polyhedron_bounds_from_above handle lin_expr

+ Returns true if the polyhedron referenced by + handle is bounded from above by lin_expr + and false, otherwise. + +

ppl_Polyhedron_bounds_from_below handle lin_expr

+ Returns true if the polyhedron referenced by + handle is bounded from below by lin_expr + and false, otherwise. + +

ppl_Polyhedron_maximize handle lin_expr

+ Returns a record + bool_1 * coefficient_1 * coefficient_2 * bool_2 where: + bool_1 is true if the polyhedron \f$P\f$ referenced by + handle is not empty + and lin_expr is bounded from above in \f$P\f$ and + false, otherwise. + coefficient_1 is the numerator of + the supremum value and coefficient_2 the denominator + of the supremum value. + If the supremum is also the maximum, bool_2 is true + and false, otherwise. + +

+ ppl_Polyhedron_maximize_with_point handle lin_expr +

+ Returns a record + bool_1 * coefficient_1 * coefficient_2 * bool_2 * Point + bool_1 is true if the polyhedron \f$P\f$ referenced by + handle is not empty + and lin_expr is bounded from above in \f$P\f$ and + false, otherwise. + coefficient_1 is the numerator of + the supremum value and coefficient_2 the denominator + of the supremum value. + If the supremum is also the maximum, bool_2 is true + and false, otherwise. + Point is the point or closure point where + lin_expr reaches the supremum. + +

+ ppl_Polyhedron_minimize handle lin_expr +

+ Returns a record + bool_1 * coefficient_1 * coefficient_2 * bool_2 + bool_1 is true if the polyhedron \f$P\f$ referenced by + handle is not empty + and lin_expr is bounded from below in \f$P\f$ and + false, otherwise. + coefficient_1 is the numerator of + the infinum value and coefficient_2 the denominator + of the infinum value. + If the infinum is also the minimum, bool_2 is true + and false, otherwise. + +

+ ppl_Polyhedron_minimize_with_point handle lin_expr +

+ Returns a record + bool_1 * coefficient_1 * coefficient_2 * bool_2 + bool_1 is true if the polyhedron \f$P\f$ referenced by + handle is not empty + and lin_expr is bounded from below in \f$P\f$ and + false, otherwise. + coefficient_1 is the numerator of + the infinum value and coefficient_2 the denominator + of the infinum value. + If the infinum is also the minimum, bool_2 is true + and false, otherwise. + Point is the point or closure point where + lin_expr reaches the infinum. + +

ppl_Polyhedron_is_topologically_closed handle

+ Returns true if the polyhedron referenced by + handle is topologically closed and false, otherwise. + +

ppl_Polyhedron_contains_Polyhedron handle_1 handle_2 +

+ Returns true if the polyhedron referenced by + handle_2 is included in or + equal to the polyhedron referenced by handle_1 + and false, otherwise. + +

ppl_Polyhedron_strictly_contains_Polyhedron handle_1 handle_2 +

+ Returns true if the polyhedron referenced by + handle_2 is included in but not + equal to the polyhedron referenced by handle_1 + and false, otherwise. + +

ppl_Polyhedron_is_disjoint_from_Polyhedron handle_1 handle_2 +

+ Returns true if the polyhedron referenced by + handle_1 is disjoint from the polyhedron referenced by + handle_2 and false, otherwise. + +

ppl_Polyhedron_equals_Polyhedron handle_1 handle_2

+ Returns true if the polyhedron referenced by + handle_1 is equal to the polyhedron referenced by + handle_2 and false, otherwise. + +

ppl_Polyhedron_OK handle

+ Returns true if the polyhedron referenced by + handle is well formed, i.e., if it + satisfies all its implementation invariants and false, otherwise. + Useful for debugging purposes. + +

ppl_Polyhedron_add_constraint handle constraint

+ Updates the polyhedron referenced by handle to + one obtained by adding + constraint to its constraint system. + +

ppl_Polyhedron_add_generator handle generator

+ Updates the polyhedron referenced by handle to + one obtained by adding + generator to its generator system. + +

ppl_Polyhedron_add_constraints handle constraint_system +

+ Updates the polyhedron referenced by handle to + one obtained by adding to its constraint system the constraints in + constraint_system. + +

ppl_C_Polyhedron_add_generators handle generator_system +

+ Updates the polyhedron referenced by handle to + one obtained by adding to its generator system the generators in + generator_system. + +

ppl_Polyhedron_intersection_assign handle_1 handle_2 +

+ Assigns to the polyhedron referenced by handle_1 + its intersection with the polyhedron referenced by handle_2. + +

ppl_Polyhedron_poly_hull_assign handle_1 handle_2

+ Assigns to the polyhedron referenced by handle_1 + its poly-hull with the polyhedron referenced by handle_2. + +

ppl_Polyhedron_poly_difference_assign handle_1 handle_2 +

+ Assigns to the polyhedron referenced by handle_1 + its poly-difference with the polyhedron referenced by handle_2. + +

ppl_Polyhedron_affine_image handle var + lin_expr coefficient +

+ Transforms the polyhedron referenced by handle + assigning the affine expression + lin_expr/coefficient to var. + +

ppl_Polyhedron_affine_preimage handle var + lin_expr coefficient +

+This is the inverse transformation to that for ppl_affine_image. + +

ppl_Polyhedron_bounded_affine_image handle + var + lin_expr_1 + lin_expr_2 + coefficient +

+ Transforms the polyhedron referenced by handle + assigning the image with respect to the transfer relation + lin_expr_1/coefficient <= var <= lin_expr_2/coefficient. + +

ppl_Polyhedron_generalized_affine_image handle + var + Relation_Symbol + lin_expr + coefficient +

+ Transforms the polyhedron referenced by handle + assigning the generalized + affine image with respect to the transfer function + var Relation_Symbol + lin_expr/coefficient. + + +

ppl_Polyhedron_generalized_affine_image_lhs_rhs handle + lin_expr_1 + Relation_Symbol + lin_expr_2 +

+ Transforms the polyhedron referenced by handle + assigning the generalized + affine image with respect to the transfer function + lin_expr_1 Relation_Symbol + lin_expr_2. + +

ppl_Polyhedron_time_elapse_assign handle_1 handle_2

+ Assigns to the polyhedron \f$\cP\f$ referenced by handle_1 + the time-elapse \f$ (\cP \nearrow \cQ)\f$ + with the polyhedron \f$\cQ\f$ referenced by handle_2. + +

ppl_Polyhedron_BHRZ03_widening_assign handle_1 handle_2 +

+ If the polyhedron \f$\cP_1\f$ referenced by handle_1 + contains the polyhedron \f$\cP_2\f$ referenced by handle_2, + then handle_1 will refer to + the BHRZ03-widening of \f$\cP_1\f$ with \f$\cP_2\f$. + +

ppl_Polyhedron_BHRZ03_widening_assign_with_tokens handle_1 + handle_2 + c_unsigned_1 +

+ It is assumed that the polyhedron \f$\cP_1\f$ referenced by + handle_1 contains the polyhedron \f$\cP_2\f$ + referenced by handle_2; + 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 c_unsigned_1 + is the number of tokens available, + Then this function will return the number of tokens remaining at the + end of the operation. + +

+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign handle_1 + handle_2 + constraint_system +

+ If the polyhedron \f$\cP_1\f$ referenced by handle_1 + contains the polyhedron \f$\cP_2\f$ referenced by handle_2, + then handle_1 will refer to + the BHRZ03-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$ + improved by enforcing the constraints in + constraint_system. + +

ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens + handle_1 + handle_2 + constraint_system + c_unsigned_1

+ It is assumed that the polyhedron \f$\cP_1\f$ referenced by + handle_1 contains the polyhedron \f$\cP_2\f$ + referenced by handle_2; + let \f$\cP\f$ denote the BHRZ03-extrapolation of + \f$\cP_1\f$ with \f$\cP_2\f$, + improved by enforcing those constraints in constraint_system. +
+ Assuming that the quantity \f$t_1\f$ given by c_unsigned_1 + 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. + +

ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign + handle_1 + handle_2 + constraint_system +

+ If the polyhedron \f$\cP_1\f$ referenced by handle_1 + contains the polyhedron \f$\cP_2\f$ referenced by handle_2, + then handle_1 will refer to + the BHRZ03-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$ + improved by enforcing the constraints in + constraint_system 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$. + +

ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens + handle_1 + handle_2 + constraint_system + c_unsigned_1 +

+ It is assumed that the polyhedron \f$\cP_1\f$ referenced by + handle_1 contains the polyhedron \f$\cP_2\f$ + referenced by handle_2; + let \f$\cP\f$ denote the BHRZ03-extrapolation of \f$\cP_1\f$ with + \f$\cP_2\f$ improved by enforcing those constraints in + constraint_system 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$. +
+ Assuming that the quantity \f$t_1\f$ given by c_unsigned_1 + 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. + +

ppl_Polyhedron_H79_widening_assign handle_1 handle_2 +

+ If the polyhedron \f$\cP_1\f$ referenced by handle_1 + contains the polyhedron \f$\cP_2\f$ referenced by handle_2, + then handle_1 will refer to + the H79-widening of \f$\cP_1\f$ with \f$\cP_2\f$. + +

ppl_Polyhedron_H79_widening_assign_with_tokens handle_1 + handle_2 + c_unsigned_1 +

+ It is assumed that the polyhedron \f$\cP_1\f$ referenced by + handle_1 contains the polyhedron \f$\cP_2\f$ + referenced by handle_2; + 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 c_unsigned_1 + is the number of tokens available, + Then this function will return the number of tokens remaining at the + end of the operation. + +

+ ppl_Polyhedron_limited_H79_extrapolation_assign handle_1 + handle_2 + constraint_system +

+ If the polyhedron \f$\cP_1\f$ referenced by handle_1 + contains the polyhedron \f$\cP_2\f$ referenced by handle_2, + then handle_1 will refer to + the H79-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$ + improved by enforcing the constraints in + constraint_system. + +

ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens + handle_1 + handle_2 + constraint_system + c_unsigned_1

+ It is assumed that the polyhedron \f$\cP_1\f$ referenced by + handle_1 contains the polyhedron \f$\cP_2\f$ + referenced by handle_2; + let \f$\cP\f$ denote the H79-extrapolation of + \f$\cP_1\f$ with \f$\cP_2\f$, + improved by enforcing those constraints in constraint_system. +
+ Assuming that the quantity \f$t_1\f$ given by c_unsigned_1 + 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. + +

ppl_Polyhedron_bounded_H79_extrapolation_assign + handle_1 + handle_2 + constraint_system +

+ If the polyhedron \f$\cP_1\f$ referenced by handle_1 + contains the polyhedron \f$\cP_2\f$ referenced by handle_2, + then handle_1 will refer to + the H79-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$ + improved by enforcing the constraints in + constraint_system 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$. + +

ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens + handle_1 + handle_2 + constraint_system + c_unsigned_1 +

+ It is assumed that the polyhedron \f$\cP_1\f$ referenced by + handle_1 contains the polyhedron \f$\cP_2\f$ + referenced by handle_2; + let \f$\cP\f$ denote the H79-extrapolation of \f$\cP_1\f$ with + \f$\cP_2\f$, improved by enforcing those constraints in + constraint_system 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$. +
+ Assuming that the quantity \f$t_1\f$ given by c_unsigned_1 + 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. + +

ppl_Polyhedron_topological_closure_assign handle

+ Assigns to the polyhedron referenced by handle + its topological closure. + +

ppl_Polyhedron_add_space_dimensions_and_embed handle + space_dimension +

+ Embeds the polyhedron referenced by handle + in a space that is enlarged by space_dimension dimensions, + +

ppl_Polyhedron_concatenate_assign handle_1 handle_2

+ Updates the polyhedron \f$\cP_1\f$ referenced by handle_1 + 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 handle_2, + and then adds to its system of constraints + a renamed-apart version of the constraints of \f$\cP_2\f$. + +

ppl_Polyhedron_add_space_dimensions_and_project handle + space_dimension +

+ + Projects the polyhedron referenced by handle + onto a space that is enlarged by space_dimension dimensions, + +

ppl_Polyhedron_remove_space_dimensions handle + Int_List +

+ Removes the space dimensions given by the identifiers of the + PPL variables in list Int_List + from the polyhedron referenced by handle. + 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. + +

ppl_Polyhedron_remove_higher_space_dimensions handle + space_dimension +

+ Projects the polyhedron referenced to by handle + onto the first space_dimension dimensions. + +

+ ppl_Polyhedron_expand_space_dimension handle var space_dimension +

+ space_dimension copies of the space dimension referenced by + variable var are added to the polyhedron + referenced to by handle. + +

+ ppl_Polyhedron_fold_space_dimensions handle list_of_vars var +

+ The space dimensions referenced by the PPL variables in list + list_of_vars are folded into the dimension referenced + by var and removed. + The result is undefined if list_of_vars + 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. + +

ppl_Polyhedron_map_space_dimensions handle p_func

+ Maps the space dimensions of the polyhedron referenced by + handle + using the partial function defined by a list of pairs of integers + p_func. + 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. + +

+ ppl_Polyhedron_ascii_dump handle +

+ Returns a string containing an ASCII dump of the internal representation + of the polyhedron referenced by handle. Useful for + debugging purposes. + + +\anchor OCamldoc_Documentation +

OCamldoc Documentation

+ +\htmlonly +For a list of the PPL functions available to the generated domains +for the OCaml interface, see the +OCamldoc-generated documentation. +

+\endhtmlonly + +NOTE: +the complete documentation for module Ppl_ocaml, including +all the types and functions that were enabled at configuration time, is +only available in the configuration dependent OCamldoc +documentation. +The configuration independent OCamldoc documentation only contains +those types and functions that are always enabled, which are grouped +into module Ppl_ocaml_globals. +Also note that module Ppl_ocaml automatically includes +module Ppl_ocaml_globals. + +\latexonly +\input ocamldoc.tex +\endlatexonly + +\anchor OI_Compilation +

Compilation and Installation

+ +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..f544932 --- /dev/null +++ b/interfaces/OCaml/README.ocaml @@ -0,0 +1,44 @@ + +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 , +the OCaml interface files will be installed in , +where either = /lib/ppl or + = /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 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 \ + -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 my_program.ml +$ ocamlopt -o my_program.opt -cc g++ -I +gmp -I \ + -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..00da21d --- /dev/null +++ b/interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 @@ -0,0 +1,1206 @@ +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-2009 Roberto Bagnara +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://www.cs.unipr.it/ppl/ . + +dnl No code is needed for these procedure schemas in the OCaml interface. +dnl +m4_define(`ppl_delete_@CLASS@_code', `') +m4_define(`ppl_delete_@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 = { + "it.unipr.cs.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 +}; + +} // namespace OCaml + +} // namespace Interfaces + +} // namespace Parma_Polyhedra_Library + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension_code', +`dnl +extern "C" +CAMLprim value +ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension(value d, value caml_de) try { + CAMLparam2(d, caml_de); + dimension_type dd = value_to_ppl_dimension(d); + 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_@CLASS@(ppl_value)); +} +CATCH_ALL + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@BUILD_REPRESENT@s_code', +`dnl +extern "C" +CAMLprim value +ppl_new_@TOPOLOGY@@CLASS@_from_@BUILD_REPRESENT@s(value cl) try { + CAMLparam1(cl); + @!BUILD_REPRESENT@_System cs = build_ppl_@!BUILD_REPRESENT@_System(cl); + @TOPOLOGY@@CPP_CLASS@& ppl_value = *new @TOPOLOGY@@CPP_CLASS@(cs); + CAMLreturn(unregistered_value_p_@CLASS@(ppl_value)); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_relation_with_@RELATION_REPRESENT@_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_relation_with_@RELATION_REPRESENT@(value ph, value c) try { + CAMLparam2(ph, c); + const @CPP_CLASS@& pph = *p_@CLASS@_val(ph); + @!RELATION_REPRESENT@ ppl_c = build_ppl_@!RELATION_REPRESENT@(c); + Poly_@!A_RELATION_REPRESENT@_Relation r = pph.relation_with(ppl_c); + CAMLreturn(build_ocaml_poly_@A_RELATION_REPRESENT@_relation(r)); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@DIMENSION@_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_@DIMENSION@(value ph) try { + CAMLparam1(ph); + const @CPP_CLASS@& pph = *p_@CLASS@_val(ph); + dimension_type d = pph.@DIMENSION@(); + CAMLreturn(ppl_dimension_to_value(d)); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@HAS_PROPERTY@_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_@HAS_PROPERTY@(value ph) try { + CAMLparam1(ph); + const @CPP_CLASS@& pph = *p_@CLASS@_val(ph); + CAMLreturn(Val_bool(pph.@HAS_PROPERTY@())); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@SIMPLIFY@_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_@SIMPLIFY@(value ph) try { + CAMLparam1(ph); + @CPP_CLASS@& pph = *p_@CLASS@_val(ph); + pph.@SIMPLIFY@(); + CAMLreturn(Val_unit); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_bounds_from_@ABOVEBELOW@_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_bounds_from_@ABOVEBELOW@(value ph, value le) try { + CAMLparam2(ph, le); + const @CPP_CLASS@& pph = *p_@CLASS@_val(ph); + Linear_Expression ple = build_ppl_Linear_Expression(le); + CAMLreturn(Val_bool(pph.bounds_from_@ABOVEBELOW@(ple))); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_add_@CLASS_REPRESENT@(value ph, value c) try { + CAMLparam2(ph, c); + @CPP_CLASS@& pph = *p_@CLASS@_val(ph); + @!CLASS_REPRESENT@ pc = build_ppl_@!CLASS_REPRESENT@(c); + pph.add_@CLASS_REPRESENT@(pc); + CAMLreturn(Val_unit); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@s_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_add_@CLASS_REPRESENT@s(value ph, value cs) try { + CAMLparam2(ph, cs); + @CPP_CLASS@& pph = *p_@CLASS@_val(ph); + @!CLASS_REPRESENT@_System pcs = build_ppl_@!CLASS_REPRESENT@_System(cs); + pph.add_@CLASS_REPRESENT@s(pcs); + CAMLreturn(Val_unit); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_refine_with_@REFINE_REPRESENT@_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_refine_with_@REFINE_REPRESENT@(value ph, value c) try { + CAMLparam2(ph, c); + @CPP_CLASS@& pph = *p_@CLASS@_val(ph); + @!REFINE_REPRESENT@ pc = build_ppl_@!REFINE_REPRESENT@(c); + pph.refine_with_@REFINE_REPRESENT@(pc); + CAMLreturn(Val_unit); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_refine_with_@REFINE_REPRESENT@s_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_refine_with_@REFINE_REPRESENT@s(value ph, value cs) try { + CAMLparam2(ph, cs); + @CPP_CLASS@& pph = *p_@CLASS@_val(ph); + @!REFINE_REPRESENT@_System pcs = build_ppl_@!REFINE_REPRESENT@_System(cs); + pph.refine_with_@REFINE_REPRESENT@s(pcs); + CAMLreturn(Val_unit); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@COMPARISON@_@CLASS@_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_@COMPARISON@_@CLASS@(value ph1, value ph2) try { + CAMLparam2(ph1, ph2); + const @CPP_CLASS@& pph1 = *p_@CLASS@_val(ph1); + const @CPP_CLASS@& pph2 = *p_@CLASS@_val(ph2); + CAMLreturn(Val_bool(pph1.@COMPARISON@(pph2))); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_equals_@CLASS@_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_equals_@CLASS@(value ph1, value ph2) try { + CAMLparam2(ph1, ph2); + const @CPP_CLASS@& pph1 = *p_@CLASS@_val(ph1); + const @CPP_CLASS@& pph2 = *p_@CLASS@_val(ph2); + CAMLreturn(Val_bool(pph1 == pph2)); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@BINOP@_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_@BINOP@(value ph1, value ph2) try { + CAMLparam2(ph1, ph2); + @CPP_CLASS@& pph1 = *p_@CLASS@_val(ph1); + @CPP_CLASS@& pph2 = *p_@CLASS@_val(ph2); + pph1.@BINOP@(pph2); + CAMLreturn(Val_unit); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_simplify_using_context_assign_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_simplify_using_context_assign(value ph1, value ph2) try { + CAMLparam2(ph1, ph2); + @CPP_CLASS@& pph1 = *p_@CLASS@_val(ph1); + @CPP_CLASS@& pph2 = *p_@CLASS@_val(ph2); + CAMLreturn(Val_bool(pph1.simplify_using_context_assign(pph2))); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@ +(value ph, value d) try { + CAMLparam2(ph, d); + dimension_type dd = value_to_ppl_dimension(d); + @CPP_CLASS@& pph = *p_@CLASS@_val(ph); + pph.add_space_dimensions_and_embed(dd); + CAMLreturn(Val_unit); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_remove_space_dimensions_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_remove_space_dimensions(value ph, value caml_vset) try { + CAMLparam2(ph, caml_vset); + @CPP_CLASS@& pph = *p_@CLASS@_val(ph); + pph.remove_space_dimensions(build_ppl_Variables_Set(caml_vset)); + CAMLreturn(Val_unit); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_remove_higher_space_dimensions_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_remove_higher_space_dimensions(value ph, value d) try { + CAMLparam2(ph, d); + dimension_type dd = value_to_ppl_dimension(d); + @CPP_CLASS@& pph = *p_@CLASS@_val(ph); + pph.remove_higher_space_dimensions(dd); + CAMLreturn(Val_unit); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_fold_space_dimensions_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_fold_space_dimensions +(value ph, value caml_vset, value caml_dim) try { + CAMLparam1(ph); + dimension_type ppl_dim = Int_val(caml_dim); + @CPP_CLASS@& pph = *p_@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_@CLASS@_map_space_dimensions_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_map_space_dimensions(value ph, value caml_mapped_dims) try { + CAMLparam2(ph, caml_mapped_dims); + CAMLlocal1(head); + @CPP_CLASS@& pph = *p_@CLASS@_val(ph); + Partial_Function pfunc; + while (caml_mapped_dims != Val_emptylist) { + head = Field(caml_mapped_dims, 0); + dimension_type domain_dim = value_to_ppl_dimension(Field(head, 0)); + 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_@CLASS@_expand_space_dimension_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_expand_space_dimension +(value ph, value var_index, value m) try { + CAMLparam3(ph, var_index, m); + Variable var = build_ppl_Variable(var_index); + dimension_type c_m = value_to_ppl_dimension(m); + @CPP_CLASS@& pph = *p_@CLASS@_val(ph); + pph.expand_space_dimension(var, c_m); + CAMLreturn(Val_unit); +} +CATCH_ALL + +') + + +m4_define(`ppl_@CLASS@_get_@CLASS_REPRESENT@s_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_get_@CLASS_REPRESENT@s(value ph) try { + CAMLparam1(ph); + @CPP_CLASS@& pph = *p_@CLASS@_val(ph); + CAMLreturn(build_ocaml_@CLASS_REPRESENT@_system(pph.@CLASS_REPRESENT@s())); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_get_minimized_@CLASS_REPRESENT@s_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_get_minimized_@CLASS_REPRESENT@s(value ph) try { + CAMLparam1(ph); + @CPP_CLASS@& pph = *p_@CLASS@_val(ph); + CAMLreturn(build_ocaml_@CLASS_REPRESENT@_system(pph.minimized_@CLASS_REPRESENT@s())); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_constrains_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_constrains(value ph, value var) try { + CAMLparam2(ph, var); + @CPP_CLASS@& pph = *p_@CLASS@_val(ph); + CAMLreturn(Val_bool(pph.constrains(build_ppl_Variable(var)))); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_unconstrain_space_dimension_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_unconstrain_space_dimension(value ph, value var) try { + CAMLparam2(ph, var); + @CPP_CLASS@& pph = *p_@CLASS@_val(ph); + pph.unconstrain(build_ppl_Variable(var)); + CAMLreturn(Val_unit); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_unconstrain_space_dimensions_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_unconstrain_space_dimensions(value ph, value caml_vset) try { + CAMLparam2(ph, caml_vset); + @CPP_CLASS@& pph = *p_@CLASS@_val(ph); + pph.unconstrain(build_ppl_Variables_Set(caml_vset)); + CAMLreturn(Val_unit); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_bounded_@AFFIMAGE@_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_bounded_@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_@CLASS@_val(ph); + pph.bounded_@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_@CLASS@_@AFFIMAGE@_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_@AFFIMAGE@ +(value ph, value var, value expr, value coeff) try { + CAMLparam4(ph, var, expr, coeff); + @CPP_CLASS@& pph = *p_@CLASS@_val(ph); + build_ppl_Linear_Expression(expr); + pph.@AFFIMAGE@(build_ppl_Variable(var), + build_ppl_Linear_Expression(expr), + build_ppl_Coefficient(coeff)); + CAMLreturn(Val_unit); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_generalized_@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_@CLASS@_val(ph); + pph.generalized_@AFFIMAGE@(build_ppl_Linear_Expression(le1), + build_ppl_relsym(rel_sym), + build_ppl_Linear_Expression(le2)); + CAMLreturn(Val_unit); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_generalized_@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_@CLASS@_val(ph); + pph.generalized_@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_@CLASS@_generalized_@AFFIMAGE@_with_congruence_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_generalized_@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_@CLASS@_val(ph); + pph.generalized_@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_@CLASS@_generalized_@AFFIMAGE@1_with_congruence_bytecode +(value* argv, int /*argn*/) try { + return ppl_@CLASS@_generalized_@AFFIMAGE@1_with_congruence + (argv[0], argv[1], argv[2], argv[3], argv[4], argv[5]); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_generalized_@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_@CLASS@_val(ph); + pph.generalized_@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_@CLASS@_@WIDEN@_widening_assign_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_@WIDEN@_widening_assign(value ph1, value ph2) try { + CAMLparam2(ph1, ph2); + @CPP_CLASS@& pph1 = *p_@CLASS@_val(ph1); + @CPP_CLASS@& pph2 = *p_@CLASS@_val(ph2); + pph1.@WIDEN@_widening_assign(pph2); + CAMLreturn(Val_unit); +} +CATCH_ALL + +') + + +m4_define(`ppl_@CLASS@_@WIDEN@_widening_assign_with_tokens_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_@WIDEN@_widening_assign_with_tokens +(value ph1, value ph2, value tokens) try { + CAMLparam3(ph1, ph2, tokens); + @CPP_CLASS@& pph1 = *p_@CLASS@_val(ph1); + @CPP_CLASS@& pph2 = *p_@CLASS@_val(ph2); + unsigned u_tokens = value_to_unsigned(tokens); + pph1.@WIDEN@_widening_assign(pph2, &u_tokens); + CAMLreturn(Val_long(u_tokens)); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_widening_assign_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_widening_assign(value ph1, value ph2) try { + CAMLparam2(ph1, ph2); + @CPP_CLASS@& pph1 = *p_@CLASS@_val(ph1); + @CPP_CLASS@& pph2 = *p_@CLASS@_val(ph2); + pph1.widening_assign(pph2); + CAMLreturn(Val_unit); +} +CATCH_ALL + +') + + +m4_define(`ppl_@CLASS@_widening_assign_with_tokens_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_widening_assign_with_tokens +(value ph1, value ph2, value tokens) try { + CAMLparam3(ph1, ph2, tokens); + @CPP_CLASS@& pph1 = *p_@CLASS@_val(ph1); + @CPP_CLASS@& pph2 = *p_@CLASS@_val(ph2); + unsigned u_tokens = value_to_unsigned(tokens); + pph1.widening_assign(pph2, &u_tokens); + CAMLreturn(Val_long(u_tokens)); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_with_tokens_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_@LIMITEDBOUNDED@_@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_@CLASS@_val(ph1); + @CPP_CLASS@& pph2 = *p_@CLASS@_val(ph2); + @!CONSTRAINER@_System ppl_cs = build_ppl_@!CONSTRAINER@_System(caml_cs); + unsigned u_tokens = value_to_unsigned(tokens); + pph1.@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign(pph2, ppl_cs, + &u_tokens); + CAMLreturn(Val_long(u_tokens)); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign(value ph1, + value ph2, + value caml_cs) try { + CAMLparam3(ph1, ph2, caml_cs); + @CPP_CLASS@& pph1 = *p_@CLASS@_val(ph1); + @CPP_CLASS@& pph2 = *p_@CLASS@_val(ph2); + @!CONSTRAINER@_System ppl_cs = build_ppl_@!CONSTRAINER@_System(caml_cs); + pph1.@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign(pph2, ppl_cs); + CAMLreturn(Val_unit); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@MAXMIN@_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_@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_@CLASS@_val(ph); + bool ppl_return_value = pph.@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_@CLASS@_@MAXMIN@_with_point_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_@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_@CLASS@_val(ph); + bool ppl_return_value = pph.@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_@CLASS@_OK_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_OK(value ph) try { + CAMLparam1(ph); + @CPP_CLASS@& pph = *p_@CLASS@_val(ph); + CAMLreturn(Val_bool(pph.OK())); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@MEMBYTES@_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_@MEMBYTES@(value ph) try { + CAMLparam1(ph); + @CPP_CLASS@& pph = *p_@CLASS@_val(ph); + CAMLreturn(Val_long(pph.@MEMBYTES@())); +} +CATCH_ALL + + ') + +m4_define(`ppl_@CLASS@_swap_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_swap(value ph1, value ph2) try { + CAMLparam2(ph1, ph2); + @CPP_CLASS@& pph1 = *p_@CLASS@_val(ph1); + @CPP_CLASS@& pph2 = *p_@CLASS@_val(ph2); + pph1.swap(pph2); + CAMLreturn(Val_unit); +} +CATCH_ALL + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_code', +`dnl +extern "C" +CAMLprim value +ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@(value ph) try { + CAMLparam1(ph); + @B_FRIEND@& pph = *(reinterpret_cast<@B_FRIEND@*>( p_@A_FRIEND@_val(ph))); + @CPP_CLASS@& ppl_value + = *(reinterpret_cast<@CPP_CLASS@*>(new @TOPOLOGY@@CPP_CLASS@(pph))); + CAMLreturn(unregistered_value_p_@CLASS@(ppl_value)); +} +CATCH_ALL + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_with_complexity_code', +`dnl +extern "C" +CAMLprim value +ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_with_complexity(value ph, value caml_cc) try { + CAMLparam1(ph); + @B_FRIEND@& pph = *(reinterpret_cast<@B_FRIEND@*>( p_@A_FRIEND@_val(ph))); + 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_@CLASS@(ppl_value)); +} +CATCH_ALL + +') + + +m4_define(`ppl_@CLASS@_@UB_EXACT@_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_@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(*p_Polyhedron_val(ph1)); + const C_Polyhedron& yy + = static_cast(*p_Polyhedron_val(ph2)); + CAMLreturn(Val_bool(xx.upper_bound_assign_if_exact(yy))); + } + else { + NNC_Polyhedron& xx + = static_cast(*p_Polyhedron_val(ph1)); + const NNC_Polyhedron& yy + = static_cast(*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_@CLASS@_val(ph1); + const @CPP_CLASS@& pph2 = *p_@CLASS@_val(ph2); + + CAMLreturn(Val_bool(pph1.@UB_EXACT@(pph2))); +') + +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign +(value ph1, value ph2) try { + CAMLparam2(ph1, ph2); + @CPP_CLASS@& pph1 = *p_@CLASS@_val(ph1); + @CPP_CLASS@& pph2 = *p_@CLASS@_val(ph2); + pph1.@EXTRAPOLATION@_extrapolation_assign(pph2); + CAMLreturn(Val_unit); +} +CATCH_ALL + +') + + +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_with_tokens_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_with_tokens +(value ph1, value ph2, value tokens) try { + CAMLparam3(ph1, ph2, tokens); + @CPP_CLASS@& pph1 = *p_@CLASS@_val(ph1); + @CPP_CLASS@& pph2 = *p_@CLASS@_val(ph2); + unsigned u_tokens = value_to_unsigned(tokens); + pph1.@EXTRAPOLATION@_extrapolation_assign(pph2, &u_tokens); + CAMLreturn(Val_long(u_tokens)); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_narrowing_assign_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_@EXTRAPOLATION@_narrowing_assign(value ph1, + value ph2) try { + CAMLparam2(ph1, ph2); + @CPP_CLASS@& pph1 = *p_@CLASS@_val(ph1); + const @CPP_CLASS@& pph2 = *p_@CLASS@_val(ph2); + pph1.@EXTRAPOLATION@_narrowing_assign(pph2); + CAMLreturn(Val_unit); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@BEGINEND@_iterator_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_@BEGINEND@_iterator(value t_pps) try { + CAMLparam1(t_pps); + @CPP_CLASS@& pps = *p_@CLASS@_val(t_pps); + @CPP_CLASS@::iterator& ppl_value + = *new @CPP_CLASS@::iterator(pps.@BEGINEND@()); + CAMLreturn(unregistered_value_p_@CLASS@_iterator(ppl_value)); +} +CATCH_ALL + +') + + +m4_define(`ppl_@CLASS@_get_disjunct_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_get_disjunct(value caml_it) try { + CAMLparam1(caml_it); + CAMLlocal1(caml_return_value); + @CPP_CLASS@::iterator& cpp_it = *p_@CLASS@_iterator_val(caml_it); + @DISJUNCT_TOPOLOGY@@A_DISJUNCT@ disjunct = cpp_it->element(); + caml_return_value = unregistered_value_p_@DISJUNCT@(disjunct); + actual_p_@DISJUNCT@_val(caml_return_value) = mark(&disjunct); + CAMLreturn(caml_return_value); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_add_disjunct_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_add_disjunct(value t_pps, value caml_item_to_add) try { + CAMLparam2(t_pps, caml_item_to_add); + @CPP_CLASS@& pps = *p_@CLASS@_val(t_pps); + @DISJUNCT_TOPOLOGY@@A_DISJUNCT@& item + = *(reinterpret_cast<@DISJUNCT_TOPOLOGY@@A_DISJUNCT@*> + (p_@DISJUNCT@_val(caml_item_to_add))); + pps.add_disjunct(item); + CAMLreturn(Val_unit); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_drop_disjunct_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_drop_disjunct(value t_pps, value caml_item_to_drop) try { + CAMLparam2(t_pps, caml_item_to_drop); + @CPP_CLASS@& pps = *p_@CLASS@_val(t_pps); + @CPP_CLASS@::iterator& itr = *p_@CLASS@_iterator_val(caml_item_to_drop); + itr = pps.drop_disjunct(itr); + CAMLreturn(Val_unit); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_drop_disjuncts_code', +`dnl +extern "C" +CAMLprim value +ppl_@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_@CLASS@_val(t_pps); + @CPP_CLASS@::iterator& itr1 = *p_@CLASS@_iterator_val(caml_item1_to_drop); + @CPP_CLASS@::iterator& itr2 = *p_@CLASS@_iterator_val(caml_item2_to_drop); + pps.drop_disjuncts(itr1, itr2); + CAMLreturn(Val_unit); +} +CATCH_ALL + +') + +m4_define(`ppl_new_@CLASS@_iterator_from_iterator_code', +`dnl +//! Give access to the embedded @CLASS@* in \p v. +inline @CPP_CLASS@::iterator*& +p_@CLASS@_iterator_val(value v) { + return *reinterpret_cast<@CPP_CLASS@::iterator**>(Data_custom_val(v)); +} + +void +custom_@CLASS@_iterator_finalize(value v) { + delete p_@CLASS@_iterator_val(v); +} + +struct custom_operations @CLASS@_iterator_custom_operations = { + "it.unipr.cs.ppl" "." PPL_VERSION "." "@CLASS@_iterator"|COMMA| + custom_@CLASS@_iterator_finalize|COMMA| + custom_compare_default|COMMA| + custom_hash_default|COMMA| + custom_serialize_default|COMMA| + custom_deserialize_default +}; + +inline value +unregistered_value_p_@CLASS@_iterator(const @CPP_CLASS@::iterator& ph) { + value v = caml_alloc_custom(&@CLASS@_iterator_custom_operations, + sizeof(@CPP_CLASS@::iterator*), 0, 1); + p_@CLASS@_iterator_val(v) = const_cast<@CPP_CLASS@::iterator*>(&ph); + return v; +} + +extern "C" +CAMLprim value +ppl_new_@CLASS@_iterator_from_iterator(value y) try { + CAMLparam1(y); + @CPP_CLASS@::iterator& yy + = *(reinterpret_cast<@CPP_CLASS@::iterator*>( p_@CLASS@_iterator_val(y))); + @CPP_CLASS@::iterator& ppl_value + = *(reinterpret_cast<@CPP_CLASS@::iterator*>(new @CPP_CLASS@::iterator(yy))); + CAMLreturn(unregistered_value_p_@CLASS@_iterator(ppl_value)); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_@INCDEC@_iterator_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_@INCDEC@_iterator(value caml_itr) try { + CAMLparam1(caml_itr); + @CPP_CLASS@::iterator& itr = *p_@CLASS@_iterator_val(caml_itr); + m4_@INCDEC@_cpp_name()itr; + CAMLreturn(Val_unit); +} +CATCH_ALL + +') + +m4_define(`m4_increment_cpp_name', `++') +m4_define(`m4_decrement_cpp_name', `--') + +m4_define(`ppl_@CLASS@_iterator_equals_iterator_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_iterator_equals_iterator(value caml_itr1, value caml_itr2) try { + CAMLparam2(caml_itr1, caml_itr2); + @CPP_CLASS@::iterator& itr1 = *p_@CLASS@_iterator_val(caml_itr1); + @CPP_CLASS@::iterator& itr2 = *p_@CLASS@_iterator_val(caml_itr2); + if (itr1 == itr2) + CAMLreturn(Val_bool(true)); + else + CAMLreturn(Val_bool(false)); +} +CATCH_ALL + +') + + +m4_define(`ppl_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign +(value ph1, value ph2) try { + CAMLparam2(ph1, ph2); + @CPP_CLASS@& pph1 = *p_@CLASS@_val(ph1); + @CPP_CLASS@& pph2 = *p_@CLASS@_val(ph2); + pph1.BHZ03_widening_assign<@A_DISJUNCT_WIDEN@_Certificate> + (pph2, + widen_fun_ref(&@DISJUNCT_TOPOLOGY@@A_DISJUNCT@::@DISJUNCT_WIDEN@_widening_assign));; + CAMLreturn(Val_unit); +} +CATCH_ALL + +') + +m4_define(`ppl_@CLASS@_BGP99_@DISJUNCT_WIDEN@_extrapolation_assign_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_BGP99_@DISJUNCT_WIDEN@_extrapolation_assign +(value ph1, value ph2, value max_disj) try { + CAMLparam2(ph1, ph2); + @CPP_CLASS@& pph1 = *p_@CLASS@_val(ph1); + @CPP_CLASS@& pph2 = *p_@CLASS@_val(ph2); + unsigned cpp_max_disj + = value_to_unsigned(max_disj); + pph1.BGP99_extrapolation_assign + (pph2, + widen_fun_ref(&@DISJUNCT_TOPOLOGY@@A_DISJUNCT@::@DISJUNCT_WIDEN@_widening_assign), + cpp_max_disj); + CAMLreturn(Val_unit); +} +CATCH_ALL + +') + + +m4_define(`ppl_@CLASS@_ascii_dump_code', +`dnl +extern "C" +CAMLprim value +ppl_@CLASS@_ascii_dump(value ph1) try { + CAMLparam1(ph1); + @CPP_CLASS@& pph1 = *p_@CLASS@_val(ph1); + std::ostringstream s; + pph1.ascii_dump(s); + CAMLreturn(caml_copy_string(s.str().c_str())); +} +CATCH_ALL + +') + + +m4_define(`ppl_@CLASS@_linear_@PARTITION@_code', ` +extern "C" +CAMLprim value +ppl_@CLASS@_linear_@PARTITION@(value ph1, value ph2) try { + CAMLparam2(ph1, ph2); + CAMLlocal1(caml_return_value); + @CPP_CLASS@* rfh; + Pointset_Powerset* 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_@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(*p_Polyhedron_val(ph1)); + C_Polyhedron& pph2 + = reinterpret_cast(*p_Polyhedron_val(ph2)); + std::pair > + r = linear_partition(pph1, pph2); + rfh = new C_Polyhedron(0, EMPTY); + rsh = new Pointset_Powerset(0, EMPTY); + rfh->swap(r.first); + rsh->swap(r.second); + } + else { + NNC_Polyhedron& pph1 + = reinterpret_cast(*p_Polyhedron_val(ph1)); + NNC_Polyhedron& pph2 + = reinterpret_cast(*p_Polyhedron_val(ph2)); + std::pair > + r = linear_partition(pph1, pph2); + rfh = new NNC_Polyhedron(0, EMPTY); + rsh = new Pointset_Powerset(0, EMPTY); + rfh->swap(r.first); + rsh->swap(r.second); + } +') + +m4_define(`m4_linear_partition_for_non_polyhedron_domains', +`dnl + @CPP_CLASS@& pph1 + = reinterpret_cast<@CPP_CLASS@&>(*p_@CLASS@_val(ph1)); + @CPP_CLASS@& pph2 + = reinterpret_cast<@CPP_CLASS@&>(*p_@CLASS@_val(ph2)); + std::pair<@CPP_CLASS@|COMMA| Pointset_Powerset > + r = linear_partition(pph1, pph2); + rfh = new @CPP_CLASS@(0, EMPTY); + rsh = new Pointset_Powerset(0, EMPTY); + rfh->swap(r.first); + rsh->swap(r.second); +') + +m4_define(`ppl_@CLASS@_approximate_@PARTITION@_code', ` +extern "C" +CAMLprim value +ppl_@CLASS@_approximate_@PARTITION@(value ph1, value ph2) try { + CAMLparam2(ph1, ph2); + CAMLlocal1(caml_return_value); + @CPP_CLASS@& pph1 + = reinterpret_cast<@CPP_CLASS@&>(*p_@CPP_CLASS@_val(ph1)); + @CPP_CLASS@& pph2 + = reinterpret_cast<@CPP_CLASS@&>(*p_@CPP_CLASS@_val(ph2)); + bool is_finite = false; + std::pair<@CPP_CLASS@|COMMA| Pointset_Powerset > + r = approximate_partition(pph1, pph2, is_finite); + @CPP_CLASS@* rfh = new @CPP_CLASS@(0, EMPTY); + Pointset_Powerset* rsh = new Pointset_Powerset(0, EMPTY); + rfh->swap(r.first); + rsh->swap(r.second); + caml_return_value = caml_alloc(3, 0); + Store_field(caml_return_value, 0, + unregistered_value_p_@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 + +') 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..f711c50 --- /dev/null +++ b/interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4 @@ -0,0 +1,63 @@ +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-2009 Roberto Bagnara +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://www.cs.unipr.it/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 + +%<--%<--%<-- ppl_ocaml_`'m4_current_interface`'.cc +/* 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 +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..cfb0400 --- /dev/null +++ b/interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4 @@ -0,0 +1,65 @@ +dnl Used by ppl_interfaces_generator_ocaml_hh_files.m4 +dnl for generating the access code for the OCaml interface. +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/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_@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_@CLASS@_val(value v) { + return *reinterpret_cast<@CPP_CLASS@**>(Data_custom_val(v)); +} + +inline void +custom_@CLASS@_finalize(value v) { + if (!marked(actual_p_@CLASS@_val(v))) + delete actual_p_@CLASS@_val(v); +} + +inline value +unregistered_value_p_@CLASS@(const @CPP_CLASS@& ph) { + extern struct custom_operations @CLASS@_custom_operations; + value v = caml_alloc_custom(&@CLASS@_custom_operations, + sizeof(@CPP_CLASS@*), 0, 1); + actual_p_@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..b1f1e8f --- /dev/null +++ b/interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4 @@ -0,0 +1,60 @@ +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-2009 Roberto Bagnara +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://www.cs.unipr.it/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 +%<--%<--%<-- ppl_ocaml_domains.hh +`#'include "ppl_ocaml_`'m4_current_interface.hh" +%<--%<--%<-- ppl_ocaml_`'m4_current_interface.hh +/* 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 +%<--%<--%<-- ppl_ocaml_domains.hh +/* 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 +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..d3d5b5b --- /dev/null +++ b/interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4 @@ -0,0 +1,61 @@ +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-2009 Roberto Bagnara +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://www.cs.unipr.it/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..ad89b6d --- /dev/null +++ b/interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4 @@ -0,0 +1,548 @@ +dnl -*- Tuareg -*- +sm4_divert(-1) + +This m4 file contains the program code for generating ppl_ocaml.ml + +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/ppl/ . + +dnl No code is needed for these procedure schemas in the OCaml interface. +dnl +m4_define(`ppl_delete_@CLASS@_code', `') +m4_define(`ppl_delete_@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_@TOPOLOGY@@CLASS@_from_space_dimension_code', +`dnl +external ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension: + int -> degenerate_element -> @!CLASS@ + = "ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension" + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@BUILD_REPRESENT@s_code', +`dnl +external ppl_new_@TOPOLOGY@@CLASS@_from_@BUILD_REPRESENT@s: + @BUILD_REPRESENT@_system -> @!CLASS@ + = "ppl_new_@TOPOLOGY@@CLASS@_from_@BUILD_REPRESENT@s" + +') + +m4_define(`ppl_@CLASS@_relation_with_@RELATION_REPRESENT@_code', +`dnl +external ppl_@CLASS@_relation_with_@RELATION_REPRESENT@: + @!CLASS@ -> linear_@RELATION_REPRESENT@ + -> poly_@A_RELATION_REPRESENT@_relation list + = "ppl_@CLASS@_relation_with_@RELATION_REPRESENT@" + +') + +m4_define(`ppl_@CLASS@_@DIMENSION@_code', +`dnl +external ppl_@CLASS@_@DIMENSION@: + @!CLASS@ -> int = "ppl_@CLASS@_@DIMENSION@" +') + +m4_define(`ppl_@CLASS@_@HAS_PROPERTY@_code', +`dnl +external ppl_@CLASS@_@HAS_PROPERTY@: + @!CLASS@ -> bool = "ppl_@CLASS@_@HAS_PROPERTY@" + + +') + +m4_define(`ppl_@CLASS@_@SIMPLIFY@_code', +`dnl +external ppl_@CLASS@_@SIMPLIFY@: + @!CLASS@ -> unit = "ppl_@CLASS@_@SIMPLIFY@" + + +') + +m4_define(`ppl_@CLASS@_bounds_from_@ABOVEBELOW@_code', +`dnl +external ppl_@CLASS@_bounds_from_@ABOVEBELOW@: + @!CLASS@ -> linear_expression -> bool + = "ppl_@CLASS@_bounds_from_@ABOVEBELOW@" + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@_code', +`dnl +external ppl_@CLASS@_add_@CLASS_REPRESENT@: + @!CLASS@ -> linear_@CLASS_REPRESENT@ -> unit + = "ppl_@CLASS@_add_@CLASS_REPRESENT@" + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@s_code', +`dnl +external ppl_@CLASS@_add_@CLASS_REPRESENT@s: + @!CLASS@ -> @CLASS_REPRESENT@_system -> unit + = "ppl_@CLASS@_add_@CLASS_REPRESENT@s" + +') + +m4_define(`ppl_@CLASS@_refine_with_@REFINE_REPRESENT@_code', +`dnl +external ppl_@CLASS@_refine_with_@REFINE_REPRESENT@: + @!CLASS@ -> linear_@REFINE_REPRESENT@ -> unit + = "ppl_@CLASS@_refine_with_@REFINE_REPRESENT@" + +') + +m4_define(`ppl_@CLASS@_refine_with_@REFINE_REPRESENT@s_code', +`dnl +external ppl_@CLASS@_refine_with_@REFINE_REPRESENT@s: + @!CLASS@ -> @REFINE_REPRESENT@_system -> unit + = "ppl_@CLASS@_refine_with_@REFINE_REPRESENT@s" + +') + +m4_define(`ppl_@CLASS@_@COMPARISON@_@CLASS@_code', +`dnl +external ppl_@CLASS@_@COMPARISON@_@CLASS@: + @!CLASS@ -> @!CLASS@ -> bool + = "ppl_@CLASS@_@COMPARISON@_@CLASS@" + +') + +m4_define(`ppl_@CLASS@_equals_@CLASS@_code', +`dnl +external ppl_@CLASS@_equals_@CLASS@: + @!CLASS@ -> @!CLASS@ -> bool + = "ppl_@CLASS@_equals_@CLASS@" + +') + + +m4_define(`ppl_@CLASS@_@BINOP@_code', +`dnl +external ppl_@CLASS@_@BINOP@: + @!CLASS@ -> @!CLASS@ -> unit + = "ppl_@CLASS@_@BINOP@" + +') + +m4_define(`ppl_@CLASS@_simplify_using_context_assign_code', +`dnl +external ppl_@CLASS@_simplify_using_context_assign: + @!CLASS@ -> @!CLASS@ -> bool + = "ppl_@CLASS@_simplify_using_context_assign" + +') + +m4_define(`ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@_code', +`dnl +external ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@: + @!CLASS@ -> int -> unit + = "ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@" + +') + +m4_define(`ppl_@CLASS@_remove_space_dimensions_code', +`dnl +external ppl_@CLASS@_remove_space_dimensions: + @!CLASS@ -> int list -> unit + = "ppl_@CLASS@_remove_space_dimensions" + +') + +m4_define(`ppl_@CLASS@_remove_higher_space_dimensions_code', +`dnl +external ppl_@CLASS@_remove_higher_space_dimensions: + @!CLASS@ -> int -> unit + = "ppl_@CLASS@_remove_higher_space_dimensions" + +') + +m4_define(`ppl_@CLASS@_fold_space_dimensions_code', +`dnl +external ppl_@CLASS@_fold_space_dimensions: + @!CLASS@ -> int list -> int -> unit + = "ppl_@CLASS@_fold_space_dimensions" + +') + +m4_define(`ppl_@CLASS@_map_space_dimensions_code', +`dnl +external ppl_@CLASS@_map_space_dimensions: + @!CLASS@ -> (int*int) list -> unit + = "ppl_@CLASS@_map_space_dimensions" + +') + +m4_define(`ppl_@CLASS@_expand_space_dimension_code', +`dnl +external ppl_@CLASS@_expand_space_dimension: + @!CLASS@ -> int -> int -> unit + = "ppl_@CLASS@_expand_space_dimension" + +') + +m4_define(`ppl_@CLASS@_get_@CLASS_REPRESENT@s_code', +`dnl +external ppl_@CLASS@_get_@CLASS_REPRESENT@s: + @!CLASS@ -> @CLASS_REPRESENT@_system + = "ppl_@CLASS@_get_@CLASS_REPRESENT@s" + +') + +m4_define(`ppl_@CLASS@_get_minimized_@CLASS_REPRESENT@s_code', +`dnl +external ppl_@CLASS@_get_minimized_@CLASS_REPRESENT@s: + @!CLASS@ -> @CLASS_REPRESENT@_system + = "ppl_@CLASS@_get_minimized_@CLASS_REPRESENT@s" + +') + +m4_define(`ppl_@CLASS@_constrains_code', +`dnl +external ppl_@CLASS@_constrains: + @!CLASS@ -> int -> bool + = "ppl_@CLASS@_constrains" + +') + +m4_define(`ppl_@CLASS@_unconstrain_space_dimension_code', +`dnl +external ppl_@CLASS@_unconstrain_space_dimension: + @!CLASS@ -> int -> unit + = "ppl_@CLASS@_unconstrain_space_dimension" + +') + +m4_define(`ppl_@CLASS@_unconstrain_space_dimensions_code', +`dnl +external ppl_@CLASS@_unconstrain_space_dimensions: + @!CLASS@ -> int list -> unit + = "ppl_@CLASS@_unconstrain_space_dimensions" + +') + +m4_define(`ppl_@CLASS@_bounded_@AFFIMAGE@_code', +`dnl +external ppl_@CLASS@_bounded_@AFFIMAGE@: + @!CLASS@ -> int -> linear_expression + -> linear_expression -> Z.t -> unit + = "ppl_@CLASS@_bounded_@AFFIMAGE@" + +') + +m4_define(`ppl_@CLASS@_@AFFIMAGE@_code', +`dnl +external ppl_@CLASS@_@AFFIMAGE@: + @!CLASS@ -> int -> linear_expression -> Z.t -> unit + = "ppl_@CLASS@_@AFFIMAGE@" + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_code', +`dnl +external ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs: + @!CLASS@ -> linear_expression + -> relation_symbol -> linear_expression -> unit + = "ppl_@CLASS@_generalized_@AFFIMAGE@1" + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_code', +`dnl +external ppl_@CLASS@_generalized_@AFFIMAGE@: + @!CLASS@ -> int -> relation_symbol + -> linear_expression -> Z.t -> unit + = "ppl_@CLASS@_generalized_@AFFIMAGE@2" + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_with_congruence_code', +`dnl +external ppl_@CLASS@_generalized_@AFFIMAGE@_with_congruence: + @!CLASS@ -> int -> relation_symbol + -> linear_expression -> Z.t -> Z.t -> unit + = "ppl_@CLASS@_generalized_@AFFIMAGE@1_with_congruence_bytecode" "ppl_@CLASS@_generalized_@AFFIMAGE@1_with_congruence" + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence_code', +`dnl +external ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence: + @!CLASS@ -> linear_expression -> relation_symbol + -> linear_expression -> Z.t -> unit + = "ppl_@CLASS@_generalized_@AFFIMAGE@1_lhs_rhs_with_congruence" + +') + +m4_define(`ppl_@CLASS@_@WIDEN@_widening_assign_code', +`dnl +external ppl_@CLASS@_@WIDEN@_widening_assign: + @!CLASS@ -> @!CLASS@ -> unit + = "ppl_@CLASS@_@WIDEN@_widening_assign" + +') + +m4_define(`ppl_@CLASS@_@WIDEN@_widening_assign_with_tokens_code', +`dnl +external ppl_@CLASS@_@WIDEN@_widening_assign_with_tokens: + @!CLASS@ -> @!CLASS@ -> int -> int + = "ppl_@CLASS@_@WIDEN@_widening_assign_with_tokens" + +') + +m4_define(`ppl_@CLASS@_widening_assign_code', +`dnl +external ppl_@CLASS@_widening_assign: + @!CLASS@ -> @!CLASS@ -> unit + = "ppl_@CLASS@_widening_assign" + +') + +m4_define(`ppl_@CLASS@_widening_assign_with_tokens_code', +`dnl +external ppl_@CLASS@_widening_assign_with_tokens: + @!CLASS@ -> @!CLASS@ -> int -> int + = "ppl_@CLASS@_widening_assign_with_tokens" + +') + +m4_define(`ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_code', +`dnl +external ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign: + @!CLASS@ -> @!CLASS@ -> @CONSTRAINER@_system -> unit + = "ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign" + +') + +m4_define(`ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_with_tokens_code', +`dnl +external ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_with_tokens: + @!CLASS@ -> @!CLASS@ -> @CONSTRAINER@_system -> int -> int + = "ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_with_tokens" + +') + + +m4_define(`ppl_@CLASS@_@MAXMIN@_code', +`dnl +external ppl_@CLASS@_@MAXMIN@: + @!CLASS@ -> linear_expression + -> bool * Z.t * Z.t * bool + = "ppl_@CLASS@_@MAXMIN@" + +') + +m4_define(`ppl_@CLASS@_@MAXMIN@_with_point_code', +`dnl +external ppl_@CLASS@_@MAXMIN@_with_point: + @!CLASS@ -> linear_expression + -> bool * Z.t * Z.t * bool * linear_generator + = "ppl_@CLASS@_@MAXMIN@_with_point" + +') + +m4_define(`ppl_@CLASS@_OK_code', +`dnl +external ppl_@CLASS@_OK: + @!CLASS@ -> bool = "ppl_@CLASS@_OK" + +') + + +m4_define(`ppl_@CLASS@_@MEMBYTES@_code', + ` +external ppl_@CLASS@_@MEMBYTES@: + @!CLASS@ -> int = "ppl_@CLASS@_@MEMBYTES@" + +') + +m4_define(`ppl_@CLASS@_swap_code', +`dnl +external ppl_@CLASS@_swap: + @!CLASS@ -> @!CLASS@ -> unit + = "ppl_@CLASS@_swap" + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_code', +`dnl +external ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@: + @!A_FRIEND@ -> @!CLASS@ + = "ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@" + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_with_complexity_code', +`dnl +external ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_with_complexity: + @!A_FRIEND@ -> complexity_class -> @!CLASS@ + = "ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@" + +') + +m4_define(`ppl_@CLASS@_@UB_EXACT@_code', + `dnl + external ppl_@CLASS@_@UB_EXACT@: + @!CLASS@ -> @!CLASS@ -> bool + = "ppl_@CLASS@_@UB_EXACT@" + + ') + +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_with_tokens_code', + `dnl + external ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_with_tokens: + @!CLASS@ -> @!CLASS@ -> int -> int + = "ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_with_tokens" + + ') + + +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_code', + `dnl + external ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign: + @!CLASS@ -> @!CLASS@ -> unit + = "ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign" + + ') + + m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_narrowing_assign_code', + `dnl + external ppl_@CLASS@_@EXTRAPOLATION@_narrowing_assign: + @!CLASS@ -> @!CLASS@ -> unit + = "ppl_@CLASS@_@EXTRAPOLATION@_narrowing_assign" + + ') + + m4_define(`ppl_@CLASS@_@BEGINEND@_iterator_code', + ` +external ppl_@CLASS@_@BEGINEND@_iterator: + @!CLASS@ -> @!CLASS@_iterator + = "ppl_@CLASS@_@BEGINEND@_iterator" + +') + +m4_define(`ppl_@CLASS@_get_disjunct_code', + ` +external ppl_@CLASS@_get_disjunct: + @!CLASS@_iterator -> @!DISJUNCT@ + = "ppl_@CLASS@_get_disjunct" + +') + +m4_define(`ppl_@CLASS@_add_disjunct_code', + ` +external ppl_@CLASS@_add_disjunct: + @!CLASS@ -> @!DISJUNCT@ -> unit + = "ppl_@CLASS@_add_disjunct" + +') + +m4_define(`ppl_@CLASS@_drop_disjunct_code', + ` + external ppl_@CLASS@_drop_disjunct: + @!CLASS@ -> @!CLASS@_iterator -> unit + = "ppl_@CLASS@_drop_disjunct" + +') + +m4_define(`ppl_@CLASS@_drop_disjuncts_code', + ` + external ppl_@CLASS@_drop_disjuncts: + @!CLASS@ -> @!CLASS@_iterator -> @!CLASS@_iterator -> unit + = "ppl_@CLASS@_drop_disjuncts" + +') + +m4_define(`ppl_new_@CLASS@_iterator_from_iterator_code', +` +type @!CLASS@_iterator + +external ppl_new_@CLASS@_iterator_from_iterator: + @!CLASS@_iterator -> @!CLASS@_iterator + = "ppl_new_@CLASS@_iterator_from_iterator" + +') + +m4_define(`ppl_@CLASS@_@INCDEC@_iterator_code', + ` + external ppl_@CLASS@_@INCDEC@_iterator: + @!CLASS@_iterator -> unit + = "ppl_@CLASS@_@INCDEC@_iterator" + +') + +m4_define(`ppl_@CLASS@_iterator_equals_iterator_code', + ` +external ppl_@CLASS@_iterator_equals_iterator: + @!CLASS@_iterator -> @!CLASS@_iterator -> bool + = "ppl_@CLASS@_iterator_equals_iterator" + +') + +m4_define(`ppl_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign_code', +`dnl +external ppl_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign: + @!CLASS@ -> @!CLASS@ -> unit + = "ppl_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign" + +') + +m4_define(`ppl_@CLASS@_BGP99_@DISJUNCT_WIDEN@_extrapolation_assign_code', +`dnl +external ppl_@CLASS@_BGP99_@DISJUNCT_WIDEN@_extrapolation_assign: + @!CLASS@ -> @!CLASS@ -> int -> unit + = "ppl_@CLASS@_BGP99_@DISJUNCT_WIDEN@_extrapolation_assign" + +') + +m4_define(`ppl_@CLASS@_ascii_dump_code', +`dnl +external ppl_@CLASS@_ascii_dump: + @!CLASS@ -> string = "ppl_@CLASS@_ascii_dump" + +') + +m4_define(`ppl_@CLASS@_linear_@PARTITION@_code', +`dnl +external ppl_@CLASS@_linear_@PARTITION@: + @!CLASS@ -> @!CLASS@ -> @!CLASS@ * pointset_powerset_nnc_polyhedron + = "ppl_@CLASS@_linear_partition" + +') + +m4_define(`ppl_@CLASS@_approximate_@PARTITION@_code', +`dnl +external ppl_@CLASS@_approximate_@PARTITION@: + @!CLASS@ -> @!CLASS@ -> + @!CLASS@ * pointset_powerset_grid * bool + = "ppl_@CLASS@_approximate_partition" + +') + +m4_define(`ppl_@CLASS@_@MAXMIN@_code', +`dnl +external ppl_@CLASS@_@MAXMIN@: + @!CLASS@ -> linear_expression + -> bool * Z.t * Z.t * bool + = "ppl_@CLASS@_@MAXMIN@" + +') 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..746116a --- /dev/null +++ b/interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4 @@ -0,0 +1,59 @@ +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-2009 Roberto Bagnara +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://www.cs.unipr.it/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..25cdd54 --- /dev/null +++ b/interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4 @@ -0,0 +1,482 @@ +dnl -*- Tuareg -*- +m4_divert(-1) + +This m4 file contains the program code for generating ppl_ocaml.mli + +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/ppl/ . + +dnl No code is needed for these procedure schemas in the OCaml interface. +dnl +m4_define(`ppl_delete_@CLASS@_code', `') +m4_define(`ppl_delete_@CLASS@_iterator_code', `') + +Define here as empty any known schematic method macros for which +the definition is not yet implemented. + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension_code', +`dnl +val ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension: + int -> degenerate_element -> @!CLASS@ + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@BUILD_REPRESENT@s_code', +`dnl +val ppl_new_@TOPOLOGY@@CLASS@_from_@BUILD_REPRESENT@s: + @BUILD_REPRESENT@_system -> @!CLASS@ + +') + +m4_define(`ppl_@CLASS@_relation_with_@RELATION_REPRESENT@_code', +`dnl +val ppl_@CLASS@_relation_with_@RELATION_REPRESENT@: + @!CLASS@ -> linear_@RELATION_REPRESENT@ + -> poly_@A_RELATION_REPRESENT@_relation list + +') + +m4_define(`ppl_@CLASS@_@DIMENSION@_code', +`dnl +val ppl_@CLASS@_@DIMENSION@: + @!CLASS@ -> int +') + +m4_define(`ppl_@CLASS@_@HAS_PROPERTY@_code', +`dnl +val ppl_@CLASS@_@HAS_PROPERTY@: + @!CLASS@ -> bool + +') + +m4_define(`ppl_@CLASS@_@SIMPLIFY@_code', +`dnl +val ppl_@CLASS@_@SIMPLIFY@: + @!CLASS@ -> unit + +') + +m4_define(`ppl_@CLASS@_bounds_from_@ABOVEBELOW@_code', +`dnl +val ppl_@CLASS@_bounds_from_@ABOVEBELOW@: + @!CLASS@ -> linear_expression -> bool + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@_code', +`dnl +val ppl_@CLASS@_add_@CLASS_REPRESENT@: + @!CLASS@ -> linear_@CLASS_REPRESENT@ -> unit + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@s_code', +`dnl +val ppl_@CLASS@_add_@CLASS_REPRESENT@s: + @!CLASS@ -> @CLASS_REPRESENT@_system -> unit + +') + +m4_define(`ppl_@CLASS@_refine_with_@REFINE_REPRESENT@_code', +`dnl +val ppl_@CLASS@_refine_with_@REFINE_REPRESENT@: + @!CLASS@ -> linear_@REFINE_REPRESENT@ -> unit + +') + +m4_define(`ppl_@CLASS@_refine_with_@REFINE_REPRESENT@s_code', +`dnl +val ppl_@CLASS@_refine_with_@REFINE_REPRESENT@s: + @!CLASS@ -> @REFINE_REPRESENT@_system -> unit + +') + +m4_define(`ppl_@CLASS@_@COMPARISON@_@CLASS@_code', +`dnl +val ppl_@CLASS@_@COMPARISON@_@CLASS@: + @!CLASS@ -> @!CLASS@ -> bool + +') + +m4_define(`ppl_@CLASS@_equals_@CLASS@_code', +`dnl +val ppl_@CLASS@_equals_@CLASS@: + @!CLASS@ -> @!CLASS@ -> bool + +') + + +m4_define(`ppl_@CLASS@_@BINOP@_code', +`dnl +val ppl_@CLASS@_@BINOP@: + @!CLASS@ -> @!CLASS@ -> unit + +') + +m4_define(`ppl_@CLASS@_simplify_using_context_assign_code', +`dnl +val ppl_@CLASS@_simplify_using_context_assign: + @!CLASS@ -> @!CLASS@ -> bool + +') + +m4_define(`ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@_code', +`dnl +val ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@: + @!CLASS@ -> int -> unit + +') + +m4_define(`ppl_@CLASS@_remove_space_dimensions_code', +`dnl +val ppl_@CLASS@_remove_space_dimensions: + @!CLASS@ -> int list -> unit + +') + +m4_define(`ppl_@CLASS@_remove_higher_space_dimensions_code', +`dnl +val ppl_@CLASS@_remove_higher_space_dimensions: + @!CLASS@ -> int -> unit + +') + +m4_define(`ppl_@CLASS@_fold_space_dimensions_code', +`dnl +val ppl_@CLASS@_fold_space_dimensions: + @!CLASS@ -> int list -> int -> unit + +') + +m4_define(`ppl_@CLASS@_map_space_dimensions_code', +`dnl +val ppl_@CLASS@_map_space_dimensions: + @!CLASS@ -> (int*int) list -> unit +') + +m4_define(`ppl_@CLASS@_expand_space_dimension_code', +`dnl +val ppl_@CLASS@_expand_space_dimension: + @!CLASS@ -> int -> int -> unit +') + +m4_define(`ppl_@CLASS@_get_@CLASS_REPRESENT@s_code', +`dnl +val ppl_@CLASS@_get_@CLASS_REPRESENT@s: + @!CLASS@ -> @CLASS_REPRESENT@_system + +') + +m4_define(`ppl_@CLASS@_get_minimized_@CLASS_REPRESENT@s_code', +`dnl +val ppl_@CLASS@_get_minimized_@CLASS_REPRESENT@s: + @!CLASS@ -> @CLASS_REPRESENT@_system + +') + +m4_define(`ppl_@CLASS@_constrains_code', +`dnl +val ppl_@CLASS@_constrains: + @!CLASS@ -> int -> bool + +') + +m4_define(`ppl_@CLASS@_unconstrain_space_dimension_code', +`dnl +val ppl_@CLASS@_unconstrain_space_dimension: + @!CLASS@ -> int -> unit + +') + +m4_define(`ppl_@CLASS@_unconstrain_space_dimensions_code', +`dnl +val ppl_@CLASS@_unconstrain_space_dimensions: + @!CLASS@ -> int list -> unit + +') + +m4_define(`ppl_@CLASS@_bounded_@AFFIMAGE@_code', +`dnl +val ppl_@CLASS@_bounded_@AFFIMAGE@: + @!CLASS@ -> int + -> linear_expression -> linear_expression + -> Z.t -> unit +') + +m4_define(`ppl_@CLASS@_@AFFIMAGE@_code', +`dnl +val ppl_@CLASS@_@AFFIMAGE@: + @!CLASS@ -> int -> linear_expression -> Z.t -> unit + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_code', +`dnl +val ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs: + @!CLASS@ -> linear_expression + -> relation_symbol -> linear_expression + -> unit + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_code', +`dnl +val ppl_@CLASS@_generalized_@AFFIMAGE@: + @!CLASS@ -> int -> relation_symbol -> linear_expression + -> Z.t -> unit + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_with_congruence_code', +`dnl +val ppl_@CLASS@_generalized_@AFFIMAGE@_with_congruence: + @!CLASS@ -> int -> relation_symbol -> linear_expression + -> Z.t -> Z.t -> unit + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence_code', +`dnl +val ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence: + @!CLASS@ -> linear_expression + -> relation_symbol -> linear_expression -> Z.t + -> unit + +') + +m4_define(`ppl_@CLASS@_@WIDEN@_widening_assign_code', +`dnl +val ppl_@CLASS@_@WIDEN@_widening_assign: + @!CLASS@ -> @!CLASS@ -> unit + +') + +m4_define(`ppl_@CLASS@_@WIDEN@_widening_assign_with_tokens_code', +`dnl +val ppl_@CLASS@_@WIDEN@_widening_assign_with_tokens: + @!CLASS@ -> @!CLASS@ -> int -> int + +') + +m4_define(`ppl_@CLASS@_widening_assign_code', +`dnl +val ppl_@CLASS@_widening_assign: + @!CLASS@ -> @!CLASS@ -> unit + +') + +m4_define(`ppl_@CLASS@_widening_assign_with_tokens_code', +`dnl +val ppl_@CLASS@_widening_assign_with_tokens: + @!CLASS@ -> @!CLASS@ -> int -> int + +') + +m4_define(`ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_with_tokens_code', +`dnl +val ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_with_tokens: + @!CLASS@ -> @!CLASS@ + -> @CONSTRAINER@_system -> int -> int + +') + +m4_define(`ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_code', +`dnl +val ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign: + @!CLASS@ -> @!CLASS@ + -> @CONSTRAINER@_system -> unit + +') + +m4_define(`ppl_@CLASS@_@MAXMIN@_code', +`dnl +val ppl_@CLASS@_@MAXMIN@: + @!CLASS@ -> linear_expression + -> bool * Z.t * Z.t * bool + +') + +m4_define(`ppl_@CLASS@_@MAXMIN@_with_point_code', +`dnl +val ppl_@CLASS@_@MAXMIN@_with_point: + @!CLASS@ -> linear_expression + -> bool * Z.t * Z.t * bool * linear_generator + +') + +m4_define(`ppl_@CLASS@_OK_code', +`dnl +val ppl_@CLASS@_OK: + @!CLASS@ -> bool +') + +m4_define(`ppl_@CLASS@_@MEMBYTES@_code', +`dnl +val ppl_@CLASS@_@MEMBYTES@: + @!CLASS@ -> int + +') + + +m4_define(`ppl_@CLASS@_swap_code', +`dnl +val ppl_@CLASS@_swap: + @!CLASS@ -> @!CLASS@ -> unit + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_code', +`dnl +val ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@: + @!A_FRIEND@ -> @!CLASS@ + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_with_complexity_code', +`dnl +val ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_with_complexity: + @!A_FRIEND@ -> complexity_class -> @!CLASS@ + +') + +m4_define(`ppl_@CLASS@_@UB_EXACT@_code', +`dnl +val ppl_@CLASS@_@UB_EXACT@: + @!CLASS@ -> @!CLASS@ -> bool + +') + +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_code', +`dnl +val ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign: + @!CLASS@ -> @!CLASS@ -> unit + +') + +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_with_tokens_code', +`dnl +val ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_with_tokens: + @!CLASS@ -> @!CLASS@ -> int -> int + +') + +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_narrowing_assign_code', +`dnl +val ppl_@CLASS@_@EXTRAPOLATION@_narrowing_assign: + @!CLASS@ -> @!CLASS@ -> unit + +') + +m4_define(`ppl_@CLASS@_@BEGINEND@_iterator_code', +`dnl +val ppl_@CLASS@_@BEGINEND@_iterator: + @!CLASS@ -> @!CLASS@_iterator + +') + +m4_define(`ppl_@CLASS@_get_disjunct_code', +`dnl +val ppl_@CLASS@_get_disjunct: + @!CLASS@_iterator -> @!DISJUNCT@ + +') + +m4_define(`ppl_@CLASS@_add_disjunct_code', +`dnl +val ppl_@CLASS@_add_disjunct: + @!CLASS@ -> @!DISJUNCT@ -> unit + +') + +m4_define(`ppl_@CLASS@_drop_disjunct_code', +`dnl +val ppl_@CLASS@_drop_disjunct: + @!CLASS@ -> @!CLASS@_iterator -> unit + +') + +m4_define(`ppl_@CLASS@_drop_disjuncts_code', +`dnl +val ppl_@CLASS@_drop_disjuncts: + @!CLASS@ -> @!CLASS@_iterator -> @!CLASS@_iterator -> unit + +') + +m4_define(`ppl_new_@CLASS@_iterator_from_iterator_code', +`dnl +type @!CLASS@_iterator + +val ppl_new_@CLASS@_iterator_from_iterator: + @!CLASS@_iterator -> @!CLASS@_iterator + +') + +m4_define(`ppl_@CLASS@_iterator_equals_iterator_code', +`dnl + +val ppl_@CLASS@_iterator_equals_iterator: + @!CLASS@_iterator -> @!CLASS@_iterator -> bool + +') + +m4_define(`ppl_@CLASS@_@INCDEC@_iterator_code', +`dnl +val ppl_@CLASS@_@INCDEC@_iterator: + @!CLASS@_iterator -> unit + +') + +m4_define(`ppl_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign_code', +`dnl +val ppl_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign: + @!CLASS@ -> @!CLASS@ -> unit + +') + +m4_define(`ppl_@CLASS@_BGP99_@DISJUNCT_WIDEN@_extrapolation_assign_code', +`dnl +val ppl_@CLASS@_BGP99_@DISJUNCT_WIDEN@_extrapolation_assign: + @!CLASS@ -> @!CLASS@ -> int -> unit + +') + +m4_define(`ppl_@CLASS@_ascii_dump_code', +`dnl + +val ppl_@CLASS@_ascii_dump: + @!CLASS@ -> string + +') + +m4_define(`ppl_@CLASS@_linear_@PARTITION@_code', +`dnl +val ppl_@CLASS@_linear_@PARTITION@: + @!CLASS@ -> @!CLASS@ -> @!CLASS@ * pointset_powerset_nnc_polyhedron + +') + +m4_define(`ppl_@CLASS@_approximate_@PARTITION@_code', +`dnl +val ppl_@CLASS@_approximate_@PARTITION@: + @!CLASS@ -> @!CLASS@ -> + @!CLASS@ * pointset_powerset_grid * bool + +') 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..698fb7c --- /dev/null +++ b/interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4 @@ -0,0 +1,43 @@ +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-2009 Roberto Bagnara +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://www.cs.unipr.it/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 "_code" must be defined +dnl in the ppl_interface_generator_*_code.m4 file. +dnl The must be exactly as written here. +dnl + +m4_define(`m4_procedure_list', `m4_common_procedure_list') diff --git a/interfaces/OCaml/ppl_ocaml_common.cc b/interfaces/OCaml/ppl_ocaml_common.cc new file mode 100644 index 0000000..e13a4ee --- /dev/null +++ b/interfaces/OCaml/ppl_ocaml_common.cc @@ -0,0 +1,1238 @@ +/* Domain-independent part of the OCaml interface: non-inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_ocaml_common.defs.hh" + +namespace Parma_Polyhedra_Library { + +namespace Interfaces { + +namespace OCaml { + +class PFunc { + private: + std::set codomain; + std::vector vec; + + public: + PFunc() { + } + + bool has_empty_codomain() const { + return codomain.empty(); + } + + dimension_type max_in_codomain() const { + if (codomain.empty()) + throw std::runtime_error("PFunc::max_in_codomain()"); + return *codomain.rbegin(); + } + + bool maps(dimension_type i, dimension_type& j) const { + if (i >= vec.size()) + return false; + dimension_type vec_i = vec[i]; + if (vec_i == not_a_dimension()) + return false; + j = vec_i; + return true; + } + + bool insert(dimension_type i, dimension_type j) { + std::pair::iterator, bool> s + = codomain.insert(j); + if (!s.second) + // *this is not injective! + return false; + if (i > vec.size()) + vec.insert(vec.end(), i - vec.size(), not_a_dimension()); + if (i == vec.size()) { + vec.insert(vec.end(), j); + return true; + } + dimension_type& vec_i = vec[i]; + if (vec_i != not_a_dimension()) + // Already mapped: *this is not a function! + return false; + vec_i = j; + return true; + } +}; + + +#ifdef PPL_WATCHDOG_LIBRARY_ENABLED + +Parma_Watchdog_Library::Watchdog* p_timeout_object = 0; + +#endif // PPL_WATCHDOG_LIBRARY_ENABLED + +void +reset_timeout() { +#ifdef PPL_WATCHDOG_LIBRARY_ENABLED + if (p_timeout_object) { + delete p_timeout_object; + p_timeout_object = 0; + abandon_expensive_computations = 0; + } +#endif // PPL_WATCHDOG_LIBRARY_ENABLED +} + +namespace { + +inline mpz_ptr +mpz_ptr_val(value val) { + return static_cast(Data_custom_val(val)); +} + +inline mpz_class& +mpz_class_val(value val) { + return reinterpret_cast(*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: + // We should not be here! + throw std::runtime_error("PPL OCaml interface internal error\n:" + "build_ppl_relsym(rel)"); + } +} + +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: + // We should not be here! + throw std::runtime_error("PPL OCaml interface internal error\n:" + "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: + // We should not be here! + throw std::runtime_error("PPL OCaml interface internal error:\n" + "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: + // We should not be here! + throw std::runtime_error("PPL OCaml interface internal error:\n" + "build_ppl_Complexity_Class(cc)"); + } +} + +MIP_Problem::Control_Parameter_Name +build_ppl_control_parameter_name(value caml_cp_name) { + assert(Is_long(caml_cp_name)); + switch (Int_val(caml_cp_name)) { + case 0: + return MIP_Problem::PRICING; + default: + // We should not be here! + throw std::runtime_error("PPL OCaml interface internal error:\n" + "build_ppl_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: + // We should not be here! + throw std::runtime_error("PPL OCaml interface internal error:\n" + "build_ppl_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 +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 +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); + } + default: + throw std::runtime_error("PPL OCaml interface internal error:\n" + "build_ocaml_generator(g)"); + } +} + +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); + } + default: + throw std::runtime_error("PPL OCaml interface internal error:\n" + "build_ocaml_grid_generator(g)"); + } +} + +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); + } + default: + throw std::runtime_error("PPL OCaml interface internal error:\n" + "build_ocaml_constraint(c)"); + } +} + +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(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 = { + "it.unipr.cs.ppl" "." PPL_VERSION "." "MIP_Problem", + custom_MIP_Problem_finalize, + custom_compare_default, + custom_hash_default, + custom_serialize_default, + custom_deserialize_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(&ph); + return v; +} + +} // 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); + 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); + dimension_type dd = value_to_ppl_dimension(d); + Constraint_System ppl_cs = build_ppl_Constraint_System(caml_cs); + Linear_Expression ppl_cost = build_ppl_Linear_Expression(caml_cost); + 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); + 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)); + default: + ; + } + // We should not be here! + throw std::runtime_error("PPL OCaml interface internal error"); +} +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)); + default: + ; + } + // We should not be here! + throw std::runtime_error("PPL OCaml interface internal error"); + } +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_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)); + default: + ; + } + // We should not be here! + throw std::runtime_error("PPL OCaml interface internal error"); + } +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); + ppl_mip1.swap(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_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(indent_depth); + unsigned cpp_preferred_first_line_length + = value_to_unsigned(preferred_first_line_length); + unsigned cpp_preferred_line_length + = value_to_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_is_bounded(value unit) try { + CAMLparam1(unit); + CAMLreturn(std::numeric_limits::is_bounded + ? Val_true : Val_false); +} +CATCH_ALL + +extern "C" +CAMLprim value +ppl_Coefficient_min(value unit) try { + CAMLparam1(unit); + if (std::numeric_limits::is_bounded) { + const Coefficient& min = std::numeric_limits::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::is_bounded) { + const Coefficient& max = std::numeric_limits::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_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_set_timeout(value time) try { + CAMLparam1(time); +#ifndef PPL_WATCHDOG_LIBRARY_ENABLED + const char* what = "PPL OCaml interface usage error:\n" + "ppl_set_timeout: the PPL Watchdog library is not enabled."; + throw std::runtime_error(what); +#else + // In case a timeout was already set. + reset_timeout(); + unsigned cpp_time = value_to_unsigned(time); + static timeout_exception e; + using Parma_Watchdog_Library::Watchdog; + p_timeout_object = new Watchdog(cpp_time, abandon_expensive_computations, e); + CAMLreturn(Val_unit); +#endif // PPL_WATCHDOG_LIBRARY_ENABLED +} +CATCH_ALL + +extern "C" +CAMLprim value +ppl_reset_timeout(value unit) try { + CAMLparam1(unit); +#ifndef PPL_WATCHDOG_LIBRARY_ENABLED + throw std::runtime_error("PPL OCaml interface error:\n" + "the PPL Watchdog library is not enabled."); +#else + reset_timeout(); + CAMLreturn(Val_unit); +#endif // PPL_WATCHDOG_LIBRARY_ENABLED +} +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..9b8bbe1 --- /dev/null +++ b/interfaces/OCaml/ppl_ocaml_common.defs.hh @@ -0,0 +1,210 @@ +/* Domain-independent part of the OCaml interface: declarations. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_ppl_ocaml_common_defs_hh +#define PPL_ppl_ocaml_common_defs_hh 1 + +#include "ppl.hh" +#ifdef PPL_WATCHDOG_LIBRARY_ENABLED +#include "pwl.hh" +#endif +#include "interfaced_boxes.hh" +#include "marked_pointers.hh" + +// 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 +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); + +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 Partial_Function { +public: + Partial_Function(); + + bool has_empty_codomain() const; + + dimension_type max_in_codomain() const; + + bool maps(dimension_type i, dimension_type& j) const; + + bool insert(dimension_type i, dimension_type j); + +private: + std::set codomain; + + std::vector vec; +}; + +class timeout_exception : public Parma_Polyhedra_Library::Throwable { +public: + void throw_me() const { + throw *this; + } + int priority() const { + return 0; + } + timeout_exception() { + } +}; + +void reset_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(e.what())); \ +} \ +catch(std::overflow_error& e) { \ + caml_raise_with_string(*caml_named_value("PPL_arithmetic_overflow"), \ + (const_cast(e.what()))); \ +} \ +catch(std::runtime_error& e) { \ + caml_raise_with_string(*caml_named_value("PPL_internal_error"), \ + (const_cast(e.what()))); \ +} \ +catch(std::exception& e) { \ + caml_raise_with_string(*caml_named_value("PPL_unknown_standard_exception"), \ + (const_cast(e.what()))); \ +} \ +catch(timeout_exception&) { \ + reset_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..7951f11 --- /dev/null +++ b/interfaces/OCaml/ppl_ocaml_common.inlines.hh @@ -0,0 +1,128 @@ +/* Domain-independent part of the OCaml interface: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_ppl_ocaml_common_inlines_hh +#define PPL_ppl_ocaml_common_inlines_hh 1 + +namespace Parma_Polyhedra_Library { + +namespace Interfaces { + +namespace OCaml { + +template +U_Int +value_to_unsigned(value v) { + // FIXME: check the following at compile time. + assert(std::numeric_limits::is_integer + && !std::numeric_limits::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::max(); + if (static_cast(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(vv); +} + +inline dimension_type +value_to_ppl_dimension(value v) { + return value_to_unsigned(v); +} + +inline value +ppl_dimension_to_value(dimension_type dim) { + // FIXME: what if this assertion fails? + assert(static_cast(dim) <= static_cast(Max_long)); + return Val_long(dim); +} + +inline Variable +build_ppl_Variable(value caml_var) { + return Variable(value_to_ppl_dimension(caml_var)); +} + +inline +Partial_Function::Partial_Function() { +} + +inline bool +Partial_Function::has_empty_codomain() const { + return codomain.empty(); +} + +inline dimension_type +Partial_Function::max_in_codomain() const { + if (codomain.empty()) + throw std::runtime_error("Partial_Function::max_in_codomain()"); + return *codomain.rbegin(); +} + +inline bool +Partial_Function::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; +} + +inline bool +Partial_Function::insert(dimension_type i, dimension_type j) { + std::pair::iterator, bool> s = codomain.insert(j); + if (!s.second) + // *this is not injective! + return false; + if (i > vec.size()) + vec.insert(vec.end(), i - vec.size(), not_a_dimension()); + if (i == vec.size()) { + vec.insert(vec.end(), j); + return true; + } + dimension_type& vec_i = vec[i]; + if (vec_i != not_a_dimension()) + // Already mapped: *this is not a function! + return false; + vec_i = j; + return true; +} + +} // namespace 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..82bbefd --- /dev/null +++ b/interfaces/OCaml/ppl_ocaml_globals.ml @@ -0,0 +1,262 @@ +(* OCaml interface: domain-independent functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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 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_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_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_set_timeout: +int -> unit = "ppl_set_timeout" + +external ppl_reset_timeout: +unit -> unit = "ppl_reset_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" diff --git a/interfaces/OCaml/ppl_ocaml_globals.mli b/interfaces/OCaml/ppl_ocaml_globals.mli new file mode 100644 index 0000000..b0e2e01 --- /dev/null +++ b/interfaces/OCaml/ppl_ocaml_globals.mli @@ -0,0 +1,228 @@ +(* OCaml interface: module inteface. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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 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 + + +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_is_bounded: + unit -> bool + +val ppl_Coefficient_max: + unit -> Z.t + +val ppl_Coefficient_min: + unit -> Z.t + +val ppl_set_rounding_for_PPL: + unit -> unit + +val ppl_restore_pre_PPL_rounding: + unit -> unit + +val ppl_set_timeout: + int -> unit + +val ppl_reset_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 diff --git a/interfaces/OCaml/tests/Makefile.am b/interfaces/OCaml/tests/Makefile.am new file mode 100644 index 0000000..e481093 --- /dev/null +++ b/interfaces/OCaml/tests/Makefile.am @@ -0,0 +1,189 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +if VALGRIND_TESTS_ENABLED + +CHECKER = \ +$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \ +--num-callers=100 --leak-resolution=high \ +--suppressions=$(srcdir)/valgrind_suppressions + +else !VALGRIND_TESTS_ENABLED + +CHECKER = + +endif !VALGRIND_TESTS_ENABLED + +TESTS_ENVIRONMENT = \ + $(LIBTOOL) --mode=execute $(PPL_DLOPEN) $(PWL_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 \ +ppl_interface_generator_ocaml_test_ml.m4 \ +ppl_interface_generator_ocaml_test_ml_code.m4 \ +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 = \ +ppl_interface_generator_ocaml_test_ml_code.m4 \ +ppl_interface_generator_ocaml_test_ml.m4 \ +ppl_ocaml_tests_common + +OCAMLC_ENV = OCAMLRUNPARAM='l=1M' + +OCAMLC_COMPILE_FLAGS = \ +-I @mlgmp_dir@ -I .. -ccopt -g + +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) + +if BUILD_WATCHDOG_LIBRARY +BUILT_PWL_FLAGS = -cclib $(top_builddir)/Watchdog/src/.libs/libpwl$(SHREXT) +endif BUILD_WATCHDOG_LIBRARY + +else !ENABLE_SHARED + +BUILT_PPL_FLAGS = -cclib $(top_builddir)/src/.libs/libppl.$(LIBEXT) + +if BUILD_WATCHDOG_LIBRARY +BUILT_PWL_FLAGS = -cclib $(top_builddir)/Watchdog/src/.libs/libpwl.$(LIBEXT) +endif BUILD_WATCHDOG_LIBRARY + +endif !ENABLE_SHARED + +PPL_DLOPEN = -dlopen ../../../src/libppl.la + +if BUILD_WATCHDOG_LIBRARY +PWL_DLOPEN = -dlopen ../../../Watchdog/src/libpwl.la +endif BUILD_WATCHDOG_LIBRARY + +.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) $(BUILT_PWL_FLAGS) $(OCAMLC_LINK_FLAGS) \ + ppl_ocaml.cma $< + +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) $(BUILT_PWL_FLAGS) $(OCAMLOPT_LINK_FLAGS) \ + ppl_ocaml.cmxa $< + + +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) $(BUILT_PWL_FLAGS) $(OCAMLC_LINK_FLAGS) \ + ppl_ocaml.cma $< + +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) $(BUILT_PWL_FLAGS) $(OCAMLOPT_LINK_FLAGS) \ + ppl_ocaml.cmxa $< + +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..cd3a340 --- /dev/null +++ b/interfaces/OCaml/tests/Makefile.in @@ -0,0 +1,693 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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.am $(srcdir)/Makefile.in +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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/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 = +@HAVE_OCAMLC_TRUE@am__EXEEXT_1 = test1$(EXEEXT) \ +@HAVE_OCAMLC_TRUE@ ppl_ocaml_generated_test$(EXEEXT) +@HAVE_OCAMLOPT_TRUE@am__EXEEXT_2 = test1_opt$(EXEEXT) \ +@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) +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) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +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) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +@VALGRIND_TESTS_ENABLED_FALSE@CHECKER = +@VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \ +@VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \ +@VALGRIND_TESTS_ENABLED_TRUE@--num-callers=100 --leak-resolution=high \ +@VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(srcdir)/valgrind_suppressions + +TESTS_ENVIRONMENT = \ + $(LIBTOOL) --mode=execute $(PPL_DLOPEN) $(PWL_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 \ +ppl_interface_generator_ocaml_test_ml.m4 \ +ppl_interface_generator_ocaml_test_ml_code.m4 \ +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 = \ +ppl_interface_generator_ocaml_test_ml_code.m4 \ +ppl_interface_generator_ocaml_test_ml.m4 \ +ppl_ocaml_tests_common + +OCAMLC_ENV = OCAMLRUNPARAM='l=1M' +OCAMLC_COMPILE_FLAGS = \ +-I @mlgmp_dir@ -I .. -ccopt -g + +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) +@ENABLE_SHARED_FALSE@BUILT_PPL_FLAGS = -cclib $(top_builddir)/src/.libs/libppl.$(LIBEXT) +@ENABLE_SHARED_TRUE@BUILT_PPL_FLAGS = -cclib $(top_builddir)/src/.libs/libppl$(SHREXT) +@BUILD_WATCHDOG_LIBRARY_TRUE@@ENABLE_SHARED_FALSE@BUILT_PWL_FLAGS = -cclib $(top_builddir)/Watchdog/src/.libs/libpwl.$(LIBEXT) +@BUILD_WATCHDOG_LIBRARY_TRUE@@ENABLE_SHARED_TRUE@BUILT_PWL_FLAGS = -cclib $(top_builddir)/Watchdog/src/.libs/libpwl$(SHREXT) +PPL_DLOPEN = -dlopen ../../../src/libppl.la +@BUILD_WATCHDOG_LIBRARY_TRUE@PWL_DLOPEN = -dlopen ../../../Watchdog/src/libpwl.la +@HAVE_OCAMLC_TRUE@OCAMLC_TESTS = \ +@HAVE_OCAMLC_TRUE@test1 \ +@HAVE_OCAMLC_TRUE@ppl_ocaml_generated_test + +@HAVE_OCAMLOPT_TRUE@OCAMLOPT_TESTS = \ +@HAVE_OCAMLOPT_TRUE@test1_opt \ +@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 .ml +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/OCaml/tests/Makefile'; \ + 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 + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; ws='[ ]'; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *$$ws$$tst$$ws*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + echo "XPASS: $$tst"; \ + ;; \ + *) \ + echo "PASS: $$tst"; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *$$ws$$tst$$ws*) \ + xfail=`expr $$xfail + 1`; \ + echo "XFAIL: $$tst"; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + echo "FAIL: $$tst"; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + echo "SKIP: $$tst"; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all tests failed"; \ + else \ + banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + skipped="($$skip tests were not run)"; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + test -z "$$skipped" || echo "$$skipped"; \ + test -z "$$report" || echo "$$report"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0; \ + else :; fi + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +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 + +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: install-am install-strip + +.PHONY: all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool distclean \ + distclean-compile 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-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-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) $(BUILT_PWL_FLAGS) $(OCAMLC_LINK_FLAGS) \ + ppl_ocaml.cma $< + +test1_opt$(EXEEXT): test1.cmx ../ppl_ocaml.cmxa + $(OCAMLOPT_ENV) ocamlopt -o $@ \ + -cc "$(CXX)" $(OCAMLOPT_COMPILE_FLAGS) \ + $(BUILT_PPL_FLAGS) $(BUILT_PWL_FLAGS) $(OCAMLOPT_LINK_FLAGS) \ + ppl_ocaml.cmxa $< + +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) $(BUILT_PWL_FLAGS) $(OCAMLC_LINK_FLAGS) \ + ppl_ocaml.cma $< + +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) $(BUILT_PWL_FLAGS) $(OCAMLOPT_LINK_FLAGS) \ + ppl_ocaml.cmxa $< + +../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..fddaffa --- /dev/null +++ b/interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4 @@ -0,0 +1,60 @@ +m4_define(`dnl', `m4_dnl')`'dnl +m4_divert(-1) +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/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..2d0f566 --- /dev/null +++ b/interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4 @@ -0,0 +1,886 @@ +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/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@01 + = ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension 3 Universe;; +ppl_@CLASS@_refine_with_@CONSTRAINER@s + @!TOPOLOGY@@!CLASS@01 @CONSTRAINER@s01;; +let @!TOPOLOGY@@!CLASS@02 + = ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension 3 Universe;; +ppl_@CLASS@_refine_with_@CONSTRAINER@s + @!TOPOLOGY@@!CLASS@02 @CONSTRAINER@s02;; +let @!TOPOLOGY@@!CLASS@03 + = ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension 3 Universe;; +ppl_@CLASS@_refine_with_@CONSTRAINER@s + @!TOPOLOGY@@!CLASS@03 @CONSTRAINER@s03;; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension_code', +` +print_string_if_noisy "testing ppl_new_@TOPOLOGY@@CLASS@_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_@TOPOLOGY@@CLASS@_from_space_dimension i Empty + in let dimension + = ppl_@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_@TOPOLOGY@@CLASS@_from_@FRIEND@_code', +` +print_string_if_noisy "testing ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@: " ;; +let ps + = ppl_new_@FRIEND@_from_space_dimension 3 Universe;; +let ps1 + = ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@(ps);; +let out = if (ppl_@A_FRIEND@_OK ps & ppl_@CLASS@_OK ps1) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_with_complexity_code', +` +print_string_if_noisy + "testing ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_with_complexity: " ;; +print_string_if_noisy "\n";; +let ps + = ppl_new_@FRIEND@_from_space_dimension 3 Universe;; +let ps_pc + = ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_with_complexity ps Polynomial_Complexity ;; +let out = if (ppl_@A_FRIEND@_OK ps & ppl_@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_@TOPOLOGY@@CLASS@_from_@FRIEND@_with_complexity ps Simplex_Complexity ;; +let out = if (ppl_@A_FRIEND@_OK ps & ppl_@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_@TOPOLOGY@@CLASS@_from_@FRIEND@_with_complexity ps Any_Complexity ;; +let out = if (ppl_@A_FRIEND@_OK ps & ppl_@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_@TOPOLOGY@@CLASS@_from_@BUILD_REPRESENT@s_code', +` +print_string_if_noisy "testing ppl_new_@TOPOLOGY@@CLASS@_from_@BUILD_REPRESENT@s: " ;; +let @!TOPOLOGY@@!CLASS@ + = ppl_new_@TOPOLOGY@@CLASS@_from_@BUILD_REPRESENT@s(@BUILD_REPRESENT@s1);; +let out = if (ppl_@CLASS@_OK @!TOPOLOGY@@!CLASS@) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_@UB_EXACT@_code', +` +print_string_if_noisy "testing ppl_@CLASS@_@UB_EXACT@: " ;; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let copy02 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let _result + = ppl_@CLASS@_@UB_EXACT@ copy01 copy02;; +let out + = if (ppl_@CLASS@_OK copy01 & ppl_@CLASS@_OK copy02) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_swap_code', +` +print_string_if_noisy "testing ppl_@CLASS@_swap: ";; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let copy02 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let u = ppl_@CLASS@_swap copy01 copy02;; +let out + = if (u = () & ppl_@CLASS@_OK copy01 & ppl_@CLASS@_OK copy02) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_@DIMENSION@_code', +` +print_string_if_noisy "testing ppl_@CLASS@_@DIMENSION@: " ;; +let dim + = ppl_@CLASS@_@DIMENSION@ @!TOPOLOGY@@!CLASS@01;; +let out = if (ppl_@CLASS@_OK @!TOPOLOGY@@!CLASS@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_@CLASS@_relation_with_@RELATION_REPRESENT@_code', +` +print_string_if_noisy "testing ppl_@CLASS@_relation_with_@RELATION_REPRESENT@: " ;; +let _result + = ppl_@CLASS@_relation_with_@RELATION_REPRESENT@ + @!TOPOLOGY@@!CLASS@01 @RELATION_REPRESENT@1;; +let out = if (ppl_@CLASS@_OK @!TOPOLOGY@@!CLASS@01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_get_@CLASS_REPRESENT@s_code', +` +print_string_if_noisy "testing ppl_@CLASS@_get_@CLASS_REPRESENT@s: ";; +let @CLASS_REPRESENT@s = ppl_@CLASS@_get_@CLASS_REPRESENT@s + @!TOPOLOGY@@!CLASS@01;; +let out = if (ppl_@CLASS@_OK @!TOPOLOGY@@!CLASS@01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +List.iter print_@CLASS_REPRESENT@ @CLASS_REPRESENT@s;; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_@HAS_PROPERTY@_code', +` +print_string_if_noisy "testing ppl_@CLASS@_@HAS_PROPERTY@: ";; +let result = ppl_@CLASS@_@HAS_PROPERTY@ @!TOPOLOGY@@!CLASS@01;; +let out = if (ppl_@CLASS@_OK @!TOPOLOGY@@!CLASS@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_@CLASS@_@SIMPLIFY@_code', +` +print_string_if_noisy "testing ppl_@CLASS@_@SIMPLIFY@: ";; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let u = ppl_@CLASS@_@SIMPLIFY@ copy01;; +let out = if (u = () & ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_bounds_from_@ABOVEBELOW@_code', +` +print_string_if_noisy "testing ppl_@CLASS@_bounds_from_@ABOVEBELOW@: " ;; +let _result + = ppl_@CLASS@_bounds_from_above @!TOPOLOGY@@!CLASS@01 e2;; +let out = if (ppl_@CLASS@_OK @!TOPOLOGY@@!CLASS@01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_@MAXMIN@_code', +` +print_string_if_noisy "testing ppl_@CLASS@_@MAXMIN@: ";; +let (is_bounded, num, den, is_supremum) + = ppl_@CLASS@_@MAXMIN@ @!TOPOLOGY@@!CLASS@01 e3;; +let out = if (ppl_@CLASS@_OK @!TOPOLOGY@@!CLASS@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_@CLASS@_@MAXMIN@_with_point_code', +` +print_string_if_noisy "testing ppl_@CLASS@_@MAXMIN@_with_point: ";; +let (is_bounded, num, den, is_supremum, pt) + = ppl_@CLASS@_@MAXMIN@_with_point @!TOPOLOGY@@!CLASS@01 e3;; +let out = if (ppl_@CLASS@_OK @!TOPOLOGY@@!CLASS@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_@CLASS@_@COMPARISON@_@CLASS@_code', +` +print_string_if_noisy "testing ppl_@CLASS@_@COMPARISON@_@CLASS@: " ;; +let b = ppl_@CLASS@_@COMPARISON@_@CLASS@ + @!TOPOLOGY@@!CLASS@01 @!TOPOLOGY@@!CLASS@02;; +let out = if (ppl_@CLASS@_OK @!TOPOLOGY@@!CLASS@01 + & ppl_@CLASS@_OK @!TOPOLOGY@@!CLASS@02) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_equals_@CLASS@_code', +` +print_string_if_noisy "testing ppl_@CLASS@_equals_@CLASS@: " ;; +let b = ppl_@CLASS@_equals_@CLASS@ + @!TOPOLOGY@@!CLASS@01 @!TOPOLOGY@@!CLASS@02;; +let out = if (ppl_@CLASS@_OK @!TOPOLOGY@@!CLASS@01 + & ppl_@CLASS@_OK @!TOPOLOGY@@!CLASS@02) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_OK_code', +` +print_string_if_noisy "testing ppl_@CLASS@_OK: ";; +let out = if (ppl_@CLASS@_OK @!TOPOLOGY@@!CLASS@01 + & ppl_@CLASS@_OK @!TOPOLOGY@@!CLASS@02) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@_code', +` +print_string_if_noisy "testing ppl_@CLASS@_add_@CLASS_REPRESENT@: " ;; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let u = ppl_@CLASS@_add_@CLASS_REPRESENT@ copy01 @CLASS_REPRESENT@1;; +let out = if (u = () & ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@s_code', +` +print_string_if_noisy "testing ppl_@CLASS@_add_@CLASS_REPRESENT@s: " ;; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let u = ppl_@CLASS@_add_@CLASS_REPRESENT@s copy01 @CLASS_REPRESENT@s1;; +let out = if (u = () & ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_refine_with_@REFINE_REPRESENT@_code', +` +print_string_if_noisy + "testing ppl_@CLASS@_refine_with_@REFINE_REPRESENT@: " ;; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let u = ppl_@CLASS@_refine_with_@REFINE_REPRESENT@ + copy01 @REFINE_REPRESENT@01;; +let out = if (u = () & ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_refine_with_@REFINE_REPRESENT@s_code', +` +print_string_if_noisy + "testing ppl_@CLASS@_refine_with_@REFINE_REPRESENT@s: " ;; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let u = ppl_@CLASS@_refine_with_@REFINE_REPRESENT@s + copy01 @REFINE_REPRESENT@s01;; +let out = if (u = () & ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_@BINOP@_code', +` +print_string_if_noisy "testing ppl_@CLASS@_@BINOP@: " ;; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let copy02 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let u = ppl_@CLASS@_@BINOP@ copy01 copy02;; +let out + = if (u = () & ppl_@CLASS@_OK copy01 & ppl_@CLASS@_OK copy02) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_simplify_using_context_assign_code', +` +print_string_if_noisy "testing ppl_@CLASS@_simplify_using_context_assign: " ;; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let copy02 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let b = ppl_@CLASS@_simplify_using_context_assign copy01 copy02;; +let out + = if (ppl_@CLASS@_OK copy01 & ppl_@CLASS@_OK copy02) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_@AFFIMAGE@_code', +` +print_string_if_noisy "testing ppl_@CLASS@_@AFFIMAGE@: ";; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let u = ppl_@CLASS@_@AFFIMAGE@ copy01 1 ((Z.of_int 2) */ v2) (Z.from_int 2);; +let out = if (u = () & ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_bounded_@AFFIMAGE@_code', +` +print_string_if_noisy "testing ppl_@CLASS@_bounded_@AFFIMAGE@: ";; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let u = ppl_@CLASS@_bounded_@AFFIMAGE@ copy01 1 + ((Z.of_int 2) */ v2) v2 (Z.from_int 10);; +let out = if (u = () & ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_code', +` +print_string_if_noisy "testing ppl_@CLASS@_generalized_@AFFIMAGE@: ";; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let u = ppl_@CLASS@_generalized_@AFFIMAGE@ + copy01 1 Equal_RS v1 (Z.from_int 10);; +let out = if (u = () & ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_code', +` +print_string_if_noisy "testing ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs: ";; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let u = ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs + copy01 ((Z.of_int 1) */ v0) Equal_RS (linear_expression_of_int 7);; +let out = if (u = () & ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_with_congruence_code', +` +print_string_if_noisy "testing ppl_@CLASS@_generalized_@AFFIMAGE@_with_congruence: ";; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let u = ppl_@CLASS@_generalized_@AFFIMAGE@_with_congruence + copy01 1 Equal_RS v1 (Z.from_int 1) (Z.from_int 10);; +let out = if (u = () & ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence_code', +` +print_string_if_noisy "testing ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence: ";; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let u = ppl_@CLASS@_generalized_@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_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@_code', +` +print_string_if_noisy "testing ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@: ";; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let u = ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@ copy01 2;; +let out = if (u = () & ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_remove_space_dimensions_code', +` +print_string_if_noisy "testing ppl_@CLASS@_remove_space_dimensions: ";; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let dimensions_to_remove = [2;0];; +let u = ppl_@CLASS@_remove_space_dimensions copy01 dimensions_to_remove;; +let out = if (u = () & ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_remove_higher_space_dimensions_code', +` +print_string_if_noisy "testing ppl_@CLASS@_remove_higher_space_dimensions: ";; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let u = ppl_@CLASS@_remove_higher_space_dimensions copy01 1;; +let out = if (u = () & ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_expand_space_dimension_code', +` +print_string_if_noisy "testing ppl_@CLASS@_expand_space_dimension: ";; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let u = ppl_@CLASS@_expand_space_dimension copy01 1 1;; +let out = if (u = () & ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_fold_space_dimensions_code', +` +print_string_if_noisy "testing ppl_@CLASS@_fold_space_dimensions: ";; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let dimensions_to_fold = [1];; +let u = ppl_@CLASS@_fold_space_dimensions copy01 dimensions_to_fold 0;; +let out = if (u = () & ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_map_space_dimensions_code', +` +print_string_if_noisy "testing ppl_@CLASS@_map_space_dimensions: ";; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let dimensions_to_map = [(0,1);(1,2);(2,0);];; +let u = ppl_@CLASS@_map_space_dimensions copy01 dimensions_to_map;; +let out = if (u = () & ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_constrains_code', +` +print_string_if_noisy "testing ppl_@CLASS@_constrains: ";; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +ppl_@CLASS@_constrains copy01 1;; +let dimensions_to_map = [(0,1);(1,2);(2,0);];; +ppl_@CLASS@_map_space_dimensions copy01 dimensions_to_map;; +let out = if (ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_unconstrain_space_dimension_code', +` +print_string_if_noisy "testing ppl_@CLASS@_unconstrain_space_dimension: ";; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let u = ppl_@CLASS@_unconstrain_space_dimension copy01 1;; +let out = if (u = () & ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_unconstrain_space_dimensions_code', +` +print_string_if_noisy "testing ppl_@CLASS@_unconstrain_space_dimensions: ";; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let dimensions_to_unconstrain = [1];; +let u = ppl_@CLASS@_unconstrain_space_dimensions + copy01 dimensions_to_unconstrain;; +let out = if (u = () & ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_@MEMBYTES@_code', +` +print_string_if_noisy "testing ppl_@CLASS@_@MEMBYTES@: " ;; +let mb + = ppl_@CLASS@_@MEMBYTES@ @!TOPOLOGY@@!CLASS@01;; +let out = if (ppl_@CLASS@_OK @!TOPOLOGY@@!CLASS@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_@CLASS@_@WIDEN@_widening_assign_code', +` +print_string_if_noisy "testing ppl_@CLASS@_@WIDEN@_widening_assign: ";; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let copy03 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@03);; +let u = ppl_@CLASS@_@WIDEN@_widening_assign copy01 copy03 ;; +let out = if (u = () & ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_@WIDEN@_widening_assign_with_tokens_code', +` +print_string_if_noisy "testing ppl_@CLASS@_@WIDEN@_widening_assign_with_tokens_code: ";; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let copy03 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@03);; +let tokens + = ppl_@CLASS@_@WIDEN@_widening_assign_with_tokens copy01 copy03 5;; +let out = if (ppl_@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_@CLASS@_widening_assign_code', +` +print_string_if_noisy "testing ppl_@CLASS@_widening_assign: ";; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let copy03 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@03);; +let u = ppl_@CLASS@_widening_assign copy01 copy03 ;; +let out = if (u = () & ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_widening_assign_with_tokens_code', +` +print_string_if_noisy "testing ppl_@CLASS@_widening_assign_with_tokens_code: ";; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let copy03 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@03);; +let tokens + = ppl_@CLASS@_widening_assign_with_tokens copy01 copy03 5;; +let out = if (ppl_@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_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_code', +` +print_string_if_noisy + "testing ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign: ";; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let copy03 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@03);; +let u = ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign + copy01 copy03 @CONSTRAINER@s04;; +let out = if (u = () & ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_with_tokens_code', +` +print_string_if_noisy + "testing ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_with_tokens: ";; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let copy03 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@03);; +let tokens + = ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_with_tokens + copy01 copy03 @CONSTRAINER@s04 10;; +let out = if (ppl_@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_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_code', +` +print_string_if_noisy "testing ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign: ";; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let copy03 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@03);; +let u = ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign copy01 copy03 ;; +let out = if (u = () & ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_with_tokens_code', +` +print_string_if_noisy "testing ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_with_tokens_code: ";; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let copy03 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@03);; +let tokens + = ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_with_tokens + copy01 copy03 5;; +let out = if (ppl_@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_@CLASS@_@EXTRAPOLATION@_narrowing_assign_code', +` +print_string_if_noisy "testing ppl_@CLASS@_@EXTRAPOLATION@_narrowing_assign: ";; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let copy03 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@03);; +let u = ppl_@CLASS@_@EXTRAPOLATION@_narrowing_assign copy03 copy01 ;; +let out = if (u = () & ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + + +m4_define(`ppl_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign_code', +` +print_string_if_noisy "testing ppl_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign: ";; +let copy01 + = ppl_new_@CLASS@_from_@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let copy03 + = ppl_new_@CLASS@_from_@CLASS@(@!CLASS@03);; +let u = ppl_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign copy01 copy03 ;; +let out = if (u = () & ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_BGP99_@DISJUNCT_WIDEN@_extrapolation_assign_code', +` +print_string_if_noisy "testing ppl_@CLASS@_BGP99_@DISJUNCT_WIDEN@_extrapolation_assign: ";; +let copy01 + = ppl_new_@CLASS@_from_@CLASS@(@!CLASS@01);; +let copy03 + = ppl_new_@CLASS@_from_@CLASS@(@!CLASS@03);; +let u = ppl_@CLASS@_BGP99_@DISJUNCT_WIDEN@_extrapolation_assign copy01 copy03 2;; +let out = if (u = () & ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_@BEGINEND@_iterator_code', +` +print_string_if_noisy "testing ppl_@BEGINEND@_iterator: " ;; +let it = ppl_@CLASS@_@BEGINEND@_iterator @!CLASS@01;; +let out = if (ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_iterator_equals_iterator_code', +` +print_string_if_noisy "testing ppl_@CLASS@_iterator_equals_iterator: " ;; +let it = ppl_@CLASS@_begin_iterator @!CLASS@01;; +let it_begin = ppl_@CLASS@_begin_iterator @!CLASS@01;; +let b = ppl_@CLASS@_iterator_equals_iterator it it_begin;; +let out = if (ppl_@CLASS@_OK @!CLASS@01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_new_@CLASS@_iterator_from_iterator_code', +` +print_string_if_noisy "testing ppl_new_@CLASS@_iterator_from_iterator: " ;; +let it_begin = ppl_@CLASS@_begin_iterator @!CLASS@01;; +let it_copy = ppl_new_@CLASS@_iterator_from_iterator it_begin;; +let b = ppl_@CLASS@_iterator_equals_iterator it_copy it_begin;; +let out = if (ppl_@CLASS@_OK @!CLASS@01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_@INCDEC@_iterator_code', +` +print_string_if_noisy "testing ppl_@CLASS@_@INCDEC@_iterator: " ;; +let itb = ppl_@CLASS@_begin_iterator @!CLASS@01;; +let it_begin = ppl_@CLASS@_begin_iterator @!CLASS@01;; +let ite = ppl_@CLASS@_end_iterator @!CLASS@01;; +let it_end = ppl_@CLASS@_end_iterator @!CLASS@01;; +let size = ppl_@CLASS@_size @!CLASS@01 in +if (size > 0) + then ( + ppl_@CLASS@_increment_iterator itb; + ppl_@CLASS@_decrement_iterator itb; + ppl_@CLASS@_decrement_iterator ite; + ppl_@CLASS@_increment_iterator ite; + );; +let out = if ((ppl_@CLASS@_OK @!CLASS@01) + & (ppl_@CLASS@_iterator_equals_iterator itb it_begin) + & (ppl_@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_@CLASS@_get_disjunct_code', +` +print_string_if_noisy "testing ppl_@CLASS@_get_disjunct: " ;; +let it = ppl_@CLASS@_begin_iterator @!CLASS@01;; +let d = ppl_@CLASS@_get_disjunct it;; +let out = if (ppl_@CLASS@_OK @!CLASS@01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_drop_disjunct_code', +` +print_string_if_noisy "testing ppl_@CLASS@_drop_disjunct: " ;; +let copy01 + = ppl_new_@CLASS@_from_@CLASS@(@!CLASS@01);; +let it = ppl_@CLASS@_begin_iterator copy01;; +let u = ppl_@CLASS@_drop_disjunct copy01 it;; +let out = if (u = () & ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_drop_disjuncts_code', +` +print_string_if_noisy "testing ppl_@CLASS@_drop_disjuncts: " ;; +let copy01 + = ppl_new_@CLASS@_from_@CLASS@(@!CLASS@01);; +let it1 = ppl_@CLASS@_begin_iterator copy01;; +let it2 = ppl_@CLASS@_begin_iterator copy01;; +let u = ppl_@CLASS@_drop_disjuncts copy01 it1 it2;; +let out = if (u = () & ppl_@CLASS@_OK copy01) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_ascii_dump_code', +` +print_string_if_noisy "testing ppl_@CLASS@_ascii_dump: " ;; +print_string_if_noisy (ppl_@CLASS@_ascii_dump @!TOPOLOGY@@!CLASS@01);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_linear_@PARTITION@_code', +` +print_string_if_noisy "testing ppl_@CLASS@_linear_@PARTITION@: " ;; +let copy01 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let copy02 + = ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS@01);; +let (intsn, ptt) + = ppl_@CLASS@_linear_partition copy01 copy02;; +let out + = if (ppl_@CLASS@_OK copy01 & ppl_@CLASS@_OK copy02) + then "success" else "failed" + in (print_string_if_noisy out);; +print_string_if_noisy "\n";; +') + +m4_define(`ppl_@CLASS@_approximate_@PARTITION@_code', +` +print_string_if_noisy "testing ppl_@CLASS@_linear_@PARTITION@: " ;; +let copy01 + = ppl_new_@CLASS@_from_@CLASS@(@!CLASS@01);; +let copy02 + = ppl_new_@CLASS@_from_@CLASS@(@!CLASS@01);; +let (intsn, ptt, is_finite) + = ppl_@CLASS@_approximate_partition copy01 copy02;; +let out + = if (ppl_@CLASS@_OK copy01 & ppl_@CLASS@_OK copy02) + 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..4635cba --- /dev/null +++ b/interfaces/OCaml/tests/ppl_ocaml_tests_common @@ -0,0 +1,292 @@ +(* Common part of the OCaml generated tests. -*- Tuareg -*- + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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_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..05626bb --- /dev/null +++ b/interfaces/OCaml/tests/test1.ml @@ -0,0 +1,472 @@ +(* Simple program testing the PPL OCaml interface on a few random things. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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 ", ";; + + +(* 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_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";; + +(* 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 + 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 -> + print_string_if_noisy "ppl_reset_timeout test seems to be failed:\n"; + print_string_if_noisy "Unexpected PPL timeout exception caught.\n" + | _ -> + 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 -> + print_string_if_noisy "ppl_set_timeout test succeded\n"; + print_string_if_noisy "Expected PPL timeout exception caught.\n" + | _ -> + print_string_if_noisy "ppl_set_timeout test failed:\n"; + print_string_if_noisy "generic exception caught.\n" + end +);; + +(* Pointset_Powersed_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..a7fad43 --- /dev/null +++ b/interfaces/Prolog/Ciao/Makefile.am @@ -0,0 +1,329 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +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 BUILD_WATCHDOG_LIBRARY + +WATCHDOG_LIBRARY = $(top_builddir)/Watchdog/src/libpwl.la +WATCHDOG_INCLUDE_OPTIONS = -I$(top_builddir)/Watchdog/src +WATCHDOG_DLOPEN = -dlopen $(WATCHDOG_LIBRARY) +WATCHDOG_LINK_OPTIONS = -L$(top_builddir)/Watchdog/src/.libs -lpwl + +endif BUILD_WATCHDOG_LIBRARY + +if ENABLE_SHARED + +AM_CPPFLAGS = \ +-I$(top_srcdir)/interfaces \ +-I$(top_srcdir)/interfaces/Prolog \ +-I$(top_buildir)/interfaces/Prolog \ +-I$(top_builddir)/src \ +$(WATCHDOG_INCLUDE_OPTIONS) \ +$(CIAO_PROLOG_INCLUDE_OPTIONS) \ +@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 + +if NO_UNDEFINED + +NO_UNDEFINED_FLAG = -no-undefined + +endif NO_UNDEFINED + +libppl_ciao_la_LIBADD = \ +@required_instantiations_prolog_cxx_objects@ \ +$(top_builddir)/src/libppl.la \ +$(WATCHDOG_LIBRARY) \ +@extra_libraries@ + +libppl_ciao_la_DEPENDENCIES = \ +@required_instantiations_prolog_cxx_objects@ + +libppl_ciao_la_LDFLAGS = \ +$(NO_UNDEFINED_FLAG) \ +-module \ +-avoid-version + +pkglib_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 + if [ $(srcdir) != `pwd` ]; then \ + cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl .; \ + fi + cp -f ../tests/ppl_prolog_generated_test_main.pl . + ciaoc -o $@ ciao_prolog_generated_test.pl + if [ $(srcdir) != `pwd` ]; then \ + rm -f ppl_prolog_generated_test_common.pl; \ + fi + 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 \ + $(WATCHDOG_DLOPEN) \ + -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 \ + $(WATCHDOG_DLOPEN) \ + -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 \ + $(WATCHDOG_DLOPEN) \ + -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 \ + $(WATCHDOG_DLOPEN) \ + -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 = \ +@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..b373a29 --- /dev/null +++ b/interfaces/Prolog/Ciao/Makefile.in @@ -0,0 +1,1479 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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.am $(srcdir)/Makefile.in +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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +am__libppl_ciao_la_SOURCES_DIST = ppl_prolog_sysdep.hh ciao_efli.hh \ + ciao_efli.cc +@ENABLE_SHARED_TRUE@am_libppl_ciao_la_OBJECTS = ciao_efli.lo +@ENABLE_SHARED_TRUE@nodist_libppl_ciao_la_OBJECTS = \ +@ENABLE_SHARED_TRUE@ ppl_prolog_common.lo +libppl_ciao_la_OBJECTS = $(am_libppl_ciao_la_OBJECTS) \ + $(nodist_libppl_ciao_la_OBJECTS) +libppl_ciao_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(libppl_ciao_la_LDFLAGS) $(LDFLAGS) -o $@ +@ENABLE_SHARED_TRUE@am_libppl_ciao_la_rpath = -rpath $(pkglibdir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libppl_ciao_la_SOURCES) $(nodist_libppl_ciao_la_SOURCES) \ + $(nodist_EXTRA_libppl_ciao_la_SOURCES) +DIST_SOURCES = $(am__libppl_ciao_la_SOURCES_DIST) +pkglibDATA_INSTALL = $(INSTALL_DATA) +DATA = $(pkglib_DATA) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +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 + +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_LIBRARY = $(top_builddir)/Watchdog/src/libpwl.la +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_INCLUDE_OPTIONS = -I$(top_builddir)/Watchdog/src +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_DLOPEN = -dlopen $(WATCHDOG_LIBRARY) +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_LINK_OPTIONS = -L$(top_builddir)/Watchdog/src/.libs -lpwl +@ENABLE_SHARED_TRUE@AM_CPPFLAGS = \ +@ENABLE_SHARED_TRUE@-I$(top_srcdir)/interfaces \ +@ENABLE_SHARED_TRUE@-I$(top_srcdir)/interfaces/Prolog \ +@ENABLE_SHARED_TRUE@-I$(top_buildir)/interfaces/Prolog \ +@ENABLE_SHARED_TRUE@-I$(top_builddir)/src \ +@ENABLE_SHARED_TRUE@$(WATCHDOG_INCLUDE_OPTIONS) \ +@ENABLE_SHARED_TRUE@$(CIAO_PROLOG_INCLUDE_OPTIONS) \ +@ENABLE_SHARED_TRUE@@extra_includes@ + +@ENABLE_SHARED_TRUE@interface_generator_dependencies = \ +@ENABLE_SHARED_TRUE@$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \ +@ENABLE_SHARED_TRUE@../../ppl_interface_generator_common.m4 \ +@ENABLE_SHARED_TRUE@../../ppl_interface_generator_common_dat.m4 \ +@ENABLE_SHARED_TRUE@../../ppl_interface_generator_copyright \ +@ENABLE_SHARED_TRUE@../../ppl_interface_generator_common_procedure_generators.m4 \ +@ENABLE_SHARED_TRUE@../ppl_interface_generator_prolog_procedure_generators.m4 \ +@ENABLE_SHARED_TRUE@../ppl_interface_generator_prolog_systems.m4 \ +@ENABLE_SHARED_TRUE@ppl_interface_generator_ciao_pl.m4 \ +@ENABLE_SHARED_TRUE@ppl_interface_generator_ciao_prolog_generated_test_pl.m4 + +@ENABLE_SHARED_TRUE@pkglib_LTLIBRARIES = libppl_ciao.la +@ENABLE_SHARED_TRUE@libppl_ciao_la_SOURCES = \ +@ENABLE_SHARED_TRUE@ppl_prolog_sysdep.hh \ +@ENABLE_SHARED_TRUE@ciao_efli.hh \ +@ENABLE_SHARED_TRUE@ciao_efli.cc + +@ENABLE_SHARED_TRUE@nodist_libppl_ciao_la_SOURCES = \ +@ENABLE_SHARED_TRUE@../ppl_prolog_common.cc + +@ENABLE_SHARED_TRUE@nodist_EXTRA_libppl_ciao_la_SOURCES = \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Int8_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Int16_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Int32_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Int64_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Uint8_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Uint16_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Uint32_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Uint64_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Float_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Double_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Long_Double_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Rational_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Z_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_int8_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_int16_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_int32_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_int64_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_float.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_double.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_long_double.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_mpq_class.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_mpz_class.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_int8_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_int16_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_int32_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_int64_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_float.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_double.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_long_double.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_mpq_class.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_mpz_class.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Polyhedron.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Grid.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Int8_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Int16_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Int32_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Int64_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Uint8_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Uint16_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Uint32_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Uint64_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Float_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Double_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Rational_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Z_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Grid.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc + +@ENABLE_SHARED_TRUE@@NO_UNDEFINED_TRUE@NO_UNDEFINED_FLAG = -no-undefined +@ENABLE_SHARED_TRUE@libppl_ciao_la_LIBADD = \ +@ENABLE_SHARED_TRUE@@required_instantiations_prolog_cxx_objects@ \ +@ENABLE_SHARED_TRUE@$(top_builddir)/src/libppl.la \ +@ENABLE_SHARED_TRUE@$(WATCHDOG_LIBRARY) \ +@ENABLE_SHARED_TRUE@@extra_libraries@ + +@ENABLE_SHARED_TRUE@libppl_ciao_la_DEPENDENCIES = \ +@ENABLE_SHARED_TRUE@@required_instantiations_prolog_cxx_objects@ + +@ENABLE_SHARED_TRUE@libppl_ciao_la_LDFLAGS = \ +@ENABLE_SHARED_TRUE@$(NO_UNDEFINED_FLAG) \ +@ENABLE_SHARED_TRUE@-module \ +@ENABLE_SHARED_TRUE@-avoid-version + +@ENABLE_SHARED_TRUE@pkglib_DATA = ppl_ciao.po +@ENABLE_SHARED_TRUE@CLPQ_TESTS_NONSTRICT = \ +@ENABLE_SHARED_TRUE@ack.clpq \ +@ENABLE_SHARED_TRUE@ackn.clpq \ +@ENABLE_SHARED_TRUE@fib.clpq \ +@ENABLE_SHARED_TRUE@mc91.clpq \ +@ENABLE_SHARED_TRUE@smm.clpq \ +@ENABLE_SHARED_TRUE@sumto.clpq \ +@ENABLE_SHARED_TRUE@tak.clpq + +@ENABLE_SHARED_TRUE@CLPQ_TESTS_STRICT = \ +@ENABLE_SHARED_TRUE@schedule.clpq + +@ENABLE_SHARED_TRUE@CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT) +@ENABLE_SHARED_TRUE@COEFFICIENT_MNEMONIC = @coefficient_mnemonic@ +@ASSERTIONS_ENABLED_FALSE@@ENABLE_SHARED_TRUE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC) +@ASSERTIONS_ENABLED_TRUE@@ENABLE_SHARED_TRUE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a +@ASSERTIONS_ENABLED_FALSE@@ENABLE_SHARED_TRUE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC) +@ASSERTIONS_ENABLED_TRUE@@ENABLE_SHARED_TRUE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a +@ASSERTIONS_ENABLED_FALSE@@ENABLE_SHARED_TRUE@EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC) +@ASSERTIONS_ENABLED_TRUE@@ENABLE_SHARED_TRUE@EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a +CLEANFILES = \ +ppl_ciao.pl + +MOSTLYCLEANFILES = \ +@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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/Ciao/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign interfaces/Prolog/Ciao/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libppl_ciao.la: $(libppl_ciao_la_OBJECTS) $(libppl_ciao_la_DEPENDENCIES) + $(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 + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ciao_efli.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Float_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Int16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Int32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Int64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Int8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Long_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Rational_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Uint16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Uint32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Uint64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Uint8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Z_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_common.Plo@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +ppl_prolog_common.lo: ../ppl_prolog_common.cc +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_common.Tpo $(DEPDIR)/ppl_prolog_common.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_common.cc' object='ppl_prolog_common.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Int8_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Int8_Box.cc' object='ppl_prolog_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Int16_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Int16_Box.cc' object='ppl_prolog_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Int32_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Int32_Box.cc' object='ppl_prolog_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Int64_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Int64_Box.cc' object='ppl_prolog_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Uint8_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Uint8_Box.cc' object='ppl_prolog_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Uint16_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Uint16_Box.cc' object='ppl_prolog_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Uint32_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Uint32_Box.cc' object='ppl_prolog_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Uint64_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Uint64_Box.cc' object='ppl_prolog_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Float_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Float_Box.cc' object='ppl_prolog_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Double_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Double_Box.cc' object='ppl_prolog_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Long_Double_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Long_Double_Box.cc' object='ppl_prolog_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Rational_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Rational_Box.cc' object='ppl_prolog_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Z_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Z_Box.cc' object='ppl_prolog_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_int8_t.cc' object='ppl_prolog_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_int16_t.cc' object='ppl_prolog_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_int32_t.cc' object='ppl_prolog_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_int64_t.cc' object='ppl_prolog_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_float.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_float.cc' object='ppl_prolog_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_double.cc' object='ppl_prolog_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_long_double.cc' object='ppl_prolog_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_mpq_class.cc' object='ppl_prolog_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_mpz_class.cc' object='ppl_prolog_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_float.cc' object='ppl_prolog_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_double.cc' object='ppl_prolog_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_long_double.cc' object='ppl_prolog_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Polyhedron.cc' object='ppl_prolog_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Grid.Tpo $(DEPDIR)/ppl_prolog_Grid.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Grid.cc' object='ppl_prolog_Grid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Int8_Box.cc' object='ppl_prolog_Pointset_Powerset_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Int16_Box.cc' object='ppl_prolog_Pointset_Powerset_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Int32_Box.cc' object='ppl_prolog_Pointset_Powerset_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Int64_Box.cc' object='ppl_prolog_Pointset_Powerset_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Uint16_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Uint32_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Uint64_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Float_Box.cc' object='ppl_prolog_Pointset_Powerset_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Double_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_Long_Double_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Powerset_Rational_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Rational_Box.cc' object='ppl_prolog_Pointset_Powerset_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Z_Box.cc' object='ppl_prolog_Pointset_Powerset_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_BD_Shape_int8_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_prolog_Pointset_Powerset_BD_Shape_int16_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_prolog_Pointset_Powerset_BD_Shape_int32_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_prolog_Pointset_Powerset_BD_Shape_int64_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_BD_Shape_float.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_BD_Shape_double.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Powerset_C_Polyhedron.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_NNC_Polyhedron.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Grid.cc' object='ppl_prolog_Pointset_Powerset_Grid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-pkglibDATA: $(pkglib_DATA) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(pkglibDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(pkglibDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + done + +uninstall-pkglibDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkglib_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \ + rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +@ENABLE_SHARED_FALSE@check-local: +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(LTLIBRARIES) $(DATA) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-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 + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-exec-am: install-pkglibDATA install-pkglibLTLIBRARIES + +install-html: install-html-am + +install-info: install-info-am + +install-man: + +install-pdf: install-pdf-am + +install-ps: 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-pkglibDATA uninstall-pkglibLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \ + clean-generic clean-libtool clean-pkglibLTLIBRARIES ctags \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-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-pkglibDATA 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 uninstall \ + uninstall-am uninstall-pkglibDATA uninstall-pkglibLTLIBRARIES + + +@ENABLE_SHARED_TRUE@ppl_ciao.pl: $(interface_generator_dependencies) +@ENABLE_SHARED_TRUE@ $(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \ +@ENABLE_SHARED_TRUE@ $(srcdir)/ppl_interface_generator_ciao_pl.m4 > $@ + +@ENABLE_SHARED_TRUE@ciao_prolog_generated_test.pl: $(interface_generator_dependencies) +@ENABLE_SHARED_TRUE@ $(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \ +@ENABLE_SHARED_TRUE@ $(srcdir)/ppl_interface_generator_ciao_prolog_generated_test_pl.m4 > $@ + +@ENABLE_SHARED_TRUE@ppl_ciao.po: ppl_ciao.pl +@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. +@ENABLE_SHARED_TRUE@ciao_pl_check: .libs/libppl_ciao.so ppl_ciao.po ciao_pl_check.pl ../tests/pl_check.pl +@ENABLE_SHARED_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \ +@ENABLE_SHARED_TRUE@ cp -f $(srcdir)/ciao_pl_check.pl .; \ +@ENABLE_SHARED_TRUE@ fi +@ENABLE_SHARED_TRUE@ cp -f $(srcdir)/../tests/pl_check.pl . +@ENABLE_SHARED_TRUE@ ciaoc -o $@ ciao_pl_check.pl +@ENABLE_SHARED_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \ +@ENABLE_SHARED_TRUE@ rm -f ciao_pl_check.pl; \ +@ENABLE_SHARED_TRUE@ fi +@ENABLE_SHARED_TRUE@ rm -f pl_check.pl + +@ENABLE_SHARED_TRUE@ciao_clpq: .libs/libppl_ciao.so ppl_ciao.po ciao_clpq.pl ../tests/clpq.pl | ciao_pl_check +@ENABLE_SHARED_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \ +@ENABLE_SHARED_TRUE@ cp -f $(srcdir)/ciao_clpq.pl .; \ +@ENABLE_SHARED_TRUE@ fi +@ENABLE_SHARED_TRUE@ cp -f $(srcdir)/../tests/clpq.pl . +@ENABLE_SHARED_TRUE@ ciaoc -o $@ ciao_clpq.pl +@ENABLE_SHARED_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \ +@ENABLE_SHARED_TRUE@ rm -f ciao_clpq.pl; \ +@ENABLE_SHARED_TRUE@ fi +@ENABLE_SHARED_TRUE@ rm -f clpq.pl + +@ENABLE_SHARED_TRUE@ciao_clpq2: .libs/libppl_ciao.so ppl_ciao.po ciao_clpq.pl ../tests/clpq2.pl | ciao_pl_check +@ENABLE_SHARED_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \ +@ENABLE_SHARED_TRUE@ cp -f $(srcdir)/ciao_clpq2.pl .; \ +@ENABLE_SHARED_TRUE@ fi +@ENABLE_SHARED_TRUE@ cp -f $(srcdir)/../tests/clpq2.pl . +@ENABLE_SHARED_TRUE@ ciaoc -o $@ ciao_clpq2.pl +@ENABLE_SHARED_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \ +@ENABLE_SHARED_TRUE@ rm -f ciao_clpq2.pl; \ +@ENABLE_SHARED_TRUE@ fi +@ENABLE_SHARED_TRUE@ rm -f clpq2.pl + +@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 +@ENABLE_SHARED_TRUE@ if [ $(srcdir) != `pwd` ]; then \ +@ENABLE_SHARED_TRUE@ cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl .; \ +@ENABLE_SHARED_TRUE@ fi +@ENABLE_SHARED_TRUE@ cp -f ../tests/ppl_prolog_generated_test_main.pl . +@ENABLE_SHARED_TRUE@ ciaoc -o $@ ciao_prolog_generated_test.pl +@ENABLE_SHARED_TRUE@ if [ $(srcdir) != `pwd` ]; then \ +@ENABLE_SHARED_TRUE@ rm -f ppl_prolog_generated_test_common.pl; \ +@ENABLE_SHARED_TRUE@ fi +@ENABLE_SHARED_TRUE@ rm -f ppl_prolog_generated_test_main.pl + +@ENABLE_SHARED_TRUE@check-local: ppl_prolog_generated_test + +@ENABLE_SHARED_TRUE@pl_check_test: ciao_pl_check$(EXEEXT) .libs/libppl_ciao.so $(EXPECTED_PCHK) +@ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=execute \ +@ENABLE_SHARED_TRUE@ -dlopen ../../../src/libppl.la \ +@ENABLE_SHARED_TRUE@ $(WATCHDOG_DLOPEN) \ +@ENABLE_SHARED_TRUE@ -dlopen libppl_ciao.la \ +@ENABLE_SHARED_TRUE@ ./ciao_pl_check \ +@ENABLE_SHARED_TRUE@ >obtained_pchk +@ENABLE_SHARED_TRUE@ diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk + +@ENABLE_SHARED_TRUE@$(CLPQ_TESTS): +@ENABLE_SHARED_TRUE@ cp -f $(srcdir)/../tests/$@ . + +@ENABLE_SHARED_TRUE@clpq_test: ciao_clpq$(EXEEXT) .libs/libppl_ciao.so ../tests/script_clpq $(EXPECTED_CLPQ) $(CLPQ_TESTS) +@ENABLE_SHARED_TRUE@ GLOBALSTKSIZE=1000000 \ +@ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=execute \ +@ENABLE_SHARED_TRUE@ -dlopen ../../../src/libppl.la \ +@ENABLE_SHARED_TRUE@ $(WATCHDOG_DLOPEN) \ +@ENABLE_SHARED_TRUE@ -dlopen libppl_ciao.la \ +@ENABLE_SHARED_TRUE@ ./ciao_clpq \ +@ENABLE_SHARED_TRUE@ <$(srcdir)/../tests/script_clpq >obtained_clpq +@ENABLE_SHARED_TRUE@ diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq + +@ENABLE_SHARED_TRUE@clpq2_test: ciao_clpq2$(EXEEXT) .libs/libppl_ciao.so ../tests/script_clpq2 $(EXPECTED_CLPQ2) $(CLPQ_TESTS) +@ENABLE_SHARED_TRUE@ GLOBALSTKSIZE=100000 \ +@ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=execute \ +@ENABLE_SHARED_TRUE@ -dlopen ../../../src/libppl.la \ +@ENABLE_SHARED_TRUE@ $(WATCHDOG_DLOPEN) \ +@ENABLE_SHARED_TRUE@ -dlopen libppl_ciao.la \ +@ENABLE_SHARED_TRUE@ ./ciao_clpq2 \ +@ENABLE_SHARED_TRUE@ <$(srcdir)/../tests/script_clpq2 >obtained_clpq2 +@ENABLE_SHARED_TRUE@ diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2 + +@ENABLE_SHARED_TRUE@ppl_prolog_generated_test: ciao_prolog_generated_test$(EXEEXT) .libs/libppl_ciao.so ../tests/expected_pgt +@ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=execute \ +@ENABLE_SHARED_TRUE@ -dlopen ../../../src/libppl.la \ +@ENABLE_SHARED_TRUE@ $(WATCHDOG_DLOPEN) \ +@ENABLE_SHARED_TRUE@ -dlopen libppl_ciao.la \ +@ENABLE_SHARED_TRUE@ ./ciao_prolog_generated_test \ +@ENABLE_SHARED_TRUE@ >obtained_pgt +@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..ba16eed --- /dev/null +++ b/interfaces/Prolog/Ciao/README.ciao @@ -0,0 +1,4 @@ +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@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..fc81ba1 --- /dev/null +++ b/interfaces/Prolog/Ciao/ciao_cfli.hh @@ -0,0 +1,340 @@ +/* Ciao Prolog Common Foreign Language Interface. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PCFLI_ciao_cfli_hh +#define PCFLI_ciao_cfli_hh 1 + +#include +#include +#include + +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(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..253ecb1 --- /dev/null +++ b/interfaces/Prolog/Ciao/ciao_clpq.pl @@ -0,0 +1,55 @@ +/* Prolog main program for the toy PPL/CIAO-Prolog CLP(Q) interpreter. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +:- module(_, [main/0], []). +:- use_module(library(debugger)). +:- use_module(library(dynamic)). +:- use_module(library(lists)). +:- use_module(library(prolog_sys)). +:- use_module(library(read)). +:- use_module(library(write)). +:- use_module(ppl_ciao, [ + ppl_initialize/0, + ppl_finalize/0, + ppl_new_C_Polyhedron_from_space_dimension/3, + ppl_new_NNC_Polyhedron_from_space_dimension/3, + ppl_new_C_Polyhedron_from_C_Polyhedron/2, + ppl_new_C_Polyhedron_from_NNC_Polyhedron/2, + ppl_new_NNC_Polyhedron_from_C_Polyhedron/2, + ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2, + ppl_delete_Polyhedron/1, + ppl_Polyhedron_space_dimension/2, + ppl_Polyhedron_get_constraints/2, + ppl_Polyhedron_add_constraints_and_minimize/2, + ppl_Polyhedron_add_space_dimensions_and_embed/2, + ppl_Polyhedron_remove_higher_space_dimensions/2 +]). + +:- set_prolog_flag(multi_arity_warnings, off). + +eat_eol. + +:- include('clpq.pl'). + +main :- + ppl_initialize, + common_main. diff --git a/interfaces/Prolog/Ciao/ciao_clpq2.pl b/interfaces/Prolog/Ciao/ciao_clpq2.pl new file mode 100644 index 0000000..c3804d3 --- /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-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +:- module(_, [main/0], []). +:- use_module(library(debugger)). +:- use_module(library(dynamic)). +:- use_module(library(iso_misc)). +:- use_module(library(lists)). +:- use_module(library(prolog_sys)). +:- use_module(library(read)). +:- use_module(library(sort)). +:- use_module(library(write)). +:- use_module(ppl_ciao, [ + ppl_initialize/0, + ppl_finalize/0, + ppl_new_C_Polyhedron_from_space_dimension/3, + ppl_new_NNC_Polyhedron_from_space_dimension/3, + ppl_new_C_Polyhedron_from_C_Polyhedron/2, + ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2, + ppl_delete_Polyhedron/1, + ppl_Polyhedron_space_dimension/2, + ppl_Polyhedron_get_constraints/2, + ppl_Polyhedron_add_constraints_and_minimize/2, + ppl_Polyhedron_add_space_dimensions_and_embed/2, + ppl_Polyhedron_remove_space_dimensions/2, + ppl_Polyhedron_remove_higher_space_dimensions/2 +]). + +:- set_prolog_flag(multi_arity_warnings, off). + +eat_eol. + +:- include('clpq2.pl'). + +main :- + ppl_initialize, + common_main. diff --git a/interfaces/Prolog/Ciao/ciao_efli.cc b/interfaces/Prolog/Ciao/ciao_efli.cc new file mode 100644 index 0000000..37207fc --- /dev/null +++ b/interfaces/Prolog/Ciao/ciao_efli.cc @@ -0,0 +1,98 @@ +/* Ciao Prolog extended foreign language interface: definitions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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(s)); + } + return 1; +} + +int +Prolog_put_Coefficient(Prolog_term_ref& t, const Coefficient& n) { + int i; + if (assign_r(i, n, ROUND_NOT_NEEDED) == V_EQ) + 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(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..608a90a --- /dev/null +++ b/interfaces/Prolog/Ciao/ciao_efli.hh @@ -0,0 +1,91 @@ +/* Ciao Prolog extended foreign language interface: declarations. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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 +// and/or 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..8a2527f --- /dev/null +++ b/interfaces/Prolog/Ciao/ciao_pl_check.pl @@ -0,0 +1,175 @@ +/* Prolog main program for the toy PPL/CIAO-Prolog predicate checker. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +:- module(_, [main/0], []). +:- use_module(library(debugger)). +:- use_module(library(dynamic)). +:- use_module(library(lists)). +:- use_module(library(prolog_sys)). +:- use_module(library(read)). +:- use_module(library(write)). +:- use_module(ppl_ciao, [ + ppl_version_major/1, + ppl_version_minor/1, + ppl_version_revision/1, + ppl_version_beta/1, + ppl_version/1, + ppl_banner/1, + ppl_max_space_dimension/1, + ppl_Coefficient_is_bounded/0, + ppl_Coefficient_max/1, + ppl_Coefficient_min/1, + ppl_initialize/0, + ppl_finalize/0, + ppl_set_timeout_exception_atom/1, + ppl_timeout_exception_atom/1, + ppl_set_timeout/1, + ppl_reset_timeout/0, + ppl_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_constraint_and_minimize/2, + ppl_Polyhedron_add_generator/2, + ppl_Polyhedron_add_generator_and_minimize/2, + ppl_Polyhedron_add_constraints/2, + ppl_Polyhedron_add_constraints_and_minimize/2, + ppl_Polyhedron_add_generators/2, + ppl_Polyhedron_add_generators_and_minimize/2, + ppl_Polyhedron_intersection_assign/2, + ppl_Polyhedron_intersection_assign_and_minimize/2, + ppl_Polyhedron_poly_hull_assign/2, + ppl_Polyhedron_poly_hull_assign_and_minimize/2, + ppl_Polyhedron_poly_difference_assign/2, + ppl_Polyhedron_affine_image/4, + ppl_Polyhedron_affine_preimage/4, + ppl_Polyhedron_bounded_affine_image/5, + ppl_Polyhedron_bounded_affine_preimage/5, + ppl_Polyhedron_generalized_affine_image/5, + ppl_Polyhedron_generalized_affine_preimage/5, + ppl_Polyhedron_generalized_affine_image_lhs_rhs/4, + ppl_Polyhedron_generalized_affine_preimage_lhs_rhs/4, + ppl_Polyhedron_time_elapse_assign/2, + ppl_Polyhedron_topological_closure_assign/1, + ppl_Polyhedron_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..d7f8559 --- /dev/null +++ b/interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 @@ -0,0 +1,87 @@ +m4_define(`dnl', `m4_dnl')`'dnl +m4_divert(-1) + +dnl This m4 file generates the file ppl_ciao.pl. + +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/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..f3713fe --- /dev/null +++ b/interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generated_test_pl.m4 @@ -0,0 +1,64 @@ +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-2009 Roberto Bagnara +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://www.cs.unipr.it/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..b963051 --- /dev/null +++ b/interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh @@ -0,0 +1,25 @@ +/* System-dependent part of the Prolog interfaces: stub for Ciao Prolog. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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..4b34cb0 --- /dev/null +++ b/interfaces/Prolog/GNU/Makefile.am @@ -0,0 +1,317 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +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 + +if BUILD_WATCHDOG_LIBRARY + +WATCHDOG_LIBRARY = $(top_builddir)/Watchdog/src/libpwl.la +WATCHDOG_INCLUDE_OPTIONS = -I$(top_builddir)/Watchdog/src +WATCHDOG_DLOPEN = -dlopen $(WATCHDOG_LIBRARY) +WATCHDOG_LINK_OPTIONS = -L$(top_builddir)/Watchdog/src/.libs -lpwl + +endif BUILD_WATCHDOG_LIBRARY + +AM_CPPFLAGS = \ +-I$(top_srcdir)/interfaces \ +-I$(top_srcdir)/interfaces/Prolog \ +-I$(top_buildir)/interfaces/Prolog \ +-I$(top_builddir)/src \ +$(WATCHDOG_INCLUDE_OPTIONS) \ +@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 + +if NO_UNDEFINED + +NO_UNDEFINED_FLAG = -no-undefined + +endif NO_UNDEFINED + +libppl_gprolog_la_LIBADD = \ +@required_instantiations_prolog_cxx_objects@ \ +$(top_builddir)/src/libppl.la \ +$(WATCHDOG_LIBRARY) \ +@extra_libraries@ + +libppl_gprolog_la_DEPENDENCIES = \ +@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 > $@ + +pkglib_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 $(WATCHDOG_LINK_OPTIONS) -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 $(WATCHDOG_LINK_OPTIONS) -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 $(WATCHDOG_LINK_OPTIONS) -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 \ + $(WATCHDOG_DLOPEN) \ + -dlopen libppl_gprolog.la \ + ./ppl_gprolog 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 \ + $(WATCHDOG_DLOPEN) \ + -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 + if [ $(srcdir) != `pwd` ]; then \ + cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl . ; \ + 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=65536 $(LIBTOOL) --mode=execute \ + -dlopen ../../../src/libppl.la \ + $(WATCHDOG_DLOPEN) \ + -dlopen libppl_gprolog.la \ + ./ppl_gprolog +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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.am $(srcdir)/Makefile.in +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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" \ + "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +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) +libppl_gprolog_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(libppl_gprolog_la_LDFLAGS) $(LDFLAGS) -o $@ +binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) +PROGRAMS = $(bin_PROGRAMS) +am_ppl_gprolog_OBJECTS = +ppl_gprolog_OBJECTS = $(am_ppl_gprolog_OBJECTS) +ppl_gprolog_LDADD = $(LDADD) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +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) +pkglibDATA_INSTALL = $(INSTALL_DATA) +DATA = $(pkglib_DATA) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +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 + +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_LIBRARY = $(top_builddir)/Watchdog/src/libpwl.la +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_INCLUDE_OPTIONS = -I$(top_builddir)/Watchdog/src +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_DLOPEN = -dlopen $(WATCHDOG_LIBRARY) +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_LINK_OPTIONS = -L$(top_builddir)/Watchdog/src/.libs -lpwl +AM_CPPFLAGS = \ +-I$(top_srcdir)/interfaces \ +-I$(top_srcdir)/interfaces/Prolog \ +-I$(top_buildir)/interfaces/Prolog \ +-I$(top_builddir)/src \ +$(WATCHDOG_INCLUDE_OPTIONS) \ +@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 + +@NO_UNDEFINED_TRUE@NO_UNDEFINED_FLAG = -no-undefined +libppl_gprolog_la_LIBADD = \ +@required_instantiations_prolog_cxx_objects@ \ +$(top_builddir)/src/libppl.la \ +$(WATCHDOG_LIBRARY) \ +@extra_libraries@ + +libppl_gprolog_la_DEPENDENCIES = \ +@required_instantiations_prolog_cxx_objects@ + +libppl_gprolog_la_LDFLAGS = \ +$(NO_UNDEFINED_FLAG) \ +-module \ +-avoid-version + +pkglib_DATA = ppl_gprolog.pl +ppl_gprolog_SOURCES = +@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. +@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 +@USE_INT8_FALSE@SCRIPT_CLPQ2 = $(srcdir)/../tests/script_clpq2 +@USE_INT8_TRUE@SCRIPT_CLPQ2 = $(srcdir)/../tests/script_clpq2_int8 +COEFFICIENT_MNEMONIC = @coefficient_mnemonic@ +@ASSERTIONS_ENABLED_FALSE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC) +@ASSERTIONS_ENABLED_TRUE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a +@ASSERTIONS_ENABLED_FALSE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC) +@ASSERTIONS_ENABLED_TRUE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a +@ASSERTIONS_ENABLED_FALSE@EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC) +@ASSERTIONS_ENABLED_TRUE@EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a +CLEANFILES = \ +ppl_gprolog.pl + +MOSTLYCLEANFILES = \ +@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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/GNU/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign interfaces/Prolog/GNU/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libppl_gprolog.la: $(libppl_gprolog_la_OBJECTS) $(libppl_gprolog_la_DEPENDENCIES) + $(libppl_gprolog_la_LINK) -rpath $(pkglibdir) $(libppl_gprolog_la_OBJECTS) $(libppl_gprolog_la_LIBADD) $(LIBS) +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + if test -f $$p \ + || test -f $$p1 \ + ; then \ + f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ + else :; fi; \ + done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ + rm -f "$(DESTDIR)$(bindir)/$$f"; \ + done + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gprolog_efli.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Float_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Int16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Int32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Int64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Int8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Long_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Rational_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Uint16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Uint32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Uint64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Uint8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Z_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_common.Plo@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +ppl_prolog_common.lo: ../ppl_prolog_common.cc +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_common.Tpo $(DEPDIR)/ppl_prolog_common.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_common.cc' object='ppl_prolog_common.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Int8_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Int8_Box.cc' object='ppl_prolog_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Int16_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Int16_Box.cc' object='ppl_prolog_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Int32_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Int32_Box.cc' object='ppl_prolog_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Int64_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Int64_Box.cc' object='ppl_prolog_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Uint8_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Uint8_Box.cc' object='ppl_prolog_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Uint16_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Uint16_Box.cc' object='ppl_prolog_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Uint32_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Uint32_Box.cc' object='ppl_prolog_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Uint64_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Uint64_Box.cc' object='ppl_prolog_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Float_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Float_Box.cc' object='ppl_prolog_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Double_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Double_Box.cc' object='ppl_prolog_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Long_Double_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Long_Double_Box.cc' object='ppl_prolog_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Rational_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Rational_Box.cc' object='ppl_prolog_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Z_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Z_Box.cc' object='ppl_prolog_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_int8_t.cc' object='ppl_prolog_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_int16_t.cc' object='ppl_prolog_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_int32_t.cc' object='ppl_prolog_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_int64_t.cc' object='ppl_prolog_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_float.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_float.cc' object='ppl_prolog_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_double.cc' object='ppl_prolog_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_long_double.cc' object='ppl_prolog_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_mpq_class.cc' object='ppl_prolog_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_mpz_class.cc' object='ppl_prolog_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_float.cc' object='ppl_prolog_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_double.cc' object='ppl_prolog_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_long_double.cc' object='ppl_prolog_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Polyhedron.cc' object='ppl_prolog_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Grid.Tpo $(DEPDIR)/ppl_prolog_Grid.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Grid.cc' object='ppl_prolog_Grid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Int8_Box.cc' object='ppl_prolog_Pointset_Powerset_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Int16_Box.cc' object='ppl_prolog_Pointset_Powerset_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Int32_Box.cc' object='ppl_prolog_Pointset_Powerset_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Int64_Box.cc' object='ppl_prolog_Pointset_Powerset_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Uint16_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Uint32_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Uint64_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Float_Box.cc' object='ppl_prolog_Pointset_Powerset_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Double_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_Long_Double_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Powerset_Rational_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Rational_Box.cc' object='ppl_prolog_Pointset_Powerset_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Z_Box.cc' object='ppl_prolog_Pointset_Powerset_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_BD_Shape_int8_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_prolog_Pointset_Powerset_BD_Shape_int16_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_prolog_Pointset_Powerset_BD_Shape_int32_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_prolog_Pointset_Powerset_BD_Shape_int64_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_BD_Shape_float.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_BD_Shape_double.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Powerset_C_Polyhedron.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_NNC_Polyhedron.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Grid.cc' object='ppl_prolog_Pointset_Powerset_Grid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-pkglibDATA: $(pkglib_DATA) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(pkglibDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(pkglibDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + done + +uninstall-pkglibDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkglib_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \ + rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-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 + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-exec-am: install-binPROGRAMS install-pkglibDATA \ + install-pkglibLTLIBRARIES + +install-html: install-html-am + +install-info: install-info-am + +install-man: + +install-pdf: install-pdf-am + +install-ps: 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-pkglibDATA \ + uninstall-pkglibLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \ + clean-binPROGRAMS clean-generic clean-libtool \ + clean-pkglibLTLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-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-pkglibDATA \ + 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 uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-pkglibDATA \ + 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 $(WATCHDOG_LINK_OPTIONS) -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 $(WATCHDOG_LINK_OPTIONS) -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 $(WATCHDOG_LINK_OPTIONS) -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 \ + $(WATCHDOG_DLOPEN) \ + -dlopen libppl_gprolog.la \ + ./ppl_gprolog 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 \ + $(WATCHDOG_DLOPEN) \ + -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 + if [ $(srcdir) != `pwd` ]; then \ + cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl . ; \ + 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=65536 $(LIBTOOL) --mode=execute \ + -dlopen ../../../src/libppl.la \ + $(WATCHDOG_DLOPEN) \ + -dlopen libppl_gprolog.la \ + ./ppl_gprolog /lib/ppl', +where 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 /lib/ppl/ppl_gprolog.pl source1.pl source2.pl \ + -L '-Wl,-rpath=/lib/ppl -L/lib/ppl -lppl_gprolog \ + -L/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..436d14a --- /dev/null +++ b/interfaces/Prolog/GNU/gnu_pl_check.pl @@ -0,0 +1,36 @@ +/* Prolog main program for the PPL/GNU-Prolog predicate checker. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +prolog_system('GNU'). + +main :- + current_output(Old_Stream), + open(obtained_pchk, write, Stream), + set_output(Stream), + (check_all -> + write('OK') + ; + write('FAILURE') + ), + nl, + close(Stream), + set_output(Old_Stream). diff --git a/interfaces/Prolog/GNU/gnu_prolog_generated_test.pl b/interfaces/Prolog/GNU/gnu_prolog_generated_test.pl new file mode 100644 index 0000000..cc7774a --- /dev/null +++ b/interfaces/Prolog/GNU/gnu_prolog_generated_test.pl @@ -0,0 +1,36 @@ +/* Prolog main program for the PPL/GNU-Prolog predicate checker. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +prolog_system('GNU'). + +main :- + current_output(Old_Stream), + open(obtained_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..9cbad3e --- /dev/null +++ b/interfaces/Prolog/GNU/gp_clpq.pl @@ -0,0 +1,31 @@ +/* Main program for the toy PPL/GNU-Prolog CLP(Q) interpreter. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +:- initialization(main). + +eat_eol. + +main :- + ppl_initialize, + common_main, + ppl_finalize, + halt. diff --git a/interfaces/Prolog/GNU/gprolog_cfli.hh b/interfaces/Prolog/GNU/gprolog_cfli.hh new file mode 100644 index 0000000..16a6820 --- /dev/null +++ b/interfaces/Prolog/GNU/gprolog_cfli.hh @@ -0,0 +1,460 @@ +/* GNU Prolog Common Foreign Language Interface. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PCFLI_gprolog_cfli_hh +#define PCFLI_gprolog_cfli_hh 1 + +#if SIZEOF_FP == SIZEOF_INTP +// Horrible kludge working around an horrible bug in (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 +#undef byte_code +#undef last_read_line +#undef last_read_col +#else +#include +#endif + +#if defined(__GPROLOG_VERSION__) && __GPROLOG_VERSION__ >= 10301 +#define PPL_GPROLOG_H_IS_CLEAN +#endif + +#ifndef PPL_GPROLOG_H_IS_CLEAN +// 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 +#include + +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(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(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(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(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(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..dbb089c --- /dev/null +++ b/interfaces/Prolog/GNU/gprolog_efli.cc @@ -0,0 +1,81 @@ +/* GNU Prolog extended foreign language interface: definitions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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; + +long Prolog_min_integer; + +long 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) { + long v; + Prolog_get_long(t, &v); + n = v; + return 1; +} + +int +Prolog_put_Coefficient(Prolog_term_ref& t, const Coefficient& n) { + long l = 0; + if (assign_r(l, n, ROUND_NOT_NEEDED) != V_EQ + || !Prolog_put_long(t, l)) + throw PPL_integer_out_of_range(n); + 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..dae2470 --- /dev/null +++ b/interfaces/Prolog/GNU/gprolog_efli.hh @@ -0,0 +1,88 @@ +/* GNU Prolog extended foreign language interface: declarations. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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..3a2b9d3 --- /dev/null +++ b/interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4 @@ -0,0 +1,46 @@ +m4_define(`dnl', `m4_dnl')`'dnl +m4_divert(-1) + +dnl This m4 file generates the file ppl_gprolog.pl. + +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/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..a0c4e7f --- /dev/null +++ b/interfaces/Prolog/GNU/ppl_prolog_sysdep.hh @@ -0,0 +1,25 @@ +/* System-dependent part of the Prolog interfaces: stub for GNU Prolog. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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..35268cd --- /dev/null +++ b/interfaces/Prolog/Makefile.am @@ -0,0 +1,138 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/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 \ +ppl_prolog_sysdep_dox \ +ppl_prolog_sysindep_dox + +EXTRA_DIST = \ +$(interface_generator_files) \ +ppl_prolog_common.defs.hh \ +ppl_prolog_common.inlines.hh \ +ppl_prolog_common.cc \ +$(interface_generator_dox_files) \ +Prolog_interface.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 \ +ppl_prolog_sysdep_dox \ +ppl_prolog_sysindep_dox + +Prolog_configured_interface.dox: \ +$(interface_generator_dox_dependencies) Makefile + $(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \ + $(srcdir)/ppl_interface_generator_prolog_dox.m4 \ + > Prolog_configured_interface.dox + +BUILT_SOURCES = \ +ppl_prolog_domains.hh \ +ppl_prolog_domains.cc.stamp + +nodist_noinst_DATA = Prolog_configured_interface.dox + +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_prolog_procedure_generators.m4 \ +$(top_builddir)/interfaces/ppl_interface_instantiations.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_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 = \ +@required_instantiations_prolog_cxx_headers@ \ +@required_instantiations_prolog_cxx_sources@ \ +ppl_prolog_domains.cc.stamp \ +ppl_prolog_domains.hh \ +Prolog_configured_interface.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..7619fad --- /dev/null +++ b/interfaces/Prolog/Makefile.in @@ -0,0 +1,705 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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.am $(srcdir)/Makefile.in +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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-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 uninstall-recursive +DATA = $(nodist_noinst_DATA) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = . tests Ciao GNU SICStus SWI XSB YAP +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +@BUILD_CIAO_PROLOG_INTERFACE_TRUE@CIAO_PROLOG_SUBDIR = Ciao +@BUILD_GNU_PROLOG_INTERFACE_TRUE@GNU_PROLOG_SUBDIR = GNU +@BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@SICSTUS_PROLOG_SUBDIR = SICStus +@BUILD_SWI_PROLOG_INTERFACE_TRUE@SWI_PROLOG_SUBDIR = SWI +@BUILD_XSB_PROLOG_INTERFACE_TRUE@XSB_PROLOG_SUBDIR = XSB +@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 \ +ppl_prolog_sysdep_dox \ +ppl_prolog_sysindep_dox + +EXTRA_DIST = \ +$(interface_generator_files) \ +ppl_prolog_common.defs.hh \ +ppl_prolog_common.inlines.hh \ +ppl_prolog_common.cc \ +$(interface_generator_dox_files) \ +Prolog_interface.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 \ +ppl_prolog_sysdep_dox \ +ppl_prolog_sysindep_dox + +BUILT_SOURCES = \ +ppl_prolog_domains.hh \ +ppl_prolog_domains.cc.stamp + +nodist_noinst_DATA = Prolog_configured_interface.dox +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_prolog_procedure_generators.m4 \ +$(top_builddir)/interfaces/ppl_interface_instantiations.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 + +CLEANFILES = \ +@required_instantiations_prolog_cxx_headers@ \ +@required_instantiations_prolog_cxx_sources@ \ +ppl_prolog_domains.cc.stamp \ +ppl_prolog_domains.hh \ +Prolog_configured_interface.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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign interfaces/Prolog/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + 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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -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 + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-exec-am: + +install-html: install-html-recursive + +install-info: install-info-recursive + +install-man: + +install-pdf: install-pdf-recursive + +install-ps: install-ps-recursive + +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: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ + install-strip + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive 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-recursive \ + uninstall uninstall-am + + +Prolog_configured_interface.dox: \ +$(interface_generator_dox_dependencies) Makefile + $(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \ + $(srcdir)/ppl_interface_generator_prolog_dox.m4 \ + > Prolog_configured_interface.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_interface.dox b/interfaces/Prolog/Prolog_interface.dox new file mode 100644 index 0000000..7ab65d3 --- /dev/null +++ b/interfaces/Prolog/Prolog_interface.dox @@ -0,0 +1,1798 @@ +/* Configuration Independent Documentation for Prolog. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +/*! + \defgroup 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 system-independent features of the library are described in +Section \ref PI_SI_Features "System-Independent Features". +Section \ref PI_Compilation "Compilation and Installation" +explains how the Prolog interface is compiled and installed. +Section \ref PI_SD_Features "System-Dependent Features" +illustrates the system-dependent features of the interface +for all the supported systems. + +The structure of this section is as follows: +- \ref PI_SI_Features "System-Independent Features" + - \ref Prolog_Interface_Overview "Overview" + - \ref Predicate_Specifications "Predicate Specifications" + - \ref predicate_descriptions "Predicate Descriptions" + - \ref di_predicates "Domain Independent Predicates" + - \ref mip_predicates "MIP Predicates" + - \ref Polyhedron_predicates "Predicates for C Polyhedra" + - \ref other_domains "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 the sequel, prefix is the prefix under which +you have installed the library (typically /usr +or /usr/local). + +\anchor PI_SI_Features +

System-Independent Features

+ +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 +

Overview

+ +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 simple domains, powersets of a simple domain and + products of simple domains. + - The simple domains are: + - convex polyhedra, which consist of C_Polyhedron and + NNC_Polyhedron;
+ - 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;
+ - 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
+ - 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 domain + and any element of a PPL domain is called a PPL object. +- The Prolog interface to the PPL is initialized and finalized by the + predicates ppl_initialize/0 and ppl_finalize/0. + Thus the only interface predicates callable after + ppl_finalize/0 are ppl_finalize/0 itself + (this further call has no effect) and ppl_initialize/0, + 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 ppl_initialize/0 and/or + ppl_finalize/0 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 ppl_initialize/0 and ppl_finalize/0 + 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 handle. + 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 ppl_delete_Polyhedron/1. + 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 + ppl_delete_Polyhedron/1, + 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 +

Predicate Specifications

+ +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] + + 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 --> PPLVar - PPLVar map relation + + P_Func --> [] list of map relations + | [Vars_Pair | P_Func]. + + Optimization_Mode --> max | min + + MIP_Problem_Status --> unfeasible + | unbounded + | optimized + + Control_Parameter_Name --> pricing for MIP problems + + Control_Parameter_Value for MIP problems + --> pricing_steepest_edge_float + | pricing_steepest_edge_exact + | pricing_rextbook + + Vars_List --> [] list of PPL variables + | [PPL_Var | Vars_List]. +\endcode + +\anchor predicate_descriptions +

Predicate Descriptions

+ +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 +

Domain Independent Predicates

+ +First we describe the domain independent predicates +that are included with all instantiations of the Prolog interfaces. + +

ppl_version_major(?C_int)
+ Unifies C_int with the major number of the PPL version. + +

ppl_version_minor(?C_int)
+ Unifies C_int with the minor number of the PPL version. + +

ppl_version_revision(?C_int)
+ Unifies C_int with the revision number + of the PPL version. + +

ppl_version_beta(?C_int)
+ Unifies C_int with the beta number of the PPL version. + +

ppl_version(?Atom)
+ Unifies Atom with the PPL version. + +

ppl_banner(?Atom)
+ Unifies Atom 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. + +

ppl_Coefficient_is_bounded
+ + Succeeds if and only if the Coefficients in the C++ interface are bounded. + +

ppl_Coefficient_max(Max)
+ + If the Coefficients in the C++ interface are bounded, + then the maximum coefficient the C++ interface can handle is + unified with Max. + If the Prolog system cannot handle this coefficient, then + an exception is thrown. + It fails if the Coefficients in the C++ interface are unbounded. + +

ppl_Coefficient_min(Min)
+ + If the Coefficients in the C++ interface are bounded, + then the minimum coefficient the C++ interface can handle is + unified with Min. + If the Prolog system cannot handle this coefficient, then + an exception is thrown. + It fails if the Coefficients in the C++ interface are unbounded. + +

ppl_max_space_dimension(?Dimension_Type)
+ + Unifies Dimension_Type with the maximum space dimension + this library can handle. + +

+ ppl_initialize +
+ + Initializes the PPL interface. + Multiple calls to ppl_initialize does no harm. + +

+ ppl_finalize +
+ + Finalizes the PPL interface. + Once this is executed, the next call to an interface predicate must + either be to ppl_initialize or to ppl_finalize. + Multiple calls to ppl_finalize does no harm. + +

ppl_set_timeout_exception_atom(+Atom)
+ + Sets the atom to be thrown by timeout exceptions + to Atom. + The default value is time_out. + +

ppl_timeout_exception_atom(?Atom)
+ + The atom to be thrown by timeout exceptions + is unified with Atom. + +

ppl_set_timeout(+Hsecs)
+ + Computations taking exponential time will be interrupted + some time after Hsecs hundreths of seconds after that call. + If the computation is interrupted that way, the current timeout + exception atom will be thrown. + Hsecs must be strictly greater than zero. + +

ppl_reset_timeout
+ + Resets the timeout time so that the computation is not interrupted. + +

ppl_set_rounding_for_PPL
+ + 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. + + +

ppl_restore_pre_PPL_rounding
+ + 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. + +\anchor mip_predicates +

MIP Predicates

+Here we describe the predicates available for PPL objects +defining mixed integer (linear) programming problems. + +

+ ppl_new_MIP_Problem_from_space_dimension(+Dimension_Type, -Handle) +
+ + Creates an MIP Problem \f$\mathrm{MIP}\f$ with the feasible region + the vector space of dimension Dimension_Type, + objective function \f$0\f$ and optimization mode max. + Handle is unified with the handle for \f$\mathrm{MIP}\f$. + +

+ ppl_new_MIP_Problem(+Constraint_System, +Lin_Expr, +Optimization_Mode, + -Handle) +
+ + Creates an MIP Problem \f$\mathrm{MIP}\f$ with + the feasible region represented by Constraint_System, + objective function Lin_Expr and optimization mode + Optimization_Mode. + Handle is unified with the handle for \f$\mathrm{MIP}\f$. + +

+ ppl_new_MIP_Problem_from_MIP_Problem(+Handle_1, -Handle_2) +
+ + 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$. + +

+ ppl_MIP_Problem_swap(+Handle_1, +Handle_2) +
+ + Swaps the MIP Problem referenced by Handle_1 + with the one referenced by Handle_2. + +

+ ppl_delete_MIP_Problem(+Handle) +
+ + Deletes the MIP Problem referenced by Handle. + After execution, + Handle is no longer a valid handle for a PPL MIP Problem. + +

+ ppl_MIP_Problem_space_dimension(+Handle, ?Dimension_Type) +
+ + Unifies the dimension of the vector space in which the + MIP Problem referenced by Handle is embedded + with Dimension_Type. + +

+ ppl_MIP_Problem_integer_space_dimensions(+Handle, ?Vars_List) +
+ + Unifies Vars_List with a list of variables representing + the integer space dimensions of the MIP Problem + referenced by Handle. + +

+ ppl_MIP_Problem_constraints(+Handle, -Constraint_System) +
+ + Unifies Constraint_System with a list of + the constraints in the constraints system + representing the feasible region for the MIP Problem + referenced by Handle. + +

+ ppl_MIP_Problem_objective_function(+Handle, ?Lin_Expr) +
+ + Unifies Lin_Expr with the objective function + for the MIP Problem referenced by Handle. + +

+ ppl_MIP_Problem_optimization_mode(+Handle, ?Optimization_Mode) +
+ + Unifies Optimization_Mode with the optimization mode + for the MIP Problem referenced by Handle. + +

+ ppl_MIP_Problem_clear(+Handle) +
+ + Resets the MIP problem referenced by Handle + to be the trivial problem with + the feasible region the \f$0\f$-dimensional universe, + objective function \f$0\f$ and optimization mode max. + +

ppl_MIP_Problem_add_space_dimensions_and_embed( + +Handle, +Dimension_Type) +
+ + Embeds the MIP problem referenced by Handle + in a space that is enlarged by Dimension_Type dimensions. + +

+ ppl_MIP_Problem_add_to_integer_space_dimensions(+Handle, +Vars_List) +
+ + Updates the MIP Problem referenced by Handle + so that the variables in Vars_List are added to + the set of integer space dimensions. + +

+ ppl_MIP_Problem_add_constraint(+Handle, +Constraint) +
+ + Updates the MIP Problem referenced by Handle + so that the feasible region is represented by the original constraint + system together with the constraint Constraint. + +

+ ppl_MIP_Problem_add_constraints(+Handle, +Constraint_System) +
+ + Updates the MIP Problem referenced by Handle + so that the feasible region is represented by the original constraint + system together with all the constraints in + Constraint_System. + +

+ ppl_MIP_Problem_set_objective_function(+Handle, +Lin_Expr) +
+ + Updates the MIP Problem referenced by Handle + so that the objective function is changed to Lin_Expr. + +

+ ppl_MIP_Problem_set_control_parameter(+Handle, +Control_Parameter_Value) +
+ + Updates the MIP Problem referenced by Handle + so that the value for the relevant control parameter name is + changed to Control_Parameter_Value. + +

+ ppl_MIP_Problem_get_control_parameter(+Handle, +Control_Parameter_Name, + ?Control_Parameter_Value) +
+ + Unifies \c Control_Parameter_Value with the value of the + control parameter \c Control_Parameter_Name. + +

+ ppl_MIP_Problem_set_optimization_mode(+Handle, +Optimization_Mode) +
+ + Updates the MIP Problem referenced by Handle + so that the optimization mode is changed to + Optimization_Mode. + +

+ ppl_MIP_Problem_is_satisfiable(+Handle) +
+ + Succeeds if and only if the MIP Problem referenced by + Handle is satisfiable. + +

+ ppl_MIP_Problem_solve(+Handle, ?MIP_Problem_Status) +
+ + Solves the MIP problem referenced by + Handle and unifies MIP_Problem_Status + with: + unfeasible, if the MIP problem is not satisfiable; + unbounded, if the MIP problem is satisfiable but + there is no finite bound to the value of the objective function; + optimized, if the MIP problem admits an optimal solution. + +

+ ppl_MIP_Problem_feasible_point(+Handle, ?Generator) +
+ + Unifies Generator with a feasible point + for the MIP problem referenced by Handle. + +

+ ppl_MIP_Problem_optimizing_point(+Handle, ?Generator) +
+ + Unifies Generator with an optimizing point for + the MIP problem referenced by Handle. + +

+ ppl_MIP_Problem_optimal_value(+Handle, ?Coeff_1, ?Coeff_2) +
+ + Unifies Coeff_1 and Coeff_2 + with the numerator and denominator, respectively, for the optimal value + for the MIP problem referenced by Handle. + +

+ ppl_MIP_Problem_evaluate_objective_function(+Handle, +Generator, + ?Coeff_1, ?Coeff_2) +
+ Evaluates the objective function of the MIP problem referenced by + Handle at point Generator. + Coefficient_1 is unified with the numerator and + Coefficient_2 is unified with the denominator of the + objective function value at Generator. + +

+ ppl_MIP_Problem_OK(+Handle) +
+ + Succeeds only if the MIP Problem referenced by + Handle is well formed, i.e., if it + satisfies all its implementation invariants. + Useful for debugging purposes. + +
+ +\anchor Polyhedron_predicates +

Predicates for the C Polyhedron Domain

+ 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. + +

Constructor, copy, conversion and destructor predicates

+

Constructor predicates for C polyhedra

+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. + +

ppl_new_C_Polyhedron_from_space_dimension(+Dimension_Type, +Universe_or_Empty, -Handle)
+ 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. + +

ppl_new_C_Polyhedron_from_constraints(+Constraint_System, -Handle)
+ Builds a new C polyhedron \p P from + \c Constraint_System. + \c Handle is unified with the handle for \p P. + +

ppl_new_C_Polyhedron_from_congruences(+Congruence_System, -Handle)
+ Builds a new C polyhedron \p P from + \c Congruence_System. + \c Handle is unified with the handle for \p P. + +

ppl_new_C_Polyhedron_from_generators(+Generator_System, -Handle)
+ Builds a new C polyhedron \p P from + \c Generator_System. + \c Handle is unified with the handle for \p P. + + +

Predicates that build new C polyhedra + by copying or converting from + other semantic geometric descriptions

+ 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.).
+ + 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. + +

ppl_new_C_Polyhedron_from_C_Polyhedron(+Handle_1, -Handle_2)
+ 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. + +

ppl_new_C_Polyhedron_from_NNC_Polyhedron(+Handle_1, -Handle_2)
+ 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. + +

ppl_new_C_Polyhedron_from_C_Polyhedron_with_complexity(+Handle, +Complexity, -Handle)
+ 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. + +

ppl_new_C_Polyhedron_from_NNC_Polyhedron_with_complexity(+Handle, +Complexity, -Handle)
+ 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. + + +

Destructor predicate

+Below is the destructor predicate for the Polyhedron domain. + +

ppl_delete_Polyhedron(+Handle)
+ Invalidates the handle referenced by \c Handle: + this makes sure the corresponding resources will eventually be released. + + +

Predicates that do not change the polyhedron

+

Test Predicates

+These predicates test the polyhedron for different properties +and succeed or fail depending on the outcome. + +

ppl_Polyhedron_is_empty(+Handle)
+ Succeeds if and only if the polyhedron referenced by + \c Handle is empty. + +

ppl_Polyhedron_is_universe(+Handle)
+ Succeeds if and only if the polyhedron referenced by + \c Handle is the universe. + +

ppl_Polyhedron_is_bounded(+Handle)
+ Succeeds if and only if the polyhedron referenced by + \c Handle is bounded. + +

ppl_Polyhedron_contains_integer_point(+Handle)
+ Succeeds if and only if the polyhedron referenced by + \c Handle contains an integer point. + +

ppl_Polyhedron_is_topologically_closed(+Handle)
+ Succeeds if and only if the polyhedron referenced by + \c Handle is topologically closed. + +

ppl_Polyhedron_is_discrete(+Handle)
+ Succeeds if and only if the polyhedron referenced by + \c Handle is discrete. + +

ppl_Polyhedron_bounds_from_above(+Handle, +Lin_Expr)
+ Succeeds if and only if Lin_Expr is bounded from above + in the polyhedron referenced by \c Handle. + +

ppl_Polyhedron_bounds_from_below(+Handle, +Lin_Expr)
+ Succeeds if and only if Lin_Expr is bounded from below + in the polyhedron referenced by \c Handle. + +

ppl_Polyhedron_contains_Polyhedron(+Handle_1, +Handle_2)
+ Succeeds if and only if the polyhedron referenced by + Handle_2 is included in or equal to + the polyhedron referenced by Handle_1. + +

ppl_Polyhedron_strictly_contains_Polyhedron(+Handle_1, +Handle_2)
+ Succeeds if and only if the polyhedron referenced by + Handle_2 is included in but not equal to + the polyhedron referenced by Handle_1. + +

ppl_Polyhedron_is_disjoint_from_Polyhedron(+Handle_1, +Handle_2)
+ Succeeds if and only if the polyhedron referenced by + Handle_2 is disjoint from + the polyhedron referenced by Handle_1. + +

ppl_Polyhedron_equals_Polyhedron(+Handle_1, +Handle_2)
+ Succeeds if and only if the polyhedron referenced by + Handle_1 is + equal to the polyhedron referenced by Handle_2. + +

ppl_Polyhedron_OK(+Handle)
+ 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. + +

ppl_Polyhedron_constrains(+Handle, +PPL_Var)
+ Succeeds if and only if the polyhedron referenced by + \c Handle constrains the dimension \c PPL_Var. + + +

Predicates that return information about the polyhedron

+These predicates will obtain more detailed information about the +polyhedron +unifying some of their arguments with the results. + +

ppl_Polyhedron_space_dimension(+Handle, ?Dimension_Type)
+ Unifies \c Dimension_Type with the dimension of the vector space enclosing + the polyhedron referenced by \c Handle. + +

ppl_Polyhedron_affine_dimension(+Handle, ?Dimension_Type)
+ Unifies \c Dimension_Type with the affine dimension of + the polyhedron referenced by \c Handle. + +

ppl_Polyhedron_relation_with_constraint(+Handle, +Constraint, ?Relation_List)
+ 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. + +

ppl_Polyhedron_relation_with_generator(+Handle, +Generator, ?Relation_List)
+ 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. + +

ppl_Polyhedron_relation_with_congruence(+Handle, +Congruence, ?Relation_List)
+ 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. + +

ppl_Polyhedron_get_constraints(+Handle, ?Constraint_System)
+ 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. + +

ppl_Polyhedron_get_congruences(+Handle, ?Congruence_System)
+ 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. + +

ppl_Polyhedron_get_generators(+Handle, ?Generator_System)
+ Unifies \c Generator_System with + the generators (in the form of a list) in the generator system + for the polyhedron referenced by \c Handle. + +

ppl_Polyhedron_get_minimized_constraints(+Handle, ?Constraint_System)
+ 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. + +

ppl_Polyhedron_get_minimized_congruences(+Handle, ?Congruence_System)
+ 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. + +

ppl_Polyhedron_get_minimized_generators(+Handle, ?Generator_System)
+ 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. + +

ppl_Polyhedron_maximize(+Handle, +Lin_Expr, ?Coeff_1, ?Coeff_2, ?Boolean)
+ 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. + +

ppl_Polyhedron_minimize(+Handle, +Lin_Expr, ?Coeff_1, ?Coeff_2, ?Boolean)
+ 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. + +

ppl_Polyhedron_maximize_with_point(+Handle, +Lin_Expr, ?Coeff_1, ?Coeff_2, ?Boolean, ?Point)
+ 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. + +

ppl_Polyhedron_minimize_with_point(+Handle, +Lin_Expr, ?Coeff_1, ?Coeff_2, ?Boolean, ?Point)
+ 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. + +

ppl_Polyhedron_external_memory_in_bytes(+Handle, ?Number)
+Unifies \c Number with the size of the total memory in +bytes occupied by the polyhedron referenced by \c Handle. + +

ppl_Polyhedron_total_memory_in_bytes(+Handle, ?Number)
+Unifies \c Number with the size of the external memory in +bytes occupied by the polyhedron referenced by \c Handle. + + +

Ascii dump predicate

+This output predicate is useful for debugging. + +

ppl_Polyhedron_ascii_dump(+Handle)
+ Dumps an ascii representation of the PPL internal state for + the polyhedron referenced by \c Handle on the standard output. + + +

Space-dimension preserving predicates that may change + the polyhedron

+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. +

Predicates that may change the polyhedron by adding +to its constraint or generator descriptions

+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. + +

ppl_Polyhedron_add_constraint(+Handle, +Constraint)
+ 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. + +

ppl_Polyhedron_add_congruence(+Handle, +Congruence)
+ 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. + +

ppl_Polyhedron_add_generator(+Handle, +Generator)
+ 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. + +

ppl_Polyhedron_add_constraints( + +Handle, + +Constraint_System)
+ 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. + +

ppl_Polyhedron_add_congruences( + +Handle, + +Congruence_System)
+ 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. + +

ppl_Polyhedron_add_generators( + +Handle, + +Generator_System)
+ 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. + +

ppl_Polyhedron_refine_with_constraint( + +Handle, + +Constraint)
+ Updates the polyhedron referenced by \c Handle to + one obtained by refining its constraint system with + \c Constraint. + +

ppl_Polyhedron_refine_with_congruence( + +Handle, + +Congruence)
+ Updates the polyhedron referenced by \c Handle to + one obtained by refining its congruence system with + \c Congruence. + +

ppl_Polyhedron_refine_with_constraints( + +Handle, + +Constraint_System)
+ Updates the polyhedron referenced by \c Handle to + one obtained by refining its constraint system with + the constraints in \c Constraint_System. + +

ppl_Polyhedron_refine_with_congruences( + +Handle, + +Congruence_System)
+ Updates the polyhedron referenced by \c Handle to + one obtained by refining its congruence system with + the congruences in \c Congruence_System. + + +

Predicates that transform the polyhedron

+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} +

ppl_Polyhedron_topological_closure_assign(+Handle)
+ Assigns to the polyhedron referenced by \c Handle + its topological closure. + +

ppl_Polyhedron_unconstrain_space_dimension(+Handle, +PPL_Var)
+ Modifies the polyhedron \p P referenced by \c Handle by unconstraining + the space dimension \c PPL_Var. + +

ppl_Polyhedron_unconstrain_space_dimensions(+Handle, +List_of_PPL_Var)
+ 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. + +

ppl_Polyhedron_affine_image(+Handle, +PPL_Var, +Lin_Expr, +Coeff)
+ Transforms the polyhedron referenced by \c Handle + assigning the affine expression for \c Lin_Expr/\c Coeff to \c PPL_Var. + +

ppl_Polyhedron_affine_preimage(+Handle, +PPL_Var, +Lin_Expr, +Coeff)
+ Transforms the polyhedron referenced by \c Handle + substituting the affine expression for \c Lin_Expr/\c Coeff to \c PPL_Var. + +

ppl_Polyhedron_bounded_affine_image(+Handle, +PPL_Var, +Lin_Expr_1, +Lin_Expr_2, +Coeff)
+ 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. + +

ppl_Polyhedron_bounded_affine_preimage(+Handle, +PPL_Var, +Lin_Expr_1, +Lin_Expr_2, +Coeff)
+ 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. + +

ppl_Polyhedron_generalized_affine_image(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coeff)
+ 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. + +

ppl_Polyhedron_generalized_affine_preimage(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coeff)
+ 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. + +

ppl_Polyhedron_generalized_affine_image_lhs_rhs(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2)
+ 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. + +

ppl_Polyhedron_generalized_affine_preimage_lhs_rhs(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2)
+ 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. + + +

Predicates whose results depend on more than one polyhedron

+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. + +

ppl_Polyhedron_intersection_assign(+Handle_1, +Handle_2)
+ Assigns to the polyhedron \p P referenced by \c Handle_1 + the intersection of \p P and the polyhedron referenced by \c Handle_2. + +

ppl_Polyhedron_upper_bound_assign(+Handle_1, +Handle_2)
+ 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. + +

ppl_Polyhedron_difference_assign(+Handle_1, +Handle_2)
+ Assigns to the polyhedron \p P referenced by \c Handle_1 + the difference of \p P and the polyhedron referenced by \c Handle_2. + +

ppl_Polyhedron_time_elapse_assign(+Handle_1, +Handle_2)
+ 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. + +

ppl_Polyhedron_poly_hull(+Handle_1, +Handle_2)
+ 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. + +

ppl_Polyhedron_poly_difference(+Handle_1, +Handle_2)
+ 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. + +

ppl_Polyhedron_upper_bound_assign_if_exact(+Handle_1, +Handle_2)
+ 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. + +

ppl_Polyhedron_poly_hull_assign_if_exact(+Handle_1, +Handle_2)
+ 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. + +

ppl_Polyhedron_simplify_using_context_assign(+Handle_1, +Handle_2, ?Boolean)
+ 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. + +

ppl_Polyhedron_linear_partition(+Handle_1, +Handle_2, -Handle_3, + -Handle_4)
+ \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. + + +

Predicates for widening and extrapolation

+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. + +

ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)
+ 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. + +

ppl_Polyhedron_H79_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)
+ 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. + +

ppl_Polyhedron_BHRZ03_widening_assign(+Handle_1, +Handle_2)
+ 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. + +

ppl_Polyhedron_H79_widening_assign(+Handle_1, +Handle_2)
+ 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. + +

ppl_Polyhedron_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)
+Same as predicate ppl_Polyhedron_H79_widening_assign_with_tokens/4 + +

ppl_Polyhedron_widening_assign(+Handle_1, +Handle_2)
+Same as predicate ppl_Polyhedron_H79_widening_assign/2 + +

ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)
+ 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. + +

ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)
+ 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. + +

ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)
+ 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. + +

ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)
+ 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. + +

ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)
+ 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. + +

ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)
+ 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. + +

ppl_Polyhedron_limited_H79_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)
+ 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. + +

ppl_Polyhedron_bounded_H79_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)
+ 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. + + +

Predicates that may modify the vector space

+These predicates enable the modification of the vector space +of the polyhedron referred to in the first argument. +

Predicate for concatenation

+For more information on this operation, see Section +\extref{Concatenating_Polyhedra, Concatenating Polyhedra}, +of the main \extref{preamble, PPL User Manual}. + +

ppl_Polyhedron_concatenate_assign(+Handle_1, +Handle_2)
+ Assigns to the polyhedron \p P referenced by \c Handle_1 + the concatenation of \p P and the polyhedron referenced by \c Handle_2. + + +

Predicates for mapping dimensions or changing the vector space

+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}. + +

ppl_Polyhedron_add_space_dimensions_and_embed(+Handle, +Dimension_Type)
+ 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. + +

ppl_Polyhedron_add_space_dimensions_and_project(+Handle, +Dimension_Type)
+ 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. + +

ppl_Polyhedron_remove_space_dimensions(+Handle, +List_of_PPL_Vars)
+ 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. + +

ppl_Polyhedron_remove_higher_space_dimensions(+Handle, +Dimension_Type)
+ 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. + +

ppl_Polyhedron_expand_space_dimension(+Handle, +PPL_Var, +Dimension_Type)
+ 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. + +

ppl_Polyhedron_fold_space_dimensions(+Handle, +List_of_PPL_Vars, +PPL_Var)
+ 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. + +

ppl_Polyhedron_map_space_dimensions(+Handle, +P_Func)
+ 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. + + +\anchor other_domains +

Ad hoc Predicates for Other Domains

+

Extra Predicates Specifically for the Pointset Powerset Domains

+ 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. + +

Predicates for pointset powerset iterators and disjuncts.

+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. + +

ppl_new_Pointset_Powerset_C_Polyhedron_iterator_from_iterator(+Iterator_1, -Iterator_2)
+ Builds a new iterator \p it from the iterator referenced by + \c Iterator_1. Iterator_2 is unified with the handle + for \p it. + +

ppl_Pointset_Powerset_C_Polyhedron_begin_iterator(+Handle, -Iterator)
+ 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. + +

ppl_Pointset_Powerset_C_Polyhedron_end_iterator(+Handle, -Iterator)
+ 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. + +

ppl_Pointset_Powerset_C_Polyhedron_iterator_equals_iterator(+Iterator_1, +Iterator_2)
+ Succeeds if and only if the iterator referenced by + \c Iterator_1 is equal to the iterator referenced by + \c Iterator_2. + +

ppl_Pointset_Powerset_C_Polyhedron_iterator_increment(+Iterator)
+ Increments the iterator referenced by \c Iterator + so that it "points" to the next disjunct. + +

ppl_Pointset_Powerset_C_Polyhedron_iterator_decrement(+Iterator)
+ Decrements the iterator referenced by \c Iterator + so that it "points" to the previous disjunct. + +

ppl_Pointset_Powerset_C_Polyhedron_iterator_get_disjunct(+Iterator, -Handle)
+ Unifies with \c Handle a reference to the disjunct referred + to by \c Iterator_1. + +

ppl_delete_Pointset_Powerset_C_Polyhedron_iterator(+Iterator)
+ Invalidates the handle referenced by Iterator: + this makes sure the corresponding resources + will eventually be released. + +

ppl_Pointset_Powerset_C_Polyhedron_add_disjunct(+Handle_1, +Handle_2)
+ Adds to the pointset powerset referenced by \c Handle_1 a disjunct + referred to by \c Handle_2. + +

ppl_Pointset_Powerset_C_Polyhedron_drop_disjunct(+Handle, +Iterator)
+ 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. + +

ppl_Pointset_Powerset_C_Polyhedron_drop_disjuncts(+Handle, +Iterator_1, +Iterator_2)
+ 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). + +

Other Ad Hoc Predicates for the pointset powerset domains.

+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}. + +

ppl_Pointset_Powerset_C_Polyhedron_pairwise_reduce(+Handle)
+ Assigns the result of pairwise reduction on + the pointset powerset referenced by \c Handle. + +

ppl_Pointset_Powerset_C_Polyhedron_omega_reduce(+Handle)
+ Assigns the result of omega reduction on + the pointset powerset referenced by \c Handle. + +

ppl_Pointset_Powerset_C_Polyhedron_geometrically_covers_Pointset_Powerset_C_Polyhedron(+Handle_1, +Handle_2)
+ 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}. + +

ppl_Pointset_Powerset_C_Polyhedron_geometrically_equals_Pointset_Powerset_C_Polyhedron(+Handle_1, +Handle_2)
+ 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}. + + +

ppl_Pointset_Powerset_C_Polyhedron_BHZ03_BHRZ03_BHRZ03_widening_assign(+Handle_1, +Handle_2)
+ 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. + +

ppl_Pointset_Powerset_C_Polyhedron_BHZ03_H79_H79_widening_assign(+Handle_1, +Handle_2)
+ 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. + +

ppl_Pointset_Powerset_C_Polyhedron_BGP99_BHRZ03_extrapolation_assign(+Handle_1, +Handle_2, C_unsigned)
+ 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. + +

ppl_Pointset_Powerset_C_Polyhedron_BGP99_H79_extrapolation_assign(+Handle_1, +Handle_2, C_unsigned)
+ 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. + + +\anchor 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 +prefix/lib/ppl. 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 man ld.so and man ldconfig +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 +-DPROLOG_TRACK_ALLOCATION to the options passed to the +C++ compiler. +Your configure command would then look like +\code + path/to/configure --with-cxxflags="-DPROLOG_TRACK_ALLOCATION" ... +\endcode + +\anchor PI_SD_Features +

System-Dependent Features

+ +\anchor CIAO_Prolog +

CIAO Prolog

+ +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 +--disable-regs option. + +

The ppl_ciao Executable

+ +If an appropriate version of Ciao Prolog is installed on the machine +on which you compiled the library, the command make install +will install the executable ppl_ciao in the directory +prefix/bin. +The ppl_ciao 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 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 Ciao Prolog Programs

+ +In order to allow linking Ciao Prolog programs to the PPL, +the following files are installed in the directory +prefix/lib/ppl: +ppl_ciao.pl contains the required foreign declarations; +libppl_ciao.* 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, source1.pl +and source2.pl and you want to create the executable +myprog, 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 +

GNU Prolog

+ +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 +20040608 +(which unpacks to a directory called gprolog-1.2.18). +The patch is contained in the +interfaces/Prolog/GNU/README 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 +--disable-regs option. + +

The ppl_gprolog Executable

+ +If an appropriate version of GNU Prolog is installed on the machine +on which you compiled the library, the command make install +will install the executable ppl_gprolog in the directory +prefix/bin. +The ppl_gprolog 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 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: +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 +\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 +GNU Prolog +Manual + +\anchor SICStus_Prolog +

SICStus Prolog

+ +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. + +

The Statically Linked ppl_sicstus Executable

+ +If an appropriate version of SICStus Prolog is installed on the machine +on which you compiled the library, the command make install +will install the executable ppl_sicstus in the directory +prefix/bin. +The ppl_sicstus 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 prefix/lib/ppl/ppl_sicstus.pl. + +

Loading the SICStus Interface Dynamically

+ +In order to dynamically load the library from SICStus Prolog you should +simply load prefix/lib/ppl/ppl_sicstus.pl. +Notice that, for dynamic linking to work, you should have configured +the library with the --enable-shared option. + + +\anchor SWI_Prolog +

SWI-Prolog

+ +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. + +

The ppl_pl Executable

+ +If an appropriate version of SWI-Prolog is installed on the machine +on which you compiled the library, the command make install +will install the executable ppl_pl in the directory +prefix/bin. +The ppl_pl executable is simply the SWI-Prolog +shell with the Parma Polyhedra Library statically linked: +from within ppl_pl all the services of the library +are available without further action. + +

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 +\code +:- load_foreign_library('prefix/lib/ppl/libppl_swiprolog'). +\endcode +This will call ppl_initialize/0 automatically. +Analogously, +\code +:- unload_foreign_library('prefix/lib/ppl/libppl_swiprolog'). +\endcode +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. + + +\anchor XSB_Prolog +

XSB

+ +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 ppl_xsb module and import the predicates +you need. +For things to work, you may have to copy the files +prefix/lib/ppl/ppl_xsb.xwam +and +prefix/lib/ppl/ppl_xsb.so +in your current directory or in one of the XSB library directories. + + +\anchor YAP_Prolog +

YAP

+ +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., +http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007780.html). + +In order to dynamically load the library from YAP you should +simply load prefix/lib/ppl/ppl_yap.pl. +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. + +*/ /* \mainpage */ + + diff --git a/interfaces/Prolog/SICStus/Makefile.am b/interfaces/Prolog/SICStus/Makefile.am new file mode 100644 index 0000000..d22889f --- /dev/null +++ b/interfaces/Prolog/SICStus/Makefile.am @@ -0,0 +1,347 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +SICSTUS_CFLI_FILES = sicstus_cfli.h sicstus_cfli.ic sicstus_cfli.cc + +EXTRA_DIST = \ +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 + +if BUILD_WATCHDOG_LIBRARY + +WATCHDOG_LIBRARY = $(top_builddir)/Watchdog/src/libpwl.la +WATCHDOG_INCLUDE_OPTIONS = -I$(top_builddir)/Watchdog/src +WATCHDOG_DLOPEN = -dlopen $(WATCHDOG_LIBRARY) +WATCHDOG_LINK_OPTIONS = -L$(top_builddir)/Watchdog/src/.libs -lpwl + +endif BUILD_WATCHDOG_LIBRARY + +AM_CPPFLAGS = \ +-I$(top_srcdir)/interfaces \ +-I$(top_srcdir)/interfaces/Prolog \ +-I$(top_buildir)/interfaces/Prolog \ +-I$(top_builddir)/src \ +$(WATCHDOG_INCLUDE_OPTIONS) \ +$(SICSTUS_PROLOG_INCLUDE_OPTIONS) \ +@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 + +pkglib_DATA = ppl_sicstus.pl ppl_sicstus.s.o + +ppl_sicstus.so: ppl_sicstus.pl $(top_builddir)/src/libppl.la $(WATCHDOG_LIBRARY) libppl_sicstus.la + $(LIBTOOL) --mode=link --tag=CXX \ + splfr --cflag="$(AM_CPPFLAGS)" -o $@ \ + $(srcdir)/ppl_sicstus.pl \ + libppl_sicstus.la \ + $(WATCHDOG_LIBRARY) \ + @extra_libraries@ + +# @required_instantiations_prolog_cxx_objects@ + +install-data-local: ppl_sicstus.so + $(LIBTOOL) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) \ + $< $(DESTDIR)$(pkglibdir)/$< + +else !ENABLE_SHARED + +pkglib_DATA = ppl_sicstus.pl + +endif !ENABLE_SHARED + +noinst_LTLIBRARIES = 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 + +if NO_UNDEFINED + +NO_UNDEFINED_FLAG = -no-undefined + +endif NO_UNDEFINED + +libppl_sicstus_la_LIBADD = \ +@required_instantiations_prolog_cxx_objects@ \ +$(top_builddir)/src/libppl.la \ +$(WATCHDOG_LIBRARY) \ +@extra_libraries@ + +libppl_sicstus_la_DEPENDENCIES = \ +@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 $(WATCHDOG_LIBRARY) + $(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 \ + $(WATCHDOG_LIBRARY) \ + @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) + if [ $(srcdir) != `pwd` ]; then \ + cp -f $(srcdir)/../tests/pl_check.pl . ;\ + fi + $(LIBTOOL) --mode=execute \ + -dlopen ../../../src/libppl.la \ + $(WATCHDOG_DLOPEN) \ + ./ppl_sicstus -l $(srcdir)/sp_pl_check.pl \ + --goal "main." \ + >obtained_pchk + if [ $(srcdir) != `pwd` ]; then \ + rm -f pl_check.pl ;\ + fi + diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk + +$(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 \ + $(WATCHDOG_DLOPEN) \ + ./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 \ + $(WATCHDOG_DLOPEN) \ + ./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 + if [ $(srcdir) != `pwd` ]; then \ + cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl . ; \ + fi + cp -f ../tests/ppl_prolog_generated_test_main.pl . ; \ + $(LIBTOOL) --mode=execute \ + -dlopen ../../../src/libppl.la \ + $(WATCHDOG_DLOPEN) \ + ./ppl_sicstus -l $(srcdir)/sp_prolog_generated_test.pl \ + --goal "main." \ + >obtained_pgt + if [ $(srcdir) != `pwd` ]; then \ + rm -f ppl_prolog_generated_test_common.pl; \ + fi + 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 = \ +@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 + +if BUILD_WATCHDOG_LIBRARY + +# FIXME: check whether the dependencies from `libpwl.la' in this Makefile.am +# are actually required. +$(top_builddir)/Watchdog/src/libpwl.la: + $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/Watchdog/src libpwl.la + +endif BUILD_WATCHDOG_LIBRARY diff --git a/interfaces/Prolog/SICStus/Makefile.in b/interfaces/Prolog/SICStus/Makefile.in new file mode 100644 index 0000000..f13b1b5 --- /dev/null +++ b/interfaces/Prolog/SICStus/Makefile.in @@ -0,0 +1,1499 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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.am $(srcdir)/Makefile.in +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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +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) +libppl_sicstus_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(libppl_sicstus_la_LDFLAGS) $(LDFLAGS) -o $@ +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkglibdir)" +binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) +PROGRAMS = $(bin_PROGRAMS) +am_ppl_sicstus_OBJECTS = +ppl_sicstus_OBJECTS = $(am_ppl_sicstus_OBJECTS) +ppl_sicstus_LDADD = $(LDADD) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +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__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +pkglibDATA_INSTALL = $(INSTALL_DATA) +DATA = $(pkglib_DATA) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +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 + +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_LIBRARY = $(top_builddir)/Watchdog/src/libpwl.la +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_INCLUDE_OPTIONS = -I$(top_builddir)/Watchdog/src +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_DLOPEN = -dlopen $(WATCHDOG_LIBRARY) +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_LINK_OPTIONS = -L$(top_builddir)/Watchdog/src/.libs -lpwl +AM_CPPFLAGS = \ +-I$(top_srcdir)/interfaces \ +-I$(top_srcdir)/interfaces/Prolog \ +-I$(top_buildir)/interfaces/Prolog \ +-I$(top_builddir)/src \ +$(WATCHDOG_INCLUDE_OPTIONS) \ +$(SICSTUS_PROLOG_INCLUDE_OPTIONS) \ +@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 = +@ENABLE_SHARED_FALSE@pkglib_DATA = ppl_sicstus.pl +@ENABLE_SHARED_TRUE@pkglib_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 + +@NO_UNDEFINED_TRUE@NO_UNDEFINED_FLAG = -no-undefined +libppl_sicstus_la_LIBADD = \ +@required_instantiations_prolog_cxx_objects@ \ +$(top_builddir)/src/libppl.la \ +$(WATCHDOG_LIBRARY) \ +@extra_libraries@ + +libppl_sicstus_la_DEPENDENCIES = \ +@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@ +@ASSERTIONS_ENABLED_FALSE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC) +@ASSERTIONS_ENABLED_TRUE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a +@ASSERTIONS_ENABLED_FALSE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC) +@ASSERTIONS_ENABLED_TRUE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a +@ASSERTIONS_ENABLED_FALSE@EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC) +@ASSERTIONS_ENABLED_TRUE@EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a +CLEANFILES = \ +ppl_sicstus_sd.cc + +MOSTLYCLEANFILES = \ +@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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/SICStus/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign interfaces/Prolog/SICStus/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libppl_sicstus.la: $(libppl_sicstus_la_OBJECTS) $(libppl_sicstus_la_DEPENDENCIES) + $(libppl_sicstus_la_LINK) $(libppl_sicstus_la_OBJECTS) $(libppl_sicstus_la_LIBADD) $(LIBS) +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + if test -f $$p \ + || test -f $$p1 \ + ; then \ + f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ + else :; fi; \ + done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ + rm -f "$(DESTDIR)$(bindir)/$$f"; \ + done + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Float_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Int16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Int32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Int64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Int8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Long_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Rational_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Uint16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Uint32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Uint64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Uint8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Z_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_common.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_sicstus_sd.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sicstus_efli.Plo@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +ppl_prolog_common.lo: ../ppl_prolog_common.cc +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_common.Tpo $(DEPDIR)/ppl_prolog_common.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_common.cc' object='ppl_prolog_common.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Int8_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Int8_Box.cc' object='ppl_prolog_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Int16_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Int16_Box.cc' object='ppl_prolog_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Int32_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Int32_Box.cc' object='ppl_prolog_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Int64_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Int64_Box.cc' object='ppl_prolog_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Uint8_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Uint8_Box.cc' object='ppl_prolog_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Uint16_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Uint16_Box.cc' object='ppl_prolog_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Uint32_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Uint32_Box.cc' object='ppl_prolog_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Uint64_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Uint64_Box.cc' object='ppl_prolog_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Float_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Float_Box.cc' object='ppl_prolog_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Double_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Double_Box.cc' object='ppl_prolog_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Long_Double_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Long_Double_Box.cc' object='ppl_prolog_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Rational_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Rational_Box.cc' object='ppl_prolog_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Z_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Z_Box.cc' object='ppl_prolog_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_int8_t.cc' object='ppl_prolog_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_int16_t.cc' object='ppl_prolog_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_int32_t.cc' object='ppl_prolog_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_int64_t.cc' object='ppl_prolog_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_float.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_float.cc' object='ppl_prolog_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_double.cc' object='ppl_prolog_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_long_double.cc' object='ppl_prolog_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_mpq_class.cc' object='ppl_prolog_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_mpz_class.cc' object='ppl_prolog_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_float.cc' object='ppl_prolog_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_double.cc' object='ppl_prolog_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_long_double.cc' object='ppl_prolog_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Polyhedron.cc' object='ppl_prolog_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Grid.Tpo $(DEPDIR)/ppl_prolog_Grid.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Grid.cc' object='ppl_prolog_Grid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Int8_Box.cc' object='ppl_prolog_Pointset_Powerset_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Int16_Box.cc' object='ppl_prolog_Pointset_Powerset_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Int32_Box.cc' object='ppl_prolog_Pointset_Powerset_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Int64_Box.cc' object='ppl_prolog_Pointset_Powerset_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Uint16_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Uint32_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Uint64_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Float_Box.cc' object='ppl_prolog_Pointset_Powerset_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Double_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_Long_Double_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Powerset_Rational_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Rational_Box.cc' object='ppl_prolog_Pointset_Powerset_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Z_Box.cc' object='ppl_prolog_Pointset_Powerset_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_BD_Shape_int8_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_prolog_Pointset_Powerset_BD_Shape_int16_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_prolog_Pointset_Powerset_BD_Shape_int32_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_prolog_Pointset_Powerset_BD_Shape_int64_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_BD_Shape_float.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_BD_Shape_double.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Powerset_C_Polyhedron.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_NNC_Polyhedron.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Grid.cc' object='ppl_prolog_Pointset_Powerset_Grid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-pkglibDATA: $(pkglib_DATA) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(pkglibDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(pkglibDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + done + +uninstall-pkglibDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkglib_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \ + rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA) +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +@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 + +info: info-am + +info-am: + +install-data-am: install-data-local + +install-dvi: install-dvi-am + +install-exec-am: install-binPROGRAMS install-pkglibDATA + +install-html: install-html-am + +install-info: install-info-am + +install-man: + +install-pdf: install-pdf-am + +install-ps: 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-pkglibDATA + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \ + clean-binPROGRAMS clean-generic clean-libtool \ + clean-noinstLTLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am \ + install-data-local install-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-pkglibDATA 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 uninstall uninstall-am uninstall-binPROGRAMS \ + uninstall-pkglibDATA + + +ppl_sicstus_sd.cc: $(interface_generator_dependencies) + $(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \ + $(srcdir)/ppl_interface_generator_sicstus_sd_cc.m4 > $@ + +@ENABLE_SHARED_TRUE@ppl_sicstus.so: ppl_sicstus.pl $(top_builddir)/src/libppl.la $(WATCHDOG_LIBRARY) libppl_sicstus.la +@ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=link --tag=CXX \ +@ENABLE_SHARED_TRUE@ splfr --cflag="$(AM_CPPFLAGS)" -o $@ \ +@ENABLE_SHARED_TRUE@ $(srcdir)/ppl_sicstus.pl \ +@ENABLE_SHARED_TRUE@ libppl_sicstus.la \ +@ENABLE_SHARED_TRUE@ $(WATCHDOG_LIBRARY) \ +@ENABLE_SHARED_TRUE@ @extra_libraries@ + +# @required_instantiations_prolog_cxx_objects@ + +@ENABLE_SHARED_TRUE@install-data-local: ppl_sicstus.so +@ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) \ +@ENABLE_SHARED_TRUE@ $< $(DESTDIR)$(pkglibdir)/$< + +ppl_sicstus$(EXEEXT): ppl_sicstus.s.o $(top_builddir)/src/libppl.la $(WATCHDOG_LIBRARY) + $(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 \ + $(WATCHDOG_LIBRARY) \ + @extra_libraries@ + +@ENABLE_STATIC_TRUE@ppl_sicstus.s.o: ppl_sicstus.pl libppl_sicstus.la +@ENABLE_STATIC_TRUE@ splfr --static --cflag="$(AM_CPPFLAGS)" -o $@ \ +@ENABLE_STATIC_TRUE@ $(srcdir)/ppl_sicstus.pl \ +@ENABLE_STATIC_TRUE@ ppl_sicstus_sd.o \ +@ENABLE_STATIC_TRUE@ sicstus_efli.o \ +@ENABLE_STATIC_TRUE@ ppl_prolog_common.o \ +@ENABLE_STATIC_TRUE@ `echo @required_instantiations_prolog_cxx_objects@ | $(SED) -e "s/\.lo/.o/g"` + +@ENABLE_STATIC_FALSE@ppl_sicstus.s.o: ppl_sicstus.pl libppl_sicstus.la +@ENABLE_STATIC_FALSE@ splfr --cflag="$(AM_CPPFLAGS)" -o $@ \ +@ENABLE_STATIC_FALSE@ $(srcdir)/ppl_sicstus.pl \ +@ENABLE_STATIC_FALSE@ .libs/ppl_sicstus_sd.o \ +@ENABLE_STATIC_FALSE@ .libs/sicstus_efli.o \ +@ENABLE_STATIC_FALSE@ .libs/ppl_prolog_common.o \ +@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) + if [ $(srcdir) != `pwd` ]; then \ + cp -f $(srcdir)/../tests/pl_check.pl . ;\ + fi + $(LIBTOOL) --mode=execute \ + -dlopen ../../../src/libppl.la \ + $(WATCHDOG_DLOPEN) \ + ./ppl_sicstus -l $(srcdir)/sp_pl_check.pl \ + --goal "main." \ + >obtained_pchk + if [ $(srcdir) != `pwd` ]; then \ + rm -f pl_check.pl ;\ + fi + diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk + +$(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 \ + $(WATCHDOG_DLOPEN) \ + ./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 \ + $(WATCHDOG_DLOPEN) \ + ./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 + if [ $(srcdir) != `pwd` ]; then \ + cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl . ; \ + fi + cp -f ../tests/ppl_prolog_generated_test_main.pl . ; \ + $(LIBTOOL) --mode=execute \ + -dlopen ../../../src/libppl.la \ + $(WATCHDOG_DLOPEN) \ + ./ppl_sicstus -l $(srcdir)/sp_prolog_generated_test.pl \ + --goal "main." \ + >obtained_pgt + if [ $(srcdir) != `pwd` ]; then \ + rm -f ppl_prolog_generated_test_common.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_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 + +# FIXME: check whether the dependencies from `libpwl.la' in this Makefile.am +# are actually required. +@BUILD_WATCHDOG_LIBRARY_TRUE@$(top_builddir)/Watchdog/src/libpwl.la: +@BUILD_WATCHDOG_LIBRARY_TRUE@ $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/Watchdog/src libpwl.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..25e32ab --- /dev/null +++ b/interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4 @@ -0,0 +1,192 @@ +m4_define(`dnl', `m4_dnl')`'dnl +m4_divert(-1) + +dnl This m4 file generates the file ppl_sicstus_sd.cc. + +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/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); \ +} + +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..6d7f7ca --- /dev/null +++ b/interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh @@ -0,0 +1,25 @@ +/* System-dependent part of the Prolog interfaces: stub for SICStus Prolog. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "sicstus_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..5f7e7dc --- /dev/null +++ b/interfaces/Prolog/SICStus/ppl_sicstus.pl @@ -0,0 +1,29 @@ +/* Loader for the SICStus Prolog interface. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +foreign_resource(ppl_sicstus, +[ + init(ppl_sicstus_init), + deinit(ppl_sicstus_deinit) +]). + +:- load_foreign_resource(ppl_sicstus). diff --git a/interfaces/Prolog/SICStus/sicstus_cfli.cc b/interfaces/Prolog/SICStus/sicstus_cfli.cc new file mode 100644 index 0000000..8954a0c --- /dev/null +++ b/interfaces/Prolog/SICStus/sicstus_cfli.cc @@ -0,0 +1,27 @@ +/* SICStus Prolog Common Foreign Language Interface: implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "sicstus_cfli.h" + +#ifndef PCFLI_EXTERN_INLINE +#include "sicstus_cfli.ic" +#endif diff --git a/interfaces/Prolog/SICStus/sicstus_cfli.h b/interfaces/Prolog/SICStus/sicstus_cfli.h new file mode 100644 index 0000000..7e27110 --- /dev/null +++ b/interfaces/Prolog/SICStus/sicstus_cfli.h @@ -0,0 +1,155 @@ +/* SICStus Prolog Common Foreign Language Interface: declarations. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PCFLI_sicstus_cfli_h +#define PCFLI_sicstus_cfli_h 1 + +#include + +#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..e77336d --- /dev/null +++ b/interfaces/Prolog/SICStus/sicstus_cfli.ic @@ -0,0 +1,299 @@ +/* SICStus Common Foreign Language Interface: definitions. -*- C -*- + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include +#include + +/*! + 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..0a111fe --- /dev/null +++ b/interfaces/Prolog/SICStus/sicstus_efli.cc @@ -0,0 +1,106 @@ +/* SICStus Prolog extended foreign language interface: definitions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "sicstus_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; + if (assign_r(l, n, ROUND_NOT_NEEDED) == V_EQ) + 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..0ad66a5 --- /dev/null +++ b/interfaces/Prolog/SICStus/sicstus_efli.hh @@ -0,0 +1,91 @@ +/* SICStus Prolog extended foreign language interface: declarations. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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 +// and/or 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..e5bb409 --- /dev/null +++ b/interfaces/Prolog/SICStus/sp_clpq.pl @@ -0,0 +1,43 @@ +/* Main program for the toy PPL/SICStus-Prolog CLP(Q) interpreter. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +:- ensure_loaded('ppl_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..38e4cc1 --- /dev/null +++ b/interfaces/Prolog/SICStus/sp_pl_check.pl @@ -0,0 +1,48 @@ +/* Main program for the toy PPL/SICStus-Prolog CLP(Q) predicate checker. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +prolog_system('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..ff8e5da --- /dev/null +++ b/interfaces/Prolog/SICStus/sp_prolog_generated_test.pl @@ -0,0 +1,48 @@ +/* Main program for the PPL/SICStus-Prolog generated tests. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +prolog_system('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..cd4d8fb --- /dev/null +++ b/interfaces/Prolog/SWI/Makefile.am @@ -0,0 +1,341 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +if VALGRIND_TESTS_ENABLED + +CHECKER = \ +$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \ +--num-callers=100 --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 + +if BUILD_WATCHDOG_LIBRARY + +WATCHDOG_LIBRARY = $(top_builddir)/Watchdog/src/libpwl.la +WATCHDOG_INCLUDE_OPTIONS = -I$(top_builddir)/Watchdog/src +WATCHDOG_DLOPEN = -dlopen $(WATCHDOG_LIBRARY) +WATCHDOG_LINK_OPTIONS = -L$(top_builddir)/Watchdog/src/.libs -lpwl + +endif BUILD_WATCHDOG_LIBRARY + +AM_CPPFLAGS = \ +-I$(top_srcdir)/interfaces \ +-I$(top_srcdir)/interfaces/Prolog \ +-I$(top_buildir)/interfaces/Prolog \ +-I$(top_builddir)/src \ +$(WATCHDOG_INCLUDE_OPTIONS) \ +$(SWI_PROLOG_INCLUDE_OPTIONS) \ +@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 + +if NO_UNDEFINED + +NO_UNDEFINED_FLAG = -no-undefined + +endif NO_UNDEFINED + +libppl_swiprolog_la_LIBADD = \ +@required_instantiations_prolog_cxx_objects@ \ +$(top_builddir)/src/libppl.la \ +$(WATCHDOG_LIBRARY) \ +@extra_libraries@ + +libppl_swiprolog_la_DEPENDENCIES = \ +@required_instantiations_prolog_cxx_objects@ + +libppl_swiprolog_la_LDFLAGS = \ +$(NO_UNDEFINED_FLAG) \ +-module \ +-avoid-version + +bin_PROGRAMS = ppl_pl +ppl_pl_SOURCES = ppl_pl.cc + +pkglib_DATA = ppl_swiprolog.pl + +CLPQ_TESTS_NONSTRICT = \ +ack.clpq \ +ackn.clpq \ +fib.clpq \ +mc91.clpq \ +smm.clpq \ +sumto.clpq \ +tak.clpq + +CLPQ_TESTS_STRICT = \ +schedule.clpq + +CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT) + +check_PROGRAMS = pl_clpq pl_clpq2 +pl_clpq_SOURCES = pl_clpq.cc +pl_clpq2_SOURCES = pl_clpq.cc + +if HOST_OS_CYGWIN + +# Under Cygwin, plld 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 + +ppl_pl$(EXEEXT): libppl_swiprolog.la ppl_pl.o + plld -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 $(WATCHDOG_LINK_OPTIONS) @extra_libraries@ $(EXTRA_LINK_OPTIONS) + +pl_clpq$(EXEEXT): libppl_swiprolog.la pl_clpq.o pl_clpq.pl ../tests/clpq.pl + plld -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 $(WATCHDOG_LINK_OPTIONS) @extra_libraries@ $(EXTRA_LINK_OPTIONS) + + +pl_clpq2$(EXEEXT): libppl_swiprolog.la pl_clpq.o pl_clpq.pl ../tests/clpq2.pl + plld -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 $(WATCHDOG_LINK_OPTIONS) @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) + if [ $(srcdir) != `pwd` ]; then \ + cp -f $(srcdir)/../tests/pl_check.pl . ; \ + fi ;\ + echo "ensure_loaded('$(srcdir)/swi_pl_check'). main." > script_pchk + $(LIBTOOL) --mode=execute \ + -dlopen ../../../src/libppl.la \ + $(WATCHDOG_DLOPEN) \ + -dlopen libppl_swiprolog.la \ + $(CHECKER) ./ppl_pl < script_pchk + if [ $(srcdir) != `pwd` ]; then \ + rm -f pl_check.pl; \ + fi + 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 \ + $(WATCHDOG_DLOPEN) \ + -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 \ + $(WATCHDOG_DLOPEN) \ + -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 + if [ $(srcdir) != `pwd` ]; then \ + cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl . ; \ + fi + 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 \ + $(WATCHDOG_DLOPEN) \ + -dlopen libppl_swiprolog.la \ + $(CHECKER) ./ppl_pl +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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_pl$(EXEEXT) +check_PROGRAMS = pl_clpq$(EXEEXT) pl_clpq2$(EXEEXT) +subdir = interfaces/Prolog/SWI +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" \ + "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +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) +libppl_swiprolog_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(libppl_swiprolog_la_LDFLAGS) $(LDFLAGS) -o $@ +binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) +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) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +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) +pkglibDATA_INSTALL = $(INSTALL_DATA) +DATA = $(pkglib_DATA) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +@VALGRIND_TESTS_ENABLED_FALSE@CHECKER = +@VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \ +@VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \ +@VALGRIND_TESTS_ENABLED_TRUE@--num-callers=100 --leak-resolution=high \ +@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 + +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_LIBRARY = $(top_builddir)/Watchdog/src/libpwl.la +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_INCLUDE_OPTIONS = -I$(top_builddir)/Watchdog/src +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_DLOPEN = -dlopen $(WATCHDOG_LIBRARY) +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_LINK_OPTIONS = -L$(top_builddir)/Watchdog/src/.libs -lpwl +AM_CPPFLAGS = \ +-I$(top_srcdir)/interfaces \ +-I$(top_srcdir)/interfaces/Prolog \ +-I$(top_buildir)/interfaces/Prolog \ +-I$(top_builddir)/src \ +$(WATCHDOG_INCLUDE_OPTIONS) \ +$(SWI_PROLOG_INCLUDE_OPTIONS) \ +@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 + +@NO_UNDEFINED_TRUE@NO_UNDEFINED_FLAG = -no-undefined +libppl_swiprolog_la_LIBADD = \ +@required_instantiations_prolog_cxx_objects@ \ +$(top_builddir)/src/libppl.la \ +$(WATCHDOG_LIBRARY) \ +@extra_libraries@ + +libppl_swiprolog_la_DEPENDENCIES = \ +@required_instantiations_prolog_cxx_objects@ + +libppl_swiprolog_la_LDFLAGS = \ +$(NO_UNDEFINED_FLAG) \ +-module \ +-avoid-version + +ppl_pl_SOURCES = ppl_pl.cc +pkglib_DATA = ppl_swiprolog.pl +CLPQ_TESTS_NONSTRICT = \ +ack.clpq \ +ackn.clpq \ +fib.clpq \ +mc91.clpq \ +smm.clpq \ +sumto.clpq \ +tak.clpq + +CLPQ_TESTS_STRICT = \ +schedule.clpq + +CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT) +pl_clpq_SOURCES = pl_clpq.cc +pl_clpq2_SOURCES = pl_clpq.cc + +# Under Cygwin, plld 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. +@HOST_OS_CYGWIN_TRUE@EXTRA_LINK_OPTIONS = $(SWI_PROLOG_LD_OPTIONS) +@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. +@ENABLE_STATIC_TRUE@LIBPPL_SWIPROLOG_LINK_OPTIONS = .libs/libppl_swiprolog.a +COEFFICIENT_MNEMONIC = @coefficient_mnemonic@ +@ASSERTIONS_ENABLED_FALSE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC) +@ASSERTIONS_ENABLED_TRUE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a +@ASSERTIONS_ENABLED_FALSE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC) +@ASSERTIONS_ENABLED_TRUE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a +@ASSERTIONS_ENABLED_FALSE@EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC) +@ASSERTIONS_ENABLED_TRUE@EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a +CLEANFILES = \ +ppl_swiprolog.cc + +MOSTLYCLEANFILES = \ +@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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/SWI/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign interfaces/Prolog/SWI/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libppl_swiprolog.la: $(libppl_swiprolog_la_OBJECTS) $(libppl_swiprolog_la_DEPENDENCIES) + $(libppl_swiprolog_la_LINK) -rpath $(pkglibdir) $(libppl_swiprolog_la_OBJECTS) $(libppl_swiprolog_la_LIBADD) $(LIBS) +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + if test -f $$p \ + || test -f $$p1 \ + ; then \ + f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ + else :; fi; \ + done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ + rm -f "$(DESTDIR)$(bindir)/$$f"; \ + done + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pl_clpq.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_pl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Float_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Int16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Int32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Int64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Int8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Long_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Rational_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Uint16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Uint32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Uint64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Uint8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Z_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_common.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_swiprolog.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/swi_efli.Plo@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +ppl_prolog_common.lo: ../ppl_prolog_common.cc +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_common.Tpo $(DEPDIR)/ppl_prolog_common.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_common.cc' object='ppl_prolog_common.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Int8_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Int8_Box.cc' object='ppl_prolog_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Int16_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Int16_Box.cc' object='ppl_prolog_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Int32_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Int32_Box.cc' object='ppl_prolog_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Int64_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Int64_Box.cc' object='ppl_prolog_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Uint8_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Uint8_Box.cc' object='ppl_prolog_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Uint16_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Uint16_Box.cc' object='ppl_prolog_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Uint32_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Uint32_Box.cc' object='ppl_prolog_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Uint64_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Uint64_Box.cc' object='ppl_prolog_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Float_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Float_Box.cc' object='ppl_prolog_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Double_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Double_Box.cc' object='ppl_prolog_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Long_Double_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Long_Double_Box.cc' object='ppl_prolog_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Rational_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Rational_Box.cc' object='ppl_prolog_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Z_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Z_Box.cc' object='ppl_prolog_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_int8_t.cc' object='ppl_prolog_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_int16_t.cc' object='ppl_prolog_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_int32_t.cc' object='ppl_prolog_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_int64_t.cc' object='ppl_prolog_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_float.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_float.cc' object='ppl_prolog_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_double.cc' object='ppl_prolog_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_long_double.cc' object='ppl_prolog_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_mpq_class.cc' object='ppl_prolog_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_mpz_class.cc' object='ppl_prolog_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_float.cc' object='ppl_prolog_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_double.cc' object='ppl_prolog_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_long_double.cc' object='ppl_prolog_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Polyhedron.cc' object='ppl_prolog_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Grid.Tpo $(DEPDIR)/ppl_prolog_Grid.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Grid.cc' object='ppl_prolog_Grid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Int8_Box.cc' object='ppl_prolog_Pointset_Powerset_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Int16_Box.cc' object='ppl_prolog_Pointset_Powerset_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Int32_Box.cc' object='ppl_prolog_Pointset_Powerset_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Int64_Box.cc' object='ppl_prolog_Pointset_Powerset_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Uint16_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Uint32_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Uint64_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Float_Box.cc' object='ppl_prolog_Pointset_Powerset_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Double_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_Long_Double_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Powerset_Rational_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Rational_Box.cc' object='ppl_prolog_Pointset_Powerset_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Z_Box.cc' object='ppl_prolog_Pointset_Powerset_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_BD_Shape_int8_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_prolog_Pointset_Powerset_BD_Shape_int16_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_prolog_Pointset_Powerset_BD_Shape_int32_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_prolog_Pointset_Powerset_BD_Shape_int64_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_BD_Shape_float.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_BD_Shape_double.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Powerset_C_Polyhedron.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_NNC_Polyhedron.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Grid.cc' object='ppl_prolog_Pointset_Powerset_Grid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-pkglibDATA: $(pkglib_DATA) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(pkglibDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(pkglibDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + done + +uninstall-pkglibDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkglib_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \ + rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-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 + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-exec-am: install-binPROGRAMS install-pkglibDATA \ + install-pkglibLTLIBRARIES + +install-html: install-html-am + +install-info: install-info-am + +install-man: + +install-pdf: install-pdf-am + +install-ps: 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-pkglibDATA \ + uninstall-pkglibLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \ + clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ + clean-libtool clean-pkglibLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-binPROGRAMS install-data \ + install-data-am install-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-pkglibDATA 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 uninstall \ + uninstall-am uninstall-binPROGRAMS uninstall-pkglibDATA \ + 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 + plld -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 $(WATCHDOG_LINK_OPTIONS) @extra_libraries@ $(EXTRA_LINK_OPTIONS) + +pl_clpq$(EXEEXT): libppl_swiprolog.la pl_clpq.o pl_clpq.pl ../tests/clpq.pl + plld -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 $(WATCHDOG_LINK_OPTIONS) @extra_libraries@ $(EXTRA_LINK_OPTIONS) + +pl_clpq2$(EXEEXT): libppl_swiprolog.la pl_clpq.o pl_clpq.pl ../tests/clpq2.pl + plld -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 $(WATCHDOG_LINK_OPTIONS) @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) + if [ $(srcdir) != `pwd` ]; then \ + cp -f $(srcdir)/../tests/pl_check.pl . ; \ + fi ;\ + echo "ensure_loaded('$(srcdir)/swi_pl_check'). main." > script_pchk + $(LIBTOOL) --mode=execute \ + -dlopen ../../../src/libppl.la \ + $(WATCHDOG_DLOPEN) \ + -dlopen libppl_swiprolog.la \ + $(CHECKER) ./ppl_pl < script_pchk + if [ $(srcdir) != `pwd` ]; then \ + rm -f pl_check.pl; \ + fi + 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 \ + $(WATCHDOG_DLOPEN) \ + -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 \ + $(WATCHDOG_DLOPEN) \ + -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 + if [ $(srcdir) != `pwd` ]; then \ + cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl . ; \ + fi + 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 \ + $(WATCHDOG_DLOPEN) \ + -dlopen libppl_swiprolog.la \ + $(CHECKER) ./ppl_pl /lib/ppl' directory, where + 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 `/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('/lib/ppl/libppl_swiprolog.so'). + +This will call `ppl_initialize/0' automatically. Analogously, + + :- unload_foreign_library('/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..f9bbc3f --- /dev/null +++ b/interfaces/Prolog/SWI/pl_clpq.cc @@ -0,0 +1,47 @@ +/* C++ main program for the toy PPL/SWI-Prolog CLP(Q) interpreter. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +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..c4c0d4a --- /dev/null +++ b/interfaces/Prolog/SWI/pl_clpq.pl @@ -0,0 +1,32 @@ +/* Prolog main program for the toy PPL/SWI-Prolog CLP(Q) interpreter. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +eat_eol. + +main :- + % FIXME: clearing the prompt as it is done here is a temporary workaround. + % In SWI-Prolog versions up to and including 5.4.1, the prompt is written + % to the output stream even if it is not connected to an actual terminal. + % See http://www.cs.unipr.it/pipermail/ppl-devel/2004-October/005078.html. + prompt(Old_Prompt, ''), + common_main, + prompt(_, Old_Prompt). diff --git a/interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4 b/interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4 new file mode 100644 index 0000000..2136949 --- /dev/null +++ b/interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4 @@ -0,0 +1,71 @@ +m4_define(`dnl', `m4_dnl')`'dnl +m4_divert(-1) + +dnl This m4 file generates the file ppl_swiprolog.cc. +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/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..ec63b4a --- /dev/null +++ b/interfaces/Prolog/SWI/ppl_pl.cc @@ -0,0 +1,43 @@ +/* Main program for SWI-Prolog with the PPL statically linked. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +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..4c03e9a --- /dev/null +++ b/interfaces/Prolog/SWI/ppl_prolog_sysdep.hh @@ -0,0 +1,25 @@ +/* System-dependent part of the Prolog interfaces: stub for SWI Prolog. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "swi_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..7ffb54d --- /dev/null +++ b/interfaces/Prolog/SWI/ppl_swiprolog.pl @@ -0,0 +1,23 @@ +/* Loader for the SWI-Prolog interface. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +:- load_foreign_library('libppl_swiprolog'). diff --git a/interfaces/Prolog/SWI/swi_cfli.hh b/interfaces/Prolog/SWI/swi_cfli.hh new file mode 100644 index 0000000..98d2092 --- /dev/null +++ b/interfaces/Prolog/SWI/swi_cfli.hh @@ -0,0 +1,327 @@ +/* SWI-Prolog Common Foreign Language Interface. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PCFLI_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 +#include +#include +#include + +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) { + PL_put_term(t, u); + return 1; +} + +/*! + Assign to \p t a Prolog integer with value \p l. +*/ +inline int +Prolog_put_long(Prolog_term_ref t, long l) { + PL_put_integer(t, l); + return 1; +} + +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) { + PL_put_integer(t, ul); + return 1; + } + else if (ul <= (uint64_t) INT64_MAX) { + PL_put_int64(t, (int64_t) ul); + return 1; + } + 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) { + PL_put_atom_chars(t, s); + return 1; +} + +/*! + Assign to \p t the Prolog atom \p a. +*/ +inline int +Prolog_put_atom(Prolog_term_ref t, Prolog_atom a) { + PL_put_atom(t, a); + return 1; +} + +/*! + Assign to \p t a term representing the address contained in \p p. +*/ +inline int +Prolog_put_address(Prolog_term_ref t, void* p) { + PL_put_pointer(t, p); + return 1; +} + +/*! + Return an atom whose name is given by the null-terminated string \p s. +*/ +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) { + PL_cons_functor(t, PL_new_functor(f, 1), a1); + return 1; +} + +/*! + Assign to \p t a compound term whose principal functor is \p f + of arity 2 with arguments \p a1 and \p a2. +*/ +inline int +Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f, + Prolog_term_ref a1, Prolog_term_ref a2) { + PL_cons_functor(t, PL_new_functor(f, 2), a1, a2); + return 1; +} + +/*! + Assign to \p t a compound term whose principal functor is \p f + of arity 3 with arguments \p a1, \p a2 and \p a3. +*/ +inline int +Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f, + Prolog_term_ref a1, Prolog_term_ref a2, + Prolog_term_ref a3) { + PL_cons_functor(t, PL_new_functor(f, 3), a1, a2, a3); + return 1; +} + +/*! + Assign to \p t a compound term whose principal functor is \p f + of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4. +*/ +inline int +Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f, + Prolog_term_ref a1, Prolog_term_ref a2, + Prolog_term_ref a3, Prolog_term_ref a4) { + PL_cons_functor(t, PL_new_functor(f, 4), a1, a2, a3, a4); + return 1; +} + +/*! + Assign to \p c a Prolog list whose head is \p h and tail is \p t. +*/ +inline int +Prolog_construct_cons(Prolog_term_ref c, + Prolog_term_ref h, Prolog_term_ref t) { + PL_cons_list(c, h, t); + return 1; +} + +/*! + Raise a Prolog exception with \p t as the exception term. +*/ +inline void +Prolog_raise_exception(Prolog_term_ref t) { + (void) PL_raise_exception(t); +} + +/*! + Return true if \p t is a Prolog variable, false otherwise. +*/ +inline int +Prolog_is_variable(Prolog_term_ref t) { + return PL_is_variable(t); +} + +/*! + Return true if \p t is a Prolog atom, false otherwise. +*/ +inline int +Prolog_is_atom(Prolog_term_ref t) { + return PL_is_atom(t); +} + +/*! + Return true if \p t is a Prolog integer, false otherwise. +*/ +inline int +Prolog_is_integer(Prolog_term_ref t) { + return PL_is_integer(t); +} + +/*! + Return true if \p t is the representation of an address, false otherwise. +*/ +inline int +Prolog_is_address(Prolog_term_ref t) { + return PL_is_integer(t); +} + +/*! + Return true if \p t is a Prolog compound term, false otherwise. +*/ +inline int +Prolog_is_compound(Prolog_term_ref t) { + return PL_is_compound(t); +} + +/*! + Return true if \p t is a Prolog cons (list constructor), false otherwise. +*/ +inline int +Prolog_is_cons(Prolog_term_ref t) { + return !PL_is_atom(t) && PL_is_list(t); +} + +/*! + Assuming \p t is a Prolog integer, return true if its value fits + in a long, in which case the value is assigned to \p v, + return false otherwise. The behavior is undefined if \p t is + not a Prolog integer. +*/ +inline int +Prolog_get_long(Prolog_term_ref t, long* lp) { + assert(Prolog_is_integer(t)); + return PL_get_long(t, lp); +} + +/*! + If \p t is the Prolog representation for a memory address, return + true and store that address into 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..01b197c --- /dev/null +++ b/interfaces/Prolog/SWI/swi_efli.cc @@ -0,0 +1,78 @@ +/* SWI-Prolog extended foreign language interface: definitions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "swi_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)); + PPL_DIRTY_TEMP0(mpz_class, tmp); + PL_get_mpz(t, tmp.get_mpz_t()); + n = tmp; + return 1; +} + +int +Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n) { + PPL_DIRTY_TEMP0(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..7a0480f --- /dev/null +++ b/interfaces/Prolog/SWI/swi_efli.hh @@ -0,0 +1,91 @@ +/* SWI-Prolog extended foreign language interface: declarations. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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 +// and/or 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..5ef70cb --- /dev/null +++ b/interfaces/Prolog/SWI/swi_pl_check.pl @@ -0,0 +1,38 @@ +/* Main program for the PPL/SWI-Prolog checker. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +:- ensure_loaded('pl_check.pl'). + +prolog_system('SWI'). + +main :- + current_output(Old_Stream), + open(obtained_pchk, write, Stream), + set_output(Stream), + (check_all -> + write('OK') + ; + write('FAILURE') + ), + nl, + close(Stream), + set_output(Old_Stream). diff --git a/interfaces/Prolog/SWI/swi_prolog_generated_test.pl b/interfaces/Prolog/SWI/swi_prolog_generated_test.pl new file mode 100644 index 0000000..a10edbb --- /dev/null +++ b/interfaces/Prolog/SWI/swi_prolog_generated_test.pl @@ -0,0 +1,38 @@ +/* Main program for the PPL/SWI-Prolog generated tests. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +:- ensure_loaded('ppl_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..a2d1327 --- /dev/null +++ b/interfaces/Prolog/XSB/Makefile.am @@ -0,0 +1,321 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +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 + +if BUILD_WATCHDOG_LIBRARY + +WATCHDOG_LIBRARY = $(top_builddir)/Watchdog/src/libpwl.la +WATCHDOG_INCLUDE_OPTIONS = -I$(top_builddir)/Watchdog/src +WATCHDOG_DLOPEN = -dlopen $(WATCHDOG_LIBRARY) +WATCHDOG_LINK_OPTIONS = -L$(top_builddir)/Watchdog/src/.libs -lpwl + +endif BUILD_WATCHDOG_LIBRARY + +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 \ +$(WATCHDOG_INCLUDE_OPTIONS) \ +$(XSB_PROLOG_INCLUDE_OPTIONS) \ +@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 + +if NO_UNDEFINED + +NO_UNDEFINED_FLAG = -no-undefined + +endif NO_UNDEFINED + +libppl_xsb_la_LIBADD = \ +@required_instantiations_prolog_cxx_objects@ \ +$(top_builddir)/src/libppl.la \ +$(WATCHDOG_LIBRARY) \ +@extra_libraries@ + +libppl_xsb_la_DEPENDENCIES = \ +@required_instantiations_prolog_cxx_objects@ + +libppl_xsb_la_LDFLAGS = \ +$(NO_UNDEFINED_FLAG) \ +-module \ +-avoid-version + +pkglib_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 -L../../../Watchdog/src/.libs')])." \ + | $(LIBTOOL) --mode=execute \ + -dlopen ../../../src/libppl.la \ + $(WATCHDOG_DLOPEN) \ + 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 \ + $(WATCHDOG_DLOPEN) \ + 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 \ + $(WATCHDOG_DLOPEN) \ + 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 \ + $(WATCHDOG_DLOPEN) \ + 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 + if [ $(srcdir) != `pwd` ]; then \ + cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl . ; \ + fi + cp -f ../tests/ppl_prolog_generated_test_main.pl . + rm -f xsb_prolog_generated_test.xwam + $(LIBTOOL) --mode=execute \ + -dlopen ../../../src/libppl.la \ + $(WATCHDOG_DLOPEN) \ + xsb xsb_prolog_generated_test \ + >obtained_pgt + if [ $(srcdir) != `pwd` ]; then \ + rm -f ppl_prolog_generated_test_common.pl ; \ + fi + 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 = \ +@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..9fdada9 --- /dev/null +++ b/interfaces/Prolog/XSB/Makefile.in @@ -0,0 +1,1454 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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.am $(srcdir)/Makefile.in +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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +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) +libppl_xsb_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(libppl_xsb_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libppl_xsb_la_SOURCES) $(nodist_libppl_xsb_la_SOURCES) \ + $(nodist_EXTRA_libppl_xsb_la_SOURCES) +DIST_SOURCES = $(libppl_xsb_la_SOURCES) +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" +pkglibDATA_INSTALL = $(INSTALL_DATA) +DATA = $(pkglib_DATA) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +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 + +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_LIBRARY = $(top_builddir)/Watchdog/src/libpwl.la +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_INCLUDE_OPTIONS = -I$(top_builddir)/Watchdog/src +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_DLOPEN = -dlopen $(WATCHDOG_LIBRARY) +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_LINK_OPTIONS = -L$(top_builddir)/Watchdog/src/.libs -lpwl +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 \ +$(WATCHDOG_INCLUDE_OPTIONS) \ +$(XSB_PROLOG_INCLUDE_OPTIONS) \ +@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 + +@NO_UNDEFINED_TRUE@NO_UNDEFINED_FLAG = -no-undefined +libppl_xsb_la_LIBADD = \ +@required_instantiations_prolog_cxx_objects@ \ +$(top_builddir)/src/libppl.la \ +$(WATCHDOG_LIBRARY) \ +@extra_libraries@ + +libppl_xsb_la_DEPENDENCIES = \ +@required_instantiations_prolog_cxx_objects@ + +libppl_xsb_la_LDFLAGS = \ +$(NO_UNDEFINED_FLAG) \ +-module \ +-avoid-version + +pkglib_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@ +@ASSERTIONS_ENABLED_FALSE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC) +@ASSERTIONS_ENABLED_TRUE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a +@ASSERTIONS_ENABLED_FALSE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC) +@ASSERTIONS_ENABLED_TRUE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a +@ASSERTIONS_ENABLED_FALSE@EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC) +@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 = \ +@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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/XSB/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign interfaces/Prolog/XSB/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libppl_xsb.la: $(libppl_xsb_la_OBJECTS) $(libppl_xsb_la_DEPENDENCIES) + $(libppl_xsb_la_LINK) $(libppl_xsb_la_OBJECTS) $(libppl_xsb_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Float_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Int16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Int32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Int64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Int8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Long_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Rational_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Uint16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Uint32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Uint64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Uint8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Z_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_common.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xsb_efli.Plo@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +ppl_prolog_common.lo: ../ppl_prolog_common.cc +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_common.Tpo $(DEPDIR)/ppl_prolog_common.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_common.cc' object='ppl_prolog_common.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Int8_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Int8_Box.cc' object='ppl_prolog_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Int16_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Int16_Box.cc' object='ppl_prolog_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Int32_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Int32_Box.cc' object='ppl_prolog_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Int64_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Int64_Box.cc' object='ppl_prolog_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Uint8_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Uint8_Box.cc' object='ppl_prolog_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Uint16_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Uint16_Box.cc' object='ppl_prolog_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Uint32_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Uint32_Box.cc' object='ppl_prolog_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Uint64_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Uint64_Box.cc' object='ppl_prolog_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Float_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Float_Box.cc' object='ppl_prolog_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Double_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Double_Box.cc' object='ppl_prolog_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Long_Double_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Long_Double_Box.cc' object='ppl_prolog_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Rational_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Rational_Box.cc' object='ppl_prolog_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Z_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Z_Box.cc' object='ppl_prolog_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_int8_t.cc' object='ppl_prolog_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_int16_t.cc' object='ppl_prolog_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_int32_t.cc' object='ppl_prolog_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_int64_t.cc' object='ppl_prolog_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_float.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_float.cc' object='ppl_prolog_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_double.cc' object='ppl_prolog_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_long_double.cc' object='ppl_prolog_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_mpq_class.cc' object='ppl_prolog_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_mpz_class.cc' object='ppl_prolog_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_float.cc' object='ppl_prolog_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_double.cc' object='ppl_prolog_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_long_double.cc' object='ppl_prolog_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Polyhedron.cc' object='ppl_prolog_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Grid.Tpo $(DEPDIR)/ppl_prolog_Grid.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Grid.cc' object='ppl_prolog_Grid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Int8_Box.cc' object='ppl_prolog_Pointset_Powerset_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Int16_Box.cc' object='ppl_prolog_Pointset_Powerset_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Int32_Box.cc' object='ppl_prolog_Pointset_Powerset_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Int64_Box.cc' object='ppl_prolog_Pointset_Powerset_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Uint16_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Uint32_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Uint64_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Float_Box.cc' object='ppl_prolog_Pointset_Powerset_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Double_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_Long_Double_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Powerset_Rational_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Rational_Box.cc' object='ppl_prolog_Pointset_Powerset_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Z_Box.cc' object='ppl_prolog_Pointset_Powerset_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_BD_Shape_int8_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_prolog_Pointset_Powerset_BD_Shape_int16_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_prolog_Pointset_Powerset_BD_Shape_int32_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_prolog_Pointset_Powerset_BD_Shape_int64_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_BD_Shape_float.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_BD_Shape_double.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Powerset_C_Polyhedron.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_NNC_Polyhedron.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Grid.cc' object='ppl_prolog_Pointset_Powerset_Grid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-pkglibDATA: $(pkglib_DATA) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(pkglibDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(pkglibDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + done + +uninstall-pkglibDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkglib_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \ + rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) $(DATA) +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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -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 + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-exec-am: install-pkglibDATA + +install-html: install-html-am + +install-info: install-info-am + +install-man: + +install-pdf: install-pdf-am + +install-ps: 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-pkglibDATA + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \ + clean-generic clean-libtool clean-noinstLTLIBRARIES ctags \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-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-pkglibDATA 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 uninstall uninstall-am uninstall-pkglibDATA + + +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 -L../../../Watchdog/src/.libs')])." \ + | $(LIBTOOL) --mode=execute \ + -dlopen ../../../src/libppl.la \ + $(WATCHDOG_DLOPEN) \ + 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 \ + $(WATCHDOG_DLOPEN) \ + 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 \ + $(WATCHDOG_DLOPEN) \ + 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 \ + $(WATCHDOG_DLOPEN) \ + 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 + if [ $(srcdir) != `pwd` ]; then \ + cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl . ; \ + fi + cp -f ../tests/ppl_prolog_generated_test_main.pl . + rm -f xsb_prolog_generated_test.xwam + $(LIBTOOL) --mode=execute \ + -dlopen ../../../src/libppl.la \ + $(WATCHDOG_DLOPEN) \ + xsb xsb_prolog_generated_test \ + >obtained_pgt + if [ $(srcdir) != `pwd` ]; then \ + rm -f ppl_prolog_generated_test_common.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_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..9ecc5db --- /dev/null +++ b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4 @@ -0,0 +1,46 @@ +m4_define(`dnl', `m4_dnl')`'dnl +m4_divert(-1) + +dnl This m4 file generates the file ppl_xsb.H. + +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/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..f1ddcb8 --- /dev/null +++ b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 @@ -0,0 +1,118 @@ +m4_define(`dnl', `m4_dnl')`'dnl +m4_divert(-1) + +dnl This m4 file generates the file ppl_xsb.cc. +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/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); \ +} + +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..d93a899 --- /dev/null +++ b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4 @@ -0,0 +1,38 @@ +m4_define(`dnl', `m4_dnl')`'dnl +m4_divert(-1) + +dnl This m4 file generates the file ppl_xsb.cc. +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/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..d85ddf5 --- /dev/null +++ b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_test_P.m4 @@ -0,0 +1,85 @@ +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-2009 Roberto Bagnara +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://www.cs.unipr.it/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..6f27499 --- /dev/null +++ b/interfaces/Prolog/XSB/ppl_prolog_sysdep.hh @@ -0,0 +1,26 @@ +/* System-dependent part of the Prolog interfaces: stub for XSB. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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..e46f78b --- /dev/null +++ b/interfaces/Prolog/XSB/xsb_cfli.hh @@ -0,0 +1,350 @@ +/* XSB Prolog Common Foreign Language Interface. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PCFLI_xsb_cfli_hh +#define PCFLI_xsb_cfli_hh 1 + +#include + +// In XSB versions up to and including 2.7.1, does not +// come with the extern "C" wrapper. +extern "C" { +#include +} + +#include + +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(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(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(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(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(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..6ff822b --- /dev/null +++ b/interfaces/Prolog/XSB/xsb_clpq.P @@ -0,0 +1,52 @@ +/* Prolog main program for the toy PPL/XSB-Prolog CLP(Q) interpreter. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +:- compiler_options([xpp_on]). +:- import xpp_include_dir/1 from parse. +:- assert(xpp_include_dir('.')). + +:- import append/3, length/2, member/2 from basics. +:- import + ppl_initialize/0, + ppl_finalize/0, + ppl_new_C_Polyhedron_from_space_dimension/3, + ppl_new_NNC_Polyhedron_from_space_dimension/3, + ppl_new_C_Polyhedron_from_C_Polyhedron/2, + ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2, + ppl_delete_Polyhedron/1, + ppl_Polyhedron_space_dimension/2, + ppl_Polyhedron_get_constraints/2, + ppl_Polyhedron_add_constraints_and_minimize/2, + ppl_Polyhedron_add_space_dimensions_and_embed/2, + ppl_Polyhedron_remove_higher_space_dimensions/2 + from ppl_xsb. + +:- [ppl_xsb]. + +#include "clpq.pl" + +eat_eol. + +main :- + common_main. + +:- ppl_initialize, main, ppl_finalize. diff --git a/interfaces/Prolog/XSB/xsb_clpq2.P b/interfaces/Prolog/XSB/xsb_clpq2.P new file mode 100644 index 0000000..2bd6c8e --- /dev/null +++ b/interfaces/Prolog/XSB/xsb_clpq2.P @@ -0,0 +1,53 @@ +/* Prolog main program for the toy PPL/XSB-Prolog CLP(Q) interpreter. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +:- compiler_options([xpp_on]). +:- import xpp_include_dir/1 from parse. +:- assert(xpp_include_dir('.')). + +:- import append/3, length/2, member/2 from basics. +:- import + ppl_initialize/0, + ppl_finalize/0, + ppl_new_C_Polyhedron_from_space_dimension/3, + ppl_new_NNC_Polyhedron_from_space_dimension/3, + ppl_new_C_Polyhedron_from_C_Polyhedron/2, + ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2, + ppl_delete_Polyhedron/1, + ppl_Polyhedron_space_dimension/2, + ppl_Polyhedron_get_constraints/2, + ppl_Polyhedron_add_constraints_and_minimize/2, + ppl_Polyhedron_add_space_dimensions_and_embed/2, + ppl_Polyhedron_remove_space_dimensions/2, + ppl_Polyhedron_remove_higher_space_dimensions/2 + from ppl_xsb. + +:- [ppl_xsb]. + +#include "clpq2.pl" + +eat_eol. + +main :- + common_main. + +:- ppl_initialize, main, ppl_finalize. diff --git a/interfaces/Prolog/XSB/xsb_efli.cc b/interfaces/Prolog/XSB/xsb_efli.cc new file mode 100644 index 0000000..f64d52a --- /dev/null +++ b/interfaces/Prolog/XSB/xsb_efli.cc @@ -0,0 +1,80 @@ +/* XSB extended foreign language interface: definitions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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; + if (assign_r(l, n, ROUND_NOT_NEEDED) != V_EQ) + 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..9791c88 --- /dev/null +++ b/interfaces/Prolog/XSB/xsb_efli.hh @@ -0,0 +1,88 @@ +/* XSB extended foreign language interface: declarations. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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..3d2e96c --- /dev/null +++ b/interfaces/Prolog/XSB/xsb_pl_check.P @@ -0,0 +1,173 @@ +/* Prolog main program for the PPL/XSB-Prolog predicate checker. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +:- compiler_options([xpp_on]). +:- import xpp_include_dir/1 from parse. +:- assert(xpp_include_dir('.')). + +:- import append/3, length/2, member/2 from basics. +:- import + ppl_version_major/1, + ppl_version_minor/1, + ppl_version_revision/1, + ppl_version_beta/1, + ppl_version/1, + ppl_banner/1, + ppl_max_space_dimension/1, + ppl_Coefficient_is_bounded/0, + ppl_Coefficient_max/1, + ppl_Coefficient_min/1, + ppl_initialize/0, + ppl_finalize/0, + ppl_set_timeout_exception_atom/1, + ppl_timeout_exception_atom/1, + ppl_set_timeout/1, + ppl_reset_timeout/0, + ppl_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_constraint_and_minimize/2, + ppl_Polyhedron_add_generator/2, + ppl_Polyhedron_add_generator_and_minimize/2, + ppl_Polyhedron_add_constraints/2, + ppl_Polyhedron_add_constraints_and_minimize/2, + ppl_Polyhedron_add_generators/2, + ppl_Polyhedron_add_generators_and_minimize/2, + ppl_Polyhedron_intersection_assign/2, + ppl_Polyhedron_intersection_assign_and_minimize/2, + ppl_Polyhedron_poly_hull_assign/2, + ppl_Polyhedron_poly_hull_assign_and_minimize/2, + ppl_Polyhedron_poly_difference_assign/2, + ppl_Polyhedron_affine_image/4, + ppl_Polyhedron_affine_preimage/4, + ppl_Polyhedron_bounded_affine_image/5, + ppl_Polyhedron_bounded_affine_preimage/5, + ppl_Polyhedron_generalized_affine_image/5, + ppl_Polyhedron_generalized_affine_preimage/5, + ppl_Polyhedron_generalized_affine_image_lhs_rhs/4, + ppl_Polyhedron_generalized_affine_preimage_lhs_rhs/4, + ppl_Polyhedron_time_elapse_assign/2, + ppl_Polyhedron_topological_closure_assign/1, + ppl_Polyhedron_BHRZ03_widening_assign_with_tokens/4, + ppl_Polyhedron_BHRZ03_widening_assign/2, + ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens/5, + ppl_Polyhedron_limited_BHRZ03_extrapolation_assign/3, + ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens/5, + ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign/3, + ppl_Polyhedron_H79_widening_assign_with_tokens/4, + ppl_Polyhedron_H79_widening_assign/2, + ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens/5, + ppl_Polyhedron_limited_H79_extrapolation_assign/3, + ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens/5, + ppl_Polyhedron_bounded_H79_extrapolation_assign/3, + ppl_Polyhedron_add_space_dimensions_and_project/2, + ppl_Polyhedron_add_space_dimensions_and_embed/2, + ppl_Polyhedron_concatenate_assign/2, + ppl_Polyhedron_remove_space_dimensions/2, + ppl_Polyhedron_remove_higher_space_dimensions/2, + ppl_Polyhedron_expand_space_dimension/3, + ppl_Polyhedron_fold_space_dimensions/3, + ppl_Polyhedron_map_space_dimensions/2, + ppl_Polyhedron_constrains/2, + ppl_Polyhedron_unconstrain_space_dimension/2, + ppl_Polyhedron_unconstrain_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 + 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..7af35c8 --- /dev/null +++ b/interfaces/Prolog/YAP/Makefile.am @@ -0,0 +1,285 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +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 + +if BUILD_WATCHDOG_LIBRARY + +WATCHDOG_LIBRARY = $(top_builddir)/Watchdog/src/libpwl.la +WATCHDOG_INCLUDE_OPTIONS = -I$(top_builddir)/Watchdog/src +WATCHDOG_DLOPEN = -dlopen $(WATCHDOG_LIBRARY) +WATCHDOG_LINK_OPTIONS = -L$(top_builddir)/Watchdog/src/.libs -lpwl + +endif BUILD_WATCHDOG_LIBRARY + +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 \ +$(WATCHDOG_INCLUDE_OPTIONS) \ +@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_yap_la_LIBADD = \ +@required_instantiations_prolog_cxx_objects@ \ +-lYap \ +$(top_builddir)/src/libppl.la \ +$(WATCHDOG_LIBRARY) \ +@extra_libraries@ + +ppl_yap_la_DEPENDENCIES = \ +@required_instantiations_prolog_cxx_objects@ + +ppl_yap_la_LDFLAGS = \ +$(NO_UNDEFINED_FLAG) \ +-module \ +-avoid-version + +pkglib_DATA = ppl_yap.pl + +CLPQ_TESTS_NONSTRICT = \ +ack.clpq \ +ackn.clpq \ +fib.clpq \ +mc91.clpq \ +smm.clpq \ +sumto.clpq \ +tak.clpq + +CLPQ_TESTS_STRICT = \ +schedule.clpq + +CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT) + +COEFFICIENT_MNEMONIC = @coefficient_mnemonic@ + +if ASSERTIONS_ENABLED + +EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a +EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a +EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a + +else !ASSERTIONS_ENABLED + +EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC) +EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC) +EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC) + +endif !ASSERTIONS_ENABLED + +check-local: pl_check_test clpq_test clpq2_test 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 \ + $(WATCHDOG_DLOPEN) \ + -dlopen ppl_yap.la \ + yap -l $(srcdir)/yap_pl_check.pl \ + 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 \ + $(WATCHDOG_DLOPEN) \ + -dlopen ppl_yap.la \ + yap -l $(srcdir)/yap_clpq.pl \ + 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 \ + $(WATCHDOG_DLOPEN) \ + -dlopen ppl_yap.la \ + yap -l $(srcdir)/yap_clpq2.pl \ + 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 + if [ $(srcdir) != `pwd` ]; then \ + cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl . ; \ + 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 \ + $(WATCHDOG_DLOPEN) \ + -dlopen ppl_yap.la \ + yap -l yap_prolog_generated_test.pl \ + obtained_pgt + if [ $(srcdir) != `pwd` ]; then \ + rm -f ppl_prolog_generated_test_common.pl; \ + 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 = \ +@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..64ad407 --- /dev/null +++ b/interfaces/Prolog/YAP/Makefile.in @@ -0,0 +1,1437 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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.am $(srcdir)/Makefile.in +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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(pkglibdir)" +pkglibLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkglib_LTLIBRARIES) +am__ppl_yap_la_SOURCES_DIST = ppl_prolog_sysdep.hh yap_efli.hh \ + yap_efli.cc +@ENABLE_SHARED_TRUE@am_ppl_yap_la_OBJECTS = yap_efli.lo +@ENABLE_SHARED_TRUE@nodist_ppl_yap_la_OBJECTS = ppl_yap.lo \ +@ENABLE_SHARED_TRUE@ ppl_prolog_common.lo +ppl_yap_la_OBJECTS = $(am_ppl_yap_la_OBJECTS) \ + $(nodist_ppl_yap_la_OBJECTS) +ppl_yap_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(ppl_yap_la_LDFLAGS) $(LDFLAGS) -o $@ +@ENABLE_SHARED_TRUE@am_ppl_yap_la_rpath = -rpath $(pkglibdir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(ppl_yap_la_SOURCES) $(nodist_ppl_yap_la_SOURCES) \ + $(nodist_EXTRA_ppl_yap_la_SOURCES) +DIST_SOURCES = $(am__ppl_yap_la_SOURCES_DIST) +pkglibDATA_INSTALL = $(INSTALL_DATA) +DATA = $(pkglib_DATA) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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_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 + +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_LIBRARY = $(top_builddir)/Watchdog/src/libpwl.la +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_INCLUDE_OPTIONS = -I$(top_builddir)/Watchdog/src +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_DLOPEN = -dlopen $(WATCHDOG_LIBRARY) +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_LINK_OPTIONS = -L$(top_builddir)/Watchdog/src/.libs -lpwl +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 + +@ENABLE_SHARED_TRUE@AM_CPPFLAGS = \ +@ENABLE_SHARED_TRUE@-I$(top_srcdir)/interfaces \ +@ENABLE_SHARED_TRUE@-I$(top_srcdir)/interfaces/Prolog \ +@ENABLE_SHARED_TRUE@-I$(top_buildir)/interfaces/Prolog \ +@ENABLE_SHARED_TRUE@-I$(top_builddir)/src \ +@ENABLE_SHARED_TRUE@$(WATCHDOG_INCLUDE_OPTIONS) \ +@ENABLE_SHARED_TRUE@@extra_includes@ + +@ENABLE_SHARED_TRUE@@NO_UNDEFINED_TRUE@NO_UNDEFINED_FLAG = -no-undefined +@ENABLE_SHARED_TRUE@pkglib_LTLIBRARIES = ppl_yap.la + +# There is no point in generating the static version. +@ENABLE_SHARED_TRUE@AM_LIBTOOLFLAGS = --tag=disable-static +@ENABLE_SHARED_TRUE@ppl_yap_la_SOURCES = \ +@ENABLE_SHARED_TRUE@ppl_prolog_sysdep.hh \ +@ENABLE_SHARED_TRUE@yap_efli.hh \ +@ENABLE_SHARED_TRUE@yap_efli.cc + +@ENABLE_SHARED_TRUE@nodist_ppl_yap_la_SOURCES = \ +@ENABLE_SHARED_TRUE@ppl_yap.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_common.cc + +@ENABLE_SHARED_TRUE@nodist_EXTRA_ppl_yap_la_SOURCES = \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Int8_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Int16_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Int32_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Int64_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Uint8_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Uint16_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Uint32_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Uint64_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Float_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Double_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Long_Double_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Rational_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Z_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_int8_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_int16_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_int32_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_int64_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_float.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_double.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_long_double.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_mpq_class.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_mpz_class.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_int8_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_int16_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_int32_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_int64_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_float.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_double.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_long_double.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_mpq_class.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_mpz_class.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Polyhedron.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Grid.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Int8_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Int16_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Int32_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Int64_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Uint8_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Uint16_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Uint32_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Uint64_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Float_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Double_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Rational_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Z_Box.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Grid.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc \ +@ENABLE_SHARED_TRUE@../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc + +@ENABLE_SHARED_TRUE@ppl_yap_la_LIBADD = \ +@ENABLE_SHARED_TRUE@@required_instantiations_prolog_cxx_objects@ \ +@ENABLE_SHARED_TRUE@-lYap \ +@ENABLE_SHARED_TRUE@$(top_builddir)/src/libppl.la \ +@ENABLE_SHARED_TRUE@$(WATCHDOG_LIBRARY) \ +@ENABLE_SHARED_TRUE@@extra_libraries@ + +@ENABLE_SHARED_TRUE@ppl_yap_la_DEPENDENCIES = \ +@ENABLE_SHARED_TRUE@@required_instantiations_prolog_cxx_objects@ + +@ENABLE_SHARED_TRUE@ppl_yap_la_LDFLAGS = \ +@ENABLE_SHARED_TRUE@$(NO_UNDEFINED_FLAG) \ +@ENABLE_SHARED_TRUE@-module \ +@ENABLE_SHARED_TRUE@-avoid-version + +@ENABLE_SHARED_TRUE@pkglib_DATA = ppl_yap.pl +@ENABLE_SHARED_TRUE@CLPQ_TESTS_NONSTRICT = \ +@ENABLE_SHARED_TRUE@ack.clpq \ +@ENABLE_SHARED_TRUE@ackn.clpq \ +@ENABLE_SHARED_TRUE@fib.clpq \ +@ENABLE_SHARED_TRUE@mc91.clpq \ +@ENABLE_SHARED_TRUE@smm.clpq \ +@ENABLE_SHARED_TRUE@sumto.clpq \ +@ENABLE_SHARED_TRUE@tak.clpq + +@ENABLE_SHARED_TRUE@CLPQ_TESTS_STRICT = \ +@ENABLE_SHARED_TRUE@schedule.clpq + +@ENABLE_SHARED_TRUE@CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT) +@ENABLE_SHARED_TRUE@COEFFICIENT_MNEMONIC = @coefficient_mnemonic@ +@ASSERTIONS_ENABLED_FALSE@@ENABLE_SHARED_TRUE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC) +@ASSERTIONS_ENABLED_TRUE@@ENABLE_SHARED_TRUE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a +@ASSERTIONS_ENABLED_FALSE@@ENABLE_SHARED_TRUE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC) +@ASSERTIONS_ENABLED_TRUE@@ENABLE_SHARED_TRUE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a +@ASSERTIONS_ENABLED_FALSE@@ENABLE_SHARED_TRUE@EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC) +@ASSERTIONS_ENABLED_TRUE@@ENABLE_SHARED_TRUE@EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a +CLEANFILES = \ +ppl_yap.cc + +MOSTLYCLEANFILES = \ +@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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/YAP/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign interfaces/Prolog/YAP/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +ppl_yap.la: $(ppl_yap_la_OBJECTS) $(ppl_yap_la_DEPENDENCIES) + $(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 + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Float_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Int16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Int32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Int64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Int8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Long_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Rational_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Uint16_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Uint32_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Uint64_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Uint8_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_Z_Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_prolog_common.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_yap.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/yap_efli.Plo@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +ppl_prolog_common.lo: ../ppl_prolog_common.cc +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_common.Tpo $(DEPDIR)/ppl_prolog_common.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_common.cc' object='ppl_prolog_common.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Int8_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Int8_Box.cc' object='ppl_prolog_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Int16_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Int16_Box.cc' object='ppl_prolog_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Int32_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Int32_Box.cc' object='ppl_prolog_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Int64_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Int64_Box.cc' object='ppl_prolog_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Uint8_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Uint8_Box.cc' object='ppl_prolog_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Uint16_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Uint16_Box.cc' object='ppl_prolog_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Uint32_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Uint32_Box.cc' object='ppl_prolog_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Uint64_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Uint64_Box.cc' object='ppl_prolog_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Float_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Float_Box.cc' object='ppl_prolog_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Double_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Double_Box.cc' object='ppl_prolog_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Long_Double_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Long_Double_Box.cc' object='ppl_prolog_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Rational_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Rational_Box.cc' object='ppl_prolog_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Z_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Z_Box.cc' object='ppl_prolog_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_int8_t.cc' object='ppl_prolog_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_int16_t.cc' object='ppl_prolog_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_int32_t.cc' object='ppl_prolog_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_int64_t.cc' object='ppl_prolog_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_float.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_float.cc' object='ppl_prolog_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_double.cc' object='ppl_prolog_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_long_double.cc' object='ppl_prolog_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_mpq_class.cc' object='ppl_prolog_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_BD_Shape_mpz_class.cc' object='ppl_prolog_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_float.cc' object='ppl_prolog_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_double.cc' object='ppl_prolog_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_long_double.cc' object='ppl_prolog_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Polyhedron.cc' object='ppl_prolog_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Grid.Tpo $(DEPDIR)/ppl_prolog_Grid.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Grid.cc' object='ppl_prolog_Grid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Int8_Box.cc' object='ppl_prolog_Pointset_Powerset_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Int16_Box.cc' object='ppl_prolog_Pointset_Powerset_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Int32_Box.cc' object='ppl_prolog_Pointset_Powerset_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Int64_Box.cc' object='ppl_prolog_Pointset_Powerset_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Uint16_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Uint32_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Uint64_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Float_Box.cc' object='ppl_prolog_Pointset_Powerset_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Double_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_Long_Double_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Powerset_Rational_Box.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Rational_Box.cc' object='ppl_prolog_Pointset_Powerset_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Z_Box.cc' object='ppl_prolog_Pointset_Powerset_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_BD_Shape_int8_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_prolog_Pointset_Powerset_BD_Shape_int16_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_prolog_Pointset_Powerset_BD_Shape_int32_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_prolog_Pointset_Powerset_BD_Shape_int64_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_BD_Shape_float.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_BD_Shape_double.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Powerset_C_Polyhedron.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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_Pointset_Powerset_NNC_Polyhedron.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Pointset_Powerset_Grid.cc' object='ppl_prolog_Pointset_Powerset_Grid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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)/'`../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 +@am__fastdepCXX_TRUE@ $(LIBTOOL) --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 '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --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 + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-pkglibDATA: $(pkglib_DATA) + @$(NORMAL_INSTALL) + test -z "$(pkglibdir)" || $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" + @list='$(pkglib_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(pkglibDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(pkglibDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \ + done + +uninstall-pkglibDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkglib_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \ + rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +@ENABLE_SHARED_FALSE@check-local: +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(LTLIBRARIES) $(DATA) +installdirs: + for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(pkglibdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-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 + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-exec-am: install-pkglibDATA install-pkglibLTLIBRARIES + +install-html: install-html-am + +install-info: install-info-am + +install-man: + +install-pdf: install-pdf-am + +install-ps: 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-pkglibDATA uninstall-pkglibLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \ + clean-generic clean-libtool clean-pkglibLTLIBRARIES ctags \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-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-pkglibDATA 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 uninstall \ + uninstall-am uninstall-pkglibDATA uninstall-pkglibLTLIBRARIES + + +ppl_yap.cc: $(interface_generator_dependencies) + $(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \ + $(srcdir)/ppl_interface_generator_yap_cc.m4 > $@ + +@ENABLE_SHARED_TRUE@check-local: pl_check_test clpq_test clpq2_test ppl_prolog_generated_test + +@ENABLE_SHARED_TRUE@pl_check_test: yap_pl_check.pl ppl_yap.pl ../tests/pl_check.pl $(EXPECTED_PCHK) +@ENABLE_SHARED_TRUE@ echo "main." >script_pchk +@ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=execute \ +@ENABLE_SHARED_TRUE@ -dlopen ../../../src/libppl.la \ +@ENABLE_SHARED_TRUE@ $(WATCHDOG_DLOPEN) \ +@ENABLE_SHARED_TRUE@ -dlopen ppl_yap.la \ +@ENABLE_SHARED_TRUE@ yap -l $(srcdir)/yap_pl_check.pl \ +@ENABLE_SHARED_TRUE@ obtained_pchk +@ENABLE_SHARED_TRUE@ diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk + +@ENABLE_SHARED_TRUE@$(CLPQ_TESTS): +@ENABLE_SHARED_TRUE@ cp -f $(srcdir)/../tests/$@ . + +@ENABLE_SHARED_TRUE@clpq_test: yap_clpq.pl ppl_yap.pl ../tests/clpq.pl ../tests/script_clpq $(EXPECTED_CLPQ) $(CLPQ_TESTS) +@ENABLE_SHARED_TRUE@ echo "main." >script_clpq +@ENABLE_SHARED_TRUE@ cat $(srcdir)/../tests/script_clpq >>script_clpq +@ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=execute \ +@ENABLE_SHARED_TRUE@ -dlopen ../../../src/libppl.la \ +@ENABLE_SHARED_TRUE@ $(WATCHDOG_DLOPEN) \ +@ENABLE_SHARED_TRUE@ -dlopen ppl_yap.la \ +@ENABLE_SHARED_TRUE@ yap -l $(srcdir)/yap_clpq.pl \ +@ENABLE_SHARED_TRUE@ obtained_clpq +@ENABLE_SHARED_TRUE@ diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq + +@ENABLE_SHARED_TRUE@clpq2_test: yap_clpq2.pl ppl_yap.pl ../tests/clpq2.pl ../tests/script_clpq2 $(EXPECTED_CLPQ2) $(CLPQ_TESTS) +@ENABLE_SHARED_TRUE@ echo "main." >script_clpq2 +@ENABLE_SHARED_TRUE@ cat $(srcdir)/../tests/script_clpq2 >>script_clpq2 +@ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=execute \ +@ENABLE_SHARED_TRUE@ -dlopen ../../../src/libppl.la \ +@ENABLE_SHARED_TRUE@ $(WATCHDOG_DLOPEN) \ +@ENABLE_SHARED_TRUE@ -dlopen ppl_yap.la \ +@ENABLE_SHARED_TRUE@ yap -l $(srcdir)/yap_clpq2.pl \ +@ENABLE_SHARED_TRUE@ obtained_clpq2 +@ENABLE_SHARED_TRUE@ diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2 + +@ENABLE_SHARED_TRUE@ppl_prolog_generated_test: yap_prolog_generated_test.pl ppl_yap.pl ../tests/expected_pgt +@ENABLE_SHARED_TRUE@ if [ $(srcdir) != `pwd` ]; then \ +@ENABLE_SHARED_TRUE@ cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl . ; \ +@ENABLE_SHARED_TRUE@ cp -f $(srcdir)/yap_prolog_generated_test.pl . ; \ +@ENABLE_SHARED_TRUE@ cp -f $(srcdir)/ppl_yap.pl . ; \ +@ENABLE_SHARED_TRUE@ fi +@ENABLE_SHARED_TRUE@ cp -f ../tests/ppl_prolog_generated_test_main.pl . ; \ +@ENABLE_SHARED_TRUE@ echo "main." >script_pgt +@ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=execute \ +@ENABLE_SHARED_TRUE@ -dlopen ../../../src/libppl.la \ +@ENABLE_SHARED_TRUE@ $(WATCHDOG_DLOPEN) \ +@ENABLE_SHARED_TRUE@ -dlopen ppl_yap.la \ +@ENABLE_SHARED_TRUE@ yap -l yap_prolog_generated_test.pl \ +@ENABLE_SHARED_TRUE@ obtained_pgt +@ENABLE_SHARED_TRUE@ if [ $(srcdir) != `pwd` ]; then \ +@ENABLE_SHARED_TRUE@ rm -f ppl_prolog_generated_test_common.pl; \ +@ENABLE_SHARED_TRUE@ rm -f yap_prolog_generated_test.pl; \ +@ENABLE_SHARED_TRUE@ rm -f ppl_yap.pl; \ +@ENABLE_SHARED_TRUE@ fi +@ENABLE_SHARED_TRUE@ rm -f ppl_prolog_generated_test_main.pl; \ +@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..fd92834 --- /dev/null +++ b/interfaces/Prolog/YAP/README.yap @@ -0,0 +1,11 @@ +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 `/lib/ppl/ppl_yap.pl', where 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..5ea8630 --- /dev/null +++ b/interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4 @@ -0,0 +1,137 @@ +m4_define(`dnl', `m4_dnl')`'dnl +m4_divert(-1) + +dnl This m4 file generates the file ppl_yap.cc. +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/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); \ +} + +dnl +dnl Place here YAP_STUB macros. +dnl +m4_divert(1)dnl + +#define YAP_USER_C_PREDICATE(name, arity) \ + YAP_UserCPredicate(#name, reinterpret_cast(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..3228c00 --- /dev/null +++ b/interfaces/Prolog/YAP/ppl_prolog_sysdep.hh @@ -0,0 +1,25 @@ +/* System-dependent part of the Prolog interfaces: stub for YAP. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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..149297f --- /dev/null +++ b/interfaces/Prolog/YAP/ppl_yap.pl @@ -0,0 +1,23 @@ +/* Loader for the YAP Prolog interface. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +:- load_foreign_files(['ppl_yap'],[],init). diff --git a/interfaces/Prolog/YAP/yap_cfli.hh b/interfaces/Prolog/YAP/yap_cfli.hh new file mode 100644 index 0000000..20903ce --- /dev/null +++ b/interfaces/Prolog/YAP/yap_cfli.hh @@ -0,0 +1,348 @@ +/* YAP Prolog Common Foreign Language Interface. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PCFLI_yap_cfli_hh +#define PCFLI_yap_cfli_hh 1 + +#include +#include +#include +#include + +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(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(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..34c8fbf --- /dev/null +++ b/interfaces/Prolog/YAP/yap_clpq.pl @@ -0,0 +1,30 @@ +/* Prolog main program for the toy PPL/YAP-Prolog CLP(Q) interpreter. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +:- ensure_loaded('ppl_yap.pl'). +:- ensure_loaded('../tests/clpq.pl'). +:- use_module(library(lists), [append/3, member/2]). + +eat_eol. + +main :- + common_main. diff --git a/interfaces/Prolog/YAP/yap_clpq2.pl b/interfaces/Prolog/YAP/yap_clpq2.pl new file mode 100644 index 0000000..416034f --- /dev/null +++ b/interfaces/Prolog/YAP/yap_clpq2.pl @@ -0,0 +1,30 @@ +/* Prolog main program for the 2nd toy PPL/YAP-Prolog CLP(Q) interpreter. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +:- ensure_loaded('ppl_yap.pl'). +:- ensure_loaded('../tests/clpq2.pl'). +:- use_module(library(lists), [append/3, member/2]). + +eat_eol. + +main :- + common_main. diff --git a/interfaces/Prolog/YAP/yap_efli.cc b/interfaces/Prolog/YAP/yap_efli.cc new file mode 100644 index 0000000..ecdb5a2 --- /dev/null +++ b/interfaces/Prolog/YAP/yap_efli.cc @@ -0,0 +1,94 @@ +/* YAP extended foreign language interface: definitions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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..e43cf29 --- /dev/null +++ b/interfaces/Prolog/YAP/yap_efli.hh @@ -0,0 +1,90 @@ +/* YAP extended foreign language interface: declarations. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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..2c63552 --- /dev/null +++ b/interfaces/Prolog/YAP/yap_pl_check.pl @@ -0,0 +1,34 @@ +/* Prolog main program for the PPL/YAP-Prolog predicate checker. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +:- ensure_loaded('ppl_yap.pl'). +:- ensure_loaded('../tests/pl_check.pl'). + +prolog_system('YAP'). + +main :- + (check_all -> + write('OK') + ; + write('FAILURE') + ), + nl. diff --git a/interfaces/Prolog/YAP/yap_prolog_generated_test.pl b/interfaces/Prolog/YAP/yap_prolog_generated_test.pl new file mode 100644 index 0000000..5437d95 --- /dev/null +++ b/interfaces/Prolog/YAP/yap_prolog_generated_test.pl @@ -0,0 +1,34 @@ +/* Prolog main program for the PPL/YAP-Prolog predicate checker. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +:- ensure_loaded('ppl_yap.pl'). +:- ensure_loaded('ppl_prolog_generated_test_main.pl'). + +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..8917c79 --- /dev/null +++ b/interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4 @@ -0,0 +1,1778 @@ +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-2009 Roberto Bagnara +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://www.cs.unipr.it/ppl/ . + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension_code', +`extern "C" Prolog_foreign_return_type +ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension(Prolog_term_ref t_nd, + Prolog_term_ref t_uoe, + Prolog_term_ref t_ph) +{ + static const char* where = "ppl_new_@TOPOLOGY@@CLASS@_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(t_nd, + where), + EMPTY); + else + ph = new @TOPOLOGY@@CPP_CLASS@(term_to_unsigned(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_@TOPOLOGY@@CLASS@_from_@FRIEND@_code', +`extern "C" Prolog_foreign_return_type +ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@( + Prolog_term_ref t_ph_source, Prolog_term_ref t_ph) +{ + static const char* where = + "ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@/2"; + try { + @TOPOLOGY@@CPP_CLASS@* ph; + const @B_FRIEND@* ph_source + = static_cast + (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_@TOPOLOGY@@CLASS@_from_@FRIEND@_with_complexity_code', +`extern "C" Prolog_foreign_return_type +ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_with_complexity( + Prolog_term_ref t_ph_source, + Prolog_term_ref t_ph, + Prolog_term_ref t_cc) +{ + static const char* where = + "ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_with_complexity/3"; + try { + @TOPOLOGY@@CPP_CLASS@* ph; + const @B_FRIEND@* ph_source + = static_cast + (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_@TOPOLOGY@@CLASS@_from_@BUILD_REPRESENT@s_code', + `extern "C" Prolog_foreign_return_type + ppl_new_@TOPOLOGY@@CLASS@_from_@BUILD_REPRESENT@s(Prolog_term_ref t_clist, + Prolog_term_ref t_ph) +{ + static const char* where = + "ppl_new_@TOPOLOGY@@CLASS@_from_@BUILD_REPRESENT@s/2"; + try { + @!BUILD_REPRESENT@_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_@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@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_@CLASS@_swap_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_swap(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) { + static const char* where = "ppl_@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); + lhs->swap(*rhs); + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_delete_@CLASS@_code', + `extern "C" Prolog_foreign_return_type + ppl_delete_@CLASS@(Prolog_term_ref t_ph) { + static const char* where = "ppl_delete_@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_@CLASS@_@DIMENSION@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@DIMENSION@(Prolog_term_ref t_ph, Prolog_term_ref t_sd) { + static const char* where = "ppl_@CLASS@_@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_@CLASS@_get_@CLASS_REPRESENT@s_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_get_@CLASS_REPRESENT@s(Prolog_term_ref t_ph, + Prolog_term_ref t_glist) { + static const char* where = "ppl_@CLASS@_get_@CLASS_REPRESENT@s/2"; + try { + const @CPP_CLASS@* 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@_System& gs = ph->@CLASS_REPRESENT@s(); + for (@!CLASS_REPRESENT@_System::const_iterator i = gs.begin(), + gs_end = gs.end(); i != gs_end; ++i) + Prolog_construct_cons(tail, @CLASS_REPRESENT@_term(*i), tail); + + if (Prolog_unify(t_glist, tail)) + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_@CLASS@_get_minimized_@CLASS_REPRESENT@s_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_get_minimized_@CLASS_REPRESENT@s(Prolog_term_ref t_ph, + Prolog_term_ref t_glist) { + static const char* where = "ppl_@CLASS@_get_minimized_@CLASS_REPRESENT@s/2"; + try { + const @CPP_CLASS@* 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@_System& gs = ph->minimized_@CLASS_REPRESENT@s(); + for (@!CLASS_REPRESENT@_System::const_iterator i = gs.begin(), + gs_end = gs.end(); i != gs_end; ++i) + Prolog_construct_cons(tail, @CLASS_REPRESENT@_term(*i), tail); + + if (Prolog_unify(t_glist, tail)) + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_@CLASS@_@BEGINEND@_iterator_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@BEGINEND@_iterator(Prolog_term_ref t_pps, + Prolog_term_ref t_it) { + static const char* where = "ppl_@CLASS@_@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_@CLASS@_iterator_from_iterator_code', +`extern "C" Prolog_foreign_return_type +ppl_new_@CLASS@_iterator_from_iterator(Prolog_term_ref t_source, + Prolog_term_ref t_it) { + static const char* where = "ppl_new_@CLASS@_iterator_from_iterator/2"; + try { + const @CPP_CLASS@::iterator* source + = term_to_handle(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_@CLASS@_iterator_code', + `extern "C" Prolog_foreign_return_type + ppl_delete_@CLASS@_iterator(Prolog_term_ref t_it) { + static const char* where = "ppl_delete_@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_@CLASS@_@INCDEC@_iterator_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@INCDEC@_iterator(Prolog_term_ref t_it) { + static const char* where = "ppl_@CLASS@_@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_@CLASS@_iterator_equals_iterator_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_iterator_equals_iterator(Prolog_term_ref t_it1, + Prolog_term_ref t_it2) { + static const char* where = "ppl_@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_@CLASS@_get_disjunct_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_get_disjunct(Prolog_term_ref t_it, + Prolog_term_ref t_disj) { + static const char* where = "ppl_@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)->element())); + 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_@CLASS@_drop_disjunct_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_drop_disjunct(Prolog_term_ref t_pps, + Prolog_term_ref t_it) { + static const char* where = "ppl_@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_@CLASS@_drop_disjuncts_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_drop_disjuncts(Prolog_term_ref t_pps, + Prolog_term_ref t_it1, + Prolog_term_ref t_it2) { + static const char* where = "ppl_@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_@CLASS@_add_disjunct_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_add_disjunct(Prolog_term_ref t_ph, Prolog_term_ref t_d) { + static const char* where = "ppl_@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_@CLASS@_linear_@PARTITION@_code', +`dnl +extern "C" Prolog_foreign_return_type +ppl_@CLASS@_linear_@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_@CLASS@_linear_partition/4"; + @CPP_CLASS@* rfh; + Pointset_Powerset* 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)) { + return PROLOG_SUCCESS; + } + } + CATCH_ALL; +} + +') + +m4_define(`m4_linear_partition_for_polyhedron_domains', +` const Polyhedron* xph = term_to_handle(t_ph, where); + if (Interfaces::is_necessarily_closed_for_interfaces(*xph)) { + const C_Polyhedron* ph = term_to_handle(t_ph, where); + const C_Polyhedron* qh = term_to_handle(t_qh, where); + PPL_CHECK(ph); + PPL_CHECK(qh); + std::pair > + r = linear_partition(*ph, *qh); + rfh = new C_Polyhedron(0, EMPTY); + rsh = new Pointset_Powerset(0, EMPTY); + rfh->swap(r.first); + rsh->swap(r.second); + } + else { + const NNC_Polyhedron* ph = term_to_handle(t_ph, where); + const NNC_Polyhedron* qh = term_to_handle(t_qh, where); + PPL_CHECK(ph); + PPL_CHECK(qh); + std::pair > + r = linear_partition(*ph, *qh); + rfh = new NNC_Polyhedron(0, EMPTY); + rsh = new Pointset_Powerset(0, EMPTY); + rfh->swap(r.first); + rsh->swap(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 > + r = linear_partition(*ph, *qh); + rfh = new @CPP_CLASS@(0, EMPTY); + rsh = new Pointset_Powerset(0, EMPTY); + rfh->swap(r.first); + rsh->swap(r.second); +') + +m4_define(`ppl_@CLASS@_approximate_@PARTITION@_code', + `dnl + extern "C" Prolog_foreign_return_type + ppl_@CLASS@_approximate_@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_@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 > r = + approximate_partition(*ph, *qh, finite); + + @CLASS@* rfh = new @CLASS@(EMPTY); + rfh->swap(r.first); + + Pointset_Powerset* rsh = + new Pointset_Powerset(EMPTY); + rsh->swap(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_@CLASS@_relation_with_@RELATION_REPRESENT@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_relation_with_@RELATION_REPRESENT@(Prolog_term_ref t_ph, + Prolog_term_ref t_c, + Prolog_term_ref t_r) { + static const char* where = + "ppl_@CLASS@_relation_with_@RELATION_REPRESENT@/3"; + try { + @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where); + PPL_CHECK(ph); +relation_with_@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_@CLASS@_@HAS_PROPERTY@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@HAS_PROPERTY@(Prolog_term_ref t_ph) { + static const char* where = "ppl_@CLASS@_@HAS_PROPERTY@/1"; + try { + const @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where); + PPL_CHECK(ph); + if (ph->@HAS_PROPERTY@()) + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_@CLASS@_@SIMPLIFY@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@SIMPLIFY@(Prolog_term_ref t_ph) { + static const char* where = "ppl_@CLASS@_@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_@CLASS@_unconstrain_space_dimension_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_unconstrain_space_dimension(Prolog_term_ref t_ph, + Prolog_term_ref t_v) { + static const char* where = "ppl_@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_@CLASS@_unconstrain_space_dimensions_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_unconstrain_space_dimensions(Prolog_term_ref t_ph, + Prolog_term_ref t_vlist) { + static const char* where = "ppl_@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_@CLASS@_constrains_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_constrains(Prolog_term_ref t_ph, + Prolog_term_ref t_v) { + static const char* where = "ppl_@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_@CLASS@_bounds_from_@ABOVEBELOW@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_bounds_from_@ABOVEBELOW@(Prolog_term_ref t_ph, + Prolog_term_ref t_expr) { + static const char* where = "ppl_@CLASS@_bounds_from_@ABOVEBELOW@/2"; + try { + @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where); + PPL_CHECK(ph); + Linear_Expression l = build_linear_expression(t_expr, where); + if (ph->bounds_from_@ABOVEBELOW@(l)) + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_@CLASS@_@MAXMIN@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@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_@CLASS@_@MAXMIN@/5"; + 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(n); + PPL_DIRTY_TEMP_COEFFICIENT(d); + bool maxmin; + if (ph->@MAXMIN@(le, n, d, maxmin)) { + Prolog_term_ref t = Prolog_new_term_ref(); + 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_@CLASS@_@MAXMIN@_with_point_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@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_@CLASS@_@MAXMIN@_with_point/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(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(); + 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_@CLASS@_@COMPARISON@_@CLASS@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@COMPARISON@_@CLASS@(Prolog_term_ref t_lhs, + Prolog_term_ref t_rhs) { + static const char* where = "ppl_@CLASS@_@COMPARISON@_@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_@CLASS@_equals_@CLASS@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_equals_@CLASS@(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) { + static const char* where = "ppl_@CLASS@_equals_@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_@CLASS@_OK_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_OK(Prolog_term_ref t_ph) { + static const char* where = "ppl_@CLASS@_OK/1"; + try { + const @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where); + PPL_CHECK(ph); + if (ph->OK()) + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_add_@CLASS_REPRESENT@(Prolog_term_ref t_ph, Prolog_term_ref t_c) { + static const char* where = "ppl_@CLASS@_add_@CLASS_REPRESENT@/2"; + try { + @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where); + PPL_CHECK(ph); + ph->add_@CLASS_REPRESENT@(build_@CLASS_REPRESENT@(t_c, where)); + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_@CLASS@_refine_with_@REFINE_REPRESENT@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_refine_with_@REFINE_REPRESENT@(Prolog_term_ref t_ph, + Prolog_term_ref t_c) { + static const char* where = "ppl_@CLASS@_refine_with_@REFINE_REPRESENT@/2"; + try { + @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where); + PPL_CHECK(ph); + ph->refine_with_@REFINE_REPRESENT@(build_@REFINE_REPRESENT@(t_c, where)); + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@_and_minimize_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_add_@CLASS_REPRESENT@_and_minimize(Prolog_term_ref t_ph, + Prolog_term_ref t_c) { + static const char* where = "ppl_@CLASS@_add_@CLASS_REPRESENT@_and_minimize/2"; + try { + @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where); + PPL_CHECK(ph); + if (ph->add_@CLASS_REPRESENT@_and_minimize(build_@CLASS_REPRESENT@(t_c, where))) + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@s_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_add_@CLASS_REPRESENT@s(Prolog_term_ref t_ph, + Prolog_term_ref t_clist) { + static const char* where = "ppl_@CLASS@_add_@CLASS_REPRESENT@s/2"; + try { + @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where); + PPL_CHECK(ph); + @!CLASS_REPRESENT@_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_@CLASS_REPRESENT@(c, where)); + } + + // Check the list is properly terminated. + check_nil_terminating(t_clist, where); + + ph->add_@CLASS_REPRESENT@s(cs); + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_@CLASS@_refine_with_@REFINE_REPRESENT@s_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_refine_with_@REFINE_REPRESENT@s(Prolog_term_ref t_ph, + Prolog_term_ref t_clist) { + static const char* where = "ppl_@CLASS@_refine_with_@REFINE_REPRESENT@s/2"; + try { + @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where); + PPL_CHECK(ph); + @!REFINE_REPRESENT@_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_@REFINE_REPRESENT@(c, where)); + } + + // Check the list is properly terminated. + check_nil_terminating(t_clist, where); + + ph->refine_with_@REFINE_REPRESENT@s(cs); + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@s_and_minimize_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_add_@CLASS_REPRESENT@s_and_minimize(Prolog_term_ref t_ph, + Prolog_term_ref t_clist) { + static const char* where = "ppl_@CLASS@_add_@CLASS_REPRESENT@s_and_minimize/2"; + try { + @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where); + PPL_CHECK(ph); + @!CLASS_REPRESENT@_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_@CLASS_REPRESENT@(c, where)); + } + + // Check the list is properly terminated. + check_nil_terminating(t_clist, where); + + if (ph->add_@CLASS_REPRESENT@s_and_minimize(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; +} + +Prolog_foreign_return_type +bop_assign_and_minimize(Prolog_term_ref t_lhs, + Prolog_term_ref t_rhs, + bool (@CPP_CLASS@::* + bop_assign_and_minimize)(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); + if ((lhs->*bop_assign_and_minimize)(*rhs)) + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +} // namespace Prolog + +} // namespace Interfaces + +} // namespace Parma_Polyhedra_Library + +using namespace Parma_Polyhedra_Library::Interfaces::Prolog; + +') + +m4_define(`ppl_@CLASS@_@BINOP@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@BINOP@ + (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) { + static const char* where = "ppl_@CLASS@_@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_@CLASS@_@BINMINOP@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@BINMINOP@ + (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) { + static const char* where = "ppl_@CLASS@_@BINMINOP@"; + 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); + if (lhs->@BINMINOP@(*rhs)) + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_@CLASS@_simplify_using_context_assign_code', + `extern "C" Prolog_foreign_return_type + ppl_@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_@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_@CLASS@_@UB_EXACT@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@UB_EXACT@ + (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) { + static const char* where = "ppl_@CLASS@_@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(t_lhs, where); + if (Interfaces::is_necessarily_closed_for_interfaces(*xlhs)) { + C_Polyhedron* lhs = term_to_handle(t_lhs, where); + const C_Polyhedron* rhs = term_to_handle(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(t_lhs, where); + const NNC_Polyhedron* rhs = term_to_handle(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_@CLASS@_@AFFIMAGE@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@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_@CLASS@_@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_@CLASS@_generalized_@AFFIMAGE@_with_congruence_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_generalized_@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_@CLASS@_generalized_@AFFIMAGE@/6"; + try { + @CLASS@* ph = term_to_handle<@CLASS@>(t_ph, where); + PPL_CHECK(ph); + ph->generalized_@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_@CLASS@_generalized_@AFFIMAGE@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_generalized_@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_@CLASS@_generalized_@AFFIMAGE@/5"; + try { + @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where); + PPL_CHECK(ph); + ph->generalized_@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_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_generalized_@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_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs/5"; + try { + @CLASS@* ph = term_to_handle<@CLASS@>(t_ph, where); + PPL_CHECK(ph); + ph->generalized_@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_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_generalized_@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_@CLASS@_generalized_@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_@AFFIMAGE@(build_linear_expression(t_lhs, where), + r, + build_linear_expression(t_rhs, where)); + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_@CLASS@_bounded_@AFFIMAGE@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_bounded_@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_@CLASS@_bounded_@AFFIMAGE@/5"; + try { + @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where); + PPL_CHECK(ph); + ph->bounded_@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_@CLASS@_@WIDEN@_widening_assign_with_tokens_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@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_@CLASS@_@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(t_ti, where); + lhs->@WIDEN@_widening_assign(*rhs, &t); + if (unify_long(t_to, t)) + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_@CLASS@_@WIDEN@_widening_assign_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@WIDEN@_widening_assign + (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) { + static const char* where = "ppl_@CLASS@_@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@_widening_assign(*rhs, 0); + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_@CLASS@_widening_assign_with_tokens_code', + `extern "C" Prolog_foreign_return_type + ppl_@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_@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(t_ti, where); + lhs->widening_assign(*rhs, &t); + if (unify_long(t_to, t)) + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_@CLASS@_widening_assign_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_widening_assign + (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) { + static const char* where = "ppl_@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_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_with_tokens_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@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_@CLASS@_@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(t_ti, where); + lhs->@EXTRAPOLATION@_extrapolation_assign(*rhs, &t); + if (unify_long(t_to, t)) + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign + (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) { + static const char* where = "ppl_@CLASS@_@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@_extrapolation_assign(*rhs, 0); + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_narrowing_assign_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@EXTRAPOLATION@_narrowing_assign + (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) { + static const char* where = "ppl_@CLASS@_@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@_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_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign_with_tokens_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@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_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@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(t_ti, where); + lhs->BHZ03_widening_assign<@A_DISJUNCT_WIDEN@_Certificate> + (*rhs, + widen_fun_ref(&@DISJUNCT_TOPOLOGY@@A_DISJUNCT@::@DISJUNCT_WIDEN@_widening_assign), + &t); + if (unify_long(t_to, t)) + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign_code', + `extern "C" Prolog_foreign_return_type + + ppl_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign( + Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) { + static const char* where = "ppl_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@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@_Certificate> + (*rhs, + widen_fun_ref(&@DISJUNCT_TOPOLOGY@@A_DISJUNCT@::@DISJUNCT_WIDEN@_widening_assign)); + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_@CLASS@_BGP99_@DISJUNCT_WIDEN@_extrapolation_assign_code', + `extern "C" Prolog_foreign_return_type + + ppl_@CLASS@_BGP99_@DISJUNCT_WIDEN@_extrapolation_assign( + Prolog_term_ref t_lhs, Prolog_term_ref t_rhs, + Prolog_term_ref t_d) { + static const char* where = "ppl_@CLASS@_BGP99_@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@_widening_assign), + term_to_unsigned(t_d, where)); + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_@CLASS@_BGP99_@DISJUNCT_EXTRAPOLATION@_extrapolation_assign_code', + `extern "C" Prolog_foreign_return_type + + ppl_@CLASS@_BGP99_@DISJUNCT_EXTRAPOLATION@_extrapolation_assign( + Prolog_term_ref t_lhs, Prolog_term_ref t_rhs, + Prolog_term_ref t_d) { + static const char* where = "ppl_@CLASS@_BGP99_@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@_extrapolation_assign), + term_to_unsigned(t_d, where)); + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_with_tokens_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@LIMITEDBOUNDED@_@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_@CLASS@_@LIMITEDBOUNDED@_@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@_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_@CONSTRAINER@(c, where)); + } + + // Check the list is properly terminated. + check_nil_terminating(t_clist, where); + + unsigned t = term_to_unsigned(t_ti, where); + lhs->@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign(*rhs, cs, &t); + if (unify_long(t_to, t)) + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign + (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs, Prolog_term_ref t_clist) { + static const char* where = "ppl_@CLASS@_@LIMITEDBOUNDED@_@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@_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_@CONSTRAINER@(c, where)); + } + + // Check the list is properly terminated. + check_nil_terminating(t_clist, where); + + lhs->@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign(*rhs, cs, 0); + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@ + (Prolog_term_ref t_ph, Prolog_term_ref t_nnd) { + static const char* where = "ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@/2"; + try { + @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where); + PPL_CHECK(ph); + dimension_type d = term_to_unsigned(t_nnd, where); + ph->add_space_dimensions_@EMBEDPROJECT@(d); + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_@CLASS@_remove_space_dimensions_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_remove_space_dimensions + (Prolog_term_ref t_ph, Prolog_term_ref t_vlist) { + static const char* where = "ppl_@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_@CLASS@_remove_higher_space_dimensions_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_remove_higher_space_dimensions + (Prolog_term_ref t_ph, Prolog_term_ref t_nd) { + static const char* where = "ppl_@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(t_nd, + where)); + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_@CLASS@_expand_space_dimension_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_expand_space_dimension + (Prolog_term_ref t_ph, Prolog_term_ref t_v, Prolog_term_ref t_nd) { + static const char* where = "ppl_@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(t_nd, where)); + return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_@CLASS@_fold_space_dimensions_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_fold_space_dimensions + (Prolog_term_ref t_ph, Prolog_term_ref t_vlist, Prolog_term_ref t_v) { + static const char* where = "ppl_@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_@CLASS@_map_space_dimensions_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_map_space_dimensions + (Prolog_term_ref t_ph, Prolog_term_ref t_pfunc) { + static const char* where = "ppl_@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 || !pfunc.insert(i, j)) + return PROLOG_FAILURE; + } + + // 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_@CLASS@_ascii_dump_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_ascii_dump + (Prolog_term_ref t_ph) { + static const char* where = "ppl_@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_@CLASS@_@MEMBYTES@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@MEMBYTES@(Prolog_term_ref t_pps, + Prolog_term_ref t_m) { + static const char* where = "ppl_@CLASS@_@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; +} + +') 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..9e5bc4d --- /dev/null +++ b/interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4 @@ -0,0 +1,60 @@ +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-2009 Roberto Bagnara +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://www.cs.unipr.it/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) +%<--%<--%<-- ppl_prolog_`'m4_current_interface.cc +/* 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 + +`#'include "ppl_prolog_common.cc"`'dnl +dnl +dnl Generate the non-fixed part of the file. +m4_all_code`'dnl +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..1266272 --- /dev/null +++ b/interfaces/Prolog/ppl_interface_generator_prolog_dox.m4 @@ -0,0 +1,372 @@ +m4_define(`dnl', `m4_dnl')`'dnl +m4_divert(-1) + +dnl This m4 file generates the file Prolog_configured_interface.dox +dnl and Prolog_interface.dox + +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/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 Check if this build is configuration independent +dnl - if so, we are building the configuration independent Prolog manual. +dnl - otherwise, we are building the configuration dependent Prolog manual. +m4_ifdef(`m4_configuration_independent', + `m4_define(`m4_prolog_ci_documentation', `')`'dnl +') + +dnl The classes are fixed for the configuration independent manual. +m4_ifdef(`m4_prolog_ci_documentation', `dnl +m4_define(`m4_interface_classes_names', + `Polyhedron@Pointset_Powerset_C_Polyhedron@Pointset_Powerset_NNC_Polyhedron') +m4_define(`m4_cplusplus_classes_names', + `Polyhedron@Pointset_Powerset@Pointset_Powerset')') + + +dnl ================================================================= +dnl Description of file and copyright notice +dnl ================================================================= +m4_divert`'dnl +/* m4_ifdef(`m4_prolog_ci_documentation', + Configuration Independent Documentation for Prolog., + Configuration Dependent Documentation for Prolog.) +m4_include(`ppl_interface_generator_copyright')*/ + +dnl ================================================================= +dnl The Preamble. +dnl ================================================================= +/*! + \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 system-independent features of the library are described in +Section \ref PI_SI_Features "System-Independent Features". +Section \ref PI_Compilation "Compilation and Installation" +explains how the Prolog interface is compiled and installed. +Section \ref PI_SD_Features "System-Dependent Features" +illustrates the system-dependent features of the interface +for all the supported systems. + +The structure of this section is as follows: +- \ref PI_SI_Features "System-Independent Features" + - \ref Prolog_Interface_Overview "Overview" + - \ref Predicate_Specifications "Predicate Specifications" + - \ref predicate_descriptions "Predicate Descriptions" + - \ref di_predicates "Domain Independent Predicates" + - \ref mip_predicates "MIP Predicates" +m4_ifdef(`m4_prolog_ci_documentation',`dnl +dnl For the configuration independent manual we just have these sections. + - \ref Polyhedron_predicates "Predicates for C Polyhedra" + - \ref other_domains "Ad hoc Predicates for Other Domains" +', +dnl For the configured manual: we need a section name for each included class. +`dnl +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 +')`'dnl +- \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 the sequel, prefix is the prefix under which +you have installed the library (typically /usr +or /usr/local). +m4_divert(-1) + +dnl ================================================================= +dnl SYSTEM and DOMAIN INDEPENDENT DOCUMENTATION. +dnl ================================================================= +m4_divert`'dnl +m4_include(`ppl_prolog_sysindep_dox') +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 +

Predicates for the m4_this_topology m4_this_interface_class Domain

+ 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 +

Ad hoc Predicates for Other Domains

+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) + +dnl ================================================================= +dnl SYSTEM DEPENDENT DOCUMENTATION. +dnl ================================================================= +m4_divert`'dnl +m4_include(ppl_prolog_sysdep_dox) +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..529217b --- /dev/null +++ b/interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4 @@ -0,0 +1,1153 @@ +m4_divert(-1) + +dnl This m4 file contains the program code for generating Prolog_interface.dox + +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/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 +

Constructor, copy, conversion and destructor predicates

+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 +

Constructor predicates for m4_this_topology m4_this_ppl_objects

+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 +

Predicates that build new m4_this_topology m4_this_ppl_objects + by copying or converting from + other semantic geometric descriptions

+ 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.)').
+ + 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 +

Destructor predicate

+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 +

Predicates that do not change the m4_this_ppl_one_object

+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 +

Test Predicates

+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 +

Predicates that return information about the m4_this_ppl_one_object

+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 +

Ascii dump predicate

+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 +

Space-dimension preserving predicates that may change + the m4_this_ppl_one_object

+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 +

Predicates that may change the m4_this_ppl_one_object by adding +to its constraint or generator descriptions

+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 +

Predicates that transform the m4_this_ppl_one_object

+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 +

Predicates whose results depend on more than one m4_this_ppl_one_object

+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 +

Predicates for widening and extrapolation

+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 +

Predicates that may modify the vector space

+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 +

Predicate for concatenation

+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 +

Predicates for mapping dimensions or changing the vector space

+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 +

Extra Predicates Specifically for the Pointset Powerset Domains

+ 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 +

Predicates for pointset powerset iterators and disjuncts.

+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 +

Other Ad Hoc Predicates for the pointset powerset domains.

+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_@TOPOLOGY@@CLASS@_from_space_dimension_build_doc', `dnl +

ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension(+Dimension_Type, +Universe_or_Empty, -Handle)
+ 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_@TOPOLOGY@@CLASS@_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. + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@BUILD_REPRESENT@s_build_doc', +`dnl +

ppl_new_@TOPOLOGY@@CLASS@_from_@BUILD_REPRESENT@s(+@!BUILD_REPRESENT@_System, -Handle)
+ Builds a new @A_TOPOLOGY@`'m4_this_ppl_one_object \p P from + \c @!BUILD_REPRESENT@_System. + \c Handle is unified with the handle for \p P. + +') + +dnl ----------------------------------------------------------------- +dnl Documentation for each of the convert predicates; +dnl ----------------------------------------------------------------- + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_convert_doc', `dnl +

ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@(+Handle_1, -Handle_2)
+ 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. + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_with_complexity_convert_doc', `dnl +

ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_with_complexity(+Handle, +Complexity, -Handle)
+ 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. + +') + +dnl ----------------------------------------------------------------- +dnl Documentation for the desctructor; +dnl ----------------------------------------------------------------- + +m4_define(`ppl_delete_@CLASS@_destruct_doc', +`dnl +

ppl_delete_@CLASS@(+Handle)
+ Invalidates the handle referenced by \c Handle: + this makes sure the corresponding resources will eventually be released. + +') + +dnl ----------------------------------------------------------------- +dnl Documentation for each of the simple test predicates; +dnl ----------------------------------------------------------------- + +m4_define(`ppl_@CLASS@_@HAS_PROPERTY@_testpoly_doc', +`dnl +

ppl_@CLASS@_@HAS_PROPERTY@(+Handle)
+ Succeeds if and only if the m4_this_ppl_one_object referenced by + \c Handle @A_HAS_PROPERTY@. + +') + +m4_define(`ppl_@CLASS@_bounds_from_@ABOVEBELOW@_testpoly_doc', +`dnl +

ppl_@CLASS@_bounds_from_@ABOVEBELOW@(+Handle, +Lin_Expr)
+ Succeeds if and only if Lin_Expr is bounded from @ABOVEBELOW@ + in the m4_this_ppl_one_object referenced by \c Handle. + +') + +m4_define(`ppl_@CLASS@_@COMPARISON@_@CLASS@_testpoly_doc', +`dnl +

ppl_@CLASS@_@COMPARISON@_@CLASS@(+Handle_1, +Handle_2)
+ Succeeds if and only if the m4_this_ppl_one_object referenced by + Handle_2 @A_COMPARISON@ + the m4_this_ppl_one_object referenced by Handle_1. + +') + +m4_define(`ppl_@CLASS@_equals_@CLASS@_testpoly_doc', +`dnl +

ppl_@CLASS@_equals_@CLASS@(+Handle_1, +Handle_2)
+ Succeeds if and only if the m4_this_ppl_one_object referenced by + Handle_1 is + equal to the m4_this_ppl_one_object referenced by Handle_2. + +') + +m4_define(`ppl_@CLASS@_constrains_testpoly_doc', +`dnl +

ppl_@CLASS@_constrains(+Handle, +PPL_Var)
+ Succeeds if and only if the m4_this_ppl_one_object referenced by + \c Handle constrains the dimension \c PPL_Var. + +') + +m4_define(`ppl_@CLASS@_OK_testpoly_doc', +`dnl +

ppl_@CLASS@_OK(+Handle)
+ 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. + +') + +dnl ----------------------------------------------------------------- +dnl Documentation for each of the "get information" predicates; +dnl ----------------------------------------------------------------- + +m4_define(`ppl_@CLASS@_@MAXMIN@_constpoly_doc', +`dnl +

ppl_@CLASS@_@MAXMIN@imize(+Handle, +Lin_Expr, ?Coeff_1, ?Coeff_2, ?Boolean)
+ 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@imum|COMMA| \c Boolean is unified + with the atom \c true and|COMMA| otherwise|COMMA| unified with + the atom \c false. + +') + +m4_define(`ppl_@CLASS@_@MAXMIN@_with_point_constpoly_doc', +`dnl +

ppl_@CLASS@_@MAXMIN@imize_with_point(+Handle, +Lin_Expr, ?Coeff_1, ?Coeff_2, ?Boolean, ?Point)
+ 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@imum|COMMA| \c Boolean is unified + with the atom \c true and|COMMA| otherwise|COMMA| unified with the + atom \c false. + +') + +m4_define(`ppl_@CLASS@_@DIMENSION@_constpoly_doc', +`dnl +

ppl_@CLASS@_@DIMENSION@(+Handle, ?Dimension_Type)
+ Unifies \c Dimension_Type with the @A_DIMENSION@ + the m4_this_ppl_one_object referenced by \c Handle. + +') + +m4_define(`ppl_@CLASS@_relation_with_@RELATION_REPRESENT@_constpoly_doc', +`dnl +

ppl_@CLASS@_relation_with_@RELATION_REPRESENT@(+Handle, +@!RELATION_REPRESENT@, ?Relation_List)
+ Unifies \c Relation_List with the list of relations the + m4_this_ppl_one_object referenced by \c Handle has with \c @!RELATION_REPRESENT@. + The possible relations are listed in the + grammar rules above. + +') + +m4_define(`ppl_@CLASS@_get_@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') +

ppl_@CLASS@_get_@CLASS_REPRESENT@s(+Handle, ?@!CLASS_REPRESENT@_System)
+ Unifies \c @!CLASS_REPRESENT@_System with + the @CLASS_REPRESENT@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. + +') + +m4_define(`ppl_@CLASS@_get_minimized_@CLASS_REPRESENT@s_constpoly_doc', +`dnl +m4_pushdef(`m4_Polyhedron_b_class_represent_replacements', + `satisfied by, for, satisfied by') +

ppl_@CLASS@_get_minimized_@CLASS_REPRESENT@s(+Handle, ?@!CLASS_REPRESENT@_System)
+ Unifies \c @!CLASS_REPRESENT@_System with + the @CLASS_REPRESENT@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. + +') + +m4_define(`ppl_@CLASS@_@MEMBYTES@_constpoly_doc', + `dnl +m4_pushdef(`m4_a_membytes_replacements', `total, external') +

ppl_@CLASS@_@MEMBYTES@(+Handle, ?Number)
+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. + +') + +dnl ----------------------------------------------------------------- +dnl Documentation for the ascii dump; +dnl ----------------------------------------------------------------- + +m4_define(`ppl_@CLASS@_ascii_dump_dump_doc', + `dnl +

ppl_@CLASS@_ascii_dump(+Handle)
+ Dumps an ascii representation of the PPL internal state for + the m4_this_ppl_one_object referenced by \c Handle on the standard output. + +') + +dnl ----------------------------------------------------------------- +dnl Documentation for each of the "add to" predicates; +dnl ----------------------------------------------------------------- + +m4_define(`ppl_@CLASS@_add_@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 +

ppl_@CLASS@_add_@CLASS_REPRESENT@(+Handle, +@!CLASS_REPRESENT@)
+ 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@. + +') + +m4_define(`ppl_@CLASS@_add_@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 +

ppl_@CLASS@_add_@CLASS_REPRESENT@s( + +Handle, + +@!CLASS_REPRESENT@_System)
+ Updates the m4_this_ppl_one_object referenced by \c Handle to + one obtained by adding to its @CLASS_REPRESENT@ system the @CLASS_REPRESENT@s in + \c @!CLASS_REPRESENT@_System. + For a C polyhedron|COMMA| \c @!CLASS_REPRESENT@s must be a list of + @A_CLASS_REPRESENT@. + +') + +m4_define(`ppl_@CLASS@_refine_with_@REFINE_REPRESENT@_addto_doc', +`dnl +

ppl_@CLASS@_refine_with_@REFINE_REPRESENT@( + +Handle, + +@!REFINE_REPRESENT@)
+ Updates the m4_this_ppl_one_object referenced by \c Handle to + one obtained by refining its @REFINE_REPRESENT@ system with + \c @!REFINE_REPRESENT@. + +') + +m4_define(`ppl_@CLASS@_refine_with_@REFINE_REPRESENT@s_addto_doc', +`dnl +

ppl_@CLASS@_refine_with_@REFINE_REPRESENT@s( + +Handle, + +@!REFINE_REPRESENT@_System)
+ Updates the m4_this_ppl_one_object referenced by \c Handle to + one obtained by refining its @REFINE_REPRESENT@ system with + the @REFINE_REPRESENT@s in \c @!REFINE_REPRESENT@_System. + +') + +dnl ----------------------------------------------------------------- +dnl Documentation for each of the binary operator predicates; +dnl ----------------------------------------------------------------- + +m4_define(`ppl_@CLASS@_@BINOP@_binop_doc', +`dnl +

ppl_@CLASS@_@BINOP@(+Handle_1, +Handle_2)
+ 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. + +') + +m4_define(`ppl_@CLASS@_@UB_EXACT@_binop_doc', +`dnl +

ppl_@CLASS@_@UB_EXACT@(+Handle_1, +Handle_2)
+ 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. + +') + +m4_define(`ppl_@CLASS@_linear_@PARTITION@_binop_doc', + `dnl +

ppl_@CLASS@_linear_@PARTITION@(+Handle_1, +Handle_2, -Handle_3, + -Handle_4)
+ \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. + +') + +m4_define(`ppl_@CLASS@_approximate_@PARTITION@_binop_doc', + `dnl +

ppl_@CLASS@_approximate_@PARTITION@(+Handle_1, +Handle_2, ?Boolean, + -Handle_3, -Handle_4)
+ \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:
+ 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;
+ 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.
+ This predicate is only provided if the + class \c Pointset_Powerset_Grid + has been enabled when configuring the library.
+ +') + +m4_define(`ppl_@CLASS@_simplify_using_context_assign_binop_doc', +`dnl +

ppl_@CLASS@_simplify_using_context_assign(+Handle_1, +Handle_2, ?Boolean)
+ 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. + +') + +dnl ----------------------------------------------------------------- +dnl Documentation for each of the widen and extrapolation predicates; +dnl ----------------------------------------------------------------- + +m4_define(`ppl_@CLASS@_widening_assign_with_tokens_widen_doc', +`dnl +

ppl_@CLASS@_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)
+Same as predicate `'dnl +m4_ifelse( + m4_this_interface_class, Polyhedron, + ppl_@CLASS@_H79_widening_assign_with_tokens/4, + m4_this_interface_class, Grid, + ppl_@CLASS@_congruence_widening_assign_with_tokens/4, + m4_this_ppl_group, box, + ppl_@CLASS@_CC76_widening_assign_with_tokens/4, + m4_this_ppl_group, wr_shape, + ppl_@CLASS@_H79_widening_assign_with_tokens/4) + +') + +m4_define(`ppl_@CLASS@_widening_assign_widen_doc', +`dnl +

ppl_@CLASS@_widening_assign(+Handle_1, +Handle_2)
+Same as predicate `'dnl +m4_ifelse( + m4_this_interface_class, Polyhedron, + ppl_@CLASS@_H79_widening_assign/2, + m4_this_interface_class, Grid, + ppl_@CLASS@_congruence_widening_assign/2, + m4_this_ppl_group, box, + ppl_@CLASS@_CC76_widening_assign/2, + m4_this_ppl_group, wr_shape, + ppl_@CLASS@_H79_widening_assign/2) + +') + +m4_define(`ppl_@CLASS@_@WIDEN@_widening_assign_with_tokens_widen_doc', +`dnl +

ppl_@CLASS@_@WIDEN@_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)
+ Assigns to the m4_this_ppl_one_object \p P_1 referenced by \c Handle_1 + the @WIDEN@-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. + +') + +m4_define(`ppl_@CLASS@_@WIDEN@_widening_assign_widen_doc', +`dnl +

ppl_@CLASS@_@WIDEN@_widening_assign(+Handle_1, +Handle_2)
+ Assigns to the m4_this_ppl_one_object \p P_1 referenced by \c Handle_1 + the @WIDEN@-widening of \p P_1 with the m4_this_ppl_one_object + referenced by \c Handle_2. + +') + +m4_define(`ppl_@CLASS@_@LIMITEDBOUNDED@_@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') +

ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)
+ Assigns to the m4_this_ppl_one_object \p P_1 referenced by \c Handle_1 + the @WIDENEXPN@-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@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. + +') + +m4_define(`ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_widen_doc', +`dnl +m4_pushdef(`m4_a_limitedbounded_replacements', `, + |COMMA| further intersected with the smallest box containing \\p P_1') +

ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)
+ Assigns to the m4_this_ppl_one_object \p P_1 referenced by \c Handle_1 + the @WIDENEXPN@-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@A_LIMITEDBOUNDED@. + +') + + m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_narrowing_assign_widen_doc', + `dnl +

ppl_@CLASS@_@EXTRAPOLATION@_narrowing_assign(+Handle_1, +Handle_2)
+ Assigns to the m4_this_ppl_one_object \p P_1 referenced by \c Handle_1 + the @EXTRAPOLATION@-narrowing of \p P_1 and the m4_this_ppl_one_object + referenced by \c Handle_2. + +') + +m4_define(`ppl_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign_widen_doc', + `dnl +

ppl_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign(+Handle_1, +Handle_2)
+ 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@-widening + certified by the convergence certificate for @A_DISJUNCT_WIDEN@. + +') + +m4_define(`ppl_@CLASS@_BGP99_@DISJUNCT_WIDEN@_extrapolation_assign_widen_doc', + `dnl +

ppl_@CLASS@_BGP99_@DISJUNCT_WIDEN@_extrapolation_assign(+Handle_1, +Handle_2, C_unsigned)
+ 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@-widening + and the cardinality threshold \c C_unsigned. + +') + +dnl ----------------------------------------------------------------- +dnl Documentation for each of the transform predicates; +dnl ----------------------------------------------------------------- + +m4_define(`ppl_@CLASS@_swap_build_trans_doc', +`dnl +

ppl_@CLASS@_swap(+Handle_1, +Handle_2)
+ Swaps the m4_this_ppl_one_object referenced by \c Handle_1 + with the m4_this_ppl_one_object referenced by \c Handle_2. + +') + +m4_define(`ppl_@CLASS@_@SIMPLIFY@_trans_doc', +`dnl +

ppl_@CLASS@_@SIMPLIFY@(+Handle)
+ Assigns to the m4_this_ppl_one_object referenced by \c Handle + its @A_SIMPLIFY@. + +') + +m4_define(`m4_a_affimage_replacements', + `image, preimage') +m4_define(`m4_b_affimage_replacements', + `assigning the affine, substituting the affine') + +m4_define(`ppl_@CLASS@_@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 +

ppl_@CLASS@_@AFFIMAGE@(+Handle, +PPL_Var, +Lin_Expr, +Coeff)
+ Transforms the m4_this_ppl_one_object referenced by \c Handle + @B_AFFIMAGE@ expression for \c Lin_Expr/\c Coeff to \c PPL_Var. + +') + +m4_define(`ppl_@CLASS@_bounded_@AFFIMAGE@_trans_doc', +`dnl +

ppl_@CLASS@_bounded_@AFFIMAGE@(+Handle, +PPL_Var, +Lin_Expr_1, +Lin_Expr_2, +Coeff)
+ 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. + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_trans_doc', +`dnl +

ppl_@CLASS@_generalized_@AFFIMAGE@(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coeff)
+ 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. + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_trans_doc', +`dnl +

ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2)
+ 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. + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_with_congruence_trans_doc', + `dnl +

ppl_@CLASS@_generalized_@AFFIMAGE@_with_congruence(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coeff_1, +Coeff_2)
+ 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. + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence_trans_doc', +`dnl +

ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2, +Coeff)
+ 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. + +') + +m4_define(`ppl_@CLASS@_unconstrain_space_dimension_trans_doc', +`dnl +

ppl_@CLASS@_unconstrain_space_dimension(+Handle, +PPL_Var)
+ Modifies the m4_this_ppl_one_object \p P referenced by \c Handle by unconstraining + the space dimension \c PPL_Var. + +') + +m4_define(`ppl_@CLASS@_unconstrain_space_dimensions_trans_doc', +`dnl +

ppl_@CLASS@_unconstrain_space_dimensions(+Handle, +List_of_PPL_Var)
+ 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. + +') + +dnl ----------------------------------------------------------------- +dnl Documentation for the concatenation predicates; +dnl ----------------------------------------------------------------- + +m4_define(`ppl_@CLASS@_@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') +

ppl_@CLASS@_@BINOP@(+Handle_1, +Handle_2)
+ 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. + +') + +dnl ----------------------------------------------------------------- +dnl Documentation for each of the space changing predicates; +dnl ----------------------------------------------------------------- + +m4_define(`ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@_spacemod_doc', +`dnl +

ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@(+Handle, +Dimension_Type)
+ Adds \c Dimension_Type new dimensions to the space enclosing + the m4_this_ppl_one_object \p P referenced by \c Handle + and @EMBEDPROJECT@s \p P in this space. + +') + +m4_define(`ppl_@CLASS@_remove_space_dimensions_spacemod_doc', +`dnl +

ppl_@CLASS@_remove_space_dimensions(+Handle, +List_of_PPL_Vars)
+ 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. + +') + +m4_define(`ppl_@CLASS@_remove_higher_space_dimensions_spacemod_doc', +`dnl +

ppl_@CLASS@_remove_higher_space_dimensions(+Handle, +Dimension_Type)
+ 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. + +') + +m4_define(`ppl_@CLASS@_expand_space_dimension_spacemod_doc', +`dnl +

ppl_@CLASS@_expand_space_dimension(+Handle, +PPL_Var, +Dimension_Type)
+ 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. + +') + +m4_define(`ppl_@CLASS@_fold_space_dimensions_spacemod_doc', +`dnl +

ppl_@CLASS@_fold_space_dimensions(+Handle, +List_of_PPL_Vars, +PPL_Var)
+ 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. + +') + +m4_define(`ppl_@CLASS@_map_space_dimensions_spacemod_doc', +`dnl +

ppl_@CLASS@_map_space_dimensions(+Handle, +P_Func)
+ 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. + +') + +dnl ----------------------------------------------------------------- +dnl Documentation for each of the powerset predicates involving +dnl iterators and disjuncts; +dnl ----------------------------------------------------------------- + +m4_define(`ppl_new_@CLASS@_iterator_from_iterator_pps_iter_doc', +`dnl +

ppl_new_@CLASS@_iterator_from_iterator(+Iterator_1, -Iterator_2)
+ Builds a new iterator \p it from the iterator referenced by + \c Iterator_1. Iterator_2 is unified with the handle + for \p it. + +') + +m4_define(`ppl_@CLASS@_@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') +

ppl_@CLASS@_@SIMPLIFY@(+Handle)
+ Assigns the result of @A_SIMPLIFY@ on + the pointset powerset referenced by \c Handle. + +') + +m4_define(`ppl_@CLASS@_iterator_equals_iterator_pps_iter_doc', + `dnl +

ppl_@CLASS@_iterator_equals_iterator(+Iterator_1, +Iterator_2)
+ Succeeds if and only if the iterator referenced by + \c Iterator_1 is equal to the iterator referenced by + \c Iterator_2. + +') + + m4_define(`ppl_@CLASS@_@BEGINEND@_iterator_pps_iter_doc', + `dnl +

ppl_@CLASS@_@BEGINEND@_iterator(+Handle, -Iterator)
+ 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. + +') + +m4_define(`ppl_delete_@CLASS@_iterator_pps_iter_doc', + `dnl +

ppl_delete_@CLASS@_iterator(+Iterator)
+ Invalidates the handle referenced by Iterator: + this makes sure the corresponding resources + will eventually be released. + +') + +m4_define(`ppl_@CLASS@_@INCDEC@_iterator_pps_iter_doc', + `dnl +m4_pushdef(`m4_Pointset_Powerset_a_incdec_replacements', + `next, previous') +

ppl_@CLASS@_iterator_@INCDEC@(+Iterator)
+ @!INCDEC@s the iterator referenced by \c Iterator + so that it "points" to the @A_INCDEC@ disjunct. + +') + +m4_define(`ppl_@CLASS@_get_disjunct_pps_iter_doc', + `dnl +

ppl_@CLASS@_iterator_get_disjunct(+Iterator, -Handle)
+ Unifies with \c Handle a reference to the disjunct referred + to by \c Iterator_1. + +') + +m4_define(`ppl_@CLASS@_drop_disjunct_pps_iter_doc', + `dnl +

ppl_@CLASS@_drop_disjunct(+Handle, +Iterator)
+ 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. + +') + +m4_define(`ppl_@CLASS@_drop_disjuncts_pps_iter_doc', + `dnl +

ppl_@CLASS@_drop_disjuncts(+Handle, +Iterator_1, +Iterator_2)
+ 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). + +') + +m4_define(`ppl_@CLASS@_add_disjunct_pps_iter_doc', + `dnl +

ppl_@CLASS@_add_disjunct(+Handle_1, +Handle_2)
+ Adds to the pointset powerset referenced by \c Handle_1 a disjunct + referred to by \c Handle_2. + +') + +dnl ----------------------------------------------------------------- +dnl Documentation for _other_ ad hoc powerset predicates; +dnl Note: this is only needed for the configure independent manual. +dnl ----------------------------------------------------------------- + +m4_define(`ppl_@CLASS@_@COMPARISON@_@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') +

ppl_@CLASS@_@COMPARISON@_@CLASS@(+Handle_1, +Handle_2)
+ 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}. + +') 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..5598257 --- /dev/null +++ b/interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4 @@ -0,0 +1,533 @@ +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-2009 Roberto Bagnara +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://www.cs.unipr.it/ppl/ . + +m4_define(`ppl_@CLASS@_linear_@PARTITION@_code', +`dnl +extern "C" Prolog_foreign_return_type +ppl_@CLASS@_linear_@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_@TOPOLOGY@@CLASS@_from_space_dimension_code', +`extern "C" Prolog_foreign_return_type +ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension(Prolog_term_ref t_nd, + Prolog_term_ref t_uoe, + Prolog_term_ref t_ph); + +') + + m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_code', +`extern "C" Prolog_foreign_return_type +ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@( + Prolog_term_ref t_ph_source, Prolog_term_ref t_ph); + +') + + m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_with_complexity_code', +`extern "C" Prolog_foreign_return_type +ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_with_complexity( + Prolog_term_ref t_ph_source, + Prolog_term_ref t_ph, + Prolog_term_ref t_cc); + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@BUILD_REPRESENT@s_code', + `extern "C" Prolog_foreign_return_type + ppl_new_@TOPOLOGY@@CLASS@_from_@BUILD_REPRESENT@s(Prolog_term_ref t_clist, + Prolog_term_ref t_ph); +') + + m4_define(`ppl_@CLASS@_swap_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_swap(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs); + +') + +m4_define(`ppl_delete_@CLASS@_code', + `extern "C" Prolog_foreign_return_type + ppl_delete_@CLASS@(Prolog_term_ref t_ph); +') + +m4_define(`ppl_@CLASS@_@DIMENSION@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@DIMENSION@(Prolog_term_ref t_ph, Prolog_term_ref t_sd); +') + +m4_define(`ppl_@CLASS@_get_@CLASS_REPRESENT@s_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_get_@CLASS_REPRESENT@s(Prolog_term_ref t_ph, + Prolog_term_ref t_glist); + +') + +m4_define(`ppl_@CLASS@_get_minimized_@CLASS_REPRESENT@s_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_get_minimized_@CLASS_REPRESENT@s(Prolog_term_ref t_ph, + Prolog_term_ref t_glist); + +') + +m4_define(`ppl_new_@CLASS@_iterator_from_iterator_code', +`extern "C" Prolog_foreign_return_type +ppl_new_@CLASS@_iterator_from_iterator(Prolog_term_ref t_source, + Prolog_term_ref t_it); + +') + +m4_define(`ppl_@CLASS@_@BEGINEND@_iterator_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@BEGINEND@_iterator(Prolog_term_ref t_pps, + Prolog_term_ref t_it); + +') + +m4_define(`ppl_delete_@CLASS@_iterator_code', + `extern "C" Prolog_foreign_return_type + ppl_delete_@CLASS@_iterator(Prolog_term_ref t_it); +') + +m4_define(`ppl_@CLASS@_@INCDEC@_iterator_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@INCDEC@_iterator(Prolog_term_ref t_it); + +') + +m4_define(`ppl_@CLASS@_iterator_equals_iterator_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_iterator_equals_iterator(Prolog_term_ref t_it1, + Prolog_term_ref t_it2); + +') + +m4_define(`ppl_@CLASS@_get_disjunct_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_get_disjunct(Prolog_term_ref t_it, + Prolog_term_ref t_disj); + +') + +m4_define(`ppl_@CLASS@_drop_disjunct_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_drop_disjunct(Prolog_term_ref t_pps, + Prolog_term_ref t_it); + +') + +m4_define(`ppl_@CLASS@_drop_disjuncts_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_drop_disjuncts(Prolog_term_ref t_pps, + Prolog_term_ref t_it1, + Prolog_term_ref t_it2); + +') + +m4_define(`ppl_@CLASS@_add_disjunct_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_add_disjunct(Prolog_term_ref t_ph, Prolog_term_ref t_d); +') + +m4_define(`ppl_@CLASS@_approximate_@PARTITION@_code', + `dnl + extern "C" Prolog_foreign_return_type + ppl_@CLASS@_approximate_@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_@CLASS@_relation_with_@RELATION_REPRESENT@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_relation_with_@RELATION_REPRESENT@(Prolog_term_ref t_ph, + Prolog_term_ref t_c, + Prolog_term_ref t_r); + +') + +m4_define(`ppl_@CLASS@_@HAS_PROPERTY@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@HAS_PROPERTY@(Prolog_term_ref t_ph); + +') + +m4_define(`ppl_@CLASS@_@SIMPLIFY@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@SIMPLIFY@(Prolog_term_ref t_ph); + +') + +m4_define(`ppl_@CLASS@_unconstrain_space_dimension_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_unconstrain_space_dimension(Prolog_term_ref t_ph, + Prolog_term_ref t_v); + +') + +m4_define(`ppl_@CLASS@_unconstrain_space_dimensions_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_unconstrain_space_dimensions(Prolog_term_ref t_ph, + Prolog_term_ref t_vlist); + +') + +m4_define(`ppl_@CLASS@_constrains_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_constrains(Prolog_term_ref t_ph, + Prolog_term_ref t_v); + +') + +m4_define(`ppl_@CLASS@_bounds_from_@ABOVEBELOW@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_bounds_from_@ABOVEBELOW@(Prolog_term_ref t_ph, + Prolog_term_ref t_expr); + +') + +m4_define(`ppl_@CLASS@_@MAXMIN@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@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_@CLASS@_@MAXMIN@_with_point_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@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_@CLASS@_@COMPARISON@_@CLASS@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@COMPARISON@_@CLASS@(Prolog_term_ref t_lhs, + Prolog_term_ref t_rhs); + +') + +m4_define(`ppl_@CLASS@_equals_@CLASS@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_equals_@CLASS@(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs); + +') + +m4_define(`ppl_@CLASS@_OK_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_OK(Prolog_term_ref t_ph); + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_add_@CLASS_REPRESENT@(Prolog_term_ref t_ph, Prolog_term_ref t_c); + +') + +m4_define(`ppl_@CLASS@_refine_with_@REFINE_REPRESENT@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_refine_with_@REFINE_REPRESENT@(Prolog_term_ref t_ph, Prolog_term_ref t_c); + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@_and_minimize_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_add_@CLASS_REPRESENT@_and_minimize(Prolog_term_ref t_ph, + Prolog_term_ref t_c); + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@s_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_add_@CLASS_REPRESENT@s(Prolog_term_ref t_ph, + Prolog_term_ref t_clist); + +') + +m4_define(`ppl_@CLASS@_refine_with_@REFINE_REPRESENT@s_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_refine_with_@REFINE_REPRESENT@s(Prolog_term_ref t_ph, + Prolog_term_ref t_clist); + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@s_and_minimize_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_add_@CLASS_REPRESENT@s_and_minimize(Prolog_term_ref t_ph, + Prolog_term_ref t_clist); + +') + +m4_define(`ppl_@CLASS@_@BINOP@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@BINOP@ + (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs); + +') + +m4_define(`ppl_@CLASS@_@BINMINOP@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@BINMINOP@ + (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs); + +') + +m4_define(`ppl_@CLASS@_simplify_using_context_assign_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_simplify_using_context_assign + (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs, Prolog_term_ref t_b); + +') + +m4_define(`ppl_@CLASS@_@UB_EXACT@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@UB_EXACT@ + (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs); + +') + +m4_define(`ppl_@CLASS@_@AFFIMAGE@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@AFFIMAGE@ + (Prolog_term_ref t_ph, + Prolog_term_ref t_v, Prolog_term_ref t_le, Prolog_term_ref t_d); + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_with_congruence_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_generalized_@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_@CLASS@_generalized_@AFFIMAGE@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_generalized_@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_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_generalized_@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_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_generalized_@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_@CLASS@_bounded_@AFFIMAGE@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_bounded_@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_@CLASS@_@WIDEN@_widening_assign_with_tokens_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@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_@CLASS@_@WIDEN@_widening_assign_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@WIDEN@_widening_assign + (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs); + +') + +m4_define(`ppl_@CLASS@_widening_assign_with_tokens_code', + `extern "C" Prolog_foreign_return_type + ppl_@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_@CLASS@_widening_assign_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_widening_assign + (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs); + +') + +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_with_tokens_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@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_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign + (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs); + +') + +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_narrowing_assign_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@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_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign_with_tokens_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@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_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign_code', + `extern "C" Prolog_foreign_return_type + + ppl_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign( + Prolog_term_ref t_lhs, Prolog_term_ref t_rhs); + +') + +m4_define(`ppl_@CLASS@_BGP99_@DISJUNCT_WIDEN@_extrapolation_assign_code', + `extern "C" Prolog_foreign_return_type + + ppl_@CLASS@_BGP99_@DISJUNCT_WIDEN@_extrapolation_assign( + Prolog_term_ref t_lhs, Prolog_term_ref t_rhs, + Prolog_term_ref t_d); + +') + +m4_define(`ppl_@CLASS@_BGP99_@DISJUNCT_EXTRAPOLATION@_extrapolation_assign_code', + `extern "C" Prolog_foreign_return_type + + ppl_@CLASS@_BGP99_@DISJUNCT_EXTRAPOLATION@_extrapolation_assign( + Prolog_term_ref t_lhs, Prolog_term_ref t_rhs, + Prolog_term_ref t_d); + +') + +m4_define(`ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_with_tokens_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@LIMITEDBOUNDED@_@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_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign + (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs, Prolog_term_ref t_clist); + +') + +m4_define(`ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@ + (Prolog_term_ref t_ph, Prolog_term_ref t_nnd); + +') + +m4_define(`ppl_@CLASS@_remove_space_dimensions_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_remove_space_dimensions + (Prolog_term_ref t_ph, Prolog_term_ref t_vlist); + +') + +m4_define(`ppl_@CLASS@_remove_higher_space_dimensions_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_remove_higher_space_dimensions + (Prolog_term_ref t_ph, Prolog_term_ref t_nd); + +') + +m4_define(`ppl_@CLASS@_expand_space_dimension_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_expand_space_dimension + (Prolog_term_ref t_ph, Prolog_term_ref t_v, Prolog_term_ref t_nd); + +') + +m4_define(`ppl_@CLASS@_fold_space_dimensions_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_fold_space_dimensions + (Prolog_term_ref t_ph, Prolog_term_ref t_vlist, Prolog_term_ref t_v); + +') + +m4_define(`ppl_@CLASS@_map_space_dimensions_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_map_space_dimensions + (Prolog_term_ref t_ph, Prolog_term_ref t_pfunc); + +') + +m4_define(`ppl_@CLASS@_ascii_dump_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_ascii_dump + (Prolog_term_ref t_ph); + +') + +m4_define(`ppl_@CLASS@_@MEMBYTES@_code', + `extern "C" Prolog_foreign_return_type + ppl_@CLASS@_@MEMBYTES@(Prolog_term_ref t_pps, + Prolog_term_ref t_m); + +') 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..943e190 --- /dev/null +++ b/interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4 @@ -0,0 +1,66 @@ +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-2009 Roberto Bagnara +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://www.cs.unipr.it/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 +%<--%<--%<-- ppl_prolog_domains.hh +/* 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) +%<--%<--%<-- ppl_prolog_domains.hh +`#'include "ppl_prolog_`'m4_current_interface.hh" +%<--%<--%<-- ppl_prolog_`'m4_current_interface.hh +/* 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 +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..dcc3960 --- /dev/null +++ b/interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4 @@ -0,0 +1,88 @@ +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-2009 Roberto Bagnara +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://www.cs.unipr.it/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_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_set_timeout_exception_atom/1 *nofail, +ppl_timeout_exception_atom/1, +ppl_set_timeout/1 *nofail, +ppl_reset_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`'dnl +') + +m4_define(`m4_procedure_list', `m4_echo_unquoted(`m4_common_procedure_list', +ppl_@CLASS@_@BINMINOP@/2 +polyhedron, +ppl_@CLASS@_add_@CLASS_REPRESENT@_and_minimize/2 +polyhedron, +ppl_@CLASS@_add_@CLASS_REPRESENT@s_and_minimize/2 +polyhedron) +') 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..05b7b83 --- /dev/null +++ b/interfaces/Prolog/ppl_interface_generator_prolog_systems.m4 @@ -0,0 +1,78 @@ +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-2009 Roberto Bagnara +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://www.cs.unipr.it/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..782a368 --- /dev/null +++ b/interfaces/Prolog/ppl_prolog_common.cc @@ -0,0 +1,2112 @@ +/* Common part of the Prolog interfaces: variables and non-inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_prolog_common.defs.hh" +#include +#include +#include +#include +#include + +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 the relation between a polyhedron and a constraint. +Prolog_atom a_is_disjoint; +Prolog_atom a_strictly_intersects; +Prolog_atom a_is_included; +Prolog_atom a_saturates; + +// For the relation between a polyhedron and a generator. +Prolog_atom a_subsumes; + +// Denotes a closed interval boundary. +Prolog_atom a_c; + +// Denotes the empty set such as the empty interval or polyhedron. +Prolog_atom a_empty; + +// Denotes the universe polyhedron. +Prolog_atom a_universe; + +// Denotes the maximization mode for optimization problems. +Prolog_atom a_max; + +// Denotes the minimization mode for optimization problems. +Prolog_atom a_min; + +// Denote possible outcomes of MIP 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; + +// Default timeout exception atom. +Prolog_atom a_time_out; + +// "Out of memory" exception atom. +Prolog_atom a_out_of_memory; + +// Boolean constants. +Prolog_atom a_true; +Prolog_atom a_false; + +// To build exception terms. +Prolog_atom a_ppl_invalid_argument; +Prolog_atom a_ppl_overflow_error; +Prolog_atom a_ppl_domain_error; +Prolog_atom a_ppl_length_error; +Prolog_atom a_ppl_representation_error; +Prolog_atom a_expected; +Prolog_atom a_found; +Prolog_atom a_where; + +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_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_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_time_out, "time_out" }, + { &a_out_of_memory, "out_of_memory" }, + + { &a_true, "true" }, + { &a_false, "false" }, + + { &a_ppl_invalid_argument, "ppl_invalid_argument" }, + { &a_ppl_overflow_error, "ppl_overflow_error" }, + { &a_ppl_domain_error, "ppl_domain_error" }, + { &a_ppl_length_error, "ppl_length_error" }, + { &a_ppl_representation_error, "ppl_representation_error" }, + { &a_expected, "expected" }, + { &a_found, "found" }, + { &a_where, "where" }, + { 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_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_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::length_error& e) { + Prolog_term_ref et = Prolog_new_term_ref(); + Prolog_construct_compound(et, a_ppl_length_error, + Prolog_atom_term_from_string(e.what())); + Prolog_raise_exception(et); +} + +void +handle_exception(const std::bad_alloc&) { + Prolog_term_ref et = Prolog_new_term_ref(); + Prolog_put_atom(et, out_of_memory_exception_atom); + Prolog_raise_exception(et); +} + +void +handle_exception(const std::exception& e) { + Prolog_term_ref et = Prolog_new_term_ref(); + Prolog_put_atom_chars(et, e.what()); + Prolog_raise_exception(et); +} + +void +handle_exception() { + Prolog_term_ref et = Prolog_new_term_ref(); + Prolog_put_atom_chars(et, "PPL bug: unknown exception raised"); + Prolog_raise_exception(et); +} + +#ifdef PPL_WATCHDOG_LIBRARY_ENABLED + +Parma_Watchdog_Library::Watchdog* p_timeout_object = 0; + +void +reset_timeout() { + if (p_timeout_object) { + delete p_timeout_object; + p_timeout_object = 0; + abandon_expensive_computations = 0; + } +} +#endif + +Prolog_atom timeout_exception_atom; + +void +handle_exception(const timeout_exception&) { +#ifdef PPL_WATCHDOG_LIBRARY_ENABLED + assert(p_timeout_object); + reset_timeout(); +#endif + 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_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(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 +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; +} + +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(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_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)) + return name; + } + throw not_a_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)) + return name; + } + throw not_a_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(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_unbounded()) + 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_unbounded()) + 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(); +#ifdef PPL_WATCHDOG_LIBRARY_ENABLED + // Release the pending timeout object, if any. + reset_timeout(); +#endif + 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_set_timeout_exception_atom(Prolog_term_ref t_tea) { + try { + if (Prolog_is_atom(t_tea)) { + Prolog_atom tea; + if (Prolog_get_atom_name(t_tea, &tea)) { + timeout_exception_atom = tea; + return PROLOG_SUCCESS; + } + } + Prolog_term_ref found = Prolog_new_term_ref(); + Prolog_construct_compound(found, a_found, t_tea); + + Prolog_term_ref expected = Prolog_new_term_ref(); + Prolog_construct_compound(expected, a_expected, + Prolog_atom_term_from_string("atom")); + + Prolog_term_ref where = Prolog_new_term_ref(); + Prolog_construct_compound(where, a_where, + Prolog_atom_term_from_string + ("ppl_set_timeout_exception_atom")); + + Prolog_term_ref exception_term = Prolog_new_term_ref(); + Prolog_construct_compound(exception_term, a_ppl_invalid_argument, + found, expected, where); + Prolog_raise_exception(exception_term); + return PROLOG_FAILURE; + } + CATCH_ALL; +} + +extern "C" Prolog_foreign_return_type +ppl_timeout_exception_atom(Prolog_term_ref t) { + try { + Prolog_term_ref t_tea = Prolog_new_term_ref(); + Prolog_put_atom(t_tea, timeout_exception_atom); + return Prolog_unify(t_tea, t) ? PROLOG_SUCCESS : PROLOG_FAILURE; + } + CATCH_ALL; +} + +extern "C" Prolog_foreign_return_type +ppl_set_timeout(Prolog_term_ref t_time) { + try { +#ifdef PPL_WATCHDOG_LIBRARY_ENABLED + // In case a timeout was already set. + reset_timeout(); + static timeout_exception e; + unsigned hundredth_secs = term_to_unsigned(t_time, + "ppl_set_timeout/1"); + p_timeout_object = + new Parma_Watchdog_Library::Watchdog(hundredth_secs, + abandon_expensive_computations, + e); + return PROLOG_SUCCESS; +#else + used(t_time); + return PROLOG_FAILURE; +#endif + } + CATCH_ALL; +} + +extern "C" Prolog_foreign_return_type +ppl_reset_timeout() { + try { +#ifdef PPL_WATCHDOG_LIBRARY_ENABLED + reset_timeout(); + return PROLOG_SUCCESS; +#else + return PROLOG_FAILURE; +#endif + } + CATCH_ALL; +} + +extern "C" Prolog_foreign_return_type +ppl_Coefficient_is_bounded() { + try { + if (std::numeric_limits::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::is_bounded) { + PPL_DIRTY_TEMP_COEFFICIENT(min); + min = std::numeric_limits::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::is_bounded) { + PPL_DIRTY_TEMP_COEFFICIENT(max); + max = std::numeric_limits::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(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(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 + (term_to_handle(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(t_lhs, where); + MIP_Problem* rhs = term_to_handle(t_rhs, where); + PPL_CHECK(lhs); + PPL_CHECK(rhs); + lhs->swap(*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(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(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(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(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(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(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(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(t_mip, where); + PPL_CHECK(mip); + dimension_type d = term_to_unsigned(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(t_mip, where); + PPL_CHECK(mip); + mip->ascii_dump(std::cout); + 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..08b2d02 --- /dev/null +++ b/interfaces/Prolog/ppl_prolog_common.defs.hh @@ -0,0 +1,853 @@ +/* Common part of the Prolog interfaces: declarations. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_ppl_prolog_common_defs_hh +#define PPL_ppl_prolog_common_defs_hh 1 + +#define PPL_NO_AUTOMATIC_INITIALIZATION +#include "ppl.hh" +#ifdef PPL_WATCHDOG_LIBRARY_ENABLED +#include "pwl.hh" +#endif +#include "ppl_prolog_sysdep.hh" +#include "interfaced_boxes.hh" +#include +#include +#include +#include +#include + +#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 + void insert(const T* p); + + /*! \brief + Register an object whose deletion is under the PPL library + responsibility. + */ + template + void weak_insert(const T* p); + + //! Check whether the object was correctly registered. + template + void check(const T* p) const; + + /*! \brief + Unregister an object whose deletion is under the Prolog programmer + responsibility. + */ + template + 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 > 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_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_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_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; + +// 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 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_control_parameter_name& e); + +void +handle_exception(const not_a_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::length_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; + } + timeout_exception() { + } +}; + +void +handle_exception(const 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_control_parameter_name& e) { \ + handle_exception(e); \ + } \ + catch (const not_a_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 std::overflow_error& e) { \ + handle_exception(e); \ + } \ + catch(const std::length_error& e) { \ + handle_exception(e); \ + } \ + catch (const std::bad_alloc& e) { \ + handle_exception(e); \ + } \ + catch (const std::exception& e) { \ + handle_exception(e); \ + } \ + catch (...) { \ + handle_exception(); \ + } \ + return PROLOG_FAILURE + + +Prolog_term_ref +variable_term(dimension_type varid); + +template +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(l) > std::numeric_limits::max()) + throw Prolog_unsigned_out_of_range(t, where, + std::numeric_limits::max()); + else + d = l; + else { + PPL_DIRTY_TEMP_COEFFICIENT(v); + Prolog_get_Coefficient(t, v); + if (v < 0) + throw not_unsigned_integer(t, where); + if (assign_r(d, raw_value(v), ROUND_NOT_NEEDED) != V_EQ) + throw Prolog_unsigned_out_of_range(t, where, + std::numeric_limits::max()); + } + return d; +} + +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); + +template +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(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); + +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_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_time); + +extern "C" Prolog_foreign_return_type +ppl_reset_timeout(); + +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); + +using namespace Parma_Polyhedra_Library; +using namespace Parma_Polyhedra_Library::Interfaces::Prolog; + +class Partial_Function { +private: + std::set codomain; + std::vector vec; + +public: + Partial_Function() { + } + + bool has_empty_codomain() const { + return codomain.empty(); + } + + dimension_type max_in_codomain() const { + if (codomain.empty()) + throw unknown_interface_error("Partial_Function::max_in_codomain()"); + return *codomain.rbegin(); + } + + bool maps(dimension_type i, dimension_type& j) const { + if (i >= vec.size()) + return false; + dimension_type vec_i = vec[i]; + if (vec_i == not_a_dimension()) + return false; + j = vec_i; + return true; + } + + bool insert(dimension_type i, dimension_type j) { + std::pair::iterator, bool> s + = codomain.insert(j); + if (!s.second) + // *this is not injective! + return false; + if (i > vec.size()) + vec.insert(vec.end(), i - vec.size(), not_a_dimension()); + if (i == vec.size()) { + vec.insert(vec.end(), j); + return true; + } + dimension_type& vec_i = vec[i]; + if (vec_i != not_a_dimension()) + // Already mapped: *this is not a function! + return false; + vec_i = j; + return true; + } +}; + +#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..14e580d --- /dev/null +++ b/interfaces/Prolog/ppl_prolog_common.inlines.hh @@ -0,0 +1,87 @@ +/* Common part of the Prolog interfaces: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_ppl_prolog_common_inlines_hh +#define PPL_ppl_prolog_common_inlines_hh 1 + +#if PROLOG_TRACK_ALLOCATION || NOISY_PROLOG_TRACK_ALLOCATION + +#include +#include + +template +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 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 +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 +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 +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/ppl_prolog_sysdep_dox b/interfaces/Prolog/ppl_prolog_sysdep_dox new file mode 100644 index 0000000..4b6ff89 --- /dev/null +++ b/interfaces/Prolog/ppl_prolog_sysdep_dox @@ -0,0 +1,240 @@ + +\anchor 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 +prefix/lib/ppl. 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 man ld.so and man ldconfig +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 +-DPROLOG_TRACK_ALLOCATION to the options passed to the +C++ compiler. +Your configure command would then look like +\code + path/to/configure --with-cxxflags="-DPROLOG_TRACK_ALLOCATION" ... +\endcode + +\anchor PI_SD_Features +

System-Dependent Features

+ +\anchor CIAO_Prolog +

CIAO Prolog

+ +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 +--disable-regs option. + +

The ppl_ciao Executable

+ +If an appropriate version of Ciao Prolog is installed on the machine +on which you compiled the library, the command make install +will install the executable ppl_ciao in the directory +prefix/bin. +The ppl_ciao 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 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 Ciao Prolog Programs

+ +In order to allow linking Ciao Prolog programs to the PPL, +the following files are installed in the directory +prefix/lib/ppl: +ppl_ciao.pl contains the required foreign declarations; +libppl_ciao.* 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, source1.pl +and source2.pl and you want to create the executable +myprog, 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 +

GNU Prolog

+ +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 +20040608 +(which unpacks to a directory called gprolog-1.2.18). +The patch is contained in the +interfaces/Prolog/GNU/README 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 +--disable-regs option. + +

The ppl_gprolog Executable

+ +If an appropriate version of GNU Prolog is installed on the machine +on which you compiled the library, the command make install +will install the executable ppl_gprolog in the directory +prefix/bin. +The ppl_gprolog 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 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: +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 +\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 +GNU Prolog +Manual + +\anchor SICStus_Prolog +

SICStus Prolog

+ +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. + +

The Statically Linked ppl_sicstus Executable

+ +If an appropriate version of SICStus Prolog is installed on the machine +on which you compiled the library, the command make install +will install the executable ppl_sicstus in the directory +prefix/bin. +The ppl_sicstus 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 prefix/lib/ppl/ppl_sicstus.pl. + +

Loading the SICStus Interface Dynamically

+ +In order to dynamically load the library from SICStus Prolog you should +simply load prefix/lib/ppl/ppl_sicstus.pl. +Notice that, for dynamic linking to work, you should have configured +the library with the --enable-shared option. + + +\anchor SWI_Prolog +

SWI-Prolog

+ +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. + +

The ppl_pl Executable

+ +If an appropriate version of SWI-Prolog is installed on the machine +on which you compiled the library, the command make install +will install the executable ppl_pl in the directory +prefix/bin. +The ppl_pl executable is simply the SWI-Prolog +shell with the Parma Polyhedra Library statically linked: +from within ppl_pl all the services of the library +are available without further action. + +

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 +\code +:- load_foreign_library('prefix/lib/ppl/libppl_swiprolog'). +\endcode +This will call ppl_initialize/0 automatically. +Analogously, +\code +:- unload_foreign_library('prefix/lib/ppl/libppl_swiprolog'). +\endcode +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. + + +\anchor XSB_Prolog +

XSB

+ +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 ppl_xsb module and import the predicates +you need. +For things to work, you may have to copy the files +prefix/lib/ppl/ppl_xsb.xwam +and +prefix/lib/ppl/ppl_xsb.so +in your current directory or in one of the XSB library directories. + + +\anchor YAP_Prolog +

YAP

+ +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., +http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007780.html). + +In order to dynamically load the library from YAP you should +simply load prefix/lib/ppl/ppl_yap.pl. +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. + +*/ /* \mainpage */ + diff --git a/interfaces/Prolog/ppl_prolog_sysindep_dox b/interfaces/Prolog/ppl_prolog_sysindep_dox new file mode 100644 index 0000000..9fa5ccc --- /dev/null +++ b/interfaces/Prolog/ppl_prolog_sysindep_dox @@ -0,0 +1,608 @@ + +\anchor PI_SI_Features +

System-Independent Features

+ +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 +

Overview

+ +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 simple domains, powersets of a simple domain and + products of simple domains. + - The simple domains are: + - convex polyhedra, which consist of C_Polyhedron and + NNC_Polyhedron;
+ - 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;
+ - 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
+ - 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 domain + and any element of a PPL domain is called a PPL object. +- The Prolog interface to the PPL is initialized and finalized by the + predicates ppl_initialize/0 and ppl_finalize/0. + Thus the only interface predicates callable after + ppl_finalize/0 are ppl_finalize/0 itself + (this further call has no effect) and ppl_initialize/0, + 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 ppl_initialize/0 and/or + ppl_finalize/0 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 ppl_initialize/0 and ppl_finalize/0 + 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 handle. + 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 ppl_delete_Polyhedron/1. + 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 + ppl_delete_Polyhedron/1, + 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 +

Predicate Specifications

+ +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] + + 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 --> PPLVar - PPLVar map relation + + P_Func --> [] list of map relations + | [Vars_Pair | P_Func]. + + Optimization_Mode --> max | min + + MIP_Problem_Status --> unfeasible + | unbounded + | optimized + + Control_Parameter_Name --> pricing for MIP problems + + Control_Parameter_Value for MIP problems + --> pricing_steepest_edge_float + | pricing_steepest_edge_exact + | pricing_rextbook + + Vars_List --> [] list of PPL variables + | [PPL_Var | Vars_List]. +\endcode + +\anchor predicate_descriptions +

Predicate Descriptions

+ +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 +

Domain Independent Predicates

+ +First we describe the domain independent predicates +that are included with all instantiations of the Prolog interfaces. + +

ppl_version_major(?C_int)
+ Unifies C_int with the major number of the PPL version. + +

ppl_version_minor(?C_int)
+ Unifies C_int with the minor number of the PPL version. + +

ppl_version_revision(?C_int)
+ Unifies C_int with the revision number + of the PPL version. + +

ppl_version_beta(?C_int)
+ Unifies C_int with the beta number of the PPL version. + +

ppl_version(?Atom)
+ Unifies Atom with the PPL version. + +

ppl_banner(?Atom)
+ Unifies Atom 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. + +

ppl_Coefficient_is_bounded
+ + Succeeds if and only if the Coefficients in the C++ interface are bounded. + +

ppl_Coefficient_max(Max)
+ + If the Coefficients in the C++ interface are bounded, + then the maximum coefficient the C++ interface can handle is + unified with Max. + If the Prolog system cannot handle this coefficient, then + an exception is thrown. + It fails if the Coefficients in the C++ interface are unbounded. + +

ppl_Coefficient_min(Min)
+ + If the Coefficients in the C++ interface are bounded, + then the minimum coefficient the C++ interface can handle is + unified with Min. + If the Prolog system cannot handle this coefficient, then + an exception is thrown. + It fails if the Coefficients in the C++ interface are unbounded. + +

ppl_max_space_dimension(?Dimension_Type)
+ + Unifies Dimension_Type with the maximum space dimension + this library can handle. + +

+ ppl_initialize +
+ + Initializes the PPL interface. + Multiple calls to ppl_initialize does no harm. + +

+ ppl_finalize +
+ + Finalizes the PPL interface. + Once this is executed, the next call to an interface predicate must + either be to ppl_initialize or to ppl_finalize. + Multiple calls to ppl_finalize does no harm. + +

ppl_set_timeout_exception_atom(+Atom)
+ + Sets the atom to be thrown by timeout exceptions + to Atom. + The default value is time_out. + +

ppl_timeout_exception_atom(?Atom)
+ + The atom to be thrown by timeout exceptions + is unified with Atom. + +

ppl_set_timeout(+C_unsigned)
+ + Computations taking exponential time will be interrupted + some time after C_unsigned ms after that call. + If the computation is interrupted that way, the current timeout + exception atom will be thrown. + C_unsigned must be strictly greater than zero. + +

ppl_reset_timeout
+ + Resets the timeout time so that the computation is not interrupted. + +

ppl_set_rounding_for_PPL
+ + 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. + + +

ppl_restore_rounding_for_PPL
+ + 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. + +\anchor mip_predicates +

MIP Predicates

+Here we describe the predicates available for PPL objects +defining mixed integer (linear) programming problems. + +

+ ppl_new_MIP_Problem_from_space_dimension(+Dimension_Type, -Handle) +
+ + Creates an MIP Problem \f$\mathrm{MIP}\f$ with the feasible region + the vector space of dimension Dimension_Type, + objective function \f$0\f$ and optimization mode max. + Handle is unified with the handle for \f$\mathrm{MIP}\f$. + +

+ ppl_new_MIP_Problem(+Constraint_System, +Lin_Expr, +Optimization_Mode, + -Handle) +
+ + Creates an MIP Problem \f$\mathrm{MIP}\f$ with + the feasible region represented by Constraint_System, + objective function Lin_Expr and optimization mode + Optimization_Mode. + Handle is unified with the handle for \f$\mathrm{MIP}\f$. + +

+ ppl_new_MIP_Problem_from_MIP_Problem(+Handle_1, -Handle_2) +
+ + 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$. + +

+ ppl_MIP_Problem_swap(+Handle_1, +Handle_2) +
+ + Swaps the MIP Problem referenced by Handle_1 + with the one referenced by Handle_2. + +

+ ppl_delete_MIP_Problem(+Handle) +
+ + Deletes the MIP Problem referenced by Handle. + After execution, + Handle is no longer a valid handle for a PPL MIP Problem. + +

+ ppl_MIP_Problem_space_dimension(+Handle, ?Dimension_Type) +
+ + Unifies the dimension of the vector space in which the + MIP Problem referenced by Handle is embedded + with Dimension_Type. + +

+ ppl_MIP_Problem_integer_space_dimensions(+Handle, ?Vars_List) +
+ + Unifies Vars_List with a list of variables representing + the integer space dimensions of the MIP Problem + referenced by Handle. + +

+ ppl_MIP_Problem_constraints(+Handle, -Constraint_System) +
+ + Unifies Constraint_System with a list of + the constraints in the constraints system + representing the feasible region for the MIP Problem + referenced by Handle. + +

+ ppl_MIP_Problem_objective_function(+Handle, ?Lin_Expr) +
+ + Unifies Lin_Expr with the objective function + for the MIP Problem referenced by Handle. + +

+ ppl_MIP_Problem_optimization_mode(+Handle, ?Optimization_Mode) +
+ + Unifies Optimization_Mode with the optimization mode + for the MIP Problem referenced by Handle. + +

+ ppl_MIP_Problem_clear(+Handle) +
+ + Resets the MIP problem referenced by Handle + to be the trivial problem with + the feasible region the \f$0\f$-dimensional universe, + objective function \f$0\f$ and optimization mode max. + +

ppl_MIP_Problem_add_space_dimensions_and_embed( + +Handle, +Dimension_Type) +
+ + Embeds the MIP problem referenced by Handle + in a space that is enlarged by Dimension_Type dimensions. + +

+ ppl_MIP_Problem_add_to_integer_space_dimensions(+Handle, +Vars_List) +
+ + Updates the MIP Problem referenced by Handle + so that the variables in Vars_List are added to + the set of integer space dimensions. + +

+ ppl_MIP_Problem_add_constraint(+Handle, +Constraint) +
+ + Updates the MIP Problem referenced by Handle + so that the feasible region is represented by the original constraint + system together with the constraint Constraint. + +

+ ppl_MIP_Problem_add_constraints(+Handle, +Constraint_System) +
+ + Updates the MIP Problem referenced by Handle + so that the feasible region is represented by the original constraint + system together with all the constraints in + Constraint_System. + +

+ ppl_MIP_Problem_set_objective_function(+Handle, +Lin_Expr) +
+ + Updates the MIP Problem referenced by Handle + so that the objective function is changed to Lin_Expr. + +

+ ppl_MIP_Problem_set_control_parameter(+Handle, +Control_Parameter_Value) +
+ + Updates the MIP Problem referenced by Handle + so that the value for the relevant control parameter name is + changed to Control_Parameter_Value. + +

+ ppl_MIP_Problem_get_control_parameter(+Handle, +Control_Parameter_Name, + ?Control_Parameter_Value) +
+ + Unifies \c Control_Parameter_Value with the value of the + control parameter \c Control_Parameter_Name. + +

+ ppl_MIP_Problem_set_optimization_mode(+Handle, +Optimization_Mode) +
+ + Updates the MIP Problem referenced by Handle + so that the optimization mode is changed to + Optimization_Mode. + +

+ ppl_MIP_Problem_is_satisfiable(+Handle) +
+ + Succeeds if and only if the MIP Problem referenced by + Handle is satisfiable. + +

+ ppl_MIP_Problem_solve(+Handle, ?MIP_Problem_Status) +
+ + Solves the MIP problem referenced by + Handle and unifies MIP_Problem_Status + with: + unfeasible, if the MIP problem is not satisfiable; + unbounded, if the MIP problem is satisfiable but + there is no finite bound to the value of the objective function; + optimized, if the MIP problem admits an optimal solution. + +

+ ppl_MIP_Problem_feasible_point(+Handle, ?Generator) +
+ + Unifies Generator with a feasible point + for the MIP problem referenced by Handle. + +

+ ppl_MIP_Problem_optimizing_point(+Handle, ?Generator) +
+ + Unifies Generator with an optimizing point for + the MIP problem referenced by Handle. + +

+ ppl_MIP_Problem_optimal_value(+Handle, ?Coeff_1, ?Coeff_2) +
+ + Unifies Coeff_1 and Coeff_2 + with the numerator and denominator, respectively, for the optimal value + for the MIP problem referenced by Handle. + +

+ ppl_MIP_Problem_evaluate_objective_function(+Handle, +Generator, + ?Coeff_1, ?Coeff_2) +
+ Evaluates the objective function of the MIP problem referenced by + Handle at point Generator. + Coefficient_1 is unified with the numerator and + Coefficient_2 is unified with the denominator of the + objective function value at Generator. + +

+ ppl_MIP_Problem_OK(+Handle) +
+ + Succeeds only if the MIP Problem referenced by + Handle is well formed, i.e., if it + satisfies all its implementation invariants. + Useful for debugging purposes. + +
diff --git a/interfaces/Prolog/tests/Makefile.am b/interfaces/Prolog/tests/Makefile.am new file mode 100644 index 0000000..8f5eb50 --- /dev/null +++ b/interfaces/Prolog/tests/Makefile.am @@ -0,0 +1,86 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +CLPQ_TESTS_NONSTRICT = \ +ack.clpq \ +ackn.clpq \ +fib.clpq \ +mc91.clpq \ +smm.clpq \ +sumto.clpq \ +tak.clpq + +CLPQ_TESTS_STRICT = \ +schedule.clpq + +CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT) + +EXTRA_DIST = \ +clpq.pl script_clpq \ +clpq2.pl script_clpq2 script_clpq2_int8 \ +$(CLPQ_TESTS) \ +pl_check.pl \ +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 = \ +@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..f5d0669 --- /dev/null +++ b/interfaces/Prolog/tests/Makefile.in @@ -0,0 +1,509 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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.am $(srcdir)/Makefile.in +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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +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 = \ +@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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/tests/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign interfaces/Prolog/tests/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +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 + +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 check-local clean clean-generic \ + clean-libtool distclean distclean-generic distclean-libtool \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-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 \ + 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..5b6502a --- /dev/null +++ b/interfaces/Prolog/tests/clpq.pl @@ -0,0 +1,801 @@ +% A toy, non-ground meta-interpreter for CLP(Q) +% for testing the Parma Polyhedra Library and its Prolog interface. +% +% Copyright (C) 2001-2009 Roberto Bagnara +% +% This file is part of the Parma Polyhedra Library (PPL). +% +% The PPL is free software; you can redistribute it and/or modify it +% under the terms of the GNU General Public License as published by the +% Free Software Foundation; either version 3 of the License, or (at your +% option) any later version. +% +% The PPL is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +% for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program; if not, write to the Free Software Foundation, +% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +% +% For the most up-to-date information see the Parma Polyhedra Library +% site: http://www.cs.unipr.it/ppl/ . + +% Object-level clauses are stored as user_clause(Head, Body) facts. +:- dynamic(user_clause/2). + +% Used to store the names of variables occurring in the original goal +% as a list of the form [ Name1 = Variable1, ... ] +:- dynamic(original_goal_variables/1). + + +% solve(+Goals, +Variable_Names) +% +% Tries to solve the query `Goals' and to present the results +% to the user by referring to the original variable names +% contained in `Variable_Names'. + +solve(Goals, Variable_Names) :- + numvars(Goals, 0, Dims), + assertz(original_goal_variables(Variable_Names)), + % The initial polyhedron is initialised with + % `Dims' dimensions, the number of variables in `Goals'. + ppl_new_C_Polyhedron_from_space_dimension(Dims, universe, Polyhedron), + % Try to reduce `Goals' to the empty continuation. + (solve(Goals, true, Polyhedron) -> + Failed = no + ; + Failed = yes + ), + % On failure, cleanup must occur anyway. + % The one who creates the polyhedron must delete it. + ppl_delete_Polyhedron(Polyhedron), + % Further cleaning. + retract(original_goal_variables(_)), + Failed == no. + + +solve(true, true, Polyhedron) :- + !, + % It is time to print the result and see if the user + % wants to look for more solutions. + ppl_new_C_Polyhedron_from_C_Polyhedron(Polyhedron, Q), + original_goal_variables(Variable_Names), + length(Variable_Names, Dims), + ppl_Polyhedron_remove_higher_space_dimensions(Q, Dims), + ppl_Polyhedron_get_constraints(Q, CS), + write_constraints(CS, Variable_Names), + ppl_delete_Polyhedron(Q), + % More? + % If query_next_solution succeeds, + % then no more solutions are required. + query_next_solution. + +solve(true, (G, Goals), Polyhedron) :- + !, + solve(G, Goals, Polyhedron). + +solve((A, B), Goals, Polyhedron) :- + !, + solve(A, (B, Goals), Polyhedron). + +solve({}, Goals, Polyhedron) :- + !, + % The empty set of constraints is equivalent to true. + solve(true, Goals, Polyhedron). + +solve({ Constraints }, Goals, Polyhedron) :- + !, + % Solve the constraints using the constraint solver. + solve_constraints(Constraints, Polyhedron), + solve(true, Goals, Polyhedron). + +% Built-ins may be added here. + +solve(Atom, Goals, Polyhedron) :- + % Here is a choicepoint: possibly different clauses + % will be selected on backtracking. + % NOTE: we may fail to find (another) clause, + % but we have allocated nothing yet. + select_clause(Atom, Head, Body), + + % Copy the current polyhedron and work on the copy. + % NOTE: the copy is under our responsibility, i.e., + % it is our job to delete it, sooner or later. + ppl_new_C_Polyhedron_from_C_Polyhedron(Polyhedron, Poly_Copy), + + % Rename the selected clause apart and extend the polyhedron. + ppl_Polyhedron_space_dimension(Poly_Copy, Dims), + numvars((Head, Body), Dims, New_Dims), + Added_Dims is New_Dims - Dims, + ppl_Polyhedron_add_space_dimensions_and_embed(Poly_Copy, Added_Dims), + % Parameter passing. + parameter_passing(Atom, Head, PP_Constraints), + + % Try to solve the body augmented with the parameter passing equations. + (solve(PP_Constraints, (Body, Goals), Poly_Copy) -> + Failed = no + ; + Failed = yes + ), + % Our copy must be thrown anyway. + ppl_delete_Polyhedron(Poly_Copy), + Failed == no. + + +parameter_passing(Atom, Head, PP_Constraints) :- + Atom =.. [_|Actuals], + Head =.. [_|Formals], + (Actuals == [] -> + PP_Constraints = true + ; + build_pp_constraints(Actuals, Formals, Equations), + PP_Constraints = ({ Equations }) + ). + +build_pp_constraints([A|Actuals], [F|Formals], Equations) :- + (Actuals == [] -> + Equations = (A = F) + ; + Equations = ((A = F), More_Equations), + build_pp_constraints(Actuals, Formals, More_Equations) + ). + +select_clause(Atom, Head, Body) :- + functor(Atom, F, N), + functor(Head, F, N), + user_clause(Head, Body). + +% The constraints are solved by adding them into the polyhedron. +solve_constraints(Constraints, Polyhedron) :- + listize_constraints(Constraints, Constraints_List), + % Fails if `Polyhedron' becomes empty. + ppl_Polyhedron_add_constraints_and_minimize(Polyhedron, Constraints_List). + +listize_constraints(C, LC) :- + listize_constraints(C, [], LC). + +listize_constraints((A, B), Rest, LC) :- + !, + listize_constraints(B, Rest, BRest), + listize_constraints(A, BRest, LC). +listize_constraints(C, Rest, [C|Rest]). + + +%%%%%%%%%%%%%%%%%% Query the User for More Solutions %%%%%%%%%%%%%%%%%%% + +query_next_solution :- + write(' more? '), + repeat, + flush_output(user_output), + get_code(user_input, C), + ( + C == 59, + % Get rid of the EOL character. + get_code(user_input, _EOL) + ; + C == 10 + ; + write('Action (";" for more choices, otherwise ): '), + 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 to continue, or q 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-2009 Roberto Bagnara \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..e506503 --- /dev/null +++ b/interfaces/Prolog/tests/clpq2.pl @@ -0,0 +1,1121 @@ +% A toy, non-ground meta-interpreter for CLP(Q) +% for testing the Parma Polyhedra Library and its Prolog interface. +% +% Copyright (C) 2001-2009 Roberto Bagnara +% +% This file is part of the Parma Polyhedra Library (PPL). +% +% The PPL is free software; you can redistribute it and/or modify it +% under the terms of the GNU General Public License as published by the +% Free Software Foundation; either version 3 of the License, or (at your +% option) any later version. +% +% The PPL is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +% for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program; if not, write to the Free Software Foundation, +% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +% +% For the most up-to-date information see the Parma Polyhedra Library +% site: http://www.cs.unipr.it/ppl/ . + +% Object-level clauses are stored as user_clause(Head, Body) facts. +:- dynamic(user_clause/2). + +% solve_query(+Goals, +Variable_Name_Table, -Polyhedra) +% +% Tries to solve the query 'Goals'. +% 'Variable_Name_Table' is a list of input variable names and +% the corresponding variable. +% 'Polyhedra' are the live polyhedra; the head of the list +% represents the result of the computation. + +solve_query(Goals, VN, Polys_Out) :- + % The initial polyhedron is initialised with 0 dimensions + % We use the NNC topology so that we can handle strict constraints. + Topology = nnc, + ppl_new_NNC_Polyhedron_from_space_dimension(0, universe, Poly), + % On backtracking, clean up the unwanted polyhedron + cleanup(Poly), + + % Try to reduce `Goals'. + solve(Topology, Goals, [Poly], Polys_Out2), + + % Use the last polyhedron `Poly_Out' that has been added to the list + % for generating the resulting set of constraints. + Polys_Out2 = [Poly_Out|_], + ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(Poly_Out, Q), + % On backtracking, clean up the unwanted polyhedron + cleanup(Q), + + % Now find and sort all the PPL dimensions for variables + % that occur in bindings to external variables. + terms2wanted_dims(VN, [], Num_List), + sort(Num_List, Sorted_Num_List), + + % We want to remove (project away) all other dimensions. + ppl_Polyhedron_space_dimension(Q, Dims), + get_unwanted_dims(Sorted_Num_List, Dims, Unwanted_PPL_Vars), + ppl_Polyhedron_remove_space_dimensions(Q, Unwanted_PPL_Vars), + + % Get the constraints. + ppl_Polyhedron_get_constraints(Q, CS), + + % Print the result. + write_bindings(VN, Sorted_Num_List), + write_constraints(CS, Sorted_Num_List, VN), + Polys_Out = [Q|Polys_Out2]. + +solve(_, true, Polys, Polys) :- + % If the goal is true, we can return the input list of + % non-empty polyhedron as output. + % The head of the list will contain the solution to the query. + !. + +solve(T, (A, B), Polys_In, Polys_Out) :- + !, + % Conjunction is solved using the output list of non-empty + % polyhedra from the first component for input to the second. + solve(T, A, Polys_In, Polys_Tmp), + solve(T, B, Polys_Tmp, Polys_Out). + +solve(T, (A; B), Polys_In, Polys_Out) :- + !, + % Disjunction is dealt with by making a copy of the polyhedron + % before starting each branch. + Polys_In = [Poly|_], + ( + ( + ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(Poly, Q), + % On backtracking, clean up the unwanted polyhedron + cleanup(Q), + solve(T, A, [Q|Polys_In], Polys_Out) + ) + ; + ( + ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(Poly, Q), + % On backtracking, we clean up the unwanted polyhedron + cleanup(Q), + solve(T, B, [Q|Polys_In], Polys_Out) + ) + ). + +solve(_, {}, Polys, Polys) :- + % If the goal is an empty set of constraints, then this is + % the same as for `true' and we can return the input list of + % non-empty polyhedron as output. + !. + +solve(_, { Constraints }, [Poly|Polys], [Poly|Polys]) :- + !, + % Solve the constraints using the constraint solver. + % Rename the selected clause apart and extend the polyhedron. + ppl_Polyhedron_space_dimension(Poly, Dims), + + % Change any free variables into PPL variables. + term2PPLterm(Constraints, Dims, New_Dims), + Added_Dims is New_Dims - Dims, + ppl_Polyhedron_add_space_dimensions_and_embed(Poly, Added_Dims), + + % Make the sequence of constraints into a list + % and check we do have constraints. + constraints2list(Constraints, Constraints_List), + + % Fails if `Poly' becomes empty. + ppl_Polyhedron_add_constraints_and_minimize(Poly, Constraints_List). + +% Built-ins may be added here. + +% read/1 +solve(_, read(N), Polys, Polys) :- + !, + read(N), + get_code(user_input, _C). + +% write/1 +solve(_, write(Message), Polys, Polys) :- + !, + write(Message). + +% nl/0 +solve(_, nl, Polys, Polys) :- + !, + nl. + +solve(Topology, Atom, [Poly|Polys], Polys_Out) :- + % Here is a choicepoint: possibly different clauses + % will be selected on backtracking. + % NOTE: we may fail to find (another) clause, + % but we have allocated nothing yet. + select_clause(Atom, Head, Body), + ppl_Polyhedron_space_dimension(Poly, Dims), + + % Copy the current polyhedron and work on the copy. + ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(Poly, Poly_Copy), + % On backtracking, clean up the unwanted polyhedron + cleanup(Poly_Copy), + + % Parameter passing. + parameter_passing(Atom, Head, Binding_Constraints), + + % Change any free variables into PPL variables. + terms2PPLterms(Binding_Constraints, Dims, New_Dims), + Added_Dims is New_Dims - Dims, + ppl_Polyhedron_add_space_dimensions_and_embed(Poly_Copy, Added_Dims), + + % First solve the parameter passing equations. + ppl_Polyhedron_add_constraints_and_minimize(Poly_Copy, Binding_Constraints), + % Then solve the body. + solve(Topology, Body, [Poly_Copy, Poly|Polys], Polys_Soln_Out), + + % Now remove any dimensions that are higher than + % previously and higher than any PPL variables in the atom. + term2wanted_dims(Atom, [], Num_List), + Max_Wanted1 is Dims - 1, + max(Num_List, Max_Wanted1, Max_Wanted), + Un_Wanted is Max_Wanted + 1, + + % Copy the current polyhedron and work on the copy. + Polys_Soln_Out = [Poly_Soln|_], + ppl_new_C_Polyhedron_from_C_Polyhedron(Poly_Soln, Poly_Soln_Copy), + % On backtracking, clean up the unwanted polyhedron + cleanup(Poly_Soln_Copy), + + % We want to remove (project away) all other dimensions. + ppl_Polyhedron_remove_higher_space_dimensions(Poly_Soln_Copy, Un_Wanted), + + % The list of live polyhedra must be returned. + Polys_Out = [Poly_Soln_Copy|Polys_Soln_Out]. + +parameter_passing(Atom, Head, Bindings) :- + Atom =.. [_|Actuals], + Head =.. [_|Formals], + parameter_passing_terms(Actuals, Formals, Bindings). + +% When the direct binding exists, we use unification. +% Otherwise, we add the constraint. +% By only adding new variables when needed, the computation +% is much more efficient. +parameter_passing_terms([], [], []). +parameter_passing_terms([A|Actuals], [F|Formals], New_Bindings) :- + parameter_passing_terms(Actuals, Formals, Bindings), + (int_expr(F) -> + F1 is F + ; + F1 = F + ), + (A = F1 -> + New_Bindings = Bindings + ; + parameter_passing_term(A, F1, Bindings, New_Bindings) + ). + +parameter_passing_term(A, F, Bindings, New_Bindings) :- + ((int_expr(A) ; int_expr(F) ; A = '$VAR'(_) ; F = '$VAR'(_)) -> + New_Bindings = [(A = F)|Bindings] + ; + A =.. [AFunct|Aargs], + F =.. [FFunct|Fargs], + (AFunct == FFunct -> + % Functors agree so we process the arguments. + parameter_passing_terms(Aargs, Fargs, Bindings1), + append(Bindings1, Bindings, New_Bindings) + ; + % Unification fails so we force the constraints to fail. + New_Bindings = [0 = 1] + ) + ). + +select_clause(Atom, Head, Body) :- + functor(Atom, F, N), + functor(Head, F, N), + user_clause(Head, Body). + +delete_all_polyhedra([]). +delete_all_polyhedra([Polyhedron|Polyhedra]):- + ppl_delete_Polyhedron(Polyhedron), + delete_all_polyhedra(Polyhedra). + +% To prevent leaks: +% First succeed and then, on backtracking, +% remove the unwanted polyhedron before failing. +cleanup(_Polyhedron). +cleanup(Polyhedron) :- + ppl_delete_Polyhedron(Polyhedron), + fail. + +%%%%%%%%%%%%%%%%%% Query the User for More Solutions %%%%%%%%%%%%%%%%%%% + +query_next_solution :- + write(' more? '), + repeat, + flush_output(user_output), + get_code(user_input, C), + ( + C == 59, + % Get rid of the EOL character. + get_code(user_input, _EOL) + ; + C == 10 + ; + write('Action (";" for more choices, otherwise ): '), + eat_to_eol, + fail + ), + !, + C = 10. + +eat_to_eol :- + get_code(user_input, C), + (C == 10 -> + true + ; + eat_to_eol + ). + +%%%%%%%%%%%%%%%%%%%%%%%%%%% Reading Programs %%%%%%%%%%%%%%%%%%%%%%%%%%% + +open_file_for_reading(File, Stream) :- + catch(open(File, read, Stream), _, fail). + +read_programs([]). +read_programs([P|Ps]) :- + read_program(P), + read_programs(Ps). + +read_program(Program) :- + (atom(Program) -> + true + ; + write_error(['read_program/1 - arg 1: expected file name, found ', + Program]), + fail + ), + (open_file_for_reading(Program, Stream) -> + File_Name = Program + ; + atom_concat(Program, '.clpq', File_Name), + (open_file_for_reading(File_Name, Stream) -> + true + ; + write_error(['read_program/1 - arg 1: file ', + Program, ' does not exist']), + fail + ) + ), + (read_clauses(Stream) -> + close(Stream) + ; + write_error(['read_program/1 - arg 1: syntax error reading ', Program]), + close(Stream), + fail + ). + +read_clauses(Stream) :- + read(Stream, Clause), + (Clause \== end_of_file -> + (Clause = (Head :- Body) -> + assertz(user_clause(Head, Body)) + ; + assertz(user_clause(Clause, true)) + ), + read_clauses(Stream) + ; + true + ). + +%%%%%%%%%%%%%%%%%%%%% The Interaction Loop %%%%%%%%%%%%%%%%%%%%%% + +write_error(Message) :- + write('clpq error: '), + write_error_aux(Message). + +write_error_aux([]) :- + nl. +write_error_aux([H|T]) :- + write(H), + write_error_aux(T). + +main_loop :- + write('PPL clpq ?- '), + read_term(Command, [variable_names(VN)]), + eat_eol, + catch(do_command(Command, VN), + Exception, + (print_exception_term(Exception), main_loop_no)). + +print_exception_term(ppl_overflow_error(Cause)) :- + nl, + write('Error: an overflow has been detected by the PPL: '), + write(Cause), + nl, + !. + +print_exception_term(Exception) :- + nl, + writeq(Exception), + nl. + +clear_program :- + retract(user_clause(_, _)), + fail. +clear_program. + +list_program :- + user_clause(Head, Body), + pp(Head, Body), + fail. +list_program. + +pp(Head, Body) :- + % write(Head), + (Body == true -> + % write('.') + portray_clause(Head) + ; + % write(' :- '), + % write(Body) + portray_clause((Head :- Body)) + ), + nl. + +do_command(end_of_file, _VN) :- + !. +do_command(halt, _VN) :- + !, + clear_program. +do_command(warranty, _VN) :- + !, + show_warranty, + main_loop_yes. +do_command(copying, _VN) :- + !, + show_copying, + main_loop_yes. +do_command(trace, _VN) :- + !, + trace, + main_loop_yes. +do_command(notrace, _VN) :- + !, + notrace, + main_loop_yes. +do_command(debug, _VN) :- + !, + debug, + main_loop_yes. +do_command(nodebug, _VN) :- + !, + nodebug, + main_loop_yes. +do_command(spy(Spec), _VN) :- + !, + spy(Spec), + main_loop_yes. +do_command(nospy(Spec), _VN) :- + !, + nospy(Spec), + main_loop_yes. +do_command(nospyall, _VN) :- + !, + nospyall, + main_loop_yes. +do_command([], _VN) :- + !, + (read_programs([]) ; true), + main_loop_yes. +do_command([H|T], _VN) :- + !, + (read_programs([H|T]); true), + main_loop_yes. +do_command(consult(Program), _VN) :- + !, + (read_program(Program) ; true), + main_loop_yes. +do_command(reconsult(Program), VN) :- + !, + clear_program, + do_command(consult(Program), VN). +do_command(listing, _VN) :- + !, + list_program, + main_loop_yes. +do_command(statistics, _VN) :- + !, + statistics, + main_loop_yes. + +do_command(Query, VN) :- + solve_query(Query, VN, Polys_Out), + % See if the user wants to look for more solutions. + query_next_solution, + % When finished, remove remaining polyhedra. + delete_all_polyhedra(Polys_Out), + main_loop_yes. + +do_command(_, _VN) :- + main_loop_no. + +main_loop_no :- + write(no), + nl, + main_loop. + +main_loop_yes :- + write(yes), + nl, + main_loop. + +%%%%%%%%%%%%%%%%% Writing Computed Answer Constraints %%%%%%%%%%%%%%%%%% + +write_var('$VAR'(N), _Name_List) :- + write('_'), + write('$VAR'(N)). + +negate_expr(Num*Var, Neg_Expr) :- + (Num < 0 -> + Neg_Num is -Num, + Neg_Expr = Neg_Num*Var + ; + Neg_Expr = Num*Var + ). +negate_expr(Expr1 + Expr2, Neg_Expr1 + Neg_Expr2) :- + negate_expr(Expr1, Neg_Expr1), + negate_expr(Expr2, Neg_Expr2). + +write_expr('$VAR'(N), Var_List, VN) :- + !, + position2element(N, Var_List, M), + (member((A = '$VAR'(M)), VN) -> + write(A) + ; + write('_'), + write('$VAR'(N)) + ). +%write_expr('$VAR'(N), Variable_Names) :- +% write_var('$VAR'(N), Variable_Names). +write_expr(Num*Var, Variable_Names, VN) :- + (Num =:= 1 -> + true + ; + (Num =:= -1 -> + write('-') + ; + write(Num), + write('*') + ) + ), + write_expr(Var, Variable_Names, VN). +write_expr(E + Num*Var, Variable_Names, VN) :- + write_expr(E, Variable_Names, VN), + (Num < 0 -> + write(' - '), + Neg_Num is -Num, + write_expr(Neg_Num*Var, Variable_Names, VN) + ; + write(' + '), + write_expr(Num*Var, Variable_Names, VN) + ). + +write_constraint(Expr = Num, Variable_Names, VN) :- + (var(Num) -> + fail + ; + write_expr(Expr, Variable_Names, VN), + write(' = '), + (integer(Num) -> + write(Num) + ; + Num = rat(Int, 1), + write(Int) + ) + ). +write_constraint(Expr >= Num, Variable_Names, VN) :- + (Num < 0 -> + negate_expr(Expr, Neg_Expr), + write_expr(Neg_Expr, Variable_Names, VN), + write(' =< '), + Neg_Num is -Num, + write(Neg_Num) + ; + write_expr(Expr, Variable_Names, VN), + write(' >= '), + write(Num) + ). +write_constraint(Expr > Num, Variable_Names, VN) :- + (Num < 0 -> + negate_expr(Expr, Neg_Expr), + write_expr(Neg_Expr, Variable_Names, VN), + write(' < '), + Neg_Num is -Num, + write(Neg_Num) + ; + write_expr(Expr, Variable_Names, VN), + write(' > '), + write(Num) + ). + +write_constraints([], _Variable_Names, _VN). +write_constraints([C|CS], Variable_Names, VN) :- + (write_constraint(C, Variable_Names, VN) -> + nl + ; + true + ), + write_constraints(CS, Variable_Names, VN). + +write_bindings([], _Var_List). +write_bindings([(A = Term)|VN], Var_List) :- + (var(Term) -> + (write(A), write(' = '), write(Term), + nl) + ; + (Term = '$VAR'(_) -> + true + ; + (write(A), + write(' = '), + write_termexpr(Term, Var_List), + nl) + ) + ), + write_bindings(VN, Var_List). + +write_termexpr('$VAR'(N), Var_List) :- + !, + element2position(N, Var_List, M), + write('_'), + write('$VAR'(M)). +write_termexpr(Term, _Var_List) :- + int_expr(Term), + !, + % 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 %%%%%%%%%%%%%%%%%%%%%%%%%% + +% term2wanted_dims(?Term, -List_of_Integers) +% +% Takes a term and returns list of numbers in the PPL variables +% of the form '$VAR'(k). + +term2wanted_dims(V, Ns, Ns) :- + var(V), + !. +term2wanted_dims('$VAR'(N), Ns, [N|Ns]) :- + !. +term2wanted_dims(Term, Ns_In, Ns_Out) :- + Term =.. [_F|Args], + terms2wanted_dims(Args, Ns_In, Ns_Out). + +terms2wanted_dims([], Ns, Ns). +terms2wanted_dims([Arg|Args], Ns_In, Ns_Out) :- + term2wanted_dims(Arg, Ns_In, Ns1), + terms2wanted_dims(Args, Ns1, Ns_Out). + +constraints2list(C, LC) :- + constraints2list(C, [], LC). + +constraints2list((A, B), Rest, LC) :- + !, + constraints2list(B, Rest, BRest), + constraints2list(A, BRest, LC). +constraints2list(C, Rest, Rest1) :- + (check_constraint(C) -> + Rest1 = [C|Rest] + ; + Rest1 = [0 = 1] + ). + +% term2PPLterm(?Term, +In_N, ?Out_N) +% +% Unifies each of the variables in Term with the special terms +% '$VAR'(k), where k ranges from In_N to Out_N-1. +term2PPLterm('$VAR'(In_N), In_N, Out_N) :- + !, + Out_N is In_N + 1. +term2PPLterm(Term, In_N, Out_N) :- + Term =.. [_|Args], + terms2PPLterms(Args, In_N, Out_N). + +terms2PPLterms([], In_N, In_N). +terms2PPLterms([Arg|Args], In_N, Out_N) :- + term2PPLterm(Arg, In_N, Tmp_N), + terms2PPLterms(Args, Tmp_N, Out_N). + +build_equality_constraints([], []). +build_equality_constraints([Var = Num|Eqs], All_Eq_Constrs) :- + build_equality_constraints(Eqs, Eq_Constrs), + (nonvar(Num) -> + Num = rat(Int, 1), + All_Eq_Constrs = [Var = Int|Eq_Constrs] + ; + All_Eq_Constrs = Eq_Constrs + ). + +check_expr('$VAR'(_)). +check_expr(Num) :- + integer(Num). +check_expr(Num*Var) :- + integer(Num), + check_expr(Var). +check_expr(Var*Num) :- + integer(Num), + check_expr(Var). +check_expr(E + F) :- + check_expr(E), + check_expr(F). +check_expr(E - F) :- + check_expr(E), + check_expr(F). + +check_constraint(Expr = Expr1) :- + check_expr(Expr), + check_expr(Expr1). +check_constraint(Expr >= Expr1) :- + check_expr(Expr), + check_expr(Expr1). +check_constraint(Expr > Expr1) :- + check_expr(Expr), + check_expr(Expr1). +check_constraint(Expr =< Expr1) :- + check_expr(Expr), + check_expr(Expr1). +check_constraint(Expr < Expr1) :- + check_expr(Expr), + check_expr(Expr1). + +get_unwanted_dims(Wanted, D, Unwanted) :- + get_unwanted_dims(Wanted, 0, D, Unwanted). + +get_unwanted_dims(_, S, D, []) :- + S >= D, + !. +get_unwanted_dims(Wanted, S, D, Unwanted) :- + S1 is S + 1, + get_unwanted_dims(Wanted, S1, D, Unwanted1), + (member(S, Wanted) -> + Unwanted = Unwanted1 + ; + Unwanted = ['$VAR'(S)|Unwanted1] + ). + +element2position(N, Ns, I) :- + element2position(N, Ns, 0, I). +element2position(N, [N|_], I, I) :- + !. +element2position(N, [_M|Ns], Iin, Iout) :- + I1 is Iin + 1, + element2position(N, Ns, I1, Iout). + +position2element(0, [N|_], N) :- + !. +position2element(I, [_M|Ns], N) :- + I1 is I - 1, + position2element(I1, Ns, N). + +max([], M, M) :- !. +max([L|Ls], M, Max) :- + L =< M, + !, + max(Ls, M, Max). +max([L|Ls], M, Max) :- + L > M, + max(Ls, L, Max). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Legalese %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +next_or_quit :- + write('---Type to continue, or q 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-2009 Roberto Bagnara \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..9d03f75 --- /dev/null +++ b/interfaces/Prolog/tests/expected_clpq2_int16 @@ -0,0 +1,102 @@ +Copyright (C) 2001-2009 Roberto Bagnara +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 ?- diff --git a/interfaces/Prolog/tests/expected_clpq2_int16_a b/interfaces/Prolog/tests/expected_clpq2_int16_a new file mode 100644 index 0000000..914e1ce --- /dev/null +++ b/interfaces/Prolog/tests/expected_clpq2_int16_a @@ -0,0 +1,103 @@ +Copyright (C) 2001-2009 Roberto Bagnara +this program is free software, covered by the GNU General Public License, +and you are welcome to change it and/or distribute copies of it +under certain conditions. +Type "copying" to see the conditions. +There is ABSOLUTELY NO WARRANTY for this program. +Type "warranty" for details. +PPL clpq ?- yes +PPL clpq ?- Z = 13 + more? yes +PPL clpq ?- yes +PPL clpq ?- X = 0 +Z - Y = 1 + more? yes +PPL clpq ?- yes +PPL clpq ?- Y = 102 + more? yes +PPL clpq ?- yes +PPL clpq ?- Y = 8 + more? yes +PPL clpq ?- yes +PPL clpq ?- +Error: an overflow has been detected by the PPL: Negative overflow. +no +PPL clpq ?- yes +PPL clpq ?- +Error: an overflow has been detected by the PPL: Positive overflow. +no +PPL clpq ?- yes +PPL clpq ?- X =< 5 +X > 4 + more? X < 2 +X > 1 + more? no +PPL clpq ?- 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..ddba48e --- /dev/null +++ b/interfaces/Prolog/tests/expected_clpq2_int32 @@ -0,0 +1,109 @@ +Copyright (C) 2001-2009 Roberto Bagnara +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..c69a65c --- /dev/null +++ b/interfaces/Prolog/tests/expected_clpq2_int32_a @@ -0,0 +1,102 @@ +Copyright (C) 2001-2009 Roberto Bagnara +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..ddba48e --- /dev/null +++ b/interfaces/Prolog/tests/expected_clpq2_int64 @@ -0,0 +1,109 @@ +Copyright (C) 2001-2009 Roberto Bagnara +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..ddba48e --- /dev/null +++ b/interfaces/Prolog/tests/expected_clpq2_int64_a @@ -0,0 +1,109 @@ +Copyright (C) 2001-2009 Roberto Bagnara +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..61510f5 --- /dev/null +++ b/interfaces/Prolog/tests/expected_clpq2_int8 @@ -0,0 +1,101 @@ +Copyright (C) 2001-2009 Roberto Bagnara +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: Negative 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..221898e --- /dev/null +++ b/interfaces/Prolog/tests/expected_clpq2_int8_a @@ -0,0 +1,101 @@ +Copyright (C) 2001-2009 Roberto Bagnara +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..ddba48e --- /dev/null +++ b/interfaces/Prolog/tests/expected_clpq2_mpz @@ -0,0 +1,109 @@ +Copyright (C) 2001-2009 Roberto Bagnara +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..ddba48e --- /dev/null +++ b/interfaces/Prolog/tests/expected_clpq2_mpz_a @@ -0,0 +1,109 @@ +Copyright (C) 2001-2009 Roberto Bagnara +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..de9a352 --- /dev/null +++ b/interfaces/Prolog/tests/expected_clpq_int16 @@ -0,0 +1,35 @@ +Copyright (C) 2001-2009 Roberto Bagnara +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..de9a352 --- /dev/null +++ b/interfaces/Prolog/tests/expected_clpq_int16_a @@ -0,0 +1,35 @@ +Copyright (C) 2001-2009 Roberto Bagnara +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..2b31d15 --- /dev/null +++ b/interfaces/Prolog/tests/expected_clpq_int32 @@ -0,0 +1,35 @@ +Copyright (C) 2001-2009 Roberto Bagnara +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..2b31d15 --- /dev/null +++ b/interfaces/Prolog/tests/expected_clpq_int32_a @@ -0,0 +1,35 @@ +Copyright (C) 2001-2009 Roberto Bagnara +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..2b31d15 --- /dev/null +++ b/interfaces/Prolog/tests/expected_clpq_int64 @@ -0,0 +1,35 @@ +Copyright (C) 2001-2009 Roberto Bagnara +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..2b31d15 --- /dev/null +++ b/interfaces/Prolog/tests/expected_clpq_int64_a @@ -0,0 +1,35 @@ +Copyright (C) 2001-2009 Roberto Bagnara +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..2a42f89 --- /dev/null +++ b/interfaces/Prolog/tests/expected_clpq_int8 @@ -0,0 +1,29 @@ +Copyright (C) 2001-2009 Roberto Bagnara +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..2a42f89 --- /dev/null +++ b/interfaces/Prolog/tests/expected_clpq_int8_a @@ -0,0 +1,29 @@ +Copyright (C) 2001-2009 Roberto Bagnara +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..2b31d15 --- /dev/null +++ b/interfaces/Prolog/tests/expected_clpq_mpz @@ -0,0 +1,35 @@ +Copyright (C) 2001-2009 Roberto Bagnara +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..2b31d15 --- /dev/null +++ b/interfaces/Prolog/tests/expected_clpq_mpz_a @@ -0,0 +1,35 @@ +Copyright (C) 2001-2009 Roberto Bagnara +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..5161559 --- /dev/null +++ b/interfaces/Prolog/tests/expected_pchk_int8 @@ -0,0 +1,5 @@ + +Error: an overflow has been detected by the PPL: Negative overflow. + +Error: an overflow has been detected by the PPL: Negative overflow. +OK diff --git a/interfaces/Prolog/tests/expected_pchk_int8_a b/interfaces/Prolog/tests/expected_pchk_int8_a new file mode 100644 index 0000000..55cd051 --- /dev/null +++ b/interfaces/Prolog/tests/expected_pchk_int8_a @@ -0,0 +1,5 @@ + +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..6493cf8 --- /dev/null +++ b/interfaces/Prolog/tests/pl_check.pl @@ -0,0 +1,3452 @@ +/* Various tests on the Prolog interface. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + + +% noisy(F) +% When F = 1, a message is displayed if a time out occurs +% when running the `timeout'` predicate. +% Also, the values of the PPL versions and banner are displayed. +% When F = 0, no 'time out' message or versions are displayed. +% When F = 2, if a test fails and the backtracking returns to a polyhedron +% constructor, the caught error will cause the constraint and generator systems +% for the polyhedron to be displayed. +% noisy/1 can be reset by calling make_noisy/0 or make_quiet/0. + +:- dynamic(noisy/1). + +% check_all/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. + +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, + inters_assign_min, + polyhull_assign, + polyhull_assign_min, + polydiff_assign, + time_elapse, + top_close_assign. + +run_one(add_to_system) :- + add_con, + add_con_min, + add_gen, + add_gen_min, + add_cons, + add_cons_min, + add_gens, + add_gens_min. + +run_one(revise_dimensions) :- + project, + embed, + conc_assign, + remove_dim, + remove_high_dim, + expand_dim, + map_dim, + fold_dims. + +run_one(transform_polyhedron) :- + affine_image, + affine_preimage, + bounded_affine_image, + bounded_affine_preimage, + affine_image_gen, + affine_preimage_gen, + affine_image_genlr, + affine_preimage_genlr. + +run_one(extrapolation_operators) :- + widen_BHRZ03, + widen_BHRZ03_with_tokens, + lim_extrapolate_BHRZ03, + lim_extrapolate_BHRZ03_with_tokens, + bound_extrapolate_BHRZ03, + bound_extrapolate_BHRZ03_with_tokens, + widen_H79, + widen_H79_with_tokens, + lim_extrapolate_H79, + lim_extrapolate_H79_with_tokens, + bound_extrapolate_H79, + bound_extrapolate_H79_with_tokens. + +run_one(get_system) :- + get_cons, + get_min_cons, + get_gens, + get_min_gens. + +run_one(check_polyhedron) :- + rel_cons, + rel_gens, + checks, + bounds_from_above, + bounds_from_below. + +run_one(minmax_polyhedron) :- + maximize, + minimize, + maximize_with_point, + minimize_with_point. + +run_one(compare_polyhedra) :- + contains, + strict_contains, + disjoint_from, + equals, + ok. + +run_one(catch_time) :- + time_out. + +run_one(mip_problem) :- + mip_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. + +%%%%%%%%%%%%%%%%% 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_intersection_assign_and_minimize/2. +inters_assign_min :- + inters_assign_min(c), inters_assign_min(nnc). + +inters_assign_min(T) :- + make_vars(2, [A, B]), + clean_ppl_new_Polyhedron_from_generators(T, + [point(0), point(B), + point(A), point(A, 2)], + P1), + clean_ppl_new_Polyhedron_from_generators(T, + [point(0), point(A), point(A + B)], + P2), + ppl_Polyhedron_intersection_assign_and_minimize(P1, P2), + clean_ppl_new_Polyhedron_from_generators(T, + [point(A + B, 2), + point(A), point(0)], + P1a), + clean_ppl_new_Polyhedron_from_constraints(T, + [A - B >= 0, B >= 0, + A + B =< 1], + P1b), + ppl_Polyhedron_equals_Polyhedron(P1, P1a), + ppl_Polyhedron_equals_Polyhedron(P1, P1b), + clean_ppl_new_Polyhedron_from_constraints(T, [A =< -1, B =< -1], P3), + \+ppl_Polyhedron_intersection_assign_and_minimize(P1, P3), + !, + ppl_delete_Polyhedron(P1), + ppl_delete_Polyhedron(P2), + ppl_delete_Polyhedron(P3), + ppl_delete_Polyhedron(P1a), + ppl_delete_Polyhedron(P1b). + +% Tests ppl_Polyhedron_concatenate_assign/2. +conc_assign :- + conc_assign(c), conc_assign(nnc). + +conc_assign(T) :- + make_vars(5, [A, B, C, D, E]), + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P), + clean_ppl_new_Polyhedron_from_constraints(T, [A >= 1, B >= 0, C >= 0], Q), + ppl_Polyhedron_concatenate_assign(P, Q), + clean_ppl_new_Polyhedron_from_constraints(T, + [C >= 1, D >= 0, E >= 0], + P1), + ppl_Polyhedron_equals_Polyhedron(P, P1), + !, + ppl_delete_Polyhedron(P1), + ppl_delete_Polyhedron(P), + ppl_delete_Polyhedron(Q). + +% Tests ppl_Polyhedron_poly_hull_assign/2. +polyhull_assign :- + polyhull_assign(c), polyhull_assign(nnc). + +polyhull_assign(T) :- + make_vars(2, [A, B]), + clean_ppl_new_Polyhedron_from_generators(T, + [point(0), point(B), + point(A), point(A,2)], + P1), + clean_ppl_new_Polyhedron_from_generators(T, + [point(0), point(A), + point(A + B), point(A, 2)], + P2), + ppl_Polyhedron_poly_hull_assign(P1, P2), + clean_ppl_new_Polyhedron_from_generators(T, + [point(1*A+1*B), point(1*A, 2), point(1*A), point(1*B), point(0)], P1a), + clean_ppl_new_Polyhedron_from_constraints(T, + [1*A>=0, 1*B>=0, -1*B>= -1, -1*A>= -1], P1b), + ppl_Polyhedron_equals_Polyhedron(P1, P1a), + ppl_Polyhedron_equals_Polyhedron(P1, P1b), + !, + ppl_delete_Polyhedron(P1), + ppl_delete_Polyhedron(P2), + ppl_delete_Polyhedron(P1a), + ppl_delete_Polyhedron(P1b). + +% Tests ppl_Polyhedron_poly_hull_assign_and_minimize/2. +polyhull_assign_min :- + polyhull_assign_min(c), polyhull_assign_min(nnc). + +polyhull_assign_min(T) :- + make_vars(2, [A, B]), + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, P1), + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, P2), + \+ ppl_Polyhedron_poly_hull_assign_and_minimize(P1, P2), + ppl_Polyhedron_add_generators(P1, [point(0), point(B), + point(A), point(A, 2)]), + ppl_Polyhedron_add_generators(P2, [point(0), point(A), + point(A + B), point(A, 2)]), + ppl_Polyhedron_poly_hull_assign_and_minimize(P1, P2), + clean_ppl_new_Polyhedron_from_generators(T, + [point(1*A+1*B), point(1*A, 2), point(1*A), point(1*B), point(0)], P1a), + clean_ppl_new_Polyhedron_from_constraints(T, + [1*A>=0, 1*B>=0, -1*B>= -1, -1*A>= -1], P1b), + ppl_Polyhedron_equals_Polyhedron(P1, P1a), + ppl_Polyhedron_equals_Polyhedron(P1, P1b), + !, + ppl_delete_Polyhedron(P1), + ppl_delete_Polyhedron(P2), + ppl_delete_Polyhedron(P1a), + ppl_delete_Polyhedron(P1b). + +% Tests ppl_Polyhedron_poly_difference_assign/2. +polydiff_assign :- + make_vars(2, [A, B]), + GS0 = [point(2*A)], + GS1 = [point(0), point(2*A)], + GS2 = [point(0), point(A)], + GS3 = [point(A), point(2*A)], + GS4 = [closure_point(A), point(2*A)], + GS4a = [closure_point(A), point(3*A, 2), closure_point(2*A)], + polydiff_assign(c, GS1, GS2, GS3), + polydiff_assign(c, GS1, GS3, GS2), + polydiff_assign(c, GS3, GS0, GS3), + polydiff_assign(nnc, GS1, GS2, GS4), + polydiff_assign(nnc, GS1, GS4, GS2), + polydiff_assign(nnc, GS4, GS0, GS4a), + GS5 = [point(0), point(B), point(A)], + GS6 = [point(0), point(A), point(A + B)], + GS6a = [point(0), point(A), point(A + B, 2)], + GS7 = [point(A + B, 2), point(B), point(0)], + GS8 = [closure_point(A + B, 2), point(B), closure_point(0)], + polydiff_assign(c, GS5, GS6, GS7), + polydiff_assign(c, GS5, GS7, GS6a), + polydiff_assign(nnc, GS5, GS6, GS8), + polydiff_assign(nnc, GS5, GS8, GS6a), + GS_empty = [], + polydiff_assign(c, GS0, GS0, GS_empty), + polydiff_assign(nnc, GS4, GS4, GS_empty), + polydiff_assign(nnc, GS4, GS3, GS_empty). + +polydiff_assign(T, GS1, GS2, GS3) :- + clean_ppl_new_Polyhedron_from_generators(T, GS1, P1), + ppl_Polyhedron_space_dimension(P1, Dim), + clean_ppl_new_Polyhedron_from_space_dimension(T, Dim, empty, P2), + ppl_Polyhedron_add_generators(P2, GS2), + ppl_Polyhedron_poly_difference_assign(P1, P2), + clean_ppl_new_Polyhedron_from_space_dimension(T, Dim, empty, P3), + ppl_Polyhedron_add_generators(P3, GS3), + ppl_Polyhedron_equals_Polyhedron(P1, P3), + !, + ppl_delete_Polyhedron(P1), + ppl_delete_Polyhedron(P2), + ppl_delete_Polyhedron(P3). + +% Tests ppl_Polyhedron_time_elapse_assign/2. +time_elapse :- + time_elapse(c), time_elapse(nnc). + +% Tests ppl_Polyhedron_time_elapse for C Polyhedra. +time_elapse(T) :- + make_vars(2, [A, B]), + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P), + ppl_Polyhedron_add_constraints(P, + [A >= 1, A =< 3, B >= 1, B =< 3]), + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, Q), + ppl_Polyhedron_add_constraints(Q, [B = 5]), + ppl_Polyhedron_time_elapse_assign(P, Q), + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, Pa), + ppl_Polyhedron_add_constraints(Pa, [B >= 1]), + clean_ppl_new_Polyhedron_from_constraints(T, [B = 5], Qa), + ppl_Polyhedron_equals_Polyhedron(Q, Qa), + ppl_Polyhedron_equals_Polyhedron(P, Pa), + !, + ppl_delete_Polyhedron(P), + ppl_delete_Polyhedron(Q), + ppl_delete_Polyhedron(Pa), + ppl_delete_Polyhedron(Qa). + +% Tests ppl_Polyhedron_topological_closure_assign/1. +top_close_assign :- + make_vars(3, [A, B, C]), + GS_close = [point(A + B), point(0), ray(A), ray(B)], + GS_not_close = [point(A + B), closure_point(0), ray(A), ray(B)], + CS_close = [4*A + B + -2*C >= 5, A =< 3], + CS_not_close = [4*A + B - 2*C >= 5, A < 3], + top_close_assign(c, gensys, GS_close, GS_close), + top_close_assign(nnc, gensys, GS_not_close, GS_close), + top_close_assign(c, consys, CS_close, CS_close), + top_close_assign(nnc, consys, CS_not_close, CS_close). + +top_close_assign(T, gensys, GS, GS_close) :- + clean_ppl_new_Polyhedron_from_generators(T, GS, P), + ppl_Polyhedron_topological_closure_assign(P), + clean_ppl_new_Polyhedron_from_generators(T, GS_close, Pa), + ppl_Polyhedron_equals_Polyhedron(P, Pa), + !, + ppl_delete_Polyhedron(P), + ppl_delete_Polyhedron(Pa). + +top_close_assign(T, consys, CS, CS_close) :- + clean_ppl_new_Polyhedron_from_constraints(T, CS, P), + ppl_Polyhedron_topological_closure_assign(P), + clean_ppl_new_Polyhedron_from_constraints(T, CS_close, Pa), + ppl_Polyhedron_equals_Polyhedron(P, Pa), + !, + ppl_delete_Polyhedron(P), + ppl_delete_Polyhedron(Pa). + + +%%%%%%%%%%%%%%%%%% Add Constraints or Generators %%%%%%%%%%%%%%%%%%% + +% Tests ppl_Polyhedron_add_constraint/2. +add_con :- + add_con(c), add_con(nnc). + +add_con(T) :- + make_vars(2, [A, B]), + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P), + ppl_Polyhedron_add_constraint(P, A - B >= 1), + clean_ppl_new_Polyhedron_from_constraints(T, + [A - B >= 1], + Pa), + ppl_Polyhedron_equals_Polyhedron(P, Pa), + ppl_Polyhedron_add_constraint(P, A = 0), + clean_ppl_new_Polyhedron_from_constraints(T, + [A = 0, B =< -1], + Pb), + ppl_Polyhedron_equals_Polyhedron(P, Pb), + ppl_Polyhedron_add_constraint(P, A = 1), + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, Pc), + ppl_Polyhedron_equals_Polyhedron(P, Pc), + !, + ppl_delete_Polyhedron(P), + ppl_delete_Polyhedron(Pa), + ppl_delete_Polyhedron(Pb), + ppl_delete_Polyhedron(Pc). + +% Tests ppl_Polyhedron_add_constraint_and_minimize/2. +add_con_min :- + add_con_min(c), add_con_min(nnc). + +add_con_min(T) :- + make_vars(2, [A, B]), + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P), + ppl_Polyhedron_add_constraint_and_minimize(P, A - B >= 1), + clean_ppl_new_Polyhedron_from_constraints(T, + [A - B >= 1], + P1), + ppl_Polyhedron_equals_Polyhedron(P, P1), + \+ ppl_Polyhedron_add_constraint_and_minimize(P, A - B =< 0), + !, + ppl_delete_Polyhedron(P), + ppl_delete_Polyhedron(P1). + +% Tests ppl_Polyhedron_add_generator/2. +add_gen :- + add_gen(c), add_gen(nnc). + +add_gen(T) :- + make_vars(2, [A, B]), + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P), + ppl_Polyhedron_add_generator(P, point(A + B)), + clean_ppl_new_Polyhedron_from_generators(T, + [point(A + B), point(0), + line(A), line(B)], P1), + ppl_Polyhedron_equals_Polyhedron(P, P1), + !, + ppl_delete_Polyhedron(P), + ppl_delete_Polyhedron(P1). + +% Tests ppl_Polyhedron_add_generator_and_minimize/2. +add_gen_min :- + add_gen_min(c), add_gen_min(nnc). + +add_gen_min(T) :- + make_vars(2, [A, B]), + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, P), + ppl_Polyhedron_add_generator(P, point(A + B)), + ppl_Polyhedron_add_generator(P, point(0)), + ppl_Polyhedron_add_generator_and_minimize(P, point(2*A + 2*B, 1)), + ppl_Polyhedron_get_generators(P,[_G1,_G2]), + clean_ppl_new_Polyhedron_from_generators(T, + [point(2*A + 2*B), point(0)], + P1), + ppl_Polyhedron_equals_Polyhedron(P, P1), + !, + ppl_delete_Polyhedron(P), + ppl_delete_Polyhedron(P1). + +% Tests ppl_Polyhedron_add_constraints/2. +add_cons :- + make_vars(3, [A, B, C]), + add_cons(c, [A >= 1, B >= 0, 4*A + B - 2*C >= 5], [A =< 0]), + add_cons(nnc, [A > 1, B >= 0, 4*A + B - 2*C > 5], [A < 0]). + +add_cons(T, CS, CS1) :- + clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P), + ppl_Polyhedron_add_constraints(P, CS), + clean_ppl_new_Polyhedron_from_constraints(T, CS, P1), + ppl_Polyhedron_equals_Polyhedron(P, P1), + ppl_Polyhedron_add_constraints(P, CS1), + ppl_Polyhedron_is_empty(P), + !, + ppl_delete_Polyhedron(P), + ppl_delete_Polyhedron(P1). + +% Tests ppl_Polyhedron_add_constraints_and_minimize/2. +add_cons_min :- + make_vars(2, [A, B]), + add_cons_min(c, [A >= 1, B >= 0], [A + B =< 0]), + add_cons_min(nnc, [A > 1, B >= 0], [A < 0]). + +add_cons_min(T, CS, CS1) :- + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P), + ppl_Polyhedron_add_constraints_and_minimize(P, CS), + clean_ppl_new_Polyhedron_from_constraints(T, CS, P1), + ppl_Polyhedron_equals_Polyhedron(P, P1), + \+ppl_Polyhedron_add_constraints_and_minimize(P, CS1), + !, + ppl_delete_Polyhedron(P), + ppl_delete_Polyhedron(P1). + +% Tests ppl_Polyhedron_add_generators/2. +add_gens :- + make_vars(3, [A, B, C]), + add_gens(c, [point(A + B + C), ray(A), ray(2*A), point(A + B + C, 1), + point(100*A + 5*B, -8)]), + add_gens(nnc, [point(A + B + C), ray(A), ray(2*A), point(A + B + C, 1), + closure_point(100*A + 5*B, -8)]). + +add_gens(T, GS) :- + clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, P), + ppl_Polyhedron_add_generators(P, GS), + clean_ppl_new_Polyhedron_from_generators(T, GS, P1), + ppl_Polyhedron_equals_Polyhedron(P, P1), + !, + ppl_delete_Polyhedron(P), + ppl_delete_Polyhedron(P1). + +% Tests ppl_Polyhedron_add_generators_and_minimize/2. +add_gens_min :- + make_vars(3, [A, B, C]), + add_gens_min(c, [point(A + B + C), ray(A), ray(2*A), point(A + B + C)]), + add_gens_min(nnc, [point(A + B + C), ray(A), ray(2*A), + closure_point(A + B + C)]). + +add_gens_min(T, GS) :- + clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, P), + \+ ppl_Polyhedron_add_generators_and_minimize(P, []), + ppl_Polyhedron_add_generators_and_minimize(P, GS), + clean_ppl_new_Polyhedron_from_generators(T, GS, P1), + ppl_Polyhedron_equals_Polyhedron(P, P1), + !, + ppl_delete_Polyhedron(P), + ppl_delete_Polyhedron(P1). + +%%%%%%%%%%%%%%%%%% Change Dimensions %%%%%%%%%%%%%%%%%%%%%%%%%% + +% Tests ppl_Polyhedron_add_space_dimensions_and_project/2. +project :- + project(c), project(nnc). + +project(T) :- + make_vars(4, [A, B, C, D]), + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P), + ppl_Polyhedron_add_constraints(P, [A >= 1, B >= 0]), + ppl_Polyhedron_add_space_dimensions_and_project(P, 0), + clean_ppl_new_Polyhedron_from_constraints(T, + [A >= 1, B >= 0], + P0), + ppl_Polyhedron_equals_Polyhedron(P, P0), + ppl_delete_Polyhedron(P0), + ppl_Polyhedron_add_space_dimensions_and_project(P, 2), + clean_ppl_new_Polyhedron_from_constraints(T, + [A >= 1, B >= 0, C = 0, D = 0], + P1), + ppl_Polyhedron_equals_Polyhedron(P, P1), + !, + ppl_delete_Polyhedron(P1), + ppl_delete_Polyhedron(P). + +% Tests ppl_Polyhedron_add_space_dimensions_and_embed/2. +embed :- + embed(c), embed(nnc). + +embed(T) :- + make_vars(2, [A, B]), + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P), + ppl_Polyhedron_add_constraints(P, [A >= 1, B >= 0]), + ppl_Polyhedron_add_space_dimensions_and_embed(P, 0), + clean_ppl_new_Polyhedron_from_constraints(T, + [A >= 1, B >= 0], + P0), + ppl_Polyhedron_equals_Polyhedron(P, P0), + ppl_delete_Polyhedron(P0), + ppl_Polyhedron_add_space_dimensions_and_embed(P, 2), + clean_ppl_new_Polyhedron_from_space_dimension(T, 4, universe, P1), + ppl_Polyhedron_add_constraints(P1, [A >= 1, B >= 0]), + ppl_Polyhedron_equals_Polyhedron(P, P1), + !, + ppl_delete_Polyhedron(P1), + ppl_delete_Polyhedron(P). + +% Tests ppl_Polyhedron_remove_space_dimensions/2. +remove_dim :- + remove_dim(c), remove_dim(nnc). + +remove_dim(T) :- + make_vars(3, [A, B, C]), + clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P), + ppl_Polyhedron_add_constraints(P, [A >= 1, B >= 0, C >= 2]), + ppl_Polyhedron_remove_space_dimensions(P, []), + clean_ppl_new_Polyhedron_from_constraints(T, + [A >= 1, B >= 0, C >= 2], + P0), + ppl_Polyhedron_equals_Polyhedron(P, P0), + ppl_delete_Polyhedron(P0), + ppl_Polyhedron_remove_space_dimensions(P,[B]), + clean_ppl_new_Polyhedron_from_constraints(T, + [A >= 1, B >= 2], + P1), + ppl_Polyhedron_equals_Polyhedron(P, P1), + ppl_delete_Polyhedron(P1), + % Note: now 'B' refers to the old 'C' variable. + ppl_Polyhedron_remove_space_dimensions(P,[A, B]), + ppl_Polyhedron_space_dimension(P, 0), + !, + ppl_delete_Polyhedron(P). + +% Tests ppl_Polyhedron_remove_higher_space_dimensions/2. +remove_high_dim :- + remove_high_dim(c), remove_high_dim(nnc). + +remove_high_dim(T) :- + make_vars(3, [A, B, C]), + clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P), + ppl_Polyhedron_add_constraints(P, [A >= 1, B >= 0, C >= 0]), + clean_ppl_new_Polyhedron_from_constraints(T, + [A >= 1, B >= 0, C >= 0], + P1), + ppl_Polyhedron_equals_Polyhedron(P, P1), + ppl_Polyhedron_remove_higher_space_dimensions(P, 1), + clean_ppl_new_Polyhedron_from_constraints(T, + [A >= 1], + P2), + ppl_Polyhedron_equals_Polyhedron(P, P2), + ppl_Polyhedron_remove_higher_space_dimensions(P, 1), + ppl_Polyhedron_equals_Polyhedron(P, P2), + ppl_Polyhedron_remove_higher_space_dimensions(P, 0), + ppl_Polyhedron_space_dimension(P, 0), + !, + ppl_delete_Polyhedron(P1), + ppl_delete_Polyhedron(P2), + ppl_delete_Polyhedron(P). + +% Tests ppl_Polyhedron_expand_space_dimension/3. +expand_dim :- + expand_dim(c), expand_dim(nnc). + +expand_dim(T) :- + make_vars(4, [A, B, C, D]), + clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P), + ppl_Polyhedron_add_constraints(P, [A >= 1, B >= 0, C >= 2]), + ppl_Polyhedron_expand_space_dimension(P, B, 1), + ppl_Polyhedron_space_dimension(P, 4), + clean_ppl_new_Polyhedron_from_constraints(T, + [A >= 1, B >= 0, C >= 2, D >= 0], + P1), + ppl_Polyhedron_equals_Polyhedron(P, P1), + ppl_delete_Polyhedron(P1), + ppl_Polyhedron_remove_higher_space_dimensions(P, 2), + ppl_Polyhedron_expand_space_dimension(P, A, 2), + clean_ppl_new_Polyhedron_from_constraints(T, + [D >= 1, C >= 1, A >= 1, B >= 0], + P2), + ppl_Polyhedron_equals_Polyhedron(P, P2), + ppl_delete_Polyhedron(P2), + ppl_Polyhedron_space_dimension(P, 4), + !, + ppl_delete_Polyhedron(P), +% Example taken from [GopanDMDRS04], page 519. + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, Ptacas), + ppl_Polyhedron_add_generators(Ptacas, + [point(A + 2*B), point(A + 3*B), point(A + 4*B)]), + ppl_Polyhedron_expand_space_dimension(Ptacas, B, 1), + ppl_Polyhedron_space_dimension(Ptacas, 3), + clean_ppl_new_Polyhedron_from_generators(T, + [point(A + 2*B + 2*C), point(A + 2*B + 3*C), point(A + 2*B + 4*C), + point(A + 3*B + 2*C), point(A + 3*B + 3*C), point(A + 3*B + 4*C), + point(A + 4*B + 2*C), point(A + 4*B + 3*C), point(A + 4*B + 4*C)], + Ptacas1), + ppl_Polyhedron_equals_Polyhedron(Ptacas, Ptacas1), + !, + ppl_delete_Polyhedron(Ptacas1), + ppl_delete_Polyhedron(Ptacas). + +% Tests ppl_Polyhedron_fold_space_dimension/3. +fold_dims :- + fold_dims(c), fold_dims(nnc). + +fold_dims(T) :- + make_vars(4, [A, B, C, D]), + clean_ppl_new_Polyhedron_from_space_dimension(T, 4, universe, P), + ppl_Polyhedron_add_constraints(P, [A >= 1, B >= 0, C >= 2, D >= 0]), + ppl_Polyhedron_fold_space_dimensions(P, [D], B), + ppl_Polyhedron_space_dimension(P, 3), + clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P1), + ppl_Polyhedron_add_constraints(P1, [A >= 1, B >= 0, C >= 2]), + ppl_Polyhedron_equals_Polyhedron(P, P1), + !, + ppl_delete_Polyhedron(P1), + ppl_Polyhedron_fold_space_dimensions(P, [A, C], B), + clean_ppl_new_Polyhedron_from_space_dimension(T, 1, universe, P2), + ppl_Polyhedron_add_constraints(P2, [A >= 0]), + ppl_Polyhedron_equals_Polyhedron(P, P2), + ppl_delete_Polyhedron(P2), + ppl_Polyhedron_space_dimension(P, 1), + !, + ppl_delete_Polyhedron(P), + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, Ptacas), + ppl_Polyhedron_add_constraints(Ptacas, [A >= 1, A =< 3, B >= 7, B =< 12]), + ppl_Polyhedron_fold_space_dimensions(Ptacas, [A], B), + ppl_Polyhedron_space_dimension(Ptacas, 1), + clean_ppl_new_Polyhedron_from_space_dimension(T, 1, universe, Ptacas1), + ppl_Polyhedron_add_constraints(Ptacas1, [A >= 1, A =< 12]), + ppl_Polyhedron_equals_Polyhedron(Ptacas, Ptacas1), + !, + ppl_delete_Polyhedron(Ptacas1), + ppl_delete_Polyhedron(Ptacas). + +% Tests ppl_Polyhedron_map_space_dimensions/2. +map_dim:- + map_dim(c), map_dim(nnc). + +map_dim(T) :- + make_vars(7, [A, B, C, D, E, F, G]), + clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P), + ppl_Polyhedron_add_constraints(P, [A >= 2, B >= 1, C >= 0]), + ppl_Polyhedron_map_space_dimensions(P, [A-B, B-C, C-A]), + clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, Q), + ppl_Polyhedron_add_constraints(Q, [A >= 0, B >= 2, C >= 1]), + ppl_Polyhedron_equals_Polyhedron(P, Q), + !, + ppl_delete_Polyhedron(P), + ppl_delete_Polyhedron(Q), + clean_ppl_new_Polyhedron_from_space_dimension(T, 4, empty, P0), + ppl_Polyhedron_add_generators(P0, [point(2*C), line(A+B), ray(A+C)]), + \+ppl_Polyhedron_map_space_dimensions(P0, [A+C, C-A, B-B]), % A+C not map + \+ppl_Polyhedron_map_space_dimensions(P0, [A, C-A, B-B]), % A not map + \+ppl_Polyhedron_map_space_dimensions(P0, [D-A, C-A, B-B]), % D not dimension + \+ppl_Polyhedron_map_space_dimensions(P0, [B-A, C-A, B-B]), % not injective + \+ppl_Polyhedron_map_space_dimensions(P0, [B-A, C-A, B-C]), % not function + ppl_delete_Polyhedron(P0), + clean_ppl_new_Polyhedron_from_space_dimension(T, 4, empty, P1), + ppl_Polyhedron_add_generators(P1, [point(2*C), line(A+B), ray(A+C)]), + ppl_Polyhedron_map_space_dimensions(P1, [A-C, C-A, B-B]), + clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, Q1), + ppl_Polyhedron_add_generators(Q1, [point(2*A), ray(A+C), line(B+C)]), + ppl_Polyhedron_equals_Polyhedron(P1, Q1), + !, + ppl_delete_Polyhedron(P1), + ppl_delete_Polyhedron(Q1), + clean_ppl_new_Polyhedron_from_space_dimension(T, 5, universe, P2), + ppl_Polyhedron_add_constraints(P2, [B = 2, E = 8]), + ppl_Polyhedron_add_space_dimensions_and_embed(P2, 2), + ppl_Polyhedron_map_space_dimensions(P2, [A-A, B-B, C-E, D-F, E-G, F-C, G-D]), + clean_ppl_new_Polyhedron_from_space_dimension(T, 7, universe, Q2), + ppl_Polyhedron_add_constraints(Q2, [B = 2, G = 8]), + ppl_Polyhedron_equals_Polyhedron(P2, Q2), + !, + ppl_delete_Polyhedron(P2), + ppl_delete_Polyhedron(Q2). + + +%%%%%%%%%%%%%%%%%% Affine Transformations %%%%%%%%%%%%%%%%%%% + +% Tests ppl_Polyhedron_affine_image/4. +affine_image :- + affine_image(c), affine_image(nnc). + +affine_image(T) :- + make_vars(2, [A, B]), + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P), + ppl_Polyhedron_add_constraint(P, A - B = 1), + clean_ppl_new_Polyhedron_from_constraints(T, + [A - B = 1], + P1), + ppl_Polyhedron_equals_Polyhedron(P, P1), + ppl_Polyhedron_affine_image(P, A, A + 1, 1), + clean_ppl_new_Polyhedron_from_constraints(T, + [A - B = 2], + P2), + ppl_Polyhedron_equals_Polyhedron(P, P2), + !, + ppl_delete_Polyhedron(P1), + ppl_delete_Polyhedron(P2), + ppl_delete_Polyhedron(P). + +% Tests ppl_Polyhedron_affine_preimage/4. +affine_preimage :- + affine_preimage(c), affine_preimage(nnc). + +affine_preimage(T) :- + make_vars(2, [A, B]), + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P), + ppl_Polyhedron_add_constraint(P, A + B >= 10), + clean_ppl_new_Polyhedron_from_constraints(T, + [A + B >= 10], + P1), + ppl_Polyhedron_equals_Polyhedron(P, P1), + ppl_Polyhedron_affine_preimage(P, A, A + 1, 1), + clean_ppl_new_Polyhedron_from_constraints(T, + [A + B >= 9], + P2), + ppl_Polyhedron_equals_Polyhedron(P, P2), + !, + ppl_delete_Polyhedron(P1), + ppl_delete_Polyhedron(P2), + ppl_delete_Polyhedron(P). + +% Tests ppl_Polyhedron_bounded_affine_image/5 +bounded_affine_image :- + bounded_affine_image(c), bounded_affine_image(nnc). + +bounded_affine_image(T) :- + make_vars(2, [A, B]), + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P), + ppl_Polyhedron_add_constraint(P, A - B = 1), + ppl_Polyhedron_bounded_affine_image(P, B, A - 1, A + 1, 2), + clean_ppl_new_Polyhedron_from_constraints(T, + [A - 2*B =< 1, 2*B - A =< 1], + P1), + ppl_Polyhedron_equals_Polyhedron(P, P1), + !, + ppl_delete_Polyhedron(P1), + ppl_delete_Polyhedron(P). + +% Tests ppl_Polyhedron_bounded_affine_preimage/5 +bounded_affine_preimage :- + bounded_affine_preimage(c), bounded_affine_preimage(nnc). + +bounded_affine_preimage(T) :- + make_vars(3, [A, B, C]), + clean_ppl_new_Polyhedron_from_constraints(T, + [A >= 0, A =< 4, B >= 0, B =< 4, A - B =< 2, A - B >= -2], + P), + clean_ppl_new_Polyhedron_from_Polyhedron(T, P, T, P1), + ppl_Polyhedron_add_space_dimensions_and_embed(P1, 1), + ppl_Polyhedron_bounded_affine_preimage(P, B, 7 - A, A + 3, 1), + ppl_Polyhedron_add_constraint(P1, 7 - A =< B), + ppl_Polyhedron_add_constraint(P1, B =< A + 3), + ppl_Polyhedron_remove_space_dimensions(P1, [B]), + ppl_Polyhedron_equals_Polyhedron(P, P1), + !, + ppl_delete_Polyhedron(P1), + ppl_delete_Polyhedron(P), + clean_ppl_new_Polyhedron_from_constraints(T, + [A >= 0, A =< 4, B >= 0, B =< 4, A - B =< 2, A - B >= -2], + Q), + clean_ppl_new_Polyhedron_from_Polyhedron(T, Q, T, Q1), + ppl_Polyhedron_add_space_dimensions_and_embed(Q1, 1), + ppl_Polyhedron_bounded_affine_preimage(Q, B, 7 - 3*A + 2*B, B + 5*A - 3, 1), + ppl_Polyhedron_add_constraint(Q1, 7 - 3*A + 2*C =< B), + ppl_Polyhedron_add_constraint(Q1, B =< C + 5*A - 3), + ppl_Polyhedron_remove_space_dimensions(Q1, [B]), + ppl_Polyhedron_equals_Polyhedron(Q, Q1), + !, + ppl_delete_Polyhedron(Q1), + ppl_delete_Polyhedron(Q). + +% Tests ppl_Polyhedron_generalized_affine_image/5. +affine_image_gen :- + affine_image_gen(c), affine_image_gen(nnc). + +affine_image_gen(T) :- + make_vars(2, [A, B]), + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P), + ppl_Polyhedron_add_constraint(P, A - B = 1), + ppl_Polyhedron_generalized_affine_image(P, A, =<, A + 1, 1), + clean_ppl_new_Polyhedron_from_constraints(T, + [A - B =< 2], + P1), + ppl_Polyhedron_equals_Polyhedron(P, P1), + !, + ppl_delete_Polyhedron(P1), + ppl_delete_Polyhedron(P). + +% Tests ppl_Polyhedron_generalized_affine_preimage/5. +affine_preimage_gen :- + affine_preimage_gen(c), affine_preimage_gen(nnc). + +affine_preimage_gen(T) :- + make_vars(2, [A, B]), + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P), + ppl_Polyhedron_add_constraints(P, [A >= 0, A =< 4, B =< 5, A =< B]), + ppl_Polyhedron_generalized_affine_preimage(P, B, >=, A+2, 1), + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P1), + ppl_Polyhedron_add_constraints(P1, [A >= 0, A =< 3]), + ppl_Polyhedron_equals_Polyhedron(P, P1), + !, + ppl_delete_Polyhedron(P1), + ppl_delete_Polyhedron(P). + +% Tests ppl_Polyhedron_generalized_affine_image_lhs_rhs/4. +affine_image_genlr :- + make_vars(2, [A, B]), + affine_image_genlr(c, =<, [B - A =< 2], [A,B]), + affine_image_genlr(c, =, [B - A = 2], [A,B]), + affine_image_genlr(nnc, <, [B - A < 2], [A,B]), + affine_image_genlr(nnc, =<, [B - A =< 2], [A,B]). + +affine_image_genlr(T, R, CS, [A,B]) :- + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P), + ppl_Polyhedron_add_constraint(P, A - B = 1), + ppl_Polyhedron_generalized_affine_image_lhs_rhs(P, B - 1, R, A + 1), + clean_ppl_new_Polyhedron_from_constraints(T, CS, P1), + ppl_Polyhedron_equals_Polyhedron(P, P1), + !, + ppl_delete_Polyhedron(P1), + ppl_delete_Polyhedron(P). + +% % Tests ppl_Polyhedron_generalized_affine_preimage_lhs_rhs/4. +affine_preimage_genlr :- + make_vars(2, [A, B]), + affine_preimage_genlr(c, B - 1, =<, A + 1, + [A >= 0, A =< 4, B >= 0, B =< A], [A,B]), + affine_preimage_genlr(c, B + 1, =, A + 1, + [A >= 0, A =< 4, B >= 0, B =< A], [A,B]), + affine_preimage_genlr(nnc, B - 1, <, A + 1, + [A >= 0, A =< 4, B >= 0, B =< A], [A,B]), + affine_preimage_genlr(nnc, B - 1, =<, A + 1, + [A >= 0, A =< 4, B >= 0, B =< A], [A,B]). + +affine_preimage_genlr(T, LHS, R, RHS, CS, [A,_B]) :- + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P), + ppl_Polyhedron_add_constraints(P, CS), + ppl_Polyhedron_generalized_affine_preimage_lhs_rhs(P, LHS, R, RHS), + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P1), + ppl_Polyhedron_add_constraints(P1, [A >= 0, A =< 4]), + ppl_Polyhedron_equals_Polyhedron(P, P1), + !, + ppl_delete_Polyhedron(P1), + ppl_delete_Polyhedron(P). + +%%%%%%%%%%%%%%%%%% Widen and Extrapolation Operators %%%%%%%%%%%%%%%%%%% + +% Tests ppl_Polyhedron_BHRZ03_widening_assign/2. +widen_BHRZ03 :- + make_vars(2, [A, B]), + widen_BHRZ03(c, [A >= 1, B >= 0], [A >= 1, B >= 1], + [A >= 1], [A >= 1, B >= 1] + ), + widen_BHRZ03(nnc, [A > 1, B > 0], [A > 1, B > 1], + [A > 1], [A > 1, B > 1] + ). + +widen_BHRZ03(Topology, CS_P, CS_Q, CS_Pa, CS_Qa) :- + widen_extrapolation_init(P, CS_P, Topology), + widen_extrapolation_init(Q, CS_Q, Topology), + ppl_Polyhedron_BHRZ03_widening_assign(P, Q), + widen_extrapolation_final(P, CS_Pa, Topology), + widen_extrapolation_final(Q, CS_Qa, Topology). + +% Tests ppl_Polyhedron_BHRZ03_widening_assign_with_tokens/4. +widen_BHRZ03_with_tokens :- + make_vars(2, [A, B]), + widen_BHRZ03_with_tokens(c, [A >= 1], [A >= 1, B >= 1], + [A >= 1], [A >= 1, B >= 1], 1, 1 + ), + widen_BHRZ03_with_tokens(c, [A >= 1, B >= 0], [A >= 1, B >= 1], + [A >= 1], [A >= 1, B >= 1], 1, 0 + ), + widen_BHRZ03_with_tokens(nnc, [A > 1], [A > 1, B > 1], + [A > 1], [A > 1, B > 1], 2, 2 + ), + widen_BHRZ03_with_tokens(nnc, [A > 1, B >= 0], [A > 1, B >= 1], + [A > 1, B >= 0], [A > 1, B >= 1], 3, 1 + ). + +widen_BHRZ03_with_tokens(Topology, + CS_P, CS_Q, CS_Pa, CS_Qa, Token_i, Token_o) :- + widen_extrapolation_init(P, CS_P, Topology), + widen_extrapolation_init(Q, CS_Q, Topology), + \+ ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(P, Q, + Token_i, 4), + \+ ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(P, Q, + Token_i, not_a_number), + ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(P, Q, Token_i, X), + ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(P, Q, X, Y), + Y == Token_o, + widen_extrapolation_final(P, CS_Pa, Topology), + widen_extrapolation_final(Q, CS_Qa, Topology), !. + +% Tests ppl_Polyhedron_limited_BHRZ03_extrapolation_assign/3. +lim_extrapolate_BHRZ03 :- + make_vars(2, [A, B]), + lim_extrapolate_BHRZ03(c, [A >= 1, B >= 0], [A >= 2, B >= 1], + [A >= 1, B >= 0], [A >= 1, B >= 0] + ), + lim_extrapolate_BHRZ03(c, [A >= 1, B >= 0], [A >= 2, B >= 1], + [A >= 2], [] + ), + lim_extrapolate_BHRZ03(nnc, [A > 1, B > 0], [A > 2, B > 1], + [A > 1, B > 0], [A > 1, B > 0] + ), + lim_extrapolate_BHRZ03(nnc, [A > 1, B >= 0], [A > 2, B >= 1], + [A >= 2], [] + ). + +lim_extrapolate_BHRZ03(Topology, CS_P, CS_Q, CS_lim, CS_Pa) :- + widen_extrapolation_init(P, CS_P, Topology), + widen_extrapolation_init(Q, CS_Q, Topology), + ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(P, Q, CS_lim), + widen_extrapolation_final(P, CS_Pa, Topology), + !, + ppl_delete_Polyhedron(Q). + +% Tests ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens/5. +lim_extrapolate_BHRZ03_with_tokens :- + make_vars(2, [A, B]), + lim_extrapolate_BHRZ03_with_tokens(c, + [A >= 1, B >= 0], [A >= 1, B >= 1], + [A >= 1, B >= 0], [A >= 1, B >= 0], 1, 0 + ), + lim_extrapolate_BHRZ03_with_tokens(nnc, + [A > 1, B > 0], [A > 1, B > 1], + [A > 1, B > 0], [A > 1, B > 0], 1, 0 + ). + +lim_extrapolate_BHRZ03_with_tokens(Topology, + CS_P, CS_Q, CS_lim, CS_Pa, Token_i, Token_o) :- + widen_extrapolation_init(P, CS_P, Topology), + widen_extrapolation_init(Q, CS_Q, Topology), + Wrong_Token is Token_i + 1, + \+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(P, Q, + CS_lim, Token_i, Wrong_Token), + \+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(P, Q, + CS_lim, Token_i, not_a_number), + ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(P, Q, + CS_lim, Token_i, X), + ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(P, Q, + CS_lim, X, Y), + Y == Token_o, + widen_extrapolation_final(P, CS_Pa, Topology), + !, + ppl_delete_Polyhedron(Q). + + +% Tests ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign/3. +bound_extrapolate_BHRZ03 :- + make_vars(2, [A, B]), + bound_extrapolate_BHRZ03(c, [A >= 1, B >= 0], [A >= 2, B >= 1], + [A >= 1, B >= 0], [A >= 1, B >= 0] + ), + bound_extrapolate_BHRZ03(c, [A >= 1, B >= 0], [A >= 2, B >= 1], + [A >= 2], [A >= 1, B >= 0] + ), + bound_extrapolate_BHRZ03(nnc, [A > 1, B > 0], [A > 2, B > 1], + [A > 1, B > 0], [A > 1, B > 0] + ), + bound_extrapolate_BHRZ03(nnc, [A > 1, B >= 0], [A > 2, B >= 1], + [A >= 2], [A > 1, B >= 0] + ). + +bound_extrapolate_BHRZ03(Topology, CS_P, CS_Q, CS_lim, CS_Pa) :- + widen_extrapolation_init(P, CS_P, Topology), + widen_extrapolation_init(Q, CS_Q, Topology), + ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(P, Q, CS_lim), + widen_extrapolation_final(P, CS_Pa, Topology), + !, + ppl_delete_Polyhedron(Q). + +% Tests ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens/5. +bound_extrapolate_BHRZ03_with_tokens :- + make_vars(2, [A, B]), + bound_extrapolate_BHRZ03_with_tokens(c, + [A >= 1, B >= 0], [A >= 1, B >= 1], + [A >= 1, B >= 0], [A >= 1, B >= 0], 1, 0 + ), + bound_extrapolate_BHRZ03_with_tokens(nnc, + [A > 1, B > 0], [A > 1, B > 1], + [A > 1, B > 0], [A > 1, B > 0], 1, 0 + ). + +bound_extrapolate_BHRZ03_with_tokens(Topology, + CS_P, CS_Q, CS_lim, CS_Pa, Token_i, Token_o) :- + widen_extrapolation_init(P, CS_P, Topology), + widen_extrapolation_init(Q, CS_Q, Topology), + Wrong_Token is Token_i + 1, + \+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(P, Q, + CS_lim, Token_i, Wrong_Token), + \+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(P, Q, + CS_lim, Token_i, not-a_number), + ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(P, Q, + CS_lim, Token_i, X), + ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(P, Q, + CS_lim, X, Y), + Y == Token_o, + widen_extrapolation_final(P, CS_Pa, Topology), + !, + ppl_delete_Polyhedron(Q). + +% Tests ppl_Polyhedron_H79_widening_assign/2. +widen_H79 :- + make_vars(2, [A, B]), + widen_H79(c, [A >= 1, B >= 0], [A >= 1, B >= 1], + [A >= 1], [A >= 1, B >= 1] + ), + widen_H79(nnc, [A > 1, B > 0], [A > 1, B > 1], + [A > 1], [A > 1, B > 1] + ), + widen_H79(c, [A >= 0, A =< 1], [A = 0], + [A >= 0], [A = 0] + ), + widen_H79(nnc, [A >= 0, A =< 1], [A = 0], + [A >= 0], [A = 0] + ). + +widen_H79(Topology, CS_P, CS_Q, CS_Pa, CS_Qa) :- + widen_extrapolation_init(P, CS_P, Topology), + widen_extrapolation_init(Q, CS_Q, Topology), + ppl_Polyhedron_H79_widening_assign(P, Q), + widen_extrapolation_final(P, CS_Pa, Topology), + widen_extrapolation_final(Q, CS_Qa, Topology). + +% Tests ppl_Polyhedron_H79_widening_assign_with_tokens/4. +widen_H79_with_tokens :- + make_vars(2, [A, B]), + widen_H79_with_tokens(c, [A >= 1], [A >= 1, B >= 1], + [A >= 1], [A >= 1, B >= 1], 1, 1 + ), + widen_H79_with_tokens(c, [A >= 1, B >= 0], [A >= 1, B >= 1], + [A >= 1], [A >= 1, B >= 1], 1, 0 + ), + widen_H79_with_tokens(nnc, [A > 1], [A > 1, B > 1], + [A > 1], [A > 1, B > 1], 2, 2 + ), + widen_H79_with_tokens(nnc, [A > 1, B >= 0], [A > 1, B >= 1], + [A > 1, B >= 0], [A > 1, B >= 1], 3, 1 + ). + +widen_H79_with_tokens(Topology, + CS_P, CS_Q, CS_Pa, CS_Qa, Token_i, Token_o) :- + widen_extrapolation_init(P, CS_P, Topology), + widen_extrapolation_init(Q, CS_Q, Topology), + \+ ppl_Polyhedron_H79_widening_assign_with_tokens(P, Q, + Token_i, 4), + \+ ppl_Polyhedron_H79_widening_assign_with_tokens(P, Q, + Token_i, not_a_number), + ppl_Polyhedron_H79_widening_assign_with_tokens(P, Q, Token_i, X), + ppl_Polyhedron_H79_widening_assign_with_tokens(P, Q, X, Y), + Y == Token_o, + widen_extrapolation_final(P, CS_Pa, Topology), + widen_extrapolation_final(Q, CS_Qa, Topology), !. + +% Tests ppl_Polyhedron_limited_H79_extrapolation_assign/3. +lim_extrapolate_H79 :- + make_vars(2, [A, B]), + lim_extrapolate_H79(c, [A >= 1, B >= 0], [A >= 2, B >= 1], + [A >= 1, B >= 0], [A >= 1, B >= 0] + ), + lim_extrapolate_H79(c, [A >= 1, B >= 0], [A >= 2, B >= 1], + [A >= 2], [] + ), + lim_extrapolate_H79(nnc, [A > 1, B > 0], [A > 2, B > 1], + [A > 1, B > 0], [A > 1, B > 0] + ), + lim_extrapolate_H79(nnc, [A > 1, B >= 0], [A > 2, B >= 1], + [A >= 2], [] + ), + lim_extrapolate_H79(c, [A >= 0, A =< 1], [A = 0], + [A >= 0], [A >= 0] + ), + lim_extrapolate_H79(nnc, [A >= 0, A =< 1], [A = 0], + [A >= 0], [A >= 0] + ). + +lim_extrapolate_H79(Topology, CS_P, CS_Q, CS_lim, CS_Pa) :- + widen_extrapolation_init(P, CS_P, Topology), + widen_extrapolation_init(Q, CS_Q, Topology), + ppl_Polyhedron_limited_H79_extrapolation_assign(P, Q, CS_lim), + widen_extrapolation_final(P, CS_Pa, Topology), + !, + ppl_delete_Polyhedron(Q). + +% Tests ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens/5. +lim_extrapolate_H79_with_tokens :- + make_vars(2, [A, B]), + lim_extrapolate_H79_with_tokens(c, + [A >= 1, B >= 0], [A >= 1, B >= 1], + [A >= 1, B >= 0], [A >= 1, B >= 0], 1, 0 + ), + lim_extrapolate_H79_with_tokens(nnc, + [A > 1, B > 0], [A > 1, B > 1], + [A > 1, B > 0], [A > 1, B > 0], 1, 0 + ). + +lim_extrapolate_H79_with_tokens(Topology, + CS_P, CS_Q, CS_lim, CS_Pa, Token_i, Token_o) :- + widen_extrapolation_init(P, CS_P, Topology), + widen_extrapolation_init(Q, CS_Q, Topology), + Wrong_Token is Token_i + 1, + \+ ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(P, Q, + CS_lim, Token_i, Wrong_Token), + \+ ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(P, Q, + CS_lim, Token_i, not_a_number), + ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(P, Q, + CS_lim, Token_i, X), + ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(P, Q, + CS_lim, X, Y), + Y == Token_o, + widen_extrapolation_final(P, CS_Pa, Topology), + !, + ppl_delete_Polyhedron(Q). + + +% Tests ppl_Polyhedron_bounded_H79_extrapolation_assign/3. +bound_extrapolate_H79 :- + make_vars(2, [A, B]), + bound_extrapolate_H79(c, [A >= 1, B >= 0], [A >= 2, B >= 1], + [A >= 1, B >= 0], [A >= 1, B >= 0] + ), + bound_extrapolate_H79(c, [A >= 1, B >= 0], [A >= 2, B >= 1], + [A >= 2], [A >= 1, B >= 0] + ), + bound_extrapolate_H79(nnc, [A > 1, B > 0], [A > 2, B > 1], + [A > 1, B > 0], [A > 1, B > 0] + ), + bound_extrapolate_H79(nnc, [A > 1, B >= 0], [A > 2, B >= 1], + [A >= 2], [A > 1, B >= 0] + ). + +bound_extrapolate_H79(Topology, CS_P, CS_Q, CS_lim, CS_Pa) :- + widen_extrapolation_init(P, CS_P, Topology), + widen_extrapolation_init(Q, CS_Q, Topology), + ppl_Polyhedron_bounded_H79_extrapolation_assign(P, Q, CS_lim), + widen_extrapolation_final(P, CS_Pa, Topology), + !, + ppl_delete_Polyhedron(Q). + + +% Tests ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens/5. +bound_extrapolate_H79_with_tokens :- + make_vars(2, [A, B]), + bound_extrapolate_H79_with_tokens(c, + [A >= 1, B >= 0], [A >= 1, B >= 1], + [A >= 1, B >= 0], [A >= 1, B >= 0], 1, 0 + ), + bound_extrapolate_H79_with_tokens(nnc, + [A > 1, B > 0], [A > 1, B > 1], + [A > 1, B > 0], [A > 1, B > 0], 1, 0 + ). + +bound_extrapolate_H79_with_tokens(Topology, + CS_P, CS_Q, CS_lim, CS_Pa, Token_i, Token_o) :- + widen_extrapolation_init(P, CS_P, Topology), + widen_extrapolation_init(Q, CS_Q, Topology), + Wrong_Token is Token_i + 1, + \+ ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(P, Q, + CS_lim, Token_i, Wrong_Token), + \+ ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(P, Q, + CS_lim, Token_i, not_a_number), + ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(P, Q, + CS_lim, Token_i, X), + ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(P, Q, + CS_lim, X, Y), + Y == Token_o, + widen_extrapolation_final(P, CS_Pa, Topology), + !, + ppl_delete_Polyhedron(Q). + +% widen_extrapolation_init/3 and widen_extrapolation_final/3 +% are used in the tests for widening and extrapolation predicates. +widen_extrapolation_init(P, CS, Topology):- + clean_ppl_new_Polyhedron_from_space_dimension(Topology, 2, universe, P), + ppl_Polyhedron_add_constraints(P, CS). + +widen_extrapolation_final(P,CS, Topology):- + clean_ppl_new_Polyhedron_from_space_dimension(Topology, 2, universe, P1), + ppl_Polyhedron_add_constraints(P1, CS), + ppl_Polyhedron_equals_Polyhedron(P, P1), + !, + ppl_delete_Polyhedron(P), + ppl_delete_Polyhedron(P1). + +%%%%%%%%%%%%%%%%%% Get Constraint or Generator System %%%%%%%%%%%%%%%%%%% + +% Tests ppl_Polyhedron_get_constraints/2. +get_cons :- + get_cons(c), get_cons(nnc). + +get_cons(T) :- + make_vars(2, [A, B]), + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P), + ppl_Polyhedron_get_constraints(P, []), + ppl_Polyhedron_add_constraint(P, A - B >= 1), + \+ ppl_Polyhedron_get_constraints(P, []), + ppl_Polyhedron_get_constraints(P, [C]), + clean_ppl_new_Polyhedron_from_constraints(T, [C], Q), + ppl_Polyhedron_equals_Polyhedron(P, Q), + !, + ppl_delete_Polyhedron(P), + ppl_delete_Polyhedron(Q). + +% Tests ppl_Polyhedron_get_minimized_constraints/2. +get_min_cons :- + get_min_cons(c), get_min_cons(nnc). + +get_min_cons(T) :- + make_vars(2, [A, B]), + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P), + ppl_Polyhedron_get_minimized_constraints(P, []), + ppl_Polyhedron_add_constraints(P, [A - B >= 1, A - B >= 0]), + ppl_Polyhedron_get_minimized_constraints(P, [C]), + clean_ppl_new_Polyhedron_from_constraints(T, [C], Q), + ppl_Polyhedron_equals_Polyhedron(P, Q), + ppl_Polyhedron_add_constraints(P, [A - B =< 0]), + \+ppl_Polyhedron_get_minimized_constraints(P, [C]), + !, + ppl_delete_Polyhedron(P), + ppl_delete_Polyhedron(Q). + +% Tests ppl_Polyhedron_get_generators/2. +get_gens :- + get_gens(c), get_gens(nnc). + +get_gens(T) :- + make_vars(2, [A, B]), + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, P), + ppl_Polyhedron_get_generators(P, []), + \+ ppl_Polyhedron_get_generators(P, [_]), + ppl_Polyhedron_add_generator(P, point(A+B)), + ppl_Polyhedron_get_generators(P, [G]), + clean_ppl_new_Polyhedron_from_generators(T, [G], Q), + ppl_Polyhedron_equals_Polyhedron(P, Q), + ppl_Polyhedron_add_generator(P, point(A+B, 2)), + ppl_Polyhedron_get_generators(P, GS1), + ppl_Polyhedron_add_generators(Q, GS1), + ppl_Polyhedron_equals_Polyhedron(P, Q), + ppl_Polyhedron_add_generator(P, line(A)), + ppl_Polyhedron_get_generators(P, GS2), + ppl_Polyhedron_add_generators(Q, GS2), + ppl_Polyhedron_equals_Polyhedron(P, Q), + !, + ppl_delete_Polyhedron(P), + ppl_delete_Polyhedron(Q). + +% Tests ppl_Polyhedron_get_minimized_generators/2. +get_min_gens :- + get_min_gens(c), get_min_gens(nnc). + +get_min_gens(T) :- + make_vars(2, [A, B]), + clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, P), + ppl_Polyhedron_add_generators(P, [point(2*A), point(A+B), point(2*B)]), + \+ ppl_Polyhedron_get_minimized_generators(P, [_]), + ppl_Polyhedron_get_minimized_generators(P, [G1, G2]), + clean_ppl_new_Polyhedron_from_generators(T, [G1, G2], Q), + ppl_Polyhedron_equals_Polyhedron(P, Q), + !, + ppl_delete_Polyhedron(P), + ppl_delete_Polyhedron(Q). + + +%%%%%%%%%%%%%%%%%% Polyhedral Relations %%%%%%%%%%%%%%%%%%%%%%%%%% + +% Tests ppl_Polyhedron_relation_with_constraint/3. +rel_cons :- + make_vars(3, [A, B, C]), + rel_cons(c, [A >= 1, B >= 0, C = 0], [A, B, C]), + rel_cons(nnc, [A > 1, B >= 0, C = 0], [A, B, C]). + +rel_cons(T, CS, [A, B, C]) :- + clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P), + ppl_Polyhedron_add_constraints(P, CS), + \+ ppl_Polyhedron_relation_with_constraint(P, A = 0, x), + ppl_Polyhedron_relation_with_constraint(P, A = 0, R), + R = [is_disjoint], + ppl_Polyhedron_relation_with_constraint(P, B = 0, R1), + R1 = [strictly_intersects], + ppl_Polyhedron_relation_with_constraint(P, A >= 0, R2), + R2 = [is_included], + ppl_Polyhedron_relation_with_constraint(P, C >= 0, R3), + (R3 = [is_included, saturates] ; R3 = [saturates, is_included]), + ppl_Polyhedron_relation_with_constraint(P, A = B, R4), + R4 = [strictly_intersects], + ppl_Polyhedron_add_constraint(P, A = B), + ppl_Polyhedron_relation_with_constraint(P, A = B, R5), + (R5 = [is_included, saturates] ; R5 = [saturates, is_included]), + !, + ppl_delete_Polyhedron(P). + +% Tests ppl_Polyhedron_relation_with_generator/3. +rel_gens :- + make_vars(3, [A, B, C]), + rel_gens(c, [point(A + B + C), ray(A)], [A, B, C]), + rel_gens(nnc, [point(A + B + C), ray(A)], [A, B, C]). + +rel_gens(T, GS, [A, _, _]) :- + clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, P), + ppl_Polyhedron_add_generators(P, GS), + \+ppl_Polyhedron_relation_with_generator(P, point(A), x), + ppl_Polyhedron_relation_with_generator(P, point(A), R), + R = [], + ppl_Polyhedron_relation_with_generator(P, ray(A), R1), + R1 = [subsumes], + !, + ppl_delete_Polyhedron(P). + +%%%%%%%%%%%%%%%%%% Check Properties %%%%%%%%%%%%%%%%%%%%%%%%%% + +% tests ppl_Polyhedron_is_universe/1, +% ppl_Polyhedron_is_empty/1, +% ppl_Polyhedron_is_bounded/1, +% ppl_Polyhedron_is_topologically_closed/1, +% 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). + +%%%%%%%%%%%%%%%%%%%%%%%%% 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). + +% Avoid use of add_and_minimize predicate as that is deprecated. +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(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(add_constraints_and_get_minimized_constraints(P, CS), + Time_Out_Atom, Catch_Exception = ok), + (Catch_Exception == ok -> + Dim_out = Dim_in, + CS_out = CS + ; + Dim1 is Dim_in+1, + ppl_delete_Polyhedron(P), + compute_timeout_hypercube(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), + ppl_set_timeout(10), + compute_timeout_hypercube(T, 1, Dim, CS), + !, + N1 is 1, + ppl_reset_timeout, + ppl_set_timeout_exception_atom(pl_time_out), + ppl_set_timeout(N1), + ppl_timeout_exception_atom(Time_Out_Atom), + clean_ppl_new_Polyhedron_from_space_dimension(T, Dim, universe, P), + catch(add_constraints_and_get_minimized_constraints(P, CS), + Time_Out_Atom, Catch_Exception = ok), + (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, + ppl_reset_timeout, + ppl_set_timeout_exception_atom(pl_time_out), + ppl_set_timeout(N2), + ppl_timeout_exception_atom(Time_Out_Atom1), + clean_ppl_new_Polyhedron_from_space_dimension(T, Dim, universe, Q), + catch(ppl_Polyhedron_is_universe(Q), + Time_Out_Atom1, Catch_Exception = not_ok), + (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). + +% 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(13, V). + +exception_prolog1(0, _) :- !. +exception_prolog1(N, V) :- + exception_prolog(N, V), + N1 is N - 1, + exception_prolog1(N1, V). + +%% TEST: Prolog_unsigned_out_of_range. +%% This test accepts any one of three exceptions: +%% ppl_invalid_argument: with a 32 bit system, the number 1 << 34 is expected +%% to throw this Prolog exception; +%% out_of_memory: with a 64 bit system, the number 1 << 34 does not +%% throw an exception on the Prolog side, but, with +%% unbounded integers, the large number of dimensions +%% will throw a bad_alloc exception in C++; +%% ppl_overflow_error: with bounded integers, when the number is too large, +%% an overflow exception may be thrown. +%% +exception_prolog(1, _) :- + pl_check_prolog_flag(bounded, Y), + (Y == true -> + true + ; + (I is 1 << 34, + 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). + +% 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_and_minimize(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 = 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), name(Message, [80,80,76,58,58|_] ) ) -> + 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. + +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(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). + +%%%%%%%%%%%% predicates for switching on/off output messages % + +make_extra_noisy :- + (retract(noisy(_)) -> + make_extra_noisy + ; + assertz(noisy(2)) + ). + +make_noisy :- + (retract(noisy(_)) -> + make_noisy + ; + assertz(noisy(1)) + ). + +make_quiet :- + (retract(noisy(_)) -> + make_quiet + ; assertz(noisy(0)) + ). + +%%%%%%%%%%%% predicates for pretty printing the PPL banner %%%%%%%%%% +% +% The banner is read as an atom with"/n" denoting where there should +% new lines. Here we print the banner as intended with new lines instead +% of "/n". +% + +banner_pp(B) :- + name(B,Bcodes), + nl, + !, + format_banner(Bcodes). + +format_banner([]) :- nl. +format_banner([C]) :- put_code(C), nl. +format_banner([C,C1|Chars]):- + ([C,C1] == "/n" -> + (nl, + format_banner(Chars)) + ; + (put_code(C), + format_banner([C1|Chars])) + ). + +%%%%%%%%%%%% predicate for handling an unintended exception %%%% + +check_exception_term(ppl_overflow_error(Cause)) :- + ((Cause == 'Negative overflow.'; Cause == 'Positive overflow.') -> + true + ; + print_exception_term(ppl_overflow_error(Cause)) + ), + !. + +print_exception_term(ppl_overflow_error(Cause)) :- + nl, + write('Error: an overflow has been detected by the PPL: '), + write(Cause), + nl, + !. + +print_exception_term(Exception) :- + write('exception'), nl, + nl, + writeq(Exception), + nl. + +%%%%%%%%%%%% predicate for printing exception messages %%%%%%%%%% + +format_exception_message( + ppl_invalid_argument( found(F), expected(E), where(W)) + ) :- + !, + display_message(['PPL Prolog Interface Exception:', nl, ' ', + F, 'is an invalid argument for', W, nl, ' ', + F, 'should be', E, '.']). + +format_exception_message( + ppl_representation_error(I, where(W)) + ) :- + !, + display_message(['PPL Prolog Interface Exception:', nl, ' ', + 'This Prolog system has bounded integers', nl, ' ', + I, 'is not in the allowed range of integers', nl, ' ', + 'in call to', W, '.']). + +format_exception_message(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, + 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_intersection_assign_and_minimize/2, + ppl_Polyhedron_poly_hull_assign/2, + ppl_Polyhedron_poly_hull_assign_and_minimize/2, + ppl_Polyhedron_poly_difference_assign/2, + ppl_Polyhedron_time_elapse_assign/2, + ppl_Polyhedron_topological_closure_assign/1 + ]). + +group_predicates(add_to_system, + [ppl_Polyhedron_add_constraint/2, + ppl_Polyhedron_add_constraint_and_minimize/2, + ppl_Polyhedron_add_generator/2, + ppl_Polyhedron_add_generator_and_minimize/2, + ppl_Polyhedron_add_constraints/2, + ppl_Polyhedron_add_constraints_and_minimize/2, + ppl_Polyhedron_add_generators/2, + ppl_Polyhedron_add_generators_and_minimize/2 + ]). + +group_predicates(revise_dimensions, + [ppl_Polyhedron_remove_space_dimensions/2, + ppl_Polyhedron_remove_higher_space_dimensions/2, + ppl_Polyhedron_expand_space_dimension/3, + ppl_Polyhedron_fold_space_dimensions/3, + ppl_Polyhedron_map_space_dimensions/2, + ppl_Polyhedron_concatenate_assign/2 + ]). + +group_predicates(transform_polyhedron, + [ppl_Polyhedron_affine_image/4, + ppl_Polyhedron_affine_preimage/4, + ppl_Polyhedron_bounded_affine_image/5, + ppl_Polyhedron_bounded_affine_preimage/5, + ppl_Polyhedron_generalized_affine_image/5, + ppl_Polyhedron_generalized_affine_preimage/5, + ppl_Polyhedron_generalized_affine_image_lhs_rhs/4, + ppl_Polyhedron_generalized_affine_preimage_lhs_rhs/4 + ]). + +group_predicates(extrapolation_operators, + [ppl_Polyhedron_BHRZ03_widening_assign_with_token/3, + ppl_Polyhedron_BHRZ03_widening_assign/2, + ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_token/4, + ppl_Polyhedron_limited_BHRZ03_extrapolation_assign/3, + ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_token/4, + ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign/3, + ppl_Polyhedron_H79_widening_assign_with_token/3, + ppl_Polyhedron_H79_widening_assign/2, + ppl_Polyhedron_limited_H79_extrapolation_assign_with_token/4, + ppl_Polyhedron_limited_H79_extrapolation_assign/3, + ppl_Polyhedron_bounded_H79_extrapolation_assign_with_token/4, + ppl_Polyhedron_bounded_H79_extrapolation_assign/3 + ]). + +group_predicates(get_system, + [ppl_Polyhedron_get_constraints/2, + ppl_Polyhedron_get_minimized_constraints/2, + ppl_Polyhedron_get_generators/2, + ppl_Polyhedron_get_minimized_generators/2 + ]). + +group_predicates(check_polyhedron, + [ppl_Polyhedron_relation_with_constraint/3, + ppl_Polyhedron_relation_with_generator/3, + ppl_Polyhedron_is_topologically_closed/1, + ppl_Polyhedron_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_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(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..e288870 --- /dev/null +++ b/interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl.m4 @@ -0,0 +1,364 @@ +m4_define(`dnl', `m4_dnl')`'dnl +m4_divert(-1) + +dnl This m4 file generates the test files +dnl ppl_prolog_generated_test_.pl using the code in +dnl ppl_interface_generator_prolog_generated_test_pl_code.m4. + +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/ppl/ . + +m4_divert`'dnl +%<--%<--%<-- ppl_prolog_generated_test_main.pl +/* 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 +%<--%<--%<-- ppl_prolog_generated_test_main.pl + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% 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_. +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 + +%<--%<--%<-- ppl_prolog_generated_test_`'m4_current_interface.pl +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% 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) +%<--%<--%<-- ppl_prolog_generated_test_`'m4_current_interface.pl +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 + +%<--%<--%<-- ppl_prolog_generated_test_`'m4_current_interface.pl +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) +%<--%<--%<-- ppl_prolog_generated_test_`'m4_current_interface.pl +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 + +%<--%<--%<-- ppl_prolog_generated_test_`'m4_current_interface.pl +') +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 +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..8032efe --- /dev/null +++ b/interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4 @@ -0,0 +1,1794 @@ +m4_divert(-1) + +dnl This m4 file contains the code for generating the test files +dnl ppl_prolog_generated_test_.pl, which test +dnl the generated Prolog interface predicates +dnl and the main file ppl_prolog_generated_test_main.pl. + +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/ppl/ . + +m4_define(`m4_add_build_class_code', `dnl +ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS, Dim) :- + (clean_ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension(Dim, universe, PS), + ppl_build_test_data(TEST_DATA, t_@TOPOLOGY@, @CONSTRAINER@s, RS), + ppl_@CLASS@_refine_with_@CONSTRAINER@s(PS, RS)). + +') + +m4_define(`m4_add_comparison_class_code', `dnl +ppl_@CLASS@_comparison_check(is_disjoint_from, PS1, PS2, Result) :- + ( + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy), + ppl_@CLASS@_intersection_assign(PS1_Copy, PS2), + (ppl_@CLASS@_is_empty(PS1_Copy) + -> + Result = true + ; + Result = false + ), + ppl_delete_@CLASS@(PS1_Copy) + ). + +ppl_@CLASS@_comparison_check(contains, PS1, PS2, Result) :- + ( + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy), + ppl_@CLASS@_intersection_assign(PS1_Copy, PS2), + (ppl_@CLASS@_equals_@CLASS@(PS1_Copy, PS2) + -> + Result = true + ; + Result = false + ), + ppl_delete_@CLASS@(PS1_Copy) + ). + +ppl_@CLASS@_comparison_check(strictly_contains, PS1, PS2, Result) :- + ( + (ppl_@CLASS@_equals_@CLASS@(PS1, PS2) + -> + Result = false + ; + ppl_@CLASS@_comparison_check(contains, PS1, PS2, Result) + ) + ). + +ppl_@CLASS@_comparison_check(geometrically_covers, _PS1, _PS2, _). + +ppl_@CLASS@_comparison_check(geometrically_equals, _PS1, _PS2, _). + +') + +m4_define(`m4_add_wdn_exn_class_code', `dnl +ppl_@CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy) :- + ( + ppl_@CLASS@_contains_@CLASS@(PS1, PS1_Copy), + ppl_@CLASS@_contains_@CLASS@(PS1, PS2), + ppl_@CLASS@_equals_@CLASS@(PS2, PS2_Copy), + ppl_@CLASS@_OK(PS1), + ppl_@CLASS@_OK(PS2), + ppl_delete_@CLASS@(PS1), + ppl_delete_@CLASS@(PS1_Copy), + ppl_delete_@CLASS@(PS2), + ppl_delete_@CLASS@(PS2_Copy) + ). + +ppl_@CLASS@_wdn_exn_with_tokens_check_code(PS1, PS1a, PS1_Copy, PS2, PS2_Copy, + T, T1) :- + ( + ppl_@CLASS@_contains_@CLASS@(PS1, PS1_Copy), + ppl_@CLASS@_contains_@CLASS@(PS1a, PS1_Copy), + ppl_@CLASS@_contains_@CLASS@(PS1, PS2), + ppl_@CLASS@_contains_@CLASS@(PS1a, PS1), + ppl_@CLASS@_equals_@CLASS@(PS2, PS2_Copy), + (T == 1 + -> + ppl_@CLASS@_equals_@CLASS@(PS1, PS1a) + ; + T == 0, + ppl_@CLASS@_equals_@CLASS@(PS1, PS1_Copy) + ), + T1 == 0, + ppl_@CLASS@_OK(PS1), + ppl_@CLASS@_OK(PS1a), + ppl_@CLASS@_OK(PS2), + ppl_delete_@CLASS@(PS1), + ppl_delete_@CLASS@(PS1a), + ppl_delete_@CLASS@(PS1_Copy), + ppl_delete_@CLASS@(PS2), + ppl_delete_@CLASS@(PS2_Copy) + ). + +') + +m4_define(`m4_add_cleanup_class_code', `dnl +ppl_cleanup_@CLASS@(_). +ppl_cleanup_@CLASS@(P) :- + (out_@CLASS@(P), fail). + +ppl_cleanup_all_@CLASS@([]). +ppl_cleanup_all_@CLASS@([_|_]). +ppl_cleanup_all_@CLASS@([P|Ps]) :- + ppl_delete_all_@CLASS@([P|Ps]). + +ppl_delete_all_@CLASS@([]). +ppl_delete_all_@CLASS@([P|Ps]) :- + (ppl_delete_@CLASS@(P), + ppl_delete_all_@CLASS@(Ps)). + +') + +m4_define(`m4_add_out_class_code', `dnl +out_@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_@CLASS@_get_@CLASS_REPRESENT@s(P, RS), + display_message([nl, @CLASS_REPRESENT@s, are, nl, RS, nl]),') + fail + ). + +') + +m4_define(`m4_add_out_extra_class_code', `dnl +out_@CLASS@(P) :- + ppl_delete_@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_@TOPOLOGY@@CLASS@_from_space_dimension_code', +` +ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension_3_test :- + ( + clean_ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension(0, empty, PS), + clean_ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension(1, empty, PS1), + clean_ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension(0, universe, PS2), + clean_ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension(1, universe, PS3), + ppl_delete_@CLASS@(PS), + ppl_delete_@CLASS@(PS1), + ppl_delete_@CLASS@(PS2), + ppl_delete_@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_@TOPOLOGY@@CLASS@_from_@FRIEND@_code', +` +ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_2_test :- + ( + clean_ppl_new_@FRIEND@_from_space_dimension(0, universe, PS), + clean_ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@(PS, PS1), + ppl_@FRIEND@_OK(`(PS)'), + ppl_@CLASS@_OK(PS1), + ppl_delete_@FRIEND@(`(PS)'), + ppl_delete_@CLASS@(PS1) + -> + fail ; true). + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_with_complexity_code', +` +ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_with_complexity_2_test :- + ( + clean_ppl_new_@FRIEND@_from_space_dimension(0, universe, PS), + clean_ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@(PS, PS1), + ppl_@FRIEND@_OK(`(PS)'), + ppl_@CLASS@_OK(PS1), + ppl_delete_@FRIEND@(`(PS)'), + ppl_delete_@CLASS@(PS1) + -> + fail ; true). + +') + +m4_define(`ppl_new_@TOPOLOGY@@CLASS@_from_@BUILD_REPRESENT@s_code', +` +ppl_new_@TOPOLOGY@@CLASS@_from_@BUILD_REPRESENT@s_2_test :- + ( + member(TEST_DATA, [test00, test02, test03, test04, test05]), + ( + ppl_build_test_data(TEST_DATA, t_@TOPOLOGY@, + @BUILD_REPRESENT@s, RS1), + clean_ppl_new_@TOPOLOGY@@CLASS@_from_@BUILD_REPRESENT@s(RS1, PS1), + ppl_build_test_data(TEST_DATA, t_@TOPOLOGY@, + @A_BUILD_REPRESENT@s, RS1a), + clean_ppl_new_@TOPOLOGY@@CLASS@_from_@A_BUILD_REPRESENT@s(RS1a, PS1a), +%% ppl_@CLASS@_equals_@CLASS@(PS1, PS1a), + ppl_delete_@CLASS@(PS1), + ppl_delete_@CLASS@(PS1a) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_@UB_EXACT@_code', +` +ppl_@CLASS@_@UB_EXACT@_2_test :- + ( + choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim), + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA1, PS1, Space_Dim), + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA2, PS2, Space_Dim), + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA2, PS2a, Space_Dim), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy), + (ppl_@CLASS@_@UB_EXACT@(PS1_Copy, PS2) -> + ppl_@CLASS@_equals_@CLASS@(PS2, PS2a), +m4_ifelse(m4_current_group, pointset_powerset, `dnl + ppl_@CLASS@_geometrically_covers_@CLASS@(PS1_Copy, PS1), + ppl_@CLASS@_upper_bound_assign(PS2a, PS1), + ppl_@CLASS@_geometrically_covers_@CLASS@(PS2a, PS1_Copy)', +` true') + ; + ppl_@CLASS@_equals_@CLASS@(PS1_Copy, PS1), + ppl_@CLASS@_equals_@CLASS@(PS2a, PS2) + ), + ppl_@CLASS@_OK(PS1), + ppl_@CLASS@_OK(PS1_Copy), + ppl_@CLASS@_OK(PS2), + ppl_delete_@CLASS@(PS1), + ppl_delete_@CLASS@(PS1_Copy), + ppl_delete_@CLASS@(PS2), + ppl_delete_@CLASS@(PS2a) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_swap_code', +` +ppl_@CLASS@_swap_2_test :- + ( + ( + clean_ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension(3, universe, PS), + clean_ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension(3, empty, PS1), + ppl_@CLASS@_swap(PS, PS1), + (predicate_exists(ppl_@CLASS@_is_empty) + -> + ppl_@CLASS@_is_empty(PS), + ppl_@CLASS@_is_universe(PS1) + ; + true + ), + ppl_@CLASS@_OK(PS), + ppl_@CLASS@_OK(PS1), + ppl_delete_@CLASS@(PS), + ppl_delete_@CLASS@(PS1) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_@DIMENSION@_code', +` +ppl_@CLASS@_@DIMENSION@_2_test :- + ( + choose_test(TEST_DATA, Space_Dim), TEST_DATA \= test07, + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS, Space_Dim), + \+ppl_@CLASS@_@DIMENSION@(PS, 3), + ppl_@CLASS@_@DIMENSION@(PS, Dim), + ppl_dimension_test_data(TEST_DATA, @DIMENSION@, Dim1), + ((TEST_DATA == test05, @DIMENSION@ == affine_dimension) + -> + true + ; + Dim == Dim1 + ), + ppl_delete_@CLASS@(PS) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_get_@CLASS_REPRESENT@s_code', +` +ppl_@CLASS@_get_@CLASS_REPRESENT@s_2_test :- + ( + choose_test(TEST_DATA, Space_Dim), + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS, Space_Dim), + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS1, Space_Dim), + ppl_@CLASS@_get_@CLASS_REPRESENT@s(PS, RS), + (predicate_exists(ppl_@CLASS@_add_@CLASS_REPRESENT@s) + -> + ppl_@CLASS@_add_@CLASS_REPRESENT@s(PS1, RS) + ; + true + ), + ppl_@CLASS@_OK(PS), + ppl_@CLASS@_OK(PS1), + ppl_delete_@CLASS@(PS), + ppl_delete_@CLASS@(PS1) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_get_minimized_@CLASS_REPRESENT@s_code', +` +ppl_@CLASS@_get_minimized_@CLASS_REPRESENT@s_2_test :- + ( + choose_test(TEST_DATA, Space_Dim), + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS, Space_Dim), + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS1, Space_Dim), + ppl_@CLASS@_get_minimized_@CLASS_REPRESENT@s(PS, RS), + ( predicate_exists(ppl_@CLASS@_add_@CLASS_REPRESENT@s) + -> + ppl_@CLASS@_add_@CLASS_REPRESENT@s(PS1, RS) + ; + true + ), + ppl_@CLASS@_OK(PS), + ppl_@CLASS@_OK(PS1), + ppl_delete_@CLASS@(PS), + ppl_delete_@CLASS@(PS1) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_@MEMBYTES@_code', +` +ppl_@CLASS@_@MEMBYTES@_2_test :- + ( + choose_test(TEST_DATA, Space_Dim), + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PH, Space_Dim), + ppl_@CLASS@_@MEMBYTES@(PH, S), + ((noisy(N), N < 2) -> true ; + display_message([nl, for, TEST_DATA, the, @MEMBYTES@, is, S, nl]) + ), + ppl_delete_@CLASS@(PH) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_@BEGINEND@_iterator_code', +` +ppl_@CLASS@_@BEGINEND@_iterator_2_test :- + ( + choose_test(TEST_DATA, _Space_Dim), + ppl_build_test_data(TEST_DATA, t_@DISJUNCT_TOPOLOGY@, @CONSTRAINER@s, RS), + ( + clean_ppl_new_@CLASS@_from_@CONSTRAINER@s(RS, PPS), + ppl_@CLASS@_@BEGINEND@_iterator(PPS, It_x), + ppl_@CLASS@_OK(PPS), + ppl_delete_@CLASS@_iterator(It_x), + ppl_delete_@CLASS@(PPS) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_iterator_equals_iterator_code', +` +ppl_@CLASS@_iterator_equals_iterator_2_test :- + ( + choose_test(TEST_DATA, _Space_Dim), + ppl_build_test_data(TEST_DATA, t_@DISJUNCT_TOPOLOGY@, @CONSTRAINER@s, RS), + ( + clean_ppl_new_@CLASS@_from_@CONSTRAINER@s(RS, PPS), + ppl_@CLASS@_begin_iterator(PPS, It), + ppl_@CLASS@_begin_iterator(PPS, It_begin), + ppl_@CLASS@_iterator_equals_iterator(It, It_begin), + ppl_@CLASS@_OK(PPS), + ppl_delete_@CLASS@_iterator(It), + ppl_delete_@CLASS@_iterator(It_begin), + ppl_delete_@CLASS@(PPS) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_@INCDEC@_iterator_code', +` +ppl_@CLASS@_@INCDEC@_iterator_1_test :- + ( + choose_test(TEST_DATA, _Space_Dim), + ppl_build_test_data(TEST_DATA, t_@DISJUNCT_TOPOLOGY@, @CONSTRAINER@s, RS), + ( + clean_ppl_new_@CLASS@_from_@CONSTRAINER@s(RS, PPS), + ppl_@CLASS@_begin_iterator(PPS, Itb), + ppl_@CLASS@_begin_iterator(PPS, It_begin), + ppl_@CLASS@_size(PPS, S), + (S > 0 + -> + ppl_@CLASS@_increment_iterator(Itb), + ppl_@CLASS@_decrement_iterator(Itb) + ), + ppl_@CLASS@_iterator_equals_iterator(Itb, It_begin), + ppl_@CLASS@_end_iterator(PPS, Ite), + ppl_@CLASS@_end_iterator(PPS, It_end), + (S > 0 + -> + ppl_@CLASS@_decrement_iterator(Ite), + ppl_@CLASS@_increment_iterator(Ite) + ), + ppl_@CLASS@_iterator_equals_iterator(Ite, It_end), + ppl_@CLASS@_OK(PPS), + ppl_delete_@CLASS@_iterator(Itb), + ppl_delete_@CLASS@_iterator(It_begin), + ppl_delete_@CLASS@_iterator(Ite), + ppl_delete_@CLASS@_iterator(It_end), + ppl_delete_@CLASS@(PPS) + -> + fail ; true) + ). + +') + +m4_define(`ppl_new_@CLASS@_iterator_from_iterator_code', +` +ppl_new_@CLASS@_iterator_from_iterator_2_test :- + ( + TEST_DATA = test06, TEST_DATA1 = test07, + ppl_build_test_data(TEST_DATA, t_@DISJUNCT_TOPOLOGY@, @CONSTRAINER@s, RS), + ppl_build_test_data(TEST_DATA1, t_@DISJUNCT_TOPOLOGY@, @CONSTRAINER@s, RS1), + ( + clean_ppl_new_@CLASS@_from_@CONSTRAINER@s(RS, PPS), + clean_ppl_new_@DISJUNCT_TOPOLOGY@@DISJUNCT@_from_@CONSTRAINER@s(RS1, PS), + ppl_@CLASS@_add_disjunct(PPS, PS), + ppl_@CLASS@_begin_iterator(PPS, It_begin), + ppl_new_@CLASS@_iterator_from_iterator(It_begin, It1), + ppl_@CLASS@_increment_iterator(It1), + \+ppl_@CLASS@_iterator_equals_iterator(It1, It_begin), + ppl_@CLASS@_OK(PPS), + ppl_delete_@CLASS@_iterator(It_begin), + ppl_delete_@CLASS@_iterator(It1), + ppl_delete_@CLASS@(PPS), + ppl_delete_@DISJUNCT@(PS) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_drop_disjunct_code', +` +ppl_@CLASS@_drop_disjunct_2_test :- + ( + TEST_DATA = test06, TEST_DATA1 = test07, + ppl_build_test_data(TEST_DATA, t_@DISJUNCT_TOPOLOGY@, @CONSTRAINER@s, RS), + ppl_build_test_data(TEST_DATA1, t_@DISJUNCT_TOPOLOGY@, @CONSTRAINER@s, RS1), + ( + clean_ppl_new_@CLASS@_from_@CONSTRAINER@s(RS, PPS), + clean_ppl_new_@DISJUNCT_TOPOLOGY@@DISJUNCT@_from_@CONSTRAINER@s(RS1, PS), + ppl_@CLASS@_add_disjunct(PPS, PS), + ppl_@CLASS@_size(PPS, S), + S > 1, + ppl_@CLASS@_begin_iterator(PPS, It), + ppl_@CLASS@_increment_iterator(It), + ppl_@CLASS@_drop_disjunct(PPS, It), + S1 is S - 1, + ppl_@CLASS@_size(PPS, S1), + ppl_@CLASS@_decrement_iterator(It), + ppl_@CLASS@_drop_disjunct(PPS, It), + S2 is S1 - 1, + ppl_@CLASS@_size(PPS, S2), + ppl_@CLASS@_OK(PPS), + ppl_delete_@CLASS@_iterator(It), + ppl_delete_@CLASS@(PPS), + ppl_delete_@DISJUNCT@(PS) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_drop_disjuncts_code', +` +ppl_@CLASS@_drop_disjuncts_3_test :- + ( + TEST_DATA = test06, TEST_DATA1 = test07, + ppl_build_test_data(TEST_DATA, t_@DISJUNCT_TOPOLOGY@, @CONSTRAINER@s, RS), + ppl_build_test_data(TEST_DATA1, t_@DISJUNCT_TOPOLOGY@, @CONSTRAINER@s, RS1), + ( + clean_ppl_new_@CLASS@_from_@CONSTRAINER@s(RS, PPS), + clean_ppl_new_@DISJUNCT_TOPOLOGY@@DISJUNCT@_from_@CONSTRAINER@s(RS1, PS), + ppl_@CLASS@_add_disjunct(PPS, PS), + ppl_@CLASS@_size(PPS, S), + ppl_@CLASS@_begin_iterator(PPS, It_begin), + ppl_new_@CLASS@_iterator_from_iterator(It_begin, It1), + (S > 1 + -> + ppl_@CLASS@_increment_iterator(It1), + S1 is S - 1 + ; + S1 = S + ), + ppl_@CLASS@_drop_disjuncts(PPS, It_begin, It1), + S1 is S - 1, + ppl_@CLASS@_size(PPS, S1), + ppl_@CLASS@_OK(PPS), + ppl_delete_@CLASS@_iterator(It_begin), + ppl_delete_@CLASS@_iterator(It1), + ppl_delete_@CLASS@(PPS), + ppl_delete_@DISJUNCT@(PS) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_get_disjunct_code', +` +ppl_@CLASS@_get_disjunct_2_test :- + ( + all_tests(Space_Dim, Tests), + ( + clean_ppl_new_@CLASS@_from_space_dimension(Space_Dim, empty, PPS), + ppl_@CLASS@_get_disjunct_2_test1(PPS, Tests), + ppl_@CLASS@_begin_iterator(PPS, It), + ppl_@CLASS@_end_iterator(PPS, It_end), + ppl_@CLASS@_get_disjunct_2_test2(PPS, It, It_end, Space_Dim), + ppl_@CLASS@_OK(PPS), + ppl_delete_@CLASS@_iterator(It), + ppl_delete_@CLASS@_iterator(It_end), + ppl_delete_@CLASS@(PPS) + -> + fail ; true) + ). + +ppl_@CLASS@_get_disjunct_2_test1(_, []). +ppl_@CLASS@_get_disjunct_2_test1(PPS, [Test|Tests]) :- + ( + ppl_build_test_data(Test, t_@DISJUNCT_TOPOLOGY@, @CONSTRAINER@s, RS), + clean_ppl_new_@DISJUNCT_TOPOLOGY@@DISJUNCT@_from_@CONSTRAINER@s(RS, PS), + ppl_@CLASS@_add_disjunct(PPS, PS), + ppl_delete_@DISJUNCT@(PS), + ppl_@CLASS@_get_disjunct_2_test1(PPS, Tests), + ! + ). + +ppl_@CLASS@_get_disjunct_2_test2(PPS, It, It_end, Space_Dim) :- + ( + (ppl_@CLASS@_iterator_equals_iterator(It, It_end) + -> + true + ; + ppl_@CLASS@_get_disjunct(It, PS), + ppl_@CLASS@_increment_iterator(It), + ppl_@DISJUNCT@_OK(PS), + ppl_@DISJUNCT@_space_dimension(PS, D), + D = Space_Dim, + ppl_@CLASS@_get_disjunct_2_test2(PPS, It, It_end, Space_Dim) + ) + ). + +') + +m4_define(`ppl_@CLASS@_linear_@PARTITION@_code', +`dnl +ppl_@CLASS@_linear_@PARTITION@_4_test :- + ( + choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim), + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA1, PS1, Space_Dim), + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA2, PS2, Space_Dim), + ppl_@CLASS@_linear_partition(PS1, PS2, PS3, _PPS), + ppl_@CLASS@_OK(PS3) + -> + fail ; (class_@CLASS@ == class_BD_Shape_int8_t -> fail ; true)) + ). + +') + +m4_define(`ppl_@CLASS@_approximate_@PARTITION@_code', +`dnl +ppl_@CLASS@_approximate_@PARTITION@_4_test :- + ( + choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim), + ( + ppl_@CLASS@_build_test_object(TEST_DATA1, PS1, Space_Dim), + ppl_@CLASS@_build_test_object(TEST_DATA2, PS2, Space_Dim), + ppl_@CLASS@_approximate_partition(PS1, PS2, PS3, _PPS, _Is_finite), + ppl_@CLASS@_OK(PS3) + -> + fail ; (class_@CLASS@ == class_BD_Shape_int8_t -> fail ; true)) + ). + +') + +m4_define(`ppl_@CLASS@_relation_with_@RELATION_REPRESENT@_code', +` +ppl_@CLASS@_relation_with_@RELATION_REPRESENT@_3_test :- + ( + choose_test(TEST_DATA, Space_Dim), + ( + class_@CLASS@ \== class_BD_Shape_int8_t, + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS, Space_Dim), + ppl_relation_test_data(TEST_DATA, @RELATION_REPRESENT@, R, Rel_Expected), + ppl_@CLASS@_relation_with_@RELATION_REPRESENT@(PS, R, Rel), + (class_@CLASS@ == class_Polyhedron ; class_@CLASS@ == class_Grid + -> + Rel = Rel_Expected + ; + true + ), + ppl_delete_@CLASS@(PS) + -> + fail ; (class_@CLASS@ == class_BD_Shape_int8_t -> fail ; true)) + ). + +') + +m4_define(`ppl_@CLASS@_@HAS_PROPERTY@_code', +` +ppl_@CLASS@_@HAS_PROPERTY@_1_test :- + ( + choose_test(TEST_DATA, Space_Dim), + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS, Space_Dim), + (ppl_property_test_data(TEST_DATA, t_@TOPOLOGY@, + @CONSTRAINER@, @HAS_PROPERTY@) + -> + ppl_@CLASS@_@HAS_PROPERTY@(PS) + ; + \+ ppl_@CLASS@_@HAS_PROPERTY@(PS) + ), + ppl_delete_@CLASS@(PS) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_@SIMPLIFY@_code', +` +ppl_@CLASS@_@SIMPLIFY@_1_test :- + ( + choose_test(TEST_DATA, Space_Dim), + TEST_DATA = test04, + \+ TEST_DATA = test00, \+ TEST_DATA = test02, + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS, Space_Dim), + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS1, Space_Dim), + ppl_@CLASS@_@SIMPLIFY@(PS), + ppl_@CLASS@_OK(PS), + (predicate_exists(ppl_@CLASS@_contains_@CLASS@) + -> + ppl_@CLASS@_contains_@CLASS@(PS, PS1) + ; + true + ), + ppl_delete_@CLASS@(PS1), + ppl_delete_@CLASS@(PS) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_unconstrain_space_dimensions_code', +` +ppl_@CLASS@_unconstrain_space_dimensions_2_test :- + ( + choose_test(TEST_DATA, Space_Dim), + \+ TEST_DATA = test00, \+ TEST_DATA = test02, + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS, Space_Dim), + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS1, Space_Dim), + make_vars(Space_Dim, [Var| _Var_List]), + ppl_@CLASS@_unconstrain_space_dimensions(PS, [Var]), + ppl_@CLASS@_OK(PS), + (predicate_exists(ppl_@CLASS@_contains_@CLASS@) + -> + ppl_@CLASS@_contains_@CLASS@(PS, PS1) + ; + true + ), + ppl_delete_@CLASS@(PS1), + ppl_delete_@CLASS@(PS) + -> + fail ; true) + ). + +ppl_@CLASS@_unconstrain_space_dimensions_2_test :- + ( + choose_test(TEST_DATA, 0), + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS, 0), + ppl_@CLASS@_unconstrain_space_dimensions(PS, []), + ppl_@CLASS@_OK(PS), + ppl_delete_@CLASS@(PS) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_unconstrain_space_dimension_code', +` +ppl_@CLASS@_unconstrain_space_dimension_2_test :- + ( + choose_test(TEST_DATA, Space_Dim), + \+ TEST_DATA = test00, \+ TEST_DATA = test02, + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS, Space_Dim), + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS1, Space_Dim), + make_vars(Space_Dim, [Var| _Var_List]), + ppl_@CLASS@_unconstrain_space_dimension(PS, Var), + ppl_@CLASS@_OK(PS), + (predicate_exists(ppl_@CLASS@_contains_@CLASS@) + -> + ppl_@CLASS@_contains_@CLASS@(PS, PS1) + ; + true + ), + ppl_delete_@CLASS@(PS1), + ppl_delete_@CLASS@(PS) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_constrains_code', +` +ppl_@CLASS@_constrains_2_test :- + ( + choose_test(TEST_DATA, Space_Dim), + \+ TEST_DATA = test00, \+ TEST_DATA = test02, + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS, Space_Dim), + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS1, Space_Dim), + make_vars(Space_Dim, [Var| _Var_List]), + ppl_constrains_test_data(TEST_DATA, _, Bool), + (ppl_@CLASS@_constrains(PS, Var) + -> Bool = true + ; Bool = false + ), + ppl_@CLASS@_OK(PS), + ppl_delete_@CLASS@(PS1), + ppl_delete_@CLASS@(PS) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_bounds_from_@ABOVEBELOW@_code', +` +ppl_@CLASS@_bounds_from_@ABOVEBELOW@_2_test :- + ( + choose_test(TEST_DATA, Space_Dim), + TEST_DATA \= test05, + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS, Space_Dim), + (( + class_@DISJUNCT@ \= class_Grid, + ppl_bounds_test_data(TEST_DATA, @CONSTRAINER@s, LE, + @ABOVEBELOW@, true)) + -> + ppl_@CLASS@_bounds_from_@ABOVEBELOW@(PS, LE) + ; + true + ), + (( + class_@DISJUNCT@ \= class_Grid, + ppl_bounds_test_data(TEST_DATA, @CONSTRAINER@s, LE1, + @ABOVEBELOW@, false)) + -> + \+ ppl_@CLASS@_bounds_from_@ABOVEBELOW@(PS, LE1) + ; + true + ), + ppl_@CLASS@_OK(PS), + ppl_delete_@CLASS@(PS) + -> + fail ; true) + ). + +') + +dnl FIXME:: The test fails for BD_Shape. +m4_define(`ppl_@CLASS@_@MAXMIN@_codeXXXXX', +` +ppl_@CLASS@_@MAXMIN@_5_test :- + ( + choose_test(TEST_DATA, Space_Dim), + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS, Space_Dim), + ppl_maxmin_test_data(TEST_DATA, t_@TOPOLOGY@, @CONSTRAINER@, @MAXMIN@, + LE, Nexptd, Dexptd, Bexptd, _, SuccessFlag), + (SuccessFlag == true + -> + (ppl_@CLASS@_@MAXMIN@(PS, LE, N, D, B), + B == Bexptd, N == Nexptd, D == Dexptd) + ; + \+ ppl_@CLASS@_@MAXMIN@(PS, LE, N, D, B) + ), + ppl_@CLASS@_OK(PS), + ppl_delete_@CLASS@(PS) + -> + fail ; true) + ). + +') + +dnl FIXME:: The test fails for BD_Shape. +m4_define(`ppl_@CLASS@_@MAXMIN@_with_point_codeXXXXX', +` +ppl_@CLASS@_@MAXMIN@_with_point_6_test :- + ( + choose_test(TEST_DATA, Space_Dim), + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS, Space_Dim), + ppl_maxmin_test_data(TEST_DATA, t_@TOPOLOGY@, @CONSTRAINER@, @MAXMIN@, + LE, Nexptd, Dexptd, Bexptd, Gexptd, SuccessFlag), + (SuccessFlag == true + -> + (ppl_@CLASS@_@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_@CLASS@_@MAXMIN@_with_point(PS, LE, N, _, _, _) + ), + ppl_@CLASS@_OK(PS), + ppl_delete_@CLASS@(PS) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_@COMPARISON@_@CLASS@_code', +` +ppl_@CLASS@_@COMPARISON@_@CLASS@_2_test :- + ( + choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim), + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA1, PS1, Space_Dim), + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA2, PS2, Space_Dim), + (ppl_@CLASS@_@COMPARISON@_@CLASS@(PS1, PS2) + -> + ppl_@CLASS@_comparison_check(@COMPARISON@, PS1, PS2, true) + ; + ppl_@CLASS@_comparison_check(@COMPARISON@, PS1, PS2, false) + ), + ppl_@CLASS@_OK(PS1), + ppl_@CLASS@_OK(PS2), + ppl_delete_@CLASS@(PS1), + ppl_delete_@CLASS@(PS2) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@_code', +` +:- discontiguous(ppl_@CLASS@_add_@CLASS_REPRESENT@_2_test1/3). + +ppl_@CLASS@_add_@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_@TOPOLOGY@, @CLASS_REPRESENT@s, RS), + ppl_initial_test_system(@CLASS_REPRESENT@, U_or_E), + ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension(Space_Dim, U_or_E, PS), + ppl_@CLASS@_add_@CLASS_REPRESENT@s(PS, RS), + ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension(Space_Dim, U_or_E, PS1), + (ppl_@CLASS@_add_@CLASS_REPRESENT@_2_test1(PS, PS1, RS) + -> + fail ; true) + ). + +ppl_@CLASS@_add_@CLASS_REPRESENT@_2_test1(PS, PS1, []) :- + ( + (predicate_exists(ppl_@CLASS@_equals_@CLASS@) + -> + ppl_@CLASS@_equals_@CLASS@(PS, PS1) + ; + true + ), + ppl_delete_@CLASS@(PS), + ppl_delete_@CLASS@(PS1) + ). +ppl_@CLASS@_add_@CLASS_REPRESENT@_2_test1(PS, PS1, [R | RS]) :- + ( + ppl_@CLASS@_add_@CLASS_REPRESENT@(PS1, R), + ppl_@CLASS@_add_@CLASS_REPRESENT@_2_test1(PS, PS1, RS) + ). + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@_and_minimize_code', +` +:- discontiguous(ppl_@CLASS@_add_@CLASS_REPRESENT@_and_minimize_2_test1/3). + +ppl_@CLASS@_add_@CLASS_REPRESENT@_and_minimize_2_test :- + ( + member(TEST_DATA, [test00, test02, test03, test04, test05]), + choose_test(TEST_DATA, Space_Dim), + ( + ppl_build_test_data(TEST_DATA, t_@TOPOLOGY@, @CLASS_REPRESENT@s, RS), + ppl_initial_test_system(@CLASS_REPRESENT@, U_or_E), + clean_ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension(Space_Dim, + U_or_E, PS), + ppl_@CLASS@_add_@CLASS_REPRESENT@s(PS, RS), + clean_ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension(Space_Dim, + U_or_E, PS1), + (predicate_exists(ppl_@CLASS@_is_empty) + -> + (\+ ppl_@CLASS@_is_empty(PS) + -> + ppl_@CLASS@_add_@CLASS_REPRESENT@_and_minimize_2_test1(PS, PS1, RS) + ; + true + ) + ; + true + ), + ppl_delete_@CLASS@(PS), + ppl_delete_@CLASS@(PS1) + -> + fail ; true) + ). + +ppl_@CLASS@_add_@CLASS_REPRESENT@_and_minimize_2_test1(PS, PS1, []) :- + ( + (predicate_exists(ppl_@CLASS@_equals_@CLASS@) + -> + ppl_@CLASS@_equals_@CLASS@(PS, PS1) + ; + true + ) + ). +ppl_@CLASS@_add_@CLASS_REPRESENT@_and_minimize_2_test1(PS, PS1, [R | RS]) :- + ( + ppl_@CLASS@_add_@CLASS_REPRESENT@_and_minimize(PS1, R), + ppl_@CLASS@_add_@CLASS_REPRESENT@_and_minimize_2_test1(PS, PS1, RS) + ). + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@s_code', +` +ppl_@CLASS@_add_@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_@TOPOLOGY@, @CLASS_REPRESENT@s, RS), + ppl_build_test_data(TEST_DATA2, t_@TOPOLOGY@, @CLASS_REPRESENT@s, RS1), + ppl_initial_test_system(@CLASS_REPRESENT@, U_or_E), + ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension(Space_Dim, U_or_E, PS), + ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension(Space_Dim, U_or_E, PS1), + ppl_@CLASS@_add_@CLASS_REPRESENT@s(PS, RS), + ppl_@CLASS@_add_@CLASS_REPRESENT@s(PS, RS1), + ppl_@CLASS@_add_@CLASS_REPRESENT@s(PS1, RS1), + ppl_@CLASS@_add_@CLASS_REPRESENT@s(PS1, RS), + (predicate_exists(ppl_@CLASS@_equals_@CLASS@) + -> + ppl_@CLASS@_equals_@CLASS@(PS, PS1) + ; + true + ), + ppl_delete_@CLASS@(PS), + ppl_delete_@CLASS@(PS1) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_add_@CLASS_REPRESENT@s_and_minimize_code', +` +ppl_@CLASS@_add_@CLASS_REPRESENT@s_and_minimize_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, Dim), + ( + ppl_build_test_data(TEST_DATA1, t_@TOPOLOGY@, @CLASS_REPRESENT@s, RS), + ppl_build_test_data(TEST_DATA2, t_@TOPOLOGY@, @CLASS_REPRESENT@s, RS1), + ppl_initial_test_system(@CLASS_REPRESENT@, U_or_E), + ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension(Dim, U_or_E, PS), + ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension(Dim, U_or_E, PS1), + ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension(Dim, U_or_E, PS_min), + ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension(Dim, U_or_E, PS1_min), + ppl_@CLASS@_add_@CLASS_REPRESENT@s(PS, RS), + ppl_@CLASS@_add_@CLASS_REPRESENT@s(PS, RS1), + ppl_@CLASS@_add_@CLASS_REPRESENT@s(PS_min, RS), + (predicate_exists(ppl_@CLASS@_is_empty) + -> + (ppl_@CLASS@_is_empty(PS) + -> + \+ ppl_@CLASS@_add_@CLASS_REPRESENT@s_and_minimize(PS_min, RS1), + ppl_@CLASS@_add_@CLASS_REPRESENT@s(PS_min, RS1) + ; + ppl_@CLASS@_add_@CLASS_REPRESENT@s_and_minimize(PS_min, RS1) + ) + ; + true + ), + ppl_@CLASS@_add_@CLASS_REPRESENT@s(PS1, RS1), + ppl_@CLASS@_add_@CLASS_REPRESENT@s(PS1, RS), + ppl_@CLASS@_add_@CLASS_REPRESENT@s(PS1_min, RS1), + (predicate_exists(ppl_@CLASS@_is_empty) + -> + (ppl_@CLASS@_is_empty(PS1) + -> + \+ ppl_@CLASS@_add_@CLASS_REPRESENT@s_and_minimize(PS1_min, RS), + ppl_@CLASS@_add_@CLASS_REPRESENT@s(PS1_min, RS) + ; + ppl_@CLASS@_add_@CLASS_REPRESENT@s_and_minimize(PS1_min, RS) + ) + ; + true + ), + (predicate_exists(ppl_@CLASS@_equals_@CLASS@) + -> + ppl_@CLASS@_equals_@CLASS@(PS_min, PS1_min), + ppl_@CLASS@_equals_@CLASS@(PS, PS1_min), + ppl_@CLASS@_equals_@CLASS@(PS1, PS1_min) + ; + true + ), + ppl_delete_@CLASS@(PS), + ppl_delete_@CLASS@(PS_min), + ppl_delete_@CLASS@(PS1), + ppl_delete_@CLASS@(PS1_min) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_add_disjunct_code', +` +ppl_@CLASS@_add_disjunct_2_test :- + ( + choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim), + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA1, PPS1, Space_Dim), + ppl_@DISJUNCT_TOPOLOGY@@DISJUNCT@_build_test_object(TEST_DATA2, PS2, Space_Dim), + ppl_@CLASS@_add_disjunct(PPS1, PS2), + ppl_@CLASS@_OK(PPS1), + ppl_@DISJUNCT@_OK(PS2), + ppl_delete_@DISJUNCT@(PS2), + ppl_delete_@CLASS@(PPS1) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_@BINOP@_code', +` +ppl_@CLASS@_@BINOP@_2_test :- + ( + choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim), + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA1, PS1, Space_Dim), + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA2, PS2, Space_Dim), + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA2, PS2a, Space_Dim), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy), + ppl_@CLASS@_@BINOP@(PS1_Copy, PS2), + ((@BINOP@ == upper_bound_assign ; @BINOP@ == poly_hull_assign) + -> +m4_ifelse(m4_current_group, pointset_powerset,`dnl + ppl_@CLASS@_geometrically_covers_@CLASS@(PS1_Copy, PS1), + ppl_@CLASS@_geometrically_covers_@CLASS@(PS1_Copy, PS2)', +` ppl_@CLASS@_contains_@CLASS@(PS1_Copy, PS1), + ppl_@CLASS@_contains_@CLASS@(PS1_Copy, PS2)') + ; + true + ), + (@BINOP@ == intersection_assign + -> +m4_ifelse(m4_current_group, pointset_powerset,`dnl + ppl_@CLASS@_geometrically_covers_@CLASS@(PS1, PS1_Copy), + ppl_@CLASS@_geometrically_covers_@CLASS@(PS2, PS1_Copy)', +` ppl_@CLASS@_contains_@CLASS@(PS1, PS1_Copy), + ppl_@CLASS@_contains_@CLASS@(PS2, PS1_Copy)') + ; + true + ), + (@BINOP@ == difference_assign ; @BINOP@ == poly_difference_assign + -> +m4_ifelse(m4_current_group, pointset_powerset,`dnl + ppl_@CLASS@_geometrically_covers_@CLASS@(PS1, PS1_Copy)', +` ppl_@CLASS@_contains_@CLASS@(PS1, PS1_Copy)') + ; + true + ), + (@BINOP@ == concatenate_assign + -> + ppl_@CLASS@_space_dimension(PS1, Dim1), + ppl_@CLASS@_space_dimension(PS2, Dim2), + Dim_Conc is Dim1 + Dim2, + ppl_@CLASS@_space_dimension(PS1_Copy, Dim_Conc) + ; + true + ), + ppl_@CLASS@_OK(PS1), + ppl_@CLASS@_OK(PS1_Copy), + ppl_@CLASS@_OK(PS2), + ppl_delete_@CLASS@(PS1), + ppl_delete_@CLASS@(PS1_Copy), + ppl_delete_@CLASS@(PS2), + ppl_delete_@CLASS@(PS2a) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_simplify_using_context_assign_code', +` +ppl_@CLASS@_simplify_using_context_assign_2_test :- + ( + choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim), + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA1, PS1, Space_Dim), + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA2, PS2, Space_Dim), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy), + ppl_@CLASS@_simplify_using_context_assign(PS1_Copy, PS2, + _Is_Intersection), + ppl_@CLASS@_OK(PS1), + ppl_@CLASS@_OK(PS1_Copy), + ppl_@CLASS@_OK(PS2), + ppl_delete_@CLASS@(PS1), + ppl_delete_@CLASS@(PS1_Copy), + ppl_delete_@CLASS@(PS2) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_@AFFIMAGE@_code', +`ppl_@CLASS@_@AFFIMAGE@_4_test :- + ( + choose_test(TEST_DATA, Space_Dim), + Space_Dim > 0, + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS, Space_Dim), + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS_Copy, Space_Dim), + make_vars(Space_Dim, [Var| _Var_List]), + ppl_@CLASS@_@AFFIMAGE@(PS, Var, Var + 5, 1), + ppl_@CLASS@_@AFFIMAGE@(PS, Var, Var - 5, 1), + (@AFFIMAGE@ == affine_image + -> + ppl_@CLASS@_@AFFIMAGE@(PS, Var, 2*Var, 1), + ppl_@CLASS@_@AFFIMAGE@(PS, Var, Var, 2) + ; + ppl_@CLASS@_@AFFIMAGE@(PS, Var, Var, 2), + ppl_@CLASS@_@AFFIMAGE@(PS, Var, 2*Var, 1) + ), +dnl FIXME: This fails with Uint??_Box domains for many of the tests +dnl (predicate_exists(ppl_@CLASS@_equals_@CLASS@) +dnl -> +dnl ppl_@CLASS@_equals_@CLASS@(PS, PS_Copy) +dnl ; +dnl true +dnl ), + ppl_@CLASS@_OK(PS), + ppl_delete_@CLASS@(PS), + ppl_delete_@CLASS@(PS_Copy) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_bounded_@AFFIMAGE@_code', +` +ppl_@CLASS@_bounded_@AFFIMAGE@_5_test :- + ( + choose_test(TEST_DATA, Space_Dim), + ppl_dimension_test_data(TEST_DATA, space_dimension, Space_Dim), + Space_Dim > 0, + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS, Space_Dim), + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS_Copy, Space_Dim), + make_vars(Space_Dim, [Var| _Var_List]), + ppl_@CLASS@_bounded_@AFFIMAGE@(PS, Var, Var, 2*Var, 4), + ppl_@CLASS@_bounded_@AFFIMAGE@(PS, Var, 4*Var, 4*Var, 1), + ppl_@CLASS@_OK(PS), + ppl_@CLASS@_bounded_@AFFIMAGE@(PS_Copy, Var, 4*Var, 4*Var, 1), + ppl_@CLASS@_bounded_@AFFIMAGE@(PS_Copy, Var, Var, 2*Var, 2), + ppl_@CLASS@_OK(PS), + ppl_@CLASS@_OK(PS_Copy), + ppl_delete_@CLASS@(PS_Copy), + ppl_delete_@CLASS@(PS) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_code', +` +ppl_@CLASS@_generalized_@AFFIMAGE@_5_test :- + ( + choose_test(TEST_DATA, Space_Dim), + Space_Dim > 0, + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS, Space_Dim), + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS_Copy, Space_Dim), + make_vars(Space_Dim, [Var| _Var_List]), + ppl_@CLASS@_generalized_@AFFIMAGE@(PS, Var, >=, 2*Var, 2), + ppl_@CLASS@_generalized_@AFFIMAGE@(PS, Var, >=, Var + 2, 1), + ppl_@CLASS@_OK(PS), + ppl_@CLASS@_generalized_@AFFIMAGE@(PS_Copy, Var, >=, Var + 2, 1), + ppl_@CLASS@_generalized_@AFFIMAGE@(PS_Copy, Var, >=, 2*Var, 2), + (predicate_exists(ppl_@CLASS@_equals_@CLASS@) + -> + ppl_@CLASS@_equals_@CLASS@(PS, PS_Copy) + ; + true + ), + ppl_@CLASS@_OK(PS_Copy), + ppl_delete_@CLASS@(PS_Copy), + ppl_delete_@CLASS@(PS) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_with_congruence_code', +` +ppl_@CLASS@_generalized_@AFFIMAGE@_with_congruence_6_test :- + ( + choose_test(TEST_DATA, Space_Dim), + Space_Dim > 0, + ( + ppl_@CLASS@_build_test_object(TEST_DATA, PS, Space_Dim), + ppl_@CLASS@_build_test_object(TEST_DATA, PS_Copy, Space_Dim), + make_vars(Space_Dim, [Var| _Var_List]), + ppl_@CLASS@_generalized_@AFFIMAGE@_with_congruence(PS, Var, =, 2*Var, 3, 5), + ppl_@CLASS@_generalized_@AFFIMAGE@_with_congruence(PS, Var, =, Var + 2, 1, 0), + ppl_@CLASS@_OK(PS), + ppl_@CLASS@_generalized_@AFFIMAGE@_with_congruence(PS_Copy, Var, =, Var + 2, 1, 0), + ppl_@CLASS@_generalized_@AFFIMAGE@_with_congruence(PS_Copy, Var, =, 2*Var, 3, 5), +%% ppl_@CLASS@_equals_@CLASS@(PS, PS_Copy), + ppl_@CLASS@_OK(PS_Copy), + ppl_delete_@CLASS@(PS_Copy), + ppl_delete_@CLASS@(PS) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence_code', +` +ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence_4_test :- + ( + choose_test(TEST_DATA, Space_Dim), + Space_Dim > 0, + (t_@TOPOLOGY@ == t_NNC_ + -> + member(Op, [>=, =<, =, >, <]) + ; + member(Op, [>=, =<, =]) + ), + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS, Space_Dim), + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS_Copy, Space_Dim), + make_vars(Space_Dim, [Var| _Var_List]), + ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence(PS, 2*Var, Op, 2*(Var + 2)), + ppl_@CLASS@_OK(PS), + ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence(PS_Copy, Var, Op, Var + 2), + (predicate_exists(ppl_@CLASS@_equals_@CLASS@) + -> + ppl_@CLASS@_equals_@CLASS@(PS, PS_Copy) + ; + true + ), + ppl_@CLASS@_OK(PS_Copy), + ppl_delete_@CLASS@(PS_Copy), + ppl_delete_@CLASS@(PS) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence_code', +` +ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence_5_test :- + ( + choose_test(TEST_DATA, Space_Dim), + Space_Dim > 0, + ( + ppl_@CLASS@_build_test_object(TEST_DATA, PS, Space_Dim), + ppl_@CLASS@_build_test_object(TEST_DATA, PS_Copy, Space_Dim), + make_vars(Space_Dim, [Var| _Var_List]), + ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence(PS, Var + 2, =, 2*Var, 5), + ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence(PS, 1 - Var, =, Var + 2, 0), + ppl_@CLASS@_OK(PS), + ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence(PS_Copy, + 1 - Var, =, Var + 2, 0), + ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence(PS_Copy, + Var + 2, =, 2*Var, 5), +%% ppl_@CLASS@_equals_@CLASS@(PS, PS_Copy), + ppl_@CLASS@_OK(PS_Copy), + ppl_delete_@CLASS@(PS_Copy), + ppl_delete_@CLASS@(PS) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_@WIDEN@_widening_assign_code', +` +ppl_@CLASS@_@WIDEN@_widening_assign_2_test :- + ( + choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim), + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA1, PS1, Space_Dim), + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA2, PS2, Space_Dim), + ppl_@CLASS@_upper_bound_assign(PS1, PS2), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy), + ppl_@CLASS@_@WIDEN@_widening_assign(PS1, PS2), + ppl_@CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_@WIDEN@_widening_assign_with_tokens_code', +` +ppl_@CLASS@_@WIDEN@_widening_assign_with_tokens_4_test :- + ( + choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim), + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA1, PS1, Space_Dim), + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA2, PS2, Space_Dim), + ppl_@CLASS@_upper_bound_assign(PS1, PS2), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS1, PS1a), + ppl_@CLASS@_@WIDEN@_widening_assign_with_tokens(PS1, PS2, 1, T), + ppl_@CLASS@_@WIDEN@_widening_assign_with_tokens(PS1a, PS2, 0, T1), + ppl_@CLASS@_wdn_exn_with_tokens_check_code(PS1, PS1a, PS1_Copy, + PS2, PS2_Copy, T, T1) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_BHZ03_@DISJUNCT_TOPOLOGY@@DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign_code', +` +ppl_@CLASS@_BHZ03_@DISJUNCT_TOPOLOGY@@DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign_test :- + ( + choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim), + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA1, PS1, Space_Dim), + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA2, PS2, Space_Dim), + ppl_@CLASS@_upper_bound_assign(PS1, PS2), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy), + ppl_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign( + PS1, PS2), + ppl_@CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_BGP99_@DISJUNCT_WIDEN@_extrapolation_assign_code', +` +ppl_@CLASS@_BGP99_@DISJUNCT_WIDEN@_extrapolation_assign_test :- + ( + choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim), + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA1, PS1, Space_Dim), + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA2, PS2, Space_Dim), + ppl_@CLASS@_upper_bound_assign(PS1, PS2), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy), + ppl_@CLASS@_BGP99_@DISJUNCT_WIDEN@_extrapolation_assign( + PS1, PS2, 3), + ppl_@CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_BGP99_@DISJUNCT_EXTRAPOLATION@_extrapolation_assign_code', +` +ppl_@CLASS@_BGP99_@DISJUNCT_EXTRAPOLATION@_extrapolation_assign_test :- + ( + choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim), + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA1, PS1, Space_Dim), + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA2, PS2, Space_Dim), + ppl_@CLASS@_upper_bound_assign(PS1, PS2), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy), + ppl_@CLASS@_BGP99_@DISJUNCT_EXTRAPOLATION@_extrapolation_assign( + PS1, PS2, 3), + ppl_@CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_code', +` +ppl_@CLASS@_@LIMITEDBOUNDED@_@EXTRAPOLATION@_extrapolation_assign_3_test :- + ( + choose_2_tests(TEST_DATA1, TEST_DATA2, Dim), + Dim > 0, + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA1, PS1, Dim), + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA2, PS2, Dim), + ppl_@CLASS@_upper_bound_assign(PS1, PS2), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy), + make_vars(Dim, [Var|_]), + ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign( + PS1, PS2, [Var = 1]), + ppl_@CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_with_tokens_code', +` +ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_with_tokens_5_test :- + ( + choose_2_tests(TEST_DATA1, TEST_DATA2, Dim), + Dim > 0, + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA1, PS1, Dim), + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA2, PS2, Dim), + ppl_@CLASS@_upper_bound_assign(PS1, PS2), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS1, PS1a), + make_vars(Dim, [Var|_]), + ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_with_tokens( + PS1, PS2, [Var = 1], 1, T), + ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_with_tokens( + PS1a, PS2, [Var = 1], 0, T1), + ppl_@CLASS@_wdn_exn_with_tokens_check_code(PS1, PS1a, PS1_Copy, + PS2, PS2_Copy, T, T1) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_code', +` +ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_2_test :- + ( + choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim), + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA1, PS1, Space_Dim), + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA2, PS2, Space_Dim), + ppl_@CLASS@_upper_bound_assign(PS1, PS2), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy), + ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign(PS1, PS2), + ppl_@CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_with_tokens_code', +` +ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_with_tokens_4_test :- + ( + choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim), + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA1, PS1, Space_Dim), + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA2, PS2, Space_Dim), + ppl_@CLASS@_upper_bound_assign(PS1, PS2), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS1, PS1a), + ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_with_tokens(PS1, PS2, + 1, T), + ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_with_tokens(PS1a, PS2, + 0, T1), + ppl_@CLASS@_wdn_exn_with_tokens_check_code(PS1, PS1a, PS1_Copy, + PS2, PS2_Copy, T, T1) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_@EXTRAPOLATION@_narrowing_assign_code', +` +ppl_@CLASS@_@EXTRAPOLATION@_narrowing_assign_2_test :- + ( + choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim), + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA1, PS1, Space_Dim), + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA2, PS2, Space_Dim), + ppl_@CLASS@_upper_bound_assign(PS1, PS2), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy), + ppl_@CLASS@_@EXTRAPOLATION@_narrowing_assign(PS2, PS1), + ppl_@CLASS@_contains_@CLASS@(PS2, PS2_Copy), + ppl_@CLASS@_contains_@CLASS@(PS1, PS2), + ppl_@CLASS@_equals_@CLASS@(PS1, PS1_Copy), + ppl_@CLASS@_OK(PS1), + ppl_@CLASS@_OK(PS2), + ppl_delete_@CLASS@(PS1), + ppl_delete_@CLASS@(PS1_Copy), + ppl_delete_@CLASS@(PS2), + ppl_delete_@CLASS@(PS2_Copy) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@_code', +` +ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@_2_test :- + ( + ( + clean_ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension(1, universe, PS), + ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@(PS, 1), + ppl_@CLASS@_OK(PS), + ppl_@CLASS@_space_dimension(PS, 2), + (@EMBEDPROJECT@ == and_embed + -> + clean_ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension(2, universe, PS1) + ; + make_vars(2, [Var0, Var1]), + clean_ppl_new_@TOPOLOGY@@CLASS@_from_@CONSTRAINER@s( + [Var0 = Var0, Var1 = 0], PS1) + ), + (predicate_exists(ppl_@CLASS@_equals_@CLASS@) + -> + ppl_@CLASS@_equals_@CLASS@(PS, PS1), + ppl_@CLASS@_OK(PS1), + ppl_@CLASS@_OK(PS) + ; + true + ), + ppl_delete_@CLASS@(PS1), + ppl_delete_@CLASS@(PS) + + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_remove_higher_space_dimensions_code', +` +ppl_@CLASS@_remove_higher_space_dimensions_2_test :- + ( + choose_test(TEST_DATA, Dim), + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS, Dim), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS, PS_Copy), + ppl_@CLASS@_add_space_dimensions_and_embed(PS, 1), + ppl_@CLASS@_OK(PS), + ppl_@CLASS@_space_dimension(PS, Dim1), + Dim1 is Dim + 1, + ppl_@CLASS@_remove_higher_space_dimensions(PS, Dim), + ppl_@CLASS@_space_dimension(PS, Dim), + (predicate_exists(ppl_@CLASS@_equals_@CLASS@) + -> + ppl_@CLASS@_equals_@CLASS@(PS, PS_Copy) + ; + true + ), + ppl_@CLASS@_remove_higher_space_dimensions(PS, 0), + ppl_@CLASS@_space_dimension(PS, 0), + ppl_@CLASS@_OK(PS), + ppl_delete_@CLASS@(PS), + ppl_delete_@CLASS@(PS_Copy) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_remove_space_dimensions_code', +` +ppl_@CLASS@_remove_space_dimensions_2_test :- + ( + choose_test(TEST_DATA, Dim), + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS, Dim), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS, PS_Copy), + ppl_@CLASS@_add_space_dimensions_and_embed(PS, 1), + Dim1 is Dim + 1, + ppl_@CLASS@_remove_space_dimensions(PS, []), + ppl_@CLASS@_space_dimension(PS, Dim1), + make_vars(Dim1, Var_List), + append(_, [Var], Var_List), + ppl_@CLASS@_remove_space_dimensions(PS, [Var]), + (predicate_exists(ppl_@CLASS@_equals_@CLASS@) + -> + ppl_@CLASS@_equals_@CLASS@(PS, PS_Copy) + ; + true + ), + ppl_@CLASS@_OK(PS), + ppl_delete_@CLASS@(PS), + ppl_delete_@CLASS@(PS_Copy) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_expand_space_dimension_code', +` +ppl_@CLASS@_expand_space_dimension_3_test :- + ( + choose_test(TEST_DATA, Dim), + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS, Dim), + ppl_@CLASS@_add_space_dimensions_and_embed(PS, 1), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS, PS_Copy), + Dim1 is Dim + 1, + make_vars(1, [Var]), + ppl_@CLASS@_expand_space_dimension(PS, Var, 0), + ppl_@CLASS@_equals_@CLASS@(PS, PS_Copy), + make_vars(Dim1, Var_List), + append(_, [Var1], Var_List), + ppl_@CLASS@_expand_space_dimension(PS, Var1, 1), + Dim2 is Dim1 + 1, + ppl_@CLASS@_space_dimension(PS, Dim2), + ppl_@CLASS@_remove_higher_space_dimensions(PS, Dim1), + ppl_@CLASS@_equals_@CLASS@(PS, PS_Copy), + ppl_@CLASS@_OK(PS), + ppl_delete_@CLASS@(PS), + ppl_delete_@CLASS@(PS_Copy) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_fold_space_dimensions_code', +` +ppl_@CLASS@_fold_space_dimensions_3_test :- + ( + choose_test(TEST_DATA, Dim), + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS, Dim), + ppl_@CLASS@_add_space_dimensions_and_embed(PS, 1), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS, PS_Copy), + Dim1 is Dim + 1, + make_vars(Dim1, [Var | _]), + ppl_@CLASS@_fold_space_dimensions(PS, [], Var), + ppl_@CLASS@_equals_@CLASS@(PS, PS_Copy), + ppl_@CLASS@_add_space_dimensions_and_embed(PS, 1), + Dim2 is Dim1 + 1, + make_vars(Dim2, Var_List), + append(_, [Var1], Var_List), + ppl_@CLASS@_fold_space_dimensions(PS, [Var], Var1), + ppl_@CLASS@_space_dimension(PS, Dim1), + ppl_@CLASS@_OK(PS), + ppl_delete_@CLASS@(PS), + ppl_delete_@CLASS@(PS_Copy) + -> + fail ; true) + ). + +') + +m4_define(`ppl_@CLASS@_map_space_dimensions_code', +` +ppl_@CLASS@_map_space_dimensions_2_test :- + ( + choose_test(TEST_DATA, Dim), + ( + ppl_@TOPOLOGY@@CLASS@_build_test_object(TEST_DATA, PS, Dim), + ppl_@CLASS@_add_space_dimensions_and_embed(PS, 1), + ppl_@CLASS@_add_space_dimensions_and_project(PS, 1), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS, PS_Copy), + ppl_new_@TOPOLOGY@@CLASS@_from_@TOPOLOGY@@CLASS@(PS, PSa), + Dim1 is Dim + 2, + ppl_@CLASS@_map_space_dimensions(PSa, []), + ppl_@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_@CLASS@_map_space_dimensions(PS, Var_Map_List1), + ppl_@CLASS@_map_space_dimensions(PS, Var_Map_List1), + ppl_@CLASS@_space_dimension(PS, Dim1), + (predicate_exists(ppl_@CLASS@_equals_@CLASS@) + -> + ppl_@CLASS@_equals_@CLASS@(PS, PS_Copy) + ; + true + ), + ppl_@CLASS@_OK(PS), + ppl_delete_@CLASS@(PS), + ppl_delete_@CLASS@(PSa), + ppl_delete_@CLASS@(PS_Copy) + -> + fail ; true) + ). + +') + +dnl ppl_@CLASS@_@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..d91e26f --- /dev/null +++ b/interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl @@ -0,0 +1,614 @@ +% Extra test code for the generated tests for the Prolog interfaces. +% Copyright (C) 2001-2009 Roberto Bagnara +% +% This file is part of the Parma Polyhedra Library (PPL). +% +% The PPL is free software; you can redistribute it and/or modify it +% under the terms of the GNU General Public License as published by the +% Free Software Foundation; either version 3 of the License, or (at your +% option) any later version. +% +% The PPL is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +% for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program; if not, write to the Free Software Foundation, +% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +% +% For the most up-to-date information see the Parma Polyhedra Library +% site: http://www.cs.unipr.it/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_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). + +/* 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_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). + +/* 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_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_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_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_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_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_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..bdfd2ff --- /dev/null +++ b/interfaces/Prolog/tests/smm.clpq @@ -0,0 +1,31 @@ +% ************************************* +% CLP(R) Version 1.1 - Example Programs +% ************************************* +% +% The classic cryptarithmetic puzzle: +% +% S E N D +% + M O R E +% --------- +% M O N E Y + +solve(S, E, N, D, M, O, R, Y) :- + constraints(S, E, N, D, M, O, R, Y). + +constraints(S, E, N, D, M, O, R, Y) :- +{ + S >= 0, E >= 0, N >= 0, D >= 0, M >= 0, O >= 0, R >= 0, Y >= 0, + S =< 9, E =< 9, N =< 9, D =< 9, M =< 9, O =< 9, R =< 9, Y =< 9, + S >= 1, M >= 1, + C1 >= 0, C2 >= 0, C3 >= 0, C4 >= 0, + C1 =< 1, C2 =< 1, C3 =< 1, C4 =< 1, + M = C1, + C2 + S + M = O + C1 * 10, + C3 + E + O = N + 10 * C2, + C4 + N + R = E + 10 * C3, + D + E = Y + 10*C4 +}, + bit(C1), bit(C2), bit(C3), bit(C4). + +bit(0). +bit(1). diff --git a/interfaces/Prolog/tests/sumto.clpq b/interfaces/Prolog/tests/sumto.clpq new file mode 100644 index 0000000..329ef1b --- /dev/null +++ b/interfaces/Prolog/tests/sumto.clpq @@ -0,0 +1,4 @@ +sumto(N, S) :- + { N = 0, S = 0 }. +sumto(N, S) :- + { N = N1+1, S = N+S1 }, sumto(N1, S1). diff --git a/interfaces/Prolog/tests/tak.clpq b/interfaces/Prolog/tests/tak.clpq new file mode 100644 index 0000000..6defd26 --- /dev/null +++ b/interfaces/Prolog/tests/tak.clpq @@ -0,0 +1,20 @@ +% Evan Tick (from Lisp version by R. P. Gabriel) +% +% (almost) Takeuchi function (recursive arithmetic) + +tak(R) :- tak(18, 12, 6, R). + +tak(X, Y, Z, A) :- + { + X =< Y, + Z = A + }. + +tak(X, Y, Z, A) :- + { + X >= Y+1 + }, + tak(X-1, Y, Z, A1), + tak(Y-1, Z, X, A2), + tak(Z-1, X, Y, A3), + tak(A1, A2, A3, A ). diff --git a/interfaces/interfaced_boxes.hh b/interfaces/interfaced_boxes.hh new file mode 100644 index 0000000..62f8a57 --- /dev/null +++ b/interfaces/interfaced_boxes.hh @@ -0,0 +1,116 @@ +/* Declarations for the Box instantiations offered by the non-templatic + language interfaces. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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_Restriction_None > +Z_Box_Interval_Info; + +typedef Box > 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_Restriction_None > +Floating_Point_Box_Interval_Info; + +typedef +Box > +Float_Box; + +typedef Box > +Double_Box; + +typedef Box > +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_Restriction_None > +Native_Integer_Box_Interval_Info; + +typedef Box > Int8_Box; + +typedef Box > Int16_Box; + +typedef Box > Int32_Box; + +typedef Box > Int64_Box; + +typedef Box > Uint8_Box; + +typedef Box > Uint16_Box; + +typedef Box > Uint32_Box; + +typedef Box > 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..2ba6f6b --- /dev/null +++ b/interfaces/marked_pointers.hh @@ -0,0 +1,65 @@ +/* Implementation of marked pointers for use in some PPL non-templatic + language interfaces. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_marked_pointers_hh +#define PPL_marked_pointers_hh 1 + +namespace Parma_Polyhedra_Library { + +#include + +#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 +inline T* +mark(T* p) { + uintptr_t uint_p = reinterpret_cast(p); + return reinterpret_cast(uint_p | (PPL_MARKED_POINTERS_MASK)); +} + +//! Returns the unmarked pointer corresponding to \p p. +template +inline T* +unmark(T* p) { + uintptr_t uint_p = reinterpret_cast(p); + return reinterpret_cast(uint_p & ~(PPL_MARKED_POINTERS_MASK)); +} + +//! Returns true if and only if \p p is marked. +template +inline bool +marked(T* p) { + uintptr_t uint_p = reinterpret_cast(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..f34d3d2 --- /dev/null +++ b/interfaces/ppl_interface_generator_common.m4 @@ -0,0 +1,924 @@ +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-2009 Roberto Bagnara +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://www.cs.unipr.it/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__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..d1f1cfa --- /dev/null +++ b/interfaces/ppl_interface_generator_common_dat.m4 @@ -0,0 +1,993 @@ +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-2009 Roberto Bagnara +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://www.cs.unipr.it/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 /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 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 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 > 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 > +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 +dnl m4_cplusplus_class_body4 = BD_Shape +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 > 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 > +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 +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 +dnl m4_cplusplus_class_body_2nd5 = BD_Shape +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 > +dnl and Class_Counter = 2 +dnl m4_class_kind2 => `Pointset_Powerset' +dnl m4_class_body2 => `BD_Shape' +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 /ppl_interface_generators__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') + +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, +maxmin, +comparison, +refine_represent, +binop, +binminop, +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') + +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') + +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 == 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 "and_minimize" binary operators. +m4_define(`m4_binminop_replacements', `') +m4_define(`m4_Polyhedron_binminop_replacements', + `intersection_assign_and_minimize, + poly_hull_assign_and_minimize') + +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') 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..cb6d28f --- /dev/null +++ b/interfaces/ppl_interface_generator_common_procedure_generators.m4 @@ -0,0 +1,132 @@ +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-2009 Roberto Bagnara +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://www.cs.unipr.it/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 "_code" must be defined +dnl in the ppl_interface_generator_*_code.m4 file. +dnl The must be exactly as written here. + +m4_define(`m4_common_procedure_list', `dnl +ppl_delete_@CLASS@/1 *nofail +all, +ppl_new_@TOPOLOGY@@CLASS@_from_space_dimension/3 +all, +ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@/2 +all, +ppl_new_@TOPOLOGY@@CLASS@_from_@FRIEND@_with_complexity/3 +all, +ppl_new_@TOPOLOGY@@CLASS@_from_@BUILD_REPRESENT@s/2 +all, +ppl_@CLASS@_swap/2 *nofail +all, +ppl_@CLASS@_@DIMENSION@/2 +all, +ppl_@CLASS@_relation_with_@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_@CLASS@_get_@CLASS_REPRESENT@s/2 +simple, +ppl_@CLASS@_get_minimized_@CLASS_REPRESENT@s/2 +simple, +ppl_@CLASS@_@HAS_PROPERTY@/1 +all, +ppl_@CLASS@_@SIMPLIFY@/1 *nofail +all, +ppl_@CLASS@_bounds_from_@ABOVEBELOW@/2 +all, +ppl_@CLASS@_@MAXMIN@/5 +all, +ppl_@CLASS@_@MAXMIN@_with_point/6 +all, +ppl_@CLASS@_@COMPARISON@_@CLASS@/2 +all, +ppl_@CLASS@_equals_@CLASS@/2 +all, +ppl_@CLASS@_OK/1 +all, +ppl_@CLASS@_add_@CLASS_REPRESENT@/2 *nofail +all, +ppl_@CLASS@_add_@CLASS_REPRESENT@s/2 *nofail +all, +ppl_@CLASS@_refine_with_@REFINE_REPRESENT@/2 *nofail +all, +ppl_@CLASS@_refine_with_@REFINE_REPRESENT@s/2 *nofail +all, +ppl_@CLASS@_@BINOP@/2 *nofail +all, +ppl_@CLASS@_@UB_EXACT@/2 +all, +ppl_@CLASS@_simplify_using_context_assign/3 +simple_pps, +ppl_@CLASS@_constrains/2 +all, +ppl_@CLASS@_unconstrain_space_dimension/2 +all, +ppl_@CLASS@_unconstrain_space_dimensions/2 +all, +ppl_@CLASS@_@AFFIMAGE@/4 *nofail +all, +ppl_@CLASS@_bounded_@AFFIMAGE@/5 *nofail +all, +ppl_@CLASS@_generalized_@AFFIMAGE@/5 +all, +ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs/4 +all, +ppl_@CLASS@_generalized_@AFFIMAGE@_with_congruence/6 +grid, +ppl_@CLASS@_generalized_@AFFIMAGE@_lhs_rhs_with_congruence/5 +grid, +ppl_@CLASS@_add_space_dimensions_@EMBEDPROJECT@/2 *nofail +all, +ppl_@CLASS@_remove_space_dimensions/2 +all, +ppl_@CLASS@_remove_higher_space_dimensions/2 *nofail +all, +ppl_@CLASS@_expand_space_dimension/3 *nofail +all, +ppl_@CLASS@_fold_space_dimensions/3 +all, +ppl_@CLASS@_map_space_dimensions/2 +all, +ppl_@CLASS@_ascii_dump/1 +all, +ppl_@CLASS@_@MEMBYTES@/2 +all, +dnl +dnl NOTE: The next few schemas provide special widenings and +dnl extrapolations that depend on the domains. +dnl +ppl_@CLASS@_@WIDEN@_widening_assign_with_tokens/4 +simple, +ppl_@CLASS@_@WIDEN@_widening_assign/2 *nofail +simple, +dnl +dnl FIXME: We do not have a default widening for the +dnl pointset_powerset domain. +dnl +ppl_@CLASS@_widening_assign_with_tokens/4 +simple +product, +ppl_@CLASS@_widening_assign/2 *nofail +simple +product, +ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign_with_tokens/5 +simple, +ppl_@CLASS@_@LIMITEDBOUNDED@_@WIDENEXPN@_extrapolation_assign/3 *nofail +simple, +ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign_with_tokens/4 +wr_shape, +ppl_@CLASS@_@EXTRAPOLATION@_extrapolation_assign/2 *nofail +wr_shape, +ppl_@CLASS@_@EXTRAPOLATION@_narrowing_assign/2 +wr_shape, +dnl +dnl NOTE: The next few schemas provide procedures specifically for +dnl the pointset_powerset domains. +dnl +ppl_new_@CLASS@_iterator_from_iterator/2 +pointset_powerset, +ppl_@CLASS@_@BEGINEND@_iterator/2 +pointset_powerset, +ppl_@CLASS@_iterator_equals_iterator/2 +pointset_powerset, +ppl_@CLASS@_@INCDEC@_iterator/1 +pointset_powerset, +ppl_@CLASS@_get_disjunct/2 +pointset_powerset, +ppl_delete_@CLASS@_iterator/1 +pointset_powerset, +ppl_@CLASS@_add_disjunct/2 *nofail +pointset_powerset, +ppl_@CLASS@_drop_disjunct/2 +pointset_powerset, +ppl_@CLASS@_drop_disjuncts/3 +pointset_powerset, +ppl_@CLASS@_linear_@PARTITION@/4 +simple -grid, +ppl_@CLASS@_approximate_@PARTITION@/5 +grid, +ppl_@CLASS@_BHZ03_@A_DISJUNCT_WIDEN@_@DISJUNCT_WIDEN@_widening_assign/2 +pointset_powerset \box, +ppl_@CLASS@_BGP99_@DISJUNCT_WIDEN@_extrapolation_assign/3 +pointset_powerset \box, +dnl +dnl CHECKME: This is not implemented. +dnl +ppl_@CLASS@_BGP99_@DISJUNCT_EXTRAPOLATION@_extrapolation_assign/3 -pointset_powerset +') diff --git a/interfaces/ppl_interface_generator_copyright b/interfaces/ppl_interface_generator_copyright new file mode 100644 index 0000000..696261e --- /dev/null +++ b/interfaces/ppl_interface_generator_copyright @@ -0,0 +1,20 @@ +` Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . 'dnl diff --git a/ltmain.sh b/ltmain.sh new file mode 100644 index 0000000..b36c4ad --- /dev/null +++ b/ltmain.sh @@ -0,0 +1,8406 @@ +# Generated from ltmain.m4sh. + +# ltmain.sh (GNU libtool) 2.2.6 +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 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 +# --tag=TAG use configuration variables from tag TAG +# -v, --verbose print informational messages (default) +# --version print version information +# -h, --help print short or long 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. +# 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.2.6 +# automake: $automake_version +# autoconf: $autoconf_version +# +# Report bugs to . + +PROGRAM=ltmain.sh +PACKAGE=libtool +VERSION=2.2.6 +TIMESTAMP="" +package_revision=1.3012 + +# 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 + +# NLS nuisances: We save the old values to restore during execute mode. +# Only set LANG and LC_ALL to C if already set. +# These must not be set unconditionally because not all systems understand +# e.g. LANG=C (notably SCO). +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 + +$lt_unset CDPATH + + + + + +: ${CP="cp -f"} +: ${ECHO="echo"} +: ${EGREP="/usr/bin/grep -E"} +: ${FGREP="/usr/bin/grep -F"} +: ${GREP="/usr/bin/grep"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SED="/opt/local/bin/gsed"} +: ${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_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 "X${1}" | $Xsed -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 "X${1}" | $Xsed -e "$basename"` +} + +# Generated shell functions inserted here. + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + +# The name of this program: +# In the unlikely event $progname began with a '-', it would play havoc with +# func_echo (imagine progname=-n), so we prepend ./ in that case: +func_dirname_and_basename "$progpath" +progname=$func_basename_result +case $progname in + -*) progname=./$progname ;; +esac + +# 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=: + 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' + +# 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${mode+: }$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_error arg... +# Echo program name prefixed message to standard error. +func_error () +{ + $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2 +} + +# func_warning arg... +# Echo program name prefixed warning message to standard error. +func_warning () +{ + $opt_warning && $ECHO "$progname${mode+: }$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 "X$my_directory_path" | $Xsed -e "$dirname"` + done + my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e '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 "X$my_tmpdir" | $Xsed +} + + +# 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 "X$1" | $Xsed -e "$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 "X$1" | $Xsed \ + -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_version +# Echo version message to standard output and exit. +func_version () +{ + $SED -n '/^# '$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 () +{ + $SED -n '/^# Usage:/,/# -h/ { + s/^# // + s/^# *$// + s/\$progname/'$progname'/ + p + }' < "$progpath" + $ECHO + $ECHO "run \`$progname --help | more' for full usage" + exit $? +} + +# func_help +# Echo long help message to standard output and exit. +func_help () +{ + $SED -n '/^# Usage:/,/# Report bugs to/ { + 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 --version) 2>/dev/null |$SED 1q`"'/ + s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ + p + }' < "$progpath" + exit $? +} + +# func_missing_arg argname +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + func_error "missing argument for $1" + exit_cmd=exit +} + +exit_cmd=: + + + + + +# Check that we have a working $ECHO. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then + # Yippee, $ECHO works! + : +else + # Restart under the correct shell, and then maybe $ECHO will work. + exec $SHELL "$progpath" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat </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 +} + +# Parse options once, thoroughly. This comes as soon as possible in +# the script to make things like `libtool --version' happen quickly. +{ + + # 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 + + # Parse non-mode specific arguments: + while test "$#" -gt 0; do + opt="$1" + shift + + case $opt in + --config) func_config ;; + + --debug) preserve_args="$preserve_args $opt" + func_echo "enabling shell trace mode" + opt_debug='set -x' + $opt_debug + ;; + + -dlopen) test "$#" -eq 0 && func_missing_arg "$opt" && break + execute_dlfiles="$execute_dlfiles $1" + shift + ;; + + --dry-run | -n) opt_dry_run=: ;; + --features) func_features ;; + --finish) mode="finish" ;; + + --mode) test "$#" -eq 0 && func_missing_arg "$opt" && break + case $1 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 + + mode="$1" + shift + ;; + + --preserve-dup-deps) + opt_duplicate_deps=: ;; + + --quiet|--silent) preserve_args="$preserve_args $opt" + opt_silent=: + ;; + + --verbose| -v) preserve_args="$preserve_args $opt" + opt_silent=false + ;; + + --tag) test "$#" -eq 0 && func_missing_arg "$opt" && break + preserve_args="$preserve_args $opt $1" + func_enable_tag "$1" # tagname is set here + shift + ;; + + # Separate optargs to long options: + -dlopen=*|--mode=*|--tag=*) + func_opt_split "$opt" + set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"} + shift + ;; + + -\?|-h) func_usage ;; + --help) opt_help=: ;; + --version) func_version ;; + + -*) func_fatal_help "unrecognized option \`$opt'" ;; + + *) nonopt="$opt" + break + ;; + esac + done + + + 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_duplicate_deps + ;; + esac + + # Having warned about all mis-specified options, bail out if + # anything was wrong. + $exit_cmd $EXIT_FAILURE +} + +# 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 +} + + +## ----------- ## +## Main. ## +## ----------- ## + +$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 + + test -z "$mode" && func_fatal_error "error: you must specify a MODE." + + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$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=$mode' for more information." +} + + +# 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_ltwrapper_scriptname_result="" + if func_ltwrapper_executable_p "$1"; then + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" + fi +} + +# 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_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_quote_for_eval "$arg" + CC_quoted="$CC_quoted $func_quote_for_eval_result" + done + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_quote_for_eval "$arg" + CC_quoted="$CC_quoted $func_quote_for_eval_result" + done + case "$@ " in + " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + 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 <?"'"'"' &()|`$[]' \ + && 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 "X$srcfile" | $Xsed -e 's%^.*/%%' -e '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 + removelist="$removelist $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + removelist="$removelist $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + 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 + command="$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 + command="$command -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + command="$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 "$mode" = compile && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $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 building PIC objects only + -prefer-non-pic try to building 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 + +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 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 + -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 + +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 \`$mode'" + ;; + esac + + $ECHO + $ECHO "Try \`$progname --help' for more information about other modes." + + exit $? +} + + # Now that we've collected a possible --mode arg, show help if necessary + $opt_help && func_mode_help + + +# 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 $execute_dlfiles; do + test -f "$file" \ + || func_fatal_help "\`$file' is not a file" + + dir= + case $file in + *.la) + # 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 + dir="$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 + -*) ;; + *) + # 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_quote_for_eval "$file" + args="$args $func_quote_for_eval_result" + 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 "$mode" = execute && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $opt_debug + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + 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" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_silent && exit $EXIT_SUCCESS + + $ECHO "X----------------------------------------------------------------------" | $Xsed + $ECHO "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + $ECHO + $ECHO "If you ever happen to want to link against installed libraries" + $ECHO "in a given directory, LIBDIR, you must either use libtool, and" + $ECHO "specify the full pathname of the library, or use the \`-LLIBDIR'" + $ECHO "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + $ECHO " - add LIBDIR to the \`$shlibpath_var' environment variable" + $ECHO " during execution" + fi + if test -n "$runpath_var"; then + $ECHO " - add LIBDIR to the \`$runpath_var' environment variable" + $ECHO " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + $ECHO " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + $ECHO + + $ECHO "See any operating system documentation about shared libraries for" + 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 "X----------------------------------------------------------------------" | $Xsed + exit $EXIT_SUCCESS +} + +test "$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. + $ECHO "X$nonopt" | $GREP shtool >/dev/null; 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" + install_prog="$install_prog$func_quote_for_eval_result" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + case " $install_prog " in + *[\\\ /]cp\ *) ;; + *) prev=$arg ;; + esac + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + install_prog="$install_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 -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. + staticlibs="$staticlibs $file" + ;; + + *.la) + # 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 "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir="$func_dirname_result" + dir="$dir$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -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 "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "X$relink_command" | $Xsed -e "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_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" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + 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 "X$lib" | $Xsed -e '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 "X$relink_command" | $Xsed -e '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 "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + 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_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $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 "$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 + +/* 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 "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_verbose "extracting global C symbols from \`$progfile'" + $opt_dry_run || eval "$NM $progfile | $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" + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + 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 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; +" + case $host in + *cygwin* | *mingw* | *cegcc* ) + $ECHO >> "$output_objdir/$my_dlsyms" "\ +/* DATA imports from DLLs on WIN32 con't be const, because + runtime relocations are performed -- see ld's documentation + on pseudo-relocs. */" + lt_dlsym_const= ;; + *osf5*) + echo >> "$output_objdir/$my_dlsyms" "\ +/* This system does not cope well with relocations in const data */" + lt_dlsym_const= ;; + *) + lt_dlsym_const=const ;; + esac + + $ECHO >> "$output_objdir/$my_dlsyms" "\ +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) ;; + *) symtab_cflags="$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 "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "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 "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "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. +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 + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | + $SED -n -e ' + 1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $opt_debug + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?' + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + 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 | $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 | $NL2SP` + done + + func_extract_archives_result="$my_oldobjs" +} + + + +# func_emit_wrapper_part1 [arg=no] +# +# Emit the first part of a libtool wrapper script on stdout. +# For more information, see the description associated with +# func_emit_wrapper(), below. +func_emit_wrapper_part1 () +{ + func_emit_wrapper_part1_arg1=no + if test -n "$1" ; then + func_emit_wrapper_part1_arg1=$1 + fi + + $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. +Xsed='${SED} -e 1s/^X//' +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 + ECHO=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$ECHO works! + : + else + # Restart under the correct shell, and then maybe \$ECHO will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $ECHO "\ + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + done +" +} +# end: func_emit_wrapper_part1 + +# func_emit_wrapper_part2 [arg=no] +# +# Emit the second part of a libtool wrapper script on stdout. +# For more information, see the description associated with +# func_emit_wrapper(), below. +func_emit_wrapper_part2 () +{ + func_emit_wrapper_part2_arg1=no + if test -n "$1" ; then + func_emit_wrapper_part2_arg1=$1 + fi + + $ECHO "\ + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_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 \"X\$thisdir\" | \$Xsed -e '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" + + # 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 \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 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\ +" +} +# end: func_emit_wrapper_part2 + + +# 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=no + if test -n "$1" ; then + func_emit_wrapper_arg1=$1 + fi + + # split this up so that func_emit_cwrapperexe_src + # can call each part independently. + func_emit_wrapper_part1 "${func_emit_wrapper_arg1}" + func_emit_wrapper_part2 "${func_emit_wrapper_arg1}" +} + + +# func_to_host_path arg +# +# Convert paths to host format when used with build tools. +# Intended for use with "native" mingw (where libtool itself +# is running under the msys shell), or in the following cross- +# build environments: +# $build $host +# mingw (msys) mingw [e.g. native] +# cygwin mingw +# *nix + wine mingw +# where wine is equipped with the `winepath' executable. +# In the native mingw case, the (msys) shell automatically +# converts paths for any non-msys applications it launches, +# but that facility isn't available from inside the cwrapper. +# Similar accommodations are necessary for $host mingw and +# $build cygwin. Calling this function does no harm for other +# $host/$build combinations not listed above. +# +# ARG is the path (on $build) that should be converted to +# the proper representation for $host. The result is stored +# in $func_to_host_path_result. +func_to_host_path () +{ + func_to_host_path_result="$1" + if test -n "$1" ; then + case $host in + *mingw* ) + lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + case $build in + *mingw* ) # actually, msys + # awkward: cmd appends spaces to result + lt_sed_strip_trailing_spaces="s/[ ]*\$//" + func_to_host_path_tmp1=`( cmd //c echo "$1" |\ + $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` + func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + *cygwin* ) + func_to_host_path_tmp1=`cygpath -w "$1"` + func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + * ) + # 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_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null` + if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then + func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + $SED -e "$lt_sed_naive_backslashify"` + else + # Allow warning below. + func_to_host_path_result="" + fi + ;; + esac + if test -z "$func_to_host_path_result" ; then + func_error "Could not determine host path corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_path_result="$1" + fi + ;; + esac + fi +} +# end: func_to_host_path + +# func_to_host_pathlist arg +# +# Convert pathlists to host format when used with build tools. +# See func_to_host_path(), above. This function supports the +# following $build/$host combinations (but does no harm for +# combinations not listed here): +# $build $host +# mingw (msys) mingw [e.g. native] +# cygwin mingw +# *nix + wine mingw +# +# 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. +# +# ARG is a pathlist (on $build) that should be converted to +# the proper representation on $host. The result is stored +# in $func_to_host_pathlist_result. +func_to_host_pathlist () +{ + func_to_host_pathlist_result="$1" + if test -n "$1" ; then + case $host in + *mingw* ) + lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + # 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_to_host_pathlist_tmp2="$1" + # Once set for this call, this variable should not be + # reassigned. It is used in tha fallback case. + func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\ + $SED -e 's|^:*||' -e 's|:*$||'` + case $build in + *mingw* ) # Actually, msys. + # Awkward: cmd appends spaces to result. + lt_sed_strip_trailing_spaces="s/[ ]*\$//" + func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\ + $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + *cygwin* ) + func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"` + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + * ) + # unfortunately, winepath doesn't convert pathlists + func_to_host_pathlist_result="" + func_to_host_pathlist_oldIFS=$IFS + IFS=: + for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do + IFS=$func_to_host_pathlist_oldIFS + if test -n "$func_to_host_pathlist_f" ; then + func_to_host_path "$func_to_host_pathlist_f" + if test -n "$func_to_host_path_result" ; then + if test -z "$func_to_host_pathlist_result" ; then + func_to_host_pathlist_result="$func_to_host_path_result" + else + func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result" + fi + fi + fi + IFS=: + done + IFS=$func_to_host_pathlist_oldIFS + ;; + esac + if test -z "$func_to_host_pathlist_result" ; then + func_error "Could not determine the host path(s) corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This may break if $1 contains DOS-style drive + # specifications. The fix is not to complicate the expression + # below, but for the user to provide a working wine installation + # with winepath so that path translation in the cross-to-mingw + # case works properly. + lt_replace_pathsep_nix_to_dos="s|:|;|g" + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\ + $SED -e "$lt_replace_pathsep_nix_to_dos"` + fi + # Now, add the leading and trailing path separators back + case "$1" in + :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result" + ;; + esac + case "$1" in + *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;" + ;; + esac + ;; + esac + fi +} +# end: func_to_host_pathlist + +# 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 < +#include +#ifdef _MSC_VER +# include +# include +# include +# define setmode _setmode +#else +# include +# include +# ifdef __CYGWIN__ +# include +# define HAVE_SETENV +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#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 + +#ifdef _MSC_VER +# define S_IXUSR _S_IEXEC +# define stat _stat +# ifndef _INTPTR_T_DEFINED +# define intptr_t int +# endif +#endif + +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# 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 */ + +#ifdef __CYGWIN__ +# define FOPEN_WB "wb" +#endif + +#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) + +#undef LTWRAPPER_DEBUGPRINTF +#if defined DEBUGWRAPPER +# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args +static void +ltwrapper_debugprintf (const char *fmt, ...) +{ + va_list args; + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); +} +#else +# define LTWRAPPER_DEBUGPRINTF(args) +#endif + +const char *program_name = NULL; + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +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_fatal (const char *message, ...); +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_opt_process_env_set (const char *arg); +void lt_opt_process_env_prepend (const char *arg); +void lt_opt_process_env_append (const char *arg); +int lt_split_name_value (const char *arg, char** name, char** value); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); + +static const char *script_text_part1 = +EOF + + func_emit_wrapper_part1 yes | + $SED -e 's/\([\\"]\)/\\\1/g' \ + -e 's/^/ "/' -e 's/$/\\n"/' + echo ";" + cat <"))); + for (i = 0; i < newargc; i++) + { + LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d] : %s\n", i, (newargz[i] ? newargz[i] : ""))); + } + +EOF + + case $host_os in + mingw*) + cat <<"EOF" + /* execv doesn't actually work on mingw as expected on unix */ + rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz); + if (rval == -1) + { + /* failed to start process */ + LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, 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 ("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; + + LTWRAPPER_DEBUGPRINTF (("(check_executable) : %s\n", + path ? (*path ? path : "EMPTY!") : "NULL!")); + 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; + + LTWRAPPER_DEBUGPRINTF (("(make_executable) : %s\n", + path ? (*path ? path : "EMPTY!") : "NULL!")); + 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; + + LTWRAPPER_DEBUGPRINTF (("(find_executable) : %s\n", + wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!")); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +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) + { + LTWRAPPER_DEBUGPRINTF (("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 + { + char *errstr = strerror (errno); + lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal ("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; +} + +static void +lt_error_core (int exit_status, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); +} + +void +lt_setenv (const char *name, const char *value) +{ + LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n", + (name ? name : ""), + (value ? 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; +} + +int +lt_split_name_value (const char *arg, char** name, char** value) +{ + const char *p; + int len; + if (!arg || !*arg) + return 1; + + p = strchr (arg, (int)'='); + + if (!p) + return 1; + + *value = xstrdup (++p); + + len = strlen (arg) - strlen (*value); + *name = XMALLOC (char, len); + strncpy (*name, arg, len-1); + (*name)[len - 1] = '\0'; + + return 0; +} + +void +lt_opt_process_env_set (const char *arg) +{ + char *name = NULL; + char *value = NULL; + + if (lt_split_name_value (arg, &name, &value) != 0) + { + XFREE (name); + XFREE (value); + lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg); + } + + lt_setenv (name, value); + XFREE (name); + XFREE (value); +} + +void +lt_opt_process_env_prepend (const char *arg) +{ + char *name = NULL; + char *value = NULL; + char *new_value = NULL; + + if (lt_split_name_value (arg, &name, &value) != 0) + { + XFREE (name); + XFREE (value); + lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg); + } + + new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + XFREE (name); + XFREE (value); +} + +void +lt_opt_process_env_append (const char *arg) +{ + char *name = NULL; + char *value = NULL; + char *new_value = NULL; + + if (lt_split_name_value (arg, &name, &value) != 0) + { + XFREE (name); + XFREE (value); + lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg); + } + + new_value = lt_extend_str (getenv (name), value, 1); + lt_setenv (name, new_value); + XFREE (new_value); + XFREE (name); + XFREE (value); +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + (name ? name : ""), + (value ? 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) +{ + LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + (name ? name : ""), + (value ? 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 +} +# end: func_emit_cwrapperexe_src + +# 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 + 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 + 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 + dlfiles="$dlfiles $arg" + else + dlprefiles="$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 "*) ;; + *) deplibs="$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 +# moreargs="$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 + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + 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 "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + weak) + weak_libs="$weak_libs $arg" + prev= + continue + ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + compiler_flags="$compiler_flags $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$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 + ;; + + -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" + dir=$func_stripname_result + if test -z "$dir"; 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 + # 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 "*) ;; + *) + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs="$deplibs 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 + deplibs="$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) + compiler_flags="$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) + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) new_inherited_linker_flags="$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_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$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" + arg="$arg $wl$func_quote_for_eval_result" + compiler_flags="$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" + arg="$arg $wl$func_quote_for_eval_result" + compiler_flags="$compiler_flags $wl$func_quote_for_eval_result" + linker_flags="$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" + ;; + + # -64, -mips[0-9] enable 64-bit mode on the SGI compiler + # -r[0-9][0-9]* specifies the processor on the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler + # +DA*, +DD* enable 64-bit mode on the HP compiler + # -q* pass through compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* pass through architecture-specific + # compiler args for GCC + # -F/path gives path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC + # @file GCC response files + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + func_append compile_command " $arg" + func_append finalize_command " $arg" + compiler_flags="$compiler_flags $arg" + continue + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + *.$objext) + # A standard object. + objs="$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 + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + 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. + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles="$dlfiles $arg" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles="$dlprefiles $arg" + prev= + else + deplibs="$deplibs $arg" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + 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 \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + func_dirname "$output" "/" "" + output_objdir="$func_dirname_result$objdir" + # 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_duplicate_deps ; then + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + libs="$libs $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$pre_post_deps $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + 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= + case $lib in + *.la) func_source "$lib" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"` + case " $weak_libs " in + *" $deplib_base "*) ;; + *) deplibs="$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) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + compiler_flags="$compiler_flags $deplib" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) new_inherited_linker_flags="$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 "*) ;; + * ) new_inherited_linker_flags="$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" + newlib_search_path="$newlib_search_path $func_stripname_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" + newlib_search_path="$newlib_search_path $func_stripname_result" + ;; + *) + func_warning "\`-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + func_stripname '-R' '' "$deplib" + dir=$func_stripname_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) lib="$deplib" ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # 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 \"X$deplib\"" 2>/dev/null | $Xsed -e 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. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + + if test "$found" = yes || test -f "$lib"; then : + else + 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 "X$inherited_linker_flags" | $Xsed -e '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 "*) ;; + *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e '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" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" + 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_duplicate_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + if test -z "$linklib"; then + 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. + dlprefiles="$dlprefiles $lib $dependency_libs" + else + newdlfiles="$newdlfiles $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + 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 "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library \`$lib' was moved." + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$libdir" + absdir="$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + fi + fi # $installed = yes + 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 + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" + fi + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + newlib_search_path="$newlib_search_path $func_stripname_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_duplicate_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$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:"*) ;; + *) temp_rpath="$temp_rpath$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc*) + # No point in relinking DLLs because paths are not encoded + notinst_deplibs="$notinst_deplibs $lib" + need_relink=no + ;; + *) + if test "$installed" = no; then + notinst_deplibs="$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 "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + 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 "$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$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && + test "$hardcode_minus_L" != yes && + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes && + 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:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + $ECHO + $ECHO "*** Warning: This system can not link to static lib archive $lib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + $ECHO "*** But as you try to build a module library, libtool will still create " + $ECHO "*** a static module, that should work as long as the dlopening application" + $ECHO "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + $ECHO + $ECHO "*** However, this would only work if libtool was able to extract symbol" + $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" + $ECHO "*** not find such a program. So, this module is probably useless." + $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + *) temp_deplibs="$temp_deplibs $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path="$newlib_search_path $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + if $opt_duplicate_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + case $deplib in + -L*) path="$deplib" ;; + *.la) + 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 + compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" + linker_flags="$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 "X $new_inherited_linker_flags" | $Xsed -e '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 "*) ;; + *) lib_search_path="$lib_search_path $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + tmp_libs="$tmp_libs $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + 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" + objs="$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!" + libobjs="$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 + 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|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) + 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. + verstring="$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" + libobjs="$libobjs $symfileobj" + test "X$libobjs" = "X " && libobjs= + + if test "$mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.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 + removelist="$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 + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"` + # deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"` + # dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) dlfiles="$dlfiles $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) dlprefiles="$dlprefiles $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs="$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 + deplibs="$deplibs -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $ECHO + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have" + $ECHO "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + newdeplibs="$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 "*) + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval "\$ECHO \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $ECHO + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have" + $ECHO "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \ + -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"` + done + fi + if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' | + $GREP . >/dev/null; then + $ECHO + if test "X$deplibs_check_method" = "Xnone"; then + $ECHO "*** Warning: inter-library dependencies are not supported in this platform." + else + $ECHO "*** Warning: inter-library dependencies are not known to be supported." + fi + $ECHO "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e '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 "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO "X $deplibs" | $Xsed -e '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 "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + deplibs="$new_libs" + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath="$dep_rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + 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 + linknames="$linknames $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$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" + delfiles="$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 cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + func_len " $cmd" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + func_show_eval "$cmd" 'exit $?' + 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 "X$include_expsyms" | $Xsed | $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 + delfiles="$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 "*) ;; + *) + tmp_deplibs="$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" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + libobjs="$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\" + linker_flags="$linker_flags $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$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 + output_la=`$ECHO "X$output" | $Xsed -e "$basename"` + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + 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 + $ECHO "$obj" >> $output + done + $ECHO ')' >> $output + delfiles="$delfiles $output" + 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 + $ECHO "$obj" >> $output + done + delfiles="$delfiles $output" + output=$firstobj\"$file_list_spec$output\" + 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. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$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~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + if test -n "$last_robj"; then + eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" + fi + delfiles="$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 "$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 "X$include_expsyms" | $Xsed | $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 + delfiles="$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" + generated="$generated $gentop" + + func_extract_archives $gentop $dlprefiles + libobjs="$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 "$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 "$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 "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + 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 "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e '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]) + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e '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 "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + compile_command="$compile_command $compile_deplibs" + finalize_command="$finalize_command $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) dllsearchpath="$dllsearchpath:$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + 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 + *cygwin* | *mingw* ) + if test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + *cegcc) + # Disable wrappers for cegcc, we are cross compiling anyway. + wrappers_required=no + ;; + *) + 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 "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + # 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 + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + 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 "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + # 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 "X$relink_command" | $Xsed -e "$sed_quote_subst"` + fi + + # Quote $ECHO for shipping. + if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then + case $progpath in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; + *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; + esac + qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if 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 + oldobjs="$oldobjs $symfileobj" + fi + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $addlibs + oldobjs="$oldobjs $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $dlprefiles + oldobjs="$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" + generated="$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" + oldobjs="$oldobjs $gentop/$newobj" + ;; + *) oldobjs="$oldobjs $obj" ;; + esac + done + fi + 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 + 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 "X$relink_command" | $Xsed -e "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + # Only create the output if not a dry run. + $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" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + newdependency_libs="$newdependency_libs $libdir/$name" + ;; + *) newdependency_libs="$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" + newdlfiles="$newdlfiles $libdir/$name" + ;; + *) newdlfiles="$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" + newdlprefiles="$newdlprefiles $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 + newdlfiles="$newdlfiles $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles="$newdlprefiles $abs" + done + dlprefiles="$newdlprefiles" + fi + $RM $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + 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 "$mode" = link || test "$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) RM="$RM $arg"; rmforce=yes ;; + -*) RM="$RM $arg" ;; + *) files="$files $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + origobjdir="$objdir" + for file in $files; do + func_dirname "$file" "" "." + dir="$func_dirname_result" + if test "X$dir" = X.; then + objdir="$origobjdir" + else + objdir="$dir/$origobjdir" + fi + func_basename "$file" + name="$func_basename_result" + test "$mode" = uninstall && objdir="$dir" + + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then + case " $rmdirs " in + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $objdir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + + case "$mode" in + clean) + case " $library_names " in + # " " in the beginning catches empty $dlname + *" $dlname "*) ;; + *) rmfiles="$rmfiles $objdir/$dlname" ;; + esac + test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + 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 + rmfiles="$rmfiles $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && + test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$mode" = clean ; then + noexename=$name + case $file in + *.exe) + 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 + rmfiles="$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 + rmfiles="$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 + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles="$rmfiles $objdir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + objdir="$origobjdir" + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +{ test "$mode" = uninstall || test "$mode" = clean; } && + func_mode_uninstall ${1+"$@"} + +test -z "$mode" && { + help="$generic_help" + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode \`$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..a861da0 --- /dev/null +++ b/m4/Makefile.am @@ -0,0 +1,64 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +# M4 macro files to be used by the client applications with Autoconf. +m4datadir = $(datadir)/aclocal +m4data_DATA = \ +ppl.m4 \ +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_double_exact_output.m4 \ +ac_cxx_flexible_arrays.m4 \ +ac_cxx_float_binary_format.m4 \ +ac_cxx_float_exact_output.m4 \ +ac_cxx_ieee_inexact_flag.m4 \ +ac_cxx_limit_memory.m4 \ +ac_cxx_long_double_binary_format.m4 \ +ac_cxx_long_double_exact_output.m4 \ +ac_cxx_proper_long_double.m4 \ +ac_cxx_remainder_bug.m4 \ +ac_prog_jar.m4 \ +ac_prog_java.m4 \ +ac_prog_javac.m4 \ +ac_prog_javah.m4 \ +ac_text_md5sum.m4 \ +lib-ld.m4 \ +lib-link.m4 \ +lib-prefix.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..98efc54 --- /dev/null +++ b/m4/Makefile.in @@ -0,0 +1,517 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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.am $(srcdir)/Makefile.in +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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(m4datadir)" +m4dataDATA_INSTALL = $(INSTALL_DATA) +DATA = $(m4data_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ + +# 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_double_exact_output.m4 \ +ac_cxx_flexible_arrays.m4 \ +ac_cxx_float_binary_format.m4 \ +ac_cxx_float_exact_output.m4 \ +ac_cxx_ieee_inexact_flag.m4 \ +ac_cxx_limit_memory.m4 \ +ac_cxx_long_double_binary_format.m4 \ +ac_cxx_long_double_exact_output.m4 \ +ac_cxx_proper_long_double.m4 \ +ac_cxx_remainder_bug.m4 \ +ac_prog_jar.m4 \ +ac_prog_java.m4 \ +ac_prog_javac.m4 \ +ac_prog_javah.m4 \ +ac_text_md5sum.m4 \ +lib-ld.m4 \ +lib-link.m4 \ +lib-prefix.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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign m4/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign m4/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-m4dataDATA: $(m4data_DATA) + @$(NORMAL_INSTALL) + test -z "$(m4datadir)" || $(MKDIR_P) "$(DESTDIR)$(m4datadir)" + @list='$(m4data_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(m4dataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(m4datadir)/$$f'"; \ + $(m4dataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(m4datadir)/$$f"; \ + done + +uninstall-m4dataDATA: + @$(NORMAL_UNINSTALL) + @list='$(m4data_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(m4datadir)/$$f'"; \ + rm -f "$(DESTDIR)$(m4datadir)/$$f"; \ + done +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(m4datadir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-m4dataDATA + +install-dvi: install-dvi-am + +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 + +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 \ + 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 \ + 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..78dc1cf --- /dev/null +++ b/m4/ac_check_ciao.m4 @@ -0,0 +1,87 @@ +dnl A function to check for the existence and usability of Ciao-Prolog. +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/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( +[#include + +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 +# +# 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..5ccbb68 --- /dev/null +++ b/m4/ac_check_fpu_control.m4 @@ -0,0 +1,143 @@ +dnl A function to check for the possibility to control the FPU. +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/ppl/ . + +AC_DEFUN([AC_CHECK_FPU_CONTROL], +[ +ac_save_LIBS="$LIBS" +LIBS="$LIBS -lm" +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 + +# 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 +check() { + 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 (*fun)() = check; + +int main() { + if (fesetround(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 (fesetround(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 (*fun)(); +} + +# 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 + ) +) +AM_CONDITIONAL(CAN_CONTROL_FPU, test $ac_cv_can_control_fpu = 1) +AC_DEFINE_UNQUOTED(PPL_CAN_CONTROL_FPU, $ac_cv_can_control_fpu, + [Not zero if the FPU can be controlled.]) +AC_LANG_POP(C++) +LIBS="$ac_save_LIBS" +]) diff --git a/m4/ac_check_gmp.m4 b/m4/ac_check_gmp.m4 new file mode 100644 index 0000000..4dc3bc8 --- /dev/null +++ b/m4/ac_check_gmp.m4 @@ -0,0 +1,182 @@ +dnl A function to check for the existence and usability of GMP. +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/ppl/ . + +AC_DEFUN([AC_CHECK_GMP], +[ +dnl Since libgmp and libgmpxx are usually installed in the same location, +dnl let the prefixes default from each other. +if test -n "$with_libgmpxx_prefix" && test -z "$with_libgmp_prefix"; then + with_libgmp_prefix="$with_libgmpxx_prefix" +else + if test -n "$with_libgmp_prefix" && test -z "$with_libgmpxx_prefix"; then + with_libgmpxx_prefix="$with_libgmp_prefix" + fi +fi + +dnl Check how to link with libgmp. +AC_LIB_LINKFLAGS([gmp]) + +dnl Check how to link with libgmpxx. +AC_LIB_LINKFLAGS([gmpxx], [gmp]) + +ac_save_LIBS="$LIBS" +LIBS="$LIBS $LIBGMPXX" +AC_LANG_PUSH(C++) + +AC_MSG_CHECKING([for the GMP library version 4.1.3 or above]) +AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#include +#include +#include +#include + +#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() { + 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 (gmp.h) and library (ligmp.*) version mismatch:\n" + << "header gives " << header_version << ";\n" + << "library gives " << library_version << "." << std::endl; + return 1; + } + + if (sizeof(mp_limb_t)*CHAR_BIT != GMP_LIMB_BITS + || GMP_LIMB_BITS != mp_bits_per_limb) { + std::cerr + << "GMP header (gmp.h) and library (ligmp.*) bits-per-limb mismatch:\n" + << "header gives " << __GMP_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 + +#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 ]) + +AC_MSG_CHECKING([whether GMP has been compiled with support for exceptions]) +AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#include +#include + +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 not]) + ac_cv_gmp_supports_exceptions=no) + +gmp_supports_exceptions=${ac_cv_gmp_supports_exceptions} +if test x"$gmp_supports_exceptions" = xyes +then + value=1 +else + value=0 +fi +AC_DEFINE_UNQUOTED(PPL_GMP_SUPPORTS_EXCEPTIONS, $value, + [Not zero if GMP has been compiled with support for exceptions.]) + +fi + +AC_LANG_POP(C++) +LIBS="$ac_save_LIBS" + +dnl We use libtool, therefore we take $LTLIBGMPXX, not $LIBGMPXX. +gmp_library_option="$LTLIBGMPXX" +]) diff --git a/m4/ac_check_sicstus_prolog.m4 b/m4/ac_check_sicstus_prolog.m4 new file mode 100644 index 0000000..9afbe9b --- /dev/null +++ b/m4/ac_check_sicstus_prolog.m4 @@ -0,0 +1,62 @@ +dnl A function to check for the existence and usability of SICStus Prolog. +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/ppl/ . + +AC_DEFUN([AC_CHECK_SICSTUS_PROLOG], +[ +AC_PATH_PROG(sicstus_prolog, sicstus) +if test x$sicstus_prolog != x +then + dnl The following would fail to find the real base if `sicstus' + dnl is a symbolic link. + dnl sicstus_prolog_base=$(dirname $(dirname $sicstus_prolog)) + sicstus_prolog_base=$(dirname $($sicstus_prolog -f --goal "use_module(library(system)), environ('SP_APP_DIR', X), write(X), nl, halt.")) + SICSTUS_PROLOG_INCLUDE_OPTIONS="-I${sicstus_prolog_base}/include" + ac_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $SICSTUS_PROLOG_INCLUDE_OPTIONS" + AC_LANG_PUSH(C++) + # We require SICStus Prolog 3.9.1 or later. + AC_CHECK_HEADER(sicstus/sicstus.h, + AC_MSG_CHECKING([for SICStus version 3.9.1 or later]) + AC_EGREP_CPP(yes, + [ + #include + #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..4ca9955 --- /dev/null +++ b/m4/ac_check_swi_prolog.m4 @@ -0,0 +1,88 @@ +dnl A function to check for the existence and usability of SWI-Prolog. +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/ppl/ . + +AC_DEFUN([AC_CHECK_SWI_PROLOG], +[ +dnl By default, SWI-Prolog is installed as `pl', though some administrators +dnl call it `swipl' or `swi-prolog'. In particular, on Mac OS X `pl' is +dnl the name of another program. +AC_PATH_PROG(swi_prolog, swi-prolog) +if test -z $swi_prolog +then + AC_PATH_PROG(swi_prolog, swipl) + if test -z $swi_prolog + then + AC_PATH_PROG(swi_prolog, pl) + fi +fi +if test x$swi_prolog != x +then + swi_prolog_base=`$swi_prolog -dump-runtime-variables | grep PLBASE= | sed 's/PLBASE="\(.*\)";/\1/'` + swi_prolog_version=`$swi_prolog -dump-runtime-variables | grep PLVERSION= | sed 's/PLVERSION="\(.*\)";/\1/'` + 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. + + # 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" + SWI_PROLOG_LD_OPTIONS="-L${swi_prolog_base}/lib/${swi_prolog_arch} ${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( +[#include + +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" + AC_SUBST(SWI_PROLOG) + 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..580800b --- /dev/null +++ b/m4/ac_check_xsb_prolog.m4 @@ -0,0 +1,49 @@ +dnl A function to check for the existence and usability of XSB Prolog. +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/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_cxx_attribute_weak.m4 b/m4/ac_cxx_attribute_weak.m4 new file mode 100644 index 0000000..1384fc5 --- /dev/null +++ b/m4/ac_cxx_attribute_weak.m4 @@ -0,0 +1,58 @@ +dnl A function to check whether the C++ compiler supports the function +dnl __attribute__ ((weak)). +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/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..c627326 --- /dev/null +++ b/m4/ac_cxx_double_binary_format.m4 @@ -0,0 +1,114 @@ +dnl A function to detect the binary format used by C++ doubles. +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/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 +#ifdef HAVE_STDINT_H +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#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::is_iec559 + && (convert(0xaaacccaaUL, 0xacccaaacUL) + == -4.018242396032647085467373664662028399901175154542925376476863248797653889888945947404163925979898721593782464256360719269163883854613473748830842329884157359816532025640075051481726120707111709993717456369512975427023957197464411926714771905463723621065863511603311053477227687835693359375e-103 + && convert(0xcccaaaccUL, 0xcaaacccaUL) + == -85705035845709846787631445265530356117787053916987832397725696.0 + && convert(0x00000000UL, 0x00000001UL) + == 4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625e-324 + && convert(0x80000000UL, 0x00000001UL) + == -4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625e-324)) + 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) + +AC_CXX_DOUBLE_EXACT_OUTPUT + +if test x"$ac_cxx_double_binary_format" = x"unknown" || test $ac_cxx_double_exact_output = 0 || 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_double_exact_output.m4 b/m4/ac_cxx_double_exact_output.m4 new file mode 100644 index 0000000..f3827ed --- /dev/null +++ b/m4/ac_cxx_double_exact_output.m4 @@ -0,0 +1,140 @@ +dnl A function to detect whether C++ provides exact output for doubles. +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/ppl/ . + +AC_DEFUN([AC_CXX_DOUBLE_EXACT_OUTPUT], +[ +AC_REQUIRE([AC_C_BIGENDIAN]) +dnl AC_REQUIRE([AC_CXX_DOUBLE_BINARY_FORMAT]) +ac_save_CPPFLAGS="$CPPFLAGS" +ac_save_LIBS="$LIBS" +AC_LANG_PUSH(C++) + +AC_MSG_CHECKING([whether C++ provides exact output for doubles]) + +AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#ifdef HAVE_STDINT_H +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#endif +#include + +/* 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 + +bool +check(double value, const char* text) { + std::ostringstream ss; + ss.precision(10000); + ss << value; + return ss.str() == text; +} + +#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; +} + +#if PPL_CXX_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_DOUBLE + +int +main() { + if (check(convert(0xaaacccaaUL, 0xacccaaacUL), + "-4.018242396032647085467373664662028399901175154542925376476863248797653889888945947404163925979898721593782464256360719269163883854613473748830842329884157359816532025640075051481726120707111709993717456369512975427023957197464411926714771905463723621065863511603311053477227687835693359375e-103") + && check(convert(0xcccaaaccUL, 0xcaaacccaUL), + "-85705035845709846787631445265530356117787053916987832397725696") + && check(convert(0x00000000UL, 0x00000001UL), + "4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625e-324") + && check(convert(0x80000000UL, 0x00000001UL), + "-4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625e-324")) + return 0; + else + return 1; +} + +#else // PPL_CXX_DOUBLE_BINARY_FORMAT != PPL_FLOAT_IEEE754_DOUBLE + +int +main() { + return 1; +} + +#endif // PPL_CXX_DOUBLE_BINARY_FORMAT != PPL_FLOAT_IEEE754_DOUBLE + +#else // SIZEOF_DOUBLE != 8 + +int +main() { + return 1; +} + +#endif // SIZEOF_DOUBLE != 8 +]])], + AC_MSG_RESULT(yes) + ac_cxx_double_exact_output=1, + AC_MSG_RESULT(no) + ac_cxx_double_exact_output=0, + AC_MSG_RESULT([assuming not]) + ac_cxx_double_exact_output=0) + +AC_DEFINE_UNQUOTED(PPL_CXX_DOUBLE_EXACT_OUTPUT, $ac_cxx_double_exact_output, + [Not zero if C++ supports exact output for doubles.]) + +AC_LANG_POP(C++) +CPPFLAGS="$ac_save_CPPFLAGS" +LIBS="$ac_save_LIBS" +]) diff --git a/m4/ac_cxx_flexible_arrays.m4 b/m4/ac_cxx_flexible_arrays.m4 new file mode 100644 index 0000000..8319f07 --- /dev/null +++ b/m4/ac_cxx_flexible_arrays.m4 @@ -0,0 +1,141 @@ +dnl A function to check whether the C++ compiler supports flexible arrays. +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/ppl/ . + +AC_DEFUN([AC_CXX_SUPPORTS_FLEXIBLE_ARRAYS], +[ +ac_save_CPPFLAGS="$CPPFLAGS" +ac_save_LIBS="$LIBS" +AC_LANG_PUSH(C++) + +AC_MSG_CHECKING([whether the C++ compiler supports flexible arrays]) +AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#include + +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_flexible_arrays=yes, + AC_MSG_RESULT(no) + ac_cxx_supports_flexible_arrays=no, + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ +#include +#include + +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_flexible_arrays=yes, + AC_MSG_RESULT(no) + ac_cxx_supports_flexible_arrays=no)) + +if test x"$ac_cxx_supports_flexible_arrays" = xyes +then + value=1 +else + value=0 +fi +AC_DEFINE_UNQUOTED(PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS, $value, + [Not zero if the C++ compiler supports flexible arrays.]) + +AC_LANG_POP(C++) +CPPFLAGS="$ac_save_CPPFLAGS" +LIBS="$ac_save_LIBS" +]) diff --git a/m4/ac_cxx_float_binary_format.m4 b/m4/ac_cxx_float_binary_format.m4 new file mode 100644 index 0000000..331e46a --- /dev/null +++ b/m4/ac_cxx_float_binary_format.m4 @@ -0,0 +1,103 @@ +dnl A function to detect the binary format used by C++ floats. +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/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 +#ifdef HAVE_STDINT_H +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#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::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) + +AC_CXX_FLOAT_EXACT_OUTPUT + +if test x"$ac_cxx_float_binary_format" = x"unknown" || test $ac_cxx_float_exact_output = 0 || 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_float_exact_output.m4 b/m4/ac_cxx_float_exact_output.m4 new file mode 100644 index 0000000..da94c40 --- /dev/null +++ b/m4/ac_cxx_float_exact_output.m4 @@ -0,0 +1,130 @@ +dnl A function to detect whether C++ provides exact output for floats. +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/ppl/ . + +AC_DEFUN([AC_CXX_FLOAT_EXACT_OUTPUT], +[ +dnl AC_REQUIRE([AC_CXX_FLOAT_BINARY_FORMAT]) +ac_save_CPPFLAGS="$CPPFLAGS" +ac_save_LIBS="$LIBS" +AC_LANG_PUSH(C++) + +AC_MSG_CHECKING([whether C++ provides exact output for floats]) + +AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#ifdef HAVE_STDINT_H +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#endif +#include + +/* 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 + +bool +check(float value, const char* text) { + std::ostringstream ss; + ss.precision(10000); + ss << value; + return ss.str() == text; +} + +#if SIZEOF_FLOAT == 4 + +float +convert(uint32_t x) { + union { + float value; + uint32_t word; + } u; + + u.word = x; + return u.value; +} + +#if PPL_CXX_FLOAT_BINARY_FORMAT == PPL_FLOAT_IEEE754_SINGLE + +int +main() { + if (check(convert(0xaaacccaaU), + "-3.069535185924732179074680971098132431507110595703125e-13") + && check(convert(0xcccaaaccU), + "-106255968") + && check(convert(0x00000001U), + "1.40129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125e-45") + && check(convert(0x80000001U), + "-1.40129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125e-45")) + return 0; + else + return 1; +} + +#else // PPL_CXX_FLOAT_BINARY_FORMAT != FLOAT_IEEE754_SINGLE + +int +main() { + return 1; +} + +#endif // PPL_CXX_FLOAT_BINARY_FORMAT != FLOAT_IEEE754_SINGLE + +#else // SIZEOF_FLOAT != 4 + +int +main() { + return 1; +} + +#endif // SIZEOF_FLOAT != 4 +]])], + AC_MSG_RESULT(yes) + ac_cxx_float_exact_output=1, + AC_MSG_RESULT(no) + ac_cxx_float_exact_output=0, + AC_MSG_RESULT([assuming not]) + ac_cxx_float_exact_output=0) + +AC_DEFINE_UNQUOTED(PPL_CXX_FLOAT_EXACT_OUTPUT, $ac_cxx_float_exact_output, + [Not zero if C++ supports exact output for floats.]) + +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..5292002 --- /dev/null +++ b/m4/ac_cxx_ieee_inexact_flag.m4 @@ -0,0 +1,132 @@ +dnl A function to check whether the IEEE inexact flag is supported and +dnl available to C++ programs. +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/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 + +#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..8f970fe --- /dev/null +++ b/m4/ac_cxx_limit_memory.m4 @@ -0,0 +1,116 @@ +dnl A function to check whether it is possible to limit the memory +dnl available to processes using setrlimit(). +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/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([[ +#include + +#ifdef HAVE_SYS_TYPES_H +# include +#endif + +#ifdef HAVE_SYS_TIME_H +# include +#endif + +#ifdef HAVE_SYS_RESOURCE_H +// This should be included after and so as to make +// sure we have the definitions for, e.g., ru_utime. +# include +#endif + +#ifdef HAVE_UNISTD_H +# include +#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..5d3afc8 --- /dev/null +++ b/m4/ac_cxx_long_double_binary_format.m4 @@ -0,0 +1,331 @@ +dnl A function to detect the binary format used by C++ long doubles. +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/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 +#ifdef HAVE_STDINT_H +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#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::is_iec559 + && (convert(0xaaacccaaUL, 0xacccaaacccaaacccULL) + == -23475151196235330448360987288488448023604990597437922665537894499317141030270831473500040521309097782521743811281100731620612303910141158923283064807755815684643856544564541670181998003713114595098650350075763370916908460284838902787487703020001649220669684278577319085319204471093693972621987808779314674903648668236688723332999785552894845325917244897920804830290985291535343986477508649100409893486651507134071296739623686984014433965803259868867855465109457220731656260670349710137932272802677796915669809481885196101414678015638835049035133835457854893845093496950772367562664955830097293678125205138879788670490610650322134182370990336443894886171520732434535881085387893610114822547025980969387956199048733969351859470324032549906964255557877860343871346618951696178837035563054101786829980983909935265617095747543882856776297861197958453847978446679149969948882161264279705948735019353220550905117946051015070744207453853343171175921378515361160726195198161165083475968.0L + && convert(0xcccaaaccUL, 0xcaaacccaaacccaaaULL) + == -3.234349908433673569788362433758236701401379200386310478070230491201716094576208088733092209352711081763530973139439402754721006217889031902309566905344106766697050593355851405189694125966100801537593811320493850579152938679705465870788684523518541806158791408378718596936132854683425581754205242594614192465876640102628432246897674583649745467641139234207139584810101868772915312454075582265240687184279243861217351667059920878236164506473261797703393981510799228030778152399657445848839855361831637014754038570644257393307922665529947406582062857348101442206039278033447012163028384634753160589791458287895963629514043345016273218385584012204321293761500625038828699451659598873739820939586314044735551522599884065690704853850058509917597610804664086074437219778400030370474948166770867639885264893441594112815147445129222900623635467542926999246959939000796968650036727515644358583656635086409945418378371210848857160579105176395869221692977516017583375976424496977231821652434877830409470264872173686708172667000681514442371517343085468923465834742925914605731609765839631967460042791316319023971980691582832232860491668014341598553021017317450989919240909832141247027104138677882497144506317212033031539627613710631490195651235049780490963461514410018833968072513381369320107740021476622121320911875995678620145217379068502893509758814753434218746970000807381369855297087472398985134583394635298304301976743682254755898799853471470973139487587740504614698965906370516694512439128548402418825952236144896863935402725154209604537541130862513767786738372717442238281296070010302255703329785136750848608510805269562580550421695335686256291415407706167513127610045830074144232174636354465520547408627155363076530824695464544496846799567213412195115628936631295933321590908845288558910694118404555858629368018552451467994715743285452343185080572139353967831950470208768524113647528966442712608411306460439403733081312454377815407740431356862292588345515142587184008493066353603658341268923669196617183622259532802077159684815974630350730226266887950469523895272137382682818583664766982004756872470359454855421231861600855405622250180301557001727658100463825721179482988287599820459238518127671242515104954727268296043840120459189992322364113432317376499876615018647681005294400890426164141474245830847447887800872845238979407896829797297990804023745291564182356173092302630416583955274584512411637160723327887646112927503049935866004964114798241035087343318592736488780742013424329479787548324846879335440582948017481856461250014099199025874264395426269044157577172368261822794071985989844785134561848837459343219269316428175168803982908920457749528709425299296467325603578851955843550406474402944350694486492967809731047663564513772408591390180588458110788180950470244902062953534590109356800048878919144043979000989724521292698054747484439706733411566872999353418986588749568995482953622089499726327807058708520455805869817259837526415584189633013162307753166636151833127563746069733440228640737257520299330767346391011026088684503955941755171481192133779119344715318224728775697330484860348152872987113995597980243907204928634355356748752501217143216601222634344211757170284222785899530754663487291354339744025299042982320199789070467212765859078265587040664859899997109073649635056953085131587344086263213972132295294758682559609365238437544701417284297826732242650999654640698637095193178119502815643930373741504018967640638120546136857104880094633373762586018322104925768619990210092851075031033451925224377383389610824173203445111896055901190132142204139463967556738295382942065540228560332044410017389129348710403201272349054427064370609913529996988445571571382916349536222256815467149849706750571813156961918737343978667568453623162377198802996342528197935118265696537928993634621119483415202847968129550048667353312481509419740177690982818603515625e-1634L + && convert(0x00000000UL, 0x0000000000000001ULL) + == 3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587346566858083349053123705193988703983308587839946322501468602459466376586870456423634710242397194658860357568067134477982764219736292817751295560536845761267846647908517463250923736039512722781415953366096399444403402117053488448021977763604437908687623249034116909294550532283554604255016471048510990155249694820376175072774521597924829264164672829379224834378522148847524461653340453140898534938901079999466084995792940867082225167898092626332284133633537230365710606672711016101696986908545526816093446785575823545286456670464909287063062587561930219192839574686079732400741932670792586584247903252601714502511652018733705556477669856403061671860988301022089008752404238293812121415758527179547281628232710885994458574715033852877595426024800791719981955344151916599003503828822200355665967958771090937688409231050763744882094456320484272716122798149836361660589595209083576887254232532955229749892640550762959438241278496193819382077545905461172547961340469817691165676094261320725727312607482937653140421619686103059529199421431937449566099337396063075218302243845475341677972462038126626903408167086517545386382155008956065955410392914952623927880847159533184535486666480480563407531428385329300522477684217050951264747454635754866214784941542315111038630684391425212439304190584122374222972284606537485052464648655369719099026760518287560996997210778473066980129427427439517032390964791367678221749630975419713438139162678878555999177528450882748046538588177447270306738234898502976902853001364550405227287093940058325788585457368654991956265863050083472087623066020903378919489920975190829421602010382039477772083400661519154972695436582305021910908576692048173534958894170976763084807837402813849227540942073315401115262334876815962087441302256558438912500607230205782013083674113023497612445214795170983848687988348203289441256908755565216081815151205638893112562415329084456934095146184469290901166110634875590164835606941629407489774379792739804674764243483912084691871769225446506284310565309190872477286255925383528545036360550854226919571246361133225904820301916588317084377712259367894846411294822587075835486985645510829880528578782698412556249274522235061092454342386202327120407827540333914613192189174315884136688019435966273663470431440443032136411775605030601436837063972690330417475187330200911967500496761618122614796452937124070398703890868915527051490465736745397764941094879479649438162576614346948652085308024696358256756585794568493319042053882843808180358787110774418075478801186519577416271896383169835708225636584654568643702618602433548938163720732772538345454513065011540675765510656970500413537205370067924880209217363407323673368448004904408413977741706965494247040799786451861822188473571257556819433284087486023676249467869483631380473856486239547015603318322612783652068699798539400406637311682731115340677841660240710431551140370410375585572939303084073843540702120551963050514959945741359169911676575478403279380112020347348292538150798320452794842427526501796852911863108178276638472320237870082862271763396195139513712303136194366021540830531456910584048372546025177765140460207112923151923176402146752868221966889915381596481253160696822260723194259521813054303457222367967929268763072892355278854714278243863110783067060124459039315528176840304931522813148745824350892130595015198002557204332483215551447097512510076223364801202888087635650654634946887232727623906459076670227108634162319210357007273369354657187569046394884895083794103531835959613994575377897775525461977464747518162975010091463561925032742645594645800581600698347817023194379921397347681150492687237349021564206463096138703201250277757980410772647014391579144424375252519766764670458008515297647624144814453496069685127439800629552075692648608681506879044376428977463175175205181547958459515159074701285838493694034007662410100183533141516684185460758175066481561018901133031951042099053297118837448984443230856642737606478787880285299903521855025612413471034466624171559209077538498475106811294029060334271803320566493935024621719717684804443351866946690525266060758332190531807232565501890293754259590947433140384335366973398816899253698302119916142891631005349335372158005779944529176735887193980409288474621694590303098552382376969442365186023130985507823617670051191889015351479659778676132449671642015059540438237303922903056079068344635440276772565425944329927654906262952475555750912023879424636021462043321631428365675851865654901693474343411406220907550090045689588323936814675126103464401223728058185048320475251266882875299120582253090033177883674432343812734123922042926554908548231473285349572210962289889800994026533629321464700552029391517293055196218065667251276237490129206098414338903210942488902792253924667941082273267563528653863343443486495762400409978995985052082310730277076965242846278402568285187365588876653245423047205943478612931964211293489374119565751486787204884502307512372923973119191125614068756094526892783321688030310900558025683455451898487401139315290743477461921025987905332236299398859448938742087487316288730711068752763449392366897236258997091176996253284306687635454361862179407191652155243650619571720232128624130785404930566805029233271375546253313287446285812219961565022654510373870581648214791139170870970509074158721967633425471550515801498191107216277620692347014234913527385812164834475002007099402122991439542783981984927181300669603290190495106195784248531299740262706106798338573523977365240941293695214188675632715447081372252551022981921251125675131839210074132286029621443262127145872022404314258219255606415280218445074654034790115075558513374422753617188198385931164810182817002794172279803028202086567081267453349341345496389239379776494419022301042067986600501045466950004057134726934147691678031986698845370299987067384407310337433828116514830745374490760171672152978595040351405572526523026051215093709900567873568385242574546385008567738263951532676549294356417565797771595638496719149577804216291892125541055147173723744991756669672459021375111288754125372918394417976243093028214703329386031799313949535161343892720409046065009958980978947997662545514664194262097665297242612367968766000629174655887090824363583653843658980277566031286429628476318572915045823895805826010132712977834418613468288832988547377174550796802573148684253294172285056777826927377158058647145403557721233512002495437339413998842782599710186215723437958154275340509811072349041046483806284608873394275718878590418692809288333423522781240698974441829879303794241455852776713321354870647251094720675572322788447908778778892116234131617608416732280987493141331884927860259324392781255786150891859203497212615916404999097067778739914857961305884934678762043515521190581898256624635957830927811421154992139986999936203631149852372802564314896151749326404428772008250428569338329698161850171265411426708113723558325059062871506712838460986031147060351491506316012532538793354499545667009527573810892048004652452452139688789392912938251888341298122235232861138733903153560967292104241190946350516769769305030762386908399592555043192236069279491224465826684203312081255431851756341234566913972589390601558650830437402045595207689996159597545711808203688318112918947661662115802919578636403430323041610018063696707221249826383715263388850307418469423973486747009233945036220901518185766942733836846126816638158345048782728241251279820310193223512959111029884002230571688216854282257873218631744450950552327428952538149545262779889824399028513132208638633070602135522752076661567872472325125674291268881849101416382703647451428232847993332157180794015036365361645888146355749366150209085457189187232786399585879941680370348141105404742298452497895369287193974496140445677301271403589665822911096832952021181343571136957607816318342755770560406569920261633966403484121679869542684843686908354373688437968683525723666121485947946747887572716360800696442816474113593466106089204179554677145374582437962664618883018628687510079511252556002241788346284019750863992283906513572325918053464080643521532154825074820239077990779007069588034029619562190416747359712884084324521598678178890186409451480686781733176824920276835002477523486093586963733155424491897575495851549527034538337694314953057164019215026670773910997443279760005290641511584707193226351271670439775141076552632736166117611394934325673743882365518318561208941552931629125136799711574578916741023587251428998946963182411650554404206416336487418656105333038545773960190949602850096208569085230228708894874577523512558281973392961263921656163963369388411763476388625952406901518273413037068643383550282962237729195901788599392876651086599849223994259145259240479384380657803498058719062529007339428316229997756899857712116922758683071707472935574499244978419788171338468471751125303860911589289400806637202920429489919870263415951660888975434827304297451362325052693482001524843171229078467910537913138115458626612024970730899515114301915281613929239329351501049859225274564107846818112938339161308943153205117651716380468462296193882444293370484368530096898812778973178284912798550245246063411918482638261694029245273291646707331594675213428158755273882438357960245064051015888918541801139771619743221405037797285669481455810653320008904215997597975907391512026214020012010134707536774227636477580918167507850485197065326391091171451763751237612739498468510009055480025096015985581769370179656781151306565952590101977398335185042637681982306448413722177895665290302796223004198526079143104070007874540548221582347389579e-4951L + && convert(0x80000000UL, 0x0000000000000001ULL) + == 3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587346566858083349053123705193988703983308587839946322501468602459466376586870456423634710242397194658860357568067134477982764219736292817751295560536845761267846647908517463250923736039512722781415953366096399444403402117053488448021977763604437908687623249034116909294550532283554604255016471048510990155249694820376175072774521597924829264164672829379224834378522148847524461653340453140898534938901079999466084995792940867082225167898092626332284133633537230365710606672711016101696986908545526816093446785575823545286456670464909287063062587561930219192839574686079732400741932670792586584247903252601714502511652018733705556477669856403061671860988301022089008752404238293812121415758527179547281628232710885994458574715033852877595426024800791719981955344151916599003503828822200355665967958771090937688409231050763744882094456320484272716122798149836361660589595209083576887254232532955229749892640550762959438241278496193819382077545905461172547961340469817691165676094261320725727312607482937653140421619686103059529199421431937449566099337396063075218302243845475341677972462038126626903408167086517545386382155008956065955410392914952623927880847159533184535486666480480563407531428385329300522477684217050951264747454635754866214784941542315111038630684391425212439304190584122374222972284606537485052464648655369719099026760518287560996997210778473066980129427427439517032390964791367678221749630975419713438139162678878555999177528450882748046538588177447270306738234898502976902853001364550405227287093940058325788585457368654991956265863050083472087623066020903378919489920975190829421602010382039477772083400661519154972695436582305021910908576692048173534958894170976763084807837402813849227540942073315401115262334876815962087441302256558438912500607230205782013083674113023497612445214795170983848687988348203289441256908755565216081815151205638893112562415329084456934095146184469290901166110634875590164835606941629407489774379792739804674764243483912084691871769225446506284310565309190872477286255925383528545036360550854226919571246361133225904820301916588317084377712259367894846411294822587075835486985645510829880528578782698412556249274522235061092454342386202327120407827540333914613192189174315884136688019435966273663470431440443032136411775605030601436837063972690330417475187330200911967500496761618122614796452937124070398703890868915527051490465736745397764941094879479649438162576614346948652085308024696358256756585794568493319042053882843808180358787110774418075478801186519577416271896383169835708225636584654568643702618602433548938163720732772538345454513065011540675765510656970500413537205370067924880209217363407323673368448004904408413977741706965494247040799786451861822188473571257556819433284087486023676249467869483631380473856486239547015603318322612783652068699798539400406637311682731115340677841660240710431551140370410375585572939303084073843540702120551963050514959945741359169911676575478403279380112020347348292538150798320452794842427526501796852911863108178276638472320237870082862271763396195139513712303136194366021540830531456910584048372546025177765140460207112923151923176402146752868221966889915381596481253160696822260723194259521813054303457222367967929268763072892355278854714278243863110783067060124459039315528176840304931522813148745824350892130595015198002557204332483215551447097512510076223364801202888087635650654634946887232727623906459076670227108634162319210357007273369354657187569046394884895083794103531835959613994575377897775525461977464747518162975010091463561925032742645594645800581600698347817023194379921397347681150492687237349021564206463096138703201250277757980410772647014391579144424375252519766764670458008515297647624144814453496069685127439800629552075692648608681506879044376428977463175175205181547958459515159074701285838493694034007662410100183533141516684185460758175066481561018901133031951042099053297118837448984443230856642737606478787880285299903521855025612413471034466624171559209077538498475106811294029060334271803320566493935024621719717684804443351866946690525266060758332190531807232565501890293754259590947433140384335366973398816899253698302119916142891631005349335372158005779944529176735887193980409288474621694590303098552382376969442365186023130985507823617670051191889015351479659778676132449671642015059540438237303922903056079068344635440276772565425944329927654906262952475555750912023879424636021462043321631428365675851865654901693474343411406220907550090045689588323936814675126103464401223728058185048320475251266882875299120582253090033177883674432343812734123922042926554908548231473285349572210962289889800994026533629321464700552029391517293055196218065667251276237490129206098414338903210942488902792253924667941082273267563528653863343443486495762400409978995985052082310730277076965242846278402568285187365588876653245423047205943478612931964211293489374119565751486787204884502307512372923973119191125614068756094526892783321688030310900558025683455451898487401139315290743477461921025987905332236299398859448938742087487316288730711068752763449392366897236258997091176996253284306687635454361862179407191652155243650619571720232128624130785404930566805029233271375546253313287446285812219961565022654510373870581648214791139170870970509074158721967633425471550515801498191107216277620692347014234913527385812164834475002007099402122991439542783981984927181300669603290190495106195784248531299740262706106798338573523977365240941293695214188675632715447081372252551022981921251125675131839210074132286029621443262127145872022404314258219255606415280218445074654034790115075558513374422753617188198385931164810182817002794172279803028202086567081267453349341345496389239379776494419022301042067986600501045466950004057134726934147691678031986698845370299987067384407310337433828116514830745374490760171672152978595040351405572526523026051215093709900567873568385242574546385008567738263951532676549294356417565797771595638496719149577804216291892125541055147173723744991756669672459021375111288754125372918394417976243093028214703329386031799313949535161343892720409046065009958980978947997662545514664194262097665297242612367968766000629174655887090824363583653843658980277566031286429628476318572915045823895805826010132712977834418613468288832988547377174550796802573148684253294172285056777826927377158058647145403557721233512002495437339413998842782599710186215723437958154275340509811072349041046483806284608873394275718878590418692809288333423522781240698974441829879303794241455852776713321354870647251094720675572322788447908778778892116234131617608416732280987493141331884927860259324392781255786150891859203497212615916404999097067778739914857961305884934678762043515521190581898256624635957830927811421154992139986999936203631149852372802564314896151749326404428772008250428569338329698161850171265411426708113723558325059062871506712838460986031147060351491506316012532538793354499545667009527573810892048004652452452139688789392912938251888341298122235232861138733903153560967292104241190946350516769769305030762386908399592555043192236069279491224465826684203312081255431851756341234566913972589390601558650830437402045595207689996159597545711808203688318112918947661662115802919578636403430323041610018063696707221249826383715263388850307418469423973486747009233945036220901518185766942733836846126816638158345048782728241251279820310193223512959111029884002230571688216854282257873218631744450950552327428952538149545262779889824399028513132208638633070602135522752076661567872472325125674291268881849101416382703647451428232847993332157180794015036365361645888146355749366150209085457189187232786399585879941680370348141105404742298452497895369287193974496140445677301271403589665822911096832952021181343571136957607816318342755770560406569920261633966403484121679869542684843686908354373688437968683525723666121485947946747887572716360800696442816474113593466106089204179554677145374582437962664618883018628687510079511252556002241788346284019750863992283906513572325918053464080643521532154825074820239077990779007069588034029619562190416747359712884084324521598678178890186409451480686781733176824920276835002477523486093586963733155424491897575495851549527034538337694314953057164019215026670773910997443279760005290641511584707193226351271670439775141076552632736166117611394934325673743882365518318561208941552931629125136799711574578916741023587251428998946963182411650554404206416336487418656105333038545773960190949602850096208569085230228708894874577523512558281973392961263921656163963369388411763476388625952406901518273413037068643383550282962237729195901788599392876651086599849223994259145259240479384380657803498058719062529007339428316229997756899857712116922758683071707472935574499244978419788171338468471751125303860911589289400806637202920429489919870263415951660888975434827304297451362325052693482001524843171229078467910537913138115458626612024970730899515114301915281613929239329351501049859225274564107846818112938339161308943153205117651716380468462296193882444293370484368530096898812778973178284912798550245246063411918482638261694029245273291646707331594675213428158755273882438357960245064051015888918541801139771619743221405037797285669481455810653320008904215997597975907391512026214020012010134707536774227636477580918167507850485197065326391091171451763751237612739498468510009055480025096015985581769370179656781151306565952590101977398335185042637681982306448413722177895665290302796223004198526079143104070007874540548221582347389579e-4951L)) + 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 +#ifdef HAVE_STDINT_H +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#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::is_iec559 + && (convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL) + == -8.55855653885100434741341853993902633367349104766375354667159377718342093894815477326286823233135691805519944470138219932524951165689852082013017904043605683486724317550972746307400400204571080045247416605879743573136814766221652651396476675668866980798618379071105211750397249729982891787041148520384572930274879267722158826932337019191713973025403784448443813348692062209940856126724493492803365972504505177354875652033856070760087261648660638833868952644144747756799606849182265604546917705495630867683634260396102823982577953799017062698102242357552179655099799114234932578035799185560231199083485854936098752376968393647581458407558794412029383325763638562788717260040049064497131924995762524305159587498016677454321953274959044696323291625045478494472581264819229447771276640446297211105522340278216491094195598543872903469867733674572559977106495016037365144714092305087690135013719347274733034998868445412589677425060095799279101903473205374412225289846468374532481297065712317082077938035156602646698351182648104255704218634101302925067087078955133405900007044267209898310644310904503791609310204530573463263951434586894153990739119187567218316060343579381319744970284036645819031296341711196622764674251739340075981861518157380656135644972541894187627902651874054588734732906342927804126694032667794810086817870907476586539935233288396561987441453006798066121939082312783518917156845604116991071351557087417820814737448930366014934139649936714605919733198611573267554373841805458030152706709963798138766665437195696286204333504023648063774567253657433115103351104190986192714072985487851579415615609526545777708652951405409847708647802254957197551148967040887700676749608935220270768342493900689974647088468653016844028721111482484905641458435567969469008688175230469940968306817582881926746422674891155765989419578280531847369896579997902056370886853884911608932917273377526774091310024267948445090595150848945937264274298230316059283748541372546998570685254364147022857127106166375807928861080771495427281772909457414476961102929683460150380091022216902985688084496718499522925736236100966839490544989265028487132166444183820209811985298620037327410566483546092567386575203772065259924817078378553423445114795887961447486917127608105936488957460696218995227900239169698156532097505472359601263421630872600694896078087993492528322817946497772710008837719609909497752428441503174822795185219988589528998338631725113908025553153842511443825016809012668839505492083731555461826355018782953670089090573806418379608917728933789667567839232807208925449602517595541397929042673972541764273293287457694772131268012143158809453627483947788463130353101911401667613659585055576869155534998835800762122080588150495103765874874613454517177121048246498282285280904742153700877576028449241385429235777250684782328183787286276152331338688335510090441008799792147837436640030059474106105829612076012626498555138419516242851436828131901668517305064107076254421670883938440896580435257206350630093337919967881954501164988008085285088049681541452106188312639266136685237513628484410146475880276899689323468288129178652504797093820419402611691354199968499448738482587415636727937353639264845197813295922091561637504736126720760129127710879063043647425297778439069116811334073539456451043564046959839163407469915211595468718792531664679340442279513006653831781499155674396529973036072198720572542914738630057353297633085013244779323578115668031532144051510758240504037804690564298890171218568053886450388507561335540224075309922339483204122333658701871584147135738144358394867585372134490396264937274938848938884293776466212293402264641368524174512841804801230279990820989956713963566987970818315606031084417487965298373510594915942429581446481759482857537804431542098380533075194397625795605337047384493682506827547173206735463795863376044170821429161475172513429888642402089329334654087406739184258619435041737233405001461505889892578125e-1644L + && convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL) + == -124514581107511552210796456934966803687304842980295573828954497922493752983397188814711304411560018580965744046315133789985274208017368151964100284400784216106649187287727268989948309893335776137201236307422254490384994342132786695251856340822607539332337741185911979986209464222776112117543477310592395735321641016191765613924234896253051931334188353106422231052895112533426462965071195000083346118845388851222468275853899619767858364593491745895616655921022591572983370616010095670881627966440183912948095715866505356803258659518882310562527709556367822539262111581385341941163873435919341717170180065638145777392282815973491833042960716493005101610346003273833563515742996380936304245423639950200211170835546053201980835724318930743625600269679260909350277600256315069013053332133830043213033329696436217829598890872375814523266366034383531514035947792389939922899745714167418517458817088636450662300503353562047987996978943856662174717195437379600755109302771921946748859230686543872.0L + && convert(0x0000000000000000ULL, 0x0000000000000001ULL) + == 6.475175119438025110924438958227646552499569338034681009689884389197039540124119371017671491276649940255878141476848119676587219886382542046685110071972617983042792710751334934416734625638471740239448526505553990391455556252171148068070822034688256982476272828789103028357337561348031062386564592639826226991907907867663262065711211583064657196068308332845234453069760526489447660964579313751403402631804350039948870075255648713368066117879403155766713303467434937062409411685215137607333139422843835051668983567167196802642952353504079714347103860537782893700215521168667711042950610021881513627986429461700433339201935397498825184335385514892844339930852967838448682125502304114122153045946465463084764110174478737044335312389661483639210553943411476544786261397875064191451226767614625892790369961415069606980007080502788648919975916801878222002252381723047230971876570995428821219281596547633023538783137183646396952831530551068683419596735374086746290525867996216905323365319885172609956827625511036332478353228947631880050684559150608318986521540136061273771493390412784756552103897518527764158778759333880714882279633323826397312375406927039446525306447838514371503654987855172306307584155459826707095909617752526800401326990828721633726770440915439092677906646798573524199116648264206920451160133635071361773812121716528178148240720783226736549623736135274990309138143183248371959875978805027500928693808073336955752759088442865600075199888998323880643549670055505421362435108572732087322982027187772459231228989472372951864321099261878781084330252988333921362998963303722431059741968763452406953835015120533773385289904710843628402700274702870474073825248828889984994284607604847211794221210729913159829014217168004461049532662696542913183628157199561641949923936629368992856621383084545327636972265542355341749855663020004887316835216156767223053799811067258913808469994232607858854524064432145775922144535701236468985705212977045479489515690009388923625580685788707605877343857669170894656797423368490329407251160393356048820607085089069025413584269816739747211239513550414383117508826763143512862006497058041145296097892917999935577053234252698691933792724753682184537682835562829938630004838384363944243137622864918257474256280127291116965050600178120477720784742184205376195975831677721764740044536624645764471381571452381830125398765152083287483110279394697855915713981939970684599199594863007230624076786139617554631450734995190081932187616814234632738778224433256463738346435274905710925581106061273840975592931761266799265587765468946764337085192369358316298457450008809428586921504743730873895710474614480003727146162349858333291516552162545370312200390841588309480973274631646273597390249477746657131891196482398670118797910098918899689482196956660638225731960693542763964302308999692957091061300183648329785182793301407267200046383043005236759977387601407769110383295729918654520937785586390633157020347632812108728638589813282569529576769367173324764085285705308312954957401558247168739931446569422818723482471097374362105279278558570746278168331596903799527959001674856155564619821407044799720020620642233246057848236476047540762849788325435630592420194490443539428990899488655890183886788650518595542180257939200539645041808387760238189562428351774632440622618056913137499820021924733173668036806485733443567039613866037176155955253827548473360440517049422696075501183292573063250613021167503858561082238374439193413231472608072888733326512853287806773389073299297372760244397355791502004654458118728037510329034120643030182346716011974996719598934277635297762958837247389366909763367493682299430362668996193935405226221180280462691353912282455701759810037116439968883639596108926413528826200502511551071661541071241892319070812994269518086385295992381025957172992399312141414210235547707008555590049509294048331178258885645254295737834927590332773105843826797756540039810295021699037788228205072146738094320261980823252096852875670591366194556595549470362090317233349128160475626293246538430039226463877253517855062981890058712415866578727694362877805078594115939049922697215689139042884475829798201399221843339843144334329750976265054375898637087619406776357862341599539585772173362569929723217313856218610739079911693928395573354107695207924389443047735986097057117102761647398583746704066222192489628491579241861512228457942727677656217068060304063431859444999092873095546808035894071193872676924207893595051334067870866978585241063298399448801664979503576258730853137762656715932674584878408765074348715350808211160488037567370082449596914044378631384351574514574407266268601518418121140639017772950755439822352142605465639756330937185434812776437455170052704254873689525989445652781559474644227537684964321625946200647347726100468875445797592291192363724641100602571723960104389727561487616213893880158699261565353860394268412519478250755882121502350855777548987354957187611364644347783460623918569790357712078708030071729862147204119062003145783057657964335620490686654777775857772417230654005669380137272188650104502859563282535642734533430567287319498304528915876638370296607209654727246810120749147011579846007686876872348978767610197018167444101532656500699586407674404325249380187066956228877621206281130141035339929259895087216809976356039304176324615051223863642132987493989282096132023719628675179659793099441124234181354583082636306115430335248256636595542753063577946177399294336318459611754831189657065079679934928129113295189411660749306226747061753316760480290760846421347557553607185254462514991634789163215592554565288625021429064594217444034435094635489801294636044217141894128608560200837942901104014713783039046587228833888032709513732700101667002833885010142407620233438106861087062055906874872893491133678484259720820886397724438939944326449942516696628683510030426237257765426269532595248183289611602373952305073827029425838481007443361481172033664199893614932623554378101313353925699162767581809444174957293532641034112367163940472496454826645496608268491435975330754792022473413254641635309131365360013914909519963236046952897089347016136738984133133790874101143168691022141918967797877476450100585067348766183224990814253610763592974731784263832853675045343246533254966131311531411068478710429786791811404658680805588105768518292098129259164151153126615341498379324353953450723874092401152015787628879390603785057522375088322779364007018433582543673090990833352296302290390165336647355242365982903670648563727239283547241202029021901993493453231407543942533374303128855544718854681133818703717309615999563617026069360208156393214924333856037726771259857931298487909006782987195926835910537279213582905667384935745871483880724959685377284455451325009389359115356341859747548302075715614439876712304113995679250907454883895302396632381653230532032695481751231940062856024456656381220713413431325444483757534262449339675147214243079144598658808202548926312120596697863356554722348114194969409174072455372221354826189882023922524876054935905929454258925505387898039528329076689551108932342856243697999637938228068665595345855978215420274558562368590236467711884770512666328306756286559348574636272916414332349992225277379071952095234443041820054854970323931404077610323730988914889188356127533914074856107086479831584739755622106834971368997334246432264012757261628954213626177797127289818357558926591911175376134554737367672941224416966599144520688033032388494464597481600684233179969688713377153969107014820586500187890028419759966629125896903859724482018551567368459339437282027473163713630554370146518281068049701849575089743432349308849281456182745027011845653626290780738299181305772482001250991761047543344790454625943156085044661103576512523366161351099640751135385148305913987889008698009234370941891346098306437937661227172386506980636903743541285235605780167216008920828610842066522096589500420940606405692664109905063234866117077516308694175709123219476283230290207497555159467149979347020209673500496651023554475005053991295374430728524771212435107382664318842703197811901075027036703041419315229156263279708865064004473392401710817533040210152757966691416471836361498546249180866049039738294265863864925406135752428537159880132061042828090772733103561437021070938835520484987564784902357826645006185384847299711513042558913116550679842981785737713725790045128094411676264858573201529073678073396387519268373798582548263868592119666097381189255247190641352195443081432945981901223716745712543744847146503012460085216148335807619624528396069010370871981642712755932969484501155184487454597846375782598809708096893645439856478634508146859065978179351007580744928974114529788215226484601824974140107352758776378993800008479463640459773788106039221647527915619638375897279653946867057366337834721265500081035695372958187077367633848426351345959537644131255393886949828040966112768013745671476622221973172299021322723830684345054818157484501760113734299662298242039459694484074671808880126261963999301400833575366587220239180443885948634911432672454909578479586976064598126633177835011824812040440090529736915436564330317784343260941419199007994565556336195654994767768391641843167291242587882400091208124348669996343070061026732554587428779976439512259161737036335847682346728539549778493388870528102969822923976454022477322075204905420377823800876540724560782242540043358494305758648390071388556142954991440895026034342297754624387472732697423260211014731729196139172514053952591428247887383243344755389104496037975360677224765591211970382212225942797592005272680787386239303946689423293709148965999400795905073756697025967564396661027489606337872152854151887574400979150870295978066773059913103141338094206140446153595784659696116999451265627049162745281492831846033865707908304944975732574637090102130752860241496159897720566523711477673910492376257245019657271734451417565932034846341070093018262777507790026122302775680179025723685230883459924631462602175535978001836273235741164283034661871238537285831967107455175175353583907073921428e-4966L + && convert(0x8000000000000000ULL, 0x0000000000000001ULL) + == -6.475175119438025110924438958227646552499569338034681009689884389197039540124119371017671491276649940255878141476848119676587219886382542046685110071972617983042792710751334934416734625638471740239448526505553990391455556252171148068070822034688256982476272828789103028357337561348031062386564592639826226991907907867663262065711211583064657196068308332845234453069760526489447660964579313751403402631804350039948870075255648713368066117879403155766713303467434937062409411685215137607333139422843835051668983567167196802642952353504079714347103860537782893700215521168667711042950610021881513627986429461700433339201935397498825184335385514892844339930852967838448682125502304114122153045946465463084764110174478737044335312389661483639210553943411476544786261397875064191451226767614625892790369961415069606980007080502788648919975916801878222002252381723047230971876570995428821219281596547633023538783137183646396952831530551068683419596735374086746290525867996216905323365319885172609956827625511036332478353228947631880050684559150608318986521540136061273771493390412784756552103897518527764158778759333880714882279633323826397312375406927039446525306447838514371503654987855172306307584155459826707095909617752526800401326990828721633726770440915439092677906646798573524199116648264206920451160133635071361773812121716528178148240720783226736549623736135274990309138143183248371959875978805027500928693808073336955752759088442865600075199888998323880643549670055505421362435108572732087322982027187772459231228989472372951864321099261878781084330252988333921362998963303722431059741968763452406953835015120533773385289904710843628402700274702870474073825248828889984994284607604847211794221210729913159829014217168004461049532662696542913183628157199561641949923936629368992856621383084545327636972265542355341749855663020004887316835216156767223053799811067258913808469994232607858854524064432145775922144535701236468985705212977045479489515690009388923625580685788707605877343857669170894656797423368490329407251160393356048820607085089069025413584269816739747211239513550414383117508826763143512862006497058041145296097892917999935577053234252698691933792724753682184537682835562829938630004838384363944243137622864918257474256280127291116965050600178120477720784742184205376195975831677721764740044536624645764471381571452381830125398765152083287483110279394697855915713981939970684599199594863007230624076786139617554631450734995190081932187616814234632738778224433256463738346435274905710925581106061273840975592931761266799265587765468946764337085192369358316298457450008809428586921504743730873895710474614480003727146162349858333291516552162545370312200390841588309480973274631646273597390249477746657131891196482398670118797910098918899689482196956660638225731960693542763964302308999692957091061300183648329785182793301407267200046383043005236759977387601407769110383295729918654520937785586390633157020347632812108728638589813282569529576769367173324764085285705308312954957401558247168739931446569422818723482471097374362105279278558570746278168331596903799527959001674856155564619821407044799720020620642233246057848236476047540762849788325435630592420194490443539428990899488655890183886788650518595542180257939200539645041808387760238189562428351774632440622618056913137499820021924733173668036806485733443567039613866037176155955253827548473360440517049422696075501183292573063250613021167503858561082238374439193413231472608072888733326512853287806773389073299297372760244397355791502004654458118728037510329034120643030182346716011974996719598934277635297762958837247389366909763367493682299430362668996193935405226221180280462691353912282455701759810037116439968883639596108926413528826200502511551071661541071241892319070812994269518086385295992381025957172992399312141414210235547707008555590049509294048331178258885645254295737834927590332773105843826797756540039810295021699037788228205072146738094320261980823252096852875670591366194556595549470362090317233349128160475626293246538430039226463877253517855062981890058712415866578727694362877805078594115939049922697215689139042884475829798201399221843339843144334329750976265054375898637087619406776357862341599539585772173362569929723217313856218610739079911693928395573354107695207924389443047735986097057117102761647398583746704066222192489628491579241861512228457942727677656217068060304063431859444999092873095546808035894071193872676924207893595051334067870866978585241063298399448801664979503576258730853137762656715932674584878408765074348715350808211160488037567370082449596914044378631384351574514574407266268601518418121140639017772950755439822352142605465639756330937185434812776437455170052704254873689525989445652781559474644227537684964321625946200647347726100468875445797592291192363724641100602571723960104389727561487616213893880158699261565353860394268412519478250755882121502350855777548987354957187611364644347783460623918569790357712078708030071729862147204119062003145783057657964335620490686654777775857772417230654005669380137272188650104502859563282535642734533430567287319498304528915876638370296607209654727246810120749147011579846007686876872348978767610197018167444101532656500699586407674404325249380187066956228877621206281130141035339929259895087216809976356039304176324615051223863642132987493989282096132023719628675179659793099441124234181354583082636306115430335248256636595542753063577946177399294336318459611754831189657065079679934928129113295189411660749306226747061753316760480290760846421347557553607185254462514991634789163215592554565288625021429064594217444034435094635489801294636044217141894128608560200837942901104014713783039046587228833888032709513732700101667002833885010142407620233438106861087062055906874872893491133678484259720820886397724438939944326449942516696628683510030426237257765426269532595248183289611602373952305073827029425838481007443361481172033664199893614932623554378101313353925699162767581809444174957293532641034112367163940472496454826645496608268491435975330754792022473413254641635309131365360013914909519963236046952897089347016136738984133133790874101143168691022141918967797877476450100585067348766183224990814253610763592974731784263832853675045343246533254966131311531411068478710429786791811404658680805588105768518292098129259164151153126615341498379324353953450723874092401152015787628879390603785057522375088322779364007018433582543673090990833352296302290390165336647355242365982903670648563727239283547241202029021901993493453231407543942533374303128855544718854681133818703717309615999563617026069360208156393214924333856037726771259857931298487909006782987195926835910537279213582905667384935745871483880724959685377284455451325009389359115356341859747548302075715614439876712304113995679250907454883895302396632381653230532032695481751231940062856024456656381220713413431325444483757534262449339675147214243079144598658808202548926312120596697863356554722348114194969409174072455372221354826189882023922524876054935905929454258925505387898039528329076689551108932342856243697999637938228068665595345855978215420274558562368590236467711884770512666328306756286559348574636272916414332349992225277379071952095234443041820054854970323931404077610323730988914889188356127533914074856107086479831584739755622106834971368997334246432264012757261628954213626177797127289818357558926591911175376134554737367672941224416966599144520688033032388494464597481600684233179969688713377153969107014820586500187890028419759966629125896903859724482018551567368459339437282027473163713630554370146518281068049701849575089743432349308849281456182745027011845653626290780738299181305772482001250991761047543344790454625943156085044661103576512523366161351099640751135385148305913987889008698009234370941891346098306437937661227172386506980636903743541285235605780167216008920828610842066522096589500420940606405692664109905063234866117077516308694175709123219476283230290207497555159467149979347020209673500496651023554475005053991295374430728524771212435107382664318842703197811901075027036703041419315229156263279708865064004473392401710817533040210152757966691416471836361498546249180866049039738294265863864925406135752428537159880132061042828090772733103561437021070938835520484987564784902357826645006185384847299711513042558913116550679842981785737713725790045128094411676264858573201529073678073396387519268373798582548263868592119666097381189255247190641352195443081432945981901223716745712543744847146503012460085216148335807619624528396069010370871981642712755932969484501155184487454597846375782598809708096893645439856478634508146859065978179351007580744928974114529788215226484601824974140107352758776378993800008479463640459773788106039221647527915619638375897279653946867057366337834721265500081035695372958187077367633848426351345959537644131255393886949828040966112768013745671476622221973172299021322723830684345054818157484501760113734299662298242039459694484074671808880126261963999301400833575366587220239180443885948634911432672454909578479586976064598126633177835011824812040440090529736915436564330317784343260941419199007994565556336195654994767768391641843167291242587882400091208124348669996343070061026732554587428779976439512259161737036335847682346728539549778493388870528102969822923976454022477322075204905420377823800876540724560782242540043358494305758648390071388556142954991440895026034342297754624387472732697423260211014731729196139172514053952591428247887383243344755389104496037975360677224765591211970382212225942797592005272680787386239303946689423293709148965999400795905073756697025967564396661027489606337872152854151887574400979150870295978066773059913103141338094206140446153595784659696116999451265627049162745281492831846033865707908304944975732574637090102130752860241496159897720566523711477673910492376257245019657271734451417565932034846341070093018262777507790026122302775680179025723685230883459924631462602175535978001836273235741164283034661871238537285831967107455175175353583907073921428e-4966L)) + 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 +#ifdef HAVE_STDINT_H +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#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::is_iec559 + && (convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL) + == -7.6048540943660203383375998875878002021755137452856942966991187375790618225432711954682137529456970686263412309600617913197560145993931792374946076061175594550915924955313391528566777352996816141138550473090399783817652516896553304678788796532976847530386107750759127004897950996937530751872097675156395937218234460013748219954603465088115161828048215763754331575034447236689765045674584188927116128770082933362914567237187017530082528540058002631800274192146485961758366625476271676375489358478966148719270989233284454992652229565352739884432045036085427546783826745250197623257802129011015273728848161395367551745780868250488191368846207890422268873532651627591649389757751752362072212699309947970918940313250863861141479770240104635553035870698789854752554391365757900620463269938427975381635241159694500569550818398323639621243086116154792038064941523448921284117826015673798399008555604372098051095571652170081985843614541956756469168604624857938653843172027861680499952062356914208628014745759010068414302636374017506453133466034362025545080555878082849488386388633197121003201192243150535143329731394874806398663589117246866205872431804204733617792317769570293754056793574570217834482046448788177551912250351735294891953434051815332631157674735614138641122106756749236824504094008852401427746414294902929999820878756040223246586814590339767277305131757114819123212897500810087015748205562614251410818122967399030151040544000563841334553718469935435435467196184665715776274355094471974036803615388313095637066824428688301387559074204015990782977635088047810891072724763113879034313256582868462323549141603475107584159170279311985555035822254439699354641467841523895459190280971487264907972306090449968125859834702627544039374770757804202780369083049631377117943503836158566134919890165392965694050010089785271180956974707841066789578714463804030217977213138932711313311673101336981407798868338574571646697479192174043005729926344062133712267722538847635563454980776602355539986984320762864338177037919835721981686778834558429264194379257521818498431326991615024245632036376472844033831041082865649867453234086495085785897620758602105639344460383483879837994732204331335249564434458633345708439547881275060781028856140511029543559841701048277393119691261302356763314623124427357421753631218361407626116820986377721964654181839884670481278855478057996766639496909094607181503284084821580817995489740980323820218685313435967428474842973086612053963343516426226771094376179468881265734324847319127862733279299033951360912038720313525324094079916937921290391173035983474894312808532257620563284126400481460163180987618432784215807933623038747129658746767737999870125917269554155887740155308886259497202672935871853706835670467770080598813171256855182510726902033818328368569915805303784312301890212694874227119220544172084552511408717615136830401766455214293141216171050374325461714383991698910564587610624980490526840861990674615172112493813749497898151186927777122955666180439323595468816129418014664347852590958362752922841159054568358354108159485566264221008508127941168192513144760720303715640604755054290633421601734103622748053919536319416025380484868142967373186019970714662893713233834399238357795019603619284595839414945178963942707310299674873908104634979966232181071013259653467885733418936194081202149071958107062125873498848807502257018093517304220495114497635240876547262237411350327960679115197531609627900227913193653254580253539005743563270152329126178570329413401577715075363838562221558204219798925982825556469998988615897432425107152113543617151738802778259560442930074253918797315241708532198010528564246933829811859278710445896556638416265987381678070434371355795025956293319362293063591248665429733880825207421011852020394068840244110140622151494488609575671090387230241296949998536132398625008053543954239573998167556201366323875845409929752349853515625e-1644L + && convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL) + == -99658331877181425640389193712445288804009112642407197633229907048864350192381814628233384153539524368748305269642704450459572458913058829202094408933558533552137589226430537671503754737153845553845646099179512540696038707395491223325946106007770844660381340028079827237033670900446083793353682761885084154898636897779677124010119288945740273072415898996441722571487815052387317025675191665761918119006431828756780493604546658949166486641354783002536071366287780290680620995991797712341457334946893188786269086688063732222194404683551757689083590842400866213237312413463207537587813396338061744078437770542720749055069473347142994267706326342325536219464867910547533482061181116137767384001927599515332824741827726661184966512254203502805790565338206862173475388342339711722457620964017690492860707751327158273522191943184085888284707357024653025991470473697475045491586713324994056478341556198451786713470909185879382607340766256394396819602885198511409676789226542867632933493115191296.0L + && convert(0x0000000000000000ULL, 0x0000000000000001ULL) + == 3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587346566858083349053123705193988703983308587839946322501468602459466376586870456423634710242397194658860357568067134477982764219736292817751295560536845761267846647908517463250923736039512722781415953366096399444403402117053488448021977763604437908687623249034116909294550532283554604255016471048510990155249694820376175072774521597924829264164672829379224834378522148847524461653340453140898534938901079999466084995792940867082225167898092626332284133633537230365710606672711016101696986908545526816093446785575823545286456670464909287063062587561930219192839574686079732400741932670792586584247903252601714502511652018733705556477669856403061671860988301022089008752404238293812121415758527179547281628232710885994458574715033852877595426024800791719981955344151916599003503828822200355665967958771090937688409231050763744882094456320484272716122798149836361660589595209083576887254232532955229749892640550762959438241278496193819382077545905461172547961340469817691165676094261320725727312607482937653140421619686103059529199421431937449566099337396063075218302243845475341677972462038126626903408167086517545386382155008956065955410392914952623927880847159533184535486666480480563407531428385329300522477684217050951264747454635754866214784941542315111038630684391425212439304190584122374222972284606537485052464648655369719099026760518287560996997210778473066980129427427439517032390964791367678221749630975419713438139162678878555999177528450882748046538588177447270306738234898502976902853001364550405227287093940058325788585457368654991956265863050083472087623066020903378919489920975190829421602010382039477772083400661519154972695436582305021910908576692048173534958894170976763084807837402813849227540942073315401115262334876815962087441302256558438912500607230205782013083674113023497612445214795170983848687988348203289441256908755565216081815151205638893112562415329084456934095146184469290901166110634875590164835606941629407489774379792739804674764243483912084691871769225446506284310565309190872477286255925383528545036360550854226919571246361133225904820301916588317084377712259367894846411294822587075835486985645510829880528578782698412556249274522235061092454342386202327120407827540333914613192189174315884136688019435966273663470431440443032136411775605030601436837063972690330417475187330200911967500496761618122614796452937124070398703890868915527051490465736745397764941094879479649438162576614346948652085308024696358256756585794568493319042053882843808180358787110774418075478801186519577416271896383169835708225636584654568643702618602433548938163720732772538345454513065011540675765510656970500413537205370067924880209217363407323673368448004904408413977741706965494247040799786451861822188473571257556819433284087486023676249467869483631380473856486239547015603318322612783652068699798539400406637311682731115340677841660240710431551140370410375585572939303084073843540702120551963050514959945741359169911676575478403279380112020347348292538150798320452794842427526501796852911863108178276638472320237870082862271763396195139513712303136194366021540830531456910584048372546025177765140460207112923151923176402146752868221966889915381596481253160696822260723194259521813054303457222367967929268763072892355278854714278243863110783067060124459039315528176840304931522813148745824350892130595015198002557204332483215551447097512510076223364801202888087635650654634946887232727623906459076670227108634162319210357007273369354657187569046394884895083794103531835959613994575377897775525461977464747518162975010091463561925032742645594645800581600698347817023194379921397347681150492687237349021564206463096138703201250277757980410772647014391579144424375252519766764670458008515297647624144814453496069685127439800629552075692648608681506879044376428977463175175205181547958459515159074701285838493694034007662410100183533141516684185460758175066481561018901133031951042099053297118837448984443230856642737606478787880285299903521855025612413471034466624171559209077538498475106811294029060334271803320566493935024621719717684804443351866946690525266060758332190531807232565501890293754259590947433140384335366973398816899253698302119916142891631005349335372158005779944529176735887193980409288474621694590303098552382376969442365186023130985507823617670051191889015351479659778676132449671642015059540438237303922903056079068344635440276772565425944329927654906262952475555750912023879424636021462043321631428365675851865654901693474343411406220907550090045689588323936814675126103464401223728058185048320475251266882875299120582253090033177883674432343812734123922042926554908548231473285349572210962289889800994026533629321464700552029391517293055196218065667251276237490129206098414338903210942488902792253924667941082273267563528653863343443486495762400409978995985052082310730277076965242846278402568285187365588876653245423047205943478612931964211293489374119565751486787204884502307512372923973119191125614068756094526892783321688030310900558025683455451898487401139315290743477461921025987905332236299398859448938742087487316288730711068752763449392366897236258997091176996253284306687635454361862179407191652155243650619571720232128624130785404930566805029233271375546253313287446285812219961565022654510373870581648214791139170870970509074158721967633425471550515801498191107216277620692347014234913527385812164834475002007099402122991439542783981984927181300669603290190495106195784248531299740262706106798338573523977365240941293695214188675632715447081372252551022981921251125675131839210074132286029621443262127145872022404314258219255606415280218445074654034790115075558513374422753617188198385931164810182817002794172279803028202086567081267453349341345496389239379776494419022301042067986600501045466950004057134726934147691678031986698845370299987067384407310337433828116514830745374490760171672152978595040351405572526523026051215093709900567873568385242574546385008567738263951532676549294356417565797771595638496719149577804216291892125541055147173723744991756669672459021375111288754125372918394417976243093028214703329386031799313949535161343892720409046065009958980978947997662545514664194262097665297242612367968766000629174655887090824363583653843658980277566031286429628476318572915045823895805826010132712977834418613468288832988547377174550796802573148684253294172285056777826927377158058647145403557721233512002495437339413998842782599710186215723437958154275340509811072349041046483806284608873394275718878590418692809288333423522781240698974441829879303794241455852776713321354870647251094720675572322788447908778778892116234131617608416732280987493141331884927860259324392781255786150891859203497212615916404999097067778739914857961305884934678762043515521190581898256624635957830927811421154992139986999936203631149852372802564314896151749326404428772008250428569338329698161850171265411426708113723558325059062871506712838460986031147060351491506316012532538793354499545667009527573810892048004652452452139688789392912938251888341298122235232861138733903153560967292104241190946350516769769305030762386908399592555043192236069279491224465826684203312081255431851756341234566913972589390601558650830437402045595207689996159597545711808203688318112918947661662115802919578636403430323041610018063696707221249826383715263388850307418469423973486747009233945036220901518185766942733836846126816638158345048782728241251279820310193223512959111029884002230571688216854282257873218631744450950552327428952538149545262779889824399028513132208638633070602135522752076661567872472325125674291268881849101416382703647451428232847993332157180794015036365361645888146355749366150209085457189187232786399585879941680370348141105404742298452497895369287193974496140445677301271403589665822911096832952021181343571136957607816318342755770560406569920261633966403484121679869542684843686908354373688437968683525723666121485947946747887572716360800696442816474113593466106089204179554677145374582437962664618883018628687510079511252556002241788346284019750863992283906513572325918053464080643521532154825074820239077990779007069588034029619562190416747359712884084324521598678178890186409451480686781733176824920276835002477523486093586963733155424491897575495851549527034538337694314953057164019215026670773910997443279760005290641511584707193226351271670439775141076552632736166117611394934325673743882365518318561208941552931629125136799711574578916741023587251428998946963182411650554404206416336487418656105333038545773960190949602850096208569085230228708894874577523512558281973392961263921656163963369388411763476388625952406901518273413037068643383550282962237729195901788599392876651086599849223994259145259240479384380657803498058719062529007339428316229997756899857712116922758683071707472935574499244978419788171338468471751125303860911589289400806637202920429489919870263415951660888975434827304297451362325052693482001524843171229078467910537913138115458626612024970730899515114301915281613929239329351501049859225274564107846818112938339161308943153205117651716380468462296193882444293370484368530096898812778973178284912798550245246063411918482638261694029245273291646707331594675213428158755273882438357960245064051015888918541801139771619743221405037797285669481455810653320008904215997597975907391512026214020012010134707536774227636477580918167507850485197065326391091171451763751237612739498468510009055480025096015985581769370179656781151306565952590101977398335185042637681982306448413722177895665290302796223004198526079143104070007874540548221582347389579e-4951L + && convert(0x8000000000000000ULL, 0x0000000000000001ULL) + == 3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587346566858083349053123705193988703983308587839946322501468602459466376586870456423634710242397194658860357568067134477982764219736292817751295560536845761267846647908517463250923736039512722781415953366096399444403402117053488448021977763604437908687623249034116909294550532283554604255016471048510990155249694820376175072774521597924829264164672829379224834378522148847524461653340453140898534938901079999466084995792940867082225167898092626332284133633537230365710606672711016101696986908545526816093446785575823545286456670464909287063062587561930219192839574686079732400741932670792586584247903252601714502511652018733705556477669856403061671860988301022089008752404238293812121415758527179547281628232710885994458574715033852877595426024800791719981955344151916599003503828822200355665967958771090937688409231050763744882094456320484272716122798149836361660589595209083576887254232532955229749892640550762959438241278496193819382077545905461172547961340469817691165676094261320725727312607482937653140421619686103059529199421431937449566099337396063075218302243845475341677972462038126626903408167086517545386382155008956065955410392914952623927880847159533184535486666480480563407531428385329300522477684217050951264747454635754866214784941542315111038630684391425212439304190584122374222972284606537485052464648655369719099026760518287560996997210778473066980129427427439517032390964791367678221749630975419713438139162678878555999177528450882748046538588177447270306738234898502976902853001364550405227287093940058325788585457368654991956265863050083472087623066020903378919489920975190829421602010382039477772083400661519154972695436582305021910908576692048173534958894170976763084807837402813849227540942073315401115262334876815962087441302256558438912500607230205782013083674113023497612445214795170983848687988348203289441256908755565216081815151205638893112562415329084456934095146184469290901166110634875590164835606941629407489774379792739804674764243483912084691871769225446506284310565309190872477286255925383528545036360550854226919571246361133225904820301916588317084377712259367894846411294822587075835486985645510829880528578782698412556249274522235061092454342386202327120407827540333914613192189174315884136688019435966273663470431440443032136411775605030601436837063972690330417475187330200911967500496761618122614796452937124070398703890868915527051490465736745397764941094879479649438162576614346948652085308024696358256756585794568493319042053882843808180358787110774418075478801186519577416271896383169835708225636584654568643702618602433548938163720732772538345454513065011540675765510656970500413537205370067924880209217363407323673368448004904408413977741706965494247040799786451861822188473571257556819433284087486023676249467869483631380473856486239547015603318322612783652068699798539400406637311682731115340677841660240710431551140370410375585572939303084073843540702120551963050514959945741359169911676575478403279380112020347348292538150798320452794842427526501796852911863108178276638472320237870082862271763396195139513712303136194366021540830531456910584048372546025177765140460207112923151923176402146752868221966889915381596481253160696822260723194259521813054303457222367967929268763072892355278854714278243863110783067060124459039315528176840304931522813148745824350892130595015198002557204332483215551447097512510076223364801202888087635650654634946887232727623906459076670227108634162319210357007273369354657187569046394884895083794103531835959613994575377897775525461977464747518162975010091463561925032742645594645800581600698347817023194379921397347681150492687237349021564206463096138703201250277757980410772647014391579144424375252519766764670458008515297647624144814453496069685127439800629552075692648608681506879044376428977463175175205181547958459515159074701285838493694034007662410100183533141516684185460758175066481561018901133031951042099053297118837448984443230856642737606478787880285299903521855025612413471034466624171559209077538498475106811294029060334271803320566493935024621719717684804443351866946690525266060758332190531807232565501890293754259590947433140384335366973398816899253698302119916142891631005349335372158005779944529176735887193980409288474621694590303098552382376969442365186023130985507823617670051191889015351479659778676132449671642015059540438237303922903056079068344635440276772565425944329927654906262952475555750912023879424636021462043321631428365675851865654901693474343411406220907550090045689588323936814675126103464401223728058185048320475251266882875299120582253090033177883674432343812734123922042926554908548231473285349572210962289889800994026533629321464700552029391517293055196218065667251276237490129206098414338903210942488902792253924667941082273267563528653863343443486495762400409978995985052082310730277076965242846278402568285187365588876653245423047205943478612931964211293489374119565751486787204884502307512372923973119191125614068756094526892783321688030310900558025683455451898487401139315290743477461921025987905332236299398859448938742087487316288730711068752763449392366897236258997091176996253284306687635454361862179407191652155243650619571720232128624130785404930566805029233271375546253313287446285812219961565022654510373870581648214791139170870970509074158721967633425471550515801498191107216277620692347014234913527385812164834475002007099402122991439542783981984927181300669603290190495106195784248531299740262706106798338573523977365240941293695214188675632715447081372252551022981921251125675131839210074132286029621443262127145872022404314258219255606415280218445074654034790115075558513374422753617188198385931164810182817002794172279803028202086567081267453349341345496389239379776494419022301042067986600501045466950004057134726934147691678031986698845370299987067384407310337433828116514830745374490760171672152978595040351405572526523026051215093709900567873568385242574546385008567738263951532676549294356417565797771595638496719149577804216291892125541055147173723744991756669672459021375111288754125372918394417976243093028214703329386031799313949535161343892720409046065009958980978947997662545514664194262097665297242612367968766000629174655887090824363583653843658980277566031286429628476318572915045823895805826010132712977834418613468288832988547377174550796802573148684253294172285056777826927377158058647145403557721233512002495437339413998842782599710186215723437958154275340509811072349041046483806284608873394275718878590418692809288333423522781240698974441829879303794241455852776713321354870647251094720675572322788447908778778892116234131617608416732280987493141331884927860259324392781255786150891859203497212615916404999097067778739914857961305884934678762043515521190581898256624635957830927811421154992139986999936203631149852372802564314896151749326404428772008250428569338329698161850171265411426708113723558325059062871506712838460986031147060351491506316012532538793354499545667009527573810892048004652452452139688789392912938251888341298122235232861138733903153560967292104241190946350516769769305030762386908399592555043192236069279491224465826684203312081255431851756341234566913972589390601558650830437402045595207689996159597545711808203688318112918947661662115802919578636403430323041610018063696707221249826383715263388850307418469423973486747009233945036220901518185766942733836846126816638158345048782728241251279820310193223512959111029884002230571688216854282257873218631744450950552327428952538149545262779889824399028513132208638633070602135522752076661567872472325125674291268881849101416382703647451428232847993332157180794015036365361645888146355749366150209085457189187232786399585879941680370348141105404742298452497895369287193974496140445677301271403589665822911096832952021181343571136957607816318342755770560406569920261633966403484121679869542684843686908354373688437968683525723666121485947946747887572716360800696442816474113593466106089204179554677145374582437962664618883018628687510079511252556002241788346284019750863992283906513572325918053464080643521532154825074820239077990779007069588034029619562190416747359712884084324521598678178890186409451480686781733176824920276835002477523486093586963733155424491897575495851549527034538337694314953057164019215026670773910997443279760005290641511584707193226351271670439775141076552632736166117611394934325673743882365518318561208941552931629125136799711574578916741023587251428998946963182411650554404206416336487418656105333038545773960190949602850096208569085230228708894874577523512558281973392961263921656163963369388411763476388625952406901518273413037068643383550282962237729195901788599392876651086599849223994259145259240479384380657803498058719062529007339428316229997756899857712116922758683071707472935574499244978419788171338468471751125303860911589289400806637202920429489919870263415951660888975434827304297451362325052693482001524843171229078467910537913138115458626612024970730899515114301915281613929239329351501049859225274564107846818112938339161308943153205117651716380468462296193882444293370484368530096898812778973178284912798550245246063411918482638261694029245273291646707331594675213428158755273882438357960245064051015888918541801139771619743221405037797285669481455810653320008904215997597975907391512026214020012010134707536774227636477580918167507850485197065326391091171451763751237612739498468510009055480025096015985581769370179656781151306565952590101977398335185042637681982306448413722177895665290302796223004198526079143104070007874540548221582347389579e-4951L)) + 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 +#ifdef HAVE_STDINT_H +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#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::is_iec559 + && (convert(0xaaacccaaUL, 0xacccaaacUL) + == -4.018242396032647085467373664662028399901175154542925376476863248797653889888945947404163925979898721593782464256360719269163883854613473748830842329884157359816532025640075051481726120707111709993717456369512975427023957197464411926714771905463723621065863511603311053477227687835693359375e-103L + && convert(0xcccaaaccUL, 0xcaaacccaUL) + == -85705035845709846787631445265530356117787053916987832397725696.0L + && convert(0x00000000UL, 0x00000001UL) + == 4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625e-324L + && convert(0x80000000UL, 0x00000001UL) + == -4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625e-324L)) + 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_CXX_LONG_DOUBLE_EXACT_OUTPUT + +if test x"$ac_cxx_long_double_binary_format" = x"unknown" || test $ac_cxx_long_double_exact_output = 0 || test $ac_cv_can_control_fpu = 0 +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_long_double_exact_output.m4 b/m4/ac_cxx_long_double_exact_output.m4 new file mode 100644 index 0000000..d965a85 --- /dev/null +++ b/m4/ac_cxx_long_double_exact_output.m4 @@ -0,0 +1,253 @@ +dnl A function to detect whether C++ provides exact output for long doubles. +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/ppl/ . + +AC_DEFUN([AC_CXX_LONG_DOUBLE_EXACT_OUTPUT], +[ +AC_REQUIRE([AC_C_BIGENDIAN]) +dnl AC_REQUIRE([AC_CXX_LONG_DOUBLE_BINARY_FORMAT]) +ac_save_CPPFLAGS="$CPPFLAGS" +ac_save_LIBS="$LIBS" +AC_LANG_PUSH(C++) + +AC_MSG_CHECKING([whether C++ provides exact output for long doubles]) + +AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#ifdef HAVE_STDINT_H +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#endif +#include + +/* 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 + +bool +check(long double value, const char* text) { + std::ostringstream ss; + ss.precision(10000); + ss << value; + return ss.str() == text; +} + +#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; +} + +#if PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_INTEL_DOUBLE_EXTENDED + +int +main() { + if (check(convert(0xaaacccaaUL, 0xacccaaacccaaacccULL), + "-23475151196235330448360987288488448023604990597437922665537894499317141030270831473500040521309097782521743811281100731620612303910141158923283064807755815684643856544564541670181998003713114595098650350075763370916908460284838902787487703020001649220669684278577319085319204471093693972621987808779314674903648668236688723332999785552894845325917244897920804830290985291535343986477508649100409893486651507134071296739623686984014433965803259868867855465109457220731656260670349710137932272802677796915669809481885196101414678015638835049035133835457854893845093496950772367562664955830097293678125205138879788670490610650322134182370990336443894886171520732434535881085387893610114822547025980969387956199048733969351859470324032549906964255557877860343871346618951696178837035563054101786829980983909935265617095747543882856776297861197958453847978446679149969948882161264279705948735019353220550905117946051015070744207453853343171175921378515361160726195198161165083475968") + && check(convert(0xcccaaaccUL, 0xcaaacccaaacccaaaULL), + "-3.234349908433673569788362433758236701401379200386310478070230491201716094576208088733092209352711081763530973139439402754721006217889031902309566905344106766697050593355851405189694125966100801537593811320493850579152938679705465870788684523518541806158791408378718596936132854683425581754205242594614192465876640102628432246897674583649745467641139234207139584810101868772915312454075582265240687184279243861217351667059920878236164506473261797703393981510799228030778152399657445848839855361831637014754038570644257393307922665529947406582062857348101442206039278033447012163028384634753160589791458287895963629514043345016273218385584012204321293761500625038828699451659598873739820939586314044735551522599884065690704853850058509917597610804664086074437219778400030370474948166770867639885264893441594112815147445129222900623635467542926999246959939000796968650036727515644358583656635086409945418378371210848857160579105176395869221692977516017583375976424496977231821652434877830409470264872173686708172667000681514442371517343085468923465834742925914605731609765839631967460042791316319023971980691582832232860491668014341598553021017317450989919240909832141247027104138677882497144506317212033031539627613710631490195651235049780490963461514410018833968072513381369320107740021476622121320911875995678620145217379068502893509758814753434218746970000807381369855297087472398985134583394635298304301976743682254755898799853471470973139487587740504614698965906370516694512439128548402418825952236144896863935402725154209604537541130862513767786738372717442238281296070010302255703329785136750848608510805269562580550421695335686256291415407706167513127610045830074144232174636354465520547408627155363076530824695464544496846799567213412195115628936631295933321590908845288558910694118404555858629368018552451467994715743285452343185080572139353967831950470208768524113647528966442712608411306460439403733081312454377815407740431356862292588345515142587184008493066353603658341268923669196617183622259532802077159684815974630350730226266887950469523895272137382682818583664766982004756872470359454855421231861600855405622250180301557001727658100463825721179482988287599820459238518127671242515104954727268296043840120459189992322364113432317376499876615018647681005294400890426164141474245830847447887800872845238979407896829797297990804023745291564182356173092302630416583955274584512411637160723327887646112927503049935866004964114798241035087343318592736488780742013424329479787548324846879335440582948017481856461250014099199025874264395426269044157577172368261822794071985989844785134561848837459343219269316428175168803982908920457749528709425299296467325603578851955843550406474402944350694486492967809731047663564513772408591390180588458110788180950470244902062953534590109356800048878919144043979000989724521292698054747484439706733411566872999353418986588749568995482953622089499726327807058708520455805869817259837526415584189633013162307753166636151833127563746069733440228640737257520299330767346391011026088684503955941755171481192133779119344715318224728775697330484860348152872987113995597980243907204928634355356748752501217143216601222634344211757170284222785899530754663487291354339744025299042982320199789070467212765859078265587040664859899997109073649635056953085131587344086263213972132295294758682559609365238437544701417284297826732242650999654640698637095193178119502815643930373741504018967640638120546136857104880094633373762586018322104925768619990210092851075031033451925224377383389610824173203445111896055901190132142204139463967556738295382942065540228560332044410017389129348710403201272349054427064370609913529996988445571571382916349536222256815467149849706750571813156961918737343978667568453623162377198802996342528197935118265696537928993634621119483415202847968129550048667353312481509419740177690982818603515625e-1634") + && check(convert(0x00000000UL, 0x0000000000000001ULL), + "3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587346566858083349053123705193988703983308587839946322501468602459466376586870456423634710242397194658860357568067134477982764219736292817751295560536845761267846647908517463250923736039512722781415953366096399444403402117053488448021977763604437908687623249034116909294550532283554604255016471048510990155249694820376175072774521597924829264164672829379224834378522148847524461653340453140898534938901079999466084995792940867082225167898092626332284133633537230365710606672711016101696986908545526816093446785575823545286456670464909287063062587561930219192839574686079732400741932670792586584247903252601714502511652018733705556477669856403061671860988301022089008752404238293812121415758527179547281628232710885994458574715033852877595426024800791719981955344151916599003503828822200355665967958771090937688409231050763744882094456320484272716122798149836361660589595209083576887254232532955229749892640550762959438241278496193819382077545905461172547961340469817691165676094261320725727312607482937653140421619686103059529199421431937449566099337396063075218302243845475341677972462038126626903408167086517545386382155008956065955410392914952623927880847159533184535486666480480563407531428385329300522477684217050951264747454635754866214784941542315111038630684391425212439304190584122374222972284606537485052464648655369719099026760518287560996997210778473066980129427427439517032390964791367678221749630975419713438139162678878555999177528450882748046538588177447270306738234898502976902853001364550405227287093940058325788585457368654991956265863050083472087623066020903378919489920975190829421602010382039477772083400661519154972695436582305021910908576692048173534958894170976763084807837402813849227540942073315401115262334876815962087441302256558438912500607230205782013083674113023497612445214795170983848687988348203289441256908755565216081815151205638893112562415329084456934095146184469290901166110634875590164835606941629407489774379792739804674764243483912084691871769225446506284310565309190872477286255925383528545036360550854226919571246361133225904820301916588317084377712259367894846411294822587075835486985645510829880528578782698412556249274522235061092454342386202327120407827540333914613192189174315884136688019435966273663470431440443032136411775605030601436837063972690330417475187330200911967500496761618122614796452937124070398703890868915527051490465736745397764941094879479649438162576614346948652085308024696358256756585794568493319042053882843808180358787110774418075478801186519577416271896383169835708225636584654568643702618602433548938163720732772538345454513065011540675765510656970500413537205370067924880209217363407323673368448004904408413977741706965494247040799786451861822188473571257556819433284087486023676249467869483631380473856486239547015603318322612783652068699798539400406637311682731115340677841660240710431551140370410375585572939303084073843540702120551963050514959945741359169911676575478403279380112020347348292538150798320452794842427526501796852911863108178276638472320237870082862271763396195139513712303136194366021540830531456910584048372546025177765140460207112923151923176402146752868221966889915381596481253160696822260723194259521813054303457222367967929268763072892355278854714278243863110783067060124459039315528176840304931522813148745824350892130595015198002557204332483215551447097512510076223364801202888087635650654634946887232727623906459076670227108634162319210357007273369354657187569046394884895083794103531835959613994575377897775525461977464747518162975010091463561925032742645594645800581600698347817023194379921397347681150492687237349021564206463096138703201250277757980410772647014391579144424375252519766764670458008515297647624144814453496069685127439800629552075692648608681506879044376428977463175175205181547958459515159074701285838493694034007662410100183533141516684185460758175066481561018901133031951042099053297118837448984443230856642737606478787880285299903521855025612413471034466624171559209077538498475106811294029060334271803320566493935024621719717684804443351866946690525266060758332190531807232565501890293754259590947433140384335366973398816899253698302119916142891631005349335372158005779944529176735887193980409288474621694590303098552382376969442365186023130985507823617670051191889015351479659778676132449671642015059540438237303922903056079068344635440276772565425944329927654906262952475555750912023879424636021462043321631428365675851865654901693474343411406220907550090045689588323936814675126103464401223728058185048320475251266882875299120582253090033177883674432343812734123922042926554908548231473285349572210962289889800994026533629321464700552029391517293055196218065667251276237490129206098414338903210942488902792253924667941082273267563528653863343443486495762400409978995985052082310730277076965242846278402568285187365588876653245423047205943478612931964211293489374119565751486787204884502307512372923973119191125614068756094526892783321688030310900558025683455451898487401139315290743477461921025987905332236299398859448938742087487316288730711068752763449392366897236258997091176996253284306687635454361862179407191652155243650619571720232128624130785404930566805029233271375546253313287446285812219961565022654510373870581648214791139170870970509074158721967633425471550515801498191107216277620692347014234913527385812164834475002007099402122991439542783981984927181300669603290190495106195784248531299740262706106798338573523977365240941293695214188675632715447081372252551022981921251125675131839210074132286029621443262127145872022404314258219255606415280218445074654034790115075558513374422753617188198385931164810182817002794172279803028202086567081267453349341345496389239379776494419022301042067986600501045466950004057134726934147691678031986698845370299987067384407310337433828116514830745374490760171672152978595040351405572526523026051215093709900567873568385242574546385008567738263951532676549294356417565797771595638496719149577804216291892125541055147173723744991756669672459021375111288754125372918394417976243093028214703329386031799313949535161343892720409046065009958980978947997662545514664194262097665297242612367968766000629174655887090824363583653843658980277566031286429628476318572915045823895805826010132712977834418613468288832988547377174550796802573148684253294172285056777826927377158058647145403557721233512002495437339413998842782599710186215723437958154275340509811072349041046483806284608873394275718878590418692809288333423522781240698974441829879303794241455852776713321354870647251094720675572322788447908778778892116234131617608416732280987493141331884927860259324392781255786150891859203497212615916404999097067778739914857961305884934678762043515521190581898256624635957830927811421154992139986999936203631149852372802564314896151749326404428772008250428569338329698161850171265411426708113723558325059062871506712838460986031147060351491506316012532538793354499545667009527573810892048004652452452139688789392912938251888341298122235232861138733903153560967292104241190946350516769769305030762386908399592555043192236069279491224465826684203312081255431851756341234566913972589390601558650830437402045595207689996159597545711808203688318112918947661662115802919578636403430323041610018063696707221249826383715263388850307418469423973486747009233945036220901518185766942733836846126816638158345048782728241251279820310193223512959111029884002230571688216854282257873218631744450950552327428952538149545262779889824399028513132208638633070602135522752076661567872472325125674291268881849101416382703647451428232847993332157180794015036365361645888146355749366150209085457189187232786399585879941680370348141105404742298452497895369287193974496140445677301271403589665822911096832952021181343571136957607816318342755770560406569920261633966403484121679869542684843686908354373688437968683525723666121485947946747887572716360800696442816474113593466106089204179554677145374582437962664618883018628687510079511252556002241788346284019750863992283906513572325918053464080643521532154825074820239077990779007069588034029619562190416747359712884084324521598678178890186409451480686781733176824920276835002477523486093586963733155424491897575495851549527034538337694314953057164019215026670773910997443279760005290641511584707193226351271670439775141076552632736166117611394934325673743882365518318561208941552931629125136799711574578916741023587251428998946963182411650554404206416336487418656105333038545773960190949602850096208569085230228708894874577523512558281973392961263921656163963369388411763476388625952406901518273413037068643383550282962237729195901788599392876651086599849223994259145259240479384380657803498058719062529007339428316229997756899857712116922758683071707472935574499244978419788171338468471751125303860911589289400806637202920429489919870263415951660888975434827304297451362325052693482001524843171229078467910537913138115458626612024970730899515114301915281613929239329351501049859225274564107846818112938339161308943153205117651716380468462296193882444293370484368530096898812778973178284912798550245246063411918482638261694029245273291646707331594675213428158755273882438357960245064051015888918541801139771619743221405037797285669481455810653320008904215997597975907391512026214020012010134707536774227636477580918167507850485197065326391091171451763751237612739498468510009055480025096015985581769370179656781151306565952590101977398335185042637681982306448413722177895665290302796223004198526079143104070007874540548221582347389579e-4951") + && check(convert(0x80000000UL, 0x0000000000000001ULL), + "3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587346566858083349053123705193988703983308587839946322501468602459466376586870456423634710242397194658860357568067134477982764219736292817751295560536845761267846647908517463250923736039512722781415953366096399444403402117053488448021977763604437908687623249034116909294550532283554604255016471048510990155249694820376175072774521597924829264164672829379224834378522148847524461653340453140898534938901079999466084995792940867082225167898092626332284133633537230365710606672711016101696986908545526816093446785575823545286456670464909287063062587561930219192839574686079732400741932670792586584247903252601714502511652018733705556477669856403061671860988301022089008752404238293812121415758527179547281628232710885994458574715033852877595426024800791719981955344151916599003503828822200355665967958771090937688409231050763744882094456320484272716122798149836361660589595209083576887254232532955229749892640550762959438241278496193819382077545905461172547961340469817691165676094261320725727312607482937653140421619686103059529199421431937449566099337396063075218302243845475341677972462038126626903408167086517545386382155008956065955410392914952623927880847159533184535486666480480563407531428385329300522477684217050951264747454635754866214784941542315111038630684391425212439304190584122374222972284606537485052464648655369719099026760518287560996997210778473066980129427427439517032390964791367678221749630975419713438139162678878555999177528450882748046538588177447270306738234898502976902853001364550405227287093940058325788585457368654991956265863050083472087623066020903378919489920975190829421602010382039477772083400661519154972695436582305021910908576692048173534958894170976763084807837402813849227540942073315401115262334876815962087441302256558438912500607230205782013083674113023497612445214795170983848687988348203289441256908755565216081815151205638893112562415329084456934095146184469290901166110634875590164835606941629407489774379792739804674764243483912084691871769225446506284310565309190872477286255925383528545036360550854226919571246361133225904820301916588317084377712259367894846411294822587075835486985645510829880528578782698412556249274522235061092454342386202327120407827540333914613192189174315884136688019435966273663470431440443032136411775605030601436837063972690330417475187330200911967500496761618122614796452937124070398703890868915527051490465736745397764941094879479649438162576614346948652085308024696358256756585794568493319042053882843808180358787110774418075478801186519577416271896383169835708225636584654568643702618602433548938163720732772538345454513065011540675765510656970500413537205370067924880209217363407323673368448004904408413977741706965494247040799786451861822188473571257556819433284087486023676249467869483631380473856486239547015603318322612783652068699798539400406637311682731115340677841660240710431551140370410375585572939303084073843540702120551963050514959945741359169911676575478403279380112020347348292538150798320452794842427526501796852911863108178276638472320237870082862271763396195139513712303136194366021540830531456910584048372546025177765140460207112923151923176402146752868221966889915381596481253160696822260723194259521813054303457222367967929268763072892355278854714278243863110783067060124459039315528176840304931522813148745824350892130595015198002557204332483215551447097512510076223364801202888087635650654634946887232727623906459076670227108634162319210357007273369354657187569046394884895083794103531835959613994575377897775525461977464747518162975010091463561925032742645594645800581600698347817023194379921397347681150492687237349021564206463096138703201250277757980410772647014391579144424375252519766764670458008515297647624144814453496069685127439800629552075692648608681506879044376428977463175175205181547958459515159074701285838493694034007662410100183533141516684185460758175066481561018901133031951042099053297118837448984443230856642737606478787880285299903521855025612413471034466624171559209077538498475106811294029060334271803320566493935024621719717684804443351866946690525266060758332190531807232565501890293754259590947433140384335366973398816899253698302119916142891631005349335372158005779944529176735887193980409288474621694590303098552382376969442365186023130985507823617670051191889015351479659778676132449671642015059540438237303922903056079068344635440276772565425944329927654906262952475555750912023879424636021462043321631428365675851865654901693474343411406220907550090045689588323936814675126103464401223728058185048320475251266882875299120582253090033177883674432343812734123922042926554908548231473285349572210962289889800994026533629321464700552029391517293055196218065667251276237490129206098414338903210942488902792253924667941082273267563528653863343443486495762400409978995985052082310730277076965242846278402568285187365588876653245423047205943478612931964211293489374119565751486787204884502307512372923973119191125614068756094526892783321688030310900558025683455451898487401139315290743477461921025987905332236299398859448938742087487316288730711068752763449392366897236258997091176996253284306687635454361862179407191652155243650619571720232128624130785404930566805029233271375546253313287446285812219961565022654510373870581648214791139170870970509074158721967633425471550515801498191107216277620692347014234913527385812164834475002007099402122991439542783981984927181300669603290190495106195784248531299740262706106798338573523977365240941293695214188675632715447081372252551022981921251125675131839210074132286029621443262127145872022404314258219255606415280218445074654034790115075558513374422753617188198385931164810182817002794172279803028202086567081267453349341345496389239379776494419022301042067986600501045466950004057134726934147691678031986698845370299987067384407310337433828116514830745374490760171672152978595040351405572526523026051215093709900567873568385242574546385008567738263951532676549294356417565797771595638496719149577804216291892125541055147173723744991756669672459021375111288754125372918394417976243093028214703329386031799313949535161343892720409046065009958980978947997662545514664194262097665297242612367968766000629174655887090824363583653843658980277566031286429628476318572915045823895805826010132712977834418613468288832988547377174550796802573148684253294172285056777826927377158058647145403557721233512002495437339413998842782599710186215723437958154275340509811072349041046483806284608873394275718878590418692809288333423522781240698974441829879303794241455852776713321354870647251094720675572322788447908778778892116234131617608416732280987493141331884927860259324392781255786150891859203497212615916404999097067778739914857961305884934678762043515521190581898256624635957830927811421154992139986999936203631149852372802564314896151749326404428772008250428569338329698161850171265411426708113723558325059062871506712838460986031147060351491506316012532538793354499545667009527573810892048004652452452139688789392912938251888341298122235232861138733903153560967292104241190946350516769769305030762386908399592555043192236069279491224465826684203312081255431851756341234566913972589390601558650830437402045595207689996159597545711808203688318112918947661662115802919578636403430323041610018063696707221249826383715263388850307418469423973486747009233945036220901518185766942733836846126816638158345048782728241251279820310193223512959111029884002230571688216854282257873218631744450950552327428952538149545262779889824399028513132208638633070602135522752076661567872472325125674291268881849101416382703647451428232847993332157180794015036365361645888146355749366150209085457189187232786399585879941680370348141105404742298452497895369287193974496140445677301271403589665822911096832952021181343571136957607816318342755770560406569920261633966403484121679869542684843686908354373688437968683525723666121485947946747887572716360800696442816474113593466106089204179554677145374582437962664618883018628687510079511252556002241788346284019750863992283906513572325918053464080643521532154825074820239077990779007069588034029619562190416747359712884084324521598678178890186409451480686781733176824920276835002477523486093586963733155424491897575495851549527034538337694314953057164019215026670773910997443279760005290641511584707193226351271670439775141076552632736166117611394934325673743882365518318561208941552931629125136799711574578916741023587251428998946963182411650554404206416336487418656105333038545773960190949602850096208569085230228708894874577523512558281973392961263921656163963369388411763476388625952406901518273413037068643383550282962237729195901788599392876651086599849223994259145259240479384380657803498058719062529007339428316229997756899857712116922758683071707472935574499244978419788171338468471751125303860911589289400806637202920429489919870263415951660888975434827304297451362325052693482001524843171229078467910537913138115458626612024970730899515114301915281613929239329351501049859225274564107846818112938339161308943153205117651716380468462296193882444293370484368530096898812778973178284912798550245246063411918482638261694029245273291646707331594675213428158755273882438357960245064051015888918541801139771619743221405037797285669481455810653320008904215997597975907391512026214020012010134707536774227636477580918167507850485197065326391091171451763751237612739498468510009055480025096015985581769370179656781151306565952590101977398335185042637681982306448413722177895665290302796223004198526079143104070007874540548221582347389579e-4951")) + return 0; + else + return 1; +} + +#else // PPL_CXX_LONG_DOUBLE_BINARY_FORMAT != FLOAT_INTEL_DOUBLE_EXTENDED + +int +main() { + return 1; +} + +#endif // PPL_CXX_LONG_DOUBLE_BINARY_FORMAT != FLOAT_INTEL_DOUBLE_EXTENDED + +#elif 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; +} + +#if PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_QUAD + +int +main() { + if (check(convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL), + "-8.55855653885100434741341853993902633367349104766375354667159377718342093894815477326286823233135691805519944470138219932524951165689852082013017904043605683486724317550972746307400400204571080045247416605879743573136814766221652651396476675668866980798618379071105211750397249729982891787041148520384572930274879267722158826932337019191713973025403784448443813348692062209940856126724493492803365972504505177354875652033856070760087261648660638833868952644144747756799606849182265604546917705495630867683634260396102823982577953799017062698102242357552179655099799114234932578035799185560231199083485854936098752376968393647581458407558794412029383325763638562788717260040049064497131924995762524305159587498016677454321953274959044696323291625045478494472581264819229447771276640446297211105522340278216491094195598543872903469867733674572559977106495016037365144714092305087690135013719347274733034998868445412589677425060095799279101903473205374412225289846468374532481297065712317082077938035156602646698351182648104255704218634101302925067087078955133405900007044267209898310644310904503791609310204530573463263951434586894153990739119187567218316060343579381319744970284036645819031296341711196622764674251739340075981861518157380656135644972541894187627902651874054588734732906342927804126694032667794810086817870907476586539935233288396561987441453006798066121939082312783518917156845604116991071351557087417820814737448930366014934139649936714605919733198611573267554373841805458030152706709963798138766665437195696286204333504023648063774567253657433115103351104190986192714072985487851579415615609526545777708652951405409847708647802254957197551148967040887700676749608935220270768342493900689974647088468653016844028721111482484905641458435567969469008688175230469940968306817582881926746422674891155765989419578280531847369896579997902056370886853884911608932917273377526774091310024267948445090595150848945937264274298230316059283748541372546998570685254364147022857127106166375807928861080771495427281772909457414476961102929683460150380091022216902985688084496718499522925736236100966839490544989265028487132166444183820209811985298620037327410566483546092567386575203772065259924817078378553423445114795887961447486917127608105936488957460696218995227900239169698156532097505472359601263421630872600694896078087993492528322817946497772710008837719609909497752428441503174822795185219988589528998338631725113908025553153842511443825016809012668839505492083731555461826355018782953670089090573806418379608917728933789667567839232807208925449602517595541397929042673972541764273293287457694772131268012143158809453627483947788463130353101911401667613659585055576869155534998835800762122080588150495103765874874613454517177121048246498282285280904742153700877576028449241385429235777250684782328183787286276152331338688335510090441008799792147837436640030059474106105829612076012626498555138419516242851436828131901668517305064107076254421670883938440896580435257206350630093337919967881954501164988008085285088049681541452106188312639266136685237513628484410146475880276899689323468288129178652504797093820419402611691354199968499448738482587415636727937353639264845197813295922091561637504736126720760129127710879063043647425297778439069116811334073539456451043564046959839163407469915211595468718792531664679340442279513006653831781499155674396529973036072198720572542914738630057353297633085013244779323578115668031532144051510758240504037804690564298890171218568053886450388507561335540224075309922339483204122333658701871584147135738144358394867585372134490396264937274938848938884293776466212293402264641368524174512841804801230279990820989956713963566987970818315606031084417487965298373510594915942429581446481759482857537804431542098380533075194397625795605337047384493682506827547173206735463795863376044170821429161475172513429888642402089329334654087406739184258619435041737233405001461505889892578125e-1644") + && check(convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL), + "-124514581107511552210796456934966803687304842980295573828954497922493752983397188814711304411560018580965744046315133789985274208017368151964100284400784216106649187287727268989948309893335776137201236307422254490384994342132786695251856340822607539332337741185911979986209464222776112117543477310592395735321641016191765613924234896253051931334188353106422231052895112533426462965071195000083346118845388851222468275853899619767858364593491745895616655921022591572983370616010095670881627966440183912948095715866505356803258659518882310562527709556367822539262111581385341941163873435919341717170180065638145777392282815973491833042960716493005101610346003273833563515742996380936304245423639950200211170835546053201980835724318930743625600269679260909350277600256315069013053332133830043213033329696436217829598890872375814523266366034383531514035947792389939922899745714167418517458817088636450662300503353562047987996978943856662174717195437379600755109302771921946748859230686543872") + && check(convert(0x0000000000000000ULL, 0x0000000000000001ULL), + "6.475175119438025110924438958227646552499569338034681009689884389197039540124119371017671491276649940255878141476848119676587219886382542046685110071972617983042792710751334934416734625638471740239448526505553990391455556252171148068070822034688256982476272828789103028357337561348031062386564592639826226991907907867663262065711211583064657196068308332845234453069760526489447660964579313751403402631804350039948870075255648713368066117879403155766713303467434937062409411685215137607333139422843835051668983567167196802642952353504079714347103860537782893700215521168667711042950610021881513627986429461700433339201935397498825184335385514892844339930852967838448682125502304114122153045946465463084764110174478737044335312389661483639210553943411476544786261397875064191451226767614625892790369961415069606980007080502788648919975916801878222002252381723047230971876570995428821219281596547633023538783137183646396952831530551068683419596735374086746290525867996216905323365319885172609956827625511036332478353228947631880050684559150608318986521540136061273771493390412784756552103897518527764158778759333880714882279633323826397312375406927039446525306447838514371503654987855172306307584155459826707095909617752526800401326990828721633726770440915439092677906646798573524199116648264206920451160133635071361773812121716528178148240720783226736549623736135274990309138143183248371959875978805027500928693808073336955752759088442865600075199888998323880643549670055505421362435108572732087322982027187772459231228989472372951864321099261878781084330252988333921362998963303722431059741968763452406953835015120533773385289904710843628402700274702870474073825248828889984994284607604847211794221210729913159829014217168004461049532662696542913183628157199561641949923936629368992856621383084545327636972265542355341749855663020004887316835216156767223053799811067258913808469994232607858854524064432145775922144535701236468985705212977045479489515690009388923625580685788707605877343857669170894656797423368490329407251160393356048820607085089069025413584269816739747211239513550414383117508826763143512862006497058041145296097892917999935577053234252698691933792724753682184537682835562829938630004838384363944243137622864918257474256280127291116965050600178120477720784742184205376195975831677721764740044536624645764471381571452381830125398765152083287483110279394697855915713981939970684599199594863007230624076786139617554631450734995190081932187616814234632738778224433256463738346435274905710925581106061273840975592931761266799265587765468946764337085192369358316298457450008809428586921504743730873895710474614480003727146162349858333291516552162545370312200390841588309480973274631646273597390249477746657131891196482398670118797910098918899689482196956660638225731960693542763964302308999692957091061300183648329785182793301407267200046383043005236759977387601407769110383295729918654520937785586390633157020347632812108728638589813282569529576769367173324764085285705308312954957401558247168739931446569422818723482471097374362105279278558570746278168331596903799527959001674856155564619821407044799720020620642233246057848236476047540762849788325435630592420194490443539428990899488655890183886788650518595542180257939200539645041808387760238189562428351774632440622618056913137499820021924733173668036806485733443567039613866037176155955253827548473360440517049422696075501183292573063250613021167503858561082238374439193413231472608072888733326512853287806773389073299297372760244397355791502004654458118728037510329034120643030182346716011974996719598934277635297762958837247389366909763367493682299430362668996193935405226221180280462691353912282455701759810037116439968883639596108926413528826200502511551071661541071241892319070812994269518086385295992381025957172992399312141414210235547707008555590049509294048331178258885645254295737834927590332773105843826797756540039810295021699037788228205072146738094320261980823252096852875670591366194556595549470362090317233349128160475626293246538430039226463877253517855062981890058712415866578727694362877805078594115939049922697215689139042884475829798201399221843339843144334329750976265054375898637087619406776357862341599539585772173362569929723217313856218610739079911693928395573354107695207924389443047735986097057117102761647398583746704066222192489628491579241861512228457942727677656217068060304063431859444999092873095546808035894071193872676924207893595051334067870866978585241063298399448801664979503576258730853137762656715932674584878408765074348715350808211160488037567370082449596914044378631384351574514574407266268601518418121140639017772950755439822352142605465639756330937185434812776437455170052704254873689525989445652781559474644227537684964321625946200647347726100468875445797592291192363724641100602571723960104389727561487616213893880158699261565353860394268412519478250755882121502350855777548987354957187611364644347783460623918569790357712078708030071729862147204119062003145783057657964335620490686654777775857772417230654005669380137272188650104502859563282535642734533430567287319498304528915876638370296607209654727246810120749147011579846007686876872348978767610197018167444101532656500699586407674404325249380187066956228877621206281130141035339929259895087216809976356039304176324615051223863642132987493989282096132023719628675179659793099441124234181354583082636306115430335248256636595542753063577946177399294336318459611754831189657065079679934928129113295189411660749306226747061753316760480290760846421347557553607185254462514991634789163215592554565288625021429064594217444034435094635489801294636044217141894128608560200837942901104014713783039046587228833888032709513732700101667002833885010142407620233438106861087062055906874872893491133678484259720820886397724438939944326449942516696628683510030426237257765426269532595248183289611602373952305073827029425838481007443361481172033664199893614932623554378101313353925699162767581809444174957293532641034112367163940472496454826645496608268491435975330754792022473413254641635309131365360013914909519963236046952897089347016136738984133133790874101143168691022141918967797877476450100585067348766183224990814253610763592974731784263832853675045343246533254966131311531411068478710429786791811404658680805588105768518292098129259164151153126615341498379324353953450723874092401152015787628879390603785057522375088322779364007018433582543673090990833352296302290390165336647355242365982903670648563727239283547241202029021901993493453231407543942533374303128855544718854681133818703717309615999563617026069360208156393214924333856037726771259857931298487909006782987195926835910537279213582905667384935745871483880724959685377284455451325009389359115356341859747548302075715614439876712304113995679250907454883895302396632381653230532032695481751231940062856024456656381220713413431325444483757534262449339675147214243079144598658808202548926312120596697863356554722348114194969409174072455372221354826189882023922524876054935905929454258925505387898039528329076689551108932342856243697999637938228068665595345855978215420274558562368590236467711884770512666328306756286559348574636272916414332349992225277379071952095234443041820054854970323931404077610323730988914889188356127533914074856107086479831584739755622106834971368997334246432264012757261628954213626177797127289818357558926591911175376134554737367672941224416966599144520688033032388494464597481600684233179969688713377153969107014820586500187890028419759966629125896903859724482018551567368459339437282027473163713630554370146518281068049701849575089743432349308849281456182745027011845653626290780738299181305772482001250991761047543344790454625943156085044661103576512523366161351099640751135385148305913987889008698009234370941891346098306437937661227172386506980636903743541285235605780167216008920828610842066522096589500420940606405692664109905063234866117077516308694175709123219476283230290207497555159467149979347020209673500496651023554475005053991295374430728524771212435107382664318842703197811901075027036703041419315229156263279708865064004473392401710817533040210152757966691416471836361498546249180866049039738294265863864925406135752428537159880132061042828090772733103561437021070938835520484987564784902357826645006185384847299711513042558913116550679842981785737713725790045128094411676264858573201529073678073396387519268373798582548263868592119666097381189255247190641352195443081432945981901223716745712543744847146503012460085216148335807619624528396069010370871981642712755932969484501155184487454597846375782598809708096893645439856478634508146859065978179351007580744928974114529788215226484601824974140107352758776378993800008479463640459773788106039221647527915619638375897279653946867057366337834721265500081035695372958187077367633848426351345959537644131255393886949828040966112768013745671476622221973172299021322723830684345054818157484501760113734299662298242039459694484074671808880126261963999301400833575366587220239180443885948634911432672454909578479586976064598126633177835011824812040440090529736915436564330317784343260941419199007994565556336195654994767768391641843167291242587882400091208124348669996343070061026732554587428779976439512259161737036335847682346728539549778493388870528102969822923976454022477322075204905420377823800876540724560782242540043358494305758648390071388556142954991440895026034342297754624387472732697423260211014731729196139172514053952591428247887383243344755389104496037975360677224765591211970382212225942797592005272680787386239303946689423293709148965999400795905073756697025967564396661027489606337872152854151887574400979150870295978066773059913103141338094206140446153595784659696116999451265627049162745281492831846033865707908304944975732574637090102130752860241496159897720566523711477673910492376257245019657271734451417565932034846341070093018262777507790026122302775680179025723685230883459924631462602175535978001836273235741164283034661871238537285831967107455175175353583907073921428e-4966") + && check(convert(0x8000000000000000ULL, 0x0000000000000001ULL), + "-6.475175119438025110924438958227646552499569338034681009689884389197039540124119371017671491276649940255878141476848119676587219886382542046685110071972617983042792710751334934416734625638471740239448526505553990391455556252171148068070822034688256982476272828789103028357337561348031062386564592639826226991907907867663262065711211583064657196068308332845234453069760526489447660964579313751403402631804350039948870075255648713368066117879403155766713303467434937062409411685215137607333139422843835051668983567167196802642952353504079714347103860537782893700215521168667711042950610021881513627986429461700433339201935397498825184335385514892844339930852967838448682125502304114122153045946465463084764110174478737044335312389661483639210553943411476544786261397875064191451226767614625892790369961415069606980007080502788648919975916801878222002252381723047230971876570995428821219281596547633023538783137183646396952831530551068683419596735374086746290525867996216905323365319885172609956827625511036332478353228947631880050684559150608318986521540136061273771493390412784756552103897518527764158778759333880714882279633323826397312375406927039446525306447838514371503654987855172306307584155459826707095909617752526800401326990828721633726770440915439092677906646798573524199116648264206920451160133635071361773812121716528178148240720783226736549623736135274990309138143183248371959875978805027500928693808073336955752759088442865600075199888998323880643549670055505421362435108572732087322982027187772459231228989472372951864321099261878781084330252988333921362998963303722431059741968763452406953835015120533773385289904710843628402700274702870474073825248828889984994284607604847211794221210729913159829014217168004461049532662696542913183628157199561641949923936629368992856621383084545327636972265542355341749855663020004887316835216156767223053799811067258913808469994232607858854524064432145775922144535701236468985705212977045479489515690009388923625580685788707605877343857669170894656797423368490329407251160393356048820607085089069025413584269816739747211239513550414383117508826763143512862006497058041145296097892917999935577053234252698691933792724753682184537682835562829938630004838384363944243137622864918257474256280127291116965050600178120477720784742184205376195975831677721764740044536624645764471381571452381830125398765152083287483110279394697855915713981939970684599199594863007230624076786139617554631450734995190081932187616814234632738778224433256463738346435274905710925581106061273840975592931761266799265587765468946764337085192369358316298457450008809428586921504743730873895710474614480003727146162349858333291516552162545370312200390841588309480973274631646273597390249477746657131891196482398670118797910098918899689482196956660638225731960693542763964302308999692957091061300183648329785182793301407267200046383043005236759977387601407769110383295729918654520937785586390633157020347632812108728638589813282569529576769367173324764085285705308312954957401558247168739931446569422818723482471097374362105279278558570746278168331596903799527959001674856155564619821407044799720020620642233246057848236476047540762849788325435630592420194490443539428990899488655890183886788650518595542180257939200539645041808387760238189562428351774632440622618056913137499820021924733173668036806485733443567039613866037176155955253827548473360440517049422696075501183292573063250613021167503858561082238374439193413231472608072888733326512853287806773389073299297372760244397355791502004654458118728037510329034120643030182346716011974996719598934277635297762958837247389366909763367493682299430362668996193935405226221180280462691353912282455701759810037116439968883639596108926413528826200502511551071661541071241892319070812994269518086385295992381025957172992399312141414210235547707008555590049509294048331178258885645254295737834927590332773105843826797756540039810295021699037788228205072146738094320261980823252096852875670591366194556595549470362090317233349128160475626293246538430039226463877253517855062981890058712415866578727694362877805078594115939049922697215689139042884475829798201399221843339843144334329750976265054375898637087619406776357862341599539585772173362569929723217313856218610739079911693928395573354107695207924389443047735986097057117102761647398583746704066222192489628491579241861512228457942727677656217068060304063431859444999092873095546808035894071193872676924207893595051334067870866978585241063298399448801664979503576258730853137762656715932674584878408765074348715350808211160488037567370082449596914044378631384351574514574407266268601518418121140639017772950755439822352142605465639756330937185434812776437455170052704254873689525989445652781559474644227537684964321625946200647347726100468875445797592291192363724641100602571723960104389727561487616213893880158699261565353860394268412519478250755882121502350855777548987354957187611364644347783460623918569790357712078708030071729862147204119062003145783057657964335620490686654777775857772417230654005669380137272188650104502859563282535642734533430567287319498304528915876638370296607209654727246810120749147011579846007686876872348978767610197018167444101532656500699586407674404325249380187066956228877621206281130141035339929259895087216809976356039304176324615051223863642132987493989282096132023719628675179659793099441124234181354583082636306115430335248256636595542753063577946177399294336318459611754831189657065079679934928129113295189411660749306226747061753316760480290760846421347557553607185254462514991634789163215592554565288625021429064594217444034435094635489801294636044217141894128608560200837942901104014713783039046587228833888032709513732700101667002833885010142407620233438106861087062055906874872893491133678484259720820886397724438939944326449942516696628683510030426237257765426269532595248183289611602373952305073827029425838481007443361481172033664199893614932623554378101313353925699162767581809444174957293532641034112367163940472496454826645496608268491435975330754792022473413254641635309131365360013914909519963236046952897089347016136738984133133790874101143168691022141918967797877476450100585067348766183224990814253610763592974731784263832853675045343246533254966131311531411068478710429786791811404658680805588105768518292098129259164151153126615341498379324353953450723874092401152015787628879390603785057522375088322779364007018433582543673090990833352296302290390165336647355242365982903670648563727239283547241202029021901993493453231407543942533374303128855544718854681133818703717309615999563617026069360208156393214924333856037726771259857931298487909006782987195926835910537279213582905667384935745871483880724959685377284455451325009389359115356341859747548302075715614439876712304113995679250907454883895302396632381653230532032695481751231940062856024456656381220713413431325444483757534262449339675147214243079144598658808202548926312120596697863356554722348114194969409174072455372221354826189882023922524876054935905929454258925505387898039528329076689551108932342856243697999637938228068665595345855978215420274558562368590236467711884770512666328306756286559348574636272916414332349992225277379071952095234443041820054854970323931404077610323730988914889188356127533914074856107086479831584739755622106834971368997334246432264012757261628954213626177797127289818357558926591911175376134554737367672941224416966599144520688033032388494464597481600684233179969688713377153969107014820586500187890028419759966629125896903859724482018551567368459339437282027473163713630554370146518281068049701849575089743432349308849281456182745027011845653626290780738299181305772482001250991761047543344790454625943156085044661103576512523366161351099640751135385148305913987889008698009234370941891346098306437937661227172386506980636903743541285235605780167216008920828610842066522096589500420940606405692664109905063234866117077516308694175709123219476283230290207497555159467149979347020209673500496651023554475005053991295374430728524771212435107382664318842703197811901075027036703041419315229156263279708865064004473392401710817533040210152757966691416471836361498546249180866049039738294265863864925406135752428537159880132061042828090772733103561437021070938835520484987564784902357826645006185384847299711513042558913116550679842981785737713725790045128094411676264858573201529073678073396387519268373798582548263868592119666097381189255247190641352195443081432945981901223716745712543744847146503012460085216148335807619624528396069010370871981642712755932969484501155184487454597846375782598809708096893645439856478634508146859065978179351007580744928974114529788215226484601824974140107352758776378993800008479463640459773788106039221647527915619638375897279653946867057366337834721265500081035695372958187077367633848426351345959537644131255393886949828040966112768013745671476622221973172299021322723830684345054818157484501760113734299662298242039459694484074671808880126261963999301400833575366587220239180443885948634911432672454909578479586976064598126633177835011824812040440090529736915436564330317784343260941419199007994565556336195654994767768391641843167291242587882400091208124348669996343070061026732554587428779976439512259161737036335847682346728539549778493388870528102969822923976454022477322075204905420377823800876540724560782242540043358494305758648390071388556142954991440895026034342297754624387472732697423260211014731729196139172514053952591428247887383243344755389104496037975360677224765591211970382212225942797592005272680787386239303946689423293709148965999400795905073756697025967564396661027489606337872152854151887574400979150870295978066773059913103141338094206140446153595784659696116999451265627049162745281492831846033865707908304944975732574637090102130752860241496159897720566523711477673910492376257245019657271734451417565932034846341070093018262777507790026122302775680179025723685230883459924631462602175535978001836273235741164283034661871238537285831967107455175175353583907073921428e-4966")) + return 0; + else + return 1; +} + +#elif PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_INTEL_DOUBLE_EXTENDED + +int +main() { + if (check(convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL), + "-7.6048540943660203383375998875878002021755137452856942966991187375790618225432711954682137529456970686263412309600617913197560145993931792374946076061175594550915924955313391528566777352996816141138550473090399783817652516896553304678788796532976847530386107750759127004897950996937530751872097675156395937218234460013748219954603465088115161828048215763754331575034447236689765045674584188927116128770082933362914567237187017530082528540058002631800274192146485961758366625476271676375489358478966148719270989233284454992652229565352739884432045036085427546783826745250197623257802129011015273728848161395367551745780868250488191368846207890422268873532651627591649389757751752362072212699309947970918940313250863861141479770240104635553035870698789854752554391365757900620463269938427975381635241159694500569550818398323639621243086116154792038064941523448921284117826015673798399008555604372098051095571652170081985843614541956756469168604624857938653843172027861680499952062356914208628014745759010068414302636374017506453133466034362025545080555878082849488386388633197121003201192243150535143329731394874806398663589117246866205872431804204733617792317769570293754056793574570217834482046448788177551912250351735294891953434051815332631157674735614138641122106756749236824504094008852401427746414294902929999820878756040223246586814590339767277305131757114819123212897500810087015748205562614251410818122967399030151040544000563841334553718469935435435467196184665715776274355094471974036803615388313095637066824428688301387559074204015990782977635088047810891072724763113879034313256582868462323549141603475107584159170279311985555035822254439699354641467841523895459190280971487264907972306090449968125859834702627544039374770757804202780369083049631377117943503836158566134919890165392965694050010089785271180956974707841066789578714463804030217977213138932711313311673101336981407798868338574571646697479192174043005729926344062133712267722538847635563454980776602355539986984320762864338177037919835721981686778834558429264194379257521818498431326991615024245632036376472844033831041082865649867453234086495085785897620758602105639344460383483879837994732204331335249564434458633345708439547881275060781028856140511029543559841701048277393119691261302356763314623124427357421753631218361407626116820986377721964654181839884670481278855478057996766639496909094607181503284084821580817995489740980323820218685313435967428474842973086612053963343516426226771094376179468881265734324847319127862733279299033951360912038720313525324094079916937921290391173035983474894312808532257620563284126400481460163180987618432784215807933623038747129658746767737999870125917269554155887740155308886259497202672935871853706835670467770080598813171256855182510726902033818328368569915805303784312301890212694874227119220544172084552511408717615136830401766455214293141216171050374325461714383991698910564587610624980490526840861990674615172112493813749497898151186927777122955666180439323595468816129418014664347852590958362752922841159054568358354108159485566264221008508127941168192513144760720303715640604755054290633421601734103622748053919536319416025380484868142967373186019970714662893713233834399238357795019603619284595839414945178963942707310299674873908104634979966232181071013259653467885733418936194081202149071958107062125873498848807502257018093517304220495114497635240876547262237411350327960679115197531609627900227913193653254580253539005743563270152329126178570329413401577715075363838562221558204219798925982825556469998988615897432425107152113543617151738802778259560442930074253918797315241708532198010528564246933829811859278710445896556638416265987381678070434371355795025956293319362293063591248665429733880825207421011852020394068840244110140622151494488609575671090387230241296949998536132398625008053543954239573998167556201366323875845409929752349853515625e-1644") + && check(convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL), + "-99658331877181425640389193712445288804009112642407197633229907048864350192381814628233384153539524368748305269642704450459572458913058829202094408933558533552137589226430537671503754737153845553845646099179512540696038707395491223325946106007770844660381340028079827237033670900446083793353682761885084154898636897779677124010119288945740273072415898996441722571487815052387317025675191665761918119006431828756780493604546658949166486641354783002536071366287780290680620995991797712341457334946893188786269086688063732222194404683551757689083590842400866213237312413463207537587813396338061744078437770542720749055069473347142994267706326342325536219464867910547533482061181116137767384001927599515332824741827726661184966512254203502805790565338206862173475388342339711722457620964017690492860707751327158273522191943184085888284707357024653025991470473697475045491586713324994056478341556198451786713470909185879382607340766256394396819602885198511409676789226542867632933493115191296") + && check(convert(0x0000000000000000ULL, 0x0000000000000001ULL), + "3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587346566858083349053123705193988703983308587839946322501468602459466376586870456423634710242397194658860357568067134477982764219736292817751295560536845761267846647908517463250923736039512722781415953366096399444403402117053488448021977763604437908687623249034116909294550532283554604255016471048510990155249694820376175072774521597924829264164672829379224834378522148847524461653340453140898534938901079999466084995792940867082225167898092626332284133633537230365710606672711016101696986908545526816093446785575823545286456670464909287063062587561930219192839574686079732400741932670792586584247903252601714502511652018733705556477669856403061671860988301022089008752404238293812121415758527179547281628232710885994458574715033852877595426024800791719981955344151916599003503828822200355665967958771090937688409231050763744882094456320484272716122798149836361660589595209083576887254232532955229749892640550762959438241278496193819382077545905461172547961340469817691165676094261320725727312607482937653140421619686103059529199421431937449566099337396063075218302243845475341677972462038126626903408167086517545386382155008956065955410392914952623927880847159533184535486666480480563407531428385329300522477684217050951264747454635754866214784941542315111038630684391425212439304190584122374222972284606537485052464648655369719099026760518287560996997210778473066980129427427439517032390964791367678221749630975419713438139162678878555999177528450882748046538588177447270306738234898502976902853001364550405227287093940058325788585457368654991956265863050083472087623066020903378919489920975190829421602010382039477772083400661519154972695436582305021910908576692048173534958894170976763084807837402813849227540942073315401115262334876815962087441302256558438912500607230205782013083674113023497612445214795170983848687988348203289441256908755565216081815151205638893112562415329084456934095146184469290901166110634875590164835606941629407489774379792739804674764243483912084691871769225446506284310565309190872477286255925383528545036360550854226919571246361133225904820301916588317084377712259367894846411294822587075835486985645510829880528578782698412556249274522235061092454342386202327120407827540333914613192189174315884136688019435966273663470431440443032136411775605030601436837063972690330417475187330200911967500496761618122614796452937124070398703890868915527051490465736745397764941094879479649438162576614346948652085308024696358256756585794568493319042053882843808180358787110774418075478801186519577416271896383169835708225636584654568643702618602433548938163720732772538345454513065011540675765510656970500413537205370067924880209217363407323673368448004904408413977741706965494247040799786451861822188473571257556819433284087486023676249467869483631380473856486239547015603318322612783652068699798539400406637311682731115340677841660240710431551140370410375585572939303084073843540702120551963050514959945741359169911676575478403279380112020347348292538150798320452794842427526501796852911863108178276638472320237870082862271763396195139513712303136194366021540830531456910584048372546025177765140460207112923151923176402146752868221966889915381596481253160696822260723194259521813054303457222367967929268763072892355278854714278243863110783067060124459039315528176840304931522813148745824350892130595015198002557204332483215551447097512510076223364801202888087635650654634946887232727623906459076670227108634162319210357007273369354657187569046394884895083794103531835959613994575377897775525461977464747518162975010091463561925032742645594645800581600698347817023194379921397347681150492687237349021564206463096138703201250277757980410772647014391579144424375252519766764670458008515297647624144814453496069685127439800629552075692648608681506879044376428977463175175205181547958459515159074701285838493694034007662410100183533141516684185460758175066481561018901133031951042099053297118837448984443230856642737606478787880285299903521855025612413471034466624171559209077538498475106811294029060334271803320566493935024621719717684804443351866946690525266060758332190531807232565501890293754259590947433140384335366973398816899253698302119916142891631005349335372158005779944529176735887193980409288474621694590303098552382376969442365186023130985507823617670051191889015351479659778676132449671642015059540438237303922903056079068344635440276772565425944329927654906262952475555750912023879424636021462043321631428365675851865654901693474343411406220907550090045689588323936814675126103464401223728058185048320475251266882875299120582253090033177883674432343812734123922042926554908548231473285349572210962289889800994026533629321464700552029391517293055196218065667251276237490129206098414338903210942488902792253924667941082273267563528653863343443486495762400409978995985052082310730277076965242846278402568285187365588876653245423047205943478612931964211293489374119565751486787204884502307512372923973119191125614068756094526892783321688030310900558025683455451898487401139315290743477461921025987905332236299398859448938742087487316288730711068752763449392366897236258997091176996253284306687635454361862179407191652155243650619571720232128624130785404930566805029233271375546253313287446285812219961565022654510373870581648214791139170870970509074158721967633425471550515801498191107216277620692347014234913527385812164834475002007099402122991439542783981984927181300669603290190495106195784248531299740262706106798338573523977365240941293695214188675632715447081372252551022981921251125675131839210074132286029621443262127145872022404314258219255606415280218445074654034790115075558513374422753617188198385931164810182817002794172279803028202086567081267453349341345496389239379776494419022301042067986600501045466950004057134726934147691678031986698845370299987067384407310337433828116514830745374490760171672152978595040351405572526523026051215093709900567873568385242574546385008567738263951532676549294356417565797771595638496719149577804216291892125541055147173723744991756669672459021375111288754125372918394417976243093028214703329386031799313949535161343892720409046065009958980978947997662545514664194262097665297242612367968766000629174655887090824363583653843658980277566031286429628476318572915045823895805826010132712977834418613468288832988547377174550796802573148684253294172285056777826927377158058647145403557721233512002495437339413998842782599710186215723437958154275340509811072349041046483806284608873394275718878590418692809288333423522781240698974441829879303794241455852776713321354870647251094720675572322788447908778778892116234131617608416732280987493141331884927860259324392781255786150891859203497212615916404999097067778739914857961305884934678762043515521190581898256624635957830927811421154992139986999936203631149852372802564314896151749326404428772008250428569338329698161850171265411426708113723558325059062871506712838460986031147060351491506316012532538793354499545667009527573810892048004652452452139688789392912938251888341298122235232861138733903153560967292104241190946350516769769305030762386908399592555043192236069279491224465826684203312081255431851756341234566913972589390601558650830437402045595207689996159597545711808203688318112918947661662115802919578636403430323041610018063696707221249826383715263388850307418469423973486747009233945036220901518185766942733836846126816638158345048782728241251279820310193223512959111029884002230571688216854282257873218631744450950552327428952538149545262779889824399028513132208638633070602135522752076661567872472325125674291268881849101416382703647451428232847993332157180794015036365361645888146355749366150209085457189187232786399585879941680370348141105404742298452497895369287193974496140445677301271403589665822911096832952021181343571136957607816318342755770560406569920261633966403484121679869542684843686908354373688437968683525723666121485947946747887572716360800696442816474113593466106089204179554677145374582437962664618883018628687510079511252556002241788346284019750863992283906513572325918053464080643521532154825074820239077990779007069588034029619562190416747359712884084324521598678178890186409451480686781733176824920276835002477523486093586963733155424491897575495851549527034538337694314953057164019215026670773910997443279760005290641511584707193226351271670439775141076552632736166117611394934325673743882365518318561208941552931629125136799711574578916741023587251428998946963182411650554404206416336487418656105333038545773960190949602850096208569085230228708894874577523512558281973392961263921656163963369388411763476388625952406901518273413037068643383550282962237729195901788599392876651086599849223994259145259240479384380657803498058719062529007339428316229997756899857712116922758683071707472935574499244978419788171338468471751125303860911589289400806637202920429489919870263415951660888975434827304297451362325052693482001524843171229078467910537913138115458626612024970730899515114301915281613929239329351501049859225274564107846818112938339161308943153205117651716380468462296193882444293370484368530096898812778973178284912798550245246063411918482638261694029245273291646707331594675213428158755273882438357960245064051015888918541801139771619743221405037797285669481455810653320008904215997597975907391512026214020012010134707536774227636477580918167507850485197065326391091171451763751237612739498468510009055480025096015985581769370179656781151306565952590101977398335185042637681982306448413722177895665290302796223004198526079143104070007874540548221582347389579e-4951") + && check(convert(0x8000000000000000ULL, 0x0000000000000001ULL), + "3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587346566858083349053123705193988703983308587839946322501468602459466376586870456423634710242397194658860357568067134477982764219736292817751295560536845761267846647908517463250923736039512722781415953366096399444403402117053488448021977763604437908687623249034116909294550532283554604255016471048510990155249694820376175072774521597924829264164672829379224834378522148847524461653340453140898534938901079999466084995792940867082225167898092626332284133633537230365710606672711016101696986908545526816093446785575823545286456670464909287063062587561930219192839574686079732400741932670792586584247903252601714502511652018733705556477669856403061671860988301022089008752404238293812121415758527179547281628232710885994458574715033852877595426024800791719981955344151916599003503828822200355665967958771090937688409231050763744882094456320484272716122798149836361660589595209083576887254232532955229749892640550762959438241278496193819382077545905461172547961340469817691165676094261320725727312607482937653140421619686103059529199421431937449566099337396063075218302243845475341677972462038126626903408167086517545386382155008956065955410392914952623927880847159533184535486666480480563407531428385329300522477684217050951264747454635754866214784941542315111038630684391425212439304190584122374222972284606537485052464648655369719099026760518287560996997210778473066980129427427439517032390964791367678221749630975419713438139162678878555999177528450882748046538588177447270306738234898502976902853001364550405227287093940058325788585457368654991956265863050083472087623066020903378919489920975190829421602010382039477772083400661519154972695436582305021910908576692048173534958894170976763084807837402813849227540942073315401115262334876815962087441302256558438912500607230205782013083674113023497612445214795170983848687988348203289441256908755565216081815151205638893112562415329084456934095146184469290901166110634875590164835606941629407489774379792739804674764243483912084691871769225446506284310565309190872477286255925383528545036360550854226919571246361133225904820301916588317084377712259367894846411294822587075835486985645510829880528578782698412556249274522235061092454342386202327120407827540333914613192189174315884136688019435966273663470431440443032136411775605030601436837063972690330417475187330200911967500496761618122614796452937124070398703890868915527051490465736745397764941094879479649438162576614346948652085308024696358256756585794568493319042053882843808180358787110774418075478801186519577416271896383169835708225636584654568643702618602433548938163720732772538345454513065011540675765510656970500413537205370067924880209217363407323673368448004904408413977741706965494247040799786451861822188473571257556819433284087486023676249467869483631380473856486239547015603318322612783652068699798539400406637311682731115340677841660240710431551140370410375585572939303084073843540702120551963050514959945741359169911676575478403279380112020347348292538150798320452794842427526501796852911863108178276638472320237870082862271763396195139513712303136194366021540830531456910584048372546025177765140460207112923151923176402146752868221966889915381596481253160696822260723194259521813054303457222367967929268763072892355278854714278243863110783067060124459039315528176840304931522813148745824350892130595015198002557204332483215551447097512510076223364801202888087635650654634946887232727623906459076670227108634162319210357007273369354657187569046394884895083794103531835959613994575377897775525461977464747518162975010091463561925032742645594645800581600698347817023194379921397347681150492687237349021564206463096138703201250277757980410772647014391579144424375252519766764670458008515297647624144814453496069685127439800629552075692648608681506879044376428977463175175205181547958459515159074701285838493694034007662410100183533141516684185460758175066481561018901133031951042099053297118837448984443230856642737606478787880285299903521855025612413471034466624171559209077538498475106811294029060334271803320566493935024621719717684804443351866946690525266060758332190531807232565501890293754259590947433140384335366973398816899253698302119916142891631005349335372158005779944529176735887193980409288474621694590303098552382376969442365186023130985507823617670051191889015351479659778676132449671642015059540438237303922903056079068344635440276772565425944329927654906262952475555750912023879424636021462043321631428365675851865654901693474343411406220907550090045689588323936814675126103464401223728058185048320475251266882875299120582253090033177883674432343812734123922042926554908548231473285349572210962289889800994026533629321464700552029391517293055196218065667251276237490129206098414338903210942488902792253924667941082273267563528653863343443486495762400409978995985052082310730277076965242846278402568285187365588876653245423047205943478612931964211293489374119565751486787204884502307512372923973119191125614068756094526892783321688030310900558025683455451898487401139315290743477461921025987905332236299398859448938742087487316288730711068752763449392366897236258997091176996253284306687635454361862179407191652155243650619571720232128624130785404930566805029233271375546253313287446285812219961565022654510373870581648214791139170870970509074158721967633425471550515801498191107216277620692347014234913527385812164834475002007099402122991439542783981984927181300669603290190495106195784248531299740262706106798338573523977365240941293695214188675632715447081372252551022981921251125675131839210074132286029621443262127145872022404314258219255606415280218445074654034790115075558513374422753617188198385931164810182817002794172279803028202086567081267453349341345496389239379776494419022301042067986600501045466950004057134726934147691678031986698845370299987067384407310337433828116514830745374490760171672152978595040351405572526523026051215093709900567873568385242574546385008567738263951532676549294356417565797771595638496719149577804216291892125541055147173723744991756669672459021375111288754125372918394417976243093028214703329386031799313949535161343892720409046065009958980978947997662545514664194262097665297242612367968766000629174655887090824363583653843658980277566031286429628476318572915045823895805826010132712977834418613468288832988547377174550796802573148684253294172285056777826927377158058647145403557721233512002495437339413998842782599710186215723437958154275340509811072349041046483806284608873394275718878590418692809288333423522781240698974441829879303794241455852776713321354870647251094720675572322788447908778778892116234131617608416732280987493141331884927860259324392781255786150891859203497212615916404999097067778739914857961305884934678762043515521190581898256624635957830927811421154992139986999936203631149852372802564314896151749326404428772008250428569338329698161850171265411426708113723558325059062871506712838460986031147060351491506316012532538793354499545667009527573810892048004652452452139688789392912938251888341298122235232861138733903153560967292104241190946350516769769305030762386908399592555043192236069279491224465826684203312081255431851756341234566913972589390601558650830437402045595207689996159597545711808203688318112918947661662115802919578636403430323041610018063696707221249826383715263388850307418469423973486747009233945036220901518185766942733836846126816638158345048782728241251279820310193223512959111029884002230571688216854282257873218631744450950552327428952538149545262779889824399028513132208638633070602135522752076661567872472325125674291268881849101416382703647451428232847993332157180794015036365361645888146355749366150209085457189187232786399585879941680370348141105404742298452497895369287193974496140445677301271403589665822911096832952021181343571136957607816318342755770560406569920261633966403484121679869542684843686908354373688437968683525723666121485947946747887572716360800696442816474113593466106089204179554677145374582437962664618883018628687510079511252556002241788346284019750863992283906513572325918053464080643521532154825074820239077990779007069588034029619562190416747359712884084324521598678178890186409451480686781733176824920276835002477523486093586963733155424491897575495851549527034538337694314953057164019215026670773910997443279760005290641511584707193226351271670439775141076552632736166117611394934325673743882365518318561208941552931629125136799711574578916741023587251428998946963182411650554404206416336487418656105333038545773960190949602850096208569085230228708894874577523512558281973392961263921656163963369388411763476388625952406901518273413037068643383550282962237729195901788599392876651086599849223994259145259240479384380657803498058719062529007339428316229997756899857712116922758683071707472935574499244978419788171338468471751125303860911589289400806637202920429489919870263415951660888975434827304297451362325052693482001524843171229078467910537913138115458626612024970730899515114301915281613929239329351501049859225274564107846818112938339161308943153205117651716380468462296193882444293370484368530096898812778973178284912798550245246063411918482638261694029245273291646707331594675213428158755273882438357960245064051015888918541801139771619743221405037797285669481455810653320008904215997597975907391512026214020012010134707536774227636477580918167507850485197065326391091171451763751237612739498468510009055480025096015985581769370179656781151306565952590101977398335185042637681982306448413722177895665290302796223004198526079143104070007874540548221582347389579e-4951")) + return 0; + else + return 1; +} + +#else // PPL_CXX_LONG_DOUBLE_BINARY_FORMAT != FLOAT_INTEL_DOUBLE_EXTENDED + +int +main() { + return 1; +} + +#endif // PPL_CXX_LONG_DOUBLE_BINARY_FORMAT != FLOAT_INTEL_DOUBLE_EXTENDED + +#elif 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; +} + +#if PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_DOUBLE + +int +main() { + if (check(convert(0xaaacccaaUL, 0xacccaaacUL), + "-4.018242396032647085467373664662028399901175154542925376476863248797653889888945947404163925979898721593782464256360719269163883854613473748830842329884157359816532025640075051481726120707111709993717456369512975427023957197464411926714771905463723621065863511603311053477227687835693359375e-103") + && check(convert(0xcccaaaccUL, 0xcaaacccaUL), + "-85705035845709846787631445265530356117787053916987832397725696") + && check(convert(0x00000000UL, 0x00000001UL), + "4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625e-324") + && check(convert(0x80000000UL, 0x00000001UL), + "-4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625e-324")) + return 0; + else + return 1; +} + +#else // PPL_CXX_LONG_DOUBLE_BINARY_FORMAT != FLOAT_IEEE754_DOUBLE + +int +main() { + return 1; +} + +#endif // PPL_CXX_LONG_DOUBLE_BINARY_FORMAT != FLOAT_IEEE754_DOUBLE + +#else // SIZEOF_LONG_DOUBLE != 8 + +int +main() { + return 1; +} + +#endif // SIZEOF_LONG_DOUBLE != 8 +]])], + AC_MSG_RESULT(yes) + ac_cxx_long_double_exact_output=1, + AC_MSG_RESULT(no) + ac_cxx_long_double_exact_output=0, + AC_MSG_RESULT([assuming not]) + ac_cxx_long_double_exact_output=0) + +AC_DEFINE_UNQUOTED(PPL_CXX_LONG_DOUBLE_EXACT_OUTPUT, $ac_cxx_long_double_exact_output, + [Not zero if C++ supports exact output for long doubles.]) + +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..7886ac3 --- /dev/null +++ b/m4/ac_cxx_proper_long_double.m4 @@ -0,0 +1,63 @@ +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-2009 Roberto Bagnara +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://www.cs.unipr.it/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 + +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_remainder_bug.m4 b/m4/ac_cxx_remainder_bug.m4 new file mode 100644 index 0000000..2e93b6d --- /dev/null +++ b/m4/ac_cxx_remainder_bug.m4 @@ -0,0 +1,70 @@ +dnl A function to check whether the C++ compiler has the `remainder' bug. +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/ppl/ . + +AC_DEFUN([AC_CXX_HAS_REMAINDER_BUG], +[ + +ac_save_CPPFLAGS="$CPPFLAGS" +ac_save_LIBS="$LIBS" +AC_LANG_PUSH(C++) + +AC_MSG_CHECKING([if the compiler has the remainder bug]) +AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include + +int minus_one(int n) { + return (n+1)*(n-1)-n*n; +} + +int p(int x, int y) { + int z = x % y; + return z; +} + +int main(int argc, char** argv) { + if (p(INT_MIN, minus_one(argc)) != 0) + return 1; + else + return 0; +} +]])], + AC_MSG_RESULT(no) + ac_cv_cxx_has_remainder_bug=no, + AC_MSG_RESULT(yes) + ac_cv_cxx_has_remainder_bug=yes, + AC_MSG_RESULT([assuming yes]) + ac_cv_cxx_has_remainder_bug=yes) + +if test x"$ac_cv_cxx_has_remainder_bug" = xyes +then + value=1 +else + value=0 +fi +AC_DEFINE_UNQUOTED(PPL_CXX_HAS_REMAINDER_BUG, $value, + [Not zero if the C++ compiler has the remainder bug.]) + +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..c3a8884 --- /dev/null +++ b/m4/ac_prog_jar.m4 @@ -0,0 +1,53 @@ +##### 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@. +# +# 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 +# Copyright (C) 2001-2009 Roberto Bagnara +# +# 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..95cacfa --- /dev/null +++ b/m4/ac_prog_java.m4 @@ -0,0 +1,267 @@ +#### 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 +# Copyright (C) 2001-2009 Roberto Bagnara +# +# 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@. +# +# *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 +# . +# +# 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 +# Copyright (C) 2001-2009 Roberto Bagnara +# +# 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..25c06e8 --- /dev/null +++ b/m4/ac_prog_javac.m4 @@ -0,0 +1,143 @@ +dnl A function to check whether the Java compiler supports enums. +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/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@. +# +# *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 +# Copyright (C) 2001-2009 Roberto Bagnara +# +# 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..6886a2d --- /dev/null +++ b/m4/ac_prog_javah.m4 @@ -0,0 +1,50 @@ +##### 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 +# Copyright (C) 2001-2009 Roberto Bagnara +# +# 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 +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([#include ] ,,[ + 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([#include ], + CPPFLAGS="$ac_save_CPPFLAGS", + AC_MSG_WARN([unable to include ]) + JAVAH=no) + CPPFLAGS="$ac_save_CPPFLAGS"]) +fi]) diff --git a/m4/ac_text_md5sum.m4 b/m4/ac_text_md5sum.m4 new file mode 100644 index 0000000..73821e1 --- /dev/null +++ b/m4/ac_text_md5sum.m4 @@ -0,0 +1,37 @@ +dnl A function to set the command for computing the MD5 checksum of text files. +dnl Copyright (C) 2001-2009 Roberto Bagnara +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://www.cs.unipr.it/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/lib-ld.m4 b/m4/lib-ld.m4 new file mode 100644 index 0000000..96c4e2c --- /dev/null +++ b/m4/lib-ld.m4 @@ -0,0 +1,110 @@ +# lib-ld.m4 serial 3 (gettext-0.13) +dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl Subroutines of libtool.m4, +dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision +dnl with libtool.m4. + +dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. +AC_DEFUN([AC_LIB_PROG_LD_GNU], +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by GCC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]* | [A-Za-z]:[\\/]*)] + [re_direlt='/[^/][^/]*/\.\./'] + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(acl_cv_path_LD, +[if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break ;; + *) + test "$with_gnu_ld" != yes && break ;; + esac + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$acl_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT($LD) +else + AC_MSG_RESULT(no) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_LIB_PROG_LD_GNU +]) diff --git a/m4/lib-link.m4 b/m4/lib-link.m4 new file mode 100644 index 0000000..ea0b0c4 --- /dev/null +++ b/m4/lib-link.m4 @@ -0,0 +1,553 @@ +# lib-link.m4 serial 6 (gettext-0.14.3) +dnl Copyright (C) 2001-2005 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_PREREQ(2.50) + +dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and +dnl augments the CPPFLAGS variable. +AC_DEFUN([AC_LIB_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + ac_cv_lib[]Name[]_libs="$LIB[]NAME" + ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" + ac_cv_lib[]Name[]_cppflags="$INC[]NAME" + ]) + LIB[]NAME="$ac_cv_lib[]Name[]_libs" + LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" + INC[]NAME="$ac_cv_lib[]Name[]_cppflags" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the + dnl results of this search when this library appears as a dependency. + HAVE_LIB[]NAME=yes + undefine([Name]) + undefine([NAME]) +]) + +dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) +dnl searches for libname and the libraries corresponding to explicit and +dnl implicit dependencies, together with the specified include files and +dnl the ability to compile and link the specified testcode. If found, it +dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and +dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and +dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs +dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. +AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + + dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + + dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, + dnl because if the user has installed lib[]Name and not disabled its use + dnl via --without-lib[]Name-prefix, he wants to use it. + ac_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + + AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ + ac_save_LIBS="$LIBS" + LIBS="$LIBS $LIB[]NAME" + AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) + LIBS="$ac_save_LIBS" + ]) + if test "$ac_cv_lib[]Name" = yes; then + HAVE_LIB[]NAME=yes + AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) + AC_MSG_CHECKING([how to link with lib[]$1]) + AC_MSG_RESULT([$LIB[]NAME]) + else + HAVE_LIB[]NAME=no + dnl If $LIB[]NAME didn't lead to a usable library, we don't need + dnl $INC[]NAME either. + CPPFLAGS="$ac_save_CPPFLAGS" + LIB[]NAME= + LTLIB[]NAME= + fi + AC_SUBST([HAVE_LIB]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + undefine([Name]) + undefine([NAME]) +]) + +dnl Determine the platform dependent parameters needed to use rpath: +dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator, +dnl hardcode_direct, hardcode_minus_L. +AC_DEFUN([AC_LIB_RPATH], +[ + dnl Tell automake >= 1.10 to complain if config.rpath is missing. + m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) + AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS + AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld + AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host + AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir + AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + ]) + wl="$acl_cv_wl" + libext="$acl_cv_libext" + shlibext="$acl_cv_shlibext" + hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + hardcode_direct="$acl_cv_hardcode_direct" + hardcode_minus_L="$acl_cv_hardcode_minus_L" + dnl Determine whether the user wants rpath handling at all. + AC_ARG_ENABLE(rpath, + [ --disable-rpath do not hardcode runtime library paths], + :, enable_rpath=yes) +]) + +dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. +AC_DEFUN([AC_LIB_LINKFLAGS_BODY], +[ + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_LIB_ARG_WITH([lib$1-prefix], +[ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib + --without-lib$1-prefix don't search for lib$1 in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi +]) + dnl Search the library and its dependencies in $additional_libdir and + dnl $LDFLAGS. Using breadth-first-seach. + LIB[]NAME= + LTLIB[]NAME= + INC[]NAME= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='$1 $2' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + dnl See if it was already located by an earlier AC_LIB_LINKFLAGS + dnl or AC_LIB_HAVE_LINKFLAGS call. + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" + else + dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined + dnl that this library doesn't exist. So just drop it. + : + fi + else + dnl Search the library lib$name in $additional_libdir and $LDFLAGS + dnl and the already constructed $LIBNAME/$LTLIBNAME. + found_dir= + found_la= + found_so= + found_a= + if test $use_additional = yes; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + found_dir="$additional_libdir" + found_so="$additional_libdir/lib$name.$shlibext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + else + if test -f "$additional_libdir/lib$name.$libext"; then + found_dir="$additional_libdir" + found_a="$additional_libdir/lib$name.$libext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + found_dir="$dir" + found_so="$dir/lib$name.$shlibext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + else + if test -f "$dir/lib$name.$libext"; then + found_dir="$dir" + found_a="$dir/lib$name.$libext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + dnl Found the library. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + dnl Linking with a shared library. We attempt to hardcode its + dnl directory into the executable's runpath, unless it's the + dnl standard /usr/lib. + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then + dnl No hardcoding is needed. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + dnl The hardcoding into $LIBNAME is system dependent. + if test "$hardcode_direct" = yes; then + dnl Using DIR/libNAME.so during linking hardcodes DIR into the + dnl resulting binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + dnl Rely on "-L$found_dir". + dnl But don't add it if it's already contained in the LDFLAGS + dnl or the already constructed $LIBNAME + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" + fi + if test "$hardcode_minus_L" != no; then + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH + dnl here, because this doesn't fit in flags passed to the + dnl compiler. So give up. No hardcoding. This affects only + dnl very old systems. + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + dnl Linking with a static library. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" + else + dnl We shouldn't come here, but anyway it's good to have a + dnl fallback. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" + fi + fi + dnl Assume the include files are nearby. + additional_includedir= + case "$found_dir" in + */lib | */lib/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + dnl Potentially add $additional_includedir to $INCNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's /usr/local/include and we are using GCC on Linux, + dnl 3. if it's already present in $CPPFLAGS or the already + dnl constructed $INCNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INC[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $INCNAME. + INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + dnl Look for dependencies. + if test -n "$found_la"; then + dnl Read the .la file. It defines the variables + dnl dlname, library_names, old_library, dependency_libs, current, + dnl age, revision, installed, dlopen, dlpreopen, libdir. + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + dnl We use only dependency_libs. + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's /usr/local/lib and we are using GCC on Linux, + dnl 3. if it's already present in $LDFLAGS or the already + dnl constructed $LIBNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LIBNAME. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LTLIBNAME. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + dnl Handle this in the next round. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + dnl Handle this in the next round. Throw away the .la's + dnl directory; it is already contained in a preceding -L + dnl option. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + dnl Most likely an immediate library name. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" + ;; + esac + done + fi + else + dnl Didn't find the library; assume it is in the system directories + dnl known to the linker and runtime loader. (All the system + dnl directories known to the linker should also be known to the + dnl runtime loader, otherwise the system is severely misconfigured.) + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$hardcode_libdir_separator"; then + dnl Weird platform: only the last -rpath option counts, the user must + dnl pass all path elements in one option. We can arrange that for a + dnl single library, but not when more than one $LIBNAMEs are used. + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" + done + dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl. + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + else + dnl The -rpath options are cumulative. + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + dnl When using libtool, the option that works for both libraries and + dnl executables is -R. The -R options are cumulative. + for found_dir in $ltrpathdirs; do + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" + done + fi +]) + +dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, +dnl unless already present in VAR. +dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes +dnl contains two or three consecutive elements that belong together. +AC_DEFUN([AC_LIB_APPENDTOVAR], +[ + for element in [$2]; do + haveit= + for x in $[$1]; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + [$1]="${[$1]}${[$1]:+ }$element" + fi + done +]) diff --git a/m4/lib-prefix.m4 b/m4/lib-prefix.m4 new file mode 100644 index 0000000..0d895ca --- /dev/null +++ b/m4/lib-prefix.m4 @@ -0,0 +1,153 @@ +# lib-prefix.m4 serial 4 (gettext-0.14.2) +dnl Copyright (C) 2001-2005 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and +dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't +dnl require excessive bracketing. +ifdef([AC_HELP_STRING], +[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], +[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) + +dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed +dnl to access previously installed libraries. The basic assumption is that +dnl a user will want packages to use other packages he previously installed +dnl with the same --prefix option. +dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate +dnl libraries, but is otherwise very convenient. +AC_DEFUN([AC_LIB_PREFIX], +[ + AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_HOST]) + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_LIB_ARG_WITH([lib-prefix], +[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib + --without-lib-prefix don't search for libraries in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi +]) + if test $use_additional = yes; then + dnl Potentially add $additional_includedir to $CPPFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's already present in $CPPFLAGS, + dnl 3. if it's /usr/local/include and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + for x in $CPPFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $CPPFLAGS. + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" + fi + fi + fi + fi + dnl Potentially add $additional_libdir to $LDFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's already present in $LDFLAGS, + dnl 3. if it's /usr/local/lib and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + for x in $LDFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LDFLAGS. + LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" + fi + fi + fi + fi + fi +]) + +dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, +dnl acl_final_exec_prefix, containing the values to which $prefix and +dnl $exec_prefix will expand at the end of the configure script. +AC_DEFUN([AC_LIB_PREPARE_PREFIX], +[ + dnl Unfortunately, prefix and exec_prefix get only finally determined + dnl at the end of configure. + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" +]) + +dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the +dnl variables prefix and exec_prefix bound to the values they will have +dnl at the end of the configure script. +AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], +[ + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + $1 + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" +]) diff --git a/m4/libtool.m4 b/m4/libtool.m4 new file mode 100644 index 0000000..39ba996 --- /dev/null +++ b/m4/libtool.m4 @@ -0,0 +1,7357 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008 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 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 56 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_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 + +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 "X$cc_temp" | $Xsed -e 's%.*/%%' -e "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 +_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_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])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 +_LT_PROG_ECHO_BACKSLASH + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +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' + +# 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_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 "X$][$1" | $Xsed -e "$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: +# +# ='`$ECHO "X$" | $Xsed -e "$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' + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$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 "X\\\\\$\$var"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Fix-up fallback echo if it was mangled by the above quoting rules. +case \$lt_ECHO in +*'\\\[$]0 --fallback-echo"')dnl " + lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\` + ;; +esac + +_LT_OUTPUT_LIBTOOL_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]) +cat >"$CONFIG_LT" <<_LTEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate a libtool stub with the current configuration. + +lt_cl_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AS_SHELL_SANITIZE +_AS_PREPARE + +exec AS_MESSAGE_FD>&1 +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 ." + +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) 2008 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. +if test "$no_create" != yes; then + 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) +fi +])# 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 '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + _LT_PROG_XSI_SHELLFNS + + sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + 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)], + [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 + + +# _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([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)]) +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], []) + + +# _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 test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 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" + ]) + 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" != ":"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES +# -------------------------- +# 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 + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + _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=echo + _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 +# ----------------------- +# 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. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +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 "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_SHELL_INIT + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[_LT_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$lt_ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +ECHO=${lt_ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then + # Yippee, $ECHO works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat <<_LT_EOF +[$]* +_LT_EOF + exit 0 +fi + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test -z "$lt_ECHO"; then + if test "X${echo_test_string+set}" != Xset; then + # find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if { echo_test_string=`eval $cmd`; } 2>/dev/null && + { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null + then + break + fi + done + fi + + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : + else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$ECHO" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + ECHO='print -r' + elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + ECHO='printf %s\n' + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + ECHO="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + ECHO=echo + fi + fi + fi + fi + fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +lt_ECHO=$ECHO +if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(lt_ECHO) +]) +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], + [An echo program that does not interpret backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _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 __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*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 + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + 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_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[AC_CHECK_TOOL(AR, ar, false) +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1]) + +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 \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi +_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_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:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test x"[$]$2" = xyes; then + 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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -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; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + 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"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ + = "XX$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 __oline__ "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#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 + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + 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:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_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 +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 + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` + else + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # 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; } +}'` + sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` +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 + 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 + 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.so + # instead of lib.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=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) + 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="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${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 + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[123]]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[[3-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + 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 + 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], + [shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + + # 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;/^$/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 + 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 + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + 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 + 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 + 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([], [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@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 + +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 &1 /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 + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + 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 + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +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 Linux ELF. +linux* | k*bsd*-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_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_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. + AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :) + 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:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:__oline__: $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:__oline__: 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_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +AC_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 + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + _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([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};"\ +" /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 + + # 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 +#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. */ +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_save_LIBS="$LIBS" + lt_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_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -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 + +_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_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)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) +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)= + ;; + 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 + ;; + 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) + 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*) + # IBM XL 8.0 on PPC + _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*) + # 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' + ;; + + 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 + 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) + 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' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # 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*) + # IBM XL C 8.0/Fortran 10.1 on PPC + _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)='-Wl,' + ;; + *Sun\ F*) + # 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)='' + ;; + 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*) + _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@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac +AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) + +# +# 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@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]) + +# +# 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_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' + 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 + 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")) && ([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*) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] +], [ + 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_flag_spec_ld, $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 + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_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 + *\ [[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.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +_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 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(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/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + + 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 + ;; + + 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) + 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= + 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; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # 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; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + xl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + 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; $ECHO \"$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*) + # 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)= + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_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 $compiler_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 $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' + 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 $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 + ;; + + 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 $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 + + 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 + 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")) && ([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 + _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 $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; 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 + _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' + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _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. + _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 `$ECHO "X$deplibs" | $Xsed -e '\''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(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + 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 + ;; + + freebsd1*) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_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 -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 -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_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 -a "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${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_flag_spec_ld, $1)='+b $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 -a "$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 -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_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' + ;; + *) + _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 $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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. + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + AC_LINK_IFELSE(int foo(void) {}, + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + ) + LDFLAGS="$save_LDFLAGS" + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -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" && $ECHO "X-set_version $verstring" | $Xsed` -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" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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" && $ECHO "X-set_version $verstring" | $Xsed` -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} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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" && $ECHO "X-set_version $verstring" | $Xsed` -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 "X-set_version $verstring" | $Xsed` -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 ${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 ${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_MSG_CHECKING([whether -lc should be explicitly linked in]) + $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_TAGVAR(archive_cmds_need_lc, $1)=no + else + _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* + AC_MSG_RESULT([$_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_flag_spec_ld], [1], + [[If ld is used when linking, flag to hardcode $libdir into a binary + during linking. This must work even if $libdir does not exist]]) +_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([], [fix_srcfile_path], [1], + [Fix the shell variable $srcfile for the compiler]) +_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([], [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_PROG_CXX +# ------------ +# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++ +# compiler, we have our own version here. +m4_defun([_LT_PROG_CXX], +[ +pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes]) +AC_PROG_CXX +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_CXX + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_CXX], []) + + +# _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], +[AC_REQUIRE([_LT_PROG_CXX])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl + +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_flag_spec_ld, $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(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_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + compiler=$CC + _LT_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 -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_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 "\-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 + _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 $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; 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 + _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' + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _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 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*) + # _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(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 + ;; + 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 + ;; + + freebsd[[12]]*) + # 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*) + ;; + + 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; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_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; $ECHO "X$list" | $Xsed' + ;; + *) + 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 -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_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" && $ECHO "X-set_version $verstring" | $Xsed` -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 -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -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) + 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; $ECHO "X$list" | $Xsed' + + _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 | $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 | $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 | $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 | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 will 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; $ECHO \"$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=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + xl*) + # 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; $ECHO \"$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='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_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=echo + 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" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -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" && $ECHO "X-set_version $verstring" | $Xsed` -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 "X-set_version $verstring" | $Xsed` -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=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + 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" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${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 "\-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*) + # 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='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_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 -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 -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_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 "\-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(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 + 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_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 +# 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 +]) +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 $p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p in + -L* | -R*) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_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 + ;; + + *.$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 + +# 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*) + # 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_PROG_F77 +# ------------ +# Since AC_PROG_F77 is broken, in that it returns the empty string +# if there is no fortran compiler, we have our own version here. +m4_defun([_LT_PROG_F77], +[ +pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes]) +AC_PROG_F77 +if test -z "$F77" || test "X$F77" = "Xno"; then + _lt_disable_F77=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_F77 + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_F77], []) + + +# _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_REQUIRE([_LT_PROG_F77])dnl +AC_LANG_PUSH(Fortran 77) + +_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_flag_spec_ld, $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(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 + CC=${F77-"f77"} + 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" +fi # test "$_lt_disable_F77" != yes + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_PROG_FC +# ----------- +# Since AC_PROG_FC is broken, in that it returns the empty string +# if there is no fortran compiler, we have our own version here. +m4_defun([_LT_PROG_FC], +[ +pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes]) +AC_PROG_FC +if test -z "$FC" || test "X$FC" = "Xno"; then + _lt_disable_FC=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_FC + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_FC], []) + + +# _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_REQUIRE([_LT_PROG_FC])dnl +AC_LANG_PUSH(Fortran) + +_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_flag_spec_ld, $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(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 + CC=${FC-"f95"} + 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" +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_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +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 + +## 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" +])# _LT_LANG_GCJ_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_GCC=$GCC +GCC= +CC=${RC-"windres"} +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" +])# _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_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_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"}, \ + = c,a/b,, \ + && 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_XSI_SHELLFNS +# --------------------- +# Bourne and XSI compatible variants of some useful shell functions. +m4_defun([_LT_PROG_XSI_SHELLFNS], +[case $xsi_shell in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# 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 () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac +} + +# func_basename file +func_basename () +{ + func_basename_result="${1##*/}" +} + +# 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 () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}" +} + +# 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_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}"} +} + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=${1%%=*} + func_opt_split_arg=${1#*=} +} + +# func_lo2o object +func_lo2o () +{ + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=${1%.*}.lo +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=$(( $[*] )) +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=${#1} +} + +_LT_EOF + ;; + *) # Bourne compatible functions. + cat << \_LT_EOF >> "$cfgfile" + +# 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 () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "X${1}" | $Xsed -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 file +func_basename () +{ + func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +} + +dnl func_dirname_and_basename +dnl A portable version of this function is already defined in general.m4sh +dnl so there is no need for it here. + +# 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 "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; + esac +} + +# sed scripts: +my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q' +my_sed_long_arg='1s/^-[[^=]]*=//' + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` + func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` +} + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'` +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "$[@]"` +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len` +} + +_LT_EOF +esac + +case $lt_shell_append in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$[1]+=\$[2]" +} +_LT_EOF + ;; + *) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$[1]=\$$[1]\$[2]" +} + +_LT_EOF + ;; + esac +]) diff --git a/m4/ltoptions.m4 b/m4/ltoptions.m4 new file mode 100644 index 0000000..34151a3 --- /dev/null +++ b/m4/ltoptions.m4 @@ -0,0 +1,368 @@ +# Helper functions for option handling. -*- 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 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], [0], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [0], [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], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [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..b8e154f --- /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. + +# Generated from ltversion.in. + +# serial 3012 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.2.6]) +m4_define([LT_PACKAGE_REVISION], [1.3012]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.2.6' +macro_revision='1.3012' +_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..637bb20 --- /dev/null +++ b/m4/lt~obsolete.m4 @@ -0,0 +1,92 @@ +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007 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 4 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_RC], [AC_DEFUN([AC_LIBTOOL_RC])]) +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])]) diff --git a/m4/m4.m4 b/m4/m4.m4 new file mode 100644 index 0000000..f27d8c0 --- /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(,mac,bug)d'nl + test -z "`$ac_path_M4 -F conftest.m4f &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 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/ppl.m4 b/m4/ppl.m4 new file mode 100644 index 0000000..e3ef4fc --- /dev/null +++ b/m4/ppl.m4 @@ -0,0 +1,287 @@ +dnl A function to test for the existence and usability of particular +dnl versions of the PPL, defining macros containing the required paths. +dnl Copyright (C) 2001-2009 Roberto Bagnara +dnl Copyright (C) 1997 Owen Taylor +dnl +dnl This file is part of the Parma Polyhedra Library (PPL). +dnl +dnl The PPL is free software; you can redistribute it and/or modify it +dnl under the terms of the GNU General Public License as published by the +dnl Free Software Foundation; either version 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://www.cs.unipr.it/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 +#include +#include +#include + +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 +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..ee29caf --- /dev/null +++ b/m4/ppl_c.m4 @@ -0,0 +1,285 @@ +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) 2001-2009 Roberto Bagnara +dnl Copyright (C) 1997 Owen Taylor +dnl +dnl This file is part of the Parma Polyhedra Library (PPL). +dnl +dnl The PPL is free software; you can redistribute it and/or modify it +dnl under the terms of the GNU General Public License as published by the +dnl Free Software Foundation; either version 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://www.cs.unipr.it/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 +#include +#include + +#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 +], +[ + 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..1c8ff70 --- /dev/null +++ b/missing @@ -0,0 +1,367 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2006-05-10.23 + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006 +# Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: +sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' +sed_minuso='s/.* -o \([^ ]*\).*/\1/p' + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case $1 in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + autom4te touch the output file, or create a stub one + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + +esac + +# Now exit if we have it, but it failed. Also exit now if we +# don't have it and --version was passed (most likely to detect +# the program). +case $1 in + lex|yacc) + # Not GNU programs, they don't have --version. + ;; + + tar) + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + exit 1 + fi + ;; + + *) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + # Could not run --version or --help. This is probably someone + # running `$TOOL --version' or `$TOOL --help' to check whether + # $TOOL exists and not knowing $TOOL uses missing. + exit 1 + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case $1 in + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case $f in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te) + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if test ! -f y.tab.h; then + echo >y.tab.h + fi + if test ! -f y.tab.c; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if test ! -f lex.yy.c; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit 1 + fi + ;; + + makeinfo) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + # The file to touch is that specified with -o ... + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -z "$file"; then + # ... or it is the one specified with @setfilename ... + infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n ' + /^@setfilename/{ + s/.* \([^ ]*\) *$/\1/ + p + q + }' $infile` + # ... or it is derived from the source name (dir/f.texi becomes f.info) + test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info + fi + # If the file does not exist, the user really needs makeinfo; + # let's fail without touching anything. + test -f $file || exit 1 + touch $file + ;; + + tar) + shift + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar "$@" && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar "$@" && exit 0 + fi + firstarg="$1" + if shift; then + case $firstarg in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + case $firstarg in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/mkinstalldirs b/mkinstalldirs new file mode 100755 index 0000000..ef7e16f --- /dev/null +++ b/mkinstalldirs @@ -0,0 +1,161 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy + +scriptversion=2006-05-11.19 + +# Original author: Noah Friedman +# Created: 1993-05-16 +# Public domain. +# +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +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 ." + +# process command line arguments +while test $# -gt 0 ; do + case $1 in + -h | --help | --h*) # -h for help + echo "$usage" + exit $? + ;; + -m) # -m PERM arg + shift + test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } + dirmode=$1 + shift + ;; + --version) + echo "$0 $scriptversion" + exit $? + ;; + --) # stop option processing + shift + break + ;; + -*) # unknown option + echo "$usage" 1>&2 + exit 1 + ;; + *) # first non-opt arg + break + ;; + esac +done + +for file +do + if test -d "$file"; then + shift + else + break + fi +done + +case $# in + 0) exit 0 ;; +esac + +# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and +# mkdir -p a/c at the same time, both will detect that a is missing, +# one will create a, then the other will try to create a and die with +# a "File exists" error. This is a problem when calling mkinstalldirs +# from a parallel make. We use --version in the probe to restrict +# ourselves to GNU mkdir, which is thread-safe. +case $dirmode in + '') + if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + test -d ./-p && rmdir ./-p + test -d ./--version && rmdir ./--version + fi + ;; + *) + if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && + test ! -d ./--version; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + else + # Clean up after NextStep and OpenStep mkdir. + for d in ./-m ./-p ./--version "./$dirmode"; + do + test -d $d && rmdir $d + done + fi + ;; +esac + +for file +do + case $file in + /*) pathcomp=/ ;; + *) pathcomp= ;; + esac + oIFS=$IFS + IFS=/ + set fnord $file + shift + IFS=$oIFS + + for d + do + test "x$d" = x && continue + + pathcomp=$pathcomp$d + case $pathcomp in + -*) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + else + if test ! -z "$dirmode"; then + echo "chmod $dirmode $pathcomp" + lasterr= + chmod "$dirmode" "$pathcomp" || lasterr=$? + + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi + fi + fi + + pathcomp=$pathcomp/ + done +done + +exit $errstatus + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/packaging/ppl-0.10.2-Makefile.patch b/packaging/ppl-0.10.2-Makefile.patch new file mode 100644 index 0000000..307e5c7 --- /dev/null +++ b/packaging/ppl-0.10.2-Makefile.patch @@ -0,0 +1,12 @@ +diff -ur ppl-0.10.1/Watchdog/doc/Makefile.in ppl-0.10.1-patched/Watchdog/doc/Makefile.in +--- ppl-0.10.1/Watchdog/doc/Makefile.in 2000-04-11 10:36:59.000000000 +0100 ++++ ppl-0.10.1-patched/Watchdog/doc/Makefile.in 2009-04-11 17:53:10.000000000 +0100 +@@ -163,7 +163,7 @@ + debug_flag = @debug_flag@ + + # All the documentation in docdir. +-docdir = @docdir@ ++docdir = @docdir@/pwl + dvidir = @dvidir@ + exec_prefix = @exec_prefix@ + host = @host@ diff --git a/packaging/ppl-missing-macro.patch b/packaging/ppl-missing-macro.patch new file mode 100644 index 0000000..90fb65f --- /dev/null +++ b/packaging/ppl-missing-macro.patch @@ -0,0 +1,13 @@ +diff -Naurp ppl-0.10.2-orig/configure ppl-0.10.2/configure +--- ppl-0.10.2-orig/configure 2010-02-24 07:20:28.000000000 -0500 ++++ ppl-0.10.2/configure 2010-02-24 07:34:07.000000000 -0500 +@@ -16443,6 +16443,9 @@ cat >>conftest.$ac_ext <<_ACEOF + #GMP version 4.1.3 or higher is required + #endif + ++/* workaroud for obsoleted MACRO in new gmp version */ ++#define __GMP_BITS_PER_MP_LIMB 123 /* dummy for GMP_NUMB_BITS etc */ ++ + int + main() { + std::string header_version; diff --git a/packaging/ppl.changes b/packaging/ppl.changes new file mode 100644 index 0000000..fbc863a --- /dev/null +++ b/packaging/ppl.changes @@ -0,0 +1,12 @@ +* Wed Feb 24 2010 Austin Zhang -0.10.2-10 +- Fixed missing macro issue due to gmp update + +* Tue Feb 09 2010 Austin Zhang -0.10.2-10 +- Initial import into Moblin +- Removed no IA content +- Using spectacle + +* Fri Sep 11 2009 Caolan McNamara - 0.10.2-10 +- Resolves: rhbz#521588 stick pl include before Yap include to stop + configure-time misdetection to resolve FTBFS + diff --git a/packaging/ppl.hh b/packaging/ppl.hh new file mode 100644 index 0000000..53d4d13 --- /dev/null +++ b/packaging/ppl.hh @@ -0,0 +1,49 @@ +/* This is the header file switcher of the Parma Polyhedra Library. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#if defined(__x86_64__) +#include "ppl-x86_64.hh" +#elif defined(__i386__) +#include "ppl-i386.hh" +#elif defined(__powerpc64__) +#include "ppl-ppc64.hh" +#elif defined(__powerpc__) +#include "ppl-ppc.hh" +#elif defined(__ia64__) +#include "ppl-ia64.hh" +#elif defined(__alpha__) +#include "ppl-alpha.hh" +#elif defined(__arm__) +#include "ppl-arm.hh" +#elif defined(__s390x__) +#include "ppl-s390x.hh" +#elif defined(__s390__) +#include "ppl-s390.hh" +#elif defined(__sh__) +#include "ppl-sh.hh" +#elif defined(__sparc__) && defined(__arch64__) +#include "ppl-sparc64.hh" +#elif defined(__sparc__) +#include "ppl-sparc.hh" +#else +#error "This architecture is not supported by the currently installed ppl-devel packages." +#endif diff --git a/packaging/ppl.spec b/packaging/ppl.spec new file mode 100644 index 0000000..6da3079 --- /dev/null +++ b/packaging/ppl.spec @@ -0,0 +1,232 @@ +# +# Do NOT Edit the Auto-generated Part! +# Generated by: spectacle version 0.22 +# +# >> macros +# << macros +%define keepstatic 1 + +Name: ppl +Summary: The Parma Polyhedra Library: a library of numerical abstractions +Version: 0.10.2 +Release: 10 +Group: Development/Libraries +License: GPLv3+ +URL: http://www.cs.unipr.it/ppl/ +Source0: ftp://ftp.cs.unipr.it/pub/ppl/releases/%{version}/%{name}-%{version}.tar.bz2 +Source1: ppl.hh +Source2: ppl_c.h +Source3: pwl.hh +Source100: ppl.yaml +Patch0: ppl-0.10.2-Makefile.patch +Patch1: ppl-missing-macro.patch +Requires(post): /sbin/ldconfig +Requires(postun): /sbin/ldconfig +BuildRequires: gmp-devel >= 4.1.3 +BuildRequires: m4 >= 1.4.8 + + +%description +The Parma Polyhedra Library (PPL) is a library for the manipulation of +(not necessarily closed) convex polyhedra and other numerical +abstractions. The applications of convex polyhedra include program +analysis, optimized compilation, integer and combinatorial +optimization and statistical data-editing. The Parma Polyhedra +Library comes with several user friendly interfaces, is fully dynamic +(available virtual memory is the only limitation to the dimension of +anything), written in accordance to all the applicable standards, +exception-safe, rather efficient, thoroughly documented, and free +software. This package provides all what is necessary to run +applications using the PPL through its C and C++ interfaces. + + + +%package pwl-devel +Summary: Development tools for the Parma Watchdog Library +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} +Requires: %{name}-pwl = %{version}-%{release} + +%description pwl-devel +-devel +The header files, documentation and static libraries for developing +applications using the Parma Watchdog Library. + + +%package pwl-static +Summary: Static archive for the Parma Watchdog Library +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} +Requires: %{name}-pwl-devel = %{version}-%{release} + +%description pwl-static +-static +This package contains the static archive for the Parma Watchdog Library. + + +%package devel +Summary: Development tools for the Parma Polyhedra Library C and C++ interfaces +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} +Requires: %{name} = %{version}-%{release}, gmp-devel >= 4.1.3 + +%description devel +The header files, Autoconf macro and minimal documentation for +developing applications using the Parma Polyhedra Library through +its C and C++ interfaces. + + +%package static +Summary: Static archives for the Parma Polyhedra Library C and C++ interfaces +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} +Requires: %{name}-devel = %{version}-%{release} + +%description static +The static archives for the Parma Polyhedra Library C and C++ interfaces. + +%package pwl +Summary: The Parma Watchdog Library: a C++ library for watchdog timers +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} +Requires(post): /sbin/ldconfig +Requires(postun): /sbin/ldconfig + +%description pwl +The Parma Watchdog Library (PWL) provides support for multiple, +concurrent watchdog timers on systems providing setitimer(2). This +package provides all what is necessary to run applications using the +PWL. The PWL is currently distributed with the Parma Polyhedra +Library, but is totally independent from it. + + + +%prep +%setup -q -n %{name}-%{version} + +# ppl-0.10.2-Makefile.patch +%patch0 -p1 +# ppl-missing-macro.patch +%patch1 -p1 +# >> setup +# << setup + +%build +# >> build pre +# << build pre + + + +# >> build post +CPPFLAGS="-I%{_includedir}/glpk" +CPPFLAGS="$CPPFLAGS -I%{_libdir}/gprolog-`gprolog --version 2>&1 | head -1 | sed -e "s/.* \([^ ]*\)$/\1/g"`/include" +CPPFLAGS="$CPPFLAGS -I`pl -dump-runtime-variables | grep PLBASE= | sed 's/PLBASE="\(.*\)";/\1/'`/include" +CPPFLAGS="$CPPFLAGS -I%{_includedir}/Yap" + +CXXFLAGS=`echo $RPM_OPT_FLAGS|sed -e 's/-floop-interchange//g' -e 's/-floop-strip-mine//g' -e 's/-floop-block//g' -e 's/-ftree-loop-distribution//g'` +export CXXFLAGS +%configure --docdir=%{_datadir}/doc/%{name}-%{version} --enable-shared --disable-rpath --enable-interfaces="c++ c" CPPFLAGS="$CPPFLAGS" +sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' libtool +sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool +sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' Watchdog/libtool +sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' Watchdog/libtool +make %{?_smp_mflags} + + +# << build post +%install +rm -rf %{buildroot} +# >> install pre +# << install pre + +# >> install post +rm -rf %{buildroot} +make DESTDIR=%{buildroot} INSTALL="%{__install} -p" install +rm -f %{buildroot}%{_libdir}/*.la %{buildroot}%{_libdir}/%{name}/*.la + +# In order to avoid multiarch conflicts when installed for multiple +# architectures (e.g., i386 and x86_64), we rename the header files +# of the ppl-devel and ppl-pwl-devel packages. They are substituted with +# ad-hoc switchers that select the appropriate header file depending on +# the architecture for which the compiler is compiling. + +%ifarch %{arm} +normalized_arch=arm +%else +normalized_arch=i386 +%endif + +mv %{buildroot}/%{_includedir}/ppl.hh %{buildroot}/%{_includedir}/ppl-${normalized_arch}.hh +install -m644 %{SOURCE1} %{buildroot}/%{_includedir}/ppl.hh +mv %{buildroot}/%{_includedir}/ppl_c.h %{buildroot}/%{_includedir}/ppl_c-${normalized_arch}.h +install -m644 %{SOURCE2} %{buildroot}/%{_includedir}/ppl_c.h +mv %{buildroot}/%{_includedir}/pwl.hh %{buildroot}/%{_includedir}/pwl-${normalized_arch}.hh +install -m644 %{SOURCE3} %{buildroot}/%{_includedir}/pwl.hh + +rm -rf %{buildroot}%{_datadir}/doc/%{name}-%{version}/* + +# << install post + + + +%post -p /sbin/ldconfig + +%postun -p /sbin/ldconfig + +%post pwl -p /sbin/ldconfig + +%postun pwl -p /sbin/ldconfig + +%files +%defattr(-,root,root,-) +# >> files +%{_libdir}/libppl.so.* +%{_libdir}/libppl_c.so.* +%{_bindir}/ppl-config +%{_mandir}/man1/ppl-config.1.gz +/usr/share/man/man1/ppl_lcdd.1.gz +/usr/bin/ppl_lcdd +#%dir %{_libdir}/%{name} +%dir %{_datadir}/doc/%{name}-%{version} +# << files + + +%files pwl-devel +%defattr(-,root,root,-) +# >> files pwl-devel +%{_includedir}/pwl*.hh +%{_libdir}/libpwl.so +# << files pwl-devel + +%files pwl-static +%defattr(-,root,root,-) +# >> files pwl-static +%{_libdir}/libpwl.a +# << files pwl-static + +%files devel +%defattr(-,root,root,-) +# >> files devel +%{_includedir}/ppl*.hh +%{_includedir}/ppl_c*.h +%{_libdir}/libppl.so +%{_libdir}/libppl_c.so +%{_mandir}/man3/libppl.3.gz +%{_mandir}/man3/libppl_c.3.gz +%{_datadir}/aclocal/ppl.m4 +%{_datadir}/aclocal/ppl_c.m4 +# << files devel + +%files static +%defattr(-,root,root,-) +# >> files static +%{_libdir}/libppl.a +%{_libdir}/libppl_c.a +# << files static + +%files pwl +%defattr(-,root,root,-) +# >> files pwl +%{_libdir}/libpwl.so.* +# << files pwl + diff --git a/packaging/ppl.yaml b/packaging/ppl.yaml new file mode 100644 index 0000000..ec559f1 --- /dev/null +++ b/packaging/ppl.yaml @@ -0,0 +1,88 @@ +Name: ppl +Summary: "The Parma Polyhedra Library: a library of numerical abstractions" +Version: 0.10.2 +Release: 10 +Group: Development/Libraries +License: GPLv3+ +URL: http://www.cs.unipr.it/ppl/ +Sources: + - ftp://ftp.cs.unipr.it/pub/ppl/releases/%{version}/%{name}-%{version}.tar.bz2 + - ppl.hh + - ppl_c.h + - pwl.hh +Patches: + - ppl-0.10.2-Makefile.patch + - ppl-missing-macro.patch +Description: | + The Parma Polyhedra Library (PPL) is a library for the manipulation of + (not necessarily closed) convex polyhedra and other numerical + abstractions. The applications of convex polyhedra include program + analysis, optimized compilation, integer and combinatorial + optimization and statistical data-editing. The Parma Polyhedra + Library comes with several user friendly interfaces, is fully dynamic + (available virtual memory is the only limitation to the dimension of + anything), written in accordance to all the applicable standards, + exception-safe, rather efficient, thoroughly documented, and free + software. This package provides all what is necessary to run + applications using the PPL through its C and C++ interfaces. + +RequiresPost: + - /sbin/ldconfig +RequiresPostUn: + - /sbin/ldconfig + +PkgBR: + - gmp-devel >= 4.1.3 + - m4 >= 1.4.8 +Configure: none +Builder: none +SubPackages: + - Name: pwl-devel + Summary: Development tools for the Parma Watchdog Library + Group: Development/Libraries + Description: | + -devel + The header files, documentation and static libraries for developing + applications using the Parma Watchdog Library. + Requires: + - "%{name}-pwl = %{version}-%{release}" + + - Name: pwl-static + Summary: Static archive for the Parma Watchdog Library + Group: Development/Libraries + Description: | + -static + This package contains the static archive for the Parma Watchdog Library. + Requires: + - "%{name}-pwl-devel = %{version}-%{release}" + + - Name: devel + Summary: Development tools for the Parma Polyhedra Library C and C++ interfaces + Group: Development/Libraries + Description: | + The header files, Autoconf macro and minimal documentation for + developing applications using the Parma Polyhedra Library through + its C and C++ interfaces. + Requires: + - "%{name} = %{version}-%{release}, gmp-devel >= 4.1.3" + + - Name: static + Summary: Static archives for the Parma Polyhedra Library C and C++ interfaces + Group: Development/Libraries + Description: The static archives for the Parma Polyhedra Library C and C++ interfaces. + Requires: + - "%{name}-devel = %{version}-%{release}" + + - Name: pwl + Summary: "The Parma Watchdog Library: a C++ library for watchdog timers" + Group: Development/Libraries + Description: | + The Parma Watchdog Library (PWL) provides support for multiple, + concurrent watchdog timers on systems providing setitimer(2). This + package provides all what is necessary to run applications using the + PWL. The PWL is currently distributed with the Parma Polyhedra + Library, but is totally independent from it. + RequiresPost: + - /sbin/ldconfig + RequiresPostUn: + - /sbin/ldconfig diff --git a/packaging/ppl_c.h b/packaging/ppl_c.h new file mode 100644 index 0000000..dc62d50 --- /dev/null +++ b/packaging/ppl_c.h @@ -0,0 +1,49 @@ +/* Header file switcher for the C interface. -*- C -*- + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#if defined(__x86_64__) +#include "ppl_c-x86_64.h" +#elif defined(__i386__) +#include "ppl_c-i386.h" +#elif defined(__powerpc64__) +#include "ppl_c-ppc64.h" +#elif defined(__powerpc__) +#include "ppl_c-ppc.h" +#elif defined(__ia64__) +#include "ppl_c-ia64.h" +#elif defined(__alpha__) +#include "ppl_c-alpha.h" +#elif defined(__arm__) +#include "ppl_c-arm.h" +#elif defined(__s390x__) +#include "ppl_c-s390x.h" +#elif defined(__s390__) +#include "ppl_c-s390.h" +#elif defined(__sh__) +#include "ppl_c-sh.h" +#elif defined(__sparc__) && defined(__arch64__) +#include "ppl_c-sparc64.h" +#elif defined(__sparc__) +#include "ppl_c-sparc.h" +#else +#error "This architecture is not supported by the currently installed ppl-devel packages." +#endif diff --git a/packaging/pwl.hh b/packaging/pwl.hh new file mode 100644 index 0000000..a89f27d --- /dev/null +++ b/packaging/pwl.hh @@ -0,0 +1,49 @@ +/* This is the header file switcher of the Parma Watchdog Library. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Watchdog Library (PWL). + +The PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the CS@Parma software +site: http://www.cs.unipr.it/Software/ . */ + +#if defined(__x86_64__) +#include "pwl-x86_64.hh" +#elif defined(__i386__) +#include "pwl-i386.hh" +#elif defined(__powerpc64__) +#include "pwl-ppc64.hh" +#elif defined(__powerpc__) +#include "pwl-ppc.hh" +#elif defined(__ia64__) +#include "pwl-ia64.hh" +#elif defined(__alpha__) +#include "pwl-alpha.hh" +#elif defined(__arm__) +#include "pwl-arm.hh" +#elif defined(__s390x__) +#include "pwl-s390x.hh" +#elif defined(__s390__) +#include "pwl-s390.hh" +#elif defined(__sh__) +#include "pwl-sh.hh" +#elif defined(__sparc__) && defined(__arch64__) +#include "pwl-sparc64.hh" +#elif defined(__sparc__) +#include "pwl-sparc.hh" +#else +#error "This architecture is not supported by the currently installed ppl-pwl-devel packages." +#endif diff --git a/ppl-config.h.in b/ppl-config.h.in new file mode 100644 index 0000000..a01dee5 --- /dev/null +++ b/ppl-config.h.in @@ -0,0 +1,393 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + + +/* 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 `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 header file. */ +#undef PPL_HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef PPL_HAVE_FENV_H + +/* Define to 1 if you have the header file. */ +#undef PPL_HAVE_GETOPT_H + +/* Define to 1 if you have the header file. */ +#undef PPL_HAVE_GLPK_GLPK_H + +/* Define to 1 if you have the header file. */ +#undef PPL_HAVE_GLPK_H + +/* Define to 1 if you have the header file. */ +#undef PPL_HAVE_IEEEFP_H + +/* Define to 1 if you have the 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 header file. */ +#undef PPL_HAVE_MEMORY_H + +/* Define to 1 if you have the `setitimer' function. */ +#undef HAVE_SETITIMER + +/* Define to 1 if the system has the type `siginfo_t'. */ +#undef HAVE_SIGINFO_T + +/* Define to 1 if you have the header file. */ +#undef PPL_HAVE_SIGNAL_H + +/* Define to 1 if you have the header file. */ +#undef PPL_HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef PPL_HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef PPL_HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef PPL_HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef PPL_HAVE_SYS_RESOURCE_H + +/* Define to 1 if you have the header file. */ +#undef PPL_HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef PPL_HAVE_SYS_TIME_H + +/* Define to 1 if you have the 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 `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 header file. */ +#undef PPL_HAVE_UNISTD_H + +/* Define to 1 if `_mp_alloc' is member of `__mpz_struct'. */ +#undef PPL_HAVE___MPZ_STRUCT__MP_ALLOC + +/* Define to 1 if `_mp_d' is member of `__mpz_struct'. */ +#undef PPL_HAVE___MPZ_STRUCT__MP_D + +/* Define to 1 if `_mp_size' is 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 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 + +/* Not zero if C++ supports exact output for doubles. */ +#undef PPL_CXX_DOUBLE_EXACT_OUTPUT + +/* The binary format of C++ floats, if supported; undefined otherwise. */ +#undef PPL_CXX_FLOAT_BINARY_FORMAT + +/* Not zero if C++ supports exact output for floats. */ +#undef PPL_CXX_FLOAT_EXACT_OUTPUT + +/* Not zero if the C++ compiler has the remainder bug. */ +#undef PPL_CXX_HAS_REMAINDER_BUG + +/* 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 C++ supports exact output for long doubles. */ +#undef PPL_CXX_LONG_DOUBLE_EXACT_OUTPUT + +/* 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 C++ compiler supports flexible arrays. */ +#undef PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + +/* 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 + +/* Defined if floating point arithmetics may use the 387 unit. */ +#undef PPL_FPMATH_MAY_USE_387 + +/* Defined if floating point arithmetics 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 + +/* Defined if the Parma Watchdog Library is enabled. */ +#undef PPL_WATCHDOG_LIBRARY_ENABLED + +/* 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 + + +#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 is included before is + (even indirectly) included. Moreover we need to define + __STDC_LIMIT_MACROS before the first inclusion of + 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 +#endif + +#ifdef PPL_HAVE_INTTYPES_H +# include +#endif + diff --git a/ppl-config.sed b/ppl-config.sed new file mode 100644 index 0000000..2d74bb6 --- /dev/null +++ b/ppl-config.sed @@ -0,0 +1,65 @@ +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_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_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_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..0dd2e43 --- /dev/null +++ b/ppl.lsm.in @@ -0,0 +1,31 @@ +Begin4 +Title: ppl +Version: @VERSION@ +Entered-date: @ISODATE@ +Description: The Parma Polyhedra Library (PPL) is a C++ library + for the manipulation of numerical abstractions. +Keywords: C++ library convex polyhedra +Author: Roberto Bagnara (bagnara@cs.unipr.it) + Patricia M. Hill (hill@comp.leeds.ac.uk) + Enea Zaffanella (zaffanella@cs.unipr.it) + Abramo Bagnara (Opera Unica) + Andrea Cimino (University of Parma) + Giordano Fracasso (University of Parma) + Elena Mazzi (University of Parma) + Matthew Mundell (University of Leeds) + Barbara Quartieri (University of Parma) + Elisa Ricci (former student of the University of Parma) + Sara Bonini (former student of the University of Parma) + Andrea Pescetti (former student of the University of Parma) + Angela Stazzone (former student of the University of Parma) + Tatiana Zolo (former student of the University of Parma) +Maintained-by: ppl-devel@cs.unipr.it (PPL developers) +Primary-site: metlab.unc.edu /pub/linux/libs + 5850k ppl-@VERSION@.tar.gz + 800 ppl.lsm +Alternate-site: +Original-site: http://www.cs.unipr.it/ppl/ +Platforms: Portable; tested on Linux, FreeBSD, OpenBSD, Solaris, + IRIX64, Mac OS X, Cygwin, DEC OSF/1. +Copying-policy: GPL +End diff --git a/src/BDS_Status.idefs.hh b/src/BDS_Status.idefs.hh new file mode 100644 index 0000000..1353bda --- /dev/null +++ b/src/BDS_Status.idefs.hh @@ -0,0 +1,116 @@ +/* BD_Shape::Status class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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 object. +/*! \ingroup PPL_CXX_interface + The assertions supported are: + - zero-dim universe: the BDS is the zero-dimensional + vector space \f$\Rset^0 = \{\cdot\}\f$; + - empty: the BDS is the empty set; + - shortest-path closed: the BDS is represented by a shortest-path + closed system of bounded differences, so that all the constraints are + as tight as possible; + - shortest-path reduced: 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: + - zero-dim universe excludes any other assertion; + - empty: excludes any other assertion; + - shortest-path reduced implies shortest-path closed. +*/ +class Status { +public: + //! By default Status is the zero-dim universe 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 true if successful, false 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 all bits in \p mask are set. + bool test_all(flags_t mask) const; + + //! Check whether at least one 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..65d9ac3 --- /dev/null +++ b/src/BDS_Status.inlines.hh @@ -0,0 +1,267 @@ +/* BD_Shape::Status class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_BDS_Status_inlines_hh +#define PPL_BDS_Status_inlines_hh 1 + +namespace Parma_Polyhedra_Library { + +template +inline +BD_Shape::Status::Status(flags_t mask) + : flags(mask) { +} + +template +inline +BD_Shape::Status::Status() + : flags(ZERO_DIM_UNIV) { +} + +template +inline bool +BD_Shape::Status::test_all(flags_t mask) const { + return (flags & mask) == mask; +} + +template +inline bool +BD_Shape::Status::test_any(flags_t mask) const { + return flags & mask; +} + +template +inline void +BD_Shape::Status::set(flags_t mask) { + flags |= mask; +} + +template +inline void +BD_Shape::Status::reset(flags_t mask) { + flags &= ~mask; +} + +template +inline bool +BD_Shape::Status::test_zero_dim_univ() const { + return flags == ZERO_DIM_UNIV; +} + +template +inline void +BD_Shape::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 +inline void +BD_Shape::Status::set_zero_dim_univ() { + // Zero-dim universe is incompatible with anything else. + flags = ZERO_DIM_UNIV; +} + +template +inline bool +BD_Shape::Status::test_empty() const { + return test_any(EMPTY); +} + +template +inline void +BD_Shape::Status::reset_empty() { + reset(EMPTY); +} + +template +inline void +BD_Shape::Status::set_empty() { + flags = EMPTY; +} + +template +inline bool +BD_Shape::Status::test_shortest_path_closed() const { + return test_any(SHORTEST_PATH_CLOSED); +} + +template +inline void +BD_Shape::Status::reset_shortest_path_closed() { + // A system is reduced only if it is also closed. + reset(SHORTEST_PATH_CLOSED | SHORTEST_PATH_REDUCED); +} + +template +inline void +BD_Shape::Status::set_shortest_path_closed() { + set(SHORTEST_PATH_CLOSED); +} + +template +inline bool +BD_Shape::Status::test_shortest_path_reduced() const { + return test_any(SHORTEST_PATH_REDUCED); +} + +template +inline void +BD_Shape::Status::reset_shortest_path_reduced() { + reset(SHORTEST_PATH_REDUCED); +} + +template +inline void +BD_Shape::Status::set_shortest_path_reduced() { + assert(test_shortest_path_closed()); + set(SHORTEST_PATH_REDUCED); +} + +template +bool +BD_Shape::Status::OK() const { + if (test_zero_dim_univ()) + // Zero-dim universe is OK. + return true; + + if (test_empty()) { + Status copy = *this; + copy.reset_empty(); + if (copy.test_zero_dim_univ()) + return true; + else { +#ifndef NDEBUG + std::cerr << "The empty flag is incompatible with any other one." + << std::endl; +#endif + return false; + } + } + + // Shortest-path reduction implies shortest-path closure. + if (test_shortest_path_reduced()) { + if (test_shortest_path_closed()) + return true; + else { +#ifndef NDEBUG + std::cerr << "The shortest-path reduction flag should also imply " + << "the closure flag." + << std::endl; +#endif + return false; + } + } + + // Any other case is OK. + return true; +} + + +namespace Implementation { + +namespace BD_Shapes { + +// These are the keywords that indicate the individual assertions. +const std::string zero_dim_univ = "ZE"; +const std::string empty = "EM"; +const std::string sp_closed = "SPC"; +const std::string sp_reduced = "SPR"; +const char yes = '+'; +const char no = '-'; +const char sep = ' '; + +/*! \relates Parma_Polyhedra_Library::BD_Shape::Status + Reads a keyword and its associated on/off flag from \p s. + Returns true if the operation is successful, + returns false otherwise. + When successful, \p positive is set to true if the flag + is on; it is set to false 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 +void +BD_Shape::Status::ascii_dump(std::ostream& s) const { + using namespace Implementation::BD_Shapes; + s << (test_zero_dim_univ() ? yes : no) << zero_dim_univ << sep + << (test_empty() ? yes : no) << empty << sep + << sep + << (test_shortest_path_closed() ? yes : no) << sp_closed << sep + << (test_shortest_path_reduced() ? yes : no) << sp_reduced << sep; +} + +PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(T, BD_Shape::Status) + +template +bool +BD_Shape::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. + 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..4e05469 --- /dev/null +++ b/src/BD_Shape.cc @@ -0,0 +1,97 @@ +/* BD_Shape class implementation: non-inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include +#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::extract_bounded_difference(const Constraint& c, + const dimension_type c_space_dim, + dimension_type& c_num_vars, + dimension_type& c_first_var, + dimension_type& c_second_var, + Coefficient& c_coeff) { + // Check for preconditions. + assert(c.space_dimension() == c_space_dim); + assert(c_num_vars == 0 && c_first_var == 0 && c_second_var == 0); + // Store the indices of the non-zero components of `c', + dimension_type non_zero_index[2] = { 0, 0 }; + // Collect the non-zero components of `c'. + for (dimension_type i = c_space_dim; i-- > 0; ) + if (c.coefficient(Variable(i)) != 0) { + if (c_num_vars <= 1) + non_zero_index[c_num_vars++] = i + 1; + else + // Constraint `c' is not a bounded difference. + return false; + } + + // Make sure that `c' is indeed a bounded difference, + // i.e., it has one of the following forms: + // 0 <=/= b, if c_num_vars == 0; + // a*x <=/= b, if c_num_vars == 1; + // a*x - a*y <=/= b, if c_num_vars == 2. + switch (c_num_vars) { + case 2: + { + const Coefficient& c0 = c.coefficient(Variable(non_zero_index[0]-1)); + const Coefficient& c1 = c.coefficient(Variable(non_zero_index[1]-1)); + if (sgn(c0) == sgn(c1) || c0 != -c1) + // Constraint `c' is not a bounded difference. + return false; + c_coeff = c1; + } + c_first_var = non_zero_index[0]; + c_second_var = non_zero_index[1]; + break; + case 1: + c_coeff = -c.coefficient(Variable(non_zero_index[0]-1)); + c_first_var = non_zero_index[0]; + break; + default: + assert(c_num_vars == 0); + break; + } + return true; +} + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates Parma_Polyhedra_Library::BD_Shape */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +void +PPL::compute_leader_indices(const std::vector& predecessor, + std::vector& indices) { + // The vector `indices' contains one entry for each equivalence + // class, storing the index of the corresponding leader in + // increasing order: it is used to avoid repeated tests for leadership. + assert(indices.size() == 0); + assert(0 == predecessor[0]); + indices.push_back(0); + for (dimension_type i = 1, 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..59ffed7 --- /dev/null +++ b/src/BD_Shape.defs.hh @@ -0,0 +1,2147 @@ +/* BD_Shape class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_BD_Shape_defs_hh +#define PPL_BD_Shape_defs_hh 1 + +#include "BD_Shape.types.hh" +#include "globals.defs.hh" +#include "Constraint.types.hh" +#include "Generator.types.hh" +#include "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 "Bit_Matrix.defs.hh" +#include +#include +#include + +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: + false is written if \p bds is an empty polyhedron; + true is written if \p bds is the universe polyhedron; + a system of constraints defining \p bds is written otherwise, + all constraints separated by ", ". +*/ +template +std::ostream& +operator<<(std::ostream& s, const BD_Shape& bds); + +} // namespace IO_Operators + +//! Returns true 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 false is returned. +*/ +template +bool operator==(const BD_Shape& x, const BD_Shape& y); + +//! Returns true if and only if \p x and \p y aren't the same BDS. +/*! \relates BD_Shape + Note that \p x and \p y may be dimension-incompatible shapes: + in this case, the value true is returned. +*/ +template +bool operator!=(const BD_Shape& x, const BD_Shape& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool rectilinear_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool rectilinear_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& 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 true; + returns false 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 +bool rectilinear_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool euclidean_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool euclidean_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& 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 true; + returns false 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 +bool euclidean_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool l_infinity_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool l_infinity_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& 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 true; + returns false 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 +bool l_infinity_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& y, + Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Decodes the constraint \p c as a bounded difference. +/*! \relates BD_Shape + \return + true if the constraint \p c is a + \ref Bounded_Difference_Shapes "bounded difference"; + false otherwise. + + \param c + The constraint to be decoded. + + \param c_space_dim + The space dimension of the constraint \p c (it is assumed + to match the actual space dimension of \p c). + + \param c_num_vars + If true 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 true 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 true 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 true 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) +bool extract_bounded_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); + +#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& predecessor, + std::vector& indices); + +} // namespace Parma_Polyhedra_Library + +//! A bounded difference shape. +/*! \ingroup PPL_CXX_interface + The class template BD_Shape allows for the efficient representation + of a restricted kind of topologically closed convex polyhedra + called bounded difference shapes (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 rounding-aware + 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 optimally supports: + - 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 + x, y and 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 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 bd(cs); + \endcode + Since only those constraints having the syntactic form of a + bounded difference 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 bd(cs); + \endcode +*/ +template +class Parma_Polyhedra_Library::BD_Shape { +private: + /*! \brief + The (extended) numeric type of the inhomogeneous term of + the inequalities defining a BDS. + */ + typedef Checked_Number N; + +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 + explicit BD_Shape(const BD_Shape& 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 constraints: constraints that are not + \ref Bounded_Difference_Shapes "bounded differences" + are ignored (even though they may have contributed + to the space dimension). + + \exception std::invalid_argument + Thrown if \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: some elements may be safely ignored. + */ + 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 + explicit BD_Shape(const Box& 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 + explicit BD_Shape(const Octagonal_Shape& 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 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 true 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 true 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 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 + true 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, + false 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 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 + 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 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, + false 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 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 + true 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, + false 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 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 + 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 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, + false 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; + + //! Returns true 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 true 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 true 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 true if and only if \p *this is an empty BDS. + bool is_empty() const; + + //! Returns true if and only if \p *this is a universe BDS. + bool is_universe() const; + + //! Returns true if and only if \p *this is discrete. + bool is_discrete() const; + + /*! \brief + Returns true if and only if \p *this + is a topologically closed subset of the vector space. + */ + bool is_topologically_closed() const; + + //! Returns true if and only if \p *this is a bounded BDS. + bool is_bounded() const; + + /*! \brief + Returns true if and only if \p *this + contains at least one integer point. + */ + bool contains_integer_point() const; + + /*! \brief + Returns true 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 true if and only if \p *this satisfies + all its invariants. + */ + bool OK() const; + + //@} Member Functions that Do Not Modify the BD_Shape + + //! \name Space-Dimension Preserving Member Functions that May Modify the BD_Shape + //@{ + + /*! \brief + Adds a copy of constraint \p c to the system of bounded differences + defining \p *this. + + \param c + The constraint to be added. If it is not a bounded difference, it + will be simply ignored. + + \exception std::invalid_argument + Thrown if \p *this and constraint \p c are dimension-incompatible, + or \p c is not optimally supported by the BD shape domain. + */ + void add_constraint(const Constraint& c); + + /*! \brief + Adds a copy of constraint \p c to the system of bounded differences + defining \p *this. + + \return + false if and only if the result is empty. + + \param c + The constraint to be added. If it is not a bounded difference, it + will be simply ignored. + + \exception std::invalid_argument + Thrown if \p *this and constraint \p c are dimension-incompatible, + or \p c is not optimally supported by the BD shape domain. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_constraint_and_minimize(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 a copy of congruence \p cg to the system of congruences + of \p *this, minimizing the result + + \param cg + The congruence to be added. + + \return + false if and only if the result is empty. + + \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. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_congruence_and_minimize(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. Constraints that are not bounded + differences will be simply ignored. + + \exception std::invalid_argument + Thrown if \p *this and \p cs are dimension-incompatible, + or \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 the constraints in \p cs to the system of bounded differences + defining \p *this. + + \return + false if and only if the result is empty. + + \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. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_constraints_and_minimize(const Constraint_System& cs); + + /*! \brief + Adds the constraints in \p cs to the system of constraints + of \p *this, minimizing the result. + + \return + false if and only if the result is empty. + + \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. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_recycled_constraints_and_minimize(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 + Behaves as add_congruences(const Congruence_System&), + but minimizes the resulting BD shape, returning \c false + if and only if the result is empty. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_congruences_and_minimize(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 + Behaves as \c add_recycled_congruences, but minimizes the + resulting BD shape, returning \c false if and only if + the result is empty. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_recycled_congruences_and_minimize(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 + 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 to_be_unconstrained, + assigning the result to \p *this. + + \param to_be_unconstrained + 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 to_be_removed. + */ + void unconstrain(const Variables_Set& to_be_unconstrained); + + //! Assigns to \p *this the intersection of \p *this and \p y. + /*! + \exception std::invalid_argument + Thrown if \p *this and \p y are dimension-incompatible. + */ + void intersection_assign(const BD_Shape& y); + + //! Assigns to \p *this the intersection of \p *this and \p y. + /*! + \return + false if and only if the result is empty. + + \exception std::invalid_argument + Thrown if \p *this and \p y are dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool intersection_assign_and_minimize(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 + Assigns to \p *this the smallest BDS containing the convex union + of \p *this and \p y. + + \return + false if and only if the result is empty. + + \exception std::invalid_argument + Thrown if \p *this and \p y are dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool upper_bound_assign_and_minimize(const BD_Shape& y); + + /*! \brief + If the upper bound of \p *this and \p y is exact, it is assigned + to \p *this and true is returned, + otherwise false 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 + 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()); + + /*! \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); + + //! 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 must 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 must 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 + 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 must 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 must 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 must 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 decreasing iteration sequence). Hence, the call + x.CC76_narrowing_assign(y) 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 must 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 must 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 must 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 max_space_dimension(). + */ + void concatenate_assign(const BD_Shape& y); + + //! Removes all the specified dimensions. + /*! + \param to_be_removed + The set of Variable objects corresponding to the dimensions to be removed. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with one of the Variable + objects contained in \p to_be_removed. + */ + void remove_space_dimensions(const Variables_Set& to_be_removed); + + /*! \brief + Removes the higher dimensions so that the resulting space + will have dimension \p new_dimension. + + \exception std::invalid_argument + Thrown if \p new_dimension is greater than the space dimension + of \p *this. + */ + void remove_higher_space_dimensions(dimension_type new_dimension); + + /*! \brief + Remaps the dimensions of the vector space according to + a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function". + + \param pfunc + The partial function specifying the destiny of each dimension. + + The template class Partial_Function must provide the following + methods. + \code + bool has_empty_codomain() const + \endcode + returns true if and only if the represented partial + function has an empty co-domain (i.e., it is always undefined). + The has_empty_codomain() method will always be called + before the methods below. However, if + has_empty_codomain() returns true, 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 true is returned. + If \f$f\f$ is undefined in \f$k\f$, then false 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 + 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 max_space_dimension(). + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + and var has space dimension \f$k \leq n\f$, + then the \f$k\f$-th space dimension is + \ref expand_space_dimension "expanded" to \p m new space dimensions + \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$. + */ + void expand_space_dimension(Variable var, dimension_type m); + + //! Folds the space dimensions in \p to_be_folded into \p var. + /*! + \param to_be_folded + The set of Variable objects corresponding to the space dimensions + to be folded; + + \param var + The variable corresponding to the space dimension that is the + destination of the folding operation. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with \p var or with + one of the Variable objects contained in \p to_be_folded. + Also thrown if \p var is contained in \p to_be_folded. + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + var has space dimension \f$k \leq n\f$, + \p to_be_folded is a set of variables whose maximum space dimension + is also less than or equal to \f$n\f$, and \p var is not a member + of \p to_be_folded, then the space dimensions corresponding to + variables in \p to_be_folded are \ref fold_space_dimensions "folded" + into the \f$k\f$-th space dimension. + */ + void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var); + + //@} // Member Functions that May Modify the Dimension of the Vector Space + + 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 true if successful, false 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 x == y, + then x.hash_code() == y.hash_code(). + */ + int32_t hash_code() const; + + friend bool operator==(const BD_Shape& x, const BD_Shape& y); + + template + friend bool Parma_Polyhedra_Library::rectilinear_distance_assign + (Checked_Number& r, + const BD_Shape& x, const BD_Shape& y, const Rounding_Dir dir, + Temp& tmp0, Temp& tmp1, Temp& tmp2); + template + friend bool Parma_Polyhedra_Library::euclidean_distance_assign + (Checked_Number& r, + const BD_Shape& x, const BD_Shape& y, const Rounding_Dir dir, + Temp& tmp0, Temp& tmp1, Temp& tmp2); + template + friend bool Parma_Polyhedra_Library::l_infinity_distance_assign + (Checked_Number& r, + const BD_Shape& x, const BD_Shape& y, const Rounding_Dir dir, + Temp& tmp0, Temp& tmp1, Temp& tmp2); + +private: + template friend class Parma_Polyhedra_Library::BD_Shape; + template friend class Parma_Polyhedra_Library::Box; + + //! The matrix representing the system of bounded differences. + DB_Matrix 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 true if the BDS is the zero-dimensional universe. + bool marked_zero_dim_univ() const; + + /*! \brief + Returns true if the BDS is known to be empty. + + The return value false does not necessarily + implies that \p *this is non-empty. + */ + bool marked_empty() const; + + /*! \brief + Returns true if the system of bounded differences + is known to be shortest-path closed. + + The return value false does not necessarily + implies that this->dbm is not shortest-path closed. + */ + bool marked_shortest_path_closed() const; + + /*! \brief + Returns true if the system of bounded differences + is known to be shortest-path reduced. + + The return value false does not necessarily + implies that this->dbm 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 this->dbm its shortest-path closure. + void shortest_path_closure_assign() const; + + /*! \brief + Assigns to this->dbm its shortest-path closure and + records into this->redundancy_dbm which of the entries + in this->dbm are redundant. + */ + void shortest_path_reduction_assign() const; + + /*! \brief + Returns true if and only if this->dbm + is shortest-path closed and this->redundancy_dbm + correctly flags the redundant entries in this->dbm. + */ + 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 true if and only if \p from_above is + true and \p expr is bounded from above in \p *this, + or \p from_above is false and \p expr is bounded + from below in \p *this. + + \param expr + The linear expression to test; + + \param from_above + true 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 + true 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 + true 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, false 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 + true 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 + true 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, false 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 + Convexity Recognition of the Union of Polyhedra + 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); + + 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 dbm[i][j] \<= k. + void add_dbm_constraint(dimension_type i, dimension_type j, const N& k); + + //! Adds the constraint dbm[i][j] \<= num/den. + void add_dbm_constraint(dimension_type i, dimension_type j, + Coefficient_traits::const_reference num, + Coefficient_traits::const_reference den); + + /*! \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 v - u \<= c, + starting from \p ub_v which is an upper bound for \p v. + + The shortest-path closure is able to deduce the constraint + v - u \<= ub_v - lb_u. 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 + q == sc_expr[u]/sc_den is greater than zero. In particular: + - if q \>= 1, then v - u \<= ub_v - ub_u; + - if 0 \< q \< 1, then + v - u \<= ub_v - (q*ub_u + (1-q)*lb_u). + */ + void deduce_v_minus_u_bounds(dimension_type v, + dimension_type last_v, + const Linear_Expression& sc_expr, + Coefficient_traits::const_reference sc_den, + const N& ub_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 u - v \<= c, + starting from \p minus_lb_v which is a lower bound for \p v. + + The shortest-path closure is able to deduce the constraint + u - v \<= ub_u - lb_v. 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 + q == sc_expr[u]/sc_den is greater than zero. + In particular: + - if q \>= 1, then u - v \<= lb_u - lb_v; + - if 0 \< q \< 1, then + u - v \<= (q*lb_u + (1-q)*ub_u) - lb_v. + */ + void deduce_u_minus_v_bounds(dimension_type v, + dimension_type last_v, + const Linear_Expression& sc_expr, + Coefficient_traits::const_reference sc_den, + const N& 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& 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& leaders) const; + + friend std::ostream& + Parma_Polyhedra_Library::IO_Operators + ::operator<<<>(std::ostream& s, const BD_Shape& c); + + //! \name Exception Throwers + //@{ + void throw_dimension_incompatible(const char* method, + const BD_Shape& x) const; + + void throw_dimension_incompatible(const char* method, + dimension_type required_dim) const; + + void throw_dimension_incompatible(const char* method, + const Constraint& c) const; + + void throw_dimension_incompatible(const char* method, + const Congruence& cg) const; + + void throw_dimension_incompatible(const char* method, + const Generator& g) const; + + void throw_dimension_incompatible(const char* method, + const char* name_row, + const Linear_Expression& y) const; + + static void throw_expression_too_complex(const char* method, + const Linear_Expression& e); + + static void throw_generic(const char* method, const char* reason); + //@} // Exception Throwers +}; + + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::BD_Shape */ +template +void swap(Parma_Polyhedra_Library::BD_Shape& x, + Parma_Polyhedra_Library::BD_Shape& y); + +} // namespace std + +#include "BDS_Status.inlines.hh" +#include "BD_Shape.inlines.hh" +#include "BD_Shape.templates.hh" + +#endif // !defined(PPL_BD_Shape_defs_hh) diff --git a/src/BD_Shape.inlines.hh b/src/BD_Shape.inlines.hh new file mode 100644 index 0000000..348bb09 --- /dev/null +++ b/src/BD_Shape.inlines.hh @@ -0,0 +1,886 @@ +/* BD_Shape class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_BD_Shape_inlines_hh +#define PPL_BD_Shape_inlines_hh 1 + +#include "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 +#include +#include +#include + +namespace Parma_Polyhedra_Library { + +template +inline dimension_type +BD_Shape::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::max_num_rows() - 1, + DB_Matrix::max_num_columns() - 1); +} + +template +inline bool +BD_Shape::marked_zero_dim_univ() const { + return status.test_zero_dim_univ(); +} + +template +inline bool +BD_Shape::marked_empty() const { + return status.test_empty(); +} + +template +inline bool +BD_Shape::marked_shortest_path_closed() const { + return status.test_shortest_path_closed(); +} + +template +inline bool +BD_Shape::marked_shortest_path_reduced() const { + return status.test_shortest_path_reduced(); +} + +template +inline void +BD_Shape::set_zero_dim_univ() { + status.set_zero_dim_univ(); +} + +template +inline void +BD_Shape::set_empty() { + status.set_empty(); +} + +template +inline void +BD_Shape::set_shortest_path_closed() { + status.set_shortest_path_closed(); +} + +template +inline void +BD_Shape::set_shortest_path_reduced() { + status.set_shortest_path_reduced(); +} + +template +inline void +BD_Shape::reset_shortest_path_closed() { + status.reset_shortest_path_closed(); +} + +template +inline void +BD_Shape::reset_shortest_path_reduced() { + status.reset_shortest_path_reduced(); +} + +template +inline +BD_Shape::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(); + } + assert(OK()); +} + +template +inline +BD_Shape::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 +template +inline +BD_Shape::BD_Shape(const BD_Shape& 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 +inline Congruence_System +BD_Shape::congruences() const { + return minimized_congruences(); +} + +template +inline bool +BD_Shape::add_constraint_and_minimize(const Constraint& c) { + add_constraint(c); + shortest_path_closure_assign(); + return !marked_empty(); +} + +template +inline bool +BD_Shape::add_congruence_and_minimize(const Congruence& cg) { + add_congruence(cg); + shortest_path_closure_assign(); + return !marked_empty(); +} + +template +inline void +BD_Shape::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 +inline bool +BD_Shape::add_constraints_and_minimize(const Constraint_System& cs) { + add_constraints(cs); + shortest_path_closure_assign(); + return !marked_empty(); +} + +template +inline void +BD_Shape::add_recycled_constraints(Constraint_System& cs) { + add_constraints(cs); +} + +template +inline bool +BD_Shape::add_recycled_constraints_and_minimize(Constraint_System& cs) { + return add_constraints_and_minimize(cs); +} + +template +inline void +BD_Shape::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 +inline bool +BD_Shape::add_congruences_and_minimize(const Congruence_System& cgs) { + add_congruences(cgs); + return !is_empty(); +} + +template +inline void +BD_Shape::add_recycled_congruences(Congruence_System& cgs) { + add_congruences(cgs); +} + +template +inline bool +BD_Shape::add_recycled_congruences_and_minimize(Congruence_System& cgs) { + return add_congruences_and_minimize(cgs); +} + +template +inline void +BD_Shape::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 +inline void +BD_Shape::refine_with_constraints(const Constraint_System& cs) { + // Dimension-compatibility check. + if (cs.space_dimension() > space_dimension()) + throw_generic("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 +inline void +BD_Shape::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 +void +BD_Shape::refine_with_congruences(const Congruence_System& cgs) { + // Dimension-compatibility check. + if (cgs.space_dimension() > space_dimension()) + throw_generic("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 +inline void +BD_Shape::refine_no_check(const Congruence& cg) { + assert(!marked_empty()); + assert(cg.space_dimension() <= space_dimension()); + + if (cg.is_proper_congruence()) { + if (cg.is_inconsistent()) + set_empty(); + // Other proper congruences are just ignored. + return; + } + + assert(cg.is_equality()); + Constraint c(cg); + refine_no_check(c); +} + +template +inline bool +BD_Shape::can_recycle_constraint_systems() { + return false; +} + + +template +inline bool +BD_Shape::can_recycle_congruence_systems() { + return false; +} + +template +inline +BD_Shape::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 +template +inline +BD_Shape::BD_Shape(const Box& box, + Complexity_Class) + : dbm(box.space_dimension() + 1), status(), redundancy_dbm() { + // Check for emptyness 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 +inline +BD_Shape::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 +template +inline +BD_Shape::BD_Shape(const Octagonal_Shape& os, + Complexity_Class) + : dbm(os.space_dimension() + 1), status(), redundancy_dbm() { + // Check for emptyness 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 +inline BD_Shape& +BD_Shape::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 +inline +BD_Shape::~BD_Shape() { +} + +template +inline void +BD_Shape::swap(BD_Shape& y) { + std::swap(dbm, y.dbm); + std::swap(status, y.status); + std::swap(redundancy_dbm, y.redundancy_dbm); +} + +template +inline dimension_type +BD_Shape::space_dimension() const { + return dbm.num_rows() - 1; +} + +template +inline bool +BD_Shape::is_empty() const { + shortest_path_closure_assign(); + return marked_empty(); +} + +template +inline bool +BD_Shape::bounds_from_above(const Linear_Expression& expr) const { + return bounds(expr, true); +} + +template +inline bool +BD_Shape::bounds_from_below(const Linear_Expression& expr) const { + return bounds(expr, false); +} + +template +inline bool +BD_Shape::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 +inline bool +BD_Shape::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 +inline bool +BD_Shape::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 +inline bool +BD_Shape::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 +inline bool +BD_Shape::is_topologically_closed() const { + return true; +} + +template +inline bool +BD_Shape::is_discrete() const { + return affine_dimension() == 0; +} + +template +inline void +BD_Shape::topological_closure_assign() { + // Nothing to be done. + return; +} + +/*! \relates BD_Shape */ +template +inline bool +operator==(const BD_Shape& x, const BD_Shape& 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 +inline bool +operator!=(const BD_Shape& x, const BD_Shape& y) { + return !(x == y); +} + +/*! \relates BD_Shape */ +template +inline bool +rectilinear_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& 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 +inline bool +rectilinear_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& y, + const Rounding_Dir dir) { + typedef Checked_Number 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 +inline bool +rectilinear_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& y, + const Rounding_Dir dir) { + return rectilinear_distance_assign(r, x, y, dir); +} + +/*! \relates BD_Shape */ +template +inline bool +euclidean_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& 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 +inline bool +euclidean_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& y, + const Rounding_Dir dir) { + typedef Checked_Number 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 +inline bool +euclidean_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& y, + const Rounding_Dir dir) { + return euclidean_distance_assign(r, x, y, dir); +} + +/*! \relates BD_Shape */ +template +inline bool +l_infinity_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& 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 +inline bool +l_infinity_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& y, + const Rounding_Dir dir) { + typedef Checked_Number 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 +inline bool +l_infinity_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& y, + const Rounding_Dir dir) { + return l_infinity_distance_assign(r, x, y, dir); +} + +template +inline void +BD_Shape::add_dbm_constraint(const dimension_type i, + const dimension_type j, + const N& k) { + // Private method: the caller has to ensure the following. + assert(i <= space_dimension() && j <= space_dimension() && i != j); + N& dbm_ij = dbm[i][j]; + if (dbm_ij > k) { + dbm_ij = k; + if (marked_shortest_path_closed()) + reset_shortest_path_closed(); + } +} + +template +inline void +BD_Shape::add_dbm_constraint(const dimension_type i, + const dimension_type j, + Coefficient_traits::const_reference num, + Coefficient_traits::const_reference den) { + // Private method: the caller has to ensure the following. + assert(i <= space_dimension() && j <= space_dimension() && i != j); + assert(den != 0); + PPL_DIRTY_TEMP(N, k); + div_round_up(k, num, den); + add_dbm_constraint(i, j, k); +} + +template +inline void +BD_Shape::time_elapse_assign(const BD_Shape& y) { + // Dimension-compatibility check. + if (space_dimension() != y.space_dimension()) + throw_dimension_incompatible("time_elapse_assign(y)", y); + // See the polyhedra documentation. + C_Polyhedron px(constraints()); + C_Polyhedron py(y.constraints()); + px.time_elapse_assign(py); + BD_Shape x(px); + swap(x); + assert(OK()); +} + +template +inline bool +BD_Shape::strictly_contains(const BD_Shape& y) const { + const BD_Shape& x = *this; + return x.contains(y) && !y.contains(x); +} + +template +inline bool +BD_Shape::upper_bound_assign_and_minimize(const BD_Shape& y) { + upper_bound_assign(y); + assert(marked_empty() + || space_dimension() == 0 || marked_shortest_path_closed()); + return !marked_empty(); +} + +template +inline bool +BD_Shape::upper_bound_assign_if_exact(const BD_Shape& y) { + // Dimension-compatibility check. + 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 + return BHZ09_upper_bound_assign_if_exact(y); +#endif +} + +template +inline void +BD_Shape::remove_higher_space_dimensions(const dimension_type new_dim) { + // Dimension-compatibility check: the variable having + // maximum index is the one occurring last in the set. + if (new_dim > space_dimension()) + throw_dimension_incompatible("remove_higher_space_dimensions(nd)", + new_dim); + + // The removal of no dimensions from any BDS is a no-op. + // Note that this case also captures the only legal removal of + // dimensions from a zero-dim space BDS. + if (new_dim == space_dimension()) { + assert(OK()); + return; + } + + // Shortest-path closure is necessary as in remove_space_dimensions(). + shortest_path_closure_assign(); + dbm.resize_no_copy(new_dim + 1); + + // Shortest-path closure is maintained. + // TODO: see whether or not reduction can be (efficiently!) maintained too. + if (marked_shortest_path_reduced()) + reset_shortest_path_reduced(); + + // If we removed _all_ dimensions from a non-empty BDS, + // the zero-dim universe BDS has been obtained. + if (new_dim == 0 && !marked_empty()) + set_zero_dim_univ(); + assert(OK()); +} + +template +inline bool +BD_Shape::intersection_assign_and_minimize(const BD_Shape& y) { + intersection_assign(y); + shortest_path_closure_assign(); + return !marked_empty(); +} + +template +inline void +BD_Shape::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 +inline void +BD_Shape::H79_widening_assign(const BD_Shape& y, unsigned* tp) { + // See the documentation for polyhedra. + C_Polyhedron px(constraints()); + C_Polyhedron py(y.constraints()); + px.H79_widening_assign(py, tp); + BD_Shape x(px); + swap(x); + assert(OK()); +} + +template +inline void +BD_Shape::widening_assign(const BD_Shape& y, unsigned* tp) { + H79_widening_assign(y, tp); +} + +template +inline void +BD_Shape::limited_H79_extrapolation_assign(const BD_Shape& y, + const Constraint_System& cs, + unsigned* tp) { + // See the documentation for polyhedra. + C_Polyhedron px(constraints()); + C_Polyhedron py(y.constraints()); + px.limited_H79_extrapolation_assign(py, cs, tp); + BD_Shape x(px); + swap(x); + assert(OK()); +} + +template +inline memory_size_type +BD_Shape::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +template +inline int32_t +BD_Shape::hash_code() const { + return space_dimension() & 0x7fffffff; +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +/*! \relates Parma_Polyhedra_Library::BD_Shape */ +template +inline void +swap(Parma_Polyhedra_Library::BD_Shape& x, + Parma_Polyhedra_Library::BD_Shape& y) { + x.swap(y); +} + +} // namespace std + +#endif // !defined(PPL_BD_Shape_inlines_hh) diff --git a/src/BD_Shape.templates.hh b/src/BD_Shape.templates.hh new file mode 100644 index 0000000..166f2d6 --- /dev/null +++ b/src/BD_Shape.templates.hh @@ -0,0 +1,5810 @@ +/* BD_Shape class implementation: non-inline template functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_BD_Shape_templates_hh +#define PPL_BD_Shape_templates_hh 1 + +#include "Generator_System.defs.hh" +#include "Generator_System.inlines.hh" +#include "Congruence_System.inlines.hh" +#include "Congruence_System.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 +#include +#include +#include +#include +#include +#include + +namespace Parma_Polyhedra_Library { + +template +BD_Shape::BD_Shape(const Congruence_System& cgs) + : dbm(cgs.space_dimension() + 1), + status(), + redundancy_dbm() { + add_congruences(cgs); +} + +template +BD_Shape::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 polyhedron. + set_empty(); + return; + } + + const dimension_type space_dim = space_dimension(); + DB_Row& 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(); + for (dimension_type i = space_dim; i > 0; --i) { + const Coefficient& g_i = g.coefficient(Variable(i-1)); + DB_Row& dbm_i = dbm[i]; + for (dimension_type j = space_dim; j > 0; --j) + if (i != j) + div_round_up(dbm_i[j], g.coefficient(Variable(j-1)) - g_i, d); + div_round_up(dbm_i[0], -g_i, d); + } + for (dimension_type j = space_dim; j > 0; --j) + div_round_up(dbm_0[j], g.coefficient(Variable(j-1)), d); + // Note: no need to initialize the first element of the main diagonal. + } + else { + // This is not the first point: the DBM already contains + // valid values and we must compute maxima. + const Coefficient& d = g.divisor(); + for (dimension_type i = space_dim; i > 0; --i) { + const Coefficient& g_i = g.coefficient(Variable(i-1)); + DB_Row& dbm_i = dbm[i]; + // The loop correctly handles the case when i == j. + for (dimension_type j = space_dim; j > 0; --j) { + div_round_up(tmp, g.coefficient(Variable(j-1)) - g_i, d); + max_assign(dbm_i[j], tmp); + } + div_round_up(tmp, -g_i, d); + max_assign(dbm_i[0], tmp); + } + for (dimension_type j = space_dim; j > 0; --j) { + div_round_up(tmp, g.coefficient(Variable(j-1)), d); + max_assign(dbm_0[j], tmp); + } + } + break; + default: + // Lines and rays temporarily ignored. + break; + } + } + + if (!point_seen) + // The generator system is not empty, but contains no points. + throw_generic("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: + for (dimension_type i = space_dim; i > 0; --i) { + const Coefficient& g_i = g.coefficient(Variable(i-1)); + DB_Row& dbm_i = dbm[i]; + // The loop correctly handles the case when i == j. + for (dimension_type j = space_dim; j > 0; --j) + if (g_i != g.coefficient(Variable(j-1))) + 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 (dimension_type j = space_dim; j > 0; --j) + if (g.coefficient(Variable(j-1)) != 0) + assign_r(dbm_0[j], PLUS_INFINITY, ROUND_NOT_NEEDED); + break; + case Generator::RAY: + for (dimension_type i = space_dim; i > 0; --i) { + const Coefficient& g_i = g.coefficient(Variable(i-1)); + DB_Row& dbm_i = dbm[i]; + // The loop correctly handles the case when i == j. + for (dimension_type j = space_dim; j > 0; --j) + if (g_i < g.coefficient(Variable(j-1))) + 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 (dimension_type j = space_dim; j > 0; --j) + if (g.coefficient(Variable(j-1)) > 0) + assign_r(dbm_0[j], PLUS_INFINITY, ROUND_NOT_NEEDED); + break; + default: + // Points and closure points already dealt with. + break; + } + } + set_shortest_path_closed(); + assert(OK()); +} + +template +BD_Shape::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(num_dimensions, EMPTY); + return; + } + + if (num_dimensions == 0) { + *this = BD_Shape(num_dimensions, UNIVERSE); + return; + } + + // Build from generators when we do not care about complexity + // or when the process has polynomial complexity. + if (complexity == ANY_COMPLEXITY + || (!ph.has_pending_constraints() && ph.generators_are_up_to_date())) { + *this = BD_Shape(ph.generators()); + return; + } + + // We cannot afford exponential complexity, we do not have a complete set + // of generators for the polyhedron, and the polyhedron is not trivially + // empty or zero-dimensional. Constraints, however, are up to date. + assert(ph.constraints_are_up_to_date()); + + if (!ph.has_something_pending() && ph.constraints_are_minimized()) { + // If the constraint system of the polyhedron is minimized, + // the test `is_universe()' has polynomial complexity. + if (ph.is_universe()) { + *this = BD_Shape(num_dimensions, UNIVERSE); + return; + } + } + + // See if there is at least one inconsistent constraint in `ph.con_sys'. + for (Constraint_System::const_iterator i = ph.con_sys.begin(), + cs_end = ph.con_sys.end(); i != cs_end; ++i) + if (i->is_inconsistent()) { + *this = BD_Shape(num_dimensions, EMPTY); + return; + } + + // If `complexity' allows it, use simplex to derive the exact (modulo + // the fact that our BDSs are topologically closed) variable bounds. + if (complexity == SIMPLEX_COMPLEXITY) { + 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()) + lp.add_constraint(Linear_Expression(c) >= 0); + else + lp.add_constraint(c); + } + + // Check for unsatisfiability. + if (!lp.is_satisfiable()) { + *this = BD_Shape(num_dimensions, EMPTY); + return; + } + + // Start with a universe BDS that will be refined by the simplex. + *this = BD_Shape(num_dimensions, UNIVERSE); + // Get all the upper bounds. + Generator g(point()); + PPL_DIRTY_TEMP_COEFFICIENT(num); + PPL_DIRTY_TEMP_COEFFICIENT(den); + for (dimension_type i = 1; i <= num_dimensions; ++i) { + Variable x(i-1); + // Evaluate optimal upper bound for `x <= ub'. + lp.set_objective_function(x); + if (lp.solve() == OPTIMIZED_MIP_PROBLEM) { + g = lp.optimizing_point(); + lp.evaluate_objective_function(g, num, den); + div_round_up(dbm[0][i], num, den); + } + // Evaluate optimal upper bound for `x - y <= ub'. + for (dimension_type j = 1; j <= num_dimensions; ++j) { + if (i == j) + continue; + Variable y(j-1); + lp.set_objective_function(x - y); + if (lp.solve() == OPTIMIZED_MIP_PROBLEM) { + g = lp.optimizing_point(); + lp.evaluate_objective_function(g, num, den); + div_round_up(dbm[j][i], num, den); + } + } + // Evaluate optimal upper bound for `-x <= ub'. + lp.set_objective_function(-x); + if (lp.solve() == OPTIMIZED_MIP_PROBLEM) { + g = lp.optimizing_point(); + lp.evaluate_objective_function(g, num, den); + div_round_up(dbm[i][0], num, den); + } + } + set_shortest_path_closed(); + assert(OK()); + return; + } + + // Extract easy-to-find bounds from constraints. + assert(complexity == POLYNOMIAL_COMPLEXITY); + *this = BD_Shape(num_dimensions, UNIVERSE); + refine_with_constraints(ph.constraints()); +} + +template +dimension_type +BD_Shape::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 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 +Congruence_System +BD_Shape::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; + if (space_dim == 0) { + if (marked_empty()) + cgs = Congruence_System::zero_dim_empty(); + } + else if (marked_empty()) + cgs.insert((0*Variable(space_dim-1) %= 1) / 0); + else { + // KLUDGE: in the future `cgs' will be constructed of the right dimension. + // For the time being, we force the dimension with the following line. + cgs.insert(0*Variable(space_dim-1) == 0); + + PPL_DIRTY_TEMP_COEFFICIENT(num); + PPL_DIRTY_TEMP_COEFFICIENT(den); + + // Compute leader information. + std::vector leaders; + compute_leaders(leaders); + + // Go through the non-leaders to generate equality constraints. + const DB_Row& dbm_0 = dbm[0]; + for (dimension_type i = 1; i <= space_dim; ++i) { + const dimension_type leader = leaders[i]; + if (i != leader) { + // Generate the constraint relating `i' and its leader. + if (leader == 0) { + // A unary equality has to be generated. + assert(!is_plus_infinity(dbm_0[i])); + numer_denom(dbm_0[i], num, den); + cgs.insert(den*Variable(i-1) == num); + } + else { + // A binary equality has to be generated. + assert(!is_plus_infinity(dbm[i][leader])); + numer_denom(dbm[i][leader], num, den); + cgs.insert(den*Variable(leader-1) - den*Variable(i-1) == num); + } + } + } + } + return cgs; +} + +template +void +BD_Shape::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); + + // 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_generic("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 (!extract_bounded_difference(c, c_space_dim, num_vars, i, j, coeff)) + throw_generic("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); + 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(); + assert(OK()); +} + +template +void +BD_Shape::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_generic("add_congruence(cg)", + "cg is a non-trivial, proper congruence"); + } + + assert(cg.is_equality()); + Constraint c(cg); + add_constraint(c); +} + +template +void +BD_Shape::refine_no_check(const Constraint& c) { + assert(!marked_empty()); + const dimension_type c_space_dim = c.space_dimension(); + assert(c_space_dim <= 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 (!extract_bounded_difference(c, c_space_dim, 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(); + assert(OK()); +} + +template +void +BD_Shape::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); + 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& 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(); + assert(OK()); +} + +template +bool +BD_Shape::contains(const BD_Shape& y) const { + const BD_Shape& x = *this; + const dimension_type x_space_dim = x.space_dimension(); + + // Dimension-compatibility check. + if (x_space_dim != y.space_dimension()) + throw_dimension_incompatible("contains(y)", y); + + // The zero-dimensional universe shape contains any other + // dimension-compatible shape. + // The zero-dimensional empty shape only contains another + // zero-dimensional empty shape. + if (x_space_dim == 0) { + if (!marked_empty()) + return true; + else + return y.marked_empty(); + } + + /* + The `y' bounded difference shape need be closed. + In fact if, for example, in `*this' we have the constraints: + + x1 - x2 <= 1; + x1 <= 3; + x2 <= 2; + + in `y' the constraints are: + + x1 - x2 <= 0; + x2 <= 1; + + without closure it returns "false", instead if we close `y' we have + the implicit constraint + + x1 <= 1; + + and so we obtain the right result "true". + */ + y.shortest_path_closure_assign(); + + // An empty shape is contained in any other dimension-compatible shapes. + if (y.marked_empty()) + return true; + + // `*this' contains `y' if and only if every cell of `dbm' + // is greater than or equal to the correspondent one of `y.dbm'. + for (dimension_type i = x_space_dim + 1; i-- > 0; ) { + const DB_Row& x_dbm_i = x.dbm[i]; + const DB_Row& 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 +bool +BD_Shape::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& 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 +bool +BD_Shape::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& 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 +bool +BD_Shape::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& 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 +bool +BD_Shape::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::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 bds_z(space_dim); + typedef BD_Shape::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_i = bds_z.dbm[i]; + const DB_Row& 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 +bool +BD_Shape::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_dimension() < var_space_dim) + throw_dimension_incompatible("constrains(v)", "v", var); + + // A polyhedron 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& 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 +void +BD_Shape +::compute_predecessors(std::vector& predecessor) const { + assert(!marked_empty() && marked_shortest_path_closed()); + assert(predecessor.size() == 0); + // Variables are ordered according to their index. + // The vector `predecessor' is used to indicate which variable + // immediately precedes a given one in the corresponding equivalence class. + // The `leader' of an equivalence class is the element having minimum + // index: leaders are their own predecessors. + const dimension_type pred_size = dbm.num_rows(); + // Initially, each variable is leader of its own zero-equivalence class. + predecessor.reserve(pred_size); + for (dimension_type i = 0; i < pred_size; ++i) + predecessor.push_back(i); + // Now compute actual predecessors. + for (dimension_type i = pred_size; i-- > 1; ) + if (i == predecessor[i]) { + const DB_Row& 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 +void +BD_Shape::compute_leaders(std::vector& leaders) const { + assert(!marked_empty() && marked_shortest_path_closed()); + assert(leaders.size() == 0); + // Compute predecessor information. + compute_predecessors(leaders); + // Flatten the predecessor chains so as to obtain leaders. + assert(leaders[0] == 0); + for (dimension_type i = 1, l_size = leaders.size(); i != l_size; ++i) { + const dimension_type l_i = leaders[i]; + assert(l_i <= i); + if (l_i != i) { + const dimension_type ll_i = leaders[l_i]; + assert(ll_i == leaders[ll_i]); + leaders[i] = ll_i; + } + } +} + +template +bool +BD_Shape::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 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& 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& x_k = x_copy.dbm[k]; + for (dimension_type i = 0; i <= space_dim; ++i) + if (leader[i] == i) { + const DB_Row& 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 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 no-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 ld_i = leader[i]; + // Case a: leader. + if (ld_i == i) { + for (dimension_type j = 0; j <= space_dim; ++j) { + dimension_type ld_j = leader[j]; + // Only the connectedness with equivalent variables + // is considered. + if (j != ld_j) + if (!redundancy_dbm[i][j]) { + if (t == 1) + // Two no-leaders couldn't connected with the same leader. + return false; + else + if (ld_j != i) + // The variables isn't in the same equivalence class. + return false; + else { + ++t; + var_conn[i] = j; + } + } + } + } + // Case b: no-leader. + else { + for (dimension_type j = 0; j <= space_dim; ++j) { + if (!redundancy_dbm[i][j]) { + dimension_type ld_j = leader[j]; + if (ld_i != ld_j) + // The variables isn't in the same equivalence class. + return false; + else { + if (t == 1) + // Two variables couldn't connected with the same leader. + return false; + else { + ++t; + var_conn[i] = j; + } + } + // A no-leader must be connected with + // another variable. + if (t == 0) + return false; + } + } + } + } + + // The vector `just_checked' is used to check if + // a variable is already checked. + std::vector 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) { + bool jc_i = just_checked[i]; + // We do not re-check the already considered single cycles. + if (!jc_i) { + dimension_type v_con = var_conn[i]; + // We consider only the equivalence classes with + // 2 or plus variables. + if (v_con != 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 +bool +BD_Shape::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; + const dimension_type c_space_dim = c.space_dimension(); + 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 (extract_bounded_difference(c, c_space_dim, 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 +bool +BD_Shape::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; + const dimension_type c_space_dim = c.space_dimension(); + 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 (!extract_bounded_difference(c, c_space_dim, 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); + const Coefficient& coeff_i = expr.coefficient(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 +bool +BD_Shape::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 +Poly_Con_Relation +BD_Shape::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 the congruence is a bounded difference equality, + // find the relation with the equivalent equality constraint. + if (cg.is_equality()) { + Constraint c(cg); + dimension_type num_vars = 0; + dimension_type i = 0; + dimension_type j = 0; + PPL_DIRTY_TEMP_COEFFICIENT(coeff); + if (extract_bounded_difference(c, cg_space_dim, num_vars, + i, j, coeff)) + 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 if (cg.inhomogeneous_term() % cg.modulus() == 0) + return Poly_Con_Relation::saturates() + && Poly_Con_Relation::is_included(); + } + + PPL_DIRTY_TEMP(Coefficient, min_num); + PPL_DIRTY_TEMP(Coefficient, min_den); + bool min_included; + PPL_DIRTY_TEMP_COEFFICIENT(mod); + mod = cg.modulus(); + Linear_Expression le; + for (dimension_type i = cg_space_dim; i-- > 0; ) + le += cg.coefficient(Variable(i)) * Variable(i); + bool bounded_below = minimize(le, min_num, min_den, min_included); + + if (!bounded_below) + return Poly_Con_Relation::strictly_intersects(); + + PPL_DIRTY_TEMP_COEFFICIENT(v); + PPL_DIRTY_TEMP_COEFFICIENT(lower_num); + PPL_DIRTY_TEMP_COEFFICIENT(lower_den); + PPL_DIRTY_TEMP_COEFFICIENT(lower); + assign_r(lower_num, min_num, ROUND_NOT_NEEDED); + assign_r(lower_den, min_den, ROUND_NOT_NEEDED); + neg_assign(v, cg.inhomogeneous_term()); + lower = lower_num / lower_den; + v += ((lower / mod) * mod); + if (v * lower_den < lower_num) + v += mod; + const Constraint& c(le == v); + return relation_with(c); +} + + +template +Poly_Con_Relation +BD_Shape::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 (!extract_bounded_difference(c, c_space_dim, 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; + for (dimension_type k = c_space_dim; k-- > 0; ) { + Variable vk(k); + le += c.coefficient(vk) * vk; + } + PPL_DIRTY_TEMP(Coefficient, max_num); + PPL_DIRTY_TEMP(Coefficient, max_den); + bool max_included; + PPL_DIRTY_TEMP(Coefficient, min_num); + PPL_DIRTY_TEMP(Coefficient, min_den); + bool min_included; + bool bounded_above = maximize(le, max_num, max_den, max_included); + bool bounded_below = minimize(le, min_num, min_den, min_included); + if (!bounded_above) { + if (!bounded_below) + return Poly_Con_Relation::strictly_intersects(); + min_num += c.inhomogeneous_term() * min_den; + switch (sgn(min_num)) { + 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_num += c.inhomogeneous_term() * max_den; + switch (sgn(max_num)) { + 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_num += c.inhomogeneous_term() * max_den; + min_num += c.inhomogeneous_term() * min_den; + switch (sgn(max_num)) { + case 1: + switch (sgn(min_num)) { + 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(); + } + case 0: + if (min_num == 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 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_den, denom, ROUND_NOT_NEEDED); + assign_r(q_y, numer, ROUND_NOT_NEEDED); + div_assign_r(q_y, q_y, q_den, 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_den, denom, ROUND_NOT_NEEDED); + assign_r(q_x, numer, ROUND_NOT_NEEDED); + div_assign_r(q_x, q_x, q_den, ROUND_NOT_NEEDED); + + if (!is_plus_infinity(y)) { + numer_denom(y, numer, denom); + assign_r(q_den, denom, ROUND_NOT_NEEDED); + assign_r(q_y, numer, ROUND_NOT_NEEDED); + div_assign_r(q_y, q_y, q_den, 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 +Poly_Gen_Relation +BD_Shape::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(num); + PPL_DIRTY_TEMP_COEFFICIENT(den); + PPL_DIRTY_TEMP_COEFFICIENT(product); + // We find in `*this' all the constraints. + 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& 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: den*x - den*y = num. + // Compute the scalar product. + numer_denom(dbm_ij, num, den); + product = 0; + add_mul_assign(product, den, g_coeff_y); + add_mul_assign(product, -den, g_coeff_x); + if (!is_line_or_ray) + add_mul_assign(product, num, 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: den*x - den*y <= num. + // Compute the scalar product. + numer_denom(dbm_ij, num, den); + product = 0; + add_mul_assign(product, den, g_coeff_y); + add_mul_assign(product, -den, g_coeff_x); + if (!is_line_or_ray) + add_mul_assign(product, num, 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: den*y - den*x <= b. + // Compute the scalar product. + numer_denom(dbm_ji, num, den); + product = 0; + add_mul_assign(product, den, g_coeff_x); + add_mul_assign(product, -den, g_coeff_y); + if (!is_line_or_ray) + add_mul_assign(product, num, 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 +void +BD_Shape::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&>(*this); + + // Fill the main diagonal with zeros. + for (dimension_type h = num_dimensions + 1; h-- > 0; ) { + assert(is_plus_infinity(x.dbm[h][h])); + assign_r(x.dbm[h][h], 0, ROUND_NOT_NEEDED); + } + + PPL_DIRTY_TEMP(N, sum); + for (dimension_type k = num_dimensions + 1; k-- > 0; ) { + const DB_Row& x_dbm_k = x.dbm[k]; + for (dimension_type i = num_dimensions + 1; i-- > 0; ) { + DB_Row& 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 { + 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 +void +BD_Shape::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(); + 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(*this); + + // Fill the main diagonal with zeros. + for (dimension_type h = num_dimensions + 1; h-- > 0; ) { + assert(is_plus_infinity(x.dbm[h][h])); + assign_r(x.dbm[h][h], 0, ROUND_NOT_NEEDED); + } + + // Using the incremental Floyd-Warshall algorithm. + PPL_DIRTY_TEMP(N, sum); + const dimension_type v = var.id() + 1; + DB_Row& x_v = x.dbm[v]; + // Step 1: Improve all constraints on variable `var'. + for (dimension_type k = num_dimensions + 1; k-- > 0; ) { + DB_Row& 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& 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& 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& 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 { + 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 +void +BD_Shape::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 predecessor; + compute_predecessors(predecessor); + std::vector 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& 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 dealt_with(space_dim + 1, false); + for (dimension_type i = space_dim + 1; i-- > 0; ) + // We only need to deal with non-singleton zero-equivalence classes + // that haven't already been dealt with. + if (i != predecessor[i] && !dealt_with[i]) { + dimension_type j = i; + while (true) { + const dimension_type pred_j = predecessor[j]; + if (j == pred_j) { + // We finally found the leader of `i'. + assert(redundancy[i][j]); + redundancy[i].clear(j); + // Here we dealt with `j' (i.e., `pred_j'), but it is useless + // to update `dealt_with' because `j' is a leader. + break; + } + // We haven't found the leader of `i' yet. + assert(redundancy[pred_j][j]); + redundancy[pred_j].clear(j); + dealt_with[pred_j] = true; + j = pred_j; + } + } + + // Even though shortest-path reduction is not going to change the BDS, + // it might change its internal representation. + BD_Shape& x = const_cast&>(*this); + std::swap(x.redundancy_dbm, redundancy); + x.set_shortest_path_reduced(); + + assert(is_shortest_path_reduced()); +} + +template +void +BD_Shape::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 poly-hull of a polyhedron `bd' with an empty polyhedron is `bd'. + y.shortest_path_closure_assign(); + if (y.marked_empty()) + return; + shortest_path_closure_assign(); + if (marked_empty()) { + *this = y; + return; + } + + // The bds-hull consists in constructing `*this' with the maximum + // elements selected from `*this' and `y'. + assert(space_dim == 0 || marked_shortest_path_closed()); + for (dimension_type i = space_dim + 1; i-- > 0; ) { + DB_Row& dbm_i = dbm[i]; + const DB_Row& 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(); + assert(OK()); +} + +template +bool +BD_Shape::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. + 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 eps(x_space_dim); + Linear_Expression zero_expr = 0*eps; + Linear_Expression db_expr; + PPL_DIRTY_TEMP_COEFFICIENT(num); + PPL_DIRTY_TEMP_COEFFICIENT(den); + + // 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 (eps). + 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& x_dbm_i = x.dbm[i]; + const DB_Row& 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]; + assert(!is_plus_infinity(x_dbm_ij)); + numer_denom(x_dbm_ij, num, den); + // 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 (den != 1) + db_expr *= den; + db_expr += num; + if (x_dbm_ij >= y_dbm_i[j]) + env_cs.insert(db_expr >= 0); + else { + db_expr += eps; + 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]; + assert(!is_plus_infinity(y_dbm_ij)); + numer_denom(y_dbm_ij, num, den); + // 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 (den != 1) + db_expr *= den; + db_expr += num; + 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 += eps; + 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 (eps) has to be maximised. + MIP_Problem env_lp(x_space_dim + 1, env_cs, eps, MAXIMIZATION); + // Pre-solve `env_lp' to later exploit incrementality. + env_lp.solve(); + 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? + throw std::runtime_error("PPL internal error"); + case UNBOUNDED_MIP_PROBLEM: + return false; + case OPTIMIZED_MIP_PROBLEM: + lp_ij.optimal_value(num, den); + if (num > 0) + return false; + break; + } + } + } + + // The upper bound of x and y is indeed exact. + upper_bound_assign(y); + assert(OK()); + return true; +} + +template +bool +BD_Shape::BHZ09_upper_bound_assign_if_exact(const BD_Shape& y) { + // 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. + 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(); + assert(x.marked_shortest_path_closed()); + assert(y.marked_shortest_path_closed()); + // Pre-compute the upper bound of `x' and `y'. + BD_Shape 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); + + for (dimension_type i = x_space_dim + 1; i-- > 0; ) { + const DB_Row& x_i = x.dbm[i]; + const Bit_Row& x_red_i = x.redundancy_dbm[i]; + const DB_Row& y_i = y.dbm[i]; + const DB_Row& 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. + 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& x_k = x.dbm[k]; + const DB_Row& y_k = y.dbm[k]; + const Bit_Row& y_red_k = y.redundancy_dbm[k]; + const DB_Row& 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. + 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 (lhs < rhs) + return false; + } + } + } + } + } + } + // The upper bound of x and y is indeed exact. + swap(ub); + assert(OK()); + return true; +} + +template +void +BD_Shape::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 complementaries with the system x. + const Constraint_System& y_cs = y.constraints(); + for (Constraint_System::const_iterator i = y_cs.begin(), + y_cs_end = y_cs.end(); i != y_cs_end; ++i) { + const Constraint& c = *i; + // If the 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 = Linear_Expression(c); + 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; + assert(OK()); +} + +template +bool +BD_Shape::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 res(dim, UNIVERSE); + x.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& 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 wrt 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 intefer type, then + // we also need to check that we are actually able to construct + // a constraint inconsistent wrt this one. + goto found; + } + // Then search binary constraints. + for (i = 1; i <= dim; ++i) { + const DB_Row& 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 intefer type, then + // we also need to check that we are actually able to construct + // a constraint inconsistent wrt 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. + assert(i <= dim && j <= dim && (i > 0 || j > 0)); + BD_Shape 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); + assert(!is_plus_infinity(tmp)); + // CHECKME: round down is really meant. + neg_assign_r(res.dbm[j][i], tmp, ROUND_DOWN); + x.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 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_nonredundant = (dim+1)*(dim+1); + for (dimension_type i = dim + 1; i-- > 0; ) + x_num_nonredundant -= x.redundancy_dbm[i].count_ones(); + assert(x_num_nonredundant > 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 yy = y; + + // The constraints added to `yy' will be recorded in `res' ... + BD_Shape res(dim, UNIVERSE); + // ... and we will count them too. + dimension_type res_num_nonredundant = 0; + + // Compute leader information for `x'. + std::vector x_leaders; + x.compute_leaders(x_leaders); + + // First go through the unary equality constraints. + const DB_Row& x_dbm_0 = x.dbm[0]; + DB_Row& yy_dbm_0 = yy.dbm[0]; + DB_Row& 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; + 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_nonredundant; + // Tighten context `yy' using the newly added constraint. + yy_dbm_0[j] = x_dbm_0[j]; + yy.reset_shortest_path_closed(); + } + 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_nonredundant; + // 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_nonredundant < x_num_nonredundant) { + res.reset_shortest_path_closed(); + x.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; + 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_nonredundant; + // Tighten context `yy' using the newly added constraint. + yy.dbm[i][j] = x.dbm[i][j]; + yy.reset_shortest_path_closed(); + } + 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_nonredundant; + // 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_nonredundant < x_num_nonredundant) { + res.reset_shortest_path_closed(); + x.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& x_dbm_i = x.dbm[i]; + const Bit_Row& x_redundancy_dbm_i = x.redundancy_dbm[i]; + DB_Row& yy_dbm_i = yy.dbm[i]; + DB_Row& 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_nonredundant; + // Tighten context `yy' using the newly added constraint. + yy_dbm_ij = x_dbm_ij; + yy.reset_shortest_path_closed(); + 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_nonredundant < x_num_nonredundant) { + res.reset_shortest_path_closed(); + x.swap(res); + } + return bool_result; + } + } + } + } + // This point should be unreachable. + throw std::runtime_error("PPL internal error"); +} + +template +void +BD_Shape::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(); + + assert(OK()); +} + +template +void +BD_Shape::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& 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(); + } + 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& 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(); + assert(OK()); +} + +template +void +BD_Shape::remove_space_dimensions(const Variables_Set& to_be_removed) { + // The removal of no dimensions from any BDS is a no-op. + // Note that this case also captures the only legal removal of + // space dimensions from a BDS in a 0-dim space. + if (to_be_removed.empty()) { + assert(OK()); + return; + } + + const dimension_type old_space_dim = space_dimension(); + + // Dimension-compatibility check. + const dimension_type min_space_dim = to_be_removed.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 - to_be_removed.size(); + if (new_space_dim == 0) { + dbm.resize_no_copy(1); + if (!marked_empty()) + // We set the zero_dim_univ flag. + set_zero_dim_univ(); + assert(OK()); + return; + } + + // Handle the case of an empty BD_Shape. + if (marked_empty()) { + dbm.resize_no_copy(new_space_dim + 1); + 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 tbr = to_be_removed.begin(); + Variables_Set::const_iterator tbr_end = to_be_removed.end(); + dimension_type dst = *tbr + 1; + dimension_type src = dst + 1; + for (++tbr; tbr != tbr_end; ++tbr) { + const dimension_type tbr_next = *tbr + 1; + // All other columns and rows are moved respectively to the left + // and above. + while (src < tbr_next) { + std::swap(dbm[dst], dbm[src]); + for (dimension_type i = old_space_dim + 1; i-- > 0; ) { + DB_Row& 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) { + std::swap(dbm[dst], dbm[src]); + for (dimension_type i = old_space_dim + 1; i-- > 0; ) { + DB_Row& 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); + assert(OK()); +} + +template +template +void +BD_Shape::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 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& dbm_0 = dbm[0]; + DB_Row& 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& dbm_i = dbm[i]; + ++new_i; + DB_Row& 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]); + } + } + } + } + + std::swap(dbm, x); + assert(OK()); +} + +template +void +BD_Shape::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& dbm_i = dbm[i]; + const DB_Row& 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(); + assert(OK()); +} + +template +template +void +BD_Shape::CC76_extrapolation_assign(const BD_Shape& y, + Iterator first, Iterator last, + unsigned* tp) { + const dimension_type space_dim = space_dimension(); + + // Dimension-compatibility check. + if (space_dim != y.space_dimension()) + throw_dimension_incompatible("CC76_extrapolation_assign(y)", y); + +#ifndef NDEBUG + { + // We assume that `y' is contained in or equal to `*this'. + const BD_Shape x_copy = *this; + const BD_Shape y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + // If both 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 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& dbm_i = dbm[i]; + const DB_Row& 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(); + assert(OK()); +} + +template +void +BD_Shape::get_limiting_shape(const Constraint_System& cs, + BD_Shape& limiting_shape) const { + const dimension_type cs_space_dim = cs.space_dimension(); + // Private method: the caller has to ensure the following. + assert(cs_space_dim <= 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 (extract_bounded_difference(c, cs_space_dim, num_vars, i, j, coeff)) { + // Select the cell to be modified for the "<=" part of the constraint, + // and set `coeff' to the absolute value of itself. + const 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& ls_dbm = limiting_shape.dbm; + 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 (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()) { + 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) + 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 +void +BD_Shape::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_generic("limited_CC76_extrapolation_assign(y, cs)", + "cs is space_dimension incompatible"); + + // Strict inequalities not allowed. + if (cs.has_strict_inequalities()) + throw_generic("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; + +#ifndef NDEBUG + { + // We assume that `y' is contained in or equal to `*this'. + const BD_Shape x_copy = *this; + const BD_Shape y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + // If `*this' is empty, since `*this' contains `y', `y' is empty too. + if (marked_empty()) + return; + // If `y' is empty, we return. + if (y.marked_empty()) + return; + + BD_Shape limiting_shape(space_dim, UNIVERSE); + get_limiting_shape(cs, limiting_shape); + CC76_extrapolation_assign(y, tp); + intersection_assign(limiting_shape); +} + +template +void +BD_Shape::BHMZ05_widening_assign(const BD_Shape& y, unsigned* tp) { + const dimension_type space_dim = space_dimension(); + + // Dimension-compatibility check. + if (space_dim != y.space_dimension()) + throw_dimension_incompatible("BHMZ05_widening_assign(y)", y); + +#ifndef NDEBUG + { + // We assume that `y' is contained in or equal to `*this'. + const BD_Shape x_copy = *this; + const BD_Shape y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + // Compute the affine dimension of `y'. + const dimension_type y_affine_dim = y.affine_dimension(); + // If the affine dimension of `y' is zero, then either `y' is + // zero-dimensional, or it is empty, or it is a singleton. + // In all cases, due to the inclusion hypothesis, the result is `*this'. + if (y_affine_dim == 0) + return; + + // If the affine dimension has changed, due to the inclusion hypothesis, + // the result is `*this'. + const dimension_type x_affine_dim = affine_dimension(); + assert(x_affine_dim >= y_affine_dim); + if (x_affine_dim != y_affine_dim) + return; + + // If there are tokens available, work on a temporary copy. + if (tp != 0 && *tp > 0) { + BD_Shape x_tmp(*this); + x_tmp.BHMZ05_widening_assign(y, 0); + // If the widening was not precise, use one of the available tokens. + if (!contains(x_tmp)) + --(*tp); + return; + } + + // Here no token is available. + assert(marked_shortest_path_closed() && y.marked_shortest_path_closed()); + // Minimize `y'. + y.shortest_path_reduction_assign(); + + // Extrapolate unstable bounds, taking into account redundancy in `y'. + for (dimension_type i = space_dim + 1; i-- > 0; ) { + DB_Row& dbm_i = dbm[i]; + const DB_Row& 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(); + assert(OK()); +} + +template +void +BD_Shape::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_generic("limited_BHMZ05_extrapolation_assign(y, cs)", + "cs is space-dimension incompatible"); + + // Strict inequalities are not allowed. + if (cs.has_strict_inequalities()) + throw_generic("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; + +#ifndef NDEBUG + { + // We assume that `y' is contained in or equal to `*this'. + const BD_Shape x_copy = *this; + const BD_Shape y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + // If `*this' is empty, since `*this' contains `y', `y' is empty too. + if (marked_empty()) + return; + // If `y' is empty, we return. + if (y.marked_empty()) + return; + + BD_Shape limiting_shape(space_dim, UNIVERSE); + get_limiting_shape(cs, limiting_shape); + BHMZ05_widening_assign(y, tp); + intersection_assign(limiting_shape); +} + +template +void +BD_Shape::CC76_narrowing_assign(const BD_Shape& y) { + const dimension_type space_dim = space_dimension(); + + // Dimension-compatibility check. + if (space_dim != y.space_dimension()) + throw_dimension_incompatible("CC76_narrowing_assign(y)", y); + +#ifndef NDEBUG + { + // We assume that `*this' is contained in or equal to `y'. + const BD_Shape x_copy = *this; + const BD_Shape y_copy = y; + assert(y_copy.contains(x_copy)); + } +#endif + + // If both 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& dbm_i = dbm[i]; + const DB_Row& 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(); + assert(OK()); +} + +template +void +BD_Shape +::deduce_v_minus_u_bounds(const dimension_type v, + const dimension_type last_v, + const Linear_Expression& sc_expr, + Coefficient_traits::const_reference sc_den, + const N& ub_v) { + assert(sc_den > 0); + 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/den' is + // greater than zero. In particular: + // if `q >= 1', then `v - u <= ub_v - ub_u'; + // if `0 < q < 1', then `v - u <= ub_v - (q*ub_u + (1-q)*lb_u)'. + PPL_DIRTY_TEMP0(mpq_class, mpq_sc_den); + assign_r(mpq_sc_den, sc_den, ROUND_NOT_NEEDED); + const DB_Row& dbm_0 = dbm[0]; + // Speculative allocation of temporaries to be used in the following loop. + PPL_DIRTY_TEMP0(mpq_class, minus_lb_u); + PPL_DIRTY_TEMP0(mpq_class, q); + PPL_DIRTY_TEMP0(mpq_class, ub_u); + PPL_DIRTY_TEMP(N, up_approx); + // No need to consider indices greater than `last_v'. + for (dimension_type u = last_v; u > 0; --u) + if (u != v) { + const Coefficient& expr_u = sc_expr.coefficient(Variable(u-1)); + if (expr_u > 0) { + if (expr_u >= sc_den) + // Deducing `v - u <= ub_v - ub_u'. + sub_assign_r(dbm[u][v], ub_v, dbm_0[u], ROUND_UP); + else { + DB_Row& dbm_u = dbm[u]; + const N& dbm_u0 = dbm_u[0]; + if (!is_plus_infinity(dbm_u0)) { + // Let `ub_u' and `lb_u' be the known upper and lower bound + // for `u', respectively. Letting `q = expr_u/sc_den' be the + // rational coefficient of `u' in `sc_expr/sc_den', + // the upper bound for `v - u' is computed as + // `ub_v - (q * ub_u + (1-q) * lb_u)', i.e., + // `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_den, ROUND_NOT_NEEDED); + assign_r(ub_u, dbm_0[u], ROUND_NOT_NEEDED); + // Compute `ub_u - lb_u'. + add_assign_r(ub_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED); + // Compute `(-lb_u) - q * (ub_u - lb_u)'. + sub_mul_assign_r(minus_lb_u, q, ub_u, ROUND_NOT_NEEDED); + 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 +void +BD_Shape +::deduce_u_minus_v_bounds(const dimension_type v, + const dimension_type last_v, + const Linear_Expression& sc_expr, + Coefficient_traits::const_reference sc_den, + const N& minus_lb_v) { + assert(sc_den > 0); + 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/den' is + // greater than zero. In particular: + // if `q >= 1', then `u - v <= lb_u - lb_v'; + // if `0 < q < 1', then `u - v <= (q*lb_u + (1-q)*ub_u) - lb_v'. + PPL_DIRTY_TEMP0(mpq_class, mpq_sc_den); + assign_r(mpq_sc_den, sc_den, ROUND_NOT_NEEDED); + DB_Row& dbm_0 = dbm[0]; + DB_Row& dbm_v = dbm[v]; + // Speculative allocation of temporaries to be used in the following loop. + PPL_DIRTY_TEMP0(mpq_class, ub_u); + PPL_DIRTY_TEMP0(mpq_class, q); + PPL_DIRTY_TEMP0(mpq_class, minus_lb_u); + PPL_DIRTY_TEMP(N, up_approx); + // No need to consider indices greater than `last_v'. + for (dimension_type u = last_v; u > 0; --u) + if (u != v) { + const Coefficient& expr_u = sc_expr.coefficient(Variable(u-1)); + if (expr_u > 0) { + if (expr_u >= sc_den) + // Deducing `u - v <= lb_u - lb_v', + // i.e., `u - v <= (-lb_v) - (-lb_u)'. + sub_assign_r(dbm_v[u], minus_lb_v, dbm[u][0], ROUND_UP); + else { + const N& dbm_0u = dbm_0[u]; + if (!is_plus_infinity(dbm_0u)) { + // Let `ub_u' and `lb_u' be the known upper and lower bound + // for `u', respectively. Letting `q = expr_u/sc_den' be the + // rational coefficient of `u' in `sc_expr/sc_den', + // the upper bound for `u - v' is computed as + // `(q * lb_u + (1-q) * ub_u) - lb_v', i.e., + // `ub_u - q * (ub_u + (-lb_u)) + 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_den, ROUND_NOT_NEEDED); + assign_r(minus_lb_u, dbm[u][0], ROUND_NOT_NEEDED); + // Compute `ub_u - lb_u'. + add_assign_r(minus_lb_u, minus_lb_u, ub_u, ROUND_NOT_NEEDED); + // Compute `ub_u - q * (ub_u - lb_u)'. + sub_mul_assign_r(ub_u, q, minus_lb_u, ROUND_NOT_NEEDED); + assign_r(up_approx, ub_u, ROUND_UP); + // Deducing `u - v <= (q*lb_u + (1-q)*ub_u) - lb_v'. + add_assign_r(dbm_v[u], up_approx, minus_lb_v, ROUND_UP); + } + } + } + } +} + +template +void +BD_Shape::forget_all_dbm_constraints(const dimension_type v) { + assert(0 < v && v <= dbm.num_rows()); + DB_Row& 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 +void +BD_Shape::forget_binary_dbm_constraints(const dimension_type v) { + assert(0 < v && v <= dbm.num_rows()); + DB_Row& 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 +void +BD_Shape::unconstrain(const Variable var) { + // Dimension-compatibility check. + const dimension_type dim = var.id(); + if (space_dimension() < dim) + throw_dimension_incompatible("unconstrain(var)", 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(dim+1); + // Shortest-path closure is preserved, but not reduction. + reset_shortest_path_reduced(); + assert(OK()); +} + +template +void +BD_Shape::unconstrain(const Variables_Set& to_be_unconstrained) { + // The cylindrification wrt no dimensions is a no-op. + // This case captures the only legal cylindrification in a 0-dim space. + if (to_be_unconstrained.empty()) + return; + + // Dimension-compatibility check. + const dimension_type min_space_dim = to_be_unconstrained.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 tbu = to_be_unconstrained.begin(), + tbu_end = to_be_unconstrained.end(); tbu != tbu_end; ++tbu) + forget_all_dbm_constraints(*tbu + 1); + // Shortest-path closure is preserved, but not reduction. + reset_shortest_path_reduced(); + assert(OK()); +} + +template +void +BD_Shape::refine(const Variable var, + const Relation_Symbol relsym, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator) { + assert(denominator != 0); + const dimension_type expr_space_dim = expr.space_dimension(); + assert(space_dimension() >= expr_space_dim); + const dimension_type v = var.id() + 1; + assert(v <= space_dimension()); + assert(expr.coefficient(var) == 0); + 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 = 0; + // Get information about the number of non-zero coefficients in `expr'. + for (dimension_type i = expr_space_dim; i-- > 0; ) + if (expr.coefficient(Variable(i)) != 0) { + if (t++ == 1) + break; + else + w = i+1; + } + + // 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.coefficient(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& dbm_0 = dbm[0]; + PPL_DIRTY_TEMP_COEFFICIENT(minus_den); + neg_assign(minus_den, 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_den); + 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_den); + break; + default: + // We already dealt with the other cases. + throw std::runtime_error("PPL internal error"); + } + return; + } + + if (t == 1) { + // Case 2: expr == a*w + b, w != v, a == denominator. + assert(expr.coefficient(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_den); + 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_den); + add_dbm_constraint(v, w, d); + break; + default: + // We already dealt with the other cases. + throw std::runtime_error("PPL internal error"); + } + 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_den = is_sc ? denominator : minus_den; + const Coefficient& minus_sc_den = is_sc ? minus_den : denominator; + // NOTE: here, for optimization purposes, `minus_expr' is only assigned + // when `denominator' is negative. Do not use it unless you are sure + // it has been correctly assigned. + Linear_Expression minus_expr; + if (!is_sc) + minus_expr = -expr; + const Linear_Expression& sc_expr = is_sc ? expr : minus_expr; + + 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 (dimension_type i = w; i > 0; --i) { + const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1)); + const int sign_i = sgn(sc_i); + if (sign_i == 0) + continue; + 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]; + if (!is_plus_infinity(approx_i)) + add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP); + else { + ++pinf_count; + pinf_index = i; + } + } + // Approximating `-sc_expr'. + if (neg_pinf_count <= 1) { + const N& approx_minus_i = dbm[i][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; + } + } + } + else if (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][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; + } + } + // Approximating `-sc_expr'. + if (neg_pinf_count <= 1) { + const N& approx_i = dbm_0[i]; + 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; + } + } + } + } + // Return immediately if no approximation could be computed. + if (pinf_count > 1 && neg_pinf_count > 1) { + 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_den' is known to be positive, this amounts to + // rounding downwards, which is achieved as usual by rounding upwards + // `minus_sc_den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + + // Exploit the upper approximation, if possible. + if (pinf_count <= 1) { + // Compute quotient (if needed). + if (down_sc_den != 1) + div_assign_r(sum, sum, down_sc_den, 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_den, sum); + } + else + // Here `pinf_count == 1'. + if (pinf_index != v + && sc_expr.coefficient(Variable(pinf_index-1)) == sc_den) + // 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_den != 1) + div_assign_r(neg_sum, neg_sum, down_sc_den, ROUND_UP); + // Add the lower bound constraint, if meaningful. + if (neg_pinf_count == 0) { + // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'. + DB_Row& 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_den, neg_sum); + } + else + // Here `neg_pinf_count == 1'. + if (neg_pinf_index != v + && sc_expr.coefficient(Variable(neg_pinf_index-1)) == sc_den) + // Add the constraint `v - neg_pinf_index >= -neg_sum', + // i.e., `neg_pinf_index - v <= neg_sum'. + 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 (dimension_type i = w; i > 0; --i) { + const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1)); + const int sign_i = sgn(sc_i); + if (sign_i == 0) + continue; + // Choose carefully: we are approximating `sc_expr'. + const N& approx_i = (sign_i > 0) ? dbm_0[i] : dbm[i][0]; + if (is_plus_infinity(approx_i)) { + if (++pinf_count > 1) + break; + pinf_index = i; + continue; + } + 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_den != 1) { + // Before computing the quotient, the denominator should be + // approximated towards zero. Since `sc_den' is known to be + // positive, this amounts to rounding downwards, which is achieved + // by rounding upwards `minus_sc-den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(sum, sum, down_sc_den, ROUND_UP); + } + + if (pinf_count == 0) { + // Add the constraint `v <= sum'. + add_dbm_constraint(0, v, sum); + // Deduce constraints of the form `v - u', where `u != v'. + deduce_v_minus_u_bounds(v, w, sc_expr, sc_den, sum); + } + else if (pinf_count == 1) + if (expr.coefficient(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 (dimension_type i = w; i > 0; --i) { + const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1)); + const int sign_i = sgn(sc_i); + if (sign_i == 0) + continue; + // Choose carefully: we are approximating `-sc_expr'. + const N& approx_i = (sign_i > 0) ? dbm[i][0] : dbm_0[i]; + if (is_plus_infinity(approx_i)) { + if (++pinf_count > 1) + break; + pinf_index = i; + 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_den != 1) { + // Before computing the quotient, the denominator should be + // approximated towards zero. Since `sc_den' is known to be positive, + // this amounts to rounding downwards, which is achieved by rounding + // upwards `minus_sc_den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(sum, sum, down_sc_den, ROUND_UP); + } + + if (pinf_count == 0) { + // Add the constraint `v >= -sum', i.e., `-v <= sum'. + add_dbm_constraint(v, 0, sum); + // Deduce constraints of the form `u - v', where `u != v'. + deduce_u_minus_v_bounds(v, w, sc_expr, sc_den, sum); + } + else if (pinf_count == 1) + if (pinf_index != v + && expr.coefficient(Variable(pinf_index-1)) == denominator) + // Add the constraint `v - pinf_index >= -sum', + // i.e., `pinf_index - v <= sum'. + add_dbm_constraint(v, pinf_index, sum); + break; + + default: + // We already dealt with the other cases. + throw std::runtime_error("PPL internal error"); + } + + assert(OK()); +} + +template +void +BD_Shape::affine_image(const Variable var, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator) { + // The denominator cannot be zero. + if (denominator == 0) + throw_generic("affine_image(v, e, d)", "d == 0"); + + // Dimension-compatibility checks. + // The dimension of `expr' should not be greater than the dimension + // of `*this'. + const dimension_type space_dim = space_dimension(); + const dimension_type expr_space_dim = expr.space_dimension(); + if (space_dim < expr_space_dim) + throw_dimension_incompatible("affine_image(v, e, d)", "e", expr); + + // `var' should be one of the dimensions of the shape. + const dimension_type v = var.id() + 1; + if (v > space_dim) + throw_dimension_incompatible("affine_image(v, e, d)", var.id()); + + // The image of an empty BDS is empty too. + shortest_path_closure_assign(); + if (marked_empty()) + return; + + const Coefficient& b = expr.inhomogeneous_term(); + // Number of non-zero coefficients in `expr': will be set to + // 0, 1, or 2, the latter value meaning any value greater than 1. + dimension_type t = 0; + // Index of the last non-zero coefficient in `expr', if any. + dimension_type w = 0; + // Get information about the number of non-zero coefficients in `expr'. + for (dimension_type i = expr_space_dim; i-- > 0; ) + if (expr.coefficient(Variable(i)) != 0) { + if (t++ == 1) + break; + else + w = i+1; + } + + // Now we know the form of `expr': + // - If t == 0, then expr == b, with `b' a constant; + // - If t == 1, then expr == a*w + b, where `w' can be `v' or another + // variable; in this second case we have to check whether `a' is + // equal to `denominator' or `-denominator', since otherwise we have + // to fall back on the general form; + // - If t == 2, the `expr' is of the general form. + PPL_DIRTY_TEMP_COEFFICIENT(minus_den); + neg_assign(minus_den, denominator); + + if (t == 0) { + // Case 1: expr == b. + // Remove all constraints on `var'. + forget_all_dbm_constraints(v); + // Shortest-path closure is preserved, but not reduction. + if (marked_shortest_path_reduced()) + reset_shortest_path_reduced(); + // Add the constraint `var == b/denominator'. + add_dbm_constraint(0, v, b, denominator); + add_dbm_constraint(v, 0, b, minus_den); + assert(OK()); + return; + } + + if (t == 1) { + // Value of the one and only non-zero coefficient in `expr'. + const Coefficient& a = expr.coefficient(Variable(w-1)); + if (a == denominator || a == minus_den) { + // Case 2: expr == a*w + b, with a == +/- denominator. + if (w == v) { + // `expr' is of the form: a*v + b. + if (a == denominator) { + if (b == 0) + // The transformation is the identity function. + return; + else { + // Translate all the constraints on `var', + // adding or subtracting the value `b/denominator'. + PPL_DIRTY_TEMP(N, d); + div_round_up(d, b, denominator); + PPL_DIRTY_TEMP(N, c); + div_round_up(c, b, minus_den); + DB_Row& dbm_v = dbm[v]; + for (dimension_type i = space_dim + 1; i-- > 0; ) { + N& dbm_vi = dbm_v[i]; + add_assign_r(dbm_vi, dbm_vi, c, ROUND_UP); + N& dbm_iv = dbm[i][v]; + add_assign_r(dbm_iv, dbm_iv, d, ROUND_UP); + } + // Both shortest-path closure and reduction are preserved. + } + } + else { + // Here `a == -denominator'. + // Remove the binary constraints on `var'. + forget_binary_dbm_constraints(v); + // Swap the unary constraints on `var'. + std::swap(dbm[v][0], dbm[0][v]); + // Shortest-path closure is not preserved. + 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_den); + 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_den); + } + else { + // Here a == -denominator, so that we should be adding + // the constraint `v + w == b/denominator'. + // Approximate it by computing lower and upper bounds for `w'. + const N& dbm_w0 = dbm[w][0]; + if (!is_plus_infinity(dbm_w0)) { + // Add the constraint `v <= b/denominator - lower_w'. + 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_den); + add_assign_r(dbm[v][0], dbm_0w, c, ROUND_UP); + reset_shortest_path_closed(); + } + } + } + assert(OK()); + return; + } + } + + // General case. + // Either t == 2, so that + // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2, + // or t == 1, expr == a*w + b, but a <> +/- denominator. + // We will remove all the constraints on `var' and add back + // constraints providing upper and lower bounds for `var'. + + // Compute upper approximations for `expr' and `-expr' + // into `pos_sum' and `neg_sum', respectively, taking into account + // the sign of `denominator'. + // Note: approximating `-expr' from above and then negating the + // result is the same as approximating `expr' from below. + const bool is_sc = (denominator > 0); + 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_den = is_sc ? denominator : minus_den; + const Coefficient& minus_sc_den = is_sc ? minus_den : denominator; + // NOTE: here, for optimization purposes, `minus_expr' is only assigned + // when `denominator' is negative. Do not use it unless you are sure + // it has been correctly assigned. + Linear_Expression minus_expr; + if (!is_sc) + minus_expr = -expr; + const Linear_Expression& sc_expr = is_sc ? expr : minus_expr; + + 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& 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 (dimension_type i = w; i > 0; --i) { + const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1)); + const int sign_i = sgn(sc_i); + if (sign_i > 0) { + assign_r(coeff_i, sc_i, ROUND_UP); + // Approximating `sc_expr'. + if (pos_pinf_count <= 1) { + const N& up_approx_i = dbm_0[i]; + if (!is_plus_infinity(up_approx_i)) + add_mul_assign_r(pos_sum, coeff_i, up_approx_i, ROUND_UP); + else { + ++pos_pinf_count; + pos_pinf_index = i; + } + } + // Approximating `-sc_expr'. + if (neg_pinf_count <= 1) { + const N& up_approx_minus_i = dbm[i][0]; + if (!is_plus_infinity(up_approx_minus_i)) + add_mul_assign_r(neg_sum, coeff_i, up_approx_minus_i, ROUND_UP); + else { + ++neg_pinf_count; + neg_pinf_index = i; + } + } + } + else if (sign_i < 0) { + 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][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; + } + } + // Approximating `-sc_expr'. + if (neg_pinf_count <= 1) { + const N& up_approx_i = dbm_0[i]; + if (!is_plus_infinity(up_approx_i)) + add_mul_assign_r(neg_sum, coeff_i, up_approx_i, ROUND_UP); + else { + ++neg_pinf_count; + neg_pinf_index = i; + } + } + } + } + + // Remove all constraints on 'v'. + forget_all_dbm_constraints(v); + // Shortest-path closure is maintained, but not reduction. + if (marked_shortest_path_reduced()) + reset_shortest_path_reduced(); + // Return immediately if no approximation could be computed. + if (pos_pinf_count > 1 && neg_pinf_count > 1) { + assert(OK()); + return; + } + + // In the following, shortest-path closure will be definitely lost. + reset_shortest_path_closed(); + + // Exploit the upper approximation, if possible. + if (pos_pinf_count <= 1) { + // Compute quotient (if needed). + if (sc_den != 1) { + // Before computing quotients, the denominator should be approximated + // towards zero. Since `sc_den' is known to be positive, this amounts to + // rounding downwards, which is achieved as usual by rounding upwards + // `minus_sc_den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(pos_sum, pos_sum, down_sc_den, ROUND_UP); + } + // Add the upper bound constraint, if meaningful. + if (pos_pinf_count == 0) { + // Add the constraint `v <= pos_sum'. + 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_den, pos_sum); + } + else + // Here `pos_pinf_count == 1'. + if (pos_pinf_index != v + && sc_expr.coefficient(Variable(pos_pinf_index-1)) == sc_den) + // Add the constraint `v - pos_pinf_index <= pos_sum'. + dbm[pos_pinf_index][v] = pos_sum; + } + + // Exploit the lower approximation, if possible. + if (neg_pinf_count <= 1) { + // Compute quotient (if needed). + if (sc_den != 1) { + // Before computing quotients, the denominator should be approximated + // towards zero. Since `sc_den' is known to be positive, this amounts to + // rounding downwards, which is achieved as usual by rounding upwards + // `minus_sc_den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(neg_sum, neg_sum, down_sc_den, ROUND_UP); + } + // Add the lower bound constraint, if meaningful. + if (neg_pinf_count == 0) { + // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'. + DB_Row& 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_den, neg_sum); + } + else + // Here `neg_pinf_count == 1'. + if (neg_pinf_index != v + && sc_expr.coefficient(Variable(neg_pinf_index-1)) == sc_den) + // Add the constraint `v - neg_pinf_index >= -neg_sum', + // i.e., `neg_pinf_index - v <= neg_sum'. + dbm[v][neg_pinf_index] = neg_sum; + } + + assert(OK()); +} + +template +void +BD_Shape::affine_preimage(const Variable var, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator) { + // The denominator cannot be zero. + if (denominator == 0) + throw_generic("affine_preimage(v, e, d)", "d == 0"); + + // Dimension-compatibility checks. + // The dimension of `expr' should not be greater than the dimension + // of `*this'. + const dimension_type space_dim = space_dimension(); + const dimension_type expr_space_dim = expr.space_dimension(); + if (space_dim < expr_space_dim) + throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr); + + // `var' should be one of the dimensions of + // the 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 = 0; + // Get information about the number of non-zero coefficients in `expr'. + for (dimension_type i = expr_space_dim; i-- > 0; ) + if (expr.coefficient(Variable(i)) != 0) { + if (t++ == 1) + break; + else + j = i; + } + + // Now we know the form of `expr': + // - If t == 0, then expr = b, with `b' a constant; + // - If t == 1, then expr = a*w + b, where `w' can be `v' or another + // variable; in this second case we have to check whether `a' is + // equal to `denominator' or `-denominator', since otherwise we have + // to fall back on the general form; + // - If t > 1, the `expr' is of the general form. + if (t == 0) { + // Case 1: expr = n; remove all constraints on `var'. + forget_all_dbm_constraints(v); + // Shortest-path closure is preserved, but not reduction. + if (marked_shortest_path_reduced()) + reset_shortest_path_reduced(); + assert(OK()); + return; + } + + if (t == 1) { + // Value of the one and only non-zero coefficient in `expr'. + const Coefficient& a = expr.coefficient(Variable(j)); + if (a == denominator || a == -denominator) { + // Case 2: expr = a*w + b, with a = +/- denominator. + if (j == var.id()) + // Apply affine_image() on the inverse of this transformation. + affine_image(var, 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(); + 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(); + } + assert(OK()); +} + +template +void +BD_Shape +::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_generic("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)", + "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)", + "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 = 0; + // Get information about the number of non-zero coefficients in `expr'. + for (dimension_type i = ub_space_dim; i-- > 0; ) + if (ub_expr.coefficient(Variable(i)) != 0) { + if (t++ == 1) + break; + else + w = i+1; + } + + // 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_den); + neg_assign(minus_den, 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); + assert(OK()); + return; + } + + if (t == 1) { + // Value of the one and only non-zero coefficient in `ub_expr'. + const Coefficient& a = ub_expr.coefficient(Variable(w-1)); + if (a == denominator || a == minus_den) { + // 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 = Variable(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(); + 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(); + } + } + 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_den = is_sc ? denominator : minus_den; + const Coefficient& minus_sc_den = is_sc ? minus_den : denominator; + // NOTE: here, for optimization purposes, `minus_expr' is only assigned + // when `denominator' is negative. Do not use it unless you are sure + // it has been correctly assigned. + Linear_Expression minus_expr; + if (!is_sc) + minus_expr = -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& 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 (dimension_type i = w; i > 0; --i) { + const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1)); + const int sign_i = sgn(sc_i); + if (sign_i > 0) { + assign_r(coeff_i, sc_i, ROUND_UP); + // Approximating `sc_expr'. + if (pos_pinf_count <= 1) { + const N& up_approx_i = dbm_0[i]; + if (!is_plus_infinity(up_approx_i)) + add_mul_assign_r(pos_sum, coeff_i, up_approx_i, ROUND_UP); + else { + ++pos_pinf_count; + pos_pinf_index = i; + } + } + } + else if (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][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; + } + } + } + } + // 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_den != 1) { + // Before computing quotients, the denominator should be approximated + // towards zero. Since `sc_den' is known to be positive, this amounts to + // rounding downwards, which is achieved as usual by rounding upwards + // `minus_sc_den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(pos_sum, pos_sum, down_sc_den, ROUND_UP); + } + // Add the upper bound constraint, if meaningful. + if (pos_pinf_count == 0) { + // Add the constraint `v <= pos_sum'. + 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_den, pos_sum); + } + else + // Here `pos_pinf_count == 1'. + if (pos_pinf_index != v + && sc_expr.coefficient(Variable(pos_pinf_index-1)) == sc_den) + // Add the constraint `v - pos_pinf_index <= pos_sum'. + dbm[pos_pinf_index][v] = pos_sum; + } + assert(OK()); +} + +template +void +BD_Shape +::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_generic("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)", + "lb", lb_expr); + const dimension_type ub_space_dim = ub_expr.space_dimension(); + if (space_dim < ub_space_dim) + throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub)", + "ub", ub_expr); + + // Any preimage of an empty 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 = Variable(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_den); + neg_assign(lb_inverse_den, lb_expr_v); + affine_image(new_var, lb_inverse, lb_inverse_den); + shortest_path_closure_assign(); + assert(!marked_empty()); + generalized_affine_preimage(var, LESS_OR_EQUAL, + ub_expr, denominator); + if (sgn(denominator) == sgn(lb_inverse_den)) + add_constraint(var >= new_var); + else + add_constraint(var <= new_var); + // Remove the temporarily added dimension. + remove_higher_space_dimensions(space_dim); +} + +template +void +BD_Shape::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_generic("generalized_affine_image(v, r, e, d)", "d == 0"); + + // Dimension-compatibility checks. + // The dimension of `expr' should not be greater than the dimension + // of `*this'. + const dimension_type space_dim = space_dimension(); + const dimension_type expr_space_dim = expr.space_dimension(); + if (space_dim < expr_space_dim) + throw_dimension_incompatible("generalized_affine_image(v, r, e, d)", + "e", expr); + + // `var' should be one of the dimensions of the BDS. + const dimension_type v = var.id() + 1; + if (v > space_dim) + throw_dimension_incompatible("generalized_affine_image(v, r, e, d)", + var.id()); + + // The relation symbol cannot be a strict relation symbol. + if (relsym == LESS_THAN || relsym == GREATER_THAN) + throw_generic("generalized_affine_image(v, r, e, d)", + "r is a strict relation symbol and " + "*this is a BD_Shape"); + // The relation symbol cannot be a disequality. + if (relsym == NOT_EQUAL) + throw_generic("generalized_affine_image(v, r, e, d)", + "r is the disequality relation symbol and " + "*this is a BD_Shape"); + + if (relsym == EQUAL) { + // The relation symbol is "==": + // this is just an affine image computation. + affine_image(var, expr, denominator); + return; + } + + // The image of an empty BDS is empty too. + shortest_path_closure_assign(); + if (marked_empty()) + return; + + const Coefficient& b = expr.inhomogeneous_term(); + // Number of non-zero coefficients in `expr': will be set to + // 0, 1, or 2, the latter value meaning any value greater than 1. + dimension_type t = 0; + // Index of the last non-zero coefficient in `expr', if any. + dimension_type w = 0; + // Get information about the number of non-zero coefficients in `expr'. + for (dimension_type i = expr_space_dim; i-- > 0; ) + if (expr.coefficient(Variable(i)) != 0) { + if (t++ == 1) + break; + else + w = i+1; + } + + // Now we know the form of `expr': + // - If t == 0, then expr == b, with `b' a constant; + // - If t == 1, then expr == a*w + b, where `w' can be `v' or another + // variable; in this second case we have to check whether `a' is + // equal to `denominator' or `-denominator', since otherwise we have + // to fall back on the general form; + // - If t == 2, the `expr' is of the general form. + DB_Row& dbm_0 = dbm[0]; + DB_Row& dbm_v = dbm[v]; + PPL_DIRTY_TEMP_COEFFICIENT(minus_den); + neg_assign(minus_den, denominator); + + if (t == 0) { + // Case 1: expr == b. + // Remove all constraints on `var'. + forget_all_dbm_constraints(v); + // Both shortest-path closure and reduction are lost. + 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_den); + break; + default: + // We already dealt with the other cases. + throw std::runtime_error("PPL internal error"); + } + assert(OK()); + return; + } + + if (t == 1) { + // Value of the one and only non-zero coefficient in `expr'. + const Coefficient& a = expr.coefficient(Variable(w-1)); + if (a == denominator || a == minus_den) { + // Case 2: expr == a*w + b, with a == +/- denominator. + 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_den); + 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. + throw std::runtime_error("PPL internal error"); + } + 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_den = is_sc ? denominator : minus_den; + const Coefficient& minus_sc_den = is_sc ? minus_den : denominator; + // NOTE: here, for optimization purposes, `minus_expr' is only assigned + // when `denominator' is negative. Do not use it unless you are sure + // it has been correctly assigned. + Linear_Expression minus_expr; + if (!is_sc) + minus_expr = -expr; + const Linear_Expression& sc_expr = is_sc ? expr : minus_expr; + + 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'. + for (dimension_type i = w; i > 0; --i) { + const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1)); + const int sign_i = sgn(sc_i); + if (sign_i == 0) + continue; + // Choose carefully: we are approximating `sc_expr'. + const N& approx_i = (sign_i > 0) ? dbm_0[i] : dbm[i][0]; + if (is_plus_infinity(approx_i)) { + if (++pinf_count > 1) + break; + pinf_index = i; + continue; + } + 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) { + assert(OK()); + return; + } + + // Divide by the (sign corrected) denominator (if needed). + if (sc_den != 1) { + // Before computing the quotient, the denominator should be approximated + // towards zero. Since `sc_den' is known to be positive, this amounts to + // rounding downwards, which is achieved as usual by rounding upwards + // `minus_sc_den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(sum, sum, down_sc_den, ROUND_UP); + } + + if (pinf_count == 0) { + // Add the constraint `v <= sum'. + add_dbm_constraint(0, v, sum); + // Deduce constraints of the form `v - u', where `u != v'. + deduce_v_minus_u_bounds(v, w, sc_expr, sc_den, sum); + } + else if (pinf_count == 1) + if (pinf_index != v + && expr.coefficient(Variable(pinf_index-1)) == denominator) + // Add the constraint `v - pinf_index <= sum'. + add_dbm_constraint(pinf_index, v, sum); + break; + + case GREATER_OR_EQUAL: + // Compute an upper approximation for `-sc_expr' into `sum'. + // Note: approximating `-sc_expr' from above and then negating the + // result is the same as approximating `sc_expr' from below. + + // Approximate the inhomogeneous term. + assign_r(sum, minus_sc_b, ROUND_UP); + // Approximate the homogeneous part of `-sc_expr'. + for (dimension_type i = expr_space_dim + 1; i > 0; --i) { + const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1)); + const int sign_i = sgn(sc_i); + if (sign_i == 0) + continue; + // Choose carefully: we are approximating `-sc_expr'. + const N& approx_i = (sign_i > 0) ? dbm[i][0] : dbm_0[i]; + if (is_plus_infinity(approx_i)) { + if (++pinf_count > 1) + break; + pinf_index = i; + continue; + } + 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) { + assert(OK()); + return; + } + + // Divide by the (sign corrected) denominator (if needed). + if (sc_den != 1) { + // Before computing the quotient, the denominator should be approximated + // towards zero. Since `sc_den' is known to be positive, this amounts to + // rounding downwards, which is achieved as usual by rounding upwards + // `minus_sc_den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(sum, sum, down_sc_den, ROUND_UP); + } + + if (pinf_count == 0) { + // Add the constraint `v >= -sum', i.e., `-v <= sum'. + add_dbm_constraint(v, 0, sum); + // Deduce constraints of the form `u - v', where `u != v'. + deduce_u_minus_v_bounds(v, w, sc_expr, sc_den, sum); + } + else if (pinf_count == 1) + if (pinf_index != v + && expr.coefficient(Variable(pinf_index-1)) == denominator) + // Add the constraint `v - pinf_index >= -sum', + // i.e., `pinf_index - v <= sum'. + add_dbm_constraint(v, pinf_index, sum); + break; + + default: + // We already dealt with the other cases. + throw std::runtime_error("PPL internal error"); + } + assert(OK()); +} + +template +void +BD_Shape::generalized_affine_image(const Linear_Expression& lhs, + const Relation_Symbol relsym, + const Linear_Expression& rhs) { + // Dimension-compatibility checks. + // The dimension of `lhs' should not be greater than the dimension + // of `*this'. + const dimension_type space_dim = space_dimension(); + const dimension_type lhs_space_dim = lhs.space_dimension(); + if (space_dim < lhs_space_dim) + throw_dimension_incompatible("generalized_affine_image(e1, r, e2)", + "e1", lhs); + + // The dimension of `rhs' should not be greater than the dimension + // of `*this'. + const dimension_type rhs_space_dim = rhs.space_dimension(); + if (space_dim < rhs_space_dim) + throw_dimension_incompatible("generalized_affine_image(e1, r, e2)", + "e2", rhs); + + // Strict relation symbols are not admitted for BDSs. + if (relsym == LESS_THAN || relsym == GREATER_THAN) + throw_generic("generalized_affine_image(e1, r, e2)", + "r is a strict relation symbol and " + "*this is a BD_Shape"); + // The relation symbol cannot be a disequality. + if (relsym == NOT_EQUAL) + throw_generic("generalized_affine_image(e1, r, e2)", + "r is the disequality relation symbol and " + "*this is a BD_Shape"); + + // The image of an empty BDS is empty. + shortest_path_closure_assign(); + if (marked_empty()) + return; + + // Number of non-zero coefficients in `lhs': will be set to + // 0, 1, or 2, the latter value meaning any value greater than 1. + dimension_type t_lhs = 0; + // Index of the last non-zero coefficient in `lhs', if any. + dimension_type j_lhs = 0; + // Compute the number of the non-zero components of `lhs'. + for (dimension_type i = lhs_space_dim; i-- > 0; ) + if (lhs.coefficient(Variable(i)) != 0) { + if (t_lhs++ == 1) + break; + else + j_lhs = i; + } + + const Coefficient& b_lhs = lhs.inhomogeneous_term(); + + if (t_lhs == 0) { + // `lhs' is a constant. + // In principle, it is sufficient to add the constraint `lhs relsym rhs'. + // Note that this constraint is a bounded difference if `t_rhs <= 1' + // or `t_rhs > 1' and `rhs == a*v - a*w + b_rhs'. If `rhs' is of a + // more general form, it will be simply ignored. + // TODO: if it is not a bounded difference, should we compute + // approximations for this constraint? + switch (relsym) { + case LESS_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. + throw std::runtime_error("PPL internal error"); + } + } + else if (t_lhs == 1) { + // Here `lhs == a_lhs * v + b_lhs'. + // Independently from the form of `rhs', we can exploit the + // method computing generalized affine images for a single variable. + Variable v(j_lhs); + // Compute a sign-corrected relation symbol. + const Coefficient& den = lhs.coefficient(v); + Relation_Symbol new_relsym = relsym; + if (den < 0) { + if (relsym == LESS_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, den); + } + else { + // Here `lhs' is of the general form, having at least two variables. + // Compute the set of variables occurring in `lhs'. + bool lhs_vars_intersects_rhs_vars = false; + std::vector lhs_vars; + for (dimension_type i = lhs_space_dim; i-- > 0; ) + if (lhs.coefficient(Variable(i)) != 0) { + lhs_vars.push_back(Variable(i)); + if (rhs.coefficient(Variable(i)) != 0) + lhs_vars_intersects_rhs_vars = true; + } + + if (!lhs_vars_intersects_rhs_vars) { + // `lhs' and `rhs' variables are disjoint. + // 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. + throw std::runtime_error("PPL internal error"); + } + } + else { + // Some variables in `lhs' also occur in `rhs'. + +#if 1 // Simplified computation (see the TODO note below). + + for (dimension_type i = lhs_vars.size(); i-- > 0; ) + forget_all_dbm_constraints(lhs_vars[i].id() + 1); + +#else // Currently unnecessarily complex computation. + + // More accurate computation that is worth doing only if + // the following TODO note is accurately dealt with. + + // To ease the computation, we add an additional dimension. + const Variable new_var = Variable(space_dim); + add_space_dimensions_and_embed(1); + // Constrain the new dimension to be equal to `rhs'. + // NOTE: calling affine_image() instead of 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(); + 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. + throw std::runtime_error("PPL internal error"); + } + // Remove the temporarily added dimension. + remove_higher_space_dimensions(space_dim-1); +#endif // Currently unnecessarily complex computation. + } + } + + assert(OK()); +} + +template +void +BD_Shape::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_generic("generalized_affine_preimage(v, r, e, d)", "d == 0"); + + // Dimension-compatibility checks. + // The dimension of `expr' should not be greater than the dimension + // of `*this'. + const dimension_type space_dim = space_dimension(); + const dimension_type expr_space_dim = expr.space_dimension(); + if (space_dim < expr_space_dim) + throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)", + "e", expr); + + // `var' should be one of the dimensions of the BDS. + const dimension_type v = var.id() + 1; + if (v > space_dim) + throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)", + var.id()); + + // The relation symbol cannot be a strict relation symbol. + if (relsym == LESS_THAN || relsym == GREATER_THAN) + throw_generic("generalized_affine_preimage(v, r, e, d)", + "r is a strict relation symbol and " + "*this is a BD_Shape"); + // The relation symbol cannot be a disequality. + if (relsym == NOT_EQUAL) + throw_generic("generalized_affine_preimage(v, r, e, d)", + "r is the disequality relation symbol and " + "*this is a BD_Shape"); + + if (relsym == EQUAL) { + // The relation symbol is "==": + // this is just an affine preimage computation. + affine_preimage(var, expr, denominator); + 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_den); + neg_assign(inverse_den, expr_v); + const Relation_Symbol inverse_relsym + = (sgn(denominator) == sgn(inverse_den)) ? relsym : reversed_relsym; + generalized_affine_image(var, inverse_relsym, inverse, inverse_den); + return; + } + + 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(); + assert(OK()); +} + +template +void +BD_Shape::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_generic("generalized_affine_preimage(e1, r, e2)", + "r is a strict relation symbol and " + "*this is a BD_Shape"); + // The relation symbol cannot be a disequality. + if (relsym == NOT_EQUAL) + throw_generic("generalized_affine_preimage(e1, r, e2)", + "r is the disequality relation symbol and " + "*this is a BD_Shape"); + + // 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 = 0; + // Compute the number of the non-zero components of `lhs'. + for (dimension_type i = lhs_space_dim; i-- > 0; ) + if (lhs.coefficient(Variable(i)) != 0) { + if (t_lhs++ == 1) + break; + else + j_lhs = i; + } + + const Coefficient& b_lhs = lhs.inhomogeneous_term(); + + if (t_lhs == 0) { + // `lhs' is a constant. + // In 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& den = lhs.coefficient(v); + Relation_Symbol new_relsym = relsym; + if (den < 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, den); + } + else { + // Here `lhs' is of the general form, having at least two variables. + // Compute the set of variables occurring in `lhs'. + bool lhs_vars_intersects_rhs_vars = false; + std::vector lhs_vars; + for (dimension_type i = lhs_space_dim; i-- > 0; ) + if (lhs.coefficient(Variable(i)) != 0) { + lhs_vars.push_back(Variable(i)); + if (rhs.coefficient(Variable(i)) != 0) + lhs_vars_intersects_rhs_vars = true; + } + + if (!lhs_vars_intersects_rhs_vars) { + // `lhs' and `rhs' variables are disjoint. + + // 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. + throw std::runtime_error("PPL internal error"); + } + + // 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 = Variable(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(); + 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. + throw std::runtime_error("PPL internal error"); + } + // Remove the temporarily added dimension. + remove_higher_space_dimensions(bds_space_dim); + } + } + + assert(OK()); +} + +template +Constraint_System +BD_Shape::constraints() const { + Constraint_System cs; + const dimension_type space_dim = space_dimension(); + if (space_dim == 0) { + if (marked_empty()) + cs = Constraint_System::zero_dim_empty(); + } + else if (marked_empty()) + cs.insert(0*Variable(space_dim-1) <= -1); + else if (marked_shortest_path_reduced()) + // Disregard redundant constraints. + cs = minimized_constraints(); + else { + // KLUDGE: in the future `cs' will be constructed of the right dimension. + // For the time being, we force the dimension with the following line. + cs.insert(0*Variable(space_dim-1) <= 0); + + PPL_DIRTY_TEMP_COEFFICIENT(a); + PPL_DIRTY_TEMP_COEFFICIENT(b); + // Go through all the unary constraints in `dbm'. + const DB_Row& 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& 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 +Constraint_System +BD_Shape::minimized_constraints() const { + shortest_path_reduction_assign(); + Constraint_System cs; + const dimension_type space_dim = space_dimension(); + if (space_dim == 0) { + if (marked_empty()) + cs = Constraint_System::zero_dim_empty(); + } + else if (marked_empty()) + cs.insert(0*Variable(space_dim-1) <= -1); + else { + // KLUDGE: in the future `cs' will be constructed of the right dimension. + // For the time being, we force the dimension with the following line. + cs.insert(0*Variable(space_dim-1) <= 0); + + PPL_DIRTY_TEMP_COEFFICIENT(num); + PPL_DIRTY_TEMP_COEFFICIENT(den); + + // Compute leader information. + std::vector leaders; + compute_leaders(leaders); + std::vector 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& dbm_0 = dbm[0]; + for (dimension_type i = 1; i <= space_dim; ++i) { + const dimension_type leader = leaders[i]; + if (i != leader) { + // Generate the constraint relating `i' and its leader. + if (leader == 0) { + // A unary equality has to be generated. + assert(!is_plus_infinity(dbm_0[i])); + numer_denom(dbm_0[i], num, den); + cs.insert(den*Variable(i-1) == num); + } + else { + // A binary equality has to be generated. + assert(!is_plus_infinity(dbm[i][leader])); + numer_denom(dbm[i][leader], num, den); + cs.insert(den*Variable(leader-1) - den*Variable(i-1) == num); + } + } + } + + // Go through the leaders to generate inequality constraints. + // First generate all the unary inequalities. + const 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], num, den); + cs.insert(den*Variable(i-1) <= num); + } + if (!redundancy_dbm[i][0]) { + numer_denom(dbm[i][0], num, den); + cs.insert(-den*Variable(i-1) <= num); + } + } + // Then generate all the binary inequalities. + for (dimension_type l_i = 1; l_i < num_leaders; ++l_i) { + const dimension_type i = leader_indices[l_i]; + const DB_Row& 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], num, den); + cs.insert(den*Variable(j-1) - den*Variable(i-1) <= num); + } + if (!redundancy_dbm[j][i]) { + numer_denom(dbm[j][i], num, den); + cs.insert(den*Variable(i-1) - den*Variable(j-1) <= num); + } + } + } + } + return cs; +} + +template +void +BD_Shape::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_generic("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& dbm_v = dbm[v_id]; + for (dimension_type i = old_dim + 1; i-- > 0; ) { + DB_Row& 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(); + assert(OK()); +} + +template +void +BD_Shape::fold_space_dimensions(const Variables_Set& to_be_folded, + Variable var) { + const dimension_type space_dim = space_dimension(); + // `var' should be one of the dimensions of the BDS. + if (var.space_dimension() > space_dim) + throw_dimension_incompatible("fold_space_dimensions(tbf, v)", + "v", var); + + // The folding of no dimensions is a no-op. + if (to_be_folded.empty()) + return; + + // All variables in `to_be_folded' should be dimensions of the BDS. + if (to_be_folded.space_dimension() > space_dim) + throw_dimension_incompatible("fold_space_dimensions(tbf, ...)", + to_be_folded.space_dimension()); + + // Moreover, `var.id()' should not occur in `to_be_folded'. + if (to_be_folded.find(var.id()) != to_be_folded.end()) + throw_generic("fold_space_dimensions(tbf, v)", + "v should not occur in tbf"); + + shortest_path_closure_assign(); + if (!marked_empty()) { + // Recompute the elements of the row and the column corresponding + // to variable `var' by taking the join of their value with the + // value of the corresponding elements in the row and column of the + // variable `to_be_folded'. + const dimension_type v_id = var.id() + 1; + DB_Row& dbm_v = dbm[v_id]; + for (Variables_Set::const_iterator i = to_be_folded.begin(), + tbf_end = to_be_folded.end(); i != tbf_end; ++i) { + const dimension_type tbf_id = *i + 1; + const DB_Row& dbm_tbf = dbm[tbf_id]; + for (dimension_type j = space_dim + 1; j-- > 0; ) { + max_assign(dbm[j][v_id], dbm[j][tbf_id]); + max_assign(dbm_v[j], dbm_tbf[j]); + } + } + } + remove_space_dimensions(to_be_folded); +} + +/*! \relates Parma_Polyhedra_Library::BD_Shape */ +template +std::ostream& +IO_Operators::operator<<(std::ostream& s, const BD_Shape& c) { + typedef typename BD_Shape::coefficient_type N; + if (c.is_universe()) + s << "true"; + else { + // We control empty bounded difference shape. + dimension_type n = c.space_dimension(); + if (c.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 = c.dbm[i][j]; + const N& c_j_i = c.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 an only 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 an only 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 +void +BD_Shape::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) + +template +bool +BD_Shape::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 +memory_size_type +BD_Shape::external_memory_in_bytes() const { + return dbm.external_memory_in_bytes() + + redundancy_dbm.external_memory_in_bytes(); +} + +template +bool +BD_Shape::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::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 +void +BD_Shape::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 +void +BD_Shape::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 +void +BD_Shape::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 +void +BD_Shape::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 +void +BD_Shape::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 +void +BD_Shape::throw_expression_too_complex(const char* method, + const Linear_Expression& e) { + using namespace IO_Operators; + std::ostringstream s; + s << "PPL::BD_Shape::" << method << ":" << std::endl + << e << " is too complex."; + throw std::invalid_argument(s.str()); +} + + +template +void +BD_Shape::throw_dimension_incompatible(const char* method, + const char* name_row, + const Linear_Expression& y) const { + std::ostringstream s; + s << "PPL::BD_Shape::" << method << ":" << std::endl + << "this->space_dimension() == " << space_dimension() + << ", " << name_row << "->space_dimension() == " + << y.space_dimension() << "."; + throw std::invalid_argument(s.str()); +} + +template +void +BD_Shape::throw_generic(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..b63bbf7 --- /dev/null +++ b/src/BD_Shape.types.hh @@ -0,0 +1,22 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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 +class BD_Shape; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_BD_Shape_types_hh) diff --git a/src/BHRZ03_Certificate.cc b/src/BHRZ03_Certificate.cc new file mode 100644 index 0000000..ec15d44 --- /dev/null +++ b/src/BHRZ03_Certificate.cc @@ -0,0 +1,332 @@ +/* BHRZ03_Certificate class implementation + (non-inline member functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "BHRZ03_Certificate.defs.hh" + +#include "Polyhedron.defs.hh" +#include +#include + +namespace PPL = Parma_Polyhedra_Library; + +PPL::BHRZ03_Certificate::BHRZ03_Certificate(const Polyhedron& ph) + : affine_dim(0), lin_space_dim(0), num_constraints(0), num_points(0), + num_rays_null_coord(ph.space_dimension(), 0) { + // TODO: provide a correct and reasonably efficient + // implementation for NNC polyhedra. + + // The computation of the certificate requires both the + // constraint and the generator systems in minimal form. + ph.minimize(); + // It is assumed that `ph' is not an empty polyhedron. + assert(!ph.marked_empty()); + + // The dimension of the polyhedron is obtained by subtracting + // the number of equalities from the space dimension. + // When counting constraints, for a correct reasoning, we have + // to disregard the low-level constraints (i.e., the positivity + // constraint and epsilon bounds). + const dimension_type space_dim = ph.space_dimension(); + affine_dim = space_dim; + assert(num_constraints == 0); + const Constraint_System& cs = ph.minimized_constraints(); + for (Constraint_System::const_iterator i = cs.begin(), + cs_end = cs.end(); i != cs_end; ++i) { + ++num_constraints; + if (i->is_equality()) + --affine_dim; + } + + assert(lin_space_dim == 0); + assert(num_points == 0); + const Generator_System& gs = ph.minimized_generators(); + for (Generator_System::const_iterator i = gs.begin(), + gs_end = gs.end(); i != gs_end; ++i) + switch (i->type()) { + case Generator::POINT: + // Intentionally fall through. + case Generator::CLOSURE_POINT: + ++num_points; + break; + case Generator::RAY: + // For each i such that 0 <= j < space_dim, + // `num_rays_null_coord[j]' will be the number of rays + // having exactly `j' coordinates equal to 0. + { + const Generator& r = *i; + dimension_type num_zeroes = 0; + for (dimension_type j = space_dim; j-- > 0; ) + if (r.coefficient(Variable(j)) == 0) + ++num_zeroes; + ++num_rays_null_coord[num_zeroes]; + } + break; + case Generator::LINE: + // Since the generator systems is minimized, the dimension of + // the lineality space is equal to the number of lines. + ++lin_space_dim; + break; + } + assert(OK()); + + // TODO: this is an inefficient workaround. + // For NNC polyhedra, constraints might be no longer up-to-date + // (and hence, neither minimized) due to the strong minimization + // process applied to generators when constructing the certificate. + // We have to reinforce the (normal) minimization of the constraint + // system. The future, lazy implementation of the strong minimization + // process will solve this problem. + if (!ph.is_necessarily_closed()) + ph.minimize(); +} + +int +PPL::BHRZ03_Certificate::compare(const BHRZ03_Certificate& y) const { + assert(OK() && y.OK()); + if (affine_dim != y.affine_dim) + return affine_dim > y.affine_dim ? 1 : -1; + if (lin_space_dim != y.lin_space_dim) + return lin_space_dim > y.lin_space_dim ? 1 : -1; + if (num_constraints != y.num_constraints) + return num_constraints > y.num_constraints ? 1 : -1; + if (num_points != y.num_points) + return num_points > y.num_points ? 1 : -1; + + const dimension_type space_dim = num_rays_null_coord.size(); + assert(num_rays_null_coord.size() == y.num_rays_null_coord.size()); + // Note: iterating upwards, because we have to check first + // the number of rays having more NON-zero coordinates. + for (dimension_type i = 0; i < space_dim; i++) + if (num_rays_null_coord[i] != y.num_rays_null_coord[i]) + return num_rays_null_coord[i] > y.num_rays_null_coord[i] ? 1 : -1; + // All components are equal. + return 0; +} + +int +PPL::BHRZ03_Certificate::compare(const Polyhedron& ph) const { + assert(ph.space_dimension() == num_rays_null_coord.size()); + + // TODO: provide a correct and reasonably efficient + // implementation for NNC polyhedra. + + // The computation of the certificate requires both the + // constraint and the generator systems in minimal form. + ph.minimize(); + // It is assumed that `ph' is a polyhedron containing the + // polyhedron described by `*this': hence, it cannot be empty. + assert(!ph.marked_empty()); + + // The dimension of the polyhedron is obtained by subtracting + // the number of equalities from the space dimension. + // When counting constraints, for a correct reasoning, we have + // to disregard the low-level constraints (i.e., the positivity + // constraint and epsilon bounds). + const dimension_type space_dim = ph.space_dimension(); + dimension_type ph_affine_dim = space_dim; + dimension_type ph_num_constraints = 0; + const Constraint_System& cs = ph.minimized_constraints(); + for (Constraint_System::const_iterator i = cs.begin(), + cs_end = cs.end(); i != cs_end; ++i) { + ++ph_num_constraints; + if (i->is_equality()) + --ph_affine_dim; + } + // TODO: this is an inefficient workaround. + // For NNC polyhedra, constraints might be no longer up-to-date + // (and hence, neither minimized) due to the strong minimization + // process applied to generators when constructing the certificate. + // We have to reinforce the (normal) minimization of the constraint + // system. The future, lazy implementation of the strong minimization + // process will solve this problem. + if (!ph.is_necessarily_closed()) + ph.minimize(); + + // If the dimension of `ph' is increasing, the chain is stabilizing. + if (ph_affine_dim > affine_dim) + return 1; + + // At this point the two polyhedra must have the same dimension. + assert(ph_affine_dim == affine_dim); + + // Speculative optimization: in order to better exploit the incrementality + // of the comparison, we do not compute information about rays here, + // hoping that the other components will be enough. + dimension_type ph_lin_space_dim = 0; + dimension_type ph_num_points = 0; + const Generator_System& gs = ph.minimized_generators(); + for (Generator_System::const_iterator i = gs.begin(), + gs_end = gs.end(); i != gs_end; ++i) + switch (i->type()) { + case Generator::POINT: + // Intentionally fall through. + case Generator::CLOSURE_POINT: + ++ph_num_points; + break; + case Generator::RAY: + break; + case Generator::LINE: + // Since the generator systems is minimized, the dimension of + // the lineality space is equal to the number of lines. + ++ph_lin_space_dim; + break; + } + // TODO: this is an inefficient workaround. + // For NNC polyhedra, constraints might be no longer up-to-date + // (and hence, neither minimized) due to the strong minimization + // process applied to generators when constructing the certificate. + // We have to reinforce the (normal) minimization of the constraint + // system. The future, lazy implementation of the strong minimization + // process will solve this problem. + if (!ph.is_necessarily_closed()) + ph.minimize(); + + // If the dimension of the lineality space is increasing, + // then the chain is stabilizing. + if (ph_lin_space_dim > lin_space_dim) + return 1; + + // At this point the lineality space of the two polyhedra must have + // the same dimension. + assert(ph_lin_space_dim == lin_space_dim); + + // If the number of constraints of `ph' is decreasing, then the chain + // is stabilizing. If it is increasing, the chain is not stabilizing. + // If they are equal, further investigation is needed. + if (ph_num_constraints != num_constraints) + return ph_num_constraints < num_constraints ? 1 : -1; + + // If the number of points of `ph' is decreasing, then the chain + // is stabilizing. If it is increasing, the chain is not stabilizing. + // If they are equal, further investigation is needed. + if (ph_num_points != num_points) + return ph_num_points < num_points ? 1 : -1; + + // The speculative optimization was not worth: + // compute information about rays. + std::vector ph_num_rays_null_coord(ph.space_dim, 0); + for (Generator_System::const_iterator i = gs.begin(), + gs_end = gs.end(); i != gs_end; ++i) + if (i->is_ray()) { + const Generator& r = *i; + dimension_type num_zeroes = 0; + for (dimension_type j = space_dim; j-- > 0; ) + if (r.coefficient(Variable(j)) == 0) + ++num_zeroes; + ++ph_num_rays_null_coord[num_zeroes]; + } + // Compare (lexicographically) the two vectors: + // if ph_num_rays_null_coord < num_rays_null_coord the chain is stabilizing. + for (dimension_type i = 0; i < space_dim; i++) + if (ph_num_rays_null_coord[i] != num_rays_null_coord[i]) + return ph_num_rays_null_coord[i] < num_rays_null_coord[i] ? 1 : -1; + + // All components are equal. + return 0; +} + +bool +PPL::BHRZ03_Certificate::OK() const { +#ifndef NDEBUG + using std::endl; + using std::cerr; +#endif + + // The dimension of the vector space. + const dimension_type space_dim = num_rays_null_coord.size(); + + if (affine_dim > space_dim) { +#ifndef NDEBUG + cerr << "In the BHRZ03 certificate about a non-empty polyhedron:" + << endl + << "the affine dimension is greater than the space dimension!" + << endl; +#endif + return false; + } + + if (lin_space_dim > affine_dim) { +#ifndef NDEBUG + cerr << "In the BHRZ03 certificate about a non-empty polyhedron:" + << endl + << "the lineality space dimension is greater than " + << "the affine dimension!" + << endl; +#endif + return false; + } + + if (num_constraints < space_dim - affine_dim) { +#ifndef NDEBUG + cerr << "In the BHRZ03 certificate about a non-empty polyhedron:" + << endl + << "in a vector space of dimension `n'," + << "any polyhedron of affine dimension `k'" << endl + << "should have `n-k' non-redundant constraints at least." + << endl + << "Here space_dim = " << space_dim << ", " + << "affine_dim = " << affine_dim << ", " + << "but num_constraints = " << num_constraints << "!" + << endl; +#endif + return false; + } + + if (num_points == 0) { +#ifndef NDEBUG + cerr << "In the BHRZ03 certificate about a non-empty polyhedron:" + << endl + << "the generator system has no points!" + << endl; +#endif + return false; + } + + if (lin_space_dim == space_dim) { + // This was a universe polyhedron. + if (num_constraints > 0) { +#ifndef NDEBUG + cerr << "In the BHRZ03 certificate about a non-empty polyhedron:" + << endl + << "a universe polyhedron has non-redundant constraints!" + << endl; +#endif + return false; + } + + if (num_points != 1) { +#ifndef NDEBUG + cerr << "In the BHRZ03 certificate about a non-empty polyhedron:" + << endl + << "a universe polyhedron has more than one non-redundant point!" + << endl; +#endif + return false; + } + } + + // All tests passed. + return true; +} diff --git a/src/BHRZ03_Certificate.defs.hh b/src/BHRZ03_Certificate.defs.hh new file mode 100644 index 0000000..7d7b3a7 --- /dev/null +++ b/src/BHRZ03_Certificate.defs.hh @@ -0,0 +1,117 @@ +/* BHRZ03_Certificate class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_BHRZ03_Certificate_defs_hh +#define PPL_BHRZ03_Certificate_defs_hh 1 + +#include "BHRZ03_Certificate.types.hh" +#include "Polyhedron.types.hh" +#include "globals.types.hh" +#include +#include + +//! 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 true 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 true 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 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..452ef9e --- /dev/null +++ b/src/BHRZ03_Certificate.inlines.hh @@ -0,0 +1,62 @@ +/* BHRZ03_Certificate class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_BHRZ03_Certificate_inlines_hh +#define PPL_BHRZ03_Certificate_inlines_hh 1 + +namespace Parma_Polyhedra_Library { + +inline +BHRZ03_Certificate::BHRZ03_Certificate() + : affine_dim(0), lin_space_dim(0), num_constraints(0), num_points(1), + num_rays_null_coord() { + // This is the certificate for a zero-dim universe polyhedron. + assert(OK()); +} + +inline +BHRZ03_Certificate::BHRZ03_Certificate(const BHRZ03_Certificate& y) + : affine_dim(y.affine_dim), lin_space_dim(y.lin_space_dim), + num_constraints(y.num_constraints), num_points(y.num_points), + num_rays_null_coord(y.num_rays_null_coord) { +} + +inline +BHRZ03_Certificate::~BHRZ03_Certificate() { +} + +inline bool +BHRZ03_Certificate::is_stabilizing(const Polyhedron& ph) const { + return compare(ph) == 1; +} + +inline bool +BHRZ03_Certificate::Compare::operator()(const BHRZ03_Certificate& x, + const BHRZ03_Certificate& y) const { + // For an efficient evaluation of the multiset ordering based + // on this lgo relation, we want larger elements to come first. + return x.compare(y) == 1; +} + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_BHRZ03_Certificate_inlines_hh) diff --git a/src/BHRZ03_Certificate.types.hh b/src/BHRZ03_Certificate.types.hh new file mode 100644 index 0000000..ea63ea4 --- /dev/null +++ b/src/BHRZ03_Certificate.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PPL_BHRZ03_Certificate_types_hh +#define PPL_BHRZ03_Certificate_types_hh 1 + +namespace Parma_Polyhedra_Library { + +class BHRZ03_Certificate; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_BHRZ03_Certificate_types_hh) diff --git a/src/BUGS.cc.dist b/src/BUGS.cc.dist new file mode 100644 index 0000000..129e104 --- /dev/null +++ b/src/BUGS.cc.dist @@ -0,0 +1,24 @@ +extern const char* const BUGS_array[] = { + "", + "The PPL developers encourage you to report any bugs you find to", + "ppl-devel@cs.unipr.it. Here `bug' should be interpreted in its", + "broadest sense: outright software errors, misfeatures, bad interfaces,", + "missing or unclear documentation... whatever is a subject for possible", + "improvement.", + "", + "As far as software bugs are concerned, the best reports are those that", + "are reproducible. Including (or pointing us to) code that exhibits", + "the reported misbehavior is the best thing you can do to help us fix", + "the library. Of course, this is not always possible and we will", + "welcome any kind of bug report. Anyway, you may be interested to read", + "http://www.chiark.greenend.org.uk/~sgtatham/bugs.html on how to report", + "bugs effectively.", + "", + "", + "KNOWN BUGS", + "==========", + "", + "All known bugs were resolved before the release. It is likely that", + "there are still bugs in the released version. Any bugs found after", + "the release will be listed at http://www.cs.unipr.it/ppl/Bugs/ .", + 0}; diff --git a/src/Bit_Matrix.cc b/src/Bit_Matrix.cc new file mode 100644 index 0000000..ac126c5 --- /dev/null +++ b/src/Bit_Matrix.cc @@ -0,0 +1,243 @@ +/* Bit_Matrix class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Bit_Matrix.defs.hh" +#include "globals.defs.hh" +#include +#include +#include + +#include "swapping_sort.icc" + +namespace PPL = Parma_Polyhedra_Library; + +PPL::Bit_Matrix& +PPL::Bit_Matrix::operator=(const Bit_Matrix& y){ + rows = y.rows; + row_size = y.row_size; + assert(OK()); + return *this; +} + +void +PPL::Bit_Matrix::sort_rows() { + typedef std::vector::iterator Iter; + // Sorting without removing duplicates. + Iter first = rows.begin(); + Iter last = rows.end(); + swapping_sort(first, last, Bit_Row_Less_Than()); + // Moving all the duplicate elements at the end of the vector. + Iter new_last = swapping_unique(first, last); + // Removing duplicates. + rows.erase(new_last, last); + assert(OK()); +} + +void +PPL::Bit_Matrix::add_row(const Bit_Row& row) { + const dimension_type new_rows_size = rows.size() + 1; + if (rows.capacity() < new_rows_size) { + // Reallocation will take place. + std::vector 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] = row; + // Steal the old rows. + while (i-- > 0) + new_rows[i].swap(rows[i]); + // Put the new rows into place. + std::swap(rows, new_rows); + } + else + // Reallocation will NOT take place: append a new empty row. + rows.push_back(row); + assert(OK()); +} + +void +PPL::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 != ULONG_MAX; j = x[i].prev(j)) + tmp[j].set(i); + swap(tmp); + assert(OK()); +} + +void +PPL::Bit_Matrix::transpose_assign(const Bit_Matrix& y) { + const dimension_type y_nrows = y.num_rows(); + const dimension_type y_ncols = y.num_columns(); + Bit_Matrix tmp(y_ncols, y_nrows); + for (dimension_type i = y_nrows; i-- > 0; ) + for (unsigned long j = y[i].last(); j != ULONG_MAX; j = y[i].prev(j)) + tmp[j].set(i); + swap(tmp); + assert(OK()); +} + +void +PPL::Bit_Matrix::resize(dimension_type new_n_rows, + dimension_type new_n_columns) { + assert(OK()); + const dimension_type old_num_rows = num_rows(); + if (new_n_columns < row_size) { + const dimension_type num_preserved_rows + = std::min(old_num_rows, new_n_rows); + 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 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].swap(rows[i]); + // Put the new vector into place. + std::swap(rows, new_rows); + } + else + // Reallocation will NOT take place. + rows.insert(rows.end(), new_n_rows - old_num_rows, Bit_Row()); + } + else if (new_n_rows < old_num_rows) + // Drop some rows. + rows.erase(rows.begin() + new_n_rows, rows.end()); + + assert(OK()); +} + +void +PPL::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) + x[i].set(j); + else + x[i].clear(j); + } + + // Check invariants. + assert(OK()); + return true; +} + +PPL::memory_size_type +PPL::Bit_Matrix::external_memory_in_bytes() const { + memory_size_type n = rows.capacity() * sizeof(Row); + for (dimension_type i = num_rows(); i-- > 0; ) + n += rows[i].external_memory_in_bytes(); + return n; +} + +bool +PPL::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-- > 1; ) { + const Bit_Row& row = x[i]; + if (!row.OK()) + return false; + else if (row.last() != ULONG_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..82f4b4f --- /dev/null +++ b/src/Bit_Matrix.defs.hh @@ -0,0 +1,179 @@ +/* Bit_Matrix class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Bit_Matrix_defs_hh +#define PPL_Bit_Matrix_defs_hh 1 + +#include "Bit_Matrix.types.hh" +#include "Linear_System.defs.hh" +#include "Bit_Row.defs.hh" +#include +#include + +#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 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 + true 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. + void add_row(const Bit_Row& row); + + //! Erases the rows from the \p first_to_erase -th to the last one. + void rows_erase_to_end(dimension_type first_to_erase); + + //! Erases the columns from the \p first_to_erase -th to the last one. + void columns_erase_to_end(dimension_type first_to_erase); + + //! Resizes the matrix copying the old contents. + void resize(dimension_type new_n_rows, dimension_type new_n_columns); + + //! Checks if all the invariants are satisfied. + bool OK() const; + + PPL_OUTPUT_DECLARATIONS + + /*! \brief + Loads from \p s an ASCII representation (as produced by + ascii_dump(std::ostream&) const) and sets \p *this accordingly. + Returns true if successful, false 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 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; + }; + + friend + void Parma_Polyhedra_Library:: + Linear_System::sort_and_remove_with_sat(Bit_Matrix& sat); + +}; + +namespace Parma_Polyhedra_Library { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns true 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 true 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 + +namespace std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Bit_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +void swap(Parma_Polyhedra_Library::Bit_Matrix& x, + Parma_Polyhedra_Library::Bit_Matrix& y); + +} // namespace std + +#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..0b793af --- /dev/null +++ b/src/Bit_Matrix.inlines.hh @@ -0,0 +1,151 @@ +/* Bit_Matrix class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Bit_Matrix_inlines_hh +#define PPL_Bit_Matrix_inlines_hh 1 + +#include +#include + +namespace Parma_Polyhedra_Library { + +inline +Bit_Matrix::Bit_Matrix() + : rows(), + row_size(0) { +} + +inline dimension_type +Bit_Matrix::max_num_rows() { + return std::vector().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::rows_erase_to_end(const dimension_type first_to_erase) { + // The first row to be erased cannot be greater + // than the actual number of the rows of the matrix. + assert(first_to_erase <= rows.size()); + if (first_to_erase < rows.size()) + rows.erase(rows.begin() + first_to_erase, rows.end()); + assert(OK()); +} + +inline void +Bit_Matrix::columns_erase_to_end(const dimension_type first_to_erase) { + // The first column to be erased cannot be greater + // than the actual number of the columns of the matrix. + assert(first_to_erase <= row_size); + row_size = first_to_erase; + assert(OK()); +} + +inline void +Bit_Matrix::swap(Bit_Matrix& y) { + std::swap(row_size, y.row_size); + std::swap(rows, y.rows); +} + +inline Bit_Row& +Bit_Matrix::operator[](const dimension_type k) { + assert(k < rows.size()); + return rows[k]; +} + +inline const Bit_Row& +Bit_Matrix::operator[](const dimension_type k) const { + 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().swap(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 { + 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); +} + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Bit_Matrix */ +inline void +swap(Parma_Polyhedra_Library::Bit_Matrix& x, + Parma_Polyhedra_Library::Bit_Matrix& y) { + x.swap(y); +} + +} // namespace std + +#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..938cc50 --- /dev/null +++ b/src/Bit_Matrix.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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..32a3ff0 --- /dev/null +++ b/src/Bit_Row.cc @@ -0,0 +1,360 @@ +/* Bit_Row class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Bit_Row.defs.hh" +#include +#include + +namespace PPL = Parma_Polyhedra_Library; + +#define PPL_BITS_PER_GMP_LIMB (PPL_SIZEOF_MP_LIMB_T*CHAR_BIT) + +#if !PPL_HAVE_DECL_FFS || PPL_SIZEOF_MP_LIMB_T != PPL_SIZEOF_INT +unsigned int +PPL::Bit_Row::first_one(mp_limb_t w) { + unsigned int r = 0; + w = w & -w; +#if PPL_SIZEOF_MP_LIMB_T == 8 + if ((w & 0xffffffff) == 0) { + w >>= 32; + r += 32; + } +#elif PPL_SIZEOF_MP_LIMB_T != 4 +#error "Size of mp_limb_t not supported by Bit_Row::first_one(mp_limb_t w)." +#endif + if ((w & 0xffff) == 0) { + w >>= 16; + r += 16; + } + if ((w & 0xff) == 0) { + w >>= 8; + r += 8; + } + if (w & 0xf0) + r += 4; + if (w & 0xcc) + r += 2; + if (w & 0xaa) + r += 1; + return r; +} +#endif // !PPL_HAVE_DECL_FFS || PPL_SIZEOF_MP_LIMB_T != PPL_SIZEOF_INT + +unsigned int +PPL::Bit_Row::last_one(mp_limb_t w) { + unsigned int r = 0; +#if PPL_SIZEOF_MP_LIMB_T == 8 + if (w & +#if PPL_SIZEOF_LONG == 8 + 0xffffffff00000000 +#else + 0xffffffff00000000LL +#endif + ) { + w >>= 32; + r += 32; + } +#elif PPL_SIZEOF_MP_LIMB_T != 4 +#error "Size of mp_limb_t not supported by Bit_Row::last_one(mp_limb_t w)." +#endif + if (w & 0xffff0000) { + w >>= 16; + r += 16; + } + if (w & 0xff00) { + w >>= 8; + r += 8; + } + if (w & 0xf0) { + w >>= 4; + r += 4; + } + if (w & 0xc) { + w >>= 2; + r += 2; + } + if (w & 0x2) + r += 1; + return r; +} + +unsigned long +PPL::Bit_Row::first() const { + const mp_size_t vec_size = vec->_mp_size; + assert(vec_size >= 0); + mp_size_t li = 0; + mp_srcptr p = vec->_mp_d; + for (; li < vec_size; ++li, ++p) { + const mp_limb_t limb = *p; + if (limb != 0) + return li*PPL_BITS_PER_GMP_LIMB + first_one(limb); + } + return ULONG_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. + // + // unsigned long r = mpz_scan1(vec, position); + // return (r == ULONG_MAX) ? -1 : r; + + mp_size_t li = position / PPL_BITS_PER_GMP_LIMB; + const mp_size_t vec_size = vec->_mp_size; + assert(vec_size >= 0); + if (li >= vec_size) + return ULONG_MAX; + + // Get the first limb. + mp_srcptr p = vec->_mp_d + li; + + // Mask off any bits before `position' in the first limb. + mp_limb_t limb = *p & (~(mp_limb_t) 0) << (position % PPL_BITS_PER_GMP_LIMB); + + while (true) { + if (limb != 0) + return li*PPL_BITS_PER_GMP_LIMB + first_one(limb); + ++li; + if (li == vec_size) + break; + ++p; + limb = *p; + } + return ULONG_MAX; +} + +unsigned long +PPL::Bit_Row::last() const { + mp_size_t li = vec->_mp_size; + assert(li >= 0); + if (li == 0) + return ULONG_MAX; + --li; + const mp_srcptr p = vec->_mp_d + li; + const mp_limb_t limb = *p; + assert(limb != 0); + return li*PPL_BITS_PER_GMP_LIMB + last_one(limb); +} + +unsigned long +PPL::Bit_Row::prev(unsigned long position) const { + if (position == 0) + return ULONG_MAX; + + --position; + + const mp_size_t vec_size = vec->_mp_size; + assert(vec_size > 0); + mp_size_t li = position / PPL_BITS_PER_GMP_LIMB; + + mp_limb_t limb; + mp_srcptr p = vec->_mp_d; + + // Get the first limb. + if (li >= vec_size) { + li = vec_size - 1; + p += li; + limb = *p; + } + else { + const mp_limb_t mask + = (~(mp_limb_t) 0) + >> (PPL_BITS_PER_GMP_LIMB - 1 - position % PPL_BITS_PER_GMP_LIMB); + p += li; + limb = *p & mask; + } + + while (true) { + if (limb != 0) + return li*PPL_BITS_PER_GMP_LIMB + last_one(limb); + if (li == 0) + break; + --li; + --p; + limb = *p; + } + return ULONG_MAX; +} + +bool +PPL::Bit_Row::operator[](const unsigned long k) const { + const mp_size_t vec_size = vec->_mp_size; + assert(vec_size >= 0); + + unsigned long i = k / GMP_NUMB_BITS; + if (i >= static_cast(vec_size)) + return false; + + mp_limb_t limb = *(vec->_mp_d + i); + return (limb >> (k % GMP_NUMB_BITS)) & 1; +} + +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; + assert(x_size >= 0); + const mp_size_t y_size = y.vec->_mp_size; + assert(y_size >= 0); + mp_size_t size = (x_size > y_size ? y_size : x_size); + mp_srcptr xp = x.vec->_mp_d; + mp_srcptr yp = y.vec->_mp_d; + while (size > 0) { + const mp_limb_t xl = *xp; + const mp_limb_t yl = *yp; + if (xl != yl) { + // Get the 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) ? 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; + assert(x_size >= 0); + mp_size_t y_size = y.vec->_mp_size; + assert(y_size >= 0); + if (x_size > y_size) + return false; + mp_srcptr xp = x.vec->_mp_d; + mp_srcptr yp = y.vec->_mp_d; + while (x_size > 0) { + if (*xp & ~*yp) + return false; + ++xp; + ++yp; + --x_size; + } + return true; +} + +/*! \relates Parma_Polyhedra_Library::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; + assert(x_size >= 0); + mp_size_t y_size = y.vec->_mp_size; + assert(y_size >= 0); + if (x_size > y_size) + return false; + strict_subset = (x_size < y_size); + mp_srcptr xp = x.vec->_mp_d; + mp_srcptr yp = y.vec->_mp_d; + while (x_size > 0) { + const mp_limb_t xl = *xp; + const mp_limb_t yl = *yp; + if (xl & ~yl) + return false; + if (!strict_subset && xl != yl) + strict_subset = true; + ++xp; + ++yp; + --x_size; + } + return true; +} + +/*! \relates Parma_Polyhedra_Library::Bit_Row */ +bool +PPL::strict_subset(const Bit_Row& x, const Bit_Row& y) { + mp_size_t x_size = x.vec->_mp_size; + assert(x_size >= 0); + mp_size_t y_size = y.vec->_mp_size; + assert(y_size >= 0); + if (x_size > y_size) + return false; + bool different = (x_size < y_size); + mp_srcptr xp = x.vec->_mp_d; + mp_srcptr yp = y.vec->_mp_d; + while (x_size > 0) { + const mp_limb_t xl = *xp; + const mp_limb_t yl = *yp; + if (xl & ~yl) + return false; + if (!different && xl != yl) + different = true; + ++xp; + ++yp; + --x_size; + } + return different; +} + +/*! \relates Bit_Row */ +bool +PPL::operator==(const Bit_Row& x, const Bit_Row& y) { + const mp_size_t x_vec_size = x.vec->_mp_size; + assert(x_vec_size >= 0); + const mp_size_t y_vec_size = y.vec->_mp_size; + assert(y_vec_size >= 0); + + if (x_vec_size != y_vec_size) + return false; + + return mpn_cmp(x.vec->_mp_d, y.vec->_mp_d, x_vec_size) == 0; +} + +/*! \relates Bit_Row */ +bool +PPL::operator!=(const Bit_Row& x, const Bit_Row& y) { + const mp_size_t x_vec_size = x.vec->_mp_size; + assert(x_vec_size >= 0); + const mp_size_t y_vec_size = y.vec->_mp_size; + assert(y_vec_size >= 0); + + if (x_vec_size != y_vec_size) + return true; + + return mpn_cmp(x.vec->_mp_d, y.vec->_mp_d, x_vec_size) != 0; +} + +bool +PPL::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); +} diff --git a/src/Bit_Row.defs.hh b/src/Bit_Row.defs.hh new file mode 100644 index 0000000..613046e --- /dev/null +++ b/src/Bit_Row.defs.hh @@ -0,0 +1,222 @@ +/* Bit_Row class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Bit_Row_defs_hh +#define PPL_Bit_Row_defs_hh 1 + +#include "Bit_Row.types.hh" +#include "globals.types.hh" +#include +#include +#include + +namespace Parma_Polyhedra_Library { + +// Put them in the namespace here to declare them friends later. + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns true 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 true 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); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Set-theoretic union. +/*! \relates Bit_Row */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +void set_union(const Bit_Row& x, const Bit_Row& y, Bit_Row& z); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Set-theoretic intersection. +/*! \relates Bit_Row */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +void set_intersection(const Bit_Row& x, const Bit_Row& y, Bit_Row& z); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Set-theoretic difference. +/*! \relates Bit_Row */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +void set_difference(const Bit_Row& x, const Bit_Row& y, Bit_Row& z); + +} // 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); + + //! Destructor. + ~Bit_Row(); + + //! Assignment operator. + Bit_Row& operator=(const Bit_Row& y); + + //! Swaps \p *this with \p y. + void 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(); + + 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); + friend void set_union(const Bit_Row& x, const Bit_Row& y, Bit_Row& z); + friend void set_intersection(const Bit_Row& x, const Bit_Row& y, Bit_Row& z); + friend void set_difference(const Bit_Row& x, const Bit_Row& y, Bit_Row& z); + + //! Returns the index of the first set bit or ULONG_MAX if no bit is set. + unsigned long first() const; + + /*! \brief + Returns the index of the first set bit after \p position + or ULONG_MAX if no bit after \p position is set. + */ + unsigned long next(unsigned long position) const; + + //! Returns the index of the last set bit or ULONG_MAX if no bit is set. + unsigned long last() const; + + /*! \brief + Returns the index of the first set bit before \p position + or ULONG_MAX if no bits before \p position is set. + */ + unsigned long prev(unsigned long position) const; + + //! Returns the number of set bits in the row. + unsigned long count_ones() const; + + //! Returns true if no bit is set in the row. + bool empty() const; + + //! Returns the total size in bytes of the memory occupied by \p *this. + memory_size_type total_memory_in_bytes() const; + + //! Returns the size in bytes of the memory managed by \p *this. + memory_size_type external_memory_in_bytes() const; + + //! Checks if all the invariants are satisfied + bool OK() const; + +private: + //! Bit-vector representing the row. + mpz_t vec; + + //! Assuming \p w is nonzero, returns the index of the first set bit in \p w. + static unsigned int first_one(mp_limb_t w); + + //! Assuming \p w is nonzero, returns the index of the last set bit in \p w. + static unsigned int last_one(mp_limb_t w); +}; + +namespace std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Bit_Row */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +void swap(Parma_Polyhedra_Library::Bit_Row& x, + Parma_Polyhedra_Library::Bit_Row& y); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specializes std::iter_swap. +/*! \relates Parma_Polyhedra_Library::Bit_Row */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +void +iter_swap(std::vector::iterator x, + std::vector::iterator y); + +} // namespace std + +#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..6fc36f7 --- /dev/null +++ b/src/Bit_Row.inlines.hh @@ -0,0 +1,155 @@ +/* Bit_Row class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Bit_Row_inlines_hh +#define PPL_Bit_Row_inlines_hh 1 + +#include "globals.defs.hh" +#include + +// For the declaration of ffs(3). +#if defined(PPL_HAVE_STRINGS_H) +# include +#elif defined(PPL_HAVE_STRING_H) +# include +#endif + +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() { + 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 { + assert(vec->_mp_size >= 0); + return vec->_mp_size == 0 ? 0 : mpn_popcount(vec->_mp_d, vec->_mp_size); +} + +inline bool +Bit_Row::empty() const { + return mpz_sgn(vec) == 0; +} + +inline void +Bit_Row::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 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(); +} + +#if PPL_HAVE_DECL_FFS && PPL_SIZEOF_MP_LIMB_T == PPL_SIZEOF_INT + +inline unsigned int +Bit_Row::first_one(mp_limb_t w) { + return ffs(w)-1; +} + +#endif + +/*! \relates Bit_Row */ +inline void +set_union(const Bit_Row& x, const Bit_Row& y, Bit_Row& z) { + mpz_ior(z.vec, x.vec, y.vec); +} + +/*! \relates Bit_Row */ +inline void +set_intersection(const Bit_Row& x, const Bit_Row& y, Bit_Row& z) { + mpz_and(z.vec, x.vec, y.vec); +} + +/*! \relates Bit_Row */ +inline void +set_difference(const Bit_Row& x, const Bit_Row& y, Bit_Row& z) { + PPL_DIRTY_TEMP0(mpz_class, complement_y); + mpz_com(complement_y.get_mpz_t(), y.vec); + mpz_and(z.vec, x.vec, complement_y.get_mpz_t()); +} + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Bit_Row */ +inline void +swap(Parma_Polyhedra_Library::Bit_Row& x, + Parma_Polyhedra_Library::Bit_Row& y) { + x.swap(y); +} + +/*! \relates Parma_Polyhedra_Library::Bit_Row */ +inline void +iter_swap(std::vector::iterator x, + std::vector::iterator y) { + swap(*x, *y); +} + +} // namespace std + +#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..bc70392 --- /dev/null +++ b/src/Bit_Row.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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..d86c50e --- /dev/null +++ b/src/Boundary.defs.hh @@ -0,0 +1,746 @@ +/* Interval boundary functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Boundary_defs_hh +#define PPL_Boundary_defs_hh 1 + +#include "Checked_Number.defs.hh" + +namespace Parma_Polyhedra_Library { + +namespace Boundary_NS { + +struct Unbounded { + Unbounded() { + } +}; + +const Unbounded UNBOUNDED; + +struct Property { + enum Type { + SPECIAL_, + OPEN_, + NORMALIZED_ + }; + 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_); +static const Property NORMALIZED(Property::NORMALIZED_); + +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(t | ROUND_FPU_CHECK_INEXACT); + else + return static_cast(t); +} + +template +inline Result +special_set_boundary_infinity(Boundary_Type type, T&, Info& info) { + assert(Info::store_special); + info.set_boundary_property(type, SPECIAL); + return V_EQ; +} + +template +inline bool +special_is_boundary_infinity(Boundary_Type, const T&, const Info&) { + return true; +} + +template +inline bool +special_is_open(Boundary_Type, const T&, const Info&) { + return !Info::may_contain_infinity; +} + +template +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 +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 +inline Result +set_unbounded(Boundary_Type type, T& x, Info& info) { + PPL_COMPILE_TIME_CHECK(Info::store_special + || std::numeric_limits::is_bounded + || std::numeric_limits::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 (r == V_EQ && !Info::may_contain_infinity) + info.set_boundary_property(type, OPEN); + return r; +} + +template +inline Result +set_minus_infinity(Boundary_Type type, T& x, Info& info, bool open = false) { + /* + PPL_COMPILE_TIME_CHECK(Info::store_special + || std::numeric_limits::has_infinity, + "minus infinity is not representable"); + */ + if (open) + assert(type == LOWER); + else + assert(Info::may_contain_infinity); + Result r; + if (Info::store_special) { + assert(type == LOWER); + r = special_set_boundary_infinity(type, x, info); + } + else + r = assign_r(x, MINUS_INFINITY, round_dir_check(type)); + assert(r != VC_MINUS_INFINITY); + if (open || r != V_EQ) + info.set_boundary_property(type, OPEN); + return r; +} + +template +inline Result +set_plus_infinity(Boundary_Type type, T& x, Info& info, bool open = false) { + /* + PPL_COMPILE_TIME_CHECK(Info::store_special + || std::numeric_limits::has_infinity, + "minus infinity is not representable"); + */ + if (open) + assert(type == UPPER); + else + assert(Info::may_contain_infinity); + Result r; + if (Info::store_special) { + assert(type == UPPER); + r = special_set_boundary_infinity(type, x, info); + } + else + r = assign_r(x, PLUS_INFINITY, round_dir_check(type)); + assert(r != VC_MINUS_INFINITY); + if (open || r != V_EQ) + info.set_boundary_property(type, OPEN); + return r; +} + +template +inline Result +set_boundary_infinity(Boundary_Type type, T& x, Info& info, bool open = false) { + 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)); + assert(r == V_EQ); + if (open) + info.set_boundary_property(type, OPEN); + return r; +} + +template +inline Result +shrink(Boundary_Type type, T& x, Info& info, bool check) { + Result r; + assert(!info.get_boundary_property(type, SPECIAL)); + if (type == LOWER) { + r = info.restrict(round_dir_check(type, check), x, V_GT); + if (r != V_GT) + return r; + } else { + r = info.restrict(round_dir_check(type, check), x, V_LT); + if (r != V_LT) + return r; + } + info.set_boundary_property(type, OPEN); + return r; +} + +template +inline bool +is_unbounded(Boundary_Type type, const T& x, const Info& info) { + if (Info::store_special) + return info.get_boundary_property(type, SPECIAL) + && special_is_boundary_infinity(type, x, info); + else if (std::numeric_limits::has_infinity) { + if (type == LOWER) + return Parma_Polyhedra_Library::is_minus_infinity(x); + else + return Parma_Polyhedra_Library::is_plus_infinity(x); + } + else if (std::numeric_limits::is_bounded) { + if (type == LOWER) + return x == std::numeric_limits::min(); + else + return x == std::numeric_limits::max(); + } else + return false; +} + +template +inline bool +normal_is_boundary_infinity(Boundary_Type type, const T& x, const Info&) { + if (type == LOWER) + return Parma_Polyhedra_Library::is_minus_infinity(x); + else + return Parma_Polyhedra_Library::is_plus_infinity(x); +} + +template +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 +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) + && special_is_boundary_infinity(type, x, info); + else + return normal_is_boundary_infinity(type, x, info); + } + else + return !Info::store_special && normal_is_reverse_infinity(type, x, info); +} + +template +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) + && special_is_boundary_infinity(type, x, info); + else + return normal_is_boundary_infinity(type, x, info); + } + else + return !Info::store_special && normal_is_reverse_infinity(type, x, info); +} + +template +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) + && special_is_boundary_infinity(type, x, info); + else + return normal_is_boundary_infinity(type, x, info); +} + +template +inline bool +is_reverse_infinity(Boundary_Type type, const T& x, const Info& info) { + return !Info::store_special + && normal_is_reverse_infinity(type, x, info); +} + +template +inline int +is_infinity(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 +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 +inline bool +boundary_infinity_is_open(Boundary_Type type, const Info& info) { + return !Info::may_contain_infinity || + info.get_boundary_property(type, OPEN); +} + +template +inline int +sgn_b(Boundary_Type type, const T& x, const Info& info) { + if (info.get_boundary_property(type, SPECIAL) && + special_is_boundary_infinity(type, x, info)) + 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 +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 +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 +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 +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 +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 +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 +inline Result +adjust_boundary(Boundary_Type type, T& x, Info& info, + bool open, Result r) { + if (type == LOWER) { + switch (r) { + case V_NEG_OVERFLOW: + open = true; + /* Fall through */ + case VC_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) + shrink(type, x, info, false); + // FIXME: what to return? + return r; + default: + assert(false); + return VC_NAN; + } + } + else { + switch (r) { + case V_POS_OVERFLOW: + open = true; + /* Fall through */ + case VC_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) + shrink(type, x, info, false); + // FIXME: what to return? + return r; + default: + assert(false); + return VC_NAN; + } + } +} + +template +inline Result +complement(Boundary_Type to_type, To& to, To_Info& to_info, + Boundary_Type type, const T& x, const Info& info) { + assert(to_type != type); + bool shrink; + if (info.get_boundary_property(type, SPECIAL) + && special_is_boundary_infinity(type, x, info)) { + shrink = !special_is_open(type, x, info); + if (type == LOWER) + return set_minus_infinity(to_type, to, to_info, shrink); + else + return set_plus_infinity(to_type, to, to_info, shrink); + } + shrink = !normal_is_open(type, x, info); + bool check = (To_Info::check_inexact + || (!shrink && (To_Info::store_open || to_info.has_restriction()))); + Result r = assign_r(to, x, round_dir_check(to_type, check)); + return adjust_boundary(to_type, to, to_info, shrink, r); +} + +template +inline Result +assign(Boundary_Type to_type, To& to, To_Info& to_info, + Boundary_Type type, const T& x, const Info& info, + bool shrink = false) { + assert(to_type == type); + if (info.get_boundary_property(type, SPECIAL) + && special_is_boundary_infinity(type, x, info)) { + shrink = shrink || special_is_open(type, x, info); + return set_boundary_infinity(to_type, to, to_info, shrink); + } + shrink = shrink || normal_is_open(type, x, info); + bool check = (To_Info::check_inexact + || (!shrink && (To_Info::store_open || to_info.has_restriction()))); + Result r = assign_r(to, x, round_dir_check(to_type, check)); + return adjust_boundary(to_type, to, to_info, shrink, r); +} + +template +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 +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 +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 +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 +inline Result +neg_assign(Boundary_Type to_type, To& to, To_Info& to_info, + Boundary_Type type, const T& x, const Info& info) { + assert(to_type != type); + bool shrink; + if (info.get_boundary_property(type, SPECIAL) + && special_is_boundary_infinity(type, x, info)) { + shrink = special_is_open(type, x, info); + return set_boundary_infinity(to_type, to, to_info, shrink); + } + shrink = normal_is_open(type, x, info); + bool check = (To_Info::check_inexact + || (!shrink && (To_Info::store_open || to_info.has_restriction()))); + Result r = neg_assign_r(to, x, round_dir_check(to_type, check)); + return adjust_boundary(to_type, to, to_info, shrink, r); +} + +template +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) { + assert(type1 == type2); + bool shrink; + if (is_boundary_infinity(type1, x1, info1)) { + shrink = boundary_infinity_is_open(type1, info1) && + !is_boundary_infinity_closed(type2, x2, info2); + return set_boundary_infinity(to_type, to, to_info, shrink); + } + else if (is_boundary_infinity(type2, x2, info2)) { + shrink = boundary_infinity_is_open(type2, info2) && + !is_boundary_infinity_closed(type1, x1, info1); + return set_boundary_infinity(to_type, to, to_info, shrink); + } + shrink = normal_is_open(type1, x1, info1) + || normal_is_open(type2, x2, info2); + bool check = (To_Info::check_inexact + || (!shrink && (To_Info::store_open + || to_info.has_restriction()))); + // 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, shrink, r); +} + +template +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) { + assert(type1 != type2); + bool shrink; + if (is_boundary_infinity(type1, x1, info1)) { + shrink = boundary_infinity_is_open(type1, info1) && + !is_boundary_infinity_closed(type2, x2, info2); + return set_boundary_infinity(to_type, to, to_info, shrink); + } + else if (is_boundary_infinity(type2, x2, info2)) { + shrink = boundary_infinity_is_open(type2, info2) && + !is_boundary_infinity_closed(type1, x1, info1); + return set_boundary_infinity(to_type, to, to_info, shrink); + } + shrink = normal_is_open(type1, x1, info1) + || normal_is_open(type2, x2, info2); + bool check = (To_Info::check_inexact + || (!shrink && (To_Info::store_open + || to_info.has_restriction()))); + // 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, shrink, r); +} + +template +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 shrink; + if (is_boundary_infinity(type1, x1, info1)) { + shrink = boundary_infinity_is_open(type1, info1) && + !is_boundary_infinity_closed(type2, x2, info2); + return set_boundary_infinity(to_type, to, to_info, shrink); + } + else if (is_boundary_infinity(type2, x2, info2)) { + shrink = boundary_infinity_is_open(type2, info2) && + !is_boundary_infinity_closed(type1, x1, info1); + return set_boundary_infinity(to_type, to, to_info, shrink); + } + shrink = normal_is_open(type1, x1, info1) + || normal_is_open(type2, x2, info2); + bool check = (To_Info::check_inexact + || (!shrink && (To_Info::store_open + || to_info.has_restriction()))); + 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, shrink, r); +} + +template +inline Result +set_zero(Boundary_Type to_type, To& to, To_Info& to_info, bool shrink) { + bool check = (To_Info::check_inexact + || (!shrink && (To_Info::store_open || to_info.has_restriction()))); + Result r = assign_r(to, Constant<0>::value, round_dir_check(to_type, check)); + return adjust_boundary(to_type, to, to_info, shrink, r); +} + +template +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 shrink; + if (x1s != 0) { + if (x2s != 0) + return mul_assign(to_type, to, to_info, + type1, x1, info1, + type2, x2, info2); + else + shrink = info2.get_boundary_property(type2, OPEN); + } + else { + shrink = info1.get_boundary_property(type1, OPEN) + && (x2s != 0 || info2.get_boundary_property(type2, OPEN)); + } + return set_zero(to_type, to, to_info, shrink); +} + +template +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 shrink; + if (is_boundary_infinity(type1, x1, info1)) { + shrink = boundary_infinity_is_open(type1, info1); + return set_boundary_infinity(to_type, to, to_info, shrink); + } + else if (is_boundary_infinity(type2, x2, info2)) { + shrink = boundary_infinity_is_open(type2, info2); + return set_zero(to_type, to, to_info, shrink); + } + shrink = normal_is_open(type1, x1, info1) + || normal_is_open(type2, x2, info2); + bool check = (To_Info::check_inexact + || (!shrink && (To_Info::store_open + || to_info.has_restriction()))); + 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, shrink, r); +} + + +template +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) { + bool shrink; + if (x1s != 0) { + if (x2s != 0) + return div_assign(to_type, to, to_info, + type1, x1, info1, + type2, x2, info2); + else { + // FIXME: restrictions + return set_boundary_infinity(to_type, to, to_info, true); + } + } + else { + shrink = info1.get_boundary_property(type1, OPEN) + && !is_boundary_infinity_closed(type2, x2, info2); + return set_zero(to_type, to, to_info, shrink); + } +} + +} // 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..0ce8006 --- /dev/null +++ b/src/Box.cc @@ -0,0 +1,76 @@ +/* Box class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include +#include "Box.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::extract_interval_constraint(const Constraint& c, + const dimension_type c_space_dim, + dimension_type& c_num_vars, + dimension_type& c_only_var) { + // Check for preconditions. + assert(c.space_dimension() == c_space_dim); + assert(c_num_vars == 0 && c_only_var == 0); + // Collect the non-zero components of `c'. + for (dimension_type i = c_space_dim; i-- > 0; ) + if (c.coefficient(Variable(i)) != 0) { + if (c_num_vars == 0) { + c_only_var = i; + ++c_num_vars; + } + else + // Constraint `c' is not an interval constraint. + return false; + } + return true; +} + +bool +PPL::extract_interval_congruence(const Congruence& cg, + const dimension_type cg_space_dim, + dimension_type& cg_num_vars, + dimension_type& cg_only_var) { + // Check for preconditions. + assert(cg.space_dimension() == cg_space_dim); + assert(cg_num_vars == 0 && cg_only_var == 0); + // Only equality congruences can be intervals. + assert(cg.is_equality()); + + // Collect the non-zero components of `cg'. + for (dimension_type i = cg_space_dim; i-- > 0; ) + if (cg.coefficient(Variable(i)) != 0) { + if (cg_num_vars == 0) { + cg_only_var = i; + ++cg_num_vars; + } + else + // Congruence `cg' is not an interval congruence. + return false; + } + return true; +} diff --git a/src/Box.defs.hh b/src/Box.defs.hh new file mode 100644 index 0000000..d29f38e --- /dev/null +++ b/src/Box.defs.hh @@ -0,0 +1,2059 @@ +/* Box class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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 +#include + +namespace Parma_Polyhedra_Library { + +//! Returns true 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 false is returned. +*/ +template +bool operator==(const Box& x, const Box& y); + +//! Returns true if and only if \p x and \p y aren't the same box. +/*! \relates Box + Note that \p x and \p y may be dimension-incompatible boxes: + in this case, the value true is returned. +*/ +template +bool operator!=(const Box& x, const Box& y); + +namespace IO_Operators { + +//! Output operator. +/*! \relates Parma_Polyhedra_Library::Box */ +template +std::ostream& operator<<(std::ostream& s, const Box& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool +rectilinear_distance_assign(Checked_Number& r, + const Box& x, + const Box& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool +rectilinear_distance_assign(Checked_Number& r, + const Box& x, + const Box& 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 true; + returns false 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 +bool +rectilinear_distance_assign(Checked_Number& r, + const Box& x, + const Box& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool +euclidean_distance_assign(Checked_Number& r, + const Box& x, + const Box& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool +euclidean_distance_assign(Checked_Number& r, + const Box& x, + const Box& 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 true; + returns false 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 +bool +euclidean_distance_assign(Checked_Number& r, + const Box& x, + const Box& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool +l_infinity_distance_assign(Checked_Number& r, + const Box& x, + const Box& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool +l_infinity_distance_assign(Checked_Number& r, + const Box& x, + const Box& 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 true; + returns false 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 +bool +l_infinity_distance_assign(Checked_Number& r, + const Box& x, + const Box& 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 +bool +l_m_distance_assign(Checked_Number& r, + const Box& x, const Box& 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 interval constraint (resp., interval congruence) + is a syntactic constraint (resp., congruence) that only mentions + a single space dimension. + + The Box domain optimally supports: + - 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 +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 + explicit Box(const Box& 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 + explicit Box(const BD_Shape& 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 + explicit Box(const Octagonal_Shape& 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& ph, + 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 + explicit Box(const Partially_Reduced_Product& 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 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 true if and only if \p *this is an empty box. + bool is_empty() const; + + //! Returns true if and only if \p *this is a universe box. + bool is_universe() const; + + /*! \brief + Returns true if and only if \p *this + is a topologically closed subset of the vector space. + */ + bool is_topologically_closed() const; + + //! Returns true if and only if \p *this is discrete. + bool is_discrete() const; + + //! Returns true if and only if \p *this is a bounded box. + bool is_bounded() const; + + /*! \brief + Returns true if and only if \p *this + contains at least one integer point. + */ + bool contains_integer_point() const; + + /*! \brief + Returns true 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 true 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 true 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 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 + true 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, + false 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 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 + 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 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, + false 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 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 + true 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, + false 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 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 + 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 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, + false 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 true 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&) const; + + /*! \brief + Returns true 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&) const; + + /*! \brief + Returns true 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 true 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. + + \exception std::invalid_argument + Thrown if \p *this and \p cs are dimension-incompatible. + */ + 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 propagagion on \p *this. + + \param cs + The constraints to be used for constraint propagation. + + \exception std::invalid_argument + Thrown if \p *this and \p cs are dimension-incompatible. + */ + void propagate_constraints(const 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 to_be_unconstrained, + assigning the result to \p *this. + + \param to_be_unconstrained + 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 to_be_removed. + */ + void unconstrain(const Variables_Set& to_be_unconstrained); + + //! 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 true is returned, + otherwise false 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()); + + /*! \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 + 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 must 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_widening_assign(const Box& 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 must 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 + void CC76_widening_assign(const Box& 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 must 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 must 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 decreasing iteration sequence). Hence, the call + x.CC76_narrowing_assign(y) will assign to \p x + the result of the computation \f$\mathtt{y} \Delta \mathtt{x}\f$. + */ + void CC76_narrowing_assign(const Box& 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 to_be_removed + The set of Variable objects corresponding to the dimensions to be removed. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with one of the Variable + objects contained in \p to_be_removed. + */ + void remove_space_dimensions(const Variables_Set& to_be_removed); + + /*! \brief + Removes the higher dimensions so that the resulting space + will have dimension \p new_dimension. + + \exception std::invalid_argument + Thrown if \p new_dimension is greater than the space dimension + of \p *this. + */ + void remove_higher_space_dimensions(dimension_type new_dimension); + + /*! \brief + Remaps the dimensions of the vector space according to + a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function". + + \param pfunc + The partial function specifying the destiny of each dimension. + + The template class Partial_Function must provide the following + methods. + \code + bool has_empty_codomain() const + \endcode + returns true if and only if the represented partial + function has an empty co-domain (i.e., it is always undefined). + The has_empty_codomain() method will always be called + before the methods below. However, if + has_empty_codomain() returns true, 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 true is returned. + If \f$f\f$ is undefined in \f$k\f$, then false 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 + 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 max_space_dimension(). + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + and var has space dimension \f$k \leq n\f$, + then the \f$k\f$-th space dimension is + \ref expand_space_dimension "expanded" to \p m new space dimensions + \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$. + */ + void expand_space_dimension(Variable var, dimension_type m); + + //! Folds the space dimensions in \p to_be_folded into \p var. + /*! + \param to_be_folded + The set of Variable objects corresponding to the space dimensions + to be folded; + + \param var + The variable corresponding to the space dimension that is the + destination of the folding operation. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with \p var or with + one of the Variable objects contained in \p to_be_folded. + Also thrown if \p var is contained in \p to_be_folded. + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + var has space dimension \f$k \leq n\f$, + \p to_be_folded is a set of variables whose maximum space dimension + is also less than or equal to \f$n\f$, and \p var is not a member + of \p to_be_folded, then the space dimensions corresponding to + variables in \p to_be_folded are \ref fold_space_dimensions "folded" + into the \f$k\f$-th space dimension. + */ + void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var); + + //@} // Member Functions that May Modify the Dimension of the Vector Space + + /*! \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 k-th space dimension is unbounded below, returns + false. Otherwise returns true and set + \p closed, \p n and \p d accordingly. + + Let \f$I\f$ the interval corresponding to the k-th + space dimension. If \f$I\f$ is not bounded from below, simply return + false. Otherwise, set closed, + n and d as follows: closed + is set to true if the the lower boundary of \f$I\f$ + is closed and is set to false otherwise; + n and d are assigned the integers + \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$ + corresponds to the greatest lower bound of \f$I\f$. The fraction + \f$n/d\f$ is in canonical form if and only if \f$n\f$ and \f$d\f$ + have no common factors and \f$d\f$ is positive, \f$0/1\f$ being + the unique representation for zero. + + An undefined behavior is obtained if \p k is greater than + or equal to the space dimension of \p *this. + */ + bool get_lower_bound(dimension_type k, bool& closed, + Coefficient& n, Coefficient& d) const; + + /*! \brief + If the k-th space dimension is unbounded above, returns + false. Otherwise returns true and set + \p closed, \p n and \p d accordingly. + + Let \f$I\f$ the interval corresponding to the k-th + space dimension. If \f$I\f$ is not bounded from above, simply return + false. Otherwise, set closed, + n and d as follows: closed + is set to true if the the upper boundary of \f$I\f$ + is closed and is set to false otherwise; + n and d are assigned the integers + \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$ + corresponds to the least upper bound of \f$I\f$. + + An undefined behavior is obtained if \p k is greater than + or equal to the space dimension of \p *this. + */ + bool get_upper_bound(dimension_type k, bool& closed, + Coefficient& n, Coefficient& d) const; + + //! 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; + + 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 true if successful, false otherwise. + */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) + bool ascii_load(std::istream& s); + +private: + template + friend class Parma_Polyhedra_Library::Box; + + friend bool + operator==(const Box& x, const Box& y); + + friend std::ostream& + Parma_Polyhedra_Library + ::IO_Operators::operator<<<>(std::ostream& s, const Box& box); + + template + friend bool Parma_Polyhedra_Library::l_m_distance_assign + (Checked_Number& r, + const Box& x, const Box& y, const Rounding_Dir dir, + Temp& tmp0, Temp& tmp1, Temp& tmp2); + + //! The type of sequence used to implement the box. + typedef std::vector 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 true if and only if the box is known to be empty. + + The return value false 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 true if and only if it is so. + */ + bool check_empty() const; + + /*! \brief + Returns a reference the interval that bounds + the box on the k-th space dimension. + */ + const ITV& operator[](dimension_type k) const; + + /*! \brief + WRITE ME. + */ + void + add_interval_constraint_no_check(dimension_type var_id, + Constraint::Type type, + Coefficient_traits::const_reference num, + Coefficient_traits::const_reference den); + + /*! \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 added. + Non-interval 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 constraints in \p cs to refine \p *this. + + \param cs + The constraints to be added. + Non-interval constraints are ignored. + + \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 exact; + we say it is inexact 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. + + \warning + If \p cs and \p *this are dimension-incompatible, + the behavior is undefined. + + \warning + This method may lead to non-termination. + */ + void propagate_constraints_no_check(const Constraint_System& cs); + + //! Checks if and how \p expr is bounded in \p *this. + /*! + Returns true if and only if \p from_above is + true and \p expr is bounded from above in \p *this, + or \p from_above is false and \p expr is bounded + from below in \p *this. + + \param expr + The linear expression to test; + + \param from_above + true 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 + true 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 + true 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, false 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 + true 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 + true 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, false 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& x) const; + + void throw_dimension_incompatible(const char* method, + dimension_type required_dim) const; + + void throw_dimension_incompatible(const char* method, + const Constraint& c) const; + + void throw_dimension_incompatible(const char* method, + const 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* name_row, + const Linear_Expression& y) const; + + static void throw_space_dimension_overflow(const char* method, + const char* reason); + + static void throw_constraint_incompatible(const char* method); + + static void throw_expression_too_complex(const char* method, + const Linear_Expression& e); + + static void throw_generic(const char* method, const char* reason); + //@} // Exception Throwers +}; + +namespace 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 num + The numerator of the constraint bound; + + \param den + The denominator of the constraint bound + + The interval constraint has the form + den * Variable(0) relsym num + where relsym is ==, > or >= + depending on the constraint_type. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +Poly_Con_Relation +interval_relation(const ITV& i, + const Constraint::Type constraint_type, + Coefficient_traits::const_reference num, + Coefficient_traits::const_reference den = 1); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Decodes the constraint \p c as an interval constraint. +/*! \relates Box + \return + true if the constraint \p c is an + \ref intervals "interval constraint"; + false otherwise. + + \param c + The constraint to be decoded. + + \param c_space_dim + The space dimension of the constraint \p c (it is assumed + to match the actual space dimension of \p c). + + \param c_num_vars + If true 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 true 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) +bool extract_interval_constraint(const Constraint& c, + dimension_type c_space_dim, + dimension_type& c_num_vars, + dimension_type& c_only_var); + +bool extract_interval_congruence(const Congruence& cg, + dimension_type cg_space_dim, + 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..1c6556e --- /dev/null +++ b/src/Box.inlines.hh @@ -0,0 +1,650 @@ +/* Box class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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 +inline bool +Box::marked_empty() const { + return status.test_empty_up_to_date() && status.test_empty(); +} + +template +inline void +Box::set_empty() { + status.set_empty(); + status.set_empty_up_to_date(); +} + +template +inline void +Box::set_nonempty() { + status.reset_empty(); + status.set_empty_up_to_date(); +} + +template +inline void +Box::set_empty_up_to_date() { + status.set_empty_up_to_date(); +} + +template +inline void +Box::reset_empty_up_to_date() { + return status.reset_empty_up_to_date(); +} + +template +inline +Box::Box(const Box& y, Complexity_Class) + : seq(y.seq), status(y.status) { +} + +template +inline Box& +Box::operator=(const Box& y) { + seq = y.seq; + status = y.status; + return *this; +} + +template +inline void +Box::swap(Box& y) { + Box& x = *this; + std::swap(x.seq, y.seq); + std::swap(x.status, y.status); +} + +template +inline +Box::Box(const Constraint_System& cs, Recycle_Input) { + // Recycling is useless: just delegate. + Box tmp(cs); + this->swap(tmp); +} + +template +inline +Box::Box(const Generator_System& gs, Recycle_Input) { + // Recycling is useless: just delegate. + Box tmp(gs); + this->swap(tmp); +} + +template +inline +Box::Box(const Congruence_System& cgs, Recycle_Input) { + // Recycling is useless: just delegate. + Box tmp(cgs); + this->swap(tmp); +} + +template +inline memory_size_type +Box::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +template +inline dimension_type +Box::space_dimension() const { + return seq.size(); +} + +template +inline dimension_type +Box::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 +inline const ITV& +Box::operator[](const dimension_type k) const { + assert(k < seq.size()); + return seq[k]; +} + +template +inline const ITV& +Box::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 +inline void +Box::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(); + + assert(OK()); +} + +template +inline bool +Box::is_empty() const { + return marked_empty() || check_empty(); +} + +template +inline bool +Box::bounds_from_above(const Linear_Expression& expr) const { + return bounds(expr, true); +} + +template +inline bool +Box::bounds_from_below(const Linear_Expression& expr) const { + return bounds(expr, false); +} + +template +inline bool +Box::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 +inline bool +Box::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 +inline bool +Box::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 +inline bool +Box::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 +inline bool +Box::strictly_contains(const Box& y) const { + const Box& x = *this; + return x.contains(y) && !y.contains(x); +} + +template +inline void +Box::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_generic("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()]); + assert(OK()); +} + +template +inline bool +operator!=(const Box& x, const Box& y) { + return !(x == y); +} + +template +inline bool +Box::get_lower_bound(const dimension_type k, bool& closed, + Coefficient& n, Coefficient& d) const { + assert(k < seq.size()); + const ITV& seq_k = seq[k]; + + if (seq_k.lower_is_unbounded()) + return false; + + closed = !seq_k.lower_is_open(); + + PPL_DIRTY_TEMP0(mpq_class, lr); + assign_r(lr, seq_k.lower(), ROUND_NOT_NEEDED); + n = lr.get_num(); + d = lr.get_den(); + + return true; +} + +template +inline bool +Box::get_upper_bound(const dimension_type k, bool& closed, + Coefficient& n, Coefficient& d) const { + assert(k < seq.size()); + const ITV& seq_k = seq[k]; + + if (seq_k.upper_is_unbounded()) + return false; + + closed = !seq_k.upper_is_open(); + + PPL_DIRTY_TEMP0(mpq_class, ur); + assign_r(ur, seq_k.upper(), ROUND_NOT_NEEDED); + n = ur.get_num(); + d = ur.get_den(); + + return true; +} + +template +inline void +Box::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 +inline void +Box::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 +inline void +Box::add_recycled_constraints(Constraint_System& cs) { + add_constraints(cs); +} + +template +inline void +Box::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 +inline void +Box::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 +inline void +Box::add_recycled_congruences(Congruence_System& cgs) { + add_congruences(cgs); +} + +template +inline bool +Box::can_recycle_constraint_systems() { + return false; +} + +template +inline bool +Box::can_recycle_congruence_systems() { + return false; +} + +template +inline void +Box::widening_assign(const Box& y, unsigned* tp) { + CC76_widening_assign(y, tp); +} + +template +inline Congruence_System +Box::minimized_congruences() const { + // Only equalities can be congruences and these are already minimized. + return congruences(); +} + +template +inline void +Box +::add_interval_constraint_no_check(const dimension_type var_id, + const Constraint::Type type, + Coefficient_traits::const_reference num, + Coefficient_traits::const_reference den) { + assert(!marked_empty()); + assert(var_id < space_dimension()); + assert(den != 0); + + // The interval constraint is of the form + // `Variable(var_id) + num / den rel 0', where + // `rel' is either the relation `==', `>=', or `>'. + // For the purpose of refining the interval, this is + // (morally) turned into `Variable(var_id) rel -num/den'. + PPL_DIRTY_TEMP0(mpq_class, q); + assign_r(q.get_num(), num, ROUND_NOT_NEEDED); + assign_r(q.get_den(), den, ROUND_NOT_NEEDED); + q.canonicalize(); + // Turn `num/den' into `-num/den'. + q = -q; + + ITV& seq_v = seq[var_id]; + switch (type) { + case Constraint::EQUALITY: + seq_v.refine_existential(EQUAL, q); + break; + case Constraint::NONSTRICT_INEQUALITY: + seq_v.refine_existential((den > 0) ? GREATER_OR_EQUAL : LESS_OR_EQUAL, q); + assert(seq_v.OK()); + break; + case Constraint::STRICT_INEQUALITY: + seq_v.refine_existential((den > 0) ? GREATER_THAN : LESS_THAN, q); + break; + } + // FIXME: do check the value returned by `refine_existential' and + // set `empty' and `empty_up_to_date' as appropriate. + // This has to be done after reimplementation of intervals. + reset_empty_up_to_date(); + assert(OK()); +} + +template +inline void +Box::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 +inline void +Box::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 +inline void +Box::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 +inline void +Box::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 +inline void +Box::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 +inline void +Box::propagate_constraints(const Constraint_System& cs) { + // 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); +} + +template +inline void +Box::unconstrain(const Variable var) { + const dimension_type dim = var.id(); + // Dimension-compatibility check. + if (dim > space_dimension()) + throw_dimension_incompatible("unconstrain(var)", 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 `var' before cylindrification. + ITV& seq_var = seq[dim]; + if (seq_var.is_empty()) + set_empty(); + else + seq_var.assign(UNIVERSE); + assert(OK()); +} + +/*! \relates Box */ +template +inline bool +rectilinear_distance_assign(Checked_Number& r, + const Box& x, + const Box& y, + const Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2) { + return l_m_distance_assign > + (r, x, y, dir, tmp0, tmp1, tmp2); +} + +/*! \relates Box */ +template +inline bool +rectilinear_distance_assign(Checked_Number& r, + const Box& x, + const Box& y, + const Rounding_Dir dir) { + typedef Checked_Number 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 +inline bool +rectilinear_distance_assign(Checked_Number& r, + const Box& x, + const Box& 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(r, x, y, dir); +} + +/*! \relates Box */ +template +inline bool +euclidean_distance_assign(Checked_Number& r, + const Box& x, + const Box& y, + const Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2) { + return l_m_distance_assign > + (r, x, y, dir, tmp0, tmp1, tmp2); +} + +/*! \relates Box */ +template +inline bool +euclidean_distance_assign(Checked_Number& r, + const Box& x, + const Box& y, + const Rounding_Dir dir) { + typedef Checked_Number 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 +inline bool +euclidean_distance_assign(Checked_Number& r, + const Box& x, + const Box& 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(r, x, y, dir); +} + +/*! \relates Box */ +template +inline bool +l_infinity_distance_assign(Checked_Number& r, + const Box& x, + const Box& y, + const Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2) { + return l_m_distance_assign > + (r, x, y, dir, tmp0, tmp1, tmp2); +} + +/*! \relates Box */ +template +inline bool +l_infinity_distance_assign(Checked_Number& r, + const Box& x, + const Box& y, + const Rounding_Dir dir) { + typedef Checked_Number 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 +inline bool +l_infinity_distance_assign(Checked_Number& r, + const Box& x, + const Box& 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(r, x, y, dir); +} + +} // 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..fa27d0d --- /dev/null +++ b/src/Box.templates.hh @@ -0,0 +1,3881 @@ +/* Box class implementation: non-inline template functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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 "BD_Shape.defs.hh" +#include "Octagonal_Shape.defs.hh" +#include "MIP_Problem.defs.hh" +#include "Rational_Interval.hh" +#include + +namespace Parma_Polyhedra_Library { + +template +inline +Box::Box(dimension_type num_dimensions, Degenerate_Element kind) + : seq(num_dimensions <= max_space_dimension() + ? num_dimensions + : (throw_space_dimension_overflow("Box(n, k)", + "n exceeds the maximum " + "allowed space dimension"), + num_dimensions)), + 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(); + assert(OK()); +} + +template +inline +Box::Box(const Constraint_System& cs) + : seq(cs.space_dimension() <= max_space_dimension() + ? cs.space_dimension() + : (throw_space_dimension_overflow("Box(cs)", + "cs exceeds the maximum " + "allowed space dimension"), + cs.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 +inline +Box::Box(const Congruence_System& cgs) + : seq(cgs.space_dimension() <= max_space_dimension() + ? cgs.space_dimension() + : (throw_space_dimension_overflow("Box(cgs)", + "cgs exceeds the maximum " + "allowed space dimension"), + cgs.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 +template +inline +Box::Box(const Box& 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]); + assert(OK()); +} + +template +Box::Box(const Generator_System& gs) + : seq(gs.space_dimension() <= max_space_dimension() + ? gs.space_dimension() + : (throw_space_dimension_overflow("Box(gs)", + "gs exceeds the maximum " + "allowed space dimension"), + 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 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_TEMP0(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. + 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].join_assign(q); + } + } + else { + // This is the first point seen: initialize `seq'. + point_seen = true; + 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].assign(q); + } + } + } + } + + if (!point_seen) + // The generator system is not empty, but contains no points. + throw std::invalid_argument("PPL::Box::Box(gs):\n" + "the non-empty generator system gs " + "contains no points."); + + // Going through all the lines, rays and closure points. + ITV q_interval; + 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 (dimension_type i = space_dim; i-- > 0; ) + if (g.coefficient(Variable(i)) != 0) + seq[i].assign(UNIVERSE); + break; + case Generator::RAY: + for (dimension_type i = space_dim; i-- > 0; ) + switch (sgn(g.coefficient(Variable(i)))) { + case 1: + seq[i].upper_set(UNBOUNDED); + break; + case -1: + seq[i].lower_set(UNBOUNDED); + break; + default: + break; + } + break; + case Generator::CLOSURE_POINT: + { + const Coefficient& d = g.divisor(); + 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_widen(q, true); + seq_i.upper_widen(q, true); + } + } + break; + default: + // Points already dealt with. + break; + } + } + assert(OK()); +} + +template +template +Box::Box(const BD_Shape& bds, Complexity_Class) + : seq(bds.space_dimension() <= max_space_dimension() + ? bds.space_dimension() + : (throw_space_dimension_overflow("Box(bds)", + "bds exceeds the maximum " + "allowed space dimension"), + bds.space_dimension())), + status() { + // Expose all the interval constraints. + bds.shortest_path_closure_assign(); + if (bds.marked_empty()) { + set_empty(); + 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) { + assert(OK()); + return; + } + + PPL_DIRTY_TEMP(typename BD_Shape::coefficient_type, tmp); + const DB_Row::coefficient_type>& dbm_0 = bds.dbm[0]; + for (dimension_type i = space_dim; i-- > 0; ) { + ITV& seq_i = seq[i]; + // Set the upper bound. + const typename BD_Shape::coefficient_type& u = dbm_0[i+1]; + if (is_plus_infinity(u)) + seq_i.upper_set_uninit(UNBOUNDED); + else + seq_i.upper_set_uninit(u); + + // Set the lower bound. + const typename BD_Shape::coefficient_type& negated_l = bds.dbm[i+1][0]; + if (is_plus_infinity(negated_l)) + seq_i.lower_set_uninit(UNBOUNDED); + else { + neg_assign_r(tmp, negated_l, ROUND_DOWN); + seq_i.lower_set_uninit(tmp); + } + + // Complete the interval initialization. + seq_i.complete_init(); + } + assert(OK()); +} + +template +template +Box::Box(const Octagonal_Shape& oct, Complexity_Class) + : seq(oct.space_dimension() <= max_space_dimension() + ? oct.space_dimension() + : (throw_space_dimension_overflow("Box(oct)", + "oct exceeds the maximum " + "allowed space dimension"), + oct.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_TEMP0(mpq_class, bound); + for (dimension_type i = space_dim; i-- > 0; ) { + ITV& seq_i = seq[i]; + const dimension_type ii = 2*i; + const dimension_type cii = ii + 1; + + // Set the upper bound. + const typename Octagonal_Shape::coefficient_type& twice_ub + = oct.matrix[cii][ii]; + if (!is_plus_infinity(twice_ub)) { + assign_r(bound, twice_ub, ROUND_NOT_NEEDED); + div2exp_assign_r(bound, bound, 1, ROUND_NOT_NEEDED); + seq_i.upper_set_uninit(bound); + } + else + seq_i.upper_set_uninit(UNBOUNDED); + + // Set the lower bound. + const typename Octagonal_Shape::coefficient_type& twice_lb + = oct.matrix[ii][cii]; + if (!is_plus_infinity(twice_lb)) { + assign_r(bound, twice_lb, ROUND_NOT_NEEDED); + neg_assign_r(bound, bound, ROUND_NOT_NEEDED); + div2exp_assign_r(bound, bound, 1, ROUND_NOT_NEEDED); + seq_i.lower_set_uninit(bound); + } + else + seq_i.lower_set_uninit(UNBOUNDED); + seq_i.complete_init(); + } +} + +template +Box::Box(const Polyhedron& ph, Complexity_Class complexity) + : seq(ph.space_dimension() <= max_space_dimension() + ? ph.space_dimension() + : (throw_space_dimension_overflow("Box(ph)", + "ph exceeds the maximum " + "allowed space dimension"), + ph.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()); + swap(tmp); + return; + } + + // Here generators are not up-to-date or there are pending constraints. + 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_dimension(); i-- > 0; ) + seq[i].assign(UNIVERSE); + // Extract easy-to-find bounds from constraints. + refine_with_constraints(ph.simplified_constraints()); + } + 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()) + lp.add_constraint(Linear_Expression(c) >= 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_TEMP0(mpq_class, bound); + PPL_DIRTY_TEMP(Coefficient, bound_num); + PPL_DIRTY_TEMP(Coefficient, bound_den); + for (dimension_type i = space_dim; i-- > 0; ) { + 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_num, bound_den); + assign_r(bound.get_num(), bound_num, ROUND_NOT_NEEDED); + assign_r(bound.get_den(), bound_den, ROUND_NOT_NEEDED); + assert(is_canonical(bound)); + seq_i.upper_set_uninit(bound); + } + else + seq_i.upper_set_uninit(UNBOUNDED); + // 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_num, bound_den); + assign_r(bound.get_num(), bound_num, ROUND_NOT_NEEDED); + assign_r(bound.get_den(), bound_den, ROUND_NOT_NEEDED); + assert(is_canonical(bound)); + seq_i.lower_set_uninit(bound); + } + else + seq_i.lower_set_uninit(UNBOUNDED); + seq_i.complete_init(); + } + } + else { + assert(complexity == ANY_COMPLEXITY); + if (ph.is_empty()) + set_empty(); + else { + Box tmp(ph.generators()); + swap(tmp); + } + } +} + +template +Box::Box(const Grid& gr, Complexity_Class) + : seq(gr.space_dimension() <= max_space_dimension() + ? gr.space_dimension() + : (throw_space_dimension_overflow("Box(gr)", + "gr exceeds the maximum " + "allowed space dimension"), + gr.space_dimension())), + status() { + + // FIXME: here we are not taking advantage of intervals with restrictions! + + 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; + } + + 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_TEMP0(mpq_class, bound); + PPL_DIRTY_TEMP(Coefficient, bound_num); + PPL_DIRTY_TEMP(Coefficient, bound_den); + for (dimension_type i = space_dim; i-- > 0; ) { + ITV& seq_i = seq[i]; + Variable var(i); + bool max; + if (gr.maximize(var, bound_num, bound_den, max)) { + assign_r(bound.get_num(), bound_num, ROUND_NOT_NEEDED); + assign_r(bound.get_den(), bound_den, ROUND_NOT_NEEDED); + bound.canonicalize(); + seq_i.assign(bound); + } + else + seq_i.assign(UNIVERSE); + } +} + +template +template +Box::Box(const Partially_Reduced_Product& dp, + Complexity_Class complexity) + : seq(), status() { + if (dp.space_dimension() > max_space_dimension()) + throw_space_dimension_overflow("Box(dp)", + "dp exceeds the maximum " + "allowed space dimension"); + Box tmp1(dp.domain1(), complexity); + Box tmp2(dp.domain2(), complexity); + tmp1.intersection_assign(tmp2); + swap(tmp1); +} + +template +inline void +Box::add_space_dimensions_and_embed(const dimension_type m) { + // Adding no dimensions is a no-op. + if (m == 0) + return; + // 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)); + assert(OK()); +} + +template +inline void +Box::add_space_dimensions_and_project(const dimension_type m) { + // Adding no dimensions is a no-op. + if (m == 0) + return; + // Add `m' new zero elements to the sequence. + seq.insert(seq.end(), m, ITV(0)); + assert(OK()); +} + +template +bool +operator==(const Box& x, const Box& 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 +bool +Box::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; + for (dimension_type i = expr_space_dim; i-- > 0; ) + switch (sgn(expr.coefficient(Variable(i))) * from_above_sign) { + case 1: + if (seq[i].upper_is_unbounded()) + return false; + break; + case 0: + // Nothing to do. + break; + case -1: + if (seq[i].lower_is_unbounded()) + return false; + break; + } + return true; +} + +template +Poly_Con_Relation +interval_relation(const ITV& i, + const Constraint::Type constraint_type, + Coefficient_traits::const_reference num, + Coefficient_traits::const_reference den) { + + if (i.is_universe()) + return Poly_Con_Relation::strictly_intersects(); + + PPL_DIRTY_TEMP0(mpq_class, bound); + assign_r(bound.get_num(), num, ROUND_NOT_NEEDED); + assign_r(bound.get_den(), den, ROUND_NOT_NEEDED); + bound.canonicalize(); + neg_assign_r(bound, bound, ROUND_NOT_NEEDED); + const bool is_lower_bound = (den > 0); + + PPL_DIRTY_TEMP0(mpq_class, bound_diff); + if (constraint_type == Constraint::EQUALITY) { + if (i.lower_is_unbounded()) { + assert(!i.upper_is_unbounded()); + 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_unbounded()) + 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(); + } + } + } + } + } + + assert(constraint_type != Constraint::EQUALITY); + if (is_lower_bound) { + if (i.lower_is_unbounded()) { + assert(!i.upper_is_unbounded()); + 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 { + 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_unbounded()) + 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_unbounded()) + 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 { + 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_unbounded()) + 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. + throw std::runtime_error("PPL internal error"); +} + +template +Poly_Con_Relation +Box::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_TEMP0(Rational_Interval, r); + PPL_DIRTY_TEMP0(Rational_Interval, t); + PPL_DIRTY_TEMP0(mpq_class, m); + r = 0; + for (dimension_type i = cg.space_dimension(); i-- > 0; ) { + const Coefficient& cg_i = cg.coefficient(Variable(i)); + if (sgn(cg_i) != 0) { + assign_r(m, cg_i, ROUND_NOT_NEEDED); + // FIXME: an add_mul_assign() method would come handy here. + t = seq[i]; + t *= m; + r += t; + } + } + + if (r.lower_is_unbounded() || r.upper_is_unbounded()) + 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 +Poly_Con_Relation +Box::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 (extract_interval_constraint(c, c_space_dim, 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_TEMP0(Rational_Interval, r); + PPL_DIRTY_TEMP0(Rational_Interval, t); + PPL_DIRTY_TEMP0(mpq_class, m); + r = 0; + for (dimension_type i = c.space_dimension(); i-- > 0; ) { + const Coefficient& c_i = c.coefficient(Variable(i)); + if (sgn(c_i) != 0) { + assign_r(m, c_i, ROUND_NOT_NEEDED); + // FIXME: an add_mul_assign() method would come handy here. + t = seq[i]; + t *= m; + r += t; + } + } + return interval_relation(r, + c.type(), + c.inhomogeneous_term()); + } + + // Quiet a compiler warning: this program point is unreachable. + throw std::runtime_error("PPL internal error"); +} + +template +Poly_Gen_Relation +Box::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()) { + for (dimension_type i = g_space_dim; i-- > 0; ) + if (g.coefficient(Variable(i)) != 0 && !seq[i].is_universe()) + return Poly_Gen_Relation::nothing(); + return Poly_Gen_Relation::subsumes(); + } + else { + assert(g.is_ray()); + for (dimension_type i = g_space_dim; i-- > 0; ) + switch (sgn(g.coefficient(Variable(i)))) { + case 1: + if (!seq[i].upper_is_unbounded()) + return Poly_Gen_Relation::nothing(); + break; + case 0: + break; + case -1: + if (!seq[i].lower_is_unbounded()) + 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_TEMP0(mpq_class, g_coord); + PPL_DIRTY_TEMP0(mpq_class, bound); + 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_unbounded()) { + 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_unbounded()) { + 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 +bool +Box::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_TEMP0(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_TEMP0(mpq_class, bound_i); + PPL_DIRTY_TEMP0(mpq_class, expr_i); + for (dimension_type i = expr_space_dim; i-- > 0; ) { + const ITV& seq_i = seq[i]; + assign_r(expr_i, expr.coefficient(Variable(i)), ROUND_NOT_NEEDED); + switch (sgn(expr_i) * maximize_sign) { + case 1: + if (seq_i.upper_is_unbounded()) + 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: + // Nothing to do. + break; + case -1: + if (seq_i.lower_is_unbounded()) + 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. + assert(is_canonical(result)); + ext_n = result.get_num(); + ext_d = result.get_den(); + included = is_included; + return true; +} + +template +bool +Box::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_TEMP0(mpq_class, g_coord); + PPL_DIRTY_TEMP(Coefficient, num); + PPL_DIRTY_TEMP(Coefficient, den); + PPL_DIRTY_TEMP(Coefficient, lcm); + PPL_DIRTY_TEMP(Coefficient, factor); + 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_unbounded()) + if (seq_i.lower_is_open()) + if (!seq_i.upper_is_unbounded()) + 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_TEMP0(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). + assert(!seq_i.upper_is_unbounded()); + 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(den, g_coord.get_den(), ROUND_NOT_NEEDED); + lcm_assign(lcm, g_divisor, den); + exact_div_assign(factor, lcm, g_divisor); + g_expr *= factor; + exact_div_assign(factor, lcm, den); + assign_r(num, g_coord.get_num(), ROUND_NOT_NEEDED); + num *= factor; + g_expr += num * Variable(i); + g_divisor = lcm; + } + g = Generator::point(g_expr, g_divisor); + return true; +} + +template +bool +Box::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 +bool +Box::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 +inline bool +Box::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.marked_empty()) + return true; + if (x.marked_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 +bool +Box::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 +dimension_type +Box::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 +bool +Box::check_empty() const { + assert(!marked_empty()); + Box& x = const_cast&>(*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 +bool +Box::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 +bool +Box::is_topologically_closed() const { + if (!ITV::info_type::store_open || is_empty()) + return true; + + for (dimension_type k = seq.size(); k-- > 0; ) + if (!seq[k].is_topologically_closed()) + return false; + return true; +} + +template +bool +Box::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 +bool +Box::is_bounded() const { + if (is_empty()) + return true; + for (dimension_type k = seq.size(); k-- > 0; ) + if (seq[k].is_unbounded()) + return false; + return true; +} + +template +bool +Box::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 +bool +Box::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 +void +Box::unconstrain(const Variables_Set& to_be_unconstrained) { + // The cylindrification wrt no dimensions is a no-op. + // This case also captures the only legal cylindrification + // of a box in a 0-dim space. + if (to_be_unconstrained.empty()) + return; + + // Dimension-compatibility check. + const dimension_type min_space_dim = to_be_unconstrained.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 + // `to_be_unconstrained' before cylindrification. + for (Variables_Set::const_iterator tbu = to_be_unconstrained.begin(), + tbu_end = to_be_unconstrained.end(); tbu != tbu_end; ++tbu) { + ITV& seq_tbu = seq[*tbu]; + if (!seq_tbu.is_empty()) + seq_tbu.assign(UNIVERSE); + else { + set_empty(); + break; + } + } + assert(OK()); +} + +template +void +Box::topological_closure_assign() { + if (!ITV::info_type::store_open || is_empty()) + return; + + for (dimension_type k = seq.size(); k-- > 0; ) + seq[k].topological_closure_assign(); +} + +template +void +Box::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]); + + assert(x.OK()); +} + +template +void +Box::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.marked_empty()) + return; + if (x.marked_empty()) { + x = y; + return; + } + + for (dimension_type k = x.seq.size(); k-- > 0; ) + x.seq[k].join_assign(y.seq[k]); + + assert(x.OK()); +} + +template +void +Box::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; + + // 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)); + 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(x.seq)); + // Update the `empty_up_to_date' flag. + if (!y.status.test_empty_up_to_date()) + reset_empty_up_to_date(); + + assert(x.OK()); +} + +template +void +Box::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; + } + assert(OK()); +} + +template +bool +Box::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(); + 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. + assert(x.OK() && x.is_empty()); + return false; + } + + // Loop index `i' is intentionally going upwards. + dimension_type i = 0; + for ( ; i < num_dims; ++i) { + if (!x.seq[i].simplify_using_context_assign(y.seq[i])) { + 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); + assert(x.OK()); + return false; + } + } + assert(x.OK()); + return true; +} + +template +void +Box::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_unbounded()) + if (y_seq_i.lower_is_unbounded() || y_seq_i.lower() < 0) + x_seq_i.lower_set(UNBOUNDED); + if (!x_seq_i.upper_is_unbounded()) + if (y_seq_i.upper_is_unbounded() || y_seq_i.upper() > 0) + x_seq_i.upper_set(UNBOUNDED); + } + assert(x.OK()); +} + +template +inline void +Box::remove_space_dimensions(const Variables_Set& to_be_removed) { + // 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 (to_be_removed.empty()) { + assert(OK()); + return; + } + + const dimension_type old_space_dim = space_dimension(); + + // Dimension-compatibility check. + const dimension_type tbr_space_dim = to_be_removed.space_dimension(); + if (old_space_dim < tbr_space_dim) + throw_dimension_incompatible("remove_space_dimensions(vs)", + tbr_space_dim); + + const dimension_type new_space_dim = old_space_dim - to_be_removed.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); + 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 tbr = to_be_removed.begin(); + Variables_Set::const_iterator tbr_end = to_be_removed.end(); + dimension_type dst = *tbr; + dimension_type src = dst + 1; + for (++tbr; tbr != tbr_end; ++tbr) { + const dimension_type tbr_next = *tbr; + // All intervals in between are moved to the left. + while (src < tbr_next) + seq[dst++].swap(seq[src++]); + ++src; + } + // Moving the remaining intervals. + while (src < old_space_dim) + seq[dst++].swap(seq[src++]); + + assert(dst == new_space_dim); + seq.resize(new_space_dim); + + assert(OK()); +} + +template +void +Box::remove_higher_space_dimensions(const dimension_type new_dim) { + // Dimension-compatibility check: the variable having + // maximum index is the one occurring last in the set. + const dimension_type old_dim = space_dimension(); + if (new_dim > old_dim) + throw_dimension_incompatible("remove_higher_space_dimensions(nd)", + new_dim); + + // 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_dim == old_dim) { + assert(OK()); + return; + } + + seq.erase(seq.begin() + new_dim, seq.end()); + assert(OK()); +} + +template +template +void +Box::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 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)) + seq[i].swap(tmp.seq[new_i]); + } + swap(tmp); + assert(OK()); +} + +template +void +Box::fold_space_dimensions(const Variables_Set& to_be_folded, + const Variable var) { + const dimension_type space_dim = space_dimension(); + // `var' should be one of the dimensions of the box. + if (var.space_dimension() > space_dim) + throw_dimension_incompatible("fold_space_dimensions(tbf, v)", "v", var); + + // The folding of no dimensions is a no-op. + if (to_be_folded.empty()) + return; + + // All variables in `to_be_folded' should be dimensions of the box. + if (to_be_folded.space_dimension() > space_dim) + throw_dimension_incompatible("fold_space_dimensions(tbf, ...)", + to_be_folded.space_dimension()); + + // Moreover, `var.id()' should not occur in `to_be_folded'. + if (to_be_folded.find(var.id()) != to_be_folded.end()) + throw_generic("fold_space_dimensions(tbf, v)", + "v should not occur in tbf"); + + // Note: the check for emptiness is needed for correctness. + if (!is_empty()) { + // Join the interval corresponding to variable `var' with the intervals + // corresponding to the variables in `to_be_folded'. + ITV& seq_v = seq[var.id()]; + for (Variables_Set::const_iterator i = to_be_folded.begin(), + tbf_end = to_be_folded.end(); i != tbf_end; ++i) + seq_v.join_assign(seq[*i]); + } + remove_space_dimensions(to_be_folded); +} + +template +void +Box::add_constraint_no_check(const Constraint& c) { + const dimension_type c_space_dim = c.space_dimension(); + assert(c_space_dim <= 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 (!extract_interval_constraint(c, c_space_dim, c_num_vars, c_only_var)) + throw_generic("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 + && !Box::interval_type::info_type::store_open) + throw_generic("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; + } + + 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 +void +Box::add_constraints_no_check(const Constraint_System& cs) { + 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); + assert(OK()); +} + +template +void +Box::add_congruence_no_check(const Congruence& cg) { + const dimension_type cg_space_dim = cg.space_dimension(); + assert(cg_space_dim <= 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 + // FIXME: what about intervals with restrictions? + throw_generic("add_congruence(cg)", + "cg is a nontrivial proper congruence"); + } + + 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 (!extract_interval_congruence(cg, cg_space_dim, cg_num_vars, cg_only_var)) + throw_generic("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; + } + + 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 +void +Box::add_congruences_no_check(const Congruence_System& cgs) { + 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); + assert(OK()); +} + +template +void +Box::refine_no_check(const Constraint& c) { + const dimension_type c_space_dim = c.space_dimension(); + assert(c_space_dim <= space_dimension()); + assert(!marked_empty()); + + dimension_type c_num_vars = 0; + dimension_type c_only_var = 0; + // Non-interval constraints are ignored. + // FIXME: instead of ignoring, safely use propagate_no_check() + // (i.e., ensuring that no termination problem can arise). + if (!extract_interval_constraint(c, c_space_dim, c_num_vars, c_only_var)) + 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; + } + + 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 +void +Box::refine_no_check(const Constraint_System& cs) { + 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); + assert(OK()); +} + +template +void +Box::refine_no_check(const Congruence& cg) { + assert(!marked_empty()); + + const dimension_type cg_space_dim = cg.space_dimension(); + assert(cg_space_dim <= space_dimension()); + + if (cg.is_proper_congruence()) { + // FIXME: also deal with the case of interval with restrictions. + // A proper congruences is also an interval constraint + // if and only if it is trivial. + if (cg.is_inconsistent()) + set_empty(); + return; + } + + assert(cg.is_equality()); + dimension_type cg_num_vars = 0; + dimension_type cg_only_var = 0; + // Congruences that are not interval congruences are ignored. + if (!extract_interval_congruence(cg, cg_space_dim, cg_num_vars, cg_only_var)) + return; + + if (cg_num_vars == 0) { + // Dealing with a trivial congruence. + if (cg.inhomogeneous_term() != 0) + set_empty(); + return; + } + + assert(cg_num_vars == 1); + const Coefficient& n = cg.inhomogeneous_term(); + const Coefficient& d = cg.coefficient(Variable(cg_only_var)); + add_interval_constraint_no_check(cg_only_var, Constraint::EQUALITY, n, d); +} + +template +void +Box::refine_no_check(const Congruence_System& cgs) { + 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); + assert(OK()); +} + +#if 1 // Alternative implementations for propagate_constraint_no_check. +namespace { + +inline bool +propagate_constraint_check_result(Result r, Ternary& open) { + switch (r) { + case V_NEG_OVERFLOW: + case V_POS_OVERFLOW: + case V_UNKNOWN_NEG_OVERFLOW: + case V_UNKNOWN_POS_OVERFLOW: + 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: + assert(false); + return true; + } +} + +} // namespace + +template +void +Box::propagate_constraint_no_check(const Constraint& c) { + assert(c.space_dimension() <= space_dimension()); + + typedef + typename Select_Temp_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). + dimension_type last_k = c_space_dim; + for (dimension_type k = c_space_dim; k-- > 0; ) { + if (c.coefficient(Variable(k)) != 0) { + last_k = k; + break; + } + } + if (last_k == c_space_dim) { + // 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. + assert(last_k < c_space_dim); + Result r; + Temp_Boundary_Type t_bound; + Temp_Boundary_Type t_a; + Temp_Boundary_Type t_x; + Ternary open; + for (dimension_type k = last_k+1; k-- > 0; ) { + const Coefficient& a_k = c.coefficient(Variable(k)); + int sgn_a_k = sgn(a_k); + if (sgn_a_k == 0) + continue; + if (sgn_a_k > 0) { + open = (c_type == Constraint::STRICT_INEQUALITY) ? T_YES : T_NO; + if (open == T_NO) + maybe_reset_fpu_inexact(); + 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 (dimension_type i = last_k+1; i-- > 0; ) { + if (i == k) + continue; + const Coefficient& a_i = c.coefficient(Variable(i)); + int sgn_a_i = sgn(a_i); + if (sgn_a_i == 0) + continue; + ITV& x_i = seq[i]; + if (sgn_a_i < 0) { + if (x_i.lower_is_unbounded()) + 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 { + assert(sgn_a_i > 0); + if (x_i.upper_is_unbounded()) + 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() == 1) + open = T_YES; + seq[k].lower_narrow(t_bound, open == T_YES); + reset_empty_up_to_date(); + maybe_refine_upper_1: + if (c_type != Constraint::EQUALITY) + continue; + open = T_NO; + maybe_reset_fpu_inexact(); + 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 (dimension_type i = c_space_dim; i-- > 0; ) { + if (i == k) + continue; + const Coefficient& a_i = c.coefficient(Variable(i)); + int sgn_a_i = sgn(a_i); + if (sgn_a_i == 0) + continue; + ITV& x_i = seq[i]; + if (sgn_a_i < 0) { + if (x_i.upper_is_unbounded()) + 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 { + assert(sgn_a_i > 0); + if (x_i.lower_is_unbounded()) + 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() == 1) + open = T_YES; + seq[k].upper_narrow(t_bound, open == T_YES); + reset_empty_up_to_date(); + } + else { + assert(sgn_a_k < 0); + open = (c_type == Constraint::STRICT_INEQUALITY) ? T_YES : T_NO; + if (open == T_NO) + maybe_reset_fpu_inexact(); + 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 (dimension_type i = c_space_dim; i-- > 0; ) { + if (i == k) + continue; + const Coefficient& a_i = c.coefficient(Variable(i)); + int sgn_a_i = sgn(a_i); + if (sgn_a_i == 0) + continue; + ITV& x_i = seq[i]; + if (sgn_a_i < 0) { + if (x_i.lower_is_unbounded()) + 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 { + assert(sgn_a_i > 0); + if (x_i.upper_is_unbounded()) + 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() == 1) + open = T_YES; + seq[k].upper_narrow(t_bound, open == T_YES); + reset_empty_up_to_date(); + maybe_refine_upper_2: + if (c_type != Constraint::EQUALITY) + continue; + open = T_NO; + maybe_reset_fpu_inexact(); + 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 (dimension_type i = c_space_dim; i-- > 0; ) { + if (i == k) + continue; + const Coefficient& a_i = c.coefficient(Variable(i)); + int sgn_a_i = sgn(a_i); + if (sgn_a_i == 0) + continue; + ITV& x_i = seq[i]; + if (sgn_a_i < 0) { + if (x_i.upper_is_unbounded()) + 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 { + assert(sgn_a_i > 0); + if (x_i.lower_is_unbounded()) + 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() == 1) + open = T_YES; + seq[k].lower_narrow(t_bound, open == T_YES); + reset_empty_up_to_date(); + } + next_k: + ; + } +} + +#else // Alternative implementations for propagate_constraint_no_check. + +template +void +Box::propagate_constraint_no_check(const Constraint& c) { + 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 (dimension_type i = c_space_dim; i-- > 0; ) { + k[i] = c.coefficient(Variable(i)); + ITV& p_i = p[i]; + p_i = seq[i]; + p_i.mul_assign(p_i, k[i]); + } + const Coefficient& inhomogeneous_term = c.inhomogeneous_term(); + for (dimension_type i = c_space_dim; i-- > 0; ) { + int sgn_coefficient_i = sgn(c.coefficient(Variable(i))); + if (sgn_coefficient_i == 0) + continue; + ITV q(inhomogeneous_term); + for (dimension_type j = c_space_dim; j-- > 0; ) { + if (i == j) + continue; + q.add_assign(q, p[j]); + } + q.div_assign(q, k[i]); + 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].refine_existential(rel, q); + // FIXME: could/should we exploit the return value of refine_existential, + // in case it is available? + // FIMXE: 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].is_empty()) { + set_empty(); + break; + } + } + + assert(OK()); +} + +#endif // Alternative implementations for propagate_constraint_no_check. + +template +void +Box::propagate_constraints_no_check(const Constraint_System& cs) { + assert(cs.space_dimension() <= space_dimension()); + + bool changed; + do { + Sequence copy(seq); + for (Constraint_System::const_iterator i = cs.begin(), + cs_end = cs.end(); i != cs_end; ++i) + propagate_constraint_no_check(*i); + + // Check if the client has requested abandoning all expensive + // computations. If so, the exception specified by the client + // is thrown now. + maybe_abandon(); + + changed = (copy != seq); + } while (changed); +} + +template +void +Box::affine_image(const Variable var, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator) { + // The denominator cannot be zero. + if (denominator == 0) + throw_generic("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, temp0, temp1; + expr_value.assign(expr.inhomogeneous_term()); + for (dimension_type i = expr_space_dim; i-- > 0; ) { + const Coefficient& coeff = expr.coefficient(Variable(i)); + if (coeff != 0) { + temp0.assign(coeff); + temp1.assign(seq[i]); + 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); + + assert(OK()); +} + +template +void +Box::affine_preimage(const Variable var, + const Linear_Expression& expr, + Coefficient_traits::const_reference + denominator) { + // The denominator cannot be zero. + if (denominator == 0) + throw_generic("affine_preimage(v, e, d)", "d == 0"); + + // Dimension-compatibility checks. + 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, temp0, temp1; + expr_value.assign(expr.inhomogeneous_term()); + for (dimension_type i = expr_space_dim; i-- > 0; ) { + const Coefficient& coeff = expr.coefficient(Variable(i)); + if (coeff != 0) { + temp0.assign(coeff); + temp1.assign(seq[i]); + 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); + } + assert(OK()); +} + +template +void +Box +::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_generic("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_num); + PPL_DIRTY_TEMP(Coefficient, max_den); + bool max_included; + PPL_DIRTY_TEMP(Coefficient, min_num); + PPL_DIRTY_TEMP(Coefficient, min_den); + bool min_included; + ITV& seq_v = seq[var.id()]; + if (maximize(ub_expr, max_num, max_den, max_included)) { + if (minimize(lb_expr, min_num, min_den, 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_den *= denominator; + PPL_DIRTY_TEMP0(mpq_class, q); + assign_r(q.get_num(), min_num, ROUND_NOT_NEEDED); + assign_r(q.get_den(), min_den, ROUND_NOT_NEEDED); + q.canonicalize(); + (denominator > 0) + ? seq_v.lower_set(q, !min_included) + : seq_v.upper_set(q, !min_included); + // Now make the maximum of lb_expr the upper bound. If the + // maximum is not at a box point, then inequality is strict. + max_den *= denominator; + assign_r(q.get_num(), max_num, ROUND_NOT_NEEDED); + assign_r(q.get_den(), max_den, ROUND_NOT_NEEDED); + q.canonicalize(); + (denominator > 0) + ? seq_v.upper_set(q, !max_included) + : seq_v.lower_set(q, !max_included); + } + 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_TEMP0(mpq_class, q); + max_den *= denominator; + assign_r(q.get_num(), max_num, ROUND_NOT_NEEDED); + assign_r(q.get_den(), max_den, ROUND_NOT_NEEDED); + q.canonicalize(); + if (denominator > 0) { + seq_v.lower_set(UNBOUNDED); + seq_v.upper_set(q, !max_included); + } + else { + seq_v.upper_set(UNBOUNDED); + seq_v.lower_set(q, !max_included); + } + } + } + else if (minimize(lb_expr, min_num, min_den, 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_den *= denominator; + PPL_DIRTY_TEMP0(mpq_class, q); + assign_r(q.get_num(), min_num, ROUND_NOT_NEEDED); + assign_r(q.get_den(), min_den, ROUND_NOT_NEEDED); + q.canonicalize(); + if (denominator > 0) { + seq_v.upper_set(UNBOUNDED); + seq_v.lower_set(q, !min_included); + } + else { + seq_v.lower_set(UNBOUNDED); + seq_v.upper_set(q, !min_included); + } + } + 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.upper_set(UNBOUNDED); + seq_v.lower_set(UNBOUNDED); + } + } + assert(OK()); +} + +template +void +Box +::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_generic("bounded_affine_preimage(v, lb, ub, d)", "d == 0"); + + // Dimension-compatibility checks. + // `var' should be one of the dimensions of the polyhedron. + const dimension_type var_space_dim = var.space_dimension(); + if (space_dim < var_space_dim) + throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)", + "v", var); + // The dimension of `lb_expr' and `ub_expr' should not be + // greater than the dimension of `*this'. + const dimension_type lb_space_dim = lb_expr.space_dimension(); + if (space_dim < lb_space_dim) + throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub)", + "lb", lb_expr); + const dimension_type ub_space_dim = ub_expr.space_dimension(); + if (space_dim < ub_space_dim) + throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub)", + "ub", ub_expr); + + // Any preimage of an empty polyhedron is empty. + if (marked_empty()) + return; + + 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_unbounded(); + PPL_DIRTY_TEMP0(mpq_class, q_seq_var_lower); + PPL_DIRTY_TEMP(Coefficient, num_lower); + PPL_DIRTY_TEMP(Coefficient, den_lower); + if (!unbounded_lower) { + assign_r(q_seq_var_lower, seq_var.lower(), ROUND_NOT_NEEDED); + assign_r(num_lower, q_seq_var_lower.get_num(), ROUND_NOT_NEEDED); + assign_r(den_lower, q_seq_var_lower.get_den(), ROUND_NOT_NEEDED); + if (negative_denom) + neg_assign(den_lower, den_lower); + num_lower *= pos_denominator; + seq_var.lower_set(UNBOUNDED); + } + bool open_upper = seq_var.upper_is_open(); + bool unbounded_upper = seq_var.upper_is_unbounded(); + PPL_DIRTY_TEMP0(mpq_class, q_seq_var_upper); + PPL_DIRTY_TEMP(Coefficient, num_upper); + PPL_DIRTY_TEMP(Coefficient, den_upper); + if (!unbounded_upper) { + assign_r(q_seq_var_upper, seq_var.upper(), ROUND_NOT_NEEDED); + assign_r(num_upper, q_seq_var_upper.get_num(), ROUND_NOT_NEEDED); + assign_r(den_upper, q_seq_var_upper.get_den(), ROUND_NOT_NEEDED); + if (negative_denom) + neg_assign(den_upper, den_upper); + num_upper *= pos_denominator; + seq_var.upper_set(UNBOUNDED); + } + + 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, den_lower); + revised_lb_expr *= d; + revised_lb_expr += num_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, den); + if (minimize(revised_lb_expr, num_lower, den, included)) { + den_lower *= (den * ub_var_coeff); + PPL_DIRTY_TEMP0(mpq_class, q); + assign_r(q.get_num(), num_lower, ROUND_NOT_NEEDED); + assign_r(q.get_den(), den_lower, ROUND_NOT_NEEDED); + q.canonicalize(); + open_lower |= !included; + if ((ub_var_coeff >= 0) ? !negative_denom : negative_denom) + seq_var.lower_narrow(q, open_lower); + else + seq_var.upper_narrow(q, open_lower); + 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, den_upper); + revised_ub_expr *= d; + revised_ub_expr += num_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, den); + if (maximize(revised_ub_expr, num_upper, den, included)) { + den_upper *= (den * lb_var_coeff); + PPL_DIRTY_TEMP0(mpq_class, q); + assign_r(q.get_num(), num_upper, ROUND_NOT_NEEDED); + assign_r(q.get_den(), den_upper, ROUND_NOT_NEEDED); + q.canonicalize(); + open_upper |= !included; + if ((lb_var_coeff >= 0) ? !negative_denom : negative_denom) + seq_var.upper_narrow(q, open_upper); + else + seq_var.lower_narrow(q, open_upper); + 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); + } + + assert(OK()); +} + +template +void +Box +::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_generic("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_generic("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_set(UNBOUNDED); + break; + case LESS_THAN: + seq_var.lower_set(UNBOUNDED); + if (!seq_var.upper_is_unbounded()) + seq_var.refine_existential(LESS_THAN, seq_var.upper()); + break; + case GREATER_OR_EQUAL: + seq_var.upper_set(UNBOUNDED); + break; + case GREATER_THAN: + seq_var.upper_set(UNBOUNDED); + if (!seq_var.lower_is_unbounded()) + seq_var.refine_existential(GREATER_THAN, seq_var.lower()); + break; + default: + // The EQUAL and NOT_EQUAL cases have been already dealt with. + throw std::runtime_error("PPL internal error"); + } + assert(OK()); +} + +template +void +Box +::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_generic("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_generic("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. + throw std::runtime_error("PPL internal error"); + } + + // 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_num); + PPL_DIRTY_TEMP(Coefficient, max_den); + bool max_included; + bool bound_above = maximize(denominator*var, max_num, max_den, max_included); + PPL_DIRTY_TEMP(Coefficient, min_num); + PPL_DIRTY_TEMP(Coefficient, min_den); + bool min_included; + bool bound_below = minimize(denominator*var, min_num, min_den, 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/minimim value for `var'. + PPL_DIRTY_TEMP(Linear_Expression, revised_expr); + dimension_type dim = space_dim; + PPL_DIRTY_TEMP_COEFFICIENT(d); + if (corrected_relsym == LESS_THAN || corrected_relsym == LESS_OR_EQUAL) { + if (bound_below) { + for ( ; dim > 0; dim--) { + d = min_den * expr.coefficient(Variable(dim - 1)); + revised_expr += d * Variable(dim - 1); + } + } + } + else { + if (bound_above) { + for ( ; dim > 0; dim--) { + d = max_den * expr.coefficient(Variable(dim - 1)); + revised_expr += d * Variable(dim - 1); + } + } + } + + switch (corrected_relsym) { + case LESS_THAN: + if (bound_below) + refine_with_constraint(min_num < revised_expr); + break; + case LESS_OR_EQUAL: + if (bound_below) + (min_included) + ? refine_with_constraint(min_num <= revised_expr) + : refine_with_constraint(min_num < revised_expr); + break; + case GREATER_OR_EQUAL: + if (bound_above) + (max_included) + ? refine_with_constraint(max_num >= revised_expr) + : refine_with_constraint(max_num > revised_expr); + break; + case GREATER_THAN: + if (bound_above) + refine_with_constraint(max_num > revised_expr); + break; + default: + // The EQUAL and NOT_EQUAL cases have been already dealt with. + throw std::runtime_error("PPL internal error"); + } + // If the shrunk box is empty, its preimage is empty too. + if (is_empty()) + return; + ITV& seq_v = seq[var.id()]; + seq_v.lower_set(UNBOUNDED); + seq_v.upper_set(UNBOUNDED); + assert(OK()); +} + +template +void +Box +::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_generic("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_num); + PPL_DIRTY_TEMP(Coefficient, max_den); + bool max_included; + bool max_rhs = maximize(rhs, max_num, max_den, max_included); + PPL_DIRTY_TEMP(Coefficient, min_num); + PPL_DIRTY_TEMP(Coefficient, min_den); + bool min_included; + bool min_rhs = minimize(rhs, min_num, min_den, 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; + bool has_more_than_one_var = false; + // Initialization is just to avoid an annoying warning. + dimension_type has_var_id = 0; + for ( ; lhs_space_dim > 0; --lhs_space_dim) + if (lhs.coefficient(Variable(lhs_space_dim - 1)) != 0) { + if (has_var) { + ITV& seq_i = seq[lhs_space_dim - 1]; + seq_i.lower_set(UNBOUNDED); + seq_i.upper_set(UNBOUNDED); + has_more_than_one_var = true; + } + else { + has_var = true; + has_var_id = lhs_space_dim - 1; + } + } + + if (has_more_than_one_var) { + // There is more than one dimension with non-zero coefficient, so + // we cannot have any information about the dimensions in the lhs. + // 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_var = seq[has_var_id]; + seq_var.lower_set(UNBOUNDED); + seq_var.upper_set(UNBOUNDED); + 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_TEMP0(mpq_class, q_max); + PPL_DIRTY_TEMP0(mpq_class, q_min); + if (max_rhs) { + max_num -= inhomo * max_den; + max_den *= coeff; + assign_r(q_max.get_num(), max_num, ROUND_NOT_NEEDED); + assign_r(q_max.get_den(), max_den, ROUND_NOT_NEEDED); + q_max.canonicalize(); + } + if (min_rhs) { + min_num -= inhomo * min_den; + min_den *= coeff; + assign_r(q_min.get_num(), min_num, ROUND_NOT_NEEDED); + assign_r(q_min.get_den(), min_den, 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 +ve. + switch (relsym) { + case LESS_OR_EQUAL: + seq_var.lower_set(UNBOUNDED); + max_rhs + ? seq_var.upper_set(q_max, !max_included) + : seq_var.upper_set(UNBOUNDED); + break; + case LESS_THAN: + seq_var.lower_set(UNBOUNDED); + max_rhs + ? seq_var.upper_set(q_max, true) + : seq_var.upper_set(UNBOUNDED); + break; + case EQUAL: + max_rhs + ? seq_var.upper_set(q_max, !max_included) + : seq_var.upper_set(UNBOUNDED); + min_rhs + ? seq_var.lower_set(q_min, !min_included) + : seq_var.lower_set(UNBOUNDED); + break; + case GREATER_OR_EQUAL: + seq_var.upper_set(UNBOUNDED); + min_rhs + ? seq_var.lower_set(q_min, !min_included) + : seq_var.lower_set(UNBOUNDED); + break; + case GREATER_THAN: + seq_var.upper_set(UNBOUNDED); + min_rhs + ? seq_var.lower_set(q_min, true) + : seq_var.lower_set(UNBOUNDED); + break; + default: + // The NOT_EQUAL case has been already dealt with. + throw std::runtime_error("PPL internal error"); + } + else + // The coefficient of the dimension in the lhs is -ve. + switch (relsym) { + case GREATER_OR_EQUAL: + seq_var.lower_set(UNBOUNDED); + min_rhs + ? seq_var.upper_set(q_min, !min_included) + : seq_var.upper_set(UNBOUNDED); + break; + case GREATER_THAN: + seq_var.lower_set(UNBOUNDED); + min_rhs + ? seq_var.upper_set(q_min, true) + : seq_var.upper_set(UNBOUNDED); + break; + case EQUAL: + max_rhs + ? seq_var.lower_set(q_max, !max_included) + : seq_var.lower_set(UNBOUNDED); + min_rhs + ? seq_var.upper_set(q_min, !min_included) + : seq_var.upper_set(UNBOUNDED); + break; + case LESS_OR_EQUAL: + seq_var.upper_set(UNBOUNDED); + max_rhs + ? seq_var.lower_set(q_max, !max_included) + : seq_var.lower_set(UNBOUNDED); + break; + case LESS_THAN: + seq_var.upper_set(UNBOUNDED); + max_rhs + ? seq_var.lower_set(q_max, true) + : seq_var.lower_set(UNBOUNDED); + break; + default: + // The NOT_EQUAL case has been already dealt with. + throw std::runtime_error("PPL internal error"); + } + } + + 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. + throw std::runtime_error("PPL internal error"); + } + } + assert(OK()); +} + +template +void +Box::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_generic("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 (dimension_type d = lhs_space_dim; d-- > 0; ) { + const Variable& var = Variable(d); + if (lhs.coefficient(var) != 0) { + PPL_DIRTY_TEMP(Coefficient, temp); + temp = rhs.coefficient(var) + lhs.coefficient(var); + revised_rhs -= temp * var; + revised_lhs -= temp * var; + } + } + generalized_affine_image(revised_lhs, relsym, revised_rhs); + assert(OK()); +} + +template +template +void +Box::CC76_widening_assign(const Box& 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); + + assert(OK()); +} + +template +void +Box::CC76_widening_assign(const Box& 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 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 +void +Box::get_limiting_box(const Constraint_System& cs, + Box& limiting_box) const { + const dimension_type cs_space_dim = cs.space_dimension(); + // Private method: the caller has to ensure the following. + assert(cs_space_dim <= 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 (!extract_interval_constraint(c, cs_space_dim, 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 +void +Box::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; + +#ifndef NDEBUG + { + // We assume that `y' is contained in or equal to `*this'. + const Box x_copy = *this; + const Box y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + // If `*this' is empty, since `*this' contains `y', `y' is empty too. + if (marked_empty()) + return; + // If `y' is empty, we return. + if (y.marked_empty()) + return; + + // 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 +void +Box::CC76_narrowing_assign(const Box& y) { + const dimension_type space_dim = space_dimension(); + + // Dimension-compatibility check. + if (space_dim != y.space_dimension()) + throw_dimension_incompatible("CC76_narrowing_assign(y)", y); + +#ifndef NDEBUG + { + // We assume that `*this' is contained in or equal to `y'. + const Box x_copy = *this; + const Box y_copy = y; + assert(y_copy.contains(x_copy)); + } +#endif + + // 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_unbounded() + && !y_i.lower_is_unbounded() + && x_i.lower() != y_i.lower()) + x_i.lower() = y_i.lower(); + if (!x_i.upper_is_unbounded() + && !y_i.upper_is_unbounded() + && x_i.upper() != y_i.upper()) + x_i.upper() = y_i.upper(); + } + assert(OK()); +} + +template +Constraint_System +Box::constraints() const { + Constraint_System cs; + const dimension_type space_dim = space_dimension(); + if (space_dim == 0) { + if (marked_empty()) + cs = Constraint_System::zero_dim_empty(); + } + else if (marked_empty()) + cs.insert(0*Variable(space_dim-1) <= -1); + else { + // KLUDGE: in the future `cs' will be constructed of the right dimension. + // For the time being, we force the dimension with the following line. + cs.insert(0*Variable(space_dim-1) <= 0); + + for (dimension_type k = 0; k < space_dim; ++k) { + bool closed = false; + PPL_DIRTY_TEMP(Coefficient, n); + PPL_DIRTY_TEMP(Coefficient, d); + if (get_lower_bound(k, closed, n, d)) { + if (closed) + cs.insert(d*Variable(k) >= n); + else + cs.insert(d*Variable(k) > n); + } + if (get_upper_bound(k, closed, n, d)) { + if (closed) + cs.insert(d*Variable(k) <= n); + else + cs.insert(d*Variable(k) < n); + } + } + } + return cs; +} + +template +Constraint_System +Box::minimized_constraints() const { + Constraint_System cs; + const dimension_type space_dim = space_dimension(); + if (space_dim == 0) { + if (marked_empty()) + cs = Constraint_System::zero_dim_empty(); + } + // Make sure emptiness is detected. + else if (is_empty()) + cs.insert(0*Variable(space_dim-1) <= -1); + else { + // KLUDGE: in the future `cs' will be constructed of the right dimension. + // For the time being, we force the dimension with the following line. + cs.insert(0*Variable(space_dim-1) <= 0); + + for (dimension_type k = 0; k < space_dim; ++k) { + bool closed = false; + PPL_DIRTY_TEMP(Coefficient, n); + PPL_DIRTY_TEMP(Coefficient, d); + if (get_lower_bound(k, closed, n, d)) { + if (closed) + // Make sure equality constraints are detected. + if (seq[k].is_singleton()) { + cs.insert(d*Variable(k) == n); + continue; + } + else + cs.insert(d*Variable(k) >= n); + else + cs.insert(d*Variable(k) > n); + } + if (get_upper_bound(k, closed, n, d)) { + if (closed) + cs.insert(d*Variable(k) <= n); + else + cs.insert(d*Variable(k) < n); + } + } + } + return cs; +} + +template +Congruence_System +Box::congruences() const { + Congruence_System cgs; + const dimension_type space_dim = space_dimension(); + if (space_dim == 0) { + if (marked_empty()) + cgs = Congruence_System::zero_dim_empty(); + } + // Make sure emptiness is detected. + else if (is_empty()) + cgs.insert((0*Variable(space_dim-1) %= -1) / 0); + else { + // KLUDGE: in the future `cgs' will be constructed of the right dimension. + // For the time being, we force the dimension with the following line. + cgs.insert(0*Variable(space_dim-1) %= 0); + + for (dimension_type k = 0; k < space_dim; ++k) { + bool closed = false; + PPL_DIRTY_TEMP(Coefficient, n); + PPL_DIRTY_TEMP(Coefficient, d); + if (get_lower_bound(k, closed, n, d) && closed) + // Make sure equality congruences are detected. + if (seq[k].is_singleton()) + cgs.insert((d*Variable(k) %= n) / 0); + } + } + return cgs; +} + +template +memory_size_type +Box::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 +std::ostream& +IO_Operators::operator<<(std::ostream& s, const Box& 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 +void +Box::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) + +template +bool +Box::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. + assert(OK()); + return true; +} + +template +void +Box::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 +void +Box +::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 +void +Box::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 +void +Box::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 +void +Box::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 +void +Box::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 +void +Box::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 +void +Box::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 +void +Box::throw_expression_too_complex(const char* method, + const Linear_Expression& e) { + using namespace IO_Operators; + std::ostringstream s; + s << "PPL::Box::" << method << ":" << std::endl + << e << " is too complex."; + throw std::invalid_argument(s.str()); +} + +template +void +Box::throw_dimension_incompatible(const char* method, + const char* name_row, + const Linear_Expression& e) const { + std::ostringstream s; + s << "PPL::Box::" << method << ":" << std::endl + << "this->space_dimension() == " << space_dimension() + << ", " << name_row << "->space_dimension() == " + << e.space_dimension() << "."; + throw std::invalid_argument(s.str()); +} + +template +void +Box::throw_generic(const char* method, const char* reason) { + std::ostringstream s; + s << "PPL::Box::" << method << ":" << std::endl + << reason; + throw std::invalid_argument(s.str()); +} + +template +void +Box::throw_space_dimension_overflow(const char* method, + const char* reason) { + std::ostringstream s; + s << "PPL::Box::" << method << ":" << std::endl + << reason; + throw std::length_error(s.str()); +} + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates Box */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +bool +l_m_distance_assign(Checked_Number& r, + const Box& x, const Box& 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_unbounded()) { + if (!y_i.lower_is_unbounded()) + goto pinf; + } + else if (y_i.lower_is_unbounded()) + 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); + assert(sgn(tmp1) >= 0); + Specialization::combine(tmp0, tmp1, dir); + } + // Dealing with the lower bounds. + if (x_i.upper_is_unbounded()) + if (y_i.upper_is_unbounded()) + continue; + else + goto pinf; + else if (y_i.upper_is_unbounded()) + 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); + 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..6b4796d --- /dev/null +++ b/src/Box.types.hh @@ -0,0 +1,22 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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 +class Box; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Box_types_hh) diff --git a/src/Box_Status.idefs.hh b/src/Box_Status.idefs.hh new file mode 100644 index 0000000..5eb6110 --- /dev/null +++ b/src/Box_Status.idefs.hh @@ -0,0 +1,114 @@ +/* Box::Status class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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 object. +/*! \ingroup PPL_CXX_interface + The assertions supported are: + - empty up-to-date: the empty flag is meaningful; + - empty: the box is the empty set. + - universe: 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: + - empty up-to-date and empty excludes universe. +*/ +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 + Status(const typename Box::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 true if successful, false 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 all bits in \p mask are set. + bool test_all(flags_t mask) const; + + //! Check whether at least one 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..eabe03a --- /dev/null +++ b/src/Box_Status.inlines.hh @@ -0,0 +1,227 @@ +/* Box::Status class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Box_Status_inlines_hh +#define PPL_Box_Status_inlines_hh 1 + +#include + +namespace Parma_Polyhedra_Library { + +template +inline +Box::Status::Status(flags_t mask) + : flags(mask) { +} + +template +inline +Box::Status::Status(const Status& y) + : flags(y.flags) { +} + +template +template +inline +Box::Status::Status(const typename Box::Status& y) + : flags(y.flags) { +} + +template +inline +Box::Status::Status() + : flags(NONE) { +} + +template +inline bool +Box::Status::test_all(flags_t mask) const { + return (flags & mask) == mask; +} + +template +inline bool +Box::Status::test_any(flags_t mask) const { + return flags & mask; +} + +template +inline void +Box::Status::set(flags_t mask) { + flags |= mask; +} + +template +inline void +Box::Status::reset(flags_t mask) { + flags &= ~mask; +} + +template +inline bool +Box::Status::test_empty_up_to_date() const { + return test_any(EMPTY_UP_TO_DATE); +} + +template +inline void +Box::Status::reset_empty_up_to_date() { + reset(EMPTY_UP_TO_DATE); +} + +template +inline void +Box::Status::set_empty_up_to_date() { + set(EMPTY_UP_TO_DATE); +} + +template +inline bool +Box::Status::test_empty() const { + return test_any(EMPTY); +} + +template +inline void +Box::Status::reset_empty() { + reset(EMPTY); +} + +template +inline void +Box::Status::set_empty() { + set(EMPTY); +} + +template +inline bool +Box::Status::test_universe() const { + return test_any(UNIVERSE); +} + +template +inline void +Box::Status::reset_universe() { + reset(UNIVERSE); +} + +template +inline void +Box::Status::set_universe() { + set(UNIVERSE); +} + +template +bool +Box::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 sep = ' '; + +/*! \relates Parma_Polyhedra_Library::Box::Status + Reads a keyword and its associated on/off flag from \p s. + Returns true if the operation is successful, + returns false otherwise. + When successful, \p positive is set to true if the flag + is on; it is set to false 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 +void +Box::Status::ascii_dump(std::ostream& s) const { + using namespace Implementation::Boxes; + s << (test_empty_up_to_date() ? yes : no) << empty_up_to_date << sep + << (test_empty() ? yes : no) << empty << sep + << (test_universe() ? yes : no) << universe << sep; +} + +PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(ITV, Box::Status) + +template +bool +Box::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. + assert(OK()); + return true; +} + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Box_Status_inlines_hh) diff --git a/src/COPYING.cc.dist b/src/COPYING.cc.dist new file mode 100644 index 0000000..04994b1 --- /dev/null +++ b/src/COPYING.cc.dist @@ -0,0 +1,676 @@ +extern const char* const COPYING_array[] = { + " GNU GENERAL PUBLIC LICENSE", + " Version 3, 29 June 2007", + "", + " Copyright (C) 2007 Free Software Foundation, Inc. ", + " 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.", + "", + " ", + " Copyright (C) ", + "", + " 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 .", + "", + "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:", + "", + " Copyright (C) ", + " 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", + ".", + "", + " 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", + ".", + 0}; diff --git a/src/CREDITS.cc.dist b/src/CREDITS.cc.dist new file mode 100644 index 0000000..90e0ee6 --- /dev/null +++ b/src/CREDITS.cc.dist @@ -0,0 +1,410 @@ +extern const char* const CREDITS_array[] = { + "", + "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] (University of Parma)", + " Patricia M. Hill [2] (University of Leeds)", + " Enea Zaffanella [3] (University of Parma)", + "", + "", + "Former Members of the Core Development Team:", + "--------------------------------------------", + "", + " Elisa Ricci (former student of the University of Parma,", + " 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:", + "---------------------", + "", + " Abramo Bagnara (Opera Unica) rewrote and generalized the", + " support for checked coefficients. He also", + " wrote the support for extended numbers and is", + " currently writing a new implementation of", + " intervals. He also helps on several other", + " design and implementation issues.", + "", + " 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.", + "", + " Katy Dobson [4] (University of Leeds) is working on the", + " formalization and definition of algorithms for", + " rational grids and products of grids and", + " polyhedra.", + "", + " Enric Rodriguez Carbonell [5] (Technical University of Catalonia) is", + " working on the implementation of polynomial spaces.", + "", + " Alessandro Zaccagnini [6] (University of Parma) has helped with", + " the efficient implementation of GCD and LCM", + " for checked numbers. He is now working on the", + " definitions of interval arithmetic operations.", + " Alessandro is always a very valuable source of", + " mathematical advice.", + "", + "", + "Past Contributors:", + "------------------", + "", + " Irene Bacchi (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.", + "", + " 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.", + "", + " Giordano Fracasso (University of Parma) wrote the initial version", + " of the support for native and checked integer", + " coefficients.", + "", + " Maximiliano Marchesi (former student of the University of Parma)", + " helped a little to improve the documentation for", + " bounded differences.", + "", + " Elena Mazzi (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 [7] (formerly at the University of Leeds) worked", + " on the implementation of rational grids. He has", + " also helped on other implementation issues.", + "", + " Andrea Pescetti (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.", + "", + " Angela Stazzone (former student of the University of Parma)", + " worked on the library's documentation.", + "", + " Fabio Trabucchi (University of Parma) worked on a development", + " branch where he added serializers for all the", + " objects of the PPL. Support for serialization", + " based on Fabio's work will be available in a", + " future release of the library.", + "", + " Claudio Trento (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) made it possible (by writing the", + " AC_LIB_LINKFLAGS macro and explaining how", + " to use it) to allow the use of versions of the", + " GMP library installed 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.", + "", + " 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 hash code 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] is supporting 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];", + "", + "- 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'' [63];", + "", + "- Royal Society International Outgoing Short Visit 2007/R4", + " ``Finding and Verifying the Absence of Bugs in Imperative Programs'' [64];", + "", + "- EPSRC (UK) project EP/G025177/1", + " ``Geometric Abstractions for Scalable Program Analyzers'' [64].", + "", + "--------", + "", + " [1] http://www.cs.unipr.it/~bagnara/", + " [2] http://www.comp.leeds.ac.uk/hill/", + " [3] http://www.cs.unipr.it/~zaffanella/", + " [4] http://www.comp.leeds.ac.uk/katyd/", + " [5] http://www.lsi.upc.edu/~erodri/", + " [6] http://www.math.unipr.it/~zaccagni/", + " [7] http://www.mundell.ukfsn.org/", + " [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://www.cs.unipr.it/ppl/Documentation/chernikova.c", + "[23] http://www.cs.unipr.it/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.comp.leeds.ac.uk/hill/chiara/WWW/linda.html", + "[64] http://www.comp.leeds.ac.uk/hill/chiara/WWW/projects.html", + 0}; diff --git a/src/C_Integer.hh b/src/C_Integer.hh new file mode 100644 index 0000000..86df040 --- /dev/null +++ b/src/C_Integer.hh @@ -0,0 +1,175 @@ +/* C integers info. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_C_Integer_hh +#define PPL_C_Integer_hh 1 + +#include "meta_programming.hh" +#include + +// 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 +struct C_Integer : public False { }; + +template <> +struct C_Integer : public True { + enum { 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 = SCHAR_MIN; + static const signed char max = SCHAR_MAX; +}; + +template <> +struct C_Integer : public True { + enum { 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 = SHRT_MIN; + static const signed short max = SHRT_MAX; +}; + +template <> +struct C_Integer : public True { + enum { 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 : public True { + enum { 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 : public True { + enum { 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 : public True { + enum { 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 = 0; + static const unsigned char max = UCHAR_MAX; +}; + +template <> +struct C_Integer : public True { + enum { 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 = 0; + static const unsigned short max = USHRT_MAX; +}; + +template <> +struct C_Integer : public True { + enum { 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 = 0; + static const unsigned int max = UINT_MAX; +}; + +template <> +struct C_Integer : public True { + enum { 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 = 0; + static const unsigned long max = ULONG_MAX; +}; + +template <> +struct C_Integer : public True { + enum { 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 = 0; + 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..54fca8c --- /dev/null +++ b/src/C_Polyhedron.cc @@ -0,0 +1,99 @@ +/* C_Polyhedron class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#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; + add_constraint(c.is_strict_inequality() ? (Linear_Expression(c) >= 0) : c); + } + assert(OK()); +} + +PPL::C_Polyhedron::C_Polyhedron(const Congruence_System& cgs) + : Polyhedron(NECESSARILY_CLOSED, + cgs.space_dimension() <= max_space_dimension() + ? cgs.space_dimension() + : (throw_space_dimension_overflow(NECESSARILY_CLOSED, + "C_Polyhedron(cgs)", + "the space dimension of cgs " + "exceeds the maximum allowed " + "space dimension"), 0), + UNIVERSE) { + add_congruences(cgs); +} + +PPL::C_Polyhedron::C_Polyhedron(Congruence_System& cgs, Recycle_Input) + : Polyhedron(NECESSARILY_CLOSED, + cgs.space_dimension() <= max_space_dimension() + ? cgs.space_dimension() + : (throw_space_dimension_overflow(NECESSARILY_CLOSED, + "NNC_Polyhedron" + "(cgs, recycle)", + "the space dimension of cgs " + "exceeds the maximum allowed " + "space dimension"), 0), + UNIVERSE) { + add_congruences(cgs); +} + +PPL::C_Polyhedron::C_Polyhedron(const Grid& grid, Complexity_Class) + : Polyhedron(NECESSARILY_CLOSED, + grid.space_dimension() <= max_space_dimension() + ? grid.space_dimension() + : (throw_space_dimension_overflow(NECESSARILY_CLOSED, + "C_Polyhedron(grid)", + "the space dimension of grid " + "exceeds the maximum allowed " + "space dimension"), 0), + 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 +} diff --git a/src/C_Polyhedron.defs.hh b/src/C_Polyhedron.defs.hh new file mode 100644 index 0000000..ba37c57 --- /dev/null +++ b/src/C_Polyhedron.defs.hh @@ -0,0 +1,279 @@ +/* C_Polyhedron class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_C_Polyhedron_defs_hh +#define PPL_C_Polyhedron_defs_hh 1 + +#include "C_Polyhedron.types.hh" +#include "NNC_Polyhedron.types.hh" +#include "Polyhedron.defs.hh" +#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 + topologically closed 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 strict inequality constraint. + Similarly, an exception is thrown when building a closed polyhedron + starting from a system of generators containing a closure point. + + \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 const 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 const 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 const 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 + explicit C_Polyhedron(const Box& 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 + explicit C_Polyhedron(const BD_Shape& 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 + explicit C_Polyhedron(const Octagonal_Shape& 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 true is returned, + otherwise false is returned. + + \exception std::invalid_argument + Thrown if \p *this and \p y are dimension-incompatible. + */ + bool poly_hull_assign_if_exact(const C_Polyhedron& y); + + //! Same as poly_hull_assign_if_exact(y). + bool upper_bound_assign_if_exact(const C_Polyhedron& y); +}; + +#include "C_Polyhedron.inlines.hh" + +#endif // !defined(PPL_C_Polyhedron_defs_hh) diff --git a/src/C_Polyhedron.inlines.hh b/src/C_Polyhedron.inlines.hh new file mode 100644 index 0000000..2239295 --- /dev/null +++ b/src/C_Polyhedron.inlines.hh @@ -0,0 +1,167 @@ +/* C_Polyhedron class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_C_Polyhedron_inlines_hh +#define PPL_C_Polyhedron_inlines_hh 1 + +#include +#include + +namespace Parma_Polyhedra_Library { + +inline +C_Polyhedron::~C_Polyhedron() { +} + +inline +C_Polyhedron::C_Polyhedron(dimension_type num_dimensions, + Degenerate_Element kind) + : Polyhedron(NECESSARILY_CLOSED, + num_dimensions <= max_space_dimension() + ? num_dimensions + : (throw_space_dimension_overflow(NECESSARILY_CLOSED, + "C_Polyhedron(n, k)", + "n exceeds the maximum " + "allowed space dimension"), + num_dimensions), + kind) { +} + +inline +C_Polyhedron::C_Polyhedron(const Constraint_System& cs) + : Polyhedron(NECESSARILY_CLOSED, + cs.space_dimension() <= max_space_dimension() + ? cs + : (throw_space_dimension_overflow(NECESSARILY_CLOSED, + "C_Polyhedron(cs)", + "the space dimension of cs " + "exceeds the maximum allowed " + "space dimension"), cs)) { +} + +inline +C_Polyhedron::C_Polyhedron(Constraint_System& cs, Recycle_Input) + : Polyhedron(NECESSARILY_CLOSED, + cs.space_dimension() <= max_space_dimension() + ? cs + : (throw_space_dimension_overflow(NECESSARILY_CLOSED, + "C_Polyhedron(cs, recycle)", + "the space dimension of cs " + "exceeds the maximum allowed " + "space dimension"), cs), + Recycle_Input()) { +} + +inline +C_Polyhedron::C_Polyhedron(const Generator_System& gs) + : Polyhedron(NECESSARILY_CLOSED, + gs.space_dimension() <= max_space_dimension() + ? gs + : (throw_space_dimension_overflow(NECESSARILY_CLOSED, + "C_Polyhedron(gs)", + "the space dimension of gs " + "exceeds the maximum allowed " + "space dimension"), gs)) { +} + +inline +C_Polyhedron::C_Polyhedron(Generator_System& gs, Recycle_Input) + : Polyhedron(NECESSARILY_CLOSED, + gs.space_dimension() <= max_space_dimension() + ? gs + : (throw_space_dimension_overflow(NECESSARILY_CLOSED, + "C_Polyhedron(gs, recycle)", + "the space dimension of gs " + "exceeds the maximum allowed " + "space dimension"), gs), + Recycle_Input()) { +} + +template +inline +C_Polyhedron::C_Polyhedron(const Box& box, Complexity_Class) + : Polyhedron(NECESSARILY_CLOSED, + box.space_dimension() <= max_space_dimension() + ? box + : (throw_space_dimension_overflow(NECESSARILY_CLOSED, + "C_Polyhedron(box): ", + "the space dimension of box " + "exceeds the maximum allowed " + "space dimension"), box)) { +} + +template +inline +C_Polyhedron::C_Polyhedron(const BD_Shape& bd, Complexity_Class) + : Polyhedron(NECESSARILY_CLOSED, + bd.space_dimension() <= max_space_dimension() + ? bd.space_dimension() + : (throw_space_dimension_overflow(NECESSARILY_CLOSED, + "C_Polyhedron(bd): ", + "the space dimension of bd " + "exceeds the maximum allowed " + "space dimension"), 0), + UNIVERSE) { + add_constraints(bd.constraints()); +} + +template +inline +C_Polyhedron::C_Polyhedron(const Octagonal_Shape& os, Complexity_Class) + : Polyhedron(NECESSARILY_CLOSED, + os.space_dimension() <= max_space_dimension() + ? os.space_dimension() + : (throw_space_dimension_overflow(NECESSARILY_CLOSED, + "C_Polyhedron(os): ", + "the space dimension of os " + "exceeds the maximum allowed " + "space dimension"), 0), + 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); + 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..90945c2 --- /dev/null +++ b/src/C_Polyhedron.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PPL_C_Polyhedron_types_hh +#define PPL_C_Polyhedron_types_hh 1 + +namespace Parma_Polyhedra_Library { + +class C_Polyhedron; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_C_Polyhedron_types_hh) diff --git a/src/Checked_Number.cc b/src/Checked_Number.cc new file mode 100644 index 0000000..599de10 --- /dev/null +++ b/src/Checked_Number.cc @@ -0,0 +1,85 @@ +/* Checked_Number class implementation + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include +#include "Checked_Number.defs.hh" + +namespace Parma_Polyhedra_Library { + +void +throw_result_exception(Result r) { + switch (r) { + case V_LT: + throw std::logic_error("Exact result is less than computed one."); + case V_LE: + throw std::logic_error("Exact result is less than or equal to " + "computed one."); + case V_GT: + throw std::logic_error("Exact result is greater than computed one."); + case V_GE: + throw std::logic_error("Exact result is greater than or equal to " + "computed one."); + case V_NE: + throw std::logic_error("Exact result is less than or greater than " + "computed one."); + case V_LGE: + throw std::logic_error("Exact result is less than, greater than or " + "equal to computed one."); + case VC_MINUS_INFINITY: + throw std::overflow_error("Minus infinity."); + case V_NEG_OVERFLOW: + throw std::overflow_error("Negative overflow."); + case V_UNKNOWN_NEG_OVERFLOW: + throw std::overflow_error("Unknown result due to negative overflow."); + case VC_PLUS_INFINITY: + throw std::overflow_error("Plus infinity."); + case V_POS_OVERFLOW: + throw std::overflow_error("Positive overflow."); + case V_UNKNOWN_POS_OVERFLOW: + throw std::overflow_error("Unknown result due to positive overflow."); + case V_CVT_STR_UNK: + throw std::domain_error("Invalid numeric string."); + case V_DIV_ZERO: + throw std::domain_error("Division by zero."); + case V_INF_ADD_INF: + throw std::domain_error("Infinities addition."); + case V_INF_DIV_INF: + throw std::domain_error("Infinities division."); + case V_INF_MOD: + throw std::domain_error("Remainder of division of infinity."); + case V_INF_MUL_ZERO: + throw std::domain_error("Multiplication of infinity and zero."); + case V_INF_SUB_INF: + throw std::domain_error("Subtraction of infinities."); + case V_MOD_ZERO: + throw std::domain_error("Remainder of division by zero."); + case V_SQRT_NEG: + throw std::domain_error("Square root of negative number."); + case V_UNORD_COMP: + throw std::domain_error("Unordered comparison."); + default: + throw std::logic_error("Unexpected result."); + } +} + +} // namespace Parma_Polyhedra_Library + diff --git a/src/Checked_Number.defs.hh b/src/Checked_Number.defs.hh new file mode 100644 index 0000000..cc24ad7 --- /dev/null +++ b/src/Checked_Number.defs.hh @@ -0,0 +1,1077 @@ +/* Checked_Number class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Checked_Number_defs_hh +#define PPL_Checked_Number_defs_hh 1 + +#include "Checked_Number.types.hh" +#include "checked.defs.hh" +#include "meta_programming.hh" +#include "Slow_Copy.hh" +#include + +namespace Parma_Polyhedra_Library { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +struct Checked_Number_Default_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, false); + const_bool_nodef(has_infinity, false); + const_bool_nodef(convertible, true); + const_bool_nodef(fpu_check_inexact, true); + const_bool_nodef(check_nan_result, true); + static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE; + static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE; + static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE; + static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_NATIVE; + static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_NATIVE; + static void handle_result(Result r); +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \ingroup PPL_CXX_interface */ +#endif // 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); + // Do not uncomment the following. + // The compile time error on conversions is the expected behavior. + // const_bool_nodef(convertible, false); + const_bool_nodef(fpu_check_inexact, true); + const_bool_nodef(check_nan_result, true); + // Do not uncomment the following. + // The compile time error is the expected behavior. + // static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_UP; + // static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_UP; + // static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_UP; + // static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_UP; + // static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_UP; + static void handle_result(Result r); +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +struct WRD_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); + // Do not uncomment the following. + // The compile time error on conversions is the expected behavior. + // const_bool_nodef(convertible, false); + const_bool_nodef(fpu_check_inexact, true); + const_bool_nodef(check_nan_result, false); + // Do not uncomment the following. + // The compile time error is the expected behavior. + // static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_UP; + // static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_UP; + // static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_UP; + // static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_UP; + // static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_UP; + static void handle_result(Result r); +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! A policy checking for overflows. +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +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::has_quiet_NaN); + const_bool_nodef(has_infinity, std::numeric_limits::has_infinity); + const_bool_nodef(convertible, true); + const_bool_nodef(fpu_check_inexact, true); + const_bool_nodef(check_nan_result, true); +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +struct Native_Checked_From_Wrapper; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +struct Native_Checked_From_Wrapper::value>::type> { + typedef Checked_Number_Transparent_Policy 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 +struct Native_Checked_From_Wrapper > { + typedef P Policy; + static const T& raw_value(const Checked_Number& v) { + return v.raw_value(); + } +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +struct Native_Checked_To_Wrapper; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +struct Native_Checked_To_Wrapper::value>::type> { + typedef Check_Overflow_Policy 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 +struct Native_Checked_To_Wrapper > { + typedef P Policy; + static T& raw_value(Checked_Number& v) { + return v.raw_value(); + } +}; + +/*! \ingroup PPL_CXX_interface */ +template +struct Is_Checked : public False { }; + +/*! \ingroup PPL_CXX_interface */ +template +struct Is_Checked > : public True { }; + +/*! \ingroup PPL_CXX_interface */ +template +struct Is_Native_Or_Checked + : public Bool::value || Is_Checked::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 +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 + Checked_Number(const Checked_Number& 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 + Checked_Number(const From&, Rounding_Dir dir, typename Enable_If::value, bool>::type ignored = false); + + //! Direct initialization from a Checked_Number, default rounding mode. + template + explicit Checked_Number(const Checked_Number& 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 + Checked_Number(const From&, typename Enable_If::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 true; + - whether \p *this is a (positive or negative) infinity, + if \p inf is true; + - the sign of \p *this, + if \p sign is true. + */ + 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 + Checked_Number& operator=(const From& y); + + //! Add and assign operator. + template + Checked_Number& operator+=(const Checked_Number& y); + + //! Add and assign operator. + Checked_Number& operator+=(const T& y); + + //! Add and assign operator. + template + typename Enable_If::value, + Checked_Number&>::type + operator+=(const From& y); + + //! Subtract and assign operator. + template + Checked_Number& operator-=(const Checked_Number& y); + + //! Subtract and assign operator. + Checked_Number& operator-=(const T& y); + + //! Subtract and assign operator. + template + typename Enable_If::value, + Checked_Number&>::type + operator-=(const From& y); + + //! Multiply and assign operator. + template + Checked_Number& operator*=(const Checked_Number& y); + + //! Multiply and assign operator. + Checked_Number& operator*=(const T& y); + + //! Multiply and assign operator. + template + typename Enable_If::value, + Checked_Number&>::type + operator*=(const From& y); + + //! Divide and assign operator. + template + Checked_Number& operator/=(const Checked_Number& y); + + //! Divide and assign operator. + Checked_Number& operator/=(const T& y); + + //! Divide and assign operator. + template + typename Enable_If::value, + Checked_Number&>::type + operator/=(const From& y); + + //! Compute remainder and assign operator. + template + Checked_Number& operator%=(const Checked_Number& y); + + //! Compute remainder and assign operator. + Checked_Number& operator%=(const T& y); + + //! Compute remainder and assign operator. + template + typename Enable_If::value, + Checked_Number& >::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 +struct Slow_Copy > : public Bool::value> {}; + +/*! \relates Checked_Number */ +template +typename Enable_If::value, bool>::type +is_not_a_number(const T& x); + +/*! \relates Checked_Number */ +template +typename Enable_If::value, bool>::type +is_minus_infinity(const T& x); + +/*! \relates Checked_Number */ +template +typename Enable_If::value, bool>::type +is_plus_infinity(const T& x); + +/*! \relates Checked_Number */ +template +typename Enable_If::value, int>::type +is_infinity(const T& x); + +/*! \relates Checked_Number */ +template +typename Enable_If::value, bool>::type +is_integer(const T& x); + +/*! \relates Checked_Number */ +template +typename Enable_If::value && Is_Special::value, Result>::type +construct(To& to, const From& x, Rounding_Dir dir); + +/*! \relates Checked_Number */ +template +typename Enable_If::value && Is_Special::value, Result>::type +assign_r(To& to, const From& x, Rounding_Dir dir); + +/*! \relates Checked_Number */ +template +typename Enable_If::value, Result>::type +assign_r(To& to, const char* x, Rounding_Dir dir); + +/*! \relates Checked_Number */ +template +typename Enable_If::value, Result>::type +assign_r(To& to, char* x, Rounding_Dir dir); + +#define FUNC1(name) \ +template \ +typename Enable_If::value \ + && Is_Native_Or_Checked::value, \ + Result>::type \ +name(To& to, const From& x, Rounding_Dir dir); + +FUNC1(assign_r) +FUNC1(floor_assign_r) +FUNC1(ceil_assign_r) +FUNC1(trunc_assign_r) +FUNC1(neg_assign_r) +FUNC1(abs_assign_r) +FUNC1(sqrt_assign_r) + +#undef FUNC1 + +#define FUNC1(name) \ +template \ +typename Enable_If::value \ + && Is_Native_Or_Checked::value, \ + Result>::type \ +name(To& to, const From& x, int exp, Rounding_Dir dir); + +FUNC1(mul2exp_assign_r) +FUNC1(div2exp_assign_r) + +#undef FUNC1 + +#define FUNC2(name) \ +template \ +typename Enable_If::value \ + && Is_Native_Or_Checked::value \ + && Is_Native_Or_Checked::value, \ + Result>::type \ +name(To& to, const From1& x, const From2& y, Rounding_Dir dir); + +FUNC2(add_assign_r) +FUNC2(sub_assign_r) +FUNC2(mul_assign_r) +FUNC2(div_assign_r) +FUNC2(idiv_assign_r) +FUNC2(rem_assign_r) +FUNC2(gcd_assign_r) +FUNC2(lcm_assign_r) +FUNC2(add_mul_assign_r) +FUNC2(sub_mul_assign_r) + +#undef FUNC2 + +#define FUNC4(name) \ +template \ +typename Enable_If::value \ + && Is_Native_Or_Checked::value \ + && Is_Native_Or_Checked::value \ + && Is_Native_Or_Checked::value \ + && Is_Native_Or_Checked::value, \ + Result>::type \ +name(To1& to, To2& s, To3& t, \ + const From1& x, const From2& y, \ + Rounding_Dir dir); + +FUNC4(gcdext_assign_r) + +#undef 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 +size_t +total_memory_in_bytes(const Checked_Number& x); + +//! Returns the size in bytes of the memory managed by \p x. +/*! \relates Checked_Number */ +template +memory_size_type +external_memory_in_bytes(const Checked_Number& x); + +//@} // Memory Size Inspection Functions + +//! \name Arithmetic Operators +//@{ + +//! Unary plus operator. +/*! \relates Checked_Number */ +template +Checked_Number +operator+(const Checked_Number& x); + +//! Unary minus operator. +/*! \relates Checked_Number */ +template +Checked_Number +operator-(const Checked_Number& x); + +//! Assigns to \p x largest integral value not greater than \p x. +/*! \relates Checked_Number */ +template +void +floor_assign(Checked_Number& x); + +//! Assigns to \p x largest integral value not greater than \p y. +/*! \relates Checked_Number */ +template +void +floor_assign(Checked_Number& x, const Checked_Number& y); + +//! Assigns to \p x smallest integral value not less than \p x. +/*! \relates Checked_Number */ +template +void +ceil_assign(Checked_Number& x); + +//! Assigns to \p x smallest integral value not less than \p y. +/*! \relates Checked_Number */ +template +void +ceil_assign(Checked_Number& x, const Checked_Number& y); + +//! Round \p x to the nearest integer not larger in absolute value. +/*! \relates Checked_Number */ +template +void +trunc_assign(Checked_Number& x); + +//! Assigns to \p x the value of \p y rounded to the nearest integer not larger in absolute value. +/*! \relates Checked_Number */ +template +void +trunc_assign(Checked_Number& x, const Checked_Number& y); + +//! Assigns to \p x its negation. +/*! \relates Checked_Number */ +template +void +neg_assign(Checked_Number& x); + +//! Assigns to \p x the negation of \p y. +/*! \relates Checked_Number */ +template +void +neg_assign(Checked_Number& x, const Checked_Number& y); + +//! Assigns to \p x its absolute value. +/*! \relates Checked_Number */ +template +void +abs_assign(Checked_Number& x); + +//! Assigns to \p x the absolute value of \p y. +/*! \relates Checked_Number */ +template +void +abs_assign(Checked_Number& x, const Checked_Number& y); + +//! Assigns to \p x the value x + y * z. +/*! \relates Checked_Number */ +template +void +add_mul_assign(Checked_Number& x, + const Checked_Number& y, + const Checked_Number& z); + +//! Assigns to \p x the value x - y * z. +/*! \relates Checked_Number */ +template +void +sub_mul_assign(Checked_Number& x, + const Checked_Number& y, + const Checked_Number& z); + +//! Assigns to \p x the greatest common divisor of \p y and \p z. +/*! \relates Checked_Number */ +template +void +gcd_assign(Checked_Number& x, + const Checked_Number& y, + const Checked_Number& 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 +void +gcdext_assign(Checked_Number& x, + Checked_Number& s, + Checked_Number& t, + const Checked_Number& y, + const Checked_Number& z); + +//! Assigns to \p x the least common multiple of \p y and \p z. +/*! \relates Checked_Number */ +template +void +lcm_assign(Checked_Number& x, + const Checked_Number& y, + const Checked_Number& z); + +/*! \brief + If \p z divides \p y, assigns to \p x the quotient of the integer + division of \p y and \p z. + + \relates Checked_Number + The behavior is undefined if \p z does not divide \p y. +*/ +template +void +exact_div_assign(Checked_Number& x, + const Checked_Number& y, + const Checked_Number& z); + +//! Assigns to \p x the integer square root of \p y. +/*! \relates Checked_Number */ +template +void sqrt_assign(Checked_Number& x, + const Checked_Number& y); + +//@} // Arithmetic Operators + + +//! \name Relational Operators and Comparison Functions +//@{ + +//! Equality operator. +/*! \relates Checked_Number */ +template +inline +typename Enable_If::value + && Is_Native_Or_Checked::value + && (Is_Checked::value || Is_Checked::value), + bool>::type +operator==(const T1& x, const T2& y); + +template +inline typename Enable_If::value + && Is_Native_Or_Checked::value, + bool>::type +equal(const T1& x, const T2& y); + +//! Disequality operator. +/*! \relates Checked_Number */ +template +inline +typename Enable_If::value + && Is_Native_Or_Checked::value + && (Is_Checked::value || Is_Checked::value), + bool>::type +operator!=(const T1& x, const T2& y); + +template +inline typename Enable_If::value + && Is_Native_Or_Checked::value, + bool>::type +not_equal(const T1& x, const T2& y); + +//! Greater than or equal to operator. +/*! \relates Checked_Number */ +template +inline +typename Enable_If::value + && Is_Native_Or_Checked::value + && (Is_Checked::value || Is_Checked::value), + bool>::type +operator>=(const T1& x, const T2& y); + +template +inline typename Enable_If::value + && Is_Native_Or_Checked::value, + bool>::type +greater_or_equal(const T1& x, const T2& y); + +//! Greater than operator. +/*! \relates Checked_Number */ +template +inline +typename Enable_If::value + && Is_Native_Or_Checked::value + && (Is_Checked::value || Is_Checked::value), + bool>::type +operator>(const T1& x, const T2& y); + +template +inline typename Enable_If::value + && Is_Native_Or_Checked::value, + bool>::type +greater_than(const T1& x, const T2& y); + +//! Less than or equal to operator. +/*! \relates Checked_Number */ +template +inline +typename Enable_If::value + && Is_Native_Or_Checked::value + && (Is_Checked::value || Is_Checked::value), + bool>::type +operator<=(const T1& x, const T2& y); + +template +inline typename Enable_If::value + && Is_Native_Or_Checked::value, + bool>::type +less_or_equal(const T1& x, const T2& y); + +//! Less than operator. +/*! \relates Checked_Number */ +template +inline +typename Enable_If::value + && Is_Native_Or_Checked::value + && (Is_Checked::value || Is_Checked::value), + bool>::type +operator<(const T1& x, const T2& y); + +template +inline typename Enable_If::value + && Is_Native_Or_Checked::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 +inline typename Enable_If::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 +inline typename Enable_If::value + && Is_Native_Or_Checked::value, + int>::type +cmp(const From1& x, const From2& y); + +//@} // Relational Operators and Comparison Functions + +//! \name Input-Output Operators +//@{ + +/*! \relates Checked_Number */ +template +typename Enable_If::value, Result>::type +output(std::ostream& os, + const T& x, + const Numeric_Format& fmt, + Rounding_Dir dir); + +//! Output operator. +/*! \relates Checked_Number */ +template +std::ostream& +operator<<(std::ostream& os, const Checked_Number& x); + +//! Ascii dump for native or checked. +template +typename Enable_If::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 34976098, + -77 and +13; + - base-10 integer numbers in scientific notation as 15e2 + and 15*^2 (both meaning \f$15 \cdot 10^2 = 1500\f$), + 9200e-2 and -18*^+11111111111111111; + - base-10 rational numbers in fraction notation as + 15/3 and 15/-3; + - base-10 rational numbers in fraction/scientific notation as + 15/30e-1 (meaning \f$5\f$) and 15*^-3/29e2 + (meaning \f$3/580000\f$); + - base-10 rational numbers in floating point notation as + 71.3 (meaning \f$713/10\f$) and + -0.123456 (meaning \f$-1929/15625\f$); + - base-10 rational numbers in floating point scientific notation as + 2.2e-1 (meaning \f$11/50\f$) and -2.20001*^+3 + (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 + 2^^11 (meaning \f$3\f$), + 36^^z (meaning \f$35\f$), + 36^^xyz (meaning \f$44027\f$), + 2^^11.1 (meaning \f$7/2\f$), + 10^^2e3 (meaning \f$2000\f$), + 8^^2e3 (meaning \f$1024\f$), + 8^^2.1e3 (meaning \f$1088\f$), + 8^^20402543.120347e7 (meaning \f$9073863231288\f$), + 8^^2.1 (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 e is interpreted as a digit, so that + 16^^1e2 (meaning \f$482\f$) is different from + 16^^1*^2 (meaning \f$256\f$); + - the C-style hexadecimal prefix 0x is interpreted as + the Mathematica-style prefix 16^^; + - special values like inf and +inf + (meaning \f$+\infty\f$), -inf (meaning \f$-\infty\f$), + and nan (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 + case insensitive, that the syntactic category + BDIGIT is further restricted by the current base + and that for all bases above 14, any e 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 +number : NAN INF : 'inf' + | SIGN INF ; + | INF + | num NAN : 'nan' + | num DIV num ; + ; + SIGN : '-' +num : unum | '+' + | SIGN unum ; + +unum : unum1 EXP : 'e' + | HEX unum1 | '*^' + | base BASE unum1 ; + ; + POINT : '.' +unum1 : mantissa ; + | mantissa EXP exponent + ; DIV : '/' + ; +mantissa: bdigits + | POINT bdigits MINUS : '-' + | bdigits POINT ; + | bdigits POINT bdigits + ; PLUS : '+' + ; +exponent: SIGN digits + | digits HEX : '0x' + ; ; + +bdigits : BDIGIT BASE : '^^' + | bdigits BDIGIT ; + ; + DIGIT : '0' .. '9' +digits : DIGIT ; + | digits DIGIT + ; BDIGIT : '0' .. '9' + | 'a' .. 'z' + ; +\endcode +*/ +template +typename Enable_If::value, Result>::type +input(T& x, std::istream& is, Rounding_Dir dir); + +//! Input operator. +/*! \relates Checked_Number */ +template +std::istream& +operator>>(std::istream& is, Checked_Number& x); + +//! Ascii load for native or checked. +template +typename Enable_If::value, bool>::type +ascii_load(std::ostream& s, T& t); + +//@} // Input-Output Operators + +void throw_result_exception(Result r); + +template +T +plus_infinity(); + +template +T +minus_infinity(); + +template +T +not_a_number(); + +//! Swaps \p x with \p y. +/*! \relates Checked_Number */ +template +void swap(Checked_Number& x, Checked_Number& y); + +template +struct FPU_Related > : public FPU_Related {}; + +template +void maybe_reset_fpu_inexact(); + +template +int maybe_check_fpu_inexact(); + +} // namespace Parma_Polyhedra_Library + +#include "Checked_Number.inlines.hh" +#include "checked_numeric_limits.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..774c69d --- /dev/null +++ b/src/Checked_Number.inlines.hh @@ -0,0 +1,844 @@ +/* Checked_Number class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Checked_Number_inlines_hh +#define PPL_Checked_Number_inlines_hh 1 + +#include "globals.defs.hh" +#include +#include + +namespace Parma_Polyhedra_Library { + +inline Rounding_Dir +rounding_dir(Rounding_Dir dir) { + if (dir == ROUND_NOT_NEEDED) { +#ifdef DEBUG_ROUND_NOT_NEEDED + return ROUND_DIRECT & ROUND_FPU_CHECK_INEXACT; +#else + return ROUND_IGNORE; +#endif + } + return dir; +} + +inline Result +check_result(Result r, Rounding_Dir dir) { + if (dir == ROUND_NOT_NEEDED && !is_special(r)) { +#ifdef DEBUG_ROUND_NOT_NEEDED + // FIXME: this is wrong. If an overflow happens the Result may be + // V_LT or V_GT. What's the better way to cope with that? + + // To solve this we need to clarify if ROUND_NOT_NEEDED is + // specified to grant library that the result will be exact _and_ + // not overflowing or the result will be exact _or_ overflowling. + assert(r == V_EQ); +#else + return V_EQ; +#endif + } + return r; +} + + +template +inline void +Checked_Number_Transparent_Policy::handle_result(Result) { +} + +inline void +Checked_Number_Default_Policy::handle_result(Result r) { + if (is_special(r)) + throw_result_exception(r); +} + +inline void +Extended_Number_Policy::handle_result(Result r) { + if (is_special(r)) + throw_result_exception(r); +} + +inline void +WRD_Extended_Number_Policy::handle_result(Result r) { + if (is_special(r)) + throw_result_exception(r); +} + +template +inline +Checked_Number::Checked_Number() + : v(0) { +} + +template +inline +Checked_Number::Checked_Number(const Checked_Number& y) { + // TODO: avoid default construction of value member. + Checked::copy(v, y.raw_value()); +} + +template +template +inline +Checked_Number +::Checked_Number(const Checked_Number& y, + Rounding_Dir dir) { + // TODO: avoid default construction of value member. + Policy::handle_result(check_result(Checked::assign_ext + (v, + y.raw_value(), + rounding_dir(dir)), + dir) + ); +} + +template +template +inline +Checked_Number +::Checked_Number(const Checked_Number& y) { + // TODO: avoid default construction of value member. + Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR; + Policy::handle_result(check_result(Checked::assign_ext + (v, + y.raw_value(), + rounding_dir(dir)), + dir)); +} + +// TODO: avoid default construction of value member. +#define DEF_CTOR(type) \ +template \ +inline \ +Checked_Number::Checked_Number(const type x, Rounding_Dir dir) { \ + Policy::handle_result \ + (check_result(Checked::assign_ext > \ + (v, x, rounding_dir(dir)), \ + dir)); \ +} \ +template \ +inline \ +Checked_Number::Checked_Number(const type x) { \ + Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR; \ + Policy::handle_result \ + (check_result(Checked::assign_ext > \ + (v, x, rounding_dir(dir)), \ + dir)); \ +} + +#define PPL_COND_0(...) +#define PPL_COND_1(...) __VA_ARGS__ +#define PPL_COND_(if, ...) PPL_COND_##if(__VA_ARGS__) +#define PPL_COND(if, ...) PPL_COND_(if, __VA_ARGS__) + +DEF_CTOR(signed char) +DEF_CTOR(signed short) +DEF_CTOR(signed int) +DEF_CTOR(signed long) +DEF_CTOR(signed long long) +DEF_CTOR(unsigned char) +DEF_CTOR(unsigned short) +DEF_CTOR(unsigned int) +DEF_CTOR(unsigned long) +DEF_CTOR(unsigned long long) +PPL_COND(PPL_SUPPORTED_FLOAT, DEF_CTOR(float)) +PPL_COND(PPL_SUPPORTED_DOUBLE, DEF_CTOR(double)) +PPL_COND(PPL_SUPPORTED_LONG_DOUBLE, DEF_CTOR(long double)) +DEF_CTOR(mpq_class&) +DEF_CTOR(mpz_class&) + +#undef DEF_CTOR + +#undef PPL_COND +#undef PPL_COND_ +#undef PPL_COND_1 +#undef PPL_COND_0 + +template +inline +Checked_Number::Checked_Number(const char* x, Rounding_Dir dir) { + std::istringstream s(x); + Policy::handle_result(check_result(Checked::input(v, + s, + rounding_dir(dir)), + dir)); +} + +template +inline +Checked_Number::Checked_Number(const char* x) { + std::istringstream s(x); + Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR; + Policy::handle_result(check_result(Checked::input(v, + s, + rounding_dir(dir)), + dir)); +} + +template +template +inline +Checked_Number::Checked_Number(const From&, Rounding_Dir dir, typename Enable_If::value, bool>::type) { + Policy::handle_result(check_result(Checked::assign_special(v, + From::code, + rounding_dir(dir)), + dir)); +} + +template +template +inline +Checked_Number::Checked_Number(const From&, typename Enable_If::value, bool>::type) { + Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR; + Policy::handle_result(check_result(Checked::assign_special(v, + From::code, + rounding_dir(dir)), + dir)); +} + +template +inline typename Enable_If::value && Is_Special::value, Result>::type +assign_r(To& to, const From&, Rounding_Dir dir) { + return check_result(Checked::assign_special + ::Policy>(Native_Checked_To_Wrapper::raw_value(to), + From::code, + rounding_dir(dir)), + dir); +} + +template +inline typename Enable_If::value && Is_Special::value, Result>::type +construct(To& to, const From&, Rounding_Dir dir) { + return check_result(Checked::construct_special + ::Policy>(Native_Checked_To_Wrapper::raw_value(to), + From::code, + rounding_dir(dir)), + dir); +} + +template +inline typename Enable_If::value, bool>::type +is_minus_infinity(const T& x) { + return Checked::is_minf + ::Policy>(Native_Checked_From_Wrapper::raw_value(x)); +} + +template +inline typename Enable_If::value, bool>::type +is_plus_infinity(const T& x) { + return Checked::is_pinf + ::Policy>(Native_Checked_From_Wrapper::raw_value(x)); +} + +template +inline typename Enable_If::value, int>::type +is_infinity(const T& x) { + return is_minus_infinity(x) ? -1 : is_plus_infinity(x) ? 1 : 0; +} + +template +inline typename Enable_If::value, bool>::type +is_not_a_number(const T& x) { + return Checked::is_nan + ::Policy>(Native_Checked_From_Wrapper::raw_value(x)); +} + +template +inline typename Enable_If::value, bool>::type +is_integer(const T& x) { + return Checked::is_int + ::Policy>(Native_Checked_From_Wrapper::raw_value(x)); +} + +template +inline +Checked_Number::operator T() const { + if (Policy::convertible) + return v; +} + +template +inline T& +Checked_Number::raw_value() { + return v; +} + +template +inline const T& +Checked_Number::raw_value() const { + return v; +} + +/*! \relates Checked_Number */ +template +inline const T& +raw_value(const Checked_Number& x) { + return x.raw_value(); +} + +/*! \relates Checked_Number */ +template +inline T& +raw_value(Checked_Number& x) { + return x.raw_value(); +} + +template +inline bool +Checked_Number::OK() const { + return true; +} + +template +inline Result +Checked_Number::classify(bool nan, bool inf, bool sign) const { + return Checked::classify(v, nan, inf, sign); +} + +template +inline bool +is_not_a_number(const Checked_Number& x) { + return Checked::is_nan(x.raw_value()); +} + +template +inline bool +is_minus_infinity(const Checked_Number& x) { + return Checked::is_minf(x.raw_value()); +} + +template +inline bool +is_plus_infinity(const Checked_Number& x) { + return Checked::is_pinf(x.raw_value()); +} + +/*! \relates Checked_Number */ +template +inline memory_size_type +total_memory_in_bytes(const Checked_Number& x) { + return total_memory_in_bytes(x.raw_value()); +} + +/*! \relates Checked_Number */ +template +inline memory_size_type +external_memory_in_bytes(const Checked_Number& x) { + return external_memory_in_bytes(x.raw_value()); +} + + +/*! \relates Checked_Number */ +template +inline typename Enable_If::value, Result>::type +assign_r(To& to, const char* x, Rounding_Dir dir) { + std::istringstream s(x); + return check_result(Checked::input + ::Policy>(Native_Checked_To_Wrapper::raw_value(to), + s, + rounding_dir(dir)), + dir); +} + +#define FUNC1(name, func) \ +template \ +inline typename Enable_If::value \ + && Is_Native_Or_Checked::value, \ + Result>::type \ +name(To& to, const From& x, Rounding_Dir dir) { \ + return \ + check_result(Checked::func \ + ::Policy, \ + typename Native_Checked_From_Wrapper \ + ::Policy>(Native_Checked_To_Wrapper::raw_value(to), \ + Native_Checked_From_Wrapper::raw_value(x), \ + rounding_dir(dir)), dir); \ +} + +FUNC1(construct, construct_ext) +FUNC1(assign_r, assign_ext) +FUNC1(floor_assign_r, floor_ext) +FUNC1(ceil_assign_r, ceil_ext) +FUNC1(trunc_assign_r, trunc_ext) +FUNC1(neg_assign_r, neg_ext) +FUNC1(abs_assign_r, abs_ext) +FUNC1(sqrt_assign_r, sqrt_ext) + +#undef FUNC1 + +#define FUNC1(name, func) \ +template \ +inline typename Enable_If::value \ + && Is_Native_Or_Checked::value, \ + Result>::type \ +name(To& to, const From& x, int exp, Rounding_Dir dir) { \ + return \ + check_result(Checked::func \ + ::Policy, \ + typename Native_Checked_From_Wrapper \ + ::Policy>(Native_Checked_To_Wrapper::raw_value(to), \ + Native_Checked_From_Wrapper::raw_value(x), \ + exp, \ + rounding_dir(dir)), \ + dir); \ +} + +FUNC1(mul2exp_assign_r, mul2exp_ext) +FUNC1(div2exp_assign_r, div2exp_ext) + +#undef FUNC1 + +#define FUNC2(name, func) \ +template \ +inline typename Enable_If::value \ + && Is_Native_Or_Checked::value \ + && Is_Native_Or_Checked::value, \ + Result>::type \ +name(To& to, const From1& x, const From2& y, Rounding_Dir dir) { \ + return \ + check_result(Checked::func \ + ::Policy, \ + typename Native_Checked_From_Wrapper \ + ::Policy, \ + typename Native_Checked_From_Wrapper \ + ::Policy>(Native_Checked_To_Wrapper::raw_value(to), \ + Native_Checked_From_Wrapper::raw_value(x), \ + Native_Checked_From_Wrapper::raw_value(y), \ + rounding_dir(dir)), \ + dir); \ +} + +FUNC2(add_assign_r, add_ext) +FUNC2(sub_assign_r, sub_ext) +FUNC2(mul_assign_r, mul_ext) +FUNC2(div_assign_r, div_ext) +FUNC2(idiv_assign_r, idiv_ext) +FUNC2(rem_assign_r, rem_ext) +FUNC2(gcd_assign_r, gcd_ext) +FUNC2(lcm_assign_r, lcm_ext) +FUNC2(add_mul_assign_r, add_mul_ext) +FUNC2(sub_mul_assign_r, sub_mul_ext) + +#undef FUNC2 + +#define FUNC4(name, func) \ +template \ +inline typename Enable_If::value \ + && Is_Native_Or_Checked::value \ + && Is_Native_Or_Checked::value \ + && Is_Native_Or_Checked::value \ + && Is_Native_Or_Checked::value, \ + Result>::type \ +name(To1& to, To2& s, To3& t, const From1& x, const From2& y, \ + Rounding_Dir dir) { \ + return \ + check_result \ + (Checked::func::Policy, \ + typename Native_Checked_To_Wrapper::Policy, \ + typename Native_Checked_To_Wrapper::Policy, \ + typename Native_Checked_From_Wrapper::Policy, \ + typename Native_Checked_From_Wrapper::Policy> \ + (Native_Checked_To_Wrapper::raw_value(to), \ + Native_Checked_To_Wrapper::raw_value(s), \ + Native_Checked_To_Wrapper::raw_value(t), \ + Native_Checked_From_Wrapper::raw_value(x), \ + Native_Checked_From_Wrapper::raw_value(y), \ + rounding_dir(dir)), \ + dir); \ +} + +FUNC4(gcdext_assign_r, gcdext_ext) + +#undef FUNC4 + +#define DEF_INCREMENT(f, fun) \ +template \ +inline Checked_Number& \ +Checked_Number::f() { \ + Policy::handle_result(fun(*this, *this, T(1), \ + Policy::ROUND_DEFAULT_OPERATOR)); \ + return *this; \ +} \ +template \ +inline Checked_Number \ +Checked_Number::f(int) {\ + T r = v;\ + Policy::handle_result(fun(*this, *this, T(1), \ + Policy::ROUND_DEFAULT_OPERATOR)); \ + return r;\ +} + +DEF_INCREMENT(operator ++, add_assign_r) +DEF_INCREMENT(operator --, sub_assign_r) + +#undef DEF_INCREMENT + +template +inline Checked_Number& +Checked_Number::operator=(const Checked_Number& y) { + Checked::copy(v, y.raw_value()); + return *this; +} +template +template +inline Checked_Number& +Checked_Number::operator=(const From& y) { + Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_OPERATOR)); + return *this; +} + +#define DEF_BINARY_OP_ASSIGN(f, fun) \ +template \ +template \ +inline Checked_Number& \ +Checked_Number::f(const Checked_Number& y) { \ + Policy::handle_result(fun(*this, *this, y, \ + Policy::ROUND_DEFAULT_OPERATOR)); \ + return *this; \ +} \ +template \ +inline Checked_Number& \ +Checked_Number::f(const T& y) { \ + Policy::handle_result(fun(*this, *this, y, \ + Policy::ROUND_DEFAULT_OPERATOR)); \ + return *this; \ +} \ +template \ +template \ +inline typename Enable_If::value, \ + Checked_Number& >::type \ +Checked_Number::f(const From& y) { \ + Checked_Number cy(y); \ + Policy::handle_result(fun(*this, *this, cy, \ + Policy::ROUND_DEFAULT_OPERATOR)); \ + return *this; \ +} + +DEF_BINARY_OP_ASSIGN(operator +=, add_assign_r) +DEF_BINARY_OP_ASSIGN(operator -=, sub_assign_r) +DEF_BINARY_OP_ASSIGN(operator *=, mul_assign_r) +DEF_BINARY_OP_ASSIGN(operator /=, div_assign_r) +DEF_BINARY_OP_ASSIGN(operator %=, rem_assign_r) + +#undef DEF_BINARY_OP_ASSIGN + +#define DEF_BINARY_OP(f, fun) \ +template \ +inline Checked_Number \ +f(const Checked_Number& x, const Checked_Number& y) { \ + Checked_Number r; \ + Policy::handle_result(fun(r, x, y, Policy::ROUND_DEFAULT_OPERATOR)); \ + return r; \ +} \ +template \ +inline \ +typename Enable_If::value, Checked_Number >::type \ +f(const Type& x, const Checked_Number& y) { \ + Checked_Number r(x); \ + Policy::handle_result(fun(r, r, y, Policy::ROUND_DEFAULT_OPERATOR)); \ + return r; \ +} \ +template \ +inline \ +typename Enable_If::value, Checked_Number >::type \ +f(const Checked_Number& x, const Type& y) { \ + Checked_Number r(y); \ + Policy::handle_result(fun(r, x, r, Policy::ROUND_DEFAULT_OPERATOR)); \ + return r; \ +} + +DEF_BINARY_OP(operator +, add_assign_r) +DEF_BINARY_OP(operator -, sub_assign_r) +DEF_BINARY_OP(operator *, mul_assign_r) +DEF_BINARY_OP(operator /, div_assign_r) +DEF_BINARY_OP(operator %, rem_assign_r) + +#undef DEF_BINARY_OP + +#define DEF_COMPARE(f, fun) \ +template \ +inline \ +typename Enable_If::value \ + && Is_Native_Or_Checked::value \ + && (Is_Checked::value || Is_Checked::value), \ + bool>::type \ +f(const T1& x, const T2& y) { \ + return Checked::fun::Policy, \ + typename Native_Checked_From_Wrapper::Policy> \ + (Native_Checked_From_Wrapper::raw_value(x), \ + Native_Checked_From_Wrapper::raw_value(y)); \ +} + +DEF_COMPARE(operator ==, eq_ext) +DEF_COMPARE(operator !=, ne_ext) +DEF_COMPARE(operator >=, ge_ext) +DEF_COMPARE(operator >, gt_ext) +DEF_COMPARE(operator <=, le_ext) +DEF_COMPARE(operator <, lt_ext) + +#undef DEF_COMPARE + +#define DEF_COMPARE(f, fun) \ +template \ +inline typename Enable_If::value \ + && Is_Native_Or_Checked::value, \ + bool>::type \ +f(const T1& x, const T2& y) { \ + return Checked::fun::Policy, \ + typename Native_Checked_From_Wrapper::Policy> \ + (Native_Checked_From_Wrapper::raw_value(x), \ + Native_Checked_From_Wrapper::raw_value(y)); \ +} + +DEF_COMPARE(equal, eq_ext) +DEF_COMPARE(not_equal, ne_ext) +DEF_COMPARE(greater_or_equal, ge_ext) +DEF_COMPARE(greater_than, gt_ext) +DEF_COMPARE(less_or_equal, le_ext) +DEF_COMPARE(less_than, lt_ext) + +#undef DEF_COMPARE + +/*! \relates Checked_Number */ +template +inline Checked_Number +operator+(const Checked_Number& x) { + return x; +} + +/*! \relates Checked_Number */ +template +inline Checked_Number +operator-(const Checked_Number& x) { + Checked_Number r; + Policy::handle_result(neg_assign_r(r, x, Policy::ROUND_DEFAULT_OPERATOR)); + return r; +} + +#define PPL_DEF_ASSIGN_FUN2_1(f, fun) \ +template \ +inline void \ +f(Checked_Number& x) { \ + Policy::handle_result(fun(x, x, Policy::ROUND_DEFAULT_FUNCTION)); \ +} + +#define PPL_DEF_ASSIGN_FUN2_2(f, fun) \ +template \ +inline void \ +f(Checked_Number& x, const Checked_Number& y) { \ + Policy::handle_result(fun(x, y, Policy::ROUND_DEFAULT_FUNCTION)); \ +} + +#define PPL_DEF_ASSIGN_FUN3_3(f, fun) \ +template \ +inline void \ +f(Checked_Number& x, const Checked_Number& y, \ + const Checked_Number& z) { \ + Policy::handle_result(fun(x, y, z, Policy::ROUND_DEFAULT_FUNCTION)); \ +} + +#define PPL_DEF_ASSIGN_FUN5_5(f, fun) \ +template \ +inline void \ +f(Checked_Number& x, \ + Checked_Number& s, Checked_Number& t, \ + const Checked_Number& y, \ + const Checked_Number& z) { \ + Policy::handle_result(fun(x, s, t, y, z, Policy::ROUND_DEFAULT_FUNCTION)); \ +} + +PPL_DEF_ASSIGN_FUN2_2(sqrt_assign, sqrt_assign_r) + +PPL_DEF_ASSIGN_FUN2_1(floor_assign, floor_assign_r) +PPL_DEF_ASSIGN_FUN2_2(floor_assign, floor_assign_r) + +PPL_DEF_ASSIGN_FUN2_1(ceil_assign, ceil_assign_r) +PPL_DEF_ASSIGN_FUN2_2(ceil_assign, ceil_assign_r) + +PPL_DEF_ASSIGN_FUN2_1(trunc_assign, trunc_assign_r) +PPL_DEF_ASSIGN_FUN2_2(trunc_assign, trunc_assign_r) + +PPL_DEF_ASSIGN_FUN2_1(neg_assign, neg_assign_r) +PPL_DEF_ASSIGN_FUN2_2(neg_assign, neg_assign_r) + +PPL_DEF_ASSIGN_FUN2_1(abs_assign, abs_assign_r) +PPL_DEF_ASSIGN_FUN2_2(abs_assign, abs_assign_r) + +PPL_DEF_ASSIGN_FUN3_3(add_mul_assign, add_mul_assign_r) + +PPL_DEF_ASSIGN_FUN3_3(sub_mul_assign, sub_mul_assign_r) + +PPL_DEF_ASSIGN_FUN3_3(rem_assign, rem_assign_r) + +PPL_DEF_ASSIGN_FUN3_3(gcd_assign, gcd_assign_r) + +PPL_DEF_ASSIGN_FUN5_5(gcdext_assign, gcdext_assign_r) + +PPL_DEF_ASSIGN_FUN3_3(lcm_assign, lcm_assign_r) + +#undef PPL_DEF_ASSIGN_FUN2_1 +#undef PPL_DEF_ASSIGN_FUN2_2 +#undef PPL_DEF_ASSIGN_FUN3_2 +#undef PPL_DEF_ASSIGN_FUN3_3 +#undef PPL_DEF_ASSIGN_FUN5_5 + +template +inline void +exact_div_assign(Checked_Number& x, + const Checked_Number& y, + const Checked_Number& z) { + Policy::handle_result(div_assign_r(x, y, z, ROUND_NOT_NEEDED)); +} + +/*! \relates Checked_Number */ +template +inline typename Enable_If::value, int>::type +sgn(const From& x) { + Result r = Checked::sgn_ext::Policy>(Native_Checked_From_Wrapper::raw_value(x)); + switch (r) { + case V_LT: + return -1; + case V_EQ: + return 0; + case V_GT: + return 1; + default: + throw(0); + } +} + +/*! \relates Checked_Number */ +template +inline typename Enable_If::value + && Is_Native_Or_Checked::value, + int>::type +cmp(const From1& x, const From2& y) { + Result r + = Checked::cmp_ext::Policy, + typename Native_Checked_From_Wrapper::Policy> + (Native_Checked_From_Wrapper::raw_value(x), + Native_Checked_From_Wrapper::raw_value(y)); + switch (r) { + case V_LT: + return -1; + case V_EQ: + return 0; + case V_GT: + return 1; + default: + throw(0); + } +} + +/*! \relates Checked_Number */ +template +typename Enable_If::value, Result>::type +output(std::ostream& os, const T& x, + const Numeric_Format& fmt, Rounding_Dir dir) { + return check_result(Checked::output_ext::Policy> + (os, + Native_Checked_From_Wrapper::raw_value(x), + fmt, + rounding_dir(dir)), + dir); +} + +/*! \relates Checked_Number */ +template +inline std::ostream& +operator<<(std::ostream& os, const Checked_Number& x) { + Policy::handle_result(output(os, x, Numeric_Format(), ROUND_IGNORE)); + return os; +} + +/*! \relates Checked_Number */ +template +typename Enable_If::value, Result>::type +input(T& x, std::istream& is, Rounding_Dir dir) { + return check_result(Checked::input_ext::Policy> + (Native_Checked_To_Wrapper::raw_value(x), + is, + rounding_dir(dir)), + dir); +} + +/*! \relates Checked_Number */ +template +inline std::istream& operator>>(std::istream& is, + Checked_Number& 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 +inline T +plus_infinity() { + return PLUS_INFINITY; +} + +template +inline T +minus_infinity() { + return MINUS_INFINITY; +} + +template +inline T +not_a_number() { + return NOT_A_NUMBER; +} + +/*! \relates Checked_Number */ +template +inline void +swap(Checked_Number& x, Checked_Number& y) { + using std::swap; + swap(x.raw_value(), y.raw_value()); +} + +template +inline void +maybe_reset_fpu_inexact() { + if (FPU_Related::value) + return fpu_reset_inexact(); +} + +template +inline int +maybe_check_fpu_inexact() { + if (FPU_Related::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..1ac6e6d --- /dev/null +++ b/src/Checked_Number.templates.hh @@ -0,0 +1,147 @@ +/* Checked_Number class implementation: non-inline template functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Checked_Number_templates_hh +#define PPL_Checked_Number_templates_hh 1 + +#include +#include +#include + +namespace Parma_Polyhedra_Library { + +template +typename Enable_If::value, void>::type +ascii_dump(std::ostream& s, const T& t) { + if (std::numeric_limits::is_exact) + // An exact datatype: pretty printer is accurate. + s << t; + else { + // An inexact datatype (probably floating point): + // first dump its hexadecimal representation ... + const std::ios_base::fmtflags old_flags = s.flags(); + s << std::hex; + const unsigned char* p = reinterpret_cast(&t); + for (unsigned i = 0; i < sizeof(T); ++i) { + s << std::setw(2) << std::setfill('0'); + s << static_cast(p[i]); + } + s.flags(old_flags); + // ... and then pretty print it for readability. + s << " (" << t << ")"; + } +} + +template +typename Enable_If::value, bool>::type +ascii_load(std::istream& s, T& t) { + if (std::numeric_limits::is_exact) + // An exact datatype: input from pretty printed version is accurate. + return (s >> t); + else { + // An inexact datatype (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(&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; + } + assert(byte_value <= 255); + p[i] = static_cast(byte_value); + } + // ... then read and discard pretty printed value. + if (!(s >> str)) + return false; + const unsigned 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..b6acba5 --- /dev/null +++ b/src/Checked_Number.types.hh @@ -0,0 +1,27 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PPL_Checked_Number_types_hh +#define PPL_Checked_Number_types_hh 1 + +#include "Coefficient_traits_template.hh" + +namespace Parma_Polyhedra_Library { + +struct Checked_Number_Default_Policy; +struct Extended_Number_Policy; + +template +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..c8f3dad --- /dev/null +++ b/src/Coefficient.cc @@ -0,0 +1,64 @@ +/* Coefficient class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#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() { + assert(Coefficient_zero_p == 0); + Coefficient_zero_p = new Coefficient(0); + + assert(Coefficient_one_p == 0); + Coefficient_one_p = new Coefficient(1); +} + +void +Coefficient_constants_finalize() { + assert(Coefficient_zero_p != 0); + delete Coefficient_zero_p; + Coefficient_zero_p = 0; + + 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..05a80ee --- /dev/null +++ b/src/Coefficient.defs.hh @@ -0,0 +1,60 @@ +/* Coefficient class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Coefficient_defs_hh +#define PPL_Coefficient_defs_hh 1 + +#include "Coefficient.types.hh" +#include + +#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..1e02b8a --- /dev/null +++ b/src/Coefficient.inlines.hh @@ -0,0 +1,61 @@ +/* Coefficient class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Coefficient_inlines_hh +#define PPL_Coefficient_inlines_hh 1 + +namespace Parma_Polyhedra_Library { + +#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 + +#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; + assert(*Coefficient_one_p != 0); + return *Coefficient_one_p; +} +#endif + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Coefficient_inlines_hh) diff --git a/src/Coefficient.types.hh b/src/Coefficient.types.hh new file mode 100644 index 0000000..bb4f7d1 --- /dev/null +++ b/src/Coefficient.types.hh @@ -0,0 +1,99 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PPL_Coefficient_types_hh +#define PPL_Coefficient_types_hh 1 + +#include "Checked_Number.defs.hh" + +#if defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS) + +namespace Parma_Polyhedra_Library { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Coefficient traits specialization for 8 bits checked integers. +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +struct Coefficient_traits_template > { + //! The type used for references to const 8 bit checked integers. + typedef Checked_Number 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 +struct Coefficient_traits_template > { + //! The type used for references to const 16 bit checked integers. + typedef Checked_Number 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 +struct Coefficient_traits_template > { + //! The type used for references to const 32 bit checked integers. + typedef Checked_Number 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 +struct Coefficient_traits_template > { + //! The type used for references to const 64 bit checked integers. + typedef const Checked_Number& const_reference; +}; + +} // namespace Parma_Polyhedra_Library + +#endif // defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS) + +#ifdef PPL_GMP_INTEGERS +#include "GMP_Integer.types.hh" +#endif + +namespace Parma_Polyhedra_Library { + +//! An alias for easily naming the type of PPL coefficients. +/*! \ingroup PPL_CXX_interface + Objects of type Coefficient are used to implement the integral valued + coefficients occurring in linear expressions, constraints, generators, + intervals, bounding boxes and so on. Depending on the chosen + configuration options (see file README.configure), + a Coefficient may actually be: + - The GMP_Integer type, which in turn is an alias for the + mpz_class type implemented by the C++ interface + of the GMP library (this is the default configuration); + - An instance of the Checked_Number class template: with its default + policy (Checked_Number_Default_Policy), this implements overflow + detection on top of a native integral type (available template + instances include checked integers having 8, 16, 32 or 64 bits); + with the Checked_Number_Transparent_Policy, this is a wrapper + for native integral types with no overflow detection + (available template instances are as above). +*/ +typedef 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_traits; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Coefficient_types_hh) diff --git a/src/Coefficient_traits_template.hh b/src/Coefficient_traits_template.hh new file mode 100644 index 0000000..9e7fbab --- /dev/null +++ b/src/Coefficient_traits_template.hh @@ -0,0 +1,27 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PPL_Coefficient_traits_template_hh +#define PPL_Coefficient_traits_template_hh 1 + +namespace Parma_Polyhedra_Library { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Coefficient traits. +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +struct Coefficient_traits_template { +}; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Coefficient_traits_template_hh) diff --git a/src/Congruence.cc b/src/Congruence.cc new file mode 100644 index 0000000..3967117 --- /dev/null +++ b/src/Congruence.cc @@ -0,0 +1,293 @@ +/* Congruence class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Congruence.defs.hh" + +#include "Variable.defs.hh" +#include +#include +#include +#include +#include + +namespace PPL = Parma_Polyhedra_Library; + +PPL::Congruence::Congruence(const Constraint& c) + : Row(c.is_equality() + ? c + : (throw_invalid_argument("Congruence(c)", + "constraint c must be an equality."), + c), + c.space_dimension() + 2, + compute_capacity(c.space_dimension() + 2, Row::max_size())) { + (*this)[size()-1] = 0; +} + +PPL::Congruence::Congruence(const Constraint& c, + dimension_type sz, dimension_type capacity) + : Row(c.is_equality() + ? c + : (throw_invalid_argument("Congruence(c)", + "constraint c must be an equality."), + c), + sz, + capacity) { + assert(sz > 1); + (*this)[sz-1] = 0; +} + +void +PPL::Congruence::sign_normalize() { + Row& x = *this; + const dimension_type sz = x.size() - 1; + // `first_non_zero' indicates the index of the first + // coefficient of the row different from zero, disregarding + // the very first coefficient (inhomogeneous term). + dimension_type first_non_zero; + for (first_non_zero = 1; first_non_zero < sz; ++first_non_zero) + if (x[first_non_zero] != 0) + break; + if (first_non_zero < sz) + // If the first non-zero coefficient of the row is negative, + // negate all the coefficients and the inhomogeneous term. + if (x[first_non_zero] < 0) { + for (dimension_type j = first_non_zero; j < sz; ++j) + neg_assign(x[j]); + // Also negate the inhomogeneous term. + neg_assign(x[0]); + } +} + +void +PPL::Congruence::normalize() { + sign_normalize(); + + dimension_type sz = size(); + if (sz == 0) + return; + + const Coefficient& mod = modulus(); + if (mod == 0) + return; + + Coefficient& row_0 = (*this)[0]; + // Factor the modulus out of the inhomogeneous term. + row_0 %= mod; + if (row_0 < 0) + // Make inhomogeneous term positive. + row_0 += mod; + return; +} + +void +PPL::Congruence::strong_normalize() { + normalize(); + Row::normalize(); +} + +PPL::Congruence +PPL::Congruence::create(const Linear_Expression& e1, + const Linear_Expression& e2) { + // Ensure that diff is created with capacity for the modulus. + dimension_type dim, e1_dim, e2_dim; + e1_dim = e1.space_dimension(); + e2_dim = e2.space_dimension(); + if (e1_dim > e2_dim) + dim = e1_dim; + else + dim = e2_dim; + Linear_Expression diff(e1_dim > e2_dim ? e1 : e2, + dim + 2); + diff -= (e1_dim > e2_dim ? e2 : e1); + Congruence cg(diff, 1); + return cg; +} + +void +PPL::Congruence::throw_invalid_argument(const char* method, + const char* message) const { + std::ostringstream s; + s << "PPL::Congruence::" << method << ":" << std::endl + << message; + throw std::invalid_argument(s.str()); +} + +void +PPL::Congruence::throw_dimension_incompatible(const char* method, + const char* v_name, + const Variable v) const { + std::ostringstream s; + s << "this->space_dimension() == " << space_dimension() << ", " + << v_name << ".space_dimension() == " << v.space_dimension() << "."; + 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; + for (dimension_type v = 0; v < num_variables; ++v) { + cv = c.coefficient(Variable(v)); + if (cv != 0) { + if (!first) { + if (cv > 0) + s << " + "; + else { + s << " - "; + neg_assign(cv); + } + } + else + first = false; + if (cv == -1) + s << "-"; + else if (cv != 1) + s << cv << "*"; + s << PPL::Variable(v); + } + } + if (first) + s << Coefficient_zero(); + s << " = " << -c.inhomogeneous_term(); + if (c.is_proper_congruence()) + s << " (mod " << c.modulus() << ")"; + return s; +} + +bool +PPL::Congruence::is_tautological() const { + if ((is_equality() && inhomogeneous_term() == 0) + || (is_proper_congruence() + && (inhomogeneous_term() % modulus() == 0))) { + for (unsigned i = space_dimension(); i > 0; --i) + if (operator[](i) != 0) + return false; + return true; + } + return false; +} + +bool +PPL::Congruence::is_inconsistent() const { + if (inhomogeneous_term() == 0 + || (is_proper_congruence() + && ((inhomogeneous_term() % modulus()) == 0))) + return false; + for (unsigned i = space_dimension(); i > 0; --i) + if (operator[](i) != 0) + return false; + return true; +} + +void +PPL::Congruence::ascii_dump(std::ostream& s) const { + const Row& x = *this; + const dimension_type x_size = x.size(); + s << "size " << x_size << " "; + if (x_size > 0) { + for (dimension_type i = 0; i < x_size - 1; ++i) + s << x[i] << ' '; + s << "m " << x[x_size - 1]; + } + s << std::endl; +} + +PPL_OUTPUT_DEFINITIONS(Congruence) + +bool +PPL::Congruence::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; + + Row& x = *this; + const dimension_type old_size = x.size(); + if (new_size < old_size) + x.shrink(new_size); + else if (new_size > old_size) { + Row y(new_size, Row::Flags()); + x.swap(y); + } + + if (new_size > 0) { + for (dimension_type col = 0; col < new_size - 1; ++col) + if (!(s >> x[col])) + return false; + if (!(s >> str) || str != "m") + return false; + if (!(s >> x[new_size-1])) + return false; + } + return true; +} + +bool +PPL::Congruence::OK() const { + // A Congruence must be a valid Row. + if (!Row::OK()) + return false; + + // 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() { + assert(zero_dim_false_p == 0); + zero_dim_false_p + = new Congruence((Linear_Expression::zero() %= Coefficient(-1)) / 0); + + assert(zero_dim_integrality_p == 0); + zero_dim_integrality_p + = new Congruence(Linear_Expression::zero() %= Coefficient(-1)); +} + +void +PPL::Congruence::finalize() { + assert(zero_dim_false_p != 0); + delete zero_dim_false_p; + zero_dim_false_p = 0; + + assert(zero_dim_integrality_p != 0); + delete zero_dim_integrality_p; + zero_dim_integrality_p = 0; +} diff --git a/src/Congruence.defs.hh b/src/Congruence.defs.hh new file mode 100644 index 0000000..34a5442 --- /dev/null +++ b/src/Congruence.defs.hh @@ -0,0 +1,479 @@ +/* Congruence class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Congruence_defs_hh +#define PPL_Congruence_defs_hh 1 + +#include "Congruence.types.hh" +#include "Scalar_Products.types.hh" +#include "Row.defs.hh" +#include "Grid.types.hh" +#include "Polyhedron.types.hh" +#include "Variable.defs.hh" +#include "Constraint.types.hh" +#include "Linear_Expression.types.hh" +#include "Linear_Row.types.hh" +#include "Congruence_System.defs.hh" +#include + +namespace Parma_Polyhedra_Library { + +namespace IO_Operators { + +//! Output operators. + +/*! \relates Parma_Polyhedra_Library::Congruence */ +std::ostream& +operator<<(std::ostream& s, const Congruence& c); + +// Put this in the namespace here to declare it a friend later. + +/*! \relates Parma_Polyhedra_Library::Congruence_System */ +std::ostream& +operator<<(std::ostream& s, const Congruence_System& cgs); + + +} // namespace IO_Operators + +// Put these in the namespace here to declare them friend later. + +//! Returns true if and only if \p x and \p y are equivalent. +/*! \relates Congruence */ +bool +operator==(const Congruence& x, const Congruence& y); + +//! Returns false if and only if \p x and \p y are equivalent. +/*! \relates Congruence */ +bool +operator!=(const Congruence& x, const Congruence& y); + +//! Returns the congruence \f$e1 = e2 \pmod{1}\f$. +/*! \relates Congruence */ +Congruence +operator%=(const Linear_Expression& e1, const Linear_Expression& e2); + +//! Returns the congruence \f$e = n \pmod{1}\f$. +/*! \relates Congruence */ +Congruence +operator%=(const Linear_Expression& e, 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); + +} // namespace Parma_Polyhedra_Library + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Congruence */ +void +swap(Parma_Polyhedra_Library::Congruence& x, + Parma_Polyhedra_Library::Congruence& y); + +} // namespace std + +//! A linear congruence. +/*! \ingroup PPL_CXX_interface + An object of the class Congruence is a congruence: + - \f$\cg = \sum_{i=0}^{n-1} a_i x_i + b = 0 \pmod m\f$ + + where \f$n\f$ is the dimension of the space, + \f$a_i\f$ is the integer coefficient of variable \f$x_i\f$, + \f$b\f$ is the integer inhomogeneous term and \f$m\f$ is the integer modulus; + if \f$m = 0\f$, then \f$\cg\f$ represents the equality congruence + \f$\sum_{i=0}^{n-1} a_i x_i + b = 0\f$ + and, if \f$m \neq 0\f$, then the congruence \f$\cg\f$ is + said to be a proper congruence. + + \par How to build a congruence + Congruences \f$\pmod{1}\f$ are typically built by + applying the congruence symbol `\%=' + 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 `/'. + + 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 + x, y and z + 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 : private Row { +public: + //! Ordinary copy-constructor. + Congruence(const Congruence& cg); + + //! Copy-constructs (modulo 0) from equality constraint \p c. + /*! + \exception std::invalid_argument + Thrown if \p c is an inequality. + */ + explicit Congruence(const Constraint& c); + + //! Destructor. + ~Congruence(); + + //! Assignment operator. + Congruence& operator=(const Congruence& cg); + + //! Returns the maximum space dimension a Congruence can handle. + static dimension_type max_space_dimension(); + + //! Returns the dimension of the vector space enclosing \p *this. + dimension_type space_dimension() const; + + //! Returns the coefficient of \p v in \p *this. + /*! + \exception std::invalid_argument thrown if the index of \p v + is greater than or equal to the space dimension of \p *this. + */ + Coefficient_traits::const_reference coefficient(Variable v) const; + + //! Returns the inhomogeneous term of \p *this. + Coefficient_traits::const_reference inhomogeneous_term() const; + + //! Returns a const reference to the modulus of \p *this. + Coefficient_traits::const_reference modulus() const; + + //! Multiplies \p k into the modulus of \p *this. + /*! + If called with \p *this representing the congruence \f$ e_1 = e_2 + \pmod{m}\f$, then it returns with *this representing + the congruence \f$ e_1 = e_2 \pmod{mk}\f$. + */ + Congruence& + operator/=(Coefficient_traits::const_reference k); + + /*! \brief + Returns true 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 true 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 true if the modulus is greater than zero. + /*! + A congruence with a modulus of 0 is a linear equality. + */ + bool is_proper_congruence() const; + + //! Returns true if \p *this is an equality. + /*! + A modulus of zero denotes a linear equality. + */ + bool is_equality() const; + + /*! \brief + Returns true if \p *this is equal to \p cg in + dimension \p dim. + */ + bool is_equal_at_dimension(dimension_type dim, + const Congruence& cg) 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 integrality + congruence. + */ + 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); + + //! Returns the congruence \f$e = n \pmod{1}\f$. + static Congruence + create(const Linear_Expression& e, Coefficient_traits::const_reference n); + + //! Returns the congruence \f$n = e \pmod{1}\f$. + static Congruence + create(Coefficient_traits::const_reference n, const Linear_Expression& e); + + /*! \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 of the internal + representation of \p *this. + */ + bool ascii_load(std::istream& s); + + //! Checks if all the invariants are satisfied. + bool OK() const; + +protected: + + //! Normalizes the signs. + /*! + The signs of the coefficients and the inhomogeneous term are + normalized, leaving the first non-zero homogeneous coefficient + positive. + */ + void sign_normalize(); + + //! Normalizes signs and the inhomogeneous term. + /*! + Applies sign_normalize, then reduces the inhomogeneous term to the + smallest possible positive number. + */ + void normalize(); + + //! Calls normalize, then divides out common factors. + /*! + Strongly normalized Congruences have equivalent semantics if and + only if their syntaxes (as output by operator<<) are equal. + */ + void strong_normalize(); + +private: + /*! \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 integrality congruence. + */ + static const Congruence* zero_dim_integrality_p; + + //! Marks this congruence as a linear equality. + void set_is_equality(); + + //! Negates the elements from index \p start to index \p end. + void negate(dimension_type start, dimension_type end); + + //! Default constructor: private and not implemented. + Congruence(); + + //! Copy-constructs with specified size and capacity. + Congruence(const Congruence& cg, + dimension_type sz, + dimension_type capacity); + + //! Constructs from a constraint, with specified size and capacity. + Congruence(const Constraint& c, + dimension_type sz, + dimension_type capacity); + + //! Copy-constructs from \p cg, multiplying \p k into the modulus. + /*! + If \p cg represents the congruence \f$ e_1 = e_2 + \pmod{m}\f$, then the result represents the + congruence \f$ e_1 = e_2 \pmod{mk}\f$. + */ + Congruence(const Congruence& cg, Coefficient_traits::const_reference k); + + //! Constructs from Linear_Expression \p le, using modulus \p m. + /*! + Builds a congruence with modulus \p m, stealing the coefficients + from \p le. + + \param le + The Linear_Expression holding the coefficients. + + \param m + The modulus for the congruence, which must be zero or greater. + */ + Congruence(Linear_Expression& le, + Coefficient_traits::const_reference m); + + //! Swaps \p *this with \p y. + void swap(Congruence& y); + + /*! \brief + Throws a std::invalid_argument exception containing + error message \p message. + */ + void + throw_invalid_argument(const char* method, const char* message) const; + + /*! \brief + Throws a std::invalid_argument exception containing + the appropriate error message. + */ + void + throw_dimension_incompatible(const char* method, + const char* v_name, + Variable v) const; + + friend Congruence + operator/(const Congruence& cg, Coefficient_traits::const_reference k); + friend Congruence + operator/(const Constraint& c, Coefficient_traits::const_reference m); + + friend bool + operator==(const Congruence& x, const Congruence& y); + + friend bool + operator!=(const Congruence& x, const Congruence& y); + + friend std::ostream& + Parma_Polyhedra_Library::IO_Operators + ::operator<<(std::ostream& s, + const Congruence_System& cgs); + + friend class Parma_Polyhedra_Library::Scalar_Products; + friend class Parma_Polyhedra_Library::Constraint; + friend class Parma_Polyhedra_Library::Congruence_System; + friend class Parma_Polyhedra_Library::Congruence_System::const_iterator; + // FIXME: The following friend declaration is at least for + // operator[] access in Grid::conversion. + friend class Parma_Polyhedra_Library::Grid; + friend class Parma_Polyhedra_Library::Linear_Expression; + + friend void + std::swap(Parma_Polyhedra_Library::Congruence& x, + Parma_Polyhedra_Library::Congruence& y); +}; + +#include "Congruence.inlines.hh" + +#endif // !defined(PPL_Congruence_defs_hh) diff --git a/src/Congruence.inlines.hh b/src/Congruence.inlines.hh new file mode 100644 index 0000000..5057530 --- /dev/null +++ b/src/Congruence.inlines.hh @@ -0,0 +1,238 @@ +/* Congruence class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Congruence_inlines_hh +#define PPL_Congruence_inlines_hh 1 + +#include "Linear_Expression.defs.hh" +#include "Constraint.defs.hh" + +#include + +namespace Parma_Polyhedra_Library { + +inline +Congruence::Congruence(const Congruence& cg) + : Row(cg) { +} + +inline +Congruence::Congruence(const Congruence& cg, + dimension_type sz, dimension_type capacity) + : Row(cg, sz, capacity) { +} + +inline +Congruence::Congruence(const Congruence& cg, + Coefficient_traits::const_reference k) + : Row(cg) { + if (k >= 0) + (*this)[size()-1] *= k; + else + (*this)[size()-1] *= -k; +} + +inline +Congruence::~Congruence() { +} + +inline +Congruence::Congruence(Linear_Expression& le, + Coefficient_traits::const_reference m) { + Row::swap(static_cast(le)); + assert(m >= 0); + (*this)[size()-1] = m; +} + +inline Congruence +Congruence::create(const Linear_Expression& e, + Coefficient_traits::const_reference n) { + // Ensure that diff has capacity for the modulus. + Linear_Expression diff(e, e.space_dimension() + 2); + diff -= n; + Congruence cg(diff, 1); + return cg; +} + +inline Congruence +Congruence::create(Coefficient_traits::const_reference n, + const Linear_Expression& e) { + // Ensure that diff has capacity for the modulus. + Linear_Expression diff(e, e.space_dimension() + 2); + diff -= n; + Congruence cg(diff, 1); + 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, 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& c) { + Row::operator=(c); + return *this; +} + +/*! \relates Congruence */ +inline Congruence +operator/(const Constraint& c, Coefficient_traits::const_reference m) { + Congruence ret(c); + return ret / m; +} + +inline Congruence& +Congruence::operator/=(Coefficient_traits::const_reference k) { + if (k >= 0) + (*this)[size()-1] *= k; + else + (*this)[size()-1] *= -k; + return *this; +} + +/*! \relates Congruence */ +inline bool +operator==(const Congruence& x, const Congruence& y) { + Congruence x_temp(x); + Congruence y_temp(y); + x_temp.strong_normalize(); + y_temp.strong_normalize(); + return static_cast(x_temp) == static_cast(y_temp); +} + +/*! \relates Congruence */ +inline bool +operator!=(const Congruence& x, const Congruence& y) { + return !(x == y); +} + +inline dimension_type +Congruence::max_space_dimension() { + // The first coefficient holds the inhomogeneous term, while + // the last coefficient is for the modulus. + return max_size() - 2; +} + +inline dimension_type +Congruence::space_dimension() const { + return size() - 2; +} + +inline Coefficient_traits::const_reference +Congruence::coefficient(const Variable v) const { + if (v.space_dimension() > space_dimension()) + throw_dimension_incompatible("coefficient(v)", "v", v); + return (*this)[v.id()+1]; +} + +inline Coefficient_traits::const_reference +Congruence::inhomogeneous_term() const { + return (*this)[0]; +} + +inline Coefficient_traits::const_reference +Congruence::modulus() const { + assert(size() > 1); + return (*this)[size()-1]; +} + +inline bool +Congruence::is_proper_congruence() const { + return modulus() > 0; +} + +inline bool +Congruence::is_equality() const { + return modulus() == 0; +} + +inline bool +Congruence::is_equal_at_dimension(dimension_type dim, + const Congruence& cg) const { + return operator[](dim) * cg.modulus() == cg[dim] * modulus(); +} + +inline void +Congruence::set_is_equality() { + (*this)[size()-1] = 0; +} + +inline void +Congruence::negate(dimension_type start, dimension_type end) { + while (start <= end) + neg_assign(operator[](start++)); +} + +inline memory_size_type +Congruence::external_memory_in_bytes() const { + return Row::external_memory_in_bytes(); +} + +inline memory_size_type +Congruence::total_memory_in_bytes() const { + return Row::total_memory_in_bytes(); +} + +inline void +Congruence::swap(Congruence& y) { + Row::swap(y); +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Congruence */ +inline void +swap(Parma_Polyhedra_Library::Congruence& x, + Parma_Polyhedra_Library::Congruence& y) { + x.swap(y); +} + +} // namespace std + +#endif // !defined(PPL_Congruence_inlines_hh) diff --git a/src/Congruence.types.hh b/src/Congruence.types.hh new file mode 100644 index 0000000..e10f6be --- /dev/null +++ b/src/Congruence.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PPL_Congruence_types_hh +#define PPL_Congruence_types_hh 1 + +namespace Parma_Polyhedra_Library { + +class Congruence; + +} + +#endif // !defined(PPL_Congruence_types_hh) diff --git a/src/Congruence_System.cc b/src/Congruence_System.cc new file mode 100644 index 0000000..aecb8bc --- /dev/null +++ b/src/Congruence_System.cc @@ -0,0 +1,582 @@ +/* Congruence_System class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#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 +#include +#include +#include +#include + +namespace PPL = Parma_Polyhedra_Library; + +PPL::Congruence_System::Congruence_System(const Constraint_System& cs) + : Matrix(0, cs.space_dimension() + 2) { + for (Constraint_System::const_iterator i = cs.begin(), + cs_end = cs.end(); i != cs_end; ++i) + if (i->is_equality()) + insert(*i); +} + +bool +PPL::Congruence_System:: +increase_space_dimension(const dimension_type new_space_dim) { + assert(space_dimension() <= new_space_dim); + + const dimension_type cols_to_add = new_space_dim - space_dimension(); + + if (cols_to_add) { + if (num_rows()) { + const dimension_type old_num_columns = num_columns(); + add_zero_columns(cols_to_add); + // Move the moduli. + swap_columns(num_columns() - 1, old_num_columns - 1); + } + else + // Empty system. + add_zero_columns(cols_to_add); + } + + assert(OK()); + return true; +} + +void +PPL::Congruence_System::insert_verbatim(const Congruence& cg) { + const dimension_type old_num_columns = num_columns(); + const dimension_type cg_size = cg.size(); + + if (cg_size > old_num_columns) { + // Resize the system, if necessary. + add_zero_columns(cg_size - old_num_columns); + if (!has_no_rows()) + // Move the moduli to the last column. + swap_columns(old_num_columns - 1, cg_size - 1); + add_row(cg); + } + else if (cg_size < old_num_columns) { + // Create a resized copy of `cg'. + Congruence rc(cg, old_num_columns, row_capacity); + // Move the modulus to its place. + std::swap(rc[cg_size - 1], rc[old_num_columns - 1]); + add_recycled_row(rc); + } + else + // Here cg_size == old_num_columns. + add_row(cg); + + assert(OK()); +} + +void +PPL::Congruence_System::insert(const Constraint& c) { + const dimension_type cg_size = c.space_dimension() + 2; + const dimension_type old_num_columns = num_columns(); + if (cg_size < old_num_columns) { + // Create a congruence of the required size from `c'. + Congruence cg(c, old_num_columns, row_capacity); + add_recycled_row(cg); + } + else { + if (cg_size > old_num_columns) { + // Resize the system, if necessary. + add_zero_columns(cg_size - old_num_columns); + if (!has_no_rows()) + // Move the moduli to the last column. + swap_columns(old_num_columns - 1, cg_size - 1); + } + Congruence cg(c, cg_size, row_capacity); + add_recycled_row(cg); + } + operator[](rows.size()-1).strong_normalize(); + + assert(OK()); +} + +void +PPL::Congruence_System::recycling_insert(Congruence_System& cgs) { + const dimension_type old_num_rows = num_rows(); + const dimension_type cgs_num_rows = cgs.num_rows(); + const dimension_type old_num_columns = num_columns(); + dimension_type cgs_num_columns = cgs.num_columns(); + if (old_num_columns >= cgs_num_columns) + add_zero_rows(cgs_num_rows, Row::Flags()); + else { + add_zero_rows_and_columns(cgs_num_rows, + cgs_num_columns - old_num_columns, + Row::Flags()); + // Swap the modulus column into the new last column. + swap_columns(old_num_columns - 1, num_columns() - 1); + } + --cgs_num_columns; // Convert to modulus index. + const dimension_type mod_index = num_columns() - 1; + for (dimension_type i = cgs_num_rows; i-- > 0; ) { + // Swap one coefficient at a time into the newly added rows, instead + // of swapping each entire row. This ensures that the added rows + // have the same capacities as the existing rows. + Congruence& new_cg = operator[](old_num_rows + i); + Congruence& old_cg = cgs[i]; + for (dimension_type j = cgs_num_columns; j-- > 0; ) + std::swap(new_cg[j], old_cg[j]); + std::swap(new_cg[mod_index], old_cg[cgs_num_columns]); // Modulus. + } + + 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(); + const dimension_type old_num_columns = x.num_columns(); + const dimension_type y_num_columns = y.num_columns(); + // Grow to the required size. + if (old_num_columns >= y_num_columns) + add_zero_rows(y_num_rows, Row::Flags()); + else { + add_zero_rows_and_columns(y_num_rows, + y_num_columns - old_num_columns, + Row::Flags()); + // Swap the modulus column into the new last column. + swap_columns(old_num_columns - 1, num_columns() - 1); + } + + // Copy the rows of `y', forcing size and capacity. + const dimension_type x_mod_index = x.num_columns() - 1; + const dimension_type y_mod_index = y_num_columns - 1; + for (dimension_type i = y_num_rows; i-- > 0; ) { + Row copy(y[i], x.row_size, x.row_capacity); + // Swap the modulus to the correct column. + std::swap(copy[x_mod_index], copy[y_mod_index]); + std::swap(copy, x[x_num_rows+i]); + } + assert(OK()); +} + +void +PPL::Congruence_System::normalize_moduli() { + dimension_type row = num_rows(); + if (row > 0) { + // Calculate the LCM of all the moduli. + PPL_DIRTY_TEMP_COEFFICIENT(lcm); + // Find last proper congruence. + while (true) { + lcm = operator[](--row).modulus(); + if (lcm > 0) + break; + if (row == 0) + // All rows are equalities. + return; + } + while (row > 0) { + const Coefficient& modulus = operator[](--row).modulus(); + if (modulus > 0) + lcm_assign(lcm, lcm, modulus); + } + + // Represent every row using the LCM as the modulus. + PPL_DIRTY_TEMP_COEFFICIENT(factor); + dimension_type row_size = operator[](0).size(); + for (row = num_rows(); row-- > 0; ) { + const Coefficient& modulus = operator[](row).modulus(); + if (modulus <= 0 || modulus == lcm) + continue; + exact_div_assign(factor, lcm, modulus); + for (dimension_type col = row_size; col-- > 0; ) + operator[](row)[col] *= factor; + operator[](row)[row_size-1] = lcm; + } + } + assert(OK()); +} + +bool +PPL::Congruence_System::is_equal_to(const Congruence_System& cgs) const { + if (num_rows() != cgs.num_rows()) + return false; + + for (dimension_type row = cgs.num_rows(); row-- > 0; ) + for (dimension_type col = cgs.num_columns(); col-- > 0; ) { + if (operator[](row)[col] == cgs[row][col]) + continue; + return false; + } + return true; +} + +bool +PPL::Congruence_System::has_linear_equalities() const { + const Congruence_System& cgs = *this; + const dimension_type modulus_index = cgs.num_columns() - 1; + for (dimension_type i = cgs.num_rows(); i-- > 0; ) + if (cgs[i][modulus_index] == 0) + return true; + return false; +} + +void +PPL::Congruence_System::const_iterator::skip_forward() { + const Matrix::const_iterator csp_end = csp->end(); + while (i != csp_end && (*this)->is_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 { + 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. + dimension_type space_dim = space_dimension(); + std::vector free_dim(space_dim, true); + dimension_type free_dims = space_dim; + for (dimension_type row = num_rows(); row-- > 0; ) { + const Congruence& cg = operator[](row); + for (dimension_type dim = space_dim; dim-- > 0; ) + if (free_dim[dim] && cg[dim+1] != 0) { + if (--free_dims == 0) { + // All dimensions are constrained. +#ifndef NDEBUG + free_dim[dim] = false; + // Check that there are free_dims dimensions marked free + // in free_dim. + dimension_type count = 0; + for (dimension_type i = space_dim; i-- > 0; ) + count += free_dim[i]; + assert(count == free_dims); +#endif + return true; + } + free_dim[dim] = false; + } + } + // At least one dimension is free of constraint. + return false; +} + +void +PPL::Congruence_System:: +affine_preimage(dimension_type v, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator) { + // `v' is the index of a column corresponding to a "user" variable + // (i.e., it cannot be the inhomogeneous term). + assert(v > 0 && v <= space_dimension()); + assert(expr.space_dimension() <= space_dimension()); + assert(denominator > 0); + + const dimension_type num_columns = this->num_columns(); + const dimension_type num_rows = this->num_rows(); + const dimension_type expr_size = expr.size(); + const bool not_invertible = (v >= expr_size || expr[v] == 0); + Congruence_System& x = *this; + + if (denominator == 1) + // Optimized computation only considering columns having indexes < + // expr_size. + for (dimension_type i = num_rows; i-- > 0; ) { + Congruence& row = x[i]; + Coefficient& row_v = row[v]; + if (row_v != 0) { + for (dimension_type j = expr_size; j-- > 0; ) + if (j != v) + // row[j] = row[j] + row_v * expr[j] + add_mul_assign(row[j], row_v, expr[j]); + if (not_invertible) + row_v = 0; + else + row_v *= expr[v]; + } + } + else + for (dimension_type i = num_rows; i-- > 0; ) { + Congruence& row = x[i]; + Coefficient& row_v = row[v]; + if (row_v != 0) { + for (dimension_type j = num_columns; j-- > 0; ) + if (j != v) { + Coefficient& row_j = row[j]; + row_j *= denominator; + if (j < expr_size) + add_mul_assign(row_j, row_v, expr[j]); + } + if (not_invertible) + row_v = 0; + else + row_v *= expr[v]; + } + } +} + +void +PPL::Congruence_System::ascii_dump(std::ostream& s) const { + const Congruence_System& x = *this; + dimension_type x_num_rows = x.num_rows(); + dimension_type x_num_columns = x.num_columns(); + s << x_num_rows << " x " << x_num_columns + << std::endl; + if (x_num_rows && x_num_columns) + for (dimension_type i = 0; i < x_num_rows; ++i) + x[i].ascii_dump(s); +} + +PPL_OUTPUT_DEFINITIONS(Congruence_System) + +bool +PPL::Congruence_System::ascii_load(std::istream& s) { + std::string str; + dimension_type num_rows; + dimension_type num_columns; + if (!(s >> num_rows)) + return false; + if (!(s >> str) || str != "x") + return false; + if (!(s >> num_columns)) + return false; + resize_no_copy(num_rows, num_columns); + + Congruence_System& x = *this; + for (dimension_type i = 0; i < x.num_rows(); ++i) + if (!x[i].ascii_load(s)) + return false; + + // Check invariants. + assert(OK()); + return true; +} + +const PPL::Congruence_System* PPL::Congruence_System::zero_dim_empty_p = 0; + +void +PPL::Congruence_System::initialize() { + assert(zero_dim_empty_p == 0); + zero_dim_empty_p + = new Congruence_System(Congruence::zero_dim_false()); +} + +void +PPL::Congruence_System::finalize() { + assert(zero_dim_empty_p != 0); + delete zero_dim_empty_p; + zero_dim_empty_p = 0; +} + +bool +PPL::Congruence_System::OK() const { + // A Congruence_System must be a valid Matrix. + if (!Matrix::OK()) + return false; + + if (num_rows()) { + if (num_columns() < 2) { +#ifndef NDEBUG + std::cerr << "Congruence_System has rows and fewer than two columns." + << std::endl; +#endif + return false; + } + } + + // Checking each congruence in the system. + const Congruence_System& x = *this; + for (dimension_type i = num_rows(); i-- > 0; ) { + const Congruence& cg = x[i]; + if (!cg.OK()) + return false; + } + + // All checks passed. + return true; +} + +/*! \relates Parma_Polyhedra_Library::Congruence_System */ +std::ostream& +PPL::IO_Operators::operator<<(std::ostream& s, const Congruence_System& cgs) { + Congruence_System::const_iterator i = cgs.begin(); + const Congruence_System::const_iterator cgs_end = cgs.end(); + if (i == cgs_end) + return s << "true"; + while (true) { + Congruence cg = *i++; + cg.strong_normalize(); + s << cg; + if (i == cgs_end) + return s; + s << ", "; + } +} + +/*! \relates Parma_Polyhedra_Library::Congruence_System */ +bool +PPL::operator==(const Congruence_System& x, const Congruence_System& y) { + if (x.num_columns() == y.num_columns()) { + dimension_type num_rows = x.num_rows(); + if (num_rows == y.num_rows()) { + while (num_rows--) { + if (x[num_rows] == y[num_rows]) + continue; + return false; + } + return true; + } + } + return false; +} + +void +PPL::Congruence_System::add_unit_rows_and_columns(dimension_type dims) { + assert(num_columns() > 0); + dimension_type col = num_columns() - 1; + dimension_type old_num_rows = num_rows(); + add_zero_rows_and_columns(dims, dims, + Linear_Row::Flags(NECESSARILY_CLOSED, + Linear_Row::LINE_OR_EQUALITY)); + // Swap the modulus column into the new last column. + swap_columns(col, col + dims); + + // Swap the added columns to the front of the matrix. + for (dimension_type row = old_num_rows; row-- > 0; ) + std::swap(operator[](row), operator[](row + dims)); + + col += dims - 1; + // Set the diagonal element of each added row. + for (dimension_type row = dims; row-- > 0; ) + const_cast(operator[](row)[col - row]) = 1; +} + +void +PPL::Congruence_System::concatenate(const Congruence_System& const_cgs) { + // TODO: this implementation is just an executable specification. + Congruence_System cgs = const_cgs; + + dimension_type added_rows = cgs.num_rows(); + dimension_type added_columns = cgs.space_dimension(); + + dimension_type old_num_rows = num_rows(); + dimension_type old_modi = num_columns() - 1; + dimension_type old_space_dim = space_dimension(); + + add_zero_rows_and_columns(added_rows, added_columns, + Row::Flags()); + + dimension_type cgs_num_columns = cgs.num_columns(); + dimension_type modi = num_columns() - 1; + + // Swap the modulus and the new last column, in the old rows. + for (dimension_type i = old_num_rows; i-- > 0; ) { + Congruence& cg = operator[](i); + std::swap(cg[old_modi], cg[modi]); + } + + // Move the congruences into *this from `cgs', shifting the + // coefficients along into the appropriate columns. + for (dimension_type i = added_rows; i-- > 0; ) { + Congruence& cg_old = cgs[i]; + Congruence& cg_new = operator[](old_num_rows + i); + // The inhomogeneous term is moved to the same column. + std::swap(cg_new[0], cg_old[0]); + // All homogeneous terms are shifted by `space_dim' columns. + for (dimension_type j = cgs_num_columns; j-- > 1; ) + std::swap(cg_old[j], cg_new[old_space_dim + j]); + } +} + +void +PPL::Congruence_System +::remove_higher_space_dimensions(const dimension_type new_dimension) { + dimension_type space_dim = space_dimension(); + + assert(new_dimension <= space_dim); + + // The removal of no dimensions from any system is a no-op. Note + // that this case also captures the only legal removal of dimensions + // from a system in a 0-dim space. + if (new_dimension == space_dim) + return; + + // Swap the modulus column into the column that will become the last + // column. + swap_columns(new_dimension + 1, space_dim + 1); + + remove_trailing_columns(space_dim - new_dimension); + assert(OK()); +} diff --git a/src/Congruence_System.defs.hh b/src/Congruence_System.defs.hh new file mode 100644 index 0000000..0a9e186 --- /dev/null +++ b/src/Congruence_System.defs.hh @@ -0,0 +1,501 @@ +/* Congruence_System class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Congruence_System_defs_hh +#define PPL_Congruence_System_defs_hh 1 + +#include "Congruence_System.types.hh" +#include "Linear_Expression.types.hh" +#include "Constraint.types.hh" +#include "Congruence.types.hh" +#include "Grid_Generator.types.hh" +#include "Matrix.defs.hh" +#include "Grid_Certificate.types.hh" +#include + +namespace Parma_Polyhedra_Library { + +namespace IO_Operators { + +//! Output operator. +/*! + \relates Parma_Polyhedra_Library::Congruence_System + Writes true 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 + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Congruence_System */ +void +swap(Parma_Polyhedra_Library::Congruence_System& x, + Parma_Polyhedra_Library::Congruence_System& y); + +} // namespace std + +//! A system of congruences. +/*! \ingroup PPL_CXX_interface + An object of the class Congruence_System is a system of congruences, + i.e., a multiset of objects of the class Congruence. + When inserting congruences in a system, space dimensions are + automatically adjusted so that all the congruences in the system + are defined on the same vector space. + + \par + In all the examples it is assumed that variables + x and y 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 exact copy of them + can be retrieved: + in general, only an equivalent congruence system + will be available, where original congruences may have been + reordered, removed (if they are trivial, duplicate or + implied by other congruences), linearly combined, etc. +*/ +class Parma_Polyhedra_Library::Congruence_System : private Matrix { +public: + //! Default constructor: builds an empty system of congruences. + Congruence_System(); + + //! Builds the singleton system containing only congruence \p cg. + explicit Congruence_System(const Congruence& cg); + + /*! \brief + If \p c represents the constraint \f$ e_1 = e_2 \f$, builds the + singleton system containing only constraint \f$ e_1 = e_2 + \pmod{0}\f$. + + \exception std::invalid_argument + Thrown if \p c is not an equality constraint. + */ + explicit Congruence_System(const Constraint& c); + + //! Builds a system containing copies of any equalities in \p cs. + explicit Congruence_System(const Constraint_System& cs); + + //! Ordinary copy-constructor. + Congruence_System(const Congruence_System& cgs); + + //! Destructor. + ~Congruence_System(); + + //! Assignment operator. + Congruence_System& operator=(const Congruence_System& cgs); + + //! Returns the maximum space dimension a Congruence_System can handle. + static dimension_type max_space_dimension(); + + //! Returns the dimension of the vector space enclosing \p *this. + dimension_type space_dimension() const; + + /*! \brief + Returns true if and only if \p *this is exactly equal + to \p cgs. + */ + bool is_equal_to(const Congruence_System& cgs) const; + + /*! \brief + Returns true if and only if \p *this contains one or + more linear equalities. + */ + bool has_linear_equalities() const; + + //! Removes all the congruences and sets the space dimension to 0. + void clear(); + + /*! \brief + Inserts in \p *this a copy of the congruence \p cg, increasing the + number of space dimensions if needed. + + The copy of \p cg will be strongly normalized after being + inserted. + */ + void insert(const Congruence& cg); + + /*! \brief + Inserts in \p *this a copy of the equality constraint \p c, seen + as a modulo 0 congruence, increasing the number of space + dimensions if needed. + + The modulo 0 congruence will be strongly normalized after being + inserted. + + \exception std::invalid_argument + Thrown if \p c is a relational constraint. + */ + void insert(const Constraint& c); + + // TODO: Consider adding a recycling_insert(cg). + + /*! \brief + Inserts in \p *this a copy of the congruences in \p cgs, + increasing the number of space dimensions if needed. + + The inserted copies will be strongly normalized. + */ + void insert(const Congruence_System& cgs); + + /*! \brief + Inserts into \p *this the congruences in \p cgs, increasing the + number of space dimensions if needed. + */ + void recycling_insert(Congruence_System& cgs); + + //! 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 gr: + \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 { + 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 true if and only if \p *this and \p y are + identical. + */ + bool operator==(const const_iterator& y) const; + + /*! \brief + Returns true if and only if \p *this and \p y are + different. + */ + bool operator!=(const const_iterator& y) const; + + private: + friend class Congruence_System; + + //! The const iterator over the matrix of congruences. + Matrix::const_iterator i; + + //! A const pointer to the matrix of congruences. + const Matrix* csp; + + //! Constructor. + const_iterator(const Matrix::const_iterator& iter, + const Congruence_System& cgs); + + //! \p *this skips to the next non-trivial congruence. + void skip_forward(); + }; + + //! Returns true 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 true if and only if \p *this is a valid + Matrix, each row in the system is a valid Congruence and the + number of columns is consistent with the number of congruences. + */ +#endif // 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 true if successful, false 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 swap(Congruence_System& cgs); + + /*! \brief + Adds \p dims rows and \p dims columns of zeroes to the matrix, + initializing the added rows as in the unit congruence system. + + \param dims + The number of rows and columns to be added: must be strictly + positive. + + Turns the \f$r \times c\f$ matrix \f$A\f$ into the \f$(r+dims) \times + (c+dims)\f$ matrix + \f$\bigl(\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_columns(dimension_type dims); + +protected: + + //! Returns true if \p g satisfies all the congruences. + bool satisfies_all_congruences(const Grid_Generator& g) const; + +private: + /*! \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; + + //! Builds an empty (i.e. zero rows) system of dimension \p d. + explicit Congruence_System(dimension_type d); + + /*! \brief + Concatenates copies of the congruences from \p cgs onto \p *this. + + \param cgs + The congruence system to append to \p this. The number of rows in + \p cgs 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 cgs in the lower right-hand side, and padding + with zeroes. + */ + void concatenate(const Congruence_System& cgs); + + //! Adjusts all expressions to have the same moduli. + void normalize_moduli(); + + //! Increase the number of space dimensions to \p new_space_dim. + /*! + \p new_space_dim must at least equal to the current space + dimension. + */ + bool increase_space_dimension(dimension_type new_space_dim); + + /*! \brief + Inserts in \p *this an exact copy of the congruence \p cg, + increasing the number of space dimensions if needed. + + This method inserts a copy of \p cg in the given form, instead of + first strong normalizing \p cg as \ref insert would do. + */ + void insert_verbatim(const Congruence& cg); + + friend class const_iterator; + friend class Grid; + friend class Grid_Certificate; + + friend void std::swap(Parma_Polyhedra_Library::Congruence_System& x, + Parma_Polyhedra_Library::Congruence_System& y); + + friend bool + operator==(const Congruence_System& x, const Congruence_System& y); + + //! Returns the \p k- th congruence of the system. + Congruence& operator[](dimension_type k); + + //! Returns a constant reference to the \p k- th congruence of the system. + const Congruence& operator[](dimension_type k) const; + + /*! \brief + Returns true if and only if any of the dimensions in + \p *this is free of constraint. + + Any equality or proper congruence affecting a dimension constrains + that dimension. + + This method assumes the system is in minimal form. + */ + bool has_a_free_dimension() const; + + /*! \brief + Substitutes a given column of coefficients by a given affine + expression. + + \param v + Index of the column to which the affine transformation is + substituted; + + \param expr + The numerator of the affine transformation: + \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$; + + \param denominator + The denominator of the affine transformation. + + We allow affine transformations (see the Section \ref + rational_grid_operations) to have rational + coefficients. Since the coefficients of linear expressions are + integers we also provide an integer \p denominator that will + be used as denominator of the affine transformation. The + denominator is required to be a positive integer and its default value + is 1. + + The affine transformation substitutes the matrix of congruences + by a new matrix whose elements \f${a'}_{ij}\f$ are built from + the old one \f$a_{ij}\f$ as follows: + \f[ + {a'}_{ij} = + \begin{cases} + a_{ij} * \mathrm{denominator} + a_{iv} * \mathrm{expr}[j] + \quad \text{for } j \neq v; \\ + \mathrm{expr}[v] * a_{iv} + \quad \text{for } j = v. + \end{cases} + \f] + + \p expr is a constant parameter and unaltered by this computation. + */ + void affine_preimage(dimension_type v, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator); + + /*! \brief + Removes the higher dimensions of the system so that the resulting + system will have dimension \p new_dimension. + + The value of \p new_dimension must be at most the space dimension + of \p *this. + */ + void remove_higher_space_dimensions(dimension_type new_dimension); + + //! Resizes the system without worrying about the old contents. + /*! + \param new_num_rows + The number of rows of the resized system; + + \param new_num_columns + The number of columns of the resized system. + + The system is expanded to the specified dimensions avoiding + reallocation whenever possible. + The contents of the original system is lost. + */ + void resize_no_copy(dimension_type new_num_rows, + dimension_type new_num_columns); +}; + +// Congruence_System.inlines.hh is not included here on purpose. + +#endif // !defined(PPL_Congruence_System_defs_hh) diff --git a/src/Congruence_System.inlines.hh b/src/Congruence_System.inlines.hh new file mode 100644 index 0000000..80abd24 --- /dev/null +++ b/src/Congruence_System.inlines.hh @@ -0,0 +1,221 @@ +/* Congruence_System class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Congruence_System_inlines_hh +#define PPL_Congruence_System_inlines_hh 1 + +#include "Congruence.defs.hh" + +namespace Parma_Polyhedra_Library { + +inline Congruence& +Congruence_System::operator[](const dimension_type k) { + return static_cast(Matrix::operator[](k)); +} + +inline const Congruence& +Congruence_System::operator[](const dimension_type k) const { + return static_cast(Matrix::operator[](k)); +} + +inline void +Congruence_System::insert(const Congruence& cg) { + insert_verbatim(cg); + static_cast(operator[](rows.size()-1)).strong_normalize(); + assert(OK()); +} + +inline +Congruence_System::Congruence_System() + : Matrix(0, 2) { +} + +inline +Congruence_System::Congruence_System(const Congruence& cg) + : Matrix(0, 2) { + insert(cg); +} + +inline +Congruence_System::Congruence_System(const Constraint& c) + : Matrix(0, 2) { + insert(c); +} + +inline +Congruence_System::Congruence_System(const Congruence_System& cs) + : Matrix(cs) { +} + +inline +Congruence_System::Congruence_System(const dimension_type d) + : Matrix(0, d + 2) { +} + +inline +Congruence_System::~Congruence_System() { +} + +inline Congruence_System& +Congruence_System::operator=(const Congruence_System& y) { + Matrix::operator=(y); + return *this; +} + +inline dimension_type +Congruence_System::max_space_dimension() { + return Matrix::max_num_columns() - 2; +} + +inline dimension_type +Congruence_System::space_dimension() const { + return Matrix::num_columns() - 2; +} + +inline void +Congruence_System::clear() { + Matrix::clear(); + add_zero_columns(2); // Modulus and constant term. +} + +inline void +Congruence_System::resize_no_copy(const dimension_type new_num_rows, + const dimension_type new_num_columns) { + Matrix::resize_no_copy(new_num_rows, new_num_columns, Row::Flags()); +} + +inline const Congruence_System& +Congruence_System::zero_dim_empty() { + 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 static_cast(*i); +} + +inline const Congruence* +Congruence_System::const_iterator::operator->() const { + return static_cast(i.operator->()); +} + +inline Congruence_System::const_iterator& +Congruence_System::const_iterator::operator++() { + ++i; + skip_forward(); + return *this; +} + +inline Congruence_System::const_iterator +Congruence_System::const_iterator::operator++(int) { + const const_iterator tmp = *this; + operator++(); + return tmp; +} + +inline bool +Congruence_System::const_iterator::operator==(const const_iterator& y) const { + return i == y.i; +} + +inline bool +Congruence_System::const_iterator::operator!=(const const_iterator& y) const { + return i != y.i; +} + +inline +Congruence_System::const_iterator:: +const_iterator(const Matrix::const_iterator& iter, + const Congruence_System& csys) + : i(iter), csp(&csys) { +} + +inline Congruence_System::const_iterator +Congruence_System::begin() const { + const_iterator i(Matrix::begin(), *this); + i.skip_forward(); + return i; +} + +inline Congruence_System::const_iterator +Congruence_System::end() const { + const const_iterator i(Matrix::end(), *this); + return i; +} + +inline bool +Congruence_System::empty() const { + return begin() == end(); +} + +inline void +Congruence_System::swap(Congruence_System& y) { + Matrix::swap(y); +} + +inline memory_size_type +Congruence_System::external_memory_in_bytes() const { + return Matrix::external_memory_in_bytes(); +} + +inline memory_size_type +Congruence_System::total_memory_in_bytes() const { + return Matrix::total_memory_in_bytes(); +} + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Congruence_System */ +inline void +swap(Parma_Polyhedra_Library::Congruence_System& x, + Parma_Polyhedra_Library::Congruence_System& y) { + x.swap(y); +} + +} // namespace std + +#endif // !defined(PPL_Congruence_System_inlines_hh) diff --git a/src/Congruence_System.types.hh b/src/Congruence_System.types.hh new file mode 100644 index 0000000..9ee5c06 --- /dev/null +++ b/src/Congruence_System.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PPL_Congruence_System_types_hh +#define PPL_Congruence_System_types_hh 1 + +namespace Parma_Polyhedra_Library { + +class Congruence_System; + +} + +#endif // !defined(PPL_Congruence_System_types_hh) diff --git a/src/Constraint.cc b/src/Constraint.cc new file mode 100644 index 0000000..a6b397f --- /dev/null +++ b/src/Constraint.cc @@ -0,0 +1,368 @@ +/* Constraint class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Constraint.defs.hh" +#include "Variable.defs.hh" +#include "Congruence.defs.hh" +#include +#include +#include + +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 = Variable(0); + Constraint c(e, NONSTRICT_INEQUALITY, NOT_NECESSARILY_CLOSED); + return c; +} + +PPL::Constraint::Constraint(const Congruence& cg) + : Linear_Row(cg.is_equality() + // Size includes extra column for the inhomogeneous term. + ? cg.space_dimension() + 1 + : (throw_invalid_argument("Constraint(cg)", + "congruence cg must be an equality."), + 0), + // Capacity also includes a column for the epsilon coefficient. + compute_capacity(cg.space_dimension() + 2, Row::max_size()), + Flags(NECESSARILY_CLOSED, LINE_OR_EQUALITY)) { + Constraint& c = *this; + // Copy coefficients and inhomogeneous term. + for (dimension_type i = cg.space_dimension() + 1; i-- > 0; ) + c[i] = cg[i]; + // Enforce normalization. + strong_normalize(); +} + +PPL::Constraint::Constraint(const Congruence& cg, + dimension_type sz, + dimension_type capacity) + : Linear_Row(cg.is_equality() + ? sz + : (throw_invalid_argument("Constraint(cg, sz, c)", + "congruence cg must be an equality."), + 0), + capacity, + Flags(NECESSARILY_CLOSED, LINE_OR_EQUALITY)) { + Constraint& c = *this; + // Copy coefficients. + assert(sz > 0); + while (sz-- > 0) + c[sz] = cg[sz]; +} + +bool +PPL::Constraint::is_tautological() const { + assert(size() > 0); + const Constraint& x = *this; + if (x.all_homogeneous_terms_are_zero()) + if (is_equality()) + return x[0] == 0; + else + // Non-strict inequality constraint. + return x[0] >= 0; + else + // There is a non-zero homogeneous coefficient. + if (is_necessarily_closed()) + return false; + else { + // The constraint is NOT necessarily closed. + const dimension_type eps_index = size() - 1; + const int eps_sign = sgn(x[eps_index]); + if (eps_sign > 0) + // We have found the constraint epsilon >= 0. + return true; + if (eps_sign == 0) + // One of the `true' dimensions has a non-zero coefficient. + return false; + else { + // Here the epsilon coefficient is negative: strict inequality. + if (x[0] <= 0) + // A strict inequality such as `lhs - k > 0', + // where k is a non negative integer, cannot be trivially true. + return false; + // Checking for another non-zero coefficient. + for (dimension_type i = eps_index; --i > 0; ) + if (x[i] != 0) + return false; + // We have the inequality `k > 0', + // where k is a positive integer. + return true; + } + } +} + +bool +PPL::Constraint::is_inconsistent() const { + assert(size() > 0); + const Constraint& x = *this; + if (x.all_homogeneous_terms_are_zero()) + // The inhomogeneous term is the only non-zero coefficient. + if (is_equality()) + return x[0] != 0; + else + // Non-strict inequality constraint. + return x[0] < 0; + else + // There is a non-zero homogeneous coefficient. + if (is_necessarily_closed()) + return false; + else { + // The constraint is NOT necessarily closed. + const dimension_type eps_index = size() - 1; + if (x[eps_index] >= 0) + // If positive, we have found the constraint epsilon >= 0. + // If zero, one of the `true' dimensions has a non-zero coefficient. + // In both cases, it is not trivially false. + return false; + else { + // Here the epsilon coefficient is negative: strict inequality. + if (x[0] > 0) + // A strict inequality such as `lhs + k > 0', + // where k is a positive integer, cannot be trivially false. + return false; + // Checking for another non-zero coefficient. + for (dimension_type i = eps_index; --i > 0; ) + if (x[i] != 0) + return false; + // We have the inequality `k > 0', + // where k is zero or a negative integer. + return true; + } + } +} + +bool +PPL::Constraint::is_equivalent_to(const Constraint& y) const { + const Constraint& x = *this; + const dimension_type x_space_dim = x.space_dimension(); + if (x_space_dim != y.space_dimension()) + return false; + + const Type x_type = x.type(); + if (x_type != y.type()) { + // Check for special cases. + if (x.is_tautological()) + return y.is_tautological(); + else + return x.is_inconsistent() && y.is_inconsistent(); + } + + if (x_type == STRICT_INEQUALITY) { + // Due to the presence of epsilon-coefficients, syntactically + // different strict inequalities may actually encode the same + // topologically open half-space. + // First, drop the epsilon-coefficient ... + Linear_Expression x_expr(x); + Linear_Expression y_expr(y); + // ... then, re-normalize ... + x_expr.normalize(); + y_expr.normalize(); + // ... and finally check for syntactic equality. + for (dimension_type i = x_space_dim + 1; i-- > 0; ) + if (x_expr[i] != y_expr[i]) + return false; + return true; + } + + // `x' and 'y' are of the same type and they are not strict inequalities; + // thus, the epsilon-coefficient, if present, is zero. + // It is sufficient to check for syntactic equality. + for (dimension_type i = x_space_dim + 1; i-- > 0; ) + if (x[i] != y[i]) + return false; + return true; +} + +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() { + assert(zero_dim_false_p == 0); + zero_dim_false_p + = new Constraint(Linear_Expression::zero() == Coefficient_one()); + + assert(zero_dim_positivity_p == 0); + zero_dim_positivity_p + = new Constraint(Linear_Expression::zero() <= Coefficient_one()); + + assert(epsilon_geq_zero_p == 0); + epsilon_geq_zero_p + = new Constraint(construct_epsilon_geq_zero()); + + assert(epsilon_leq_one_p == 0); + epsilon_leq_one_p + = new Constraint(Linear_Expression::zero() < Coefficient_one()); +} + +void +PPL::Constraint::finalize() { + assert(zero_dim_false_p != 0); + delete zero_dim_false_p; + zero_dim_false_p = 0; + + assert(zero_dim_positivity_p != 0); + delete zero_dim_positivity_p; + zero_dim_positivity_p = 0; + + assert(epsilon_geq_zero_p != 0); + delete epsilon_geq_zero_p; + epsilon_geq_zero_p = 0; + + assert(epsilon_leq_one_p != 0); + delete epsilon_leq_one_p; + epsilon_leq_one_p = 0; +} + +/*! \relates Parma_Polyhedra_Library::Constraint */ +std::ostream& +PPL::IO_Operators::operator<<(std::ostream& s, const Constraint& c) { + const dimension_type num_variables = c.space_dimension(); + PPL_DIRTY_TEMP_COEFFICIENT(cv); + bool first = true; + for (dimension_type v = 0; v < num_variables; ++v) { + cv = c.coefficient(Variable(v)); + if (cv != 0) { + if (!first) { + if (cv > 0) + s << " + "; + else { + s << " - "; + neg_assign(cv); + } + } + else + first = false; + if (cv == -1) + s << "-"; + else if (cv != 1) + s << cv << "*"; + s << PPL::Variable(v); + } + } + if (first) + s << Coefficient_zero(); + const char* relation_symbol = 0; + switch (c.type()) { + case Constraint::EQUALITY: + relation_symbol = " = "; + break; + case Constraint::NONSTRICT_INEQUALITY: + relation_symbol = " >= "; + break; + case Constraint::STRICT_INEQUALITY: + relation_symbol = " > "; + break; + } + s << relation_symbol << -c.inhomogeneous_term(); + return s; +} + +/*! \relates Parma_Polyhedra_Library::Constraint */ +std::ostream& +PPL::IO_Operators::operator<<(std::ostream& s, const Constraint::Type& t) { + const char* n = 0; + switch (t) { + case Constraint::EQUALITY: + n = "EQUALITY"; + break; + case Constraint::NONSTRICT_INEQUALITY: + n = "NONSTRICT_INEQUALITY"; + break; + case Constraint::STRICT_INEQUALITY: + n = "STRICT_INEQUALITY"; + break; + } + s << n; + return s; +} + +PPL_OUTPUT_DEFINITIONS(Constraint) + +bool +PPL::Constraint::OK() const { + // Check the underlying Linear_Row object. + if (!Linear_Row::OK()) + return false; + + // Topology consistency checks. + const dimension_type min_size = is_necessarily_closed() ? 1 : 2; + if (size() < min_size) { +#ifndef NDEBUG + std::cerr << "Constraint has fewer coefficients than the minimum " + << "allowed by its topology:" + << std::endl + << "size is " << size() + << ", minimum is " << min_size << "." + << std::endl; +#endif + return false; + } + + if (is_equality() && !is_necessarily_closed() && (*this)[size() - 1] != 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.defs.hh b/src/Constraint.defs.hh new file mode 100644 index 0000000..7ff7805 --- /dev/null +++ b/src/Constraint.defs.hh @@ -0,0 +1,563 @@ +/* Constraint class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Constraint_defs_hh +#define PPL_Constraint_defs_hh 1 + +#include "Constraint.types.hh" +#include "Scalar_Products.types.hh" +#include "Linear_Row.defs.hh" +#include "Variable.defs.hh" +#include "Linear_Expression.defs.hh" +#include "Constraint_System.defs.hh" +#include "Polyhedron.types.hh" +#include "Congruence.types.hh" +#include + +namespace Parma_Polyhedra_Library { + +// Put them in the namespace here to declare them friend later. + +//! Returns true if and only if \p x is equivalent to \p y. +/*! \relates Constraint */ +bool +operator==(const Constraint& x, const Constraint& y); + +//! Returns true if and only if \p x is not equivalent to \p y. +/*! \relates Constraint */ +bool +operator!=(const Constraint& x, const Constraint& y); + +//! Returns the constraint \p e1 = \p e2. +/*! \relates Constraint */ +Constraint +operator==(const Linear_Expression& e1, const Linear_Expression& e2); + +//! Returns the constraint \p 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); + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Constraint */ +void swap(Parma_Polyhedra_Library::Constraint& x, + Parma_Polyhedra_Library::Constraint& y); + +} // namespace std + +//! A linear equality or inequality. +/*! \ingroup PPL_CXX_interface + An object of the class Constraint is either: + - an equality: \f$\sum_{i=0}^{n-1} a_i x_i + b = 0\f$; + - a non-strict inequality: \f$\sum_{i=0}^{n-1} a_i x_i + b \geq 0\f$; or + - a strict inequality: \f$\sum_{i=0}^{n-1} a_i x_i + b > 0\f$; + + where \f$n\f$ is the dimension of the space, + \f$a_i\f$ is the integer coefficient of variable \f$x_i\f$ + and \f$b\f$ is the integer inhomogeneous term. + + \par How to build a constraint + Constraints are typically built by applying a relation symbol + to a pair of linear expressions. + Available relation symbols are equality (==), + non-strict inequalities (\>= and \<=) and + strict inequalities (\< and \>). + 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 + x, y and z + 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 : private Linear_Row { +public: + //! Ordinary copy-constructor. + Constraint(const Constraint& c); + + //! Copy-constructs from equality congruence \p cg. + /*! + \exception std::invalid_argument + Thrown if \p cg is a proper congruence. + */ + explicit Constraint(const Congruence& cg); + + //! Destructor. + ~Constraint(); + + //! Assignment operator. + Constraint& operator=(const Constraint& c); + + //! Returns the maximum space dimension a Constraint can handle. + static dimension_type max_space_dimension(); + + //! Returns the dimension of the vector space enclosing \p *this. + dimension_type space_dimension() const; + + //! The constraint type. + enum Type { + /*! The constraint is an equality. */ + EQUALITY, + /*! The constraint is a non-strict inequality. */ + NONSTRICT_INEQUALITY, + /*! The constraint is a strict inequality. */ + STRICT_INEQUALITY + }; + + //! Returns the constraint type of \p *this. + Type type() const; + + /*! \brief + Returns true if and only if + \p *this is an equality constraint. + */ + bool is_equality() const; + + /*! \brief + Returns true if and only if + \p *this is an inequality constraint (either strict or non-strict). + */ + bool is_inequality() const; + + /*! \brief + Returns true if and only if + \p *this is a non-strict inequality constraint. + */ + bool is_nonstrict_inequality() const; + + /*! \brief + Returns true 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 positivity constraint. + */ + 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 true 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 true 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 true if and only if \p *this and \p y + are equivalent constraints. + + Constraints having different space dimensions are not equivalent. + Note that constraints having different types may nonetheless be + equivalent, if they both are tautologies or inconsistent. + */ + bool is_equivalent_to(const Constraint& y) const; + + PPL_OUTPUT_DECLARATIONS + + /*! \brief + Loads from \p s an ASCII representation (as produced by + ascii_dump(std::ostream&) const) and sets \p *this accordingly. + Returns true if successful, false otherwise. + */ + bool ascii_load(std::istream& s); + + //! Checks if all the invariants are satisfied. + bool OK() const; + + //! Swaps \p *this with \p y. + void swap(Constraint& y); + +private: + /*! \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 positivity constraint. + */ + 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; + + friend class Parma_Polyhedra_Library::Congruence; + friend class Parma_Polyhedra_Library::Scalar_Products; + friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign; + friend class Parma_Polyhedra_Library::Constraint_System; + friend class Parma_Polyhedra_Library::Constraint_System::const_iterator; + // FIXME: the following friend declaration should be avoided. + friend class Parma_Polyhedra_Library::Polyhedron; + + friend + Parma_Polyhedra_Library + ::Linear_Expression::Linear_Expression(const Constraint& c); + + //! Default constructor: private and not implemented. + Constraint(); + + /*! \brief + Builds a constraint of type \p type and topology \p topology, + stealing the coefficients from \p e. + */ + Constraint(Linear_Expression& e, Type type, Topology topology); + + //! Constructs from a congruence, with specified size and capacity. + Constraint(const Congruence& cg, dimension_type sz, dimension_type capacity); + + /*! \brief + Throws a std::invalid_argument exception containing + error message \p message. + */ + void + throw_invalid_argument(const char* method, const char* message) const; + + /*! \brief + Throws a std::invalid_argument exception + containing the appropriate error message. + */ + void + throw_dimension_incompatible(const char* method, + const char* name_var, + Variable v) const; + + 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<=(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<(const Linear_Expression& e, Coefficient_traits::const_reference n); + friend Constraint + operator<(Coefficient_traits::const_reference n, const Linear_Expression& e); + + //! Copy-constructor with given size. + Constraint(const Constraint& c, dimension_type sz); + + /*! \brief + Builds a new copy of the zero-dimension space constraint + \f$\epsilon \geq 0\f$ (used to implement NNC polyhedra). + */ + static Constraint construct_epsilon_geq_zero(); + + //! Returns the zero-dimension space constraint \f$\epsilon \geq 0\f$. + static const Constraint& epsilon_geq_zero(); + + /*! \brief + The zero-dimension space constraint \f$\epsilon \leq 1\f$ + (used to implement NNC polyhedra). + */ + static const Constraint& epsilon_leq_one(); + + //! Sets the constraint type to EQUALITY. + void set_is_equality(); + + //! Sets the constraint to be an inequality. + /*! + Whether the constraint type will become NONSTRICT_INEQUALITY + or STRICT_INEQUALITY depends on the topology and the value + of the low-level coefficients of the constraint. + */ + void set_is_inequality(); +}; + +namespace Parma_Polyhedra_Library { + +namespace IO_Operators { + +//! Output operator. +/*! \relates Parma_Polyhedra_Library::Constraint */ +std::ostream& operator<<(std::ostream& s, const Constraint& c); + +//! Output operator. +/*! \relates Parma_Polyhedra_Library::Constraint */ +std::ostream& operator<<(std::ostream& s, const Constraint::Type& t); + +} // namespace IO_Operators + +} // namespace Parma_Polyhedra_Library + +#include "Constraint.inlines.hh" + +#endif // !defined(PPL_Constraint_defs_hh) diff --git a/src/Constraint.inlines.hh b/src/Constraint.inlines.hh new file mode 100644 index 0000000..74516a2 --- /dev/null +++ b/src/Constraint.inlines.hh @@ -0,0 +1,379 @@ +/* Constraint class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Constraint_inlines_hh +#define PPL_Constraint_inlines_hh 1 + +#include "Linear_Expression.defs.hh" + +namespace Parma_Polyhedra_Library { + +inline +Constraint::Constraint(Linear_Expression& e, Type type, Topology topology) { + assert(type != STRICT_INEQUALITY || topology == NOT_NECESSARILY_CLOSED); + Linear_Row::swap(e); + flags() = Flags(topology, (type == EQUALITY + ? LINE_OR_EQUALITY + : RAY_OR_POINT_OR_INEQUALITY)); +} + +inline +Constraint::Constraint(const Constraint& c) + : Linear_Row(c) { +} + +inline +Constraint::Constraint(const Constraint& c, const dimension_type sz) + : Linear_Row(c, sz, sz) { +} + +inline +Constraint::~Constraint() { +} + +inline Constraint& +Constraint::operator=(const Constraint& c) { + Linear_Row::operator=(c); + return *this; +} + +inline dimension_type +Constraint::max_space_dimension() { + return Linear_Row::max_space_dimension(); +} + +inline dimension_type +Constraint::space_dimension() const { + return Linear_Row::space_dimension(); +} + +inline bool +Constraint::is_equality() const { + return is_line_or_equality(); +} + +inline bool +Constraint::is_inequality() const { + return is_ray_or_point_or_inequality(); +} + +inline Constraint::Type +Constraint::type() const { + if (is_equality()) + return EQUALITY; + if (is_necessarily_closed()) + return NONSTRICT_INEQUALITY; + else + return ((*this)[size() - 1] < 0) + ? STRICT_INEQUALITY + : NONSTRICT_INEQUALITY; +} + +inline bool +Constraint::is_nonstrict_inequality() const { + return type() == NONSTRICT_INEQUALITY; +} + +inline bool +Constraint::is_strict_inequality() const { + return type() == STRICT_INEQUALITY; +} + +inline void +Constraint::set_is_equality() { + set_is_line_or_equality(); +} + +inline void +Constraint::set_is_inequality() { + set_is_ray_or_point_or_inequality(); +} + +inline Coefficient_traits::const_reference +Constraint::coefficient(const Variable v) const { + if (v.space_dimension() > space_dimension()) + throw_dimension_incompatible("coefficient(v)", "v", v); + return Linear_Row::coefficient(v.id()); +} + +inline Coefficient_traits::const_reference +Constraint::inhomogeneous_term() const { + return Linear_Row::inhomogeneous_term(); +} + +inline memory_size_type +Constraint::external_memory_in_bytes() const { + return Linear_Row::external_memory_in_bytes(); +} + +inline memory_size_type +Constraint::total_memory_in_bytes() const { + return Linear_Row::total_memory_in_bytes(); +} + +/*! \relates Constraint */ +inline bool +operator==(const Constraint& x, const Constraint& y) { + return x.is_equivalent_to(y); +} + +/*! \relates Constraint */ +inline bool +operator!=(const Constraint& x, const Constraint& y) { + return !x.is_equivalent_to(y); +} + +/*! \relates Constraint */ +inline Constraint +operator==(const Linear_Expression& e1, const Linear_Expression& e2) { + Linear_Expression diff = e1 - e2; + Constraint c(diff, Constraint::EQUALITY, NECESSARILY_CLOSED); + // Enforce normalization. + c.strong_normalize(); + return c; +} + +/*! \relates Constraint */ +inline Constraint +operator==(const Variable v1, const Variable v2) { + Linear_Expression diff + = (v1.space_dimension() < v2.space_dimension()) ? v1-v2 : v2-v1; + return Constraint(diff, Constraint::EQUALITY, NECESSARILY_CLOSED); +} + +/*! \relates Constraint */ +inline Constraint +operator>=(const Linear_Expression& e1, const Linear_Expression& e2) { + Linear_Expression diff = e1 - e2; + Constraint c(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED); + // Enforce normalization. + c.normalize(); + return c; +} + +/*! \relates Constraint */ +inline Constraint +operator>=(const Variable v1, const Variable v2) { + Linear_Expression diff = v1-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; + // Setting the epsilon coefficient to -1. + // NOTE: this also enforces normalization. + const dimension_type e1_dim = e1.space_dimension(); + const dimension_type e2_dim = e2.space_dimension(); + if (e1_dim > e2_dim) + diff -= Variable(e1_dim); + else + diff -= Variable(e2_dim); + diff += e1; + diff -= e2; + + Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED); + return c; +} + +/*! \relates Constraint */ +inline Constraint +operator>(const Variable v1, const Variable v2) { + Linear_Expression diff = v1-v2; + diff -= Variable(std::max(v1.space_dimension(), v2.space_dimension())); + return Constraint(diff, + Constraint::STRICT_INEQUALITY, + NOT_NECESSARILY_CLOSED); +} + +/*! \relates Constraint */ +inline Constraint +operator==(Coefficient_traits::const_reference n, const Linear_Expression& e) { + Linear_Expression diff = n - e; + Constraint c(diff, Constraint::EQUALITY, NECESSARILY_CLOSED); + // Enforce normalization. + c.strong_normalize(); + return c; +} + +/*! \relates Constraint */ +inline Constraint +operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e) { + Linear_Expression diff = n - e; + Constraint c(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED); + // Enforce normalization. + c.normalize(); + return c; +} + +/*! \relates Constraint */ +inline Constraint +operator>(Coefficient_traits::const_reference n, const Linear_Expression& e) { + Linear_Expression diff; + // Setting the epsilon coefficient to -1. + // NOTE: this also enforces normalization. + diff -= Variable(e.space_dimension()); + diff += n; + diff -= e; + + Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED); + return c; +} + +/*! \relates Constraint */ +inline Constraint +operator==(const Linear_Expression& e, Coefficient_traits::const_reference n) { + Linear_Expression diff = e - n; + Constraint c(diff, Constraint::EQUALITY, NECESSARILY_CLOSED); + // Enforce normalization. + c.strong_normalize(); + return c; +} + +/*! \relates Constraint */ +inline Constraint +operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n) { + Linear_Expression diff = e - n; + Constraint c(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED); + // Enforce normalization. + c.normalize(); + return c; +} + +/*! \relates Constraint */ +inline Constraint +operator>(const Linear_Expression& e, Coefficient_traits::const_reference n) { + Linear_Expression diff; + // Setting the epsilon coefficient to -1. + // NOTE: this also enforces normalization. + diff -= Variable(e.space_dimension()); + diff += e; + diff -= n; + + Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED); + c.set_not_necessarily_closed(); + c.set_is_inequality(); + return c; +} + +/*! \relates Constraint */ +inline Constraint +operator<=(const Linear_Expression& e1, const Linear_Expression& e2) { + return e2 >= e1; +} + +/*! \relates Constraint */ +inline Constraint +operator<=(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() { + assert(zero_dim_false_p != 0); + return *zero_dim_false_p; +} + +inline const Constraint& +Constraint::zero_dim_positivity() { + assert(zero_dim_positivity_p != 0); + return *zero_dim_positivity_p; +} + +inline const Constraint& +Constraint::epsilon_geq_zero() { + assert(epsilon_geq_zero_p != 0); + return *epsilon_geq_zero_p; +} + +inline const Constraint& +Constraint::epsilon_leq_one() { + assert(epsilon_leq_one_p != 0); + return *epsilon_leq_one_p; +} + +inline void +Constraint::ascii_dump(std::ostream& s) const { + Linear_Row::ascii_dump(s); +} + +inline bool +Constraint::ascii_load(std::istream& s) { + return Linear_Row::ascii_load(s); +} + +inline void +Constraint::swap(Constraint& y) { + Linear_Row::swap(y); +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Constraint */ +inline void +swap(Parma_Polyhedra_Library::Constraint& x, + Parma_Polyhedra_Library::Constraint& y) { + x.swap(y); +} + +} // namespace std + +#endif // !defined(PPL_Constraint_inlines_hh) diff --git a/src/Constraint.types.hh b/src/Constraint.types.hh new file mode 100644 index 0000000..4975318 --- /dev/null +++ b/src/Constraint.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PPL_Constraint_types_hh +#define PPL_Constraint_types_hh 1 + +namespace Parma_Polyhedra_Library { + +class Constraint; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Constraint_types_hh) diff --git a/src/Constraint_System.cc b/src/Constraint_System.cc new file mode 100644 index 0000000..5c2bcc3 --- /dev/null +++ b/src/Constraint_System.cc @@ -0,0 +1,624 @@ +/* Constraint_System class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Constraint_System.defs.hh" +#include "Constraint_System.inlines.hh" +#include "Generator.defs.hh" +#include "Scalar_Products.defs.hh" +#include "Congruence_System.defs.hh" +#include "Congruence_System.inlines.hh" +#include +#include +#include +#include +#include + +namespace PPL = Parma_Polyhedra_Library; + +PPL::Constraint_System::Constraint_System(const Congruence_System& cgs) + : Linear_System(NECESSARILY_CLOSED, 0, cgs.space_dimension() + 1) { + for (Congruence_System::const_iterator i = cgs.begin(), + cgs_end = cgs.end(); i != cgs_end; ++i) + if (i->is_equality()) + // TODO: Consider adding a recycling_insert to save the extra copy here. + insert(Constraint(*i)); +} + +bool +PPL::Constraint_System:: +adjust_topology_and_space_dimension(const Topology new_topology, + const dimension_type new_space_dim) { + assert(space_dimension() <= new_space_dim); + + const dimension_type old_space_dim = space_dimension(); + const Topology old_topology = topology(); + dimension_type cols_to_be_added = new_space_dim - old_space_dim; + + // Dealing with empty constraint systems first. + if (num_rows() == 0) { + if (num_columns() == 0) + if (new_topology == NECESSARILY_CLOSED) { + add_zero_columns(++cols_to_be_added); + set_necessarily_closed(); + } + else { + cols_to_be_added += 2; + add_zero_columns(cols_to_be_added); + set_not_necessarily_closed(); + } + else + // Here `num_columns() > 0'. + if (old_topology != new_topology) + if (new_topology == NECESSARILY_CLOSED) { + switch (cols_to_be_added) { + case 0: + remove_trailing_columns(1); + break; + case 1: + // Nothing to do. + break; + default: + add_zero_columns(--cols_to_be_added); + } + set_necessarily_closed(); + } + else { + // Here old_topology == NECESSARILY_CLOSED + // and new_topology == NOT_NECESSARILY_CLOSED. + add_zero_columns(++cols_to_be_added); + set_not_necessarily_closed(); + } + else { + // Here topologies agree. + if (cols_to_be_added > 0) + add_zero_columns(cols_to_be_added); + } + assert(OK()); + return true; + } + + // Here the constraint system is not empty. + if (cols_to_be_added > 0) + if (old_topology != new_topology) + if (new_topology == NECESSARILY_CLOSED) { + // A NOT_NECESSARILY_CLOSED constraint system + // can be converted to a NECESSARILY_CLOSED one + // only if it does not contain strict inequalities. + if (has_strict_inequalities()) + return false; + // Since there were no strict inequalities, + // the only constraints that may have a non-zero epsilon coefficient + // are the eps-leq-one and the eps-geq-zero constraints. + // If they are present, we erase these rows, so that the + // epsilon column will only contain zeroes: as a consequence, + // we just decrement the number of columns to be added. + Constraint_System& cs = *this; + const dimension_type eps_index = old_space_dim + 1; + dimension_type cs_num_rows = cs.num_rows(); + bool was_sorted = cs.is_sorted(); + if (was_sorted) + cs.set_sorted(false); + + // If we have no pending rows, we only check if + // we must erase some rows. + if (cs.num_pending_rows() == 0) { + for (dimension_type i = cs_num_rows; i-- > 0; ) + if (cs[i][eps_index] != 0) { + --cs_num_rows; + std::swap(cs[i], cs[cs_num_rows]); + } + cs.erase_to_end(cs_num_rows); + cs.unset_pending_rows(); + } + else { + // There are pending rows, and we cannot swap them + // into the non-pending part of the matrix. + // Thus, we first work on the non-pending part as if it was + // an independent matrix; then we work on the pending part. + const dimension_type old_first_pending = cs.first_pending_row(); + dimension_type new_first_pending = old_first_pending; + for (dimension_type i = new_first_pending; i-- > 0; ) + if (cs[i][eps_index] != 0) { + --new_first_pending; + std::swap(cs[i], cs[new_first_pending]); + } + const dimension_type num_swaps + = old_first_pending - new_first_pending; + cs.set_index_first_pending_row(new_first_pending); + // Move the swapped rows to the real end of the matrix. + for (dimension_type i = num_swaps; i-- > 0; ) + std::swap(cs[old_first_pending - i], cs[cs_num_rows - i]); + cs_num_rows -= num_swaps; + // Now iterate through the pending rows. + for (dimension_type i = cs_num_rows; i-- > new_first_pending; ) + if (cs[i][eps_index] != 0) { + --cs_num_rows; + std::swap(cs[i], cs[cs_num_rows]); + } + cs.erase_to_end(cs_num_rows); + } + + // If `cs' was sorted we sort it again. + if (was_sorted) + cs.sort_rows(); + if (--cols_to_be_added > 0) + add_zero_columns(cols_to_be_added); + set_necessarily_closed(); + } + else { + // A NECESSARILY_CLOSED constraint system is converted to + // a NOT_NECESSARILY_CLOSED one by adding a further column + // of zeroes for the epsilon coefficients. + add_zero_columns(++cols_to_be_added); + set_not_necessarily_closed(); + } + else { + // Topologies agree: first add the required zero columns ... + add_zero_columns(cols_to_be_added); + // ... and, if needed, move the epsilon coefficients + // to the new last column. + if (old_topology == NOT_NECESSARILY_CLOSED) + swap_columns(old_space_dim + 1, new_space_dim + 1); + } + else + // Here `cols_to_be_added == 0'. + if (old_topology != new_topology) { + if (new_topology == NECESSARILY_CLOSED) { + // A NOT_NECESSARILY_CLOSED constraint system + // can be converted to a NECESSARILY_CLOSED one + // only if it does not contain strict inequalities. + if (has_strict_inequalities()) + return false; + // We just remove the column of the epsilon coefficients. + remove_trailing_columns(1); + set_necessarily_closed(); + } + else { + // We just add the column of the epsilon coefficients. + add_zero_columns(1); + set_not_necessarily_closed(); + } + } + // We successfully adjusted space dimensions and topology. + assert(OK()); + return true; +} + +bool +PPL::Constraint_System::has_strict_inequalities() const { + if (is_necessarily_closed()) + return false; + const Constraint_System& cs = *this; + const dimension_type eps_index = cs.num_columns() - 1; + // We verify if the system has strict inequalities + // also in the pending part. + for (dimension_type i = cs.num_rows(); i-- > 0; ) { + const Constraint& c = cs[i]; + // Optimized type checking: we already know the topology; + // also, equalities have the epsilon coefficient equal to zero. + // NOTE: the constraint eps_leq_one should not be considered + // a strict inequality. + if (c[eps_index] < 0 && !c.is_tautological()) + return true; + } + return false; +} + +void +PPL::Constraint_System::insert(const Constraint& c) { + // We are sure that the matrix has no pending rows + // and that the new row is not a pending constraint. + assert(num_pending_rows() == 0); + if (topology() == c.topology()) + Linear_System::insert(c); + else + // `*this' and `c' have different topologies. + if (is_necessarily_closed()) { + // Padding the matrix with a columns of zeroes + // corresponding to the epsilon coefficients. + add_zero_columns(1); + set_not_necessarily_closed(); + Linear_System::insert(c); + } + else { + // Here `*this' is NNC and `c' is necessarily closed. + // Copying the constraint adding the epsilon coefficient + // and the missing space dimensions, if any. + // FIXME: provide a resizing copy-constructor taking + // topology and the space dimension. + const dimension_type new_size = 2 + std::max(c.space_dimension(), + space_dimension()); + Constraint tmp_c(c, new_size); + tmp_c.set_not_necessarily_closed(); + Linear_System::insert(tmp_c); + } + assert(OK()); +} + +void +PPL::Constraint_System::insert_pending(const Constraint& c) { + if (topology() == c.topology()) + Linear_System::insert_pending(c); + else + // `*this' and `c' have different topologies. + if (is_necessarily_closed()) { + // Padding the matrix with a columns of zeroes + // corresponding to the epsilon coefficients. + add_zero_columns(1); + set_not_necessarily_closed(); + Linear_System::insert_pending(c); + } + else { + // Here `*this' is NNC and `c' is necessarily closed. + // Copying the constraint adding the epsilon coefficient + // and the missing space dimensions, if any. + const dimension_type new_size = 2 + std::max(c.space_dimension(), + space_dimension()); + Constraint tmp_c(c, new_size); + tmp_c.set_not_necessarily_closed(); + Linear_System::insert_pending(tmp_c); + } + assert(OK()); +} + +PPL::dimension_type +PPL::Constraint_System::num_inequalities() const { + // We are sure that we call this method only when + // the matrix has no pending rows. + assert(num_pending_rows() == 0); + const Constraint_System& cs = *this; + dimension_type n = 0; + // If the Linear_System happens to be sorted, take advantage of the fact + // that inequalities are at the bottom of the system. + if (is_sorted()) + for (dimension_type i = num_rows(); i > 0 && cs[--i].is_inequality(); ) + ++n; + else + for (dimension_type i = num_rows(); i-- > 0 ; ) + if (cs[i].is_inequality()) + ++n; + return n; +} + +PPL::dimension_type +PPL::Constraint_System::num_equalities() const { + // We are sure that we call this method only when + // the matrix has no pending rows. + assert(num_pending_rows() == 0); + return num_rows() - num_inequalities(); +} + +void +PPL::Constraint_System::const_iterator::skip_forward() { + const Linear_System::const_iterator csp_end = csp->end(); + while (i != csp_end && (*this)->is_tautological()) + ++i; +} + +bool +PPL::Constraint_System::satisfies_all_constraints(const Generator& g) const { + assert(g.space_dimension() <= space_dimension()); + + // Setting `sps' to the appropriate scalar product sign operator. + // This also avoids problems when having _legal_ topology mismatches + // (which could also cause a mismatch in the number of columns). + Topology_Adjusted_Scalar_Product_Sign sps(g); + + const Constraint_System& cs = *this; + if (cs.is_necessarily_closed()) { + if (g.is_line()) { + // Lines must saturate all constraints. + for (dimension_type i = cs.num_rows(); i-- > 0; ) + if (sps(g, cs[i]) != 0) + return false; + } + else + // `g' is either a ray, a point or a closure point. + for (dimension_type i = cs.num_rows(); i-- > 0; ) { + const Constraint& c = cs[i]; + const int sp_sign = sps(g, c); + if (c.is_inequality()) { + // As `cs' is necessarily closed, + // `c' is a non-strict inequality. + if (sp_sign < 0) + return false; + } + else + // `c' is an equality. + if (sp_sign != 0) + return false; + } + } + else + // `cs' is not necessarily closed. + switch (g.type()) { + + case Generator::LINE: + // Lines must saturate all constraints. + for (dimension_type i = cs.num_rows(); i-- > 0; ) + if (sps(g, cs[i]) != 0) + return false; + break; + + case Generator::POINT: + // Have to perform the special test + // when dealing with a strict inequality. + for (dimension_type i = cs.num_rows(); i-- > 0; ) { + const Constraint& c = cs[i]; + const int sp_sign = sps(g, c); + switch (c.type()) { + case Constraint::EQUALITY: + if (sp_sign != 0) + return false; + break; + case Constraint::NONSTRICT_INEQUALITY: + if (sp_sign < 0) + return false; + break; + case Constraint::STRICT_INEQUALITY: + if (sp_sign <= 0) + return false; + break; + } + } + break; + + case Generator::RAY: + // Intentionally fall through. + case Generator::CLOSURE_POINT: + for (dimension_type i = cs.num_rows(); i-- > 0; ) { + const Constraint& c = cs[i]; + const int sp_sign = sps(g, c); + if (c.is_inequality()) { + // Constraint `c' is either a strict or a non-strict inequality. + if (sp_sign < 0) + return false; + } + else + // Constraint `c' is an equality. + if (sp_sign != 0) + return false; + } + break; + } + + // If we reach this point, `g' satisfies all constraints. + return true; +} + + +void +PPL::Constraint_System +::affine_preimage(const dimension_type v, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator) { + Constraint_System& x = *this; + // `v' is the index of a column corresponding to + // a "user" variable (i.e., it cannot be the inhomogeneous term, + // nor the epsilon dimension of NNC polyhedra). + assert(v > 0 && v <= x.space_dimension()); + assert(expr.space_dimension() <= x.space_dimension()); + assert(denominator > 0); + + const dimension_type n_columns = x.num_columns(); + const dimension_type n_rows = x.num_rows(); + const dimension_type expr_size = expr.size(); + const bool not_invertible = (v >= expr_size || expr[v] == 0); + + if (denominator != 1) + for (dimension_type i = n_rows; i-- > 0; ) { + Constraint& row = x[i]; + Coefficient& row_v = row[v]; + if (row_v != 0) { + for (dimension_type j = n_columns; j-- > 0; ) + if (j != v) { + Coefficient& row_j = row[j]; + row_j *= denominator; + if (j < expr_size) + add_mul_assign(row_j, row_v, expr[j]); + } + if (not_invertible) + row_v = 0; + else + row_v *= expr[v]; + } + } + else + // Here `denominator' == 1: optimized computation + // only considering columns having indexes < expr_size. + for (dimension_type i = n_rows; i-- > 0; ) { + Constraint& row = x[i]; + Coefficient& row_v = row[v]; + if (row_v != 0) { + for (dimension_type j = expr_size; j-- > 0; ) + if (j != v) + add_mul_assign(row[j], row_v, expr[j]); + if (not_invertible) + row_v = 0; + else + row_v *= expr[v]; + } + } + // Strong normalization also resets the sortedness flag. + x.strong_normalize(); +} + +void +PPL::Constraint_System::ascii_dump(std::ostream& s) const { + const Constraint_System& x = *this; + const dimension_type x_num_rows = x.num_rows(); + const dimension_type x_num_columns = x.num_columns(); + s << "topology " << (is_necessarily_closed() + ? "NECESSARILY_CLOSED" + : "NOT_NECESSARILY_CLOSED") + << "\n" + << x_num_rows << " x " << x_num_columns << ' ' + << (x.is_sorted() ? "(sorted)" : "(not_sorted)") + << "\n" + << "index_first_pending " << x.first_pending_row() + << "\n"; + for (dimension_type i = 0; i < x_num_rows; ++i) { + const Constraint& c = x[i]; + for (dimension_type j = 0; j < x_num_columns; ++j) + s << c[j] << ' '; + switch (c.type()) { + case Constraint::EQUALITY: + s << "="; + break; + case Constraint::NONSTRICT_INEQUALITY: + s << ">="; + break; + case Constraint::STRICT_INEQUALITY: + s << ">"; + break; + } + s << "\n"; + } +} + +PPL_OUTPUT_DEFINITIONS(Constraint_System) + +bool +PPL::Constraint_System::ascii_load(std::istream& s) { + std::string str; + if (!(s >> str) || str != "topology") + return false; + if (!(s >> str)) + return false; + if (str == "NECESSARILY_CLOSED") + set_necessarily_closed(); + else { + if (str != "NOT_NECESSARILY_CLOSED") + return false; + set_not_necessarily_closed(); + } + + dimension_type nrows; + dimension_type ncols; + if (!(s >> nrows)) + return false; + if (!(s >> str) || str != "x") + return false; + if (!(s >> ncols)) + return false; + resize_no_copy(nrows, ncols); + + if (!(s >> str) || (str != "(sorted)" && str != "(not_sorted)")) + return false; + set_sorted(str == "(sorted)"); + dimension_type index; + if (!(s >> str) || str != "index_first_pending") + return false; + if (!(s >> index)) + return false; + set_index_first_pending_row(index); + + Constraint_System& x = *this; + for (dimension_type i = 0; i < x.num_rows(); ++i) { + for (dimension_type j = 0; j < x.num_columns(); ++j) + if (!(s >> x[i][j])) + return false; + + if (!(s >> str)) + return false; + if (str == "=") + x[i].set_is_equality(); + else if (str == ">=" || str == ">") + x[i].set_is_inequality(); + else + return false; + + // Checking for equality of actual and declared types. + switch (x[i].type()) { + case Constraint::EQUALITY: + if (str == "=") + continue; + break; + case Constraint::NONSTRICT_INEQUALITY: + if (str == ">=") + continue; + break; + case Constraint::STRICT_INEQUALITY: + if (str == ">") + continue; + break; + } + // Reaching this point means that the input was illegal. + return false; + } + // Check invariants. + assert(OK()); + return true; +} + +const PPL::Constraint_System* PPL::Constraint_System::zero_dim_empty_p = 0; + +void +PPL::Constraint_System::initialize() { + assert(zero_dim_empty_p == 0); + zero_dim_empty_p + = new Constraint_System(Constraint::zero_dim_false()); +} + +void +PPL::Constraint_System::finalize() { + assert(zero_dim_empty_p != 0); + delete zero_dim_empty_p; + zero_dim_empty_p = 0; +} + +bool +PPL::Constraint_System::OK() const { + // A Constraint_System must be a valid Linear_System; do not check for + // strong normalization, since this will be done when + // checking each individual constraint. + if (!Linear_System::OK(false)) + return false; + + // Checking each constraint in the system. + const Constraint_System& x = *this; + for (dimension_type i = num_rows(); i-- > 0; ) + if (!x[i].OK()) + return false; + + // All checks passed. + return true; +} + +/*! \relates Parma_Polyhedra_Library::Constraint_System */ +std::ostream& +PPL::IO_Operators::operator<<(std::ostream& s, const Constraint_System& cs) { + Constraint_System::const_iterator i = cs.begin(); + const Constraint_System::const_iterator cs_end = cs.end(); + if (i == cs_end) + s << "true"; + else { + while (i != cs_end) { + s << *i++; + if (i != cs_end) + s << ", "; + } + } + return s; +} diff --git a/src/Constraint_System.defs.hh b/src/Constraint_System.defs.hh new file mode 100644 index 0000000..c35c5e1 --- /dev/null +++ b/src/Constraint_System.defs.hh @@ -0,0 +1,406 @@ +/* Constraint_System class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Constraint_System_defs_hh +#define PPL_Constraint_System_defs_hh 1 + +#include "Constraint_System.types.hh" +#include "Linear_Expression.types.hh" +#include "Linear_System.defs.hh" +#include "Generator.types.hh" +#include "Polyhedron.types.hh" +#include "Constraint.types.hh" +#include "Congruence_System.types.hh" +#include +#include + +namespace Parma_Polyhedra_Library { + +namespace IO_Operators { + +//! Output operator. +/*! + \relates Parma_Polyhedra_Library::Constraint_System + Writes true if \p cs is empty. Otherwise, writes on + \p s the constraints of \p cs, all in one row and separated by ", ". +*/ +std::ostream& operator<<(std::ostream& s, const Constraint_System& cs); + +} // namespace IO_Operators + +// Put it in the namespace here to declare it friend later. +/*! \relates Polyhedron */ +bool operator==(const Polyhedron& x, const Polyhedron& y); + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Constraint_System */ +void swap(Parma_Polyhedra_Library::Constraint_System& x, + Parma_Polyhedra_Library::Constraint_System& y); + +} // namespace std + +//! A system of constraints. +/*! \ingroup PPL_CXX_interface + An object of the class Constraint_System is a system of constraints, + i.e., a multiset of objects of the class Constraint. + When inserting constraints in a system, space dimensions are + automatically adjusted so that all the constraints in the system + are defined on the same vector space. + + \par + In all the examples it is assumed that variables + x and y 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 exact copy of them + can be retrieved: + in general, only an equivalent constraint system + will be available, where original constraints may have been + reordered, removed (if they are trivial, duplicate or + implied by other constraints), linearly combined, etc. +*/ +class Parma_Polyhedra_Library::Constraint_System : private Linear_System { +public: + //! Default constructor: builds an empty system of constraints. + Constraint_System(); + + //! Builds the singleton system containing only constraint \p c. + explicit Constraint_System(const Constraint& c); + + //! Builds a system containing copies of any equalities in \p cgs. + explicit Constraint_System(const Congruence_System& cgs); + + //! Ordinary copy-constructor. + Constraint_System(const Constraint_System& cs); + + //! Destructor. + ~Constraint_System(); + + //! Assignment operator. + Constraint_System& operator=(const Constraint_System& y); + + //! Returns the maximum space dimension a Constraint_System can handle. + static dimension_type max_space_dimension(); + + //! Returns the dimension of the vector space enclosing \p *this. + dimension_type space_dimension() const; + + /*! \brief + Returns true if and only if \p *this + contains one or more strict inequality constraints. + */ + bool has_strict_inequalities() const; + + /*! \brief + Removes all the constraints from the constraint system + and sets its space dimension to 0. + */ + void clear(); + + /*! \brief + Inserts in \p *this a copy of the constraint \p c, + increasing the number of space dimensions if needed. + */ + void insert(const Constraint& c); + + //! 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(); + + //! 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 ph: + \code + const Constraint_System& cs = ph.constraints(); + for (Constraint_System::const_iterator i = cs.begin(), + cs_end = cs.end(); i != cs_end; ++i) + cout << *i << endl; + \endcode + */ + class const_iterator + : public std::iterator { + public: + //! Default constructor. + const_iterator(); + + //! Ordinary copy-constructor. + const_iterator(const const_iterator& y); + + //! Destructor. + ~const_iterator(); + + //! Assignment operator. + const_iterator& operator=(const const_iterator& y); + + //! Dereference operator. + const Constraint& operator*() const; + + //! Indirect member selector. + const Constraint* operator->() const; + + //! Prefix increment operator. + const_iterator& operator++(); + + //! Postfix increment operator. + const_iterator operator++(int); + + /*! \brief + Returns true if and only if + \p *this and \p y are identical. + */ + bool operator==(const const_iterator& y) const; + + /*! \brief + Returns true if and only if + \p *this and \p y are different. + */ + bool operator!=(const const_iterator& y) const; + + private: + friend class Constraint_System; + + //! The const iterator over the matrix of constraints. + Linear_System::const_iterator i; + + //! A const pointer to the matrix of constraints. + const Linear_System* csp; + + //! Constructor. + const_iterator(const Linear_System::const_iterator& iter, + const Constraint_System& csys); + + //! \p *this skips to the next non-trivial constraint. + void skip_forward(); + }; + + //! Returns true if and only if \p *this has no constraints. + bool empty() const; + + /*! \brief + Returns the const_iterator pointing to the first constraint, + if \p *this is not empty; + otherwise, returns the past-the-end const_iterator. + */ + const_iterator begin() const; + + //! Returns the past-the-end const_iterator. + const_iterator end() const; + + //! Checks if all the invariants are satisfied. +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS + /*! + Returns true if and only if \p *this is a valid + Linear_System and each row in the system is a valid Constraint. + */ +#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 true if successful, false 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 swap(Constraint_System& y); + +private: + /*! \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 const_iterator; + friend class Parma_Polyhedra_Library::Polyhedron; + + friend bool operator==(const Polyhedron& x, const Polyhedron& y); + + //! Builds an empty system of constraints having the specified topology. + explicit Constraint_System(Topology topol); + + /*! \brief + Builds a system of \p n_rows constraints on a \p n_columns - 1 + dimensional space (including the \f$\epsilon\f$ dimension, if + \p topol is NOT_NECESSARILY_CLOSED). + */ + Constraint_System(Topology topol, + dimension_type n_rows, dimension_type n_columns); + + /*! \brief + Adjusts \p *this so that it matches the topology and + the number of space dimensions given as parameters + (adding or removing columns if needed). + Returns false if and only if \p topol is + equal to NECESSARILY_CLOSED and \p *this + contains strict inequalities. + */ + bool adjust_topology_and_space_dimension(Topology topol, + dimension_type num_dimensions); + + //! Returns the \p k- th constraint of the system. + Constraint& operator[](dimension_type k); + + //! Returns a constant reference to the \p k- th constraint of the system. + const Constraint& operator[](dimension_type k) const; + + //! Returns true if \p g satisfies all the constraints. + bool satisfies_all_constraints(const Generator& g) const; + + //! Substitutes a given column of coefficients by a given affine expression. + /*! + \param v + Index of the column to which the affine transformation is substituted. + + \param expr + The numerator of the affine transformation: + \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$; + + \param denominator + The denominator of the affine transformation. + + We want to allow affine transformations + (see Section \ref Images_and_Preimages_of_Affine_Transfer_Relations) + having any rational coefficients. Since the coefficients of the + constraints are integers we must also provide an integer \p + denominator that will be used as denominator of the affine + transformation. + The denominator is required to be a positive integer. + + The affine transformation substitutes the matrix of constraints + by a new matrix whose elements \f${a'}_{ij}\f$ are built from + the old one \f$a_{ij}\f$ as follows: + \f[ + {a'}_{ij} = + \begin{cases} + a_{ij} * \mathrm{denominator} + a_{iv} * \mathrm{expr}[j] + \quad \text{for } j \neq v; \\ + \mathrm{expr}[v] * a_{iv} + \quad \text{for } j = v. + \end{cases} + \f] + + \p expr is a constant parameter and unaltered by this computation. + */ + void affine_preimage(dimension_type v, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator); + + //! Returns the number of equality constraints. + dimension_type num_equalities() const; + + //! Returns the number of inequality constraints. + dimension_type num_inequalities() const; + + /*! \brief + Applies Gaussian elimination and back-substitution so as + to provide a partial simplification of the system of constraints. + + It is assumed that the system has no pending constraints. + */ + void simplify(); + + /*! \brief + Inserts in \p *this a copy of the constraint \p c, + increasing the number of space dimensions if needed. + It is a pending constraint. + */ + void insert_pending(const Constraint& c); + + //! Adds low-level constraints to the constraint system. + void add_low_level_constraints(); +}; + +// Constraint_System.inlines.hh is not included here on purpose. + +#endif // !defined(PPL_Constraint_System_defs_hh) diff --git a/src/Constraint_System.inlines.hh b/src/Constraint_System.inlines.hh new file mode 100644 index 0000000..ffbc9c6 --- /dev/null +++ b/src/Constraint_System.inlines.hh @@ -0,0 +1,225 @@ +/* Constraint_System class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Constraint_System_inlines_hh +#define PPL_Constraint_System_inlines_hh 1 + +#include "Constraint.defs.hh" + +namespace Parma_Polyhedra_Library { + +inline +Constraint_System::Constraint_System() + : Linear_System(NECESSARILY_CLOSED) { +} + +inline +Constraint_System::Constraint_System(const Constraint& c) + : Linear_System(c.topology()) { + Linear_System::insert(c); +} + +inline +Constraint_System::Constraint_System(const Constraint_System& cs) + : Linear_System(cs) { +} + +inline +Constraint_System::Constraint_System(const Topology topol) + : Linear_System(topol) { +} + +inline +Constraint_System::Constraint_System(const Topology topol, + const dimension_type n_rows, + const dimension_type n_columns) + : Linear_System(topol, n_rows, n_columns) { +} + +inline +Constraint_System::~Constraint_System() { +} + +inline Constraint_System& +Constraint_System::operator=(const Constraint_System& y) { + Linear_System::operator=(y); + return *this; +} + +inline Constraint& +Constraint_System::operator[](const dimension_type k) { + return static_cast(Linear_System::operator[](k)); +} + +inline const Constraint& +Constraint_System::operator[](const dimension_type k) const { + return static_cast(Linear_System::operator[](k)); +} + +inline dimension_type +Constraint_System::max_space_dimension() { + return Linear_System::max_space_dimension(); +} + +inline dimension_type +Constraint_System::space_dimension() const { + return Linear_System::space_dimension(); +} + +inline void +Constraint_System::clear() { + Linear_System::clear(); +} + +inline const Constraint_System& +Constraint_System::zero_dim_empty() { + assert(zero_dim_empty_p != 0); + return *zero_dim_empty_p; +} + +inline +Constraint_System::const_iterator::const_iterator() + : i(), csp(0) { +} + +inline +Constraint_System::const_iterator::const_iterator(const const_iterator& y) + : i(y.i), csp(y.csp) { +} + +inline +Constraint_System::const_iterator::~const_iterator() { +} + +inline Constraint_System::const_iterator& +Constraint_System::const_iterator::operator=(const const_iterator& y) { + i = y.i; + csp = y.csp; + return *this; +} + +inline const Constraint& +Constraint_System::const_iterator::operator*() const { + return static_cast(*i); +} + +inline const Constraint* +Constraint_System::const_iterator::operator->() const { + return static_cast(i.operator->()); +} + +inline Constraint_System::const_iterator& +Constraint_System::const_iterator::operator++() { + ++i; + skip_forward(); + return *this; +} + +inline Constraint_System::const_iterator +Constraint_System::const_iterator::operator++(int) { + const const_iterator tmp = *this; + operator++(); + return tmp; +} + +inline bool +Constraint_System::const_iterator::operator==(const const_iterator& y) const { + return i == y.i; +} + +inline bool +Constraint_System::const_iterator::operator!=(const const_iterator& y) const { + return i != y.i; +} + +inline +Constraint_System::const_iterator:: +const_iterator(const Linear_System::const_iterator& iter, + const Constraint_System& csys) + : i(iter), csp(&csys) { +} + +inline Constraint_System::const_iterator +Constraint_System::begin() const { + const_iterator i(Linear_System::begin(), *this); + i.skip_forward(); + return i; +} + +inline Constraint_System::const_iterator +Constraint_System::end() const { + const const_iterator i(Linear_System::end(), *this); + return i; +} + +inline bool +Constraint_System::empty() const { + return begin() == end(); +} + +inline void +Constraint_System::add_low_level_constraints() { + if (is_necessarily_closed()) + // The positivity constraint. + insert(Constraint::zero_dim_positivity()); + else { + // Add the epsilon constraints. + insert(Constraint::epsilon_leq_one()); + insert(Constraint::epsilon_geq_zero()); + } +} + +inline void +Constraint_System::swap(Constraint_System& y) { + Linear_System::swap(y); +} + +inline memory_size_type +Constraint_System::external_memory_in_bytes() const { + return Linear_System::external_memory_in_bytes(); +} + +inline memory_size_type +Constraint_System::total_memory_in_bytes() const { + return Linear_System::total_memory_in_bytes(); +} + +inline void +Constraint_System::simplify() { + Linear_System::simplify(); +} + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Constraint_System */ +inline void +swap(Parma_Polyhedra_Library::Constraint_System& x, + Parma_Polyhedra_Library::Constraint_System& y) { + x.swap(y); +} + +} // namespace std + +#endif // !defined(PPL_Constraint_System_inlines_hh) diff --git a/src/Constraint_System.types.hh b/src/Constraint_System.types.hh new file mode 100644 index 0000000..e68a803 --- /dev/null +++ b/src/Constraint_System.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PPL_Constraint_System_types_hh +#define PPL_Constraint_System_types_hh 1 + +namespace Parma_Polyhedra_Library { + +class Constraint_System; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Constraint_System_types_hh) diff --git a/src/DB_Matrix.defs.hh b/src/DB_Matrix.defs.hh new file mode 100644 index 0000000..22c897e --- /dev/null +++ b/src/DB_Matrix.defs.hh @@ -0,0 +1,331 @@ +/* DB_Matrix class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_DB_Matrix_defs_hh +#define PPL_DB_Matrix_defs_hh 1 + +#include "DB_Matrix.types.hh" +#include "globals.defs.hh" +#include "DB_Row.defs.hh" +#include "Checked_Number.types.hh" +#include "Rounding_Dir.defs.hh" +#include +#include +#include + +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 +std::ostream& +operator<<(std::ostream& s, const DB_Matrix& 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 allows for the representation of + a square matrix of T objects. + Each DB_Matrix object can be viewed as a multiset of DB_Row. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +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 + explicit DB_Matrix(const DB_Matrix& 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 >::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::value_type value_type; + typedef typename std::iterator_traits::difference_type + difference_type; + typedef typename std::iterator_traits::pointer pointer; + typedef typename std::iterator_traits::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 true if and only if + \p *this and \p y are identical. + */ + bool operator==(const const_iterator& y) const; + + /*! \brief + Returns true 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 friend class DB_Matrix; + + //! The rows of the matrix. + std::vector > rows; + + //! Size of the initialized part of each row. + dimension_type row_size; + + /*! \brief + Capacity allocated for each row, i.e., number of + long objects that each row can contain. + */ + dimension_type row_capacity; + +public: + //! Swaps \p *this with \p y. + void swap(DB_Matrix& y); + + + //! Makes the matrix grow by adding more rows and more columns. + /*! + \param new_n_rows + The number of rows and columns of the resized matrix. + + A new matrix, with the specified dimension, is created. + The contents of the old matrix are copied in the upper, left-hand + corner of the new matrix, which is then assigned to \p *this. + */ + void grow(dimension_type new_n_rows); + + //! Resizes the matrix without worrying about the old contents. + /*! + \param new_n_rows + The number of rows and columns of the resized matrix. + + A new matrix, with the specified dimension, is created without copying + the content of the old matrix and assigned to \p *this. + */ + void resize_no_copy(dimension_type new_n_rows); + + //! Returns the number of rows in the matrix. + dimension_type num_rows() const; + + //! \name Subscript operators. + //@{ + //! Returns a reference to the \p k-th row of the matrix. + DB_Row& operator[](dimension_type k); + + //! Returns a constant reference to the \p k-th row of the matrix. + const DB_Row& 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 true if successful, false 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 std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::DB_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +void swap(Parma_Polyhedra_Library::DB_Matrix& x, + Parma_Polyhedra_Library::DB_Matrix& y); + +} // namespace std + + +namespace Parma_Polyhedra_Library { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns true if and only if \p x and \p y are identical. +/*! \relates DB_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +bool operator==(const DB_Matrix& x, const DB_Matrix& y); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns true if and only if \p x and \p y are different. +/*! \relates DB_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +bool operator!=(const DB_Matrix& x, const DB_Matrix& 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 true; returns false 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 +bool rectilinear_distance_assign(Checked_Number& r, + const DB_Matrix& x, + const DB_Matrix& 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 true; returns false 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 +bool euclidean_distance_assign(Checked_Number& r, + const DB_Matrix& x, + const DB_Matrix& 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 true; returns false 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 +bool l_infinity_distance_assign(Checked_Number& r, + const DB_Matrix& x, + const DB_Matrix& 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..8c0d9d8 --- /dev/null +++ b/src/DB_Matrix.inlines.hh @@ -0,0 +1,333 @@ +/* DB_Matrix class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_DB_Matrix_inlines_hh +#define PPL_DB_Matrix_inlines_hh 1 + +#include "globals.defs.hh" +#include "Checked_Number.defs.hh" +#include "distances.defs.hh" +#include +#include + +namespace Parma_Polyhedra_Library { + +template +inline void +DB_Matrix::swap(DB_Matrix& y) { + std::swap(rows, y.rows); + std::swap(row_size, y.row_size); + std::swap(row_capacity, y.row_capacity); +} + +template +inline dimension_type +DB_Matrix::max_num_rows() { + return std::vector >().max_size(); +} + +template +inline dimension_type +DB_Matrix::max_num_columns() { + return DB_Row::max_size(); +} + +template +inline memory_size_type +DB_Matrix::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +template +inline +DB_Matrix::const_iterator::const_iterator() + : i(Iter()) { +} + +template +inline +DB_Matrix::const_iterator::const_iterator(const Iter& b) + : i(b) { +} + +template +inline +DB_Matrix::const_iterator::const_iterator(const const_iterator& y) + : i(y.i) { +} + +template +inline typename DB_Matrix::const_iterator& +DB_Matrix::const_iterator::operator=(const const_iterator& y) { + i = y.i; + return *this; +} + +template +inline typename DB_Matrix::const_iterator::reference +DB_Matrix::const_iterator::operator*() const { + return *i; +} + +template +inline typename DB_Matrix::const_iterator::pointer +DB_Matrix::const_iterator::operator->() const { + return &*i; +} + +template +inline typename DB_Matrix::const_iterator& +DB_Matrix::const_iterator::operator++() { + ++i; + return *this; +} + +template +inline typename DB_Matrix::const_iterator +DB_Matrix::const_iterator::operator++(int) { + return const_iterator(i++); +} + +template +inline bool +DB_Matrix::const_iterator::operator==(const const_iterator& y) const { + return i == y.i; +} + +template +inline bool +DB_Matrix::const_iterator::operator!=(const const_iterator& y) const { + return !operator==(y); +} + +template +inline typename DB_Matrix::const_iterator +DB_Matrix::begin() const { + return const_iterator(rows.begin()); +} + +template +inline typename DB_Matrix::const_iterator +DB_Matrix::end() const { + return const_iterator(rows.end()); +} + +template +inline +DB_Matrix::DB_Matrix() + : rows(), + row_size(0), + row_capacity(0) { +} + +template +inline +DB_Matrix::~DB_Matrix() { +} + +template +inline DB_Row& +DB_Matrix::operator[](const dimension_type k) { + assert(k < rows.size()); + return rows[k]; +} + +template +inline const DB_Row& +DB_Matrix::operator[](const dimension_type k) const { + assert(k < rows.size()); + return rows[k]; +} + +template +inline dimension_type +DB_Matrix::num_rows() const { + return rows.size(); +} + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates DB_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +inline bool +operator!=(const DB_Matrix& x, const DB_Matrix& y) { + return !(x == y); +} + +template +inline +DB_Matrix::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 +inline DB_Matrix& +DB_Matrix::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 +inline bool +l_m_distance_assign(Checked_Number& r, + const DB_Matrix& x, + const DB_Matrix& 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& x_i = x[i]; + const DB_Row& 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); + 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 +inline bool +rectilinear_distance_assign(Checked_Number& r, + const DB_Matrix& x, + const DB_Matrix& y, + const Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2) { + return + l_m_distance_assign >(r, x, y, + dir, + tmp0, + tmp1, + tmp2); +} + + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates DB_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +inline bool +euclidean_distance_assign(Checked_Number& r, + const DB_Matrix& x, + const DB_Matrix& y, + const Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2) { + return + l_m_distance_assign >(r, x, y, + dir, + tmp0, + tmp1, + tmp2); +} + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates DB_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +inline bool +l_infinity_distance_assign(Checked_Number& r, + const DB_Matrix& x, + const DB_Matrix& y, + const Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2) { + return + l_m_distance_assign >(r, x, y, + dir, + tmp0, + tmp1, + tmp2); +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates Parma_Polyhedra_Library::DB_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +inline void +swap(Parma_Polyhedra_Library::DB_Matrix& x, + Parma_Polyhedra_Library::DB_Matrix& y) { + x.swap(y); +} + +} // namespace std + +#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..ba98212 --- /dev/null +++ b/src/DB_Matrix.templates.hh @@ -0,0 +1,316 @@ +/* DB_Matrix class implementation: non-inline template functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_DB_Matrix_templates_hh +#define PPL_DB_Matrix_templates_hh 1 + +namespace Parma_Polyhedra_Library { + +template +DB_Matrix::DB_Matrix(const dimension_type n_rows) + : rows(n_rows), + row_size(n_rows), + row_capacity(compute_capacity(n_rows, max_num_columns())) { + // Construct in direct order: will destroy in reverse order. + for (dimension_type i = 0; i < n_rows; ++i) + rows[i].construct(n_rows, row_capacity); + assert(OK()); +} + +template +template +DB_Matrix::DB_Matrix(const DB_Matrix& y) + : rows(y.rows.size()), + row_size(y.row_size), + row_capacity(compute_capacity(y.row_size, max_num_columns())) { + // Construct in direct order: will destroy in reverse order. + for (dimension_type i = 0, n_rows = rows.size(); i < n_rows; ++i) + rows[i].construct_upward_approximation(y[i], row_capacity); + assert(OK()); +} + +template +void +DB_Matrix::grow(const dimension_type new_n_rows) { + const dimension_type old_n_rows = rows.size(); + assert(new_n_rows >= old_n_rows); + + if (new_n_rows > old_n_rows) { + if (new_n_rows <= row_capacity) { + // We can recycle the old rows. + if (rows.capacity() < new_n_rows) { + // Reallocation will take place. + std::vector > new_rows; + new_rows.reserve(compute_capacity(new_n_rows, max_num_rows())); + new_rows.insert(new_rows.end(), new_n_rows, DB_Row()); + // Construct the new rows. + dimension_type i = new_n_rows; + while (i-- > old_n_rows) + new_rows[i].construct(new_n_rows, row_capacity); + // Steal the old rows. + ++i; + while (i-- > 0) + new_rows[i].swap(rows[i]); + // Put the new vector into place. + std::swap(rows, new_rows); + } + else { + // Reallocation will NOT take place. + rows.insert(rows.end(), new_n_rows - old_n_rows, DB_Row()); + 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()); + // 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 new_row(rows[i], + new_matrix.row_size, + new_matrix.row_capacity); + std::swap(new_matrix.rows[i], new_row); + } + // Put the new vector into place. + swap(new_matrix); + return; + } + } + // Here we have the right number of rows. + if (new_n_rows > row_size) { + // We need more columns. + if (new_n_rows <= row_capacity) + // But we have enough capacity: we resize existing rows. + for (dimension_type i = old_n_rows; i-- > 0; ) + rows[i].expand_within_capacity(new_n_rows); + else { + // Capacity exhausted: we must reallocate the rows and + // make sure all the rows have the same capacity. + const dimension_type new_row_capacity + = compute_capacity(new_n_rows, max_num_columns()); + for (dimension_type i = old_n_rows; i-- > 0; ) { + // FIXME: copying may be unnecessarily costly. + DB_Row new_row(rows[i], new_n_rows, new_row_capacity); + std::swap(rows[i], new_row); + } + row_capacity = new_row_capacity; + } + // Rows have grown or shrunk. + row_size = new_n_rows; + } +} + +template +void +DB_Matrix::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 > new_rows; + new_rows.reserve(compute_capacity(new_n_rows, max_num_rows())); + new_rows.insert(new_rows.end(), new_n_rows, DB_Row()); + // Construct the new rows (be careful: each new row must have + // the same capacity as each one of the old rows). + dimension_type i = new_n_rows; + while (i-- > old_n_rows) + new_rows[i].construct(new_n_rows, row_capacity); + // Steal the old rows. + ++i; + while (i-- > 0) + new_rows[i].swap(rows[i]); + // Put the new vector into place. + std::swap(rows, new_rows); + } + else { + // Reallocation (of vector `rows') will NOT take place. + rows.insert(rows.end(), new_n_rows - old_n_rows, DB_Row()); + // Be careful: each new row must have + // the same capacity as each one of the old rows. + for (dimension_type i = new_n_rows; i-- > old_n_rows; ) + rows[i].construct(new_n_rows, row_capacity); + } + } + else { + // We cannot even recycle the old rows: allocate a new matrix and swap. + DB_Matrix new_matrix(new_n_rows); + swap(new_matrix); + return; + } + } + else if (new_n_rows < old_n_rows) { + // Drop some rows. + rows.erase(rows.begin() + new_n_rows, rows.end()); + // Shrink the existing rows. + for (dimension_type i = new_n_rows; i-- > 0; ) + rows[i].shrink(new_n_rows); + old_n_rows = new_n_rows; + } + // Here we have the right number of rows. + if (new_n_rows > row_size) { + // We need more columns. + if (new_n_rows <= row_capacity) + // But we have enough capacity: we resize existing rows. + for (dimension_type i = old_n_rows; i-- > 0; ) + rows[i].expand_within_capacity(new_n_rows); + else { + // Capacity exhausted: we must reallocate the rows and + // make sure all the rows have the same capacity. + const dimension_type new_row_capacity + = compute_capacity(new_n_rows, max_num_columns()); + for (dimension_type i = old_n_rows; i-- > 0; ) { + DB_Row new_row(new_n_rows, new_row_capacity); + std::swap(rows[i], new_row); + } + row_capacity = new_row_capacity; + } + } + // DB_Rows have grown or shrunk. + row_size = new_n_rows; +} + +template +void +DB_Matrix::ascii_dump(std::ostream& s) const { + const DB_Matrix& 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) + +template +bool +DB_Matrix::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 (r != V_EQ || is_minus_infinity(x[i][j])) + return false; + } + + // Check invariants. + assert(OK()); + return true; +} + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates DB_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +bool +operator==(const DB_Matrix& x, const DB_Matrix& 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 +memory_size_type +DB_Matrix::external_memory_in_bytes() const { + memory_size_type n = rows.capacity() * sizeof(DB_Row); + for (dimension_type i = num_rows(); i-- > 0; ) + n += rows[i].external_memory_in_bytes(row_capacity); + return n; +} + +template +bool +DB_Matrix::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 +std::ostream& +IO_Operators::operator<<(std::ostream& s, const DB_Matrix& 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..11f1420 --- /dev/null +++ b/src/DB_Matrix.types.hh @@ -0,0 +1,22 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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 +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..df17430 --- /dev/null +++ b/src/DB_Row.defs.hh @@ -0,0 +1,474 @@ +/* DB_Row class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ .*/ + +#ifndef PPL_DB_Row_defs_hh +#define PPL_DB_Row_defs_hh 1 + +#include "DB_Row.types.hh" +#include "globals.types.hh" +#include "Ptr_Iterator.defs.hh" +#include +#include + +#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 true, 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 +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 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 nan, + not a number, 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 T().OK() gives true + (see below). + \code + ~T() + \endcode + is the destructor. + \code + bool is_nan() const + \endcode + returns true if and only \p *this represents + the not a number value. + \code + bool OK() const + \endcode + returns true if and only if \p *this satisfies all + its invariants. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +class Parma_Polyhedra_Library::DB_Row : private DB_Row_Impl_Handler { +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 + void construct_upward_approximation(const DB_Row& y, + dimension_type capacity); + + //@} + + //! Tight constructor: resizing will require reallocation. + DB_Row(dimension_type sz); + + //! Sizing constructor with capacity. + DB_Row(dimension_type sz, dimension_type capacity); + + //! Ordinary copy constructor. + DB_Row(const DB_Row& y); + + //! Copy constructor with specified capacity. + /*! + It is assumed that \p capacity is greater than or equal to \p y size. + */ + DB_Row(const DB_Row& y, dimension_type capacity); + + //! Copy constructor with specified size and capacity. + /*! + It is assumed that \p sz is greater than or equal to the size of \p y + and, of course, that \p sz is less than or equal to \p capacity. + Any new position is initialized to \f$+\infty\f$. + */ + DB_Row(const DB_Row& y, dimension_type sz, dimension_type capacity); + + //! Destructor. + ~DB_Row(); + + //! Assignment operator. + DB_Row& operator=(const DB_Row& y); + + //! Swaps \p *this with \p y. + void swap(DB_Row& y); + + //! Assigns the implementation of \p y to \p *this. + void assign(DB_Row& y); + + /*! \brief + Allocates memory for a default constructed DB_Row object, + allowing for \p capacity coefficients at most. + + It is assumed that no allocation has been performed before + (otherwise, a memory leak will occur). + After execution, the size of the DB_Row object is zero. + */ + void allocate(dimension_type capacity); + + //! Expands the row to size \p new_size. + /*! + Adds new positions to the implementation of the row + obtaining a new row with size \p new_size. + It is assumed that \p new_size is between the current size + and capacity of the row. The new positions are initialized + to \f$+\infty\f$. + */ + void expand_within_capacity(dimension_type new_size); + + //! Shrinks the row by erasing elements at the end. + /*! + Destroys elements of the row implementation + from position \p new_size to the end. + It is assumed that \p new_size is not greater than the current size. + */ + void shrink(dimension_type new_size); + + //! Returns the size() of the largest possible DB_Row. + static dimension_type max_size(); + + //! Gives the number of coefficients currently in use. + dimension_type size() const; + + //! \name Subscript operators. + //@{ + //! Returns a reference to the element of the row indexed by \p k. + T& operator[](dimension_type k); + + //! Returns a constant reference to the element of the row indexed by \p k. + const T& operator[](dimension_type k) const; + //@} + + //! A (non const) random access iterator to access the row's elements. + typedef Implementation::Ptr_Iterator iterator; + + //! A const random access iterator to access the row's elements. + typedef Implementation::Ptr_Iterator 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 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 +//! \name Classical comparison operators. +//@{ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +/*! \relates DB_Row */ +template +bool operator==(const DB_Row& x, const DB_Row& y); + +/*! \relates DB_Row */ +template +bool operator!=(const DB_Row& x, const DB_Row& 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 +class Parma_Polyhedra_Library::DB_Row_Impl_Handler::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 shrink() 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 + 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; + + //! The number of coefficients in the row. + dimension_type size_; + + //! The vector of coefficients. + T vec_[ +#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + 1 +#endif + ]; + + //! Private and unimplemented: copy construction is not allowed. + Impl(const Impl& y); + + //! Private and unimplemented: assignment is not allowed. + Impl& operator=(const Impl&); + + //! Exception-safe copy construction mechanism. + void copy_construct(const Impl& y); +}; + +namespace std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::DB_Row */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +void swap(Parma_Polyhedra_Library::DB_Row& x, + Parma_Polyhedra_Library::DB_Row& y); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specializes std::iter_swap. +/*! \relates Parma_Polyhedra_Library::DB_Row */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +void iter_swap(typename std::vector > + ::iterator x, + typename std::vector > + ::iterator y); + +} // namespace std + +#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..d50d600 --- /dev/null +++ b/src/DB_Row.inlines.hh @@ -0,0 +1,437 @@ +/* DB_Row class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_DB_Row_inlines_hh +#define PPL_DB_Row_inlines_hh 1 + +#include "checked.defs.hh" +#include +#include +#include +#include +#include + +namespace Parma_Polyhedra_Library { + +template +inline void* +DB_Row_Impl_Handler::Impl::operator new(const size_t fixed_size, + const dimension_type capacity) { +#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + return ::operator new(fixed_size + capacity*sizeof(T)); +#else + assert(capacity >= 1); + return ::operator new(fixed_size + (capacity-1)*sizeof(T)); +#endif +} + +template +inline void +DB_Row_Impl_Handler::Impl::operator delete(void* p) { + ::operator delete(p); +} + +template +inline void +DB_Row_Impl_Handler::Impl::operator delete(void* p, dimension_type) { + ::operator delete(p); +} + +template +inline memory_size_type +DB_Row_Impl_Handler::Impl +::total_memory_in_bytes(dimension_type capacity) const { + return + sizeof(*this) + + capacity*sizeof(T) +#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + - 1*sizeof(T) +#endif + + external_memory_in_bytes(); +} + +template +inline memory_size_type +DB_Row_Impl_Handler::Impl::total_memory_in_bytes() const { + // In general, this is a lower bound, as the capacity of *this + // may be strictly greater than `size_' + return total_memory_in_bytes(size_); +} + +template +inline dimension_type +DB_Row_Impl_Handler::Impl::max_size() { + return std::numeric_limits::max() / sizeof(T); +} + +template +inline dimension_type +DB_Row_Impl_Handler::Impl::size() const { + return size_; +} + +template +inline void +DB_Row_Impl_Handler::Impl::set_size(const dimension_type new_sz) { + size_ = new_sz; +} + +template +inline void +DB_Row_Impl_Handler::Impl::bump_size() { + ++size_; +} + +template +inline +DB_Row_Impl_Handler::Impl::Impl() + : size_(0) { +} + +template +inline +DB_Row_Impl_Handler::Impl::~Impl() { + shrink(0); +} + +template +inline +DB_Row_Impl_Handler::DB_Row_Impl_Handler() + : impl(0) { +#if PPL_DB_ROW_EXTRA_DEBUG + capacity_ = 0; +#endif +} + +template +inline +DB_Row_Impl_Handler::~DB_Row_Impl_Handler() { + delete impl; +} + +template +inline T& +DB_Row_Impl_Handler::Impl::operator[](const dimension_type k) { + assert(k < size()); + return vec_[k]; +} + +template +inline const T& +DB_Row_Impl_Handler::Impl::operator[](const dimension_type k) const { + assert(k < size()); + return vec_[k]; +} + +template +inline dimension_type +DB_Row::max_size() { + return DB_Row_Impl_Handler::Impl::max_size(); +} + +template +inline dimension_type +DB_Row::size() const { + return this->impl->size(); +} + +#if PPL_DB_ROW_EXTRA_DEBUG +template +inline dimension_type +DB_Row::capacity() const { + return this->capacity_; +} +#endif // PPL_DB_ROW_EXTRA_DEBUG + +template +inline +DB_Row::DB_Row() + : DB_Row_Impl_Handler() { +} + +template +inline void +DB_Row::allocate( +#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + const +#endif + dimension_type capacity) { + DB_Row& x = *this; + assert(capacity <= max_size()); +#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + if (capacity == 0) + ++capacity; +#endif + assert(x.impl == 0); + x.impl = new (capacity) typename DB_Row_Impl_Handler::Impl(); +#if PPL_DB_ROW_EXTRA_DEBUG + assert(x.capacity_ == 0); + x.capacity_ = capacity; +#endif +} + +template +inline void +DB_Row::expand_within_capacity(const dimension_type new_size) { + DB_Row& x = *this; + assert(x.impl); +#if PPL_DB_ROW_EXTRA_DEBUG + assert(new_size <= x.capacity_); +#endif + x.impl->expand_within_capacity(new_size); +} + +template +inline void +DB_Row::copy_construct_coefficients(const DB_Row& y) { + DB_Row& x = *this; + assert(x.impl && y.impl); +#if PPL_DB_ROW_EXTRA_DEBUG + assert(y.size() <= x.capacity_); +#endif + x.impl->copy_construct_coefficients(*(y.impl)); +} + +template +template +inline void +DB_Row::construct_upward_approximation(const DB_Row& y, + const dimension_type capacity) { + DB_Row& x = *this; + assert(y.size() <= capacity && capacity <= max_size()); + allocate(capacity); + assert(y.impl); + x.impl->construct_upward_approximation(*(y.impl)); +} + +template +inline void +DB_Row::construct(const dimension_type sz, + const dimension_type capacity) { + assert(sz <= capacity && capacity <= max_size()); + allocate(capacity); + expand_within_capacity(sz); +} + +template +inline void +DB_Row::construct(const dimension_type sz) { + construct(sz, sz); +} + +template +inline +DB_Row::DB_Row(const dimension_type sz, + const dimension_type capacity) + : DB_Row_Impl_Handler() { + construct(sz, capacity); +} + +template +inline +DB_Row::DB_Row(const dimension_type sz) { + construct(sz); +} + +template +inline +DB_Row::DB_Row(const DB_Row& y) + : DB_Row_Impl_Handler() { + if (y.impl) { + allocate(compute_capacity(y.size(), max_size())); + copy_construct_coefficients(y); + } +} + +template +inline +DB_Row::DB_Row(const DB_Row& y, + const dimension_type capacity) + : DB_Row_Impl_Handler() { + assert(y.impl); + assert(y.size() <= capacity && capacity <= max_size()); + allocate(capacity); + copy_construct_coefficients(y); +} + +template +inline +DB_Row::DB_Row(const DB_Row& y, + const dimension_type sz, + const dimension_type capacity) + : DB_Row_Impl_Handler() { + assert(y.impl); + assert(y.size() <= sz && sz <= capacity && capacity <= max_size()); + allocate(capacity); + copy_construct_coefficients(y); + expand_within_capacity(sz); +} + +template +inline +DB_Row::~DB_Row() { +} + +template +inline void +DB_Row::shrink(const dimension_type new_size) { + DB_Row& x = *this; + assert(x.impl); + x.impl->shrink(new_size); +} + +template +inline void +DB_Row::swap(DB_Row& y) { + DB_Row& x = *this; + std::swap(x.impl, y.impl); +#if PPL_DB_ROW_EXTRA_DEBUG + std::swap(x.capacity_, y.capacity_); +#endif +} + +template +inline void +DB_Row::assign(DB_Row& y) { + DB_Row& x = *this; + x.impl = y.impl; +#if PPL_DB_ROW_EXTRA_DEBUG + x.capacity_ = y.capacity_; +#endif +} + +template +inline DB_Row& +DB_Row::operator=(const DB_Row& y) { + // Copy-construct `tmp' from `y'. + DB_Row tmp(y); + // Swap the implementation of `*this' with the one of `tmp'. + swap(tmp); + // Now `tmp' goes out of scope, so the old `*this' will be destroyed. + return *this; +} + +template +inline T& +DB_Row::operator[](const dimension_type k) { + DB_Row& x = *this; + return (*x.impl)[k]; +} + +template +inline const T& +DB_Row::operator[](const dimension_type k) const { + const DB_Row& x = *this; + return (*x.impl)[k]; +} + +template +inline typename DB_Row::iterator +DB_Row::begin() { + DB_Row& x = *this; + return iterator(x.impl->vec_); +} + +template +inline typename DB_Row::iterator +DB_Row::end() { + DB_Row& x = *this; + return iterator(x.impl->vec_ + x.impl->size_); +} + +template +inline typename DB_Row::const_iterator +DB_Row::begin() const { + const DB_Row& x = *this; + return const_iterator(x.impl->vec_); +} + +template +inline typename DB_Row::const_iterator +DB_Row::end() const { + const DB_Row& x = *this; + return const_iterator(x.impl->vec_ + x.impl->size_); +} + +template +inline memory_size_type +DB_Row::external_memory_in_bytes(dimension_type capacity) const { + const DB_Row& x = *this; + return x.impl->total_memory_in_bytes(capacity); +} + +template +inline memory_size_type +DB_Row::total_memory_in_bytes(dimension_type capacity) const { + return sizeof(*this) + external_memory_in_bytes(capacity); +} + +template +inline memory_size_type +DB_Row::external_memory_in_bytes() const { + const DB_Row& 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 +inline memory_size_type +DB_Row::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +/*! \relates DB_Row */ +template +inline bool +operator!=(const DB_Row& x, const DB_Row& y) { + return !(x == y); +} + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +/*! \relates Parma_Polyhedra_Library::DB_Row */ +template +inline void +swap(Parma_Polyhedra_Library::DB_Row& x, + Parma_Polyhedra_Library::DB_Row& y) { + x.swap(y); +} + +/*! \relates Parma_Polyhedra_Library::DB_Row */ +template +inline void +iter_swap(typename std::vector > + ::iterator x, + typename std::vector > + ::iterator y) { + swap(*x, *y); +} + +} // namespace std + +#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..c84c897 --- /dev/null +++ b/src/DB_Row.templates.hh @@ -0,0 +1,214 @@ +/* DB_Row class implementation: non-inline template functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_DB_Row_templates_hh +#define PPL_DB_Row_templates_hh 1 + +#include "globals.defs.hh" + +namespace Parma_Polyhedra_Library { + +template +template +void +DB_Row_Impl_Handler::Impl::construct_upward_approximation(const U& y) { + const dimension_type y_size = y.size(); +#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + // Construct in direct order: will destroy in reverse order. + for (dimension_type i = 0; i < y_size; ++i) { + construct(vec_[i], y[i], ROUND_UP); + bump_size(); + } +#else // PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + assert(y_size > 0); + if (y_size > 0) { + vec_[0] = y[0]; + bump_size(); + // Construct in direct order: will destroy in reverse order. + for (dimension_type i = 1; i < y_size; ++i) { + construct(vec_[i], y[i], ROUND_UP); + bump_size(); + } + } +#endif // PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS +} + +template +void +DB_Row_Impl_Handler:: +Impl::expand_within_capacity(const dimension_type new_size) { + assert(size() <= new_size && new_size <= max_size()); +#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + // vec_[0] is already constructed. + if (size() == 0 && new_size > 0) + bump_size(); +#endif + // Construct in direct order: will destroy in reverse order. + for (dimension_type i = size(); i < new_size; ++i) { + new (&vec_[i]) T(PLUS_INFINITY, ROUND_NOT_NEEDED); + bump_size(); + } +} + +template +void +DB_Row_Impl_Handler::Impl::shrink(dimension_type new_size) { + const dimension_type old_size = size(); + assert(new_size <= old_size); + // Since ~T() does not throw exceptions, nothing here does. + set_size(new_size); +#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + // Make sure we do not try to destroy vec_[0]. + if (new_size == 0) + ++new_size; +#endif + // We assume construction was done "forward". + // We thus perform destruction "backward". + for (dimension_type i = old_size; i-- > new_size; ) + vec_[i].~T(); +} + +template +void +DB_Row_Impl_Handler::Impl::copy_construct_coefficients(const Impl& y) { + const dimension_type y_size = y.size(); +#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + // Construct in direct order: will destroy in reverse order. + for (dimension_type i = 0; i < y_size; ++i) { + new (&vec_[i]) T(y.vec_[i]); + bump_size(); + } +#else // PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + assert(y_size > 0); + if (y_size > 0) { + vec_[0] = y.vec_[0]; + bump_size(); + // Construct in direct order: will destroy in reverse order. + for (dimension_type i = 1; i < y_size; ++i) { + new (&vec_[i]) T(y.vec_[i]); + bump_size(); + } + } +#endif // PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS +} + +template +memory_size_type +DB_Row_Impl_Handler::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 +bool +DB_Row::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& x = *this; + bool is_broken = false; + +#if PPL_DB_ROW_EXTRA_DEBUG +# if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + if (x.capacity_ == 0) { + cerr << "Illegal row capacity: is 0, should be at least 1" + << endl; + is_broken = true; + } + else if (x.capacity_ == 1 && row_capacity == 0) + // This is fine. + ; + else +# endif // !PPL_CXX_SUPPORTS_FLEXIBLE_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 +bool +operator==(const DB_Row& x, const DB_Row& 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..91818d7 --- /dev/null +++ b/src/DB_Row.types.hh @@ -0,0 +1,25 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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 +class DB_Row_Impl_Handler; + +template +class DB_Row; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_DB_Row_types_hh) diff --git a/src/Determinate.defs.hh b/src/Determinate.defs.hh new file mode 100644 index 0000000..31e9c33 --- /dev/null +++ b/src/Determinate.defs.hh @@ -0,0 +1,325 @@ +/* Determinate class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Determinate_defs_hh +#define PPL_Determinate_defs_hh + +#include "Determinate.types.hh" +#include "Constraint_System.types.hh" +#include "Congruence_System.types.hh" +#include "Variable.defs.hh" +#include "globals.types.hh" +#include +#include + +namespace Parma_Polyhedra_Library { + +/*! \brief + Returns true if and only if + \p x and \p y are the same domain element. + + \relates Determinate +*/ +template +bool operator==(const Determinate& x, const Determinate& y); + +/*! \brief + Returns true if and only if + \p x and \p y are different domain elements. + + \relates Determinate +*/ +template +bool operator!=(const Determinate& x, const Determinate& y); + +namespace IO_Operators { + +//! Output operator. +/*! \relates Parma_Polyhedra_Library::Determinate */ +template +std::ostream& +operator<<(std::ostream&, const Determinate&); + +} // namespace IO_Operators + +} // namespace Parma_Polyhedra_Library + +//! Wraps a PPL class into a determinate constraint system interface. +/*! \ingroup PPL_CXX_interface */ +template +class Parma_Polyhedra_Library::Determinate { +public: + //! \name Constructors and Destructor + //@{ + + /*! \brief + Injection operator: builds the determinate constraint system element + corresponding to the base-level element \p p. + */ + Determinate(const PS& p); + + /*! \brief + Injection operator: builds the determinate constraint system element + corresponding to the base-level element represented by \p cs. + */ + Determinate(const Constraint_System& cs); + + //! \brief + //! Injection operator: builds the determinate constraint system element + //! corresponding to the base-level element represented by \p cgs. + Determinate(const Congruence_System& cgs); + + //! Copy constructor. + Determinate(const Determinate& y); + + //! Destructor. + ~Determinate(); + + //@} // Constructors and Destructor + + //! \name Member Functions that Do Not Modify the Domain Element + //@{ + + //! Returns a const reference to the embedded element. + const PS& element() const; + + /*! \brief + Returns true if and only if \p *this is the top of the + determinate constraint system (i.e., the whole vector space). + */ + bool is_top() const; + + /*! \brief + Returns true if and only if \p *this is the bottom + of the determinate constraint system. + */ + bool is_bottom() const; + + //! Returns true if and only if \p *this entails \p y. + bool definitely_entails(const Determinate& y) const; + + /*! \brief + Returns true if and only if \p *this and \p y + are equivalent. + */ + bool is_definitely_equivalent_to(const Determinate& y) const; + + /*! \brief + Returns a lower bound to the total size in bytes of the memory + occupied by \p *this. + */ + memory_size_type total_memory_in_bytes() const; + + /*! \brief + Returns a lower bound to the size in bytes of the memory + managed by \p *this. + */ + memory_size_type external_memory_in_bytes() const; + + /*! + Returns true 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. + PS& element(); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS + /*! \brief + On return from this method, the representation of \p *this + is not shared by different Determinate objects. + */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) + void mutate(); + + //! Assignment operator. + Determinate& operator=(const Determinate& y); + + //! Swaps \p *this with \p y. + void swap(Determinate& y); + + //@} // Member Functions that May Modify the Domain Element + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS + //! A function adapter for the Determinate class. + /*! \ingroup PPL_CXX_interface + It lifts a Binary_Operator_Assign function object, taking arguments + of type PS, producing the corresponding function object taking + arguments of type Determinate. + + The template parameter Binary_Operator_Assign is supposed to + implement an apply and assign function, i.e., a function + having signature void foo(PS& x, const PS& y) 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 + std::mem_fun_ref(&C_Polyhedron::intersection_assign). + */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) + template + 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 + static Binary_Operator_Assign_Lifter + lift_op_assign(Binary_Operator_Assign op_assign); + +private: + //! The possibly shared representation of a Determinate object. + /*! \ingroup PPL_CXX_interface + By adopting the copy-on-write technique, a single + representation of the base-level object may be shared by more than + one object of the class Determinate. + */ + class Rep { + private: + /*! \brief + Count the number of references: + - 0: leaked, \p ph is non-const; + - 1: one reference, \p ph is non-const; + - > 1: more than one reference, \p ph is const. + */ + mutable unsigned long references; + + //! Private and unimplemented: assignment not allowed. + Rep& operator=(const Rep& y); + + //! Private and unimplemented: copies not allowed. + Rep(const Rep& y); + + //! Private and unimplemented: default construction not allowed. + Rep(); + + public: + //! A possibly shared base-level domain element. + PS ph; + + /*! \brief + Builds a new representation by creating a domain element + of the specified kind, in the specified vector space. + */ + Rep(dimension_type num_dimensions, Degenerate_Element kind); + + //! Builds a new representation by copying base-level element \p p. + Rep(const PS& 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 true 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==(const Determinate& x, const Determinate& y); + friend bool + operator!=(const Determinate& x, const Determinate& y); +}; + + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Determinate */ +template +void swap(Parma_Polyhedra_Library::Determinate& x, + Parma_Polyhedra_Library::Determinate& y); + +} // namespace std + +#include "Determinate.inlines.hh" + +#endif // !defined(PPL_Determinate_defs_hh) diff --git a/src/Determinate.inlines.hh b/src/Determinate.inlines.hh new file mode 100644 index 0000000..9aee467 --- /dev/null +++ b/src/Determinate.inlines.hh @@ -0,0 +1,309 @@ +/* Determinate class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Determinate_inlines_hh +#define PPL_Determinate_inlines_hh 1 + +#include + +namespace Parma_Polyhedra_Library { + +template +inline +Determinate::Rep::Rep(dimension_type num_dimensions, + Degenerate_Element kind) + : references(0), ph(num_dimensions, kind) { +} + +template +inline +Determinate::Rep::Rep(const PS& p) + : references(0), ph(p) { +} + +template +inline +Determinate::Rep::Rep(const Constraint_System& cs) + : references(0), ph(cs) { +} + +template +inline +Determinate::Rep::Rep(const Congruence_System& cgs) + : references(0), ph(cgs) { +} + +template +inline +Determinate::Rep::~Rep() { + assert(references == 0); +} + +template +inline void +Determinate::Rep::new_reference() const { + ++references; +} + +template +inline bool +Determinate::Rep::del_reference() const { + return --references == 0; +} + +template +inline bool +Determinate::Rep::is_shared() const { + return references > 1; +} + +template +inline memory_size_type +Determinate::Rep::external_memory_in_bytes() const { + return ph.external_memory_in_bytes(); +} + +template +inline memory_size_type +Determinate::Rep::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +template +inline +Determinate::Determinate(const PS& ph) + : prep(new Rep(ph)) { + prep->new_reference(); +} + +template +inline +Determinate::Determinate(const Constraint_System& cs) + : prep(new Rep(cs)) { + prep->new_reference(); +} + +template +inline +Determinate::Determinate(const Congruence_System& cgs) + : prep(new Rep(cgs)) { + prep->new_reference(); +} + +template +inline +Determinate::Determinate(const Determinate& y) + : prep(y.prep) { + prep->new_reference(); +} + +template +inline +Determinate::~Determinate() { + if (prep->del_reference()) + delete prep; +} + +template +inline Determinate& +Determinate::operator=(const Determinate& y) { + y.prep->new_reference(); + if (prep->del_reference()) + delete prep; + prep = y.prep; + return *this; +} + +template +inline void +Determinate::swap(Determinate& y) { + std::swap(prep, y.prep); +} + +template +inline void +Determinate::mutate() { + if (prep->is_shared()) { + Rep* new_prep = new Rep(prep->ph); + (void) prep->del_reference(); + new_prep->new_reference(); + prep = new_prep; + } +} + +template +inline const PS& +Determinate::element() const { + return prep->ph; +} + +template +inline PS& +Determinate::element() { + mutate(); + return prep->ph; +} + +template +inline void +Determinate::upper_bound_assign(const Determinate& y) { + element().upper_bound_assign(y.element()); +} + +template +inline void +Determinate::meet_assign(const Determinate& y) { + element().intersection_assign(y.element()); +} + +template +inline bool +Determinate::has_nontrivial_weakening() { + // FIXME: the following should be turned into a query to PS. This + // can be postponed until the time the ask-and-tell construction is + // revived. + return false; +} + +template +inline void +Determinate::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. + element().difference_assign(y.element()); +} + +template +inline void +Determinate::concatenate_assign(const Determinate& y) { + element().concatenate_assign(y.element()); +} + +template +inline bool +Determinate::definitely_entails(const Determinate& y) const { + return prep == y.prep || y.prep->ph.contains(prep->ph); +} + +template +inline bool +Determinate::is_definitely_equivalent_to(const Determinate& y) const { + return prep == y.prep || prep->ph == y.prep->ph; +} + +template +inline bool +Determinate::is_top() const { + return prep->ph.is_universe(); +} + +template +inline bool +Determinate::is_bottom() const { + return prep->ph.is_empty(); +} + +template +inline memory_size_type +Determinate::external_memory_in_bytes() const { + return prep->total_memory_in_bytes(); +} + +template +inline memory_size_type +Determinate::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +template +inline bool +Determinate::OK() const { + return prep->ph.OK(); +} + +namespace IO_Operators { + +/*! \relates Parma_Polyhedra_Library::Determinate */ +template +inline std::ostream& +operator<<(std::ostream& s, const Determinate& x) { + s << x.element(); + return s; +} + +} // namespace IO_Operators + +/*! \relates Determinate */ +template +inline bool +operator==(const Determinate& x, const Determinate& y) { + return x.prep == y.prep || x.prep->ph == y.prep->ph; +} + +/*! \relates Determinate */ +template +inline bool +operator!=(const Determinate& x, const Determinate& y) { + return x.prep != y.prep && x.prep->ph != y.prep->ph; +} + +template +template +inline +Determinate::Binary_Operator_Assign_Lifter:: +Binary_Operator_Assign_Lifter(Binary_Operator_Assign op_assign) + : op_assign_(op_assign) { +} + +template +template +inline void +Determinate::Binary_Operator_Assign_Lifter:: +operator()(Determinate& x, const Determinate& y) const { + op_assign_(x.element(), y.element()); +} + +template +template +inline +Determinate::Binary_Operator_Assign_Lifter +Determinate::lift_op_assign(Binary_Operator_Assign op_assign) { + return Binary_Operator_Assign_Lifter(op_assign); +} + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Determinate */ +template +inline void +swap(Parma_Polyhedra_Library::Determinate& x, + Parma_Polyhedra_Library::Determinate& y) { + x.swap(y); +} + +} // namespace std + +#endif // !defined(PPL_Determinate_inlines_hh) diff --git a/src/Determinate.types.hh b/src/Determinate.types.hh new file mode 100644 index 0000000..35266b9 --- /dev/null +++ b/src/Determinate.types.hh @@ -0,0 +1,22 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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 +class Determinate; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Determinate_types_hh) diff --git a/src/Float.cc b/src/Float.cc new file mode 100644 index 0000000..b03ea30 --- /dev/null +++ b/src/Float.cc @@ -0,0 +1,42 @@ +/* IEC 559 floating point format related functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include +#include "Float.defs.hh" + +namespace Parma_Polyhedra_Library { + +const uint64_t float_intel_double_extended::LSP_INF; +const uint64_t float_intel_double_extended::LSP_ZERO; +const uint64_t float_intel_double_extended::LSP_DMAX; +const uint64_t float_intel_double_extended::LSP_NMAX; + +const uint64_t float_ieee754_quad::MSP_SGN_MASK; +const uint64_t float_ieee754_quad::MSP_POS_INF; +const uint64_t float_ieee754_quad::MSP_NEG_INF; +const uint64_t float_ieee754_quad::MSP_POS_ZERO; +const uint64_t float_ieee754_quad::MSP_NEG_ZERO; +const uint64_t float_ieee754_quad::LSP_INF; +const uint64_t float_ieee754_quad::LSP_ZERO; +const uint64_t float_ieee754_quad::LSP_MAX; + +} // Parma_Polyhedra_Library diff --git a/src/Float.defs.hh b/src/Float.defs.hh new file mode 100644 index 0000000..20498b6 --- /dev/null +++ b/src/Float.defs.hh @@ -0,0 +1,276 @@ +/* IEC 559 floating point format related functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Float_defs_hh +#define PPL_Float_defs_hh 1 + +#include "meta_programming.hh" +#include "compiler.hh" +#include +#include +#include + +#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_single { + uint32_t word; + static const uint32_t SGN_MASK = 0x80000000; + static const uint32_t EXP_MASK = 0x7f800000; + static const uint32_t POS_INF = 0x7f800000; + static const uint32_t NEG_INF = 0xff800000; + static const uint32_t POS_ZERO = 0x00000000; + static const uint32_t NEG_ZERO = 0x80000000; + static const unsigned int EXPONENT_BITS = 8; + static const unsigned int MANTISSA_BITS = 23; + static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1; + static const int EXPONENT_BIAS = EXPONENT_MAX; + static const int EXPONENT_MIN = -EXPONENT_MAX + 1; + static const int EXPONENT_MIN_DENORM = EXPONENT_MIN + - static_cast(MANTISSA_BITS); + int is_inf() const; + int is_nan() const; + int is_zero() const; + int sign_bit() const; + void negate(); + void dec(); + void inc(); + void set_max(bool negative); + void build(bool negative, mpz_t mantissa, int exponent); +}; + +#ifdef 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 = 0x80000000; + static const uint32_t MSP_POS_INF = 0x7ff00000; + static const uint32_t MSP_NEG_INF = 0xfff00000; + static const uint32_t MSP_POS_ZERO = 0x00000000; + static const uint32_t MSP_NEG_ZERO = 0x80000000; + static const uint32_t LSP_INF = 0; + static const uint32_t LSP_ZERO = 0; + static const uint32_t LSP_MAX = 0xffffffff; + static const unsigned int EXPONENT_BITS = 11; + static const unsigned int MANTISSA_BITS = 52; + static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1; + static const int EXPONENT_BIAS = EXPONENT_MAX; + static const int EXPONENT_MIN = -EXPONENT_MAX + 1; + static const int EXPONENT_MIN_DENORM = EXPONENT_MIN + - static_cast(MANTISSA_BITS); + int is_inf() const; + int is_nan() const; + int is_zero() const; + int sign_bit() const; + void negate(); + void dec(); + void inc(); + void set_max(bool negative); + void build(bool negative, mpz_t mantissa, int exponent); +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \ingroup PPL_CXX_interface */ +#endif // 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 = 0x00008000; + static const uint32_t MSP_POS_INF = 0x00007fff; + static const uint32_t MSP_NEG_INF = 0x0000ffff; + static const uint32_t MSP_POS_ZERO = 0x00000000; + static const uint32_t MSP_NEG_ZERO = 0x00008000; + static const uint64_t LSP_INF = 0x8000000000000000ULL; + static const uint64_t LSP_ZERO = 0; + static const uint64_t LSP_DMAX = 0x7fffffffffffffffULL; + static const uint64_t LSP_NMAX = 0xffffffffffffffffULL; + static const unsigned int EXPONENT_BITS = 15; + static const unsigned int MANTISSA_BITS = 63; + static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1; + static const int EXPONENT_BIAS = EXPONENT_MAX; + static const int EXPONENT_MIN = -EXPONENT_MAX + 1; + static const int EXPONENT_MIN_DENORM = EXPONENT_MIN + - static_cast(MANTISSA_BITS); + int is_inf() const; + int is_nan() const; + int is_zero() const; + int sign_bit() const; + void negate(); + void dec(); + void inc(); + void set_max(bool negative); + void build(bool negative, mpz_t mantissa, int exponent); +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \ingroup PPL_CXX_interface */ +#endif // 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 = 0x8000000000000000ULL; + static const uint64_t MSP_POS_INF = 0x7fff000000000000ULL; + static const uint64_t MSP_NEG_INF = 0xffff000000000000ULL; + static const uint64_t MSP_POS_ZERO = 0x0000000000000000ULL; + static const uint64_t MSP_NEG_ZERO = 0x8000000000000000ULL; + static const uint64_t LSP_INF = 0; + static const uint64_t LSP_ZERO = 0; + static const uint64_t LSP_MAX = 0xffffffffffffffffULL; + static const unsigned int EXPONENT_BITS = 15; + static const unsigned int MANTISSA_BITS = 112; + static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1; + static const int EXPONENT_BIAS = EXPONENT_MAX; + static const int EXPONENT_MIN = -EXPONENT_MAX + 1; + static const int EXPONENT_MIN_DENORM = EXPONENT_MIN + - static_cast(MANTISSA_BITS); + int is_inf() const; + int is_nan() const; + int is_zero() const; + int sign_bit() const; + void negate(); + void dec(); + void inc(); + void set_max(bool negative); + void build(bool negative, mpz_t mantissa, int exponent); +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +class Float : public False { }; + +#if PPL_SUPPORTED_FLOAT +template <> +class Float : public True { +public: +#if 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_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 : public True { +public: +#if 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_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 : public True { +public: +#if 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_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 + +} // namespace Parma_Polyhedra_Library + +#include "Float.inlines.hh" + +#endif // !defined(PPL_Float_defs_hh) diff --git a/src/Float.inlines.hh b/src/Float.inlines.hh new file mode 100644 index 0000000..2796f9e --- /dev/null +++ b/src/Float.inlines.hh @@ -0,0 +1,382 @@ +/* IEC 559 floating point format related functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Float_inlines_hh +#define PPL_Float_inlines_hh 1 + +#include + +namespace Parma_Polyhedra_Library { + +inline int +float_ieee754_single::is_inf() const { + if (word == NEG_INF) + return -1; + if (word == POS_INF) + return 1; + return 0; +} + +inline int +float_ieee754_single::is_nan() const { + return (word & ~SGN_MASK) > POS_INF; +} + +inline int +float_ieee754_single::is_zero() const { + if (word == NEG_ZERO) + return -1; + if (word == POS_ZERO) + return 1; + return 0; +} + +inline void +float_ieee754_single::negate() { + word ^= SGN_MASK; +} + +inline int +float_ieee754_single::sign_bit() const { + return !!(word & SGN_MASK); +} + +inline void +float_ieee754_single::dec() { + --word; +} + +inline void +float_ieee754_single::inc() { + ++word; +} + +inline void +float_ieee754_single::set_max(bool negative) { + word = 0x7f7fffff; + if (negative) + word |= SGN_MASK; +} + +inline void +float_ieee754_single::build(bool negative, mpz_t mantissa, int exponent) { + word = mpz_get_ui(mantissa) & ((1UL << MANTISSA_BITS) - 1); + if (negative) + word |= SGN_MASK; + word |= static_cast(exponent + EXPONENT_BIAS) << MANTISSA_BITS; +} + +inline int +float_ieee754_double::is_inf() const { + if (lsp != LSP_INF) + return 0; + if (msp == MSP_NEG_INF) + return -1; + if (msp == MSP_POS_INF) + return 1; + return 0; +} + +inline int +float_ieee754_double::is_nan() const { + uint32_t a = msp & ~MSP_SGN_MASK; + return a > MSP_POS_INF || (a == MSP_POS_INF && lsp != LSP_INF); +} + +inline int +float_ieee754_double::is_zero() const { + if (lsp != LSP_ZERO) + return 0; + if (msp == MSP_NEG_ZERO) + return -1; + if (msp == MSP_POS_ZERO) + return 1; + return 0; +} + +inline void +float_ieee754_double::negate() { + msp ^= MSP_SGN_MASK; +} + +inline int +float_ieee754_double::sign_bit() const { + return !!(msp & MSP_SGN_MASK); +} + +inline void +float_ieee754_double::dec() { + if (lsp == 0) { + --msp; + lsp = LSP_MAX; + } + else + --lsp; +} + +inline void +float_ieee754_double::inc() { + if (lsp == LSP_MAX) { + ++msp; + lsp = 0; + } + else + ++lsp; +} + +inline void +float_ieee754_double::set_max(bool negative) { + msp = 0x7fefffff; + lsp = 0xffffffff; + if (negative) + msp |= MSP_SGN_MASK; +} + +inline void +float_ieee754_double::build(bool negative, mpz_t mantissa, int exponent) { +#if ULONG_MAX == 0xffffffffUL + lsp = mpz_get_ui(mantissa); + mpz_tdiv_q_2exp(mantissa, mantissa, 32); + unsigned long m = mpz_get_ui(mantissa); +#else + unsigned long m = mpz_get_ui(mantissa); + lsp = m; + m >>= 32; +#endif + msp = m & ((1UL << (MANTISSA_BITS - 32)) - 1); + if (negative) + msp |= MSP_SGN_MASK; + msp |= static_cast(exponent + EXPONENT_BIAS) + << (MANTISSA_BITS - 32); +} + +inline int +float_intel_double_extended::is_inf() const { + if (lsp != LSP_INF) + return 0; + uint32_t a = msp & MSP_NEG_INF; + if (a == MSP_NEG_INF) + return -1; + if (a == MSP_POS_INF) + return 1; + return 0; +} + +inline int +float_intel_double_extended::is_nan() const { + return (msp & MSP_POS_INF) == MSP_POS_INF + && lsp != LSP_INF; +} + +inline int +float_intel_double_extended::is_zero() const { + if (lsp != LSP_ZERO) + return 0; + uint32_t a = msp & MSP_NEG_INF; + if (a == MSP_NEG_ZERO) + return -1; + if (a == MSP_POS_ZERO) + return 1; + return 0; +} + +inline void +float_intel_double_extended::negate() { + msp ^= MSP_SGN_MASK; +} + +inline int +float_intel_double_extended::sign_bit() const { + return !!(msp & MSP_SGN_MASK); +} + +inline void +float_intel_double_extended::dec() { + if ((lsp & LSP_DMAX) == 0) { + --msp; + lsp = (msp & MSP_NEG_INF) == 0 ? LSP_DMAX : LSP_NMAX; + } + else + --lsp; +} + +inline void +float_intel_double_extended::inc() { + if ((lsp & LSP_DMAX) == LSP_DMAX) { + ++msp; + lsp = LSP_DMAX + 1; + } + else + ++lsp; +} + +inline void +float_intel_double_extended::set_max(bool negative) { + msp = 0x00007ffe; + lsp = 0xffffffffffffffffULL; + if (negative) + msp |= MSP_SGN_MASK; +} + +inline void +float_intel_double_extended::build(bool negative, + mpz_t mantissa, int exponent) { +#if ULONG_MAX == 0xffffffffUL + mpz_export(&lsp, 0, -1, 8, 0, 0, mantissa); +#else + lsp = mpz_get_ui(mantissa); +#endif + msp = (negative ? MSP_SGN_MASK : 0); + msp |= static_cast(exponent + EXPONENT_BIAS); +} + +inline int +float_ieee754_quad::is_inf() const { + if (lsp != LSP_INF) + return 0; + if (msp == MSP_NEG_INF) + return -1; + if (msp == MSP_POS_INF) + return 1; + return 0; +} + +inline int +float_ieee754_quad::is_nan() const { + return (msp & ~MSP_SGN_MASK) == MSP_POS_INF + && lsp != LSP_INF; +} + +inline int +float_ieee754_quad::is_zero() const { + if (lsp != LSP_ZERO) + return 0; + if (msp == MSP_NEG_ZERO) + return -1; + if (msp == MSP_POS_ZERO) + return 1; + return 0; +} + +inline void +float_ieee754_quad::negate() { + msp ^= MSP_SGN_MASK; +} + +inline int +float_ieee754_quad::sign_bit() const { + return !!(msp & MSP_SGN_MASK); +} + +inline void +float_ieee754_quad::dec() { + if (lsp == 0) { + --msp; + lsp = LSP_MAX; + } + else + --lsp; +} + +inline void +float_ieee754_quad::inc() { + if (lsp == LSP_MAX) { + ++msp; + lsp = 0; + } + else + ++lsp; +} + +inline void +float_ieee754_quad::set_max(bool negative) { + msp = 0x7ffeffffffffffffULL; + lsp = 0xffffffffffffffffULL; + if (negative) + msp |= MSP_SGN_MASK; +} + +inline void +float_ieee754_quad::build(bool negative, mpz_t mantissa, int exponent) { + uint64_t parts[2]; + mpz_export(parts, 0, -1, 8, 0, 0, mantissa); + lsp = parts[0]; + msp = parts[1]; + msp &= ((1ULL << (MANTISSA_BITS - 64)) - 1); + if (negative) + msp |= MSP_SGN_MASK; + msp |= static_cast(exponent + EXPONENT_BIAS) + << (MANTISSA_BITS - 64); +} + +#if PPL_SUPPORTED_FLOAT +inline +Float::Float() { +} + +inline +Float::Float(float v) { + u.number = v; +} + +inline float +Float::value() { + return u.number; +} +#endif + +#if PPL_SUPPORTED_DOUBLE +inline +Float::Float() { +} + +inline +Float::Float(double v) { + u.number = v; +} + +inline double +Float::value() { + return u.number; +} +#endif + +#if PPL_SUPPORTED_LONG_DOUBLE +inline +Float::Float() { +} + +inline +Float::Float(long double v) { + u.number = v; +} + +inline long double +Float::value() { + return u.number; +} +#endif + + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Float_inlines_hh) diff --git a/src/GMP_Integer.defs.hh b/src/GMP_Integer.defs.hh new file mode 100644 index 0000000..159bdb9 --- /dev/null +++ b/src/GMP_Integer.defs.hh @@ -0,0 +1,142 @@ +/* GMP_Integer class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_GMP_Integer_defs_hh +#define PPL_GMP_Integer_defs_hh 1 + +#include "GMP_Integer.types.hh" +#include "globals.types.hh" +#include + +namespace Parma_Polyhedra_Library { + +//! \name Accessor Functions +//@{ + +//! Returns a const reference to the underlying integer value. +/*! \relates GMP_Integer */ +const mpz_class& raw_value(const GMP_Integer& x); + +//! Returns a reference to the underlying integer value. +/*! \relates GMP_Integer */ +mpz_class& raw_value(GMP_Integer& x); + +//@} // Accessor Functions + +//! \name Memory Size Inspection Functions +//@{ + +#ifndef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns the total size in bytes of the memory occupied by \p x. +/*! \relates GMP_Integer */ +#endif // !defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +memory_size_type total_memory_in_bytes(const GMP_Integer& x); + +#ifndef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns the size in bytes of the memory managed by \p x. +/*! \relates GMP_Integer */ +#endif // !defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +memory_size_type external_memory_in_bytes(const GMP_Integer& x); + +//@} // Memory Size Inspection Functions + +//! \name Arithmetic Operators +//@{ + +//! Assigns to \p x its negation. +/*! \relates GMP_Integer */ +void neg_assign(GMP_Integer& x); + +//! Assigns to \p x the negation of \p y. +/*! \relates GMP_Integer */ +void neg_assign(GMP_Integer& x, const GMP_Integer& y); + +//! Assigns to \p x 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 x + y * z. +/*! \relates GMP_Integer */ +void add_mul_assign(GMP_Integer& x, + const GMP_Integer& y, const GMP_Integer& z); + +//! Assigns to \p x the value x - y * z. +/*! \relates GMP_Integer */ +void sub_mul_assign(GMP_Integer& x, + const GMP_Integer& y, const GMP_Integer& z); + +/*! \brief + If \p z divides \p y, assigns to \p x the quotient of the integer + division of \p y and \p z. + + \relates GMP_Integer + The behavior is undefined if \p z does not divide \p y. +*/ +void exact_div_assign(GMP_Integer& x, + const GMP_Integer& y, const GMP_Integer& z); + +//! Assigns to \p x the integer square root of \p y. +/*! \relates GMP_Integer */ +void sqrt_assign(GMP_Integer& x, const GMP_Integer& y); + +/*! \brief + Returns a negative, zero or positive value depending on whether + \p x is lower than, equal to or greater than \p y, respectively. + + \relates GMP_Integer +*/ +int cmp(const GMP_Integer& x, const GMP_Integer& y); + +//@} // Arithmetic Operators + +} // namespace Parma_Polyhedra_Library + +#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..9cb9e04 --- /dev/null +++ b/src/GMP_Integer.inlines.hh @@ -0,0 +1,111 @@ +/* GMP_Integer class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_GMP_Integer_inlines_hh +#define PPL_GMP_Integer_inlines_hh 1 + +#include + +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 +exact_div_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) { + assert(y % z == 0); + mpz_divexact(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t()); +} + +inline void +sqrt_assign(GMP_Integer& x, const GMP_Integer& y) { + mpz_sqrt(x.get_mpz_t(), y.get_mpz_t()); +} + +inline int +cmp(const GMP_Integer& x, const GMP_Integer& y) { + return mpz_cmp(x.get_mpz_t(), y.get_mpz_t()); +} + +inline const mpz_class& +raw_value(const GMP_Integer& x) { + return x; +} + +inline mpz_class& +raw_value(GMP_Integer& x) { + return x; +} + +} // 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..8fde525 --- /dev/null +++ b/src/GMP_Integer.types.hh @@ -0,0 +1,44 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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 +#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 mpz_class type + defined in the C++ interface of the GMP library. + For more information, see http://www.swox.com/gmp/ +*/ +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 { + //! 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..a697381 --- /dev/null +++ b/src/Generator.cc @@ -0,0 +1,410 @@ +/* Generator class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Generator.defs.hh" + +#include "Variable.defs.hh" +#include +#include +#include + +namespace PPL = Parma_Polyhedra_Library; + +void +PPL::Generator::throw_dimension_incompatible(const char* method, + const char* name_var, + const Variable v) const { + std::ostringstream s; + s << "PPL::Generator::" << method << ":" << std::endl + << "this->space_dimension() == " << space_dimension() << ", " + << name_var << ".space_dimension() == " << v.space_dimension() << "."; + throw std::invalid_argument(s.str()); +} + +void +PPL::Generator::throw_invalid_argument(const char* method, + const char* reason) const { + std::ostringstream s; + s << "PPL::Generator::" << method << ":" << std::endl + << reason << "."; + throw std::invalid_argument(s.str()); +} + +PPL::Generator +PPL::Generator::point(const Linear_Expression& e, + Coefficient_traits::const_reference d) { + if (d == 0) + throw std::invalid_argument("PPL::point(e, d):\n" + "d == 0."); + Linear_Expression ec = e; + Generator g(ec, Generator::POINT, NECESSARILY_CLOSED); + g[0] = d; + + // If the divisor is negative, we negate it as well as + // all the coefficients of the point, because we want to preserve + // the invariant: the divisor of a point is strictly positive. + if (d < 0) + for (dimension_type i = g.size(); i-- > 0; ) + neg_assign(g[i]); + + // Enforce normalization. + g.normalize(); + return g; +} + +PPL::Generator +PPL::Generator::closure_point(const Linear_Expression& e, + Coefficient_traits::const_reference d) { + if (d == 0) + throw std::invalid_argument("PPL::closure_point(e, d):\n" + "d == 0."); + // Adding the epsilon dimension with coefficient 0. + Linear_Expression ec = 0 * Variable(e.space_dimension()); + ec += e; + // A closure point is indeed a point in the higher dimension space. + Generator g = point(ec, d); + // Fix the topology. + g.set_not_necessarily_closed(); + // Enforce normalization. + g.normalize(); + return g; +} + +PPL::Generator +PPL::Generator::ray(const Linear_Expression& e) { + // The origin of the space cannot be a ray. + if (e.all_homogeneous_terms_are_zero()) + throw std::invalid_argument("PPL::ray(e):\n" + "e == 0, but the origin cannot be a ray."); + + Linear_Expression ec = e; + Generator g(ec, Generator::RAY, NECESSARILY_CLOSED); + g[0] = 0; + // Enforce normalization. + g.normalize(); + return g; +} + +PPL::Generator +PPL::Generator::line(const Linear_Expression& e) { + // The origin of the space cannot be a line. + if (e.all_homogeneous_terms_are_zero()) + throw std::invalid_argument("PPL::line(e):\n" + "e == 0, but the origin cannot be a line."); + + Linear_Expression ec = e; + Generator g(ec, Generator::LINE, NECESSARILY_CLOSED); + g[0] = 0; + // Enforce normalization. + g.strong_normalize(); + return g; +} + +bool +PPL::Generator::is_equivalent_to(const Generator& y) const { + const Generator& x = *this; + const dimension_type x_space_dim = x.space_dimension(); + if (x_space_dim != y.space_dimension()) + return false; + + const Type x_type = x.type(); + if (x_type != y.type()) + return false; + + if (x_type == POINT + && !(x.is_necessarily_closed() && y.is_necessarily_closed())) { + // Due to the presence of epsilon-coefficients, syntactically + // different points may actually encode the same generator. + // First, drop the epsilon-coefficient ... + Linear_Expression x_expr(x); + Linear_Expression y_expr(y); + // ... second, re-normalize ... + x_expr.normalize(); + y_expr.normalize(); + // ... and finally check for syntactic equality. + for (dimension_type i = x_space_dim + 1; i-- > 0; ) + if (x_expr[i] != y_expr[i]) + return false; + return true; + } + + // Here the epsilon-coefficient, if present, is zero. + // It is sufficient to check for syntactic equality. + for (dimension_type i = x_space_dim + 1; i-- > 0; ) + if (x[i] != y[i]) + return false; + return true; +} + +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() { + assert(zero_dim_point_p == 0); + zero_dim_point_p + = new Generator(point()); + + assert(zero_dim_closure_point_p == 0); + zero_dim_closure_point_p + = new Generator(closure_point()); +} + +void +PPL::Generator::finalize() { + assert(zero_dim_point_p != 0); + delete zero_dim_point_p; + zero_dim_point_p = 0; + + assert(zero_dim_closure_point_p != 0); + delete zero_dim_closure_point_p; + zero_dim_closure_point_p = 0; +} + +/*! \relates Parma_Polyhedra_Library::Generator */ +std::ostream& +PPL::IO_Operators::operator<<(std::ostream& s, const Generator& g) { + bool needed_divisor = false; + bool extra_parentheses = false; + const dimension_type num_variables = g.space_dimension(); + Generator::Type t = g.type(); + switch (t) { + case Generator::LINE: + s << "l("; + break; + case Generator::RAY: + s << "r("; + break; + case Generator::POINT: + s << "p("; + goto any_point; + case Generator::CLOSURE_POINT: + s << "c("; + any_point: + if (g[0] != 1) { + needed_divisor = true; + dimension_type num_non_zero_coefficients = 0; + for (dimension_type v = 0; v < num_variables; ++v) + if (g[v+1] != 0) + if (++num_non_zero_coefficients > 1) { + extra_parentheses = true; + s << "("; + break; + } + } + break; + } + + PPL_DIRTY_TEMP_COEFFICIENT(gv); + bool first = true; + for (dimension_type v = 0; v < num_variables; ++v) { + gv = g[v+1]; + if (gv != 0) { + if (!first) { + if (gv > 0) + s << " + "; + else { + s << " - "; + neg_assign(gv); + } + } + else + first = false; + if (gv == -1) + s << "-"; + else if (gv != 1) + s << gv << "*"; + s << PPL::Variable(v); + } + } + if (first) + // A point or closure point in the origin. + s << 0; + if (extra_parentheses) + s << ")"; + if (needed_divisor) + s << "/" << g[0]; + s << ")"; + return s; +} + +/*! \relates Parma_Polyhedra_Library::Generator */ +std::ostream& +PPL::IO_Operators::operator<<(std::ostream& s, const Generator::Type& t) { + const char* n = 0; + switch (t) { + case Generator::LINE: + n = "LINE"; + break; + case Generator::RAY: + n = "RAY"; + break; + case Generator::POINT: + n = "POINT"; + break; + case Generator::CLOSURE_POINT: + n = "CLOSURE_POINT"; + break; + } + s << n; + return s; +} + +bool +PPL::Generator::is_matching_closure_point(const Generator& p) const { + assert(topology() == p.topology() + && space_dimension() == p.space_dimension() + && type() == CLOSURE_POINT + && p.type() == POINT); + const Generator& cp = *this; + if (cp[0] == p[0]) { + // Divisors are equal: we can simply compare coefficients + // (disregarding the epsilon coefficient). + for (dimension_type i = cp.size() - 2; i > 0; --i) + if (cp[i] != p[i]) + return false; + return true; + } + else { + // Divisors are different: divide them by their GCD + // to simplify the following computation. + PPL_DIRTY_TEMP_COEFFICIENT(gcd); + gcd_assign(gcd, cp[0], p[0]); + 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[0], gcd); + exact_div_assign(p_0_scaled, p[0], gcd); + } + const Coefficient& cp_div = rel_prime ? cp[0] : cp_0_scaled; + const Coefficient& p_div = rel_prime ? p[0] : p_0_scaled; + PPL_DIRTY_TEMP_COEFFICIENT(prod1); + PPL_DIRTY_TEMP_COEFFICIENT(prod2); + for (dimension_type i = cp.size() - 2; i > 0; --i) { + prod1 = cp[i] * p_div; + prod2 = p[i] * cp_div; + if (prod1 != prod2) + return false; + } + return true; + } +} + +PPL_OUTPUT_DEFINITIONS(Generator) + +bool +PPL::Generator::OK() const { + // Check the underlying Linear_Row object. + if (!Linear_Row::OK()) + return false; + + // Topology consistency check. + const dimension_type min_size = is_necessarily_closed() ? 1 : 2; + if (size() < min_size) { +#ifndef NDEBUG + std::cerr << "Generator has fewer coefficients than the minimum " + << "allowed by its topology:" + << std::endl + << "size is " << size() + << ", minimum is " << min_size << "." + << std::endl; +#endif + return false; + } + + // Normalization check. + const Generator& g = *this; + Generator tmp = g; + tmp.strong_normalize(); + if (tmp != g) { +#ifndef NDEBUG + std::cerr << "Generators should be strongly normalized!" + << std::endl; +#endif + return false; + } + + switch (g.type()) { + case LINE: + // Intentionally fall through. + case RAY: + if (g[0] != 0) { +#ifndef NDEBUG + std::cerr << "Lines must have a zero inhomogeneous term!" + << std::endl; +#endif + return false; + } + if (!g.is_necessarily_closed() && g[size() - 1] != 0) { +#ifndef NDEBUG + std::cerr << "Lines and rays must have a zero coefficient " + << "for the epsilon dimension!" + << std::endl; +#endif + return false; + } + // The following test is correct, since we already checked + // that the epsilon coordinate is zero. + if (g.all_homogeneous_terms_are_zero()) { +#ifndef NDEBUG + std::cerr << "The origin of the vector space cannot be a line or a ray!" + << std::endl; +#endif + return false; + } + break; + + case POINT: + if (g[0] <= 0) { +#ifndef NDEBUG + std::cerr << "Points must have a positive divisor!" + << std::endl; +#endif + return false; + } + if (!g.is_necessarily_closed()) + if (g[size() - 1] <= 0) { +#ifndef NDEBUG + std::cerr << "In the NNC topology, points must have epsilon > 0" + << std::endl; +#endif + return false; + } + break; + + case CLOSURE_POINT: + if (g[0] <= 0) { +#ifndef NDEBUG + std::cerr << "Closure points must have a positive divisor!" + << std::endl; +#endif + return false; + } + break; + } + + // All tests passed. + return true; +} diff --git a/src/Generator.defs.hh b/src/Generator.defs.hh new file mode 100644 index 0000000..5d57d19 --- /dev/null +++ b/src/Generator.defs.hh @@ -0,0 +1,723 @@ +/* Generator class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Generator_defs_hh +#define PPL_Generator_defs_hh 1 + +#include "Generator.types.hh" +#include "Scalar_Products.types.hh" +#include "Row.defs.hh" +#include "Variable.defs.hh" +#include "Constraint_System.types.hh" +#include "Generator_System.defs.hh" +#include "Congruence_System.types.hh" +#include "Linear_Expression.defs.hh" +#include "Polyhedron.types.hh" +#include "Grid_Generator.types.hh" +#include "Grid_Generator_System.types.hh" +#include "Checked_Number.defs.hh" +#include "distances.defs.hh" +#include + +namespace Parma_Polyhedra_Library { + +// Put them in the namespace here to declare them friend later. + +namespace IO_Operators { + +//! Output operator. +/*! \relates Parma_Polyhedra_Library::Generator */ +std::ostream& operator<<(std::ostream& s, const Generator& g); + +} // namespace IO_Operators + +} // namespace Parma_Polyhedra_Library + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Generator */ +void swap(Parma_Polyhedra_Library::Generator& x, + Parma_Polyhedra_Library::Generator& y); + +} // namespace std + + +//! A line, ray, point or closure point. +/*! \ingroup PPL_CXX_interface + An object of the class Generator is one of the following: + + - a line \f$\vect{l} = (a_0, \ldots, a_{n-1})^\transpose\f$; + + - a ray \f$\vect{r} = (a_0, \ldots, a_{n-1})^\transpose\f$; + + - a point + \f$\vect{p} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$; + + - a closure point + \f$\vect{c} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$; + + where \f$n\f$ is the dimension of the space + and, for points and closure points, \f$d > 0\f$ is the divisor. + + \par A note on terminology. + As observed in Section \ref representation, there are cases when, + in order to represent a polyhedron \f$\cP\f$ using the generator system + \f$\cG = (L, R, P, C)\f$, we need to include in the finite set + \f$P\f$ even points of \f$\cP\f$ that are not 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 (line, ray, point + or closure_point) 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 divisor 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 + x, y and z + 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 point 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 point (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 g1 is a point having coordinates + \f$(a_0, \ldots, a_{n-1})^\transpose\f$, + we construct the closure point g2 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 coefficient with the notion of coordinate: + these are equivalent only when the divisor of the (closure) point is 1. +*/ +class Parma_Polyhedra_Library::Generator : private Linear_Row { +public: + //! Returns the line of direction \p e. + /*! + \exception std::invalid_argument + Thrown if the homogeneous part of \p e represents the origin of + the vector space. + */ + static Generator line(const Linear_Expression& e); + + //! Returns the ray of direction \p e. + /*! + \exception std::invalid_argument + Thrown if the homogeneous part of \p e represents the origin of + the vector space. + */ + static Generator ray(const Linear_Expression& e); + + //! Returns the point at \p e / \p d. + /*! + Both \p e and \p d are optional arguments, with default values + Linear_Expression::zero() and Coefficient_one(), respectively. + + \exception std::invalid_argument + Thrown if \p d is zero. + */ + static Generator point(const Linear_Expression& e + = Linear_Expression::zero(), + Coefficient_traits::const_reference d + = Coefficient_one()); + + //! Returns the closure point at \p e / \p d. + /*! + Both \p e and \p d are optional arguments, with default values + Linear_Expression::zero() and Coefficient_one(), respectively. + + \exception std::invalid_argument + Thrown if \p d is zero. + */ + static Generator + closure_point(const Linear_Expression& e = Linear_Expression::zero(), + Coefficient_traits::const_reference d = Coefficient_one()); + + //! Ordinary copy-constructor. + Generator(const Generator& g); + + //! Destructor. + ~Generator(); + + //! Assignment operator. + Generator& operator=(const Generator& g); + + //! Returns the maximum space dimension a Generator can handle. + static dimension_type max_space_dimension(); + + //! Returns the dimension of the vector space enclosing \p *this. + dimension_type space_dimension() const; + + //! The generator type. + enum Type { + /*! The generator is a line. */ + LINE, + /*! The generator is a ray. */ + RAY, + /*! The generator is a point. */ + POINT, + /*! The generator is a closure point. */ + CLOSURE_POINT + }; + + //! Returns the generator type of \p *this. + Type type() const; + + //! Returns true if and only if \p *this is a line. + bool is_line() const; + + //! Returns true if and only if \p *this is a ray. + bool is_ray() const; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS + //! Returns true 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 true if and only if \p *this is a point. + bool is_point() const; + + //! Returns true 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 true if and only if \p *this and \p y + are equivalent generators. + + Generators having different space dimensions are not equivalent. + */ + bool is_equivalent_to(const Generator& y) const; + + PPL_OUTPUT_DECLARATIONS + + /*! \brief + Loads from \p s an ASCII representation (as produced by + ascii_dump(std::ostream&) const) and sets \p *this accordingly. + Returns true if successful, false otherwise. + */ + bool ascii_load(std::istream& s); + + //! Checks if all the invariants are satisfied. + bool OK() const; + + //! Swaps \p *this with \p y. + void swap(Generator& y); + +private: + /*! \brief + 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. + */ + Generator(Linear_Expression& e, Type type, Topology topology); + + /*! \brief + Throw a std::invalid_argument exception + containing the appropriate error message. + */ + void + throw_dimension_incompatible(const char* method, + const char* name_var, + Variable v) const; + + /*! \brief + Throw a std::invalid_argument exception + containing the appropriate error message. + */ + void + throw_invalid_argument(const char* method, const char* reason) const; + + friend class Parma_Polyhedra_Library::Scalar_Products; + friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign; + friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Assign; + friend class Parma_Polyhedra_Library::Generator_System; + friend class Parma_Polyhedra_Library::Generator_System::const_iterator; + // FIXME: the following friend declaration should be avoided. + friend class Parma_Polyhedra_Library::Polyhedron; + friend class Parma_Polyhedra_Library::Grid_Generator; + // This is for access to Row and Linear_Row in `insert'. + friend class Parma_Polyhedra_Library::Grid_Generator_System; + + friend + Parma_Polyhedra_Library + ::Linear_Expression::Linear_Expression(const Generator& g); + + friend std::ostream& + Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s, + const Generator& g); + + //! Copy-constructor with given space dimension. + Generator(const Generator& g, dimension_type dimension); + + //! Returns true if and only if \p *this is not a line. + bool is_ray_or_point() const; + + //! Sets the Linear_Row kind to LINE_OR_EQUALITY. + void set_is_line(); + + //! Sets the Linear_Row kind to RAY_OR_POINT_OR_INEQUALITY. + void set_is_ray_or_point(); + + /*! \brief + Returns true if and only if the closure point + \p *this has the same \e coordinates of the point \p p. + + It is \e assumed that \p *this is a closure point, \p p is a point + and both topologies and space dimensions agree. + */ + bool is_matching_closure_point(const Generator& p) const; + + //! Default constructor: private and not implemented. + Generator(); +}; + + +namespace Parma_Polyhedra_Library { + +//! Shorthand for Generator Generator::line(const Linear_Expression& e). +/*! \relates Generator */ +Generator line(const Linear_Expression& e); + +//! Shorthand for Generator Generator::ray(const Linear_Expression& e). +/*! \relates Generator */ +Generator ray(const Linear_Expression& e); + +/*! \brief + Shorthand for Generator + Generator::point(const Linear_Expression& e, Coefficient_traits::const_reference d). + + \relates Generator +*/ +Generator +point(const Linear_Expression& e = Linear_Expression::zero(), + Coefficient_traits::const_reference d = Coefficient_one()); + +/*! \brief + Shorthand for Generator + Generator::closure_point(const Linear_Expression& e, Coefficient_traits::const_reference d). + + \relates Generator +*/ +Generator +closure_point(const Linear_Expression& e = Linear_Expression::zero(), + Coefficient_traits::const_reference d = Coefficient_one()); + +//! Returns true if and only if \p x is equivalent to \p y. +/*! \relates Generator */ +bool operator==(const Generator& x, const Generator& y); + +//! Returns true 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. + + \note + Distances are \e only defined between generators that are points and/or + closure points; for rays or lines, \c false is returned. +*/ +template +bool rectilinear_distance_assign(Checked_Number& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. + + \note + Distances are \e only defined between generators that are points and/or + closure points; for rays or lines, \c false is returned. +*/ +template +bool rectilinear_distance_assign(Checked_Number& 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 true; + returns false 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 +bool rectilinear_distance_assign(Checked_Number& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. + + \note + Distances are \e only defined between generators that are points and/or + closure points; for rays or lines, \c false is returned. +*/ +template +bool euclidean_distance_assign(Checked_Number& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. + + \note + Distances are \e only defined between generators that are points and/or + closure points; for rays or lines, \c false is returned. +*/ +template +bool rectilinear_distance_assign(Checked_Number& 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 true; + returns false 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 +bool euclidean_distance_assign(Checked_Number& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. + + \note + Distances are \e only defined between generators that are points and/or + closure points; for rays or lines, \c false is returned. +*/ +template +bool l_infinity_distance_assign(Checked_Number& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. + + \note + Distances are \e only defined between generators that are points and/or + closure points; for rays or lines, \c false is returned. +*/ +template +bool l_infinity_distance_assign(Checked_Number& 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 true; + returns false 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 +bool l_infinity_distance_assign(Checked_Number& 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..ee54c54 --- /dev/null +++ b/src/Generator.inlines.hh @@ -0,0 +1,399 @@ +/* Generator class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Generator_inlines_hh +#define PPL_Generator_inlines_hh 1 + +namespace Parma_Polyhedra_Library { + +inline +Generator::Generator(Linear_Expression& e, Type type, Topology topology) { + assert(type != CLOSURE_POINT || topology == NOT_NECESSARILY_CLOSED); + Linear_Row::swap(e); + flags() = Flags(topology, (type == LINE + ? LINE_OR_EQUALITY + : RAY_OR_POINT_OR_INEQUALITY)); +} + +inline +Generator::Generator(const Generator& g) + : Linear_Row(g) { +} + +inline +Generator::Generator(const Generator& g, dimension_type dimension) + : Linear_Row(g, dimension, dimension) { +} + +inline +Generator::~Generator() { +} + +inline Generator& +Generator::operator=(const Generator& g) { + Linear_Row::operator=(g); + return *this; +} + +inline dimension_type +Generator::max_space_dimension() { + return Linear_Row::max_space_dimension(); +} + +inline dimension_type +Generator::space_dimension() const { + return Linear_Row::space_dimension(); +} + +inline bool +Generator::is_line() const { + return is_line_or_equality(); +} + +inline bool +Generator::is_ray_or_point() const { + return is_ray_or_point_or_inequality(); +} + +inline bool +Generator::is_line_or_ray() const { + return (*this)[0] == 0; +} + +inline bool +Generator::is_ray() const { + return is_ray_or_point() && is_line_or_ray(); +} + +inline Generator::Type +Generator::type() const { + if (is_line()) + return LINE; + if (is_line_or_ray()) + return RAY; + if (is_necessarily_closed()) + return POINT; + else { + // Checking the value of the epsilon coefficient. + const Generator& g = *this; + return (g[size() - 1] == 0) ? CLOSURE_POINT : POINT; + } +} + +inline bool +Generator::is_point() const { + return type() == POINT; +} + +inline bool +Generator::is_closure_point() const { + return type() == CLOSURE_POINT; +} + +inline void +Generator::set_is_line() { + set_is_line_or_equality(); +} + +inline void +Generator::set_is_ray_or_point() { + set_is_ray_or_point_or_inequality(); +} + +inline Coefficient_traits::const_reference +Generator::coefficient(const Variable v) const { + if (v.space_dimension() > space_dimension()) + throw_dimension_incompatible("coefficient(v)", "v", v); + return Linear_Row::coefficient(v.id()); +} + +inline Coefficient_traits::const_reference +Generator::divisor() const { + Coefficient_traits::const_reference d = Linear_Row::inhomogeneous_term(); + if (!is_ray_or_point() || d == 0) + throw_invalid_argument("divisor()", + "*this is neither a point nor a closure point"); + return d; +} + +inline memory_size_type +Generator::external_memory_in_bytes() const { + return Linear_Row::external_memory_in_bytes(); +} + +inline memory_size_type +Generator::total_memory_in_bytes() const { + return Linear_Row::total_memory_in_bytes(); +} + +inline const Generator& +Generator::zero_dim_point() { + assert(zero_dim_point_p != 0); + return *zero_dim_point_p; +} + +inline const Generator& +Generator::zero_dim_closure_point() { + assert(zero_dim_closure_point_p != 0); + return *zero_dim_closure_point_p; +} + +/*! \relates Generator */ +inline Generator +line(const Linear_Expression& e) { + return Generator::line(e); +} + +/*! \relates Generator */ +inline Generator +ray(const Linear_Expression& e) { + return Generator::ray(e); +} + +/*! \relates Generator */ +inline Generator +point(const Linear_Expression& e, Coefficient_traits::const_reference d) { + return Generator::point(e, d); +} + +/*! \relates Generator */ +inline Generator +closure_point(const Linear_Expression& e, + Coefficient_traits::const_reference d) { + return Generator::closure_point(e, d); +} + +/*! \relates Generator */ +inline bool +operator==(const Generator& x, const Generator& y) { + return x.is_equivalent_to(y); +} + +/*! \relates Generator */ +inline bool +operator!=(const Generator& x, const Generator& y) { + return !x.is_equivalent_to(y); +} + +inline void +Generator::ascii_dump(std::ostream& s) const { + Linear_Row::ascii_dump(s); +} + +inline bool +Generator::ascii_load(std::istream& s) { + return Linear_Row::ascii_load(s); +} + +inline void +Generator::swap(Generator& y) { + Linear_Row::swap(y); +} + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates Generator */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +inline bool +l_m_distance_assign(Checked_Number& 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_TEMP0(mpq_class, x_coord); + PPL_DIRTY_TEMP0(mpq_class, y_coord); + PPL_DIRTY_TEMP0(mpq_class, x_div); + PPL_DIRTY_TEMP0(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); + 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); + assert(sgn(tmp1) >= 0); + Specialization::combine(tmp0, tmp1, dir); + } + Specialization::finalize(tmp0, dir); + assign_r(r, tmp0, dir); + return true; +} + +/*! \relates Generator */ +template +inline bool +rectilinear_distance_assign(Checked_Number& r, + const Generator& x, + const Generator& y, + const Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2) { + return l_m_distance_assign > + (r, x, y, dir, tmp0, tmp1, tmp2); +} + +/*! \relates Generator */ +template +inline bool +rectilinear_distance_assign(Checked_Number& r, + const Generator& x, + const Generator& y, + const Rounding_Dir dir) { + typedef Checked_Number 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 +inline bool +rectilinear_distance_assign(Checked_Number& r, + const Generator& x, + const Generator& y, + const Rounding_Dir dir) { + return rectilinear_distance_assign(r, x, y, dir); +} + +/*! \relates Generator */ +template +inline bool +euclidean_distance_assign(Checked_Number& r, + const Generator& x, + const Generator& y, + const Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2) { + return l_m_distance_assign > + (r, x, y, dir, tmp0, tmp1, tmp2); +} + +/*! \relates Generator */ +template +inline bool +euclidean_distance_assign(Checked_Number& r, + const Generator& x, + const Generator& y, + const Rounding_Dir dir) { + typedef Checked_Number 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 +inline bool +euclidean_distance_assign(Checked_Number& r, + const Generator& x, + const Generator& y, + const Rounding_Dir dir) { + return euclidean_distance_assign(r, x, y, dir); +} + +/*! \relates Generator */ +template +inline bool +l_infinity_distance_assign(Checked_Number& r, + const Generator& x, + const Generator& y, + const Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2) { + return l_m_distance_assign > + (r, x, y, dir, tmp0, tmp1, tmp2); +} + +/*! \relates Generator */ +template +inline bool +l_infinity_distance_assign(Checked_Number& r, + const Generator& x, + const Generator& y, + const Rounding_Dir dir) { + typedef Checked_Number 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 +inline bool +l_infinity_distance_assign(Checked_Number& r, + const Generator& x, + const Generator& y, + const Rounding_Dir dir) { + return l_infinity_distance_assign(r, x, y, dir); +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Generator */ +inline void +swap(Parma_Polyhedra_Library::Generator& x, + Parma_Polyhedra_Library::Generator& y) { + x.swap(y); +} + +} // namespace std + +#endif // !defined(PPL_Generator_inlines_hh) diff --git a/src/Generator.types.hh b/src/Generator.types.hh new file mode 100644 index 0000000..37dcf09 --- /dev/null +++ b/src/Generator.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PPL_Generator_types_hh +#define PPL_Generator_types_hh 1 + +namespace Parma_Polyhedra_Library { + +class Generator; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Generator_types_hh) diff --git a/src/Generator_System.cc b/src/Generator_System.cc new file mode 100644 index 0000000..4793f5d --- /dev/null +++ b/src/Generator_System.cc @@ -0,0 +1,1053 @@ +/* Generator_System class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Generator_System.defs.hh" +#include "Generator_System.inlines.hh" +#include "Constraint.defs.hh" +#include "Scalar_Products.defs.hh" +#include +#include +#include +#include +#include + +namespace PPL = Parma_Polyhedra_Library; + +bool +PPL::Generator_System:: +adjust_topology_and_space_dimension(const Topology new_topology, + const dimension_type new_space_dim) { + assert(space_dimension() <= new_space_dim); + + const dimension_type old_space_dim = space_dimension(); + const Topology old_topology = topology(); + dimension_type cols_to_be_added = new_space_dim - old_space_dim; + + // Dealing with empty generator systems first. + if (has_no_rows()) { + if (num_columns() == 0) + if (new_topology == NECESSARILY_CLOSED) { + add_zero_columns(cols_to_be_added + 1); + set_necessarily_closed(); + } + else { + add_zero_columns(cols_to_be_added + 2); + set_not_necessarily_closed(); + } + else + // Here `num_columns() > 0'. + if (old_topology != new_topology) + if (new_topology == NECESSARILY_CLOSED) { + switch (cols_to_be_added) { + case 0: + remove_trailing_columns(1); + break; + case 1: + // Nothing to do. + break; + default: + add_zero_columns(cols_to_be_added - 1); + } + set_necessarily_closed(); + } + else { + // Here old_topology == NECESSARILY_CLOSED + // and new_topology == NOT_NECESSARILY_CLOSED. + add_zero_columns(cols_to_be_added + 1); + set_not_necessarily_closed(); + } + else + // Here topologies agree. + if (cols_to_be_added > 0) + add_zero_columns(cols_to_be_added); + assert(OK()); + return true; + } + + // Here the generator systen is not empty. + if (cols_to_be_added > 0) + if (old_topology != new_topology) + if (new_topology == NECESSARILY_CLOSED) { + // A NOT_NECESSARILY_CLOSED generator system + // can be converted to a NECESSARILY_CLOSED one + // only if it does not contain closure points. + // This check has to be performed under the user viewpoint. + if (has_closure_points()) + return false; + // For a correct implementation, we have to remove those + // closure points that were matching a point (i.e., those + // that are in the generator system, but are invisible to + // the user). + Generator_System& gs = *this; + dimension_type num_closure_points = 0; + dimension_type gs_end = gs.num_rows(); + for (dimension_type i = 0; i < gs_end; ) { + // All the closure points seen so far have consecutive + // indices starting from `i'. + if (num_closure_points > 0) + // Let next generator have index `i'. + std::swap(gs[i], gs[i+num_closure_points]); + if (gs[i].is_closure_point()) { + ++num_closure_points; + --gs_end; + } + else + ++i; + } + // We may have identified some closure points. + if (num_closure_points > 0) { + assert(num_closure_points == num_rows() - gs_end); + erase_to_end(gs_end); + } + // Remove the epsilon column, re-normalize and, after that, + // add the missing dimensions. This ensures that + // non-zero epsilon coefficients will be cleared. + remove_trailing_columns(1); + set_necessarily_closed(); + normalize(); + add_zero_columns(cols_to_be_added); + } + else { + // A NECESSARILY_CLOSED generator system is converted to + // a NOT_NECESSARILY_CLOSED one by adding a further column + // and setting the epsilon coordinate of all points to 1. + // Note: normalization is preserved. + add_zero_columns(cols_to_be_added + 1); + Generator_System& gs = *this; + const dimension_type eps_index = new_space_dim + 1; + for (dimension_type i = num_rows(); i-- > 0; ) + gs[i][eps_index] = gs[i][0]; + set_not_necessarily_closed(); + } + else { + // Topologies agree: first add the required zero columns ... + add_zero_columns(cols_to_be_added); + // ... and, if needed, move the epsilon coefficients + // to the new last column. + if (old_topology == NOT_NECESSARILY_CLOSED) + swap_columns(old_space_dim + 1, new_space_dim + 1); + } + else + // Here `cols_to_be_added == 0'. + if (old_topology != new_topology) { + if (new_topology == NECESSARILY_CLOSED) { + // A NOT_NECESSARILY_CLOSED generator system + // can be converted in to a NECESSARILY_CLOSED one + // only if it does not contain closure points. + if (has_closure_points()) + return false; + // We just remove the column of the epsilon coefficients. + remove_trailing_columns(1); + set_necessarily_closed(); + } + else { + // Add the column of the epsilon coefficients + // and set the epsilon coordinate of all points to 1. + // Note: normalization is preserved. + add_zero_columns(1); + Generator_System& gs = *this; + const dimension_type eps_index = new_space_dim + 1; + for (dimension_type i = num_rows(); i-- > 0; ) + gs[i][eps_index] = gs[i][0]; + set_not_necessarily_closed(); + } + } + // We successfully adjusted dimensions and topology. + assert(OK()); + return true; +} + +// TODO: would be worth to avoid adding closure points +// that already are in the system of generators? +// To do this efficiently we could sort the system and +// perform insertions keeping its sortedness. +void +PPL::Generator_System::add_corresponding_closure_points() { + assert(!is_necessarily_closed()); + // NOTE: we always add (pending) rows at the end of the generator system. + // Updating `index_first_pending', if needed, is done by the caller. + Generator_System& gs = *this; + const dimension_type n_rows = gs.num_rows(); + const dimension_type eps_index = gs.num_columns() - 1; + for (dimension_type i = n_rows; i-- > 0; ) { + const Generator& g = gs[i]; + if (g[eps_index] > 0) { + // `g' is a point: adding the closure point. + Generator cp = g; + cp[eps_index] = 0; + // Enforcing normalization. + cp.normalize(); + gs.add_pending_row(cp); + } + } + assert(OK()); +} + + +// TODO: would be worth to avoid adding points +// that already are in the system of generators? +// To do this efficiently we could sort the system and +// perform insertions keeping its sortedness. +void +PPL::Generator_System::add_corresponding_points() { + assert(!is_necessarily_closed()); + // NOTE: we always add (pending) rows at the end of the generator system. + // Updating `index_first_pending', if needed, is done by the caller. + Generator_System& gs = *this; + const dimension_type n_rows = gs.num_rows(); + const dimension_type eps_index = gs.num_columns() - 1; + for (dimension_type i = 0; i < n_rows; i++) { + const Generator& g = gs[i]; + if (!g.is_line_or_ray() && g[eps_index] == 0) { + // `g' is a closure point: adding the point. + // Note: normalization is preserved. + Generator p = g; + p[eps_index] = p[0]; + gs.add_pending_row(p); + } + } + assert(OK()); +} + +bool +PPL::Generator_System::has_closure_points() const { + if (is_necessarily_closed()) + return false; + // Adopt the point of view of the user. + for (Generator_System::const_iterator i = begin(), + this_end = end(); i != this_end; ++i) + if (i->is_closure_point()) + return true; + return false; +} + +bool +PPL::Generator_System::has_points() const { + const Generator_System& gs = *this; + // Avoiding the repeated tests on topology. + if (is_necessarily_closed()) + for (dimension_type i = num_rows(); i-- > 0; ) { + if (!gs[i].is_line_or_ray()) + return true; + } + else { + // !is_necessarily_closed() + const dimension_type eps_index = gs.num_columns() - 1; + for (dimension_type i = num_rows(); i-- > 0; ) + if (gs[i][eps_index] != 0) + return true; + } + return false; +} + +void +PPL::Generator_System::const_iterator::skip_forward() { + const Linear_System::const_iterator gsp_end = gsp->end(); + if (i != gsp_end) { + Linear_System::const_iterator i_next = i; + ++i_next; + if (i_next != gsp_end) { + const Generator& cp = static_cast(*i); + const Generator& p = static_cast(*i_next); + if (cp.is_closure_point() + && p.is_point() + && cp.is_matching_closure_point(p)) + i = i_next; + } + } +} + +void +PPL::Generator_System::insert(const Generator& g) { + // We are sure that the matrix has no pending rows + // and that the new row is not a pending generator. + assert(num_pending_rows() == 0); + if (topology() == g.topology()) + Linear_System::insert(g); + else + // `*this' and `g' have different topologies. + if (is_necessarily_closed()) { + // Padding the matrix with the column + // corresponding to the epsilon coefficients: + // all points must have epsilon coordinate equal to 1 + // (i.e., the epsilon coefficient is equal to the divisor); + // rays and lines must have epsilon coefficient equal to 0. + // Note: normalization is preserved. + const dimension_type eps_index = num_columns(); + add_zero_columns(1); + Generator_System& gs = *this; + for (dimension_type i = num_rows(); i-- > 0; ) { + Generator& gen = gs[i]; + if (!gen.is_line_or_ray()) + gen[eps_index] = gen[0]; + } + set_not_necessarily_closed(); + // Inserting the new generator. + Linear_System::insert(g); + } + else { + // The generator system is NOT necessarily closed: + // copy the generator, adding the missing dimensions + // and the epsilon coefficient. + const dimension_type new_size = 2 + std::max(g.space_dimension(), + space_dimension()); + Generator tmp_g(g, new_size); + // If it was a point, set the epsilon coordinate to 1 + // (i.e., set the coefficient equal to the divisor). + // Note: normalization is preserved. + if (!tmp_g.is_line_or_ray()) + tmp_g[new_size - 1] = tmp_g[0]; + tmp_g.set_not_necessarily_closed(); + // Inserting the new generator. + Linear_System::insert(tmp_g); + } + assert(OK()); +} + +void +PPL::Generator_System::insert_pending(const Generator& g) { + if (topology() == g.topology()) + Linear_System::insert_pending(g); + else + // `*this' and `g' have different topologies. + if (is_necessarily_closed()) { + // Padding the matrix with the column + // corresponding to the epsilon coefficients: + // all points must have epsilon coordinate equal to 1 + // (i.e., the epsilon coefficient is equal to the divisor); + // rays and lines must have epsilon coefficient equal to 0. + // Note: normalization is preserved. + const dimension_type eps_index = num_columns(); + add_zero_columns(1); + Generator_System& gs = *this; + for (dimension_type i = num_rows(); i-- > 0; ) { + Generator& gen = gs[i]; + if (!gen.is_line_or_ray()) + gen[eps_index] = gen[0]; + } + set_not_necessarily_closed(); + // Inserting the new generator. + Linear_System::insert_pending(g); + } + else { + // The generator system is NOT necessarily closed: + // copy the generator, adding the missing dimensions + // and the epsilon coefficient. + const dimension_type new_size = 2 + std::max(g.space_dimension(), + space_dimension()); + Generator tmp_g(g, new_size); + // If it was a point, set the epsilon coordinate to 1 + // (i.e., set the coefficient equal to the divisor). + // Note: normalization is preserved. + if (!tmp_g.is_line_or_ray()) + tmp_g[new_size - 1] = tmp_g[0]; + tmp_g.set_not_necessarily_closed(); + // Inserting the new generator. + Linear_System::insert_pending(tmp_g); + } + assert(OK()); +} + +PPL::dimension_type +PPL::Generator_System::num_lines() const { + // We are sure that this method is applied only to a matrix + // that does not contain pending rows. + assert(num_pending_rows() == 0); + const Generator_System& gs = *this; + dimension_type n = 0; + // If the Linear_System happens to be sorted, take advantage of the fact + // that lines are at the top of the system. + if (is_sorted()) { + dimension_type nrows = num_rows(); + for (dimension_type i = 0; i < nrows && gs[i].is_line(); ++i) + ++n; + } + else + for (dimension_type i = num_rows(); i-- > 0 ; ) + if (gs[i].is_line()) + ++n; + return n; +} + +PPL::dimension_type +PPL::Generator_System::num_rays() const { + // We are sure that this method is applied only to a matrix + // that does not contain pending rows. + assert(num_pending_rows() == 0); + const Generator_System& gs = *this; + dimension_type n = 0; + // If the Linear_System happens to be sorted, take advantage of the fact + // that rays and points are at the bottom of the system and + // rays have the inhomogeneous term equal to zero. + if (is_sorted()) { + for (dimension_type i = num_rows(); i != 0 && gs[--i].is_ray_or_point(); ) + if (gs[i].is_line_or_ray()) + ++n; + } + else + for (dimension_type i = num_rows(); i-- > 0 ; ) + if (gs[i].is_ray()) + ++n; + return n; +} + +PPL::Poly_Con_Relation +PPL::Generator_System::relation_with(const Constraint& c) const { + // Note: this method is not public and it is the responsibility + // of the caller to actually test for dimension compatibility. + // We simply assert it. + assert(space_dimension() >= c.space_dimension()); + // Number of generators: the case of an empty polyhedron + // has already been filtered out by the caller. + const dimension_type n_rows = num_rows(); + assert(n_rows > 0); + const Generator_System& gs = *this; + + // `result' will keep the relation holding between the generators + // we have seen so far and the constraint `c'. + Poly_Con_Relation result = Poly_Con_Relation::saturates(); + + switch (c.type()) { + + case Constraint::EQUALITY: + { + // The hyperplane defined by the equality `c' is included + // in the set of points satisfying `c' (it is the same set!). + result = result && Poly_Con_Relation::is_included(); + // The following integer variable will hold the scalar product sign + // of either the first point or the first non-saturating ray we find. + // If it is equal to 2, then it means that we haven't found such + // a generator yet. + int first_point_or_nonsaturating_ray_sign = 2; + + for (dimension_type i = n_rows; i-- > 0; ) { + const Generator& g = gs[i]; + const int sp_sign = Scalar_Products::sign(c, g); + // Checking whether the generator saturates the equality. + // If that is the case, then we have to do something only if + // the generator is a point. + if (sp_sign == 0) { + if (g.is_point()) { + if (first_point_or_nonsaturating_ray_sign == 2) + // It is the first time that we find a point and + // we have not found a non-saturating ray yet. + first_point_or_nonsaturating_ray_sign = 0; + else + // We already found a point or a non-saturating ray. + if (first_point_or_nonsaturating_ray_sign != 0) + return Poly_Con_Relation::strictly_intersects(); + } + } + else + // Here we know that sp_sign != 0. + switch (g.type()) { + + case Generator::LINE: + // If a line does not saturate `c', then there is a strict + // intersection between the points satisfying `c' + // and the points generated by `gs'. + return Poly_Con_Relation::strictly_intersects(); + + case Generator::RAY: + if (first_point_or_nonsaturating_ray_sign == 2) { + // It is the first time that we have a non-saturating ray + // and we have not found any point yet. + first_point_or_nonsaturating_ray_sign = sp_sign; + result = Poly_Con_Relation::is_disjoint(); + } + else + // We already found a point or a non-saturating ray. + if (sp_sign != first_point_or_nonsaturating_ray_sign) + return Poly_Con_Relation::strictly_intersects(); + break; + + case Generator::POINT: + case Generator::CLOSURE_POINT: + // NOTE: a non-saturating closure point is treated as + // a normal point. + if (first_point_or_nonsaturating_ray_sign == 2) { + // It is the first time that we find a point and + // we have not found a non-saturating ray yet. + first_point_or_nonsaturating_ray_sign = sp_sign; + result = Poly_Con_Relation::is_disjoint(); + } + else + // We already found a point or a non-saturating ray. + if (sp_sign != first_point_or_nonsaturating_ray_sign) + return Poly_Con_Relation::strictly_intersects(); + break; + } + } + } + break; + + case Constraint::NONSTRICT_INEQUALITY: + { + // The hyperplane implicitly defined by the non-strict inequality `c' + // is included in the set of points satisfying `c'. + result = result && Poly_Con_Relation::is_included(); + // The following Boolean variable will be set to `false' + // as soon as either we find (any) point or we find a + // non-saturating ray. + bool first_point_or_nonsaturating_ray = true; + + for (dimension_type i = n_rows; i-- > 0; ) { + const Generator& g = gs[i]; + const int sp_sign = Scalar_Products::sign(c, g); + // Checking whether the generator saturates the non-strict + // inequality. If that is the case, then we have to do something + // only if the generator is a point. + if (sp_sign == 0) { + if (g.is_point()) { + if (first_point_or_nonsaturating_ray) + // It is the first time that we have a point and + // we have not found a non-saturating ray yet. + first_point_or_nonsaturating_ray = false; + else + // We already found a point or a non-saturating ray before. + if (result == Poly_Con_Relation::is_disjoint()) + // Since g saturates c, we have a strict intersection if + // none of the generators seen so far are included in `c'. + return Poly_Con_Relation::strictly_intersects(); + } + } + else + // Here we know that sp_sign != 0. + switch (g.type()) { + + case Generator::LINE: + // If a line does not saturate `c', then there is a strict + // intersection between the points satisfying `c' and + // the points generated by `gs'. + return Poly_Con_Relation::strictly_intersects(); + + case Generator::RAY: + if (first_point_or_nonsaturating_ray) { + // It is the first time that we have a non-saturating ray + // and we have not found any point yet. + first_point_or_nonsaturating_ray = false; + result = (sp_sign > 0) + ? Poly_Con_Relation::is_included() + : Poly_Con_Relation::is_disjoint(); + } + else { + // We already found a point or a non-saturating ray. + if ((sp_sign > 0 + && result == Poly_Con_Relation::is_disjoint()) + || (sp_sign < 0 + && result.implies(Poly_Con_Relation::is_included()))) + // We have a strict intersection if either: + // - `g' satisfies `c' but none of the generators seen + // so far are included in `c'; or + // - `g' does not satisfy `c' and all the generators + // seen so far are included in `c'. + return Poly_Con_Relation::strictly_intersects(); + if (sp_sign > 0) + // Here all the generators seen so far either saturate + // or are included in `c'. + // Since `g' does not saturate `c' ... + result = Poly_Con_Relation::is_included(); + } + break; + + case Generator::POINT: + case Generator::CLOSURE_POINT: + // NOTE: a non-saturating closure point is treated as + // a normal point. + if (first_point_or_nonsaturating_ray) { + // It is the first time that we have a point and + // we have not found a non-saturating ray yet. + // - If point `g' saturates `c', then all the generators + // seen so far saturate `c'. + // - If point `g' is included (but does not saturate) `c', + // then all the generators seen so far are included in `c'. + // - If point `g' does not satisfy `c', then all the + // generators seen so far are disjoint from `c'. + first_point_or_nonsaturating_ray = false; + if (sp_sign > 0) + result = Poly_Con_Relation::is_included(); + else if (sp_sign < 0) + result = Poly_Con_Relation::is_disjoint(); + } + else { + // We already found a point or a non-saturating ray before. + if ((sp_sign > 0 + && result == Poly_Con_Relation::is_disjoint()) + || (sp_sign < 0 + && result.implies(Poly_Con_Relation::is_included()))) + // We have a strict intersection if either: + // - `g' satisfies or saturates `c' but none of the + // generators seen so far are included in `c'; or + // - `g' does not satisfy `c' and all the generators + // seen so far are included in `c'. + return Poly_Con_Relation::strictly_intersects(); + if (sp_sign > 0) + // Here all the generators seen so far either saturate + // or are included in `c'. + // Since `g' does not saturate `c' ... + result = Poly_Con_Relation::is_included(); + } + break; + } + } + } + break; + + case Constraint::STRICT_INEQUALITY: + { + // The hyperplane implicitly defined by the strict inequality `c' + // is disjoint from the set of points satisfying `c'. + result = result && Poly_Con_Relation::is_disjoint(); + // The following Boolean variable will be set to `false' + // as soon as either we find (any) point or we find a + // non-saturating ray. + bool first_point_or_nonsaturating_ray = true; + for (dimension_type i = n_rows; i-- > 0; ) { + const Generator& g = gs[i]; + // Using the reduced scalar product operator to avoid + // both topology and num_columns mismatches. + const int sp_sign = Scalar_Products::reduced_sign(c, g); + // Checking whether the generator saturates the strict inequality. + // If that is the case, then we have to do something + // only if the generator is a point. + if (sp_sign == 0) { + if (g.is_point()) { + if (first_point_or_nonsaturating_ray) + // It is the first time that we have a point and + // we have not found a non-saturating ray yet. + first_point_or_nonsaturating_ray = false; + else + // We already found a point or a non-saturating ray before. + if (result == Poly_Con_Relation::is_included()) + return Poly_Con_Relation::strictly_intersects(); + } + } + else + // Here we know that sp_sign != 0. + switch (g.type()) { + + case Generator::LINE: + // If a line does not saturate `c', then there is a strict + // intersection between the points satisfying `c' and the points + // generated by `gs'. + return Poly_Con_Relation::strictly_intersects(); + + case Generator::RAY: + if (first_point_or_nonsaturating_ray) { + // It is the first time that we have a non-saturating ray + // and we have not found any point yet. + first_point_or_nonsaturating_ray = false; + result = (sp_sign > 0) + ? Poly_Con_Relation::is_included() + : Poly_Con_Relation::is_disjoint(); + } + else { + // We already found a point or a non-saturating ray before. + if ((sp_sign > 0 + && result.implies(Poly_Con_Relation::is_disjoint())) + || + (sp_sign <= 0 + && result == Poly_Con_Relation::is_included())) + return Poly_Con_Relation::strictly_intersects(); + if (sp_sign < 0) + // Here all the generators seen so far either saturate + // or are disjoint from `c'. + // Since `g' does not saturate `c' ... + result = Poly_Con_Relation::is_disjoint(); + } + break; + + case Generator::POINT: + case Generator::CLOSURE_POINT: + if (first_point_or_nonsaturating_ray) { + // It is the first time that we have a point and + // we have not found a non-saturating ray yet. + // - If point `g' saturates `c', then all the generators + // seen so far saturate `c'. + // - If point `g' is included in (but does not saturate) `c', + // then all the generators seen so far are included in `c'. + // - If point `g' strictly violates `c', then all the + // generators seen so far are disjoint from `c'. + first_point_or_nonsaturating_ray = false; + if (sp_sign > 0) + result = Poly_Con_Relation::is_included(); + else if (sp_sign < 0) + result = Poly_Con_Relation::is_disjoint(); + } + else { + // We already found a point or a non-saturating ray before. + if ((sp_sign > 0 + && result.implies(Poly_Con_Relation::is_disjoint())) + || + (sp_sign <= 0 + && result == Poly_Con_Relation::is_included())) + return Poly_Con_Relation::strictly_intersects(); + if (sp_sign < 0) + // Here all the generators seen so far either saturate + // or are disjoint from `c'. + // Since `g' does not saturate `c' ... + result = Poly_Con_Relation::is_disjoint(); + } + break; + } + } + } + break; + } + // We have seen all generators. + return result; +} + + +bool +PPL::Generator_System::satisfied_by_all_generators(const Constraint& c) const { + assert(c.space_dimension() <= space_dimension()); + + // Setting `sps' to the appropriate scalar product sign operator. + // This also avoids problems when having _legal_ topology mismatches + // (which could also cause a mismatch in the number of columns). + Topology_Adjusted_Scalar_Product_Sign sps(c); + + const Generator_System& gs = *this; + switch (c.type()) { + case Constraint::EQUALITY: + // Equalities must be saturated by all generators. + for (dimension_type i = gs.num_rows(); i-- > 0; ) + if (sps(c, gs[i]) != 0) + return false; + break; + case Constraint::NONSTRICT_INEQUALITY: + // Non-strict inequalities must be saturated by lines and + // satisfied by all the other generators. + for (dimension_type i = gs.num_rows(); i-- > 0; ) { + const Generator& g = gs[i]; + const int sp_sign = sps(c, g); + if (g.is_line()) { + if (sp_sign != 0) + return false; + } + else + // `g' is a ray, point or closure point. + if (sp_sign < 0) + return false; + } + break; + case Constraint::STRICT_INEQUALITY: + // Strict inequalities must be saturated by lines, + // satisfied by all generators, and must not be saturated by points. + for (dimension_type i = gs.num_rows(); i-- > 0; ) { + const Generator& g = gs[i]; + const int sp_sign = sps(c, g); + switch (g.type()) { + case Generator::POINT: + if (sp_sign <= 0) + return false; + break; + case Generator::LINE: + if (sp_sign != 0) + return false; + break; + default: + // `g' is a ray or closure point. + if (sp_sign < 0) + return false; + break; + } + } + break; + } + // If we reach this point, `c' is satisfied by all generators. + return true; +} + + +void +PPL::Generator_System +::affine_image(dimension_type v, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator) { + Generator_System& x = *this; + // `v' is the index of a column corresponding to + // a "user" variable (i.e., it cannot be the inhomogeneous term, + // nor the epsilon dimension of NNC polyhedra). + assert(v > 0 && v <= x.space_dimension()); + assert(expr.space_dimension() <= x.space_dimension()); + assert(denominator > 0); + + const dimension_type n_columns = x.num_columns(); + const dimension_type n_rows = x.num_rows(); + + // Compute the numerator of the affine transformation and assign it + // to the column of `*this' indexed by `v'. + PPL_DIRTY_TEMP_COEFFICIENT(numerator); + for (dimension_type i = n_rows; i-- > 0; ) { + Generator& row = x[i]; + Scalar_Products::assign(numerator, expr, row); + std::swap(numerator, row[v]); + } + + if (denominator != 1) { + // Since we want integer elements in the matrix, + // we multiply by `denominator' all the columns of `*this' + // having an index different from `v'. + for (dimension_type i = n_rows; i-- > 0; ) { + Generator& row = x[i]; + for (dimension_type j = n_columns; j-- > 0; ) + if (j != v) + row[j] *= denominator; + } + } + + // If the mapping is not invertible we may have transformed + // valid lines and rays into the origin of the space. + const bool not_invertible = (v > expr.space_dimension() || expr[v] == 0); + if (not_invertible) + x.remove_invalid_lines_and_rays(); + + // Strong normalization also resets the sortedness flag. + x.strong_normalize(); +} + +void +PPL::Generator_System::ascii_dump(std::ostream& s) const { + const Generator_System& x = *this; + const dimension_type x_num_rows = x.num_rows(); + const dimension_type x_num_columns = x.num_columns(); + s << "topology " << (is_necessarily_closed() + ? "NECESSARILY_CLOSED" + : "NOT_NECESSARILY_CLOSED") + << "\n" + << x_num_rows << " x " << x_num_columns << ' ' + << (x.is_sorted() ? "(sorted)" : "(not_sorted)") + << "\n" + << "index_first_pending " << x.first_pending_row() + << "\n"; + for (dimension_type i = 0; i < x_num_rows; ++i) { + const Generator& g = x[i]; + for (dimension_type j = 0; j < x_num_columns; ++j) + s << g[j] << ' '; + switch (g.type()) { + case Generator::LINE: + s << "L"; + break; + case Generator::RAY: + s << "R"; + break; + case Generator::POINT: + s << "P"; + break; + case Generator::CLOSURE_POINT: + s << "C"; + break; + } + s << "\n"; + } +} + +PPL_OUTPUT_DEFINITIONS(Generator_System) + +bool +PPL::Generator_System::ascii_load(std::istream& s) { + std::string str; + if (!(s >> str) || str != "topology") + return false; + if (!(s >> str)) + return false; + if (str == "NECESSARILY_CLOSED") + set_necessarily_closed(); + else { + if (str != "NOT_NECESSARILY_CLOSED") + return false; + set_not_necessarily_closed(); + } + + dimension_type nrows; + dimension_type ncols; + if (!(s >> nrows)) + return false; + if (!(s >> str) || str != "x") + return false; + if (!(s >> ncols)) + return false; + resize_no_copy(nrows, ncols); + + if (!(s >> str) || (str != "(sorted)" && str != "(not_sorted)")) + return false; + set_sorted(str == "(sorted)"); + dimension_type index; + if (!(s >> str) || str != "index_first_pending") + return false; + if (!(s >> index)) + return false; + set_index_first_pending_row(index); + + Generator_System& x = *this; + for (dimension_type i = 0; i < x.num_rows(); ++i) { + for (dimension_type j = 0; j < x.num_columns(); ++j) + if (!(s >> x[i][j])) + return false; + + if (!(s >> str)) + return false; + if (str == "L") + x[i].set_is_line(); + else if (str == "R" || str == "P" || str == "C") + x[i].set_is_ray_or_point(); + else + return false; + + // Checking for equality of actual and declared types. + switch (x[i].type()) { + case Generator::LINE: + if (str == "L") + continue; + break; + case Generator::RAY: + if (str == "R") + continue; + break; + case Generator::POINT: + if (str == "P") + continue; + break; + case Generator::CLOSURE_POINT: + if (str == "C") + continue; + break; + } + // Reaching this point means that the input was illegal. + return false; + } + + // Check invariants. + assert(OK()); + return true; +} + +void +PPL::Generator_System::remove_invalid_lines_and_rays() { + // The origin of the vector space cannot be a valid line/ray. + // NOTE: the following swaps will mix generators without even trying + // to preserve sortedness: as a matter of fact, it will almost always + // be the case that the input generator system is NOT sorted. + Generator_System& gs = *this; + dimension_type n_rows = gs.num_rows(); + if (num_pending_rows() == 0) { + for (dimension_type i = n_rows; i-- > 0; ) { + Generator& g = gs[i]; + if (g.is_line_or_ray() && g.all_homogeneous_terms_are_zero()) { + // An invalid line/ray has been found. + --n_rows; + std::swap(g, gs[n_rows]); + gs.set_sorted(false); + } + } + set_index_first_pending_row(n_rows); + } + else { + // If the matrix has some pending rows, we can not + // swap the "normal" rows with the pending rows. So + // we must put at the end of the "normal" rows + // the invalid "normal" rows, put them at the end + // of the matrix, find the invalid rows in the pending + // part and then erase the invalid rows that now + // are in the bottom part of the matrix. + assert(num_pending_rows() > 0); + dimension_type first_pending = first_pending_row(); + for (dimension_type i = first_pending; i-- > 0; ) { + Generator& g = gs[i]; + if (g.is_line_or_ray() && g.all_homogeneous_terms_are_zero()) { + // An invalid line/ray has been found. + --first_pending; + std::swap(g, gs[first_pending]); + gs.set_sorted(false); + } + } + const dimension_type num_invalid_rows + = first_pending_row() - first_pending; + set_index_first_pending_row(first_pending); + for (dimension_type i = 0; i < num_invalid_rows; ++i) + std::swap(gs[n_rows - i], gs[first_pending + i]); + n_rows -= num_invalid_rows; + for (dimension_type i = n_rows; i-- > first_pending; ) { + Generator& g = gs[i]; + if (g.is_line_or_ray() && g.all_homogeneous_terms_are_zero()) { + // An invalid line/ray has been found. + --n_rows; + std::swap(g, gs[n_rows]); + gs.set_sorted(false); + } + } + } + gs.erase_to_end(n_rows); +} + +const PPL::Generator_System* PPL::Generator_System::zero_dim_univ_p = 0; + +void +PPL::Generator_System::initialize() { + assert(zero_dim_univ_p == 0); + zero_dim_univ_p + = new Generator_System(Generator::zero_dim_point()); +} + +void +PPL::Generator_System::finalize() { + assert(zero_dim_univ_p != 0); + delete zero_dim_univ_p; + zero_dim_univ_p = 0; +} + +bool +PPL::Generator_System::OK() const { + // A Generator_System must be a valid Linear_System; do not check for + // strong normalization, since this will be done when + // checking each individual generator. + if (!Linear_System::OK(false)) + return false; + + // Checking each generator in the system. + const Generator_System& x = *this; + for (dimension_type i = num_rows(); i-- > 0; ) + if (!x[i].OK()) + return false; + + // All checks passed. + return true; +} + +/*! \relates Parma_Polyhedra_Library::Generator_System */ +std::ostream& +PPL::IO_Operators::operator<<(std::ostream& s, const Generator_System& gs) { + Generator_System::const_iterator i = gs.begin(); + const Generator_System::const_iterator gs_end = gs.end(); + if (i == gs_end) + return s << "false"; + while (true) { + s << *i++; + if (i == gs_end) + return s; + s << ", "; + } +} diff --git a/src/Generator_System.defs.hh b/src/Generator_System.defs.hh new file mode 100644 index 0000000..f9e7903 --- /dev/null +++ b/src/Generator_System.defs.hh @@ -0,0 +1,516 @@ +/* Generator_System class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Generator_System_defs_hh +#define PPL_Generator_System_defs_hh 1 + +#include "Generator_System.types.hh" +#include "Grid_Generator_System.types.hh" +#include "Linear_Expression.types.hh" +#include "Linear_System.defs.hh" +#include "Generator.types.hh" +#include "Constraint.types.hh" +#include "Polyhedron.types.hh" +#include "Poly_Con_Relation.defs.hh" +#include "Grid.types.hh" +#include + +namespace Parma_Polyhedra_Library { + +namespace IO_Operators { + +//! Output operator. +/*! + \relates Parma_Polyhedra_Library::Generator_System + Writes false if \p gs is empty. Otherwise, writes on + \p s the generators of \p gs, all in one row and separated by ", ". +*/ +std::ostream& operator<<(std::ostream& s, const Generator_System& gs); + +} // namespace IO_Operators + +// Put it in the namespace here to declare it friend later. +/*! \relates Polyhedron */ +bool operator==(const Polyhedron& x, const Polyhedron& y); + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Generator_System */ +void swap(Parma_Polyhedra_Library::Generator_System& x, + Parma_Polyhedra_Library::Generator_System& y); + +} // namespace std + +//! A system of generators. +/*! \ingroup PPL_CXX_interface + An object of the class Generator_System is a system of generators, + i.e., a multiset of objects of the class Generator + (lines, rays, points and closure points). + When inserting generators in a system, space dimensions are automatically + adjusted so that all the generators in the system are defined + on the same vector space. + A system of generators which is meant to define a non-empty + polyhedron must include at least one point: the reason is that + lines, rays and closure points need a supporting point + (lines and rays only specify directions while closure points only + specify points in the topological closure of the NNC polyhedron). + + \par + In all the examples it is assumed that variables + x and y 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 exact copy of them + can be retrieved: + in general, only an equivalent 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 : protected Linear_System { +public: + //! Default constructor: builds an empty system of generators. + Generator_System(); + + //! Builds the singleton system containing only generator \p g. + explicit Generator_System(const Generator& g); + + //! Ordinary copy-constructor. + Generator_System(const Generator_System& gs); + + //! Destructor. + ~Generator_System(); + + //! Assignment operator. + Generator_System& operator=(const Generator_System& y); + + //! Returns the maximum space dimension a Generator_System can handle. + static dimension_type max_space_dimension(); + + //! Returns the dimension of the vector space enclosing \p *this. + dimension_type space_dimension() const; + + /*! \brief + Removes all the generators from the generator system + and sets its space dimension to 0. + */ + void clear(); + + /*! \brief + Inserts in \p *this a copy of the generator \p g, + increasing the number of space dimensions if needed. + */ + void insert(const Generator& g); + + //! 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(); + + //! 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 ph: + \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(cout, "\n")); + \endcode + */ + class const_iterator + : public std::iterator { + public: + //! Default constructor. + const_iterator(); + + //! Ordinary copy-constructor. + const_iterator(const const_iterator& y); + + //! Destructor. + ~const_iterator(); + + //! Assignment operator. + const_iterator& operator=(const const_iterator& y); + + //! Dereference operator. + const Generator& operator*() const; + + //! Indirect member selector. + const Generator* operator->() const; + + //! Prefix increment operator. + const_iterator& operator++(); + + //! Postfix increment operator. + const_iterator operator++(int); + + /*! \brief + Returns true if and only if + \p *this and \p y are identical. + */ + bool operator==(const const_iterator& y) const; + + /*! \brief + Returns true if and only if + \p *this and \p y are different. + */ + bool operator!=(const const_iterator& y) const; + + private: + friend class Generator_System; + + //! The const iterator over the Linear_System. + Linear_System::const_iterator i; + + //! A const pointer to the Linear_System. + const Linear_System* gsp; + + //! Constructor. + const_iterator(const Linear_System::const_iterator& iter, + const Generator_System& gsys); + + /*! \brief + \p *this skips to the next generator, skipping those + closure points that are immediately followed by a matching point. + */ + void skip_forward(); + }; + + //! Returns true 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. + /*! + Returns true if and only if \p *this is a valid + Linear_System and each row in the system is a valid Generator. + */ + bool OK() const; + + PPL_OUTPUT_DECLARATIONS + + /*! \brief + Loads from \p s an ASCII representation (as produced by + ascii_dump(std::ostream&) const) and sets \p *this accordingly. + Returns true if successful, false 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 swap(Generator_System& y); + +private: + /*! \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 const_iterator; + friend class Parma_Polyhedra_Library::Polyhedron; + friend class Parma_Polyhedra_Library::Grid_Generator_System; + + friend bool operator==(const Polyhedron& x, const Polyhedron& y); + + //! Builds an empty system of generators having the specified topology. + explicit Generator_System(Topology topol); + + /*! \brief + Builds a system of \p n_rows rays/points on a \p n_columns - 1 + dimensional space (including the \f$\epsilon\f$ dimension, if + \p topol is NOT_NECESSARILY_CLOSED). + */ + Generator_System(Topology topol, + dimension_type n_rows, dimension_type n_columns); + + /*! \brief + Adjusts \p *this so that it matches the topology and + the number of space dimensions given as parameters + (adding or removing columns if needed). + Returns false if and only if \p topol is + equal to NECESSARILY_CLOSED and \p *this + contains closure points. + */ + bool adjust_topology_and_space_dimension(Topology topol, + dimension_type num_dimensions); + + /*! \brief + For each unmatched closure point in \p *this, adds the + corresponding point. + + It is assumed that the topology of \p *this + is NOT_NECESSARILY_CLOSED. + */ + void add_corresponding_points(); + + /*! \brief + Returns true 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 NOT_NECESSARILY_CLOSED. + */ + void add_corresponding_closure_points(); + + /*! \brief + Returns true if and only if \p *this + contains one or more closure points. + + Note: the check for the presence of closure points is + done under the point of view of the user. Namely, we scan + the generator system using high-level iterators, so that + closure points that are matching the corresponding points + will be disregarded. + */ + bool has_closure_points() const; + + //! Returns the \p k- th generator of the system. + Generator& operator[](dimension_type k); + + //! Returns a constant reference to the \p k- th generator of the system. + const Generator& operator[](dimension_type k) const; + + /*! \brief + Returns the relations holding between the generator system + and the constraint \p c. + */ + Parma_Polyhedra_Library::Poly_Con_Relation + relation_with(const Constraint& c) const; + + //! Returns true if all the generators satisfy \p c. + bool satisfied_by_all_generators(const Constraint& c) const; + + //! Returns true if all the generators satisfy \p c. + /*! + It is assumed that c.is_necessarily_closed() holds. + */ + bool satisfied_by_all_generators_C(const Constraint& c) const; + + //! Returns true if all the generators satisfy \p c. + /*! + It is assumed that c.is_necessarily_closed() does not hold. + */ + bool satisfied_by_all_generators_NNC(const Constraint& c) const; + + //! Assigns to a given variable an affine expression. + /*! + \param v + Index of the column to which the affine transformation is assigned; + + \param expr + The numerator of the affine transformation: + \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$; + + \param denominator + The denominator of the affine transformation. + + We want to allow affine transformations (see the Introduction) having + any rational coefficients. Since the coefficients of the + constraints are integers we must also provide an integer \p denominator + that will be used as denominator of the affine transformation. + The denominator is required to be a positive integer. + + The affine transformation assigns to each element of \p v -th + column the follow expression: + \f[ + \frac{\sum_{i = 0}^{n - 1} a_i x_i + b} + {\mathrm{denominator}}. + \f] + + \p expr is a constant parameter and unaltered by this computation. + */ + void affine_image(dimension_type v, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator); + + //! Returns the number of lines of the system. + dimension_type num_lines() const; + + //! Returns the number of rays of the system. + dimension_type num_rays() const; + + //! Removes all the invalid lines and rays. + /*! + The invalid lines and rays are those with all + the homogeneous terms set to zero. + */ + void remove_invalid_lines_and_rays(); + + /*! \brief + Applies Gaussian elimination and back-substitution so as + to provide a partial simplification of the system of generators. + + It is assumed that the system has no pending generators. + */ + void simplify(); + + /*! \brief + Inserts in \p *this a copy of the generator \p g, + increasing the number of space dimensions if needed. + It is a pending generator. + */ + void insert_pending(const Generator& g); +}; + +// Generator_System.inlines.hh is not included here on purpose. + +#endif // !defined(PPL_Generator_System_defs_hh) diff --git a/src/Generator_System.inlines.hh b/src/Generator_System.inlines.hh new file mode 100644 index 0000000..d8f850a --- /dev/null +++ b/src/Generator_System.inlines.hh @@ -0,0 +1,217 @@ +/* Generator_System class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Generator_System_inlines_hh +#define PPL_Generator_System_inlines_hh 1 + +#include "Generator.defs.hh" + +namespace Parma_Polyhedra_Library { + +inline +Generator_System::Generator_System() + : Linear_System(NECESSARILY_CLOSED) { +} + +inline +Generator_System::Generator_System(const Generator& g) + : Linear_System(g.topology()) { + Linear_System::insert(g); +} + +inline +Generator_System::Generator_System(const Generator_System& gs) + : Linear_System(gs) { +} + +inline +Generator_System::Generator_System(const Topology topol) + : Linear_System(topol) { +} + +inline +Generator_System::Generator_System(const Topology topol, + const dimension_type n_rows, + const dimension_type n_columns) + : Linear_System(topol, n_rows, n_columns) { +} + +inline +Generator_System::~Generator_System() { +} + +inline Generator_System& +Generator_System::operator=(const Generator_System& y) { + Linear_System::operator=(y); + return *this; +} + +inline dimension_type +Generator_System::max_space_dimension() { + return Linear_System::max_space_dimension(); +} + +inline dimension_type +Generator_System::space_dimension() const { + return Linear_System::space_dimension(); +} + +inline void +Generator_System::clear() { + Linear_System::clear(); +} + +inline Generator& +Generator_System::operator[](const dimension_type k) { + return static_cast(Linear_System::operator[](k)); +} + +inline const Generator& +Generator_System::operator[](const dimension_type k) const { + return static_cast(Linear_System::operator[](k)); +} + +inline +Generator_System::const_iterator::const_iterator() + : i(), gsp(0) { +} + +inline +Generator_System::const_iterator::const_iterator(const const_iterator& y) + : i(y.i), gsp(y.gsp) { +} + +inline +Generator_System::const_iterator::~const_iterator() { +} + +inline +Generator_System::const_iterator& +Generator_System::const_iterator::operator=(const const_iterator& y) { + i = y.i; + gsp = y.gsp; + return *this; +} + +inline const Generator& +Generator_System::const_iterator::operator*() const { + return static_cast(*i); +} + +inline const Generator* +Generator_System::const_iterator::operator->() const { + return static_cast(i.operator->()); +} + +inline Generator_System::const_iterator& +Generator_System::const_iterator::operator++() { + ++i; + if (!gsp->is_necessarily_closed()) + skip_forward(); + return *this; +} + +inline Generator_System::const_iterator +Generator_System::const_iterator::operator++(int) { + const const_iterator tmp = *this; + operator++(); + return tmp; +} + +inline bool +Generator_System::const_iterator::operator==(const const_iterator& y) const { + return i == y.i; +} + +inline bool +Generator_System::const_iterator::operator!=(const const_iterator& y) const { + return i != y.i; +} + +inline +Generator_System::const_iterator:: +const_iterator(const Linear_System::const_iterator& iter, + const Generator_System& gsys) + : i(iter), gsp(&gsys) { +} + +inline bool +Generator_System::empty() const { + return Linear_System::has_no_rows(); +} + +inline Generator_System::const_iterator +Generator_System::begin() const { + const_iterator i(Linear_System::begin(), *this); + if (!is_necessarily_closed()) + i.skip_forward(); + return i; +} + +inline Generator_System::const_iterator +Generator_System::end() const { + const const_iterator i(Linear_System::end(), *this); + return i; +} + +inline const Generator_System& +Generator_System::zero_dim_univ() { + assert(zero_dim_univ_p != 0); + return *zero_dim_univ_p; +} + +inline void +Generator_System::swap(Generator_System& y) { + Linear_System::swap(y); +} + +inline memory_size_type +Generator_System::external_memory_in_bytes() const { + return Linear_System::external_memory_in_bytes(); +} + +inline memory_size_type +Generator_System::total_memory_in_bytes() const { + return Linear_System::total_memory_in_bytes(); +} + +inline void +Generator_System::simplify() { + Linear_System::simplify(); + remove_invalid_lines_and_rays(); +} + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Constraint_System */ +inline void +swap(Parma_Polyhedra_Library::Generator_System& x, + Parma_Polyhedra_Library::Generator_System& y) { + x.swap(y); +} + +} // namespace std + +#endif // !defined(PPL_Generator_System_inlines_hh) diff --git a/src/Generator_System.types.hh b/src/Generator_System.types.hh new file mode 100644 index 0000000..27c325a --- /dev/null +++ b/src/Generator_System.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PPL_Generator_System_types_hh +#define PPL_Generator_System_types_hh 1 + +namespace Parma_Polyhedra_Library { + +class Generator_System; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Generator_System_types_hh) diff --git a/src/Grid.defs.hh b/src/Grid.defs.hh new file mode 100644 index 0000000..309d4b3 --- /dev/null +++ b/src/Grid.defs.hh @@ -0,0 +1,2784 @@ +/* Grid class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Grid_defs_hh +#define PPL_Grid_defs_hh 1 + +#include "Grid.types.hh" +#include "globals.defs.hh" +#include "Variable.defs.hh" +#include "Variables_Set.types.hh" +#include "Linear_Expression.defs.hh" +#include "Constraint.defs.hh" +#include "Constraint_System.defs.hh" +#include "Constraint_System.inlines.hh" +#include "Congruence_System.defs.hh" +#include "Congruence_System.inlines.hh" +#include "Grid_Generator_System.defs.hh" +#include "Grid_Generator_System.inlines.hh" +#include "Grid_Generator.types.hh" +#include "Poly_Con_Relation.defs.hh" +#include "Poly_Gen_Relation.defs.hh" +#include "Grid_Certificate.types.hh" +#include "Box.types.hh" +#include "Polyhedron.defs.hh" +#include "Polyhedron.types.hh" +#include "Polyhedron.inlines.hh" +#include "BD_Shape.types.hh" +#include "Octagonal_Shape.types.hh" +#include +#include + +namespace Parma_Polyhedra_Library { + +namespace IO_Operators { + +//! Output operator. +/*! + \relates Parma_Polyhedra_Library::Grid + Writes a textual representation of \p gr on \p s: false + is written if \p gr is an empty grid; true is written + if \p gr is a universe grid; a minimized system of congruences + defining \p gr is written otherwise, all congruences in one row + separated by ", "s. +*/ +std::ostream& +operator<<(std::ostream& s, const Grid& gr); + +} // namespace IO_Operators + +/*! \brief + Returns true 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 false is returned. +*/ +bool operator==(const Grid& x, const Grid& y); + +/*! \brief + Returns true 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 true 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 optimally supports: + - 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 explicit 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 + x and 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 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 + add_space_dimensions_and_embed: + \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 + add_space_dimensions_and_project: + \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 + add_space_dimensions_and_embed. + 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 + affine_image: + \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 + affine_preimage: + \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 + remove_space_dimensions: + \code + Grid_Generator_System gs; + gs.insert(grid_point(3*x + y +0*z + 2*w)); + Grid gr(gs); + Variables_Set to_be_removed; + to_be_removed.insert(y); + to_be_removed.insert(z); + gr.remove_space_dimensions(to_be_removed); + \endcode + The starting grid is the singleton set + \f$\bigl\{ (3, 1, 0, 2)^\transpose \bigr\} \sseq \Rset^4\f$, while + the resulting grid is + \f$\bigl\{ (3, 2)^\transpose \bigr\} \sseq \Rset^2\f$. + Be careful when removing space dimensions incrementally: + since dimensions are automatically renamed after each application + of the remove_space_dimensions operator, unexpected + results can be obtained. + For instance, by using the following code we would obtain + a different result: + \code + set to_be_removed1; + to_be_removed1.insert(y); + gr.remove_space_dimensions(to_be_removed1); + set to_be_removed2; + to_be_removed2.insert(z); + gr.remove_space_dimensions(to_be_removed2); + \endcode + In this case, the result is the grid + \f$\bigl\{(3, 0)^\transpose \bigr\} \sseq \Rset^2\f$: + when removing the set of dimensions \p to_be_removed2 + we are actually removing variable \f$w\f$ of the original grid. + For the same reason, the operator \p remove_space_dimensions + is not idempotent: removing twice the same non-empty set of dimensions + is never the same as removing them just once. +*/ + +class Parma_Polyhedra_Library::Grid { +public: + //! 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 const_gs + The system of generators defining the grid. + + \exception std::invalid_argument + Thrown if the system of generators is not empty but has no points. + + \exception std::length_error + Thrown if \p num_dimensions exceeds the maximum allowed space + dimension. + */ + explicit Grid(const Grid_Generator_System& const_gs); + + //! Builds a grid, recycling a system of grid generators. + /*! + The grid inherits the space dimension of the generator system. + + \param gs + 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& gs, 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 + explicit Grid(const Box& 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 + explicit Grid(const BD_Shape& 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 + explicit Grid(const Octagonal_Shape& os, + Complexity_Class complexity = ANY_COMPLEXITY); + + //! Builds a grid out of a generic, interval-based covering box. + /*! + The covering box is a set of upper and lower values for each + dimension. When a covering box is tiled onto empty space the + corners of the tiles form a rectilinear grid. + + A box interval with only one bound fixes the values of all grid + points in the dimension associated with the box to the value of + the bound. A box interval which has upper and lower bounds of + equal value allows all grid points with any value in the dimension + associated with the interval. The presence of a universe interval + results in the empty grid. The empty box produces the empty grid + of the same dimension as the box. + + \param box + The covering box representing the grid to be built; + + \param dummy + A dummy tag to make this constructor syntactically unique. + + \exception std::length_error + Thrown if the space dimension of \p box exceeds the maximum + allowed space dimension. + + \exception std::invalid_argument + Thrown if \p box contains any topologically open bounds. + + The template class Box must provide the following methods. + \code + dimension_type space_dimension() const + \endcode + returns the dimension of the vector space enclosing the grid + represented by the covering box. + \code + bool is_empty() const + \endcode + returns true if and only if the covering box + describes the empty set. + \code + bool get_lower_bound(dimension_type k, bool& closed, + Coefficient& n, Coefficient& d) const + \endcode + Let \f$I\f$ be the interval corresponding to the k-th + space dimension. If \f$I\f$ is not bounded from below, simply return + false. Otherwise, set closed, + n and d as follows: closed + is set to true if the lower boundary of \f$I\f$ + is closed and is set to false otherwise; + n and d are assigned the integers + \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$ + corresponds to the greatest lower bound of \f$I\f$. The fraction + \f$n/d\f$ is in canonical form if and only if \f$n\f$ and \f$d\f$ + have no common factors and \f$d\f$ is positive, \f$0/1\f$ being + the unique representation for zero. + \code + bool get_upper_bound(dimension_type k, bool& closed, + Coefficient& n, Coefficient& d) const + \endcode + Let \f$I\f$ be the interval corresponding to the k-th + space dimension. If \f$I\f$ is not bounded from above, simply return + false. Otherwise, set closed, + n and d as follows: closed + is set to true if the upper boundary of \f$I\f$ + is closed and is set to false otherwise; + n and d are assigned the integers + \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$ + corresponds to the least upper bound of \f$I\f$. + */ + template + Grid(const Box& box, From_Covering_Box dummy); + + /*! \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 true 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 true 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 true 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 true if and only if \p *this is bounded. + bool is_bounded() const; + + /*! \brief + Returns true if and only if \p *this + contains at least one integer point. + */ + bool contains_integer_point() const; + + /*! \brief + Returns true 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 true 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 true 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 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 + true if the supremum value can be reached in \p this. + Always true 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, + false 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 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 + true if the supremum value can be reached in \p this. + Always true 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, + false 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 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 + true if the is the infimum value can be reached in \p + this. Always true 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, + false 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 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 + true if the is the infimum value can be reached in \p + this. Always true 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, + false is returned and \p inf_n, \p inf_d, \p minimum + and \p point are left untouched. + */ + bool minimize(const Linear_Expression& expr, + Coefficient& inf_n, Coefficient& inf_d, bool& minimum, + Generator& point) const; + + //! Returns true 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 true 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; + + //! Writes the covering box for \p *this into \p box. + /*! + The covering box is a set of upper and lower values for each + dimension. When the covering box written into \p box is tiled + onto empty space the corners of the tiles form the sparsest + rectilinear grid that includes \p *this. + + The value of the lower bound of each interval of the resulting \p + box are as close as possible to the origin, with positive values + taking preference when the lowest positive value equals the lowest + negative value. + + If all the points have a single value in a particular dimension of + the grid then there is only a lower bound on the interval produced + in \p box, and the lower bound denotes the single value for the + dimension. If the coordinates of the points in a particular + dimension include every value then the upper and lower bounds of + the associated interval in \p box are set equal. The empty grid + produces the empty \p box. The zero dimension universe grid + produces the zero dimension universe box. + + \param box + The Box into which the covering box is written. + + \exception std::invalid_argument + Thrown if \p *this and \p box are dimension-incompatible. + */ + template + void get_covering_box(Box& box) const; + + //! Checks if all the invariants are satisfied. + /*! + \return + true if and only if \p *this satisfies all the + invariants and either \p check_not_empty is false or + \p *this is not empty. + + \param check_not_empty + true 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 std::cerr 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 congruence \p cg to the system of congruences of \p + *this, reducing the result + + \return + false if and only if the result is empty. + + \exception std::invalid_argument + Thrown if \p *this and congruence \p cg are dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_congruence_and_minimize(const Congruence& c); + + /*! \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); + + /*! \brief + Adds a copy of grid generator \p g to the system of generators of + \p *this, reducing the result. + + \return + false if and only if the result is empty. + + \exception std::invalid_argument + Thrown if \p *this and generator \p g are dimension-incompatible, + or if \p *this is an empty grid and \p g is not a point. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_grid_generator_and_minimize(const Grid_Generator& g); + + //! Adds a copy of each congruence in \p cgs to \p *this. + /*! + \param cgs + Contains the congruences that will be added to the system of + congruences of \p *this. + + \exception std::invalid_argument + Thrown if \p *this and \p cgs are dimension-incompatible. + */ + void add_congruences(const Congruence_System& cgs); + + //! Adds 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 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); + + /*! \brief + Adds a copy of the congruences in \p cgs to the system of + congruences of \p *this, reducing the result. + + \return + false if and only if the result is empty. + + \param cgs + Contains the congruences that will be added to the system of + congruences of \p *this. + + \exception std::invalid_argument + Thrown if \p *this and \p cgs are dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_congruences_and_minimize(const Congruence_System& cgs); + + /*! \brief + Adds the congruences in \p cgs to the system of congruences of \p + *this, reducing the result. + + \return + false if and only if the result is empty. + + \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. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_recycled_congruences_and_minimize(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 a congruence equivalent to constraint \p c, + also minimizing the result. + + \return + false if and only if the result is empty. + + \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. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_constraint_and_minimize(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 whcih 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, + minimizing the result. + + \return + false if and only if the result is empty. + + \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 whcih is not optimally supported + by the grid domain. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_constraints_and_minimize(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 whcih 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); + + /*! \brief + Adds to \p *this congruences equivalent to the constraints in \p cs, + minimizing the result. + + \return + false if and only if the result is empty. + + \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 whcih 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. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_recycled_constraints_and_minimize(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 + Adds a copy of the generators in \p gs to the system of generators + of \p *this, reducing the result. + + \return + false if and only if the result is empty. + + \param gs + Contains the generators that will be added to the system of + generators of \p *this. + + \exception std::invalid_argument + Thrown if \p *this and \p gs are dimension-incompatible, or if \p + *this is empty and the system of generators \p gs is not empty, + but has no points. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_grid_generators_and_minimize(const Grid_Generator_System& gs); + + /*! \brief + Adds the generators in \p gs to the system of generators of \p + *this, reducing the result. + + \return + false if and only if the result is empty. + + \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. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_recycled_grid_generators_and_minimize(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 to_be_unconstrained, + assigning the result to \p *this. + + \param to_be_unconstrained + 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 to_be_removed. + */ + void unconstrain(const Variables_Set& to_be_unconstrained); + + /*! \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 intersection of \p *this and \p y, + reducing the result. + + \return + false if and only if the result is empty. + + \exception std::invalid_argument + Thrown if \p *this and \p y are dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool intersection_assign_and_minimize(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 + Assigns to \p *this the least upper bound of \p *this and \p y, + reducing the result. + + \return + false if and only if the result is empty. + + \exception std::invalid_argument + Thrown if \p *this and \p y are dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool upper_bound_assign_and_minimize(const Grid& y); + + /*! \brief + If the upper bound of \p *this and \p y is exact it is assigned to \p + *this and true is returned, otherwise + false 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 Grid_Difference "grid-difference" of + \p *this and \p y. + + The grid difference between grids x and y is the smallest grid + containing all the points from x and y that are only in x. + + \exception std::invalid_argument + Thrown if \p *this and \p y are dimension-incompatible. + */ + void 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); + + //! 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 must 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 must 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 must 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 must be contained in \p *this; + + \param cgs + The system of congruences used to improve the widened grid; + + \param tp + An optional pointer to an unsigned variable storing the number of + available tokens (to be used when applying the + \ref Grid_Widening_with_Tokens "widening with tokens" delay technique). + + \exception std::invalid_argument + Thrown if \p *this, \p y and \p cs are dimension-incompatible. + */ + void limited_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 must be contained in \p *this; + + \param cgs + The system of congruences used to improve the widened grid; + + \param tp + An optional pointer to an unsigned variable storing the number of + available tokens (to be used when applying the + \ref Grid_Widening_with_Tokens "widening with tokens" delay technique). + + \exception std::invalid_argument + Thrown if \p *this, \p y and \p cs are dimension-incompatible. + */ + void limited_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 must be contained in \p *this; + + \param cgs + The system of congruences used to improve the widened grid; + + \param tp + An optional pointer to an unsigned variable storing the number of + available tokens (to be used when applying the + \ref Grid_Widening_with_Tokens "widening with tokens" delay technique). + + \exception std::invalid_argument + Thrown if \p *this, \p y and \p cs are dimension-incompatible. + */ + void limited_extrapolation_assign(const Grid& y, + const Congruence_System& cgs, + unsigned* tp = NULL); + + //@} // Space Dimension Preserving Member Functions that May Modify [...] + + //! \name Member Functions that May Modify the Dimension of the Vector Space + //@{ + + /*! \brief + Adds \p m new space dimensions and embeds the old grid in the new + vector space. + + \param m + The number of dimensions to add. + + \exception std::length_error + Thrown if adding \p m new space dimensions would cause the vector + space to exceed dimension max_space_dimension(). + + The new space dimensions will be those having the highest indexes + in the new grid, which is characterized by a system of congruences + in which the variables which are the new dimensions can have any + value. For instance, when starting from the grid \f$\cL \sseq + \Rset^2\f$ and adding a third space dimension, the result will be + the grid + \f[ + \bigl\{\, + (x, y, z)^\transpose \in \Rset^3 + \bigm| + (x, y)^\transpose \in \cL + \,\bigr\}. + \f] + */ + void add_space_dimensions_and_embed(dimension_type m); + + /*! \brief + Adds \p m new space dimensions to the grid and does not embed it + in the new vector space. + + \param m + The number of space dimensions to add. + + \exception std::length_error + Thrown if adding \p m new space dimensions would cause the + vector space to exceed dimension max_space_dimension(). + + The new space dimensions will be those having the highest indexes + in the new grid, which is characterized by a system of congruences + in which the variables running through the new dimensions are all + constrained to be equal to 0. For instance, when starting from + the grid \f$\cL \sseq \Rset^2\f$ and adding a third space + dimension, the result will be the grid + \f[ + \bigl\{\, + (x, y, 0)^\transpose \in \Rset^3 + \bigm| + (x, y)^\transpose \in \cL + \,\bigr\}. + \f] + */ + void add_space_dimensions_and_project(dimension_type m); + + /*! \brief + Assigns to \p *this the \ref Grid_Concatenate "concatenation" of + \p *this and \p y, taken in this order. + + \exception std::length_error + Thrown if the concatenation would cause the vector space + to exceed dimension max_space_dimension(). + */ + void concatenate_assign(const Grid& y); + + //! Removes all the specified dimensions from the vector space. + /*! + \param to_be_removed + The set of Variable objects corresponding to the space dimensions + to be removed. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with one of the + Variable objects contained in \p to_be_removed. + */ + void remove_space_dimensions(const Variables_Set& to_be_removed); + + /*! \brief + Removes the higher dimensions of the vector space so that the + resulting space will have dimension \p new_dimension. + + \exception std::invalid_argument + Thrown if \p new_dimensions is greater than the space dimension of + \p *this. + */ + void remove_higher_space_dimensions(dimension_type new_dimension); + + /*! \brief + Remaps the dimensions of the vector space according to + a \ref Grid_Map_Space_Dimensions "partial function". + + If \p pfunc maps only some of the dimensions of \p *this then the + rest will be projected away. + + If the highest dimension mapped to by \p pfunc is higher than the + highest dimension in \p *this then the number of dimensions in \p + *this will be increased to the highest dimension mapped to by \p + pfunc. + + \param pfunc + The partial function specifying the destiny of each space + dimension. + + The template class Partial_Function must provide the following + methods. + \code + bool has_empty_codomain() const + \endcode + returns true if and only if the represented partial + function has an empty codomain (i.e., it is always undefined). + The has_empty_codomain() method will always be called + before the methods below. However, if + has_empty_codomain() returns true, 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 max_in_codomain() 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 true is returned. If \f$f\f$ is + undefined in \f$k\f$, then false is returned. + This method is called at most \f$n\f$ times, where \f$n\f$ is the + dimension of the vector space enclosing the grid. + + The result is undefined if \p pfunc does not encode a partial + function with the properties described in the + \ref Grid_Map_Space_Dimensions "specification of the mapping operator". + */ + template + 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 max_space_dimension(). + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + and var has space dimension \f$k \leq n\f$, + then the \f$k\f$-th space dimension is + \ref Grid_Expand_Space_Dimension "expanded" to \p m new space dimensions + \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$. + */ + void expand_space_dimension(Variable var, dimension_type m); + + //! Folds the space dimensions in \p to_be_folded into \p var. + /*! + \param to_be_folded + The set of Variable objects corresponding to the space dimensions + to be folded; + + \param var + The variable corresponding to the space dimension that is the + destination of the folding operation. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with \p var or with + one of the Variable objects contained in \p to_be_folded. Also + thrown if \p var is contained in \p to_be_folded. + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + var has space dimension \f$k \leq n\f$, + \p to_be_folded is a set of variables whose maximum space dimension + is also less than or equal to \f$n\f$, and \p var is not a member + of \p to_be_folded, then the space dimensions corresponding to + variables in \p to_be_folded are \ref Grid_Fold_Space_Dimensions "folded" + into the \f$k\f$-th space dimension. + */ + void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var); + + //@} // Member Functions that May Modify the Dimension of the Vector Space + + friend bool operator==(const Grid& x, const Grid& y); + + friend class Parma_Polyhedra_Library::Grid_Certificate; + + template 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 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 true if successful, false 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 x == y, + then x.hash_code() == y.hash_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, + LINE, + GEN_VIRTUAL, + PROPER_CONGRUENCE = PARAMETER, + CON_VIRTUAL = LINE, + EQUALITY = GEN_VIRTUAL + }; + + typedef std::vector 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 true if the grid is known to be empty. + /*! + The return value false does not necessarily + implies that \p *this is non-empty. + */ + bool marked_empty() const; + + //! Returns true if the system of congruences is up-to-date. + bool congruences_are_up_to_date() const; + + //! Returns true if the system of generators is up-to-date. + bool generators_are_up_to_date() const; + + //! Returns true if the system of congruences is minimized. + bool congruences_are_minimized() const; + + //! Returns true 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 + false 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 + false 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 true 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 true if and only if \p from_above is + true and \p expr is bounded from above in \p *this, + or \p from_above is false 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 + true 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, false 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 + Adds the congruence \p cg to \p *this. + + \warning + If \p cg and \p *this are dimension-incompatible, + 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 + add_space_dimensions_and_embed(). + */ + 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 + add_space_dimensions_and_project(). + */ + 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 true if \p cgs represents the empty set, + otherwise returns false. + */ + static bool simplify(Congruence_System& cgs, + Dimension_Kinds& dim_kinds); + + //! Converts \p gs to lower triangular (i.e. minimized) form. + /*! + Expects \p gs to contain at least one point. + */ + static void simplify(Grid_Generator_System& gs, + Dimension_Kinds& dim_kinds); + + //! Reduces the line \p row using the line \p pivot. + /*! + Uses the line \p pivot to change the representation of the line \p + row so that the element at index \p col of \p row is zero. + */ + // A member of Grid for access to Matrix::rows. + static void reduce_line_with_line(Grid_Generator& row, + Grid_Generator& pivot, + dimension_type col); + + //! Reduces the equality \p row using the equality \p pivot. + /*! + Uses the equality \p pivot to change the representation of the + equality \p row so that the element at index \p col of \p row is + zero. + */ + // A member of Grid for access to Matrix::rows. + static void reduce_equality_with_equality(Congruence& row, + const Congruence& pivot, + dimension_type col); + + //! Reduces \p row using \p pivot. + /*! + Uses the point, parameter or proper congruence at \p pivot to + change the representation of the point, parameter or proper + congruence at \p row so that the element at index \p col of \p row + is zero. Only elements from index \p start to index \p end are + modified (i.e. it is assumed that all other elements are zero). + */ + // Part of Grid for access to Matrix::rows. + template + static void reduce_pc_with_pc(R& row, + R& pivot, + dimension_type col, + dimension_type start, + dimension_type end); + + //! Reduce \p row using \p pivot. + /*! + Use the line \p pivot to change the representation of the + parameter \p row such that the element at index \p col of \p row + is zero. + */ + // A member of Grid for access to Matrix::rows. + static void reduce_parameter_with_line(Grid_Generator& row, + const Grid_Generator& pivot, + dimension_type col, + Grid_Generator_System& sys); + + //! Reduce \p row using \p pivot. + /*! + Use the equality \p pivot to change the representation of the + congruence \p row such that element at index \p col of \p row is + zero. + */ + // A member of Grid for access to Matrix::rows. + static void reduce_congruence_with_equality(Congruence& row, + const Congruence& pivot, + dimension_type col, + Congruence_System& 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). + + Only consider from index \p start to index \p end of the row at \p + pivot_index. Flag \p generators indicates whether \p sys is a + congruence or generator system. + */ + template + static void reduce_reduced(M& sys, dimension_type dim, + dimension_type pivot_index, + dimension_type start, dimension_type end, + const Dimension_Kinds& dim_kinds, + bool generators = true); + + //! Multiply the elements of \p dest by \p multiplier. + // A member of Grid for access to Matrix::rows and cgs::operator[]. + static void multiply_grid(const Coefficient& multiplier, + Congruence& cg, Congruence_System& dest, + dimension_type num_rows, + dimension_type num_dims); + + //! Multiply the elements of \p dest by \p multiplier. + // A member of Grid for access to Grid_Generator::operator[]. + static void multiply_grid(const Coefficient& multiplier, + Grid_Generator& gen, + Grid_Generator_System& dest, + dimension_type num_rows, + dimension_type num_dims); + + /*! \brief + If \p sys is lower triangular return true, else + return false. + */ + static bool lower_triangular(const Congruence_System& sys, + const Dimension_Kinds& dim_kinds); + + /*! \brief + If \p sys is upper triangular return true, else + return false. + */ + 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 true, + else return false. \p row_size gives the number of + columns in each row. + + This method is only used in assertions in the simplify methods. + */ + template + 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_runtime_error(const char* method) const; + void throw_invalid_argument(const char* method, const char* reason) const; + + void throw_dimension_incompatible(const char* method, + const char* other_name, + dimension_type other_dim) const; + void throw_dimension_incompatible(const char* method, + const char* gr_name, + const Grid& gr) const; + void throw_dimension_incompatible(const char* method, + const char* e_name, + const Linear_Expression& e) const; + void throw_dimension_incompatible(const char* method, + const char* cg_name, + const Congruence& cg) const; + void throw_dimension_incompatible(const char* method, + const char* c_name, + const Constraint& c) const; + void throw_dimension_incompatible(const char* method, + const char* g_name, + const Grid_Generator& g) const; + void throw_dimension_incompatible(const char* method, + const char* 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; + + // Note: it has to be a static method, because it can be called inside + // constructors (before actually constructing the grid object). + static void throw_space_dimension_overflow(const char* method, + const char* reason); + + void throw_invalid_constraint(const char* method, + const char* c_name) const; + void throw_invalid_constraints(const char* method, + const char* cs_name) const; + 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) + +}; + + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Grid */ +void swap(Parma_Polyhedra_Library::Grid& x, + Parma_Polyhedra_Library::Grid& y); + +} // namespace std + +#include "Grid_Status.inlines.hh" +#include "Grid.inlines.hh" +#include "Grid.templates.hh" + +#endif // !defined(PPL_Grid_defs_hh) diff --git a/src/Grid.inlines.hh b/src/Grid.inlines.hh new file mode 100644 index 0000000..5fc3d53 --- /dev/null +++ b/src/Grid.inlines.hh @@ -0,0 +1,407 @@ +/* Grid class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Grid_inlines_hh +#define PPL_Grid_inlines_hh 1 + +#include "Grid_Generator.defs.hh" +#include "Grid_Generator_System.defs.hh" +#include "Grid_Generator_System.inlines.hh" +#include + +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::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(num_dimensions > max_space_dimension() + ? (throw_space_dimension_overflow("Grid(n, k)", + "n exceeds the maximum " + "allowed space dimension"), + 0) + : num_dimensions) { + construct(num_dimensions, kind); + assert(OK()); +} + +inline +Grid::Grid(const Congruence_System& cgs) + : con_sys(cgs.space_dimension() > max_space_dimension() + ? throw_space_dimension_overflow("Grid(cgs)", + "the space dimension of cgs " + "exceeds the maximum allowed " + "space dimension"), 0 + : cgs.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(cgs.space_dimension() > max_space_dimension() + ? throw_space_dimension_overflow("Grid(cgs, recycle)", + "the space dimension of cgs " + "exceeds the maximum allowed " + "space dimension"), 0 + : cgs.space_dimension()), + gen_sys(cgs.space_dimension()) { + construct(cgs); +} + +inline +Grid::Grid(const Grid_Generator_System& ggs) + : con_sys(ggs.space_dimension() > max_space_dimension() + ? throw_space_dimension_overflow("Grid(ggs)", + "the space dimension of ggs " + "exceeds the maximum allowed " + "space dimension"), 0 + : ggs.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(ggs.space_dimension() > max_space_dimension() + ? throw_space_dimension_overflow("Grid(ggs, recycle)", + "the space dimension of ggs " + "exceeds the maximum allowed " + "space dimension"), 0 + : ggs.space_dimension()), + gen_sys(ggs.space_dimension()) { + construct(ggs); +} + +template +inline +Grid::Grid(const BD_Shape& bd, + Complexity_Class) + : con_sys(bd.space_dimension() > max_space_dimension() + ? throw_space_dimension_overflow("Grid(bd)", + "the space dimension of bd " + "exceeds the maximum allowed " + "space dimension"), 0 + : bd.space_dimension()), + gen_sys(bd.space_dimension()) { + Congruence_System cgs = bd.congruences(); + construct(cgs); +} + +template +inline +Grid::Grid(const Octagonal_Shape& os, + Complexity_Class) + : con_sys(os.space_dimension() > max_space_dimension() + ? throw_space_dimension_overflow("Grid(os)", + "the space dimension of os " + "exceeds the maximum allowed " + "space dimension"), 0 + : os.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 space_dimension() & 0x7fffffff; +} + +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::swap(Grid& y) { + std::swap(con_sys, y.con_sys); + std::swap(gen_sys, y.gen_sys); + std::swap(status, y.status); + std::swap(space_dim, y.space_dim); + std::swap(dim_kinds, y.dim_kinds); +} + +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 bool +Grid::add_congruences_and_minimize(const Congruence_System& cgs) { + Congruence_System cgs_copy = cgs; + return add_recycled_congruences_and_minimize(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 bool +Grid::add_constraint_and_minimize(const Constraint& c) { + add_constraint(c); + return minimize(); +} + +inline bool +Grid::add_constraints_and_minimize(const Constraint_System& cs) { + add_constraints(cs); + return minimize(); +} + +inline void +Grid::add_recycled_constraints(Constraint_System& cs) { + // TODO: really recycle the constraints. + add_constraints(cs); +} + +inline bool +Grid::add_recycled_constraints_and_minimize(Constraint_System& cs) { + add_constraints(cs); + return minimize(); +} + +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() { + return; +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Grid */ +inline void +swap(Parma_Polyhedra_Library::Grid& x, + Parma_Polyhedra_Library::Grid& y) { + x.swap(y); +} + +} // namespace std + +#endif // !defined(PPL_Grid_inlines_hh) diff --git a/src/Grid.templates.hh b/src/Grid.templates.hh new file mode 100644 index 0000000..12196b1 --- /dev/null +++ b/src/Grid.templates.hh @@ -0,0 +1,615 @@ +/* Grid class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Grid_templates_hh +#define PPL_Grid_templates_hh 1 + +#include "Grid_Generator.defs.hh" +#include "Grid_Generator_System.defs.hh" +#include "Grid_Generator_System.inlines.hh" +#include +#include + +namespace Parma_Polyhedra_Library { + +template +Grid::Grid(const Box& box, + Complexity_Class) + : con_sys(), + gen_sys() { + if (box.space_dimension() > max_space_dimension()) + throw_space_dimension_overflow("Grid(box, from_bounding_box)", + "the space dimension of box " + "exceeds the maximum allowed " + "space dimension"); + + space_dim = box.space_dimension(); + + if (box.is_empty()) { + // Empty grid. + set_empty(); + assert(OK()); + return; + } + + if (space_dim == 0) + set_zero_dim_univ(); + else { + // Initialize the space dimension as indicated by the box. + con_sys.increase_space_dimension(space_dim); + // Add congruences 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(0*Variable(space_dim-1))); + Grid_Generator& point = gen_sys[0]; + for (dimension_type k = space_dim; k-- > 0; ) { + bool closed = false; + // TODO: Consider producing the system(s) in minimized form. + if (box.get_lower_bound(k, closed, l_n, l_d)) { + if (box.get_upper_bound(k, closed, u_n, u_d)) + if (l_n * u_d == u_n * l_d) { + // A point interval sets dimension k of every point to a + // single value. + con_sys.insert(l_d * Variable(k) == l_n); + + // 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[k + 1] = l_n * u_n; + + continue; + } + } + // A universe interval allows any value in dimension k. + gen_sys.insert(grid_line(Variable(k))); + } + set_congruences_up_to_date(); + set_generators_up_to_date(); + gen_sys.unset_pending_rows(); + gen_sys.set_sorted(false); + } + + assert(OK()); +} + +template +Grid::Grid(const Box& box, From_Covering_Box) + : con_sys(), + gen_sys() { + + if (box.space_dimension() > max_space_dimension()) + throw_space_dimension_overflow("Grid(box, from_covering_box)", + "the space dimension of box " + "exceeds the maximum allowed " + "space dimension"); + + space_dim = box.space_dimension(); + + PPL_DIRTY_TEMP_COEFFICIENT(l_n); + PPL_DIRTY_TEMP_COEFFICIENT(l_d); + + // FIXME: consider whether or not covering boxes supporting open + // boundaries should be disabled at compile time. If that is not + // the case, consider if the test !box.is_topologically_closed() + // can replace the whole loop here below. + + // Check that no finite bounds is open. This check must be done before + // the empty test below, as an open bound might mean an empty box. + for (dimension_type k = space_dim; k-- > 0; ) { + bool closed = false; + if (box.get_lower_bound(k, closed, l_n, l_d) && !closed) + throw_invalid_argument("Grid(box, from_covering_box)", "box"); + if (box.get_upper_bound(k, closed, l_n, l_d) && !closed) + throw_invalid_argument("Grid(box, from_covering_box)", "box"); + } + + if (box.is_empty()) { + // Empty grid. + set_empty(); + assert(OK()); + return; + } + + if (space_dim == 0) + set_zero_dim_univ(); + else { + // Initialize the space dimension as indicated by the box. + con_sys.increase_space_dimension(space_dim); + // Add congruences according to `box'. + PPL_DIRTY_TEMP_COEFFICIENT(u_n); + PPL_DIRTY_TEMP_COEFFICIENT(u_d); + PPL_DIRTY_TEMP_COEFFICIENT(d); + gen_sys.insert(grid_point(0*Variable(space_dim-1))); + Grid_Generator& point = gen_sys[0]; + for (dimension_type k = space_dim; k-- > 0; ) { + bool closed = false; + // TODO: Consider producing the system(s) in minimized form. + if (box.get_lower_bound(k, closed, l_n, l_d)) { + + const Coefficient& point_divisor = point.divisor(); + assert(l_d > 0); + assert(point_divisor > 0); + // Use `d' to hold the gcd. + gcd_assign(d, l_d, point_divisor); + // Scale the point to use as divisor the lcm of the existing + // point divisor and the divisor of the lower bound. + exact_div_assign(d, point_divisor, d); + // l_d * d == abs(l_d) * (point_divisor / gcd(l_d, point_divisor)) + point.scale_to_divisor(l_d * d); + // Set dimension k of the point to the lower bound. + // point[k + 1] = l_n * (point_divisor / gcd(l_d, point_divisor)) + point[k + 1] = l_n * d; + + if (box.get_upper_bound(k, closed, u_n, u_d)) { + if (l_n * u_d == u_n * l_d) { + // A point interval allows any point along the dimension + // k axis. + gen_sys.insert(grid_line(Variable(k))); + continue; + } + assert(l_d > 0); + assert(u_d > 0); + gcd_assign(d, l_d, u_d); + // `d' is the gcd of the divisors. + exact_div_assign(l_d, l_d, d); + exact_div_assign(d, u_d, d); + l_n *= d; + // `l_d' is now the smallest integer expression of the size of + // the original l_d relative to u_d. + u_n = (u_n * l_d) - l_n; + // `u_n' is now the distance between u_n and l_n (given a + // divisor of lcm of l_d and u_d. + l_d *= u_d; + // `l_d' is now the lcm of the divisors. + con_sys.insert((l_d * Variable(k) %= l_n) / u_n); + gen_sys.insert(parameter(u_n * Variable(k), l_d)); + } + else + // An interval bounded only from below produces an + // equality. + con_sys.insert(l_d * Variable(k) == l_n); + } + else + if (box.get_upper_bound(k, closed, u_n, u_d)) { + const Coefficient& point_divisor = point.divisor(); + assert(u_d > 0); + assert(point_divisor > 0); + // Use `d' to hold the gcd. + gcd_assign(d, u_d, point_divisor); + // Scale the point to use as divisor the lcm of the existing + // point divisor and the divisor of the lower bound. + exact_div_assign(d, point_divisor, d); + // u_d * d == abs(u_d) * (point_divisor / gcd(u_d, point_divisor)) + point.scale_to_divisor(u_d * d); + // Set dimension k of the point to the lower bound. + // point[k + 1] = u_n * (point_divisor / gcd(u_d, point_divisor)) + point[k + 1] = u_n * d; + + // An interval bounded only from above produces an equality. + con_sys.insert(u_d * Variable(k) == u_n); + } + else { + // Any universe interval produces an empty grid. + set_empty(); + assert(OK()); + return; + } + } + normalize_divisors(gen_sys); + set_congruences_up_to_date(); + set_generators_up_to_date(); + gen_sys.set_sorted(false); + gen_sys.unset_pending_rows(); + } + + assert(OK()); +} + +template +void +Grid::get_covering_box(Box& box) const { + // Dimension-compatibility check. + if (space_dim > box.space_dimension()) + throw_dimension_incompatible("get_covering_box(box)", "box", + box.space_dimension()); + + Box new_box(box.space_dimension()); + + if (marked_empty()) { + box = new_box; + box.set_empty(); + return; + } + if (space_dim == 0) { + return; + } + if (!generators_are_up_to_date() && !update_generators()) { + // Updating found the grid empty. + box = new_box; + box.set_empty(); + return; + } + + assert(!gen_sys.has_no_rows()); + + dimension_type num_dims = gen_sys.num_columns() - 2 /* parameter divisor */; + dimension_type num_rows = gen_sys.num_rows(); + + PPL_DIRTY_TEMP_COEFFICIENT(gcd); + PPL_DIRTY_TEMP_COEFFICIENT(bound); + + if (num_rows > 1) { + Row interval_sizes(num_dims, Row::Flags()); + std::vector interval_emptiness(num_dims, false); + + // Store in `interval_sizes', for each column (that is, for each + // dimension), the GCD of all the values in that column where the + // row is of type parameter. + + for (dimension_type dim = num_dims; dim-- > 0; ) + interval_sizes[dim] = 0; + const Grid_Generator *first_point = NULL; + for (dimension_type row = 0; row < num_rows; ++row) { + Grid_Generator& gen = const_cast(gen_sys[row]); + if (gen.is_line()) { + for (dimension_type dim = 0; dim < num_dims; ++dim) + if (!interval_emptiness[dim] && gen[dim+1] != 0) { + // Empty interval, set both bounds for associated + // dimension to zero. + new_box.add_constraint(Variable(dim) == 0); + interval_emptiness[dim] = true; + } + continue; + } + if (gen.is_point()) { + if (first_point == NULL) { + first_point = &gen_sys[row]; + continue; + } + const Grid_Generator& point = *first_point; + // Convert the point `gen' to a parameter. + dimension_type dim = num_dims; + do { + gen[dim] -= point[dim]; + } + while (dim-- > 0); + gen.set_divisor(point.divisor()); + } + for (dimension_type dim = num_dims; dim-- > 0; ) + if (!interval_emptiness[dim]) + gcd_assign(interval_sizes[dim], interval_sizes[dim], gen[dim+1]); + } + + // For each dimension set the lower bound of the interval to the + // grid value closest to the origin, and the upper bound to the + // addition of the lower bound and the shortest distance in the + // given dimension between any two grid points. + const Grid_Generator& point = *first_point; + const Coefficient& divisor = point.divisor(); + PPL_DIRTY_TEMP_COEFFICIENT(lower_bound); + for (dimension_type dim = num_dims; dim-- > 0; ) { + if (interval_emptiness[dim]) + continue; + + lower_bound = point[dim+1]; + + // If the interval size is zero then all points have the same + // value in this dimension, so set only the lower bound. + if (interval_sizes[dim] != 0) { + // Make the lower bound as close as possible to the origin, + // leaving the sign the same. + lower_bound %= interval_sizes[dim]; + // Check if the lowest value the other side of the origin is + // closer to the origin, preferring the lowest positive if they + // are equal. + if (lower_bound > 0) { + if (interval_sizes[dim] - lower_bound < lower_bound) + lower_bound -= interval_sizes[dim]; + } + else if (lower_bound < 0 + && interval_sizes[dim] + lower_bound < - lower_bound) + lower_bound += interval_sizes[dim]; + + // Reduce the bound fraction first. + bound = interval_sizes[dim] + lower_bound; + gcd_assign(gcd, bound, divisor); + exact_div_assign(bound, bound, gcd); + exact_div_assign(gcd, divisor, gcd); + // `gcd' now holds the reduced divisor. + new_box.add_constraint(gcd*Variable(dim) <= bound); + } + + // Reduce the bound fraction first. + gcd_assign(gcd, lower_bound, divisor); + exact_div_assign(lower_bound, lower_bound, gcd); + exact_div_assign(gcd, divisor, gcd); + // `gcd' now holds the reduced divisor. + new_box.add_constraint(gcd*Variable(dim) >= lower_bound); + } + } + else { + const Grid_Generator& point = gen_sys[0]; + const Coefficient& divisor = point.divisor(); + // The covering box of a single point has only lower bounds. + for (dimension_type dim = num_dims; dim-- > 0; ) { + // Reduce the bound fraction first. + gcd_assign(gcd, point[dim+1], divisor); + exact_div_assign(bound, point[dim+1], gcd); + exact_div_assign(gcd, divisor, gcd); + // `gcd' now holds the reduced divisor. + new_box.add_constraint(gcd*Variable(dim) >= bound); + } + } + + box.swap(new_box); +} + +template +void +Grid::map_space_dimensions(const Partial_Function& pfunc) { + if (space_dim == 0) + return; + + if (pfunc.has_empty_codomain()) { + // All dimensions vanish: the grid becomes zero_dimensional. + if (marked_empty() + || (!generators_are_up_to_date() && !update_generators())) { + // Removing all dimensions from the empty grid. + space_dim = 0; + set_empty(); + } + else + // Removing all dimensions from a non-empty grid. + set_zero_dim_univ(); + + assert(OK()); + return; + } + + dimension_type new_space_dimension = pfunc.max_in_codomain() + 1; + + if (new_space_dimension == space_dim) { + // The partial function `pfunc' is indeed total and thus specifies + // a permutation, that is, a renaming of the dimensions. For + // maximum efficiency, we will simply permute the columns of the + // constraint system and/or the generator system. + + // We first compute suitable permutation cycles for the columns of + // the `con_sys' and `gen_sys' matrices. We will represent them + // with a linear array, using 0 as a terminator for each cycle + // (notice that the columns with index 0 of `con_sys' and + // `gen_sys' represent the inhomogeneous terms, and thus are + // unaffected by the permutation of dimensions). + // Cycles of length 1 will be omitted so that, in the worst case, + // we will have `space_dim' elements organized in `space_dim/2' + // cycles, which means we will have at most `space_dim/2' + // terminators. + std::vector cycles; + cycles.reserve(space_dim + space_dim/2); + + // Used to mark elements as soon as they are inserted in a cycle. + std::deque visited(space_dim); + + for (dimension_type i = space_dim; i-- > 0; ) { + if (!visited[i]) { + dimension_type j = i; + do { + visited[j] = true; + // The following initialization is only to make the compiler happy. + dimension_type k = 0; + if (!pfunc.maps(j, k)) + throw_invalid_argument("map_space_dimensions(pfunc)", + " pfunc is inconsistent"); + if (k == j) + // Cycle of length 1: skip it. + goto skip; + + cycles.push_back(j+1); + // Go along the cycle. + j = k; + } while (!visited[j]); + // End of cycle: mark it. + cycles.push_back(0); + skip: + ; + } + } + + // If `cycles' is empty then `pfunc' is the identity. + if (cycles.empty()) + return; + + // Permute all that is up-to-date. + if (congruences_are_up_to_date()) { + con_sys.permute_columns(cycles); + clear_congruences_minimized(); + } + + if (generators_are_up_to_date()) { + gen_sys.permute_columns(cycles); + clear_generators_minimized(); + } + + assert(OK()); + return; + } + + // If control gets here, then `pfunc' is not a permutation and some + // dimensions must be projected away. + + const Grid_Generator_System& old_gensys = grid_generators(); + + if (old_gensys.has_no_rows()) { + // The grid is empty. + Grid new_grid(new_space_dimension, EMPTY); + std::swap(*this, new_grid); + assert(OK()); + return; + } + + // Make a local copy of the partial function. + std::vector pfunc_maps(space_dim, not_a_dimension()); + for (dimension_type j = space_dim; j-- > 0; ) { + dimension_type pfunc_j; + if (pfunc.maps(j, pfunc_j)) + pfunc_maps[j] = pfunc_j; + } + + Grid_Generator_System new_gensys; + // Set sortedness, for the assertion met via gs::insert. + new_gensys.set_sorted(false); + // Get the divisor of the first point. + Grid_Generator_System::const_iterator i; + Grid_Generator_System::const_iterator old_gensys_end = old_gensys.end(); + for (i = old_gensys.begin(); i != old_gensys_end; ++i) + if (i->is_point()) + break; + assert(i != old_gensys_end); + const Coefficient& system_divisor = i->divisor(); + for (i = old_gensys.begin(); i != old_gensys_end; ++i) { + const Grid_Generator& old_g = *i; + Linear_Expression e(0 * Variable(new_space_dimension-1)); + bool all_zeroes = true; + for (dimension_type j = space_dim; j-- > 0; ) { + if (old_g.coefficient(Variable(j)) != 0 + && pfunc_maps[j] != not_a_dimension()) { + e += Variable(pfunc_maps[j]) * old_g.coefficient(Variable(j)); + all_zeroes = false; + } + } + switch (old_g.type()) { + case Grid_Generator::LINE: + if (!all_zeroes) + new_gensys.insert(grid_line(e)); + break; + case Grid_Generator::PARAMETER: + if (!all_zeroes) + new_gensys.insert(parameter(e, system_divisor)); + break; + case Grid_Generator::POINT: + new_gensys.insert(grid_point(e, old_g.divisor())); + break; + case Grid_Generator::CLOSURE_POINT: + default: + assert(0); + } + } + + Grid new_grid(new_gensys); + std::swap(*this, new_grid); + + assert(OK(true)); +} + +// Needed for converting the congruence or grid_generator system +// to "strong minimal form". +template +void +Grid::reduce_reduced(M& sys, + const dimension_type dim, + const dimension_type pivot_index, + const dimension_type start, + const dimension_type end, + const Dimension_Kinds& dim_kinds, + const bool generators) { + R& pivot = sys[pivot_index]; + + const Coefficient& pivot_dim = pivot[dim]; + + if (pivot_dim == 0) + return; + + PPL_DIRTY_TEMP_COEFFICIENT(pivot_dim_half); + pivot_dim_half = (pivot_dim + 1) / 2; + Dimension_Kind row_kind = dim_kinds[dim]; + Dimension_Kind line_or_equality, virtual_kind; + int jump; + if (generators) { + line_or_equality = LINE; + virtual_kind = GEN_VIRTUAL; + jump = -1; + } + else { + line_or_equality = EQUALITY; + virtual_kind = CON_VIRTUAL; + jump = 1; + } + + PPL_DIRTY_TEMP_COEFFICIENT(num_rows_to_subtract); + PPL_DIRTY_TEMP_COEFFICIENT(row_dim_remainder); + for (dimension_type row_index = pivot_index, kinds_index = dim + jump; + row_index-- > 0; + kinds_index += jump) { + // Move over any virtual rows. + while (dim_kinds[kinds_index] == virtual_kind) + kinds_index += jump; + + // row_kind CONGRUENCE is included as PARAMETER + if (row_kind == line_or_equality + || (row_kind == PARAMETER + && dim_kinds[kinds_index] == PARAMETER)) { + R& row = sys[row_index]; + + const Coefficient& row_dim = row[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) + for (dimension_type col = start; col <= end; ++col) + sub_mul_assign(row[col], num_rows_to_subtract, pivot[col]); + } + } +} + +} // 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..0811220 --- /dev/null +++ b/src/Grid.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PPL_Grid_types_hh +#define PPL_Grid_types_hh 1 + +namespace Parma_Polyhedra_Library { + +class Grid; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Grid_types_hh) diff --git a/src/Grid_Certificate.cc b/src/Grid_Certificate.cc new file mode 100644 index 0000000..e6f3ebd --- /dev/null +++ b/src/Grid_Certificate.cc @@ -0,0 +1,114 @@ +/* Grid_Certificate class implementation + (non-inline member functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Grid_Certificate.defs.hh" + +#include "Grid.defs.hh" +#include +#include + +namespace PPL = Parma_Polyhedra_Library; + +PPL::Grid_Certificate::Grid_Certificate(const Grid& cgr) + : num_equalities(0), num_proper_congruences(0) { + Grid& gr = const_cast(cgr); + // As in Polyhedron assume that gr contains at least one point. + assert(!gr.marked_empty()); + if (gr.space_dimension() == 0) + return; + // One of the systems must be in minimal form. + if (gr.congruences_are_up_to_date()) + if (gr.congruences_are_minimized()) { + num_proper_congruences = gr.con_sys.num_proper_congruences(); + num_equalities = gr.con_sys.num_equalities(); + } + else + if (gr.generators_are_up_to_date() && gr.generators_are_minimized()) { + // Calculate number of congruences from generators. + num_proper_congruences + = gr.gen_sys.num_parameters() + 1 /* Integrality cg. */; + num_equalities = gr.space_dimension() + 1 - gr.gen_sys.num_rows(); + } + else { + // Minimize gr congruence system. As in Polyhedron assume + // that gr contains at least one point. +#ifndef NDEBUG + Grid::simplify(gr.con_sys, gr.dim_kinds); +#else + bool contains_points = Grid::simplify(gr.con_sys, gr.dim_kinds); + used(contains_points); // Quiet compiler warning. + assert(contains_points); +#endif + gr.set_congruences_minimized(); + + num_proper_congruences = gr.con_sys.num_proper_congruences(); + num_equalities = gr.con_sys.num_equalities(); + } + else { + if (!gr.generators_are_minimized()) { + // Minimize gr generator system. As in Polyhedron assume that + // gr contains at least one point. + Grid::simplify(gr.gen_sys, gr.dim_kinds); + // If gen_sys contained rows before being reduced, it should + // contain at least a single point afterward. + assert(!gr.gen_sys.empty()); + gr.set_generators_minimized(); + } + // Calculate number of congruences from generators. + num_proper_congruences + = gr.gen_sys.num_parameters() + 1 /* Integrality cg. */; + num_equalities + = gr.space_dimension() + 1 - gr.gen_sys.num_rows(); + } +} + +int +PPL::Grid_Certificate::compare(const Grid_Certificate& y) const { + assert(OK() && y.OK()); + if (num_equalities == y.num_equalities) { + if (num_proper_congruences == y.num_proper_congruences) + return 0; + else + return num_proper_congruences > y.num_proper_congruences ? 1 : -1; + } + return num_equalities > y.num_equalities ? 1 : -1; +} + +int +PPL::Grid_Certificate::compare(const Grid& gr) const { + Grid_Certificate gc(gr); + return compare(gc); +} + +bool +PPL::Grid_Certificate::OK() const { +#ifndef NDEBUG + using std::endl; + using std::cerr; +#endif + + // All tests passed. + return true; +} diff --git a/src/Grid_Certificate.defs.hh b/src/Grid_Certificate.defs.hh new file mode 100644 index 0000000..2b0056e --- /dev/null +++ b/src/Grid_Certificate.defs.hh @@ -0,0 +1,103 @@ +/* Grid_Certificate class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Grid_Certificate_defs_hh +#define PPL_Grid_Certificate_defs_hh 1 + +#include "Grid_Certificate.types.hh" + +#include "Grid.types.hh" +#include "globals.defs.hh" +#include +#include + +//! 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 true 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 true 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..176a2b3 --- /dev/null +++ b/src/Grid_Certificate.inlines.hh @@ -0,0 +1,60 @@ +/* Grid_Certificate class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Grid_Certificate_inlines_hh +#define PPL_Grid_Certificate_inlines_hh 1 + +namespace Parma_Polyhedra_Library { + +inline +Grid_Certificate::Grid_Certificate() + : num_equalities(0), num_proper_congruences(0) { + // This is the certificate for a zero-dim universe grid. + assert(OK()); +} + +inline +Grid_Certificate::Grid_Certificate(const Grid_Certificate& y) + : num_equalities(y.num_equalities), + num_proper_congruences(y.num_proper_congruences) { +} + +inline +Grid_Certificate::~Grid_Certificate() { +} + +inline bool +Grid_Certificate::is_stabilizing(const Grid& gr) const { + return compare(gr) == 1; +} + +inline bool +Grid_Certificate::Compare::operator()(const Grid_Certificate& x, + const Grid_Certificate& y) const { + // For an efficient evaluation of the multiset ordering based + // on this lgo relation, we want larger elements to come first. + return x.compare(y) == 1; +} + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Grid_Certificate_inlines_hh) diff --git a/src/Grid_Certificate.types.hh b/src/Grid_Certificate.types.hh new file mode 100644 index 0000000..60d6377 --- /dev/null +++ b/src/Grid_Certificate.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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..f0b55f7 --- /dev/null +++ b/src/Grid_Generator.cc @@ -0,0 +1,422 @@ +/* Grid_Generator class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Grid_Generator.defs.hh" +#include +#include + +namespace PPL = Parma_Polyhedra_Library; + +void +PPL::Grid_Generator::throw_invalid_argument(const char* method, + const char* reason) const { + std::ostringstream s; + s << "PPL::Grid_Generator::" << method << ":" << std::endl + << reason << "."; + throw std::invalid_argument(s.str()); +} + +PPL::Grid_Generator +PPL::Grid_Generator::parameter(const Linear_Expression& e, + Coefficient_traits::const_reference d) { + if (d == 0) + throw std::invalid_argument("PPL::parameter(e, d):\n" + "d == 0."); + // Add 2 to space dimension to allow for parameter divisor column. + Linear_Expression ec(e, + e.space_dimension() + 2); + Generator g(ec, Generator::RAY, NECESSARILY_CLOSED); + g[0] = 0; + // Using this constructor saves reallocation when creating the + // coefficients. + Grid_Generator gg(g); + gg.set_divisor(d); + + // If the divisor is negative, negate it and all the coefficients of + // the parameter. This ensures that divisors are always positive. + if (d < 0) + for (dimension_type i = gg.size(); i-- > 0; ) + neg_assign(gg[i]); + + return gg; +} + +PPL::Grid_Generator +PPL::Grid_Generator::grid_point(const Linear_Expression& e, + Coefficient_traits::const_reference d) { + if (d == 0) + throw std::invalid_argument("PPL::grid_point(e, d):\n" + "d == 0."); + // Add 2 to space dimension to allow for parameter divisor column. + Linear_Expression ec(e, + e.space_dimension() + 2); + Generator g(ec, Generator::POINT, NECESSARILY_CLOSED); + g[0] = d; + // Using this constructor saves reallocation when creating the + // coefficients. + Grid_Generator gg(g); + + // If the divisor is negative, negate it and all the coefficients of + // the parameter. This ensures that divisors are always positive. + if (d < 0) + for (dimension_type i = gg.size(); i-- > 0; ) + neg_assign(gg[i]); + + // Enforce normalization. + gg.normalize(); + return gg; +} + +PPL::Grid_Generator +PPL::Grid_Generator::grid_line(const Linear_Expression& e) { + // The origin of the space cannot be a line. + if (e.all_homogeneous_terms_are_zero()) + throw std::invalid_argument("PPL::grid_line(e):\n" + "e == 0, but the origin cannot be a line."); + + // Add 2 to space dimension to allow for parameter divisor column. + Linear_Expression ec(e, + e.space_dimension() + 2); + Generator g(ec, Generator::LINE, NECESSARILY_CLOSED); + g[0] = 0; + // Using this constructor saves reallocation when creating the + // coefficients. + Grid_Generator gg(g); + + // Enforce normalization. + gg.strong_normalize(); + return gg; +} + +void +PPL::Grid_Generator::coefficient_swap(Grid_Generator& y) { + // Swap one coefficient at a time into *this. Doing this instead of + // swapping the entire row ensures that the row keeps the same + // capacity. + if (y.is_line()) + set_is_line(); + else + set_is_ray_or_point(); + assert(size() > 0); + assert(y.size() > 0); + dimension_type sz = size() - 1; + dimension_type y_sz = y.size() - 1; + // Swap parameter divisors. + std::swap(operator[](sz), y[y_sz]); + for (dimension_type j = (sz > y_sz ? y_sz : sz); j-- > 0; ) + std::swap(operator[](j), y[j]); +} + +void +PPL::Grid_Generator::ascii_dump(std::ostream& s) const { + const Grid_Generator& 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] << ' '; + switch (x.type()) { + case Generator::LINE: + s << "L"; + break; + case Generator::RAY: + s << "Q"; + break; + case Generator::POINT: + s << "P"; + break; + } + s << "\n"; +} + +PPL_OUTPUT_DEFINITIONS(Grid_Generator) + +bool +PPL::Grid_Generator::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; + + Row& x = *this; + const dimension_type old_size = x.size(); + if (new_size < old_size) + x.shrink(new_size); + else if (new_size > old_size) { + Row y(new_size, Row::Flags()); + x.swap(y); + } + + for (dimension_type col = 0; col < new_size; ++col) + if (!(s >> x[col])) + return false; + + if (!(s >> str)) + return false; + if (str == "L") + set_is_line(); + else if (str == "P" || str == "Q") + set_is_ray_or_point(); + else + return false; + + return true; +} + +void +PPL::Grid_Generator::set_is_parameter() { + if (is_line()) + set_is_parameter_or_point(); + else if (!is_line_or_parameter()) { + // The generator is a point. + Generator::operator[](size() - 1) = Generator::operator[](0); + Generator::operator[](0) = 0; + } +} + +bool +PPL::Grid_Generator::is_equivalent_to(const Grid_Generator& y) const { + const Grid_Generator& x = *this; + dimension_type x_space_dim = x.space_dimension(); + if (x_space_dim != y.space_dimension()) + return false; + + const Type x_type = x.type(); + if (x_type != y.type()) + return false; + + Grid_Generator tmp = *this; + Grid_Generator tmp_y = y; + dimension_type& last = x_space_dim; + ++last; + if (x_type == POINT || x_type == LINE) { + tmp[last] = 0; + tmp_y[last] = 0; + } + // Normalize the copies, including the divisor column. + tmp.Row::normalize(); + tmp_y.Row::normalize(); + // Check for equality. + while (last-- > 0) + if (tmp[last] != tmp_y[last]) + return false; + return true; +} + +bool +PPL::Grid_Generator::is_equal_to(const Grid_Generator& y) const { + if (type() != y.type()) + return false; + for (dimension_type col = (is_parameter() ? size() : size() - 1); + col-- > 0; ) + if (Generator::operator[](col) != y.Generator::operator[](col)) + return false; + return true; +} + +bool +PPL::Grid_Generator::all_homogeneous_terms_are_zero() const { + // Start at size() - 1 to avoid the extra grid generator column. + for (dimension_type i = size() - 1; --i > 0; ) + if (operator[](i) != 0) + return false; + return true; +} + +void +PPL::Grid_Generator::scale_to_divisor(Coefficient_traits::const_reference d) { + if (is_parameter_or_point()) { + if (d == 0) + throw std::invalid_argument("PPL::Grid_Generator::scale_to_divisor(d):\n" + "d == 0."); + + PPL_DIRTY_TEMP_COEFFICIENT(factor); + exact_div_assign(factor, d, divisor()); + set_divisor(d); + assert(factor > 0); + if (factor > 1) + for (dimension_type col = size() - 2; col >= 1; --col) + Generator::operator[](col) *= factor; + } +} + +const PPL::Grid_Generator* PPL::Grid_Generator::zero_dim_point_p = 0; + +void +PPL::Grid_Generator::initialize() { + assert(zero_dim_point_p == 0); + zero_dim_point_p + = new Grid_Generator(grid_point()); +} + +void +PPL::Grid_Generator::finalize() { + assert(zero_dim_point_p != 0); + delete zero_dim_point_p; + zero_dim_point_p = 0; +} + +/*! \relates Parma_Polyhedra_Library::Grid_Generator */ +std::ostream& +PPL::IO_Operators::operator<<(std::ostream& s, const Grid_Generator& g) { + bool need_divisor = false; + bool extra_parentheses = false; + const dimension_type num_variables = g.space_dimension(); + Grid_Generator::Type t = g.type(); + switch (t) { + case Grid_Generator::LINE: + s << "l("; + break; + case Grid_Generator::PARAMETER: + s << "q("; + if (g[num_variables + 1] == 1) + break; + goto any_point; + case Grid_Generator::POINT: + s << "p("; + if (g[0] > 1) { + any_point: + need_divisor = true; + dimension_type num_non_zero_coefficients = 0; + for (dimension_type v = 0; v < num_variables; ++v) + if (g[v+1] != 0) + if (++num_non_zero_coefficients > 1) { + extra_parentheses = true; + s << "("; + break; + } + } + break; + } + + PPL_DIRTY_TEMP_COEFFICIENT(gv); + bool first = true; + for (dimension_type v = 0; v < num_variables; ++v) { + gv = g[v+1]; + if (gv != 0) { + if (!first) { + if (gv > 0) + s << " + "; + else { + s << " - "; + neg_assign(gv); + } + } + else + first = false; + if (gv == -1) + s << "-"; + else if (gv != 1) + s << gv << "*"; + s << PPL::Variable(v); + } + } + if (first) + // A generator in the origin. + s << 0; + if (extra_parentheses) + s << ")"; + if (need_divisor) + s << "/" << g.divisor(); + s << ")"; + return s; +} + +/*! \relates Parma_Polyhedra_Library::Grid_Generator */ +std::ostream& +PPL::IO_Operators::operator<<(std::ostream& s, + const Grid_Generator::Type& t) { + const char* n = 0; + switch (t) { + case Grid_Generator::LINE: + n = "LINE"; + break; + case Grid_Generator::PARAMETER: + n = "PARAMETER"; + break; + case Generator::POINT: + n = "POINT"; + break; + } + s << n; + return s; +} + +bool +PPL::Grid_Generator::OK() const { + if (!is_necessarily_closed()) { +#ifndef NDEBUG + std::cerr << "Grid_Generator should be necessarily closed." + << std::endl; +#endif + return false; + } + + // Topology consistency check. + if (size() < 1) { +#ifndef NDEBUG + std::cerr << "Grid_Generator has fewer coefficients than the minimum " + << "allowed:" << std::endl + << "size is " << size() << ", minimum is 1." << std::endl; +#endif + return false; + } + + switch (type()) { + case Grid_Generator::LINE: + if (operator[](0) != 0) { +#ifndef NDEBUG + std::cerr << "Inhomogeneous terms of lines must be zero!" + << std::endl; +#endif + return false; + } + break; + + case Grid_Generator::PARAMETER: + if (operator[](0) != 0) { +#ifndef NDEBUG + std::cerr << "Inhomogeneous terms of parameters must be zero!" + << std::endl; +#endif + return false; + } + // Fall through. + + case Grid_Generator::POINT: + if (divisor() <= 0) { +#ifndef NDEBUG + std::cerr << "Points and parameters must have positive divisors!" + << std::endl; +#endif + return false; + } + break; + + } + + // All tests passed. + return true; +} diff --git a/src/Grid_Generator.defs.hh b/src/Grid_Generator.defs.hh new file mode 100644 index 0000000..f94c1ab --- /dev/null +++ b/src/Grid_Generator.defs.hh @@ -0,0 +1,535 @@ +/* Grid_Generator class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Grid_Generator_defs_hh +#define PPL_Grid_Generator_defs_hh 1 + +#include "Grid_Generator.types.hh" +#include "Coefficient.defs.hh" +#include "Grid_Generator_System.defs.hh" +#include "Generator.defs.hh" +#include "Grid.types.hh" +#include + +namespace Parma_Polyhedra_Library { + +// Put these in the namespace here to declare them friend later. + +namespace IO_Operators { + +//! Output operator. +/*! \relates Parma_Polyhedra_Library::Grid_Generator */ +std::ostream& operator<<(std::ostream& s, const Grid_Generator& g); + +} // namespace IO_Operators + +} // namespace Parma_Polyhedra_Library + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Grid_Generator */ +void swap(Parma_Polyhedra_Library::Grid_Generator& x, + Parma_Polyhedra_Library::Grid_Generator& y); + +} // namespace std + +//! 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 (grid_line, parameter + or grid_point) 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 divisor 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 + x, y and z + 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 point 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 grid_point (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 g1 is a grid point having coordinates + \f$(a_0, \ldots, a_{n-1})^\transpose\f$, + we construct the parameter g2 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 coefficient with the notion of coordinate: + these are equivalent only when the divisor is 1. +*/ +class Parma_Polyhedra_Library::Grid_Generator : private Generator { +public: + //! Returns the line of direction \p e. + /*! + \exception std::invalid_argument + Thrown if the homogeneous part of \p e represents the origin of + the vector space. + */ + static Grid_Generator grid_line(const Linear_Expression& e); + + //! Returns the parameter of direction \p e and size \p e/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 parameter(const Linear_Expression& e + = Linear_Expression::zero(), + Coefficient_traits::const_reference d + = Coefficient_one()); + + //! Returns the point at \p e / \p d. + /*! + Both \p e and \p d are optional arguments, with default values + Linear_Expression::zero() and Coefficient_one(), respectively. + + \exception std::invalid_argument + Thrown if \p d is zero. + */ + static Grid_Generator grid_point(const Linear_Expression& e + = Linear_Expression::zero(), + Coefficient_traits::const_reference d + = Coefficient_one()); + + //! Ordinary copy-constructor. + Grid_Generator(const Grid_Generator& g); + + //! Destructor. + ~Grid_Generator(); + + //! Assignment operator. + Grid_Generator& operator=(const Grid_Generator& g); + + //! Assignment operator. + Grid_Generator& operator=(const Generator& g); + + //! 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; + + //! 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 true if and only if \p *this is a line. + bool is_line() const; + + //! Returns true if and only if \p *this is a parameter. + bool is_parameter() const; + + /*! \brief + Returns true if and only if \p *this is a line or + a parameter. + */ + bool is_line_or_parameter() const; + + //! Returns true if and only if \p *this is a point. + bool is_point() const; + + /*! \brief + Returns true 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 true 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 true if \p *this is exactly equal to \p y. + bool is_equal_to(const Grid_Generator& y) const; + + /*! \brief + Returns true 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 + Returns true if and only if all the homogeneous terms + of \p *this are \f$0\f$. + */ + bool all_homogeneous_terms_are_zero() const; + + PPL_OUTPUT_DECLARATIONS + + /*! \brief + Loads from \p s an ASCII representation (as produced by + ascii_dump(std::ostream&) const) and sets \p *this accordingly. + Returns true if successful, false otherwise. + */ + bool ascii_load(std::istream& s); + + //! Checks if all the invariants are satisfied. + bool OK() const; + + //! Swaps \p *this with \p y. + void swap(Grid_Generator& y); + + /*! \brief + Swaps \p *this with \p y, leaving \p *this with the original + capacity. + + All elements up to and including the last element of the smaller + of \p *this and \p y are swapped. The parameter divisor element + of \p y is swapped with the divisor element of \p *this. + */ + void coefficient_swap(Grid_Generator& y); + +private: + /*! \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; + + /*! \brief + Scales \p *this to be represented with a divisor of \p d (if + \*this is a parameter or point). + + It is assumed that \p d is a multiple of the current divisor. + + \exception std::invalid_argument + Thrown if \p d is zero. + */ + void scale_to_divisor(Coefficient_traits::const_reference d); + + /*! \brief + Constructs from polyhedron generator \p g, stealing the underlying + data structures from \p g. + + The last column in \p g becomes the parameter divisor column of + the new Grid_Generator. + */ + explicit Grid_Generator(Generator g); + + //! Returns the actual size of \p this. + dimension_type size() const; + + //! Negates the elements from index \p start to index \p end. + void negate(dimension_type start, dimension_type end); + + //! 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); + + //! Sets the Linear_Row kind to LINE_OR_EQUALITY. + void set_is_line(); + + //! Sets the Linear_Row kind to RAY_OR_POINT_OR_INEQUALITY. + void set_is_parameter_or_point(); + + //! Converts the Grid_Generator into a parameter. + void set_is_parameter(); + + /*! \brief + Strong normalization: ensures that different Grid_Generator + objects represent different hyperplanes or hyperspaces. + + Applies both Linear_Row::normalize() and Linear_Row::sign_normalize(). + + This is simply a wrapper around the Generator::strong_normalize, + which means applying it to a parameter may change the parameter. + */ + void strong_normalize(); + + //! Returns a reference to the element of the row indexed by \p k. + Coefficient& operator[](dimension_type k); + + //! Returns a constant reference to the element of the row indexed by \p k. + Coefficient_traits::const_reference operator[](dimension_type k) const; + + /*! \brief + Throw a std::invalid_argument exception containing + the appropriate error message. + */ + void + throw_invalid_argument(const char* method, const char* reason) const; + + friend std::ostream& + IO_Operators::operator<<(std::ostream& s, const Grid_Generator& g); + // FIXME: The following friend declaration is for operator[] and + // divisor() access in Grid::conversion, Grid::simplify, + // Grid::relation_with(c) and Grid::Grid(box, *). + friend class Grid; + friend class Grid_Generator_System; + friend class Grid_Generator_System::const_iterator; + friend class Congruence_System; + friend class Scalar_Products; + friend class Topology_Adjusted_Scalar_Product_Sign; + friend class Linear_Expression; +}; + + +namespace Parma_Polyhedra_Library { + +/*! \brief + Shorthand for Grid_Generator + Grid_Generator::grid_line(const Linear_Expression& e). +*/ +/*! \relates Grid_Generator */ +Grid_Generator grid_line(const Linear_Expression& e); + +/*! \brief + Shorthand for Grid_Generator + Grid_Generator::parameter(const Linear_Expression& e, + Coefficient_traits::const_reference d). +*/ +/*! \relates Grid_Generator */ +Grid_Generator +parameter(const Linear_Expression& e = Linear_Expression::zero(), + Coefficient_traits::const_reference d = Coefficient_one()); + +/*! \brief + Shorthand for Grid_Generator + Grid_Generator::grid_point(const Linear_Expression& e, + Coefficient_traits::const_reference d). +*/ +/*! \relates Grid_Generator */ +Grid_Generator +grid_point(const Linear_Expression& e = Linear_Expression::zero(), + Coefficient_traits::const_reference d = Coefficient_one()); + +//! Returns true 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 true 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..5527687 --- /dev/null +++ b/src/Grid_Generator.inlines.hh @@ -0,0 +1,240 @@ +/* Grid Generator class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Grid_Generator_inlines_hh +#define PPL_Grid_Generator_inlines_hh 1 + +namespace Parma_Polyhedra_Library { + +inline +Grid_Generator::Grid_Generator(const Grid_Generator& g) + : Generator(g) { +} + +inline +Grid_Generator::~Grid_Generator() { +} + +inline +Grid_Generator::Grid_Generator(Generator g) + : Generator(Generator::point()) { + Generator::swap(g); +} + +inline dimension_type +Grid_Generator::size() const { + return Generator::size(); +} + +inline dimension_type +Grid_Generator::max_space_dimension() { + return Generator::max_space_dimension() - 1; +} + +inline Coefficient& +Grid_Generator::operator[](dimension_type k) { + return Generator::operator[](k); +} + +inline Coefficient_traits::const_reference +Grid_Generator::operator[](dimension_type k) const { + return Generator::operator[](k); +} + +inline dimension_type +Grid_Generator::space_dimension() const { + return Generator::space_dimension() - 1; +} + +inline Grid_Generator::Type +Grid_Generator::type() const { + switch (Generator::type()) { + case Generator::POINT: + return POINT; + case Generator::RAY: + return PARAMETER; + case Generator::LINE: + return LINE; + case Generator::CLOSURE_POINT: + default: + assert(false); + return POINT; + } +} + +inline bool +Grid_Generator::is_line() const { + return Generator::is_line(); +} + +inline bool +Grid_Generator::is_parameter() const { + return is_ray(); +} + +inline bool +Grid_Generator::is_line_or_parameter() const { + return is_line_or_ray(); +} + +inline bool +Grid_Generator::is_point() const { + return Generator::is_point(); +} + +inline bool +Grid_Generator::is_parameter_or_point() const { + return is_ray_or_point_or_inequality(); +} + +inline void +Grid_Generator::set_divisor(Coefficient_traits::const_reference d) { + assert(!is_line()); + if (is_line_or_parameter()) + Generator::operator[](size() - 1) = d; + else + Generator::operator[](0) = 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 Generator::operator[](size() - 1); + else + return Generator::operator[](0); +} + +inline bool +Grid_Generator::is_equal_at_dimension(dimension_type dim, + const Grid_Generator& gg) const { + return operator[](dim) * gg.divisor() == gg[dim] * divisor(); +} + +inline void +Grid_Generator::set_is_line() { + Generator::set_is_line(); +} + +inline void +Grid_Generator::set_is_parameter_or_point() { + Generator::set_is_ray_or_point(); +} + +inline Grid_Generator& +Grid_Generator::operator=(const Grid_Generator& g) { + Generator::operator=(g); + return *this; +} + +inline Grid_Generator& +Grid_Generator::operator=(const Generator& g) { + Generator::operator=(g); + return *this; +} + +inline void +Grid_Generator::negate(dimension_type start, dimension_type end) { + while (start <= end) + neg_assign(operator[](start++)); +} + +inline Coefficient_traits::const_reference +Grid_Generator::coefficient(const Variable v) const { + if (v.space_dimension() > space_dimension()) + throw_dimension_incompatible("coefficient(v)", "v", v); + return Generator::coefficient(v); +} + +inline memory_size_type +Grid_Generator::total_memory_in_bytes() const { + return Generator::total_memory_in_bytes(); +} + +inline memory_size_type +Grid_Generator::external_memory_in_bytes() const { + return Generator::external_memory_in_bytes(); +} + +inline const Grid_Generator& +Grid_Generator::zero_dim_point() { + assert(zero_dim_point_p != 0); + return *zero_dim_point_p; +} + +inline void +Grid_Generator::strong_normalize() { + Generator::strong_normalize(); +} + +inline void +Grid_Generator::swap(Grid_Generator& y) { + Generator::swap(y); +} + +/*! \relates Grid_Generator */ +inline bool +operator==(const Grid_Generator& x, const Grid_Generator& y) { + return x.is_equivalent_to(y); +} + +/*! \relates Grid_Generator */ +inline bool +operator!=(const Grid_Generator& x, const Grid_Generator& y) { + return !(x == y); +} + +/*! \relates Grid_Generator */ +inline Grid_Generator +grid_line(const Linear_Expression& e) { + return Grid_Generator::grid_line(e); +} + +/*! \relates Grid_Generator */ +inline Grid_Generator +parameter(const Linear_Expression& e, + Coefficient_traits::const_reference d) { + return Grid_Generator::parameter(e, d); +} + +/*! \relates Grid_Generator */ +inline Grid_Generator +grid_point(const Linear_Expression& e, + Coefficient_traits::const_reference d) { + return Grid_Generator::grid_point(e, d); +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Grid_Generator */ +inline void +swap(Parma_Polyhedra_Library::Grid_Generator& x, + Parma_Polyhedra_Library::Grid_Generator& y) { + x.swap(y); +} + +} // namespace std + +#endif // !defined(PPL_Grid_Generator_inlines_hh) diff --git a/src/Grid_Generator.types.hh b/src/Grid_Generator.types.hh new file mode 100644 index 0000000..1c3b584 --- /dev/null +++ b/src/Grid_Generator.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PPL_Grid_Generator_types_hh +#define PPL_Grid_Generator_types_hh 1 + +namespace Parma_Polyhedra_Library { + +class Grid_Generator; + +} + +#endif // !defined(PPL_Grid_Generator_types_hh) diff --git a/src/Grid_Generator_System.cc b/src/Grid_Generator_System.cc new file mode 100644 index 0000000..165cbf3 --- /dev/null +++ b/src/Grid_Generator_System.cc @@ -0,0 +1,377 @@ +/* Grid_Generator_System class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include +#include "Grid_Generator_System.defs.hh" +#include "Grid_Generator_System.inlines.hh" +#include "Scalar_Products.defs.hh" +#include "Variables_Set.defs.hh" +#include +#include + +namespace PPL = Parma_Polyhedra_Library; + +void +PPL::Grid_Generator_System::recycling_insert(Grid_Generator_System& gs) { + const dimension_type old_num_rows = num_rows(); + const dimension_type gs_num_rows = gs.num_rows(); + const dimension_type old_num_columns = num_columns(); + const dimension_type gs_num_columns = gs.num_columns(); + if (old_num_columns >= gs_num_columns) + add_zero_rows(gs_num_rows, + Linear_Row::Flags(NECESSARILY_CLOSED, + Linear_Row::RAY_OR_POINT_OR_INEQUALITY)); + else { + add_zero_rows_and_columns(gs_num_rows, + gs_num_columns - old_num_columns, + Linear_Row::Flags(NECESSARILY_CLOSED, + Linear_Row::RAY_OR_POINT_OR_INEQUALITY)); + // Swap the parameter divisor column into the new last column. + swap_columns(old_num_columns - 1, num_columns() - 1); + } + set_index_first_pending_row(old_num_rows + gs_num_rows); + // Swap one coefficient at a time into the newly added rows, instead + // of swapping each entire row. This ensures that the added rows + // have the same capacities as the existing rows. + for (dimension_type i = gs_num_rows; i-- > 0; ) + operator[](old_num_rows + i).coefficient_swap(gs[i]); +} + +void +PPL::Grid_Generator_System::recycling_insert(Grid_Generator& g) { + dimension_type old_num_rows = num_rows(); + const dimension_type old_num_columns = num_columns(); + const dimension_type g_num_columns = g.size(); + if (old_num_columns >= g_num_columns) + add_zero_rows(1, + Linear_Row::Flags(NECESSARILY_CLOSED, + Linear_Row::RAY_OR_POINT_OR_INEQUALITY)); + else { + add_zero_rows_and_columns(1, + g_num_columns - old_num_columns, + Linear_Row::Flags(NECESSARILY_CLOSED, + Linear_Row::RAY_OR_POINT_OR_INEQUALITY)); + // Swap the parameter divisor column into the new last column. + swap_columns(old_num_columns - 1, num_columns() - 1); + } + set_index_first_pending_row(old_num_rows + 1); + // Swap one coefficient at a time into the newly added rows, instead + // of swapping each entire row. This ensures that the added rows + // have the same capacities as the existing rows. + operator[](old_num_rows).coefficient_swap(g); +} + +void +PPL::Grid_Generator_System::insert(const Grid_Generator& g) { + dimension_type g_space_dim = g.space_dimension(); + + if (g.is_parameter()) + if (g.all_homogeneous_terms_are_zero()) { + dimension_type initial_space_dim = space_dimension(); + if (initial_space_dim < g_space_dim) { + // Adjust the space dimension. + add_zero_columns(g_space_dim - initial_space_dim); + // Swap the parameter divisor column into the new last column. + swap_columns(g_space_dim + 1, initial_space_dim + 1); + assert(OK()); + } + return; + } + + { + // This block is a substitute for Generator_System::insert, in + // which the single call to Linear_System::insert has been + // inlined. + + // We are sure that the matrix has no pending rows + // and that the new row is not a pending generator. + assert(num_pending_rows() == 0); + + // TODO: Consider whether, if possible, it would be better to wrap + // an NNC Generator, storing the generator divisor in the + // epsilon column. + + // This is a modified copy of Linear_System::insert. It is here + // to force Grid_Generator::OK to be used (to work around the + // normalization assertions in Linear_System::OK) and so that the + // parameter divisor column can be moved during the insert. + + // The added row must be strongly normalized and have the same + // topology as the system. + assert(topology() == g.topology()); + // This method is only used when the system has no pending rows. + assert(num_pending_rows() == 0); + + const dimension_type old_num_rows = num_rows(); + const dimension_type old_num_columns = num_columns(); + const dimension_type g_size = g.size(); + + // Resize the system, if necessary. + assert(is_necessarily_closed()); + if (g_size > old_num_columns) { + add_zero_columns(g_size - old_num_columns); + if (old_num_rows > 0) + // Swap the existing parameter divisor column into the new + // last column. + swap_columns(old_num_columns - 1, g_size - 1); + Matrix::add_row(g); + } + else if (g_size < old_num_columns) + if (old_num_rows == 0) + Matrix::add_row(Linear_Row(g, old_num_columns, row_capacity)); + else { + // Create a resized copy of the row (and move the parameter + // divisor coefficient to its last position). + Linear_Row tmp_row(g, old_num_columns, row_capacity); + std::swap(tmp_row[g_size - 1], tmp_row[old_num_columns - 1]); + Matrix::add_row(tmp_row); + } + else + // Here r_size == old_num_columns. + Matrix::add_row(g); + + } // Generator_System::insert(g) substitute. + + set_index_first_pending_row(num_rows()); + set_sorted(false); + + assert(OK()); +} + +void +PPL::Grid_Generator_System +::affine_image(dimension_type v, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator) { + // This is mostly a copy of Generator_System::affine_image. + + Grid_Generator_System& x = *this; + // `v' is the index of a column corresponding to a "user" variable + // (i.e., it cannot be the inhomogeneous term). + assert(v > 0 && v <= x.space_dimension()); + assert(expr.space_dimension() <= x.space_dimension()); + assert(denominator > 0); + + const dimension_type num_columns = x.num_columns(); + 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 = x[i]; + Scalar_Products::assign(numerator, expr, row); + std::swap(numerator, row[v]); + } + + if (denominator != 1) + // Since we want integer elements in the matrix, + // we multiply by `denominator' all the columns of `*this' + // having an index different from `v'. + for (dimension_type i = num_rows; i-- > 0; ) { + Grid_Generator& row = x[i]; + for (dimension_type j = num_columns; j-- > 0; ) + if (j != v) + row[j] *= denominator; + } + + // If the mapping is not invertible we may have transformed valid + // lines and rays into the origin of the space. + const bool not_invertible = (v > expr.space_dimension() || expr[v] == 0); + if (not_invertible) + x.remove_invalid_lines_and_rays(); +} + +PPL_OUTPUT_DEFINITIONS(Grid_Generator_System) + +void +PPL::Grid_Generator_System::ascii_dump(std::ostream& s) const { + const dimension_type num_rows = this->num_rows(); + s << num_rows << " x " << num_columns() << '\n'; + for (dimension_type i = 0; i < num_rows; ++i) + operator[](i).ascii_dump(s); +} + +bool +PPL::Grid_Generator_System::ascii_load(std::istream& s) { + dimension_type num_rows; + dimension_type num_columns; + if (!(s >> num_rows)) + return false; + std::string str; + if (!(s >> str) || str != "x") + return false; + if (!(s >> num_columns)) + return false; + resize_no_copy(num_rows, num_columns); + + set_sorted(false); + set_index_first_pending_row(num_rows); + + Grid_Generator_System& x = *this; + for (dimension_type i = 0; i < num_rows; ++i) + if (!x[i].ascii_load(s)) + return false; + + // Check invariants. + assert(OK()); + + return true; +} + +const PPL::Grid_Generator_System* +PPL::Grid_Generator_System::zero_dim_univ_p = 0; + +void +PPL::Grid_Generator_System::initialize() { + 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() { + assert(zero_dim_univ_p != 0); + delete zero_dim_univ_p; + zero_dim_univ_p = 0; +} + +bool +PPL::Grid_Generator_System::OK() const { + if (topology() == NOT_NECESSARILY_CLOSED) { +#ifndef NDEBUG + std::cerr << "Grid_Generator_System is NOT_NECESSARILY_CLOSED" + << std::endl; +#endif + return false; + } + + if (is_sorted()) { +#ifndef NDEBUG + std::cerr << "Grid_Generator_System is marked as sorted." + << std::endl; +#endif + return false; + } + + // A Generator_System and hence a Grid_Generator_System must be a + // valid Linear_System; do not check for strong normalization, since + // this will be done when checking each individual generator. + if (!Linear_System::OK(false)) + return false; + + // Checking each generator in the system. + const Grid_Generator_System& x = *this; + for (dimension_type i = num_rows(); i-- > 0; ) + if (!x[i].OK()) + return false; + + // All checks passed. + return true; +} + +/*! \relates Parma_Polyhedra_Library::Grid_Generator_System */ +std::ostream& +PPL::IO_Operators::operator<<(std::ostream& s, + const Grid_Generator_System& gs) { + Grid_Generator_System::const_iterator i = gs.begin(); + const Grid_Generator_System::const_iterator gs_end = gs.end(); + if (i == gs_end) + return s << "false"; + while (true) { + s << *i++; + if (i == gs_end) + return s; + s << ", "; + } +} + +void +PPL::Grid_Generator_System +::add_universe_rows_and_columns(dimension_type dims) { + assert(num_columns() > 0); + dimension_type col = num_columns() - 1; + add_zero_rows_and_columns(dims, dims, + Linear_Row::Flags(NECESSARILY_CLOSED, + Linear_Row::LINE_OR_EQUALITY)); + unset_pending_rows(); + // Swap the parameter divisor column into the new last column. + swap_columns(col, col + dims); + // Set the diagonal element of each added rows. + dimension_type num_rows = this->num_rows(); + for (dimension_type row = num_rows - dims; row < num_rows; ++row, ++col) + const_cast(operator[](row)[col]) = 1; +} + +void +PPL::Grid_Generator_System +::remove_space_dimensions(const Variables_Set& to_be_removed) { + // Dimension-compatibility assertion. + assert(space_dimension() >= to_be_removed.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 (to_be_removed.empty()) + return; + + // For each variable to be removed, replace the corresponding column + // by shifting left the columns to the right that will be kept. + Variables_Set::const_iterator tbr = to_be_removed.begin(); + Variables_Set::const_iterator tbr_end = to_be_removed.end(); + dimension_type dst_col = *tbr+1; + dimension_type src_col = dst_col + 1; + for (++tbr; tbr != tbr_end; ++tbr) { + const dimension_type tbr_col = *tbr+1; + // Move all columns in between to the left. + while (src_col < tbr_col) + Matrix::swap_columns(dst_col++, src_col++); + ++src_col; + } + // Move any remaining columns. + const dimension_type num_columns = this->num_columns(); + while (src_col < num_columns) + Matrix::swap_columns(dst_col++, src_col++); + + // The number of remaining columns is `dst_col'. + Matrix::remove_trailing_columns(num_columns - dst_col); +} + +void +PPL::Grid_Generator_System +::remove_higher_space_dimensions(const dimension_type new_dimension) { + dimension_type space_dim = space_dimension(); + + assert(new_dimension <= space_dim); + + // The removal of no dimensions from any system is a no-op. Note + // that this case also captures the only legal removal of dimensions + // from a system in a 0-dim space. + if (new_dimension == space_dim) + return; + + // Swap the parameter divisor column into the column that will + // become the last column. + swap_columns(new_dimension + 1, space_dim + 1); + Matrix::remove_trailing_columns(space_dim - new_dimension); + assert(OK()); +} diff --git a/src/Grid_Generator_System.defs.hh b/src/Grid_Generator_System.defs.hh new file mode 100644 index 0000000..2fa3770 --- /dev/null +++ b/src/Grid_Generator_System.defs.hh @@ -0,0 +1,518 @@ +/* Grid_Generator_System class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Grid_Generator_System_defs_hh +#define PPL_Grid_Generator_System_defs_hh 1 + +#include "Grid_Generator_System.types.hh" +#include "Generator_System.defs.hh" +#include "Grid_Generator.types.hh" +#include "Variables_Set.types.hh" +#include + +namespace Parma_Polyhedra_Library { + +namespace IO_Operators { + +//! Output operator. +/*! + \relates Parma_Polyhedra_Library::Grid_Generator_System + Writes false if \p gs is empty. Otherwise, writes on + \p s the generators of \p gs, all in one row and separated by ", ". +*/ +std::ostream& operator<<(std::ostream& s, const Grid_Generator_System& gs); + +} // namespace IO_Operators + +//! Returns true if and only if \p x and \p y are identical. +/*! \relates Grid_Generator_System */ +bool operator==(const Grid_Generator_System& x, + const Grid_Generator_System& y); + +} // namespace Parma_Polyhedra_Library + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Grid_Generator_System */ +void swap(Parma_Polyhedra_Library::Grid_Generator_System& x, + Parma_Polyhedra_Library::Grid_Generator_System& y); + +} // namespace std + + +//! A system of grid generators. +/*! \ingroup PPL_CXX_interface + An object of the class Grid_Generator_System is a system of + grid generators, i.e., a multiset of objects of the class + Grid_Generator (lines, parameters and points). + When inserting generators in a system, space dimensions are + automatically adjusted so that all the generators in the system + are defined on the same vector space. + A system of grid generators which is meant to define a non-empty + grid must include at least one point: the reason is that + lines and parameters need a supporting point + (lines only specify directions while parameters only + specify direction and distance. + + \par + In all the examples it is assumed that variables + x and y 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 exact copy of them + can be retrieved: + in general, only an equivalent grid generator system + will be available, where original generators may have been + reordered, removed (if they are duplicate or redundant), etc. +*/ +class Parma_Polyhedra_Library::Grid_Generator_System + : private Generator_System { +public: + //! Default constructor: builds an empty system of generators. + Grid_Generator_System(); + + //! Builds the singleton system containing only generator \p g. + explicit Grid_Generator_System(const Grid_Generator& g); + + //! Builds an empty system of generators of dimension \p dim. + explicit Grid_Generator_System(dimension_type dim); + + //! Ordinary copy-constructor. + Grid_Generator_System(const Grid_Generator_System& gs); + + //! Destructor. + ~Grid_Generator_System(); + + //! Assignment operator. + Grid_Generator_System& operator=(const Grid_Generator_System& y); + + //! Returns the maximum space dimension a Grid_Generator_System can handle. + static dimension_type max_space_dimension(); + + //! Returns the dimension of the vector space enclosing \p *this. + dimension_type space_dimension() const; + + /*! \brief + Removes all the generators from the generator system and sets its + space dimension to 0. + */ + void clear(); + + /*! \brief + Inserts into \p *this a copy of the generator \p g, increasing the + number of space dimensions if needed. + + If \p g is an all-zero parameter then the only action is to ensure + that the space dimension of \p *this is at least the space + dimension of \p g. + */ + void insert(const Grid_Generator& g); + + /*! \brief + Inserts into \p *this the generator \p g, increasing the number of + space dimensions if needed. + */ + void recycling_insert(Grid_Generator& g); + + /*! \brief + Inserts into \p *this the generators in \p gs, increasing the + number of space dimensions if needed. + */ + void recycling_insert(Grid_Generator_System& gs); + + //! 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 gr: + \code + const Grid_Generator_System& gs = gr.generators(); + for (Grid_Generator_System::const_iterator i = gs.begin(), + gs_end = gs.end(); i != gs_end; ++i) + cout << *i << endl; + \endcode + The same effect can be obtained more concisely by using + more features of the STL: + \code + const Generator_System& gs = gr.generators(); + copy(gs.begin(), gs.end(), ostream_iterator(cout, "\n")); + \endcode + */ + class const_iterator + : public std::iterator, + private Generator_System::const_iterator { + public: + //! Default constructor. + const_iterator(); + + //! Ordinary copy-constructor. + const_iterator(const const_iterator& y); + + //! Destructor. + ~const_iterator(); + + //! Assignment operator. + const_iterator& operator=(const const_iterator& y); + + //! Dereference operator. + const Grid_Generator& operator*() const; + + //! Indirect member selector. + const Grid_Generator* operator->() const; + + //! Prefix increment operator. + const_iterator& operator++(); + + //! Postfix increment operator. + const_iterator operator++(int); + + /*! \brief + Returns true if and only if \p *this and \p y are + identical. + */ + bool operator==(const const_iterator& y) const; + + /*! \brief + Returns true if and only if \p *this and \p y are + different. + */ + bool operator!=(const const_iterator& y) const; + + private: + friend class Grid_Generator_System; + + //! Copy-constructor from Generator_System::const_iterator. + const_iterator(const Generator_System::const_iterator& y); + }; + + //! Returns true 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 true if and only if \p *this contains one or + more points. + */ + bool has_points() const; + + //! Returns true 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. + /*! + Returns true if and only if \p *this is a valid + Linear_System and each row in the system is a valid Grid_Generator. + */ + bool OK() const; + + 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 true if successful, false 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 swap(Grid_Generator_System& y); + +private: + /*! \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 class Grid; + + friend bool + operator==(const Grid_Generator_System& x, const Grid_Generator_System& y); + + //! Sets the sortedness flag of the system to \p b. + void set_sorted(bool b); + + //! Sets the index to indicate that the system has no pending rows. + void unset_pending_rows(); + + //! Sets the index of the first pending row to \p i. + void set_index_first_pending_row(dimension_type i); + + //! Returns the \p k- th generator of the system. + Grid_Generator& operator[](dimension_type k); + + //! Returns a constant reference to the \p k- th generator of the system. + const Grid_Generator& operator[](dimension_type k) const; + + //! Assigns to a given variable an affine expression. + /*! + \param v + Index of the column to which the affine transformation is assigned; + + \param expr + The numerator of the affine transformation: + \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$; + + \param denominator + The denominator of the affine transformation; + + We allow affine transformations (see the Section \ref + rational_grid_operations)to have rational + coefficients. Since the coefficients of linear expressions are + integers we also provide an integer \p denominator that will + be used as denominator of the affine transformation. The + denominator is required to be a positive integer and its + default value is 1. + + The affine transformation assigns to each element of \p v -th + column the follow expression: + \f[ + \frac{\sum_{i = 0}^{n - 1} a_i x_i + b} + {\mathrm{denominator}}. + \f] + + \p expr is a constant parameter and unaltered by this computation. + */ + void affine_image(dimension_type v, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator); + + /*! \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); + + //! Removes all the specified dimensions from the generator system. + /*! + The space dimension of the variable with the highest space + dimension in \p to_be_removed must be at most the space dimension + of \p this. + */ + void remove_space_dimensions(const Variables_Set& to_be_removed); + + /*! \brief + Removes the higher dimensions of the system so that the resulting + system will have dimension \p new_dimension. + + The value of \p new_dimension must be at most the space dimension + of \p *this. + */ + void remove_higher_space_dimensions(dimension_type new_dimension); + + //! Resizes the system without worrying about the old contents. + /*! + \param new_num_rows + The number of rows of the resized system; + + \param new_num_columns + The number of columns of the resized system. + + The system is expanded to the specified dimensions avoiding + reallocation whenever possible. + The contents of the original system is lost. + */ + void resize_no_copy(dimension_type new_num_rows, + dimension_type new_num_columns); + + /*! \brief + Returns the number of columns of the matrix (i.e., the size of the + rows). + */ + dimension_type num_columns() const; + + /*! \brief + Erases from the matrix all the rows but those having an index less + than \p first_to_erase. + */ + void erase_to_end(dimension_type first_to_erase); + + //! Permutes the columns of the matrix. + /* + \param cycles + A vector representing the non-trivial cycles of the permutation + according to which the columns must be rearranged. + + The \p cycles vector contains, one after the other, the + non-trivial cycles (i.e., the cycles of length greater than one) + of a permutation of non-zero column indexes. Each cycle is + terminated by zero. For example, assuming the matrix has 6 + columns, the permutation \f$ \{ 1 \mapsto 3, 2 \mapsto 4, + 3 \mapsto 6, 4 \mapsto 2, 5 \mapsto 5, 6 \mapsto 1 \}\f$ can be + represented by the non-trivial cycles \f$(1 3 6)(2 4)\f$ that, in + turn can be represented by a vector of 6 elements containing 1, 3, + 6, 0, 2, 4, 0. + */ + void permute_columns(const std::vector& cycles); +}; + +// Grid_Generator_System.inlines.hh is not included here on purpose. + +#endif // !defined(PPL_Grid_Generator_System_defs_hh) diff --git a/src/Grid_Generator_System.inlines.hh b/src/Grid_Generator_System.inlines.hh new file mode 100644 index 0000000..7fa1339 --- /dev/null +++ b/src/Grid_Generator_System.inlines.hh @@ -0,0 +1,284 @@ +/* Grid_Generator_System class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Grid_Generator_System_inlines_hh +#define PPL_Grid_Generator_System_inlines_hh 1 + +#include "Grid_Generator.defs.hh" +#include "Generator_System.inlines.hh" + +namespace Parma_Polyhedra_Library { + +inline void +Grid_Generator_System::set_sorted(bool b) { + Generator_System::set_sorted(b); +} + +inline void +Grid_Generator_System::unset_pending_rows() { + Generator_System::unset_pending_rows(); +} + +inline void +Grid_Generator_System::set_index_first_pending_row(const dimension_type i) { + Generator_System::set_index_first_pending_row(i); +} + +inline void +Grid_Generator_System::resize_no_copy(const dimension_type new_num_rows, + const dimension_type new_num_columns) { + Generator_System::resize_no_copy(new_num_rows, new_num_columns); +} + +inline dimension_type +Grid_Generator_System::num_columns() const { + return Generator_System::num_columns(); +} + +inline void +Grid_Generator_System::erase_to_end(dimension_type first_to_erase) { + return Generator_System::erase_to_end(first_to_erase); +} + +inline void +Grid_Generator_System +::permute_columns(const std::vector& cycles) { + return Generator_System::permute_columns(cycles); +} + +inline bool +Grid_Generator_System::is_equal_to(const Grid_Generator_System& y) const { + return operator==(static_cast(*this), + static_cast(y)); +} + +inline +Grid_Generator_System::Grid_Generator_System() + : Generator_System(NECESSARILY_CLOSED) { + adjust_topology_and_space_dimension(NECESSARILY_CLOSED, 1); + set_sorted(false); +} + +inline +Grid_Generator_System::Grid_Generator_System(const Grid_Generator_System& gs) + : Generator_System(gs) { +} + +inline +Grid_Generator_System::Grid_Generator_System(dimension_type dim) + : Generator_System(NECESSARILY_CLOSED) { + adjust_topology_and_space_dimension(NECESSARILY_CLOSED, dim + 1); + set_sorted(false); +} + +inline +Grid_Generator_System::Grid_Generator_System(const Grid_Generator& g) + : Generator_System(g) { + set_sorted(false); +} + +inline +Grid_Generator_System::~Grid_Generator_System() { +} + +inline Grid_Generator_System& +Grid_Generator_System::operator=(const Grid_Generator_System& y) { + Generator_System::operator=(y); + return *this; +} + +inline dimension_type +Grid_Generator_System::max_space_dimension() { + // Grid generators use an extra column for the parameter divisor. + return Generator_System::max_space_dimension() - 1; +} + +inline dimension_type +Grid_Generator_System::space_dimension() const { + assert(Generator_System::space_dimension() > 0); + // Grid generators use an extra column for the parameter divisor. + return Generator_System::space_dimension() - 1; +} + +inline const Grid_Generator_System& +Grid_Generator_System::zero_dim_univ() { + assert(zero_dim_univ_p != 0); + return *zero_dim_univ_p; +} + +inline void +Grid_Generator_System::clear() { + Generator_System::clear(); + // For grid generators, two extra columns are needed. + add_zero_columns(2); + set_sorted(false); + unset_pending_rows(); +} + +inline void +Grid_Generator_System::swap(Grid_Generator_System& y) { + Generator_System::swap(y); +} + +inline memory_size_type +Grid_Generator_System::external_memory_in_bytes() const { + return Generator_System::external_memory_in_bytes(); +} + +inline memory_size_type +Grid_Generator_System::total_memory_in_bytes() const { + return Generator_System::total_memory_in_bytes(); +} + +inline dimension_type +Grid_Generator_System::num_rows() const { + return Generator_System::num_rows(); +} + +inline dimension_type +Grid_Generator_System::num_parameters() const { + return Generator_System::num_rays(); +} + +inline dimension_type +Grid_Generator_System::num_lines() const { + return Generator_System::num_lines(); +} + +inline +Grid_Generator_System::const_iterator::const_iterator() + : Generator_System::const_iterator() { +} + +inline +Grid_Generator_System::const_iterator::const_iterator(const const_iterator& y) + : Generator_System::const_iterator(y) { +} + +inline +Grid_Generator_System::const_iterator::~const_iterator() { +} + +inline +Grid_Generator_System::const_iterator& +Grid_Generator_System::const_iterator::operator=(const const_iterator& y) { + return static_cast + (Generator_System::const_iterator::operator=(y)); +} + +inline const Grid_Generator& +Grid_Generator_System::const_iterator::operator*() const { + return static_cast + (Generator_System::const_iterator::operator*()); +} + +inline const Grid_Generator* +Grid_Generator_System::const_iterator::operator->() const { + return static_cast + (Generator_System::const_iterator::operator->()); +} + +inline Grid_Generator_System::const_iterator& +Grid_Generator_System::const_iterator::operator++() { + return static_cast + (Generator_System::const_iterator::operator++()); +} + +inline Grid_Generator_System::const_iterator +Grid_Generator_System::const_iterator::operator++(int) { + const const_iterator tmp = *this; + operator++(); + return tmp; +} + +inline bool +Grid_Generator_System +::const_iterator::operator==(const const_iterator& y) const { + return Generator_System::const_iterator::operator==(y); +} + +inline bool +Grid_Generator_System +::const_iterator::operator!=(const const_iterator& y) const { + return Generator_System::const_iterator::operator!=(y); +} + +inline bool +Grid_Generator_System::empty() const { + return Generator_System::empty(); +} + +inline +Grid_Generator_System +::const_iterator::const_iterator(const Generator_System::const_iterator& y) + : Generator_System::const_iterator::const_iterator(y) { +} + +inline Grid_Generator_System::const_iterator +Grid_Generator_System::begin() const { + return static_cast + (Generator_System::begin()); +} + +inline Grid_Generator_System::const_iterator +Grid_Generator_System::end() const { + return static_cast + (Generator_System::end()); +} + +inline bool +Grid_Generator_System::has_points() const { + return Generator_System::has_points(); +} + +inline Grid_Generator& +Grid_Generator_System::operator[](const dimension_type k) { + return static_cast(Generator_System::operator[](k)); +} + +inline const Grid_Generator& +Grid_Generator_System::operator[](const dimension_type k) const { + return static_cast(Generator_System::operator[](k)); +} + +/*! \relates Grid_Generator_System */ +inline bool +operator==(const Grid_Generator_System& x, + const Grid_Generator_System& y) { + return x.is_equal_to(y); +} + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Constraint_System */ +inline void +swap(Parma_Polyhedra_Library::Grid_Generator_System& x, + Parma_Polyhedra_Library::Grid_Generator_System& y) { + x.swap(y); +} + +} // namespace std + +#endif // !defined(PPL_Grid_Generator_System_inlines_hh) diff --git a/src/Grid_Generator_System.types.hh b/src/Grid_Generator_System.types.hh new file mode 100644 index 0000000..2df385a --- /dev/null +++ b/src/Grid_Generator_System.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PPL_Grid_Generator_System_types_hh +#define PPL_Grid_Generator_System_types_hh 1 + +namespace Parma_Polyhedra_Library { + +class Grid_Generator_System; + +} + +#endif // !defined(PPL_Grid_Generator_System_types_hh) diff --git a/src/Grid_Status.cc b/src/Grid_Status.cc new file mode 100644 index 0000000..1738fd7 --- /dev/null +++ b/src/Grid_Status.cc @@ -0,0 +1,245 @@ +/* Grid::Status class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Grid.defs.hh" +#include +#include +#include + +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 true if the operation is successful, + returns false otherwise. + When successful, \p positive is set to true if the flag + is on; it is set to false 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. + 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..ee7dc0c --- /dev/null +++ b/src/Grid_Status.idefs.hh @@ -0,0 +1,167 @@ +/* Grid::Status class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Grid_Status_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: + - zero-dim universe: the grid is the zero-dimension + vector space \f$\Rset^0 = \{\cdot\}\f$; + - empty: the grid is the empty set; + - congruences up-to-date: the grid is correctly + characterized by the attached system of congruences, modulo the + processing of pending generators; + - generators up-to-date: the grid is correctly + characterized by the attached system of generators, modulo the + processing of pending congruences; + - congruences minimized: the non-pending part of the system + of congruences attached to the grid is in minimal form; + - generators minimized: the non-pending part of the system + of generators attached to the grid is in minimal form. + + Other supported assertions are: + - congruences pending + - generators pending + - congruences' saturation matrix up-to-date + - generators' saturation matrix up-to-date. + + Not all the conjunctions of these elementary assertions constitute + a legal Status. In fact: + - zero-dim universe excludes any other assertion; + - empty: excludes any other assertion; + - congruences pending and generators pending + are mutually exclusive; + - congruences pending implies both congruences minimized + and generators minimized; + - generators pending implies both congruences minimized + and generators minimized; + - congruences minimized implies congruences up-to-date; + - generators minimized implies generators up-to-date; + - congruences' saturation matrix up-to-date implies both + congruences up-to-date and generators up-to-date; + - generators' saturation matrix up-to-date implies both + congruences up-to-date and generators up-to-date. +*/ +class Status { +public: + //! By default Status is the zero-dim universe 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 true if successful, false 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 all bits in \p mask are set. + bool test_all(flags_t mask) const; + + //! Check whether at least one 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..2926e32 --- /dev/null +++ b/src/Grid_Status.inlines.hh @@ -0,0 +1,216 @@ +/* Grid::Status class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Grid_Status_inlines_hh +#define PPL_Grid_Status_inlines_hh 1 + +namespace Parma_Polyhedra_Library { + +inline +Grid::Status::Status(flags_t mask) + : flags(mask) { +} + +inline +Grid::Status::Status() + : flags(ZERO_DIM_UNIV) { +} + +inline bool +Grid::Status::test_all(flags_t mask) const { + return (flags & mask) == mask; +} + +inline bool +Grid::Status::test_any(flags_t mask) const { + return flags & mask; +} + +inline void +Grid::Status::set(flags_t mask) { + flags |= mask; +} + +inline void +Grid::Status::reset(flags_t mask) { + flags &= ~mask; +} + +inline bool +Grid::Status::test_zero_dim_univ() const { + return flags == ZERO_DIM_UNIV; +} + +inline void +Grid::Status::reset_zero_dim_univ() { + // This is a no-op if the current status is not zero-dim. + if (flags == ZERO_DIM_UNIV) + // In the zero-dim space, if it is not the universe it is empty. + flags = EMPTY; +} + +inline void +Grid::Status::set_zero_dim_univ() { + // Zero-dim universe is incompatible with anything else. + flags = ZERO_DIM_UNIV; +} + +inline bool +Grid::Status::test_empty() const { + return test_any(EMPTY); +} + +inline void +Grid::Status::reset_empty() { + reset(EMPTY); +} + +inline void +Grid::Status::set_empty() { + flags = EMPTY; +} + +inline bool +Grid::Status::test_c_up_to_date() const { + return test_any(C_UP_TO_DATE); +} + +inline void +Grid::Status::reset_c_up_to_date() { + reset(C_UP_TO_DATE); +} + +inline void +Grid::Status::set_c_up_to_date() { + set(C_UP_TO_DATE); +} + +inline bool +Grid::Status::test_g_up_to_date() const { + return test_any(G_UP_TO_DATE); +} + +inline void +Grid::Status::reset_g_up_to_date() { + reset(G_UP_TO_DATE); +} + +inline void +Grid::Status::set_g_up_to_date() { + set(G_UP_TO_DATE); +} + +inline bool +Grid::Status::test_c_minimized() const { + return test_any(C_MINIMIZED); +} + +inline void +Grid::Status::reset_c_minimized() { + reset(C_MINIMIZED); +} + +inline void +Grid::Status::set_c_minimized() { + set(C_MINIMIZED); +} + +inline bool +Grid::Status::test_g_minimized() const { + return test_any(G_MINIMIZED); +} + +inline void +Grid::Status::reset_g_minimized() { + reset(G_MINIMIZED); +} + +inline void +Grid::Status::set_g_minimized() { + set(G_MINIMIZED); +} + + +inline bool +Grid::Status::test_c_pending() const { + return test_any(CS_PENDING); +} + +inline void +Grid::Status::reset_c_pending() { + reset(CS_PENDING); +} + +inline void +Grid::Status::set_c_pending() { + set(CS_PENDING); +} + +inline bool +Grid::Status::test_g_pending() const { + return test_any(GS_PENDING); +} + +inline void +Grid::Status::reset_g_pending() { + reset(GS_PENDING); +} + +inline void +Grid::Status::set_g_pending() { + set(GS_PENDING); +} + + +inline bool +Grid::Status::test_sat_c_up_to_date() const { + return test_any(SAT_C_UP_TO_DATE); +} + +inline void +Grid::Status::reset_sat_c_up_to_date() { + reset(SAT_C_UP_TO_DATE); +} + +inline void +Grid::Status::set_sat_c_up_to_date() { + set(SAT_C_UP_TO_DATE); +} + +inline bool +Grid::Status::test_sat_g_up_to_date() const { + return test_any(SAT_G_UP_TO_DATE); +} + +inline void +Grid::Status::reset_sat_g_up_to_date() { + reset(SAT_G_UP_TO_DATE); +} + +inline void +Grid::Status::set_sat_g_up_to_date() { + set(SAT_G_UP_TO_DATE); +} + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Status_inlines_hh) diff --git a/src/Grid_chdims.cc b/src/Grid_chdims.cc new file mode 100644 index 0000000..c753e69 --- /dev/null +++ b/src/Grid_chdims.cc @@ -0,0 +1,483 @@ +/* Grid class implementation + (non-inline operators that may change the dimension of the vector space). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Grid.defs.hh" +#include "Variables_Set.defs.hh" +#include + +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) { + assert(cgs.num_columns() - 1 == gs.space_dimension() + 1); + assert(dims > 0); + + const dimension_type old_modulus_index = cgs.num_columns() - 1; + cgs.add_zero_columns(dims); + // Move the moduli. + cgs.swap_columns(old_modulus_index, old_modulus_index + 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) { + assert(cgs.num_columns() - 1 == gs.space_dimension() + 1); + assert(dims > 0); + + cgs.add_unit_rows_and_columns(dims); + + // Add `dims' zero columns onto gs. + gs.insert(parameter(0*Variable(space_dim + dims - 1))); + + normalize_divisors(gs); + + dim_kinds.resize(cgs.num_columns() - 1, EQUALITY /* a.k.a GEN_VIRTUAL */); +} + +// (o is a point) y +// +// | | | +// => | | | +// | | | +// o---o---o-- x |---|---|-- x +// 0 1 2 3 4 5 0 1 2 3 4 5 +// R^1 R^2 +void +PPL::Grid::add_space_dimensions_and_embed(dimension_type m) { + if (m == 0) + return; + + // The space dimension of the resulting grid must be at most the + // maximum allowed space dimension. + if (m > max_space_dimension() - space_dimension()) + throw_space_dimension_overflow("add_space_dimensions_and_embed(m)", + "adding m new space dimensions exceeds " + "the maximum allowed space dimension"); + + // Adding dimensions to an empty grid is obtained by adjusting + // `space_dim' and clearing `con_sys' (since it can contain the + // integrality congruence of the current dimension). + if (marked_empty()) { + space_dim += m; + set_empty(); + return; + } + + // The case of a zero-dimension space grid. + if (space_dim == 0) { + // Since it is not empty, it has to be the universe grid. + assert(status.test_zero_dim_univ()); + // Swap *this with a newly created `m'-dimensional universe grid. + Grid gr(m, UNIVERSE); + swap(gr); + return; + } + + // To embed an n-dimension space grid in a (n+m)-dimension space, we + // add `m' zero-columns to the rows in the system of congruences; in + // contrast, the system of generators needs additional rows, + // corresponding to the vectors of the canonical basis for the added + // dimensions. That is, for each new dimension we add the line + // having that direction. This is done by invoking the function + // add_space_dimensions(). + if (congruences_are_up_to_date()) + if (generators_are_up_to_date()) + // Adds rows and/or columns to both matrices. + add_space_dimensions(con_sys, gen_sys, m); + else { + // Only congruences are up-to-date, so modify only them. + con_sys.add_zero_columns(m); + dimension_type size = con_sys.num_columns() - 1; + // Move the moduli. + con_sys.swap_columns(size - m, size); + if (congruences_are_minimized()) + dim_kinds.resize(size, CON_VIRTUAL); + } + else { + // Only generators are up-to-date, so modify only them. + assert(generators_are_up_to_date()); + gen_sys.add_universe_rows_and_columns(m); + if (generators_are_minimized()) + dim_kinds.resize(gen_sys.space_dimension() + 1, LINE); + } + // Update the space dimension. + space_dim += m; + + // Note: we do not check for satisfiability, because the system of + // congruences may be unsatisfiable. + assert(OK()); +} + +// (o is a point) y +// +// +// => +// +// o---o---o-- x o---o---o-- x +// 0 1 2 3 4 5 0 1 2 3 4 5 +// R^1 R^2 +void +PPL::Grid::add_space_dimensions_and_project(dimension_type m) { + if (m == 0) + return; + + // The space dimension of the resulting grid should be at most the + // maximum allowed space dimension. + if (m > max_space_dimension() - space_dimension()) + throw_space_dimension_overflow("add_space_dimensions_and_project(m)", + "adding m new space dimensions exceeds " + "the maximum allowed space dimension"); + + // Adding dimensions to an empty grid is obtained by merely + // adjusting `space_dim'. + if (marked_empty()) { + space_dim += m; + set_empty(); + return; + } + + if (space_dim == 0) { + assert(status.test_zero_dim_univ()); + // Swap *this with a newly created `n'-dimensional universe grid. + Grid gr(m, UNIVERSE); + swap(gr); + return; + } + + // To project an n-dimension space grid in a (n+m)-dimension space, + // we just add to the system of generators `m' zero-columns; in + // contrast, in the system of congruences, new rows are needed in + // order to avoid embedding the old grid in the new space. Thus, + // for each new dimensions `x[k]', we add the constraint x[k] = 0; + // this is done by invoking the function add_space_dimensions() + // giving the system of constraints as the second argument. + if (congruences_are_up_to_date()) + if (generators_are_up_to_date()) + // Add rows and/or columns to both matrices. + add_space_dimensions(gen_sys, con_sys, m); + else { + // Only congruences are up-to-date so modify only them. + con_sys.add_unit_rows_and_columns(m); + if (congruences_are_minimized()) + dim_kinds.resize(con_sys.num_columns() - 1, EQUALITY); + } + else { + // Only generators are up-to-date so modify only them. + assert(generators_are_up_to_date()); + + // Add m zero columns onto gs. + gen_sys.insert(parameter(0*Variable(space_dim + m - 1))); + + normalize_divisors(gen_sys); + + if (generators_are_minimized()) + dim_kinds.resize(gen_sys.space_dimension() + 1, EQUALITY); + } + // Now update the space dimension. + space_dim += m; + + // Note: we do not check for satisfiability, because the system of + // congruences may be unsatisfiable. + assert(OK()); +} + +void +PPL::Grid::concatenate_assign(const Grid& y) { + // The space dimension of the resulting grid must be at most the + // maximum allowed space dimension. + if (y.space_dim > max_space_dimension() - space_dimension()) + throw_space_dimension_overflow("concatenate_assign(y)", + "concatenation exceeds the maximum " + "allowed space dimension"); + + const dimension_type added_columns = y.space_dim; + + // If `*this' or `y' are empty grids just adjust the space + // dimension. + if (marked_empty() || y.marked_empty()) { + space_dim += added_columns; + set_empty(); + return; + } + + // If `y' is a universe 0-dim grid, the result is `*this'. + if (added_columns == 0) + return; + + // If `*this' is a universe 0-dim space grid, the result is `y'. + if (space_dim == 0) { + *this = y; + return; + } + + 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. + assert(OK()); +} + +void +PPL::Grid::remove_space_dimensions(const Variables_Set& to_be_removed) { + // The removal of no dimensions from any grid is a no-op. This case + // also captures the only legal removal of dimensions from a grid in + // a 0-dim space. + if (to_be_removed.empty()) { + assert(OK()); + return; + } + + // Dimension-compatibility check. + const dimension_type min_space_dim = to_be_removed.space_dimension(); + if (space_dim < min_space_dim) + throw_dimension_incompatible("remove_space_dimensions(vs)", min_space_dim); + + const dimension_type new_space_dim = space_dim - to_be_removed.size(); + + if (marked_empty() + || (!generators_are_up_to_date() && !update_generators())) { + // Update the space dimension. + space_dim = new_space_dim; + set_empty(); + assert(OK()); + return; + } + + // Removing _all_ dimensions from a non-empty grid obtains the + // zero-dimensional universe grid. + if (new_space_dim == 0) { + set_zero_dim_univ(); + return; + } + + gen_sys.remove_space_dimensions(to_be_removed); + + clear_congruences_up_to_date(); + clear_generators_minimized(); + + // Update the space dimension. + space_dim = new_space_dim; + + assert(OK(true)); +} + +void +PPL::Grid::remove_higher_space_dimensions(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) { + assert(OK()); + return; + } + + if (is_empty()) { + // Removing dimensions from the empty grid just updates the space + // dimension. + space_dim = new_dimension; + set_empty(); + assert(OK()); + return; + } + + if (new_dimension == 0) { + // Removing all dimensions from a non-empty grid just returns the + // zero-dimensional universe grid. + set_zero_dim_univ(); + return; + } + + // Favor the generators, as is done by is_empty(). + if (generators_are_up_to_date()) { + gen_sys.remove_higher_space_dimensions(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) + dim_kinds[row] == GEN_VIRTUAL || ++num_redundant; + if (num_redundant > 0) { + // Chop zero rows from end of system, to keep minimal form. + gen_sys.erase_to_end(gen_sys.num_rows() - num_redundant); + gen_sys.unset_pending_rows(); + } + dim_kinds.erase(dim_kinds.begin() + new_dimension + 1, dim_kinds.end()); + // 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.increase_space_dimension(new_dimension + 2); + con_sys.swap(cgs); + } + else { + assert(congruences_are_minimized()); + con_sys.remove_higher_space_dimensions(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) + dim_kinds[row] == CON_VIRTUAL || ++num_redundant; + if (num_redundant > 0) { + dimension_type rows = con_sys.num_rows(); + // Shuffle the remaining rows upwards. + for (dimension_type low = 0, high = num_redundant; + high < rows; + ++high, ++low) + std::swap(con_sys[low], con_sys[high]); + // Chop newly redundant rows from end of system, to keep minimal + // form. + con_sys.erase_to_end(rows - num_redundant); + } + 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.swap(gs); + } + + // Update the space dimension. + space_dim = new_dimension; + + assert(OK(true)); +} + +void +PPL::Grid::expand_space_dimension(Variable var, dimension_type m) { + // TODO: this implementation is _really_ an executable specification. + + // `var' must be one of the dimensions of the vector space. + if (var.space_dimension() > space_dim) + throw_dimension_incompatible("expand_space_dimension(v, m)", "v", var); + + // Adding 0 dimensions leaves the same grid. + if (m == 0) + return; + + // The resulting space dimension must be at most the maximum. + if (m > max_space_dimension() - space_dimension()) + throw_space_dimension_overflow("expand_space_dimension(v, m)", + "adding m new space dimensions exceeds " + "the maximum allowed space dimension"); + + // Save the number of dimensions before adding new ones. + dimension_type old_dim = space_dim; + + // Add the required new dimensions. + add_space_dimensions_and_embed(m); + + const dimension_type src_d = var.id(); + const Congruence_System& cgs = congruences(); + Congruence_System new_congruences; + for (Congruence_System::const_iterator i = cgs.begin(), + cgs_end = cgs.end(); i != cgs_end; ++i) { + const Congruence& cg = *i; + + // Only consider congruences that constrain `var'. + if (cg.coefficient(var) == 0) + continue; + + // Each relevant congruence results in `m' new congruences. + for (dimension_type dst_d = old_dim; dst_d < old_dim+m; ++dst_d) { + Linear_Expression e; + for (dimension_type j = old_dim; j-- > 0; ) + e += + cg.coefficient(Variable(j)) + * (j == src_d ? Variable(dst_d) : Variable(j)); + new_congruences.insert_verbatim((e + cg.inhomogeneous_term() %= 0) + / cg.modulus()); + } + } + add_recycled_congruences(new_congruences); + assert(OK()); +} + +void +PPL::Grid::fold_space_dimensions(const Variables_Set& to_be_folded, + Variable var) { + // TODO: this implementation is _really_ an executable specification. + + // `var' should be one of the dimensions of the grid. + if (var.space_dimension() > space_dim) + throw_dimension_incompatible("fold_space_dimensions(tbf, v)", "v", var); + + // Folding only has effect if dimensions are given. + if (to_be_folded.empty()) + return; + + // All variables in `to_be_folded' must be dimensions of the grid. + if (to_be_folded.space_dimension() > space_dim) + throw_dimension_incompatible("fold_space_dimensions(tbf, v)", + "tbf.space_dimension()", + to_be_folded.space_dimension()); + + // Moreover, `var.id()' must not occur in `to_be_folded'. + if (to_be_folded.find(var.id()) != to_be_folded.end()) + throw_invalid_argument("fold_space_dimensions(tbf, v)", + "v should not occur in tbf"); + // 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 = to_be_folded.begin(), + tbf_end = to_be_folded.end(); i != tbf_end; ++i) { + Grid copy = *this; + copy.affine_image(var, Linear_Expression(Variable(*i))); + upper_bound_assign(copy); + } + } + remove_space_dimensions(to_be_folded); + assert(OK()); +} diff --git a/src/Grid_conversion.cc b/src/Grid_conversion.cc new file mode 100644 index 0000000..e1bf72a --- /dev/null +++ b/src/Grid_conversion.cc @@ -0,0 +1,478 @@ +/* Grid class implementation: conversion(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Grid.defs.hh" +#include + +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.num_columns() - 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[dim] <= 0) + return false; + // Check elements following diagonal. + dimension_type col = dim; + while (++col < num_columns) + if (cg[col] != 0) + 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[num_columns] <= 0) + return false; + // Check elements preceding diagonal. + dimension_type col = num_columns; + while (col-- > 0) + if (gen[col] != 0) + return false; + } + + // Check for squareness. + return num_columns == row; +} + +void +Grid::multiply_grid(const Coefficient& multiplier, Grid_Generator& gen, + Grid_Generator_System& dest, const dimension_type num_rows, + const dimension_type num_dims) { + if (multiplier == 1) + return; + + if (gen.is_line()) + // Multiply every element of the line. + for (dimension_type column = num_dims; column-- > 0; ) + gen[column] *= multiplier; + else { + assert(gen.is_parameter_or_point()); + // Multiply every element of every parameter. + for (dimension_type index = num_rows; index-- > 0; ) { + Grid_Generator& generator = dest[index]; + if (generator.is_parameter_or_point()) + for (dimension_type column = num_dims; column-- > 0; ) + generator[column] *= multiplier; + } + } +} + +void +Grid::multiply_grid(const Coefficient& multiplier, Congruence& cg, + Congruence_System& dest, const dimension_type num_rows, + const dimension_type num_dims) { + if (multiplier == 1) + return; + + if (cg.is_proper_congruence()) + // Multiply every element of every congruence. + for (dimension_type index = num_rows; index-- > 0; ) { + Congruence& congruence = dest[index]; + if (congruence.is_proper_congruence()) + for (dimension_type column = num_dims; column-- > 0; ) + congruence[column] *= multiplier; + } + else { + assert(cg.is_equality()); + // Multiply every element of the equality. + for (dimension_type column = num_dims; column-- > 0; ) + cg[column] *= 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. + + 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][dim]); + // Parameters map to proper congruences. + ++dest_num_rows; + } + // Lines map to virtual congruences. + } + assert(source_index == 0); + + // `source' must be regular. + if (diagonal_lcm == 0) + throw std::runtime_error("PPL internal error: Grid::conversion:" + " source matrix is singular."); + + dest.resize_no_copy(dest_num_rows, dims + 1 /* moduli */); + + // In `dest' initialize row types and elements, including setting + // the diagonal elements to the inverse ratio of the `source' + // diagonal elements. + dimension_type dest_index = 0; + source_index = source.num_rows(); + for (dimension_type dim = dims; dim-- > 0; ) { + if (dim_kinds[dim] == LINE) + --source_index; + else { + Congruence& cg = dest[dest_index]; + for (dimension_type j = dim; j-- > 0; ) + cg[j] = 0; + for (dimension_type j = dim + 1; j < dims; ++j) + cg[j] = 0; + + if (dim_kinds[dim] == GEN_VIRTUAL) { + cg[dims] = 0; // An equality. + cg[dim] = 1; + } + else { + assert(dim_kinds[dim] == PARAMETER); + --source_index; + cg[dims] = 1; // A proper congruence. + exact_div_assign(cg[dim], diagonal_lcm, source[source_index][dim]); + } + ++dest_index; + } + } + + assert(source_index == 0); + assert(dest_index == dest_num_rows); + 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(); + 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][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[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[dim], source_dim); + exact_div_assign(multiplier, source_dim, multiplier); + multiply_grid(multiplier, cg, dest, dest_num_rows, dims); + + Coefficient& cg_dim = cg[dim]; + exact_div_assign(cg_dim, cg_dim, source_dim); + } + } + + // 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][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'. + for (dimension_type row = dest_index; row-- > 0; ) { + assert(row < dest_num_rows); + Congruence& cg = dest[row]; + sub_mul_assign(cg[dim_prec], source_dim, cg[dim]); + } + } + } + } + // Set the modulus in every congruence. + const Coefficient& modulus = dest[dest_num_rows - 1][0]; + for (dimension_type row = dest_num_rows; row-- > 0; ) { + Congruence& cg = dest[row]; + if (cg[dims] > 0) + // `cg' is a proper congruence. + cg[dims] = modulus; + } + + 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 + (dest, dim, i++, 0, dim, dim_kinds, false); +} + +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. + + 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, dest_num_rows = 0; + PPL_DIRTY_TEMP_COEFFICIENT(diagonal_lcm); + diagonal_lcm = 1; + dimension_type dims = source.num_columns() - 1; + for (dimension_type dim = dims; dim-- > 0; ) + if (dim_kinds[dim] == CON_VIRTUAL) + // Virtual congruences map to lines. + ++dest_num_rows; + else { + if (dim_kinds[dim] == PROPER_CONGRUENCE) { + // Dimension `dim' has a proper congruence row at + // `source_num_rows' in `source', so include in `diagonal_lcm' + // the `dim'th element of that row. + lcm_assign(diagonal_lcm, diagonal_lcm, source[source_num_rows][dim]); + // Proper congruences map to parameters. + ++dest_num_rows; + } + // Equalities map to virtual generators. + ++source_num_rows; + } + + // `source' must be regular. + if (diagonal_lcm == 0) + throw std::runtime_error("PPL internal error: Grid::conversion:" + " source matrix is singular."); + + dest.set_index_first_pending_row(dest_num_rows); + dest.resize_no_copy(dest_num_rows, dims + 1 /* parameter divisor */); + + // In `dest' initialize row types and elements, including setting + // the diagonal elements to the inverse ratio of the `source' + // diagonal elements. + // + // The top-down order of the congruence system rows corresponds to + // the right-left order of the dimensions. + dimension_type source_index = 0; + // The generator system has a bottom-up ordering. + dimension_type dest_index = dest_num_rows - 1; + for (dimension_type dim = dims; dim-- > 0; ) { + if (dim_kinds[dim] == EQUALITY) { + ++source_index; + } + else { + Grid_Generator& g = dest[dest_index]; + for (dimension_type j = dim; j-- > 0; ) + g[j] = 0; + for (dimension_type j = dim + 1; j < dims; ++j) + g[j] = 0; + + if (dim_kinds[dim] == CON_VIRTUAL) { + g.set_is_line(); + g[dim] = 1; + } + else { + assert(dim_kinds[dim] == PROPER_CONGRUENCE); + g.set_is_parameter_or_point(); + exact_div_assign(g[dim], diagonal_lcm, source[source_index][dim]); + ++source_index; + } + --dest_index; + } + } + + 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; + 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; + const Coefficient& source_dim = source[source_index][dim]; + + // In the rows in `dest' above `dest_index' divide each element + // at column `dim' by `source_dim'. + for (dimension_type row = dest_index; row-- > 0; ) { + Grid_Generator& g = dest[row]; + + // Multiply the representation of `dest' such that entry `dim' + // of `g' is a multiple of `source_dim'. This ensures that + // the result of the division that follows is a whole number. + gcd_assign(reduced_source_dim, g[dim], source_dim); + exact_div_assign(reduced_source_dim, source_dim, reduced_source_dim); + multiply_grid(reduced_source_dim, g, dest, dest_num_rows, + dims + 1 /* parameter divisor */); + + Coefficient& g_dim = g[dim]; + exact_div_assign(g_dim, g_dim, source_dim); + } + } + + // 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; + const Coefficient& source_dim = source[tmp_source_index][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'. + for (dimension_type row = dest_index; row-- > 0; ) { + assert(row < dest_num_rows); + Grid_Generator& g = dest[row]; + sub_mul_assign(g[dim_fol], source_dim, g[dim]); + } + } + } + } + + 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 + (dest, 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[0][0]; + for (dimension_type row = dest.num_rows() - 1, dim = dims; + dim-- > 1; ) + switch (dim_kinds[dim]) { + case PARAMETER: + dest[row].set_divisor(system_divisor); + case LINE: + --row; + case GEN_VIRTUAL: + break; + } +} + +} // namespace Parma_Polyhedra_Library diff --git a/src/Grid_nonpublic.cc b/src/Grid_nonpublic.cc new file mode 100644 index 0000000..eb2140d --- /dev/null +++ b/src/Grid_nonpublic.cc @@ -0,0 +1,776 @@ +/* Grid class implementation + (non-inline private or protected functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Grid.defs.hh" +#include "Grid_Generator.defs.hh" +#include "Scalar_Products.defs.hh" +#include +#include +#include +#include +#include + +#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.increase_space_dimension(space_dim); + const_cast(con_sys).swap(cgs); + + assert(OK()); + return; + } + + if (num_dimensions > 0) { + con_sys.increase_space_dimension(num_dimensions); + + // Initialize both systems to universe representations. + + set_congruences_minimized(); + set_generators_minimized(); + dim_kinds.resize(num_dimensions + 1); + + // Extend the zero dim integrality congruence system to the + // appropriate dimension and then store it in `con_sys'. + Congruence_System cgs(Congruence::zero_dim_integrality()); + cgs.increase_space_dimension(space_dim); + cgs[0][0] = 1; // Recover minimal form after cgs(zdi) normalization. + con_sys.swap(cgs); + + dim_kinds[0] = PROPER_CONGRUENCE /* a.k.a. PARAMETER */; + + // Trivially true point. + gen_sys.insert(grid_point(0*(Variable(0)))); + + // A line for each dimension. + dimension_type dim = 0; + while (dim < num_dimensions) { + gen_sys.insert(grid_line(Variable(dim))); + dim_kinds[++dim] = CON_VIRTUAL /* a.k.a. LINE */; + } + } + else + set_zero_dim_univ(); +} + +void +PPL::Grid::construct(Congruence_System& cgs) { + // Protecting against space dimension overflow is up to the caller. + assert(cgs.space_dimension() <= max_space_dimension()); + // Preparing con_sys and gen_sys is up to the caller. + assert(cgs.space_dimension() == con_sys.space_dimension()); + assert(cgs.space_dimension() == gen_sys.space_dimension()); + assert(con_sys.has_no_rows()); + assert(gen_sys.has_no_rows()); + + // Set the space dimension. + space_dim = cgs.space_dimension(); + + if (space_dim > 0) { + // Stealing the rows from `cgs'. + std::swap(con_sys, cgs); + con_sys.normalize_moduli(); + set_congruences_up_to_date(); + } + else { + // Here `space_dim == 0'. + if (cgs.num_columns() > 1) + // See if an inconsistent congruence has been passed. + for (dimension_type i = cgs.num_rows(); i-- > 0; ) + if (cgs[i].is_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()); + assert(OK()); + return; + } + set_zero_dim_univ(); + } + assert(OK()); +} + +void +PPL::Grid::construct(Grid_Generator_System& ggs) { + // Protecting against space dimension overflow is up to the caller. + assert(ggs.space_dimension() <= max_space_dimension()); + // Preparing con_sys and gen_sys is up to the caller. + assert(ggs.space_dimension() == con_sys.space_dimension()); + assert(ggs.space_dimension() == gen_sys.space_dimension()); + assert(con_sys.has_no_rows()); + 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'. + std::swap(gen_sys, ggs); + normalize_divisors(gen_sys); + // Generators are now up-to-date. + set_generators_up_to_date(); + } + + assert(OK()); +} + +PPL::Grid::Three_Valued_Boolean +PPL::Grid::quick_equivalence_test(const Grid& y) const { + // Private method: the caller must ensure the following. + assert(space_dim == y.space_dim); + assert(!marked_empty() && !y.marked_empty() && space_dim > 0); + + const Grid& x = *this; + + bool css_normalized = false; + + if (x.congruences_are_minimized() && y.congruences_are_minimized()) { + // Equivalent minimized congruence systems have: + // - the same number of congruences; ... + if (x.con_sys.num_rows() != y.con_sys.num_rows()) + return Grid::TVB_FALSE; + // - the same number of equalities; ... + dimension_type x_num_equalities = x.con_sys.num_equalities(); + if (x_num_equalities != y.con_sys.num_equalities()) + return Grid::TVB_FALSE; + // - and if there are no equalities, the same congruences. + // Delay this test: try cheaper tests on generators first. + css_normalized = (x_num_equalities == 0); + } + + if (x.generators_are_minimized() && y.generators_are_minimized()) { + // Equivalent minimized generator systems have: + // - the same number of generators; ... + if (x.gen_sys.num_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. + assert(space_dim == y.space_dim); + assert(!marked_empty() && !y.marked_empty() && space_dim > 0); + + const Grid& x = *this; + +#if BE_LAZY + if (!x.generators_are_up_to_date() && !x.update_generators()) + // Updating found `x' empty. + return true; + 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 + + assert(x.OK()); + assert(y.OK()); + + const Grid_Generator_System& gs = x.gen_sys; + const Congruence_System& cgs = y.con_sys; + + dimension_type num_rows = gs.num_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; + + // The generators are up to date. + 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::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) + *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(*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) { + Linear_Expression e; + for (dimension_type i = space_dim; i-- > 0; ) + e += gen.coefficient(Variable(i)) * Variable(i); + *point = Generator::point(e, 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.swap(gs); + + // Extend the zero dim false congruence system to the appropriate + // dimension and then swap it with `con_sys'. + Congruence_System cgs(Congruence::zero_dim_false()); + cgs.increase_space_dimension(space_dim); + const_cast(con_sys).swap(cgs); +} + +void +PPL::Grid::update_congruences() const { + // The caller must ensure that the generators are up to date. + assert(space_dim > 0); + assert(!marked_empty()); + assert(!gen_sys.has_no_rows()); + assert(gen_sys.space_dimension() > 0); + + Grid& gr = const_cast(*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. + 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 { + assert(space_dim > 0); + assert(!marked_empty()); + assert(congruences_are_up_to_date()); + + Grid& x = const_cast(*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(*this); + // Only one of the systems can be minimized here. + if (congruences_are_minimized()) { + // Minimize the generator system. + gr.simplify(gr.gen_sys, gr.dim_kinds); + gr.set_generators_minimized(); + } + else { +#ifndef NDEBUG + // Both systems are up to date, and the empty case is handled + // above, so the grid should contain points. + bool empty = simplify(gr.con_sys, gr.dim_kinds); + assert(!empty); +#else + simplify(gr.con_sys, gr.dim_kinds); +#endif + gr.set_congruences_minimized(); + if (!generators_are_minimized()) { + // Minimize the generator system. + gr.simplify(gr.gen_sys, gr.dim_kinds); + gr.set_generators_minimized(); + } + } + } + else { + // Updating the generators may reveal that `*this' is empty. + const bool ret = update_generators(); + assert(OK()); + return ret; + } + } + else { + assert(generators_are_up_to_date()); + update_congruences(); + } + assert(OK()); + return true; +} + +void +PPL::Grid::normalize_divisors(Grid_Generator_System& sys, + Grid_Generator_System& gen_sys) { +#ifndef NDEBUG + const dimension_type num_rows = gen_sys.num_rows(); +#endif + 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. + assert(row < num_rows); + } + 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) { + Grid_Generator& g = gen_sys[i]; + if (g.is_parameter_or_point()) + 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) { + assert(divisor >= 0); + if (sys.space_dimension() > 0 && divisor > 0) { + dimension_type row = 0; + dimension_type num_rows = sys.num_rows(); + + if (first_point) + lcm_assign(divisor, divisor, (*first_point).divisor()); + else { + assert(num_rows > 0); + // Move to the first point or parameter. + 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 (row = num_rows; row-- > 0; ) + sys[row].scale_to_divisor(divisor); + } +} + +void +PPL::Grid::add_congruence_no_check(const Congruence& cg) { + assert(!marked_empty()); + 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. + assert(OK()); +} + +void +PPL::Grid::add_constraint_no_check(const Constraint& c) { + assert(!marked_empty()); + 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"); + } + + assert(c.is_equality()); + Congruence cg(c); + add_congruence_no_check(cg); +} + +void +PPL::Grid::refine_no_check(const Constraint& c) { + assert(!marked_empty()); + assert(space_dim >= c.space_dimension()); + + if (c.is_equality()) { + Congruence cg(c); + add_congruence_no_check(cg); + } + else if (c.is_inconsistent()) + set_empty(); +} + +void +PPL::Grid::throw_runtime_error(const char* method) const { + std::ostringstream s; + s << "PPL::Grid::" << method << "." << std::endl; + throw std::runtime_error(s.str()); +} + +void +PPL::Grid::throw_invalid_argument(const char* method, + const char* reason) const { + std::ostringstream s; + s << "PPL::Grid::" << method << ":" << std::endl + << reason << "."; + throw std::invalid_argument(s.str()); +} + +void +PPL::Grid::throw_dimension_incompatible(const char* method, + const char* other_name, + dimension_type other_dim) const { + std::ostringstream s; + s << "PPL::Grid::" << method << ":\n" + << "this->space_dimension() == " << space_dimension() << ", " + << other_name << ".space_dimension() == " << other_dim << "."; + throw std::invalid_argument(s.str()); +} + +void +PPL::Grid::throw_dimension_incompatible(const char* method, + const char* gr_name, + const Grid& gr) const { + throw_dimension_incompatible(method, gr_name, gr.space_dimension()); +} + +void +PPL::Grid::throw_dimension_incompatible(const char* method, + const char* e_name, + const Linear_Expression& e) const { + throw_dimension_incompatible(method, e_name, e.space_dimension()); +} + +void +PPL::Grid::throw_dimension_incompatible(const char* method, + const char* cg_name, + const Congruence& cg) const { + throw_dimension_incompatible(method, cg_name, cg.space_dimension()); +} + +void +PPL::Grid::throw_dimension_incompatible(const char* method, + const char* c_name, + const Constraint& c) const { + throw_dimension_incompatible(method, c_name, c.space_dimension()); +} + +void +PPL::Grid::throw_dimension_incompatible(const char* method, + const char* g_name, + const Grid_Generator& g) const { + throw_dimension_incompatible(method, g_name, g.space_dimension()); +} + +void +PPL::Grid::throw_dimension_incompatible(const char* method, + const char* 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_space_dimension_overflow(const char* method, + const char* reason) { + std::ostringstream s; + s << "PPL::Grid::" << method << ":" << std::endl + << reason << "."; + throw std::length_error(s.str()); +} + +void +PPL::Grid::throw_invalid_constraint(const char* method, + const char* c_name) const { + 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) const { + 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) const { + std::ostringstream s; + s << "PPL::Grid::" << method << ":" << std::endl + << "*this is an empty grid and " + << g_name << " is not a point."; + throw std::invalid_argument(s.str()); +} + +void +PPL::Grid::throw_invalid_generators(const char* method, + const char* gs_name) const { + std::ostringstream s; + s << "PPL::Grid::" << method << ":" << std::endl + << "*this is an empty grid and" << std::endl + << "the non-empty generator system " << gs_name << " contains no points."; + throw std::invalid_argument(s.str()); +} diff --git a/src/Grid_public.cc b/src/Grid_public.cc new file mode 100644 index 0000000..3b3124b --- /dev/null +++ b/src/Grid_public.cc @@ -0,0 +1,2781 @@ +/* Grid class implementation (non-inline public functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Grid.defs.hh" +#include "Topology.hh" +#include "Scalar_Products.defs.hh" + +#include +#include + +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.increase_space_dimension(space_dim); + if (y.generators_are_up_to_date()) + gen_sys = y.gen_sys; + else + gen_sys = Grid_Generator_System(y.space_dim); + } +} + +PPL::Grid::Grid(const Constraint_System& cs) + : con_sys(cs.space_dimension() > max_space_dimension() + ? throw_space_dimension_overflow("Grid(cs)", + "the space dimension of cs " + "exceeds the maximum allowed " + "space dimension"), 0 + : cs.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()); + assert(OK()); + return; + } + set_zero_dim_univ(); + assert(OK()); + return; + } + + Congruence_System cgs; + cgs.insert(0*Variable(space_dim - 1) %= 1); + for (Constraint_System::const_iterator i = cs.begin(), + cs_end = cs.end(); i != cs_end; ++i) + if (i->is_equality()) + cgs.insert(*i); + else + throw_invalid_constraints("Grid(cs)", "cs"); + construct(cgs); +} + +PPL::Grid::Grid(Constraint_System& cs, Recycle_Input) + : con_sys(cs.space_dimension() > max_space_dimension() + ? throw_space_dimension_overflow("Grid(cs, recycle)", + "the space dimension of cs " + "exceeds the maximum allowed " + "space dimension"), 0 + : cs.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()); + assert(OK()); + return; + } + set_zero_dim_univ(); + assert(OK()); + return; + } + + Congruence_System cgs; + cgs.insert(0*Variable(space_dim - 1) %= 1); + for (Constraint_System::const_iterator i = cs.begin(), + cs_end = cs.end(); i != cs_end; ++i) + if (i->is_equality()) + cgs.insert(*i); + else + throw_invalid_constraint("Grid(cs)", "cs"); + construct(cgs); +} + +PPL::Grid::Grid(const Polyhedron& ph, + Complexity_Class complexity) + : con_sys(ph.space_dimension() > max_space_dimension() + ? throw_space_dimension_overflow("Grid(ph)", + "the space dimension of ph " + "exceeds the maximum allowed " + "space dimension"), 0 + : ph.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; + } + + 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. + assert(ph.constraints_are_up_to_date()); + const Constraint_System& cs = ph.constraints(); + Congruence_System cgs; + cgs.insert(0*Variable(space_dim - 1) %= 1); + for (Constraint_System::const_iterator i = cs.begin(), + cs_end = cs.end(); i != cs_end; ++i) + if (i->is_equality()) + cgs.insert(*i); + construct(cgs); + } + else { + gen_sys = Grid_Generator_System(space_dim); + // First find a point or closure point and convert it to a + // grid point and add to the (initially empty) set of grid generators. + assert(ph.generators_are_up_to_date()); + const Generator_System& gs = ph.generators(); + Grid_Generator_System ggs(space_dim); + Linear_Expression point_expr; + 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()) { + for (dimension_type i = space_dim; i-- > 0; ) { + const Variable v(i); + point_expr += g->coefficient(v) * v; + 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. + PPL_DIRTY_TEMP_COEFFICIENT(coeff); + PPL_DIRTY_TEMP_COEFFICIENT(g_divisor); + for (Generator_System::const_iterator g = gs.begin(), + gs_end = gs.end(); g != gs_end; ++g) { + Linear_Expression e; + if (g->is_point() || g->is_closure_point()) { + g_divisor = g->divisor(); + for (dimension_type i = space_dim; i-- > 0; ) { + const Variable v(i); + coeff = point_expr.coefficient(v) * g_divisor; + coeff -= g->coefficient(v) * point_divisor; + e += coeff * v; + } + if (e.all_homogeneous_terms_are_zero()) + continue; + } + else + for (dimension_type i = space_dim; i-- > 0; ) { + const Variable v(i); + e += g->coefficient(v) * v; + } + ggs.insert(grid_line(e)); + } + construct(ggs); + } + 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(); + 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. + assert(con_sys.num_rows() == 0 && con_sys.num_columns() == 2); + 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(*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) { + assert(gen_sys.space_dimension() == 0 + && gen_sys.num_rows() == (marked_empty() ? 0 : 1)); + return gen_sys; + } + + if (marked_empty()) { + assert(gen_sys.has_no_rows()); + return gen_sys; + } + + if (!generators_are_up_to_date() && !update_generators()) { + // Updating found the grid empty. + const_cast(*this).set_empty(); + return gen_sys; + } + + return gen_sys; +} + +const PPL::Grid_Generator_System& +PPL::Grid::minimized_grid_generators() const { + if (space_dim == 0) { + assert(gen_sys.space_dimension() == 0 + && gen_sys.num_rows() == (marked_empty() ? 0 : 1)); + return gen_sys; + } + + if (marked_empty()) { + 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(*this); + gr.simplify(gr.gen_sys, gr.dim_kinds); + gr.set_generators_minimized(); + } + } + else if (!update_generators()) { + // Updating found the grid empty. + const_cast(*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; + + const Coefficient& modulus = cg.modulus(); + + PPL_DIRTY_TEMP_COEFFICIENT(div); + div = modulus; + + PPL_DIRTY_TEMP_COEFFICIENT(sp); + + bool known_to_intersect = false; + + for (Grid_Generator_System::const_iterator g = gen_sys.begin(), + gen_sys_end = gen_sys.end(); g != gen_sys_end; ++g) { + 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) + ////// if (point_sp == div) + // There is also a grid point that satisfies cg. + return Poly_Con_Relation::strictly_intersects(); + + break; + + case Grid_Generator::LINE: + if (sp == 0) + // Line g satisfies the cg so the relation depends entirely on + // the other generators. + break; + + // Line g intersects the congruence. + // + // There is a point p in the grid. Suppose = p_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_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(); + } + + 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 { + 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(); + + Linear_Expression expr; + for (dimension_type i = g_space_dim; i-- > 0; ) { + const Variable v(i); + expr += g.coefficient(v) * v; + } + 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()) { + 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 = NULL; + + for (Grid_Generator_System::const_iterator g = gen_sys.begin(), + gen_sys_end = gen_sys.end(); g != gen_sys_end; ++g) + switch (g->type()) { + + case Grid_Generator::POINT: + { + Grid_Generator& gen = const_cast(*g); + if (first_point == NULL) { + first_point = &gen; + const int sign = Scalar_Products::sign(c, gen); + Constraint::Type type = c.type(); + if ((type == Constraint::NONSTRICT_INEQUALITY && sign == 0)) { + point_saturates = true; + } + else if (sign > 0) + point_is_included = true; + break; + } + // Else convert g to a parameter, and continue into the + // parameter case. + gen.set_is_parameter(); + const Grid_Generator& first = *first_point; + for (dimension_type i = gen.size() - 1; i-- > 0; ) + gen[i] -= first[i]; + } + + case Grid_Generator::PARAMETER: + case Grid_Generator::LINE: + Grid_Generator& gen = const_cast(*g); + if (gen.is_line_or_parameter()) + for (dimension_type i = c.space_dimension(); i-- > 0; ) { + Variable v(i); + if (c.coefficient(v) != 0 && gen.coefficient(v) != 0) + return Poly_Con_Relation::strictly_intersects(); + } + break; + } + + if (point_saturates) + // Any parameters and lines are also included. + return Poly_Con_Relation::saturates() + && Poly_Con_Relation::is_included(); + if (point_is_included) + // Any parameters and lines are also 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(*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. + Variable var(space_dim - 1); + for (dimension_type i = space_dim; i-- > 0; ) + if (!con_sys.satisfies_all_congruences(grid_line(Variable(i) + var))) + return false; + assert(con_sys.satisfies_all_congruences(grid_point(0*var))); + return true; +} + +bool +PPL::Grid::is_bounded() const { + // A zero-dimensional or empty grid is bounded. + if (space_dim == 0 + || marked_empty() + || (!generators_are_up_to_date() && !update_generators())) + return true; + + // TODO: Consider using con_sys when gen_sys is out of date. + + if (gen_sys.num_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). + const dimension_type var_id = var.id(); + for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) { + const Grid_Generator& g_i = gen_sys[i]; + if (g_i.is_line()) { + if (sgn(g_i.coefficient(var)) != 0) { + for (dimension_type j = 0; j < space_dim; ++j) + if (g_i.coefficient(Variable(j)) != 0 && j != var_id) + goto next; + return true; + } + } + next: + ; + } + + // 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.num_columns() != num_columns + 1 /* moduli */) { +#ifndef NDEBUG + cerr << "Incompatible size! (con_sys and space_dim)" + << endl; +#endif + goto fail; + } + + if (generators_are_up_to_date()) { + if (gen_sys.space_dimension() + 1 != num_columns) { +#ifndef NDEBUG + cerr << "Incompatible size! (gen_sys and space_dim)" + << endl; +#endif + goto fail; + } + + // Check if the system of generators is well-formed. + if (!gen_sys.OK()) + goto fail; + + // Check each generator in the system. + for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) { + const Grid_Generator& g = gen_sys[i]; + + if (g.size() < 1) { +#ifndef NDEBUG + cerr << "Parameter should have coefficients." << endl; +#endif + goto fail; + } + } + + // A non-empty system of generators describing a grid is valid + // 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; assert(row <= dim), --dim) { + if (dim_kinds[dim] == GEN_VIRTUAL + || (gen_sys[--row].is_parameter_or_point() + && dim_kinds[dim] == PARAMETER) + || (assert(gen_sys[row].is_line()), dim_kinds[dim] == LINE)) + continue; +#ifndef NDEBUG + cerr << "Kinds in dim_kinds should match those in gen_sys." + << endl; +#endif + goto fail; + } + + // A reduced generator system must be the same as a temporary + // reduced copy. + Dimension_Kinds dk = dim_kinds; + // `gs' is minimized and marked_empty returned false, so `gs' + // should contain rows. + assert(!gs.has_no_rows()); + simplify(gs, dk); + // gs contained rows before being reduced, so it should + // contain at least a single point afterward. + assert(!gs.has_no_rows()); + for (dimension_type row = gen_sys.num_rows(); row-- > 0; ) { + 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; + Congruence_System cs_copy = tmp_gr.con_sys; + + // Clear the generators in tmp_gr. + Grid_Generator_System gs(space_dim); + std::swap(tmp_gr.gen_sys, 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.num_columns() - 1 /* modulus */) { +#ifndef NDEBUG + cerr << "Size of dim_kinds should equal the number of columns." + << endl; +#endif + goto fail; + } + + // Check that dim_kinds corresponds to the row kinds in con_sys. + for (dimension_type dim = space_dim, row = 0; dim > 0; --dim) { + if (dim_kinds[dim] == CON_VIRTUAL + || (con_sys[row++].is_proper_congruence() + && dim_kinds[dim] == PROPER_CONGRUENCE) + || (assert(con_sys[row-1].is_equality()), + dim_kinds[dim] == EQUALITY)) + continue; +#ifndef NDEBUG + cerr << "Kinds in dim_kinds should match those in con_sys." << endl; +#endif + goto fail; + } + } + } + + return true; + + fail: +#ifndef NDEBUG + cerr << "Here is the grid under check:" << endl; + ascii_dump(cerr); +#endif + return false; +} + +bool +PPL::Grid::add_congruence_and_minimize(const Congruence& cg) { + Congruence_System cgs(cg); + return add_recycled_congruences_and_minimize(cgs); +} + +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(); + } + 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 { + assert(generators_are_up_to_date()); + gen_sys.insert(g); + if (g.is_parameter_or_point()) + normalize_divisors(gen_sys); + } + + // With the added generator, congruences are out of date. + clear_congruences_up_to_date(); + + clear_generators_minimized(); + set_generators_up_to_date(); + assert(OK()); +} + +bool +PPL::Grid::add_grid_generator_and_minimize(const Grid_Generator& g) { + Grid_Generator_System gs(g); + return add_recycled_grid_generators_and_minimize(gs); +} + +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.recycling_insert(cgs); + + // Congruences may not be minimized and generators are out of date. + clear_congruences_minimized(); + clear_generators_up_to_date(); + // Note: the congruence system may have become unsatisfiable, thus + // we do not check for satisfiability. + assert(OK()); +} + +bool +PPL::Grid::add_recycled_congruences_and_minimize(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_and_minimize(cgs)", + "cgs", cgs); + + // Adding no congruences: just minimize. + if (cgs.has_no_rows()) + return minimize(); + + // Dealing with zero-dimensional space grids first. + if (space_dim == 0) { + // In a 0-dimensional space the congruences are trivial (e.g., 0 + // == 0 or 1 %= 0) or false (e.g., 1 == 0). In a system of + // congruences `begin()' and `end()' are equal if and only if the + // system contains only trivial congruences. + if (cgs.begin() == cgs.end()) + return true; + // There is a congruence, it must be false, the grid is empty. + if (status.test_zero_dim_univ()) + set_empty(); + return false; + } + + if (marked_empty()) + return false; + + if (!congruences_are_up_to_date()) + update_congruences(); + + con_sys.recycling_insert(cgs); + + clear_congruences_minimized(); + +#ifndef NDEBUG + bool ret = update_generators(); + assert(OK()); + return ret; +#else + return update_generators(); +#endif +} + +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 + assert(gs.has_points()); + 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.recycling_insert(gs); + + // Congruences are out of date and generators are not minimized. + clear_congruences_up_to_date(); + clear_generators_minimized(); + + assert(OK(true)); + return; + } + + // The grid is empty. + + // `gs' must contain at least one point. + if (!gs.has_points()) + throw_invalid_generators("add_recycled_grid_generators(gs)", "gs"); + + // Adjust `gs' to the right dimension. + gs.insert(parameter(0*Variable(space_dim-1))); + + std::swap(gen_sys, gs); + + normalize_divisors(gen_sys); + + // The grid is no longer empty and generators are up-to-date. + set_generators_up_to_date(); + clear_empty(); + + assert(OK()); +} + +void +PPL::Grid::add_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); +} + +bool +PPL::Grid +::add_recycled_grid_generators_and_minimize(Grid_Generator_System& gs) { + // Dimension-compatibility check: the dimension of `gs' must be less + // than or equal to that of space_dim. + const dimension_type gs_space_dim = gs.space_dimension(); + if (space_dim < gs_space_dim) + throw_dimension_incompatible("add_recycled_generators_and_minimize(gs)", + "gs", gs); + + // Adding no generators is equivalent to just requiring reduction. + if (gs.has_no_rows()) + return minimize(); + + // Adding valid generators to a zero-dimensional grid produces the + // zero-dimensional universe grid. + if (space_dim == 0) { + if (marked_empty()) + set_zero_dim_univ(); + else + assert(gs.has_points()); + assert(OK(true)); + return true; + } + + // Adjust `gs' to the right dimension. + gs.insert(parameter(0*Variable(space_dim-1))); + + if (!marked_empty()) { + // The grid contains at least one point. + + if (!generators_are_up_to_date()) + update_generators(); + normalize_divisors(gs, gen_sys); + + for (dimension_type row = 0, + gs_num_rows = gs.num_rows(); row < gs_num_rows; ++row) + gen_sys.recycling_insert(gs[row]); + } + else { + // The grid is empty: check if `gs' contains a point. + if (!gs.has_points()) + throw_invalid_generators("add_recycled_generators_and_minimize(gs)", + "gs"); + std::swap(gen_sys, gs); + normalize_divisors(gen_sys); + clear_empty(); + } + clear_generators_minimized(); + update_congruences(); + + assert(OK(true)); + return true; +} + +bool +PPL::Grid::add_grid_generators_and_minimize(const Grid_Generator_System& gs) { + // TODO: this is just an executable specification. + Grid_Generator_System gs_copy = gs; + return add_recycled_grid_generators_and_minimize(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.id()) + throw_dimension_incompatible("unconstrain(var)", var.id()); + + // Do something only if the grid is non-empty. + if (marked_empty() + || (!generators_are_up_to_date() && !update_generators())) + // Empty: do nothing. + return; + + assert(generators_are_up_to_date()); + Grid_Generator l = grid_line(var); + gen_sys.recycling_insert(l); + // With the added generator, congruences are out of date. + clear_congruences_up_to_date(); + clear_generators_minimized(); + assert(OK()); +} + +void +PPL::Grid::unconstrain(const Variables_Set& to_be_unconstrained) { + // The cylindrification wrt no dimensions is a no-op. + // This case also captures the only legal cylindrification + // of a grid in a 0-dim space. + if (to_be_unconstrained.empty()) + return; + + // Dimension-compatibility check. + const dimension_type min_space_dim = to_be_unconstrained.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; + + 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 tbu = to_be_unconstrained.begin(), + tbu_end = to_be_unconstrained.end(); tbu != tbu_end; ++tbu) { + Grid_Generator l = grid_line(Variable(*tbu)); + gen_sys.recycling_insert(l); + } + // Constraints are no longer up-to-date. + clear_generators_minimized(); + clear_congruences_up_to_date(); + 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(); + } + + assert(x.OK() && y.OK()); +} + +bool +PPL::Grid::intersection_assign_and_minimize(const Grid& y) { + intersection_assign(y); + return minimize(); +} + +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.recycling_insert(gs); + // Congruences may be out of date and generators may have lost + // minimal form. + x.clear_congruences_up_to_date(); + x.clear_generators_minimized(); + + // At this point both `x' and `y' are not empty. + assert(x.OK(true) && y.OK(true)); +} + +bool +PPL::Grid::upper_bound_assign_and_minimize(const Grid& y) { + upper_bound_assign(y); + return minimize(); +} + +bool +PPL::Grid::upper_bound_assign_if_exact(const Grid& y) { + 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. + 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 = Linear_Expression(cg); + // 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; + + 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(); + 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); + 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. + 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); + 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; + for (dimension_type i = le.space_dimension(); i-- > 0; ) + le2 += 2 * le.coefficient(Variable(i)) * Variable(i); + le2 += 2 * le.inhomogeneous_term(); + gr.refine_no_check(le2 == y_modulus_i); + } + break; + } + } + } + swap(gr); + assert(OK()); + return false; + } + + 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(); + const Grid_Generator_System& y_gs = y.gen_sys; + + // 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 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_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; + + 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()); + + bool empty_intersection = (!z.minimize()); + + // Add the congruences in the "ruled out" order to `w' + // until the result is the intersection. + for (std::vector::const_iterator + j = ruled_out_vec.begin(), rov_end = ruled_out_vec.end(); + j != rov_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.swap(result_gr); + assert(x.OK()); + return (!empty_intersection); + } + } + // Cannot exit from here. + assert(false); + } + + // All the congruences are redundant so that the simplified grid + // is the universe. + Grid result_gr(x.space_dim, UNIVERSE); + x.swap(result_gr); + 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; + + if (var_space_dim <= expr_space_dim && expr[var_space_dim] != 0) { + // The transformation is invertible. + if (generators_are_up_to_date()) { + // Grid_Generator_System::affine_image() requires the third argument + // to be a positive Coefficient. + if (denominator > 0) + gen_sys.affine_image(var_space_dim, expr, denominator); + else + gen_sys.affine_image(var_space_dim, -expr, -denominator); + clear_generators_minimized(); + // Strong normalization in gs::affine_image may have modified + // divisors. + normalize_divisors(gen_sys); + } + if (congruences_are_up_to_date()) { + // To build the inverse transformation, + // after copying and negating `expr', + // we exchange the roles of `expr[var_space_dim]' and `denominator'. + Linear_Expression inverse; + if (expr[var_space_dim] > 0) { + inverse = -expr; + inverse[var_space_dim] = denominator; + con_sys.affine_preimage(var_space_dim, inverse, expr[var_space_dim]); + } + else { + // The new denominator is negative: we negate everything once + // more, as Congruence_System::affine_preimage() requires the + // third argument to be positive. + inverse = expr; + inverse[var_space_dim] = denominator; + neg_assign(inverse[var_space_dim]); + con_sys.affine_preimage(var_space_dim, inverse, -expr[var_space_dim]); + } + clear_congruences_minimized(); + } + } + else { + // The transformation is not invertible. + // We need an up-to-date system of generators. + if (!generators_are_up_to_date()) + minimize(); + if (!marked_empty()) { + // Grid_Generator_System::affine_image() requires the third argument + // to be a positive Coefficient. + if (denominator > 0) + gen_sys.affine_image(var_space_dim, expr, denominator); + else + gen_sys.affine_image(var_space_dim, -expr, -denominator); + + clear_congruences_up_to_date(); + clear_generators_minimized(); + // Strong normalization in gs::affine_image may have modified + // divisors. + normalize_divisors(gen_sys); + } + } + assert(OK()); +} + +void +PPL::Grid:: +affine_preimage(const Variable var, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator) { + // The denominator cannot be zero. + if (denominator == 0) + throw_invalid_argument("affine_preimage(v, e, d)", "d == 0"); + + // Dimension-compatibility checks. + // The dimension of `expr' should not be greater than the dimension + // of `*this'. + const dimension_type expr_space_dim = expr.space_dimension(); + if (space_dim < expr_space_dim) + throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr); + // `var' should be one of the dimensions of the 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; + + if (var_space_dim <= expr_space_dim && expr[var_space_dim] != 0) { + // The transformation is invertible. + if (congruences_are_up_to_date()) { + // Congruence_System::affine_preimage() requires the third argument + // to be a positive Coefficient. + if (denominator > 0) + con_sys.affine_preimage(var_space_dim, expr, denominator); + else + con_sys.affine_preimage(var_space_dim, -expr, -denominator); + clear_congruences_minimized(); + } + if (generators_are_up_to_date()) { + // To build the inverse transformation, + // after copying and negating `expr', + // we exchange the roles of `expr[var_space_dim]' and `denominator'. + Linear_Expression inverse; + if (expr[var_space_dim] > 0) { + inverse = -expr; + inverse[var_space_dim] = denominator; + gen_sys.affine_image(var_space_dim, inverse, expr[var_space_dim]); + } + else { + // The new denominator is negative: we negate everything once + // more, as Grid_Generator_System::affine_image() requires the + // third argument to be positive. + inverse = expr; + inverse[var_space_dim] = denominator; + neg_assign(inverse[var_space_dim]); + gen_sys.affine_image(var_space_dim, inverse, -expr[var_space_dim]); + } + clear_generators_minimized(); + } + } + else { + // The transformation is not invertible. + // We need an up-to-date system of congruences. + if (!congruences_are_up_to_date()) + minimize(); + // Congruence_System::affine_preimage() requires the third argument + // to be a positive Coefficient. + if (denominator > 0) + con_sys.affine_preimage(var_space_dim, expr, denominator); + else + con_sys.affine_preimage(var_space_dim, -expr, -denominator); + + clear_generators_up_to_date(); + clear_congruences_minimized(); + } + assert(OK()); +} + +void +PPL::Grid:: +generalized_affine_image(const Variable var, + const 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); + + // 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)); + + assert(OK()); + return; + } + + 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(); + + 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, e, d, m)", + "d == 0"); + + // The dimension of `expr' should be at most the dimension of + // `*this'. + const dimension_type expr_space_dim = expr.space_dimension(); + if (space_dim < expr_space_dim) + throw_dimension_incompatible("generalized_affine_preimage(v, e, d, m)", + "e", expr); + // `var' should be one of the dimensions of the grid. + const dimension_type var_space_dim = var.space_dimension(); + if (space_dim < var_space_dim) + throw_dimension_incompatible("generalized_affine_preimage(v, e, d, m)", + "v", var); + + // 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)); + + assert(OK()); + return; + } + + 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) { + 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)); + 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)", + "e1", lhs); + // The dimension of `rhs' should be at most the dimension of + // `*this'. + const dimension_type rhs_space_dim = rhs.space_dimension(); + if (space_dim < rhs_space_dim) + throw_dimension_incompatible("generalized_affine_image(e1, r, e2)", + "e2", rhs); + + // Any image of an empty grid is empty. + if (marked_empty()) + return; + + // 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 (dimension_type i = space_dim; i-- > 0; ) + if (lhs.coefficient(Variable(i)) != 0) + add_grid_generator(grid_line(Variable(i))); + + assert(OK()); + return; + } + + 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'. + do { + if (lhs_space_dim == 0) { + // All variables have zero coefficients, so `lhs' is a constant. + add_congruence_no_check((lhs %= rhs) / tmp_modulus); + return; + } + } + while (lhs.coefficient(Variable(--lhs_space_dim)) == 0); + + // Gather in `new_lines' the collections of all the lines having the + // direction of variables occurring in `lhs'. While at it, check + // whether there exists a variable occurring in both `lhs' and + // `rhs'. + Grid_Generator_System new_lines; + bool lhs_vars_intersect_rhs_vars = false; + for (dimension_type i = lhs_space_dim + 1; i-- > 0; ) + if (lhs.coefficient(Variable(i)) != 0) { + new_lines.insert(grid_line(Variable(i))); + if (rhs.coefficient(Variable(i)) != 0) + lhs_vars_intersect_rhs_vars = true; + } + + if (lhs_vars_intersect_rhs_vars) { + // Some variables in `lhs' also occur in `rhs'. + // To ease the computation, add an additional dimension. + const Variable new_var = Variable(space_dim); + add_space_dimensions_and_embed(1); + + // Constrain the new dimension to be equal to the right hand side. + // TODO: Use add_congruence() 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.insert(parameter(0*Variable(space_dim-1))); + // Add the lines to `gen_sys' (first make sure they are up-to-date). + update_generators(); + gen_sys.recycling_insert(new_lines); + normalize_divisors(gen_sys); + // Update the flags. + clear_congruences_up_to_date(); + clear_generators_minimized(); + + // Constrain the new dimension so that it is congruent to the left + // hand side expression modulo `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); + } + + 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, e2, m)", + "lhs", lhs); + // The dimension of `rhs' must be at most the dimension of `*this'. + const dimension_type rhs_space_dim = rhs.space_dimension(); + if (space_dim < rhs_space_dim) + throw_dimension_incompatible("generalized_affine_preimage(e1, e2, m)", + "e2", rhs); + + // Any preimage of an empty 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 (dimension_type i = lhs_space_dim + 1; i-- > 0; ) + if (lhs.coefficient(Variable(i)) != 0) + add_grid_generator(grid_line(Variable(i))); + + assert(OK()); + return; + } + + 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'. + do { + if (lhs_space_dim == 0) { + // All variables have zero coefficients, so `lhs' is a constant. + // In this case, preimage and image happen to be the same. + add_congruence_no_check((lhs %= rhs) / tmp_modulus); + return; + } + } + while (lhs.coefficient(Variable(--lhs_space_dim)) == 0); + + // Gather in `new_lines' the collections of all the lines having + // the direction of variables occurring in `lhs'. + // While at it, check whether or not there exists a variable + // occurring in both `lhs' and `rhs'. + Grid_Generator_System new_lines; + bool lhs_vars_intersect_rhs_vars = false; + for (dimension_type i = lhs_space_dim + 1; i-- > 0; ) + if (lhs.coefficient(Variable(i)) != 0) { + new_lines.insert(grid_line(Variable(i))); + if (rhs.coefficient(Variable(i)) != 0) + lhs_vars_intersect_rhs_vars = true; + } + + if (lhs_vars_intersect_rhs_vars) { + // Some variables in `lhs' also occur in `rhs'. + // To ease the computation, add an additional dimension. + const Variable new_var = Variable(space_dim); + add_space_dimensions_and_embed(1); + + // Constrain the new dimension to be equal to `lhs' + // TODO: Use add_congruence() 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.insert(parameter(0*Variable(space_dim-1))); + // Add the lines to `gen_sys' (first make sure they are up-to-date). + update_generators(); + gen_sys.recycling_insert(new_lines); + normalize_divisors(gen_sys); + // Update the flags. + clear_congruences_up_to_date(); + clear_generators_minimized(); + + // Constrain the new dimension so that it is related to + // the right hand side modulo `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); + } + 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)", + "lb", lb_expr); + const dimension_type ub_space_dim = ub_expr.space_dimension(); + if (space_dim < ub_space_dim) + throw_dimension_incompatible("bounded_affine_image(v, lb, ub)", + "ub", ub_expr); + + // Any image of an empty 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); + + 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)", + "lb", lb_expr); + const dimension_type ub_space_dim = ub_expr.space_dimension(); + if (space_dim < ub_space_dim) + throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub)", + "ub", ub_expr); + + // Any preimage of an empty 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); + + assert(OK()); +} + +void +PPL::Grid::time_elapse_assign(const Grid& y) { + Grid& x = *this; + // Check dimension-compatibility. + if (x.space_dim != y.space_dim) + throw_dimension_incompatible("time_elapse_assign(y)", "y", y); + + // Deal with the zero-dimensional case. + if (x.space_dim == 0) { + if (y.marked_empty()) + x.set_empty(); + return; + } + + // If either one of `x' or `y' is empty, the result is empty too. + if (x.marked_empty()) + return; + if (y.marked_empty() + || (!x.generators_are_up_to_date() && !x.update_generators()) + || (!y.generators_are_up_to_date() && !y.update_generators())) { + x.set_empty(); + return; + } + + // At this point both generator systems are up-to-date. + Grid_Generator_System gs = y.gen_sys; + dimension_type gs_num_rows = gs.num_rows(); + + normalize_divisors(gs, gen_sys); + + for (dimension_type i = gs_num_rows; i-- > 0; ) { + Grid_Generator& g = gs[i]; + if (g.is_point()) + // Transform the point into a parameter. + g.set_is_parameter(); + } + + if (gs_num_rows == 0) + // `y' was the grid containing a single point at the origin, so + // the result is `x'. + return; + + // Append `gs' to the generators of `x'. + + gen_sys.recycling_insert(gs); + + x.clear_congruences_up_to_date(); + x.clear_generators_minimized(); + + assert(x.OK(true) && y.OK(true)); +} + +/*! \relates Parma_Polyhedra_Library::Grid */ +bool +PPL::operator==(const Grid& x, const Grid& y) { + if (x.space_dim != y.space_dim) + return false; + + if (x.marked_empty()) + return y.is_empty(); + if (y.marked_empty()) + return x.is_empty(); + if (x.space_dim == 0) + return true; + + switch (x.quick_equivalence_test(y)) { + case Grid::TVB_TRUE: + return true; + + case Grid::TVB_FALSE: + return false; + + default: + if (x.is_included_in(y)) { + if (x.marked_empty()) + return y.is_empty(); + return y.is_included_in(x); + } + return false; + } +} + +bool +PPL::Grid::contains(const Grid& y) const { + const Grid& x = *this; + + // Dimension-compatibility check. + if (x.space_dim != y.space_dim) + throw_dimension_incompatible("contains(y)", "y", y); + + if (y.marked_empty()) + return true; + if (x.marked_empty()) + return y.is_empty(); + if (y.space_dim == 0) + return true; + if (x.quick_equivalence_test(y) == Grid::TVB_TRUE) + return true; + return y.is_included_in(x); +} + +bool +PPL::Grid::is_disjoint_from(const Grid& y) const { + // Dimension-compatibility check. + if (space_dim != y.space_dim) + throw_dimension_incompatible("is_disjoint_from(y)", "y", y); + Grid z = *this; + 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) { + if (str == "(up-to-date)") + set_congruences_up_to_date(); + else if (str != "(not_up-to-date)") + return false; + } + else + return false; + + if (!con_sys.ascii_load(s)) + return false; + + if (!(s >> str) || str != "gen_sys") + return false; + + if (s >> str) { + if (str == "(up-to-date)") + set_generators_up_to_date(); + else if (str != "(not_up-to-date)") + return false; + } + else + return false; + + if (!gen_sys.ascii_load(s)) + return false; + + if (!(s >> str) || str != "dimension_kinds") + return false; + + if (!marked_empty() + && ((generators_are_up_to_date() && generators_are_minimized()) + || (congruences_are_up_to_date() && congruences_are_minimized()))) { + dim_kinds.resize(space_dim + 1); + for (Dimension_Kinds::size_type dim = 0; dim <= space_dim; ++dim) { + short unsigned int dim_kind; + if (!(s >> dim_kind)) + return false; + switch(dim_kind) { + case 0: dim_kinds[dim] = PARAMETER; break; + case 1: dim_kinds[dim] = LINE; break; + case 2: dim_kinds[dim] = GEN_VIRTUAL; break; + default: return false; + } + } + } + + // Check invariants. + assert(OK()); + return true; +} + +PPL::memory_size_type +PPL::Grid::external_memory_in_bytes() const { + return + con_sys.external_memory_in_bytes() + + gen_sys.external_memory_in_bytes(); +} + +/*! \relates Parma_Polyhedra_Library::Grid */ +std::ostream& +PPL::IO_Operators::operator<<(std::ostream& s, const Grid& gr) { + if (gr.is_empty()) + s << "false"; + else if (gr.is_universe()) + s << "true"; + else + s << gr.minimized_congruences(); + return s; +} diff --git a/src/Grid_simplify.cc b/src/Grid_simplify.cc new file mode 100644 index 0000000..d55c203 --- /dev/null +++ b/src/Grid_simplify.cc @@ -0,0 +1,572 @@ +/* Grid class implementation: simplify(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include +#include + +#include "Grid.defs.hh" + +namespace Parma_Polyhedra_Library { + +void +Grid::reduce_line_with_line(Grid_Generator& row, Grid_Generator& pivot, + dimension_type column) { + const Coefficient& pivot_column = pivot[column]; + Coefficient& row_column = row[column]; + 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. + row_column = 0; + // pivot.size() - 1 is the index for the parameter divisor so we + // start reducing the line at index pivot.size() - 2. + for (dimension_type col = pivot.size() - 2; + col > column; + --col) { + Coefficient& row_col = row[col]; + row_col *= reduced_pivot_col; + sub_mul_assign(row_col, reduced_row_col, pivot[col]); + } +} + +void +Grid::reduce_equality_with_equality(Congruence& row, + const Congruence& pivot, + const dimension_type column) { + // Assume two equalities. + assert(row.modulus() == 0 && pivot.modulus() == 0); + + const Coefficient& pivot_column = pivot[column]; + Coefficient& row_column = row[column]; + 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. + row_column = 0; + for (dimension_type col = column; col-- > 0; ) { + Coefficient& row_col = row[col]; + row_col *= reduced_pivot_col; + sub_mul_assign(row_col, reduced_row_col, pivot[col]); + } +} + +template +void +Grid::reduce_pc_with_pc(R& row, R& pivot, + const dimension_type column, + const dimension_type start, + const dimension_type end) { + Coefficient& pivot_column = pivot[column]; + Coefficient& row_column = row[column]; + + PPL_DIRTY_TEMP_COEFFICIENT(s); + PPL_DIRTY_TEMP_COEFFICIENT(t); + PPL_DIRTY_TEMP_COEFFICIENT(reduced_row_col); + // Use reduced_row_col temporarily to hold the gcd. + gcdext_assign(reduced_row_col, s, t, pivot_column, row_column); + // Now pivot[column] * s + row[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, reduced_row_col); + pivot_column = reduced_row_col /* gcd */; + 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. 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. + assert(pivot.size() > 0); + assert(row.size() > 0); + row_column = 0; + PPL_DIRTY_TEMP_COEFFICIENT(old_pivot_col); + for (dimension_type col = start; col < end; ++col) { + Coefficient& pivot_col = pivot[col]; + old_pivot_col = pivot_col; + pivot_col *= s; + Coefficient& row_col = row[col]; + add_mul_assign(pivot_col, t, row_col); + row_col *= reduced_pivot_col; + sub_mul_assign(row_col, reduced_row_col, old_pivot_col); + } +} + +void +Grid::reduce_parameter_with_line(Grid_Generator& row, + const Grid_Generator& pivot, + const dimension_type column, + Grid_Generator_System& sys) { + // Very similar to reduce_congruence_with_equality below. Any + // change here may be needed there too. + + const Coefficient& pivot_column = pivot[column]; + Coefficient& row_column = row[column]; + + // Subtract one to allow for the parameter divisor column + const dimension_type num_columns = sys.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) { + for (dimension_type col = num_columns; col-- > 0; ) + row[col] -= pivot[col]; + 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 = sys.num_rows(); index-- > 0; ) { + Grid_Generator& gen = sys[index]; + if (gen.is_parameter_or_point()) + for (dimension_type col = num_columns; col-- > 0; ) + gen[col] *= reduced_pivot_col; + } + // Subtract from row a multiple of pivot such that the result in + // row[column] is zero. + row_column = 0; + for (dimension_type col = num_columns - 1; col > column; --col) + sub_mul_assign(row[col], reduced_row_col, pivot[col]); +} + +void +Grid::reduce_congruence_with_equality(Congruence& row, + const Congruence& pivot, + const dimension_type column, + Congruence_System& sys) { + // Very similar to reduce_parameter_with_line above. Any change + // here may be needed there too. + assert(row.modulus() > 0 && pivot.modulus() == 0); + + const Coefficient& pivot_column = pivot[column]; + Coefficient& row_column = row[column]; + + dimension_type num_columns = sys.num_columns(); + + // If the elements at `column' in row and pivot are the same, then + // just subtract `pivot' from `row'. + if (row_column == pivot_column) { + for (dimension_type col = num_columns; col-- > 0; ) + row[col] -= pivot[col]; + 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.num_rows(); index-- > 0; ) { + Congruence& cg = sys[index]; + if (cg.is_proper_congruence()) + for (dimension_type col = num_columns; col-- > 0; ) + cg[col] *= reduced_pivot_col; + } + // Column num_columns contains the modulus, so start at the next + // column. + --num_columns; + row_column = 0; + // Subtract from row a multiple of pivot such that the result in + // row[column] is zero. + for (dimension_type col = column; col-- > 0; ) + sub_mul_assign(row[col], reduced_row_col, pivot[col]); +} + +#ifndef NDEBUG +template +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++]; + for (dimension_type col = 0; col < row_size; ++col) + if (row[col] != 0) + return false; + } + return true; +} +#endif + +void +Grid::simplify(Grid_Generator_System& sys, Dimension_Kinds& dim_kinds) { + assert(!sys.has_no_rows()); + // For reduce_pc_with_pc. + assert(sys.num_columns() > 0); + + // 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 = sys.num_columns() - 1; + + if (dim_kinds.size() != num_columns) + dim_kinds.resize(num_columns); + + const dimension_type num_rows = sys.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 && sys[row_index][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) + std::swap(sys[row_index], sys[pivot_index]); + Grid_Generator& pivot = sys[pivot_index]; + bool pivot_is_line = pivot.is_line(); + + // Change the matrix so that the value at `dim' in every row + // following `pivot_index' is 0, leaving an equivalent grid. + while (row_index < num_rows - 1) { + ++row_index; + + Grid_Generator& row = sys[row_index]; + + if (row[dim] == 0) + continue; + + if (row.is_line()) + if (pivot_is_line) + reduce_line_with_line(row, pivot, dim); + else { + assert(pivot.is_parameter_or_point()); + std::swap(row, pivot); + pivot_is_line = true; + reduce_parameter_with_line(row, pivot, dim, sys); + } + else { + assert(row.is_parameter_or_point()); + if (pivot_is_line) + reduce_parameter_with_line(row, pivot, dim, sys); + else { + assert(pivot.is_parameter_or_point()); + reduce_pc_with_pc(row, pivot, dim, dim + 1, num_columns); + } + } + } + + if (pivot_is_line) + dim_kinds[dim] = LINE; + else { + 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[dim] < 0) + pivot.negate(dim, num_columns - 1); + + // Factor this row out of the preceding rows. + reduce_reduced + (sys, 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 + (sys, + // index of first + pivot_index, + // index of last + sys.num_rows() - 1, + // row size + sys.num_columns() - 1); + assert(ret == true); +#endif + sys.erase_to_end(pivot_index); + } + + sys.unset_pending_rows(); + + // Ensure that the parameter divisors are the same as the system + // divisor. + const Coefficient& system_divisor = sys[0][0]; + for (dimension_type row = sys.num_rows() - 1, + dim = sys.num_columns() - 2; + dim > 0; --dim) + switch (dim_kinds[dim]) { + case PARAMETER: + sys[row].set_divisor(system_divisor); + case LINE: + --row; + case GEN_VIRTUAL: + break; + } + + assert(sys.OK()); +} + +bool +Grid::simplify(Congruence_System& sys, Dimension_Kinds& dim_kinds) { + assert(sys.num_columns() > 2); + + // Changes here may also be required in the generator version above. + + // TODO: Consider normalizing the moduli only when congruences are + // added to con_sys. + sys.normalize_moduli(); + + const dimension_type num_columns = sys.num_columns() - 1 /* modulus */; + + if (dim_kinds.size() != num_columns) + dim_kinds.resize(num_columns); + + const dimension_type num_rows = sys.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 && sys[row_index][dim] == 0) + ++row_index; + + if (row_index == num_rows) + // Element in column `dim' is zero in all rows from the pivot, + // or `sys' is empty of rows. + dim_kinds[dim] = CON_VIRTUAL; + else { + // row_index != num_rows + if (row_index != pivot_index) + std::swap(sys[row_index], sys[pivot_index]); + Congruence& pivot = sys[pivot_index]; + bool pivot_is_equality = pivot.is_equality(); + + // Change the matrix so that the value at `dim' in every row + // following `pivot_index' is 0, leaving an equivalent grid. + while (row_index < num_rows - 1) { + ++row_index; + + Congruence& row = sys[row_index]; + + if (row[dim] == 0) + continue; + + if (row.is_equality()) + if (pivot_is_equality) + reduce_equality_with_equality(row, pivot, dim); + else { + assert(pivot.is_proper_congruence()); + std::swap(row, pivot); + pivot_is_equality = true; + reduce_congruence_with_equality(row, pivot, dim, sys); + } + else { + assert(row.is_proper_congruence()); + if (pivot_is_equality) + reduce_congruence_with_equality(row, pivot, dim, sys); + else { + assert(pivot.is_proper_congruence()); + reduce_pc_with_pc(row, pivot, dim, 0, dim); + } + } + } + + if (pivot_is_equality) + dim_kinds[dim] = EQUALITY; + else { + assert(pivot.is_proper_congruence()); + dim_kinds[dim] = PROPER_CONGRUENCE; + } + + // Since we are reducing the system to "strong minimal form", + // ensure that a positive value follows the leading zeros. + if (pivot[dim] < 0) + pivot.negate(0, dim); + // Factor this row out of the preceding ones. + reduce_reduced + (sys, dim, pivot_index, 0, dim, dim_kinds, false); + + ++pivot_index; + } + } // end for (dimension_type dim = num_columns; dim-- > 0; ) + + // For clearer naming. + dimension_type& reduced_num_rows = pivot_index; + + if (reduced_num_rows > 0) { + // If the last row is false then make it the equality 1 = 0, and + // make it the only row. + Congruence& last_row = sys[reduced_num_rows - 1]; + if (dim_kinds[0] == PROPER_CONGRUENCE) { + if (last_row.inhomogeneous_term() % last_row.modulus() != 0) { + // The last row is a false proper congruence. + last_row.set_is_equality(); + dim_kinds[0] = EQUALITY; + goto return_empty; + } + } + else if (dim_kinds[0] == EQUALITY) { + // The last row is a false equality, as all the coefficient terms + // are zero while the inhomogeneous term (as a result of the + // reduced form) is some other value. + return_empty: + last_row[0] = 1; + dim_kinds.resize(1); + std::swap(sys.rows[0], sys.rows.back()); + sys.erase_to_end(1); + + assert(sys.OK()); + return true; + } + } + else { + // Either sys is empty (it defines the universe) or every column + // before the modulus column contains only zeroes. + + // Set up the integrality congruence. + dim_kinds[0] = PROPER_CONGRUENCE; + if (num_rows == 0) { + sys.add_zero_rows(1, + Linear_Row::Flags(NECESSARILY_CLOSED, + Linear_Row::RAY_OR_POINT_OR_INEQUALITY)); + Congruence& cg = sys[0]; + cg[num_columns] = 1; + cg[0] = 1; + + assert(sys.OK()); + return false; + } + sys[0][num_columns] = 1; + // Ensure that, after any zero row clipping below, a single row + // will remain for the integrality congruence. + reduced_num_rows = 1; + } + + // Clip any zero rows from the end of the matrix. + if (num_rows > 1 && num_rows > reduced_num_rows) { +#ifndef NDEBUG + const bool ret = rows_are_zero + (sys, + // index of first + reduced_num_rows, + // index of last + num_rows - 1, + // row size + num_columns); + assert(ret == true); +#endif + sys.erase_to_end(reduced_num_rows); + } + + assert(sys.num_rows() == reduced_num_rows); + + // Ensure that the last row is the integrality congruence. + const dimension_type mod_index = num_columns; + if (dim_kinds[0] == CON_VIRTUAL) { + // The last row is virtual, append the integrality congruence. + dim_kinds[0] = PROPER_CONGRUENCE; + sys.add_zero_rows(1, + Linear_Row::Flags(NECESSARILY_CLOSED, + Linear_Row::RAY_OR_POINT_OR_INEQUALITY)); + Congruence& new_last_row = sys[reduced_num_rows]; + new_last_row[mod_index] = 1; + // Try use an existing modulus. + dimension_type row_index = reduced_num_rows; + while (row_index-- > 0) { + Congruence& row = sys[row_index]; + if (row[mod_index] > 0) { + new_last_row[mod_index] = row[mod_index]; + break; + } + } + new_last_row[0] = new_last_row[mod_index]; + // Since we are reducing the system to "strong minimal form", + // increment the number of reduced rows. + ++reduced_num_rows; + } + else { + Congruence& last_row = sys[reduced_num_rows - 1]; + last_row[0] = last_row[mod_index]; + } + + // Since we are reducing the system to "strong minimal form", + // factor the modified integrality congruence out of the other rows; + reduce_reduced + (sys, 0, reduced_num_rows - 1, 0, 0, dim_kinds, false); + + assert(sys.OK()); + return false; +} + +} // namespace Parma_Polyhedra_Library diff --git a/src/Grid_widenings.cc b/src/Grid_widenings.cc new file mode 100644 index 0000000..2af88b8 --- /dev/null +++ b/src/Grid_widenings.cc @@ -0,0 +1,534 @@ +/* Grid class implementation + (non-inline widening-related member functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Grid.defs.hh" + +#include +#include + +namespace PPL = Parma_Polyhedra_Library; + +void +PPL::Grid::select_wider_congruences(const Grid& y, + Congruence_System& cgs_selected) const { + // Private method: the caller must ensure the following conditions + // (beside the inclusion `y <= x'). + assert(space_dim == y.space_dim); + assert(!marked_empty()); + assert(!y.marked_empty()); + assert(congruences_are_minimized()); + assert(y.congruences_are_minimized()); + + // Note: row counters start at 0, to preserve the original order in + // the selected congruences. + for (dimension_type dim = con_sys.space_dimension(), x_row = 0, y_row = 0; + dim > 0; --dim) { + assert(dim_kinds[dim] == CON_VIRTUAL + || dim_kinds[dim] == y.dim_kinds[dim]); + switch (dim_kinds[dim]) { + case PROPER_CONGRUENCE: + { + const Congruence& cg = con_sys[x_row]; + const Congruence& y_cg = y.con_sys[y_row]; + if (cg.is_equal_at_dimension(dim, y_cg)) + // The leading diagonal entries are equal. + cgs_selected.insert(cg); + ++x_row; + ++y_row; + } + break; + case EQUALITY: + cgs_selected.insert(con_sys[x_row]); + ++x_row; + ++y_row; + break; + case CON_VIRTUAL: + y.dim_kinds[dim] == CON_VIRTUAL || ++y_row; + break; + } + } +} + +void +PPL::Grid::congruence_widening_assign(const Grid& const_y, unsigned* tp) { + Grid& x = *this; + Grid& y = const_cast(const_y); + // Dimension-compatibility check. + if (x.space_dim != y.space_dim) + throw_dimension_incompatible("widening_assign(y)", "y", y); + + // Stable behavior is only guaranteed if y is contained in or equal + // to x. +#ifndef NDEBUG + { + // Assume y is contained in or equal to x. + const Grid x_copy = x; + const Grid y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + // Leave `x' the same if `x' or `y' is zero-dimensional or empty. + if (x.space_dim == 0 || x.marked_empty() || y.marked_empty()) + return; + + // Ensure that the `x' congruences are in minimal form. + if (x.congruences_are_up_to_date()) { + if (!x.congruences_are_minimized()) { + if (simplify(x.con_sys, x.dim_kinds)) { + // `x' is empty. + x.set_empty(); + return; + } + x.set_congruences_minimized(); + } + } + else + x.update_congruences(); + + // Ensure that the `y' congruences are in minimal form. + if (y.congruences_are_up_to_date()) { + if (!y.congruences_are_minimized()) { + if (simplify(y.con_sys, y.dim_kinds)) { + // `y' is empty. + y.set_empty(); + return; + } + y.set_congruences_minimized(); + } + } + else + y.update_congruences(); + + if (con_sys.num_equalities() < y.con_sys.num_equalities()) + return; + + // Copy into `cgs' the congruences of `x' that are common to `y', + // according to the grid widening. + Congruence_System cgs; + x.select_wider_congruences(y, cgs); + + if (cgs.num_rows() == con_sys.num_rows()) + // All congruences were selected, thus the result is `x'. + return; + + // A strict subset of the congruences was selected. + + Grid result(x.space_dim); + result.add_recycled_congruences(cgs); + + // Check whether we are using the widening-with-tokens technique + // and there are still tokens available. + if (tp && *tp > 0) { + // There are tokens available. If `result' is not a subset of + // `x', then it is less precise and we use one of the available + // tokens. + if (!x.contains(result)) + --(*tp); + } + else + // No tokens. + std::swap(x, result); + + assert(x.OK(true)); +} + +void +PPL::Grid::limited_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; + } + +#ifndef NDEBUG + { + // Assume that y is contained in or equal to x. + const Grid x_copy = x; + const Grid y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + if (y.marked_empty()) + return; + if (x.marked_empty()) + return; + + // The limited widening between two grids in a zero-dimensional + // space is also a grid in a zero-dimensional space. + if (x.space_dim == 0) + return; + + // Update the generators of `x': these are used to select, from the + // congruences in `cgs', those that must be added to the widened + // grid. + if (!x.generators_are_up_to_date() && !x.update_generators()) + // `x' is empty. + return; + + if (tp == NULL || *tp == 0) { + // Widening may change the grid, so add the congruences. + Congruence_System new_cgs; + // The congruences to be added need only be satisfied by all the + // generators of `x', as `y <= x'. Iterate upwards here, to keep + // the relative ordering of congruences (just for aesthetics). + for (dimension_type i = 0; i < cgs_num_rows; ++i) { + const Congruence& cg = cgs[i]; + if (x.relation_with(cg) == Poly_Con_Relation::is_included()) + new_cgs.insert(cg); + } + x.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); + + assert(OK()); +} + +void +PPL::Grid::select_wider_generators(const Grid& y, + Grid_Generator_System& ggs_selected) const { + // Private method: the caller must ensure the following conditions + // (beside the inclusion `y <= x'). + assert(space_dim == y.space_dim); + assert(!marked_empty()); + assert(!y.marked_empty()); + assert(generators_are_minimized()); + 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) { + 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. + ggs_selected.insert(gg); + else { + Linear_Expression e; + for (dimension_type i = gg.space_dimension(); i-- > 0; ) + e += gg.coefficient(Variable(i)) * Variable(i); + ggs_selected.insert(grid_line(e)); + } + ++x_row; + ++y_row; + } + break; + case LINE: + ggs_selected.insert(gen_sys[x_row]); + ++x_row; + ++y_row; + break; + case GEN_VIRTUAL: + y.dim_kinds[dim] == GEN_VIRTUAL || ++y_row; + break; + } + } +} + +void +PPL::Grid::generator_widening_assign(const Grid& const_y, unsigned* tp) { + Grid& x = *this; + Grid& y = const_cast(const_y); + // Dimension-compatibility check. + if (x.space_dim != y.space_dim) + throw_dimension_incompatible("generator_widening_assign(y)", "y", y); + + // Stable behavior is only guaranteed if y is contained in or equal + // to x. +#ifndef NDEBUG + { + // Assume y is contained in or equal to x. + const Grid x_copy = x; + const Grid y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + // Leave `x' the same if `x' or `y' is zero-dimensional or empty. + if (x.space_dim == 0 || x.marked_empty() || y.marked_empty()) + return; + + // Ensure that the `x' generators are in minimal form. + if (x.generators_are_up_to_date()) { + if (!x.generators_are_minimized()) { + simplify(x.gen_sys, x.dim_kinds); + 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. + if (y.generators_are_up_to_date()) { + if (!y.generators_are_minimized()) { + simplify(y.gen_sys, y.dim_kinds); + assert(!y.gen_sys.has_no_rows()); + y.set_generators_minimized(); + } + } + else + y.update_generators(); + + if (gen_sys.num_rows() > y.gen_sys.num_rows()) + return; + + if (gen_sys.num_lines() > y.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(y, 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 && *tp > 0) { + // There are tokens available. If `result' is not a subset of + // `x', then it is less precise and we use one of the available + // tokens. + if (!x.contains(result)) + --(*tp); + } + else + // No tokens. + std::swap(x, result); + + assert(x.OK(true)); +} + +void +PPL::Grid::limited_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; + } + +#ifndef NDEBUG + { + // Assume that y is contained in or equal to x. + const Grid x_copy = x; + const Grid y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + if (y.marked_empty()) + return; + if (x.marked_empty()) + return; + + // The limited widening between two grids in a zero-dimensional + // space is also a grid in a zero-dimensional space. + if (x.space_dim == 0) + return; + + // Update the generators of `x': these are used to select, from the + // congruences in `cgs', those that must be added to the widened + // grid. + if (!x.generators_are_up_to_date() && !x.update_generators()) + // `x' is empty. + return; + + if (tp == NULL || *tp == 0) { + // Widening may change the grid, so add the congruences. + Congruence_System new_cgs; + // The congruences to be added need only be satisfied by all the + // generators of `x', as `y <= x'. Iterate upwards here, to keep + // the relative ordering of congruences (just for aesthetics). + for (dimension_type i = 0; i < cgs_num_rows; ++i) { + const Congruence& cg = cgs[i]; + if (x.relation_with(cg) == Poly_Con_Relation::is_included()) + new_cgs.insert(cg); + } + x.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); + + assert(OK()); +} + +void +PPL::Grid::widening_assign(const Grid& const_y, unsigned* tp) { + Grid& x = *this; + Grid& y = const_cast(const_y); + // Dimension-compatibility check. + if (x.space_dim != y.space_dim) + throw_dimension_incompatible("widening_assign(y)", "y", y); + + // Stable behavior is only guaranteed if y is contained in or equal + // to x. +#ifndef NDEBUG + { + // Assume y is contained in or equal to x. + const Grid x_copy = x; + const Grid y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + // 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; + } + +#ifndef NDEBUG + { + // Assume that y is contained in or equal to x. + const Grid x_copy = x; + const Grid y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + if (y.marked_empty()) + return; + if (x.marked_empty()) + return; + + // The limited widening between two grids in a zero-dimensional + // space is also a grid in a zero-dimensional space. + if (x.space_dim == 0) + return; + + // Update the generators of `x': these are used to select, from the + // congruences in `cgs', those that must be added to the widened + // grid. + if (!x.generators_are_up_to_date() && !x.update_generators()) + // `x' is empty. + return; + + if (tp == NULL || *tp == 0) { + // Widening may change the grid, so add the congruences. + Congruence_System new_cgs; + // The congruences to be added need only be satisfied by all the + // generators of `x', as `y <= x'. Iterate upwards here, to keep + // the relative ordering of congruences (just for aesthetics). + for (dimension_type i = 0; i < cgs_num_rows; ++i) { + const Congruence& cg = cgs[i]; + if (x.relation_with(cg) == Poly_Con_Relation::is_included()) + new_cgs.insert(cg); + } + x.widening_assign(y, tp); + x.add_recycled_congruences(new_cgs); + } + else + // There are tokens, so widening will leave the grid the same. + x.widening_assign(y, tp); + + assert(OK()); +} diff --git a/src/H79_Certificate.cc b/src/H79_Certificate.cc new file mode 100644 index 0000000..25bae6e --- /dev/null +++ b/src/H79_Certificate.cc @@ -0,0 +1,119 @@ +/* H79_Certificate class implementation + (non-inline member functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "H79_Certificate.defs.hh" + +#include "Polyhedron.defs.hh" +#include +#include + +namespace PPL = Parma_Polyhedra_Library; + +PPL::H79_Certificate::H79_Certificate(const Polyhedron& ph) + : affine_dim(0), num_constraints(0) { + // The affine dimension of the polyhedron is obtained by subtracting + // the number of equalities from the space dimension. + // When counting constraints, for a correct reasoning, we have + // to disregard the low-level constraints (i.e., the positivity + // constraint and epsilon bounds). + const dimension_type space_dim = ph.space_dimension(); + affine_dim = space_dim; + const Constraint_System& cs = ph.minimized_constraints(); + // It is assumed that `ph' is not an empty polyhedron. + assert(!ph.marked_empty()); + for (Constraint_System::const_iterator i = cs.begin(), + cs_end = cs.end(); i != cs_end; ++i) { + ++num_constraints; + if (i->is_equality()) + --affine_dim; + } + + // TODO: this is an inefficient workaround. + // For NNC polyhedra, generators might be no longer up-to-date + // (and hence, neither minimized) due to the strong minimization + // process applied to constraints when constructing the certificate. + // We have to reinforce the (normal) minimization of the generator + // system. The future, lazy implementation of the strong minimization + // process will solve this problem. + if (!ph.is_necessarily_closed()) + ph.minimize(); +} + +int +PPL::H79_Certificate::compare(const H79_Certificate& y) const { + if (affine_dim != y.affine_dim) + return affine_dim > y.affine_dim ? 1 : -1; + if (num_constraints != y.num_constraints) + return num_constraints > y.num_constraints ? 1 : -1; + // All components are equal. + return 0; +} + +int +PPL::H79_Certificate::compare(const Polyhedron& ph) const { + // The affine dimension of the polyhedron is obtained by subtracting + // the number of equalities from the space dimension. + // When counting constraints, for a correct reasoning, we have + // to disregard the low-level constraints (i.e., the positivity + // constraint and epsilon bounds). + const dimension_type space_dim = ph.space_dimension(); + dimension_type ph_affine_dim = space_dim; + dimension_type ph_num_constraints = 0; + const Constraint_System& cs = ph.minimized_constraints(); + // It is assumed that `ph' is a polyhedron containing the + // polyhedron described by `*this': hence, it cannot be empty. + assert(!ph.marked_empty()); + for (Constraint_System::const_iterator i = cs.begin(), + cs_end = cs.end(); i != cs_end; ++i) { + ++ph_num_constraints; + if (i->is_equality()) + --ph_affine_dim; + } + // TODO: this is an inefficient workaround. + // For NNC polyhedra, generators might be no longer up-to-date + // (and hence, neither minimized) due to the strong minimization + // process applied to constraints when constructing the certificate. + // We have to reinforce the (normal) minimization of the generator + // system. The future, lazy implementation of the strong minimization + // process will solve this problem. + if (!ph.is_necessarily_closed()) + ph.minimize(); + + // If the affine dimension of `ph' is increasing, the chain is stabilizing. + if (ph_affine_dim > affine_dim) + return 1; + + // At this point the two polyhedra must have the same affine dimension. + assert(ph_affine_dim == affine_dim); + + // If the number of constraints of `ph' is decreasing, then the chain + // is stabilizing. If it is increasing, the chain is not stabilizing. + if (ph_num_constraints != num_constraints) + return ph_num_constraints < num_constraints ? 1 : -1; + + // All components are equal. + return 0; +} + diff --git a/src/H79_Certificate.defs.hh b/src/H79_Certificate.defs.hh new file mode 100644 index 0000000..64dbddd --- /dev/null +++ b/src/H79_Certificate.defs.hh @@ -0,0 +1,97 @@ +/* H79_Certificate class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_H79_Certificate_defs_hh +#define PPL_H79_Certificate_defs_hh 1 + +#include "H79_Certificate.types.hh" +#include "Polyhedron.types.hh" +#include "globals.types.hh" +#include +#include + +//! 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 + 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 + 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 true 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..80d79da --- /dev/null +++ b/src/H79_Certificate.inlines.hh @@ -0,0 +1,70 @@ +/* H79_Certificate class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_H79_Certificate_inlines_hh +#define PPL_H79_Certificate_inlines_hh 1 + +#include "Polyhedron.defs.hh" + +namespace Parma_Polyhedra_Library { + +inline +H79_Certificate::H79_Certificate() + : affine_dim(0), num_constraints(0) { + // This is the certificate for a zero-dim universe polyhedron. +} + +inline +H79_Certificate::H79_Certificate(const H79_Certificate& y) + : affine_dim(y.affine_dim), num_constraints(y.num_constraints) { +} + +inline +H79_Certificate::~H79_Certificate() { +} + +inline bool +H79_Certificate::Compare::operator()(const H79_Certificate& x, + const H79_Certificate& y) const { + // For an efficient evaluation of the multiset ordering based + // on this lgo relation, we want larger elements to come first. + return x.compare(y) == 1; +} + +template +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 +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..bb71475 --- /dev/null +++ b/src/H79_Certificate.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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/Has_Assign_Or_Swap.hh b/src/Has_Assign_Or_Swap.hh new file mode 100644 index 0000000..9c972a7 --- /dev/null +++ b/src/Has_Assign_Or_Swap.hh @@ -0,0 +1,53 @@ +/* Has_Assign_Or_Swap classes declarations. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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 +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 +struct Has_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..35fb4f4 --- /dev/null +++ b/src/Init.cc @@ -0,0 +1,120 @@ +/* Init class implementation (non-inline functions and static variables). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#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" + +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 + +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_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)); +#endif + // The default is choosen to have a precision greater than most + // precise IEC559 floating point (112 bits of mantissa). + set_rational_sqrt_precision_parameter(128); + } +} + +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 + // ... 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..bd84225 --- /dev/null +++ b/src/Init.defs.hh @@ -0,0 +1,86 @@ +/* Init class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Init_defs_hh +#define PPL_Init_defs_hh 1 + +#include "Init.types.hh" +#include "fpu.types.hh" + +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. + + 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 + Nifty Counter 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: + //! 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..725c022 --- /dev/null +++ b/src/Init.inlines.hh @@ -0,0 +1,47 @@ +/* Init class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Init_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..a5fe3cd --- /dev/null +++ b/src/Init.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PPL_Init_types_hh +#define PPL_Init_types_hh 1 + +namespace Parma_Polyhedra_Library { + +class Init; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Init_types_hh) diff --git a/src/Interval.defs.hh b/src/Interval.defs.hh new file mode 100644 index 0000000..739571d --- /dev/null +++ b/src/Interval.defs.hh @@ -0,0 +1,983 @@ +/* Declarations for the Interval class and its constituents. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Interval_defs_hh +#define PPL_Interval_defs_hh 1 + +#include "globals.defs.hh" +#include "meta_programming.hh" +#include "assign_or_swap.hh" +#include "Interval.types.hh" +#include "Interval_Info.defs.hh" +#include + +// Temporary! +#include + +namespace Parma_Polyhedra_Library { + +enum I_Result { + I_EMPTY = 0, + /* + I_L_EQ = V_EQ, + I_L_GT = V_GT, + I_L_GE = V_GE, + I_U_EQ = V_EQ << 6, + I_U_LT = V_LT << 6, + I_U_LE = V_LE << 6, + */ + I_MAYBE_EMPTY = 1 << 12, + I_SINGULARITIES = 1 << 13 +}; + +enum Ternary { T_YES, T_NO, T_MAYBE }; + +inline I_Result +combine(Result l, Result u) { + return static_cast(l | (u << 6)); +} + +inline Result +lower(I_Result r) { + return static_cast(r & 63); +} + +inline Result +upper(I_Result r) { + return static_cast((r >> 6) & 63); +} + +template +inline bool +unrepresentability_error(I_Result r, const Info&) { + return !Info::store_special + && (is_special(lower(r)) || is_special(upper(r))); +} + +using namespace Boundary_NS; +using namespace Interval_NS; + +struct Interval_Base {}; + +template +struct Is_Singleton : public Is_Native_Or_Checked {}; + +template +struct Is_Interval : public Is_Same_Or_Derived {}; + +//! 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 signed char to long long + and from int8_t to int64_t); + - a bounded precision floating point type (float, + double or long double); + - an unbounded integer or rational type, as provided by the C++ interface + of GMP (mpz_class or mpq_class). + + 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; + - the ability to support (independently from the type of the boundaries) + plain intervals of real numbers and intervals subject to generic + restrictions (e.g., intervals of integer numbers). +*/ +template +class Interval : public Interval_Base, private Info { +private: + PPL_COMPILE_TIME_CHECK(!Info::store_special + || !std::numeric_limits::has_infinity, + "store_special is meaningless" + " when boundary type may contains infinity"); + Info& w_info() const { + return const_cast(*this); + } + bool is_empty_nocache() const { + return lt(UPPER, upper(), info(), LOWER, lower(), info()); + } + bool is_singleton_nocache() const { + return eq(LOWER, lower(), info(), UPPER, upper(), info()); + } + Result lower_normalize() const { + Result r; + if (info().get_boundary_property(LOWER, NORMALIZED) + || info().get_boundary_property(LOWER, SPECIAL)) + r = V_EQ; + else { + Boundary& l = const_cast(lower()); + if (info().get_boundary_property(LOWER, OPEN)) { + r = info().restrict(round_dir_check(LOWER, true), l, V_GT); + if (r != V_GT) + w_info().set_boundary_property(LOWER, OPEN, false); + } + else { + r = info().restrict(round_dir_check(LOWER, true), l, V_GE); + if (r == V_GT) + w_info().set_boundary_property(LOWER, OPEN); + } + w_info().set_boundary_property(LOWER, NORMALIZED); + } + return r; + } + Result upper_normalize() const { + Result r; + if (info().get_boundary_property(UPPER, NORMALIZED) + || info().get_boundary_property(UPPER, SPECIAL)) + r = V_EQ; + else { + Boundary& u = const_cast(upper()); + if (info().get_boundary_property(UPPER, OPEN)) { + r = info().restrict(round_dir_check(UPPER, true), u, V_LT); + if (r != V_LT) + w_info().set_boundary_property(UPPER, OPEN, false); + } + else { + r = info().restrict(round_dir_check(UPPER, true), u, V_LE); + if (r == V_LT) + w_info().set_boundary_property(UPPER, OPEN); + } + w_info().set_boundary_property(UPPER, NORMALIZED); + } + return r; + } + + +public: + typedef Boundary boundary_type; + typedef Info info_type; + + typedef Interval_NS::Property Property; + + void lower_load() { +#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG + lower_loaded = 1; +#endif + } + + void upper_load() { +#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG + upper_loaded = 1; +#endif + } + + void complete_init() { +#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG + assert(lower_loaded); + assert(upper_loaded); + completed = 1; +#endif + } + + void complete_init_internal() { +#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG + lower_loaded = 1; + upper_loaded = 1; + completed = 1; +#endif + } + + template + typename Enable_If::value || Is_Interval::value, Interval&>::type + operator=(const T& x) { + assign(x); + return *this; + } + + template + typename Enable_If::value || Is_Interval::value, Interval&>::type + operator+=(const T& x) { + add_assign(*this, x); + return *this; + } + template + typename Enable_If::value || Is_Interval::value, Interval&>::type + operator-=(const T& x) { + sub_assign(*this, x); + return *this; + } + template + typename Enable_If::value || Is_Interval::value, Interval&>::type + operator*=(const T& x) { + mul_assign(*this, x); + return *this; + } + template + typename Enable_If::value || Is_Interval::value, Interval&>::type + operator/=(const T& x) { + div_assign(*this, x); + return *this; + } + + //! Swaps \p *this with \p y. + void 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_; + } + + Ternary is_empty_cached() const { + if (info().get_interval_property(CARDINALITY_0)) + return info().get_interval_property(CARDINALITY_IS) ? T_YES : T_NO; + else if (info().get_interval_property(CARDINALITY_IS)) + return T_NO; + else + return T_MAYBE; + } + + Ternary is_singleton_cached() const { + if (info().get_interval_property(CARDINALITY_1)) + return info().get_interval_property(CARDINALITY_IS) ? T_YES : T_NO; + else if (info().get_interval_property(CARDINALITY_IS)) + return T_NO; + else + return T_MAYBE; + } + + bool is_empty() const { + switch (is_empty_cached()) { + case T_NO: + return false; + case T_YES: + return true; + case T_MAYBE: + bool r = is_empty_nocache(); + if (r) { + w_info().set_interval_property(CARDINALITY_IS, r); + w_info().set_interval_property(CARDINALITY_1, false); + } + w_info().set_interval_property(CARDINALITY_0); + return r; + } + assert(false); + return false; + } + + bool is_singleton() const { + switch (is_singleton_cached()) { + case T_NO: + return false; + case T_YES: + return true; + case T_MAYBE: + bool r = is_singleton_nocache(); + if (r) { + w_info().set_interval_property(CARDINALITY_IS, r); + w_info().set_interval_property(CARDINALITY_0, false); + } + w_info().set_interval_property(CARDINALITY_1); + return r; + } + assert(false); + return false; + } + + bool has_restriction() const { + return info().has_restriction(); + } + + I_Result normalize() const { + assert(OK()); + if (has_restriction()) { + Result rl = lower_normalize(); + Result ru = upper_normalize(); + // FIXME: this invalidation is not needed if interval is unchanged + invalidate_cardinality_cache(); + info().normalize(); + assert(OK()); + return combine(rl, ru); + } + else + return combine(V_EQ, V_EQ); + } + + bool lower_is_open() const { + assert(OK()); + return is_open(LOWER, lower(), info()); + } + + bool upper_is_open() const { + assert(OK()); + return is_open(UPPER, upper(), info()); + } + + Result lower_shrink() { + assert(OK()); + return shrink(LOWER, lower(), info(), false); + } + + Result upper_shrink() { + assert(OK()); + return shrink(UPPER, upper(), info(), false); + } + + bool lower_is_unbounded() const { + assert(OK()); + return Boundary_NS::is_unbounded(LOWER, lower(), info()); + } + + bool upper_is_unbounded() const { + assert(OK()); + return Boundary_NS::is_unbounded(UPPER, upper(), info()); + } + + bool is_unbounded() const { + assert(OK()); + return lower_is_unbounded() || upper_is_unbounded(); + } + + bool is_universe() const { + assert(OK()); + return lower_is_unbounded() && upper_is_unbounded() + && !has_restriction(); + } + + void invalidate_cardinality_cache() const { + w_info().set_interval_property(CARDINALITY_IS, false); + w_info().set_interval_property(CARDINALITY_0, false); + w_info().set_interval_property(CARDINALITY_1, false); + } + + template + Result lower_set_uninit(const T& x, bool open = false) { + info().clear_boundary_properties(LOWER); + Result rl = Boundary_NS::assign(LOWER, lower(), info(), LOWER, x, f_info(x, open)); + lower_load(); + return rl; + } + + Result lower_set_uninit(const Unbounded&) { + info().clear_boundary_properties(LOWER); + Result rl = set_unbounded(LOWER, lower(), info()); + lower_load(); + return rl; + } + + template + Result lower_set(const T& x, bool open = false) { + assert(OK()); + info().clear_boundary_properties(LOWER); + Result rl = Boundary_NS::assign(LOWER, lower(), info(), LOWER, x, f_info(x, open)); + invalidate_cardinality_cache(); + assert(OK()); + return rl; + } + + Result lower_set(const Unbounded&) { + assert(OK()); + info().clear_boundary_properties(LOWER); + Result rl = set_unbounded(LOWER, lower(), info()); + invalidate_cardinality_cache(); + assert(OK()); + return rl; + } + + template + Result lower_narrow(const T& x, bool open = false) { + assert(OK()); + if (ge(LOWER, lower(), info(), LOWER, x, f_info(x, open))) + return V_EQ; + return lower_set(x, open); + } + + template + Result lower_widen(const T& x, bool open = false) { + assert(OK()); + if (le(LOWER, lower(), info(), LOWER, x, f_info(x, open))) + return V_EQ; + return lower_set(x, open); + } + + Result lower_widen(const Unbounded&) { + assert(OK()); + if (lower_is_unbounded()) + return V_EQ; + info().clear_boundary_properties(LOWER); + Result rl = set_unbounded(LOWER, lower(), info()); + invalidate_cardinality_cache(); + assert(OK()); + return V_EQ; + } + + template + Result upper_set_uninit(const T& x, bool open = false) { + info().clear_boundary_properties(UPPER); + Result rl = Boundary_NS::assign(UPPER, upper(), info(), UPPER, x, f_info(x, open)); + upper_load(); + return rl; + } + Result upper_set_uninit(const Unbounded&) { + info().clear_boundary_properties(UPPER); + Result rl = set_unbounded(UPPER, upper(), info()); + upper_load(); + return rl; + } + + template + Result upper_set(const T& x, bool open = false) { + assert(OK()); + info().clear_boundary_properties(UPPER); + Result rl = Boundary_NS::assign(UPPER, upper(), info(), UPPER, x, f_info(x, open)); + invalidate_cardinality_cache(); + assert(OK()); + return rl; + } + + Result upper_set(const Unbounded&) { + assert(OK()); + info().clear_boundary_properties(UPPER); + Result rl = set_unbounded(UPPER, upper(), info()); + invalidate_cardinality_cache(); + assert(OK()); + return rl; + } + + template + Result upper_narrow(const T& x, bool open = false) { + assert(OK()); + if (le(UPPER, upper(), info(), UPPER, x, f_info(x, open))) + return V_EQ; + return upper_set(x, open); + } + + template + Result upper_widen(const T& x, bool open = false) { + assert(OK()); + if (ge(UPPER, upper(), info(), UPPER, x, f_info(x, open))) + return V_EQ; + return upper_set(x, open); + } + + Result upper_widen(const Unbounded&) { + assert(OK()); + if (upper_is_unbounded()) + return V_EQ; + info().clear_boundary_properties(UPPER); + Result rl = set_unbounded(UPPER, upper(), info()); + invalidate_cardinality_cache(); + assert(OK()); + return rl; + } + + I_Result assign(Degenerate_Element e) { + I_Result r; + Result rl, ru; + info().clear(); + switch (e) { + case EMPTY: + info().set_interval_property(CARDINALITY_IS); + info().set_interval_property(CARDINALITY_0); + lower_set_uninit(1); + upper_set_uninit(0); + r = I_EMPTY; + break; + case UNIVERSE: + info().set_interval_property(CARDINALITY_0, true); + info().set_interval_property(CARDINALITY_1, true); + rl = lower_set_uninit(UNBOUNDED); + ru = upper_set_uninit(UNBOUNDED); + r = combine(rl, ru); + break; + default: + assert(0); + r = I_EMPTY; + break; + } + complete_init(); + assert(OK()); + return r; + } + + template + typename Enable_If::value, I_Result>::type + assign(const From&) { + info().clear(); + info().set_interval_property(CARDINALITY_0, true); + info().set_interval_property(CARDINALITY_1, true); + Result rl, ru; + switch (From::code) { + 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: + assert(0); + rl = VC_NAN; + ru = VC_NAN; + } + complete_init_internal(); + assert(OK()); + return combine(rl, ru); + } + + I_Result set_infinities() { + info().clear(); + info().set_interval_property(CARDINALITY_0, true); + info().set_interval_property(CARDINALITY_1, true); + // FIXME: what about restrictions? + Result rl = Boundary_NS::set_minus_infinity(LOWER, lower(), info()); + Result ru = Boundary_NS::set_plus_infinity(UPPER, upper(), info()); + complete_init_internal(); + assert(OK()); + return combine(rl, ru); + } + + bool is_topologically_closed() const { + assert(OK()); + return !Info::store_open + || is_empty() + || ((lower_is_unbounded() || !lower_is_open()) + && (upper_is_unbounded() || !upper_is_open())); + } + + //! Assigns to \p *this its topological closure. + void topological_closure_assign() { + if (!Info::store_open || is_empty()) + return; + + if (!lower_is_unbounded()) + info().set_boundary_property(LOWER, OPEN, false); + + if (!upper_is_unbounded()) + info().set_boundary_property(UPPER, OPEN, false); + } + + bool is_infinity() const { + 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 { + assert(OK()); + if (is_empty()) + return false; + if (is_unbounded()) + 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; + } + + //! 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 { +#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG + if (!completed) { + std::cerr << "The interval initialization has not been completed." + << std::endl; + return false; + } +#endif +#if 0 + if (!Info::may_be_empty && is_empty()) { +#ifndef NDEBUG + std::cerr << "The interval is unexpectedly empty.\n"; +#endif + return false; + } +#endif + + 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 0 + if (info().get_boundary_property(LOWER, NORMALIZED) + && !info().is_restricted(lower())) { +#ifndef NDEBUG + std::cerr << "The lower boundary is marked to be normalized, " + << "but it is not.\n"; +#endif + return false; + } +#endif + } + + 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; + } +#if 0 + if (info().get_boundary_property(UPPER, NORMALIZED) + && !info().is_restricted(upper())) { +#ifndef NDEBUG + std::cerr << "The upper boundary is marked to be normalized, " + << "but it is not.\n"; +#endif + return false; + } +#endif + } + + Ternary t; + + t = is_empty_cached(); + if (t == T_YES) { + if (!is_empty_nocache()) { +#ifndef NDEBUG + std::cerr << "The interval is marked to be empty, " + << "but actually it is not empty.\n"; +#endif + return false; + } + } + else if (t == T_NO) { + if (is_empty_nocache()) { +#ifndef NDEBUG + std::cerr << "The interval is marked to be not empty, " + << "but actually it is empty.\n"; +#endif + return false; + } + } + + t = is_singleton_cached(); + if (t == T_YES) { + if (!is_singleton_nocache()) { +#ifndef NDEBUG + std::cerr << "The interval is marked to be singleton, " + << "but actually it is not singleton.\n"; +#endif + return false; + } + } + else if (t == T_NO) { + if (is_singleton_nocache()) { +#ifndef NDEBUG + std::cerr << "The interval is marked to be not singleton, " + << "but actually it is singleton.\n"; +#endif + return false; + } + } + + if (info().get_interval_property(CARDINALITY_IS) && + info().get_interval_property(CARDINALITY_0) + == info().get_interval_property(CARDINALITY_1)) { +#ifndef NDEBUG + std::cerr << "The interval is marked to know its cardinality, " + << "but this is unspecified or ambiguous.\n"; +#endif + return false; + } + + // Everything OK. + return true; + } + + Interval() +#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG + : lower_loaded(0), upper_loaded(0), completed(0) +#endif + { + } + + template + explicit Interval(const T& x) +#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG + : lower_loaded(0), upper_loaded(0), completed(0) +#endif + { + assign(x); + } + + template + typename Enable_If::value + || Is_Interval::value, bool>::type + contains(const T& y) const; + + template + typename Enable_If::value + || Is_Interval::value, bool>::type + strictly_contains(const T& y) const; + + template + typename Enable_If::value + || Is_Interval::value, bool>::type + is_disjoint_from(const T& y) const; + + template + I_Result assign(const From1& l, const From2& u); + + template + typename Enable_If::value + || Is_Interval::value, I_Result>::type + assign(const From& x); + + template + typename Enable_If::value + || Is_Interval::value, bool>::type + can_be_exactly_joined_to(const Type& x) const; + + template + typename Enable_If::value + || Is_Interval::value, I_Result>::type + join_assign(const From& x); + + template + typename Enable_If<((Is_Singleton::value + || Is_Interval::value) + && (Is_Singleton::value + || Is_Interval::value)), I_Result>::type + join_assign(const From1& x, const From2& y); + + template + typename Enable_If::value + || Is_Interval::value, I_Result>::type + intersect_assign(const From& x); + + template + typename Enable_If<((Is_Singleton::value + || Is_Interval::value) + && (Is_Singleton::value + || Is_Interval::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 Enable_If::value + || Is_Interval::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 Enable_If<((Is_Singleton::value + || Is_Interval::value) + && (Is_Singleton::value + || Is_Interval::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 Enable_If::value + || Is_Interval::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 Enable_If::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. + + \note + Depending on interval restrictions, there could be many + maximal intervals all inconsistent with respect to \p y. + */ + template + typename Enable_If::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 Enable_If::value + || Is_Interval::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 Enable_If::value + || Is_Interval::value, I_Result>::type + refine_universal(Relation_Symbol rel, const From& x); + + template + typename Enable_If::value + || Is_Interval::value, I_Result>::type + neg_assign(const From& x); + + template + typename Enable_If<((Is_Singleton::value || Is_Interval::value) + && (Is_Singleton::value || Is_Interval::value)), I_Result>::type + add_assign(const From1& x, const From2& y); + + template + typename Enable_If<((Is_Singleton::value || Is_Interval::value) + && (Is_Singleton::value || Is_Interval::value)), I_Result>::type + sub_assign(const From1& x, const From2& y); + + template + typename Enable_If<((Is_Singleton::value || Is_Interval::value) + && (Is_Singleton::value || Is_Interval::value)), I_Result>::type + mul_assign(const From1& x, const From2& y); + + template + typename Enable_If<((Is_Singleton::value || Is_Interval::value) + && (Is_Singleton::value || Is_Interval::value)), I_Result>::type + div_assign(const From1& x, const From2& y); + + template + typename Enable_If::value, void>::type + CC76_widening_assign(const From& y, Iterator first, Iterator last); + +private: + Boundary lower_; + Boundary upper_; +#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG + unsigned int lower_loaded:1; + unsigned int upper_loaded:1; + unsigned int completed:1; +#endif +}; + +} // 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..84b17ce --- /dev/null +++ b/src/Interval.inlines.hh @@ -0,0 +1,1283 @@ +/* Inline functions for the Interval class and its constituents. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Interval_inlines_hh +#define PPL_Interval_inlines_hh 1 + +namespace Parma_Polyhedra_Library { + +template +inline memory_size_type +Interval::external_memory_in_bytes() const { + return Parma_Polyhedra_Library::external_memory_in_bytes(lower()) + + Parma_Polyhedra_Library::external_memory_in_bytes(upper()); +} + +template +inline memory_size_type +Interval::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +template +inline void +Interval::swap(Interval& y) { + std::swap(lower(), y.lower()); + std::swap(upper(), y.upper()); + std::swap(info(), y.info()); +} + +template +inline bool +f_is_empty(const Interval& x) { + return x.is_empty(); +} +template +inline bool +f_is_singleton(const Interval& x) { + return x.is_singleton(); +} +template +inline int +is_infinity(const Interval& x) { + return x.is_infinity(); +} + +namespace Interval_NS { + +template +inline const Boundary& +f_lower(const Interval& x) { + return x.lower(); +} +template +inline const Boundary& +f_upper(const Interval& x) { + return x.upper(); +} +template +inline const Info& +f_info(const Interval& 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_empty_result, false); + const_bool_nodef(check_inexact, false); +}; + +typedef Interval_Restriction_None > Scalar_As_Interval_Info; + +const Scalar_As_Interval_Info SCALAR_INFO; + +typedef Interval_Restriction_None > Scalar_As_Interval_Info_Open; + +template +inline typename Enable_If::value, const T&>::type +f_lower(const T& x) { + return x; +} +template +inline typename Enable_If::value, const T&>::type +f_upper(const T& x) { + return x; +} +template +inline typename Enable_If::value, const Scalar_As_Interval_Info&>::type +f_info(const T&) { + return SCALAR_INFO; +} +template +inline typename Enable_If::value, Scalar_As_Interval_Info_Open>::type +f_info(const T&, bool open) { + return Scalar_As_Interval_Info_Open(open); +} + +template +inline typename Enable_If::value, bool>::type +f_is_empty(const T& x) { + return is_not_a_number(x); +} + +template +inline typename Enable_If::value, bool>::type +f_is_singleton(const T& x) { + return !f_is_empty(x); +} + +template +inline typename Enable_If::value || Is_Interval::value, Ternary>::type +f_is_empty_lazy(const T& x) { + if (f_info(x).get_interval_property(CARDINALITY_0)) + return f_info(x).get_interval_property(CARDINALITY_IS) ? T_YES : T_NO; + else + return T_MAYBE; +} + +} // namespace Interval_NS + +template +inline typename Enable_If::value || Is_Interval::value, bool>::type +is_singleton_integer(const T& x) { + return is_singleton(x) && is_integer(f_lower(x)); +} + +template +inline typename Enable_If::value || Is_Interval::value, bool>::type +check_empty_arg(const T& x) { + if (f_info(x).may_be_empty) + return f_is_empty(x); + else { + assert(!f_is_empty(x)); + return false; + } +} + +template +inline I_Result +check_empty_result(const Interval& x, I_Result r) { + if (Info::check_empty_result && f_is_empty(x)) + return I_EMPTY; + else + return static_cast(r | I_MAYBE_EMPTY); +} + +template +inline typename Enable_If<((Is_Singleton::value || Is_Interval::value) + && (Is_Singleton::value || Is_Interval::value) + && (Is_Interval::value || Is_Interval::value)), + bool>::type +operator==(const T1& x, const T2& y) { + assert(f_OK(x)); + assert(f_OK(y)); + if (check_empty_arg(x)) + return check_empty_arg(y); + else if (check_empty_arg(y)) + return false; + // FIXME: the two restrictions should be evaluated in the context of + // the specific interval + return eq_restriction(f_info(x), f_info(y)) + && 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 +inline typename Enable_If<((Is_Singleton::value || Is_Interval::value) + && (Is_Singleton::value || Is_Interval::value) + && (Is_Interval::value || Is_Interval::value)), + bool>::type +operator!=(const T1& x, const T2& y) { + return !(x == y); +} + +template +template +inline typename Enable_If::value || Is_Interval::value, bool>::type +Interval::contains(const T& y) const { + assert(OK()); + assert(f_OK(y)); + if (check_empty_arg(y)) + return true; + if (check_empty_arg(*this)) + return false; + // FIXME: the two restrictions should be evaluated in the context of + // the specific interval + if (!contains_restriction(info(), f_info(y))) + 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 +template +inline typename Enable_If::value || Is_Interval::value, bool>::type +Interval::strictly_contains(const T& y) const { + assert(OK()); + assert(f_OK(y)); + if (check_empty_arg(y)) + return !check_empty_arg(*this); + if (check_empty_arg(*this)) + return false; + // FIXME: the two restrictions should be evaluated in the context of + // the specific interval + if (!contains_restriction(info(), f_info(y))) + return false; + else if (!eq_restriction(info(), f_info(y))) + return le(LOWER, lower(), info(), LOWER, f_lower(y), f_info(y)) + && ge(UPPER, upper(), info(), UPPER, f_upper(y), f_info(y)); + 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 +template +inline typename Enable_If::value + || Is_Interval::value, bool>::type +Interval::is_disjoint_from(const T& y) const { + assert(OK()); + assert(f_OK(y)); + if (check_empty_arg(*this) || check_empty_arg(y)) + return true; +// CHECKME. +// if (!contains_restriction(info(), f_info(y))) +// return false; + return gt(LOWER, lower(), info(), UPPER, f_upper(y), f_info(y)) + || lt(UPPER, upper(), info(), LOWER, f_lower(y), f_info(y)); +} + +template +template +inline I_Result +Interval::assign(const From1& l, const From2& u) { + info().clear(); + Result rl = Boundary_NS::assign(LOWER, lower(), info(), LOWER, l, f_info(l)); + Result ru = Boundary_NS::assign(UPPER, upper(), info(), UPPER, u, f_info(u)); + complete_init_internal(); + assert(OK()); + // The following Parma_Polyhedra_Library:: qualification is to work + // around a bug in version 10.0 of the Intel C/C++ compiler. + return Parma_Polyhedra_Library::check_empty_result(*this, combine(rl, ru)); +} + +template +template +inline typename Enable_If::value + || Is_Interval::value, I_Result>::type +Interval::assign(const From& x) { + assert(f_OK(x)); + if (check_empty_arg(x)) + return assign(EMPTY); + PPL_DIRTY_TEMP(To_Info, to_info); + to_info.clear(); + if (!assign_restriction(to_info, x)) + return assign(EMPTY); + Result rl = Boundary_NS::assign(LOWER, lower(), to_info, + LOWER, f_lower(x), f_info(x)); + Result ru = Boundary_NS::assign(UPPER, upper(), to_info, + UPPER, f_upper(x), f_info(x)); + assign_or_swap(info(), to_info); + complete_init_internal(); + assert(OK()); + return combine(rl, ru); +} + +template +template +inline typename Enable_If::value + || Is_Interval::value, I_Result>::type +Interval::join_assign(const From& x) { + assert(f_OK(x)); + if (check_empty_arg(*this)) + return assign(x); + if (check_empty_arg(x)) + return combine(V_EQ, V_EQ); + if (!join_restriction(info(), *this, x)) + return assign(EMPTY); + info().set_interval_property(CARDINALITY_IS, false); + info().set_interval_property(CARDINALITY_0); + info().set_interval_property(CARDINALITY_1, false); + Result rl, 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)); + assert(OK()); + return combine(rl, ru); +} + +template +template +inline typename Enable_If<((Is_Singleton::value + || Is_Interval::value) + && (Is_Singleton::value + || Is_Interval::value)), I_Result>::type +Interval::join_assign(const From1& x, const From2& y) { + assert(f_OK(x)); + 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(); + if (!join_restriction(to_info, x, y)) + return assign(EMPTY); + to_info.set_interval_property(CARDINALITY_0); + Result rl, 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); + complete_init_internal(); + assert(OK()); + return combine(rl, ru); +} + +template +template +inline typename Enable_If::value + || Is_Interval::value, bool>::type +Interval::can_be_exactly_joined_to(const Type& x) const { + // FIXME: the two restrictions should be evaluated in the context of + // the specific interval + if (!eq_restriction(info(), f_info(x))) + return false; + PPL_DIRTY_TEMP(Boundary, b); + if (gt(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x))) { + b = lower(); + return info().restrict(round_dir_check(LOWER, true), b, V_LT) == V_EQ && + 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 info().restrict(round_dir_check(UPPER, true), b, V_GT) == V_EQ && + eq(UPPER, b, info(), LOWER, f_lower(x), f_info(x)); + } + return true; +} + + +template +template +inline typename Enable_If::value + || Is_Interval::value, I_Result>::type +Interval::intersect_assign(const From& x) { + assert(f_OK(x)); + if (!intersect_restriction(info(), *this, x)) + return assign(EMPTY); + // FIXME: more accurate? + invalidate_cardinality_cache(); + Result rl, ru; + rl = max_assign(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)); + ru = min_assign(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)); + assert(OK()); + // The following Parma_Polyhedra_Library:: qualification is to work + // around a bug in version 10.0 of the Intel C/C++ compiler. + return Parma_Polyhedra_Library::check_empty_result(*this, combine(rl, ru)); +} + +template +template +inline typename Enable_If<((Is_Singleton::value + || Is_Interval::value) + && (Is_Singleton::value + || Is_Interval::value)), I_Result>::type +Interval::intersect_assign(const From1& x, + const From2& y) { + assert(f_OK(x)); + assert(f_OK(y)); + PPL_DIRTY_TEMP(To_Info, to_info); + to_info.clear(); + if (!intersect_restriction(to_info, x, y)) + return assign(EMPTY); + Result rl, ru; + rl = max_assign(LOWER, lower(), to_info, + LOWER, f_lower(x), f_info(x), + LOWER, f_lower(y), f_info(y)); + ru = 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); + complete_init_internal(); + assert(OK()); + // The following Parma_Polyhedra_Library:: qualification is to work + // around a bug in version 10.0 of the Intel C/C++ compiler. + return Parma_Polyhedra_Library::check_empty_result(*this, combine(rl, ru)); +} + +template +template +inline typename Enable_If::value + || Is_Interval::value, I_Result>::type +Interval::difference_assign(const From& x) { + assert(f_OK(x)); + // FIXME: restrictions + 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, ru = V_EQ; + if (nl) { + if (nu) + return assign(EMPTY); + else { + invalidate_cardinality_cache(); + info().clear_boundary_properties(LOWER); + rl = complement(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x)); + } + } + else if (nu) { + invalidate_cardinality_cache(); + info().clear_boundary_properties(UPPER); + ru = complement(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x)); + } + assert(OK()); + return combine(rl, ru); +} + +template +template +inline typename Enable_If<((Is_Singleton::value + || Is_Interval::value) + && (Is_Singleton::value + || Is_Interval::value)), I_Result>::type +Interval::difference_assign(const From1& x, + const From2& y) { + assert(f_OK(x)); + assert(f_OK(y)); + PPL_DIRTY_TEMP(To_Info, to_info); + to_info.clear(); + // FIXME: restrictions + 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, 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); + complete_init_internal(); + assert(OK()); + return combine(rl, ru); +} + +template +template +inline typename Enable_If::value + || Is_Interval::value, I_Result>::type +Interval +::refine_existential(Relation_Symbol rel, const From& x) { + assert(OK()); + 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); + Result ru = Boundary_NS::assign(UPPER, upper(), info(), + UPPER, f_upper(x), f_info(x), true); + invalidate_cardinality_cache(); + normalize(); + // The following Parma_Polyhedra_Library:: qualification is to work + // around a bug in version 10.0 of the Intel C/C++ compiler. + return Parma_Polyhedra_Library::check_empty_result(*this, + combine(V_EQ, ru)); + } + 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); + Result ru = Boundary_NS::assign(UPPER, upper(), info(), + UPPER, f_upper(x), f_info(x)); + invalidate_cardinality_cache(); + normalize(); + // The following Parma_Polyhedra_Library:: qualification is to work + // around a bug in version 10.0 of the Intel C/C++ compiler. + return Parma_Polyhedra_Library::check_empty_result(*this, + combine(V_EQ, ru)); + } + 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); + Result rl = Boundary_NS::assign(LOWER, lower(), info(), + LOWER, f_lower(x), f_info(x), true); + invalidate_cardinality_cache(); + normalize(); + // The following Parma_Polyhedra_Library:: qualification is to work + // around a bug in version 10.0 of the Intel C/C++ compiler. + return Parma_Polyhedra_Library::check_empty_result(*this, + combine(rl, V_EQ)); + } + 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); + Result rl = Boundary_NS::assign(LOWER, lower(), info(), + LOWER, f_lower(x), f_info(x)); + invalidate_cardinality_cache(); + normalize(); + // The following Parma_Polyhedra_Library:: qualification is to work + // around a bug in version 10.0 of the Intel C/C++ compiler. + return Parma_Polyhedra_Library::check_empty_result(*this, + combine(rl, V_EQ)); + } + 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))) + lower_shrink(); + if (eq(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x))) + upper_shrink(); + invalidate_cardinality_cache(); + normalize(); + // The following Parma_Polyhedra_Library:: qualification is to work + // around a bug in version 10.0 of the Intel C/C++ compiler. + return Parma_Polyhedra_Library::check_empty_result(*this, + combine(V_EQ, V_EQ)); + } + default: + assert(false); + return I_EMPTY; + } +} + +template +template +inline typename Enable_If::value + || Is_Interval::value, I_Result>::type +Interval::refine_universal(Relation_Symbol rel, + const From& x) { + assert(OK()); + 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))); + invalidate_cardinality_cache(); + normalize(); + // The following Parma_Polyhedra_Library:: qualification is to work + // around a bug in version 10.0 of the Intel C/C++ compiler. + return Parma_Polyhedra_Library::check_empty_result(*this, + combine(V_EQ, ru)); + } + 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); + invalidate_cardinality_cache(); + normalize(); + // The following Parma_Polyhedra_Library:: qualification is to work + // around a bug in version 10.0 of the Intel C/C++ compiler. + return Parma_Polyhedra_Library::check_empty_result(*this, + combine(V_EQ, ru)); + } + 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))); + invalidate_cardinality_cache(); + normalize(); + // The following Parma_Polyhedra_Library:: qualification is to work + // around a bug in version 10.0 of the Intel C/C++ compiler. + return Parma_Polyhedra_Library::check_empty_result(*this, + combine(rl, V_EQ)); + } + 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); + invalidate_cardinality_cache(); + normalize(); + // The following Parma_Polyhedra_Library:: qualification is to work + // around a bug in version 10.0 of the Intel C/C++ compiler. + return Parma_Polyhedra_Library::check_empty_result(*this, + combine(rl, V_EQ)); + } + 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))) + lower_shrink(); + if (eq(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x))) + upper_shrink(); + invalidate_cardinality_cache(); + normalize(); + // The following Parma_Polyhedra_Library:: qualification is to work + // around a bug in version 10.0 of the Intel C/C++ compiler. + return Parma_Polyhedra_Library::check_empty_result(*this, + combine(V_EQ, V_EQ)); + } + default: + assert(false); + return I_EMPTY; + } +} + +template +template +inline typename Enable_If::value + || Is_Interval::value, I_Result>::type +Interval::neg_assign(const From& x) { + assert(f_OK(x)); + if (check_empty_arg(x)) + return assign(EMPTY); + PPL_DIRTY_TEMP(To_Info, to_info); + to_info.clear(); + if (!neg_restriction(to_info, x)) + return assign(EMPTY); + Result rl, 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); + complete_init_internal(); + assert(OK()); + return combine(rl, ru); +} + +template +template +inline typename Enable_If<((Is_Singleton::value + || Is_Interval::value) + && (Is_Singleton::value + || Is_Interval::value)), I_Result>::type +Interval::add_assign(const From1& x, const From2& y) { + assert(f_OK(x)); + assert(f_OK(y)); + if (check_empty_arg(x) || check_empty_arg(y)) + return assign(EMPTY); + int inf = Parma_Polyhedra_Library::is_infinity(x); + if (inf) { + if (Parma_Polyhedra_Library::is_infinity(y) == -inf) + return assign(EMPTY); + } + else + inf = Parma_Polyhedra_Library::is_infinity(y); + if (inf < 0) + return assign(MINUS_INFINITY); + else if (inf > 0) + return assign(PLUS_INFINITY); + PPL_DIRTY_TEMP(To_Info, to_info); + to_info.clear(); + if (!add_restriction(to_info, x, y)) + return assign(EMPTY); + 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); + complete_init_internal(); + assert(OK()); + return combine(rl, ru); +} + +template +template +inline typename Enable_If<((Is_Singleton::value + || Is_Interval::value) + && (Is_Singleton::value + || Is_Interval::value)), I_Result>::type +Interval::sub_assign(const From1& x, const From2& y) { + assert(f_OK(x)); + assert(f_OK(y)); + if (check_empty_arg(x) || check_empty_arg(y)) + return assign(EMPTY); + int inf = Parma_Polyhedra_Library::is_infinity(x); + if (inf) { + if (Parma_Polyhedra_Library::is_infinity(y) == inf) + return assign(EMPTY); + } + else + inf = -Parma_Polyhedra_Library::is_infinity(y); + if (inf < 0) + return assign(MINUS_INFINITY); + else if (inf > 0) + return assign(PLUS_INFINITY); + + PPL_DIRTY_TEMP(To_Info, to_info); + to_info.clear(); + if (!sub_restriction(to_info, x, y)) + return assign(EMPTY); + Result rl, 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); + complete_init_internal(); + 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 +template +inline typename Enable_If<((Is_Singleton::value + || Is_Interval::value) + && (Is_Singleton::value + || Is_Interval::value)), I_Result>::type +Interval::mul_assign(const From1& x, const From2& y) { + assert(f_OK(x)); + 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 = Parma_Polyhedra_Library::is_infinity(x); + int ls, us; + if (inf) { + ls = yls; + us = yus; + goto inf; + } + else { + inf = Parma_Polyhedra_Library::is_infinity(y); + if (inf) { + 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 = -inf; + if (inf < 0) + return assign(MINUS_INFINITY); + else + return assign(PLUS_INFINITY); + } + } + + PPL_DIRTY_TEMP(To_Info, to_info); + to_info.clear(); + if (!mul_restriction(to_info, x, y)) + return assign(EMPTY); + Result rl, 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); + complete_init_internal(); + 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 +template +inline typename Enable_If<((Is_Singleton::value + || Is_Interval::value) + && (Is_Singleton::value + || Is_Interval::value)), I_Result>::type +Interval::div_assign(const From1& x, const From2& y) { + assert(f_OK(x)); + 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 = Parma_Polyhedra_Library::is_infinity(x); + if (inf) { + if (Parma_Polyhedra_Library::is_infinity(y)) + return assign(EMPTY); + if (yls == -yus) + return set_infinities(); + if (yls < 0 || yus < 0) + inf = -inf; + if (inf < 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(); + if (!div_restriction(to_info, x, y)) + return assign(EMPTY); + Result rl, 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 { + // FIXME: restrictions + return static_cast(assign(UNIVERSE) | I_SINGULARITIES); + } + assign_or_swap(lower(), to_lower); + assign_or_swap(info(), to_info); + complete_init_internal(); + assert(OK()); + return combine(rl, ru); +} + +template +inline typename Enable_If::value, Interval >::type +operator+(const Interval& x, const T& y) { + Interval z; + z.add_assign(x, y); + return z; +} + +template +inline typename Enable_If::value, Interval >::type +operator+(const T& x, const Interval& y) { + Interval z; + z.add_assign(x, y); + return z; +} + +template +inline Interval +operator+(const Interval& x, const Interval& y) { + Interval z; + z.add_assign(x, y); + return z; +} + +template +inline typename Enable_If::value, Interval >::type +operator-(const Interval& x, const T& y) { + Interval z; + z.sub_assign(x, y); + return z; +} + +template +inline typename Enable_If::value, Interval >::type +operator-(const T& x, const Interval& y) { + Interval z; + z.sub_assign(x, y); + return z; +} + +template +inline Interval +operator-(const Interval& x, const Interval& y) { + Interval z; + z.sub_assign(x, y); + return z; +} + +template +inline typename Enable_If::value, Interval >::type +operator*(const Interval& x, const T& y) { + Interval z; + z.mul_assign(x, y); + return z; +} + +template +inline typename Enable_If::value, Interval >::type +operator*(const T& x, const Interval& y) { + Interval z; + z.mul_assign(x, y); + return z; +} + +template +inline Interval +operator*(const Interval& x, const Interval& y) { + Interval z; + z.mul_assign(x, y); + return z; +} + +template +inline typename Enable_If::value, Interval >::type +operator/(const Interval& x, const T& y) { + Interval z; + z.div_assign(x, y); + return z; +} + +template +inline typename Enable_If::value, Interval >::type +operator/(const T& x, const Interval& y) { + Interval z; + z.div_assign(x, y); + return z; +} + +template +inline Interval +operator/(const Interval& x, const Interval& y) { + Interval z; + z.div_assign(x, y); + return z; +} + +template +inline std::ostream& +operator<<(std::ostream& os, const Interval& x) { + // assert(x.OK()); + 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() ? ")" : "]"); + output_restriction(os, x.info()); + return os; +} + +template +inline void +Interval::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 +inline bool +Interval::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; +#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG + complete_init_internal(); +#endif + 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 struct Select_Temp_Boundary_Type; + +template +struct Select_Temp_Boundary_Type { + typedef Interval_Boundary_Type type; +}; + +template <> +struct Select_Temp_Boundary_Type { + typedef double type; +}; + +template <> +struct Select_Temp_Boundary_Type { + typedef signed long long type; +}; + +template <> +struct Select_Temp_Boundary_Type { + typedef signed long long type; +}; + +template <> +struct Select_Temp_Boundary_Type { + typedef signed long long type; +}; + +template <> +struct Select_Temp_Boundary_Type { + typedef signed long long type; +}; + +template <> +struct Select_Temp_Boundary_Type { + typedef signed long long type; +}; + +template <> +struct Select_Temp_Boundary_Type { + typedef signed long long type; +}; + +template <> +struct Select_Temp_Boundary_Type { + typedef signed long long type; +}; + +template <> +struct Select_Temp_Boundary_Type { + typedef signed long long type; +}; + +template <> +struct Select_Temp_Boundary_Type { + typedef signed long long type; +}; + +} // namespace Parma_Polyhedra_Library + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Interval */ +template +inline void +swap(Parma_Polyhedra_Library::Interval& x, + Parma_Polyhedra_Library::Interval& y) { + x.swap(y); +} + +} // namespace std + +#endif // !defined(PPL_Interval_inlines_hh) diff --git a/src/Interval.templates.hh b/src/Interval.templates.hh new file mode 100644 index 0000000..efb74fd --- /dev/null +++ b/src/Interval.templates.hh @@ -0,0 +1,241 @@ +/* Interval class implementation: non-inline template functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Interval_templates_hh +#define PPL_Interval_templates_hh 1 + +#include + +namespace Parma_Polyhedra_Library { + +template +template +typename Enable_If::value, void>::type +Interval::CC76_widening_assign(const From& y, + Iterator first, + Iterator last) { + // We assume that `y' is contained in or equal to `*this'. + assert(contains(y)); + Interval& x = *this; + + // Upper bound. + if (!x.upper_is_unbounded()) { + Boundary& x_ub = x.upper(); + const Boundary& y_ub = y.upper(); + assert(!y.upper_is_unbounded() && 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_set(UNBOUNDED); + } + } + + // Lower bound. + if (!x.lower_is_unbounded()) { + Boundary& x_lb = x.lower(); + const Boundary& y_lb = y.lower(); + assert(!y.lower_is_unbounded() && 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_set(UNBOUNDED); + } + } + else + x_lb = *--k; + } + } +} + +template +inline std::istream& +operator>>(std::istream& is, Interval& x) { + // Eat leading white space. + int c; + do { + c = is.get(); + } while (isspace(c)); + + // Get the opening parenthesis and handle the empty interval case. + bool lower_open = false; + if (c == '(') + lower_open = true; + else if (c == '[') { + c = is.get(); + if (c == ']') { + // Empty interval. + x.assign(EMPTY); + return is; + } + else + is.unget(); + } + else { + is.unget(); + is.setstate(std::ios_base::failbit); + return is; + } + + // Get the lower bound. + Boundary lower_bound; + Result lower_r = input(lower_bound, is, ROUND_DOWN); + if (lower_r == V_CVT_STR_UNK || lower_r == VC_NAN) { + is.setstate(std::ios_base::failbit); + return is; + } + + // Match the comma separating the lower and upper bounds. + do { + c = is.get(); + } while (isspace(c)); + if (c != ',') { + is.unget(); + is.setstate(std::ios_base::failbit); + return is; + } + + // Get the upper bound. + Boundary upper_bound; + Result upper_r = input(upper_bound, is, ROUND_UP); + if (upper_r == V_CVT_STR_UNK || upper_r == VC_NAN) { + is.setstate(std::ios_base::failbit); + return is; + } + + // Get the closing parenthesis. + do { + c = is.get(); + } while (isspace(c)); + bool upper_open = false; + if (c == ')') + upper_open = true; + else if (c != ']') { + is.unget(); + is.setstate(std::ios_base::failbit); + return is; + } + + // Buld interval. + bool lower_unbounded = false; + bool upper_unbounded = false; + switch (lower_r) { + case V_EQ: + break; + case V_LE: + lower_open = true; + break; + case VC_MINUS_INFINITY: + case V_NEG_OVERFLOW: + lower_unbounded = true; + break; + case VC_PLUS_INFINITY: + case V_POS_OVERFLOW: + if (upper_r == VC_PLUS_INFINITY || upper_r == V_POS_OVERFLOW) + x.assign(UNIVERSE); + else + x.assign(EMPTY); + return is; + default: + assert(false); + } + switch (upper_r) { + case V_EQ: + break; + case V_GE: + upper_open = true; + break; + case VC_MINUS_INFINITY: + case V_NEG_OVERFLOW: + if (lower_r == VC_MINUS_INFINITY || lower_r == V_NEG_OVERFLOW) + x.assign(UNIVERSE); + else + x.assign(EMPTY); + return is; + case VC_PLUS_INFINITY: + case V_POS_OVERFLOW: + upper_unbounded = true; + break; + default: + assert(false); + } + + if (!lower_unbounded + && !upper_unbounded + && (lower_bound > upper_bound + || (lower_open && lower_bound == upper_bound))) + x.assign(EMPTY); + else { + x.assign(UNIVERSE); + if (!lower_unbounded) + x.refine_existential((lower_open ? GREATER_THAN : GREATER_OR_EQUAL), + lower_bound); + if (!upper_unbounded) + x.refine_existential((upper_open ? LESS_THAN : LESS_OR_EQUAL), + upper_bound); + } + return is; +} + +template +template +typename Enable_If::value, bool>::type +Interval::simplify_using_context_assign(const From& y) { + // FIXME: the following code wrongly assumes that intervals are closed + // and have no restrictions. It must be generalized. + if (lt(UPPER, upper(), info(), LOWER, f_lower(y), f_info(y))) { + lower_set(UNBOUNDED); + return false; + } + if (gt(LOWER, lower(), info(), UPPER, f_upper(y), f_info(y))) { + upper_set(UNBOUNDED); + return false; + } + // Weakening the upper bound. + if (!upper_is_unbounded() && !y.upper_is_unbounded() + && y.upper() <= upper()) + upper_set(UNBOUNDED); + // Weakening the lower bound. + if (!lower_is_unbounded() && !y.lower_is_unbounded() + && y.lower() >= lower()) + lower_set(UNBOUNDED); + return true; +} + +template +template +typename Enable_If::value, void>::type +Interval::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..3f9914e --- /dev/null +++ b/src/Interval.types.hh @@ -0,0 +1,22 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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 +class Interval; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Interval_types_hh) diff --git a/src/Interval_Info.defs.hh b/src/Interval_Info.defs.hh new file mode 100644 index 0000000..fef331d --- /dev/null +++ b/src/Interval_Info.defs.hh @@ -0,0 +1,300 @@ +/* Interval_Info class declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Interval_Info_defs_hh +#define PPL_Interval_Info_defs_hh 1 + +#include "Boundary.defs.hh" +#include "Interval_Restriction.defs.hh" + +#include + +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 +inline void +reset_bits(T& bits) { + bits = 0; +} + +template +inline void +reset_bit(T& bits, unsigned int bit) { + bits &= ~(static_cast(1) << bit); +} + +template +inline void +set_bit(T& bits, unsigned int bit, bool value) { + if (value) + bits |= static_cast(1) << bit; + else + reset_bit(bits, bit); +} + +template +inline bool +get_bit(const T& bits, unsigned int bit) { + return bits & (static_cast(1) << bit); +} + +template +inline void +set_bits(T& bits, unsigned int start, unsigned int len, T value) { + bits &= ~(((static_cast(1) << len) - 1) << start); + bits |= value << start; +} + +template +inline T +get_bits(T& bits, unsigned int start, unsigned int len) { + return (bits >> start) & ((static_cast(1) << len) - 1); +} + +} // namespace Interval_NS + +using namespace Interval_NS; +using namespace Boundary_NS; + + +template +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_empty_result, Policy::check_empty_result); + const_bool_nodef(check_inexact, Policy::check_inexact); + const_bool_nodef(store_special, false); + const_bool_nodef(store_open, false); + const_bool_nodef(cache_normalized, false); + const_bool_nodef(cache_empty, false); + const_bool_nodef(cache_singleton, false); + void clear() { + } + void clear_boundary_properties(Boundary_Type) { + } + + template + void set_boundary_property(Boundary_Type, const Property&, typename Property::Value = Property::default_value) { + } + template + typename Property::Value get_boundary_property(Boundary_Type, const Property&) const { + return Property::unsupported_value; + } + template + void set_interval_property(const Property&, typename Property::Value = Property::default_value) { + } + template + typename Property::Value get_interval_property(const Property&) const { + return Property::unsupported_value; + } + + //! Swaps \p *this with \p y. + void swap(Interval_Info_Null& y); + + void ascii_dump(std::ostream& s) const; + bool ascii_load(std::istream& s); +}; + +template +class Interval_Info_Null_Open : public Interval_Info_Null { +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 { + switch (p.type) { + case Boundary_NS::Property::OPEN_: + return open; + default: + return Boundary_NS::Property::unsupported_value; + } + } + + void ascii_dump(std::ostream& s) const; + bool ascii_load(std::istream& s); + +private: + bool open; +}; + + +template +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_empty_result, Policy::check_empty_result); + 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_normalized, Policy::cache_normalized); + 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); + const_int_nodef(lower_normalized_bit, lower_open_bit + store_open); + const_int_nodef(upper_special_bit, lower_normalized_bit + cache_normalized); + const_int_nodef(upper_open_bit, upper_special_bit + store_special); + const_int_nodef(upper_normalized_bit, upper_open_bit + store_open); + const_int_nodef(cardinality_is_bit, upper_normalized_bit + cache_normalized); + const_int_nodef(cardinality_0_bit, cardinality_is_bit + (cache_empty || cache_singleton)); + const_int_nodef(cardinality_1_bit, cardinality_0_bit + cache_empty); + const_int_nodef(next_bit, cardinality_1_bit + cache_singleton); + 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; + case Boundary_NS::Property::NORMALIZED_: + if (cache_normalized) { + if (t == LOWER) + set_bit(bitset, lower_normalized_bit, value); + else + set_bit(bitset, upper_normalized_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); + case Boundary_NS::Property::NORMALIZED_: + if (!cache_normalized) + return false; + else if (t == LOWER) + return get_bit(bitset, lower_normalized_bit); + else + return get_bit(bitset, upper_normalized_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 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..1f665a8 --- /dev/null +++ b/src/Interval_Info.inlines.hh @@ -0,0 +1,121 @@ +/* Interval_Info class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Interval_Info_inlines_hh +#define PPL_Interval_Info_inlines_hh 1 + +#include + +namespace Parma_Polyhedra_Library { + +template +inline void +Interval_Info_Null::swap(Interval_Info_Null&) { +} + +template +inline void +Interval_Info_Null::ascii_dump(std::ostream& s) const { +} + +template +inline bool +Interval_Info_Null::ascii_load(std::istream& s) { + return true; +} + +template +inline void +Interval_Info_Null_Open::ascii_dump(std::ostream& s) const { + s << (open ? "open" : "closed"); +} + +template +inline bool +Interval_Info_Null_Open::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 +inline void +Interval_Info_Bitset::swap(Interval_Info_Bitset& y) { + std::swap(bitset, y.bitset); +} + +template +inline void +Interval_Info_Bitset::ascii_dump(std::ostream& s) const { + std::ios_base::fmtflags old = s.flags(); + s << std::hex << bitset; + s.flags(old); +} + +template +inline bool +Interval_Info_Bitset::ascii_load(std::istream& s) { + std::ios_base::fmtflags old = s.flags(); + if (s >> std::hex >> bitset) { + s.flags(old); + return s; + } + else + return false; +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates Parma_Polyhedra_Library::Interval_Info_Null */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +inline void +swap(Parma_Polyhedra_Library::Interval_Info_Null& x, + Parma_Polyhedra_Library::Interval_Info_Null& y) { + x.swap(y); +} + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates Parma_Polyhedra_Library::Interval_Info_Bitset */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +inline void +swap(Parma_Polyhedra_Library::Interval_Info_Bitset& x, + Parma_Polyhedra_Library::Interval_Info_Bitset& y) { + x.swap(y); +} + +} // namespace std + +#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..d2526de --- /dev/null +++ b/src/Interval_Info.types.hh @@ -0,0 +1,25 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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 +class Interval_Info_Null; + +template +class Interval_Info_Bitset; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Interval_Info_types_hh) diff --git a/src/Interval_Restriction.defs.hh b/src/Interval_Restriction.defs.hh new file mode 100644 index 0000000..393010d --- /dev/null +++ b/src/Interval_Restriction.defs.hh @@ -0,0 +1,873 @@ +/* Interval_Restriction class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Interval_Restriction_defs_hh +#define PPL_Interval_Restriction_defs_hh 1 + +#include "meta_programming.hh" +#include "Slow_Copy.hh" +#include "assign_or_swap.hh" +#include "Result.defs.hh" +#include "Rounding_Dir.defs.hh" +#include "Checked_Number.defs.hh" + +namespace Parma_Polyhedra_Library { + +struct Interval_Base; + +template +struct Boundary_Value { + typedef T type; +}; + +template +struct Boundary_Value::value>::type > { + typedef typename T::boundary_type type; +}; + +class Interval_Restriction_None_Base { +public: + bool has_restriction() const { + return false; + } + void normalize() const { + } + template + Result restrict(Rounding_Dir, T&, Result dir) const { + return dir; + } +}; + +inline bool +eq_restriction(const Interval_Restriction_None_Base&, const Interval_Restriction_None_Base) { + return true; +} + +template +inline bool +contains_restriction(const Interval_Restriction_None_Base&, const T&) { + return true; +} + +template +inline bool +assign_restriction(Interval_Restriction_None_Base&, const T&) { + return true; +} + +template +inline bool +join_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) { + return true; +} + +template +inline bool +intersect_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) { + return true; +} + +template +inline bool +diff_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) { + return true; +} + +template +inline bool +neg_restriction(Interval_Restriction_None_Base&, const T&) { + return true; +} + +template +inline bool +add_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) { + return true; +} + +template +inline bool +sub_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) { + return true; +} + +template +inline bool +mul_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) { + return true; +} + +template +inline bool +div_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) { + return true; +} + +inline void +output_restriction(std::ostream&, const Interval_Restriction_None_Base&) { +} + +template +class Interval_Restriction_None : public Interval_Restriction_None_Base, + public Base { +public: + Interval_Restriction_None() { + }; + template + Interval_Restriction_None(const T& init) + : Base(init) { + } +}; + +class Interval_Restriction_Integer_Base { +}; + +template +class Interval_Restriction_Integer : public Interval_Restriction_Integer_Base, public Base { +public: + Interval_Restriction_Integer() { + } + void set_integer(bool v = true) { + return set_bit(Base::bitset, integer_bit, v); + } + bool get_integer() const { + return get_bit(Base::bitset, integer_bit); + } + + const_int_nodef(integer_bit, Base::next_bit); + const_int_nodef(next_bit, integer_bit + 1); + bool has_restriction() const { + return get_integer(); + } + void normalize() const { + } + template + Result restrict(Rounding_Dir rdir, T& x, Result dir) const { + if (!has_restriction()) + return dir; + switch (dir) { + case V_GT: + if (is_integer(x)) + return add_assign_r(x, x, static_cast(1), rdir); + /* Fall through */ + case V_GE: + return ceil_assign_r(x, x, rdir); + case V_LT: + if (is_integer(x)) + return sub_assign_r(x, x, static_cast(1), rdir); + /* Fall through */ + case V_LE: + return floor_assign_r(x, x, rdir); + default: + assert(false); + return dir; + } + } +}; + +class Simple_Restriction_Integer : public Interval_Restriction_Integer_Base { +public: + Simple_Restriction_Integer(bool i) + : integer(i) { + } + bool get_integer() const { + return integer; + } +private: + bool integer; +}; + +template +struct Restriction_Integer; + +template +struct Restriction_Integer::value>::type> { + typedef Simple_Restriction_Integer type; + static type get(const From& x) { + return Simple_Restriction_Integer(is_integer(x)); + } +}; + +template +struct Restriction_Integer::value>::type> { + typedef Simple_Restriction_Integer type; + static type get(const From& x) { + return Simple_Restriction_Integer(x.is_singleton() && is_integer(x.lower())); + } +}; + +template +struct Restriction_Integer::value>::type> { + typedef Interval_Restriction_Integer type; + static const type& get(const From& x) { + return x.info(); + } +}; + +template +inline typename Enable_If::value && Is_Same_Or_Derived::value, bool>::type +eq_restriction(const T1& x, const T2& y) { + return x.get_integer() == y.get_integer(); +} + +template +inline typename Enable_If::value && Is_Same_Or_Derived::value, bool>::type +contains_restriction(const T1& x, const T2& y) { + return !x.get_integer() || y.get_integer(); +} + +template +inline bool +assign_restriction(Interval_Restriction_Integer& to, const From& x) { + to.set_integer(Restriction_Integer::get(x).get_integer()); + return true; +} + +template +inline bool +join_restriction(Interval_Restriction_Integer& to, const From1& x, const From2& y) { + to.set_integer(Restriction_Integer::get(x).get_integer() + && Restriction_Integer::get(y).get_integer()); + return true; +} + +template +inline bool +intersect_restriction(Interval_Restriction_Integer& to, const From1& x, const From2& y) { + to.set_integer(Restriction_Integer::get(x).get_integer() + || Restriction_Integer::get(y).get_integer()); + return true; +} + +template +inline bool +diff_restriction(Interval_Restriction_Integer& to, + const From1& x, const From2&) { + to.set_integer(Restriction_Integer::get(x).get_integer()); + return true; +} + +template +inline bool +neg_restriction(Interval_Restriction_Integer& to, const From& x) { + to.set_integer(Restriction_Integer::get(x).get_integer()); + return true; +} + +template +inline bool +add_restriction(Interval_Restriction_Integer& to, const From1& x, const From2& y) { + to.set_integer(Restriction_Integer::get(x).get_integer() + && Restriction_Integer::get(y).get_integer()); + return true; +} + +template +inline bool +sub_restriction(Interval_Restriction_Integer& to, const From1& x, const From2& y) { + to.set_integer(Restriction_Integer::get(x).get_integer() + && Restriction_Integer::get(y).get_integer()); + return true; +} + +template +inline bool +mul_restriction(Interval_Restriction_Integer& to, const From1& x, const From2& y) { + to.set_integer(Restriction_Integer::get(x).get_integer() + && Restriction_Integer::get(y).get_integer()); + return true; +} + +template +inline bool +div_restriction(Interval_Restriction_Integer& to, const From1&, const From2&) { + to.set_integer(false); + return true; +} + +template +inline void +output_restriction(std::ostream& s, const Interval_Restriction_Integer& x) { + if (x.get_integer()) + s << "i"; +} + +class Interval_Restriction_Integer_Modulo_Base { +}; + +template +class Interval_Restriction_Integer_Modulo : public Interval_Restriction_Integer_Modulo_Base, public Base { +public: + PPL_COMPILE_TIME_CHECK(std::numeric_limits::is_exact, + "type for modulo values must be exact"); + Interval_Restriction_Integer_Modulo() { + // FIXME: would we have speed benefits with uninitialized info? + // (Dirty_Temp) + clear(); + } + bool has_restriction() const { + return divisor != 0; + } + void clear() { + remainder = 0; + divisor = 0; + Base::clear(); + } + void normalize() const { + } + template + Result restrict(Rounding_Dir rdir, V& x, Result dir) const { + if (!has_restriction()) + return dir; + PPL_DIRTY_TEMP(V, n); + PPL_DIRTY_TEMP(V, div); + Result r; + r = assign_r(div, divisor, ROUND_CHECK); + assert(r == V_EQ); + int s; + r = rem_assign_r(n, x, div, ROUND_NOT_NEEDED); + assert(r == V_EQ); + s = sgn(n); + switch (dir) { + case V_GT: + if (s >= 0) { + r = sub_assign_r(n, div, n, ROUND_NOT_NEEDED); + assert(r == V_EQ); + return add_assign_r(x, x, n, rdir); + } + else + return sub_assign_r(x, x, n, rdir); + case V_GE: + if (s > 0) { + r = sub_assign_r(n, div, n, ROUND_NOT_NEEDED); + assert(r == V_EQ); + return add_assign_r(x, x, n, rdir); + } + else if (s < 0) + return sub_assign_r(x, x, n, rdir); + else + return V_EQ; + case V_LT: + if (s <= 0) { + r = add_assign_r(n, div, n, ROUND_NOT_NEEDED); + assert(r == V_EQ); + return sub_assign_r(x, x, n, rdir); + } + else + return sub_assign_r(x, x, n, rdir); + case V_LE: + if (s < 0) { + r = add_assign_r(n, div, n, ROUND_NOT_NEEDED); + assert(r == V_EQ); + return sub_assign_r(x, x, n, rdir); + } + else if (s > 0) + return sub_assign_r(x, x, n, rdir); + else + return V_EQ; + default: + assert(false); + return dir; + } + } + void assign_or_swap(Interval_Restriction_Integer_Modulo& x) { + Parma_Polyhedra_Library::assign_or_swap(remainder, x.remainder); + Parma_Polyhedra_Library::assign_or_swap(divisor, x.divisor); + } + typedef T modulo_type; + T remainder; + T divisor; +}; + +template +struct Slow_Copy > : public Bool::value> {}; + + +template +struct Restriction_Integer::value>::type> { + typedef Simple_Restriction_Integer type; + static type get(const From& x) { + return Simple_Restriction_Integer(x.info().divisor != 0); + } +}; + +template +struct Simple_Restriction_Integer_Modulo : public Interval_Restriction_Integer_Modulo_Base { + template + Simple_Restriction_Integer_Modulo(const From& r, const From& d) + : remainder(r), divisor(d) { + } + typedef T modulo_type; + T remainder; + T divisor; +}; + +template +struct Restriction_Integer_Modulo; + +template +struct Restriction_Integer_Modulo::value>::type> { + typedef Simple_Restriction_Integer_Modulo type; + static const type& get(const From& x) { + static const type integer(0, 1); + static const type not_integer(0, 0); + if (is_integer(x)) + return integer; + else + return not_integer; + } +}; + +template +struct Restriction_Integer_Modulo::value>::type> { + typedef Simple_Restriction_Integer_Modulo type; + static const type& get(const From& x) { + static const type integer(0, 1); + static const type not_integer(0, 0); + if (x.is_singleton() && is_integer(x.lower())) + return integer; + else + return not_integer; + } +}; + +template +struct Restriction_Integer_Modulo::value>::type> { + typedef Simple_Restriction_Integer_Modulo type; + static const type& get(const From& x) { + static const type integer(0, 1); + static const type not_integer(0, 0); + if (x.info().get_integer()) + return integer; + else + return not_integer; + } +}; + +template +struct Restriction_Integer_Modulo::value>::type> { + typedef Interval_Restriction_Integer_Modulo type; + static const type& get(const From& x) { + return x.info(); + } +}; + +template +inline typename Enable_If::value && Is_Same_Or_Derived::value, bool>::type +eq_restriction(const T1& x, const T2& y) { + return x.remainder == y.remainder + && x.divisor == y.divisor; +} + +template +inline typename Enable_If::value && Is_Same_Or_Derived::value, bool>::type +contains_restriction(const T1& x, const T2& y) { + if (x.divisor == 0) + return true; + if (y.divisor == 0) + return false; + if (x.divisor == y.divisor) + return x.remainder == y.remainder; + PPL_DIRTY_TEMP(typename T1::modulo_type, v); + Result r; + r = rem_assign_r(v, y.divisor, x.divisor, ROUND_NOT_NEEDED); + assert(r == V_EQ); + if (v != 0) + return false; + r = rem_assign_r(v, y.remainder, x.divisor, ROUND_NOT_NEEDED); + assert(r == V_EQ); + return v == x.remainder; +} + +template +inline bool +set_unrestricted(Interval_Restriction_Integer_Modulo& to) { + to.remainder = 0; + to.divisor = 0; + return true; +} + +template +inline bool +set_integer(Interval_Restriction_Integer_Modulo& to) { + to.remainder = 0; + to.divisor = 1; + return true; +} + +template +inline bool +assign_restriction(Interval_Restriction_Integer_Modulo& to, const From& x) { + to.remainder = Restriction_Integer_Modulo::get(x).remainder; + to.divisor = Restriction_Integer_Modulo::get(x).divisor; + return true; +} + +template +inline bool +join_restriction(Interval_Restriction_Integer_Modulo& to, const From1& x, const From2& y) { + typedef Restriction_Integer_Modulo Rx; + const typename Rx::type& rx = Rx::get(x); + if (rx.divisor == 0) + return set_unrestricted(to); + typedef Restriction_Integer_Modulo Ry; + const typename Ry::type& ry = Ry::get(y); + if (ry.divisor == 0) + return set_unrestricted(to); + else if (rx.divisor == 1 && ry.divisor == 1 + && is_singleton(x) && is_singleton(y)) { + PPL_DIRTY_TEMP(typename Boundary_Value::type, a); + PPL_DIRTY_TEMP(typename Boundary_Value::type, b); + Result r; + r = abs_assign_r(a, f_lower(x), ROUND_CHECK); + if (r != V_EQ) + return set_integer(to); + r = abs_assign_r(b, f_lower(y), ROUND_CHECK); + if (r != V_EQ) + return set_integer(to); + if (a > b) + r = sub_assign_r(a, a, b, ROUND_CHECK); + else + r = sub_assign_r(a, b, a, ROUND_CHECK); + if (r != V_EQ) + return set_integer(to); + r = assign_r(to.divisor, a, ROUND_CHECK); + if (r != V_EQ) + return set_integer(to); + r = rem_assign_r(b, b, a, ROUND_CHECK); + if (r != V_EQ) + return set_integer(to); + r = assign_r(to.remainder, b, ROUND_CHECK); + if (r != V_EQ) + return set_integer(to); + } + else if (contains_restriction(rx, ry)) { + to.remainder = rx.remainder; + to.divisor = rx.divisor; + } + else if (contains_restriction(ry, rx)) { + to.remainder = ry.remainder; + to.divisor = ry.divisor; + } + else + return set_integer(to); + return true; +} + +template +inline bool +intersect_restriction(Interval_Restriction_Integer_Modulo& to, const From1& x, const From2& y) { + typedef Restriction_Integer_Modulo Rx; + const typename Rx::type& rx = Rx::get(x); + typedef Restriction_Integer_Modulo Ry; + const typename Ry::type& ry = Ry::get(y); + if (rx.divisor == 0) { + to.remainder = ry.remainder; + to.divisor = ry.divisor; + return true; + } + if (ry.divisor == 0) { + to.remainder = rx.remainder; + to.divisor = rx.divisor; + return true; + } + PPL_DIRTY_TEMP(T, g); + Result r; + r = gcd_assign_r(g, rx.divisor, ry.divisor, ROUND_DIRECT); + if (r != V_EQ) + return set_integer(to); + PPL_DIRTY_TEMP(T, d); + if (rx.remainder > ry.remainder) + r = sub_assign_r(d, rx.remainder, ry.remainder, ROUND_DIRECT); + else + r = sub_assign_r(d, ry.remainder, rx.remainder, ROUND_DIRECT); + if (r != V_EQ) + return set_integer(to); + r = div_assign_r(d, d, g, ROUND_DIRECT); + if (r != V_EQ) + return false; + r = lcm_assign_r(to.divisor, rx.divisor, ry.divisor, ROUND_DIRECT); + if (r != V_EQ) + return set_integer(to); + // FIXME: to be completed + return true; +} + +template +inline bool +diff_restriction(Interval_Restriction_Integer_Modulo& to, + const From1& x, const From2& y) { + // FIXME: to be written + return true; +} + +template +inline bool +neg_restriction(Interval_Restriction_Integer_Modulo& to, + const From& x) { + return assign_restriction(to, x); +} + +template +inline void +addmod(T& to, const T& x, const T& y, const T& to_m, const T& y_m) { + Result r; + if (std::numeric_limits::is_bounded) { + r = sub_assign_r(to, y_m, y, ROUND_NOT_NEEDED); + assert(r == V_EQ); + if (x <= to) { + r = add_assign_r(to, x, y, ROUND_NOT_NEEDED); + assert(r == V_EQ); + } + else { + r = sub_assign_r(to, x, to, ROUND_NOT_NEEDED); + assert(r == V_EQ); + } + } + else { + r = add_assign_r(to, x, y, ROUND_NOT_NEEDED); + assert(r == V_EQ); + } + r = rem_assign_r(to, to, to_m, ROUND_NOT_NEEDED); + assert(r == V_EQ); +} + +template +inline bool +assign_rem(M& rem, const T& n, const M& div) { + PPL_DIRTY_TEMP(T, divisor); + PPL_DIRTY_TEMP(T, remainder); + Result r; + r = assign_r(divisor, div, ROUND_CHECK); + if (r != V_EQ) + return false; + r = rem_assign_r(remainder, n, divisor, ROUND_CHECK); + if (r != V_EQ) + return false; + if (sgn(remainder) < 0) { + r = add_assign_r(remainder, remainder, divisor, ROUND_CHECK); + if (r != V_EQ) + return false; + } + r = assign_r(rem, remainder, ROUND_CHECK); + return r == V_EQ; +} + + +template +inline bool +add_restriction(Interval_Restriction_Integer_Modulo& to, const From1& x, const From2& y) { + typedef Restriction_Integer_Modulo Rx; + const typename Rx::type& rx = Rx::get(x); + if (rx.divisor == 0) + return set_unrestricted(to); + typedef Restriction_Integer_Modulo Ry; + const typename Ry::type& ry = Ry::get(y); + if (ry.divisor == 0) + return set_unrestricted(to); + Result r; + PPL_DIRTY_TEMP(T, rem); + if (is_singleton(x)) { + if (is_singleton(y)) + return set_integer(to); + if (!assign_rem(rem, f_lower(x), ry.divisor)) + return set_integer(to); + r = assign_r(to.divisor, ry.divisor, ROUND_NOT_NEEDED); + assert(r == V_EQ); + addmod(to.remainder, rem, ry.remainder, to.divisor, ry.divisor); + } + else if (is_singleton(y)) { + if (!assign_rem(rem, f_lower(y), rx.divisor)) + return set_integer(to); + r = assign_r(to.divisor, rx.divisor, ROUND_NOT_NEEDED); + assert(r == V_EQ); + addmod(to.remainder, rx.remainder, rem, to.divisor, to.divisor); + } + else { + r = gcd_assign_r(to.divisor, rx.divisor, ry.divisor, ROUND_NOT_NEEDED); + assert(r == V_EQ); + addmod(to.remainder, rx.remainder, ry.remainder, to.divisor, ry.divisor); + } + return true; +} + +template +inline void +submod(T& to, const T& x, const T& y, const T& to_m, const T& y_m) { + Result r; + if (x >= y) { + r = sub_assign_r(to, x, y, ROUND_NOT_NEEDED); + assert(r == V_EQ); + } + else { + r = sub_assign_r(to, y_m, y, ROUND_NOT_NEEDED); + assert(r == V_EQ); + r = add_assign_r(to, x, to, ROUND_NOT_NEEDED); + assert(r == V_EQ); + } + r = rem_assign_r(to, to, to_m, ROUND_NOT_NEEDED); + assert(r == V_EQ); +} + +template +inline bool +sub_restriction(Interval_Restriction_Integer_Modulo& to, const From1& x, const From2& y) { + typedef Restriction_Integer_Modulo Rx; + const typename Rx::type& rx = Rx::get(x); + if (rx.divisor == 0) + return set_unrestricted(to); + typedef Restriction_Integer_Modulo Ry; + const typename Ry::type& ry = Ry::get(y); + if (ry.divisor == 0) + return set_unrestricted(to); + Result r; + PPL_DIRTY_TEMP(T, rem); + if (is_singleton(x)) { + if (is_singleton(y)) + return set_integer(to); + if (!assign_rem(rem, f_lower(x), ry.divisor)) + return set_integer(to); + r = assign_r(to.divisor, ry.divisor, ROUND_NOT_NEEDED); + assert(r == V_EQ); + submod(to.remainder, rem, ry.remainder, to.divisor, ry.divisor); + } + else if (is_singleton(y)) { + if (!assign_rem(rem, f_lower(y), rx.divisor)) + return set_integer(to); + r = assign_r(to.divisor, rx.divisor, ROUND_NOT_NEEDED); + assert(r == V_EQ); + submod(to.remainder, rx.remainder, rem, to.divisor, to.divisor); + } + else { + r = gcd_assign_r(to.divisor, rx.divisor, ry.divisor, ROUND_NOT_NEEDED); + assert(r == V_EQ); + submod(to.remainder, rx.remainder, ry.remainder, to.divisor, ry.divisor); + } + return true; +} + +template +inline void +mulmod(T& to, const T& x, const T& y, const T& to_m) { + Result r; + if (std::numeric_limits::is_bounded) { + PPL_DIRTY_TEMP0(mpz_class, a); + PPL_DIRTY_TEMP0(mpz_class, b); + r = assign_r(a, x, ROUND_NOT_NEEDED); + assert(r == V_EQ); + r = assign_r(b, y, ROUND_NOT_NEEDED); + assert(r == V_EQ); + r = mul_assign_r(a, a, b, ROUND_NOT_NEEDED); + assert(r == V_EQ); + r = assign_r(b, to_m, ROUND_NOT_NEEDED); + assert(r == V_EQ); + r = rem_assign_r(a, a, b, ROUND_NOT_NEEDED); + assert(r == V_EQ); + r = assign_r(to, a, ROUND_NOT_NEEDED); + assert(r == V_EQ); + } + else { + r = mul_assign_r(to, x, y, ROUND_NOT_NEEDED); + assert(r == V_EQ); + r = rem_assign_r(to, to, to_m, ROUND_NOT_NEEDED); + assert(r == V_EQ); + } +} + + +template +inline bool +mul_restriction(Interval_Restriction_Integer_Modulo& to, const From1& x, const From2& y) { + typedef Restriction_Integer_Modulo Rx; + const typename Rx::type& rx = Rx::get(x); + if (rx.divisor == 0) + return set_unrestricted(to); + typedef Restriction_Integer_Modulo Ry; + const typename Ry::type& ry = Ry::get(y); + if (ry.divisor == 0) + return set_unrestricted(to); + Result r; + PPL_DIRTY_TEMP(T, mul); + if (is_singleton(x)) { + if (is_singleton(y)) + return set_integer(to); + PPL_DIRTY_TEMP(typename Boundary_Value::type, n); + r = abs_assign_r(n, f_lower(x), ROUND_CHECK); + if (r != V_EQ) + return set_integer(to); + r = assign_r(mul, n, ROUND_CHECK); + if (r != V_EQ) + return set_integer(to); + r = mul_assign_r(to.remainder, mul, ry.remainder, ROUND_NOT_NEEDED); + if (r != V_EQ) + return set_integer(to); + r = mul_assign_r(to.divisor, mul, ry.divisor, ROUND_NOT_NEEDED); + if (r != V_EQ) + return set_integer(to); + } + else if (is_singleton(y)) { + PPL_DIRTY_TEMP(typename Boundary_Value::type, n); + r = abs_assign_r(n, f_lower(y), ROUND_CHECK); + if (r != V_EQ) + return set_integer(to); + r = assign_r(mul, n, ROUND_CHECK); + if (r != V_EQ) + return set_integer(to); + r = mul_assign_r(to.remainder, rx.remainder, mul, ROUND_NOT_NEEDED); + if (r != V_EQ) + return set_integer(to); + r = mul_assign_r(to.divisor, rx.divisor, mul, ROUND_NOT_NEEDED); + if (r != V_EQ) + return set_integer(to); + } + else { + r = gcd_assign_r(to.divisor, rx.divisor, ry.divisor, ROUND_NOT_NEEDED); + assert(r == V_EQ); + mulmod(to.remainder, rx.remainder, ry.remainder, to.divisor); + } + return true; +} + +template +inline bool +div_restriction(Interval_Restriction_Integer_Modulo& to, + const From1& x, const From2& y) { + if (is_singleton(y)) { + if (is_singleton(x)) { + // FIXME: to be written + } + } + return set_unrestricted(to); +} + +template +inline void +output_restriction(std::ostream& s, const Interval_Restriction_Integer_Modulo& x) { + if (x.divisor == 1) + s << "i"; + else if (x.divisor != 0) + s << "{" << x.remainder << "%" << x.divisor << "}"; +} + +} + +#endif // !defined(PPL_Interval_Info_defs_hh) diff --git a/src/Linear_Expression.cc b/src/Linear_Expression.cc new file mode 100644 index 0000000..23b4ca1 --- /dev/null +++ b/src/Linear_Expression.cc @@ -0,0 +1,410 @@ +/* Linear_Expression class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + + +#include + +#include "Linear_Expression.defs.hh" +#include "Constraint.defs.hh" +#include "Generator.defs.hh" +#include "Grid_Generator.defs.hh" +#include "Congruence.defs.hh" +#include + +namespace PPL = Parma_Polyhedra_Library; + +PPL::Linear_Expression::Linear_Expression(const Constraint& c) + : Linear_Row(c.space_dimension() + 1, Linear_Row::Flags()) { + Linear_Expression& e = *this; + for (dimension_type i = size(); i-- > 0; ) + e[i] = c[i]; +} + +PPL::Linear_Expression::Linear_Expression(const Generator& g) + : Linear_Row(g.space_dimension() + 1, Linear_Row::Flags()) { + Linear_Expression& e = *this; + // Do not copy the divisor of `g'. + for (dimension_type i = size(); --i > 0; ) + e[i] = g[i]; +} + +PPL::Linear_Expression::Linear_Expression(const Grid_Generator& g) + : Linear_Row(g.space_dimension() + 1, Linear_Row::Flags()) { + Linear_Expression& e = *this; + // Do not copy the divisor of `g'. + for (dimension_type i = size(); --i > 0; ) + e[i] = g[i]; +} + +const PPL::Linear_Expression* PPL::Linear_Expression::zero_p = 0; + +void +PPL::Linear_Expression::initialize() { + assert(zero_p == 0); + zero_p = new Linear_Expression(Coefficient_zero()); +} + +void +PPL::Linear_Expression::finalize() { + assert(zero_p != 0); + delete zero_p; + zero_p = 0; +} + +PPL::Linear_Expression::Linear_Expression(const Congruence& cg) + : Linear_Row(cg.space_dimension() + 1, Linear_Row::Flags()) { + Linear_Expression& e = *this; + for (dimension_type i = size(); i-- > 0; ) + e[i] = cg[i]; +} + +PPL::Linear_Expression::Linear_Expression(const Variable v) + : Linear_Row(v.space_dimension() <= max_space_dimension() + ? v.space_dimension() + 1 + : (throw std::length_error("PPL::Linear_Expression::" + "Linear_Expression(v):\n" + "v exceeds the maximum allowed " + "space dimension."), + v.space_dimension() + 1) + , Linear_Row::Flags()) { + ++((*this)[v.space_dimension()]); +} + +PPL::Linear_Expression::Linear_Expression(const Variable v, const Variable w) + : Linear_Row() { + 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("PPL::Linear_Expression::" + "Linear_Expression(v, w):\n" + "v or w exceed the maximum allowed " + "space dimension."); + construct(space_dim+1, Linear_Row::Flags()); + if (v_space_dim != w_space_dim) { + ++((*this)[v_space_dim]); + --((*this)[w_space_dim]); + } +} + +/*! \relates Parma_Polyhedra_Library::Linear_Expression */ +PPL::Linear_Expression +PPL::operator+(const Linear_Expression& e1, const Linear_Expression& e2) { + dimension_type e1_size = e1.size(); + dimension_type e2_size = e2.size(); + dimension_type min_size; + dimension_type max_size; + const Linear_Expression* p_e_max; + if (e1_size > e2_size) { + min_size = e2_size; + max_size = e1_size; + p_e_max = &e1; + } + else { + min_size = e1_size; + max_size = e2_size; + p_e_max = &e2; + } + + Linear_Expression r(max_size, false); + dimension_type i = max_size; + while (i > min_size) { + --i; + r[i] = (*p_e_max)[i]; + } + while (i > 0) { + --i; + r[i] = e1[i] + e2[i]; + } + + return r; +} + +/*! \relates Linear_Expression */ +PPL::Linear_Expression +PPL::operator+(const Variable v, const Linear_Expression& e) { + const dimension_type v_space_dim = v.space_dimension(); + if (v_space_dim > Linear_Expression::max_space_dimension()) + throw std::length_error("Linear_Expression " + "PPL::operator+(v, e):\n" + "v exceeds the maximum allowed " + "space dimension."); + const dimension_type space_dim = std::max(v_space_dim, e.space_dimension()); + Linear_Expression r(e, space_dim+1); + ++r[v_space_dim]; + return r; +} + +/*! \relates Parma_Polyhedra_Library::Linear_Expression */ +PPL::Linear_Expression +PPL::operator+(Coefficient_traits::const_reference n, + const Linear_Expression& e) { + Linear_Expression r(e); + r[0] += n; + return r; +} + +/*! \relates Linear_Expression */ +PPL::Linear_Expression +PPL::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."); + Linear_Expression r(space_dim+1, true); + ++r[v_space_dim]; + ++r[w_space_dim]; + return r; +} + +/*! \relates Parma_Polyhedra_Library::Linear_Expression */ +PPL::Linear_Expression +PPL::operator-(const Linear_Expression& e) { + Linear_Expression r(e); + for (dimension_type i = e.size(); i-- > 0; ) + neg_assign(r[i]); + return r; +} + +/*! \relates Parma_Polyhedra_Library::Linear_Expression */ +PPL::Linear_Expression +PPL::operator-(const Linear_Expression& e1, const Linear_Expression& e2) { + dimension_type e1_size = e1.size(); + dimension_type e2_size = e2.size(); + if (e1_size > e2_size) { + Linear_Expression r(e1_size, false); + dimension_type i = e1_size; + while (i > e2_size) { + --i; + r[i] = e1[i]; + } + while (i > 0) { + --i; + r[i] = e1[i] - e2[i]; + } + return r; + } + else { + Linear_Expression r(e2_size, false); + dimension_type i = e2_size; + while (i > e1_size) { + --i; + r[i] = -e2[i]; + } + while (i > 0) { + --i; + r[i] = e1[i] - e2[i]; + } + return r; + } +} + +/*! \relates Parma_Polyhedra_Library::Linear_Expression */ +PPL::Linear_Expression +PPL::operator-(const Variable v, const Linear_Expression& e) { + const dimension_type v_space_dim = v.space_dimension(); + if (v_space_dim > Linear_Expression::max_space_dimension()) + throw std::length_error("Linear_Expression " + "PPL::operator-(v, e):\n" + "v exceeds the maximum allowed " + "space dimension."); + const dimension_type e_space_dim = e.space_dimension(); + const dimension_type space_dim = std::max(v_space_dim, e_space_dim); + Linear_Expression r(e, space_dim+1); + for (dimension_type i = e.size(); i-- > 0; ) + neg_assign(r[i]); + ++r[v_space_dim]; + return r; +} + +/*! \relates Linear_Expression */ +PPL::Linear_Expression +PPL::operator-(const Linear_Expression& e, const Variable v) { + const dimension_type v_space_dim = v.space_dimension(); + if (v_space_dim > Linear_Expression::max_space_dimension()) + throw std::length_error("Linear_Expression " + "PPL::operator-(e, v):\n" + "v exceeds the maximum allowed " + "space dimension."); + const dimension_type space_dim = std::max(v_space_dim, e.space_dimension()); + Linear_Expression r(e, space_dim+1); + --r[v_space_dim]; + return r; +} + +/*! \relates Parma_Polyhedra_Library::Linear_Expression */ +PPL::Linear_Expression +PPL::operator-(Coefficient_traits::const_reference n, + const Linear_Expression& e) { + Linear_Expression r(e); + for (dimension_type i = e.size(); i-- > 0; ) + neg_assign(r[i]); + r[0] += n; + return r; +} + +/*! \relates Parma_Polyhedra_Library::Linear_Expression */ +PPL::Linear_Expression +PPL::operator*(Coefficient_traits::const_reference n, + const Linear_Expression& e) { + Linear_Expression r(e); + for (dimension_type i = e.size(); i-- > 0; ) + r[i] *= n; + return r; +} + +/*! \relates Parma_Polyhedra_Library::Linear_Expression */ +PPL::Linear_Expression& +PPL::operator+=(Linear_Expression& e1, const Linear_Expression& e2) { + dimension_type e1_size = e1.size(); + dimension_type e2_size = e2.size(); + if (e1_size >= e2_size) + for (dimension_type i = e2_size; i-- > 0; ) + e1[i] += e2[i]; + else { + Linear_Expression e(e2); + for (dimension_type i = e1_size; i-- > 0; ) + e[i] += e1[i]; + std::swap(e1, e); + } + return e1; +} + +/*! \relates Parma_Polyhedra_Library::Linear_Expression */ +PPL::Linear_Expression& +PPL::operator+=(Linear_Expression& e, const Variable v) { + const dimension_type v_space_dim = v.space_dimension(); + if (v_space_dim > Linear_Expression::max_space_dimension()) + throw std::length_error("Linear_Expression& " + "PPL::operator+=(e, v):\n" + "v exceeds the maximum allowed space dimension."); + const dimension_type e_size = e.size(); + if (e_size <= v_space_dim) { + Linear_Expression new_e(e, v_space_dim+1); + std::swap(e, new_e); + } + ++e[v_space_dim]; + return e; +} + +/*! \relates Parma_Polyhedra_Library::Linear_Expression */ +PPL::Linear_Expression& +PPL::operator-=(Linear_Expression& e1, const Linear_Expression& e2) { + dimension_type e1_size = e1.size(); + dimension_type e2_size = e2.size(); + if (e1_size >= e2_size) + for (dimension_type i = e2_size; i-- > 0; ) + e1[i] -= e2[i]; + else { + Linear_Expression e(e1, e2_size); + for (dimension_type i = e2_size; i-- > 0; ) + e[i] -= e2[i]; + std::swap(e1, e); + } + return e1; +} + +/*! \relates Parma_Polyhedra_Library::Linear_Expression */ +PPL::Linear_Expression& +PPL::operator-=(Linear_Expression& e, const Variable v) { + const dimension_type v_space_dim = v.space_dimension(); + if (v_space_dim > Linear_Expression::max_space_dimension()) + throw std::length_error("Linear_Expression& " + "PPL::operator-=(e, v):\n" + "v exceeds the maximum allowed space dimension."); + const dimension_type e_size = e.size(); + if (e_size <= v_space_dim) { + Linear_Expression new_e(e, v_space_dim+1); + std::swap(e, new_e); + } + --e[v_space_dim]; + return e; +} + +/*! \relates Parma_Polyhedra_Library::Linear_Expression */ +PPL::Linear_Expression& +PPL::operator*=(Linear_Expression& e, Coefficient_traits::const_reference n) { + dimension_type e_size = e.size(); + for (dimension_type i = e_size; i-- > 0; ) + e[i] *= n; + return e; +} + +bool +PPL::Linear_Expression::OK() const { + return Linear_Row::OK(); +} + +/*! \relates Parma_Polyhedra_Library::Linear_Expression */ +std::ostream& +PPL::IO_Operators::operator<<(std::ostream& s, const Linear_Expression& e) { + const dimension_type num_variables = e.space_dimension(); + PPL_DIRTY_TEMP_COEFFICIENT(ev); + bool first = true; + for (dimension_type v = 0; v < num_variables; ++v) { + ev = e[v+1]; + if (ev != 0) { + if (!first) { + if (ev > 0) + s << " + "; + else { + s << " - "; + neg_assign(ev); + } + } + else + first = false; + if (ev == -1) + s << "-"; + else if (ev != 1) + s << ev << "*"; + s << PPL::Variable(v); + } + } + // Inhomogeneous term. + PPL_DIRTY_TEMP_COEFFICIENT(it); + it = e[0]; + if (it != 0) { + if (!first) { + if (it > 0) + s << " + "; + else { + s << " - "; + neg_assign(it); + } + } + else + first = false; + s << it; + } + + if (first) + // The null linear expression. + s << Coefficient_zero(); + return s; +} + +PPL_OUTPUT_DEFINITIONS(Linear_Expression) diff --git a/src/Linear_Expression.defs.hh b/src/Linear_Expression.defs.hh new file mode 100644 index 0000000..6b1adc1 --- /dev/null +++ b/src/Linear_Expression.defs.hh @@ -0,0 +1,461 @@ +/* Linear_Expression class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Linear_Expression_defs_hh +#define PPL_Linear_Expression_defs_hh 1 + +#include "Linear_Expression.types.hh" +#include "Scalar_Products.types.hh" +#include "Constraint.types.hh" +#include "Generator.types.hh" +#include "Congruence.types.hh" +#include "Grid_Generator.types.hh" +#include "Linear_Row.defs.hh" +#include "Coefficient.types.hh" +#include "Variable.defs.hh" +#include "Constraint_System.types.hh" +#include "Generator_System.types.hh" +#include "Congruence_System.types.hh" +#include "Grid_Generator_System.types.hh" +#include "Polyhedron.types.hh" +#include "Grid.types.hh" +#include + +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 + Linear_Expression::max_space_dimension(). + */ +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 + Linear_Expression::max_space_dimension(). + */ +Linear_Expression& +operator-=(Linear_Expression& e, Variable v); + +//! Returns the linear expression \p e - \p n and assigns it to \p e. +/*! \relates Linear_Expression */ +Linear_Expression& +operator-=(Linear_Expression& e, Coefficient_traits::const_reference n); + +//! Returns the linear expression \p n * \p e and assigns it to \p e. +/*! \relates Linear_Expression */ +Linear_Expression& +operator*=(Linear_Expression& e, Coefficient_traits::const_reference n); + +namespace IO_Operators { + +//! Output operator. +/*! \relates Parma_Polyhedra_Library::Linear_Expression */ +std::ostream& operator<<(std::ostream& s, const Linear_Expression& e); + +} // namespace IO_Operators + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Linear_Expression */ +void swap(Parma_Polyhedra_Library::Linear_Expression& x, + Parma_Polyhedra_Library::Linear_Expression& y); + +} // namespace std + +//! A linear expression. +/*! \ingroup PPL_CXX_interface + An object of the class Linear_Expression represents the linear expression + \f[ + \sum_{i=0}^{n-1} a_i x_i + b + \f] + where \f$n\f$ is the dimension of the vector space, + each \f$a_i\f$ is the integer coefficient + of the \f$i\f$-th variable \f$x_i\f$ + and \f$b\f$ is the integer for the inhomogeneous term. + + \par How to build a linear expression. + + Linear expressions are the basic blocks for defining + both constraints (i.e., linear equalities or inequalities) + and generators (i.e., lines, rays, points and closure points). + A full set of functions is defined to provide a convenient interface + for building complex linear expressions starting from simpler ones + and from objects of the classes Variable and Coefficient: + available operators include unary negation, + binary addition and subtraction, + as well as multiplication by a Coefficient. + The space dimension of a linear expression is defined as the maximum + space dimension of the arguments used to build it: + in particular, the space dimension of a Variable x + is defined as x.id()+1, + whereas all the objects of the class Coefficient have space dimension zero. + + \par Example + The following code builds the linear expression \f$4x - 2y - z + 14\f$, + having space dimension \f$3\f$: + \code + Linear_Expression e = 4*x - 2*y - z + 14; + \endcode + Another way to build the same linear expression is: + \code + Linear_Expression e1 = 4*x; + Linear_Expression e2 = 2*y; + Linear_Expression e3 = z; + Linear_Expression e = Linear_Expression(14); + e += e1 - e2 - e3; + \endcode + Note that \p e1, \p e2 and \p e3 have space dimension 1, 2 and 3, + respectively; also, in the fourth line of code, \p e is created + with space dimension zero and then extended to space dimension 3 + in the fifth line. +*/ +class Parma_Polyhedra_Library::Linear_Expression : private Linear_Row { +public: + //! Default constructor: returns a copy of Linear_Expression::zero(). + Linear_Expression(); + + //! Ordinary copy-constructor. + Linear_Expression(const Linear_Expression& e); + + //! Destructor. + ~Linear_Expression(); + + /*! \brief + Builds the linear expression corresponding + to the inhomogeneous term \p n. + */ + explicit Linear_Expression(Coefficient_traits::const_reference n); + + //! Builds the linear expression corresponding to the variable \p v. + /*! + \exception std::length_error + Thrown if the space dimension of \p v exceeds + Linear_Expression::max_space_dimension(). + */ + Linear_Expression(Variable v); + + //! Builds the linear expression corresponding to constraint \p c. + /*! + Given the constraint + \f$c = \bigl(\sum_{i=0}^{n-1} a_i x_i + b \relsym 0\bigr)\f$, + where \f$\mathord{\relsym} \in \{ =, \geq, > \}\f$, + this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i + b\f$. + If \p c is an inequality (resp., equality) constraint, then + the built linear expression is unique up to a positive + (resp., non-zero) factor. + */ + explicit Linear_Expression(const Constraint& c); + + /*! \brief + Builds the linear expression corresponding to generator \p g + (for points and closure points, the divisor is not copied). + + Given the generator + \f$g = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$ + (where, for lines and rays, we have \f$d = 1\f$), + this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i\f$. + The inhomogeneous term of the linear expression will always be 0. + If \p g is a ray, point or closure point (resp., a line), then + the linear expression is unique up to a positive + (resp., non-zero) factor. + */ + explicit Linear_Expression(const Generator& g); + + /*! \brief + Builds the linear expression corresponding to grid generator \p g + (for points, parameters and lines the divisor is not copied). + + Given the grid generator + \f$g = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$ + this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i\f$. + The inhomogeneous term of the linear expression is always 0. + */ + explicit Linear_Expression(const Grid_Generator& g); + + //! Builds the linear expression corresponding to congruence \p cg. + /*! + Given the congruence + \f$cg = \bigl(\sum_{i=0}^{n-1} a_i x_i + b = 0 \pmod{m}\bigr)\f$, + this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i + b\f$. + */ + explicit Linear_Expression(const Congruence& cg); + + //! Returns the maximum space dimension a Linear_Expression can handle. + static dimension_type max_space_dimension(); + + //! Returns the dimension of the vector space enclosing \p *this. + dimension_type space_dimension() const; + + //! Returns the coefficient of \p v in \p *this. + Coefficient_traits::const_reference coefficient(Variable v) const; + + //! Returns the inhomogeneous term of \p *this. + Coefficient_traits::const_reference inhomogeneous_term() const; + + //! 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; + + 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 true if successful, false otherwise. + */ + bool ascii_load(std::istream& s); + + //! Checks if all the invariants are satisfied. + bool OK() const; + + //! Swaps \p *this with \p y. + void swap(Linear_Expression& y); + +private: + /*! \brief + Holds (between class initialization and finalization) a pointer to + the (zero-dimension space) constant 0. + */ + static const Linear_Expression* zero_p; + + friend class Parma_Polyhedra_Library::Scalar_Products; + friend class Parma_Polyhedra_Library::Constraint; + friend class Parma_Polyhedra_Library::Generator; + // The following declaration grants access to Grid_Generator::parameter. + friend class Parma_Polyhedra_Library::Grid_Generator; + friend class Parma_Polyhedra_Library::Congruence; + // FIXME: the following friend declaration should be avoided. + friend class Parma_Polyhedra_Library::Polyhedron; + friend class Parma_Polyhedra_Library::Grid; + + // FIXME: the following friend declaration is only to grant access to + // Constraint_System::affine_preimage(). + friend class Parma_Polyhedra_Library::Constraint_System; + + // FIXME: the following friend declaration is only to grant access to + // Generator_System::affine_image(). + friend class Parma_Polyhedra_Library::Generator_System; + + // FIXME: the following friend declaration is only to grant access to + // Congruence_System::affine_preimage(). + friend class Parma_Polyhedra_Library::Congruence_System; + + // FIXME: the following friend declaration is only to grant access to + // Grid_Generator_System::affine_image(). + friend class Parma_Polyhedra_Library::Grid_Generator_System; + + //! Copy-constructor with a specified space dimension. + Linear_Expression(const Linear_Expression& e, dimension_type sz); + + //! Implementation sizing constructor. + /*! + The bool parameter is just to avoid problems with + the constructor Linear_Expression(Coefficient_traits::const_reference n). + */ + Linear_Expression(dimension_type sz, bool); + + /*! \brief + Builds the linear expression 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 + Linear_Expression::max_space_dimension(). + */ + Linear_Expression(Variable v, Variable w); + + 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 std::ostream& + Parma_Polyhedra_Library::IO_Operators + ::operator<<(std::ostream& s, const Linear_Expression& e); +}; + +#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..535fa91 --- /dev/null +++ b/src/Linear_Expression.inlines.hh @@ -0,0 +1,180 @@ +/* Linear_Expression class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Linear_Expression_inlines_hh +#define PPL_Linear_Expression_inlines_hh 1 + +#include "Variable.defs.hh" +#include "Coefficient.defs.hh" +#include + +namespace Parma_Polyhedra_Library { + +inline dimension_type +Linear_Expression::max_space_dimension() { + return Linear_Row::max_space_dimension(); +} + +inline +Linear_Expression::Linear_Expression() + : Linear_Row(1, Linear_Row::Flags()) { +} + +inline +Linear_Expression::Linear_Expression(dimension_type sz, bool) + : Linear_Row(sz, Linear_Row::Flags()) { +} + +inline +Linear_Expression::Linear_Expression(const Linear_Expression& e) + : Linear_Row(e) { +} + +inline +Linear_Expression::~Linear_Expression() { +} + +inline +Linear_Expression::Linear_Expression(const Linear_Expression& e, + dimension_type sz) + : Linear_Row(e, sz, sz) { +} + +inline +Linear_Expression::Linear_Expression(Coefficient_traits::const_reference n) + : Linear_Row(1, Linear_Row::Flags()) { + (*this)[0] = n; +} + +inline dimension_type +Linear_Expression::space_dimension() const { + return size() - 1; +} + +inline Coefficient_traits::const_reference +Linear_Expression::coefficient(Variable v) const { + if (v.space_dimension() > space_dimension()) + return Coefficient_zero(); + return Linear_Row::coefficient(v.id()); +} + +inline Coefficient_traits::const_reference +Linear_Expression::inhomogeneous_term() const { + return Linear_Row::inhomogeneous_term(); +} + +inline const Linear_Expression& +Linear_Expression::zero() { + assert(zero_p != 0); + return *zero_p; +} + +inline memory_size_type +Linear_Expression::external_memory_in_bytes() const { + return Linear_Row::external_memory_in_bytes(); +} + +inline memory_size_type +Linear_Expression::total_memory_in_bytes() const { + return Linear_Row::total_memory_in_bytes(); +} + +/*! \relates Linear_Expression */ +inline Linear_Expression +operator+(const Linear_Expression& e) { + return e; +} + +/*! \relates Linear_Expression */ +inline Linear_Expression +operator+(const Linear_Expression& e, Coefficient_traits::const_reference n) { + return n + e; +} + +/*! \relates Linear_Expression */ +inline Linear_Expression +operator+(const Linear_Expression& e, const Variable v) { + return v + e; +} + +/*! \relates Linear_Expression */ +inline Linear_Expression +operator-(const Linear_Expression& e, Coefficient_traits::const_reference n) { + return -n + e; +} + +/*! \relates Linear_Expression */ +inline Linear_Expression +operator-(const Variable v, const Variable w) { + return Linear_Expression(v, w); +} + +/*! \relates Linear_Expression */ +inline Linear_Expression +operator*(const Linear_Expression& e, Coefficient_traits::const_reference n) { + return n * e; +} + +/*! \relates Linear_Expression */ +inline Linear_Expression& +operator+=(Linear_Expression& e, Coefficient_traits::const_reference n) { + e[0] += n; + return e; +} + +/*! \relates Linear_Expression */ +inline Linear_Expression& +operator-=(Linear_Expression& e, Coefficient_traits::const_reference n) { + e[0] -= n; + return e; +} + +inline void +Linear_Expression::swap(Linear_Expression& y) { + Linear_Row::swap(y); +} + +inline void +Linear_Expression::ascii_dump(std::ostream& s) const { + Linear_Row::ascii_dump(s); +} + +inline bool +Linear_Expression::ascii_load(std::istream& s) { + return Linear_Row::ascii_load(s); +} + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Linear_Expression */ +inline void +swap(Parma_Polyhedra_Library::Linear_Expression& x, + Parma_Polyhedra_Library::Linear_Expression& y) { + x.swap(y); +} + +} // namespace std + +#endif // !defined(PPL_Linear_Expression_inlines_hh) diff --git a/src/Linear_Expression.types.hh b/src/Linear_Expression.types.hh new file mode 100644 index 0000000..dd9ec88 --- /dev/null +++ b/src/Linear_Expression.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PPL_Linear_Expression_types_hh +#define PPL_Linear_Expression_types_hh 1 + +namespace Parma_Polyhedra_Library { + +class Linear_Expression; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Linear_Expression_types_hh) diff --git a/src/Linear_Row.cc b/src/Linear_Row.cc new file mode 100644 index 0000000..f536abe --- /dev/null +++ b/src/Linear_Row.cc @@ -0,0 +1,228 @@ +/* Linear_Row class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Linear_Row.defs.hh" +#include "Coefficient.defs.hh" +#include +#include + +namespace PPL = Parma_Polyhedra_Library; + +void +PPL::Linear_Row::sign_normalize() { + if (is_line_or_equality()) { + Linear_Row& x = *this; + const dimension_type sz = x.size(); + // `first_non_zero' indicates the index of the first + // coefficient of the row different from zero, disregarding + // the very first coefficient (inhomogeneous term / divisor). + dimension_type first_non_zero; + for (first_non_zero = 1; first_non_zero < sz; ++first_non_zero) + if (x[first_non_zero] != 0) + break; + if (first_non_zero < sz) + // If the first non-zero coefficient of the row is negative, + // we negate the entire row. + if (x[first_non_zero] < 0) { + for (dimension_type j = first_non_zero; j < sz; ++j) + neg_assign(x[j]); + // Also negate the first coefficient. + neg_assign(x[0]); + } + } +} + +bool +PPL::Linear_Row::check_strong_normalized() const { + Linear_Row tmp = *this; + tmp.strong_normalize(); + return compare(*this, tmp) == 0; +} + +/*! \relates Parma_Polyhedra_Library::Linear_Row */ +int +PPL::compare(const Linear_Row& x, const Linear_Row& y) { + const bool x_is_line_or_equality = x.is_line_or_equality(); + const bool y_is_line_or_equality = y.is_line_or_equality(); + if (x_is_line_or_equality != y_is_line_or_equality) + // Equalities (lines) precede inequalities (ray/point). + return y_is_line_or_equality ? 2 : -2; + + // Compare all the coefficients of the row starting from position 1. + const dimension_type xsz = x.size(); + const dimension_type ysz = y.size(); + const dimension_type min_sz = std::min(xsz, ysz); + dimension_type i; + for (i = 1; i < min_sz; ++i) + if (const int comp = cmp(x[i], y[i])) + // There is at least a different coefficient. + return (comp > 0) ? 2 : -2; + + // Handle the case where `x' and `y' are of different size. + if (xsz != ysz) { + for( ; i < xsz; ++i) + if (const int sign = sgn(x[i])) + return (sign > 0) ? 2 : -2; + for( ; i < ysz; ++i) + if (const int sign = sgn(y[i])) + return (sign < 0) ? 2 : -2; + } + + // If all the coefficients in `x' equal all the coefficients in `y' + // (starting from position 1) we compare coefficients in position 0, + // i.e., inhomogeneous terms. + if (const int comp = cmp(x[0], y[0])) + return (comp > 0) ? 1 : -1; + + // `x' and `y' are equal. + return 0; +} + +void +PPL::Linear_Row::linear_combine(const Linear_Row& y, const dimension_type k) { + Linear_Row& x = *this; + // We can combine only vector of the same dimension. + assert(x.size() == y.size()); + assert(y[k] != 0 && x[k] != 0); + // Let g be the GCD between `x[k]' and `y[k]'. + // For each i the following computes + // x[i] = x[i]*y[k]/g - y[i]*x[k]/g. + 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); + for (dimension_type i = size(); i-- > 0; ) + if (i != k) { + Coefficient& x_i = x[i]; + x_i *= normalized_y_k; + sub_mul_assign(x_i, y[i], normalized_x_k); + } + x[k] = 0; + x.strong_normalize(); +} + +bool +PPL::Linear_Row::all_homogeneous_terms_are_zero() const { + const Linear_Row& x = *this; + for (dimension_type i = x.size(); --i > 0; ) + if (x[i] != 0) + return false; + return true; +} + +namespace { + +// These are the keywords that indicate the individual assertions. +const char* rpi_valid = "RPI_V"; +const char* is_rpi = "RPI"; +const char* nnc_valid = "NNC_V"; +const char* is_nnc = "NNC"; +const char* bit_names[] = {rpi_valid, is_rpi, nnc_valid, is_nnc}; + +} // namespace + +void +PPL::Linear_Row::Flags::ascii_dump(std::ostream& s) const { + s << (test_bits(1 << Flags::rpi_validity_bit) ? '+' : '-') + << rpi_valid << ' ' + << (test_bits(1 << Flags::rpi_bit) ? '+' : '-') + << is_rpi << ' ' + << ' ' + << (test_bits(1 << Flags::nnc_validity_bit) ? '+' : '-') + << nnc_valid << ' ' + << (test_bits(1 << Flags::nnc_bit) ? '+' : '-') + << is_nnc; +} + +PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Linear_Row::Flags) + +bool +PPL::Linear_Row::Flags::ascii_load(std::istream& s) { + std::string str; + // Assume that the bits are used in sequence. + reset_bits(std::numeric_limits::max()); + for (unsigned int bit = 0; + bit < (sizeof(bit_names) / sizeof(char*)); + ++bit) { + if (!(s >> str)) + return false; + if (str[0] == '+') + set_bits(1 << (Row::Flags::first_free_bit + bit)); + else if (str[0] != '-') + return false; + if (str.compare(1, strlen(bit_names[bit]), bit_names[bit]) != 0) + return false; + } + return true; +} + +void +PPL::Linear_Row::ascii_dump(std::ostream& s) const { + const Row& x = *this; + const dimension_type x_size = x.size(); + s << "size " << x_size << " "; + for (dimension_type i = 0; i < x_size; ++i) + s << x[i] << ' '; + s << "f "; + flags().ascii_dump(s); + s << "\n"; +} + +PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Linear_Row) + +bool +PPL::Linear_Row::ascii_load(std::istream& s) { + std::string str; + if (!(s >> str) || str != "size") + return false; + dimension_type new_size; + if (!(s >> new_size)) + return false; + + Row& x = *this; + const dimension_type old_size = x.size(); + if (new_size < old_size) + x.shrink(new_size); + else if (new_size > old_size) { + Row y(new_size, Row::Flags()); + x.swap(y); + } + + for (dimension_type col = 0; col < new_size; ++col) + if (!(s >> x[col])) + return false; + if (!(s >> str) || str != "f") + return false; + return flags().ascii_load(s); +} + +bool +PPL::Linear_Row::OK() const { + return Row::OK(); +} + +bool +PPL::Linear_Row::OK(const dimension_type row_size, + const dimension_type row_capacity) const { + return Row::OK(row_size, row_capacity); +} diff --git a/src/Linear_Row.defs.hh b/src/Linear_Row.defs.hh new file mode 100644 index 0000000..b3f38b7 --- /dev/null +++ b/src/Linear_Row.defs.hh @@ -0,0 +1,464 @@ +/* Linear_Row class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Linear_Row_defs_hh +#define PPL_Linear_Row_defs_hh 1 + +#include "Linear_Row.types.hh" +#include "globals.defs.hh" +#include "Row.defs.hh" +#include "Topology.hh" +#include "Linear_Expression.types.hh" +#include "Constraint.types.hh" +#include "Generator.types.hh" + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! The base class for linear expressions, constraints and generators. +/*! \ingroup PPL_CXX_interface + The class Linear_Row allows us to build objects of the form + \f$[b, a_0, \ldots, a_{d-1}]_{(t, k)}\f$, + i.e., a finite sequence of coefficients subscripted by a pair of flags, + which are both stored in a Linear_Row::Flags object. + The flag \f$t \in \{ \mathrm{c}, \mathrm{nnc} \}\f$ represents + the topology and + the flag \f$k \in \{\mathord{=}, \mathord{\geq} \}\f$ represents + the kind of the Linear_Row object. + Note that, even though all the four possible combinations of topology + and kind values will result in a legal Linear_Row::Flags object, some + of these pose additional constraints on the values of the Linear_Row's + coefficients. + + When \f$t = c\f$, we have the following cases + (\f$d\f$ is the dimension of the vector space): + - \f$[b, a_0, \ldots, a_{d-1}]_{(c,=)}\f$ + represents the equality constraint + \f$\sum_{i=0}^{d-1} a_i x_i + b = 0\f$. + - \f$[b, a_0, \ldots, a_{d-1}]_{(c,\geq)}\f$ + represents the non-strict inequality constraint + \f$\sum_{i=0}^{d-1} a_i x_i + b \geq 0\f$. + - \f$[0, a_0, \ldots, a_{d-1}]_{(c,=)}\f$ + represents the line of direction + \f$\vect{l} = (a_0, \ldots, a_{d-1})^\transpose\f$. + - \f$[0, a_0, \ldots, a_{d-1}]_{(c,\geq)}\f$ + represents the ray of direction + \f$\vect{r} = (a_0, \ldots, a_{d-1})^\transpose\f$. + - \f$[b, a_0, \ldots, a_{d-1}]_{(c,\geq)}\f$, with \f$b > 0\f$, + represents the point + \f$\vect{p} = (\frac{a_0}{b}, \ldots, \frac{a_{d-1}}{b})^\transpose\f$. + + When \f$t = \mathrm{nnc}\f$, the last coefficient of the Linear_Row is + associated to the slack variable \f$\epsilon\f$, so that we have the + following cases (\f$d\f$ is again the dimension of the vector space, + but this time we have \f$d+2\f$ coefficients): + - \f$[b, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},=)}\f$ + represents the equality constraint + \f$\sum_{i=0}^{d-1} a_i x_i + b = 0\f$. + - \f$[b, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},\geq)}\f$ + represents the non-strict inequality constraint + \f$\sum_{i=0}^{d-1} a_i x_i + b \geq 0\f$. + - \f$[b, a_0, \ldots, a_{d-1}, e]_{(\mathrm{nnc},\geq)}\f$, + with \f$e < 0\f$, represents the strict inequality constraint + \f$\sum_{i=0}^{d-1} a_i x_i + b > 0\f$. + - \f$[0, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},=)}\f$ + represents the line of direction + \f$\vect{l} = (a_0, \ldots, a_{d-1})^\transpose\f$. + - \f$[0, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},\geq)}\f$ + represents the ray of direction + \f$\vect{r} = (a_0, \ldots, a_{d-1})^\transpose\f$. + - \f$[b, a_0, \ldots, a_{d-1}, e]_{(\mathrm{nnc},\geq)}\f$, + with \f$b > 0\f$ and \f$e > 0\f$, represents the point + \f$\vect{p} = (\frac{a_0}{b}, \ldots, \frac{a_{d-1}}{b})^\transpose\f$. + - \f$[b, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},\geq)}\f$, + with \f$b > 0\f$, represents the closure point + \f$\vect{c} = (\frac{a_0}{b}, \ldots, \frac{a_{d-1}}{b})^\transpose\f$. + + So, a Linear_Row can be both a constraint and a generator: it can be an + equality, a strict or non-strict inequality, a line, a ray, a point + or a closure point. + + The inhomogeneous term of a constraint can be zero or different from zero. + + Points and closure points must have a positive inhomogeneous term + (which is used as a common divisor for all the other coefficients), + lines and rays must have the inhomogeneous term equal to zero. + If needed, the coefficients of points and closure points are negated + at creation time so that they satisfy this invariant. + The invariant is maintained because, when combining a point or closure + point with another generator, we only consider positive combinations. + + The \f$\epsilon\f$ coefficient, when present, is negative for strict + inequality constraints, positive for points and equal to zero in all + the other cases. + Note that the above description corresponds to the end-user, high-level + view of a Linear_Row object. In the implementation, to allow for code reuse, + it is sometimes useful to regard an \f$\mathrm{nnc}\f$-object on + the vector space \f$\Rset^d\f$ as if it was a \f$\mathrm{c}\f$-object + on the vector space \f$\Rset^{d+1}\f$, therefore interpreting the slack + variable \f$\epsilon\f$ as an ordinary dimension of the vector space. + + A Linear_Row object implementing a Linear_Expression is always of the form + \f$[0, a_0, \ldots, a_{d-1}]_{(c,=)}\f$, which represents the + linear expression \f$\sum_{i=0}^{d-1} a_i x_i\f$. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) + +class Parma_Polyhedra_Library::Linear_Row : public Row { +public: + //! The possible kinds of Linear_Row objects. + enum Kind { + LINE_OR_EQUALITY = 0, + RAY_OR_POINT_OR_INEQUALITY = 1 + }; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS + /*! \brief + The type of the object to which the coefficients refer to, + encoding both topology and kind. + + \ingroup PPL_CXX_interface + This combines the information about the topology (necessarily closed + or not) and the kind (line/equality or ray/point/inequality) + of a Linear_Row object. + */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) + class Flags : public Row::Flags { + public: + //! Default constructor: builds an object where all flags are invalid. + Flags(); + + //! Builds an object corresponding to the topology \p t. + explicit Flags(Topology t); + + //! Builds an object corresponding to the topology \p t and kind \p k. + Flags(Topology t, Kind k); + + //! \name Testing and setting the type + //@{ + Topology topology() const; + bool is_necessarily_closed() const; + bool is_not_necessarily_closed() const; + bool is_line_or_equality() const; + bool is_ray_or_point_or_inequality() const; + + void set_necessarily_closed(); + void set_not_necessarily_closed(); + void set_is_line_or_equality(); + void set_is_ray_or_point_or_inequality(); + //@} // Testing and setting the type + + //! Returns true if and only if \p *this and \p y are equal. + bool operator==(const Flags& y) const; + + /*! \brief + Returns true if and only if \p *this and \p y + are different. + */ + bool operator!=(const Flags& 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 true if successful, false otherwise. + */ + bool ascii_load(std::istream& s); + + private: + //! Builds the type from a bit-mask. + explicit Flags(base_type mask); + + //! \name The bits that are currently in use + //@{ + // NB: ascii_load assumes that these are sequential. + static const unsigned rpi_validity_bit + = Row::Flags::first_free_bit + 0; + static const unsigned rpi_bit + = Row::Flags::first_free_bit + 1; + static const unsigned nnc_validity_bit + = Row::Flags::first_free_bit + 2; + static const unsigned nnc_bit + = Row::Flags::first_free_bit + 3; + //@} + + protected: + //! Index of the first bit derived classes can use. + static const unsigned first_free_bit + = Row::Flags::first_free_bit + 4; + + friend class Parma_Polyhedra_Library::Linear_Row; + }; + + //! Pre-constructs a row: construction must be completed by construct(). + Linear_Row(); + + //! \name Post-constructors + //@{ + //! Constructs properly a default-constructed element. + /*! + Builds a row with type \p t, size \p sz and minimum capacity. + */ + void construct(dimension_type sz, Flags f); + + //! Constructs properly a default-constructed element. + /*! + \param sz + The size of the row that will be constructed; + + \param capacity + The minimum capacity of the row that will be constructed. + + \param f + Flags for the row that will be constructed. + + The row that we are constructing has a minimum capacity, i.e., it + can contain at least \p capacity elements, \p sz of which will be + default-constructed now. The row flags are set to \p f. + */ + void construct(dimension_type sz, dimension_type capacity, Flags f); + //@} // Post-constructors + + //! Tight constructor: resizing will require reallocation. + Linear_Row(dimension_type sz, Flags f); + + //! Sizing constructor with capacity. + Linear_Row(dimension_type sz, dimension_type capacity, Flags f); + + //! Ordinary copy constructor. + Linear_Row(const Linear_Row& y); + + //! Copy constructor with specified capacity. + /*! + It is assumed that \p capacity is greater than or equal to \p y size. + */ + Linear_Row(const Linear_Row& y, dimension_type capacity); + + //! Copy constructor with specified size and capacity. + /*! + It is assumed that \p sz is greater than or equal to the size of \p y + and, of course, that \p sz is less than or equal to \p capacity. + */ + Linear_Row(const Linear_Row& y, dimension_type sz, dimension_type capacity); + + //! Destructor. + ~Linear_Row(); + + //! \name Flags inspection methods + //@{ + //! Returns a const reference to the flags of \p *this. + const Flags& flags() const; + + //! Returns a non-const reference to the flags of \p *this. + Flags& flags(); + + //! Returns the topological kind of \p *this. + Topology topology() const; + + /*! \brief + Returns true if and only if the topology + of \p *this row is not necessarily closed. + */ + bool is_not_necessarily_closed() const; + + /*! \brief + Returns true if and only if the topology + of \p *this row is necessarily closed. + */ + bool is_necessarily_closed() const; + + /*! \brief + Returns true if and only if \p *this row + represents a line or an equality. + */ + bool is_line_or_equality() const; + + /*! \brief + Returns true if and only if \p *this row + represents a ray, a point or an inequality. + */ + bool is_ray_or_point_or_inequality() const; + //@} // Flags inspection methods + + //! \name Flags coercion methods + //@{ + //! Sets to \p NECESSARILY_CLOSED the topological kind of \p *this row. + void set_necessarily_closed(); + + //! Sets to \p NOT_NECESSARILY_CLOSED the topological kind of \p *this row. + void set_not_necessarily_closed(); + + //! Sets to \p LINE_OR_EQUALITY the kind of \p *this row. + void set_is_line_or_equality(); + + //! Sets to \p RAY_OR_POINT_OR_INEQUALITY the kind of \p *this row. + void set_is_ray_or_point_or_inequality(); + //@} // Flags coercion methods + + //! Returns the maximum space dimension a Linear_Row can handle. + static dimension_type max_space_dimension(); + + //! Returns the dimension of the vector space enclosing \p *this. + dimension_type space_dimension() const; + + //! Returns the inhomogeneous term. + Coefficient_traits::const_reference inhomogeneous_term() const; + + //! Returns the coefficient \f$a_n\f$. + Coefficient_traits::const_reference coefficient(dimension_type n) const; + + /*! \brief + Normalizes the sign of the coefficients so that the first non-zero + (homogeneous) coefficient of a line-or-equality is positive. + */ + void sign_normalize(); + + /*! \brief + Strong normalization: ensures that different Linear_Row objects + represent different hyperplanes or hyperspaces. + + Applies both Linear_Row::normalize() and Linear_Row::sign_normalize(). + */ + void strong_normalize(); + + /*! \brief + Returns true if and only if the coefficients are + strongly normalized. + */ + bool check_strong_normalized() const; + + //! Linearly combines \p *this with \p y so that *this[k] is 0. + /*! + \param y + The Linear_Row that will be combined with \p *this object; + + \param k + The position of \p *this that have to be \f$0\f$. + + Computes a linear combination of \p *this and \p y having + the element of index \p k equal to \f$0\f$. Then it assigns + the resulting Linear_Row to \p *this and normalizes it. + */ + void linear_combine(const Linear_Row& y, dimension_type k); + + /*! \brief + Returns true if and only if all the homogeneous + terms of \p *this are \f$0\f$. + */ + bool all_homogeneous_terms_are_zero() const; + + PPL_OUTPUT_DECLARATIONS + + /*! \brief + Loads from \p s an ASCII representation (as produced by + ascii_dump(std::ostream&) const) and sets \p *this accordingly. + Returns true if successful, false otherwise. + */ + bool ascii_load(std::istream& s); + + //! Checks if all the invariants are satisfied. + bool OK() const; + + /*! \brief + Checks if all the invariants are satisfied and that the actual + size and capacity match the values provided as arguments. + */ + bool OK(dimension_type row_size, dimension_type row_capacity) const; + +private: + friend class Parma_Polyhedra_Library::Linear_Expression; + friend class Parma_Polyhedra_Library::Constraint; + friend class Parma_Polyhedra_Library::Generator; +}; + +namespace Parma_Polyhedra_Library { + +//! Returns true if and only if \p x and \p y are equal. +/*! \relates Linear_Row */ +bool operator==(const Linear_Row& x, const Linear_Row& y); + +//! Returns true if and only if \p x and \p y are different. +/*! \relates Linear_Row */ +bool operator!=(const Linear_Row& x, const Linear_Row& y); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! The basic comparison function. +/*! \relates Linear_Row + \return + The returned absolute value can be \f$0\f$, \f$1\f$ or \f$2\f$. + + \param x + A row of coefficients; + + \param y + Another row. + + Compares \p x and \p y, where \p x and \p y may be of different size, + in which case the "missing" coefficients are assumed to be zero. + The comparison is such that: + -# equalities are smaller than inequalities; + -# lines are smaller than points and rays; + -# the ordering is lexicographic; + -# the positions compared are, in decreasing order of significance, + 1, 2, ..., \p size(), 0; + -# the result is negative, zero, or positive if x is smaller than, + equal to, or greater than y, respectively; + -# when \p x and \p y are different, the absolute value of the + result is 1 if the difference is due to the coefficient in + position 0; it is 2 otherwise. + + When \p x and \p y represent the hyper-planes associated + to two equality or inequality constraints, the coefficient + at 0 is the known term. + In this case, the return value can be characterized as follows: + - -2, if \p x is smaller than \p y and they are \e not parallel; + - -1, if \p x is smaller than \p y and they \e are parallel; + - 0, if \p x and y are equal; + - +1, if \p y is smaller than \p x and they \e are parallel; + - +2, if \p y is smaller than \p x and they are \e not parallel. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +int compare(const Linear_Row& x, const Linear_Row& y); + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Linear_Row */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +void swap(Parma_Polyhedra_Library::Linear_Row& x, + Parma_Polyhedra_Library::Linear_Row& y); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specializes std::iter_swap. +/*! \relates Parma_Polyhedra_Library::Linear_Row */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +void iter_swap(std::vector::iterator x, + std::vector::iterator y); + +} // namespace std + +#include "Linear_Row.inlines.hh" + +#endif // !defined(PPL_Linear_Row_defs_hh) diff --git a/src/Linear_Row.inlines.hh b/src/Linear_Row.inlines.hh new file mode 100644 index 0000000..f9d1899 --- /dev/null +++ b/src/Linear_Row.inlines.hh @@ -0,0 +1,290 @@ +/* Linear_Row class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Linear_Row_inlines_hh +#define PPL_Linear_Row_inlines_hh 1 + +#include "globals.defs.hh" +#include +#include + +namespace Parma_Polyhedra_Library { + +inline +Linear_Row::Flags::Flags() + : Row::Flags() { + // Note that the constructed type has its validity bit unset. +} + +inline +Linear_Row::Flags::Flags(const Topology t) + : Row::Flags(t << nnc_bit) { +#ifndef NDEBUG + set_bits(1 << nnc_validity_bit); +#endif +} + +inline +Linear_Row::Flags::Flags(const Topology t, const Kind k) + : Row::Flags((k << rpi_bit) | (t << nnc_bit)) { +#ifndef NDEBUG + set_bits((1 << rpi_validity_bit) + | (1 << nnc_validity_bit)); +#endif +} + +inline bool +Linear_Row::Flags::is_ray_or_point_or_inequality() const { + assert(test_bits(1 << rpi_validity_bit)); + return test_bits(RAY_OR_POINT_OR_INEQUALITY << rpi_bit); +} + +inline void +Linear_Row::Flags::set_is_ray_or_point_or_inequality() { +#ifndef NDEBUG + set_bits(1 << rpi_validity_bit); +#endif + set_bits(RAY_OR_POINT_OR_INEQUALITY << rpi_bit); +} + +inline bool +Linear_Row::Flags::is_line_or_equality() const { + assert(test_bits(1 << rpi_validity_bit)); + return !is_ray_or_point_or_inequality(); +} + +inline void +Linear_Row::Flags::set_is_line_or_equality() { +#ifndef NDEBUG + set_bits(1 << rpi_validity_bit); +#endif + reset_bits(RAY_OR_POINT_OR_INEQUALITY << rpi_bit); +} + +inline bool +Linear_Row::Flags::is_not_necessarily_closed() const { + assert(test_bits(1 << nnc_validity_bit)); + return test_bits(NOT_NECESSARILY_CLOSED << nnc_bit); +} + +inline bool +Linear_Row::Flags::is_necessarily_closed() const { + assert(test_bits(1 << nnc_validity_bit)); + return !is_not_necessarily_closed(); +} + +inline void +Linear_Row::Flags::set_not_necessarily_closed() { +#ifndef NDEBUG + set_bits(1 << nnc_validity_bit); +#endif + set_bits(NOT_NECESSARILY_CLOSED << nnc_bit); +} + +inline void +Linear_Row::Flags::set_necessarily_closed() { +#ifndef NDEBUG + set_bits(1 << nnc_validity_bit); +#endif + reset_bits(NOT_NECESSARILY_CLOSED << nnc_bit); +} + +inline Topology +Linear_Row::Flags::topology() const { + return is_necessarily_closed() ? NECESSARILY_CLOSED : NOT_NECESSARILY_CLOSED; +} + +inline bool +Linear_Row::Flags::operator==(const Flags& y) const { + base_type mask = low_bits_mask(first_free_bit); + return (get_bits() & mask) == (y.get_bits() & mask); +} + +inline bool +Linear_Row::Flags::operator!=(const Flags& y) const { + return !operator==(y); +} + +inline const Linear_Row::Flags& +Linear_Row::flags() const { + return static_cast(Row::flags()); +} + +inline Linear_Row::Flags& +Linear_Row::flags() { + return static_cast(Row::flags()); +} + +inline bool +Linear_Row::is_necessarily_closed() const { + return flags().is_necessarily_closed(); +} + +inline dimension_type +Linear_Row::max_space_dimension() { + // The first coefficient holds the inhomogeneous term or the divisor. + // In NNC rows, the last coefficient is for the epsilon dimension. + return max_size() - 2; +} + +inline dimension_type +Linear_Row::space_dimension() const { + const dimension_type sz = size(); + return (sz == 0) + ? 0 + : sz - (is_necessarily_closed() ? 1 : 2); +} + +inline +Linear_Row::Linear_Row() + : Row() { +} + +inline void +Linear_Row::construct(const dimension_type sz, const dimension_type capacity, + const Flags f) { + Row::construct(sz, capacity, f); +} + +inline +Linear_Row::Linear_Row(const dimension_type sz, const dimension_type capacity, + const Flags f) { + construct(sz, capacity, f); +} + +inline void +Linear_Row::construct(const dimension_type sz, const Flags f) { + construct(sz, sz, f); +} + +inline +Linear_Row::Linear_Row(const dimension_type sz, const Flags f) { + construct(sz, f); +} + +inline +Linear_Row::Linear_Row(const Linear_Row& y) + : Row(y) { +} + +inline +Linear_Row::Linear_Row(const Linear_Row& y, + const dimension_type capacity) + : Row(y, capacity) { +} + +inline +Linear_Row::Linear_Row(const Linear_Row& y, + const dimension_type sz, const dimension_type capacity) + : Row(y, sz, capacity) { +} + +inline +Linear_Row::~Linear_Row() { +} + +inline bool +Linear_Row::is_line_or_equality() const { + return flags().is_line_or_equality(); +} + +inline bool +Linear_Row::is_ray_or_point_or_inequality() const { + return flags().is_ray_or_point_or_inequality(); +} + +inline Topology +Linear_Row::topology() const { + return flags().topology(); +} + +inline void +Linear_Row::set_is_line_or_equality() { + flags().set_is_line_or_equality(); +} + +inline void +Linear_Row::set_is_ray_or_point_or_inequality() { + flags().set_is_ray_or_point_or_inequality(); +} + +inline void +Linear_Row::set_necessarily_closed() { + flags().set_necessarily_closed(); +} + +inline void +Linear_Row::set_not_necessarily_closed() { + flags().set_not_necessarily_closed(); +} + +inline Coefficient_traits::const_reference +Linear_Row::inhomogeneous_term() const { + return (*this)[0]; +} + +inline Coefficient_traits::const_reference +Linear_Row::coefficient(const dimension_type k) const { + return (*this)[k+1]; +} + +inline void +Linear_Row::strong_normalize() { + normalize(); + sign_normalize(); +} + +/*! \relates Linear_Row */ +inline bool +operator==(const Linear_Row& x, const Linear_Row& y) { + return x.flags() == y.flags() + && static_cast(x) == static_cast(y); +} + +/*! \relates Linear_Row */ +inline bool +operator!=(const Linear_Row& x, const Linear_Row& y) { + return !(x == y); +} + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Linear_Row */ +inline void +swap(Parma_Polyhedra_Library::Linear_Row& x, + Parma_Polyhedra_Library::Linear_Row& y) { + x.swap(y); +} + +/*! \relates Parma_Polyhedra_Library::Linear_Row */ +inline void +iter_swap(std::vector::iterator x, + std::vector::iterator y) { + swap(*x, *y); +} + +} // namespace std + +#endif // !defined(PPL_Linear_Row_inlines_hh) diff --git a/src/Linear_Row.types.hh b/src/Linear_Row.types.hh new file mode 100644 index 0000000..2ea7dde --- /dev/null +++ b/src/Linear_Row.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PPL_Linear_Row_types_hh +#define PPL_Linear_Row_types_hh 1 + +namespace Parma_Polyhedra_Library { + +class Linear_Row; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Linear_Row_types_hh) diff --git a/src/Linear_System.cc b/src/Linear_System.cc new file mode 100644 index 0000000..f5e651d --- /dev/null +++ b/src/Linear_System.cc @@ -0,0 +1,920 @@ +/* Linear_System class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Linear_System.defs.hh" +#include "Coefficient.defs.hh" +#include "Row.defs.hh" +#include "Bit_Matrix.defs.hh" +#include "Scalar_Products.defs.hh" +#include +#include +#include +#include + +#include "swapping_sort.icc" + +namespace PPL = Parma_Polyhedra_Library; + +PPL::dimension_type +PPL::Linear_System::num_lines_or_equalities() const { + assert(num_pending_rows() == 0); + const Linear_System& x = *this; + dimension_type n = 0; + for (dimension_type i = num_rows(); i-- > 0; ) + if (x[i].is_line_or_equality()) + ++n; + return n; +} + +void +PPL::Linear_System::merge_rows_assign(const Linear_System& y) { + assert(row_size >= y.row_size); + // Both systems have to be sorted and have no pending rows. + assert(check_sorted() && y.check_sorted()); + assert(num_pending_rows() == 0 && y.num_pending_rows() == 0); + + Linear_System& x = *this; + + // A temporary vector of rows... + std::vector tmp; + // ... with enough capacity not to require any reallocations. + tmp.reserve(compute_capacity(x.num_rows() + y.num_rows(), max_num_rows())); + + dimension_type xi = 0; + dimension_type x_num_rows = x.num_rows(); + dimension_type yi = 0; + dimension_type y_num_rows = y.num_rows(); + + while (xi < x_num_rows && yi < y_num_rows) { + const int comp = compare(x[xi], y[yi]); + if (comp <= 0) { + // Elements that can be taken from `x' are actually _stolen_ from `x' + std::swap(x[xi++], *tmp.insert(tmp.end(), Linear_Row())); + if (comp == 0) + // A duplicate element. + ++yi; + } + else { + // (comp > 0) + Linear_Row copy(y[yi++], row_size, row_capacity); + std::swap(copy, *tmp.insert(tmp.end(), Linear_Row())); + } + } + // Insert what is left. + if (xi < x_num_rows) + while (xi < x_num_rows) + std::swap(x[xi++], *tmp.insert(tmp.end(), Linear_Row())); + else + while (yi < y_num_rows) { + Linear_Row copy(y[yi++], row_size, row_capacity); + std::swap(copy, *tmp.insert(tmp.end(), Linear_Row())); + } + + // We get the result vector and let the old one be destroyed. + std::swap(tmp, rows); + // There are no pending rows. + unset_pending_rows(); + assert(check_sorted()); +} + +void +PPL::Linear_System::set_rows_topology() { + Linear_System& x = *this; + if (is_necessarily_closed()) + for (dimension_type i = num_rows(); i-- > 0; ) + x[i].set_necessarily_closed(); + else + for (dimension_type i = num_rows(); i-- > 0; ) + x[i].set_not_necessarily_closed(); +} + +void +PPL::Linear_System::ascii_dump(std::ostream& s) const { + // Prints the topology, the number of rows, the number of columns + // and the sorted flag. The specialized methods provided by + // Constraint_System and Generator_System take care of properly + // printing the contents of the system. + const Linear_System& x = *this; + dimension_type x_num_rows = x.num_rows(); + dimension_type x_num_columns = x.num_columns(); + s << "topology " << (is_necessarily_closed() + ? "NECESSARILY_CLOSED" + : "NOT_NECESSARILY_CLOSED") + << "\n" + << x_num_rows << " x " << x_num_columns + << (x.sorted ? "(sorted)" : "(not_sorted)") + << "\n" + << "index_first_pending " << x.first_pending_row() + << "\n"; + for (dimension_type i = 0; i < x_num_rows; ++i) + x[i].ascii_dump(s); +} + +PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Linear_System) + +bool +PPL::Linear_System::ascii_load(std::istream& s) { + std::string str; + if (!(s >> str) || str != "topology") + return false; + if (!(s >> str)) + return false; + if (str == "NECESSARILY_CLOSED") + set_necessarily_closed(); + else { + if (str != "NOT_NECESSARILY_CLOSED") + return false; + set_not_necessarily_closed(); + } + + dimension_type nrows; + dimension_type ncols; + if (!(s >> nrows)) + return false; + if (!(s >> str) || str != "x") + return false; + if (!(s >> ncols)) + return false; + resize_no_copy(nrows, ncols); + + if (!(s >> str) || (str != "(sorted)" && str != "(not_sorted)")) + return false; + set_sorted(str == "(sorted)"); + dimension_type index; + if (!(s >> str) || str != "index_first_pending") + return false; + if (!(s >> index)) + return false; + set_index_first_pending_row(index); + + Linear_System& x = *this; + for (dimension_type row = 0; row < nrows; ++row) + if (!x[row].ascii_load(s)) + return false; + + // Check invariants. + assert(OK(true)); + return true; +} + +void +PPL::Linear_System::insert(const Linear_Row& r) { + // The added row must be strongly normalized and have the same + // topology of the system. + assert(r.check_strong_normalized()); + assert(topology() == r.topology()); + // This method is only used when the system has no pending rows. + assert(num_pending_rows() == 0); + + const dimension_type old_num_rows = num_rows(); + const dimension_type old_num_columns = num_columns(); + const dimension_type r_size = r.size(); + + // Resize the system, if necessary. + if (r_size > old_num_columns) { + add_zero_columns(r_size - old_num_columns); + if (!is_necessarily_closed() && old_num_rows != 0) + // Move the epsilon coefficients to the last column + // (note: sorting is preserved). + swap_columns(old_num_columns - 1, r_size - 1); + add_row(r); + } + else if (r_size < old_num_columns) { + // Create a resized copy of the row. + Linear_Row tmp_row(r, old_num_columns, row_capacity); + // If needed, move the epsilon coefficient to the last position. + if (!is_necessarily_closed()) + std::swap(tmp_row[r_size - 1], tmp_row[old_num_columns - 1]); + add_row(tmp_row); + } + else + // Here r_size == old_num_columns. + add_row(r); + + // The added row was not a pending row. + assert(num_pending_rows() == 0); + // Do not check for strong normalization, + // because no modification of rows has occurred. + assert(OK(false)); +} + +void +PPL::Linear_System::insert_pending(const Linear_Row& r) { + // The added row must be strongly normalized and have the same + // topology of the system. + assert(r.check_strong_normalized()); + assert(topology() == r.topology()); + + const dimension_type old_num_rows = num_rows(); + const dimension_type old_num_columns = num_columns(); + const dimension_type r_size = r.size(); + + // Resize the system, if necessary. + if (r_size > old_num_columns) { + add_zero_columns(r_size - old_num_columns); + if (!is_necessarily_closed() && old_num_rows != 0) + // Move the epsilon coefficients to the last column + // (note: sorting is preserved). + swap_columns(old_num_columns - 1, r_size - 1); + add_pending_row(r); + } + else if (r_size < old_num_columns) + if (is_necessarily_closed() || old_num_rows == 0) + add_pending_row(Linear_Row(r, old_num_columns, row_capacity)); + else { + // Create a resized copy of the row (and move the epsilon + // coefficient to its last position). + Linear_Row tmp_row(r, old_num_columns, row_capacity); + std::swap(tmp_row[r_size - 1], tmp_row[old_num_columns - 1]); + add_pending_row(tmp_row); + } + else + // Here r_size == old_num_columns. + add_pending_row(r); + + // The added row was a pending row. + assert(num_pending_rows() > 0); + // Do not check for strong normalization, + // because no modification of rows has occurred. + assert(OK(false)); +} + +void +PPL::Linear_System::add_pending_rows(const Linear_System& y) { + Linear_System& x = *this; + assert(x.row_size == y.row_size); + + const dimension_type x_n_rows = x.num_rows(); + const dimension_type y_n_rows = y.num_rows(); + // Grow to the required size without changing sortedness. + const bool was_sorted = sorted; + add_zero_rows(y_n_rows, Linear_Row::Flags(row_topology)); + sorted = was_sorted; + + // Copy the rows of `y', forcing size and capacity. + for (dimension_type i = y_n_rows; i-- > 0; ) { + Row copy(y[i], x.row_size, x.row_capacity); + std::swap(copy, x[x_n_rows+i]); + } + // Do not check for strong normalization, + // because no modification of rows has occurred. + assert(OK(false)); +} + +void +PPL::Linear_System::add_rows(const Linear_System& y) { + assert(num_pending_rows() == 0); + + // Adding no rows is a no-op. + if (y.has_no_rows()) + return; + + // Check if sortedness is preserved. + if (is_sorted()) { + if (!y.is_sorted() || y.num_pending_rows() > 0) + set_sorted(false); + else { + // `y' is sorted and has no pending rows. + const dimension_type n_rows = num_rows(); + if (n_rows > 0) + set_sorted(compare((*this)[n_rows-1], y[0]) <= 0); + } + } + + // Add the rows of `y' as if they were pending. + add_pending_rows(y); + // There are no pending_rows. + unset_pending_rows(); + + // Do not check for strong normalization, + // because no modification of rows has occurred. + assert(OK(false)); +} + +void +PPL::Linear_System::sort_rows() { + const dimension_type num_pending = num_pending_rows(); + // We sort the non-pending rows only. + sort_rows(0, first_pending_row()); + set_index_first_pending_row(num_rows() - num_pending); + sorted = true; + // Do not check for strong normalization, + // because no modification of rows has occurred. + assert(OK(false)); +} + +void +PPL::Linear_System::sort_rows(const dimension_type first_row, + const dimension_type last_row) { + assert(first_row <= last_row && last_row <= num_rows()); + // We cannot mix pending and non-pending rows. + assert(first_row >= first_pending_row() || last_row <= first_pending_row()); + + // First sort without removing duplicates. + std::vector::iterator first = rows.begin() + first_row; + std::vector::iterator last = rows.begin() + last_row; + swapping_sort(first, last, Row_Less_Than()); + // Second, move duplicates to the end. + std::vector::iterator new_last = swapping_unique(first, last); + // Finally, remove duplicates. + rows.erase(new_last, last); + // NOTE: we cannot check all invariants of the system here, + // because the caller still has to update `index_first_pending'. +} + +void +PPL::Linear_System::add_row(const Linear_Row& r) { + // The added row must be strongly normalized and have the same + // number of elements as the existing rows of the system. + assert(r.check_strong_normalized()); + assert(r.size() == row_size); + // This method is only used when the system has no pending rows. + assert(num_pending_rows() == 0); + + const bool was_sorted = is_sorted(); + + Matrix::add_row(r); + + // We update `index_first_pending', because it must be equal to + // `num_rows()'. + set_index_first_pending_row(num_rows()); + + if (was_sorted) { + const dimension_type nrows = num_rows(); + // The added row may have caused the system to be not sorted anymore. + if (nrows > 1) { + // If the system is not empty and the inserted row is the + // greatest one, the system is set to be sorted. + // If it is not the greatest one then the system is no longer sorted. + Linear_System& x = *this; + set_sorted(compare(x[nrows-2], x[nrows-1]) <= 0); + } + else + // A system having only one row is sorted. + set_sorted(true); + } + // The added row was not a pending row. + assert(num_pending_rows() == 0); + // Do not check for strong normalization, because no modification of + // rows has occurred. + assert(OK(false)); +} + +void +PPL::Linear_System::add_pending_row(const Linear_Row& r) { + // The added row must be strongly normalized and have the same + // number of elements of the existing rows of the system. + assert(r.check_strong_normalized()); + assert(r.size() == row_size); + + const dimension_type new_rows_size = rows.size() + 1; + if (rows.capacity() < new_rows_size) { + // Reallocation will take place. + std::vector new_rows; + new_rows.reserve(compute_capacity(new_rows_size, max_num_rows())); + new_rows.insert(new_rows.end(), new_rows_size, Row()); + // Put the new row in place. + Row new_row(r, row_capacity); + dimension_type i = new_rows_size-1; + std::swap(new_rows[i], new_row); + // Steal the old rows. + while (i-- > 0) + new_rows[i].swap(rows[i]); + // Put the new rows into place. + std::swap(rows, new_rows); + } + else { + // Reallocation will NOT take place. + // Inserts a new empty row at the end, then substitutes it with a + // copy of the given row. + Row tmp(r, row_capacity); + std::swap(*rows.insert(rows.end(), Row()), tmp); + } + + // The added row was a pending row. + assert(num_pending_rows() > 0); + // Do not check for strong normalization, because no modification of + // rows has occurred. + assert(OK(false)); +} + +void +PPL::Linear_System::add_pending_row(const Linear_Row::Flags flags) { + const dimension_type new_rows_size = rows.size() + 1; + if (rows.capacity() < new_rows_size) { + // Reallocation will take place. + std::vector new_rows; + new_rows.reserve(compute_capacity(new_rows_size, max_num_rows())); + new_rows.insert(new_rows.end(), new_rows_size, Row()); + // Put the new row in place. + Linear_Row new_row(row_size, row_capacity, flags); + dimension_type i = new_rows_size-1; + std::swap(new_rows[i], new_row); + // Steal the old rows. + while (i-- > 0) + new_rows[i].swap(rows[i]); + // Put the new vector into place. + std::swap(rows, new_rows); + } + else { + // Reallocation will NOT take place. + // Insert a new empty row at the end, then construct it assigning + // it the given type. + Row& new_row = *rows.insert(rows.end(), Row()); + static_cast(new_row).construct(row_size, row_capacity, flags); + } + + // The added row was a pending row. + assert(num_pending_rows() > 0); +} + +void +PPL::Linear_System::normalize() { + Linear_System& x = *this; + const dimension_type nrows = x.num_rows(); + // We normalize also the pending rows. + for (dimension_type i = nrows; i-- > 0; ) + x[i].normalize(); + set_sorted(nrows <= 1); +} + +void +PPL::Linear_System::strong_normalize() { + Linear_System& x = *this; + const dimension_type nrows = x.num_rows(); + // We strongly normalize also the pending rows. + for (dimension_type i = nrows; i-- > 0; ) + x[i].strong_normalize(); + set_sorted(nrows <= 1); +} + +void +PPL::Linear_System::sign_normalize() { + Linear_System& x = *this; + const dimension_type nrows = x.num_rows(); + // We sign-normalize also the pending rows. + for (dimension_type i = num_rows(); i-- > 0; ) + x[i].sign_normalize(); + set_sorted(nrows <= 1); +} + +/*! \relates Parma_Polyhedra_Library::Linear_System */ +bool +PPL::operator==(const Linear_System& x, const Linear_System& y) { + if (x.num_columns() != y.num_columns()) + return false; + const dimension_type x_num_rows = x.num_rows(); + const dimension_type y_num_rows = y.num_rows(); + if (x_num_rows != y_num_rows) + return false; + if (x.first_pending_row() != y.first_pending_row()) + return false; + // Notice that calling operator==(const Matrix&, const Matrix&) + // would be wrong here, as equality of the type fields would + // not be checked. + for (dimension_type i = x_num_rows; i-- > 0; ) + if (x[i] != y[i]) + return false; + return true; +} + +void +PPL::Linear_System::sort_and_remove_with_sat(Bit_Matrix& sat) { + Linear_System& sys = *this; + // We can only sort the non-pending part of the system. + assert(sys.first_pending_row() == sat.num_rows()); + if (sys.first_pending_row() <= 1) { + sys.set_sorted(true); + return; + } + + // First, sort `sys' (keeping `sat' consistent) without removing duplicates. + With_Bit_Matrix_iterator first(sys.rows.begin(), sat.rows.begin()); + With_Bit_Matrix_iterator last = first + sat.num_rows(); + swapping_sort(first, last, Row_Less_Than()); + // Second, move duplicates in `sys' to the end (keeping `sat' consistent). + With_Bit_Matrix_iterator new_last = swapping_unique(first, last); + + const dimension_type num_duplicates = last - new_last; + const dimension_type new_first_pending_row + = sys.first_pending_row() - num_duplicates; + + if (sys.num_pending_rows() > 0) { + // In this case, we must put the duplicates after the pending rows. + const dimension_type n_rows = sys.num_rows() - 1; + for (dimension_type i = 0; i < num_duplicates; ++i) + std::swap(sys[new_first_pending_row + i], sys[n_rows - i]); + } + // Erasing the duplicated rows... + sys.erase_to_end(sys.num_rows() - num_duplicates); + sys.set_index_first_pending_row(new_first_pending_row); + // ... and the corresponding rows of the saturation matrix. + sat.rows_erase_to_end(sat.num_rows() - num_duplicates); + assert(sys.check_sorted()); + // Now the system is sorted. + sys.set_sorted(true); +} + +PPL::dimension_type +PPL::Linear_System::gauss(const dimension_type n_lines_or_equalities) { + Linear_System& x = *this; + // This method is only applied to a well-formed linear system + // having no pending rows and exactly `n_lines_or_equalities' + // lines or equalities, all of which occur before the rays or points + // or inequalities. + assert(x.OK(true)); + assert(x.num_pending_rows() == 0); + assert(n_lines_or_equalities == x.num_lines_or_equalities()); +#ifndef NDEBUG + for (dimension_type i = n_lines_or_equalities; i-- > 0; ) + assert(x[i].is_line_or_equality()); +#endif + + dimension_type rank = 0; + // Will keep track of the variations on the system of equalities. + bool changed = false; + for (dimension_type j = x.num_columns(); j-- > 0; ) + for (dimension_type i = rank; i < n_lines_or_equalities; ++i) { + // Search for the first row having a non-zero coefficient + // (the pivot) in the j-th column. + if (x[i][j] == 0) + continue; + // Pivot found: if needed, swap rows so that this one becomes + // the rank-th row in the linear system. + if (i > rank) { + std::swap(x[i], x[rank]); + // After swapping the system is no longer sorted. + changed = true; + } + // Combine the row containing the pivot with all the lines or + // equalities following it, so that all the elements on the j-th + // column in these rows become 0. + for (dimension_type k = i + 1; k < n_lines_or_equalities; ++k) + if (x[k][j] != 0) { + x[k].linear_combine(x[rank], j); + changed = true; + } + // Already dealt with the rank-th row. + ++rank; + // Consider another column index `j'. + break; + } + if (changed) + x.set_sorted(false); + // A well-formed system is returned. + assert(x.OK(true)); + return rank; +} + +void +PPL::Linear_System +::back_substitute(const dimension_type n_lines_or_equalities) { + Linear_System& x = *this; + // This method is only applied to a well-formed system + // having no pending rows and exactly `n_lines_or_equalities' + // lines or equalities, all of which occur before the first ray + // or point or inequality. + assert(x.OK(true)); + assert(x.num_columns() >= 1); + assert(x.num_pending_rows() == 0); + assert(n_lines_or_equalities <= x.num_lines_or_equalities()); +#ifndef NDEBUG + for (dimension_type i = n_lines_or_equalities; i-- > 0; ) + assert(x[i].is_line_or_equality()); +#endif + + const dimension_type nrows = x.num_rows(); + const dimension_type ncols = x.num_columns(); + // Trying to keep sortedness. + bool still_sorted = x.is_sorted(); + // This deque of Booleans will be used to flag those rows that, + // before exiting, need to be re-checked for sortedness. + std::deque check_for_sortedness; + if (still_sorted) + check_for_sortedness.insert(check_for_sortedness.end(), nrows, false); + + for (dimension_type k = n_lines_or_equalities; k-- > 0; ) { + // For each line or equality, starting from the last one, + // looks for the last non-zero element. + // `j' will be the index of such a element. + Linear_Row& x_k = x[k]; + dimension_type j = ncols - 1; + while (j != 0 && x_k[j] == 0) + --j; + + // Go through the equalities above `x_k'. + for (dimension_type i = k; i-- > 0; ) { + Linear_Row& x_i = x[i]; + if (x_i[j] != 0) { + // Combine linearly `x_i' with `x_k' + // so that `x_i[j]' becomes zero. + x_i.linear_combine(x_k, j); + if (still_sorted) { + // Trying to keep sortedness: remember which rows + // have to be re-checked for sortedness at the end. + if (i > 0) + check_for_sortedness[i-1] = true; + check_for_sortedness[i] = true; + } + } + } + + // Due to strong normalization during previous iterations, + // the pivot coefficient `x_k[j]' may now be negative. + // Since an inequality (or ray or point) cannot be multiplied + // by a negative factor, the coefficient of the pivot must be + // forced to be positive. + const bool have_to_negate = (x_k[j] < 0); + if (have_to_negate) + for (dimension_type h = ncols; h-- > 0; ) + PPL::neg_assign(x_k[h]); + // Note: we do not mark index `k' in `check_for_sortedness', + // because we will later negate back the row. + + // Go through all the other rows of the system. + for (dimension_type i = n_lines_or_equalities; i < nrows; ++i) { + Linear_Row& x_i = x[i]; + if (x_i[j] != 0) { + // Combine linearly the `x_i' with `x_k' + // so that `x_i[j]' becomes zero. + x_i.linear_combine(x_k, j); + if (still_sorted) { + // Trying to keep sortedness: remember which rows + // have to be re-checked for sortedness at the end. + if (i > n_lines_or_equalities) + check_for_sortedness[i-1] = true; + check_for_sortedness[i] = true; + } + } + } + if (have_to_negate) + // Negate `x_k' to restore strong-normalization. + for (dimension_type h = ncols; h-- > 0; ) + PPL::neg_assign(x_k[h]); + } + + // Trying to keep sortedness. + for (dimension_type i = 0; still_sorted && i+1 < nrows; ++i) + if (check_for_sortedness[i]) + // Have to check sortedness of `x[i]' with respect to `x[i+1]'. + still_sorted = (compare(x[i], x[i+1]) <= 0); + // Set the sortedness flag. + x.set_sorted(still_sorted); + + // A well-formed system is returned. + assert(x.OK(true)); +} + +void +PPL::Linear_System::simplify() { + Linear_System& x = *this; + // This method is only applied to a well-formed system + // having no pending rows. + assert(x.OK(true)); + assert(x.num_pending_rows() == 0); + + // Partially sort the linear system so that all lines/equalities come first. + dimension_type nrows = x.num_rows(); + dimension_type n_lines_or_equalities = 0; + for (dimension_type i = 0; i < nrows; ++i) + if (x[i].is_line_or_equality()) { + if (n_lines_or_equalities < i) { + std::swap(x[i], x[n_lines_or_equalities]); + // The system was not sorted. + assert(!x.sorted); + } + ++n_lines_or_equalities; + } + // Apply Gaussian elimination to the subsystem of lines/equalities. + const dimension_type rank = x.gauss(n_lines_or_equalities); + // Eliminate any redundant line/equality that has been detected. + if (rank < n_lines_or_equalities) { + const dimension_type + n_rays_or_points_or_inequalities = nrows - n_lines_or_equalities; + const dimension_type + num_swaps = std::min(n_lines_or_equalities - rank, + n_rays_or_points_or_inequalities); + for (dimension_type i = num_swaps; i-- > 0; ) + std::swap(x[--nrows], x[rank + i]); + x.erase_to_end(nrows); + x.unset_pending_rows(); + if (n_rays_or_points_or_inequalities > num_swaps) + x.set_sorted(false); + n_lines_or_equalities = rank; + } + // Apply back-substitution to the system of rays/points/inequalities. + x.back_substitute(n_lines_or_equalities); + // A well-formed system is returned. + assert(x.OK(true)); +} + +void +PPL::Linear_System::add_rows_and_columns(const dimension_type n) { + assert(n > 0); + const bool was_sorted = is_sorted(); + const dimension_type old_n_rows = num_rows(); + const dimension_type old_n_columns = num_columns(); + add_zero_rows_and_columns(n, n, Linear_Row::Flags(row_topology)); + Linear_System& x = *this; + // The old system is moved to the bottom. + for (dimension_type i = old_n_rows; i-- > 0; ) + std::swap(x[i], x[i + n]); + for (dimension_type i = n, c = old_n_columns; i-- > 0; ) { + // The top right-hand sub-system (i.e., the system made of new + // rows and columns) is set to the specular image of the identity + // matrix. + Linear_Row& r = x[i]; + r[c++] = 1; + r.set_is_line_or_equality(); + // Note: `r' is strongly normalized. + } + // If the old system was empty, the last row added is either + // a positivity constraint or a point. + if (old_n_columns == 0) { + x[n-1].set_is_ray_or_point_or_inequality(); + // Since ray, points and inequalities come after lines + // and equalities, this case implies the system is sorted. + set_sorted(true); + } + else if (was_sorted) + set_sorted(compare(x[n-1], x[n]) <= 0); + + // A well-formed system has to be returned. + assert(OK(true)); +} + +void +PPL::Linear_System::sort_pending_and_remove_duplicates() { + assert(num_pending_rows() > 0); + assert(is_sorted()); + Linear_System& x = *this; + + // The non-pending part of the system is already sorted. + // Now sorting the pending part.. + const dimension_type first_pending = x.first_pending_row(); + x.sort_rows(first_pending, x.num_rows()); + // Recompute the number of rows, because we may have removed + // some rows occurring more than once in the pending part. + dimension_type num_rows = x.num_rows(); + + dimension_type k1 = 0; + dimension_type k2 = first_pending; + dimension_type num_duplicates = 0; + // In order to erase them, put at the end of the system + // those pending rows that also occur in the non-pending part. + while (k1 < first_pending && k2 < num_rows) { + const int cmp = compare(x[k1], x[k2]); + if (cmp == 0) { + // We found the same row. + ++num_duplicates; + --num_rows; + // By initial sortedness, we can increment index `k1'. + ++k1; + // Do not increment `k2'; instead, swap there the next pending row. + if (k2 < num_rows) + std::swap(x[k2], x[k2 + num_duplicates]); + } + else if (cmp < 0) + // By initial sortedness, we can increment `k1'. + ++k1; + else { + // Here `cmp > 0'. + // Increment `k2' and, if we already found any duplicate, + // swap the next pending row in position `k2'. + ++k2; + if (num_duplicates > 0 && k2 < num_rows) + std::swap(x[k2], x[k2 + num_duplicates]); + } + } + // If needed, swap any duplicates found past the pending rows + // that has not been considered yet; then erase the duplicates. + if (num_duplicates > 0) { + if (k2 < num_rows) + for (++k2; k2 < num_rows; ++k2) + std::swap(x[k2], x[k2 + num_duplicates]); + x.erase_to_end(num_rows); + } + // Do not check for strong normalization, + // because no modification of rows has occurred. + assert(OK(false)); +} + +bool +PPL::Linear_System::check_sorted() const { + const Linear_System& x = *this; + for (dimension_type i = first_pending_row(); i-- > 1; ) + if (compare(x[i], x[i-1]) < 0) + return false; + return true; +} + +bool +PPL::Linear_System::OK(const bool check_strong_normalized) const { +#ifndef NDEBUG + using std::endl; + using std::cerr; +#endif + + // `index_first_pending' must be less than or equal to `num_rows()'. + if (first_pending_row() > num_rows()) { +#ifndef NDEBUG + cerr << "Linear_System has a negative number of pending rows!" + << endl; +#endif + return false; + } + + // An empty system is OK, + // unless it is an NNC system with exactly one column. + if (has_no_rows()) { + if (is_necessarily_closed() || num_columns() != 1) + return true; + else { +#ifndef NDEBUG + cerr << "NNC Linear_System has one column" << endl; +#endif + return false; + } + } + + // A non-empty system will contain constraints or generators; in + // both cases it must have at least one column for the inhomogeneous + // term and, if it is NNC, another one for the epsilon coefficient. + const dimension_type min_cols = is_necessarily_closed() ? 1 : 2; + if (num_columns() < min_cols) { +#ifndef NDEBUG + cerr << "Linear_System has fewer columns than the minimum " + << "allowed by its topology:" + << endl + << "num_columns is " << num_columns() + << ", minimum is " << min_cols + << endl; +#endif + return false; + } + + const Linear_System& x = *this; + const dimension_type n_rows = num_rows(); + for (dimension_type i = 0; i < n_rows; ++i) { + if (!x[i].OK(row_size, row_capacity)) + return false; + // Checking for topology mismatches. + if (x.topology() != x[i].topology()) { +#ifndef NDEBUG + cerr << "Topology mismatch between the system " + << "and one of its rows!" + << endl; +#endif + return false; + } + } + + if (check_strong_normalized) { + // Check for strong normalization of rows. + // Note: normalization cannot be checked inside the + // Linear_Row::OK() method, because a Linear_Row object may also + // implement a Linear_Expression object, which in general cannot + // be (strongly) normalized. + Linear_System tmp(x, With_Pending()); + tmp.strong_normalize(); + if (x != tmp) { +#ifndef NDEBUG + cerr << "Linear_System rows are not strongly normalized!" + << endl; +#endif + return false; + } + } + + if (sorted && !check_sorted()) { +#ifndef NDEBUG + cerr << "The system declares itself to be sorted but it is not!" + << endl; +#endif + return false; + } + + // All checks passed. + return true; +} diff --git a/src/Linear_System.defs.hh b/src/Linear_System.defs.hh new file mode 100644 index 0000000..6a798f2 --- /dev/null +++ b/src/Linear_System.defs.hh @@ -0,0 +1,516 @@ +/* Linear_System class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Linear_System_defs_hh +#define PPL_Linear_System_defs_hh 1 + +#include "Linear_System.types.hh" +#include "Row.types.hh" +#include "Bit_Row.types.hh" +#include "Bit_Matrix.types.hh" +#include "Matrix.defs.hh" +#include "Topology.hh" +#include "Linear_Row.defs.hh" + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! The base class for systems of constraints and generators. +/*! \ingroup PPL_CXX_interface + An object of this class represents either a constraint system + or a generator system. Each Linear_System object can be viewed + as a finite sequence of strong-normalized Linear_Row objects, + where each Linear_Row implements a constraint or a generator. + Linear systems are characterized by the matrix of coefficients, + also encoding the number, size and capacity of Linear_row objects, + as well as a few additional information, including: + - the topological kind of (all) the rows; + - an indication of whether or not some of the rows in the Linear_System + are pending, 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 true, ensures that the + non-pending prefix of the sequence of rows is sorted. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) + +class Parma_Polyhedra_Library::Linear_System : public Matrix { +public: + //! Builds an empty linear system with specified topology. + /*! + Rows size and capacity are initialized to \f$0\f$. + */ + Linear_System(Topology topol); + + //! Builds a system with specified topology and dimensions. + /*! + \param topol + The topology of the system that will be created; + + \param n_rows + The number of rows of the system that will be created; + + \param n_columns + The number of columns of the system that will be created. + + Creates a \p n_rows \f$\times\f$ \p n_columns system whose + coefficients are all zero and whose rows are all initialized + to be of the given topology. + */ + Linear_System(Topology topol, + dimension_type n_rows, dimension_type n_columns); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS + //! A tag class. + /*! \ingroup PPL_CXX_interface + Tag class to differentiate the Linear_System copy-constructor that + copies pending rows as pending from the one that transforms + pending rows into non-pending ones. + */ +#endif // 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); + + //! Full copy-constructor: pending rows are copied as pending. + Linear_System(const Linear_System& y, With_Pending); + + //! Assignment operator: pending rows are transformed into non-pending ones. + Linear_System& operator=(const Linear_System& y); + + //! Full assignment operator: pending rows are copied as pending. + void assign_with_pending(const Linear_System& y); + + //! Swaps \p *this with \p y. + void swap(Linear_System& y); + + //! Returns the maximum space dimension a Linear_System can handle. + static dimension_type max_space_dimension(); + + //! Returns the space dimension of the rows in the system. + /*! + The computation of the space dimension correctly ignores + the column encoding the inhomogeneous terms of constraint + (resp., the divisors of generators); + if the system topology is NOT_NECESSARILY_CLOSED, + also the column of the \f$\epsilon\f$-dimension coefficients + will be ignored. + */ + dimension_type space_dimension() const; + + //! Makes the system shrink by removing its \p n trailing columns. + void remove_trailing_columns(dimension_type n); + + //! Permutes the columns of the system. + /* + \param cycles + A vector representing the non-trivial cycles of the permutation + according to which the columns must be rearranged. + + The \p cycles vector contains, one after the other, the + non-trivial cycles (i.e., the cycles of length greater than one) + of a permutation of non-zero column indexes. Each cycle is + terminated by zero. For example, assuming the system has 6 + columns, the permutation \f$ \{ 1 \mapsto 3, 2 \mapsto 4, + 3 \mapsto 6, 4 \mapsto 2, 5 \mapsto 5, 6 \mapsto 1 \}\f$ can be + represented by the non-trivial cycles \f$(1 3 6)(2 4)\f$ that, in + turn can be represented by a vector of 6 elements containing 1, 3, + 6, 0, 2, 4, 0. + */ + void permute_columns(const std::vector& cycles); + + //! \name Subscript operators + //@{ + //! Returns a reference to the \p k-th row of the system. + Linear_Row& operator[](dimension_type k); + + //! Returns a constant reference to the \p k-th row of the system. + const Linear_Row& operator[](dimension_type k) const; + //@} // Subscript operators + + //! Strongly normalizes the system. + void strong_normalize(); + + //! Sign-normalizes the system. + void sign_normalize(); + + //! \name Accessors + //@{ + //! Returns the system topology. + Topology topology() const; + + //! Returns the value of the sortedness flag. + bool is_sorted() const; + + /*! \brief + Returns true if and only if + the system topology is NECESSARILY_CLOSED. + */ + 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 true if and only if \p *this is sorted, + without checking for duplicates. + */ + bool check_sorted() const; + + //! Sets the system topology to NECESSARILY_CLOSED. + void set_necessarily_closed(); + + //! Sets the system topology to NOT_NECESSARILY_CLOSED. + void set_not_necessarily_closed(); + + //! Sets the topology of all rows equal to the system topology. + void set_rows_topology(); + + //! Sets the index to indicate that the system has no pending rows. + void unset_pending_rows(); + + //! Sets the index of the first pending row to \p i. + void set_index_first_pending_row(dimension_type i); + + //! Sets the sortedness flag of the system to \p b. + void set_sorted(bool b); + + //! Resizes the system without worrying about the old contents. + /*! + \param new_n_rows + The number of rows of the resized system; + + \param new_n_columns + The number of columns of the resized system. + + The system is expanded to the specified dimensions avoiding + reallocation whenever possible. + The contents of the original system is lost. + */ + void resize_no_copy(dimension_type new_n_rows, dimension_type new_n_columns); + + //! Adds \p n rows and columns to the system. + /*! + \param n + The number of rows and columns to be added: must be strictly positive. + + Turns the system \f$M \in \Rset^r \times \Rset^c\f$ into + the system \f$N \in \Rset^{r+n} \times \Rset^{c+n}\f$ + such that + \f$N = \bigl(\genfrac{}{}{0pt}{}{0}{M}\genfrac{}{}{0pt}{}{J}{o}\bigr)\f$, + where \f$J\f$ is the specular image + of the \f$n \times n\f$ identity matrix. + */ + void add_rows_and_columns(dimension_type n); + + /*! \brief + Adds a copy of \p r to the system, + automatically resizing the system or the row's copy, if needed. + */ + void insert(const Linear_Row& r); + + /*! \brief + Adds a copy of the given row to the pending part of the system, + automatically resizing the system or the row, if needed. + */ + void insert_pending(const Linear_Row& r); + + //! Adds a copy of the given row to the system. + void add_row(const Linear_Row& r); + + //! Adds a new empty row to the system, setting only its flags. + void add_pending_row(Linear_Row::Flags flags); + + //! Adds a copy of the given row to the pending part of the system. + void add_pending_row(const Linear_Row& r); + + //! Adds to \p *this a copy of the rows of `y'. + /*! + It is assumed that \p *this has no pending rows. + */ + void add_rows(const Linear_System& y); + + //! Adds a copy of the rows of `y' to the pending part of `*this'. + void add_pending_rows(const Linear_System& y); + + /*! \brief + Sorts the non-pending rows (in growing order) and eliminates + duplicated ones. + */ + void sort_rows(); + + /*! \brief + Sorts the rows (in growing order) form \p first_row to + \p last_row and eliminates duplicated ones. + */ + void sort_rows(dimension_type first_row, dimension_type last_row); + + /*! \brief + Assigns to \p *this the result of merging its rows with + those of \p y, obtaining a sorted system. + + Duplicated rows will occur only once in the result. + On entry, both systems are assumed to be sorted and have + no pending rows. + */ + void merge_rows_assign(const Linear_System& y); + + /*! \brief + Sorts the pending rows and eliminates those that also occur + in the non-pending part of the system. + */ + void sort_pending_and_remove_duplicates(); + + class With_Bit_Matrix_iterator; + + /*! \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 columns. + */ + dimension_type gauss(dimension_type n_lines_or_equalities); + + /*! \brief + Back-substitutes the coefficients to reduce + the complexity of the system. + + Takes an upper triangular system having \p n_lines_or_equalities rows. + For each row, starting from the one having the minimum number of + coefficients different from zero, computes the expression of an element + as a function of the remaining ones and then substitutes this expression + in all the other rows. + */ + void back_substitute(dimension_type n_lines_or_equalities); + + /*! \brief + Applies Gaussian elimination and back-substitution so as to + simplify the linear system. + */ + void simplify(); + + /*! \brief + Normalizes the system by dividing each row for the GCD of the + row's elements. + */ + void normalize(); + + //! Clears the system deallocating all its rows. + void clear(); + + PPL_OUTPUT_DECLARATIONS + + /*! \brief + Loads from \p s an ASCII representation (as produced by + ascii_dump(std::ostream&) const) and sets \p *this accordingly. + Returns true if successful, false 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; + + //! Checks if all the invariants are satisfied. + /*! + \param check_strong_normalized + true if and only if the strong normalization of all + the rows in the system has to be checked. + + By default, the strong normalization check is performed. + This check may be turned off to avoid useless repeated checking; + e.g., when re-checking a well-formed Linear_System after the permutation + or deletion of some of its rows. + */ + bool OK(bool check_strong_normalized = true) const; + +private: + //! The topological kind of the rows in the system. + Topology row_topology; + + //! The index of the first pending row. + dimension_type index_first_pending; + + /*! \brief + true if rows are sorted in the ascending order as defined by + bool compare(const Linear_Row&, const Linear_Row&). + If false may not be sorted. + */ + bool sorted; + + //! Ordering predicate (used when implementing the sort algorithm). + struct Row_Less_Than { + bool operator()(const Row& x, const Row& y) const; + }; +}; + +namespace std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Linear_System */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +void swap(Parma_Polyhedra_Library::Linear_System& x, + Parma_Polyhedra_Library::Linear_System& y); + +} // namespace std + +namespace Parma_Polyhedra_Library { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns true if and only if \p x and \p y are identical. +/*! \relates Linear_System */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +bool operator==(const Linear_System& x, const Linear_System& y); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns true if and only if \p x and \p y are different. +/*! \relates Linear_System */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +bool operator!=(const Linear_System& x, const Linear_System& y); + +} // namespace Parma_Polyhedra_Library + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! An iterator keeping a Linear_System consistent with a Bit_Matrix. +/*! \ingroup PPL_CXX_interface + An iterator on the vector of Row objects encoded in a Linear_System + extended to maintain a corresponding iterator on a vector of + Bit_Row objects. Access to values is always done on the Row + objects, but iterator movements and swaps are done on both components. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +class Parma_Polyhedra_Library::Linear_System::With_Bit_Matrix_iterator { +public: + typedef std::vector::iterator Iter1; + typedef std::vector::iterator Iter2; + +private: + Iter1 i1; + Iter2 i2; + +public: + // Same traits as Iter1. + typedef std::iterator_traits::iterator_category iterator_category; + typedef std::iterator_traits::value_type value_type; + typedef std::iterator_traits::difference_type difference_type; + typedef std::iterator_traits::pointer pointer; + typedef std::iterator_traits::reference reference; + + //! Constructor. + With_Bit_Matrix_iterator(Iter1 iter1, Iter2 iter2); + + //! Copy-constructor. + With_Bit_Matrix_iterator(const With_Bit_Matrix_iterator& y); + + //! Destructor. + ~With_Bit_Matrix_iterator(); + + //! Assignment operator. + With_Bit_Matrix_iterator& + operator=(const With_Bit_Matrix_iterator& y); + + //! \name Operators Implementing Iterator Movement + //@{ + With_Bit_Matrix_iterator& operator++(); + With_Bit_Matrix_iterator operator++(int); + + With_Bit_Matrix_iterator& operator--(); + With_Bit_Matrix_iterator operator--(int); + + With_Bit_Matrix_iterator& operator+=(difference_type d); + With_Bit_Matrix_iterator operator+(difference_type d) const; + + With_Bit_Matrix_iterator& operator-=(difference_type d); + With_Bit_Matrix_iterator operator-(difference_type d) const; + //@} + + //! Distance operator. + difference_type operator-(const With_Bit_Matrix_iterator& y) const; + + //! \name Comparisons between Iterators + //@{ + bool operator==(const With_Bit_Matrix_iterator& y) const; + bool operator!=(const With_Bit_Matrix_iterator& y) const; + bool operator<(const With_Bit_Matrix_iterator& y) const; + //@} + + //! Dereference operator. + reference operator*() const; + + //! Access-through operator. + pointer operator->() const; + + //! Swaps the pointed Row objects while keeping Bit_Matrix consistent. + void iter_swap(const With_Bit_Matrix_iterator& y) const; + +}; + +namespace std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specializes std::iter_swap. +/*! \relates Parma_Polyhedra_Library::Linear_System::With_Bit_Matrix_iterator */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +void +iter_swap(Parma_Polyhedra_Library + ::Linear_System::With_Bit_Matrix_iterator x, + Parma_Polyhedra_Library + ::Linear_System::With_Bit_Matrix_iterator y); + +} // namespace std + +#include "Linear_System.inlines.hh" + +#endif // !defined(PPL_Linear_System_defs_hh) diff --git a/src/Linear_System.inlines.hh b/src/Linear_System.inlines.hh new file mode 100644 index 0000000..9fd491f --- /dev/null +++ b/src/Linear_System.inlines.hh @@ -0,0 +1,393 @@ +/* Linear_System class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Linear_System_inlines_hh +#define PPL_Linear_System_inlines_hh 1 + +#include "Bit_Row.defs.hh" + +namespace Parma_Polyhedra_Library { + +inline memory_size_type +Linear_System::external_memory_in_bytes() const { + return Matrix::external_memory_in_bytes(); +} + +inline memory_size_type +Linear_System::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +inline bool +Linear_System::is_sorted() const { + // The flag `sorted' does not really reflect the sortedness status + // of a system (if `sorted' evaluates to `false' nothing is known). + // This assertion is used to ensure that the system + // is actually sorted when `sorted' value is 'true'. + assert(!sorted || check_sorted()); + return sorted; +} + +inline void +Linear_System::set_sorted(const bool b) { + sorted = b; +} + +inline +Linear_System::Linear_System(Topology topol) + : Matrix(), + row_topology(topol), + index_first_pending(0), + sorted(true) { +} + +inline +Linear_System::Linear_System(Topology topol, + dimension_type n_rows, dimension_type n_columns) + : Matrix(n_rows, n_columns, Linear_Row::Flags(topol)), + row_topology(topol), + index_first_pending(n_rows), + sorted(true) { +} + +inline dimension_type +Linear_System::first_pending_row() const { + return index_first_pending; +} + +inline dimension_type +Linear_System::num_pending_rows() const { + assert(num_rows() >= first_pending_row()); + return num_rows() - first_pending_row(); +} + +inline void +Linear_System::unset_pending_rows() { + index_first_pending = num_rows(); +} + +inline void +Linear_System::set_index_first_pending_row(const dimension_type i) { + index_first_pending = i; +} + +inline +Linear_System::Linear_System(const Linear_System& y) + : Matrix(y), + row_topology(y.row_topology) { + unset_pending_rows(); + // Previously pending rows may violate sortedness. + sorted = (y.num_pending_rows() > 0) ? false : y.sorted; + assert(num_pending_rows() == 0); +} + +inline +Linear_System::Linear_System(const Linear_System& y, With_Pending) + : Matrix(y), + row_topology(y.row_topology), + index_first_pending(y.index_first_pending), + sorted(y.sorted) { +} + +inline Linear_System& +Linear_System::operator=(const Linear_System& y) { + Matrix::operator=(y); + row_topology = y.row_topology; + unset_pending_rows(); + // Previously pending rows may violate sortedness. + sorted = (y.num_pending_rows() > 0) ? false : y.sorted; + assert(num_pending_rows() == 0); + return *this; +} + +inline void +Linear_System::assign_with_pending(const Linear_System& y) { + Matrix::operator=(y); + row_topology = y.row_topology; + index_first_pending = y.index_first_pending; + sorted = y.sorted; +} + +inline void +Linear_System::swap(Linear_System& y) { + Matrix::swap(y); + std::swap(row_topology, y.row_topology); + std::swap(index_first_pending, y.index_first_pending); + std::swap(sorted, y.sorted); +} + +inline void +Linear_System::clear() { + // Note: do NOT modify the value of `row_topology'. + Matrix::clear(); + index_first_pending = 0; + sorted = true; +} + +inline void +Linear_System::resize_no_copy(const dimension_type new_n_rows, + const dimension_type new_n_columns) { + Matrix::resize_no_copy(new_n_rows, new_n_columns, + Linear_Row::Flags(row_topology)); + // Even though `*this' may happen to keep its sortedness, we believe + // that checking such a property is not worth the effort. In fact, + // it is very likely that the system will be overwritten as soon as + // we return. + set_sorted(false); +} + +inline void +Linear_System::set_necessarily_closed() { + row_topology = NECESSARILY_CLOSED; + if (!has_no_rows()) + set_rows_topology(); +} + +inline void +Linear_System::set_not_necessarily_closed() { + row_topology = NOT_NECESSARILY_CLOSED; + if (!has_no_rows()) + set_rows_topology(); +} + +inline bool +Linear_System::is_necessarily_closed() const { + return row_topology == NECESSARILY_CLOSED; +} + +inline Linear_Row& +Linear_System::operator[](const dimension_type k) { + return static_cast(Matrix::operator[](k)); +} + +inline const Linear_Row& +Linear_System::operator[](const dimension_type k) const { + return static_cast(Matrix::operator[](k)); +} + +inline Topology +Linear_System::topology() const { + return row_topology; +} + +inline dimension_type +Linear_System::max_space_dimension() { + // Column zero holds the inhomogeneous term or the divisor. + // In NNC linear systems, the last column holds the coefficient + // of the epsilon dimension. + return max_num_columns() - 2; +} + +inline dimension_type +Linear_System::space_dimension() const { + const dimension_type n_columns = num_columns(); + return (n_columns == 0) + ? 0 + : n_columns - (is_necessarily_closed() ? 1 : 2); +} + +inline void +Linear_System::remove_trailing_columns(const dimension_type n) { + Matrix::remove_trailing_columns(n); + // Have to re-normalize the rows of the system, + // since we removed some coefficients. + strong_normalize(); +} + +inline void +Linear_System::permute_columns(const std::vector& cycles) { + Matrix::permute_columns(cycles); + // The rows with permuted columns are still normalized but may + // be not strongly normalized: sign normalization is necessary. + sign_normalize(); +} + +/*! \relates Linear_System */ +inline bool +operator!=(const Linear_System& x, const Linear_System& y) { + return !(x == y); +} + +inline bool +Linear_System::Row_Less_Than::operator()(const Row& x, const Row& y) const { + return compare(static_cast(x), + static_cast(y)) < 0; +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Linear_System */ +inline void +swap(Parma_Polyhedra_Library::Linear_System& x, + Parma_Polyhedra_Library::Linear_System& y) { + x.swap(y); +} + +} // namespace std + + +namespace Parma_Polyhedra_Library { + +inline +Linear_System::With_Bit_Matrix_iterator:: +With_Bit_Matrix_iterator(Iter1 iter1, Iter2 iter2) + : i1(iter1), i2(iter2) { +} + +inline +Linear_System::With_Bit_Matrix_iterator:: +With_Bit_Matrix_iterator(const With_Bit_Matrix_iterator& y) + : i1(y.i1), i2(y.i2) { +} + +inline +Linear_System::With_Bit_Matrix_iterator:: +~With_Bit_Matrix_iterator() { +} + +inline Linear_System::With_Bit_Matrix_iterator& +Linear_System::With_Bit_Matrix_iterator:: +operator=(const With_Bit_Matrix_iterator& y) { + i1 = y.i1; + i2 = y.i2; + return *this; +} + +inline Linear_System::With_Bit_Matrix_iterator& +Linear_System::With_Bit_Matrix_iterator::operator++() { + ++i1; + ++i2; + return *this; +} + +inline Linear_System::With_Bit_Matrix_iterator +Linear_System::With_Bit_Matrix_iterator::operator++(int) { + With_Bit_Matrix_iterator tmp = *this; + operator++(); + return tmp; +} + +inline Linear_System::With_Bit_Matrix_iterator& +Linear_System::With_Bit_Matrix_iterator::operator--() { + --i1; + --i2; + return *this; +} + +inline Linear_System::With_Bit_Matrix_iterator +Linear_System::With_Bit_Matrix_iterator::operator--(int) { + With_Bit_Matrix_iterator tmp = *this; + operator--(); + return tmp; +} + +inline Linear_System::With_Bit_Matrix_iterator& +Linear_System::With_Bit_Matrix_iterator::operator+=(difference_type d) { + i1 += d; + i2 += d; + return *this; +} + +inline Linear_System::With_Bit_Matrix_iterator +Linear_System::With_Bit_Matrix_iterator:: +operator+(difference_type d) const { + With_Bit_Matrix_iterator tmp = *this; + tmp += d; + return tmp; +} + +inline Linear_System::With_Bit_Matrix_iterator& +Linear_System::With_Bit_Matrix_iterator::operator-=(difference_type d) { + i1 -= d; + i2 -= d; + return *this; +} + +inline Linear_System::With_Bit_Matrix_iterator +Linear_System::With_Bit_Matrix_iterator:: +operator-(difference_type d) const { + With_Bit_Matrix_iterator tmp = *this; + tmp -= d; + return tmp; +} + +inline Linear_System::With_Bit_Matrix_iterator::difference_type +Linear_System::With_Bit_Matrix_iterator:: +operator-(const With_Bit_Matrix_iterator& y) const { + return i1 - y.i1; +} + +inline bool +Linear_System::With_Bit_Matrix_iterator:: +operator==(const With_Bit_Matrix_iterator& y) const { + return i1 == y.i1; +} + +inline bool +Linear_System::With_Bit_Matrix_iterator:: +operator!=(const With_Bit_Matrix_iterator& y) const { + return i1 != y.i1; +} + +inline bool +Linear_System::With_Bit_Matrix_iterator:: +operator<(const With_Bit_Matrix_iterator& y) const { + return i1 < y.i1; +} + +inline Linear_System::With_Bit_Matrix_iterator::reference +Linear_System::With_Bit_Matrix_iterator::operator*() const { + return *i1; +} + +inline Linear_System::With_Bit_Matrix_iterator::pointer +Linear_System::With_Bit_Matrix_iterator::operator->() const { + return &*i1; +} + +inline void +Linear_System::With_Bit_Matrix_iterator:: +iter_swap(const With_Bit_Matrix_iterator& y) const { + std::iter_swap(i1, y.i1); + std::iter_swap(i2, y.i2); +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates Parma_Polyhedra_Library::Linear_System::With_Bit_Matrix_iterator */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +inline void +iter_swap(Parma_Polyhedra_Library + ::Linear_System::With_Bit_Matrix_iterator x, + Parma_Polyhedra_Library + ::Linear_System::With_Bit_Matrix_iterator y) { + x.iter_swap(y); +} + +} // namespace std + +#endif // !defined(PPL_Linear_System_inlines_hh) diff --git a/src/Linear_System.types.hh b/src/Linear_System.types.hh new file mode 100644 index 0000000..3e26fde --- /dev/null +++ b/src/Linear_System.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PPL_Linear_System_types_hh +#define PPL_Linear_System_types_hh 1 + +namespace Parma_Polyhedra_Library { + +class Linear_System; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Linear_System_types_hh) diff --git a/src/MIP_Problem.cc b/src/MIP_Problem.cc new file mode 100644 index 0000000..707ecc1 --- /dev/null +++ b/src/MIP_Problem.cc @@ -0,0 +1,2171 @@ +/* MIP_Problem class implementation: non-inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include +#include "MIP_Problem.defs.hh" +#include "globals.defs.hh" +#include "Checked_Number.defs.hh" +#include "Row.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 +#include +#include +#include + +#ifndef PPL_NOISY_SIMPLEX +#define PPL_NOISY_SIMPLEX 0 +#endif + +#ifndef PPL_SIMPLEX_USE_MIP_HEURISTIC +#define PPL_SIMPLEX_USE_MIP_HEURISTIC 1 +#endif + +#ifdef PPL_NOISY_SIMPLEX +#include +#endif + + +namespace PPL = Parma_Polyhedra_Library; + +#if PPL_NOISY_SIMPLEX +namespace { + +unsigned long num_iterations = 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, Row::Flags()), + mapping(), + base(), + status(PARTIALLY_SATISFIABLE), + pricing(PRICING_STEEPEST_EDGE_FLOAT), + initialized(false), + input_cs(), + 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."); + 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, Row::Flags()), + mapping(), + base(), + status(PARTIALLY_SATISFIABLE), + pricing(PRICING_STEEPEST_EDGE_FLOAT), + initialized(false), + input_cs(), + 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. + input_cs.insert(input_cs.end(), cs.begin(), cs.end()); + 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."); + input_cs.push_back(c); + if (status != UNSATISFIABLE) + status = PARTIALLY_SATISFIABLE; + 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."); + input_cs.insert(input_cs.end(), cs.begin(), cs.end()); + if (status != UNSATISFIABLE) + status = PARTIALLY_SATISFIABLE; + 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; + 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 doesn't have an optimizing point."); +} + +bool +PPL::MIP_Problem::is_satisfiable() const { + // Check `status' to filter out trivial cases. + switch (status) { + case UNSATISFIABLE: + assert(OK()); + return false; + case SATISFIABLE: + // Intentionally fall through + case UNBOUNDED: + // Intentionally fall through. + case OPTIMIZED: + assert(OK()); + return true; + case PARTIALLY_SATISFIABLE: + { // LP case. + if (i_variables.empty()) + return is_lp_satisfiable(); + // MIP Case. + const Variables_Set this_variables_set = integer_space_dimensions(); + MIP_Problem& x = const_cast(*this); + Generator p = point(); + // This disable the Variable integrality check in OK() until we will + // find a feasible point. + x.i_variables.clear(); + x.is_lp_satisfiable(); + if (is_mip_satisfiable(x, p, this_variables_set)) { + x.last_generator = p; + x.status = SATISFIABLE; + // Restore i_variables; + x.i_variables = this_variables_set; + return true; + } + else { + x.status = UNSATISFIABLE; + // Restore i_variables; + x.i_variables = this_variables_set; + return false; + } + } + } + // We should not be here! + throw std::runtime_error("PPL internal error"); +} + +PPL::MIP_Problem_Status +PPL::MIP_Problem::solve() const{ + switch (status) { + case UNSATISFIABLE: + assert(OK()); + return UNFEASIBLE_MIP_PROBLEM; + case UNBOUNDED: + assert(OK()); + return UNBOUNDED_MIP_PROBLEM; + case OPTIMIZED: + assert(OK()); + return OPTIMIZED_MIP_PROBLEM; + case SATISFIABLE: + // Intentionally fall through + case PARTIALLY_SATISFIABLE: + { + MIP_Problem& x = const_cast(*this); + if (i_variables.empty()) { + // LP Problem case. + if (is_lp_satisfiable()) { + x.second_phase(); + if (x.status == UNBOUNDED) + return UNBOUNDED_MIP_PROBLEM; + else { + assert(x.status == OPTIMIZED); + return OPTIMIZED_MIP_PROBLEM; + } + } + return UNFEASIBLE_MIP_PROBLEM; + } + // MIP Problem case. + // This disable the Variable integrality check in OK() until we will find + // an optimizing point. + const Variables_Set this_variables_set = integer_space_dimensions(); + x.i_variables.clear(); + if (x.is_lp_satisfiable()) + x.second_phase(); + else { + x.status = UNSATISFIABLE; + // Restore i_variables; + x.i_variables = this_variables_set; + return UNFEASIBLE_MIP_PROBLEM; + } + PPL_DIRTY_TEMP0(mpq_class, incumbent_solution); + Generator g = point(); + bool have_incumbent_solution = false; + + MIP_Problem mip_copy(*this); + // Treat this MIP_Problem as an LP one: we have to deal with + // the relaxation in solve_mip(). + mip_copy.i_variables.clear(); + MIP_Problem_Status mip_status = solve_mip(have_incumbent_solution, + incumbent_solution, g, + mip_copy, + this_variables_set); + // Restore i_variables; + x.i_variables = this_variables_set; + switch (mip_status) { + 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; + } + assert(OK()); + return mip_status; + } + } + // We should not be here! + throw std::runtime_error("PPL internal error"); +} + +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; + 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; +} + +void +PPL::MIP_Problem::merge_split_variables(dimension_type var_index, + std::vector& + unfeasible_tableau_rows) { + const dimension_type tableau_nrows = tableau.num_rows(); + const dimension_type column = mapping[var_index].second; + + for (dimension_type i = 0; i < tableau_nrows; ++i) { + // In the following case the negative side of the split variable is + // in base: this means that the constraint will be nonfeasible. + if (base[i] == mapping[var_index].second) { + // CHECKME: we do not know if is possible that the positive and + // the negative part of a split variable can be together in + // base: it seems that this case is not possible. The algorithm + // requires that condition. +#ifndef NDEBUG + for (dimension_type j = 0; j < tableau_nrows; ++j) { + dimension_type dummy = 0; + assert(!is_in_base(mapping[var_index].first, dummy)); + } +#endif + // We set base[i] to zero to keep track that that the constraint is not + // feasible by `last_generator'. + base[i] = 0; + unfeasible_tableau_rows.push_back(i); + } + } + + const dimension_type tableau_cols = tableau.num_columns(); + // Remove the column. + if (column != tableau_cols - 1) { + std::vector cycle; + for (dimension_type j = tableau_cols - 1; j >= column; --j) + cycle.push_back(j); + cycle.push_back(0); + tableau.permute_columns(cycle); + } + tableau.remove_trailing_columns(1); + + // var_index is no longer split. + mapping[var_index].second = 0; + + // Adjust data structured, `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] > column) + --base[i]; + const dimension_type mapping_size = mapping.size(); + for (dimension_type i = mapping_size; i-- > 0; ) { + if (mapping[i].first > column) + --mapping[i].first; + if (mapping[i].second > column) + --mapping[i].second; + } +} + +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. + 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 second argument to be at least + // as large as the first one. + 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& tableau_num_rows, + dimension_type& num_slack_variables, + std::deque& is_tableau_constraint, + std::deque& nonnegative_variable, + std::vector& + unfeasible_tableau_rows, + std::deque& satisfied_ineqs) { + satisfied_ineqs.clear(); + satisfied_ineqs.insert(satisfied_ineqs.end(), input_cs.size(), + false); + + const dimension_type cs_num_rows = input_cs.size(); + const dimension_type cs_space_dim = external_space_dim; + + // Step 1: + // determine variables that are constrained to be nonnegative, + // detect (non-negativity or tautology) constraints that will not + // be part of the tableau and count the number of slack variables. + + // Counters determining the dimensions of the tableau: + // initialized here, they will be updated while examining `cs'. + tableau_num_rows = cs_num_rows; + dimension_type tableau_num_cols = 2*cs_space_dim; + num_slack_variables = 0; + + // On exit, `is_tableau_constraint[i]' will be true if and only if + // `cs[i]' is neither a tautology (e.g., 1 >= 0) nor a non-negativity + // constraint (e.g., X >= 0). + is_tableau_constraint = std::deque (cs_num_rows, true); + + // On exit, `nonnegative_variable[j]' will be true if and only if + // Variable(j) is bound to be nonnegative in `cs'. + nonnegative_variable = std::deque (cs_space_dim, false); + + // Check for already known information about space dimensions and + // store them in `nonnegative_variable'. + const dimension_type mapping_size = mapping.size(); + for (dimension_type i = std::min(mapping_size, cs_space_dim+1); i-- > 1; ) + if (mapping[i].second == 0) { + nonnegative_variable[i-1] = true; + --tableau_num_cols; + } + + // Process each row of the `cs' matrix. + for (dimension_type i = cs_num_rows; i-- > first_pending_constraint; ) { + const Constraint& cs_i = input_cs[i]; + bool found_a_nonzero_coeff = false; + bool found_many_nonzero_coeffs = false; + dimension_type nonzero_coeff_column_index = 0; + for (dimension_type sd = cs_i.space_dimension(); sd-- > 0; ) { + if (cs_i.coefficient(Variable(sd)) != 0) { + if (found_a_nonzero_coeff) { + found_many_nonzero_coeffs = true; + if (cs_i.is_inequality()) + ++num_slack_variables; + break; + } + else { + nonzero_coeff_column_index = sd + 1; + found_a_nonzero_coeff = true; + } + } + } + // If more than one coefficient is nonzero, + // continue with next constraint. + if (found_many_nonzero_coeffs) { + // 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)) + satisfied_ineqs[i] = 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] = false; + --tableau_num_rows; + continue; + } + else { + // Here we have only one nonzero coefficient. + /* + + We have the following methods: + A) Do split the variable and do add the constraint + in the tableau. + B) 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_coeff_column_index-1))); + 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()) + ++num_slack_variables; + } + // Cases 4-5: apply method B. + else if (cs_i.is_equality()) { + if (!nonnegative_variable[nonzero_var_index]) { + nonnegative_variable[nonzero_var_index] = true; + --tableau_num_cols; + } + } + // Case 6: apply method B. + else if (sgn_b < 0) { + if (!nonnegative_variable[nonzero_var_index]) { + nonnegative_variable[nonzero_var_index] = true; + --tableau_num_cols; + } + ++num_slack_variables; + } + // Case 7: apply method C. + else if (sgn_a > 0) { + // This is the most important case in the incrementality solving: + // merge two variables. + if (!nonnegative_variable[nonzero_var_index]) { + nonnegative_variable[nonzero_var_index] = true; + --tableau_num_cols; + if (nonzero_coeff_column_index < mapping_size) + merge_split_variables(nonzero_coeff_column_index, + unfeasible_tableau_rows); + is_tableau_constraint[i] = false; + } + else + is_tableau_constraint[i] = false; + --tableau_num_rows; + } + // Cases 8-9: apply method A. + else + ++num_slack_variables; + } + } + return true; +} + +bool +PPL::MIP_Problem::process_pending_constraints() { + const dimension_type num_original_rows = tableau.num_rows(); + dimension_type new_rows = 0; + dimension_type new_slacks = 0; + dimension_type new_var_columns = 0; + std::deque is_tableau_constraint; + std::deque nonnegative_variable; + std::vector unfeasible_tableau_rows; + std::deque satisfied_ineqs; + // Check the new constraints to adjust the data structures. + // If `false' is returned, the pending constraints are trivially + // unfeasible. + if (!parse_constraints(new_rows, new_slacks, is_tableau_constraint, + nonnegative_variable, unfeasible_tableau_rows, + satisfied_ineqs)) { + status = UNSATISFIABLE; + return false; + }; + + const dimension_type first_free_tableau_index = tableau.num_columns()-1; + + 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, ++j) { + // Set `mapping' properly to store that every variable is split. + // In the following case the value of the original variable can be + // negative. + if (!nonnegative_variable[internal_space_dim+i]) { + mapping.push_back(std::make_pair(first_free_tableau_index+j, + first_free_tableau_index+1+j)); + ++j; + new_var_columns += 2; + } + // The variable is nonnegative. + else { + mapping.push_back(std::make_pair(first_free_tableau_index+j, 0)); + ++new_var_columns; + } + } + } + + // Resize the tableau and adding the necessary columns for artificial and + // slack variables. + dimension_type num_satisfied_ineqs = std::count(satisfied_ineqs.begin(), + satisfied_ineqs.end(), + true); + const dimension_type unfeasible_tableau_rows_size + = unfeasible_tableau_rows.size(); + const dimension_type artificial_cols + = new_rows + unfeasible_tableau_rows_size - num_satisfied_ineqs; + const dimension_type new_total_columns + = new_var_columns + new_slacks + artificial_cols; + if (new_rows > 0) + tableau.add_zero_rows(new_rows, Row::Flags()); + if (new_total_columns > 0) + tableau.add_zero_columns(new_total_columns); + dimension_type tableau_num_rows = tableau.num_rows(); + + // The following vector will be useful know if a constraint is feasible + // and does not require an additional artificial variable. + std::deque worked_out_row (tableau_num_rows, false); + dimension_type tableau_num_columns = tableau.num_columns(); + + // 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(), new_rows, 0); + const dimension_type base_size = base.size(); + + // These indexes will be used to insert slack and artificial variables. + dimension_type slack_index = tableau_num_columns - artificial_cols - 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 = artificial_cols > 0 + ? artificial_index : 0; + + // Proceed with the insertion of the constraints. + for (dimension_type k = tableau_num_rows, i = input_cs.size(); + i-- > first_pending_constraint; ) + if (is_tableau_constraint[i]) { + // Copy the original constraint in the tableau. + Row& tableau_k = tableau[--k]; + const Constraint& cs_i = input_cs[i]; + for (dimension_type sd = cs_i.space_dimension(); sd-- > 0; ) { + tableau_k[mapping[sd+1].first] = cs_i.coefficient(Variable(sd)); + // Split if needed. + if (mapping[sd+1].second != 0) + neg_assign(tableau_k[mapping[sd+1].second], + tableau_k[mapping[sd+1].first]); + } + tableau_k[mapping[0].first] = cs_i.inhomogeneous_term(); + // Split if needed. + if (mapping[0].second != 0) + tableau_k[mapping[0].second] = -cs_i.inhomogeneous_term(); + + // Add the slack variable, if needed. + if (cs_i.is_inequality()) { + tableau_k[--slack_index] = -1; + // If the constraint is already satisfied, we will not use artificial + // variables to compute a feasible base: this to speed up + // the algorithm. + if (satisfied_ineqs[i]) { + base[k] = slack_index; + worked_out_row[k] = true; + } + } + for (dimension_type j = base_size; j-- > 0; ) + if (k != j && tableau_k[base[j]] != 0 && base[j] != 0) + linear_combine(tableau_k, tableau[j], base[j]); + } + + // We negate the row if tableau[i][0] <= 0 to get the inhomogeneous term > 0. + // This simplifies the insertion of the artificial variables: the value of + // each artificial variable will be 1. + for (dimension_type i = tableau_num_rows; i-- > 0 ; ) { + Row& tableau_i = tableau[i]; + if (tableau_i[0] > 0) + for (dimension_type j = tableau_num_columns; j-- > 0; ) + neg_assign(tableau_i[j]); + } + + // Set the working cost function with the right size. + working_cost = Row(tableau_num_columns, Row::Flags()); + + // Insert artificial variables for the nonfeasible constraints. + for (dimension_type i = 0; i < unfeasible_tableau_rows_size; ++i) { + tableau[unfeasible_tableau_rows[i]][artificial_index] = 1; + working_cost[artificial_index] = -1; + base[unfeasible_tableau_rows[i]] = artificial_index; + ++artificial_index; + } + + // Modify the tableau and the new cost function by adding + // the artificial variables (which enter the base). Note that if an + // inequality was satisfied by `last_generator', this will be not processed. + // This information in encoded in `worked_out_row'. + // As for the cost function, all the artificial variables should have + // coefficient -1. + for (dimension_type i = num_original_rows; i < tableau_num_rows; ++i) { + if (worked_out_row[i]) + continue; + tableau[i][artificial_index] = 1; + working_cost[artificial_index] = -1; + base[i] = artificial_index; + ++artificial_index; + } + // The last column index of the tableau containing an artificial variable. + const dimension_type end_artificials = artificial_index - 1; + + // Set the extra-coefficient of the cost functions to record its sign. + // This is done to keep track of the possible sign's inversion. + const dimension_type last_obj_index = working_cost.size() - 1; + working_cost[last_obj_index] = 1; + + // Express the problem in terms of the variables in base. + for (dimension_type i = tableau_num_rows; i-- > 0; ) + if (working_cost[base[i]] != 0) + linear_combine(working_cost, tableau[i], base[i]); + + // Deal with zero dimensional problems. + if (space_dimension() == 0) { + status = OPTIMIZED; + last_generator = point(); + return true; + } + // 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) { + const dimension_type input_obj_function_size + = input_obj_function.space_dimension(); + for (dimension_type i = input_obj_function_size; i-- > 0; ) + // 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 ((((input_obj_function.coefficient(Variable(i)) > 0 + && opt_mode == MAXIMIZATION) + || (input_obj_function.coefficient(Variable(i)) < 0 + && opt_mode == MINIMIZATION)) && mapping[i].second == 0) + // In the following case the variable is unconstrained. + || (input_obj_function.coefficient(Variable(i)) != 0 + && mapping[i].second != 0)) { + // Ensure the right space dimension is obtained. + last_generator = point(0 * Variable(space_dimension()-1)); + status = UNBOUNDED; + return true; + } + + // 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(0*Variable(space_dimension()-1)); + assert(OK()); + return true; + } + + // Now we are ready to solve the first phase. + bool first_phase_succesful + = (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::solve: 1st phase ended at iteration " + << num_iterations << "." << std::endl; +#endif + + if (!first_phase_succesful || working_cost[0] != 0) { + // The feasible region is empty. + status = UNSATISFIABLE; + return false; + } + + // Prepare *this for a possible second phase. + if (begin_artificials != 0) + erase_artificials(begin_artificials, end_artificials); + compute_generator(); + status = SATISFIABLE; + assert(OK()); + return true; +} + +namespace { + +inline void +assign(double& d, const mpz_class& c) { + d = c.get_d(); +} + +template +inline void +assign(double& d, + const Parma_Polyhedra_Library::Checked_Number& c) { + d = raw_value(c); +} + +} // namespace + +PPL::dimension_type +PPL::MIP_Problem::steepest_edge_float_entering_index() const { + PPL_DIRTY_TEMP0(mpq_class, real_coeff); + const dimension_type tableau_num_rows = tableau.num_rows(); + assert(tableau_num_rows == base.size()); + double challenger_num = 0.0; + double challenger_den = 0.0; + double current_value = 0.0; + dimension_type entering_index = 0; + const int cost_sign = sgn(working_cost[working_cost.size() - 1]); + for (dimension_type j = tableau.num_columns() - 1; j-- > 1; ) { + const Coefficient& cost_j = working_cost[j]; + if (sgn(cost_j) == cost_sign) { + // We cannot compute the (exact) square root of abs(\Delta x_j). + // The workaround is to compute the square of `cost[j]'. + assign(challenger_num, cost_j); + challenger_num = fabs(challenger_num); + // Due to our integer implementation, the `1' term in the denominator + // of the original formula has to be replaced by `squared_lcm_basis'. + challenger_den = 1.0; + for (dimension_type i = tableau_num_rows; i-- > 0; ) { + const Row& tableau_i = tableau[i]; + const Coefficient& tableau_ij = tableau_i[j]; + if (tableau_ij != 0) { + assert(tableau_i[base[i]] != 0); + assign_r(real_coeff.get_num(), tableau_ij, ROUND_NOT_NEEDED); + assign_r(real_coeff.get_den(), tableau_i[base[i]], ROUND_NOT_NEEDED); + real_coeff.canonicalize(); + double float_tableau_value; + assign(float_tableau_value, real_coeff); + challenger_den += float_tableau_value * float_tableau_value; + } + } + double challenger_value = sqrt(challenger_den); + // 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; + } + } + } + return entering_index; +} + +PPL::dimension_type +PPL::MIP_Problem::steepest_edge_exact_entering_index() const { + const dimension_type tableau_num_rows = tableau.num_rows(); + assert(tableau_num_rows == base.size()); + // The square of the lcm of all the coefficients of variables in base. + PPL_DIRTY_TEMP_COEFFICIENT(squared_lcm_basis); + // The normalization factor for each coefficient in the tableau. + std::vector norm_factor(tableau_num_rows); + { + // 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][base[i]]); + // Compute normalization factors. + for (dimension_type i = tableau_num_rows; i-- > 0; ) + exact_div_assign(norm_factor[i], lcm_basis, tableau[i][base[i]]); + // Compute the square of `lcm_basis', exploiting the fact that + // `lcm_basis' will no longer be needed. + lcm_basis *= lcm_basis; + std::swap(squared_lcm_basis, lcm_basis); + } + + // Defined here to avoid repeated (de-)allocations. + PPL_DIRTY_TEMP_COEFFICIENT(challenger_num); + PPL_DIRTY_TEMP_COEFFICIENT(scalar_value); + PPL_DIRTY_TEMP_COEFFICIENT(challenger_den); + PPL_DIRTY_TEMP_COEFFICIENT(challenger_value); + PPL_DIRTY_TEMP_COEFFICIENT(current_value); + + PPL_DIRTY_TEMP_COEFFICIENT(current_num); + PPL_DIRTY_TEMP_COEFFICIENT(current_den); + dimension_type entering_index = 0; + const int cost_sign = sgn(working_cost[working_cost.size() - 1]); + for (dimension_type j = tableau.num_columns() - 1; j-- > 1; ) { + const Coefficient& cost_j = working_cost[j]; + if (sgn(cost_j) == cost_sign) { + // We cannot compute the (exact) square root of abs(\Delta x_j). + // The workaround is to compute the square of `cost[j]'. + challenger_num = cost_j * cost_j; + // Due to our integer implementation, the `1' term in the denominator + // of the original formula has to be replaced by `squared_lcm_basis'. + challenger_den = squared_lcm_basis; + for (dimension_type i = tableau_num_rows; i-- > 0; ) { + const Coefficient& tableau_ij = tableau[i][j]; + // 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_den, scalar_value, scalar_value); + } + } + // Initialization during the first loop. + if (entering_index == 0) { + std::swap(current_num, challenger_num); + std::swap(current_den, challenger_den); + entering_index = j; + continue; + } + challenger_value = challenger_num * current_den; + current_value = current_num * challenger_den; + // Update the values, if the challenger wins. + if (challenger_value > current_value) { + std::swap(current_num, challenger_num); + std::swap(current_den, challenger_den); + entering_index = j; + } + } + } + return entering_index; +} + + +// See 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[cost_sign_index]); + assert(cost_sign != 0); + for (dimension_type i = 1; i < cost_sign_index; ++i) + if (sgn(working_cost[i]) == cost_sign) + return i; + // No variable has to enter the base: + // the cost function was optimized. + return 0; +} + +void +PPL::MIP_Problem::linear_combine(Row& x, + const Row& y, + const dimension_type k) { + assert(x.size() == y.size()); + assert(y[k] != 0 && x[k] != 0); + // Let g be the GCD between `x[k]' and `y[k]'. + // For each i the following computes + // x[i] = x[i]*y[k]/g - y[i]*x[k]/g. + 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); + for (dimension_type i = x.size(); i-- > 0; ) + if (i != k) { + Coefficient& x_i = x[i]; + x_i *= normalized_y_k; + // The test against 0 gives rise to a consistent speed up: see + // http://www.cs.unipr.it/pipermail/ppl-devel/2009-February/014000.html + const Coefficient& y_i = y[i]; + if (y_i != 0) + sub_mul_assign(x_i, y_i, normalized_x_k); + } + x[k] = 0; + x.normalize(); +} + +// See 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[entering_var_index] != 0) + linear_combine(tableau_i, tableau_out, entering_var_index); + } + // Linearly combine the cost function. + if (working_cost[entering_var_index] != 0) + linear_combine(working_cost, tableau_out, entering_var_index); + // Adjust the base. + base[exiting_base_index] = entering_var_index; +} + +// See 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[entering_var_index]); + if (num_sign != 0 && num_sign == sgn(t_i[base[i]])) { + exiting_base_index = i; + break; + } + } + // Check for unboundedness. + if (exiting_base_index == tableau_num_rows) + return tableau_num_rows; + + // Reaching this point means that a variable will definitely exit the base. + PPL_DIRTY_TEMP_COEFFICIENT(lcm); + PPL_DIRTY_TEMP_COEFFICIENT(current_min); + PPL_DIRTY_TEMP_COEFFICIENT(challenger); + for (dimension_type i = exiting_base_index + 1; i < tableau_num_rows; ++i) { + const Row& t_i = tableau[i]; + const Coefficient& t_ie = t_i[entering_var_index]; + const Coefficient& t_ib = t_i[base[i]]; + const int t_ie_sign = sgn(t_ie); + if (t_ie_sign != 0 && t_ie_sign == sgn(t_ib)) { + const Row& t_e = tableau[exiting_base_index]; + const Coefficient& t_ee = t_e[entering_var_index]; + lcm_assign(lcm, t_ee, t_ie); + exact_div_assign(current_min, lcm, t_ee); + current_min *= t_e[0]; + abs_assign(current_min); + exact_div_assign(challenger, lcm, t_ie); + challenger *= t_i[0]; + 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; + } + } + 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_num); + PPL_DIRTY_TEMP_COEFFICIENT(current_den); + PPL_DIRTY_TEMP_COEFFICIENT(challenger); + PPL_DIRTY_TEMP_COEFFICIENT(current); + + cost_sgn_coeff = working_cost[working_cost.size()-1]; + current_num = working_cost[0]; + if (cost_sgn_coeff < 0) + neg_assign(current_num); + abs_assign(current_den, cost_sgn_coeff); + 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); + + // Now begins the objective function's value check to choose between + // the `textbook' and the float `steepest-edge' technique. + cost_sgn_coeff = working_cost[working_cost.size()-1]; + + challenger = working_cost[0]; + if (cost_sgn_coeff < 0) + neg_assign(challenger); + challenger *= current_den; + abs_assign(current, cost_sgn_coeff); + current *= current_num; +#if PPL_NOISY_SIMPLEX + ++num_iterations; + if (num_iterations % 200 == 0) + std::cout << "Primal Simplex: iteration " + << num_iterations << "." << std::endl; +#endif + // If the following condition fails, probably there's a bug. + 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_num = working_cost[0]; + if (cost_sgn_coeff < 0) + neg_assign(current_num); + abs_assign(current_den, cost_sgn_coeff); + } +} + +bool +PPL::MIP_Problem::compute_simplex_using_exact_pricing() { + assert(tableau.num_columns() == working_cost.size()); + 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 + } +} + + +// See pages 55-56 of [PapadimitriouS98]. +void +PPL::MIP_Problem::erase_artificials(const dimension_type begin_artificials, + const dimension_type end_artificials) { + const dimension_type tableau_last_index = 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; + for (dimension_type j = end_artificials+1; j-- > 1; ) + if (!(begin_artificials <= j && j <= end_artificials) + && tableau_i[j] != 0) { + pivot(j, i); + redundant = false; + break; + } + if (redundant) { + // No original variable entered the base: + // the constraint is redundant and should be deleted. + --tableau_n_rows; + if (i < tableau_n_rows) { + // Replace the redundant row with the last one, + // taking care of adjusting the iteration index. + tableau_i.swap(tableau[tableau_n_rows]); + base[i] = base[tableau_n_rows]; + --i; + } + tableau.erase_to_end(tableau_n_rows); + base.pop_back(); + } + } + + + // Step 2: Adjust data structures so as to enter phase 2 of the simplex. + + // Compute the dimensions of the new tableau. + dimension_type num_artificials = 0; + for (dimension_type i = end_artificials + 1; i-- > 1; ) + if (begin_artificials <= i && i <= end_artificials) { + ++num_artificials; + tableau.remove_trailing_columns(1); + } + + // Zero the last column of the tableau. + for (dimension_type i = tableau_n_rows; i-- > 0; ) + tableau[i][tableau.num_columns()-1] = 0; + + // ... then properly set the element in the (new) last column, + // encoding the kind of optimization; ... + working_cost[tableau.num_columns()-1] = working_cost[tableau_last_index]; + // ... 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 { + // We will store in num[] and in den[] the numerators and + // the denominators of every variable of the original problem. + std::vector num(external_space_dim); + std::vector den(external_space_dim); + dimension_type row = 0; + + PPL_DIRTY_TEMP_COEFFICIENT(lcm); + // Speculatively allocate temporaries out of loop. + PPL_DIRTY_TEMP_COEFFICIENT(split_num); + PPL_DIRTY_TEMP_COEFFICIENT(split_den); + + // We start to compute num[] and den[]. + for (dimension_type i = external_space_dim; i-- > 0; ) { + Coefficient& num_i = num[i]; + Coefficient& den_i = den[i]; + // Get the value of the variable from the tableau + // (if it is not a basic variable, the value is 0). + const dimension_type original_var = mapping[i+1].first; + if (is_in_base(original_var, row)) { + const Row& t_row = tableau[row]; + if (t_row[original_var] > 0) { + neg_assign(num_i, t_row[0]); + den_i = t_row[original_var]; + } + else { + num_i = t_row[0]; + neg_assign(den_i, t_row[original_var]); + } + } + else { + num_i = 0; + den_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]; + if (t_row[split_var] > 0) { + split_num = -t_row[0]; + split_den = t_row[split_var]; + } + else { + split_num = t_row[0]; + split_den = -t_row[split_var]; + } + // We compute the lcm to compute subsequently the difference + // between the 2 variables. + lcm_assign(lcm, den_i, split_den); + exact_div_assign(den_i, lcm, den_i); + exact_div_assign(split_den, lcm, split_den); + num_i *= den_i; + sub_mul_assign(num_i, split_num, split_den); + if (num_i == 0) + den_i = 1; + else + den_i = lcm; + } + // Note: if the negative component was not in base, then + // it has value zero and there is nothing left to do. + } + } + + // Compute the lcm of all denominators. + lcm = den[0]; + for (dimension_type i = 1; i < external_space_dim; ++i) + lcm_assign(lcm, lcm, den[i]); + // Use the denominators to store the numerators' multipliers + // and then compute the normalized numerators. + for (dimension_type i = external_space_dim; i-- > 0; ) { + exact_div_assign(den[i], lcm, den[i]); + num[i] *= den[i]; + } + + // Finally, build the generator. + Linear_Expression expr; + for (dimension_type i = external_space_dim; i-- > 0; ) + expr += num[i] * Variable(i); + + MIP_Problem& x = const_cast(*this); + x.last_generator = point(expr, lcm); +} + +void +PPL::MIP_Problem::second_phase() { + // Second_phase requires that *this is satisfiable. + assert(status == SATISFIABLE || status == UNBOUNDED || status == OPTIMIZED); + // In the following cases the problem is already solved. + if (status == UNBOUNDED || status == OPTIMIZED) + return; + + // Build the objective function for the second phase. + const dimension_type input_obj_function_sd + = input_obj_function.space_dimension(); + Row new_cost(input_obj_function_sd + 1, Row::Flags()); + for (dimension_type i = input_obj_function_sd; i-- > 0; ) + new_cost[i+1] = input_obj_function.coefficient(Variable(i)); + new_cost[0] = input_obj_function.inhomogeneous_term(); + + // Negate the cost function if we are minimizing. + if (opt_mode == MINIMIZATION) + for (dimension_type i = new_cost.size(); i-- > 0; ) + neg_assign(new_cost[i]); + + // Substitute properly the cost function in the `costs' matrix. + const dimension_type cost_zero_size = working_cost.size(); + Row tmp_cost = Row(new_cost, cost_zero_size, cost_zero_size); + tmp_cost.swap(working_cost); + working_cost[cost_zero_size-1] = 1; + + // Split the variables the cost function. + for (dimension_type i = new_cost.size(); i-- > 1; ) { + const dimension_type original_var = mapping[i].first; + const dimension_type split_var = mapping[i].second; + working_cost[original_var] = new_cost[i]; + if (mapping[i].second != 0) + working_cost[split_var] = - new_cost[i]; + } + // Here the first phase problem succeeded with optimum value zero. + // Express the old cost function in terms of the computed base. + for (dimension_type i = tableau.num_rows(); i-- > 0; ) { + const dimension_type base_i = base[i]; + if (working_cost[base_i] != 0) + linear_combine(working_cost, tableau[i], base_i); + } + // Solve the second phase problem. + bool second_phase_successful + = (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::solve: 2nd phase ended at iteration " + << num_iterations << "." << std::endl; +#endif + status = second_phase_successful ? OPTIMIZED : UNBOUNDED; + assert(OK()); +} + +void +PPL::MIP_Problem +::evaluate_objective_function(const Generator& evaluating_point, + Coefficient& ext_n, + Coefficient& ext_d) const { + const dimension_type ep_space_dim = evaluating_point.space_dimension(); + if (space_dimension() < ep_space_dim) + throw std::invalid_argument("PPL::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()); + // Compute the optimal value of the cost function. + const Coefficient& divisor = evaluating_point.divisor(); + ext_n = input_obj_function.inhomogeneous_term() * divisor; + for (dimension_type i = working_space_dim; i-- > 0; ) + ext_n += evaluating_point.coefficient(Variable(i)) + * input_obj_function.coefficient(Variable(i)); + // Numerator and denominator should be coprime. + normalize2(ext_n, divisor, ext_n, ext_d); +} + +bool +PPL::MIP_Problem::is_lp_satisfiable() const { +#if PPL_NOISY_SIMPLEX + num_iterations = 0; +#endif + 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(*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; + assert(OK()); + return (status != UNSATISFIABLE); + } + } + // We should not be here! + throw std::runtime_error("PPL internal error"); +} + +PPL::MIP_Problem_Status +PPL::MIP_Problem::solve_mip(bool& have_incumbent_solution, + mpq_class& incumbent_solution_value, + Generator& incumbent_solution_point, + MIP_Problem& lp, + const Variables_Set& i_vars) { + // Solve the problem as a non MIP one, it must be done internally. + PPL::MIP_Problem_Status lp_status; + if (lp.is_lp_satisfiable()) { + lp.second_phase(); + lp_status = (lp.status == OPTIMIZED) ? OPTIMIZED_MIP_PROBLEM + : UNBOUNDED_MIP_PROBLEM; + } + else + return UNFEASIBLE_MIP_PROBLEM; + + PPL_DIRTY_TEMP0(mpq_class, tmp_rational); + + Generator p = point(); + PPL_DIRTY_TEMP_COEFFICIENT(tmp_coeff1); + PPL_DIRTY_TEMP_COEFFICIENT(tmp_coeff2); + + if (lp_status == UNBOUNDED_MIP_PROBLEM) + p = lp.last_generator; + else { + assert(lp_status == OPTIMIZED_MIP_PROBLEM); + // Do not call optimizing_point(). + p = lp.last_generator; + lp.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); + assert(is_canonical(tmp_rational)); + if (have_incumbent_solution + && ((lp.optimization_mode() == MAXIMIZATION + && tmp_rational <= incumbent_solution_value) + || (lp.optimization_mode() == MINIMIZATION + && tmp_rational >= incumbent_solution_value))) + // Abandon this path. + return lp_status; + } + + bool found_satisfiable_generator = true; + PPL_DIRTY_TEMP_COEFFICIENT(gcd); + const Coefficient& p_divisor = p.divisor(); + dimension_type nonint_dim; + 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) { + nonint_dim = *v_begin; + found_satisfiable_generator = false; + break; + } + } + if (found_satisfiable_generator) { + // All the coordinates of `point' are satisfiable. + if (lp_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 lp_status; + } + if (!have_incumbent_solution + || (lp.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(num); + PPL_DIRTY_TEMP_COEFFICIENT(den); + lp.evaluate_objective_function(p, num, den); + std::cerr << "new value found: " << num << "/" << den << std::endl; +#endif + } + return lp_status; + } + + assert(nonint_dim < lp.space_dimension()); + + assign_r(tmp_rational.get_num(), p.coefficient(Variable(nonint_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 lp_aux = lp; + lp_aux.add_constraint(Variable(nonint_dim) <= tmp_coeff1); + solve_mip(have_incumbent_solution, incumbent_solution_value, + incumbent_solution_point, lp_aux, i_vars); + } + // TODO: change this when we will be able to remove constraints. + lp.add_constraint(Variable(nonint_dim) >= tmp_coeff2); + solve_mip(have_incumbent_solution, incumbent_solution_value, + incumbent_solution_point, lp, i_vars); + return have_incumbent_solution ? lp_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 don't satisfy the integrality condition. + const Constraint_Sequence& input_cs = mip.input_cs; + const Generator& last_generator = mip.last_generator; + const Coefficient& last_generator_divisor = last_generator.divisor(); + Variables_Set candidate_variables; + + 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 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 current_num_appearances = 0; + dimension_type winning_num_appearances = 0; + + // For every candidate variable, check how many times this appear in the + // active constraints. + for (Variables_Set::const_iterator v_it = candidate_variables.begin(), + v_end = candidate_variables.end(); v_it != v_end; ++v_it) { + current_num_appearances = 0; + for (dimension_type i = input_cs_num_rows; i-- > 0; ) + if (satisfiable_constraints[i] + && *v_it < input_cs[i].space_dimension() + && input_cs[i].coefficient(Variable(*v_it)) != 0) + ++current_num_appearances; + if (current_num_appearances >= winning_num_appearances) { + winning_num_appearances = current_num_appearances; + branching_index = *v_it; + } + } + return false; +} + +bool +PPL::MIP_Problem::is_mip_satisfiable(MIP_Problem& lp, Generator& p, + const Variables_Set& i_vars) { + // Solve the problem as a non MIP one, it must be done internally. + if (!lp.is_lp_satisfiable()) + return false; + PPL_DIRTY_TEMP0(mpq_class, tmp_rational); + + PPL_DIRTY_TEMP_COEFFICIENT(tmp_coeff1); + PPL_DIRTY_TEMP_COEFFICIENT(tmp_coeff2); + p = lp.last_generator; + + bool found_satisfiable_generator = true; + dimension_type nonint_dim; + const Coefficient& p_divisor = p.divisor(); + +#if PPL_SIMPLEX_USE_MIP_HEURISTIC + found_satisfiable_generator + = choose_branching_variable(lp, i_vars, nonint_dim); +#else + PPL_DIRTY_TEMP_COEFFICIENT(gcd); + 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) { + nonint_dim = *v_begin; + found_satisfiable_generator = false; + break; + } + } +#endif + + if (found_satisfiable_generator) + return true; + + + assert(nonint_dim < lp.space_dimension()); + + assign_r(tmp_rational.get_num(), p.coefficient(Variable(nonint_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 lp_aux = lp; + lp_aux.add_constraint(Variable(nonint_dim) <= tmp_coeff1); + if (is_mip_satisfiable(lp_aux, p, i_vars)) + return true; + } + lp.add_constraint(Variable(nonint_dim) >= tmp_coeff2); + return is_mip_satisfiable(lp, p, i_vars); +} + +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. + + for (dimension_type i = input_cs_num_rows; i-- > 0; ) + if (!input_cs[i].OK()) + return false; + + if (!tableau.OK() || !input_obj_function.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; + } + + // 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 (external_space_dim != last_generator.space_dimension()) { +#ifndef NDEBUG + cerr << "The MIP_Problem and the cached feasible point have " + << "incompatible space dimensions (" + << external_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); + 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_nrows = tableau.num_rows(); + const dimension_type tableau_ncols = tableau.num_columns(); + + // The number of rows in the tableau and base should be equal. + if (tableau_nrows != base.size()) { +#ifndef NDEBUG + cerr << "tableau and base have incompatible sizes" << endl; + ascii_dump(cerr); +#endif + return false; + } + // The size of `mapping' should be equal to the space dimension + // of `input_cs' plus one. + if (mapping.size() != external_space_dim + 1) { +#ifndef NDEBUG + cerr << "`input_cs' 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_ncols != 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_ncols) { +#ifndef NDEBUG + cerr << "base contains an invalid column index" << endl; + ascii_dump(cerr); +#endif + return false; + } + // tableau[i][base[i] must be different from zero. + // tableau[i][base[j], with i different from j, must not be a zero. + for (dimension_type j = tableau_nrows; j-- > 0; ) + if (i != j && tableau[j][base[i]] != 0) { +#ifndef NDEBUG + cerr << "tableau[i][base[i] must be different from zero" << endl; + ascii_dump(cerr); +#endif + return false; + } + if (tableau[i][base[i]] == 0) { +#ifndef NDEBUG + cerr << "tableau[i][base[j], with i different from j, 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_nrows; i-- > 0; ) + if (tableau[i][tableau_ncols-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 << "\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()); + 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 != "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; + + dimension_type base_value; + for (dimension_type i = 0; i != base_size; ++i) { + 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; + + dimension_type first_value; + dimension_type second_value; + dimension_type index; + + // 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) { + if (!(s >> index)) + return false; + if (!(s >> str) || str != "->") + return false; + if (!(s >> first_value)) + return false; + if (!(s >> str) || str != "->") + return false; + 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; + + assert(OK()); + return true; +} + +/*! \relates Parma_Polyhedra_Library::MIP_Problem */ +std::ostream& +PPL::IO_Operators::operator<<(std::ostream& s, const MIP_Problem& lp) { + s << "Constraints:"; + for (MIP_Problem::const_iterator i = lp.constraints_begin(), + i_end = lp.constraints_end(); i != i_end; ++i) + s << "\n" << *i; + s << "\nObjective function: " + << lp.objective_function() + << "\nOptimization mode: " + << (lp.optimization_mode() == MAXIMIZATION + ? "MAXIMIZATION" + : "MINIMIZATION"); + s << "\nInteger variables: " << lp.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..76cbc4f --- /dev/null +++ b/src/MIP_Problem.defs.hh @@ -0,0 +1,806 @@ +/* MIP_Problem class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_MIP_Problem_defs_hh +#define PPL_MIP_Problem_defs_hh 1 + +#include "MIP_Problem.types.hh" +#include "globals.types.hh" +#include "Row.defs.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 +#include +#include + +namespace Parma_Polyhedra_Library { + +namespace IO_Operators { + +//! Output operator. +/*! \relates Parma_Polyhedra_Library::MIP_Problem */ +std::ostream& +operator<<(std::ostream& s, const MIP_Problem& lp); + +} // namespace IO_Operators + +} // 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 max_space_dimension(). + */ + 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 + MAXIMIZATION). + + \exception std::length_error + Thrown if \p dim exceeds max_space_dimension(). + + \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 + 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 + MAXIMIZATION). + + \exception std::length_error + Thrown if \p dim exceeds max_space_dimension(). + + \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 + 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 + MAXIMIZATION). + + \exception std::length_error + Thrown if \p dim exceeds max_space_dimension(). + + \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_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; + + //! 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 max_space_dimension(). + + 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 + true 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 den so that \f$\frac{num}{den}\f$ is the result + of evaluating the objective function on \p evaluating_point. + + \param evaluating_point + The point on which the objective function will be evaluated. + + \param num + On exit will contain the numerator of the evaluated value. + + \param den + On exit will contain the denominator of the evaluated value. + + \exception std::invalid_argument + Thrown if \p *this and \p evaluating_point are dimension-incompatible + or if the generator \p evaluating_point is not a point. + */ + void evaluate_objective_function(const Generator& evaluating_point, + Coefficient& num, + Coefficient& den) const; + + //! Returns a feasible point for \p *this, if it exists. + /*! + \exception std::domain_error + Thrown if the 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 doesn't not have an optimizing point, i.e., + if the MIP problem is unbounded or not satisfiable. + */ + const Generator& optimizing_point() const; + + /*! \brief + Sets \p num and \p den so that \f$\frac{num}{den}\f$ is + the solution of the optimization problem. + + \exception std::domain_error + Thrown if \p *this doesn't not have an optimizing point, i.e., + if the MIP problem is unbounded or not satisfiable. + */ + void optimal_value(Coefficient& num, Coefficient& den) const; + + //! Checks if all the invariants are satisfied. + bool OK() const; + + PPL_OUTPUT_DECLARATIONS + + /*! \brief + Loads from \p s an ASCII representation (as produced by + ascii_dump(std::ostream&) const) and sets \p *this accordingly. + Returns true if successful, false 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 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; + + //! The matrix encoding the current feasible region in tableau form. + Matrix tableau; + + //! The working cost function. + Row 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; mapping[i].second + not a zero, 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 > mapping; + + //! The current basic solution. + std::vector 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. + Constraint_Sequence input_cs; + + //! 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; + + //! Processes the pending constraints of \p *this. + /*! + \return + true if and only if the MIP problem is satisfiable after + processing the pending constraints, false otherwise. + */ + bool 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 + UNFEASIBLE_MIP_PROBLEM if the constraint system contains + any trivially unfeasible constraint (tableau was not computed); + UNBOUNDED_MIP_PROBLEM if the problem is trivially unbounded + (the computed tableau contains no constraints); + OPTIMIZED_MIP_PROBLEM> if the problem is neither trivially + unfeasible nor trivially unbounded (the tableau was computed successfully). + */ + MIP_Problem_Status + compute_tableau(std::vector& worked_out_row); + + /*! \brief + Parses the pending constraints to gather information on + how to resize the tableau. + + \return + UNSATISFIABLE if is detected a trivially false constraint, + SATISFIABLE otherwise. + + \param new_num_rows + This will store the number of rows that has to be added to the original + tableau. + + \param num_slack_variables + This will store the number of slack variables that has to be added to + the original tableau. + + \param is_tableau_constraint + Every element of this vector will be set to true if the + associated pending constraint has to be inserted in the tableau, + false otherwise. + + \param nonnegative_variable + This will encode for each variable if this one was split or not. + Every element of this vector will be set to true if the + associated variable is split, false otherwise. + + \param unfeasible_tableau_rows + This will contain all the row indexes of the tableau that are no more + satisfied after adding more constraints to \p *this. + + \param satisfied_ineqs + This will contain all the row indexes of the tableau that are already + satisfied by `last_generator' and do not require artificial variables to + have a starting feasible base. + + */ + bool parse_constraints(dimension_type& new_num_rows, + dimension_type& num_slack_variables, + std::deque& is_tableau_constraint, + std::deque& nonnegative_variable, + std::vector& unfeasible_tableau_rows, + std::deque& satisfied_ineqs); + + /*! \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 *this[k] is 0. + /*! + \param x + The Row that will be combined with \p y object. + + \param y + The Row that will be combined with \p x object. + + \param k + The position of \p *this that have to be \f$0\f$. + + Computes a linear combination of \p x and \p y having + the element of index \p k equal to \f$0\f$. Then it assigns + the resulting Linear_Row to \p x and normalizes it. + */ + static void linear_combine(Row& x, const Row& y, const dimension_type k); + + /*! \brief + 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 0 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 0 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 doesn't 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 true 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 true 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. + */ + 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 previously split variables in the tableau if a nonnegativity + constraint is detected. + + \param var_index + The index of the variable that has to be merged. + + \param nonfeasible_cs + This will contain all the row indexes that are no more satisfied by + the computed generator after merging a variable. + */ + void merge_split_variables(dimension_type var_index, + std::vector& nonfeasible_cs); + + //! Returns true if and only if \p c is satisfied by \p g. + static bool is_satisfied(const Constraint& c, const Generator& g); + + //! Returns true 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); + + bool is_lp_satisfiable() const; + + /*! \brief + Used with MIP_Problems with a non empty `i_vars', + returns true if and if only a MIP problem is satisfiable, + returns false otherwise. + + \param mip + The problem that has to be solved. + + \param p + This will encode the feasible point, only if true is returned. + + \param i_vars + The variables that are constrained to take an integer value. + */ + static bool is_mip_satisfiable(MIP_Problem& mip, Generator& p, + const Variables_Set& i_vars); + + /*! \brief + Returns true if and if only `last_generator' satisfies all the + integrality coditions. + + \param mip + The MIP problem. + + \param i_vars + The variables that are constrained to take an integer value. + + \param branching_index + If false is returned, this will encode the variable index on + which must be applied the `branch and bound' algorithm. + */ + static bool choose_branching_variable(const MIP_Problem& mip, + const Variables_Set& i_vars, + dimension_type& branching_index); +}; + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::MIP_Problem */ +void swap(Parma_Polyhedra_Library::MIP_Problem& x, + Parma_Polyhedra_Library::MIP_Problem& y); + +} // namespace std + +#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..2f55ce6 --- /dev/null +++ b/src/MIP_Problem.inlines.hh @@ -0,0 +1,189 @@ +/* MIP_Problem class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_MIP_Problem_inlines_hh +#define PPL_MIP_Problem_inlines_hh 1 + +#include "Constraint.defs.hh" +#include + +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(y.input_cs), + 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) { + assert(OK()); +} + +inline +MIP_Problem::~MIP_Problem() { +} + + +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; + 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& num, Coefficient& den) const { + const Generator& g = optimizing_point(); + evaluate_objective_function(g, num, den); +} + +inline MIP_Problem::const_iterator +MIP_Problem::constraints_begin() const { + return input_cs.begin(); +} + +inline MIP_Problem::const_iterator +MIP_Problem::constraints_end() const { + return 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 { + used(name); + assert(name == PRICING); + return pricing; +} + +inline void +MIP_Problem::set_control_parameter(Control_Parameter_Value value) { + pricing = value; +} + +inline void +MIP_Problem::swap(MIP_Problem& y) { + std::swap(external_space_dim, y.external_space_dim); + std::swap(internal_space_dim, y.internal_space_dim); + std::swap(tableau, y.tableau); + std::swap(working_cost, y.working_cost); + std::swap(mapping, y.mapping); + std::swap(initialized, y.initialized); + std::swap(base, y.base); + std::swap(status, y.status); + std::swap(pricing, y.pricing); + std::swap(input_cs, y.input_cs); + std::swap(first_pending_constraint, y.first_pending_constraint); + std::swap(input_obj_function, y.input_obj_function); + std::swap(opt_mode, y.opt_mode); + std::swap(last_generator, y.last_generator); + std::swap(i_variables, y.i_variables); +} + +inline MIP_Problem& +MIP_Problem::operator=(const MIP_Problem& y) { + MIP_Problem tmp(y); + swap(tmp); + return *this; +} + +inline void +MIP_Problem::clear() { + MIP_Problem tmp; + swap(tmp); +} + +inline memory_size_type +MIP_Problem::external_memory_in_bytes() const { + memory_size_type n + = tableau.external_memory_in_bytes() + + working_cost.external_memory_in_bytes() + + input_obj_function.external_memory_in_bytes() + + last_generator.external_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()); + // Adding the external memory for `base'. + n += base.capacity() * sizeof(dimension_type); + // Adding the external memory for `mapping'. + n += mapping.capacity() * sizeof(std::pair); + return n; +} + +inline memory_size_type +MIP_Problem::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +/*! \relates Parma_Polyhedra_Library::MIP_Problem */ +inline void +swap(Parma_Polyhedra_Library::MIP_Problem& x, + Parma_Polyhedra_Library::MIP_Problem& y) { + x.swap(y); +} + +} // namespace std + +#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..02446b0 --- /dev/null +++ b/src/MIP_Problem.templates.hh @@ -0,0 +1,158 @@ +/* MIP_Problem class implementation: non-inline template functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_MIP_Problem_templates_hh +#define PPL_MIP_Problem_templates_hh 1 + +#include "Variables_Set.defs.hh" + +namespace Parma_Polyhedra_Library { + +template +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, Row::Flags()), + mapping(), + base(), + status(PARTIALLY_SATISFIABLE), + pricing(PRICING_STEEPEST_EDGE_FLOAT), + initialized(false), + input_cs(), + 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. + 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()); + } + input_cs.push_back(*i); + } + assert(OK()); +} + +template +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, Row::Flags()), + mapping(), + base(), + status(PARTIALLY_SATISFIABLE), + pricing(PRICING_STEEPEST_EDGE_FLOAT), + initialized(false), + input_cs(), + 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. + 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()); + } + input_cs.push_back(*i); + } + 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..b76f106 --- /dev/null +++ b/src/MIP_Problem.types.hh @@ -0,0 +1,32 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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..a115404 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,513 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +# Libtool -version-info for libppl.la. +# +# 1. Start with version information of `0:0:0' for each Libtool library. +# +# 2. Update the version information only immediately before a public +# release of your software. More frequent updates are unnecessary, +# and only guarantee that the current interface number gets larger +# faster. +# +# 3. If the library source code has changed at all since the last +# update, then increment REVISION (`C:R:A' becomes `C:r+1:A'). +# +# 4. If any interfaces have been added, removed, or changed since the +# last update, increment CURRENT, and set REVISION to 0. +# +# 5. If any interfaces have been added since the last public release, +# then increment AGE. +# +# 6. If any interfaces have been removed since the last public release, +# then set AGE to 0. +# +# PPL release -version-info +# 0.1 ----- +# 0.2 ----- +# 0.3 0:0:0 +# 0.4 1:0:1 +# 0.5 2:0:0 +# 0.6 3:0:0 +# 0.7 4:0:0 +# 0.8 5:0:0 +# 0.9 6:0:0 +# 0.10 7:0:0 +# 0.10.1 8:0:1 +# 0.10.2 8:0:1 + +LIBPPL_LT_CURRENT = 8 +LIBPPL_LT_REVISION = 0 +LIBPPL_LT_AGE = 1 + +AM_CPPFLAGS = \ +-I$(top_builddir) \ +-I$(top_srcdir)/src \ +@extra_includes@ + +lib_LTLIBRARIES = libppl.la + +bin_PROGRAMS = ppl-config + +ppl_config_SOURCES = \ +BUGS.cc \ +COPYING.cc \ +CREDITS.cc + +nodist_ppl_config_SOURCES = \ +ppl-config.cc \ +ppl.hh + +ppl_config_LDADD = \ +libppl.la + +if USE_NATIVE_INTEGERS + +COEFFICIENT_TYPES_INCLUDE_FILES = + +COEFFICIENT_DEFS_INCLUDE_FILES = + +endif + +if USE_CHECKED_INTEGERS + +COEFFICIENT_TYPES_INCLUDE_FILES = + +COEFFICIENT_DEFS_INCLUDE_FILES = + +endif + +if USE_GMP_INTEGERS + +COEFFICIENT_TYPES_INCLUDE_FILES = \ + GMP_Integer.types.hh + +COEFFICIENT_DEFS_INCLUDE_FILES = \ + GMP_Integer.defs.hh \ + GMP_Integer.inlines.hh + +endif + +# The ordering of the following list *matters*! +INCLUDE_FILES = \ +namespaces.hh \ +compiler.hh \ +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 \ +Temp.defs.hh \ +Temp.inlines.hh \ +Temp.templates.hh \ +Coefficient_traits_template.hh \ +Checked_Number.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 \ +Row.types.hh \ +Linear_Row.types.hh \ +Matrix.types.hh \ +Variable.types.hh \ +Variables_Set.types.hh \ +Linear_Expression.types.hh \ +Linear_System.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 \ +MIP_Problem.types.hh \ +Poly_Con_Relation.types.hh \ +Poly_Gen_Relation.types.hh \ +BHRZ03_Certificate.types.hh \ +H79_Certificate.types.hh \ +Grid_Certificate.types.hh \ +Polyhedron.types.hh \ +C_Polyhedron.types.hh \ +NNC_Polyhedron.types.hh \ +Grid.types.hh \ +Ptr_Iterator.types.hh \ +DB_Row.types.hh \ +DB_Matrix.types.hh \ +BD_Shape.types.hh \ +OR_Matrix.types.hh \ +Octagonal_Shape.types.hh \ +fpu.types.hh \ +Float.defs.hh \ +Float.inlines.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 \ +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 \ +Interval_Info.defs.hh \ +Interval_Info.inlines.hh \ +Interval_Restriction.defs.hh \ +Interval.defs.hh \ +Interval.inlines.hh \ +Interval.templates.hh \ +Box.defs.hh \ +Box_Status.inlines.hh \ +Box.inlines.hh \ +Box.templates.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.hh \ +Row.defs.hh \ +Row.inlines.hh \ +Linear_Row.defs.hh \ +Linear_Row.inlines.hh \ +Matrix.defs.hh \ +Matrix.inlines.hh \ +Bit_Row.defs.hh \ +Bit_Row.inlines.hh \ +Linear_System.defs.hh \ +Linear_System.inlines.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 \ +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 \ +MIP_Problem.defs.hh \ +MIP_Problem.inlines.hh \ +MIP_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 \ +Polyhedron.defs.hh \ +Ph_Status.inlines.hh \ +Polyhedron.inlines.hh \ +Polyhedron.templates.hh \ +Grid.defs.hh \ +Grid_Status.inlines.hh \ +Grid.inlines.hh \ +Grid.templates.hh \ +C_Polyhedron.defs.hh \ +C_Polyhedron.inlines.hh \ +NNC_Polyhedron.defs.hh \ +NNC_Polyhedron.inlines.hh \ +Widening_Function.types.hh \ +Widening_Function.defs.hh \ +Widening_Function.inlines.hh \ +Ptr_Iterator.defs.hh \ +Ptr_Iterator.inlines.hh \ +DB_Row.defs.hh \ +DB_Row.inlines.hh \ +DB_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 \ +max_space_dimension.hh \ +algorithms.hh \ +wrap.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 = \ +Box.cc \ +checked.cc \ +Checked_Number.cc \ +Float.cc \ +fpu-ia32.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_System.cc \ +Matrix.cc \ +Scalar_Products.cc \ +MIP_Problem.cc \ +Poly_Con_Relation.cc \ +Poly_Gen_Relation.cc \ +BHRZ03_Certificate.cc \ +H79_Certificate.cc \ +Grid_Certificate.cc \ +Polyhedron_nonpublic.cc \ +Polyhedron_public.cc \ +Polyhedron_chdims.cc \ +Polyhedron_widenings.cc \ +C_Polyhedron.cc \ +NNC_Polyhedron.cc \ +Grid_nonpublic.cc \ +Grid_public.cc \ +Grid_chdims.cc \ +Grid_widenings.cc \ +BD_Shape.cc \ +Octagonal_Shape.cc \ +Pointset_Powerset.cc \ +Row.cc \ +Linear_Row.cc \ +Bit_Matrix.cc \ +Bit_Row.cc \ +Ph_Status.cc \ +Grid_Status.cc \ +Variable.cc \ +Variables_Set.cc \ +conversion.cc \ +minimize.cc \ +simplify.cc \ +Grid_conversion.cc \ +Grid_simplify.cc \ +stdiobuf.cc \ +c_streambuf.cc \ +globals.cc \ +mp_std_bits.cc \ +version.cc \ +$(INCLUDE_FILES) \ +$(NESTED_INCLUDE_FILES) \ +swapping_sort.icc \ +wrap.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.cc: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/BUGS + $(top_builddir)/utils/text2cxxarray --name=BUGS_array \ + $(top_srcdir)/BUGS >$@ +COPYING.cc: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/COPYING + $(top_builddir)/utils/text2cxxarray --name=COPYING_array \ + $(top_srcdir)/COPYING >$@ +CREDITS.cc: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/CREDITS + $(top_builddir)/utils/text2cxxarray --name=CREDITS_array \ + $(top_srcdir)/CREDITS >$@ + +else !HAVE_PERL + +ppl.hh: ppl.hh.dist + cp -f $< $@ + +BUGS.cc: BUGS.cc.dist + cp -f $< $@ +COPYING.cc: COPYING.cc.dist + cp -f $< $@ +CREDITS.cc: CREDITS.cc.dist + cp -f $< $@ + +endif !HAVE_PERL + +if USE_PRECOMPILED_HEADERS + +ppl.hh.gch: ppl.hh + $(CXXCOMPILE) -xc++-header -o $@ $< + +PRECOMPILED = ppl.hh.gch + +else + +PRECOMPILED = + +endif + +BUILT_SOURCES = \ +$(include_HEADERS) \ +$(nodist_noinst_HEADERS) \ +$(PRECOMPILED) \ +BUGS.cc \ +COPYING.cc \ +CREDITS.cc + +# ppl.hh is not distributed. +# ppl.hh.dist, which is distributed, is a copy of ppl.hh; +# likewise for BUGS.cc.dist, COPYING.cc.dist and CREDITS.cc.dist. +dist-hook: + mv -f $(distdir)/ppl.hh $(distdir)/ppl.hh.dist + mv -f $(distdir)/BUGS.cc $(distdir)/BUGS.cc.dist + mv -f $(distdir)/COPYING.cc $(distdir)/COPYING.cc.dist + mv -f $(distdir)/CREDITS.cc $(distdir)/CREDITS.cc.dist + +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..df2e99b --- /dev/null +++ b/src/Makefile.in @@ -0,0 +1,1307 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +# Libtool -version-info for libppl.la. +# +# 1. Start with version information of `0:0:0' for each Libtool library. +# +# 2. Update the version information only immediately before a public +# release of your software. More frequent updates are unnecessary, +# and only guarantee that the current interface number gets larger +# faster. +# +# 3. If the library source code has changed at all since the last +# update, then increment REVISION (`C:R:A' becomes `C:r+1:A'). +# +# 4. If any interfaces have been added, removed, or changed since the +# last update, increment CURRENT, and set REVISION to 0. +# +# 5. If any interfaces have been added since the last public release, +# then increment AGE. +# +# 6. If any interfaces have been removed since the last public release, +# then set AGE to 0. +# +# PPL release -version-info +# 0.1 ----- +# 0.2 ----- +# 0.3 0:0:0 +# 0.4 1:0:1 +# 0.5 2:0:0 +# 0.6 3:0:0 +# 0.7 4:0:0 +# 0.8 5:0:0 +# 0.9 6:0:0 +# 0.10 7:0:0 +# 0.10.1 8:0:1 +# 0.10.2 8:0:1 + + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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 = $(am__include_HEADERS_DIST) $(am__noinst_HEADERS_DIST) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/ppl-config.cc.in $(srcdir)/version.hh.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = version.hh ppl-config.cc +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ + "$(DESTDIR)$(includedir)" +libLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(lib_LTLIBRARIES) +libppl_la_DEPENDENCIES = +am__libppl_la_SOURCES_DIST = Box.cc checked.cc Checked_Number.cc \ + Float.cc fpu-ia32.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_System.cc \ + Matrix.cc Scalar_Products.cc MIP_Problem.cc \ + Poly_Con_Relation.cc Poly_Gen_Relation.cc \ + BHRZ03_Certificate.cc H79_Certificate.cc Grid_Certificate.cc \ + Polyhedron_nonpublic.cc Polyhedron_public.cc \ + Polyhedron_chdims.cc Polyhedron_widenings.cc C_Polyhedron.cc \ + NNC_Polyhedron.cc Grid_nonpublic.cc Grid_public.cc \ + Grid_chdims.cc Grid_widenings.cc BD_Shape.cc \ + Octagonal_Shape.cc Pointset_Powerset.cc Row.cc Linear_Row.cc \ + Bit_Matrix.cc Bit_Row.cc Ph_Status.cc Grid_Status.cc \ + Variable.cc Variables_Set.cc conversion.cc minimize.cc \ + simplify.cc Grid_conversion.cc Grid_simplify.cc stdiobuf.cc \ + c_streambuf.cc globals.cc mp_std_bits.cc version.cc \ + namespaces.hh compiler.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 Temp.defs.hh Temp.inlines.hh \ + Temp.templates.hh Coefficient_traits_template.hh \ + Checked_Number.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 Row.types.hh \ + Linear_Row.types.hh Matrix.types.hh Variable.types.hh \ + Variables_Set.types.hh Linear_Expression.types.hh \ + Linear_System.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 MIP_Problem.types.hh \ + Poly_Con_Relation.types.hh Poly_Gen_Relation.types.hh \ + BHRZ03_Certificate.types.hh H79_Certificate.types.hh \ + Grid_Certificate.types.hh Polyhedron.types.hh \ + C_Polyhedron.types.hh NNC_Polyhedron.types.hh Grid.types.hh \ + Ptr_Iterator.types.hh DB_Row.types.hh DB_Matrix.types.hh \ + BD_Shape.types.hh OR_Matrix.types.hh Octagonal_Shape.types.hh \ + fpu.types.hh Float.defs.hh Float.inlines.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 \ + 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 Interval_Info.defs.hh \ + Interval_Info.inlines.hh Interval_Restriction.defs.hh \ + Interval.defs.hh Interval.inlines.hh Interval.templates.hh \ + Box.defs.hh Box_Status.inlines.hh Box.inlines.hh \ + Box.templates.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.hh Row.defs.hh Row.inlines.hh \ + Linear_Row.defs.hh Linear_Row.inlines.hh Matrix.defs.hh \ + Matrix.inlines.hh Bit_Row.defs.hh Bit_Row.inlines.hh \ + Linear_System.defs.hh Linear_System.inlines.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 \ + 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 \ + MIP_Problem.defs.hh MIP_Problem.inlines.hh \ + MIP_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 Polyhedron.defs.hh \ + Ph_Status.inlines.hh Polyhedron.inlines.hh \ + Polyhedron.templates.hh Grid.defs.hh Grid_Status.inlines.hh \ + Grid.inlines.hh Grid.templates.hh C_Polyhedron.defs.hh \ + C_Polyhedron.inlines.hh NNC_Polyhedron.defs.hh \ + NNC_Polyhedron.inlines.hh Widening_Function.types.hh \ + Widening_Function.defs.hh Widening_Function.inlines.hh \ + Ptr_Iterator.defs.hh Ptr_Iterator.inlines.hh DB_Row.defs.hh \ + DB_Row.inlines.hh DB_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 max_space_dimension.hh \ + algorithms.hh wrap.hh Ph_Status.idefs.hh Grid_Status.idefs.hh \ + Box_Status.idefs.hh BDS_Status.idefs.hh Og_Status.idefs.hh \ + swapping_sort.icc wrap.cc +am__objects_1 = +am__objects_2 = $(am__objects_1) $(am__objects_1) +am_libppl_la_OBJECTS = Box.lo checked.lo Checked_Number.lo Float.lo \ + fpu-ia32.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_System.lo \ + Matrix.lo Scalar_Products.lo MIP_Problem.lo \ + Poly_Con_Relation.lo Poly_Gen_Relation.lo \ + BHRZ03_Certificate.lo H79_Certificate.lo Grid_Certificate.lo \ + Polyhedron_nonpublic.lo Polyhedron_public.lo \ + Polyhedron_chdims.lo Polyhedron_widenings.lo C_Polyhedron.lo \ + NNC_Polyhedron.lo Grid_nonpublic.lo Grid_public.lo \ + Grid_chdims.lo Grid_widenings.lo BD_Shape.lo \ + Octagonal_Shape.lo Pointset_Powerset.lo Row.lo Linear_Row.lo \ + Bit_Matrix.lo Bit_Row.lo Ph_Status.lo Grid_Status.lo \ + Variable.lo Variables_Set.lo conversion.lo minimize.lo \ + simplify.lo Grid_conversion.lo Grid_simplify.lo stdiobuf.lo \ + c_streambuf.lo globals.lo mp_std_bits.lo version.lo \ + $(am__objects_2) $(am__objects_1) wrap.lo +libppl_la_OBJECTS = $(am_libppl_la_OBJECTS) +libppl_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(libppl_la_LDFLAGS) $(LDFLAGS) -o $@ +binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) +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 +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libppl_la_SOURCES) $(ppl_config_SOURCES) \ + $(nodist_ppl_config_SOURCES) +DIST_SOURCES = $(am__libppl_la_SOURCES_DIST) $(ppl_config_SOURCES) +am__include_HEADERS_DIST = ppl.hh +includeHEADERS_INSTALL = $(INSTALL_HEADER) +am__noinst_HEADERS_DIST = ppl.hh +HEADERS = $(include_HEADERS) $(nodist_noinst_HEADERS) \ + $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +LIBPPL_LT_CURRENT = 8 +LIBPPL_LT_REVISION = 0 +LIBPPL_LT_AGE = 1 +AM_CPPFLAGS = \ +-I$(top_builddir) \ +-I$(top_srcdir)/src \ +@extra_includes@ + +lib_LTLIBRARIES = libppl.la +ppl_config_SOURCES = \ +BUGS.cc \ +COPYING.cc \ +CREDITS.cc + +nodist_ppl_config_SOURCES = \ +ppl-config.cc \ +ppl.hh + +ppl_config_LDADD = \ +libppl.la + +@USE_CHECKED_INTEGERS_TRUE@COEFFICIENT_TYPES_INCLUDE_FILES = +@USE_GMP_INTEGERS_TRUE@COEFFICIENT_TYPES_INCLUDE_FILES = \ +@USE_GMP_INTEGERS_TRUE@ GMP_Integer.types.hh + +@USE_NATIVE_INTEGERS_TRUE@COEFFICIENT_TYPES_INCLUDE_FILES = +@USE_CHECKED_INTEGERS_TRUE@COEFFICIENT_DEFS_INCLUDE_FILES = +@USE_GMP_INTEGERS_TRUE@COEFFICIENT_DEFS_INCLUDE_FILES = \ +@USE_GMP_INTEGERS_TRUE@ GMP_Integer.defs.hh \ +@USE_GMP_INTEGERS_TRUE@ GMP_Integer.inlines.hh + +@USE_NATIVE_INTEGERS_TRUE@COEFFICIENT_DEFS_INCLUDE_FILES = + +# The ordering of the following list *matters*! +INCLUDE_FILES = \ +namespaces.hh \ +compiler.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 \ +Temp.defs.hh \ +Temp.inlines.hh \ +Temp.templates.hh \ +Coefficient_traits_template.hh \ +Checked_Number.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 \ +Row.types.hh \ +Linear_Row.types.hh \ +Matrix.types.hh \ +Variable.types.hh \ +Variables_Set.types.hh \ +Linear_Expression.types.hh \ +Linear_System.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 \ +MIP_Problem.types.hh \ +Poly_Con_Relation.types.hh \ +Poly_Gen_Relation.types.hh \ +BHRZ03_Certificate.types.hh \ +H79_Certificate.types.hh \ +Grid_Certificate.types.hh \ +Polyhedron.types.hh \ +C_Polyhedron.types.hh \ +NNC_Polyhedron.types.hh \ +Grid.types.hh \ +Ptr_Iterator.types.hh \ +DB_Row.types.hh \ +DB_Matrix.types.hh \ +BD_Shape.types.hh \ +OR_Matrix.types.hh \ +Octagonal_Shape.types.hh \ +fpu.types.hh \ +Float.defs.hh \ +Float.inlines.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 \ +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 \ +Interval_Info.defs.hh \ +Interval_Info.inlines.hh \ +Interval_Restriction.defs.hh \ +Interval.defs.hh \ +Interval.inlines.hh \ +Interval.templates.hh \ +Box.defs.hh \ +Box_Status.inlines.hh \ +Box.inlines.hh \ +Box.templates.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.hh \ +Row.defs.hh \ +Row.inlines.hh \ +Linear_Row.defs.hh \ +Linear_Row.inlines.hh \ +Matrix.defs.hh \ +Matrix.inlines.hh \ +Bit_Row.defs.hh \ +Bit_Row.inlines.hh \ +Linear_System.defs.hh \ +Linear_System.inlines.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 \ +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 \ +MIP_Problem.defs.hh \ +MIP_Problem.inlines.hh \ +MIP_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 \ +Polyhedron.defs.hh \ +Ph_Status.inlines.hh \ +Polyhedron.inlines.hh \ +Polyhedron.templates.hh \ +Grid.defs.hh \ +Grid_Status.inlines.hh \ +Grid.inlines.hh \ +Grid.templates.hh \ +C_Polyhedron.defs.hh \ +C_Polyhedron.inlines.hh \ +NNC_Polyhedron.defs.hh \ +NNC_Polyhedron.inlines.hh \ +Widening_Function.types.hh \ +Widening_Function.defs.hh \ +Widening_Function.inlines.hh \ +Ptr_Iterator.defs.hh \ +Ptr_Iterator.inlines.hh \ +DB_Row.defs.hh \ +DB_Row.inlines.hh \ +DB_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 \ +max_space_dimension.hh \ +algorithms.hh \ +wrap.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 = \ +Box.cc \ +checked.cc \ +Checked_Number.cc \ +Float.cc \ +fpu-ia32.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_System.cc \ +Matrix.cc \ +Scalar_Products.cc \ +MIP_Problem.cc \ +Poly_Con_Relation.cc \ +Poly_Gen_Relation.cc \ +BHRZ03_Certificate.cc \ +H79_Certificate.cc \ +Grid_Certificate.cc \ +Polyhedron_nonpublic.cc \ +Polyhedron_public.cc \ +Polyhedron_chdims.cc \ +Polyhedron_widenings.cc \ +C_Polyhedron.cc \ +NNC_Polyhedron.cc \ +Grid_nonpublic.cc \ +Grid_public.cc \ +Grid_chdims.cc \ +Grid_widenings.cc \ +BD_Shape.cc \ +Octagonal_Shape.cc \ +Pointset_Powerset.cc \ +Row.cc \ +Linear_Row.cc \ +Bit_Matrix.cc \ +Bit_Row.cc \ +Ph_Status.cc \ +Grid_Status.cc \ +Variable.cc \ +Variables_Set.cc \ +conversion.cc \ +minimize.cc \ +simplify.cc \ +Grid_conversion.cc \ +Grid_simplify.cc \ +stdiobuf.cc \ +c_streambuf.cc \ +globals.cc \ +mp_std_bits.cc \ +version.cc \ +$(INCLUDE_FILES) \ +$(NESTED_INCLUDE_FILES) \ +swapping_sort.icc \ +wrap.cc + +#Pointset_Ask_Tell.cc +@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) + +@BUILD_CXX_INTERFACE_TRUE@include_HEADERS = ppl.hh +@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 +@USE_PRECOMPILED_HEADERS_FALSE@PRECOMPILED = +@USE_PRECOMPILED_HEADERS_TRUE@PRECOMPILED = ppl.hh.gch +BUILT_SOURCES = \ +$(include_HEADERS) \ +$(nodist_noinst_HEADERS) \ +$(PRECOMPILED) \ +BUGS.cc \ +COPYING.cc \ +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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +version.hh: $(top_builddir)/config.status $(srcdir)/version.hh.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +ppl-config.cc: $(top_builddir)/config.status $(srcdir)/ppl-config.cc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ + else :; fi; \ + done + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libppl.la: $(libppl_la_OBJECTS) $(libppl_la_DEPENDENCIES) + $(libppl_la_LINK) -rpath $(libdir) $(libppl_la_OBJECTS) $(libppl_la_LIBADD) $(LIBS) +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + if test -f $$p \ + || test -f $$p1 \ + ; then \ + f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ + else :; fi; \ + done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ + rm -f "$(DESTDIR)$(bindir)/$$f"; \ + done + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +ppl-config$(EXEEXT): $(ppl_config_OBJECTS) $(ppl_config_DEPENDENCIES) + @rm -f ppl-config$(EXEEXT) + $(CXXLINK) $(ppl_config_OBJECTS) $(ppl_config_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BD_Shape.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BHRZ03_Certificate.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BUGS.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Bit_Matrix.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Bit_Row.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Box.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/COPYING.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CREDITS.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/C_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Checked_Number.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Coefficient.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Congruence.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Congruence_System.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Constraint.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Constraint_System.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Float.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Generator.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Generator_System.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_Certificate.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_Generator.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_Generator_System.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_Status.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_chdims.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_conversion.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_nonpublic.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_public.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_simplify.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_widenings.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H79_Certificate.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Init.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Linear_Expression.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Linear_Row.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Linear_System.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MIP_Problem.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Matrix.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NNC_Polyhedron.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Octagonal_Shape.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Ph_Status.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Pointset_Powerset.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Poly_Con_Relation.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Poly_Gen_Relation.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Polyhedron_chdims.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Polyhedron_nonpublic.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Polyhedron_public.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Polyhedron_widenings.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Row.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Scalar_Products.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Variable.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Variables_Set.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c_streambuf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/checked.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conversion.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fpu-ia32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/globals.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minimize.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mp_std_bits.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl-config.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplify.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stdiobuf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wrap.Plo@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-includeHEADERS: $(include_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" + @list='$(include_HEADERS)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \ + $(includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \ + done + +uninstall-includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(include_HEADERS)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \ + rm -f "$(DESTDIR)$(includedir)/$$f"; \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) +install-binPROGRAMS: install-libLTLIBRARIES + +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -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 + +info: info-am + +info-am: + +install-data-am: install-includeHEADERS + +install-dvi: install-dvi-am + +install-exec-am: install-binPROGRAMS install-libLTLIBRARIES + +install-html: install-html-am + +install-info: install-info-am + +install-man: + +install-pdf: install-pdf-am + +install-ps: 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: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic clean-libLTLIBRARIES clean-libtool ctags \ + dist-hook distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-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 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 > $@ + +@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 +@HAVE_PERL_TRUE@ $(top_builddir)/utils/build_header \ +@HAVE_PERL_TRUE@ -I $(top_builddir) -I $(top_builddir)/src \ +@HAVE_PERL_TRUE@ $(top_srcdir)/src/ppl_header.hh >$@ + +@HAVE_PERL_TRUE@BUGS.cc: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/BUGS +@HAVE_PERL_TRUE@ $(top_builddir)/utils/text2cxxarray --name=BUGS_array \ +@HAVE_PERL_TRUE@ $(top_srcdir)/BUGS >$@ +@HAVE_PERL_TRUE@COPYING.cc: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/COPYING +@HAVE_PERL_TRUE@ $(top_builddir)/utils/text2cxxarray --name=COPYING_array \ +@HAVE_PERL_TRUE@ $(top_srcdir)/COPYING >$@ +@HAVE_PERL_TRUE@CREDITS.cc: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/CREDITS +@HAVE_PERL_TRUE@ $(top_builddir)/utils/text2cxxarray --name=CREDITS_array \ +@HAVE_PERL_TRUE@ $(top_srcdir)/CREDITS >$@ + +@HAVE_PERL_FALSE@ppl.hh: ppl.hh.dist +@HAVE_PERL_FALSE@ cp -f $< $@ + +@HAVE_PERL_FALSE@BUGS.cc: BUGS.cc.dist +@HAVE_PERL_FALSE@ cp -f $< $@ +@HAVE_PERL_FALSE@COPYING.cc: COPYING.cc.dist +@HAVE_PERL_FALSE@ cp -f $< $@ +@HAVE_PERL_FALSE@CREDITS.cc: CREDITS.cc.dist +@HAVE_PERL_FALSE@ cp -f $< $@ + +@USE_PRECOMPILED_HEADERS_TRUE@ppl.hh.gch: ppl.hh +@USE_PRECOMPILED_HEADERS_TRUE@ $(CXXCOMPILE) -xc++-header -o $@ $< + +# ppl.hh is not distributed. +# ppl.hh.dist, which is distributed, is a copy of ppl.hh; +# likewise for BUGS.cc.dist, COPYING.cc.dist and CREDITS.cc.dist. +dist-hook: + mv -f $(distdir)/ppl.hh $(distdir)/ppl.hh.dist + mv -f $(distdir)/BUGS.cc $(distdir)/BUGS.cc.dist + mv -f $(distdir)/COPYING.cc $(distdir)/COPYING.cc.dist + mv -f $(distdir)/CREDITS.cc $(distdir)/CREDITS.cc.dist + +$(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.cc b/src/Matrix.cc new file mode 100644 index 0000000..19eae9d --- /dev/null +++ b/src/Matrix.cc @@ -0,0 +1,409 @@ +/* Matrix class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Matrix.defs.hh" +#include "Row.defs.hh" +#include +#include +#include + +namespace PPL = Parma_Polyhedra_Library; + +PPL::Matrix::Matrix(const dimension_type n_rows, + const dimension_type n_columns, + Row::Flags row_flags) + : rows((assert(n_rows <= max_num_rows()), + n_rows)), + row_size(n_columns), + row_capacity(compute_capacity(n_columns, max_num_columns())) { + // Construct in direct order: will destroy in reverse order. + for (dimension_type i = 0; i < n_rows; ++i) + rows[i].construct(n_columns, row_capacity, row_flags); + assert(OK()); +} + +void +PPL::Matrix::add_zero_rows(const dimension_type n, Row::Flags row_flags) { + assert(n > 0); + assert(n <= max_num_rows() - num_rows()); + const dimension_type old_num_rows = rows.size(); + const dimension_type new_num_rows = old_num_rows + n; + + if (rows.capacity() < new_num_rows) { + // Reallocation will take place. + std::vector new_rows; + new_rows.reserve(compute_capacity(new_num_rows, max_num_rows())); + new_rows.insert(new_rows.end(), new_num_rows, Row()); + // Construct the new rows. + dimension_type i = new_num_rows; + while (i-- > old_num_rows) + new_rows[i].construct(row_size, row_capacity, row_flags); + // Steal the old rows. + ++i; + while (i-- > 0) + new_rows[i].swap(rows[i]); + // Put the new vector into place. + std::swap(rows, new_rows); + } + else { + // Reallocation will NOT take place. + rows.insert(rows.end(), n, Row()); + for (dimension_type i = new_num_rows; i-- > old_num_rows; ) + rows[i].construct(row_size, row_capacity, row_flags); + } +} + +void +PPL::Matrix::add_zero_columns(const dimension_type n) { + assert(n > 0); + assert(n <= max_num_columns() - num_columns()); + const dimension_type num_rows = rows.size(); + const dimension_type new_num_columns = row_size + n; + + if (new_num_columns <= row_capacity) + // We have enough capacity: we resize existing rows. + for (dimension_type i = num_rows; i-- > 0; ) + rows[i].expand_within_capacity(new_num_columns); + else { + // Capacity exhausted: we must reallocate the rows and + // make sure all the rows have the same capacity. + const dimension_type new_row_capacity + = compute_capacity(new_num_columns, max_num_columns()); + assert(new_row_capacity <= max_num_columns()); + for (dimension_type i = num_rows; i-- > 0; ) { + Row new_row(rows[i], new_num_columns, new_row_capacity); + std::swap(rows[i], new_row); + } + row_capacity = new_row_capacity; + } + // Rows have been expanded. + row_size = new_num_columns; +} + +void +PPL::Matrix::add_zero_rows_and_columns(const dimension_type n, + const dimension_type m, + Row::Flags row_flags) { + assert(n > 0); + assert(n <= max_num_rows() - num_rows()); + assert(m > 0); + assert(m <= max_num_columns() - num_columns()); + const dimension_type old_num_rows = rows.size(); + const dimension_type new_num_rows = old_num_rows + n; + const dimension_type new_num_columns = row_size + m; + + if (new_num_columns <= row_capacity) { + // We can recycle the old rows. + if (rows.capacity() < new_num_rows) { + // Reallocation will take place. + std::vector new_rows; + new_rows.reserve(compute_capacity(new_num_rows, max_num_rows())); + new_rows.insert(new_rows.end(), new_num_rows, Row()); + // Construct the new rows. + dimension_type i = new_num_rows; + while (i-- > old_num_rows) + new_rows[i].construct(new_num_columns, row_capacity, row_flags); + // Expand and steal the old rows. + ++i; + while (i-- > 0) { + rows[i].expand_within_capacity(new_num_columns); + new_rows[i].swap(rows[i]); + } + // Put the new vector into place. + std::swap(rows, new_rows); + } + else { + // Reallocation will NOT take place. + rows.insert(rows.end(), n, Row()); + // Construct the new rows. + dimension_type i = new_num_rows; + while (i-- > old_num_rows) + rows[i].construct(new_num_columns, row_capacity, row_flags); + // Expand the old rows. + ++i; + while (i-- > 0) + rows[i].expand_within_capacity(new_num_columns); + } + row_size = new_num_columns; + } + else { + // We cannot even recycle the old rows. + Matrix new_matrix; + new_matrix.rows.reserve(compute_capacity(new_num_rows, max_num_rows())); + new_matrix.rows.insert(new_matrix.rows.end(), new_num_rows, Row()); + // Construct the new rows. + new_matrix.row_size = new_num_columns; + new_matrix.row_capacity = compute_capacity(new_num_columns, + max_num_columns()); + dimension_type i = new_num_rows; + while (i-- > old_num_rows) + new_matrix.rows[i].construct(new_matrix.row_size, + new_matrix.row_capacity, + row_flags); + // Copy the old rows. + ++i; + while (i-- > 0) { + Row new_row(rows[i], + new_matrix.row_size, + new_matrix.row_capacity); + std::swap(new_matrix.rows[i], new_row); + } + // Put the new vector into place. + swap(new_matrix); + } +} + +void +PPL::Matrix::add_recycled_row(Row& y) { + // The added row must have the same size and capacity as the + // existing rows of the system. + assert(y.OK(row_size, row_capacity)); + const dimension_type new_rows_size = rows.size() + 1; + if (rows.capacity() < new_rows_size) { + // Reallocation will take place. + std::vector new_rows; + new_rows.reserve(compute_capacity(new_rows_size, max_num_rows())); + new_rows.insert(new_rows.end(), new_rows_size, Row()); + // Put the new row in place. + dimension_type i = new_rows_size-1; + std::swap(new_rows[i], y); + // Steal the old rows. + while (i-- > 0) + new_rows[i].swap(rows[i]); + // Put the new rows into place. + std::swap(rows, new_rows); + } + else + // Reallocation will NOT take place. + // Inserts a new empty row at the end, + // then substitutes it with a copy of the given row. + std::swap(*rows.insert(rows.end(), Row()), y); + + assert(OK()); +} + +void +PPL::Matrix::resize_no_copy(const dimension_type new_n_rows, + const dimension_type new_n_columns, + Row::Flags row_flags) { + dimension_type old_n_rows = rows.size(); + // Note that, if we have `new_n_rows <= old_n_rows' and + // `new_n_columns >= row_size', the matrix will keep its sortedness. + // This is obvious if `new_n_columns == row_size'. + // If `new_n_columns > row_size', then sortedness is maintained + // because trailing zeroes will be added to all rows. + if (new_n_rows > old_n_rows) { + if (new_n_columns <= row_capacity) { + // We can recycle the old rows. + if (rows.capacity() < new_n_rows) { + // Reallocation (of vector `rows') will take place. + std::vector new_rows; + new_rows.reserve(compute_capacity(new_n_rows, max_num_rows())); + new_rows.insert(new_rows.end(), new_n_rows, Row()); + // Construct the new rows (be careful: each new row must have + // the same capacity as each one of the old rows). + dimension_type i = new_n_rows; + while (i-- > old_n_rows) + new_rows[i].construct(new_n_columns, row_capacity, row_flags); + // Steal the old rows. + ++i; + while (i-- > 0) + new_rows[i].swap(rows[i]); + // Put the new vector into place. + std::swap(rows, new_rows); + } + else { + // Reallocation (of vector `rows') will NOT take place. + rows.insert(rows.end(), new_n_rows - old_n_rows, Row()); + // Be careful: each new row must have + // the same capacity as each one of the old rows. + for (dimension_type i = new_n_rows; i-- > old_n_rows; ) + rows[i].construct(new_n_columns, row_capacity, row_flags); + } + } + else { + // We cannot even recycle the old rows: allocate a new matrix and swap. + Matrix new_matrix(new_n_rows, new_n_columns, row_flags); + swap(new_matrix); + return; + } + } + else if (new_n_rows < old_n_rows) { + // Drop some rows. + rows.erase(rows.begin() + new_n_rows, rows.end()); + old_n_rows = new_n_rows; + } + // Here we have the right number of rows. + if (new_n_columns != row_size) { + if (new_n_columns < row_size) { + // Shrink the existing rows. + for (dimension_type i = old_n_rows; i-- > 0; ) + rows[i].shrink(new_n_columns); + } + else + // We need more columns. + if (new_n_columns <= row_capacity) + // But we have enough capacity: we resize existing rows. + for (dimension_type i = old_n_rows; i-- > 0; ) + rows[i].expand_within_capacity(new_n_columns); + else { + // Capacity exhausted: we must reallocate the rows and + // make sure all the rows have the same capacity. + const dimension_type new_row_capacity + = compute_capacity(new_n_columns, max_num_columns()); + for (dimension_type i = old_n_rows; i-- > 0; ) { + Row new_row(new_n_columns, new_row_capacity, row_flags); + std::swap(rows[i], new_row); + } + row_capacity = new_row_capacity; + } + // Rows have grown or shrunk. + row_size = new_n_columns; + } +} + +void +PPL::Matrix::ascii_dump(std::ostream& s) const { + const Matrix& x = *this; + dimension_type x_num_rows = x.num_rows(); + dimension_type x_num_columns = x.num_columns(); + s << x_num_rows << " x " << x_num_columns << "\n"; + for (dimension_type i = 0; i < x_num_rows; ++i) + x[i].ascii_dump(s); +} + +PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Matrix) + +bool +PPL::Matrix::ascii_load(std::istream& s) { + Matrix& x = *this; + std::string str; + dimension_type x_num_rows; + dimension_type x_num_cols; + if (!(s >> x_num_rows)) + return false; + if (!(s >> str) || str != "x") + return false; + if (!(s >> x_num_cols)) + return false; + + resize_no_copy(x_num_rows, x_num_cols, Row::Flags()); + + for (dimension_type row = 0; row < x_num_rows; ++row) + if (!x[row].ascii_load(s)) + return false; + + // Check invariants. + assert(OK()); + return true; +} + +void +PPL::Matrix::swap_columns(const dimension_type i, const dimension_type j) { + assert(i != j && i < num_columns() && j < num_columns()); + for (dimension_type k = num_rows(); k-- > 0; ) { + Row& rows_k = rows[k]; + std::swap(rows_k[i], rows_k[j]); + } +} + +void +PPL::Matrix::remove_trailing_columns(const dimension_type n) { + assert(n > 0); + assert(n <= row_size); + row_size -= n; + for (dimension_type i = num_rows(); i-- > 0; ) + rows[i].shrink(row_size); +} + +void +PPL::Matrix::permute_columns(const std::vector& cycles) { + PPL_DIRTY_TEMP_COEFFICIENT(tmp); + const dimension_type n = cycles.size(); + assert(cycles[n - 1] == 0); + for (dimension_type k = num_rows(); k-- > 0; ) { + Row& rows_k = rows[k]; + for (dimension_type i = 0, j = 0; i < n; i = ++j) { + // Make `j' be the index of the next cycle terminator. + while (cycles[j] != 0) + ++j; + // Cycles of length less than 2 are not allowed. + assert(j - i >= 2); + if (j - i == 2) + // For cycles of length 2 no temporary is needed, just a swap. + std::swap(rows_k[cycles[i]], rows_k[cycles[i+1]]); + else { + // Longer cycles need a temporary. + std::swap(rows_k[cycles[j-1]], tmp); + for (dimension_type l = j-1; l > i; --l) + std::swap(rows_k[cycles[l-1]], rows_k[cycles[l]]); + std::swap(tmp, rows_k[cycles[i]]); + } + } + } +} + +/*! \relates Parma_Polyhedra_Library::Matrix */ +bool +PPL::operator==(const Matrix& x, const Matrix& y) { + if (x.num_columns() != y.num_columns()) + return false; + const dimension_type x_num_rows = x.num_rows(); + const dimension_type y_num_rows = y.num_rows(); + if (x_num_rows != y_num_rows) + return false; + for (dimension_type i = x_num_rows; i-- > 0; ) + if (x[i] != y[i]) + return false; + return true; +} + +PPL::memory_size_type +PPL::Matrix::external_memory_in_bytes() const { + memory_size_type n = rows.capacity() * sizeof(Row); + for (dimension_type i = num_rows(); i-- > 0; ) + n += rows[i].external_memory_in_bytes(row_capacity); + return n; +} + +bool +PPL::Matrix::OK() const { + if (row_size > row_capacity) { +#ifndef NDEBUG + std::cerr << "Matrix completely broken: " + << "row_capacity is " << row_capacity + << ", row_size is " << row_size + << std::endl; +#endif + return false; + } + + const Matrix& x = *this; + for (dimension_type i = 0, n_rows = num_rows(); i < n_rows; ++i) + if (!x[i].OK(row_size, row_capacity)) + return false; + + // All checks passed. + return true; +} diff --git a/src/Matrix.defs.hh b/src/Matrix.defs.hh new file mode 100644 index 0000000..e1b70ca --- /dev/null +++ b/src/Matrix.defs.hh @@ -0,0 +1,367 @@ +/* Matrix class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Matrix_defs_hh +#define PPL_Matrix_defs_hh 1 + +#include "Matrix.types.hh" +#include "Row.defs.hh" +#include "Constraint_System.types.hh" +#include "Generator_System.types.hh" +#include "Coefficient.types.hh" +#include +#include + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! A 2-dimensional matrix of coefficients. +/*! \ingroup PPL_CXX_interface + A Matrix object is a sequence of Row objects and is characterized + by the matrix dimensions (the number of rows and columns). + All the rows in a matrix, besides having the same size (corresponding + to the number of columns of the matrix), are also bound to have the + same capacity. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) + +class Parma_Polyhedra_Library::Matrix { +public: + //! Returns the maximum number of rows of a Matrix. + static dimension_type max_num_rows(); + + //! Returns the maximum number of columns of a Matrix. + static dimension_type max_num_columns(); + + //! Builds an empty matrix. + /*! + Rows' size and capacity are initialized to \f$0\f$. + */ + Matrix(); + + //! Builds a zero matrix with specified dimensions and flags. + /*! + \param n_rows + The number of rows of the matrix that will be created; + + \param n_columns + The number of columns of the matrix that will be created. + + \param row_flags + The flags used to build the rows of the matrix; + by default, the rows will have all flags unset. + */ + Matrix(dimension_type n_rows, dimension_type n_columns, + Row::Flags row_flags = Row::Flags()); + + //! Copy-constructor. + Matrix(const Matrix& y); + + //! Destructor. + ~Matrix(); + + //! Assignment operator. + Matrix& operator=(const Matrix& y); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS + //! An iterator over a matrix. + /*! \ingroup PPL_CXX_interface + A const_iterator is used to provide read-only access + to each row contained in a Matrix object. + */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) + class const_iterator { + private: + typedef std::vector::const_iterator Iter; + //! The const iterator on the rows' vector \p rows. + Iter i; + + public: + typedef std::forward_iterator_tag iterator_category; + typedef std::iterator_traits::value_type value_type; + typedef std::iterator_traits::difference_type difference_type; + typedef std::iterator_traits::pointer pointer; + typedef std::iterator_traits::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 true if and only if + \p *this and \p y are identical. + */ + bool operator==(const const_iterator& y) const; + + /*! \brief + Returns true if and only if + \p *this and \p y are different. + */ + bool operator!=(const const_iterator& y) const; + }; + + //! Returns true 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; + + /*! \brief + Returns the const_iterator pointing to the first row, if \p *this is + not empty; otherwise, returns the past-the-end const_iterator. + */ + const_iterator begin() const; + + //! Returns the past-the-end const_iterator. + const_iterator end() const; + + // FIXME: the following section must become private. +protected: + //! Contains the rows of the matrix. + std::vector rows; + + //! Size of the initialized part of each row. + dimension_type row_size; + + //! Capacity allocated for each row. + dimension_type row_capacity; + +public: + //! Swaps \p *this with \p y. + void swap(Matrix& y); + + //! Adds to the matrix \p n rows of zeroes with flags set to \p row_flags. + /*! + \param n + The number of rows to be added: must be strictly positive. + + \param row_flags + Flags for the newly added rows. + + Turns the \f$r \times c\f$ matrix \f$M\f$ into + the \f$(r+n) \times c\f$ matrix \f$\genfrac{(}{)}{0pt}{}{M}{0}\f$. + The matrix is expanded avoiding reallocation whenever possible. + */ + void add_zero_rows(dimension_type n, Row::Flags row_flags); + + //! Adds \p n columns of zeroes to the matrix. + /*! + \param n + The number of columns to be added: must be strictly positive. + + Turns the \f$r \times c\f$ matrix \f$M\f$ into + the \f$r \times (c+n)\f$ matrix \f$(M \, 0)\f$. + The matrix is expanded avoiding reallocation whenever possible. + */ + void add_zero_columns(dimension_type n); + + //! Adds \p n rows and \p m columns of zeroes to the matrix. + /*! + \param n + The number of rows to be added: must be strictly positive. + + \param m + The number of columns to be added: must be strictly positive. + + \param row_flags + Flags for the newly added rows. + + Turns the \f$r \times c\f$ matrix \f$M\f$ into + the \f$(r+n) \times (c+m)\f$ matrix + \f$\bigl(\genfrac{}{}{0pt}{}{M}{0} \genfrac{}{}{0pt}{}{0}{0}\bigr)\f$. + The matrix is expanded avoiding reallocation whenever possible. + */ + void add_zero_rows_and_columns(dimension_type n, dimension_type m, + Row::Flags row_flags); + + //! Adds a copy of the row \p y to the matrix. + /*! + \param y + The row to be copied: it must have the same number of columns as + the matrix. + + Turns the \f$r \times c\f$ matrix \f$M\f$ into + the \f$(r+1) \times c\f$ matrix + \f$\genfrac{(}{)}{0pt}{}{M}{0}\f$. + The matrix is expanded avoiding reallocation whenever possible. + */ + void add_row(const Row& y); + + //! Adds the row \p y to the matrix. + /*! + \param y + The row to be added: it must have the same size and capacity as \p + *this. + + Turns the \f$r \times c\f$ matrix \f$M\f$ into + the \f$(r+1) \times c\f$ matrix + \f$\genfrac{(}{)}{0pt}{}{M}{0}\f$. + The matrix is expanded avoiding reallocation whenever possible. + */ + void add_recycled_row(Row& y); + + //! Makes the matrix shrink by removing its \p n trailing columns. + void remove_trailing_columns(dimension_type n); + + //! Resizes the matrix without worrying about the old contents. + /*! + \param new_n_rows + The number of rows of the resized matrix; + + \param new_n_columns + The number of columns of the resized matrix. + + \param row_flags + The flags of the rows eventually added to the matrix. + + The matrix is expanded to the specified dimensions avoiding + reallocation whenever possible. + The contents of the original matrix is lost. + */ + void resize_no_copy(dimension_type new_n_rows, dimension_type new_n_columns, + Row::Flags row_flags); + + //! Swaps the columns having indexes \p i and \p j. + void swap_columns(dimension_type i, dimension_type j); + + //! Permutes the columns of the matrix. + /* + \param cycles + A vector representing the non-trivial cycles of the permutation + according to which the columns must be rearranged. + + The \p cycles vector contains, one after the other, the + non-trivial cycles (i.e., the cycles of length greater than one) + of a permutation of non-zero column indexes. Each cycle is + terminated by zero. For example, assuming the matrix has 6 + columns, the permutation \f$ \{ 1 \mapsto 3, 2 \mapsto 4, + 3 \mapsto 6, 4 \mapsto 2, 5 \mapsto 5, 6 \mapsto 1 \}\f$ can be + represented by the non-trivial cycles \f$(1 3 6)(2 4)\f$ that, in + turn can be represented by a vector of 6 elements containing 1, 3, + 6, 0, 2, 4, 0. + */ + void permute_columns(const std::vector& cycles); + + //! \name Accessors + //@{ + + //! Returns the number of columns of the matrix (i.e., the size of the rows). + dimension_type num_columns() const; + + //! Returns the number of rows in the matrix. + dimension_type num_rows() const; + //@} // Accessors + + //! \name Subscript operators + //@{ + //! Returns a reference to the \p k-th row of the matrix. + Row& operator[](dimension_type k); + + //! Returns a constant reference to the \p k-th row of the matrix. + const Row& operator[](dimension_type k) const; + //@} // Subscript operators + + //! Clears the matrix deallocating all its rows. + void clear(); + + PPL_OUTPUT_DECLARATIONS + + /*! \brief + Loads from \p s an ASCII representation (as produced by + ascii_dump(std::ostream&) const) and sets \p *this accordingly. + Returns true if successful, false otherwise. + */ + bool ascii_load(std::istream& s); + + //! Returns the total size in bytes of the memory occupied by \p *this. + memory_size_type total_memory_in_bytes() const; + + //! Returns the size in bytes of the memory managed by \p *this. + memory_size_type external_memory_in_bytes() const; + + /*! \brief + Erases from the matrix all the rows but those having + an index less than \p first_to_erase. + */ + void erase_to_end(dimension_type first_to_erase); + + //! Checks if all the invariants are satisfied. + bool OK() const; +}; + +namespace std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS + //! Specializes std::swap. + /*! \relates Parma_Polyhedra_Library::Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +void swap(Parma_Polyhedra_Library::Matrix& x, + Parma_Polyhedra_Library::Matrix& y); + +} // namespace std + + +namespace Parma_Polyhedra_Library { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns true if and only if \p x and \p y are identical. +/*! \relates Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +bool operator==(const Matrix& x, const Matrix& y); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns true if and only if \p x and \p y are different. +/*! \relates Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +bool operator!=(const Matrix& x, const Matrix& y); + +} // namespace Parma_Polyhedra_Library + +#include "Matrix.inlines.hh" + +#endif // !defined(PPL_Matrix_defs_hh) diff --git a/src/Matrix.inlines.hh b/src/Matrix.inlines.hh new file mode 100644 index 0000000..6711d72 --- /dev/null +++ b/src/Matrix.inlines.hh @@ -0,0 +1,218 @@ +/* Matrix class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Matrix_inlines_hh +#define PPL_Matrix_inlines_hh 1 + +#include "globals.defs.hh" +#include +#include + +namespace Parma_Polyhedra_Library { + +inline dimension_type +Matrix::max_num_rows() { + return std::vector().max_size(); +} + +inline dimension_type +Matrix::max_num_columns() { + return Row::max_size(); +} + +inline memory_size_type +Matrix::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +inline +Matrix::const_iterator::const_iterator() + : i(Iter()) { +} + +inline +Matrix::const_iterator::const_iterator(const Iter& b) + : i(b) { +} + +inline +Matrix::const_iterator::const_iterator(const const_iterator& y) + : i(y.i) { +} + +inline Matrix::const_iterator& +Matrix::const_iterator::operator=(const const_iterator& y) { + i = y.i; + return *this; +} + +inline Matrix::const_iterator::reference +Matrix::const_iterator::operator*() const { + return *i; +} + +inline Matrix::const_iterator::pointer +Matrix::const_iterator::operator->() const { + return &*i; +} + +inline Matrix::const_iterator& +Matrix::const_iterator::operator++() { + ++i; + return *this; +} + +inline Matrix::const_iterator +Matrix::const_iterator::operator++(int) { + return const_iterator(i++); +} + +inline bool +Matrix::const_iterator::operator==(const const_iterator& y) const { + return i == y.i; +} + +inline bool +Matrix::const_iterator::operator!=(const const_iterator& y) const { + return !operator==(y); +} + +inline bool +Matrix::has_no_rows() const { + return rows.empty(); +} + +inline Matrix::const_iterator +Matrix::begin() const { + return const_iterator(rows.begin()); +} + +inline Matrix::const_iterator +Matrix::end() const { + return const_iterator(rows.end()); +} + +inline void +Matrix::swap(Matrix& y) { + std::swap(rows, y.rows); + std::swap(row_size, y.row_size); + std::swap(row_capacity, y.row_capacity); +} + +inline +Matrix::Matrix() + : rows(), + row_size(0), + row_capacity(0) { +} + +inline +Matrix::Matrix(const Matrix& y) + : rows(y.rows), + row_size(y.row_size), + row_capacity(compute_capacity(y.row_size, max_num_columns())) { +} + +inline +Matrix::~Matrix() { +} + +inline Matrix& +Matrix::operator=(const Matrix& y) { + // Without the following guard against auto-assignments we would + // recompute the row capacity based on row size, possibly without + // actually increasing the capacity of the rows. This would lead to + // an inconsistent state. + if (this != &y) { + // The following assignment may do nothing on auto-assignments... + rows = y.rows; + row_size = y.row_size; + // ... hence the following assignment must not be done on + // auto-assignments. + row_capacity = compute_capacity(y.row_size, max_num_columns()); + } + return *this; +} + +inline void +Matrix::add_row(const Row& y) { + Row new_row(y, row_capacity); + add_recycled_row(new_row); +} + +inline Row& +Matrix::operator[](const dimension_type k) { + assert(k < rows.size()); + return rows[k]; +} + +inline const Row& +Matrix::operator[](const dimension_type k) const { + assert(k < rows.size()); + return rows[k]; +} + +inline dimension_type +Matrix::num_rows() const { + return rows.size(); +} + +inline dimension_type +Matrix::num_columns() const { + return row_size; +} + +/*! \relates Matrix */ +inline bool +operator!=(const Matrix& x, const Matrix& y) { + return !(x == y); +} + +inline void +Matrix::erase_to_end(const dimension_type first_to_erase) { + assert(first_to_erase <= rows.size()); + if (first_to_erase < rows.size()) + rows.erase(rows.begin() + first_to_erase, rows.end()); +} + +inline void +Matrix::clear() { + // Clear `rows' and minimize its capacity. + std::vector().swap(rows); + row_size = 0; + row_capacity = 0; +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Matrix */ +inline void +swap(Parma_Polyhedra_Library::Matrix& x, + Parma_Polyhedra_Library::Matrix& y) { + x.swap(y); +} + +} // namespace std + +#endif // !defined(PPL_Matrix_inlines_hh) diff --git a/src/Matrix.types.hh b/src/Matrix.types.hh new file mode 100644 index 0000000..1e1a95e --- /dev/null +++ b/src/Matrix.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PPL_Matrix_types_hh +#define PPL_Matrix_types_hh 1 + +namespace Parma_Polyhedra_Library { + +class Matrix; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Matrix_types_hh) diff --git a/src/NNC_Polyhedron.cc b/src/NNC_Polyhedron.cc new file mode 100644 index 0000000..ed128d7 --- /dev/null +++ b/src/NNC_Polyhedron.cc @@ -0,0 +1,92 @@ +/* NNC_Polyhedron class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#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()); + assert(OK()); +} + +PPL::NNC_Polyhedron::NNC_Polyhedron(const Congruence_System& cgs) + : Polyhedron(NOT_NECESSARILY_CLOSED, + cgs.space_dimension() <= max_space_dimension() + ? cgs.space_dimension() + : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED, + "NNC_Polyhedron(cgs)", + "the space dimension of cgs " + "exceeds the maximum allowed " + "space dimension"), 0), + UNIVERSE) { + add_congruences(cgs); + assert(OK()); +} + +PPL::NNC_Polyhedron::NNC_Polyhedron(Congruence_System& cgs, Recycle_Input) + : Polyhedron(NOT_NECESSARILY_CLOSED, + cgs.space_dimension() <= max_space_dimension() + ? cgs.space_dimension() + : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED, + "NNC_Polyhedron" + "(cgs, recycle)", + "the space dimension of cgs " + "exceeds the maximum allowed " + "space dimension"), 0), + UNIVERSE) { + add_congruences(cgs); + assert(OK()); +} + +PPL::NNC_Polyhedron::NNC_Polyhedron(const Grid& grid, Complexity_Class) + : Polyhedron(NOT_NECESSARILY_CLOSED, + grid.space_dimension() <= max_space_dimension() + ? grid.space_dimension() + : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED, + "C_Polyhedron(grid)", + "the space dimension of grid " + "exceeds the maximum allowed " + "space dimension"), 0), + 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..25da8a7 --- /dev/null +++ b/src/NNC_Polyhedron.defs.hh @@ -0,0 +1,255 @@ +/* NNC_Polyhedron class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_NNC_Polyhedron_defs_hh +#define PPL_NNC_Polyhedron_defs_hh 1 + +#include "C_Polyhedron.types.hh" +#include "NNC_Polyhedron.types.hh" +#include "Polyhedron.defs.hh" +#include "Grid.types.hh" + +//! A not necessarily closed convex polyhedron. +/*! \ingroup PPL_CXX_interface + An object of the class NNC_Polyhedron represents a + not necessarily closed (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 const 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 const 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 const 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 const 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 + explicit NNC_Polyhedron(const Box& 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 + explicit NNC_Polyhedron(const BD_Shape& 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 + explicit NNC_Polyhedron(const Octagonal_Shape& 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 true is returned, + otherwise false is returned. + + \exception std::invalid_argument + Thrown if \p *this and \p y are dimension-incompatible. + */ + bool poly_hull_assign_if_exact(const NNC_Polyhedron& y); + + //! Same as poly_hull_assign_if_exact(y). + bool upper_bound_assign_if_exact(const NNC_Polyhedron& y); +}; + +#include "NNC_Polyhedron.inlines.hh" + +#endif // !defined(PPL_NNC_Polyhedron_defs_hh) diff --git a/src/NNC_Polyhedron.inlines.hh b/src/NNC_Polyhedron.inlines.hh new file mode 100644 index 0000000..9a8fdb8 --- /dev/null +++ b/src/NNC_Polyhedron.inlines.hh @@ -0,0 +1,166 @@ +/* NNC_Polyhedron class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_NNC_Polyhedron_inlines_hh +#define PPL_NNC_Polyhedron_inlines_hh 1 + +#include "C_Polyhedron.defs.hh" + +namespace Parma_Polyhedra_Library { + +inline +NNC_Polyhedron::~NNC_Polyhedron() { +} + +inline +NNC_Polyhedron::NNC_Polyhedron(dimension_type num_dimensions, + Degenerate_Element kind) + : Polyhedron(NOT_NECESSARILY_CLOSED, + num_dimensions <= max_space_dimension() + ? num_dimensions + : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED, + "NNC_Polyhedron(n, k)", + "n exceeds the maximum " + "allowed space dimension"), + num_dimensions), + kind) { +} + +inline +NNC_Polyhedron::NNC_Polyhedron(const Constraint_System& cs) + : Polyhedron(NOT_NECESSARILY_CLOSED, + cs.space_dimension() <= max_space_dimension() + ? cs + : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED, + "NNC_Polyhedron(cs)", + "the space dimension of cs " + "exceeds the maximum allowed " + "space dimension"), cs)) { +} + +inline +NNC_Polyhedron::NNC_Polyhedron(Constraint_System& cs, Recycle_Input) + : Polyhedron(NOT_NECESSARILY_CLOSED, + cs.space_dimension() <= max_space_dimension() + ? cs + : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED, + "NNC_Polyhedron(cs, recycle)", + "the space dimension of cs " + "exceeds the maximum allowed " + "space dimension"), cs), + Recycle_Input()) { +} + +inline +NNC_Polyhedron::NNC_Polyhedron(const Generator_System& gs) + : Polyhedron(NOT_NECESSARILY_CLOSED, + gs.space_dimension() <= max_space_dimension() + ? gs + : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED, + "NNC_Polyhedron(gs)", + "the space dimension of gs " + "exceeds the maximum allowed " + "space dimension"), gs)) { +} + +inline +NNC_Polyhedron::NNC_Polyhedron(Generator_System& gs, Recycle_Input) + : Polyhedron(NOT_NECESSARILY_CLOSED, + gs.space_dimension() <= max_space_dimension() + ? gs + : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED, + "NNC_Polyhedron(gs, recycle)", + "the space dimension of gs " + "exceeds the maximum allowed " + "space dimension"), gs), + Recycle_Input()) { +} + +template +inline +NNC_Polyhedron::NNC_Polyhedron(const Box& box, Complexity_Class) + : Polyhedron(NOT_NECESSARILY_CLOSED, + box.space_dimension() <= max_space_dimension() + ? box + : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED, + "NNC_Polyhedron(box)", + "the space dimension of box " + "exceeds the maximum allowed " + "space dimension"), box)) { +} + +template +inline +NNC_Polyhedron::NNC_Polyhedron(const BD_Shape& bd, Complexity_Class) + : Polyhedron(NOT_NECESSARILY_CLOSED, + bd.space_dimension() <= max_space_dimension() + ? bd.space_dimension() + : (throw_space_dimension_overflow(NECESSARILY_CLOSED, + "NNC_Polyhedron(bd): ", + "the space dimension of bd " + "exceeds the maximum allowed " + "space dimension"), 0), + UNIVERSE) { + add_constraints(bd.constraints()); +} + +template +inline +NNC_Polyhedron::NNC_Polyhedron(const Octagonal_Shape& os, Complexity_Class) + : Polyhedron(NOT_NECESSARILY_CLOSED, + os.space_dimension() <= max_space_dimension() + ? os.space_dimension() + : (throw_space_dimension_overflow(NECESSARILY_CLOSED, + "NNC_Polyhedron(os): ", + "the space dimension of os " + "exceeds the maximum allowed " + "space dimension"), 0), + 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); + 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); +} + +} // 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..a8b586d --- /dev/null +++ b/src/NNC_Polyhedron.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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..7c3889e --- /dev/null +++ b/src/Numeric_Format.defs.hh @@ -0,0 +1,37 @@ +/* Numeric format. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Numeric_Format_defs_hh +#define PPL_Numeric_Format_defs_hh 1 + +#include "Result.defs.hh" +#include "fpu.defs.hh" + +namespace Parma_Polyhedra_Library { + +class Numeric_Format { +}; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Float_defs_hh) + diff --git a/src/OR_Matrix.defs.hh b/src/OR_Matrix.defs.hh new file mode 100644 index 0000000..0e3ceec --- /dev/null +++ b/src/OR_Matrix.defs.hh @@ -0,0 +1,607 @@ +/* OR_Matrix class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#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 +#include + +#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 true, 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 true if and only if \p x and \p y are identical. +/*! \relates OR_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +bool operator==(const OR_Matrix& x, const OR_Matrix& 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 +std::ostream& +operator<<(std::ostream& s, const OR_Matrix& 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: + +

+         _ _
+   0    |_|_|
+   1    |_|_|_ _
+   2    |_|_|_|_|
+   3    |_|_|_|_|_ _
+   4    |_|_|_|_|_|_|
+   5    |_|_|_|_|_|_|
+         . . .
+         _ _ _ _ _ _       _
+ 2n-2   |_|_|_|_|_|_| ... |_|
+ 2n-1   |_|_|_|_|_|_| ... |_|
+         0 1 2 3 4 5  ... 2n-1
+
+
+ + 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 +class Parma_Polyhedra_Library::OR_Matrix { +private: + /*! \brief + An object that behaves like a matrix's row with respect to + the subscript operators. + */ + template + 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 + Pseudo_Row(const Pseudo_Row& 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 template + friend class OR_Matrix::Pseudo_Row; + template template + friend class OR_Matrix::any_row_iterator; +#else + template friend class Pseudo_Row; + template 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 row_reference_type; + + //! A const reference to a matrix's row. + typedef Pseudo_Row const_row_reference_type; + +private: + /*! \brief + A template class to derive both OR_Matrix::iterator + and OR_Matrix::const_iterator. + */ + template + class any_row_iterator { + public: + typedef std::random_access_iterator_tag iterator_category; + typedef Pseudo_Row value_type; + typedef long difference_type; + typedef const Pseudo_Row* pointer; + typedef const Pseudo_Row& 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 + any_row_iterator(const any_row_iterator& y); + + /*! \brief + Assignment operator allowing the assignment of a non-const iterator + to a const_iterator. + */ + template + any_row_iterator& operator=(const any_row_iterator& 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-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 difference of \p *this and \p m. + any_row_iterator operator-(difference_type m) const; + + //! Returns true if and only if \p *this is equal to \p y. + bool operator==(const any_row_iterator& y) const; + + /*! \brief + Returns true if and only if \p *this + is different from \p y. + */ + bool operator!=(const any_row_iterator& y) const; + + //! Returns true if and only if \p *this is less than \p y. + bool operator<(const any_row_iterator& y) const; + + /*! \brief + Returns true if and only if \p *this is less than + or equal to \p y. + */ + bool operator<=(const any_row_iterator& y) const; + + //! Returns true if and only if \p *this is greater than \p y. + bool operator>(const any_row_iterator& y) const; + + /*! \brief + Returns true 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 value; + + //! External index. + dimension_type e; + + //! Internal index: i = (e+1)*(e+1)/2. + 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 template + friend class OR_Matrix::any_row_iterator; +#else + template friend class any_row_iterator; +#endif + }; // class any_row_iterator + +public: + //! A (non const) row iterator. + typedef any_row_iterator row_iterator; + + //! A const row iterator. + typedef any_row_iterator const_row_iterator; + + //! A (non const) element iterator. + typedef typename DB_Row::iterator element_iterator; + + //! A const element iterator. + typedef typename DB_Row::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 space_dim + The space dimension of the matrix that will be created. + + This constructor creates a matrix with \p 2*space_dim rows. + Each element is initialized to plus infinity. + */ + OR_Matrix(dimension_type space_dim); + + //! Copy-constructor. + OR_Matrix(const OR_Matrix& y); + + //! Constructs a conservative approximation of \p y. + template + explicit OR_Matrix(const OR_Matrix& y); + + //! Destructor. + ~OR_Matrix(); + + //! Assignment operator. + OR_Matrix& operator=(const OR_Matrix& y); + +private: + template 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 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 vec 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 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 true if successful, false 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==(const OR_Matrix& x, const OR_Matrix& y); + + //! Checks if all the invariants are satisfied. + bool OK() const; +}; + +namespace std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::OR_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +void swap(Parma_Polyhedra_Library::OR_Matrix& x, + Parma_Polyhedra_Library::OR_Matrix& y); + +} // namespace std + + +namespace Parma_Polyhedra_Library { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns true if and only if \p x and \p y are different. +/*! \relates OR_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +bool operator!=(const OR_Matrix& x, const OR_Matrix& 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 true; returns false 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 +bool rectilinear_distance_assign(Checked_Number& r, + const OR_Matrix& x, + const OR_Matrix& 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 true; returns false 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 +bool euclidean_distance_assign(Checked_Number& r, + const OR_Matrix& x, + const OR_Matrix& 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 true; returns false 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 +bool l_infinity_distance_assign(Checked_Number& r, + const OR_Matrix& x, + const OR_Matrix& 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..9124dd1 --- /dev/null +++ b/src/OR_Matrix.inlines.hh @@ -0,0 +1,715 @@ +/* OR_Matrix class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#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 +#include +#include "checked.defs.hh" + +namespace Parma_Polyhedra_Library { + +template +inline dimension_type +OR_Matrix::row_first_element_index(const dimension_type k) { + return ((k+1)*(k+1))/2; +} + +template +inline dimension_type +OR_Matrix::row_size(const dimension_type k) { + return k + 2 - k%2; +} + +#if PPL_OR_MATRIX_EXTRA_DEBUG + +template +template +inline dimension_type +OR_Matrix::Pseudo_Row::size() const { + return size_; +} + +#endif // PPL_OR_MATRIX_EXTRA_DEBUG + +template +template +inline +OR_Matrix::Pseudo_Row::Pseudo_Row() + : first(0) +#if PPL_OR_MATRIX_EXTRA_DEBUG + , size_(0) +#endif +{ +} + +template +template +inline +OR_Matrix::Pseudo_Row::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 +template +template +inline +OR_Matrix::Pseudo_Row::Pseudo_Row(const Pseudo_Row& y) + : first(y.first) +#if PPL_OR_MATRIX_EXTRA_DEBUG + , size_(y.size_) +#endif +{ +} + +template +template +inline OR_Matrix::Pseudo_Row& +OR_Matrix::Pseudo_Row::operator=(const Pseudo_Row& y) { + first = y.first; +#if PPL_OR_MATRIX_EXTRA_DEBUG + size_ = y.size_; +#endif + return *this; +} + +template +template +inline +OR_Matrix::Pseudo_Row::~Pseudo_Row() { +} + +template +template +inline U& +OR_Matrix::Pseudo_Row::operator[](const dimension_type k) const { +#if PPL_OR_MATRIX_EXTRA_DEBUG + assert(k < size_); +#endif + return *(first + k); +} + +template +template +inline +OR_Matrix::any_row_iterator +::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 +template +inline +OR_Matrix::any_row_iterator::any_row_iterator(U& base) + : value(base +#if PPL_OR_MATRIX_EXTRA_DEBUG + , OR_Matrix::row_size(0) +#endif + ), + e(0), + i(0) { +} + +template +template +template +inline +OR_Matrix::any_row_iterator +::any_row_iterator(const any_row_iterator& y) + : value(y.value), + e(y.e), + i(y.i) { +} + +template +template +template +inline typename OR_Matrix::template any_row_iterator& +OR_Matrix::any_row_iterator::operator=(const any_row_iterator& y) { + value = y.value; + e = y.e; + i = y.i; + return *this; +} + +template +template +inline typename OR_Matrix::template any_row_iterator::reference +OR_Matrix::any_row_iterator::operator*() const { + return value; +} + +template +template +inline typename OR_Matrix::template any_row_iterator::pointer +OR_Matrix::any_row_iterator::operator->() const { + return &value; +} + +template +template +inline typename OR_Matrix::template any_row_iterator& +OR_Matrix::any_row_iterator::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 +template +inline typename OR_Matrix::template any_row_iterator +OR_Matrix::any_row_iterator::operator++(int) { + any_row_iterator old = *this; + ++(*this); + return old; +} + +template +template +inline typename OR_Matrix::template any_row_iterator& +OR_Matrix::any_row_iterator::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 +template +inline typename OR_Matrix::template any_row_iterator +OR_Matrix::any_row_iterator::operator--(int) { + any_row_iterator old = *this; + --(*this); + return old; +} + +template +template +inline typename OR_Matrix::template any_row_iterator& +OR_Matrix::any_row_iterator::operator+=(const difference_type m) { + difference_type increment = m + m*m/2 + m*e; + if (e % 2 == 0 && m % 2 != 0) + ++increment; + e += m; + i += increment; + value.first += increment; +#if PPL_OR_MATRIX_EXTRA_DEBUG + value.size_ += (m - m%2); +#endif + return *this; +} + +template +template +inline typename OR_Matrix::template any_row_iterator& +OR_Matrix::any_row_iterator::operator-=(difference_type m) { + return *this += -m; +} + +template +template +inline typename OR_Matrix::template any_row_iterator::difference_type +OR_Matrix::any_row_iterator::operator-(const any_row_iterator& y) const { + return e - y.e; +} + +template +template +inline typename OR_Matrix::template any_row_iterator +OR_Matrix::any_row_iterator::operator+(difference_type m) const { + any_row_iterator r = *this; + r += m; + return r; +} + +template +template +inline typename OR_Matrix::template any_row_iterator +OR_Matrix::any_row_iterator::operator-(const difference_type m) const { + any_row_iterator r = *this; + r -= m; + return r; +} + +template +template +inline bool +OR_Matrix::any_row_iterator +::operator==(const any_row_iterator& y) const { + return e == y.e; +} + +template +template +inline bool +OR_Matrix::any_row_iterator +::operator!=(const any_row_iterator& y) const { + return e != y.e; +} + +template +template +inline bool +OR_Matrix::any_row_iterator::operator<(const any_row_iterator& y) const { + return e < y.e; +} + +template +template +inline bool +OR_Matrix::any_row_iterator +::operator<=(const any_row_iterator& y) const { + return e <= y.e; +} + +template +template +inline bool +OR_Matrix::any_row_iterator::operator>(const any_row_iterator& y) const { + return e > y.e; +} + +template +template +inline bool +OR_Matrix::any_row_iterator +::operator>=(const any_row_iterator& y) const { + return e >= y.e; +} + +template +template +inline dimension_type +OR_Matrix::any_row_iterator::row_size() const { + return OR_Matrix::row_size(e); +} + +template +template +inline dimension_type +OR_Matrix::any_row_iterator::index() const { + return e; +} + +template +inline typename OR_Matrix::row_iterator +OR_Matrix::row_begin() { + return num_rows() == 0 ? row_iterator(0) : row_iterator(vec[0]); +} + +template +inline typename OR_Matrix::row_iterator +OR_Matrix::row_end() { + return row_iterator(num_rows()); +} + +template +inline typename OR_Matrix::const_row_iterator +OR_Matrix::row_begin() const { + return num_rows() == 0 ? const_row_iterator(0) : const_row_iterator(vec[0]); +} + +template +inline typename OR_Matrix::const_row_iterator +OR_Matrix::row_end() const { + return const_row_iterator(num_rows()); +} + +template +inline typename OR_Matrix::element_iterator +OR_Matrix::element_begin() { + return vec.begin(); +} + +template +inline typename OR_Matrix::element_iterator +OR_Matrix::element_end() { + return vec.end(); +} + +template +inline typename OR_Matrix::const_element_iterator +OR_Matrix::element_begin() const { + return vec.begin(); +} + +template +inline typename OR_Matrix::const_element_iterator +OR_Matrix::element_end() const { + return vec.end(); +} + +template +inline void +OR_Matrix::swap(OR_Matrix& y) { + std::swap(vec, y.vec); + std::swap(space_dim, y.space_dim); + std::swap(vec_capacity, y.vec_capacity); +} + +//! Returns the integer square root of \p x. +inline unsigned long +isqrt(unsigned long x) { + unsigned long r = 0; + for (unsigned long t = 0x40000000; t; t >>= 2) { + unsigned long s = r + t; + if (s <= x) { + x -= s; + r = s + t; + } + r >>= 1; + } + return r; +} + +template +inline dimension_type +OR_Matrix::max_num_rows() { + // Compute the maximum number of rows that are contained in a DB_Row + // that allocates a pseudo-triangular matrix. + dimension_type k = isqrt(2*DB_Row::max_size() + 1); + return (k - 1) - (k - 1)%2; +} + +template +inline memory_size_type +OR_Matrix::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +template +inline +OR_Matrix::OR_Matrix(const dimension_type dim) + : vec(2*dim*(dim+1)), + space_dim(dim), + vec_capacity(vec.size()) { +} + +template +inline +OR_Matrix::~OR_Matrix() { +} + +template +inline typename OR_Matrix::row_reference_type +OR_Matrix::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 +inline typename OR_Matrix::const_row_reference_type +OR_Matrix::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 +inline dimension_type +OR_Matrix::space_dimension() const { + return space_dim; +} + +template +inline dimension_type +OR_Matrix::num_rows() const { + return 2*space_dimension(); +} + +template +inline void +OR_Matrix::clear() { + OR_Matrix(0).swap(*this); +} + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates OR_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +inline bool +operator==(const OR_Matrix& x, const OR_Matrix& 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 +inline bool +operator!=(const OR_Matrix& x, const OR_Matrix& y) { + return !(x == y); +} + +template +inline +OR_Matrix::OR_Matrix(const OR_Matrix& y) + : vec(y.vec), + space_dim(y.space_dim), + vec_capacity(compute_capacity(y.vec.size(), + DB_Row::max_size())) { +} + +template +template +inline +OR_Matrix::OR_Matrix(const OR_Matrix& y) + : vec(), + space_dim(y.space_dim), + vec_capacity(compute_capacity(y.vec.size(), + DB_Row::max_size())) { + vec.construct_upward_approximation(y.vec, vec_capacity); + assert(OK()); +} + +template +inline OR_Matrix& +OR_Matrix::operator=(const OR_Matrix& y) { + vec = y.vec; + space_dim = y.space_dim; + vec_capacity = compute_capacity(y.vec.size(), DB_Row::max_size()); + return *this; +} + +template +inline void +OR_Matrix::grow(const dimension_type new_dim) { + 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 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); + swap(new_matrix); + } + } +} + +template +inline void +OR_Matrix::shrink(const dimension_type new_dim) { + 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 +inline void +OR_Matrix::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 new_matrix(new_dim); + 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 +inline bool +l_m_distance_assign(Checked_Number& r, + const OR_Matrix& x, + const OR_Matrix& 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::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); + 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 +inline bool +rectilinear_distance_assign(Checked_Number& r, + const OR_Matrix& x, + const OR_Matrix& y, + const Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2) { + return + l_m_distance_assign >(r, x, y, + dir, + tmp0, + tmp1, + tmp2); +} + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates OR_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +inline bool +euclidean_distance_assign(Checked_Number& r, + const OR_Matrix& x, + const OR_Matrix& y, + const Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2) { + return + l_m_distance_assign >(r, x, y, + dir, + tmp0, + tmp1, + tmp2); +} + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates OR_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +inline bool +l_infinity_distance_assign(Checked_Number& r, + const OR_Matrix& x, + const OR_Matrix& y, + const Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2) { + return + l_m_distance_assign >(r, x, y, + dir, + tmp0, + tmp1, + tmp2); +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +/*! \relates Parma_Polyhedra_Library::OR_Matrix */ +template +inline void +swap(Parma_Polyhedra_Library::OR_Matrix& x, + Parma_Polyhedra_Library::OR_Matrix& y) { + x.swap(y); +} + +} // namespace std + + +#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..da03cda --- /dev/null +++ b/src/OR_Matrix.templates.hh @@ -0,0 +1,123 @@ +/* OR_Matrix class implementation: non-inline template functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_OR_Matrix_templates_hh +#define PPL_OR_Matrix_templates_hh 1 + +#include + +namespace Parma_Polyhedra_Library { + +template +memory_size_type +OR_Matrix::external_memory_in_bytes() const{ + return vec.external_memory_in_bytes(); +} + +template +bool +OR_Matrix::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 +void +OR_Matrix::ascii_dump(std::ostream& s) const { + const OR_Matrix& 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) + +template +bool +OR_Matrix::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 (r != V_EQ || is_minus_infinity(r_i[j])) + return false; + } + } + assert(OK()); + return true; +} + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates Parma_Polyhedra_Library::OR_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +std::ostream& +IO_Operators::operator<<(std::ostream& s, const OR_Matrix& m) { + for (typename OR_Matrix::const_row_iterator m_iter = m.row_begin(), + m_end = m.row_end(); m_iter != m_end; ++m_iter) { + typename OR_Matrix::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..336fc7b --- /dev/null +++ b/src/OR_Matrix.types.hh @@ -0,0 +1,22 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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 +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..c282baf --- /dev/null +++ b/src/Octagonal_Shape.cc @@ -0,0 +1,100 @@ +/* Octagonal_Shape class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include +#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::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. + assert(c.space_dimension() == c_space_dim); + assert(c_num_vars == 0 && c_first_var == 0 && c_second_var == 0); + // Store the indices of the non-zero components of `c', + dimension_type non_zero_index[2] = { 0, 0 }; + // Collect the non-zero components of `c'. + for (dimension_type i = c_space_dim; i-- > 0; ) + if (c.coefficient(Variable(i)) != 0) { + if (c_num_vars <= 1) + non_zero_index[c_num_vars++] = i; + else + // Constraint `c' is not an octagonal difference. + return false; + } + + // Make sure that `c' is indeed an octagonal difference, + // i.e., it has one of the following forms: + // 0 <=/= b, if c_num_vars == 0; + // (+/-) a*x <=/= b, if c_num_vars == 1; + // (+/-) a*x (+/-) a*y <=/= b, if c_num_vars == 2. + c_term = c.inhomogeneous_term(); + switch (c_num_vars) { + case 2: + { + const Coefficient& c0 = c.coefficient(Variable(non_zero_index[0])); + const Coefficient& c1 = c.coefficient(Variable(non_zero_index[1])); + if (c0 != c1 && c0 != -c1) + // Constraint `c' is not an octagonal difference. + return false; + c_first_var = non_zero_index[0]; + c_second_var = non_zero_index[1]; + c_first_var *= 2; + if (sgn(c0) < 0) + ++c_first_var; + c_second_var *= 2; + if (sgn(c1) > 0) + ++c_second_var; + c_coeff = c0; + } + break; + case 1: + { + c_term *= 2; + c_first_var = non_zero_index[0]; + c_first_var *= 2; + if (sgn(c.coefficient(Variable(non_zero_index[0]))) < 0) { + c_second_var = c_first_var; + ++c_first_var; + } + else + c_second_var = c_first_var + 1; + c_coeff = c.coefficient(Variable(non_zero_index[0])); + } + break; + default: + assert(c_num_vars == 0); + break; + } + return true; +} + diff --git a/src/Octagonal_Shape.defs.hh b/src/Octagonal_Shape.defs.hh new file mode 100644 index 0000000..f2192c8 --- /dev/null +++ b/src/Octagonal_Shape.defs.hh @@ -0,0 +1,2016 @@ +/* Octagonal_Shape class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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 +#include +#include +#include + +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: + false is written if \p oct is an empty polyhedron; + true is written if \p oct is a universe polyhedron; + a system of constraints defining \p oct is written otherwise, + all constraints separated by ", ". +*/ +template +std::ostream& +operator<<(std::ostream& s, const Octagonal_Shape& oct); + +} // namespace IO_Operators + +/*! \brief + Returns true 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 false is returned. +*/ +template +bool operator==(const Octagonal_Shape& x, const Octagonal_Shape& y); + +/*! \brief + Returns true 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 true is returned. +*/ +template +bool operator!=(const Octagonal_Shape& x, const Octagonal_Shape& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool rectilinear_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool rectilinear_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& 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 true; + returns false 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 +bool rectilinear_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool euclidean_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool euclidean_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& 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 true; + returns false 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 +bool euclidean_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool l_infinity_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool l_infinity_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& 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 true; + returns false 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 +bool l_infinity_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& y, + Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Decodes the constraint \p c as an octagonal difference. +/*! \relates Octagonal_Shape + \return + true if the constraint \p c is an octagonal difference; + false otherwise. + + \param c + The constraint to be decoded. + + \param c_space_dim + The space dimension of the constraint \p c (it is assumed + to match the actual space dimension of \p c). + + \param c_num_vars + If true 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 true 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 true 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 true 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 true 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) +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); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns the index coherent to \p i. +/*! \relates Octagonal_Shape */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +dimension_type coherent_index(dimension_type i); + +} // namespace Parma_Polyhedra_Library + +//! An octagonal shape. +/*! \ingroup PPL_CXX_interface + The class template Octagonal_Shape allows for the efficient + representation of a restricted kind of topologically closed + convex polyhedra called octagonal shapes (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 octagonal constraints. + + 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 rounding-aware + 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 optimally supports: + - 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 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 oct(cs); + \endcode +*/ +template +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 N; +#else + typedef Checked_Number 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& x, + Complexity_Class complexity = ANY_COMPLEXITY); + + //! Builds a conservative, upward approximation of \p y. + /*! + The complexity argument is ignored. + */ + template + explicit Octagonal_Shape(const Octagonal_Shape& 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 constraints: constraints that are not + \ref Octagonal_Shapes "octagonal constraints" + are ignored (even though they may have contributed + to the space dimension). + + \exception std::invalid_argument + Thrown if the system of constraints \p cs contains strict inequalities. + */ + 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: some elements may be safely ignored. + */ + 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 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 + explicit Octagonal_Shape(const Box& 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 + explicit Octagonal_Shape(const BD_Shape& 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 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 true 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 true 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 true 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 true if and only if \p *this is an empty OS. + bool is_empty() const; + + //! Returns true if and only if \p *this is a universe OS. + bool is_universe() const; + + //! Returns true if and only if \p *this is discrete. + bool is_discrete() const; + + /*! \brief + Returns true if and only if \p *this + is a bounded OS. + */ + bool is_bounded() const; + + /*! \brief + Returns true if and only if \p *this + is a topologically closed subset of the vector space. + */ + bool is_topologically_closed() const; + + /*! \brief + Returns true if and only if \p *this + contains (at least) an integer point. + */ + bool contains_integer_point() const; + + /*! \brief + Returns true 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 true 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 true 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 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 + true 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, + false 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 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 + 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 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, + false 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 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 + true 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, + false 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 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 + 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 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, + false 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; + + //! 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 + 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 to_be_unconstrained, + assigning the result to \p *this. + + \param to_be_unconstrained + 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 to_be_removed. + */ + void unconstrain(const Variables_Set& to_be_unconstrained); + + //! 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 true is returned, + otherwise false is returned. + + \exception std::invalid_argument + Thrown if \p *this and \p y are dimension-incompatible. + */ + bool 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()); + + /*! \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); + + //! 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 must 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 must 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 + 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 must 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 must 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 must 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 must 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 max_space_dimension(). + */ + void concatenate_assign(const Octagonal_Shape& y); + + //! Removes all the specified dimensions. + /*! + \param to_be_removed + The set of Variable objects corresponding to the dimensions to be removed. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with one of the Variable + objects contained in \p to_be_removed. + */ + void remove_space_dimensions(const Variables_Set& to_be_removed); + + /*! \brief + Removes the higher dimensions so that the resulting space + will have dimension \p new_dimension. + + \exception std::invalid_argument + Thrown if \p new_dimension is greater than the space dimension + of \p *this. + */ + void remove_higher_space_dimensions(dimension_type new_dimension); + + /*! \brief + Remaps the dimensions of the vector space according to + a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function". + + \param pfunc + The partial function specifying the destiny of each dimension. + + The template class Partial_Function must provide the following + methods. + \code + bool has_empty_codomain() const + \endcode + returns true if and only if the represented partial + function has an empty codomain (i.e., it is always undefined). + The has_empty_codomain() method will always be called + before the methods below. However, if + has_empty_codomain() returns true, 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 true is returned. + If \f$f\f$ is undefined in \f$k\f$, then false 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 + 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 max_space_dimension(). + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + and var has space dimension \f$k \leq n\f$, + then the \f$k\f$-th space dimension is + \ref expand_space_dimension "expanded" to \p m new space dimensions + \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$. + */ + void expand_space_dimension(Variable var, dimension_type m); + + //! Folds the space dimensions in \p to_be_folded into \p var. + /*! + \param to_be_folded + The set of Variable objects corresponding to the space dimensions + to be folded; + + \param var + The variable corresponding to the space dimension that is the + destination of the folding operation. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with \p var or with + one of the Variable objects contained in \p to_be_folded. + Also thrown if \p var is contained in \p to_be_folded. + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + var has space dimension \f$k \leq n\f$, + \p to_be_folded is a set of variables whose maximum space dimension + is also less than or equal to \f$n\f$, and \p var is not a member + of \p to_be_folded, then the space dimensions corresponding to + variables in \p to_be_folded are \ref fold_space_dimensions "folded" + into the \f$k\f$-th space dimension. + */ + void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var); + + //@} // Member Functions that May Modify the Dimension of the Vector Space + + 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 true if successful, false 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 x == y, + then x.hash_code() == y.hash_code(). + */ + int32_t hash_code() const; + + friend bool + operator==(const Octagonal_Shape& x, const Octagonal_Shape& y); + + template + friend bool Parma_Polyhedra_Library::rectilinear_distance_assign + (Checked_Number& r, + const Octagonal_Shape& x, const Octagonal_Shape& y, + const Rounding_Dir dir, Temp& tmp0, Temp& tmp1, Temp& tmp2); + template + friend bool Parma_Polyhedra_Library::euclidean_distance_assign + (Checked_Number& r, + const Octagonal_Shape& x, const Octagonal_Shape& y, + const Rounding_Dir dir, Temp& tmp0, Temp& tmp1, Temp& tmp2); + template + friend bool Parma_Polyhedra_Library::l_infinity_distance_assign + (Checked_Number& r, + const Octagonal_Shape& x, const Octagonal_Shape& y, + const Rounding_Dir dir, Temp& tmp0, Temp& tmp1, Temp& tmp2); + +private: + template friend class Parma_Polyhedra_Library::Octagonal_Shape; + template friend class Parma_Polyhedra_Library::Box; + + //! The matrix that represents the octagonal shape. + OR_Matrix 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 true if the OS is the zero-dimensional universe. + bool marked_zero_dim_univ() const; + + //! Returns true if the OS is known to be empty. + /*! + The return value false does not necessarily + implies that \p *this is non-empty. + */ + bool marked_empty() const; + + /*! \brief + Returns true if \c this->matrix is known to be + strongly closed. + + The return value false 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 + 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 matrix[i][j] <= k. + void add_octagonal_constraint(dimension_type i, + dimension_type j, + const N& k); + + //! Adds the constraint matrix[i][j] <= num/den. + void add_octagonal_constraint(dimension_type i, + dimension_type j, + Coefficient_traits::const_reference num, + Coefficient_traits::const_reference den); + + /*! \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 + v - u \<= k and v + u \<= k, + starting from \p ub_v, which is an upper bound for \c v + computed according to \p sc_expr and \p sc_den. + + Strong-closure will be able to deduce the constraints + v - u \<= ub_v - lb_u and v + u \<= ub_v + ub_u. + 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 + q == sc_expr[u]/sc_den of \c u in \p sc_expr + is greater than zero, we can improve the bound for v - u. + 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). + + Conversely, if \c q is less than zero, we can improve the bound for + v + u. In particular: + - if q \<= -1, then v + u \<= ub_v + lb_u; + - if -1 \< q \< 0, then + v + u \<= ub_v + ((-q)*lb_u + (1+q)*ub_u). + */ + void deduce_v_pm_u_bounds(dimension_type v_id, + dimension_type last_id, + const Linear_Expression& sc_expr, + Coefficient_traits::const_reference sc_den, + 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 + -v + u \<= k and -v - u \<= k, + 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_den. + + Strong-closure will be able to deduce the constraints + -v - u \<= -lb_v - lb_u and + -v + u \<= -lb_v + ub_u. + 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 + q == sc_expr[u]/sc_den of \c u in \p sc_expr + is greater than zero, we can improve the bound for -v + u. + In particular: + - if q \>= 1, then -v + u \<= -lb_v + lb_u; + - if 0 \< q \< 1, then + -v + u \<= -lb_v + (q*lb_u + (1-q)*ub_u). + + Conversely, if \c q is less than zero, we can improve the bound for + -v - u. In particular: + - if q \<= -1, then -v - u \<= -lb_v - ub_u; + - if -1 \< q \< 0, then + -v - u \<= -lb_v - ((-q)*ub_u + (1+q)*lb_u). + */ + void deduce_minus_v_pm_u_bounds(dimension_type v, + dimension_type last_v, + const Linear_Expression& sc_expr, + Coefficient_traits::const_reference sc_den, + 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& 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& successor, + std::vector& 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& leaders) const; + + /*! \brief + Stores into \p non_redundant information about the matrix entries + that are non-redundant (i.e., will occur in 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& non_redundant) const; + + //! Removes the redundant constraints from \c this->matrix. + void strong_reduction_assign() const; + + /*! \brief + Returns true if and only if \c this->matrix + is strongly reduced. + */ + bool is_strongly_reduced() const; + + /*! \brief + Returns true 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(); + + /*! \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 true if and only if \p from_above is + true and \p expr is bounded from above in \p *this, + or \p from_above is false and \p expr is bounded + from below in \p *this. + + \param expr + The linear expression to test; + + \param from_above + true 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 + true 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 + true 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, false 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 + true 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 + true 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, false 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; + + bool BHZ09_upper_bound_assign_if_exact(const Octagonal_Shape& y); + + friend std::ostream& + Parma_Polyhedra_Library::IO_Operators + ::operator<<<>(std::ostream& s, const Octagonal_Shape& c); + + //! \name Exception Throwers + //@{ + void throw_dimension_incompatible(const char* method, + const Octagonal_Shape& x) const; + + void throw_dimension_incompatible(const char* method, + dimension_type required_dim) const; + + void throw_dimension_incompatible(const char* method, + const Constraint& c) const; + + void throw_dimension_incompatible(const char* method, + const Congruence& cg) const; + + void throw_dimension_incompatible(const char* method, + const Generator& g) const; + + void throw_dimension_incompatible(const char* method, + const char* name_row, + const Linear_Expression& y) const; + + void throw_constraint_incompatible(const char* method) const; + + void throw_expression_too_complex(const char* method, + const Linear_Expression& e) const; + + void throw_generic(const char* method, const char* reason) const; + //@} // Exception Throwers + + static T default_stop_points[]; +}; + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Octagonal_Shape */ +template +void swap(Parma_Polyhedra_Library::Octagonal_Shape& x, + Parma_Polyhedra_Library::Octagonal_Shape& y); + +} // namespace std + +#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..e795150 --- /dev/null +++ b/src/Octagonal_Shape.inlines.hh @@ -0,0 +1,816 @@ +/* Octagonal_Shape class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#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 +#include + +namespace Parma_Polyhedra_Library { + +// FIXME: find the appropriate place for this. +/*! \relates Octagonal_Shape */ +inline dimension_type +coherent_index(const dimension_type i) { + return (i % 2 != 0) ? i-1 : i+1; +} + +template +inline dimension_type +Octagonal_Shape::max_space_dimension() { + return OR_Matrix::max_num_rows()/2; +} + +template +inline bool +Octagonal_Shape::marked_zero_dim_univ() const { + return status.test_zero_dim_univ(); +} + +template +inline bool +Octagonal_Shape::marked_strongly_closed() const { + return status.test_strongly_closed(); +} + +template +inline bool +Octagonal_Shape::marked_empty() const { + return status.test_empty(); +} + +template +inline void +Octagonal_Shape::set_zero_dim_univ() { + status.set_zero_dim_univ(); +} + +template +inline void +Octagonal_Shape::set_empty() { + status.set_empty(); +} + +template +inline void +Octagonal_Shape::set_strongly_closed() { + status.set_strongly_closed(); +} + +template +inline void +Octagonal_Shape::reset_strongly_closed() { + status.reset_strongly_closed(); +} + +template +inline +Octagonal_Shape::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(); + assert(OK()); +} + +template +inline +Octagonal_Shape::Octagonal_Shape(const Octagonal_Shape& y, Complexity_Class) + : matrix(y.matrix), space_dim(y.space_dim), status(y.status) { +} + +template +template +inline +Octagonal_Shape::Octagonal_Shape(const Octagonal_Shape& 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 +inline +Octagonal_Shape::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 +inline +Octagonal_Shape::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 +template +inline +Octagonal_Shape::Octagonal_Shape(const Box& box, + Complexity_Class) + : matrix(box.space_dimension()), + space_dim(box.space_dimension()), + status() { + // Check for emptyness 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 +inline +Octagonal_Shape::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 +template +inline +Octagonal_Shape::Octagonal_Shape(const BD_Shape& bd, + Complexity_Class) + : matrix(bd.space_dimension()), + space_dim(bd.space_dimension()), + status() { + // Check for emptyness 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 +inline Congruence_System +Octagonal_Shape::congruences() const { + return minimized_congruences(); +} + +template +inline Octagonal_Shape& +Octagonal_Shape::operator=(const Octagonal_Shape& y) { + matrix = y.matrix; + space_dim = y.space_dim; + status = y.status; + return *this; +} + +template +inline +Octagonal_Shape::~Octagonal_Shape() { +} + +template +inline void +Octagonal_Shape::swap(Octagonal_Shape& y) { + std::swap(matrix, y.matrix); + std::swap(space_dim, y.space_dim); + std::swap(status, y.status); +} + +template +inline dimension_type +Octagonal_Shape::space_dimension() const { + return space_dim; +} + +template +inline bool +Octagonal_Shape::is_discrete() const { + return affine_dimension() == 0; +} + +template +inline bool +Octagonal_Shape::is_empty() const { + strong_closure_assign(); + return marked_empty(); +} + +template +inline bool +Octagonal_Shape::bounds_from_above(const Linear_Expression& expr) const { + return bounds(expr, true); +} + +template +inline bool +Octagonal_Shape::bounds_from_below(const Linear_Expression& expr) const { + return bounds(expr, false); +} + +template +inline bool +Octagonal_Shape::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 +inline bool +Octagonal_Shape::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 +inline bool +Octagonal_Shape::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 +inline bool +Octagonal_Shape::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 +inline bool +Octagonal_Shape::is_topologically_closed() const { + return true; +} + +template +inline void +Octagonal_Shape::topological_closure_assign() { + // Nothing to be done. + return; +} + +/*! \relates Octagonal_Shape */ +template +inline bool +operator==(const Octagonal_Shape& x, const Octagonal_Shape& 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 +inline bool +operator!=(const Octagonal_Shape& x, const Octagonal_Shape& y) { + return !(x == y); +} + +template +inline const typename Octagonal_Shape::coefficient_type& +Octagonal_Shape::matrix_at(const dimension_type i, + const dimension_type j) const { + assert(i < matrix.num_rows() && j < matrix.num_rows()); + return (j < matrix.row_size(i)) + ? matrix[i][j] + : matrix[coherent_index(j)][coherent_index(i)]; +} + +template +inline typename Octagonal_Shape::coefficient_type& +Octagonal_Shape::matrix_at(const dimension_type i, + const dimension_type j) { + assert(i < matrix.num_rows() && j < matrix.num_rows()); + return (j < matrix.row_size(i)) + ? matrix[i][j] + : matrix[coherent_index(j)][coherent_index(i)]; +} + +template +inline Constraint_System +Octagonal_Shape::minimized_constraints() const { + strong_reduction_assign(); + return constraints(); +} + +template +inline void +Octagonal_Shape::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 + assert(i < 2*space_dim && j < 2*space_dim && i != j); + typename OR_Matrix::row_iterator m_i = matrix.row_begin() + i; + 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 +inline void +Octagonal_Shape +::add_octagonal_constraint(const dimension_type i, + const dimension_type j, + Coefficient_traits::const_reference num, + Coefficient_traits::const_reference den) { +#ifndef NDEBUG + // Private method: the caller has to ensure the following. + assert(i < 2*space_dim && j < 2*space_dim && i != j); + typename OR_Matrix::row_iterator m_i = matrix.row_begin() + i; + assert(j < m_i.row_size()); + assert(den != 0); +#endif + PPL_DIRTY_TEMP(N, k); + div_round_up(k, num, den); + add_octagonal_constraint(i, j, k); +} + +template +inline void +Octagonal_Shape::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 +inline void +Octagonal_Shape::add_recycled_constraints(Constraint_System& cs) { + add_constraints(cs); +} + +template +inline void +Octagonal_Shape::add_recycled_congruences(Congruence_System& cgs) { + add_congruences(cgs); +} + +template +inline void +Octagonal_Shape::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 +inline void +Octagonal_Shape::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 +inline void +Octagonal_Shape::refine_with_constraints(const Constraint_System& cs) { + // Dimension-compatibility check. + if (cs.space_dimension() > space_dimension()) + throw_generic("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 +inline void +Octagonal_Shape::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 +void +Octagonal_Shape::refine_with_congruences(const Congruence_System& cgs) { + // Dimension-compatibility check. + if (cgs.space_dimension() > space_dimension()) + throw_generic("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 +inline void +Octagonal_Shape::refine_no_check(const Congruence& cg) { + assert(!marked_empty()); + assert(cg.space_dimension() <= space_dimension()); + + if (cg.is_proper_congruence()) { + if (cg.is_inconsistent()) + set_empty(); + // Other proper congruences are just ignored. + return; + } + + assert(cg.is_equality()); + Constraint c(cg); + refine_no_check(c); +} + +template +inline bool +Octagonal_Shape::can_recycle_constraint_systems() { + return false; +} + +template +inline bool +Octagonal_Shape::can_recycle_congruence_systems() { + return false; +} + +template +inline void +Octagonal_Shape +::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) { + 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; + assert(OK()); +} + +template +inline void +Octagonal_Shape::widening_assign(const Octagonal_Shape& y, unsigned* tp) { + BHMZ05_widening_assign(y, tp); +} + +template +inline void +Octagonal_Shape::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 +inline void +Octagonal_Shape::time_elapse_assign(const Octagonal_Shape& y) { + // Dimension-compatibility check. + if (space_dimension() != y.space_dimension()) + throw_dimension_incompatible("time_elapse_assign(y)", y); + // See the polyhedra documentation. + C_Polyhedron px(constraints()); + C_Polyhedron py(y.constraints()); + px.time_elapse_assign(py); + Octagonal_Shape x(px); + swap(x); + assert(OK()); +} + +template +inline bool +Octagonal_Shape::strictly_contains(const Octagonal_Shape& y) const { + const Octagonal_Shape& x = *this; + return x.contains(y) && !y.contains(x); +} + +template +inline bool +Octagonal_Shape::upper_bound_assign_if_exact(const Octagonal_Shape& y) { + return BHZ09_upper_bound_assign_if_exact(y); +} + +/*! \relates Octagonal_Shape */ +template +inline bool +rectilinear_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& 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 +inline bool +rectilinear_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& y, + const Rounding_Dir dir) { + typedef Checked_Number 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 +inline bool +rectilinear_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& y, + const Rounding_Dir dir) { + return rectilinear_distance_assign(r, x, y, dir); +} + +/*! \relates Octagonal_Shape */ +template +inline bool +euclidean_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& 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 +inline bool +euclidean_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& y, + const Rounding_Dir dir) { + typedef Checked_Number 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 +inline bool +euclidean_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& y, + const Rounding_Dir dir) { + return euclidean_distance_assign(r, x, y, dir); +} + +/*! \relates Octagonal_Shape */ +template +inline bool +l_infinity_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& 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 +inline bool +l_infinity_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& y, + const Rounding_Dir dir) { + typedef Checked_Number 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 +inline bool +l_infinity_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& y, + const Rounding_Dir dir) { + return l_infinity_distance_assign(r, x, y, dir); +} + +template +inline memory_size_type +Octagonal_Shape::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +template +inline int32_t +Octagonal_Shape::hash_code() const { + return space_dimension() & 0x7fffffff; +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Octagonal_Shape */ +template +inline void +swap(Parma_Polyhedra_Library::Octagonal_Shape& x, + Parma_Polyhedra_Library::Octagonal_Shape& y) { + x.swap(y); +} + +} // namespace std + +#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..9782db6 --- /dev/null +++ b/src/Octagonal_Shape.templates.hh @@ -0,0 +1,6795 @@ +/* Octagonal_Shape class implementation: non-inline template functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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 +#include +#include +#include +#include +#include +#include +#include + +namespace Parma_Polyhedra_Library { + +template +Octagonal_Shape::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. + 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()) + lp.add_constraint(Linear_Expression(c) >= 0); + else + lp.add_constraint(c); + } + + // Check for unsatisfiability. + if (!lp.is_satisfiable()) { + *this = Octagonal_Shape(num_dimensions, EMPTY); + return; + } + + // Start with a universe OS that will be refined by the simplex. + *this = Octagonal_Shape(num_dimensions, UNIVERSE); + // Get all the upper bounds. + Generator g(point()); + PPL_DIRTY_TEMP_COEFFICIENT(num); + PPL_DIRTY_TEMP_COEFFICIENT(den); + 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, num, den); + num *= 2; + div_round_up(matrix[2*i+1][2*i], num, den); + } + // 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, num, den); + div_round_up(matrix[2*i+1][2*j], num, den); + } + } + // 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, num, den); + div_round_up((i < j ? matrix[2*j][2*i] : matrix[2*i+1][2*j+1]), + num, den); + } + } + // 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, num, den); + div_round_up((i < j ? matrix[2*j][2*i] : matrix[2*i+1][2*j+1]), + num, den); + } + } + // 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, num, den); + div_round_up(matrix[2*i][2*j+1], num, den); + } + } + // 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, num, den); + num *= 2; + div_round_up(matrix[2*i][2*i+1], num, den); + } + } + set_strongly_closed(); + assert(OK()); + return; + } + + // Extract easy-to-find bounds from constraints. + assert(complexity == POLYNOMIAL_COMPLEXITY); + *this = Octagonal_Shape(num_dimensions, UNIVERSE); + refine_with_constraints(ph.constraints()); +} + +template +Octagonal_Shape::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::row_reference_type Row_Reference; + typename OR_Matrix::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(); + 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(); + 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_generic("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: + 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: + 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(); + assert(OK()); +} + +template +void +Octagonal_Shape::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_generic("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 (!extract_octagonal_difference(c, c_space_dim, num_vars, + i, j, coeff, term)) + throw_generic("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::row_iterator i_iter = matrix.row_begin() + i; + typename OR_Matrix::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::row_reference_type m_ci = *i_iter; + 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(); + assert(OK()); +} + +template +void +Octagonal_Shape::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_generic("add_congruence(cg)", + "cg is a non-trivial, proper congruence"); + } + + assert(cg.is_equality()); + Constraint c(cg); + add_constraint(c); +} + +template +void +Octagonal_Shape::refine_no_check(const Constraint& c) { + assert(!marked_empty()); + const dimension_type c_space_dim = c.space_dimension(); + 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 (!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::row_iterator i_iter = matrix.row_begin() + i; + typename OR_Matrix::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::row_reference_type m_ci = *i_iter; + 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(); + assert(OK()); +} + +template +dimension_type +Octagonal_Shape::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 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 +Congruence_System +Octagonal_Shape::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; + if (space_dim == 0) { + if (marked_empty()) + cgs = Congruence_System::zero_dim_empty(); + } + else if (marked_empty()) + cgs.insert((0*Variable(space_dim-1) %= 1) / 0); + else { + // KLUDGE: in the future `cgs' will be constructed of the right dimension. + // For the time being, we force the dimension with the following line. + cgs.insert(0*Variable(space_dim-1) == 0); + + // 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 leaders; + compute_leaders(leaders); + + PPL_DIRTY_TEMP_COEFFICIENT(num); + PPL_DIRTY_TEMP_COEFFICIENT(den); + 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]; + assert(is_additive_inverse(c_i_ii, c_ii_i)); +#endif + numer_denom(c_ii_i, num, den); + den *= 2; + cgs.insert(den*x == num); + } + 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 + const N& c_ii_lii = matrix[i+1][coherent_index(lead_i)]; + 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, num, den); + if (lead_i % 2 == 0) + cgs.insert(den*x - den*y == num); + else + cgs.insert(den*x + den*y + num == 0); + } + continue; + } + } + return cgs; +} + +template +void +Octagonal_Shape::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::const_element_iterator + y_it = y.matrix.element_begin(); + for(typename OR_Matrix::row_iterator i = matrix.row_begin()+old_num_rows, + matrix_row_end = matrix.row_end(); i != matrix_row_end; ++i) { + typename OR_Matrix::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 doesn't preserve the closure. + if (marked_strongly_closed()) + reset_strongly_closed(); + assert(OK()); +} + +template +bool +Octagonal_Shape::contains(const Octagonal_Shape& y) const { + // Dimension-compatibility check. + if (space_dim != y.space_dim) + throw_dimension_incompatible("contains(y)", y); + + // The zero-dimensional universe octagon contains any other + // dimension-compatible octagon. + // The zero-dimensional empty octagon only contains another + // zero-dimensional empty octagon. + if (space_dim == 0) { + if (!marked_empty()) + return true; + else + return y.marked_empty(); + } + + // `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; + + // `*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::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 +bool +Octagonal_Shape::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 correspomding constraint in the second Octagonal_Shape or vice versa. + + const dimension_type n_rows = matrix.num_rows(); + + typedef typename OR_Matrix::const_row_iterator Row_Iterator; + typedef typename OR_Matrix::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) { + 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 +bool +Octagonal_Shape::is_universe() const { + // An empty octagon isn't, of course, 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::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 +bool +Octagonal_Shape::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::const_row_iterator i = matrix.row_begin(), + matrix_row_end = matrix.row_end(); i != matrix_row_end; ++i) { + typename OR_Matrix::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 +bool +Octagonal_Shape::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 coeherence. + if (std::numeric_limits::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 oct_z(space_dim); + oct_z.reset_strongly_closed(); + + typedef Octagonal_Shape::N Z; + PPL_DIRTY_TEMP(N, tmp); + bool all_integers = true; + typename OR_Matrix::const_element_iterator x_i = matrix.element_begin(); + for (typename OR_Matrix::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; + Z& d_z = *z_i; + // Copy d into d_z, but rounding downwards. + neg_assign_r(tmp, d, ROUND_NOT_NEEDED); + assign_r(d_z, tmp, ROUND_UP); + neg_assign_r(d_z, d_z, ROUND_NOT_NEEDED); + } + } + // 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 +bool +Octagonal_Shape::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_dimension() < var_space_dim) + throw_dimension_incompatible("constrains(v)", "v", var); + + // A polyhedron 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::const_row_iterator m_iter = matrix.row_begin() + n_v; + typename OR_Matrix::const_row_reference_type r_v = *m_iter; + typename OR_Matrix::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::const_row_iterator m_end = matrix.row_end(); + m_iter != m_end; ++m_iter) { + typename OR_Matrix::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 +bool +Octagonal_Shape::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::const_row_iterator iter = matrix.row_begin() + i; + typename OR_Matrix::const_row_reference_type m_i = *iter; + 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); + div2exp_assign_r(semi_sum, semi_sum, 1, ROUND_UP); + if (m_i[j] > semi_sum) + return false; + } + } + } + return true; +} + +template +bool +Octagonal_Shape::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::const_row_iterator iter = matrix.row_begin(), + matrix_row_end = matrix.row_end(); iter != matrix_row_end; ++iter) { + typename OR_Matrix::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 +bool +Octagonal_Shape::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 (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::const_row_iterator i_iter = matrix.row_begin() + i; + typename OR_Matrix::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 +bool +Octagonal_Shape::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 (!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::const_row_iterator i_iter = matrix.row_begin() + i; + typename OR_Matrix::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, expr.coefficient(Variable(i/2))); + 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); + div2exp_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 +bool +Octagonal_Shape::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 +Poly_Con_Relation +Octagonal_Shape::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 if (cg.inhomogeneous_term() % cg.modulus() == 0) + return Poly_Con_Relation::saturates() + && Poly_Con_Relation::is_included(); + } + + PPL_DIRTY_TEMP(Coefficient, min_num); + PPL_DIRTY_TEMP(Coefficient, min_den); + bool min_included; + PPL_DIRTY_TEMP_COEFFICIENT(mod); + mod = cg.modulus(); + Linear_Expression le; + for (dimension_type i = cg_space_dim; i-- > 0; ) + le += cg.coefficient(Variable(i)) * Variable(i); + bool bounded_below = minimize(le, min_num, min_den, min_included); + + if (!bounded_below) + return Poly_Con_Relation::strictly_intersects(); + + PPL_DIRTY_TEMP_COEFFICIENT(v); + PPL_DIRTY_TEMP_COEFFICIENT(lower_num); + PPL_DIRTY_TEMP_COEFFICIENT(lower_den); + PPL_DIRTY_TEMP_COEFFICIENT(lower); + assign_r(lower_num, min_num, ROUND_NOT_NEEDED); + assign_r(lower_den, min_den, ROUND_NOT_NEEDED); + neg_assign(v, cg.inhomogeneous_term()); + lower = lower_num / lower_den; + v += ((lower / mod) * mod); + if (v * lower_den < lower_num) + v += mod; + const Constraint& c(le == v); + return relation_with(c); +} + +template +Poly_Con_Relation +Octagonal_Shape::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 (!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; + for (dimension_type k = c_space_dim; k-- > 0; ) { + Variable vk(k); + le += c.coefficient(vk) * vk; + } + PPL_DIRTY_TEMP(Coefficient, max_num); + PPL_DIRTY_TEMP(Coefficient, max_den); + bool max_included; + PPL_DIRTY_TEMP(Coefficient, min_num); + PPL_DIRTY_TEMP(Coefficient, min_den); + bool min_included; + bool bounded_above = maximize(le, max_num, max_den, max_included); + bool bounded_below = minimize(le, min_num, min_den, min_included); + if (!bounded_above) { + if (!bounded_below) + return Poly_Con_Relation::strictly_intersects(); + min_num += c.inhomogeneous_term() * min_den; + switch (sgn(min_num)) { + 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_num += c.inhomogeneous_term() * max_den; + switch (sgn(max_num)) { + 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_num += c.inhomogeneous_term() * max_den; + min_num += c.inhomogeneous_term() * min_den; + switch (sgn(max_num)) { + case 1: + switch (sgn(min_num)) { + 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(); + } + case 0: + if (min_num == 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::const_row_iterator i_iter = matrix.row_begin() + i; + typename OR_Matrix::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::const_row_reference_type m_ci = *i_iter; + 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_TEMP0(mpq_class, q_x); + PPL_DIRTY_TEMP0(mpq_class, q_y); + PPL_DIRTY_TEMP0(mpq_class, d); + PPL_DIRTY_TEMP0(mpq_class, d1); + PPL_DIRTY_TEMP0(mpq_class, c_den); + PPL_DIRTY_TEMP0(mpq_class, q_den); + assign_r(c_den, 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_den, ROUND_NOT_NEEDED); + div_assign_r(d1, d1, c_den, 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_den, denom, ROUND_NOT_NEEDED); + assign_r(q_y, numer, ROUND_NOT_NEEDED); + div_assign_r(q_y, q_y, q_den, 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_den, denom, ROUND_NOT_NEEDED); + assign_r(q_x, numer, ROUND_NOT_NEEDED); + div_assign_r(q_x, q_x, q_den, ROUND_NOT_NEEDED); + + if (!is_plus_infinity(m_ci_cj)) { + numer_denom(m_ci_cj, numer, denom); + assign_r(q_den, denom, ROUND_NOT_NEEDED); + assign_r(q_y, numer, ROUND_NOT_NEEDED); + div_assign_r(q_y, q_y, q_den, 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 +Poly_Gen_Relation +Octagonal_Shape::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::const_row_iterator Row_Iterator; + typedef typename OR_Matrix::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(num); + PPL_DIRTY_TEMP_COEFFICIENT(den); + 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's necessary that the scalar product + // is not zero. The scalar product has the form: + // 'den * g_coeff_x - num * g.divisor()'. + numer_denom(m_ii_i, num, den); + den *= 2; + product = den * 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(num); + add_mul_assign(product, num, 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, num, den); + den *= -2; + product = den * 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(num); + add_mul_assign(product, num, 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: + // '-den * g.coeff_x - num * 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, num, den); + den *= 2; + product = den * 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(num); + add_mul_assign(product, num , 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: + // 'den * g_coeff_x - num * 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 ax - ay = b. + // The scalar product has the form + // 'den * coeff_x - den * coeff_y - num * g.divisor()'. + // To satisfy the constraint it's necessary that the scalar product + // is not zero. + numer_denom(m_i_j, num, den); + product = den * g_coeff_x; + neg_assign(den); + add_mul_assign(product, den, 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(num); + add_mul_assign(product, num, g.divisor()); + } + if (product != 0) + return Poly_Gen_Relation::nothing(); + } + else { + if (!is_plus_infinity(m_i_j)) { + // The constraint has form ax - ay <= b. + // The scalar product has the form + // 'den * coeff_x - den * coeff_y - num * 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, num, den); + product = den * g_coeff_x; + neg_assign(den); + add_mul_assign(product, den, 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(num); + add_mul_assign(product, num, 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 -ax + ay <= b. + // The scalar product has the form + // '-den * coeff_x + den * coeff_y - num * 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, num, den); + product = den * g_coeff_y; + neg_assign(den); + add_mul_assign(product, den, 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(num); + add_mul_assign(product, num, 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 ax + ay = b. + // The scalar product has the form + // 'den * coeff_x + den * coeff_y - num * g.divisor()'. + // To satisfy the constraint it's necessary that the scalar product + // is not zero. + numer_denom(m_ii_j, num, den); + product = den * g_coeff_x; + add_mul_assign(product, den, 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(num); + add_mul_assign(product, num, g.divisor()); + } + if (product != 0) + return Poly_Gen_Relation::nothing(); + } + else { + if (!is_plus_infinity(m_i_jj)) { + // The constraint has form -ax - ay <= b. + // The scalar product has the form + // '-den * coeff_x - den * coeff_y - num * 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, num, den); + neg_assign(den); + product = den * g_coeff_x; + add_mul_assign(product, den, 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(num); + add_mul_assign(product, num, 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 ax + ay <= b. + // The scalar product has the form + // 'den * coeff_x + den * coeff_y - num * 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, num, den); + product = den * g_coeff_x; + add_mul_assign(product, den, 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(num); + add_mul_assign(product, num, 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 +void +Octagonal_Shape::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&>(*this); + + typedef typename OR_Matrix::row_iterator Row_Iterator; + typedef typename OR_Matrix::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) { + 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::element_iterator iter_ij; + std::vector vec_k(n_rows); + std::vector 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) { + 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: + // 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. + 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 { + 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 +void +Octagonal_Shape::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::row_iterator i_iter = matrix.row_begin(), + i_end = matrix.row_end(); i_iter != i_end; ++i_iter) { + typename OR_Matrix::row_reference_type x_i = *i_iter; + const dimension_type i = i_iter.index(); + 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); + div2exp_assign_r(semi_sum, semi_sum, 1, ROUND_UP); + min_assign(x_i[j], semi_sum); + } + } + } +} + +template +bool +Octagonal_Shape::tight_coherence_would_make_empty() const { + assert(std::numeric_limits::is_integer); + 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 +void +Octagonal_Shape +::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&>(*this); + + typedef typename OR_Matrix::row_iterator Row_Iterator; + typedef typename OR_Matrix::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) { + 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); + 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. + 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 +void +Octagonal_Shape +::compute_successors(std::vector& successor) const { + assert(!marked_empty() && marked_strongly_closed()); + 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::const_row_iterator i_iter = matrix.row_begin()+i; + typename OR_Matrix::const_row_reference_type m_i = *i_iter; + typename OR_Matrix::const_row_reference_type m_ci + = (i % 2 != 0) ? *(i_iter-1) : *(i_iter+1); + for (dimension_type j = 0; j < i; ++j) { + //for (dimension_type j = i; j-- > 0; ) { + 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 +void +Octagonal_Shape +::compute_leaders(std::vector& leaders) const { + assert(!marked_empty() && marked_strongly_closed()); + 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::const_row_iterator i_iter = matrix.row_begin(), + matrix_row_end = matrix.row_end(); + i_iter != matrix_row_end; ++i_iter) { + typename OR_Matrix::const_row_reference_type m_i = *i_iter; + dimension_type i = i_iter.index(); + typename OR_Matrix::const_row_reference_type m_ci + = (i % 2 != 0) ? *(i_iter-1) : *(i_iter+1); + for (dimension_type j = 0; j < i; ++j) { + 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 +void +Octagonal_Shape +::compute_leaders(std::vector& successor, + std::vector& no_sing_leaders, + bool& exist_sing_class, + dimension_type& sing_leader) const { + assert(!marked_empty() && marked_strongly_closed()); + assert(no_sing_leaders.size() == 0); + dimension_type successor_size = successor.size(); + std::deque 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. + if (next_i == coherent_index(i)) { + exist_sing_class = true; + sing_leader = i; + } + else + no_sing_leaders.push_back(i); + } + // The following index isn't a leader. + dealt_with[next_i] = true; + } +} + +template +void +Octagonal_Shape::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 non_red; + non_redundant_matrix_entries(non_red); + + // Throw away redundant constraints. + Octagonal_Shape& x = const_cast&>(*this); +#ifndef NDEBUG + const Octagonal_Shape x_copy_before(x); +#endif + typename OR_Matrix::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::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); + assert(x_copy_before == x_copy_after); + assert(x.is_strongly_reduced()); + assert(x.OK()); +#endif +} + +template +void +Octagonal_Shape +::non_redundant_matrix_entries(std::vector& nr_rows) const { + // Private method: the caller has to ensure the following. + assert(space_dim > 0 && !marked_empty() && marked_strongly_closed()); + assert(nr_rows.empty()); + + // Initialize `non_redundant' as if it was an OR_Matrix of booleans + // (initially set to false). + nr_rows.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 no_sing_leaders; + dimension_type sing_leader = 0; + bool exist_sing_class = false; + std::vector 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]; + const dimension_type ci = coherent_index(i); + typename OR_Matrix::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) { + nr_rows[next_j].set(j); + j = next_j; + next_j = successor[j]; + } + const dimension_type cj = coherent_index(j); + nr_rows[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); + div2exp_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. + nr_rows[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) { + nr_rows[sing_leader].set(sing_leader+1); + if (successor[sing_leader+1] != sing_leader+1) { + dimension_type j = sing_leader; + dimension_type next_jj = successor[j+1]; + while (next_jj != j+1) { + nr_rows[next_jj].set(j); + j = next_jj; + next_jj = successor[j+1]; + } + nr_rows[j+1].set(j); + } + else + nr_rows[sing_leader+1].set(sing_leader); + } +} + +template +void +Octagonal_Shape::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::const_element_iterator j = y.matrix.element_begin(); + for (typename OR_Matrix::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. + assert(OK()); +} + +template +void +Octagonal_Shape::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 complementaries 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 = Linear_Expression(c); + 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; + assert(OK()); +} + +template +bool +Octagonal_Shape::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 res(dim, UNIVERSE); + x.swap(res); + return false; + } + + typedef typename OR_Matrix::row_iterator Row_Iter; + typedef typename OR_Matrix::const_row_iterator Row_CIter; + typedef typename OR_Matrix::element_iterator Elem_Iter; + typedef typename OR_Matrix::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 wrt 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. + assert(i < dim && j < dim && i != j); + Octagonal_Shape 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); + assert(!is_plus_infinity(res.matrix_at(j, i))); + x.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 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 x_nonred; + x.non_redundant_matrix_entries(x_nonred); + // ... count the non-redundant constraints. + dimension_type x_num_nonred = 0; + for (size_t i = x_nonred.size(); i-- > 0 ; ) + x_num_nonred += x_nonred[i].count_ones(); + assert(x_num_nonred > 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 yy = y; + + // The constraints added to `yy' will be recorded in `res' ... + Octagonal_Shape res(dim, UNIVERSE); + // ... and we will count them too. + dimension_type res_num_nonred = 0; + + // Compute leader information for `x'. + std::vector 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_nonred; + // 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_nonred; + // 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_nonred < x_num_nonred) { + res.reset_strongly_closed(); + x.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); + 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_nonred; + // 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); + assert(!is_plus_infinity(x_j_i)); + if (x_j_i < yy_j_i) { + res.matrix_at(j, i) = x_j_i; + ++res_num_nonred; + // 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_nonred < x_num_nonred) { + res.reset_strongly_closed(); + x.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_nonred_i = x_nonred[i]; + for (dimension_type j = 0; j < 2*dim; ++j) { + if (j != x_leaders[j]) + continue; + if (i >= j) { + if (!x_nonred_i[j]) + continue; + } + else if (!x_nonred[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_nonred; + // 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_nonred < x_num_nonred) { + res.reset_strongly_closed(); + x.swap(res); + } + return bool_result; + } + } + } + } + // This point should be unreachable. + throw std::runtime_error("PPL internal error"); +} + +template +void +Octagonal_Shape::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(); + + assert(OK()); +} + +template +void +Octagonal_Shape::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::row_iterator i = matrix.row_begin() + n, + matrix_row_end = matrix.row_end(); i != matrix_row_end; i += 2) { + typename OR_Matrix::row_reference_type x_i = *i; + typename OR_Matrix::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(); + assert(OK()); +} + +template +void +Octagonal_Shape +::remove_space_dimensions(const Variables_Set& to_be_removed) { + // 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 (to_be_removed.empty()) { + assert(OK()); + return; + } + + // Dimension-compatibility check. + const dimension_type min_space_dim = to_be_removed.space_dimension(); + if (space_dim < min_space_dim) + throw_dimension_incompatible("remove_space_dimensions(vs)", min_space_dim); + + const dimension_type new_space_dim = space_dim - to_be_removed.size(); + + 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; + assert(OK()); + return; + } + + // We consider every variable and we check if it is to be removed. + // If it is to be removed, we pass to the successive one, elsewhere + // we move its elements in the right position. + Variables_Set::const_iterator tbr = to_be_removed.begin(); + dimension_type ftr = *tbr; + dimension_type ftr_size = 2*ftr*(ftr+1); + typename OR_Matrix::element_iterator + iter = matrix.element_begin()+ftr_size; + + dimension_type i = ftr + 1; + while (i < space_dim) { + if (to_be_removed.count(i) != 0) + ++i; + else { + typename OR_Matrix::row_iterator + row_iter = matrix.row_begin()+2*i; + typename OR_Matrix::row_reference_type + row_ref = *row_iter; + typename OR_Matrix::row_reference_type + row_ref1 = *(++row_iter); + // If variable(j) is to remove, we pass another variable, + // else we shift its cells to up right. + // Attention: first we shift the cells corrispondent to the first + // row of variable(j), then we shift the cells corrispondent to the + // second row. We recall that every variable is represented + // in the `matrix' by two rows and two rows. + for (dimension_type j = 0; j <= i; ++j) + if (to_be_removed.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 (to_be_removed.count(j) == 0) { + assign_or_swap(*(iter++), row_ref1[2*j]); + assign_or_swap(*(iter++), row_ref1[2*j+1]); + } + ++i; + } + } + // Update the space dimension. + matrix.shrink(new_space_dim); + space_dim = new_space_dim; + assert(OK()); +} + +template +template +void +Octagonal_Shape::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 x(new_space_dim); + + typedef typename OR_Matrix::row_iterator Row_Iterator; + typedef typename OR_Matrix::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 xj_iter = m_begin + double_new_j; + Row_Reference x_j = *xj_iter; + Row_Reference x_jj = *(xj_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]); + } + + } + } + } + } + + std::swap(matrix, x); + space_dim = new_space_dim; + assert(OK()); +} + +template +void +Octagonal_Shape::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::const_element_iterator j = y.matrix.element_begin(); + for (typename OR_Matrix::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(); + assert(OK()); +} + +template +template +void +Octagonal_Shape::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); + +#ifndef NDEBUG + { + // We assume that `y' is contained in or equal to `*this'. + const Octagonal_Shape x_copy = *this; + const Octagonal_Shape y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + // 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::const_element_iterator j = y.matrix.element_begin(); + for (typename OR_Matrix::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(); + assert(OK()); +} + +template +void +Octagonal_Shape +::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. + 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 (!extract_octagonal_difference(c, cs_space_dim, num_vars, i, j, + coeff, term)) + continue; + + typedef typename OR_Matrix::const_row_iterator Row_iterator; + typedef typename OR_Matrix::const_row_reference_type Row_reference; + typedef typename OR_Matrix::row_iterator Row_Iterator; + typedef typename OR_Matrix::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& 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. + 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 +void +Octagonal_Shape +::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; + +#ifndef NDEBUG + { + // We assume that `y' is contained in or equal to `*this'. + const Octagonal_Shape x_copy = *this; + const Octagonal_Shape y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + // If `*this' is empty, since `*this' contains `y', `y' is empty too. + if (marked_empty()) + return; + // If `y' is empty, we return. + if (y.marked_empty()) + return; + + Octagonal_Shape limiting_octagon(space_dim, UNIVERSE); + get_limiting_octagon(cs, limiting_octagon); + CC76_extrapolation_assign(y, tp); + intersection_assign(limiting_octagon); +} + +template +void +Octagonal_Shape::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); + +#ifndef NDEBUG + { + // We assume that `y' is contained in or equal to `*this'. + const Octagonal_Shape x_copy = *this; + const Octagonal_Shape y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + // Compute the affine dimension of `y'. + const dimension_type y_affine_dim = y.affine_dimension(); + // If the affine dimension of `y' is zero, then either `y' is + // zero-dimensional, or it is empty, or it is a singleton. + // In all cases, due to the inclusion hypothesis, the result is `*this'. + if (y_affine_dim == 0) + return; + + // If the affine dimension has changed, due to the inclusion hypothesis, + // the result is `*this'. + const dimension_type x_affine_dim = affine_dimension(); + assert(x_affine_dim >= y_affine_dim); + if (x_affine_dim != y_affine_dim) + return; + + // If there are tokens available, work on a temporary copy. + if (tp != 0 && *tp > 0) { + 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. + assert(marked_strongly_closed() && y.marked_strongly_closed()); + // Minimize `y'. + y.strong_reduction_assign(); + + // Extrapolate unstable bounds. + typename OR_Matrix::const_element_iterator j = y.matrix.element_begin(); + for (typename OR_Matrix::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(); + assert(OK()); +} + +template +void +Octagonal_Shape +::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; + +#ifndef NDEBUG + { + // We assume that `y' is contained in or equal to `*this'. + const Octagonal_Shape x_copy = *this; + const Octagonal_Shape y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + // If `*this' is empty, since `*this' contains `y', `y' is empty too. + if (marked_empty()) + return; + // If `y' is empty, we return. + if (y.marked_empty()) + return; + + Octagonal_Shape limiting_octagon(space_dim, UNIVERSE); + get_limiting_octagon(cs, limiting_octagon); + BHMZ05_widening_assign(y, tp); + intersection_assign(limiting_octagon); +} + +template +void +Octagonal_Shape::CC76_narrowing_assign(const Octagonal_Shape& y) { + // Dimension-compatibility check. + if (space_dim != y.space_dim) + throw_dimension_incompatible("CC76_narrowing_assign(y)", y); + +#ifndef NDEBUG + { + // We assume that `*this' is contained in or equal to `y'. + const Octagonal_Shape x_copy = *this; + const Octagonal_Shape y_copy = y; + assert(y_copy.contains(x_copy)); + } +#endif + + // 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::const_element_iterator j = y.matrix.element_begin(); + for (typename OR_Matrix::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(); + assert(OK()); +} + +template +void +Octagonal_Shape +::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_den, + const N& ub_v) { + // Private method: the caller has to ensure the following. + assert(sc_den > 0); + assert(!is_plus_infinity(ub_v)); + + PPL_DIRTY_TEMP0(mpq_class, mpq_sc_den); + assign_r(mpq_sc_den, sc_den, ROUND_NOT_NEEDED); + + // No need to consider indices greater than `last_id'. + const dimension_type n_v = 2*v_id; + typename OR_Matrix::row_reference_type m_cv = matrix[n_v+1]; + + // Speculatively allocate temporaries out of the loop. + PPL_DIRTY_TEMP(N, half); + PPL_DIRTY_TEMP0(mpq_class, minus_lb_u); + PPL_DIRTY_TEMP0(mpq_class, q); + PPL_DIRTY_TEMP0(mpq_class, minus_q); + PPL_DIRTY_TEMP0(mpq_class, ub_u); + PPL_DIRTY_TEMP0(mpq_class, lb_u); + PPL_DIRTY_TEMP(N, up_approx); + PPL_DIRTY_TEMP_COEFFICIENT(minus_expr_u); + + for (dimension_type u_id = last_id+1; u_id-- > 0; ) { + // Skip the case when `u_id == v_id'. + if (u_id == v_id) + continue; + const Coefficient& expr_u = sc_expr.coefficient(Variable(u_id)); + // Skip the case when `expr_u == 0'. + if (expr_u == 0) + continue; + + 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_den) { + // 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. + div2exp_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::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); + div2exp_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_den, ROUND_NOT_NEEDED); + assign_r(ub_u, matrix[n_u+1][n_u], ROUND_NOT_NEEDED); + div2exp_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 { + 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_den) { + // 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. + div2exp_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::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); + div2exp_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_den, ROUND_NOT_NEEDED); + assign_r(lb_u, matrix[n_u][n_u+1], ROUND_NOT_NEEDED); + div2exp_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 +void +Octagonal_Shape +::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_den, + const N& minus_lb_v) { + // Private method: the caller has to ensure the following. + assert(sc_den > 0); + assert(!is_plus_infinity(minus_lb_v)); + + PPL_DIRTY_TEMP0(mpq_class, mpq_sc_den); + assign_r(mpq_sc_den, sc_den, ROUND_NOT_NEEDED); + + // No need to consider indices greater than `last_id'. + const dimension_type n_v = 2*v_id; + typename OR_Matrix::row_reference_type m_v = matrix[n_v]; + + // Speculatively allocate temporaries out of the loop. + PPL_DIRTY_TEMP(N, half); + PPL_DIRTY_TEMP0(mpq_class, ub_u); + PPL_DIRTY_TEMP0(mpq_class, q); + PPL_DIRTY_TEMP0(mpq_class, minus_lb_u); + PPL_DIRTY_TEMP(N, up_approx); + PPL_DIRTY_TEMP_COEFFICIENT(minus_expr_u); + + for (dimension_type u_id = last_id+1; u_id-- > 0; ) { + // Skip the case when `u_id == v_id'. + if (u_id == v_id) + continue; + const Coefficient& expr_u = sc_expr.coefficient(Variable(u_id)); + // Skip the case when `expr_u == 0'. + if (expr_u == 0) + continue; + + 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_den) { + // 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. + div2exp_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::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); + div2exp_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_den, ROUND_NOT_NEEDED); + assign_r(minus_lb_u, matrix[n_u][n_u+1], ROUND_NOT_NEEDED); + div2exp_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 { + 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_den) { + // 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. + div2exp_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::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); + div2exp_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_den, ROUND_NOT_NEEDED); + assign_r(minus_lb_u, m_u[n_u+1], ROUND_NOT_NEEDED); + div2exp_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 +void +Octagonal_Shape +::forget_all_octagonal_constraints(const dimension_type v_id) { + assert(v_id < space_dim); + const dimension_type n_v = 2*v_id; + typename OR_Matrix::row_iterator m_iter = matrix.row_begin() + n_v; + typename OR_Matrix::row_reference_type r_v = *m_iter; + typename OR_Matrix::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::row_iterator m_end = matrix.row_end(); + m_iter != m_end; ++m_iter) { + typename OR_Matrix::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 +void +Octagonal_Shape +::forget_binary_octagonal_constraints(const dimension_type v_id) { + assert(v_id < space_dim); + const dimension_type n_v = 2*v_id; + typename OR_Matrix::row_iterator m_iter = matrix.row_begin() + n_v; + typename OR_Matrix::row_reference_type r_v = *m_iter; + typename OR_Matrix::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::row_iterator m_end = matrix.row_end(); + m_iter != m_end; ++m_iter) { + typename OR_Matrix::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 +void +Octagonal_Shape::unconstrain(const Variable var) { + // Dimension-compatibility check. + const dimension_type dim = var.id(); + if (space_dimension() < dim) + throw_dimension_incompatible("unconstrain(var)", dim); + + // 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(dim); + // Strong closure is preserved. + assert(OK()); +} + +template +void +Octagonal_Shape::unconstrain(const Variables_Set& to_be_unconstrained) { + // The cylindrification wrt no dimensions is a no-op. + // This case captures the only legal cylindrification in a 0-dim space. + if (to_be_unconstrained.empty()) + return; + + // Dimension-compatibility check. + const dimension_type min_space_dim = to_be_unconstrained.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 tbu = to_be_unconstrained.begin(), + tbu_end = to_be_unconstrained.end(); tbu != tbu_end; ++tbu) + forget_all_octagonal_constraints(*tbu); + // Strong closure is preserved. + assert(OK()); +} + +template +void +Octagonal_Shape::refine(const Variable var, + const Relation_Symbol relsym, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator) { + assert(denominator != 0); + const dimension_type expr_space_dim = expr.space_dimension(); + assert(space_dim >= expr_space_dim); + const dimension_type var_id = var.id(); + assert(var_id <= space_dim); + assert(expr.coefficient(var) == 0); + 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 = 0; + + // Get information about the number of non-zero coefficients in `expr'. + for (dimension_type i = expr_space_dim; i-- > 0; ) + if (expr.coefficient(Variable(i)) != 0) { + if (t++ == 1) + break; + else + w_id = i; + } + + // Now we know the form of `expr': + // - If t == 0, then expr == b, with `b' a constant; + // - If t == 1, then expr == a*j + b, where `j != v'; + // - If t == 2, the `expr' is of the general form. + typedef typename OR_Matrix::row_iterator Row_Iterator; + typedef typename OR_Matrix::row_reference_type Row_Reference; + typedef typename OR_Matrix::const_row_iterator Row_iterator; + typedef typename OR_Matrix::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_den); + neg_assign(minus_den, 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_den) + 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_den); + 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_den); + break; + default: + // We already dealt with the other cases. + throw std::runtime_error("PPL internal error"); + } + } + 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_den); + } + else { + add_octagonal_constraint(n_var+1, n_w+1, b, denominator); + add_octagonal_constraint(n_var, n_w, b, minus_den); + } + 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_den); + } + else { + add_octagonal_constraint(n_var+1, n_w, b, denominator); + add_octagonal_constraint(n_var, n_w+1, b, minus_den); + } + 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_den) { + // 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_den); + // 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_den) { + // 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. + throw std::runtime_error("PPL internal error"); + } + } + 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_den = is_sc ? denominator : minus_den; + const Coefficient& minus_sc_den = is_sc ? minus_den : denominator; + // NOTE: here, for optimization purposes, `minus_expr' is only assigned + // when `denominator' is negative. Do not use it unless you are sure + // it has been correctly assigned. + Linear_Expression minus_expr; + if (!is_sc) + minus_expr = -expr; + const Linear_Expression& sc_expr = is_sc ? expr : minus_expr; + + 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_iter + (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. + div2exp_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. + div2exp_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. + div2exp_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. + div2exp_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) { + 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_den != 1) { + // Before computing quotients, the denominator should be + // approximated towards zero. Since `sc_den' is known to be + // positive, this amounts to rounding downwards, which is + // achieved as usual by rounding upwards `minus_sc_den' + // and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(sum, sum, down_sc_den, ROUND_UP); + } + // Add the upper bound constraint, if meaningful. + if (pinf_count == 0) { + // Add the constraint `v <= sum'. + PPL_DIRTY_TEMP(N, double_sum); + mul2exp_assign_r(double_sum, sum, 1, ROUND_IGNORE); + 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_den, sum); + } + else + // Here `pinf_count == 1'. + if (pinf_index != var_id) { + const Coefficient& ppi = + sc_expr.coefficient(Variable(pinf_index)); + if (ppi == sc_den) + // 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_den) { + // 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_den != 1) { + // Before computing quotients, the denominator should be + // approximated towards zero. Since `sc_den' is known to be + // positive, this amounts to rounding downwards, which is + // achieved as usual by rounding upwards `minus_sc_den' + // and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(neg_sum, neg_sum, down_sc_den, ROUND_UP); + } + // Add the lower bound constraint, if meaningful. + if (neg_pinf_count == 0) { + // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'. + PPL_DIRTY_TEMP(N, double_neg_sum); + mul2exp_assign_r(double_neg_sum, neg_sum, 1, ROUND_IGNORE); + 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_den, 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_den) + // 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_den) { + // 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_end = m_iter + (2*w_id) + 2; + m_iter != m_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); + } + div2exp_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_den != 1) { + // Before computing the quotient, the denominator should be + // approximated towards zero. Since `sc_den' is known to be + // positive, this amounts to rounding downwards, which is achieved + // by rounding upwards `minus_sc-den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(sum, sum, down_sc_den, ROUND_UP); + } + + if (pinf_count == 0) { + // Add the constraint `v <= sum'. + PPL_DIRTY_TEMP(N, double_sum); + mul2exp_assign_r(double_sum, sum, 1, ROUND_IGNORE); + 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_den, 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_den) { + // 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_end = m_iter + (2*w_id) + 2; + m_iter != m_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); + } + div2exp_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_den != 1) { + // Before computing the quotient, the denominator should be + // approximated towards zero. Since `sc_den' is known to be positive, + // this amounts to rounding downwards, which is achieved by rounding + // upwards `minus_sc_den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(sum, sum, down_sc_den, ROUND_UP); + } + + if (pinf_count == 0) { + // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'. + PPL_DIRTY_TEMP(N, double_sum); + mul2exp_assign_r(double_sum, sum, 1, ROUND_IGNORE); + 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_den, 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_den) { + // 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. + throw std::runtime_error("PPL internal error"); + } + } +} + +template +void +Octagonal_Shape::affine_image(const Variable var, + const Linear_Expression& expr, + Coefficient_traits::const_reference + denominator) { + // The denominator cannot be zero. + if (denominator == 0) + throw_generic("affine_image(v, e, d)", "d == 0"); + + // Dimension-compatibility checks. + // The dimension of `expr' should not be greater than the dimension + // of `*this'. + const dimension_type 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 = 0; + + // Get information about the number of non-zero coefficients in `expr'. + // The `expr' must not be in two or plus variables. + for (dimension_type i = expr_space_dim; i-- > 0; ) + if (expr.coefficient(Variable(i)) != 0) { + if (t++ == 1) + break; + else + w_id = i; + } + + typedef typename OR_Matrix::row_iterator Row_Iterator; + typedef typename OR_Matrix::row_reference_type Row_Reference; + typedef typename OR_Matrix::const_row_iterator Row_iterator; + typedef typename OR_Matrix::const_row_reference_type Row_reference; + + const dimension_type n_var = 2*var_id; + const Coefficient& b = expr.inhomogeneous_term(); + PPL_DIRTY_TEMP_COEFFICIENT(minus_den); + neg_assign_r(minus_den, 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_den); + 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_den) { + // 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. + if (w_coeff == 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, minus_d); + div_round_up(minus_d, b, minus_den); + 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); + } + 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); + } + // Now update unary constraints on var. + mul2exp_assign_r(d, d, 1, ROUND_IGNORE); + N& m_cv_v = m_cv[n_var]; + add_assign_r(m_cv_v, m_cv_v, d, ROUND_UP); + mul2exp_assign_r(minus_d, minus_d, 1, ROUND_IGNORE); + N& m_v_cv = m_v[n_var+1]; + add_assign_r(m_v_cv, m_v_cv, minus_d, ROUND_UP); + } + reset_strongly_closed(); + } + else { + // Here `w_coeff == -denominator'. + // Remove the binary constraints on `var'. + forget_binary_octagonal_constraints(var_id); + const Row_Iterator m_begin = matrix.row_begin(); + Row_Iterator m_iter = m_begin + n_var; + N& m_v_cv = (*m_iter)[n_var+1]; + ++m_iter; + N& m_cv_v = (*m_iter)[n_var]; + // Swap the unary constraints on `var'. + std::swap(m_v_cv, m_cv_v); + // Strong closure is not preserved. + reset_strongly_closed(); + if (b != 0) { + // Translate the unary constraints on `var', + // adding or subtracting the value `b/denominator'. + PPL_DIRTY_TEMP(N, d); + div_round_up(d, b, denominator); + mul2exp_assign_r(d, d, 1, ROUND_IGNORE); + add_assign_r(m_cv_v, m_cv_v, d, ROUND_UP); + PPL_DIRTY_TEMP(N, minus_d); + div_round_up(minus_d, b, minus_den); + mul2exp_assign_r(minus_d, minus_d, 1, ROUND_IGNORE); + add_assign_r(m_v_cv, m_v_cv, minus_d, ROUND_UP); + } + incremental_strong_closure_assign(var); + } + } + 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_den); + } + else { + add_octagonal_constraint(n_var+1, n_w+1, b, denominator); + add_octagonal_constraint(n_var, n_w, b, minus_den); + } + 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_den); + } + else { + add_octagonal_constraint(n_var+1, n_w, b, denominator); + add_octagonal_constraint(n_var, n_w+1, b, minus_den); + } + incremental_strong_closure_assign(var); + } + 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_den = is_sc ? denominator : minus_den; + const Coefficient& minus_sc_den = is_sc ? minus_den : denominator; + // NOTE: here, for optimization purposes, `minus_expr' is only assigned + // when `denominator' is negative. Do not use it unless you are sure + // it has been correctly assigned. + Linear_Expression minus_expr; + if (!is_sc) + minus_expr = -expr; + const Linear_Expression& sc_expr = is_sc ? expr : minus_expr; + + 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_iter + (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. + div2exp_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. + div2exp_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. + div2exp_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. + div2exp_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) { + 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_den != 1) { + // Before computing quotients, the denominator should be approximated + // towards zero. Since `sc_den' is known to be positive, this amounts to + // rounding downwards, which is achieved as usual by rounding upwards + // `minus_sc_den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(pos_sum, pos_sum, down_sc_den, ROUND_UP); + } + // Add the upper bound constraint, if meaningful. + if (pos_pinf_count == 0) { + // Add the constraint `v <= pos_sum'. + PPL_DIRTY_TEMP(N, double_pos_sum); + mul2exp_assign_r(double_pos_sum, pos_sum, 1, ROUND_IGNORE); + 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_den, 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_den) + // 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_den) { + // 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_den != 1) { + // Before computing quotients, the denominator should be approximated + // towards zero. Since `sc_den' is known to be positive, this amounts to + // rounding downwards, which is achieved as usual by rounding upwards + // `minus_sc_den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(neg_sum, neg_sum, down_sc_den, ROUND_UP); + } + // Add the lower bound constraint, if meaningful. + if (neg_pinf_count == 0) { + // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'. + PPL_DIRTY_TEMP(N, double_neg_sum); + mul2exp_assign_r(double_neg_sum, neg_sum, 1, ROUND_IGNORE); + 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_den, 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_den) + // 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_den) { + // 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); + assert(OK()); +} + +template +void +Octagonal_Shape::affine_preimage(const Variable var, + const Linear_Expression& expr, + Coefficient_traits::const_reference + denominator) { + + // The denominator cannot be zero. + if (denominator == 0) + throw_generic("affine_preimage(v, e, d)", "d == 0"); + + // Dimension-compatibility checks. + // The dimension of `expr' should not be greater than the dimension + // of `*this'. + const dimension_type 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 = 0; + + // Get information about the number of the non-zero coefficients of `expr'. + for (dimension_type i = expr_space_dim; i-- > 0; ) + if (expr.coefficient(Variable(i)) != 0) { + if (t++ == 1) + break; + else + w_id = i; + } + + // `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); + 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); + 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); + assert(OK()); + } +} + +template +void +Octagonal_Shape +::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_generic("generalized_affine_image(v, r, e, d)", "d == 0"); + + // Dimension-compatibility checks. + // The dimension of `expr' should not be greater than the dimension + // of `*this'. + const dimension_type 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_generic("generalized_affine_image(v, r, e, d)", + "r is a strict relation symbol and " + "*this is an Octagonal_Shape"); + + 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 = 0; + + // Get information about the number of non-zero coefficients in `expr'. + // The `expr' must not be in two or plus variables. + for (dimension_type i = expr_space_dim; i-- > 0; ) + if (expr.coefficient(Variable(i)) != 0) { + if (t++ == 1) + break; + else + w_id = i; + } + + typedef typename OR_Matrix::row_iterator Row_Iterator; + typedef typename OR_Matrix::row_reference_type Row_Reference; + typedef typename OR_Matrix::const_row_iterator Row_iterator; + typedef typename OR_Matrix::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_den); + neg_assign_r(minus_den, 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_den); + break; + default: + // We already dealt with the other cases. + throw std::runtime_error("PPL internal error"); + } + 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_den) { + // 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); + } + mul2exp_assign_r(d, d, 1, ROUND_IGNORE); + 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]; + mul2exp_assign_r(d, d, 1, ROUND_IGNORE); + 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_den); + 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); + } + mul2exp_assign_r(d, d, 1, ROUND_IGNORE); + 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]; + mul2exp_assign_r(d, d, 1, ROUND_IGNORE); + 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_den); + else + add_octagonal_constraint(n_var, n_w, b, minus_den); + } + 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_den); + else + add_octagonal_constraint(n_var, n_w+1, b, minus_den); + } + } + break; + } + + default: + // We already dealt with the other cases. + throw std::runtime_error("PPL internal error"); + } + 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_den = is_sc ? denominator : minus_den; + const Coefficient& minus_sc_den = is_sc ? minus_den : denominator; + // NOTE: here, for optimization purposes, `minus_expr' is only assigned + // when `denominator' is negative. Do not use it unless you are sure + // it has been correctly assigned. + Linear_Expression minus_expr; + if (!is_sc) + minus_expr = -expr; + const Linear_Expression& sc_expr = is_sc ? expr : minus_expr; + + 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_iter + (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); + } + div2exp_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) { + assert(OK()); + return; + } + + // Divide by the (sign corrected) denominator (if needed). + if (sc_den != 1) { + // Before computing the quotient, the denominator should be + // approximated towards zero. Since `sc_den' is known to be + // positive, this amounts to rounding downwards, which is + // achieved as usual by rounding upwards + // `minus_sc_den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(sum, sum, down_sc_den, ROUND_UP); + } + + if (pinf_count == 0) { + // Add the constraint `v <= pos_sum'. + PPL_DIRTY_TEMP(N, double_sum); + mul2exp_assign_r(double_sum, sum, 1, ROUND_IGNORE); + 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_den, 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_den) { + // 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_iter + (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); + } + div2exp_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) { + assert(OK()); + return; + } + + // Divide by the (sign corrected) denominator (if needed). + if (sc_den != 1) { + // Before computing the quotient, the denominator should be + // approximated towards zero. Since `sc_den' is known to be + // positive, this amounts to rounding downwards, which is + // achieved as usual by rounding upwards + // `minus_sc_den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(sum, sum, down_sc_den, ROUND_UP); + } + + if (pinf_count == 0) { + // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'. + PPL_DIRTY_TEMP(N, double_sum); + mul2exp_assign_r(double_sum, sum, 1, ROUND_IGNORE); + 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_den, 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_den) { + // 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. + throw std::runtime_error("PPL internal error"); + } + incremental_strong_closure_assign(var); + assert(OK()); +} + +template +void +Octagonal_Shape::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_generic("generalized_affine_image(e1, r, e2)", + "r is a strict relation symbol and " + "*this is an Octagonal_Shape"); + + 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 = 0; + + // Compute the number of the non-zero components of `lhs'. + for (dimension_type i = lhs_space_dim; i-- > 0; ) + if (lhs.coefficient(Variable(i)) != 0) { + if (t_lhs++ == 1) + break; + else + j_lhs = i; + } + + const Coefficient& b_lhs = lhs.inhomogeneous_term(); + + if (t_lhs == 0) { + // `lhs' is a constant. + // In principle, it is sufficient to add the constraint `lhs relsym rhs'. + // Note that this constraint is 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. + throw std::runtime_error("PPL internal error"); + } + } + + else if (t_lhs == 1) { + // Here `lhs == a_lhs * v + b_lhs'. + // Independently from the form of `rhs', we can exploit the + // method computing generalized affine images for a single variable. + Variable v(j_lhs); + // Compute a sign-corrected relation symbol. + const Coefficient& den = lhs.coefficient(v); + Relation_Symbol new_relsym = relsym; + if (den < 0) { + if (relsym == LESS_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, den); + } + else { + // Here `lhs' is of the general form, having at least two variables. + // Compute the set of variables occurring in `lhs'. + bool lhs_vars_intersects_rhs_vars = false; + std::vector lhs_vars; + for (dimension_type i = lhs_space_dim; i-- > 0; ) + if (lhs.coefficient(Variable(i)) != 0) { + lhs_vars.push_back(Variable(i)); + if (rhs.coefficient(Variable(i)) != 0) + lhs_vars_intersects_rhs_vars = true; + } + + if (!lhs_vars_intersects_rhs_vars) { + // `lhs' and `rhs' variables are disjoint. + // 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. + throw std::runtime_error("PPL internal error"); + } + } + 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 = Variable(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(); + 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. + throw std::runtime_error("PPL internal error"); + } + // Remove the temporarily added dimension. + remove_higher_space_dimensions(space_dim-1); +#endif // Currently unnecessarily complex computation. + } + } + + assert(OK()); +} + +template +void +Octagonal_Shape::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_generic("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)", + "lb", lb_expr); + const dimension_type ub_space_dim = ub_expr.space_dimension(); + if (space_dim < ub_space_dim) + throw_dimension_incompatible("bounded_affine_image(v, lb, ub)", + "ub", ub_expr); + + 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 = 0; + + // Get information about the number of non-zero coefficients in `lb_expr'. + // The `expr' must not be in two or plus variables. + for (dimension_type i = lb_space_dim; i-- > 0; ) + if (lb_expr.coefficient(Variable(i)) != 0) { + if (t++ == 1) + break; + else + w_id = i; + } + + typedef typename OR_Matrix::row_iterator Row_Iterator; + typedef typename OR_Matrix::row_reference_type Row_Reference; + typedef typename OR_Matrix::const_row_iterator Row_iterator; + typedef typename OR_Matrix::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_den); + neg_assign_r(minus_den, 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_den); + 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_den) { + // 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 = Variable(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(); + 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_den); + else + add_octagonal_constraint(n_var, n_w, b, minus_den); + else { + // Add the new constraint `var + w >= b/denominator'. + if (var_id < w_id) + add_octagonal_constraint(n_w, n_var+1, b, minus_den); + else + add_octagonal_constraint(n_var, n_w+1, b, minus_den); + } + 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_den = is_sc ? denominator : minus_den; + const Coefficient& minus_sc_den = is_sc ? minus_den : denominator; + // NOTE: here, for optimization purposes, `minus_expr' is only assigned + // when `denominator' is negative. Do not use it unless you are sure + // it has been correctly assigned. + Linear_Expression minus_expr; + if (!is_sc) + minus_expr = -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_iter + (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. + div2exp_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. + div2exp_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_den != 1) { + // Before computing quotients, the denominator should be approximated + // towards zero. Since `sc_den' is known to be positive, this amounts to + // rounding downwards, which is achieved as usual by rounding upwards + // `minus_sc_den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(neg_sum, neg_sum, down_sc_den, ROUND_UP); + } + // Add the lower bound constraint, if meaningful. + if (neg_pinf_count == 0) { + // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'. + PPL_DIRTY_TEMP(N, double_neg_sum); + mul2exp_assign_r(double_neg_sum, neg_sum, 1, ROUND_IGNORE); + 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_den, 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_den) + // 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_den) { + // 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; + } + } + } + + assert(OK()); +} + + +template +void +Octagonal_Shape +::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_generic("generalized_affine_preimage(v, r, e, d)", "d == 0"); + + // Dimension-compatibility checks. + // The dimension of `expr' should not be greater than the dimension + // of `*this'. + const dimension_type 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_generic("generalized_affine_preimage(v, r, e, d)", + "r is a strict relation symbol and " + "*this is an Octagonal_Shape"); + + 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_den); + neg_assign(inverse_den, expr_v); + const Relation_Symbol inverse_relsym + = (sgn(denominator) == sgn(inverse_den)) ? relsym : reversed_relsym; + generalized_affine_image(var, inverse_relsym, inverse, inverse_den); + return; + } + + // Here `var_coefficient == 0', so that the preimage cannot + // be easily computed by inverting the affine relation. + // Shrink the 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); + assert(OK()); +} + +template +void +Octagonal_Shape +::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_generic("generalized_affine_preimage(e1, r, e2)", + "r is a strict relation symbol and " + "*this is an Octagonal_Shape"); + + 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 = 0; + + // Compute the number of the non-zero components of `lhs'. + for (dimension_type i = lhs_space_dim; i-- > 0; ) + if (lhs.coefficient(Variable(i)) != 0) { + if (t_lhs++ == 1) + break; + else + j_lhs = i; + } + + const Coefficient& b_lhs = lhs.inhomogeneous_term(); + + // If 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& den = lhs.coefficient(v); + Relation_Symbol new_relsym = relsym; + if (den < 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, den); + } + + else { + // Here `lhs' is of the general form, having at least two variables. + // Compute the set of variables occurring in `lhs'. + bool lhs_vars_intersects_rhs_vars = false; + std::vector lhs_vars; + for (dimension_type i = lhs_space_dim; i-- > 0; ) + if (lhs.coefficient(Variable(i)) != 0) { + lhs_vars.push_back(Variable(i)); + if (rhs.coefficient(Variable(i)) != 0) + lhs_vars_intersects_rhs_vars = true; + } + + if (!lhs_vars_intersects_rhs_vars) { + // `lhs' and `rhs' variables are disjoint. + // 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. + throw std::runtime_error("PPL internal error"); + } + + // 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 = Variable(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(); + 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. + throw std::runtime_error("PPL internal error"); + } + // Remove the temporarily added dimension. + remove_higher_space_dimensions(space_dim-1); + } + } + assert(OK()); +} + +template +void +Octagonal_Shape::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_generic("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)", + "lb", lb_expr); + const dimension_type ub_space_dim = ub_expr.space_dimension(); + if (space_dim < ub_space_dim) + throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub)", + "ub", ub_expr); + + 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 = Variable(space_dim); + add_space_dimensions_and_embed(1); + const Linear_Expression lb_inverse + = lb_expr - (expr_v + denominator)*var; + PPL_DIRTY_TEMP_COEFFICIENT(inverse_den); + neg_assign(inverse_den, expr_v); + affine_image(new_var, lb_inverse, inverse_den); + strong_closure_assign(); + assert(!marked_empty()); + generalized_affine_preimage(var, LESS_OR_EQUAL, + ub_expr, denominator); + if (sgn(denominator) == sgn(inverse_den)) + 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 +Constraint_System +Octagonal_Shape::constraints() const { + Constraint_System cs; + if (space_dim == 0) { + if (marked_empty()) + cs = Constraint_System::zero_dim_empty(); + } + else if (marked_empty()) + cs.insert(0*Variable(space_dim-1) <= -1); + else { + // KLUDGE: in the future `cs' will be constructed of the right dimension. + // For the time being, we force the dimension with the following line. + cs.insert(0*Variable(space_dim-1) <= 0); + + typedef typename OR_Matrix::const_row_iterator Row_Iterator; + typedef typename OR_Matrix::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 ax - ay = 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 ax + ay = 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 +void +Octagonal_Shape::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_generic("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::row_iterator Row_Iterator; + typedef typename OR_Matrix::row_reference_type Row_Reference; + typedef typename OR_Matrix::const_row_iterator Row_iterator; + typedef typename OR_Matrix::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(); + assert(OK()); +} + +template +void +Octagonal_Shape::fold_space_dimensions(const Variables_Set& to_be_folded, + Variable var) { + // `var' should be one of the dimensions of the octagon. + if (var.space_dimension() > space_dim) + throw_dimension_incompatible("fold_space_dimensions(tbf, v)", "v", var); + + // The folding of no dimensions is a no-op. + if (to_be_folded.empty()) + return; + + // All variables in `to_be_folded' should be dimensions of the octagon. + if (to_be_folded.space_dimension() > space_dim) + throw_dimension_incompatible("fold_space_dimensions(tbf, ...)", + to_be_folded.space_dimension()); + + // Moreover, `var.id()' should not occur in `to_be_folded'. + if (to_be_folded.find(var.id()) != to_be_folded.end()) + throw_generic("fold_space_dimensions(tbf, v)", + "v should not occur in tbf"); + + // Recompute the elements of the row and the column corresponding + // to variable `var' by taking the join of their value with the + // value of the corresponding elements in the row and column of the + // variable `to_be_folded'. + typedef typename OR_Matrix::row_iterator Row_Iterator; + typedef typename OR_Matrix::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_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 (Variables_Set::const_iterator i = to_be_folded.begin(), + tbf_end = to_be_folded.end(); i != tbf_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_var+1], m_tbf[tbf_var+1]); + max_assign(m_cv[n_var], m_ctbf[tbf_var]); + + const dimension_type min_id = std::min(n_var, tbf_var); + const dimension_type max_id = std::max(n_var, tbf_var); + + 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_var == min_id) { + max_assign(m_cj[n_var+1], m_tbf[j]); + max_assign(m_cj[n_var], m_ctbf[j]); + max_assign(m_j[n_var], m_ctbf[cj]); + max_assign(m_j[n_var+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_var+1], m_cj[tbf_var+1]); + max_assign(m_cj[n_var], m_cj[tbf_var]); + max_assign(m_j[n_var], m_j[tbf_var]); + max_assign(m_j[n_var+1], m_j[tbf_var+1]); + } + } + remove_space_dimensions(to_be_folded); +} + +template +bool +Octagonal_Shape +::BHZ09_upper_bound_assign_if_exact(const Octagonal_Shape& y) { + // Declare a const reference to *this (to avoid accidental modifications). + const Octagonal_Shape& x = *this; + const dimension_type x_space_dim = x.space_dimension(); + + // Private method: the caller must ensure the following. + 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. + assert(x.marked_strongly_closed()); + assert(y.marked_strongly_closed()); + // Pre-compute the upper bound of `x' and `y'. + Octagonal_Shape ub(x); + ub.upper_bound_assign(y); + + // Compute redundancy information for x and y. + // TODO: provide a nicer data structure for redundancy. + std::vector x_non_red; + x.non_redundant_matrix_entries(x_non_red); + std::vector 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::const_row_iterator Row_Iterator; + typedef typename OR_Matrix::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]; + const dimension_type ci = coherent_index(i); + const dimension_type row_size_i = OR_Matrix::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::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::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. + swap(ub); + assert(OK()); + return true; +} + +/*! \relates Parma_Polyhedra_Library::Octagonal_Shape */ +template +std::ostream& +IO_Operators::operator<<(std::ostream& s, const Octagonal_Shape& x) { + // Handle special cases first. + if (x.marked_empty()) { + s << "false"; + return s; + } + if (x.is_universe()) { + s << "true"; + return s; + } + + typedef typename Octagonal_Shape::coefficient_type N; + typedef typename OR_Matrix::const_row_iterator Row_Iterator; + typedef typename OR_Matrix::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 = x.matrix.row_begin(); + Row_Iterator m_end = x.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 = Variable(i/2); + const N& x_i_ii = (*i_iter)[i+1]; + ++i_iter; + const N& x_ii_i = (*i_iter)[i]; + ++i_iter; + // Check whether or not it is an equality constraint. + if (is_additive_inverse(x_i_ii, x_ii_i)) { + // It is an equality. + assert(!is_plus_infinity(x_i_ii) && !is_plus_infinity(x_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 (div2exp_assign_r(half, x_ii_i, 1, ROUND_UP) == V_EQ) + s << v_i << " == " << half; + else + s << "2*" << v_i << " == " << x_ii_i; + } + else { + // We will print unary non-strict inequalities, if any. + if (!is_plus_infinity(x_i_ii)) { + if (first) + first = false; + else + s << ", "; + neg_assign_r(negation, x_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 (div2exp_assign_r(half, negation, 1, ROUND_UP) == V_EQ) + s << v_i << " >= " << half; + else + s << "2*" << v_i << " >= " << negation; + } + if (!is_plus_infinity(x_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 (div2exp_assign_r(half, x_ii_i, 1, ROUND_UP) == V_EQ) + s << v_i << " <= " << half; + else + s << "2*" << v_i << " <= " << x_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 = Variable(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 = Variable(j/2); + // Print binary differences. + const N& x_ii_jj = r_ii[j+1]; + const N& x_i_j = r_i[j]; + // Check whether or not it is an equality constraint. + if (is_additive_inverse(x_ii_jj, x_i_j)) { + // It is an equality. + assert(!is_plus_infinity(x_i_j) && !is_plus_infinity(x_ii_jj)); + if (first) + first = false; + else + s << ", "; + if (sgn(x_i_j) >= 0) + s << v_j << " - " << v_i << " == " << x_i_j; + else + s << v_i << " - " << v_j << " == " << x_ii_jj; + } + else { + // We will print non-strict inequalities, if any. + if (!is_plus_infinity(x_i_j)) { + if (first) + first = false; + else + s << ", "; + if (sgn(x_i_j) >= 0) + s << v_j << " - " << v_i << " <= " << x_i_j; + else { + neg_assign_r(negation, x_i_j, ROUND_DOWN); + s << v_i << " - " << v_j << " >= " << negation; + } + } + if (!is_plus_infinity(x_ii_jj)) { + if (first) + first = false; + else + s << ", "; + if (sgn(x_ii_jj) >= 0) + s << v_i << " - " << v_j << " <= " << x_ii_jj; + else { + neg_assign_r(negation, x_ii_jj, ROUND_DOWN); + s << v_j << " - " << v_i << " >= " << negation; + } + } + } + // Print binary sums. + const N& x_i_jj = r_i[j+1]; + const N& x_ii_j = r_ii[j]; + // Check whether or not it is an equality constraint. + if (is_additive_inverse(x_i_jj, x_ii_j)) { + // It is an equality. + assert(!is_plus_infinity(x_i_jj) && !is_plus_infinity(x_ii_j)); + if (first) + first = false; + else + s << ", "; + s << v_j << " + " << v_i << " == " << x_ii_j; + } + else { + // We will print non-strict inequalities, if any. + if (!is_plus_infinity(x_i_jj)) { + if (first) + first = false; + else + s << ", "; + neg_assign_r(negation, x_i_jj, ROUND_DOWN); + s << v_j << " + " << v_i << " >= " << negation; + } + if (!is_plus_infinity(x_ii_j)) { + if (first) + first = false; + else + s << ", "; + s << v_j << " + " << v_i << " <= " << x_ii_j; + } + } + } + } + return s; +} + +template +void +Octagonal_Shape::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) + +template +bool +Octagonal_Shape::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; + + assert(OK()); + return true; +} + +template +memory_size_type +Octagonal_Shape::external_memory_in_bytes() const { + return matrix.external_memory_in_bytes(); +} + +template +bool +Octagonal_Shape::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::const_row_iterator i = matrix.row_begin(), + matrix_row_end = matrix.row_end(); i != matrix_row_end; ++i) { + typename OR_Matrix::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::const_row_iterator i = matrix.row_begin(), + m_end = matrix.row_end(); i != m_end; ++i) { + typename OR_Matrix::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::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 +void +Octagonal_Shape +::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 +void +Octagonal_Shape +::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 +void +Octagonal_Shape::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 +void +Octagonal_Shape::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 +void +Octagonal_Shape::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 +void +Octagonal_Shape::throw_constraint_incompatible(const char* method) const { + std::ostringstream s; + s << "PPL::Octagonal_Shape::" << method << ":\n" + << "the constraint is incompatible."; + throw std::invalid_argument(s.str()); +} + +template +void +Octagonal_Shape +::throw_expression_too_complex(const char* method, + const Linear_Expression& e) const { + using namespace IO_Operators; + std::ostringstream s; + s << "PPL::Octagonal_Shape::" << method << ":\n" + << e << " is too complex."; + throw std::invalid_argument(s.str()); +} + +template +void +Octagonal_Shape +::throw_dimension_incompatible(const char* method, + const char* name_row, + const Linear_Expression& y) const { + std::ostringstream s; + s << "PPL::Octagonal_Shape::" << method << ":\n" + << "this->space_dimension() == " << space_dimension() + << ", " << name_row << "->space_dimension() == " + << y.space_dimension() << "."; + throw std::invalid_argument(s.str()); +} + + +template +void +Octagonal_Shape::throw_generic(const char* method, + const char* reason) const { + 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..7781bc8 --- /dev/null +++ b/src/Octagonal_Shape.types.hh @@ -0,0 +1,22 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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 +class Octagonal_Shape; + +} + +#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..e5e1d73 --- /dev/null +++ b/src/Og_Status.idefs.hh @@ -0,0 +1,112 @@ +/* Octagonal_Shape::Status class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#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 object. +/*! + The assertions supported are: + - zero-dim universe: the polyhedron is the zero-dimensional + vector space \f$\Rset^0 = \{\cdot\}\f$; + - empty: the polyhedron is the empty set; + - strongly closed: 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: + - zero-dim universe excludes any other assertion; + - empty: excludes any other assertion. +*/ +class Status { +public: + //! By default Status is the zero-dim universe 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 true if successful, false 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 all bits in \p mask are set. + bool test_all(flags_t mask) const; + + //! Check whether at least one 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..9c339a5 --- /dev/null +++ b/src/Og_Status.inlines.hh @@ -0,0 +1,225 @@ +/* Octagonal_Shape::Status class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Og_Status_inlines_hh +#define PPL_Og_Status_inlines_hh 1 + +namespace Parma_Polyhedra_Library { + +template +inline +Octagonal_Shape::Status::Status(flags_t mask) + : flags(mask) { +} + +template +inline +Octagonal_Shape::Status::Status() + : flags(ZERO_DIM_UNIV) { +} + +template +inline bool +Octagonal_Shape::Status::test_all(flags_t mask) const { + return (flags & mask) == mask; +} + +template +inline bool +Octagonal_Shape::Status::test_any(flags_t mask) const { + return flags & mask; +} + +template +inline void +Octagonal_Shape::Status::set(flags_t mask) { + flags |= mask; +} + +template +inline void +Octagonal_Shape::Status::reset(flags_t mask) { + flags &= ~mask; +} + +template +inline bool +Octagonal_Shape::Status::test_zero_dim_univ() const { + return flags == ZERO_DIM_UNIV; +} + +template +inline void +Octagonal_Shape::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 +inline void +Octagonal_Shape::Status::set_zero_dim_univ() { + // Zero-dim universe is incompatible with anything else. + flags = ZERO_DIM_UNIV; +} + +template +inline bool +Octagonal_Shape::Status::test_empty() const { + return test_any(EMPTY); +} + +template +inline void +Octagonal_Shape::Status::reset_empty() { + reset(EMPTY); +} + +template +inline void +Octagonal_Shape::Status::set_empty() { + flags = EMPTY; +} + +template +inline bool +Octagonal_Shape::Status::test_strongly_closed() const { + return test_any(STRONGLY_CLOSED); +} + +template +inline void +Octagonal_Shape::Status::reset_strongly_closed() { + reset(STRONGLY_CLOSED); +} + +template +inline void +Octagonal_Shape::Status::set_strongly_closed() { + set(STRONGLY_CLOSED); +} + +template +inline bool +Octagonal_Shape::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 sep = ' '; + +/*! \relates Parma_Polyhedra_Library::Octagonal_Shape::Status + Reads a keyword and its associated on/off flag from \p s. + Returns true if the operation is successful, + returns false otherwise. + When successful, \p positive is set to true if the flag + is on; it is set to false 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 +inline void +Octagonal_Shape::Status::ascii_dump(std::ostream& s) const { + using namespace Implementation::Octagonal_Shapes; + s << (test_zero_dim_univ() ? yes : no) << zero_dim_univ + << sep + << (test_empty() ? yes : no) << empty + << sep + << sep + << (test_strongly_closed() ? yes : no) << strong_closed + << sep; +} + +template +inline bool +Octagonal_Shape::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. + assert(OK()); + return true; +} + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Og_Status_inlines_hh) diff --git a/src/Partially_Reduced_Product.defs.hh b/src/Partially_Reduced_Product.defs.hh new file mode 100644 index 0000000..b1097aa --- /dev/null +++ b/src/Partially_Reduced_Product.defs.hh @@ -0,0 +1,1593 @@ +/* Partially_Reduced_Product class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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 +std::ostream& +operator<<(std::ostream& s, const Partially_Reduced_Product& dp); + +} // namespace IO_Operators + +/*! \brief + Returns true 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 false is returned. +*/ +template +bool operator==(const Partially_Reduced_Product& x, + const Partially_Reduced_Product& y); + +/*! \brief + Returns true 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 true is returned. +*/ +template +bool operator!=(const Partially_Reduced_Product& x, + const Partially_Reduced_Product& 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 +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 +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 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 +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: + C_Polyhedron, + NNC_Polyhedron, + Grid, + Octagonal_Shape, + BD_Shape, + Box. + + An object of the class Partially_Reduced_Product + 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 No_Reduction class, + then the class Partially_Reduced_Product 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 is_universe() on both components returns true. + + \par + In all the examples it is assumed that the template \c R is the + No_Reduction 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 > + 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 > 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 > 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 > 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 +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::invalid_argument + Thrown if the system of congruences is imcompatible with one of the + components. + + \exception std::length_error + Thrown if the space dimension of \p cgs 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::invalid_argument + Thrown if the system of congruences is imcompatible with one of the + components. + + \exception std::length_error + Thrown if the space dimension of \p cgs 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::invalid_argument + Thrown if the system of constraints is imcompatible with one of the + components. + + \exception std::length_error + Thrown if the space dimension of \p cs 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::invalid_argument + Thrown if the system of constraints is imcompatible with one of the + components. + + \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 + Partially_Reduced_Product(const Box& 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 + Partially_Reduced_Product(const BD_Shape& 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 + Partially_Reduced_Product(const Octagonal_Shape& 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. + /*! + Builds a product containing \p y 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 y. + The product inherits the space dimension of y. + + \param y + The product to be approximated. + + \param complexity + The complexity that will not be exceeded. + + \exception std::length_error + Thrown if the space dimension of \p y exceeds the maximum allowed + space dimension. + + The built product is independent of the order of the components of \p y. + */ + template + explicit + Partially_Reduced_Product(const Partially_Reduced_Product& 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 is_included() + if and only if one or both of \p r1 and \p r2 imply + is_included(); + \p r implies saturates() + if and only if one or both of \p r1 and \p r2 imply + saturates(); + \p r implies is_disjoint() + if and only if one or both of \p r1 and \p r2 imply + is_disjoint(); + and \p r implies nothing() + if and only if both \p r1 and \p r2 imply + strictly_intersects(). + */ + 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 = subsumes() + if and only if \p r1 = \p r2 = subsumes(); + and \p r = nothing() + if and only if one or both of \p r1 and \p r2 = nothing(); + */ + Poly_Gen_Relation relation_with(const Generator& g) const; + + /*! \brief + Returns true if and only if either of the components + of \p *this are empty. + */ + bool is_empty() const; + + /*! \brief + Returns true if and only if both of the components + of \p *this are the universe. + */ + bool is_universe() const; + + /*! \brief + Returns true 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 true 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 true if and only if a component of \p *this + is discrete. + */ + bool is_discrete() const; + + /*! \brief + Returns true if and only if a component of \p *this + is bounded. + */ + bool is_bounded() const; + + /*! \brief + Returns true 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 true 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 true 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 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 + true 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, + false 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 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 + true if the supremum value can be reached in \p this. + + \param point + When maximization succeeds, will be assigned a generator 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, + false 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 true 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 + true 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, + false 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 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 + true if the infimum value can be reached in \p this. + + \param point + When minimization succeeds, will be assigned a generator 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, + false 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 true 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 true 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 to_be_unconstrained, + assigning the result to \p *this. + + \param to_be_unconstrained + 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 to_be_removed. + */ + void unconstrain(const Variables_Set& to_be_unconstrained); + + /*! \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, true + is returned, otherwise false 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 is a real widening for all the existing reduction + // operations. When new reductions are added, this must be rechecked. + + /*! \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 must 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); + + //@} // 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 max_space_dimension(). + */ + 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 max_space_dimension(). + */ + 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 and \ref Grid_Concatenate. + + \exception std::length_error + Thrown if the concatenation would cause the vector space + to exceed dimension max_space_dimension(). + */ + void concatenate_assign(const Partially_Reduced_Product& y); + + //! Removes all the specified dimensions from the vector space. + /*! + \param to_be_removed + The set of Variable objects corresponding to the space dimensions + to be removed. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with one of the + Variable objects contained in \p to_be_removed. + */ + void remove_space_dimensions(const Variables_Set& to_be_removed); + + /*! \brief + Removes the higher dimensions of the vector space so that the + resulting space will have dimension \p new_dimension. + + \exception std::invalid_argument + Thrown if \p new_dimensions is greater than the space dimension of + \p *this. + */ + void remove_higher_space_dimensions(dimension_type new_dimension); + + /*! \brief + Remaps the dimensions of the vector space according to + a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function". + + If \p pfunc maps only some of the dimensions of \p *this then the + rest will be projected away. + + If the highest dimension mapped to by \p pfunc is higher than the + highest dimension in \p *this then the number of dimensions in \p + *this will be increased to the highest dimension mapped to by \p + pfunc. + + \param pfunc + The partial function specifying the destiny of each space + dimension. + + The template class Partial_Function must provide the following + methods. + \code + bool has_empty_codomain() const + \endcode + returns true if and only if the represented partial + function has an empty codomain (i.e., it is always undefined). + The has_empty_codomain() method will always be called + before the methods below. However, if + has_empty_codomain() returns true, 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 max_in_codomain() 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 true is returned. If \f$f\f$ is + undefined in \f$k\f$, then false 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 + 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 max_space_dimension(). + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + and var 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 to_be_folded into \p var. + /*! + \param to_be_folded + The set of Variable objects corresponding to the space dimensions + to be folded; + + \param var + The variable corresponding to the space dimension that is the + destination of the folding operation. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with \p var or with + one of the Variable objects contained in \p to_be_folded. Also + thrown if \p var is contained in \p to_be_folded. + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + var has space dimension \f$k \leq n\f$, + \p to_be_folded is a set of variables whose maximum space dimension + is also less than or equal to \f$n\f$, and \p var is not a member + of \p to_be_folded, then the space dimensions corresponding to + variables in \p to_be_folded are + \ref 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& to_be_folded, Variable var); + + //@} // Member Functions that May Modify the Dimension of the Vector Space + + friend bool operator==<>(const Partially_Reduced_Product& x, + const Partially_Reduced_Product& y); + + friend std::ostream& + Parma_Polyhedra_Library::IO_Operators:: + operator<<<>(std::ostream& s, const Partially_Reduced_Product& 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 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 true if successful, false 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 x == y, + then x.hash_code() == y.hash_code(). + */ + int32_t hash_code() const; + + //@} // Miscellaneous Member Functions + + //! Reduce. + /* + \return + true 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 true 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; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS + //! \name Exception Throwers + //@{ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +protected: + void throw_runtime_error(const char* method) const; + void throw_invalid_argument(const char* method, const char* reason) const; + + + // Note: it has to be a static method, because it can be called inside + // constructors (before actually constructing the polyhedron object). + static void throw_space_dimension_overflow(const char* method, + const char* reason); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS + //@} // Exception Throwers +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) + +}; + +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 Domain_Product::Direct_Product will simply + be denoted by Direct_Product. +*/ +template +class Domain_Product { +public: + typedef Partially_Reduced_Product > + Direct_Product; + + typedef Partially_Reduced_Product > + Smash_Product; + + typedef Partially_Reduced_Product > + Constraints_Product; +}; + +} // namespace Parma_Polyhedra_Library + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */ + template +void swap(Parma_Polyhedra_Library::Partially_Reduced_Product& x, + Parma_Polyhedra_Library::Partially_Reduced_Product& y); + +} // namespace std + +#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..a6f209d --- /dev/null +++ b/src/Partially_Reduced_Product.inlines.hh @@ -0,0 +1,827 @@ +/* Partially_Reduced_Product class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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 +inline dimension_type +Partially_Reduced_Product::max_space_dimension() { + return std::min(D1::max_space_dimension(), D2::max_space_dimension()); +} + +template +inline +Partially_Reduced_Product +::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"), + 0), kind), + d2(num_dimensions, kind) { + set_reduced_flag(); +} + +template +inline +Partially_Reduced_Product +::Partially_Reduced_Product(const Congruence_System& ccgs) + : d1((ccgs.space_dimension() <= max_space_dimension()) + ? ccgs + : (throw_space_dimension_overflow + ("Partially_Reduced_Product(n, k)", + "the space dimension of ccgs " + "exceeds the maximum allowed " + "space dimension"), ccgs)), + d2(ccgs) { + clear_reduced_flag(); +} + +template +inline +Partially_Reduced_Product +::Partially_Reduced_Product(Congruence_System& cgs) + : d1((cgs.space_dimension() <= max_space_dimension()) + ? const_cast(cgs) + : (throw_space_dimension_overflow + ("Partially_Reduced_Product(n, k)", + "the space dimension of cgs " + "exceeds the maximum allowed " + "space dimension"), cgs)), + d2(cgs) { + clear_reduced_flag(); +} + +template +inline +Partially_Reduced_Product +::Partially_Reduced_Product(const Constraint_System& ccs) + : d1((ccs.space_dimension() <= max_space_dimension()) + ? ccs + : (throw_space_dimension_overflow + ("Partially_Reduced_Product(n, k)", + "the space dimension of ccs " + "exceeds the maximum allowed " + "space dimension"), ccs)), + d2(ccs) { + clear_reduced_flag(); +} + +template +inline +Partially_Reduced_Product +::Partially_Reduced_Product(Constraint_System& cs) + : d1((cs.space_dimension() <= max_space_dimension()) + ? const_cast(cs) + : (throw_space_dimension_overflow + ("Partially_Reduced_Product(n, k)", + "the space dimension of cs " + "exceeds the maximum allowed " + "space dimension"), cs)), + d2(cs) { + clear_reduced_flag(); +} + +template +inline +Partially_Reduced_Product +::Partially_Reduced_Product(const C_Polyhedron& ph, + Complexity_Class complexity) + : d1((ph.space_dimension() <= max_space_dimension()) + ? ph + : (throw_space_dimension_overflow + ("Partially_Reduced_Product(n, k)", + "the space dimension of ph " + "exceeds the maximum allowed " + "space dimension"), ph), complexity), + d2(ph, complexity) { + set_reduced_flag(); +} + +template +inline +Partially_Reduced_Product +::Partially_Reduced_Product(const NNC_Polyhedron& ph, + Complexity_Class complexity) + : d1((ph.space_dimension() <= max_space_dimension()) + ? ph + : (throw_space_dimension_overflow + ("Partially_Reduced_Product(n, k)", + "the space dimension of ph " + "exceeds the maximum allowed " + "space dimension"), ph), complexity), + d2(ph, complexity) { + set_reduced_flag(); +} + +template +inline +Partially_Reduced_Product +::Partially_Reduced_Product(const Grid& gr, Complexity_Class) + : d1((gr.space_dimension() <= max_space_dimension()) + ? gr + : (throw_space_dimension_overflow + ("Partially_Reduced_Product(n, k)", + "the space dimension of gr " + "exceeds the maximum allowed " + "space dimension"), gr)), + d2(gr) { + set_reduced_flag(); +} + +template +template +inline +Partially_Reduced_Product +::Partially_Reduced_Product(const Box& box, Complexity_Class) + : d1((box.space_dimension() <= max_space_dimension()) + ? box + : (throw_space_dimension_overflow + ("Partially_Reduced_Product(n, k)", + "the space dimension of box " + "exceeds the maximum allowed " + "space dimension"), box)), + d2(box) { + set_reduced_flag(); +} + +template +template +inline +Partially_Reduced_Product +::Partially_Reduced_Product(const BD_Shape& bd, Complexity_Class) + : d1((bd.space_dimension() <= max_space_dimension()) + ? bd + : (throw_space_dimension_overflow + ("Partially_Reduced_Product(n, k)", + "the space dimension of bd " + "exceeds the maximum allowed " + "space dimension"), bd)), + d2(bd) { + set_reduced_flag(); +} + +template +template +inline +Partially_Reduced_Product +::Partially_Reduced_Product(const Octagonal_Shape& os, Complexity_Class) + : d1((os.space_dimension() <= max_space_dimension()) + ? os + : (throw_space_dimension_overflow + ("Partially_Reduced_Product(n, k)", + "the space dimension of os " + "exceeds the maximum allowed " + "space dimension"), os)), + d2(os) { + set_reduced_flag(); +} + +template +inline +Partially_Reduced_Product +::Partially_Reduced_Product(const Partially_Reduced_Product& y, + Complexity_Class) + : d1(y.d1), d2(y.d2) { + reduced = y.reduced; +} + +template +inline +Partially_Reduced_Product::~Partially_Reduced_Product() { +} + +template +inline memory_size_type +Partially_Reduced_Product::external_memory_in_bytes() const { + return d1.external_memory_in_bytes() + d2.external_memory_in_bytes(); +} + +template +inline memory_size_type +Partially_Reduced_Product::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +template +inline dimension_type +Partially_Reduced_Product::space_dimension() const { + assert(d1.space_dimension() == d2.space_dimension()); + return d1.space_dimension(); +} + +template +inline dimension_type +Partially_Reduced_Product::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 +inline void +Partially_Reduced_Product +::unconstrain(const Variable var) { + reduce(); + d1.unconstrain(var); + d2.unconstrain(var); +} + +template +inline void +Partially_Reduced_Product +::unconstrain(const Variables_Set& to_be_unconstrained) { + reduce(); + d1.unconstrain(to_be_unconstrained); + d2.unconstrain(to_be_unconstrained); +} + +template +inline void +Partially_Reduced_Product +::intersection_assign(const Partially_Reduced_Product& y) { + d1.intersection_assign(y.d1); + d2.intersection_assign(y.d2); + clear_reduced_flag(); +} + +template +inline void +Partially_Reduced_Product +::difference_assign(const Partially_Reduced_Product& y) { + reduce(); + y.reduce(); + d1.difference_assign(y.d1); + d2.difference_assign(y.d2); + clear_reduced_flag(); +} + +template +inline void +Partially_Reduced_Product +::upper_bound_assign(const Partially_Reduced_Product& y) { + reduce(); + y.reduce(); + d1.upper_bound_assign(y.d1); + d2.upper_bound_assign(y.d2); + // CHECKME: if upper_bound_assign is not a least_upper_bound + // it may not be reduced. + // clear_reduced_flag(); +} + +template +inline bool +Partially_Reduced_Product +::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; + std::swap(d1,d1_copy); + return true; +} + +template +inline void +Partially_Reduced_Product +::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); +} + +template +inline void +Partially_Reduced_Product +::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); +} + +template +inline void +Partially_Reduced_Product +::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); +} + +template +inline void +Partially_Reduced_Product +::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); +} + +template +inline void +Partially_Reduced_Product +::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); +} + +template +inline void +Partially_Reduced_Product +::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); +} + + +template +inline void +Partially_Reduced_Product +::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 +inline void +Partially_Reduced_Product +::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 +inline void +Partially_Reduced_Product +::time_elapse_assign(const Partially_Reduced_Product& y) { + reduce(); + y.reduce(); + d1.time_elapse_assign(y.d1); + d2.time_elapse_assign(y.d2); +} + +template +inline void +Partially_Reduced_Product::topological_closure_assign() { + d1.topological_closure_assign(); + d2.topological_closure_assign(); +} + +template +inline void +Partially_Reduced_Product::swap(Partially_Reduced_Product& y) { + std::swap(d1, y.d1); + std::swap(d2, y.d2); + std::swap(reduced, y.reduced); +} + +template +inline void +Partially_Reduced_Product::add_constraint(const Constraint& c) { + d1.add_constraint(c); + d2.add_constraint(c); + clear_reduced_flag(); +} + +template +inline void +Partially_Reduced_Product::refine_with_constraint(const Constraint& c) { + d1.refine_with_constraint(c); + d2.refine_with_constraint(c); + clear_reduced_flag(); +} + +template +inline void +Partially_Reduced_Product::add_congruence(const Congruence& cg) { + d1.add_congruence(cg); + d2.add_congruence(cg); + clear_reduced_flag(); +} + +template +inline void +Partially_Reduced_Product::refine_with_congruence(const Congruence& cg) { + d1.refine_with_congruence(cg); + d2.refine_with_congruence(cg); + clear_reduced_flag(); +} + +template +inline void +Partially_Reduced_Product +::add_constraints(const Constraint_System& cs) { + d1.add_constraints(cs); + d2.add_constraints(cs); + clear_reduced_flag(); +} + +template +inline void +Partially_Reduced_Product +::refine_with_constraints(const Constraint_System& cs) { + d1.refine_with_constraints(cs); + d2.refine_with_constraints(cs); + clear_reduced_flag(); +} + +template +inline void +Partially_Reduced_Product +::add_congruences(const Congruence_System& cgs) { + d1.add_congruences(cgs); + d2.add_congruences(cgs); + clear_reduced_flag(); +} + +template +inline void +Partially_Reduced_Product +::refine_with_congruences(const Congruence_System& cgs) { + d1.refine_with_congruences(cgs); + d2.refine_with_congruences(cgs); + clear_reduced_flag(); +} + +template +inline Partially_Reduced_Product& +Partially_Reduced_Product +::operator=(const Partially_Reduced_Product& y) { + d1 = y.d1; + d2 = y.d2; + reduced = y.reduced; + return *this; +} + +template +inline const D1& +Partially_Reduced_Product::domain1() const { + reduce(); + return d1; +} + +template +inline const D2& +Partially_Reduced_Product::domain2() const { + reduce(); + return d2; +} + +template +inline bool +Partially_Reduced_Product::is_empty() const { + reduce(); + return d1.is_empty() || d2.is_empty(); +} + +template +inline bool +Partially_Reduced_Product::is_universe() const { + return d1.is_universe() && d2.is_universe(); +} + +template +inline bool +Partially_Reduced_Product::is_topologically_closed() const { + reduce(); + return d1.is_topologically_closed() && d2.is_topologically_closed(); +} + +template +inline bool +Partially_Reduced_Product +::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 +inline bool +Partially_Reduced_Product::is_discrete() const { + reduce(); + return d1.is_discrete() || d2.is_discrete(); +} + +template +inline bool +Partially_Reduced_Product::is_bounded() const { + reduce(); + return d1.is_bounded() || d2.is_bounded(); +} + +template +inline bool +Partially_Reduced_Product +::bounds_from_above(const Linear_Expression& expr) const { + reduce(); + return d1.bounds_from_above(expr) || d2.bounds_from_above(expr); +} + +template +inline bool +Partially_Reduced_Product +::bounds_from_below(const Linear_Expression& expr) const { + reduce(); + return d1.bounds_from_below(expr) || d2.bounds_from_below(expr); +} + +template +inline bool +Partially_Reduced_Product::constrains(Variable var) const { + reduce(); + return d1.constrains(var) || d2.constrains(var); +} + +template +inline void +Partially_Reduced_Product +::widening_assign(const Partially_Reduced_Product& y, + unsigned* tp) { + reduce(); + y.reduce(); + d1.widening_assign(y.d1, tp); + d2.widening_assign(y.d2, tp); +} + +template +inline void +Partially_Reduced_Product +::add_space_dimensions_and_embed(dimension_type m) { + d1.add_space_dimensions_and_embed(m); + d2.add_space_dimensions_and_embed(m); +} + +template +inline void +Partially_Reduced_Product +::add_space_dimensions_and_project(dimension_type m) { + d1.add_space_dimensions_and_project(m); + d2.add_space_dimensions_and_project(m); +} + +template +inline void +Partially_Reduced_Product +::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 +inline void +Partially_Reduced_Product +::remove_space_dimensions(const Variables_Set& to_be_removed) { + d1.remove_space_dimensions(to_be_removed); + d2.remove_space_dimensions(to_be_removed); +} + +template +inline void +Partially_Reduced_Product +::remove_higher_space_dimensions(dimension_type new_dimension) { + d1.remove_higher_space_dimensions(new_dimension); + d2.remove_higher_space_dimensions(new_dimension); +} + +template +template +inline void +Partially_Reduced_Product +::map_space_dimensions(const Partial_Function& pfunc) { + d1.map_space_dimensions(pfunc); + d2.map_space_dimensions(pfunc); +} + +template +inline void +Partially_Reduced_Product +::expand_space_dimension(Variable var, dimension_type m) { + d1.expand_space_dimension(var, m); + d2.expand_space_dimension(var, m); +} + +template +inline void +Partially_Reduced_Product +::fold_space_dimensions(const Variables_Set& to_be_folded, + Variable var) { + d1.fold_space_dimensions(to_be_folded, var); + d2.fold_space_dimensions(to_be_folded, var); +} + +template +inline bool +Partially_Reduced_Product +::contains(const Partially_Reduced_Product& y) const { + reduce(); + y.reduce(); + return d1.contains(y.d1) && d2.contains(y.d2); +} + +template +inline bool +Partially_Reduced_Product +::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 +inline bool +Partially_Reduced_Product::reduce() const { + Partially_Reduced_Product& dp + = const_cast(*this); + if (dp.is_reduced()) + return false; + R r; + r.product_reduce(dp.d1, dp.d2); + set_reduced_flag(); + return true; +} + +template +inline bool +Partially_Reduced_Product::is_reduced() const { + return reduced; +} + +template +inline void +Partially_Reduced_Product::clear_reduced_flag() const { + const_cast(*this).reduced = false; +} + +template +inline void +Partially_Reduced_Product::set_reduced_flag() const { + const_cast(*this).reduced = true; +} + +PPL_OUTPUT_3_PARAM_TEMPLATE_DEFINITIONS(D1, D2, R, Partially_Reduced_Product) + +template +inline void +Partially_Reduced_Product::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 +inline int32_t +Partially_Reduced_Product::hash_code() const { + return space_dimension() & 0x7fffffff; +} + +/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */ +template +inline bool +operator==(const Partially_Reduced_Product& x, + const Partially_Reduced_Product& y) { + x.reduce(); + y.reduce(); + return x.d1 == y.d1 && x.d2 == y.d2; +} + +/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */ +template +inline bool +operator!=(const Partially_Reduced_Product& x, + const Partially_Reduced_Product& y) { + return !(x == y); +} + +/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */ +template +inline std::ostream& +IO_Operators::operator<<(std::ostream& s, const Partially_Reduced_Product& pd) { + return s << "Domain 1:\n" + << pd.d1 + << "Domain 2:\n" + << pd.d2; +} + +template +void +Partially_Reduced_Product::throw_space_dimension_overflow(const char* method, + const char* reason) { + std::ostringstream s; + s << "Partially_Reduced_Product::" << method << ":" << std::endl + << reason << "."; + throw std::length_error(s.str()); +} + +} // namespace Parma_Polyhedra_Library + +namespace Parma_Polyhedra_Library { + +template +inline +No_Reduction::No_Reduction() { +} + +template +void No_Reduction::product_reduce(D1&, D2&) { +} + +template +inline +No_Reduction::~No_Reduction() { +} + +template +inline +Smash_Reduction::Smash_Reduction() { +} + +template +inline +Smash_Reduction::~Smash_Reduction() { +} + +template +inline +Constraints_Reduction::Constraints_Reduction() { +} + +template +inline +Constraints_Reduction::~Constraints_Reduction() { +} + +} // namespace Parma_Polyhedra_Library + +/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */ +template +inline void +std::swap(Parma_Polyhedra_Library::Partially_Reduced_Product& x, + Parma_Polyhedra_Library::Partially_Reduced_Product& y) { + x.swap(y); +} + +#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..962bc1e --- /dev/null +++ b/src/Partially_Reduced_Product.templates.hh @@ -0,0 +1,519 @@ +/* Partially_Reduced_Product class implementation: + non-inline template functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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 +#include + +namespace Parma_Polyhedra_Library { + +template +template +inline +Partially_Reduced_Product +::Partially_Reduced_Product(const Partially_Reduced_Product& y, + Complexity_Class complexity) + : d1((y.space_dimension() > max_space_dimension()) + ? (throw_space_dimension_overflow + ("Partially_Reduced_Product(y)", + "the space dimension of y " + "exceeds the maximum allowed " + "space dimension"), 0) + : y.space_dimension()), + d2(y.space_dimension()) { + Partially_Reduced_Product x1(y.domain1(), complexity); + const Partially_Reduced_Product x2(y.domain2(), complexity); + x1.intersection_assign(x2); + d1.swap(x1.d1); + d2.swap(x1.d2); + /* Even if y is reduced, the built product may not be reduced as + the reduction method may have changed (i.e., S != R). */ + reduced = false; +} + +template +Constraint_System +Partially_Reduced_Product::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 +Constraint_System +Partially_Reduced_Product::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 +Congruence_System +Partially_Reduced_Product::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 +Congruence_System +Partially_Reduced_Product::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 +void +Partially_Reduced_Product +::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 +void +Partially_Reduced_Product +::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 +Poly_Gen_Relation +Partially_Reduced_Product +::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 +Poly_Con_Relation +Partially_Reduced_Product +::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 +Poly_Con_Relation +Partially_Reduced_Product +::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 +bool +Partially_Reduced_Product +::maximize(const Linear_Expression& expr, + Coefficient& sup_n, + Coefficient& sup_d, + bool& maximum) const { + // If one component is already empty, then there is no need to reduce. + if (d1.is_empty() || d2.is_empty()) + return false; + + // The product is_empty() test also reduces the product. + if (is_empty()) + return false; + 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; + 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 +bool +Partially_Reduced_Product +::minimize(const Linear_Expression& expr, + Coefficient& inf_n, + Coefficient& inf_d, + bool& minimum) const { + // If one component is already empty, then there is no need to reduce. + if (d1.is_empty() || d2.is_empty()) + return false; + + // The product is_empty() test also reduces the product. + if (is_empty()) + return false; + 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 +bool +Partially_Reduced_Product +::maximize(const Linear_Expression& expr, + Coefficient& sup_n, + Coefficient& sup_d, + bool& maximum, + Generator& pnt) const { + // If one component is already empty, then there is no need to reduce. + if (d1.is_empty() || d2.is_empty()) + return false; + + // The product is_empty() test also reduces the product. + if (is_empty()) + return false; + 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 pnt1(point()); + Generator pnt2(point()); + bool r1 = d1.maximize(expr, sup1_n, sup1_d, maximum1, pnt1); + bool r2 = d2.maximize(expr, sup2_n, sup2_d, maximum2, pnt2); + // 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; + pnt = pnt2; + 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; + pnt = pnt1; + 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; + pnt = pnt1; + } + else { + sup_n = sup2_n; + sup_d = sup2_d; + maximum = maximum2; + pnt = pnt2; + } + return true; + } + +template +bool +Partially_Reduced_Product +::minimize(const Linear_Expression& expr, + Coefficient& inf_n, + Coefficient& inf_d, + bool& minimum, + Generator& pnt) const { + // If one component is already empty, then there is no need to reduce. + if (d1.is_empty() || d2.is_empty()) + return false; + + // The product is_empty() test also reduces the product. + if (is_empty()) + return false; + 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 pnt1(point()); + Generator pnt2(point()); + bool r1 = d1.minimize(expr, inf1_n, inf1_d, minimum1, pnt1); + bool r2 = d2.minimize(expr, inf2_n, inf2_d, minimum2, pnt2); + // 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; + pnt = pnt2; + 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; + pnt = pnt1; + 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; + pnt = pnt1; + } + else { + inf_n = inf2_n; + inf_d = inf2_d; + minimum = minimum2; + pnt = pnt2; + } + return true; + } + +template +inline bool +Partially_Reduced_Product::OK() const { + if (reduced) { + Partially_Reduced_Product pd1 = *this; + Partially_Reduced_Product pd2 = *this; + /* Force pd1 reduction */ + pd1.clear_reduced_flag(); + pd1.reduce(); + if (pd1 != pd2) + return false; + } + return d1.OK() && d2.OK(); +} + +template +bool +Partially_Reduced_Product::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); + return ((s >> str) && str == "Domain" + && (s >> str) && str == "1:" + && d1.ascii_load(s) + && (s >> str) && str == "Domain" + && (s >> str) && str == "2:" + && d2.ascii_load(s)); +} + +template +void Smash_Reduction::product_reduce(D1& d1, D2& d2) { + if (d2.is_empty()) { + if (!d1.is_empty()) { + D1 new_d1(d1.space_dimension(), EMPTY); + std::swap(d1, new_d1); + } + } + else if (d1.is_empty()) { + D2 new_d2(d2.space_dimension(), EMPTY); + std::swap(d2, new_d2); + } +} + +template +void Constraints_Reduction::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 sr; + sr.product_reduce(d1, d2); + return; + } + else { + d1.refine_with_constraints(d2.minimized_constraints()); + d2.refine_with_constraints(d1.minimized_constraints()); + } +} + +} // 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..9d41b81 --- /dev/null +++ b/src/Partially_Reduced_Product.types.hh @@ -0,0 +1,31 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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 +class Smash_Reduction; + +template +class Constraints_Reduction; + +template +class No_Reduction; + +template +class Partially_Reduced_Product; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Partially_Reduced_Product_types_hh) diff --git a/src/Ph_Status.cc b/src/Ph_Status.cc new file mode 100644 index 0000000..5f773a1 --- /dev/null +++ b/src/Ph_Status.cc @@ -0,0 +1,245 @@ +/* Polyhedron::Status class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Polyhedron.defs.hh" +#include +#include +#include + +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 true if the operation is successful, + returns false otherwise. + When successful, \p positive is set to true if the flag + is on; it is set to false 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. + 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..ada2f49 --- /dev/null +++ b/src/Ph_Status.idefs.hh @@ -0,0 +1,182 @@ +/* Polyhedron::Status class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Status_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: + - zero-dim universe: the polyhedron is the zero-dimension + vector space \f$\Rset^0 = \{\cdot\}\f$; + - empty: the polyhedron is the empty set; + - constraints pending: 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; + - generators pending: 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; + - constraints up-to-date: the polyhedron is correctly + characterized by the attached system of constraints, modulo the + processing of pending generators; + - generators up-to-date: the polyhedron is correctly + characterized by the attached system of generators, modulo the + processing of pending constraints; + - constraints minimized: the non-pending part of the system + of constraints attached to the polyhedron is in minimal form; + - generators minimized: the non-pending part of the system + of generators attached to the polyhedron is in minimal form; + - constraints' saturation matrix up-to-date: 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; + - generators' saturation matrix up-to-date: 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: + - zero-dim universe excludes any other assertion; + - empty: excludes any other assertion; + - constraints pending and generators pending + are mutually exclusive; + - constraints pending implies both constraints minimized + and generators minimized; + - generators pending implies both constraints minimized + and generators minimized; + - constraints minimized implies constraints up-to-date; + - generators minimized implies generators up-to-date; + - constraints' saturation matrix up-to-date implies both + constraints up-to-date and generators up-to-date; + - generators' saturation matrix up-to-date implies both + constraints up-to-date and generators up-to-date. +*/ +class Status { +public: + //! By default Status is the zero-dim universe 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 true if successful, false 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 all bits in \p mask are set. + bool test_all(flags_t mask) const; + + //! Check whether at least one 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..285a5f2 --- /dev/null +++ b/src/Ph_Status.inlines.hh @@ -0,0 +1,216 @@ +/* Polyhedron::Status class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Status_inlines_hh +#define PPL_Status_inlines_hh 1 + +namespace Parma_Polyhedra_Library { + +inline +Polyhedron::Status::Status(flags_t mask) + : flags(mask) { +} + +inline +Polyhedron::Status::Status() + : flags(ZERO_DIM_UNIV) { +} + +inline bool +Polyhedron::Status::test_all(flags_t mask) const { + return (flags & mask) == mask; +} + +inline bool +Polyhedron::Status::test_any(flags_t mask) const { + return flags & mask; +} + +inline void +Polyhedron::Status::set(flags_t mask) { + flags |= mask; +} + +inline void +Polyhedron::Status::reset(flags_t mask) { + flags &= ~mask; +} + +inline bool +Polyhedron::Status::test_zero_dim_univ() const { + return flags == ZERO_DIM_UNIV; +} + +inline void +Polyhedron::Status::reset_zero_dim_univ() { + // This is a no-op if the current status is not zero-dim. + if (flags == ZERO_DIM_UNIV) + // In the zero-dim space, if it is not the universe it is empty. + flags = EMPTY; +} + +inline void +Polyhedron::Status::set_zero_dim_univ() { + // Zero-dim universe is incompatible with anything else. + flags = ZERO_DIM_UNIV; +} + +inline bool +Polyhedron::Status::test_empty() const { + return test_any(EMPTY); +} + +inline void +Polyhedron::Status::reset_empty() { + reset(EMPTY); +} + +inline void +Polyhedron::Status::set_empty() { + flags = EMPTY; +} + +inline bool +Polyhedron::Status::test_c_up_to_date() const { + return test_any(C_UP_TO_DATE); +} + +inline void +Polyhedron::Status::reset_c_up_to_date() { + reset(C_UP_TO_DATE); +} + +inline void +Polyhedron::Status::set_c_up_to_date() { + set(C_UP_TO_DATE); +} + +inline bool +Polyhedron::Status::test_g_up_to_date() const { + return test_any(G_UP_TO_DATE); +} + +inline void +Polyhedron::Status::reset_g_up_to_date() { + reset(G_UP_TO_DATE); +} + +inline void +Polyhedron::Status::set_g_up_to_date() { + set(G_UP_TO_DATE); +} + +inline bool +Polyhedron::Status::test_c_minimized() const { + return test_any(C_MINIMIZED); +} + +inline void +Polyhedron::Status::reset_c_minimized() { + reset(C_MINIMIZED); +} + +inline void +Polyhedron::Status::set_c_minimized() { + set(C_MINIMIZED); +} + +inline bool +Polyhedron::Status::test_g_minimized() const { + return test_any(G_MINIMIZED); +} + +inline void +Polyhedron::Status::reset_g_minimized() { + reset(G_MINIMIZED); +} + +inline void +Polyhedron::Status::set_g_minimized() { + set(G_MINIMIZED); +} + + +inline bool +Polyhedron::Status::test_c_pending() const { + return test_any(CS_PENDING); +} + +inline void +Polyhedron::Status::reset_c_pending() { + reset(CS_PENDING); +} + +inline void +Polyhedron::Status::set_c_pending() { + set(CS_PENDING); +} + +inline bool +Polyhedron::Status::test_g_pending() const { + return test_any(GS_PENDING); +} + +inline void +Polyhedron::Status::reset_g_pending() { + reset(GS_PENDING); +} + +inline void +Polyhedron::Status::set_g_pending() { + set(GS_PENDING); +} + + +inline bool +Polyhedron::Status::test_sat_c_up_to_date() const { + return test_any(SAT_C_UP_TO_DATE); +} + +inline void +Polyhedron::Status::reset_sat_c_up_to_date() { + reset(SAT_C_UP_TO_DATE); +} + +inline void +Polyhedron::Status::set_sat_c_up_to_date() { + set(SAT_C_UP_TO_DATE); +} + +inline bool +Polyhedron::Status::test_sat_g_up_to_date() const { + return test_any(SAT_G_UP_TO_DATE); +} + +inline void +Polyhedron::Status::reset_sat_g_up_to_date() { + reset(SAT_G_UP_TO_DATE); +} + +inline void +Polyhedron::Status::set_sat_g_up_to_date() { + set(SAT_G_UP_TO_DATE); +} + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Status_inlines_hh) diff --git a/src/Pointset_Powerset.cc b/src/Pointset_Powerset.cc new file mode 100644 index 0000000..e9933db --- /dev/null +++ b/src/Pointset_Powerset.cc @@ -0,0 +1,341 @@ +/* Pointset_Powerset class implementation: non-inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include +#include "Pointset_Powerset.defs.hh" +#include "Grid.defs.hh" +#include + +namespace PPL = Parma_Polyhedra_Library; + +template <> +void +PPL::Pointset_Powerset +::difference_assign(const Pointset_Powerset& y) { + Pointset_Powerset& x = *this; + // Ensure omega-reduction. + x.omega_reduce(); + y.omega_reduce(); + Sequence new_sequence = x.sequence; + for (const_iterator yi = y.begin(), y_end = y.end(); yi != y_end; ++yi) { + const NNC_Polyhedron& py = yi->element(); + Sequence tmp_sequence; + for (Sequence_const_iterator nsi = new_sequence.begin(), + ns_end = new_sequence.end(); nsi != ns_end; ++nsi) { + std::pair > partition + = linear_partition(py, nsi->element()); + const Pointset_Powerset& residues = partition.second; + // Append the contents of `residues' to `tmp_sequence'. + std::copy(residues.begin(), residues.end(), back_inserter(tmp_sequence)); + } + std::swap(tmp_sequence, new_sequence); + } + std::swap(x.sequence, new_sequence); + x.reduced = false; + assert(x.OK()); +} + +template <> +bool +PPL::Pointset_Powerset +::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->element(), x)) + return false; + return true; +} + +/*! \relates Parma_Polyhedra_Library::Pointset_Powerset */ +bool +PPL::check_containment(const NNC_Polyhedron& ph, + const Pointset_Powerset& ps) { + if (ph.is_empty()) + return true; + Pointset_Powerset tmp(ph.space_dimension(), EMPTY); + tmp.add_disjunct(ph); + for (Pointset_Powerset::const_iterator + i = ps.begin(), ps_end = ps.end(); i != ps_end; ++i) { + const NNC_Polyhedron& pi = i->element(); + for (Pointset_Powerset::iterator + j = tmp.begin(); j != tmp.end(); ) { + const NNC_Polyhedron& pj = j->element(); + if (pi.contains(pj)) + j = tmp.drop_disjunct(j); + else + ++j; + } + if (tmp.empty()) + return true; + else { + Pointset_Powerset new_disjuncts(ph.space_dimension(), + EMPTY); + for (Pointset_Powerset::iterator + j = tmp.begin(); j != tmp.end(); ) { + const NNC_Polyhedron& pj = j->element(); + if (pj.is_disjoint_from(pi)) + ++j; + else { + std::pair > + 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 qq. +/*! \relates Parma_Polyhedra_Library::Pointset_Powerset + On exit, the intersection of \p qq and congruence \p c is stored + in \p qq, whereas a finite set of grids whose set-theoretic union + contains 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 // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +bool +approximate_partition_aux(const PPL::Congruence& c, + PPL::Grid& qq, + PPL::Pointset_Powerset& r) { + using namespace PPL; + const Coefficient& c_modulus = c.modulus(); + Grid qq_copy(qq); + qq.add_congruence(c); + if (qq.is_empty()) { + r.add_disjunct(qq_copy); + return true; + } + + Congruence_System cgs = qq.congruences(); + Congruence_System cgs_copy = qq_copy.congruences(); + // When c is an equality, not satisfied by Grid qq + // then add qq 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(qq_copy); + return false; + } + return true; + } + + // When c is a proper congruence but, in qq, this direction has + // no congruence, then add qq 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(qq_copy); + return false; + } + + // When c is a proper congruence and qq 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); + 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 qqq(qq_copy); + qqq.add_congruence((le+i %= 0) / c_modulus); + if (!qqq.is_empty()) + r.add_disjunct(qqq); + } + return true; +} + +} // namespace + +/*! \relates Parma_Polyhedra_Library::Pointset_Powerset */ +std::pair > +PPL::approximate_partition(const Grid& p, const Grid& q, + bool& finite_partition) { + using namespace PPL; + finite_partition = true; + Pointset_Powerset 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 qq = q; + const Congruence_System& pcs = p.congruences(); + for (Congruence_System::const_iterator i = pcs.begin(), + pcs_end = pcs.end(); i != pcs_end; ++i) + if (!approximate_partition_aux(*i, qq, r)) { + finite_partition = false; + Pointset_Powerset s(q); + return std::make_pair(qq, s); + } + return std::make_pair(qq, r); +} + +/*! \relates Parma_Polyhedra_Library::Pointset_Powerset */ +bool +PPL::check_containment(const Grid& ph, + const Pointset_Powerset& ps) { + if (ph.is_empty()) + return true; + Pointset_Powerset tmp(ph.space_dimension(), EMPTY); + tmp.add_disjunct(ph); + for (Pointset_Powerset::const_iterator + i = ps.begin(), ps_end = ps.end(); i != ps_end; ++i) { + const Grid& pi = i->element(); + for (Pointset_Powerset::iterator + j = tmp.begin(); j != tmp.end(); ) { + const Grid& pj = j->element(); + if (pi.contains(pj)) + j = tmp.drop_disjunct(j); + else + ++j; + } + if (tmp.empty()) + return true; + else { + Pointset_Powerset new_disjuncts(ph.space_dimension(), + EMPTY); + for (Pointset_Powerset::iterator + j = tmp.begin(); j != tmp.end(); ) { + const Grid& pj = j->element(); + if (pj.is_disjoint_from(pi)) + ++j; + else { + bool finite_partition; + std::pair > + 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 wrt 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 +::difference_assign(const Pointset_Powerset& y) { + Pointset_Powerset& x = *this; + // Ensure omega-reduction. + x.omega_reduce(); + y.omega_reduce(); + Sequence new_sequence = x.sequence; + for (const_iterator yi = y.begin(), y_end = y.end(); yi != y_end; ++yi) { + const Grid& py = yi->element(); + Sequence tmp_sequence; + for (Sequence_const_iterator nsi = new_sequence.begin(), + ns_end = new_sequence.end(); nsi != ns_end; ++nsi) { + bool finite_partition; + std::pair > partition + = approximate_partition(py, nsi->element(), finite_partition); + const Pointset_Powerset& residues = partition.second; + // Append the contents of `residues' to `tmp_sequence'. + std::copy(residues.begin(), residues.end(), back_inserter(tmp_sequence)); + } + std::swap(tmp_sequence, new_sequence); + } + std::swap(x.sequence, new_sequence); + x.reduced = false; + assert(x.OK()); +} + +template <> +bool +PPL::Pointset_Powerset +::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->element(), x)) + return false; + return true; +} + +template <> +template <> +PPL::Pointset_Powerset +::Pointset_Powerset(const Pointset_Powerset& y, + Complexity_Class) + : Base(), space_dim(y.space_dimension()) { + Pointset_Powerset& x = *this; + for (Pointset_Powerset::const_iterator i = y.begin(), + y_end = y.end(); i != y_end; ++i) + x.sequence.push_back(Determinate + (NNC_Polyhedron(i->element()))); + x.reduced = y.reduced; + assert(x.OK()); +} + +template <> +template <> +PPL::Pointset_Powerset +::Pointset_Powerset(const Pointset_Powerset& y, + Complexity_Class) + : Base(), space_dim(y.space_dimension()) { + Pointset_Powerset& x = *this; + for (Pointset_Powerset::const_iterator i = y.begin(), + y_end = y.end(); i != y_end; ++i) + x.sequence.push_back(Determinate + (NNC_Polyhedron(i->element()))); + x.reduced = false; + assert(x.OK()); +} + +template <> +template <> +PPL::Pointset_Powerset +::Pointset_Powerset(const Pointset_Powerset& y, + Complexity_Class) + : Base(), space_dim(y.space_dimension()) { + Pointset_Powerset& x = *this; + for (Pointset_Powerset::const_iterator i = y.begin(), + y_end = y.end(); i != y_end; ++i) + x.sequence.push_back(Determinate + (C_Polyhedron(i->element()))); + + // Note: this might be non-reduced even when `y' is known to be + // omega-reduced, because the constructor of C_Polyhedron, by + // enforcing topological closure, may have made different elements + // comparable. + x.reduced = false; + assert(x.OK()); +} diff --git a/src/Pointset_Powerset.defs.hh b/src/Pointset_Powerset.defs.hh new file mode 100644 index 0000000..556beb9 --- /dev/null +++ b/src/Pointset_Powerset.defs.hh @@ -0,0 +1,1449 @@ +/* Pointset_Powerset class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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 +#include +#include + +//! The powerset construction instantiated on PPL pointset domains. +/*! \ingroup PPL_CXX_interface */ +/*! + \warning + At present, the supported instantiations for the + disjunct domain template \p PS are the simple pointset domains: + C_Polyhedron, + NNC_Polyhedron, + Grid, + Octagonal_Shape, + BD_Shape, + Box. +*/ +template +class Parma_Polyhedra_Library::Pointset_Powerset + : public Parma_Polyhedra_Library::Powerset + > { +public: + typedef PS element_type; + +private: + typedef Determinate CS; + typedef Powerset Base; + +public: + //! Returns the maximum space dimension a Pointset_Powerset 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 QH of the disjuncts + in the source powerset is different from PS. + + \param y + The powerset to be used to build the new powerset. + + \param complexity + The maximal complexity of any algorithms used. + */ + template + explicit Pointset_Powerset(const Pointset_Powerset& y, + Complexity_Class complexity = ANY_COMPLEXITY); + + /*! \brief + Creates a Pointset_Powerset from a product + This will be created as a single disjunct of type PS that + approximates the product. + */ + template + explicit + Pointset_Powerset(const Partially_Reduced_Product& 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 + explicit Pointset_Powerset(const Octagonal_Shape& 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 bdss exceeds the maximum + allowed space dimension. + */ + template + explicit Pointset_Powerset(const BD_Shape& 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 + explicit Pointset_Powerset(const Box& 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 true if and only if \p *this is + an empty powerset. + */ + bool is_empty() const; + + /*! \brief + Returns true if and only if \p *this + is the top element of the powerser lattice. + */ + bool is_universe() const; + + /*! \brief + Returns true if and only if all the disjuncts + in \p *this are topologically closed. + */ + bool is_topologically_closed() const; + + /*! \brief + Returns true if and only if all elements in \p *this + are bounded. + */ + bool is_bounded() const; + + //! Returns true 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 true if and only if \p *this is discrete. + bool is_discrete() const; + + /*! \brief + Returns true 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 true 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 true 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 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 + true 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, + false 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 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 + 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 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, + false 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 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 + true 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, + false 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 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 + 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 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, + false 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 true 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 really expensive! + */ + bool geometrically_covers(const Pointset_Powerset& y) const; + + /*! \brief + Returns true 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 really expensive! + */ + bool geometrically_equals(const Pointset_Powerset& y) const; + + /*! \brief + Returns true 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 true 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 true 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 x == y, + then x.hash_code() == y.hash_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 PS& 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 constraint \p c, minimizing the result. + /*! + \return + false if and only if the result is empty. + + \exception std::invalid_argument + Thrown if \p *this and \p c are topology-incompatible or + dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_constraint_and_minimize(const Constraint& c); + + //! Intersects \p *this with the constraints in \p cs. + /*! + \param cs + The constraints to intersect with. + + \exception std::invalid_argument + Thrown if \p *this and \p cs are topology-incompatible or + dimension-incompatible. + */ + void add_constraints(const Constraint_System& cs); + + /*! \brief + 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); + + /*! \brief + Intersects \p *this with the constraints in \p cs, + minimizing the result. + + \return + false if and only if the result is empty. + + \param cs + The constraints to intersect with. + + \exception std::invalid_argument + Thrown if \p *this and \p cs are topology-incompatible or + dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_constraints_and_minimize(const Constraint_System& cs); + + //! Intersects \p *this with congruence \p c. + /*! + \exception std::invalid_argument + Thrown if \p *this and congruence \p c are topology-incompatible + or dimension-incompatible. + */ + void add_congruence(const Congruence& c); + + /*! \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 congruence \p c, minimizing the result. + /*! + \return + false if and only if the result is empty. + + \exception std::invalid_argument + Thrown if \p *this and \p c are topology-incompatible or + dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_congruence_and_minimize(const Congruence& c); + + //! 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 + Intersects \p *this with the congruences in \p cs, + minimizing the result. + + \return + false if and only if the result is empty. + + \param cs + The congruences to intersect with. + + \exception std::invalid_argument + Thrown if \p *this and \p cs are topology-incompatible or + dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_congruences_and_minimize(const Congruence_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 to_be_unconstrained, + assigning the result to \p *this. + + \param to_be_unconstrained + 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 to_be_removed. + */ + void unconstrain(const Variables_Set& to_be_unconstrained); + + //! 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); + + //! 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, minimizing the result + and collecting all these intersections. + + \return + false if and only if the result is empty. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool intersection_assign_and_minimize(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 + 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 wf + and the cardinality threshold \p max_disjuncts. + + \param y + A powerset that must definitely entail \p *this; + + \param wf + The widening function to be used on polyhedra objects. It is obtained + from the corresponding widening method by using the helper function + Parma_Polyhedra_Library::widen_fun_ref. Legal values are, e.g., + widen_fun_ref(&Polyhedron::H79_widening_assign) and + widen_fun_ref(&Polyhedron::limited_H79_extrapolation_assign, cs); + + \param max_disjuncts + The maximum number of disjuncts occurring in the powerset \p *this + before 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 + void BGP99_extrapolation_assign(const Pointset_Powerset& y, + Widening wf, + unsigned max_disjuncts); + + /*! \brief + Assigns to \p *this the result of computing the + \ref pps_certificate_widening "BHZ03-widening" + between \p *this and \p y, using the widening function \p wf + certified by the convergence certificate \p Cert. + + \param y + The finite powerset computed in the previous iteration step. + It must definitely entail \p *this; + + \param wf + 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., + widen_fun_ref(&Polyhedron::H79_widening_assign) and + widen_fun_ref(&Polyhedron::limited_H79_extrapolation_assign, cs). + + \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 wf; otherwise, an extrapolation operator is + obtained. + For a description of the methods that should be provided + by \p Cert, see BHRZ03_Certificate or H79_Certificate. + */ + template + void BHZ03_widening_assign(const Pointset_Powerset& y, Widening wf); + + //@} // Space Dimension Preserving Member Functions that May Modify [...] + + //! \name Member Functions that May Modify the Dimension of the Vector Space + //@{ + + /*! \brief + The assignment operator + (\p *this and \p y can be dimension-incompatible). + */ + Pointset_Powerset& operator=(const Pointset_Powerset& y); + + /*! \brief + Conversion assignment: the type QH of the disjuncts + in the source powerset is different from PS + (\p *this and \p y can be dimension-incompatible). + */ + template + Pointset_Powerset& operator=(const Pointset_Powerset& y); + + //! Swaps \p *this with \p y. + void 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 to_be_removed + The set of Variable objects corresponding to the space dimensions + to be removed. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with one of the + Variable objects contained in \p to_be_removed. + */ + void remove_space_dimensions(const Variables_Set& to_be_removed); + + /*! \brief + Removes the higher space dimensions so that the resulting space + will have dimension \p new_dimension. + + \exception std::invalid_argument + Thrown if \p new_dimensions is greater than the space dimension + of \p *this. + */ + void remove_higher_space_dimensions(dimension_type new_dimension); + + /*! \brief + Remaps the dimensions of the vector space according to + a partial function. + + See also Polyhedron::map_space_dimensions. + */ + template + 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 max_space_dimension(). + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + and var 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 to_be_folded into \p var. + /*! + \param to_be_folded + The set of Variable objects corresponding to the space dimensions + to be folded; + + \param var + The variable corresponding to the space dimension that is the + destination of the folding operation. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with \p var or with + one of the Variable objects contained in \p to_be_folded. Also + thrown if \p var is contained in \p to_be_folded. + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + var has space dimension \f$k \leq n\f$, + \p to_be_folded is a set of variables whose maximum space dimension + is also less than or equal to \f$n\f$, and \p var is not a member + of \p to_be_folded, then the space dimensions corresponding to + variables in \p to_be_folded are + \ref 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& to_be_folded, Variable var); + + //@} // 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 true if successful, false 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 to_be_enlarged 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 to_be_enlarged are + topology-compatible and dimension-compatible. + */ + bool intersection_preserving_enlarge_element(PS& to_be_enlarged) const; + + /*! \brief + Assigns to \p *this the result of applying the BGP99 heuristics + to \p *this and \p y, using the widening function \p wf. + */ + template + void BGP99_heuristics_assign(const Pointset_Powerset& y, Widening wf); + + //! Records in \p cert_ms the certificates for this set of disjuncts. + template + void collect_certificates(std::map& cert_ms) const; + + /*! \brief + Returns true if and only if the current set of dijsuncts + is stabilizing with respect to the multiset of certificates \p y_cert_ms. + */ + template + bool is_cert_multiset_stabilizing(const std::map& + y_cert_ms) const; + + // FIXME: here it should be enough to befriend the template constructor + // template + // Pointset_Powerset(const Pointset_Powerset&), + // but, apparently, this cannot be done. + friend class Pointset_Powerset; +}; + +namespace Parma_Polyhedra_Library { + +//! 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 r of type + std::pair\ \> + such that + - r.first is the intersection of \p p and \p q; + - r.second has the property that all its elements are + pairwise disjoint and disjoint from \p p; + - the set-theoretical union of r.first with all the + elements of r.second gives \p q (i.e., r + is the representation of a partition of \p q). + + \if Include_Implementation_Details + + See + + this paper for more information about the implementation. + \endif +*/ +template +std::pair > +linear_partition(const PS& p, const PS& q); + +/*! \brief + Returns true 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& 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 r of type + std::pair\ \> + such that + - r.first is the intersection of \p p and \p q; + - If there is a finite partition of \p q wrt \p p + the Boolean finite_partition is set to true and + r.second has the property that all its elements are + pairwise disjoint and disjoint from \p p and the set-theoretical + union of r.first with all the elements of + r.second gives \p q (i.e., r + is the representation of a partition of \p q). + - Otherwise the Boolean finite_partition is set to false + and the singleton set that contains \p q is stored in + r.secondr. +*/ +std::pair > +approximate_partition(const Grid& p, const Grid& q, bool& finite_partition); + +/*! \brief + Returns true 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& ps); + +/*! \brief + Returns true 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 PS can be converted + without precision loss into an NNC_Polyhedron; otherwise, + an incorrect result might be obtained. +*/ +template +bool +check_containment(const PS& ph, const Pointset_Powerset& 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 +Pointset_Powerset +::Pointset_Powerset(const Pointset_Powerset& 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 +::Pointset_Powerset(const Pointset_Powerset& y, + Complexity_Class); + +template <> +template <> +Pointset_Powerset +::Pointset_Powerset(const Pointset_Powerset& y, + Complexity_Class); + +template <> +template <> +Pointset_Powerset +::Pointset_Powerset(const Pointset_Powerset& y, + Complexity_Class); + +template <> +void +Pointset_Powerset +::difference_assign(const Pointset_Powerset& y); + +template <> +void +Pointset_Powerset +::difference_assign(const Pointset_Powerset& y); + +template <> +bool +Pointset_Powerset +::geometrically_covers(const Pointset_Powerset& y) const; + +template <> +bool +Pointset_Powerset +::geometrically_covers(const Pointset_Powerset& y) const; + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Pointset_Powerset */ +template +void swap(Parma_Polyhedra_Library::Pointset_Powerset& x, + Parma_Polyhedra_Library::Pointset_Powerset& y); + +} // namespace std + +#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..7dbdc6f --- /dev/null +++ b/src/Pointset_Powerset.inlines.hh @@ -0,0 +1,330 @@ +/* Pointset_Powerset class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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 +#include + +namespace Parma_Polyhedra_Library { + +template +inline dimension_type +Pointset_Powerset::space_dimension() const { + return space_dim; +} + +template +inline dimension_type +Pointset_Powerset::max_space_dimension() { + return PS::max_space_dimension(); +} + +template +inline +Pointset_Powerset::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(PS(num_dimensions, kind))); + assert(x.OK()); +} + +template +inline +Pointset_Powerset::Pointset_Powerset(const Pointset_Powerset& y, + Complexity_Class) + : Base(y), space_dim(y.space_dim) { +} + +template +inline +Pointset_Powerset::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(PS(ph, complexity))); + x.reduced = false; + assert(OK()); +} + +template +inline +Pointset_Powerset::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(PS(ph, complexity))); + assert(OK()); +} + +template +inline +Pointset_Powerset::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(PS(gr))); + } + assert(OK()); +} + +template +template +inline +Pointset_Powerset +::Pointset_Powerset(const Partially_Reduced_Product& 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(PS(prp, complexity))); + x.reduced = false; + assert(OK()); +} + +template +template +Pointset_Powerset::Pointset_Powerset(const Box& box, + Complexity_Class) + : Base(), space_dim(box.space_dimension()) { + Pointset_Powerset& x = *this; + if (!box.is_empty()) + x.sequence.push_back(Determinate(PS(box))); + assert(OK()); +} + +template +template +Pointset_Powerset::Pointset_Powerset(const Octagonal_Shape& os, + Complexity_Class) + : Base(), space_dim(os.space_dimension()) { + Pointset_Powerset& x = *this; + if (!os.is_empty()) + x.sequence.push_back(Determinate(PS(os))); + assert(OK()); +} + +template +template +Pointset_Powerset::Pointset_Powerset(const BD_Shape& bds, + Complexity_Class) + : Base(), space_dim(bds.space_dimension()) { + Pointset_Powerset& x = *this; + if (!bds.is_empty()) + x.sequence.push_back(Determinate(PS(bds))); + assert(OK()); +} + +template +inline +Pointset_Powerset::Pointset_Powerset(const Constraint_System& cs) + : Base(Determinate(cs)), space_dim(cs.space_dimension()) { + assert(OK()); +} + +template +inline +Pointset_Powerset::Pointset_Powerset(const Congruence_System& cgs) + : Base(Determinate(cgs)), space_dim(cgs.space_dimension()) { + assert(OK()); +} + +template +inline Pointset_Powerset& +Pointset_Powerset::operator=(const Pointset_Powerset& y) { + Pointset_Powerset& x = *this; + x.Base::operator=(y); + x.space_dim = y.space_dim; + return x; +} + +template +inline void +Pointset_Powerset::swap(Pointset_Powerset& y) { + Pointset_Powerset& x = *this; + x.Base::swap(y); + std::swap(x.space_dim, y.space_dim); +} + +template +template +inline Pointset_Powerset& +Pointset_Powerset::operator=(const Pointset_Powerset& y) { + Pointset_Powerset& x = *this; + Pointset_Powerset pps(y); + x.swap(pps); + return x; +} + +template +inline void +Pointset_Powerset::intersection_assign(const Pointset_Powerset& y) { + Pointset_Powerset& x = *this; + x.pairwise_apply_assign + (y, CS::lift_op_assign(std::mem_fun_ref(&PS::intersection_assign))); +} + +template +inline bool +Pointset_Powerset +::intersection_assign_and_minimize(const Pointset_Powerset& y) { + intersection_assign(y); + return !is_empty(); +} + +template +inline void +Pointset_Powerset::time_elapse_assign(const Pointset_Powerset& y) { + Pointset_Powerset& x = *this; + x.pairwise_apply_assign + (y, CS::lift_op_assign(std::mem_fun_ref(&PS::time_elapse_assign))); +} + +template +inline bool +Pointset_Powerset +::geometrically_covers(const Pointset_Powerset& y) const { + // This code is only used when PS is an abstraction of NNC_Polyhedron. + const Pointset_Powerset xx(*this); + const Pointset_Powerset yy(y); + return xx.geometrically_covers(yy); +} + +template +inline bool +Pointset_Powerset +::geometrically_equals(const Pointset_Powerset& y) const { + // This code is only used when PS is an abstraction of NNC_Polyhedron. + const Pointset_Powerset xx(*this); + const Pointset_Powerset yy(y); + return xx.geometrically_covers(yy) && yy.geometrically_covers(xx); +} + +template <> +inline bool +Pointset_Powerset +::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 +::geometrically_equals(const Pointset_Powerset& y) const { + const Pointset_Powerset& x = *this; + return x.geometrically_covers(y) && y.geometrically_covers(x); +} + +template +inline memory_size_type +Pointset_Powerset::external_memory_in_bytes() const { + return Base::external_memory_in_bytes(); +} + +template +inline memory_size_type +Pointset_Powerset::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +template +inline int32_t +Pointset_Powerset::hash_code() const { + return space_dimension() & 0x7fffffff; +} + +template +inline void +Pointset_Powerset +::difference_assign(const Pointset_Powerset& y) { + // This code is only used when PS is an abstraction of NNC_Polyhedron. + Pointset_Powerset nnc_this(*this); + Pointset_Powerset nnc_y(y); + nnc_this.difference_assign(nnc_y); + *this = nnc_this; +} + +/*! \relates Pointset_Powerset */ +template +inline bool +check_containment(const PS& ph, const Pointset_Powerset& ps) { + // This code is only used when PS is an abstraction of NNC_Polyhedron. + const NNC_Polyhedron pph = NNC_Polyhedron(ph.constraints()); + const Pointset_Powerset pps(ps); + return check_containment(pph, pps); +} + +/*! \relates Pointset_Powerset */ +template <> +inline bool +check_containment(const C_Polyhedron& ph, + const Pointset_Powerset& ps) { + return check_containment(NNC_Polyhedron(ph), + Pointset_Powerset(ps)); +} + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Pointset_Powerset */ +template +inline void +swap(Parma_Polyhedra_Library::Pointset_Powerset& x, + Parma_Polyhedra_Library::Pointset_Powerset& y) { + x.swap(y); +} + +} // namespace std + +#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..29196e4 --- /dev/null +++ b/src/Pointset_Powerset.templates.hh @@ -0,0 +1,1610 @@ +/* Pointset_Powerset class implementation: non-inline template functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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 +#include +#include +#include +#include +#include + +namespace Parma_Polyhedra_Library { + +template +void +Pointset_Powerset::add_disjunct(const PS& ph) { + Pointset_Powerset& x = *this; + if (x.space_dimension() != ph.space_dimension()) { + std::ostringstream s; + s << "PPL::Pointset_Powerset::add_disjunct(ph):\n" + << "this->space_dimension() == " << x.space_dimension() << ", " + << "ph.space_dimension() == " << ph.space_dimension() << "."; + throw std::invalid_argument(s.str()); + } + x.sequence.push_back(Determinate(ph)); + x.reduced = false; + assert(x.OK()); +} + +template <> +template +Pointset_Powerset +::Pointset_Powerset(const Pointset_Powerset& y, + Complexity_Class complexity) + : Base(), space_dim(y.space_dimension()) { + Pointset_Powerset& x = *this; + for (typename Pointset_Powerset::const_iterator i = y.begin(), + y_end = y.end(); i != y_end; ++i) + x.sequence.push_back(Determinate + (NNC_Polyhedron(i->element(), 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; + + assert(x.OK()); +} + +template +template +Pointset_Powerset +::Pointset_Powerset(const Pointset_Powerset& y, + Complexity_Class complexity) + : Base(), space_dim(y.space_dimension()) { + Pointset_Powerset& x = *this; + for (typename Pointset_Powerset::const_iterator i = y.begin(), + y_end = y.end(); i != y_end; ++i) + x.sequence.push_back(Determinate(PS(i->element(), complexity))); + // Note: this might be non-reduced even when `y' is known to be + // omega-reduced, because the constructor of PS may have made + // different QH elements to become comparable. + x.reduced = false; + assert(x.OK()); +} + +template +void +Pointset_Powerset::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 new_x(x.space_dim + y.space_dim, EMPTY); + for (const_iterator xi = x.begin(), x_end = x.end(), + y_begin = y.begin(), y_end = y.end(); xi != x_end; ) { + for (const_iterator yi = y_begin; yi != y_end; ++yi) { + CS zi = *xi; + zi.concatenate_assign(*yi); + assert(!zi.is_bottom()); + new_x.sequence.push_back(zi); + } + ++xi; + if (abandon_expensive_computations && xi != x_end && y_begin != y_end) { + // Hurry up! + PS xph = xi->element(); + for (++xi; xi != x_end; ++xi) + xph.upper_bound_assign(xi->element()); + const_iterator yi = y_begin; + PS yph = yi->element(); + for (++yi; yi != y_end; ++yi) + yph.upper_bound_assign(yi->element()); + xph.concatenate_assign(yph); + x.swap(new_x); + x.add_disjunct(xph); + assert(x.OK()); + return; + } + } + x.swap(new_x); + assert(x.OK()); +} + +template +void +Pointset_Powerset::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->element().add_constraint(c); + x.reduced = false; + assert(x.OK()); +} + +template +bool +Pointset_Powerset::add_constraint_and_minimize(const Constraint& c) { + Pointset_Powerset& x = *this; + for (Sequence_iterator si = x.sequence.begin(), + s_end = x.sequence.end(); si != s_end; ) + if (!si->element().add_constraint_and_minimize(c)) + si = x.sequence.erase(si); + else { + x.reduced = false; + ++si; + } + assert(x.OK()); + return !x.empty(); +} + +template +void +Pointset_Powerset::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->element().refine_with_constraint(c); + x.reduced = false; + assert(x.OK()); +} + +template +void +Pointset_Powerset::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->element().add_constraints(cs); + x.reduced = false; + assert(x.OK()); +} + +template +bool +Pointset_Powerset:: +add_constraints_and_minimize(const Constraint_System& cs) { + Pointset_Powerset& x = *this; + for (Sequence_iterator si = x.sequence.begin(), + s_end = x.sequence.end(); si != s_end; ) + if (!si->element().add_constraints_and_minimize(cs)) + si = x.sequence.erase(si); + else { + x.reduced = false; + ++si; + } + assert(x.OK()); + return !x.empty(); +} + +template +void +Pointset_Powerset::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->element().refine_with_constraints(cs); + x.reduced = false; + assert(x.OK()); +} + +template +void +Pointset_Powerset::add_congruence(const Congruence& c) { + Pointset_Powerset& x = *this; + for (Sequence_iterator si = x.sequence.begin(), + s_end = x.sequence.end(); si != s_end; ++si) + si->element().add_congruence(c); + x.reduced = false; + assert(x.OK()); +} + +template +void +Pointset_Powerset::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->element().refine_with_congruence(cg); + x.reduced = false; + assert(x.OK()); +} + +template +bool +Pointset_Powerset::add_congruence_and_minimize(const Congruence& c) { + Pointset_Powerset& x = *this; + for (Sequence_iterator si = x.sequence.begin(), + s_end = x.sequence.end(); si != s_end; ) + if (!si->element().add_congruence_and_minimize(c)) + si = x.sequence.erase(si); + else { + x.reduced = false; + ++si; + } + assert(x.OK()); + return !x.empty(); +} + +template +void +Pointset_Powerset::add_congruences(const Congruence_System& cs) { + Pointset_Powerset& x = *this; + for (Sequence_iterator si = x.sequence.begin(), + s_end = x.sequence.end(); si != s_end; ++si) + si->element().add_congruences(cs); + x.reduced = false; + assert(x.OK()); +} + +template +void +Pointset_Powerset::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->element().refine_with_congruences(cgs); + x.reduced = false; + assert(x.OK()); +} + +template +bool +Pointset_Powerset:: +add_congruences_and_minimize(const Congruence_System& cs) { + Pointset_Powerset& x = *this; + for (Sequence_iterator si = x.sequence.begin(), + s_end = x.sequence.end(); si != s_end; ) + if (!si->element().add_congruences_and_minimize(cs)) + si = x.sequence.erase(si); + else { + x.reduced = false; + ++si; + } + assert(x.OK()); + return !x.empty(); +} + +template +void +Pointset_Powerset::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->element().unconstrain(var); + x.reduced = false; + } + assert(x.OK()); +} + +template +void +Pointset_Powerset::unconstrain(const Variables_Set& to_be_unconstrained) { + Pointset_Powerset& x = *this; + for (Sequence_iterator si = x.sequence.begin(), + s_end = x.sequence.end(); si != s_end; ++si) { + si->element().unconstrain(to_be_unconstrained); + x.reduced = false; + } + assert(x.OK()); +} + +template +void +Pointset_Powerset::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->element().add_space_dimensions_and_embed(m); + x.space_dim += m; + assert(x.OK()); +} + +template +void +Pointset_Powerset::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->element().add_space_dimensions_and_project(m); + x.space_dim += m; + assert(x.OK()); +} + +template +void +Pointset_Powerset:: +remove_space_dimensions(const Variables_Set& to_be_removed) { + Pointset_Powerset& x = *this; + Variables_Set::size_type num_removed = to_be_removed.size(); + if (num_removed > 0) { + for (Sequence_iterator si = x.sequence.begin(), + s_end = x.sequence.end(); si != s_end; ++si) { + si->element().remove_space_dimensions(to_be_removed); + x.reduced = false; + } + x.space_dim -= num_removed; + assert(x.OK()); + } +} + +template +void +Pointset_Powerset::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->element().remove_higher_space_dimensions(new_dimension); + x.reduced = false; + } + x.space_dim = new_dimension; + assert(x.OK()); + } +} + +template +template +void +Pointset_Powerset::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->element().map_space_dimensions(pfunc); + x.space_dim = s_begin->element().space_dimension(); + x.reduced = false; + } + assert(x.OK()); +} + +template +void +Pointset_Powerset::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->element().expand_space_dimension(var, m); + x.space_dim += m; + assert(x.OK()); +} + +template +void +Pointset_Powerset::fold_space_dimensions(const Variables_Set& to_be_folded, + Variable var) { + Pointset_Powerset& x = *this; + Variables_Set::size_type num_folded = to_be_folded.size(); + if (num_folded > 0) { + for (Sequence_iterator si = x.sequence.begin(), + s_end = x.sequence.end(); si != s_end; ++si) + si->element().fold_space_dimensions(to_be_folded, var); + } + x.space_dim -= num_folded; + assert(x.OK()); +} + +template +void +Pointset_Powerset::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->element().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; + } + assert(x.OK()); +} + +template +void +Pointset_Powerset::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->element().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; + } + assert(x.OK()); +} + + +template +void +Pointset_Powerset +::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->element().generalized_affine_image(lhs, relsym, rhs); + x.reduced = false; + } + assert(x.OK()); +} + +template +void +Pointset_Powerset +::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->element().generalized_affine_preimage(lhs, relsym, rhs); + x.reduced = false; + } + assert(x.OK()); +} + +template +void +Pointset_Powerset +::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->element().generalized_affine_image(var, relsym, expr, denominator); + x.reduced = false; + } + assert(x.OK()); +} + +template +void +Pointset_Powerset +::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->element().generalized_affine_preimage(var, relsym, expr, denominator); + x.reduced = false; + } + assert(x.OK()); +} + + +template +void +Pointset_Powerset +::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->element().bounded_affine_image(var, lb_expr, ub_expr, denominator); + x.reduced = false; + } + assert(x.OK()); +} + +template +void +Pointset_Powerset +::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->element().bounded_affine_preimage(var, lb_expr, ub_expr, + denominator); + x.reduced = false; + } + assert(x.OK()); +} + +template +dimension_type +Pointset_Powerset::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) { + PS pi(si->element()); + 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 +bool +Pointset_Powerset::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()->element().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->element().is_universe()) { + // Speculative omega-reduction, if it is worth. + if (x.size() > 1) { + Pointset_Powerset universe(x.space_dimension(), UNIVERSE); + Pointset_Powerset& xx = const_cast(x); + xx.swap(universe); + } + return true; + } + return false; +} + +template +bool +Pointset_Powerset::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->element().is_empty()) + return false; + return true; +} + +template +bool +Pointset_Powerset::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->element().is_discrete()) + return false; + return true; +} + +template +bool +Pointset_Powerset::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->element().is_topologically_closed()) + return false; + return true; +} + +template +bool +Pointset_Powerset::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->element().is_bounded()) + return false; + return true; +} + +template +bool +Pointset_Powerset::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::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->element().constrains(var)) + return true; + return false; +} + +template +bool +Pointset_Powerset::is_disjoint_from(const Pointset_Powerset& y) const { + const Pointset_Powerset& x = *this; + for (Sequence_const_iterator si = x.sequence.begin(), + xs_end = x.sequence.end(); si != xs_end; ++si) { + const PS& pi = si->element(); + for (Sequence_const_iterator sj = y.sequence.begin(), + ys_end = y.sequence.end(); sj != ys_end; ++sj) { + const PS& pj = sj->element(); + if (!pi.is_disjoint_from(pj)) + return false; + } + } + return true; +} + +template +void +Pointset_Powerset::topological_closure_assign() { + Pointset_Powerset& x = *this; + for (Sequence_iterator si = x.sequence.begin(), + s_end = x.sequence.end(); si != s_end; ++si) + si->element().topological_closure_assign(); + assert(x.OK()); +} + +template +bool +Pointset_Powerset +::intersection_preserving_enlarge_element(PS& to_be_enlarged) const { + // FIXME: this is just an executable specification. + const Pointset_Powerset& context = *this; + assert(context.space_dimension() == to_be_enlarged.space_dimension()); + bool nonempty_intersection = false; + // TODO: maybe use a *sorted* constraint system? + PS enlarged(context.space_dimension(), UNIVERSE); + for (Sequence_const_iterator si = context.sequence.begin(), + s_end = context.sequence.end(); si != s_end; ++si) { + PS context_i(si->element()); + context_i.intersection_assign(enlarged); + PS enlarged_i(to_be_enlarged); + nonempty_intersection + |= enlarged_i.simplify_using_context_assign(context_i); + // TODO: merge the sorted constraints of `enlarged' and `enlarged_i'? + enlarged.intersection_assign(enlarged_i); + } + to_be_enlarged.swap(enlarged); + return nonempty_intersection; +} + +template +bool +Pointset_Powerset +::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 PS& y_i = y.sequence.begin()->element(); + for (Sequence_iterator si = x.sequence.begin(), + s_end = x.sequence.end(); si != s_end; ) { + PS& x_i = si->element(); + 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->element())) + ++si; + else + // Intersection with `*si' is empty: drop the disjunct. + si = x.sequence.erase(si); + } + } + x.reduced = false; + assert(x.OK()); + return !x.sequence.empty(); +} + +template +bool +Pointset_Powerset::contains(const Pointset_Powerset& y) const { + const Pointset_Powerset& x = *this; + for (Sequence_const_iterator si = y.sequence.begin(), + ys_end = y.sequence.end(); si != ys_end; ++si) { + const PS& pi = si->element(); + bool pi_is_contained = false; + for (Sequence_const_iterator sj = x.sequence.begin(), + xs_end = x.sequence.end(); + (sj != xs_end && !pi_is_contained); ++sj) { + const PS& pj = sj->element(); + if (pj.contains(pi)) + pi_is_contained = true; + } + if (!pi_is_contained) + return false; + } + return true; +} + +template +bool +Pointset_Powerset::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(), + ys_end = y.sequence.end(); si != ys_end; ++si) { + const PS& pi = si->element(); + bool pi_is_strictly_contained = false; + for (Sequence_const_iterator sj = x.sequence.begin(), + xs_end = x.sequence.end(); + (sj != xs_end && !pi_is_strictly_contained); ++sj) { + const PS& pj = sj->element(); + if (pj.strictly_contains(pi)) + pi_is_strictly_contained = true; + } + if (!pi_is_strictly_contained) + return false; + } + return true; +} + +template +Poly_Con_Relation +Pointset_Powerset::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->element().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 +Poly_Con_Relation +Pointset_Powerset::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->element().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 +Poly_Gen_Relation +Pointset_Powerset::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->element().relation_with(g); + if (relation_i.implies(Poly_Gen_Relation::subsumes())) + return Poly_Gen_Relation::subsumes(); + } + + return Poly_Gen_Relation::nothing(); +} + +template +bool +Pointset_Powerset +::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->element().bounds_from_above(expr)) + return false; + return true; +} + +template +bool +Pointset_Powerset +::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->element().bounds_from_below(expr)) + return false; + return true; +} + +template +bool +Pointset_Powerset::maximize(const Linear_Expression& expr, + Coefficient& sup_n, + Coefficient& sup_d, + bool& maximum) const { + const Pointset_Powerset& x = *this; + x.omega_reduce(); + bool first = true; + + PPL_DIRTY_TEMP_COEFFICIENT(supt_n); + PPL_DIRTY_TEMP_COEFFICIENT(supt_d); + supt_n = 0; + supt_d = 1; + bool maxt = 0; + + PPL_DIRTY_TEMP_COEFFICIENT(supi_n); + PPL_DIRTY_TEMP_COEFFICIENT(supi_d); + supi_n = 0; + supi_d = 1; + bool maxi = 0; + + PPL_DIRTY_TEMP_COEFFICIENT(tmp); + + for (Sequence_const_iterator si = x.sequence.begin(), + s_end = x.sequence.end(); si != s_end; ++si) { + if (!si->element().maximize(expr, supi_n, supi_d, maxi)) + return false; + else + if (first) { + first = false; + supt_n = supi_n; + supt_d = supi_d; + maxt = maxi; + } + else { + tmp = (supt_n * supi_d) - (supi_n * supt_d); + if (tmp < 0) { + supt_n = supi_n; + supt_d = supi_d; + maxt = maxi; + } + else if (tmp == 0) + maxt = maxt || maxi; + } + } + sup_n = supt_n; + sup_d = supt_d; + maximum = maxt; + return true; +} + +template +bool +Pointset_Powerset::maximize(const Linear_Expression& expr, + Coefficient& sup_n, + Coefficient& sup_d, + bool& maximum, + Generator& g) const { + const Pointset_Powerset& x = *this; + x.omega_reduce(); + bool first = true; + + PPL_DIRTY_TEMP_COEFFICIENT(supt_n); + PPL_DIRTY_TEMP_COEFFICIENT(supt_d); + supt_n = 0; + supt_d = 1; + bool maxt = 0; + Generator gt = point(); + + PPL_DIRTY_TEMP_COEFFICIENT(supi_n); + PPL_DIRTY_TEMP_COEFFICIENT(supi_d); + supi_n = 0; + supi_d = 1; + bool maxi = 0; + Generator gi = 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->element().maximize(expr, supi_n, supi_d, maxi, gi)) + return false; + else + if (first) { + first = false; + supt_n = supi_n; + supt_d = supi_d; + maxt = maxi; + gt = gi; + } + else { + tmp = (supt_n * supi_d) - (supi_n * supt_d); + if (tmp < 0) { + supt_n = supi_n; + supt_d = supi_d; + maxt = maxi; + gt = gi; + } + else if (tmp == 0) { + maxt = maxt || maxi; + gt = gi; + } + } + } + sup_n = supt_n; + sup_d = supt_d; + maximum = maxt; + g = gt; + return true; +} + +template +bool +Pointset_Powerset::minimize(const Linear_Expression& expr, + Coefficient& inf_n, + Coefficient& inf_d, + bool& minimum) const { + const Pointset_Powerset& x = *this; + x.omega_reduce(); + bool first = true; + + PPL_DIRTY_TEMP_COEFFICIENT(inft_n); + PPL_DIRTY_TEMP_COEFFICIENT(inft_d); + inft_n = 0; + inft_d = 1; + bool mint = 0; + + PPL_DIRTY_TEMP_COEFFICIENT(infi_n); + PPL_DIRTY_TEMP_COEFFICIENT(infi_d); + infi_n = 0; + infi_d = 1; + bool mini = 0; + + PPL_DIRTY_TEMP_COEFFICIENT(tmp); + + for (Sequence_const_iterator si = x.sequence.begin(), + s_end = x.sequence.end(); si != s_end; ++si) { + if (!si->element().minimize(expr, infi_n, infi_d, mini)) + return false; + else + if (first) { + first = false; + inft_n = infi_n; + inft_d = infi_d; + mint = mini; + } + else { + tmp = (inft_n * infi_d) - (infi_n * inft_d); + if (tmp > 0) { + inft_n = infi_n; + inft_d = infi_d; + mint = mini; + } + else if (tmp == 0) + mint = mint || mini; + } + } + inf_n = inft_n; + inf_d = inft_d; + minimum = mint; + return true; +} + +template +bool +Pointset_Powerset::minimize(const Linear_Expression& expr, + Coefficient& inf_n, + Coefficient& inf_d, + bool& minimum, + Generator& g) const { + const Pointset_Powerset& x = *this; + x.omega_reduce(); + bool first = true; + + PPL_DIRTY_TEMP_COEFFICIENT(inft_n); + PPL_DIRTY_TEMP_COEFFICIENT(inft_d); + inft_n = 0; + inft_d = 1; + bool mint = 0; + Generator gt = point(); + + PPL_DIRTY_TEMP_COEFFICIENT(infi_n); + PPL_DIRTY_TEMP_COEFFICIENT(infi_d); + infi_n = 0; + infi_d = 1; + bool mini = 0; + Generator gi = 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->element().minimize(expr, infi_n, infi_d, mini, gi)) + return false; + else + if (first) { + first = false; + inft_n = infi_n; + inft_d = infi_d; + mint = mini; + gt = gi; + } + else { + tmp = (inft_n * infi_d) - (infi_n * inft_d); + if (tmp > 0) { + inft_n = infi_n; + inft_d = infi_d; + mint = mini; + gt = gi; + } + else if (tmp == 0) { + mint = mint || mini; + gt = gi; + } + } + } + inf_n = inft_n; + inf_d = inft_d; + minimum = mint; + g = gt; + return true; +} + +template +bool +Pointset_Powerset::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->element().contains_integer_point()) + return true; + return false; +} + +template +void +Pointset_Powerset::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 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; + PS& pi = si->element(); + Sequence_const_iterator sj = si; + unsigned sj_index = si_index; + for (++sj, ++sj_index; sj != s_end; ++sj, ++sj_index) { + if (marked[sj_index]) + continue; + const PS& pj = sj->element(); + if (pi.upper_bound_assign_if_exact(pj)) { + marked[si_index] = marked[sj_index] = true; + new_x.add_non_bottom_disjunct_preserve_reduction(pi); + ++deleted; + goto next; + } + } + next: + ; + } + iterator nx_begin = new_x.begin(); + iterator nx_end = new_x.end(); + unsigned xi_index = 0; + for (const_iterator xi = x.begin(), + x_end = x.end(); xi != x_end; ++xi, ++xi_index) + if (!marked[xi_index]) + nx_begin = new_x.add_non_bottom_disjunct_preserve_reduction(*xi, + nx_begin, + nx_end); + std::swap(x.sequence, new_x.sequence); + n -= deleted; + } while (deleted > 0); + assert(x.OK()); +} + +template +template +void +Pointset_Powerset:: +BGP99_heuristics_assign(const Pointset_Powerset& y, Widening wf) { + // `x' is the current iteration value. + Pointset_Powerset& x = *this; + +#ifndef NDEBUG + { + // We assume that `y' entails `x'. + const Pointset_Powerset x_copy = x; + const Pointset_Powerset y_copy = y; + assert(y_copy.definitely_entails(x_copy)); + } +#endif + + size_type n = x.size(); + Pointset_Powerset new_x(x.space_dim, EMPTY); + std::deque 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 PS& pi = i->element(); + const PS& pj = j->element(); + if (pi.contains(pj)) { + PS pi_copy = pi; + wf(pi_copy, pj); + new_x.add_non_bottom_disjunct_preserve_reduction(pi_copy); + marked[i_index] = true; + } + } + iterator nx_begin = new_x.begin(); + iterator nx_end = new_x.end(); + i_index = 0; + for (const_iterator i = x_begin; i != x_end; ++i, ++i_index) + if (!marked[i_index]) + nx_begin = new_x.add_non_bottom_disjunct_preserve_reduction(*i, + nx_begin, + nx_end); + std::swap(x.sequence, new_x.sequence); + assert(x.OK()); + assert(x.is_omega_reduced()); +} + +template +template +void +Pointset_Powerset:: +BGP99_extrapolation_assign(const Pointset_Powerset& y, + Widening wf, + unsigned max_disjuncts) { + // `x' is the current iteration value. + Pointset_Powerset& x = *this; + +#ifndef NDEBUG + { + // We assume that `y' entails `x'. + const Pointset_Powerset x_copy = x; + const Pointset_Powerset y_copy = y; + assert(y_copy.definitely_entails(x_copy)); + } +#endif + + x.pairwise_reduce(); + if (max_disjuncts != 0) + x.collapse(max_disjuncts); + x.BGP99_heuristics_assign(y, wf); +} + +template +template +void +Pointset_Powerset:: +collect_certificates(std::map& cert_ms) const { + const Pointset_Powerset& x = *this; + assert(x.is_omega_reduced()); + assert(cert_ms.size() == 0); + for (const_iterator i = x.begin(), end = x.end(); i != end; i++) { + Cert ph_cert(i->element()); + ++cert_ms[ph_cert]; + } +} + +template +template +bool +Pointset_Powerset:: +is_cert_multiset_stabilizing(const std::map& y_cert_ms + ) const { + typedef std::map Cert_Multiset; + Cert_Multiset x_cert_ms; + collect_certificates(x_cert_ms); + typename Cert_Multiset::const_iterator + xi = x_cert_ms.begin(), + x_cert_ms_end = x_cert_ms.end(), + yi = y_cert_ms.begin(), + 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 +template +void +Pointset_Powerset::BHZ03_widening_assign(const Pointset_Powerset& y, + Widening wf) { + // `x' is the current iteration value. + Pointset_Powerset& x = *this; + +#ifndef NDEBUG + { + // We assume that `y' entails `x'. + const Pointset_Powerset x_copy = x; + const Pointset_Powerset y_copy = y; + assert(y_copy.definitely_entails(x_copy)); + } +#endif + + // First widening technique: do nothing. + + // If `y' is the empty collection, do nothing. + assert(x.size() > 0); + if (y.size() == 0) + return; + + // Compute the poly-hull of `x'. + PS x_hull(x.space_dim, EMPTY); + for (const_iterator i = x.begin(), x_end = x.end(); i != x_end; ++i) + x_hull.upper_bound_assign(i->element()); + + // Compute the poly-hull of `y'. + PS y_hull(y.space_dim, EMPTY); + for (const_iterator i = y.begin(), y_end = y.end(); i != y_end; ++i) + y_hull.upper_bound_assign(i->element()); + // Compute the certificate for `y_hull'. + const Cert y_hull_cert(y_hull); + + // If the hull is stabilizing, do nothing. + int hull_stabilization = y_hull_cert.compare(x_hull); + if (hull_stabilization == 1) + return; + + // Multiset ordering is only useful when `y' is not a singleton. + const bool y_is_not_a_singleton = y.size() > 1; + + // The multiset certificate for `y': + // we want to be lazy about its computation. + typedef std::map Cert_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 bgp99_heuristics = x; + bgp99_heuristics.BGP99_heuristics_assign(y, wf); + + // Compute the poly-hull of `bgp99_heuristics'. + PS bgp99_heuristics_hull(x.space_dim, EMPTY); + for (const_iterator i = bgp99_heuristics.begin(), + bh_end = bgp99_heuristics.end(); i != bh_end; ++i) + bgp99_heuristics_hull.upper_bound_assign(i->element()); + + // Check for stabilization and, if successful, + // commit to the result of the extrapolation. + hull_stabilization = y_hull_cert.compare(bgp99_heuristics_hull); + if (hull_stabilization == 1) { + // The poly-hull is stabilizing. + std::swap(x, bgp99_heuristics); + return; + } + else if (hull_stabilization == 0 && y_is_not_a_singleton) { + // If not already done, compute multiset certificate for `y'. + if (!y_cert_ms_computed) { + y.collect_certificates(y_cert_ms); + y_cert_ms_computed = true; + } + if (bgp99_heuristics.is_cert_multiset_stabilizing(y_cert_ms)) { + std::swap(x, bgp99_heuristics); + return; + } + // Third widening technique: pairwise-reduction on `bgp99_heuristics'. + // Note that pairwise-reduction does not affect the computation + // of the poly-hulls, so that we only have to check the multiset + // certificate relation. + Pointset_Powerset reduced_bgp99_heuristics(bgp99_heuristics); + reduced_bgp99_heuristics.pairwise_reduce(); + if (reduced_bgp99_heuristics.is_cert_multiset_stabilizing(y_cert_ms)) { + std::swap(x, reduced_bgp99_heuristics); + return; + } + } + + // Fourth widening technique: this is applicable only when + // `y_hull' is a proper subset of `bgp99_heuristics_hull'. + if (bgp99_heuristics_hull.strictly_contains(y_hull)) { + // Compute (y_hull \widen bgp99_heuristics_hull). + PS ph = bgp99_heuristics_hull; + wf(ph, y_hull); + // Compute the difference between `ph' and `bgp99_heuristics_hull'. + ph.difference_assign(bgp99_heuristics_hull); + x.add_disjunct(ph); + return; + } + + // Fall back to the computation of the poly-hull. + Pointset_Powerset x_hull_singleton(x.space_dim, EMPTY); + x_hull_singleton.add_disjunct(x_hull); + std::swap(x, x_hull_singleton); +} + +template +void +Pointset_Powerset::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->element().ascii_dump(s); +} + +PPL_OUTPUT_TEMPLATE_DEFINITIONS(PS, Pointset_Powerset) + + template +bool +Pointset_Powerset::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) { + PS ph; + if (!ph.ascii_load(s)) + return false; + new_x.add_disjunct(ph); + } + x.swap(new_x); + + // Check invariants. + assert(x.OK()); + return true; +} + +template +bool +Pointset_Powerset::OK() const { + const Pointset_Powerset& x = *this; + for (const_iterator xi = x.begin(), x_end = x.end(); xi != x_end; ++xi) { + const PS& pi = xi->element(); + if (pi.space_dimension() != x.space_dim) { +#ifndef NDEBUG + std::cerr << "Space dimension mismatch: is " << pi.space_dimension() + << " in an element of the sequence,\nshould be " + << x.space_dim << "." + << std::endl; +#endif + return false; + } + } + return x.Base::OK(); +} + +namespace Implementation { + +namespace Pointset_Powersets { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Partitions polyhedron \p qq according to constraint \p c. +/*! \relates Parma_Polyhedra_Library::Pointset_Powerset + On exit, the intersection of \p qq and constraint \p c is stored + in \p qq, whereas the intersection of \p qq with the negation of \p c + is added as a new disjunct of the powerset \p r. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +void +linear_partition_aux(const Constraint& c, + PS& qq, + Pointset_Powerset& r) { + Linear_Expression le(c); + const Constraint& neg_c = c.is_strict_inequality() ? (le <= 0) : (le < 0); + NNC_Polyhedron qqq(qq); + qqq.add_constraint(neg_c); + if (!qqq.is_empty()) + r.add_disjunct(qqq); + qq.add_constraint(c); +} + +} // namespace Pointset_Powersets + +} // namespace Implementation + + +/*! \relates Pointset_Powerset */ +template +std::pair > +linear_partition(const PS& p, const PS& q) { + using Implementation::Pointset_Powersets::linear_partition_aux; + + Pointset_Powerset r(p.space_dimension(), EMPTY); + PS qq = q; + const Constraint_System& pcs = p.constraints(); + for (Constraint_System::const_iterator i = pcs.begin(), + pcs_end = pcs.end(); i != pcs_end; ++i) { + const Constraint& c = *i; + if (c.is_equality()) { + Linear_Expression le(c); + linear_partition_aux(le <= 0, qq, r); + linear_partition_aux(le >= 0, qq, r); + } + else + linear_partition_aux(c, qq, r); + } + return std::make_pair(qq, 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..2563a48 --- /dev/null +++ b/src/Pointset_Powerset.types.hh @@ -0,0 +1,22 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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 +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..e749c91 --- /dev/null +++ b/src/Poly_Con_Relation.cc @@ -0,0 +1,77 @@ +/* Poly_Con_Relation class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Poly_Con_Relation.defs.hh" + +#include +#include +#include + +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..055205d --- /dev/null +++ b/src/Poly_Con_Relation.defs.hh @@ -0,0 +1,165 @@ +/* Poly_Con_Relation class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Poly_Con_Relation_defs_hh +#define PPL_Poly_Con_Relation_defs_hh 1 + +#include "Poly_Con_Relation.types.hh" +#include "globals.defs.hh" +#include + +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..1b590e0 --- /dev/null +++ b/src/Poly_Con_Relation.inlines.hh @@ -0,0 +1,99 @@ +/* Poly_Con_Relation class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Poly_Con_Relation_inlines_hh +#define PPL_Poly_Con_Relation_inlines_hh 1 + +namespace Parma_Polyhedra_Library { + +inline +Poly_Con_Relation::Poly_Con_Relation(flags_t mask) + : flags(mask) { +} + +inline Poly_Con_Relation::flags_t +Poly_Con_Relation::get_flags() const { + return flags; +} + +inline Poly_Con_Relation +Poly_Con_Relation::nothing() { + return Poly_Con_Relation(NOTHING); +} + +inline Poly_Con_Relation +Poly_Con_Relation::is_disjoint() { + return Poly_Con_Relation(IS_DISJOINT); +} + +inline Poly_Con_Relation +Poly_Con_Relation::strictly_intersects() { + return Poly_Con_Relation(STRICTLY_INTERSECTS); +} + +inline Poly_Con_Relation +Poly_Con_Relation::is_included() { + return Poly_Con_Relation(IS_INCLUDED); +} + +inline Poly_Con_Relation +Poly_Con_Relation::saturates() { + return Poly_Con_Relation(SATURATES); +} + +inline bool +Poly_Con_Relation::implies(flags_t x, flags_t y) { + return (x & y) == y; +} + +inline bool +Poly_Con_Relation::implies(const Poly_Con_Relation& y) const { + return implies(flags, y.flags); +} + +/*! \relates Poly_Con_Relation */ +inline bool +operator==(const Poly_Con_Relation& x, const Poly_Con_Relation& y) { + return x.flags == y.flags; +} + +/*! \relates Poly_Con_Relation */ +inline bool +operator!=(const Poly_Con_Relation& x, const Poly_Con_Relation& y) { + return x.flags != y.flags; +} + +/*! \relates Poly_Con_Relation */ +inline Poly_Con_Relation +operator&&(const Poly_Con_Relation& x, const Poly_Con_Relation& y) { + return Poly_Con_Relation(x.flags | y.flags); +} + +/*! \relates Poly_Con_Relation */ +inline Poly_Con_Relation +operator-(const Poly_Con_Relation& x, const Poly_Con_Relation& y) { + return Poly_Con_Relation(x.flags & ~y.flags); +} + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Poly_Con_Relation_inlines_hh) diff --git a/src/Poly_Con_Relation.types.hh b/src/Poly_Con_Relation.types.hh new file mode 100644 index 0000000..8466f1e --- /dev/null +++ b/src/Poly_Con_Relation.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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..0ff0a90 --- /dev/null +++ b/src/Poly_Gen_Relation.cc @@ -0,0 +1,65 @@ +/* Poly_Gen_Relation class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Poly_Gen_Relation.defs.hh" + +#include +#include +#include + +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..946334d --- /dev/null +++ b/src/Poly_Gen_Relation.defs.hh @@ -0,0 +1,138 @@ +/* Poly_Gen_Relation class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Poly_Gen_Relation_defs_hh +#define PPL_Poly_Gen_Relation_defs_hh 1 + +#include "Poly_Gen_Relation.types.hh" +#include "globals.defs.hh" +#include + +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..01fc653 --- /dev/null +++ b/src/Poly_Gen_Relation.inlines.hh @@ -0,0 +1,84 @@ +/* Poly_Gen_Relation class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Poly_Gen_Relation_inlines_hh +#define PPL_Poly_Gen_Relation_inlines_hh 1 + +namespace Parma_Polyhedra_Library { + +inline +Poly_Gen_Relation::Poly_Gen_Relation(flags_t mask) + : flags(mask) { +} + +inline Poly_Gen_Relation::flags_t +Poly_Gen_Relation::get_flags() const { + return flags; +} + +inline Poly_Gen_Relation +Poly_Gen_Relation::nothing() { + return Poly_Gen_Relation(NOTHING); +} + +inline Poly_Gen_Relation +Poly_Gen_Relation::subsumes() { + return Poly_Gen_Relation(SUBSUMES); +} + +inline bool +Poly_Gen_Relation::implies(flags_t x, flags_t y) { + return (x & y) == y; +} + +inline bool +Poly_Gen_Relation::implies(const Poly_Gen_Relation& y) const { + return implies(flags, y.flags); +} + +/*! \relates Poly_Gen_Relation */ +inline bool +operator==(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) { + return x.flags == y.flags; +} + +/*! \relates Poly_Gen_Relation */ +inline bool +operator!=(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) { + return x.flags != y.flags; +} + +/*! \relates Poly_Gen_Relation */ +inline Poly_Gen_Relation +operator&&(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) { + return Poly_Gen_Relation(x.flags | y.flags); +} + +/*! \relates Poly_Gen_Relation */ +inline Poly_Gen_Relation +operator-(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) { + return Poly_Gen_Relation(x.flags & ~y.flags); +} + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Poly_Gen_Relation_inlines_hh) diff --git a/src/Poly_Gen_Relation.types.hh b/src/Poly_Gen_Relation.types.hh new file mode 100644 index 0000000..ae9244f --- /dev/null +++ b/src/Poly_Gen_Relation.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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.defs.hh b/src/Polyhedron.defs.hh new file mode 100644 index 0000000..e12e292 --- /dev/null +++ b/src/Polyhedron.defs.hh @@ -0,0 +1,2716 @@ +/* Polyhedron class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Polyhedron_defs_hh +#define PPL_Polyhedron_defs_hh 1 + +#include "Polyhedron.types.hh" +#include "globals.types.hh" +#include "Variable.defs.hh" +#include "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 "Grid_Generator_System.defs.hh" +#include "Grid_Generator_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 +#include + +namespace Parma_Polyhedra_Library { + +namespace IO_Operators { + +//! Output operator. +/*! + \relates Parma_Polyhedra_Library::Polyhedron + Writes a textual representation of \p ph on \p s: + false is written if \p ph is an empty polyhedron; + true is written if \p ph is a universe polyhedron; + a minimized system of constraints defining \p ph is written otherwise, + all constraints in one row separated by ", ". +*/ +std::ostream& +operator<<(std::ostream& s, const Polyhedron& ph); + +} // namespace IO_Operators + +/*! \brief + Returns true 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 false is returned. +*/ +bool operator==(const Polyhedron& x, const Polyhedron& y); + +/*! \brief + Returns true 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 true 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 + ph.topology() == NECESSARILY_CLOSED. +*/ +#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: + - explicit 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 + x and 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 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 + add_space_dimensions_and_embed: + \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 + add_space_dimensions_and_project: + \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 + add_space_dimensions_and_embed. + 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 + affine_image: + \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 + affine_preimage: + \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 + remove_space_dimensions: + \code + Generator_System gs; + gs.insert(point(3*x + y +0*z + 2*w)); + C_Polyhedron ph(gs); + Variables_Set to_be_removed; + to_be_removed.insert(y); + to_be_removed.insert(z); + ph.remove_space_dimensions(to_be_removed); + \endcode + The starting polyhedron is the singleton set + \f$\bigl\{ (3, 1, 0, 2)^\transpose \bigr\} \sseq \Rset^4\f$, while + the resulting polyhedron is + \f$\bigl\{ (3, 2)^\transpose \bigr\} \sseq \Rset^2\f$. + Be careful when removing space dimensions incrementally: + since dimensions are automatically renamed after each application + of the remove_space_dimensions operator, unexpected + results can be obtained. + For instance, by using the following code we would obtain + a different result: + \code + set to_be_removed1; + to_be_removed1.insert(y); + ph.remove_space_dimensions(to_be_removed1); + set to_be_removed2; + to_be_removed2.insert(z); + ph.remove_space_dimensions(to_be_removed2); + \endcode + In this case, the result is the polyhedron + \f$\bigl\{(3, 0)^\transpose \bigr\} \sseq \Rset^2\f$: + when removing the set of dimensions \p to_be_removed2 + we are actually removing variable \f$w\f$ of the original polyhedron. + For the same reason, the operator \p remove_space_dimensions + is not idempotent: removing twice the same non-empty set of dimensions + is never the same as removing them just once. +*/ + +class Parma_Polyhedra_Library::Polyhedron { +public: + //! 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 const 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 const 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 + Polyhedron(Topology topol, const Box& 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; + + //! Returns a universe system of grid generators. + Grid_Generator_System grid_generators() const; + + //! Returns a universe system of grid generators. + Grid_Generator_System minimized_grid_generators() const; + + /*! \brief + Returns the relations holding between the polyhedron \p *this + and the constraint \p c. + + \exception std::invalid_argument + Thrown if \p *this and constraint \p c are dimension-incompatible. + */ + Poly_Con_Relation relation_with(const Constraint& c) const; + + /*! \brief + Returns the relations holding between the polyhedron \p *this + and the generator \p g. + + \exception std::invalid_argument + Thrown if \p *this and generator \p g are dimension-incompatible. + */ + Poly_Gen_Relation relation_with(const Generator& g) const; + + /*! \brief + Returns 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 true if and only if \p *this is + an empty polyhedron. + */ + bool is_empty() const; + + /*! \brief + Returns true if and only if \p *this + is a universe polyhedron. + */ + bool is_universe() const; + + /*! \brief + Returns true if and only if \p *this + is a topologically closed subset of the vector space. + */ + bool is_topologically_closed() const; + + //! Returns true 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 true if and only if \p *this is discrete. + bool is_discrete() const; + + /*! \brief + Returns true if and only if \p *this + is a bounded polyhedron. + */ + bool is_bounded() const; + + /*! \brief + Returns true if and only if \p *this + contains at least one integer point. + */ + bool contains_integer_point() const; + + /*! \brief + Returns true 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 true 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 true 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 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 + true 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, + false 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 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 + 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 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, + false 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 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 + true 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, + false 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 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 + 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 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, + false 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; + + //! Returns true 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 true 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 + true if and only if \p *this satisfies all the + invariants and either \p check_not_empty is false or + \p *this is not empty. + + \param check_not_empty + true 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 std::cerr 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 constraint \p c to the system of constraints + of \p *this, minimizing the result + + \param c + The constraint that will be added to the system of + constraints of \p *this. + + \return + false if and only if the result is empty. + + \exception std::invalid_argument + Thrown if \p *this and constraint \p c are topology-incompatible + or dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_constraint_and_minimize(const Constraint& c); + + /*! \brief + Adds a copy of generator \p g to the system of generators + of \p *this (without minimizing the result). + + \exception std::invalid_argument + Thrown if \p *this and generator \p g are topology-incompatible or + dimension-incompatible, or if \p *this is an empty polyhedron and + \p g is not a point. + */ + void add_generator(const Generator& g); + + /*! \brief + Adds a copy of generator \p g to the system of generators + of \p *this, minimizing the result. + + \return + false if and only if the result is empty. + + \exception std::invalid_argument + Thrown if \p *this and generator \p g are topology-incompatible or + dimension-incompatible, or if \p *this is an empty polyhedron and + \p g is not a point. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_generator_and_minimize(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 congruence \p cg to \p *this, + if \p cg can be exactly represented by a polyhedron, + minimizing the result. + + \return + false if and only if the result is empty. + + \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. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_congruence_and_minimize(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 constraints in \p cs to the system + of constraints of \p *this, minimizing the result. + + \return + false if and only if the result is empty. + + \param cs + Contains the constraints that will be added to the system of + constraints of \p *this. + + \exception std::invalid_argument + Thrown if \p *this and \p cs are topology-incompatible or + dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_constraints_and_minimize(const Constraint_System& cs); + + /*! \brief + Adds the constraints in \p cs to the system of constraints + of \p *this, minimizing the result. + + \return + false if and only if the result is empty. + + \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. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_recycled_constraints_and_minimize(Constraint_System& cs); + + /*! \brief + Adds a copy of the generators in \p gs to the system + of generators of \p *this (without minimizing the result). + + \param gs + Contains the generators that will be added to the system of + generators of \p *this. + + \exception std::invalid_argument + Thrown if \p *this and \p gs are topology-incompatible or + dimension-incompatible, or if \p *this is empty and the system of + generators \p gs is not empty, but has no points. + */ + void add_generators(const Generator_System& gs); + + /*! \brief + Adds the generators in \p gs to the system of generators + of \p *this (without minimizing the result). + + \param gs + The generator system 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 generators in \p gs to the system + of generators of \p *this, minimizing the result. + + \return + false if and only if the result is empty. + + \param gs + Contains the generators that will be added to the system of + generators of \p *this. + + \exception std::invalid_argument + Thrown if \p *this and \p gs are topology-incompatible or + dimension-incompatible, or if \p *this is empty and the the system + of generators \p gs is not empty, but has no points. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_generators_and_minimize(const Generator_System& gs); + + /*! \brief + Adds the generators in \p gs to the system of generators + of \p *this, minimizing the result. + + \return + false if and only if the result is empty. + + \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 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. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_recycled_generators_and_minimize(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 a copy of the congruences in \p cgs to \p *this, + if all the congruences can be exactly represented by a polyhedron, + minimizing the result. + + \return + false if and only if the result is empty. + + \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 + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_congruences_and_minimize(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 + Adds the congruences in \p cgs to \p *this, + if all the congruences can be exactly represented by a polyhedron, + minimizing the result. + + \return + false if and only if the result is empty. + + \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. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_recycled_congruences_and_minimize(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 + 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 to_be_unconstrained, + assigning the result to \p *this. + + \param to_be_unconstrained + 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 to_be_removed. + */ + void unconstrain(const Variables_Set& to_be_unconstrained); + + /*! \brief + Assigns to \p *this the intersection of \p *this and \p y. + The result is not guaranteed to be minimized. + + \exception std::invalid_argument + Thrown if \p *this and \p y are topology-incompatible or + dimension-incompatible. + */ + void intersection_assign(const Polyhedron& y); + + /*! \brief + Assigns to \p *this the intersection of \p *this and \p y, + minimizing the result. + + \return + false if and only if the result is empty. + + \exception std::invalid_argument + Thrown if \p *this and \p y are topology-incompatible or + dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool intersection_assign_and_minimize(const Polyhedron& y); + + /*! \brief + Assigns to \p *this the poly-hull of \p *this and \p y. + The result is not guaranteed to be minimized. + + \exception std::invalid_argument + Thrown if \p *this and \p y are topology-incompatible or + dimension-incompatible. + */ + void poly_hull_assign(const Polyhedron& y); + + /*! \brief + Assigns to \p *this the poly-hull of \p *this and \p y, + minimizing the result. + + \return + false if and only if the result is empty. + + \exception std::invalid_argument + Thrown if \p *this and \p y are topology-incompatible or + dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool poly_hull_assign_and_minimize(const Polyhedron& y); + + //! Same as poly_hull_assign(y). + void upper_bound_assign(const Polyhedron& y); + + /*! \brief + Assigns to \p *this + the \ref Convex_Polyhedral_Difference "poly-difference" + of \p *this and \p y. The result is not guaranteed to be minimized. + + \exception std::invalid_argument + Thrown if \p *this and \p y are topology-incompatible or + dimension-incompatible. + */ + void poly_difference_assign(const Polyhedron& y); + + //! Same as poly_difference_assign(y). + void difference_assign(const Polyhedron& y); + + /*! \brief + Assigns to \p *this 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()); + + /*! \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); + + //! 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 must 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 must 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 must 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 must 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 must 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 must 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 max_space_dimension(). + + 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 max_space_dimension(). + + 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 max_space_dimension(). + */ + void concatenate_assign(const Polyhedron& y); + + //! Removes all the specified dimensions from the vector space. + /*! + \param to_be_removed + The set of Variable objects corresponding to the space dimensions + to be removed. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with one of the + Variable objects contained in \p to_be_removed. + */ + void remove_space_dimensions(const Variables_Set& to_be_removed); + + /*! \brief + Removes the higher dimensions of the vector space so that + the resulting space will have dimension \p new_dimension. + + \exception std::invalid_argument + Thrown if \p new_dimensions is greater than the space dimension of + \p *this. + */ + void remove_higher_space_dimensions(dimension_type new_dimension); + + /*! \brief + Remaps the dimensions of the vector space according to + a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function". + + \param pfunc + The partial function specifying the destiny of each space dimension. + + The template class Partial_Function must provide the following + methods. + \code + bool has_empty_codomain() const + \endcode + returns true if and only if the represented partial + function has an empty codomain (i.e., it is always undefined). + The has_empty_codomain() method will always be called + before the methods below. However, if + has_empty_codomain() returns true, 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 max_in_codomain() 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 true is returned. + If \f$f\f$ is undefined in \f$k\f$, then false 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 + 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 max_space_dimension(). + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + and var has space dimension \f$k \leq n\f$, + then the \f$k\f$-th space dimension is + \ref expand_space_dimension "expanded" to \p m new space dimensions + \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$. + */ + void expand_space_dimension(Variable var, dimension_type m); + + //! Folds the space dimensions in \p to_be_folded into \p var. + /*! + \param to_be_folded + The set of Variable objects corresponding to the space dimensions + to be folded; + + \param var + The variable corresponding to the space dimension that is the + destination of the folding operation. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with \p var or with + one of the Variable objects contained in \p to_be_folded. + Also thrown if \p var is contained in \p to_be_folded. + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + var has space dimension \f$k \leq n\f$, + \p to_be_folded is a set of variables whose maximum space dimension + is also less than or equal to \f$n\f$, and \p var is not a member + of \p to_be_folded, then the space dimensions corresponding to + variables in \p to_be_folded are \ref fold_space_dimensions "folded" + into the \f$k\f$-th space dimension. + */ + void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var); + + //@} // Member Functions that May Modify the Dimension of the Vector Space + + friend bool operator==(const Polyhedron& x, const Polyhedron& y); + + //! \name Miscellaneous Member Functions + //@{ + + //! Destructor. + ~Polyhedron(); + + /*! \brief + Swaps \p *this with polyhedron \p y. + (\p *this and \p y can be dimension-incompatible.) + + \exception std::invalid_argument + Thrown if \p x and \p y are topology-incompatible. + */ + void swap(Polyhedron& y); + + PPL_OUTPUT_DECLARATIONS + + /*! \brief + Loads from \p s an ASCII representation (as produced by + ascii_dump(std::ostream&) const) and sets \p *this accordingly. + Returns true if successful, false 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 x == y, + then x.hash_code() == y.hash_code(). + */ + int32_t hash_code() const; + + //@} // Miscellaneous Member Functions + +private: + //! The system of constraints. + Constraint_System con_sys; + + //! The system of generators. + Generator_System gen_sys; + + //! The saturation matrix having constraints on its columns. + 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 true 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 true if the polyhedron is known to be empty. + /*! + The return value false does not necessarily + implies that \p *this is non-empty. + */ + bool marked_empty() const; + + //! Returns true if the system of constraints is up-to-date. + bool constraints_are_up_to_date() const; + + //! Returns true if the system of generators is up-to-date. + bool generators_are_up_to_date() const; + + //! Returns true 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 true 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 true if there are pending constraints. + bool has_pending_constraints() const; + + //! Returns true if there are pending generators. + bool has_pending_generators() const; + + /*! \brief + Returns true if there are + either pending constraints or pending generators. + */ + bool has_something_pending() const; + + //! Returns true if the polyhedron can have something pending. + bool can_have_something_pending() const; + + /*! \brief + Returns true if the saturation matrix \p sat_c + is up-to-date. + */ + bool sat_c_is_up_to_date() const; + + /*! \brief + Returns true 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 + false 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 + false 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 + false 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 + false 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 + false 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 + false 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 + false 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 true 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 true if and only if \p from_above is + true and \p expr is bounded from above in \p *this, + or \p from_above is false and \p expr is bounded + from below in \p *this. + + \param expr + The linear expression to test; + + \param from_above + true 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 + true 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 + true 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, false 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_selected) const; + + /*! \brief + Splits the constraints of `x' into two subsets, depending on whether + or not they are selected to compute the \ref H79_widening "H79-widening" + of \p *this and \p y. + */ + void select_H79_constraints(const Polyhedron& y, + Constraint_System& cs_selected, + Constraint_System& cs_not_selected) const; + + bool BHRZ03_combining_constraints(const Polyhedron& y, + const BHRZ03_Certificate& y_cert, + const Polyhedron& H79, + const Constraint_System& x_minus_H79_con_sys); + + bool BHRZ03_evolving_points(const Polyhedron& y, + const BHRZ03_Certificate& y_cert, + const Polyhedron& H79); + + bool BHRZ03_evolving_rays(const Polyhedron& y, + const BHRZ03_Certificate& y_cert, + const Polyhedron& H79); + + //@} // Widening- and Extrapolation-Related Functions + + //! Adds new space dimensions to the given matrices. + /*! + \param mat1 + The matrix to which columns are added; + + \param mat2 + The matrix to which rows and columns are added; + + \param sat1 + The saturation matrix whose columns are indexed by the rows of + matrix \p mat1. On entry it is up-to-date; + + \param sat2 + The saturation matrix whose columns are indexed by the rows of \p + mat2; + + \param add_dim + The number of space dimensions to add. + + Adds new space dimensions to the vector space modifying the matrices. + This function is invoked only by + add_space_dimensions_and_embed() and + add_space_dimensions_and_project(), passing the matrix of + constraints and that of generators (and the corresponding saturation + matrices) in different order (see those methods for details). + */ + static void add_space_dimensions(Linear_System& mat1, + Linear_System& mat2, + 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. + static bool minimize(bool con_to_gen, + Linear_System& source, + 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. + static bool add_and_minimize(bool con_to_gen, + Linear_System& source1, + Linear_System& dest, + Bit_Matrix& sat, + const Linear_System& source2); + + /*! \brief + Adds given constraints and builds minimized corresponding generators + or vice versa. The given constraints are in \p source. + */ + // Detailed Doxygen comment to be found in file minimize.cc. + static bool add_and_minimize(bool con_to_gen, + Linear_System& source, + Linear_System& dest, + Bit_Matrix& sat); + + //! Performs the conversion from constraints to generators and vice versa. + // Detailed Doxygen comment to be found in file conversion.cc. + static dimension_type conversion(Linear_System& source, + dimension_type start, + Linear_System& dest, + Bit_Matrix& sat, + dimension_type num_lines_or_equalities); + + /*! \brief + Uses Gauss' elimination method to simplify the result of + conversion(). + */ + // Detailed Doxygen comment to be found in file simplify.cc. + static dimension_type simplify(Linear_System& mat, 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 friend class Parma_Polyhedra_Library::Box; + template friend class Parma_Polyhedra_Library::BD_Shape; + template 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 + Convexity Recognition of the Union of Polyhedra + 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_runtime_error(const char* method) const; + void throw_invalid_argument(const char* method, const char* reason) const; + + void throw_topology_incompatible(const char* method, + const char* ph_name, + const Polyhedron& ph) const; + void throw_topology_incompatible(const char* method, + const char* c_name, + const Constraint& c) const; + void throw_topology_incompatible(const char* method, + const char* g_name, + const Generator& g) const; + void throw_topology_incompatible(const char* method, + const char* cs_name, + const Constraint_System& cs) const; + void throw_topology_incompatible(const char* method, + const char* gs_name, + const Generator_System& gs) const; + + void throw_dimension_incompatible(const char* method, + const char* other_name, + dimension_type other_dim) const; + void throw_dimension_incompatible(const char* method, + const char* ph_name, + const Polyhedron& ph) const; + void throw_dimension_incompatible(const char* method, + const char* e_name, + const Linear_Expression& e) const; + void throw_dimension_incompatible(const char* method, + const char* c_name, + const Constraint& c) const; + void throw_dimension_incompatible(const char* method, + const char* g_name, + const Generator& g) const; + void throw_dimension_incompatible(const char* method, + const char* cg_name, + const Congruence& cg) const; + void throw_dimension_incompatible(const char* method, + const char* cs_name, + const Constraint_System& cs) const; + void throw_dimension_incompatible(const char* method, + const char* gs_name, + const Generator_System& gs) const; + void throw_dimension_incompatible(const char* method, + const char* cgs_name, + const Congruence_System& cgs) const; + void throw_dimension_incompatible(const char* method, + const char* var_name, + Variable var) const; + void throw_dimension_incompatible(const char* method, + dimension_type required_space_dim) const; + + // Note: it has to be a static method, because it can be called inside + // constructors (before actually constructing the polyhedron object). + static void throw_space_dimension_overflow(Topology topol, + const char* method, + const char* reason); + + void throw_invalid_generator(const char* method, + const char* g_name) const; + void throw_invalid_generators(const char* method, + const char* gs_name) const; +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS + //@} // Exception Throwers +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) + +}; + + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Polyhedron */ +void swap(Parma_Polyhedra_Library::Polyhedron& x, + Parma_Polyhedra_Library::Polyhedron& y); + +} // namespace std + +#include "Ph_Status.inlines.hh" +#include "Polyhedron.inlines.hh" +#include "Polyhedron.templates.hh" + +#endif // !defined(PPL_Polyhedron_defs_hh) diff --git a/src/Polyhedron.inlines.hh b/src/Polyhedron.inlines.hh new file mode 100644 index 0000000..5b3c335 --- /dev/null +++ b/src/Polyhedron.inlines.hh @@ -0,0 +1,426 @@ +/* Polyhedron class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Polyhedron_inlines_hh +#define PPL_Polyhedron_inlines_hh 1 + +#include "Generator.defs.hh" +#include "compiler.hh" +#include +#include + +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 space_dimension() & 0x7fffffff; +} + +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::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::swap(Polyhedron& y) { + if (topology() != y.topology()) + throw_topology_incompatible("swap(y)", "y", y); + std::swap(con_sys, y.con_sys); + std::swap(gen_sys, y.gen_sys); + std::swap(sat_c, y.sat_c); + std::swap(sat_g, y.sat_g); + std::swap(status, y.status); + std::swap(space_dim, y.space_dim); +} + +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 { + assert(space_dim > 0 && !marked_empty()); + assert(has_something_pending()); + + Polyhedron& x = const_cast(*this); + + if (x.has_pending_constraints()) + return x.process_pending_constraints(); + + assert(x.has_pending_generators()); + x.process_pending_generators(); + return true; +} + +inline bool +Polyhedron::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 { + 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 Grid_Generator_System +Polyhedron::minimized_grid_generators() const { + return grid_generators(); +} + +inline bool +Polyhedron::add_congruence_and_minimize(const Congruence& cg) { + add_congruence(cg); + return minimize(); +} + +inline bool +Polyhedron::add_congruences_and_minimize(const Congruence_System& cgs) { + add_congruences(cgs); + return minimize(); +} + +inline void +Polyhedron::add_recycled_congruences(Congruence_System& cgs) { + add_congruences(cgs); +} + +inline bool +Polyhedron::add_recycled_congruences_and_minimize(Congruence_System& cgs) { + return add_congruences_and_minimize(cgs); +} + +/*! \relates Polyhedron */ +inline bool +operator!=(const Polyhedron& x, const Polyhedron& y) { + return !(x == y); +} + +inline bool +Polyhedron::strictly_contains(const Polyhedron& y) const { + const Polyhedron& x = *this; + return x.contains(y) && !y.contains(x); +} + +namespace Interfaces { + +inline bool +is_necessarily_closed_for_interfaces(const Polyhedron& ph) { + return ph.is_necessarily_closed(); +} + +} // namespace Interfaces + +} // namespace Parma_Polyhedra_Library + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Polyhedron */ +inline void +swap(Parma_Polyhedra_Library::Polyhedron& x, + Parma_Polyhedra_Library::Polyhedron& y) { + x.swap(y); +} + +} // namespace std + +#endif // !defined(PPL_Polyhedron_inlines_hh) diff --git a/src/Polyhedron.templates.hh b/src/Polyhedron.templates.hh new file mode 100644 index 0000000..c4409a6 --- /dev/null +++ b/src/Polyhedron.templates.hh @@ -0,0 +1,298 @@ +/* Polyhedron class implementation: non-inline template functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Polyhedron_templates_hh +#define PPL_Polyhedron_templates_hh 1 + +#include "Generator.defs.hh" +#include "MIP_Problem.defs.hh" +#include +#include + +namespace Parma_Polyhedra_Library { + +template +Polyhedron::Polyhedron(Topology topol, + const Box& box, + Complexity_Class) + : con_sys(topol), + gen_sys(topol), + sat_c(), + sat_g() { + // Initialize the space dimension as indicated by the box. + space_dim = box.space_dimension(); + + // Check for emptiness. + if (box.is_empty()) { + set_empty(); + return; + } + + // Zero-dim universe polyhedron. + if (space_dim == 0) { + set_zero_dim_univ(); + return; + } + + // Insert a dummy constraint of the highest dimension to avoid the + // need of resizing the matrix of constraints later; + // this constraint will be removed at the end. + con_sys.insert(Variable(space_dim - 1) >= 0); + + 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; ) { + // See if we have a valid lower bound. + bool l_closed = false; + bool l_bounded = box.get_lower_bound(k, l_closed, l_n, l_d); + // See if we have a valid upper bound. + bool u_closed = false; + bool u_bounded = box.get_upper_bound(k, u_closed, u_n, u_d); + + // See if we have an implicit equality constraint. + if (l_bounded && u_bounded + && l_closed && u_closed + && l_n == u_n && l_d == u_d) { + // Add the constraint `l_d*v_k == l_n'. + con_sys.insert(l_d * Variable(k) == l_n); + } + else { + if (l_bounded) + // Add the constraint `l_d*v_k >= l_n'. + con_sys.insert(l_d * Variable(k) >= l_n); + if (u_bounded) + // Add the constraint `u_d*v_k <= u_n'. + con_sys.insert(u_d * Variable(k) <= u_n); + } + } + } + else { + // topol == NOT_NECESSARILY_CLOSED + for (dimension_type k = space_dim; k-- > 0; ) { + // See if we have a valid lower bound. + bool l_closed = false; + bool l_bounded = box.get_lower_bound(k, l_closed, l_n, l_d); + // See if we have a valid upper bound. + bool u_closed = false; + bool u_bounded = box.get_upper_bound(k, u_closed, u_n, u_d); + + // See if we have an implicit equality constraint. + if (l_bounded && u_bounded + && l_closed && u_closed + && l_n == u_n && l_d == u_d) { + // Add the constraint `l_d*v_k == l_n'. + con_sys.insert(l_d * Variable(k) == l_n); + } + else { + // Check if a lower bound constraint is required. + if (l_bounded) { + if (l_closed) + // Add the constraint `l_d*v_k >= l_n'. + con_sys.insert(l_d * Variable(k) >= l_n); + else + // Add the constraint `l_d*v_k > l_n'. + con_sys.insert(l_d * Variable(k) > l_n); + } + // Check if an upper bound constraint is required. + if (u_bounded) { + if (u_closed) + // Add the constraint `u_d*v_k <= u_n'. + con_sys.insert(u_d * Variable(k) <= u_n); + else + // Add the constraint `u_d*v_k < u_n'. + con_sys.insert(u_d * Variable(k) < u_n); + } + } + } + } + + // Adding the low-level constraints. + con_sys.add_low_level_constraints(); + // Now removing the dummy constraint inserted before. + dimension_type n_rows = con_sys.num_rows() - 1; + con_sys[0].swap(con_sys[n_rows]); + con_sys.set_sorted(false); + // NOTE: here there are no pending constraints. + con_sys.set_index_first_pending_row(n_rows); + con_sys.erase_to_end(n_rows); + + // Constraints are up-to-date. + set_constraints_up_to_date(); + assert(OK()); +} + +template +void +Polyhedron::map_space_dimensions(const Partial_Function& pfunc) { + if (space_dim == 0) + return; + + if (pfunc.has_empty_codomain()) { + // All dimensions vanish: the polyhedron becomes zero_dimensional. + if (marked_empty() + || (has_pending_constraints() + && !remove_pending_to_obtain_generators()) + || (!generators_are_up_to_date() && !update_generators())) { + // Removing all dimensions from the empty polyhedron. + space_dim = 0; + con_sys.clear(); + } + else + // Removing all dimensions from a non-empty polyhedron. + set_zero_dim_univ(); + + assert(OK()); + return; + } + + const dimension_type new_space_dimension = pfunc.max_in_codomain() + 1; + + if (new_space_dimension == space_dim) { + // The partial function `pfunc' is indeed total and thus specifies + // a permutation, that is, a renaming of the dimensions. For + // maximum efficiency, we will simply permute the columns of the + // constraint system and/or the generator system. + + // We first compute suitable permutation cycles for the columns of + // the `con_sys' and `gen_sys' matrices. We will represent them + // with a linear array, using 0 as a terminator for each cycle + // (notice that the columns with index 0 of `con_sys' and + // `gen_sys' represent the inhomogeneous terms, and thus are + // unaffected by the permutation of dimensions). + // Cycles of length 1 will be omitted so that, in the worst case, + // we will have `space_dim' elements organized in `space_dim/2' + // cycles, which means we will have at most `space_dim/2' + // terminators. + std::vector cycles; + cycles.reserve(space_dim + space_dim/2); + + // Used to mark elements as soon as they are inserted in a cycle. + std::deque visited(space_dim); + + for (dimension_type i = space_dim; i-- > 0; ) { + if (!visited[i]) { + dimension_type j = i; + do { + visited[j] = true; + // The following initialization is only to make the compiler happy. + dimension_type k = 0; + if (!pfunc.maps(j, k)) + throw_invalid_argument("map_space_dimensions(pfunc)", + " pfunc is inconsistent"); + if (k == j) + // Cycle of length 1: skip it. + goto skip; + + cycles.push_back(j+1); + // Go along the cycle. + j = k; + } while (!visited[j]); + // End of cycle: mark it. + cycles.push_back(0); + skip: + ; + } + } + + // If `cycles' is empty then `pfunc' is the identity. + if (cycles.empty()) + return; + + // Permute all that is up-to-date. Notice that the contents of + // the saturation matrices is unaffected by the permutation of + // columns: they remain valid, if they were so. + if (constraints_are_up_to_date()) + con_sys.permute_columns(cycles); + + if (generators_are_up_to_date()) + gen_sys.permute_columns(cycles); + + assert(OK()); + return; + } + + // If control gets here, then `pfunc' is not a permutation and some + // dimensions must be projected away. + + // If there are pending constraints, using `generators()' we process them. + const Generator_System& old_gensys = generators(); + + if (old_gensys.has_no_rows()) { + // The polyhedron is empty. + Polyhedron new_polyhedron(topology(), new_space_dimension, EMPTY); + std::swap(*this, new_polyhedron); + assert(OK()); + return; + } + + // Make a local copy of the partial function. + std::vector pfunc_maps(space_dim, not_a_dimension()); + for (dimension_type j = space_dim; j-- > 0; ) { + dimension_type pfunc_j; + if (pfunc.maps(j, pfunc_j)) + pfunc_maps[j] = pfunc_j; + } + + Generator_System new_gensys; + for (Generator_System::const_iterator i = old_gensys.begin(), + old_gensys_end = old_gensys.end(); i != old_gensys_end; ++i) { + const Generator& old_g = *i; + Linear_Expression e(0 * Variable(new_space_dimension-1)); + bool all_zeroes = true; + for (dimension_type j = space_dim; j-- > 0; ) { + if (old_g.coefficient(Variable(j)) != 0 + && pfunc_maps[j] != not_a_dimension()) { + e += Variable(pfunc_maps[j]) * old_g.coefficient(Variable(j)); + all_zeroes = false; + } + } + switch (old_g.type()) { + case Generator::LINE: + if (!all_zeroes) + new_gensys.insert(line(e)); + break; + case Generator::RAY: + if (!all_zeroes) + new_gensys.insert(ray(e)); + break; + case Generator::POINT: + // A point in the origin has all zero homogeneous coefficients. + new_gensys.insert(point(e, old_g.divisor())); + break; + case Generator::CLOSURE_POINT: + // A closure point in the origin has all zero homogeneous coefficients. + new_gensys.insert(closure_point(e, old_g.divisor())); + break; + } + } + Polyhedron new_polyhedron(topology(), new_gensys); + std::swap(*this, new_polyhedron); + assert(OK(true)); +} + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Polyhedron_templates_hh) diff --git a/src/Polyhedron.types.hh b/src/Polyhedron.types.hh new file mode 100644 index 0000000..87655af --- /dev/null +++ b/src/Polyhedron.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PPL_Polyhedron_types_hh +#define PPL_Polyhedron_types_hh 1 + +namespace Parma_Polyhedra_Library { + +class Polyhedron; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Polyhedron_types_hh) diff --git a/src/Polyhedron_chdims.cc b/src/Polyhedron_chdims.cc new file mode 100644 index 0000000..84bc06b --- /dev/null +++ b/src/Polyhedron_chdims.cc @@ -0,0 +1,643 @@ +/* Polyhedron class implementation + (non-inline operators that may change the dimension of the vector space). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Polyhedron.defs.hh" +#include "Variables_Set.defs.hh" +#include + +#define BE_LAZY 1 + +namespace PPL = Parma_Polyhedra_Library; + +void +PPL::Polyhedron::add_space_dimensions(Linear_System& sys1, + Linear_System& sys2, + Bit_Matrix& sat1, + Bit_Matrix& sat2, + dimension_type add_dim) { + assert(sys1.topology() == sys2.topology()); + assert(sys1.num_columns() == sys2.num_columns()); + assert(add_dim != 0); + + sys1.add_zero_columns(add_dim); + dimension_type old_index = sys2.first_pending_row(); + sys2.add_rows_and_columns(add_dim); + // The added rows are in the non-pending part. + sys2.set_index_first_pending_row(old_index + add_dim); + + // The resulting saturation matrix will be as follows: + // from row 0 to add_dim-1 : only zeroes + // add_dim add_dim+num_rows-1 : old saturation matrix + + // In fact all the old generators saturate all the new constraints + // because the polyhedron has not been embedded in the new space. + sat1.resize(sat1.num_rows() + add_dim, sat1.num_columns()); + // The old matrix is moved to the end of the new matrix. + for (dimension_type i = sat1.num_rows() - add_dim; i-- > 0; ) + std::swap(sat1[i], sat1[i+add_dim]); + // Computes the "sat_c", too. + sat2.transpose_assign(sat1); + + if (!sys1.is_necessarily_closed()) { + // Moving the epsilon coefficients to the new last column. + dimension_type new_eps_index = sys1.num_columns() - 1; + dimension_type old_eps_index = new_eps_index - add_dim; + // This swap preserves sortedness of `sys1'. + sys1.swap_columns(old_eps_index, new_eps_index); + + // Try to preserve sortedness of `sys2'. + if (!sys2.is_sorted()) + sys2.swap_columns(old_eps_index, new_eps_index); + else { + for (dimension_type i = sys2.num_rows(); i-- > add_dim; ) { + Linear_Row& r = sys2[i]; + std::swap(r[old_eps_index], r[new_eps_index]); + } + // The upper-right corner of `sys2' contains the J matrix: + // swap coefficients to preserve sortedness. + for (dimension_type i = add_dim; i-- > 0; ++old_eps_index) { + Linear_Row& r = sys2[i]; + std::swap(r[old_eps_index], r[old_eps_index + 1]); + } + } + // NOTE: since we swapped columns in both `sys1' and `sys2', + // no swapping is required for `sat1' and `sat2'. + } +} + +void +PPL::Polyhedron::add_space_dimensions_and_embed(dimension_type m) { + // The space dimension of the resulting polyhedron should not + // overflow the maximum allowed space dimension. + if (m > max_space_dimension() - space_dimension()) + throw_space_dimension_overflow(topology(), + "add_space_dimensions_and_embed(m)", + "adding m new space dimensions exceeds " + "the maximum allowed space dimension"); + + // Adding no dimensions to any polyhedron is a no-op. + if (m == 0) + return; + + // Adding dimensions to an empty polyhedron is obtained by adjusting + // `space_dim' and clearing `con_sys' (since it can contain the + // unsatisfiable constraint system of the wrong dimension). + if (marked_empty()) { + space_dim += m; + con_sys.clear(); + return; + } + + // The case of a zero-dimensional space polyhedron. + if (space_dim == 0) { + // Since it is not empty, it has to be the universe polyhedron. + assert(status.test_zero_dim_univ()); + // We swap `*this' with a newly created + // universe polyhedron of dimension `m'. + Polyhedron ph(topology(), m, UNIVERSE); + swap(ph); + return; + } + + // To embed an n-dimension space polyhedron in a (n+m)-dimension space, + // we just add `m' zero-columns to the rows in the system of constraints; + // in contrast, the system of generators needs additional rows, + // corresponding to the vectors of the canonical basis + // for the added dimensions. That is, for each new dimension `x[k]' + // we add the line having that direction. This is done by invoking + // the function add_space_dimensions() giving the system of generators + // as the second argument. + if (constraints_are_up_to_date()) + if (generators_are_up_to_date()) { + // `sat_c' must be up to date for add_space_dimensions(). + if (!sat_c_is_up_to_date()) + update_sat_c(); + // Adds rows and/or columns to both matrices. + // `add_space_dimensions' correctly handles pending constraints + // or generators. + add_space_dimensions(con_sys, gen_sys, sat_c, sat_g, m); + } + else { + // Only constraints are up-to-date: no need to modify the generators. + con_sys.add_zero_columns(m); + // If the polyhedron is not necessarily closed, + // move the epsilon coefficients to the last column. + if (!is_necessarily_closed()) + con_sys.swap_columns(space_dim + 1, space_dim + 1 + m); + } + else { + // Only generators are up-to-date: no need to modify the constraints. + assert(generators_are_up_to_date()); + gen_sys.add_rows_and_columns(m); + // The polyhedron does not support pending generators. + gen_sys.unset_pending_rows(); + // If the polyhedron is not necessarily closed, + // move the epsilon coefficients to the last column. + if (!is_necessarily_closed()) { + // Try to preserve sortedness of `gen_sys'. + if (!gen_sys.is_sorted()) + gen_sys.swap_columns(space_dim + 1, space_dim + 1 + m); + else { + dimension_type old_eps_index = space_dim + 1; + dimension_type new_eps_index = old_eps_index + m; + for (dimension_type i = gen_sys.num_rows(); i-- > m; ) { + Generator& r = gen_sys[i]; + std::swap(r[old_eps_index], r[new_eps_index]); + } + // The upper-right corner of `gen_sys' contains the J matrix: + // swap coefficients to preserve sortedness. + for (dimension_type i = m; i-- > 0; ++old_eps_index) { + Generator& r = gen_sys[i]; + std::swap(r[old_eps_index], r[old_eps_index + 1]); + } + } + } + } + // Update the space dimension. + space_dim += m; + + // Note: we do not check for satisfiability, because the system of + // constraints may be unsatisfiable. + assert(OK()); +} + +void +PPL::Polyhedron::add_space_dimensions_and_project(dimension_type m) { + // The space dimension of the resulting polyhedron should not + // overflow the maximum allowed space dimension. + if (m > max_space_dimension() - space_dimension()) + throw_space_dimension_overflow(topology(), + "add_space_dimensions_and_project(m)", + "adding m new space dimensions exceeds " + "the maximum allowed space dimension"); + + // Adding no dimensions to any polyhedron is a no-op. + if (m == 0) + return; + + // Adding dimensions to an empty polyhedron is obtained + // by merely adjusting `space_dim'. + if (marked_empty()) { + space_dim += m; + con_sys.clear(); + return; + } + + if (space_dim == 0) { + assert(status.test_zero_dim_univ() && gen_sys.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; + assert(OK()); + return; + } + + // To project an n-dimension space polyhedron in a (n+m)-dimension space, + // we just add to the system of generators `m' zero-columns; + // In contrast, in the system of constraints, new rows are needed + // in order to avoid embedding the old polyhedron in the new space. + // Thus, for each new dimensions `x[k]', we add the constraint + // x[k] = 0; this is done by invoking the function add_space_dimensions() + // giving the system of constraints as the second argument. + if (constraints_are_up_to_date()) + if (generators_are_up_to_date()) { + // `sat_g' must be up to date for add_space_dimensions(). + if (!sat_g_is_up_to_date()) + update_sat_g(); + // Adds rows and/or columns to both matrices. + // `add_space_dimensions' correctly handles pending constraints + // or generators. + add_space_dimensions(gen_sys, con_sys, sat_g, sat_c, m); + } + else { + // Only constraints are up-to-date: no need to modify the generators. + con_sys.add_rows_and_columns(m); + // The polyhedron does not support pending constraints. + con_sys.unset_pending_rows(); + // If the polyhedron is not necessarily closed, + // move the epsilon coefficients to the last column. + if (!is_necessarily_closed()) { + // Try to preserve sortedness of `con_sys'. + if (!con_sys.is_sorted()) + con_sys.swap_columns(space_dim + 1, space_dim + 1 + m); + else { + dimension_type old_eps_index = space_dim + 1; + dimension_type new_eps_index = old_eps_index + m; + for (dimension_type i = con_sys.num_rows(); i-- > m; ) { + Constraint& r = con_sys[i]; + std::swap(r[old_eps_index], r[new_eps_index]); + } + // The upper-right corner of `con_sys' contains the J matrix: + // swap coefficients to preserve sortedness. + for (dimension_type i = m; i-- > 0; ++old_eps_index) { + Constraint& r = con_sys[i]; + std::swap(r[old_eps_index], r[old_eps_index + 1]); + } + } + } + } + else { + // Only generators are up-to-date: no need to modify the constraints. + assert(generators_are_up_to_date()); + gen_sys.add_zero_columns(m); + // If the polyhedron is not necessarily closed, + // move the epsilon coefficients to the last column. + if (!is_necessarily_closed()) + gen_sys.swap_columns(space_dim + 1, space_dim + 1 + m); + } + // Now we update the space dimension. + space_dim += m; + + // Note: we do not check for satisfiability, because the system of + // constraints may be unsatisfiable. + assert(OK()); +} + +void +PPL::Polyhedron::concatenate_assign(const Polyhedron& y) { + if (topology() != y.topology()) + throw_topology_incompatible("concatenate_assign(y)", "y", y); + + // The space dimension of the resulting polyhedron should not + // overflow the maximum allowed space dimension. + const dimension_type added_columns = y.space_dim; + if (added_columns > max_space_dimension() - space_dim) + throw_space_dimension_overflow(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. + dimension_type old_num_rows = con_sys.num_rows(); + dimension_type old_num_columns = con_sys.num_columns(); + dimension_type added_rows = cs.num_rows(); + + // We already dealt with the cases of an empty or zero-dim `y' polyhedron; + // also, `cs' contains the low-level constraints, at least. + assert(added_rows > 0 && added_columns > 0); + + con_sys.add_zero_rows_and_columns(added_rows, added_columns, + Linear_Row::Flags(topology(), + Linear_Row::RAY_OR_POINT_OR_INEQUALITY)); + // Move the epsilon coefficient to the last column, if needed. + if (!is_necessarily_closed()) + con_sys.swap_columns(old_num_columns - 1, + old_num_columns - 1 + added_columns); + dimension_type cs_num_columns = cs.num_columns(); + // Steal the constraints from `cs' and put them in `con_sys' + // using the right displacement for coefficients. + for (dimension_type i = added_rows; i-- > 0; ) { + Constraint& c_old = cs[i]; + Constraint& c_new = con_sys[old_num_rows + i]; + // Method `add_zero_rows_and_columns', by default, added inequalities. + if (c_old.is_equality()) + c_new.set_is_equality(); + // The inhomogeneous term is not displaced. + std::swap(c_new[0], c_old[0]); + // All homogeneous terms (included the epsilon coefficient, + // if present) are displaced by `space_dim' columns. + for (dimension_type j = 1; j < cs_num_columns; ++j) + std::swap(c_old[j], c_new[space_dim + j]); + } + + if (can_have_something_pending()) { + // If `*this' can support pending constraints, then, since we have + // resized the system of constraints, we must also add to the generator + // system those lines corresponding to the newly added dimensions, + // because the non-pending parts of `con_sys' and `gen_sys' must still + // be a DD pair in minimal form. + gen_sys.add_rows_and_columns(added_columns); + gen_sys.set_sorted(false); + if (!is_necessarily_closed()) + gen_sys.swap_columns(old_num_columns - 1, + old_num_columns - 1 + added_columns); + // The added lines are not pending. + gen_sys.unset_pending_rows(); + // Since we added new lines at the beginning of `x.gen_sys', + // we also have to adjust the saturation matrix `sat_c'. + // FIXME: if `sat_c' is not up-to-date, couldn't we directly update + // `sat_g' by resizing it and shifting its columns? + if (!sat_c_is_up_to_date()) { + sat_c.transpose_assign(sat_g); + set_sat_c_up_to_date(); + } + clear_sat_g_up_to_date(); + sat_c.resize(sat_c.num_rows() + added_columns, sat_c.num_columns()); + // The old saturation rows are copied at the end of the matrix. + // The newly introduced lines saturate all the non-pending constraints, + // thus their saturation rows are made of zeroes. + for (dimension_type i = sat_c.num_rows() - added_columns; i-- > 0; ) + std::swap(sat_c[i], sat_c[i+added_columns]); + // Since `added_rows > 0', we now have pending constraints. + set_constraints_pending(); + } + else { + // The polyhedron cannot have pending constraints. + con_sys.unset_pending_rows(); +#if BE_LAZY + con_sys.set_sorted(false); +#else + con_sys.sort_rows(); +#endif + clear_constraints_minimized(); + clear_generators_up_to_date(); + clear_sat_g_up_to_date(); + clear_sat_c_up_to_date(); + } + // Update space dimension. + space_dim += added_columns; + + // The system of constraints may be unsatisfiable, + // thus we do not check for satisfiability. + assert(OK()); +} + +void +PPL::Polyhedron::remove_space_dimensions(const Variables_Set& to_be_removed) { + // The removal of no dimensions from any polyhedron is a no-op. + // Note that this case also captures the only legal removal of + // dimensions from a polyhedron in a 0-dim space. + if (to_be_removed.empty()) { + assert(OK()); + return; + } + + // Dimension-compatibility check. + const dimension_type min_space_dim = to_be_removed.space_dimension(); + if (space_dim < min_space_dim) + throw_dimension_incompatible("remove_space_dimensions(vs)", min_space_dim); + + const dimension_type new_space_dim = space_dim - to_be_removed.size(); + + // We need updated generators; note that keeping pending generators + // is useless because the constraints will be dropped anyway. + if (marked_empty() + || (has_something_pending() && !remove_pending_to_obtain_generators()) + || (!generators_are_up_to_date() && !update_generators())) { + // Removing dimensions from the empty polyhedron: + // we clear `con_sys' since it could have contained the + // unsatisfiable constraint of the wrong dimension. + con_sys.clear(); + // Update the space dimension. + space_dim = new_space_dim; + assert(OK()); + return; + } + + // When removing _all_ dimensions from a non-empty polyhedron, + // we obtain the zero-dimensional universe polyhedron. + if (new_space_dim == 0) { + set_zero_dim_univ(); + return; + } + + // For each variable to be removed, we fill the corresponding column + // by shifting left those columns that will not be removed. + Variables_Set::const_iterator tbr = to_be_removed.begin(); + Variables_Set::const_iterator tbr_end = to_be_removed.end(); + dimension_type dst_col = *tbr + 1; + dimension_type src_col = dst_col + 1; + for (++tbr; tbr != tbr_end; ++tbr) { + const dimension_type tbr_col = *tbr + 1; + // All columns in between are moved to the left. + while (src_col < tbr_col) + gen_sys.Matrix::swap_columns(dst_col++, src_col++); + ++src_col; + } + // Moving the remaining columns. + const dimension_type gen_sys_num_columns = gen_sys.num_columns(); + while (src_col < gen_sys_num_columns) + gen_sys.Matrix::swap_columns(dst_col++, src_col++); + + // The number of remaining columns is `dst_col'. + // Note that resizing also calls `set_sorted(false)'. + gen_sys.remove_trailing_columns(gen_sys_num_columns - dst_col); + // We may have invalid lines and rays now. + gen_sys.remove_invalid_lines_and_rays(); + + // Constraints are not up-to-date and generators are not minimized. + clear_constraints_up_to_date(); + clear_generators_minimized(); + + // Update the space dimension. + space_dim = new_space_dim; + + assert(OK(true)); +} + +void +PPL::Polyhedron::remove_higher_space_dimensions(dimension_type new_dimension) { + // Dimension-compatibility check. + if (new_dimension > space_dim) + throw_dimension_incompatible("remove_higher_space_dimensions(nd)", + new_dimension); + + // The removal of no dimensions from any polyhedron is a no-op. + // Note that this case also captures the only legal removal of + // dimensions from a polyhedron in a 0-dim space. + if (new_dimension == space_dim) { + assert(OK()); + return; + } + + // We need updated generators; note that keeping pending generators + // is useless because constraints will be dropped anyway. + if (marked_empty() + || (has_something_pending() && !remove_pending_to_obtain_generators()) + || (!generators_are_up_to_date() && !update_generators())) { + // Removing dimensions from the empty polyhedron: + // just updates the space dimension. + space_dim = new_dimension; + con_sys.clear(); + assert(OK()); + return; + } + + if (new_dimension == 0) { + // Removing all dimensions from a non-empty polyhedron: + // just return the zero-dimensional universe polyhedron. + set_zero_dim_univ(); + return; + } + + dimension_type new_num_cols = new_dimension + 1; + if (!is_necessarily_closed()) { + // The polyhedron is not necessarily closed: move the column + // of the epsilon coefficients to its new place. + gen_sys.swap_columns(gen_sys.num_columns() - 1, new_num_cols); + // The number of remaining columns is `new_dimension + 2'. + ++new_num_cols; + } + // Note that resizing also calls `set_sorted(false)'. + gen_sys.remove_trailing_columns(space_dim - new_dimension); + // We may have invalid lines and rays now. + gen_sys.remove_invalid_lines_and_rays(); + + // Constraints are not up-to-date and generators are not minimized. + clear_constraints_up_to_date(); + clear_generators_minimized(); + + // Update the space dimension. + space_dim = new_dimension; + + assert(OK(true)); +} + +void +PPL::Polyhedron::expand_space_dimension(Variable var, dimension_type m) { + // TODO: this implementation is _really_ an executable specification. + + // `var' should be one of the dimensions of the vector space. + if (var.space_dimension() > space_dim) + throw_dimension_incompatible("expand_space_dimension(v, m)", "v", var); + + // The space dimension of the resulting polyhedron should not + // overflow the maximum allowed space dimension. + if (m > max_space_dimension() - space_dimension()) + throw_space_dimension_overflow(topology(), + "expand_dimension(v, m)", + "adding m new space dimensions exceeds " + "the maximum allowed space dimension"); + + // Nothing to do, if no dimensions must be added. + if (m == 0) + return; + + // Keep track of the dimension before adding the new ones. + dimension_type old_dim = space_dim; + + // Add the required new dimensions. + add_space_dimensions_and_embed(m); + + const dimension_type src_d = var.id(); + const Constraint_System& cs = constraints(); + Constraint_System new_constraints; + for (Constraint_System::const_iterator i = cs.begin(), + cs_end = cs.end(); i != cs_end; ++i) { + const Constraint& c = *i; + + // If `c' does not constrain `var', skip it. + if (c.coefficient(var) == 0) + continue; + + // Each relevant constraint results in `m' new constraints. + for (dimension_type dst_d = old_dim; dst_d < old_dim+m; ++dst_d) { + Linear_Expression e; + for (dimension_type j = old_dim; j-- > 0; ) + e += + c.coefficient(Variable(j)) + * (j == src_d ? Variable(dst_d) : Variable(j)); + e += c.inhomogeneous_term(); + new_constraints.insert(c.is_equality() + ? (e == 0) + : (c.is_nonstrict_inequality() + ? (e >= 0) + : (e > 0))); + } + } + add_recycled_constraints(new_constraints); + assert(OK()); +} + +void +PPL::Polyhedron::fold_space_dimensions(const Variables_Set& to_be_folded, + Variable var) { + // TODO: this implementation is _really_ an executable specification. + + // `var' should be one of the dimensions of the polyhedron. + if (var.space_dimension() > space_dim) + throw_dimension_incompatible("fold_space_dimensions(tbf, v)", "v", var); + + // The folding of no dimensions is a no-op. + if (to_be_folded.empty()) + return; + + // All variables in `to_be_folded' should be dimensions of the polyhedron. + if (to_be_folded.space_dimension() > space_dim) + throw_dimension_incompatible("fold_space_dimensions(tbf, v)", + "tbf.space_dimension()", + to_be_folded.space_dimension()); + + // Moreover, `var.id()' should not occur in `to_be_folded'. + if (to_be_folded.find(var.id()) != to_be_folded.end()) + throw_invalid_argument("fold_space_dimensions(tbf, v)", + "v should not occur in tbf"); + + // All of the affine images we are going to compute are not invertible, + // hence we will need to compute the generators of the polyehdron. + // 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 = to_be_folded.begin(), + tbf_end = to_be_folded.end(); i != tbf_end; ++i) { + Polyhedron copy = *this; + copy.affine_image(var, Linear_Expression(Variable(*i))); + poly_hull_assign(copy); + } + } + remove_space_dimensions(to_be_folded); + assert(OK()); +} diff --git a/src/Polyhedron_nonpublic.cc b/src/Polyhedron_nonpublic.cc new file mode 100644 index 0000000..da60e84 --- /dev/null +++ b/src/Polyhedron_nonpublic.cc @@ -0,0 +1,2269 @@ +/* Polyhedron class implementation + (non-inline private or protected functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Polyhedron.defs.hh" +#include "Scalar_Products.defs.hh" +#include +#include +#include +#include +#include + +#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), + gen_sys(topol), + sat_c(), + sat_g() { + // Protecting against space dimension overflow is up to the caller. + assert(num_dimensions <= max_space_dimension()); + + if (kind == EMPTY) + status.set_empty(); + else if (num_dimensions > 0) { + con_sys.add_low_level_constraints(); + con_sys.adjust_topology_and_space_dimension(topol, num_dimensions); + set_constraints_minimized(); + } + space_dim = num_dimensions; + assert(OK()); +} + +PPL::Polyhedron::Polyhedron(const Polyhedron& y, Complexity_Class) + : con_sys(y.topology()), + gen_sys(y.topology()), + status(y.status), + space_dim(y.space_dim) { + // Being a protected method, we simply assert that topologies do match. + assert(topology() == y.topology()); + if (y.constraints_are_up_to_date()) + con_sys.assign_with_pending(y.con_sys); + if (y.generators_are_up_to_date()) + gen_sys.assign_with_pending(y.gen_sys); + if (y.sat_c_is_up_to_date()) + sat_c = y.sat_c; + if (y.sat_g_is_up_to_date()) + sat_g = y.sat_g; +} + +PPL::Polyhedron::Polyhedron(const Topology topol, const Constraint_System& ccs) + : con_sys(topol), + gen_sys(topol), + sat_c(), + sat_g() { + // Protecting against space dimension overflow is up to the caller. + assert(ccs.space_dimension() <= max_space_dimension()); + + // TODO: this implementation is just an executable specification. + Constraint_System cs = ccs; + + // Try to adapt `cs' to the required topology. + const dimension_type cs_space_dim = cs.space_dimension(); + if (!cs.adjust_topology_and_space_dimension(topol, cs_space_dim)) + throw_topology_incompatible((topol == NECESSARILY_CLOSED) + ? "C_Polyhedron(cs)" + : "NNC_Polyhedron(cs)", "cs", cs); + + // Set the space dimension. + space_dim = cs_space_dim; + + if (space_dim > 0) { + // Stealing the rows from `cs'. + std::swap(con_sys, cs); + if (con_sys.num_pending_rows() > 0) { + // Even though `cs' has pending constraints, since the generators + // of the polyhedron are not up-to-date, the polyhedron cannot + // have pending constraints. By integrating the pending part + // of `con_sys' we may loose sortedness. + con_sys.unset_pending_rows(); + con_sys.set_sorted(false); + } + con_sys.add_low_level_constraints(); + set_constraints_up_to_date(); + } + else { + // Here `space_dim == 0'. + if (cs.num_columns() > 0) + // See if an inconsistent constraint has been passed. + for (dimension_type i = cs.num_rows(); i-- > 0; ) + if (cs[i].is_inconsistent()) { + // Inconsistent constraint found: the polyhedron is empty. + set_empty(); + break; + } + } + assert(OK()); +} + +PPL::Polyhedron::Polyhedron(const Topology topol, + Constraint_System& cs, + Recycle_Input) + : con_sys(topol), + gen_sys(topol), + sat_c(), + sat_g() { + // Protecting against space dimension overflow is up to the caller. + assert(cs.space_dimension() <= max_space_dimension()); + + // Try to adapt `cs' to the required topology. + const dimension_type cs_space_dim = cs.space_dimension(); + if (!cs.adjust_topology_and_space_dimension(topol, cs_space_dim)) + throw_topology_incompatible((topol == NECESSARILY_CLOSED) + ? "C_Polyhedron(cs, 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'. + std::swap(con_sys, cs); + if (con_sys.num_pending_rows() > 0) { + // Even though `cs' has pending constraints, since the generators + // of the polyhedron are not up-to-date, the polyhedron cannot + // have pending constraints. By integrating the pending part + // of `con_sys' we may loose sortedness. + con_sys.unset_pending_rows(); + con_sys.set_sorted(false); + } + con_sys.add_low_level_constraints(); + set_constraints_up_to_date(); + } + else { + // Here `space_dim == 0'. + if (cs.num_columns() > 0) + // See if an inconsistent constraint has been passed. + for (dimension_type i = cs.num_rows(); i-- > 0; ) + if (cs[i].is_inconsistent()) { + // Inconsistent constraint found: the polyhedron is empty. + set_empty(); + break; + } + } + assert(OK()); +} + +PPL::Polyhedron::Polyhedron(const Topology topol, const Generator_System& cgs) + : con_sys(topol), + gen_sys(topol), + sat_c(), + sat_g() { + // Protecting against space dimension overflow is up to the caller. + assert(cgs.space_dimension() <= max_space_dimension()); + + // TODO: this implementation is just an executable specification. + Generator_System gs = cgs; + + // An empty set of generators defines the empty polyhedron. + if (gs.has_no_rows()) { + space_dim = gs.space_dimension(); + status.set_empty(); + assert(OK()); + return; + } + + // Non-empty valid generator systems have a supporting point, at least. + if (!gs.has_points()) + throw_invalid_generators((topol == NECESSARILY_CLOSED) + ? "C_Polyhedron(gs)" + : "NNC_Polyhedron(gs)", "gs"); + + const dimension_type gs_space_dim = gs.space_dimension(); + // Try to adapt `gs' to the required topology. + if (!gs.adjust_topology_and_space_dimension(topol, gs_space_dim)) + throw_topology_incompatible((topol == NECESSARILY_CLOSED) + ? "C_Polyhedron(gs)" + : "NNC_Polyhedron(gs)", "gs", gs); + + if (gs_space_dim > 0) { + // Stealing the rows from `gs'. + std::swap(gen_sys, gs); + // In a generator system describing a NNC polyhedron, + // for each point we must also have the corresponding closure point. + if (topol == NOT_NECESSARILY_CLOSED) + gen_sys.add_corresponding_closure_points(); + if (gen_sys.num_pending_rows() > 0) { + // Even though `gs' has pending generators, since the constraints + // of the polyhedron are not up-to-date, the polyhedron cannot + // have pending generators. By integrating the pending part + // of `gen_sys' we may loose sortedness. + gen_sys.unset_pending_rows(); + gen_sys.set_sorted(false); + } + // Generators are now up-to-date. + set_generators_up_to_date(); + + // Set the space dimension. + space_dim = gs_space_dim; + assert(OK()); + return; + } + + // Here `gs.num_rows > 0' and `gs_space_dim == 0': + // we already checked for both the topology-compatibility + // and the supporting point. + space_dim = 0; + assert(OK()); +} + +PPL::Polyhedron::Polyhedron(const Topology topol, + Generator_System& gs, + Recycle_Input) + : con_sys(topol), + gen_sys(topol), + sat_c(), + sat_g() { + // Protecting against space dimension overflow is up to the caller. + assert(gs.space_dimension() <= max_space_dimension()); + + // An empty set of generators defines the empty polyhedron. + if (gs.has_no_rows()) { + space_dim = gs.space_dimension(); + status.set_empty(); + assert(OK()); + return; + } + + // Non-empty valid generator systems have a supporting point, at least. + if (!gs.has_points()) + throw_invalid_generators((topol == NECESSARILY_CLOSED) + ? "C_Polyhedron(gs, 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'. + std::swap(gen_sys, gs); + // In a generator system describing a NNC polyhedron, + // for each point we must also have the corresponding closure point. + if (topol == NOT_NECESSARILY_CLOSED) + gen_sys.add_corresponding_closure_points(); + if (gen_sys.num_pending_rows() > 0) { + // Even though `gs' has pending generators, since the constraints + // of the polyhedron are not up-to-date, the polyhedron cannot + // have pending generators. By integrating the pending part + // of `gen_sys' we may loose sortedness. + gen_sys.unset_pending_rows(); + gen_sys.set_sorted(false); + } + // Generators are now up-to-date. + set_generators_up_to_date(); + + // Set the space dimension. + space_dim = gs_space_dim; + assert(OK()); + return; + } + + // Here `gs.num_rows > 0' and `gs_space_dim == 0': + // we already checked for both the topology-compatibility + // and the supporting point. + space_dim = 0; + assert(OK()); +} + +PPL::Polyhedron& +PPL::Polyhedron::operator=(const Polyhedron& y) { + // Being a protected method, we simply assert that topologies do match. + assert(topology() == y.topology()); + space_dim = y.space_dim; + if (y.marked_empty()) + set_empty(); + else if (space_dim == 0) + set_zero_dim_univ(); + else { + status = y.status; + if (y.constraints_are_up_to_date()) + con_sys.assign_with_pending(y.con_sys); + if (y.generators_are_up_to_date()) + gen_sys.assign_with_pending(y.gen_sys); + if (y.sat_c_is_up_to_date()) + sat_c = y.sat_c; + if (y.sat_g_is_up_to_date()) + sat_g = y.sat_g; + } + return *this; +} + +PPL::Polyhedron::Three_Valued_Boolean +PPL::Polyhedron::quick_equivalence_test(const Polyhedron& y) const { + // Private method: the caller must ensure the following. + assert(topology() == y.topology()); + assert(space_dim == y.space_dim); + assert(!marked_empty() && !y.marked_empty() && space_dim > 0); + + const Polyhedron& x = *this; + + if (x.is_necessarily_closed()) { + if (!x.has_something_pending() && !y.has_something_pending()) { + bool css_normalized = false; + if (x.constraints_are_minimized() && y.constraints_are_minimized()) { + // Equivalent minimized constraint systems have: + // - the same number of constraints; ... + if (x.con_sys.num_rows() != y.con_sys.num_rows()) + return Polyhedron::TVB_FALSE; + // - the same number of equalities; ... + dimension_type x_num_equalities = x.con_sys.num_equalities(); + if (x_num_equalities != y.con_sys.num_equalities()) + return Polyhedron::TVB_FALSE; + // - if there are no equalities, they have the same constraints. + // Delay this test: try cheaper tests on generators first. + css_normalized = (x_num_equalities == 0); + } + + if (x.generators_are_minimized() && y.generators_are_minimized()) { + // Equivalent minimized generator systems have: + // - the same number of generators; ... + if (x.gen_sys.num_rows() != y.gen_sys.num_rows()) + return Polyhedron::TVB_FALSE; + // - the same number of lines; ... + const dimension_type x_num_lines = x.gen_sys.num_lines(); + if (x_num_lines != y.gen_sys.num_lines()) + return Polyhedron::TVB_FALSE; + // - if there are no lines, they have the same generators. + if (x_num_lines == 0) { + // Sort the two systems and check for syntactic identity. + x.obtain_sorted_generators(); + y.obtain_sorted_generators(); + if (x.gen_sys == y.gen_sys) + return Polyhedron::TVB_TRUE; + else + return Polyhedron::TVB_FALSE; + } + } + + if (css_normalized) { + // Sort the two systems and check for identity. + x.obtain_sorted_constraints(); + y.obtain_sorted_constraints(); + if (x.con_sys == y.con_sys) + return Polyhedron::TVB_TRUE; + else + return Polyhedron::TVB_FALSE; + } + } + } + return Polyhedron::TVB_DONT_KNOW; +} + +bool +PPL::Polyhedron::is_included_in(const Polyhedron& y) const { + // Private method: the caller must ensure the following. + assert(topology() == y.topology()); + assert(space_dim == y.space_dim); + assert(!marked_empty() && !y.marked_empty() && space_dim > 0); + + const Polyhedron& x = *this; + + // `x' cannot have pending constraints, because we need its generators. + if (x.has_pending_constraints() && !x.process_pending_constraints()) + return true; + // `y' cannot have pending generators, because we need its constraints. + if (y.has_pending_generators()) + y.process_pending_generators(); + +#if BE_LAZY + if (!x.generators_are_up_to_date() && !x.update_generators()) + return true; + if (!y.constraints_are_up_to_date()) + y.update_constraints(); +#else + if (!x.generators_are_minimized()) + x.minimize(); + if (!y.constraints_are_minimized()) + y.minimize(); +#endif + + assert(x.OK()); + assert(y.OK()); + + const Generator_System& gs = x.gen_sys; + const Constraint_System& cs = y.con_sys; + + if (x.is_necessarily_closed()) + // When working with necessarily closed polyhedra, + // `x' is contained in `y' if and only if all the generators of `x' + // satisfy all the inequalities and saturate all the equalities of `y'. + // This comes from the definition of a polyhedron as the set of + // vectors satisfying a constraint system and the fact that all + // vectors in `x' can be obtained by suitably combining its generators. + for (dimension_type i = cs.num_rows(); i-- > 0; ) { + const Constraint& c = cs[i]; + if (c.is_inequality()) { + for (dimension_type j = gs.num_rows(); j-- > 0; ) { + const Generator& g = gs[j]; + const int sp_sign = Scalar_Products::sign(c, g); + if (g.is_line()) { + if (sp_sign != 0) + return false; + } + else + // `g' is a ray or a point. + if (sp_sign < 0) + return false; + } + } + else { + // `c' is an equality. + for (dimension_type j = gs.num_rows(); j-- > 0; ) + if (Scalar_Products::sign(c, gs[j]) != 0) + return false; + } + } + else { + // Here we have an NNC polyhedron: using the reduced scalar product, + // which ignores the epsilon coefficient. + for (dimension_type i = cs.num_rows(); i-- > 0; ) { + const Constraint& c = cs[i]; + switch (c.type()) { + case Constraint::NONSTRICT_INEQUALITY: + for (dimension_type j = gs.num_rows(); j-- > 0; ) { + const Generator& g = gs[j]; + const int sp_sign = Scalar_Products::reduced_sign(c, g); + if (g.is_line()) { + if (sp_sign != 0) + return false; + } + else + // `g' is a ray or a point or a closure point. + if (sp_sign < 0) + return false; + } + break; + case Constraint::EQUALITY: + for (dimension_type j = gs.num_rows(); j-- > 0; ) + if (Scalar_Products::reduced_sign(c, gs[j]) != 0) + return false; + break; + case Constraint::STRICT_INEQUALITY: + for (dimension_type j = gs.num_rows(); j-- > 0; ) { + const Generator& g = gs[j]; + const int sp_sign = Scalar_Products::reduced_sign(c, g); + switch (g.type()) { + case Generator::POINT: + // If a point violates or saturates a strict inequality + // (when ignoring the epsilon coefficients) then it is + // not included in the polyhedron. + if (sp_sign <= 0) + return false; + break; + case Generator::LINE: + // Lines have to saturate all constraints. + if (sp_sign != 0) + return false; + break; + case Generator::RAY: + // Intentionally fall through. + case Generator::CLOSURE_POINT: + // The generator is a ray or closure point: usual test. + if (sp_sign < 0) + return false; + break; + } + } + break; + } + } + } + + // Inclusion holds. + return true; +} + +bool +PPL::Polyhedron::bounds(const Linear_Expression& expr, + const bool from_above) const { + // The dimension of `expr' should not be greater than the dimension + // of `*this'. + const dimension_type expr_space_dim = expr.space_dimension(); + if (space_dim < expr_space_dim) + throw_dimension_incompatible((from_above + ? "bounds_from_above(e)" + : "bounds_from_below(e)"), "e", expr); + + // A zero-dimensional or empty polyhedron bounds everything. + if (space_dim == 0 + || marked_empty() + || (has_pending_constraints() && !process_pending_constraints()) + || (!generators_are_up_to_date() && !update_generators())) + return true; + + // The polyhedron has updated, possibly pending generators. + for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) { + const Generator& g = gen_sys[i]; + // Only lines and rays in `*this' can cause `expr' to be unbounded. + if (g.is_line_or_ray()) { + const int sp_sign = Scalar_Products::homogeneous_sign(expr, g); + if (sp_sign != 0 + && (g.is_line() + || (from_above && sp_sign > 0) + || (!from_above && sp_sign < 0))) + // `*this' does not bound `expr'. + return false; + } + } + // No sources of unboundedness have been found for `expr' + // in the given direction. + return true; +} + +bool +PPL::Polyhedron::max_min(const Linear_Expression& expr, + const bool maximize, + Coefficient& ext_n, Coefficient& ext_d, + bool& included, + Generator& 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_TEMP0(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. + 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_TEMP0(mpq_class, candidate); + assign_r(candidate.get_num(), sp, ROUND_NOT_NEEDED); + assign_r(candidate.get_den(), gen_sys_i[0], 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_TEMP0(mpz_class, n); + assign_r(n, expr.inhomogeneous_term(), ROUND_NOT_NEEDED); + extremum += n; + + // The polyhedron is bounded in the right direction and we have + // computed the extremum: write the result into the caller's structures. + assert(!first_candidate); + // 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). + 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 { + assert(space_dim > 0 && !marked_empty()); + assert(has_pending_constraints() && !has_pending_generators()); + + Polyhedron& x = const_cast(*this); + + // Integrate the pending part of the system of constraints and minimize. + // We need `sat_c' up-to-date and `con_sys' sorted (together with `sat_c'). + if (!x.sat_c_is_up_to_date()) + x.sat_c.transpose_assign(x.sat_g); + if (!x.con_sys.is_sorted()) + x.obtain_sorted_constraints_with_sat_c(); + // We sort in place the pending constraints, erasing those constraints + // that also occur in the non-pending part of `con_sys'. + x.con_sys.sort_pending_and_remove_duplicates(); + if (x.con_sys.num_pending_rows() == 0) { + // All pending constraints were duplicates. + x.clear_pending_constraints(); + assert(OK(true)); + return true; + } + + const bool empty = add_and_minimize(true, x.con_sys, x.gen_sys, x.sat_c); + assert(x.con_sys.num_pending_rows() == 0); + + if (empty) + x.set_empty(); + else { + x.clear_pending_constraints(); + x.clear_sat_g_up_to_date(); + x.set_sat_c_up_to_date(); + } + assert(OK(!empty)); + return !empty; +} + +void +PPL::Polyhedron::process_pending_generators() const { + assert(space_dim > 0 && !marked_empty()); + assert(has_pending_generators() && !has_pending_constraints()); + + Polyhedron& x = const_cast(*this); + + // Integrate the pending part of the system of generators and minimize. + // We need `sat_g' up-to-date and `gen_sys' sorted (together with `sat_g'). + if (!x.sat_g_is_up_to_date()) + x.sat_g.transpose_assign(x.sat_c); + if (!x.gen_sys.is_sorted()) + x.obtain_sorted_generators_with_sat_g(); + // We sort in place the pending generators, erasing those generators + // that also occur in the non-pending part of `gen_sys'. + x.gen_sys.sort_pending_and_remove_duplicates(); + if (x.gen_sys.num_pending_rows() == 0) { + // All pending generators were duplicates. + x.clear_pending_generators(); + assert(OK(true)); + return; + } + + add_and_minimize(false, x.gen_sys, x.con_sys, x.sat_g); + assert(x.gen_sys.num_pending_rows() == 0); + + x.clear_pending_generators(); + x.clear_sat_c_up_to_date(); + x.set_sat_g_up_to_date(); +} + +void +PPL::Polyhedron::remove_pending_to_obtain_constraints() const { + assert(has_something_pending()); + + Polyhedron& x = const_cast(*this); + + // If the polyhedron has pending constraints, simply unset them. + if (x.has_pending_constraints()) { + // Integrate the pending constraints, which are possibly not sorted. + x.con_sys.unset_pending_rows(); + x.con_sys.set_sorted(false); + x.clear_pending_constraints(); + x.clear_constraints_minimized(); + x.clear_generators_up_to_date(); + } + else { + assert(x.has_pending_generators()); + // We must process the pending generators and obtain the + // corresponding system of constraints. + x.process_pending_generators(); + } + assert(OK(true)); +} + +bool +PPL::Polyhedron::remove_pending_to_obtain_generators() const { + assert(has_something_pending()); + + Polyhedron& x = const_cast(*this); + + // If the polyhedron has pending generators, simply unset them. + if (x.has_pending_generators()) { + // Integrate the pending generators, which are possibly not sorted. + x.gen_sys.unset_pending_rows(); + x.gen_sys.set_sorted(false); + x.clear_pending_generators(); + x.clear_generators_minimized(); + x.clear_constraints_up_to_date(); + assert(OK(true)); + return true; + } + else { + assert(x.has_pending_constraints()); + // We must integrate the pending constraints and obtain the + // corresponding system of generators. + return x.process_pending_constraints(); + } +} + +void +PPL::Polyhedron::update_constraints() const { + assert(space_dim > 0); + assert(!marked_empty()); + assert(generators_are_up_to_date()); + // We assume the polyhedron has no pending constraints or generators. + assert(!has_something_pending()); + + Polyhedron& x = const_cast(*this); + minimize(false, x.gen_sys, x.con_sys, x.sat_c); + // `sat_c' is the only saturation matrix up-to-date. + x.set_sat_c_up_to_date(); + x.clear_sat_g_up_to_date(); + // The system of constraints and the system of generators + // are minimized. + x.set_constraints_minimized(); + x.set_generators_minimized(); +} + +bool +PPL::Polyhedron::update_generators() const { + assert(space_dim > 0); + assert(!marked_empty()); + assert(constraints_are_up_to_date()); + // We assume the polyhedron has no pending constraints or generators. + assert(!has_something_pending()); + + Polyhedron& x = const_cast(*this); + // If the system of constraints is not consistent the + // polyhedron is empty. + const bool empty = minimize(true, x.con_sys, x.gen_sys, x.sat_g); + if (empty) + x.set_empty(); + else { + // `sat_g' is the only saturation matrix up-to-date. + x.set_sat_g_up_to_date(); + x.clear_sat_c_up_to_date(); + // The system of constraints and the system of generators + // are minimized. + x.set_constraints_minimized(); + x.set_generators_minimized(); + } + return !empty; +} + +void +PPL::Polyhedron::update_sat_c() const { + assert(constraints_are_minimized()); + assert(generators_are_minimized()); + assert(!sat_c_is_up_to_date()); + + // We only consider non-pending rows. + const dimension_type csr = con_sys.first_pending_row(); + const dimension_type gsr = gen_sys.first_pending_row(); + Polyhedron& x = const_cast(*this); + + // The columns of `sat_c' represent the constraints and + // its rows represent the generators: resize accordingly. + x.sat_c.resize(gsr, csr); + for (dimension_type i = gsr; i-- > 0; ) + for (dimension_type j = csr; j-- > 0; ) { + const int sp_sign = Scalar_Products::sign(con_sys[j], gen_sys[i]); + // The negativity of this scalar product would mean + // that the generator `gen_sys[i]' violates the constraint + // `con_sys[j]' and it is not possible because both generators + // and constraints are up-to-date. + assert(sp_sign >= 0); + if (sp_sign > 0) + // `gen_sys[i]' satisfies (without saturate) `con_sys[j]'. + x.sat_c[i].set(j); + else + // `gen_sys[i]' saturates `con_sys[j]'. + x.sat_c[i].clear(j); + } + x.set_sat_c_up_to_date(); +} + +void +PPL::Polyhedron::update_sat_g() const { + assert(constraints_are_minimized()); + assert(generators_are_minimized()); + assert(!sat_g_is_up_to_date()); + + // We only consider non-pending rows. + const dimension_type csr = con_sys.first_pending_row(); + const dimension_type gsr = gen_sys.first_pending_row(); + Polyhedron& x = const_cast(*this); + + // The columns of `sat_g' represent generators and its + // rows represent the constraints: resize accordingly. + x.sat_g.resize(csr, gsr); + for (dimension_type i = csr; i-- > 0; ) + for (dimension_type j = gsr; j-- > 0; ) { + const int sp_sign = Scalar_Products::sign(con_sys[i], gen_sys[j]); + // The negativity of this scalar product would mean + // that the generator `gen_sys[j]' violates the constraint + // `con_sys[i]' and it is not possible because both generators + // and constraints are up-to-date. + assert(sp_sign >= 0); + if (sp_sign > 0) + // `gen_sys[j]' satisfies (without saturate) `con_sys[i]'. + x.sat_g[i].set(j); + else + // `gen_sys[j]' saturates `con_sys[i]'. + x.sat_g[i].clear(j); + } + x.set_sat_g_up_to_date(); +} + +void +PPL::Polyhedron::obtain_sorted_constraints() const { + assert(constraints_are_up_to_date()); + // `con_sys' will be sorted up to `index_first_pending'. + Polyhedron& x = const_cast(*this); + if (!x.con_sys.is_sorted()) { + if (x.sat_g_is_up_to_date()) { + // Sorting constraints keeping `sat_g' consistent. + x.con_sys.sort_and_remove_with_sat(x.sat_g); + // `sat_c' is not up-to-date anymore. + x.clear_sat_c_up_to_date(); + } + else if (x.sat_c_is_up_to_date()) { + // Using `sat_c' to obtain `sat_g', then it is like previous case. + x.sat_g.transpose_assign(x.sat_c); + x.con_sys.sort_and_remove_with_sat(x.sat_g); + x.set_sat_g_up_to_date(); + x.clear_sat_c_up_to_date(); + } + else + // If neither `sat_g' nor `sat_c' are up-to-date, + // we just sort the constraints. + x.con_sys.sort_rows(); + } + + assert(con_sys.check_sorted()); +} + +void +PPL::Polyhedron::obtain_sorted_generators() const { + assert(generators_are_up_to_date()); + // `gen_sys' will be sorted up to `index_first_pending'. + Polyhedron& x = const_cast(*this); + if (!x.gen_sys.is_sorted()) { + if (x.sat_c_is_up_to_date()) { + // Sorting generators keeping 'sat_c' consistent. + x.gen_sys.sort_and_remove_with_sat(x.sat_c); + // `sat_g' is not up-to-date anymore. + x.clear_sat_g_up_to_date(); + } + else if (x.sat_g_is_up_to_date()) { + // Obtaining `sat_c' from `sat_g' and proceeding like previous case. + x.sat_c.transpose_assign(x.sat_g); + x.gen_sys.sort_and_remove_with_sat(x.sat_c); + x.set_sat_c_up_to_date(); + x.clear_sat_g_up_to_date(); + } + else + // If neither `sat_g' nor `sat_c' are up-to-date, we just sort + // the generators. + x.gen_sys.sort_rows(); + } + + assert(gen_sys.check_sorted()); +} + +void +PPL::Polyhedron::obtain_sorted_constraints_with_sat_c() const { + assert(constraints_are_up_to_date()); + assert(constraints_are_minimized()); + // `con_sys' will be sorted up to `index_first_pending'. + Polyhedron& x = const_cast(*this); + // At least one of the saturation matrices must be up-to-date. + if (!x.sat_c_is_up_to_date() && !x.sat_g_is_up_to_date()) + x.update_sat_c(); + + if (x.con_sys.is_sorted()) { + if (x.sat_c_is_up_to_date()) + // If constraints are already sorted and sat_c is up to + // date there is nothing to do. + return; + } + else { + if (!x.sat_g_is_up_to_date()) { + // If constraints are not sorted and sat_g is not up-to-date + // we obtain sat_g from sat_c (that has to be up-to-date)... + x.sat_g.transpose_assign(x.sat_c); + x.set_sat_g_up_to_date(); + } + // ... and sort it together with constraints. + x.con_sys.sort_and_remove_with_sat(x.sat_g); + } + // Obtaining sat_c from sat_g. + x.sat_c.transpose_assign(x.sat_g); + x.set_sat_c_up_to_date(); + // Constraints are sorted now. + x.con_sys.set_sorted(true); + + assert(con_sys.check_sorted()); +} + +void +PPL::Polyhedron::obtain_sorted_generators_with_sat_g() const { + assert(generators_are_up_to_date()); + // `gen_sys' will be sorted up to `index_first_pending'. + Polyhedron& x = const_cast(*this); + // At least one of the saturation matrices must be up-to-date. + if (!x.sat_c_is_up_to_date() && !x.sat_g_is_up_to_date()) + x.update_sat_g(); + + if (x.gen_sys.is_sorted()) { + if (x.sat_g_is_up_to_date()) + // If generators are already sorted and sat_g is up to + // date there is nothing to do. + return; + } + else { + if (!x.sat_c_is_up_to_date()) { + // If generators are not sorted and sat_c is not up-to-date + // we obtain sat_c from sat_g (that has to be up-to-date)... + x.sat_c.transpose_assign(x.sat_g); + x.set_sat_c_up_to_date(); + } + // ... and sort it together with generators. + x.gen_sys.sort_and_remove_with_sat(x.sat_c); + } + // Obtaining sat_g from sat_c. + x.sat_g.transpose_assign(sat_c); + x.set_sat_g_up_to_date(); + // Generators are sorted now. + x.gen_sys.set_sorted(true); + + assert(gen_sys.check_sorted()); +} + +bool +PPL::Polyhedron::minimize() const { + // 0-dim space or empty polyhedra are already minimized. + if (marked_empty()) + return false; + if (space_dim == 0) + return true; + + // If the polyhedron has something pending, process it. + if (has_something_pending()) { + const bool not_empty = process_pending(); + assert(OK()); + return not_empty; + } + + // Here there are no pending constraints or generators. + // Is the polyhedron already minimized? + if (constraints_are_minimized() && generators_are_minimized()) + return true; + + // If constraints or generators are up-to-date, invoking + // update_generators() or update_constraints(), respectively, + // minimizes both constraints and generators. + // If both are up-to-date it does not matter whether we use + // update_generators() or update_constraints(): + // both minimize constraints and generators. + if (constraints_are_up_to_date()) { + // We may discover here that `*this' is empty. + const bool ret = update_generators(); + assert(OK()); + return ret; + } + else { + assert(generators_are_up_to_date()); + update_constraints(); + assert(OK()); + return true; + } +} + +bool +PPL::Polyhedron::strongly_minimize_constraints() const { + assert(!is_necessarily_closed()); + + // From the user perspective, the polyhedron will not change. + Polyhedron& x = const_cast(*this); + + // We need `con_sys' (weakly) minimized and `gen_sys' up-to-date. + // `minimize()' will process any pending constraints or generators. + if (!minimize()) + return false; + + // If the polyhedron `*this' is zero-dimensional + // at this point it must be a universe polyhedron. + if (x.space_dim == 0) + return true; + + // We also need `sat_g' up-to-date. + if (!sat_g_is_up_to_date()) { + assert(sat_c_is_up_to_date()); + x.sat_g.transpose_assign(sat_c); + } + + // These 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; + default: + // Found a line with index i >= n_lines. + throw std::runtime_error("PPL internal error: " + "strongly_minimize_constraints."); + } + Bit_Row sat_lines_and_rays; + set_union(sat_all_but_points, sat_all_but_closure_points, + sat_lines_and_rays); + Bit_Row sat_lines_and_closure_points; + set_union(sat_all_but_rays, sat_all_but_points, + sat_lines_and_closure_points); + Bit_Row sat_lines; + set_union(sat_lines_and_rays, sat_lines_and_closure_points, + sat_lines); + + // These flags are maintained to later decide if we have to add the + // eps_leq_one constraint and whether or not the constraint system + // was changed. + bool changed = false; + bool found_eps_leq_one = false; + + // For all the strict inequalities in `con_sys', check for + // eps-redundancy and eventually move them to the bottom part of the + // system. + Constraint_System& cs = x.con_sys; + Bit_Matrix& sat = x.sat_g; + dimension_type cs_rows = cs.num_rows(); + const dimension_type eps_index = cs.num_columns() - 1; + for (dimension_type i = 0; i < cs_rows; ) + if (cs[i].is_strict_inequality()) { + // First, check if it is saturated by no closure points + Bit_Row sat_ci; + set_union(sat[i], sat_lines_and_closure_points, sat_ci); + if (sat_ci == sat_lines) { + // It is saturated by no closure points. + if (!found_eps_leq_one) { + // Check if it is the eps_leq_one constraint. + const Constraint& c = cs[i]; + bool all_zeroes = true; + for (dimension_type k = eps_index; k-- > 1; ) + if (c[k] != 0) { + all_zeroes = false; + break; + } + if (all_zeroes && (c[0] + c[eps_index] == 0)) { + // We found the eps_leq_one constraint. + found_eps_leq_one = true; + // Consider next constraint. + ++i; + continue; + } + } + // Here `cs[i]' is not the eps_leq_one constraint, + // so it is eps-redundant. + // Move it to the bottom of the constraint system, + // while keeping `sat_g' consistent. + --cs_rows; + std::swap(cs[i], cs[cs_rows]); + std::swap(sat[i], sat[cs_rows]); + // The constraint system is changed. + changed = true; + // Continue by considering next constraint, + // which is already in place due to the swap. + continue; + } + // Now we check if there exists another strict inequality + // constraint having a superset of its saturators, + // when disregarding points. + sat_ci.clear(); + set_union(sat[i], sat_all_but_points, sat_ci); + bool eps_redundant = false; + for (dimension_type j = 0; j < cs_rows; ++j) + if (i != j && cs[j].is_strict_inequality() + && subset_or_equal(sat[j], sat_ci)) { + // Constraint `cs[i]' is eps-redundant: + // move it to the bottom of the constraint system, + // while keeping `sat_g' consistent. + --cs_rows; + std::swap(cs[i], cs[cs_rows]); + std::swap(sat[i], sat[cs_rows]); + eps_redundant = true; + // The constraint system is changed. + changed = true; + break; + } + // Continue with next constraint, which is already in place + // due to the swap if we have found an eps-redundant constraint. + if (!eps_redundant) + ++i; + } + else + // `cs[i]' is not a strict inequality: consider next constraint. + ++i; + + if (changed) { + // If the constraint system has been changed, we have to erase + // the epsilon-redundant constraints. + assert(cs_rows < cs.num_rows()); + cs.erase_to_end(cs_rows); + // The remaining constraints are not pending. + cs.unset_pending_rows(); + // The constraint system is no longer sorted. + cs.set_sorted(false); + // The generator system is no longer up-to-date. + x.clear_generators_up_to_date(); + + // If we haven't found an upper bound for the epsilon dimension, + // then we have to check whether such an upper bound is implied + // by the remaining constraints (exploiting 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.set_necessarily_closed(); + try { + lp.add_space_dimensions_and_embed(cs.space_dimension()); + lp.add_constraints(cs); + cs.set_not_necessarily_closed(); + } + catch (...) { + cs.set_not_necessarily_closed(); + throw; + } + // The objective function is `epsilon'. + lp.set_objective_function(Variable(x.space_dim)); + lp.set_optimization_mode(MAXIMIZATION); + MIP_Problem_Status status = lp.solve(); + 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()); + } + } + + assert(OK()); + return true; +} + +bool +PPL::Polyhedron::strongly_minimize_generators() const { + assert(!is_necessarily_closed()); + + // From the user perspective, the polyhedron will not change. + Polyhedron& x = const_cast(*this); + + // We need `gen_sys' (weakly) minimized and `con_sys' up-to-date. + // `minimize()' will process any pending constraints or generators. + if (!minimize()) + return false; + + // If the polyhedron `*this' is zero-dimensional + // at this point it must be a universe polyhedron. + if (x.space_dim == 0) + return true; + + // We also need `sat_c' up-to-date. + if (!sat_c_is_up_to_date()) { + assert(sat_g_is_up_to_date()); + x.sat_c.transpose_assign(sat_g); + } + + // This 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(gen_sys); + Bit_Matrix& sat = const_cast(sat_c); + dimension_type gs_rows = gs.num_rows(); + const dimension_type n_lines = gs.num_lines(); + const dimension_type eps_index = gs.num_columns() - 1; + for (dimension_type i = n_lines; i < gs_rows; ) + if (gs[i].is_point()) { + // Compute the Bit_Row corresponding to the candidate point + // when strict inequality constraints are ignored. + Bit_Row sat_gi; + set_union(sat[i], sat_all_but_strict_ineq, sat_gi); + // Check if the candidate point is actually eps-redundant: + // namely, if there exists another point that saturates + // all the non-strict inequalities saturated by the candidate. + bool eps_redundant = false; + for (dimension_type j = n_lines; j < gs_rows; ++j) + if (i != j && gs[j].is_point() && subset_or_equal(sat[j], sat_gi)) { + // Point `gs[i]' is eps-redundant: + // move it to the bottom of the generator system, + // while keeping `sat_c' consistent. + --gs_rows; + std::swap(gs[i], gs[gs_rows]); + std::swap(sat[i], sat[gs_rows]); + eps_redundant = true; + changed = true; + break; + } + if (!eps_redundant) { + // Let all point encodings have epsilon coordinate 1. + Generator& gi = gs[i]; + if (gi[eps_index] != gi[0]) { + gi[eps_index] = gi[0]; + // Enforce normalization. + gi.normalize(); + changed = true; + } + // Consider next generator. + ++i; + } + } + else + // Consider next generator. + ++i; + + // If needed, erase the eps-redundant generators (also updating + // `index_first_pending'). + if (gs_rows < gs.num_rows()) { + gs.erase_to_end(gs_rows); + gs.unset_pending_rows(); + } + + if (changed) { + // The generator system is no longer sorted. + x.gen_sys.set_sorted(false); + // The constraint system is no longer up-to-date. + x.clear_constraints_up_to_date(); + } + + assert(OK()); + return true; +} + +void +PPL::Polyhedron::refine_no_check(const Constraint& c) { + assert(!marked_empty()); + 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'. + Linear_Expression nc_expr = Linear_Expression(c); + if (c.is_equality()) + if (adding_pending) + con_sys.insert_pending(nc_expr == 0); + else + con_sys.insert(nc_expr == 0); + else + if (adding_pending) + con_sys.insert_pending(nc_expr >= 0); + else + con_sys.insert(nc_expr >= 0); + } + + if (adding_pending) + set_constraints_pending(); + else { + // Constraints are not minimized and generators are not up-to-date. + clear_constraints_minimized(); + clear_generators_up_to_date(); + } + + // Note: the constraint system may have become unsatisfiable, thus + // we do not check for satisfiability. + assert(OK()); +} + +bool +PPL::Polyhedron::BHZ09_poly_hull_assign_if_exact(const Polyhedron& y) { + Polyhedron& x = *this; + + // Private method: the caller must ensure the following. + assert(x.topology() == y.topology()); + 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. + assert(x.is_necessarily_closed() && y.is_necessarily_closed()); + assert(x.space_dim > 0 && x.space_dim == y.space_dim); + 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; 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) { + set_union(x_gs_red_in_y, x_sat[i], row_union); + 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]); + + assert(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. + assert(!x.is_necessarily_closed() && !y.is_necessarily_closed()); + assert(x.space_dim > 0 && x.space_dim == y.space_dim); + 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; it 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_nonred_in_y; + Bit_Row x_points_nonred_in_y; + Bit_Row x_closure_points; + dimension_type num_x_gs_nonred_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_nonred_in_y.set(i); + ++num_x_gs_nonred_in_y; + if (x_gs_i.is_point()) + x_points_nonred_in_y.set(i); + } + + // If `x' is included into `y', the upper bound `y' is exact. + if (num_x_gs_nonred_in_y == 0) { + *this = y; + return true; + } + + // ... and vice versa, generators of `y' that are non-redundant in `x'. + Bit_Row y_gs_nonred_in_x; + Bit_Row y_points_nonred_in_x; + Bit_Row y_closure_points; + dimension_type num_y_gs_nonred_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_nonred_in_x.set(i); + ++num_y_gs_nonred_in_x; + if (y_gs_i.is_point()) + y_points_nonred_in_x.set(i); + } + + // If `y' is included into `x', the upper bound `x' is exact. + if (num_y_gs_nonred_in_x == 0) + return true; + + Bit_Row x_nonpoints_nonred_in_y; + set_difference(x_gs_nonred_in_y, x_points_nonred_in_y, + x_nonpoints_nonred_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_nonred_in_y_closure; + for (dimension_type i = x_points_nonred_in_y.first(); + i != ULONG_MAX; i = x_points_nonred_in_y.next(i)) { + const Generator& x_p = x_gs[i]; + 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_nonred_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_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; + set_difference(all_ones, x_sat[i], saturators); + // Check condition 1. + set_intersection(x_nonpoints_nonred_in_y, saturators, tmp_set); + if (!tmp_set.empty()) + return false; + if (x_c.is_strict_inequality()) { + // Postpone check for condition 3. + set_intersection(x_closure_points, saturators, tmp_set); + set_union(x_gs_condition_3, tmp_set, x_gs_condition_3); + } + else { + // Check condition 2. + set_intersection(x_points_nonred_in_y_closure, saturators, tmp_set); + 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_nonpoints_nonred_in_x; + set_difference(y_gs_nonred_in_x, y_points_nonred_in_x, + y_nonpoints_nonred_in_x); + + // Filter away the points of `y_gs' that would be redundant + // in the topological closure of `x'. + Bit_Row y_points_nonred_in_x_closure; + for (dimension_type i = y_points_nonred_in_x.first(); + i != ULONG_MAX; i = y_points_nonred_in_x.next(i)) { + const Generator& y_p = y_gs[i]; + 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_nonred_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_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; + set_difference(all_ones, y_sat[i], saturators); + // CHECKME: do we really need to re-check condition 1? + // Check condition 1. + set_intersection(y_nonpoints_nonred_in_x, saturators, tmp_set); + if (!tmp_set.empty()) + return false; + if (y_c.is_strict_inequality()) { + // Postpone check for condition 3. + set_intersection(y_closure_points, saturators, tmp_set); + set_union(y_gs_condition_3, tmp_set, y_gs_condition_3); + } + else { + // Check condition 2. + set_intersection(y_points_nonred_in_x_closure, saturators, tmp_set); + if (!tmp_set.empty()) + return false; + } + } + + // Now check condition 3 on `x_gs_condition_3' and `y_gs_condition_3'. + + // 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 != ULONG_MAX; j = x_gs_condition_3.next(j)) { + const Generator& x_cp = x_gs[j]; + assert(x_cp.is_closure_point()); + const int sp_sign = Scalar_Products::reduced_sign(y_c, x_cp); + 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 != ULONG_MAX; j = y_gs_condition_3.next(j)) { + const Generator& y_cp = y_gs[j]; + assert(y_cp.is_closure_point()); + const int sp_sign = Scalar_Products::reduced_sign(x_c, y_cp); + 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; + } + } + + if (x_gs_condition_3_not_in_y.empty() + && y_gs_condition_3_not_in_x.empty()) { + // The hull is exact: compute it. + for (dimension_type j = y_gs_num_rows; j-- > 0; ) + if (y_gs_nonred_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_nonred_in_x[j]) + ub.add_generator(y_gs[j]); + (void) ub.minimize(); + assert(!ub.is_empty()); + + // 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 != ULONG_MAX; j = x_gs_condition_3_not_in_y.next(j)) { + const Generator& x_cp = x_gs[j]; + assert(x_cp.is_closure_point()); + const int sp_sign = Scalar_Products::reduced_sign(ub_c, x_cp); + 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 != ULONG_MAX; j = y_gs_condition_3_not_in_x.next(j)) { + const Generator& y_cp = y_gs[j]; + assert(y_cp.is_closure_point()); + const int sp_sign = Scalar_Products::reduced_sign(ub_c, y_cp); + 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()) { + // No closure point satisfies condition 3, hence the hull is exact. + swap(ub); + return true; + } + else + // The hull is not exact. + return false; +} + +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. + assert(x.is_necessarily_closed()); + assert(x.topology() == y.topology()); + 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) wrt 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 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 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 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 satified 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 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 satified 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. + // CHECKME, FIXME: Polyhedron is a (deprecated) friend of Generator. + // Here below we systematically exploit such a friendship, so as to + // freely reinterpret a Generator as a Linear_Row and vice versa. + Linear_Row mid_row; + const Generator& mid_g = static_cast(mid_row); + + for (dimension_type i = x_gs_num_rows; i-- > 0; ) { + if (x_gs_red_in_y[i]) + continue; + const Linear_Row& x_row = static_cast(x_gs[i]); + const dimension_type row_sz = x_row.size(); + const bool x_row_is_line = x_row.is_line_or_equality(); + for (dimension_type j = y_gs_num_rows; j-- > 0; ) { + if (y_gs_red_in_x[j]) + continue; + const Linear_Row& y_row = static_cast(y_gs[j]); + const bool y_row_is_line = y_row.is_line_or_equality(); + + // Step 6: compute mid_row = x_row + y_row. + // NOTE: no need to actually compute the "mid-point", + // since any strictly positive combination would do. + mid_row = x_row; + for (dimension_type k = row_sz; k-- > 0; ) + mid_row[k] += y_row[k]; + // A zero ray is not a well formed generator. + const bool illegal_ray + = (mid_row[0] == 0 && mid_row.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). + assert(!(illegal_ray && (x_row_is_line || y_row_is_line))); + if (illegal_ray) + continue; + if (x_row_is_line) { + mid_row.normalize(); + if (y_row_is_line) + // mid_row is a line too: sign normalization is needed. + mid_row.sign_normalize(); + else + // mid_row is a ray/point. + mid_row.set_is_ray_or_point_or_inequality(); + } + + // 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_row or y_row is a line, we should use its + // negation to produce another generator to be tested too. + // NOTE: exclusive-or is meant. + if (!x_row_is_line && y_row_is_line) { + // Step 6.1: (re-)compute mid_row = x_row - y_row. + mid_row = x_row; + for (dimension_type k = row_sz; k-- > 0; ) + mid_row[k] -= y_row[k]; + mid_row.normalize(); + // 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_row_is_line && !y_row_is_line) { + // Step 6.1: (re-)compute mid_row = - x_row + y_row. + mid_row = y_row; + for (dimension_type k = row_sz; k-- > 0; ) + mid_row[k] -= x_row[k]; + mid_row.normalize(); + // 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-redudnant + // 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]); + } + assert(OK()); + return true; +} + +void +PPL::Polyhedron::throw_runtime_error(const char* method) const { + std::ostringstream s; + s << "PPL::"; + if (is_necessarily_closed()) + s << "C_"; + else + s << "NNC_"; + s << "Polyhedron::" << method << "." << std::endl; + throw std::runtime_error(s.str()); +} + +void +PPL::Polyhedron::throw_invalid_argument(const char* method, + const char* reason) const { + std::ostringstream s; + s << "PPL::"; + if (is_necessarily_closed()) + s << "C_"; + else + s << "NNC_"; + s << "Polyhedron::" << method << ":" << std::endl + << reason << "."; + throw std::invalid_argument(s.str()); +} + +void +PPL::Polyhedron::throw_topology_incompatible(const char* method, + const char* ph_name, + const Polyhedron& ph) const { + std::ostringstream s; + s << "PPL::"; + if (is_necessarily_closed()) + s << "C_"; + else + s << "NNC_"; + s << "Polyhedron::" << method << ":" << std::endl + << ph_name << " is a "; + if (ph.is_necessarily_closed()) + s << "C_"; + else + s << "NNC_"; + s << "Polyhedron." << std::endl; + throw std::invalid_argument(s.str()); +} + +void +PPL::Polyhedron::throw_topology_incompatible(const char* method, + const char* c_name, + const Constraint&) const { + assert(is_necessarily_closed()); + std::ostringstream s; + s << "PPL::C_Polyhedron::" << method << ":" << std::endl + << c_name << " is a strict inequality."; + throw std::invalid_argument(s.str()); +} + +void +PPL::Polyhedron::throw_topology_incompatible(const char* method, + const char* g_name, + const Generator&) const { + assert(is_necessarily_closed()); + std::ostringstream s; + s << "PPL::C_Polyhedron::" << method << ":" << std::endl + << g_name << " is a closure point."; + throw std::invalid_argument(s.str()); +} + +void +PPL::Polyhedron::throw_topology_incompatible(const char* method, + const char* cs_name, + const Constraint_System&) const { + assert(is_necessarily_closed()); + std::ostringstream s; + s << "PPL::C_Polyhedron::" << method << ":" << std::endl + << cs_name << " contains strict inequalities."; + throw std::invalid_argument(s.str()); +} + +void +PPL::Polyhedron::throw_topology_incompatible(const char* method, + const char* gs_name, + const Generator_System&) const { + std::ostringstream s; + s << "PPL::C_Polyhedron::" << method << ":" << std::endl + << gs_name << " contains closure points."; + throw std::invalid_argument(s.str()); +} + +void +PPL::Polyhedron::throw_dimension_incompatible(const char* method, + const char* other_name, + dimension_type other_dim) const { + std::ostringstream s; + s << "PPL::" + << (is_necessarily_closed() ? "C_" : "NNC_") + << "Polyhedron::" << method << ":\n" + << "this->space_dimension() == " << space_dimension() << ", " + << other_name << ".space_dimension() == " << other_dim << "."; + throw std::invalid_argument(s.str()); +} + +void +PPL::Polyhedron::throw_dimension_incompatible(const char* method, + const char* ph_name, + const Polyhedron& ph) const { + throw_dimension_incompatible(method, ph_name, ph.space_dimension()); +} + +void +PPL::Polyhedron::throw_dimension_incompatible(const char* method, + const char* e_name, + const Linear_Expression& e) const { + throw_dimension_incompatible(method, e_name, e.space_dimension()); +} + +void +PPL::Polyhedron::throw_dimension_incompatible(const char* method, + const char* c_name, + const Constraint& c) const { + throw_dimension_incompatible(method, c_name, c.space_dimension()); +} + +void +PPL::Polyhedron::throw_dimension_incompatible(const char* method, + const char* g_name, + const Generator& g) const { + throw_dimension_incompatible(method, g_name, g.space_dimension()); +} + +void +PPL::Polyhedron::throw_dimension_incompatible(const char* method, + const char* cg_name, + const Congruence& cg) const { + throw_dimension_incompatible(method, cg_name, cg.space_dimension()); +} + +void +PPL::Polyhedron::throw_dimension_incompatible(const char* method, + const char* cs_name, + const Constraint_System& cs) const { + throw_dimension_incompatible(method, cs_name, cs.space_dimension()); +} + +void +PPL::Polyhedron::throw_dimension_incompatible(const char* method, + const char* gs_name, + const Generator_System& gs) const { + throw_dimension_incompatible(method, gs_name, gs.space_dimension()); +} + +void +PPL::Polyhedron::throw_dimension_incompatible(const char* method, + const char* cgs_name, + const Congruence_System& cgs) const { + throw_dimension_incompatible(method, cgs_name, cgs.space_dimension()); +} + +void +PPL::Polyhedron::throw_dimension_incompatible(const char* method, + const char* var_name, + const Variable var) const { + std::ostringstream s; + s << "PPL::"; + if (is_necessarily_closed()) + s << "C_"; + else + s << "NNC_"; + s << "Polyhedron::" << method << ":" << std::endl + << "this->space_dimension() == " << space_dimension() << ", " + << var_name << ".space_dimension() == " << var.space_dimension() << "."; + throw std::invalid_argument(s.str()); +} + +void +PPL::Polyhedron:: +throw_dimension_incompatible(const char* method, + dimension_type required_space_dim) const { + std::ostringstream s; + s << "PPL::"; + if (is_necessarily_closed()) + s << "C_"; + else + s << "NNC_"; + s << "Polyhedron::" << method << ":" << std::endl + << "this->space_dimension() == " << space_dimension() + << ", required space dimension == " << required_space_dim << "."; + throw std::invalid_argument(s.str()); +} + +void +PPL::Polyhedron::throw_space_dimension_overflow(const Topology topol, + const char* method, + const char* reason) { + std::ostringstream s; + s << "PPL::"; + if (topol == NECESSARILY_CLOSED) + s << "C_"; + else + s << "NNC_"; + s << "Polyhedron::" << method << ":" << std::endl + << reason << "."; + throw std::length_error(s.str()); +} + +void +PPL::Polyhedron::throw_invalid_generator(const char* method, + const char* g_name) const { + std::ostringstream s; + s << "PPL::"; + if (is_necessarily_closed()) + s << "C_"; + else + s << "NNC_"; + s << "Polyhedron::" << method << ":" << std::endl + << "*this is an empty polyhedron and " + << g_name << " is not a point."; + throw std::invalid_argument(s.str()); +} + +void +PPL::Polyhedron::throw_invalid_generators(const char* method, + const char* gs_name) const { + std::ostringstream s; + s << "PPL::"; + if (is_necessarily_closed()) + s << "C_"; + else + s << "NNC_"; + s << "Polyhedron::" << method << ":" << std::endl + << "*this is an empty polyhedron and" << std::endl + << "the non-empty generator system " << gs_name << " contains no points."; + throw std::invalid_argument(s.str()); +} diff --git a/src/Polyhedron_public.cc b/src/Polyhedron_public.cc new file mode 100644 index 0000000..e6a87fb --- /dev/null +++ b/src/Polyhedron_public.cc @@ -0,0 +1,3917 @@ +/* Polyhedron class implementation (non-inline public functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include +#include "Polyhedron.defs.hh" +#include "Scalar_Products.defs.hh" +#include "MIP_Problem.defs.hh" +#include +#include +#include + +#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() { + assert(simplify_num_saturators_p == 0); + 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); + const_cast(con_sys).swap(unsat_cs); + } + else { + // Checking that `con_sys' contains the right thing. + assert(con_sys.space_dimension() == space_dim); + assert(con_sys.num_rows() == 1); + assert(con_sys[0].is_inconsistent()); + } + return con_sys; + } + + if (space_dim == 0) { + // Zero-dimensional universe. + assert(con_sys.num_rows() == 0 && con_sys.num_columns() == 0); + return con_sys; + } + + // If the polyhedron has pending generators, we process them to obtain + // the constraints. No processing is needed if the polyhedron has + // pending constraints. + if (has_pending_generators()) + process_pending_generators(); + else if (!constraints_are_up_to_date()) + update_constraints(); + + // TODO: reconsider whether to really sort constraints at this stage. +#if ENSURE_SORTEDNESS + // We insist in returning a sorted system of constraints, + // but sorting is useless if there are pending constraints. + if (!has_pending_constraints()) + obtain_sorted_constraints(); +#endif + return con_sys; +} + +const PPL::Constraint_System& +PPL::Polyhedron::minimized_constraints() const { + // `minimize()' or `strongly_minimize_constraints()' + // will process any pending constraints or generators. + if (is_necessarily_closed()) + minimize(); + else + strongly_minimize_constraints(); + return constraints(); +} + +const PPL::Generator_System& +PPL::Polyhedron::generators() const { + if (marked_empty()) { + assert(gen_sys.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); + const_cast(gen_sys).swap(gs); + } + return gen_sys; + } + + if (space_dim == 0) { + assert(gen_sys.num_rows() == 0 && gen_sys.num_columns() == 0); + return Generator_System::zero_dim_univ(); + } + + // If the polyhedron has pending constraints, we process them to obtain + // the generators (we may discover that the polyhedron is empty). + // No processing is needed if the polyhedron has pending generators. + if ((has_pending_constraints() && !process_pending_constraints()) + || (!generators_are_up_to_date() && !update_generators())) { + // We have just discovered that `*this' is empty. + assert(gen_sys.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); + const_cast(gen_sys).swap(gs); + } + return gen_sys; + } + + // TODO: reconsider whether to really sort generators at this stage. +#if ENSURE_SORTEDNESS + // We insist in returning a sorted system of generators, + // but sorting is useless if there are pending generators. + if (!has_pending_generators()) + obtain_sorted_generators(); +#else + // In the case of an NNC polyhedron, if the generator system is fully + // minimized (i.e., minimized and with no pending generator), then + // return a sorted system of generators: this is needed so that the + // const_iterator could correctly filter out the matched closure points. + if (!is_necessarily_closed() + && generators_are_minimized() && !has_pending_generators()) + obtain_sorted_generators(); +#endif + return gen_sys; +} + +const PPL::Generator_System& +PPL::Polyhedron::minimized_generators() const { + // `minimize()' or `strongly_minimize_generators()' + // will process any pending constraints or generators. + if (is_necessarily_closed()) + minimize(); + else + strongly_minimize_generators(); + // Note: calling generators() on a strongly minimized NNC generator + // system will also ensure sortedness, which is required to correctly + // filter away the matched closure points. + return generators(); +} + +PPL::Grid_Generator_System +PPL::Polyhedron::grid_generators() const { + Grid_Generator_System ggs(space_dim); + // Trivially true point. + ggs.insert(grid_point(0*(Variable(0)))); + // A line for each dimension. + dimension_type dim = 0; + while (dim < space_dim) + ggs.insert(grid_line(Variable(dim))); + return ggs; +} + +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 { + 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(); + + // Find the equality corresponding to the congruence (ignoring the modulus). + Linear_Expression expr; + for (dimension_type i = cg_space_dim; i-- > 0; ) { + const Variable v(i); + expr += cg.coefficient(v) * v; + } + expr += cg.inhomogeneous_term(); + Constraint c(expr == 0); + + // The polyhedron is non-empty so that there exists a point. + // For an arbitrary generator point find the scalar product with + // the equality. + PPL_DIRTY_TEMP_COEFFICIENT(point_val); + + for (Generator_System::const_iterator g = gen_sys.begin(), + gen_sys_end = gen_sys.end(); g != gen_sys_end; ++g) { + if (g->is_point()) { + Scalar_Products::assign(point_val, c, *g); + break; + } + } + + // Find the 2 hyperplanes that satisfies the congruence and are + // nearest to the point such that the point lies on or between these + // hyperplanes. + // Then use the relations between the polyhedron and the corresponding + // half-spaces to determine its relation with the congruence. + const Coefficient& modulus = cg.modulus(); + + PPL_DIRTY_TEMP_COEFFICIENT(div); + div = modulus; + + PPL_DIRTY_TEMP_COEFFICIENT(nearest); + nearest = (point_val / div) * div; + + point_val -= nearest; + expr -= nearest; + if (point_val == 0) + return relation_with(expr == 0); + + Linear_Expression next_expr; + if (point_val > 0) { + next_expr = expr - modulus; + } + else { + expr = - (expr); + next_expr = expr - modulus; + } + + Poly_Con_Relation relations = relation_with(expr >= 0); + assert(!relations.implies(Poly_Con_Relation::saturates()) + && !relations.implies(Poly_Con_Relation::is_disjoint())); + if (relations.implies(Poly_Con_Relation::strictly_intersects())) + return Poly_Con_Relation::strictly_intersects(); + + assert(relations == Poly_Con_Relation::is_included()); + Poly_Con_Relation next_relations = relation_with(next_expr <= 0); + assert(!next_relations.implies(Poly_Con_Relation::saturates()) + && !next_relations.implies(Poly_Con_Relation::is_disjoint())); + if (next_relations.implies(Poly_Con_Relation::strictly_intersects())) + return Poly_Con_Relation::strictly_intersects(); + + assert(next_relations == 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; + } + + assert(!has_pending_constraints() && generators_are_up_to_date()); + + // Try a fast-fail test. + dimension_type num_lines = 0; + dimension_type num_rays = 0; + const dimension_type first_pending = gen_sys.first_pending_row(); + for (dimension_type i = first_pending; i-- > 0; ) + switch (gen_sys[i].type()) { + case Generator::RAY: + ++num_rays; + break; + case Generator::LINE: + ++num_lines; + break; + default: + break; + } + + if (has_pending_generators()) { + // The non-pending part of `gen_sys' was minimized: + // a success-first test is possible in this case. + assert(generators_are_minimized()); + if (num_lines == space_dim) { + assert(num_rays == 0); + return true; + } + assert(num_lines < space_dim); + // Now scan the pending generators. + dimension_type num_pending_lines = 0; + dimension_type num_pending_rays = 0; + const dimension_type gs_num_rows = gen_sys.num_rows(); + for (dimension_type i = first_pending; i < gs_num_rows; ++i) + switch (gen_sys[i].type()) { + case Generator::RAY: + ++num_pending_rays; + break; + case Generator::LINE: + ++num_pending_lines; + break; + default: + break; + } + // If no pending rays and lines were found, + // then it is not the universe polyhedron. + if (num_pending_rays == 0 && num_pending_lines == 0) + return false; + // Factor away the lines already seen (to be on the safe side, + // we assume they are all linearly independent). + if (num_lines + num_pending_lines < space_dim) { + const dimension_type num_dims_missing + = space_dim - (num_lines + num_pending_lines); + // In order to span an n dimensional space (where n = num_dims_missing), + // at least n+1 rays are needed. + if (num_rays + num_pending_rays <= num_dims_missing) + return false; + } + } + else { + // There is nothing pending. + if (generators_are_minimized()) { + // The exact test is possible. + assert(num_rays == 0 || num_lines < space_dim); + return num_lines == space_dim; + } + else + // Only the fast-fail test can be computed: in order to span + // an n dimensional space (where n = space_dim - num_lines), + // at least n+1 rays are needed. + if (num_lines < space_dim && num_lines + num_rays <= space_dim) + return false; + } + + // We need the polyhedron in minimal form. + if (has_pending_generators()) + process_pending_generators(); + else if (!constraints_are_minimized()) + minimize(); + if (is_necessarily_closed()) + return (con_sys.num_rows() == 1 + && con_sys[0].is_inequality() + && con_sys[0].is_tautological()); + else { + // NNC polyhedron. + if (con_sys.num_rows() != 2 + || con_sys[0].is_equality() + || con_sys[1].is_equality()) + return false; + else { + // If the system of constraints contains two rows that + // are not equalities, we are sure that they are + // epsilon constraints: in this case we know that + // the polyhedron is universe. +#ifndef NDEBUG + obtain_sorted_constraints(); + const Constraint& eps_leq_one = con_sys[0]; + const Constraint& eps_geq_zero = con_sys[1]; + const dimension_type eps_index = con_sys.num_columns() - 1; + assert(eps_leq_one[0] > 0 && eps_leq_one[eps_index] < 0 + && eps_geq_zero[0] == 0 && eps_geq_zero[eps_index] > 0); + for (dimension_type i = 1; i < eps_index; ++i) + assert(eps_leq_one[i] == 0 && eps_geq_zero[i] == 0); +#endif + return true; + } + } +} + +bool +PPL::Polyhedron::is_bounded() const { + // A zero-dimensional or empty polyhedron is bounded. + if (space_dim == 0 + || marked_empty() + || (has_pending_constraints() && !process_pending_constraints()) + || (!generators_are_up_to_date() && !update_generators())) + return true; + + // If the system of generators contains any line or a ray, + // then the polyhedron is unbounded. + for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) + if (gen_sys[i].is_line_or_ray()) + return false; + + // The system of generators is composed only by + // points and closure points: the polyhedron is bounded. + return true; +} + +bool +PPL::Polyhedron::is_topologically_closed() const { + // Necessarily closed polyhedra are trivially closed. + if (is_necessarily_closed()) + return true; + // Any empty or zero-dimensional polyhedron is closed. + if (marked_empty() + || space_dim == 0 + || (has_something_pending() && !process_pending())) + return true; + + // At this point there are no pending constraints or generators. + assert(!has_something_pending()); + + if (generators_are_minimized()) { + // A polyhedron is closed if and only if all of its (non-redundant) + // closure points are matched by a corresponding point. + const dimension_type n_rows = gen_sys.num_rows(); + const dimension_type n_lines = gen_sys.num_lines(); + for (dimension_type i = n_rows; i-- > n_lines; ) { + const Generator& gi = gen_sys[i]; + if (gi.is_closure_point()) { + bool gi_has_no_matching_point = true; + for (dimension_type j = n_rows; j-- > n_lines; ) { + const Generator& gj = gen_sys[j]; + if (i != j + && gj.is_point() + && gi.is_matching_closure_point(gj)) { + gi_has_no_matching_point = false; + break; + } + } + if (gi_has_no_matching_point) + return false; + } + } + // All closure points are matched. + return true; + } + + // A polyhedron is closed if, after strong minimization + // of its constraint system, it has no strict inequalities. + strongly_minimize_constraints(); + return marked_empty() || !con_sys.has_strict_inequalities(); +} + +bool +PPL::Polyhedron::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? + 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_TEMP0(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 espilon dimension). + homogeneous_gcd = 0; + for (dimension_type i = space_dim; i-- > 0; ) + gcd_assign(homogeneous_gcd, + homogeneous_gcd, c.coefficient(Variable(i))); + if (homogeneous_gcd == 0) { + // NOTE: since tautological constraints are already filtered away + // by iterators, here we must have an inconsistent constraint. + assert(c.is_inconsistent()); + return false; + } + Linear_Expression le; + for (dimension_type i = space_dim; i-- > 0; ) + le += (c.coefficient(Variable(i)) / homogeneous_gcd) * Variable(i); + // Add the integer part of `inhomogeneous'. + le += (inhomogeneous / 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 = 0; + for (dimension_type i = space_dim; i-- > 0; ) + gcd_assign(homogeneous_gcd, + homogeneous_gcd, c.coefficient(Variable(i))); + if (homogeneous_gcd == 0) { + // NOTE: since tautological constraints are already filtered away + // by iterators, here we must have an inconsistent constraint. + 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 { + 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); + assert(gcd == 1); +#endif + if (c.type() == Constraint::EQUALITY) + return false; + // Extract the homogeneous part of the constraint. + Linear_Expression le = Linear_Expression(c); + 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). + 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 Linear_Row& row = gen_sys_i; + const int sign = sgn(row.coefficient(var_id)); + if (sign != 0) { + for (dimension_type j = space_dim+1; --j > 0; ) + if (j != var_id && row[j] != 0) + goto next; + 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; + } + } + next: + ; + } + + // 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 + + // The expected number of columns in the constraint and generator + // systems, if they are not empty. + const dimension_type poly_num_columns + = space_dim + (is_necessarily_closed() ? 1 : 2); + + // Check whether the topologies of `con_sys' and `gen_sys' agree. + if (con_sys.topology() != gen_sys.topology()) { +#ifndef NDEBUG + cerr << "Constraints and generators have different topologies!" + << endl; +#endif + goto bomb; + } + + // Check whether the saturation matrices are well-formed. + if (!sat_c.OK()) + goto bomb; + if (!sat_g.OK()) + goto bomb; + + // Check whether the status information is legal. + if (!status.OK()) + goto bomb; + + if (marked_empty()) { + if (check_not_empty) { + // The caller does not want the polyhedron to be empty. +#ifndef NDEBUG + cerr << "Empty polyhedron!" << endl; +#endif + goto bomb; + } + + // An empty polyhedron is allowed if the system of constraints + // either has no rows or only contains an unsatisfiable constraint + // and if it has no pending constraints or generators. + if (has_something_pending()) { +#ifndef NDEBUG + cerr << "The polyhedron is empty, " + << "but it has something pending" << endl; +#endif + goto bomb; + } + if (con_sys.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.num_columns() != poly_num_columns) { +#ifndef NDEBUG + cerr << "Incompatible size! (con_sys and space_dim)" + << endl; +#endif + goto bomb; + } + if (sat_c_is_up_to_date()) + if (con_sys.first_pending_row() != sat_c.num_columns()) { +#ifndef NDEBUG + cerr << "Incompatible size! (con_sys and sat_c)" + << endl; +#endif + goto bomb; + } + if (sat_g_is_up_to_date()) + if (con_sys.first_pending_row() != sat_g.num_rows()) { +#ifndef NDEBUG + cerr << "Incompatible size! (con_sys and sat_g)" + << endl; +#endif + goto bomb; + } + if (generators_are_up_to_date()) + if (con_sys.num_columns() != gen_sys.num_columns()) { +#ifndef NDEBUG + cerr << "Incompatible size! (con_sys and gen_sys)" + << endl; +#endif + goto bomb; + } + } + + if (generators_are_up_to_date()) { + if (gen_sys.num_columns() != poly_num_columns) { +#ifndef NDEBUG + cerr << "Incompatible size! (gen_sys and space_dim)" + << endl; +#endif + goto bomb; + } + if (sat_c_is_up_to_date()) + if (gen_sys.first_pending_row() != sat_c.num_rows()) { +#ifndef NDEBUG + cerr << "Incompatible size! (gen_sys and sat_c)" + << endl; +#endif + goto bomb; + } + if (sat_g_is_up_to_date()) + if (gen_sys.first_pending_row() != sat_g.num_columns()) { +#ifndef NDEBUG + cerr << "Incompatible size! (gen_sys and sat_g)" + << endl; +#endif + goto bomb; + } + + // Check if the system of generators is well-formed. + if (!gen_sys.OK()) + goto bomb; + + if (gen_sys.first_pending_row() == 0) { +#ifndef NDEBUG + cerr << "Up-to-date generator system with all rows pending!" + << endl; +#endif + goto bomb; + } + + // A non-empty system of generators describing a polyhedron + // is valid if and only if it contains a point. + if (!gen_sys.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.num_columns() - 1; + for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) + if (!gen_sys[i].is_line_or_ray()) + if (gen_sys[i][eps_index] > 0) + ++num_points; + else + ++num_closure_points; + if (num_points > num_closure_points) { +#ifndef NDEBUG + cerr << "# POINTS > # CLOSURE_POINTS" << endl; +#endif + goto bomb; + } + } + //================================================= +#endif + + if (generators_are_minimized()) { + // If the system of generators is minimized, the number of + // lines, rays and points of the polyhedron must be the same as + // of a temporary, minimized one. If this does not happen then + // the polyhedron is not OK. + Constraint_System new_con_sys(topology()); + Generator_System gs_without_pending = gen_sys; + gs_without_pending.erase_to_end(gen_sys.first_pending_row()); + gs_without_pending.unset_pending_rows(); + Generator_System copy_of_gen_sys = gs_without_pending; + 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()) { + // Check if the system of constraints is well-formed. + if (!con_sys.OK()) + goto bomb; + + if (con_sys.first_pending_row() == 0) { +#ifndef NDEBUG + cerr << "Up-to-date constraint system with all rows pending!" + << endl; +#endif + goto bomb; + } + + // A non-empty system of constraints describing a polyhedron + // must contain a constraint with a non-zero inhomogeneous term; + // such a constraint corresponds to (a combination of other + // constraints with): + // -* the positivity constraint, for necessarily closed polyhedra; + // -* the epsilon <= 1 constraint, for NNC polyhedra. + bool no_positivity_constraint = true; + for (dimension_type i = con_sys.num_rows(); i-- > 0; ) + if (con_sys[i].inhomogeneous_term() != 0) { + no_positivity_constraint = false; + break; + } + if (no_positivity_constraint) { +#ifndef NDEBUG + cerr << "Non-empty constraint system has no positivity constraint" + << endl; +#endif + goto bomb; + } + + if (!is_necessarily_closed()) { + // A non-empty system of constraints describing a NNC polyhedron + // must also contain a (combination of) the constraint epsilon >= 0, + // i.e., a constraint with a positive epsilon coefficient. + bool no_epsilon_geq_zero = true; + const dimension_type eps_index = con_sys.num_columns() - 1; + for (dimension_type i = con_sys.num_rows(); i-- > 0; ) + if (con_sys[i][eps_index] > 0) { + no_epsilon_geq_zero = false; + break; + } + if (no_epsilon_geq_zero) { +#ifndef NDEBUG + cerr << "Non-empty constraint system for NNC polyhedron " + << "has no epsilon >= 0 constraint" + << endl; +#endif + goto bomb; + } + } + + Constraint_System cs_without_pending = con_sys; + cs_without_pending.erase_to_end(con_sys.first_pending_row()); + cs_without_pending.unset_pending_rows(); + Constraint_System copy_of_con_sys = cs_without_pending; + bool empty = false; + if (check_not_empty || constraints_are_minimized()) { + Generator_System new_gen_sys(topology()); + 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; ) + if (Scalar_Products::sign(con_sys[j], tmp_gen) != tmp_sat[j]) { +#ifndef NDEBUG + cerr << "sat_c is declared up-to-date, but it is not!" + << endl; +#endif + goto bomb; + } + } + + if (sat_g_is_up_to_date()) + for (dimension_type i = sat_g.num_rows(); i-- > 0; ) { + const Constraint tmp_con = con_sys[i]; + const Bit_Row tmp_sat = sat_g[i]; + for (dimension_type j = sat_g.num_columns(); j-- > 0; ) + if (Scalar_Products::sign(tmp_con, gen_sys[j]) != tmp_sat[j]) { +#ifndef NDEBUG + cerr << "sat_g is declared up-to-date, but it is not!" + << endl; +#endif + goto bomb; + } + } + + if (has_pending_constraints()) { + if (con_sys.num_pending_rows() == 0) { +#ifndef NDEBUG + cerr << "The polyhedron is declared to have pending constraints, " + << "but con_sys has no pending rows!" + << endl; +#endif + goto bomb; + } + } + + if (has_pending_generators()) { + if (gen_sys.num_pending_rows() == 0) { +#ifndef NDEBUG + cerr << "The polyhedron is declared to have pending generators, " + << "but gen_sys has no pending rows!" + << endl; +#endif + goto bomb; + } + } + + return true; + + bomb: +#ifndef NDEBUG + cerr << "Here is the guilty polyhedron:" + << endl; + ascii_dump(cerr); +#endif + return false; +} + +void +PPL::Polyhedron::add_constraint(const Constraint& c) { + // Topology-compatibility check. + if (c.is_strict_inequality() && is_necessarily_closed()) { + // 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"); + } + + 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); + Constraint c(le, Constraint::EQUALITY, NECESSARILY_CLOSED); + // Enforce normalization. + c.strong_normalize(); + refine_no_check(c); +} + +bool +PPL::Polyhedron::add_constraint_and_minimize(const Constraint& c) { + Constraint_System cs(c); + return add_recycled_constraints_and_minimize(cs); +} + +void +PPL::Polyhedron::add_generator(const Generator& g) { + // Topology-compatibility check. + if (g.is_closure_point() && is_necessarily_closed()) + throw_topology_incompatible("add_generator(g)", "g", g); + // Dimension-compatibility check: + // the dimension of `g' can not be greater than space_dim. + const dimension_type g_space_dim = g.space_dimension(); + if (space_dim < g_space_dim) + throw_dimension_incompatible("add_generator(g)", "g", g); + + // Dealing with a zero-dimensional space polyhedron first. + if (space_dim == 0) { + // It is not possible to create 0-dim rays or lines. + assert(g.is_point() || g.is_closure_point()); + // Closure points can only be inserted in non-empty polyhedra. + if (marked_empty()) { + if (g.type() != Generator::POINT) + throw_invalid_generator("add_generator(g)", "g"); + else + set_zero_dim_univ(); + } + assert(OK()); + return; + } + + if (marked_empty() + || (has_pending_constraints() && !process_pending_constraints()) + || (!generators_are_up_to_date() && !update_generators())) { + // Here the polyhedron is empty: + // the specification says we can only insert a point. + if (!g.is_point()) + throw_invalid_generator("add_generator(g)", "g"); + if (g.is_necessarily_closed() || !is_necessarily_closed()) { + gen_sys.insert(g); + // Since `gen_sys' was empty, after inserting `g' we have to resize + // the system of generators to have the right dimension. + gen_sys.adjust_topology_and_space_dimension(topology(), space_dim); + if (!is_necessarily_closed()) { + // In the NNC topology, each point has to be matched by + // a corresponding closure point: + // turn the just inserted point into the corresponding + // (normalized) closure point. + Generator& cp = gen_sys[gen_sys.num_rows() - 1]; + cp[space_dim + 1] = 0; + cp.normalize(); + // Re-insert the point (which is already normalized). + gen_sys.insert(g); + } + } + else { + // Note: here we have a _legal_ topology mismatch, + // because `g' is NOT a closure point (it is a point!) + // However, by barely invoking `gen_sys.insert(g)' we would + // cause a change in the topology of `gen_sys', which is wrong. + // Thus, we insert a "topology corrected" copy of `g'. + const Linear_Expression nc_expr = Linear_Expression(g); + gen_sys.insert(Generator::point(nc_expr, g.divisor())); + // Since `gen_sys' was empty, after inserting `g' we have to resize + // the system of generators to have the right dimension. + gen_sys.adjust_topology_and_space_dimension(topology(), space_dim); + } + // No longer empty, generators up-to-date and minimized. + clear_empty(); + set_generators_minimized(); + } + else { + assert(generators_are_up_to_date()); + const bool has_pending = can_have_something_pending(); + if (g.is_necessarily_closed() || !is_necessarily_closed()) { + // Since `gen_sys' is not empty, the topology and space dimension + // of the inserted generator are automatically adjusted. + if (has_pending) + gen_sys.insert_pending(g); + else + gen_sys.insert(g); + if (!is_necessarily_closed() && g.is_point()) { + // In the NNC topology, each point has to be matched by + // a corresponding closure point: + // turn the just inserted point into the corresponding + // (normalized) closure point. + Generator& cp = gen_sys[gen_sys.num_rows() - 1]; + cp[space_dim + 1] = 0; + cp.normalize(); + // Re-insert the point (which is already normalized). + if (has_pending) + gen_sys.insert_pending(g); + else + gen_sys.insert(g); + } + } + else { + assert(!g.is_closure_point()); + // Note: here we have a _legal_ topology mismatch, because + // `g' is NOT a closure point. + // However, by barely invoking `gen_sys.insert(g)' we would + // cause a change in the topology of `gen_sys', which is wrong. + // Thus, we insert a "topology corrected" copy of `g'. + const Linear_Expression nc_expr = Linear_Expression(g); + switch (g.type()) { + case Generator::LINE: + if (has_pending) + gen_sys.insert_pending(Generator::line(nc_expr)); + else + gen_sys.insert(Generator::line(nc_expr)); + break; + case Generator::RAY: + if (has_pending) + gen_sys.insert_pending(Generator::ray(nc_expr)); + else + gen_sys.insert(Generator::ray(nc_expr)); + break; + case Generator::POINT: + if (has_pending) + gen_sys.insert_pending(Generator::point(nc_expr, g.divisor())); + else + gen_sys.insert(Generator::point(nc_expr, g.divisor())); + break; + default: + throw_runtime_error("add_generator(const Generator& g)"); + } + } + + if (has_pending) + set_generators_pending(); + else { + // After adding the new generator, + // constraints are no longer up-to-date. + clear_generators_minimized(); + clear_constraints_up_to_date(); + } + } + assert(OK()); +} + +bool +PPL::Polyhedron::add_generator_and_minimize(const Generator& g) { + // TODO: this is just an executable specification. + Generator_System gs(g); + return add_recycled_generators_and_minimize(gs); +} + +void +PPL::Polyhedron::add_recycled_constraints(Constraint_System& cs) { + // Topology compatibility check. + if (is_necessarily_closed() && cs.has_strict_inequalities()) { + // 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 _swap_ (instead of copying) the coefficients of `cs' + // (which is not a const). + const dimension_type old_num_rows = con_sys.num_rows(); + const dimension_type cs_num_rows = cs.num_rows(); + const dimension_type cs_num_columns = cs.num_columns(); + con_sys.add_zero_rows(cs_num_rows, + Linear_Row::Flags(topology(), + Linear_Row::RAY_OR_POINT_OR_INEQUALITY)); + for (dimension_type i = cs_num_rows; i-- > 0; ) { + // NOTE: we cannot directly swap the rows, since they might have + // different capacities (besides possibly having different sizes): + // thus, we steal one coefficient at a time. + Constraint& new_c = con_sys[old_num_rows + i]; + Constraint& old_c = cs[i]; + if (old_c.is_equality()) + new_c.set_is_equality(); + for (dimension_type j = cs_num_columns; j-- > 0; ) + std::swap(new_c[j], old_c[j]); + } + + if (adding_pending) + set_constraints_pending(); + else { + // The newly added ones are not pending constraints. + con_sys.unset_pending_rows(); + // They have been simply appended. + con_sys.set_sorted(false); + // Constraints are not minimized and generators are not up-to-date. + clear_constraints_minimized(); + clear_generators_up_to_date(); + } + // Note: the constraint system may have become unsatisfiable, thus + // we do not check for satisfiability. + assert(OK()); +} + +void +PPL::Polyhedron::add_constraints(const Constraint_System& cs) { + // TODO: this is just an executable specification. + Constraint_System cs_copy = cs; + add_recycled_constraints(cs_copy); +} + +bool +PPL::Polyhedron::add_recycled_constraints_and_minimize(Constraint_System& cs) { + add_recycled_constraints(cs); + return minimize(); +} + +bool +PPL::Polyhedron::add_constraints_and_minimize(const Constraint_System& cs) { + Constraint_System cs_copy = cs; + return add_recycled_constraints_and_minimize(cs_copy); +} + +void +PPL::Polyhedron::add_recycled_generators(Generator_System& gs) { + // Topology compatibility check. + if (is_necessarily_closed() && gs.has_closure_points()) + throw_topology_incompatible("add_recycled_generators(gs)", "gs", gs); + // Dimension-compatibility check: + // the dimension of `gs' can not be greater than space_dim. + const dimension_type gs_space_dim = gs.space_dimension(); + if (space_dim < gs_space_dim) + throw_dimension_incompatible("add_recycled_generators(gs)", "gs", gs); + + // Adding no generators is a no-op. + if (gs.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(); + assert(OK(true)); + return; + } + + // Adjust `gs' to the right topology and dimensions. + // NOTE: we already checked for topology compatibility. + gs.adjust_topology_and_space_dimension(topology(), space_dim); + // For NNC polyhedra, each point must be matched by + // the corresponding closure point. + if (!is_necessarily_closed()) + gs.add_corresponding_closure_points(); + + // The generators (possibly with pending rows) are required. + if ((has_pending_constraints() && !process_pending_constraints()) + || (!generators_are_up_to_date() && !minimize())) { + // We have just discovered that `*this' is empty. + // So `gs' must contain at least one point. + if (!gs.has_points()) + throw_invalid_generators("add_recycled_generators(gs)", "gs"); + // The polyhedron is no longer empty and generators are up-to-date. + std::swap(gen_sys, gs); + if (gen_sys.num_pending_rows() > 0) { + // Even though `gs' has pending generators, since the constraints + // of the polyhedron are not up-to-date, the polyhedron cannot + // have pending generators. By integrating the pending part + // of `gen_sys' we may loose sortedness. + gen_sys.unset_pending_rows(); + gen_sys.set_sorted(false); + } + set_generators_up_to_date(); + clear_empty(); + assert(OK()); + return; + } + + const bool adding_pending = can_have_something_pending(); + + // Here we do not require `gen_sys' to be sorted. + // also, we _swap_ (instead of copying) the coefficients of `gs' + // (which is not a const). + const dimension_type old_num_rows = gen_sys.num_rows(); + const dimension_type gs_num_rows = gs.num_rows(); + const dimension_type gs_num_columns = gs.num_columns(); + gen_sys.add_zero_rows(gs_num_rows, + Linear_Row::Flags(topology(), + Linear_Row::RAY_OR_POINT_OR_INEQUALITY)); + for (dimension_type i = gs_num_rows; i-- > 0; ) { + // NOTE: we cannot directly swap the rows, since they might have + // different capacities (besides possibly having different sizes): + // thus, we steal one coefficient at a time. + Generator& new_g = gen_sys[old_num_rows + i]; + Generator& old_g = gs[i]; + if (old_g.is_line()) + new_g.set_is_line(); + for (dimension_type j = gs_num_columns; j-- > 0; ) + std::swap(new_g[j], old_g[j]); + } + + if (adding_pending) + set_generators_pending(); + else { + // The newly added ones are not pending generators. + gen_sys.unset_pending_rows(); + // They have been simply appended. + gen_sys.set_sorted(false); + // Constraints are not up-to-date and generators are not minimized. + clear_constraints_up_to_date(); + clear_generators_minimized(); + } + assert(OK(true)); +} + +void +PPL::Polyhedron::add_generators(const Generator_System& gs) { + // TODO: this is just an executable specification. + Generator_System gs_copy = gs; + add_recycled_generators(gs_copy); +} + +bool +PPL::Polyhedron::add_recycled_generators_and_minimize(Generator_System& gs) { + // Topology compatibility check. + if (is_necessarily_closed() && gs.has_closure_points()) + throw_topology_incompatible("add_recycled_generators_and_minimize(gs)", + "gs", gs); + // Dimension-compatibility check: + // the dimension of `gs' can not be greater than space_dim. + const dimension_type gs_space_dim = gs.space_dimension(); + if (space_dim < gs_space_dim) + throw_dimension_incompatible("add_recycled_generators_and_minimize(gs)", + "gs", gs); + + // Adding no generators is equivalent to just requiring minimization. + if (gs.has_no_rows()) + return minimize(); + + // Adding valid generators to a zero-dimensional polyhedron + // transform it in the zero-dimensional universe polyhedron. + if (space_dim == 0) { + if (marked_empty() && !gs.has_points()) + throw_invalid_generators("add_recycled_generators_and_minimize(gs)", + "gs"); + set_zero_dim_univ(); + assert(OK(true)); + return true; + } + + // Adjust `gs' to the right topology. + // NOTE: we already checked for topology compatibility; + // also, we do NOT adjust dimensions now, so that we will + // spend less time to sort rows. + gs.adjust_topology_and_space_dimension(topology(), gs_space_dim); + + // For NNC polyhedra, each point must be matched by + // the corresponding closure point. + if (!is_necessarily_closed()) + gs.add_corresponding_closure_points(); + + // `gs' has to be fully sorted, thus it cannot have pending rows. + if (gs.num_pending_rows() > 0) { + gs.unset_pending_rows(); + gs.sort_rows(); + } + else if (!gs.is_sorted()) + gs.sort_rows(); + + // Now adjusting dimensions (topology already adjusted). + // NOTE: sortedness is preserved. + gs.adjust_topology_and_space_dimension(topology(), space_dim); + + if (minimize()) { + obtain_sorted_generators_with_sat_g(); + // This call to `add_and_minimize()' cannot return `false'. + add_and_minimize(false, gen_sys, con_sys, sat_g, gs); + clear_sat_c_up_to_date(); + } + else { + // The polyhedron was empty: check if `gs' contains a point. + if (!gs.has_points()) + throw_invalid_generators("add_recycled_generators_and_minimize(gs)", + "gs"); + // `gs' has a point: the polyhedron is no longer empty + // and generators are up-to-date. + std::swap(gen_sys, gs); + clear_empty(); + set_generators_up_to_date(); + // This call to `minimize()' cannot return `false'. + minimize(); + } + assert(OK(true)); + return true; +} + +bool +PPL::Polyhedron::add_generators_and_minimize(const Generator_System& gs) { + // TODO: this is just an executable specification. + Generator_System gs_copy = gs; + return add_recycled_generators_and_minimize(gs_copy); +} + +void +PPL::Polyhedron::add_congruences(const Congruence_System& cgs) { + // Dimension-compatibility check. + 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); + Constraint c(le, Constraint::EQUALITY, NECESSARILY_CLOSED); + // Enforce normalization. + c.strong_normalize(); + // TODO: Consider stealing the row in c when adding it to cs. + cs.insert(c); + inserted = true; + } + else { + 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); + Constraint c(le, Constraint::EQUALITY, NECESSARILY_CLOSED); + // Enforce normalization. + c.strong_normalize(); + 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'. + Linear_Expression nc_expr = Linear_Expression(c); + if (c.is_equality()) + if (adding_pending) + con_sys.insert_pending(nc_expr == 0); + else + con_sys.insert(nc_expr == 0); + else + if (adding_pending) + con_sys.insert_pending(nc_expr >= 0); + else + con_sys.insert(nc_expr >= 0); + } + } + + if (adding_pending) + set_constraints_pending(); + else { + // Constraints are not minimized and generators are not up-to-date. + clear_constraints_minimized(); + clear_generators_up_to_date(); + } + + // Note: the constraint system may have become unsatisfiable, thus + // we do not check for satisfiability. + assert(OK()); +} + +void +PPL::Polyhedron::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); + Constraint c(le, Constraint::EQUALITY, NECESSARILY_CLOSED); + // Enforce normalization. + c.strong_normalize(); + // 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.id()) + throw_dimension_incompatible("unconstrain(var)", var.id()); + + // 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; + + 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(); + } + assert(OK(true)); +} + +void +PPL::Polyhedron::unconstrain(const Variables_Set& to_be_unconstrained) { + // The cylindrification wrt no dimensions is a no-op. + // This case also captures the only legal cylindrification + // of a polyhedron in a 0-dim space. + if (to_be_unconstrained.empty()) + return; + + // Dimension-compatibility check. + const dimension_type min_space_dim = to_be_unconstrained.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; + + 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 tbu = to_be_unconstrained.begin(); + Variables_Set::const_iterator tbu_end = to_be_unconstrained.end(); + if (can_have_something_pending()) { + for ( ; tbu != tbu_end; ++tbu) + gen_sys.insert_pending(Generator::line(Variable(*tbu))); + set_generators_pending(); + } + else { + for ( ; tbu != tbu_end; ++tbu) + gen_sys.insert(Generator::line(Variable(*tbu))); + // After adding the new generators, + // constraints are no longer up-to-date. + clear_generators_minimized(); + clear_constraints_up_to_date(); + } + assert(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). + assert(!x.has_pending_generators() && x.constraints_are_up_to_date()); + assert(!y.has_pending_generators() && y.constraints_are_up_to_date()); + + // If `x' can support pending constraints, + // the constraints of `y' are added as pending constraints of `x'. + if (x.can_have_something_pending()) { + x.con_sys.add_pending_rows(y.con_sys); + x.set_constraints_pending(); + } + else { + // `x' cannot support pending constraints. + // If both constraint systems are (fully) sorted, then we can + // merge them; otherwise we simply add the second to the first. + if (x.con_sys.is_sorted() + && y.con_sys.is_sorted() && !y.has_pending_constraints()) + x.con_sys.merge_rows_assign(y.con_sys); + else + x.con_sys.add_rows(y.con_sys); + // Generators are no longer up-to-date and constraints are no + // longer minimized. + x.clear_generators_up_to_date(); + x.clear_constraints_minimized(); + } + assert(x.OK() && y.OK()); +} + +bool +PPL::Polyhedron::intersection_assign_and_minimize(const Polyhedron& y) { + Polyhedron& x = *this; + // Topology compatibility check. + if (x.topology() != y.topology()) + throw_topology_incompatible("intersection_assign_and_minimize(y)", + "y", y); + // Dimension-compatibility check. + if (x.space_dim != y.space_dim) + throw_dimension_incompatible("intersection_assign_and_minimize(y)", + "y", y); + + // If one of the two polyhedra is empty, the intersection is empty. + if (x.marked_empty()) + return false; + if (y.marked_empty()) { + x.set_empty(); + return false; + } + + // If both polyhedra are zero-dimensional, + // then at this point they are necessarily non-empty, + // so that their intersection is non-empty too. + if (x.space_dim == 0) + return true; + + // `x' must be minimized and have sorted constraints. + // `minimize()' will process any pending constraints or generators. + if (!x.minimize()) + // We have just discovered that `x' is empty. + return false; + x.obtain_sorted_constraints_with_sat_c(); + + // `y' must have updated, possibly pending constraints. + if (y.has_pending_generators()) + y.process_pending_generators(); + else if (!y.constraints_are_up_to_date()) + y.update_constraints(); + + bool empty; + if (y.con_sys.num_pending_rows() > 0) { + // Integrate `y.con_sys' as pending constraints of `x', + // sort them in place and then call `add_and_minimize()'. + x.con_sys.add_pending_rows(y.con_sys); + x.con_sys.sort_pending_and_remove_duplicates(); + if (x.con_sys.num_pending_rows() == 0) { + // All pending constraints were duplicates. + x.clear_pending_constraints(); + assert(OK(true)); + return true; + } + empty = add_and_minimize(true, x.con_sys, x.gen_sys, x.sat_c); + } + else { + y.obtain_sorted_constraints(); + empty = add_and_minimize(true, x.con_sys, x.gen_sys, x.sat_c, y.con_sys); + } + + if (empty) + x.set_empty(); + else { + // On exit of the function `intersection_assign_and_minimize()' + // the polyhedron is up-to-date and `sat_c' is meaningful. + x.set_sat_c_up_to_date(); + x.clear_sat_g_up_to_date(); + } + assert(x.OK(!empty)); + return !empty; +} + +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; + } +}; + +bool +add_to_system_and_check_independence(PPL::Linear_System& eq_sys, + const PPL::Linear_Row& eq) { + // Check if equality eqn is linear independent from eq_sys. + 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 linear independent. + return true; + else { + // eq is not linear independent. + assert(rank == eq_sys_num_rows - 1); + eq_sys.erase_to_end(rank); + return false; + } +} + +/* + Modifies the vector of pointers \p p_ineqs, 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 nonredundant equalities + (they are implicit, i.e., not explicitly listed in \p p_ineqs). +*/ +void +drop_redundant_inequalities(std::vector& p_ineqs, + const PPL::Topology topology, + const PPL::Bit_Matrix& sat, + const PPL::dimension_type rank) { + using namespace Parma_Polyhedra_Library; + const dimension_type num_rows = p_ineqs.size(); + assert(num_rows > 0); + // `rank' is the rank of the (implicit) system of equalities. + const dimension_type space_dim = p_ineqs[0]->space_dimension(); + assert(space_dim > 0 && space_dim >= rank); + const dimension_type num_coefficients + = space_dim + (topology == NECESSARILY_CLOSED ? 0 : 1); + 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. + p_ineqs[i] = 0; + else { + const dimension_type num_sat = num_cols_sat - sat[i].count_ones(); + if (num_sat < min_sat) + p_ineqs[i] = 0; + } + } + + // Re-examine remaining inequalities. + // Iteration index `i' is _intentionally_ increasing. + for (dimension_type i = 0; i < num_rows; ++i) { + if (p_ineqs[i]) { + for (dimension_type j = 0; j < num_rows; ++j) { + bool strict_subset; + if (p_ineqs[j] && i != j + && subset_or_equal(sat[j], sat[i], strict_subset)) { + if (strict_subset) { + p_ineqs[i] = 0; + break; + } + else + // Here `sat[j] == sat[i]'. + p_ineqs[j] = 0; + } + } + } + } +} + +} // namespace + +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); + 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. + 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); + Linear_Expression le(y_con_sys_i); + 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; + } + swap(ph); + assert(OK()); + return false; + } + } + // `y' is the universe: `x' cannot be enlarged. + return false; + } + + 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 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(y_cs).set_necessarily_closed(); + try { + lp.add_space_dimensions_and_embed(x.space_dim+1); + lp.add_constraints(y_cs); + const_cast(y_cs).set_not_necessarily_closed(); + } + catch (...) { + const_cast(y_cs).set_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_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]; + 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::const_iterator + j = ruled_out_vec.begin(), rov_end = ruled_out_vec.end(); + j != rov_end; + ++j) { + const Constraint& c = x_cs[j->constraint_index]; + result_cs.insert(c); + lp.add_constraint(c); + 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); + x.swap(result_ph); + assert(x.OK()); + return false; + } + } + // Cannot exit from here. + assert(false); + } + else { + // Here `z' is not empty and minimized. + 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; + assert(x_cs_num_eq <= z_cs_num_eq && y_cs_num_eq <= z_cs_num_eq); + + // Identify non-redundant equalities. + Constraint_System nonred_eq; + dimension_type num_nonred_eq = 0; + const dimension_type needed_nonred_eq = z_cs_num_eq - y_cs_num_eq; + Linear_System eqs(x.topology()); + if (needed_nonred_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_nonred_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. + nonred_eq.insert(x_cs_i); + ++num_nonred_eq; + if (num_nonred_eq == needed_nonred_eq) + // Already found all the needed equalities. + break; + } + } + // NOTE: if num_nonred_eq < needed_nonred_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. + assert(eqs.num_rows() <= z_cs_num_eq); + assert(num_nonred_eq <= needed_nonred_eq); + assert(z_cs_num_eq - eqs.num_rows() + == needed_nonred_eq - num_nonred_eq); + } + + // Identify non-redundant inequalities. + // Avoid useless copies (no modifications are needed). + std::vector p_nonred_ineq; + // Fill p_nonred_ineq with (pointers to) inequalities from y_cs ... + for (dimension_type i = y_cs_num_eq; i < y_cs_num_rows; ++i) + p_nonred_ineq.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]) + p_nonred_ineq.push_back(&x_cs[i]); + + const dimension_type p_nonred_ineq_size = p_nonred_ineq.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 = p_nonred_ineq_size; + Bit_Matrix sat(sat_num_rows, z_gs_num_rows); + for (dimension_type i = sat_num_rows; i-- > 0; ) { + const Constraint& nonred_ineq_i = *(p_nonred_ineq[i]); + Bit_Row& sat_i = sat[i]; + for (dimension_type j = z_gs_num_rows; j-- > 0; ) + if (Scalar_Products::sign(nonred_ineq_i, z_gs[j])) + sat_i.set(j); + if (sat_i.empty() && num_nonred_eq < needed_nonred_eq) { + // `nonred_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. + assert(i >= y_cs_num_ineq); + // Check if the equality is independent in eqs. + Linear_Row masked_eq = Linear_Row(nonred_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 nonred_eq. + nonred_eq.insert(nonred_ineq_i); + ++num_nonred_eq; + } + } + } + // Here we have already found all the needed (masked) equalities. + assert(num_nonred_eq == needed_nonred_eq); + + drop_redundant_inequalities(p_nonred_ineq, x.topology(), + sat, z_cs_num_eq); + + // Place the nonredundant (masked) equalities into result_cs. + result_cs.swap(nonred_eq); + // Add to result_cs the nonredundant 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 < p_nonred_ineq_size; ++i) + if (p_nonred_ineq[i]) + result_cs.insert(*p_nonred_ineq[i]); + } + } + + Polyhedron result_ph(x.topology(), x.space_dim, UNIVERSE); + result_ph.add_recycled_constraints(result_cs); + x.swap(result_ph); + assert(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). + assert(!x.has_pending_constraints() && x.generators_are_up_to_date()); + assert(!y.has_pending_constraints() && y.generators_are_up_to_date()); + + // If `x' can support pending generators, + // the generators of `y' are added as pending generators of `x'. + if (x.can_have_something_pending()) { + x.gen_sys.add_pending_rows(y.gen_sys); + x.set_generators_pending(); + } + else { + // `x' cannot support pending generators. + // If both generator systems are (fully) sorted, then we can merge + // them; otherwise we simply add the second to the first. + if (x.gen_sys.is_sorted() + && y.gen_sys.is_sorted() && !y.has_pending_generators()) + x.gen_sys.merge_rows_assign(y.gen_sys); + else + x.gen_sys.add_rows(y.gen_sys); + // Constraints are no longer up-to-date + // and generators are no longer minimized. + x.clear_constraints_up_to_date(); + x.clear_generators_minimized(); + } + // At this point both `x' and `y' are not empty. + assert(x.OK(true) && y.OK(true)); +} + +bool +PPL::Polyhedron::poly_hull_assign_and_minimize(const Polyhedron& y) { + Polyhedron& x = *this; + // Topology compatibility check. + if (x.topology() != y.topology()) + throw_topology_incompatible("poly_hull_assign_and_minimize(y)", "y", y); + // Dimension-compatibility check. + if (x.space_dim != y.space_dim) + throw_dimension_incompatible("poly_hull_assign_and_minimize(y)", "y", y); + + // The poly-hull of a polyhedron `p' with an empty polyhedron is `p'. + if (y.marked_empty()) + return minimize(); + if (x.marked_empty()) { + x = y; + return minimize(); + } + + // If both polyhedra are zero-dimensional, + // then at this point they are necessarily universe polyhedra, + // so that their poly-hull is the universe polyhedron too. + if (x.space_dim == 0) + return true; + + // `x' must have minimized constraints and generators. + // `minimize()' will process any pending constraints or generators. + if (!x.minimize()) { + // We have just discovered that `x' is empty. + x = y; + return minimize(); + } + // x must have `sat_g' up-to-date and sorted generators. + x.obtain_sorted_generators_with_sat_g(); + + // `y' must have updated, possibly pending generators. + if ((y.has_pending_constraints() && !y.process_pending_constraints()) + || (!y.generators_are_up_to_date() && !y.update_generators())) + // We have just discovered that `y' is empty + // (and we know that `x' is not empty). + return true; + + if (y.gen_sys.num_pending_rows() > 0) { + // Integrate `y.gen_sys' as pending generators of `x', + // sort them in place and then call `add_and_minimize()'. + x.gen_sys.add_pending_rows(y.gen_sys); + x.gen_sys.sort_pending_and_remove_duplicates(); + if (x.gen_sys.num_pending_rows() == 0) { + // All pending generators were duplicates. + x.clear_pending_generators(); + assert(OK(true) && y.OK()); + return true; + } + add_and_minimize(false, x.gen_sys, x.con_sys, x.sat_g); + } + else { + y.obtain_sorted_generators(); + add_and_minimize(false, x.gen_sys, x.con_sys, x.sat_g, y.gen_sys); + } + x.clear_sat_c_up_to_date(); + + assert(x.OK(true) && y.OK()); + return true; +} + +void +PPL::Polyhedron::poly_difference_assign(const Polyhedron& y) { + Polyhedron& x = *this; + // Topology compatibility check. + if (x.topology() != y.topology()) + throw_topology_incompatible("poly_difference_assign(y)", "y", y); + // Dimension-compatibility check. + if (x.space_dim != y.space_dim) + throw_dimension_incompatible("poly_difference_assign(y)", "y", y); + + // The difference of a polyhedron `p' and an empty polyhedron is `p'. + if (y.marked_empty()) + return; + // The difference of an empty polyhedron and of a polyhedron `p' is empty. + if (x.marked_empty()) + return; + + // If both polyhedra are zero-dimensional, + // then at this point they are necessarily universe polyhedra, + // so that their difference is empty. + if (x.space_dim == 0) { + x.set_empty(); + return; + } + + // TODO: This is just an executable specification. + // Have to find a more efficient method. + + if (y.contains(x)) { + x.set_empty(); + return; + } + + // 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; + assert(!c.is_tautological()); + assert(!c.is_inconsistent()); + // If the polyhedron `x' is included in the polyhedron defined by + // `c', then `c' can be skipped, as adding its complement to `x' + // would result in the empty polyhedron. Moreover, if we operate + // on C-polyhedra and `c' is a non-strict inequality, c _must_ be + // skipped for otherwise we would obtain a result that is less + // precise than the poly-difference. + if (x.relation_with(c).implies(Poly_Con_Relation::is_included())) + continue; + Polyhedron z = x; + const Linear_Expression e = Linear_Expression(c); + switch (c.type()) { + case Constraint::NONSTRICT_INEQUALITY: + if (is_necessarily_closed()) + z.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; + + assert(OK()); +} + +void +PPL::Polyhedron:: +affine_image(const Variable var, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator) { + // The denominator cannot be zero. + if (denominator == 0) + throw_invalid_argument("affine_image(v, e, d)", "d == 0"); + + // Dimension-compatibility checks. + // The dimension of `expr' should not be greater than the dimension + // of `*this'. + if (space_dim < expr.space_dimension()) + throw_dimension_incompatible("affine_image(v, e, d)", "e", expr); + // `var' should be one of the dimensions of the polyhedron. + const dimension_type var_space_dim = var.space_dimension(); + if (space_dim < var_space_dim) + throw_dimension_incompatible("affine_image(v, e, d)", "v", var); + + if (marked_empty()) + return; + + if (expr.coefficient(var) != 0) { + // The transformation is invertible: + // minimality and saturators are preserved, so that + // pending rows, if present, are correctly handled. + if (generators_are_up_to_date()) { + // Generator_System::affine_image() requires the third argument + // to be a positive Coefficient. + if (denominator > 0) + gen_sys.affine_image(var_space_dim, expr, denominator); + else + gen_sys.affine_image(var_space_dim, -expr, -denominator); + } + if (constraints_are_up_to_date()) { + // To build the inverse transformation, + // after copying and negating `expr', + // we exchange the roles of `expr[var_space_dim]' and `denominator'. + Linear_Expression inverse; + if (expr[var_space_dim] > 0) { + inverse = -expr; + inverse[var_space_dim] = denominator; + con_sys.affine_preimage(var_space_dim, inverse, expr[var_space_dim]); + } + else { + // The new denominator is negative: we negate everything once + // more, as Constraint_System::affine_preimage() requires the + // third argument to be positive. + inverse = expr; + inverse[var_space_dim] = denominator; + neg_assign(inverse[var_space_dim]); + con_sys.affine_preimage(var_space_dim, inverse, -expr[var_space_dim]); + } + } + } + else { + // The transformation is not invertible. + // We need an up-to-date system of generators. + if (has_something_pending()) + remove_pending_to_obtain_generators(); + else if (!generators_are_up_to_date()) + minimize(); + if (!marked_empty()) { + // Generator_System::affine_image() requires the third argument + // to be a positive Coefficient. + if (denominator > 0) + gen_sys.affine_image(var_space_dim, expr, denominator); + else + gen_sys.affine_image(var_space_dim, -expr, -denominator); + + clear_constraints_up_to_date(); + clear_generators_minimized(); + clear_sat_c_up_to_date(); + clear_sat_g_up_to_date(); + } + } + assert(OK()); +} + + +void +PPL::Polyhedron:: +affine_preimage(const Variable var, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator) { + // The denominator cannot be zero. + if (denominator == 0) + throw_invalid_argument("affine_preimage(v, e, d)", "d == 0"); + + // Dimension-compatibility checks. + // The dimension of `expr' should not be greater than the dimension + // of `*this'. + if (space_dim < expr.space_dimension()) + throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr); + // `var' should be one of the dimensions of the polyhedron. + const dimension_type var_space_dim = var.space_dimension(); + if (space_dim < var_space_dim) + throw_dimension_incompatible("affine_preimage(v, e, d)", "v", var); + + if (marked_empty()) + return; + + if (expr.coefficient(var) != 0) { + // The transformation is invertible: + // minimality and saturators are preserved. + if (constraints_are_up_to_date()) { + // Constraint_System::affine_preimage() requires the third argument + // to be a positive Coefficient. + if (denominator > 0) + con_sys.affine_preimage(var_space_dim, expr, denominator); + else + con_sys.affine_preimage(var_space_dim, -expr, -denominator); + } + if (generators_are_up_to_date()) { + // To build the inverse transformation, + // after copying and negating `expr', + // we exchange the roles of `expr[var_space_dim]' and `denominator'. + Linear_Expression inverse; + if (expr[var_space_dim] > 0) { + inverse = -expr; + inverse[var_space_dim] = denominator; + gen_sys.affine_image(var_space_dim, inverse, expr[var_space_dim]); + } + else { + // The new denominator is negative: + // we negate everything once more, as Generator_System::affine_image() + // requires the third argument to be positive. + inverse = expr; + inverse[var_space_dim] = denominator; + neg_assign(inverse[var_space_dim]); + gen_sys.affine_image(var_space_dim, inverse, -expr[var_space_dim]); + } + } + } + else { + // The transformation is not invertible. + // We need an up-to-date system of constraints. + if (has_something_pending()) + remove_pending_to_obtain_constraints(); + else if (!constraints_are_up_to_date()) + minimize(); + // Constraint_System::affine_preimage() requires the third argument + // to be a positive Coefficient. + if (denominator > 0) + con_sys.affine_preimage(var_space_dim, expr, denominator); + else + con_sys.affine_preimage(var_space_dim, -expr, -denominator); + // Generators, minimality and saturators are no longer valid. + clear_generators_up_to_date(); + clear_constraints_minimized(); + clear_sat_c_up_to_date(); + clear_sat_g_up_to_date(); + } + assert(OK()); +} + +void +PPL::Polyhedron:: +bounded_affine_image(const Variable var, + const Linear_Expression& lb_expr, + const Linear_Expression& ub_expr, + Coefficient_traits::const_reference denominator) { + // The denominator cannot be zero. + if (denominator == 0) + throw_invalid_argument("bounded_affine_image(v, lb, ub, d)", "d == 0"); + + // Dimension-compatibility checks. + // `var' should be one of the dimensions of the polyhedron. + const dimension_type var_space_dim = var.space_dimension(); + if (space_dim < var_space_dim) + throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)", + "v", var); + // The dimension of `lb_expr' and `ub_expr' should not be + // greater than the dimension of `*this'. + const dimension_type lb_space_dim = lb_expr.space_dimension(); + if (space_dim < lb_space_dim) + throw_dimension_incompatible("bounded_affine_image(v, lb, ub)", + "lb", lb_expr); + const dimension_type ub_space_dim = ub_expr.space_dimension(); + if (space_dim < ub_space_dim) + throw_dimension_incompatible("bounded_affine_image(v, lb, ub)", + "ub", ub_expr); + + // Any image of an empty polyhedron is empty. + if (marked_empty()) + return; + + // Check whether `var' occurs in `lb_expr' and/or `ub_expr'. + if (lb_expr.coefficient(var) == 0) { + // Here `var' may only occur in `ub_expr'. + generalized_affine_image(var, + LESS_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 = Variable(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); + } + assert(OK()); +} + +void +PPL::Polyhedron:: +bounded_affine_preimage(const Variable var, + const Linear_Expression& lb_expr, + const Linear_Expression& ub_expr, + Coefficient_traits::const_reference denominator) { + // The denominator cannot be zero. + if (denominator == 0) + throw_invalid_argument("bounded_affine_preimage(v, lb, ub, d)", "d == 0"); + + // Dimension-compatibility checks. + // `var' should be one of the dimensions of the polyhedron. + const dimension_type var_space_dim = var.space_dimension(); + if (space_dim < var_space_dim) + throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)", + "v", var); + // The dimension of `lb_expr' and `ub_expr' should not be + // greater than the dimension of `*this'. + const dimension_type lb_space_dim = lb_expr.space_dimension(); + if (space_dim < lb_space_dim) + throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub)", + "lb", lb_expr); + const dimension_type ub_space_dim = ub_expr.space_dimension(); + if (space_dim < ub_space_dim) + throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub)", + "ub", ub_expr); + + // Any preimage of an empty polyhedron is empty. + if (marked_empty()) + return; + + // Check whether `var' occurs in neither `lb_expr' nor `ub_expr'. + if (lb_expr.coefficient(var) == 0 && ub_expr.coefficient(var) == 0) { + if (denominator > 0) { + 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 = Variable(space_dim); + add_space_dimensions_and_embed(1); + // Swap dimensions `var' and `new_var'. + std::vector swapping_cycle; + swapping_cycle.push_back(var_space_dim); + swapping_cycle.push_back(space_dim); + swapping_cycle.push_back(0); + if (constraints_are_up_to_date()) + con_sys.permute_columns(swapping_cycle); + if (generators_are_up_to_date()) + gen_sys.permute_columns(swapping_cycle); + // Constrain the new dimension as dictated by `lb_expr' and `ub_expr'. + // (we force minimization because we will need the generators). + if (denominator > 0) { + 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); + } + assert(OK()); +} + +void +PPL::Polyhedron:: +generalized_affine_image(const Variable var, + const Relation_Symbol relsym, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator) { + // The denominator cannot be zero. + if (denominator == 0) + throw_invalid_argument("generalized_affine_image(v, r, e, d)", "d == 0"); + + // Dimension-compatibility checks. + // The dimension of `expr' should not be greater than the dimension + // of `*this'. + if (space_dim < expr.space_dimension()) + throw_dimension_incompatible("generalized_affine_image(v, r, e, d)", + "e", expr); + // `var' should be one of the dimensions of the polyhedron. + const dimension_type var_space_dim = var.space_dimension(); + if (space_dim < var_space_dim) + throw_dimension_incompatible("generalized_affine_image(v, r, e, d)", + "v", var); + + // Strict relation symbols are only admitted for NNC polyhedra. + if (is_necessarily_closed() + && (relsym == LESS_THAN || relsym == GREATER_THAN)) + throw_invalid_argument("generalized_affine_image(v, r, e, d)", + "r is a strict relation symbol"); + // 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. + 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. + const dimension_type eps_index = space_dim + 1; + for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) + if (gen_sys[i].is_point()) { + Generator& g = gen_sys[i]; + // Add a `var'-displaced copy of `g' to the generator system. + gen_sys.add_row(g); + if (relsym == GREATER_THAN) + ++gen_sys[gen_sys.num_rows()-1][var_space_dim]; + else + --gen_sys[gen_sys.num_rows()-1][var_space_dim]; + // Transform `g' into a closure point. + g[eps_index] = 0; + } + clear_constraints_up_to_date(); + clear_generators_minimized(); + gen_sys.set_sorted(false); + clear_sat_c_up_to_date(); + clear_sat_g_up_to_date(); + } + break; + default: + // The EQUAL and NOT_EQUAL cases have been already dealt with. + throw std::runtime_error("PPL internal error"); + } + assert(OK()); +} + +void +PPL::Polyhedron:: +generalized_affine_preimage(const Variable var, + const Relation_Symbol relsym, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator) { + // The denominator cannot be zero. + if (denominator == 0) + throw_invalid_argument("generalized_affine_preimage(v, r, e, d)", + "d == 0"); + + // Dimension-compatibility checks. + // The dimension of `expr' should not be greater than the dimension + // of `*this'. + if (space_dim < expr.space_dimension()) + throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)", + "e", expr); + // `var' should be one of the dimensions of the polyhedron. + const dimension_type var_space_dim = var.space_dimension(); + if (space_dim < var_space_dim) + throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)", + "v", var); + + // Strict relation symbols are only admitted for NNC polyhedra. + if (is_necessarily_closed() + && (relsym == LESS_THAN || relsym == GREATER_THAN)) + throw_invalid_argument("generalized_affine_preimage(v, r, e, d)", + "r is a strict relation symbol"); + // 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. + throw std::runtime_error("PPL internal error"); + } + + // 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 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. + throw std::runtime_error("PPL internal error"); + } + unconstrain(var); + assert(OK()); +} + +void +PPL::Polyhedron::generalized_affine_image(const Linear_Expression& lhs, + const Relation_Symbol relsym, + const Linear_Expression& rhs) { + // Dimension-compatibility checks. + // The dimension of `lhs' should not be greater than the dimension + // of `*this'. + dimension_type lhs_space_dim = lhs.space_dimension(); + if (space_dim < lhs_space_dim) + throw_dimension_incompatible("generalized_affine_image(e1, r, e2)", + "e1", lhs); + // The dimension of `rhs' should not be greater than the dimension + // of `*this'. + const dimension_type rhs_space_dim = rhs.space_dimension(); + if (space_dim < rhs_space_dim) + throw_dimension_incompatible("generalized_affine_image(e1, r, e2)", + "e2", rhs); + + // Strict relation symbols are only admitted for NNC polyhedra. + if (is_necessarily_closed() + && (relsym == LESS_THAN || relsym == GREATER_THAN)) + throw_invalid_argument("generalized_affine_image(e1, r, e2)", + "r is a strict relation symbol"); + // 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'. + for ( ; lhs_space_dim > 0; lhs_space_dim--) + if (lhs.coefficient(Variable(lhs_space_dim - 1)) != 0) + break; + // If all variables have a zero coefficient, then `lhs' is a constant: + // we can simply add the constraint `lhs relsym rhs'. + if (lhs_space_dim == 0) { + switch (relsym) { + case LESS_THAN: + 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. + throw std::runtime_error("PPL internal error"); + } + return; + } + + // Gather in `new_lines' the collections of all the lines having + // the direction of variables occurring in `lhs'. + // While at it, check whether or not there exists a variable + // occurring in both `lhs' and `rhs'. + Generator_System new_lines; + bool lhs_vars_intersects_rhs_vars = false; + for (dimension_type i = lhs_space_dim; i-- > 0; ) + if (lhs.coefficient(Variable(i)) != 0) { + new_lines.insert(line(Variable(i))); + if (rhs.coefficient(Variable(i)) != 0) + lhs_vars_intersects_rhs_vars = true; + } + + if (lhs_vars_intersects_rhs_vars) { + // Some variables in `lhs' also occur in `rhs'. + // To ease the computation, we add an additional dimension. + const Variable new_var = Variable(space_dim); + add_space_dimensions_and_embed(1); + + // Constrain the new dimension to be equal to the right hand side. + // (check for emptiness because we will add lines). + 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. + throw std::runtime_error("PPL internal error"); + } + } + // 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. + throw std::runtime_error("PPL internal error"); + } + } + assert(OK()); +} + +void +PPL::Polyhedron::generalized_affine_preimage(const Linear_Expression& lhs, + const Relation_Symbol relsym, + const Linear_Expression& rhs) { + // Dimension-compatibility checks. + // The dimension of `lhs' should not be greater than the dimension + // of `*this'. + dimension_type lhs_space_dim = lhs.space_dimension(); + if (space_dim < lhs_space_dim) + throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)", + "e1", lhs); + // The dimension of `rhs' should not be greater than the dimension + // of `*this'. + const dimension_type rhs_space_dim = rhs.space_dimension(); + if (space_dim < rhs_space_dim) + throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)", + "e2", rhs); + + // Strict relation symbols are only admitted for NNC polyhedra. + if (is_necessarily_closed() + && (relsym == LESS_THAN || relsym == GREATER_THAN)) + throw_invalid_argument("generalized_affine_preimage(e1, r, e2)", + "r is a strict relation symbol"); + // 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'. + for ( ; lhs_space_dim > 0; lhs_space_dim--) + if (lhs.coefficient(Variable(lhs_space_dim - 1)) != 0) + break; + + // If all variables have a zero coefficient, then `lhs' is a constant: + // in this case, preimage and image happen to be the same. + if (lhs_space_dim == 0) { + generalized_affine_image(lhs, relsym, rhs); + return; + } + + // Gather in `new_lines' the collections of all the lines having + // the direction of variables occurring in `lhs'. + // While at it, check whether or not there exists a variable + // occurring in both `lhs' and `rhs'. + Generator_System new_lines; + bool lhs_vars_intersects_rhs_vars = false; + for (dimension_type i = lhs_space_dim; i-- > 0; ) + if (lhs.coefficient(Variable(i)) != 0) { + new_lines.insert(line(Variable(i))); + if (rhs.coefficient(Variable(i)) != 0) + lhs_vars_intersects_rhs_vars = true; + } + + if (lhs_vars_intersects_rhs_vars) { + // Some variables in `lhs' also occur in `rhs'. + // To ease the computation, we add an additional dimension. + const Variable new_var = Variable(space_dim); + add_space_dimensions_and_embed(1); + + // Constrain the new dimension to be equal to `lhs' + // (also check for emptiness because we have to add lines). + 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. + throw std::runtime_error("PPL internal error"); + } + } + // 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. + throw std::runtime_error("PPL internal error"); + } + // 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); + } + assert(OK()); +} + +void +PPL::Polyhedron::time_elapse_assign(const Polyhedron& y) { + Polyhedron& x = *this; + // Topology compatibility check. + if (x.topology() != y.topology()) + throw_topology_incompatible("time_elapse_assign(y)", "y", y); + // Dimension-compatibility checks. + if (x.space_dim != y.space_dim) + throw_dimension_incompatible("time_elapse_assign(y)", "y", y); + + // Dealing with the zero-dimensional case. + if (x.space_dim == 0) { + if (y.marked_empty()) + x.set_empty(); + return; + } + + // If either one of `x' or `y' is empty, the result is empty too. + if (x.marked_empty() || y.marked_empty() + || (x.has_pending_constraints() && !x.process_pending_constraints()) + || (!x.generators_are_up_to_date() && !x.update_generators()) + || (y.has_pending_constraints() && !y.process_pending_constraints()) + || (!y.generators_are_up_to_date() && !y.update_generators())) { + x.set_empty(); + return; + } + + // At this point both generator systems are up-to-date, + // possibly containing pending generators. + Generator_System gs = y.gen_sys; + dimension_type gs_num_rows = gs.num_rows(); + + if (!x.is_necessarily_closed()) + // `x' and `y' are NNC polyhedra. + for (dimension_type i = gs_num_rows; i-- > 0; ) + switch (gs[i].type()) { + case Generator::POINT: + // The points of `gs' can be erased, + // since their role can be played by closure points. + --gs_num_rows; + std::swap(gs[i], gs[gs_num_rows]); + break; + case Generator::CLOSURE_POINT: + { + Generator& cp = gs[i]; + // If it is the origin, erase it. + if (cp.all_homogeneous_terms_are_zero()) { + --gs_num_rows; + std::swap(cp, gs[gs_num_rows]); + } + // Otherwise, transform the closure point into a ray. + else { + cp[0] = 0; + // Enforce normalization. + cp.normalize(); + } + } + break; + default: + // For rays and lines, nothing to be done. + break; + } + else + // `x' and `y' are C polyhedra. + for (dimension_type i = gs_num_rows; i-- > 0; ) + switch (gs[i].type()) { + case Generator::POINT: + { + Generator& p = gs[i]; + // If it is the origin, erase it. + if (p.all_homogeneous_terms_are_zero()) { + --gs_num_rows; + std::swap(p, gs[gs_num_rows]); + } + // Otherwise, transform the point into a ray. + else { + p[0] = 0; + // Enforce normalization. + p.normalize(); + } + } + break; + default: + // For rays and lines, nothing to be done. + break; + } + // If it was present, erase the origin point or closure point, + // which cannot be transformed into a valid ray or line. + // For NNC polyhedra, also erase all the points of `gs', + // whose role can be played by the closure points. + // These have been previously moved to the end of `gs'. + gs.erase_to_end(gs_num_rows); + gs.unset_pending_rows(); + + // `gs' may now have no rows. + // Namely, this happens when `y' was the singleton polyhedron + // having the origin as the one and only point. + // In such a case, the resulting polyhedron is equal to `x'. + if (gs_num_rows == 0) + return; + + // If the polyhedron can have something pending, we add `gs' + // to `gen_sys' as pending rows + if (x.can_have_something_pending()) { + x.gen_sys.add_pending_rows(gs); + x.set_generators_pending(); + } + // Otherwise, the two systems are merged. + // `Linear_System::merge_rows_assign()' requires both systems to be sorted. + else { + if (!x.gen_sys.is_sorted()) + x.gen_sys.sort_rows(); + gs.sort_rows(); + x.gen_sys.merge_rows_assign(gs); + // Only the system of generators is up-to-date. + x.clear_constraints_up_to_date(); + x.clear_generators_minimized(); + } + assert(x.OK(true) && y.OK(true)); +} + +void +PPL::Polyhedron::topological_closure_assign() { + // Necessarily closed polyhedra are trivially closed. + if (is_necessarily_closed()) + return; + // Any empty or zero-dimensional polyhedron is closed. + if (marked_empty() || space_dim == 0) + return; + + // The computation can be done using constraints or generators. + // If we use constraints, we will change them, so that having pending + // constraints would be useless. If we use generators, we add generators, + // so that having pending generators still makes sense. + + // Process any pending constraints. + if (has_pending_constraints() && !process_pending_constraints()) + return; + + // Use constraints only if they are available and + // there are no pending generators. + if (!has_pending_generators() && constraints_are_up_to_date()) { + const dimension_type eps_index = space_dim + 1; + bool changed = false; + // Transform all strict inequalities into non-strict ones. + for (dimension_type i = con_sys.num_rows(); i-- > 0; ) { + Constraint& c = con_sys[i]; + if (c[eps_index] < 0 && !c.is_tautological()) { + c[eps_index] = 0; + // Enforce normalization. + c.normalize(); + changed = true; + } + } + if (changed) { + con_sys.insert(Constraint::epsilon_leq_one()); + con_sys.set_sorted(false); + // After changing the system of constraints, the generators + // are no longer up-to-date and the constraints are no longer + // minimized. + clear_generators_up_to_date(); + clear_constraints_minimized(); + } + } + else { + // Here we use generators, possibly keeping constraints. + assert(generators_are_up_to_date()); + // Add the corresponding point to each closure point. + gen_sys.add_corresponding_points(); + if (can_have_something_pending()) + set_generators_pending(); + else { + // We cannot have pending generators; this also implies + // that generators may have lost their sortedness. + gen_sys.unset_pending_rows(); + gen_sys.set_sorted(false); + // Constraints are not up-to-date and generators are not minimized. + clear_constraints_up_to_date(); + clear_generators_minimized(); + } + } + assert(OK()); +} + +/*! \relates Parma_Polyhedra_Library::Polyhedron */ +bool +PPL::operator==(const Polyhedron& x, const Polyhedron& y) { + // If the two polyhedra are topology-incompatible or dimension-incompatible, + // then they cannot be the same polyhedron. + if (x.topology() != y.topology() || x.space_dim != y.space_dim) + return false; + + if (x.marked_empty()) + return y.is_empty(); + else if (y.marked_empty()) + return x.is_empty(); + else if (x.space_dim == 0) + return true; + + switch (x.quick_equivalence_test(y)) { + case Polyhedron::TVB_TRUE: + return true; + + case Polyhedron::TVB_FALSE: + return false; + + default: + if (x.is_included_in(y)) + if (x.marked_empty()) + return y.is_empty(); + else + return y.is_included_in(x); + else + return false; + } +} + +bool +PPL::Polyhedron::contains(const Polyhedron& y) const { + const Polyhedron& x = *this; + + // Topology compatibility check. + if (x.topology() != y.topology()) + throw_topology_incompatible("contains(y)", "y", y); + + // Dimension-compatibility check. + if (x.space_dim != y.space_dim) + throw_dimension_incompatible("contains(y)", "y", y); + + if (y.marked_empty()) + return true; + else if (x.marked_empty()) + return y.is_empty(); + else if (y.space_dim == 0) + return true; + else if (x.quick_equivalence_test(y) == Polyhedron::TVB_TRUE) + return true; + else + return y.is_included_in(x); +} + +bool +PPL::Polyhedron::is_disjoint_from(const Polyhedron& y) const { + Polyhedron z = *this; + z.intersection_assign(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. + assert(OK()); + return true; +} + +PPL::memory_size_type +PPL::Polyhedron::external_memory_in_bytes() const { + return + con_sys.external_memory_in_bytes() + + gen_sys.external_memory_in_bytes() + + sat_c.external_memory_in_bytes() + + sat_g.external_memory_in_bytes(); +} + +/*! \relates Parma_Polyhedra_Library::Polyhedron */ +std::ostream& +PPL::IO_Operators::operator<<(std::ostream& s, const Polyhedron& ph) { + if (ph.is_empty()) + s << "false"; + else + s << ph.minimized_constraints(); + return s; +} diff --git a/src/Polyhedron_widenings.cc b/src/Polyhedron_widenings.cc new file mode 100644 index 0000000..b53fb18 --- /dev/null +++ b/src/Polyhedron_widenings.cc @@ -0,0 +1,855 @@ +/* Polyhedron class implementation + (non-inline widening-related member functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Polyhedron.defs.hh" +#include "BHRZ03_Certificate.defs.hh" +#include "Rational_Box.hh" +#include "Scalar_Products.defs.hh" +#include +#include +#include +#include + +namespace PPL = Parma_Polyhedra_Library; + +void +PPL::Polyhedron +::select_CH78_constraints(const Polyhedron& y, + Constraint_System& cs_selection) const { + // Private method: the caller must ensure the following conditions. + assert(topology() == y.topology() + && topology() == cs_selection.topology() + && space_dim == y.space_dim); + assert(!marked_empty() + && !has_pending_constraints() + && generators_are_up_to_date()); + assert(!y.marked_empty() + && !y.has_something_pending() + && y.constraints_are_minimized()); + + // A constraint in `y.con_sys' is copied to `cs_selection' + // if it is satisfied by all the generators of `gen_sys'. + + // Note: the loop index `i' goes upward to avoid reversing + // the ordering of the chosen constraints. + for (dimension_type i = 0, end = y.con_sys.num_rows(); i < end; ++i) { + const Constraint& c = y.con_sys[i]; + if (gen_sys.satisfied_by_all_generators(c)) + cs_selection.insert(c); + } +} + +void +PPL::Polyhedron +::select_H79_constraints(const Polyhedron& y, + Constraint_System& cs_selected, + Constraint_System& cs_not_selected) const { + // Private method: the caller must ensure the following conditions + // (beside the inclusion `y <= x'). + assert(topology() == y.topology() + && topology() == cs_selected.topology() + && topology() == cs_not_selected.topology()); + assert(space_dim == y.space_dim); + assert(!marked_empty() + && !has_pending_generators() + && constraints_are_up_to_date()); + assert(!y.marked_empty() + && !y.has_something_pending() + && y.constraints_are_minimized() + && y.generators_are_up_to_date()); + + // 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; + dimension_type num_rows = y_cs.num_rows(); + for (dimension_type i = 0; i < num_rows; ++i) + if (y_cs[i].is_tautological()) { + --num_rows; + std::swap(tmp_sat_g[i], tmp_sat_g[num_rows]); + } + tmp_sat_g.rows_erase_to_end(num_rows); + tmp_sat_g.sort_rows(); + + // A constraint in `con_sys' is copied to `cs_selected' + // if its behavior with respect to `y.gen_sys' is the same + // as that of another constraint in `y.con_sys'. + // otherwise it is copied to `cs_not_selected'. + // Namely, we check whether the saturation row `buffer' + // (built starting from the given constraint and `y.gen_sys') + // is a row of the saturation matrix `tmp_sat_g'. + + // 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'. + 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); + +#ifndef NDEBUG + { + // We assume that y is contained in or equal to x. + const Polyhedron x_copy = x; + const Polyhedron y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + // If any argument is zero-dimensional or empty, + // the H79-widening behaves as the identity function. + if (x.space_dim == 0 || x.marked_empty() || y.marked_empty()) + return; + + // `y.gen_sys' should be in minimal form and + // `y.sat_g' should be up-to-date. + if (y.is_necessarily_closed()) { + if (!y.minimize()) + // `y' is empty: the result is `x'. + return; + } + else { + // Dealing with a NNC polyhedron. + // To obtain a correct reasoning when comparing + // the constraints of `x' with the generators of `y', + // we enforce the inclusion relation holding between + // the two NNC polyhedra `x' and `y' (i.e., `y <= x') + // to also hold for the corresponding eps-representations: + // this is obtained by intersecting the two eps-representations. + Polyhedron& yy = const_cast(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. + std::swap(x, CH78); + assert(x.OK(true)); + return; + } + } + + // As the dimension of `x' is strictly greater than the dimension of `y', + // we have to compute the standard widening by selecting a subset of + // the constraints of `x'. + // `x.con_sys' is just required to be up-to-date, because: + // - if `x.con_sys' is unsatisfiable, then by assumption + // also `y' is empty, so that the resulting polyhedron is `x'; + // - redundant constraints in `x.con_sys' do not affect the result + // of the widening, because if they are selected they will be + // redundant even in the result. + if (has_pending_generators()) + process_pending_generators(); + else if (!x.constraints_are_up_to_date()) + x.update_constraints(); + + // Copy into `H79_cs' the constraints of `x' that are common to `y', + // according to the definition of the H79 widening. + Constraint_System H79_cs(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. + std::swap(x, H79); + assert(x.OK(true)); + } +} + +void +PPL::Polyhedron::limited_H79_extrapolation_assign(const Polyhedron& y, + const Constraint_System& cs, + unsigned* tp) { + Polyhedron& x = *this; + + const dimension_type cs_num_rows = cs.num_rows(); + // If `cs' is empty, we fall back to ordinary, non-limited widening. + if (cs_num_rows == 0) { + x.H79_widening_assign(y, tp); + return; + } + + // Topology compatibility check. + if (x.is_necessarily_closed()) { + if (!y.is_necessarily_closed()) + throw_topology_incompatible("limited_H79_extrapolation_assign(y, cs)", + "y", y); + if (cs.has_strict_inequalities()) + throw_topology_incompatible("limited_H79_extrapolation_assign(y, cs)", + "cs", cs); + } + else if (y.is_necessarily_closed()) + throw_topology_incompatible("limited_H79_extrapolation_assign(y, cs)", + "y", y); + + // Dimension-compatibility check. + if (x.space_dim != y.space_dim) + throw_dimension_incompatible("limited_H79_extrapolation_assign(y, cs)", + "y", y); + // `cs' must be dimension-compatible with the two polyhedra. + const dimension_type cs_space_dim = cs.space_dimension(); + if (x.space_dim < cs_space_dim) + throw_dimension_incompatible("limited_H79_extrapolation_assign(y, cs)", + "cs", cs); + +#ifndef NDEBUG + { + // We assume that y is contained in or equal to x. + const Polyhedron x_copy = x; + const Polyhedron y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + if (y.marked_empty()) + return; + if (x.marked_empty()) + return; + + // The limited H79-widening between two polyhedra in a + // zero-dimensional space is a polyhedron in a zero-dimensional + // space, too. + if (x.space_dim == 0) + return; + + if (!y.minimize()) + // We have just discovered that `y' is empty. + return; + + // Update the generators of `x': these are used to select, + // from the constraints in `cs', those that must be added + // to the resulting polyhedron. + if ((x.has_pending_constraints() && !x.process_pending_constraints()) + || (!x.generators_are_up_to_date() && !x.update_generators())) + // We have just discovered that `x' is empty. + return; + + Constraint_System new_cs; + // The constraints to be added must be satisfied by all the + // generators of `x'. We can disregard `y' because `y <= x'. + const Generator_System& x_gen_sys = x.gen_sys; + // Iterate upwards here so as to keep the relative ordering of constraints. + // Not really an issue: just aesthetics. + for (dimension_type i = 0; i < cs_num_rows; ++i) { + const Constraint& c = cs[i]; + if (x_gen_sys.satisfied_by_all_generators(c)) + new_cs.insert(c); + } + x.H79_widening_assign(y, tp); + x.add_recycled_constraints(new_cs); + assert(OK()); +} + +void +PPL::Polyhedron::bounded_H79_extrapolation_assign(const Polyhedron& y, + const Constraint_System& cs, + unsigned* tp) { + Rational_Box x_box(*this, ANY_COMPLEXITY); + 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'. + assert(x.topology() == y.topology() + && x.topology() == H79.topology() + && x.topology() == x_minus_H79_cs.topology()); + assert(x.space_dim == y.space_dim + && x.space_dim == H79.space_dim + && x.space_dim == x_minus_H79_cs.space_dimension()); + assert(!x.marked_empty() && !x.has_something_pending() + && x.constraints_are_minimized() && x.generators_are_minimized()); + assert(!y.marked_empty() && !y.has_something_pending() + && y.constraints_are_minimized() && y.generators_are_minimized()); + assert(!H79.marked_empty() && !H79.has_something_pending() + && H79.constraints_are_minimized() && H79.generators_are_minimized()); + + // We will choose from `x_minus_H79_cs' many subsets of constraints, + // that will be collected (one at a time) in `combining_cs'. + // For each group collected, we compute an average constraint, + // that will be stored in `new_cs'. + + // There is no point in applying this technique when `x_minus_H79_cs' + // has one constraint at most (no ``new'' constraint can be computed). + const dimension_type x_minus_H79_cs_num_rows = x_minus_H79_cs.num_rows(); + if (x_minus_H79_cs_num_rows <= 1) + return false; + + const Topology 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]); + } + + 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. + std::swap(x, result); + assert(x.OK(true)); + return true; + } + else + // The technique was unsuccessful. + return false; +} + +bool +PPL::Polyhedron::BHRZ03_evolving_points(const Polyhedron& y, + const BHRZ03_Certificate& y_cert, + const Polyhedron& H79) { + Polyhedron& x = *this; + // It is assumed that `y <= x <= H79'. + assert(x.topology() == y.topology() + && x.topology() == H79.topology()); + assert(x.space_dim == y.space_dim + && x.space_dim == H79.space_dim); + assert(!x.marked_empty() && !x.has_something_pending() + && x.constraints_are_minimized() && x.generators_are_minimized()); + assert(!y.marked_empty() && !y.has_something_pending() + && y.constraints_are_minimized() && y.generators_are_minimized()); + assert(!H79.marked_empty() && !H79.has_something_pending() + && H79.constraints_are_minimized() && H79.generators_are_minimized()); + + // For each point in `x.gen_sys' that is not in `y', + // this technique tries to identify a set of rays that: + // - are included in polyhedron `H79'; + // - when added to `y' will subsume the point. + Generator_System candidate_rays; + + const dimension_type x_gen_sys_num_rows = x.gen_sys.num_rows(); + const dimension_type y_gen_sys_num_rows = y.gen_sys.num_rows(); + const bool closed = x.is_necessarily_closed(); + for (dimension_type i = x_gen_sys_num_rows; i-- > 0; ) { + Generator& g1 = x.gen_sys[i]; + // For C polyhedra, we choose a point of `x.gen_sys' + // that is not included in `y'. + // In the case of NNC polyhedra, we can restrict attention to + // closure points (considering also points will only add redundancy). + if (((g1.is_point() && closed) || (g1.is_closure_point() && !closed)) + && y.relation_with(g1) == Poly_Gen_Relation::nothing()) { + // For each point (resp., closure point) `g2' in `y.gen_sys', + // where `g1' and `g2' are different, + // build the candidate ray `g1 - g2'. + for (dimension_type j = y_gen_sys_num_rows; j-- > 0; ) { + const Generator& g2 = y.gen_sys[j]; + if ((g2.is_point() && closed) + || (g2.is_closure_point() && !closed)) { + assert(compare(g1, g2) != 0); + Generator ray_from_g2_to_g1 = g1; + ray_from_g2_to_g1.linear_combine(g2, 0); + candidate_rays.insert(ray_from_g2_to_g1); + } + } + } + } + + // Be non-intrusive. + Polyhedron result = x; + result.add_recycled_generators(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. + std::swap(x, result); + assert(x.OK(true)); + return true; + } + else + // The technique was unsuccessful. + return false; +} + +bool +PPL::Polyhedron::BHRZ03_evolving_rays(const Polyhedron& y, + const BHRZ03_Certificate& y_cert, + const Polyhedron& H79) { + Polyhedron& x = *this; + // It is assumed that `y <= x <= H79'. + assert(x.topology() == y.topology() + && x.topology() == H79.topology()); + assert(x.space_dim == y.space_dim + && x.space_dim == H79.space_dim); + assert(!x.marked_empty() && !x.has_something_pending() + && x.constraints_are_minimized() && x.generators_are_minimized()); + assert(!y.marked_empty() && !y.has_something_pending() + && y.constraints_are_minimized() && y.generators_are_minimized()); + assert(!H79.marked_empty() && !H79.has_something_pending() + && H79.constraints_are_minimized() && H79.generators_are_minimized()); + + const dimension_type x_gen_sys_num_rows = x.gen_sys.num_rows(); + const dimension_type y_gen_sys_num_rows = y.gen_sys.num_rows(); + + // Candidate rays are kept in a temporary generator system. + Generator_System candidate_rays; + PPL_DIRTY_TEMP_COEFFICIENT(tmp); + for (dimension_type i = x_gen_sys_num_rows; i-- > 0; ) { + const Generator& x_g = x.gen_sys[i]; + // We choose a ray of `x' that does not belong to `y'. + if (x_g.is_ray() && y.relation_with(x_g) == Poly_Gen_Relation::nothing()) { + for (dimension_type j = y_gen_sys_num_rows; j-- > 0; ) { + const Generator& y_g = y.gen_sys[j]; + if (y_g.is_ray()) { + Generator new_ray(x_g); + // Modify `new_ray' according to the evolution of `x_g' with + // respect to `y_g'. + std::deque considered(x.space_dim + 1); + for (dimension_type k = 1; k < x.space_dim; ++k) + if (!considered[k]) + for (dimension_type h = k + 1; h <= x.space_dim; ++h) + if (!considered[h]) { + tmp = x_g[k] * y_g[h]; + // The following line optimizes the computation of + // tmp -= x_g[h] * y_g[k]; + sub_mul_assign(tmp, x_g[h], y_g[k]); + const int clockwise + = sgn(tmp); + const int first_or_third_quadrant + = sgn(x_g[k]) * sgn(x_g[h]); + switch (clockwise * first_or_third_quadrant) { + case -1: + new_ray[k] = 0; + considered[k] = true; + break; + case 1: + new_ray[h] = 0; + considered[h] = true; + break; + default: + break; + } + } + new_ray.normalize(); + candidate_rays.insert(new_ray); + } + } + } + } + + // If there are no candidate rays, we cannot obtain stabilization. + if (candidate_rays.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. + std::swap(x, result); + assert(x.OK(true)); + return true; + } + else + // The technique was unsuccessful. + return false; +} + +void +PPL::Polyhedron::BHRZ03_widening_assign(const Polyhedron& y, unsigned* tp) { + Polyhedron& x = *this; + // Topology compatibility check. + if (x.topology() != y.topology()) + throw_topology_incompatible("BHRZ03_widening_assign(y)", "y", y); + // Dimension-compatibility check. + if (x.space_dim != y.space_dim) + throw_dimension_incompatible("BHRZ03_widening_assign(y)", "y", y); + +#ifndef NDEBUG + { + // We assume that y is contained in or equal to x. + const Polyhedron x_copy = x; + const Polyhedron y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + // If any argument is zero-dimensional or empty, + // the BHRZ03-widening behaves as the identity function. + if (x.space_dim == 0 || x.marked_empty() || y.marked_empty()) + return; + + // `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'. + BHRZ03_Certificate y_cert(y); + + // If the iteration is stabilizing, the resulting polyhedron is `x'. + // At this point, also check if the two polyhedra are the same + // (exploiting the knowledge that `y <= x'). + if (y_cert.is_stabilizing(x) || y.contains(x)) { + assert(OK()); + return; + } + + // Here the iteration is not immediately stabilizing. + // If we are using the widening-with-tokens technique and + // there are tokens available, use one of them and return `x'. + if (tp != 0 && *tp > 0) { + --(*tp); + assert(OK()); + return; + } + + // Copy into `H79_cs' the constraints that are common to `x' and `y', + // according to the definition of the H79 widening. + // The other ones are copied into `x_minus_H79_cs'. + const Topology 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. + 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; + + assert(H79.OK() && x.OK() && y.OK()); + + if (x.BHRZ03_evolving_points(y, y_cert, H79)) + return; + + assert(H79.OK() && x.OK() && y.OK()); + + if (x.BHRZ03_evolving_rays(y, y_cert, H79)) + return; + + assert(H79.OK() && x.OK() && y.OK()); + + // No previous technique was successful: fall back to the H79 widening. + std::swap(x, H79); + assert(x.OK(true)); + +#ifndef NDEBUG + // The H79 widening is always stabilizing. + assert(y_cert.is_stabilizing(x)); +#endif +} + +void +PPL::Polyhedron +::limited_BHRZ03_extrapolation_assign(const Polyhedron& y, + const Constraint_System& cs, + unsigned* tp) { + Polyhedron& x = *this; + const dimension_type cs_num_rows = cs.num_rows(); + // If `cs' is empty, we fall back to ordinary, non-limited widening. + if (cs_num_rows == 0) { + x.BHRZ03_widening_assign(y, tp); + return; + } + + // Topology compatibility check. + if (x.is_necessarily_closed()) { + if (!y.is_necessarily_closed()) + throw_topology_incompatible("limited_BHRZ03_extrapolation_assign(y, cs)", + "y", y); + if (cs.has_strict_inequalities()) + throw_topology_incompatible("limited_BHRZ03_extrapolation_assign(y, cs)", + "cs", cs); + } + else if (y.is_necessarily_closed()) + throw_topology_incompatible("limited_BHRZ03_extrapolation_assign(y, cs)", + "y", y); + + // Dimension-compatibility check. + if (x.space_dim != y.space_dim) + throw_dimension_incompatible("limited_BHRZ03_extrapolation_assign(y, cs)", + "y", y); + // `cs' must be dimension-compatible with the two polyhedra. + const dimension_type cs_space_dim = cs.space_dimension(); + if (x.space_dim < cs_space_dim) + throw_dimension_incompatible("limited_BHRZ03_extrapolation_assign(y, cs)", + "cs", cs); + +#ifndef NDEBUG + { + // We assume that y is contained in or equal to x. + const Polyhedron x_copy = x; + const Polyhedron y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + if (y.marked_empty()) + return; + if (x.marked_empty()) + return; + + // The limited BHRZ03-widening between two polyhedra in a + // zero-dimensional space is a polyhedron in a zero-dimensional + // space, too. + if (x.space_dim == 0) + return; + + if (!y.minimize()) + // We have just discovered that `y' is empty. + return; + + // Update the generators of `x': these are used to select, + // from the constraints in `cs', those that must be added + // to the resulting polyhedron. + if ((x.has_pending_constraints() && !x.process_pending_constraints()) + || (!x.generators_are_up_to_date() && !x.update_generators())) + // We have just discovered that `x' is empty. + return; + + Constraint_System new_cs; + // The constraints to be added must be satisfied by all the + // generators of `x'. We can disregard `y' because `y <= x'. + const Generator_System& x_gen_sys = x.gen_sys; + // Iterate upwards here so as to keep the relative ordering of constraints. + // Not really an issue: just aesthetics. + for (dimension_type i = 0; i < cs_num_rows; ++i) { + const Constraint& c = cs[i]; + if (x_gen_sys.satisfied_by_all_generators(c)) + new_cs.insert(c); + } + x.BHRZ03_widening_assign(y, tp); + x.add_recycled_constraints(new_cs); + assert(OK()); +} + +void +PPL::Polyhedron +::bounded_BHRZ03_extrapolation_assign(const Polyhedron& y, + const Constraint_System& cs, + unsigned* tp) { + Rational_Box x_box(*this, ANY_COMPLEXITY); + 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..c4bbe3d --- /dev/null +++ b/src/Powerset.defs.hh @@ -0,0 +1,454 @@ +/* Powerset class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Powerset_defs_hh +#define PPL_Powerset_defs_hh + +#include "Powerset.types.hh" +#include "globals.types.hh" +#include "iterator_to_const.defs.hh" +#include +#include +#include + +namespace Parma_Polyhedra_Library { + +//! Returns true if and only if \p x and \p y are equivalent. +/*! \relates Powerset */ +template +bool +operator==(const Powerset& x, const Powerset& y); + +//! Returns true if and only if \p x and \p y are not equivalent. +/*! \relates Powerset */ +template +bool +operator!=(const Powerset& x, const Powerset& y); + +namespace IO_Operators { + +//! Output operator. +/*! \relates Parma_Polyhedra_Library::Powerset */ +template +std::ostream& +operator<<(std::ostream& s, const Powerset& 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 + powerset 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 read-only, meaning + that the disjuncts cannot be overwritten. Rather, by using the class + iterator, 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 +void +drop_subsumed(Powerset& ps, const D& d) { + for (typename Powerset::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 true if and only if the instance of D is the top + element of the domain. + \code + bool is_bottom() const + \endcode + Returns true 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 true if the instance of D definitely entails + y. Returns false if the instance may not + entail y (i.e., if the instance does not entail + y 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 + y. + \code + void meet_assign(const D& y) + \endcode + Assigns to the instance of D the meet of the instance and + y. + \code + bool OK() const + \endcode + Returns true if the instance of D is in a consistent + state, else returns false. + + 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 + s. + \code + operator==(const D& x, const D& y) + \endcode + Returns true if and only if x and + y are equivalent D's. + \code + operator!=(const D& x, const D& y) + \endcode + Returns true if and only if x and + y are different D's. +*/ +template +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 true if \p *this definitely entails \p y. + Returns false 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 true 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 true 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 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 true, \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 read-only 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 + drop_disjunct(iterator position) and + drop_disjuncts(iterator first, iterator last), + while still ensuring a correct handling of Omega-reduction. + */ + typedef iterator_to_const iterator; + + //! A bidirectional %const_iterator on the disjuncts of a Powerset element. + typedef const_iterator_to_const const_iterator; + + //! The reverse iterator type built from Powerset::iterator. + typedef std::reverse_iterator reverse_iterator; + + //! The reverse iterator type built from Powerset::const_iterator. + typedef std::reverse_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 const 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 true 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 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 true 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 + 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 true 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); +}; + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Powerset */ +template +void swap(Parma_Polyhedra_Library::Powerset& x, + Parma_Polyhedra_Library::Powerset& y); + +} // namespace std + +#include "Powerset.inlines.hh" +#include "Powerset.templates.hh" + +#endif // !defined(PPL_Powerset_defs_hh) diff --git a/src/Powerset.inlines.hh b/src/Powerset.inlines.hh new file mode 100644 index 0000000..742c743 --- /dev/null +++ b/src/Powerset.inlines.hh @@ -0,0 +1,235 @@ +/* Powerset class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Powerset_inlines_hh +#define PPL_Powerset_inlines_hh 1 + +#include +#include + +namespace Parma_Polyhedra_Library { + +template +inline typename Powerset::iterator +Powerset::begin() { + return sequence.begin(); +} + +template +inline typename Powerset::iterator +Powerset::end() { + return sequence.end(); +} + +template +inline typename Powerset::const_iterator +Powerset::begin() const { + return sequence.begin(); +} + +template +inline typename Powerset::const_iterator +Powerset::end() const { + return sequence.end(); +} + +template +inline typename Powerset::reverse_iterator +Powerset::rbegin() { + return reverse_iterator(end()); +} + +template +inline typename Powerset::reverse_iterator +Powerset::rend() { + return reverse_iterator(begin()); +} + +template +inline typename Powerset::const_reverse_iterator +Powerset::rbegin() const { + return const_reverse_iterator(end()); +} + +template +inline typename Powerset::const_reverse_iterator +Powerset::rend() const { + return const_reverse_iterator(begin()); +} + +template +inline typename Powerset::size_type +Powerset::size() const { + return sequence.size(); +} + +template +inline bool +Powerset::empty() const { + return sequence.empty(); +} + +template +inline typename Powerset::iterator +Powerset::drop_disjunct(iterator position) { + return sequence.erase(position.base); +} + +template +inline void +Powerset::drop_disjuncts(iterator first, iterator last) { + sequence.erase(first.base, last.base); +} + +template +inline void +Powerset::clear() { + sequence.clear(); +} + +template +inline +Powerset::Powerset(const Powerset& y) + : sequence(y.sequence), reduced(y.reduced) { +} + +template +inline Powerset& +Powerset::operator=(const Powerset& y) { + sequence = y.sequence; + reduced = y.reduced; + return *this; +} + +template +inline void +Powerset::swap(Powerset& y) { + std::swap(sequence, y.sequence); + std::swap(reduced, y.reduced); +} + +template +inline +Powerset::Powerset() + : sequence(), reduced(true) { +} + +template +inline +Powerset::Powerset(const D& d) + : sequence(), reduced(false) { + sequence.push_back(d); + assert(OK()); +} + +template +inline +Powerset::~Powerset() { +} + +template +inline void +Powerset::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 +inline void +Powerset::add_disjunct(const D& d) { + sequence.push_back(d); + reduced = false; +} + +/*! \relates Powerset */ +template +inline +bool operator!=(const Powerset& x, const Powerset& y) { + return !(x == y); +} + +template +inline bool +Powerset::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 +inline bool +Powerset::is_bottom() const { + // Must perform omega-reduction for correctness. + omega_reduce(); + return empty(); +} + +template +inline void +Powerset::collapse() { + if (!empty()) + collapse(sequence.begin()); +} + +template +inline void +Powerset::meet_assign(const Powerset& y) { + pairwise_apply_assign(y, std::mem_fun_ref(&D::meet_assign)); +} + +template +inline void +Powerset::upper_bound_assign(const Powerset& y) { + least_upper_bound_assign(y); +} + +template +inline bool +Powerset::upper_bound_assign_if_exact(const Powerset& y) { + least_upper_bound_assign(y); + return true; +} + +template +inline memory_size_type +Powerset::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Powerset */ +template +inline void +swap(Parma_Polyhedra_Library::Powerset& x, + Parma_Polyhedra_Library::Powerset& y) { + x.swap(y); +} + +} // namespace std + +#endif // !defined(PPL_Powerset_inlines_hh) diff --git a/src/Powerset.templates.hh b/src/Powerset.templates.hh new file mode 100644 index 0000000..7f6d969 --- /dev/null +++ b/src/Powerset.templates.hh @@ -0,0 +1,309 @@ +/* Powerset class implementation: non-inline template functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Powerset_templates_hh +#define PPL_Powerset_templates_hh 1 + +#include "globals.defs.hh" +#include +#include +#include + +namespace Parma_Polyhedra_Library { + +template +void +Powerset::collapse(const Sequence_iterator sink) { + assert(sink != sequence.end()); + D& d = *sink; + iterator x_sink = sink; + iterator next_x_sink = x_sink; + ++next_x_sink; + iterator x_end = end(); + for (const_iterator xi = next_x_sink; xi != x_end; ++xi) + d.upper_bound_assign(*xi); + // Drop the surplus disjuncts. + drop_disjuncts(next_x_sink, x_end); + + // Ensure omega-reduction. + for (iterator xi = begin(); xi != x_sink; ) + if (xi->definitely_entails(d)) + xi = drop_disjunct(xi); + else + ++xi; + + assert(OK()); +} + +template +void +Powerset::omega_reduce() const { + if (reduced) + return; + + Powerset& x = const_cast(*this); + // First remove all bottom elements. + for (iterator xi = x.begin(), x_end = x.end(); xi != x_end; ) + if (xi->is_bottom()) + xi = x.drop_disjunct(xi); + else + ++xi; + // Then remove non-maximal elements. + for (iterator xi = x.begin(); xi != x.end(); ) { + const D& xv = *xi; + bool dropping_xi = false; + for (iterator yi = x.begin(); yi != x.end(); ) + if (xi == yi) + ++yi; + else { + const D& yv = *yi; + if (yv.definitely_entails(xv)) + yi = x.drop_disjunct(yi); + else if (xv.definitely_entails(yv)) { + dropping_xi = true; + break; + } + else + ++yi; + } + if (dropping_xi) + xi = x.drop_disjunct(xi); + else + ++xi; + if (abandon_expensive_computations && xi != x.end()) { + // Hurry up! + x.collapse(xi.base); + break; + } + } + reduced = true; + assert(OK()); +} + +template +void +Powerset::collapse(const unsigned max_disjuncts) { + assert(max_disjuncts > 0); + // Omega-reduce before counting the number of disjuncts. + omega_reduce(); + size_type n = size(); + if (n > max_disjuncts) { + // Let `i' point to the last disjunct that will survive. + iterator i = begin(); + std::advance(i, max_disjuncts-1); + // This disjunct will be assigned an upper-bound of itself and of + // all the disjuncts that follow. + collapse(i.base); + } + assert(OK()); + assert(is_omega_reduced()); +} + +template +bool +Powerset::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 +bool +Powerset::is_omega_reduced() const { + if (!reduced && check_omega_reduced()) + reduced = true; + return reduced; +} + +template +typename Powerset::iterator +Powerset::add_non_bottom_disjunct_preserve_reduction(const D& d, + iterator first, + iterator last) { + assert(!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); + assert(OK()); + return first; +} + +template +bool +Powerset::definitely_entails(const Powerset& y) const { + const Powerset& 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 +bool +operator==(const Powerset& x, const Powerset& y) { + x.omega_reduce(); + y.omega_reduce(); + if (x.size() != y.size()) + return false; + // Take a copy of `y' and work with it. + Powerset yy = y; + for (typename Powerset::const_iterator xi = x.begin(), + x_end = x.end(); xi != x_end; ++xi) { + typename Powerset::iterator yyi = yy.begin(); + typename Powerset::iterator yy_end = yy.end(); + yyi = std::find(yyi, yy_end, *xi); + if (yyi == yy_end) + return false; + else + yy.drop_disjunct(yyi); + } + return true; +} + +template +template +void +Powerset::pairwise_apply_assign(const Powerset& y, + Binary_Operator_Assign op_assign) { + // Ensure omega-reduction here, since what follows has quadratic complexity. + omega_reduce(); + y.omega_reduce(); + Sequence new_sequence; + for (const_iterator xi = begin(), x_end = end(), + y_begin = y.begin(), y_end = y.end(); xi != x_end; ++xi) + for (const_iterator yi = y_begin; yi != y_end; ++yi) { + D zi = *xi; + op_assign(zi, *yi); + if (!zi.is_bottom()) + new_sequence.push_back(zi); + } + // Put the new sequence in place. + std::swap(sequence, new_sequence); + reduced = false; + assert(OK()); +} + +template +void +Powerset::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); + assert(OK()); +} + +namespace IO_Operators { + +/*! \relates Parma_Polyhedra_Library::Powerset */ +template +std::ostream& +operator<<(std::ostream& s, const Powerset& x) { + if (x.is_bottom()) + s << "false"; + else if (x.is_top()) + s << "true"; + else + for (typename Powerset::const_iterator i = x.begin(), + x_end = x.end(); i != x_end; ) { + s << "{ " << *i++ << " }"; + if (i != x_end) + s << ", "; + } + return s; +} + +} // namespace IO_Operators + +template +memory_size_type +Powerset::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 +bool +Powerset::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..3879faf --- /dev/null +++ b/src/Powerset.types.hh @@ -0,0 +1,22 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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 +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..bed9b7f --- /dev/null +++ b/src/Ptr_Iterator.defs.hh @@ -0,0 +1,171 @@ +/* Ptr_Iterator class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Ptr_Iterator_defs_hh +#define PPL_Ptr_Iterator_defs_hh 1 + +#include "Ptr_Iterator.types.hh" +#include + +namespace Parma_Polyhedra_Library { + +namespace Implementation { + +template +bool operator==(const Ptr_Iterator& x, const Ptr_Iterator& y); + +template +bool operator!=(const Ptr_Iterator& x, const Ptr_Iterator& y); + +template +bool operator<(const Ptr_Iterator& x, const Ptr_Iterator& y); + +template +bool operator<=(const Ptr_Iterator& x, const Ptr_Iterator& y); + +template +bool operator>(const Ptr_Iterator& x, const Ptr_Iterator& y); + +template +bool operator>=(const Ptr_Iterator& x, const Ptr_Iterator& y); + +template +typename Ptr_Iterator::difference_type operator-(const Ptr_Iterator& x, + const Ptr_Iterator& y); + +template +Ptr_Iterator

operator+(typename Ptr_Iterator

::difference_type m, + const Ptr_Iterator

& 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 +class Parma_Polyhedra_Library::Implementation::Ptr_Iterator + : public std::iterator::iterator_category, + typename std::iterator_traits

::value_type, + typename std::iterator_traits

::difference_type, + typename std::iterator_traits

::pointer, + typename std::iterator_traits

::reference> { +public: + typedef typename std::iterator_traits

::difference_type difference_type; + typedef typename std::iterator_traits

::reference reference; + typedef typename std::iterator_traits

::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 + Ptr_Iterator(const Ptr_Iterator& 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 + friend bool Parma_Polyhedra_Library::Implementation:: + operator==(const Ptr_Iterator& x, const Ptr_Iterator& y); + + template + friend bool Parma_Polyhedra_Library::Implementation:: + operator!=(const Ptr_Iterator& x, const Ptr_Iterator& y); + + template + friend bool Parma_Polyhedra_Library::Implementation:: + operator<(const Ptr_Iterator& x, const Ptr_Iterator& y); + + template + friend bool Parma_Polyhedra_Library::Implementation:: + operator<=(const Ptr_Iterator& x, const Ptr_Iterator& y); + + template + friend bool Parma_Polyhedra_Library::Implementation:: + operator>(const Ptr_Iterator& x, const Ptr_Iterator& y); + + template + friend bool Parma_Polyhedra_Library::Implementation:: + operator>=(const Ptr_Iterator& x, const Ptr_Iterator& y); + + template + friend typename Ptr_Iterator::difference_type + Parma_Polyhedra_Library::Implementation:: + operator-(const Ptr_Iterator& x, const Ptr_Iterator& y); + + friend Ptr_Iterator

+ Parma_Polyhedra_Library::Implementation:: + operator+<>(typename Ptr_Iterator

::difference_type m, + const Ptr_Iterator

& 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..9a0b3a9 --- /dev/null +++ b/src/Ptr_Iterator.inlines.hh @@ -0,0 +1,188 @@ +/* Ptr_Iterator class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Ptr_Iterator_inlines_hh +#define PPL_Ptr_Iterator_inlines_hh 1 + +#include +#include + +namespace Parma_Polyhedra_Library { + +namespace Implementation { + +template +inline const P& +Ptr_Iterator

::base() const { + return p; +} + +template +inline +Ptr_Iterator

::Ptr_Iterator() + : p(P()) { +} + +template +inline +Ptr_Iterator

::Ptr_Iterator(const P& q) + : p(q) { +} + +template +template +inline +Ptr_Iterator

::Ptr_Iterator(const Ptr_Iterator& y) + : p(y.base()) { +} + +template +inline typename Ptr_Iterator

::reference +Ptr_Iterator

::operator*() const { + return *p; +} + +template +inline typename Ptr_Iterator

::pointer +Ptr_Iterator

::operator->() const { + return p; +} + +template +inline typename Ptr_Iterator

::reference +Ptr_Iterator

::operator[](const difference_type m) const { + return p[m]; +} + +template +inline Ptr_Iterator

& +Ptr_Iterator

::operator++() { + ++p; + return *this; +} + +template +inline Ptr_Iterator

+Ptr_Iterator

::operator++(int) { + return Ptr_Iterator(p++); +} + +template +inline Ptr_Iterator

& +Ptr_Iterator

::operator--() { + --p; + return *this; +} + +template +inline Ptr_Iterator

+Ptr_Iterator

::operator--(int) { + return Ptr_Iterator(p--); +} + + +template +inline Ptr_Iterator

& +Ptr_Iterator

::operator+=(const difference_type m) { + p += m; + return *this; +} + +template +inline Ptr_Iterator

& +Ptr_Iterator

::operator-=(const difference_type m) { + p -= m; + return *this; +} + +template +inline typename Ptr_Iterator

::difference_type +Ptr_Iterator

::operator-(const Ptr_Iterator& y) const { + return p - y.p; +} + +template +inline Ptr_Iterator

+Ptr_Iterator

::operator+(const difference_type m) const { + return Ptr_Iterator(p + m); +} + +template +inline Ptr_Iterator

+Ptr_Iterator

::operator-(const difference_type m) const { + return Ptr_Iterator(p - m); +} + +template +inline bool +operator==(const Ptr_Iterator

& x, const Ptr_Iterator& y) { + return x.base() == y.base(); +} + +template +inline bool +operator!=(const Ptr_Iterator

& x, const Ptr_Iterator& y) { + return x.base() != y.base(); +} + +template +inline bool +operator<(const Ptr_Iterator

& x, const Ptr_Iterator& y) { + return x.base() < y.base(); +} + +template +inline bool +operator<=(const Ptr_Iterator

& x, const Ptr_Iterator& y) { + return x.base() <= y.base(); +} + +template +inline bool +operator>(const Ptr_Iterator

& x, const Ptr_Iterator& y) { + return x.base() > y.base(); +} + +template +inline bool +operator>=(const Ptr_Iterator

& x, const Ptr_Iterator& y) { + return x.base() >= y.base(); +} + +template +inline typename Ptr_Iterator

::difference_type +operator-(const Ptr_Iterator

& x, const Ptr_Iterator& y) { + return x.base() - y.base(); +} + +template +inline Ptr_Iterator

+operator+(typename Ptr_Iterator

::difference_type m, + const Ptr_Iterator

& y) { + return Ptr_Iterator

(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..96afe37 --- /dev/null +++ b/src/Ptr_Iterator.types.hh @@ -0,0 +1,26 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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 +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..a74a5a8 --- /dev/null +++ b/src/Rational_Box.hh @@ -0,0 +1,38 @@ +/* Rational_Box class declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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_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..e8de7e7 --- /dev/null +++ b/src/Rational_Interval.hh @@ -0,0 +1,56 @@ +/* Rational_Interval class declaration and implementation. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Rational_Interval_hh +#define PPL_Rational_Interval_hh 1 + +#include "Interval.defs.hh" +#include + +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_empty_result, false); + const_bool_nodef(check_inexact, false); +}; + +typedef +Interval_Restriction_None > +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 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..9d8eb8c --- /dev/null +++ b/src/Result.defs.hh @@ -0,0 +1,120 @@ +/* Result enum and supporting function declarations. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Result_defs_hh +#define PPL_Result_defs_hh 1 + +namespace Parma_Polyhedra_Library { + +//! Possible outcomes of a checked arithmetic computation. +/*! \ingroup PPL_CXX_interface */ +enum Result { + + //! \hideinitializer Ordinary result class. + VC_NORMAL = 0, + + //! \hideinitializer The computed result is inexact and rounded up. + V_LT = 1, + + //! \hideinitializer The computed result is inexact and rounded down. + V_GT = 2, + + //! \hideinitializer The computed result is exact. + V_EQ = 4, + + //! \hideinitializer The computed result is inexact. + V_NE = V_LT | V_GT, + + //! \hideinitializer The computed result may be inexact and rounded up. + V_LE = V_EQ | V_LT, + + //! \hideinitializer The computed result may be inexact and rounded down. + V_GE = V_EQ | V_GT, + + //! \hideinitializer The computed result may be inexact. + V_LGE = V_LT | V_EQ | V_GT, + + //! \hideinitializer Negative infinity unrepresentable result class. + VC_MINUS_INFINITY = 16, + + //! \hideinitializer A negative overflow occurred. + V_NEG_OVERFLOW = VC_MINUS_INFINITY | V_GT, + + //! \hideinitializer Positive infinity unrepresentable result class. + VC_PLUS_INFINITY = 32, + + //! \hideinitializer A positive overflow occurred. + V_POS_OVERFLOW = VC_PLUS_INFINITY | V_LT, + + //! \hideinitializer Not a number result class. + VC_NAN = 48, + + //! \hideinitializer Converting from unknown string. + V_CVT_STR_UNK = 49, + + //! \hideinitializer Dividing by zero. + V_DIV_ZERO = 50, + + //! \hideinitializer Adding two infinities having opposite signs. + V_INF_ADD_INF = 51, + + //! \hideinitializer Dividing two infinities. + V_INF_DIV_INF = 52, + + //! \hideinitializer Taking the modulus of an infinity. + V_INF_MOD = 53, + + //! \hideinitializer Multiplying an infinity by zero. + V_INF_MUL_ZERO = 54, + + //! \hideinitializer Subtracting two infinities having the same sign. + V_INF_SUB_INF = 55, + + //! \hideinitializer Computing a remainder modulo zero. + V_MOD_ZERO = 56, + + //! \hideinitializer Taking the square root of a negative number. + V_SQRT_NEG = 57, + + //! \hideinitializer Unknown result due to intermediate negative overflow. + V_UNKNOWN_NEG_OVERFLOW = 58, + + //! \hideinitializer Unknown result due to intermediate positive overflow. + V_UNKNOWN_POS_OVERFLOW = 59, + + //! \hideinitializer Unordered comparison. + V_UNORD_COMP = 60, + + VC_MASK = 48 +}; + +//! Extracts the class part of \p r (normal, minus/plus infinity or nan). +Result classify(Result r); + +//! Returns true if and only if the class or \p r is not normal. +bool is_special(Result r); + +} // namespace Parma_Polyhedra_Library + +#include "Result.inlines.hh" + +#endif // !defined(PPL_Result_defs_hh) diff --git a/src/Result.inlines.hh b/src/Result.inlines.hh new file mode 100644 index 0000000..4940052 --- /dev/null +++ b/src/Result.inlines.hh @@ -0,0 +1,42 @@ +/* Result supporting functions implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Result_inlines_hh +#define PPL_Result_inlines_hh 1 + +namespace Parma_Polyhedra_Library { + +/*! \relates Parma_Polyhedra_Library::Result */ +inline Result +classify(Result r) { + return static_cast(r & VC_MASK); +} + +/*! \relates Parma_Polyhedra_Library::Result */ +inline bool +is_special(Result r) { + return classify(r) != VC_NORMAL; +} + +} // 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..b2e62a4 --- /dev/null +++ b/src/Rounding_Dir.defs.hh @@ -0,0 +1,87 @@ +/* Declaration of Rounding_Dir and related functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Rounding_defs_hh +#define PPL_Rounding_defs_hh 1 + +#include "Result.defs.hh" +#include "fpu.defs.hh" + +namespace Parma_Polyhedra_Library { + +//! Rounding directions for arithmetic computations. +/*! \ingroup PPL_CXX_interface */ +enum Rounding_Dir { + /*! \hideinitializer + Round toward \f$-\infty\f$. + */ + ROUND_DOWN = 0, + + /*! \hideinitializer + Round toward \f$+\infty\f$. + */ + ROUND_UP = 1, + + /*! \hideinitializer + Rounding is delegated to lower level. Result info is evaluated lazily. + */ + ROUND_IGNORE = 6, + ROUND_NATIVE = ROUND_IGNORE, + + /*! \hideinitializer + Rounding is not needed: client code must ensure the operation is exact. + */ + ROUND_NOT_NEEDED = 7, + + ROUND_DIRECT = ROUND_UP, + ROUND_INVERSE = ROUND_DOWN, + + ROUND_DIR_MASK = 7, + + ROUND_FPU_CHECK_INEXACT = 8, + + ROUND_CHECK = ROUND_DIRECT | ROUND_FPU_CHECK_INEXACT +}; + +/*! \brief + Returns the inverse rounding mode of \p dir, + ROUND_IGNORE being the inverse of itself. +*/ +Rounding_Dir inverse(Rounding_Dir dir); + +Rounding_Dir round_dir(Rounding_Dir dir); +bool round_down(Rounding_Dir dir); +bool round_up(Rounding_Dir dir); +bool round_ignore(Rounding_Dir dir); +bool round_direct(Rounding_Dir dir); +bool round_inverse(Rounding_Dir dir); + +bool round_fpu_check_inexact(Rounding_Dir dir); + +fpu_rounding_direction_type round_fpu_dir(Rounding_Dir dir); + +} // namespace Parma_Polyhedra_Library + +#include "Rounding_Dir.inlines.hh" + +#endif // !defined(PPL_Float_defs_hh) + diff --git a/src/Rounding_Dir.inlines.hh b/src/Rounding_Dir.inlines.hh new file mode 100644 index 0000000..8a20d3c --- /dev/null +++ b/src/Rounding_Dir.inlines.hh @@ -0,0 +1,109 @@ +/* Inline functions operating on enum Rounding_Dir values. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Rounding_Dir_inlines_hh +#define PPL_Rounding_Dir_inlines_hh 1 + +#include + +namespace Parma_Polyhedra_Library { + +inline Rounding_Dir +round_dir(Rounding_Dir dir) { + return static_cast(dir & ROUND_DIR_MASK); +} + +inline bool +round_down(Rounding_Dir dir) { + return round_dir(dir) == ROUND_DOWN; +} + +inline bool +round_up(Rounding_Dir dir) { + return round_dir(dir) == ROUND_UP; +} + +inline bool +round_ignore(Rounding_Dir dir) { + return round_dir(dir) == ROUND_IGNORE; +} + +inline bool +round_direct(Rounding_Dir dir) { + return round_dir(dir) == ROUND_DIRECT; +} + +inline bool +round_inverse(Rounding_Dir dir) { + return round_dir(dir) == ROUND_INVERSE; +} + +inline bool +round_fpu_check_inexact(Rounding_Dir dir) { + return dir & ROUND_FPU_CHECK_INEXACT; +} + +#if PPL_CAN_CONTROL_FPU + +inline fpu_rounding_direction_type +round_fpu_dir(Rounding_Dir dir) { + switch (round_dir(dir)) { + case ROUND_UP: + return static_cast(PPL_FPU_UPWARD); + case ROUND_DOWN: + return static_cast(PPL_FPU_DOWNWARD); + default: + assert(false); + return static_cast(PPL_FPU_UPWARD); + } +} + +#undef PPL_FPU_DOWNWARD +#undef PPL_FPU_TONEAREST +#undef PPL_FPU_TOWARDZERO +#undef PPL_FPU_UPWARD + +#endif + +/*! \relates Parma_Polyhedra_Library::Rounding_Dir */ +inline Rounding_Dir +inverse(Rounding_Dir dir) { + Rounding_Dir d = round_dir(dir); + switch (d) { + case ROUND_UP: + d = ROUND_DOWN; + break; + case ROUND_DOWN: + d = ROUND_UP; + break; + default: + assert(false); + /* Fall through */ + case ROUND_IGNORE: + return dir; + } + return static_cast((dir & ~ROUND_DIR_MASK) | d); +} + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Rounding_Dir_inlines_hh) diff --git a/src/Row.cc b/src/Row.cc new file mode 100644 index 0000000..addd828 --- /dev/null +++ b/src/Row.cc @@ -0,0 +1,316 @@ +/* Row class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Row.defs.hh" +#include "Coefficient.defs.hh" +#include +#include +#include + +namespace PPL = Parma_Polyhedra_Library; + +void +PPL::Row_Impl_Handler:: +Impl::expand_within_capacity(const dimension_type new_size) { + assert(size() <= new_size && new_size <= max_size()); +#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + // vec_[0] is already constructed. + if (size() == 0 && new_size > 0) + bump_size(); +#endif + for (dimension_type i = size(); i < new_size; ++i) { + new (&vec_[i]) Coefficient(); + bump_size(); + } +} + +void +PPL::Row_Impl_Handler::Impl::shrink(dimension_type new_size) { + const dimension_type old_size = size(); + assert(new_size <= old_size); + // Since ~Coefficient() does not throw exceptions, nothing here does. + set_size(new_size); +#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + // Make sure we do not try to destroy vec_[0]. + if (new_size == 0) + ++new_size; +#endif + // We assume construction was done "forward". + // We thus perform destruction "backward". + for (dimension_type i = old_size; i-- > new_size; ) + vec_[i].~Coefficient(); +} + +void +PPL::Row_Impl_Handler::Impl::copy_construct_coefficients(const Impl& y) { + const dimension_type y_size = y.size(); +#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + for (dimension_type i = 0; i < y_size; ++i) { + new (&vec_[i]) Coefficient(y.vec_[i]); + bump_size(); + } +#else + assert(y_size > 0); + if (y_size > 0) { + vec_[0] = y.vec_[0]; + bump_size(); + for (dimension_type i = 1; i < y_size; ++i) { + new (&vec_[i]) Coefficient(y.vec_[i]); + bump_size(); + } + } +#endif +} + +void +PPL::Row::normalize() { + Row& x = *this; + // Compute the GCD of all the coefficients. + const dimension_type sz = size(); + dimension_type i = sz; + PPL_DIRTY_TEMP_COEFFICIENT(gcd); + while (i > 0) { + const Coefficient& x_i = x[--i]; + if (const int x_i_sign = sgn(x_i)) { + gcd = x_i; + if (x_i_sign < 0) + neg_assign(gcd); + goto compute_gcd; + } + } + // We reach this point only if all the coefficients were zero. + return; + + compute_gcd: + if (gcd == 1) + return; + while (i > 0) { + const Coefficient& x_i = x[--i]; + if (x_i != 0) { + // Note: we use the ternary version instead of a more concise + // gcd_assign(gcd, x_i) to take advantage of the fact that + // `gcd' will decrease very rapidly (see D. Knuth, The Art of + // Computer Programming, second edition, Section 4.5.2, + // Algorithm C, and the discussion following it). Our + // implementation of gcd_assign(x, y, z) for checked numbers is + // optimized for the case where `z' is smaller than `y', so that + // on checked numbers we gain. On the other hand, for the + // implementation of gcd_assign(x, y, z) on GMP's unbounded + // integers we cannot make any assumption, so here we draw. + // Overall, we win. + gcd_assign(gcd, x_i, gcd); + if (gcd == 1) + return; + } + } + // Divide the coefficients by the GCD. + for (dimension_type j = sz; j-- > 0; ) { + Coefficient& x_j = x[j]; + exact_div_assign(x_j, x_j, gcd); + } +} + +void +PPL::Row::Flags::ascii_dump(std::ostream& s) const { + s << "0x"; + std::istream::fmtflags f = s.setf(std::istream::hex); + std::streamsize sz = s.width(2*sizeof(Flags::base_type)); + std::ostream::char_type ch = s.fill('0'); + s << bits; + s.fill(ch); + s.width(sz); + s.flags(f); +} + +PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Row::Flags) + +bool +PPL::Row::Flags::ascii_load(std::istream& s) { + std::string str; + std::streamsize sz = s.width(2); + if (!(s >> str) || str != "0x") + return false; + s.width(sz); + std::istream::fmtflags f = s.setf(std::istream::hex); + bool r = s >> bits; + s.flags(f); + return r; +} + +void +PPL::Row::ascii_dump(std::ostream& s) const { + const Row& x = *this; + const dimension_type x_size = x.size(); + s << "size " << x_size << " "; + for (dimension_type i = 0; i < x_size; ++i) + s << x[i] << ' '; + s << "f "; + flags().ascii_dump(s); + s << "\n"; +} + +PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Row) + +bool +PPL::Row::ascii_load(std::istream& s) { + std::string str; + if (!(s >> str) || str != "size") + return false; + dimension_type new_size; + if (!(s >> new_size)) + return false; + + Row& x = *this; + const dimension_type old_size = x.size(); + if (new_size < old_size) + x.shrink(new_size); + else if (new_size > old_size) { + Row y(new_size, Row::Flags()); + x.swap(y); + } + + for (dimension_type col = 0; col < new_size; ++col) + if (!(s >> x[col])) + return false; + if (!(s >> str) || str != "f") + return false; + return flags().ascii_load(s); +} + +PPL::memory_size_type +PPL::Row_Impl_Handler::Impl::external_memory_in_bytes() const { + memory_size_type n = 0; + for (dimension_type i = size(); i-- > 0; ) + n += PPL::external_memory_in_bytes(vec_[i]); + return n; +} + +bool +PPL::Row::OK() const { +#ifndef NDEBUG + using std::endl; + using std::cerr; +#endif + + bool is_broken = false; +#if PPL_ROW_EXTRA_DEBUG +# if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + if (capacity_ == 0) { + cerr << "Illegal row capacity: is 0, should be at least 1" + << endl; + is_broken = true; + } + else +# endif // !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + if (capacity_ > max_size()) { + cerr << "Row capacity exceeds the maximum allowed size:" + << endl + << "is " << capacity_ + << ", should be less than or equal to " << max_size() << "." + << endl; + is_broken = true; + } +#endif // PPL_ROW_EXTRA_DEBUG + if (size() > max_size()) { +#ifndef NDEBUG + cerr << "Row size exceeds the maximum allowed size:" + << endl + << "is " << size() + << ", should be less than or equal to " << max_size() << "." + << endl; +#endif + is_broken = true; + } +#if PPL_ROW_EXTRA_DEBUG + if (capacity_ < size()) { +#ifndef NDEBUG + cerr << "Row is completely broken: capacity is " << capacity_ + << ", size is " << size() << "." + << endl; +#endif + is_broken = true; + } +#endif // PPL_ROW_EXTRA_DEBUG + return !is_broken; +} + +bool +PPL::Row::OK(const dimension_type row_size, + const dimension_type +#if PPL_ROW_EXTRA_DEBUG + row_capacity +#endif + ) const { +#ifndef NDEBUG + using std::endl; + using std::cerr; +#endif + + bool is_broken = !OK(); + +#if PPL_ROW_EXTRA_DEBUG + // Check the declared capacity. +# if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + if (capacity_ == 1 && row_capacity == 0) + // This is fine. + ; + else +# endif // !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + if (capacity_ != row_capacity) { + cerr << "Row capacity mismatch: is " << capacity_ + << ", should be " << row_capacity << "." + << endl; + is_broken = true; + } +#endif // PPL_ROW_EXTRA_DEBUG + + // Check the declared size. + if (size() != row_size) { +#ifndef NDEBUG + cerr << "Row size mismatch: is " << size() + << ", should be " << row_size << "." + << endl; +#endif + is_broken = true; + } + return !is_broken; +} + +/*! \relates Parma_Polyhedra_Library::Row */ +bool +PPL::operator==(const Row& x, const Row& y) { + const dimension_type x_size = x.size(); + const dimension_type y_size = y.size(); + if (x_size != y_size) + return false; + + if (x.flags() != y.flags()) + return false; + + for (dimension_type i = x_size; i-- > 0; ) + if (x[i] != y[i]) + return false; + + return true; +} diff --git a/src/Row.defs.hh b/src/Row.defs.hh new file mode 100644 index 0000000..dcb6db6 --- /dev/null +++ b/src/Row.defs.hh @@ -0,0 +1,506 @@ +/* Row class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Row_defs_hh +#define PPL_Row_defs_hh 1 + +#include "Row.types.hh" +#include "globals.defs.hh" +#include "Coefficient.defs.hh" +#include +#include + +#ifndef PPL_ROW_EXTRA_DEBUG +#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! + \brief + Enables extra debugging information for class Row. + + \ingroup PPL_CXX_interface + When PPL_ROW_EXTRA_DEBUG evaluates to true, + each instance of the class Row carries its own capacity; this enables + extra consistency checks to be performed. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +#define PPL_ROW_EXTRA_DEBUG 1 +#else // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG) +#define PPL_ROW_EXTRA_DEBUG 0 +#endif // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG) +#endif // !defined(PPL_ROW_EXTRA_DEBUG) + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! The handler of the actual Row implementation. +/*! \ingroup PPL_CXX_interface + Exception-safety is the only responsibility of this class: it has + to ensure that its \p impl member is correctly deallocated. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +class Parma_Polyhedra_Library::Row_Impl_Handler { +public: + //! Default constructor. + Row_Impl_Handler(); + + //! Destructor. + ~Row_Impl_Handler(); + + class Impl; + + //! A pointer to the actual implementation. + Impl* impl; + +#if PPL_ROW_EXTRA_DEBUG + //! The capacity of \p impl (only available during debugging). + dimension_type capacity_; +#endif // PPL_ROW_EXTRA_DEBUG + +private: + //! Private and unimplemented: copy construction is not allowed. + Row_Impl_Handler(const Row_Impl_Handler&); + + //! Private and unimplemented: copy assignment is not allowed. + Row_Impl_Handler& operator=(const Row_Impl_Handler&); +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! A finite sequence of coefficients. +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +class Parma_Polyhedra_Library::Row : private Row_Impl_Handler { +public: +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS + /*! \brief + Wrapper class to represent a set of flags with bits in a native + unsigned integral type. + \ingroup PPL_CXX_interface + */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) + class Flags { + public: + //! Constructs an object with all the flags unset. + Flags(); + + //! Returns true if and only if \p *this and \p y are equal. + bool operator==(const Flags& y) const; + + /*! \brief + Returns true if and only if \p *this and \p y + are different. + */ + bool operator!=(const Flags& y) const; + + PPL_OUTPUT_DECLARATIONS + + //! Uses the ASCII Flags representation from \p s to recreate *this. + /*! + Returns true if successful, false + otherwise. The ASCII representation is as output by + \ref Parma_Polyhedra_Library::Row::Flags::ascii_dump. + */ + bool ascii_load(std::istream& s); + + protected: + //! A native integral type holding the bits that encode the flags. + typedef unsigned int base_type; + + //! Index of the first bit derived classes can use. + static const unsigned first_free_bit = 0; + + //! Total number of bits that can be stored. + static const unsigned num_bits = std::numeric_limits::digits; + + //! Constructs an object with flags set as in \p n. + explicit Flags(base_type n); + + //! Returns the integer encoding \p *this. + base_type get_bits() const; + + //! Sets the bits in \p mask. + void set_bits(base_type mask); + + //! Resets the bits in \p mask. + void reset_bits(base_type mask); + + /*! \brief + Returns true if and only if all the bits + in \p mask are set. + */ + bool test_bits(base_type mask) const; + + private: + //! The integer encoding \p *this. + base_type bits; + + friend class Row; + }; + + //! Pre-constructs a row: construction must be completed by construct(). + Row(); + + //! \name Post-constructors + //@{ + //! Constructs properly a default-constructed element. + /*! + Builds a row with size and capacity \p sz and flags \p f. + */ + void construct(dimension_type sz, Flags f); + + //! Constructs properly a default-constructed element. + /*! + \param sz + The size of the row that will be constructed; + + \param capacity + The capacity of the row that will be constructed; + + \param f + Flags for the row that will be constructed. + + The row that is constructed has storage for \p capacity elements, + \p sz of which are default-constructed now. + The row flags are set to \p f. + */ + void construct(dimension_type sz, dimension_type capacity, Flags f); + //@} // Post-constructors + + //! Tight constructor: resizing may require reallocation. + /*! + Constructs a row with size and capacity \p sz, and flags \p f. + */ + Row(dimension_type sz, Flags f); + + //! Sizing constructor with capacity. + /*! + \param sz + The size of the row that will be constructed; + + \param capacity + The capacity of the row that will be constructed; + + \param f + Flags for the row that will be constructed. + + The row that is constructed has storage for \p capacity elements, + \p sz of which are default-constructed now. + The row flags are set to \p f. + */ + Row(dimension_type sz, dimension_type capacity, Flags f); + + //! Ordinary copy constructor. + Row(const Row& y); + + //! Copy constructor with specified capacity. + /*! + It is assumed that \p capacity is greater than or equal to + the size of \p y. + */ + Row(const Row& y, dimension_type capacity); + + //! Copy constructor with specified size and capacity. + /*! + It is assumed that \p sz is greater than or equal to the size of \p y + and, of course, that \p sz is less than or equal to \p capacity. + */ + Row(const Row& y, dimension_type sz, dimension_type capacity); + + //! Destructor. + ~Row(); + + //! Assignment operator. + Row& operator=(const Row& y); + + //! Swaps \p *this with \p y. + void swap(Row& y); + + //! Assigns the implementation of \p y to \p *this. + /*! + To be used with extra care, since it may easily cause memory leaks + or undefined behavior. + */ + void assign(Row& y); + + /*! \brief + Allocates memory for a default constructed Row object, setting + flags to \p f and allowing for \p capacity coefficients at most. + + It is assumed that no allocation has been performed before + (otherwise, a memory leak will occur). + After execution, the size of the Row object is zero. + */ + void allocate(dimension_type capacity, Flags f); + + //! Expands the row to size \p new_size. + /*! + Adds new positions to the implementation of the row + obtaining a new row with size \p new_size. + It is assumed that \p new_size is between the current size + and capacity of the row. + */ + void expand_within_capacity(dimension_type new_size); + + //! Shrinks the row by erasing elements at the end. + /*! + Destroys elements of the row implementation + from position \p new_size to the end. + It is assumed that \p new_size is not greater than the current size. + */ + void shrink(dimension_type new_size); + + //! Returns a const reference to the flags of \p *this. + const Flags& flags() const; + + //! Returns a non-const reference to the flags of \p *this. + Flags& flags(); + + //! Returns the size() of the largest possible Row. + static dimension_type max_size(); + + //! Gives the number of coefficients currently in use. + dimension_type size() const; + + //! \name Subscript operators + //@{ + //! Returns a reference to the element of the row indexed by \p k. + Coefficient& operator[](dimension_type k); + + //! Returns a constant reference to the element of the row indexed by \p k. + Coefficient_traits::const_reference operator[](dimension_type k) const; + //@} // Subscript operators + + //! Normalizes the modulo of coefficients so that they are mutually prime. + /*! + Computes the Greatest Common Divisor (GCD) among the elements of + the row and normalizes them by the GCD itself. + */ + void normalize(); + + PPL_OUTPUT_DECLARATIONS + + /*! \brief + Loads from \p s an ASCII representation (as produced by + ascii_dump(std::ostream&) const) and sets \p *this accordingly. + Returns true if successful, false 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 and capacity match the values provided as arguments. + */ + bool OK(dimension_type row_size, dimension_type row_capacity) const; + +private: + //! Exception-safe copy construction mechanism for coefficients. + void copy_construct_coefficients(const Row& y); + +#if PPL_ROW_EXTRA_DEBUG + //! Returns the capacity of the row (only available during debugging). + dimension_type capacity() const; +#endif // PPL_ROW_EXTRA_DEBUG +}; + +namespace Parma_Polyhedra_Library { + +//! Returns true if and only if \p x and \p y are equal. +/*! \relates Row */ +bool operator==(const Row& x, const Row& y); + +//! Returns true if and only if \p x and \p y are different. +/*! \relates Row */ +bool operator!=(const Row& x, const Row& y); + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Row */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +void swap(Parma_Polyhedra_Library::Row& x, + Parma_Polyhedra_Library::Row& y); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specializes std::iter_swap. +/*! \relates Parma_Polyhedra_Library::Row */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +void iter_swap(std::vector::iterator x, + std::vector::iterator y); + +} // namespace std + + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! The actual implementation of a Row object. +/*! \ingroup PPL_CXX_interface + The class Row_Impl_Handler::Impl provides the implementation of Row + objects and, in particular, of the corresponding memory allocation + functions. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +class Parma_Polyhedra_Library::Row_Impl_Handler::Impl { +public: + //! \name Custom allocator and deallocator + //@{ + + /*! \brief + Allocates a chunk of memory able to contain \p capacity Coefficient objects + beyond the specified \p fixed_size and returns a pointer to the new + allocated memory. + */ + static void* operator new(size_t fixed_size, dimension_type capacity); + + //! Uses the standard delete operator to free the memory \p p points to. + static void operator delete(void* p); + + /*! \brief + Placement version: + uses the standard operator delete to free the memory \p p points to. + */ + static void operator delete(void* p, dimension_type capacity); + //@} // Custom allocator and deallocator + + //! Constructor. + Impl(Row::Flags f); + + //! Destructor. + /*! + Uses shrink() method with argument \f$0\f$ + to delete all the row elements. + */ + ~Impl(); + + //! Expands the row to size \p new_size. + /*! + It is assumed that \p new_size is between the current size and capacity. + */ + void expand_within_capacity(dimension_type new_size); + + //! Shrinks the row by erasing elements at the end. + /*! + It is assumed that \p new_size is not greater than the current size. + */ + void shrink(dimension_type new_size); + + //! Exception-safe copy construction mechanism for coefficients. + void copy_construct_coefficients(const Impl& y); + + //! Returns the size() of the largest possible Impl. + static dimension_type max_size(); + + //! \name Flags accessors + //@{ + //! Returns a const reference to the flags of \p *this. + const Row::Flags& flags() const; + + //! Returns a non-const reference to the flags of \p *this. + Row::Flags& flags(); + //@} // Flags accessors + + //! \name Size accessors + //@{ + //! Returns the actual size of \p this. + dimension_type size() const; + + //! Sets to \p new_size the actual size of \p *this. + void set_size(dimension_type new_size); + + //! Increment the size of \p *this by 1. + void bump_size(); + //@} // Size accessors + + //! \name Subscript operators + //@{ + //! Returns a reference to the element of \p *this indexed by \p k. + Coefficient& operator[](dimension_type k); + + //! Returns a constant reference to the element of \p *this indexed by \p k. + Coefficient_traits::const_reference operator[](dimension_type k) const; + //@} // Subscript operators + + /*! \brief + Returns a lower bound to the total size in bytes of the memory + occupied by \p *this. + */ + memory_size_type total_memory_in_bytes() const; + + //! Returns the total size in bytes of the memory occupied by \p *this. + memory_size_type total_memory_in_bytes(dimension_type capacity) const; + + //! Returns the size in bytes of the memory managed by \p *this. + memory_size_type external_memory_in_bytes() const; + +private: + //! The number of coefficients in the row. + dimension_type size_; + + //! The flags of this row. + Row::Flags flags_; + + //! The vector of coefficients. + Coefficient vec_[ +#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + 1 +#endif + ]; + + //! Private and unimplemented: default construction is not allowed. + Impl(); + + //! Private and unimplemented: copy construction is not allowed. + Impl(const Impl& y); + + //! Private and unimplemented: assignment is not allowed. + Impl& operator=(const Impl&); +}; + +#include "Row.inlines.hh" + +#endif // !defined(PPL_Row_defs_hh) diff --git a/src/Row.inlines.hh b/src/Row.inlines.hh new file mode 100644 index 0000000..c63ab24 --- /dev/null +++ b/src/Row.inlines.hh @@ -0,0 +1,406 @@ +/* Row class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Row_inlines_hh +#define PPL_Row_inlines_hh 1 + +#include "math_utilities.defs.hh" +#include +#include +#include +#include + +namespace Parma_Polyhedra_Library { + +inline +Row::Flags::Flags() + : bits(0) { +} + +inline +Row::Flags::Flags(base_type n) + : bits(n) { +} + +inline Row::Flags::base_type +Row::Flags::get_bits() const { + return bits; +} + +inline void +Row::Flags::set_bits(const base_type mask) { + bits |= mask; +} + +inline void +Row::Flags::reset_bits(const base_type mask) { + bits &= ~mask; +} + +inline bool +Row::Flags::test_bits(const base_type mask) const { + return (bits & mask) == mask; +} + +inline bool +Row::Flags::operator==(const Flags& y) const { + base_type mask = low_bits_mask(first_free_bit); + return (get_bits() & mask) == (y.get_bits() & mask); +} + +inline bool +Row::Flags::operator!=(const Flags& y) const { + return !operator==(y); +} + +inline void* +Row_Impl_Handler::Impl::operator new(const size_t fixed_size, + const dimension_type capacity) { +#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + return ::operator new(fixed_size + capacity*sizeof(Coefficient)); +#else + assert(capacity >= 1); + return ::operator new(fixed_size + (capacity-1)*sizeof(Coefficient)); +#endif +} + +inline void +Row_Impl_Handler::Impl::operator delete(void* p) { + ::operator delete(p); +} + +inline void +Row_Impl_Handler::Impl::operator delete(void* p, dimension_type) { + ::operator delete(p); +} + +inline dimension_type +Row_Impl_Handler::Impl::max_size() { + return std::numeric_limits::max() / sizeof(Coefficient); +} + +inline dimension_type +Row_Impl_Handler::Impl::size() const { + return size_; +} + +inline void +Row_Impl_Handler::Impl::set_size(const dimension_type new_size) { + size_ = new_size; +} + +inline void +Row_Impl_Handler::Impl::bump_size() { + ++size_; +} + +inline +Row_Impl_Handler::Impl::Impl(const Row::Flags f) + : size_(0), flags_(f) { +} + +inline +Row_Impl_Handler::Impl::~Impl() { + shrink(0); +} + +inline const Row::Flags& +Row_Impl_Handler::Impl::flags() const { + return flags_; +} + +inline Row::Flags& +Row_Impl_Handler::Impl::flags() { + return flags_; +} + +inline Coefficient& +Row_Impl_Handler::Impl::operator[](const dimension_type k) { + assert(k < size()); + return vec_[k]; +} + +inline Coefficient_traits::const_reference +Row_Impl_Handler::Impl::operator[](const dimension_type k) const { + assert(k < size()); + return vec_[k]; +} + +inline memory_size_type +Row_Impl_Handler::Impl::total_memory_in_bytes(dimension_type capacity) const { + return + sizeof(*this) + + capacity*sizeof(Coefficient) +#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + - 1*sizeof(Coefficient) +#endif + + external_memory_in_bytes(); +} + +inline memory_size_type +Row_Impl_Handler::Impl::total_memory_in_bytes() const { + // In general, this is a lower bound, as the capacity of *this + // may be strictly greater than `size_' + return total_memory_in_bytes(size_); +} + +inline dimension_type +Row::max_size() { + return Impl::max_size(); +} + +inline dimension_type +Row::size() const { + return impl->size(); +} + +inline const Row::Flags& +Row::flags() const { + return impl->flags(); +} + +inline Row::Flags& +Row::flags() { + return impl->flags(); +} + +#if PPL_ROW_EXTRA_DEBUG +inline dimension_type +Row::capacity() const { + return capacity_; +} +#endif + +inline +Row_Impl_Handler::Row_Impl_Handler() + : impl(0) { +#if PPL_ROW_EXTRA_DEBUG + capacity_ = 0; +#endif +} + +inline +Row_Impl_Handler::~Row_Impl_Handler() { + delete impl; +} + +inline +Row::Row() + : Row_Impl_Handler() { +} + +inline void +Row::allocate( +#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + const +#endif + dimension_type capacity, + const Flags f) { + assert(capacity <= max_size()); +#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + if (capacity == 0) + ++capacity; +#endif + assert(impl == 0); + impl = new (capacity) Impl(f); +#if PPL_ROW_EXTRA_DEBUG + assert(capacity_ == 0); + capacity_ = capacity; +#endif +} + +inline void +Row::expand_within_capacity(const dimension_type new_size) { + assert(impl); +#if PPL_ROW_EXTRA_DEBUG + assert(new_size <= capacity_); +#endif + impl->expand_within_capacity(new_size); +} + +inline void +Row::copy_construct_coefficients(const Row& y) { + assert(impl && y.impl); +#if PPL_ROW_EXTRA_DEBUG + assert(y.size() <= capacity_); +#endif + impl->copy_construct_coefficients(*(y.impl)); +} + +inline void +Row::construct(const dimension_type sz, + const dimension_type capacity, + const Flags f) { + assert(sz <= capacity && capacity <= max_size()); + allocate(capacity, f); + expand_within_capacity(sz); +} + +inline void +Row::construct(const dimension_type sz, const Flags f) { + construct(sz, sz, f); +} + +inline +Row::Row(const dimension_type sz, + const dimension_type capacity, + const Flags f) + : Row_Impl_Handler() { + construct(sz, capacity, f); +} + +inline +Row::Row(const dimension_type sz, const Flags f) + : Row_Impl_Handler() { + construct(sz, f); +} + +inline +Row::Row(const Row& y) + : Row_Impl_Handler() { + if (y.impl) { + allocate(compute_capacity(y.size(), max_size()), y.flags()); + copy_construct_coefficients(y); + } +} + +inline +Row::Row(const Row& y, + const dimension_type capacity) + : Row_Impl_Handler() { + assert(y.impl); + assert(y.size() <= capacity && capacity <= max_size()); + allocate(capacity, y.flags()); + copy_construct_coefficients(y); +} + +inline +Row::Row(const Row& y, + const dimension_type sz, + const dimension_type capacity) + : Row_Impl_Handler() { + assert(y.impl); + assert(y.size() <= sz && sz <= capacity && capacity <= max_size()); + allocate(capacity, y.flags()); + copy_construct_coefficients(y); + expand_within_capacity(sz); +} + +inline +Row::~Row() { +} + +inline void +Row::shrink(const dimension_type new_size) { + assert(impl); + impl->shrink(new_size); +} + +inline void +Row::swap(Row& y) { + std::swap(impl, y.impl); +#if PPL_ROW_EXTRA_DEBUG + std::swap(capacity_, y.capacity_); +#endif +} + +inline void +Row::assign(Row& y) { + impl = y.impl; +#if PPL_ROW_EXTRA_DEBUG + capacity_ = y.capacity_; +#endif +} + +inline Row& +Row::operator=(const Row& y) { + // Copy-construct `tmp' from `y'. + Row tmp(y); + // Swap the implementation of `*this' with the one of `tmp'. + swap(tmp); + // Now `tmp' goes out of scope, so the old `*this' will be destroyed. + return *this; +} + +inline Coefficient& +Row::operator[](const dimension_type k) { + assert(impl); + return (*impl)[k]; +} + +inline Coefficient_traits::const_reference +Row::operator[](const dimension_type k) const { + assert(impl); + return (*impl)[k]; +} + +inline memory_size_type +Row::external_memory_in_bytes(dimension_type capacity) const { + return impl->total_memory_in_bytes(capacity); +} + +inline memory_size_type +Row::total_memory_in_bytes(dimension_type capacity) const { + return sizeof(*this) + external_memory_in_bytes(capacity); +} + +inline memory_size_type +Row::external_memory_in_bytes() const { +#if PPL_ROW_EXTRA_DEBUG + return impl->total_memory_in_bytes(capacity_); +#else + return impl->total_memory_in_bytes(); +#endif +} + +inline memory_size_type +Row::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +/*! \relates Row */ +inline bool +operator!=(const Row& x, const Row& y) { + return !(x == y); +} + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Row */ +inline void +swap(Parma_Polyhedra_Library::Row& x, Parma_Polyhedra_Library::Row& y) { + x.swap(y); +} + +/*! \relates Parma_Polyhedra_Library::Row */ +inline void +iter_swap(std::vector::iterator x, + std::vector::iterator y) { + swap(*x, *y); +} + +} // namespace std + +#endif // !defined(PPL_Row_inlines_hh) diff --git a/src/Row.types.hh b/src/Row.types.hh new file mode 100644 index 0000000..e8e2d5f --- /dev/null +++ b/src/Row.types.hh @@ -0,0 +1,22 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PPL_Row_types_hh +#define PPL_Row_types_hh 1 + +namespace Parma_Polyhedra_Library { + +class Row_Impl_Handler; +class Row; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Row_types_hh) diff --git a/src/Scalar_Products.cc b/src/Scalar_Products.cc new file mode 100644 index 0000000..852274c --- /dev/null +++ b/src/Scalar_Products.cc @@ -0,0 +1,160 @@ +/* Scalar_Products class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Scalar_Products.defs.hh" +#include "Coefficient.defs.hh" + +namespace PPL = Parma_Polyhedra_Library; + +void +PPL::Scalar_Products::assign(Coefficient& z, + const Linear_Row& x, const Linear_Row& y) { + // Scalar product is only defined if `x' and `y' are + // dimension-compatible. + assert(x.size() <= y.size()); + z = 0; + for (dimension_type i = x.size(); i-- > 0; ) + // The following line optimizes the computation of z += x[i] * y[i]. + add_mul_assign(z, x[i], y[i]); +} + +void +PPL::Scalar_Products::assign(Coefficient& z, + const Constraint& x, const Generator& y) { + // Scalar product is only defined if `x' and `y' are + // dimension-compatible. + assert(x.size() <= y.size()); + z = 0; + for (dimension_type i = x.size(); i-- > 0; ) + // The following line optimizes the computation of z += x[i] * y[i]. + add_mul_assign(z, x[i], y[i]); +} + +void +PPL::Scalar_Products::assign(Coefficient& z, + const Grid_Generator& x, const Congruence& y) { + // Scalar product is only defined if `x' and `y' are + // dimension-compatible. + assert(x.size() <= y.size()); + z = 0; + for (dimension_type i = x.size() - 1 /* parameter divisor */; i-- > 0; ) + // The following line optimizes the computation of z += x[i] * + // y[i]. + add_mul_assign(z, x[i], y[i]); +} + +void +PPL::Scalar_Products::assign(Coefficient& z, + const Constraint& x, + const Grid_Generator& y) { + // Scalar product is only defined if `x' and `y' are + // dimension-compatible. + assert(x.size() <= y.size()); + z = 0; + for (dimension_type i = x.size(); i-- > 0; ) + // The following line optimizes the computation of z += x[i] * y[i]. + add_mul_assign(z, x[i], y[i]); +} + +void +PPL::Scalar_Products::assign(Coefficient& z, + const Congruence& x, const Grid_Generator& y) { + // Scalar product is only defined if `x' and `y' are + // dimension-compatible. + assert(x.size() <= y.size()); + z = 0; + for (dimension_type i = x.size() - 1; i-- > 0; ) + // The following line optimizes the computation of z += x[i] * + // y[i]. + add_mul_assign(z, x[i], y[i]); +} + +void +PPL::Scalar_Products::reduced_assign(Coefficient& z, + const Linear_Row& x, + const Linear_Row& y) { + // The reduced scalar product is only defined + // if the topology of `x' is NNC and `y' has enough coefficients. + assert(!x.is_necessarily_closed()); + assert(x.size() - 1 <= y.size()); + z = 0; + for (dimension_type i = x.size() - 1; i-- > 0; ) + // The following line optimizes the computation of z += x[i] * y[i]. + add_mul_assign(z, x[i], y[i]); +} + +void +PPL::Scalar_Products::reduced_assign(Coefficient& z, + const Grid_Generator& x, + const Congruence& y) { + // The reduced scalar product is only defined if the topology of `x' + // is NNC and `y' has enough coefficients. + assert(x.size() <= y.size()); + z = 0; + for (dimension_type i = x.size() - 1; i-- > 0; ) + // The following line optimizes z += x[i] * y[i]. + add_mul_assign(z, x[i], y[i]); +} + +void +PPL::Scalar_Products::homogeneous_assign(Coefficient& z, + const Linear_Row& x, + const Linear_Row& y) { + // Scalar product is only defined if `x' and `y' are + // dimension-compatible. + assert(x.size() <= y.size()); + z = 0; + // Note the pre-decrement of `i': last iteration should be for `i == 1'. + for (dimension_type i = x.size(); --i > 0; ) + // The following line optimizes the computation of z += x[i] * y[i]. + add_mul_assign(z, x[i], y[i]); +} + +void +PPL::Scalar_Products::homogeneous_assign(Coefficient& z, + const Grid_Generator& x, + const Congruence& y) { + // Scalar product is only defined if `x' and `y' are + // dimension-compatible. + assert(x.size() <= y.size()); + z = 0; + // Note the pre-decrement of `i': last iteration should be for `i == 1'. + for (dimension_type i = x.size() - 1; --i > 0; ) + // The following line optimizes the computation of z += x[i] * y[i]. + add_mul_assign(z, x[i], y[i]); +} + +void +PPL::Scalar_Products::homogeneous_assign(Coefficient& z, + const Grid_Generator& x, + const Constraint& y) { + // Scalar product is only defined if `x' and `y' are + // dimension-compatible. + assert(x.size() - 1 <= y.size()); + z = 0; + // Note the pre-decrement of `i': last iteration should be for `i == 1'. + for (dimension_type i = x.size() - 1; --i > 0; ) + // The following line optimizes the computation of z += x[i] * y[i]. + add_mul_assign(z, x[i], y[i]); +} diff --git a/src/Scalar_Products.defs.hh b/src/Scalar_Products.defs.hh new file mode 100644 index 0000000..a699dd5 --- /dev/null +++ b/src/Scalar_Products.defs.hh @@ -0,0 +1,197 @@ +/* Scalar_Products class definition. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Scalar_Products_defs_hh +#define PPL_Scalar_Products_defs_hh 1 + +#include "Scalar_Products.types.hh" +#include "Linear_Row.types.hh" +#include "Coefficient.types.hh" +#include "Linear_Expression.types.hh" +#include "Constraint.types.hh" +#include "Generator.types.hh" +#include "Congruence.types.hh" +#include "Grid_Generator.types.hh" + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! A class implementing various scalar product functions. +/*! \ingroup PPL_CXX_interface + When computing the scalar product of (Linear_Row or Constraint or + Generator) objects x and y, it is assumed + that the space dimension of the first object x is less + than or equal to the space dimension of the second object y. +*/ +#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_Row& x, const Linear_Row& y); + //! Computes the scalar product of \p c and \p g and assigns it to \p z. + static void assign(Coefficient& z, const Constraint& c, const Generator& g); + //! Computes the scalar product of \p g and \p c and assigns it to \p z. + static void assign(Coefficient& z, const Generator& g, const Constraint& c); + //! Computes the scalar product of \p c and \p g and assigns it to \p z. + static void assign(Coefficient& z, + const Constraint& c, const Grid_Generator& g); + //! Computes the scalar product of \p g and \p cg and assigns it to \p z. + static void assign(Coefficient& z, + const Grid_Generator& g, const Congruence& cg); + //! Computes the scalar product of \p cg and \p g and assigns it to \p z. + static void assign(Coefficient& z, + const Congruence& cg, const Grid_Generator& g); + + //! Returns the sign of the scalar product between \p x and \p y. + static int sign(const Linear_Row& x, const Linear_Row& y); + //! Returns the sign of the scalar product between \p c and \p g. + static int sign(const Constraint& c, const Generator& g); + //! Returns the sign of the scalar product between \p g and \p c. + static int sign(const Generator& g, const Constraint& c); + //! 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_Row& x, const Linear_Row& y); + /*! \brief + Computes the \e reduced scalar product of \p c and \p g, + where the \f$\epsilon\f$ coefficient of \p c is ignored, + and assigns the result to \p z. + */ + static void reduced_assign(Coefficient& z, + const Constraint& c, const Generator& g); + /*! \brief + Computes the \e reduced scalar product of \p g and \p c, + where the \f$\epsilon\f$ coefficient of \p g is ignored, + and assigns the result to \p z. + */ + static void reduced_assign(Coefficient& z, + const Generator& g, const Constraint& c); + //! \brief + //! Computes the \e reduced scalar product of \p g and \p cg, + //! where the \f$\epsilon\f$ coefficient of \p g is ignored, + //! and assigns the result to \p z. + static void reduced_assign(Coefficient& z, + const Grid_Generator& g, const Congruence& cg); + + /*! \brief + Returns the sign of the \e reduced scalar product of \p x and \p y, + where the \f$\epsilon\f$ coefficient of \p x is ignored. + */ + static int reduced_sign(const Linear_Row& x, const Linear_Row& y); + /*! \brief + Returns the sign of the \e reduced scalar product of \p c and \p g, + where the \f$\epsilon\f$ coefficient of \p c is ignored. + */ + static int reduced_sign(const Constraint& c, const Generator& g); + /*! \brief + Returns the sign of the \e reduced scalar product of \p g and \p c, + where the \f$\epsilon\f$ coefficient of \p g is ignored. + */ + static int reduced_sign(const Generator& g, const Constraint& c); + + /*! \brief + Computes the \e homogeneous scalar product of \p x and \p y, + where the inhomogeneous terms are ignored, + and assigns the result to \p z. + */ + static void homogeneous_assign(Coefficient& z, + const Linear_Row& x, const Linear_Row& y); + /*! \brief + Computes the \e homogeneous scalar product of \p e and \p g, + where the inhomogeneous terms are ignored, + and assigns the result to \p z. + */ + static void homogeneous_assign(Coefficient& z, + const Linear_Expression& e, + const Generator& g); + //! \brief + //! Computes the \e homogeneous scalar product of \p g and \p c, + //! where the inhomogeneous terms are ignored, + //! and assigns the result to \p z. + static void homogeneous_assign(Coefficient& z, + const Grid_Generator& g, 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& g, const Congruence& cg); + //! \brief + //! Computes the \e homogeneous scalar product of \p e and \p g, + //! where the inhomogeneous terms are ignored, + //! and assigns the result to \p z. + static void homogeneous_assign(Coefficient& z, + const Linear_Expression& e, + const Grid_Generator& g); + + /*! \brief + Returns the sign of the \e homogeneous scalar product of \p x and \p y, + where the inhomogeneous terms are ignored. + */ + static int homogeneous_sign(const Linear_Row& x, const Linear_Row& y); + /*! \brief + Returns the sign of the \e homogeneous scalar product of \p e and \p g, + where the inhomogeneous terms are ignored. + */ + static int homogeneous_sign(const Linear_Expression& e, const Generator& g); + //! \brief + //! Returns the sign of the \e homogeneous scalar product of \p e and \p g, + //! where the inhomogeneous terms are ignored, + static int homogeneous_sign(const Linear_Expression& e, + const Grid_Generator& g); + //! \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 (*SPS_type)(const Linear_Row&, const Linear_Row&); + + //! The scalar product sign function pointer. + SPS_type sps_fp; +}; + +#include "Scalar_Products.inlines.hh" + +#endif // !defined(PPL_Scalar_Products_defs_hh) diff --git a/src/Scalar_Products.inlines.hh b/src/Scalar_Products.inlines.hh new file mode 100644 index 0000000..70a02d5 --- /dev/null +++ b/src/Scalar_Products.inlines.hh @@ -0,0 +1,167 @@ +/* Scalar_Products class implementation (inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Scalar_Products_inlines_hh +#define PPL_Scalar_Products_inlines_hh 1 + +#include "Linear_Row.defs.hh" +#include "Linear_Expression.defs.hh" +#include "Constraint.defs.hh" +#include "Generator.defs.hh" +#include "Congruence.defs.hh" +#include "Grid_Generator.defs.hh" + +namespace Parma_Polyhedra_Library { + +inline int +Scalar_Products::sign(const Linear_Row& x, const Linear_Row& y) { + PPL_DIRTY_TEMP_COEFFICIENT(z); + assign(z, x, y); + return sgn(z); +} + +inline int +Scalar_Products::reduced_sign(const Linear_Row& x, const Linear_Row& y) { + PPL_DIRTY_TEMP_COEFFICIENT(z); + reduced_assign(z, x, y); + return sgn(z); +} + +inline int +Scalar_Products::homogeneous_sign(const Linear_Row& x, const Linear_Row& 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(static_cast(c), + static_cast(g)); +} + +inline int +Scalar_Products::sign(const Generator& g, const Constraint& c) { + return sign(static_cast(g), + static_cast(c)); +} + +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) { + return reduced_sign(static_cast(c), + static_cast(g)); +} + +inline int +Scalar_Products::reduced_sign(const Generator& g, const Constraint& c) { + return reduced_sign(static_cast(g), + static_cast(c)); +} + +inline void +Scalar_Products::homogeneous_assign(Coefficient& z, + const Linear_Expression& e, + const Generator& g) { + homogeneous_assign(z, + static_cast(e), + static_cast(g)); +} + +inline void +Scalar_Products::homogeneous_assign(Coefficient& z, + const Linear_Expression& e, + const Grid_Generator& g) { + homogeneous_assign(z, + static_cast(e), + static_cast(g)); +} + +inline int +Scalar_Products::homogeneous_sign(const Linear_Expression& e, + const Generator& g) { + return homogeneous_sign(static_cast(e), + static_cast(g)); +} + +inline int +Scalar_Products::homogeneous_sign(const Linear_Expression& e, + const Grid_Generator& g) { + return homogeneous_sign(static_cast(e), + static_cast(g)); +} + +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(&Scalar_Products::sign) + : static_cast(&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(&Scalar_Products::sign) + : static_cast(&Scalar_Products::reduced_sign)) { +} + +inline int +Topology_Adjusted_Scalar_Product_Sign::operator()(const Constraint& c, + const Generator& g) const { + assert(c.space_dimension() <= g.space_dimension()); + assert(sps_fp == (c.is_necessarily_closed() + ? static_cast(&Scalar_Products::sign) + : static_cast(&Scalar_Products::reduced_sign))); + return sps_fp(static_cast(c), + static_cast(g)); +} + +inline int +Topology_Adjusted_Scalar_Product_Sign::operator()(const Generator& g, + const Constraint& c) const { + assert(g.space_dimension() <= c.space_dimension()); + assert(sps_fp == (g.is_necessarily_closed() + ? static_cast(&Scalar_Products::sign) + : static_cast(&Scalar_Products::reduced_sign))); + return sps_fp(static_cast(g), + static_cast(c)); +} + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Scalar_Products_inlines_hh) diff --git a/src/Scalar_Products.types.hh b/src/Scalar_Products.types.hh new file mode 100644 index 0000000..24126fc --- /dev/null +++ b/src/Scalar_Products.types.hh @@ -0,0 +1,23 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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..f7cfbbd --- /dev/null +++ b/src/Slow_Copy.hh @@ -0,0 +1,60 @@ +/* Basic Slow_Copy classes declarations. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Slow_Copy_hh +#define PPL_Slow_Copy_hh 1 + +#include "meta_programming.hh" +#include + +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 +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 : 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 : public True { +}; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Slow_Copy_hh) diff --git a/src/Temp.defs.hh b/src/Temp.defs.hh new file mode 100644 index 0000000..202dea3 --- /dev/null +++ b/src/Temp.defs.hh @@ -0,0 +1,160 @@ +/* Temp_* classes declarations. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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 +class Temp_Item { +public: + //! Obtains a refeence 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 +class Temp_Reference_Holder { +public: + //! Constructs an holder holding \p p. + Temp_Reference_Holder(Temp_Item& p); + + //! Destructor. + ~Temp_Reference_Holder(); + + //! Returns a reference to the held item. + T& item(); + +private: + //! The held item, encapsulated. + Temp_Item& 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 +class Temp_Value_Holder { +public: + //! Constructs a fake holder. + Temp_Value_Holder(); + + //! Returns the value of the held item. + T item(); + +private: + //! The held item. + T item_; +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! A structure for handling temporaries with a global free list. +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +struct Temp_From_Free_List { + //! The type of the temporaries. + typedef T& type; + + //! The type of the holder. + typedef Temp_Reference_Holder holder_type; + + //! Obtain the holder for a new temporary. + static holder_type obtain_holder(); +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! A structure for handling temporaries with local variables. +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +struct Temp_From_Local_Variable { + //! The type of the temporaries. + typedef T type; + + //! The type of the holder. + typedef Temp_Value_Holder holder_type; + + //! Obtain the holder for a new temporary. + static holder_type obtain_holder(); +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! A structure for the efficient handling of temporaries. +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +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 +class Dirty_Temp::value>::type> + : public Temp_From_Free_List { +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specialization for the handling of temporaries with local variables. +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +class Dirty_Temp::value>::type> + : public Temp_From_Local_Variable { +}; + +} // 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..55cfbe2 --- /dev/null +++ b/src/Temp.inlines.hh @@ -0,0 +1,115 @@ +/* Temp_* classes implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Temp_inlines_hh +#define PPL_Temp_inlines_hh 1 + +#include "meta_programming.hh" + +namespace Parma_Polyhedra_Library { + +template +inline +Temp_Item::Temp_Item() + : item_() { +} + +template +inline T& +Temp_Item::item() { + return item_; +} + +template +inline Temp_Item& +Temp_Item::obtain() { + if (free_list_head != 0) { + Temp_Item* p = free_list_head; + free_list_head = free_list_head->next; + return *p; + } + else + return *new Temp_Item(); +} + +template +inline void +Temp_Item::release(Temp_Item& p) { + p.next = free_list_head; + free_list_head = &p; +} + +template +inline +Temp_Reference_Holder::Temp_Reference_Holder(Temp_Item& p) + : held(p) { +} + +template +inline +Temp_Reference_Holder::~Temp_Reference_Holder() { + Temp_Item::release(held); +} + +template +inline T& +Temp_Reference_Holder::item() { + return held.item(); +} + +template +inline +Temp_Value_Holder::Temp_Value_Holder() { +} + +template +inline T +Temp_Value_Holder::item() { + return item_; +} + +template +inline typename Temp_From_Free_List::holder_type +Temp_From_Free_List::obtain_holder() { + return Temp_Reference_Holder(Temp_Item::obtain()); +} + +template +inline typename Temp_From_Local_Variable::holder_type +Temp_From_Local_Variable::obtain_holder() { + return Temp_Value_Holder(); +} + +} // namespace Parma_Polyhedra_Library + +#define PPL_DIRTY_TEMP(T, id) \ + typename Parma_Polyhedra_Library::Dirty_Temp::holder_type holder ## id = \ + Parma_Polyhedra_Library::Dirty_Temp::obtain_holder(); \ + typename Parma_Polyhedra_Library::Dirty_Temp::type id = \ + holder ## id.item() + +#define PPL_DIRTY_TEMP0(T, id) \ + Parma_Polyhedra_Library::Dirty_Temp::holder_type holder ## id = \ + Parma_Polyhedra_Library::Dirty_Temp::obtain_holder(); \ + Parma_Polyhedra_Library::Dirty_Temp::type 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..bb1453a --- /dev/null +++ b/src/Temp.templates.hh @@ -0,0 +1,33 @@ +/* Temp_* classes implementation: non-inline template members. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Temp_templates_hh +#define PPL_Temp_templates_hh 1 + +namespace Parma_Polyhedra_Library { + +template +Temp_Item* Temp_Item::free_list_head = 0; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Temp_templates_hh) diff --git a/src/Topology.hh b/src/Topology.hh new file mode 100644 index 0000000..8b9360a --- /dev/null +++ b/src/Topology.hh @@ -0,0 +1,28 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PPL_Topology_hh +#define PPL_Topology_hh 1 + +namespace Parma_Polyhedra_Library { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Kinds of polyhedra domains. +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +enum Topology { + NECESSARILY_CLOSED = 0, + NOT_NECESSARILY_CLOSED = 1 +}; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Topology_hh) diff --git a/src/Variable.cc b/src/Variable.cc new file mode 100644 index 0000000..88ab86c --- /dev/null +++ b/src/Variable.cc @@ -0,0 +1,50 @@ +/* Variable class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include +#include "Variable.defs.hh" +#include + +namespace PPL = Parma_Polyhedra_Library; + +PPL::Variable::output_function_type* +PPL::Variable::current_output_function = 0; + +bool +PPL::Variable::OK() const { + return id() < max_space_dimension(); +} + +void +PPL::Variable::default_output_function(std::ostream& s, const Variable& v) { + dimension_type varid = v.id(); + s << static_cast('A' + varid % 26); + if (dimension_type i = varid / 26) + s << i; +} + +/*! \relates Parma_Polyhedra_Library::Variable */ +std::ostream& +PPL::IO_Operators::operator<<(std::ostream& s, const Variable& v) { + (*Variable::current_output_function)(s, v); + return s; +} diff --git a/src/Variable.defs.hh b/src/Variable.defs.hh new file mode 100644 index 0000000..203de66 --- /dev/null +++ b/src/Variable.defs.hh @@ -0,0 +1,148 @@ +/* Variable class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Variable_defs_hh +#define PPL_Variable_defs_hh 1 + +#include "Variable.types.hh" +#include "Init.types.hh" +#include "globals.types.hh" +#include +#include + +namespace Parma_Polyhedra_Library { + +namespace IO_Operators { + +//! Output operator. +/*! \relates Parma_Polyhedra_Library::Variable */ +std::ostream& +operator<<(std::ostream& s, const Variable& v); + +} // namespace IO_Operators + +//! Defines a total ordering on variables. +/*! \relates Variable */ +bool less(Variable v, Variable w); + +} // namespace Parma_Polyhedra_Library + +//! A dimension of the vector space. +/*! \ingroup PPL_CXX_interface + An object of the class Variable represents a dimension of the space, + that is one of the Cartesian axes. + Variables are used as basic blocks in order to build + more complex linear expressions. + Each variable is identified by a non-negative integer, + representing the index of the corresponding Cartesian axis + (the first axis has index 0). + The space dimension of a variable is the dimension of the vector space + made by all the Cartesian axes having an index less than or equal to + that of the considered variable; thus, if a variable has index \f$i\f$, + its space dimension is \f$i+1\f$. + + Note that the ``meaning'' of an object of the class Variable + is completely specified by the integer index provided to its + constructor: + be careful not to be mislead by C++ language variable names. + For instance, in the following example the linear expressions + e1 and e2 are equivalent, + since the two variables x and z 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 i+1 exceeds + Variable::max_space_dimension(). + */ + 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 id()+1. + */ + dimension_type space_dimension() const; + + //! Returns the total size in bytes of the memory occupied by \p *this. + memory_size_type total_memory_in_bytes() const; + + //! Returns the size in bytes of the memory managed by \p *this. + memory_size_type external_memory_in_bytes() const; + + //! Checks if all the invariants are satisfied. + bool OK() const; + + //! Type of output functions. + typedef void output_function_type(std::ostream& s, const Variable& v); + + //! Sets the output function to be used for printing Variable objects. + static void set_output_function(output_function_type* p); + + //! Returns the pointer to the current output function. + static output_function_type* get_output_function(); + + //! Binary predicate defining the total ordering on variables. + /*! \ingroup PPL_CXX_interface */ + struct Compare { + //! Returns true if and only if \p x comes before \p y. + bool operator()(Variable x, Variable y) const; + }; + +private: + //! The index of the Cartesian axis. + dimension_type varid; + + // The initialization class needs to set the default output function. + friend class Init; + + friend std::ostream& + Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s, + const Variable& v); + + //! Pointer to the current output function. + static output_function_type* current_output_function; + + //! The default output function. + static void default_output_function(std::ostream& s, const Variable& v); +}; + +#include "Variable.inlines.hh" + +#endif // !defined(PPL_Variable_defs_hh) diff --git a/src/Variable.inlines.hh b/src/Variable.inlines.hh new file mode 100644 index 0000000..b03f201 --- /dev/null +++ b/src/Variable.inlines.hh @@ -0,0 +1,88 @@ +/* Variable class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Variable_inlines_hh +#define PPL_Variable_inlines_hh 1 + +#include "globals.defs.hh" +#include + +namespace Parma_Polyhedra_Library { + +inline dimension_type +Variable::max_space_dimension() { + return not_a_dimension() - 1; +} + +inline +Variable::Variable(dimension_type i) + : varid(i < max_space_dimension() + ? i + : (throw std::length_error("PPL::Variable::Variable(i):\n" + "i exceeds the maximum allowed " + "variable identifier."), i)) { +} + +inline dimension_type +Variable::id() const { + return varid; +} + +inline dimension_type +Variable::space_dimension() const { + return varid + 1; +} + +inline memory_size_type +Variable::external_memory_in_bytes() const { + return 0; +} + +inline memory_size_type +Variable::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +inline void +Variable::set_output_function(output_function_type* p) { + current_output_function = p; +} + +inline Variable::output_function_type* +Variable::get_output_function() { + return current_output_function; +} + +/*! \relates Variable */ +inline bool +less(const Variable v, const Variable w) { + return v.id() < w.id(); +} + +inline bool +Variable::Compare::operator()(const Variable x, const Variable y) const { + return less(x, y); +} + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Variable_inlines_hh) diff --git a/src/Variable.types.hh b/src/Variable.types.hh new file mode 100644 index 0000000..04e7d6c --- /dev/null +++ b/src/Variable.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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..7da9156 --- /dev/null +++ b/src/Variables_Set.cc @@ -0,0 +1,90 @@ +/* Variables_Set class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include +#include "Variables_Set.defs.hh" +#include + +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++); + if (i != vs_end) + s << ','; + } + s << " }"; + return s; +} + +void +PPL::Variables_Set::ascii_dump(std::ostream& s) 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; + + dimension_type variable_value; + for (dimension_type i = 0; i < size; ++i) { + 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..6692c69 --- /dev/null +++ b/src/Variables_Set.defs.hh @@ -0,0 +1,106 @@ +/* Variables_Set class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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 +#include + +namespace Parma_Polyhedra_Library { + +namespace IO_Operators { + +//! Output operator. +/*! \relates Parma_Polyhedra_Library::Variables_Set */ +std::ostream& +operator<<(std::ostream& s, const Variables_Set& v); + +} // namespace IO_Operators + +} // namespace Parma_Polyhedra_Library + +//! An std::set of variables' indexes. +class Parma_Polyhedra_Library::Variables_Set + : public std::set { +private: + typedef std::set Base; + +public: + //! Builds the empty set of variable indexes. + Variables_Set(); + + //! Builds the singleton set of indexes containing v.id(); + explicit Variables_Set(const Variable& v); + + /*! \brief + Builds the set of variables's indexes in the range from + v.id() to w.id(). + + If v.id() <= w.id(), this constructor builds the + set of variables' indexes + v.id(), v.id()+1, ..., w.id(). + The empty set it 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 variavle \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 true if successful, false 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..682bc73 --- /dev/null +++ b/src/Variables_Set.inlines.hh @@ -0,0 +1,74 @@ +/* Variables_Set class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Variables_Set_inlines_hh +#define PPL_Variables_Set_inlines_hh 1 + +#include "globals.defs.hh" +#include + +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..c7c9864 --- /dev/null +++ b/src/Variables_Set.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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/Widening_Function.defs.hh b/src/Widening_Function.defs.hh new file mode 100644 index 0000000..adcce51 --- /dev/null +++ b/src/Widening_Function.defs.hh @@ -0,0 +1,126 @@ +/* Widening_Function class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Widening_Function_defs_hh +#define PPL_Widening_Function_defs_hh 1 + +#include "Widening_Function.types.hh" +#include "Constraint_System.types.hh" + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Wraps a widening method into a function object. +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +class Parma_Polyhedra_Library::Widening_Function { +public: + //! The (parametric) type of a widening method. + typedef void (PH::* Widening_Method)(const PH&, unsigned*); + + //! Explicit unary constructor. + explicit + Widening_Function(Widening_Method wm); + + //! Function-application operator. + /*! + Computes (x.*wm)(y, tp), where \p wm is the widening + method stored at construction time. + */ + void operator()(PH& x, const PH& y, unsigned* tp = 0) const; + +private: + //! The widening method. + Widening_Method w_method; +}; + + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Wraps a limited widening method into a function object. +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +class Parma_Polyhedra_Library::Limited_Widening_Function { +public: + //! The (parametric) type of a limited widening method. + typedef void (PH::* Limited_Widening_Method)(const PH&, + const CS&, + unsigned*); + + //! Constructor. + /*! + \param lwm + The limited widening method. + + \param cs + The constraint system limiting the widening. + */ + Limited_Widening_Function(Limited_Widening_Method lwm, + const CS& cs); + + //! Function-application operator. + /*! + Computes (x.*lwm)(y, cs, tp), where \p lwm and \p cs + are the limited widening method and the constraint system stored + at construction time. + */ + void operator()(PH& x, const PH& y, unsigned* tp = 0) const; + +private: + //! The limited widening method. + Limited_Widening_Method lw_method; + //! A constant reference to the constraint system limiting the widening. + const CS& limiting_cs; +}; + +namespace Parma_Polyhedra_Library { + +//! Wraps a widening method into a function object. +/*! + \relates Pointset_Powerset + + \param wm + The widening method. +*/ +template +Widening_Function +widen_fun_ref(void (PH::* wm)(const PH&, 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 +Limited_Widening_Function +widen_fun_ref(void (PH::* lwm)(const PH&, const CS&, unsigned*), + const CS& cs); + +} // namespace Parma_Polyhedra_Library + +#include "Widening_Function.inlines.hh" + +#endif // !defined(PPL_Widening_Function_defs_hh) diff --git a/src/Widening_Function.inlines.hh b/src/Widening_Function.inlines.hh new file mode 100644 index 0000000..c7ac672 --- /dev/null +++ b/src/Widening_Function.inlines.hh @@ -0,0 +1,74 @@ +/* Widening_Function class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Widening_Function_inlines_hh +#define PPL_Widening_Function_inlines_hh 1 + +#include + +namespace Parma_Polyhedra_Library { + +template +Widening_Function::Widening_Function(Widening_Method wm) + : w_method(wm) { +} + +template +inline void +Widening_Function:: +operator()(PH& x, const PH& y, unsigned* tp) const { + (x.*w_method)(y, tp); +} + +template +Limited_Widening_Function:: +Limited_Widening_Function(Limited_Widening_Method lwm, + const CS& cs) + : lw_method(lwm), limiting_cs(cs) { +} + +template +inline void +Limited_Widening_Function:: +operator()(PH& x, const PH& y, unsigned* tp) const { + (x.*lw_method)(y, limiting_cs, tp); +} + +/*! \relates Pointset_Powerset */ +template +inline Widening_Function +widen_fun_ref(void (PH::* wm)(const PH&, unsigned*)) { + return Widening_Function(wm); +} + +/*! \relates Pointset_Powerset */ +template +inline Limited_Widening_Function +widen_fun_ref(void (PH::* lwm)(const PH&, const CS&, unsigned*), + const CS& cs) { + return Limited_Widening_Function(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..64dcede --- /dev/null +++ b/src/Widening_Function.types.hh @@ -0,0 +1,25 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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 +class Widening_Function; + +template +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..d6f429c --- /dev/null +++ b/src/algorithms.hh @@ -0,0 +1,71 @@ +/* A collection of useful convex polyhedra algorithms: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_algorithms_hh +#define PPL_algorithms_hh 1 + +#include "NNC_Polyhedron.defs.hh" +#include "Pointset_Powerset.defs.hh" +#include +#include + +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 true is returned, + otherwise false is returned. + + \relates Polyhedron +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +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 +bool +poly_hull_assign_if_exact(PH& p, const PH& q) { + PH phull = p; + NNC_Polyhedron nnc_p(p); + phull.poly_hull_assign(q); + std::pair > + partition = linear_partition(q, phull); + const Pointset_Powerset& s = partition.second; + typedef Pointset_Powerset::const_iterator iter; + for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i) + // The polyhedral hull is exact if and only if all the elements + // of the partition of the polyhedral hull of `p' and `q' with + // respect to `q' are included in `p' + if (!nnc_p.contains(i->element())) + return false; + p = phull; + return true; +} + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_algorithms_hh) diff --git a/src/assign_or_swap.hh b/src/assign_or_swap.hh new file mode 100644 index 0000000..6c12f5c --- /dev/null +++ b/src/assign_or_swap.hh @@ -0,0 +1,69 @@ +/* The assign_or_swap() utility functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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 +inline typename Enable_If::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 +inline typename Enable_If::value + && !Slow_Copy::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 std::swap(). +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +inline typename Enable_If::value + && Slow_Copy::value, void>::type +assign_or_swap(T& to, T& from) { + std::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..a4fdf0c --- /dev/null +++ b/src/c_streambuf.cc @@ -0,0 +1,101 @@ +/* c_streambuf class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "c_streambuf.defs.hh" + +namespace Parma_Polyhedra_Library { + +c_streambuf::int_type +c_streambuf::uflow() { + int_type c = underflow(); + nextc_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(nextc_buf, eof)) { + char buf; + if (cb_read(&buf, 1) == 1) + nextc_buf = buf; + else + nextc_buf = eof; + } + return nextc_buf; +} + +std::streamsize +c_streambuf::xsgetn(char_type* s, std::streamsize n) { + if (n == 0) + return n; + const int_type eof = traits_type::eof(); + int a; + if (traits_type::eq_int_type(nextc_buf, eof)) + a = 0; + else { + s[0] = nextc_buf; + a = 1; + } + std::streamsize r = cb_read(s + a, n - a) + a; + if (r > 0) + ungetc_buf = traits_type::to_int_type(s[r - 1]); + else + ungetc_buf = traits_type::eof(); + return r; +} + +c_streambuf::int_type +c_streambuf::pbackfail(int_type c) { + const int_type eof = traits_type::eof(); + nextc_buf = traits_type::eq_int_type(c, eof) ? ungetc_buf : c; + ungetc_buf = eof; + return nextc_buf; +} + +std::streamsize +c_streambuf::xsputn(const char_type* s, std::streamsize n) { + return cb_write(s, n); +} + +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() ? eof : traits_type::not_eof(c); + else { + char buf = 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..6e406a8 --- /dev/null +++ b/src/c_streambuf.defs.hh @@ -0,0 +1,123 @@ +/* c_streambuf class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_c_streambuf_defs_hh +#define PPL_c_streambuf_defs_hh 1 + +#include "c_streambuf.types.hh" +#include + +class Parma_Polyhedra_Library::c_streambuf + : public std::basic_streambuf > { +public: + //! Constructor. + c_streambuf(); + virtual ~c_streambuf(); + +protected: + /*! \brief + Gets a character in case of underflow. + + \remarks + Specified by ISO/IEC 14882:1998: 27.5.2.4.3. + */ + 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. + */ + int_type uflow(); + + /*! \brief + Gets a sequence of characters. + + \remarks + Specified by ISO/IEC 14882:1998: 27.5.2.4.3. + */ + 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. + */ + 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. + */ + 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. + */ + int_type overflow(int_type c); + + /*! \brief + Synchronizes the stream buffer. + + Specified by ISO/IEC 14882:1998: 27.5.2.4.2. + */ + int sync(); + +private: + //! Character type of the streambuf. + typedef char char_type; + + //! Traits type of the streambuf. + typedef std::char_traits traits_type; + + //! Integer type of the streambuf. + typedef traits_type::int_type int_type; + + //! Buffer for the last character read. + int_type ungetc_buf; + + //! Buffer for next character + int_type nextc_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..d6b8718 --- /dev/null +++ b/src/c_streambuf.inlines.hh @@ -0,0 +1,39 @@ +/* c_streambuf class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_c_streambuf_inlines_hh +#define PPL_c_streambuf_inlines_hh 1 + +namespace Parma_Polyhedra_Library { + +inline +c_streambuf::c_streambuf() + : ungetc_buf(traits_type::eof()), nextc_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..c9aea28 --- /dev/null +++ b/src/c_streambuf.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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..bd19e2b --- /dev/null +++ b/src/checked.cc @@ -0,0 +1,376 @@ +/* Helper functions for checked numbers + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include +#include "checked.defs.hh" +#include + +namespace Parma_Polyhedra_Library { + +namespace Checked { + +//! Holds the precision parameter used for rational sqrt calculations. +unsigned long rational_sqrt_precision_parameter; + +struct number_struct { + unsigned int base; + bool neg_mantissa; + bool neg_exponent; + std::string mantissa; + unsigned long exponent; +}; + +/*! \brief + Returns the integer value associated with the ASCII code \p c, in + the base \p base positional number system, if there is such an + association; returns \f$-1\f$ otherwise. +*/ +inline int +get_digit(int c, int base = 10) { + if (c >= '0' && c < '0' + (base > 10 ? 10 : base)) + return c - '0'; + if (base > 10) { + base -= 10; + if (c >= 'A' && c < 'A' + base) + return c - 'A' + 10; + if (c >= 'a' && c < 'a' + base) + return c - 'a' + 10; + } + return -1; +} + +/*! \brief + Adds the number represented (in the modulus-and-sign representation) + by \p b_neg and \p b_mod to the number represented by \p a_neg and + \p a_mod, assigning the result to the latter. Returns + false is the result cannot be represented; returns + true otherwise. +*/ +inline bool +sum_sign(bool& a_neg, unsigned long& a_mod, + bool b_neg, unsigned long b_mod) { + if (a_neg == b_neg) { + if (a_mod > ULONG_MAX - b_mod) + return false; + a_mod += b_mod; + } + else if (a_mod >= b_mod) + a_mod -= b_mod; + else { + a_neg = !a_neg; + a_mod = b_mod - a_mod; + } + return true; +} + + +/*! \brief + Helper function for parse_number(): reads the numerator or + denominator part of a number from \p is into \p num, returning the + appropriate Result value. +*/ +Result +parse_number_part(std::istream& is, number_struct& num) { + enum { BASE, INTEGER, FRACTIONAL, EXPONENT } state = BASE; + 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; + num.base = 10; + num.neg_mantissa = false; + num.neg_exponent = false; + num.mantissa.erase(); + num.exponent = 0; + int c; + do { + c = is.get(); + } while (isspace(c)); + switch (c) { + case '-': + num.neg_mantissa = true; + // Fall through. + case '+': + c = is.get(); + if (c == 'i' || c == 'I') + goto inf; + break; + case 'n': + case 'N': + c = is.get(); + if (c != 'a' && c != 'A') + goto error; + c = is.get(); + if (c != 'n' && c != 'N') + goto error; + return VC_NAN; + inf: + case 'i': + case 'I': + c = is.get(); + if (c != 'n' && c != 'n') + goto error; + c = is.get(); + if (c != 'f' && c != 'F') + goto error; + return num.neg_mantissa ? VC_MINUS_INFINITY : VC_PLUS_INFINITY; + } + if (get_digit(c, 10) < 0) + goto error; + if (c == '0') { + int d = is.get(); + if (d == 'x' || d == 'X') { + num.base = 16; + state = INTEGER; + c = is.get(); + } + else { + c = d; + empty_mantissa = false; + } + } + else { + num.mantissa += (char) c; + empty_mantissa = false; + c = is.get(); + } + while (true) { + switch (state) { + case BASE: + if (get_digit(c, 10) >= 0) { + if (c != '0' || !num.mantissa.empty()) + num.mantissa += (char) c; + empty_mantissa = false; + break; + } + if (c == '^') { + c = is.get(); + if (c != '^') + goto error; + std::string::const_iterator i; + num.base = 0; + for (i = num.mantissa.begin(); i != num.mantissa.end(); i++) { + num.base = num.base * 10 + (*i - '0'); + if (num.base > 36) + goto error; + } + if (num.base < 2) + goto error; + num.mantissa.erase(); + empty_mantissa = true; + state = INTEGER; + break; + } + goto integer; + case INTEGER: + if (get_digit(c, num.base) >= 0) { + if (c != '0' || !num.mantissa.empty()) + num.mantissa += (char) c; + empty_mantissa = false; + break; + } + integer: + if (c == '.') { + state = FRACTIONAL; + break; + } + goto fractional; + case FRACTIONAL: + if (get_digit(c, num.base) >= 0) { + --exponent_offset; + if (c != '0' || !num.mantissa.empty()) + num.mantissa += (char) c; + empty_mantissa = false; + break; + } + fractional: + if (empty_mantissa) + goto error; + if (c == 'e' || c == 'E') + goto exp; + if (c == '*') { + c = is.get(); + if (c != '^') + goto error; + exp: + state = EXPONENT; + max_exp_div = LONG_MAX / num.base; + max_exp_rem = LONG_MAX % num.base; + c = is.get(); + if (c == '-') { + num.neg_exponent = true; + break; + } + if (c == '+') + break; + continue; + } + goto ok; + case EXPONENT: + int d = get_digit(c, 10); + if (d >= 0) { + empty_exponent = false; + if (num.exponent > max_exp_div + || (num.exponent == max_exp_div && d > max_exp_rem)) + return V_CVT_STR_UNK; + num.exponent = num.exponent * 10 + d; + break; + } + if (empty_exponent) + goto error; + goto ok; + } + c = is.get(); + } + + { + ok: + is.unget(); + unsigned int n = num.mantissa.size(); + while (n > 0 && num.mantissa[n - 1] == '0') { + --n; + ++exponent_offset; + } + num.mantissa.erase(n); + bool neg; + if (exponent_offset < 0) { + neg = true; + exponent_offset = -exponent_offset; + } + else + neg = false; + sum_sign(num.neg_exponent, num.exponent, + neg, exponent_offset); + return V_EQ; + } + + error: + is.unget(); + return V_CVT_STR_UNK; +} + +/* \brief + Reads a number from \p is writing it into \p num, the numerator, + and \p den, the denominator; the appropriate Result value is + returned. +*/ +Result +parse_number(std::istream& is, number_struct& num, number_struct& den) { + // Read the numerator. + Result r = parse_number_part(is, num); + if (r != V_EQ) + return r; + if (is.get() != '/') { + is.unget(); + den.base = 0; + return r; + } + // Read the denominator. + r = parse_number_part(is, den); + if (r != V_EQ) + return V_CVT_STR_UNK; + if (num.base == den.base) { + if (sum_sign(num.neg_exponent, num.exponent, + !den.neg_exponent, den.exponent)) { + if (num.neg_exponent) { + den.neg_exponent = false; + den.exponent = num.exponent; + num.exponent = 0; + } + else + den.exponent = 0; + } + } + return V_EQ; +} + + +Result +input_mpq(mpq_class& to, std::istream& is) { + number_struct num_struct; + number_struct den_struct; + Result r = parse_number(is, num_struct, den_struct); + if (r != V_EQ) + return r; + if (den_struct.base && den_struct.mantissa.empty()) + return VC_NAN; + if (num_struct.mantissa.empty()) { + to = 0; + return V_EQ; + } + mpz_ptr num = to.get_num().get_mpz_t(); + mpz_ptr den = to.get_den().get_mpz_t(); + mpz_set_str(num, num_struct.mantissa.c_str(), num_struct.base); + if (den_struct.base) { + if (num_struct.neg_mantissa ^ den_struct.neg_mantissa) + mpz_neg(num, num); + mpz_set_str(den, den_struct.mantissa.c_str(), den_struct.base); + if (num_struct.exponent || den_struct.exponent) { + // Multiply the exponents into the numerator and denominator. + mpz_t z; + mpz_init(z); + if (num_struct.exponent) { + mpz_ui_pow_ui(z, num_struct.base, num_struct.exponent); + if (num_struct.neg_exponent) + mpz_mul(den, den, z); + else + mpz_mul(num, num, z); + } + if (den_struct.exponent) { + mpz_ui_pow_ui(z, den_struct.base, den_struct.exponent); + if (den_struct.neg_exponent) + mpz_mul(num, num, z); + else + mpz_mul(den, den, z); + } + mpz_clear(z); + } + } + else { + if (num_struct.neg_mantissa) + mpz_neg(num, num); + if (num_struct.exponent) { + if (num_struct.neg_exponent) { + // Add the negative exponent as a denominator. + mpz_ui_pow_ui(den, num_struct.base, num_struct.exponent); + goto end; + } + // Multiply the exponent into the numerator. + mpz_t z; + mpz_init(z); + mpz_ui_pow_ui(z, num_struct.base, num_struct.exponent); + mpz_mul(num, num, z); + mpz_clear(z); + } + mpz_set_ui(den, 1); + return V_EQ; + } + end: + // GMP operators require rationals in canonical form. + to.canonicalize(); + return V_EQ; +} + +} // namespace Checked + +} // namespace Parma_Polyhedra_Library + diff --git a/src/checked.defs.hh b/src/checked.defs.hh new file mode 100644 index 0000000..1a1e591 --- /dev/null +++ b/src/checked.defs.hh @@ -0,0 +1,611 @@ +/* Abstract checked arithmetic function container + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_checked_defs_hh +#define PPL_checked_defs_hh 1 + +#include +#include +#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 \ + struct PPL_FUNCTION_CLASS(name); \ + template \ + inline ret_type name(qual type& arg) { \ + return PPL_FUNCTION_CLASS(name)::function(arg); \ +} + +#define PPL_DECLARE_FUN1_0_1(name, ret_type, qual, type, after1) \ + template \ + struct PPL_FUNCTION_CLASS(name); \ + template \ + inline ret_type name(qual type& arg, after1 a1) { \ + return PPL_FUNCTION_CLASS(name)::function(arg, a1); \ + } + +#define PPL_DECLARE_FUN1_0_2(name, ret_type, qual, type, after1, after2) \ + template \ + struct PPL_FUNCTION_CLASS(name); \ + template \ + inline ret_type name(qual type& arg, after1 a1, after2 a2) { \ + return PPL_FUNCTION_CLASS(name)::function(arg, a1, a2); \ + } + +#define PPL_DECLARE_FUN1_0_3(name, ret_type, qual, type, \ + after1, after2, after3) \ + template \ + struct PPL_FUNCTION_CLASS(name); \ + template \ + inline ret_type name(qual type& arg, \ + after1 a1, after2 a2, after3 a3) { \ + return PPL_FUNCTION_CLASS(name)::function(arg, \ + a1, a2, a3); \ + } + +#define PPL_DECLARE_FUN1_1_1(name, ret_type, before1, qual, type, after1) \ + template \ + struct PPL_FUNCTION_CLASS(name); \ + template \ + inline ret_type name(before1 b1, qual type& arg, after1 a1) { \ + return PPL_FUNCTION_CLASS(name)::function(b1, arg, a1); \ + } + +#define PPL_DECLARE_FUN1_1_2(name, ret_type, before1, qual, type, \ + after1, after2) \ + template \ + struct PPL_FUNCTION_CLASS(name); \ + template \ + inline ret_type name(before1 b1, qual type& arg, \ + after1 a1, after2 a2) { \ + return PPL_FUNCTION_CLASS(name)::function(b1, arg, \ + a1, a2); \ + } + +#define PPL_DECLARE_FUN1_2_2(name, ret_type, before1, before2, qual, type, \ + after1, after2) \ + template \ + struct PPL_FUNCTION_CLASS(name); \ + template \ + inline ret_type name(before1 b1, before2 b2, qual type& arg, \ + after1 a1, after2 a2) { \ + return PPL_FUNCTION_CLASS(name)::function(b1, b2, arg, \ + a1, a2); \ + } + +#define PPL_DECLARE_FUN2_0_0(name, ret_type, qual1, type1, qual2, type2) \ + template \ + struct PPL_FUNCTION_CLASS(name); \ + template \ + inline ret_type name(qual1 type1& arg1, qual2 type2& arg2) { \ + return PPL_FUNCTION_CLASS(name)::function(arg1, arg2); \ + } + +#define PPL_DECLARE_FUN2_0_1(name, ret_type, qual1, type1, \ + qual2, type2, after1) \ + template \ + struct PPL_FUNCTION_CLASS(name); \ + template \ + inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, \ + after1 a1) { \ + return PPL_FUNCTION_CLASS(name)::function(arg1, arg2, a1); \ + } + +#define PPL_DECLARE_FUN2_0_2(name, ret_type, qual1, type1, qual2, type2, \ + after1, after2) \ + template \ + struct PPL_FUNCTION_CLASS(name); \ + template \ + inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, \ + after1 a1, after2 a2) { \ + return PPL_FUNCTION_CLASS(name)::function(arg1, arg2, a1, a2); \ + } + +#define PPL_DECLARE_FUN3_0_1(name, ret_type, qual1, type1, \ + qual2, type2, qual3, type3, after1) \ + template \ + struct PPL_FUNCTION_CLASS(name); \ + template \ + inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, \ + qual3 type3& arg3, after1 a1) { \ + return PPL_FUNCTION_CLASS(name)::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 \ + struct PPL_FUNCTION_CLASS(name); \ + template \ + inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, \ + qual3 type3& arg3, qual4 type4& arg4, \ + qual5 type5& arg5, after1 a1) { \ + return PPL_FUNCTION_CLASS(name) \ + ::function(arg1, arg2, arg3, arg4, arg5, a1); \ + } + +#define PPL_SPECIALIZE_FUN1_0_0(name, func, ret_type, qual, type) \ + template \ + struct PPL_FUNCTION_CLASS(name) { \ + static inline ret_type function(qual type& arg) { \ + return func(arg); \ + } \ + }; + +#define PPL_SPECIALIZE_FUN1_0_1(name, func, ret_type, qual, type, after1) \ + template \ + struct PPL_FUNCTION_CLASS(name) { \ + static inline ret_type function(qual type& arg, after1 a1) { \ + return func(arg, a1); \ + } \ + }; + +#define PPL_SPECIALIZE_FUN1_0_2(name, func, ret_type, qual, type, \ + after1, after2) \ + template \ + struct PPL_FUNCTION_CLASS(name) { \ + static inline ret_type function(qual type& arg, \ + after1 a1, after2 a2) { \ + return func(arg, a1, a2); \ + } \ + }; + +#define PPL_SPECIALIZE_FUN1_0_3(name, func, ret_type, qual, type, \ + after1, after2, after3) \ + template \ + struct PPL_FUNCTION_CLASS(name) { \ + static inline ret_type function(qual type& arg, \ + after1 a1, after2 a2, after3 a3) { \ + return func(arg, a1, a2, a3); \ + } \ + }; + +#define PPL_SPECIALIZE_FUN1_1_1(name, func, ret_type, before1, \ + qual, type, after1) \ + template \ + struct PPL_FUNCTION_CLASS(name) { \ + static inline ret_type function(before1 b1, qual type& arg, \ + after1 a1) { \ + return func(b1, arg, a1); \ + } \ + }; + +#define PPL_SPECIALIZE_FUN1_1_2(name, func, ret_type, before1, \ + qual, type, after1, after2) \ + template \ + struct PPL_FUNCTION_CLASS(name) { \ + static inline ret_type function(before1 b1, qual type& arg, \ + after1 a1, after2 a2) { \ + return func(b1, arg, a1, a2); \ + } \ + }; + +#define PPL_SPECIALIZE_FUN1_2_2(name, func, ret_type, before1, before2, \ + qual, type, after1, after2) \ + template \ + struct PPL_FUNCTION_CLASS(name) { \ + static inline ret_type function(before1 b1, before2 b2, \ + qual type& arg, \ + after1 a1, after2 a2) { \ + return func(b1, b2, arg, a1, a2); \ + } \ + }; + +#define PPL_SPECIALIZE_FUN2_0_0(name, func, ret_type, qual1, type1, \ + qual2, type2) \ + template \ + struct PPL_FUNCTION_CLASS(name) { \ + static inline ret_type function(qual1 type1& arg1, \ + qual2 type2 &arg2) { \ + return func(arg1, arg2); \ + } \ + }; + +#define PPL_SPECIALIZE_FUN2_0_1(name, func, ret_type, qual1, type1, \ + qual2, type2, after1) \ + template \ + struct PPL_FUNCTION_CLASS(name) { \ + static inline ret_type function(qual1 type1& arg1, \ + qual2 type2 &arg2, after1 a1) { \ + return func(arg1, arg2, a1); \ + } \ + }; + +#define PPL_SPECIALIZE_FUN2_0_2(name, func, ret_type, qual1, type1, \ + qual2, type2, after1, after2) \ + template \ + struct PPL_FUNCTION_CLASS(name) { \ + static inline ret_type function(qual1 type1& arg1, \ + qual2 type2 &arg2, \ + after1 a1, after2 a2) { \ + return func(arg1, arg2, a1, a2); \ + } \ + }; + +#define PPL_SPECIALIZE_FUN3_0_1(name, func, ret_type, qual1, type1, \ + qual2, type2, qual3, type3, after1) \ + template \ + struct PPL_FUNCTION_CLASS(name) { \ + static inline Result function(qual1 type1& arg1, qual2 type2 &arg2, \ + qual3 type3 &arg3, after1 a1) { \ + return func(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 \ + struct PPL_FUNCTION_CLASS(name) { \ + static inline Result \ + function(qual1 type1& arg1, qual2 type2 &arg2, qual3 type3 &arg3, \ + qual4 type4 &arg4, qual5 type5 &arg5, after1 a1) { \ + return func(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, const, From) +#define PPL_SPECIALIZE_CMP(func, Type1, Type2) \ + PPL_SPECIALIZE_FUN2_0_0(cmp, func, Result, 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, Rounding_Dir) +#define PPL_SPECIALIZE_CONSTRUCT_SPECIAL(func, Type) \ + PPL_SPECIALIZE_FUN1_0_2(construct_special, func, Result, nonconst, \ + Type, Result, 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_MUL2EXP(func, To, From) \ + PPL_SPECIALIZE_FUN2_0_2(mul2exp, func, Result, nonconst, To, \ + const, From, int, Rounding_Dir) +#define PPL_SPECIALIZE_DIV2EXP(func, To, From) \ + PPL_SPECIALIZE_FUN2_0_2(div2exp, func, Result, nonconst, To, \ + const, From, 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, const, From) +PPL_DECLARE_FUN2_0_0(cmp, + Result, 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, Rounding_Dir) +PPL_DECLARE_FUN1_0_2(construct_special, + Result, nonconst, Type, Result, 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(mul2exp, + Result, nonconst, To, const, From, int, Rounding_Dir) +PPL_DECLARE_FUN2_0_2(div2exp, + Result, nonconst, To, const, From, 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 +Result round(To& to, Result r, Rounding_Dir dir); + +Result input_mpq(mpq_class& to, std::istream& is); + +} // namespace Checked + +struct Minus_Infinity { + static const Result code = VC_MINUS_INFINITY; +}; +struct Plus_Infinity { + static const Result code = VC_PLUS_INFINITY; +}; +struct Not_A_Number { + static const Result code = VC_NAN; +}; + +template +struct Is_Special : public False { }; + +template <> +struct Is_Special : public True {}; + +template <> +struct Is_Special : public True {}; + +template <> +struct Is_Special : public True {}; + + +#define MINUS_INFINITY Minus_Infinity() +#define PLUS_INFINITY Plus_Infinity() +#define NOT_A_NUMBER Not_A_Number() + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +struct Checked_Number_Transparent_Policy { + //! Checks for overflowed result. + const_bool_nodef(check_overflow, false); + + //! Checks for attempts to add infinities with different sign. + const_bool_nodef(check_inf_add_inf, false); + + //! Checks for attempts to subtract infinities with same sign. + const_bool_nodef(check_inf_sub_inf, false); + + //! Checks for attempts to multiply infinities by zero. + const_bool_nodef(check_inf_mul_zero, false); + + //! Checks for attempts to divide by zero. + const_bool_nodef(check_div_zero, false); + + //! Checks for attempts to divide infinities. + const_bool_nodef(check_inf_div_inf, false); + + //! Checks for attempts to compute remainder of infinities. + const_bool_nodef(check_inf_mod, false); + + //! Checks for attempts to take the square root of a negative number. + const_bool_nodef(check_sqrt_neg, false); + + //! Handles not-a-number special value. + const_bool_nodef(has_nan, std::numeric_limits::has_quiet_NaN); + + //! Handles infinity special values. + const_bool_nodef(has_infinity, std::numeric_limits::has_infinity); + + //! Representation is identical to primitive. + const_bool_nodef(convertible, true); + + //! When true, requests to check for FPU inexact result are honored. + const_bool_nodef(fpu_check_inexact, false); + + //! Return VC_NAN on NaN result also for native extended. + const_bool_nodef(check_nan_result, false); + static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE; + static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE; + static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE; + static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_NATIVE; + static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_NATIVE; + static void handle_result(Result r); +}; + +} // 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.inlines.hh b/src/checked.inlines.hh new file mode 100644 index 0000000..b340bd9 --- /dev/null +++ b/src/checked.inlines.hh @@ -0,0 +1,621 @@ +/* Abstract checked arithmetic functions: fall-backs. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_checked_inlines_hh +#define PPL_checked_inlines_hh 1 + +#include "globals.types.hh" +#include "meta_programming.hh" +#include "C_Integer.hh" +#include + +namespace Parma_Polyhedra_Library { + +namespace Checked { + +template +struct Safe_Conversion : public False { +}; +template +struct Safe_Conversion : public True { +}; + +#define PPL_SAFE_CONVERSION(To, From) \ + template <> struct Safe_Conversion : public True { } + +PPL_SAFE_CONVERSION(signed short, signed char); +#if PPL_SIZEOF_CHAR < PPL_SIZEOF_SHORT +PPL_SAFE_CONVERSION(signed short, unsigned char); +#endif + +PPL_SAFE_CONVERSION(signed int, signed char); +PPL_SAFE_CONVERSION(signed int, signed short); +#if PPL_SIZEOF_CHAR < PPL_SIZEOF_INT +PPL_SAFE_CONVERSION(signed int, unsigned char); +#endif +#if PPL_SIZEOF_SHORT < PPL_SIZEOF_INT +PPL_SAFE_CONVERSION(signed int, unsigned short); +#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 +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 + +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 +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 + +PPL_SAFE_CONVERSION(unsigned short, unsigned char); + +PPL_SAFE_CONVERSION(unsigned int, unsigned char); +PPL_SAFE_CONVERSION(unsigned int, unsigned short); + +PPL_SAFE_CONVERSION(unsigned long, unsigned char); +PPL_SAFE_CONVERSION(unsigned long, unsigned short); +PPL_SAFE_CONVERSION(unsigned long, unsigned int); + +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, 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, 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, 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, signed char); +PPL_SAFE_CONVERSION(mpz_class, signed short); +PPL_SAFE_CONVERSION(mpz_class, signed int); +PPL_SAFE_CONVERSION(mpz_class, signed long); +//PPL_SAFE_CONVERSION(mpz_class, 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); +//PPL_SAFE_CONVERSION(mpz_class, unsigned long long); + +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); +//PPL_SAFE_CONVERSION(mpq_class, 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); +//PPL_SAFE_CONVERSION(mpq_class, unsigned long long); +PPL_SAFE_CONVERSION(mpq_class, float); +PPL_SAFE_CONVERSION(mpq_class, double); +//PPL_SAFE_CONVERSION(mpq_class, long double); + +#undef PPL_SAFE_CONVERSION + +template +struct PPL_FUNCTION_CLASS(construct) { + static inline Result function(Type& to, const Type& from, Rounding_Dir) { + new (&to) Type(from); + return V_EQ; + } +}; + +template +struct PPL_FUNCTION_CLASS(construct) { + static inline Result function(To& to, const From& from, Rounding_Dir dir) { + new (&to) To(); + return assign(to, from, dir); + } +}; + +template +struct PPL_FUNCTION_CLASS(construct_special) { + static inline Result function(To& to, Result r, Rounding_Dir dir) { + new (&to) To(); + return assign_special(to, r, dir); + } +}; + +template +inline Result +assign_exact(To& to, const From& from, Rounding_Dir) { + to = from; + return V_EQ; +} + +template +inline typename Enable_If::value, void>::type +copy_generic(Type& to, const Type& from) { + to = from; +} + +template +inline Result +abs_generic(To& to, const From& from, Rounding_Dir dir) { + if (from < 0) + return neg(to, from, dir); + else + return assign(to, from, dir); +} + +inline Result +neg(Result r) { + assert(!is_special(r)); + Result ret = static_cast(r & V_EQ); + if (r & V_LT) + ret = static_cast(ret | V_GT); + if (r & V_GT) + ret = static_cast(ret | V_LT); + return ret; +} + +inline Result +add(Result r1, Result r2) { + assert(!is_special(r1)); + assert(!is_special(r2)); + if (r1 == V_EQ) + return r2; + if (r2 == V_EQ) + return r1; + if (((r1 & V_LT) && (r2 & V_GT)) + || ((r1 & V_GT) && (r2 & V_LT))) + return V_LGE; + return static_cast((((r1 & r2) & V_EQ) ? V_EQ : 0) | + (r1 & (V_LT | V_GT))); +} + +inline Result +sub(Result r1, Result r2) { + return add(r1, neg(r2)); +} + +template +inline void +gcd_exact_noabs(To& to, const From& x, const From& y) { + To nx = x; + To ny = y; + To rm; + while (ny != 0) { + // The following is derived from the assumption that x % y + // is always representable. This is true for both native integers + // and IEC 559 floating point numbers. + rem(rm, nx, ny, ROUND_NOT_NEEDED); + nx = ny; + ny = rm; + } + to = nx; +} + +template +inline Result +gcd_exact(To& to, const From1& x, const From2& y, Rounding_Dir dir) { + gcd_exact_noabs(to, x, y); + return abs(to, to, dir); +} + +template +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(to, x, dir); + } + } + + s = 1; + t = 0; + bool negative_x = x < 0; + bool negative_y = y < 0; + + Result r; + r = abs(to, x, dir); + if (r != V_EQ) + return r; + + From2 ay; + r = abs(ay, 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 == ay) + goto sign_check; +#endif + + { + To2 v1 = 0; + To3 v2 = 1; + To1 v3 = static_cast(ay); + while (true) { + To1 q = to / v3; + // Remainder, next candidate GCD. + To1 t3 = to - q*v3; + To2 t1 = s - static_cast(q)*v1; + To3 t2 = t - static_cast(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(s, s, dir); + if (r != V_EQ) + return r; + } + if (negative_y) + return neg(t, t, dir); + return V_EQ; +#undef PPL_MATCH_GMP_GCDEXT +} + +template +inline Result +lcm_gcd_exact(To& to, const From1& x, const From2& y, Rounding_Dir dir) { + if (x == 0 || y == 0) { + to = 0; + return V_EQ; + } + To nx, ny; + Result r; + r = abs(nx, x, dir); + if (r != V_EQ) + return r; + r = abs(ny, y, dir); + if (r != V_EQ) + return r; + To gcd; + gcd_exact_noabs(gcd, nx, ny); + // The following is derived from the assumption that x / gcd(x, y) + // is always representable. This is true for both native integers + // and IEC 559 floating point numbers. + div(to, nx, gcd, ROUND_NOT_NEEDED); + return mul(to, to, ny, dir); +} + +template +inline Result +sgn_generic(const Type& x) { + if (x > 0) + return V_GT; + if (x == 0) + return V_EQ; + return V_LT; +} + +template +struct Safe_Int_Comparison : public False { +}; + +template +struct Safe_Int_Comparison::value && C_Integer::value)>::type> + : public Bool<(C_Integer::is_signed + ? (C_Integer::is_signed + || sizeof(T2) < sizeof(T1) + || sizeof(T2) < sizeof(int)) + : (!C_Integer::is_signed + || sizeof(T1) < sizeof(T2) + || sizeof(T1) < sizeof(int)))> { +}; + + +template +inline typename Enable_If<(Safe_Int_Comparison::value + || Safe_Conversion::value + || Safe_Conversion::value), bool>::type +lt(const T1& x, const T2& y) { + return x < y; +} +template +inline typename Enable_If<(Safe_Int_Comparison::value + || Safe_Conversion::value + || Safe_Conversion::value), bool>::type +le(const T1& x, const T2& y) { + return x <= y; +} +template +inline typename Enable_If<(Safe_Int_Comparison::value + || Safe_Conversion::value + || Safe_Conversion::value), bool>::type +eq(const T1& x, const T2& y) { + return x == y; +} + +template +inline typename Enable_If<(!Safe_Int_Comparison::value + && C_Integer::value + && C_Integer::is_signed), bool>::type +lt(const S& x, const U& y) { + return x < 0 || x < y; +} + +template +inline typename Enable_If<(!Safe_Int_Comparison::value + && C_Integer::value + && C_Integer::is_signed), bool>::type +lt(const U& x, const S& y) { + return y >= 0 && x < y; +} + +template +inline typename Enable_If<(!Safe_Int_Comparison::value + && C_Integer::value + && C_Integer::is_signed), bool>::type +le(const S& x, const U& y) { + return x < 0 || x <= y; +} + +template +inline typename Enable_If<(!Safe_Int_Comparison::value + && C_Integer::value + && C_Integer::is_signed), bool>::type +le(const U& x, const S& y) { + return y >= 0 && x <= y; +} + +template +inline typename Enable_If<(!Safe_Int_Comparison::value + && C_Integer::value + && C_Integer::is_signed), bool>::type +eq(const S& x, const U& y) { + return x >= 0 && x == y; +} + +template +inline typename Enable_If<(!Safe_Int_Comparison::value + && C_Integer::value + && C_Integer::is_signed), bool>::type +eq(const U& x, const S& y) { + return y >= 0 && x == y; +} + +template +inline typename Enable_If<(!Safe_Conversion::value + && !Safe_Conversion::value + && (!C_Integer::value || !C_Integer::value)), bool>::type +eq(const T1& x, const T2& y) { + PPL_DIRTY_TEMP(T1, tmp); + Result r = assign_r(tmp, y, static_cast(ROUND_DIRECT | ROUND_FPU_CHECK_INEXACT)); + // 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. + assert(r != V_LE && r != V_GE && r != V_LGE); + return r == V_EQ && x == tmp; +} + +template +inline typename Enable_If<(!Safe_Conversion::value + && !Safe_Conversion::value + && (!C_Integer::value || !C_Integer::value)), bool>::type +lt(const T1& x, const T2& y) { + PPL_DIRTY_TEMP(T1, tmp); + Result r = assign_r(tmp, y, ROUND_UP); + switch (r) { + case V_POS_OVERFLOW: + case VC_PLUS_INFINITY: + return true; + case V_EQ: + case V_LT: + case V_LE: + return x < tmp; + default: + return false; + } +} + +template +inline typename +Enable_If<(!Safe_Conversion::value + && !Safe_Conversion::value + && (!C_Integer::value || !C_Integer::value)), bool>::type +le(const T1& x, const T2& y) { + PPL_DIRTY_TEMP(T1, tmp); + Result r + = assign_r(tmp, + y, + static_cast(ROUND_UP | ROUND_FPU_CHECK_INEXACT)); + switch (r) { + case V_POS_OVERFLOW: + case VC_PLUS_INFINITY: + return true; + case V_EQ: + return x <= tmp; + case V_LT: + return x < tmp; + case V_LE: + case V_GE: + case V_LGE: + // FIXME: See comment above. + assert(0); + default: + return false; + } +} + +template +inline bool +lt_p(const Type1& x, const Type2& y) { + return lt(x, y); +} + +template +inline bool +le_p(const Type1& x, const Type2& y) { + return le(x, y); +} + +template +inline bool +eq_p(const Type1& x, const Type2& y) { + return eq(x, y); +} + +template +inline Result +cmp_generic(const Type1& x, const Type2& y) { + if (lt(y, x)) + return V_GT; + if (lt(x, y)) + return V_LT; + return V_EQ; +} + +template +inline Result +input_generic(Type& to, std::istream& is, Rounding_Dir dir) { + PPL_DIRTY_TEMP0(mpq_class, q); + Result r = input_mpq(q, is); + if (is_special(r)) + return assign_special(to, r, dir); + if (r == V_EQ) + return assign(to, q, dir); + assert(0); + return VC_NAN; +} + +} // namespace Checked + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_checked_inlines_hh) diff --git a/src/checked_ext.inlines.hh b/src/checked_ext.inlines.hh new file mode 100644 index 0000000..843f2e4 --- /dev/null +++ b/src/checked_ext.inlines.hh @@ -0,0 +1,848 @@ +/* Checked extended arithmetic functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_checked_ext_defs_hh +#define PPL_checked_ext_defs_hh 1 + +namespace Parma_Polyhedra_Library { + +template struct FPU_Related : public False {}; +template <> struct FPU_Related : public True {}; +template <> struct FPU_Related : public True {}; +template <> struct FPU_Related : public True {}; + +namespace Checked { + +template +inline bool +handle_ext_natively(const T&) { + return FPU_Related::value; +} + +template +inline bool +ext_to_handle(const Type& x) { + return !handle_ext_natively(x) + && (Policy::has_infinity || Policy::has_nan); +} + +template +inline Result +sgn_ext(const Type& x) { + if (!ext_to_handle(x)) + goto native; + if (is_nan(x)) + return VC_NAN; + else if (is_minf(x)) + return V_LT; + else if (is_pinf(x)) + return V_GT; + else { + native: + return sgn(x); + } +} + +template +inline Result +construct_ext(To& to, const From& x, Rounding_Dir dir) { + if (!ext_to_handle(x)) + goto native; + if (is_nan(x)) + return construct_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x)) + return construct_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(x)) + return construct_special(to, VC_PLUS_INFINITY, dir); + else { + native: + return construct(to, x, dir); + } +} + +template +inline Result +assign_ext(To& to, const From& x, Rounding_Dir dir) { + if (!ext_to_handle(x)) + goto native; + if (is_nan(x)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x)) + return assign_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(x)) + return assign_special(to, VC_PLUS_INFINITY, dir); + else { + native: + return assign(to, x, dir); + } +} + +template +inline Result +neg_ext(To& to, const From& x, Rounding_Dir dir) { + if (!ext_to_handle(x)) + goto native; + if (is_nan(x)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x)) + return assign_special(to, VC_PLUS_INFINITY, dir); + else if (is_pinf(x)) + return assign_special(to, VC_MINUS_INFINITY, dir); + else { + native: + return neg(to, x, dir); + } +} + +template +inline Result +floor_ext(To& to, const From& x, Rounding_Dir dir) { + if (!ext_to_handle(x)) + goto native; + if (is_nan(x)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x)) + return assign_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(x)) + return assign_special(to, VC_PLUS_INFINITY, dir); + else { + native: + return floor(to, x, dir); + } +} + +template +inline Result +ceil_ext(To& to, const From& x, Rounding_Dir dir) { + if (!ext_to_handle(x)) + goto native; + if (is_nan(x)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x)) + return assign_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(x)) + return assign_special(to, VC_PLUS_INFINITY, dir); + else { + native: + return ceil(to, x, dir); + } +} + +template +inline Result +trunc_ext(To& to, const From& x, Rounding_Dir dir) { + if (!ext_to_handle(x)) + goto native; + if (is_nan(x)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x)) + return assign_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(x)) + return assign_special(to, VC_PLUS_INFINITY, dir); + else { + native: + return trunc(to, x, dir); + } +} + +template +inline Result +abs_ext(To& to, const From& x, Rounding_Dir dir) { + if (!ext_to_handle(x)) + goto native; + if (is_nan(x)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x) || is_pinf(x)) + return assign_special(to, VC_PLUS_INFINITY, dir); + else { + native: + return abs(to, x, dir); + } +} + +template +inline Result +add_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) { + if (!ext_to_handle(x) && !ext_to_handle(y)) + goto native; + if (is_nan(x) || is_nan(y)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x)) { + if (CHECK_P(To_Policy::check_inf_add_inf, is_pinf(y))) + goto inf_add_inf; + else + goto minf; + } + else if (is_pinf(x)) { + if (CHECK_P(To_Policy::check_inf_add_inf, is_minf(y))) { + inf_add_inf: + return assign_special(to, V_INF_ADD_INF, ROUND_IGNORE); + } + else + goto pinf; + } + else { + if (is_minf(y)) { + minf: + return assign_special(to, VC_MINUS_INFINITY, dir); + } + else if (is_pinf(y)) { + pinf: + return assign_special(to, VC_PLUS_INFINITY, dir); + } + else { + native: + return add(to, x, y, dir); + } + } +} + +template +inline Result +sub_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) { + if (!ext_to_handle(x) && !ext_to_handle(y)) + goto native; + if (is_nan(x) || is_nan(y)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x)) { + if (CHECK_P(To_Policy::check_inf_sub_inf, is_minf(y))) + goto inf_sub_inf; + else + goto minf; + } + else if (is_pinf(x)) { + if (CHECK_P(To_Policy::check_inf_sub_inf, is_pinf(y))) { + inf_sub_inf: + return assign_special(to, V_INF_SUB_INF, ROUND_IGNORE); + } + else + goto pinf; + } + else { + if (is_pinf(y)) { + minf: + return assign_special(to, VC_MINUS_INFINITY, dir); + } + else if (is_minf(y)) { + pinf: + return assign_special(to, VC_PLUS_INFINITY, dir); + } + else { + native: + return sub(to, x, y, dir); + } + } +} + +template +inline Result +mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) { + if (!ext_to_handle(x) && !ext_to_handle(y)) + goto native; + if (is_nan(x) || is_nan(y)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + if (is_minf(x)) { + switch (sgn_ext(y)) { + case V_LT: + goto pinf; + case V_GT: + goto minf; + default: + goto inf_mul_zero; + } + } + else if (is_pinf(x)) { + switch (sgn_ext(y)) { + case V_LT: + goto minf; + case V_GT: + goto pinf; + default: + goto inf_mul_zero; + } + } + else { + if (is_minf(y)) { + switch (sgn(x)) { + case V_LT: + goto pinf; + case V_GT: + goto minf; + default: + goto inf_mul_zero; + } + } + else if (is_pinf(y)) { + switch (sgn(x)) { + case V_LT: + minf: + return assign_special(to, VC_MINUS_INFINITY, dir); + case V_GT: + pinf: + return assign_special(to, VC_PLUS_INFINITY, dir); + default: + inf_mul_zero: + assert(To_Policy::check_inf_mul_zero); + return assign_special(to, V_INF_MUL_ZERO, ROUND_IGNORE); + } + } + else { + native: + return mul(to, x, y, dir); + } + } +} + + +template +inline Result +add_mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) { + if (!ext_to_handle(to) + && !ext_to_handle(x) && !ext_to_handle(y)) + goto native; + if (is_nan(to) + || is_nan(x) || is_nan(y)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + if (is_minf(x)) { + switch (sgn_ext(y)) { + case V_LT: + goto a_pinf; + case V_GT: + goto a_minf; + default: + goto inf_mul_zero; + } + } + else if (is_pinf(x)) { + switch (sgn_ext(y)) { + case V_LT: + goto a_minf; + case V_GT: + goto a_pinf; + default: + goto inf_mul_zero; + } + } + else { + if (is_minf(y)) { + switch (sgn(x)) { + case V_LT: + goto a_pinf; + case V_GT: + goto a_minf; + default: + goto inf_mul_zero; + } + } + else if (is_pinf(y)) { + switch (sgn(x)) { + case V_LT: + a_minf: + if (CHECK_P(To_Policy::check_inf_add_inf, is_pinf(to))) + goto inf_add_inf; + else + goto minf; + case V_GT: + a_pinf: + if (CHECK_P(To_Policy::check_inf_add_inf, is_minf(to))) { + inf_add_inf: + return assign_special(to, V_INF_ADD_INF, ROUND_IGNORE); + } + else + goto pinf; + default: + inf_mul_zero: + assert(To_Policy::check_inf_mul_zero); + return assign_special(to, V_INF_MUL_ZERO, ROUND_IGNORE); + } + } + else { + if (is_minf(to)) { + minf: + return assign_special(to, VC_MINUS_INFINITY, dir); + } + if (is_pinf(to)) { + pinf: + return assign_special(to, VC_PLUS_INFINITY, dir); + } + native: + return add_mul(to, x, y, dir); + } + } +} + +template +inline Result +sub_mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) { + if (!ext_to_handle(to) + && !ext_to_handle(x) && !ext_to_handle(y)) + goto native; + if (is_nan(to) + || is_nan(x) || is_nan(y)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + if (is_minf(x)) { + switch (sgn_ext(y)) { + case V_LT: + goto a_pinf; + case V_GT: + goto a_minf; + default: + goto inf_mul_zero; + } + } + else if (is_pinf(x)) { + switch (sgn_ext(y)) { + case V_LT: + goto a_minf; + case V_GT: + goto a_pinf; + default: + goto inf_mul_zero; + } + } + else { + if (is_minf(y)) { + switch (sgn(x)) { + case V_LT: + goto a_pinf; + case V_GT: + goto a_minf; + default: + goto inf_mul_zero; + } + } + else if (is_pinf(y)) { + switch (sgn(x)) { + case V_LT: + a_minf: + if (CHECK_P(To_Policy::check_inf_sub_inf, is_minf(to))) + goto inf_sub_inf; + else + goto pinf; + case V_GT: + a_pinf: + if (CHECK_P(To_Policy::check_inf_sub_inf, is_pinf(to))) { + inf_sub_inf: + return assign_special(to, V_INF_SUB_INF, ROUND_IGNORE); + } + else + goto minf; + default: + inf_mul_zero: + assert(To_Policy::check_inf_mul_zero); + return assign_special(to, V_INF_MUL_ZERO, ROUND_IGNORE); + } + } + else { + if (is_minf(to)) { + minf: + return assign_special(to, VC_MINUS_INFINITY, dir); + } + if (is_pinf(to)) { + pinf: + return assign_special(to, VC_PLUS_INFINITY, dir); + } + native: + return sub_mul(to, x, y, dir); + } + } +} + +template +inline Result +div_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) { + if (!ext_to_handle(x) && !ext_to_handle(y)) + goto native; + if (is_nan(x) || is_nan(y)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + if (is_minf(x)) { + if (CHECK_P(To_Policy::check_inf_div_inf, is_minf(y) + || is_pinf(y))) + goto inf_div_inf; + else { + switch (sgn(y)) { + case V_LT: + goto pinf; + case V_GT: + goto minf; + default: + goto div_zero; + } + } + } + else if (is_pinf(x)) { + if (CHECK_P(To_Policy::check_inf_div_inf, is_minf(y) + || is_pinf(y))) { + inf_div_inf: + return assign_special(to, V_INF_DIV_INF, ROUND_IGNORE); + } + else { + switch (sgn(y)) { + case V_LT: + minf: + return assign_special(to, VC_MINUS_INFINITY, dir); + case V_GT: + pinf: + return assign_special(to, VC_PLUS_INFINITY, dir); + default: + div_zero: + assert(To_Policy::check_div_zero); + return assign_special(to, V_DIV_ZERO, ROUND_IGNORE); + } + } + } + else { + if (is_minf(y) || is_pinf(y)) { + to = 0; + return V_EQ; + } + else { + native: + return div(to, x, y, dir); + } + } +} + + +template +inline Result +idiv_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) { + if (!ext_to_handle(x) && !ext_to_handle(y)) + goto native; + if (is_nan(x) || is_nan(y)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + if (is_minf(x)) { + if (CHECK_P(To_Policy::check_inf_div_inf, is_minf(y) + || is_pinf(y))) + goto inf_div_inf; + else { + switch (sgn(y)) { + case V_LT: + goto pinf; + case V_GT: + goto minf; + default: + goto div_zero; + } + } + } + else if (is_pinf(x)) { + if (CHECK_P(To_Policy::check_inf_div_inf, is_minf(y) + || is_pinf(y))) { + inf_div_inf: + return assign_special(to, V_INF_DIV_INF, ROUND_IGNORE); + } + else { + switch (sgn(y)) { + case V_LT: + minf: + return assign_special(to, VC_MINUS_INFINITY, dir); + case V_GT: + pinf: + return assign_special(to, VC_PLUS_INFINITY, dir); + default: + div_zero: + assert(To_Policy::check_div_zero); + return assign_special(to, V_DIV_ZERO, ROUND_IGNORE); + } + } + } + else { + if (is_minf(y) || is_pinf(y)) { + to = 0; + return V_EQ; + } + else { + native: + return idiv(to, x, y, dir); + } + } +} + + +template +inline Result +rem_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) { + if (!ext_to_handle(x) && !ext_to_handle(y)) + goto native; + if (is_nan(x) || is_nan(y)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (CHECK_P(To_Policy::check_inf_mod, is_minf(x) + || is_pinf(x))) + return assign_special(to, V_INF_MOD, ROUND_IGNORE); + else { + if (is_minf(y) || is_pinf(y)) { + to = x; + return V_EQ; + } + else { + native: + return rem(to, x, y, dir); + } + } +} + +template +inline Result +mul2exp_ext(To& to, const From& x, int exp, Rounding_Dir dir) { + if (!ext_to_handle(x)) + goto native; + if (is_nan(x)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x)) + return assign_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(x)) + return assign_special(to, VC_PLUS_INFINITY, dir); + else { + native: + return mul2exp(to, x, exp, dir); + } +} + +template +inline Result +div2exp_ext(To& to, const From& x, int exp, Rounding_Dir dir) { + if (!ext_to_handle(x)) + goto native; + if (is_nan(x)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x)) + return assign_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(x)) + return assign_special(to, VC_PLUS_INFINITY, dir); + else { + native: + return div2exp(to, x, exp, dir); + } +} + +template +inline Result +sqrt_ext(To& to, const From& x, Rounding_Dir dir) { + if (!ext_to_handle(x)) + goto native; + if (is_nan(x)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x)) + return assign_special(to, V_SQRT_NEG, ROUND_IGNORE); + else if (is_pinf(x)) + return assign_special(to, VC_PLUS_INFINITY, dir); + else { + native: + return sqrt(to, x, dir); + } +} + +template +inline Result +gcd_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) { + if (is_nan(x) || is_nan(y)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x) || is_pinf(x)) + return abs_ext(to, y, dir); + else if (is_minf(y) || is_pinf(y)) + return abs_ext(to, x, dir); + else + return gcd(to, x, y, dir); +} + +template +inline Result +gcdext_ext(To1& to, To2& s, To3& t, const From1& x, const From2& y, + Rounding_Dir dir) { + if (is_nan(x) || is_nan(y)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x) || is_pinf(x)) { + s = 0; + t = y > 0 ? -1 : 1; + return abs_ext(to, y, dir); + } + else if (is_minf(y) || is_pinf(y)) { + s = x > 0 ? -1 : 1; + t = 0; + return abs_ext(to, x, dir); + } + else + return gcdext(to, s, t, x, y, dir); +} + +template +inline Result +lcm_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) { + if (is_nan(x) || is_nan(y)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x) || is_pinf(x) + || is_minf(y) || is_pinf(y)) + return assign_special(to, VC_PLUS_INFINITY, dir); + else + return lcm(to, x, y, dir); +} + +template +inline Result +cmp_ext(const Type1& x, const Type2& y) { + if (!ext_to_handle(x) && !ext_to_handle(y)) + goto native; + if (is_nan(x) || is_nan(y)) + return V_UNORD_COMP; + else if (is_minf(x)) + return is_minf(y) ? V_EQ : V_LT; + else if (is_pinf(x)) + return is_pinf(y) ? V_EQ : V_GT; + else { + if (is_minf(y)) + return V_GT; + if (is_pinf(y)) + return V_LT; + native: + return cmp(x, y); + } +} + +template +inline bool +lt_ext(const Type1& x, const Type2& y) { + if (!ext_to_handle(x) && !ext_to_handle(y)) + goto native; + if (is_nan(x) || is_nan(y)) + return false; + if (is_pinf(x) || is_minf(y)) + return false; + if (is_minf(x) || is_pinf(y)) + return true; + native: + return lt_p(x, y); +} + +template +inline bool +gt_ext(const Type1& x, const Type2& y) { + return lt_ext(y, x); +} + +template +inline bool +le_ext(const Type1& x, const Type2& y) { + if (!ext_to_handle(x) && !ext_to_handle(y)) + goto native; + if (is_nan(x) || is_nan(y)) + return false; + if (is_minf(x) || is_pinf(y)) + return true; + if (is_pinf(x) || is_minf(y)) + return false; + native: + return le_p(x, y); +} + +template +inline bool +ge_ext(const Type1& x, const Type2& y) { + return le_ext(y, x); +} + +template +inline bool +eq_ext(const Type1& x, const Type2& y) { + if (!ext_to_handle(x) && !ext_to_handle(y)) + goto native; + if (is_nan(x) || is_nan(y)) + return false; + if (is_minf(x)) + return is_minf(y); + if (is_pinf(x)) + return is_pinf(y); + else if (is_minf(y) || is_pinf(y)) + return false; + native: + return eq_p(x, y); +} + +template +inline bool +ne_ext(const Type1& x, const Type2& y) { + return !eq_ext(x, y); +} + +template +inline Result +output_ext(std::ostream& os, const Type& x, + const Numeric_Format& format, Rounding_Dir dir) { + if (!ext_to_handle(x)) + goto native; + if (is_nan(x)) { + os << "nan"; + return VC_NAN; + } + if (is_minf(x)) { + os << "-inf"; + return V_EQ; + } + if (is_pinf(x)) { + os << "+inf"; + return V_EQ; + } + native: + return output(os, x, format, dir); +} + +template +inline Result +input_ext(To& to, std::istream& is, Rounding_Dir dir) { + return input(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..6783260 --- /dev/null +++ b/src/checked_float.inlines.hh @@ -0,0 +1,1077 @@ +/* Specialized "checked" functions for native floating-point numbers. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_checked_float_inlines_hh +#define PPL_checked_float_inlines_hh 1 + +#include "compiler.hh" +#ifndef __alpha +#include +#endif + +namespace Parma_Polyhedra_Library { + +namespace Checked { + +inline float +fma(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 +fma(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 +fma(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 +rint(float x) { + return ::rintf(x); +} +#endif + +inline double +rint(double x) { + return ::rint(x); +} + +#if PPL_HAVE_DECL_RINTL +inline long double +rint(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 +rint(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 +rint(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_ignore(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) { + cc_flush(v); +} + +inline void +limit_precision(const double& v) { + cc_flush(v); +} + +inline void +limit_precision(const long double&) { +} + +template +inline Result +classify_float(const T v, bool nan, bool inf, bool sign) { + Float f(v); + if ((nan || sign) && CHECK_P(Policy::has_nan, f.u.binary.is_nan())) + return VC_NAN; + if (inf) { + int i = CHECK_P(Policy::has_infinity, f.u.binary.is_inf()); + if (i < 0) + return VC_MINUS_INFINITY; + if (i > 0) + return VC_PLUS_INFINITY; + } + if (sign) { + if (v < 0) + return V_LT; + if (v > 0) + return V_GT; + return V_EQ; + } + return VC_NORMAL; +} + +template +inline bool +is_nan_float(const T v) { + Float f(v); + return CHECK_P(Policy::has_nan, f.u.binary.is_nan()); +} + +template +inline int +is_inf_float(const T v) { + Float f(v); + return CHECK_P(Policy::has_infinity, f.u.binary.is_inf()); +} +template +inline bool +is_minf_float(const T v) { + return is_inf_float(v) < 0; +} + +template +inline bool +is_pinf_float(const T v) { + return is_inf_float(v) > 0; +} + + +template +inline bool +is_int_float(const T v) { + return rint(v) == v; +} + +template +inline Result +assign_special_float(T& v, Result r, Rounding_Dir) { + switch (classify(r)) { + case VC_MINUS_INFINITY: + v = -HUGE_VAL; + break; + case VC_PLUS_INFINITY: + v = HUGE_VAL; + break; + case VC_NAN: + v = PPL_NAN; + return r; + default: + break; + } + return V_EQ; +} + +template +inline void +pred_float(T& v) { + Float f(v); + assert(!f.u.binary.is_nan()); + assert(f.u.binary.is_inf() >= 0); + if (f.u.binary.is_zero() > 0) { + f.u.binary.negate(); + f.u.binary.inc(); + } + else if (f.u.binary.sign_bit()) { + f.u.binary.inc(); + } + else { + f.u.binary.dec(); + } + v = f.value(); +} + +template +inline void +succ_float(T& v) { + Float f(v); + assert(!f.u.binary.is_nan()); + assert(f.u.binary.is_inf() <= 0); + if (f.u.binary.is_zero() < 0) { + f.u.binary.negate(); + f.u.binary.inc(); + } + else if (!f.u.binary.sign_bit()) { + f.u.binary.inc(); + } + else { + f.u.binary.dec(); + } + v = f.value(); +} + +template +inline Result +round_lt_float(To& to, Rounding_Dir dir) { + if (round_down(dir)) { + pred_float(to); + return V_GT; + } + return V_LT; +} + +template +inline Result +round_gt_float(To& to, Rounding_Dir dir) { + if (round_up(dir)) { + succ_float(to); + return V_LT; + } + return V_GT; +} + + +template +inline void +prepare_inexact(Rounding_Dir dir) { + if (Policy::fpu_check_inexact && round_fpu_check_inexact(dir)) + fpu_reset_inexact(); +} + +template +inline Result +result_relation(Rounding_Dir dir) { + if (Policy::fpu_check_inexact && round_fpu_check_inexact(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 +inline Result +assign_float_float_exact(To& to, const From from, Rounding_Dir) { + if (To_Policy::check_nan_result && is_nan(from)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + to = from; + return V_EQ; +} + +template +inline Result +assign_float_float_inexact(To& to, const From from, Rounding_Dir dir) { + if (To_Policy::check_nan_result && is_nan(from)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + prepare_inexact(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(dir); +} + +template +inline Result +assign_float_float(To& to, const From from, Rounding_Dir dir) { + if (sizeof(From) > sizeof(To)) + return assign_float_float_inexact(to, from, dir); + else + return assign_float_float_exact(to, from, dir); +} + +template +inline Result +floor_float(Type& to, const Type from, Rounding_Dir) { + if (To_Policy::check_nan_result && is_nan(from)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + if (fpu_direct_rounding(ROUND_DOWN)) + to = rint(from); + else if (fpu_inverse_rounding(ROUND_DOWN)) { + to = rint(-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 = rint(from); + limit_precision(to); + fpu_restore_rounding_direction(old); + } + return V_EQ; +} + +template +inline Result +ceil_float(Type& to, const Type from, Rounding_Dir) { + if (To_Policy::check_nan_result && is_nan(from)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + if (fpu_direct_rounding(ROUND_UP)) + to = rint(from); + else if (fpu_inverse_rounding(ROUND_UP)) { + to = rint(-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 = rint(from); + limit_precision(to); + fpu_restore_rounding_direction(old); + } + return V_EQ; +} + +template +inline Result +trunc_float(Type& to, const Type from, Rounding_Dir dir) { + if (To_Policy::check_nan_result && is_nan(from)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + if (from >= 0) + return floor(to, from, dir); + else + return ceil(to, from, dir); +} + +template +inline Result +neg_float(Type& to, const Type from, Rounding_Dir) { + if (To_Policy::check_nan_result && is_nan(from)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + to = -from; + return V_EQ; +} + +template +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(x) && x == -y) + return assign_special(to, V_INF_ADD_INF, ROUND_IGNORE); + prepare_inexact(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::check_nan_result && is_nan(to)) + return VC_NAN; + return result_relation(dir); +} + +template +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(x) && x == y) + return assign_special(to, V_INF_SUB_INF, ROUND_IGNORE); + prepare_inexact(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::check_nan_result && is_nan(to)) + return VC_NAN; + return result_relation(dir); +} + +template +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(y)) || + (y == 0 && is_inf_float(x)))) + return assign_special(to, V_INF_MUL_ZERO, ROUND_IGNORE); + prepare_inexact(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::check_nan_result && is_nan(to)) + return VC_NAN; + return result_relation(dir); +} + +template +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(x) && is_inf_float(y)) + return assign_special(to, V_INF_DIV_INF, ROUND_IGNORE); + if (To_Policy::check_div_zero && y == 0) + return assign_special(to, V_DIV_ZERO, ROUND_IGNORE); + prepare_inexact(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::check_nan_result && is_nan(to)) + return VC_NAN; + return result_relation(dir); +} + +template +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(temp, x, y, dir); + if (is_special(r)) { + to = temp; + return r; + } + Result r1 = trunc(to, temp, ROUND_NOT_NEEDED); + assert(r1 == V_EQ); + if (r == V_EQ || to != temp) + return r1; + // FIXME: Prove that it's impossibile to return a strict relation + return dir == ROUND_UP ? V_LE : V_GE; +} + +template +inline Result +rem_float(Type& to, const Type x, const Type y, Rounding_Dir) { + if (To_Policy::check_inf_mod && is_inf_float(x)) + return assign_special(to, V_INF_MOD, ROUND_IGNORE); + if (To_Policy::check_div_zero && y == 0) + return assign_special(to, V_MOD_ZERO, ROUND_IGNORE); + to = std::fmod(x, y); + if (To_Policy::check_nan_result && is_nan(to)) + return VC_NAN; + return V_EQ; +} + +struct Float_2exp { + const_bool_nodef(has_nan, false); + const_bool_nodef(has_infinity, false); +}; + +template +inline Result +mul2exp_float(Type& to, const Type x, int exp, Rounding_Dir dir) { + if (To_Policy::check_nan_result && is_nan(x)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + if (exp < 0) + return div2exp(to, x, -exp, dir); + assert(static_cast(exp) < sizeof(unsigned long long) * 8); + return mul(to, x, static_cast(1ULL << exp), dir); +} + +template +inline Result +div2exp_float(Type& to, const Type x, int exp, Rounding_Dir dir) { + if (To_Policy::check_nan_result && is_nan(x)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + if (exp < 0) + return mul2exp(to, x, -exp, dir); + assert(static_cast(exp) < sizeof(unsigned long long) * 8); + return div(to, x, static_cast(1ULL << exp), dir); +} + +template +inline Result +abs_float(Type& to, const Type from, Rounding_Dir) { + if (To_Policy::check_nan_result && is_nan(from)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + to = std::abs(from); + return V_EQ; +} + +template +inline Result +sqrt_float(Type& to, const Type from, Rounding_Dir dir) { + if (To_Policy::check_nan_result && is_nan(from)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + if (To_Policy::check_sqrt_neg && from < 0) + return assign_special(to, V_SQRT_NEG, ROUND_IGNORE); + prepare_inexact(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(dir); +} + +template +inline Result +sgn_float(const Type x) { + return classify(x, false, false, true); +} + +template +inline Result +cmp_float(const Type x, const Type y) { + if (x > y) + return V_GT; + if (x < y) + return V_LT; + if (x == y) + return V_EQ; + return V_UNORD_COMP; +} + +template +inline Result +assign_float_int_inexact(To& to, const From from, Rounding_Dir dir) { + prepare_inexact(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(dir); +} + +template +inline Result +assign_float_int(To& to, const From from, Rounding_Dir dir) { + if (sizeof(From) * 8 > Float::Binary::MANTISSA_BITS) + return assign_float_int_inexact(to, from, dir); + else + return assign_exact(to, from, dir); +} + +template +inline Result +set_neg_overflow_float(T& to, Rounding_Dir dir) { + switch (round_dir(dir)) { + case ROUND_UP: + { + Float f; + f.u.binary.set_max(true); + to = f.value(); + return V_LT; + } + default: + to = -HUGE_VAL; + return V_GT; + } +} + +template +inline Result +set_pos_overflow_float(T& to, Rounding_Dir dir) { + switch (round_dir(dir)) { + case ROUND_DOWN: + { + Float f; + f.u.binary.set_max(false); + to = f.value(); + return V_GT; + } + default: + to = HUGE_VAL; + return V_LT; + } +} + +template +inline Result +assign_float_mpz(T& to, const mpz_class& _from, Rounding_Dir dir) +{ + mpz_srcptr from = _from.get_mpz_t(); + int sign = mpz_sgn(from); + if (sign == 0) { + to = 0; + return V_EQ; + } + size_t exponent = mpz_sizeinbase(from, 2) - 1; + if (exponent > static_cast(Float::Binary::EXPONENT_MAX)) { + if (sign < 0) + return set_neg_overflow_float(to, dir); + else + return set_pos_overflow_float(to, dir); + } + unsigned long zeroes = mpn_scan1(from->_mp_d, 0); + size_t meaningful_bits = exponent - zeroes; + mpz_t mantissa; + mpz_init(mantissa); + if (exponent > Float::Binary::MANTISSA_BITS) + mpz_tdiv_q_2exp(mantissa, + from, + exponent - Float::Binary::MANTISSA_BITS); + else + mpz_mul_2exp(mantissa, from, Float::Binary::MANTISSA_BITS - exponent); + Float f(to); + f.u.binary.build(sign < 0, mantissa, exponent); + mpz_clear(mantissa); + to = f.value(); + if (meaningful_bits > Float::Binary::MANTISSA_BITS) { + if (sign < 0) + return round_lt_float(to, dir); + else + return round_gt_float(to, dir); + } + return V_EQ; +} + +template +inline Result +assign_float_mpq(T& to, const mpq_class& from, Rounding_Dir dir) +{ + const mpz_class& _num = from.get_num(); + const mpz_class& _den = from.get_den(); + if (_den == 1) + return assign_float_mpz(to, _num, dir); + mpz_srcptr num = _num.get_mpz_t(); + mpz_srcptr den = _den.get_mpz_t(); + int sign = mpz_sgn(num); + signed long exponent = mpz_sizeinbase(num, 2) - mpz_sizeinbase(den, 2); + if (exponent < Float::Binary::EXPONENT_MIN_DENORM) { + to = 0; + inexact: + if (sign < 0) + return round_lt_float(to, dir); + else + return round_gt_float(to, dir); + } + if (exponent > static_cast(Float::Binary::EXPONENT_MAX + 1)) { + overflow: + if (sign < 0) + return set_neg_overflow_float(to, dir); + else + return set_pos_overflow_float(to, dir); + } + unsigned int needed_bits = Float::Binary::MANTISSA_BITS + 1; + if (exponent < Float::Binary::EXPONENT_MIN) + needed_bits -= Float::Binary::EXPONENT_MIN - exponent; + mpz_t mantissa; + mpz_init(mantissa); + signed long shift = needed_bits - exponent; + if (shift > 0) { + mpz_mul_2exp(mantissa, num, shift); + num = mantissa; + } + else if (shift < 0) { + mpz_mul_2exp(mantissa, den, -shift); + den = mantissa; + } + mpz_t r; + mpz_init(r); + mpz_tdiv_qr(mantissa, r, num, den); + size_t bits = mpz_sizeinbase(mantissa, 2); + bool inexact = (mpz_sgn(r) != 0); + mpz_clear(r); + if (bits == needed_bits + 1) { + inexact = (inexact || mpz_odd_p(mantissa)); + mpz_div_2exp(mantissa, mantissa, 1); + } + else + --exponent; + if (exponent > static_cast(Float::Binary::EXPONENT_MAX)) { + mpz_clear(mantissa); + goto overflow; + } + else if (exponent < Float::Binary::EXPONENT_MIN - 1) { + // Denormalized. + exponent = Float::Binary::EXPONENT_MIN - 1; + } + Float f(to); + f.u.binary.build(sign < 0, mantissa, exponent); + mpz_clear(mantissa); + to = f.value(); + if (inexact) + goto inexact; + return V_EQ; +} + +template +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(y)) || + (y == 0 && is_inf_float(x)))) + return assign_special(to, V_INF_MUL_ZERO, ROUND_IGNORE); + // FIXME: missing check_inf_add_inf + prepare_inexact(dir); + if (fpu_direct_rounding(dir)) + to = fma(x, y, to); + else if (fpu_inverse_rounding(dir)) { + to = fma(-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 = fma(x, y, to); + limit_precision(to); + fpu_restore_rounding_direction(old); + } + if (To_Policy::check_nan_result && is_nan(to)) + return VC_NAN; + return result_relation(dir); +} + +template +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(y)) || + (y == 0 && is_inf_float(x)))) + return assign_special(to, V_INF_MUL_ZERO, ROUND_IGNORE); + // FIXME: missing check_inf_add_inf + prepare_inexact(dir); + if (fpu_direct_rounding(dir)) + to = fma(x, -y, to); + else if (fpu_inverse_rounding(dir)) { + to = fma(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 = fma(x, -y, to); + limit_precision(to); + fpu_restore_rounding_direction(old); + } + if (To_Policy::check_nan_result && is_nan(to)) + return VC_NAN; + return result_relation(dir); +} + +template +inline Result +output_float(std::ostream& os, const Type from, const Numeric_Format&, + Rounding_Dir) { + if (from == 0) + os << "0"; + else if (is_minf(from)) + os << "-inf"; + else if (is_pinf(from)) + os << "+inf"; + else if (is_nan(from)) + os << "nan"; + else { + int old_precision = os.precision(10000); + // FIXME: here correctness depends on the behavior of the standard + // output operator which, in turn, may depend on the behavior + // of printf(). The C99 standard, 7.19.16.1#13, does not give + // enough guarantees. We could not find something similar + // in the C++ standard, so there is a concrete danger here. + os << from; + os.precision(old_precision); + } + 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, 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_MUL2EXP(mul2exp_float, float, float) +PPL_SPECIALIZE_DIV2EXP(div2exp_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, 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_MUL2EXP(mul2exp_float, double, double) +PPL_SPECIALIZE_DIV2EXP(div2exp_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, 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_MUL2EXP(mul2exp_float, long double, long double) +PPL_SPECIALIZE_DIV2EXP(div2exp_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_int.inlines.hh b/src/checked_int.inlines.hh new file mode 100644 index 0000000..6f48101 --- /dev/null +++ b/src/checked_int.inlines.hh @@ -0,0 +1,1574 @@ +/* Specialized "checked" functions for native integer numbers. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_checked_int_inlines_hh +#define PPL_checked_int_inlines_hh 1 + +#include "C_Integer.hh" +#include +#include +#include +#include + +#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 +struct Extended_Int { + static const Type plus_infinity = C_Integer::max; + static const Type minus_infinity = (C_Integer::min >= 0 + ? C_Integer::max - 1 + : C_Integer::min); + static const Type not_a_number = (C_Integer::min >= 0 + ? C_Integer::max - Policy::has_infinity * 2 + : C_Integer::min + Policy::has_infinity); + static const Type min = (C_Integer::min + + (C_Integer::min >= 0 ? 0 + : (Policy::has_infinity + Policy::has_nan))); + static const Type max = (C_Integer::max + - (C_Integer::min >= 0 + ? (2 * Policy::has_infinity + Policy::has_nan) + : Policy::has_infinity)); +}; + +template +inline Result +set_neg_overflow_int(To& to, Rounding_Dir dir) { + if (round_up(dir)) { + to = Extended_Int::min; + return V_LT; + } + else { + if (Policy::has_infinity) { + to = Extended_Int::minus_infinity; + return V_GT; + } + return V_NEG_OVERFLOW; + } +} + +template +inline Result +set_pos_overflow_int(To& to, Rounding_Dir dir) { + if (round_down(dir)) { + to = Extended_Int::max; + return V_GT; + } + else { + if (Policy::has_infinity) { + to = Extended_Int::plus_infinity; + return V_LT; + } + return V_POS_OVERFLOW; + } +} + +template +inline Result +round_lt_int_no_overflow(To& to, Rounding_Dir dir) { + if (round_down(dir)) { + --to; + return V_GT; + } + return V_LT; +} + +template +inline Result +round_gt_int_no_overflow(To& to, Rounding_Dir dir) { + if (round_up(dir)) { + ++to; + return V_LT; + } + return V_GT; +} + +template +inline Result +round_lt_int(To& to, Rounding_Dir dir) { + if (round_down(dir)) { + if (to == Extended_Int::min) { + if (Policy::has_infinity) { + to = Extended_Int::minus_infinity; + return V_GT; + } + return V_NEG_OVERFLOW; + } + else { + --to; + return V_GT; + } + } + return V_LT; +} + +template +inline Result +round_gt_int(To& to, Rounding_Dir dir) { + if (round_up(dir)) { + if (to == Extended_Int::max) { + if (Policy::has_infinity) { + to = Extended_Int::plus_infinity; + return V_LT; + } + return V_POS_OVERFLOW; + } + else { + ++to; + return V_LT; + } + } + return V_GT; +} + +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 +inline Result +classify_int(const Type v, bool nan, bool inf, bool sign) { + if (Policy::has_nan + && (nan || sign) + && v == Extended_Int::not_a_number) + return VC_NAN; + if (!inf & !sign) + return VC_NORMAL; + if (Policy::has_infinity) { + if (v == Extended_Int::minus_infinity) + return inf ? VC_MINUS_INFINITY : V_LT; + if (v == Extended_Int::plus_infinity) + return inf ? VC_PLUS_INFINITY : V_GT; + } + if (sign) { + if (v < 0) + return V_LT; + if (v > 0) + return V_GT; + return V_EQ; + } + return VC_NORMAL; +} + +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 +inline bool +is_nan_int(const Type v) { + return Policy::has_nan && v == Extended_Int::not_a_number; +} + +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 +inline bool +is_minf_int(const Type v) { + return Policy::has_infinity + && v == Extended_Int::minus_infinity; +} + +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 +inline bool +is_pinf_int(const Type v) { + return Policy::has_infinity + && v == Extended_Int::plus_infinity; +} + +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 +inline bool +is_int_int(const Type v) { + return !is_nan(v); +} + +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 +inline Result +assign_special_int(Type& v, Result r, Rounding_Dir dir) { + Result t = classify(r); + switch (t) { + case VC_NAN: + if (Policy::has_nan) + v = Extended_Int::not_a_number; + break; + case VC_MINUS_INFINITY: + if (Policy::has_infinity) { + v = Extended_Int::minus_infinity; + return V_EQ; + } + if (round_up(dir)) { + v = Extended_Int::min; + return V_LT; + } + break; + case VC_PLUS_INFINITY: + if (Policy::has_infinity) { + v = Extended_Int::plus_infinity; + return V_EQ; + } + if (round_down(dir)) { + v = Extended_Int::max; + return V_GT; + } + break; + default: + assert(0); + break; + } + return r; +} + +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 +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::min > Extended_Int::min + || Extended_Int::max < Extended_Int::max))) { + if (CHECK_P(To_Policy::check_overflow, + from < static_cast(Extended_Int::min))) + return set_neg_overflow_int(to, dir); + if (CHECK_P(To_Policy::check_overflow, + from > static_cast(Extended_Int::max))) + return set_pos_overflow_int(to, dir); + } + to = To(from); + return V_EQ; +} + +template +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(Extended_Int::max))) + return set_pos_overflow_int(to, dir); + } + to = To(from); + return V_EQ; +} + +template +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, dir); + if (sizeof(To) < sizeof(From)) { + if (CHECK_P(To_Policy::check_overflow, + from > static_cast(Extended_Int::max))) + return set_pos_overflow_int(to, dir); + } + to = To(from); + return V_EQ; +} + +template +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::max < Extended_Int::max)) { + if (CHECK_P(To_Policy::check_overflow, + from > static_cast(Extended_Int::max))) + return set_pos_overflow_int(to, dir); + } + to = 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) + +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) +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) + +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) +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) +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) +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 +inline Result +assign_int_float(To& to, const From from, Rounding_Dir dir) { + if (is_nan(from)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(from)) + return assign_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(from)) + return assign_special(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::min))) + return set_neg_overflow_int(to, dir); + if (CHECK_P(To_Policy::check_overflow, !le(from, Extended_Int::max))) + return set_pos_overflow_int(to, dir); +#else + if (CHECK_P(To_Policy::check_overflow, (from < Extended_Int::min))) + return set_neg_overflow_int(to, dir); + if (CHECK_P(To_Policy::check_overflow, (from > Extended_Int::max))) + return set_pos_overflow_int(to, dir); +#endif + From i_from = rint(from); + to = static_cast(i_from); + if (round_ignore(dir)) + return V_LGE; + if (from < i_from) + return round_lt_int(to, dir); + else if (from > i_from) + return round_gt_int(to, dir); + else + return V_EQ; +} + +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, 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, 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 +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 (v < C_Integer::min) + return set_neg_overflow_int(to, dir); + if (v > C_Integer::max) + return set_pos_overflow_int(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, v, dir); + to = v; + return V_EQ; + } + } + } + return ::sgn(from) < 0 + ? set_neg_overflow_int(to, dir) + : set_pos_overflow_int(to, dir); +} + +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 +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, dir); + if (sizeof(To) <= sizeof(unsigned long)) { + if (!To_Policy::check_overflow) { + to = from.get_ui(); + return V_EQ; + } + if (from.fits_ulong_p()) { + unsigned long v = from.get_ui(); + if (v > C_Integer::max) + return set_pos_overflow_int(to, dir); + to = v; + return V_EQ; + } + } + else { + mpz_srcptr m = from.get_mpz_t(); + size_t sz = mpz_size(m); + if (sz <= sizeof(To) / sizeof(mp_limb_t)) { + if (sz == 0) + to = 0; + else + mpz_export(&to, 0, -1, sizeof(To), 0, 0, m); + return V_EQ; + } + } + return set_pos_overflow_int(to, dir); +} + +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 +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_TEMP0(mpz_class, q); + mpz_ptr _q = q.get_mpz_t(); + if (round_ignore(dir)) { + mpz_tdiv_q(_q, n, d); + Result r = assign(to, q, dir); + if (r != V_EQ) + return r; + return V_LGE; + } + mpz_t rem; + int sign; + mpz_init(rem); + mpz_tdiv_qr(_q, rem, n, d); + sign = mpz_sgn(rem); + mpz_clear(rem); + Result r = assign(to, q, dir); + if (r != V_EQ) + return r; + switch (sign) { + case -1: + return round_lt_int(to, dir); + case 1: + return round_gt_int(to, dir); + default: + return V_EQ; + } +} + +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 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 +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 { + 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 { + 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 { + 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 { + 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 { + 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 { + 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 { + 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 { + 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 { + 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 { + 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 +inline Result +neg_int_larger(Type& to, const Type x, Rounding_Dir dir) { + typename Larger::type_for_neg l = x; + l = -l; + return assign(to, l, dir); +} + +template +inline Result +add_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) { + typename Larger::type_for_add l = x; + l += y; + return assign(to, l, dir); +} + +template +inline Result +sub_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) { + typename Larger::type_for_sub l = x; + l -= y; + return assign(to, l, dir); +} + +template +inline Result +mul_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) { + typename Larger::type_for_mul l = x; + l *= y; + return assign(to, l, dir); +} + +template +inline Result +neg_signed_int(Type& to, const Type from, Rounding_Dir dir) { + if (To_Policy::check_overflow && Larger::use_for_neg) + return neg_int_larger(to, from, dir); + if (CHECK_P(To_Policy::check_overflow, + (from < -Extended_Int::max))) + return set_pos_overflow_int(to, dir); + to = -from; + return V_EQ; +} + +template +inline Result +neg_unsigned_int(Type& to, const Type from, Rounding_Dir dir) { + if (To_Policy::check_overflow && Larger::use_for_neg) + return neg_int_larger(to, from, dir); + if (CHECK_P(To_Policy::check_overflow, from != 0)) + return set_neg_overflow_int(to, dir); + to = from; + return V_EQ; +} + +template +inline Result +add_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) { + if (To_Policy::check_overflow && Larger::use_for_add) + return add_int_larger(to, x, y, dir); + if (To_Policy::check_overflow) { + if (y >= 0) { + if (x > Extended_Int::max - y) + return set_pos_overflow_int(to, dir); + } + else if (x < Extended_Int::min - y) + return set_neg_overflow_int(to, dir); + } + to = x + y; + return V_EQ; +} + +template +inline Result +add_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) { + if (To_Policy::check_overflow && Larger::use_for_add) + return add_int_larger(to, x, y, dir); + if (CHECK_P(To_Policy::check_overflow, + (x > Extended_Int::max - y))) + return set_pos_overflow_int(to, dir); + to = x + y; + return V_EQ; +} + +template +inline Result +sub_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) { + if (To_Policy::check_overflow && Larger::use_for_sub) + return sub_int_larger(to, x, y, dir); + if (To_Policy::check_overflow) { + if (y >= 0) { + if (x < Extended_Int::min + y) + return set_neg_overflow_int(to, dir); + } + else if (x > Extended_Int::max + y) + return set_pos_overflow_int(to, dir); + } + to = x - y; + return V_EQ; +} + +template +inline Result +sub_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) { + if (To_Policy::check_overflow && Larger::use_for_sub) + return sub_int_larger(to, x, y, dir); + if (CHECK_P(To_Policy::check_overflow, + (x < Extended_Int::min + y))) + return set_neg_overflow_int(to, dir); + to = x - y; + return V_EQ; +} + +template +inline Result +mul_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) { + if (To_Policy::check_overflow && Larger::use_for_mul) + return mul_int_larger(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, x, dir); + if (x >= 0) { + if (y > 0) { + if (x > Extended_Int::max / y) + return set_pos_overflow_int(to, dir); + } + else { + if (x > Extended_Int::min / y) + return set_neg_overflow_int(to, dir); + } + } + else { + if (y < 0) { + if (x < Extended_Int::max / y) + return set_pos_overflow_int(to, dir); + } + else { + if (x < Extended_Int::min / y) + return set_neg_overflow_int(to, dir); + } + } + to = x * y; + return V_EQ; +} + +template +inline Result +mul_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) { + if (To_Policy::check_overflow && Larger::use_for_mul) + return mul_int_larger(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::max / y) + return set_pos_overflow_int(to, dir); + to = x * y; + return V_EQ; +} + +template +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_special(to, V_DIV_ZERO, ROUND_IGNORE); + if (To_Policy::check_overflow && y == -1) + return neg_signed_int(to, x, dir); + to = x / y; + if (round_ignore(dir)) + return V_LGE; + Type m = x % y; + if (m < 0) + return round_lt_int_no_overflow(to, dir); + else if (m > 0) + return round_gt_int_no_overflow(to, dir); + else + return V_EQ; +} + +template +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_special(to, V_DIV_ZERO, ROUND_IGNORE); + to = x / y; + if (round_ignore(dir)) + return V_GE; + Type m = x % y; + if (m == 0) + return V_EQ; + return round_gt_int(to, dir); +} + +template +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_special(to, V_DIV_ZERO, ROUND_IGNORE); + if (To_Policy::check_overflow && y == -1) + return neg_signed_int(to, x, dir); + to = x / y; + return V_EQ; +} + +template +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_special(to, V_DIV_ZERO, ROUND_IGNORE); + to = x / y; + return V_EQ; +} + +template +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_special(to, V_MOD_ZERO, ROUND_IGNORE); + to = x % y; + return V_EQ; +} + +template +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_special(to, V_MOD_ZERO, ROUND_IGNORE); + to = x % y; + return V_EQ; +} + +template +inline Result +div2exp_unsigned_int(Type& to, const Type x, int exp, Rounding_Dir dir) { + if (exp < 0) + return mul2exp(to, x, -exp, dir); + if (static_cast(exp) >= sizeof(Type) * 8) { + to = 0; + if (round_ignore(dir)) + return V_GE; + if (x == 0) + return V_EQ; + return round_gt_int_no_overflow(to, dir); + } + to = x >> exp; + if (round_ignore(dir)) + return V_GE; + if (x & ((static_cast(1) << exp) - 1)) + return round_gt_int_no_overflow(to, dir); + else + return V_EQ; +} + +template +inline Result +div2exp_signed_int(Type& to, const Type x, int exp, Rounding_Dir dir) { + if (exp < 0) + return mul2exp(to, x, -exp, dir); + if (static_cast(exp) >= sizeof(Type) * 8) { + zero: + to = 0; + if (round_ignore(dir)) + return V_LGE; + if (x < 0) + return round_lt_int_no_overflow(to, dir); + else if (x > 0) + return round_gt_int_no_overflow(to, dir); + else + return V_EQ; + } + if (static_cast(exp) >= sizeof(Type) * 8 - 1) { + if (x == C_Integer::min) { + to = -1; + return V_EQ; + } + goto zero; + } +#if 0 + to = x / (static_cast(1) << exp); + if (round_ignore(dir)) + return V_GE; + Type r = x % (static_cast(1) << exp); + if (r < 0) + return round_lt_int_no_overflow(to, dir); + else if (r > 0) + return round_gt_int_no_overflow(to, dir); + else + return V_EQ; +#else + // Faster but compiler implementation dependent (see C++98 5.8.3) + to = x >> exp; + if (round_ignore(dir)) + return V_GE; + if (x & ((static_cast(1) << exp) - 1)) + return round_gt_int_no_overflow(to, dir); + return V_EQ; +#endif +} + +template +inline Result +mul2exp_unsigned_int(Type& to, const Type x, int exp, Rounding_Dir dir) { + if (exp < 0) + return div2exp(to, x, -exp, dir); + if (!To_Policy::check_overflow) { + to = x << exp; + return V_EQ; + } + if (static_cast(exp) >= sizeof(Type) * 8) { + if (x == 0) { + to = 0; + return V_EQ; + } + return set_pos_overflow_int(to, dir); + } + if (x & (((static_cast(1) << exp) - 1) << (sizeof(Type) * 8 - exp))) + return set_pos_overflow_int(to, dir); + Type n = x << exp; + if (n > Extended_Int::max) + return set_pos_overflow_int(to, dir); + to = n; + return V_EQ; +} + +template +inline Result +mul2exp_signed_int(Type& to, const Type x, int exp, Rounding_Dir dir) { + if (exp < 0) + return div2exp(to, x, -exp, dir); + if (!To_Policy::check_overflow) { + to = x << exp; + return V_EQ; + } + if (static_cast(exp) >= sizeof(Type) * 8 - 1) { + if (x < 0) + return set_neg_overflow_int(to, dir); + else if (x > 0) + return set_pos_overflow_int(to, dir); + else { + to = 0; + return V_EQ; + } + } + Type mask = ((static_cast(1) << exp) - 1) + << (sizeof(Type) * 8 - 1 - exp); + Type n; + if (x < 0) { + if ((x & mask) != mask) + return set_neg_overflow_int(to, dir); + n = x << exp; + if (n < Extended_Int::min) + return set_neg_overflow_int(to, dir); + } + else { + if (x & mask) + return set_pos_overflow_int(to, dir); + n = x << exp; + if (n > Extended_Int::max) + return set_pos_overflow_int(to, dir); + } + to = n; + return V_EQ; +} + +template +inline void +isqrtrem(Type& q, Type& r, const Type from) { + q = 0; + r = from; + Type t(1); + for (t <<= 8 * sizeof(Type) - 2; t != 0; t >>= 2) { + Type s = q + t; + if (s <= r) { + r -= s; + q = s + t; + } + q >>= 1; + } +} + +template +inline Result +sqrt_unsigned_int(Type& to, const Type from, Rounding_Dir dir) { + Type rem; + isqrtrem(to, rem, from); + if (round_ignore(dir)) + return V_GE; + if (rem == 0) + return V_EQ; + return round_gt_int(to, dir); +} + +template +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_special(to, V_SQRT_NEG, ROUND_IGNORE); + return sqrt_unsigned_int(to, from, dir); +} + +template +inline Result +add_mul_int(Type& to, const Type x, const Type y, Rounding_Dir dir) { + Type z; + Result r = mul(z, x, y, dir); + switch (r) { + case V_NEG_OVERFLOW: + case V_LT: + if (to <= 0) { + to = z; + return r; + } + return assign_special(to, V_UNKNOWN_NEG_OVERFLOW, ROUND_IGNORE); + case V_POS_OVERFLOW: + case V_GT: + if (to >= 0) { + to = z; + return r; + } + return assign_special(to, V_UNKNOWN_POS_OVERFLOW, ROUND_IGNORE); + default: + return add(to, to, z, dir); + } +} + +template +inline Result +sub_mul_int(Type& to, const Type x, const Type y, Rounding_Dir dir) { + Type z; + Result r = mul(z, x, y, dir); + switch (r) { + case V_NEG_OVERFLOW: + case V_LT: + if (to >= 0) + return set_pos_overflow_int(to, dir); + return V_UNKNOWN_NEG_OVERFLOW; + case V_POS_OVERFLOW: + case V_GT: + if (to <= 0) + return set_neg_overflow_int(to, dir); + return V_UNKNOWN_POS_OVERFLOW; + default: + return sub(to, to, z, dir); + } +} + +template +inline Result +output_char(std::ostream& os, Type& from, + const Numeric_Format&, Rounding_Dir) { + os << static_cast(from); + return V_EQ; +} + +template +inline Result +output_int(std::ostream& os, Type& from, const Numeric_Format&, Rounding_Dir) { + os << from; + return V_EQ; +} + +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) +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) + +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) +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) + +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) +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) + +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) +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) + +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) +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) + +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) +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) + +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) +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) + +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) +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) + +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) +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) + +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) +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) + +PPL_SPECIALIZE_MUL2EXP(mul2exp_signed_int, signed char, signed char) +PPL_SPECIALIZE_MUL2EXP(mul2exp_signed_int, signed short, signed short) +PPL_SPECIALIZE_MUL2EXP(mul2exp_signed_int, signed int, signed int) +PPL_SPECIALIZE_MUL2EXP(mul2exp_signed_int, signed long, signed long) +PPL_SPECIALIZE_MUL2EXP(mul2exp_signed_int, signed long long, signed long long) +PPL_SPECIALIZE_MUL2EXP(mul2exp_unsigned_int, unsigned char, unsigned char) +PPL_SPECIALIZE_MUL2EXP(mul2exp_unsigned_int, unsigned short, unsigned short) +PPL_SPECIALIZE_MUL2EXP(mul2exp_unsigned_int, unsigned int, unsigned int) +PPL_SPECIALIZE_MUL2EXP(mul2exp_unsigned_int, unsigned long, unsigned long) +PPL_SPECIALIZE_MUL2EXP(mul2exp_unsigned_int, unsigned long long, unsigned long long) + +PPL_SPECIALIZE_DIV2EXP(div2exp_signed_int, signed char, signed char) +PPL_SPECIALIZE_DIV2EXP(div2exp_signed_int, signed short, signed short) +PPL_SPECIALIZE_DIV2EXP(div2exp_signed_int, signed int, signed int) +PPL_SPECIALIZE_DIV2EXP(div2exp_signed_int, signed long, signed long) +PPL_SPECIALIZE_DIV2EXP(div2exp_signed_int, signed long long, signed long long) +PPL_SPECIALIZE_DIV2EXP(div2exp_unsigned_int, unsigned char, unsigned char) +PPL_SPECIALIZE_DIV2EXP(div2exp_unsigned_int, unsigned short, unsigned short) +PPL_SPECIALIZE_DIV2EXP(div2exp_unsigned_int, unsigned int, unsigned int) +PPL_SPECIALIZE_DIV2EXP(div2exp_unsigned_int, unsigned long, unsigned long) +PPL_SPECIALIZE_DIV2EXP(div2exp_unsigned_int, unsigned long long, unsigned long long) + +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) +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) + +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) +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, 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, 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, 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, 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, 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, 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, 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, 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, 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..c4bfef2 --- /dev/null +++ b/src/checked_mpq.inlines.hh @@ -0,0 +1,484 @@ +/* Specialized "checked" functions for GMP's mpq_class numbers. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_checked_mpq_inlines_hh +#define PPL_checked_mpq_inlines_hh 1 + +#include +#include +#include + +namespace Parma_Polyhedra_Library { + +namespace Checked { + +template +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 VC_NAN; + if (!inf && !sign) + return VC_NORMAL; + if (Policy::has_infinity) { + if (s < 0) + return inf ? VC_MINUS_INFINITY : V_LT; + if (s > 0) + return inf ? VC_PLUS_INFINITY : V_GT; + } + } + if (sign) + return sgn(v); + return VC_NORMAL; +} + +PPL_SPECIALIZE_CLASSIFY(classify_mpq, mpq_class) + +template +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 +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 +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 +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 +inline Result +assign_special_mpq(mpq_class& v, Result r, Rounding_Dir) { + Result c = classify(r); + if (Policy::has_nan && c == VC_NAN) { + v.get_num() = 0; + v.get_den() = 0; + } + else if (Policy::has_infinity) { + switch (c) { + case VC_MINUS_INFINITY: + v.get_num() = -1; + v.get_den() = 0; + return V_EQ; + case VC_PLUS_INFINITY: + v.get_num() = 1; + v.get_den() = 0; + return V_EQ; + default: + break; + } + } + return r; +} + +PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_mpq, mpq_class) + +PPL_SPECIALIZE_COPY(copy_generic, mpq_class) + +template +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, 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 +inline Result +construct_mpq_float(mpq_class& to, const From& from, Rounding_Dir dir) { + if (is_nan(from)) + return construct_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(from)) + return construct_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(from)) + return construct_special(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, 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 +inline Result +assign_mpq_float(mpq_class& to, const From& from, Rounding_Dir dir) { + if (is_nan(from)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(from)) + return assign_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(from)) + return assign_special(to, VC_PLUS_INFINITY, dir); + to = from; + return V_EQ; +} + +PPL_SPECIALIZE_ASSIGN(assign_mpq_float, mpq_class, float) +PPL_SPECIALIZE_ASSIGN(assign_mpq_float, mpq_class, double) + +template +inline Result +assign_mpq_signed_int(mpq_class& to, const From from, Rounding_Dir) { + if (sizeof(From) <= sizeof(signed long)) + to = static_cast(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 +inline Result +assign_mpq_unsigned_int(mpq_class& to, const From from, Rounding_Dir) { + if (sizeof(From) <= sizeof(unsigned long)) + to = static_cast(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 +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 +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 +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 +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 +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 +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 +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 +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_special(to, V_DIV_ZERO, ROUND_IGNORE); + to = x / y; + return V_EQ; +} + +PPL_SPECIALIZE_DIV(div_mpq, mpq_class, mpq_class, mpq_class) + +template +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_special(to, V_DIV_ZERO, ROUND_IGNORE); + to = x / y; + return trunc(to, to, dir); +} + +PPL_SPECIALIZE_IDIV(idiv_mpq, mpq_class, mpq_class, mpq_class) + +template +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_special(to, V_MOD_ZERO, ROUND_IGNORE); + to = x / y; + to.get_num() %= to.get_den(); + return V_EQ; +} + +PPL_SPECIALIZE_REM(rem_mpq, mpq_class, mpq_class, mpq_class) + +template +inline Result +mul2exp_mpq(mpq_class& to, const mpq_class& x, int exp, Rounding_Dir dir) { + if (exp < 0) + return div2exp(to, x, -exp, dir); + mpz_mul_2exp(to.get_num().get_mpz_t(), x.get_num().get_mpz_t(), exp); + to.get_den() = x.get_den(); + to.canonicalize(); + return V_EQ; +} + +PPL_SPECIALIZE_MUL2EXP(mul2exp_mpq, mpq_class, mpq_class) + +template +inline Result +div2exp_mpq(mpq_class& to, const mpq_class& x, int exp, Rounding_Dir dir) { + if (exp < 0) + return mul2exp(to, x, -exp, dir); + to.get_num() = x.get_num(); + mpz_mul_2exp(to.get_den().get_mpz_t(), x.get_den().get_mpz_t(), exp); + to.canonicalize(); + return V_EQ; +} + +PPL_SPECIALIZE_DIV2EXP(div2exp_mpq, mpq_class, mpq_class) + +template +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 +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 +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 long rational_sqrt_precision_parameter; + +template +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_special(to, V_SQRT_NEG, ROUND_IGNORE); + 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); + mul2exp(to_a, from_a, 2*rational_sqrt_precision_parameter, ROUND_IGNORE); + Result rdiv + = div(to_a, to_a, from_b, rdir); + Result rsqrt = sqrt(to_a, to_a, rdir); + to_b = 1; + mul2exp(to_b, to_b, rational_sqrt_precision_parameter, ROUND_IGNORE); + to.canonicalize(); + return rdiv != V_EQ ? rdiv : rsqrt; +} + +PPL_SPECIALIZE_SQRT(sqrt_mpq, mpq_class, mpq_class) + +template +inline Result +input_mpq(mpq_class& to, std::istream& is, Rounding_Dir) { + Result r = input_mpq(to, is); + switch (classify(r)) { + case VC_MINUS_INFINITY: + case VC_PLUS_INFINITY: + case VC_NAN: + return assign_special(to, r, ROUND_IGNORE); + default: + return r; + } +} + +PPL_SPECIALIZE_INPUT(input_mpq, mpq_class) + +template +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) + +template +inline Result +assign_mpq_long_double(mpq_class& to, const From& from, Rounding_Dir dir) { + if (is_nan(from)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(from)) + return assign_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(from)) + return assign_special(to, VC_PLUS_INFINITY, dir); + // FIXME: this is an incredibly inefficient implementation! + std::stringstream ss; + output(ss, from, Numeric_Format(), dir); + return input_mpq(to, ss); +} + +PPL_SPECIALIZE_ASSIGN(assign_mpq_long_double, mpq_class, long double) + +} // namespace Checked + +//! Returns the precision parameter used for rational square root calculations. +inline unsigned +rational_sqrt_precision_parameter() { + return Checked::rational_sqrt_precision_parameter; +} + +//! Sets the precision parameter used for rational square root calculations. +/*! The lesser between numerator and denominator is limited to 2**\p p. + + If \p p is less than or equal to INT_MAX, sets the + precision parameter used for rational square root calculations to \p p. + + \exception std::invalid_argument + Thrown if \p p is greater than INT_MAX. +*/ +inline void +set_rational_sqrt_precision_parameter(const unsigned p) { + if (p <= INT_MAX) + Checked::rational_sqrt_precision_parameter = p; + else + throw std::invalid_argument("PPL::set_rational_sqrt_precision_parameter(p)" + " with p > INT_MAX"); +} + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_checked_mpq_inlines_hh) diff --git a/src/checked_mpz.inlines.hh b/src/checked_mpz.inlines.hh new file mode 100644 index 0000000..ccc7af2 --- /dev/null +++ b/src/checked_mpz.inlines.hh @@ -0,0 +1,569 @@ +/* Specialized "checked" functions for GMP's mpz_class numbers. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_checked_mpz_inlines_hh +#define PPL_checked_mpz_inlines_hh 1 + +#include + +namespace Parma_Polyhedra_Library { + +namespace Checked { + +template +inline Result +round_lt_mpz(mpz_class& to, Rounding_Dir dir) { + if (round_down(dir)) { + --to; + return V_GT; + } + return V_LT; +} + +template +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 +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::min + 1) + return VC_NAN; + if (!inf && !sign) + return VC_NORMAL; + if (Policy::has_infinity) { + if (s == C_Integer::min) + return inf ? VC_MINUS_INFINITY : V_LT; + if (s == C_Integer::max) + return inf ? VC_PLUS_INFINITY : V_GT; + } + } + if (sign) + return sgn(v); + return VC_NORMAL; +} + +PPL_SPECIALIZE_CLASSIFY(classify_mpz, mpz_class) + +template +inline bool +is_nan_mpz(const mpz_class& v) { + return Policy::has_nan + && get_mp_size(v) == C_Integer::min + 1; +} + +PPL_SPECIALIZE_IS_NAN(is_nan_mpz, mpz_class) + +template +inline bool +is_minf_mpz(const mpz_class& v) { + return Policy::has_infinity + && get_mp_size(v) == C_Integer::min; +} + +PPL_SPECIALIZE_IS_MINF(is_minf_mpz, mpz_class) + +template +inline bool +is_pinf_mpz(const mpz_class& v) { + return Policy::has_infinity + && get_mp_size(v) == C_Integer::max; +} + +PPL_SPECIALIZE_IS_PINF(is_pinf_mpz, mpz_class) + +template +inline bool +is_int_mpz(const mpz_class& v) { + return !is_nan(v); +} + +PPL_SPECIALIZE_IS_INT(is_int_mpz, mpz_class) + +template +inline Result +assign_special_mpz(mpz_class& v, Result r, Rounding_Dir) { + Result c = classify(r); + if (Policy::has_nan && c == VC_NAN) + set_mp_size(v, C_Integer::min + 1); + else if (Policy::has_infinity) { + switch (c) { + case VC_MINUS_INFINITY: + set_mp_size(v, C_Integer::min); + return V_EQ; + case VC_PLUS_INFINITY: + set_mp_size(v, C_Integer::max); + return V_EQ; + default: + break; + } + } + return r; +} + +PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_mpz, mpz_class) + +template +inline void +copy_mpz(mpz_class& to, const mpz_class& from) { + if (is_nan_mpz(from)) + assert(To_Policy::has_nan); + else if (is_minf_mpz(from) || is_pinf_mpz(from)) + 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 +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, 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 +inline Result +construct_mpz_float(mpz_class& to, const From& from, Rounding_Dir dir) { + if (is_nan(from)) + return construct_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(from)) + return construct_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(from)) + return construct_special(to, VC_PLUS_INFINITY, dir); + if (round_ignore(dir)) { + new (&to) mpz_class(from); + return V_LGE; + } + From n = rint(from); + new (&to) mpz_class(n); + if (from < n) + return round_lt_mpz(to, dir); + else if (from > n) + return round_gt_mpz(to, dir); + else + return V_EQ; +} + +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, 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 +inline Result +assign_mpz_signed_int(mpz_class& to, const From from, Rounding_Dir) { + if (sizeof(From) <= sizeof(signed long)) + to = static_cast(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 +inline Result +assign_mpz_unsigned_int(mpz_class& to, const From from, Rounding_Dir) { + if (sizeof(From) <= sizeof(unsigned long)) + to = static_cast(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 +inline Result +assign_mpz_float(mpz_class& to, const From from, Rounding_Dir dir) { + if (is_nan(from)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(from)) + return assign_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(from)) + return assign_special(to, VC_PLUS_INFINITY, dir); + if (round_ignore(dir)) { + to = from; + return V_LGE; + } + From n = rint(from); + to = n; + if (from < n) + return round_lt_mpz(to, dir); + else if (from > n) + return round_gt_mpz(to, dir); + else + return V_EQ; +} + +PPL_SPECIALIZE_ASSIGN(assign_mpz_float, mpz_class, float) +PPL_SPECIALIZE_ASSIGN(assign_mpz_float, mpz_class, double) + +template +inline Result +assign_mpz_long_double(mpz_class& to, const From& from, Rounding_Dir dir) { + if (is_nan(from)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(from)) + return assign_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(from)) + return assign_special(to, VC_PLUS_INFINITY, dir); + // FIXME: this is an incredibly inefficient implementation! + std::stringstream ss; + output(ss, from, Numeric_Format(), dir); + PPL_DIRTY_TEMP0(mpq_class, tmp); +#ifndef NDEBUG + Result r = +#endif + input_mpq(tmp, ss); + assert(r == V_EQ); + return assign(to, tmp, dir); +} + +PPL_SPECIALIZE_ASSIGN(assign_mpz_long_double, mpz_class, long double) + +template +inline Result +assign_mpz_mpq(mpz_class& to, const mpq_class& from, Rounding_Dir dir) { + if (round_ignore(dir)) { + to = from; + return V_LGE; + } + mpz_srcptr n = from.get_num().get_mpz_t(); + mpz_srcptr d = from.get_den().get_mpz_t(); + if (round_down(dir)) { + mpz_fdiv_q(to.get_mpz_t(), n, d); + return mpz_divisible_p(n, d) ? V_EQ : V_GT; + } + else { + assert(round_up(dir)); + mpz_cdiv_q(to.get_mpz_t(), n, d); + return mpz_divisible_p(n, d) ? V_EQ : V_LT; + } +} + +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 +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 +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 +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 +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 +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_special(to, V_DIV_ZERO, ROUND_IGNORE); + mpz_srcptr n = x.get_mpz_t(); + mpz_srcptr d = y.get_mpz_t(); + if (round_ignore(dir)) { +#if 0 + // FIXME: we need to reconsider Rounding_Dir argument to clarify if + // client code intention is to have approximate result without any interest + // in knowing the direction of rounding or to grant to called function + // that result will be exact. + mpz_divexact(to.get_mpz_t(), n, d); + return V_LGE; +#else + mpz_cdiv_q(to.get_mpz_t(), n, d); + return V_LE; +#endif + } + if (round_down(dir)) { + mpz_fdiv_q(to.get_mpz_t(), n, d); + return mpz_divisible_p(n, d) ? V_EQ : V_GT; + } + else { + assert(round_up(dir)); + mpz_cdiv_q(to.get_mpz_t(), n, d); + return mpz_divisible_p(n, d) ? V_EQ : V_LT; + } +} + +PPL_SPECIALIZE_DIV(div_mpz, mpz_class, mpz_class, mpz_class) + +template +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_special(to, V_DIV_ZERO, ROUND_IGNORE); + 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 +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_special(to, V_MOD_ZERO, ROUND_IGNORE); + to = x % y; + return V_EQ; +} + +PPL_SPECIALIZE_REM(rem_mpz, mpz_class, mpz_class, mpz_class) + +template +inline Result +mul2exp_mpz(mpz_class& to, const mpz_class& x, int exp, Rounding_Dir dir) { + if (exp < 0) + return div2exp(to, x, -exp, dir); + mpz_mul_2exp(to.get_mpz_t(), x.get_mpz_t(), exp); + return V_EQ; +} + +PPL_SPECIALIZE_MUL2EXP(mul2exp_mpz, mpz_class, mpz_class) + +template +inline Result +div2exp_mpz(mpz_class& to, const mpz_class& x, int exp, Rounding_Dir dir) { + if (exp < 0) + return mul2exp(to, x, -exp, dir); + mpz_srcptr n = x.get_mpz_t(); + if (round_ignore(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); + return mpz_divisible_2exp_p(n, exp) ? V_EQ : V_GT; + } + else { + assert(round_up(dir)); + mpz_cdiv_q_2exp(to.get_mpz_t(), n, exp); + return mpz_divisible_2exp_p(n, exp) ? V_EQ : V_LT; + } +} + +PPL_SPECIALIZE_DIV2EXP(div2exp_mpz, mpz_class, mpz_class) + +template +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 +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 +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 +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 +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 +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 +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_special(to, V_SQRT_NEG, ROUND_IGNORE); + if (round_ignore(dir)) { + to = sqrt(from); + return V_GE; + } + PPL_DIRTY_TEMP0(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, dir); +} + +PPL_SPECIALIZE_SQRT(sqrt_mpz, mpz_class, mpz_class) + +template +inline Result +sgn_mp(const Type& x) { + int i = ::sgn(x); + return i > 0 ? V_GT : i == 0 ? V_EQ : V_LT; +} + +PPL_SPECIALIZE_SGN(sgn_mp, mpz_class) +PPL_SPECIALIZE_SGN(sgn_mp, mpq_class) + +template +inline Result +cmp_mp(const Type& x, const Type& y) { + int i = ::cmp(x, y); + return i > 0 ? V_GT : i == 0 ? V_EQ : V_LT; +} + +PPL_SPECIALIZE_CMP(cmp_mp, mpz_class, mpz_class) +PPL_SPECIALIZE_CMP(cmp_mp, mpq_class, mpq_class) + +template +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..8484324 --- /dev/null +++ b/src/checked_numeric_limits.hh @@ -0,0 +1,162 @@ +/* Specializations of std::numeric_limits for "checked" types. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_checked_numeric_limits_hh +#define PPL_checked_numeric_limits_hh 1 + +#include "Checked_Number.defs.hh" +#include "checked_int.inlines.hh" +#include + +namespace std { + +using namespace Parma_Polyhedra_Library; + +#define PPL_SPECIALIZE_LIMITS_INT(T) \ +/*! \brief Partial specialization of std::numeric_limits. */ \ +template \ + class numeric_limits > \ + : public numeric_limits { \ + private: \ + typedef Checked_Number Type; \ + \ + public: \ + static const bool has_infinity = Policy::has_infinity; \ + static const bool has_quiet_NaN = Policy::has_nan; \ + \ + static Type min() { \ + return Checked::Extended_Int::min; \ + } \ + \ + static Type max() { \ + return Checked::Extended_Int::max; \ + } \ + \ + static Type infinity() { \ + return \ + Policy::has_infinity \ + ? PLUS_INFINITY \ + : static_cast(0); \ + } \ + \ + static Type quiet_NaN() { \ + return \ + Policy::has_nan \ + ? NOT_A_NUMBER \ + : static_cast(0); \ + } \ +}; + +PPL_SPECIALIZE_LIMITS_INT(signed char) +PPL_SPECIALIZE_LIMITS_INT(signed short) +PPL_SPECIALIZE_LIMITS_INT(signed int) +PPL_SPECIALIZE_LIMITS_INT(signed long) +PPL_SPECIALIZE_LIMITS_INT(signed long long) + +PPL_SPECIALIZE_LIMITS_INT(unsigned char) +PPL_SPECIALIZE_LIMITS_INT(unsigned short) +PPL_SPECIALIZE_LIMITS_INT(unsigned int) +PPL_SPECIALIZE_LIMITS_INT(unsigned long) +PPL_SPECIALIZE_LIMITS_INT(unsigned long long) + +#undef PPL_SPECIALIZE_LIMITS_INT + +#define PPL_SPECIALIZE_LIMITS_FLOAT(T) \ +/*! \brief Partial specialization of std::numeric_limits. */ \ +template \ +struct numeric_limits > \ + : public numeric_limits { \ +}; + +#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 +class +numeric_limits > + : public numeric_limits { +private: + typedef Checked_Number Type; + +public: + static const bool has_infinity = Policy::has_infinity; + static const bool has_quiet_NaN = Policy::has_nan; + + static Type infinity() { + return + Policy::has_infinity + ? PLUS_INFINITY + : static_cast(0); + } + + static Type quiet_NaN() { + return + Policy::has_nan + ? NOT_A_NUMBER + : static_cast(0); + } +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Partial specialization of std::numeric_limits. +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +class +numeric_limits > +: public numeric_limits { +private: + typedef Checked_Number Type; + +public: + static const bool has_infinity = Policy::has_infinity; + static const bool has_quiet_NaN = Policy::has_nan; + + static Type infinity() { + return + Policy::has_infinity + ? PLUS_INFINITY + : static_cast(0); + } + + static Type quiet_NaN() { + return + Policy::has_nan + ? NOT_A_NUMBER + : static_cast(0); + } +}; + +} // namespace std + +#endif // !defined(PPL_checked_numeric_limits_hh) diff --git a/src/compiler.hh b/src/compiler.hh new file mode 100644 index 0000000..7e08dd9 --- /dev/null +++ b/src/compiler.hh @@ -0,0 +1,79 @@ +/* C++ compiler related stuff. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_compiler_hh +#define PPL_compiler_hh 1 + +namespace Parma_Polyhedra_Library { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \brief + No-op function that allows to avoid unused variable warnings from + the compiler. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +inline void +used(const T&) { +} + +#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 +inline void +cc_flush(const T& x) { +#if defined(__GNUC__) || defined(__INTEL_COMPILER) + __asm__ __volatile__ ("" : "+m" (const_cast(x))); +#else + // FIXME: is it possible to achieve the same effect in a portable way? + 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 +struct Suppress_Uninitialized_Warnings_Type { + typedef T synonym; +}; + +#define PPL_UNINITIALIZED(type, name) \ + type name = Suppress_Uninitialized_Warnings_Type::synonym () +#else +#define PPL_UNINITIALIZED(type, name) \ + type name +#endif + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_compiler_hh) diff --git a/src/conversion.cc b/src/conversion.cc new file mode 100644 index 0000000..3fd1757 --- /dev/null +++ b/src/conversion.cc @@ -0,0 +1,859 @@ +/* Polyhedron class implementation: conversion(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Linear_Row.defs.hh" +#include "Linear_System.defs.hh" +#include "Bit_Row.defs.hh" +#include "Bit_Matrix.defs.hh" +#include "Polyhedron.defs.hh" +#include "Scalar_Products.defs.hh" +#include "Temp.defs.hh" +#include +#include + +namespace PPL = Parma_Polyhedra_Library; + +// True if abandon_expensive_computations should be checked often, +// where the meaning of "often" is as stated in the documentation +// of that variable. +#define REACTIVE_ABANDONING 1 + +/*! + \return + The number of lines of the polyhedron or the number of equality + constraints in the result of conversion. + + \param source + The system to use to convert \p dest: it may be modified; + + \param start + The index of \p source row from which conversion begin; + + \param dest + The result of the conversion; + + \param sat + The saturation matrix telling us, for each row in \p source, which + are the rows of \p dest that satisfy but do not saturate it; + + \param num_lines_or_equalities + The number of rows in the system \p dest that are either lines of + the polyhedron (when \p dest is a system of generators) or equality + constraints (when \p dest is a system of constraints). + + For simplicity, all the following comments assume we are converting a + constraint system \p source to a generator system \p dest; + the comments for the symmetric case can be obtained by duality. + + If some of the constraints in \p source are redundant, they will be removed. + This is why the \p source is not declared to be a constant parameter. + + If \p start is 0, then \p source is a sorted system; also, \p dest is + a generator system corresponding to an empty constraint system. + If otherwise \p start is greater than 0, then the two sub-systems of + \p source made by the non-pending rows and the pending rows, respectively, + are both sorted; also, \p dest is the generator system corresponding to + the non-pending constraints of \p source. + + Independently from the value of \p start, \p dest has lines from index 0 + to index \p num_lines_or_equalities - 1 and rays/points from index + \p num_lines_or_equalities to the last of its rows. + + Note that here the rows of \p sat are indexed by rows of \p dest + and its columns are indexed by rows of \p source. + + We know that polyhedra can be represented by both a system of + constraints or a system of generators (points, rays and lines) + (see Section \ref representation). + When we have both descriptions for a polyhedron \f$P\f$ + we have what is called a double description + (or DD pair) for \f$P\f$. + + Here, the representation system refers to the system \f$C\f$ + whose rows represent the constraints that characterize \f$P\f$ + and the generating system, 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 double description pair if + \f[ + C\vect{x} \geq \vect{0} + \quad\iff\quad + \exists \vect{\lambda} \geq \vect{0} \mathrel{.} + \vect{x} = G\vect{\lambda}. + \f] + + The term "double description" is quite natural in the sense that + such a pair contains two different description of the same object. + In fact, if we refer to the cone representation of a polyhedron \f$P\f$ + and we call \f$C\f$ and \f$G\f$ the systems of constraints and + rays respectively, we have + \f[ + P = \{\, \vect{x} \in \Rset^n \mid C\vect{x} \geq \vect{0}\, \} + = \{\, \vect{x} \in \Rset^n \mid \vect{x} = G\vect{\lambda} + \text{ for some } \vect{\lambda} \geq \vect{0}\, \}. + \f] + + Because of the theorem of Minkowski (see Section \ref prelims), + we can say that, given a \f$m \times n\f$ representation system + \f$C\f$ such that + \f$\mathop{\mathrm{rank}}(C) = n = \mathit{dimension of the whole space}\f$ + for a non-empty polyhedron \f$P\f$, + it is always possible to find a generating system \f$G\f$ for \f$P\f$ + such that \f$(C, G)\f$ is a DD pair. + Conversely, Weyl's theorem ensures that, for each generating system + \f$G\f$, it is possible to find a representation system \f$C\f$ + such that \f$(C, G)\f$ is a DD pair. + + For efficiency reasons, our representation of polyhedra makes use + of a double description. + We are thus left with two problems: + -# given \f$C\f$ find \f$G\f$ such that \f$(C, G)\f$ is a DD pair; + -# given \f$G\f$ find \f$C\f$ such that \f$(C, G)\f$ is a DD pair. + + Using Farkas' Lemma we can prove that these two problems are + computationally equivalent (i.e., linear-time reducible to each other). + Farkas' Lemma establishes a fundamental property of vectors in + \f$\Rset^n\f$ that, in a sense, captures the essence of duality. + Consider a matrix \f$A \in \Rset^{m \times n}\f$ and let + \f$\{ \vect{a}_1, \ldots, \vect{a}_m \}\f$ be its set of row vectors. + Consider also another vector \f$\vect{c} \in \Rset^n\f$ such that, + whenever a vector \f$\vect{y} \in \Rset^n\f$ has a non-negative projection + on the \f$\vect{a}_i\f$'s, it also has a non-negative projection + on \f$\vect{c}\f$. + The lemma states that \f$\vect{c}\f$ has this property if and only if + it is in the cone generated by the \f$\vect{a}_i\f$'s. + Formally, the lemma states the equivalence of the two following + assertions: + -# \f$ + \forall \vect{y} + \mathrel{:} (A\vect{y} \geq 0 \implies + \langle \vect{y},\vect{c} \rangle \geq 0) + \f$; + -# \f$ + \exists \vect{\lambda} \geq \vect{0} + \mathrel{.} \vect{c}^\mathrm{T} = \vect{\lambda}^\mathrm{T}A + \f$. + + With this result we can prove that \f$(C, G)\f$ is a DD pair + if and only if \f$(G^\mathrm{T}, C^\mathrm{T})\f$ is a DD pair. + + Suppose \f$(C, G)\f$ is a DD pair. + Thus, for each \f$x\f$ of the appropriate dimension, + \f$C\vect{x} \geq \vect{0}\f$ if and only if + \f$\exists \lambda \geq 0 \mathrel{.} \vect{x} = G\vect{\lambda}\f$, + which is of course equivalent to + \f$ + \exists \vect{\lambda} \geq \vect{0} + \mathrel{.} \vect{x}^\mathrm{T} = \vect{\lambda}^\mathrm{T}G^\mathrm{T} + \f$. + + First, we assume that \f$\vect{z}\f$ is such that + \f$G^\mathrm{T}\vect{z} \geq \vect{0}\f$ + and we will show that + \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.} + \vect{z} = C^\mathrm{T}\vect{\mu}\f$. + Let \f$\vect{x}\f$ be such that \f$C\vect{x} \geq \vect{0}\f$. + Since \f$(C, G)\f$ is a DD pair, this is equivalent to + \f$ + \exists \vect{\lambda} \geq \vect{0} + \mathrel{.} \vect{x}^\mathrm{T} = \vect{\lambda}^\mathrm{T}G^\mathrm{T} + \f$, + which, by Farkas' Lemma is equivalent to + \f$ + \forall \vect{y} \mathrel{:} (G^\mathrm{T}\vect{y} \geq \vect{0} \implies + \langle \vect{y}, \vect{x} \rangle \geq 0) + \f$. + Taking \f$\vect{y} = \vect{z}\f$ and recalling our assumption that + \f$G^\mathrm{T}\vect{z} \geq \vect{0}\f$ + we can conclude that \f$\langle \vect{z}, \vect{x} \rangle \geq 0\f$, + that is equivalent to \f$\langle \vect{x}, \vect{z} \rangle \geq 0\f$. + We have thus established that + \f$ + \forall \vect{x} \mathrel{:} (C\vect{x} \geq \vect{0} \implies + \langle \vect{x}, \vect{z} \rangle \geq 0) + \f$. + By Farkas' Lemma, this is equivalent to + \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.} + \vect{z}^\mathrm{T} = \vect{\mu}^\mathrm{T} C\f$, + which is equivalent to what we wanted to prove, that is, + \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.} + \vect{z} = C^\mathrm{T}\vect{\mu}\f$. + + In order to prove the reverse implication, the following observation + turns out to be useful: + when \f$(C, G)\f$ is a DD pair, \f$CG \geq 0\f$. + In fact, + let \f$\vect{e}_j\f$ be the vector whose components are all \f$0\f$ + apart from the \f$j\f$-th one, which is \f$1\f$. + Clearly \f$\vect{e}_j \geq \vect{0}\f$ and, taking + \f$\vect{\lambda} = \vect{e}_j\f$ and + \f$\vect{x} = G\vect{\lambda} = G \vect{e}_j\f$, we have + \f$C\vect{x} = C(G \vect{e}_j) = (CG)\vect{e}_j \geq \vect{0}\f$, + since \f$(C, G)\f$ is a DD pair. + Thus, as \f$(CG)\vect{e}_j\f$ is the \f$j\f$-th column of \f$CG\f$ + and since the choice of \f$j\f$ was arbitrary, \f$CG \geq \vect{0}\f$. + + We now assume that \f$\vect{z}\f$ is such that + \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.} + \vect{z} = C^\mathrm{T}\vect{\mu}\f$ + and we will prove that \f$G^\mathrm{T}\vect{z} \geq \vect{0}\f$. + By Farkas' Lemma, the assumption + \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.} + \vect{z}^\mathrm{T} = \vect{\mu}^\mathrm{T}C\f$, + is equivalent to + \f$\forall \vect{y} \mathrel{:} (C\vect{y} \geq \vect{0} + \implies \langle \vect{y}, \vect{z} \rangle \geq 0)\f$. + If we take \f$\vect{y} = G\vect{e}_j\f$ then \f$C\vect{y} + = CG\vect{e}_j \geq 0\f$, + since \f$CG \geq \vect{0}\f$. + So + \f$ + \langle \vect{y}, \vect{z} \rangle + = (\vect{e}_j^\mathrm{T}G^\mathrm{T}) \vect{z} + = \vect{e}_j^\mathrm{T}(G^\mathrm{T} \vect{z}) + \geq 0 + \f$, + that is, the \f$j\f$-th component of \f$G^\mathrm{T}\vect{z}\f$ + is non-negative. The arbitrary choice of \f$j\f$ allows us to conclude + that \f$G^\mathrm{T}\vect{z} \geq \vect{0}\f$, as required. + + In view of this result, the following exposition assumes, for clarity, + that the conversion being performed is from constraints to generators. + Thus, even if the roles of \p source and \p dest can be interchanged, + in the sequel we assume the \p source system will contain the constraints + that represent the polyhedron and the \p dest system will contain + the generator that generates it. + + There are some observations that are useful to understand this function: + + Observation 1: Let \f$A\f$ be a system of constraints that generate + the polyhedron \f$P\f$ and \f$\vect{c}\f$ a new constraint that must + be added. Suppose that there is a line \f$\vect{z}\f$ that does not + saturate the constraint \f$\vect{c}\f$. If we combine the old lines + and rays that do not saturate \f$\vect{c}\f$ (except \f$\vect{z}\f$) + with \f$\vect{z}\f$ such that the new ones saturate \f$\vect{c}\f$, + the new lines and rays also saturate the constraints saturated by + the old lines and rays. + + In fact, if \f$\vect{y}_1\f$ is the old generator that does not saturate + \f$\vect{c}\f$, \f$\vect{y}_2\f$ is the new one such that + \f[ + \vect{y}_2 = \lambda \vect{y}_1 + \mu \vect{z} + \f] + and \f$\vect{c}_1\f$ is a previous constraint that \f$\vect{y}_1\f$ + and \f$\vect{z}\f$ saturates, we can see + \f[ + \langle \vect{c}_1, \vect{y}_2 \rangle + = \langle \vect{c}_1, (\lambda \vect{y}_1 + \mu \vect{z}) \rangle + = \lambda \langle \vect{c}_1, \vect{y}_1 \rangle + + \mu \langle \vect{c}_1, \vect{z} \rangle + = 0 + \mu \langle \vect{c}_1, \vect{z} \rangle + = \mu \langle \vect{c}_1, \vect{z} \rangle + \f] + and + \f[ + \mu \langle \vect{c}_1, \vect{z} \rangle = 0. + \f] + + Proposition 1: Let \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ be distinct + rays of \f$P\f$. + Then the following statements are equivalent: + a) \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ are adjacent extreme rays + (see Section \ref prelims); + b) \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ are extreme rays and the + rank of the system composed by the constraints saturated by both + \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ is equal to + \f$d - 2\f$, where \f$d\f$ is the rank of the system of constraints. + + In fact, let \f$F\f$ be the system of generators that saturate the + constraints saturated by both \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$. + If b) holds, the set \f$F\f$ is 2-dimensional and \f$\vect{r}_1\f$ and + \f$\vect{r}_2\f$ generate this set. So, every generator + \f$\vect{x}\f$ of \f$F\f$ can be built as a combination of + \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$, i.e. + \f[ + \vect{x} = \lambda \vect{r}_1 + \mu \vect{r}_2. + \f] + This combination is non-negative because there exists at least a + constraint \f$c\f$ saturated by \f$\vect{r}_1\f$ and not + \f$\vect{r}_2\f$ (or vice versa) (because they are distinct) for which + \f[ + \langle \vect{c}, \vect{x} \rangle \geq 0 + \f] + and + \f[ + \langle \vect{c}, \vect{x} \rangle + = \lambda \langle \vect{c}, \vect{r}_1 \rangle + (or = \mu \langle \vect{c}, \vect{r}_2 \rangle). + \f] + So, there is no other extreme ray in \f$F\f$ and a) holds. + Otherwise, if b) does not hold, the rank of the system generated by + the constraints saturated by both \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ + is equal to \f$d - k\f$, with \p k \>= 3, the set \f$F\f$ is + \p k -dimensional and at least \p k extreme rays are necessary + to generate \f$F\f$. + So, \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ are not adjacent and + a) does not hold. + + Proposition 2: When we build the new system of generators starting from + a system \f$A\f$ of constraints of \f$P\f$, if \f$\vect{c}\f$ is the + constraint to add to \f$A\f$ and all lines of \f$P\f$ saturate + \f$\vect{c}\f$, the new set of rays is the union of those rays that + saturate, of those that satisfy and of a set \f$\overline Q\f$ of + rays such that each of them + -# lies on the hyper-plane represented by the k-th constraint, + -# is a positive combination of two adjacent rays \f$\vect{r}_1\f$ and + \f$\vect{r}_2\f$ such that the first one satisfies the constraint and + the other does not satisfy it. + If the adjacency property is not taken in account, the new set of + rays is not irredundant, in general. + + In fact, if \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ are not adjacent, + the rank of the system composed by the constraints saturated by both + \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ is different from \f$d - 2\f$ + (see the previous proposition) or neither \f$\vect{r}_1\f$ nor + \f$\vect{r}_2\f$ are extreme rays. Since the new ray \f$\vect{r}\f$ + is a combination of \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$, + it saturates the same constraints saturated by both \f$\vect{r}_1\f$ and + \f$\vect{r}_2\f$. + If the rank is less than \f$d - 2\f$, the rank of + the system composed by \f$\vect{c}\f$ (that is saturated by \f$\vect{r}\f$) + and by the constraints of \f$A\f$ saturated by \f$\vect{r}\f$ is less + than \f$d - 1\f$. It means that \f$r\f$ is redundant (see + Section \ref prelims). + If neither \f$\vect{r}_1\f$ nor \f$\vect{r}_2\f$ are extreme rays, + they belong to a 2-dimensional face containing exactly two extreme rays + of \f$P\f$. + These two adjacent rays build a ray equal to \f$\vect{r}\f$ and so + \f$\vect{r}\f$ is redundant. +*/ +PPL::dimension_type +PPL::Polyhedron::conversion(Linear_System& source, + const dimension_type start, + Linear_System& dest, + Bit_Matrix& sat, + dimension_type num_lines_or_equalities) { + dimension_type source_num_rows = source.num_rows(); + dimension_type dest_num_rows = dest.num_rows(); + const dimension_type source_num_columns = source.num_columns(); + const dimension_type dest_num_columns = dest.num_columns(); + + // By construction, the number of columns of `sat' is the same as + // the number of rows of `source'; also, the number of rows of `sat' + // is the same as the number of rows of `dest'. + assert(source_num_rows == sat.num_columns()); + assert(dest_num_rows == sat.num_rows()); + + // If `start > 0', then we are converting the pending constraints. + assert(start == 0 || start == source.first_pending_row()); + + // During the iteration on the constraints in `source' we may identify + // constraints that are redundant: these have to be removed by swapping + // the rows of `source', taking care not to compromise the sortedness + // of the constraints that still have to be considered. + // To this end, the following counter keeps the number of redundant + // constraints seen so far, to be used as a displacement when swapping rows. + dimension_type source_num_redundant = 0; + + PPL_DIRTY_TEMP_COEFFICIENT(normalized_sp_i); + PPL_DIRTY_TEMP_COEFFICIENT(normalized_sp_o); + + // Converting the sub-system of `source' having rows with indexes + // from `start' to the last one (i.e., `source_num_rows' - 1). + for (dimension_type k = start; k < source_num_rows; ) { + + // All the `source_num_redundant' redundant constraints identified so far + // have consecutive indices starting from `k'. + if (source_num_redundant > 0) + // Let the next constraint have index `k'. + // There is no need to swap the columns of `sat' (all zeroes). + std::swap(source[k], source[k+source_num_redundant]); + + Linear_Row& source_k = source[k]; + + // Constraints and generators must have the same dimension, + // otherwise the scalar product below will bomb. + assert(source_num_columns == dest_num_columns); + + // `scalar_prod[i]' will contain the scalar product of the + // constraint `source_k' and the generator `dest[i]'. This + // product is 0 if and only if the generator saturates the + // constraint. + PPL_DIRTY_TEMP0(std::vector, scalar_prod); + const int needed_space = dest_num_rows - scalar_prod.size(); + if (needed_space > 0) + scalar_prod.insert(scalar_prod.end(), needed_space, Coefficient_zero()); + // `index_non_zero' will indicate the first generator in `dest' + // that does not saturate the constraint `source_k'. + dimension_type index_non_zero = 0; + for ( ; index_non_zero < dest_num_rows; ++index_non_zero) { + Scalar_Products::assign(scalar_prod[index_non_zero], + source_k, + dest[index_non_zero]); + if (scalar_prod[index_non_zero] != 0) + // The generator does not saturate the constraint. + break; +#if REACTIVE_ABANDONING + // Check if the client has requested abandoning all expensive + // computations. If so, the exception specified by the client + // is thrown now. + maybe_abandon(); +#endif + } + for (dimension_type i = index_non_zero + 1; i < dest_num_rows; ++i) { + Scalar_Products::assign(scalar_prod[i], source_k, dest[i]); +#if REACTIVE_ABANDONING + maybe_abandon(); +#endif + } + + // We first treat the case when `index_non_zero' is less than + // `num_lines_or_equalities', i.e., when the generator that + // does not saturate the constraint `source_k' is a line. + // The other case (described later) is when all the lines + // in `dest' (i.e., all the rows having indexes less than + // `num_lines_or_equalities') do saturate the constraint. + + if (index_non_zero < num_lines_or_equalities) { + // Since the generator `dest[index_non_zero]' does not saturate + // the constraint `source_k', it can no longer be a line + // (see saturation rule in Section \ref prelims). + // Therefore, we first transform it to a ray. + dest[index_non_zero].set_is_ray_or_point_or_inequality(); + // Of the two possible choices, we select the ray satisfying + // the constraint (namely, the ray whose scalar product + // with the constraint gives a positive result). + if (scalar_prod[index_non_zero] < 0) { + // The ray `dest[index_non_zero]' lies on the wrong half-space: + // we change it to have the opposite direction. + neg_assign(scalar_prod[index_non_zero]); + for (dimension_type j = dest_num_columns; j-- > 0; ) + neg_assign(dest[index_non_zero][j]); + } + // Having changed a line to a ray, we set `dest' to be a + // non-sorted system, we decrement the number of lines of `dest' and, + // if necessary, we move the new ray below all the remaining lines. + dest.set_sorted(false); + --num_lines_or_equalities; + if (index_non_zero != num_lines_or_equalities) { + std::swap(dest[index_non_zero], + dest[num_lines_or_equalities]); + std::swap(scalar_prod[index_non_zero], + scalar_prod[num_lines_or_equalities]); + } + Linear_Row& dest_nle = dest[num_lines_or_equalities]; + + // Computing the new lineality space. + // Since each line must lie on the hyper-plane corresponding to + // the constraint `source_k', the scalar product between + // the line and the constraint must be 0. + // This property already holds for the lines having indexes + // between 0 and `index_non_zero' - 1. + // We have to consider the remaining lines, having indexes + // between `index_non_zero' and `num_lines_or_equalities' - 1. + // Each line that does not saturate the constraint has to be + // linearly combined with generator `dest_nle' so that the + // resulting new line saturates the constraint. + // Note that, by Observation 1 above, the resulting new line + // will still saturate all the constraints that were saturated by + // the old line. + + Coefficient& scalar_prod_nle = scalar_prod[num_lines_or_equalities]; + for (dimension_type + i = index_non_zero; i < num_lines_or_equalities; ++i) { + if (scalar_prod[i] != 0) { + // The following fragment optimizes the computation of + // + // Coefficient scale = scalar_prod[i]; + // scale.gcd_assign(scalar_prod_nle); + // Coefficient normalized_sp_i = scalar_prod[i] / scale; + // Coefficient normalized_sp_n = scalar_prod_nle / scale; + // for (dimension_type c = dest_num_columns; c-- > 0; ) { + // dest[i][c] *= normalized_sp_n; + // dest[i][c] -= normalized_sp_i * dest_nle[c]; + // } + normalize2(scalar_prod[i], + scalar_prod_nle, + normalized_sp_i, + normalized_sp_o); + Linear_Row& dest_i = dest[i]; + for (dimension_type c = dest_num_columns; c-- > 0; ) { + Coefficient& dest_i_c = dest_i[c]; + dest_i_c *= normalized_sp_o; + sub_mul_assign(dest_i_c, normalized_sp_i, dest_nle[c]); + } + dest_i.strong_normalize(); + scalar_prod[i] = 0; + // `dest' has already been set as non-sorted. + } + } + + // Computing the new pointed cone. + // Similarly to what we have done during the computation of + // the lineality space, we consider all the remaining rays + // (having indexes strictly greater than `num_lines_or_equalities') + // that do not saturate the constraint `source_k'. These rays + // are positively combined with the ray `dest_nle' so that the + // resulting new rays saturate the constraint. + for (dimension_type + i = num_lines_or_equalities + 1; i < dest_num_rows; ++i) { + if (scalar_prod[i] != 0) { + // The following fragment optimizes the computation of + // + // Coefficient scale = scalar_prod[i]; + // scale.gcd_assign(scalar_prod_nle); + // Coefficient normalized_sp_i = scalar_prod[i] / scale; + // Coefficient normalized_sp_n = scalar_prod_nle / scale; + // for (dimension_type c = dest_num_columns; c-- > 0; ) { + // dest[i][c] *= normalized_sp_n; + // dest[i][c] -= normalized_sp_i * dest_nle[c]; + // } + normalize2(scalar_prod[i], + scalar_prod_nle, + normalized_sp_i, + normalized_sp_o); + Linear_Row& dest_i = dest[i]; + for (dimension_type c = dest_num_columns; c-- > 0; ) { + Coefficient& dest_i_c = dest_i[c]; + dest_i_c *= normalized_sp_o; + sub_mul_assign(dest_i_c, normalized_sp_i, dest_nle[c]); + } + dest_i.strong_normalize(); + scalar_prod[i] = 0; + // `dest' has already been set as non-sorted. + } +#if REACTIVE_ABANDONING + maybe_abandon(); +#endif + } + // Since the `scalar_prod_nle' is positive (by construction), it + // does not saturate the constraint `source_k'. Therefore, if + // the constraint is an inequality, we set to 1 the + // corresponding element of `sat' ... + Bit_Row& sat_nle = sat[num_lines_or_equalities]; + if (source_k.is_ray_or_point_or_inequality()) + sat_nle.set(k); + // ... otherwise, the constraint is an equality which is + // violated by the generator `dest_nle': the generator has to be + // removed from `dest'. + else { + --dest_num_rows; + std::swap(dest_nle, dest[dest_num_rows]); + std::swap(scalar_prod_nle, scalar_prod[dest_num_rows]); + std::swap(sat_nle, sat[dest_num_rows]); + // `dest' has already been set as non-sorted. + } + // We continue with the next constraint. + ++k; + } + // Here we have `index_non_zero' >= `num_lines_or_equalities', + // so that all the lines in `dest' saturate the constraint `source_k'. + else { + // First, we reorder the generators in `dest' as follows: + // -# all the lines should have indexes between 0 and + // `num_lines_or_equalities' - 1 (this already holds); + // -# all the rays that saturate the constraint should have + // indexes between `num_lines_or_equalities' and + // `lines_or_equal_bound' - 1; these rays form the set Q=. + // -# all the rays that have a positive scalar product with the + // constraint should have indexes between `lines_or_equal_bound' + // and `sup_bound' - 1; these rays form the set Q+. + // -# all the rays that have a negative scalar product with the + // constraint should have indexes between `sup_bound' and + // `dest_num_rows' - 1; these rays form the set Q-. + dimension_type lines_or_equal_bound = num_lines_or_equalities; + dimension_type inf_bound = dest_num_rows; + // While we find saturating generators, we simply increment + // `lines_or_equal_bound'. + while (inf_bound > lines_or_equal_bound + && scalar_prod[lines_or_equal_bound] == 0) + ++lines_or_equal_bound; + dimension_type sup_bound = lines_or_equal_bound; + while (inf_bound > sup_bound) { + const int sp_sign = sgn(scalar_prod[sup_bound]); + if (sp_sign == 0) { + // This generator has to be moved in Q=. + std::swap(dest[sup_bound], dest[lines_or_equal_bound]); + std::swap(scalar_prod[sup_bound], scalar_prod[lines_or_equal_bound]); + std::swap(sat[sup_bound], sat[lines_or_equal_bound]); + ++lines_or_equal_bound; + ++sup_bound; + dest.set_sorted(false); + } + else if (sp_sign < 0) { + // This generator has to be moved in Q-. + --inf_bound; + std::swap(dest[sup_bound], dest[inf_bound]); + std::swap(scalar_prod[sup_bound], scalar_prod[inf_bound]); + std::swap(sat[sup_bound], sat[inf_bound]); + dest.set_sorted(false); + } + else + // sp_sign > 0: this generator has to be moved in Q+. + ++sup_bound; + } + + if (sup_bound == dest_num_rows) { + // Here the set Q- is empty. + // If the constraint is an inequality, then all the generators + // in Q= and Q+ satisfy the constraint. The constraint is redundant + // and it can be safely removed from the constraint system. + // This is why the `source' parameter is not declared `const'. + if (source_k.is_ray_or_point_or_inequality()) { + ++source_num_redundant; + --source_num_rows; + // NOTE: we continue with the next cycle of the loop + // without incrementing the index `k', because: + // -# either `k == source_num_rows', and we will exit the loop; + // -# or, having increased `source_num_redundant', we will swap + // in position `k' a constraint that still has to be examined. + } + else { + // The constraint is an equality, so that all the generators + // in Q+ violate it. Since the set Q- is empty, we can simply + // remove from `dest' all the generators of Q+. + dest_num_rows = lines_or_equal_bound; + // We continue with the next constraint. + ++k; + } + } + else { + // The set Q- is not empty, i.e., at least one generator + // violates the constraint `source_k'. + // We have to further distinguish two cases: + if (sup_bound == num_lines_or_equalities) + // The set Q+ is empty, so that all generators that satisfy + // the constraint also saturate it. + // We can simply remove from `dest' all the generators in Q-. + dest_num_rows = sup_bound; + else { + // The sets Q+ and Q- are both non-empty. + // The generators of the new pointed cone are all those satisfying + // the constraint `source_k' plus a set of new rays enjoying + // the following properties: + // -# they lie on the hyper-plane represented by the constraint + // -# they are obtained as a positive combination of two + // adjacent rays, the first taken from Q+ and the second + // taken from Q-. + + // The adjacency property is necessary to have an irredundant + // set of new rays (see proposition 2). + const dimension_type bound = dest_num_rows; + + // In the following loop, + // `i' runs through the generators in the set Q+ and + // `j' runs through the generators in the set Q-. + for (dimension_type i = lines_or_equal_bound; i < sup_bound; ++i) { + for(dimension_type j = sup_bound; j < bound; ++j) { + // Checking if generators `dest[i]' and `dest[j]' are adjacent. + // If there exist another generator that saturates + // all the constraints saturated by both `dest[i]' and + // `dest[j]', then they are NOT adjacent. + Bit_Row new_satrow; + assert(sat[i].last() == ULONG_MAX || sat[i].last() < k); + assert(sat[j].last() == ULONG_MAX || sat[j].last() < k); + // Being the union of `sat[i]' and `sat[j]', + // `new_satrow' corresponds to a ray that saturates all the + // constraints saturated by both `dest[i]' and `dest[j]'. + set_union(sat[i], sat[j], new_satrow); + + // Computing the number of common saturators. + // NOTE: this number has to be less than `k' because + // we are treating the `k'-th constraint. + const dimension_type + num_common_satur = k - new_satrow.count_ones(); + + // Even before actually creating the new ray as a + // positive combination of `dest[i]' and `dest[j]', + // we exploit saturation information to check if + // it can be an extremal ray. To this end, we refer + // to the definition of a minimal proper face + // (see comments in Polyhedron.defs.hh): + // an extremal ray saturates at least `n' - `t' - 1 + // constraints, where `n' is the dimension of the space + // and `t' is the dimension of the lineality space. + // Since `n == source_num_columns - 1' and + // `t == num_lines_or_equalities', we obtain that + // an extremal ray saturates at least + // `source_num_columns - num_lines_or_equalities - 2' + // constraints. + if (num_common_satur + >= source_num_columns - num_lines_or_equalities - 2) { + // The minimal proper face rule is satisfied. + // Now we actually check for redundancy by computing + // adjacency information. + bool redundant = false; + for (dimension_type + l = num_lines_or_equalities; l < bound; ++l) + if (l != i && l != j + && subset_or_equal(sat[l], new_satrow)) { + // Found another generator saturating all the + // constraints saturated by both `dest[i]' and `dest[j]'. + redundant = true; + break; + } + if (!redundant) { + // Adding the new ray to `dest' and the corresponding + // saturation row to `sat'. + if (dest_num_rows == dest.num_rows()) { + // Make room for one more row. + dest.add_pending_row(Linear_Row::Flags(dest.topology(), + Linear_Row::RAY_OR_POINT_OR_INEQUALITY)); + sat.add_row(new_satrow); + } + else + sat[dest_num_rows] = new_satrow; + Linear_Row& new_row = dest[dest_num_rows]; + // The following fragment optimizes the computation of + // + // Coefficient scale = scalar_prod[i]; + // scale.gcd_assign(scalar_prod[j]); + // Coefficient normalized_sp_i = scalar_prod[i] / scale; + // Coefficient normalized_sp_j = scalar_prod[j] / scale; + // for (dimension_type c = dest_num_columns; c-- > 0; ) { + // new_row[c] = normalized_sp_i * dest[j][c]; + // new_row[c] -= normalized_sp_j * dest[i][c]; + // } + normalize2(scalar_prod[i], + scalar_prod[j], + normalized_sp_i, + normalized_sp_o); + for (dimension_type c = dest_num_columns; c-- > 0; ) { + Coefficient& new_row_c = new_row[c]; + new_row_c = normalized_sp_i * dest[j][c]; + sub_mul_assign(new_row_c, normalized_sp_o, dest[i][c]); + } + new_row.strong_normalize(); + // Since we added a new generator to `dest', + // we also add a new element to `scalar_prod'; + // by construction, the new ray lies on the hyper-plane + // represented by the constraint `source_k'. + // Thus, the added scalar product is 0. + assert(scalar_prod.size() >= dest_num_rows); + if (scalar_prod.size() <= dest_num_rows) + scalar_prod.push_back(Coefficient_zero()); + else + scalar_prod[dest_num_rows] = Coefficient_zero(); + // Increment the number of generators. + ++dest_num_rows; + } + } + } +#if REACTIVE_ABANDONING + maybe_abandon(); +#endif + } + // Now we substitute the rays in Q- (i.e., the rays violating + // the constraint) with the newly added rays. + dimension_type j; + if (source_k.is_ray_or_point_or_inequality()) { + // The constraint is an inequality: + // the violating generators are those in Q-. + j = sup_bound; + // For all the generators in Q+, set to 1 the corresponding + // entry for the constraint `source_k' in the saturation matrix. + for (dimension_type l = lines_or_equal_bound; l < sup_bound; ++l) + sat[l].set(k); + } + else + // The constraint is an equality: + // the violating generators are those in the union of Q+ and Q-. + j = lines_or_equal_bound; + + // Swapping the newly added rays + // (index `i' running through `dest_num_rows - 1' down-to `bound') + // with the generators violating the constraint + // (index `j' running through `j' up-to `bound - 1'). + dimension_type i = dest_num_rows; + while (j < bound && i > bound) { + --i; + std::swap(dest[i], dest[j]); + std::swap(scalar_prod[i], scalar_prod[j]); + std::swap(sat[i], sat[j]); + ++j; + dest.set_sorted(false); + } + // Setting the number of generators in `dest': + // - if the number of generators violating the constraint + // is less than or equal to the number of the newly added + // generators, we assign `i' to `dest_num_rows' because + // all generators above this index are significant; + // - otherwise, we assign `j' to `dest_num_rows' because + // all generators below index `j-1' violates the constraint. + dest_num_rows = (j == bound) ? i : j; + } + // We continue with the next constraint. + ++k; + } + } +#if !REACTIVE_ABANDONING + // Check if the client has requested abandoning all expensive + // computations. If so, the exception specified by the client + // is thrown now. + maybe_abandon(); +#endif + } + + // We may have identified some redundant constraints in `source', + // which have been swapped at the end of the system. + if (source_num_redundant > 0) { + assert(source_num_redundant == source.num_rows() - source_num_rows); + source.erase_to_end(source_num_rows); + sat.columns_erase_to_end(source_num_rows); + } + // If `start == 0', then `source' was sorted and remained so. + // If otherwise `start > 0', then the two sub-system made by the + // non-pending rows and the pending rows, respectively, were both sorted. + // Thus, the overall system is sorted if and only if either + // `start == source_num_rows' (i.e., the second sub-system is empty) + // or the row ordering holds for the two rows at the boundary between + // the two sub-systems. + if (start > 0 && start < source_num_rows) + source.set_sorted(compare(source[start - 1], source[start]) <= 0); + // There are no longer pending constraints in `source'. + source.unset_pending_rows(); + + // We may have identified some redundant rays in `dest', + // which have been swapped at the end of the system. + if (dest_num_rows < dest.num_rows()) { + dest.erase_to_end(dest_num_rows); + // Be careful: we might have erased some of the non-pending rows. + if (dest.first_pending_row() > dest_num_rows) + dest.unset_pending_rows(); + sat.rows_erase_to_end(dest_num_rows); + } + if (dest.is_sorted()) + // If the non-pending generators in `dest' are still declared to be + // sorted, then we have to also check for the sortedness of the + // pending generators. + for (dimension_type i = dest.first_pending_row(); i < dest_num_rows; ++i) + if (compare(dest[i - 1], dest[i]) > 0) { + dest.set_sorted(false); + break; + } + // There are no pending generators in `dest'. + dest.unset_pending_rows(); + + return num_lines_or_equalities; +} diff --git a/src/distances.defs.hh b/src/distances.defs.hh new file mode 100644 index 0000000..e02e003 --- /dev/null +++ b/src/distances.defs.hh @@ -0,0 +1,53 @@ +/* Class declarations for several distances. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_distances_defs_hh +#define PPL_distances_defs_hh 1 + +#include "distances.types.hh" +#include "Rounding_Dir.defs.hh" + +template +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 +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 +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..5c12eb1 --- /dev/null +++ b/src/distances.inlines.hh @@ -0,0 +1,112 @@ +/* Inline functions implementing distances. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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 +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 +struct maybe_assign_struct { + 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 +inline Result +maybe_assign(const To*& top, To& tmp, const From& from, Rounding_Dir dir) { + return maybe_assign_struct::function(top, tmp, from, dir); +} + +template +inline void +Rectilinear_Distance_Specialization::combine(Temp& running, + const Temp& current, + Rounding_Dir dir) { + add_assign_r(running, running, current, dir); +} + +template +inline void +Rectilinear_Distance_Specialization::finalize(Temp&, Rounding_Dir) { +} + +template +inline void +Euclidean_Distance_Specialization::combine(Temp& running, + Temp& current, + Rounding_Dir dir) { + mul_assign_r(current, current, current, dir); + add_assign_r(running, running, current, dir); +} + +template +inline void +Euclidean_Distance_Specialization::finalize(Temp& running, + Rounding_Dir dir) { + sqrt_assign_r(running, running, dir); +} + +template +inline void +L_Infinity_Distance_Specialization::combine(Temp& running, + const Temp& current, + Rounding_Dir) { + if (current > running) + running = current; +} + +template +inline void +L_Infinity_Distance_Specialization::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..e022f7e --- /dev/null +++ b/src/distances.types.hh @@ -0,0 +1,28 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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 +struct Rectilinear_Distance_Specialization; + +template +struct Euclidean_Distance_Specialization; + +template +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..ed7eec1 --- /dev/null +++ b/src/fpu-c99.inlines.hh @@ -0,0 +1,99 @@ +/* C99 Floating point unit related functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_fpu_c99_inlines_hh +#define PPL_fpu_c99_inlines_hh 1 + +#ifdef PPL_HAVE_FENV_H +#include +#include + +#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_PPL_FPU_TOWARDZERO FE_TOWARDZERO +#endif + +namespace Parma_Polyhedra_Library { + +inline void +fpu_initialize_control_functions() { + 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(fegetround()); +} + +inline void +fpu_set_rounding_direction(fpu_rounding_direction_type dir) { + fesetround(dir); +} + +inline fpu_rounding_control_word_type +fpu_save_rounding_direction(fpu_rounding_direction_type dir) { + fpu_rounding_control_word_type old + = static_cast(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; +#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..b781a72 --- /dev/null +++ b/src/fpu-ia32.cc @@ -0,0 +1,70 @@ +/* IA-32 floating point unit non-inline related functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#if PPL_CAN_CONTROL_FPU && defined(PPL_FPMATH_MAY_USE_SSE) \ + && defined(__i386__) \ + && (defined(__GNUC__) || defined(__INTEL_COMPILER)) + +#include "fpu.defs.hh" +#include +#include + +namespace { + +jmp_buf env; + +void +illegal_instruction_catcher(int) { + signal(SIGILL, SIG_DFL); + longjmp(env, 1); +} + +} // namespace + +namespace Parma_Polyhedra_Library { + +bool have_sse_unit = true; + +void +detect_sse_unit() { + if (setjmp(env)) { + // We will end up here if sse_get_control() raises SIGILL. + have_sse_unit = false; + goto restore_sigill_handler; + } + + // Install our own signal handler for SIGILL. + signal(SIGILL, illegal_instruction_catcher); + (void) sse_get_control(); + // sse_get_control() did not raise SIGILL: we have an SSE unit. + have_sse_unit = true; + + restore_sigill_handler: + // Restore the default signal handler for SIGILL. + signal(SIGILL, SIG_DFL); +} + +} // 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..6549fb7 --- /dev/null +++ b/src/fpu-ia32.inlines.hh @@ -0,0 +1,202 @@ +/* IA-32 floating point unit inline related functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_fpu_ia32_inlines_hh +#define PPL_fpu_ia32_inlines_hh 1 + +#include +#include + +#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(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(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_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(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..883245a --- /dev/null +++ b/src/fpu-none.inlines.hh @@ -0,0 +1,74 @@ +/* Null floating point unit related functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_fpu_none_inlines_hh +#define PPL_fpu_none_inlines_hh 1 + +#include + +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..83d7b4a --- /dev/null +++ b/src/fpu-sparc.inlines.hh @@ -0,0 +1,76 @@ +/* SPARC floating point unit related functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_fpu_sparc_inlines_hh +#define PPL_fpu_sparc_inlines_hh 1 + +#ifdef PPL_HAVE_IEEEFP_H +#include + +#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(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(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..93ec9ca --- /dev/null +++ b/src/fpu.defs.hh @@ -0,0 +1,98 @@ +/* Floating point unit related functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_fpu_defs_hh +#define PPL_fpu_defs_hh 1 + +#include "fpu.types.hh" +#include "compiler.hh" + +namespace Parma_Polyhedra_Library { + +//! 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 inexact + computation 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 inexact computation status. +void +fpu_reset_inexact(); + +/*! \brief + Queries the inexact computation status. + + Returns 0 if the computation was definitely exact, 1 if it was + definitely inexact, -1 if definite exactness information is unavailable. +*/ +int +fpu_check_inexact(); + +} // namespace Parma_Polyhedra_Library + +#if 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, but 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..013ea48 --- /dev/null +++ b/src/fpu.types.hh @@ -0,0 +1,26 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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 +#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..9325c4e --- /dev/null +++ b/src/globals.cc @@ -0,0 +1,32 @@ +/* Definitions of global objects. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "globals.defs.hh" +#include "Constraint.defs.hh" +#include "Generator.defs.hh" + +namespace PPL = Parma_Polyhedra_Library; + +const PPL::Throwable* volatile PPL::abandon_expensive_computations = 0; + diff --git a/src/globals.defs.hh b/src/globals.defs.hh new file mode 100644 index 0000000..cb6ae20 --- /dev/null +++ b/src/globals.defs.hh @@ -0,0 +1,388 @@ +/* Declarations of global objects. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_globals_defs_hh +#define PPL_globals_defs_hh 1 + +#include "globals.types.hh" +#include "C_Integer.hh" +#include "meta_programming.hh" +#include "Slow_Copy.hh" +#include "Temp.defs.hh" +#include +#include + +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 +/*! \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 +inline typename Enable_If::value, void>::type +swap(T&, T&) { + PPL_COMPILE_TIME_CHECK(!Slow_Copy::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_TEMP0(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); + +//! 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 make the Grid covering box constructor unique. +*/ +struct From_Covering_Box { +}; + +//! 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 namespace IO_Operators; \ + std::cerr << *this; \ + } + +#define PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(class_name) \ + void \ + Parma_Polyhedra_Library::class_name::ascii_dump() const { \ + ascii_dump(std::cerr); \ + } \ + \ + void \ + Parma_Polyhedra_Library::class_name::print() const { \ + std::cerr << "No user level output operator defined " \ + << "for class " PPL_XSTR(class_name) << "." << std::endl; \ + } + +#define PPL_OUTPUT_TEMPLATE_DEFINITIONS(type_symbol, class_prefix) \ + template \ + void \ + class_prefix::ascii_dump() const { \ + ascii_dump(std::cerr); \ + } \ + \ + template \ + void \ + class_prefix::print() const { \ + using namespace IO_Operators; \ + std::cerr << *this; \ + } + +#define PPL_OUTPUT_2_PARAM_TEMPLATE_DEFINITIONS(type_symbol1, \ + type_symbol2, \ + class_prefix) \ + template \ + void \ + class_prefix::ascii_dump() const { \ + ascii_dump(std::cerr); \ + } \ + \ + template \ + void \ + class_prefix::print() const { \ + using namespace IO_Operators; \ + std::cerr << *this; \ + } + +#define PPL_OUTPUT_3_PARAM_TEMPLATE_DEFINITIONS(type_symbol1, \ + type_symbol2, \ + type_symbol3, \ + class_prefix) \ + template \ + void \ + class_prefix::ascii_dump() \ + const { \ + ascii_dump(std::cerr); \ + } \ + \ + template \ + void \ + class_prefix::print() \ + const { \ + using namespace IO_Operators; \ + std::cerr << *this; \ + } + +#define PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(type_symbol, class_prefix) \ + template \ + void \ + class_prefix::ascii_dump() const { \ + ascii_dump(std::cerr); \ + } \ + \ + template \ + void \ + class_prefix::print() const { \ + std::cerr << "No user level output operator defined " \ + << "for " PPL_XSTR(class_prefix) << "." << std::endl; \ + } + +template +struct Fit : public False { +}; + +template +struct Fit::value>::type> { + enum { + value = (v >= static_cast(C_Integer::min) + && v <= static_cast(C_Integer::max)) + }; +}; + +template +struct TConstant { + static const T value = v; +}; + + +template +const T TConstant::value; + +template +struct Constant_ : public TConstant { +}; + +template +struct Constant_::smaller_signed_type, v>::value + && (prefer_signed || + !Fit::smaller_unsigned_type, v>::value))>::type> + : public Constant_::smaller_signed_type, v, prefer_signed> { +}; + +template +struct Constant_::smaller_unsigned_type, v>::value + && (!prefer_signed || + !Fit::smaller_signed_type, v>::value))>::type> + : public Constant_::smaller_unsigned_type, v, prefer_signed> { +}; + +template +struct Constant : public Constant_ { +}; + +//! \name Memory Size Inspection Functions +//@{ + +#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 Enable_If::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 Enable_If::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); + +//@} // Memory Size Inspection Functions + + +template +struct Has_OK : public False { }; + +template +struct Has_OK::type> + : public True { +}; + +template +inline typename Enable_If::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) + +} // namespace Parma_Polyhedra_Library + +#include "globals.inlines.hh" + +#endif // !defined(PPL_globals_defs_hh) diff --git a/src/globals.inlines.hh b/src/globals.inlines.hh new file mode 100644 index 0000000..f35672a --- /dev/null +++ b/src/globals.inlines.hh @@ -0,0 +1,97 @@ +/* Implementation of global objects: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_globals_inlines_hh +#define PPL_globals_inlines_hh 1 + +#include +#include + +namespace Parma_Polyhedra_Library { + +inline dimension_type +not_a_dimension() { + return std::numeric_limits::max(); +} + +inline +Throwable::~Throwable() { +} + +inline void +maybe_abandon() { + if (const Throwable* p = abandon_expensive_computations) + p->throw_me(); +} + +inline dimension_type +compute_capacity(const dimension_type requested_size, + const dimension_type maximum_size) { + assert(requested_size <= maximum_size); + // Speculation factor 2. + return (requested_size < maximum_size / 2) + ? 2*(requested_size + 1) + : maximum_size; + // Speculation factor 1.5. + // return (maximum_size - requested_size > requested_size/2) + // ? requested_size + requested_size/2 + 1 + // : maximum_size; +} + +template +inline typename +Enable_If::value, memory_size_type>::type +external_memory_in_bytes(const T&) { + return 0; +} + +template +inline typename +Enable_If::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 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); +} + +} // 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..fe3545a --- /dev/null +++ b/src/globals.types.hh @@ -0,0 +1,75 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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 + +namespace Parma_Polyhedra_Library { + +//! An unsigned integral type for representing space dimensions. +/*! \ingroup PPL_CXX_interface */ +typedef size_t dimension_type; + +//! An unsigned integral type for representing memory size in bytes. +/*! \ingroup PPL_CXX_interface */ +typedef size_t memory_size_type; + +//! Kinds of degenerate abstract elements. +/*! \ingroup PPL_CXX_interface */ +enum Degenerate_Element { + //! The universe element, i.e., the whole vector space. + UNIVERSE, + //! The empty element, i.e., the empty set. + EMPTY +}; + +//! Relation symbols. +/*! \ingroup PPL_CXX_interface */ +enum Relation_Symbol { + //! Less than. + LESS_THAN, + //! Less than or equal to. + LESS_OR_EQUAL, + //! Equal to. + EQUAL, + //! Greater than or equal to. + GREATER_OR_EQUAL, + //! Greater than. + GREATER_THAN, + //! Not equal to. + NOT_EQUAL +}; + +//! Complexity pseudo-classes. +/*! \ingroup PPL_CXX_interface */ +enum Complexity_Class { + //! Worst-case polynomial complexity. + POLYNOMIAL_COMPLEXITY, + //! Worst-case exponential complexity but typically polynomial behavior. + SIMPLEX_COMPLEXITY, + //! Any complexity. + ANY_COMPLEXITY +}; + +//! Possible optimization modes. +/*! \ingroup PPL_CXX_interface */ +enum Optimization_Mode { + //! Minimization is requested. + MINIMIZATION, + //! Maximization is requested. + MAXIMIZATION +}; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_globals_types_hh) diff --git a/src/initializer.hh b/src/initializer.hh new file mode 100644 index 0000000..7074d17 --- /dev/null +++ b/src/initializer.hh @@ -0,0 +1,65 @@ +/* Nifty counter object for the initialization of the library. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_initializer_hh +#define PPL_initializer_hh 1 + +#include "Init.defs.hh" + +#ifndef PPL_NO_AUTOMATIC_INITIALIZATION +namespace { + +Parma_Polyhedra_Library::Init Parma_Polyhedra_Library_initializer; + +} // namespace +#else +namespace { + +Parma_Polyhedra_Library::Init* Parma_Polyhedra_Library_initializer_p; + +} // namespace +#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 + 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/iterator_to_const.defs.hh b/src/iterator_to_const.defs.hh new file mode 100644 index 0000000..5977e90 --- /dev/null +++ b/src/iterator_to_const.defs.hh @@ -0,0 +1,222 @@ +/* iterator_to_const and const_iterator_to_const class declarations. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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 + +#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 read-only + iterator on the sequence of objects Container. + By using this iterator class it is not possible to modify the objects + contained in Container; rather, object modification has + to be implemented by object replacement, i.e., by using the methods + provided by Container 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 +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 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; + template friend class Powerset; + //template friend class Ask_Tell; + +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 true if and only if + \p *this and \p y are identical. + */ + bool operator==(const iterator_to_const& y) const; + + /*! \brief + Returns true 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 +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 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; + template friend class Powerset; + //template friend class Ask_Tell; + +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& 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 true if and only if + \p *this and \p y are identical. + */ + bool operator==(const const_iterator_to_const& y) const; + + /*! \brief + Returns true 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 true 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 +bool +operator==(const iterator_to_const& x, + const const_iterator_to_const& y); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \brief + Mixed comparison operator: returns true 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 +bool +operator!=(const iterator_to_const& x, + const const_iterator_to_const& 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..b574b56 --- /dev/null +++ b/src/iterator_to_const.inlines.hh @@ -0,0 +1,201 @@ +/* iterator_to_const and const_iterator_to_const class implementations: + inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_iterator_to_const_inlines_hh +#define PPL_iterator_to_const_inlines_hh 1 + +namespace Parma_Polyhedra_Library { + +template +inline +iterator_to_const::iterator_to_const() + : base() { +} + +template +inline +iterator_to_const::iterator_to_const(const iterator_to_const& y) + : base(y.base) { +} + +template +inline +iterator_to_const::iterator_to_const(const Base& b) + : base(b) { +} + +template +inline typename iterator_to_const::reference +iterator_to_const::operator*() const { + return *base; +} + +template +inline typename iterator_to_const::pointer +iterator_to_const::operator->() const { + return &*base; +} + +template +inline iterator_to_const& +iterator_to_const::operator++() { + ++base; + return *this; +} + +template +inline iterator_to_const +iterator_to_const::operator++(int) { + iterator_to_const tmp = *this; + operator++(); + return tmp; +} + +template +inline iterator_to_const& +iterator_to_const::operator--() { + --base; + return *this; +} + +template +inline iterator_to_const +iterator_to_const::operator--(int) { + iterator_to_const tmp = *this; + operator--(); + return tmp; +} + +template +inline bool +iterator_to_const::operator==(const iterator_to_const& y) const { + return base == y.base; +} + +template +inline bool +iterator_to_const::operator!=(const iterator_to_const& y) const { + return !operator==(y); +} + +template +inline +const_iterator_to_const::const_iterator_to_const() + : base() { +} + +template +inline +const_iterator_to_const +::const_iterator_to_const(const const_iterator_to_const& y) + : base(y.base) { +} + +template +inline +const_iterator_to_const::const_iterator_to_const(const Base& b) + : base(b) { +} + +template +inline typename const_iterator_to_const::reference +const_iterator_to_const::operator*() const { + return *base; +} + +template +inline typename const_iterator_to_const::pointer +const_iterator_to_const::operator->() const { + return &*base; +} + +template +inline const_iterator_to_const& +const_iterator_to_const::operator++() { + ++base; + return *this; +} + +template +inline const_iterator_to_const +const_iterator_to_const::operator++(int) { + const_iterator_to_const tmp = *this; + operator++(); + return tmp; +} + +template +inline const_iterator_to_const& +const_iterator_to_const::operator--() { + --base; + return *this; +} + +template +inline const_iterator_to_const +const_iterator_to_const::operator--(int) { + const_iterator_to_const tmp = *this; + operator--(); + return tmp; +} + +template +inline bool +const_iterator_to_const +::operator==(const const_iterator_to_const& y) const { + return base == y.base; +} + +template +inline bool +const_iterator_to_const +::operator!=(const const_iterator_to_const& y) const { + return !operator==(y); +} + +template +inline +const_iterator_to_const +::const_iterator_to_const(const iterator_to_const& y) + : base(y.base) { +} + +/*! \relates const_iterator_to_const */ +template +inline bool +operator==(const iterator_to_const& x, + const const_iterator_to_const& y) { + return const_iterator_to_const(x).operator==(y); +} + +/*! \relates const_iterator_to_const */ +template +inline bool +operator!=(const iterator_to_const& x, + const const_iterator_to_const& 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..b441c25 --- /dev/null +++ b/src/iterator_to_const.types.hh @@ -0,0 +1,25 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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 +class iterator_to_const; + +template +class const_iterator_to_const; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_iterator_to_const_types_hh) diff --git a/src/math_utilities.defs.hh b/src/math_utilities.defs.hh new file mode 100644 index 0000000..2b082ce --- /dev/null +++ b/src/math_utilities.defs.hh @@ -0,0 +1,110 @@ +/* Declarations of some math utility functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_math_utilities_defs_hh +#define PPL_math_utilities_defs_hh 1 + +#include "Coefficient.types.hh" +#include "Checked_Number.defs.hh" +#include + +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 +void +numer_denom(const Checked_Number& from, + Coefficient& num, Coefficient& den); + +#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 +void +div_round_up(Checked_Number& 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 +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 +void +max_assign(N& x, const N& y); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns true if and only if \p x is an even number. +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +bool +is_even(const Checked_Number& x); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns true if and only if \f$x = -y\f$. +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +bool +is_additive_inverse(const Checked_Number& x, + const Checked_Number& 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 nx and \p ny, respectively. + + \note + \p x and \p nx may be the same object and likewise for + \p y and \p ny. Any other aliasing results in undefined behavior. +*/ +#endif +void +normalize2(Coefficient_traits::const_reference x, + Coefficient_traits::const_reference y, + Coefficient& nx, Coefficient& ny); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns true 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 +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..a7923a2 --- /dev/null +++ b/src/math_utilities.inlines.hh @@ -0,0 +1,120 @@ +/* Implementation of some math utility functions: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_math_utilities_inlines_hh +#define PPL_math_utilities_inlines_hh 1 + +#include "Coefficient.defs.hh" +#include +#include + +namespace Parma_Polyhedra_Library { + +inline void +normalize2(Coefficient_traits::const_reference x, + Coefficient_traits::const_reference y, + Coefficient& nx, Coefficient& ny) { + PPL_DIRTY_TEMP_COEFFICIENT(gcd); + gcd_assign(gcd, x, y); + exact_div_assign(nx, x, gcd); + exact_div_assign(ny, y, gcd); +} + +template +inline T +low_bits_mask(const unsigned n) { + assert(n < unsigned(std::numeric_limits::digits)); + return n == 0 ? 0 : ~(~(T(0u)) << n); +} + +template +inline void +numer_denom(const Checked_Number& from, + Coefficient& num, Coefficient& den) { + assert(!is_not_a_number(from) + && !is_minus_infinity(from) + && !is_plus_infinity(from)); + PPL_DIRTY_TEMP0(mpq_class, q); + assign_r(q, from, ROUND_NOT_NEEDED); + num = q.get_num(); + den = q.get_den(); +} + +template +inline void +div_round_up(Checked_Number& to, + Coefficient_traits::const_reference x, + Coefficient_traits::const_reference y) { + PPL_DIRTY_TEMP0(mpq_class, qx); + PPL_DIRTY_TEMP0(mpq_class, qy); + // Note: this code assumes that a Coefficient is always convertible + // to an mpq_class without loss of precision. + assign_r(qx, x, ROUND_NOT_NEEDED); + assign_r(qy, y, ROUND_NOT_NEEDED); + div_assign_r(qx, qx, qy, ROUND_NOT_NEEDED); + assign_r(to, qx, ROUND_UP); +} + +template +inline void +min_assign(N& x, const N& y) { + if (x > y) + x = y; +} + +template +inline void +max_assign(N& x, const N& y) { + if (x < y) + x = y; +} + +template +inline bool +is_even(const Checked_Number& x) { + Checked_Number half_x; + return div2exp_assign_r(half_x, x, 1, ROUND_DIRECT) == V_EQ + && is_integer(half_x); +} + +template +inline bool +is_additive_inverse(const Checked_Number& x, + const Checked_Number& y) { + Checked_Number negated_x; + return neg_assign_r(negated_x, x, ROUND_DIRECT) == V_EQ + && negated_x == y; +} + +inline bool +is_canonical(const mpq_class& x) { + if (x.get_den() <= 0) + return false; + PPL_DIRTY_TEMP0(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..65703c1 --- /dev/null +++ b/src/max_space_dimension.hh @@ -0,0 +1,76 @@ +/* Definition of functions yielding maximal space dimensions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_max_space_dimension_hh +#define PPL_max_space_dimension_hh 1 + +#include "Polyhedron.defs.hh" +#include "C_Polyhedron.defs.hh" +#include "NNC_Polyhedron.defs.hh" +#include "Grid.defs.hh" +#include "Rational_Box.hh" +#include "BD_Shape.defs.hh" +#include "Octagonal_Shape.defs.hh" +#include + +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::max_space_dimension()); + d = std::min(d, BD_Shape::max_space_dimension()); + d = std::min(d, BD_Shape::max_space_dimension()); + d = std::min(d, BD_Shape::max_space_dimension()); + d = std::min(d, BD_Shape::max_space_dimension()); + d = std::min(d, BD_Shape::max_space_dimension()); + d = std::min(d, BD_Shape::max_space_dimension()); + d = std::min(d, BD_Shape::max_space_dimension()); + d = std::min(d, BD_Shape::max_space_dimension()); + d = std::min(d, Octagonal_Shape::max_space_dimension()); + d = std::min(d, Octagonal_Shape::max_space_dimension()); + d = std::min(d, Octagonal_Shape::max_space_dimension()); + d = std::min(d, Octagonal_Shape::max_space_dimension()); + d = std::min(d, Octagonal_Shape::max_space_dimension()); + d = std::min(d, Octagonal_Shape::max_space_dimension()); + d = std::min(d, Octagonal_Shape::max_space_dimension()); + d = std::min(d, Octagonal_Shape::max_space_dimension()); + d = std::min(d, Octagonal_Shape::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..83c29fb --- /dev/null +++ b/src/meta_programming.hh @@ -0,0 +1,339 @@ +/* Metaprogramming utilities. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_meta_programming_hh +#define PPL_meta_programming_hh 1 + +#include + +namespace Parma_Polyhedra_Library { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \brief + Declares a per-class constant of type bool, 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 { name = (value) } + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \brief + Declares a per-class constant of type int, 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 { 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 name(). + + \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 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 name(). + + \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& name() { \ + static type name(value); \ + return name; \ + } + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \brief + A class that is only defined if \p b evaluates to true. + + \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 +struct Compile_Time_Check; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \brief + A class that is only defined if \p b evaluates to true. + + \ingroup PPL_CXX_interface + This is the specialized case with \p b equal to true, + so the class is declared and (trivially) defined. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template <> +struct Compile_Time_Check { +}; + +#define PPL_COMPILE_TIME_CHECK_NAME(suffix) compile_time_check_ ## suffix +#define PPL_COMPILE_TIME_CHECK_AUX(e, suffix) \ + enum { \ + /* 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 true + \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 value that evaluates + to \p b. + \ingroup PPL_CXX_interface +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +struct Bool { + enum { + value = b + }; +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \brief + A class holding a constant called value that evaluates + to true. + \ingroup PPL_CXX_interface +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +struct True : public Bool { +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \brief + A class holding a constant called value that evaluates + to false. + \ingroup PPL_CXX_interface +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +struct False : public Bool { +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \brief + A class holding a constant called value that evaluates + to true 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 +struct Is_Same : public False { +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \brief + A class holding a constant called value that evaluates + to true 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 +struct Is_Same : public True { +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \brief + A class holding a constant called value that evaluates + to true 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 struct B; + template struct D : public B; + \endcode + Of course, we cannot test if, for some type variable U, + we have Is_Same_Or_Derived, Type>::value == true. + But we can do as follows: + \code + struct B_Base { + }; + + template struct B : public B_Base; + \endcode + This enables us to enquire + Is_Same_Or_Derived::value. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +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 + 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 { + /*! + Assuming sizeof(char) != sizeof(double), the C++ + overload resolution mechanism guarantees that \p value evaluates + to true if and only if \p Base is the same type + as \p Derived or \p Derived is a class derived from \p Base. + */ + value = (sizeof(func(derived_object())) == sizeof(char)) + }; +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \brief + A class that provides a type member called type equivalent + to \p T if and only if \p b is true. + + \ingroup PPL_CXX_interface + This is the non-specialized case, in which the type member + is not present. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +struct Enable_If { +}; + +template +struct Enable_If_Is { + typedef T type; +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \brief + A class that provides a type member called type equivalent + to \p T if and only if \p b is true. + + \ingroup PPL_CXX_interface + This is the specialization in which the type member + is present. + + \note + Let T, T1 and T2 be any type + expressions and suppose we have some template function + T f(T1, T2). 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::type + foo(T1 x, T2 y); + \endcode + For all the instantiations of the template parameters that cause + condition to evaluate to false, + the Enable_If::type member will not be defined. + Hence, for that instantiations, the specialization will not be eligible. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +struct Enable_If { + typedef T type; +}; + +template +struct Is_Native : public False { +}; + +template <> struct Is_Native : public True { }; +template <> struct Is_Native : public True { }; +template <> struct Is_Native : public True { }; +template <> struct Is_Native : public True { }; +template <> struct Is_Native : public True { }; +template <> struct Is_Native : public True { }; +template <> struct Is_Native : public True { }; +template <> struct Is_Native : public True { }; +template <> struct Is_Native : public True { }; +template <> struct Is_Native : public True { }; + +#if PPL_SUPPORTED_FLOAT +template <> struct Is_Native : public True { }; +#endif +#if PPL_SUPPORTED_DOUBLE +template <> struct Is_Native : public True { }; +#endif +#if PPL_SUPPORTED_LONG_DOUBLE +template <> struct Is_Native : public True { }; +#endif + +template <> struct Is_Native : public True { }; + +template <> struct Is_Native : public True { }; + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_meta_programming_hh) diff --git a/src/minimize.cc b/src/minimize.cc new file mode 100644 index 0000000..803f8df --- /dev/null +++ b/src/minimize.cc @@ -0,0 +1,401 @@ +/* Polyhedron class implementation: minimize() and add_and_minimize(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include +#include "Linear_Row.defs.hh" +#include "Linear_System.defs.hh" +#include "Bit_Matrix.defs.hh" +#include "Polyhedron.defs.hh" +#include + +namespace PPL = Parma_Polyhedra_Library; + +/*! + \return + true if the polyhedron is empty, false + otherwise. + + \param con_to_gen + true if \p source represents the constraints, + false 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 const because it will be built (and then + modified) during minimize(). Also, \p sat and \p source are + not const because the former will be built during + \p dest creation and the latter will maybe be sorted and modified by + conversion() and simplify(). + + \p sat has the generators on its columns and the constraints on its rows + if \p con_to_gen is true, otherwise it has the generators on + its rows and the constraints on its columns. + + Given \p source, this function builds (by means of + conversion()) \p dest and then simplifies (invoking + simplify()) \p source, erasing redundant rows. + For the sequel we assume that \p source is the system of constraints + and \p dest is the system of generators. + This will simplify the description of the function; the dual case is + similar. +*/ +bool +PPL::Polyhedron::minimize(const bool con_to_gen, + Linear_System& source, + Linear_System& dest, + Bit_Matrix& sat) { + // Topologies have to agree. + assert(source.topology() == dest.topology()); + // `source' cannot be empty: even if it is an empty constraint system, + // representing the universe polyhedron, homogenization has added + // the positive constraint. It also cannot be an empty generator system, + // since this function is always called starting from a non-empty + // polyhedron. + assert(!source.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. + + // Resizing `dest' to be the appropriate square matrix. + dimension_type dest_num_rows = source.num_columns(); + // Note that before calling `resize_no_copy()' we must update + // `index_first_pending'. + dest.set_index_first_pending_row(dest_num_rows); + dest.resize_no_copy(dest_num_rows, dest_num_rows); + + // Initialize `dest' to the identity matrix. + for (dimension_type i = dest_num_rows; i-- > 0; ) { + Linear_Row& dest_i = dest[i]; + for (dimension_type j = dest_num_rows; j-- > 0; ) + dest_i[j] = (i == j) ? 1 : 0; + dest_i.set_is_line_or_equality(); + } + // The identity matrix `dest' is not sorted (see the sorting rules + // in Linear_Row.cc). + dest.set_sorted(false); + + // NOTE: the system `dest', as it is now, is not a _legal_ system of + // generators, because in the first row we have a line with a + // non-zero divisor (which should only happen for + // points). However, this is NOT a problem, because `source' + // necessarily contains the positivity constraint (or a + // combination of it with another constraint) which will + // restore things as they should be. + + + // Building a saturation matrix and initializing it by setting + // all of its elements to zero. This matrix will be modified together + // with `dest' during the conversion. + // NOTE: since we haven't seen any constraint yet, the relevant + // portion of `tmp_sat' is the sub-matrix consisting of + // the first 0 columns: thus the relevant portion correctly + // characterizes the initial saturation information. + 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, 0, dest, tmp_sat, dest_num_rows); + // conversion() may have modified the number of rows in `dest'. + dest_num_rows = dest.num_rows(); + + // Checking if the generators in `dest' represent an empty polyhedron: + // the polyhedron is empty if there are no points + // (because rays, lines and closure points need a supporting point). + // Points can be detected by looking at: + // - the divisor, for necessarily closed polyhedra; + // - the epsilon coordinate, for NNC polyhedra. + const dimension_type checking_index + = dest.is_necessarily_closed() + ? 0 + : dest.num_columns() - 1; + dimension_type first_point; + for (first_point = num_lines_or_equalities; + first_point < dest_num_rows; + ++first_point) + if (dest[first_point][checking_index] > 0) + break; + + if (first_point == dest_num_rows) + if (con_to_gen) + // No point has been found: the polyhedron is empty. + return true; + else + // Here `con_to_gen' is false: `dest' is a system of constraints. + // In this case the condition `first_point == dest_num_rows' + // actually means that all the constraints in `dest' have their + // inhomogeneous term equal to 0. + // This is an ILLEGAL situation, because it implies that + // the constraint system `dest' lacks the positivity constraint + // and no linear combination of the constraints in `dest' + // can reintroduce the positivity constraint. + throw std::runtime_error("PPL internal error"); + else { + // A point has been found: the polyhedron is not empty. + // Now invoking simplify() to remove all the redundant constraints + // from the system `source'. + // Since the saturation matrix `tmp_sat' returned by conversion() + // has rows indexed by generators (the rows of `dest') and columns + // indexed by constraints (the rows of `source'), we have to + // transpose it to obtain the saturation matrix needed by simplify(). + sat.transpose_assign(tmp_sat); + simplify(source, sat); + return false; + } +} + + +/*! + \return + true if the obtained polyhedron is empty, + false otherwise. + + \param con_to_gen + true if \p source1 and \p source2 are system of + constraints, false 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 + add_and_minimize(bool, Linear_System&, Linear_System&, Bit_Matrix&), + processes the added constraints obtaining a new DD pair. + + This method treats also the dual case, i.e., adding new generators to + a previous system of generators. In this case \p source1 contains the + old generators, \p source2 the new ones and \p dest is the system + of constraints in the given minimized DD pair. + + Since \p source2 contains the constraints (or the generators) that + will be added to \p source1, it is constant: it will not be modified. +*/ +bool +PPL::Polyhedron::add_and_minimize(const bool con_to_gen, + Linear_System& source1, + Linear_System& dest, + Bit_Matrix& sat, + const Linear_System& source2) { + // `source1' and `source2' cannot be empty. + assert(!source1.has_no_rows() && !source2.has_no_rows()); + // `source1' and `source2' must have the same number of columns + // to be merged. + assert(source1.num_columns() == source2.num_columns()); + // `source1' and `source2' are fully sorted. + assert(source1.is_sorted() && source1.num_pending_rows() == 0); + assert(source2.is_sorted() && source2.num_pending_rows() == 0); + assert(dest.num_pending_rows() == 0); + + const dimension_type old_source1_num_rows = source1.num_rows(); + // `k1' and `k2' run through the rows of `source1' and `source2', resp. + dimension_type k1 = 0; + dimension_type k2 = 0; + dimension_type source2_num_rows = source2.num_rows(); + while (k1 < old_source1_num_rows && k2 < source2_num_rows) { + // Add to `source1' the constraints from `source2', as pending rows. + // We exploit the property that initially both `source1' and `source2' + // are sorted and index `k1' only scans the non-pending rows of `source1', + // so that it is not influenced by the pending rows appended to it. + // This way no duplicate (i.e., trivially redundant) constraint + // is introduced in `source1'. + const int cmp = compare(source1[k1], source2[k2]); + if (cmp == 0) { + // We found the same row: there is no need to add `source2[k2]'. + ++k2; + // By sortedness, since `k1 < old_source1_num_rows', + // we can increment index `k1' too. + ++k1; + } + else if (cmp < 0) + // By sortedness, we can increment `k1'. + ++k1; + else { + // Here `cmp > 0'. + // By sortedness, `source2[k2]' cannot be in `source1'. + // We add it as a pending row of `source1' (sortedness unaffected). + source1.add_pending_row(source2[k2]); + // We can increment `k2'. + ++k2; + } + } + // Have we scanned all the rows in `source2'? + if (k2 < source2_num_rows) + // By sortedness, all the rows in `source2' having indexes + // greater than or equal to `k2' were not in `source1'. + // We add them as pending rows of 'source1' (sortedness not affected). + for ( ; k2 < source2_num_rows; ++k2) + source1.add_pending_row(source2[k2]); + + if (source1.num_pending_rows() == 0) + // No row was appended to `source1', because all the constraints + // in `source2' were already in `source1'. + // There is nothing left to do ... + return false; + + return add_and_minimize(con_to_gen, source1, dest, sat); +} + +/*! + \return + true if the obtained polyhedron is empty, + false otherwise. + + \param con_to_gen + true if \p source is a system of constraints, + false 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 + conversion()) and simplify. + + This method treats also the dual case, i.e., processing pending + generators. In this case \p source contains generators and \p dest + is the system of constraints corresponding to the non-pending part + of \p source. +*/ +bool +PPL::Polyhedron::add_and_minimize(const bool con_to_gen, + Linear_System& source, + Linear_System& dest, + Bit_Matrix& sat) { + assert(source.num_pending_rows() > 0); + assert(source.num_columns() == dest.num_columns()); + assert(source.is_sorted()); + + // First, pad the saturation matrix with new columns (of zeroes) + // to accommodate for the pending rows of `source'. + sat.resize(dest.num_rows(), source.num_rows()); + + // Incrementally compute the new system of generators. + // Parameter `start' is set to the index of the first pending constraint. + const dimension_type num_lines_or_equalities + = conversion(source, source.first_pending_row(), + dest, sat, + dest.num_lines_or_equalities()); + + // conversion() may have modified the number of rows in `dest'. + const dimension_type dest_num_rows = dest.num_rows(); + + // Checking if the generators in `dest' represent an empty polyhedron: + // the polyhedron is empty if there are no points + // (because rays, lines and closure points need a supporting point). + // Points can be detected by looking at: + // - the divisor, for necessarily closed polyhedra; + // - the epsilon coordinate, for NNC polyhedra. + const dimension_type checking_index + = dest.is_necessarily_closed() + ? 0 + : dest.num_columns() - 1; + dimension_type first_point; + for (first_point = num_lines_or_equalities; + first_point < dest_num_rows; + ++first_point) + if (dest[first_point][checking_index] > 0) + break; + + if (first_point == dest_num_rows) + if (con_to_gen) + // No point has been found: the polyhedron is empty. + return true; + else + // Here `con_to_gen' is false: `dest' is a system of constraints. + // In this case the condition `first_point == dest_num_rows' + // actually means that all the constraints in `dest' have their + // inhomogeneous term equal to 0. + // This is an ILLEGAL situation, because it implies that + // the constraint system `dest' lacks the positivity constraint + // and no linear combination of the constraints in `dest' + // can reintroduce the positivity constraint. + throw std::runtime_error("PPL internal error"); + else { + // A point has been found: the polyhedron is not empty. + // Now invoking `simplify()' to remove all the redundant constraints + // from the system `source'. + // Since the saturation matrix `sat' returned by `conversion()' + // has rows indexed by generators (the rows of `dest') and columns + // indexed by constraints (the rows of `source'), we have to + // transpose it to obtain the saturation matrix needed by `simplify()'. + sat.transpose(); + simplify(source, sat); + // Transposing back. + sat.transpose(); + return false; + } +} diff --git a/src/mp_std_bits.cc b/src/mp_std_bits.cc new file mode 100644 index 0000000..7c46b2a --- /dev/null +++ b/src/mp_std_bits.cc @@ -0,0 +1,72 @@ +/* Definitions of specializations of std::numeric_limits objects for + multi-precision types. This will become obsolete when GMP and MPFR + will provide the specializations by themselves. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include +#include "mp_std_bits.defs.hh" + +const bool std::numeric_limits::is_specialized; +const int std::numeric_limits::digits; +const int std::numeric_limits::digits10; +const bool std::numeric_limits::is_signed; +const bool std::numeric_limits::is_integer; +const bool std::numeric_limits::is_exact; +const int std::numeric_limits::radix; +const int std::numeric_limits::min_exponent; +const int std::numeric_limits::min_exponent10; +const int std::numeric_limits::max_exponent; +const int std::numeric_limits::max_exponent10; +const bool std::numeric_limits::has_infinity; +const bool std::numeric_limits::has_quiet_NaN; +const bool std::numeric_limits::has_signaling_NaN; +const std::float_denorm_style std::numeric_limits::has_denorm; +const bool std::numeric_limits::has_denorm_loss; +const bool std::numeric_limits::is_iec559; +const bool std::numeric_limits::is_bounded; +const bool std::numeric_limits::is_modulo; +const bool std::numeric_limits::traps; +const bool std::numeric_limits::tininess_before; +const std::float_round_style std::numeric_limits::round_style; + +const bool std::numeric_limits::is_specialized; +const int std::numeric_limits::digits; +const int std::numeric_limits::digits10; +const bool std::numeric_limits::is_signed; +const bool std::numeric_limits::is_integer; +const bool std::numeric_limits::is_exact; +const int std::numeric_limits::radix; +const int std::numeric_limits::min_exponent; +const int std::numeric_limits::min_exponent10; +const int std::numeric_limits::max_exponent; +const int std::numeric_limits::max_exponent10; +const bool std::numeric_limits::has_infinity; +const bool std::numeric_limits::has_quiet_NaN; +const bool std::numeric_limits::has_signaling_NaN; +const std::float_denorm_style std::numeric_limits::has_denorm; +const bool std::numeric_limits::has_denorm_loss; +const bool std::numeric_limits::is_iec559; +const bool std::numeric_limits::is_bounded; +const bool std::numeric_limits::is_modulo; +const bool std::numeric_limits::traps; +const bool std::numeric_limits::tininess_before; +const std::float_round_style std::numeric_limits::round_style; diff --git a/src/mp_std_bits.defs.hh b/src/mp_std_bits.defs.hh new file mode 100644 index 0000000..7b1160e --- /dev/null +++ b/src/mp_std_bits.defs.hh @@ -0,0 +1,169 @@ +/* Declarations of specializations of std:: objects for + multi-precision types. This will become obsolete when GMP and MPFR + will provide the specializations by themselves. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_mp_std_bits_defs_hh +#define PPL_mp_std_bits_defs_hh 1 + +#include +#include + +#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); + +namespace std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specialization of std::numeric_limits. +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template <> +class numeric_limits { +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 tininess_before = false; + static const float_round_style round_style = round_toward_zero; + + static Type min() { + return static_cast(0); + } + + static Type max() { + return static_cast(0); + } + + static Type epsilon() { + return static_cast(0); + } + + static Type round_error() { + return static_cast(0); + } + + static Type infinity() { + return static_cast(0); + } + + static Type quiet_NaN() { + return static_cast(0); + } + + static Type denorm_min() { + return static_cast(1); + } +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specialization of std::numeric_limits. +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template <> +class numeric_limits { +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 tininess_before = false; + static const float_round_style round_style = round_toward_zero; + + static Type min() { + return static_cast(0); + } + + static Type max() { + return static_cast(0); + } + + static Type epsilon() { + return static_cast(0); + } + + static Type round_error() { + return static_cast(0); + } + + static Type infinity() { + return static_cast(0); + } + + static Type quiet_NaN() { + return static_cast(0); + } + + static Type denorm_min() { + return static_cast(0); + } +}; + +} // namespace std + +#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..859caa7 --- /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. This will become obsolete when GMP and MPFR + will provide the specializations by themselves. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_mp_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..6d7ca40 --- /dev/null +++ b/src/namespaces.hh @@ -0,0 +1,185 @@ +/* Documentation for used namespaces. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_namespaces_hh +#define PPL_namespaces_hh 1 + +//! The entire library is confined to this namespace. +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(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 function templates + swap() and iter_swap() (25.2.2, [lib.alg.swap]), + and for the class template numeric_limits + (18.2.1, [lib.limits]). + + \note + The PPL provides the specializations of the class template + numeric_limits not only for PPL-specific numeric types, + but also for the GMP types mpz_class and + mpq_class. 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..e175d57 --- /dev/null +++ b/src/ppl-config.cc.in @@ -0,0 +1,741 @@ +/* A program to enquire about the configuration of the PPL -*- C++ -*- + and of the applications using it. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl.hh" + +namespace PPL = Parma_Polyhedra_Library; + +#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 8 +#error "PPL version 0.8 or following is required" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef PPL_HAVE_GETOPT_H +#include + +// 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 +// . +#include +#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; + +const char* variable_prefix = "PPL_"; + +bool exec_prefix_set = false; + +bool required_application = false; +bool required_library = false; +bool required_prefix = false; +bool required_exec_prefix = false; +bool required_configure_options = false; +bool required_version = false; +bool required_version_major = false; +bool required_version_minor = false; +bool required_version_revision = false; +bool required_version_beta = false; +bool required_banner = false; +bool required_coefficients = false; +bool required_includedir = false; +bool required_bindir = false; +bool required_libdir = false; +bool required_cppflags = false; +bool required_cflags = false; +bool required_cxxflags = false; +bool required_ldflags = false; +bool required_license = false; +bool required_copying = false; +bool required_bugs = false; +bool required_credits = false; + +unsigned num_required_items = 0; + +#ifdef 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 .\n"; + +#define OPTION_LETTERS "hF:I:ALp::e::OVMNRBEniblPCXDgcur" + +const char* program_name = 0; + +void +fatal(const char* format, ...) { + va_list ap; + va_start(ap, format); + fprintf(stderr, "%s: ", program_name); + vfprintf(stderr, format, ap); + fprintf(stderr, "\n"); + va_end(ap); + exit(1); +} + +// Currently unused, but we may want to use it in the future. +/* +void +warning(const char* format, ...) { + va_list ap; + va_start(ap, format); + fprintf(stderr, "%s: Warning: ", program_name); + vfprintf(stderr, format, ap); + fprintf(stderr, "\n"); + va_end(ap); +} +*/ + +void internal_error() { + fatal("internal error: please submit a bug report to ppl-devel@cs.unipr.it"); +} + +bool +strcaseeq(const char* s1, const char* s2) { + while (*s1 && *s2 + && tolower(static_cast(*s1)) + == tolower(static_cast(*s2))) { + ++s1; + ++s2; + } + return tolower(static_cast(*s1)) + == tolower(static_cast(*s2)); +} + +void +process_options(int argc, char* argv[]) { + 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) { + prefix = optarg; + if (!exec_prefix_set) { + exec_prefix = optarg; + exec_prefix_set = true; + } + } + else { + required_prefix = true; + ++num_required_items; + } + break; + + // --exec_prefix + case 'e': + if (optarg) { + exec_prefix = optarg; + exec_prefix_set = true; + } + else { + required_exec_prefix = true; + ++num_required_items; + } + break; + + // --configure-options + case 'O': + required_configure_options = true; + ++num_required_items; + break; + + // --version + case 'V': + required_version = true; + ++num_required_items; + break; + + // --version-major + case 'M': + required_version_major = true; + ++num_required_items; + break; + + // --version-minor + case 'N': + required_version_minor = true; + ++num_required_items; + break; + + // --version-revision + case 'R': + required_version_revision = true; + ++num_required_items; + break; + + // --version-beta + case 'B': + required_version_beta = true; + ++num_required_items; + break; + + // --banner + case 'E': + required_banner = true; + ++num_required_items; + break; + + // --coefficients + case 'n': + required_coefficients = true; + ++num_required_items; + break; + + // --includedir + case 'i': + required_includedir = true; + ++num_required_items; + break; + + // --bindir + case 'b': + required_bindir = true; + ++num_required_items; + break; + + // --libdir + case 'l': + required_libdir = true; + ++num_required_items; + break; + + // --cppflags + case 'P': + required_cppflags = true; + ++num_required_items; + break; + + // --cflags + case 'C': + required_cflags = true; + ++num_required_items; + break; + + // --cxxflags + case 'X': + required_cxxflags = true; + ++num_required_items; + break; + + // --ldflags + case 'D': + required_ldflags = true; + ++num_required_items; + break; + + // --license + case 'g': + required_license = true; + ++num_required_items; + break; + + // --copying + case 'c': + required_copying = true; + ++num_required_items; + break; + + // --bugs + case 'u': + required_bugs = true; + ++num_required_items; + break; + + // --credits + case 'r': + required_credits = true; + ++num_required_items; + break; + + default: + abort(); + } + } + + if (argc != optind) + // We have a spurious argument. + fatal("no arguments besides options are accepted"); + + if (required_application && required_library) + fatal("the --application and --library are mutually exclusive"); + + if (!required_application && !required_library) + required_application = true; + + if (required_format == NO_FORMAT) + required_format = PLAIN; + + if (required_interface == NO_INTERFACE) + required_interface = CXX; +} + +void +portray_name(const char* name) { + switch (required_format) { + case PLAIN: + if (num_required_items > 1) + std::cout << variable_prefix << name << ": "; + break; + case MAKEFILE: + std::cout << variable_prefix << name << '='; + break; + case SH: + std::cout << "export " << variable_prefix << name << '='; + break; + case CSH: + std::cout << "setenv " << variable_prefix << name << ' '; + break; + default: + internal_error(); + } +} + +void +portray(const char* const array[]) { + for (unsigned i = 0; array[i] != 0; ++i) + std::cout << array[i] << std::endl; +} + +void +portray(const char* string) { + std::cout << string; +} + +void +portray(long n) { + std::cout << n; +} + +void +portray(const char* name, const char* const array[]) { + portray_name(name); + portray(array); + std::cout << std::endl; +} + +void +portray(const char* name, const char* string) { + portray_name(name); + portray(string); + std::cout << std::endl; +} + +void +portray(const char* name, std::string s) { + portray(name, s.c_str()); +} + +void +portray(const char* name, long n) { + portray_name(name); + portray(n); + std::cout << std::endl; +} + +void +replace(std::string& s, + const std::string& pattern, const std::string& replacement) { + std::string::size_type pos = 0; + while (true) { + pos = s.find(pattern, pos); + if (pos == std::string::npos) + break; + s.replace(pos, pattern.size(), replacement); + pos += replacement.length(); + } +} + +void +replace_prefixes(std::string& s) { + static const std::string prefix_reference = "${prefix}"; + static const std::string exec_prefix_reference = "${exec_prefix}"; + replace(s, prefix_reference, prefix); + replace(s, exec_prefix_reference, exec_prefix); +} + +void +portray_with_prefixes(const char* name, std::string s) { + replace_prefixes(s); + portray(name, s); +} + +} // namespace + +int +main(int argc, char* argv[]) try { + program_name = argv[0]; + + if (strcmp(PPL_VERSION, PPL::version()) != 0) + fatal("was compiled with PPL version %s, but linked with version %s", + PPL_VERSION, PPL::version()); + + // Initialize prefixes. + prefix = "@prefix@"; + exec_prefix = "@exec_prefix@"; + replace_prefixes(prefix); + replace_prefixes(exec_prefix); + + // Process command line options. + process_options(argc, argv); + + if (required_prefix) + portray("PREFIX", prefix); + + if (required_exec_prefix) + portray("EXEC_PREFIX", exec_prefix); + + if (required_configure_options) + portray("CONFIGURE_OPTIONS", PPL_CONFIGURE_OPTIONS); + + if (required_version) + portray("VERSION", PPL_VERSION); + + if (required_version_major) + portray("VERSION_MAJOR", long(PPL_VERSION_MAJOR)); + + if (required_version_minor) + portray("VERSION_MINOR", long(PPL_VERSION_MINOR)); + + if (required_version_revision) + portray("VERSION_REVISION", long(PPL_VERSION_REVISION)); + + if (required_version_beta) + portray("VERSION_BETA", long(PPL_VERSION_BETA)); + + if (required_banner) + portray("BANNER", PPL::banner()); + + if (required_coefficients) + portray("COEFFICIENTS", "@coefficient_mnemonic@"); + + if (required_includedir) + portray_with_prefixes("INCLUDEDIR", "@includedir@"); + + if (required_bindir) + portray_with_prefixes("BINDIR", "@bindir@"); + + if (required_libdir) + portray_with_prefixes("LIBDIR", "@libdir@"); + + if (required_cppflags) { + if (required_application) { + std::string cppflags = "@CPPFLAGS@"; + std::string s = "@includedir@"; + replace_prefixes(s); + // `/usr/include' is the standard include directory: + // thus it needs not be specified. + if (s == "/usr/include") + s = cppflags; + else { + s = "-I" + s; + // Avoid duplicating the -I options. + if (cppflags.find(s) != std::string::npos) + s = ""; + if (s.length() > 0 && strlen("@CPPFLAGS@") > 0) + s += ' '; + s += "@CPPFLAGS@"; + } + if (s.length() > 0 && strlen("@extra_includes@") > 0) + s += ' '; + s += "@extra_includes@"; + portray("CPPFLAGS", s); + } + else + portray("CPPFLAGS", "@CPPFLAGS@"); + } + + if (required_cflags) + portray("CFLAGS", "@CFLAGS@"); + + if (required_cxxflags) + portray("CXXFLAGS", "@CXXFLAGS@"); + + if (required_ldflags) { + std::string s = "@libdir@"; + replace_prefixes(s); + const std::string ldflags = "@LDFLAGS@"; + // `/usr/lib' is the standard library directory: + // thus it needs not be specified. + if (s == "/usr/lib") + s = ldflags; + else { + s = "-L" + s; + // Avoid duplicating the -L options. + if (ldflags.find(s) != std::string::npos) + s = ""; + if (s.length() > 0 && ldflags.length() > 0) + s += ' '; + s += ldflags; + } + if (required_library) { + if (s.length() > 0 && strlen("@extra_libraries@") > 0) + s += ' '; + s += "@extra_libraries@"; + } + else { + assert(required_application); + if (s.length() > 0) + s += ' '; + s += "-lppl"; + switch (required_interface) { + case C: + s += " -lppl_c"; + break; + default: + break; + } + s += " -lgmpxx -lgmp"; + } + portray("LDFLAGS", s); + } + + if (required_license) + portray("LICENSE", PPL_LICENSE); + + if (required_copying) { + extern const char* const COPYING_array[]; + portray("COPYING", COPYING_array); + } + + if (required_bugs) { + extern const char* const BUGS_array[]; + portray("BUGS", BUGS_array); + } + + if (required_credits) { + extern const char* const CREDITS_array[]; + portray("CREDITS", CREDITS_array); + } + + return 0; +} +catch (const std::bad_alloc&) { + fatal("out of memory"); + exit(1); +} +catch (const std::overflow_error& e) { + fatal("arithmetic overflow (%s)", e.what()); + exit(1); +} +catch (...) { + internal_error(); +} diff --git a/src/ppl.hh.dist b/src/ppl.hh.dist new file mode 100644 index 0000000..6226c45 --- /dev/null +++ b/src/ppl.hh.dist @@ -0,0 +1,76424 @@ +/* This is the header file of the Parma Polyhedra Library. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_ppl_hh +#define PPL_ppl_hh 1 + +#ifdef NDEBUG +# define PPL_SAVE_NDEBUG 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. */ + + +/* 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 `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 header file. */ +#define PPL_HAVE_DLFCN_H 1 + +/* Define to 1 if you have the header file. */ +#define PPL_HAVE_FENV_H 1 + +/* Define to 1 if you have the header file. */ +#define PPL_HAVE_GETOPT_H 1 + +/* Define to 1 if you have the header file. */ +#define PPL_HAVE_GLPK_GLPK_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef PPL_HAVE_GLPK_H */ + +/* Define to 1 if you have the header file. */ +/* #undef PPL_HAVE_IEEEFP_H */ + +/* Define to 1 if you have the 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 header file. */ +#define PPL_HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `setitimer' function. */ +#define HAVE_SETITIMER 1 + +/* Define to 1 if the system has the type `siginfo_t'. */ +#define HAVE_SIGINFO_T 1 + +/* Define to 1 if you have the header file. */ +#define PPL_HAVE_SIGNAL_H 1 + +/* Define to 1 if you have the header file. */ +#define PPL_HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define PPL_HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define PPL_HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define PPL_HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define PPL_HAVE_SYS_RESOURCE_H 1 + +/* Define to 1 if you have the header file. */ +#define PPL_HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define PPL_HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the 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 `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 header file. */ +#define PPL_HAVE_UNISTD_H 1 + +/* Define to 1 if `_mp_alloc' is member of `__mpz_struct'. */ +#define PPL_HAVE___MPZ_STRUCT__MP_ALLOC 1 + +/* Define to 1 if `_mp_d' is member of `__mpz_struct'. */ +#define PPL_HAVE___MPZ_STRUCT__MP_D 1 + +/* Define to 1 if `_mp_size' is 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@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 0.10.2" + +/* Define to the one symbol short name of this package. */ +#define PPL_PACKAGE_TARNAME "ppl" + +/* Define to the version of this package. */ +#define PPL_PACKAGE_VERSION "0.10.2" + +/* 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 "" + +/* The unique code of the binary format of C++ doubles, if supported; + undefined otherwise. */ +#define PPL_CXX_DOUBLE_BINARY_FORMAT PPL_FLOAT_IEEE754_DOUBLE + +/* Not zero if C++ supports exact output for doubles. */ +#define PPL_CXX_DOUBLE_EXACT_OUTPUT 1 + +/* The binary format of C++ floats, if supported; undefined otherwise. */ +#define PPL_CXX_FLOAT_BINARY_FORMAT PPL_FLOAT_IEEE754_SINGLE + +/* Not zero if C++ supports exact output for floats. */ +#define PPL_CXX_FLOAT_EXACT_OUTPUT 1 + +/* Not zero if the C++ compiler has the remainder bug. */ +#define PPL_CXX_HAS_REMAINDER_BUG 1 + +/* 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 C++ supports exact output for long doubles. */ +#define PPL_CXX_LONG_DOUBLE_EXACT_OUTPUT 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 C++ compiler supports flexible arrays. */ +#define PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS 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 + +/* Defined if floating point arithmetics may use the 387 unit. */ +#define PPL_FPMATH_MAY_USE_387 1 + +/* Defined if floating point arithmetics 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 + +/* Defined if the Parma Watchdog Library is enabled. */ +#define PPL_WATCHDOG_LIBRARY_ENABLED 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 */ + + +#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 is included before is + (even indirectly) included. Moreover we need to define + __STDC_LIMIT_MACROS before the first inclusion of + 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 +#endif + +#ifdef PPL_HAVE_INTTYPES_H +# include +#endif + +/* Automatically generated from PPL source file ../src/version.hh line 1. */ +/* Declaration of macros and functions providing version -*- C++ -*- + and licensing information. +*/ + + +//! The major number of the PPL version. +/*! \ingroup PPL_CXX_interface */ +#define PPL_VERSION_MAJOR 0 + +//! The minor number of the PPL version. +/*! \ingroup PPL_CXX_interface */ +#define PPL_VERSION_MINOR 10 + +//! The revision number of the PPL version. +/*! \ingroup PPL_CXX_interface */ +#define PPL_VERSION_REVISION 2 + +/*! \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 M and m denote the numbers associated + to PPL_VERSION_MAJOR and PPL_VERSION_MINOR, respectively. The + format of PPL_VERSION is M "." m if both + PPL_VERSION_REVISION (r) and PPL_VERSION_BETA + (b)are zero, M "." m "pre" b if + PPL_VERSION_REVISION is zero and PPL_VERSION_BETA is not zero, + M "." m "." r if PPL_VERSION_REVISION is not zero and + PPL_VERSION_BETA is zero, M "." m "." r "pre" b if + neither PPL_VERSION_REVISION nor PPL_VERSION_BETA are zero. +*/ +#define PPL_VERSION "0.10.2" + +namespace Parma_Polyhedra_Library { + +//! Returns the major number of the PPL version. +unsigned +version_major(); + +//! Returns the minor number of the PPL version. +unsigned +version_minor(); + +//! Returns the revision number of the PPL version. +unsigned +version_revision(); + +//! Returns the beta number of the PPL version. +unsigned +version_beta(); + +//! Returns a character string containing the PPL version. +const char* version(); + +//! Returns a character string containing the PPL banner. +/*! + The banner provides information about the PPL version, the licensing, + the lack of any warranty whatsoever, the C++ compiler used to build + the library, where to report bugs and where to look for further + information. +*/ +const char* banner(); + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/namespaces.hh line 1. */ +/* Documentation for used namespaces. +*/ + + +//! The entire library is confined to this namespace. +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(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 function templates + swap() and iter_swap() (25.2.2, [lib.alg.swap]), + and for the class template numeric_limits + (18.2.1, [lib.limits]). + + \note + The PPL provides the specializations of the class template + numeric_limits not only for PPL-specific numeric types, + but also for the GMP types mpz_class and + mpq_class. 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 +class Interval_Info_Null; + +template +class Interval_Info_Bitset; + +} // namespace Parma_Polyhedra_Library + +/* 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 27. */ +#include +#include + +class Parma_Polyhedra_Library::stdiobuf + : public std::basic_streambuf > { +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 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 ungetc_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), ungetc_buf(traits_type::eof()) { +} + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/stdiobuf.defs.hh line 109. */ + +/* 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 27. */ +#include + +class Parma_Polyhedra_Library::c_streambuf + : public std::basic_streambuf > { +public: + //! Constructor. + c_streambuf(); + virtual ~c_streambuf(); + +protected: + /*! \brief + Gets a character in case of underflow. + + \remarks + Specified by ISO/IEC 14882:1998: 27.5.2.4.3. + */ + 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. + */ + int_type uflow(); + + /*! \brief + Gets a sequence of characters. + + \remarks + Specified by ISO/IEC 14882:1998: 27.5.2.4.3. + */ + 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. + */ + 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. + */ + 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. + */ + int_type overflow(int_type c); + + /*! \brief + Synchronizes the stream buffer. + + Specified by ISO/IEC 14882:1998: 27.5.2.4.2. + */ + int sync(); + +private: + //! Character type of the streambuf. + typedef char char_type; + + //! Traits type of the streambuf. + typedef std::char_traits traits_type; + + //! Integer type of the streambuf. + typedef traits_type::int_type int_type; + + //! Buffer for the last character read. + int_type ungetc_buf; + + //! Buffer for next character + int_type nextc_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() + : ungetc_buf(traits_type::eof()), nextc_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 122. */ + +/* 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.types.hh line 1. */ + + +namespace Parma_Polyhedra_Library { + +class Init; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/fpu.types.hh line 1. */ + + +#ifdef PPL_HAVE_IEEEFP_H +#include +#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/Init.defs.hh line 28. */ + +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. + + 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 + Nifty Counter 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: + //! 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/fpu.defs.hh line 1. */ +/* Floating point unit related functions. +*/ + + +/* Automatically generated from PPL source file ../src/compiler.hh line 1. */ +/* C++ compiler related stuff. +*/ + + +namespace Parma_Polyhedra_Library { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \brief + No-op function that allows to avoid unused variable warnings from + the compiler. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +inline void +used(const T&) { +} + +#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 +inline void +cc_flush(const T& x) { +#if defined(__GNUC__) || defined(__INTEL_COMPILER) + __asm__ __volatile__ ("" : "+m" (const_cast(x))); +#else + // FIXME: is it possible to achieve the same effect in a portable way? + 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 +struct Suppress_Uninitialized_Warnings_Type { + typedef T synonym; +}; + +#define PPL_UNINITIALIZED(type, name) \ + type name = Suppress_Uninitialized_Warnings_Type::synonym () +#else +#define PPL_UNINITIALIZED(type, name) \ + type name +#endif + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/fpu.defs.hh line 28. */ + +namespace Parma_Polyhedra_Library { + +//! 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 inexact + computation 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 inexact computation status. +void +fpu_reset_inexact(); + +/*! \brief + Queries the inexact computation status. + + Returns 0 if the computation was definitely exact, 1 if it was + definitely inexact, -1 if definite exactness information is unavailable. +*/ +int +fpu_check_inexact(); + +} // namespace Parma_Polyhedra_Library + +#if 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 +#include + +#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(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(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_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(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 81. */ +#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 + +#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(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(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 86. */ +#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 +#include + +#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_PPL_FPU_TOWARDZERO FE_TOWARDZERO +#endif + +namespace Parma_Polyhedra_Library { + +inline void +fpu_initialize_control_functions() { + 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(fegetround()); +} + +inline void +fpu_set_rounding_direction(fpu_rounding_direction_type dir) { + fesetround(dir); +} + +inline fpu_rounding_control_word_type +fpu_save_rounding_direction(fpu_rounding_direction_type dir) { + fpu_rounding_control_word_type old + = static_cast(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; +#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 88. */ +#else +#error "PPL_CAN_CONTROL_FPU evaluates to true, but 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 + +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 95. */ + +#endif // !PPL_CAN_CONTROL_FPU + +/* Automatically generated from PPL source file ../src/Rounding_Dir.defs.hh line 1. */ +/* Declaration of Rounding_Dir and related functions. +*/ + + +/* Automatically generated from PPL source file ../src/Result.defs.hh line 1. */ +/* Result enum and supporting function declarations. +*/ + + +namespace Parma_Polyhedra_Library { + +//! Possible outcomes of a checked arithmetic computation. +/*! \ingroup PPL_CXX_interface */ +enum Result { + + //! \hideinitializer Ordinary result class. + VC_NORMAL = 0, + + //! \hideinitializer The computed result is inexact and rounded up. + V_LT = 1, + + //! \hideinitializer The computed result is inexact and rounded down. + V_GT = 2, + + //! \hideinitializer The computed result is exact. + V_EQ = 4, + + //! \hideinitializer The computed result is inexact. + V_NE = V_LT | V_GT, + + //! \hideinitializer The computed result may be inexact and rounded up. + V_LE = V_EQ | V_LT, + + //! \hideinitializer The computed result may be inexact and rounded down. + V_GE = V_EQ | V_GT, + + //! \hideinitializer The computed result may be inexact. + V_LGE = V_LT | V_EQ | V_GT, + + //! \hideinitializer Negative infinity unrepresentable result class. + VC_MINUS_INFINITY = 16, + + //! \hideinitializer A negative overflow occurred. + V_NEG_OVERFLOW = VC_MINUS_INFINITY | V_GT, + + //! \hideinitializer Positive infinity unrepresentable result class. + VC_PLUS_INFINITY = 32, + + //! \hideinitializer A positive overflow occurred. + V_POS_OVERFLOW = VC_PLUS_INFINITY | V_LT, + + //! \hideinitializer Not a number result class. + VC_NAN = 48, + + //! \hideinitializer Converting from unknown string. + V_CVT_STR_UNK = 49, + + //! \hideinitializer Dividing by zero. + V_DIV_ZERO = 50, + + //! \hideinitializer Adding two infinities having opposite signs. + V_INF_ADD_INF = 51, + + //! \hideinitializer Dividing two infinities. + V_INF_DIV_INF = 52, + + //! \hideinitializer Taking the modulus of an infinity. + V_INF_MOD = 53, + + //! \hideinitializer Multiplying an infinity by zero. + V_INF_MUL_ZERO = 54, + + //! \hideinitializer Subtracting two infinities having the same sign. + V_INF_SUB_INF = 55, + + //! \hideinitializer Computing a remainder modulo zero. + V_MOD_ZERO = 56, + + //! \hideinitializer Taking the square root of a negative number. + V_SQRT_NEG = 57, + + //! \hideinitializer Unknown result due to intermediate negative overflow. + V_UNKNOWN_NEG_OVERFLOW = 58, + + //! \hideinitializer Unknown result due to intermediate positive overflow. + V_UNKNOWN_POS_OVERFLOW = 59, + + //! \hideinitializer Unordered comparison. + V_UNORD_COMP = 60, + + VC_MASK = 48 +}; + +//! Extracts the class part of \p r (normal, minus/plus infinity or nan). +Result classify(Result r); + +//! Returns true if and only if the class or \p r is not normal. +bool is_special(Result r); + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Result.inlines.hh line 1. */ +/* Result supporting functions implementation: inline functions. +*/ + + +namespace Parma_Polyhedra_Library { + +/*! \relates Parma_Polyhedra_Library::Result */ +inline Result +classify(Result r) { + return static_cast(r & VC_MASK); +} + +/*! \relates Parma_Polyhedra_Library::Result */ +inline bool +is_special(Result r) { + return classify(r) != VC_NORMAL; +} + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Result.defs.hh line 119. */ + +/* Automatically generated from PPL source file ../src/Rounding_Dir.defs.hh line 28. */ + +namespace Parma_Polyhedra_Library { + +//! Rounding directions for arithmetic computations. +/*! \ingroup PPL_CXX_interface */ +enum Rounding_Dir { + /*! \hideinitializer + Round toward \f$-\infty\f$. + */ + ROUND_DOWN = 0, + + /*! \hideinitializer + Round toward \f$+\infty\f$. + */ + ROUND_UP = 1, + + /*! \hideinitializer + Rounding is delegated to lower level. Result info is evaluated lazily. + */ + ROUND_IGNORE = 6, + ROUND_NATIVE = ROUND_IGNORE, + + /*! \hideinitializer + Rounding is not needed: client code must ensure the operation is exact. + */ + ROUND_NOT_NEEDED = 7, + + ROUND_DIRECT = ROUND_UP, + ROUND_INVERSE = ROUND_DOWN, + + ROUND_DIR_MASK = 7, + + ROUND_FPU_CHECK_INEXACT = 8, + + ROUND_CHECK = ROUND_DIRECT | ROUND_FPU_CHECK_INEXACT +}; + +/*! \brief + Returns the inverse rounding mode of \p dir, + ROUND_IGNORE being the inverse of itself. +*/ +Rounding_Dir inverse(Rounding_Dir dir); + +Rounding_Dir round_dir(Rounding_Dir dir); +bool round_down(Rounding_Dir dir); +bool round_up(Rounding_Dir dir); +bool round_ignore(Rounding_Dir dir); +bool round_direct(Rounding_Dir dir); +bool round_inverse(Rounding_Dir dir); + +bool round_fpu_check_inexact(Rounding_Dir dir); + +fpu_rounding_direction_type round_fpu_dir(Rounding_Dir dir); + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Rounding_Dir.inlines.hh line 1. */ +/* Inline functions operating on enum Rounding_Dir values. +*/ + + +#include + +namespace Parma_Polyhedra_Library { + +inline Rounding_Dir +round_dir(Rounding_Dir dir) { + return static_cast(dir & ROUND_DIR_MASK); +} + +inline bool +round_down(Rounding_Dir dir) { + return round_dir(dir) == ROUND_DOWN; +} + +inline bool +round_up(Rounding_Dir dir) { + return round_dir(dir) == ROUND_UP; +} + +inline bool +round_ignore(Rounding_Dir dir) { + return round_dir(dir) == ROUND_IGNORE; +} + +inline bool +round_direct(Rounding_Dir dir) { + return round_dir(dir) == ROUND_DIRECT; +} + +inline bool +round_inverse(Rounding_Dir dir) { + return round_dir(dir) == ROUND_INVERSE; +} + +inline bool +round_fpu_check_inexact(Rounding_Dir dir) { + return dir & ROUND_FPU_CHECK_INEXACT; +} + +#if PPL_CAN_CONTROL_FPU + +inline fpu_rounding_direction_type +round_fpu_dir(Rounding_Dir dir) { + switch (round_dir(dir)) { + case ROUND_UP: + return static_cast(PPL_FPU_UPWARD); + case ROUND_DOWN: + return static_cast(PPL_FPU_DOWNWARD); + default: + assert(false); + return static_cast(PPL_FPU_UPWARD); + } +} + +#undef PPL_FPU_DOWNWARD +#undef PPL_FPU_TONEAREST +#undef PPL_FPU_TOWARDZERO +#undef PPL_FPU_UPWARD + +#endif + +/*! \relates Parma_Polyhedra_Library::Rounding_Dir */ +inline Rounding_Dir +inverse(Rounding_Dir dir) { + Rounding_Dir d = round_dir(dir); + switch (d) { + case ROUND_UP: + d = ROUND_DOWN; + break; + case ROUND_DOWN: + d = ROUND_UP; + break; + default: + assert(false); + /* Fall through */ + case ROUND_IGNORE: + return dir; + } + return static_cast((dir & ~ROUND_DIR_MASK) | d); +} + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Rounding_Dir.defs.hh line 85. */ + + +/* Automatically generated from PPL source file ../src/Init.inlines.hh line 28. */ + +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 84. */ + + +/* Automatically generated from PPL source file ../src/initializer.hh line 27. */ + +#ifndef PPL_NO_AUTOMATIC_INITIALIZATION +namespace { + +Parma_Polyhedra_Library::Init Parma_Polyhedra_Library_initializer; + +} // namespace +#else +namespace { + +Parma_Polyhedra_Library::Init* Parma_Polyhedra_Library_initializer_p; + +} // namespace +#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 + 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/Scalar_Products.defs.hh line 1. */ +/* Scalar_Products class definition. +*/ + + +/* 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/Linear_Row.types.hh line 1. */ + + +namespace Parma_Polyhedra_Library { + +class Linear_Row; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Coefficient.types.hh line 1. */ + + +/* Automatically generated from PPL source file ../src/Checked_Number.defs.hh line 1. */ +/* Checked_Number class declaration. +*/ + + +/* Automatically generated from PPL source file ../src/Checked_Number.types.hh line 1. */ + + +/* Automatically generated from PPL source file ../src/Coefficient_traits_template.hh line 1. */ + + +namespace Parma_Polyhedra_Library { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Coefficient traits. +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +struct Coefficient_traits_template { +}; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Checked_Number.types.hh line 16. */ + +namespace Parma_Polyhedra_Library { + +struct Checked_Number_Default_Policy; +struct Extended_Number_Policy; + +template +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 +#include +/* Automatically generated from PPL source file ../src/mp_std_bits.defs.hh line 1. */ +/* Declarations of specializations of std:: objects for + multi-precision types. This will become obsolete when GMP and MPFR + will provide the specializations by themselves. +*/ + + +#include +#include + +#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); + +namespace std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specialization of std::numeric_limits. +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template <> +class numeric_limits { +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 tininess_before = false; + static const float_round_style round_style = round_toward_zero; + + static Type min() { + return static_cast(0); + } + + static Type max() { + return static_cast(0); + } + + static Type epsilon() { + return static_cast(0); + } + + static Type round_error() { + return static_cast(0); + } + + static Type infinity() { + return static_cast(0); + } + + static Type quiet_NaN() { + return static_cast(0); + } + + static Type denorm_min() { + return static_cast(1); + } +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specialization of std::numeric_limits. +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template <> +class numeric_limits { +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 tininess_before = false; + static const float_round_style round_style = round_toward_zero; + + static Type min() { + return static_cast(0); + } + + static Type max() { + return static_cast(0); + } + + static Type epsilon() { + return static_cast(0); + } + + static Type round_error() { + return static_cast(0); + } + + static Type infinity() { + return static_cast(0); + } + + static Type quiet_NaN() { + return static_cast(0); + } + + static Type denorm_min() { + return static_cast(0); + } +}; + +} // namespace std + +/* 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. This will become obsolete when GMP and MPFR + will provide the specializations by themselves. +*/ + + +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 168. */ + +/* 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 + +namespace Parma_Polyhedra_Library { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \brief + Declares a per-class constant of type bool, 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 { name = (value) } + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \brief + Declares a per-class constant of type int, 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 { 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 name(). + + \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 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 name(). + + \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& name() { \ + static type name(value); \ + return name; \ + } + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \brief + A class that is only defined if \p b evaluates to true. + + \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 +struct Compile_Time_Check; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \brief + A class that is only defined if \p b evaluates to true. + + \ingroup PPL_CXX_interface + This is the specialized case with \p b equal to true, + so the class is declared and (trivially) defined. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template <> +struct Compile_Time_Check { +}; + +#define PPL_COMPILE_TIME_CHECK_NAME(suffix) compile_time_check_ ## suffix +#define PPL_COMPILE_TIME_CHECK_AUX(e, suffix) \ + enum { \ + /* 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 true + \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 value that evaluates + to \p b. + \ingroup PPL_CXX_interface +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +struct Bool { + enum { + value = b + }; +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \brief + A class holding a constant called value that evaluates + to true. + \ingroup PPL_CXX_interface +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +struct True : public Bool { +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \brief + A class holding a constant called value that evaluates + to false. + \ingroup PPL_CXX_interface +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +struct False : public Bool { +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \brief + A class holding a constant called value that evaluates + to true 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 +struct Is_Same : public False { +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \brief + A class holding a constant called value that evaluates + to true 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 +struct Is_Same : public True { +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \brief + A class holding a constant called value that evaluates + to true 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 struct B; + template struct D : public B; + \endcode + Of course, we cannot test if, for some type variable U, + we have Is_Same_Or_Derived, Type>::value == true. + But we can do as follows: + \code + struct B_Base { + }; + + template struct B : public B_Base; + \endcode + This enables us to enquire + Is_Same_Or_Derived::value. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +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 + 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 { + /*! + Assuming sizeof(char) != sizeof(double), the C++ + overload resolution mechanism guarantees that \p value evaluates + to true if and only if \p Base is the same type + as \p Derived or \p Derived is a class derived from \p Base. + */ + value = (sizeof(func(derived_object())) == sizeof(char)) + }; +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \brief + A class that provides a type member called type equivalent + to \p T if and only if \p b is true. + + \ingroup PPL_CXX_interface + This is the non-specialized case, in which the type member + is not present. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +struct Enable_If { +}; + +template +struct Enable_If_Is { + typedef T type; +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \brief + A class that provides a type member called type equivalent + to \p T if and only if \p b is true. + + \ingroup PPL_CXX_interface + This is the specialization in which the type member + is present. + + \note + Let T, T1 and T2 be any type + expressions and suppose we have some template function + T f(T1, T2). 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::type + foo(T1 x, T2 y); + \endcode + For all the instantiations of the template parameters that cause + condition to evaluate to false, + the Enable_If::type member will not be defined. + Hence, for that instantiations, the specialization will not be eligible. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +struct Enable_If { + typedef T type; +}; + +template +struct Is_Native : public False { +}; + +template <> struct Is_Native : public True { }; +template <> struct Is_Native : public True { }; +template <> struct Is_Native : public True { }; +template <> struct Is_Native : public True { }; +template <> struct Is_Native : public True { }; +template <> struct Is_Native : public True { }; +template <> struct Is_Native : public True { }; +template <> struct Is_Native : public True { }; +template <> struct Is_Native : public True { }; +template <> struct Is_Native : public True { }; + +#if PPL_SUPPORTED_FLOAT +template <> struct Is_Native : public True { }; +#endif +#if PPL_SUPPORTED_DOUBLE +template <> struct Is_Native : public True { }; +#endif +#if PPL_SUPPORTED_LONG_DOUBLE +template <> struct Is_Native : public True { }; +#endif + +template <> struct Is_Native : public True { }; + +template <> struct Is_Native : 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 27. */ +#include + +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 +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 : 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 : public True { +}; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Temp.defs.hh line 28. */ + +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 +class Temp_Item { +public: + //! Obtains a refeence 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 +class Temp_Reference_Holder { +public: + //! Constructs an holder holding \p p. + Temp_Reference_Holder(Temp_Item& p); + + //! Destructor. + ~Temp_Reference_Holder(); + + //! Returns a reference to the held item. + T& item(); + +private: + //! The held item, encapsulated. + Temp_Item& 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 +class Temp_Value_Holder { +public: + //! Constructs a fake holder. + Temp_Value_Holder(); + + //! Returns the value of the held item. + T item(); + +private: + //! The held item. + T item_; +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! A structure for handling temporaries with a global free list. +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +struct Temp_From_Free_List { + //! The type of the temporaries. + typedef T& type; + + //! The type of the holder. + typedef Temp_Reference_Holder holder_type; + + //! Obtain the holder for a new temporary. + static holder_type obtain_holder(); +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! A structure for handling temporaries with local variables. +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +struct Temp_From_Local_Variable { + //! The type of the temporaries. + typedef T type; + + //! The type of the holder. + typedef Temp_Value_Holder holder_type; + + //! Obtain the holder for a new temporary. + static holder_type obtain_holder(); +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! A structure for the efficient handling of temporaries. +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +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 +class Dirty_Temp::value>::type> + : public Temp_From_Free_List { +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specialization for the handling of temporaries with local variables. +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +class Dirty_Temp::value>::type> + : public Temp_From_Local_Variable { +}; + +} // 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 27. */ + +namespace Parma_Polyhedra_Library { + +template +inline +Temp_Item::Temp_Item() + : item_() { +} + +template +inline T& +Temp_Item::item() { + return item_; +} + +template +inline Temp_Item& +Temp_Item::obtain() { + if (free_list_head != 0) { + Temp_Item* p = free_list_head; + free_list_head = free_list_head->next; + return *p; + } + else + return *new Temp_Item(); +} + +template +inline void +Temp_Item::release(Temp_Item& p) { + p.next = free_list_head; + free_list_head = &p; +} + +template +inline +Temp_Reference_Holder::Temp_Reference_Holder(Temp_Item& p) + : held(p) { +} + +template +inline +Temp_Reference_Holder::~Temp_Reference_Holder() { + Temp_Item::release(held); +} + +template +inline T& +Temp_Reference_Holder::item() { + return held.item(); +} + +template +inline +Temp_Value_Holder::Temp_Value_Holder() { +} + +template +inline T +Temp_Value_Holder::item() { + return item_; +} + +template +inline typename Temp_From_Free_List::holder_type +Temp_From_Free_List::obtain_holder() { + return Temp_Reference_Holder(Temp_Item::obtain()); +} + +template +inline typename Temp_From_Local_Variable::holder_type +Temp_From_Local_Variable::obtain_holder() { + return Temp_Value_Holder(); +} + +} // namespace Parma_Polyhedra_Library + +#define PPL_DIRTY_TEMP(T, id) \ + typename Parma_Polyhedra_Library::Dirty_Temp::holder_type holder ## id = \ + Parma_Polyhedra_Library::Dirty_Temp::obtain_holder(); \ + typename Parma_Polyhedra_Library::Dirty_Temp::type id = \ + holder ## id.item() + +#define PPL_DIRTY_TEMP0(T, id) \ + Parma_Polyhedra_Library::Dirty_Temp::holder_type holder ## id = \ + Parma_Polyhedra_Library::Dirty_Temp::obtain_holder(); \ + Parma_Polyhedra_Library::Dirty_Temp::type 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 +Temp_Item* Temp_Item::free_list_head = 0; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Temp.defs.hh line 159. */ + +/* Automatically generated from PPL source file ../src/Numeric_Format.defs.hh line 1. */ +/* Numeric format. +*/ + + +/* Automatically generated from PPL source file ../src/Numeric_Format.defs.hh line 28. */ + +namespace Parma_Polyhedra_Library { + +class Numeric_Format { +}; + +} // namespace Parma_Polyhedra_Library + + +/* Automatically generated from PPL source file ../src/Float.defs.hh line 1. */ +/* IEC 559 floating point format related functions. +*/ + + +/* Automatically generated from PPL source file ../src/Float.defs.hh line 28. */ +#include +#include +#include + +#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_single { + uint32_t word; + static const uint32_t SGN_MASK = 0x80000000; + static const uint32_t EXP_MASK = 0x7f800000; + static const uint32_t POS_INF = 0x7f800000; + static const uint32_t NEG_INF = 0xff800000; + static const uint32_t POS_ZERO = 0x00000000; + static const uint32_t NEG_ZERO = 0x80000000; + static const unsigned int EXPONENT_BITS = 8; + static const unsigned int MANTISSA_BITS = 23; + static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1; + static const int EXPONENT_BIAS = EXPONENT_MAX; + static const int EXPONENT_MIN = -EXPONENT_MAX + 1; + static const int EXPONENT_MIN_DENORM = EXPONENT_MIN + - static_cast(MANTISSA_BITS); + int is_inf() const; + int is_nan() const; + int is_zero() const; + int sign_bit() const; + void negate(); + void dec(); + void inc(); + void set_max(bool negative); + void build(bool negative, mpz_t mantissa, int exponent); +}; + +#ifdef 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 = 0x80000000; + static const uint32_t MSP_POS_INF = 0x7ff00000; + static const uint32_t MSP_NEG_INF = 0xfff00000; + static const uint32_t MSP_POS_ZERO = 0x00000000; + static const uint32_t MSP_NEG_ZERO = 0x80000000; + static const uint32_t LSP_INF = 0; + static const uint32_t LSP_ZERO = 0; + static const uint32_t LSP_MAX = 0xffffffff; + static const unsigned int EXPONENT_BITS = 11; + static const unsigned int MANTISSA_BITS = 52; + static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1; + static const int EXPONENT_BIAS = EXPONENT_MAX; + static const int EXPONENT_MIN = -EXPONENT_MAX + 1; + static const int EXPONENT_MIN_DENORM = EXPONENT_MIN + - static_cast(MANTISSA_BITS); + int is_inf() const; + int is_nan() const; + int is_zero() const; + int sign_bit() const; + void negate(); + void dec(); + void inc(); + void set_max(bool negative); + void build(bool negative, mpz_t mantissa, int exponent); +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \ingroup PPL_CXX_interface */ +#endif // 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 = 0x00008000; + static const uint32_t MSP_POS_INF = 0x00007fff; + static const uint32_t MSP_NEG_INF = 0x0000ffff; + static const uint32_t MSP_POS_ZERO = 0x00000000; + static const uint32_t MSP_NEG_ZERO = 0x00008000; + static const uint64_t LSP_INF = 0x8000000000000000ULL; + static const uint64_t LSP_ZERO = 0; + static const uint64_t LSP_DMAX = 0x7fffffffffffffffULL; + static const uint64_t LSP_NMAX = 0xffffffffffffffffULL; + static const unsigned int EXPONENT_BITS = 15; + static const unsigned int MANTISSA_BITS = 63; + static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1; + static const int EXPONENT_BIAS = EXPONENT_MAX; + static const int EXPONENT_MIN = -EXPONENT_MAX + 1; + static const int EXPONENT_MIN_DENORM = EXPONENT_MIN + - static_cast(MANTISSA_BITS); + int is_inf() const; + int is_nan() const; + int is_zero() const; + int sign_bit() const; + void negate(); + void dec(); + void inc(); + void set_max(bool negative); + void build(bool negative, mpz_t mantissa, int exponent); +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \ingroup PPL_CXX_interface */ +#endif // 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 = 0x8000000000000000ULL; + static const uint64_t MSP_POS_INF = 0x7fff000000000000ULL; + static const uint64_t MSP_NEG_INF = 0xffff000000000000ULL; + static const uint64_t MSP_POS_ZERO = 0x0000000000000000ULL; + static const uint64_t MSP_NEG_ZERO = 0x8000000000000000ULL; + static const uint64_t LSP_INF = 0; + static const uint64_t LSP_ZERO = 0; + static const uint64_t LSP_MAX = 0xffffffffffffffffULL; + static const unsigned int EXPONENT_BITS = 15; + static const unsigned int MANTISSA_BITS = 112; + static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1; + static const int EXPONENT_BIAS = EXPONENT_MAX; + static const int EXPONENT_MIN = -EXPONENT_MAX + 1; + static const int EXPONENT_MIN_DENORM = EXPONENT_MIN + - static_cast(MANTISSA_BITS); + int is_inf() const; + int is_nan() const; + int is_zero() const; + int sign_bit() const; + void negate(); + void dec(); + void inc(); + void set_max(bool negative); + void build(bool negative, mpz_t mantissa, int exponent); +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +class Float : public False { }; + +#if PPL_SUPPORTED_FLOAT +template <> +class Float : public True { +public: +#if 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_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 : public True { +public: +#if 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_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 : public True { +public: +#if 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_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 + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Float.inlines.hh line 1. */ +/* IEC 559 floating point format related functions. +*/ + + +#include + +namespace Parma_Polyhedra_Library { + +inline int +float_ieee754_single::is_inf() const { + if (word == NEG_INF) + return -1; + if (word == POS_INF) + return 1; + return 0; +} + +inline int +float_ieee754_single::is_nan() const { + return (word & ~SGN_MASK) > POS_INF; +} + +inline int +float_ieee754_single::is_zero() const { + if (word == NEG_ZERO) + return -1; + if (word == POS_ZERO) + return 1; + return 0; +} + +inline void +float_ieee754_single::negate() { + word ^= SGN_MASK; +} + +inline int +float_ieee754_single::sign_bit() const { + return !!(word & SGN_MASK); +} + +inline void +float_ieee754_single::dec() { + --word; +} + +inline void +float_ieee754_single::inc() { + ++word; +} + +inline void +float_ieee754_single::set_max(bool negative) { + word = 0x7f7fffff; + if (negative) + word |= SGN_MASK; +} + +inline void +float_ieee754_single::build(bool negative, mpz_t mantissa, int exponent) { + word = mpz_get_ui(mantissa) & ((1UL << MANTISSA_BITS) - 1); + if (negative) + word |= SGN_MASK; + word |= static_cast(exponent + EXPONENT_BIAS) << MANTISSA_BITS; +} + +inline int +float_ieee754_double::is_inf() const { + if (lsp != LSP_INF) + return 0; + if (msp == MSP_NEG_INF) + return -1; + if (msp == MSP_POS_INF) + return 1; + return 0; +} + +inline int +float_ieee754_double::is_nan() const { + uint32_t a = msp & ~MSP_SGN_MASK; + return a > MSP_POS_INF || (a == MSP_POS_INF && lsp != LSP_INF); +} + +inline int +float_ieee754_double::is_zero() const { + if (lsp != LSP_ZERO) + return 0; + if (msp == MSP_NEG_ZERO) + return -1; + if (msp == MSP_POS_ZERO) + return 1; + return 0; +} + +inline void +float_ieee754_double::negate() { + msp ^= MSP_SGN_MASK; +} + +inline int +float_ieee754_double::sign_bit() const { + return !!(msp & MSP_SGN_MASK); +} + +inline void +float_ieee754_double::dec() { + if (lsp == 0) { + --msp; + lsp = LSP_MAX; + } + else + --lsp; +} + +inline void +float_ieee754_double::inc() { + if (lsp == LSP_MAX) { + ++msp; + lsp = 0; + } + else + ++lsp; +} + +inline void +float_ieee754_double::set_max(bool negative) { + msp = 0x7fefffff; + lsp = 0xffffffff; + if (negative) + msp |= MSP_SGN_MASK; +} + +inline void +float_ieee754_double::build(bool negative, mpz_t mantissa, int exponent) { +#if ULONG_MAX == 0xffffffffUL + lsp = mpz_get_ui(mantissa); + mpz_tdiv_q_2exp(mantissa, mantissa, 32); + unsigned long m = mpz_get_ui(mantissa); +#else + unsigned long m = mpz_get_ui(mantissa); + lsp = m; + m >>= 32; +#endif + msp = m & ((1UL << (MANTISSA_BITS - 32)) - 1); + if (negative) + msp |= MSP_SGN_MASK; + msp |= static_cast(exponent + EXPONENT_BIAS) + << (MANTISSA_BITS - 32); +} + +inline int +float_intel_double_extended::is_inf() const { + if (lsp != LSP_INF) + return 0; + uint32_t a = msp & MSP_NEG_INF; + if (a == MSP_NEG_INF) + return -1; + if (a == MSP_POS_INF) + return 1; + return 0; +} + +inline int +float_intel_double_extended::is_nan() const { + return (msp & MSP_POS_INF) == MSP_POS_INF + && lsp != LSP_INF; +} + +inline int +float_intel_double_extended::is_zero() const { + if (lsp != LSP_ZERO) + return 0; + uint32_t a = msp & MSP_NEG_INF; + if (a == MSP_NEG_ZERO) + return -1; + if (a == MSP_POS_ZERO) + return 1; + return 0; +} + +inline void +float_intel_double_extended::negate() { + msp ^= MSP_SGN_MASK; +} + +inline int +float_intel_double_extended::sign_bit() const { + return !!(msp & MSP_SGN_MASK); +} + +inline void +float_intel_double_extended::dec() { + if ((lsp & LSP_DMAX) == 0) { + --msp; + lsp = (msp & MSP_NEG_INF) == 0 ? LSP_DMAX : LSP_NMAX; + } + else + --lsp; +} + +inline void +float_intel_double_extended::inc() { + if ((lsp & LSP_DMAX) == LSP_DMAX) { + ++msp; + lsp = LSP_DMAX + 1; + } + else + ++lsp; +} + +inline void +float_intel_double_extended::set_max(bool negative) { + msp = 0x00007ffe; + lsp = 0xffffffffffffffffULL; + if (negative) + msp |= MSP_SGN_MASK; +} + +inline void +float_intel_double_extended::build(bool negative, + mpz_t mantissa, int exponent) { +#if ULONG_MAX == 0xffffffffUL + mpz_export(&lsp, 0, -1, 8, 0, 0, mantissa); +#else + lsp = mpz_get_ui(mantissa); +#endif + msp = (negative ? MSP_SGN_MASK : 0); + msp |= static_cast(exponent + EXPONENT_BIAS); +} + +inline int +float_ieee754_quad::is_inf() const { + if (lsp != LSP_INF) + return 0; + if (msp == MSP_NEG_INF) + return -1; + if (msp == MSP_POS_INF) + return 1; + return 0; +} + +inline int +float_ieee754_quad::is_nan() const { + return (msp & ~MSP_SGN_MASK) == MSP_POS_INF + && lsp != LSP_INF; +} + +inline int +float_ieee754_quad::is_zero() const { + if (lsp != LSP_ZERO) + return 0; + if (msp == MSP_NEG_ZERO) + return -1; + if (msp == MSP_POS_ZERO) + return 1; + return 0; +} + +inline void +float_ieee754_quad::negate() { + msp ^= MSP_SGN_MASK; +} + +inline int +float_ieee754_quad::sign_bit() const { + return !!(msp & MSP_SGN_MASK); +} + +inline void +float_ieee754_quad::dec() { + if (lsp == 0) { + --msp; + lsp = LSP_MAX; + } + else + --lsp; +} + +inline void +float_ieee754_quad::inc() { + if (lsp == LSP_MAX) { + ++msp; + lsp = 0; + } + else + ++lsp; +} + +inline void +float_ieee754_quad::set_max(bool negative) { + msp = 0x7ffeffffffffffffULL; + lsp = 0xffffffffffffffffULL; + if (negative) + msp |= MSP_SGN_MASK; +} + +inline void +float_ieee754_quad::build(bool negative, mpz_t mantissa, int exponent) { + uint64_t parts[2]; + mpz_export(parts, 0, -1, 8, 0, 0, mantissa); + lsp = parts[0]; + msp = parts[1]; + msp &= ((1ULL << (MANTISSA_BITS - 64)) - 1); + if (negative) + msp |= MSP_SGN_MASK; + msp |= static_cast(exponent + EXPONENT_BIAS) + << (MANTISSA_BITS - 64); +} + +#if PPL_SUPPORTED_FLOAT +inline +Float::Float() { +} + +inline +Float::Float(float v) { + u.number = v; +} + +inline float +Float::value() { + return u.number; +} +#endif + +#if PPL_SUPPORTED_DOUBLE +inline +Float::Float() { +} + +inline +Float::Float(double v) { + u.number = v; +} + +inline double +Float::value() { + return u.number; +} +#endif + +#if PPL_SUPPORTED_LONG_DOUBLE +inline +Float::Float() { +} + +inline +Float::Float(long double v) { + u.number = v; +} + +inline long double +Float::value() { + return u.number; +} +#endif + + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Float.defs.hh line 275. */ + +/* Automatically generated from PPL source file ../src/checked.defs.hh line 33. */ + +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 \ + struct PPL_FUNCTION_CLASS(name); \ + template \ + inline ret_type name(qual type& arg) { \ + return PPL_FUNCTION_CLASS(name)::function(arg); \ +} + +#define PPL_DECLARE_FUN1_0_1(name, ret_type, qual, type, after1) \ + template \ + struct PPL_FUNCTION_CLASS(name); \ + template \ + inline ret_type name(qual type& arg, after1 a1) { \ + return PPL_FUNCTION_CLASS(name)::function(arg, a1); \ + } + +#define PPL_DECLARE_FUN1_0_2(name, ret_type, qual, type, after1, after2) \ + template \ + struct PPL_FUNCTION_CLASS(name); \ + template \ + inline ret_type name(qual type& arg, after1 a1, after2 a2) { \ + return PPL_FUNCTION_CLASS(name)::function(arg, a1, a2); \ + } + +#define PPL_DECLARE_FUN1_0_3(name, ret_type, qual, type, \ + after1, after2, after3) \ + template \ + struct PPL_FUNCTION_CLASS(name); \ + template \ + inline ret_type name(qual type& arg, \ + after1 a1, after2 a2, after3 a3) { \ + return PPL_FUNCTION_CLASS(name)::function(arg, \ + a1, a2, a3); \ + } + +#define PPL_DECLARE_FUN1_1_1(name, ret_type, before1, qual, type, after1) \ + template \ + struct PPL_FUNCTION_CLASS(name); \ + template \ + inline ret_type name(before1 b1, qual type& arg, after1 a1) { \ + return PPL_FUNCTION_CLASS(name)::function(b1, arg, a1); \ + } + +#define PPL_DECLARE_FUN1_1_2(name, ret_type, before1, qual, type, \ + after1, after2) \ + template \ + struct PPL_FUNCTION_CLASS(name); \ + template \ + inline ret_type name(before1 b1, qual type& arg, \ + after1 a1, after2 a2) { \ + return PPL_FUNCTION_CLASS(name)::function(b1, arg, \ + a1, a2); \ + } + +#define PPL_DECLARE_FUN1_2_2(name, ret_type, before1, before2, qual, type, \ + after1, after2) \ + template \ + struct PPL_FUNCTION_CLASS(name); \ + template \ + inline ret_type name(before1 b1, before2 b2, qual type& arg, \ + after1 a1, after2 a2) { \ + return PPL_FUNCTION_CLASS(name)::function(b1, b2, arg, \ + a1, a2); \ + } + +#define PPL_DECLARE_FUN2_0_0(name, ret_type, qual1, type1, qual2, type2) \ + template \ + struct PPL_FUNCTION_CLASS(name); \ + template \ + inline ret_type name(qual1 type1& arg1, qual2 type2& arg2) { \ + return PPL_FUNCTION_CLASS(name)::function(arg1, arg2); \ + } + +#define PPL_DECLARE_FUN2_0_1(name, ret_type, qual1, type1, \ + qual2, type2, after1) \ + template \ + struct PPL_FUNCTION_CLASS(name); \ + template \ + inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, \ + after1 a1) { \ + return PPL_FUNCTION_CLASS(name)::function(arg1, arg2, a1); \ + } + +#define PPL_DECLARE_FUN2_0_2(name, ret_type, qual1, type1, qual2, type2, \ + after1, after2) \ + template \ + struct PPL_FUNCTION_CLASS(name); \ + template \ + inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, \ + after1 a1, after2 a2) { \ + return PPL_FUNCTION_CLASS(name)::function(arg1, arg2, a1, a2); \ + } + +#define PPL_DECLARE_FUN3_0_1(name, ret_type, qual1, type1, \ + qual2, type2, qual3, type3, after1) \ + template \ + struct PPL_FUNCTION_CLASS(name); \ + template \ + inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, \ + qual3 type3& arg3, after1 a1) { \ + return PPL_FUNCTION_CLASS(name)::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 \ + struct PPL_FUNCTION_CLASS(name); \ + template \ + inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, \ + qual3 type3& arg3, qual4 type4& arg4, \ + qual5 type5& arg5, after1 a1) { \ + return PPL_FUNCTION_CLASS(name) \ + ::function(arg1, arg2, arg3, arg4, arg5, a1); \ + } + +#define PPL_SPECIALIZE_FUN1_0_0(name, func, ret_type, qual, type) \ + template \ + struct PPL_FUNCTION_CLASS(name) { \ + static inline ret_type function(qual type& arg) { \ + return func(arg); \ + } \ + }; + +#define PPL_SPECIALIZE_FUN1_0_1(name, func, ret_type, qual, type, after1) \ + template \ + struct PPL_FUNCTION_CLASS(name) { \ + static inline ret_type function(qual type& arg, after1 a1) { \ + return func(arg, a1); \ + } \ + }; + +#define PPL_SPECIALIZE_FUN1_0_2(name, func, ret_type, qual, type, \ + after1, after2) \ + template \ + struct PPL_FUNCTION_CLASS(name) { \ + static inline ret_type function(qual type& arg, \ + after1 a1, after2 a2) { \ + return func(arg, a1, a2); \ + } \ + }; + +#define PPL_SPECIALIZE_FUN1_0_3(name, func, ret_type, qual, type, \ + after1, after2, after3) \ + template \ + struct PPL_FUNCTION_CLASS(name) { \ + static inline ret_type function(qual type& arg, \ + after1 a1, after2 a2, after3 a3) { \ + return func(arg, a1, a2, a3); \ + } \ + }; + +#define PPL_SPECIALIZE_FUN1_1_1(name, func, ret_type, before1, \ + qual, type, after1) \ + template \ + struct PPL_FUNCTION_CLASS(name) { \ + static inline ret_type function(before1 b1, qual type& arg, \ + after1 a1) { \ + return func(b1, arg, a1); \ + } \ + }; + +#define PPL_SPECIALIZE_FUN1_1_2(name, func, ret_type, before1, \ + qual, type, after1, after2) \ + template \ + struct PPL_FUNCTION_CLASS(name) { \ + static inline ret_type function(before1 b1, qual type& arg, \ + after1 a1, after2 a2) { \ + return func(b1, arg, a1, a2); \ + } \ + }; + +#define PPL_SPECIALIZE_FUN1_2_2(name, func, ret_type, before1, before2, \ + qual, type, after1, after2) \ + template \ + struct PPL_FUNCTION_CLASS(name) { \ + static inline ret_type function(before1 b1, before2 b2, \ + qual type& arg, \ + after1 a1, after2 a2) { \ + return func(b1, b2, arg, a1, a2); \ + } \ + }; + +#define PPL_SPECIALIZE_FUN2_0_0(name, func, ret_type, qual1, type1, \ + qual2, type2) \ + template \ + struct PPL_FUNCTION_CLASS(name) { \ + static inline ret_type function(qual1 type1& arg1, \ + qual2 type2 &arg2) { \ + return func(arg1, arg2); \ + } \ + }; + +#define PPL_SPECIALIZE_FUN2_0_1(name, func, ret_type, qual1, type1, \ + qual2, type2, after1) \ + template \ + struct PPL_FUNCTION_CLASS(name) { \ + static inline ret_type function(qual1 type1& arg1, \ + qual2 type2 &arg2, after1 a1) { \ + return func(arg1, arg2, a1); \ + } \ + }; + +#define PPL_SPECIALIZE_FUN2_0_2(name, func, ret_type, qual1, type1, \ + qual2, type2, after1, after2) \ + template \ + struct PPL_FUNCTION_CLASS(name) { \ + static inline ret_type function(qual1 type1& arg1, \ + qual2 type2 &arg2, \ + after1 a1, after2 a2) { \ + return func(arg1, arg2, a1, a2); \ + } \ + }; + +#define PPL_SPECIALIZE_FUN3_0_1(name, func, ret_type, qual1, type1, \ + qual2, type2, qual3, type3, after1) \ + template \ + struct PPL_FUNCTION_CLASS(name) { \ + static inline Result function(qual1 type1& arg1, qual2 type2 &arg2, \ + qual3 type3 &arg3, after1 a1) { \ + return func(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 \ + struct PPL_FUNCTION_CLASS(name) { \ + static inline Result \ + function(qual1 type1& arg1, qual2 type2 &arg2, qual3 type3 &arg3, \ + qual4 type4 &arg4, qual5 type5 &arg5, after1 a1) { \ + return func(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, const, From) +#define PPL_SPECIALIZE_CMP(func, Type1, Type2) \ + PPL_SPECIALIZE_FUN2_0_0(cmp, func, Result, 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, Rounding_Dir) +#define PPL_SPECIALIZE_CONSTRUCT_SPECIAL(func, Type) \ + PPL_SPECIALIZE_FUN1_0_2(construct_special, func, Result, nonconst, \ + Type, Result, 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_MUL2EXP(func, To, From) \ + PPL_SPECIALIZE_FUN2_0_2(mul2exp, func, Result, nonconst, To, \ + const, From, int, Rounding_Dir) +#define PPL_SPECIALIZE_DIV2EXP(func, To, From) \ + PPL_SPECIALIZE_FUN2_0_2(div2exp, func, Result, nonconst, To, \ + const, From, 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, const, From) +PPL_DECLARE_FUN2_0_0(cmp, + Result, 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, Rounding_Dir) +PPL_DECLARE_FUN1_0_2(construct_special, + Result, nonconst, Type, Result, 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(mul2exp, + Result, nonconst, To, const, From, int, Rounding_Dir) +PPL_DECLARE_FUN2_0_2(div2exp, + Result, nonconst, To, const, From, 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 +Result round(To& to, Result r, Rounding_Dir dir); + +Result input_mpq(mpq_class& to, std::istream& is); + +} // namespace Checked + +struct Minus_Infinity { + static const Result code = VC_MINUS_INFINITY; +}; +struct Plus_Infinity { + static const Result code = VC_PLUS_INFINITY; +}; +struct Not_A_Number { + static const Result code = VC_NAN; +}; + +template +struct Is_Special : public False { }; + +template <> +struct Is_Special : public True {}; + +template <> +struct Is_Special : public True {}; + +template <> +struct Is_Special : public True {}; + + +#define MINUS_INFINITY Minus_Infinity() +#define PLUS_INFINITY Plus_Infinity() +#define NOT_A_NUMBER Not_A_Number() + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +struct Checked_Number_Transparent_Policy { + //! Checks for overflowed result. + const_bool_nodef(check_overflow, false); + + //! Checks for attempts to add infinities with different sign. + const_bool_nodef(check_inf_add_inf, false); + + //! Checks for attempts to subtract infinities with same sign. + const_bool_nodef(check_inf_sub_inf, false); + + //! Checks for attempts to multiply infinities by zero. + const_bool_nodef(check_inf_mul_zero, false); + + //! Checks for attempts to divide by zero. + const_bool_nodef(check_div_zero, false); + + //! Checks for attempts to divide infinities. + const_bool_nodef(check_inf_div_inf, false); + + //! Checks for attempts to compute remainder of infinities. + const_bool_nodef(check_inf_mod, false); + + //! Checks for attempts to take the square root of a negative number. + const_bool_nodef(check_sqrt_neg, false); + + //! Handles not-a-number special value. + const_bool_nodef(has_nan, std::numeric_limits::has_quiet_NaN); + + //! Handles infinity special values. + const_bool_nodef(has_infinity, std::numeric_limits::has_infinity); + + //! Representation is identical to primitive. + const_bool_nodef(convertible, true); + + //! When true, requests to check for FPU inexact result are honored. + const_bool_nodef(fpu_check_inexact, false); + + //! Return VC_NAN on NaN result also for native extended. + const_bool_nodef(check_nan_result, false); + static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE; + static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE; + static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE; + static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_NATIVE; + static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_NATIVE; + static void handle_result(Result r); +}; + +} // namespace Parma_Polyhedra_Library + +#define CHECK_P(cond, check) ((cond) ? (check) : (assert(!(check)), false)) + +/* Automatically generated from PPL source file ../src/checked.inlines.hh line 1. */ +/* Abstract checked arithmetic functions: fall-backs. +*/ + + +/* Automatically generated from PPL source file ../src/globals.types.hh line 1. */ + + +#include + +namespace Parma_Polyhedra_Library { + +//! An unsigned integral type for representing space dimensions. +/*! \ingroup PPL_CXX_interface */ +typedef size_t dimension_type; + +//! An unsigned integral type for representing memory size in bytes. +/*! \ingroup PPL_CXX_interface */ +typedef size_t memory_size_type; + +//! Kinds of degenerate abstract elements. +/*! \ingroup PPL_CXX_interface */ +enum Degenerate_Element { + //! The universe element, i.e., the whole vector space. + UNIVERSE, + //! The empty element, i.e., the empty set. + EMPTY +}; + +//! Relation symbols. +/*! \ingroup PPL_CXX_interface */ +enum Relation_Symbol { + //! Less than. + LESS_THAN, + //! Less than or equal to. + LESS_OR_EQUAL, + //! Equal to. + EQUAL, + //! Greater than or equal to. + GREATER_OR_EQUAL, + //! Greater than. + GREATER_THAN, + //! Not equal to. + NOT_EQUAL +}; + +//! Complexity pseudo-classes. +/*! \ingroup PPL_CXX_interface */ +enum Complexity_Class { + //! Worst-case polynomial complexity. + POLYNOMIAL_COMPLEXITY, + //! Worst-case exponential complexity but typically polynomial behavior. + SIMPLEX_COMPLEXITY, + //! Any complexity. + ANY_COMPLEXITY +}; + +//! Possible optimization modes. +/*! \ingroup PPL_CXX_interface */ +enum Optimization_Mode { + //! Minimization is requested. + MINIMIZATION, + //! Maximization is requested. + MAXIMIZATION +}; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/C_Integer.hh line 1. */ +/* C integers info. +*/ + + +/* Automatically generated from PPL source file ../src/C_Integer.hh line 27. */ +#include + +// 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 +struct C_Integer : public False { }; + +template <> +struct C_Integer : public True { + enum { 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 = SCHAR_MIN; + static const signed char max = SCHAR_MAX; +}; + +template <> +struct C_Integer : public True { + enum { 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 = SHRT_MIN; + static const signed short max = SHRT_MAX; +}; + +template <> +struct C_Integer : public True { + enum { 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 : public True { + enum { 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 : public True { + enum { 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 : public True { + enum { 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 = 0; + static const unsigned char max = UCHAR_MAX; +}; + +template <> +struct C_Integer : public True { + enum { 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 = 0; + static const unsigned short max = USHRT_MAX; +}; + +template <> +struct C_Integer : public True { + enum { 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 = 0; + static const unsigned int max = UINT_MAX; +}; + +template <> +struct C_Integer : public True { + enum { 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 = 0; + static const unsigned long max = ULONG_MAX; +}; + +template <> +struct C_Integer : public True { + enum { 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 = 0; + static const unsigned long long max = ULLONG_MAX; +}; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/checked.inlines.hh line 29. */ +#include + +namespace Parma_Polyhedra_Library { + +namespace Checked { + +template +struct Safe_Conversion : public False { +}; +template +struct Safe_Conversion : public True { +}; + +#define PPL_SAFE_CONVERSION(To, From) \ + template <> struct Safe_Conversion : public True { } + +PPL_SAFE_CONVERSION(signed short, signed char); +#if PPL_SIZEOF_CHAR < PPL_SIZEOF_SHORT +PPL_SAFE_CONVERSION(signed short, unsigned char); +#endif + +PPL_SAFE_CONVERSION(signed int, signed char); +PPL_SAFE_CONVERSION(signed int, signed short); +#if PPL_SIZEOF_CHAR < PPL_SIZEOF_INT +PPL_SAFE_CONVERSION(signed int, unsigned char); +#endif +#if PPL_SIZEOF_SHORT < PPL_SIZEOF_INT +PPL_SAFE_CONVERSION(signed int, unsigned short); +#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 +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 + +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 +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 + +PPL_SAFE_CONVERSION(unsigned short, unsigned char); + +PPL_SAFE_CONVERSION(unsigned int, unsigned char); +PPL_SAFE_CONVERSION(unsigned int, unsigned short); + +PPL_SAFE_CONVERSION(unsigned long, unsigned char); +PPL_SAFE_CONVERSION(unsigned long, unsigned short); +PPL_SAFE_CONVERSION(unsigned long, unsigned int); + +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, 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, 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, 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, signed char); +PPL_SAFE_CONVERSION(mpz_class, signed short); +PPL_SAFE_CONVERSION(mpz_class, signed int); +PPL_SAFE_CONVERSION(mpz_class, signed long); +//PPL_SAFE_CONVERSION(mpz_class, 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); +//PPL_SAFE_CONVERSION(mpz_class, unsigned long long); + +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); +//PPL_SAFE_CONVERSION(mpq_class, 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); +//PPL_SAFE_CONVERSION(mpq_class, unsigned long long); +PPL_SAFE_CONVERSION(mpq_class, float); +PPL_SAFE_CONVERSION(mpq_class, double); +//PPL_SAFE_CONVERSION(mpq_class, long double); + +#undef PPL_SAFE_CONVERSION + +template +struct PPL_FUNCTION_CLASS(construct) { + static inline Result function(Type& to, const Type& from, Rounding_Dir) { + new (&to) Type(from); + return V_EQ; + } +}; + +template +struct PPL_FUNCTION_CLASS(construct) { + static inline Result function(To& to, const From& from, Rounding_Dir dir) { + new (&to) To(); + return assign(to, from, dir); + } +}; + +template +struct PPL_FUNCTION_CLASS(construct_special) { + static inline Result function(To& to, Result r, Rounding_Dir dir) { + new (&to) To(); + return assign_special(to, r, dir); + } +}; + +template +inline Result +assign_exact(To& to, const From& from, Rounding_Dir) { + to = from; + return V_EQ; +} + +template +inline typename Enable_If::value, void>::type +copy_generic(Type& to, const Type& from) { + to = from; +} + +template +inline Result +abs_generic(To& to, const From& from, Rounding_Dir dir) { + if (from < 0) + return neg(to, from, dir); + else + return assign(to, from, dir); +} + +inline Result +neg(Result r) { + assert(!is_special(r)); + Result ret = static_cast(r & V_EQ); + if (r & V_LT) + ret = static_cast(ret | V_GT); + if (r & V_GT) + ret = static_cast(ret | V_LT); + return ret; +} + +inline Result +add(Result r1, Result r2) { + assert(!is_special(r1)); + assert(!is_special(r2)); + if (r1 == V_EQ) + return r2; + if (r2 == V_EQ) + return r1; + if (((r1 & V_LT) && (r2 & V_GT)) + || ((r1 & V_GT) && (r2 & V_LT))) + return V_LGE; + return static_cast((((r1 & r2) & V_EQ) ? V_EQ : 0) | + (r1 & (V_LT | V_GT))); +} + +inline Result +sub(Result r1, Result r2) { + return add(r1, neg(r2)); +} + +template +inline void +gcd_exact_noabs(To& to, const From& x, const From& y) { + To nx = x; + To ny = y; + To rm; + while (ny != 0) { + // The following is derived from the assumption that x % y + // is always representable. This is true for both native integers + // and IEC 559 floating point numbers. + rem(rm, nx, ny, ROUND_NOT_NEEDED); + nx = ny; + ny = rm; + } + to = nx; +} + +template +inline Result +gcd_exact(To& to, const From1& x, const From2& y, Rounding_Dir dir) { + gcd_exact_noabs(to, x, y); + return abs(to, to, dir); +} + +template +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(to, x, dir); + } + } + + s = 1; + t = 0; + bool negative_x = x < 0; + bool negative_y = y < 0; + + Result r; + r = abs(to, x, dir); + if (r != V_EQ) + return r; + + From2 ay; + r = abs(ay, 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 == ay) + goto sign_check; +#endif + + { + To2 v1 = 0; + To3 v2 = 1; + To1 v3 = static_cast(ay); + while (true) { + To1 q = to / v3; + // Remainder, next candidate GCD. + To1 t3 = to - q*v3; + To2 t1 = s - static_cast(q)*v1; + To3 t2 = t - static_cast(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(s, s, dir); + if (r != V_EQ) + return r; + } + if (negative_y) + return neg(t, t, dir); + return V_EQ; +#undef PPL_MATCH_GMP_GCDEXT +} + +template +inline Result +lcm_gcd_exact(To& to, const From1& x, const From2& y, Rounding_Dir dir) { + if (x == 0 || y == 0) { + to = 0; + return V_EQ; + } + To nx, ny; + Result r; + r = abs(nx, x, dir); + if (r != V_EQ) + return r; + r = abs(ny, y, dir); + if (r != V_EQ) + return r; + To gcd; + gcd_exact_noabs(gcd, nx, ny); + // The following is derived from the assumption that x / gcd(x, y) + // is always representable. This is true for both native integers + // and IEC 559 floating point numbers. + div(to, nx, gcd, ROUND_NOT_NEEDED); + return mul(to, to, ny, dir); +} + +template +inline Result +sgn_generic(const Type& x) { + if (x > 0) + return V_GT; + if (x == 0) + return V_EQ; + return V_LT; +} + +template +struct Safe_Int_Comparison : public False { +}; + +template +struct Safe_Int_Comparison::value && C_Integer::value)>::type> + : public Bool<(C_Integer::is_signed + ? (C_Integer::is_signed + || sizeof(T2) < sizeof(T1) + || sizeof(T2) < sizeof(int)) + : (!C_Integer::is_signed + || sizeof(T1) < sizeof(T2) + || sizeof(T1) < sizeof(int)))> { +}; + + +template +inline typename Enable_If<(Safe_Int_Comparison::value + || Safe_Conversion::value + || Safe_Conversion::value), bool>::type +lt(const T1& x, const T2& y) { + return x < y; +} +template +inline typename Enable_If<(Safe_Int_Comparison::value + || Safe_Conversion::value + || Safe_Conversion::value), bool>::type +le(const T1& x, const T2& y) { + return x <= y; +} +template +inline typename Enable_If<(Safe_Int_Comparison::value + || Safe_Conversion::value + || Safe_Conversion::value), bool>::type +eq(const T1& x, const T2& y) { + return x == y; +} + +template +inline typename Enable_If<(!Safe_Int_Comparison::value + && C_Integer::value + && C_Integer::is_signed), bool>::type +lt(const S& x, const U& y) { + return x < 0 || x < y; +} + +template +inline typename Enable_If<(!Safe_Int_Comparison::value + && C_Integer::value + && C_Integer::is_signed), bool>::type +lt(const U& x, const S& y) { + return y >= 0 && x < y; +} + +template +inline typename Enable_If<(!Safe_Int_Comparison::value + && C_Integer::value + && C_Integer::is_signed), bool>::type +le(const S& x, const U& y) { + return x < 0 || x <= y; +} + +template +inline typename Enable_If<(!Safe_Int_Comparison::value + && C_Integer::value + && C_Integer::is_signed), bool>::type +le(const U& x, const S& y) { + return y >= 0 && x <= y; +} + +template +inline typename Enable_If<(!Safe_Int_Comparison::value + && C_Integer::value + && C_Integer::is_signed), bool>::type +eq(const S& x, const U& y) { + return x >= 0 && x == y; +} + +template +inline typename Enable_If<(!Safe_Int_Comparison::value + && C_Integer::value + && C_Integer::is_signed), bool>::type +eq(const U& x, const S& y) { + return y >= 0 && x == y; +} + +template +inline typename Enable_If<(!Safe_Conversion::value + && !Safe_Conversion::value + && (!C_Integer::value || !C_Integer::value)), bool>::type +eq(const T1& x, const T2& y) { + PPL_DIRTY_TEMP(T1, tmp); + Result r = assign_r(tmp, y, static_cast(ROUND_DIRECT | ROUND_FPU_CHECK_INEXACT)); + // 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. + assert(r != V_LE && r != V_GE && r != V_LGE); + return r == V_EQ && x == tmp; +} + +template +inline typename Enable_If<(!Safe_Conversion::value + && !Safe_Conversion::value + && (!C_Integer::value || !C_Integer::value)), bool>::type +lt(const T1& x, const T2& y) { + PPL_DIRTY_TEMP(T1, tmp); + Result r = assign_r(tmp, y, ROUND_UP); + switch (r) { + case V_POS_OVERFLOW: + case VC_PLUS_INFINITY: + return true; + case V_EQ: + case V_LT: + case V_LE: + return x < tmp; + default: + return false; + } +} + +template +inline typename +Enable_If<(!Safe_Conversion::value + && !Safe_Conversion::value + && (!C_Integer::value || !C_Integer::value)), bool>::type +le(const T1& x, const T2& y) { + PPL_DIRTY_TEMP(T1, tmp); + Result r + = assign_r(tmp, + y, + static_cast(ROUND_UP | ROUND_FPU_CHECK_INEXACT)); + switch (r) { + case V_POS_OVERFLOW: + case VC_PLUS_INFINITY: + return true; + case V_EQ: + return x <= tmp; + case V_LT: + return x < tmp; + case V_LE: + case V_GE: + case V_LGE: + // FIXME: See comment above. + assert(0); + default: + return false; + } +} + +template +inline bool +lt_p(const Type1& x, const Type2& y) { + return lt(x, y); +} + +template +inline bool +le_p(const Type1& x, const Type2& y) { + return le(x, y); +} + +template +inline bool +eq_p(const Type1& x, const Type2& y) { + return eq(x, y); +} + +template +inline Result +cmp_generic(const Type1& x, const Type2& y) { + if (lt(y, x)) + return V_GT; + if (lt(x, y)) + return V_LT; + return V_EQ; +} + +template +inline Result +input_generic(Type& to, std::istream& is, Rounding_Dir dir) { + PPL_DIRTY_TEMP0(mpq_class, q); + Result r = input_mpq(q, is); + if (is_special(r)) + return assign_special(to, r, dir); + if (r == V_EQ) + return assign(to, q, dir); + assert(0); + return VC_NAN; +} + +} // 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 27. */ +#include +#include +#include +#include + +#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 +struct Extended_Int { + static const Type plus_infinity = C_Integer::max; + static const Type minus_infinity = (C_Integer::min >= 0 + ? C_Integer::max - 1 + : C_Integer::min); + static const Type not_a_number = (C_Integer::min >= 0 + ? C_Integer::max - Policy::has_infinity * 2 + : C_Integer::min + Policy::has_infinity); + static const Type min = (C_Integer::min + + (C_Integer::min >= 0 ? 0 + : (Policy::has_infinity + Policy::has_nan))); + static const Type max = (C_Integer::max + - (C_Integer::min >= 0 + ? (2 * Policy::has_infinity + Policy::has_nan) + : Policy::has_infinity)); +}; + +template +inline Result +set_neg_overflow_int(To& to, Rounding_Dir dir) { + if (round_up(dir)) { + to = Extended_Int::min; + return V_LT; + } + else { + if (Policy::has_infinity) { + to = Extended_Int::minus_infinity; + return V_GT; + } + return V_NEG_OVERFLOW; + } +} + +template +inline Result +set_pos_overflow_int(To& to, Rounding_Dir dir) { + if (round_down(dir)) { + to = Extended_Int::max; + return V_GT; + } + else { + if (Policy::has_infinity) { + to = Extended_Int::plus_infinity; + return V_LT; + } + return V_POS_OVERFLOW; + } +} + +template +inline Result +round_lt_int_no_overflow(To& to, Rounding_Dir dir) { + if (round_down(dir)) { + --to; + return V_GT; + } + return V_LT; +} + +template +inline Result +round_gt_int_no_overflow(To& to, Rounding_Dir dir) { + if (round_up(dir)) { + ++to; + return V_LT; + } + return V_GT; +} + +template +inline Result +round_lt_int(To& to, Rounding_Dir dir) { + if (round_down(dir)) { + if (to == Extended_Int::min) { + if (Policy::has_infinity) { + to = Extended_Int::minus_infinity; + return V_GT; + } + return V_NEG_OVERFLOW; + } + else { + --to; + return V_GT; + } + } + return V_LT; +} + +template +inline Result +round_gt_int(To& to, Rounding_Dir dir) { + if (round_up(dir)) { + if (to == Extended_Int::max) { + if (Policy::has_infinity) { + to = Extended_Int::plus_infinity; + return V_LT; + } + return V_POS_OVERFLOW; + } + else { + ++to; + return V_LT; + } + } + return V_GT; +} + +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 +inline Result +classify_int(const Type v, bool nan, bool inf, bool sign) { + if (Policy::has_nan + && (nan || sign) + && v == Extended_Int::not_a_number) + return VC_NAN; + if (!inf & !sign) + return VC_NORMAL; + if (Policy::has_infinity) { + if (v == Extended_Int::minus_infinity) + return inf ? VC_MINUS_INFINITY : V_LT; + if (v == Extended_Int::plus_infinity) + return inf ? VC_PLUS_INFINITY : V_GT; + } + if (sign) { + if (v < 0) + return V_LT; + if (v > 0) + return V_GT; + return V_EQ; + } + return VC_NORMAL; +} + +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 +inline bool +is_nan_int(const Type v) { + return Policy::has_nan && v == Extended_Int::not_a_number; +} + +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 +inline bool +is_minf_int(const Type v) { + return Policy::has_infinity + && v == Extended_Int::minus_infinity; +} + +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 +inline bool +is_pinf_int(const Type v) { + return Policy::has_infinity + && v == Extended_Int::plus_infinity; +} + +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 +inline bool +is_int_int(const Type v) { + return !is_nan(v); +} + +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 +inline Result +assign_special_int(Type& v, Result r, Rounding_Dir dir) { + Result t = classify(r); + switch (t) { + case VC_NAN: + if (Policy::has_nan) + v = Extended_Int::not_a_number; + break; + case VC_MINUS_INFINITY: + if (Policy::has_infinity) { + v = Extended_Int::minus_infinity; + return V_EQ; + } + if (round_up(dir)) { + v = Extended_Int::min; + return V_LT; + } + break; + case VC_PLUS_INFINITY: + if (Policy::has_infinity) { + v = Extended_Int::plus_infinity; + return V_EQ; + } + if (round_down(dir)) { + v = Extended_Int::max; + return V_GT; + } + break; + default: + assert(0); + break; + } + return r; +} + +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 +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::min > Extended_Int::min + || Extended_Int::max < Extended_Int::max))) { + if (CHECK_P(To_Policy::check_overflow, + from < static_cast(Extended_Int::min))) + return set_neg_overflow_int(to, dir); + if (CHECK_P(To_Policy::check_overflow, + from > static_cast(Extended_Int::max))) + return set_pos_overflow_int(to, dir); + } + to = To(from); + return V_EQ; +} + +template +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(Extended_Int::max))) + return set_pos_overflow_int(to, dir); + } + to = To(from); + return V_EQ; +} + +template +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, dir); + if (sizeof(To) < sizeof(From)) { + if (CHECK_P(To_Policy::check_overflow, + from > static_cast(Extended_Int::max))) + return set_pos_overflow_int(to, dir); + } + to = To(from); + return V_EQ; +} + +template +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::max < Extended_Int::max)) { + if (CHECK_P(To_Policy::check_overflow, + from > static_cast(Extended_Int::max))) + return set_pos_overflow_int(to, dir); + } + to = 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) + +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) +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) + +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) +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) +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) +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 +inline Result +assign_int_float(To& to, const From from, Rounding_Dir dir) { + if (is_nan(from)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(from)) + return assign_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(from)) + return assign_special(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::min))) + return set_neg_overflow_int(to, dir); + if (CHECK_P(To_Policy::check_overflow, !le(from, Extended_Int::max))) + return set_pos_overflow_int(to, dir); +#else + if (CHECK_P(To_Policy::check_overflow, (from < Extended_Int::min))) + return set_neg_overflow_int(to, dir); + if (CHECK_P(To_Policy::check_overflow, (from > Extended_Int::max))) + return set_pos_overflow_int(to, dir); +#endif + From i_from = rint(from); + to = static_cast(i_from); + if (round_ignore(dir)) + return V_LGE; + if (from < i_from) + return round_lt_int(to, dir); + else if (from > i_from) + return round_gt_int(to, dir); + else + return V_EQ; +} + +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, 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, 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 +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 (v < C_Integer::min) + return set_neg_overflow_int(to, dir); + if (v > C_Integer::max) + return set_pos_overflow_int(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, v, dir); + to = v; + return V_EQ; + } + } + } + return ::sgn(from) < 0 + ? set_neg_overflow_int(to, dir) + : set_pos_overflow_int(to, dir); +} + +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 +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, dir); + if (sizeof(To) <= sizeof(unsigned long)) { + if (!To_Policy::check_overflow) { + to = from.get_ui(); + return V_EQ; + } + if (from.fits_ulong_p()) { + unsigned long v = from.get_ui(); + if (v > C_Integer::max) + return set_pos_overflow_int(to, dir); + to = v; + return V_EQ; + } + } + else { + mpz_srcptr m = from.get_mpz_t(); + size_t sz = mpz_size(m); + if (sz <= sizeof(To) / sizeof(mp_limb_t)) { + if (sz == 0) + to = 0; + else + mpz_export(&to, 0, -1, sizeof(To), 0, 0, m); + return V_EQ; + } + } + return set_pos_overflow_int(to, dir); +} + +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 +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_TEMP0(mpz_class, q); + mpz_ptr _q = q.get_mpz_t(); + if (round_ignore(dir)) { + mpz_tdiv_q(_q, n, d); + Result r = assign(to, q, dir); + if (r != V_EQ) + return r; + return V_LGE; + } + mpz_t rem; + int sign; + mpz_init(rem); + mpz_tdiv_qr(_q, rem, n, d); + sign = mpz_sgn(rem); + mpz_clear(rem); + Result r = assign(to, q, dir); + if (r != V_EQ) + return r; + switch (sign) { + case -1: + return round_lt_int(to, dir); + case 1: + return round_gt_int(to, dir); + default: + return V_EQ; + } +} + +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 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 +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 { + 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 { + 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 { + 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 { + 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 { + 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 { + 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 { + 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 { + 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 { + 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 { + 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 +inline Result +neg_int_larger(Type& to, const Type x, Rounding_Dir dir) { + typename Larger::type_for_neg l = x; + l = -l; + return assign(to, l, dir); +} + +template +inline Result +add_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) { + typename Larger::type_for_add l = x; + l += y; + return assign(to, l, dir); +} + +template +inline Result +sub_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) { + typename Larger::type_for_sub l = x; + l -= y; + return assign(to, l, dir); +} + +template +inline Result +mul_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) { + typename Larger::type_for_mul l = x; + l *= y; + return assign(to, l, dir); +} + +template +inline Result +neg_signed_int(Type& to, const Type from, Rounding_Dir dir) { + if (To_Policy::check_overflow && Larger::use_for_neg) + return neg_int_larger(to, from, dir); + if (CHECK_P(To_Policy::check_overflow, + (from < -Extended_Int::max))) + return set_pos_overflow_int(to, dir); + to = -from; + return V_EQ; +} + +template +inline Result +neg_unsigned_int(Type& to, const Type from, Rounding_Dir dir) { + if (To_Policy::check_overflow && Larger::use_for_neg) + return neg_int_larger(to, from, dir); + if (CHECK_P(To_Policy::check_overflow, from != 0)) + return set_neg_overflow_int(to, dir); + to = from; + return V_EQ; +} + +template +inline Result +add_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) { + if (To_Policy::check_overflow && Larger::use_for_add) + return add_int_larger(to, x, y, dir); + if (To_Policy::check_overflow) { + if (y >= 0) { + if (x > Extended_Int::max - y) + return set_pos_overflow_int(to, dir); + } + else if (x < Extended_Int::min - y) + return set_neg_overflow_int(to, dir); + } + to = x + y; + return V_EQ; +} + +template +inline Result +add_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) { + if (To_Policy::check_overflow && Larger::use_for_add) + return add_int_larger(to, x, y, dir); + if (CHECK_P(To_Policy::check_overflow, + (x > Extended_Int::max - y))) + return set_pos_overflow_int(to, dir); + to = x + y; + return V_EQ; +} + +template +inline Result +sub_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) { + if (To_Policy::check_overflow && Larger::use_for_sub) + return sub_int_larger(to, x, y, dir); + if (To_Policy::check_overflow) { + if (y >= 0) { + if (x < Extended_Int::min + y) + return set_neg_overflow_int(to, dir); + } + else if (x > Extended_Int::max + y) + return set_pos_overflow_int(to, dir); + } + to = x - y; + return V_EQ; +} + +template +inline Result +sub_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) { + if (To_Policy::check_overflow && Larger::use_for_sub) + return sub_int_larger(to, x, y, dir); + if (CHECK_P(To_Policy::check_overflow, + (x < Extended_Int::min + y))) + return set_neg_overflow_int(to, dir); + to = x - y; + return V_EQ; +} + +template +inline Result +mul_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) { + if (To_Policy::check_overflow && Larger::use_for_mul) + return mul_int_larger(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, x, dir); + if (x >= 0) { + if (y > 0) { + if (x > Extended_Int::max / y) + return set_pos_overflow_int(to, dir); + } + else { + if (x > Extended_Int::min / y) + return set_neg_overflow_int(to, dir); + } + } + else { + if (y < 0) { + if (x < Extended_Int::max / y) + return set_pos_overflow_int(to, dir); + } + else { + if (x < Extended_Int::min / y) + return set_neg_overflow_int(to, dir); + } + } + to = x * y; + return V_EQ; +} + +template +inline Result +mul_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) { + if (To_Policy::check_overflow && Larger::use_for_mul) + return mul_int_larger(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::max / y) + return set_pos_overflow_int(to, dir); + to = x * y; + return V_EQ; +} + +template +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_special(to, V_DIV_ZERO, ROUND_IGNORE); + if (To_Policy::check_overflow && y == -1) + return neg_signed_int(to, x, dir); + to = x / y; + if (round_ignore(dir)) + return V_LGE; + Type m = x % y; + if (m < 0) + return round_lt_int_no_overflow(to, dir); + else if (m > 0) + return round_gt_int_no_overflow(to, dir); + else + return V_EQ; +} + +template +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_special(to, V_DIV_ZERO, ROUND_IGNORE); + to = x / y; + if (round_ignore(dir)) + return V_GE; + Type m = x % y; + if (m == 0) + return V_EQ; + return round_gt_int(to, dir); +} + +template +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_special(to, V_DIV_ZERO, ROUND_IGNORE); + if (To_Policy::check_overflow && y == -1) + return neg_signed_int(to, x, dir); + to = x / y; + return V_EQ; +} + +template +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_special(to, V_DIV_ZERO, ROUND_IGNORE); + to = x / y; + return V_EQ; +} + +template +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_special(to, V_MOD_ZERO, ROUND_IGNORE); + to = x % y; + return V_EQ; +} + +template +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_special(to, V_MOD_ZERO, ROUND_IGNORE); + to = x % y; + return V_EQ; +} + +template +inline Result +div2exp_unsigned_int(Type& to, const Type x, int exp, Rounding_Dir dir) { + if (exp < 0) + return mul2exp(to, x, -exp, dir); + if (static_cast(exp) >= sizeof(Type) * 8) { + to = 0; + if (round_ignore(dir)) + return V_GE; + if (x == 0) + return V_EQ; + return round_gt_int_no_overflow(to, dir); + } + to = x >> exp; + if (round_ignore(dir)) + return V_GE; + if (x & ((static_cast(1) << exp) - 1)) + return round_gt_int_no_overflow(to, dir); + else + return V_EQ; +} + +template +inline Result +div2exp_signed_int(Type& to, const Type x, int exp, Rounding_Dir dir) { + if (exp < 0) + return mul2exp(to, x, -exp, dir); + if (static_cast(exp) >= sizeof(Type) * 8) { + zero: + to = 0; + if (round_ignore(dir)) + return V_LGE; + if (x < 0) + return round_lt_int_no_overflow(to, dir); + else if (x > 0) + return round_gt_int_no_overflow(to, dir); + else + return V_EQ; + } + if (static_cast(exp) >= sizeof(Type) * 8 - 1) { + if (x == C_Integer::min) { + to = -1; + return V_EQ; + } + goto zero; + } +#if 0 + to = x / (static_cast(1) << exp); + if (round_ignore(dir)) + return V_GE; + Type r = x % (static_cast(1) << exp); + if (r < 0) + return round_lt_int_no_overflow(to, dir); + else if (r > 0) + return round_gt_int_no_overflow(to, dir); + else + return V_EQ; +#else + // Faster but compiler implementation dependent (see C++98 5.8.3) + to = x >> exp; + if (round_ignore(dir)) + return V_GE; + if (x & ((static_cast(1) << exp) - 1)) + return round_gt_int_no_overflow(to, dir); + return V_EQ; +#endif +} + +template +inline Result +mul2exp_unsigned_int(Type& to, const Type x, int exp, Rounding_Dir dir) { + if (exp < 0) + return div2exp(to, x, -exp, dir); + if (!To_Policy::check_overflow) { + to = x << exp; + return V_EQ; + } + if (static_cast(exp) >= sizeof(Type) * 8) { + if (x == 0) { + to = 0; + return V_EQ; + } + return set_pos_overflow_int(to, dir); + } + if (x & (((static_cast(1) << exp) - 1) << (sizeof(Type) * 8 - exp))) + return set_pos_overflow_int(to, dir); + Type n = x << exp; + if (n > Extended_Int::max) + return set_pos_overflow_int(to, dir); + to = n; + return V_EQ; +} + +template +inline Result +mul2exp_signed_int(Type& to, const Type x, int exp, Rounding_Dir dir) { + if (exp < 0) + return div2exp(to, x, -exp, dir); + if (!To_Policy::check_overflow) { + to = x << exp; + return V_EQ; + } + if (static_cast(exp) >= sizeof(Type) * 8 - 1) { + if (x < 0) + return set_neg_overflow_int(to, dir); + else if (x > 0) + return set_pos_overflow_int(to, dir); + else { + to = 0; + return V_EQ; + } + } + Type mask = ((static_cast(1) << exp) - 1) + << (sizeof(Type) * 8 - 1 - exp); + Type n; + if (x < 0) { + if ((x & mask) != mask) + return set_neg_overflow_int(to, dir); + n = x << exp; + if (n < Extended_Int::min) + return set_neg_overflow_int(to, dir); + } + else { + if (x & mask) + return set_pos_overflow_int(to, dir); + n = x << exp; + if (n > Extended_Int::max) + return set_pos_overflow_int(to, dir); + } + to = n; + return V_EQ; +} + +template +inline void +isqrtrem(Type& q, Type& r, const Type from) { + q = 0; + r = from; + Type t(1); + for (t <<= 8 * sizeof(Type) - 2; t != 0; t >>= 2) { + Type s = q + t; + if (s <= r) { + r -= s; + q = s + t; + } + q >>= 1; + } +} + +template +inline Result +sqrt_unsigned_int(Type& to, const Type from, Rounding_Dir dir) { + Type rem; + isqrtrem(to, rem, from); + if (round_ignore(dir)) + return V_GE; + if (rem == 0) + return V_EQ; + return round_gt_int(to, dir); +} + +template +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_special(to, V_SQRT_NEG, ROUND_IGNORE); + return sqrt_unsigned_int(to, from, dir); +} + +template +inline Result +add_mul_int(Type& to, const Type x, const Type y, Rounding_Dir dir) { + Type z; + Result r = mul(z, x, y, dir); + switch (r) { + case V_NEG_OVERFLOW: + case V_LT: + if (to <= 0) { + to = z; + return r; + } + return assign_special(to, V_UNKNOWN_NEG_OVERFLOW, ROUND_IGNORE); + case V_POS_OVERFLOW: + case V_GT: + if (to >= 0) { + to = z; + return r; + } + return assign_special(to, V_UNKNOWN_POS_OVERFLOW, ROUND_IGNORE); + default: + return add(to, to, z, dir); + } +} + +template +inline Result +sub_mul_int(Type& to, const Type x, const Type y, Rounding_Dir dir) { + Type z; + Result r = mul(z, x, y, dir); + switch (r) { + case V_NEG_OVERFLOW: + case V_LT: + if (to >= 0) + return set_pos_overflow_int(to, dir); + return V_UNKNOWN_NEG_OVERFLOW; + case V_POS_OVERFLOW: + case V_GT: + if (to <= 0) + return set_neg_overflow_int(to, dir); + return V_UNKNOWN_POS_OVERFLOW; + default: + return sub(to, to, z, dir); + } +} + +template +inline Result +output_char(std::ostream& os, Type& from, + const Numeric_Format&, Rounding_Dir) { + os << static_cast(from); + return V_EQ; +} + +template +inline Result +output_int(std::ostream& os, Type& from, const Numeric_Format&, Rounding_Dir) { + os << from; + return V_EQ; +} + +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) +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) + +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) +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) + +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) +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) + +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) +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) + +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) +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) + +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) +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) + +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) +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) + +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) +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) + +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) +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) + +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) +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) + +PPL_SPECIALIZE_MUL2EXP(mul2exp_signed_int, signed char, signed char) +PPL_SPECIALIZE_MUL2EXP(mul2exp_signed_int, signed short, signed short) +PPL_SPECIALIZE_MUL2EXP(mul2exp_signed_int, signed int, signed int) +PPL_SPECIALIZE_MUL2EXP(mul2exp_signed_int, signed long, signed long) +PPL_SPECIALIZE_MUL2EXP(mul2exp_signed_int, signed long long, signed long long) +PPL_SPECIALIZE_MUL2EXP(mul2exp_unsigned_int, unsigned char, unsigned char) +PPL_SPECIALIZE_MUL2EXP(mul2exp_unsigned_int, unsigned short, unsigned short) +PPL_SPECIALIZE_MUL2EXP(mul2exp_unsigned_int, unsigned int, unsigned int) +PPL_SPECIALIZE_MUL2EXP(mul2exp_unsigned_int, unsigned long, unsigned long) +PPL_SPECIALIZE_MUL2EXP(mul2exp_unsigned_int, unsigned long long, unsigned long long) + +PPL_SPECIALIZE_DIV2EXP(div2exp_signed_int, signed char, signed char) +PPL_SPECIALIZE_DIV2EXP(div2exp_signed_int, signed short, signed short) +PPL_SPECIALIZE_DIV2EXP(div2exp_signed_int, signed int, signed int) +PPL_SPECIALIZE_DIV2EXP(div2exp_signed_int, signed long, signed long) +PPL_SPECIALIZE_DIV2EXP(div2exp_signed_int, signed long long, signed long long) +PPL_SPECIALIZE_DIV2EXP(div2exp_unsigned_int, unsigned char, unsigned char) +PPL_SPECIALIZE_DIV2EXP(div2exp_unsigned_int, unsigned short, unsigned short) +PPL_SPECIALIZE_DIV2EXP(div2exp_unsigned_int, unsigned int, unsigned int) +PPL_SPECIALIZE_DIV2EXP(div2exp_unsigned_int, unsigned long, unsigned long) +PPL_SPECIALIZE_DIV2EXP(div2exp_unsigned_int, unsigned long long, unsigned long long) + +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) +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) + +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) +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, 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, 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, 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, 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, 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, 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, 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, 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, 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 27. */ +#ifndef __alpha +#include +#endif + +namespace Parma_Polyhedra_Library { + +namespace Checked { + +inline float +fma(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 +fma(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 +fma(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 +rint(float x) { + return ::rintf(x); +} +#endif + +inline double +rint(double x) { + return ::rint(x); +} + +#if PPL_HAVE_DECL_RINTL +inline long double +rint(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 +rint(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 +rint(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_ignore(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) { + cc_flush(v); +} + +inline void +limit_precision(const double& v) { + cc_flush(v); +} + +inline void +limit_precision(const long double&) { +} + +template +inline Result +classify_float(const T v, bool nan, bool inf, bool sign) { + Float f(v); + if ((nan || sign) && CHECK_P(Policy::has_nan, f.u.binary.is_nan())) + return VC_NAN; + if (inf) { + int i = CHECK_P(Policy::has_infinity, f.u.binary.is_inf()); + if (i < 0) + return VC_MINUS_INFINITY; + if (i > 0) + return VC_PLUS_INFINITY; + } + if (sign) { + if (v < 0) + return V_LT; + if (v > 0) + return V_GT; + return V_EQ; + } + return VC_NORMAL; +} + +template +inline bool +is_nan_float(const T v) { + Float f(v); + return CHECK_P(Policy::has_nan, f.u.binary.is_nan()); +} + +template +inline int +is_inf_float(const T v) { + Float f(v); + return CHECK_P(Policy::has_infinity, f.u.binary.is_inf()); +} +template +inline bool +is_minf_float(const T v) { + return is_inf_float(v) < 0; +} + +template +inline bool +is_pinf_float(const T v) { + return is_inf_float(v) > 0; +} + + +template +inline bool +is_int_float(const T v) { + return rint(v) == v; +} + +template +inline Result +assign_special_float(T& v, Result r, Rounding_Dir) { + switch (classify(r)) { + case VC_MINUS_INFINITY: + v = -HUGE_VAL; + break; + case VC_PLUS_INFINITY: + v = HUGE_VAL; + break; + case VC_NAN: + v = PPL_NAN; + return r; + default: + break; + } + return V_EQ; +} + +template +inline void +pred_float(T& v) { + Float f(v); + assert(!f.u.binary.is_nan()); + assert(f.u.binary.is_inf() >= 0); + if (f.u.binary.is_zero() > 0) { + f.u.binary.negate(); + f.u.binary.inc(); + } + else if (f.u.binary.sign_bit()) { + f.u.binary.inc(); + } + else { + f.u.binary.dec(); + } + v = f.value(); +} + +template +inline void +succ_float(T& v) { + Float f(v); + assert(!f.u.binary.is_nan()); + assert(f.u.binary.is_inf() <= 0); + if (f.u.binary.is_zero() < 0) { + f.u.binary.negate(); + f.u.binary.inc(); + } + else if (!f.u.binary.sign_bit()) { + f.u.binary.inc(); + } + else { + f.u.binary.dec(); + } + v = f.value(); +} + +template +inline Result +round_lt_float(To& to, Rounding_Dir dir) { + if (round_down(dir)) { + pred_float(to); + return V_GT; + } + return V_LT; +} + +template +inline Result +round_gt_float(To& to, Rounding_Dir dir) { + if (round_up(dir)) { + succ_float(to); + return V_LT; + } + return V_GT; +} + + +template +inline void +prepare_inexact(Rounding_Dir dir) { + if (Policy::fpu_check_inexact && round_fpu_check_inexact(dir)) + fpu_reset_inexact(); +} + +template +inline Result +result_relation(Rounding_Dir dir) { + if (Policy::fpu_check_inexact && round_fpu_check_inexact(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 +inline Result +assign_float_float_exact(To& to, const From from, Rounding_Dir) { + if (To_Policy::check_nan_result && is_nan(from)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + to = from; + return V_EQ; +} + +template +inline Result +assign_float_float_inexact(To& to, const From from, Rounding_Dir dir) { + if (To_Policy::check_nan_result && is_nan(from)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + prepare_inexact(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(dir); +} + +template +inline Result +assign_float_float(To& to, const From from, Rounding_Dir dir) { + if (sizeof(From) > sizeof(To)) + return assign_float_float_inexact(to, from, dir); + else + return assign_float_float_exact(to, from, dir); +} + +template +inline Result +floor_float(Type& to, const Type from, Rounding_Dir) { + if (To_Policy::check_nan_result && is_nan(from)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + if (fpu_direct_rounding(ROUND_DOWN)) + to = rint(from); + else if (fpu_inverse_rounding(ROUND_DOWN)) { + to = rint(-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 = rint(from); + limit_precision(to); + fpu_restore_rounding_direction(old); + } + return V_EQ; +} + +template +inline Result +ceil_float(Type& to, const Type from, Rounding_Dir) { + if (To_Policy::check_nan_result && is_nan(from)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + if (fpu_direct_rounding(ROUND_UP)) + to = rint(from); + else if (fpu_inverse_rounding(ROUND_UP)) { + to = rint(-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 = rint(from); + limit_precision(to); + fpu_restore_rounding_direction(old); + } + return V_EQ; +} + +template +inline Result +trunc_float(Type& to, const Type from, Rounding_Dir dir) { + if (To_Policy::check_nan_result && is_nan(from)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + if (from >= 0) + return floor(to, from, dir); + else + return ceil(to, from, dir); +} + +template +inline Result +neg_float(Type& to, const Type from, Rounding_Dir) { + if (To_Policy::check_nan_result && is_nan(from)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + to = -from; + return V_EQ; +} + +template +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(x) && x == -y) + return assign_special(to, V_INF_ADD_INF, ROUND_IGNORE); + prepare_inexact(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::check_nan_result && is_nan(to)) + return VC_NAN; + return result_relation(dir); +} + +template +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(x) && x == y) + return assign_special(to, V_INF_SUB_INF, ROUND_IGNORE); + prepare_inexact(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::check_nan_result && is_nan(to)) + return VC_NAN; + return result_relation(dir); +} + +template +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(y)) || + (y == 0 && is_inf_float(x)))) + return assign_special(to, V_INF_MUL_ZERO, ROUND_IGNORE); + prepare_inexact(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::check_nan_result && is_nan(to)) + return VC_NAN; + return result_relation(dir); +} + +template +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(x) && is_inf_float(y)) + return assign_special(to, V_INF_DIV_INF, ROUND_IGNORE); + if (To_Policy::check_div_zero && y == 0) + return assign_special(to, V_DIV_ZERO, ROUND_IGNORE); + prepare_inexact(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::check_nan_result && is_nan(to)) + return VC_NAN; + return result_relation(dir); +} + +template +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(temp, x, y, dir); + if (is_special(r)) { + to = temp; + return r; + } + Result r1 = trunc(to, temp, ROUND_NOT_NEEDED); + assert(r1 == V_EQ); + if (r == V_EQ || to != temp) + return r1; + // FIXME: Prove that it's impossibile to return a strict relation + return dir == ROUND_UP ? V_LE : V_GE; +} + +template +inline Result +rem_float(Type& to, const Type x, const Type y, Rounding_Dir) { + if (To_Policy::check_inf_mod && is_inf_float(x)) + return assign_special(to, V_INF_MOD, ROUND_IGNORE); + if (To_Policy::check_div_zero && y == 0) + return assign_special(to, V_MOD_ZERO, ROUND_IGNORE); + to = std::fmod(x, y); + if (To_Policy::check_nan_result && is_nan(to)) + return VC_NAN; + return V_EQ; +} + +struct Float_2exp { + const_bool_nodef(has_nan, false); + const_bool_nodef(has_infinity, false); +}; + +template +inline Result +mul2exp_float(Type& to, const Type x, int exp, Rounding_Dir dir) { + if (To_Policy::check_nan_result && is_nan(x)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + if (exp < 0) + return div2exp(to, x, -exp, dir); + assert(static_cast(exp) < sizeof(unsigned long long) * 8); + return mul(to, x, static_cast(1ULL << exp), dir); +} + +template +inline Result +div2exp_float(Type& to, const Type x, int exp, Rounding_Dir dir) { + if (To_Policy::check_nan_result && is_nan(x)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + if (exp < 0) + return mul2exp(to, x, -exp, dir); + assert(static_cast(exp) < sizeof(unsigned long long) * 8); + return div(to, x, static_cast(1ULL << exp), dir); +} + +template +inline Result +abs_float(Type& to, const Type from, Rounding_Dir) { + if (To_Policy::check_nan_result && is_nan(from)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + to = std::abs(from); + return V_EQ; +} + +template +inline Result +sqrt_float(Type& to, const Type from, Rounding_Dir dir) { + if (To_Policy::check_nan_result && is_nan(from)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + if (To_Policy::check_sqrt_neg && from < 0) + return assign_special(to, V_SQRT_NEG, ROUND_IGNORE); + prepare_inexact(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(dir); +} + +template +inline Result +sgn_float(const Type x) { + return classify(x, false, false, true); +} + +template +inline Result +cmp_float(const Type x, const Type y) { + if (x > y) + return V_GT; + if (x < y) + return V_LT; + if (x == y) + return V_EQ; + return V_UNORD_COMP; +} + +template +inline Result +assign_float_int_inexact(To& to, const From from, Rounding_Dir dir) { + prepare_inexact(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(dir); +} + +template +inline Result +assign_float_int(To& to, const From from, Rounding_Dir dir) { + if (sizeof(From) * 8 > Float::Binary::MANTISSA_BITS) + return assign_float_int_inexact(to, from, dir); + else + return assign_exact(to, from, dir); +} + +template +inline Result +set_neg_overflow_float(T& to, Rounding_Dir dir) { + switch (round_dir(dir)) { + case ROUND_UP: + { + Float f; + f.u.binary.set_max(true); + to = f.value(); + return V_LT; + } + default: + to = -HUGE_VAL; + return V_GT; + } +} + +template +inline Result +set_pos_overflow_float(T& to, Rounding_Dir dir) { + switch (round_dir(dir)) { + case ROUND_DOWN: + { + Float f; + f.u.binary.set_max(false); + to = f.value(); + return V_GT; + } + default: + to = HUGE_VAL; + return V_LT; + } +} + +template +inline Result +assign_float_mpz(T& to, const mpz_class& _from, Rounding_Dir dir) +{ + mpz_srcptr from = _from.get_mpz_t(); + int sign = mpz_sgn(from); + if (sign == 0) { + to = 0; + return V_EQ; + } + size_t exponent = mpz_sizeinbase(from, 2) - 1; + if (exponent > static_cast(Float::Binary::EXPONENT_MAX)) { + if (sign < 0) + return set_neg_overflow_float(to, dir); + else + return set_pos_overflow_float(to, dir); + } + unsigned long zeroes = mpn_scan1(from->_mp_d, 0); + size_t meaningful_bits = exponent - zeroes; + mpz_t mantissa; + mpz_init(mantissa); + if (exponent > Float::Binary::MANTISSA_BITS) + mpz_tdiv_q_2exp(mantissa, + from, + exponent - Float::Binary::MANTISSA_BITS); + else + mpz_mul_2exp(mantissa, from, Float::Binary::MANTISSA_BITS - exponent); + Float f(to); + f.u.binary.build(sign < 0, mantissa, exponent); + mpz_clear(mantissa); + to = f.value(); + if (meaningful_bits > Float::Binary::MANTISSA_BITS) { + if (sign < 0) + return round_lt_float(to, dir); + else + return round_gt_float(to, dir); + } + return V_EQ; +} + +template +inline Result +assign_float_mpq(T& to, const mpq_class& from, Rounding_Dir dir) +{ + const mpz_class& _num = from.get_num(); + const mpz_class& _den = from.get_den(); + if (_den == 1) + return assign_float_mpz(to, _num, dir); + mpz_srcptr num = _num.get_mpz_t(); + mpz_srcptr den = _den.get_mpz_t(); + int sign = mpz_sgn(num); + signed long exponent = mpz_sizeinbase(num, 2) - mpz_sizeinbase(den, 2); + if (exponent < Float::Binary::EXPONENT_MIN_DENORM) { + to = 0; + inexact: + if (sign < 0) + return round_lt_float(to, dir); + else + return round_gt_float(to, dir); + } + if (exponent > static_cast(Float::Binary::EXPONENT_MAX + 1)) { + overflow: + if (sign < 0) + return set_neg_overflow_float(to, dir); + else + return set_pos_overflow_float(to, dir); + } + unsigned int needed_bits = Float::Binary::MANTISSA_BITS + 1; + if (exponent < Float::Binary::EXPONENT_MIN) + needed_bits -= Float::Binary::EXPONENT_MIN - exponent; + mpz_t mantissa; + mpz_init(mantissa); + signed long shift = needed_bits - exponent; + if (shift > 0) { + mpz_mul_2exp(mantissa, num, shift); + num = mantissa; + } + else if (shift < 0) { + mpz_mul_2exp(mantissa, den, -shift); + den = mantissa; + } + mpz_t r; + mpz_init(r); + mpz_tdiv_qr(mantissa, r, num, den); + size_t bits = mpz_sizeinbase(mantissa, 2); + bool inexact = (mpz_sgn(r) != 0); + mpz_clear(r); + if (bits == needed_bits + 1) { + inexact = (inexact || mpz_odd_p(mantissa)); + mpz_div_2exp(mantissa, mantissa, 1); + } + else + --exponent; + if (exponent > static_cast(Float::Binary::EXPONENT_MAX)) { + mpz_clear(mantissa); + goto overflow; + } + else if (exponent < Float::Binary::EXPONENT_MIN - 1) { + // Denormalized. + exponent = Float::Binary::EXPONENT_MIN - 1; + } + Float f(to); + f.u.binary.build(sign < 0, mantissa, exponent); + mpz_clear(mantissa); + to = f.value(); + if (inexact) + goto inexact; + return V_EQ; +} + +template +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(y)) || + (y == 0 && is_inf_float(x)))) + return assign_special(to, V_INF_MUL_ZERO, ROUND_IGNORE); + // FIXME: missing check_inf_add_inf + prepare_inexact(dir); + if (fpu_direct_rounding(dir)) + to = fma(x, y, to); + else if (fpu_inverse_rounding(dir)) { + to = fma(-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 = fma(x, y, to); + limit_precision(to); + fpu_restore_rounding_direction(old); + } + if (To_Policy::check_nan_result && is_nan(to)) + return VC_NAN; + return result_relation(dir); +} + +template +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(y)) || + (y == 0 && is_inf_float(x)))) + return assign_special(to, V_INF_MUL_ZERO, ROUND_IGNORE); + // FIXME: missing check_inf_add_inf + prepare_inexact(dir); + if (fpu_direct_rounding(dir)) + to = fma(x, -y, to); + else if (fpu_inverse_rounding(dir)) { + to = fma(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 = fma(x, -y, to); + limit_precision(to); + fpu_restore_rounding_direction(old); + } + if (To_Policy::check_nan_result && is_nan(to)) + return VC_NAN; + return result_relation(dir); +} + +template +inline Result +output_float(std::ostream& os, const Type from, const Numeric_Format&, + Rounding_Dir) { + if (from == 0) + os << "0"; + else if (is_minf(from)) + os << "-inf"; + else if (is_pinf(from)) + os << "+inf"; + else if (is_nan(from)) + os << "nan"; + else { + int old_precision = os.precision(10000); + // FIXME: here correctness depends on the behavior of the standard + // output operator which, in turn, may depend on the behavior + // of printf(). The C99 standard, 7.19.16.1#13, does not give + // enough guarantees. We could not find something similar + // in the C++ standard, so there is a concrete danger here. + os << from; + os.precision(old_precision); + } + 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, 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_MUL2EXP(mul2exp_float, float, float) +PPL_SPECIALIZE_DIV2EXP(div2exp_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, 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_MUL2EXP(mul2exp_float, double, double) +PPL_SPECIALIZE_DIV2EXP(div2exp_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, 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_MUL2EXP(mul2exp_float, long double, long double) +PPL_SPECIALIZE_DIV2EXP(div2exp_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 + +namespace Parma_Polyhedra_Library { + +namespace Checked { + +template +inline Result +round_lt_mpz(mpz_class& to, Rounding_Dir dir) { + if (round_down(dir)) { + --to; + return V_GT; + } + return V_LT; +} + +template +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 +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::min + 1) + return VC_NAN; + if (!inf && !sign) + return VC_NORMAL; + if (Policy::has_infinity) { + if (s == C_Integer::min) + return inf ? VC_MINUS_INFINITY : V_LT; + if (s == C_Integer::max) + return inf ? VC_PLUS_INFINITY : V_GT; + } + } + if (sign) + return sgn(v); + return VC_NORMAL; +} + +PPL_SPECIALIZE_CLASSIFY(classify_mpz, mpz_class) + +template +inline bool +is_nan_mpz(const mpz_class& v) { + return Policy::has_nan + && get_mp_size(v) == C_Integer::min + 1; +} + +PPL_SPECIALIZE_IS_NAN(is_nan_mpz, mpz_class) + +template +inline bool +is_minf_mpz(const mpz_class& v) { + return Policy::has_infinity + && get_mp_size(v) == C_Integer::min; +} + +PPL_SPECIALIZE_IS_MINF(is_minf_mpz, mpz_class) + +template +inline bool +is_pinf_mpz(const mpz_class& v) { + return Policy::has_infinity + && get_mp_size(v) == C_Integer::max; +} + +PPL_SPECIALIZE_IS_PINF(is_pinf_mpz, mpz_class) + +template +inline bool +is_int_mpz(const mpz_class& v) { + return !is_nan(v); +} + +PPL_SPECIALIZE_IS_INT(is_int_mpz, mpz_class) + +template +inline Result +assign_special_mpz(mpz_class& v, Result r, Rounding_Dir) { + Result c = classify(r); + if (Policy::has_nan && c == VC_NAN) + set_mp_size(v, C_Integer::min + 1); + else if (Policy::has_infinity) { + switch (c) { + case VC_MINUS_INFINITY: + set_mp_size(v, C_Integer::min); + return V_EQ; + case VC_PLUS_INFINITY: + set_mp_size(v, C_Integer::max); + return V_EQ; + default: + break; + } + } + return r; +} + +PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_mpz, mpz_class) + +template +inline void +copy_mpz(mpz_class& to, const mpz_class& from) { + if (is_nan_mpz(from)) + assert(To_Policy::has_nan); + else if (is_minf_mpz(from) || is_pinf_mpz(from)) + 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 +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, 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 +inline Result +construct_mpz_float(mpz_class& to, const From& from, Rounding_Dir dir) { + if (is_nan(from)) + return construct_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(from)) + return construct_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(from)) + return construct_special(to, VC_PLUS_INFINITY, dir); + if (round_ignore(dir)) { + new (&to) mpz_class(from); + return V_LGE; + } + From n = rint(from); + new (&to) mpz_class(n); + if (from < n) + return round_lt_mpz(to, dir); + else if (from > n) + return round_gt_mpz(to, dir); + else + return V_EQ; +} + +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, 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 +inline Result +assign_mpz_signed_int(mpz_class& to, const From from, Rounding_Dir) { + if (sizeof(From) <= sizeof(signed long)) + to = static_cast(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 +inline Result +assign_mpz_unsigned_int(mpz_class& to, const From from, Rounding_Dir) { + if (sizeof(From) <= sizeof(unsigned long)) + to = static_cast(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 +inline Result +assign_mpz_float(mpz_class& to, const From from, Rounding_Dir dir) { + if (is_nan(from)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(from)) + return assign_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(from)) + return assign_special(to, VC_PLUS_INFINITY, dir); + if (round_ignore(dir)) { + to = from; + return V_LGE; + } + From n = rint(from); + to = n; + if (from < n) + return round_lt_mpz(to, dir); + else if (from > n) + return round_gt_mpz(to, dir); + else + return V_EQ; +} + +PPL_SPECIALIZE_ASSIGN(assign_mpz_float, mpz_class, float) +PPL_SPECIALIZE_ASSIGN(assign_mpz_float, mpz_class, double) + +template +inline Result +assign_mpz_long_double(mpz_class& to, const From& from, Rounding_Dir dir) { + if (is_nan(from)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(from)) + return assign_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(from)) + return assign_special(to, VC_PLUS_INFINITY, dir); + // FIXME: this is an incredibly inefficient implementation! + std::stringstream ss; + output(ss, from, Numeric_Format(), dir); + PPL_DIRTY_TEMP0(mpq_class, tmp); +#ifndef NDEBUG + Result r = +#endif + input_mpq(tmp, ss); + assert(r == V_EQ); + return assign(to, tmp, dir); +} + +PPL_SPECIALIZE_ASSIGN(assign_mpz_long_double, mpz_class, long double) + +template +inline Result +assign_mpz_mpq(mpz_class& to, const mpq_class& from, Rounding_Dir dir) { + if (round_ignore(dir)) { + to = from; + return V_LGE; + } + mpz_srcptr n = from.get_num().get_mpz_t(); + mpz_srcptr d = from.get_den().get_mpz_t(); + if (round_down(dir)) { + mpz_fdiv_q(to.get_mpz_t(), n, d); + return mpz_divisible_p(n, d) ? V_EQ : V_GT; + } + else { + assert(round_up(dir)); + mpz_cdiv_q(to.get_mpz_t(), n, d); + return mpz_divisible_p(n, d) ? V_EQ : V_LT; + } +} + +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 +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 +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 +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 +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 +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_special(to, V_DIV_ZERO, ROUND_IGNORE); + mpz_srcptr n = x.get_mpz_t(); + mpz_srcptr d = y.get_mpz_t(); + if (round_ignore(dir)) { +#if 0 + // FIXME: we need to reconsider Rounding_Dir argument to clarify if + // client code intention is to have approximate result without any interest + // in knowing the direction of rounding or to grant to called function + // that result will be exact. + mpz_divexact(to.get_mpz_t(), n, d); + return V_LGE; +#else + mpz_cdiv_q(to.get_mpz_t(), n, d); + return V_LE; +#endif + } + if (round_down(dir)) { + mpz_fdiv_q(to.get_mpz_t(), n, d); + return mpz_divisible_p(n, d) ? V_EQ : V_GT; + } + else { + assert(round_up(dir)); + mpz_cdiv_q(to.get_mpz_t(), n, d); + return mpz_divisible_p(n, d) ? V_EQ : V_LT; + } +} + +PPL_SPECIALIZE_DIV(div_mpz, mpz_class, mpz_class, mpz_class) + +template +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_special(to, V_DIV_ZERO, ROUND_IGNORE); + 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 +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_special(to, V_MOD_ZERO, ROUND_IGNORE); + to = x % y; + return V_EQ; +} + +PPL_SPECIALIZE_REM(rem_mpz, mpz_class, mpz_class, mpz_class) + +template +inline Result +mul2exp_mpz(mpz_class& to, const mpz_class& x, int exp, Rounding_Dir dir) { + if (exp < 0) + return div2exp(to, x, -exp, dir); + mpz_mul_2exp(to.get_mpz_t(), x.get_mpz_t(), exp); + return V_EQ; +} + +PPL_SPECIALIZE_MUL2EXP(mul2exp_mpz, mpz_class, mpz_class) + +template +inline Result +div2exp_mpz(mpz_class& to, const mpz_class& x, int exp, Rounding_Dir dir) { + if (exp < 0) + return mul2exp(to, x, -exp, dir); + mpz_srcptr n = x.get_mpz_t(); + if (round_ignore(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); + return mpz_divisible_2exp_p(n, exp) ? V_EQ : V_GT; + } + else { + assert(round_up(dir)); + mpz_cdiv_q_2exp(to.get_mpz_t(), n, exp); + return mpz_divisible_2exp_p(n, exp) ? V_EQ : V_LT; + } +} + +PPL_SPECIALIZE_DIV2EXP(div2exp_mpz, mpz_class, mpz_class) + +template +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 +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 +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 +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 +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 +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 +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_special(to, V_SQRT_NEG, ROUND_IGNORE); + if (round_ignore(dir)) { + to = sqrt(from); + return V_GE; + } + PPL_DIRTY_TEMP0(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, dir); +} + +PPL_SPECIALIZE_SQRT(sqrt_mpz, mpz_class, mpz_class) + +template +inline Result +sgn_mp(const Type& x) { + int i = ::sgn(x); + return i > 0 ? V_GT : i == 0 ? V_EQ : V_LT; +} + +PPL_SPECIALIZE_SGN(sgn_mp, mpz_class) +PPL_SPECIALIZE_SGN(sgn_mp, mpq_class) + +template +inline Result +cmp_mp(const Type& x, const Type& y) { + int i = ::cmp(x, y); + return i > 0 ? V_GT : i == 0 ? V_EQ : V_LT; +} + +PPL_SPECIALIZE_CMP(cmp_mp, mpz_class, mpz_class) +PPL_SPECIALIZE_CMP(cmp_mp, mpq_class, mpq_class) + +template +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 +#include +#include + +namespace Parma_Polyhedra_Library { + +namespace Checked { + +template +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 VC_NAN; + if (!inf && !sign) + return VC_NORMAL; + if (Policy::has_infinity) { + if (s < 0) + return inf ? VC_MINUS_INFINITY : V_LT; + if (s > 0) + return inf ? VC_PLUS_INFINITY : V_GT; + } + } + if (sign) + return sgn(v); + return VC_NORMAL; +} + +PPL_SPECIALIZE_CLASSIFY(classify_mpq, mpq_class) + +template +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 +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 +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 +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 +inline Result +assign_special_mpq(mpq_class& v, Result r, Rounding_Dir) { + Result c = classify(r); + if (Policy::has_nan && c == VC_NAN) { + v.get_num() = 0; + v.get_den() = 0; + } + else if (Policy::has_infinity) { + switch (c) { + case VC_MINUS_INFINITY: + v.get_num() = -1; + v.get_den() = 0; + return V_EQ; + case VC_PLUS_INFINITY: + v.get_num() = 1; + v.get_den() = 0; + return V_EQ; + default: + break; + } + } + return r; +} + +PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_mpq, mpq_class) + +PPL_SPECIALIZE_COPY(copy_generic, mpq_class) + +template +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, 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 +inline Result +construct_mpq_float(mpq_class& to, const From& from, Rounding_Dir dir) { + if (is_nan(from)) + return construct_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(from)) + return construct_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(from)) + return construct_special(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, 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 +inline Result +assign_mpq_float(mpq_class& to, const From& from, Rounding_Dir dir) { + if (is_nan(from)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(from)) + return assign_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(from)) + return assign_special(to, VC_PLUS_INFINITY, dir); + to = from; + return V_EQ; +} + +PPL_SPECIALIZE_ASSIGN(assign_mpq_float, mpq_class, float) +PPL_SPECIALIZE_ASSIGN(assign_mpq_float, mpq_class, double) + +template +inline Result +assign_mpq_signed_int(mpq_class& to, const From from, Rounding_Dir) { + if (sizeof(From) <= sizeof(signed long)) + to = static_cast(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 +inline Result +assign_mpq_unsigned_int(mpq_class& to, const From from, Rounding_Dir) { + if (sizeof(From) <= sizeof(unsigned long)) + to = static_cast(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 +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 +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 +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 +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 +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 +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 +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 +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_special(to, V_DIV_ZERO, ROUND_IGNORE); + to = x / y; + return V_EQ; +} + +PPL_SPECIALIZE_DIV(div_mpq, mpq_class, mpq_class, mpq_class) + +template +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_special(to, V_DIV_ZERO, ROUND_IGNORE); + to = x / y; + return trunc(to, to, dir); +} + +PPL_SPECIALIZE_IDIV(idiv_mpq, mpq_class, mpq_class, mpq_class) + +template +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_special(to, V_MOD_ZERO, ROUND_IGNORE); + to = x / y; + to.get_num() %= to.get_den(); + return V_EQ; +} + +PPL_SPECIALIZE_REM(rem_mpq, mpq_class, mpq_class, mpq_class) + +template +inline Result +mul2exp_mpq(mpq_class& to, const mpq_class& x, int exp, Rounding_Dir dir) { + if (exp < 0) + return div2exp(to, x, -exp, dir); + mpz_mul_2exp(to.get_num().get_mpz_t(), x.get_num().get_mpz_t(), exp); + to.get_den() = x.get_den(); + to.canonicalize(); + return V_EQ; +} + +PPL_SPECIALIZE_MUL2EXP(mul2exp_mpq, mpq_class, mpq_class) + +template +inline Result +div2exp_mpq(mpq_class& to, const mpq_class& x, int exp, Rounding_Dir dir) { + if (exp < 0) + return mul2exp(to, x, -exp, dir); + to.get_num() = x.get_num(); + mpz_mul_2exp(to.get_den().get_mpz_t(), x.get_den().get_mpz_t(), exp); + to.canonicalize(); + return V_EQ; +} + +PPL_SPECIALIZE_DIV2EXP(div2exp_mpq, mpq_class, mpq_class) + +template +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 +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 +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 long rational_sqrt_precision_parameter; + +template +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_special(to, V_SQRT_NEG, ROUND_IGNORE); + 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); + mul2exp(to_a, from_a, 2*rational_sqrt_precision_parameter, ROUND_IGNORE); + Result rdiv + = div(to_a, to_a, from_b, rdir); + Result rsqrt = sqrt(to_a, to_a, rdir); + to_b = 1; + mul2exp(to_b, to_b, rational_sqrt_precision_parameter, ROUND_IGNORE); + to.canonicalize(); + return rdiv != V_EQ ? rdiv : rsqrt; +} + +PPL_SPECIALIZE_SQRT(sqrt_mpq, mpq_class, mpq_class) + +template +inline Result +input_mpq(mpq_class& to, std::istream& is, Rounding_Dir) { + Result r = input_mpq(to, is); + switch (classify(r)) { + case VC_MINUS_INFINITY: + case VC_PLUS_INFINITY: + case VC_NAN: + return assign_special(to, r, ROUND_IGNORE); + default: + return r; + } +} + +PPL_SPECIALIZE_INPUT(input_mpq, mpq_class) + +template +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) + +template +inline Result +assign_mpq_long_double(mpq_class& to, const From& from, Rounding_Dir dir) { + if (is_nan(from)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(from)) + return assign_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(from)) + return assign_special(to, VC_PLUS_INFINITY, dir); + // FIXME: this is an incredibly inefficient implementation! + std::stringstream ss; + output(ss, from, Numeric_Format(), dir); + return input_mpq(to, ss); +} + +PPL_SPECIALIZE_ASSIGN(assign_mpq_long_double, mpq_class, long double) + +} // namespace Checked + +//! Returns the precision parameter used for rational square root calculations. +inline unsigned +rational_sqrt_precision_parameter() { + return Checked::rational_sqrt_precision_parameter; +} + +//! Sets the precision parameter used for rational square root calculations. +/*! The lesser between numerator and denominator is limited to 2**\p p. + + If \p p is less than or equal to INT_MAX, sets the + precision parameter used for rational square root calculations to \p p. + + \exception std::invalid_argument + Thrown if \p p is greater than INT_MAX. +*/ +inline void +set_rational_sqrt_precision_parameter(const unsigned p) { + if (p <= INT_MAX) + Checked::rational_sqrt_precision_parameter = p; + else + throw std::invalid_argument("PPL::set_rational_sqrt_precision_parameter(p)" + " with p > INT_MAX"); +} + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/checked_ext.inlines.hh line 1. */ +/* Checked extended arithmetic functions. +*/ + + +namespace Parma_Polyhedra_Library { + +template struct FPU_Related : public False {}; +template <> struct FPU_Related : public True {}; +template <> struct FPU_Related : public True {}; +template <> struct FPU_Related : public True {}; + +namespace Checked { + +template +inline bool +handle_ext_natively(const T&) { + return FPU_Related::value; +} + +template +inline bool +ext_to_handle(const Type& x) { + return !handle_ext_natively(x) + && (Policy::has_infinity || Policy::has_nan); +} + +template +inline Result +sgn_ext(const Type& x) { + if (!ext_to_handle(x)) + goto native; + if (is_nan(x)) + return VC_NAN; + else if (is_minf(x)) + return V_LT; + else if (is_pinf(x)) + return V_GT; + else { + native: + return sgn(x); + } +} + +template +inline Result +construct_ext(To& to, const From& x, Rounding_Dir dir) { + if (!ext_to_handle(x)) + goto native; + if (is_nan(x)) + return construct_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x)) + return construct_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(x)) + return construct_special(to, VC_PLUS_INFINITY, dir); + else { + native: + return construct(to, x, dir); + } +} + +template +inline Result +assign_ext(To& to, const From& x, Rounding_Dir dir) { + if (!ext_to_handle(x)) + goto native; + if (is_nan(x)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x)) + return assign_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(x)) + return assign_special(to, VC_PLUS_INFINITY, dir); + else { + native: + return assign(to, x, dir); + } +} + +template +inline Result +neg_ext(To& to, const From& x, Rounding_Dir dir) { + if (!ext_to_handle(x)) + goto native; + if (is_nan(x)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x)) + return assign_special(to, VC_PLUS_INFINITY, dir); + else if (is_pinf(x)) + return assign_special(to, VC_MINUS_INFINITY, dir); + else { + native: + return neg(to, x, dir); + } +} + +template +inline Result +floor_ext(To& to, const From& x, Rounding_Dir dir) { + if (!ext_to_handle(x)) + goto native; + if (is_nan(x)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x)) + return assign_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(x)) + return assign_special(to, VC_PLUS_INFINITY, dir); + else { + native: + return floor(to, x, dir); + } +} + +template +inline Result +ceil_ext(To& to, const From& x, Rounding_Dir dir) { + if (!ext_to_handle(x)) + goto native; + if (is_nan(x)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x)) + return assign_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(x)) + return assign_special(to, VC_PLUS_INFINITY, dir); + else { + native: + return ceil(to, x, dir); + } +} + +template +inline Result +trunc_ext(To& to, const From& x, Rounding_Dir dir) { + if (!ext_to_handle(x)) + goto native; + if (is_nan(x)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x)) + return assign_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(x)) + return assign_special(to, VC_PLUS_INFINITY, dir); + else { + native: + return trunc(to, x, dir); + } +} + +template +inline Result +abs_ext(To& to, const From& x, Rounding_Dir dir) { + if (!ext_to_handle(x)) + goto native; + if (is_nan(x)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x) || is_pinf(x)) + return assign_special(to, VC_PLUS_INFINITY, dir); + else { + native: + return abs(to, x, dir); + } +} + +template +inline Result +add_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) { + if (!ext_to_handle(x) && !ext_to_handle(y)) + goto native; + if (is_nan(x) || is_nan(y)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x)) { + if (CHECK_P(To_Policy::check_inf_add_inf, is_pinf(y))) + goto inf_add_inf; + else + goto minf; + } + else if (is_pinf(x)) { + if (CHECK_P(To_Policy::check_inf_add_inf, is_minf(y))) { + inf_add_inf: + return assign_special(to, V_INF_ADD_INF, ROUND_IGNORE); + } + else + goto pinf; + } + else { + if (is_minf(y)) { + minf: + return assign_special(to, VC_MINUS_INFINITY, dir); + } + else if (is_pinf(y)) { + pinf: + return assign_special(to, VC_PLUS_INFINITY, dir); + } + else { + native: + return add(to, x, y, dir); + } + } +} + +template +inline Result +sub_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) { + if (!ext_to_handle(x) && !ext_to_handle(y)) + goto native; + if (is_nan(x) || is_nan(y)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x)) { + if (CHECK_P(To_Policy::check_inf_sub_inf, is_minf(y))) + goto inf_sub_inf; + else + goto minf; + } + else if (is_pinf(x)) { + if (CHECK_P(To_Policy::check_inf_sub_inf, is_pinf(y))) { + inf_sub_inf: + return assign_special(to, V_INF_SUB_INF, ROUND_IGNORE); + } + else + goto pinf; + } + else { + if (is_pinf(y)) { + minf: + return assign_special(to, VC_MINUS_INFINITY, dir); + } + else if (is_minf(y)) { + pinf: + return assign_special(to, VC_PLUS_INFINITY, dir); + } + else { + native: + return sub(to, x, y, dir); + } + } +} + +template +inline Result +mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) { + if (!ext_to_handle(x) && !ext_to_handle(y)) + goto native; + if (is_nan(x) || is_nan(y)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + if (is_minf(x)) { + switch (sgn_ext(y)) { + case V_LT: + goto pinf; + case V_GT: + goto minf; + default: + goto inf_mul_zero; + } + } + else if (is_pinf(x)) { + switch (sgn_ext(y)) { + case V_LT: + goto minf; + case V_GT: + goto pinf; + default: + goto inf_mul_zero; + } + } + else { + if (is_minf(y)) { + switch (sgn(x)) { + case V_LT: + goto pinf; + case V_GT: + goto minf; + default: + goto inf_mul_zero; + } + } + else if (is_pinf(y)) { + switch (sgn(x)) { + case V_LT: + minf: + return assign_special(to, VC_MINUS_INFINITY, dir); + case V_GT: + pinf: + return assign_special(to, VC_PLUS_INFINITY, dir); + default: + inf_mul_zero: + assert(To_Policy::check_inf_mul_zero); + return assign_special(to, V_INF_MUL_ZERO, ROUND_IGNORE); + } + } + else { + native: + return mul(to, x, y, dir); + } + } +} + + +template +inline Result +add_mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) { + if (!ext_to_handle(to) + && !ext_to_handle(x) && !ext_to_handle(y)) + goto native; + if (is_nan(to) + || is_nan(x) || is_nan(y)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + if (is_minf(x)) { + switch (sgn_ext(y)) { + case V_LT: + goto a_pinf; + case V_GT: + goto a_minf; + default: + goto inf_mul_zero; + } + } + else if (is_pinf(x)) { + switch (sgn_ext(y)) { + case V_LT: + goto a_minf; + case V_GT: + goto a_pinf; + default: + goto inf_mul_zero; + } + } + else { + if (is_minf(y)) { + switch (sgn(x)) { + case V_LT: + goto a_pinf; + case V_GT: + goto a_minf; + default: + goto inf_mul_zero; + } + } + else if (is_pinf(y)) { + switch (sgn(x)) { + case V_LT: + a_minf: + if (CHECK_P(To_Policy::check_inf_add_inf, is_pinf(to))) + goto inf_add_inf; + else + goto minf; + case V_GT: + a_pinf: + if (CHECK_P(To_Policy::check_inf_add_inf, is_minf(to))) { + inf_add_inf: + return assign_special(to, V_INF_ADD_INF, ROUND_IGNORE); + } + else + goto pinf; + default: + inf_mul_zero: + assert(To_Policy::check_inf_mul_zero); + return assign_special(to, V_INF_MUL_ZERO, ROUND_IGNORE); + } + } + else { + if (is_minf(to)) { + minf: + return assign_special(to, VC_MINUS_INFINITY, dir); + } + if (is_pinf(to)) { + pinf: + return assign_special(to, VC_PLUS_INFINITY, dir); + } + native: + return add_mul(to, x, y, dir); + } + } +} + +template +inline Result +sub_mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) { + if (!ext_to_handle(to) + && !ext_to_handle(x) && !ext_to_handle(y)) + goto native; + if (is_nan(to) + || is_nan(x) || is_nan(y)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + if (is_minf(x)) { + switch (sgn_ext(y)) { + case V_LT: + goto a_pinf; + case V_GT: + goto a_minf; + default: + goto inf_mul_zero; + } + } + else if (is_pinf(x)) { + switch (sgn_ext(y)) { + case V_LT: + goto a_minf; + case V_GT: + goto a_pinf; + default: + goto inf_mul_zero; + } + } + else { + if (is_minf(y)) { + switch (sgn(x)) { + case V_LT: + goto a_pinf; + case V_GT: + goto a_minf; + default: + goto inf_mul_zero; + } + } + else if (is_pinf(y)) { + switch (sgn(x)) { + case V_LT: + a_minf: + if (CHECK_P(To_Policy::check_inf_sub_inf, is_minf(to))) + goto inf_sub_inf; + else + goto pinf; + case V_GT: + a_pinf: + if (CHECK_P(To_Policy::check_inf_sub_inf, is_pinf(to))) { + inf_sub_inf: + return assign_special(to, V_INF_SUB_INF, ROUND_IGNORE); + } + else + goto minf; + default: + inf_mul_zero: + assert(To_Policy::check_inf_mul_zero); + return assign_special(to, V_INF_MUL_ZERO, ROUND_IGNORE); + } + } + else { + if (is_minf(to)) { + minf: + return assign_special(to, VC_MINUS_INFINITY, dir); + } + if (is_pinf(to)) { + pinf: + return assign_special(to, VC_PLUS_INFINITY, dir); + } + native: + return sub_mul(to, x, y, dir); + } + } +} + +template +inline Result +div_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) { + if (!ext_to_handle(x) && !ext_to_handle(y)) + goto native; + if (is_nan(x) || is_nan(y)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + if (is_minf(x)) { + if (CHECK_P(To_Policy::check_inf_div_inf, is_minf(y) + || is_pinf(y))) + goto inf_div_inf; + else { + switch (sgn(y)) { + case V_LT: + goto pinf; + case V_GT: + goto minf; + default: + goto div_zero; + } + } + } + else if (is_pinf(x)) { + if (CHECK_P(To_Policy::check_inf_div_inf, is_minf(y) + || is_pinf(y))) { + inf_div_inf: + return assign_special(to, V_INF_DIV_INF, ROUND_IGNORE); + } + else { + switch (sgn(y)) { + case V_LT: + minf: + return assign_special(to, VC_MINUS_INFINITY, dir); + case V_GT: + pinf: + return assign_special(to, VC_PLUS_INFINITY, dir); + default: + div_zero: + assert(To_Policy::check_div_zero); + return assign_special(to, V_DIV_ZERO, ROUND_IGNORE); + } + } + } + else { + if (is_minf(y) || is_pinf(y)) { + to = 0; + return V_EQ; + } + else { + native: + return div(to, x, y, dir); + } + } +} + + +template +inline Result +idiv_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) { + if (!ext_to_handle(x) && !ext_to_handle(y)) + goto native; + if (is_nan(x) || is_nan(y)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + if (is_minf(x)) { + if (CHECK_P(To_Policy::check_inf_div_inf, is_minf(y) + || is_pinf(y))) + goto inf_div_inf; + else { + switch (sgn(y)) { + case V_LT: + goto pinf; + case V_GT: + goto minf; + default: + goto div_zero; + } + } + } + else if (is_pinf(x)) { + if (CHECK_P(To_Policy::check_inf_div_inf, is_minf(y) + || is_pinf(y))) { + inf_div_inf: + return assign_special(to, V_INF_DIV_INF, ROUND_IGNORE); + } + else { + switch (sgn(y)) { + case V_LT: + minf: + return assign_special(to, VC_MINUS_INFINITY, dir); + case V_GT: + pinf: + return assign_special(to, VC_PLUS_INFINITY, dir); + default: + div_zero: + assert(To_Policy::check_div_zero); + return assign_special(to, V_DIV_ZERO, ROUND_IGNORE); + } + } + } + else { + if (is_minf(y) || is_pinf(y)) { + to = 0; + return V_EQ; + } + else { + native: + return idiv(to, x, y, dir); + } + } +} + + +template +inline Result +rem_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) { + if (!ext_to_handle(x) && !ext_to_handle(y)) + goto native; + if (is_nan(x) || is_nan(y)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (CHECK_P(To_Policy::check_inf_mod, is_minf(x) + || is_pinf(x))) + return assign_special(to, V_INF_MOD, ROUND_IGNORE); + else { + if (is_minf(y) || is_pinf(y)) { + to = x; + return V_EQ; + } + else { + native: + return rem(to, x, y, dir); + } + } +} + +template +inline Result +mul2exp_ext(To& to, const From& x, int exp, Rounding_Dir dir) { + if (!ext_to_handle(x)) + goto native; + if (is_nan(x)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x)) + return assign_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(x)) + return assign_special(to, VC_PLUS_INFINITY, dir); + else { + native: + return mul2exp(to, x, exp, dir); + } +} + +template +inline Result +div2exp_ext(To& to, const From& x, int exp, Rounding_Dir dir) { + if (!ext_to_handle(x)) + goto native; + if (is_nan(x)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x)) + return assign_special(to, VC_MINUS_INFINITY, dir); + else if (is_pinf(x)) + return assign_special(to, VC_PLUS_INFINITY, dir); + else { + native: + return div2exp(to, x, exp, dir); + } +} + +template +inline Result +sqrt_ext(To& to, const From& x, Rounding_Dir dir) { + if (!ext_to_handle(x)) + goto native; + if (is_nan(x)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x)) + return assign_special(to, V_SQRT_NEG, ROUND_IGNORE); + else if (is_pinf(x)) + return assign_special(to, VC_PLUS_INFINITY, dir); + else { + native: + return sqrt(to, x, dir); + } +} + +template +inline Result +gcd_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) { + if (is_nan(x) || is_nan(y)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x) || is_pinf(x)) + return abs_ext(to, y, dir); + else if (is_minf(y) || is_pinf(y)) + return abs_ext(to, x, dir); + else + return gcd(to, x, y, dir); +} + +template +inline Result +gcdext_ext(To1& to, To2& s, To3& t, const From1& x, const From2& y, + Rounding_Dir dir) { + if (is_nan(x) || is_nan(y)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x) || is_pinf(x)) { + s = 0; + t = y > 0 ? -1 : 1; + return abs_ext(to, y, dir); + } + else if (is_minf(y) || is_pinf(y)) { + s = x > 0 ? -1 : 1; + t = 0; + return abs_ext(to, x, dir); + } + else + return gcdext(to, s, t, x, y, dir); +} + +template +inline Result +lcm_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) { + if (is_nan(x) || is_nan(y)) + return assign_special(to, VC_NAN, ROUND_IGNORE); + else if (is_minf(x) || is_pinf(x) + || is_minf(y) || is_pinf(y)) + return assign_special(to, VC_PLUS_INFINITY, dir); + else + return lcm(to, x, y, dir); +} + +template +inline Result +cmp_ext(const Type1& x, const Type2& y) { + if (!ext_to_handle(x) && !ext_to_handle(y)) + goto native; + if (is_nan(x) || is_nan(y)) + return V_UNORD_COMP; + else if (is_minf(x)) + return is_minf(y) ? V_EQ : V_LT; + else if (is_pinf(x)) + return is_pinf(y) ? V_EQ : V_GT; + else { + if (is_minf(y)) + return V_GT; + if (is_pinf(y)) + return V_LT; + native: + return cmp(x, y); + } +} + +template +inline bool +lt_ext(const Type1& x, const Type2& y) { + if (!ext_to_handle(x) && !ext_to_handle(y)) + goto native; + if (is_nan(x) || is_nan(y)) + return false; + if (is_pinf(x) || is_minf(y)) + return false; + if (is_minf(x) || is_pinf(y)) + return true; + native: + return lt_p(x, y); +} + +template +inline bool +gt_ext(const Type1& x, const Type2& y) { + return lt_ext(y, x); +} + +template +inline bool +le_ext(const Type1& x, const Type2& y) { + if (!ext_to_handle(x) && !ext_to_handle(y)) + goto native; + if (is_nan(x) || is_nan(y)) + return false; + if (is_minf(x) || is_pinf(y)) + return true; + if (is_pinf(x) || is_minf(y)) + return false; + native: + return le_p(x, y); +} + +template +inline bool +ge_ext(const Type1& x, const Type2& y) { + return le_ext(y, x); +} + +template +inline bool +eq_ext(const Type1& x, const Type2& y) { + if (!ext_to_handle(x) && !ext_to_handle(y)) + goto native; + if (is_nan(x) || is_nan(y)) + return false; + if (is_minf(x)) + return is_minf(y); + if (is_pinf(x)) + return is_pinf(y); + else if (is_minf(y) || is_pinf(y)) + return false; + native: + return eq_p(x, y); +} + +template +inline bool +ne_ext(const Type1& x, const Type2& y) { + return !eq_ext(x, y); +} + +template +inline Result +output_ext(std::ostream& os, const Type& x, + const Numeric_Format& format, Rounding_Dir dir) { + if (!ext_to_handle(x)) + goto native; + if (is_nan(x)) { + os << "nan"; + return VC_NAN; + } + if (is_minf(x)) { + os << "-inf"; + return V_EQ; + } + if (is_pinf(x)) { + os << "+inf"; + return V_EQ; + } + native: + return output(os, x, format, dir); +} + +template +inline Result +input_ext(To& to, std::istream& is, Rounding_Dir dir) { + return input(to, is, dir); +} + +} // namespace Checked + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/checked.defs.hh line 601. */ + +#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 30. */ +#include + +namespace Parma_Polyhedra_Library { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +struct Checked_Number_Default_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, false); + const_bool_nodef(has_infinity, false); + const_bool_nodef(convertible, true); + const_bool_nodef(fpu_check_inexact, true); + const_bool_nodef(check_nan_result, true); + static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE; + static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE; + static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE; + static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_NATIVE; + static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_NATIVE; + static void handle_result(Result r); +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \ingroup PPL_CXX_interface */ +#endif // 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); + // Do not uncomment the following. + // The compile time error on conversions is the expected behavior. + // const_bool_nodef(convertible, false); + const_bool_nodef(fpu_check_inexact, true); + const_bool_nodef(check_nan_result, true); + // Do not uncomment the following. + // The compile time error is the expected behavior. + // static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_UP; + // static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_UP; + // static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_UP; + // static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_UP; + // static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_UP; + static void handle_result(Result r); +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +struct WRD_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); + // Do not uncomment the following. + // The compile time error on conversions is the expected behavior. + // const_bool_nodef(convertible, false); + const_bool_nodef(fpu_check_inexact, true); + const_bool_nodef(check_nan_result, false); + // Do not uncomment the following. + // The compile time error is the expected behavior. + // static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_UP; + // static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_UP; + // static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_UP; + // static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_UP; + // static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_UP; + static void handle_result(Result r); +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! A policy checking for overflows. +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +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::has_quiet_NaN); + const_bool_nodef(has_infinity, std::numeric_limits::has_infinity); + const_bool_nodef(convertible, true); + const_bool_nodef(fpu_check_inexact, true); + const_bool_nodef(check_nan_result, true); +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +struct Native_Checked_From_Wrapper; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +struct Native_Checked_From_Wrapper::value>::type> { + typedef Checked_Number_Transparent_Policy 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 +struct Native_Checked_From_Wrapper > { + typedef P Policy; + static const T& raw_value(const Checked_Number& v) { + return v.raw_value(); + } +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +struct Native_Checked_To_Wrapper; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +struct Native_Checked_To_Wrapper::value>::type> { + typedef Check_Overflow_Policy 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 +struct Native_Checked_To_Wrapper > { + typedef P Policy; + static T& raw_value(Checked_Number& v) { + return v.raw_value(); + } +}; + +/*! \ingroup PPL_CXX_interface */ +template +struct Is_Checked : public False { }; + +/*! \ingroup PPL_CXX_interface */ +template +struct Is_Checked > : public True { }; + +/*! \ingroup PPL_CXX_interface */ +template +struct Is_Native_Or_Checked + : public Bool::value || Is_Checked::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 +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 + Checked_Number(const Checked_Number& 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 + Checked_Number(const From&, Rounding_Dir dir, typename Enable_If::value, bool>::type ignored = false); + + //! Direct initialization from a Checked_Number, default rounding mode. + template + explicit Checked_Number(const Checked_Number& 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 + Checked_Number(const From&, typename Enable_If::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 true; + - whether \p *this is a (positive or negative) infinity, + if \p inf is true; + - the sign of \p *this, + if \p sign is true. + */ + 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 + Checked_Number& operator=(const From& y); + + //! Add and assign operator. + template + Checked_Number& operator+=(const Checked_Number& y); + + //! Add and assign operator. + Checked_Number& operator+=(const T& y); + + //! Add and assign operator. + template + typename Enable_If::value, + Checked_Number&>::type + operator+=(const From& y); + + //! Subtract and assign operator. + template + Checked_Number& operator-=(const Checked_Number& y); + + //! Subtract and assign operator. + Checked_Number& operator-=(const T& y); + + //! Subtract and assign operator. + template + typename Enable_If::value, + Checked_Number&>::type + operator-=(const From& y); + + //! Multiply and assign operator. + template + Checked_Number& operator*=(const Checked_Number& y); + + //! Multiply and assign operator. + Checked_Number& operator*=(const T& y); + + //! Multiply and assign operator. + template + typename Enable_If::value, + Checked_Number&>::type + operator*=(const From& y); + + //! Divide and assign operator. + template + Checked_Number& operator/=(const Checked_Number& y); + + //! Divide and assign operator. + Checked_Number& operator/=(const T& y); + + //! Divide and assign operator. + template + typename Enable_If::value, + Checked_Number&>::type + operator/=(const From& y); + + //! Compute remainder and assign operator. + template + Checked_Number& operator%=(const Checked_Number& y); + + //! Compute remainder and assign operator. + Checked_Number& operator%=(const T& y); + + //! Compute remainder and assign operator. + template + typename Enable_If::value, + Checked_Number& >::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 +struct Slow_Copy > : public Bool::value> {}; + +/*! \relates Checked_Number */ +template +typename Enable_If::value, bool>::type +is_not_a_number(const T& x); + +/*! \relates Checked_Number */ +template +typename Enable_If::value, bool>::type +is_minus_infinity(const T& x); + +/*! \relates Checked_Number */ +template +typename Enable_If::value, bool>::type +is_plus_infinity(const T& x); + +/*! \relates Checked_Number */ +template +typename Enable_If::value, int>::type +is_infinity(const T& x); + +/*! \relates Checked_Number */ +template +typename Enable_If::value, bool>::type +is_integer(const T& x); + +/*! \relates Checked_Number */ +template +typename Enable_If::value && Is_Special::value, Result>::type +construct(To& to, const From& x, Rounding_Dir dir); + +/*! \relates Checked_Number */ +template +typename Enable_If::value && Is_Special::value, Result>::type +assign_r(To& to, const From& x, Rounding_Dir dir); + +/*! \relates Checked_Number */ +template +typename Enable_If::value, Result>::type +assign_r(To& to, const char* x, Rounding_Dir dir); + +/*! \relates Checked_Number */ +template +typename Enable_If::value, Result>::type +assign_r(To& to, char* x, Rounding_Dir dir); + +#define FUNC1(name) \ +template \ +typename Enable_If::value \ + && Is_Native_Or_Checked::value, \ + Result>::type \ +name(To& to, const From& x, Rounding_Dir dir); + +FUNC1(assign_r) +FUNC1(floor_assign_r) +FUNC1(ceil_assign_r) +FUNC1(trunc_assign_r) +FUNC1(neg_assign_r) +FUNC1(abs_assign_r) +FUNC1(sqrt_assign_r) + +#undef FUNC1 + +#define FUNC1(name) \ +template \ +typename Enable_If::value \ + && Is_Native_Or_Checked::value, \ + Result>::type \ +name(To& to, const From& x, int exp, Rounding_Dir dir); + +FUNC1(mul2exp_assign_r) +FUNC1(div2exp_assign_r) + +#undef FUNC1 + +#define FUNC2(name) \ +template \ +typename Enable_If::value \ + && Is_Native_Or_Checked::value \ + && Is_Native_Or_Checked::value, \ + Result>::type \ +name(To& to, const From1& x, const From2& y, Rounding_Dir dir); + +FUNC2(add_assign_r) +FUNC2(sub_assign_r) +FUNC2(mul_assign_r) +FUNC2(div_assign_r) +FUNC2(idiv_assign_r) +FUNC2(rem_assign_r) +FUNC2(gcd_assign_r) +FUNC2(lcm_assign_r) +FUNC2(add_mul_assign_r) +FUNC2(sub_mul_assign_r) + +#undef FUNC2 + +#define FUNC4(name) \ +template \ +typename Enable_If::value \ + && Is_Native_Or_Checked::value \ + && Is_Native_Or_Checked::value \ + && Is_Native_Or_Checked::value \ + && Is_Native_Or_Checked::value, \ + Result>::type \ +name(To1& to, To2& s, To3& t, \ + const From1& x, const From2& y, \ + Rounding_Dir dir); + +FUNC4(gcdext_assign_r) + +#undef 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 +size_t +total_memory_in_bytes(const Checked_Number& x); + +//! Returns the size in bytes of the memory managed by \p x. +/*! \relates Checked_Number */ +template +memory_size_type +external_memory_in_bytes(const Checked_Number& x); + +//@} // Memory Size Inspection Functions + +//! \name Arithmetic Operators +//@{ + +//! Unary plus operator. +/*! \relates Checked_Number */ +template +Checked_Number +operator+(const Checked_Number& x); + +//! Unary minus operator. +/*! \relates Checked_Number */ +template +Checked_Number +operator-(const Checked_Number& x); + +//! Assigns to \p x largest integral value not greater than \p x. +/*! \relates Checked_Number */ +template +void +floor_assign(Checked_Number& x); + +//! Assigns to \p x largest integral value not greater than \p y. +/*! \relates Checked_Number */ +template +void +floor_assign(Checked_Number& x, const Checked_Number& y); + +//! Assigns to \p x smallest integral value not less than \p x. +/*! \relates Checked_Number */ +template +void +ceil_assign(Checked_Number& x); + +//! Assigns to \p x smallest integral value not less than \p y. +/*! \relates Checked_Number */ +template +void +ceil_assign(Checked_Number& x, const Checked_Number& y); + +//! Round \p x to the nearest integer not larger in absolute value. +/*! \relates Checked_Number */ +template +void +trunc_assign(Checked_Number& x); + +//! Assigns to \p x the value of \p y rounded to the nearest integer not larger in absolute value. +/*! \relates Checked_Number */ +template +void +trunc_assign(Checked_Number& x, const Checked_Number& y); + +//! Assigns to \p x its negation. +/*! \relates Checked_Number */ +template +void +neg_assign(Checked_Number& x); + +//! Assigns to \p x the negation of \p y. +/*! \relates Checked_Number */ +template +void +neg_assign(Checked_Number& x, const Checked_Number& y); + +//! Assigns to \p x its absolute value. +/*! \relates Checked_Number */ +template +void +abs_assign(Checked_Number& x); + +//! Assigns to \p x the absolute value of \p y. +/*! \relates Checked_Number */ +template +void +abs_assign(Checked_Number& x, const Checked_Number& y); + +//! Assigns to \p x the value x + y * z. +/*! \relates Checked_Number */ +template +void +add_mul_assign(Checked_Number& x, + const Checked_Number& y, + const Checked_Number& z); + +//! Assigns to \p x the value x - y * z. +/*! \relates Checked_Number */ +template +void +sub_mul_assign(Checked_Number& x, + const Checked_Number& y, + const Checked_Number& z); + +//! Assigns to \p x the greatest common divisor of \p y and \p z. +/*! \relates Checked_Number */ +template +void +gcd_assign(Checked_Number& x, + const Checked_Number& y, + const Checked_Number& 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 +void +gcdext_assign(Checked_Number& x, + Checked_Number& s, + Checked_Number& t, + const Checked_Number& y, + const Checked_Number& z); + +//! Assigns to \p x the least common multiple of \p y and \p z. +/*! \relates Checked_Number */ +template +void +lcm_assign(Checked_Number& x, + const Checked_Number& y, + const Checked_Number& z); + +/*! \brief + If \p z divides \p y, assigns to \p x the quotient of the integer + division of \p y and \p z. + + \relates Checked_Number + The behavior is undefined if \p z does not divide \p y. +*/ +template +void +exact_div_assign(Checked_Number& x, + const Checked_Number& y, + const Checked_Number& z); + +//! Assigns to \p x the integer square root of \p y. +/*! \relates Checked_Number */ +template +void sqrt_assign(Checked_Number& x, + const Checked_Number& y); + +//@} // Arithmetic Operators + + +//! \name Relational Operators and Comparison Functions +//@{ + +//! Equality operator. +/*! \relates Checked_Number */ +template +inline +typename Enable_If::value + && Is_Native_Or_Checked::value + && (Is_Checked::value || Is_Checked::value), + bool>::type +operator==(const T1& x, const T2& y); + +template +inline typename Enable_If::value + && Is_Native_Or_Checked::value, + bool>::type +equal(const T1& x, const T2& y); + +//! Disequality operator. +/*! \relates Checked_Number */ +template +inline +typename Enable_If::value + && Is_Native_Or_Checked::value + && (Is_Checked::value || Is_Checked::value), + bool>::type +operator!=(const T1& x, const T2& y); + +template +inline typename Enable_If::value + && Is_Native_Or_Checked::value, + bool>::type +not_equal(const T1& x, const T2& y); + +//! Greater than or equal to operator. +/*! \relates Checked_Number */ +template +inline +typename Enable_If::value + && Is_Native_Or_Checked::value + && (Is_Checked::value || Is_Checked::value), + bool>::type +operator>=(const T1& x, const T2& y); + +template +inline typename Enable_If::value + && Is_Native_Or_Checked::value, + bool>::type +greater_or_equal(const T1& x, const T2& y); + +//! Greater than operator. +/*! \relates Checked_Number */ +template +inline +typename Enable_If::value + && Is_Native_Or_Checked::value + && (Is_Checked::value || Is_Checked::value), + bool>::type +operator>(const T1& x, const T2& y); + +template +inline typename Enable_If::value + && Is_Native_Or_Checked::value, + bool>::type +greater_than(const T1& x, const T2& y); + +//! Less than or equal to operator. +/*! \relates Checked_Number */ +template +inline +typename Enable_If::value + && Is_Native_Or_Checked::value + && (Is_Checked::value || Is_Checked::value), + bool>::type +operator<=(const T1& x, const T2& y); + +template +inline typename Enable_If::value + && Is_Native_Or_Checked::value, + bool>::type +less_or_equal(const T1& x, const T2& y); + +//! Less than operator. +/*! \relates Checked_Number */ +template +inline +typename Enable_If::value + && Is_Native_Or_Checked::value + && (Is_Checked::value || Is_Checked::value), + bool>::type +operator<(const T1& x, const T2& y); + +template +inline typename Enable_If::value + && Is_Native_Or_Checked::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 +inline typename Enable_If::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 +inline typename Enable_If::value + && Is_Native_Or_Checked::value, + int>::type +cmp(const From1& x, const From2& y); + +//@} // Relational Operators and Comparison Functions + +//! \name Input-Output Operators +//@{ + +/*! \relates Checked_Number */ +template +typename Enable_If::value, Result>::type +output(std::ostream& os, + const T& x, + const Numeric_Format& fmt, + Rounding_Dir dir); + +//! Output operator. +/*! \relates Checked_Number */ +template +std::ostream& +operator<<(std::ostream& os, const Checked_Number& x); + +//! Ascii dump for native or checked. +template +typename Enable_If::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 34976098, + -77 and +13; + - base-10 integer numbers in scientific notation as 15e2 + and 15*^2 (both meaning \f$15 \cdot 10^2 = 1500\f$), + 9200e-2 and -18*^+11111111111111111; + - base-10 rational numbers in fraction notation as + 15/3 and 15/-3; + - base-10 rational numbers in fraction/scientific notation as + 15/30e-1 (meaning \f$5\f$) and 15*^-3/29e2 + (meaning \f$3/580000\f$); + - base-10 rational numbers in floating point notation as + 71.3 (meaning \f$713/10\f$) and + -0.123456 (meaning \f$-1929/15625\f$); + - base-10 rational numbers in floating point scientific notation as + 2.2e-1 (meaning \f$11/50\f$) and -2.20001*^+3 + (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 + 2^^11 (meaning \f$3\f$), + 36^^z (meaning \f$35\f$), + 36^^xyz (meaning \f$44027\f$), + 2^^11.1 (meaning \f$7/2\f$), + 10^^2e3 (meaning \f$2000\f$), + 8^^2e3 (meaning \f$1024\f$), + 8^^2.1e3 (meaning \f$1088\f$), + 8^^20402543.120347e7 (meaning \f$9073863231288\f$), + 8^^2.1 (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 e is interpreted as a digit, so that + 16^^1e2 (meaning \f$482\f$) is different from + 16^^1*^2 (meaning \f$256\f$); + - the C-style hexadecimal prefix 0x is interpreted as + the Mathematica-style prefix 16^^; + - special values like inf and +inf + (meaning \f$+\infty\f$), -inf (meaning \f$-\infty\f$), + and nan (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 + case insensitive, that the syntactic category + BDIGIT is further restricted by the current base + and that for all bases above 14, any e 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 +number : NAN INF : 'inf' + | SIGN INF ; + | INF + | num NAN : 'nan' + | num DIV num ; + ; + SIGN : '-' +num : unum | '+' + | SIGN unum ; + +unum : unum1 EXP : 'e' + | HEX unum1 | '*^' + | base BASE unum1 ; + ; + POINT : '.' +unum1 : mantissa ; + | mantissa EXP exponent + ; DIV : '/' + ; +mantissa: bdigits + | POINT bdigits MINUS : '-' + | bdigits POINT ; + | bdigits POINT bdigits + ; PLUS : '+' + ; +exponent: SIGN digits + | digits HEX : '0x' + ; ; + +bdigits : BDIGIT BASE : '^^' + | bdigits BDIGIT ; + ; + DIGIT : '0' .. '9' +digits : DIGIT ; + | digits DIGIT + ; BDIGIT : '0' .. '9' + | 'a' .. 'z' + ; +\endcode +*/ +template +typename Enable_If::value, Result>::type +input(T& x, std::istream& is, Rounding_Dir dir); + +//! Input operator. +/*! \relates Checked_Number */ +template +std::istream& +operator>>(std::istream& is, Checked_Number& x); + +//! Ascii load for native or checked. +template +typename Enable_If::value, bool>::type +ascii_load(std::ostream& s, T& t); + +//@} // Input-Output Operators + +void throw_result_exception(Result r); + +template +T +plus_infinity(); + +template +T +minus_infinity(); + +template +T +not_a_number(); + +//! Swaps \p x with \p y. +/*! \relates Checked_Number */ +template +void swap(Checked_Number& x, Checked_Number& y); + +template +struct FPU_Related > : public FPU_Related {}; + +template +void maybe_reset_fpu_inexact(); + +template +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/globals.defs.hh line 1. */ +/* Declarations of global objects. +*/ + + +/* Automatically generated from PPL source file ../src/globals.defs.hh line 31. */ +#include +#include + +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 +/*! \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 +inline typename Enable_If::value, void>::type +swap(T&, T&) { + PPL_COMPILE_TIME_CHECK(!Slow_Copy::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_TEMP0(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); + +//! 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 make the Grid covering box constructor unique. +*/ +struct From_Covering_Box { +}; + +//! 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 namespace IO_Operators; \ + std::cerr << *this; \ + } + +#define PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(class_name) \ + void \ + Parma_Polyhedra_Library::class_name::ascii_dump() const { \ + ascii_dump(std::cerr); \ + } \ + \ + void \ + Parma_Polyhedra_Library::class_name::print() const { \ + std::cerr << "No user level output operator defined " \ + << "for class " PPL_XSTR(class_name) << "." << std::endl; \ + } + +#define PPL_OUTPUT_TEMPLATE_DEFINITIONS(type_symbol, class_prefix) \ + template \ + void \ + class_prefix::ascii_dump() const { \ + ascii_dump(std::cerr); \ + } \ + \ + template \ + void \ + class_prefix::print() const { \ + using namespace IO_Operators; \ + std::cerr << *this; \ + } + +#define PPL_OUTPUT_2_PARAM_TEMPLATE_DEFINITIONS(type_symbol1, \ + type_symbol2, \ + class_prefix) \ + template \ + void \ + class_prefix::ascii_dump() const { \ + ascii_dump(std::cerr); \ + } \ + \ + template \ + void \ + class_prefix::print() const { \ + using namespace IO_Operators; \ + std::cerr << *this; \ + } + +#define PPL_OUTPUT_3_PARAM_TEMPLATE_DEFINITIONS(type_symbol1, \ + type_symbol2, \ + type_symbol3, \ + class_prefix) \ + template \ + void \ + class_prefix::ascii_dump() \ + const { \ + ascii_dump(std::cerr); \ + } \ + \ + template \ + void \ + class_prefix::print() \ + const { \ + using namespace IO_Operators; \ + std::cerr << *this; \ + } + +#define PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(type_symbol, class_prefix) \ + template \ + void \ + class_prefix::ascii_dump() const { \ + ascii_dump(std::cerr); \ + } \ + \ + template \ + void \ + class_prefix::print() const { \ + std::cerr << "No user level output operator defined " \ + << "for " PPL_XSTR(class_prefix) << "." << std::endl; \ + } + +template +struct Fit : public False { +}; + +template +struct Fit::value>::type> { + enum { + value = (v >= static_cast(C_Integer::min) + && v <= static_cast(C_Integer::max)) + }; +}; + +template +struct TConstant { + static const T value = v; +}; + + +template +const T TConstant::value; + +template +struct Constant_ : public TConstant { +}; + +template +struct Constant_::smaller_signed_type, v>::value + && (prefer_signed || + !Fit::smaller_unsigned_type, v>::value))>::type> + : public Constant_::smaller_signed_type, v, prefer_signed> { +}; + +template +struct Constant_::smaller_unsigned_type, v>::value + && (!prefer_signed || + !Fit::smaller_signed_type, v>::value))>::type> + : public Constant_::smaller_unsigned_type, v, prefer_signed> { +}; + +template +struct Constant : public Constant_ { +}; + +//! \name Memory Size Inspection Functions +//@{ + +#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 Enable_If::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 Enable_If::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); + +//@} // Memory Size Inspection Functions + + +template +struct Has_OK : public False { }; + +template +struct Has_OK::type> + : public True { +}; + +template +inline typename Enable_If::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) + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/globals.inlines.hh line 1. */ +/* Implementation of global objects: inline functions. +*/ + + +#include +#include + +namespace Parma_Polyhedra_Library { + +inline dimension_type +not_a_dimension() { + return std::numeric_limits::max(); +} + +inline +Throwable::~Throwable() { +} + +inline void +maybe_abandon() { + if (const Throwable* p = abandon_expensive_computations) + p->throw_me(); +} + +inline dimension_type +compute_capacity(const dimension_type requested_size, + const dimension_type maximum_size) { + assert(requested_size <= maximum_size); + // Speculation factor 2. + return (requested_size < maximum_size / 2) + ? 2*(requested_size + 1) + : maximum_size; + // Speculation factor 1.5. + // return (maximum_size - requested_size > requested_size/2) + // ? requested_size + requested_size/2 + 1 + // : maximum_size; +} + +template +inline typename +Enable_If::value, memory_size_type>::type +external_memory_in_bytes(const T&) { + return 0; +} + +template +inline typename +Enable_If::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 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); +} + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/globals.defs.hh line 387. */ + +/* Automatically generated from PPL source file ../src/Checked_Number.inlines.hh line 27. */ +#include +#include + +namespace Parma_Polyhedra_Library { + +inline Rounding_Dir +rounding_dir(Rounding_Dir dir) { + if (dir == ROUND_NOT_NEEDED) { +#ifdef DEBUG_ROUND_NOT_NEEDED + return ROUND_DIRECT & ROUND_FPU_CHECK_INEXACT; +#else + return ROUND_IGNORE; +#endif + } + return dir; +} + +inline Result +check_result(Result r, Rounding_Dir dir) { + if (dir == ROUND_NOT_NEEDED && !is_special(r)) { +#ifdef DEBUG_ROUND_NOT_NEEDED + // FIXME: this is wrong. If an overflow happens the Result may be + // V_LT or V_GT. What's the better way to cope with that? + + // To solve this we need to clarify if ROUND_NOT_NEEDED is + // specified to grant library that the result will be exact _and_ + // not overflowing or the result will be exact _or_ overflowling. + assert(r == V_EQ); +#else + return V_EQ; +#endif + } + return r; +} + + +template +inline void +Checked_Number_Transparent_Policy::handle_result(Result) { +} + +inline void +Checked_Number_Default_Policy::handle_result(Result r) { + if (is_special(r)) + throw_result_exception(r); +} + +inline void +Extended_Number_Policy::handle_result(Result r) { + if (is_special(r)) + throw_result_exception(r); +} + +inline void +WRD_Extended_Number_Policy::handle_result(Result r) { + if (is_special(r)) + throw_result_exception(r); +} + +template +inline +Checked_Number::Checked_Number() + : v(0) { +} + +template +inline +Checked_Number::Checked_Number(const Checked_Number& y) { + // TODO: avoid default construction of value member. + Checked::copy(v, y.raw_value()); +} + +template +template +inline +Checked_Number +::Checked_Number(const Checked_Number& y, + Rounding_Dir dir) { + // TODO: avoid default construction of value member. + Policy::handle_result(check_result(Checked::assign_ext + (v, + y.raw_value(), + rounding_dir(dir)), + dir) + ); +} + +template +template +inline +Checked_Number +::Checked_Number(const Checked_Number& y) { + // TODO: avoid default construction of value member. + Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR; + Policy::handle_result(check_result(Checked::assign_ext + (v, + y.raw_value(), + rounding_dir(dir)), + dir)); +} + +// TODO: avoid default construction of value member. +#define DEF_CTOR(type) \ +template \ +inline \ +Checked_Number::Checked_Number(const type x, Rounding_Dir dir) { \ + Policy::handle_result \ + (check_result(Checked::assign_ext > \ + (v, x, rounding_dir(dir)), \ + dir)); \ +} \ +template \ +inline \ +Checked_Number::Checked_Number(const type x) { \ + Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR; \ + Policy::handle_result \ + (check_result(Checked::assign_ext > \ + (v, x, rounding_dir(dir)), \ + dir)); \ +} + +#define PPL_COND_0(...) +#define PPL_COND_1(...) __VA_ARGS__ +#define PPL_COND_(if, ...) PPL_COND_##if(__VA_ARGS__) +#define PPL_COND(if, ...) PPL_COND_(if, __VA_ARGS__) + +DEF_CTOR(signed char) +DEF_CTOR(signed short) +DEF_CTOR(signed int) +DEF_CTOR(signed long) +DEF_CTOR(signed long long) +DEF_CTOR(unsigned char) +DEF_CTOR(unsigned short) +DEF_CTOR(unsigned int) +DEF_CTOR(unsigned long) +DEF_CTOR(unsigned long long) +PPL_COND(PPL_SUPPORTED_FLOAT, DEF_CTOR(float)) +PPL_COND(PPL_SUPPORTED_DOUBLE, DEF_CTOR(double)) +PPL_COND(PPL_SUPPORTED_LONG_DOUBLE, DEF_CTOR(long double)) +DEF_CTOR(mpq_class&) +DEF_CTOR(mpz_class&) + +#undef DEF_CTOR + +#undef PPL_COND +#undef PPL_COND_ +#undef PPL_COND_1 +#undef PPL_COND_0 + +template +inline +Checked_Number::Checked_Number(const char* x, Rounding_Dir dir) { + std::istringstream s(x); + Policy::handle_result(check_result(Checked::input(v, + s, + rounding_dir(dir)), + dir)); +} + +template +inline +Checked_Number::Checked_Number(const char* x) { + std::istringstream s(x); + Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR; + Policy::handle_result(check_result(Checked::input(v, + s, + rounding_dir(dir)), + dir)); +} + +template +template +inline +Checked_Number::Checked_Number(const From&, Rounding_Dir dir, typename Enable_If::value, bool>::type) { + Policy::handle_result(check_result(Checked::assign_special(v, + From::code, + rounding_dir(dir)), + dir)); +} + +template +template +inline +Checked_Number::Checked_Number(const From&, typename Enable_If::value, bool>::type) { + Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR; + Policy::handle_result(check_result(Checked::assign_special(v, + From::code, + rounding_dir(dir)), + dir)); +} + +template +inline typename Enable_If::value && Is_Special::value, Result>::type +assign_r(To& to, const From&, Rounding_Dir dir) { + return check_result(Checked::assign_special + ::Policy>(Native_Checked_To_Wrapper::raw_value(to), + From::code, + rounding_dir(dir)), + dir); +} + +template +inline typename Enable_If::value && Is_Special::value, Result>::type +construct(To& to, const From&, Rounding_Dir dir) { + return check_result(Checked::construct_special + ::Policy>(Native_Checked_To_Wrapper::raw_value(to), + From::code, + rounding_dir(dir)), + dir); +} + +template +inline typename Enable_If::value, bool>::type +is_minus_infinity(const T& x) { + return Checked::is_minf + ::Policy>(Native_Checked_From_Wrapper::raw_value(x)); +} + +template +inline typename Enable_If::value, bool>::type +is_plus_infinity(const T& x) { + return Checked::is_pinf + ::Policy>(Native_Checked_From_Wrapper::raw_value(x)); +} + +template +inline typename Enable_If::value, int>::type +is_infinity(const T& x) { + return is_minus_infinity(x) ? -1 : is_plus_infinity(x) ? 1 : 0; +} + +template +inline typename Enable_If::value, bool>::type +is_not_a_number(const T& x) { + return Checked::is_nan + ::Policy>(Native_Checked_From_Wrapper::raw_value(x)); +} + +template +inline typename Enable_If::value, bool>::type +is_integer(const T& x) { + return Checked::is_int + ::Policy>(Native_Checked_From_Wrapper::raw_value(x)); +} + +template +inline +Checked_Number::operator T() const { + if (Policy::convertible) + return v; +} + +template +inline T& +Checked_Number::raw_value() { + return v; +} + +template +inline const T& +Checked_Number::raw_value() const { + return v; +} + +/*! \relates Checked_Number */ +template +inline const T& +raw_value(const Checked_Number& x) { + return x.raw_value(); +} + +/*! \relates Checked_Number */ +template +inline T& +raw_value(Checked_Number& x) { + return x.raw_value(); +} + +template +inline bool +Checked_Number::OK() const { + return true; +} + +template +inline Result +Checked_Number::classify(bool nan, bool inf, bool sign) const { + return Checked::classify(v, nan, inf, sign); +} + +template +inline bool +is_not_a_number(const Checked_Number& x) { + return Checked::is_nan(x.raw_value()); +} + +template +inline bool +is_minus_infinity(const Checked_Number& x) { + return Checked::is_minf(x.raw_value()); +} + +template +inline bool +is_plus_infinity(const Checked_Number& x) { + return Checked::is_pinf(x.raw_value()); +} + +/*! \relates Checked_Number */ +template +inline memory_size_type +total_memory_in_bytes(const Checked_Number& x) { + return total_memory_in_bytes(x.raw_value()); +} + +/*! \relates Checked_Number */ +template +inline memory_size_type +external_memory_in_bytes(const Checked_Number& x) { + return external_memory_in_bytes(x.raw_value()); +} + + +/*! \relates Checked_Number */ +template +inline typename Enable_If::value, Result>::type +assign_r(To& to, const char* x, Rounding_Dir dir) { + std::istringstream s(x); + return check_result(Checked::input + ::Policy>(Native_Checked_To_Wrapper::raw_value(to), + s, + rounding_dir(dir)), + dir); +} + +#define FUNC1(name, func) \ +template \ +inline typename Enable_If::value \ + && Is_Native_Or_Checked::value, \ + Result>::type \ +name(To& to, const From& x, Rounding_Dir dir) { \ + return \ + check_result(Checked::func \ + ::Policy, \ + typename Native_Checked_From_Wrapper \ + ::Policy>(Native_Checked_To_Wrapper::raw_value(to), \ + Native_Checked_From_Wrapper::raw_value(x), \ + rounding_dir(dir)), dir); \ +} + +FUNC1(construct, construct_ext) +FUNC1(assign_r, assign_ext) +FUNC1(floor_assign_r, floor_ext) +FUNC1(ceil_assign_r, ceil_ext) +FUNC1(trunc_assign_r, trunc_ext) +FUNC1(neg_assign_r, neg_ext) +FUNC1(abs_assign_r, abs_ext) +FUNC1(sqrt_assign_r, sqrt_ext) + +#undef FUNC1 + +#define FUNC1(name, func) \ +template \ +inline typename Enable_If::value \ + && Is_Native_Or_Checked::value, \ + Result>::type \ +name(To& to, const From& x, int exp, Rounding_Dir dir) { \ + return \ + check_result(Checked::func \ + ::Policy, \ + typename Native_Checked_From_Wrapper \ + ::Policy>(Native_Checked_To_Wrapper::raw_value(to), \ + Native_Checked_From_Wrapper::raw_value(x), \ + exp, \ + rounding_dir(dir)), \ + dir); \ +} + +FUNC1(mul2exp_assign_r, mul2exp_ext) +FUNC1(div2exp_assign_r, div2exp_ext) + +#undef FUNC1 + +#define FUNC2(name, func) \ +template \ +inline typename Enable_If::value \ + && Is_Native_Or_Checked::value \ + && Is_Native_Or_Checked::value, \ + Result>::type \ +name(To& to, const From1& x, const From2& y, Rounding_Dir dir) { \ + return \ + check_result(Checked::func \ + ::Policy, \ + typename Native_Checked_From_Wrapper \ + ::Policy, \ + typename Native_Checked_From_Wrapper \ + ::Policy>(Native_Checked_To_Wrapper::raw_value(to), \ + Native_Checked_From_Wrapper::raw_value(x), \ + Native_Checked_From_Wrapper::raw_value(y), \ + rounding_dir(dir)), \ + dir); \ +} + +FUNC2(add_assign_r, add_ext) +FUNC2(sub_assign_r, sub_ext) +FUNC2(mul_assign_r, mul_ext) +FUNC2(div_assign_r, div_ext) +FUNC2(idiv_assign_r, idiv_ext) +FUNC2(rem_assign_r, rem_ext) +FUNC2(gcd_assign_r, gcd_ext) +FUNC2(lcm_assign_r, lcm_ext) +FUNC2(add_mul_assign_r, add_mul_ext) +FUNC2(sub_mul_assign_r, sub_mul_ext) + +#undef FUNC2 + +#define FUNC4(name, func) \ +template \ +inline typename Enable_If::value \ + && Is_Native_Or_Checked::value \ + && Is_Native_Or_Checked::value \ + && Is_Native_Or_Checked::value \ + && Is_Native_Or_Checked::value, \ + Result>::type \ +name(To1& to, To2& s, To3& t, const From1& x, const From2& y, \ + Rounding_Dir dir) { \ + return \ + check_result \ + (Checked::func::Policy, \ + typename Native_Checked_To_Wrapper::Policy, \ + typename Native_Checked_To_Wrapper::Policy, \ + typename Native_Checked_From_Wrapper::Policy, \ + typename Native_Checked_From_Wrapper::Policy> \ + (Native_Checked_To_Wrapper::raw_value(to), \ + Native_Checked_To_Wrapper::raw_value(s), \ + Native_Checked_To_Wrapper::raw_value(t), \ + Native_Checked_From_Wrapper::raw_value(x), \ + Native_Checked_From_Wrapper::raw_value(y), \ + rounding_dir(dir)), \ + dir); \ +} + +FUNC4(gcdext_assign_r, gcdext_ext) + +#undef FUNC4 + +#define DEF_INCREMENT(f, fun) \ +template \ +inline Checked_Number& \ +Checked_Number::f() { \ + Policy::handle_result(fun(*this, *this, T(1), \ + Policy::ROUND_DEFAULT_OPERATOR)); \ + return *this; \ +} \ +template \ +inline Checked_Number \ +Checked_Number::f(int) {\ + T r = v;\ + Policy::handle_result(fun(*this, *this, T(1), \ + Policy::ROUND_DEFAULT_OPERATOR)); \ + return r;\ +} + +DEF_INCREMENT(operator ++, add_assign_r) +DEF_INCREMENT(operator --, sub_assign_r) + +#undef DEF_INCREMENT + +template +inline Checked_Number& +Checked_Number::operator=(const Checked_Number& y) { + Checked::copy(v, y.raw_value()); + return *this; +} +template +template +inline Checked_Number& +Checked_Number::operator=(const From& y) { + Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_OPERATOR)); + return *this; +} + +#define DEF_BINARY_OP_ASSIGN(f, fun) \ +template \ +template \ +inline Checked_Number& \ +Checked_Number::f(const Checked_Number& y) { \ + Policy::handle_result(fun(*this, *this, y, \ + Policy::ROUND_DEFAULT_OPERATOR)); \ + return *this; \ +} \ +template \ +inline Checked_Number& \ +Checked_Number::f(const T& y) { \ + Policy::handle_result(fun(*this, *this, y, \ + Policy::ROUND_DEFAULT_OPERATOR)); \ + return *this; \ +} \ +template \ +template \ +inline typename Enable_If::value, \ + Checked_Number& >::type \ +Checked_Number::f(const From& y) { \ + Checked_Number cy(y); \ + Policy::handle_result(fun(*this, *this, cy, \ + Policy::ROUND_DEFAULT_OPERATOR)); \ + return *this; \ +} + +DEF_BINARY_OP_ASSIGN(operator +=, add_assign_r) +DEF_BINARY_OP_ASSIGN(operator -=, sub_assign_r) +DEF_BINARY_OP_ASSIGN(operator *=, mul_assign_r) +DEF_BINARY_OP_ASSIGN(operator /=, div_assign_r) +DEF_BINARY_OP_ASSIGN(operator %=, rem_assign_r) + +#undef DEF_BINARY_OP_ASSIGN + +#define DEF_BINARY_OP(f, fun) \ +template \ +inline Checked_Number \ +f(const Checked_Number& x, const Checked_Number& y) { \ + Checked_Number r; \ + Policy::handle_result(fun(r, x, y, Policy::ROUND_DEFAULT_OPERATOR)); \ + return r; \ +} \ +template \ +inline \ +typename Enable_If::value, Checked_Number >::type \ +f(const Type& x, const Checked_Number& y) { \ + Checked_Number r(x); \ + Policy::handle_result(fun(r, r, y, Policy::ROUND_DEFAULT_OPERATOR)); \ + return r; \ +} \ +template \ +inline \ +typename Enable_If::value, Checked_Number >::type \ +f(const Checked_Number& x, const Type& y) { \ + Checked_Number r(y); \ + Policy::handle_result(fun(r, x, r, Policy::ROUND_DEFAULT_OPERATOR)); \ + return r; \ +} + +DEF_BINARY_OP(operator +, add_assign_r) +DEF_BINARY_OP(operator -, sub_assign_r) +DEF_BINARY_OP(operator *, mul_assign_r) +DEF_BINARY_OP(operator /, div_assign_r) +DEF_BINARY_OP(operator %, rem_assign_r) + +#undef DEF_BINARY_OP + +#define DEF_COMPARE(f, fun) \ +template \ +inline \ +typename Enable_If::value \ + && Is_Native_Or_Checked::value \ + && (Is_Checked::value || Is_Checked::value), \ + bool>::type \ +f(const T1& x, const T2& y) { \ + return Checked::fun::Policy, \ + typename Native_Checked_From_Wrapper::Policy> \ + (Native_Checked_From_Wrapper::raw_value(x), \ + Native_Checked_From_Wrapper::raw_value(y)); \ +} + +DEF_COMPARE(operator ==, eq_ext) +DEF_COMPARE(operator !=, ne_ext) +DEF_COMPARE(operator >=, ge_ext) +DEF_COMPARE(operator >, gt_ext) +DEF_COMPARE(operator <=, le_ext) +DEF_COMPARE(operator <, lt_ext) + +#undef DEF_COMPARE + +#define DEF_COMPARE(f, fun) \ +template \ +inline typename Enable_If::value \ + && Is_Native_Or_Checked::value, \ + bool>::type \ +f(const T1& x, const T2& y) { \ + return Checked::fun::Policy, \ + typename Native_Checked_From_Wrapper::Policy> \ + (Native_Checked_From_Wrapper::raw_value(x), \ + Native_Checked_From_Wrapper::raw_value(y)); \ +} + +DEF_COMPARE(equal, eq_ext) +DEF_COMPARE(not_equal, ne_ext) +DEF_COMPARE(greater_or_equal, ge_ext) +DEF_COMPARE(greater_than, gt_ext) +DEF_COMPARE(less_or_equal, le_ext) +DEF_COMPARE(less_than, lt_ext) + +#undef DEF_COMPARE + +/*! \relates Checked_Number */ +template +inline Checked_Number +operator+(const Checked_Number& x) { + return x; +} + +/*! \relates Checked_Number */ +template +inline Checked_Number +operator-(const Checked_Number& x) { + Checked_Number r; + Policy::handle_result(neg_assign_r(r, x, Policy::ROUND_DEFAULT_OPERATOR)); + return r; +} + +#define PPL_DEF_ASSIGN_FUN2_1(f, fun) \ +template \ +inline void \ +f(Checked_Number& x) { \ + Policy::handle_result(fun(x, x, Policy::ROUND_DEFAULT_FUNCTION)); \ +} + +#define PPL_DEF_ASSIGN_FUN2_2(f, fun) \ +template \ +inline void \ +f(Checked_Number& x, const Checked_Number& y) { \ + Policy::handle_result(fun(x, y, Policy::ROUND_DEFAULT_FUNCTION)); \ +} + +#define PPL_DEF_ASSIGN_FUN3_3(f, fun) \ +template \ +inline void \ +f(Checked_Number& x, const Checked_Number& y, \ + const Checked_Number& z) { \ + Policy::handle_result(fun(x, y, z, Policy::ROUND_DEFAULT_FUNCTION)); \ +} + +#define PPL_DEF_ASSIGN_FUN5_5(f, fun) \ +template \ +inline void \ +f(Checked_Number& x, \ + Checked_Number& s, Checked_Number& t, \ + const Checked_Number& y, \ + const Checked_Number& z) { \ + Policy::handle_result(fun(x, s, t, y, z, Policy::ROUND_DEFAULT_FUNCTION)); \ +} + +PPL_DEF_ASSIGN_FUN2_2(sqrt_assign, sqrt_assign_r) + +PPL_DEF_ASSIGN_FUN2_1(floor_assign, floor_assign_r) +PPL_DEF_ASSIGN_FUN2_2(floor_assign, floor_assign_r) + +PPL_DEF_ASSIGN_FUN2_1(ceil_assign, ceil_assign_r) +PPL_DEF_ASSIGN_FUN2_2(ceil_assign, ceil_assign_r) + +PPL_DEF_ASSIGN_FUN2_1(trunc_assign, trunc_assign_r) +PPL_DEF_ASSIGN_FUN2_2(trunc_assign, trunc_assign_r) + +PPL_DEF_ASSIGN_FUN2_1(neg_assign, neg_assign_r) +PPL_DEF_ASSIGN_FUN2_2(neg_assign, neg_assign_r) + +PPL_DEF_ASSIGN_FUN2_1(abs_assign, abs_assign_r) +PPL_DEF_ASSIGN_FUN2_2(abs_assign, abs_assign_r) + +PPL_DEF_ASSIGN_FUN3_3(add_mul_assign, add_mul_assign_r) + +PPL_DEF_ASSIGN_FUN3_3(sub_mul_assign, sub_mul_assign_r) + +PPL_DEF_ASSIGN_FUN3_3(rem_assign, rem_assign_r) + +PPL_DEF_ASSIGN_FUN3_3(gcd_assign, gcd_assign_r) + +PPL_DEF_ASSIGN_FUN5_5(gcdext_assign, gcdext_assign_r) + +PPL_DEF_ASSIGN_FUN3_3(lcm_assign, lcm_assign_r) + +#undef PPL_DEF_ASSIGN_FUN2_1 +#undef PPL_DEF_ASSIGN_FUN2_2 +#undef PPL_DEF_ASSIGN_FUN3_2 +#undef PPL_DEF_ASSIGN_FUN3_3 +#undef PPL_DEF_ASSIGN_FUN5_5 + +template +inline void +exact_div_assign(Checked_Number& x, + const Checked_Number& y, + const Checked_Number& z) { + Policy::handle_result(div_assign_r(x, y, z, ROUND_NOT_NEEDED)); +} + +/*! \relates Checked_Number */ +template +inline typename Enable_If::value, int>::type +sgn(const From& x) { + Result r = Checked::sgn_ext::Policy>(Native_Checked_From_Wrapper::raw_value(x)); + switch (r) { + case V_LT: + return -1; + case V_EQ: + return 0; + case V_GT: + return 1; + default: + throw(0); + } +} + +/*! \relates Checked_Number */ +template +inline typename Enable_If::value + && Is_Native_Or_Checked::value, + int>::type +cmp(const From1& x, const From2& y) { + Result r + = Checked::cmp_ext::Policy, + typename Native_Checked_From_Wrapper::Policy> + (Native_Checked_From_Wrapper::raw_value(x), + Native_Checked_From_Wrapper::raw_value(y)); + switch (r) { + case V_LT: + return -1; + case V_EQ: + return 0; + case V_GT: + return 1; + default: + throw(0); + } +} + +/*! \relates Checked_Number */ +template +typename Enable_If::value, Result>::type +output(std::ostream& os, const T& x, + const Numeric_Format& fmt, Rounding_Dir dir) { + return check_result(Checked::output_ext::Policy> + (os, + Native_Checked_From_Wrapper::raw_value(x), + fmt, + rounding_dir(dir)), + dir); +} + +/*! \relates Checked_Number */ +template +inline std::ostream& +operator<<(std::ostream& os, const Checked_Number& x) { + Policy::handle_result(output(os, x, Numeric_Format(), ROUND_IGNORE)); + return os; +} + +/*! \relates Checked_Number */ +template +typename Enable_If::value, Result>::type +input(T& x, std::istream& is, Rounding_Dir dir) { + return check_result(Checked::input_ext::Policy> + (Native_Checked_To_Wrapper::raw_value(x), + is, + rounding_dir(dir)), + dir); +} + +/*! \relates Checked_Number */ +template +inline std::istream& operator>>(std::istream& is, + Checked_Number& 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 +inline T +plus_infinity() { + return PLUS_INFINITY; +} + +template +inline T +minus_infinity() { + return MINUS_INFINITY; +} + +template +inline T +not_a_number() { + return NOT_A_NUMBER; +} + +/*! \relates Checked_Number */ +template +inline void +swap(Checked_Number& x, Checked_Number& y) { + using std::swap; + swap(x.raw_value(), y.raw_value()); +} + +template +inline void +maybe_reset_fpu_inexact() { + if (FPU_Related::value) + return fpu_reset_inexact(); +} + +template +inline int +maybe_check_fpu_inexact() { + if (FPU_Related::value) + return fpu_check_inexact(); + else + return 0; +} + +} // 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_numeric_limits.hh line 28. */ +#include + +namespace std { + +using namespace Parma_Polyhedra_Library; + +#define PPL_SPECIALIZE_LIMITS_INT(T) \ +/*! \brief Partial specialization of std::numeric_limits. */ \ +template \ + class numeric_limits > \ + : public numeric_limits { \ + private: \ + typedef Checked_Number Type; \ + \ + public: \ + static const bool has_infinity = Policy::has_infinity; \ + static const bool has_quiet_NaN = Policy::has_nan; \ + \ + static Type min() { \ + return Checked::Extended_Int::min; \ + } \ + \ + static Type max() { \ + return Checked::Extended_Int::max; \ + } \ + \ + static Type infinity() { \ + return \ + Policy::has_infinity \ + ? PLUS_INFINITY \ + : static_cast(0); \ + } \ + \ + static Type quiet_NaN() { \ + return \ + Policy::has_nan \ + ? NOT_A_NUMBER \ + : static_cast(0); \ + } \ +}; + +PPL_SPECIALIZE_LIMITS_INT(signed char) +PPL_SPECIALIZE_LIMITS_INT(signed short) +PPL_SPECIALIZE_LIMITS_INT(signed int) +PPL_SPECIALIZE_LIMITS_INT(signed long) +PPL_SPECIALIZE_LIMITS_INT(signed long long) + +PPL_SPECIALIZE_LIMITS_INT(unsigned char) +PPL_SPECIALIZE_LIMITS_INT(unsigned short) +PPL_SPECIALIZE_LIMITS_INT(unsigned int) +PPL_SPECIALIZE_LIMITS_INT(unsigned long) +PPL_SPECIALIZE_LIMITS_INT(unsigned long long) + +#undef PPL_SPECIALIZE_LIMITS_INT + +#define PPL_SPECIALIZE_LIMITS_FLOAT(T) \ +/*! \brief Partial specialization of std::numeric_limits. */ \ +template \ +struct numeric_limits > \ + : public numeric_limits { \ +}; + +#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 +class +numeric_limits > + : public numeric_limits { +private: + typedef Checked_Number Type; + +public: + static const bool has_infinity = Policy::has_infinity; + static const bool has_quiet_NaN = Policy::has_nan; + + static Type infinity() { + return + Policy::has_infinity + ? PLUS_INFINITY + : static_cast(0); + } + + static Type quiet_NaN() { + return + Policy::has_nan + ? NOT_A_NUMBER + : static_cast(0); + } +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Partial specialization of std::numeric_limits. +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +class +numeric_limits > +: public numeric_limits { +private: + typedef Checked_Number Type; + +public: + static const bool has_infinity = Policy::has_infinity; + static const bool has_quiet_NaN = Policy::has_nan; + + static Type infinity() { + return + Policy::has_infinity + ? PLUS_INFINITY + : static_cast(0); + } + + static Type quiet_NaN() { + return + Policy::has_nan + ? NOT_A_NUMBER + : static_cast(0); + } +}; + +} // namespace std + +/* Automatically generated from PPL source file ../src/Checked_Number.templates.hh line 1. */ +/* Checked_Number class implementation: non-inline template functions. +*/ + + +#include +#include +#include + +namespace Parma_Polyhedra_Library { + +template +typename Enable_If::value, void>::type +ascii_dump(std::ostream& s, const T& t) { + if (std::numeric_limits::is_exact) + // An exact datatype: pretty printer is accurate. + s << t; + else { + // An inexact datatype (probably floating point): + // first dump its hexadecimal representation ... + const std::ios_base::fmtflags old_flags = s.flags(); + s << std::hex; + const unsigned char* p = reinterpret_cast(&t); + for (unsigned i = 0; i < sizeof(T); ++i) { + s << std::setw(2) << std::setfill('0'); + s << static_cast(p[i]); + } + s.flags(old_flags); + // ... and then pretty print it for readability. + s << " (" << t << ")"; + } +} + +template +typename Enable_If::value, bool>::type +ascii_load(std::istream& s, T& t) { + if (std::numeric_limits::is_exact) + // An exact datatype: input from pretty printed version is accurate. + return (s >> t); + else { + // An inexact datatype (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(&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; + } + assert(byte_value <= 255); + p[i] = static_cast(byte_value); + } + // ... then read and discard pretty printed value. + if (!(s >> str)) + return false; + const unsigned 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 1076. */ + +/* Automatically generated from PPL source file ../src/Coefficient.types.hh line 16. */ + +#if defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS) + +namespace Parma_Polyhedra_Library { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Coefficient traits specialization for 8 bits checked integers. +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +struct Coefficient_traits_template > { + //! The type used for references to const 8 bit checked integers. + typedef Checked_Number 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 +struct Coefficient_traits_template > { + //! The type used for references to const 16 bit checked integers. + typedef Checked_Number 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 +struct Coefficient_traits_template > { + //! The type used for references to const 32 bit checked integers. + typedef Checked_Number 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 +struct Coefficient_traits_template > { + //! The type used for references to const 64 bit checked integers. + typedef const Checked_Number& const_reference; +}; + +} // namespace Parma_Polyhedra_Library + +#endif // defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS) + +#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 16. */ +#include +/* Automatically generated from PPL source file ../src/GMP_Integer.types.hh line 18. */ + +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 mpz_class type + defined in the C++ interface of the GMP library. + For more information, see http://www.swox.com/gmp/ +*/ +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 { + //! 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 67. */ +#endif + +namespace Parma_Polyhedra_Library { + +//! An alias for easily naming the type of PPL coefficients. +/*! \ingroup PPL_CXX_interface + Objects of type Coefficient are used to implement the integral valued + coefficients occurring in linear expressions, constraints, generators, + intervals, bounding boxes and so on. Depending on the chosen + configuration options (see file README.configure), + a Coefficient may actually be: + - The GMP_Integer type, which in turn is an alias for the + mpz_class type implemented by the C++ interface + of the GMP library (this is the default configuration); + - An instance of the Checked_Number class template: with its default + policy (Checked_Number_Default_Policy), this implements overflow + detection on top of a native integral type (available template + instances include checked integers having 8, 16, 32 or 64 bits); + with the Checked_Number_Transparent_Policy, this is a wrapper + for native integral types with no overflow detection + (available template instances are as above). +*/ +typedef 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_traits; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Linear_Expression.types.hh line 1. */ + + +namespace Parma_Polyhedra_Library { + +class Linear_Expression; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Constraint.types.hh line 1. */ + + +namespace Parma_Polyhedra_Library { + +class Constraint; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Generator.types.hh line 1. */ + + +namespace Parma_Polyhedra_Library { + +class Generator; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Congruence.types.hh line 1. */ + + +namespace Parma_Polyhedra_Library { + +class Congruence; + +} + +/* 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/Scalar_Products.defs.hh line 34. */ + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! A class implementing various scalar product functions. +/*! \ingroup PPL_CXX_interface + When computing the scalar product of (Linear_Row or Constraint or + Generator) objects x and y, it is assumed + that the space dimension of the first object x is less + than or equal to the space dimension of the second object y. +*/ +#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_Row& x, const Linear_Row& y); + //! Computes the scalar product of \p c and \p g and assigns it to \p z. + static void assign(Coefficient& z, const Constraint& c, const Generator& g); + //! Computes the scalar product of \p g and \p c and assigns it to \p z. + static void assign(Coefficient& z, const Generator& g, const Constraint& c); + //! Computes the scalar product of \p c and \p g and assigns it to \p z. + static void assign(Coefficient& z, + const Constraint& c, const Grid_Generator& g); + //! Computes the scalar product of \p g and \p cg and assigns it to \p z. + static void assign(Coefficient& z, + const Grid_Generator& g, const Congruence& cg); + //! Computes the scalar product of \p cg and \p g and assigns it to \p z. + static void assign(Coefficient& z, + const Congruence& cg, const Grid_Generator& g); + + //! Returns the sign of the scalar product between \p x and \p y. + static int sign(const Linear_Row& x, const Linear_Row& y); + //! Returns the sign of the scalar product between \p c and \p g. + static int sign(const Constraint& c, const Generator& g); + //! Returns the sign of the scalar product between \p g and \p c. + static int sign(const Generator& g, const Constraint& c); + //! 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_Row& x, const Linear_Row& y); + /*! \brief + Computes the \e reduced scalar product of \p c and \p g, + where the \f$\epsilon\f$ coefficient of \p c is ignored, + and assigns the result to \p z. + */ + static void reduced_assign(Coefficient& z, + const Constraint& c, const Generator& g); + /*! \brief + Computes the \e reduced scalar product of \p g and \p c, + where the \f$\epsilon\f$ coefficient of \p g is ignored, + and assigns the result to \p z. + */ + static void reduced_assign(Coefficient& z, + const Generator& g, const Constraint& c); + //! \brief + //! Computes the \e reduced scalar product of \p g and \p cg, + //! where the \f$\epsilon\f$ coefficient of \p g is ignored, + //! and assigns the result to \p z. + static void reduced_assign(Coefficient& z, + const Grid_Generator& g, const Congruence& cg); + + /*! \brief + Returns the sign of the \e reduced scalar product of \p x and \p y, + where the \f$\epsilon\f$ coefficient of \p x is ignored. + */ + static int reduced_sign(const Linear_Row& x, const Linear_Row& y); + /*! \brief + Returns the sign of the \e reduced scalar product of \p c and \p g, + where the \f$\epsilon\f$ coefficient of \p c is ignored. + */ + static int reduced_sign(const Constraint& c, const Generator& g); + /*! \brief + Returns the sign of the \e reduced scalar product of \p g and \p c, + where the \f$\epsilon\f$ coefficient of \p g is ignored. + */ + static int reduced_sign(const Generator& g, const Constraint& c); + + /*! \brief + Computes the \e homogeneous scalar product of \p x and \p y, + where the inhomogeneous terms are ignored, + and assigns the result to \p z. + */ + static void homogeneous_assign(Coefficient& z, + const Linear_Row& x, const Linear_Row& y); + /*! \brief + Computes the \e homogeneous scalar product of \p e and \p g, + where the inhomogeneous terms are ignored, + and assigns the result to \p z. + */ + static void homogeneous_assign(Coefficient& z, + const Linear_Expression& e, + const Generator& g); + //! \brief + //! Computes the \e homogeneous scalar product of \p g and \p c, + //! where the inhomogeneous terms are ignored, + //! and assigns the result to \p z. + static void homogeneous_assign(Coefficient& z, + const Grid_Generator& g, 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& g, const Congruence& cg); + //! \brief + //! Computes the \e homogeneous scalar product of \p e and \p g, + //! where the inhomogeneous terms are ignored, + //! and assigns the result to \p z. + static void homogeneous_assign(Coefficient& z, + const Linear_Expression& e, + const Grid_Generator& g); + + /*! \brief + Returns the sign of the \e homogeneous scalar product of \p x and \p y, + where the inhomogeneous terms are ignored. + */ + static int homogeneous_sign(const Linear_Row& x, const Linear_Row& y); + /*! \brief + Returns the sign of the \e homogeneous scalar product of \p e and \p g, + where the inhomogeneous terms are ignored. + */ + static int homogeneous_sign(const Linear_Expression& e, const Generator& g); + //! \brief + //! Returns the sign of the \e homogeneous scalar product of \p e and \p g, + //! where the inhomogeneous terms are ignored, + static int homogeneous_sign(const Linear_Expression& e, + const Grid_Generator& g); + //! \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 (*SPS_type)(const Linear_Row&, const Linear_Row&); + + //! The scalar product sign function pointer. + SPS_type sps_fp; +}; + +/* Automatically generated from PPL source file ../src/Scalar_Products.inlines.hh line 1. */ +/* Scalar_Products class implementation (inline functions). +*/ + + +/* Automatically generated from PPL source file ../src/Linear_Row.defs.hh line 1. */ +/* Linear_Row class declaration. +*/ + + +/* Automatically generated from PPL source file ../src/Row.defs.hh line 1. */ +/* Row class declaration. +*/ + + +/* Automatically generated from PPL source file ../src/Row.types.hh line 1. */ + + +namespace Parma_Polyhedra_Library { + +class Row_Impl_Handler; +class Row; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Coefficient.defs.hh line 1. */ +/* Coefficient class declaration. +*/ + + +/* Automatically generated from PPL source file ../src/Coefficient.defs.hh line 27. */ +#include + +#if defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS) +/* Automatically generated from PPL source file ../src/Coefficient.defs.hh line 32. */ +#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 28. */ +#include + +namespace Parma_Polyhedra_Library { + +//! \name Accessor Functions +//@{ + +//! Returns a const reference to the underlying integer value. +/*! \relates GMP_Integer */ +const mpz_class& raw_value(const GMP_Integer& x); + +//! Returns a reference to the underlying integer value. +/*! \relates GMP_Integer */ +mpz_class& raw_value(GMP_Integer& x); + +//@} // Accessor Functions + +//! \name Memory Size Inspection Functions +//@{ + +#ifndef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns the total size in bytes of the memory occupied by \p x. +/*! \relates GMP_Integer */ +#endif // !defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +memory_size_type total_memory_in_bytes(const GMP_Integer& x); + +#ifndef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns the size in bytes of the memory managed by \p x. +/*! \relates GMP_Integer */ +#endif // !defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +memory_size_type external_memory_in_bytes(const GMP_Integer& x); + +//@} // Memory Size Inspection Functions + +//! \name Arithmetic Operators +//@{ + +//! Assigns to \p x its negation. +/*! \relates GMP_Integer */ +void neg_assign(GMP_Integer& x); + +//! Assigns to \p x the negation of \p y. +/*! \relates GMP_Integer */ +void neg_assign(GMP_Integer& x, const GMP_Integer& y); + +//! Assigns to \p x 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 x + y * z. +/*! \relates GMP_Integer */ +void add_mul_assign(GMP_Integer& x, + const GMP_Integer& y, const GMP_Integer& z); + +//! Assigns to \p x the value x - y * z. +/*! \relates GMP_Integer */ +void sub_mul_assign(GMP_Integer& x, + const GMP_Integer& y, const GMP_Integer& z); + +/*! \brief + If \p z divides \p y, assigns to \p x the quotient of the integer + division of \p y and \p z. + + \relates GMP_Integer + The behavior is undefined if \p z does not divide \p y. +*/ +void exact_div_assign(GMP_Integer& x, + const GMP_Integer& y, const GMP_Integer& z); + +//! Assigns to \p x the integer square root of \p y. +/*! \relates GMP_Integer */ +void sqrt_assign(GMP_Integer& x, const GMP_Integer& y); + +/*! \brief + Returns a negative, zero or positive value depending on whether + \p x is lower than, equal to or greater than \p y, respectively. + + \relates GMP_Integer +*/ +int cmp(const GMP_Integer& x, const GMP_Integer& y); + +//@} // Arithmetic Operators + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/GMP_Integer.inlines.hh line 1. */ +/* GMP_Integer class implementation: inline functions. +*/ + + +#include + +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 +exact_div_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) { + assert(y % z == 0); + mpz_divexact(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t()); +} + +inline void +sqrt_assign(GMP_Integer& x, const GMP_Integer& y) { + mpz_sqrt(x.get_mpz_t(), y.get_mpz_t()); +} + +inline int +cmp(const GMP_Integer& x, const GMP_Integer& y) { + return mpz_cmp(x.get_mpz_t(), y.get_mpz_t()); +} + +inline const mpz_class& +raw_value(const GMP_Integer& x) { + return x; +} + +inline mpz_class& +raw_value(GMP_Integer& x) { + return x; +} + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/GMP_Integer.defs.hh line 141. */ + +/* Automatically generated from PPL source file ../src/Coefficient.defs.hh line 36. */ +#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 { + +#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 + +#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; + assert(*Coefficient_one_p != 0); + return *Coefficient_one_p; +} +#endif + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Coefficient.defs.hh line 59. */ + +/* Automatically generated from PPL source file ../src/Row.defs.hh line 29. */ +#include +#include + +#ifndef PPL_ROW_EXTRA_DEBUG +#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! + \brief + Enables extra debugging information for class Row. + + \ingroup PPL_CXX_interface + When PPL_ROW_EXTRA_DEBUG evaluates to true, + each instance of the class Row carries its own capacity; this enables + extra consistency checks to be performed. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +#define PPL_ROW_EXTRA_DEBUG 1 +#else // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG) +#define PPL_ROW_EXTRA_DEBUG 0 +#endif // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG) +#endif // !defined(PPL_ROW_EXTRA_DEBUG) + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! The handler of the actual Row implementation. +/*! \ingroup PPL_CXX_interface + Exception-safety is the only responsibility of this class: it has + to ensure that its \p impl member is correctly deallocated. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +class Parma_Polyhedra_Library::Row_Impl_Handler { +public: + //! Default constructor. + Row_Impl_Handler(); + + //! Destructor. + ~Row_Impl_Handler(); + + class Impl; + + //! A pointer to the actual implementation. + Impl* impl; + +#if PPL_ROW_EXTRA_DEBUG + //! The capacity of \p impl (only available during debugging). + dimension_type capacity_; +#endif // PPL_ROW_EXTRA_DEBUG + +private: + //! Private and unimplemented: copy construction is not allowed. + Row_Impl_Handler(const Row_Impl_Handler&); + + //! Private and unimplemented: copy assignment is not allowed. + Row_Impl_Handler& operator=(const Row_Impl_Handler&); +}; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! A finite sequence of coefficients. +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +class Parma_Polyhedra_Library::Row : private Row_Impl_Handler { +public: +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS + /*! \brief + Wrapper class to represent a set of flags with bits in a native + unsigned integral type. + \ingroup PPL_CXX_interface + */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) + class Flags { + public: + //! Constructs an object with all the flags unset. + Flags(); + + //! Returns true if and only if \p *this and \p y are equal. + bool operator==(const Flags& y) const; + + /*! \brief + Returns true if and only if \p *this and \p y + are different. + */ + bool operator!=(const Flags& y) const; + + PPL_OUTPUT_DECLARATIONS + + //! Uses the ASCII Flags representation from \p s to recreate *this. + /*! + Returns true if successful, false + otherwise. The ASCII representation is as output by + \ref Parma_Polyhedra_Library::Row::Flags::ascii_dump. + */ + bool ascii_load(std::istream& s); + + protected: + //! A native integral type holding the bits that encode the flags. + typedef unsigned int base_type; + + //! Index of the first bit derived classes can use. + static const unsigned first_free_bit = 0; + + //! Total number of bits that can be stored. + static const unsigned num_bits = std::numeric_limits::digits; + + //! Constructs an object with flags set as in \p n. + explicit Flags(base_type n); + + //! Returns the integer encoding \p *this. + base_type get_bits() const; + + //! Sets the bits in \p mask. + void set_bits(base_type mask); + + //! Resets the bits in \p mask. + void reset_bits(base_type mask); + + /*! \brief + Returns true if and only if all the bits + in \p mask are set. + */ + bool test_bits(base_type mask) const; + + private: + //! The integer encoding \p *this. + base_type bits; + + friend class Row; + }; + + //! Pre-constructs a row: construction must be completed by construct(). + Row(); + + //! \name Post-constructors + //@{ + //! Constructs properly a default-constructed element. + /*! + Builds a row with size and capacity \p sz and flags \p f. + */ + void construct(dimension_type sz, Flags f); + + //! Constructs properly a default-constructed element. + /*! + \param sz + The size of the row that will be constructed; + + \param capacity + The capacity of the row that will be constructed; + + \param f + Flags for the row that will be constructed. + + The row that is constructed has storage for \p capacity elements, + \p sz of which are default-constructed now. + The row flags are set to \p f. + */ + void construct(dimension_type sz, dimension_type capacity, Flags f); + //@} // Post-constructors + + //! Tight constructor: resizing may require reallocation. + /*! + Constructs a row with size and capacity \p sz, and flags \p f. + */ + Row(dimension_type sz, Flags f); + + //! Sizing constructor with capacity. + /*! + \param sz + The size of the row that will be constructed; + + \param capacity + The capacity of the row that will be constructed; + + \param f + Flags for the row that will be constructed. + + The row that is constructed has storage for \p capacity elements, + \p sz of which are default-constructed now. + The row flags are set to \p f. + */ + Row(dimension_type sz, dimension_type capacity, Flags f); + + //! Ordinary copy constructor. + Row(const Row& y); + + //! Copy constructor with specified capacity. + /*! + It is assumed that \p capacity is greater than or equal to + the size of \p y. + */ + Row(const Row& y, dimension_type capacity); + + //! Copy constructor with specified size and capacity. + /*! + It is assumed that \p sz is greater than or equal to the size of \p y + and, of course, that \p sz is less than or equal to \p capacity. + */ + Row(const Row& y, dimension_type sz, dimension_type capacity); + + //! Destructor. + ~Row(); + + //! Assignment operator. + Row& operator=(const Row& y); + + //! Swaps \p *this with \p y. + void swap(Row& y); + + //! Assigns the implementation of \p y to \p *this. + /*! + To be used with extra care, since it may easily cause memory leaks + or undefined behavior. + */ + void assign(Row& y); + + /*! \brief + Allocates memory for a default constructed Row object, setting + flags to \p f and allowing for \p capacity coefficients at most. + + It is assumed that no allocation has been performed before + (otherwise, a memory leak will occur). + After execution, the size of the Row object is zero. + */ + void allocate(dimension_type capacity, Flags f); + + //! Expands the row to size \p new_size. + /*! + Adds new positions to the implementation of the row + obtaining a new row with size \p new_size. + It is assumed that \p new_size is between the current size + and capacity of the row. + */ + void expand_within_capacity(dimension_type new_size); + + //! Shrinks the row by erasing elements at the end. + /*! + Destroys elements of the row implementation + from position \p new_size to the end. + It is assumed that \p new_size is not greater than the current size. + */ + void shrink(dimension_type new_size); + + //! Returns a const reference to the flags of \p *this. + const Flags& flags() const; + + //! Returns a non-const reference to the flags of \p *this. + Flags& flags(); + + //! Returns the size() of the largest possible Row. + static dimension_type max_size(); + + //! Gives the number of coefficients currently in use. + dimension_type size() const; + + //! \name Subscript operators + //@{ + //! Returns a reference to the element of the row indexed by \p k. + Coefficient& operator[](dimension_type k); + + //! Returns a constant reference to the element of the row indexed by \p k. + Coefficient_traits::const_reference operator[](dimension_type k) const; + //@} // Subscript operators + + //! Normalizes the modulo of coefficients so that they are mutually prime. + /*! + Computes the Greatest Common Divisor (GCD) among the elements of + the row and normalizes them by the GCD itself. + */ + void normalize(); + + PPL_OUTPUT_DECLARATIONS + + /*! \brief + Loads from \p s an ASCII representation (as produced by + ascii_dump(std::ostream&) const) and sets \p *this accordingly. + Returns true if successful, false 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 and capacity match the values provided as arguments. + */ + bool OK(dimension_type row_size, dimension_type row_capacity) const; + +private: + //! Exception-safe copy construction mechanism for coefficients. + void copy_construct_coefficients(const Row& y); + +#if PPL_ROW_EXTRA_DEBUG + //! Returns the capacity of the row (only available during debugging). + dimension_type capacity() const; +#endif // PPL_ROW_EXTRA_DEBUG +}; + +namespace Parma_Polyhedra_Library { + +//! Returns true if and only if \p x and \p y are equal. +/*! \relates Row */ +bool operator==(const Row& x, const Row& y); + +//! Returns true if and only if \p x and \p y are different. +/*! \relates Row */ +bool operator!=(const Row& x, const Row& y); + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Row */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +void swap(Parma_Polyhedra_Library::Row& x, + Parma_Polyhedra_Library::Row& y); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specializes std::iter_swap. +/*! \relates Parma_Polyhedra_Library::Row */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +void iter_swap(std::vector::iterator x, + std::vector::iterator y); + +} // namespace std + + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! The actual implementation of a Row object. +/*! \ingroup PPL_CXX_interface + The class Row_Impl_Handler::Impl provides the implementation of Row + objects and, in particular, of the corresponding memory allocation + functions. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +class Parma_Polyhedra_Library::Row_Impl_Handler::Impl { +public: + //! \name Custom allocator and deallocator + //@{ + + /*! \brief + Allocates a chunk of memory able to contain \p capacity Coefficient objects + beyond the specified \p fixed_size and returns a pointer to the new + allocated memory. + */ + static void* operator new(size_t fixed_size, dimension_type capacity); + + //! Uses the standard delete operator to free the memory \p p points to. + static void operator delete(void* p); + + /*! \brief + Placement version: + uses the standard operator delete to free the memory \p p points to. + */ + static void operator delete(void* p, dimension_type capacity); + //@} // Custom allocator and deallocator + + //! Constructor. + Impl(Row::Flags f); + + //! Destructor. + /*! + Uses shrink() method with argument \f$0\f$ + to delete all the row elements. + */ + ~Impl(); + + //! Expands the row to size \p new_size. + /*! + It is assumed that \p new_size is between the current size and capacity. + */ + void expand_within_capacity(dimension_type new_size); + + //! Shrinks the row by erasing elements at the end. + /*! + It is assumed that \p new_size is not greater than the current size. + */ + void shrink(dimension_type new_size); + + //! Exception-safe copy construction mechanism for coefficients. + void copy_construct_coefficients(const Impl& y); + + //! Returns the size() of the largest possible Impl. + static dimension_type max_size(); + + //! \name Flags accessors + //@{ + //! Returns a const reference to the flags of \p *this. + const Row::Flags& flags() const; + + //! Returns a non-const reference to the flags of \p *this. + Row::Flags& flags(); + //@} // Flags accessors + + //! \name Size accessors + //@{ + //! Returns the actual size of \p this. + dimension_type size() const; + + //! Sets to \p new_size the actual size of \p *this. + void set_size(dimension_type new_size); + + //! Increment the size of \p *this by 1. + void bump_size(); + //@} // Size accessors + + //! \name Subscript operators + //@{ + //! Returns a reference to the element of \p *this indexed by \p k. + Coefficient& operator[](dimension_type k); + + //! Returns a constant reference to the element of \p *this indexed by \p k. + Coefficient_traits::const_reference operator[](dimension_type k) const; + //@} // Subscript operators + + /*! \brief + Returns a lower bound to the total size in bytes of the memory + occupied by \p *this. + */ + memory_size_type total_memory_in_bytes() const; + + //! Returns the total size in bytes of the memory occupied by \p *this. + memory_size_type total_memory_in_bytes(dimension_type capacity) const; + + //! Returns the size in bytes of the memory managed by \p *this. + memory_size_type external_memory_in_bytes() const; + +private: + //! The number of coefficients in the row. + dimension_type size_; + + //! The flags of this row. + Row::Flags flags_; + + //! The vector of coefficients. + Coefficient vec_[ +#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + 1 +#endif + ]; + + //! Private and unimplemented: default construction is not allowed. + Impl(); + + //! Private and unimplemented: copy construction is not allowed. + Impl(const Impl& y); + + //! Private and unimplemented: assignment is not allowed. + Impl& operator=(const Impl&); +}; + +/* Automatically generated from PPL source file ../src/Row.inlines.hh line 1. */ +/* Row class implementation: inline functions. +*/ + + +/* Automatically generated from PPL source file ../src/math_utilities.defs.hh line 1. */ +/* Declarations of some math utility functions. +*/ + + +/* Automatically generated from PPL source file ../src/math_utilities.defs.hh line 28. */ +#include + +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 +void +numer_denom(const Checked_Number& from, + Coefficient& num, Coefficient& den); + +#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 +void +div_round_up(Checked_Number& 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 +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 +void +max_assign(N& x, const N& y); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns true if and only if \p x is an even number. +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +bool +is_even(const Checked_Number& x); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns true if and only if \f$x = -y\f$. +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +bool +is_additive_inverse(const Checked_Number& x, + const Checked_Number& 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 nx and \p ny, respectively. + + \note + \p x and \p nx may be the same object and likewise for + \p y and \p ny. Any other aliasing results in undefined behavior. +*/ +#endif +void +normalize2(Coefficient_traits::const_reference x, + Coefficient_traits::const_reference y, + Coefficient& nx, Coefficient& ny); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns true 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 +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 27. */ +#include +#include + +namespace Parma_Polyhedra_Library { + +inline void +normalize2(Coefficient_traits::const_reference x, + Coefficient_traits::const_reference y, + Coefficient& nx, Coefficient& ny) { + PPL_DIRTY_TEMP_COEFFICIENT(gcd); + gcd_assign(gcd, x, y); + exact_div_assign(nx, x, gcd); + exact_div_assign(ny, y, gcd); +} + +template +inline T +low_bits_mask(const unsigned n) { + assert(n < unsigned(std::numeric_limits::digits)); + return n == 0 ? 0 : ~(~(T(0u)) << n); +} + +template +inline void +numer_denom(const Checked_Number& from, + Coefficient& num, Coefficient& den) { + assert(!is_not_a_number(from) + && !is_minus_infinity(from) + && !is_plus_infinity(from)); + PPL_DIRTY_TEMP0(mpq_class, q); + assign_r(q, from, ROUND_NOT_NEEDED); + num = q.get_num(); + den = q.get_den(); +} + +template +inline void +div_round_up(Checked_Number& to, + Coefficient_traits::const_reference x, + Coefficient_traits::const_reference y) { + PPL_DIRTY_TEMP0(mpq_class, qx); + PPL_DIRTY_TEMP0(mpq_class, qy); + // Note: this code assumes that a Coefficient is always convertible + // to an mpq_class without loss of precision. + assign_r(qx, x, ROUND_NOT_NEEDED); + assign_r(qy, y, ROUND_NOT_NEEDED); + div_assign_r(qx, qx, qy, ROUND_NOT_NEEDED); + assign_r(to, qx, ROUND_UP); +} + +template +inline void +min_assign(N& x, const N& y) { + if (x > y) + x = y; +} + +template +inline void +max_assign(N& x, const N& y) { + if (x < y) + x = y; +} + +template +inline bool +is_even(const Checked_Number& x) { + Checked_Number half_x; + return div2exp_assign_r(half_x, x, 1, ROUND_DIRECT) == V_EQ + && is_integer(half_x); +} + +template +inline bool +is_additive_inverse(const Checked_Number& x, + const Checked_Number& y) { + Checked_Number negated_x; + return neg_assign_r(negated_x, x, ROUND_DIRECT) == V_EQ + && negated_x == y; +} + +inline bool +is_canonical(const mpq_class& x) { + if (x.get_den() <= 0) + return false; + PPL_DIRTY_TEMP0(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/Row.inlines.hh line 27. */ +#include +#include +#include +#include + +namespace Parma_Polyhedra_Library { + +inline +Row::Flags::Flags() + : bits(0) { +} + +inline +Row::Flags::Flags(base_type n) + : bits(n) { +} + +inline Row::Flags::base_type +Row::Flags::get_bits() const { + return bits; +} + +inline void +Row::Flags::set_bits(const base_type mask) { + bits |= mask; +} + +inline void +Row::Flags::reset_bits(const base_type mask) { + bits &= ~mask; +} + +inline bool +Row::Flags::test_bits(const base_type mask) const { + return (bits & mask) == mask; +} + +inline bool +Row::Flags::operator==(const Flags& y) const { + base_type mask = low_bits_mask(first_free_bit); + return (get_bits() & mask) == (y.get_bits() & mask); +} + +inline bool +Row::Flags::operator!=(const Flags& y) const { + return !operator==(y); +} + +inline void* +Row_Impl_Handler::Impl::operator new(const size_t fixed_size, + const dimension_type capacity) { +#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + return ::operator new(fixed_size + capacity*sizeof(Coefficient)); +#else + assert(capacity >= 1); + return ::operator new(fixed_size + (capacity-1)*sizeof(Coefficient)); +#endif +} + +inline void +Row_Impl_Handler::Impl::operator delete(void* p) { + ::operator delete(p); +} + +inline void +Row_Impl_Handler::Impl::operator delete(void* p, dimension_type) { + ::operator delete(p); +} + +inline dimension_type +Row_Impl_Handler::Impl::max_size() { + return std::numeric_limits::max() / sizeof(Coefficient); +} + +inline dimension_type +Row_Impl_Handler::Impl::size() const { + return size_; +} + +inline void +Row_Impl_Handler::Impl::set_size(const dimension_type new_size) { + size_ = new_size; +} + +inline void +Row_Impl_Handler::Impl::bump_size() { + ++size_; +} + +inline +Row_Impl_Handler::Impl::Impl(const Row::Flags f) + : size_(0), flags_(f) { +} + +inline +Row_Impl_Handler::Impl::~Impl() { + shrink(0); +} + +inline const Row::Flags& +Row_Impl_Handler::Impl::flags() const { + return flags_; +} + +inline Row::Flags& +Row_Impl_Handler::Impl::flags() { + return flags_; +} + +inline Coefficient& +Row_Impl_Handler::Impl::operator[](const dimension_type k) { + assert(k < size()); + return vec_[k]; +} + +inline Coefficient_traits::const_reference +Row_Impl_Handler::Impl::operator[](const dimension_type k) const { + assert(k < size()); + return vec_[k]; +} + +inline memory_size_type +Row_Impl_Handler::Impl::total_memory_in_bytes(dimension_type capacity) const { + return + sizeof(*this) + + capacity*sizeof(Coefficient) +#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + - 1*sizeof(Coefficient) +#endif + + external_memory_in_bytes(); +} + +inline memory_size_type +Row_Impl_Handler::Impl::total_memory_in_bytes() const { + // In general, this is a lower bound, as the capacity of *this + // may be strictly greater than `size_' + return total_memory_in_bytes(size_); +} + +inline dimension_type +Row::max_size() { + return Impl::max_size(); +} + +inline dimension_type +Row::size() const { + return impl->size(); +} + +inline const Row::Flags& +Row::flags() const { + return impl->flags(); +} + +inline Row::Flags& +Row::flags() { + return impl->flags(); +} + +#if PPL_ROW_EXTRA_DEBUG +inline dimension_type +Row::capacity() const { + return capacity_; +} +#endif + +inline +Row_Impl_Handler::Row_Impl_Handler() + : impl(0) { +#if PPL_ROW_EXTRA_DEBUG + capacity_ = 0; +#endif +} + +inline +Row_Impl_Handler::~Row_Impl_Handler() { + delete impl; +} + +inline +Row::Row() + : Row_Impl_Handler() { +} + +inline void +Row::allocate( +#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + const +#endif + dimension_type capacity, + const Flags f) { + assert(capacity <= max_size()); +#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + if (capacity == 0) + ++capacity; +#endif + assert(impl == 0); + impl = new (capacity) Impl(f); +#if PPL_ROW_EXTRA_DEBUG + assert(capacity_ == 0); + capacity_ = capacity; +#endif +} + +inline void +Row::expand_within_capacity(const dimension_type new_size) { + assert(impl); +#if PPL_ROW_EXTRA_DEBUG + assert(new_size <= capacity_); +#endif + impl->expand_within_capacity(new_size); +} + +inline void +Row::copy_construct_coefficients(const Row& y) { + assert(impl && y.impl); +#if PPL_ROW_EXTRA_DEBUG + assert(y.size() <= capacity_); +#endif + impl->copy_construct_coefficients(*(y.impl)); +} + +inline void +Row::construct(const dimension_type sz, + const dimension_type capacity, + const Flags f) { + assert(sz <= capacity && capacity <= max_size()); + allocate(capacity, f); + expand_within_capacity(sz); +} + +inline void +Row::construct(const dimension_type sz, const Flags f) { + construct(sz, sz, f); +} + +inline +Row::Row(const dimension_type sz, + const dimension_type capacity, + const Flags f) + : Row_Impl_Handler() { + construct(sz, capacity, f); +} + +inline +Row::Row(const dimension_type sz, const Flags f) + : Row_Impl_Handler() { + construct(sz, f); +} + +inline +Row::Row(const Row& y) + : Row_Impl_Handler() { + if (y.impl) { + allocate(compute_capacity(y.size(), max_size()), y.flags()); + copy_construct_coefficients(y); + } +} + +inline +Row::Row(const Row& y, + const dimension_type capacity) + : Row_Impl_Handler() { + assert(y.impl); + assert(y.size() <= capacity && capacity <= max_size()); + allocate(capacity, y.flags()); + copy_construct_coefficients(y); +} + +inline +Row::Row(const Row& y, + const dimension_type sz, + const dimension_type capacity) + : Row_Impl_Handler() { + assert(y.impl); + assert(y.size() <= sz && sz <= capacity && capacity <= max_size()); + allocate(capacity, y.flags()); + copy_construct_coefficients(y); + expand_within_capacity(sz); +} + +inline +Row::~Row() { +} + +inline void +Row::shrink(const dimension_type new_size) { + assert(impl); + impl->shrink(new_size); +} + +inline void +Row::swap(Row& y) { + std::swap(impl, y.impl); +#if PPL_ROW_EXTRA_DEBUG + std::swap(capacity_, y.capacity_); +#endif +} + +inline void +Row::assign(Row& y) { + impl = y.impl; +#if PPL_ROW_EXTRA_DEBUG + capacity_ = y.capacity_; +#endif +} + +inline Row& +Row::operator=(const Row& y) { + // Copy-construct `tmp' from `y'. + Row tmp(y); + // Swap the implementation of `*this' with the one of `tmp'. + swap(tmp); + // Now `tmp' goes out of scope, so the old `*this' will be destroyed. + return *this; +} + +inline Coefficient& +Row::operator[](const dimension_type k) { + assert(impl); + return (*impl)[k]; +} + +inline Coefficient_traits::const_reference +Row::operator[](const dimension_type k) const { + assert(impl); + return (*impl)[k]; +} + +inline memory_size_type +Row::external_memory_in_bytes(dimension_type capacity) const { + return impl->total_memory_in_bytes(capacity); +} + +inline memory_size_type +Row::total_memory_in_bytes(dimension_type capacity) const { + return sizeof(*this) + external_memory_in_bytes(capacity); +} + +inline memory_size_type +Row::external_memory_in_bytes() const { +#if PPL_ROW_EXTRA_DEBUG + return impl->total_memory_in_bytes(capacity_); +#else + return impl->total_memory_in_bytes(); +#endif +} + +inline memory_size_type +Row::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +/*! \relates Row */ +inline bool +operator!=(const Row& x, const Row& y) { + return !(x == y); +} + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Row */ +inline void +swap(Parma_Polyhedra_Library::Row& x, Parma_Polyhedra_Library::Row& y) { + x.swap(y); +} + +/*! \relates Parma_Polyhedra_Library::Row */ +inline void +iter_swap(std::vector::iterator x, + std::vector::iterator y) { + swap(*x, *y); +} + +} // namespace std + +/* Automatically generated from PPL source file ../src/Row.defs.hh line 505. */ + +/* Automatically generated from PPL source file ../src/Topology.hh line 1. */ + + +namespace Parma_Polyhedra_Library { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Kinds of polyhedra domains. +/*! \ingroup PPL_CXX_interface */ +#endif // 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/Linear_Row.defs.hh line 33. */ + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! The base class for linear expressions, constraints and generators. +/*! \ingroup PPL_CXX_interface + The class Linear_Row allows us to build objects of the form + \f$[b, a_0, \ldots, a_{d-1}]_{(t, k)}\f$, + i.e., a finite sequence of coefficients subscripted by a pair of flags, + which are both stored in a Linear_Row::Flags object. + The flag \f$t \in \{ \mathrm{c}, \mathrm{nnc} \}\f$ represents + the topology and + the flag \f$k \in \{\mathord{=}, \mathord{\geq} \}\f$ represents + the kind of the Linear_Row object. + Note that, even though all the four possible combinations of topology + and kind values will result in a legal Linear_Row::Flags object, some + of these pose additional constraints on the values of the Linear_Row's + coefficients. + + When \f$t = c\f$, we have the following cases + (\f$d\f$ is the dimension of the vector space): + - \f$[b, a_0, \ldots, a_{d-1}]_{(c,=)}\f$ + represents the equality constraint + \f$\sum_{i=0}^{d-1} a_i x_i + b = 0\f$. + - \f$[b, a_0, \ldots, a_{d-1}]_{(c,\geq)}\f$ + represents the non-strict inequality constraint + \f$\sum_{i=0}^{d-1} a_i x_i + b \geq 0\f$. + - \f$[0, a_0, \ldots, a_{d-1}]_{(c,=)}\f$ + represents the line of direction + \f$\vect{l} = (a_0, \ldots, a_{d-1})^\transpose\f$. + - \f$[0, a_0, \ldots, a_{d-1}]_{(c,\geq)}\f$ + represents the ray of direction + \f$\vect{r} = (a_0, \ldots, a_{d-1})^\transpose\f$. + - \f$[b, a_0, \ldots, a_{d-1}]_{(c,\geq)}\f$, with \f$b > 0\f$, + represents the point + \f$\vect{p} = (\frac{a_0}{b}, \ldots, \frac{a_{d-1}}{b})^\transpose\f$. + + When \f$t = \mathrm{nnc}\f$, the last coefficient of the Linear_Row is + associated to the slack variable \f$\epsilon\f$, so that we have the + following cases (\f$d\f$ is again the dimension of the vector space, + but this time we have \f$d+2\f$ coefficients): + - \f$[b, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},=)}\f$ + represents the equality constraint + \f$\sum_{i=0}^{d-1} a_i x_i + b = 0\f$. + - \f$[b, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},\geq)}\f$ + represents the non-strict inequality constraint + \f$\sum_{i=0}^{d-1} a_i x_i + b \geq 0\f$. + - \f$[b, a_0, \ldots, a_{d-1}, e]_{(\mathrm{nnc},\geq)}\f$, + with \f$e < 0\f$, represents the strict inequality constraint + \f$\sum_{i=0}^{d-1} a_i x_i + b > 0\f$. + - \f$[0, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},=)}\f$ + represents the line of direction + \f$\vect{l} = (a_0, \ldots, a_{d-1})^\transpose\f$. + - \f$[0, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},\geq)}\f$ + represents the ray of direction + \f$\vect{r} = (a_0, \ldots, a_{d-1})^\transpose\f$. + - \f$[b, a_0, \ldots, a_{d-1}, e]_{(\mathrm{nnc},\geq)}\f$, + with \f$b > 0\f$ and \f$e > 0\f$, represents the point + \f$\vect{p} = (\frac{a_0}{b}, \ldots, \frac{a_{d-1}}{b})^\transpose\f$. + - \f$[b, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},\geq)}\f$, + with \f$b > 0\f$, represents the closure point + \f$\vect{c} = (\frac{a_0}{b}, \ldots, \frac{a_{d-1}}{b})^\transpose\f$. + + So, a Linear_Row can be both a constraint and a generator: it can be an + equality, a strict or non-strict inequality, a line, a ray, a point + or a closure point. + + The inhomogeneous term of a constraint can be zero or different from zero. + + Points and closure points must have a positive inhomogeneous term + (which is used as a common divisor for all the other coefficients), + lines and rays must have the inhomogeneous term equal to zero. + If needed, the coefficients of points and closure points are negated + at creation time so that they satisfy this invariant. + The invariant is maintained because, when combining a point or closure + point with another generator, we only consider positive combinations. + + The \f$\epsilon\f$ coefficient, when present, is negative for strict + inequality constraints, positive for points and equal to zero in all + the other cases. + Note that the above description corresponds to the end-user, high-level + view of a Linear_Row object. In the implementation, to allow for code reuse, + it is sometimes useful to regard an \f$\mathrm{nnc}\f$-object on + the vector space \f$\Rset^d\f$ as if it was a \f$\mathrm{c}\f$-object + on the vector space \f$\Rset^{d+1}\f$, therefore interpreting the slack + variable \f$\epsilon\f$ as an ordinary dimension of the vector space. + + A Linear_Row object implementing a Linear_Expression is always of the form + \f$[0, a_0, \ldots, a_{d-1}]_{(c,=)}\f$, which represents the + linear expression \f$\sum_{i=0}^{d-1} a_i x_i\f$. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) + +class Parma_Polyhedra_Library::Linear_Row : public Row { +public: + //! The possible kinds of Linear_Row objects. + enum Kind { + LINE_OR_EQUALITY = 0, + RAY_OR_POINT_OR_INEQUALITY = 1 + }; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS + /*! \brief + The type of the object to which the coefficients refer to, + encoding both topology and kind. + + \ingroup PPL_CXX_interface + This combines the information about the topology (necessarily closed + or not) and the kind (line/equality or ray/point/inequality) + of a Linear_Row object. + */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) + class Flags : public Row::Flags { + public: + //! Default constructor: builds an object where all flags are invalid. + Flags(); + + //! Builds an object corresponding to the topology \p t. + explicit Flags(Topology t); + + //! Builds an object corresponding to the topology \p t and kind \p k. + Flags(Topology t, Kind k); + + //! \name Testing and setting the type + //@{ + Topology topology() const; + bool is_necessarily_closed() const; + bool is_not_necessarily_closed() const; + bool is_line_or_equality() const; + bool is_ray_or_point_or_inequality() const; + + void set_necessarily_closed(); + void set_not_necessarily_closed(); + void set_is_line_or_equality(); + void set_is_ray_or_point_or_inequality(); + //@} // Testing and setting the type + + //! Returns true if and only if \p *this and \p y are equal. + bool operator==(const Flags& y) const; + + /*! \brief + Returns true if and only if \p *this and \p y + are different. + */ + bool operator!=(const Flags& 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 true if successful, false otherwise. + */ + bool ascii_load(std::istream& s); + + private: + //! Builds the type from a bit-mask. + explicit Flags(base_type mask); + + //! \name The bits that are currently in use + //@{ + // NB: ascii_load assumes that these are sequential. + static const unsigned rpi_validity_bit + = Row::Flags::first_free_bit + 0; + static const unsigned rpi_bit + = Row::Flags::first_free_bit + 1; + static const unsigned nnc_validity_bit + = Row::Flags::first_free_bit + 2; + static const unsigned nnc_bit + = Row::Flags::first_free_bit + 3; + //@} + + protected: + //! Index of the first bit derived classes can use. + static const unsigned first_free_bit + = Row::Flags::first_free_bit + 4; + + friend class Parma_Polyhedra_Library::Linear_Row; + }; + + //! Pre-constructs a row: construction must be completed by construct(). + Linear_Row(); + + //! \name Post-constructors + //@{ + //! Constructs properly a default-constructed element. + /*! + Builds a row with type \p t, size \p sz and minimum capacity. + */ + void construct(dimension_type sz, Flags f); + + //! Constructs properly a default-constructed element. + /*! + \param sz + The size of the row that will be constructed; + + \param capacity + The minimum capacity of the row that will be constructed. + + \param f + Flags for the row that will be constructed. + + The row that we are constructing has a minimum capacity, i.e., it + can contain at least \p capacity elements, \p sz of which will be + default-constructed now. The row flags are set to \p f. + */ + void construct(dimension_type sz, dimension_type capacity, Flags f); + //@} // Post-constructors + + //! Tight constructor: resizing will require reallocation. + Linear_Row(dimension_type sz, Flags f); + + //! Sizing constructor with capacity. + Linear_Row(dimension_type sz, dimension_type capacity, Flags f); + + //! Ordinary copy constructor. + Linear_Row(const Linear_Row& y); + + //! Copy constructor with specified capacity. + /*! + It is assumed that \p capacity is greater than or equal to \p y size. + */ + Linear_Row(const Linear_Row& y, dimension_type capacity); + + //! Copy constructor with specified size and capacity. + /*! + It is assumed that \p sz is greater than or equal to the size of \p y + and, of course, that \p sz is less than or equal to \p capacity. + */ + Linear_Row(const Linear_Row& y, dimension_type sz, dimension_type capacity); + + //! Destructor. + ~Linear_Row(); + + //! \name Flags inspection methods + //@{ + //! Returns a const reference to the flags of \p *this. + const Flags& flags() const; + + //! Returns a non-const reference to the flags of \p *this. + Flags& flags(); + + //! Returns the topological kind of \p *this. + Topology topology() const; + + /*! \brief + Returns true if and only if the topology + of \p *this row is not necessarily closed. + */ + bool is_not_necessarily_closed() const; + + /*! \brief + Returns true if and only if the topology + of \p *this row is necessarily closed. + */ + bool is_necessarily_closed() const; + + /*! \brief + Returns true if and only if \p *this row + represents a line or an equality. + */ + bool is_line_or_equality() const; + + /*! \brief + Returns true if and only if \p *this row + represents a ray, a point or an inequality. + */ + bool is_ray_or_point_or_inequality() const; + //@} // Flags inspection methods + + //! \name Flags coercion methods + //@{ + //! Sets to \p NECESSARILY_CLOSED the topological kind of \p *this row. + void set_necessarily_closed(); + + //! Sets to \p NOT_NECESSARILY_CLOSED the topological kind of \p *this row. + void set_not_necessarily_closed(); + + //! Sets to \p LINE_OR_EQUALITY the kind of \p *this row. + void set_is_line_or_equality(); + + //! Sets to \p RAY_OR_POINT_OR_INEQUALITY the kind of \p *this row. + void set_is_ray_or_point_or_inequality(); + //@} // Flags coercion methods + + //! Returns the maximum space dimension a Linear_Row can handle. + static dimension_type max_space_dimension(); + + //! Returns the dimension of the vector space enclosing \p *this. + dimension_type space_dimension() const; + + //! Returns the inhomogeneous term. + Coefficient_traits::const_reference inhomogeneous_term() const; + + //! Returns the coefficient \f$a_n\f$. + Coefficient_traits::const_reference coefficient(dimension_type n) const; + + /*! \brief + Normalizes the sign of the coefficients so that the first non-zero + (homogeneous) coefficient of a line-or-equality is positive. + */ + void sign_normalize(); + + /*! \brief + Strong normalization: ensures that different Linear_Row objects + represent different hyperplanes or hyperspaces. + + Applies both Linear_Row::normalize() and Linear_Row::sign_normalize(). + */ + void strong_normalize(); + + /*! \brief + Returns true if and only if the coefficients are + strongly normalized. + */ + bool check_strong_normalized() const; + + //! Linearly combines \p *this with \p y so that *this[k] is 0. + /*! + \param y + The Linear_Row that will be combined with \p *this object; + + \param k + The position of \p *this that have to be \f$0\f$. + + Computes a linear combination of \p *this and \p y having + the element of index \p k equal to \f$0\f$. Then it assigns + the resulting Linear_Row to \p *this and normalizes it. + */ + void linear_combine(const Linear_Row& y, dimension_type k); + + /*! \brief + Returns true if and only if all the homogeneous + terms of \p *this are \f$0\f$. + */ + bool all_homogeneous_terms_are_zero() const; + + PPL_OUTPUT_DECLARATIONS + + /*! \brief + Loads from \p s an ASCII representation (as produced by + ascii_dump(std::ostream&) const) and sets \p *this accordingly. + Returns true if successful, false otherwise. + */ + bool ascii_load(std::istream& s); + + //! Checks if all the invariants are satisfied. + bool OK() const; + + /*! \brief + Checks if all the invariants are satisfied and that the actual + size and capacity match the values provided as arguments. + */ + bool OK(dimension_type row_size, dimension_type row_capacity) const; + +private: + friend class Parma_Polyhedra_Library::Linear_Expression; + friend class Parma_Polyhedra_Library::Constraint; + friend class Parma_Polyhedra_Library::Generator; +}; + +namespace Parma_Polyhedra_Library { + +//! Returns true if and only if \p x and \p y are equal. +/*! \relates Linear_Row */ +bool operator==(const Linear_Row& x, const Linear_Row& y); + +//! Returns true if and only if \p x and \p y are different. +/*! \relates Linear_Row */ +bool operator!=(const Linear_Row& x, const Linear_Row& y); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! The basic comparison function. +/*! \relates Linear_Row + \return + The returned absolute value can be \f$0\f$, \f$1\f$ or \f$2\f$. + + \param x + A row of coefficients; + + \param y + Another row. + + Compares \p x and \p y, where \p x and \p y may be of different size, + in which case the "missing" coefficients are assumed to be zero. + The comparison is such that: + -# equalities are smaller than inequalities; + -# lines are smaller than points and rays; + -# the ordering is lexicographic; + -# the positions compared are, in decreasing order of significance, + 1, 2, ..., \p size(), 0; + -# the result is negative, zero, or positive if x is smaller than, + equal to, or greater than y, respectively; + -# when \p x and \p y are different, the absolute value of the + result is 1 if the difference is due to the coefficient in + position 0; it is 2 otherwise. + + When \p x and \p y represent the hyper-planes associated + to two equality or inequality constraints, the coefficient + at 0 is the known term. + In this case, the return value can be characterized as follows: + - -2, if \p x is smaller than \p y and they are \e not parallel; + - -1, if \p x is smaller than \p y and they \e are parallel; + - 0, if \p x and y are equal; + - +1, if \p y is smaller than \p x and they \e are parallel; + - +2, if \p y is smaller than \p x and they are \e not parallel. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +int compare(const Linear_Row& x, const Linear_Row& y); + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Linear_Row */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +void swap(Parma_Polyhedra_Library::Linear_Row& x, + Parma_Polyhedra_Library::Linear_Row& y); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specializes std::iter_swap. +/*! \relates Parma_Polyhedra_Library::Linear_Row */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +void iter_swap(std::vector::iterator x, + std::vector::iterator y); + +} // namespace std + +/* Automatically generated from PPL source file ../src/Linear_Row.inlines.hh line 1. */ +/* Linear_Row class implementation: inline functions. +*/ + + +/* Automatically generated from PPL source file ../src/Linear_Row.inlines.hh line 27. */ +#include +#include + +namespace Parma_Polyhedra_Library { + +inline +Linear_Row::Flags::Flags() + : Row::Flags() { + // Note that the constructed type has its validity bit unset. +} + +inline +Linear_Row::Flags::Flags(const Topology t) + : Row::Flags(t << nnc_bit) { +#ifndef NDEBUG + set_bits(1 << nnc_validity_bit); +#endif +} + +inline +Linear_Row::Flags::Flags(const Topology t, const Kind k) + : Row::Flags((k << rpi_bit) | (t << nnc_bit)) { +#ifndef NDEBUG + set_bits((1 << rpi_validity_bit) + | (1 << nnc_validity_bit)); +#endif +} + +inline bool +Linear_Row::Flags::is_ray_or_point_or_inequality() const { + assert(test_bits(1 << rpi_validity_bit)); + return test_bits(RAY_OR_POINT_OR_INEQUALITY << rpi_bit); +} + +inline void +Linear_Row::Flags::set_is_ray_or_point_or_inequality() { +#ifndef NDEBUG + set_bits(1 << rpi_validity_bit); +#endif + set_bits(RAY_OR_POINT_OR_INEQUALITY << rpi_bit); +} + +inline bool +Linear_Row::Flags::is_line_or_equality() const { + assert(test_bits(1 << rpi_validity_bit)); + return !is_ray_or_point_or_inequality(); +} + +inline void +Linear_Row::Flags::set_is_line_or_equality() { +#ifndef NDEBUG + set_bits(1 << rpi_validity_bit); +#endif + reset_bits(RAY_OR_POINT_OR_INEQUALITY << rpi_bit); +} + +inline bool +Linear_Row::Flags::is_not_necessarily_closed() const { + assert(test_bits(1 << nnc_validity_bit)); + return test_bits(NOT_NECESSARILY_CLOSED << nnc_bit); +} + +inline bool +Linear_Row::Flags::is_necessarily_closed() const { + assert(test_bits(1 << nnc_validity_bit)); + return !is_not_necessarily_closed(); +} + +inline void +Linear_Row::Flags::set_not_necessarily_closed() { +#ifndef NDEBUG + set_bits(1 << nnc_validity_bit); +#endif + set_bits(NOT_NECESSARILY_CLOSED << nnc_bit); +} + +inline void +Linear_Row::Flags::set_necessarily_closed() { +#ifndef NDEBUG + set_bits(1 << nnc_validity_bit); +#endif + reset_bits(NOT_NECESSARILY_CLOSED << nnc_bit); +} + +inline Topology +Linear_Row::Flags::topology() const { + return is_necessarily_closed() ? NECESSARILY_CLOSED : NOT_NECESSARILY_CLOSED; +} + +inline bool +Linear_Row::Flags::operator==(const Flags& y) const { + base_type mask = low_bits_mask(first_free_bit); + return (get_bits() & mask) == (y.get_bits() & mask); +} + +inline bool +Linear_Row::Flags::operator!=(const Flags& y) const { + return !operator==(y); +} + +inline const Linear_Row::Flags& +Linear_Row::flags() const { + return static_cast(Row::flags()); +} + +inline Linear_Row::Flags& +Linear_Row::flags() { + return static_cast(Row::flags()); +} + +inline bool +Linear_Row::is_necessarily_closed() const { + return flags().is_necessarily_closed(); +} + +inline dimension_type +Linear_Row::max_space_dimension() { + // The first coefficient holds the inhomogeneous term or the divisor. + // In NNC rows, the last coefficient is for the epsilon dimension. + return max_size() - 2; +} + +inline dimension_type +Linear_Row::space_dimension() const { + const dimension_type sz = size(); + return (sz == 0) + ? 0 + : sz - (is_necessarily_closed() ? 1 : 2); +} + +inline +Linear_Row::Linear_Row() + : Row() { +} + +inline void +Linear_Row::construct(const dimension_type sz, const dimension_type capacity, + const Flags f) { + Row::construct(sz, capacity, f); +} + +inline +Linear_Row::Linear_Row(const dimension_type sz, const dimension_type capacity, + const Flags f) { + construct(sz, capacity, f); +} + +inline void +Linear_Row::construct(const dimension_type sz, const Flags f) { + construct(sz, sz, f); +} + +inline +Linear_Row::Linear_Row(const dimension_type sz, const Flags f) { + construct(sz, f); +} + +inline +Linear_Row::Linear_Row(const Linear_Row& y) + : Row(y) { +} + +inline +Linear_Row::Linear_Row(const Linear_Row& y, + const dimension_type capacity) + : Row(y, capacity) { +} + +inline +Linear_Row::Linear_Row(const Linear_Row& y, + const dimension_type sz, const dimension_type capacity) + : Row(y, sz, capacity) { +} + +inline +Linear_Row::~Linear_Row() { +} + +inline bool +Linear_Row::is_line_or_equality() const { + return flags().is_line_or_equality(); +} + +inline bool +Linear_Row::is_ray_or_point_or_inequality() const { + return flags().is_ray_or_point_or_inequality(); +} + +inline Topology +Linear_Row::topology() const { + return flags().topology(); +} + +inline void +Linear_Row::set_is_line_or_equality() { + flags().set_is_line_or_equality(); +} + +inline void +Linear_Row::set_is_ray_or_point_or_inequality() { + flags().set_is_ray_or_point_or_inequality(); +} + +inline void +Linear_Row::set_necessarily_closed() { + flags().set_necessarily_closed(); +} + +inline void +Linear_Row::set_not_necessarily_closed() { + flags().set_not_necessarily_closed(); +} + +inline Coefficient_traits::const_reference +Linear_Row::inhomogeneous_term() const { + return (*this)[0]; +} + +inline Coefficient_traits::const_reference +Linear_Row::coefficient(const dimension_type k) const { + return (*this)[k+1]; +} + +inline void +Linear_Row::strong_normalize() { + normalize(); + sign_normalize(); +} + +/*! \relates Linear_Row */ +inline bool +operator==(const Linear_Row& x, const Linear_Row& y) { + return x.flags() == y.flags() + && static_cast(x) == static_cast(y); +} + +/*! \relates Linear_Row */ +inline bool +operator!=(const Linear_Row& x, const Linear_Row& y) { + return !(x == y); +} + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Linear_Row */ +inline void +swap(Parma_Polyhedra_Library::Linear_Row& x, + Parma_Polyhedra_Library::Linear_Row& y) { + x.swap(y); +} + +/*! \relates Parma_Polyhedra_Library::Linear_Row */ +inline void +iter_swap(std::vector::iterator x, + std::vector::iterator y) { + swap(*x, *y); +} + +} // namespace std + +/* Automatically generated from PPL source file ../src/Linear_Row.defs.hh line 463. */ + +/* Automatically generated from PPL source file ../src/Linear_Expression.defs.hh line 1. */ +/* Linear_Expression class declaration. +*/ + + +/* Automatically generated from PPL source file ../src/Variable.defs.hh line 1. */ +/* Variable class declaration. +*/ + + +/* 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/Variable.defs.hh line 29. */ +#include +#include + +namespace Parma_Polyhedra_Library { + +namespace IO_Operators { + +//! Output operator. +/*! \relates Parma_Polyhedra_Library::Variable */ +std::ostream& +operator<<(std::ostream& s, const Variable& v); + +} // namespace IO_Operators + +//! Defines a total ordering on variables. +/*! \relates Variable */ +bool less(Variable v, Variable w); + +} // namespace Parma_Polyhedra_Library + +//! A dimension of the vector space. +/*! \ingroup PPL_CXX_interface + An object of the class Variable represents a dimension of the space, + that is one of the Cartesian axes. + Variables are used as basic blocks in order to build + more complex linear expressions. + Each variable is identified by a non-negative integer, + representing the index of the corresponding Cartesian axis + (the first axis has index 0). + The space dimension of a variable is the dimension of the vector space + made by all the Cartesian axes having an index less than or equal to + that of the considered variable; thus, if a variable has index \f$i\f$, + its space dimension is \f$i+1\f$. + + Note that the ``meaning'' of an object of the class Variable + is completely specified by the integer index provided to its + constructor: + be careful not to be mislead by C++ language variable names. + For instance, in the following example the linear expressions + e1 and e2 are equivalent, + since the two variables x and z 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 i+1 exceeds + Variable::max_space_dimension(). + */ + 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 id()+1. + */ + dimension_type space_dimension() const; + + //! Returns the total size in bytes of the memory occupied by \p *this. + memory_size_type total_memory_in_bytes() const; + + //! Returns the size in bytes of the memory managed by \p *this. + memory_size_type external_memory_in_bytes() const; + + //! Checks if all the invariants are satisfied. + bool OK() const; + + //! Type of output functions. + typedef void output_function_type(std::ostream& s, const Variable& v); + + //! Sets the output function to be used for printing Variable objects. + static void set_output_function(output_function_type* p); + + //! Returns the pointer to the current output function. + static output_function_type* get_output_function(); + + //! Binary predicate defining the total ordering on variables. + /*! \ingroup PPL_CXX_interface */ + struct Compare { + //! Returns true if and only if \p x comes before \p y. + bool operator()(Variable x, Variable y) const; + }; + +private: + //! The index of the Cartesian axis. + dimension_type varid; + + // The initialization class needs to set the default output function. + friend class Init; + + friend std::ostream& + Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s, + const Variable& v); + + //! Pointer to the current output function. + static output_function_type* current_output_function; + + //! The default output function. + static void default_output_function(std::ostream& s, const Variable& v); +}; + +/* Automatically generated from PPL source file ../src/Variable.inlines.hh line 1. */ +/* Variable class implementation: inline functions. +*/ + + +/* Automatically generated from PPL source file ../src/Variable.inlines.hh line 27. */ +#include + +namespace Parma_Polyhedra_Library { + +inline dimension_type +Variable::max_space_dimension() { + return not_a_dimension() - 1; +} + +inline +Variable::Variable(dimension_type i) + : varid(i < max_space_dimension() + ? i + : (throw std::length_error("PPL::Variable::Variable(i):\n" + "i exceeds the maximum allowed " + "variable identifier."), i)) { +} + +inline dimension_type +Variable::id() const { + return varid; +} + +inline dimension_type +Variable::space_dimension() const { + return varid + 1; +} + +inline memory_size_type +Variable::external_memory_in_bytes() const { + return 0; +} + +inline memory_size_type +Variable::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +inline void +Variable::set_output_function(output_function_type* p) { + current_output_function = p; +} + +inline Variable::output_function_type* +Variable::get_output_function() { + return current_output_function; +} + +/*! \relates Variable */ +inline bool +less(const Variable v, const Variable w) { + return v.id() < w.id(); +} + +inline bool +Variable::Compare::operator()(const Variable x, const Variable y) const { + return less(x, y); +} + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Variable.defs.hh line 147. */ + +/* Automatically generated from PPL source file ../src/Constraint_System.types.hh line 1. */ + + +namespace Parma_Polyhedra_Library { + +class Constraint_System; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Generator_System.types.hh line 1. */ + + +namespace Parma_Polyhedra_Library { + +class Generator_System; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Congruence_System.types.hh line 1. */ + + +namespace Parma_Polyhedra_Library { + +class Congruence_System; + +} + +/* 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/Polyhedron.types.hh line 1. */ + + +namespace Parma_Polyhedra_Library { + +class Polyhedron; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Grid.types.hh line 1. */ + + +namespace Parma_Polyhedra_Library { + +class Grid; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Linear_Expression.defs.hh line 41. */ +#include + +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 + Linear_Expression::max_space_dimension(). + */ +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 + Linear_Expression::max_space_dimension(). + */ +Linear_Expression& +operator-=(Linear_Expression& e, Variable v); + +//! Returns the linear expression \p e - \p n and assigns it to \p e. +/*! \relates Linear_Expression */ +Linear_Expression& +operator-=(Linear_Expression& e, Coefficient_traits::const_reference n); + +//! Returns the linear expression \p n * \p e and assigns it to \p e. +/*! \relates Linear_Expression */ +Linear_Expression& +operator*=(Linear_Expression& e, Coefficient_traits::const_reference n); + +namespace IO_Operators { + +//! Output operator. +/*! \relates Parma_Polyhedra_Library::Linear_Expression */ +std::ostream& operator<<(std::ostream& s, const Linear_Expression& e); + +} // namespace IO_Operators + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Linear_Expression */ +void swap(Parma_Polyhedra_Library::Linear_Expression& x, + Parma_Polyhedra_Library::Linear_Expression& y); + +} // namespace std + +//! A linear expression. +/*! \ingroup PPL_CXX_interface + An object of the class Linear_Expression represents the linear expression + \f[ + \sum_{i=0}^{n-1} a_i x_i + b + \f] + where \f$n\f$ is the dimension of the vector space, + each \f$a_i\f$ is the integer coefficient + of the \f$i\f$-th variable \f$x_i\f$ + and \f$b\f$ is the integer for the inhomogeneous term. + + \par How to build a linear expression. + + Linear expressions are the basic blocks for defining + both constraints (i.e., linear equalities or inequalities) + and generators (i.e., lines, rays, points and closure points). + A full set of functions is defined to provide a convenient interface + for building complex linear expressions starting from simpler ones + and from objects of the classes Variable and Coefficient: + available operators include unary negation, + binary addition and subtraction, + as well as multiplication by a Coefficient. + The space dimension of a linear expression is defined as the maximum + space dimension of the arguments used to build it: + in particular, the space dimension of a Variable x + is defined as x.id()+1, + whereas all the objects of the class Coefficient have space dimension zero. + + \par Example + The following code builds the linear expression \f$4x - 2y - z + 14\f$, + having space dimension \f$3\f$: + \code + Linear_Expression e = 4*x - 2*y - z + 14; + \endcode + Another way to build the same linear expression is: + \code + Linear_Expression e1 = 4*x; + Linear_Expression e2 = 2*y; + Linear_Expression e3 = z; + Linear_Expression e = Linear_Expression(14); + e += e1 - e2 - e3; + \endcode + Note that \p e1, \p e2 and \p e3 have space dimension 1, 2 and 3, + respectively; also, in the fourth line of code, \p e is created + with space dimension zero and then extended to space dimension 3 + in the fifth line. +*/ +class Parma_Polyhedra_Library::Linear_Expression : private Linear_Row { +public: + //! Default constructor: returns a copy of Linear_Expression::zero(). + Linear_Expression(); + + //! Ordinary copy-constructor. + Linear_Expression(const Linear_Expression& e); + + //! Destructor. + ~Linear_Expression(); + + /*! \brief + Builds the linear expression corresponding + to the inhomogeneous term \p n. + */ + explicit Linear_Expression(Coefficient_traits::const_reference n); + + //! Builds the linear expression corresponding to the variable \p v. + /*! + \exception std::length_error + Thrown if the space dimension of \p v exceeds + Linear_Expression::max_space_dimension(). + */ + Linear_Expression(Variable v); + + //! Builds the linear expression corresponding to constraint \p c. + /*! + Given the constraint + \f$c = \bigl(\sum_{i=0}^{n-1} a_i x_i + b \relsym 0\bigr)\f$, + where \f$\mathord{\relsym} \in \{ =, \geq, > \}\f$, + this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i + b\f$. + If \p c is an inequality (resp., equality) constraint, then + the built linear expression is unique up to a positive + (resp., non-zero) factor. + */ + explicit Linear_Expression(const Constraint& c); + + /*! \brief + Builds the linear expression corresponding to generator \p g + (for points and closure points, the divisor is not copied). + + Given the generator + \f$g = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$ + (where, for lines and rays, we have \f$d = 1\f$), + this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i\f$. + The inhomogeneous term of the linear expression will always be 0. + If \p g is a ray, point or closure point (resp., a line), then + the linear expression is unique up to a positive + (resp., non-zero) factor. + */ + explicit Linear_Expression(const Generator& g); + + /*! \brief + Builds the linear expression corresponding to grid generator \p g + (for points, parameters and lines the divisor is not copied). + + Given the grid generator + \f$g = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$ + this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i\f$. + The inhomogeneous term of the linear expression is always 0. + */ + explicit Linear_Expression(const Grid_Generator& g); + + //! Builds the linear expression corresponding to congruence \p cg. + /*! + Given the congruence + \f$cg = \bigl(\sum_{i=0}^{n-1} a_i x_i + b = 0 \pmod{m}\bigr)\f$, + this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i + b\f$. + */ + explicit Linear_Expression(const Congruence& cg); + + //! Returns the maximum space dimension a Linear_Expression can handle. + static dimension_type max_space_dimension(); + + //! Returns the dimension of the vector space enclosing \p *this. + dimension_type space_dimension() const; + + //! Returns the coefficient of \p v in \p *this. + Coefficient_traits::const_reference coefficient(Variable v) const; + + //! Returns the inhomogeneous term of \p *this. + Coefficient_traits::const_reference inhomogeneous_term() const; + + //! 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; + + 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 true if successful, false otherwise. + */ + bool ascii_load(std::istream& s); + + //! Checks if all the invariants are satisfied. + bool OK() const; + + //! Swaps \p *this with \p y. + void swap(Linear_Expression& y); + +private: + /*! \brief + Holds (between class initialization and finalization) a pointer to + the (zero-dimension space) constant 0. + */ + static const Linear_Expression* zero_p; + + friend class Parma_Polyhedra_Library::Scalar_Products; + friend class Parma_Polyhedra_Library::Constraint; + friend class Parma_Polyhedra_Library::Generator; + // The following declaration grants access to Grid_Generator::parameter. + friend class Parma_Polyhedra_Library::Grid_Generator; + friend class Parma_Polyhedra_Library::Congruence; + // FIXME: the following friend declaration should be avoided. + friend class Parma_Polyhedra_Library::Polyhedron; + friend class Parma_Polyhedra_Library::Grid; + + // FIXME: the following friend declaration is only to grant access to + // Constraint_System::affine_preimage(). + friend class Parma_Polyhedra_Library::Constraint_System; + + // FIXME: the following friend declaration is only to grant access to + // Generator_System::affine_image(). + friend class Parma_Polyhedra_Library::Generator_System; + + // FIXME: the following friend declaration is only to grant access to + // Congruence_System::affine_preimage(). + friend class Parma_Polyhedra_Library::Congruence_System; + + // FIXME: the following friend declaration is only to grant access to + // Grid_Generator_System::affine_image(). + friend class Parma_Polyhedra_Library::Grid_Generator_System; + + //! Copy-constructor with a specified space dimension. + Linear_Expression(const Linear_Expression& e, dimension_type sz); + + //! Implementation sizing constructor. + /*! + The bool parameter is just to avoid problems with + the constructor Linear_Expression(Coefficient_traits::const_reference n). + */ + Linear_Expression(dimension_type sz, bool); + + /*! \brief + Builds the linear expression 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 + Linear_Expression::max_space_dimension(). + */ + Linear_Expression(Variable v, Variable w); + + 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 std::ostream& + Parma_Polyhedra_Library::IO_Operators + ::operator<<(std::ostream& s, const Linear_Expression& e); +}; + +/* Automatically generated from PPL source file ../src/Linear_Expression.inlines.hh line 1. */ +/* Linear_Expression class implementation: inline functions. +*/ + + +/* Automatically generated from PPL source file ../src/Linear_Expression.inlines.hh line 28. */ +#include + +namespace Parma_Polyhedra_Library { + +inline dimension_type +Linear_Expression::max_space_dimension() { + return Linear_Row::max_space_dimension(); +} + +inline +Linear_Expression::Linear_Expression() + : Linear_Row(1, Linear_Row::Flags()) { +} + +inline +Linear_Expression::Linear_Expression(dimension_type sz, bool) + : Linear_Row(sz, Linear_Row::Flags()) { +} + +inline +Linear_Expression::Linear_Expression(const Linear_Expression& e) + : Linear_Row(e) { +} + +inline +Linear_Expression::~Linear_Expression() { +} + +inline +Linear_Expression::Linear_Expression(const Linear_Expression& e, + dimension_type sz) + : Linear_Row(e, sz, sz) { +} + +inline +Linear_Expression::Linear_Expression(Coefficient_traits::const_reference n) + : Linear_Row(1, Linear_Row::Flags()) { + (*this)[0] = n; +} + +inline dimension_type +Linear_Expression::space_dimension() const { + return size() - 1; +} + +inline Coefficient_traits::const_reference +Linear_Expression::coefficient(Variable v) const { + if (v.space_dimension() > space_dimension()) + return Coefficient_zero(); + return Linear_Row::coefficient(v.id()); +} + +inline Coefficient_traits::const_reference +Linear_Expression::inhomogeneous_term() const { + return Linear_Row::inhomogeneous_term(); +} + +inline const Linear_Expression& +Linear_Expression::zero() { + assert(zero_p != 0); + return *zero_p; +} + +inline memory_size_type +Linear_Expression::external_memory_in_bytes() const { + return Linear_Row::external_memory_in_bytes(); +} + +inline memory_size_type +Linear_Expression::total_memory_in_bytes() const { + return Linear_Row::total_memory_in_bytes(); +} + +/*! \relates Linear_Expression */ +inline Linear_Expression +operator+(const Linear_Expression& e) { + return e; +} + +/*! \relates Linear_Expression */ +inline Linear_Expression +operator+(const Linear_Expression& e, Coefficient_traits::const_reference n) { + return n + e; +} + +/*! \relates Linear_Expression */ +inline Linear_Expression +operator+(const Linear_Expression& e, const Variable v) { + return v + e; +} + +/*! \relates Linear_Expression */ +inline Linear_Expression +operator-(const Linear_Expression& e, Coefficient_traits::const_reference n) { + return -n + e; +} + +/*! \relates Linear_Expression */ +inline Linear_Expression +operator-(const Variable v, const Variable w) { + return Linear_Expression(v, w); +} + +/*! \relates Linear_Expression */ +inline Linear_Expression +operator*(const Linear_Expression& e, Coefficient_traits::const_reference n) { + return n * e; +} + +/*! \relates Linear_Expression */ +inline Linear_Expression& +operator+=(Linear_Expression& e, Coefficient_traits::const_reference n) { + e[0] += n; + return e; +} + +/*! \relates Linear_Expression */ +inline Linear_Expression& +operator-=(Linear_Expression& e, Coefficient_traits::const_reference n) { + e[0] -= n; + return e; +} + +inline void +Linear_Expression::swap(Linear_Expression& y) { + Linear_Row::swap(y); +} + +inline void +Linear_Expression::ascii_dump(std::ostream& s) const { + Linear_Row::ascii_dump(s); +} + +inline bool +Linear_Expression::ascii_load(std::istream& s) { + return Linear_Row::ascii_load(s); +} + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Linear_Expression */ +inline void +swap(Parma_Polyhedra_Library::Linear_Expression& x, + Parma_Polyhedra_Library::Linear_Expression& y) { + x.swap(y); +} + +} // namespace std + +/* Automatically generated from PPL source file ../src/Linear_Expression.defs.hh line 460. */ + +/* Automatically generated from PPL source file ../src/Constraint.defs.hh line 1. */ +/* Constraint class declaration. +*/ + + +/* Automatically generated from PPL source file ../src/Constraint_System.defs.hh line 1. */ +/* Constraint_System class declaration. +*/ + + +/* Automatically generated from PPL source file ../src/Linear_System.defs.hh line 1. */ +/* Linear_System class declaration. +*/ + + +/* Automatically generated from PPL source file ../src/Linear_System.types.hh line 1. */ + + +namespace Parma_Polyhedra_Library { + +class Linear_System; + +} // namespace Parma_Polyhedra_Library + +/* 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/Matrix.defs.hh line 1. */ +/* Matrix class declaration. +*/ + + +/* Automatically generated from PPL source file ../src/Matrix.types.hh line 1. */ + + +namespace Parma_Polyhedra_Library { + +class Matrix; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Matrix.defs.hh line 31. */ +#include +#include + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! A 2-dimensional matrix of coefficients. +/*! \ingroup PPL_CXX_interface + A Matrix object is a sequence of Row objects and is characterized + by the matrix dimensions (the number of rows and columns). + All the rows in a matrix, besides having the same size (corresponding + to the number of columns of the matrix), are also bound to have the + same capacity. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) + +class Parma_Polyhedra_Library::Matrix { +public: + //! Returns the maximum number of rows of a Matrix. + static dimension_type max_num_rows(); + + //! Returns the maximum number of columns of a Matrix. + static dimension_type max_num_columns(); + + //! Builds an empty matrix. + /*! + Rows' size and capacity are initialized to \f$0\f$. + */ + Matrix(); + + //! Builds a zero matrix with specified dimensions and flags. + /*! + \param n_rows + The number of rows of the matrix that will be created; + + \param n_columns + The number of columns of the matrix that will be created. + + \param row_flags + The flags used to build the rows of the matrix; + by default, the rows will have all flags unset. + */ + Matrix(dimension_type n_rows, dimension_type n_columns, + Row::Flags row_flags = Row::Flags()); + + //! Copy-constructor. + Matrix(const Matrix& y); + + //! Destructor. + ~Matrix(); + + //! Assignment operator. + Matrix& operator=(const Matrix& y); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS + //! An iterator over a matrix. + /*! \ingroup PPL_CXX_interface + A const_iterator is used to provide read-only access + to each row contained in a Matrix object. + */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) + class const_iterator { + private: + typedef std::vector::const_iterator Iter; + //! The const iterator on the rows' vector \p rows. + Iter i; + + public: + typedef std::forward_iterator_tag iterator_category; + typedef std::iterator_traits::value_type value_type; + typedef std::iterator_traits::difference_type difference_type; + typedef std::iterator_traits::pointer pointer; + typedef std::iterator_traits::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 true if and only if + \p *this and \p y are identical. + */ + bool operator==(const const_iterator& y) const; + + /*! \brief + Returns true if and only if + \p *this and \p y are different. + */ + bool operator!=(const const_iterator& y) const; + }; + + //! Returns true 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; + + /*! \brief + Returns the const_iterator pointing to the first row, if \p *this is + not empty; otherwise, returns the past-the-end const_iterator. + */ + const_iterator begin() const; + + //! Returns the past-the-end const_iterator. + const_iterator end() const; + + // FIXME: the following section must become private. +protected: + //! Contains the rows of the matrix. + std::vector rows; + + //! Size of the initialized part of each row. + dimension_type row_size; + + //! Capacity allocated for each row. + dimension_type row_capacity; + +public: + //! Swaps \p *this with \p y. + void swap(Matrix& y); + + //! Adds to the matrix \p n rows of zeroes with flags set to \p row_flags. + /*! + \param n + The number of rows to be added: must be strictly positive. + + \param row_flags + Flags for the newly added rows. + + Turns the \f$r \times c\f$ matrix \f$M\f$ into + the \f$(r+n) \times c\f$ matrix \f$\genfrac{(}{)}{0pt}{}{M}{0}\f$. + The matrix is expanded avoiding reallocation whenever possible. + */ + void add_zero_rows(dimension_type n, Row::Flags row_flags); + + //! Adds \p n columns of zeroes to the matrix. + /*! + \param n + The number of columns to be added: must be strictly positive. + + Turns the \f$r \times c\f$ matrix \f$M\f$ into + the \f$r \times (c+n)\f$ matrix \f$(M \, 0)\f$. + The matrix is expanded avoiding reallocation whenever possible. + */ + void add_zero_columns(dimension_type n); + + //! Adds \p n rows and \p m columns of zeroes to the matrix. + /*! + \param n + The number of rows to be added: must be strictly positive. + + \param m + The number of columns to be added: must be strictly positive. + + \param row_flags + Flags for the newly added rows. + + Turns the \f$r \times c\f$ matrix \f$M\f$ into + the \f$(r+n) \times (c+m)\f$ matrix + \f$\bigl(\genfrac{}{}{0pt}{}{M}{0} \genfrac{}{}{0pt}{}{0}{0}\bigr)\f$. + The matrix is expanded avoiding reallocation whenever possible. + */ + void add_zero_rows_and_columns(dimension_type n, dimension_type m, + Row::Flags row_flags); + + //! Adds a copy of the row \p y to the matrix. + /*! + \param y + The row to be copied: it must have the same number of columns as + the matrix. + + Turns the \f$r \times c\f$ matrix \f$M\f$ into + the \f$(r+1) \times c\f$ matrix + \f$\genfrac{(}{)}{0pt}{}{M}{0}\f$. + The matrix is expanded avoiding reallocation whenever possible. + */ + void add_row(const Row& y); + + //! Adds the row \p y to the matrix. + /*! + \param y + The row to be added: it must have the same size and capacity as \p + *this. + + Turns the \f$r \times c\f$ matrix \f$M\f$ into + the \f$(r+1) \times c\f$ matrix + \f$\genfrac{(}{)}{0pt}{}{M}{0}\f$. + The matrix is expanded avoiding reallocation whenever possible. + */ + void add_recycled_row(Row& y); + + //! Makes the matrix shrink by removing its \p n trailing columns. + void remove_trailing_columns(dimension_type n); + + //! Resizes the matrix without worrying about the old contents. + /*! + \param new_n_rows + The number of rows of the resized matrix; + + \param new_n_columns + The number of columns of the resized matrix. + + \param row_flags + The flags of the rows eventually added to the matrix. + + The matrix is expanded to the specified dimensions avoiding + reallocation whenever possible. + The contents of the original matrix is lost. + */ + void resize_no_copy(dimension_type new_n_rows, dimension_type new_n_columns, + Row::Flags row_flags); + + //! Swaps the columns having indexes \p i and \p j. + void swap_columns(dimension_type i, dimension_type j); + + //! Permutes the columns of the matrix. + /* + \param cycles + A vector representing the non-trivial cycles of the permutation + according to which the columns must be rearranged. + + The \p cycles vector contains, one after the other, the + non-trivial cycles (i.e., the cycles of length greater than one) + of a permutation of non-zero column indexes. Each cycle is + terminated by zero. For example, assuming the matrix has 6 + columns, the permutation \f$ \{ 1 \mapsto 3, 2 \mapsto 4, + 3 \mapsto 6, 4 \mapsto 2, 5 \mapsto 5, 6 \mapsto 1 \}\f$ can be + represented by the non-trivial cycles \f$(1 3 6)(2 4)\f$ that, in + turn can be represented by a vector of 6 elements containing 1, 3, + 6, 0, 2, 4, 0. + */ + void permute_columns(const std::vector& cycles); + + //! \name Accessors + //@{ + + //! Returns the number of columns of the matrix (i.e., the size of the rows). + dimension_type num_columns() const; + + //! Returns the number of rows in the matrix. + dimension_type num_rows() const; + //@} // Accessors + + //! \name Subscript operators + //@{ + //! Returns a reference to the \p k-th row of the matrix. + Row& operator[](dimension_type k); + + //! Returns a constant reference to the \p k-th row of the matrix. + const Row& operator[](dimension_type k) const; + //@} // Subscript operators + + //! Clears the matrix deallocating all its rows. + void clear(); + + PPL_OUTPUT_DECLARATIONS + + /*! \brief + Loads from \p s an ASCII representation (as produced by + ascii_dump(std::ostream&) const) and sets \p *this accordingly. + Returns true if successful, false otherwise. + */ + bool ascii_load(std::istream& s); + + //! Returns the total size in bytes of the memory occupied by \p *this. + memory_size_type total_memory_in_bytes() const; + + //! Returns the size in bytes of the memory managed by \p *this. + memory_size_type external_memory_in_bytes() const; + + /*! \brief + Erases from the matrix all the rows but those having + an index less than \p first_to_erase. + */ + void erase_to_end(dimension_type first_to_erase); + + //! Checks if all the invariants are satisfied. + bool OK() const; +}; + +namespace std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS + //! Specializes std::swap. + /*! \relates Parma_Polyhedra_Library::Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +void swap(Parma_Polyhedra_Library::Matrix& x, + Parma_Polyhedra_Library::Matrix& y); + +} // namespace std + + +namespace Parma_Polyhedra_Library { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns true if and only if \p x and \p y are identical. +/*! \relates Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +bool operator==(const Matrix& x, const Matrix& y); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns true if and only if \p x and \p y are different. +/*! \relates Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +bool operator!=(const Matrix& x, const Matrix& y); + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Matrix.inlines.hh line 1. */ +/* Matrix class implementation: inline functions. +*/ + + +/* Automatically generated from PPL source file ../src/Matrix.inlines.hh line 27. */ +#include +#include + +namespace Parma_Polyhedra_Library { + +inline dimension_type +Matrix::max_num_rows() { + return std::vector().max_size(); +} + +inline dimension_type +Matrix::max_num_columns() { + return Row::max_size(); +} + +inline memory_size_type +Matrix::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +inline +Matrix::const_iterator::const_iterator() + : i(Iter()) { +} + +inline +Matrix::const_iterator::const_iterator(const Iter& b) + : i(b) { +} + +inline +Matrix::const_iterator::const_iterator(const const_iterator& y) + : i(y.i) { +} + +inline Matrix::const_iterator& +Matrix::const_iterator::operator=(const const_iterator& y) { + i = y.i; + return *this; +} + +inline Matrix::const_iterator::reference +Matrix::const_iterator::operator*() const { + return *i; +} + +inline Matrix::const_iterator::pointer +Matrix::const_iterator::operator->() const { + return &*i; +} + +inline Matrix::const_iterator& +Matrix::const_iterator::operator++() { + ++i; + return *this; +} + +inline Matrix::const_iterator +Matrix::const_iterator::operator++(int) { + return const_iterator(i++); +} + +inline bool +Matrix::const_iterator::operator==(const const_iterator& y) const { + return i == y.i; +} + +inline bool +Matrix::const_iterator::operator!=(const const_iterator& y) const { + return !operator==(y); +} + +inline bool +Matrix::has_no_rows() const { + return rows.empty(); +} + +inline Matrix::const_iterator +Matrix::begin() const { + return const_iterator(rows.begin()); +} + +inline Matrix::const_iterator +Matrix::end() const { + return const_iterator(rows.end()); +} + +inline void +Matrix::swap(Matrix& y) { + std::swap(rows, y.rows); + std::swap(row_size, y.row_size); + std::swap(row_capacity, y.row_capacity); +} + +inline +Matrix::Matrix() + : rows(), + row_size(0), + row_capacity(0) { +} + +inline +Matrix::Matrix(const Matrix& y) + : rows(y.rows), + row_size(y.row_size), + row_capacity(compute_capacity(y.row_size, max_num_columns())) { +} + +inline +Matrix::~Matrix() { +} + +inline Matrix& +Matrix::operator=(const Matrix& y) { + // Without the following guard against auto-assignments we would + // recompute the row capacity based on row size, possibly without + // actually increasing the capacity of the rows. This would lead to + // an inconsistent state. + if (this != &y) { + // The following assignment may do nothing on auto-assignments... + rows = y.rows; + row_size = y.row_size; + // ... hence the following assignment must not be done on + // auto-assignments. + row_capacity = compute_capacity(y.row_size, max_num_columns()); + } + return *this; +} + +inline void +Matrix::add_row(const Row& y) { + Row new_row(y, row_capacity); + add_recycled_row(new_row); +} + +inline Row& +Matrix::operator[](const dimension_type k) { + assert(k < rows.size()); + return rows[k]; +} + +inline const Row& +Matrix::operator[](const dimension_type k) const { + assert(k < rows.size()); + return rows[k]; +} + +inline dimension_type +Matrix::num_rows() const { + return rows.size(); +} + +inline dimension_type +Matrix::num_columns() const { + return row_size; +} + +/*! \relates Matrix */ +inline bool +operator!=(const Matrix& x, const Matrix& y) { + return !(x == y); +} + +inline void +Matrix::erase_to_end(const dimension_type first_to_erase) { + assert(first_to_erase <= rows.size()); + if (first_to_erase < rows.size()) + rows.erase(rows.begin() + first_to_erase, rows.end()); +} + +inline void +Matrix::clear() { + // Clear `rows' and minimize its capacity. + std::vector().swap(rows); + row_size = 0; + row_capacity = 0; +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Matrix */ +inline void +swap(Parma_Polyhedra_Library::Matrix& x, + Parma_Polyhedra_Library::Matrix& y) { + x.swap(y); +} + +} // namespace std + +/* Automatically generated from PPL source file ../src/Matrix.defs.hh line 366. */ + +/* Automatically generated from PPL source file ../src/Linear_System.defs.hh line 33. */ + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! The base class for systems of constraints and generators. +/*! \ingroup PPL_CXX_interface + An object of this class represents either a constraint system + or a generator system. Each Linear_System object can be viewed + as a finite sequence of strong-normalized Linear_Row objects, + where each Linear_Row implements a constraint or a generator. + Linear systems are characterized by the matrix of coefficients, + also encoding the number, size and capacity of Linear_row objects, + as well as a few additional information, including: + - the topological kind of (all) the rows; + - an indication of whether or not some of the rows in the Linear_System + are pending, 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 true, ensures that the + non-pending prefix of the sequence of rows is sorted. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) + +class Parma_Polyhedra_Library::Linear_System : public Matrix { +public: + //! Builds an empty linear system with specified topology. + /*! + Rows size and capacity are initialized to \f$0\f$. + */ + Linear_System(Topology topol); + + //! Builds a system with specified topology and dimensions. + /*! + \param topol + The topology of the system that will be created; + + \param n_rows + The number of rows of the system that will be created; + + \param n_columns + The number of columns of the system that will be created. + + Creates a \p n_rows \f$\times\f$ \p n_columns system whose + coefficients are all zero and whose rows are all initialized + to be of the given topology. + */ + Linear_System(Topology topol, + dimension_type n_rows, dimension_type n_columns); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS + //! A tag class. + /*! \ingroup PPL_CXX_interface + Tag class to differentiate the Linear_System copy-constructor that + copies pending rows as pending from the one that transforms + pending rows into non-pending ones. + */ +#endif // 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); + + //! Full copy-constructor: pending rows are copied as pending. + Linear_System(const Linear_System& y, With_Pending); + + //! Assignment operator: pending rows are transformed into non-pending ones. + Linear_System& operator=(const Linear_System& y); + + //! Full assignment operator: pending rows are copied as pending. + void assign_with_pending(const Linear_System& y); + + //! Swaps \p *this with \p y. + void swap(Linear_System& y); + + //! Returns the maximum space dimension a Linear_System can handle. + static dimension_type max_space_dimension(); + + //! Returns the space dimension of the rows in the system. + /*! + The computation of the space dimension correctly ignores + the column encoding the inhomogeneous terms of constraint + (resp., the divisors of generators); + if the system topology is NOT_NECESSARILY_CLOSED, + also the column of the \f$\epsilon\f$-dimension coefficients + will be ignored. + */ + dimension_type space_dimension() const; + + //! Makes the system shrink by removing its \p n trailing columns. + void remove_trailing_columns(dimension_type n); + + //! Permutes the columns of the system. + /* + \param cycles + A vector representing the non-trivial cycles of the permutation + according to which the columns must be rearranged. + + The \p cycles vector contains, one after the other, the + non-trivial cycles (i.e., the cycles of length greater than one) + of a permutation of non-zero column indexes. Each cycle is + terminated by zero. For example, assuming the system has 6 + columns, the permutation \f$ \{ 1 \mapsto 3, 2 \mapsto 4, + 3 \mapsto 6, 4 \mapsto 2, 5 \mapsto 5, 6 \mapsto 1 \}\f$ can be + represented by the non-trivial cycles \f$(1 3 6)(2 4)\f$ that, in + turn can be represented by a vector of 6 elements containing 1, 3, + 6, 0, 2, 4, 0. + */ + void permute_columns(const std::vector& cycles); + + //! \name Subscript operators + //@{ + //! Returns a reference to the \p k-th row of the system. + Linear_Row& operator[](dimension_type k); + + //! Returns a constant reference to the \p k-th row of the system. + const Linear_Row& operator[](dimension_type k) const; + //@} // Subscript operators + + //! Strongly normalizes the system. + void strong_normalize(); + + //! Sign-normalizes the system. + void sign_normalize(); + + //! \name Accessors + //@{ + //! Returns the system topology. + Topology topology() const; + + //! Returns the value of the sortedness flag. + bool is_sorted() const; + + /*! \brief + Returns true if and only if + the system topology is NECESSARILY_CLOSED. + */ + 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 true if and only if \p *this is sorted, + without checking for duplicates. + */ + bool check_sorted() const; + + //! Sets the system topology to NECESSARILY_CLOSED. + void set_necessarily_closed(); + + //! Sets the system topology to NOT_NECESSARILY_CLOSED. + void set_not_necessarily_closed(); + + //! Sets the topology of all rows equal to the system topology. + void set_rows_topology(); + + //! Sets the index to indicate that the system has no pending rows. + void unset_pending_rows(); + + //! Sets the index of the first pending row to \p i. + void set_index_first_pending_row(dimension_type i); + + //! Sets the sortedness flag of the system to \p b. + void set_sorted(bool b); + + //! Resizes the system without worrying about the old contents. + /*! + \param new_n_rows + The number of rows of the resized system; + + \param new_n_columns + The number of columns of the resized system. + + The system is expanded to the specified dimensions avoiding + reallocation whenever possible. + The contents of the original system is lost. + */ + void resize_no_copy(dimension_type new_n_rows, dimension_type new_n_columns); + + //! Adds \p n rows and columns to the system. + /*! + \param n + The number of rows and columns to be added: must be strictly positive. + + Turns the system \f$M \in \Rset^r \times \Rset^c\f$ into + the system \f$N \in \Rset^{r+n} \times \Rset^{c+n}\f$ + such that + \f$N = \bigl(\genfrac{}{}{0pt}{}{0}{M}\genfrac{}{}{0pt}{}{J}{o}\bigr)\f$, + where \f$J\f$ is the specular image + of the \f$n \times n\f$ identity matrix. + */ + void add_rows_and_columns(dimension_type n); + + /*! \brief + Adds a copy of \p r to the system, + automatically resizing the system or the row's copy, if needed. + */ + void insert(const Linear_Row& r); + + /*! \brief + Adds a copy of the given row to the pending part of the system, + automatically resizing the system or the row, if needed. + */ + void insert_pending(const Linear_Row& r); + + //! Adds a copy of the given row to the system. + void add_row(const Linear_Row& r); + + //! Adds a new empty row to the system, setting only its flags. + void add_pending_row(Linear_Row::Flags flags); + + //! Adds a copy of the given row to the pending part of the system. + void add_pending_row(const Linear_Row& r); + + //! Adds to \p *this a copy of the rows of `y'. + /*! + It is assumed that \p *this has no pending rows. + */ + void add_rows(const Linear_System& y); + + //! Adds a copy of the rows of `y' to the pending part of `*this'. + void add_pending_rows(const Linear_System& y); + + /*! \brief + Sorts the non-pending rows (in growing order) and eliminates + duplicated ones. + */ + void sort_rows(); + + /*! \brief + Sorts the rows (in growing order) form \p first_row to + \p last_row and eliminates duplicated ones. + */ + void sort_rows(dimension_type first_row, dimension_type last_row); + + /*! \brief + Assigns to \p *this the result of merging its rows with + those of \p y, obtaining a sorted system. + + Duplicated rows will occur only once in the result. + On entry, both systems are assumed to be sorted and have + no pending rows. + */ + void merge_rows_assign(const Linear_System& y); + + /*! \brief + Sorts the pending rows and eliminates those that also occur + in the non-pending part of the system. + */ + void sort_pending_and_remove_duplicates(); + + class With_Bit_Matrix_iterator; + + /*! \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 columns. + */ + dimension_type gauss(dimension_type n_lines_or_equalities); + + /*! \brief + Back-substitutes the coefficients to reduce + the complexity of the system. + + Takes an upper triangular system having \p n_lines_or_equalities rows. + For each row, starting from the one having the minimum number of + coefficients different from zero, computes the expression of an element + as a function of the remaining ones and then substitutes this expression + in all the other rows. + */ + void back_substitute(dimension_type n_lines_or_equalities); + + /*! \brief + Applies Gaussian elimination and back-substitution so as to + simplify the linear system. + */ + void simplify(); + + /*! \brief + Normalizes the system by dividing each row for the GCD of the + row's elements. + */ + void normalize(); + + //! Clears the system deallocating all its rows. + void clear(); + + PPL_OUTPUT_DECLARATIONS + + /*! \brief + Loads from \p s an ASCII representation (as produced by + ascii_dump(std::ostream&) const) and sets \p *this accordingly. + Returns true if successful, false 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; + + //! Checks if all the invariants are satisfied. + /*! + \param check_strong_normalized + true if and only if the strong normalization of all + the rows in the system has to be checked. + + By default, the strong normalization check is performed. + This check may be turned off to avoid useless repeated checking; + e.g., when re-checking a well-formed Linear_System after the permutation + or deletion of some of its rows. + */ + bool OK(bool check_strong_normalized = true) const; + +private: + //! The topological kind of the rows in the system. + Topology row_topology; + + //! The index of the first pending row. + dimension_type index_first_pending; + + /*! \brief + true if rows are sorted in the ascending order as defined by + bool compare(const Linear_Row&, const Linear_Row&). + If false may not be sorted. + */ + bool sorted; + + //! Ordering predicate (used when implementing the sort algorithm). + struct Row_Less_Than { + bool operator()(const Row& x, const Row& y) const; + }; +}; + +namespace std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Linear_System */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +void swap(Parma_Polyhedra_Library::Linear_System& x, + Parma_Polyhedra_Library::Linear_System& y); + +} // namespace std + +namespace Parma_Polyhedra_Library { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns true if and only if \p x and \p y are identical. +/*! \relates Linear_System */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +bool operator==(const Linear_System& x, const Linear_System& y); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns true if and only if \p x and \p y are different. +/*! \relates Linear_System */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +bool operator!=(const Linear_System& x, const Linear_System& y); + +} // namespace Parma_Polyhedra_Library + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! An iterator keeping a Linear_System consistent with a Bit_Matrix. +/*! \ingroup PPL_CXX_interface + An iterator on the vector of Row objects encoded in a Linear_System + extended to maintain a corresponding iterator on a vector of + Bit_Row objects. Access to values is always done on the Row + objects, but iterator movements and swaps are done on both components. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +class Parma_Polyhedra_Library::Linear_System::With_Bit_Matrix_iterator { +public: + typedef std::vector::iterator Iter1; + typedef std::vector::iterator Iter2; + +private: + Iter1 i1; + Iter2 i2; + +public: + // Same traits as Iter1. + typedef std::iterator_traits::iterator_category iterator_category; + typedef std::iterator_traits::value_type value_type; + typedef std::iterator_traits::difference_type difference_type; + typedef std::iterator_traits::pointer pointer; + typedef std::iterator_traits::reference reference; + + //! Constructor. + With_Bit_Matrix_iterator(Iter1 iter1, Iter2 iter2); + + //! Copy-constructor. + With_Bit_Matrix_iterator(const With_Bit_Matrix_iterator& y); + + //! Destructor. + ~With_Bit_Matrix_iterator(); + + //! Assignment operator. + With_Bit_Matrix_iterator& + operator=(const With_Bit_Matrix_iterator& y); + + //! \name Operators Implementing Iterator Movement + //@{ + With_Bit_Matrix_iterator& operator++(); + With_Bit_Matrix_iterator operator++(int); + + With_Bit_Matrix_iterator& operator--(); + With_Bit_Matrix_iterator operator--(int); + + With_Bit_Matrix_iterator& operator+=(difference_type d); + With_Bit_Matrix_iterator operator+(difference_type d) const; + + With_Bit_Matrix_iterator& operator-=(difference_type d); + With_Bit_Matrix_iterator operator-(difference_type d) const; + //@} + + //! Distance operator. + difference_type operator-(const With_Bit_Matrix_iterator& y) const; + + //! \name Comparisons between Iterators + //@{ + bool operator==(const With_Bit_Matrix_iterator& y) const; + bool operator!=(const With_Bit_Matrix_iterator& y) const; + bool operator<(const With_Bit_Matrix_iterator& y) const; + //@} + + //! Dereference operator. + reference operator*() const; + + //! Access-through operator. + pointer operator->() const; + + //! Swaps the pointed Row objects while keeping Bit_Matrix consistent. + void iter_swap(const With_Bit_Matrix_iterator& y) const; + +}; + +namespace std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specializes std::iter_swap. +/*! \relates Parma_Polyhedra_Library::Linear_System::With_Bit_Matrix_iterator */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +void +iter_swap(Parma_Polyhedra_Library + ::Linear_System::With_Bit_Matrix_iterator x, + Parma_Polyhedra_Library + ::Linear_System::With_Bit_Matrix_iterator y); + +} // namespace std + +/* Automatically generated from PPL source file ../src/Linear_System.inlines.hh line 1. */ +/* Linear_System class implementation: inline functions. +*/ + + +/* Automatically generated from PPL source file ../src/Bit_Row.defs.hh line 1. */ +/* Bit_Row class declaration. +*/ + + +/* Automatically generated from PPL source file ../src/Bit_Row.defs.hh line 28. */ +#include +#include +#include + +namespace Parma_Polyhedra_Library { + +// Put them in the namespace here to declare them friends later. + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns true 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 true 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); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Set-theoretic union. +/*! \relates Bit_Row */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +void set_union(const Bit_Row& x, const Bit_Row& y, Bit_Row& z); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Set-theoretic intersection. +/*! \relates Bit_Row */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +void set_intersection(const Bit_Row& x, const Bit_Row& y, Bit_Row& z); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Set-theoretic difference. +/*! \relates Bit_Row */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +void set_difference(const Bit_Row& x, const Bit_Row& y, Bit_Row& z); + +} // 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); + + //! Destructor. + ~Bit_Row(); + + //! Assignment operator. + Bit_Row& operator=(const Bit_Row& y); + + //! Swaps \p *this with \p y. + void 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(); + + 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); + friend void set_union(const Bit_Row& x, const Bit_Row& y, Bit_Row& z); + friend void set_intersection(const Bit_Row& x, const Bit_Row& y, Bit_Row& z); + friend void set_difference(const Bit_Row& x, const Bit_Row& y, Bit_Row& z); + + //! Returns the index of the first set bit or ULONG_MAX if no bit is set. + unsigned long first() const; + + /*! \brief + Returns the index of the first set bit after \p position + or ULONG_MAX if no bit after \p position is set. + */ + unsigned long next(unsigned long position) const; + + //! Returns the index of the last set bit or ULONG_MAX if no bit is set. + unsigned long last() const; + + /*! \brief + Returns the index of the first set bit before \p position + or ULONG_MAX if no bits before \p position is set. + */ + unsigned long prev(unsigned long position) const; + + //! Returns the number of set bits in the row. + unsigned long count_ones() const; + + //! Returns true if no bit is set in the row. + bool empty() const; + + //! Returns the total size in bytes of the memory occupied by \p *this. + memory_size_type total_memory_in_bytes() const; + + //! Returns the size in bytes of the memory managed by \p *this. + memory_size_type external_memory_in_bytes() const; + + //! Checks if all the invariants are satisfied + bool OK() const; + +private: + //! Bit-vector representing the row. + mpz_t vec; + + //! Assuming \p w is nonzero, returns the index of the first set bit in \p w. + static unsigned int first_one(mp_limb_t w); + + //! Assuming \p w is nonzero, returns the index of the last set bit in \p w. + static unsigned int last_one(mp_limb_t w); +}; + +namespace std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Bit_Row */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +void swap(Parma_Polyhedra_Library::Bit_Row& x, + Parma_Polyhedra_Library::Bit_Row& y); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specializes std::iter_swap. +/*! \relates Parma_Polyhedra_Library::Bit_Row */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +void +iter_swap(std::vector::iterator x, + std::vector::iterator y); + +} // namespace std + +/* 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 27. */ +#include + +// For the declaration of ffs(3). +#if defined(PPL_HAVE_STRINGS_H) +# include +#elif defined(PPL_HAVE_STRING_H) +# include +#endif + +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() { + 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 { + assert(vec->_mp_size >= 0); + return vec->_mp_size == 0 ? 0 : mpn_popcount(vec->_mp_d, vec->_mp_size); +} + +inline bool +Bit_Row::empty() const { + return mpz_sgn(vec) == 0; +} + +inline void +Bit_Row::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 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(); +} + +#if PPL_HAVE_DECL_FFS && PPL_SIZEOF_MP_LIMB_T == PPL_SIZEOF_INT + +inline unsigned int +Bit_Row::first_one(mp_limb_t w) { + return ffs(w)-1; +} + +#endif + +/*! \relates Bit_Row */ +inline void +set_union(const Bit_Row& x, const Bit_Row& y, Bit_Row& z) { + mpz_ior(z.vec, x.vec, y.vec); +} + +/*! \relates Bit_Row */ +inline void +set_intersection(const Bit_Row& x, const Bit_Row& y, Bit_Row& z) { + mpz_and(z.vec, x.vec, y.vec); +} + +/*! \relates Bit_Row */ +inline void +set_difference(const Bit_Row& x, const Bit_Row& y, Bit_Row& z) { + PPL_DIRTY_TEMP0(mpz_class, complement_y); + mpz_com(complement_y.get_mpz_t(), y.vec); + mpz_and(z.vec, x.vec, complement_y.get_mpz_t()); +} + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Bit_Row */ +inline void +swap(Parma_Polyhedra_Library::Bit_Row& x, + Parma_Polyhedra_Library::Bit_Row& y) { + x.swap(y); +} + +/*! \relates Parma_Polyhedra_Library::Bit_Row */ +inline void +iter_swap(std::vector::iterator x, + std::vector::iterator y) { + swap(*x, *y); +} + +} // namespace std + +/* Automatically generated from PPL source file ../src/Bit_Row.defs.hh line 221. */ + +/* Automatically generated from PPL source file ../src/Linear_System.inlines.hh line 27. */ + +namespace Parma_Polyhedra_Library { + +inline memory_size_type +Linear_System::external_memory_in_bytes() const { + return Matrix::external_memory_in_bytes(); +} + +inline memory_size_type +Linear_System::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +inline bool +Linear_System::is_sorted() const { + // The flag `sorted' does not really reflect the sortedness status + // of a system (if `sorted' evaluates to `false' nothing is known). + // This assertion is used to ensure that the system + // is actually sorted when `sorted' value is 'true'. + assert(!sorted || check_sorted()); + return sorted; +} + +inline void +Linear_System::set_sorted(const bool b) { + sorted = b; +} + +inline +Linear_System::Linear_System(Topology topol) + : Matrix(), + row_topology(topol), + index_first_pending(0), + sorted(true) { +} + +inline +Linear_System::Linear_System(Topology topol, + dimension_type n_rows, dimension_type n_columns) + : Matrix(n_rows, n_columns, Linear_Row::Flags(topol)), + row_topology(topol), + index_first_pending(n_rows), + sorted(true) { +} + +inline dimension_type +Linear_System::first_pending_row() const { + return index_first_pending; +} + +inline dimension_type +Linear_System::num_pending_rows() const { + assert(num_rows() >= first_pending_row()); + return num_rows() - first_pending_row(); +} + +inline void +Linear_System::unset_pending_rows() { + index_first_pending = num_rows(); +} + +inline void +Linear_System::set_index_first_pending_row(const dimension_type i) { + index_first_pending = i; +} + +inline +Linear_System::Linear_System(const Linear_System& y) + : Matrix(y), + row_topology(y.row_topology) { + unset_pending_rows(); + // Previously pending rows may violate sortedness. + sorted = (y.num_pending_rows() > 0) ? false : y.sorted; + assert(num_pending_rows() == 0); +} + +inline +Linear_System::Linear_System(const Linear_System& y, With_Pending) + : Matrix(y), + row_topology(y.row_topology), + index_first_pending(y.index_first_pending), + sorted(y.sorted) { +} + +inline Linear_System& +Linear_System::operator=(const Linear_System& y) { + Matrix::operator=(y); + row_topology = y.row_topology; + unset_pending_rows(); + // Previously pending rows may violate sortedness. + sorted = (y.num_pending_rows() > 0) ? false : y.sorted; + assert(num_pending_rows() == 0); + return *this; +} + +inline void +Linear_System::assign_with_pending(const Linear_System& y) { + Matrix::operator=(y); + row_topology = y.row_topology; + index_first_pending = y.index_first_pending; + sorted = y.sorted; +} + +inline void +Linear_System::swap(Linear_System& y) { + Matrix::swap(y); + std::swap(row_topology, y.row_topology); + std::swap(index_first_pending, y.index_first_pending); + std::swap(sorted, y.sorted); +} + +inline void +Linear_System::clear() { + // Note: do NOT modify the value of `row_topology'. + Matrix::clear(); + index_first_pending = 0; + sorted = true; +} + +inline void +Linear_System::resize_no_copy(const dimension_type new_n_rows, + const dimension_type new_n_columns) { + Matrix::resize_no_copy(new_n_rows, new_n_columns, + Linear_Row::Flags(row_topology)); + // Even though `*this' may happen to keep its sortedness, we believe + // that checking such a property is not worth the effort. In fact, + // it is very likely that the system will be overwritten as soon as + // we return. + set_sorted(false); +} + +inline void +Linear_System::set_necessarily_closed() { + row_topology = NECESSARILY_CLOSED; + if (!has_no_rows()) + set_rows_topology(); +} + +inline void +Linear_System::set_not_necessarily_closed() { + row_topology = NOT_NECESSARILY_CLOSED; + if (!has_no_rows()) + set_rows_topology(); +} + +inline bool +Linear_System::is_necessarily_closed() const { + return row_topology == NECESSARILY_CLOSED; +} + +inline Linear_Row& +Linear_System::operator[](const dimension_type k) { + return static_cast(Matrix::operator[](k)); +} + +inline const Linear_Row& +Linear_System::operator[](const dimension_type k) const { + return static_cast(Matrix::operator[](k)); +} + +inline Topology +Linear_System::topology() const { + return row_topology; +} + +inline dimension_type +Linear_System::max_space_dimension() { + // Column zero holds the inhomogeneous term or the divisor. + // In NNC linear systems, the last column holds the coefficient + // of the epsilon dimension. + return max_num_columns() - 2; +} + +inline dimension_type +Linear_System::space_dimension() const { + const dimension_type n_columns = num_columns(); + return (n_columns == 0) + ? 0 + : n_columns - (is_necessarily_closed() ? 1 : 2); +} + +inline void +Linear_System::remove_trailing_columns(const dimension_type n) { + Matrix::remove_trailing_columns(n); + // Have to re-normalize the rows of the system, + // since we removed some coefficients. + strong_normalize(); +} + +inline void +Linear_System::permute_columns(const std::vector& cycles) { + Matrix::permute_columns(cycles); + // The rows with permuted columns are still normalized but may + // be not strongly normalized: sign normalization is necessary. + sign_normalize(); +} + +/*! \relates Linear_System */ +inline bool +operator!=(const Linear_System& x, const Linear_System& y) { + return !(x == y); +} + +inline bool +Linear_System::Row_Less_Than::operator()(const Row& x, const Row& y) const { + return compare(static_cast(x), + static_cast(y)) < 0; +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Linear_System */ +inline void +swap(Parma_Polyhedra_Library::Linear_System& x, + Parma_Polyhedra_Library::Linear_System& y) { + x.swap(y); +} + +} // namespace std + + +namespace Parma_Polyhedra_Library { + +inline +Linear_System::With_Bit_Matrix_iterator:: +With_Bit_Matrix_iterator(Iter1 iter1, Iter2 iter2) + : i1(iter1), i2(iter2) { +} + +inline +Linear_System::With_Bit_Matrix_iterator:: +With_Bit_Matrix_iterator(const With_Bit_Matrix_iterator& y) + : i1(y.i1), i2(y.i2) { +} + +inline +Linear_System::With_Bit_Matrix_iterator:: +~With_Bit_Matrix_iterator() { +} + +inline Linear_System::With_Bit_Matrix_iterator& +Linear_System::With_Bit_Matrix_iterator:: +operator=(const With_Bit_Matrix_iterator& y) { + i1 = y.i1; + i2 = y.i2; + return *this; +} + +inline Linear_System::With_Bit_Matrix_iterator& +Linear_System::With_Bit_Matrix_iterator::operator++() { + ++i1; + ++i2; + return *this; +} + +inline Linear_System::With_Bit_Matrix_iterator +Linear_System::With_Bit_Matrix_iterator::operator++(int) { + With_Bit_Matrix_iterator tmp = *this; + operator++(); + return tmp; +} + +inline Linear_System::With_Bit_Matrix_iterator& +Linear_System::With_Bit_Matrix_iterator::operator--() { + --i1; + --i2; + return *this; +} + +inline Linear_System::With_Bit_Matrix_iterator +Linear_System::With_Bit_Matrix_iterator::operator--(int) { + With_Bit_Matrix_iterator tmp = *this; + operator--(); + return tmp; +} + +inline Linear_System::With_Bit_Matrix_iterator& +Linear_System::With_Bit_Matrix_iterator::operator+=(difference_type d) { + i1 += d; + i2 += d; + return *this; +} + +inline Linear_System::With_Bit_Matrix_iterator +Linear_System::With_Bit_Matrix_iterator:: +operator+(difference_type d) const { + With_Bit_Matrix_iterator tmp = *this; + tmp += d; + return tmp; +} + +inline Linear_System::With_Bit_Matrix_iterator& +Linear_System::With_Bit_Matrix_iterator::operator-=(difference_type d) { + i1 -= d; + i2 -= d; + return *this; +} + +inline Linear_System::With_Bit_Matrix_iterator +Linear_System::With_Bit_Matrix_iterator:: +operator-(difference_type d) const { + With_Bit_Matrix_iterator tmp = *this; + tmp -= d; + return tmp; +} + +inline Linear_System::With_Bit_Matrix_iterator::difference_type +Linear_System::With_Bit_Matrix_iterator:: +operator-(const With_Bit_Matrix_iterator& y) const { + return i1 - y.i1; +} + +inline bool +Linear_System::With_Bit_Matrix_iterator:: +operator==(const With_Bit_Matrix_iterator& y) const { + return i1 == y.i1; +} + +inline bool +Linear_System::With_Bit_Matrix_iterator:: +operator!=(const With_Bit_Matrix_iterator& y) const { + return i1 != y.i1; +} + +inline bool +Linear_System::With_Bit_Matrix_iterator:: +operator<(const With_Bit_Matrix_iterator& y) const { + return i1 < y.i1; +} + +inline Linear_System::With_Bit_Matrix_iterator::reference +Linear_System::With_Bit_Matrix_iterator::operator*() const { + return *i1; +} + +inline Linear_System::With_Bit_Matrix_iterator::pointer +Linear_System::With_Bit_Matrix_iterator::operator->() const { + return &*i1; +} + +inline void +Linear_System::With_Bit_Matrix_iterator:: +iter_swap(const With_Bit_Matrix_iterator& y) const { + std::iter_swap(i1, y.i1); + std::iter_swap(i2, y.i2); +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates Parma_Polyhedra_Library::Linear_System::With_Bit_Matrix_iterator */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +inline void +iter_swap(Parma_Polyhedra_Library + ::Linear_System::With_Bit_Matrix_iterator x, + Parma_Polyhedra_Library + ::Linear_System::With_Bit_Matrix_iterator y) { + x.iter_swap(y); +} + +} // namespace std + +/* Automatically generated from PPL source file ../src/Linear_System.defs.hh line 515. */ + +/* Automatically generated from PPL source file ../src/Constraint_System.defs.hh line 33. */ +#include +#include + +namespace Parma_Polyhedra_Library { + +namespace IO_Operators { + +//! Output operator. +/*! + \relates Parma_Polyhedra_Library::Constraint_System + Writes true if \p cs is empty. Otherwise, writes on + \p s the constraints of \p cs, all in one row and separated by ", ". +*/ +std::ostream& operator<<(std::ostream& s, const Constraint_System& cs); + +} // namespace IO_Operators + +// Put it in the namespace here to declare it friend later. +/*! \relates Polyhedron */ +bool operator==(const Polyhedron& x, const Polyhedron& y); + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Constraint_System */ +void swap(Parma_Polyhedra_Library::Constraint_System& x, + Parma_Polyhedra_Library::Constraint_System& y); + +} // namespace std + +//! A system of constraints. +/*! \ingroup PPL_CXX_interface + An object of the class Constraint_System is a system of constraints, + i.e., a multiset of objects of the class Constraint. + When inserting constraints in a system, space dimensions are + automatically adjusted so that all the constraints in the system + are defined on the same vector space. + + \par + In all the examples it is assumed that variables + x and y 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 exact copy of them + can be retrieved: + in general, only an equivalent constraint system + will be available, where original constraints may have been + reordered, removed (if they are trivial, duplicate or + implied by other constraints), linearly combined, etc. +*/ +class Parma_Polyhedra_Library::Constraint_System : private Linear_System { +public: + //! Default constructor: builds an empty system of constraints. + Constraint_System(); + + //! Builds the singleton system containing only constraint \p c. + explicit Constraint_System(const Constraint& c); + + //! Builds a system containing copies of any equalities in \p cgs. + explicit Constraint_System(const Congruence_System& cgs); + + //! Ordinary copy-constructor. + Constraint_System(const Constraint_System& cs); + + //! Destructor. + ~Constraint_System(); + + //! Assignment operator. + Constraint_System& operator=(const Constraint_System& y); + + //! Returns the maximum space dimension a Constraint_System can handle. + static dimension_type max_space_dimension(); + + //! Returns the dimension of the vector space enclosing \p *this. + dimension_type space_dimension() const; + + /*! \brief + Returns true if and only if \p *this + contains one or more strict inequality constraints. + */ + bool has_strict_inequalities() const; + + /*! \brief + Removes all the constraints from the constraint system + and sets its space dimension to 0. + */ + void clear(); + + /*! \brief + Inserts in \p *this a copy of the constraint \p c, + increasing the number of space dimensions if needed. + */ + void insert(const Constraint& c); + + //! 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(); + + //! 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 ph: + \code + const Constraint_System& cs = ph.constraints(); + for (Constraint_System::const_iterator i = cs.begin(), + cs_end = cs.end(); i != cs_end; ++i) + cout << *i << endl; + \endcode + */ + class const_iterator + : public std::iterator { + public: + //! Default constructor. + const_iterator(); + + //! Ordinary copy-constructor. + const_iterator(const const_iterator& y); + + //! Destructor. + ~const_iterator(); + + //! Assignment operator. + const_iterator& operator=(const const_iterator& y); + + //! Dereference operator. + const Constraint& operator*() const; + + //! Indirect member selector. + const Constraint* operator->() const; + + //! Prefix increment operator. + const_iterator& operator++(); + + //! Postfix increment operator. + const_iterator operator++(int); + + /*! \brief + Returns true if and only if + \p *this and \p y are identical. + */ + bool operator==(const const_iterator& y) const; + + /*! \brief + Returns true if and only if + \p *this and \p y are different. + */ + bool operator!=(const const_iterator& y) const; + + private: + friend class Constraint_System; + + //! The const iterator over the matrix of constraints. + Linear_System::const_iterator i; + + //! A const pointer to the matrix of constraints. + const Linear_System* csp; + + //! Constructor. + const_iterator(const Linear_System::const_iterator& iter, + const Constraint_System& csys); + + //! \p *this skips to the next non-trivial constraint. + void skip_forward(); + }; + + //! Returns true if and only if \p *this has no constraints. + bool empty() const; + + /*! \brief + Returns the const_iterator pointing to the first constraint, + if \p *this is not empty; + otherwise, returns the past-the-end const_iterator. + */ + const_iterator begin() const; + + //! Returns the past-the-end const_iterator. + const_iterator end() const; + + //! Checks if all the invariants are satisfied. +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS + /*! + Returns true if and only if \p *this is a valid + Linear_System and each row in the system is a valid Constraint. + */ +#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 true if successful, false 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 swap(Constraint_System& y); + +private: + /*! \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 const_iterator; + friend class Parma_Polyhedra_Library::Polyhedron; + + friend bool operator==(const Polyhedron& x, const Polyhedron& y); + + //! Builds an empty system of constraints having the specified topology. + explicit Constraint_System(Topology topol); + + /*! \brief + Builds a system of \p n_rows constraints on a \p n_columns - 1 + dimensional space (including the \f$\epsilon\f$ dimension, if + \p topol is NOT_NECESSARILY_CLOSED). + */ + Constraint_System(Topology topol, + dimension_type n_rows, dimension_type n_columns); + + /*! \brief + Adjusts \p *this so that it matches the topology and + the number of space dimensions given as parameters + (adding or removing columns if needed). + Returns false if and only if \p topol is + equal to NECESSARILY_CLOSED and \p *this + contains strict inequalities. + */ + bool adjust_topology_and_space_dimension(Topology topol, + dimension_type num_dimensions); + + //! Returns the \p k- th constraint of the system. + Constraint& operator[](dimension_type k); + + //! Returns a constant reference to the \p k- th constraint of the system. + const Constraint& operator[](dimension_type k) const; + + //! Returns true if \p g satisfies all the constraints. + bool satisfies_all_constraints(const Generator& g) const; + + //! Substitutes a given column of coefficients by a given affine expression. + /*! + \param v + Index of the column to which the affine transformation is substituted. + + \param expr + The numerator of the affine transformation: + \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$; + + \param denominator + The denominator of the affine transformation. + + We want to allow affine transformations + (see Section \ref Images_and_Preimages_of_Affine_Transfer_Relations) + having any rational coefficients. Since the coefficients of the + constraints are integers we must also provide an integer \p + denominator that will be used as denominator of the affine + transformation. + The denominator is required to be a positive integer. + + The affine transformation substitutes the matrix of constraints + by a new matrix whose elements \f${a'}_{ij}\f$ are built from + the old one \f$a_{ij}\f$ as follows: + \f[ + {a'}_{ij} = + \begin{cases} + a_{ij} * \mathrm{denominator} + a_{iv} * \mathrm{expr}[j] + \quad \text{for } j \neq v; \\ + \mathrm{expr}[v] * a_{iv} + \quad \text{for } j = v. + \end{cases} + \f] + + \p expr is a constant parameter and unaltered by this computation. + */ + void affine_preimage(dimension_type v, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator); + + //! Returns the number of equality constraints. + dimension_type num_equalities() const; + + //! Returns the number of inequality constraints. + dimension_type num_inequalities() const; + + /*! \brief + Applies Gaussian elimination and back-substitution so as + to provide a partial simplification of the system of constraints. + + It is assumed that the system has no pending constraints. + */ + void simplify(); + + /*! \brief + Inserts in \p *this a copy of the constraint \p c, + increasing the number of space dimensions if needed. + It is a pending constraint. + */ + void insert_pending(const Constraint& c); + + //! Adds low-level constraints to the constraint system. + void add_low_level_constraints(); +}; + +// Constraint_System.inlines.hh is not included here on purpose. + +/* Automatically generated from PPL source file ../src/Constraint.defs.hh line 34. */ +#include + +namespace Parma_Polyhedra_Library { + +// Put them in the namespace here to declare them friend later. + +//! Returns true if and only if \p x is equivalent to \p y. +/*! \relates Constraint */ +bool +operator==(const Constraint& x, const Constraint& y); + +//! Returns true if and only if \p x is not equivalent to \p y. +/*! \relates Constraint */ +bool +operator!=(const Constraint& x, const Constraint& y); + +//! Returns the constraint \p e1 = \p e2. +/*! \relates Constraint */ +Constraint +operator==(const Linear_Expression& e1, const Linear_Expression& e2); + +//! Returns the constraint \p 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); + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Constraint */ +void swap(Parma_Polyhedra_Library::Constraint& x, + Parma_Polyhedra_Library::Constraint& y); + +} // namespace std + +//! A linear equality or inequality. +/*! \ingroup PPL_CXX_interface + An object of the class Constraint is either: + - an equality: \f$\sum_{i=0}^{n-1} a_i x_i + b = 0\f$; + - a non-strict inequality: \f$\sum_{i=0}^{n-1} a_i x_i + b \geq 0\f$; or + - a strict inequality: \f$\sum_{i=0}^{n-1} a_i x_i + b > 0\f$; + + where \f$n\f$ is the dimension of the space, + \f$a_i\f$ is the integer coefficient of variable \f$x_i\f$ + and \f$b\f$ is the integer inhomogeneous term. + + \par How to build a constraint + Constraints are typically built by applying a relation symbol + to a pair of linear expressions. + Available relation symbols are equality (==), + non-strict inequalities (\>= and \<=) and + strict inequalities (\< and \>). + 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 + x, y and z + 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 : private Linear_Row { +public: + //! Ordinary copy-constructor. + Constraint(const Constraint& c); + + //! Copy-constructs from equality congruence \p cg. + /*! + \exception std::invalid_argument + Thrown if \p cg is a proper congruence. + */ + explicit Constraint(const Congruence& cg); + + //! Destructor. + ~Constraint(); + + //! Assignment operator. + Constraint& operator=(const Constraint& c); + + //! Returns the maximum space dimension a Constraint can handle. + static dimension_type max_space_dimension(); + + //! Returns the dimension of the vector space enclosing \p *this. + dimension_type space_dimension() const; + + //! The constraint type. + enum Type { + /*! The constraint is an equality. */ + EQUALITY, + /*! The constraint is a non-strict inequality. */ + NONSTRICT_INEQUALITY, + /*! The constraint is a strict inequality. */ + STRICT_INEQUALITY + }; + + //! Returns the constraint type of \p *this. + Type type() const; + + /*! \brief + Returns true if and only if + \p *this is an equality constraint. + */ + bool is_equality() const; + + /*! \brief + Returns true if and only if + \p *this is an inequality constraint (either strict or non-strict). + */ + bool is_inequality() const; + + /*! \brief + Returns true if and only if + \p *this is a non-strict inequality constraint. + */ + bool is_nonstrict_inequality() const; + + /*! \brief + Returns true 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 positivity constraint. + */ + 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 true 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 true 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 true if and only if \p *this and \p y + are equivalent constraints. + + Constraints having different space dimensions are not equivalent. + Note that constraints having different types may nonetheless be + equivalent, if they both are tautologies or inconsistent. + */ + bool is_equivalent_to(const Constraint& y) const; + + PPL_OUTPUT_DECLARATIONS + + /*! \brief + Loads from \p s an ASCII representation (as produced by + ascii_dump(std::ostream&) const) and sets \p *this accordingly. + Returns true if successful, false otherwise. + */ + bool ascii_load(std::istream& s); + + //! Checks if all the invariants are satisfied. + bool OK() const; + + //! Swaps \p *this with \p y. + void swap(Constraint& y); + +private: + /*! \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 positivity constraint. + */ + 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; + + friend class Parma_Polyhedra_Library::Congruence; + friend class Parma_Polyhedra_Library::Scalar_Products; + friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign; + friend class Parma_Polyhedra_Library::Constraint_System; + friend class Parma_Polyhedra_Library::Constraint_System::const_iterator; + // FIXME: the following friend declaration should be avoided. + friend class Parma_Polyhedra_Library::Polyhedron; + + friend + Parma_Polyhedra_Library + ::Linear_Expression::Linear_Expression(const Constraint& c); + + //! Default constructor: private and not implemented. + Constraint(); + + /*! \brief + Builds a constraint of type \p type and topology \p topology, + stealing the coefficients from \p e. + */ + Constraint(Linear_Expression& e, Type type, Topology topology); + + //! Constructs from a congruence, with specified size and capacity. + Constraint(const Congruence& cg, dimension_type sz, dimension_type capacity); + + /*! \brief + Throws a std::invalid_argument exception containing + error message \p message. + */ + void + throw_invalid_argument(const char* method, const char* message) const; + + /*! \brief + Throws a std::invalid_argument exception + containing the appropriate error message. + */ + void + throw_dimension_incompatible(const char* method, + const char* name_var, + Variable v) const; + + 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<=(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<(const Linear_Expression& e, Coefficient_traits::const_reference n); + friend Constraint + operator<(Coefficient_traits::const_reference n, const Linear_Expression& e); + + //! Copy-constructor with given size. + Constraint(const Constraint& c, dimension_type sz); + + /*! \brief + Builds a new copy of the zero-dimension space constraint + \f$\epsilon \geq 0\f$ (used to implement NNC polyhedra). + */ + static Constraint construct_epsilon_geq_zero(); + + //! Returns the zero-dimension space constraint \f$\epsilon \geq 0\f$. + static const Constraint& epsilon_geq_zero(); + + /*! \brief + The zero-dimension space constraint \f$\epsilon \leq 1\f$ + (used to implement NNC polyhedra). + */ + static const Constraint& epsilon_leq_one(); + + //! Sets the constraint type to EQUALITY. + void set_is_equality(); + + //! Sets the constraint to be an inequality. + /*! + Whether the constraint type will become NONSTRICT_INEQUALITY + or STRICT_INEQUALITY depends on the topology and the value + of the low-level coefficients of the constraint. + */ + void set_is_inequality(); +}; + +namespace Parma_Polyhedra_Library { + +namespace IO_Operators { + +//! Output operator. +/*! \relates Parma_Polyhedra_Library::Constraint */ +std::ostream& operator<<(std::ostream& s, const Constraint& c); + +//! Output operator. +/*! \relates Parma_Polyhedra_Library::Constraint */ +std::ostream& operator<<(std::ostream& s, const Constraint::Type& t); + +} // namespace IO_Operators + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Constraint.inlines.hh line 1. */ +/* Constraint class implementation: inline functions. +*/ + + +/* Automatically generated from PPL source file ../src/Constraint.inlines.hh line 27. */ + +namespace Parma_Polyhedra_Library { + +inline +Constraint::Constraint(Linear_Expression& e, Type type, Topology topology) { + assert(type != STRICT_INEQUALITY || topology == NOT_NECESSARILY_CLOSED); + Linear_Row::swap(e); + flags() = Flags(topology, (type == EQUALITY + ? LINE_OR_EQUALITY + : RAY_OR_POINT_OR_INEQUALITY)); +} + +inline +Constraint::Constraint(const Constraint& c) + : Linear_Row(c) { +} + +inline +Constraint::Constraint(const Constraint& c, const dimension_type sz) + : Linear_Row(c, sz, sz) { +} + +inline +Constraint::~Constraint() { +} + +inline Constraint& +Constraint::operator=(const Constraint& c) { + Linear_Row::operator=(c); + return *this; +} + +inline dimension_type +Constraint::max_space_dimension() { + return Linear_Row::max_space_dimension(); +} + +inline dimension_type +Constraint::space_dimension() const { + return Linear_Row::space_dimension(); +} + +inline bool +Constraint::is_equality() const { + return is_line_or_equality(); +} + +inline bool +Constraint::is_inequality() const { + return is_ray_or_point_or_inequality(); +} + +inline Constraint::Type +Constraint::type() const { + if (is_equality()) + return EQUALITY; + if (is_necessarily_closed()) + return NONSTRICT_INEQUALITY; + else + return ((*this)[size() - 1] < 0) + ? STRICT_INEQUALITY + : NONSTRICT_INEQUALITY; +} + +inline bool +Constraint::is_nonstrict_inequality() const { + return type() == NONSTRICT_INEQUALITY; +} + +inline bool +Constraint::is_strict_inequality() const { + return type() == STRICT_INEQUALITY; +} + +inline void +Constraint::set_is_equality() { + set_is_line_or_equality(); +} + +inline void +Constraint::set_is_inequality() { + set_is_ray_or_point_or_inequality(); +} + +inline Coefficient_traits::const_reference +Constraint::coefficient(const Variable v) const { + if (v.space_dimension() > space_dimension()) + throw_dimension_incompatible("coefficient(v)", "v", v); + return Linear_Row::coefficient(v.id()); +} + +inline Coefficient_traits::const_reference +Constraint::inhomogeneous_term() const { + return Linear_Row::inhomogeneous_term(); +} + +inline memory_size_type +Constraint::external_memory_in_bytes() const { + return Linear_Row::external_memory_in_bytes(); +} + +inline memory_size_type +Constraint::total_memory_in_bytes() const { + return Linear_Row::total_memory_in_bytes(); +} + +/*! \relates Constraint */ +inline bool +operator==(const Constraint& x, const Constraint& y) { + return x.is_equivalent_to(y); +} + +/*! \relates Constraint */ +inline bool +operator!=(const Constraint& x, const Constraint& y) { + return !x.is_equivalent_to(y); +} + +/*! \relates Constraint */ +inline Constraint +operator==(const Linear_Expression& e1, const Linear_Expression& e2) { + Linear_Expression diff = e1 - e2; + Constraint c(diff, Constraint::EQUALITY, NECESSARILY_CLOSED); + // Enforce normalization. + c.strong_normalize(); + return c; +} + +/*! \relates Constraint */ +inline Constraint +operator==(const Variable v1, const Variable v2) { + Linear_Expression diff + = (v1.space_dimension() < v2.space_dimension()) ? v1-v2 : v2-v1; + return Constraint(diff, Constraint::EQUALITY, NECESSARILY_CLOSED); +} + +/*! \relates Constraint */ +inline Constraint +operator>=(const Linear_Expression& e1, const Linear_Expression& e2) { + Linear_Expression diff = e1 - e2; + Constraint c(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED); + // Enforce normalization. + c.normalize(); + return c; +} + +/*! \relates Constraint */ +inline Constraint +operator>=(const Variable v1, const Variable v2) { + Linear_Expression diff = v1-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; + // Setting the epsilon coefficient to -1. + // NOTE: this also enforces normalization. + const dimension_type e1_dim = e1.space_dimension(); + const dimension_type e2_dim = e2.space_dimension(); + if (e1_dim > e2_dim) + diff -= Variable(e1_dim); + else + diff -= Variable(e2_dim); + diff += e1; + diff -= e2; + + Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED); + return c; +} + +/*! \relates Constraint */ +inline Constraint +operator>(const Variable v1, const Variable v2) { + Linear_Expression diff = v1-v2; + diff -= Variable(std::max(v1.space_dimension(), v2.space_dimension())); + return Constraint(diff, + Constraint::STRICT_INEQUALITY, + NOT_NECESSARILY_CLOSED); +} + +/*! \relates Constraint */ +inline Constraint +operator==(Coefficient_traits::const_reference n, const Linear_Expression& e) { + Linear_Expression diff = n - e; + Constraint c(diff, Constraint::EQUALITY, NECESSARILY_CLOSED); + // Enforce normalization. + c.strong_normalize(); + return c; +} + +/*! \relates Constraint */ +inline Constraint +operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e) { + Linear_Expression diff = n - e; + Constraint c(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED); + // Enforce normalization. + c.normalize(); + return c; +} + +/*! \relates Constraint */ +inline Constraint +operator>(Coefficient_traits::const_reference n, const Linear_Expression& e) { + Linear_Expression diff; + // Setting the epsilon coefficient to -1. + // NOTE: this also enforces normalization. + diff -= Variable(e.space_dimension()); + diff += n; + diff -= e; + + Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED); + return c; +} + +/*! \relates Constraint */ +inline Constraint +operator==(const Linear_Expression& e, Coefficient_traits::const_reference n) { + Linear_Expression diff = e - n; + Constraint c(diff, Constraint::EQUALITY, NECESSARILY_CLOSED); + // Enforce normalization. + c.strong_normalize(); + return c; +} + +/*! \relates Constraint */ +inline Constraint +operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n) { + Linear_Expression diff = e - n; + Constraint c(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED); + // Enforce normalization. + c.normalize(); + return c; +} + +/*! \relates Constraint */ +inline Constraint +operator>(const Linear_Expression& e, Coefficient_traits::const_reference n) { + Linear_Expression diff; + // Setting the epsilon coefficient to -1. + // NOTE: this also enforces normalization. + diff -= Variable(e.space_dimension()); + diff += e; + diff -= n; + + Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED); + c.set_not_necessarily_closed(); + c.set_is_inequality(); + return c; +} + +/*! \relates Constraint */ +inline Constraint +operator<=(const Linear_Expression& e1, const Linear_Expression& e2) { + return e2 >= e1; +} + +/*! \relates Constraint */ +inline Constraint +operator<=(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() { + assert(zero_dim_false_p != 0); + return *zero_dim_false_p; +} + +inline const Constraint& +Constraint::zero_dim_positivity() { + assert(zero_dim_positivity_p != 0); + return *zero_dim_positivity_p; +} + +inline const Constraint& +Constraint::epsilon_geq_zero() { + assert(epsilon_geq_zero_p != 0); + return *epsilon_geq_zero_p; +} + +inline const Constraint& +Constraint::epsilon_leq_one() { + assert(epsilon_leq_one_p != 0); + return *epsilon_leq_one_p; +} + +inline void +Constraint::ascii_dump(std::ostream& s) const { + Linear_Row::ascii_dump(s); +} + +inline bool +Constraint::ascii_load(std::istream& s) { + return Linear_Row::ascii_load(s); +} + +inline void +Constraint::swap(Constraint& y) { + Linear_Row::swap(y); +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Constraint */ +inline void +swap(Parma_Polyhedra_Library::Constraint& x, + Parma_Polyhedra_Library::Constraint& y) { + x.swap(y); +} + +} // namespace std + +/* Automatically generated from PPL source file ../src/Constraint.defs.hh line 562. */ + +/* Automatically generated from PPL source file ../src/Generator.defs.hh line 1. */ +/* Generator class declaration. +*/ + + +/* Automatically generated from PPL source file ../src/Generator_System.defs.hh line 1. */ +/* Generator_System class declaration. +*/ + + +/* Automatically generated from PPL source file ../src/Poly_Con_Relation.defs.hh line 1. */ +/* Poly_Con_Relation class declaration. +*/ + + +/* Automatically generated from PPL source file ../src/Poly_Con_Relation.types.hh line 1. */ + + +namespace Parma_Polyhedra_Library { + +class Poly_Con_Relation; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Poly_Con_Relation.defs.hh line 28. */ +#include + +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 164. */ + +/* Automatically generated from PPL source file ../src/Generator_System.defs.hh line 35. */ +#include + +namespace Parma_Polyhedra_Library { + +namespace IO_Operators { + +//! Output operator. +/*! + \relates Parma_Polyhedra_Library::Generator_System + Writes false if \p gs is empty. Otherwise, writes on + \p s the generators of \p gs, all in one row and separated by ", ". +*/ +std::ostream& operator<<(std::ostream& s, const Generator_System& gs); + +} // namespace IO_Operators + +// Put it in the namespace here to declare it friend later. +/*! \relates Polyhedron */ +bool operator==(const Polyhedron& x, const Polyhedron& y); + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Generator_System */ +void swap(Parma_Polyhedra_Library::Generator_System& x, + Parma_Polyhedra_Library::Generator_System& y); + +} // namespace std + +//! A system of generators. +/*! \ingroup PPL_CXX_interface + An object of the class Generator_System is a system of generators, + i.e., a multiset of objects of the class Generator + (lines, rays, points and closure points). + When inserting generators in a system, space dimensions are automatically + adjusted so that all the generators in the system are defined + on the same vector space. + A system of generators which is meant to define a non-empty + polyhedron must include at least one point: the reason is that + lines, rays and closure points need a supporting point + (lines and rays only specify directions while closure points only + specify points in the topological closure of the NNC polyhedron). + + \par + In all the examples it is assumed that variables + x and y 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 exact copy of them + can be retrieved: + in general, only an equivalent 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 : protected Linear_System { +public: + //! Default constructor: builds an empty system of generators. + Generator_System(); + + //! Builds the singleton system containing only generator \p g. + explicit Generator_System(const Generator& g); + + //! Ordinary copy-constructor. + Generator_System(const Generator_System& gs); + + //! Destructor. + ~Generator_System(); + + //! Assignment operator. + Generator_System& operator=(const Generator_System& y); + + //! Returns the maximum space dimension a Generator_System can handle. + static dimension_type max_space_dimension(); + + //! Returns the dimension of the vector space enclosing \p *this. + dimension_type space_dimension() const; + + /*! \brief + Removes all the generators from the generator system + and sets its space dimension to 0. + */ + void clear(); + + /*! \brief + Inserts in \p *this a copy of the generator \p g, + increasing the number of space dimensions if needed. + */ + void insert(const Generator& g); + + //! 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(); + + //! 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 ph: + \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(cout, "\n")); + \endcode + */ + class const_iterator + : public std::iterator { + public: + //! Default constructor. + const_iterator(); + + //! Ordinary copy-constructor. + const_iterator(const const_iterator& y); + + //! Destructor. + ~const_iterator(); + + //! Assignment operator. + const_iterator& operator=(const const_iterator& y); + + //! Dereference operator. + const Generator& operator*() const; + + //! Indirect member selector. + const Generator* operator->() const; + + //! Prefix increment operator. + const_iterator& operator++(); + + //! Postfix increment operator. + const_iterator operator++(int); + + /*! \brief + Returns true if and only if + \p *this and \p y are identical. + */ + bool operator==(const const_iterator& y) const; + + /*! \brief + Returns true if and only if + \p *this and \p y are different. + */ + bool operator!=(const const_iterator& y) const; + + private: + friend class Generator_System; + + //! The const iterator over the Linear_System. + Linear_System::const_iterator i; + + //! A const pointer to the Linear_System. + const Linear_System* gsp; + + //! Constructor. + const_iterator(const Linear_System::const_iterator& iter, + const Generator_System& gsys); + + /*! \brief + \p *this skips to the next generator, skipping those + closure points that are immediately followed by a matching point. + */ + void skip_forward(); + }; + + //! Returns true 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. + /*! + Returns true if and only if \p *this is a valid + Linear_System and each row in the system is a valid Generator. + */ + bool OK() const; + + PPL_OUTPUT_DECLARATIONS + + /*! \brief + Loads from \p s an ASCII representation (as produced by + ascii_dump(std::ostream&) const) and sets \p *this accordingly. + Returns true if successful, false 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 swap(Generator_System& y); + +private: + /*! \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 const_iterator; + friend class Parma_Polyhedra_Library::Polyhedron; + friend class Parma_Polyhedra_Library::Grid_Generator_System; + + friend bool operator==(const Polyhedron& x, const Polyhedron& y); + + //! Builds an empty system of generators having the specified topology. + explicit Generator_System(Topology topol); + + /*! \brief + Builds a system of \p n_rows rays/points on a \p n_columns - 1 + dimensional space (including the \f$\epsilon\f$ dimension, if + \p topol is NOT_NECESSARILY_CLOSED). + */ + Generator_System(Topology topol, + dimension_type n_rows, dimension_type n_columns); + + /*! \brief + Adjusts \p *this so that it matches the topology and + the number of space dimensions given as parameters + (adding or removing columns if needed). + Returns false if and only if \p topol is + equal to NECESSARILY_CLOSED and \p *this + contains closure points. + */ + bool adjust_topology_and_space_dimension(Topology topol, + dimension_type num_dimensions); + + /*! \brief + For each unmatched closure point in \p *this, adds the + corresponding point. + + It is assumed that the topology of \p *this + is NOT_NECESSARILY_CLOSED. + */ + void add_corresponding_points(); + + /*! \brief + Returns true 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 NOT_NECESSARILY_CLOSED. + */ + void add_corresponding_closure_points(); + + /*! \brief + Returns true if and only if \p *this + contains one or more closure points. + + Note: the check for the presence of closure points is + done under the point of view of the user. Namely, we scan + the generator system using high-level iterators, so that + closure points that are matching the corresponding points + will be disregarded. + */ + bool has_closure_points() const; + + //! Returns the \p k- th generator of the system. + Generator& operator[](dimension_type k); + + //! Returns a constant reference to the \p k- th generator of the system. + const Generator& operator[](dimension_type k) const; + + /*! \brief + Returns the relations holding between the generator system + and the constraint \p c. + */ + Parma_Polyhedra_Library::Poly_Con_Relation + relation_with(const Constraint& c) const; + + //! Returns true if all the generators satisfy \p c. + bool satisfied_by_all_generators(const Constraint& c) const; + + //! Returns true if all the generators satisfy \p c. + /*! + It is assumed that c.is_necessarily_closed() holds. + */ + bool satisfied_by_all_generators_C(const Constraint& c) const; + + //! Returns true if all the generators satisfy \p c. + /*! + It is assumed that c.is_necessarily_closed() does not hold. + */ + bool satisfied_by_all_generators_NNC(const Constraint& c) const; + + //! Assigns to a given variable an affine expression. + /*! + \param v + Index of the column to which the affine transformation is assigned; + + \param expr + The numerator of the affine transformation: + \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$; + + \param denominator + The denominator of the affine transformation. + + We want to allow affine transformations (see the Introduction) having + any rational coefficients. Since the coefficients of the + constraints are integers we must also provide an integer \p denominator + that will be used as denominator of the affine transformation. + The denominator is required to be a positive integer. + + The affine transformation assigns to each element of \p v -th + column the follow expression: + \f[ + \frac{\sum_{i = 0}^{n - 1} a_i x_i + b} + {\mathrm{denominator}}. + \f] + + \p expr is a constant parameter and unaltered by this computation. + */ + void affine_image(dimension_type v, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator); + + //! Returns the number of lines of the system. + dimension_type num_lines() const; + + //! Returns the number of rays of the system. + dimension_type num_rays() const; + + //! Removes all the invalid lines and rays. + /*! + The invalid lines and rays are those with all + the homogeneous terms set to zero. + */ + void remove_invalid_lines_and_rays(); + + /*! \brief + Applies Gaussian elimination and back-substitution so as + to provide a partial simplification of the system of generators. + + It is assumed that the system has no pending generators. + */ + void simplify(); + + /*! \brief + Inserts in \p *this a copy of the generator \p g, + increasing the number of space dimensions if needed. + It is a pending generator. + */ + void insert_pending(const Generator& g); +}; + +// Generator_System.inlines.hh is not included here on purpose. + +/* Automatically generated from PPL source file ../src/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 +struct Rectilinear_Distance_Specialization; + +template +struct Euclidean_Distance_Specialization; + +template +struct L_Infinity_Distance_Specialization; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/distances.defs.hh line 28. */ + +template +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 +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 +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 27. */ + +namespace Parma_Polyhedra_Library { + +// A struct to work around the lack of partial specialization +// of function templates in C++. +template +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 +struct maybe_assign_struct { + 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 +inline Result +maybe_assign(const To*& top, To& tmp, const From& from, Rounding_Dir dir) { + return maybe_assign_struct::function(top, tmp, from, dir); +} + +template +inline void +Rectilinear_Distance_Specialization::combine(Temp& running, + const Temp& current, + Rounding_Dir dir) { + add_assign_r(running, running, current, dir); +} + +template +inline void +Rectilinear_Distance_Specialization::finalize(Temp&, Rounding_Dir) { +} + +template +inline void +Euclidean_Distance_Specialization::combine(Temp& running, + Temp& current, + Rounding_Dir dir) { + mul_assign_r(current, current, current, dir); + add_assign_r(running, running, current, dir); +} + +template +inline void +Euclidean_Distance_Specialization::finalize(Temp& running, + Rounding_Dir dir) { + sqrt_assign_r(running, running, dir); +} + +template +inline void +L_Infinity_Distance_Specialization::combine(Temp& running, + const Temp& current, + Rounding_Dir) { + if (current > running) + running = current; +} + +template +inline void +L_Infinity_Distance_Specialization::finalize(Temp&, Rounding_Dir) { +} + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/distances.defs.hh line 52. */ + +/* Automatically generated from PPL source file ../src/Generator.defs.hh line 39. */ +#include + +namespace Parma_Polyhedra_Library { + +// Put them in the namespace here to declare them friend later. + +namespace IO_Operators { + +//! Output operator. +/*! \relates Parma_Polyhedra_Library::Generator */ +std::ostream& operator<<(std::ostream& s, const Generator& g); + +} // namespace IO_Operators + +} // namespace Parma_Polyhedra_Library + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Generator */ +void swap(Parma_Polyhedra_Library::Generator& x, + Parma_Polyhedra_Library::Generator& y); + +} // namespace std + + +//! A line, ray, point or closure point. +/*! \ingroup PPL_CXX_interface + An object of the class Generator is one of the following: + + - a line \f$\vect{l} = (a_0, \ldots, a_{n-1})^\transpose\f$; + + - a ray \f$\vect{r} = (a_0, \ldots, a_{n-1})^\transpose\f$; + + - a point + \f$\vect{p} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$; + + - a closure point + \f$\vect{c} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$; + + where \f$n\f$ is the dimension of the space + and, for points and closure points, \f$d > 0\f$ is the divisor. + + \par A note on terminology. + As observed in Section \ref representation, there are cases when, + in order to represent a polyhedron \f$\cP\f$ using the generator system + \f$\cG = (L, R, P, C)\f$, we need to include in the finite set + \f$P\f$ even points of \f$\cP\f$ that are not 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 (line, ray, point + or closure_point) 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 divisor 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 + x, y and z + 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 point 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 point (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 g1 is a point having coordinates + \f$(a_0, \ldots, a_{n-1})^\transpose\f$, + we construct the closure point g2 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 coefficient with the notion of coordinate: + these are equivalent only when the divisor of the (closure) point is 1. +*/ +class Parma_Polyhedra_Library::Generator : private Linear_Row { +public: + //! Returns the line of direction \p e. + /*! + \exception std::invalid_argument + Thrown if the homogeneous part of \p e represents the origin of + the vector space. + */ + static Generator line(const Linear_Expression& e); + + //! Returns the ray of direction \p e. + /*! + \exception std::invalid_argument + Thrown if the homogeneous part of \p e represents the origin of + the vector space. + */ + static Generator ray(const Linear_Expression& e); + + //! Returns the point at \p e / \p d. + /*! + Both \p e and \p d are optional arguments, with default values + Linear_Expression::zero() and Coefficient_one(), respectively. + + \exception std::invalid_argument + Thrown if \p d is zero. + */ + static Generator point(const Linear_Expression& e + = Linear_Expression::zero(), + Coefficient_traits::const_reference d + = Coefficient_one()); + + //! Returns the closure point at \p e / \p d. + /*! + Both \p e and \p d are optional arguments, with default values + Linear_Expression::zero() and Coefficient_one(), respectively. + + \exception std::invalid_argument + Thrown if \p d is zero. + */ + static Generator + closure_point(const Linear_Expression& e = Linear_Expression::zero(), + Coefficient_traits::const_reference d = Coefficient_one()); + + //! Ordinary copy-constructor. + Generator(const Generator& g); + + //! Destructor. + ~Generator(); + + //! Assignment operator. + Generator& operator=(const Generator& g); + + //! Returns the maximum space dimension a Generator can handle. + static dimension_type max_space_dimension(); + + //! Returns the dimension of the vector space enclosing \p *this. + dimension_type space_dimension() const; + + //! The generator type. + enum Type { + /*! The generator is a line. */ + LINE, + /*! The generator is a ray. */ + RAY, + /*! The generator is a point. */ + POINT, + /*! The generator is a closure point. */ + CLOSURE_POINT + }; + + //! Returns the generator type of \p *this. + Type type() const; + + //! Returns true if and only if \p *this is a line. + bool is_line() const; + + //! Returns true if and only if \p *this is a ray. + bool is_ray() const; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS + //! Returns true 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 true if and only if \p *this is a point. + bool is_point() const; + + //! Returns true 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 true if and only if \p *this and \p y + are equivalent generators. + + Generators having different space dimensions are not equivalent. + */ + bool is_equivalent_to(const Generator& y) const; + + PPL_OUTPUT_DECLARATIONS + + /*! \brief + Loads from \p s an ASCII representation (as produced by + ascii_dump(std::ostream&) const) and sets \p *this accordingly. + Returns true if successful, false otherwise. + */ + bool ascii_load(std::istream& s); + + //! Checks if all the invariants are satisfied. + bool OK() const; + + //! Swaps \p *this with \p y. + void swap(Generator& y); + +private: + /*! \brief + 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. + */ + Generator(Linear_Expression& e, Type type, Topology topology); + + /*! \brief + Throw a std::invalid_argument exception + containing the appropriate error message. + */ + void + throw_dimension_incompatible(const char* method, + const char* name_var, + Variable v) const; + + /*! \brief + Throw a std::invalid_argument exception + containing the appropriate error message. + */ + void + throw_invalid_argument(const char* method, const char* reason) const; + + friend class Parma_Polyhedra_Library::Scalar_Products; + friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign; + friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Assign; + friend class Parma_Polyhedra_Library::Generator_System; + friend class Parma_Polyhedra_Library::Generator_System::const_iterator; + // FIXME: the following friend declaration should be avoided. + friend class Parma_Polyhedra_Library::Polyhedron; + friend class Parma_Polyhedra_Library::Grid_Generator; + // This is for access to Row and Linear_Row in `insert'. + friend class Parma_Polyhedra_Library::Grid_Generator_System; + + friend + Parma_Polyhedra_Library + ::Linear_Expression::Linear_Expression(const Generator& g); + + friend std::ostream& + Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s, + const Generator& g); + + //! Copy-constructor with given space dimension. + Generator(const Generator& g, dimension_type dimension); + + //! Returns true if and only if \p *this is not a line. + bool is_ray_or_point() const; + + //! Sets the Linear_Row kind to LINE_OR_EQUALITY. + void set_is_line(); + + //! Sets the Linear_Row kind to RAY_OR_POINT_OR_INEQUALITY. + void set_is_ray_or_point(); + + /*! \brief + Returns true if and only if the closure point + \p *this has the same \e coordinates of the point \p p. + + It is \e assumed that \p *this is a closure point, \p p is a point + and both topologies and space dimensions agree. + */ + bool is_matching_closure_point(const Generator& p) const; + + //! Default constructor: private and not implemented. + Generator(); +}; + + +namespace Parma_Polyhedra_Library { + +//! Shorthand for Generator Generator::line(const Linear_Expression& e). +/*! \relates Generator */ +Generator line(const Linear_Expression& e); + +//! Shorthand for Generator Generator::ray(const Linear_Expression& e). +/*! \relates Generator */ +Generator ray(const Linear_Expression& e); + +/*! \brief + Shorthand for Generator + Generator::point(const Linear_Expression& e, Coefficient_traits::const_reference d). + + \relates Generator +*/ +Generator +point(const Linear_Expression& e = Linear_Expression::zero(), + Coefficient_traits::const_reference d = Coefficient_one()); + +/*! \brief + Shorthand for Generator + Generator::closure_point(const Linear_Expression& e, Coefficient_traits::const_reference d). + + \relates Generator +*/ +Generator +closure_point(const Linear_Expression& e = Linear_Expression::zero(), + Coefficient_traits::const_reference d = Coefficient_one()); + +//! Returns true if and only if \p x is equivalent to \p y. +/*! \relates Generator */ +bool operator==(const Generator& x, const Generator& y); + +//! Returns true 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. + + \note + Distances are \e only defined between generators that are points and/or + closure points; for rays or lines, \c false is returned. +*/ +template +bool rectilinear_distance_assign(Checked_Number& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. + + \note + Distances are \e only defined between generators that are points and/or + closure points; for rays or lines, \c false is returned. +*/ +template +bool rectilinear_distance_assign(Checked_Number& 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 true; + returns false 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 +bool rectilinear_distance_assign(Checked_Number& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. + + \note + Distances are \e only defined between generators that are points and/or + closure points; for rays or lines, \c false is returned. +*/ +template +bool euclidean_distance_assign(Checked_Number& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. + + \note + Distances are \e only defined between generators that are points and/or + closure points; for rays or lines, \c false is returned. +*/ +template +bool rectilinear_distance_assign(Checked_Number& 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 true; + returns false 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 +bool euclidean_distance_assign(Checked_Number& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. + + \note + Distances are \e only defined between generators that are points and/or + closure points; for rays or lines, \c false is returned. +*/ +template +bool l_infinity_distance_assign(Checked_Number& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. + + \note + Distances are \e only defined between generators that are points and/or + closure points; for rays or lines, \c false is returned. +*/ +template +bool l_infinity_distance_assign(Checked_Number& 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 true; + returns false 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 +bool l_infinity_distance_assign(Checked_Number& 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 +Generator::Generator(Linear_Expression& e, Type type, Topology topology) { + assert(type != CLOSURE_POINT || topology == NOT_NECESSARILY_CLOSED); + Linear_Row::swap(e); + flags() = Flags(topology, (type == LINE + ? LINE_OR_EQUALITY + : RAY_OR_POINT_OR_INEQUALITY)); +} + +inline +Generator::Generator(const Generator& g) + : Linear_Row(g) { +} + +inline +Generator::Generator(const Generator& g, dimension_type dimension) + : Linear_Row(g, dimension, dimension) { +} + +inline +Generator::~Generator() { +} + +inline Generator& +Generator::operator=(const Generator& g) { + Linear_Row::operator=(g); + return *this; +} + +inline dimension_type +Generator::max_space_dimension() { + return Linear_Row::max_space_dimension(); +} + +inline dimension_type +Generator::space_dimension() const { + return Linear_Row::space_dimension(); +} + +inline bool +Generator::is_line() const { + return is_line_or_equality(); +} + +inline bool +Generator::is_ray_or_point() const { + return is_ray_or_point_or_inequality(); +} + +inline bool +Generator::is_line_or_ray() const { + return (*this)[0] == 0; +} + +inline bool +Generator::is_ray() const { + return is_ray_or_point() && is_line_or_ray(); +} + +inline Generator::Type +Generator::type() const { + if (is_line()) + return LINE; + if (is_line_or_ray()) + return RAY; + if (is_necessarily_closed()) + return POINT; + else { + // Checking the value of the epsilon coefficient. + const Generator& g = *this; + return (g[size() - 1] == 0) ? CLOSURE_POINT : POINT; + } +} + +inline bool +Generator::is_point() const { + return type() == POINT; +} + +inline bool +Generator::is_closure_point() const { + return type() == CLOSURE_POINT; +} + +inline void +Generator::set_is_line() { + set_is_line_or_equality(); +} + +inline void +Generator::set_is_ray_or_point() { + set_is_ray_or_point_or_inequality(); +} + +inline Coefficient_traits::const_reference +Generator::coefficient(const Variable v) const { + if (v.space_dimension() > space_dimension()) + throw_dimension_incompatible("coefficient(v)", "v", v); + return Linear_Row::coefficient(v.id()); +} + +inline Coefficient_traits::const_reference +Generator::divisor() const { + Coefficient_traits::const_reference d = Linear_Row::inhomogeneous_term(); + if (!is_ray_or_point() || d == 0) + throw_invalid_argument("divisor()", + "*this is neither a point nor a closure point"); + return d; +} + +inline memory_size_type +Generator::external_memory_in_bytes() const { + return Linear_Row::external_memory_in_bytes(); +} + +inline memory_size_type +Generator::total_memory_in_bytes() const { + return Linear_Row::total_memory_in_bytes(); +} + +inline const Generator& +Generator::zero_dim_point() { + assert(zero_dim_point_p != 0); + return *zero_dim_point_p; +} + +inline const Generator& +Generator::zero_dim_closure_point() { + assert(zero_dim_closure_point_p != 0); + return *zero_dim_closure_point_p; +} + +/*! \relates Generator */ +inline Generator +line(const Linear_Expression& e) { + return Generator::line(e); +} + +/*! \relates Generator */ +inline Generator +ray(const Linear_Expression& e) { + return Generator::ray(e); +} + +/*! \relates Generator */ +inline Generator +point(const Linear_Expression& e, Coefficient_traits::const_reference d) { + return Generator::point(e, d); +} + +/*! \relates Generator */ +inline Generator +closure_point(const Linear_Expression& e, + Coefficient_traits::const_reference d) { + return Generator::closure_point(e, d); +} + +/*! \relates Generator */ +inline bool +operator==(const Generator& x, const Generator& y) { + return x.is_equivalent_to(y); +} + +/*! \relates Generator */ +inline bool +operator!=(const Generator& x, const Generator& y) { + return !x.is_equivalent_to(y); +} + +inline void +Generator::ascii_dump(std::ostream& s) const { + Linear_Row::ascii_dump(s); +} + +inline bool +Generator::ascii_load(std::istream& s) { + return Linear_Row::ascii_load(s); +} + +inline void +Generator::swap(Generator& y) { + Linear_Row::swap(y); +} + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates Generator */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +inline bool +l_m_distance_assign(Checked_Number& 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_TEMP0(mpq_class, x_coord); + PPL_DIRTY_TEMP0(mpq_class, y_coord); + PPL_DIRTY_TEMP0(mpq_class, x_div); + PPL_DIRTY_TEMP0(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); + 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); + assert(sgn(tmp1) >= 0); + Specialization::combine(tmp0, tmp1, dir); + } + Specialization::finalize(tmp0, dir); + assign_r(r, tmp0, dir); + return true; +} + +/*! \relates Generator */ +template +inline bool +rectilinear_distance_assign(Checked_Number& r, + const Generator& x, + const Generator& y, + const Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2) { + return l_m_distance_assign > + (r, x, y, dir, tmp0, tmp1, tmp2); +} + +/*! \relates Generator */ +template +inline bool +rectilinear_distance_assign(Checked_Number& r, + const Generator& x, + const Generator& y, + const Rounding_Dir dir) { + typedef Checked_Number 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 +inline bool +rectilinear_distance_assign(Checked_Number& r, + const Generator& x, + const Generator& y, + const Rounding_Dir dir) { + return rectilinear_distance_assign(r, x, y, dir); +} + +/*! \relates Generator */ +template +inline bool +euclidean_distance_assign(Checked_Number& r, + const Generator& x, + const Generator& y, + const Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2) { + return l_m_distance_assign > + (r, x, y, dir, tmp0, tmp1, tmp2); +} + +/*! \relates Generator */ +template +inline bool +euclidean_distance_assign(Checked_Number& r, + const Generator& x, + const Generator& y, + const Rounding_Dir dir) { + typedef Checked_Number 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 +inline bool +euclidean_distance_assign(Checked_Number& r, + const Generator& x, + const Generator& y, + const Rounding_Dir dir) { + return euclidean_distance_assign(r, x, y, dir); +} + +/*! \relates Generator */ +template +inline bool +l_infinity_distance_assign(Checked_Number& r, + const Generator& x, + const Generator& y, + const Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2) { + return l_m_distance_assign > + (r, x, y, dir, tmp0, tmp1, tmp2); +} + +/*! \relates Generator */ +template +inline bool +l_infinity_distance_assign(Checked_Number& r, + const Generator& x, + const Generator& y, + const Rounding_Dir dir) { + typedef Checked_Number 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 +inline bool +l_infinity_distance_assign(Checked_Number& r, + const Generator& x, + const Generator& y, + const Rounding_Dir dir) { + return l_infinity_distance_assign(r, x, y, dir); +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Generator */ +inline void +swap(Parma_Polyhedra_Library::Generator& x, + Parma_Polyhedra_Library::Generator& y) { + x.swap(y); +} + +} // namespace std + +/* Automatically generated from PPL source file ../src/Generator.defs.hh line 722. */ + +/* Automatically generated from PPL source file ../src/Congruence.defs.hh line 1. */ +/* Congruence class declaration. +*/ + + +/* Automatically generated from PPL source file ../src/Congruence_System.defs.hh line 1. */ +/* Congruence_System class declaration. +*/ + + +/* 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/Congruence_System.defs.hh line 33. */ +#include + +namespace Parma_Polyhedra_Library { + +namespace IO_Operators { + +//! Output operator. +/*! + \relates Parma_Polyhedra_Library::Congruence_System + Writes true 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 + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Congruence_System */ +void +swap(Parma_Polyhedra_Library::Congruence_System& x, + Parma_Polyhedra_Library::Congruence_System& y); + +} // namespace std + +//! A system of congruences. +/*! \ingroup PPL_CXX_interface + An object of the class Congruence_System is a system of congruences, + i.e., a multiset of objects of the class Congruence. + When inserting congruences in a system, space dimensions are + automatically adjusted so that all the congruences in the system + are defined on the same vector space. + + \par + In all the examples it is assumed that variables + x and y 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 exact copy of them + can be retrieved: + in general, only an equivalent congruence system + will be available, where original congruences may have been + reordered, removed (if they are trivial, duplicate or + implied by other congruences), linearly combined, etc. +*/ +class Parma_Polyhedra_Library::Congruence_System : private Matrix { +public: + //! Default constructor: builds an empty system of congruences. + Congruence_System(); + + //! Builds the singleton system containing only congruence \p cg. + explicit Congruence_System(const Congruence& cg); + + /*! \brief + If \p c represents the constraint \f$ e_1 = e_2 \f$, builds the + singleton system containing only constraint \f$ e_1 = e_2 + \pmod{0}\f$. + + \exception std::invalid_argument + Thrown if \p c is not an equality constraint. + */ + explicit Congruence_System(const Constraint& c); + + //! Builds a system containing copies of any equalities in \p cs. + explicit Congruence_System(const Constraint_System& cs); + + //! Ordinary copy-constructor. + Congruence_System(const Congruence_System& cgs); + + //! Destructor. + ~Congruence_System(); + + //! Assignment operator. + Congruence_System& operator=(const Congruence_System& cgs); + + //! Returns the maximum space dimension a Congruence_System can handle. + static dimension_type max_space_dimension(); + + //! Returns the dimension of the vector space enclosing \p *this. + dimension_type space_dimension() const; + + /*! \brief + Returns true if and only if \p *this is exactly equal + to \p cgs. + */ + bool is_equal_to(const Congruence_System& cgs) const; + + /*! \brief + Returns true if and only if \p *this contains one or + more linear equalities. + */ + bool has_linear_equalities() const; + + //! Removes all the congruences and sets the space dimension to 0. + void clear(); + + /*! \brief + Inserts in \p *this a copy of the congruence \p cg, increasing the + number of space dimensions if needed. + + The copy of \p cg will be strongly normalized after being + inserted. + */ + void insert(const Congruence& cg); + + /*! \brief + Inserts in \p *this a copy of the equality constraint \p c, seen + as a modulo 0 congruence, increasing the number of space + dimensions if needed. + + The modulo 0 congruence will be strongly normalized after being + inserted. + + \exception std::invalid_argument + Thrown if \p c is a relational constraint. + */ + void insert(const Constraint& c); + + // TODO: Consider adding a recycling_insert(cg). + + /*! \brief + Inserts in \p *this a copy of the congruences in \p cgs, + increasing the number of space dimensions if needed. + + The inserted copies will be strongly normalized. + */ + void insert(const Congruence_System& cgs); + + /*! \brief + Inserts into \p *this the congruences in \p cgs, increasing the + number of space dimensions if needed. + */ + void recycling_insert(Congruence_System& cgs); + + //! 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 gr: + \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 { + 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 true if and only if \p *this and \p y are + identical. + */ + bool operator==(const const_iterator& y) const; + + /*! \brief + Returns true if and only if \p *this and \p y are + different. + */ + bool operator!=(const const_iterator& y) const; + + private: + friend class Congruence_System; + + //! The const iterator over the matrix of congruences. + Matrix::const_iterator i; + + //! A const pointer to the matrix of congruences. + const Matrix* csp; + + //! Constructor. + const_iterator(const Matrix::const_iterator& iter, + const Congruence_System& cgs); + + //! \p *this skips to the next non-trivial congruence. + void skip_forward(); + }; + + //! Returns true 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 true if and only if \p *this is a valid + Matrix, each row in the system is a valid Congruence and the + number of columns is consistent with the number of congruences. + */ +#endif // 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 true if successful, false 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 swap(Congruence_System& cgs); + + /*! \brief + Adds \p dims rows and \p dims columns of zeroes to the matrix, + initializing the added rows as in the unit congruence system. + + \param dims + The number of rows and columns to be added: must be strictly + positive. + + Turns the \f$r \times c\f$ matrix \f$A\f$ into the \f$(r+dims) \times + (c+dims)\f$ matrix + \f$\bigl(\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_columns(dimension_type dims); + +protected: + + //! Returns true if \p g satisfies all the congruences. + bool satisfies_all_congruences(const Grid_Generator& g) const; + +private: + /*! \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; + + //! Builds an empty (i.e. zero rows) system of dimension \p d. + explicit Congruence_System(dimension_type d); + + /*! \brief + Concatenates copies of the congruences from \p cgs onto \p *this. + + \param cgs + The congruence system to append to \p this. The number of rows in + \p cgs 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 cgs in the lower right-hand side, and padding + with zeroes. + */ + void concatenate(const Congruence_System& cgs); + + //! Adjusts all expressions to have the same moduli. + void normalize_moduli(); + + //! Increase the number of space dimensions to \p new_space_dim. + /*! + \p new_space_dim must at least equal to the current space + dimension. + */ + bool increase_space_dimension(dimension_type new_space_dim); + + /*! \brief + Inserts in \p *this an exact copy of the congruence \p cg, + increasing the number of space dimensions if needed. + + This method inserts a copy of \p cg in the given form, instead of + first strong normalizing \p cg as \ref insert would do. + */ + void insert_verbatim(const Congruence& cg); + + friend class const_iterator; + friend class Grid; + friend class Grid_Certificate; + + friend void std::swap(Parma_Polyhedra_Library::Congruence_System& x, + Parma_Polyhedra_Library::Congruence_System& y); + + friend bool + operator==(const Congruence_System& x, const Congruence_System& y); + + //! Returns the \p k- th congruence of the system. + Congruence& operator[](dimension_type k); + + //! Returns a constant reference to the \p k- th congruence of the system. + const Congruence& operator[](dimension_type k) const; + + /*! \brief + Returns true if and only if any of the dimensions in + \p *this is free of constraint. + + Any equality or proper congruence affecting a dimension constrains + that dimension. + + This method assumes the system is in minimal form. + */ + bool has_a_free_dimension() const; + + /*! \brief + Substitutes a given column of coefficients by a given affine + expression. + + \param v + Index of the column to which the affine transformation is + substituted; + + \param expr + The numerator of the affine transformation: + \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$; + + \param denominator + The denominator of the affine transformation. + + We allow affine transformations (see the Section \ref + rational_grid_operations) to have rational + coefficients. Since the coefficients of linear expressions are + integers we also provide an integer \p denominator that will + be used as denominator of the affine transformation. The + denominator is required to be a positive integer and its default value + is 1. + + The affine transformation substitutes the matrix of congruences + by a new matrix whose elements \f${a'}_{ij}\f$ are built from + the old one \f$a_{ij}\f$ as follows: + \f[ + {a'}_{ij} = + \begin{cases} + a_{ij} * \mathrm{denominator} + a_{iv} * \mathrm{expr}[j] + \quad \text{for } j \neq v; \\ + \mathrm{expr}[v] * a_{iv} + \quad \text{for } j = v. + \end{cases} + \f] + + \p expr is a constant parameter and unaltered by this computation. + */ + void affine_preimage(dimension_type v, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator); + + /*! \brief + Removes the higher dimensions of the system so that the resulting + system will have dimension \p new_dimension. + + The value of \p new_dimension must be at most the space dimension + of \p *this. + */ + void remove_higher_space_dimensions(dimension_type new_dimension); + + //! Resizes the system without worrying about the old contents. + /*! + \param new_num_rows + The number of rows of the resized system; + + \param new_num_columns + The number of columns of the resized system. + + The system is expanded to the specified dimensions avoiding + reallocation whenever possible. + The contents of the original system is lost. + */ + void resize_no_copy(dimension_type new_num_rows, + dimension_type new_num_columns); +}; + +// Congruence_System.inlines.hh is not included here on purpose. + +/* Automatically generated from PPL source file ../src/Congruence.defs.hh line 36. */ +#include + +namespace Parma_Polyhedra_Library { + +namespace IO_Operators { + +//! Output operators. + +/*! \relates Parma_Polyhedra_Library::Congruence */ +std::ostream& +operator<<(std::ostream& s, const Congruence& c); + +// Put this in the namespace here to declare it a friend later. + +/*! \relates Parma_Polyhedra_Library::Congruence_System */ +std::ostream& +operator<<(std::ostream& s, const Congruence_System& cgs); + + +} // namespace IO_Operators + +// Put these in the namespace here to declare them friend later. + +//! Returns true if and only if \p x and \p y are equivalent. +/*! \relates Congruence */ +bool +operator==(const Congruence& x, const Congruence& y); + +//! Returns false if and only if \p x and \p y are equivalent. +/*! \relates Congruence */ +bool +operator!=(const Congruence& x, const Congruence& y); + +//! Returns the congruence \f$e1 = e2 \pmod{1}\f$. +/*! \relates Congruence */ +Congruence +operator%=(const Linear_Expression& e1, const Linear_Expression& e2); + +//! Returns the congruence \f$e = n \pmod{1}\f$. +/*! \relates Congruence */ +Congruence +operator%=(const Linear_Expression& e, 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); + +} // namespace Parma_Polyhedra_Library + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Congruence */ +void +swap(Parma_Polyhedra_Library::Congruence& x, + Parma_Polyhedra_Library::Congruence& y); + +} // namespace std + +//! A linear congruence. +/*! \ingroup PPL_CXX_interface + An object of the class Congruence is a congruence: + - \f$\cg = \sum_{i=0}^{n-1} a_i x_i + b = 0 \pmod m\f$ + + where \f$n\f$ is the dimension of the space, + \f$a_i\f$ is the integer coefficient of variable \f$x_i\f$, + \f$b\f$ is the integer inhomogeneous term and \f$m\f$ is the integer modulus; + if \f$m = 0\f$, then \f$\cg\f$ represents the equality congruence + \f$\sum_{i=0}^{n-1} a_i x_i + b = 0\f$ + and, if \f$m \neq 0\f$, then the congruence \f$\cg\f$ is + said to be a proper congruence. + + \par How to build a congruence + Congruences \f$\pmod{1}\f$ are typically built by + applying the congruence symbol `\%=' + 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 `/'. + + 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 + x, y and z + 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 : private Row { +public: + //! Ordinary copy-constructor. + Congruence(const Congruence& cg); + + //! Copy-constructs (modulo 0) from equality constraint \p c. + /*! + \exception std::invalid_argument + Thrown if \p c is an inequality. + */ + explicit Congruence(const Constraint& c); + + //! Destructor. + ~Congruence(); + + //! Assignment operator. + Congruence& operator=(const Congruence& cg); + + //! Returns the maximum space dimension a Congruence can handle. + static dimension_type max_space_dimension(); + + //! Returns the dimension of the vector space enclosing \p *this. + dimension_type space_dimension() const; + + //! Returns the coefficient of \p v in \p *this. + /*! + \exception std::invalid_argument thrown if the index of \p v + is greater than or equal to the space dimension of \p *this. + */ + Coefficient_traits::const_reference coefficient(Variable v) const; + + //! Returns the inhomogeneous term of \p *this. + Coefficient_traits::const_reference inhomogeneous_term() const; + + //! Returns a const reference to the modulus of \p *this. + Coefficient_traits::const_reference modulus() const; + + //! Multiplies \p k into the modulus of \p *this. + /*! + If called with \p *this representing the congruence \f$ e_1 = e_2 + \pmod{m}\f$, then it returns with *this representing + the congruence \f$ e_1 = e_2 \pmod{mk}\f$. + */ + Congruence& + operator/=(Coefficient_traits::const_reference k); + + /*! \brief + Returns true 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 true 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 true if the modulus is greater than zero. + /*! + A congruence with a modulus of 0 is a linear equality. + */ + bool is_proper_congruence() const; + + //! Returns true if \p *this is an equality. + /*! + A modulus of zero denotes a linear equality. + */ + bool is_equality() const; + + /*! \brief + Returns true if \p *this is equal to \p cg in + dimension \p dim. + */ + bool is_equal_at_dimension(dimension_type dim, + const Congruence& cg) 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 integrality + congruence. + */ + 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); + + //! Returns the congruence \f$e = n \pmod{1}\f$. + static Congruence + create(const Linear_Expression& e, Coefficient_traits::const_reference n); + + //! Returns the congruence \f$n = e \pmod{1}\f$. + static Congruence + create(Coefficient_traits::const_reference n, const Linear_Expression& e); + + /*! \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 of the internal + representation of \p *this. + */ + bool ascii_load(std::istream& s); + + //! Checks if all the invariants are satisfied. + bool OK() const; + +protected: + + //! Normalizes the signs. + /*! + The signs of the coefficients and the inhomogeneous term are + normalized, leaving the first non-zero homogeneous coefficient + positive. + */ + void sign_normalize(); + + //! Normalizes signs and the inhomogeneous term. + /*! + Applies sign_normalize, then reduces the inhomogeneous term to the + smallest possible positive number. + */ + void normalize(); + + //! Calls normalize, then divides out common factors. + /*! + Strongly normalized Congruences have equivalent semantics if and + only if their syntaxes (as output by operator<<) are equal. + */ + void strong_normalize(); + +private: + /*! \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 integrality congruence. + */ + static const Congruence* zero_dim_integrality_p; + + //! Marks this congruence as a linear equality. + void set_is_equality(); + + //! Negates the elements from index \p start to index \p end. + void negate(dimension_type start, dimension_type end); + + //! Default constructor: private and not implemented. + Congruence(); + + //! Copy-constructs with specified size and capacity. + Congruence(const Congruence& cg, + dimension_type sz, + dimension_type capacity); + + //! Constructs from a constraint, with specified size and capacity. + Congruence(const Constraint& c, + dimension_type sz, + dimension_type capacity); + + //! Copy-constructs from \p cg, multiplying \p k into the modulus. + /*! + If \p cg represents the congruence \f$ e_1 = e_2 + \pmod{m}\f$, then the result represents the + congruence \f$ e_1 = e_2 \pmod{mk}\f$. + */ + Congruence(const Congruence& cg, Coefficient_traits::const_reference k); + + //! Constructs from Linear_Expression \p le, using modulus \p m. + /*! + Builds a congruence with modulus \p m, stealing the coefficients + from \p le. + + \param le + The Linear_Expression holding the coefficients. + + \param m + The modulus for the congruence, which must be zero or greater. + */ + Congruence(Linear_Expression& le, + Coefficient_traits::const_reference m); + + //! Swaps \p *this with \p y. + void swap(Congruence& y); + + /*! \brief + Throws a std::invalid_argument exception containing + error message \p message. + */ + void + throw_invalid_argument(const char* method, const char* message) const; + + /*! \brief + Throws a std::invalid_argument exception containing + the appropriate error message. + */ + void + throw_dimension_incompatible(const char* method, + const char* v_name, + Variable v) const; + + friend Congruence + operator/(const Congruence& cg, Coefficient_traits::const_reference k); + friend Congruence + operator/(const Constraint& c, Coefficient_traits::const_reference m); + + friend bool + operator==(const Congruence& x, const Congruence& y); + + friend bool + operator!=(const Congruence& x, const Congruence& y); + + friend std::ostream& + Parma_Polyhedra_Library::IO_Operators + ::operator<<(std::ostream& s, + const Congruence_System& cgs); + + friend class Parma_Polyhedra_Library::Scalar_Products; + friend class Parma_Polyhedra_Library::Constraint; + friend class Parma_Polyhedra_Library::Congruence_System; + friend class Parma_Polyhedra_Library::Congruence_System::const_iterator; + // FIXME: The following friend declaration is at least for + // operator[] access in Grid::conversion. + friend class Parma_Polyhedra_Library::Grid; + friend class Parma_Polyhedra_Library::Linear_Expression; + + friend void + std::swap(Parma_Polyhedra_Library::Congruence& x, + Parma_Polyhedra_Library::Congruence& y); +}; + +/* Automatically generated from PPL source file ../src/Congruence.inlines.hh line 1. */ +/* Congruence class implementation: inline functions. +*/ + + +/* Automatically generated from PPL source file ../src/Congruence.inlines.hh line 28. */ + +#include + +namespace Parma_Polyhedra_Library { + +inline +Congruence::Congruence(const Congruence& cg) + : Row(cg) { +} + +inline +Congruence::Congruence(const Congruence& cg, + dimension_type sz, dimension_type capacity) + : Row(cg, sz, capacity) { +} + +inline +Congruence::Congruence(const Congruence& cg, + Coefficient_traits::const_reference k) + : Row(cg) { + if (k >= 0) + (*this)[size()-1] *= k; + else + (*this)[size()-1] *= -k; +} + +inline +Congruence::~Congruence() { +} + +inline +Congruence::Congruence(Linear_Expression& le, + Coefficient_traits::const_reference m) { + Row::swap(static_cast(le)); + assert(m >= 0); + (*this)[size()-1] = m; +} + +inline Congruence +Congruence::create(const Linear_Expression& e, + Coefficient_traits::const_reference n) { + // Ensure that diff has capacity for the modulus. + Linear_Expression diff(e, e.space_dimension() + 2); + diff -= n; + Congruence cg(diff, 1); + return cg; +} + +inline Congruence +Congruence::create(Coefficient_traits::const_reference n, + const Linear_Expression& e) { + // Ensure that diff has capacity for the modulus. + Linear_Expression diff(e, e.space_dimension() + 2); + diff -= n; + Congruence cg(diff, 1); + 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, 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& c) { + Row::operator=(c); + return *this; +} + +/*! \relates Congruence */ +inline Congruence +operator/(const Constraint& c, Coefficient_traits::const_reference m) { + Congruence ret(c); + return ret / m; +} + +inline Congruence& +Congruence::operator/=(Coefficient_traits::const_reference k) { + if (k >= 0) + (*this)[size()-1] *= k; + else + (*this)[size()-1] *= -k; + return *this; +} + +/*! \relates Congruence */ +inline bool +operator==(const Congruence& x, const Congruence& y) { + Congruence x_temp(x); + Congruence y_temp(y); + x_temp.strong_normalize(); + y_temp.strong_normalize(); + return static_cast(x_temp) == static_cast(y_temp); +} + +/*! \relates Congruence */ +inline bool +operator!=(const Congruence& x, const Congruence& y) { + return !(x == y); +} + +inline dimension_type +Congruence::max_space_dimension() { + // The first coefficient holds the inhomogeneous term, while + // the last coefficient is for the modulus. + return max_size() - 2; +} + +inline dimension_type +Congruence::space_dimension() const { + return size() - 2; +} + +inline Coefficient_traits::const_reference +Congruence::coefficient(const Variable v) const { + if (v.space_dimension() > space_dimension()) + throw_dimension_incompatible("coefficient(v)", "v", v); + return (*this)[v.id()+1]; +} + +inline Coefficient_traits::const_reference +Congruence::inhomogeneous_term() const { + return (*this)[0]; +} + +inline Coefficient_traits::const_reference +Congruence::modulus() const { + assert(size() > 1); + return (*this)[size()-1]; +} + +inline bool +Congruence::is_proper_congruence() const { + return modulus() > 0; +} + +inline bool +Congruence::is_equality() const { + return modulus() == 0; +} + +inline bool +Congruence::is_equal_at_dimension(dimension_type dim, + const Congruence& cg) const { + return operator[](dim) * cg.modulus() == cg[dim] * modulus(); +} + +inline void +Congruence::set_is_equality() { + (*this)[size()-1] = 0; +} + +inline void +Congruence::negate(dimension_type start, dimension_type end) { + while (start <= end) + neg_assign(operator[](start++)); +} + +inline memory_size_type +Congruence::external_memory_in_bytes() const { + return Row::external_memory_in_bytes(); +} + +inline memory_size_type +Congruence::total_memory_in_bytes() const { + return Row::total_memory_in_bytes(); +} + +inline void +Congruence::swap(Congruence& y) { + Row::swap(y); +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Congruence */ +inline void +swap(Parma_Polyhedra_Library::Congruence& x, + Parma_Polyhedra_Library::Congruence& y) { + x.swap(y); +} + +} // namespace std + +/* Automatically generated from PPL source file ../src/Congruence.defs.hh line 478. */ + +/* 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_System.defs.hh line 1. */ +/* Grid_Generator_System 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/Grid_Generator_System.defs.hh line 30. */ +#include + +namespace Parma_Polyhedra_Library { + +namespace IO_Operators { + +//! Output operator. +/*! + \relates Parma_Polyhedra_Library::Grid_Generator_System + Writes false if \p gs is empty. Otherwise, writes on + \p s the generators of \p gs, all in one row and separated by ", ". +*/ +std::ostream& operator<<(std::ostream& s, const Grid_Generator_System& gs); + +} // namespace IO_Operators + +//! Returns true if and only if \p x and \p y are identical. +/*! \relates Grid_Generator_System */ +bool operator==(const Grid_Generator_System& x, + const Grid_Generator_System& y); + +} // namespace Parma_Polyhedra_Library + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Grid_Generator_System */ +void swap(Parma_Polyhedra_Library::Grid_Generator_System& x, + Parma_Polyhedra_Library::Grid_Generator_System& y); + +} // namespace std + + +//! A system of grid generators. +/*! \ingroup PPL_CXX_interface + An object of the class Grid_Generator_System is a system of + grid generators, i.e., a multiset of objects of the class + Grid_Generator (lines, parameters and points). + When inserting generators in a system, space dimensions are + automatically adjusted so that all the generators in the system + are defined on the same vector space. + A system of grid generators which is meant to define a non-empty + grid must include at least one point: the reason is that + lines and parameters need a supporting point + (lines only specify directions while parameters only + specify direction and distance. + + \par + In all the examples it is assumed that variables + x and y 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 exact copy of them + can be retrieved: + in general, only an equivalent grid generator system + will be available, where original generators may have been + reordered, removed (if they are duplicate or redundant), etc. +*/ +class Parma_Polyhedra_Library::Grid_Generator_System + : private Generator_System { +public: + //! Default constructor: builds an empty system of generators. + Grid_Generator_System(); + + //! Builds the singleton system containing only generator \p g. + explicit Grid_Generator_System(const Grid_Generator& g); + + //! Builds an empty system of generators of dimension \p dim. + explicit Grid_Generator_System(dimension_type dim); + + //! Ordinary copy-constructor. + Grid_Generator_System(const Grid_Generator_System& gs); + + //! Destructor. + ~Grid_Generator_System(); + + //! Assignment operator. + Grid_Generator_System& operator=(const Grid_Generator_System& y); + + //! Returns the maximum space dimension a Grid_Generator_System can handle. + static dimension_type max_space_dimension(); + + //! Returns the dimension of the vector space enclosing \p *this. + dimension_type space_dimension() const; + + /*! \brief + Removes all the generators from the generator system and sets its + space dimension to 0. + */ + void clear(); + + /*! \brief + Inserts into \p *this a copy of the generator \p g, increasing the + number of space dimensions if needed. + + If \p g is an all-zero parameter then the only action is to ensure + that the space dimension of \p *this is at least the space + dimension of \p g. + */ + void insert(const Grid_Generator& g); + + /*! \brief + Inserts into \p *this the generator \p g, increasing the number of + space dimensions if needed. + */ + void recycling_insert(Grid_Generator& g); + + /*! \brief + Inserts into \p *this the generators in \p gs, increasing the + number of space dimensions if needed. + */ + void recycling_insert(Grid_Generator_System& gs); + + //! 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 gr: + \code + const Grid_Generator_System& gs = gr.generators(); + for (Grid_Generator_System::const_iterator i = gs.begin(), + gs_end = gs.end(); i != gs_end; ++i) + cout << *i << endl; + \endcode + The same effect can be obtained more concisely by using + more features of the STL: + \code + const Generator_System& gs = gr.generators(); + copy(gs.begin(), gs.end(), ostream_iterator(cout, "\n")); + \endcode + */ + class const_iterator + : public std::iterator, + private Generator_System::const_iterator { + public: + //! Default constructor. + const_iterator(); + + //! Ordinary copy-constructor. + const_iterator(const const_iterator& y); + + //! Destructor. + ~const_iterator(); + + //! Assignment operator. + const_iterator& operator=(const const_iterator& y); + + //! Dereference operator. + const Grid_Generator& operator*() const; + + //! Indirect member selector. + const Grid_Generator* operator->() const; + + //! Prefix increment operator. + const_iterator& operator++(); + + //! Postfix increment operator. + const_iterator operator++(int); + + /*! \brief + Returns true if and only if \p *this and \p y are + identical. + */ + bool operator==(const const_iterator& y) const; + + /*! \brief + Returns true if and only if \p *this and \p y are + different. + */ + bool operator!=(const const_iterator& y) const; + + private: + friend class Grid_Generator_System; + + //! Copy-constructor from Generator_System::const_iterator. + const_iterator(const Generator_System::const_iterator& y); + }; + + //! Returns true 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 true if and only if \p *this contains one or + more points. + */ + bool has_points() const; + + //! Returns true 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. + /*! + Returns true if and only if \p *this is a valid + Linear_System and each row in the system is a valid Grid_Generator. + */ + bool OK() const; + + 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 true if successful, false 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 swap(Grid_Generator_System& y); + +private: + /*! \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 class Grid; + + friend bool + operator==(const Grid_Generator_System& x, const Grid_Generator_System& y); + + //! Sets the sortedness flag of the system to \p b. + void set_sorted(bool b); + + //! Sets the index to indicate that the system has no pending rows. + void unset_pending_rows(); + + //! Sets the index of the first pending row to \p i. + void set_index_first_pending_row(dimension_type i); + + //! Returns the \p k- th generator of the system. + Grid_Generator& operator[](dimension_type k); + + //! Returns a constant reference to the \p k- th generator of the system. + const Grid_Generator& operator[](dimension_type k) const; + + //! Assigns to a given variable an affine expression. + /*! + \param v + Index of the column to which the affine transformation is assigned; + + \param expr + The numerator of the affine transformation: + \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$; + + \param denominator + The denominator of the affine transformation; + + We allow affine transformations (see the Section \ref + rational_grid_operations)to have rational + coefficients. Since the coefficients of linear expressions are + integers we also provide an integer \p denominator that will + be used as denominator of the affine transformation. The + denominator is required to be a positive integer and its + default value is 1. + + The affine transformation assigns to each element of \p v -th + column the follow expression: + \f[ + \frac{\sum_{i = 0}^{n - 1} a_i x_i + b} + {\mathrm{denominator}}. + \f] + + \p expr is a constant parameter and unaltered by this computation. + */ + void affine_image(dimension_type v, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator); + + /*! \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); + + //! Removes all the specified dimensions from the generator system. + /*! + The space dimension of the variable with the highest space + dimension in \p to_be_removed must be at most the space dimension + of \p this. + */ + void remove_space_dimensions(const Variables_Set& to_be_removed); + + /*! \brief + Removes the higher dimensions of the system so that the resulting + system will have dimension \p new_dimension. + + The value of \p new_dimension must be at most the space dimension + of \p *this. + */ + void remove_higher_space_dimensions(dimension_type new_dimension); + + //! Resizes the system without worrying about the old contents. + /*! + \param new_num_rows + The number of rows of the resized system; + + \param new_num_columns + The number of columns of the resized system. + + The system is expanded to the specified dimensions avoiding + reallocation whenever possible. + The contents of the original system is lost. + */ + void resize_no_copy(dimension_type new_num_rows, + dimension_type new_num_columns); + + /*! \brief + Returns the number of columns of the matrix (i.e., the size of the + rows). + */ + dimension_type num_columns() const; + + /*! \brief + Erases from the matrix all the rows but those having an index less + than \p first_to_erase. + */ + void erase_to_end(dimension_type first_to_erase); + + //! Permutes the columns of the matrix. + /* + \param cycles + A vector representing the non-trivial cycles of the permutation + according to which the columns must be rearranged. + + The \p cycles vector contains, one after the other, the + non-trivial cycles (i.e., the cycles of length greater than one) + of a permutation of non-zero column indexes. Each cycle is + terminated by zero. For example, assuming the matrix has 6 + columns, the permutation \f$ \{ 1 \mapsto 3, 2 \mapsto 4, + 3 \mapsto 6, 4 \mapsto 2, 5 \mapsto 5, 6 \mapsto 1 \}\f$ can be + represented by the non-trivial cycles \f$(1 3 6)(2 4)\f$ that, in + turn can be represented by a vector of 6 elements containing 1, 3, + 6, 0, 2, 4, 0. + */ + void permute_columns(const std::vector& cycles); +}; + +// Grid_Generator_System.inlines.hh is not included here on purpose. + +/* Automatically generated from PPL source file ../src/Grid_Generator.defs.hh line 31. */ +#include + +namespace Parma_Polyhedra_Library { + +// Put these in the namespace here to declare them friend later. + +namespace IO_Operators { + +//! Output operator. +/*! \relates Parma_Polyhedra_Library::Grid_Generator */ +std::ostream& operator<<(std::ostream& s, const Grid_Generator& g); + +} // namespace IO_Operators + +} // namespace Parma_Polyhedra_Library + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Grid_Generator */ +void swap(Parma_Polyhedra_Library::Grid_Generator& x, + Parma_Polyhedra_Library::Grid_Generator& y); + +} // namespace std + +//! 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 (grid_line, parameter + or grid_point) 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 divisor 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 + x, y and z + 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 point 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 grid_point (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 g1 is a grid point having coordinates + \f$(a_0, \ldots, a_{n-1})^\transpose\f$, + we construct the parameter g2 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 coefficient with the notion of coordinate: + these are equivalent only when the divisor is 1. +*/ +class Parma_Polyhedra_Library::Grid_Generator : private Generator { +public: + //! Returns the line of direction \p e. + /*! + \exception std::invalid_argument + Thrown if the homogeneous part of \p e represents the origin of + the vector space. + */ + static Grid_Generator grid_line(const Linear_Expression& e); + + //! Returns the parameter of direction \p e and size \p e/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 parameter(const Linear_Expression& e + = Linear_Expression::zero(), + Coefficient_traits::const_reference d + = Coefficient_one()); + + //! Returns the point at \p e / \p d. + /*! + Both \p e and \p d are optional arguments, with default values + Linear_Expression::zero() and Coefficient_one(), respectively. + + \exception std::invalid_argument + Thrown if \p d is zero. + */ + static Grid_Generator grid_point(const Linear_Expression& e + = Linear_Expression::zero(), + Coefficient_traits::const_reference d + = Coefficient_one()); + + //! Ordinary copy-constructor. + Grid_Generator(const Grid_Generator& g); + + //! Destructor. + ~Grid_Generator(); + + //! Assignment operator. + Grid_Generator& operator=(const Grid_Generator& g); + + //! Assignment operator. + Grid_Generator& operator=(const Generator& g); + + //! 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; + + //! 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 true if and only if \p *this is a line. + bool is_line() const; + + //! Returns true if and only if \p *this is a parameter. + bool is_parameter() const; + + /*! \brief + Returns true if and only if \p *this is a line or + a parameter. + */ + bool is_line_or_parameter() const; + + //! Returns true if and only if \p *this is a point. + bool is_point() const; + + /*! \brief + Returns true 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 true 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 true if \p *this is exactly equal to \p y. + bool is_equal_to(const Grid_Generator& y) const; + + /*! \brief + Returns true 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 + Returns true if and only if all the homogeneous terms + of \p *this are \f$0\f$. + */ + bool all_homogeneous_terms_are_zero() const; + + PPL_OUTPUT_DECLARATIONS + + /*! \brief + Loads from \p s an ASCII representation (as produced by + ascii_dump(std::ostream&) const) and sets \p *this accordingly. + Returns true if successful, false otherwise. + */ + bool ascii_load(std::istream& s); + + //! Checks if all the invariants are satisfied. + bool OK() const; + + //! Swaps \p *this with \p y. + void swap(Grid_Generator& y); + + /*! \brief + Swaps \p *this with \p y, leaving \p *this with the original + capacity. + + All elements up to and including the last element of the smaller + of \p *this and \p y are swapped. The parameter divisor element + of \p y is swapped with the divisor element of \p *this. + */ + void coefficient_swap(Grid_Generator& y); + +private: + /*! \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; + + /*! \brief + Scales \p *this to be represented with a divisor of \p d (if + \*this is a parameter or point). + + It is assumed that \p d is a multiple of the current divisor. + + \exception std::invalid_argument + Thrown if \p d is zero. + */ + void scale_to_divisor(Coefficient_traits::const_reference d); + + /*! \brief + Constructs from polyhedron generator \p g, stealing the underlying + data structures from \p g. + + The last column in \p g becomes the parameter divisor column of + the new Grid_Generator. + */ + explicit Grid_Generator(Generator g); + + //! Returns the actual size of \p this. + dimension_type size() const; + + //! Negates the elements from index \p start to index \p end. + void negate(dimension_type start, dimension_type end); + + //! 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); + + //! Sets the Linear_Row kind to LINE_OR_EQUALITY. + void set_is_line(); + + //! Sets the Linear_Row kind to RAY_OR_POINT_OR_INEQUALITY. + void set_is_parameter_or_point(); + + //! Converts the Grid_Generator into a parameter. + void set_is_parameter(); + + /*! \brief + Strong normalization: ensures that different Grid_Generator + objects represent different hyperplanes or hyperspaces. + + Applies both Linear_Row::normalize() and Linear_Row::sign_normalize(). + + This is simply a wrapper around the Generator::strong_normalize, + which means applying it to a parameter may change the parameter. + */ + void strong_normalize(); + + //! Returns a reference to the element of the row indexed by \p k. + Coefficient& operator[](dimension_type k); + + //! Returns a constant reference to the element of the row indexed by \p k. + Coefficient_traits::const_reference operator[](dimension_type k) const; + + /*! \brief + Throw a std::invalid_argument exception containing + the appropriate error message. + */ + void + throw_invalid_argument(const char* method, const char* reason) const; + + friend std::ostream& + IO_Operators::operator<<(std::ostream& s, const Grid_Generator& g); + // FIXME: The following friend declaration is for operator[] and + // divisor() access in Grid::conversion, Grid::simplify, + // Grid::relation_with(c) and Grid::Grid(box, *). + friend class Grid; + friend class Grid_Generator_System; + friend class Grid_Generator_System::const_iterator; + friend class Congruence_System; + friend class Scalar_Products; + friend class Topology_Adjusted_Scalar_Product_Sign; + friend class Linear_Expression; +}; + + +namespace Parma_Polyhedra_Library { + +/*! \brief + Shorthand for Grid_Generator + Grid_Generator::grid_line(const Linear_Expression& e). +*/ +/*! \relates Grid_Generator */ +Grid_Generator grid_line(const Linear_Expression& e); + +/*! \brief + Shorthand for Grid_Generator + Grid_Generator::parameter(const Linear_Expression& e, + Coefficient_traits::const_reference d). +*/ +/*! \relates Grid_Generator */ +Grid_Generator +parameter(const Linear_Expression& e = Linear_Expression::zero(), + Coefficient_traits::const_reference d = Coefficient_one()); + +/*! \brief + Shorthand for Grid_Generator + Grid_Generator::grid_point(const Linear_Expression& e, + Coefficient_traits::const_reference d). +*/ +/*! \relates Grid_Generator */ +Grid_Generator +grid_point(const Linear_Expression& e = Linear_Expression::zero(), + Coefficient_traits::const_reference d = Coefficient_one()); + +//! Returns true 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 true 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 +Grid_Generator::Grid_Generator(const Grid_Generator& g) + : Generator(g) { +} + +inline +Grid_Generator::~Grid_Generator() { +} + +inline +Grid_Generator::Grid_Generator(Generator g) + : Generator(Generator::point()) { + Generator::swap(g); +} + +inline dimension_type +Grid_Generator::size() const { + return Generator::size(); +} + +inline dimension_type +Grid_Generator::max_space_dimension() { + return Generator::max_space_dimension() - 1; +} + +inline Coefficient& +Grid_Generator::operator[](dimension_type k) { + return Generator::operator[](k); +} + +inline Coefficient_traits::const_reference +Grid_Generator::operator[](dimension_type k) const { + return Generator::operator[](k); +} + +inline dimension_type +Grid_Generator::space_dimension() const { + return Generator::space_dimension() - 1; +} + +inline Grid_Generator::Type +Grid_Generator::type() const { + switch (Generator::type()) { + case Generator::POINT: + return POINT; + case Generator::RAY: + return PARAMETER; + case Generator::LINE: + return LINE; + case Generator::CLOSURE_POINT: + default: + assert(false); + return POINT; + } +} + +inline bool +Grid_Generator::is_line() const { + return Generator::is_line(); +} + +inline bool +Grid_Generator::is_parameter() const { + return is_ray(); +} + +inline bool +Grid_Generator::is_line_or_parameter() const { + return is_line_or_ray(); +} + +inline bool +Grid_Generator::is_point() const { + return Generator::is_point(); +} + +inline bool +Grid_Generator::is_parameter_or_point() const { + return is_ray_or_point_or_inequality(); +} + +inline void +Grid_Generator::set_divisor(Coefficient_traits::const_reference d) { + assert(!is_line()); + if (is_line_or_parameter()) + Generator::operator[](size() - 1) = d; + else + Generator::operator[](0) = 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 Generator::operator[](size() - 1); + else + return Generator::operator[](0); +} + +inline bool +Grid_Generator::is_equal_at_dimension(dimension_type dim, + const Grid_Generator& gg) const { + return operator[](dim) * gg.divisor() == gg[dim] * divisor(); +} + +inline void +Grid_Generator::set_is_line() { + Generator::set_is_line(); +} + +inline void +Grid_Generator::set_is_parameter_or_point() { + Generator::set_is_ray_or_point(); +} + +inline Grid_Generator& +Grid_Generator::operator=(const Grid_Generator& g) { + Generator::operator=(g); + return *this; +} + +inline Grid_Generator& +Grid_Generator::operator=(const Generator& g) { + Generator::operator=(g); + return *this; +} + +inline void +Grid_Generator::negate(dimension_type start, dimension_type end) { + while (start <= end) + neg_assign(operator[](start++)); +} + +inline Coefficient_traits::const_reference +Grid_Generator::coefficient(const Variable v) const { + if (v.space_dimension() > space_dimension()) + throw_dimension_incompatible("coefficient(v)", "v", v); + return Generator::coefficient(v); +} + +inline memory_size_type +Grid_Generator::total_memory_in_bytes() const { + return Generator::total_memory_in_bytes(); +} + +inline memory_size_type +Grid_Generator::external_memory_in_bytes() const { + return Generator::external_memory_in_bytes(); +} + +inline const Grid_Generator& +Grid_Generator::zero_dim_point() { + assert(zero_dim_point_p != 0); + return *zero_dim_point_p; +} + +inline void +Grid_Generator::strong_normalize() { + Generator::strong_normalize(); +} + +inline void +Grid_Generator::swap(Grid_Generator& y) { + Generator::swap(y); +} + +/*! \relates Grid_Generator */ +inline bool +operator==(const Grid_Generator& x, const Grid_Generator& y) { + return x.is_equivalent_to(y); +} + +/*! \relates Grid_Generator */ +inline bool +operator!=(const Grid_Generator& x, const Grid_Generator& y) { + return !(x == y); +} + +/*! \relates Grid_Generator */ +inline Grid_Generator +grid_line(const Linear_Expression& e) { + return Grid_Generator::grid_line(e); +} + +/*! \relates Grid_Generator */ +inline Grid_Generator +parameter(const Linear_Expression& e, + Coefficient_traits::const_reference d) { + return Grid_Generator::parameter(e, d); +} + +/*! \relates Grid_Generator */ +inline Grid_Generator +grid_point(const Linear_Expression& e, + Coefficient_traits::const_reference d) { + return Grid_Generator::grid_point(e, d); +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Grid_Generator */ +inline void +swap(Parma_Polyhedra_Library::Grid_Generator& x, + Parma_Polyhedra_Library::Grid_Generator& y) { + x.swap(y); +} + +} // namespace std + +/* Automatically generated from PPL source file ../src/Grid_Generator.defs.hh line 534. */ + +/* Automatically generated from PPL source file ../src/Scalar_Products.inlines.hh line 32. */ + +namespace Parma_Polyhedra_Library { + +inline int +Scalar_Products::sign(const Linear_Row& x, const Linear_Row& y) { + PPL_DIRTY_TEMP_COEFFICIENT(z); + assign(z, x, y); + return sgn(z); +} + +inline int +Scalar_Products::reduced_sign(const Linear_Row& x, const Linear_Row& y) { + PPL_DIRTY_TEMP_COEFFICIENT(z); + reduced_assign(z, x, y); + return sgn(z); +} + +inline int +Scalar_Products::homogeneous_sign(const Linear_Row& x, const Linear_Row& 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(static_cast(c), + static_cast(g)); +} + +inline int +Scalar_Products::sign(const Generator& g, const Constraint& c) { + return sign(static_cast(g), + static_cast(c)); +} + +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) { + return reduced_sign(static_cast(c), + static_cast(g)); +} + +inline int +Scalar_Products::reduced_sign(const Generator& g, const Constraint& c) { + return reduced_sign(static_cast(g), + static_cast(c)); +} + +inline void +Scalar_Products::homogeneous_assign(Coefficient& z, + const Linear_Expression& e, + const Generator& g) { + homogeneous_assign(z, + static_cast(e), + static_cast(g)); +} + +inline void +Scalar_Products::homogeneous_assign(Coefficient& z, + const Linear_Expression& e, + const Grid_Generator& g) { + homogeneous_assign(z, + static_cast(e), + static_cast(g)); +} + +inline int +Scalar_Products::homogeneous_sign(const Linear_Expression& e, + const Generator& g) { + return homogeneous_sign(static_cast(e), + static_cast(g)); +} + +inline int +Scalar_Products::homogeneous_sign(const Linear_Expression& e, + const Grid_Generator& g) { + return homogeneous_sign(static_cast(e), + static_cast(g)); +} + +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(&Scalar_Products::sign) + : static_cast(&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(&Scalar_Products::sign) + : static_cast(&Scalar_Products::reduced_sign)) { +} + +inline int +Topology_Adjusted_Scalar_Product_Sign::operator()(const Constraint& c, + const Generator& g) const { + assert(c.space_dimension() <= g.space_dimension()); + assert(sps_fp == (c.is_necessarily_closed() + ? static_cast(&Scalar_Products::sign) + : static_cast(&Scalar_Products::reduced_sign))); + return sps_fp(static_cast(c), + static_cast(g)); +} + +inline int +Topology_Adjusted_Scalar_Product_Sign::operator()(const Generator& g, + const Constraint& c) const { + assert(g.space_dimension() <= c.space_dimension()); + assert(sps_fp == (g.is_necessarily_closed() + ? static_cast(&Scalar_Products::sign) + : static_cast(&Scalar_Products::reduced_sign))); + return sps_fp(static_cast(g), + static_cast(c)); +} + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Scalar_Products.defs.hh line 196. */ + +/* 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.types.hh line 1. */ + + +namespace Parma_Polyhedra_Library { + +class BHRZ03_Certificate; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/BHRZ03_Certificate.defs.hh line 29. */ +#include +#include + +//! 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 true 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 true 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 num_rays_null_coord; +}; + +/* Automatically generated from PPL source file ../src/BHRZ03_Certificate.inlines.hh line 1. */ +/* BHRZ03_Certificate class implementation: inline functions. +*/ + + +namespace Parma_Polyhedra_Library { + +inline +BHRZ03_Certificate::BHRZ03_Certificate() + : affine_dim(0), lin_space_dim(0), num_constraints(0), num_points(1), + num_rays_null_coord() { + // This is the certificate for a zero-dim universe polyhedron. + assert(OK()); +} + +inline +BHRZ03_Certificate::BHRZ03_Certificate(const BHRZ03_Certificate& y) + : affine_dim(y.affine_dim), lin_space_dim(y.lin_space_dim), + num_constraints(y.num_constraints), num_points(y.num_points), + num_rays_null_coord(y.num_rays_null_coord) { +} + +inline +BHRZ03_Certificate::~BHRZ03_Certificate() { +} + +inline bool +BHRZ03_Certificate::is_stabilizing(const Polyhedron& ph) const { + return compare(ph) == 1; +} + +inline bool +BHRZ03_Certificate::Compare::operator()(const BHRZ03_Certificate& x, + const BHRZ03_Certificate& y) const { + // For an efficient evaluation of the multiset ordering based + // on this lgo relation, we want larger elements to come first. + return x.compare(y) == 1; +} + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/BHRZ03_Certificate.defs.hh line 116. */ + +/* Automatically generated from PPL source file ../src/H79_Certificate.defs.hh line 1. */ +/* H79_Certificate class declaration. +*/ + + +/* Automatically generated from PPL source file ../src/H79_Certificate.types.hh line 1. */ + + +namespace Parma_Polyhedra_Library { + +class H79_Certificate; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/H79_Certificate.defs.hh line 29. */ +#include +#include + +//! 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 + 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 + 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 true if and only if \p x comes before \p y. + bool operator()(const H79_Certificate& x, + const H79_Certificate& y) const; + }; + +private: + //! Affine dimension of the polyhedron. + dimension_type affine_dim; + //! Cardinality of a non-redundant constraint system for the polyhedron. + dimension_type num_constraints; +}; + +/* Automatically generated from PPL source file ../src/H79_Certificate.inlines.hh line 1. */ +/* H79_Certificate class implementation: inline functions. +*/ + + +/* Automatically generated from PPL source file ../src/Polyhedron.defs.hh line 1. */ +/* Polyhedron class declaration. +*/ + + +/* Automatically generated from PPL source file ../src/Constraint_System.inlines.hh line 1. */ +/* Constraint_System class implementation: inline functions. +*/ + + +/* Automatically generated from PPL source file ../src/Constraint_System.inlines.hh line 27. */ + +namespace Parma_Polyhedra_Library { + +inline +Constraint_System::Constraint_System() + : Linear_System(NECESSARILY_CLOSED) { +} + +inline +Constraint_System::Constraint_System(const Constraint& c) + : Linear_System(c.topology()) { + Linear_System::insert(c); +} + +inline +Constraint_System::Constraint_System(const Constraint_System& cs) + : Linear_System(cs) { +} + +inline +Constraint_System::Constraint_System(const Topology topol) + : Linear_System(topol) { +} + +inline +Constraint_System::Constraint_System(const Topology topol, + const dimension_type n_rows, + const dimension_type n_columns) + : Linear_System(topol, n_rows, n_columns) { +} + +inline +Constraint_System::~Constraint_System() { +} + +inline Constraint_System& +Constraint_System::operator=(const Constraint_System& y) { + Linear_System::operator=(y); + return *this; +} + +inline Constraint& +Constraint_System::operator[](const dimension_type k) { + return static_cast(Linear_System::operator[](k)); +} + +inline const Constraint& +Constraint_System::operator[](const dimension_type k) const { + return static_cast(Linear_System::operator[](k)); +} + +inline dimension_type +Constraint_System::max_space_dimension() { + return Linear_System::max_space_dimension(); +} + +inline dimension_type +Constraint_System::space_dimension() const { + return Linear_System::space_dimension(); +} + +inline void +Constraint_System::clear() { + Linear_System::clear(); +} + +inline const Constraint_System& +Constraint_System::zero_dim_empty() { + assert(zero_dim_empty_p != 0); + return *zero_dim_empty_p; +} + +inline +Constraint_System::const_iterator::const_iterator() + : i(), csp(0) { +} + +inline +Constraint_System::const_iterator::const_iterator(const const_iterator& y) + : i(y.i), csp(y.csp) { +} + +inline +Constraint_System::const_iterator::~const_iterator() { +} + +inline Constraint_System::const_iterator& +Constraint_System::const_iterator::operator=(const const_iterator& y) { + i = y.i; + csp = y.csp; + return *this; +} + +inline const Constraint& +Constraint_System::const_iterator::operator*() const { + return static_cast(*i); +} + +inline const Constraint* +Constraint_System::const_iterator::operator->() const { + return static_cast(i.operator->()); +} + +inline Constraint_System::const_iterator& +Constraint_System::const_iterator::operator++() { + ++i; + skip_forward(); + return *this; +} + +inline Constraint_System::const_iterator +Constraint_System::const_iterator::operator++(int) { + const const_iterator tmp = *this; + operator++(); + return tmp; +} + +inline bool +Constraint_System::const_iterator::operator==(const const_iterator& y) const { + return i == y.i; +} + +inline bool +Constraint_System::const_iterator::operator!=(const const_iterator& y) const { + return i != y.i; +} + +inline +Constraint_System::const_iterator:: +const_iterator(const Linear_System::const_iterator& iter, + const Constraint_System& csys) + : i(iter), csp(&csys) { +} + +inline Constraint_System::const_iterator +Constraint_System::begin() const { + const_iterator i(Linear_System::begin(), *this); + i.skip_forward(); + return i; +} + +inline Constraint_System::const_iterator +Constraint_System::end() const { + const const_iterator i(Linear_System::end(), *this); + return i; +} + +inline bool +Constraint_System::empty() const { + return begin() == end(); +} + +inline void +Constraint_System::add_low_level_constraints() { + if (is_necessarily_closed()) + // The positivity constraint. + insert(Constraint::zero_dim_positivity()); + else { + // Add the epsilon constraints. + insert(Constraint::epsilon_leq_one()); + insert(Constraint::epsilon_geq_zero()); + } +} + +inline void +Constraint_System::swap(Constraint_System& y) { + Linear_System::swap(y); +} + +inline memory_size_type +Constraint_System::external_memory_in_bytes() const { + return Linear_System::external_memory_in_bytes(); +} + +inline memory_size_type +Constraint_System::total_memory_in_bytes() const { + return Linear_System::total_memory_in_bytes(); +} + +inline void +Constraint_System::simplify() { + Linear_System::simplify(); +} + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Constraint_System */ +inline void +swap(Parma_Polyhedra_Library::Constraint_System& x, + Parma_Polyhedra_Library::Constraint_System& y) { + x.swap(y); +} + +} // namespace std + +/* Automatically generated from PPL source file ../src/Generator_System.inlines.hh line 1. */ +/* Generator_System class implementation: inline functions. +*/ + + +/* Automatically generated from PPL source file ../src/Generator_System.inlines.hh line 27. */ + +namespace Parma_Polyhedra_Library { + +inline +Generator_System::Generator_System() + : Linear_System(NECESSARILY_CLOSED) { +} + +inline +Generator_System::Generator_System(const Generator& g) + : Linear_System(g.topology()) { + Linear_System::insert(g); +} + +inline +Generator_System::Generator_System(const Generator_System& gs) + : Linear_System(gs) { +} + +inline +Generator_System::Generator_System(const Topology topol) + : Linear_System(topol) { +} + +inline +Generator_System::Generator_System(const Topology topol, + const dimension_type n_rows, + const dimension_type n_columns) + : Linear_System(topol, n_rows, n_columns) { +} + +inline +Generator_System::~Generator_System() { +} + +inline Generator_System& +Generator_System::operator=(const Generator_System& y) { + Linear_System::operator=(y); + return *this; +} + +inline dimension_type +Generator_System::max_space_dimension() { + return Linear_System::max_space_dimension(); +} + +inline dimension_type +Generator_System::space_dimension() const { + return Linear_System::space_dimension(); +} + +inline void +Generator_System::clear() { + Linear_System::clear(); +} + +inline Generator& +Generator_System::operator[](const dimension_type k) { + return static_cast(Linear_System::operator[](k)); +} + +inline const Generator& +Generator_System::operator[](const dimension_type k) const { + return static_cast(Linear_System::operator[](k)); +} + +inline +Generator_System::const_iterator::const_iterator() + : i(), gsp(0) { +} + +inline +Generator_System::const_iterator::const_iterator(const const_iterator& y) + : i(y.i), gsp(y.gsp) { +} + +inline +Generator_System::const_iterator::~const_iterator() { +} + +inline +Generator_System::const_iterator& +Generator_System::const_iterator::operator=(const const_iterator& y) { + i = y.i; + gsp = y.gsp; + return *this; +} + +inline const Generator& +Generator_System::const_iterator::operator*() const { + return static_cast(*i); +} + +inline const Generator* +Generator_System::const_iterator::operator->() const { + return static_cast(i.operator->()); +} + +inline Generator_System::const_iterator& +Generator_System::const_iterator::operator++() { + ++i; + if (!gsp->is_necessarily_closed()) + skip_forward(); + return *this; +} + +inline Generator_System::const_iterator +Generator_System::const_iterator::operator++(int) { + const const_iterator tmp = *this; + operator++(); + return tmp; +} + +inline bool +Generator_System::const_iterator::operator==(const const_iterator& y) const { + return i == y.i; +} + +inline bool +Generator_System::const_iterator::operator!=(const const_iterator& y) const { + return i != y.i; +} + +inline +Generator_System::const_iterator:: +const_iterator(const Linear_System::const_iterator& iter, + const Generator_System& gsys) + : i(iter), gsp(&gsys) { +} + +inline bool +Generator_System::empty() const { + return Linear_System::has_no_rows(); +} + +inline Generator_System::const_iterator +Generator_System::begin() const { + const_iterator i(Linear_System::begin(), *this); + if (!is_necessarily_closed()) + i.skip_forward(); + return i; +} + +inline Generator_System::const_iterator +Generator_System::end() const { + const const_iterator i(Linear_System::end(), *this); + return i; +} + +inline const Generator_System& +Generator_System::zero_dim_univ() { + assert(zero_dim_univ_p != 0); + return *zero_dim_univ_p; +} + +inline void +Generator_System::swap(Generator_System& y) { + Linear_System::swap(y); +} + +inline memory_size_type +Generator_System::external_memory_in_bytes() const { + return Linear_System::external_memory_in_bytes(); +} + +inline memory_size_type +Generator_System::total_memory_in_bytes() const { + return Linear_System::total_memory_in_bytes(); +} + +inline void +Generator_System::simplify() { + Linear_System::simplify(); + remove_invalid_lines_and_rays(); +} + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Constraint_System */ +inline void +swap(Parma_Polyhedra_Library::Generator_System& x, + Parma_Polyhedra_Library::Generator_System& y) { + x.swap(y); +} + +} // namespace std + +/* Automatically generated from PPL source file ../src/Congruence_System.inlines.hh line 1. */ +/* Congruence_System class implementation: inline functions. +*/ + + +/* Automatically generated from PPL source file ../src/Congruence_System.inlines.hh line 27. */ + +namespace Parma_Polyhedra_Library { + +inline Congruence& +Congruence_System::operator[](const dimension_type k) { + return static_cast(Matrix::operator[](k)); +} + +inline const Congruence& +Congruence_System::operator[](const dimension_type k) const { + return static_cast(Matrix::operator[](k)); +} + +inline void +Congruence_System::insert(const Congruence& cg) { + insert_verbatim(cg); + static_cast(operator[](rows.size()-1)).strong_normalize(); + assert(OK()); +} + +inline +Congruence_System::Congruence_System() + : Matrix(0, 2) { +} + +inline +Congruence_System::Congruence_System(const Congruence& cg) + : Matrix(0, 2) { + insert(cg); +} + +inline +Congruence_System::Congruence_System(const Constraint& c) + : Matrix(0, 2) { + insert(c); +} + +inline +Congruence_System::Congruence_System(const Congruence_System& cs) + : Matrix(cs) { +} + +inline +Congruence_System::Congruence_System(const dimension_type d) + : Matrix(0, d + 2) { +} + +inline +Congruence_System::~Congruence_System() { +} + +inline Congruence_System& +Congruence_System::operator=(const Congruence_System& y) { + Matrix::operator=(y); + return *this; +} + +inline dimension_type +Congruence_System::max_space_dimension() { + return Matrix::max_num_columns() - 2; +} + +inline dimension_type +Congruence_System::space_dimension() const { + return Matrix::num_columns() - 2; +} + +inline void +Congruence_System::clear() { + Matrix::clear(); + add_zero_columns(2); // Modulus and constant term. +} + +inline void +Congruence_System::resize_no_copy(const dimension_type new_num_rows, + const dimension_type new_num_columns) { + Matrix::resize_no_copy(new_num_rows, new_num_columns, Row::Flags()); +} + +inline const Congruence_System& +Congruence_System::zero_dim_empty() { + 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 static_cast(*i); +} + +inline const Congruence* +Congruence_System::const_iterator::operator->() const { + return static_cast(i.operator->()); +} + +inline Congruence_System::const_iterator& +Congruence_System::const_iterator::operator++() { + ++i; + skip_forward(); + return *this; +} + +inline Congruence_System::const_iterator +Congruence_System::const_iterator::operator++(int) { + const const_iterator tmp = *this; + operator++(); + return tmp; +} + +inline bool +Congruence_System::const_iterator::operator==(const const_iterator& y) const { + return i == y.i; +} + +inline bool +Congruence_System::const_iterator::operator!=(const const_iterator& y) const { + return i != y.i; +} + +inline +Congruence_System::const_iterator:: +const_iterator(const Matrix::const_iterator& iter, + const Congruence_System& csys) + : i(iter), csp(&csys) { +} + +inline Congruence_System::const_iterator +Congruence_System::begin() const { + const_iterator i(Matrix::begin(), *this); + i.skip_forward(); + return i; +} + +inline Congruence_System::const_iterator +Congruence_System::end() const { + const const_iterator i(Matrix::end(), *this); + return i; +} + +inline bool +Congruence_System::empty() const { + return begin() == end(); +} + +inline void +Congruence_System::swap(Congruence_System& y) { + Matrix::swap(y); +} + +inline memory_size_type +Congruence_System::external_memory_in_bytes() const { + return Matrix::external_memory_in_bytes(); +} + +inline memory_size_type +Congruence_System::total_memory_in_bytes() const { + return Matrix::total_memory_in_bytes(); +} + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Congruence_System */ +inline void +swap(Parma_Polyhedra_Library::Congruence_System& x, + Parma_Polyhedra_Library::Congruence_System& y) { + x.swap(y); +} + +} // namespace std + +/* Automatically generated from PPL source file ../src/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) { + Generator_System::set_sorted(b); +} + +inline void +Grid_Generator_System::unset_pending_rows() { + Generator_System::unset_pending_rows(); +} + +inline void +Grid_Generator_System::set_index_first_pending_row(const dimension_type i) { + Generator_System::set_index_first_pending_row(i); +} + +inline void +Grid_Generator_System::resize_no_copy(const dimension_type new_num_rows, + const dimension_type new_num_columns) { + Generator_System::resize_no_copy(new_num_rows, new_num_columns); +} + +inline dimension_type +Grid_Generator_System::num_columns() const { + return Generator_System::num_columns(); +} + +inline void +Grid_Generator_System::erase_to_end(dimension_type first_to_erase) { + return Generator_System::erase_to_end(first_to_erase); +} + +inline void +Grid_Generator_System +::permute_columns(const std::vector& cycles) { + return Generator_System::permute_columns(cycles); +} + +inline bool +Grid_Generator_System::is_equal_to(const Grid_Generator_System& y) const { + return operator==(static_cast(*this), + static_cast(y)); +} + +inline +Grid_Generator_System::Grid_Generator_System() + : Generator_System(NECESSARILY_CLOSED) { + adjust_topology_and_space_dimension(NECESSARILY_CLOSED, 1); + set_sorted(false); +} + +inline +Grid_Generator_System::Grid_Generator_System(const Grid_Generator_System& gs) + : Generator_System(gs) { +} + +inline +Grid_Generator_System::Grid_Generator_System(dimension_type dim) + : Generator_System(NECESSARILY_CLOSED) { + adjust_topology_and_space_dimension(NECESSARILY_CLOSED, dim + 1); + set_sorted(false); +} + +inline +Grid_Generator_System::Grid_Generator_System(const Grid_Generator& g) + : Generator_System(g) { + set_sorted(false); +} + +inline +Grid_Generator_System::~Grid_Generator_System() { +} + +inline Grid_Generator_System& +Grid_Generator_System::operator=(const Grid_Generator_System& y) { + Generator_System::operator=(y); + return *this; +} + +inline dimension_type +Grid_Generator_System::max_space_dimension() { + // Grid generators use an extra column for the parameter divisor. + return Generator_System::max_space_dimension() - 1; +} + +inline dimension_type +Grid_Generator_System::space_dimension() const { + assert(Generator_System::space_dimension() > 0); + // Grid generators use an extra column for the parameter divisor. + return Generator_System::space_dimension() - 1; +} + +inline const Grid_Generator_System& +Grid_Generator_System::zero_dim_univ() { + assert(zero_dim_univ_p != 0); + return *zero_dim_univ_p; +} + +inline void +Grid_Generator_System::clear() { + Generator_System::clear(); + // For grid generators, two extra columns are needed. + add_zero_columns(2); + set_sorted(false); + unset_pending_rows(); +} + +inline void +Grid_Generator_System::swap(Grid_Generator_System& y) { + Generator_System::swap(y); +} + +inline memory_size_type +Grid_Generator_System::external_memory_in_bytes() const { + return Generator_System::external_memory_in_bytes(); +} + +inline memory_size_type +Grid_Generator_System::total_memory_in_bytes() const { + return Generator_System::total_memory_in_bytes(); +} + +inline dimension_type +Grid_Generator_System::num_rows() const { + return Generator_System::num_rows(); +} + +inline dimension_type +Grid_Generator_System::num_parameters() const { + return Generator_System::num_rays(); +} + +inline dimension_type +Grid_Generator_System::num_lines() const { + return Generator_System::num_lines(); +} + +inline +Grid_Generator_System::const_iterator::const_iterator() + : Generator_System::const_iterator() { +} + +inline +Grid_Generator_System::const_iterator::const_iterator(const const_iterator& y) + : Generator_System::const_iterator(y) { +} + +inline +Grid_Generator_System::const_iterator::~const_iterator() { +} + +inline +Grid_Generator_System::const_iterator& +Grid_Generator_System::const_iterator::operator=(const const_iterator& y) { + return static_cast + (Generator_System::const_iterator::operator=(y)); +} + +inline const Grid_Generator& +Grid_Generator_System::const_iterator::operator*() const { + return static_cast + (Generator_System::const_iterator::operator*()); +} + +inline const Grid_Generator* +Grid_Generator_System::const_iterator::operator->() const { + return static_cast + (Generator_System::const_iterator::operator->()); +} + +inline Grid_Generator_System::const_iterator& +Grid_Generator_System::const_iterator::operator++() { + return static_cast + (Generator_System::const_iterator::operator++()); +} + +inline Grid_Generator_System::const_iterator +Grid_Generator_System::const_iterator::operator++(int) { + const const_iterator tmp = *this; + operator++(); + return tmp; +} + +inline bool +Grid_Generator_System +::const_iterator::operator==(const const_iterator& y) const { + return Generator_System::const_iterator::operator==(y); +} + +inline bool +Grid_Generator_System +::const_iterator::operator!=(const const_iterator& y) const { + return Generator_System::const_iterator::operator!=(y); +} + +inline bool +Grid_Generator_System::empty() const { + return Generator_System::empty(); +} + +inline +Grid_Generator_System +::const_iterator::const_iterator(const Generator_System::const_iterator& y) + : Generator_System::const_iterator::const_iterator(y) { +} + +inline Grid_Generator_System::const_iterator +Grid_Generator_System::begin() const { + return static_cast + (Generator_System::begin()); +} + +inline Grid_Generator_System::const_iterator +Grid_Generator_System::end() const { + return static_cast + (Generator_System::end()); +} + +inline bool +Grid_Generator_System::has_points() const { + return Generator_System::has_points(); +} + +inline Grid_Generator& +Grid_Generator_System::operator[](const dimension_type k) { + return static_cast(Generator_System::operator[](k)); +} + +inline const Grid_Generator& +Grid_Generator_System::operator[](const dimension_type k) const { + return static_cast(Generator_System::operator[](k)); +} + +/*! \relates Grid_Generator_System */ +inline bool +operator==(const Grid_Generator_System& x, + const Grid_Generator_System& y) { + return x.is_equal_to(y); +} + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Constraint_System */ +inline void +swap(Parma_Polyhedra_Library::Grid_Generator_System& x, + Parma_Polyhedra_Library::Grid_Generator_System& y) { + x.swap(y); +} + +} // namespace std + +/* Automatically generated from PPL source file ../src/Bit_Matrix.defs.hh line 1. */ +/* Bit_Matrix class declaration. +*/ + + +/* Automatically generated from PPL source file ../src/Bit_Matrix.defs.hh line 29. */ +#include +#include + +#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 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 + true 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. + void add_row(const Bit_Row& row); + + //! Erases the rows from the \p first_to_erase -th to the last one. + void rows_erase_to_end(dimension_type first_to_erase); + + //! Erases the columns from the \p first_to_erase -th to the last one. + void columns_erase_to_end(dimension_type first_to_erase); + + //! Resizes the matrix copying the old contents. + void resize(dimension_type new_n_rows, dimension_type new_n_columns); + + //! Checks if all the invariants are satisfied. + bool OK() const; + + PPL_OUTPUT_DECLARATIONS + + /*! \brief + Loads from \p s an ASCII representation (as produced by + ascii_dump(std::ostream&) const) and sets \p *this accordingly. + Returns true if successful, false 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 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; + }; + + friend + void Parma_Polyhedra_Library:: + Linear_System::sort_and_remove_with_sat(Bit_Matrix& sat); + +}; + +namespace Parma_Polyhedra_Library { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns true 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 true 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 + +namespace std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Bit_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +void swap(Parma_Polyhedra_Library::Bit_Matrix& x, + Parma_Polyhedra_Library::Bit_Matrix& y); + +} // namespace std + +/* Automatically generated from PPL source file ../src/Bit_Matrix.inlines.hh line 1. */ +/* Bit_Matrix class implementation: inline functions. +*/ + + +#include +#include + +namespace Parma_Polyhedra_Library { + +inline +Bit_Matrix::Bit_Matrix() + : rows(), + row_size(0) { +} + +inline dimension_type +Bit_Matrix::max_num_rows() { + return std::vector().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::rows_erase_to_end(const dimension_type first_to_erase) { + // The first row to be erased cannot be greater + // than the actual number of the rows of the matrix. + assert(first_to_erase <= rows.size()); + if (first_to_erase < rows.size()) + rows.erase(rows.begin() + first_to_erase, rows.end()); + assert(OK()); +} + +inline void +Bit_Matrix::columns_erase_to_end(const dimension_type first_to_erase) { + // The first column to be erased cannot be greater + // than the actual number of the columns of the matrix. + assert(first_to_erase <= row_size); + row_size = first_to_erase; + assert(OK()); +} + +inline void +Bit_Matrix::swap(Bit_Matrix& y) { + std::swap(row_size, y.row_size); + std::swap(rows, y.rows); +} + +inline Bit_Row& +Bit_Matrix::operator[](const dimension_type k) { + assert(k < rows.size()); + return rows[k]; +} + +inline const Bit_Row& +Bit_Matrix::operator[](const dimension_type k) const { + 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().swap(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 { + 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); +} + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Bit_Matrix */ +inline void +swap(Parma_Polyhedra_Library::Bit_Matrix& x, + Parma_Polyhedra_Library::Bit_Matrix& y) { + x.swap(y); +} + +} // namespace std + +/* Automatically generated from PPL source file ../src/Bit_Matrix.defs.hh line 178. */ + +/* 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.types.hh line 1. */ + + +namespace Parma_Polyhedra_Library { + +class Poly_Gen_Relation; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Poly_Gen_Relation.defs.hh line 28. */ +#include + +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 137. */ + +/* Automatically generated from PPL source file ../src/Box.types.hh line 1. */ + + +namespace Parma_Polyhedra_Library { + +template +class Box; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/BD_Shape.types.hh line 1. */ + + +namespace Parma_Polyhedra_Library { + +template +class BD_Shape; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Octagonal_Shape.types.hh line 1. */ + + +namespace Parma_Polyhedra_Library { + +template +class Octagonal_Shape; + +} + +/* Automatically generated from PPL source file ../src/Polyhedron.defs.hh line 50. */ +#include +#include + +namespace Parma_Polyhedra_Library { + +namespace IO_Operators { + +//! Output operator. +/*! + \relates Parma_Polyhedra_Library::Polyhedron + Writes a textual representation of \p ph on \p s: + false is written if \p ph is an empty polyhedron; + true is written if \p ph is a universe polyhedron; + a minimized system of constraints defining \p ph is written otherwise, + all constraints in one row separated by ", ". +*/ +std::ostream& +operator<<(std::ostream& s, const Polyhedron& ph); + +} // namespace IO_Operators + +/*! \brief + Returns true 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 false is returned. +*/ +bool operator==(const Polyhedron& x, const Polyhedron& y); + +/*! \brief + Returns true 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 true 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 + ph.topology() == NECESSARILY_CLOSED. +*/ +#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: + - explicit 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 + x and 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 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 + add_space_dimensions_and_embed: + \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 + add_space_dimensions_and_project: + \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 + add_space_dimensions_and_embed. + 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 + affine_image: + \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 + affine_preimage: + \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 + remove_space_dimensions: + \code + Generator_System gs; + gs.insert(point(3*x + y +0*z + 2*w)); + C_Polyhedron ph(gs); + Variables_Set to_be_removed; + to_be_removed.insert(y); + to_be_removed.insert(z); + ph.remove_space_dimensions(to_be_removed); + \endcode + The starting polyhedron is the singleton set + \f$\bigl\{ (3, 1, 0, 2)^\transpose \bigr\} \sseq \Rset^4\f$, while + the resulting polyhedron is + \f$\bigl\{ (3, 2)^\transpose \bigr\} \sseq \Rset^2\f$. + Be careful when removing space dimensions incrementally: + since dimensions are automatically renamed after each application + of the remove_space_dimensions operator, unexpected + results can be obtained. + For instance, by using the following code we would obtain + a different result: + \code + set to_be_removed1; + to_be_removed1.insert(y); + ph.remove_space_dimensions(to_be_removed1); + set to_be_removed2; + to_be_removed2.insert(z); + ph.remove_space_dimensions(to_be_removed2); + \endcode + In this case, the result is the polyhedron + \f$\bigl\{(3, 0)^\transpose \bigr\} \sseq \Rset^2\f$: + when removing the set of dimensions \p to_be_removed2 + we are actually removing variable \f$w\f$ of the original polyhedron. + For the same reason, the operator \p remove_space_dimensions + is not idempotent: removing twice the same non-empty set of dimensions + is never the same as removing them just once. +*/ + +class Parma_Polyhedra_Library::Polyhedron { +public: + //! 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 const 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 const 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 + Polyhedron(Topology topol, const Box& 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; + + //! Returns a universe system of grid generators. + Grid_Generator_System grid_generators() const; + + //! Returns a universe system of grid generators. + Grid_Generator_System minimized_grid_generators() const; + + /*! \brief + Returns the relations holding between the polyhedron \p *this + and the constraint \p c. + + \exception std::invalid_argument + Thrown if \p *this and constraint \p c are dimension-incompatible. + */ + Poly_Con_Relation relation_with(const Constraint& c) const; + + /*! \brief + Returns the relations holding between the polyhedron \p *this + and the generator \p g. + + \exception std::invalid_argument + Thrown if \p *this and generator \p g are dimension-incompatible. + */ + Poly_Gen_Relation relation_with(const Generator& g) const; + + /*! \brief + Returns 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 true if and only if \p *this is + an empty polyhedron. + */ + bool is_empty() const; + + /*! \brief + Returns true if and only if \p *this + is a universe polyhedron. + */ + bool is_universe() const; + + /*! \brief + Returns true if and only if \p *this + is a topologically closed subset of the vector space. + */ + bool is_topologically_closed() const; + + //! Returns true 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 true if and only if \p *this is discrete. + bool is_discrete() const; + + /*! \brief + Returns true if and only if \p *this + is a bounded polyhedron. + */ + bool is_bounded() const; + + /*! \brief + Returns true if and only if \p *this + contains at least one integer point. + */ + bool contains_integer_point() const; + + /*! \brief + Returns true 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 true 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 true 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 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 + true 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, + false 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 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 + 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 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, + false 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 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 + true 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, + false 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 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 + 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 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, + false 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; + + //! Returns true 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 true 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 + true if and only if \p *this satisfies all the + invariants and either \p check_not_empty is false or + \p *this is not empty. + + \param check_not_empty + true 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 std::cerr 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 constraint \p c to the system of constraints + of \p *this, minimizing the result + + \param c + The constraint that will be added to the system of + constraints of \p *this. + + \return + false if and only if the result is empty. + + \exception std::invalid_argument + Thrown if \p *this and constraint \p c are topology-incompatible + or dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_constraint_and_minimize(const Constraint& c); + + /*! \brief + Adds a copy of generator \p g to the system of generators + of \p *this (without minimizing the result). + + \exception std::invalid_argument + Thrown if \p *this and generator \p g are topology-incompatible or + dimension-incompatible, or if \p *this is an empty polyhedron and + \p g is not a point. + */ + void add_generator(const Generator& g); + + /*! \brief + Adds a copy of generator \p g to the system of generators + of \p *this, minimizing the result. + + \return + false if and only if the result is empty. + + \exception std::invalid_argument + Thrown if \p *this and generator \p g are topology-incompatible or + dimension-incompatible, or if \p *this is an empty polyhedron and + \p g is not a point. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_generator_and_minimize(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 congruence \p cg to \p *this, + if \p cg can be exactly represented by a polyhedron, + minimizing the result. + + \return + false if and only if the result is empty. + + \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. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_congruence_and_minimize(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 constraints in \p cs to the system + of constraints of \p *this, minimizing the result. + + \return + false if and only if the result is empty. + + \param cs + Contains the constraints that will be added to the system of + constraints of \p *this. + + \exception std::invalid_argument + Thrown if \p *this and \p cs are topology-incompatible or + dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_constraints_and_minimize(const Constraint_System& cs); + + /*! \brief + Adds the constraints in \p cs to the system of constraints + of \p *this, minimizing the result. + + \return + false if and only if the result is empty. + + \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. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_recycled_constraints_and_minimize(Constraint_System& cs); + + /*! \brief + Adds a copy of the generators in \p gs to the system + of generators of \p *this (without minimizing the result). + + \param gs + Contains the generators that will be added to the system of + generators of \p *this. + + \exception std::invalid_argument + Thrown if \p *this and \p gs are topology-incompatible or + dimension-incompatible, or if \p *this is empty and the system of + generators \p gs is not empty, but has no points. + */ + void add_generators(const Generator_System& gs); + + /*! \brief + Adds the generators in \p gs to the system of generators + of \p *this (without minimizing the result). + + \param gs + The generator system 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 generators in \p gs to the system + of generators of \p *this, minimizing the result. + + \return + false if and only if the result is empty. + + \param gs + Contains the generators that will be added to the system of + generators of \p *this. + + \exception std::invalid_argument + Thrown if \p *this and \p gs are topology-incompatible or + dimension-incompatible, or if \p *this is empty and the the system + of generators \p gs is not empty, but has no points. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_generators_and_minimize(const Generator_System& gs); + + /*! \brief + Adds the generators in \p gs to the system of generators + of \p *this, minimizing the result. + + \return + false if and only if the result is empty. + + \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 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. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_recycled_generators_and_minimize(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 a copy of the congruences in \p cgs to \p *this, + if all the congruences can be exactly represented by a polyhedron, + minimizing the result. + + \return + false if and only if the result is empty. + + \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 + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_congruences_and_minimize(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 + Adds the congruences in \p cgs to \p *this, + if all the congruences can be exactly represented by a polyhedron, + minimizing the result. + + \return + false if and only if the result is empty. + + \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. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_recycled_congruences_and_minimize(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 + 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 to_be_unconstrained, + assigning the result to \p *this. + + \param to_be_unconstrained + 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 to_be_removed. + */ + void unconstrain(const Variables_Set& to_be_unconstrained); + + /*! \brief + Assigns to \p *this the intersection of \p *this and \p y. + The result is not guaranteed to be minimized. + + \exception std::invalid_argument + Thrown if \p *this and \p y are topology-incompatible or + dimension-incompatible. + */ + void intersection_assign(const Polyhedron& y); + + /*! \brief + Assigns to \p *this the intersection of \p *this and \p y, + minimizing the result. + + \return + false if and only if the result is empty. + + \exception std::invalid_argument + Thrown if \p *this and \p y are topology-incompatible or + dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool intersection_assign_and_minimize(const Polyhedron& y); + + /*! \brief + Assigns to \p *this the poly-hull of \p *this and \p y. + The result is not guaranteed to be minimized. + + \exception std::invalid_argument + Thrown if \p *this and \p y are topology-incompatible or + dimension-incompatible. + */ + void poly_hull_assign(const Polyhedron& y); + + /*! \brief + Assigns to \p *this the poly-hull of \p *this and \p y, + minimizing the result. + + \return + false if and only if the result is empty. + + \exception std::invalid_argument + Thrown if \p *this and \p y are topology-incompatible or + dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool poly_hull_assign_and_minimize(const Polyhedron& y); + + //! Same as poly_hull_assign(y). + void upper_bound_assign(const Polyhedron& y); + + /*! \brief + Assigns to \p *this + the \ref Convex_Polyhedral_Difference "poly-difference" + of \p *this and \p y. The result is not guaranteed to be minimized. + + \exception std::invalid_argument + Thrown if \p *this and \p y are topology-incompatible or + dimension-incompatible. + */ + void poly_difference_assign(const Polyhedron& y); + + //! Same as poly_difference_assign(y). + void difference_assign(const Polyhedron& y); + + /*! \brief + Assigns to \p *this 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()); + + /*! \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); + + //! 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 must 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 must 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 must 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 must 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 must 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 must 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 max_space_dimension(). + + 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 max_space_dimension(). + + 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 max_space_dimension(). + */ + void concatenate_assign(const Polyhedron& y); + + //! Removes all the specified dimensions from the vector space. + /*! + \param to_be_removed + The set of Variable objects corresponding to the space dimensions + to be removed. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with one of the + Variable objects contained in \p to_be_removed. + */ + void remove_space_dimensions(const Variables_Set& to_be_removed); + + /*! \brief + Removes the higher dimensions of the vector space so that + the resulting space will have dimension \p new_dimension. + + \exception std::invalid_argument + Thrown if \p new_dimensions is greater than the space dimension of + \p *this. + */ + void remove_higher_space_dimensions(dimension_type new_dimension); + + /*! \brief + Remaps the dimensions of the vector space according to + a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function". + + \param pfunc + The partial function specifying the destiny of each space dimension. + + The template class Partial_Function must provide the following + methods. + \code + bool has_empty_codomain() const + \endcode + returns true if and only if the represented partial + function has an empty codomain (i.e., it is always undefined). + The has_empty_codomain() method will always be called + before the methods below. However, if + has_empty_codomain() returns true, 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 max_in_codomain() 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 true is returned. + If \f$f\f$ is undefined in \f$k\f$, then false 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 + 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 max_space_dimension(). + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + and var has space dimension \f$k \leq n\f$, + then the \f$k\f$-th space dimension is + \ref expand_space_dimension "expanded" to \p m new space dimensions + \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$. + */ + void expand_space_dimension(Variable var, dimension_type m); + + //! Folds the space dimensions in \p to_be_folded into \p var. + /*! + \param to_be_folded + The set of Variable objects corresponding to the space dimensions + to be folded; + + \param var + The variable corresponding to the space dimension that is the + destination of the folding operation. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with \p var or with + one of the Variable objects contained in \p to_be_folded. + Also thrown if \p var is contained in \p to_be_folded. + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + var has space dimension \f$k \leq n\f$, + \p to_be_folded is a set of variables whose maximum space dimension + is also less than or equal to \f$n\f$, and \p var is not a member + of \p to_be_folded, then the space dimensions corresponding to + variables in \p to_be_folded are \ref fold_space_dimensions "folded" + into the \f$k\f$-th space dimension. + */ + void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var); + + //@} // Member Functions that May Modify the Dimension of the Vector Space + + friend bool operator==(const Polyhedron& x, const Polyhedron& y); + + //! \name Miscellaneous Member Functions + //@{ + + //! Destructor. + ~Polyhedron(); + + /*! \brief + Swaps \p *this with polyhedron \p y. + (\p *this and \p y can be dimension-incompatible.) + + \exception std::invalid_argument + Thrown if \p x and \p y are topology-incompatible. + */ + void swap(Polyhedron& y); + + PPL_OUTPUT_DECLARATIONS + + /*! \brief + Loads from \p s an ASCII representation (as produced by + ascii_dump(std::ostream&) const) and sets \p *this accordingly. + Returns true if successful, false 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 x == y, + then x.hash_code() == y.hash_code(). + */ + int32_t hash_code() const; + + //@} // Miscellaneous Member Functions + +private: + //! The system of constraints. + Constraint_System con_sys; + + //! The system of generators. + Generator_System gen_sys; + + //! The saturation matrix having constraints on its columns. + 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: + - zero-dim universe: the polyhedron is the zero-dimension + vector space \f$\Rset^0 = \{\cdot\}\f$; + - empty: the polyhedron is the empty set; + - constraints pending: 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; + - generators pending: 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; + - constraints up-to-date: the polyhedron is correctly + characterized by the attached system of constraints, modulo the + processing of pending generators; + - generators up-to-date: the polyhedron is correctly + characterized by the attached system of generators, modulo the + processing of pending constraints; + - constraints minimized: the non-pending part of the system + of constraints attached to the polyhedron is in minimal form; + - generators minimized: the non-pending part of the system + of generators attached to the polyhedron is in minimal form; + - constraints' saturation matrix up-to-date: 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; + - generators' saturation matrix up-to-date: 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: + - zero-dim universe excludes any other assertion; + - empty: excludes any other assertion; + - constraints pending and generators pending + are mutually exclusive; + - constraints pending implies both constraints minimized + and generators minimized; + - generators pending implies both constraints minimized + and generators minimized; + - constraints minimized implies constraints up-to-date; + - generators minimized implies generators up-to-date; + - constraints' saturation matrix up-to-date implies both + constraints up-to-date and generators up-to-date; + - generators' saturation matrix up-to-date implies both + constraints up-to-date and generators up-to-date. +*/ +class Status { +public: + //! By default Status is the zero-dim universe 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 true if successful, false 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 all bits in \p mask are set. + bool test_all(flags_t mask) const; + + //! Check whether at least one 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 2035. */ +#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 true 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 true if the polyhedron is known to be empty. + /*! + The return value false does not necessarily + implies that \p *this is non-empty. + */ + bool marked_empty() const; + + //! Returns true if the system of constraints is up-to-date. + bool constraints_are_up_to_date() const; + + //! Returns true if the system of generators is up-to-date. + bool generators_are_up_to_date() const; + + //! Returns true 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 true 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 true if there are pending constraints. + bool has_pending_constraints() const; + + //! Returns true if there are pending generators. + bool has_pending_generators() const; + + /*! \brief + Returns true if there are + either pending constraints or pending generators. + */ + bool has_something_pending() const; + + //! Returns true if the polyhedron can have something pending. + bool can_have_something_pending() const; + + /*! \brief + Returns true if the saturation matrix \p sat_c + is up-to-date. + */ + bool sat_c_is_up_to_date() const; + + /*! \brief + Returns true 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 + false 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 + false 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 + false 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 + false 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 + false 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 + false 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 + false 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 true 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 true if and only if \p from_above is + true and \p expr is bounded from above in \p *this, + or \p from_above is false and \p expr is bounded + from below in \p *this. + + \param expr + The linear expression to test; + + \param from_above + true 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 + true 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 + true 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, false 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_selected) const; + + /*! \brief + Splits the constraints of `x' into two subsets, depending on whether + or not they are selected to compute the \ref H79_widening "H79-widening" + of \p *this and \p y. + */ + void select_H79_constraints(const Polyhedron& y, + Constraint_System& cs_selected, + Constraint_System& cs_not_selected) const; + + bool BHRZ03_combining_constraints(const Polyhedron& y, + const BHRZ03_Certificate& y_cert, + const Polyhedron& H79, + const Constraint_System& x_minus_H79_con_sys); + + bool BHRZ03_evolving_points(const Polyhedron& y, + const BHRZ03_Certificate& y_cert, + const Polyhedron& H79); + + bool BHRZ03_evolving_rays(const Polyhedron& y, + const BHRZ03_Certificate& y_cert, + const Polyhedron& H79); + + //@} // Widening- and Extrapolation-Related Functions + + //! Adds new space dimensions to the given matrices. + /*! + \param mat1 + The matrix to which columns are added; + + \param mat2 + The matrix to which rows and columns are added; + + \param sat1 + The saturation matrix whose columns are indexed by the rows of + matrix \p mat1. On entry it is up-to-date; + + \param sat2 + The saturation matrix whose columns are indexed by the rows of \p + mat2; + + \param add_dim + The number of space dimensions to add. + + Adds new space dimensions to the vector space modifying the matrices. + This function is invoked only by + add_space_dimensions_and_embed() and + add_space_dimensions_and_project(), passing the matrix of + constraints and that of generators (and the corresponding saturation + matrices) in different order (see those methods for details). + */ + static void add_space_dimensions(Linear_System& mat1, + Linear_System& mat2, + 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. + static bool minimize(bool con_to_gen, + Linear_System& source, + 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. + static bool add_and_minimize(bool con_to_gen, + Linear_System& source1, + Linear_System& dest, + Bit_Matrix& sat, + const Linear_System& source2); + + /*! \brief + Adds given constraints and builds minimized corresponding generators + or vice versa. The given constraints are in \p source. + */ + // Detailed Doxygen comment to be found in file minimize.cc. + static bool add_and_minimize(bool con_to_gen, + Linear_System& source, + Linear_System& dest, + Bit_Matrix& sat); + + //! Performs the conversion from constraints to generators and vice versa. + // Detailed Doxygen comment to be found in file conversion.cc. + static dimension_type conversion(Linear_System& source, + dimension_type start, + Linear_System& dest, + Bit_Matrix& sat, + dimension_type num_lines_or_equalities); + + /*! \brief + Uses Gauss' elimination method to simplify the result of + conversion(). + */ + // Detailed Doxygen comment to be found in file simplify.cc. + static dimension_type simplify(Linear_System& mat, 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 friend class Parma_Polyhedra_Library::Box; + template friend class Parma_Polyhedra_Library::BD_Shape; + template 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 + Convexity Recognition of the Union of Polyhedra + 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_runtime_error(const char* method) const; + void throw_invalid_argument(const char* method, const char* reason) const; + + void throw_topology_incompatible(const char* method, + const char* ph_name, + const Polyhedron& ph) const; + void throw_topology_incompatible(const char* method, + const char* c_name, + const Constraint& c) const; + void throw_topology_incompatible(const char* method, + const char* g_name, + const Generator& g) const; + void throw_topology_incompatible(const char* method, + const char* cs_name, + const Constraint_System& cs) const; + void throw_topology_incompatible(const char* method, + const char* gs_name, + const Generator_System& gs) const; + + void throw_dimension_incompatible(const char* method, + const char* other_name, + dimension_type other_dim) const; + void throw_dimension_incompatible(const char* method, + const char* ph_name, + const Polyhedron& ph) const; + void throw_dimension_incompatible(const char* method, + const char* e_name, + const Linear_Expression& e) const; + void throw_dimension_incompatible(const char* method, + const char* c_name, + const Constraint& c) const; + void throw_dimension_incompatible(const char* method, + const char* g_name, + const Generator& g) const; + void throw_dimension_incompatible(const char* method, + const char* cg_name, + const Congruence& cg) const; + void throw_dimension_incompatible(const char* method, + const char* cs_name, + const Constraint_System& cs) const; + void throw_dimension_incompatible(const char* method, + const char* gs_name, + const Generator_System& gs) const; + void throw_dimension_incompatible(const char* method, + const char* cgs_name, + const Congruence_System& cgs) const; + void throw_dimension_incompatible(const char* method, + const char* var_name, + Variable var) const; + void throw_dimension_incompatible(const char* method, + dimension_type required_space_dim) const; + + // Note: it has to be a static method, because it can be called inside + // constructors (before actually constructing the polyhedron object). + static void throw_space_dimension_overflow(Topology topol, + const char* method, + const char* reason); + + void throw_invalid_generator(const char* method, + const char* g_name) const; + void throw_invalid_generators(const char* method, + const char* gs_name) const; +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS + //@} // Exception Throwers +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) + +}; + + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Polyhedron */ +void swap(Parma_Polyhedra_Library::Polyhedron& x, + Parma_Polyhedra_Library::Polyhedron& y); + +} // namespace std + +/* Automatically generated from PPL source file ../src/Ph_Status.inlines.hh line 1. */ +/* Polyhedron::Status class implementation: inline functions. +*/ + + +namespace Parma_Polyhedra_Library { + +inline +Polyhedron::Status::Status(flags_t mask) + : flags(mask) { +} + +inline +Polyhedron::Status::Status() + : flags(ZERO_DIM_UNIV) { +} + +inline bool +Polyhedron::Status::test_all(flags_t mask) const { + return (flags & mask) == mask; +} + +inline bool +Polyhedron::Status::test_any(flags_t mask) const { + return flags & mask; +} + +inline void +Polyhedron::Status::set(flags_t mask) { + flags |= mask; +} + +inline void +Polyhedron::Status::reset(flags_t mask) { + flags &= ~mask; +} + +inline bool +Polyhedron::Status::test_zero_dim_univ() const { + return flags == ZERO_DIM_UNIV; +} + +inline void +Polyhedron::Status::reset_zero_dim_univ() { + // This is a no-op if the current status is not zero-dim. + if (flags == ZERO_DIM_UNIV) + // In the zero-dim space, if it is not the universe it is empty. + flags = EMPTY; +} + +inline void +Polyhedron::Status::set_zero_dim_univ() { + // Zero-dim universe is incompatible with anything else. + flags = ZERO_DIM_UNIV; +} + +inline bool +Polyhedron::Status::test_empty() const { + return test_any(EMPTY); +} + +inline void +Polyhedron::Status::reset_empty() { + reset(EMPTY); +} + +inline void +Polyhedron::Status::set_empty() { + flags = EMPTY; +} + +inline bool +Polyhedron::Status::test_c_up_to_date() const { + return test_any(C_UP_TO_DATE); +} + +inline void +Polyhedron::Status::reset_c_up_to_date() { + reset(C_UP_TO_DATE); +} + +inline void +Polyhedron::Status::set_c_up_to_date() { + set(C_UP_TO_DATE); +} + +inline bool +Polyhedron::Status::test_g_up_to_date() const { + return test_any(G_UP_TO_DATE); +} + +inline void +Polyhedron::Status::reset_g_up_to_date() { + reset(G_UP_TO_DATE); +} + +inline void +Polyhedron::Status::set_g_up_to_date() { + set(G_UP_TO_DATE); +} + +inline bool +Polyhedron::Status::test_c_minimized() const { + return test_any(C_MINIMIZED); +} + +inline void +Polyhedron::Status::reset_c_minimized() { + reset(C_MINIMIZED); +} + +inline void +Polyhedron::Status::set_c_minimized() { + set(C_MINIMIZED); +} + +inline bool +Polyhedron::Status::test_g_minimized() const { + return test_any(G_MINIMIZED); +} + +inline void +Polyhedron::Status::reset_g_minimized() { + reset(G_MINIMIZED); +} + +inline void +Polyhedron::Status::set_g_minimized() { + set(G_MINIMIZED); +} + + +inline bool +Polyhedron::Status::test_c_pending() const { + return test_any(CS_PENDING); +} + +inline void +Polyhedron::Status::reset_c_pending() { + reset(CS_PENDING); +} + +inline void +Polyhedron::Status::set_c_pending() { + set(CS_PENDING); +} + +inline bool +Polyhedron::Status::test_g_pending() const { + return test_any(GS_PENDING); +} + +inline void +Polyhedron::Status::reset_g_pending() { + reset(GS_PENDING); +} + +inline void +Polyhedron::Status::set_g_pending() { + set(GS_PENDING); +} + + +inline bool +Polyhedron::Status::test_sat_c_up_to_date() const { + return test_any(SAT_C_UP_TO_DATE); +} + +inline void +Polyhedron::Status::reset_sat_c_up_to_date() { + reset(SAT_C_UP_TO_DATE); +} + +inline void +Polyhedron::Status::set_sat_c_up_to_date() { + set(SAT_C_UP_TO_DATE); +} + +inline bool +Polyhedron::Status::test_sat_g_up_to_date() const { + return test_any(SAT_G_UP_TO_DATE); +} + +inline void +Polyhedron::Status::reset_sat_g_up_to_date() { + reset(SAT_G_UP_TO_DATE); +} + +inline void +Polyhedron::Status::set_sat_g_up_to_date() { + set(SAT_G_UP_TO_DATE); +} + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Polyhedron.inlines.hh line 1. */ +/* Polyhedron class implementation: inline functions. +*/ + + +/* Automatically generated from PPL source file ../src/Polyhedron.inlines.hh line 28. */ +#include +#include + +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 space_dimension() & 0x7fffffff; +} + +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::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::swap(Polyhedron& y) { + if (topology() != y.topology()) + throw_topology_incompatible("swap(y)", "y", y); + std::swap(con_sys, y.con_sys); + std::swap(gen_sys, y.gen_sys); + std::swap(sat_c, y.sat_c); + std::swap(sat_g, y.sat_g); + std::swap(status, y.status); + std::swap(space_dim, y.space_dim); +} + +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 { + assert(space_dim > 0 && !marked_empty()); + assert(has_something_pending()); + + Polyhedron& x = const_cast(*this); + + if (x.has_pending_constraints()) + return x.process_pending_constraints(); + + assert(x.has_pending_generators()); + x.process_pending_generators(); + return true; +} + +inline bool +Polyhedron::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 { + 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 Grid_Generator_System +Polyhedron::minimized_grid_generators() const { + return grid_generators(); +} + +inline bool +Polyhedron::add_congruence_and_minimize(const Congruence& cg) { + add_congruence(cg); + return minimize(); +} + +inline bool +Polyhedron::add_congruences_and_minimize(const Congruence_System& cgs) { + add_congruences(cgs); + return minimize(); +} + +inline void +Polyhedron::add_recycled_congruences(Congruence_System& cgs) { + add_congruences(cgs); +} + +inline bool +Polyhedron::add_recycled_congruences_and_minimize(Congruence_System& cgs) { + return add_congruences_and_minimize(cgs); +} + +/*! \relates Polyhedron */ +inline bool +operator!=(const Polyhedron& x, const Polyhedron& y) { + return !(x == y); +} + +inline bool +Polyhedron::strictly_contains(const Polyhedron& y) const { + const Polyhedron& x = *this; + return x.contains(y) && !y.contains(x); +} + +namespace Interfaces { + +inline bool +is_necessarily_closed_for_interfaces(const Polyhedron& ph) { + return ph.is_necessarily_closed(); +} + +} // namespace Interfaces + +} // namespace Parma_Polyhedra_Library + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Polyhedron */ +inline void +swap(Parma_Polyhedra_Library::Polyhedron& x, + Parma_Polyhedra_Library::Polyhedron& y) { + x.swap(y); +} + +} // namespace std + +/* 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/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/Variables_Set.defs.hh line 1. */ +/* Variables_Set class declaration. +*/ + + +/* Automatically generated from PPL source file ../src/Variables_Set.defs.hh line 29. */ +#include +#include + +namespace Parma_Polyhedra_Library { + +namespace IO_Operators { + +//! Output operator. +/*! \relates Parma_Polyhedra_Library::Variables_Set */ +std::ostream& +operator<<(std::ostream& s, const Variables_Set& v); + +} // namespace IO_Operators + +} // namespace Parma_Polyhedra_Library + +//! An std::set of variables' indexes. +class Parma_Polyhedra_Library::Variables_Set + : public std::set { +private: + typedef std::set Base; + +public: + //! Builds the empty set of variable indexes. + Variables_Set(); + + //! Builds the singleton set of indexes containing v.id(); + explicit Variables_Set(const Variable& v); + + /*! \brief + Builds the set of variables's indexes in the range from + v.id() to w.id(). + + If v.id() <= w.id(), this constructor builds the + set of variables' indexes + v.id(), v.id()+1, ..., w.id(). + The empty set it 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 variavle \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 true if successful, false 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 27. */ +#include + +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 105. */ + +/* Automatically generated from PPL source file ../src/MIP_Problem.defs.hh line 35. */ +#include +#include +#include + +namespace Parma_Polyhedra_Library { + +namespace IO_Operators { + +//! Output operator. +/*! \relates Parma_Polyhedra_Library::MIP_Problem */ +std::ostream& +operator<<(std::ostream& s, const MIP_Problem& lp); + +} // namespace IO_Operators + +} // 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 max_space_dimension(). + */ + 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 + MAXIMIZATION). + + \exception std::length_error + Thrown if \p dim exceeds max_space_dimension(). + + \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 + 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 + MAXIMIZATION). + + \exception std::length_error + Thrown if \p dim exceeds max_space_dimension(). + + \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 + 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 + MAXIMIZATION). + + \exception std::length_error + Thrown if \p dim exceeds max_space_dimension(). + + \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_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; + + //! 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 max_space_dimension(). + + 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 + true 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 den so that \f$\frac{num}{den}\f$ is the result + of evaluating the objective function on \p evaluating_point. + + \param evaluating_point + The point on which the objective function will be evaluated. + + \param num + On exit will contain the numerator of the evaluated value. + + \param den + On exit will contain the denominator of the evaluated value. + + \exception std::invalid_argument + Thrown if \p *this and \p evaluating_point are dimension-incompatible + or if the generator \p evaluating_point is not a point. + */ + void evaluate_objective_function(const Generator& evaluating_point, + Coefficient& num, + Coefficient& den) const; + + //! Returns a feasible point for \p *this, if it exists. + /*! + \exception std::domain_error + Thrown if the 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 doesn't not have an optimizing point, i.e., + if the MIP problem is unbounded or not satisfiable. + */ + const Generator& optimizing_point() const; + + /*! \brief + Sets \p num and \p den so that \f$\frac{num}{den}\f$ is + the solution of the optimization problem. + + \exception std::domain_error + Thrown if \p *this doesn't not have an optimizing point, i.e., + if the MIP problem is unbounded or not satisfiable. + */ + void optimal_value(Coefficient& num, Coefficient& den) const; + + //! Checks if all the invariants are satisfied. + bool OK() const; + + PPL_OUTPUT_DECLARATIONS + + /*! \brief + Loads from \p s an ASCII representation (as produced by + ascii_dump(std::ostream&) const) and sets \p *this accordingly. + Returns true if successful, false 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 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; + + //! The matrix encoding the current feasible region in tableau form. + Matrix tableau; + + //! The working cost function. + Row 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; mapping[i].second + not a zero, 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 > mapping; + + //! The current basic solution. + std::vector 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. + Constraint_Sequence input_cs; + + //! 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; + + //! Processes the pending constraints of \p *this. + /*! + \return + true if and only if the MIP problem is satisfiable after + processing the pending constraints, false otherwise. + */ + bool 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 + UNFEASIBLE_MIP_PROBLEM if the constraint system contains + any trivially unfeasible constraint (tableau was not computed); + UNBOUNDED_MIP_PROBLEM if the problem is trivially unbounded + (the computed tableau contains no constraints); + OPTIMIZED_MIP_PROBLEM> if the problem is neither trivially + unfeasible nor trivially unbounded (the tableau was computed successfully). + */ + MIP_Problem_Status + compute_tableau(std::vector& worked_out_row); + + /*! \brief + Parses the pending constraints to gather information on + how to resize the tableau. + + \return + UNSATISFIABLE if is detected a trivially false constraint, + SATISFIABLE otherwise. + + \param new_num_rows + This will store the number of rows that has to be added to the original + tableau. + + \param num_slack_variables + This will store the number of slack variables that has to be added to + the original tableau. + + \param is_tableau_constraint + Every element of this vector will be set to true if the + associated pending constraint has to be inserted in the tableau, + false otherwise. + + \param nonnegative_variable + This will encode for each variable if this one was split or not. + Every element of this vector will be set to true if the + associated variable is split, false otherwise. + + \param unfeasible_tableau_rows + This will contain all the row indexes of the tableau that are no more + satisfied after adding more constraints to \p *this. + + \param satisfied_ineqs + This will contain all the row indexes of the tableau that are already + satisfied by `last_generator' and do not require artificial variables to + have a starting feasible base. + + */ + bool parse_constraints(dimension_type& new_num_rows, + dimension_type& num_slack_variables, + std::deque& is_tableau_constraint, + std::deque& nonnegative_variable, + std::vector& unfeasible_tableau_rows, + std::deque& satisfied_ineqs); + + /*! \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 *this[k] is 0. + /*! + \param x + The Row that will be combined with \p y object. + + \param y + The Row that will be combined with \p x object. + + \param k + The position of \p *this that have to be \f$0\f$. + + Computes a linear combination of \p x and \p y having + the element of index \p k equal to \f$0\f$. Then it assigns + the resulting Linear_Row to \p x and normalizes it. + */ + static void linear_combine(Row& x, const Row& y, const dimension_type k); + + /*! \brief + 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 0 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 0 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 doesn't 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 true 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 true 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. + */ + 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 previously split variables in the tableau if a nonnegativity + constraint is detected. + + \param var_index + The index of the variable that has to be merged. + + \param nonfeasible_cs + This will contain all the row indexes that are no more satisfied by + the computed generator after merging a variable. + */ + void merge_split_variables(dimension_type var_index, + std::vector& nonfeasible_cs); + + //! Returns true if and only if \p c is satisfied by \p g. + static bool is_satisfied(const Constraint& c, const Generator& g); + + //! Returns true 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); + + bool is_lp_satisfiable() const; + + /*! \brief + Used with MIP_Problems with a non empty `i_vars', + returns true if and if only a MIP problem is satisfiable, + returns false otherwise. + + \param mip + The problem that has to be solved. + + \param p + This will encode the feasible point, only if true is returned. + + \param i_vars + The variables that are constrained to take an integer value. + */ + static bool is_mip_satisfiable(MIP_Problem& mip, Generator& p, + const Variables_Set& i_vars); + + /*! \brief + Returns true if and if only `last_generator' satisfies all the + integrality coditions. + + \param mip + The MIP problem. + + \param i_vars + The variables that are constrained to take an integer value. + + \param branching_index + If false is returned, this will encode the variable index on + which must be applied the `branch and bound' algorithm. + */ + static bool choose_branching_variable(const MIP_Problem& mip, + const Variables_Set& i_vars, + dimension_type& branching_index); +}; + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::MIP_Problem */ +void swap(Parma_Polyhedra_Library::MIP_Problem& x, + Parma_Polyhedra_Library::MIP_Problem& y); + +} // namespace std + +/* 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 27. */ +#include + +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(y.input_cs), + 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) { + assert(OK()); +} + +inline +MIP_Problem::~MIP_Problem() { +} + + +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; + 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& num, Coefficient& den) const { + const Generator& g = optimizing_point(); + evaluate_objective_function(g, num, den); +} + +inline MIP_Problem::const_iterator +MIP_Problem::constraints_begin() const { + return input_cs.begin(); +} + +inline MIP_Problem::const_iterator +MIP_Problem::constraints_end() const { + return 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 { + used(name); + assert(name == PRICING); + return pricing; +} + +inline void +MIP_Problem::set_control_parameter(Control_Parameter_Value value) { + pricing = value; +} + +inline void +MIP_Problem::swap(MIP_Problem& y) { + std::swap(external_space_dim, y.external_space_dim); + std::swap(internal_space_dim, y.internal_space_dim); + std::swap(tableau, y.tableau); + std::swap(working_cost, y.working_cost); + std::swap(mapping, y.mapping); + std::swap(initialized, y.initialized); + std::swap(base, y.base); + std::swap(status, y.status); + std::swap(pricing, y.pricing); + std::swap(input_cs, y.input_cs); + std::swap(first_pending_constraint, y.first_pending_constraint); + std::swap(input_obj_function, y.input_obj_function); + std::swap(opt_mode, y.opt_mode); + std::swap(last_generator, y.last_generator); + std::swap(i_variables, y.i_variables); +} + +inline MIP_Problem& +MIP_Problem::operator=(const MIP_Problem& y) { + MIP_Problem tmp(y); + swap(tmp); + return *this; +} + +inline void +MIP_Problem::clear() { + MIP_Problem tmp; + swap(tmp); +} + +inline memory_size_type +MIP_Problem::external_memory_in_bytes() const { + memory_size_type n + = tableau.external_memory_in_bytes() + + working_cost.external_memory_in_bytes() + + input_obj_function.external_memory_in_bytes() + + last_generator.external_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()); + // Adding the external memory for `base'. + n += base.capacity() * sizeof(dimension_type); + // Adding the external memory for `mapping'. + n += mapping.capacity() * sizeof(std::pair); + return n; +} + +inline memory_size_type +MIP_Problem::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +/*! \relates Parma_Polyhedra_Library::MIP_Problem */ +inline void +swap(Parma_Polyhedra_Library::MIP_Problem& x, + Parma_Polyhedra_Library::MIP_Problem& y) { + x.swap(y); +} + +} // namespace std + +/* 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 27. */ + +namespace Parma_Polyhedra_Library { + +template +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, Row::Flags()), + mapping(), + base(), + status(PARTIALLY_SATISFIABLE), + pricing(PRICING_STEEPEST_EDGE_FLOAT), + initialized(false), + input_cs(), + 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. + 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()); + } + input_cs.push_back(*i); + } + assert(OK()); +} + +template +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, Row::Flags()), + mapping(), + base(), + status(PARTIALLY_SATISFIABLE), + pricing(PRICING_STEEPEST_EDGE_FLOAT), + initialized(false), + input_cs(), + 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. + 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()); + } + input_cs.push_back(*i); + } + assert(OK()); +} + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/MIP_Problem.defs.hh line 805. */ + +/* Automatically generated from PPL source file ../src/Polyhedron.templates.hh line 28. */ +#include +#include + +namespace Parma_Polyhedra_Library { + +template +Polyhedron::Polyhedron(Topology topol, + const Box& box, + Complexity_Class) + : con_sys(topol), + gen_sys(topol), + sat_c(), + sat_g() { + // Initialize the space dimension as indicated by the box. + space_dim = box.space_dimension(); + + // Check for emptiness. + if (box.is_empty()) { + set_empty(); + return; + } + + // Zero-dim universe polyhedron. + if (space_dim == 0) { + set_zero_dim_univ(); + return; + } + + // Insert a dummy constraint of the highest dimension to avoid the + // need of resizing the matrix of constraints later; + // this constraint will be removed at the end. + con_sys.insert(Variable(space_dim - 1) >= 0); + + 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; ) { + // See if we have a valid lower bound. + bool l_closed = false; + bool l_bounded = box.get_lower_bound(k, l_closed, l_n, l_d); + // See if we have a valid upper bound. + bool u_closed = false; + bool u_bounded = box.get_upper_bound(k, u_closed, u_n, u_d); + + // See if we have an implicit equality constraint. + if (l_bounded && u_bounded + && l_closed && u_closed + && l_n == u_n && l_d == u_d) { + // Add the constraint `l_d*v_k == l_n'. + con_sys.insert(l_d * Variable(k) == l_n); + } + else { + if (l_bounded) + // Add the constraint `l_d*v_k >= l_n'. + con_sys.insert(l_d * Variable(k) >= l_n); + if (u_bounded) + // Add the constraint `u_d*v_k <= u_n'. + con_sys.insert(u_d * Variable(k) <= u_n); + } + } + } + else { + // topol == NOT_NECESSARILY_CLOSED + for (dimension_type k = space_dim; k-- > 0; ) { + // See if we have a valid lower bound. + bool l_closed = false; + bool l_bounded = box.get_lower_bound(k, l_closed, l_n, l_d); + // See if we have a valid upper bound. + bool u_closed = false; + bool u_bounded = box.get_upper_bound(k, u_closed, u_n, u_d); + + // See if we have an implicit equality constraint. + if (l_bounded && u_bounded + && l_closed && u_closed + && l_n == u_n && l_d == u_d) { + // Add the constraint `l_d*v_k == l_n'. + con_sys.insert(l_d * Variable(k) == l_n); + } + else { + // Check if a lower bound constraint is required. + if (l_bounded) { + if (l_closed) + // Add the constraint `l_d*v_k >= l_n'. + con_sys.insert(l_d * Variable(k) >= l_n); + else + // Add the constraint `l_d*v_k > l_n'. + con_sys.insert(l_d * Variable(k) > l_n); + } + // Check if an upper bound constraint is required. + if (u_bounded) { + if (u_closed) + // Add the constraint `u_d*v_k <= u_n'. + con_sys.insert(u_d * Variable(k) <= u_n); + else + // Add the constraint `u_d*v_k < u_n'. + con_sys.insert(u_d * Variable(k) < u_n); + } + } + } + } + + // Adding the low-level constraints. + con_sys.add_low_level_constraints(); + // Now removing the dummy constraint inserted before. + dimension_type n_rows = con_sys.num_rows() - 1; + con_sys[0].swap(con_sys[n_rows]); + con_sys.set_sorted(false); + // NOTE: here there are no pending constraints. + con_sys.set_index_first_pending_row(n_rows); + con_sys.erase_to_end(n_rows); + + // Constraints are up-to-date. + set_constraints_up_to_date(); + assert(OK()); +} + +template +void +Polyhedron::map_space_dimensions(const Partial_Function& pfunc) { + if (space_dim == 0) + return; + + if (pfunc.has_empty_codomain()) { + // All dimensions vanish: the polyhedron becomes zero_dimensional. + if (marked_empty() + || (has_pending_constraints() + && !remove_pending_to_obtain_generators()) + || (!generators_are_up_to_date() && !update_generators())) { + // Removing all dimensions from the empty polyhedron. + space_dim = 0; + con_sys.clear(); + } + else + // Removing all dimensions from a non-empty polyhedron. + set_zero_dim_univ(); + + assert(OK()); + return; + } + + const dimension_type new_space_dimension = pfunc.max_in_codomain() + 1; + + if (new_space_dimension == space_dim) { + // The partial function `pfunc' is indeed total and thus specifies + // a permutation, that is, a renaming of the dimensions. For + // maximum efficiency, we will simply permute the columns of the + // constraint system and/or the generator system. + + // We first compute suitable permutation cycles for the columns of + // the `con_sys' and `gen_sys' matrices. We will represent them + // with a linear array, using 0 as a terminator for each cycle + // (notice that the columns with index 0 of `con_sys' and + // `gen_sys' represent the inhomogeneous terms, and thus are + // unaffected by the permutation of dimensions). + // Cycles of length 1 will be omitted so that, in the worst case, + // we will have `space_dim' elements organized in `space_dim/2' + // cycles, which means we will have at most `space_dim/2' + // terminators. + std::vector cycles; + cycles.reserve(space_dim + space_dim/2); + + // Used to mark elements as soon as they are inserted in a cycle. + std::deque visited(space_dim); + + for (dimension_type i = space_dim; i-- > 0; ) { + if (!visited[i]) { + dimension_type j = i; + do { + visited[j] = true; + // The following initialization is only to make the compiler happy. + dimension_type k = 0; + if (!pfunc.maps(j, k)) + throw_invalid_argument("map_space_dimensions(pfunc)", + " pfunc is inconsistent"); + if (k == j) + // Cycle of length 1: skip it. + goto skip; + + cycles.push_back(j+1); + // Go along the cycle. + j = k; + } while (!visited[j]); + // End of cycle: mark it. + cycles.push_back(0); + skip: + ; + } + } + + // If `cycles' is empty then `pfunc' is the identity. + if (cycles.empty()) + return; + + // Permute all that is up-to-date. Notice that the contents of + // the saturation matrices is unaffected by the permutation of + // columns: they remain valid, if they were so. + if (constraints_are_up_to_date()) + con_sys.permute_columns(cycles); + + if (generators_are_up_to_date()) + gen_sys.permute_columns(cycles); + + assert(OK()); + return; + } + + // If control gets here, then `pfunc' is not a permutation and some + // dimensions must be projected away. + + // If there are pending constraints, using `generators()' we process them. + const Generator_System& old_gensys = generators(); + + if (old_gensys.has_no_rows()) { + // The polyhedron is empty. + Polyhedron new_polyhedron(topology(), new_space_dimension, EMPTY); + std::swap(*this, new_polyhedron); + assert(OK()); + return; + } + + // Make a local copy of the partial function. + std::vector pfunc_maps(space_dim, not_a_dimension()); + for (dimension_type j = space_dim; j-- > 0; ) { + dimension_type pfunc_j; + if (pfunc.maps(j, pfunc_j)) + pfunc_maps[j] = pfunc_j; + } + + Generator_System new_gensys; + for (Generator_System::const_iterator i = old_gensys.begin(), + old_gensys_end = old_gensys.end(); i != old_gensys_end; ++i) { + const Generator& old_g = *i; + Linear_Expression e(0 * Variable(new_space_dimension-1)); + bool all_zeroes = true; + for (dimension_type j = space_dim; j-- > 0; ) { + if (old_g.coefficient(Variable(j)) != 0 + && pfunc_maps[j] != not_a_dimension()) { + e += Variable(pfunc_maps[j]) * old_g.coefficient(Variable(j)); + all_zeroes = false; + } + } + switch (old_g.type()) { + case Generator::LINE: + if (!all_zeroes) + new_gensys.insert(line(e)); + break; + case Generator::RAY: + if (!all_zeroes) + new_gensys.insert(ray(e)); + break; + case Generator::POINT: + // A point in the origin has all zero homogeneous coefficients. + new_gensys.insert(point(e, old_g.divisor())); + break; + case Generator::CLOSURE_POINT: + // A closure point in the origin has all zero homogeneous coefficients. + new_gensys.insert(closure_point(e, old_g.divisor())); + break; + } + } + Polyhedron new_polyhedron(topology(), new_gensys); + std::swap(*this, new_polyhedron); + assert(OK(true)); +} + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Polyhedron.defs.hh line 2715. */ + +/* Automatically generated from PPL source file ../src/H79_Certificate.inlines.hh line 27. */ + +namespace Parma_Polyhedra_Library { + +inline +H79_Certificate::H79_Certificate() + : affine_dim(0), num_constraints(0) { + // This is the certificate for a zero-dim universe polyhedron. +} + +inline +H79_Certificate::H79_Certificate(const H79_Certificate& y) + : affine_dim(y.affine_dim), num_constraints(y.num_constraints) { +} + +inline +H79_Certificate::~H79_Certificate() { +} + +inline bool +H79_Certificate::Compare::operator()(const H79_Certificate& x, + const H79_Certificate& y) const { + // For an efficient evaluation of the multiset ordering based + // on this lgo relation, we want larger elements to come first. + return x.compare(y) == 1; +} + +template +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 +inline int +H79_Certificate::compare(const PH& ph) const { + return this->compare(Polyhedron(NECESSARILY_CLOSED, ph.constraints())); +} + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/H79_Certificate.defs.hh line 96. */ + +/* Automatically generated from PPL source file ../src/Grid_Certificate.defs.hh line 1. */ +/* Grid_Certificate class declaration. +*/ + + +/* Automatically generated from PPL source file ../src/Grid_Certificate.defs.hh line 27. */ + +/* Automatically generated from PPL source file ../src/Grid_Certificate.defs.hh line 30. */ +#include +#include + +//! 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 true 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 true 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. + assert(OK()); +} + +inline +Grid_Certificate::Grid_Certificate(const Grid_Certificate& y) + : num_equalities(y.num_equalities), + num_proper_congruences(y.num_proper_congruences) { +} + +inline +Grid_Certificate::~Grid_Certificate() { +} + +inline bool +Grid_Certificate::is_stabilizing(const Grid& gr) const { + return compare(gr) == 1; +} + +inline bool +Grid_Certificate::Compare::operator()(const Grid_Certificate& x, + const Grid_Certificate& y) const { + // For an efficient evaluation of the multiset ordering based + // on this lgo relation, we want larger elements to come first. + return x.compare(y) == 1; +} + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Grid_Certificate.defs.hh line 102. */ + +/* Automatically generated from PPL source file ../src/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 +class Widening_Function; + +template +class Limited_Widening_Function; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Widening_Function.defs.hh line 28. */ + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Wraps a widening method into a function object. +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +class Parma_Polyhedra_Library::Widening_Function { +public: + //! The (parametric) type of a widening method. + typedef void (PH::* Widening_Method)(const PH&, unsigned*); + + //! Explicit unary constructor. + explicit + Widening_Function(Widening_Method wm); + + //! Function-application operator. + /*! + Computes (x.*wm)(y, tp), where \p wm is the widening + method stored at construction time. + */ + void operator()(PH& x, const PH& y, unsigned* tp = 0) const; + +private: + //! The widening method. + Widening_Method w_method; +}; + + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Wraps a limited widening method into a function object. +/*! \ingroup PPL_CXX_interface */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +class Parma_Polyhedra_Library::Limited_Widening_Function { +public: + //! The (parametric) type of a limited widening method. + typedef void (PH::* Limited_Widening_Method)(const PH&, + const CS&, + unsigned*); + + //! Constructor. + /*! + \param lwm + The limited widening method. + + \param cs + The constraint system limiting the widening. + */ + Limited_Widening_Function(Limited_Widening_Method lwm, + const CS& cs); + + //! Function-application operator. + /*! + Computes (x.*lwm)(y, cs, tp), where \p lwm and \p cs + are the limited widening method and the constraint system stored + at construction time. + */ + void operator()(PH& x, const PH& y, unsigned* tp = 0) const; + +private: + //! The limited widening method. + Limited_Widening_Method lw_method; + //! A constant reference to the constraint system limiting the widening. + const CS& limiting_cs; +}; + +namespace Parma_Polyhedra_Library { + +//! Wraps a widening method into a function object. +/*! + \relates Pointset_Powerset + + \param wm + The widening method. +*/ +template +Widening_Function +widen_fun_ref(void (PH::* wm)(const PH&, 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 +Limited_Widening_Function +widen_fun_ref(void (PH::* lwm)(const PH&, const CS&, unsigned*), + const CS& cs); + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Widening_Function.inlines.hh line 1. */ +/* Widening_Function class implementation: inline functions. +*/ + + +#include + +namespace Parma_Polyhedra_Library { + +template +Widening_Function::Widening_Function(Widening_Method wm) + : w_method(wm) { +} + +template +inline void +Widening_Function:: +operator()(PH& x, const PH& y, unsigned* tp) const { + (x.*w_method)(y, tp); +} + +template +Limited_Widening_Function:: +Limited_Widening_Function(Limited_Widening_Method lwm, + const CS& cs) + : lw_method(lwm), limiting_cs(cs) { +} + +template +inline void +Limited_Widening_Function:: +operator()(PH& x, const PH& y, unsigned* tp) const { + (x.*lw_method)(y, limiting_cs, tp); +} + +/*! \relates Pointset_Powerset */ +template +inline Widening_Function +widen_fun_ref(void (PH::* wm)(const PH&, unsigned*)) { + return Widening_Function(wm); +} + +/*! \relates Pointset_Powerset */ +template +inline Limited_Widening_Function +widen_fun_ref(void (PH::* lwm)(const PH&, const CS&, unsigned*), + const CS& cs) { + return Limited_Widening_Function(lwm, cs); +} + +} // namespace Parma_Polyhedra_Library + + +/* Automatically generated from PPL source file ../src/Widening_Function.defs.hh line 125. */ + +/* Automatically generated from PPL source file ../src/max_space_dimension.hh line 1. */ +/* Definition of functions yielding maximal space dimensions. +*/ + + +/* 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 32. */ + +//! A closed convex polyhedron. +/*! \ingroup PPL_CXX_interface + An object of the class C_Polyhedron represents a + topologically closed 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 strict inequality constraint. + Similarly, an exception is thrown when building a closed polyhedron + starting from a system of generators containing a closure point. + + \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 const 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 const 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 const 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 + explicit C_Polyhedron(const Box& 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 + explicit C_Polyhedron(const BD_Shape& 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 + explicit C_Polyhedron(const Octagonal_Shape& 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 true is returned, + otherwise false is returned. + + \exception std::invalid_argument + Thrown if \p *this and \p y are dimension-incompatible. + */ + bool poly_hull_assign_if_exact(const C_Polyhedron& y); + + //! Same as poly_hull_assign_if_exact(y). + bool upper_bound_assign_if_exact(const C_Polyhedron& y); +}; + +/* Automatically generated from PPL source file ../src/C_Polyhedron.inlines.hh line 1. */ +/* C_Polyhedron class implementation: inline functions. +*/ + + +#include +#include + +namespace Parma_Polyhedra_Library { + +inline +C_Polyhedron::~C_Polyhedron() { +} + +inline +C_Polyhedron::C_Polyhedron(dimension_type num_dimensions, + Degenerate_Element kind) + : Polyhedron(NECESSARILY_CLOSED, + num_dimensions <= max_space_dimension() + ? num_dimensions + : (throw_space_dimension_overflow(NECESSARILY_CLOSED, + "C_Polyhedron(n, k)", + "n exceeds the maximum " + "allowed space dimension"), + num_dimensions), + kind) { +} + +inline +C_Polyhedron::C_Polyhedron(const Constraint_System& cs) + : Polyhedron(NECESSARILY_CLOSED, + cs.space_dimension() <= max_space_dimension() + ? cs + : (throw_space_dimension_overflow(NECESSARILY_CLOSED, + "C_Polyhedron(cs)", + "the space dimension of cs " + "exceeds the maximum allowed " + "space dimension"), cs)) { +} + +inline +C_Polyhedron::C_Polyhedron(Constraint_System& cs, Recycle_Input) + : Polyhedron(NECESSARILY_CLOSED, + cs.space_dimension() <= max_space_dimension() + ? cs + : (throw_space_dimension_overflow(NECESSARILY_CLOSED, + "C_Polyhedron(cs, recycle)", + "the space dimension of cs " + "exceeds the maximum allowed " + "space dimension"), cs), + Recycle_Input()) { +} + +inline +C_Polyhedron::C_Polyhedron(const Generator_System& gs) + : Polyhedron(NECESSARILY_CLOSED, + gs.space_dimension() <= max_space_dimension() + ? gs + : (throw_space_dimension_overflow(NECESSARILY_CLOSED, + "C_Polyhedron(gs)", + "the space dimension of gs " + "exceeds the maximum allowed " + "space dimension"), gs)) { +} + +inline +C_Polyhedron::C_Polyhedron(Generator_System& gs, Recycle_Input) + : Polyhedron(NECESSARILY_CLOSED, + gs.space_dimension() <= max_space_dimension() + ? gs + : (throw_space_dimension_overflow(NECESSARILY_CLOSED, + "C_Polyhedron(gs, recycle)", + "the space dimension of gs " + "exceeds the maximum allowed " + "space dimension"), gs), + Recycle_Input()) { +} + +template +inline +C_Polyhedron::C_Polyhedron(const Box& box, Complexity_Class) + : Polyhedron(NECESSARILY_CLOSED, + box.space_dimension() <= max_space_dimension() + ? box + : (throw_space_dimension_overflow(NECESSARILY_CLOSED, + "C_Polyhedron(box): ", + "the space dimension of box " + "exceeds the maximum allowed " + "space dimension"), box)) { +} + +template +inline +C_Polyhedron::C_Polyhedron(const BD_Shape& bd, Complexity_Class) + : Polyhedron(NECESSARILY_CLOSED, + bd.space_dimension() <= max_space_dimension() + ? bd.space_dimension() + : (throw_space_dimension_overflow(NECESSARILY_CLOSED, + "C_Polyhedron(bd): ", + "the space dimension of bd " + "exceeds the maximum allowed " + "space dimension"), 0), + UNIVERSE) { + add_constraints(bd.constraints()); +} + +template +inline +C_Polyhedron::C_Polyhedron(const Octagonal_Shape& os, Complexity_Class) + : Polyhedron(NECESSARILY_CLOSED, + os.space_dimension() <= max_space_dimension() + ? os.space_dimension() + : (throw_space_dimension_overflow(NECESSARILY_CLOSED, + "C_Polyhedron(os): ", + "the space dimension of os " + "exceeds the maximum allowed " + "space dimension"), 0), + 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); + 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 278. */ + +/* 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 30. */ + +//! A not necessarily closed convex polyhedron. +/*! \ingroup PPL_CXX_interface + An object of the class NNC_Polyhedron represents a + not necessarily closed (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 const 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 const 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 const 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 const 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 + explicit NNC_Polyhedron(const Box& 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 + explicit NNC_Polyhedron(const BD_Shape& 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 + explicit NNC_Polyhedron(const Octagonal_Shape& 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 true is returned, + otherwise false is returned. + + \exception std::invalid_argument + Thrown if \p *this and \p y are dimension-incompatible. + */ + bool poly_hull_assign_if_exact(const NNC_Polyhedron& y); + + //! Same as poly_hull_assign_if_exact(y). + bool upper_bound_assign_if_exact(const NNC_Polyhedron& y); +}; + +/* Automatically generated from PPL source file ../src/NNC_Polyhedron.inlines.hh line 1. */ +/* NNC_Polyhedron class implementation: inline functions. +*/ + + +/* Automatically generated from PPL source file ../src/NNC_Polyhedron.inlines.hh line 27. */ + +namespace Parma_Polyhedra_Library { + +inline +NNC_Polyhedron::~NNC_Polyhedron() { +} + +inline +NNC_Polyhedron::NNC_Polyhedron(dimension_type num_dimensions, + Degenerate_Element kind) + : Polyhedron(NOT_NECESSARILY_CLOSED, + num_dimensions <= max_space_dimension() + ? num_dimensions + : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED, + "NNC_Polyhedron(n, k)", + "n exceeds the maximum " + "allowed space dimension"), + num_dimensions), + kind) { +} + +inline +NNC_Polyhedron::NNC_Polyhedron(const Constraint_System& cs) + : Polyhedron(NOT_NECESSARILY_CLOSED, + cs.space_dimension() <= max_space_dimension() + ? cs + : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED, + "NNC_Polyhedron(cs)", + "the space dimension of cs " + "exceeds the maximum allowed " + "space dimension"), cs)) { +} + +inline +NNC_Polyhedron::NNC_Polyhedron(Constraint_System& cs, Recycle_Input) + : Polyhedron(NOT_NECESSARILY_CLOSED, + cs.space_dimension() <= max_space_dimension() + ? cs + : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED, + "NNC_Polyhedron(cs, recycle)", + "the space dimension of cs " + "exceeds the maximum allowed " + "space dimension"), cs), + Recycle_Input()) { +} + +inline +NNC_Polyhedron::NNC_Polyhedron(const Generator_System& gs) + : Polyhedron(NOT_NECESSARILY_CLOSED, + gs.space_dimension() <= max_space_dimension() + ? gs + : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED, + "NNC_Polyhedron(gs)", + "the space dimension of gs " + "exceeds the maximum allowed " + "space dimension"), gs)) { +} + +inline +NNC_Polyhedron::NNC_Polyhedron(Generator_System& gs, Recycle_Input) + : Polyhedron(NOT_NECESSARILY_CLOSED, + gs.space_dimension() <= max_space_dimension() + ? gs + : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED, + "NNC_Polyhedron(gs, recycle)", + "the space dimension of gs " + "exceeds the maximum allowed " + "space dimension"), gs), + Recycle_Input()) { +} + +template +inline +NNC_Polyhedron::NNC_Polyhedron(const Box& box, Complexity_Class) + : Polyhedron(NOT_NECESSARILY_CLOSED, + box.space_dimension() <= max_space_dimension() + ? box + : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED, + "NNC_Polyhedron(box)", + "the space dimension of box " + "exceeds the maximum allowed " + "space dimension"), box)) { +} + +template +inline +NNC_Polyhedron::NNC_Polyhedron(const BD_Shape& bd, Complexity_Class) + : Polyhedron(NOT_NECESSARILY_CLOSED, + bd.space_dimension() <= max_space_dimension() + ? bd.space_dimension() + : (throw_space_dimension_overflow(NECESSARILY_CLOSED, + "NNC_Polyhedron(bd): ", + "the space dimension of bd " + "exceeds the maximum allowed " + "space dimension"), 0), + UNIVERSE) { + add_constraints(bd.constraints()); +} + +template +inline +NNC_Polyhedron::NNC_Polyhedron(const Octagonal_Shape& os, Complexity_Class) + : Polyhedron(NOT_NECESSARILY_CLOSED, + os.space_dimension() <= max_space_dimension() + ? os.space_dimension() + : (throw_space_dimension_overflow(NECESSARILY_CLOSED, + "NNC_Polyhedron(os): ", + "the space dimension of os " + "exceeds the maximum allowed " + "space dimension"), 0), + 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); + 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); +} + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/NNC_Polyhedron.defs.hh line 254. */ + +/* Automatically generated from PPL source file ../src/Grid.defs.hh line 1. */ +/* Grid class declaration. +*/ + + +/* Automatically generated from PPL source file ../src/Grid.defs.hh line 48. */ +#include +#include + +namespace Parma_Polyhedra_Library { + +namespace IO_Operators { + +//! Output operator. +/*! + \relates Parma_Polyhedra_Library::Grid + Writes a textual representation of \p gr on \p s: false + is written if \p gr is an empty grid; true is written + if \p gr is a universe grid; a minimized system of congruences + defining \p gr is written otherwise, all congruences in one row + separated by ", "s. +*/ +std::ostream& +operator<<(std::ostream& s, const Grid& gr); + +} // namespace IO_Operators + +/*! \brief + Returns true 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 false is returned. +*/ +bool operator==(const Grid& x, const Grid& y); + +/*! \brief + Returns true 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 true 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 optimally supports: + - 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 explicit 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 + x and 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 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 + add_space_dimensions_and_embed: + \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 + add_space_dimensions_and_project: + \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 + add_space_dimensions_and_embed. + 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 + affine_image: + \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 + affine_preimage: + \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 + remove_space_dimensions: + \code + Grid_Generator_System gs; + gs.insert(grid_point(3*x + y +0*z + 2*w)); + Grid gr(gs); + Variables_Set to_be_removed; + to_be_removed.insert(y); + to_be_removed.insert(z); + gr.remove_space_dimensions(to_be_removed); + \endcode + The starting grid is the singleton set + \f$\bigl\{ (3, 1, 0, 2)^\transpose \bigr\} \sseq \Rset^4\f$, while + the resulting grid is + \f$\bigl\{ (3, 2)^\transpose \bigr\} \sseq \Rset^2\f$. + Be careful when removing space dimensions incrementally: + since dimensions are automatically renamed after each application + of the remove_space_dimensions operator, unexpected + results can be obtained. + For instance, by using the following code we would obtain + a different result: + \code + set to_be_removed1; + to_be_removed1.insert(y); + gr.remove_space_dimensions(to_be_removed1); + set to_be_removed2; + to_be_removed2.insert(z); + gr.remove_space_dimensions(to_be_removed2); + \endcode + In this case, the result is the grid + \f$\bigl\{(3, 0)^\transpose \bigr\} \sseq \Rset^2\f$: + when removing the set of dimensions \p to_be_removed2 + we are actually removing variable \f$w\f$ of the original grid. + For the same reason, the operator \p remove_space_dimensions + is not idempotent: removing twice the same non-empty set of dimensions + is never the same as removing them just once. +*/ + +class Parma_Polyhedra_Library::Grid { +public: + //! 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 const_gs + The system of generators defining the grid. + + \exception std::invalid_argument + Thrown if the system of generators is not empty but has no points. + + \exception std::length_error + Thrown if \p num_dimensions exceeds the maximum allowed space + dimension. + */ + explicit Grid(const Grid_Generator_System& const_gs); + + //! Builds a grid, recycling a system of grid generators. + /*! + The grid inherits the space dimension of the generator system. + + \param gs + 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& gs, 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 + explicit Grid(const Box& 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 + explicit Grid(const BD_Shape& 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 + explicit Grid(const Octagonal_Shape& os, + Complexity_Class complexity = ANY_COMPLEXITY); + + //! Builds a grid out of a generic, interval-based covering box. + /*! + The covering box is a set of upper and lower values for each + dimension. When a covering box is tiled onto empty space the + corners of the tiles form a rectilinear grid. + + A box interval with only one bound fixes the values of all grid + points in the dimension associated with the box to the value of + the bound. A box interval which has upper and lower bounds of + equal value allows all grid points with any value in the dimension + associated with the interval. The presence of a universe interval + results in the empty grid. The empty box produces the empty grid + of the same dimension as the box. + + \param box + The covering box representing the grid to be built; + + \param dummy + A dummy tag to make this constructor syntactically unique. + + \exception std::length_error + Thrown if the space dimension of \p box exceeds the maximum + allowed space dimension. + + \exception std::invalid_argument + Thrown if \p box contains any topologically open bounds. + + The template class Box must provide the following methods. + \code + dimension_type space_dimension() const + \endcode + returns the dimension of the vector space enclosing the grid + represented by the covering box. + \code + bool is_empty() const + \endcode + returns true if and only if the covering box + describes the empty set. + \code + bool get_lower_bound(dimension_type k, bool& closed, + Coefficient& n, Coefficient& d) const + \endcode + Let \f$I\f$ be the interval corresponding to the k-th + space dimension. If \f$I\f$ is not bounded from below, simply return + false. Otherwise, set closed, + n and d as follows: closed + is set to true if the lower boundary of \f$I\f$ + is closed and is set to false otherwise; + n and d are assigned the integers + \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$ + corresponds to the greatest lower bound of \f$I\f$. The fraction + \f$n/d\f$ is in canonical form if and only if \f$n\f$ and \f$d\f$ + have no common factors and \f$d\f$ is positive, \f$0/1\f$ being + the unique representation for zero. + \code + bool get_upper_bound(dimension_type k, bool& closed, + Coefficient& n, Coefficient& d) const + \endcode + Let \f$I\f$ be the interval corresponding to the k-th + space dimension. If \f$I\f$ is not bounded from above, simply return + false. Otherwise, set closed, + n and d as follows: closed + is set to true if the upper boundary of \f$I\f$ + is closed and is set to false otherwise; + n and d are assigned the integers + \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$ + corresponds to the least upper bound of \f$I\f$. + */ + template + Grid(const Box& box, From_Covering_Box dummy); + + /*! \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 true 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 true 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 true 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 true if and only if \p *this is bounded. + bool is_bounded() const; + + /*! \brief + Returns true if and only if \p *this + contains at least one integer point. + */ + bool contains_integer_point() const; + + /*! \brief + Returns true 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 true 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 true 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 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 + true if the supremum value can be reached in \p this. + Always true 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, + false 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 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 + true if the supremum value can be reached in \p this. + Always true 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, + false 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 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 + true if the is the infimum value can be reached in \p + this. Always true 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, + false 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 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 + true if the is the infimum value can be reached in \p + this. Always true 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, + false is returned and \p inf_n, \p inf_d, \p minimum + and \p point are left untouched. + */ + bool minimize(const Linear_Expression& expr, + Coefficient& inf_n, Coefficient& inf_d, bool& minimum, + Generator& point) const; + + //! Returns true 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 true 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; + + //! Writes the covering box for \p *this into \p box. + /*! + The covering box is a set of upper and lower values for each + dimension. When the covering box written into \p box is tiled + onto empty space the corners of the tiles form the sparsest + rectilinear grid that includes \p *this. + + The value of the lower bound of each interval of the resulting \p + box are as close as possible to the origin, with positive values + taking preference when the lowest positive value equals the lowest + negative value. + + If all the points have a single value in a particular dimension of + the grid then there is only a lower bound on the interval produced + in \p box, and the lower bound denotes the single value for the + dimension. If the coordinates of the points in a particular + dimension include every value then the upper and lower bounds of + the associated interval in \p box are set equal. The empty grid + produces the empty \p box. The zero dimension universe grid + produces the zero dimension universe box. + + \param box + The Box into which the covering box is written. + + \exception std::invalid_argument + Thrown if \p *this and \p box are dimension-incompatible. + */ + template + void get_covering_box(Box& box) const; + + //! Checks if all the invariants are satisfied. + /*! + \return + true if and only if \p *this satisfies all the + invariants and either \p check_not_empty is false or + \p *this is not empty. + + \param check_not_empty + true 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 std::cerr 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 congruence \p cg to the system of congruences of \p + *this, reducing the result + + \return + false if and only if the result is empty. + + \exception std::invalid_argument + Thrown if \p *this and congruence \p cg are dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_congruence_and_minimize(const Congruence& c); + + /*! \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); + + /*! \brief + Adds a copy of grid generator \p g to the system of generators of + \p *this, reducing the result. + + \return + false if and only if the result is empty. + + \exception std::invalid_argument + Thrown if \p *this and generator \p g are dimension-incompatible, + or if \p *this is an empty grid and \p g is not a point. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_grid_generator_and_minimize(const Grid_Generator& g); + + //! Adds a copy of each congruence in \p cgs to \p *this. + /*! + \param cgs + Contains the congruences that will be added to the system of + congruences of \p *this. + + \exception std::invalid_argument + Thrown if \p *this and \p cgs are dimension-incompatible. + */ + void add_congruences(const Congruence_System& cgs); + + //! Adds 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 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); + + /*! \brief + Adds a copy of the congruences in \p cgs to the system of + congruences of \p *this, reducing the result. + + \return + false if and only if the result is empty. + + \param cgs + Contains the congruences that will be added to the system of + congruences of \p *this. + + \exception std::invalid_argument + Thrown if \p *this and \p cgs are dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_congruences_and_minimize(const Congruence_System& cgs); + + /*! \brief + Adds the congruences in \p cgs to the system of congruences of \p + *this, reducing the result. + + \return + false if and only if the result is empty. + + \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. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_recycled_congruences_and_minimize(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 a congruence equivalent to constraint \p c, + also minimizing the result. + + \return + false if and only if the result is empty. + + \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. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_constraint_and_minimize(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 whcih 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, + minimizing the result. + + \return + false if and only if the result is empty. + + \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 whcih is not optimally supported + by the grid domain. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_constraints_and_minimize(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 whcih 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); + + /*! \brief + Adds to \p *this congruences equivalent to the constraints in \p cs, + minimizing the result. + + \return + false if and only if the result is empty. + + \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 whcih 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. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_recycled_constraints_and_minimize(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 + Adds a copy of the generators in \p gs to the system of generators + of \p *this, reducing the result. + + \return + false if and only if the result is empty. + + \param gs + Contains the generators that will be added to the system of + generators of \p *this. + + \exception std::invalid_argument + Thrown if \p *this and \p gs are dimension-incompatible, or if \p + *this is empty and the system of generators \p gs is not empty, + but has no points. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_grid_generators_and_minimize(const Grid_Generator_System& gs); + + /*! \brief + Adds the generators in \p gs to the system of generators of \p + *this, reducing the result. + + \return + false if and only if the result is empty. + + \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. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_recycled_grid_generators_and_minimize(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 to_be_unconstrained, + assigning the result to \p *this. + + \param to_be_unconstrained + 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 to_be_removed. + */ + void unconstrain(const Variables_Set& to_be_unconstrained); + + /*! \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 intersection of \p *this and \p y, + reducing the result. + + \return + false if and only if the result is empty. + + \exception std::invalid_argument + Thrown if \p *this and \p y are dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool intersection_assign_and_minimize(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 + Assigns to \p *this the least upper bound of \p *this and \p y, + reducing the result. + + \return + false if and only if the result is empty. + + \exception std::invalid_argument + Thrown if \p *this and \p y are dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool upper_bound_assign_and_minimize(const Grid& y); + + /*! \brief + If the upper bound of \p *this and \p y is exact it is assigned to \p + *this and true is returned, otherwise + false 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 Grid_Difference "grid-difference" of + \p *this and \p y. + + The grid difference between grids x and y is the smallest grid + containing all the points from x and y that are only in x. + + \exception std::invalid_argument + Thrown if \p *this and \p y are dimension-incompatible. + */ + void 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); + + //! 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 must 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 must 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 must 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 must be contained in \p *this; + + \param cgs + The system of congruences used to improve the widened grid; + + \param tp + An optional pointer to an unsigned variable storing the number of + available tokens (to be used when applying the + \ref Grid_Widening_with_Tokens "widening with tokens" delay technique). + + \exception std::invalid_argument + Thrown if \p *this, \p y and \p cs are dimension-incompatible. + */ + void limited_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 must be contained in \p *this; + + \param cgs + The system of congruences used to improve the widened grid; + + \param tp + An optional pointer to an unsigned variable storing the number of + available tokens (to be used when applying the + \ref Grid_Widening_with_Tokens "widening with tokens" delay technique). + + \exception std::invalid_argument + Thrown if \p *this, \p y and \p cs are dimension-incompatible. + */ + void limited_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 must be contained in \p *this; + + \param cgs + The system of congruences used to improve the widened grid; + + \param tp + An optional pointer to an unsigned variable storing the number of + available tokens (to be used when applying the + \ref Grid_Widening_with_Tokens "widening with tokens" delay technique). + + \exception std::invalid_argument + Thrown if \p *this, \p y and \p cs are dimension-incompatible. + */ + void limited_extrapolation_assign(const Grid& y, + const Congruence_System& cgs, + unsigned* tp = NULL); + + //@} // Space Dimension Preserving Member Functions that May Modify [...] + + //! \name Member Functions that May Modify the Dimension of the Vector Space + //@{ + + /*! \brief + Adds \p m new space dimensions and embeds the old grid in the new + vector space. + + \param m + The number of dimensions to add. + + \exception std::length_error + Thrown if adding \p m new space dimensions would cause the vector + space to exceed dimension max_space_dimension(). + + The new space dimensions will be those having the highest indexes + in the new grid, which is characterized by a system of congruences + in which the variables which are the new dimensions can have any + value. For instance, when starting from the grid \f$\cL \sseq + \Rset^2\f$ and adding a third space dimension, the result will be + the grid + \f[ + \bigl\{\, + (x, y, z)^\transpose \in \Rset^3 + \bigm| + (x, y)^\transpose \in \cL + \,\bigr\}. + \f] + */ + void add_space_dimensions_and_embed(dimension_type m); + + /*! \brief + Adds \p m new space dimensions to the grid and does not embed it + in the new vector space. + + \param m + The number of space dimensions to add. + + \exception std::length_error + Thrown if adding \p m new space dimensions would cause the + vector space to exceed dimension max_space_dimension(). + + The new space dimensions will be those having the highest indexes + in the new grid, which is characterized by a system of congruences + in which the variables running through the new dimensions are all + constrained to be equal to 0. For instance, when starting from + the grid \f$\cL \sseq \Rset^2\f$ and adding a third space + dimension, the result will be the grid + \f[ + \bigl\{\, + (x, y, 0)^\transpose \in \Rset^3 + \bigm| + (x, y)^\transpose \in \cL + \,\bigr\}. + \f] + */ + void add_space_dimensions_and_project(dimension_type m); + + /*! \brief + Assigns to \p *this the \ref Grid_Concatenate "concatenation" of + \p *this and \p y, taken in this order. + + \exception std::length_error + Thrown if the concatenation would cause the vector space + to exceed dimension max_space_dimension(). + */ + void concatenate_assign(const Grid& y); + + //! Removes all the specified dimensions from the vector space. + /*! + \param to_be_removed + The set of Variable objects corresponding to the space dimensions + to be removed. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with one of the + Variable objects contained in \p to_be_removed. + */ + void remove_space_dimensions(const Variables_Set& to_be_removed); + + /*! \brief + Removes the higher dimensions of the vector space so that the + resulting space will have dimension \p new_dimension. + + \exception std::invalid_argument + Thrown if \p new_dimensions is greater than the space dimension of + \p *this. + */ + void remove_higher_space_dimensions(dimension_type new_dimension); + + /*! \brief + Remaps the dimensions of the vector space according to + a \ref Grid_Map_Space_Dimensions "partial function". + + If \p pfunc maps only some of the dimensions of \p *this then the + rest will be projected away. + + If the highest dimension mapped to by \p pfunc is higher than the + highest dimension in \p *this then the number of dimensions in \p + *this will be increased to the highest dimension mapped to by \p + pfunc. + + \param pfunc + The partial function specifying the destiny of each space + dimension. + + The template class Partial_Function must provide the following + methods. + \code + bool has_empty_codomain() const + \endcode + returns true if and only if the represented partial + function has an empty codomain (i.e., it is always undefined). + The has_empty_codomain() method will always be called + before the methods below. However, if + has_empty_codomain() returns true, 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 max_in_codomain() 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 true is returned. If \f$f\f$ is + undefined in \f$k\f$, then false is returned. + This method is called at most \f$n\f$ times, where \f$n\f$ is the + dimension of the vector space enclosing the grid. + + The result is undefined if \p pfunc does not encode a partial + function with the properties described in the + \ref Grid_Map_Space_Dimensions "specification of the mapping operator". + */ + template + 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 max_space_dimension(). + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + and var has space dimension \f$k \leq n\f$, + then the \f$k\f$-th space dimension is + \ref Grid_Expand_Space_Dimension "expanded" to \p m new space dimensions + \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$. + */ + void expand_space_dimension(Variable var, dimension_type m); + + //! Folds the space dimensions in \p to_be_folded into \p var. + /*! + \param to_be_folded + The set of Variable objects corresponding to the space dimensions + to be folded; + + \param var + The variable corresponding to the space dimension that is the + destination of the folding operation. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with \p var or with + one of the Variable objects contained in \p to_be_folded. Also + thrown if \p var is contained in \p to_be_folded. + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + var has space dimension \f$k \leq n\f$, + \p to_be_folded is a set of variables whose maximum space dimension + is also less than or equal to \f$n\f$, and \p var is not a member + of \p to_be_folded, then the space dimensions corresponding to + variables in \p to_be_folded are \ref Grid_Fold_Space_Dimensions "folded" + into the \f$k\f$-th space dimension. + */ + void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var); + + //@} // Member Functions that May Modify the Dimension of the Vector Space + + friend bool operator==(const Grid& x, const Grid& y); + + friend class Parma_Polyhedra_Library::Grid_Certificate; + + template 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 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 true if successful, false 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 x == y, + then x.hash_code() == y.hash_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: + - zero-dim universe: the grid is the zero-dimension + vector space \f$\Rset^0 = \{\cdot\}\f$; + - empty: the grid is the empty set; + - congruences up-to-date: the grid is correctly + characterized by the attached system of congruences, modulo the + processing of pending generators; + - generators up-to-date: the grid is correctly + characterized by the attached system of generators, modulo the + processing of pending congruences; + - congruences minimized: the non-pending part of the system + of congruences attached to the grid is in minimal form; + - generators minimized: the non-pending part of the system + of generators attached to the grid is in minimal form. + + Other supported assertions are: + - congruences pending + - generators pending + - congruences' saturation matrix up-to-date + - generators' saturation matrix up-to-date. + + Not all the conjunctions of these elementary assertions constitute + a legal Status. In fact: + - zero-dim universe excludes any other assertion; + - empty: excludes any other assertion; + - congruences pending and generators pending + are mutually exclusive; + - congruences pending implies both congruences minimized + and generators minimized; + - generators pending implies both congruences minimized + and generators minimized; + - congruences minimized implies congruences up-to-date; + - generators minimized implies generators up-to-date; + - congruences' saturation matrix up-to-date implies both + congruences up-to-date and generators up-to-date; + - generators' saturation matrix up-to-date implies both + congruences up-to-date and generators up-to-date. +*/ +class Status { +public: + //! By default Status is the zero-dim universe 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 true if successful, false 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 all bits in \p mask are set. + bool test_all(flags_t mask) const; + + //! Check whether at least one 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 2166. */ +#undef PPL_IN_Grid_CLASS + + //! The status flags to keep track of the grid's internal state. + Status status; + + //! The number of dimensions of the enclosing vector space. + dimension_type space_dim; + + enum Dimension_Kind { + PARAMETER, + LINE, + GEN_VIRTUAL, + PROPER_CONGRUENCE = PARAMETER, + CON_VIRTUAL = LINE, + EQUALITY = GEN_VIRTUAL + }; + + typedef std::vector Dimension_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 true if the grid is known to be empty. + /*! + The return value false does not necessarily + implies that \p *this is non-empty. + */ + bool marked_empty() const; + + //! Returns true if the system of congruences is up-to-date. + bool congruences_are_up_to_date() const; + + //! Returns true if the system of generators is up-to-date. + bool generators_are_up_to_date() const; + + //! Returns true if the system of congruences is minimized. + bool congruences_are_minimized() const; + + //! Returns true 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 + false 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 + false 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 true 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 true if and only if \p from_above is + true and \p expr is bounded from above in \p *this, + or \p from_above is false 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 + true 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, false 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 + Adds the congruence \p cg to \p *this. + + \warning + If \p cg and \p *this are dimension-incompatible, + 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 + add_space_dimensions_and_embed(). + */ + 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 + add_space_dimensions_and_project(). + */ + 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 true if \p cgs represents the empty set, + otherwise returns false. + */ + static bool simplify(Congruence_System& cgs, + Dimension_Kinds& dim_kinds); + + //! Converts \p gs to lower triangular (i.e. minimized) form. + /*! + Expects \p gs to contain at least one point. + */ + static void simplify(Grid_Generator_System& gs, + Dimension_Kinds& dim_kinds); + + //! Reduces the line \p row using the line \p pivot. + /*! + Uses the line \p pivot to change the representation of the line \p + row so that the element at index \p col of \p row is zero. + */ + // A member of Grid for access to Matrix::rows. + static void reduce_line_with_line(Grid_Generator& row, + Grid_Generator& pivot, + dimension_type col); + + //! Reduces the equality \p row using the equality \p pivot. + /*! + Uses the equality \p pivot to change the representation of the + equality \p row so that the element at index \p col of \p row is + zero. + */ + // A member of Grid for access to Matrix::rows. + static void reduce_equality_with_equality(Congruence& row, + const Congruence& pivot, + dimension_type col); + + //! Reduces \p row using \p pivot. + /*! + Uses the point, parameter or proper congruence at \p pivot to + change the representation of the point, parameter or proper + congruence at \p row so that the element at index \p col of \p row + is zero. Only elements from index \p start to index \p end are + modified (i.e. it is assumed that all other elements are zero). + */ + // Part of Grid for access to Matrix::rows. + template + static void reduce_pc_with_pc(R& row, + R& pivot, + dimension_type col, + dimension_type start, + dimension_type end); + + //! Reduce \p row using \p pivot. + /*! + Use the line \p pivot to change the representation of the + parameter \p row such that the element at index \p col of \p row + is zero. + */ + // A member of Grid for access to Matrix::rows. + static void reduce_parameter_with_line(Grid_Generator& row, + const Grid_Generator& pivot, + dimension_type col, + Grid_Generator_System& sys); + + //! Reduce \p row using \p pivot. + /*! + Use the equality \p pivot to change the representation of the + congruence \p row such that element at index \p col of \p row is + zero. + */ + // A member of Grid for access to Matrix::rows. + static void reduce_congruence_with_equality(Congruence& row, + const Congruence& pivot, + dimension_type col, + Congruence_System& 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). + + Only consider from index \p start to index \p end of the row at \p + pivot_index. Flag \p generators indicates whether \p sys is a + congruence or generator system. + */ + template + static void reduce_reduced(M& sys, dimension_type dim, + dimension_type pivot_index, + dimension_type start, dimension_type end, + const Dimension_Kinds& dim_kinds, + bool generators = true); + + //! Multiply the elements of \p dest by \p multiplier. + // A member of Grid for access to Matrix::rows and cgs::operator[]. + static void multiply_grid(const Coefficient& multiplier, + Congruence& cg, Congruence_System& dest, + dimension_type num_rows, + dimension_type num_dims); + + //! Multiply the elements of \p dest by \p multiplier. + // A member of Grid for access to Grid_Generator::operator[]. + static void multiply_grid(const Coefficient& multiplier, + Grid_Generator& gen, + Grid_Generator_System& dest, + dimension_type num_rows, + dimension_type num_dims); + + /*! \brief + If \p sys is lower triangular return true, else + return false. + */ + static bool lower_triangular(const Congruence_System& sys, + const Dimension_Kinds& dim_kinds); + + /*! \brief + If \p sys is upper triangular return true, else + return false. + */ + 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 true, + else return false. \p row_size gives the number of + columns in each row. + + This method is only used in assertions in the simplify methods. + */ + template + 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_runtime_error(const char* method) const; + void throw_invalid_argument(const char* method, const char* reason) const; + + void throw_dimension_incompatible(const char* method, + const char* other_name, + dimension_type other_dim) const; + void throw_dimension_incompatible(const char* method, + const char* gr_name, + const Grid& gr) const; + void throw_dimension_incompatible(const char* method, + const char* e_name, + const Linear_Expression& e) const; + void throw_dimension_incompatible(const char* method, + const char* cg_name, + const Congruence& cg) const; + void throw_dimension_incompatible(const char* method, + const char* c_name, + const Constraint& c) const; + void throw_dimension_incompatible(const char* method, + const char* g_name, + const Grid_Generator& g) const; + void throw_dimension_incompatible(const char* method, + const char* 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; + + // Note: it has to be a static method, because it can be called inside + // constructors (before actually constructing the grid object). + static void throw_space_dimension_overflow(const char* method, + const char* reason); + + void throw_invalid_constraint(const char* method, + const char* c_name) const; + void throw_invalid_constraints(const char* method, + const char* cs_name) const; + 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) + +}; + + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Grid */ +void swap(Parma_Polyhedra_Library::Grid& x, + Parma_Polyhedra_Library::Grid& y); + +} // namespace std + +/* Automatically generated from PPL source file ../src/Grid_Status.inlines.hh line 1. */ +/* Grid::Status class implementation: inline functions. +*/ + + +namespace Parma_Polyhedra_Library { + +inline +Grid::Status::Status(flags_t mask) + : flags(mask) { +} + +inline +Grid::Status::Status() + : flags(ZERO_DIM_UNIV) { +} + +inline bool +Grid::Status::test_all(flags_t mask) const { + return (flags & mask) == mask; +} + +inline bool +Grid::Status::test_any(flags_t mask) const { + return flags & mask; +} + +inline void +Grid::Status::set(flags_t mask) { + flags |= mask; +} + +inline void +Grid::Status::reset(flags_t mask) { + flags &= ~mask; +} + +inline bool +Grid::Status::test_zero_dim_univ() const { + return flags == ZERO_DIM_UNIV; +} + +inline void +Grid::Status::reset_zero_dim_univ() { + // This is a no-op if the current status is not zero-dim. + if (flags == ZERO_DIM_UNIV) + // In the zero-dim space, if it is not the universe it is empty. + flags = EMPTY; +} + +inline void +Grid::Status::set_zero_dim_univ() { + // Zero-dim universe is incompatible with anything else. + flags = ZERO_DIM_UNIV; +} + +inline bool +Grid::Status::test_empty() const { + return test_any(EMPTY); +} + +inline void +Grid::Status::reset_empty() { + reset(EMPTY); +} + +inline void +Grid::Status::set_empty() { + flags = EMPTY; +} + +inline bool +Grid::Status::test_c_up_to_date() const { + return test_any(C_UP_TO_DATE); +} + +inline void +Grid::Status::reset_c_up_to_date() { + reset(C_UP_TO_DATE); +} + +inline void +Grid::Status::set_c_up_to_date() { + set(C_UP_TO_DATE); +} + +inline bool +Grid::Status::test_g_up_to_date() const { + return test_any(G_UP_TO_DATE); +} + +inline void +Grid::Status::reset_g_up_to_date() { + reset(G_UP_TO_DATE); +} + +inline void +Grid::Status::set_g_up_to_date() { + set(G_UP_TO_DATE); +} + +inline bool +Grid::Status::test_c_minimized() const { + return test_any(C_MINIMIZED); +} + +inline void +Grid::Status::reset_c_minimized() { + reset(C_MINIMIZED); +} + +inline void +Grid::Status::set_c_minimized() { + set(C_MINIMIZED); +} + +inline bool +Grid::Status::test_g_minimized() const { + return test_any(G_MINIMIZED); +} + +inline void +Grid::Status::reset_g_minimized() { + reset(G_MINIMIZED); +} + +inline void +Grid::Status::set_g_minimized() { + set(G_MINIMIZED); +} + + +inline bool +Grid::Status::test_c_pending() const { + return test_any(CS_PENDING); +} + +inline void +Grid::Status::reset_c_pending() { + reset(CS_PENDING); +} + +inline void +Grid::Status::set_c_pending() { + set(CS_PENDING); +} + +inline bool +Grid::Status::test_g_pending() const { + return test_any(GS_PENDING); +} + +inline void +Grid::Status::reset_g_pending() { + reset(GS_PENDING); +} + +inline void +Grid::Status::set_g_pending() { + set(GS_PENDING); +} + + +inline bool +Grid::Status::test_sat_c_up_to_date() const { + return test_any(SAT_C_UP_TO_DATE); +} + +inline void +Grid::Status::reset_sat_c_up_to_date() { + reset(SAT_C_UP_TO_DATE); +} + +inline void +Grid::Status::set_sat_c_up_to_date() { + set(SAT_C_UP_TO_DATE); +} + +inline bool +Grid::Status::test_sat_g_up_to_date() const { + return test_any(SAT_G_UP_TO_DATE); +} + +inline void +Grid::Status::reset_sat_g_up_to_date() { + reset(SAT_G_UP_TO_DATE); +} + +inline void +Grid::Status::set_sat_g_up_to_date() { + set(SAT_G_UP_TO_DATE); +} + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Grid.inlines.hh line 1. */ +/* Grid class implementation: inline functions. +*/ + + +/* Automatically generated from PPL source file ../src/Grid.inlines.hh line 29. */ +#include + +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::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(num_dimensions > max_space_dimension() + ? (throw_space_dimension_overflow("Grid(n, k)", + "n exceeds the maximum " + "allowed space dimension"), + 0) + : num_dimensions) { + construct(num_dimensions, kind); + assert(OK()); +} + +inline +Grid::Grid(const Congruence_System& cgs) + : con_sys(cgs.space_dimension() > max_space_dimension() + ? throw_space_dimension_overflow("Grid(cgs)", + "the space dimension of cgs " + "exceeds the maximum allowed " + "space dimension"), 0 + : cgs.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(cgs.space_dimension() > max_space_dimension() + ? throw_space_dimension_overflow("Grid(cgs, recycle)", + "the space dimension of cgs " + "exceeds the maximum allowed " + "space dimension"), 0 + : cgs.space_dimension()), + gen_sys(cgs.space_dimension()) { + construct(cgs); +} + +inline +Grid::Grid(const Grid_Generator_System& ggs) + : con_sys(ggs.space_dimension() > max_space_dimension() + ? throw_space_dimension_overflow("Grid(ggs)", + "the space dimension of ggs " + "exceeds the maximum allowed " + "space dimension"), 0 + : ggs.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(ggs.space_dimension() > max_space_dimension() + ? throw_space_dimension_overflow("Grid(ggs, recycle)", + "the space dimension of ggs " + "exceeds the maximum allowed " + "space dimension"), 0 + : ggs.space_dimension()), + gen_sys(ggs.space_dimension()) { + construct(ggs); +} + +template +inline +Grid::Grid(const BD_Shape& bd, + Complexity_Class) + : con_sys(bd.space_dimension() > max_space_dimension() + ? throw_space_dimension_overflow("Grid(bd)", + "the space dimension of bd " + "exceeds the maximum allowed " + "space dimension"), 0 + : bd.space_dimension()), + gen_sys(bd.space_dimension()) { + Congruence_System cgs = bd.congruences(); + construct(cgs); +} + +template +inline +Grid::Grid(const Octagonal_Shape& os, + Complexity_Class) + : con_sys(os.space_dimension() > max_space_dimension() + ? throw_space_dimension_overflow("Grid(os)", + "the space dimension of os " + "exceeds the maximum allowed " + "space dimension"), 0 + : os.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 space_dimension() & 0x7fffffff; +} + +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::swap(Grid& y) { + std::swap(con_sys, y.con_sys); + std::swap(gen_sys, y.gen_sys); + std::swap(status, y.status); + std::swap(space_dim, y.space_dim); + std::swap(dim_kinds, y.dim_kinds); +} + +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 bool +Grid::add_congruences_and_minimize(const Congruence_System& cgs) { + Congruence_System cgs_copy = cgs; + return add_recycled_congruences_and_minimize(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 bool +Grid::add_constraint_and_minimize(const Constraint& c) { + add_constraint(c); + return minimize(); +} + +inline bool +Grid::add_constraints_and_minimize(const Constraint_System& cs) { + add_constraints(cs); + return minimize(); +} + +inline void +Grid::add_recycled_constraints(Constraint_System& cs) { + // TODO: really recycle the constraints. + add_constraints(cs); +} + +inline bool +Grid::add_recycled_constraints_and_minimize(Constraint_System& cs) { + add_constraints(cs); + return minimize(); +} + +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() { + return; +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Grid */ +inline void +swap(Parma_Polyhedra_Library::Grid& x, + Parma_Polyhedra_Library::Grid& y) { + x.swap(y); +} + +} // namespace std + +/* Automatically generated from PPL source file ../src/Grid.templates.hh line 1. */ +/* Grid class implementation: inline functions. +*/ + + +/* Automatically generated from PPL source file ../src/Grid.templates.hh line 29. */ +#include +#include + +namespace Parma_Polyhedra_Library { + +template +Grid::Grid(const Box& box, + Complexity_Class) + : con_sys(), + gen_sys() { + if (box.space_dimension() > max_space_dimension()) + throw_space_dimension_overflow("Grid(box, from_bounding_box)", + "the space dimension of box " + "exceeds the maximum allowed " + "space dimension"); + + space_dim = box.space_dimension(); + + if (box.is_empty()) { + // Empty grid. + set_empty(); + assert(OK()); + return; + } + + if (space_dim == 0) + set_zero_dim_univ(); + else { + // Initialize the space dimension as indicated by the box. + con_sys.increase_space_dimension(space_dim); + // Add congruences 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(0*Variable(space_dim-1))); + Grid_Generator& point = gen_sys[0]; + for (dimension_type k = space_dim; k-- > 0; ) { + bool closed = false; + // TODO: Consider producing the system(s) in minimized form. + if (box.get_lower_bound(k, closed, l_n, l_d)) { + if (box.get_upper_bound(k, closed, u_n, u_d)) + if (l_n * u_d == u_n * l_d) { + // A point interval sets dimension k of every point to a + // single value. + con_sys.insert(l_d * Variable(k) == l_n); + + // 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[k + 1] = l_n * u_n; + + continue; + } + } + // A universe interval allows any value in dimension k. + gen_sys.insert(grid_line(Variable(k))); + } + set_congruences_up_to_date(); + set_generators_up_to_date(); + gen_sys.unset_pending_rows(); + gen_sys.set_sorted(false); + } + + assert(OK()); +} + +template +Grid::Grid(const Box& box, From_Covering_Box) + : con_sys(), + gen_sys() { + + if (box.space_dimension() > max_space_dimension()) + throw_space_dimension_overflow("Grid(box, from_covering_box)", + "the space dimension of box " + "exceeds the maximum allowed " + "space dimension"); + + space_dim = box.space_dimension(); + + PPL_DIRTY_TEMP_COEFFICIENT(l_n); + PPL_DIRTY_TEMP_COEFFICIENT(l_d); + + // FIXME: consider whether or not covering boxes supporting open + // boundaries should be disabled at compile time. If that is not + // the case, consider if the test !box.is_topologically_closed() + // can replace the whole loop here below. + + // Check that no finite bounds is open. This check must be done before + // the empty test below, as an open bound might mean an empty box. + for (dimension_type k = space_dim; k-- > 0; ) { + bool closed = false; + if (box.get_lower_bound(k, closed, l_n, l_d) && !closed) + throw_invalid_argument("Grid(box, from_covering_box)", "box"); + if (box.get_upper_bound(k, closed, l_n, l_d) && !closed) + throw_invalid_argument("Grid(box, from_covering_box)", "box"); + } + + if (box.is_empty()) { + // Empty grid. + set_empty(); + assert(OK()); + return; + } + + if (space_dim == 0) + set_zero_dim_univ(); + else { + // Initialize the space dimension as indicated by the box. + con_sys.increase_space_dimension(space_dim); + // Add congruences according to `box'. + PPL_DIRTY_TEMP_COEFFICIENT(u_n); + PPL_DIRTY_TEMP_COEFFICIENT(u_d); + PPL_DIRTY_TEMP_COEFFICIENT(d); + gen_sys.insert(grid_point(0*Variable(space_dim-1))); + Grid_Generator& point = gen_sys[0]; + for (dimension_type k = space_dim; k-- > 0; ) { + bool closed = false; + // TODO: Consider producing the system(s) in minimized form. + if (box.get_lower_bound(k, closed, l_n, l_d)) { + + const Coefficient& point_divisor = point.divisor(); + assert(l_d > 0); + assert(point_divisor > 0); + // Use `d' to hold the gcd. + gcd_assign(d, l_d, point_divisor); + // Scale the point to use as divisor the lcm of the existing + // point divisor and the divisor of the lower bound. + exact_div_assign(d, point_divisor, d); + // l_d * d == abs(l_d) * (point_divisor / gcd(l_d, point_divisor)) + point.scale_to_divisor(l_d * d); + // Set dimension k of the point to the lower bound. + // point[k + 1] = l_n * (point_divisor / gcd(l_d, point_divisor)) + point[k + 1] = l_n * d; + + if (box.get_upper_bound(k, closed, u_n, u_d)) { + if (l_n * u_d == u_n * l_d) { + // A point interval allows any point along the dimension + // k axis. + gen_sys.insert(grid_line(Variable(k))); + continue; + } + assert(l_d > 0); + assert(u_d > 0); + gcd_assign(d, l_d, u_d); + // `d' is the gcd of the divisors. + exact_div_assign(l_d, l_d, d); + exact_div_assign(d, u_d, d); + l_n *= d; + // `l_d' is now the smallest integer expression of the size of + // the original l_d relative to u_d. + u_n = (u_n * l_d) - l_n; + // `u_n' is now the distance between u_n and l_n (given a + // divisor of lcm of l_d and u_d. + l_d *= u_d; + // `l_d' is now the lcm of the divisors. + con_sys.insert((l_d * Variable(k) %= l_n) / u_n); + gen_sys.insert(parameter(u_n * Variable(k), l_d)); + } + else + // An interval bounded only from below produces an + // equality. + con_sys.insert(l_d * Variable(k) == l_n); + } + else + if (box.get_upper_bound(k, closed, u_n, u_d)) { + const Coefficient& point_divisor = point.divisor(); + assert(u_d > 0); + assert(point_divisor > 0); + // Use `d' to hold the gcd. + gcd_assign(d, u_d, point_divisor); + // Scale the point to use as divisor the lcm of the existing + // point divisor and the divisor of the lower bound. + exact_div_assign(d, point_divisor, d); + // u_d * d == abs(u_d) * (point_divisor / gcd(u_d, point_divisor)) + point.scale_to_divisor(u_d * d); + // Set dimension k of the point to the lower bound. + // point[k + 1] = u_n * (point_divisor / gcd(u_d, point_divisor)) + point[k + 1] = u_n * d; + + // An interval bounded only from above produces an equality. + con_sys.insert(u_d * Variable(k) == u_n); + } + else { + // Any universe interval produces an empty grid. + set_empty(); + assert(OK()); + return; + } + } + normalize_divisors(gen_sys); + set_congruences_up_to_date(); + set_generators_up_to_date(); + gen_sys.set_sorted(false); + gen_sys.unset_pending_rows(); + } + + assert(OK()); +} + +template +void +Grid::get_covering_box(Box& box) const { + // Dimension-compatibility check. + if (space_dim > box.space_dimension()) + throw_dimension_incompatible("get_covering_box(box)", "box", + box.space_dimension()); + + Box new_box(box.space_dimension()); + + if (marked_empty()) { + box = new_box; + box.set_empty(); + return; + } + if (space_dim == 0) { + return; + } + if (!generators_are_up_to_date() && !update_generators()) { + // Updating found the grid empty. + box = new_box; + box.set_empty(); + return; + } + + assert(!gen_sys.has_no_rows()); + + dimension_type num_dims = gen_sys.num_columns() - 2 /* parameter divisor */; + dimension_type num_rows = gen_sys.num_rows(); + + PPL_DIRTY_TEMP_COEFFICIENT(gcd); + PPL_DIRTY_TEMP_COEFFICIENT(bound); + + if (num_rows > 1) { + Row interval_sizes(num_dims, Row::Flags()); + std::vector interval_emptiness(num_dims, false); + + // Store in `interval_sizes', for each column (that is, for each + // dimension), the GCD of all the values in that column where the + // row is of type parameter. + + for (dimension_type dim = num_dims; dim-- > 0; ) + interval_sizes[dim] = 0; + const Grid_Generator *first_point = NULL; + for (dimension_type row = 0; row < num_rows; ++row) { + Grid_Generator& gen = const_cast(gen_sys[row]); + if (gen.is_line()) { + for (dimension_type dim = 0; dim < num_dims; ++dim) + if (!interval_emptiness[dim] && gen[dim+1] != 0) { + // Empty interval, set both bounds for associated + // dimension to zero. + new_box.add_constraint(Variable(dim) == 0); + interval_emptiness[dim] = true; + } + continue; + } + if (gen.is_point()) { + if (first_point == NULL) { + first_point = &gen_sys[row]; + continue; + } + const Grid_Generator& point = *first_point; + // Convert the point `gen' to a parameter. + dimension_type dim = num_dims; + do { + gen[dim] -= point[dim]; + } + while (dim-- > 0); + gen.set_divisor(point.divisor()); + } + for (dimension_type dim = num_dims; dim-- > 0; ) + if (!interval_emptiness[dim]) + gcd_assign(interval_sizes[dim], interval_sizes[dim], gen[dim+1]); + } + + // For each dimension set the lower bound of the interval to the + // grid value closest to the origin, and the upper bound to the + // addition of the lower bound and the shortest distance in the + // given dimension between any two grid points. + const Grid_Generator& point = *first_point; + const Coefficient& divisor = point.divisor(); + PPL_DIRTY_TEMP_COEFFICIENT(lower_bound); + for (dimension_type dim = num_dims; dim-- > 0; ) { + if (interval_emptiness[dim]) + continue; + + lower_bound = point[dim+1]; + + // If the interval size is zero then all points have the same + // value in this dimension, so set only the lower bound. + if (interval_sizes[dim] != 0) { + // Make the lower bound as close as possible to the origin, + // leaving the sign the same. + lower_bound %= interval_sizes[dim]; + // Check if the lowest value the other side of the origin is + // closer to the origin, preferring the lowest positive if they + // are equal. + if (lower_bound > 0) { + if (interval_sizes[dim] - lower_bound < lower_bound) + lower_bound -= interval_sizes[dim]; + } + else if (lower_bound < 0 + && interval_sizes[dim] + lower_bound < - lower_bound) + lower_bound += interval_sizes[dim]; + + // Reduce the bound fraction first. + bound = interval_sizes[dim] + lower_bound; + gcd_assign(gcd, bound, divisor); + exact_div_assign(bound, bound, gcd); + exact_div_assign(gcd, divisor, gcd); + // `gcd' now holds the reduced divisor. + new_box.add_constraint(gcd*Variable(dim) <= bound); + } + + // Reduce the bound fraction first. + gcd_assign(gcd, lower_bound, divisor); + exact_div_assign(lower_bound, lower_bound, gcd); + exact_div_assign(gcd, divisor, gcd); + // `gcd' now holds the reduced divisor. + new_box.add_constraint(gcd*Variable(dim) >= lower_bound); + } + } + else { + const Grid_Generator& point = gen_sys[0]; + const Coefficient& divisor = point.divisor(); + // The covering box of a single point has only lower bounds. + for (dimension_type dim = num_dims; dim-- > 0; ) { + // Reduce the bound fraction first. + gcd_assign(gcd, point[dim+1], divisor); + exact_div_assign(bound, point[dim+1], gcd); + exact_div_assign(gcd, divisor, gcd); + // `gcd' now holds the reduced divisor. + new_box.add_constraint(gcd*Variable(dim) >= bound); + } + } + + box.swap(new_box); +} + +template +void +Grid::map_space_dimensions(const Partial_Function& pfunc) { + if (space_dim == 0) + return; + + if (pfunc.has_empty_codomain()) { + // All dimensions vanish: the grid becomes zero_dimensional. + if (marked_empty() + || (!generators_are_up_to_date() && !update_generators())) { + // Removing all dimensions from the empty grid. + space_dim = 0; + set_empty(); + } + else + // Removing all dimensions from a non-empty grid. + set_zero_dim_univ(); + + assert(OK()); + return; + } + + dimension_type new_space_dimension = pfunc.max_in_codomain() + 1; + + if (new_space_dimension == space_dim) { + // The partial function `pfunc' is indeed total and thus specifies + // a permutation, that is, a renaming of the dimensions. For + // maximum efficiency, we will simply permute the columns of the + // constraint system and/or the generator system. + + // We first compute suitable permutation cycles for the columns of + // the `con_sys' and `gen_sys' matrices. We will represent them + // with a linear array, using 0 as a terminator for each cycle + // (notice that the columns with index 0 of `con_sys' and + // `gen_sys' represent the inhomogeneous terms, and thus are + // unaffected by the permutation of dimensions). + // Cycles of length 1 will be omitted so that, in the worst case, + // we will have `space_dim' elements organized in `space_dim/2' + // cycles, which means we will have at most `space_dim/2' + // terminators. + std::vector cycles; + cycles.reserve(space_dim + space_dim/2); + + // Used to mark elements as soon as they are inserted in a cycle. + std::deque visited(space_dim); + + for (dimension_type i = space_dim; i-- > 0; ) { + if (!visited[i]) { + dimension_type j = i; + do { + visited[j] = true; + // The following initialization is only to make the compiler happy. + dimension_type k = 0; + if (!pfunc.maps(j, k)) + throw_invalid_argument("map_space_dimensions(pfunc)", + " pfunc is inconsistent"); + if (k == j) + // Cycle of length 1: skip it. + goto skip; + + cycles.push_back(j+1); + // Go along the cycle. + j = k; + } while (!visited[j]); + // End of cycle: mark it. + cycles.push_back(0); + skip: + ; + } + } + + // If `cycles' is empty then `pfunc' is the identity. + if (cycles.empty()) + return; + + // Permute all that is up-to-date. + if (congruences_are_up_to_date()) { + con_sys.permute_columns(cycles); + clear_congruences_minimized(); + } + + if (generators_are_up_to_date()) { + gen_sys.permute_columns(cycles); + clear_generators_minimized(); + } + + assert(OK()); + return; + } + + // If control gets here, then `pfunc' is not a permutation and some + // dimensions must be projected away. + + const Grid_Generator_System& old_gensys = grid_generators(); + + if (old_gensys.has_no_rows()) { + // The grid is empty. + Grid new_grid(new_space_dimension, EMPTY); + std::swap(*this, new_grid); + assert(OK()); + return; + } + + // Make a local copy of the partial function. + std::vector pfunc_maps(space_dim, not_a_dimension()); + for (dimension_type j = space_dim; j-- > 0; ) { + dimension_type pfunc_j; + if (pfunc.maps(j, pfunc_j)) + pfunc_maps[j] = pfunc_j; + } + + Grid_Generator_System new_gensys; + // Set sortedness, for the assertion met via gs::insert. + new_gensys.set_sorted(false); + // Get the divisor of the first point. + Grid_Generator_System::const_iterator i; + Grid_Generator_System::const_iterator old_gensys_end = old_gensys.end(); + for (i = old_gensys.begin(); i != old_gensys_end; ++i) + if (i->is_point()) + break; + assert(i != old_gensys_end); + const Coefficient& system_divisor = i->divisor(); + for (i = old_gensys.begin(); i != old_gensys_end; ++i) { + const Grid_Generator& old_g = *i; + Linear_Expression e(0 * Variable(new_space_dimension-1)); + bool all_zeroes = true; + for (dimension_type j = space_dim; j-- > 0; ) { + if (old_g.coefficient(Variable(j)) != 0 + && pfunc_maps[j] != not_a_dimension()) { + e += Variable(pfunc_maps[j]) * old_g.coefficient(Variable(j)); + all_zeroes = false; + } + } + switch (old_g.type()) { + case Grid_Generator::LINE: + if (!all_zeroes) + new_gensys.insert(grid_line(e)); + break; + case Grid_Generator::PARAMETER: + if (!all_zeroes) + new_gensys.insert(parameter(e, system_divisor)); + break; + case Grid_Generator::POINT: + new_gensys.insert(grid_point(e, old_g.divisor())); + break; + case Grid_Generator::CLOSURE_POINT: + default: + assert(0); + } + } + + Grid new_grid(new_gensys); + std::swap(*this, new_grid); + + assert(OK(true)); +} + +// Needed for converting the congruence or grid_generator system +// to "strong minimal form". +template +void +Grid::reduce_reduced(M& sys, + const dimension_type dim, + const dimension_type pivot_index, + const dimension_type start, + const dimension_type end, + const Dimension_Kinds& dim_kinds, + const bool generators) { + R& pivot = sys[pivot_index]; + + const Coefficient& pivot_dim = pivot[dim]; + + if (pivot_dim == 0) + return; + + PPL_DIRTY_TEMP_COEFFICIENT(pivot_dim_half); + pivot_dim_half = (pivot_dim + 1) / 2; + Dimension_Kind row_kind = dim_kinds[dim]; + Dimension_Kind line_or_equality, virtual_kind; + int jump; + if (generators) { + line_or_equality = LINE; + virtual_kind = GEN_VIRTUAL; + jump = -1; + } + else { + line_or_equality = EQUALITY; + virtual_kind = CON_VIRTUAL; + jump = 1; + } + + PPL_DIRTY_TEMP_COEFFICIENT(num_rows_to_subtract); + PPL_DIRTY_TEMP_COEFFICIENT(row_dim_remainder); + for (dimension_type row_index = pivot_index, kinds_index = dim + jump; + row_index-- > 0; + kinds_index += jump) { + // Move over any virtual rows. + while (dim_kinds[kinds_index] == virtual_kind) + kinds_index += jump; + + // row_kind CONGRUENCE is included as PARAMETER + if (row_kind == line_or_equality + || (row_kind == PARAMETER + && dim_kinds[kinds_index] == PARAMETER)) { + R& row = sys[row_index]; + + const Coefficient& row_dim = row[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) + for (dimension_type col = start; col <= end; ++col) + sub_mul_assign(row[col], num_rows_to_subtract, pivot[col]); + } + } +} + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Grid.defs.hh line 2783. */ + +/* 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_Interval.hh line 1. */ +/* Rational_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 27. */ + +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 +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 +struct Has_Assign_Or_Swap::type> + : public True { +}; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/assign_or_swap.hh line 29. */ + +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 +inline typename Enable_If::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 +inline typename Enable_If::value + && !Slow_Copy::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 std::swap(). +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +inline typename Enable_If::value + && Slow_Copy::value, void>::type +assign_or_swap(T& to, T& from) { + std::swap(to, from); +} + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Interval.types.hh line 1. */ + + +namespace Parma_Polyhedra_Library { + +template +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 27. */ + +namespace Parma_Polyhedra_Library { + +namespace Boundary_NS { + +struct Unbounded { + Unbounded() { + } +}; + +const Unbounded UNBOUNDED; + +struct Property { + enum Type { + SPECIAL_, + OPEN_, + NORMALIZED_ + }; + 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_); +static const Property NORMALIZED(Property::NORMALIZED_); + +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(t | ROUND_FPU_CHECK_INEXACT); + else + return static_cast(t); +} + +template +inline Result +special_set_boundary_infinity(Boundary_Type type, T&, Info& info) { + assert(Info::store_special); + info.set_boundary_property(type, SPECIAL); + return V_EQ; +} + +template +inline bool +special_is_boundary_infinity(Boundary_Type, const T&, const Info&) { + return true; +} + +template +inline bool +special_is_open(Boundary_Type, const T&, const Info&) { + return !Info::may_contain_infinity; +} + +template +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 +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 +inline Result +set_unbounded(Boundary_Type type, T& x, Info& info) { + PPL_COMPILE_TIME_CHECK(Info::store_special + || std::numeric_limits::is_bounded + || std::numeric_limits::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 (r == V_EQ && !Info::may_contain_infinity) + info.set_boundary_property(type, OPEN); + return r; +} + +template +inline Result +set_minus_infinity(Boundary_Type type, T& x, Info& info, bool open = false) { + /* + PPL_COMPILE_TIME_CHECK(Info::store_special + || std::numeric_limits::has_infinity, + "minus infinity is not representable"); + */ + if (open) + assert(type == LOWER); + else + assert(Info::may_contain_infinity); + Result r; + if (Info::store_special) { + assert(type == LOWER); + r = special_set_boundary_infinity(type, x, info); + } + else + r = assign_r(x, MINUS_INFINITY, round_dir_check(type)); + assert(r != VC_MINUS_INFINITY); + if (open || r != V_EQ) + info.set_boundary_property(type, OPEN); + return r; +} + +template +inline Result +set_plus_infinity(Boundary_Type type, T& x, Info& info, bool open = false) { + /* + PPL_COMPILE_TIME_CHECK(Info::store_special + || std::numeric_limits::has_infinity, + "minus infinity is not representable"); + */ + if (open) + assert(type == UPPER); + else + assert(Info::may_contain_infinity); + Result r; + if (Info::store_special) { + assert(type == UPPER); + r = special_set_boundary_infinity(type, x, info); + } + else + r = assign_r(x, PLUS_INFINITY, round_dir_check(type)); + assert(r != VC_MINUS_INFINITY); + if (open || r != V_EQ) + info.set_boundary_property(type, OPEN); + return r; +} + +template +inline Result +set_boundary_infinity(Boundary_Type type, T& x, Info& info, bool open = false) { + 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)); + assert(r == V_EQ); + if (open) + info.set_boundary_property(type, OPEN); + return r; +} + +template +inline Result +shrink(Boundary_Type type, T& x, Info& info, bool check) { + Result r; + assert(!info.get_boundary_property(type, SPECIAL)); + if (type == LOWER) { + r = info.restrict(round_dir_check(type, check), x, V_GT); + if (r != V_GT) + return r; + } else { + r = info.restrict(round_dir_check(type, check), x, V_LT); + if (r != V_LT) + return r; + } + info.set_boundary_property(type, OPEN); + return r; +} + +template +inline bool +is_unbounded(Boundary_Type type, const T& x, const Info& info) { + if (Info::store_special) + return info.get_boundary_property(type, SPECIAL) + && special_is_boundary_infinity(type, x, info); + else if (std::numeric_limits::has_infinity) { + if (type == LOWER) + return Parma_Polyhedra_Library::is_minus_infinity(x); + else + return Parma_Polyhedra_Library::is_plus_infinity(x); + } + else if (std::numeric_limits::is_bounded) { + if (type == LOWER) + return x == std::numeric_limits::min(); + else + return x == std::numeric_limits::max(); + } else + return false; +} + +template +inline bool +normal_is_boundary_infinity(Boundary_Type type, const T& x, const Info&) { + if (type == LOWER) + return Parma_Polyhedra_Library::is_minus_infinity(x); + else + return Parma_Polyhedra_Library::is_plus_infinity(x); +} + +template +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 +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) + && special_is_boundary_infinity(type, x, info); + else + return normal_is_boundary_infinity(type, x, info); + } + else + return !Info::store_special && normal_is_reverse_infinity(type, x, info); +} + +template +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) + && special_is_boundary_infinity(type, x, info); + else + return normal_is_boundary_infinity(type, x, info); + } + else + return !Info::store_special && normal_is_reverse_infinity(type, x, info); +} + +template +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) + && special_is_boundary_infinity(type, x, info); + else + return normal_is_boundary_infinity(type, x, info); +} + +template +inline bool +is_reverse_infinity(Boundary_Type type, const T& x, const Info& info) { + return !Info::store_special + && normal_is_reverse_infinity(type, x, info); +} + +template +inline int +is_infinity(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 +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 +inline bool +boundary_infinity_is_open(Boundary_Type type, const Info& info) { + return !Info::may_contain_infinity || + info.get_boundary_property(type, OPEN); +} + +template +inline int +sgn_b(Boundary_Type type, const T& x, const Info& info) { + if (info.get_boundary_property(type, SPECIAL) && + special_is_boundary_infinity(type, x, info)) + 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 +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 +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 +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 +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 +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 +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 +inline Result +adjust_boundary(Boundary_Type type, T& x, Info& info, + bool open, Result r) { + if (type == LOWER) { + switch (r) { + case V_NEG_OVERFLOW: + open = true; + /* Fall through */ + case VC_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) + shrink(type, x, info, false); + // FIXME: what to return? + return r; + default: + assert(false); + return VC_NAN; + } + } + else { + switch (r) { + case V_POS_OVERFLOW: + open = true; + /* Fall through */ + case VC_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) + shrink(type, x, info, false); + // FIXME: what to return? + return r; + default: + assert(false); + return VC_NAN; + } + } +} + +template +inline Result +complement(Boundary_Type to_type, To& to, To_Info& to_info, + Boundary_Type type, const T& x, const Info& info) { + assert(to_type != type); + bool shrink; + if (info.get_boundary_property(type, SPECIAL) + && special_is_boundary_infinity(type, x, info)) { + shrink = !special_is_open(type, x, info); + if (type == LOWER) + return set_minus_infinity(to_type, to, to_info, shrink); + else + return set_plus_infinity(to_type, to, to_info, shrink); + } + shrink = !normal_is_open(type, x, info); + bool check = (To_Info::check_inexact + || (!shrink && (To_Info::store_open || to_info.has_restriction()))); + Result r = assign_r(to, x, round_dir_check(to_type, check)); + return adjust_boundary(to_type, to, to_info, shrink, r); +} + +template +inline Result +assign(Boundary_Type to_type, To& to, To_Info& to_info, + Boundary_Type type, const T& x, const Info& info, + bool shrink = false) { + assert(to_type == type); + if (info.get_boundary_property(type, SPECIAL) + && special_is_boundary_infinity(type, x, info)) { + shrink = shrink || special_is_open(type, x, info); + return set_boundary_infinity(to_type, to, to_info, shrink); + } + shrink = shrink || normal_is_open(type, x, info); + bool check = (To_Info::check_inexact + || (!shrink && (To_Info::store_open || to_info.has_restriction()))); + Result r = assign_r(to, x, round_dir_check(to_type, check)); + return adjust_boundary(to_type, to, to_info, shrink, r); +} + +template +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 +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 +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 +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 +inline Result +neg_assign(Boundary_Type to_type, To& to, To_Info& to_info, + Boundary_Type type, const T& x, const Info& info) { + assert(to_type != type); + bool shrink; + if (info.get_boundary_property(type, SPECIAL) + && special_is_boundary_infinity(type, x, info)) { + shrink = special_is_open(type, x, info); + return set_boundary_infinity(to_type, to, to_info, shrink); + } + shrink = normal_is_open(type, x, info); + bool check = (To_Info::check_inexact + || (!shrink && (To_Info::store_open || to_info.has_restriction()))); + Result r = neg_assign_r(to, x, round_dir_check(to_type, check)); + return adjust_boundary(to_type, to, to_info, shrink, r); +} + +template +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) { + assert(type1 == type2); + bool shrink; + if (is_boundary_infinity(type1, x1, info1)) { + shrink = boundary_infinity_is_open(type1, info1) && + !is_boundary_infinity_closed(type2, x2, info2); + return set_boundary_infinity(to_type, to, to_info, shrink); + } + else if (is_boundary_infinity(type2, x2, info2)) { + shrink = boundary_infinity_is_open(type2, info2) && + !is_boundary_infinity_closed(type1, x1, info1); + return set_boundary_infinity(to_type, to, to_info, shrink); + } + shrink = normal_is_open(type1, x1, info1) + || normal_is_open(type2, x2, info2); + bool check = (To_Info::check_inexact + || (!shrink && (To_Info::store_open + || to_info.has_restriction()))); + // 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, shrink, r); +} + +template +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) { + assert(type1 != type2); + bool shrink; + if (is_boundary_infinity(type1, x1, info1)) { + shrink = boundary_infinity_is_open(type1, info1) && + !is_boundary_infinity_closed(type2, x2, info2); + return set_boundary_infinity(to_type, to, to_info, shrink); + } + else if (is_boundary_infinity(type2, x2, info2)) { + shrink = boundary_infinity_is_open(type2, info2) && + !is_boundary_infinity_closed(type1, x1, info1); + return set_boundary_infinity(to_type, to, to_info, shrink); + } + shrink = normal_is_open(type1, x1, info1) + || normal_is_open(type2, x2, info2); + bool check = (To_Info::check_inexact + || (!shrink && (To_Info::store_open + || to_info.has_restriction()))); + // 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, shrink, r); +} + +template +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 shrink; + if (is_boundary_infinity(type1, x1, info1)) { + shrink = boundary_infinity_is_open(type1, info1) && + !is_boundary_infinity_closed(type2, x2, info2); + return set_boundary_infinity(to_type, to, to_info, shrink); + } + else if (is_boundary_infinity(type2, x2, info2)) { + shrink = boundary_infinity_is_open(type2, info2) && + !is_boundary_infinity_closed(type1, x1, info1); + return set_boundary_infinity(to_type, to, to_info, shrink); + } + shrink = normal_is_open(type1, x1, info1) + || normal_is_open(type2, x2, info2); + bool check = (To_Info::check_inexact + || (!shrink && (To_Info::store_open + || to_info.has_restriction()))); + 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, shrink, r); +} + +template +inline Result +set_zero(Boundary_Type to_type, To& to, To_Info& to_info, bool shrink) { + bool check = (To_Info::check_inexact + || (!shrink && (To_Info::store_open || to_info.has_restriction()))); + Result r = assign_r(to, Constant<0>::value, round_dir_check(to_type, check)); + return adjust_boundary(to_type, to, to_info, shrink, r); +} + +template +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 shrink; + if (x1s != 0) { + if (x2s != 0) + return mul_assign(to_type, to, to_info, + type1, x1, info1, + type2, x2, info2); + else + shrink = info2.get_boundary_property(type2, OPEN); + } + else { + shrink = info1.get_boundary_property(type1, OPEN) + && (x2s != 0 || info2.get_boundary_property(type2, OPEN)); + } + return set_zero(to_type, to, to_info, shrink); +} + +template +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 shrink; + if (is_boundary_infinity(type1, x1, info1)) { + shrink = boundary_infinity_is_open(type1, info1); + return set_boundary_infinity(to_type, to, to_info, shrink); + } + else if (is_boundary_infinity(type2, x2, info2)) { + shrink = boundary_infinity_is_open(type2, info2); + return set_zero(to_type, to, to_info, shrink); + } + shrink = normal_is_open(type1, x1, info1) + || normal_is_open(type2, x2, info2); + bool check = (To_Info::check_inexact + || (!shrink && (To_Info::store_open + || to_info.has_restriction()))); + 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, shrink, r); +} + + +template +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) { + bool shrink; + if (x1s != 0) { + if (x2s != 0) + return div_assign(to_type, to, to_info, + type1, x1, info1, + type2, x2, info2); + else { + // FIXME: restrictions + return set_boundary_infinity(to_type, to, to_info, true); + } + } + else { + shrink = info1.get_boundary_property(type1, OPEN) + && !is_boundary_infinity_closed(type2, x2, info2); + return set_zero(to_type, to, to_info, shrink); + } +} + +} // namespace Boundary_NS + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Interval_Restriction.defs.hh line 1. */ +/* Interval_Restriction class declaration. +*/ + + +/* Automatically generated from PPL source file ../src/Interval_Restriction.defs.hh line 32. */ + +namespace Parma_Polyhedra_Library { + +struct Interval_Base; + +template +struct Boundary_Value { + typedef T type; +}; + +template +struct Boundary_Value::value>::type > { + typedef typename T::boundary_type type; +}; + +class Interval_Restriction_None_Base { +public: + bool has_restriction() const { + return false; + } + void normalize() const { + } + template + Result restrict(Rounding_Dir, T&, Result dir) const { + return dir; + } +}; + +inline bool +eq_restriction(const Interval_Restriction_None_Base&, const Interval_Restriction_None_Base) { + return true; +} + +template +inline bool +contains_restriction(const Interval_Restriction_None_Base&, const T&) { + return true; +} + +template +inline bool +assign_restriction(Interval_Restriction_None_Base&, const T&) { + return true; +} + +template +inline bool +join_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) { + return true; +} + +template +inline bool +intersect_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) { + return true; +} + +template +inline bool +diff_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) { + return true; +} + +template +inline bool +neg_restriction(Interval_Restriction_None_Base&, const T&) { + return true; +} + +template +inline bool +add_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) { + return true; +} + +template +inline bool +sub_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) { + return true; +} + +template +inline bool +mul_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) { + return true; +} + +template +inline bool +div_restriction(Interval_Restriction_None_Base&, const T1&, const T2&) { + return true; +} + +inline void +output_restriction(std::ostream&, const Interval_Restriction_None_Base&) { +} + +template +class Interval_Restriction_None : public Interval_Restriction_None_Base, + public Base { +public: + Interval_Restriction_None() { + }; + template + Interval_Restriction_None(const T& init) + : Base(init) { + } +}; + +class Interval_Restriction_Integer_Base { +}; + +template +class Interval_Restriction_Integer : public Interval_Restriction_Integer_Base, public Base { +public: + Interval_Restriction_Integer() { + } + void set_integer(bool v = true) { + return set_bit(Base::bitset, integer_bit, v); + } + bool get_integer() const { + return get_bit(Base::bitset, integer_bit); + } + + const_int_nodef(integer_bit, Base::next_bit); + const_int_nodef(next_bit, integer_bit + 1); + bool has_restriction() const { + return get_integer(); + } + void normalize() const { + } + template + Result restrict(Rounding_Dir rdir, T& x, Result dir) const { + if (!has_restriction()) + return dir; + switch (dir) { + case V_GT: + if (is_integer(x)) + return add_assign_r(x, x, static_cast(1), rdir); + /* Fall through */ + case V_GE: + return ceil_assign_r(x, x, rdir); + case V_LT: + if (is_integer(x)) + return sub_assign_r(x, x, static_cast(1), rdir); + /* Fall through */ + case V_LE: + return floor_assign_r(x, x, rdir); + default: + assert(false); + return dir; + } + } +}; + +class Simple_Restriction_Integer : public Interval_Restriction_Integer_Base { +public: + Simple_Restriction_Integer(bool i) + : integer(i) { + } + bool get_integer() const { + return integer; + } +private: + bool integer; +}; + +template +struct Restriction_Integer; + +template +struct Restriction_Integer::value>::type> { + typedef Simple_Restriction_Integer type; + static type get(const From& x) { + return Simple_Restriction_Integer(is_integer(x)); + } +}; + +template +struct Restriction_Integer::value>::type> { + typedef Simple_Restriction_Integer type; + static type get(const From& x) { + return Simple_Restriction_Integer(x.is_singleton() && is_integer(x.lower())); + } +}; + +template +struct Restriction_Integer::value>::type> { + typedef Interval_Restriction_Integer type; + static const type& get(const From& x) { + return x.info(); + } +}; + +template +inline typename Enable_If::value && Is_Same_Or_Derived::value, bool>::type +eq_restriction(const T1& x, const T2& y) { + return x.get_integer() == y.get_integer(); +} + +template +inline typename Enable_If::value && Is_Same_Or_Derived::value, bool>::type +contains_restriction(const T1& x, const T2& y) { + return !x.get_integer() || y.get_integer(); +} + +template +inline bool +assign_restriction(Interval_Restriction_Integer& to, const From& x) { + to.set_integer(Restriction_Integer::get(x).get_integer()); + return true; +} + +template +inline bool +join_restriction(Interval_Restriction_Integer& to, const From1& x, const From2& y) { + to.set_integer(Restriction_Integer::get(x).get_integer() + && Restriction_Integer::get(y).get_integer()); + return true; +} + +template +inline bool +intersect_restriction(Interval_Restriction_Integer& to, const From1& x, const From2& y) { + to.set_integer(Restriction_Integer::get(x).get_integer() + || Restriction_Integer::get(y).get_integer()); + return true; +} + +template +inline bool +diff_restriction(Interval_Restriction_Integer& to, + const From1& x, const From2&) { + to.set_integer(Restriction_Integer::get(x).get_integer()); + return true; +} + +template +inline bool +neg_restriction(Interval_Restriction_Integer& to, const From& x) { + to.set_integer(Restriction_Integer::get(x).get_integer()); + return true; +} + +template +inline bool +add_restriction(Interval_Restriction_Integer& to, const From1& x, const From2& y) { + to.set_integer(Restriction_Integer::get(x).get_integer() + && Restriction_Integer::get(y).get_integer()); + return true; +} + +template +inline bool +sub_restriction(Interval_Restriction_Integer& to, const From1& x, const From2& y) { + to.set_integer(Restriction_Integer::get(x).get_integer() + && Restriction_Integer::get(y).get_integer()); + return true; +} + +template +inline bool +mul_restriction(Interval_Restriction_Integer& to, const From1& x, const From2& y) { + to.set_integer(Restriction_Integer::get(x).get_integer() + && Restriction_Integer::get(y).get_integer()); + return true; +} + +template +inline bool +div_restriction(Interval_Restriction_Integer& to, const From1&, const From2&) { + to.set_integer(false); + return true; +} + +template +inline void +output_restriction(std::ostream& s, const Interval_Restriction_Integer& x) { + if (x.get_integer()) + s << "i"; +} + +class Interval_Restriction_Integer_Modulo_Base { +}; + +template +class Interval_Restriction_Integer_Modulo : public Interval_Restriction_Integer_Modulo_Base, public Base { +public: + PPL_COMPILE_TIME_CHECK(std::numeric_limits::is_exact, + "type for modulo values must be exact"); + Interval_Restriction_Integer_Modulo() { + // FIXME: would we have speed benefits with uninitialized info? + // (Dirty_Temp) + clear(); + } + bool has_restriction() const { + return divisor != 0; + } + void clear() { + remainder = 0; + divisor = 0; + Base::clear(); + } + void normalize() const { + } + template + Result restrict(Rounding_Dir rdir, V& x, Result dir) const { + if (!has_restriction()) + return dir; + PPL_DIRTY_TEMP(V, n); + PPL_DIRTY_TEMP(V, div); + Result r; + r = assign_r(div, divisor, ROUND_CHECK); + assert(r == V_EQ); + int s; + r = rem_assign_r(n, x, div, ROUND_NOT_NEEDED); + assert(r == V_EQ); + s = sgn(n); + switch (dir) { + case V_GT: + if (s >= 0) { + r = sub_assign_r(n, div, n, ROUND_NOT_NEEDED); + assert(r == V_EQ); + return add_assign_r(x, x, n, rdir); + } + else + return sub_assign_r(x, x, n, rdir); + case V_GE: + if (s > 0) { + r = sub_assign_r(n, div, n, ROUND_NOT_NEEDED); + assert(r == V_EQ); + return add_assign_r(x, x, n, rdir); + } + else if (s < 0) + return sub_assign_r(x, x, n, rdir); + else + return V_EQ; + case V_LT: + if (s <= 0) { + r = add_assign_r(n, div, n, ROUND_NOT_NEEDED); + assert(r == V_EQ); + return sub_assign_r(x, x, n, rdir); + } + else + return sub_assign_r(x, x, n, rdir); + case V_LE: + if (s < 0) { + r = add_assign_r(n, div, n, ROUND_NOT_NEEDED); + assert(r == V_EQ); + return sub_assign_r(x, x, n, rdir); + } + else if (s > 0) + return sub_assign_r(x, x, n, rdir); + else + return V_EQ; + default: + assert(false); + return dir; + } + } + void assign_or_swap(Interval_Restriction_Integer_Modulo& x) { + Parma_Polyhedra_Library::assign_or_swap(remainder, x.remainder); + Parma_Polyhedra_Library::assign_or_swap(divisor, x.divisor); + } + typedef T modulo_type; + T remainder; + T divisor; +}; + +template +struct Slow_Copy > : public Bool::value> {}; + + +template +struct Restriction_Integer::value>::type> { + typedef Simple_Restriction_Integer type; + static type get(const From& x) { + return Simple_Restriction_Integer(x.info().divisor != 0); + } +}; + +template +struct Simple_Restriction_Integer_Modulo : public Interval_Restriction_Integer_Modulo_Base { + template + Simple_Restriction_Integer_Modulo(const From& r, const From& d) + : remainder(r), divisor(d) { + } + typedef T modulo_type; + T remainder; + T divisor; +}; + +template +struct Restriction_Integer_Modulo; + +template +struct Restriction_Integer_Modulo::value>::type> { + typedef Simple_Restriction_Integer_Modulo type; + static const type& get(const From& x) { + static const type integer(0, 1); + static const type not_integer(0, 0); + if (is_integer(x)) + return integer; + else + return not_integer; + } +}; + +template +struct Restriction_Integer_Modulo::value>::type> { + typedef Simple_Restriction_Integer_Modulo type; + static const type& get(const From& x) { + static const type integer(0, 1); + static const type not_integer(0, 0); + if (x.is_singleton() && is_integer(x.lower())) + return integer; + else + return not_integer; + } +}; + +template +struct Restriction_Integer_Modulo::value>::type> { + typedef Simple_Restriction_Integer_Modulo type; + static const type& get(const From& x) { + static const type integer(0, 1); + static const type not_integer(0, 0); + if (x.info().get_integer()) + return integer; + else + return not_integer; + } +}; + +template +struct Restriction_Integer_Modulo::value>::type> { + typedef Interval_Restriction_Integer_Modulo type; + static const type& get(const From& x) { + return x.info(); + } +}; + +template +inline typename Enable_If::value && Is_Same_Or_Derived::value, bool>::type +eq_restriction(const T1& x, const T2& y) { + return x.remainder == y.remainder + && x.divisor == y.divisor; +} + +template +inline typename Enable_If::value && Is_Same_Or_Derived::value, bool>::type +contains_restriction(const T1& x, const T2& y) { + if (x.divisor == 0) + return true; + if (y.divisor == 0) + return false; + if (x.divisor == y.divisor) + return x.remainder == y.remainder; + PPL_DIRTY_TEMP(typename T1::modulo_type, v); + Result r; + r = rem_assign_r(v, y.divisor, x.divisor, ROUND_NOT_NEEDED); + assert(r == V_EQ); + if (v != 0) + return false; + r = rem_assign_r(v, y.remainder, x.divisor, ROUND_NOT_NEEDED); + assert(r == V_EQ); + return v == x.remainder; +} + +template +inline bool +set_unrestricted(Interval_Restriction_Integer_Modulo& to) { + to.remainder = 0; + to.divisor = 0; + return true; +} + +template +inline bool +set_integer(Interval_Restriction_Integer_Modulo& to) { + to.remainder = 0; + to.divisor = 1; + return true; +} + +template +inline bool +assign_restriction(Interval_Restriction_Integer_Modulo& to, const From& x) { + to.remainder = Restriction_Integer_Modulo::get(x).remainder; + to.divisor = Restriction_Integer_Modulo::get(x).divisor; + return true; +} + +template +inline bool +join_restriction(Interval_Restriction_Integer_Modulo& to, const From1& x, const From2& y) { + typedef Restriction_Integer_Modulo Rx; + const typename Rx::type& rx = Rx::get(x); + if (rx.divisor == 0) + return set_unrestricted(to); + typedef Restriction_Integer_Modulo Ry; + const typename Ry::type& ry = Ry::get(y); + if (ry.divisor == 0) + return set_unrestricted(to); + else if (rx.divisor == 1 && ry.divisor == 1 + && is_singleton(x) && is_singleton(y)) { + PPL_DIRTY_TEMP(typename Boundary_Value::type, a); + PPL_DIRTY_TEMP(typename Boundary_Value::type, b); + Result r; + r = abs_assign_r(a, f_lower(x), ROUND_CHECK); + if (r != V_EQ) + return set_integer(to); + r = abs_assign_r(b, f_lower(y), ROUND_CHECK); + if (r != V_EQ) + return set_integer(to); + if (a > b) + r = sub_assign_r(a, a, b, ROUND_CHECK); + else + r = sub_assign_r(a, b, a, ROUND_CHECK); + if (r != V_EQ) + return set_integer(to); + r = assign_r(to.divisor, a, ROUND_CHECK); + if (r != V_EQ) + return set_integer(to); + r = rem_assign_r(b, b, a, ROUND_CHECK); + if (r != V_EQ) + return set_integer(to); + r = assign_r(to.remainder, b, ROUND_CHECK); + if (r != V_EQ) + return set_integer(to); + } + else if (contains_restriction(rx, ry)) { + to.remainder = rx.remainder; + to.divisor = rx.divisor; + } + else if (contains_restriction(ry, rx)) { + to.remainder = ry.remainder; + to.divisor = ry.divisor; + } + else + return set_integer(to); + return true; +} + +template +inline bool +intersect_restriction(Interval_Restriction_Integer_Modulo& to, const From1& x, const From2& y) { + typedef Restriction_Integer_Modulo Rx; + const typename Rx::type& rx = Rx::get(x); + typedef Restriction_Integer_Modulo Ry; + const typename Ry::type& ry = Ry::get(y); + if (rx.divisor == 0) { + to.remainder = ry.remainder; + to.divisor = ry.divisor; + return true; + } + if (ry.divisor == 0) { + to.remainder = rx.remainder; + to.divisor = rx.divisor; + return true; + } + PPL_DIRTY_TEMP(T, g); + Result r; + r = gcd_assign_r(g, rx.divisor, ry.divisor, ROUND_DIRECT); + if (r != V_EQ) + return set_integer(to); + PPL_DIRTY_TEMP(T, d); + if (rx.remainder > ry.remainder) + r = sub_assign_r(d, rx.remainder, ry.remainder, ROUND_DIRECT); + else + r = sub_assign_r(d, ry.remainder, rx.remainder, ROUND_DIRECT); + if (r != V_EQ) + return set_integer(to); + r = div_assign_r(d, d, g, ROUND_DIRECT); + if (r != V_EQ) + return false; + r = lcm_assign_r(to.divisor, rx.divisor, ry.divisor, ROUND_DIRECT); + if (r != V_EQ) + return set_integer(to); + // FIXME: to be completed + return true; +} + +template +inline bool +diff_restriction(Interval_Restriction_Integer_Modulo& to, + const From1& x, const From2& y) { + // FIXME: to be written + return true; +} + +template +inline bool +neg_restriction(Interval_Restriction_Integer_Modulo& to, + const From& x) { + return assign_restriction(to, x); +} + +template +inline void +addmod(T& to, const T& x, const T& y, const T& to_m, const T& y_m) { + Result r; + if (std::numeric_limits::is_bounded) { + r = sub_assign_r(to, y_m, y, ROUND_NOT_NEEDED); + assert(r == V_EQ); + if (x <= to) { + r = add_assign_r(to, x, y, ROUND_NOT_NEEDED); + assert(r == V_EQ); + } + else { + r = sub_assign_r(to, x, to, ROUND_NOT_NEEDED); + assert(r == V_EQ); + } + } + else { + r = add_assign_r(to, x, y, ROUND_NOT_NEEDED); + assert(r == V_EQ); + } + r = rem_assign_r(to, to, to_m, ROUND_NOT_NEEDED); + assert(r == V_EQ); +} + +template +inline bool +assign_rem(M& rem, const T& n, const M& div) { + PPL_DIRTY_TEMP(T, divisor); + PPL_DIRTY_TEMP(T, remainder); + Result r; + r = assign_r(divisor, div, ROUND_CHECK); + if (r != V_EQ) + return false; + r = rem_assign_r(remainder, n, divisor, ROUND_CHECK); + if (r != V_EQ) + return false; + if (sgn(remainder) < 0) { + r = add_assign_r(remainder, remainder, divisor, ROUND_CHECK); + if (r != V_EQ) + return false; + } + r = assign_r(rem, remainder, ROUND_CHECK); + return r == V_EQ; +} + + +template +inline bool +add_restriction(Interval_Restriction_Integer_Modulo& to, const From1& x, const From2& y) { + typedef Restriction_Integer_Modulo Rx; + const typename Rx::type& rx = Rx::get(x); + if (rx.divisor == 0) + return set_unrestricted(to); + typedef Restriction_Integer_Modulo Ry; + const typename Ry::type& ry = Ry::get(y); + if (ry.divisor == 0) + return set_unrestricted(to); + Result r; + PPL_DIRTY_TEMP(T, rem); + if (is_singleton(x)) { + if (is_singleton(y)) + return set_integer(to); + if (!assign_rem(rem, f_lower(x), ry.divisor)) + return set_integer(to); + r = assign_r(to.divisor, ry.divisor, ROUND_NOT_NEEDED); + assert(r == V_EQ); + addmod(to.remainder, rem, ry.remainder, to.divisor, ry.divisor); + } + else if (is_singleton(y)) { + if (!assign_rem(rem, f_lower(y), rx.divisor)) + return set_integer(to); + r = assign_r(to.divisor, rx.divisor, ROUND_NOT_NEEDED); + assert(r == V_EQ); + addmod(to.remainder, rx.remainder, rem, to.divisor, to.divisor); + } + else { + r = gcd_assign_r(to.divisor, rx.divisor, ry.divisor, ROUND_NOT_NEEDED); + assert(r == V_EQ); + addmod(to.remainder, rx.remainder, ry.remainder, to.divisor, ry.divisor); + } + return true; +} + +template +inline void +submod(T& to, const T& x, const T& y, const T& to_m, const T& y_m) { + Result r; + if (x >= y) { + r = sub_assign_r(to, x, y, ROUND_NOT_NEEDED); + assert(r == V_EQ); + } + else { + r = sub_assign_r(to, y_m, y, ROUND_NOT_NEEDED); + assert(r == V_EQ); + r = add_assign_r(to, x, to, ROUND_NOT_NEEDED); + assert(r == V_EQ); + } + r = rem_assign_r(to, to, to_m, ROUND_NOT_NEEDED); + assert(r == V_EQ); +} + +template +inline bool +sub_restriction(Interval_Restriction_Integer_Modulo& to, const From1& x, const From2& y) { + typedef Restriction_Integer_Modulo Rx; + const typename Rx::type& rx = Rx::get(x); + if (rx.divisor == 0) + return set_unrestricted(to); + typedef Restriction_Integer_Modulo Ry; + const typename Ry::type& ry = Ry::get(y); + if (ry.divisor == 0) + return set_unrestricted(to); + Result r; + PPL_DIRTY_TEMP(T, rem); + if (is_singleton(x)) { + if (is_singleton(y)) + return set_integer(to); + if (!assign_rem(rem, f_lower(x), ry.divisor)) + return set_integer(to); + r = assign_r(to.divisor, ry.divisor, ROUND_NOT_NEEDED); + assert(r == V_EQ); + submod(to.remainder, rem, ry.remainder, to.divisor, ry.divisor); + } + else if (is_singleton(y)) { + if (!assign_rem(rem, f_lower(y), rx.divisor)) + return set_integer(to); + r = assign_r(to.divisor, rx.divisor, ROUND_NOT_NEEDED); + assert(r == V_EQ); + submod(to.remainder, rx.remainder, rem, to.divisor, to.divisor); + } + else { + r = gcd_assign_r(to.divisor, rx.divisor, ry.divisor, ROUND_NOT_NEEDED); + assert(r == V_EQ); + submod(to.remainder, rx.remainder, ry.remainder, to.divisor, ry.divisor); + } + return true; +} + +template +inline void +mulmod(T& to, const T& x, const T& y, const T& to_m) { + Result r; + if (std::numeric_limits::is_bounded) { + PPL_DIRTY_TEMP0(mpz_class, a); + PPL_DIRTY_TEMP0(mpz_class, b); + r = assign_r(a, x, ROUND_NOT_NEEDED); + assert(r == V_EQ); + r = assign_r(b, y, ROUND_NOT_NEEDED); + assert(r == V_EQ); + r = mul_assign_r(a, a, b, ROUND_NOT_NEEDED); + assert(r == V_EQ); + r = assign_r(b, to_m, ROUND_NOT_NEEDED); + assert(r == V_EQ); + r = rem_assign_r(a, a, b, ROUND_NOT_NEEDED); + assert(r == V_EQ); + r = assign_r(to, a, ROUND_NOT_NEEDED); + assert(r == V_EQ); + } + else { + r = mul_assign_r(to, x, y, ROUND_NOT_NEEDED); + assert(r == V_EQ); + r = rem_assign_r(to, to, to_m, ROUND_NOT_NEEDED); + assert(r == V_EQ); + } +} + + +template +inline bool +mul_restriction(Interval_Restriction_Integer_Modulo& to, const From1& x, const From2& y) { + typedef Restriction_Integer_Modulo Rx; + const typename Rx::type& rx = Rx::get(x); + if (rx.divisor == 0) + return set_unrestricted(to); + typedef Restriction_Integer_Modulo Ry; + const typename Ry::type& ry = Ry::get(y); + if (ry.divisor == 0) + return set_unrestricted(to); + Result r; + PPL_DIRTY_TEMP(T, mul); + if (is_singleton(x)) { + if (is_singleton(y)) + return set_integer(to); + PPL_DIRTY_TEMP(typename Boundary_Value::type, n); + r = abs_assign_r(n, f_lower(x), ROUND_CHECK); + if (r != V_EQ) + return set_integer(to); + r = assign_r(mul, n, ROUND_CHECK); + if (r != V_EQ) + return set_integer(to); + r = mul_assign_r(to.remainder, mul, ry.remainder, ROUND_NOT_NEEDED); + if (r != V_EQ) + return set_integer(to); + r = mul_assign_r(to.divisor, mul, ry.divisor, ROUND_NOT_NEEDED); + if (r != V_EQ) + return set_integer(to); + } + else if (is_singleton(y)) { + PPL_DIRTY_TEMP(typename Boundary_Value::type, n); + r = abs_assign_r(n, f_lower(y), ROUND_CHECK); + if (r != V_EQ) + return set_integer(to); + r = assign_r(mul, n, ROUND_CHECK); + if (r != V_EQ) + return set_integer(to); + r = mul_assign_r(to.remainder, rx.remainder, mul, ROUND_NOT_NEEDED); + if (r != V_EQ) + return set_integer(to); + r = mul_assign_r(to.divisor, rx.divisor, mul, ROUND_NOT_NEEDED); + if (r != V_EQ) + return set_integer(to); + } + else { + r = gcd_assign_r(to.divisor, rx.divisor, ry.divisor, ROUND_NOT_NEEDED); + assert(r == V_EQ); + mulmod(to.remainder, rx.remainder, ry.remainder, to.divisor); + } + return true; +} + +template +inline bool +div_restriction(Interval_Restriction_Integer_Modulo& to, + const From1& x, const From2& y) { + if (is_singleton(y)) { + if (is_singleton(x)) { + // FIXME: to be written + } + } + return set_unrestricted(to); +} + +template +inline void +output_restriction(std::ostream& s, const Interval_Restriction_Integer_Modulo& x) { + if (x.divisor == 1) + s << "i"; + else if (x.divisor != 0) + s << "{" << x.remainder << "%" << x.divisor << "}"; +} + +} + +/* Automatically generated from PPL source file ../src/Interval_Info.defs.hh line 28. */ + +#include + +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 +inline void +reset_bits(T& bits) { + bits = 0; +} + +template +inline void +reset_bit(T& bits, unsigned int bit) { + bits &= ~(static_cast(1) << bit); +} + +template +inline void +set_bit(T& bits, unsigned int bit, bool value) { + if (value) + bits |= static_cast(1) << bit; + else + reset_bit(bits, bit); +} + +template +inline bool +get_bit(const T& bits, unsigned int bit) { + return bits & (static_cast(1) << bit); +} + +template +inline void +set_bits(T& bits, unsigned int start, unsigned int len, T value) { + bits &= ~(((static_cast(1) << len) - 1) << start); + bits |= value << start; +} + +template +inline T +get_bits(T& bits, unsigned int start, unsigned int len) { + return (bits >> start) & ((static_cast(1) << len) - 1); +} + +} // namespace Interval_NS + +using namespace Interval_NS; +using namespace Boundary_NS; + + +template +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_empty_result, Policy::check_empty_result); + const_bool_nodef(check_inexact, Policy::check_inexact); + const_bool_nodef(store_special, false); + const_bool_nodef(store_open, false); + const_bool_nodef(cache_normalized, false); + const_bool_nodef(cache_empty, false); + const_bool_nodef(cache_singleton, false); + void clear() { + } + void clear_boundary_properties(Boundary_Type) { + } + + template + void set_boundary_property(Boundary_Type, const Property&, typename Property::Value = Property::default_value) { + } + template + typename Property::Value get_boundary_property(Boundary_Type, const Property&) const { + return Property::unsupported_value; + } + template + void set_interval_property(const Property&, typename Property::Value = Property::default_value) { + } + template + typename Property::Value get_interval_property(const Property&) const { + return Property::unsupported_value; + } + + //! Swaps \p *this with \p y. + void swap(Interval_Info_Null& y); + + void ascii_dump(std::ostream& s) const; + bool ascii_load(std::istream& s); +}; + +template +class Interval_Info_Null_Open : public Interval_Info_Null { +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 { + switch (p.type) { + case Boundary_NS::Property::OPEN_: + return open; + default: + return Boundary_NS::Property::unsupported_value; + } + } + + void ascii_dump(std::ostream& s) const; + bool ascii_load(std::istream& s); + +private: + bool open; +}; + + +template +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_empty_result, Policy::check_empty_result); + 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_normalized, Policy::cache_normalized); + 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); + const_int_nodef(lower_normalized_bit, lower_open_bit + store_open); + const_int_nodef(upper_special_bit, lower_normalized_bit + cache_normalized); + const_int_nodef(upper_open_bit, upper_special_bit + store_special); + const_int_nodef(upper_normalized_bit, upper_open_bit + store_open); + const_int_nodef(cardinality_is_bit, upper_normalized_bit + cache_normalized); + const_int_nodef(cardinality_0_bit, cardinality_is_bit + (cache_empty || cache_singleton)); + const_int_nodef(cardinality_1_bit, cardinality_0_bit + cache_empty); + const_int_nodef(next_bit, cardinality_1_bit + cache_singleton); + 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; + case Boundary_NS::Property::NORMALIZED_: + if (cache_normalized) { + if (t == LOWER) + set_bit(bitset, lower_normalized_bit, value); + else + set_bit(bitset, upper_normalized_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); + case Boundary_NS::Property::NORMALIZED_: + if (!cache_normalized) + return false; + else if (t == LOWER) + return get_bit(bitset, lower_normalized_bit); + else + return get_bit(bitset, upper_normalized_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 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 + +namespace Parma_Polyhedra_Library { + +template +inline void +Interval_Info_Null::swap(Interval_Info_Null&) { +} + +template +inline void +Interval_Info_Null::ascii_dump(std::ostream& s) const { +} + +template +inline bool +Interval_Info_Null::ascii_load(std::istream& s) { + return true; +} + +template +inline void +Interval_Info_Null_Open::ascii_dump(std::ostream& s) const { + s << (open ? "open" : "closed"); +} + +template +inline bool +Interval_Info_Null_Open::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 +inline void +Interval_Info_Bitset::swap(Interval_Info_Bitset& y) { + std::swap(bitset, y.bitset); +} + +template +inline void +Interval_Info_Bitset::ascii_dump(std::ostream& s) const { + std::ios_base::fmtflags old = s.flags(); + s << std::hex << bitset; + s.flags(old); +} + +template +inline bool +Interval_Info_Bitset::ascii_load(std::istream& s) { + std::ios_base::fmtflags old = s.flags(); + if (s >> std::hex >> bitset) { + s.flags(old); + return s; + } + else + return false; +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates Parma_Polyhedra_Library::Interval_Info_Null */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +inline void +swap(Parma_Polyhedra_Library::Interval_Info_Null& x, + Parma_Polyhedra_Library::Interval_Info_Null& y) { + x.swap(y); +} + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates Parma_Polyhedra_Library::Interval_Info_Bitset */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +inline void +swap(Parma_Polyhedra_Library::Interval_Info_Bitset& x, + Parma_Polyhedra_Library::Interval_Info_Bitset& y) { + x.swap(y); +} + +} // namespace std + +/* Automatically generated from PPL source file ../src/Interval_Info.defs.hh line 299. */ + +/* Automatically generated from PPL source file ../src/Interval.defs.hh line 31. */ +#include + +// Temporary! +#include + +namespace Parma_Polyhedra_Library { + +enum I_Result { + I_EMPTY = 0, + /* + I_L_EQ = V_EQ, + I_L_GT = V_GT, + I_L_GE = V_GE, + I_U_EQ = V_EQ << 6, + I_U_LT = V_LT << 6, + I_U_LE = V_LE << 6, + */ + I_MAYBE_EMPTY = 1 << 12, + I_SINGULARITIES = 1 << 13 +}; + +enum Ternary { T_YES, T_NO, T_MAYBE }; + +inline I_Result +combine(Result l, Result u) { + return static_cast(l | (u << 6)); +} + +inline Result +lower(I_Result r) { + return static_cast(r & 63); +} + +inline Result +upper(I_Result r) { + return static_cast((r >> 6) & 63); +} + +template +inline bool +unrepresentability_error(I_Result r, const Info&) { + return !Info::store_special + && (is_special(lower(r)) || is_special(upper(r))); +} + +using namespace Boundary_NS; +using namespace Interval_NS; + +struct Interval_Base {}; + +template +struct Is_Singleton : public Is_Native_Or_Checked {}; + +template +struct Is_Interval : public Is_Same_Or_Derived {}; + +//! 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 signed char to long long + and from int8_t to int64_t); + - a bounded precision floating point type (float, + double or long double); + - an unbounded integer or rational type, as provided by the C++ interface + of GMP (mpz_class or mpq_class). + + 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; + - the ability to support (independently from the type of the boundaries) + plain intervals of real numbers and intervals subject to generic + restrictions (e.g., intervals of integer numbers). +*/ +template +class Interval : public Interval_Base, private Info { +private: + PPL_COMPILE_TIME_CHECK(!Info::store_special + || !std::numeric_limits::has_infinity, + "store_special is meaningless" + " when boundary type may contains infinity"); + Info& w_info() const { + return const_cast(*this); + } + bool is_empty_nocache() const { + return lt(UPPER, upper(), info(), LOWER, lower(), info()); + } + bool is_singleton_nocache() const { + return eq(LOWER, lower(), info(), UPPER, upper(), info()); + } + Result lower_normalize() const { + Result r; + if (info().get_boundary_property(LOWER, NORMALIZED) + || info().get_boundary_property(LOWER, SPECIAL)) + r = V_EQ; + else { + Boundary& l = const_cast(lower()); + if (info().get_boundary_property(LOWER, OPEN)) { + r = info().restrict(round_dir_check(LOWER, true), l, V_GT); + if (r != V_GT) + w_info().set_boundary_property(LOWER, OPEN, false); + } + else { + r = info().restrict(round_dir_check(LOWER, true), l, V_GE); + if (r == V_GT) + w_info().set_boundary_property(LOWER, OPEN); + } + w_info().set_boundary_property(LOWER, NORMALIZED); + } + return r; + } + Result upper_normalize() const { + Result r; + if (info().get_boundary_property(UPPER, NORMALIZED) + || info().get_boundary_property(UPPER, SPECIAL)) + r = V_EQ; + else { + Boundary& u = const_cast(upper()); + if (info().get_boundary_property(UPPER, OPEN)) { + r = info().restrict(round_dir_check(UPPER, true), u, V_LT); + if (r != V_LT) + w_info().set_boundary_property(UPPER, OPEN, false); + } + else { + r = info().restrict(round_dir_check(UPPER, true), u, V_LE); + if (r == V_LT) + w_info().set_boundary_property(UPPER, OPEN); + } + w_info().set_boundary_property(UPPER, NORMALIZED); + } + return r; + } + + +public: + typedef Boundary boundary_type; + typedef Info info_type; + + typedef Interval_NS::Property Property; + + void lower_load() { +#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG + lower_loaded = 1; +#endif + } + + void upper_load() { +#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG + upper_loaded = 1; +#endif + } + + void complete_init() { +#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG + assert(lower_loaded); + assert(upper_loaded); + completed = 1; +#endif + } + + void complete_init_internal() { +#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG + lower_loaded = 1; + upper_loaded = 1; + completed = 1; +#endif + } + + template + typename Enable_If::value || Is_Interval::value, Interval&>::type + operator=(const T& x) { + assign(x); + return *this; + } + + template + typename Enable_If::value || Is_Interval::value, Interval&>::type + operator+=(const T& x) { + add_assign(*this, x); + return *this; + } + template + typename Enable_If::value || Is_Interval::value, Interval&>::type + operator-=(const T& x) { + sub_assign(*this, x); + return *this; + } + template + typename Enable_If::value || Is_Interval::value, Interval&>::type + operator*=(const T& x) { + mul_assign(*this, x); + return *this; + } + template + typename Enable_If::value || Is_Interval::value, Interval&>::type + operator/=(const T& x) { + div_assign(*this, x); + return *this; + } + + //! Swaps \p *this with \p y. + void 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_; + } + + Ternary is_empty_cached() const { + if (info().get_interval_property(CARDINALITY_0)) + return info().get_interval_property(CARDINALITY_IS) ? T_YES : T_NO; + else if (info().get_interval_property(CARDINALITY_IS)) + return T_NO; + else + return T_MAYBE; + } + + Ternary is_singleton_cached() const { + if (info().get_interval_property(CARDINALITY_1)) + return info().get_interval_property(CARDINALITY_IS) ? T_YES : T_NO; + else if (info().get_interval_property(CARDINALITY_IS)) + return T_NO; + else + return T_MAYBE; + } + + bool is_empty() const { + switch (is_empty_cached()) { + case T_NO: + return false; + case T_YES: + return true; + case T_MAYBE: + bool r = is_empty_nocache(); + if (r) { + w_info().set_interval_property(CARDINALITY_IS, r); + w_info().set_interval_property(CARDINALITY_1, false); + } + w_info().set_interval_property(CARDINALITY_0); + return r; + } + assert(false); + return false; + } + + bool is_singleton() const { + switch (is_singleton_cached()) { + case T_NO: + return false; + case T_YES: + return true; + case T_MAYBE: + bool r = is_singleton_nocache(); + if (r) { + w_info().set_interval_property(CARDINALITY_IS, r); + w_info().set_interval_property(CARDINALITY_0, false); + } + w_info().set_interval_property(CARDINALITY_1); + return r; + } + assert(false); + return false; + } + + bool has_restriction() const { + return info().has_restriction(); + } + + I_Result normalize() const { + assert(OK()); + if (has_restriction()) { + Result rl = lower_normalize(); + Result ru = upper_normalize(); + // FIXME: this invalidation is not needed if interval is unchanged + invalidate_cardinality_cache(); + info().normalize(); + assert(OK()); + return combine(rl, ru); + } + else + return combine(V_EQ, V_EQ); + } + + bool lower_is_open() const { + assert(OK()); + return is_open(LOWER, lower(), info()); + } + + bool upper_is_open() const { + assert(OK()); + return is_open(UPPER, upper(), info()); + } + + Result lower_shrink() { + assert(OK()); + return shrink(LOWER, lower(), info(), false); + } + + Result upper_shrink() { + assert(OK()); + return shrink(UPPER, upper(), info(), false); + } + + bool lower_is_unbounded() const { + assert(OK()); + return Boundary_NS::is_unbounded(LOWER, lower(), info()); + } + + bool upper_is_unbounded() const { + assert(OK()); + return Boundary_NS::is_unbounded(UPPER, upper(), info()); + } + + bool is_unbounded() const { + assert(OK()); + return lower_is_unbounded() || upper_is_unbounded(); + } + + bool is_universe() const { + assert(OK()); + return lower_is_unbounded() && upper_is_unbounded() + && !has_restriction(); + } + + void invalidate_cardinality_cache() const { + w_info().set_interval_property(CARDINALITY_IS, false); + w_info().set_interval_property(CARDINALITY_0, false); + w_info().set_interval_property(CARDINALITY_1, false); + } + + template + Result lower_set_uninit(const T& x, bool open = false) { + info().clear_boundary_properties(LOWER); + Result rl = Boundary_NS::assign(LOWER, lower(), info(), LOWER, x, f_info(x, open)); + lower_load(); + return rl; + } + + Result lower_set_uninit(const Unbounded&) { + info().clear_boundary_properties(LOWER); + Result rl = set_unbounded(LOWER, lower(), info()); + lower_load(); + return rl; + } + + template + Result lower_set(const T& x, bool open = false) { + assert(OK()); + info().clear_boundary_properties(LOWER); + Result rl = Boundary_NS::assign(LOWER, lower(), info(), LOWER, x, f_info(x, open)); + invalidate_cardinality_cache(); + assert(OK()); + return rl; + } + + Result lower_set(const Unbounded&) { + assert(OK()); + info().clear_boundary_properties(LOWER); + Result rl = set_unbounded(LOWER, lower(), info()); + invalidate_cardinality_cache(); + assert(OK()); + return rl; + } + + template + Result lower_narrow(const T& x, bool open = false) { + assert(OK()); + if (ge(LOWER, lower(), info(), LOWER, x, f_info(x, open))) + return V_EQ; + return lower_set(x, open); + } + + template + Result lower_widen(const T& x, bool open = false) { + assert(OK()); + if (le(LOWER, lower(), info(), LOWER, x, f_info(x, open))) + return V_EQ; + return lower_set(x, open); + } + + Result lower_widen(const Unbounded&) { + assert(OK()); + if (lower_is_unbounded()) + return V_EQ; + info().clear_boundary_properties(LOWER); + Result rl = set_unbounded(LOWER, lower(), info()); + invalidate_cardinality_cache(); + assert(OK()); + return V_EQ; + } + + template + Result upper_set_uninit(const T& x, bool open = false) { + info().clear_boundary_properties(UPPER); + Result rl = Boundary_NS::assign(UPPER, upper(), info(), UPPER, x, f_info(x, open)); + upper_load(); + return rl; + } + Result upper_set_uninit(const Unbounded&) { + info().clear_boundary_properties(UPPER); + Result rl = set_unbounded(UPPER, upper(), info()); + upper_load(); + return rl; + } + + template + Result upper_set(const T& x, bool open = false) { + assert(OK()); + info().clear_boundary_properties(UPPER); + Result rl = Boundary_NS::assign(UPPER, upper(), info(), UPPER, x, f_info(x, open)); + invalidate_cardinality_cache(); + assert(OK()); + return rl; + } + + Result upper_set(const Unbounded&) { + assert(OK()); + info().clear_boundary_properties(UPPER); + Result rl = set_unbounded(UPPER, upper(), info()); + invalidate_cardinality_cache(); + assert(OK()); + return rl; + } + + template + Result upper_narrow(const T& x, bool open = false) { + assert(OK()); + if (le(UPPER, upper(), info(), UPPER, x, f_info(x, open))) + return V_EQ; + return upper_set(x, open); + } + + template + Result upper_widen(const T& x, bool open = false) { + assert(OK()); + if (ge(UPPER, upper(), info(), UPPER, x, f_info(x, open))) + return V_EQ; + return upper_set(x, open); + } + + Result upper_widen(const Unbounded&) { + assert(OK()); + if (upper_is_unbounded()) + return V_EQ; + info().clear_boundary_properties(UPPER); + Result rl = set_unbounded(UPPER, upper(), info()); + invalidate_cardinality_cache(); + assert(OK()); + return rl; + } + + I_Result assign(Degenerate_Element e) { + I_Result r; + Result rl, ru; + info().clear(); + switch (e) { + case EMPTY: + info().set_interval_property(CARDINALITY_IS); + info().set_interval_property(CARDINALITY_0); + lower_set_uninit(1); + upper_set_uninit(0); + r = I_EMPTY; + break; + case UNIVERSE: + info().set_interval_property(CARDINALITY_0, true); + info().set_interval_property(CARDINALITY_1, true); + rl = lower_set_uninit(UNBOUNDED); + ru = upper_set_uninit(UNBOUNDED); + r = combine(rl, ru); + break; + default: + assert(0); + r = I_EMPTY; + break; + } + complete_init(); + assert(OK()); + return r; + } + + template + typename Enable_If::value, I_Result>::type + assign(const From&) { + info().clear(); + info().set_interval_property(CARDINALITY_0, true); + info().set_interval_property(CARDINALITY_1, true); + Result rl, ru; + switch (From::code) { + 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: + assert(0); + rl = VC_NAN; + ru = VC_NAN; + } + complete_init_internal(); + assert(OK()); + return combine(rl, ru); + } + + I_Result set_infinities() { + info().clear(); + info().set_interval_property(CARDINALITY_0, true); + info().set_interval_property(CARDINALITY_1, true); + // FIXME: what about restrictions? + Result rl = Boundary_NS::set_minus_infinity(LOWER, lower(), info()); + Result ru = Boundary_NS::set_plus_infinity(UPPER, upper(), info()); + complete_init_internal(); + assert(OK()); + return combine(rl, ru); + } + + bool is_topologically_closed() const { + assert(OK()); + return !Info::store_open + || is_empty() + || ((lower_is_unbounded() || !lower_is_open()) + && (upper_is_unbounded() || !upper_is_open())); + } + + //! Assigns to \p *this its topological closure. + void topological_closure_assign() { + if (!Info::store_open || is_empty()) + return; + + if (!lower_is_unbounded()) + info().set_boundary_property(LOWER, OPEN, false); + + if (!upper_is_unbounded()) + info().set_boundary_property(UPPER, OPEN, false); + } + + bool is_infinity() const { + 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 { + assert(OK()); + if (is_empty()) + return false; + if (is_unbounded()) + 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; + } + + //! 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 { +#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG + if (!completed) { + std::cerr << "The interval initialization has not been completed." + << std::endl; + return false; + } +#endif +#if 0 + if (!Info::may_be_empty && is_empty()) { +#ifndef NDEBUG + std::cerr << "The interval is unexpectedly empty.\n"; +#endif + return false; + } +#endif + + 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 0 + if (info().get_boundary_property(LOWER, NORMALIZED) + && !info().is_restricted(lower())) { +#ifndef NDEBUG + std::cerr << "The lower boundary is marked to be normalized, " + << "but it is not.\n"; +#endif + return false; + } +#endif + } + + 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; + } +#if 0 + if (info().get_boundary_property(UPPER, NORMALIZED) + && !info().is_restricted(upper())) { +#ifndef NDEBUG + std::cerr << "The upper boundary is marked to be normalized, " + << "but it is not.\n"; +#endif + return false; + } +#endif + } + + Ternary t; + + t = is_empty_cached(); + if (t == T_YES) { + if (!is_empty_nocache()) { +#ifndef NDEBUG + std::cerr << "The interval is marked to be empty, " + << "but actually it is not empty.\n"; +#endif + return false; + } + } + else if (t == T_NO) { + if (is_empty_nocache()) { +#ifndef NDEBUG + std::cerr << "The interval is marked to be not empty, " + << "but actually it is empty.\n"; +#endif + return false; + } + } + + t = is_singleton_cached(); + if (t == T_YES) { + if (!is_singleton_nocache()) { +#ifndef NDEBUG + std::cerr << "The interval is marked to be singleton, " + << "but actually it is not singleton.\n"; +#endif + return false; + } + } + else if (t == T_NO) { + if (is_singleton_nocache()) { +#ifndef NDEBUG + std::cerr << "The interval is marked to be not singleton, " + << "but actually it is singleton.\n"; +#endif + return false; + } + } + + if (info().get_interval_property(CARDINALITY_IS) && + info().get_interval_property(CARDINALITY_0) + == info().get_interval_property(CARDINALITY_1)) { +#ifndef NDEBUG + std::cerr << "The interval is marked to know its cardinality, " + << "but this is unspecified or ambiguous.\n"; +#endif + return false; + } + + // Everything OK. + return true; + } + + Interval() +#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG + : lower_loaded(0), upper_loaded(0), completed(0) +#endif + { + } + + template + explicit Interval(const T& x) +#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG + : lower_loaded(0), upper_loaded(0), completed(0) +#endif + { + assign(x); + } + + template + typename Enable_If::value + || Is_Interval::value, bool>::type + contains(const T& y) const; + + template + typename Enable_If::value + || Is_Interval::value, bool>::type + strictly_contains(const T& y) const; + + template + typename Enable_If::value + || Is_Interval::value, bool>::type + is_disjoint_from(const T& y) const; + + template + I_Result assign(const From1& l, const From2& u); + + template + typename Enable_If::value + || Is_Interval::value, I_Result>::type + assign(const From& x); + + template + typename Enable_If::value + || Is_Interval::value, bool>::type + can_be_exactly_joined_to(const Type& x) const; + + template + typename Enable_If::value + || Is_Interval::value, I_Result>::type + join_assign(const From& x); + + template + typename Enable_If<((Is_Singleton::value + || Is_Interval::value) + && (Is_Singleton::value + || Is_Interval::value)), I_Result>::type + join_assign(const From1& x, const From2& y); + + template + typename Enable_If::value + || Is_Interval::value, I_Result>::type + intersect_assign(const From& x); + + template + typename Enable_If<((Is_Singleton::value + || Is_Interval::value) + && (Is_Singleton::value + || Is_Interval::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 Enable_If::value + || Is_Interval::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 Enable_If<((Is_Singleton::value + || Is_Interval::value) + && (Is_Singleton::value + || Is_Interval::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 Enable_If::value + || Is_Interval::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 Enable_If::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. + + \note + Depending on interval restrictions, there could be many + maximal intervals all inconsistent with respect to \p y. + */ + template + typename Enable_If::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 Enable_If::value + || Is_Interval::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 Enable_If::value + || Is_Interval::value, I_Result>::type + refine_universal(Relation_Symbol rel, const From& x); + + template + typename Enable_If::value + || Is_Interval::value, I_Result>::type + neg_assign(const From& x); + + template + typename Enable_If<((Is_Singleton::value || Is_Interval::value) + && (Is_Singleton::value || Is_Interval::value)), I_Result>::type + add_assign(const From1& x, const From2& y); + + template + typename Enable_If<((Is_Singleton::value || Is_Interval::value) + && (Is_Singleton::value || Is_Interval::value)), I_Result>::type + sub_assign(const From1& x, const From2& y); + + template + typename Enable_If<((Is_Singleton::value || Is_Interval::value) + && (Is_Singleton::value || Is_Interval::value)), I_Result>::type + mul_assign(const From1& x, const From2& y); + + template + typename Enable_If<((Is_Singleton::value || Is_Interval::value) + && (Is_Singleton::value || Is_Interval::value)), I_Result>::type + div_assign(const From1& x, const From2& y); + + template + typename Enable_If::value, void>::type + CC76_widening_assign(const From& y, Iterator first, Iterator last); + +private: + Boundary lower_; + Boundary upper_; +#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG + unsigned int lower_loaded:1; + unsigned int upper_loaded:1; + unsigned int completed:1; +#endif +}; + +} // 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 +inline memory_size_type +Interval::external_memory_in_bytes() const { + return Parma_Polyhedra_Library::external_memory_in_bytes(lower()) + + Parma_Polyhedra_Library::external_memory_in_bytes(upper()); +} + +template +inline memory_size_type +Interval::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +template +inline void +Interval::swap(Interval& y) { + std::swap(lower(), y.lower()); + std::swap(upper(), y.upper()); + std::swap(info(), y.info()); +} + +template +inline bool +f_is_empty(const Interval& x) { + return x.is_empty(); +} +template +inline bool +f_is_singleton(const Interval& x) { + return x.is_singleton(); +} +template +inline int +is_infinity(const Interval& x) { + return x.is_infinity(); +} + +namespace Interval_NS { + +template +inline const Boundary& +f_lower(const Interval& x) { + return x.lower(); +} +template +inline const Boundary& +f_upper(const Interval& x) { + return x.upper(); +} +template +inline const Info& +f_info(const Interval& 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_empty_result, false); + const_bool_nodef(check_inexact, false); +}; + +typedef Interval_Restriction_None > Scalar_As_Interval_Info; + +const Scalar_As_Interval_Info SCALAR_INFO; + +typedef Interval_Restriction_None > Scalar_As_Interval_Info_Open; + +template +inline typename Enable_If::value, const T&>::type +f_lower(const T& x) { + return x; +} +template +inline typename Enable_If::value, const T&>::type +f_upper(const T& x) { + return x; +} +template +inline typename Enable_If::value, const Scalar_As_Interval_Info&>::type +f_info(const T&) { + return SCALAR_INFO; +} +template +inline typename Enable_If::value, Scalar_As_Interval_Info_Open>::type +f_info(const T&, bool open) { + return Scalar_As_Interval_Info_Open(open); +} + +template +inline typename Enable_If::value, bool>::type +f_is_empty(const T& x) { + return is_not_a_number(x); +} + +template +inline typename Enable_If::value, bool>::type +f_is_singleton(const T& x) { + return !f_is_empty(x); +} + +template +inline typename Enable_If::value || Is_Interval::value, Ternary>::type +f_is_empty_lazy(const T& x) { + if (f_info(x).get_interval_property(CARDINALITY_0)) + return f_info(x).get_interval_property(CARDINALITY_IS) ? T_YES : T_NO; + else + return T_MAYBE; +} + +} // namespace Interval_NS + +template +inline typename Enable_If::value || Is_Interval::value, bool>::type +is_singleton_integer(const T& x) { + return is_singleton(x) && is_integer(f_lower(x)); +} + +template +inline typename Enable_If::value || Is_Interval::value, bool>::type +check_empty_arg(const T& x) { + if (f_info(x).may_be_empty) + return f_is_empty(x); + else { + assert(!f_is_empty(x)); + return false; + } +} + +template +inline I_Result +check_empty_result(const Interval& x, I_Result r) { + if (Info::check_empty_result && f_is_empty(x)) + return I_EMPTY; + else + return static_cast(r | I_MAYBE_EMPTY); +} + +template +inline typename Enable_If<((Is_Singleton::value || Is_Interval::value) + && (Is_Singleton::value || Is_Interval::value) + && (Is_Interval::value || Is_Interval::value)), + bool>::type +operator==(const T1& x, const T2& y) { + assert(f_OK(x)); + assert(f_OK(y)); + if (check_empty_arg(x)) + return check_empty_arg(y); + else if (check_empty_arg(y)) + return false; + // FIXME: the two restrictions should be evaluated in the context of + // the specific interval + return eq_restriction(f_info(x), f_info(y)) + && 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 +inline typename Enable_If<((Is_Singleton::value || Is_Interval::value) + && (Is_Singleton::value || Is_Interval::value) + && (Is_Interval::value || Is_Interval::value)), + bool>::type +operator!=(const T1& x, const T2& y) { + return !(x == y); +} + +template +template +inline typename Enable_If::value || Is_Interval::value, bool>::type +Interval::contains(const T& y) const { + assert(OK()); + assert(f_OK(y)); + if (check_empty_arg(y)) + return true; + if (check_empty_arg(*this)) + return false; + // FIXME: the two restrictions should be evaluated in the context of + // the specific interval + if (!contains_restriction(info(), f_info(y))) + 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 +template +inline typename Enable_If::value || Is_Interval::value, bool>::type +Interval::strictly_contains(const T& y) const { + assert(OK()); + assert(f_OK(y)); + if (check_empty_arg(y)) + return !check_empty_arg(*this); + if (check_empty_arg(*this)) + return false; + // FIXME: the two restrictions should be evaluated in the context of + // the specific interval + if (!contains_restriction(info(), f_info(y))) + return false; + else if (!eq_restriction(info(), f_info(y))) + return le(LOWER, lower(), info(), LOWER, f_lower(y), f_info(y)) + && ge(UPPER, upper(), info(), UPPER, f_upper(y), f_info(y)); + 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 +template +inline typename Enable_If::value + || Is_Interval::value, bool>::type +Interval::is_disjoint_from(const T& y) const { + assert(OK()); + assert(f_OK(y)); + if (check_empty_arg(*this) || check_empty_arg(y)) + return true; +// CHECKME. +// if (!contains_restriction(info(), f_info(y))) +// return false; + return gt(LOWER, lower(), info(), UPPER, f_upper(y), f_info(y)) + || lt(UPPER, upper(), info(), LOWER, f_lower(y), f_info(y)); +} + +template +template +inline I_Result +Interval::assign(const From1& l, const From2& u) { + info().clear(); + Result rl = Boundary_NS::assign(LOWER, lower(), info(), LOWER, l, f_info(l)); + Result ru = Boundary_NS::assign(UPPER, upper(), info(), UPPER, u, f_info(u)); + complete_init_internal(); + assert(OK()); + // The following Parma_Polyhedra_Library:: qualification is to work + // around a bug in version 10.0 of the Intel C/C++ compiler. + return Parma_Polyhedra_Library::check_empty_result(*this, combine(rl, ru)); +} + +template +template +inline typename Enable_If::value + || Is_Interval::value, I_Result>::type +Interval::assign(const From& x) { + assert(f_OK(x)); + if (check_empty_arg(x)) + return assign(EMPTY); + PPL_DIRTY_TEMP(To_Info, to_info); + to_info.clear(); + if (!assign_restriction(to_info, x)) + return assign(EMPTY); + Result rl = Boundary_NS::assign(LOWER, lower(), to_info, + LOWER, f_lower(x), f_info(x)); + Result ru = Boundary_NS::assign(UPPER, upper(), to_info, + UPPER, f_upper(x), f_info(x)); + assign_or_swap(info(), to_info); + complete_init_internal(); + assert(OK()); + return combine(rl, ru); +} + +template +template +inline typename Enable_If::value + || Is_Interval::value, I_Result>::type +Interval::join_assign(const From& x) { + assert(f_OK(x)); + if (check_empty_arg(*this)) + return assign(x); + if (check_empty_arg(x)) + return combine(V_EQ, V_EQ); + if (!join_restriction(info(), *this, x)) + return assign(EMPTY); + info().set_interval_property(CARDINALITY_IS, false); + info().set_interval_property(CARDINALITY_0); + info().set_interval_property(CARDINALITY_1, false); + Result rl, 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)); + assert(OK()); + return combine(rl, ru); +} + +template +template +inline typename Enable_If<((Is_Singleton::value + || Is_Interval::value) + && (Is_Singleton::value + || Is_Interval::value)), I_Result>::type +Interval::join_assign(const From1& x, const From2& y) { + assert(f_OK(x)); + 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(); + if (!join_restriction(to_info, x, y)) + return assign(EMPTY); + to_info.set_interval_property(CARDINALITY_0); + Result rl, 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); + complete_init_internal(); + assert(OK()); + return combine(rl, ru); +} + +template +template +inline typename Enable_If::value + || Is_Interval::value, bool>::type +Interval::can_be_exactly_joined_to(const Type& x) const { + // FIXME: the two restrictions should be evaluated in the context of + // the specific interval + if (!eq_restriction(info(), f_info(x))) + return false; + PPL_DIRTY_TEMP(Boundary, b); + if (gt(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x))) { + b = lower(); + return info().restrict(round_dir_check(LOWER, true), b, V_LT) == V_EQ && + 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 info().restrict(round_dir_check(UPPER, true), b, V_GT) == V_EQ && + eq(UPPER, b, info(), LOWER, f_lower(x), f_info(x)); + } + return true; +} + + +template +template +inline typename Enable_If::value + || Is_Interval::value, I_Result>::type +Interval::intersect_assign(const From& x) { + assert(f_OK(x)); + if (!intersect_restriction(info(), *this, x)) + return assign(EMPTY); + // FIXME: more accurate? + invalidate_cardinality_cache(); + Result rl, ru; + rl = max_assign(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)); + ru = min_assign(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)); + assert(OK()); + // The following Parma_Polyhedra_Library:: qualification is to work + // around a bug in version 10.0 of the Intel C/C++ compiler. + return Parma_Polyhedra_Library::check_empty_result(*this, combine(rl, ru)); +} + +template +template +inline typename Enable_If<((Is_Singleton::value + || Is_Interval::value) + && (Is_Singleton::value + || Is_Interval::value)), I_Result>::type +Interval::intersect_assign(const From1& x, + const From2& y) { + assert(f_OK(x)); + assert(f_OK(y)); + PPL_DIRTY_TEMP(To_Info, to_info); + to_info.clear(); + if (!intersect_restriction(to_info, x, y)) + return assign(EMPTY); + Result rl, ru; + rl = max_assign(LOWER, lower(), to_info, + LOWER, f_lower(x), f_info(x), + LOWER, f_lower(y), f_info(y)); + ru = 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); + complete_init_internal(); + assert(OK()); + // The following Parma_Polyhedra_Library:: qualification is to work + // around a bug in version 10.0 of the Intel C/C++ compiler. + return Parma_Polyhedra_Library::check_empty_result(*this, combine(rl, ru)); +} + +template +template +inline typename Enable_If::value + || Is_Interval::value, I_Result>::type +Interval::difference_assign(const From& x) { + assert(f_OK(x)); + // FIXME: restrictions + 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, ru = V_EQ; + if (nl) { + if (nu) + return assign(EMPTY); + else { + invalidate_cardinality_cache(); + info().clear_boundary_properties(LOWER); + rl = complement(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x)); + } + } + else if (nu) { + invalidate_cardinality_cache(); + info().clear_boundary_properties(UPPER); + ru = complement(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x)); + } + assert(OK()); + return combine(rl, ru); +} + +template +template +inline typename Enable_If<((Is_Singleton::value + || Is_Interval::value) + && (Is_Singleton::value + || Is_Interval::value)), I_Result>::type +Interval::difference_assign(const From1& x, + const From2& y) { + assert(f_OK(x)); + assert(f_OK(y)); + PPL_DIRTY_TEMP(To_Info, to_info); + to_info.clear(); + // FIXME: restrictions + 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, 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); + complete_init_internal(); + assert(OK()); + return combine(rl, ru); +} + +template +template +inline typename Enable_If::value + || Is_Interval::value, I_Result>::type +Interval +::refine_existential(Relation_Symbol rel, const From& x) { + assert(OK()); + 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); + Result ru = Boundary_NS::assign(UPPER, upper(), info(), + UPPER, f_upper(x), f_info(x), true); + invalidate_cardinality_cache(); + normalize(); + // The following Parma_Polyhedra_Library:: qualification is to work + // around a bug in version 10.0 of the Intel C/C++ compiler. + return Parma_Polyhedra_Library::check_empty_result(*this, + combine(V_EQ, ru)); + } + 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); + Result ru = Boundary_NS::assign(UPPER, upper(), info(), + UPPER, f_upper(x), f_info(x)); + invalidate_cardinality_cache(); + normalize(); + // The following Parma_Polyhedra_Library:: qualification is to work + // around a bug in version 10.0 of the Intel C/C++ compiler. + return Parma_Polyhedra_Library::check_empty_result(*this, + combine(V_EQ, ru)); + } + 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); + Result rl = Boundary_NS::assign(LOWER, lower(), info(), + LOWER, f_lower(x), f_info(x), true); + invalidate_cardinality_cache(); + normalize(); + // The following Parma_Polyhedra_Library:: qualification is to work + // around a bug in version 10.0 of the Intel C/C++ compiler. + return Parma_Polyhedra_Library::check_empty_result(*this, + combine(rl, V_EQ)); + } + 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); + Result rl = Boundary_NS::assign(LOWER, lower(), info(), + LOWER, f_lower(x), f_info(x)); + invalidate_cardinality_cache(); + normalize(); + // The following Parma_Polyhedra_Library:: qualification is to work + // around a bug in version 10.0 of the Intel C/C++ compiler. + return Parma_Polyhedra_Library::check_empty_result(*this, + combine(rl, V_EQ)); + } + 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))) + lower_shrink(); + if (eq(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x))) + upper_shrink(); + invalidate_cardinality_cache(); + normalize(); + // The following Parma_Polyhedra_Library:: qualification is to work + // around a bug in version 10.0 of the Intel C/C++ compiler. + return Parma_Polyhedra_Library::check_empty_result(*this, + combine(V_EQ, V_EQ)); + } + default: + assert(false); + return I_EMPTY; + } +} + +template +template +inline typename Enable_If::value + || Is_Interval::value, I_Result>::type +Interval::refine_universal(Relation_Symbol rel, + const From& x) { + assert(OK()); + 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))); + invalidate_cardinality_cache(); + normalize(); + // The following Parma_Polyhedra_Library:: qualification is to work + // around a bug in version 10.0 of the Intel C/C++ compiler. + return Parma_Polyhedra_Library::check_empty_result(*this, + combine(V_EQ, ru)); + } + 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); + invalidate_cardinality_cache(); + normalize(); + // The following Parma_Polyhedra_Library:: qualification is to work + // around a bug in version 10.0 of the Intel C/C++ compiler. + return Parma_Polyhedra_Library::check_empty_result(*this, + combine(V_EQ, ru)); + } + 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))); + invalidate_cardinality_cache(); + normalize(); + // The following Parma_Polyhedra_Library:: qualification is to work + // around a bug in version 10.0 of the Intel C/C++ compiler. + return Parma_Polyhedra_Library::check_empty_result(*this, + combine(rl, V_EQ)); + } + 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); + invalidate_cardinality_cache(); + normalize(); + // The following Parma_Polyhedra_Library:: qualification is to work + // around a bug in version 10.0 of the Intel C/C++ compiler. + return Parma_Polyhedra_Library::check_empty_result(*this, + combine(rl, V_EQ)); + } + 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))) + lower_shrink(); + if (eq(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x))) + upper_shrink(); + invalidate_cardinality_cache(); + normalize(); + // The following Parma_Polyhedra_Library:: qualification is to work + // around a bug in version 10.0 of the Intel C/C++ compiler. + return Parma_Polyhedra_Library::check_empty_result(*this, + combine(V_EQ, V_EQ)); + } + default: + assert(false); + return I_EMPTY; + } +} + +template +template +inline typename Enable_If::value + || Is_Interval::value, I_Result>::type +Interval::neg_assign(const From& x) { + assert(f_OK(x)); + if (check_empty_arg(x)) + return assign(EMPTY); + PPL_DIRTY_TEMP(To_Info, to_info); + to_info.clear(); + if (!neg_restriction(to_info, x)) + return assign(EMPTY); + Result rl, 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); + complete_init_internal(); + assert(OK()); + return combine(rl, ru); +} + +template +template +inline typename Enable_If<((Is_Singleton::value + || Is_Interval::value) + && (Is_Singleton::value + || Is_Interval::value)), I_Result>::type +Interval::add_assign(const From1& x, const From2& y) { + assert(f_OK(x)); + assert(f_OK(y)); + if (check_empty_arg(x) || check_empty_arg(y)) + return assign(EMPTY); + int inf = Parma_Polyhedra_Library::is_infinity(x); + if (inf) { + if (Parma_Polyhedra_Library::is_infinity(y) == -inf) + return assign(EMPTY); + } + else + inf = Parma_Polyhedra_Library::is_infinity(y); + if (inf < 0) + return assign(MINUS_INFINITY); + else if (inf > 0) + return assign(PLUS_INFINITY); + PPL_DIRTY_TEMP(To_Info, to_info); + to_info.clear(); + if (!add_restriction(to_info, x, y)) + return assign(EMPTY); + 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); + complete_init_internal(); + assert(OK()); + return combine(rl, ru); +} + +template +template +inline typename Enable_If<((Is_Singleton::value + || Is_Interval::value) + && (Is_Singleton::value + || Is_Interval::value)), I_Result>::type +Interval::sub_assign(const From1& x, const From2& y) { + assert(f_OK(x)); + assert(f_OK(y)); + if (check_empty_arg(x) || check_empty_arg(y)) + return assign(EMPTY); + int inf = Parma_Polyhedra_Library::is_infinity(x); + if (inf) { + if (Parma_Polyhedra_Library::is_infinity(y) == inf) + return assign(EMPTY); + } + else + inf = -Parma_Polyhedra_Library::is_infinity(y); + if (inf < 0) + return assign(MINUS_INFINITY); + else if (inf > 0) + return assign(PLUS_INFINITY); + + PPL_DIRTY_TEMP(To_Info, to_info); + to_info.clear(); + if (!sub_restriction(to_info, x, y)) + return assign(EMPTY); + Result rl, 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); + complete_init_internal(); + 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 +template +inline typename Enable_If<((Is_Singleton::value + || Is_Interval::value) + && (Is_Singleton::value + || Is_Interval::value)), I_Result>::type +Interval::mul_assign(const From1& x, const From2& y) { + assert(f_OK(x)); + 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 = Parma_Polyhedra_Library::is_infinity(x); + int ls, us; + if (inf) { + ls = yls; + us = yus; + goto inf; + } + else { + inf = Parma_Polyhedra_Library::is_infinity(y); + if (inf) { + 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 = -inf; + if (inf < 0) + return assign(MINUS_INFINITY); + else + return assign(PLUS_INFINITY); + } + } + + PPL_DIRTY_TEMP(To_Info, to_info); + to_info.clear(); + if (!mul_restriction(to_info, x, y)) + return assign(EMPTY); + Result rl, 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); + complete_init_internal(); + 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 +template +inline typename Enable_If<((Is_Singleton::value + || Is_Interval::value) + && (Is_Singleton::value + || Is_Interval::value)), I_Result>::type +Interval::div_assign(const From1& x, const From2& y) { + assert(f_OK(x)); + 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 = Parma_Polyhedra_Library::is_infinity(x); + if (inf) { + if (Parma_Polyhedra_Library::is_infinity(y)) + return assign(EMPTY); + if (yls == -yus) + return set_infinities(); + if (yls < 0 || yus < 0) + inf = -inf; + if (inf < 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(); + if (!div_restriction(to_info, x, y)) + return assign(EMPTY); + Result rl, 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 { + // FIXME: restrictions + return static_cast(assign(UNIVERSE) | I_SINGULARITIES); + } + assign_or_swap(lower(), to_lower); + assign_or_swap(info(), to_info); + complete_init_internal(); + assert(OK()); + return combine(rl, ru); +} + +template +inline typename Enable_If::value, Interval >::type +operator+(const Interval& x, const T& y) { + Interval z; + z.add_assign(x, y); + return z; +} + +template +inline typename Enable_If::value, Interval >::type +operator+(const T& x, const Interval& y) { + Interval z; + z.add_assign(x, y); + return z; +} + +template +inline Interval +operator+(const Interval& x, const Interval& y) { + Interval z; + z.add_assign(x, y); + return z; +} + +template +inline typename Enable_If::value, Interval >::type +operator-(const Interval& x, const T& y) { + Interval z; + z.sub_assign(x, y); + return z; +} + +template +inline typename Enable_If::value, Interval >::type +operator-(const T& x, const Interval& y) { + Interval z; + z.sub_assign(x, y); + return z; +} + +template +inline Interval +operator-(const Interval& x, const Interval& y) { + Interval z; + z.sub_assign(x, y); + return z; +} + +template +inline typename Enable_If::value, Interval >::type +operator*(const Interval& x, const T& y) { + Interval z; + z.mul_assign(x, y); + return z; +} + +template +inline typename Enable_If::value, Interval >::type +operator*(const T& x, const Interval& y) { + Interval z; + z.mul_assign(x, y); + return z; +} + +template +inline Interval +operator*(const Interval& x, const Interval& y) { + Interval z; + z.mul_assign(x, y); + return z; +} + +template +inline typename Enable_If::value, Interval >::type +operator/(const Interval& x, const T& y) { + Interval z; + z.div_assign(x, y); + return z; +} + +template +inline typename Enable_If::value, Interval >::type +operator/(const T& x, const Interval& y) { + Interval z; + z.div_assign(x, y); + return z; +} + +template +inline Interval +operator/(const Interval& x, const Interval& y) { + Interval z; + z.div_assign(x, y); + return z; +} + +template +inline std::ostream& +operator<<(std::ostream& os, const Interval& x) { + // assert(x.OK()); + 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() ? ")" : "]"); + output_restriction(os, x.info()); + return os; +} + +template +inline void +Interval::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 +inline bool +Interval::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; +#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG + complete_init_internal(); +#endif + 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 struct Select_Temp_Boundary_Type; + +template +struct Select_Temp_Boundary_Type { + typedef Interval_Boundary_Type type; +}; + +template <> +struct Select_Temp_Boundary_Type { + typedef double type; +}; + +template <> +struct Select_Temp_Boundary_Type { + typedef signed long long type; +}; + +template <> +struct Select_Temp_Boundary_Type { + typedef signed long long type; +}; + +template <> +struct Select_Temp_Boundary_Type { + typedef signed long long type; +}; + +template <> +struct Select_Temp_Boundary_Type { + typedef signed long long type; +}; + +template <> +struct Select_Temp_Boundary_Type { + typedef signed long long type; +}; + +template <> +struct Select_Temp_Boundary_Type { + typedef signed long long type; +}; + +template <> +struct Select_Temp_Boundary_Type { + typedef signed long long type; +}; + +template <> +struct Select_Temp_Boundary_Type { + typedef signed long long type; +}; + +template <> +struct Select_Temp_Boundary_Type { + typedef signed long long type; +}; + +} // namespace Parma_Polyhedra_Library + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Interval */ +template +inline void +swap(Parma_Polyhedra_Library::Interval& x, + Parma_Polyhedra_Library::Interval& y) { + x.swap(y); +} + +} // namespace std + +/* Automatically generated from PPL source file ../src/Interval.templates.hh line 1. */ +/* Interval class implementation: non-inline template functions. +*/ + + +#include + +namespace Parma_Polyhedra_Library { + +template +template +typename Enable_If::value, void>::type +Interval::CC76_widening_assign(const From& y, + Iterator first, + Iterator last) { + // We assume that `y' is contained in or equal to `*this'. + assert(contains(y)); + Interval& x = *this; + + // Upper bound. + if (!x.upper_is_unbounded()) { + Boundary& x_ub = x.upper(); + const Boundary& y_ub = y.upper(); + assert(!y.upper_is_unbounded() && 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_set(UNBOUNDED); + } + } + + // Lower bound. + if (!x.lower_is_unbounded()) { + Boundary& x_lb = x.lower(); + const Boundary& y_lb = y.lower(); + assert(!y.lower_is_unbounded() && 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_set(UNBOUNDED); + } + } + else + x_lb = *--k; + } + } +} + +template +inline std::istream& +operator>>(std::istream& is, Interval& x) { + // Eat leading white space. + int c; + do { + c = is.get(); + } while (isspace(c)); + + // Get the opening parenthesis and handle the empty interval case. + bool lower_open = false; + if (c == '(') + lower_open = true; + else if (c == '[') { + c = is.get(); + if (c == ']') { + // Empty interval. + x.assign(EMPTY); + return is; + } + else + is.unget(); + } + else { + is.unget(); + is.setstate(std::ios_base::failbit); + return is; + } + + // Get the lower bound. + Boundary lower_bound; + Result lower_r = input(lower_bound, is, ROUND_DOWN); + if (lower_r == V_CVT_STR_UNK || lower_r == VC_NAN) { + is.setstate(std::ios_base::failbit); + return is; + } + + // Match the comma separating the lower and upper bounds. + do { + c = is.get(); + } while (isspace(c)); + if (c != ',') { + is.unget(); + is.setstate(std::ios_base::failbit); + return is; + } + + // Get the upper bound. + Boundary upper_bound; + Result upper_r = input(upper_bound, is, ROUND_UP); + if (upper_r == V_CVT_STR_UNK || upper_r == VC_NAN) { + is.setstate(std::ios_base::failbit); + return is; + } + + // Get the closing parenthesis. + do { + c = is.get(); + } while (isspace(c)); + bool upper_open = false; + if (c == ')') + upper_open = true; + else if (c != ']') { + is.unget(); + is.setstate(std::ios_base::failbit); + return is; + } + + // Buld interval. + bool lower_unbounded = false; + bool upper_unbounded = false; + switch (lower_r) { + case V_EQ: + break; + case V_LE: + lower_open = true; + break; + case VC_MINUS_INFINITY: + case V_NEG_OVERFLOW: + lower_unbounded = true; + break; + case VC_PLUS_INFINITY: + case V_POS_OVERFLOW: + if (upper_r == VC_PLUS_INFINITY || upper_r == V_POS_OVERFLOW) + x.assign(UNIVERSE); + else + x.assign(EMPTY); + return is; + default: + assert(false); + } + switch (upper_r) { + case V_EQ: + break; + case V_GE: + upper_open = true; + break; + case VC_MINUS_INFINITY: + case V_NEG_OVERFLOW: + if (lower_r == VC_MINUS_INFINITY || lower_r == V_NEG_OVERFLOW) + x.assign(UNIVERSE); + else + x.assign(EMPTY); + return is; + case VC_PLUS_INFINITY: + case V_POS_OVERFLOW: + upper_unbounded = true; + break; + default: + assert(false); + } + + if (!lower_unbounded + && !upper_unbounded + && (lower_bound > upper_bound + || (lower_open && lower_bound == upper_bound))) + x.assign(EMPTY); + else { + x.assign(UNIVERSE); + if (!lower_unbounded) + x.refine_existential((lower_open ? GREATER_THAN : GREATER_OR_EQUAL), + lower_bound); + if (!upper_unbounded) + x.refine_existential((upper_open ? LESS_THAN : LESS_OR_EQUAL), + upper_bound); + } + return is; +} + +template +template +typename Enable_If::value, bool>::type +Interval::simplify_using_context_assign(const From& y) { + // FIXME: the following code wrongly assumes that intervals are closed + // and have no restrictions. It must be generalized. + if (lt(UPPER, upper(), info(), LOWER, f_lower(y), f_info(y))) { + lower_set(UNBOUNDED); + return false; + } + if (gt(LOWER, lower(), info(), UPPER, f_upper(y), f_info(y))) { + upper_set(UNBOUNDED); + return false; + } + // Weakening the upper bound. + if (!upper_is_unbounded() && !y.upper_is_unbounded() + && y.upper() <= upper()) + upper_set(UNBOUNDED); + // Weakening the lower bound. + if (!lower_is_unbounded() && !y.lower_is_unbounded() + && y.lower() >= lower()) + lower_set(UNBOUNDED); + return true; +} + +template +template +typename Enable_If::value, void>::type +Interval::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 982. */ + +/* Automatically generated from PPL source file ../src/Rational_Interval.hh line 27. */ +#include + +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_empty_result, false); + const_bool_nodef(check_inexact, false); +}; + +typedef +Interval_Restriction_None > +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 Rational_Interval; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Box.defs.hh line 1. */ +/* Box class declaration. +*/ + + +/* Automatically generated from PPL source file ../src/Partially_Reduced_Product.types.hh line 1. */ + + +namespace Parma_Polyhedra_Library { + +template +class Smash_Reduction; + +template +class Constraints_Reduction; + +template +class No_Reduction; + +template +class Partially_Reduced_Product; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Box.defs.hh line 46. */ +#include +#include + +namespace Parma_Polyhedra_Library { + +//! Returns true 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 false is returned. +*/ +template +bool operator==(const Box& x, const Box& y); + +//! Returns true if and only if \p x and \p y aren't the same box. +/*! \relates Box + Note that \p x and \p y may be dimension-incompatible boxes: + in this case, the value true is returned. +*/ +template +bool operator!=(const Box& x, const Box& y); + +namespace IO_Operators { + +//! Output operator. +/*! \relates Parma_Polyhedra_Library::Box */ +template +std::ostream& operator<<(std::ostream& s, const Box& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool +rectilinear_distance_assign(Checked_Number& r, + const Box& x, + const Box& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool +rectilinear_distance_assign(Checked_Number& r, + const Box& x, + const Box& 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 true; + returns false 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 +bool +rectilinear_distance_assign(Checked_Number& r, + const Box& x, + const Box& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool +euclidean_distance_assign(Checked_Number& r, + const Box& x, + const Box& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool +euclidean_distance_assign(Checked_Number& r, + const Box& x, + const Box& 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 true; + returns false 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 +bool +euclidean_distance_assign(Checked_Number& r, + const Box& x, + const Box& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool +l_infinity_distance_assign(Checked_Number& r, + const Box& x, + const Box& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool +l_infinity_distance_assign(Checked_Number& r, + const Box& x, + const Box& 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 true; + returns false 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 +bool +l_infinity_distance_assign(Checked_Number& r, + const Box& x, + const Box& 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 +bool +l_m_distance_assign(Checked_Number& r, + const Box& x, const Box& 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 interval constraint (resp., interval congruence) + is a syntactic constraint (resp., congruence) that only mentions + a single space dimension. + + The Box domain optimally supports: + - 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 +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 + explicit Box(const Box& 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 + explicit Box(const BD_Shape& 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 + explicit Box(const Octagonal_Shape& 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& ph, + 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 + explicit Box(const Partially_Reduced_Product& 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 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 true if and only if \p *this is an empty box. + bool is_empty() const; + + //! Returns true if and only if \p *this is a universe box. + bool is_universe() const; + + /*! \brief + Returns true if and only if \p *this + is a topologically closed subset of the vector space. + */ + bool is_topologically_closed() const; + + //! Returns true if and only if \p *this is discrete. + bool is_discrete() const; + + //! Returns true if and only if \p *this is a bounded box. + bool is_bounded() const; + + /*! \brief + Returns true if and only if \p *this + contains at least one integer point. + */ + bool contains_integer_point() const; + + /*! \brief + Returns true 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 true 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 true 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 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 + true 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, + false 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 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 + 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 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, + false 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 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 + true 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, + false 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 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 + 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 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, + false 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 true 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&) const; + + /*! \brief + Returns true 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&) const; + + /*! \brief + Returns true 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 true 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. + + \exception std::invalid_argument + Thrown if \p *this and \p cs are dimension-incompatible. + */ + 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 propagagion on \p *this. + + \param cs + The constraints to be used for constraint propagation. + + \exception std::invalid_argument + Thrown if \p *this and \p cs are dimension-incompatible. + */ + void propagate_constraints(const 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 to_be_unconstrained, + assigning the result to \p *this. + + \param to_be_unconstrained + 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 to_be_removed. + */ + void unconstrain(const Variables_Set& to_be_unconstrained); + + //! 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 true is returned, + otherwise false 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()); + + /*! \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 + 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 must 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_widening_assign(const Box& 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 must 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 + void CC76_widening_assign(const Box& 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 must 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 must 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 decreasing iteration sequence). Hence, the call + x.CC76_narrowing_assign(y) will assign to \p x + the result of the computation \f$\mathtt{y} \Delta \mathtt{x}\f$. + */ + void CC76_narrowing_assign(const Box& 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 to_be_removed + The set of Variable objects corresponding to the dimensions to be removed. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with one of the Variable + objects contained in \p to_be_removed. + */ + void remove_space_dimensions(const Variables_Set& to_be_removed); + + /*! \brief + Removes the higher dimensions so that the resulting space + will have dimension \p new_dimension. + + \exception std::invalid_argument + Thrown if \p new_dimension is greater than the space dimension + of \p *this. + */ + void remove_higher_space_dimensions(dimension_type new_dimension); + + /*! \brief + Remaps the dimensions of the vector space according to + a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function". + + \param pfunc + The partial function specifying the destiny of each dimension. + + The template class Partial_Function must provide the following + methods. + \code + bool has_empty_codomain() const + \endcode + returns true if and only if the represented partial + function has an empty co-domain (i.e., it is always undefined). + The has_empty_codomain() method will always be called + before the methods below. However, if + has_empty_codomain() returns true, 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 true is returned. + If \f$f\f$ is undefined in \f$k\f$, then false 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 + 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 max_space_dimension(). + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + and var has space dimension \f$k \leq n\f$, + then the \f$k\f$-th space dimension is + \ref expand_space_dimension "expanded" to \p m new space dimensions + \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$. + */ + void expand_space_dimension(Variable var, dimension_type m); + + //! Folds the space dimensions in \p to_be_folded into \p var. + /*! + \param to_be_folded + The set of Variable objects corresponding to the space dimensions + to be folded; + + \param var + The variable corresponding to the space dimension that is the + destination of the folding operation. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with \p var or with + one of the Variable objects contained in \p to_be_folded. + Also thrown if \p var is contained in \p to_be_folded. + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + var has space dimension \f$k \leq n\f$, + \p to_be_folded is a set of variables whose maximum space dimension + is also less than or equal to \f$n\f$, and \p var is not a member + of \p to_be_folded, then the space dimensions corresponding to + variables in \p to_be_folded are \ref fold_space_dimensions "folded" + into the \f$k\f$-th space dimension. + */ + void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var); + + //@} // Member Functions that May Modify the Dimension of the Vector Space + + /*! \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 k-th space dimension is unbounded below, returns + false. Otherwise returns true and set + \p closed, \p n and \p d accordingly. + + Let \f$I\f$ the interval corresponding to the k-th + space dimension. If \f$I\f$ is not bounded from below, simply return + false. Otherwise, set closed, + n and d as follows: closed + is set to true if the the lower boundary of \f$I\f$ + is closed and is set to false otherwise; + n and d are assigned the integers + \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$ + corresponds to the greatest lower bound of \f$I\f$. The fraction + \f$n/d\f$ is in canonical form if and only if \f$n\f$ and \f$d\f$ + have no common factors and \f$d\f$ is positive, \f$0/1\f$ being + the unique representation for zero. + + An undefined behavior is obtained if \p k is greater than + or equal to the space dimension of \p *this. + */ + bool get_lower_bound(dimension_type k, bool& closed, + Coefficient& n, Coefficient& d) const; + + /*! \brief + If the k-th space dimension is unbounded above, returns + false. Otherwise returns true and set + \p closed, \p n and \p d accordingly. + + Let \f$I\f$ the interval corresponding to the k-th + space dimension. If \f$I\f$ is not bounded from above, simply return + false. Otherwise, set closed, + n and d as follows: closed + is set to true if the the upper boundary of \f$I\f$ + is closed and is set to false otherwise; + n and d are assigned the integers + \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$ + corresponds to the least upper bound of \f$I\f$. + + An undefined behavior is obtained if \p k is greater than + or equal to the space dimension of \p *this. + */ + bool get_upper_bound(dimension_type k, bool& closed, + Coefficient& n, Coefficient& d) const; + + //! 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; + + 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 true if successful, false otherwise. + */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) + bool ascii_load(std::istream& s); + +private: + template + friend class Parma_Polyhedra_Library::Box; + + friend bool + operator==(const Box& x, const Box& y); + + friend std::ostream& + Parma_Polyhedra_Library + ::IO_Operators::operator<<<>(std::ostream& s, const Box& box); + + template + friend bool Parma_Polyhedra_Library::l_m_distance_assign + (Checked_Number& r, + const Box& x, const Box& y, const Rounding_Dir dir, + Temp& tmp0, Temp& tmp1, Temp& tmp2); + + //! The type of sequence used to implement the box. + typedef std::vector 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::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 object. +/*! \ingroup PPL_CXX_interface + The assertions supported are: + - empty up-to-date: the empty flag is meaningful; + - empty: the box is the empty set. + - universe: 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: + - empty up-to-date and empty excludes universe. +*/ +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 + Status(const typename Box::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 true if successful, false 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 all bits in \p mask are set. + bool test_all(flags_t mask) const; + + //! Check whether at least one 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 1559. */ +#undef PPL_IN_Box_CLASS + + //! The status flags to keep track of the internal state. + Status status; + + /*! \brief + Returns true if and only if the box is known to be empty. + + The return value false 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 true if and only if it is so. + */ + bool check_empty() const; + + /*! \brief + Returns a reference the interval that bounds + the box on the k-th space dimension. + */ + const ITV& operator[](dimension_type k) const; + + /*! \brief + WRITE ME. + */ + void + add_interval_constraint_no_check(dimension_type var_id, + Constraint::Type type, + Coefficient_traits::const_reference num, + Coefficient_traits::const_reference den); + + /*! \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 added. + Non-interval 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 constraints in \p cs to refine \p *this. + + \param cs + The constraints to be added. + Non-interval constraints are ignored. + + \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 exact; + we say it is inexact 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. + + \warning + If \p cs and \p *this are dimension-incompatible, + the behavior is undefined. + + \warning + This method may lead to non-termination. + */ + void propagate_constraints_no_check(const Constraint_System& cs); + + //! Checks if and how \p expr is bounded in \p *this. + /*! + Returns true if and only if \p from_above is + true and \p expr is bounded from above in \p *this, + or \p from_above is false and \p expr is bounded + from below in \p *this. + + \param expr + The linear expression to test; + + \param from_above + true 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 + true 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 + true 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, false 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 + true 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 + true 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, false 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& x) const; + + void throw_dimension_incompatible(const char* method, + dimension_type required_dim) const; + + void throw_dimension_incompatible(const char* method, + const Constraint& c) const; + + void throw_dimension_incompatible(const char* method, + const 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* name_row, + const Linear_Expression& y) const; + + static void throw_space_dimension_overflow(const char* method, + const char* reason); + + static void throw_constraint_incompatible(const char* method); + + static void throw_expression_too_complex(const char* method, + const Linear_Expression& e); + + static void throw_generic(const char* method, const char* reason); + //@} // Exception Throwers +}; + +namespace 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 num + The numerator of the constraint bound; + + \param den + The denominator of the constraint bound + + The interval constraint has the form + den * Variable(0) relsym num + where relsym is ==, > or >= + depending on the constraint_type. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +Poly_Con_Relation +interval_relation(const ITV& i, + const Constraint::Type constraint_type, + Coefficient_traits::const_reference num, + Coefficient_traits::const_reference den = 1); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Decodes the constraint \p c as an interval constraint. +/*! \relates Box + \return + true if the constraint \p c is an + \ref intervals "interval constraint"; + false otherwise. + + \param c + The constraint to be decoded. + + \param c_space_dim + The space dimension of the constraint \p c (it is assumed + to match the actual space dimension of \p c). + + \param c_num_vars + If true 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 true 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) +bool extract_interval_constraint(const Constraint& c, + dimension_type c_space_dim, + dimension_type& c_num_vars, + dimension_type& c_only_var); + +bool extract_interval_congruence(const Congruence& cg, + dimension_type cg_space_dim, + 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::Status class implementation: inline functions. +*/ + + +#include + +namespace Parma_Polyhedra_Library { + +template +inline +Box::Status::Status(flags_t mask) + : flags(mask) { +} + +template +inline +Box::Status::Status(const Status& y) + : flags(y.flags) { +} + +template +template +inline +Box::Status::Status(const typename Box::Status& y) + : flags(y.flags) { +} + +template +inline +Box::Status::Status() + : flags(NONE) { +} + +template +inline bool +Box::Status::test_all(flags_t mask) const { + return (flags & mask) == mask; +} + +template +inline bool +Box::Status::test_any(flags_t mask) const { + return flags & mask; +} + +template +inline void +Box::Status::set(flags_t mask) { + flags |= mask; +} + +template +inline void +Box::Status::reset(flags_t mask) { + flags &= ~mask; +} + +template +inline bool +Box::Status::test_empty_up_to_date() const { + return test_any(EMPTY_UP_TO_DATE); +} + +template +inline void +Box::Status::reset_empty_up_to_date() { + reset(EMPTY_UP_TO_DATE); +} + +template +inline void +Box::Status::set_empty_up_to_date() { + set(EMPTY_UP_TO_DATE); +} + +template +inline bool +Box::Status::test_empty() const { + return test_any(EMPTY); +} + +template +inline void +Box::Status::reset_empty() { + reset(EMPTY); +} + +template +inline void +Box::Status::set_empty() { + set(EMPTY); +} + +template +inline bool +Box::Status::test_universe() const { + return test_any(UNIVERSE); +} + +template +inline void +Box::Status::reset_universe() { + reset(UNIVERSE); +} + +template +inline void +Box::Status::set_universe() { + set(UNIVERSE); +} + +template +bool +Box::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 sep = ' '; + +/*! \relates Parma_Polyhedra_Library::Box::Status + Reads a keyword and its associated on/off flag from \p s. + Returns true if the operation is successful, + returns false otherwise. + When successful, \p positive is set to true if the flag + is on; it is set to false 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 +void +Box::Status::ascii_dump(std::ostream& s) const { + using namespace Implementation::Boxes; + s << (test_empty_up_to_date() ? yes : no) << empty_up_to_date << sep + << (test_empty() ? yes : no) << empty << sep + << (test_universe() ? yes : no) << universe << sep; +} + +PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(ITV, Box::Status) + +template +bool +Box::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. + 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/Box.inlines.hh line 32. */ + +namespace Parma_Polyhedra_Library { + +template +inline bool +Box::marked_empty() const { + return status.test_empty_up_to_date() && status.test_empty(); +} + +template +inline void +Box::set_empty() { + status.set_empty(); + status.set_empty_up_to_date(); +} + +template +inline void +Box::set_nonempty() { + status.reset_empty(); + status.set_empty_up_to_date(); +} + +template +inline void +Box::set_empty_up_to_date() { + status.set_empty_up_to_date(); +} + +template +inline void +Box::reset_empty_up_to_date() { + return status.reset_empty_up_to_date(); +} + +template +inline +Box::Box(const Box& y, Complexity_Class) + : seq(y.seq), status(y.status) { +} + +template +inline Box& +Box::operator=(const Box& y) { + seq = y.seq; + status = y.status; + return *this; +} + +template +inline void +Box::swap(Box& y) { + Box& x = *this; + std::swap(x.seq, y.seq); + std::swap(x.status, y.status); +} + +template +inline +Box::Box(const Constraint_System& cs, Recycle_Input) { + // Recycling is useless: just delegate. + Box tmp(cs); + this->swap(tmp); +} + +template +inline +Box::Box(const Generator_System& gs, Recycle_Input) { + // Recycling is useless: just delegate. + Box tmp(gs); + this->swap(tmp); +} + +template +inline +Box::Box(const Congruence_System& cgs, Recycle_Input) { + // Recycling is useless: just delegate. + Box tmp(cgs); + this->swap(tmp); +} + +template +inline memory_size_type +Box::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +template +inline dimension_type +Box::space_dimension() const { + return seq.size(); +} + +template +inline dimension_type +Box::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 +inline const ITV& +Box::operator[](const dimension_type k) const { + assert(k < seq.size()); + return seq[k]; +} + +template +inline const ITV& +Box::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 +inline void +Box::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(); + + assert(OK()); +} + +template +inline bool +Box::is_empty() const { + return marked_empty() || check_empty(); +} + +template +inline bool +Box::bounds_from_above(const Linear_Expression& expr) const { + return bounds(expr, true); +} + +template +inline bool +Box::bounds_from_below(const Linear_Expression& expr) const { + return bounds(expr, false); +} + +template +inline bool +Box::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 +inline bool +Box::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 +inline bool +Box::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 +inline bool +Box::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 +inline bool +Box::strictly_contains(const Box& y) const { + const Box& x = *this; + return x.contains(y) && !y.contains(x); +} + +template +inline void +Box::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_generic("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()]); + assert(OK()); +} + +template +inline bool +operator!=(const Box& x, const Box& y) { + return !(x == y); +} + +template +inline bool +Box::get_lower_bound(const dimension_type k, bool& closed, + Coefficient& n, Coefficient& d) const { + assert(k < seq.size()); + const ITV& seq_k = seq[k]; + + if (seq_k.lower_is_unbounded()) + return false; + + closed = !seq_k.lower_is_open(); + + PPL_DIRTY_TEMP0(mpq_class, lr); + assign_r(lr, seq_k.lower(), ROUND_NOT_NEEDED); + n = lr.get_num(); + d = lr.get_den(); + + return true; +} + +template +inline bool +Box::get_upper_bound(const dimension_type k, bool& closed, + Coefficient& n, Coefficient& d) const { + assert(k < seq.size()); + const ITV& seq_k = seq[k]; + + if (seq_k.upper_is_unbounded()) + return false; + + closed = !seq_k.upper_is_open(); + + PPL_DIRTY_TEMP0(mpq_class, ur); + assign_r(ur, seq_k.upper(), ROUND_NOT_NEEDED); + n = ur.get_num(); + d = ur.get_den(); + + return true; +} + +template +inline void +Box::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 +inline void +Box::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 +inline void +Box::add_recycled_constraints(Constraint_System& cs) { + add_constraints(cs); +} + +template +inline void +Box::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 +inline void +Box::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 +inline void +Box::add_recycled_congruences(Congruence_System& cgs) { + add_congruences(cgs); +} + +template +inline bool +Box::can_recycle_constraint_systems() { + return false; +} + +template +inline bool +Box::can_recycle_congruence_systems() { + return false; +} + +template +inline void +Box::widening_assign(const Box& y, unsigned* tp) { + CC76_widening_assign(y, tp); +} + +template +inline Congruence_System +Box::minimized_congruences() const { + // Only equalities can be congruences and these are already minimized. + return congruences(); +} + +template +inline void +Box +::add_interval_constraint_no_check(const dimension_type var_id, + const Constraint::Type type, + Coefficient_traits::const_reference num, + Coefficient_traits::const_reference den) { + assert(!marked_empty()); + assert(var_id < space_dimension()); + assert(den != 0); + + // The interval constraint is of the form + // `Variable(var_id) + num / den rel 0', where + // `rel' is either the relation `==', `>=', or `>'. + // For the purpose of refining the interval, this is + // (morally) turned into `Variable(var_id) rel -num/den'. + PPL_DIRTY_TEMP0(mpq_class, q); + assign_r(q.get_num(), num, ROUND_NOT_NEEDED); + assign_r(q.get_den(), den, ROUND_NOT_NEEDED); + q.canonicalize(); + // Turn `num/den' into `-num/den'. + q = -q; + + ITV& seq_v = seq[var_id]; + switch (type) { + case Constraint::EQUALITY: + seq_v.refine_existential(EQUAL, q); + break; + case Constraint::NONSTRICT_INEQUALITY: + seq_v.refine_existential((den > 0) ? GREATER_OR_EQUAL : LESS_OR_EQUAL, q); + assert(seq_v.OK()); + break; + case Constraint::STRICT_INEQUALITY: + seq_v.refine_existential((den > 0) ? GREATER_THAN : LESS_THAN, q); + break; + } + // FIXME: do check the value returned by `refine_existential' and + // set `empty' and `empty_up_to_date' as appropriate. + // This has to be done after reimplementation of intervals. + reset_empty_up_to_date(); + assert(OK()); +} + +template +inline void +Box::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 +inline void +Box::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 +inline void +Box::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 +inline void +Box::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 +inline void +Box::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 +inline void +Box::propagate_constraints(const Constraint_System& cs) { + // 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); +} + +template +inline void +Box::unconstrain(const Variable var) { + const dimension_type dim = var.id(); + // Dimension-compatibility check. + if (dim > space_dimension()) + throw_dimension_incompatible("unconstrain(var)", 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 `var' before cylindrification. + ITV& seq_var = seq[dim]; + if (seq_var.is_empty()) + set_empty(); + else + seq_var.assign(UNIVERSE); + assert(OK()); +} + +/*! \relates Box */ +template +inline bool +rectilinear_distance_assign(Checked_Number& r, + const Box& x, + const Box& y, + const Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2) { + return l_m_distance_assign > + (r, x, y, dir, tmp0, tmp1, tmp2); +} + +/*! \relates Box */ +template +inline bool +rectilinear_distance_assign(Checked_Number& r, + const Box& x, + const Box& y, + const Rounding_Dir dir) { + typedef Checked_Number 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 +inline bool +rectilinear_distance_assign(Checked_Number& r, + const Box& x, + const Box& 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(r, x, y, dir); +} + +/*! \relates Box */ +template +inline bool +euclidean_distance_assign(Checked_Number& r, + const Box& x, + const Box& y, + const Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2) { + return l_m_distance_assign > + (r, x, y, dir, tmp0, tmp1, tmp2); +} + +/*! \relates Box */ +template +inline bool +euclidean_distance_assign(Checked_Number& r, + const Box& x, + const Box& y, + const Rounding_Dir dir) { + typedef Checked_Number 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 +inline bool +euclidean_distance_assign(Checked_Number& r, + const Box& x, + const Box& 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(r, x, y, dir); +} + +/*! \relates Box */ +template +inline bool +l_infinity_distance_assign(Checked_Number& r, + const Box& x, + const Box& y, + const Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2) { + return l_m_distance_assign > + (r, x, y, dir, tmp0, tmp1, tmp2); +} + +/*! \relates Box */ +template +inline bool +l_infinity_distance_assign(Checked_Number& r, + const Box& x, + const Box& y, + const Rounding_Dir dir) { + typedef Checked_Number 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 +inline bool +l_infinity_distance_assign(Checked_Number& r, + const Box& x, + const Box& 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(r, x, y, dir); +} + +} // 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/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 +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 +class DB_Row_Impl_Handler; + +template +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 +class Ptr_Iterator; + +} // namespace Implementation + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Ptr_Iterator.defs.hh line 27. */ +#include + +namespace Parma_Polyhedra_Library { + +namespace Implementation { + +template +bool operator==(const Ptr_Iterator& x, const Ptr_Iterator& y); + +template +bool operator!=(const Ptr_Iterator& x, const Ptr_Iterator& y); + +template +bool operator<(const Ptr_Iterator& x, const Ptr_Iterator& y); + +template +bool operator<=(const Ptr_Iterator& x, const Ptr_Iterator& y); + +template +bool operator>(const Ptr_Iterator& x, const Ptr_Iterator& y); + +template +bool operator>=(const Ptr_Iterator& x, const Ptr_Iterator& y); + +template +typename Ptr_Iterator::difference_type operator-(const Ptr_Iterator& x, + const Ptr_Iterator& y); + +template +Ptr_Iterator

operator+(typename Ptr_Iterator

::difference_type m, + const Ptr_Iterator

& 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 +class Parma_Polyhedra_Library::Implementation::Ptr_Iterator + : public std::iterator::iterator_category, + typename std::iterator_traits

::value_type, + typename std::iterator_traits

::difference_type, + typename std::iterator_traits

::pointer, + typename std::iterator_traits

::reference> { +public: + typedef typename std::iterator_traits

::difference_type difference_type; + typedef typename std::iterator_traits

::reference reference; + typedef typename std::iterator_traits

::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 + Ptr_Iterator(const Ptr_Iterator& 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 + friend bool Parma_Polyhedra_Library::Implementation:: + operator==(const Ptr_Iterator& x, const Ptr_Iterator& y); + + template + friend bool Parma_Polyhedra_Library::Implementation:: + operator!=(const Ptr_Iterator& x, const Ptr_Iterator& y); + + template + friend bool Parma_Polyhedra_Library::Implementation:: + operator<(const Ptr_Iterator& x, const Ptr_Iterator& y); + + template + friend bool Parma_Polyhedra_Library::Implementation:: + operator<=(const Ptr_Iterator& x, const Ptr_Iterator& y); + + template + friend bool Parma_Polyhedra_Library::Implementation:: + operator>(const Ptr_Iterator& x, const Ptr_Iterator& y); + + template + friend bool Parma_Polyhedra_Library::Implementation:: + operator>=(const Ptr_Iterator& x, const Ptr_Iterator& y); + + template + friend typename Ptr_Iterator::difference_type + Parma_Polyhedra_Library::Implementation:: + operator-(const Ptr_Iterator& x, const Ptr_Iterator& y); + + friend Ptr_Iterator

+ Parma_Polyhedra_Library::Implementation:: + operator+<>(typename Ptr_Iterator

::difference_type m, + const Ptr_Iterator

& y); +}; + +/* Automatically generated from PPL source file ../src/Ptr_Iterator.inlines.hh line 1. */ +/* Ptr_Iterator class implementation: inline functions. +*/ + + +#include +#include + +namespace Parma_Polyhedra_Library { + +namespace Implementation { + +template +inline const P& +Ptr_Iterator

::base() const { + return p; +} + +template +inline +Ptr_Iterator

::Ptr_Iterator() + : p(P()) { +} + +template +inline +Ptr_Iterator

::Ptr_Iterator(const P& q) + : p(q) { +} + +template +template +inline +Ptr_Iterator

::Ptr_Iterator(const Ptr_Iterator& y) + : p(y.base()) { +} + +template +inline typename Ptr_Iterator

::reference +Ptr_Iterator

::operator*() const { + return *p; +} + +template +inline typename Ptr_Iterator

::pointer +Ptr_Iterator

::operator->() const { + return p; +} + +template +inline typename Ptr_Iterator

::reference +Ptr_Iterator

::operator[](const difference_type m) const { + return p[m]; +} + +template +inline Ptr_Iterator

& +Ptr_Iterator

::operator++() { + ++p; + return *this; +} + +template +inline Ptr_Iterator

+Ptr_Iterator

::operator++(int) { + return Ptr_Iterator(p++); +} + +template +inline Ptr_Iterator

& +Ptr_Iterator

::operator--() { + --p; + return *this; +} + +template +inline Ptr_Iterator

+Ptr_Iterator

::operator--(int) { + return Ptr_Iterator(p--); +} + + +template +inline Ptr_Iterator

& +Ptr_Iterator

::operator+=(const difference_type m) { + p += m; + return *this; +} + +template +inline Ptr_Iterator

& +Ptr_Iterator

::operator-=(const difference_type m) { + p -= m; + return *this; +} + +template +inline typename Ptr_Iterator

::difference_type +Ptr_Iterator

::operator-(const Ptr_Iterator& y) const { + return p - y.p; +} + +template +inline Ptr_Iterator

+Ptr_Iterator

::operator+(const difference_type m) const { + return Ptr_Iterator(p + m); +} + +template +inline Ptr_Iterator

+Ptr_Iterator

::operator-(const difference_type m) const { + return Ptr_Iterator(p - m); +} + +template +inline bool +operator==(const Ptr_Iterator

& x, const Ptr_Iterator& y) { + return x.base() == y.base(); +} + +template +inline bool +operator!=(const Ptr_Iterator

& x, const Ptr_Iterator& y) { + return x.base() != y.base(); +} + +template +inline bool +operator<(const Ptr_Iterator

& x, const Ptr_Iterator& y) { + return x.base() < y.base(); +} + +template +inline bool +operator<=(const Ptr_Iterator

& x, const Ptr_Iterator& y) { + return x.base() <= y.base(); +} + +template +inline bool +operator>(const Ptr_Iterator

& x, const Ptr_Iterator& y) { + return x.base() > y.base(); +} + +template +inline bool +operator>=(const Ptr_Iterator

& x, const Ptr_Iterator& y) { + return x.base() >= y.base(); +} + +template +inline typename Ptr_Iterator

::difference_type +operator-(const Ptr_Iterator

& x, const Ptr_Iterator& y) { + return x.base() - y.base(); +} + +template +inline Ptr_Iterator

+operator+(typename Ptr_Iterator

::difference_type m, + const Ptr_Iterator

& y) { + return Ptr_Iterator

(m + y.base()); +} + +} // namespace Implementation + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Ptr_Iterator.defs.hh line 170. */ + +/* Automatically generated from PPL source file ../src/DB_Row.defs.hh line 29. */ +#include +#include + +#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 true, 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 +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 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 nan, + not a number, 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 T().OK() gives true + (see below). + \code + ~T() + \endcode + is the destructor. + \code + bool is_nan() const + \endcode + returns true if and only \p *this represents + the not a number value. + \code + bool OK() const + \endcode + returns true if and only if \p *this satisfies all + its invariants. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +class Parma_Polyhedra_Library::DB_Row : private DB_Row_Impl_Handler { +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 + void construct_upward_approximation(const DB_Row& y, + dimension_type capacity); + + //@} + + //! Tight constructor: resizing will require reallocation. + DB_Row(dimension_type sz); + + //! Sizing constructor with capacity. + DB_Row(dimension_type sz, dimension_type capacity); + + //! Ordinary copy constructor. + DB_Row(const DB_Row& y); + + //! Copy constructor with specified capacity. + /*! + It is assumed that \p capacity is greater than or equal to \p y size. + */ + DB_Row(const DB_Row& y, dimension_type capacity); + + //! Copy constructor with specified size and capacity. + /*! + It is assumed that \p sz is greater than or equal to the size of \p y + and, of course, that \p sz is less than or equal to \p capacity. + Any new position is initialized to \f$+\infty\f$. + */ + DB_Row(const DB_Row& y, dimension_type sz, dimension_type capacity); + + //! Destructor. + ~DB_Row(); + + //! Assignment operator. + DB_Row& operator=(const DB_Row& y); + + //! Swaps \p *this with \p y. + void swap(DB_Row& y); + + //! Assigns the implementation of \p y to \p *this. + void assign(DB_Row& y); + + /*! \brief + Allocates memory for a default constructed DB_Row object, + allowing for \p capacity coefficients at most. + + It is assumed that no allocation has been performed before + (otherwise, a memory leak will occur). + After execution, the size of the DB_Row object is zero. + */ + void allocate(dimension_type capacity); + + //! Expands the row to size \p new_size. + /*! + Adds new positions to the implementation of the row + obtaining a new row with size \p new_size. + It is assumed that \p new_size is between the current size + and capacity of the row. The new positions are initialized + to \f$+\infty\f$. + */ + void expand_within_capacity(dimension_type new_size); + + //! Shrinks the row by erasing elements at the end. + /*! + Destroys elements of the row implementation + from position \p new_size to the end. + It is assumed that \p new_size is not greater than the current size. + */ + void shrink(dimension_type new_size); + + //! Returns the size() of the largest possible DB_Row. + static dimension_type max_size(); + + //! Gives the number of coefficients currently in use. + dimension_type size() const; + + //! \name Subscript operators. + //@{ + //! Returns a reference to the element of the row indexed by \p k. + T& operator[](dimension_type k); + + //! Returns a constant reference to the element of the row indexed by \p k. + const T& operator[](dimension_type k) const; + //@} + + //! A (non const) random access iterator to access the row's elements. + typedef Implementation::Ptr_Iterator iterator; + + //! A const random access iterator to access the row's elements. + typedef Implementation::Ptr_Iterator 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 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 +//! \name Classical comparison operators. +//@{ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +/*! \relates DB_Row */ +template +bool operator==(const DB_Row& x, const DB_Row& y); + +/*! \relates DB_Row */ +template +bool operator!=(const DB_Row& x, const DB_Row& 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 +class Parma_Polyhedra_Library::DB_Row_Impl_Handler::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 shrink() 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 + 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; + + //! The number of coefficients in the row. + dimension_type size_; + + //! The vector of coefficients. + T vec_[ +#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + 1 +#endif + ]; + + //! Private and unimplemented: copy construction is not allowed. + Impl(const Impl& y); + + //! Private and unimplemented: assignment is not allowed. + Impl& operator=(const Impl&); + + //! Exception-safe copy construction mechanism. + void copy_construct(const Impl& y); +}; + +namespace std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::DB_Row */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +void swap(Parma_Polyhedra_Library::DB_Row& x, + Parma_Polyhedra_Library::DB_Row& y); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specializes std::iter_swap. +/*! \relates Parma_Polyhedra_Library::DB_Row */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +void iter_swap(typename std::vector > + ::iterator x, + typename std::vector > + ::iterator y); + +} // namespace std + +/* 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 27. */ +#include +#include +#include +#include +#include + +namespace Parma_Polyhedra_Library { + +template +inline void* +DB_Row_Impl_Handler::Impl::operator new(const size_t fixed_size, + const dimension_type capacity) { +#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + return ::operator new(fixed_size + capacity*sizeof(T)); +#else + assert(capacity >= 1); + return ::operator new(fixed_size + (capacity-1)*sizeof(T)); +#endif +} + +template +inline void +DB_Row_Impl_Handler::Impl::operator delete(void* p) { + ::operator delete(p); +} + +template +inline void +DB_Row_Impl_Handler::Impl::operator delete(void* p, dimension_type) { + ::operator delete(p); +} + +template +inline memory_size_type +DB_Row_Impl_Handler::Impl +::total_memory_in_bytes(dimension_type capacity) const { + return + sizeof(*this) + + capacity*sizeof(T) +#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + - 1*sizeof(T) +#endif + + external_memory_in_bytes(); +} + +template +inline memory_size_type +DB_Row_Impl_Handler::Impl::total_memory_in_bytes() const { + // In general, this is a lower bound, as the capacity of *this + // may be strictly greater than `size_' + return total_memory_in_bytes(size_); +} + +template +inline dimension_type +DB_Row_Impl_Handler::Impl::max_size() { + return std::numeric_limits::max() / sizeof(T); +} + +template +inline dimension_type +DB_Row_Impl_Handler::Impl::size() const { + return size_; +} + +template +inline void +DB_Row_Impl_Handler::Impl::set_size(const dimension_type new_sz) { + size_ = new_sz; +} + +template +inline void +DB_Row_Impl_Handler::Impl::bump_size() { + ++size_; +} + +template +inline +DB_Row_Impl_Handler::Impl::Impl() + : size_(0) { +} + +template +inline +DB_Row_Impl_Handler::Impl::~Impl() { + shrink(0); +} + +template +inline +DB_Row_Impl_Handler::DB_Row_Impl_Handler() + : impl(0) { +#if PPL_DB_ROW_EXTRA_DEBUG + capacity_ = 0; +#endif +} + +template +inline +DB_Row_Impl_Handler::~DB_Row_Impl_Handler() { + delete impl; +} + +template +inline T& +DB_Row_Impl_Handler::Impl::operator[](const dimension_type k) { + assert(k < size()); + return vec_[k]; +} + +template +inline const T& +DB_Row_Impl_Handler::Impl::operator[](const dimension_type k) const { + assert(k < size()); + return vec_[k]; +} + +template +inline dimension_type +DB_Row::max_size() { + return DB_Row_Impl_Handler::Impl::max_size(); +} + +template +inline dimension_type +DB_Row::size() const { + return this->impl->size(); +} + +#if PPL_DB_ROW_EXTRA_DEBUG +template +inline dimension_type +DB_Row::capacity() const { + return this->capacity_; +} +#endif // PPL_DB_ROW_EXTRA_DEBUG + +template +inline +DB_Row::DB_Row() + : DB_Row_Impl_Handler() { +} + +template +inline void +DB_Row::allocate( +#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + const +#endif + dimension_type capacity) { + DB_Row& x = *this; + assert(capacity <= max_size()); +#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + if (capacity == 0) + ++capacity; +#endif + assert(x.impl == 0); + x.impl = new (capacity) typename DB_Row_Impl_Handler::Impl(); +#if PPL_DB_ROW_EXTRA_DEBUG + assert(x.capacity_ == 0); + x.capacity_ = capacity; +#endif +} + +template +inline void +DB_Row::expand_within_capacity(const dimension_type new_size) { + DB_Row& x = *this; + assert(x.impl); +#if PPL_DB_ROW_EXTRA_DEBUG + assert(new_size <= x.capacity_); +#endif + x.impl->expand_within_capacity(new_size); +} + +template +inline void +DB_Row::copy_construct_coefficients(const DB_Row& y) { + DB_Row& x = *this; + assert(x.impl && y.impl); +#if PPL_DB_ROW_EXTRA_DEBUG + assert(y.size() <= x.capacity_); +#endif + x.impl->copy_construct_coefficients(*(y.impl)); +} + +template +template +inline void +DB_Row::construct_upward_approximation(const DB_Row& y, + const dimension_type capacity) { + DB_Row& x = *this; + assert(y.size() <= capacity && capacity <= max_size()); + allocate(capacity); + assert(y.impl); + x.impl->construct_upward_approximation(*(y.impl)); +} + +template +inline void +DB_Row::construct(const dimension_type sz, + const dimension_type capacity) { + assert(sz <= capacity && capacity <= max_size()); + allocate(capacity); + expand_within_capacity(sz); +} + +template +inline void +DB_Row::construct(const dimension_type sz) { + construct(sz, sz); +} + +template +inline +DB_Row::DB_Row(const dimension_type sz, + const dimension_type capacity) + : DB_Row_Impl_Handler() { + construct(sz, capacity); +} + +template +inline +DB_Row::DB_Row(const dimension_type sz) { + construct(sz); +} + +template +inline +DB_Row::DB_Row(const DB_Row& y) + : DB_Row_Impl_Handler() { + if (y.impl) { + allocate(compute_capacity(y.size(), max_size())); + copy_construct_coefficients(y); + } +} + +template +inline +DB_Row::DB_Row(const DB_Row& y, + const dimension_type capacity) + : DB_Row_Impl_Handler() { + assert(y.impl); + assert(y.size() <= capacity && capacity <= max_size()); + allocate(capacity); + copy_construct_coefficients(y); +} + +template +inline +DB_Row::DB_Row(const DB_Row& y, + const dimension_type sz, + const dimension_type capacity) + : DB_Row_Impl_Handler() { + assert(y.impl); + assert(y.size() <= sz && sz <= capacity && capacity <= max_size()); + allocate(capacity); + copy_construct_coefficients(y); + expand_within_capacity(sz); +} + +template +inline +DB_Row::~DB_Row() { +} + +template +inline void +DB_Row::shrink(const dimension_type new_size) { + DB_Row& x = *this; + assert(x.impl); + x.impl->shrink(new_size); +} + +template +inline void +DB_Row::swap(DB_Row& y) { + DB_Row& x = *this; + std::swap(x.impl, y.impl); +#if PPL_DB_ROW_EXTRA_DEBUG + std::swap(x.capacity_, y.capacity_); +#endif +} + +template +inline void +DB_Row::assign(DB_Row& y) { + DB_Row& x = *this; + x.impl = y.impl; +#if PPL_DB_ROW_EXTRA_DEBUG + x.capacity_ = y.capacity_; +#endif +} + +template +inline DB_Row& +DB_Row::operator=(const DB_Row& y) { + // Copy-construct `tmp' from `y'. + DB_Row tmp(y); + // Swap the implementation of `*this' with the one of `tmp'. + swap(tmp); + // Now `tmp' goes out of scope, so the old `*this' will be destroyed. + return *this; +} + +template +inline T& +DB_Row::operator[](const dimension_type k) { + DB_Row& x = *this; + return (*x.impl)[k]; +} + +template +inline const T& +DB_Row::operator[](const dimension_type k) const { + const DB_Row& x = *this; + return (*x.impl)[k]; +} + +template +inline typename DB_Row::iterator +DB_Row::begin() { + DB_Row& x = *this; + return iterator(x.impl->vec_); +} + +template +inline typename DB_Row::iterator +DB_Row::end() { + DB_Row& x = *this; + return iterator(x.impl->vec_ + x.impl->size_); +} + +template +inline typename DB_Row::const_iterator +DB_Row::begin() const { + const DB_Row& x = *this; + return const_iterator(x.impl->vec_); +} + +template +inline typename DB_Row::const_iterator +DB_Row::end() const { + const DB_Row& x = *this; + return const_iterator(x.impl->vec_ + x.impl->size_); +} + +template +inline memory_size_type +DB_Row::external_memory_in_bytes(dimension_type capacity) const { + const DB_Row& x = *this; + return x.impl->total_memory_in_bytes(capacity); +} + +template +inline memory_size_type +DB_Row::total_memory_in_bytes(dimension_type capacity) const { + return sizeof(*this) + external_memory_in_bytes(capacity); +} + +template +inline memory_size_type +DB_Row::external_memory_in_bytes() const { + const DB_Row& 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 +inline memory_size_type +DB_Row::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +/*! \relates DB_Row */ +template +inline bool +operator!=(const DB_Row& x, const DB_Row& y) { + return !(x == y); +} + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +/*! \relates Parma_Polyhedra_Library::DB_Row */ +template +inline void +swap(Parma_Polyhedra_Library::DB_Row& x, + Parma_Polyhedra_Library::DB_Row& y) { + x.swap(y); +} + +/*! \relates Parma_Polyhedra_Library::DB_Row */ +template +inline void +iter_swap(typename std::vector > + ::iterator x, + typename std::vector > + ::iterator y) { + swap(*x, *y); +} + +} // namespace std + +/* 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 27. */ + +namespace Parma_Polyhedra_Library { + +template +template +void +DB_Row_Impl_Handler::Impl::construct_upward_approximation(const U& y) { + const dimension_type y_size = y.size(); +#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + // Construct in direct order: will destroy in reverse order. + for (dimension_type i = 0; i < y_size; ++i) { + construct(vec_[i], y[i], ROUND_UP); + bump_size(); + } +#else // PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + assert(y_size > 0); + if (y_size > 0) { + vec_[0] = y[0]; + bump_size(); + // Construct in direct order: will destroy in reverse order. + for (dimension_type i = 1; i < y_size; ++i) { + construct(vec_[i], y[i], ROUND_UP); + bump_size(); + } + } +#endif // PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS +} + +template +void +DB_Row_Impl_Handler:: +Impl::expand_within_capacity(const dimension_type new_size) { + assert(size() <= new_size && new_size <= max_size()); +#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + // vec_[0] is already constructed. + if (size() == 0 && new_size > 0) + bump_size(); +#endif + // Construct in direct order: will destroy in reverse order. + for (dimension_type i = size(); i < new_size; ++i) { + new (&vec_[i]) T(PLUS_INFINITY, ROUND_NOT_NEEDED); + bump_size(); + } +} + +template +void +DB_Row_Impl_Handler::Impl::shrink(dimension_type new_size) { + const dimension_type old_size = size(); + assert(new_size <= old_size); + // Since ~T() does not throw exceptions, nothing here does. + set_size(new_size); +#if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + // Make sure we do not try to destroy vec_[0]. + if (new_size == 0) + ++new_size; +#endif + // We assume construction was done "forward". + // We thus perform destruction "backward". + for (dimension_type i = old_size; i-- > new_size; ) + vec_[i].~T(); +} + +template +void +DB_Row_Impl_Handler::Impl::copy_construct_coefficients(const Impl& y) { + const dimension_type y_size = y.size(); +#if PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + // Construct in direct order: will destroy in reverse order. + for (dimension_type i = 0; i < y_size; ++i) { + new (&vec_[i]) T(y.vec_[i]); + bump_size(); + } +#else // PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + assert(y_size > 0); + if (y_size > 0) { + vec_[0] = y.vec_[0]; + bump_size(); + // Construct in direct order: will destroy in reverse order. + for (dimension_type i = 1; i < y_size; ++i) { + new (&vec_[i]) T(y.vec_[i]); + bump_size(); + } + } +#endif // PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS +} + +template +memory_size_type +DB_Row_Impl_Handler::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 +bool +DB_Row::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& x = *this; + bool is_broken = false; + +#if PPL_DB_ROW_EXTRA_DEBUG +# if !PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + if (x.capacity_ == 0) { + cerr << "Illegal row capacity: is 0, should be at least 1" + << endl; + is_broken = true; + } + else if (x.capacity_ == 1 && row_capacity == 0) + // This is fine. + ; + else +# endif // !PPL_CXX_SUPPORTS_FLEXIBLE_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 +bool +operator==(const DB_Row& x, const DB_Row& 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 473. */ + +/* Automatically generated from PPL source file ../src/DB_Matrix.defs.hh line 31. */ +#include +#include +#include + +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 +std::ostream& +operator<<(std::ostream& s, const DB_Matrix& 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 allows for the representation of + a square matrix of T objects. + Each DB_Matrix object can be viewed as a multiset of DB_Row. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +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 + explicit DB_Matrix(const DB_Matrix& 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 >::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::value_type value_type; + typedef typename std::iterator_traits::difference_type + difference_type; + typedef typename std::iterator_traits::pointer pointer; + typedef typename std::iterator_traits::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 true if and only if + \p *this and \p y are identical. + */ + bool operator==(const const_iterator& y) const; + + /*! \brief + Returns true 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 friend class DB_Matrix; + + //! The rows of the matrix. + std::vector > rows; + + //! Size of the initialized part of each row. + dimension_type row_size; + + /*! \brief + Capacity allocated for each row, i.e., number of + long objects that each row can contain. + */ + dimension_type row_capacity; + +public: + //! Swaps \p *this with \p y. + void swap(DB_Matrix& y); + + + //! Makes the matrix grow by adding more rows and more columns. + /*! + \param new_n_rows + The number of rows and columns of the resized matrix. + + A new matrix, with the specified dimension, is created. + The contents of the old matrix are copied in the upper, left-hand + corner of the new matrix, which is then assigned to \p *this. + */ + void grow(dimension_type new_n_rows); + + //! Resizes the matrix without worrying about the old contents. + /*! + \param new_n_rows + The number of rows and columns of the resized matrix. + + A new matrix, with the specified dimension, is created without copying + the content of the old matrix and assigned to \p *this. + */ + void resize_no_copy(dimension_type new_n_rows); + + //! Returns the number of rows in the matrix. + dimension_type num_rows() const; + + //! \name Subscript operators. + //@{ + //! Returns a reference to the \p k-th row of the matrix. + DB_Row& operator[](dimension_type k); + + //! Returns a constant reference to the \p k-th row of the matrix. + const DB_Row& 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 true if successful, false 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 std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::DB_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +void swap(Parma_Polyhedra_Library::DB_Matrix& x, + Parma_Polyhedra_Library::DB_Matrix& y); + +} // namespace std + + +namespace Parma_Polyhedra_Library { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns true if and only if \p x and \p y are identical. +/*! \relates DB_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +bool operator==(const DB_Matrix& x, const DB_Matrix& y); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns true if and only if \p x and \p y are different. +/*! \relates DB_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +bool operator!=(const DB_Matrix& x, const DB_Matrix& 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 true; returns false 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 +bool rectilinear_distance_assign(Checked_Number& r, + const DB_Matrix& x, + const DB_Matrix& 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 true; returns false 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 +bool euclidean_distance_assign(Checked_Number& r, + const DB_Matrix& x, + const DB_Matrix& 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 true; returns false 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 +bool l_infinity_distance_assign(Checked_Number& r, + const DB_Matrix& x, + const DB_Matrix& 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 29. */ +#include +#include + +namespace Parma_Polyhedra_Library { + +template +inline void +DB_Matrix::swap(DB_Matrix& y) { + std::swap(rows, y.rows); + std::swap(row_size, y.row_size); + std::swap(row_capacity, y.row_capacity); +} + +template +inline dimension_type +DB_Matrix::max_num_rows() { + return std::vector >().max_size(); +} + +template +inline dimension_type +DB_Matrix::max_num_columns() { + return DB_Row::max_size(); +} + +template +inline memory_size_type +DB_Matrix::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +template +inline +DB_Matrix::const_iterator::const_iterator() + : i(Iter()) { +} + +template +inline +DB_Matrix::const_iterator::const_iterator(const Iter& b) + : i(b) { +} + +template +inline +DB_Matrix::const_iterator::const_iterator(const const_iterator& y) + : i(y.i) { +} + +template +inline typename DB_Matrix::const_iterator& +DB_Matrix::const_iterator::operator=(const const_iterator& y) { + i = y.i; + return *this; +} + +template +inline typename DB_Matrix::const_iterator::reference +DB_Matrix::const_iterator::operator*() const { + return *i; +} + +template +inline typename DB_Matrix::const_iterator::pointer +DB_Matrix::const_iterator::operator->() const { + return &*i; +} + +template +inline typename DB_Matrix::const_iterator& +DB_Matrix::const_iterator::operator++() { + ++i; + return *this; +} + +template +inline typename DB_Matrix::const_iterator +DB_Matrix::const_iterator::operator++(int) { + return const_iterator(i++); +} + +template +inline bool +DB_Matrix::const_iterator::operator==(const const_iterator& y) const { + return i == y.i; +} + +template +inline bool +DB_Matrix::const_iterator::operator!=(const const_iterator& y) const { + return !operator==(y); +} + +template +inline typename DB_Matrix::const_iterator +DB_Matrix::begin() const { + return const_iterator(rows.begin()); +} + +template +inline typename DB_Matrix::const_iterator +DB_Matrix::end() const { + return const_iterator(rows.end()); +} + +template +inline +DB_Matrix::DB_Matrix() + : rows(), + row_size(0), + row_capacity(0) { +} + +template +inline +DB_Matrix::~DB_Matrix() { +} + +template +inline DB_Row& +DB_Matrix::operator[](const dimension_type k) { + assert(k < rows.size()); + return rows[k]; +} + +template +inline const DB_Row& +DB_Matrix::operator[](const dimension_type k) const { + assert(k < rows.size()); + return rows[k]; +} + +template +inline dimension_type +DB_Matrix::num_rows() const { + return rows.size(); +} + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates DB_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +inline bool +operator!=(const DB_Matrix& x, const DB_Matrix& y) { + return !(x == y); +} + +template +inline +DB_Matrix::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 +inline DB_Matrix& +DB_Matrix::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 +inline bool +l_m_distance_assign(Checked_Number& r, + const DB_Matrix& x, + const DB_Matrix& 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& x_i = x[i]; + const DB_Row& 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); + 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 +inline bool +rectilinear_distance_assign(Checked_Number& r, + const DB_Matrix& x, + const DB_Matrix& y, + const Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2) { + return + l_m_distance_assign >(r, x, y, + dir, + tmp0, + tmp1, + tmp2); +} + + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates DB_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +inline bool +euclidean_distance_assign(Checked_Number& r, + const DB_Matrix& x, + const DB_Matrix& y, + const Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2) { + return + l_m_distance_assign >(r, x, y, + dir, + tmp0, + tmp1, + tmp2); +} + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates DB_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +inline bool +l_infinity_distance_assign(Checked_Number& r, + const DB_Matrix& x, + const DB_Matrix& y, + const Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2) { + return + l_m_distance_assign >(r, x, y, + dir, + tmp0, + tmp1, + tmp2); +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates Parma_Polyhedra_Library::DB_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +inline void +swap(Parma_Polyhedra_Library::DB_Matrix& x, + Parma_Polyhedra_Library::DB_Matrix& y) { + x.swap(y); +} + +} // namespace std + +/* 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 +DB_Matrix::DB_Matrix(const dimension_type n_rows) + : rows(n_rows), + row_size(n_rows), + row_capacity(compute_capacity(n_rows, max_num_columns())) { + // Construct in direct order: will destroy in reverse order. + for (dimension_type i = 0; i < n_rows; ++i) + rows[i].construct(n_rows, row_capacity); + assert(OK()); +} + +template +template +DB_Matrix::DB_Matrix(const DB_Matrix& y) + : rows(y.rows.size()), + row_size(y.row_size), + row_capacity(compute_capacity(y.row_size, max_num_columns())) { + // Construct in direct order: will destroy in reverse order. + for (dimension_type i = 0, n_rows = rows.size(); i < n_rows; ++i) + rows[i].construct_upward_approximation(y[i], row_capacity); + assert(OK()); +} + +template +void +DB_Matrix::grow(const dimension_type new_n_rows) { + const dimension_type old_n_rows = rows.size(); + assert(new_n_rows >= old_n_rows); + + if (new_n_rows > old_n_rows) { + if (new_n_rows <= row_capacity) { + // We can recycle the old rows. + if (rows.capacity() < new_n_rows) { + // Reallocation will take place. + std::vector > new_rows; + new_rows.reserve(compute_capacity(new_n_rows, max_num_rows())); + new_rows.insert(new_rows.end(), new_n_rows, DB_Row()); + // Construct the new rows. + dimension_type i = new_n_rows; + while (i-- > old_n_rows) + new_rows[i].construct(new_n_rows, row_capacity); + // Steal the old rows. + ++i; + while (i-- > 0) + new_rows[i].swap(rows[i]); + // Put the new vector into place. + std::swap(rows, new_rows); + } + else { + // Reallocation will NOT take place. + rows.insert(rows.end(), new_n_rows - old_n_rows, DB_Row()); + 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()); + // 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 new_row(rows[i], + new_matrix.row_size, + new_matrix.row_capacity); + std::swap(new_matrix.rows[i], new_row); + } + // Put the new vector into place. + swap(new_matrix); + return; + } + } + // Here we have the right number of rows. + if (new_n_rows > row_size) { + // We need more columns. + if (new_n_rows <= row_capacity) + // But we have enough capacity: we resize existing rows. + for (dimension_type i = old_n_rows; i-- > 0; ) + rows[i].expand_within_capacity(new_n_rows); + else { + // Capacity exhausted: we must reallocate the rows and + // make sure all the rows have the same capacity. + const dimension_type new_row_capacity + = compute_capacity(new_n_rows, max_num_columns()); + for (dimension_type i = old_n_rows; i-- > 0; ) { + // FIXME: copying may be unnecessarily costly. + DB_Row new_row(rows[i], new_n_rows, new_row_capacity); + std::swap(rows[i], new_row); + } + row_capacity = new_row_capacity; + } + // Rows have grown or shrunk. + row_size = new_n_rows; + } +} + +template +void +DB_Matrix::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 > new_rows; + new_rows.reserve(compute_capacity(new_n_rows, max_num_rows())); + new_rows.insert(new_rows.end(), new_n_rows, DB_Row()); + // Construct the new rows (be careful: each new row must have + // the same capacity as each one of the old rows). + dimension_type i = new_n_rows; + while (i-- > old_n_rows) + new_rows[i].construct(new_n_rows, row_capacity); + // Steal the old rows. + ++i; + while (i-- > 0) + new_rows[i].swap(rows[i]); + // Put the new vector into place. + std::swap(rows, new_rows); + } + else { + // Reallocation (of vector `rows') will NOT take place. + rows.insert(rows.end(), new_n_rows - old_n_rows, DB_Row()); + // Be careful: each new row must have + // the same capacity as each one of the old rows. + for (dimension_type i = new_n_rows; i-- > old_n_rows; ) + rows[i].construct(new_n_rows, row_capacity); + } + } + else { + // We cannot even recycle the old rows: allocate a new matrix and swap. + DB_Matrix new_matrix(new_n_rows); + swap(new_matrix); + return; + } + } + else if (new_n_rows < old_n_rows) { + // Drop some rows. + rows.erase(rows.begin() + new_n_rows, rows.end()); + // Shrink the existing rows. + for (dimension_type i = new_n_rows; i-- > 0; ) + rows[i].shrink(new_n_rows); + old_n_rows = new_n_rows; + } + // Here we have the right number of rows. + if (new_n_rows > row_size) { + // We need more columns. + if (new_n_rows <= row_capacity) + // But we have enough capacity: we resize existing rows. + for (dimension_type i = old_n_rows; i-- > 0; ) + rows[i].expand_within_capacity(new_n_rows); + else { + // Capacity exhausted: we must reallocate the rows and + // make sure all the rows have the same capacity. + const dimension_type new_row_capacity + = compute_capacity(new_n_rows, max_num_columns()); + for (dimension_type i = old_n_rows; i-- > 0; ) { + DB_Row new_row(new_n_rows, new_row_capacity); + std::swap(rows[i], new_row); + } + row_capacity = new_row_capacity; + } + } + // DB_Rows have grown or shrunk. + row_size = new_n_rows; +} + +template +void +DB_Matrix::ascii_dump(std::ostream& s) const { + const DB_Matrix& 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) + +template +bool +DB_Matrix::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 (r != V_EQ || is_minus_infinity(x[i][j])) + return false; + } + + // Check invariants. + assert(OK()); + return true; +} + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates DB_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +bool +operator==(const DB_Matrix& x, const DB_Matrix& 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 +memory_size_type +DB_Matrix::external_memory_in_bytes() const { + memory_size_type n = rows.capacity() * sizeof(DB_Row); + for (dimension_type i = num_rows(); i-- > 0; ) + n += rows[i].external_memory_in_bytes(row_capacity); + return n; +} + +template +bool +DB_Matrix::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 +std::ostream& +IO_Operators::operator<<(std::ostream& s, const DB_Matrix& 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 330. */ + +/* Automatically generated from PPL source file ../src/BD_Shape.defs.hh line 47. */ +#include +#include +#include + +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: + false is written if \p bds is an empty polyhedron; + true is written if \p bds is the universe polyhedron; + a system of constraints defining \p bds is written otherwise, + all constraints separated by ", ". +*/ +template +std::ostream& +operator<<(std::ostream& s, const BD_Shape& bds); + +} // namespace IO_Operators + +//! Returns true 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 false is returned. +*/ +template +bool operator==(const BD_Shape& x, const BD_Shape& y); + +//! Returns true if and only if \p x and \p y aren't the same BDS. +/*! \relates BD_Shape + Note that \p x and \p y may be dimension-incompatible shapes: + in this case, the value true is returned. +*/ +template +bool operator!=(const BD_Shape& x, const BD_Shape& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool rectilinear_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool rectilinear_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& 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 true; + returns false 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 +bool rectilinear_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool euclidean_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool euclidean_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& 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 true; + returns false 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 +bool euclidean_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool l_infinity_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool l_infinity_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& 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 true; + returns false 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 +bool l_infinity_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& y, + Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Decodes the constraint \p c as a bounded difference. +/*! \relates BD_Shape + \return + true if the constraint \p c is a + \ref Bounded_Difference_Shapes "bounded difference"; + false otherwise. + + \param c + The constraint to be decoded. + + \param c_space_dim + The space dimension of the constraint \p c (it is assumed + to match the actual space dimension of \p c). + + \param c_num_vars + If true 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 true 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 true 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 true 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) +bool extract_bounded_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); + +#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& predecessor, + std::vector& indices); + +} // namespace Parma_Polyhedra_Library + +//! A bounded difference shape. +/*! \ingroup PPL_CXX_interface + The class template BD_Shape allows for the efficient representation + of a restricted kind of topologically closed convex polyhedra + called bounded difference shapes (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 rounding-aware + 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 optimally supports: + - 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 + x, y and 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 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 bd(cs); + \endcode + Since only those constraints having the syntactic form of a + bounded difference 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 bd(cs); + \endcode +*/ +template +class Parma_Polyhedra_Library::BD_Shape { +private: + /*! \brief + The (extended) numeric type of the inhomogeneous term of + the inequalities defining a BDS. + */ + typedef Checked_Number N; + +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 + explicit BD_Shape(const BD_Shape& 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 constraints: constraints that are not + \ref Bounded_Difference_Shapes "bounded differences" + are ignored (even though they may have contributed + to the space dimension). + + \exception std::invalid_argument + Thrown if \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: some elements may be safely ignored. + */ + 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 + explicit BD_Shape(const Box& 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 + explicit BD_Shape(const Octagonal_Shape& 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 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 true 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 true 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 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 + true 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, + false 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 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 + 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 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, + false 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 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 + true 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, + false 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 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 + 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 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, + false 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; + + //! Returns true 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 true 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 true 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 true if and only if \p *this is an empty BDS. + bool is_empty() const; + + //! Returns true if and only if \p *this is a universe BDS. + bool is_universe() const; + + //! Returns true if and only if \p *this is discrete. + bool is_discrete() const; + + /*! \brief + Returns true if and only if \p *this + is a topologically closed subset of the vector space. + */ + bool is_topologically_closed() const; + + //! Returns true if and only if \p *this is a bounded BDS. + bool is_bounded() const; + + /*! \brief + Returns true if and only if \p *this + contains at least one integer point. + */ + bool contains_integer_point() const; + + /*! \brief + Returns true 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 true if and only if \p *this satisfies + all its invariants. + */ + bool OK() const; + + //@} Member Functions that Do Not Modify the BD_Shape + + //! \name Space-Dimension Preserving Member Functions that May Modify the BD_Shape + //@{ + + /*! \brief + Adds a copy of constraint \p c to the system of bounded differences + defining \p *this. + + \param c + The constraint to be added. If it is not a bounded difference, it + will be simply ignored. + + \exception std::invalid_argument + Thrown if \p *this and constraint \p c are dimension-incompatible, + or \p c is not optimally supported by the BD shape domain. + */ + void add_constraint(const Constraint& c); + + /*! \brief + Adds a copy of constraint \p c to the system of bounded differences + defining \p *this. + + \return + false if and only if the result is empty. + + \param c + The constraint to be added. If it is not a bounded difference, it + will be simply ignored. + + \exception std::invalid_argument + Thrown if \p *this and constraint \p c are dimension-incompatible, + or \p c is not optimally supported by the BD shape domain. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_constraint_and_minimize(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 a copy of congruence \p cg to the system of congruences + of \p *this, minimizing the result + + \param cg + The congruence to be added. + + \return + false if and only if the result is empty. + + \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. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_congruence_and_minimize(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. Constraints that are not bounded + differences will be simply ignored. + + \exception std::invalid_argument + Thrown if \p *this and \p cs are dimension-incompatible, + or \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 the constraints in \p cs to the system of bounded differences + defining \p *this. + + \return + false if and only if the result is empty. + + \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. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_constraints_and_minimize(const Constraint_System& cs); + + /*! \brief + Adds the constraints in \p cs to the system of constraints + of \p *this, minimizing the result. + + \return + false if and only if the result is empty. + + \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. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_recycled_constraints_and_minimize(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 + Behaves as add_congruences(const Congruence_System&), + but minimizes the resulting BD shape, returning \c false + if and only if the result is empty. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_congruences_and_minimize(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 + Behaves as \c add_recycled_congruences, but minimizes the + resulting BD shape, returning \c false if and only if + the result is empty. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_recycled_congruences_and_minimize(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 + 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 to_be_unconstrained, + assigning the result to \p *this. + + \param to_be_unconstrained + 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 to_be_removed. + */ + void unconstrain(const Variables_Set& to_be_unconstrained); + + //! Assigns to \p *this the intersection of \p *this and \p y. + /*! + \exception std::invalid_argument + Thrown if \p *this and \p y are dimension-incompatible. + */ + void intersection_assign(const BD_Shape& y); + + //! Assigns to \p *this the intersection of \p *this and \p y. + /*! + \return + false if and only if the result is empty. + + \exception std::invalid_argument + Thrown if \p *this and \p y are dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool intersection_assign_and_minimize(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 + Assigns to \p *this the smallest BDS containing the convex union + of \p *this and \p y. + + \return + false if and only if the result is empty. + + \exception std::invalid_argument + Thrown if \p *this and \p y are dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool upper_bound_assign_and_minimize(const BD_Shape& y); + + /*! \brief + If the upper bound of \p *this and \p y is exact, it is assigned + to \p *this and true is returned, + otherwise false 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 + 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()); + + /*! \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); + + //! 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 must 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 must 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 + 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 must 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 must 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 must 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 decreasing iteration sequence). Hence, the call + x.CC76_narrowing_assign(y) 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 must 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 must 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 must 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 max_space_dimension(). + */ + void concatenate_assign(const BD_Shape& y); + + //! Removes all the specified dimensions. + /*! + \param to_be_removed + The set of Variable objects corresponding to the dimensions to be removed. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with one of the Variable + objects contained in \p to_be_removed. + */ + void remove_space_dimensions(const Variables_Set& to_be_removed); + + /*! \brief + Removes the higher dimensions so that the resulting space + will have dimension \p new_dimension. + + \exception std::invalid_argument + Thrown if \p new_dimension is greater than the space dimension + of \p *this. + */ + void remove_higher_space_dimensions(dimension_type new_dimension); + + /*! \brief + Remaps the dimensions of the vector space according to + a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function". + + \param pfunc + The partial function specifying the destiny of each dimension. + + The template class Partial_Function must provide the following + methods. + \code + bool has_empty_codomain() const + \endcode + returns true if and only if the represented partial + function has an empty co-domain (i.e., it is always undefined). + The has_empty_codomain() method will always be called + before the methods below. However, if + has_empty_codomain() returns true, 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 true is returned. + If \f$f\f$ is undefined in \f$k\f$, then false 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 + 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 max_space_dimension(). + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + and var has space dimension \f$k \leq n\f$, + then the \f$k\f$-th space dimension is + \ref expand_space_dimension "expanded" to \p m new space dimensions + \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$. + */ + void expand_space_dimension(Variable var, dimension_type m); + + //! Folds the space dimensions in \p to_be_folded into \p var. + /*! + \param to_be_folded + The set of Variable objects corresponding to the space dimensions + to be folded; + + \param var + The variable corresponding to the space dimension that is the + destination of the folding operation. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with \p var or with + one of the Variable objects contained in \p to_be_folded. + Also thrown if \p var is contained in \p to_be_folded. + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + var has space dimension \f$k \leq n\f$, + \p to_be_folded is a set of variables whose maximum space dimension + is also less than or equal to \f$n\f$, and \p var is not a member + of \p to_be_folded, then the space dimensions corresponding to + variables in \p to_be_folded are \ref fold_space_dimensions "folded" + into the \f$k\f$-th space dimension. + */ + void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var); + + //@} // Member Functions that May Modify the Dimension of the Vector Space + + 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 true if successful, false 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 x == y, + then x.hash_code() == y.hash_code(). + */ + int32_t hash_code() const; + + friend bool operator==(const BD_Shape& x, const BD_Shape& y); + + template + friend bool Parma_Polyhedra_Library::rectilinear_distance_assign + (Checked_Number& r, + const BD_Shape& x, const BD_Shape& y, const Rounding_Dir dir, + Temp& tmp0, Temp& tmp1, Temp& tmp2); + template + friend bool Parma_Polyhedra_Library::euclidean_distance_assign + (Checked_Number& r, + const BD_Shape& x, const BD_Shape& y, const Rounding_Dir dir, + Temp& tmp0, Temp& tmp1, Temp& tmp2); + template + friend bool Parma_Polyhedra_Library::l_infinity_distance_assign + (Checked_Number& r, + const BD_Shape& x, const BD_Shape& y, const Rounding_Dir dir, + Temp& tmp0, Temp& tmp1, Temp& tmp2); + +private: + template friend class Parma_Polyhedra_Library::BD_Shape; + template friend class Parma_Polyhedra_Library::Box; + + //! The matrix representing the system of bounded differences. + DB_Matrix dbm; + +#define PPL_IN_BD_Shape_CLASS +/* Automatically generated from PPL source file ../src/BDS_Status.idefs.hh line 1. */ +/* BD_Shape::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 object. +/*! \ingroup PPL_CXX_interface + The assertions supported are: + - zero-dim universe: the BDS is the zero-dimensional + vector space \f$\Rset^0 = \{\cdot\}\f$; + - empty: the BDS is the empty set; + - shortest-path closed: the BDS is represented by a shortest-path + closed system of bounded differences, so that all the constraints are + as tight as possible; + - shortest-path reduced: 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: + - zero-dim universe excludes any other assertion; + - empty: excludes any other assertion; + - shortest-path reduced implies shortest-path closed. +*/ +class Status { +public: + //! By default Status is the zero-dim universe 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 true if successful, false 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 all bits in \p mask are set. + bool test_all(flags_t mask) const; + + //! Check whether at least one 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 1800. */ +#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 true if the BDS is the zero-dimensional universe. + bool marked_zero_dim_univ() const; + + /*! \brief + Returns true if the BDS is known to be empty. + + The return value false does not necessarily + implies that \p *this is non-empty. + */ + bool marked_empty() const; + + /*! \brief + Returns true if the system of bounded differences + is known to be shortest-path closed. + + The return value false does not necessarily + implies that this->dbm is not shortest-path closed. + */ + bool marked_shortest_path_closed() const; + + /*! \brief + Returns true if the system of bounded differences + is known to be shortest-path reduced. + + The return value false does not necessarily + implies that this->dbm 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 this->dbm its shortest-path closure. + void shortest_path_closure_assign() const; + + /*! \brief + Assigns to this->dbm its shortest-path closure and + records into this->redundancy_dbm which of the entries + in this->dbm are redundant. + */ + void shortest_path_reduction_assign() const; + + /*! \brief + Returns true if and only if this->dbm + is shortest-path closed and this->redundancy_dbm + correctly flags the redundant entries in this->dbm. + */ + 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 true if and only if \p from_above is + true and \p expr is bounded from above in \p *this, + or \p from_above is false and \p expr is bounded + from below in \p *this. + + \param expr + The linear expression to test; + + \param from_above + true 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 + true 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 + true 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, false 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 + true 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 + true 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, false 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 + Convexity Recognition of the Union of Polyhedra + 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); + + 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 dbm[i][j] \<= k. + void add_dbm_constraint(dimension_type i, dimension_type j, const N& k); + + //! Adds the constraint dbm[i][j] \<= num/den. + void add_dbm_constraint(dimension_type i, dimension_type j, + Coefficient_traits::const_reference num, + Coefficient_traits::const_reference den); + + /*! \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 v - u \<= c, + starting from \p ub_v which is an upper bound for \p v. + + The shortest-path closure is able to deduce the constraint + v - u \<= ub_v - lb_u. 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 + q == sc_expr[u]/sc_den is greater than zero. In particular: + - if q \>= 1, then v - u \<= ub_v - ub_u; + - if 0 \< q \< 1, then + v - u \<= ub_v - (q*ub_u + (1-q)*lb_u). + */ + void deduce_v_minus_u_bounds(dimension_type v, + dimension_type last_v, + const Linear_Expression& sc_expr, + Coefficient_traits::const_reference sc_den, + const N& ub_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 u - v \<= c, + starting from \p minus_lb_v which is a lower bound for \p v. + + The shortest-path closure is able to deduce the constraint + u - v \<= ub_u - lb_v. 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 + q == sc_expr[u]/sc_den is greater than zero. + In particular: + - if q \>= 1, then u - v \<= lb_u - lb_v; + - if 0 \< q \< 1, then + u - v \<= (q*lb_u + (1-q)*ub_u) - lb_v. + */ + void deduce_u_minus_v_bounds(dimension_type v, + dimension_type last_v, + const Linear_Expression& sc_expr, + Coefficient_traits::const_reference sc_den, + const N& 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& 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& leaders) const; + + friend std::ostream& + Parma_Polyhedra_Library::IO_Operators + ::operator<<<>(std::ostream& s, const BD_Shape& c); + + //! \name Exception Throwers + //@{ + void throw_dimension_incompatible(const char* method, + const BD_Shape& x) const; + + void throw_dimension_incompatible(const char* method, + dimension_type required_dim) const; + + void throw_dimension_incompatible(const char* method, + const Constraint& c) const; + + void throw_dimension_incompatible(const char* method, + const Congruence& cg) const; + + void throw_dimension_incompatible(const char* method, + const Generator& g) const; + + void throw_dimension_incompatible(const char* method, + const char* name_row, + const Linear_Expression& y) const; + + static void throw_expression_too_complex(const char* method, + const Linear_Expression& e); + + static void throw_generic(const char* method, const char* reason); + //@} // Exception Throwers +}; + + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::BD_Shape */ +template +void swap(Parma_Polyhedra_Library::BD_Shape& x, + Parma_Polyhedra_Library::BD_Shape& y); + +} // namespace std + +/* Automatically generated from PPL source file ../src/BDS_Status.inlines.hh line 1. */ +/* BD_Shape::Status class implementation: inline functions. +*/ + + +namespace Parma_Polyhedra_Library { + +template +inline +BD_Shape::Status::Status(flags_t mask) + : flags(mask) { +} + +template +inline +BD_Shape::Status::Status() + : flags(ZERO_DIM_UNIV) { +} + +template +inline bool +BD_Shape::Status::test_all(flags_t mask) const { + return (flags & mask) == mask; +} + +template +inline bool +BD_Shape::Status::test_any(flags_t mask) const { + return flags & mask; +} + +template +inline void +BD_Shape::Status::set(flags_t mask) { + flags |= mask; +} + +template +inline void +BD_Shape::Status::reset(flags_t mask) { + flags &= ~mask; +} + +template +inline bool +BD_Shape::Status::test_zero_dim_univ() const { + return flags == ZERO_DIM_UNIV; +} + +template +inline void +BD_Shape::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 +inline void +BD_Shape::Status::set_zero_dim_univ() { + // Zero-dim universe is incompatible with anything else. + flags = ZERO_DIM_UNIV; +} + +template +inline bool +BD_Shape::Status::test_empty() const { + return test_any(EMPTY); +} + +template +inline void +BD_Shape::Status::reset_empty() { + reset(EMPTY); +} + +template +inline void +BD_Shape::Status::set_empty() { + flags = EMPTY; +} + +template +inline bool +BD_Shape::Status::test_shortest_path_closed() const { + return test_any(SHORTEST_PATH_CLOSED); +} + +template +inline void +BD_Shape::Status::reset_shortest_path_closed() { + // A system is reduced only if it is also closed. + reset(SHORTEST_PATH_CLOSED | SHORTEST_PATH_REDUCED); +} + +template +inline void +BD_Shape::Status::set_shortest_path_closed() { + set(SHORTEST_PATH_CLOSED); +} + +template +inline bool +BD_Shape::Status::test_shortest_path_reduced() const { + return test_any(SHORTEST_PATH_REDUCED); +} + +template +inline void +BD_Shape::Status::reset_shortest_path_reduced() { + reset(SHORTEST_PATH_REDUCED); +} + +template +inline void +BD_Shape::Status::set_shortest_path_reduced() { + assert(test_shortest_path_closed()); + set(SHORTEST_PATH_REDUCED); +} + +template +bool +BD_Shape::Status::OK() const { + if (test_zero_dim_univ()) + // Zero-dim universe is OK. + return true; + + if (test_empty()) { + Status copy = *this; + copy.reset_empty(); + if (copy.test_zero_dim_univ()) + return true; + else { +#ifndef NDEBUG + std::cerr << "The empty flag is incompatible with any other one." + << std::endl; +#endif + return false; + } + } + + // Shortest-path reduction implies shortest-path closure. + if (test_shortest_path_reduced()) { + if (test_shortest_path_closed()) + return true; + else { +#ifndef NDEBUG + std::cerr << "The shortest-path reduction flag should also imply " + << "the closure flag." + << std::endl; +#endif + return false; + } + } + + // Any other case is OK. + return true; +} + + +namespace Implementation { + +namespace BD_Shapes { + +// These are the keywords that indicate the individual assertions. +const std::string zero_dim_univ = "ZE"; +const std::string empty = "EM"; +const std::string sp_closed = "SPC"; +const std::string sp_reduced = "SPR"; +const char yes = '+'; +const char no = '-'; +const char sep = ' '; + +/*! \relates Parma_Polyhedra_Library::BD_Shape::Status + Reads a keyword and its associated on/off flag from \p s. + Returns true if the operation is successful, + returns false otherwise. + When successful, \p positive is set to true if the flag + is on; it is set to false 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 +void +BD_Shape::Status::ascii_dump(std::ostream& s) const { + using namespace Implementation::BD_Shapes; + s << (test_zero_dim_univ() ? yes : no) << zero_dim_univ << sep + << (test_empty() ? yes : no) << empty << sep + << sep + << (test_shortest_path_closed() ? yes : no) << sp_closed << sep + << (test_shortest_path_reduced() ? yes : no) << sp_reduced << sep; +} + +PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(T, BD_Shape::Status) + +template +bool +BD_Shape::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. + 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/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 +class OR_Matrix; + +} + +/* Automatically generated from PPL source file ../src/OR_Matrix.defs.hh line 31. */ +#include +#include + +#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 true, 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 true if and only if \p x and \p y are identical. +/*! \relates OR_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +bool operator==(const OR_Matrix& x, const OR_Matrix& 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 +std::ostream& +operator<<(std::ostream& s, const OR_Matrix& 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: + +

+         _ _
+   0    |_|_|
+   1    |_|_|_ _
+   2    |_|_|_|_|
+   3    |_|_|_|_|_ _
+   4    |_|_|_|_|_|_|
+   5    |_|_|_|_|_|_|
+         . . .
+         _ _ _ _ _ _       _
+ 2n-2   |_|_|_|_|_|_| ... |_|
+ 2n-1   |_|_|_|_|_|_| ... |_|
+         0 1 2 3 4 5  ... 2n-1
+
+
+ + 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 +class Parma_Polyhedra_Library::OR_Matrix { +private: + /*! \brief + An object that behaves like a matrix's row with respect to + the subscript operators. + */ + template + 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 + Pseudo_Row(const Pseudo_Row& 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 template + friend class OR_Matrix::Pseudo_Row; + template template + friend class OR_Matrix::any_row_iterator; +#else + template friend class Pseudo_Row; + template 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 row_reference_type; + + //! A const reference to a matrix's row. + typedef Pseudo_Row const_row_reference_type; + +private: + /*! \brief + A template class to derive both OR_Matrix::iterator + and OR_Matrix::const_iterator. + */ + template + class any_row_iterator { + public: + typedef std::random_access_iterator_tag iterator_category; + typedef Pseudo_Row value_type; + typedef long difference_type; + typedef const Pseudo_Row* pointer; + typedef const Pseudo_Row& 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 + any_row_iterator(const any_row_iterator& y); + + /*! \brief + Assignment operator allowing the assignment of a non-const iterator + to a const_iterator. + */ + template + any_row_iterator& operator=(const any_row_iterator& 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-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 difference of \p *this and \p m. + any_row_iterator operator-(difference_type m) const; + + //! Returns true if and only if \p *this is equal to \p y. + bool operator==(const any_row_iterator& y) const; + + /*! \brief + Returns true if and only if \p *this + is different from \p y. + */ + bool operator!=(const any_row_iterator& y) const; + + //! Returns true if and only if \p *this is less than \p y. + bool operator<(const any_row_iterator& y) const; + + /*! \brief + Returns true if and only if \p *this is less than + or equal to \p y. + */ + bool operator<=(const any_row_iterator& y) const; + + //! Returns true if and only if \p *this is greater than \p y. + bool operator>(const any_row_iterator& y) const; + + /*! \brief + Returns true 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 value; + + //! External index. + dimension_type e; + + //! Internal index: i = (e+1)*(e+1)/2. + 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 template + friend class OR_Matrix::any_row_iterator; +#else + template friend class any_row_iterator; +#endif + }; // class any_row_iterator + +public: + //! A (non const) row iterator. + typedef any_row_iterator row_iterator; + + //! A const row iterator. + typedef any_row_iterator const_row_iterator; + + //! A (non const) element iterator. + typedef typename DB_Row::iterator element_iterator; + + //! A const element iterator. + typedef typename DB_Row::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 space_dim + The space dimension of the matrix that will be created. + + This constructor creates a matrix with \p 2*space_dim rows. + Each element is initialized to plus infinity. + */ + OR_Matrix(dimension_type space_dim); + + //! Copy-constructor. + OR_Matrix(const OR_Matrix& y); + + //! Constructs a conservative approximation of \p y. + template + explicit OR_Matrix(const OR_Matrix& y); + + //! Destructor. + ~OR_Matrix(); + + //! Assignment operator. + OR_Matrix& operator=(const OR_Matrix& y); + +private: + template 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 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 vec 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 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 true if successful, false 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==(const OR_Matrix& x, const OR_Matrix& y); + + //! Checks if all the invariants are satisfied. + bool OK() const; +}; + +namespace std { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::OR_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +void swap(Parma_Polyhedra_Library::OR_Matrix& x, + Parma_Polyhedra_Library::OR_Matrix& y); + +} // namespace std + + +namespace Parma_Polyhedra_Library { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns true if and only if \p x and \p y are different. +/*! \relates OR_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +bool operator!=(const OR_Matrix& x, const OR_Matrix& 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 true; returns false 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 +bool rectilinear_distance_assign(Checked_Number& r, + const OR_Matrix& x, + const OR_Matrix& 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 true; returns false 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 +bool euclidean_distance_assign(Checked_Number& r, + const OR_Matrix& x, + const OR_Matrix& 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 true; returns false 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 +bool l_infinity_distance_assign(Checked_Number& r, + const OR_Matrix& x, + const OR_Matrix& 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 31. */ +#include +#include +/* Automatically generated from PPL source file ../src/OR_Matrix.inlines.hh line 34. */ + +namespace Parma_Polyhedra_Library { + +template +inline dimension_type +OR_Matrix::row_first_element_index(const dimension_type k) { + return ((k+1)*(k+1))/2; +} + +template +inline dimension_type +OR_Matrix::row_size(const dimension_type k) { + return k + 2 - k%2; +} + +#if PPL_OR_MATRIX_EXTRA_DEBUG + +template +template +inline dimension_type +OR_Matrix::Pseudo_Row::size() const { + return size_; +} + +#endif // PPL_OR_MATRIX_EXTRA_DEBUG + +template +template +inline +OR_Matrix::Pseudo_Row::Pseudo_Row() + : first(0) +#if PPL_OR_MATRIX_EXTRA_DEBUG + , size_(0) +#endif +{ +} + +template +template +inline +OR_Matrix::Pseudo_Row::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 +template +template +inline +OR_Matrix::Pseudo_Row::Pseudo_Row(const Pseudo_Row& y) + : first(y.first) +#if PPL_OR_MATRIX_EXTRA_DEBUG + , size_(y.size_) +#endif +{ +} + +template +template +inline OR_Matrix::Pseudo_Row& +OR_Matrix::Pseudo_Row::operator=(const Pseudo_Row& y) { + first = y.first; +#if PPL_OR_MATRIX_EXTRA_DEBUG + size_ = y.size_; +#endif + return *this; +} + +template +template +inline +OR_Matrix::Pseudo_Row::~Pseudo_Row() { +} + +template +template +inline U& +OR_Matrix::Pseudo_Row::operator[](const dimension_type k) const { +#if PPL_OR_MATRIX_EXTRA_DEBUG + assert(k < size_); +#endif + return *(first + k); +} + +template +template +inline +OR_Matrix::any_row_iterator +::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 +template +inline +OR_Matrix::any_row_iterator::any_row_iterator(U& base) + : value(base +#if PPL_OR_MATRIX_EXTRA_DEBUG + , OR_Matrix::row_size(0) +#endif + ), + e(0), + i(0) { +} + +template +template +template +inline +OR_Matrix::any_row_iterator +::any_row_iterator(const any_row_iterator& y) + : value(y.value), + e(y.e), + i(y.i) { +} + +template +template +template +inline typename OR_Matrix::template any_row_iterator& +OR_Matrix::any_row_iterator::operator=(const any_row_iterator& y) { + value = y.value; + e = y.e; + i = y.i; + return *this; +} + +template +template +inline typename OR_Matrix::template any_row_iterator::reference +OR_Matrix::any_row_iterator::operator*() const { + return value; +} + +template +template +inline typename OR_Matrix::template any_row_iterator::pointer +OR_Matrix::any_row_iterator::operator->() const { + return &value; +} + +template +template +inline typename OR_Matrix::template any_row_iterator& +OR_Matrix::any_row_iterator::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 +template +inline typename OR_Matrix::template any_row_iterator +OR_Matrix::any_row_iterator::operator++(int) { + any_row_iterator old = *this; + ++(*this); + return old; +} + +template +template +inline typename OR_Matrix::template any_row_iterator& +OR_Matrix::any_row_iterator::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 +template +inline typename OR_Matrix::template any_row_iterator +OR_Matrix::any_row_iterator::operator--(int) { + any_row_iterator old = *this; + --(*this); + return old; +} + +template +template +inline typename OR_Matrix::template any_row_iterator& +OR_Matrix::any_row_iterator::operator+=(const difference_type m) { + difference_type increment = m + m*m/2 + m*e; + if (e % 2 == 0 && m % 2 != 0) + ++increment; + e += m; + i += increment; + value.first += increment; +#if PPL_OR_MATRIX_EXTRA_DEBUG + value.size_ += (m - m%2); +#endif + return *this; +} + +template +template +inline typename OR_Matrix::template any_row_iterator& +OR_Matrix::any_row_iterator::operator-=(difference_type m) { + return *this += -m; +} + +template +template +inline typename OR_Matrix::template any_row_iterator::difference_type +OR_Matrix::any_row_iterator::operator-(const any_row_iterator& y) const { + return e - y.e; +} + +template +template +inline typename OR_Matrix::template any_row_iterator +OR_Matrix::any_row_iterator::operator+(difference_type m) const { + any_row_iterator r = *this; + r += m; + return r; +} + +template +template +inline typename OR_Matrix::template any_row_iterator +OR_Matrix::any_row_iterator::operator-(const difference_type m) const { + any_row_iterator r = *this; + r -= m; + return r; +} + +template +template +inline bool +OR_Matrix::any_row_iterator +::operator==(const any_row_iterator& y) const { + return e == y.e; +} + +template +template +inline bool +OR_Matrix::any_row_iterator +::operator!=(const any_row_iterator& y) const { + return e != y.e; +} + +template +template +inline bool +OR_Matrix::any_row_iterator::operator<(const any_row_iterator& y) const { + return e < y.e; +} + +template +template +inline bool +OR_Matrix::any_row_iterator +::operator<=(const any_row_iterator& y) const { + return e <= y.e; +} + +template +template +inline bool +OR_Matrix::any_row_iterator::operator>(const any_row_iterator& y) const { + return e > y.e; +} + +template +template +inline bool +OR_Matrix::any_row_iterator +::operator>=(const any_row_iterator& y) const { + return e >= y.e; +} + +template +template +inline dimension_type +OR_Matrix::any_row_iterator::row_size() const { + return OR_Matrix::row_size(e); +} + +template +template +inline dimension_type +OR_Matrix::any_row_iterator::index() const { + return e; +} + +template +inline typename OR_Matrix::row_iterator +OR_Matrix::row_begin() { + return num_rows() == 0 ? row_iterator(0) : row_iterator(vec[0]); +} + +template +inline typename OR_Matrix::row_iterator +OR_Matrix::row_end() { + return row_iterator(num_rows()); +} + +template +inline typename OR_Matrix::const_row_iterator +OR_Matrix::row_begin() const { + return num_rows() == 0 ? const_row_iterator(0) : const_row_iterator(vec[0]); +} + +template +inline typename OR_Matrix::const_row_iterator +OR_Matrix::row_end() const { + return const_row_iterator(num_rows()); +} + +template +inline typename OR_Matrix::element_iterator +OR_Matrix::element_begin() { + return vec.begin(); +} + +template +inline typename OR_Matrix::element_iterator +OR_Matrix::element_end() { + return vec.end(); +} + +template +inline typename OR_Matrix::const_element_iterator +OR_Matrix::element_begin() const { + return vec.begin(); +} + +template +inline typename OR_Matrix::const_element_iterator +OR_Matrix::element_end() const { + return vec.end(); +} + +template +inline void +OR_Matrix::swap(OR_Matrix& y) { + std::swap(vec, y.vec); + std::swap(space_dim, y.space_dim); + std::swap(vec_capacity, y.vec_capacity); +} + +//! Returns the integer square root of \p x. +inline unsigned long +isqrt(unsigned long x) { + unsigned long r = 0; + for (unsigned long t = 0x40000000; t; t >>= 2) { + unsigned long s = r + t; + if (s <= x) { + x -= s; + r = s + t; + } + r >>= 1; + } + return r; +} + +template +inline dimension_type +OR_Matrix::max_num_rows() { + // Compute the maximum number of rows that are contained in a DB_Row + // that allocates a pseudo-triangular matrix. + dimension_type k = isqrt(2*DB_Row::max_size() + 1); + return (k - 1) - (k - 1)%2; +} + +template +inline memory_size_type +OR_Matrix::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +template +inline +OR_Matrix::OR_Matrix(const dimension_type dim) + : vec(2*dim*(dim+1)), + space_dim(dim), + vec_capacity(vec.size()) { +} + +template +inline +OR_Matrix::~OR_Matrix() { +} + +template +inline typename OR_Matrix::row_reference_type +OR_Matrix::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 +inline typename OR_Matrix::const_row_reference_type +OR_Matrix::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 +inline dimension_type +OR_Matrix::space_dimension() const { + return space_dim; +} + +template +inline dimension_type +OR_Matrix::num_rows() const { + return 2*space_dimension(); +} + +template +inline void +OR_Matrix::clear() { + OR_Matrix(0).swap(*this); +} + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates OR_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +inline bool +operator==(const OR_Matrix& x, const OR_Matrix& 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 +inline bool +operator!=(const OR_Matrix& x, const OR_Matrix& y) { + return !(x == y); +} + +template +inline +OR_Matrix::OR_Matrix(const OR_Matrix& y) + : vec(y.vec), + space_dim(y.space_dim), + vec_capacity(compute_capacity(y.vec.size(), + DB_Row::max_size())) { +} + +template +template +inline +OR_Matrix::OR_Matrix(const OR_Matrix& y) + : vec(), + space_dim(y.space_dim), + vec_capacity(compute_capacity(y.vec.size(), + DB_Row::max_size())) { + vec.construct_upward_approximation(y.vec, vec_capacity); + assert(OK()); +} + +template +inline OR_Matrix& +OR_Matrix::operator=(const OR_Matrix& y) { + vec = y.vec; + space_dim = y.space_dim; + vec_capacity = compute_capacity(y.vec.size(), DB_Row::max_size()); + return *this; +} + +template +inline void +OR_Matrix::grow(const dimension_type new_dim) { + 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 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); + swap(new_matrix); + } + } +} + +template +inline void +OR_Matrix::shrink(const dimension_type new_dim) { + 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 +inline void +OR_Matrix::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 new_matrix(new_dim); + 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 +inline bool +l_m_distance_assign(Checked_Number& r, + const OR_Matrix& x, + const OR_Matrix& 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::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); + 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 +inline bool +rectilinear_distance_assign(Checked_Number& r, + const OR_Matrix& x, + const OR_Matrix& y, + const Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2) { + return + l_m_distance_assign >(r, x, y, + dir, + tmp0, + tmp1, + tmp2); +} + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates OR_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +inline bool +euclidean_distance_assign(Checked_Number& r, + const OR_Matrix& x, + const OR_Matrix& y, + const Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2) { + return + l_m_distance_assign >(r, x, y, + dir, + tmp0, + tmp1, + tmp2); +} + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates OR_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +inline bool +l_infinity_distance_assign(Checked_Number& r, + const OR_Matrix& x, + const OR_Matrix& y, + const Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2) { + return + l_m_distance_assign >(r, x, y, + dir, + tmp0, + tmp1, + tmp2); +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +/*! \relates Parma_Polyhedra_Library::OR_Matrix */ +template +inline void +swap(Parma_Polyhedra_Library::OR_Matrix& x, + Parma_Polyhedra_Library::OR_Matrix& y) { + x.swap(y); +} + +} // namespace std + + +/* Automatically generated from PPL source file ../src/OR_Matrix.templates.hh line 1. */ +/* OR_Matrix class implementation: non-inline template functions. +*/ + + +#include + +namespace Parma_Polyhedra_Library { + +template +memory_size_type +OR_Matrix::external_memory_in_bytes() const{ + return vec.external_memory_in_bytes(); +} + +template +bool +OR_Matrix::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 +void +OR_Matrix::ascii_dump(std::ostream& s) const { + const OR_Matrix& 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) + +template +bool +OR_Matrix::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 (r != V_EQ || is_minus_infinity(r_i[j])) + return false; + } + } + assert(OK()); + return true; +} + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates Parma_Polyhedra_Library::OR_Matrix */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +std::ostream& +IO_Operators::operator<<(std::ostream& s, const OR_Matrix& m) { + for (typename OR_Matrix::const_row_iterator m_iter = m.row_begin(), + m_end = m.row_end(); m_iter != m_end; ++m_iter) { + typename OR_Matrix::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 606. */ + +/* Automatically generated from PPL source file ../src/Octagonal_Shape.defs.hh line 45. */ +#include +#include +#include +#include + +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: + false is written if \p oct is an empty polyhedron; + true is written if \p oct is a universe polyhedron; + a system of constraints defining \p oct is written otherwise, + all constraints separated by ", ". +*/ +template +std::ostream& +operator<<(std::ostream& s, const Octagonal_Shape& oct); + +} // namespace IO_Operators + +/*! \brief + Returns true 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 false is returned. +*/ +template +bool operator==(const Octagonal_Shape& x, const Octagonal_Shape& y); + +/*! \brief + Returns true 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 true is returned. +*/ +template +bool operator!=(const Octagonal_Shape& x, const Octagonal_Shape& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool rectilinear_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool rectilinear_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& 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 true; + returns false 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 +bool rectilinear_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool euclidean_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool euclidean_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& 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 true; + returns false 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 +bool euclidean_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool l_infinity_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& 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 true; + returns false otherwise. + + The direction of the approximation is specified by \p dir. + + All computations are performed using variables of type + Checked_Number. +*/ +template +bool l_infinity_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& 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 true; + returns false 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 +bool l_infinity_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& y, + Rounding_Dir dir, + Temp& tmp0, + Temp& tmp1, + Temp& tmp2); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Decodes the constraint \p c as an octagonal difference. +/*! \relates Octagonal_Shape + \return + true if the constraint \p c is an octagonal difference; + false otherwise. + + \param c + The constraint to be decoded. + + \param c_space_dim + The space dimension of the constraint \p c (it is assumed + to match the actual space dimension of \p c). + + \param c_num_vars + If true 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 true 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 true 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 true 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 true 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) +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); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Returns the index coherent to \p i. +/*! \relates Octagonal_Shape */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +dimension_type coherent_index(dimension_type i); + +} // namespace Parma_Polyhedra_Library + +//! An octagonal shape. +/*! \ingroup PPL_CXX_interface + The class template Octagonal_Shape allows for the efficient + representation of a restricted kind of topologically closed + convex polyhedra called octagonal shapes (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 octagonal constraints. + + 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 rounding-aware + 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 optimally supports: + - 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 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 oct(cs); + \endcode +*/ +template +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 N; +#else + typedef Checked_Number 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& x, + Complexity_Class complexity = ANY_COMPLEXITY); + + //! Builds a conservative, upward approximation of \p y. + /*! + The complexity argument is ignored. + */ + template + explicit Octagonal_Shape(const Octagonal_Shape& 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 constraints: constraints that are not + \ref Octagonal_Shapes "octagonal constraints" + are ignored (even though they may have contributed + to the space dimension). + + \exception std::invalid_argument + Thrown if the system of constraints \p cs contains strict inequalities. + */ + 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: some elements may be safely ignored. + */ + 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 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 + explicit Octagonal_Shape(const Box& 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 + explicit Octagonal_Shape(const BD_Shape& 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 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 true 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 true 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 true 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 true if and only if \p *this is an empty OS. + bool is_empty() const; + + //! Returns true if and only if \p *this is a universe OS. + bool is_universe() const; + + //! Returns true if and only if \p *this is discrete. + bool is_discrete() const; + + /*! \brief + Returns true if and only if \p *this + is a bounded OS. + */ + bool is_bounded() const; + + /*! \brief + Returns true if and only if \p *this + is a topologically closed subset of the vector space. + */ + bool is_topologically_closed() const; + + /*! \brief + Returns true if and only if \p *this + contains (at least) an integer point. + */ + bool contains_integer_point() const; + + /*! \brief + Returns true 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 true 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 true 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 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 + true 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, + false 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 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 + 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 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, + false 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 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 + true 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, + false 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 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 + 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 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, + false 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; + + //! 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 + 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 to_be_unconstrained, + assigning the result to \p *this. + + \param to_be_unconstrained + 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 to_be_removed. + */ + void unconstrain(const Variables_Set& to_be_unconstrained); + + //! 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 true is returned, + otherwise false is returned. + + \exception std::invalid_argument + Thrown if \p *this and \p y are dimension-incompatible. + */ + bool 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()); + + /*! \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); + + //! 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 must 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 must 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 + 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 must 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 must 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 must 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 must 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 max_space_dimension(). + */ + void concatenate_assign(const Octagonal_Shape& y); + + //! Removes all the specified dimensions. + /*! + \param to_be_removed + The set of Variable objects corresponding to the dimensions to be removed. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with one of the Variable + objects contained in \p to_be_removed. + */ + void remove_space_dimensions(const Variables_Set& to_be_removed); + + /*! \brief + Removes the higher dimensions so that the resulting space + will have dimension \p new_dimension. + + \exception std::invalid_argument + Thrown if \p new_dimension is greater than the space dimension + of \p *this. + */ + void remove_higher_space_dimensions(dimension_type new_dimension); + + /*! \brief + Remaps the dimensions of the vector space according to + a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function". + + \param pfunc + The partial function specifying the destiny of each dimension. + + The template class Partial_Function must provide the following + methods. + \code + bool has_empty_codomain() const + \endcode + returns true if and only if the represented partial + function has an empty codomain (i.e., it is always undefined). + The has_empty_codomain() method will always be called + before the methods below. However, if + has_empty_codomain() returns true, 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 true is returned. + If \f$f\f$ is undefined in \f$k\f$, then false 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 + 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 max_space_dimension(). + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + and var has space dimension \f$k \leq n\f$, + then the \f$k\f$-th space dimension is + \ref expand_space_dimension "expanded" to \p m new space dimensions + \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$. + */ + void expand_space_dimension(Variable var, dimension_type m); + + //! Folds the space dimensions in \p to_be_folded into \p var. + /*! + \param to_be_folded + The set of Variable objects corresponding to the space dimensions + to be folded; + + \param var + The variable corresponding to the space dimension that is the + destination of the folding operation. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with \p var or with + one of the Variable objects contained in \p to_be_folded. + Also thrown if \p var is contained in \p to_be_folded. + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + var has space dimension \f$k \leq n\f$, + \p to_be_folded is a set of variables whose maximum space dimension + is also less than or equal to \f$n\f$, and \p var is not a member + of \p to_be_folded, then the space dimensions corresponding to + variables in \p to_be_folded are \ref fold_space_dimensions "folded" + into the \f$k\f$-th space dimension. + */ + void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var); + + //@} // Member Functions that May Modify the Dimension of the Vector Space + + 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 true if successful, false 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 x == y, + then x.hash_code() == y.hash_code(). + */ + int32_t hash_code() const; + + friend bool + operator==(const Octagonal_Shape& x, const Octagonal_Shape& y); + + template + friend bool Parma_Polyhedra_Library::rectilinear_distance_assign + (Checked_Number& r, + const Octagonal_Shape& x, const Octagonal_Shape& y, + const Rounding_Dir dir, Temp& tmp0, Temp& tmp1, Temp& tmp2); + template + friend bool Parma_Polyhedra_Library::euclidean_distance_assign + (Checked_Number& r, + const Octagonal_Shape& x, const Octagonal_Shape& y, + const Rounding_Dir dir, Temp& tmp0, Temp& tmp1, Temp& tmp2); + template + friend bool Parma_Polyhedra_Library::l_infinity_distance_assign + (Checked_Number& r, + const Octagonal_Shape& x, const Octagonal_Shape& y, + const Rounding_Dir dir, Temp& tmp0, Temp& tmp1, Temp& tmp2); + +private: + template friend class Parma_Polyhedra_Library::Octagonal_Shape; + template friend class Parma_Polyhedra_Library::Box; + + //! The matrix that represents the octagonal shape. + OR_Matrix 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::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 object. +/*! + The assertions supported are: + - zero-dim universe: the polyhedron is the zero-dimensional + vector space \f$\Rset^0 = \{\cdot\}\f$; + - empty: the polyhedron is the empty set; + - strongly closed: 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: + - zero-dim universe excludes any other assertion; + - empty: excludes any other assertion. +*/ +class Status { +public: + //! By default Status is the zero-dim universe 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 true if successful, false 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 all bits in \p mask are set. + bool test_all(flags_t mask) const; + + //! Check whether at least one 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 1640. */ +#undef PPL_IN_Octagonal_Shape_CLASS + + //! The status flags to keep track of the internal state. + Status status; + + //! Returns true if the OS is the zero-dimensional universe. + bool marked_zero_dim_univ() const; + + //! Returns true if the OS is known to be empty. + /*! + The return value false does not necessarily + implies that \p *this is non-empty. + */ + bool marked_empty() const; + + /*! \brief + Returns true if \c this->matrix is known to be + strongly closed. + + The return value false 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 + 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 matrix[i][j] <= k. + void add_octagonal_constraint(dimension_type i, + dimension_type j, + const N& k); + + //! Adds the constraint matrix[i][j] <= num/den. + void add_octagonal_constraint(dimension_type i, + dimension_type j, + Coefficient_traits::const_reference num, + Coefficient_traits::const_reference den); + + /*! \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 + v - u \<= k and v + u \<= k, + starting from \p ub_v, which is an upper bound for \c v + computed according to \p sc_expr and \p sc_den. + + Strong-closure will be able to deduce the constraints + v - u \<= ub_v - lb_u and v + u \<= ub_v + ub_u. + 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 + q == sc_expr[u]/sc_den of \c u in \p sc_expr + is greater than zero, we can improve the bound for v - u. + 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). + + Conversely, if \c q is less than zero, we can improve the bound for + v + u. In particular: + - if q \<= -1, then v + u \<= ub_v + lb_u; + - if -1 \< q \< 0, then + v + u \<= ub_v + ((-q)*lb_u + (1+q)*ub_u). + */ + void deduce_v_pm_u_bounds(dimension_type v_id, + dimension_type last_id, + const Linear_Expression& sc_expr, + Coefficient_traits::const_reference sc_den, + 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 + -v + u \<= k and -v - u \<= k, + 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_den. + + Strong-closure will be able to deduce the constraints + -v - u \<= -lb_v - lb_u and + -v + u \<= -lb_v + ub_u. + 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 + q == sc_expr[u]/sc_den of \c u in \p sc_expr + is greater than zero, we can improve the bound for -v + u. + In particular: + - if q \>= 1, then -v + u \<= -lb_v + lb_u; + - if 0 \< q \< 1, then + -v + u \<= -lb_v + (q*lb_u + (1-q)*ub_u). + + Conversely, if \c q is less than zero, we can improve the bound for + -v - u. In particular: + - if q \<= -1, then -v - u \<= -lb_v - ub_u; + - if -1 \< q \< 0, then + -v - u \<= -lb_v - ((-q)*ub_u + (1+q)*lb_u). + */ + void deduce_minus_v_pm_u_bounds(dimension_type v, + dimension_type last_v, + const Linear_Expression& sc_expr, + Coefficient_traits::const_reference sc_den, + 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& 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& successor, + std::vector& 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& leaders) const; + + /*! \brief + Stores into \p non_redundant information about the matrix entries + that are non-redundant (i.e., will occur in 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& non_redundant) const; + + //! Removes the redundant constraints from \c this->matrix. + void strong_reduction_assign() const; + + /*! \brief + Returns true if and only if \c this->matrix + is strongly reduced. + */ + bool is_strongly_reduced() const; + + /*! \brief + Returns true 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(); + + /*! \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 true if and only if \p from_above is + true and \p expr is bounded from above in \p *this, + or \p from_above is false and \p expr is bounded + from below in \p *this. + + \param expr + The linear expression to test; + + \param from_above + true 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 + true 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 + true 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, false 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 + true 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 + true 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, false 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; + + bool BHZ09_upper_bound_assign_if_exact(const Octagonal_Shape& y); + + friend std::ostream& + Parma_Polyhedra_Library::IO_Operators + ::operator<<<>(std::ostream& s, const Octagonal_Shape& c); + + //! \name Exception Throwers + //@{ + void throw_dimension_incompatible(const char* method, + const Octagonal_Shape& x) const; + + void throw_dimension_incompatible(const char* method, + dimension_type required_dim) const; + + void throw_dimension_incompatible(const char* method, + const Constraint& c) const; + + void throw_dimension_incompatible(const char* method, + const Congruence& cg) const; + + void throw_dimension_incompatible(const char* method, + const Generator& g) const; + + void throw_dimension_incompatible(const char* method, + const char* name_row, + const Linear_Expression& y) const; + + void throw_constraint_incompatible(const char* method) const; + + void throw_expression_too_complex(const char* method, + const Linear_Expression& e) const; + + void throw_generic(const char* method, const char* reason) const; + //@} // Exception Throwers + + static T default_stop_points[]; +}; + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Octagonal_Shape */ +template +void swap(Parma_Polyhedra_Library::Octagonal_Shape& x, + Parma_Polyhedra_Library::Octagonal_Shape& y); + +} // namespace std + +/* Automatically generated from PPL source file ../src/Og_Status.inlines.hh line 1. */ +/* Octagonal_Shape::Status class implementation: inline functions. +*/ + + +namespace Parma_Polyhedra_Library { + +template +inline +Octagonal_Shape::Status::Status(flags_t mask) + : flags(mask) { +} + +template +inline +Octagonal_Shape::Status::Status() + : flags(ZERO_DIM_UNIV) { +} + +template +inline bool +Octagonal_Shape::Status::test_all(flags_t mask) const { + return (flags & mask) == mask; +} + +template +inline bool +Octagonal_Shape::Status::test_any(flags_t mask) const { + return flags & mask; +} + +template +inline void +Octagonal_Shape::Status::set(flags_t mask) { + flags |= mask; +} + +template +inline void +Octagonal_Shape::Status::reset(flags_t mask) { + flags &= ~mask; +} + +template +inline bool +Octagonal_Shape::Status::test_zero_dim_univ() const { + return flags == ZERO_DIM_UNIV; +} + +template +inline void +Octagonal_Shape::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 +inline void +Octagonal_Shape::Status::set_zero_dim_univ() { + // Zero-dim universe is incompatible with anything else. + flags = ZERO_DIM_UNIV; +} + +template +inline bool +Octagonal_Shape::Status::test_empty() const { + return test_any(EMPTY); +} + +template +inline void +Octagonal_Shape::Status::reset_empty() { + reset(EMPTY); +} + +template +inline void +Octagonal_Shape::Status::set_empty() { + flags = EMPTY; +} + +template +inline bool +Octagonal_Shape::Status::test_strongly_closed() const { + return test_any(STRONGLY_CLOSED); +} + +template +inline void +Octagonal_Shape::Status::reset_strongly_closed() { + reset(STRONGLY_CLOSED); +} + +template +inline void +Octagonal_Shape::Status::set_strongly_closed() { + set(STRONGLY_CLOSED); +} + +template +inline bool +Octagonal_Shape::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 sep = ' '; + +/*! \relates Parma_Polyhedra_Library::Octagonal_Shape::Status + Reads a keyword and its associated on/off flag from \p s. + Returns true if the operation is successful, + returns false otherwise. + When successful, \p positive is set to true if the flag + is on; it is set to false 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 +inline void +Octagonal_Shape::Status::ascii_dump(std::ostream& s) const { + using namespace Implementation::Octagonal_Shapes; + s << (test_zero_dim_univ() ? yes : no) << zero_dim_univ + << sep + << (test_empty() ? yes : no) << empty + << sep + << sep + << (test_strongly_closed() ? yes : no) << strong_closed + << sep; +} + +template +inline bool +Octagonal_Shape::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. + 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/Octagonal_Shape.inlines.hh line 34. */ +#include +#include + +namespace Parma_Polyhedra_Library { + +// FIXME: find the appropriate place for this. +/*! \relates Octagonal_Shape */ +inline dimension_type +coherent_index(const dimension_type i) { + return (i % 2 != 0) ? i-1 : i+1; +} + +template +inline dimension_type +Octagonal_Shape::max_space_dimension() { + return OR_Matrix::max_num_rows()/2; +} + +template +inline bool +Octagonal_Shape::marked_zero_dim_univ() const { + return status.test_zero_dim_univ(); +} + +template +inline bool +Octagonal_Shape::marked_strongly_closed() const { + return status.test_strongly_closed(); +} + +template +inline bool +Octagonal_Shape::marked_empty() const { + return status.test_empty(); +} + +template +inline void +Octagonal_Shape::set_zero_dim_univ() { + status.set_zero_dim_univ(); +} + +template +inline void +Octagonal_Shape::set_empty() { + status.set_empty(); +} + +template +inline void +Octagonal_Shape::set_strongly_closed() { + status.set_strongly_closed(); +} + +template +inline void +Octagonal_Shape::reset_strongly_closed() { + status.reset_strongly_closed(); +} + +template +inline +Octagonal_Shape::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(); + assert(OK()); +} + +template +inline +Octagonal_Shape::Octagonal_Shape(const Octagonal_Shape& y, Complexity_Class) + : matrix(y.matrix), space_dim(y.space_dim), status(y.status) { +} + +template +template +inline +Octagonal_Shape::Octagonal_Shape(const Octagonal_Shape& 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 +inline +Octagonal_Shape::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 +inline +Octagonal_Shape::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 +template +inline +Octagonal_Shape::Octagonal_Shape(const Box& box, + Complexity_Class) + : matrix(box.space_dimension()), + space_dim(box.space_dimension()), + status() { + // Check for emptyness 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 +inline +Octagonal_Shape::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 +template +inline +Octagonal_Shape::Octagonal_Shape(const BD_Shape& bd, + Complexity_Class) + : matrix(bd.space_dimension()), + space_dim(bd.space_dimension()), + status() { + // Check for emptyness 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 +inline Congruence_System +Octagonal_Shape::congruences() const { + return minimized_congruences(); +} + +template +inline Octagonal_Shape& +Octagonal_Shape::operator=(const Octagonal_Shape& y) { + matrix = y.matrix; + space_dim = y.space_dim; + status = y.status; + return *this; +} + +template +inline +Octagonal_Shape::~Octagonal_Shape() { +} + +template +inline void +Octagonal_Shape::swap(Octagonal_Shape& y) { + std::swap(matrix, y.matrix); + std::swap(space_dim, y.space_dim); + std::swap(status, y.status); +} + +template +inline dimension_type +Octagonal_Shape::space_dimension() const { + return space_dim; +} + +template +inline bool +Octagonal_Shape::is_discrete() const { + return affine_dimension() == 0; +} + +template +inline bool +Octagonal_Shape::is_empty() const { + strong_closure_assign(); + return marked_empty(); +} + +template +inline bool +Octagonal_Shape::bounds_from_above(const Linear_Expression& expr) const { + return bounds(expr, true); +} + +template +inline bool +Octagonal_Shape::bounds_from_below(const Linear_Expression& expr) const { + return bounds(expr, false); +} + +template +inline bool +Octagonal_Shape::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 +inline bool +Octagonal_Shape::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 +inline bool +Octagonal_Shape::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 +inline bool +Octagonal_Shape::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 +inline bool +Octagonal_Shape::is_topologically_closed() const { + return true; +} + +template +inline void +Octagonal_Shape::topological_closure_assign() { + // Nothing to be done. + return; +} + +/*! \relates Octagonal_Shape */ +template +inline bool +operator==(const Octagonal_Shape& x, const Octagonal_Shape& 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 +inline bool +operator!=(const Octagonal_Shape& x, const Octagonal_Shape& y) { + return !(x == y); +} + +template +inline const typename Octagonal_Shape::coefficient_type& +Octagonal_Shape::matrix_at(const dimension_type i, + const dimension_type j) const { + assert(i < matrix.num_rows() && j < matrix.num_rows()); + return (j < matrix.row_size(i)) + ? matrix[i][j] + : matrix[coherent_index(j)][coherent_index(i)]; +} + +template +inline typename Octagonal_Shape::coefficient_type& +Octagonal_Shape::matrix_at(const dimension_type i, + const dimension_type j) { + assert(i < matrix.num_rows() && j < matrix.num_rows()); + return (j < matrix.row_size(i)) + ? matrix[i][j] + : matrix[coherent_index(j)][coherent_index(i)]; +} + +template +inline Constraint_System +Octagonal_Shape::minimized_constraints() const { + strong_reduction_assign(); + return constraints(); +} + +template +inline void +Octagonal_Shape::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 + assert(i < 2*space_dim && j < 2*space_dim && i != j); + typename OR_Matrix::row_iterator m_i = matrix.row_begin() + i; + 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 +inline void +Octagonal_Shape +::add_octagonal_constraint(const dimension_type i, + const dimension_type j, + Coefficient_traits::const_reference num, + Coefficient_traits::const_reference den) { +#ifndef NDEBUG + // Private method: the caller has to ensure the following. + assert(i < 2*space_dim && j < 2*space_dim && i != j); + typename OR_Matrix::row_iterator m_i = matrix.row_begin() + i; + assert(j < m_i.row_size()); + assert(den != 0); +#endif + PPL_DIRTY_TEMP(N, k); + div_round_up(k, num, den); + add_octagonal_constraint(i, j, k); +} + +template +inline void +Octagonal_Shape::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 +inline void +Octagonal_Shape::add_recycled_constraints(Constraint_System& cs) { + add_constraints(cs); +} + +template +inline void +Octagonal_Shape::add_recycled_congruences(Congruence_System& cgs) { + add_congruences(cgs); +} + +template +inline void +Octagonal_Shape::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 +inline void +Octagonal_Shape::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 +inline void +Octagonal_Shape::refine_with_constraints(const Constraint_System& cs) { + // Dimension-compatibility check. + if (cs.space_dimension() > space_dimension()) + throw_generic("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 +inline void +Octagonal_Shape::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 +void +Octagonal_Shape::refine_with_congruences(const Congruence_System& cgs) { + // Dimension-compatibility check. + if (cgs.space_dimension() > space_dimension()) + throw_generic("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 +inline void +Octagonal_Shape::refine_no_check(const Congruence& cg) { + assert(!marked_empty()); + assert(cg.space_dimension() <= space_dimension()); + + if (cg.is_proper_congruence()) { + if (cg.is_inconsistent()) + set_empty(); + // Other proper congruences are just ignored. + return; + } + + assert(cg.is_equality()); + Constraint c(cg); + refine_no_check(c); +} + +template +inline bool +Octagonal_Shape::can_recycle_constraint_systems() { + return false; +} + +template +inline bool +Octagonal_Shape::can_recycle_congruence_systems() { + return false; +} + +template +inline void +Octagonal_Shape +::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) { + 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; + assert(OK()); +} + +template +inline void +Octagonal_Shape::widening_assign(const Octagonal_Shape& y, unsigned* tp) { + BHMZ05_widening_assign(y, tp); +} + +template +inline void +Octagonal_Shape::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 +inline void +Octagonal_Shape::time_elapse_assign(const Octagonal_Shape& y) { + // Dimension-compatibility check. + if (space_dimension() != y.space_dimension()) + throw_dimension_incompatible("time_elapse_assign(y)", y); + // See the polyhedra documentation. + C_Polyhedron px(constraints()); + C_Polyhedron py(y.constraints()); + px.time_elapse_assign(py); + Octagonal_Shape x(px); + swap(x); + assert(OK()); +} + +template +inline bool +Octagonal_Shape::strictly_contains(const Octagonal_Shape& y) const { + const Octagonal_Shape& x = *this; + return x.contains(y) && !y.contains(x); +} + +template +inline bool +Octagonal_Shape::upper_bound_assign_if_exact(const Octagonal_Shape& y) { + return BHZ09_upper_bound_assign_if_exact(y); +} + +/*! \relates Octagonal_Shape */ +template +inline bool +rectilinear_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& 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 +inline bool +rectilinear_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& y, + const Rounding_Dir dir) { + typedef Checked_Number 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 +inline bool +rectilinear_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& y, + const Rounding_Dir dir) { + return rectilinear_distance_assign(r, x, y, dir); +} + +/*! \relates Octagonal_Shape */ +template +inline bool +euclidean_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& 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 +inline bool +euclidean_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& y, + const Rounding_Dir dir) { + typedef Checked_Number 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 +inline bool +euclidean_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& y, + const Rounding_Dir dir) { + return euclidean_distance_assign(r, x, y, dir); +} + +/*! \relates Octagonal_Shape */ +template +inline bool +l_infinity_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& 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 +inline bool +l_infinity_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& y, + const Rounding_Dir dir) { + typedef Checked_Number 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 +inline bool +l_infinity_distance_assign(Checked_Number& r, + const Octagonal_Shape& x, + const Octagonal_Shape& y, + const Rounding_Dir dir) { + return l_infinity_distance_assign(r, x, y, dir); +} + +template +inline memory_size_type +Octagonal_Shape::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +template +inline int32_t +Octagonal_Shape::hash_code() const { + return space_dimension() & 0x7fffffff; +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Octagonal_Shape */ +template +inline void +swap(Parma_Polyhedra_Library::Octagonal_Shape& x, + Parma_Polyhedra_Library::Octagonal_Shape& y) { + x.swap(y); +} + +} // namespace std + +/* 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 30. */ +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Parma_Polyhedra_Library { + +template +Octagonal_Shape::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. + 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()) + lp.add_constraint(Linear_Expression(c) >= 0); + else + lp.add_constraint(c); + } + + // Check for unsatisfiability. + if (!lp.is_satisfiable()) { + *this = Octagonal_Shape(num_dimensions, EMPTY); + return; + } + + // Start with a universe OS that will be refined by the simplex. + *this = Octagonal_Shape(num_dimensions, UNIVERSE); + // Get all the upper bounds. + Generator g(point()); + PPL_DIRTY_TEMP_COEFFICIENT(num); + PPL_DIRTY_TEMP_COEFFICIENT(den); + 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, num, den); + num *= 2; + div_round_up(matrix[2*i+1][2*i], num, den); + } + // 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, num, den); + div_round_up(matrix[2*i+1][2*j], num, den); + } + } + // 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, num, den); + div_round_up((i < j ? matrix[2*j][2*i] : matrix[2*i+1][2*j+1]), + num, den); + } + } + // 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, num, den); + div_round_up((i < j ? matrix[2*j][2*i] : matrix[2*i+1][2*j+1]), + num, den); + } + } + // 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, num, den); + div_round_up(matrix[2*i][2*j+1], num, den); + } + } + // 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, num, den); + num *= 2; + div_round_up(matrix[2*i][2*i+1], num, den); + } + } + set_strongly_closed(); + assert(OK()); + return; + } + + // Extract easy-to-find bounds from constraints. + assert(complexity == POLYNOMIAL_COMPLEXITY); + *this = Octagonal_Shape(num_dimensions, UNIVERSE); + refine_with_constraints(ph.constraints()); +} + +template +Octagonal_Shape::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::row_reference_type Row_Reference; + typename OR_Matrix::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(); + 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(); + 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_generic("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: + 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: + 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(); + assert(OK()); +} + +template +void +Octagonal_Shape::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_generic("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 (!extract_octagonal_difference(c, c_space_dim, num_vars, + i, j, coeff, term)) + throw_generic("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::row_iterator i_iter = matrix.row_begin() + i; + typename OR_Matrix::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::row_reference_type m_ci = *i_iter; + 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(); + assert(OK()); +} + +template +void +Octagonal_Shape::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_generic("add_congruence(cg)", + "cg is a non-trivial, proper congruence"); + } + + assert(cg.is_equality()); + Constraint c(cg); + add_constraint(c); +} + +template +void +Octagonal_Shape::refine_no_check(const Constraint& c) { + assert(!marked_empty()); + const dimension_type c_space_dim = c.space_dimension(); + 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 (!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::row_iterator i_iter = matrix.row_begin() + i; + typename OR_Matrix::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::row_reference_type m_ci = *i_iter; + 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(); + assert(OK()); +} + +template +dimension_type +Octagonal_Shape::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 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 +Congruence_System +Octagonal_Shape::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; + if (space_dim == 0) { + if (marked_empty()) + cgs = Congruence_System::zero_dim_empty(); + } + else if (marked_empty()) + cgs.insert((0*Variable(space_dim-1) %= 1) / 0); + else { + // KLUDGE: in the future `cgs' will be constructed of the right dimension. + // For the time being, we force the dimension with the following line. + cgs.insert(0*Variable(space_dim-1) == 0); + + // 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 leaders; + compute_leaders(leaders); + + PPL_DIRTY_TEMP_COEFFICIENT(num); + PPL_DIRTY_TEMP_COEFFICIENT(den); + 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]; + assert(is_additive_inverse(c_i_ii, c_ii_i)); +#endif + numer_denom(c_ii_i, num, den); + den *= 2; + cgs.insert(den*x == num); + } + 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 + const N& c_ii_lii = matrix[i+1][coherent_index(lead_i)]; + 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, num, den); + if (lead_i % 2 == 0) + cgs.insert(den*x - den*y == num); + else + cgs.insert(den*x + den*y + num == 0); + } + continue; + } + } + return cgs; +} + +template +void +Octagonal_Shape::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::const_element_iterator + y_it = y.matrix.element_begin(); + for(typename OR_Matrix::row_iterator i = matrix.row_begin()+old_num_rows, + matrix_row_end = matrix.row_end(); i != matrix_row_end; ++i) { + typename OR_Matrix::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 doesn't preserve the closure. + if (marked_strongly_closed()) + reset_strongly_closed(); + assert(OK()); +} + +template +bool +Octagonal_Shape::contains(const Octagonal_Shape& y) const { + // Dimension-compatibility check. + if (space_dim != y.space_dim) + throw_dimension_incompatible("contains(y)", y); + + // The zero-dimensional universe octagon contains any other + // dimension-compatible octagon. + // The zero-dimensional empty octagon only contains another + // zero-dimensional empty octagon. + if (space_dim == 0) { + if (!marked_empty()) + return true; + else + return y.marked_empty(); + } + + // `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; + + // `*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::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 +bool +Octagonal_Shape::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 correspomding constraint in the second Octagonal_Shape or vice versa. + + const dimension_type n_rows = matrix.num_rows(); + + typedef typename OR_Matrix::const_row_iterator Row_Iterator; + typedef typename OR_Matrix::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) { + 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 +bool +Octagonal_Shape::is_universe() const { + // An empty octagon isn't, of course, 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::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 +bool +Octagonal_Shape::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::const_row_iterator i = matrix.row_begin(), + matrix_row_end = matrix.row_end(); i != matrix_row_end; ++i) { + typename OR_Matrix::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 +bool +Octagonal_Shape::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 coeherence. + if (std::numeric_limits::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 oct_z(space_dim); + oct_z.reset_strongly_closed(); + + typedef Octagonal_Shape::N Z; + PPL_DIRTY_TEMP(N, tmp); + bool all_integers = true; + typename OR_Matrix::const_element_iterator x_i = matrix.element_begin(); + for (typename OR_Matrix::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; + Z& d_z = *z_i; + // Copy d into d_z, but rounding downwards. + neg_assign_r(tmp, d, ROUND_NOT_NEEDED); + assign_r(d_z, tmp, ROUND_UP); + neg_assign_r(d_z, d_z, ROUND_NOT_NEEDED); + } + } + // 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 +bool +Octagonal_Shape::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_dimension() < var_space_dim) + throw_dimension_incompatible("constrains(v)", "v", var); + + // A polyhedron 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::const_row_iterator m_iter = matrix.row_begin() + n_v; + typename OR_Matrix::const_row_reference_type r_v = *m_iter; + typename OR_Matrix::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::const_row_iterator m_end = matrix.row_end(); + m_iter != m_end; ++m_iter) { + typename OR_Matrix::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 +bool +Octagonal_Shape::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::const_row_iterator iter = matrix.row_begin() + i; + typename OR_Matrix::const_row_reference_type m_i = *iter; + 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); + div2exp_assign_r(semi_sum, semi_sum, 1, ROUND_UP); + if (m_i[j] > semi_sum) + return false; + } + } + } + return true; +} + +template +bool +Octagonal_Shape::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::const_row_iterator iter = matrix.row_begin(), + matrix_row_end = matrix.row_end(); iter != matrix_row_end; ++iter) { + typename OR_Matrix::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 +bool +Octagonal_Shape::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 (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::const_row_iterator i_iter = matrix.row_begin() + i; + typename OR_Matrix::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 +bool +Octagonal_Shape::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 (!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::const_row_iterator i_iter = matrix.row_begin() + i; + typename OR_Matrix::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, expr.coefficient(Variable(i/2))); + 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); + div2exp_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 +bool +Octagonal_Shape::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 +Poly_Con_Relation +Octagonal_Shape::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 if (cg.inhomogeneous_term() % cg.modulus() == 0) + return Poly_Con_Relation::saturates() + && Poly_Con_Relation::is_included(); + } + + PPL_DIRTY_TEMP(Coefficient, min_num); + PPL_DIRTY_TEMP(Coefficient, min_den); + bool min_included; + PPL_DIRTY_TEMP_COEFFICIENT(mod); + mod = cg.modulus(); + Linear_Expression le; + for (dimension_type i = cg_space_dim; i-- > 0; ) + le += cg.coefficient(Variable(i)) * Variable(i); + bool bounded_below = minimize(le, min_num, min_den, min_included); + + if (!bounded_below) + return Poly_Con_Relation::strictly_intersects(); + + PPL_DIRTY_TEMP_COEFFICIENT(v); + PPL_DIRTY_TEMP_COEFFICIENT(lower_num); + PPL_DIRTY_TEMP_COEFFICIENT(lower_den); + PPL_DIRTY_TEMP_COEFFICIENT(lower); + assign_r(lower_num, min_num, ROUND_NOT_NEEDED); + assign_r(lower_den, min_den, ROUND_NOT_NEEDED); + neg_assign(v, cg.inhomogeneous_term()); + lower = lower_num / lower_den; + v += ((lower / mod) * mod); + if (v * lower_den < lower_num) + v += mod; + const Constraint& c(le == v); + return relation_with(c); +} + +template +Poly_Con_Relation +Octagonal_Shape::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 (!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; + for (dimension_type k = c_space_dim; k-- > 0; ) { + Variable vk(k); + le += c.coefficient(vk) * vk; + } + PPL_DIRTY_TEMP(Coefficient, max_num); + PPL_DIRTY_TEMP(Coefficient, max_den); + bool max_included; + PPL_DIRTY_TEMP(Coefficient, min_num); + PPL_DIRTY_TEMP(Coefficient, min_den); + bool min_included; + bool bounded_above = maximize(le, max_num, max_den, max_included); + bool bounded_below = minimize(le, min_num, min_den, min_included); + if (!bounded_above) { + if (!bounded_below) + return Poly_Con_Relation::strictly_intersects(); + min_num += c.inhomogeneous_term() * min_den; + switch (sgn(min_num)) { + 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_num += c.inhomogeneous_term() * max_den; + switch (sgn(max_num)) { + 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_num += c.inhomogeneous_term() * max_den; + min_num += c.inhomogeneous_term() * min_den; + switch (sgn(max_num)) { + case 1: + switch (sgn(min_num)) { + 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(); + } + case 0: + if (min_num == 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::const_row_iterator i_iter = matrix.row_begin() + i; + typename OR_Matrix::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::const_row_reference_type m_ci = *i_iter; + 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_TEMP0(mpq_class, q_x); + PPL_DIRTY_TEMP0(mpq_class, q_y); + PPL_DIRTY_TEMP0(mpq_class, d); + PPL_DIRTY_TEMP0(mpq_class, d1); + PPL_DIRTY_TEMP0(mpq_class, c_den); + PPL_DIRTY_TEMP0(mpq_class, q_den); + assign_r(c_den, 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_den, ROUND_NOT_NEEDED); + div_assign_r(d1, d1, c_den, 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_den, denom, ROUND_NOT_NEEDED); + assign_r(q_y, numer, ROUND_NOT_NEEDED); + div_assign_r(q_y, q_y, q_den, 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_den, denom, ROUND_NOT_NEEDED); + assign_r(q_x, numer, ROUND_NOT_NEEDED); + div_assign_r(q_x, q_x, q_den, ROUND_NOT_NEEDED); + + if (!is_plus_infinity(m_ci_cj)) { + numer_denom(m_ci_cj, numer, denom); + assign_r(q_den, denom, ROUND_NOT_NEEDED); + assign_r(q_y, numer, ROUND_NOT_NEEDED); + div_assign_r(q_y, q_y, q_den, 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 +Poly_Gen_Relation +Octagonal_Shape::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::const_row_iterator Row_Iterator; + typedef typename OR_Matrix::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(num); + PPL_DIRTY_TEMP_COEFFICIENT(den); + 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's necessary that the scalar product + // is not zero. The scalar product has the form: + // 'den * g_coeff_x - num * g.divisor()'. + numer_denom(m_ii_i, num, den); + den *= 2; + product = den * 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(num); + add_mul_assign(product, num, 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, num, den); + den *= -2; + product = den * 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(num); + add_mul_assign(product, num, 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: + // '-den * g.coeff_x - num * 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, num, den); + den *= 2; + product = den * 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(num); + add_mul_assign(product, num , 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: + // 'den * g_coeff_x - num * 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 ax - ay = b. + // The scalar product has the form + // 'den * coeff_x - den * coeff_y - num * g.divisor()'. + // To satisfy the constraint it's necessary that the scalar product + // is not zero. + numer_denom(m_i_j, num, den); + product = den * g_coeff_x; + neg_assign(den); + add_mul_assign(product, den, 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(num); + add_mul_assign(product, num, g.divisor()); + } + if (product != 0) + return Poly_Gen_Relation::nothing(); + } + else { + if (!is_plus_infinity(m_i_j)) { + // The constraint has form ax - ay <= b. + // The scalar product has the form + // 'den * coeff_x - den * coeff_y - num * 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, num, den); + product = den * g_coeff_x; + neg_assign(den); + add_mul_assign(product, den, 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(num); + add_mul_assign(product, num, 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 -ax + ay <= b. + // The scalar product has the form + // '-den * coeff_x + den * coeff_y - num * 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, num, den); + product = den * g_coeff_y; + neg_assign(den); + add_mul_assign(product, den, 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(num); + add_mul_assign(product, num, 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 ax + ay = b. + // The scalar product has the form + // 'den * coeff_x + den * coeff_y - num * g.divisor()'. + // To satisfy the constraint it's necessary that the scalar product + // is not zero. + numer_denom(m_ii_j, num, den); + product = den * g_coeff_x; + add_mul_assign(product, den, 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(num); + add_mul_assign(product, num, g.divisor()); + } + if (product != 0) + return Poly_Gen_Relation::nothing(); + } + else { + if (!is_plus_infinity(m_i_jj)) { + // The constraint has form -ax - ay <= b. + // The scalar product has the form + // '-den * coeff_x - den * coeff_y - num * 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, num, den); + neg_assign(den); + product = den * g_coeff_x; + add_mul_assign(product, den, 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(num); + add_mul_assign(product, num, 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 ax + ay <= b. + // The scalar product has the form + // 'den * coeff_x + den * coeff_y - num * 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, num, den); + product = den * g_coeff_x; + add_mul_assign(product, den, 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(num); + add_mul_assign(product, num, 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 +void +Octagonal_Shape::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&>(*this); + + typedef typename OR_Matrix::row_iterator Row_Iterator; + typedef typename OR_Matrix::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) { + 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::element_iterator iter_ij; + std::vector vec_k(n_rows); + std::vector 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) { + 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: + // 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. + 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 { + 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 +void +Octagonal_Shape::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::row_iterator i_iter = matrix.row_begin(), + i_end = matrix.row_end(); i_iter != i_end; ++i_iter) { + typename OR_Matrix::row_reference_type x_i = *i_iter; + const dimension_type i = i_iter.index(); + 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); + div2exp_assign_r(semi_sum, semi_sum, 1, ROUND_UP); + min_assign(x_i[j], semi_sum); + } + } + } +} + +template +bool +Octagonal_Shape::tight_coherence_would_make_empty() const { + assert(std::numeric_limits::is_integer); + 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 +void +Octagonal_Shape +::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&>(*this); + + typedef typename OR_Matrix::row_iterator Row_Iterator; + typedef typename OR_Matrix::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) { + 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); + 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. + 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 +void +Octagonal_Shape +::compute_successors(std::vector& successor) const { + assert(!marked_empty() && marked_strongly_closed()); + 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::const_row_iterator i_iter = matrix.row_begin()+i; + typename OR_Matrix::const_row_reference_type m_i = *i_iter; + typename OR_Matrix::const_row_reference_type m_ci + = (i % 2 != 0) ? *(i_iter-1) : *(i_iter+1); + for (dimension_type j = 0; j < i; ++j) { + //for (dimension_type j = i; j-- > 0; ) { + 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 +void +Octagonal_Shape +::compute_leaders(std::vector& leaders) const { + assert(!marked_empty() && marked_strongly_closed()); + 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::const_row_iterator i_iter = matrix.row_begin(), + matrix_row_end = matrix.row_end(); + i_iter != matrix_row_end; ++i_iter) { + typename OR_Matrix::const_row_reference_type m_i = *i_iter; + dimension_type i = i_iter.index(); + typename OR_Matrix::const_row_reference_type m_ci + = (i % 2 != 0) ? *(i_iter-1) : *(i_iter+1); + for (dimension_type j = 0; j < i; ++j) { + 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 +void +Octagonal_Shape +::compute_leaders(std::vector& successor, + std::vector& no_sing_leaders, + bool& exist_sing_class, + dimension_type& sing_leader) const { + assert(!marked_empty() && marked_strongly_closed()); + assert(no_sing_leaders.size() == 0); + dimension_type successor_size = successor.size(); + std::deque 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. + if (next_i == coherent_index(i)) { + exist_sing_class = true; + sing_leader = i; + } + else + no_sing_leaders.push_back(i); + } + // The following index isn't a leader. + dealt_with[next_i] = true; + } +} + +template +void +Octagonal_Shape::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 non_red; + non_redundant_matrix_entries(non_red); + + // Throw away redundant constraints. + Octagonal_Shape& x = const_cast&>(*this); +#ifndef NDEBUG + const Octagonal_Shape x_copy_before(x); +#endif + typename OR_Matrix::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::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); + assert(x_copy_before == x_copy_after); + assert(x.is_strongly_reduced()); + assert(x.OK()); +#endif +} + +template +void +Octagonal_Shape +::non_redundant_matrix_entries(std::vector& nr_rows) const { + // Private method: the caller has to ensure the following. + assert(space_dim > 0 && !marked_empty() && marked_strongly_closed()); + assert(nr_rows.empty()); + + // Initialize `non_redundant' as if it was an OR_Matrix of booleans + // (initially set to false). + nr_rows.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 no_sing_leaders; + dimension_type sing_leader = 0; + bool exist_sing_class = false; + std::vector 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]; + const dimension_type ci = coherent_index(i); + typename OR_Matrix::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) { + nr_rows[next_j].set(j); + j = next_j; + next_j = successor[j]; + } + const dimension_type cj = coherent_index(j); + nr_rows[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); + div2exp_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. + nr_rows[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) { + nr_rows[sing_leader].set(sing_leader+1); + if (successor[sing_leader+1] != sing_leader+1) { + dimension_type j = sing_leader; + dimension_type next_jj = successor[j+1]; + while (next_jj != j+1) { + nr_rows[next_jj].set(j); + j = next_jj; + next_jj = successor[j+1]; + } + nr_rows[j+1].set(j); + } + else + nr_rows[sing_leader+1].set(sing_leader); + } +} + +template +void +Octagonal_Shape::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::const_element_iterator j = y.matrix.element_begin(); + for (typename OR_Matrix::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. + assert(OK()); +} + +template +void +Octagonal_Shape::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 complementaries 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 = Linear_Expression(c); + 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; + assert(OK()); +} + +template +bool +Octagonal_Shape::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 res(dim, UNIVERSE); + x.swap(res); + return false; + } + + typedef typename OR_Matrix::row_iterator Row_Iter; + typedef typename OR_Matrix::const_row_iterator Row_CIter; + typedef typename OR_Matrix::element_iterator Elem_Iter; + typedef typename OR_Matrix::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 wrt 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. + assert(i < dim && j < dim && i != j); + Octagonal_Shape 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); + assert(!is_plus_infinity(res.matrix_at(j, i))); + x.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 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 x_nonred; + x.non_redundant_matrix_entries(x_nonred); + // ... count the non-redundant constraints. + dimension_type x_num_nonred = 0; + for (size_t i = x_nonred.size(); i-- > 0 ; ) + x_num_nonred += x_nonred[i].count_ones(); + assert(x_num_nonred > 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 yy = y; + + // The constraints added to `yy' will be recorded in `res' ... + Octagonal_Shape res(dim, UNIVERSE); + // ... and we will count them too. + dimension_type res_num_nonred = 0; + + // Compute leader information for `x'. + std::vector 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_nonred; + // 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_nonred; + // 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_nonred < x_num_nonred) { + res.reset_strongly_closed(); + x.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); + 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_nonred; + // 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); + assert(!is_plus_infinity(x_j_i)); + if (x_j_i < yy_j_i) { + res.matrix_at(j, i) = x_j_i; + ++res_num_nonred; + // 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_nonred < x_num_nonred) { + res.reset_strongly_closed(); + x.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_nonred_i = x_nonred[i]; + for (dimension_type j = 0; j < 2*dim; ++j) { + if (j != x_leaders[j]) + continue; + if (i >= j) { + if (!x_nonred_i[j]) + continue; + } + else if (!x_nonred[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_nonred; + // 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_nonred < x_num_nonred) { + res.reset_strongly_closed(); + x.swap(res); + } + return bool_result; + } + } + } + } + // This point should be unreachable. + throw std::runtime_error("PPL internal error"); +} + +template +void +Octagonal_Shape::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(); + + assert(OK()); +} + +template +void +Octagonal_Shape::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::row_iterator i = matrix.row_begin() + n, + matrix_row_end = matrix.row_end(); i != matrix_row_end; i += 2) { + typename OR_Matrix::row_reference_type x_i = *i; + typename OR_Matrix::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(); + assert(OK()); +} + +template +void +Octagonal_Shape +::remove_space_dimensions(const Variables_Set& to_be_removed) { + // 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 (to_be_removed.empty()) { + assert(OK()); + return; + } + + // Dimension-compatibility check. + const dimension_type min_space_dim = to_be_removed.space_dimension(); + if (space_dim < min_space_dim) + throw_dimension_incompatible("remove_space_dimensions(vs)", min_space_dim); + + const dimension_type new_space_dim = space_dim - to_be_removed.size(); + + 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; + assert(OK()); + return; + } + + // We consider every variable and we check if it is to be removed. + // If it is to be removed, we pass to the successive one, elsewhere + // we move its elements in the right position. + Variables_Set::const_iterator tbr = to_be_removed.begin(); + dimension_type ftr = *tbr; + dimension_type ftr_size = 2*ftr*(ftr+1); + typename OR_Matrix::element_iterator + iter = matrix.element_begin()+ftr_size; + + dimension_type i = ftr + 1; + while (i < space_dim) { + if (to_be_removed.count(i) != 0) + ++i; + else { + typename OR_Matrix::row_iterator + row_iter = matrix.row_begin()+2*i; + typename OR_Matrix::row_reference_type + row_ref = *row_iter; + typename OR_Matrix::row_reference_type + row_ref1 = *(++row_iter); + // If variable(j) is to remove, we pass another variable, + // else we shift its cells to up right. + // Attention: first we shift the cells corrispondent to the first + // row of variable(j), then we shift the cells corrispondent to the + // second row. We recall that every variable is represented + // in the `matrix' by two rows and two rows. + for (dimension_type j = 0; j <= i; ++j) + if (to_be_removed.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 (to_be_removed.count(j) == 0) { + assign_or_swap(*(iter++), row_ref1[2*j]); + assign_or_swap(*(iter++), row_ref1[2*j+1]); + } + ++i; + } + } + // Update the space dimension. + matrix.shrink(new_space_dim); + space_dim = new_space_dim; + assert(OK()); +} + +template +template +void +Octagonal_Shape::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 x(new_space_dim); + + typedef typename OR_Matrix::row_iterator Row_Iterator; + typedef typename OR_Matrix::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 xj_iter = m_begin + double_new_j; + Row_Reference x_j = *xj_iter; + Row_Reference x_jj = *(xj_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]); + } + + } + } + } + } + + std::swap(matrix, x); + space_dim = new_space_dim; + assert(OK()); +} + +template +void +Octagonal_Shape::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::const_element_iterator j = y.matrix.element_begin(); + for (typename OR_Matrix::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(); + assert(OK()); +} + +template +template +void +Octagonal_Shape::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); + +#ifndef NDEBUG + { + // We assume that `y' is contained in or equal to `*this'. + const Octagonal_Shape x_copy = *this; + const Octagonal_Shape y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + // 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::const_element_iterator j = y.matrix.element_begin(); + for (typename OR_Matrix::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(); + assert(OK()); +} + +template +void +Octagonal_Shape +::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. + 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 (!extract_octagonal_difference(c, cs_space_dim, num_vars, i, j, + coeff, term)) + continue; + + typedef typename OR_Matrix::const_row_iterator Row_iterator; + typedef typename OR_Matrix::const_row_reference_type Row_reference; + typedef typename OR_Matrix::row_iterator Row_Iterator; + typedef typename OR_Matrix::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& 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. + 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 +void +Octagonal_Shape +::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; + +#ifndef NDEBUG + { + // We assume that `y' is contained in or equal to `*this'. + const Octagonal_Shape x_copy = *this; + const Octagonal_Shape y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + // If `*this' is empty, since `*this' contains `y', `y' is empty too. + if (marked_empty()) + return; + // If `y' is empty, we return. + if (y.marked_empty()) + return; + + Octagonal_Shape limiting_octagon(space_dim, UNIVERSE); + get_limiting_octagon(cs, limiting_octagon); + CC76_extrapolation_assign(y, tp); + intersection_assign(limiting_octagon); +} + +template +void +Octagonal_Shape::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); + +#ifndef NDEBUG + { + // We assume that `y' is contained in or equal to `*this'. + const Octagonal_Shape x_copy = *this; + const Octagonal_Shape y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + // Compute the affine dimension of `y'. + const dimension_type y_affine_dim = y.affine_dimension(); + // If the affine dimension of `y' is zero, then either `y' is + // zero-dimensional, or it is empty, or it is a singleton. + // In all cases, due to the inclusion hypothesis, the result is `*this'. + if (y_affine_dim == 0) + return; + + // If the affine dimension has changed, due to the inclusion hypothesis, + // the result is `*this'. + const dimension_type x_affine_dim = affine_dimension(); + assert(x_affine_dim >= y_affine_dim); + if (x_affine_dim != y_affine_dim) + return; + + // If there are tokens available, work on a temporary copy. + if (tp != 0 && *tp > 0) { + 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. + assert(marked_strongly_closed() && y.marked_strongly_closed()); + // Minimize `y'. + y.strong_reduction_assign(); + + // Extrapolate unstable bounds. + typename OR_Matrix::const_element_iterator j = y.matrix.element_begin(); + for (typename OR_Matrix::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(); + assert(OK()); +} + +template +void +Octagonal_Shape +::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; + +#ifndef NDEBUG + { + // We assume that `y' is contained in or equal to `*this'. + const Octagonal_Shape x_copy = *this; + const Octagonal_Shape y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + // If `*this' is empty, since `*this' contains `y', `y' is empty too. + if (marked_empty()) + return; + // If `y' is empty, we return. + if (y.marked_empty()) + return; + + Octagonal_Shape limiting_octagon(space_dim, UNIVERSE); + get_limiting_octagon(cs, limiting_octagon); + BHMZ05_widening_assign(y, tp); + intersection_assign(limiting_octagon); +} + +template +void +Octagonal_Shape::CC76_narrowing_assign(const Octagonal_Shape& y) { + // Dimension-compatibility check. + if (space_dim != y.space_dim) + throw_dimension_incompatible("CC76_narrowing_assign(y)", y); + +#ifndef NDEBUG + { + // We assume that `*this' is contained in or equal to `y'. + const Octagonal_Shape x_copy = *this; + const Octagonal_Shape y_copy = y; + assert(y_copy.contains(x_copy)); + } +#endif + + // 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::const_element_iterator j = y.matrix.element_begin(); + for (typename OR_Matrix::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(); + assert(OK()); +} + +template +void +Octagonal_Shape +::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_den, + const N& ub_v) { + // Private method: the caller has to ensure the following. + assert(sc_den > 0); + assert(!is_plus_infinity(ub_v)); + + PPL_DIRTY_TEMP0(mpq_class, mpq_sc_den); + assign_r(mpq_sc_den, sc_den, ROUND_NOT_NEEDED); + + // No need to consider indices greater than `last_id'. + const dimension_type n_v = 2*v_id; + typename OR_Matrix::row_reference_type m_cv = matrix[n_v+1]; + + // Speculatively allocate temporaries out of the loop. + PPL_DIRTY_TEMP(N, half); + PPL_DIRTY_TEMP0(mpq_class, minus_lb_u); + PPL_DIRTY_TEMP0(mpq_class, q); + PPL_DIRTY_TEMP0(mpq_class, minus_q); + PPL_DIRTY_TEMP0(mpq_class, ub_u); + PPL_DIRTY_TEMP0(mpq_class, lb_u); + PPL_DIRTY_TEMP(N, up_approx); + PPL_DIRTY_TEMP_COEFFICIENT(minus_expr_u); + + for (dimension_type u_id = last_id+1; u_id-- > 0; ) { + // Skip the case when `u_id == v_id'. + if (u_id == v_id) + continue; + const Coefficient& expr_u = sc_expr.coefficient(Variable(u_id)); + // Skip the case when `expr_u == 0'. + if (expr_u == 0) + continue; + + 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_den) { + // 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. + div2exp_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::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); + div2exp_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_den, ROUND_NOT_NEEDED); + assign_r(ub_u, matrix[n_u+1][n_u], ROUND_NOT_NEEDED); + div2exp_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 { + 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_den) { + // 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. + div2exp_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::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); + div2exp_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_den, ROUND_NOT_NEEDED); + assign_r(lb_u, matrix[n_u][n_u+1], ROUND_NOT_NEEDED); + div2exp_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 +void +Octagonal_Shape +::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_den, + const N& minus_lb_v) { + // Private method: the caller has to ensure the following. + assert(sc_den > 0); + assert(!is_plus_infinity(minus_lb_v)); + + PPL_DIRTY_TEMP0(mpq_class, mpq_sc_den); + assign_r(mpq_sc_den, sc_den, ROUND_NOT_NEEDED); + + // No need to consider indices greater than `last_id'. + const dimension_type n_v = 2*v_id; + typename OR_Matrix::row_reference_type m_v = matrix[n_v]; + + // Speculatively allocate temporaries out of the loop. + PPL_DIRTY_TEMP(N, half); + PPL_DIRTY_TEMP0(mpq_class, ub_u); + PPL_DIRTY_TEMP0(mpq_class, q); + PPL_DIRTY_TEMP0(mpq_class, minus_lb_u); + PPL_DIRTY_TEMP(N, up_approx); + PPL_DIRTY_TEMP_COEFFICIENT(minus_expr_u); + + for (dimension_type u_id = last_id+1; u_id-- > 0; ) { + // Skip the case when `u_id == v_id'. + if (u_id == v_id) + continue; + const Coefficient& expr_u = sc_expr.coefficient(Variable(u_id)); + // Skip the case when `expr_u == 0'. + if (expr_u == 0) + continue; + + 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_den) { + // 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. + div2exp_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::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); + div2exp_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_den, ROUND_NOT_NEEDED); + assign_r(minus_lb_u, matrix[n_u][n_u+1], ROUND_NOT_NEEDED); + div2exp_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 { + 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_den) { + // 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. + div2exp_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::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); + div2exp_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_den, ROUND_NOT_NEEDED); + assign_r(minus_lb_u, m_u[n_u+1], ROUND_NOT_NEEDED); + div2exp_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 +void +Octagonal_Shape +::forget_all_octagonal_constraints(const dimension_type v_id) { + assert(v_id < space_dim); + const dimension_type n_v = 2*v_id; + typename OR_Matrix::row_iterator m_iter = matrix.row_begin() + n_v; + typename OR_Matrix::row_reference_type r_v = *m_iter; + typename OR_Matrix::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::row_iterator m_end = matrix.row_end(); + m_iter != m_end; ++m_iter) { + typename OR_Matrix::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 +void +Octagonal_Shape +::forget_binary_octagonal_constraints(const dimension_type v_id) { + assert(v_id < space_dim); + const dimension_type n_v = 2*v_id; + typename OR_Matrix::row_iterator m_iter = matrix.row_begin() + n_v; + typename OR_Matrix::row_reference_type r_v = *m_iter; + typename OR_Matrix::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::row_iterator m_end = matrix.row_end(); + m_iter != m_end; ++m_iter) { + typename OR_Matrix::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 +void +Octagonal_Shape::unconstrain(const Variable var) { + // Dimension-compatibility check. + const dimension_type dim = var.id(); + if (space_dimension() < dim) + throw_dimension_incompatible("unconstrain(var)", dim); + + // 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(dim); + // Strong closure is preserved. + assert(OK()); +} + +template +void +Octagonal_Shape::unconstrain(const Variables_Set& to_be_unconstrained) { + // The cylindrification wrt no dimensions is a no-op. + // This case captures the only legal cylindrification in a 0-dim space. + if (to_be_unconstrained.empty()) + return; + + // Dimension-compatibility check. + const dimension_type min_space_dim = to_be_unconstrained.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 tbu = to_be_unconstrained.begin(), + tbu_end = to_be_unconstrained.end(); tbu != tbu_end; ++tbu) + forget_all_octagonal_constraints(*tbu); + // Strong closure is preserved. + assert(OK()); +} + +template +void +Octagonal_Shape::refine(const Variable var, + const Relation_Symbol relsym, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator) { + assert(denominator != 0); + const dimension_type expr_space_dim = expr.space_dimension(); + assert(space_dim >= expr_space_dim); + const dimension_type var_id = var.id(); + assert(var_id <= space_dim); + assert(expr.coefficient(var) == 0); + 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 = 0; + + // Get information about the number of non-zero coefficients in `expr'. + for (dimension_type i = expr_space_dim; i-- > 0; ) + if (expr.coefficient(Variable(i)) != 0) { + if (t++ == 1) + break; + else + w_id = i; + } + + // Now we know the form of `expr': + // - If t == 0, then expr == b, with `b' a constant; + // - If t == 1, then expr == a*j + b, where `j != v'; + // - If t == 2, the `expr' is of the general form. + typedef typename OR_Matrix::row_iterator Row_Iterator; + typedef typename OR_Matrix::row_reference_type Row_Reference; + typedef typename OR_Matrix::const_row_iterator Row_iterator; + typedef typename OR_Matrix::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_den); + neg_assign(minus_den, 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_den) + 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_den); + 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_den); + break; + default: + // We already dealt with the other cases. + throw std::runtime_error("PPL internal error"); + } + } + 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_den); + } + else { + add_octagonal_constraint(n_var+1, n_w+1, b, denominator); + add_octagonal_constraint(n_var, n_w, b, minus_den); + } + 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_den); + } + else { + add_octagonal_constraint(n_var+1, n_w, b, denominator); + add_octagonal_constraint(n_var, n_w+1, b, minus_den); + } + 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_den) { + // 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_den); + // 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_den) { + // 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. + throw std::runtime_error("PPL internal error"); + } + } + 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_den = is_sc ? denominator : minus_den; + const Coefficient& minus_sc_den = is_sc ? minus_den : denominator; + // NOTE: here, for optimization purposes, `minus_expr' is only assigned + // when `denominator' is negative. Do not use it unless you are sure + // it has been correctly assigned. + Linear_Expression minus_expr; + if (!is_sc) + minus_expr = -expr; + const Linear_Expression& sc_expr = is_sc ? expr : minus_expr; + + 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_iter + (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. + div2exp_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. + div2exp_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. + div2exp_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. + div2exp_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) { + 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_den != 1) { + // Before computing quotients, the denominator should be + // approximated towards zero. Since `sc_den' is known to be + // positive, this amounts to rounding downwards, which is + // achieved as usual by rounding upwards `minus_sc_den' + // and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(sum, sum, down_sc_den, ROUND_UP); + } + // Add the upper bound constraint, if meaningful. + if (pinf_count == 0) { + // Add the constraint `v <= sum'. + PPL_DIRTY_TEMP(N, double_sum); + mul2exp_assign_r(double_sum, sum, 1, ROUND_IGNORE); + 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_den, sum); + } + else + // Here `pinf_count == 1'. + if (pinf_index != var_id) { + const Coefficient& ppi = + sc_expr.coefficient(Variable(pinf_index)); + if (ppi == sc_den) + // 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_den) { + // 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_den != 1) { + // Before computing quotients, the denominator should be + // approximated towards zero. Since `sc_den' is known to be + // positive, this amounts to rounding downwards, which is + // achieved as usual by rounding upwards `minus_sc_den' + // and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(neg_sum, neg_sum, down_sc_den, ROUND_UP); + } + // Add the lower bound constraint, if meaningful. + if (neg_pinf_count == 0) { + // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'. + PPL_DIRTY_TEMP(N, double_neg_sum); + mul2exp_assign_r(double_neg_sum, neg_sum, 1, ROUND_IGNORE); + 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_den, 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_den) + // 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_den) { + // 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_end = m_iter + (2*w_id) + 2; + m_iter != m_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); + } + div2exp_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_den != 1) { + // Before computing the quotient, the denominator should be + // approximated towards zero. Since `sc_den' is known to be + // positive, this amounts to rounding downwards, which is achieved + // by rounding upwards `minus_sc-den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(sum, sum, down_sc_den, ROUND_UP); + } + + if (pinf_count == 0) { + // Add the constraint `v <= sum'. + PPL_DIRTY_TEMP(N, double_sum); + mul2exp_assign_r(double_sum, sum, 1, ROUND_IGNORE); + 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_den, 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_den) { + // 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_end = m_iter + (2*w_id) + 2; + m_iter != m_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); + } + div2exp_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_den != 1) { + // Before computing the quotient, the denominator should be + // approximated towards zero. Since `sc_den' is known to be positive, + // this amounts to rounding downwards, which is achieved by rounding + // upwards `minus_sc_den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(sum, sum, down_sc_den, ROUND_UP); + } + + if (pinf_count == 0) { + // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'. + PPL_DIRTY_TEMP(N, double_sum); + mul2exp_assign_r(double_sum, sum, 1, ROUND_IGNORE); + 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_den, 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_den) { + // 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. + throw std::runtime_error("PPL internal error"); + } + } +} + +template +void +Octagonal_Shape::affine_image(const Variable var, + const Linear_Expression& expr, + Coefficient_traits::const_reference + denominator) { + // The denominator cannot be zero. + if (denominator == 0) + throw_generic("affine_image(v, e, d)", "d == 0"); + + // Dimension-compatibility checks. + // The dimension of `expr' should not be greater than the dimension + // of `*this'. + const dimension_type 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 = 0; + + // Get information about the number of non-zero coefficients in `expr'. + // The `expr' must not be in two or plus variables. + for (dimension_type i = expr_space_dim; i-- > 0; ) + if (expr.coefficient(Variable(i)) != 0) { + if (t++ == 1) + break; + else + w_id = i; + } + + typedef typename OR_Matrix::row_iterator Row_Iterator; + typedef typename OR_Matrix::row_reference_type Row_Reference; + typedef typename OR_Matrix::const_row_iterator Row_iterator; + typedef typename OR_Matrix::const_row_reference_type Row_reference; + + const dimension_type n_var = 2*var_id; + const Coefficient& b = expr.inhomogeneous_term(); + PPL_DIRTY_TEMP_COEFFICIENT(minus_den); + neg_assign_r(minus_den, 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_den); + 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_den) { + // 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. + if (w_coeff == 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, minus_d); + div_round_up(minus_d, b, minus_den); + 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); + } + 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); + } + // Now update unary constraints on var. + mul2exp_assign_r(d, d, 1, ROUND_IGNORE); + N& m_cv_v = m_cv[n_var]; + add_assign_r(m_cv_v, m_cv_v, d, ROUND_UP); + mul2exp_assign_r(minus_d, minus_d, 1, ROUND_IGNORE); + N& m_v_cv = m_v[n_var+1]; + add_assign_r(m_v_cv, m_v_cv, minus_d, ROUND_UP); + } + reset_strongly_closed(); + } + else { + // Here `w_coeff == -denominator'. + // Remove the binary constraints on `var'. + forget_binary_octagonal_constraints(var_id); + const Row_Iterator m_begin = matrix.row_begin(); + Row_Iterator m_iter = m_begin + n_var; + N& m_v_cv = (*m_iter)[n_var+1]; + ++m_iter; + N& m_cv_v = (*m_iter)[n_var]; + // Swap the unary constraints on `var'. + std::swap(m_v_cv, m_cv_v); + // Strong closure is not preserved. + reset_strongly_closed(); + if (b != 0) { + // Translate the unary constraints on `var', + // adding or subtracting the value `b/denominator'. + PPL_DIRTY_TEMP(N, d); + div_round_up(d, b, denominator); + mul2exp_assign_r(d, d, 1, ROUND_IGNORE); + add_assign_r(m_cv_v, m_cv_v, d, ROUND_UP); + PPL_DIRTY_TEMP(N, minus_d); + div_round_up(minus_d, b, minus_den); + mul2exp_assign_r(minus_d, minus_d, 1, ROUND_IGNORE); + add_assign_r(m_v_cv, m_v_cv, minus_d, ROUND_UP); + } + incremental_strong_closure_assign(var); + } + } + 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_den); + } + else { + add_octagonal_constraint(n_var+1, n_w+1, b, denominator); + add_octagonal_constraint(n_var, n_w, b, minus_den); + } + 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_den); + } + else { + add_octagonal_constraint(n_var+1, n_w, b, denominator); + add_octagonal_constraint(n_var, n_w+1, b, minus_den); + } + incremental_strong_closure_assign(var); + } + 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_den = is_sc ? denominator : minus_den; + const Coefficient& minus_sc_den = is_sc ? minus_den : denominator; + // NOTE: here, for optimization purposes, `minus_expr' is only assigned + // when `denominator' is negative. Do not use it unless you are sure + // it has been correctly assigned. + Linear_Expression minus_expr; + if (!is_sc) + minus_expr = -expr; + const Linear_Expression& sc_expr = is_sc ? expr : minus_expr; + + 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_iter + (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. + div2exp_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. + div2exp_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. + div2exp_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. + div2exp_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) { + 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_den != 1) { + // Before computing quotients, the denominator should be approximated + // towards zero. Since `sc_den' is known to be positive, this amounts to + // rounding downwards, which is achieved as usual by rounding upwards + // `minus_sc_den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(pos_sum, pos_sum, down_sc_den, ROUND_UP); + } + // Add the upper bound constraint, if meaningful. + if (pos_pinf_count == 0) { + // Add the constraint `v <= pos_sum'. + PPL_DIRTY_TEMP(N, double_pos_sum); + mul2exp_assign_r(double_pos_sum, pos_sum, 1, ROUND_IGNORE); + 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_den, 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_den) + // 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_den) { + // 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_den != 1) { + // Before computing quotients, the denominator should be approximated + // towards zero. Since `sc_den' is known to be positive, this amounts to + // rounding downwards, which is achieved as usual by rounding upwards + // `minus_sc_den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(neg_sum, neg_sum, down_sc_den, ROUND_UP); + } + // Add the lower bound constraint, if meaningful. + if (neg_pinf_count == 0) { + // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'. + PPL_DIRTY_TEMP(N, double_neg_sum); + mul2exp_assign_r(double_neg_sum, neg_sum, 1, ROUND_IGNORE); + 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_den, 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_den) + // 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_den) { + // 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); + assert(OK()); +} + +template +void +Octagonal_Shape::affine_preimage(const Variable var, + const Linear_Expression& expr, + Coefficient_traits::const_reference + denominator) { + + // The denominator cannot be zero. + if (denominator == 0) + throw_generic("affine_preimage(v, e, d)", "d == 0"); + + // Dimension-compatibility checks. + // The dimension of `expr' should not be greater than the dimension + // of `*this'. + const dimension_type 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 = 0; + + // Get information about the number of the non-zero coefficients of `expr'. + for (dimension_type i = expr_space_dim; i-- > 0; ) + if (expr.coefficient(Variable(i)) != 0) { + if (t++ == 1) + break; + else + w_id = i; + } + + // `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); + 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); + 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); + assert(OK()); + } +} + +template +void +Octagonal_Shape +::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_generic("generalized_affine_image(v, r, e, d)", "d == 0"); + + // Dimension-compatibility checks. + // The dimension of `expr' should not be greater than the dimension + // of `*this'. + const dimension_type 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_generic("generalized_affine_image(v, r, e, d)", + "r is a strict relation symbol and " + "*this is an Octagonal_Shape"); + + 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 = 0; + + // Get information about the number of non-zero coefficients in `expr'. + // The `expr' must not be in two or plus variables. + for (dimension_type i = expr_space_dim; i-- > 0; ) + if (expr.coefficient(Variable(i)) != 0) { + if (t++ == 1) + break; + else + w_id = i; + } + + typedef typename OR_Matrix::row_iterator Row_Iterator; + typedef typename OR_Matrix::row_reference_type Row_Reference; + typedef typename OR_Matrix::const_row_iterator Row_iterator; + typedef typename OR_Matrix::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_den); + neg_assign_r(minus_den, 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_den); + break; + default: + // We already dealt with the other cases. + throw std::runtime_error("PPL internal error"); + } + 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_den) { + // 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); + } + mul2exp_assign_r(d, d, 1, ROUND_IGNORE); + 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]; + mul2exp_assign_r(d, d, 1, ROUND_IGNORE); + 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_den); + 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); + } + mul2exp_assign_r(d, d, 1, ROUND_IGNORE); + 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]; + mul2exp_assign_r(d, d, 1, ROUND_IGNORE); + 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_den); + else + add_octagonal_constraint(n_var, n_w, b, minus_den); + } + 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_den); + else + add_octagonal_constraint(n_var, n_w+1, b, minus_den); + } + } + break; + } + + default: + // We already dealt with the other cases. + throw std::runtime_error("PPL internal error"); + } + 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_den = is_sc ? denominator : minus_den; + const Coefficient& minus_sc_den = is_sc ? minus_den : denominator; + // NOTE: here, for optimization purposes, `minus_expr' is only assigned + // when `denominator' is negative. Do not use it unless you are sure + // it has been correctly assigned. + Linear_Expression minus_expr; + if (!is_sc) + minus_expr = -expr; + const Linear_Expression& sc_expr = is_sc ? expr : minus_expr; + + 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_iter + (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); + } + div2exp_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) { + assert(OK()); + return; + } + + // Divide by the (sign corrected) denominator (if needed). + if (sc_den != 1) { + // Before computing the quotient, the denominator should be + // approximated towards zero. Since `sc_den' is known to be + // positive, this amounts to rounding downwards, which is + // achieved as usual by rounding upwards + // `minus_sc_den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(sum, sum, down_sc_den, ROUND_UP); + } + + if (pinf_count == 0) { + // Add the constraint `v <= pos_sum'. + PPL_DIRTY_TEMP(N, double_sum); + mul2exp_assign_r(double_sum, sum, 1, ROUND_IGNORE); + 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_den, 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_den) { + // 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_iter + (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); + } + div2exp_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) { + assert(OK()); + return; + } + + // Divide by the (sign corrected) denominator (if needed). + if (sc_den != 1) { + // Before computing the quotient, the denominator should be + // approximated towards zero. Since `sc_den' is known to be + // positive, this amounts to rounding downwards, which is + // achieved as usual by rounding upwards + // `minus_sc_den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(sum, sum, down_sc_den, ROUND_UP); + } + + if (pinf_count == 0) { + // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'. + PPL_DIRTY_TEMP(N, double_sum); + mul2exp_assign_r(double_sum, sum, 1, ROUND_IGNORE); + 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_den, 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_den) { + // 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. + throw std::runtime_error("PPL internal error"); + } + incremental_strong_closure_assign(var); + assert(OK()); +} + +template +void +Octagonal_Shape::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_generic("generalized_affine_image(e1, r, e2)", + "r is a strict relation symbol and " + "*this is an Octagonal_Shape"); + + 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 = 0; + + // Compute the number of the non-zero components of `lhs'. + for (dimension_type i = lhs_space_dim; i-- > 0; ) + if (lhs.coefficient(Variable(i)) != 0) { + if (t_lhs++ == 1) + break; + else + j_lhs = i; + } + + const Coefficient& b_lhs = lhs.inhomogeneous_term(); + + if (t_lhs == 0) { + // `lhs' is a constant. + // In principle, it is sufficient to add the constraint `lhs relsym rhs'. + // Note that this constraint is 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. + throw std::runtime_error("PPL internal error"); + } + } + + else if (t_lhs == 1) { + // Here `lhs == a_lhs * v + b_lhs'. + // Independently from the form of `rhs', we can exploit the + // method computing generalized affine images for a single variable. + Variable v(j_lhs); + // Compute a sign-corrected relation symbol. + const Coefficient& den = lhs.coefficient(v); + Relation_Symbol new_relsym = relsym; + if (den < 0) { + if (relsym == LESS_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, den); + } + else { + // Here `lhs' is of the general form, having at least two variables. + // Compute the set of variables occurring in `lhs'. + bool lhs_vars_intersects_rhs_vars = false; + std::vector lhs_vars; + for (dimension_type i = lhs_space_dim; i-- > 0; ) + if (lhs.coefficient(Variable(i)) != 0) { + lhs_vars.push_back(Variable(i)); + if (rhs.coefficient(Variable(i)) != 0) + lhs_vars_intersects_rhs_vars = true; + } + + if (!lhs_vars_intersects_rhs_vars) { + // `lhs' and `rhs' variables are disjoint. + // 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. + throw std::runtime_error("PPL internal error"); + } + } + 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 = Variable(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(); + 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. + throw std::runtime_error("PPL internal error"); + } + // Remove the temporarily added dimension. + remove_higher_space_dimensions(space_dim-1); +#endif // Currently unnecessarily complex computation. + } + } + + assert(OK()); +} + +template +void +Octagonal_Shape::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_generic("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)", + "lb", lb_expr); + const dimension_type ub_space_dim = ub_expr.space_dimension(); + if (space_dim < ub_space_dim) + throw_dimension_incompatible("bounded_affine_image(v, lb, ub)", + "ub", ub_expr); + + 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 = 0; + + // Get information about the number of non-zero coefficients in `lb_expr'. + // The `expr' must not be in two or plus variables. + for (dimension_type i = lb_space_dim; i-- > 0; ) + if (lb_expr.coefficient(Variable(i)) != 0) { + if (t++ == 1) + break; + else + w_id = i; + } + + typedef typename OR_Matrix::row_iterator Row_Iterator; + typedef typename OR_Matrix::row_reference_type Row_Reference; + typedef typename OR_Matrix::const_row_iterator Row_iterator; + typedef typename OR_Matrix::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_den); + neg_assign_r(minus_den, 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_den); + 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_den) { + // 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 = Variable(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(); + 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_den); + else + add_octagonal_constraint(n_var, n_w, b, minus_den); + else { + // Add the new constraint `var + w >= b/denominator'. + if (var_id < w_id) + add_octagonal_constraint(n_w, n_var+1, b, minus_den); + else + add_octagonal_constraint(n_var, n_w+1, b, minus_den); + } + 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_den = is_sc ? denominator : minus_den; + const Coefficient& minus_sc_den = is_sc ? minus_den : denominator; + // NOTE: here, for optimization purposes, `minus_expr' is only assigned + // when `denominator' is negative. Do not use it unless you are sure + // it has been correctly assigned. + Linear_Expression minus_expr; + if (!is_sc) + minus_expr = -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_iter + (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. + div2exp_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. + div2exp_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_den != 1) { + // Before computing quotients, the denominator should be approximated + // towards zero. Since `sc_den' is known to be positive, this amounts to + // rounding downwards, which is achieved as usual by rounding upwards + // `minus_sc_den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(neg_sum, neg_sum, down_sc_den, ROUND_UP); + } + // Add the lower bound constraint, if meaningful. + if (neg_pinf_count == 0) { + // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'. + PPL_DIRTY_TEMP(N, double_neg_sum); + mul2exp_assign_r(double_neg_sum, neg_sum, 1, ROUND_IGNORE); + 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_den, 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_den) + // 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_den) { + // 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; + } + } + } + + assert(OK()); +} + + +template +void +Octagonal_Shape +::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_generic("generalized_affine_preimage(v, r, e, d)", "d == 0"); + + // Dimension-compatibility checks. + // The dimension of `expr' should not be greater than the dimension + // of `*this'. + const dimension_type 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_generic("generalized_affine_preimage(v, r, e, d)", + "r is a strict relation symbol and " + "*this is an Octagonal_Shape"); + + 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_den); + neg_assign(inverse_den, expr_v); + const Relation_Symbol inverse_relsym + = (sgn(denominator) == sgn(inverse_den)) ? relsym : reversed_relsym; + generalized_affine_image(var, inverse_relsym, inverse, inverse_den); + return; + } + + // Here `var_coefficient == 0', so that the preimage cannot + // be easily computed by inverting the affine relation. + // Shrink the 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); + assert(OK()); +} + +template +void +Octagonal_Shape +::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_generic("generalized_affine_preimage(e1, r, e2)", + "r is a strict relation symbol and " + "*this is an Octagonal_Shape"); + + 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 = 0; + + // Compute the number of the non-zero components of `lhs'. + for (dimension_type i = lhs_space_dim; i-- > 0; ) + if (lhs.coefficient(Variable(i)) != 0) { + if (t_lhs++ == 1) + break; + else + j_lhs = i; + } + + const Coefficient& b_lhs = lhs.inhomogeneous_term(); + + // If 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& den = lhs.coefficient(v); + Relation_Symbol new_relsym = relsym; + if (den < 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, den); + } + + else { + // Here `lhs' is of the general form, having at least two variables. + // Compute the set of variables occurring in `lhs'. + bool lhs_vars_intersects_rhs_vars = false; + std::vector lhs_vars; + for (dimension_type i = lhs_space_dim; i-- > 0; ) + if (lhs.coefficient(Variable(i)) != 0) { + lhs_vars.push_back(Variable(i)); + if (rhs.coefficient(Variable(i)) != 0) + lhs_vars_intersects_rhs_vars = true; + } + + if (!lhs_vars_intersects_rhs_vars) { + // `lhs' and `rhs' variables are disjoint. + // 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. + throw std::runtime_error("PPL internal error"); + } + + // 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 = Variable(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(); + 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. + throw std::runtime_error("PPL internal error"); + } + // Remove the temporarily added dimension. + remove_higher_space_dimensions(space_dim-1); + } + } + assert(OK()); +} + +template +void +Octagonal_Shape::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_generic("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)", + "lb", lb_expr); + const dimension_type ub_space_dim = ub_expr.space_dimension(); + if (space_dim < ub_space_dim) + throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub)", + "ub", ub_expr); + + 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 = Variable(space_dim); + add_space_dimensions_and_embed(1); + const Linear_Expression lb_inverse + = lb_expr - (expr_v + denominator)*var; + PPL_DIRTY_TEMP_COEFFICIENT(inverse_den); + neg_assign(inverse_den, expr_v); + affine_image(new_var, lb_inverse, inverse_den); + strong_closure_assign(); + assert(!marked_empty()); + generalized_affine_preimage(var, LESS_OR_EQUAL, + ub_expr, denominator); + if (sgn(denominator) == sgn(inverse_den)) + 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 +Constraint_System +Octagonal_Shape::constraints() const { + Constraint_System cs; + if (space_dim == 0) { + if (marked_empty()) + cs = Constraint_System::zero_dim_empty(); + } + else if (marked_empty()) + cs.insert(0*Variable(space_dim-1) <= -1); + else { + // KLUDGE: in the future `cs' will be constructed of the right dimension. + // For the time being, we force the dimension with the following line. + cs.insert(0*Variable(space_dim-1) <= 0); + + typedef typename OR_Matrix::const_row_iterator Row_Iterator; + typedef typename OR_Matrix::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 ax - ay = 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 ax + ay = 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 +void +Octagonal_Shape::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_generic("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::row_iterator Row_Iterator; + typedef typename OR_Matrix::row_reference_type Row_Reference; + typedef typename OR_Matrix::const_row_iterator Row_iterator; + typedef typename OR_Matrix::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(); + assert(OK()); +} + +template +void +Octagonal_Shape::fold_space_dimensions(const Variables_Set& to_be_folded, + Variable var) { + // `var' should be one of the dimensions of the octagon. + if (var.space_dimension() > space_dim) + throw_dimension_incompatible("fold_space_dimensions(tbf, v)", "v", var); + + // The folding of no dimensions is a no-op. + if (to_be_folded.empty()) + return; + + // All variables in `to_be_folded' should be dimensions of the octagon. + if (to_be_folded.space_dimension() > space_dim) + throw_dimension_incompatible("fold_space_dimensions(tbf, ...)", + to_be_folded.space_dimension()); + + // Moreover, `var.id()' should not occur in `to_be_folded'. + if (to_be_folded.find(var.id()) != to_be_folded.end()) + throw_generic("fold_space_dimensions(tbf, v)", + "v should not occur in tbf"); + + // Recompute the elements of the row and the column corresponding + // to variable `var' by taking the join of their value with the + // value of the corresponding elements in the row and column of the + // variable `to_be_folded'. + typedef typename OR_Matrix::row_iterator Row_Iterator; + typedef typename OR_Matrix::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_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 (Variables_Set::const_iterator i = to_be_folded.begin(), + tbf_end = to_be_folded.end(); i != tbf_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_var+1], m_tbf[tbf_var+1]); + max_assign(m_cv[n_var], m_ctbf[tbf_var]); + + const dimension_type min_id = std::min(n_var, tbf_var); + const dimension_type max_id = std::max(n_var, tbf_var); + + 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_var == min_id) { + max_assign(m_cj[n_var+1], m_tbf[j]); + max_assign(m_cj[n_var], m_ctbf[j]); + max_assign(m_j[n_var], m_ctbf[cj]); + max_assign(m_j[n_var+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_var+1], m_cj[tbf_var+1]); + max_assign(m_cj[n_var], m_cj[tbf_var]); + max_assign(m_j[n_var], m_j[tbf_var]); + max_assign(m_j[n_var+1], m_j[tbf_var+1]); + } + } + remove_space_dimensions(to_be_folded); +} + +template +bool +Octagonal_Shape +::BHZ09_upper_bound_assign_if_exact(const Octagonal_Shape& y) { + // Declare a const reference to *this (to avoid accidental modifications). + const Octagonal_Shape& x = *this; + const dimension_type x_space_dim = x.space_dimension(); + + // Private method: the caller must ensure the following. + 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. + assert(x.marked_strongly_closed()); + assert(y.marked_strongly_closed()); + // Pre-compute the upper bound of `x' and `y'. + Octagonal_Shape ub(x); + ub.upper_bound_assign(y); + + // Compute redundancy information for x and y. + // TODO: provide a nicer data structure for redundancy. + std::vector x_non_red; + x.non_redundant_matrix_entries(x_non_red); + std::vector 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::const_row_iterator Row_Iterator; + typedef typename OR_Matrix::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]; + const dimension_type ci = coherent_index(i); + const dimension_type row_size_i = OR_Matrix::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::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::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. + swap(ub); + assert(OK()); + return true; +} + +/*! \relates Parma_Polyhedra_Library::Octagonal_Shape */ +template +std::ostream& +IO_Operators::operator<<(std::ostream& s, const Octagonal_Shape& x) { + // Handle special cases first. + if (x.marked_empty()) { + s << "false"; + return s; + } + if (x.is_universe()) { + s << "true"; + return s; + } + + typedef typename Octagonal_Shape::coefficient_type N; + typedef typename OR_Matrix::const_row_iterator Row_Iterator; + typedef typename OR_Matrix::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 = x.matrix.row_begin(); + Row_Iterator m_end = x.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 = Variable(i/2); + const N& x_i_ii = (*i_iter)[i+1]; + ++i_iter; + const N& x_ii_i = (*i_iter)[i]; + ++i_iter; + // Check whether or not it is an equality constraint. + if (is_additive_inverse(x_i_ii, x_ii_i)) { + // It is an equality. + assert(!is_plus_infinity(x_i_ii) && !is_plus_infinity(x_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 (div2exp_assign_r(half, x_ii_i, 1, ROUND_UP) == V_EQ) + s << v_i << " == " << half; + else + s << "2*" << v_i << " == " << x_ii_i; + } + else { + // We will print unary non-strict inequalities, if any. + if (!is_plus_infinity(x_i_ii)) { + if (first) + first = false; + else + s << ", "; + neg_assign_r(negation, x_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 (div2exp_assign_r(half, negation, 1, ROUND_UP) == V_EQ) + s << v_i << " >= " << half; + else + s << "2*" << v_i << " >= " << negation; + } + if (!is_plus_infinity(x_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 (div2exp_assign_r(half, x_ii_i, 1, ROUND_UP) == V_EQ) + s << v_i << " <= " << half; + else + s << "2*" << v_i << " <= " << x_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 = Variable(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 = Variable(j/2); + // Print binary differences. + const N& x_ii_jj = r_ii[j+1]; + const N& x_i_j = r_i[j]; + // Check whether or not it is an equality constraint. + if (is_additive_inverse(x_ii_jj, x_i_j)) { + // It is an equality. + assert(!is_plus_infinity(x_i_j) && !is_plus_infinity(x_ii_jj)); + if (first) + first = false; + else + s << ", "; + if (sgn(x_i_j) >= 0) + s << v_j << " - " << v_i << " == " << x_i_j; + else + s << v_i << " - " << v_j << " == " << x_ii_jj; + } + else { + // We will print non-strict inequalities, if any. + if (!is_plus_infinity(x_i_j)) { + if (first) + first = false; + else + s << ", "; + if (sgn(x_i_j) >= 0) + s << v_j << " - " << v_i << " <= " << x_i_j; + else { + neg_assign_r(negation, x_i_j, ROUND_DOWN); + s << v_i << " - " << v_j << " >= " << negation; + } + } + if (!is_plus_infinity(x_ii_jj)) { + if (first) + first = false; + else + s << ", "; + if (sgn(x_ii_jj) >= 0) + s << v_i << " - " << v_j << " <= " << x_ii_jj; + else { + neg_assign_r(negation, x_ii_jj, ROUND_DOWN); + s << v_j << " - " << v_i << " >= " << negation; + } + } + } + // Print binary sums. + const N& x_i_jj = r_i[j+1]; + const N& x_ii_j = r_ii[j]; + // Check whether or not it is an equality constraint. + if (is_additive_inverse(x_i_jj, x_ii_j)) { + // It is an equality. + assert(!is_plus_infinity(x_i_jj) && !is_plus_infinity(x_ii_j)); + if (first) + first = false; + else + s << ", "; + s << v_j << " + " << v_i << " == " << x_ii_j; + } + else { + // We will print non-strict inequalities, if any. + if (!is_plus_infinity(x_i_jj)) { + if (first) + first = false; + else + s << ", "; + neg_assign_r(negation, x_i_jj, ROUND_DOWN); + s << v_j << " + " << v_i << " >= " << negation; + } + if (!is_plus_infinity(x_ii_j)) { + if (first) + first = false; + else + s << ", "; + s << v_j << " + " << v_i << " <= " << x_ii_j; + } + } + } + } + return s; +} + +template +void +Octagonal_Shape::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) + +template +bool +Octagonal_Shape::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; + + assert(OK()); + return true; +} + +template +memory_size_type +Octagonal_Shape::external_memory_in_bytes() const { + return matrix.external_memory_in_bytes(); +} + +template +bool +Octagonal_Shape::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::const_row_iterator i = matrix.row_begin(), + matrix_row_end = matrix.row_end(); i != matrix_row_end; ++i) { + typename OR_Matrix::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::const_row_iterator i = matrix.row_begin(), + m_end = matrix.row_end(); i != m_end; ++i) { + typename OR_Matrix::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::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 +void +Octagonal_Shape +::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 +void +Octagonal_Shape +::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 +void +Octagonal_Shape::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 +void +Octagonal_Shape::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 +void +Octagonal_Shape::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 +void +Octagonal_Shape::throw_constraint_incompatible(const char* method) const { + std::ostringstream s; + s << "PPL::Octagonal_Shape::" << method << ":\n" + << "the constraint is incompatible."; + throw std::invalid_argument(s.str()); +} + +template +void +Octagonal_Shape +::throw_expression_too_complex(const char* method, + const Linear_Expression& e) const { + using namespace IO_Operators; + std::ostringstream s; + s << "PPL::Octagonal_Shape::" << method << ":\n" + << e << " is too complex."; + throw std::invalid_argument(s.str()); +} + +template +void +Octagonal_Shape +::throw_dimension_incompatible(const char* method, + const char* name_row, + const Linear_Expression& y) const { + std::ostringstream s; + s << "PPL::Octagonal_Shape::" << method << ":\n" + << "this->space_dimension() == " << space_dimension() + << ", " << name_row << "->space_dimension() == " + << y.space_dimension() << "."; + throw std::invalid_argument(s.str()); +} + + +template +void +Octagonal_Shape::throw_generic(const char* method, + const char* reason) const { + 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 2015. */ + +/* Automatically generated from PPL source file ../src/BD_Shape.inlines.hh line 34. */ +#include +#include +#include +#include + +namespace Parma_Polyhedra_Library { + +template +inline dimension_type +BD_Shape::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::max_num_rows() - 1, + DB_Matrix::max_num_columns() - 1); +} + +template +inline bool +BD_Shape::marked_zero_dim_univ() const { + return status.test_zero_dim_univ(); +} + +template +inline bool +BD_Shape::marked_empty() const { + return status.test_empty(); +} + +template +inline bool +BD_Shape::marked_shortest_path_closed() const { + return status.test_shortest_path_closed(); +} + +template +inline bool +BD_Shape::marked_shortest_path_reduced() const { + return status.test_shortest_path_reduced(); +} + +template +inline void +BD_Shape::set_zero_dim_univ() { + status.set_zero_dim_univ(); +} + +template +inline void +BD_Shape::set_empty() { + status.set_empty(); +} + +template +inline void +BD_Shape::set_shortest_path_closed() { + status.set_shortest_path_closed(); +} + +template +inline void +BD_Shape::set_shortest_path_reduced() { + status.set_shortest_path_reduced(); +} + +template +inline void +BD_Shape::reset_shortest_path_closed() { + status.reset_shortest_path_closed(); +} + +template +inline void +BD_Shape::reset_shortest_path_reduced() { + status.reset_shortest_path_reduced(); +} + +template +inline +BD_Shape::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(); + } + assert(OK()); +} + +template +inline +BD_Shape::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 +template +inline +BD_Shape::BD_Shape(const BD_Shape& 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 +inline Congruence_System +BD_Shape::congruences() const { + return minimized_congruences(); +} + +template +inline bool +BD_Shape::add_constraint_and_minimize(const Constraint& c) { + add_constraint(c); + shortest_path_closure_assign(); + return !marked_empty(); +} + +template +inline bool +BD_Shape::add_congruence_and_minimize(const Congruence& cg) { + add_congruence(cg); + shortest_path_closure_assign(); + return !marked_empty(); +} + +template +inline void +BD_Shape::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 +inline bool +BD_Shape::add_constraints_and_minimize(const Constraint_System& cs) { + add_constraints(cs); + shortest_path_closure_assign(); + return !marked_empty(); +} + +template +inline void +BD_Shape::add_recycled_constraints(Constraint_System& cs) { + add_constraints(cs); +} + +template +inline bool +BD_Shape::add_recycled_constraints_and_minimize(Constraint_System& cs) { + return add_constraints_and_minimize(cs); +} + +template +inline void +BD_Shape::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 +inline bool +BD_Shape::add_congruences_and_minimize(const Congruence_System& cgs) { + add_congruences(cgs); + return !is_empty(); +} + +template +inline void +BD_Shape::add_recycled_congruences(Congruence_System& cgs) { + add_congruences(cgs); +} + +template +inline bool +BD_Shape::add_recycled_congruences_and_minimize(Congruence_System& cgs) { + return add_congruences_and_minimize(cgs); +} + +template +inline void +BD_Shape::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 +inline void +BD_Shape::refine_with_constraints(const Constraint_System& cs) { + // Dimension-compatibility check. + if (cs.space_dimension() > space_dimension()) + throw_generic("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 +inline void +BD_Shape::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 +void +BD_Shape::refine_with_congruences(const Congruence_System& cgs) { + // Dimension-compatibility check. + if (cgs.space_dimension() > space_dimension()) + throw_generic("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 +inline void +BD_Shape::refine_no_check(const Congruence& cg) { + assert(!marked_empty()); + assert(cg.space_dimension() <= space_dimension()); + + if (cg.is_proper_congruence()) { + if (cg.is_inconsistent()) + set_empty(); + // Other proper congruences are just ignored. + return; + } + + assert(cg.is_equality()); + Constraint c(cg); + refine_no_check(c); +} + +template +inline bool +BD_Shape::can_recycle_constraint_systems() { + return false; +} + + +template +inline bool +BD_Shape::can_recycle_congruence_systems() { + return false; +} + +template +inline +BD_Shape::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 +template +inline +BD_Shape::BD_Shape(const Box& box, + Complexity_Class) + : dbm(box.space_dimension() + 1), status(), redundancy_dbm() { + // Check for emptyness 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 +inline +BD_Shape::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 +template +inline +BD_Shape::BD_Shape(const Octagonal_Shape& os, + Complexity_Class) + : dbm(os.space_dimension() + 1), status(), redundancy_dbm() { + // Check for emptyness 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 +inline BD_Shape& +BD_Shape::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 +inline +BD_Shape::~BD_Shape() { +} + +template +inline void +BD_Shape::swap(BD_Shape& y) { + std::swap(dbm, y.dbm); + std::swap(status, y.status); + std::swap(redundancy_dbm, y.redundancy_dbm); +} + +template +inline dimension_type +BD_Shape::space_dimension() const { + return dbm.num_rows() - 1; +} + +template +inline bool +BD_Shape::is_empty() const { + shortest_path_closure_assign(); + return marked_empty(); +} + +template +inline bool +BD_Shape::bounds_from_above(const Linear_Expression& expr) const { + return bounds(expr, true); +} + +template +inline bool +BD_Shape::bounds_from_below(const Linear_Expression& expr) const { + return bounds(expr, false); +} + +template +inline bool +BD_Shape::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 +inline bool +BD_Shape::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 +inline bool +BD_Shape::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 +inline bool +BD_Shape::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 +inline bool +BD_Shape::is_topologically_closed() const { + return true; +} + +template +inline bool +BD_Shape::is_discrete() const { + return affine_dimension() == 0; +} + +template +inline void +BD_Shape::topological_closure_assign() { + // Nothing to be done. + return; +} + +/*! \relates BD_Shape */ +template +inline bool +operator==(const BD_Shape& x, const BD_Shape& 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 +inline bool +operator!=(const BD_Shape& x, const BD_Shape& y) { + return !(x == y); +} + +/*! \relates BD_Shape */ +template +inline bool +rectilinear_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& 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 +inline bool +rectilinear_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& y, + const Rounding_Dir dir) { + typedef Checked_Number 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 +inline bool +rectilinear_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& y, + const Rounding_Dir dir) { + return rectilinear_distance_assign(r, x, y, dir); +} + +/*! \relates BD_Shape */ +template +inline bool +euclidean_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& 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 +inline bool +euclidean_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& y, + const Rounding_Dir dir) { + typedef Checked_Number 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 +inline bool +euclidean_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& y, + const Rounding_Dir dir) { + return euclidean_distance_assign(r, x, y, dir); +} + +/*! \relates BD_Shape */ +template +inline bool +l_infinity_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& 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 +inline bool +l_infinity_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& y, + const Rounding_Dir dir) { + typedef Checked_Number 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 +inline bool +l_infinity_distance_assign(Checked_Number& r, + const BD_Shape& x, + const BD_Shape& y, + const Rounding_Dir dir) { + return l_infinity_distance_assign(r, x, y, dir); +} + +template +inline void +BD_Shape::add_dbm_constraint(const dimension_type i, + const dimension_type j, + const N& k) { + // Private method: the caller has to ensure the following. + assert(i <= space_dimension() && j <= space_dimension() && i != j); + N& dbm_ij = dbm[i][j]; + if (dbm_ij > k) { + dbm_ij = k; + if (marked_shortest_path_closed()) + reset_shortest_path_closed(); + } +} + +template +inline void +BD_Shape::add_dbm_constraint(const dimension_type i, + const dimension_type j, + Coefficient_traits::const_reference num, + Coefficient_traits::const_reference den) { + // Private method: the caller has to ensure the following. + assert(i <= space_dimension() && j <= space_dimension() && i != j); + assert(den != 0); + PPL_DIRTY_TEMP(N, k); + div_round_up(k, num, den); + add_dbm_constraint(i, j, k); +} + +template +inline void +BD_Shape::time_elapse_assign(const BD_Shape& y) { + // Dimension-compatibility check. + if (space_dimension() != y.space_dimension()) + throw_dimension_incompatible("time_elapse_assign(y)", y); + // See the polyhedra documentation. + C_Polyhedron px(constraints()); + C_Polyhedron py(y.constraints()); + px.time_elapse_assign(py); + BD_Shape x(px); + swap(x); + assert(OK()); +} + +template +inline bool +BD_Shape::strictly_contains(const BD_Shape& y) const { + const BD_Shape& x = *this; + return x.contains(y) && !y.contains(x); +} + +template +inline bool +BD_Shape::upper_bound_assign_and_minimize(const BD_Shape& y) { + upper_bound_assign(y); + assert(marked_empty() + || space_dimension() == 0 || marked_shortest_path_closed()); + return !marked_empty(); +} + +template +inline bool +BD_Shape::upper_bound_assign_if_exact(const BD_Shape& y) { + // Dimension-compatibility check. + 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 + return BHZ09_upper_bound_assign_if_exact(y); +#endif +} + +template +inline void +BD_Shape::remove_higher_space_dimensions(const dimension_type new_dim) { + // Dimension-compatibility check: the variable having + // maximum index is the one occurring last in the set. + if (new_dim > space_dimension()) + throw_dimension_incompatible("remove_higher_space_dimensions(nd)", + new_dim); + + // The removal of no dimensions from any BDS is a no-op. + // Note that this case also captures the only legal removal of + // dimensions from a zero-dim space BDS. + if (new_dim == space_dimension()) { + assert(OK()); + return; + } + + // Shortest-path closure is necessary as in remove_space_dimensions(). + shortest_path_closure_assign(); + dbm.resize_no_copy(new_dim + 1); + + // Shortest-path closure is maintained. + // TODO: see whether or not reduction can be (efficiently!) maintained too. + if (marked_shortest_path_reduced()) + reset_shortest_path_reduced(); + + // If we removed _all_ dimensions from a non-empty BDS, + // the zero-dim universe BDS has been obtained. + if (new_dim == 0 && !marked_empty()) + set_zero_dim_univ(); + assert(OK()); +} + +template +inline bool +BD_Shape::intersection_assign_and_minimize(const BD_Shape& y) { + intersection_assign(y); + shortest_path_closure_assign(); + return !marked_empty(); +} + +template +inline void +BD_Shape::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 +inline void +BD_Shape::H79_widening_assign(const BD_Shape& y, unsigned* tp) { + // See the documentation for polyhedra. + C_Polyhedron px(constraints()); + C_Polyhedron py(y.constraints()); + px.H79_widening_assign(py, tp); + BD_Shape x(px); + swap(x); + assert(OK()); +} + +template +inline void +BD_Shape::widening_assign(const BD_Shape& y, unsigned* tp) { + H79_widening_assign(y, tp); +} + +template +inline void +BD_Shape::limited_H79_extrapolation_assign(const BD_Shape& y, + const Constraint_System& cs, + unsigned* tp) { + // See the documentation for polyhedra. + C_Polyhedron px(constraints()); + C_Polyhedron py(y.constraints()); + px.limited_H79_extrapolation_assign(py, cs, tp); + BD_Shape x(px); + swap(x); + assert(OK()); +} + +template +inline memory_size_type +BD_Shape::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +template +inline int32_t +BD_Shape::hash_code() const { + return space_dimension() & 0x7fffffff; +} + +} // namespace Parma_Polyhedra_Library + +namespace std { + +/*! \relates Parma_Polyhedra_Library::BD_Shape */ +template +inline void +swap(Parma_Polyhedra_Library::BD_Shape& x, + Parma_Polyhedra_Library::BD_Shape& y) { + x.swap(y); +} + +} // namespace std + +/* Automatically generated from PPL source file ../src/BD_Shape.templates.hh line 1. */ +/* BD_Shape class implementation: non-inline template functions. +*/ + + +/* Automatically generated from PPL source file ../src/BD_Shape.templates.hh line 36. */ +#include +#include +#include +#include +#include +#include +#include + +namespace Parma_Polyhedra_Library { + +template +BD_Shape::BD_Shape(const Congruence_System& cgs) + : dbm(cgs.space_dimension() + 1), + status(), + redundancy_dbm() { + add_congruences(cgs); +} + +template +BD_Shape::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 polyhedron. + set_empty(); + return; + } + + const dimension_type space_dim = space_dimension(); + DB_Row& 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(); + for (dimension_type i = space_dim; i > 0; --i) { + const Coefficient& g_i = g.coefficient(Variable(i-1)); + DB_Row& dbm_i = dbm[i]; + for (dimension_type j = space_dim; j > 0; --j) + if (i != j) + div_round_up(dbm_i[j], g.coefficient(Variable(j-1)) - g_i, d); + div_round_up(dbm_i[0], -g_i, d); + } + for (dimension_type j = space_dim; j > 0; --j) + div_round_up(dbm_0[j], g.coefficient(Variable(j-1)), d); + // Note: no need to initialize the first element of the main diagonal. + } + else { + // This is not the first point: the DBM already contains + // valid values and we must compute maxima. + const Coefficient& d = g.divisor(); + for (dimension_type i = space_dim; i > 0; --i) { + const Coefficient& g_i = g.coefficient(Variable(i-1)); + DB_Row& dbm_i = dbm[i]; + // The loop correctly handles the case when i == j. + for (dimension_type j = space_dim; j > 0; --j) { + div_round_up(tmp, g.coefficient(Variable(j-1)) - g_i, d); + max_assign(dbm_i[j], tmp); + } + div_round_up(tmp, -g_i, d); + max_assign(dbm_i[0], tmp); + } + for (dimension_type j = space_dim; j > 0; --j) { + div_round_up(tmp, g.coefficient(Variable(j-1)), d); + max_assign(dbm_0[j], tmp); + } + } + break; + default: + // Lines and rays temporarily ignored. + break; + } + } + + if (!point_seen) + // The generator system is not empty, but contains no points. + throw_generic("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: + for (dimension_type i = space_dim; i > 0; --i) { + const Coefficient& g_i = g.coefficient(Variable(i-1)); + DB_Row& dbm_i = dbm[i]; + // The loop correctly handles the case when i == j. + for (dimension_type j = space_dim; j > 0; --j) + if (g_i != g.coefficient(Variable(j-1))) + 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 (dimension_type j = space_dim; j > 0; --j) + if (g.coefficient(Variable(j-1)) != 0) + assign_r(dbm_0[j], PLUS_INFINITY, ROUND_NOT_NEEDED); + break; + case Generator::RAY: + for (dimension_type i = space_dim; i > 0; --i) { + const Coefficient& g_i = g.coefficient(Variable(i-1)); + DB_Row& dbm_i = dbm[i]; + // The loop correctly handles the case when i == j. + for (dimension_type j = space_dim; j > 0; --j) + if (g_i < g.coefficient(Variable(j-1))) + 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 (dimension_type j = space_dim; j > 0; --j) + if (g.coefficient(Variable(j-1)) > 0) + assign_r(dbm_0[j], PLUS_INFINITY, ROUND_NOT_NEEDED); + break; + default: + // Points and closure points already dealt with. + break; + } + } + set_shortest_path_closed(); + assert(OK()); +} + +template +BD_Shape::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(num_dimensions, EMPTY); + return; + } + + if (num_dimensions == 0) { + *this = BD_Shape(num_dimensions, UNIVERSE); + return; + } + + // Build from generators when we do not care about complexity + // or when the process has polynomial complexity. + if (complexity == ANY_COMPLEXITY + || (!ph.has_pending_constraints() && ph.generators_are_up_to_date())) { + *this = BD_Shape(ph.generators()); + return; + } + + // We cannot afford exponential complexity, we do not have a complete set + // of generators for the polyhedron, and the polyhedron is not trivially + // empty or zero-dimensional. Constraints, however, are up to date. + assert(ph.constraints_are_up_to_date()); + + if (!ph.has_something_pending() && ph.constraints_are_minimized()) { + // If the constraint system of the polyhedron is minimized, + // the test `is_universe()' has polynomial complexity. + if (ph.is_universe()) { + *this = BD_Shape(num_dimensions, UNIVERSE); + return; + } + } + + // See if there is at least one inconsistent constraint in `ph.con_sys'. + for (Constraint_System::const_iterator i = ph.con_sys.begin(), + cs_end = ph.con_sys.end(); i != cs_end; ++i) + if (i->is_inconsistent()) { + *this = BD_Shape(num_dimensions, EMPTY); + return; + } + + // If `complexity' allows it, use simplex to derive the exact (modulo + // the fact that our BDSs are topologically closed) variable bounds. + if (complexity == SIMPLEX_COMPLEXITY) { + 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()) + lp.add_constraint(Linear_Expression(c) >= 0); + else + lp.add_constraint(c); + } + + // Check for unsatisfiability. + if (!lp.is_satisfiable()) { + *this = BD_Shape(num_dimensions, EMPTY); + return; + } + + // Start with a universe BDS that will be refined by the simplex. + *this = BD_Shape(num_dimensions, UNIVERSE); + // Get all the upper bounds. + Generator g(point()); + PPL_DIRTY_TEMP_COEFFICIENT(num); + PPL_DIRTY_TEMP_COEFFICIENT(den); + for (dimension_type i = 1; i <= num_dimensions; ++i) { + Variable x(i-1); + // Evaluate optimal upper bound for `x <= ub'. + lp.set_objective_function(x); + if (lp.solve() == OPTIMIZED_MIP_PROBLEM) { + g = lp.optimizing_point(); + lp.evaluate_objective_function(g, num, den); + div_round_up(dbm[0][i], num, den); + } + // Evaluate optimal upper bound for `x - y <= ub'. + for (dimension_type j = 1; j <= num_dimensions; ++j) { + if (i == j) + continue; + Variable y(j-1); + lp.set_objective_function(x - y); + if (lp.solve() == OPTIMIZED_MIP_PROBLEM) { + g = lp.optimizing_point(); + lp.evaluate_objective_function(g, num, den); + div_round_up(dbm[j][i], num, den); + } + } + // Evaluate optimal upper bound for `-x <= ub'. + lp.set_objective_function(-x); + if (lp.solve() == OPTIMIZED_MIP_PROBLEM) { + g = lp.optimizing_point(); + lp.evaluate_objective_function(g, num, den); + div_round_up(dbm[i][0], num, den); + } + } + set_shortest_path_closed(); + assert(OK()); + return; + } + + // Extract easy-to-find bounds from constraints. + assert(complexity == POLYNOMIAL_COMPLEXITY); + *this = BD_Shape(num_dimensions, UNIVERSE); + refine_with_constraints(ph.constraints()); +} + +template +dimension_type +BD_Shape::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 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 +Congruence_System +BD_Shape::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; + if (space_dim == 0) { + if (marked_empty()) + cgs = Congruence_System::zero_dim_empty(); + } + else if (marked_empty()) + cgs.insert((0*Variable(space_dim-1) %= 1) / 0); + else { + // KLUDGE: in the future `cgs' will be constructed of the right dimension. + // For the time being, we force the dimension with the following line. + cgs.insert(0*Variable(space_dim-1) == 0); + + PPL_DIRTY_TEMP_COEFFICIENT(num); + PPL_DIRTY_TEMP_COEFFICIENT(den); + + // Compute leader information. + std::vector leaders; + compute_leaders(leaders); + + // Go through the non-leaders to generate equality constraints. + const DB_Row& dbm_0 = dbm[0]; + for (dimension_type i = 1; i <= space_dim; ++i) { + const dimension_type leader = leaders[i]; + if (i != leader) { + // Generate the constraint relating `i' and its leader. + if (leader == 0) { + // A unary equality has to be generated. + assert(!is_plus_infinity(dbm_0[i])); + numer_denom(dbm_0[i], num, den); + cgs.insert(den*Variable(i-1) == num); + } + else { + // A binary equality has to be generated. + assert(!is_plus_infinity(dbm[i][leader])); + numer_denom(dbm[i][leader], num, den); + cgs.insert(den*Variable(leader-1) - den*Variable(i-1) == num); + } + } + } + } + return cgs; +} + +template +void +BD_Shape::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); + + // 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_generic("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 (!extract_bounded_difference(c, c_space_dim, num_vars, i, j, coeff)) + throw_generic("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); + 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(); + assert(OK()); +} + +template +void +BD_Shape::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_generic("add_congruence(cg)", + "cg is a non-trivial, proper congruence"); + } + + assert(cg.is_equality()); + Constraint c(cg); + add_constraint(c); +} + +template +void +BD_Shape::refine_no_check(const Constraint& c) { + assert(!marked_empty()); + const dimension_type c_space_dim = c.space_dimension(); + assert(c_space_dim <= 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 (!extract_bounded_difference(c, c_space_dim, 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(); + assert(OK()); +} + +template +void +BD_Shape::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); + 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& 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(); + assert(OK()); +} + +template +bool +BD_Shape::contains(const BD_Shape& y) const { + const BD_Shape& x = *this; + const dimension_type x_space_dim = x.space_dimension(); + + // Dimension-compatibility check. + if (x_space_dim != y.space_dimension()) + throw_dimension_incompatible("contains(y)", y); + + // The zero-dimensional universe shape contains any other + // dimension-compatible shape. + // The zero-dimensional empty shape only contains another + // zero-dimensional empty shape. + if (x_space_dim == 0) { + if (!marked_empty()) + return true; + else + return y.marked_empty(); + } + + /* + The `y' bounded difference shape need be closed. + In fact if, for example, in `*this' we have the constraints: + + x1 - x2 <= 1; + x1 <= 3; + x2 <= 2; + + in `y' the constraints are: + + x1 - x2 <= 0; + x2 <= 1; + + without closure it returns "false", instead if we close `y' we have + the implicit constraint + + x1 <= 1; + + and so we obtain the right result "true". + */ + y.shortest_path_closure_assign(); + + // An empty shape is contained in any other dimension-compatible shapes. + if (y.marked_empty()) + return true; + + // `*this' contains `y' if and only if every cell of `dbm' + // is greater than or equal to the correspondent one of `y.dbm'. + for (dimension_type i = x_space_dim + 1; i-- > 0; ) { + const DB_Row& x_dbm_i = x.dbm[i]; + const DB_Row& 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 +bool +BD_Shape::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& 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 +bool +BD_Shape::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& 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 +bool +BD_Shape::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& 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 +bool +BD_Shape::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::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 bds_z(space_dim); + typedef BD_Shape::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_i = bds_z.dbm[i]; + const DB_Row& 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 +bool +BD_Shape::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_dimension() < var_space_dim) + throw_dimension_incompatible("constrains(v)", "v", var); + + // A polyhedron 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& 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 +void +BD_Shape +::compute_predecessors(std::vector& predecessor) const { + assert(!marked_empty() && marked_shortest_path_closed()); + assert(predecessor.size() == 0); + // Variables are ordered according to their index. + // The vector `predecessor' is used to indicate which variable + // immediately precedes a given one in the corresponding equivalence class. + // The `leader' of an equivalence class is the element having minimum + // index: leaders are their own predecessors. + const dimension_type pred_size = dbm.num_rows(); + // Initially, each variable is leader of its own zero-equivalence class. + predecessor.reserve(pred_size); + for (dimension_type i = 0; i < pred_size; ++i) + predecessor.push_back(i); + // Now compute actual predecessors. + for (dimension_type i = pred_size; i-- > 1; ) + if (i == predecessor[i]) { + const DB_Row& 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 +void +BD_Shape::compute_leaders(std::vector& leaders) const { + assert(!marked_empty() && marked_shortest_path_closed()); + assert(leaders.size() == 0); + // Compute predecessor information. + compute_predecessors(leaders); + // Flatten the predecessor chains so as to obtain leaders. + assert(leaders[0] == 0); + for (dimension_type i = 1, l_size = leaders.size(); i != l_size; ++i) { + const dimension_type l_i = leaders[i]; + assert(l_i <= i); + if (l_i != i) { + const dimension_type ll_i = leaders[l_i]; + assert(ll_i == leaders[ll_i]); + leaders[i] = ll_i; + } + } +} + +template +bool +BD_Shape::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 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& 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& x_k = x_copy.dbm[k]; + for (dimension_type i = 0; i <= space_dim; ++i) + if (leader[i] == i) { + const DB_Row& 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 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 no-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 ld_i = leader[i]; + // Case a: leader. + if (ld_i == i) { + for (dimension_type j = 0; j <= space_dim; ++j) { + dimension_type ld_j = leader[j]; + // Only the connectedness with equivalent variables + // is considered. + if (j != ld_j) + if (!redundancy_dbm[i][j]) { + if (t == 1) + // Two no-leaders couldn't connected with the same leader. + return false; + else + if (ld_j != i) + // The variables isn't in the same equivalence class. + return false; + else { + ++t; + var_conn[i] = j; + } + } + } + } + // Case b: no-leader. + else { + for (dimension_type j = 0; j <= space_dim; ++j) { + if (!redundancy_dbm[i][j]) { + dimension_type ld_j = leader[j]; + if (ld_i != ld_j) + // The variables isn't in the same equivalence class. + return false; + else { + if (t == 1) + // Two variables couldn't connected with the same leader. + return false; + else { + ++t; + var_conn[i] = j; + } + } + // A no-leader must be connected with + // another variable. + if (t == 0) + return false; + } + } + } + } + + // The vector `just_checked' is used to check if + // a variable is already checked. + std::vector 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) { + bool jc_i = just_checked[i]; + // We do not re-check the already considered single cycles. + if (!jc_i) { + dimension_type v_con = var_conn[i]; + // We consider only the equivalence classes with + // 2 or plus variables. + if (v_con != 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 +bool +BD_Shape::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; + const dimension_type c_space_dim = c.space_dimension(); + 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 (extract_bounded_difference(c, c_space_dim, 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 +bool +BD_Shape::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; + const dimension_type c_space_dim = c.space_dimension(); + 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 (!extract_bounded_difference(c, c_space_dim, 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); + const Coefficient& coeff_i = expr.coefficient(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 +bool +BD_Shape::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 +Poly_Con_Relation +BD_Shape::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 the congruence is a bounded difference equality, + // find the relation with the equivalent equality constraint. + if (cg.is_equality()) { + Constraint c(cg); + dimension_type num_vars = 0; + dimension_type i = 0; + dimension_type j = 0; + PPL_DIRTY_TEMP_COEFFICIENT(coeff); + if (extract_bounded_difference(c, cg_space_dim, num_vars, + i, j, coeff)) + 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 if (cg.inhomogeneous_term() % cg.modulus() == 0) + return Poly_Con_Relation::saturates() + && Poly_Con_Relation::is_included(); + } + + PPL_DIRTY_TEMP(Coefficient, min_num); + PPL_DIRTY_TEMP(Coefficient, min_den); + bool min_included; + PPL_DIRTY_TEMP_COEFFICIENT(mod); + mod = cg.modulus(); + Linear_Expression le; + for (dimension_type i = cg_space_dim; i-- > 0; ) + le += cg.coefficient(Variable(i)) * Variable(i); + bool bounded_below = minimize(le, min_num, min_den, min_included); + + if (!bounded_below) + return Poly_Con_Relation::strictly_intersects(); + + PPL_DIRTY_TEMP_COEFFICIENT(v); + PPL_DIRTY_TEMP_COEFFICIENT(lower_num); + PPL_DIRTY_TEMP_COEFFICIENT(lower_den); + PPL_DIRTY_TEMP_COEFFICIENT(lower); + assign_r(lower_num, min_num, ROUND_NOT_NEEDED); + assign_r(lower_den, min_den, ROUND_NOT_NEEDED); + neg_assign(v, cg.inhomogeneous_term()); + lower = lower_num / lower_den; + v += ((lower / mod) * mod); + if (v * lower_den < lower_num) + v += mod; + const Constraint& c(le == v); + return relation_with(c); +} + + +template +Poly_Con_Relation +BD_Shape::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 (!extract_bounded_difference(c, c_space_dim, 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; + for (dimension_type k = c_space_dim; k-- > 0; ) { + Variable vk(k); + le += c.coefficient(vk) * vk; + } + PPL_DIRTY_TEMP(Coefficient, max_num); + PPL_DIRTY_TEMP(Coefficient, max_den); + bool max_included; + PPL_DIRTY_TEMP(Coefficient, min_num); + PPL_DIRTY_TEMP(Coefficient, min_den); + bool min_included; + bool bounded_above = maximize(le, max_num, max_den, max_included); + bool bounded_below = minimize(le, min_num, min_den, min_included); + if (!bounded_above) { + if (!bounded_below) + return Poly_Con_Relation::strictly_intersects(); + min_num += c.inhomogeneous_term() * min_den; + switch (sgn(min_num)) { + 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_num += c.inhomogeneous_term() * max_den; + switch (sgn(max_num)) { + 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_num += c.inhomogeneous_term() * max_den; + min_num += c.inhomogeneous_term() * min_den; + switch (sgn(max_num)) { + case 1: + switch (sgn(min_num)) { + 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(); + } + case 0: + if (min_num == 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 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_den, denom, ROUND_NOT_NEEDED); + assign_r(q_y, numer, ROUND_NOT_NEEDED); + div_assign_r(q_y, q_y, q_den, 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_den, denom, ROUND_NOT_NEEDED); + assign_r(q_x, numer, ROUND_NOT_NEEDED); + div_assign_r(q_x, q_x, q_den, ROUND_NOT_NEEDED); + + if (!is_plus_infinity(y)) { + numer_denom(y, numer, denom); + assign_r(q_den, denom, ROUND_NOT_NEEDED); + assign_r(q_y, numer, ROUND_NOT_NEEDED); + div_assign_r(q_y, q_y, q_den, 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 +Poly_Gen_Relation +BD_Shape::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(num); + PPL_DIRTY_TEMP_COEFFICIENT(den); + PPL_DIRTY_TEMP_COEFFICIENT(product); + // We find in `*this' all the constraints. + 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& 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: den*x - den*y = num. + // Compute the scalar product. + numer_denom(dbm_ij, num, den); + product = 0; + add_mul_assign(product, den, g_coeff_y); + add_mul_assign(product, -den, g_coeff_x); + if (!is_line_or_ray) + add_mul_assign(product, num, 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: den*x - den*y <= num. + // Compute the scalar product. + numer_denom(dbm_ij, num, den); + product = 0; + add_mul_assign(product, den, g_coeff_y); + add_mul_assign(product, -den, g_coeff_x); + if (!is_line_or_ray) + add_mul_assign(product, num, 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: den*y - den*x <= b. + // Compute the scalar product. + numer_denom(dbm_ji, num, den); + product = 0; + add_mul_assign(product, den, g_coeff_x); + add_mul_assign(product, -den, g_coeff_y); + if (!is_line_or_ray) + add_mul_assign(product, num, 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 +void +BD_Shape::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&>(*this); + + // Fill the main diagonal with zeros. + for (dimension_type h = num_dimensions + 1; h-- > 0; ) { + assert(is_plus_infinity(x.dbm[h][h])); + assign_r(x.dbm[h][h], 0, ROUND_NOT_NEEDED); + } + + PPL_DIRTY_TEMP(N, sum); + for (dimension_type k = num_dimensions + 1; k-- > 0; ) { + const DB_Row& x_dbm_k = x.dbm[k]; + for (dimension_type i = num_dimensions + 1; i-- > 0; ) { + DB_Row& 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 { + 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 +void +BD_Shape::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(); + 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(*this); + + // Fill the main diagonal with zeros. + for (dimension_type h = num_dimensions + 1; h-- > 0; ) { + assert(is_plus_infinity(x.dbm[h][h])); + assign_r(x.dbm[h][h], 0, ROUND_NOT_NEEDED); + } + + // Using the incremental Floyd-Warshall algorithm. + PPL_DIRTY_TEMP(N, sum); + const dimension_type v = var.id() + 1; + DB_Row& x_v = x.dbm[v]; + // Step 1: Improve all constraints on variable `var'. + for (dimension_type k = num_dimensions + 1; k-- > 0; ) { + DB_Row& 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& 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& 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& 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 { + 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 +void +BD_Shape::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 predecessor; + compute_predecessors(predecessor); + std::vector 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& 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 dealt_with(space_dim + 1, false); + for (dimension_type i = space_dim + 1; i-- > 0; ) + // We only need to deal with non-singleton zero-equivalence classes + // that haven't already been dealt with. + if (i != predecessor[i] && !dealt_with[i]) { + dimension_type j = i; + while (true) { + const dimension_type pred_j = predecessor[j]; + if (j == pred_j) { + // We finally found the leader of `i'. + assert(redundancy[i][j]); + redundancy[i].clear(j); + // Here we dealt with `j' (i.e., `pred_j'), but it is useless + // to update `dealt_with' because `j' is a leader. + break; + } + // We haven't found the leader of `i' yet. + assert(redundancy[pred_j][j]); + redundancy[pred_j].clear(j); + dealt_with[pred_j] = true; + j = pred_j; + } + } + + // Even though shortest-path reduction is not going to change the BDS, + // it might change its internal representation. + BD_Shape& x = const_cast&>(*this); + std::swap(x.redundancy_dbm, redundancy); + x.set_shortest_path_reduced(); + + assert(is_shortest_path_reduced()); +} + +template +void +BD_Shape::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 poly-hull of a polyhedron `bd' with an empty polyhedron is `bd'. + y.shortest_path_closure_assign(); + if (y.marked_empty()) + return; + shortest_path_closure_assign(); + if (marked_empty()) { + *this = y; + return; + } + + // The bds-hull consists in constructing `*this' with the maximum + // elements selected from `*this' and `y'. + assert(space_dim == 0 || marked_shortest_path_closed()); + for (dimension_type i = space_dim + 1; i-- > 0; ) { + DB_Row& dbm_i = dbm[i]; + const DB_Row& 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(); + assert(OK()); +} + +template +bool +BD_Shape::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. + 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 eps(x_space_dim); + Linear_Expression zero_expr = 0*eps; + Linear_Expression db_expr; + PPL_DIRTY_TEMP_COEFFICIENT(num); + PPL_DIRTY_TEMP_COEFFICIENT(den); + + // 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 (eps). + 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& x_dbm_i = x.dbm[i]; + const DB_Row& 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]; + assert(!is_plus_infinity(x_dbm_ij)); + numer_denom(x_dbm_ij, num, den); + // 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 (den != 1) + db_expr *= den; + db_expr += num; + if (x_dbm_ij >= y_dbm_i[j]) + env_cs.insert(db_expr >= 0); + else { + db_expr += eps; + 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]; + assert(!is_plus_infinity(y_dbm_ij)); + numer_denom(y_dbm_ij, num, den); + // 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 (den != 1) + db_expr *= den; + db_expr += num; + 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 += eps; + 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 (eps) has to be maximised. + MIP_Problem env_lp(x_space_dim + 1, env_cs, eps, MAXIMIZATION); + // Pre-solve `env_lp' to later exploit incrementality. + env_lp.solve(); + 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? + throw std::runtime_error("PPL internal error"); + case UNBOUNDED_MIP_PROBLEM: + return false; + case OPTIMIZED_MIP_PROBLEM: + lp_ij.optimal_value(num, den); + if (num > 0) + return false; + break; + } + } + } + + // The upper bound of x and y is indeed exact. + upper_bound_assign(y); + assert(OK()); + return true; +} + +template +bool +BD_Shape::BHZ09_upper_bound_assign_if_exact(const BD_Shape& y) { + // 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. + 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(); + assert(x.marked_shortest_path_closed()); + assert(y.marked_shortest_path_closed()); + // Pre-compute the upper bound of `x' and `y'. + BD_Shape 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); + + for (dimension_type i = x_space_dim + 1; i-- > 0; ) { + const DB_Row& x_i = x.dbm[i]; + const Bit_Row& x_red_i = x.redundancy_dbm[i]; + const DB_Row& y_i = y.dbm[i]; + const DB_Row& 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. + 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& x_k = x.dbm[k]; + const DB_Row& y_k = y.dbm[k]; + const Bit_Row& y_red_k = y.redundancy_dbm[k]; + const DB_Row& 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. + 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 (lhs < rhs) + return false; + } + } + } + } + } + } + // The upper bound of x and y is indeed exact. + swap(ub); + assert(OK()); + return true; +} + +template +void +BD_Shape::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 complementaries with the system x. + const Constraint_System& y_cs = y.constraints(); + for (Constraint_System::const_iterator i = y_cs.begin(), + y_cs_end = y_cs.end(); i != y_cs_end; ++i) { + const Constraint& c = *i; + // If the 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 = Linear_Expression(c); + 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; + assert(OK()); +} + +template +bool +BD_Shape::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 res(dim, UNIVERSE); + x.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& 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 wrt 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 intefer type, then + // we also need to check that we are actually able to construct + // a constraint inconsistent wrt this one. + goto found; + } + // Then search binary constraints. + for (i = 1; i <= dim; ++i) { + const DB_Row& 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 intefer type, then + // we also need to check that we are actually able to construct + // a constraint inconsistent wrt 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. + assert(i <= dim && j <= dim && (i > 0 || j > 0)); + BD_Shape 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); + assert(!is_plus_infinity(tmp)); + // CHECKME: round down is really meant. + neg_assign_r(res.dbm[j][i], tmp, ROUND_DOWN); + x.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 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_nonredundant = (dim+1)*(dim+1); + for (dimension_type i = dim + 1; i-- > 0; ) + x_num_nonredundant -= x.redundancy_dbm[i].count_ones(); + assert(x_num_nonredundant > 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 yy = y; + + // The constraints added to `yy' will be recorded in `res' ... + BD_Shape res(dim, UNIVERSE); + // ... and we will count them too. + dimension_type res_num_nonredundant = 0; + + // Compute leader information for `x'. + std::vector x_leaders; + x.compute_leaders(x_leaders); + + // First go through the unary equality constraints. + const DB_Row& x_dbm_0 = x.dbm[0]; + DB_Row& yy_dbm_0 = yy.dbm[0]; + DB_Row& 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; + 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_nonredundant; + // Tighten context `yy' using the newly added constraint. + yy_dbm_0[j] = x_dbm_0[j]; + yy.reset_shortest_path_closed(); + } + 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_nonredundant; + // 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_nonredundant < x_num_nonredundant) { + res.reset_shortest_path_closed(); + x.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; + 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_nonredundant; + // Tighten context `yy' using the newly added constraint. + yy.dbm[i][j] = x.dbm[i][j]; + yy.reset_shortest_path_closed(); + } + 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_nonredundant; + // 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_nonredundant < x_num_nonredundant) { + res.reset_shortest_path_closed(); + x.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& x_dbm_i = x.dbm[i]; + const Bit_Row& x_redundancy_dbm_i = x.redundancy_dbm[i]; + DB_Row& yy_dbm_i = yy.dbm[i]; + DB_Row& 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_nonredundant; + // Tighten context `yy' using the newly added constraint. + yy_dbm_ij = x_dbm_ij; + yy.reset_shortest_path_closed(); + 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_nonredundant < x_num_nonredundant) { + res.reset_shortest_path_closed(); + x.swap(res); + } + return bool_result; + } + } + } + } + // This point should be unreachable. + throw std::runtime_error("PPL internal error"); +} + +template +void +BD_Shape::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(); + + assert(OK()); +} + +template +void +BD_Shape::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& 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(); + } + 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& 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(); + assert(OK()); +} + +template +void +BD_Shape::remove_space_dimensions(const Variables_Set& to_be_removed) { + // The removal of no dimensions from any BDS is a no-op. + // Note that this case also captures the only legal removal of + // space dimensions from a BDS in a 0-dim space. + if (to_be_removed.empty()) { + assert(OK()); + return; + } + + const dimension_type old_space_dim = space_dimension(); + + // Dimension-compatibility check. + const dimension_type min_space_dim = to_be_removed.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 - to_be_removed.size(); + if (new_space_dim == 0) { + dbm.resize_no_copy(1); + if (!marked_empty()) + // We set the zero_dim_univ flag. + set_zero_dim_univ(); + assert(OK()); + return; + } + + // Handle the case of an empty BD_Shape. + if (marked_empty()) { + dbm.resize_no_copy(new_space_dim + 1); + 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 tbr = to_be_removed.begin(); + Variables_Set::const_iterator tbr_end = to_be_removed.end(); + dimension_type dst = *tbr + 1; + dimension_type src = dst + 1; + for (++tbr; tbr != tbr_end; ++tbr) { + const dimension_type tbr_next = *tbr + 1; + // All other columns and rows are moved respectively to the left + // and above. + while (src < tbr_next) { + std::swap(dbm[dst], dbm[src]); + for (dimension_type i = old_space_dim + 1; i-- > 0; ) { + DB_Row& 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) { + std::swap(dbm[dst], dbm[src]); + for (dimension_type i = old_space_dim + 1; i-- > 0; ) { + DB_Row& 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); + assert(OK()); +} + +template +template +void +BD_Shape::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 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& dbm_0 = dbm[0]; + DB_Row& 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& dbm_i = dbm[i]; + ++new_i; + DB_Row& 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]); + } + } + } + } + + std::swap(dbm, x); + assert(OK()); +} + +template +void +BD_Shape::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& dbm_i = dbm[i]; + const DB_Row& 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(); + assert(OK()); +} + +template +template +void +BD_Shape::CC76_extrapolation_assign(const BD_Shape& y, + Iterator first, Iterator last, + unsigned* tp) { + const dimension_type space_dim = space_dimension(); + + // Dimension-compatibility check. + if (space_dim != y.space_dimension()) + throw_dimension_incompatible("CC76_extrapolation_assign(y)", y); + +#ifndef NDEBUG + { + // We assume that `y' is contained in or equal to `*this'. + const BD_Shape x_copy = *this; + const BD_Shape y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + // If both 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 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& dbm_i = dbm[i]; + const DB_Row& 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(); + assert(OK()); +} + +template +void +BD_Shape::get_limiting_shape(const Constraint_System& cs, + BD_Shape& limiting_shape) const { + const dimension_type cs_space_dim = cs.space_dimension(); + // Private method: the caller has to ensure the following. + assert(cs_space_dim <= 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 (extract_bounded_difference(c, cs_space_dim, num_vars, i, j, coeff)) { + // Select the cell to be modified for the "<=" part of the constraint, + // and set `coeff' to the absolute value of itself. + const 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& ls_dbm = limiting_shape.dbm; + 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 (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()) { + 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) + 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 +void +BD_Shape::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_generic("limited_CC76_extrapolation_assign(y, cs)", + "cs is space_dimension incompatible"); + + // Strict inequalities not allowed. + if (cs.has_strict_inequalities()) + throw_generic("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; + +#ifndef NDEBUG + { + // We assume that `y' is contained in or equal to `*this'. + const BD_Shape x_copy = *this; + const BD_Shape y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + // If `*this' is empty, since `*this' contains `y', `y' is empty too. + if (marked_empty()) + return; + // If `y' is empty, we return. + if (y.marked_empty()) + return; + + BD_Shape limiting_shape(space_dim, UNIVERSE); + get_limiting_shape(cs, limiting_shape); + CC76_extrapolation_assign(y, tp); + intersection_assign(limiting_shape); +} + +template +void +BD_Shape::BHMZ05_widening_assign(const BD_Shape& y, unsigned* tp) { + const dimension_type space_dim = space_dimension(); + + // Dimension-compatibility check. + if (space_dim != y.space_dimension()) + throw_dimension_incompatible("BHMZ05_widening_assign(y)", y); + +#ifndef NDEBUG + { + // We assume that `y' is contained in or equal to `*this'. + const BD_Shape x_copy = *this; + const BD_Shape y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + // Compute the affine dimension of `y'. + const dimension_type y_affine_dim = y.affine_dimension(); + // If the affine dimension of `y' is zero, then either `y' is + // zero-dimensional, or it is empty, or it is a singleton. + // In all cases, due to the inclusion hypothesis, the result is `*this'. + if (y_affine_dim == 0) + return; + + // If the affine dimension has changed, due to the inclusion hypothesis, + // the result is `*this'. + const dimension_type x_affine_dim = affine_dimension(); + assert(x_affine_dim >= y_affine_dim); + if (x_affine_dim != y_affine_dim) + return; + + // If there are tokens available, work on a temporary copy. + if (tp != 0 && *tp > 0) { + BD_Shape x_tmp(*this); + x_tmp.BHMZ05_widening_assign(y, 0); + // If the widening was not precise, use one of the available tokens. + if (!contains(x_tmp)) + --(*tp); + return; + } + + // Here no token is available. + assert(marked_shortest_path_closed() && y.marked_shortest_path_closed()); + // Minimize `y'. + y.shortest_path_reduction_assign(); + + // Extrapolate unstable bounds, taking into account redundancy in `y'. + for (dimension_type i = space_dim + 1; i-- > 0; ) { + DB_Row& dbm_i = dbm[i]; + const DB_Row& 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(); + assert(OK()); +} + +template +void +BD_Shape::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_generic("limited_BHMZ05_extrapolation_assign(y, cs)", + "cs is space-dimension incompatible"); + + // Strict inequalities are not allowed. + if (cs.has_strict_inequalities()) + throw_generic("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; + +#ifndef NDEBUG + { + // We assume that `y' is contained in or equal to `*this'. + const BD_Shape x_copy = *this; + const BD_Shape y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + // If `*this' is empty, since `*this' contains `y', `y' is empty too. + if (marked_empty()) + return; + // If `y' is empty, we return. + if (y.marked_empty()) + return; + + BD_Shape limiting_shape(space_dim, UNIVERSE); + get_limiting_shape(cs, limiting_shape); + BHMZ05_widening_assign(y, tp); + intersection_assign(limiting_shape); +} + +template +void +BD_Shape::CC76_narrowing_assign(const BD_Shape& y) { + const dimension_type space_dim = space_dimension(); + + // Dimension-compatibility check. + if (space_dim != y.space_dimension()) + throw_dimension_incompatible("CC76_narrowing_assign(y)", y); + +#ifndef NDEBUG + { + // We assume that `*this' is contained in or equal to `y'. + const BD_Shape x_copy = *this; + const BD_Shape y_copy = y; + assert(y_copy.contains(x_copy)); + } +#endif + + // If both 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& dbm_i = dbm[i]; + const DB_Row& 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(); + assert(OK()); +} + +template +void +BD_Shape +::deduce_v_minus_u_bounds(const dimension_type v, + const dimension_type last_v, + const Linear_Expression& sc_expr, + Coefficient_traits::const_reference sc_den, + const N& ub_v) { + assert(sc_den > 0); + 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/den' is + // greater than zero. In particular: + // if `q >= 1', then `v - u <= ub_v - ub_u'; + // if `0 < q < 1', then `v - u <= ub_v - (q*ub_u + (1-q)*lb_u)'. + PPL_DIRTY_TEMP0(mpq_class, mpq_sc_den); + assign_r(mpq_sc_den, sc_den, ROUND_NOT_NEEDED); + const DB_Row& dbm_0 = dbm[0]; + // Speculative allocation of temporaries to be used in the following loop. + PPL_DIRTY_TEMP0(mpq_class, minus_lb_u); + PPL_DIRTY_TEMP0(mpq_class, q); + PPL_DIRTY_TEMP0(mpq_class, ub_u); + PPL_DIRTY_TEMP(N, up_approx); + // No need to consider indices greater than `last_v'. + for (dimension_type u = last_v; u > 0; --u) + if (u != v) { + const Coefficient& expr_u = sc_expr.coefficient(Variable(u-1)); + if (expr_u > 0) { + if (expr_u >= sc_den) + // Deducing `v - u <= ub_v - ub_u'. + sub_assign_r(dbm[u][v], ub_v, dbm_0[u], ROUND_UP); + else { + DB_Row& dbm_u = dbm[u]; + const N& dbm_u0 = dbm_u[0]; + if (!is_plus_infinity(dbm_u0)) { + // Let `ub_u' and `lb_u' be the known upper and lower bound + // for `u', respectively. Letting `q = expr_u/sc_den' be the + // rational coefficient of `u' in `sc_expr/sc_den', + // the upper bound for `v - u' is computed as + // `ub_v - (q * ub_u + (1-q) * lb_u)', i.e., + // `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_den, ROUND_NOT_NEEDED); + assign_r(ub_u, dbm_0[u], ROUND_NOT_NEEDED); + // Compute `ub_u - lb_u'. + add_assign_r(ub_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED); + // Compute `(-lb_u) - q * (ub_u - lb_u)'. + sub_mul_assign_r(minus_lb_u, q, ub_u, ROUND_NOT_NEEDED); + 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 +void +BD_Shape +::deduce_u_minus_v_bounds(const dimension_type v, + const dimension_type last_v, + const Linear_Expression& sc_expr, + Coefficient_traits::const_reference sc_den, + const N& minus_lb_v) { + assert(sc_den > 0); + 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/den' is + // greater than zero. In particular: + // if `q >= 1', then `u - v <= lb_u - lb_v'; + // if `0 < q < 1', then `u - v <= (q*lb_u + (1-q)*ub_u) - lb_v'. + PPL_DIRTY_TEMP0(mpq_class, mpq_sc_den); + assign_r(mpq_sc_den, sc_den, ROUND_NOT_NEEDED); + DB_Row& dbm_0 = dbm[0]; + DB_Row& dbm_v = dbm[v]; + // Speculative allocation of temporaries to be used in the following loop. + PPL_DIRTY_TEMP0(mpq_class, ub_u); + PPL_DIRTY_TEMP0(mpq_class, q); + PPL_DIRTY_TEMP0(mpq_class, minus_lb_u); + PPL_DIRTY_TEMP(N, up_approx); + // No need to consider indices greater than `last_v'. + for (dimension_type u = last_v; u > 0; --u) + if (u != v) { + const Coefficient& expr_u = sc_expr.coefficient(Variable(u-1)); + if (expr_u > 0) { + if (expr_u >= sc_den) + // Deducing `u - v <= lb_u - lb_v', + // i.e., `u - v <= (-lb_v) - (-lb_u)'. + sub_assign_r(dbm_v[u], minus_lb_v, dbm[u][0], ROUND_UP); + else { + const N& dbm_0u = dbm_0[u]; + if (!is_plus_infinity(dbm_0u)) { + // Let `ub_u' and `lb_u' be the known upper and lower bound + // for `u', respectively. Letting `q = expr_u/sc_den' be the + // rational coefficient of `u' in `sc_expr/sc_den', + // the upper bound for `u - v' is computed as + // `(q * lb_u + (1-q) * ub_u) - lb_v', i.e., + // `ub_u - q * (ub_u + (-lb_u)) + 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_den, ROUND_NOT_NEEDED); + assign_r(minus_lb_u, dbm[u][0], ROUND_NOT_NEEDED); + // Compute `ub_u - lb_u'. + add_assign_r(minus_lb_u, minus_lb_u, ub_u, ROUND_NOT_NEEDED); + // Compute `ub_u - q * (ub_u - lb_u)'. + sub_mul_assign_r(ub_u, q, minus_lb_u, ROUND_NOT_NEEDED); + assign_r(up_approx, ub_u, ROUND_UP); + // Deducing `u - v <= (q*lb_u + (1-q)*ub_u) - lb_v'. + add_assign_r(dbm_v[u], up_approx, minus_lb_v, ROUND_UP); + } + } + } + } +} + +template +void +BD_Shape::forget_all_dbm_constraints(const dimension_type v) { + assert(0 < v && v <= dbm.num_rows()); + DB_Row& 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 +void +BD_Shape::forget_binary_dbm_constraints(const dimension_type v) { + assert(0 < v && v <= dbm.num_rows()); + DB_Row& 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 +void +BD_Shape::unconstrain(const Variable var) { + // Dimension-compatibility check. + const dimension_type dim = var.id(); + if (space_dimension() < dim) + throw_dimension_incompatible("unconstrain(var)", 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(dim+1); + // Shortest-path closure is preserved, but not reduction. + reset_shortest_path_reduced(); + assert(OK()); +} + +template +void +BD_Shape::unconstrain(const Variables_Set& to_be_unconstrained) { + // The cylindrification wrt no dimensions is a no-op. + // This case captures the only legal cylindrification in a 0-dim space. + if (to_be_unconstrained.empty()) + return; + + // Dimension-compatibility check. + const dimension_type min_space_dim = to_be_unconstrained.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 tbu = to_be_unconstrained.begin(), + tbu_end = to_be_unconstrained.end(); tbu != tbu_end; ++tbu) + forget_all_dbm_constraints(*tbu + 1); + // Shortest-path closure is preserved, but not reduction. + reset_shortest_path_reduced(); + assert(OK()); +} + +template +void +BD_Shape::refine(const Variable var, + const Relation_Symbol relsym, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator) { + assert(denominator != 0); + const dimension_type expr_space_dim = expr.space_dimension(); + assert(space_dimension() >= expr_space_dim); + const dimension_type v = var.id() + 1; + assert(v <= space_dimension()); + assert(expr.coefficient(var) == 0); + 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 = 0; + // Get information about the number of non-zero coefficients in `expr'. + for (dimension_type i = expr_space_dim; i-- > 0; ) + if (expr.coefficient(Variable(i)) != 0) { + if (t++ == 1) + break; + else + w = i+1; + } + + // 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.coefficient(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& dbm_0 = dbm[0]; + PPL_DIRTY_TEMP_COEFFICIENT(minus_den); + neg_assign(minus_den, 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_den); + 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_den); + break; + default: + // We already dealt with the other cases. + throw std::runtime_error("PPL internal error"); + } + return; + } + + if (t == 1) { + // Case 2: expr == a*w + b, w != v, a == denominator. + assert(expr.coefficient(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_den); + 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_den); + add_dbm_constraint(v, w, d); + break; + default: + // We already dealt with the other cases. + throw std::runtime_error("PPL internal error"); + } + 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_den = is_sc ? denominator : minus_den; + const Coefficient& minus_sc_den = is_sc ? minus_den : denominator; + // NOTE: here, for optimization purposes, `minus_expr' is only assigned + // when `denominator' is negative. Do not use it unless you are sure + // it has been correctly assigned. + Linear_Expression minus_expr; + if (!is_sc) + minus_expr = -expr; + const Linear_Expression& sc_expr = is_sc ? expr : minus_expr; + + 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 (dimension_type i = w; i > 0; --i) { + const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1)); + const int sign_i = sgn(sc_i); + if (sign_i == 0) + continue; + 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]; + if (!is_plus_infinity(approx_i)) + add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP); + else { + ++pinf_count; + pinf_index = i; + } + } + // Approximating `-sc_expr'. + if (neg_pinf_count <= 1) { + const N& approx_minus_i = dbm[i][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; + } + } + } + else if (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][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; + } + } + // Approximating `-sc_expr'. + if (neg_pinf_count <= 1) { + const N& approx_i = dbm_0[i]; + 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; + } + } + } + } + // Return immediately if no approximation could be computed. + if (pinf_count > 1 && neg_pinf_count > 1) { + 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_den' is known to be positive, this amounts to + // rounding downwards, which is achieved as usual by rounding upwards + // `minus_sc_den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + + // Exploit the upper approximation, if possible. + if (pinf_count <= 1) { + // Compute quotient (if needed). + if (down_sc_den != 1) + div_assign_r(sum, sum, down_sc_den, 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_den, sum); + } + else + // Here `pinf_count == 1'. + if (pinf_index != v + && sc_expr.coefficient(Variable(pinf_index-1)) == sc_den) + // 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_den != 1) + div_assign_r(neg_sum, neg_sum, down_sc_den, ROUND_UP); + // Add the lower bound constraint, if meaningful. + if (neg_pinf_count == 0) { + // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'. + DB_Row& 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_den, neg_sum); + } + else + // Here `neg_pinf_count == 1'. + if (neg_pinf_index != v + && sc_expr.coefficient(Variable(neg_pinf_index-1)) == sc_den) + // Add the constraint `v - neg_pinf_index >= -neg_sum', + // i.e., `neg_pinf_index - v <= neg_sum'. + 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 (dimension_type i = w; i > 0; --i) { + const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1)); + const int sign_i = sgn(sc_i); + if (sign_i == 0) + continue; + // Choose carefully: we are approximating `sc_expr'. + const N& approx_i = (sign_i > 0) ? dbm_0[i] : dbm[i][0]; + if (is_plus_infinity(approx_i)) { + if (++pinf_count > 1) + break; + pinf_index = i; + continue; + } + 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_den != 1) { + // Before computing the quotient, the denominator should be + // approximated towards zero. Since `sc_den' is known to be + // positive, this amounts to rounding downwards, which is achieved + // by rounding upwards `minus_sc-den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(sum, sum, down_sc_den, ROUND_UP); + } + + if (pinf_count == 0) { + // Add the constraint `v <= sum'. + add_dbm_constraint(0, v, sum); + // Deduce constraints of the form `v - u', where `u != v'. + deduce_v_minus_u_bounds(v, w, sc_expr, sc_den, sum); + } + else if (pinf_count == 1) + if (expr.coefficient(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 (dimension_type i = w; i > 0; --i) { + const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1)); + const int sign_i = sgn(sc_i); + if (sign_i == 0) + continue; + // Choose carefully: we are approximating `-sc_expr'. + const N& approx_i = (sign_i > 0) ? dbm[i][0] : dbm_0[i]; + if (is_plus_infinity(approx_i)) { + if (++pinf_count > 1) + break; + pinf_index = i; + 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_den != 1) { + // Before computing the quotient, the denominator should be + // approximated towards zero. Since `sc_den' is known to be positive, + // this amounts to rounding downwards, which is achieved by rounding + // upwards `minus_sc_den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(sum, sum, down_sc_den, ROUND_UP); + } + + if (pinf_count == 0) { + // Add the constraint `v >= -sum', i.e., `-v <= sum'. + add_dbm_constraint(v, 0, sum); + // Deduce constraints of the form `u - v', where `u != v'. + deduce_u_minus_v_bounds(v, w, sc_expr, sc_den, sum); + } + else if (pinf_count == 1) + if (pinf_index != v + && expr.coefficient(Variable(pinf_index-1)) == denominator) + // Add the constraint `v - pinf_index >= -sum', + // i.e., `pinf_index - v <= sum'. + add_dbm_constraint(v, pinf_index, sum); + break; + + default: + // We already dealt with the other cases. + throw std::runtime_error("PPL internal error"); + } + + assert(OK()); +} + +template +void +BD_Shape::affine_image(const Variable var, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator) { + // The denominator cannot be zero. + if (denominator == 0) + throw_generic("affine_image(v, e, d)", "d == 0"); + + // Dimension-compatibility checks. + // The dimension of `expr' should not be greater than the dimension + // of `*this'. + const dimension_type space_dim = space_dimension(); + const dimension_type expr_space_dim = expr.space_dimension(); + if (space_dim < expr_space_dim) + throw_dimension_incompatible("affine_image(v, e, d)", "e", expr); + + // `var' should be one of the dimensions of the shape. + const dimension_type v = var.id() + 1; + if (v > space_dim) + throw_dimension_incompatible("affine_image(v, e, d)", var.id()); + + // The image of an empty BDS is empty too. + shortest_path_closure_assign(); + if (marked_empty()) + return; + + const Coefficient& b = expr.inhomogeneous_term(); + // Number of non-zero coefficients in `expr': will be set to + // 0, 1, or 2, the latter value meaning any value greater than 1. + dimension_type t = 0; + // Index of the last non-zero coefficient in `expr', if any. + dimension_type w = 0; + // Get information about the number of non-zero coefficients in `expr'. + for (dimension_type i = expr_space_dim; i-- > 0; ) + if (expr.coefficient(Variable(i)) != 0) { + if (t++ == 1) + break; + else + w = i+1; + } + + // Now we know the form of `expr': + // - If t == 0, then expr == b, with `b' a constant; + // - If t == 1, then expr == a*w + b, where `w' can be `v' or another + // variable; in this second case we have to check whether `a' is + // equal to `denominator' or `-denominator', since otherwise we have + // to fall back on the general form; + // - If t == 2, the `expr' is of the general form. + PPL_DIRTY_TEMP_COEFFICIENT(minus_den); + neg_assign(minus_den, denominator); + + if (t == 0) { + // Case 1: expr == b. + // Remove all constraints on `var'. + forget_all_dbm_constraints(v); + // Shortest-path closure is preserved, but not reduction. + if (marked_shortest_path_reduced()) + reset_shortest_path_reduced(); + // Add the constraint `var == b/denominator'. + add_dbm_constraint(0, v, b, denominator); + add_dbm_constraint(v, 0, b, minus_den); + assert(OK()); + return; + } + + if (t == 1) { + // Value of the one and only non-zero coefficient in `expr'. + const Coefficient& a = expr.coefficient(Variable(w-1)); + if (a == denominator || a == minus_den) { + // Case 2: expr == a*w + b, with a == +/- denominator. + if (w == v) { + // `expr' is of the form: a*v + b. + if (a == denominator) { + if (b == 0) + // The transformation is the identity function. + return; + else { + // Translate all the constraints on `var', + // adding or subtracting the value `b/denominator'. + PPL_DIRTY_TEMP(N, d); + div_round_up(d, b, denominator); + PPL_DIRTY_TEMP(N, c); + div_round_up(c, b, minus_den); + DB_Row& dbm_v = dbm[v]; + for (dimension_type i = space_dim + 1; i-- > 0; ) { + N& dbm_vi = dbm_v[i]; + add_assign_r(dbm_vi, dbm_vi, c, ROUND_UP); + N& dbm_iv = dbm[i][v]; + add_assign_r(dbm_iv, dbm_iv, d, ROUND_UP); + } + // Both shortest-path closure and reduction are preserved. + } + } + else { + // Here `a == -denominator'. + // Remove the binary constraints on `var'. + forget_binary_dbm_constraints(v); + // Swap the unary constraints on `var'. + std::swap(dbm[v][0], dbm[0][v]); + // Shortest-path closure is not preserved. + 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_den); + 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_den); + } + else { + // Here a == -denominator, so that we should be adding + // the constraint `v + w == b/denominator'. + // Approximate it by computing lower and upper bounds for `w'. + const N& dbm_w0 = dbm[w][0]; + if (!is_plus_infinity(dbm_w0)) { + // Add the constraint `v <= b/denominator - lower_w'. + 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_den); + add_assign_r(dbm[v][0], dbm_0w, c, ROUND_UP); + reset_shortest_path_closed(); + } + } + } + assert(OK()); + return; + } + } + + // General case. + // Either t == 2, so that + // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2, + // or t == 1, expr == a*w + b, but a <> +/- denominator. + // We will remove all the constraints on `var' and add back + // constraints providing upper and lower bounds for `var'. + + // Compute upper approximations for `expr' and `-expr' + // into `pos_sum' and `neg_sum', respectively, taking into account + // the sign of `denominator'. + // Note: approximating `-expr' from above and then negating the + // result is the same as approximating `expr' from below. + const bool is_sc = (denominator > 0); + 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_den = is_sc ? denominator : minus_den; + const Coefficient& minus_sc_den = is_sc ? minus_den : denominator; + // NOTE: here, for optimization purposes, `minus_expr' is only assigned + // when `denominator' is negative. Do not use it unless you are sure + // it has been correctly assigned. + Linear_Expression minus_expr; + if (!is_sc) + minus_expr = -expr; + const Linear_Expression& sc_expr = is_sc ? expr : minus_expr; + + 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& 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 (dimension_type i = w; i > 0; --i) { + const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1)); + const int sign_i = sgn(sc_i); + if (sign_i > 0) { + assign_r(coeff_i, sc_i, ROUND_UP); + // Approximating `sc_expr'. + if (pos_pinf_count <= 1) { + const N& up_approx_i = dbm_0[i]; + if (!is_plus_infinity(up_approx_i)) + add_mul_assign_r(pos_sum, coeff_i, up_approx_i, ROUND_UP); + else { + ++pos_pinf_count; + pos_pinf_index = i; + } + } + // Approximating `-sc_expr'. + if (neg_pinf_count <= 1) { + const N& up_approx_minus_i = dbm[i][0]; + if (!is_plus_infinity(up_approx_minus_i)) + add_mul_assign_r(neg_sum, coeff_i, up_approx_minus_i, ROUND_UP); + else { + ++neg_pinf_count; + neg_pinf_index = i; + } + } + } + else if (sign_i < 0) { + 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][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; + } + } + // Approximating `-sc_expr'. + if (neg_pinf_count <= 1) { + const N& up_approx_i = dbm_0[i]; + if (!is_plus_infinity(up_approx_i)) + add_mul_assign_r(neg_sum, coeff_i, up_approx_i, ROUND_UP); + else { + ++neg_pinf_count; + neg_pinf_index = i; + } + } + } + } + + // Remove all constraints on 'v'. + forget_all_dbm_constraints(v); + // Shortest-path closure is maintained, but not reduction. + if (marked_shortest_path_reduced()) + reset_shortest_path_reduced(); + // Return immediately if no approximation could be computed. + if (pos_pinf_count > 1 && neg_pinf_count > 1) { + assert(OK()); + return; + } + + // In the following, shortest-path closure will be definitely lost. + reset_shortest_path_closed(); + + // Exploit the upper approximation, if possible. + if (pos_pinf_count <= 1) { + // Compute quotient (if needed). + if (sc_den != 1) { + // Before computing quotients, the denominator should be approximated + // towards zero. Since `sc_den' is known to be positive, this amounts to + // rounding downwards, which is achieved as usual by rounding upwards + // `minus_sc_den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(pos_sum, pos_sum, down_sc_den, ROUND_UP); + } + // Add the upper bound constraint, if meaningful. + if (pos_pinf_count == 0) { + // Add the constraint `v <= pos_sum'. + 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_den, pos_sum); + } + else + // Here `pos_pinf_count == 1'. + if (pos_pinf_index != v + && sc_expr.coefficient(Variable(pos_pinf_index-1)) == sc_den) + // Add the constraint `v - pos_pinf_index <= pos_sum'. + dbm[pos_pinf_index][v] = pos_sum; + } + + // Exploit the lower approximation, if possible. + if (neg_pinf_count <= 1) { + // Compute quotient (if needed). + if (sc_den != 1) { + // Before computing quotients, the denominator should be approximated + // towards zero. Since `sc_den' is known to be positive, this amounts to + // rounding downwards, which is achieved as usual by rounding upwards + // `minus_sc_den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(neg_sum, neg_sum, down_sc_den, ROUND_UP); + } + // Add the lower bound constraint, if meaningful. + if (neg_pinf_count == 0) { + // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'. + DB_Row& 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_den, neg_sum); + } + else + // Here `neg_pinf_count == 1'. + if (neg_pinf_index != v + && sc_expr.coefficient(Variable(neg_pinf_index-1)) == sc_den) + // Add the constraint `v - neg_pinf_index >= -neg_sum', + // i.e., `neg_pinf_index - v <= neg_sum'. + dbm[v][neg_pinf_index] = neg_sum; + } + + assert(OK()); +} + +template +void +BD_Shape::affine_preimage(const Variable var, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator) { + // The denominator cannot be zero. + if (denominator == 0) + throw_generic("affine_preimage(v, e, d)", "d == 0"); + + // Dimension-compatibility checks. + // The dimension of `expr' should not be greater than the dimension + // of `*this'. + const dimension_type space_dim = space_dimension(); + const dimension_type expr_space_dim = expr.space_dimension(); + if (space_dim < expr_space_dim) + throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr); + + // `var' should be one of the dimensions of + // the 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 = 0; + // Get information about the number of non-zero coefficients in `expr'. + for (dimension_type i = expr_space_dim; i-- > 0; ) + if (expr.coefficient(Variable(i)) != 0) { + if (t++ == 1) + break; + else + j = i; + } + + // Now we know the form of `expr': + // - If t == 0, then expr = b, with `b' a constant; + // - If t == 1, then expr = a*w + b, where `w' can be `v' or another + // variable; in this second case we have to check whether `a' is + // equal to `denominator' or `-denominator', since otherwise we have + // to fall back on the general form; + // - If t > 1, the `expr' is of the general form. + if (t == 0) { + // Case 1: expr = n; remove all constraints on `var'. + forget_all_dbm_constraints(v); + // Shortest-path closure is preserved, but not reduction. + if (marked_shortest_path_reduced()) + reset_shortest_path_reduced(); + assert(OK()); + return; + } + + if (t == 1) { + // Value of the one and only non-zero coefficient in `expr'. + const Coefficient& a = expr.coefficient(Variable(j)); + if (a == denominator || a == -denominator) { + // Case 2: expr = a*w + b, with a = +/- denominator. + if (j == var.id()) + // Apply affine_image() on the inverse of this transformation. + affine_image(var, 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(); + 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(); + } + assert(OK()); +} + +template +void +BD_Shape +::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_generic("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)", + "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)", + "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 = 0; + // Get information about the number of non-zero coefficients in `expr'. + for (dimension_type i = ub_space_dim; i-- > 0; ) + if (ub_expr.coefficient(Variable(i)) != 0) { + if (t++ == 1) + break; + else + w = i+1; + } + + // 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_den); + neg_assign(minus_den, 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); + assert(OK()); + return; + } + + if (t == 1) { + // Value of the one and only non-zero coefficient in `ub_expr'. + const Coefficient& a = ub_expr.coefficient(Variable(w-1)); + if (a == denominator || a == minus_den) { + // 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 = Variable(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(); + 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(); + } + } + 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_den = is_sc ? denominator : minus_den; + const Coefficient& minus_sc_den = is_sc ? minus_den : denominator; + // NOTE: here, for optimization purposes, `minus_expr' is only assigned + // when `denominator' is negative. Do not use it unless you are sure + // it has been correctly assigned. + Linear_Expression minus_expr; + if (!is_sc) + minus_expr = -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& 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 (dimension_type i = w; i > 0; --i) { + const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1)); + const int sign_i = sgn(sc_i); + if (sign_i > 0) { + assign_r(coeff_i, sc_i, ROUND_UP); + // Approximating `sc_expr'. + if (pos_pinf_count <= 1) { + const N& up_approx_i = dbm_0[i]; + if (!is_plus_infinity(up_approx_i)) + add_mul_assign_r(pos_sum, coeff_i, up_approx_i, ROUND_UP); + else { + ++pos_pinf_count; + pos_pinf_index = i; + } + } + } + else if (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][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; + } + } + } + } + // 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_den != 1) { + // Before computing quotients, the denominator should be approximated + // towards zero. Since `sc_den' is known to be positive, this amounts to + // rounding downwards, which is achieved as usual by rounding upwards + // `minus_sc_den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(pos_sum, pos_sum, down_sc_den, ROUND_UP); + } + // Add the upper bound constraint, if meaningful. + if (pos_pinf_count == 0) { + // Add the constraint `v <= pos_sum'. + 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_den, pos_sum); + } + else + // Here `pos_pinf_count == 1'. + if (pos_pinf_index != v + && sc_expr.coefficient(Variable(pos_pinf_index-1)) == sc_den) + // Add the constraint `v - pos_pinf_index <= pos_sum'. + dbm[pos_pinf_index][v] = pos_sum; + } + assert(OK()); +} + +template +void +BD_Shape +::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_generic("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)", + "lb", lb_expr); + const dimension_type ub_space_dim = ub_expr.space_dimension(); + if (space_dim < ub_space_dim) + throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub)", + "ub", ub_expr); + + // Any preimage of an empty 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 = Variable(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_den); + neg_assign(lb_inverse_den, lb_expr_v); + affine_image(new_var, lb_inverse, lb_inverse_den); + shortest_path_closure_assign(); + assert(!marked_empty()); + generalized_affine_preimage(var, LESS_OR_EQUAL, + ub_expr, denominator); + if (sgn(denominator) == sgn(lb_inverse_den)) + add_constraint(var >= new_var); + else + add_constraint(var <= new_var); + // Remove the temporarily added dimension. + remove_higher_space_dimensions(space_dim); +} + +template +void +BD_Shape::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_generic("generalized_affine_image(v, r, e, d)", "d == 0"); + + // Dimension-compatibility checks. + // The dimension of `expr' should not be greater than the dimension + // of `*this'. + const dimension_type space_dim = space_dimension(); + const dimension_type expr_space_dim = expr.space_dimension(); + if (space_dim < expr_space_dim) + throw_dimension_incompatible("generalized_affine_image(v, r, e, d)", + "e", expr); + + // `var' should be one of the dimensions of the BDS. + const dimension_type v = var.id() + 1; + if (v > space_dim) + throw_dimension_incompatible("generalized_affine_image(v, r, e, d)", + var.id()); + + // The relation symbol cannot be a strict relation symbol. + if (relsym == LESS_THAN || relsym == GREATER_THAN) + throw_generic("generalized_affine_image(v, r, e, d)", + "r is a strict relation symbol and " + "*this is a BD_Shape"); + // The relation symbol cannot be a disequality. + if (relsym == NOT_EQUAL) + throw_generic("generalized_affine_image(v, r, e, d)", + "r is the disequality relation symbol and " + "*this is a BD_Shape"); + + if (relsym == EQUAL) { + // The relation symbol is "==": + // this is just an affine image computation. + affine_image(var, expr, denominator); + return; + } + + // The image of an empty BDS is empty too. + shortest_path_closure_assign(); + if (marked_empty()) + return; + + const Coefficient& b = expr.inhomogeneous_term(); + // Number of non-zero coefficients in `expr': will be set to + // 0, 1, or 2, the latter value meaning any value greater than 1. + dimension_type t = 0; + // Index of the last non-zero coefficient in `expr', if any. + dimension_type w = 0; + // Get information about the number of non-zero coefficients in `expr'. + for (dimension_type i = expr_space_dim; i-- > 0; ) + if (expr.coefficient(Variable(i)) != 0) { + if (t++ == 1) + break; + else + w = i+1; + } + + // Now we know the form of `expr': + // - If t == 0, then expr == b, with `b' a constant; + // - If t == 1, then expr == a*w + b, where `w' can be `v' or another + // variable; in this second case we have to check whether `a' is + // equal to `denominator' or `-denominator', since otherwise we have + // to fall back on the general form; + // - If t == 2, the `expr' is of the general form. + DB_Row& dbm_0 = dbm[0]; + DB_Row& dbm_v = dbm[v]; + PPL_DIRTY_TEMP_COEFFICIENT(minus_den); + neg_assign(minus_den, denominator); + + if (t == 0) { + // Case 1: expr == b. + // Remove all constraints on `var'. + forget_all_dbm_constraints(v); + // Both shortest-path closure and reduction are lost. + 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_den); + break; + default: + // We already dealt with the other cases. + throw std::runtime_error("PPL internal error"); + } + assert(OK()); + return; + } + + if (t == 1) { + // Value of the one and only non-zero coefficient in `expr'. + const Coefficient& a = expr.coefficient(Variable(w-1)); + if (a == denominator || a == minus_den) { + // Case 2: expr == a*w + b, with a == +/- denominator. + 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_den); + 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. + throw std::runtime_error("PPL internal error"); + } + 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_den = is_sc ? denominator : minus_den; + const Coefficient& minus_sc_den = is_sc ? minus_den : denominator; + // NOTE: here, for optimization purposes, `minus_expr' is only assigned + // when `denominator' is negative. Do not use it unless you are sure + // it has been correctly assigned. + Linear_Expression minus_expr; + if (!is_sc) + minus_expr = -expr; + const Linear_Expression& sc_expr = is_sc ? expr : minus_expr; + + 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'. + for (dimension_type i = w; i > 0; --i) { + const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1)); + const int sign_i = sgn(sc_i); + if (sign_i == 0) + continue; + // Choose carefully: we are approximating `sc_expr'. + const N& approx_i = (sign_i > 0) ? dbm_0[i] : dbm[i][0]; + if (is_plus_infinity(approx_i)) { + if (++pinf_count > 1) + break; + pinf_index = i; + continue; + } + 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) { + assert(OK()); + return; + } + + // Divide by the (sign corrected) denominator (if needed). + if (sc_den != 1) { + // Before computing the quotient, the denominator should be approximated + // towards zero. Since `sc_den' is known to be positive, this amounts to + // rounding downwards, which is achieved as usual by rounding upwards + // `minus_sc_den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(sum, sum, down_sc_den, ROUND_UP); + } + + if (pinf_count == 0) { + // Add the constraint `v <= sum'. + add_dbm_constraint(0, v, sum); + // Deduce constraints of the form `v - u', where `u != v'. + deduce_v_minus_u_bounds(v, w, sc_expr, sc_den, sum); + } + else if (pinf_count == 1) + if (pinf_index != v + && expr.coefficient(Variable(pinf_index-1)) == denominator) + // Add the constraint `v - pinf_index <= sum'. + add_dbm_constraint(pinf_index, v, sum); + break; + + case GREATER_OR_EQUAL: + // Compute an upper approximation for `-sc_expr' into `sum'. + // Note: approximating `-sc_expr' from above and then negating the + // result is the same as approximating `sc_expr' from below. + + // Approximate the inhomogeneous term. + assign_r(sum, minus_sc_b, ROUND_UP); + // Approximate the homogeneous part of `-sc_expr'. + for (dimension_type i = expr_space_dim + 1; i > 0; --i) { + const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1)); + const int sign_i = sgn(sc_i); + if (sign_i == 0) + continue; + // Choose carefully: we are approximating `-sc_expr'. + const N& approx_i = (sign_i > 0) ? dbm[i][0] : dbm_0[i]; + if (is_plus_infinity(approx_i)) { + if (++pinf_count > 1) + break; + pinf_index = i; + continue; + } + 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) { + assert(OK()); + return; + } + + // Divide by the (sign corrected) denominator (if needed). + if (sc_den != 1) { + // Before computing the quotient, the denominator should be approximated + // towards zero. Since `sc_den' is known to be positive, this amounts to + // rounding downwards, which is achieved as usual by rounding upwards + // `minus_sc_den' and negating again the result. + PPL_DIRTY_TEMP(N, down_sc_den); + assign_r(down_sc_den, minus_sc_den, ROUND_UP); + neg_assign_r(down_sc_den, down_sc_den, ROUND_UP); + div_assign_r(sum, sum, down_sc_den, ROUND_UP); + } + + if (pinf_count == 0) { + // Add the constraint `v >= -sum', i.e., `-v <= sum'. + add_dbm_constraint(v, 0, sum); + // Deduce constraints of the form `u - v', where `u != v'. + deduce_u_minus_v_bounds(v, w, sc_expr, sc_den, sum); + } + else if (pinf_count == 1) + if (pinf_index != v + && expr.coefficient(Variable(pinf_index-1)) == denominator) + // Add the constraint `v - pinf_index >= -sum', + // i.e., `pinf_index - v <= sum'. + add_dbm_constraint(v, pinf_index, sum); + break; + + default: + // We already dealt with the other cases. + throw std::runtime_error("PPL internal error"); + } + assert(OK()); +} + +template +void +BD_Shape::generalized_affine_image(const Linear_Expression& lhs, + const Relation_Symbol relsym, + const Linear_Expression& rhs) { + // Dimension-compatibility checks. + // The dimension of `lhs' should not be greater than the dimension + // of `*this'. + const dimension_type space_dim = space_dimension(); + const dimension_type lhs_space_dim = lhs.space_dimension(); + if (space_dim < lhs_space_dim) + throw_dimension_incompatible("generalized_affine_image(e1, r, e2)", + "e1", lhs); + + // The dimension of `rhs' should not be greater than the dimension + // of `*this'. + const dimension_type rhs_space_dim = rhs.space_dimension(); + if (space_dim < rhs_space_dim) + throw_dimension_incompatible("generalized_affine_image(e1, r, e2)", + "e2", rhs); + + // Strict relation symbols are not admitted for BDSs. + if (relsym == LESS_THAN || relsym == GREATER_THAN) + throw_generic("generalized_affine_image(e1, r, e2)", + "r is a strict relation symbol and " + "*this is a BD_Shape"); + // The relation symbol cannot be a disequality. + if (relsym == NOT_EQUAL) + throw_generic("generalized_affine_image(e1, r, e2)", + "r is the disequality relation symbol and " + "*this is a BD_Shape"); + + // The image of an empty BDS is empty. + shortest_path_closure_assign(); + if (marked_empty()) + return; + + // Number of non-zero coefficients in `lhs': will be set to + // 0, 1, or 2, the latter value meaning any value greater than 1. + dimension_type t_lhs = 0; + // Index of the last non-zero coefficient in `lhs', if any. + dimension_type j_lhs = 0; + // Compute the number of the non-zero components of `lhs'. + for (dimension_type i = lhs_space_dim; i-- > 0; ) + if (lhs.coefficient(Variable(i)) != 0) { + if (t_lhs++ == 1) + break; + else + j_lhs = i; + } + + const Coefficient& b_lhs = lhs.inhomogeneous_term(); + + if (t_lhs == 0) { + // `lhs' is a constant. + // In principle, it is sufficient to add the constraint `lhs relsym rhs'. + // Note that this constraint is a bounded difference if `t_rhs <= 1' + // or `t_rhs > 1' and `rhs == a*v - a*w + b_rhs'. If `rhs' is of a + // more general form, it will be simply ignored. + // TODO: if it is not a bounded difference, should we compute + // approximations for this constraint? + switch (relsym) { + case LESS_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. + throw std::runtime_error("PPL internal error"); + } + } + else if (t_lhs == 1) { + // Here `lhs == a_lhs * v + b_lhs'. + // Independently from the form of `rhs', we can exploit the + // method computing generalized affine images for a single variable. + Variable v(j_lhs); + // Compute a sign-corrected relation symbol. + const Coefficient& den = lhs.coefficient(v); + Relation_Symbol new_relsym = relsym; + if (den < 0) { + if (relsym == LESS_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, den); + } + else { + // Here `lhs' is of the general form, having at least two variables. + // Compute the set of variables occurring in `lhs'. + bool lhs_vars_intersects_rhs_vars = false; + std::vector lhs_vars; + for (dimension_type i = lhs_space_dim; i-- > 0; ) + if (lhs.coefficient(Variable(i)) != 0) { + lhs_vars.push_back(Variable(i)); + if (rhs.coefficient(Variable(i)) != 0) + lhs_vars_intersects_rhs_vars = true; + } + + if (!lhs_vars_intersects_rhs_vars) { + // `lhs' and `rhs' variables are disjoint. + // 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. + throw std::runtime_error("PPL internal error"); + } + } + else { + // Some variables in `lhs' also occur in `rhs'. + +#if 1 // Simplified computation (see the TODO note below). + + for (dimension_type i = lhs_vars.size(); i-- > 0; ) + forget_all_dbm_constraints(lhs_vars[i].id() + 1); + +#else // Currently unnecessarily complex computation. + + // More accurate computation that is worth doing only if + // the following TODO note is accurately dealt with. + + // To ease the computation, we add an additional dimension. + const Variable new_var = Variable(space_dim); + add_space_dimensions_and_embed(1); + // Constrain the new dimension to be equal to `rhs'. + // NOTE: calling affine_image() instead of 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(); + 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. + throw std::runtime_error("PPL internal error"); + } + // Remove the temporarily added dimension. + remove_higher_space_dimensions(space_dim-1); +#endif // Currently unnecessarily complex computation. + } + } + + assert(OK()); +} + +template +void +BD_Shape::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_generic("generalized_affine_preimage(v, r, e, d)", "d == 0"); + + // Dimension-compatibility checks. + // The dimension of `expr' should not be greater than the dimension + // of `*this'. + const dimension_type space_dim = space_dimension(); + const dimension_type expr_space_dim = expr.space_dimension(); + if (space_dim < expr_space_dim) + throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)", + "e", expr); + + // `var' should be one of the dimensions of the BDS. + const dimension_type v = var.id() + 1; + if (v > space_dim) + throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)", + var.id()); + + // The relation symbol cannot be a strict relation symbol. + if (relsym == LESS_THAN || relsym == GREATER_THAN) + throw_generic("generalized_affine_preimage(v, r, e, d)", + "r is a strict relation symbol and " + "*this is a BD_Shape"); + // The relation symbol cannot be a disequality. + if (relsym == NOT_EQUAL) + throw_generic("generalized_affine_preimage(v, r, e, d)", + "r is the disequality relation symbol and " + "*this is a BD_Shape"); + + if (relsym == EQUAL) { + // The relation symbol is "==": + // this is just an affine preimage computation. + affine_preimage(var, expr, denominator); + 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_den); + neg_assign(inverse_den, expr_v); + const Relation_Symbol inverse_relsym + = (sgn(denominator) == sgn(inverse_den)) ? relsym : reversed_relsym; + generalized_affine_image(var, inverse_relsym, inverse, inverse_den); + return; + } + + 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(); + assert(OK()); +} + +template +void +BD_Shape::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_generic("generalized_affine_preimage(e1, r, e2)", + "r is a strict relation symbol and " + "*this is a BD_Shape"); + // The relation symbol cannot be a disequality. + if (relsym == NOT_EQUAL) + throw_generic("generalized_affine_preimage(e1, r, e2)", + "r is the disequality relation symbol and " + "*this is a BD_Shape"); + + // 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 = 0; + // Compute the number of the non-zero components of `lhs'. + for (dimension_type i = lhs_space_dim; i-- > 0; ) + if (lhs.coefficient(Variable(i)) != 0) { + if (t_lhs++ == 1) + break; + else + j_lhs = i; + } + + const Coefficient& b_lhs = lhs.inhomogeneous_term(); + + if (t_lhs == 0) { + // `lhs' is a constant. + // In 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& den = lhs.coefficient(v); + Relation_Symbol new_relsym = relsym; + if (den < 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, den); + } + else { + // Here `lhs' is of the general form, having at least two variables. + // Compute the set of variables occurring in `lhs'. + bool lhs_vars_intersects_rhs_vars = false; + std::vector lhs_vars; + for (dimension_type i = lhs_space_dim; i-- > 0; ) + if (lhs.coefficient(Variable(i)) != 0) { + lhs_vars.push_back(Variable(i)); + if (rhs.coefficient(Variable(i)) != 0) + lhs_vars_intersects_rhs_vars = true; + } + + if (!lhs_vars_intersects_rhs_vars) { + // `lhs' and `rhs' variables are disjoint. + + // 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. + throw std::runtime_error("PPL internal error"); + } + + // 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 = Variable(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(); + 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. + throw std::runtime_error("PPL internal error"); + } + // Remove the temporarily added dimension. + remove_higher_space_dimensions(bds_space_dim); + } + } + + assert(OK()); +} + +template +Constraint_System +BD_Shape::constraints() const { + Constraint_System cs; + const dimension_type space_dim = space_dimension(); + if (space_dim == 0) { + if (marked_empty()) + cs = Constraint_System::zero_dim_empty(); + } + else if (marked_empty()) + cs.insert(0*Variable(space_dim-1) <= -1); + else if (marked_shortest_path_reduced()) + // Disregard redundant constraints. + cs = minimized_constraints(); + else { + // KLUDGE: in the future `cs' will be constructed of the right dimension. + // For the time being, we force the dimension with the following line. + cs.insert(0*Variable(space_dim-1) <= 0); + + PPL_DIRTY_TEMP_COEFFICIENT(a); + PPL_DIRTY_TEMP_COEFFICIENT(b); + // Go through all the unary constraints in `dbm'. + const DB_Row& 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& 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 +Constraint_System +BD_Shape::minimized_constraints() const { + shortest_path_reduction_assign(); + Constraint_System cs; + const dimension_type space_dim = space_dimension(); + if (space_dim == 0) { + if (marked_empty()) + cs = Constraint_System::zero_dim_empty(); + } + else if (marked_empty()) + cs.insert(0*Variable(space_dim-1) <= -1); + else { + // KLUDGE: in the future `cs' will be constructed of the right dimension. + // For the time being, we force the dimension with the following line. + cs.insert(0*Variable(space_dim-1) <= 0); + + PPL_DIRTY_TEMP_COEFFICIENT(num); + PPL_DIRTY_TEMP_COEFFICIENT(den); + + // Compute leader information. + std::vector leaders; + compute_leaders(leaders); + std::vector 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& dbm_0 = dbm[0]; + for (dimension_type i = 1; i <= space_dim; ++i) { + const dimension_type leader = leaders[i]; + if (i != leader) { + // Generate the constraint relating `i' and its leader. + if (leader == 0) { + // A unary equality has to be generated. + assert(!is_plus_infinity(dbm_0[i])); + numer_denom(dbm_0[i], num, den); + cs.insert(den*Variable(i-1) == num); + } + else { + // A binary equality has to be generated. + assert(!is_plus_infinity(dbm[i][leader])); + numer_denom(dbm[i][leader], num, den); + cs.insert(den*Variable(leader-1) - den*Variable(i-1) == num); + } + } + } + + // Go through the leaders to generate inequality constraints. + // First generate all the unary inequalities. + const 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], num, den); + cs.insert(den*Variable(i-1) <= num); + } + if (!redundancy_dbm[i][0]) { + numer_denom(dbm[i][0], num, den); + cs.insert(-den*Variable(i-1) <= num); + } + } + // Then generate all the binary inequalities. + for (dimension_type l_i = 1; l_i < num_leaders; ++l_i) { + const dimension_type i = leader_indices[l_i]; + const DB_Row& 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], num, den); + cs.insert(den*Variable(j-1) - den*Variable(i-1) <= num); + } + if (!redundancy_dbm[j][i]) { + numer_denom(dbm[j][i], num, den); + cs.insert(den*Variable(i-1) - den*Variable(j-1) <= num); + } + } + } + } + return cs; +} + +template +void +BD_Shape::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_generic("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& dbm_v = dbm[v_id]; + for (dimension_type i = old_dim + 1; i-- > 0; ) { + DB_Row& 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(); + assert(OK()); +} + +template +void +BD_Shape::fold_space_dimensions(const Variables_Set& to_be_folded, + Variable var) { + const dimension_type space_dim = space_dimension(); + // `var' should be one of the dimensions of the BDS. + if (var.space_dimension() > space_dim) + throw_dimension_incompatible("fold_space_dimensions(tbf, v)", + "v", var); + + // The folding of no dimensions is a no-op. + if (to_be_folded.empty()) + return; + + // All variables in `to_be_folded' should be dimensions of the BDS. + if (to_be_folded.space_dimension() > space_dim) + throw_dimension_incompatible("fold_space_dimensions(tbf, ...)", + to_be_folded.space_dimension()); + + // Moreover, `var.id()' should not occur in `to_be_folded'. + if (to_be_folded.find(var.id()) != to_be_folded.end()) + throw_generic("fold_space_dimensions(tbf, v)", + "v should not occur in tbf"); + + shortest_path_closure_assign(); + if (!marked_empty()) { + // Recompute the elements of the row and the column corresponding + // to variable `var' by taking the join of their value with the + // value of the corresponding elements in the row and column of the + // variable `to_be_folded'. + const dimension_type v_id = var.id() + 1; + DB_Row& dbm_v = dbm[v_id]; + for (Variables_Set::const_iterator i = to_be_folded.begin(), + tbf_end = to_be_folded.end(); i != tbf_end; ++i) { + const dimension_type tbf_id = *i + 1; + const DB_Row& dbm_tbf = dbm[tbf_id]; + for (dimension_type j = space_dim + 1; j-- > 0; ) { + max_assign(dbm[j][v_id], dbm[j][tbf_id]); + max_assign(dbm_v[j], dbm_tbf[j]); + } + } + } + remove_space_dimensions(to_be_folded); +} + +/*! \relates Parma_Polyhedra_Library::BD_Shape */ +template +std::ostream& +IO_Operators::operator<<(std::ostream& s, const BD_Shape& c) { + typedef typename BD_Shape::coefficient_type N; + if (c.is_universe()) + s << "true"; + else { + // We control empty bounded difference shape. + dimension_type n = c.space_dimension(); + if (c.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 = c.dbm[i][j]; + const N& c_j_i = c.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 an only 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 an only 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 +void +BD_Shape::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) + +template +bool +BD_Shape::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 +memory_size_type +BD_Shape::external_memory_in_bytes() const { + return dbm.external_memory_in_bytes() + + redundancy_dbm.external_memory_in_bytes(); +} + +template +bool +BD_Shape::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::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 +void +BD_Shape::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 +void +BD_Shape::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 +void +BD_Shape::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 +void +BD_Shape::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 +void +BD_Shape::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 +void +BD_Shape::throw_expression_too_complex(const char* method, + const Linear_Expression& e) { + using namespace IO_Operators; + std::ostringstream s; + s << "PPL::BD_Shape::" << method << ":" << std::endl + << e << " is too complex."; + throw std::invalid_argument(s.str()); +} + + +template +void +BD_Shape::throw_dimension_incompatible(const char* method, + const char* name_row, + const Linear_Expression& y) const { + std::ostringstream s; + s << "PPL::BD_Shape::" << method << ":" << std::endl + << "this->space_dimension() == " << space_dimension() + << ", " << name_row << "->space_dimension() == " + << y.space_dimension() << "."; + throw std::invalid_argument(s.str()); +} + +template +void +BD_Shape::throw_generic(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 2146. */ + +/* Automatically generated from PPL source file ../src/Box.templates.hh line 39. */ +#include + +namespace Parma_Polyhedra_Library { + +template +inline +Box::Box(dimension_type num_dimensions, Degenerate_Element kind) + : seq(num_dimensions <= max_space_dimension() + ? num_dimensions + : (throw_space_dimension_overflow("Box(n, k)", + "n exceeds the maximum " + "allowed space dimension"), + num_dimensions)), + 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(); + assert(OK()); +} + +template +inline +Box::Box(const Constraint_System& cs) + : seq(cs.space_dimension() <= max_space_dimension() + ? cs.space_dimension() + : (throw_space_dimension_overflow("Box(cs)", + "cs exceeds the maximum " + "allowed space dimension"), + cs.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 +inline +Box::Box(const Congruence_System& cgs) + : seq(cgs.space_dimension() <= max_space_dimension() + ? cgs.space_dimension() + : (throw_space_dimension_overflow("Box(cgs)", + "cgs exceeds the maximum " + "allowed space dimension"), + cgs.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 +template +inline +Box::Box(const Box& 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]); + assert(OK()); +} + +template +Box::Box(const Generator_System& gs) + : seq(gs.space_dimension() <= max_space_dimension() + ? gs.space_dimension() + : (throw_space_dimension_overflow("Box(gs)", + "gs exceeds the maximum " + "allowed space dimension"), + 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 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_TEMP0(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. + 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].join_assign(q); + } + } + else { + // This is the first point seen: initialize `seq'. + point_seen = true; + 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].assign(q); + } + } + } + } + + if (!point_seen) + // The generator system is not empty, but contains no points. + throw std::invalid_argument("PPL::Box::Box(gs):\n" + "the non-empty generator system gs " + "contains no points."); + + // Going through all the lines, rays and closure points. + ITV q_interval; + 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 (dimension_type i = space_dim; i-- > 0; ) + if (g.coefficient(Variable(i)) != 0) + seq[i].assign(UNIVERSE); + break; + case Generator::RAY: + for (dimension_type i = space_dim; i-- > 0; ) + switch (sgn(g.coefficient(Variable(i)))) { + case 1: + seq[i].upper_set(UNBOUNDED); + break; + case -1: + seq[i].lower_set(UNBOUNDED); + break; + default: + break; + } + break; + case Generator::CLOSURE_POINT: + { + const Coefficient& d = g.divisor(); + 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_widen(q, true); + seq_i.upper_widen(q, true); + } + } + break; + default: + // Points already dealt with. + break; + } + } + assert(OK()); +} + +template +template +Box::Box(const BD_Shape& bds, Complexity_Class) + : seq(bds.space_dimension() <= max_space_dimension() + ? bds.space_dimension() + : (throw_space_dimension_overflow("Box(bds)", + "bds exceeds the maximum " + "allowed space dimension"), + bds.space_dimension())), + status() { + // Expose all the interval constraints. + bds.shortest_path_closure_assign(); + if (bds.marked_empty()) { + set_empty(); + 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) { + assert(OK()); + return; + } + + PPL_DIRTY_TEMP(typename BD_Shape::coefficient_type, tmp); + const DB_Row::coefficient_type>& dbm_0 = bds.dbm[0]; + for (dimension_type i = space_dim; i-- > 0; ) { + ITV& seq_i = seq[i]; + // Set the upper bound. + const typename BD_Shape::coefficient_type& u = dbm_0[i+1]; + if (is_plus_infinity(u)) + seq_i.upper_set_uninit(UNBOUNDED); + else + seq_i.upper_set_uninit(u); + + // Set the lower bound. + const typename BD_Shape::coefficient_type& negated_l = bds.dbm[i+1][0]; + if (is_plus_infinity(negated_l)) + seq_i.lower_set_uninit(UNBOUNDED); + else { + neg_assign_r(tmp, negated_l, ROUND_DOWN); + seq_i.lower_set_uninit(tmp); + } + + // Complete the interval initialization. + seq_i.complete_init(); + } + assert(OK()); +} + +template +template +Box::Box(const Octagonal_Shape& oct, Complexity_Class) + : seq(oct.space_dimension() <= max_space_dimension() + ? oct.space_dimension() + : (throw_space_dimension_overflow("Box(oct)", + "oct exceeds the maximum " + "allowed space dimension"), + oct.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_TEMP0(mpq_class, bound); + for (dimension_type i = space_dim; i-- > 0; ) { + ITV& seq_i = seq[i]; + const dimension_type ii = 2*i; + const dimension_type cii = ii + 1; + + // Set the upper bound. + const typename Octagonal_Shape::coefficient_type& twice_ub + = oct.matrix[cii][ii]; + if (!is_plus_infinity(twice_ub)) { + assign_r(bound, twice_ub, ROUND_NOT_NEEDED); + div2exp_assign_r(bound, bound, 1, ROUND_NOT_NEEDED); + seq_i.upper_set_uninit(bound); + } + else + seq_i.upper_set_uninit(UNBOUNDED); + + // Set the lower bound. + const typename Octagonal_Shape::coefficient_type& twice_lb + = oct.matrix[ii][cii]; + if (!is_plus_infinity(twice_lb)) { + assign_r(bound, twice_lb, ROUND_NOT_NEEDED); + neg_assign_r(bound, bound, ROUND_NOT_NEEDED); + div2exp_assign_r(bound, bound, 1, ROUND_NOT_NEEDED); + seq_i.lower_set_uninit(bound); + } + else + seq_i.lower_set_uninit(UNBOUNDED); + seq_i.complete_init(); + } +} + +template +Box::Box(const Polyhedron& ph, Complexity_Class complexity) + : seq(ph.space_dimension() <= max_space_dimension() + ? ph.space_dimension() + : (throw_space_dimension_overflow("Box(ph)", + "ph exceeds the maximum " + "allowed space dimension"), + ph.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()); + swap(tmp); + return; + } + + // Here generators are not up-to-date or there are pending constraints. + 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_dimension(); i-- > 0; ) + seq[i].assign(UNIVERSE); + // Extract easy-to-find bounds from constraints. + refine_with_constraints(ph.simplified_constraints()); + } + 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()) + lp.add_constraint(Linear_Expression(c) >= 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_TEMP0(mpq_class, bound); + PPL_DIRTY_TEMP(Coefficient, bound_num); + PPL_DIRTY_TEMP(Coefficient, bound_den); + for (dimension_type i = space_dim; i-- > 0; ) { + 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_num, bound_den); + assign_r(bound.get_num(), bound_num, ROUND_NOT_NEEDED); + assign_r(bound.get_den(), bound_den, ROUND_NOT_NEEDED); + assert(is_canonical(bound)); + seq_i.upper_set_uninit(bound); + } + else + seq_i.upper_set_uninit(UNBOUNDED); + // 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_num, bound_den); + assign_r(bound.get_num(), bound_num, ROUND_NOT_NEEDED); + assign_r(bound.get_den(), bound_den, ROUND_NOT_NEEDED); + assert(is_canonical(bound)); + seq_i.lower_set_uninit(bound); + } + else + seq_i.lower_set_uninit(UNBOUNDED); + seq_i.complete_init(); + } + } + else { + assert(complexity == ANY_COMPLEXITY); + if (ph.is_empty()) + set_empty(); + else { + Box tmp(ph.generators()); + swap(tmp); + } + } +} + +template +Box::Box(const Grid& gr, Complexity_Class) + : seq(gr.space_dimension() <= max_space_dimension() + ? gr.space_dimension() + : (throw_space_dimension_overflow("Box(gr)", + "gr exceeds the maximum " + "allowed space dimension"), + gr.space_dimension())), + status() { + + // FIXME: here we are not taking advantage of intervals with restrictions! + + 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; + } + + 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_TEMP0(mpq_class, bound); + PPL_DIRTY_TEMP(Coefficient, bound_num); + PPL_DIRTY_TEMP(Coefficient, bound_den); + for (dimension_type i = space_dim; i-- > 0; ) { + ITV& seq_i = seq[i]; + Variable var(i); + bool max; + if (gr.maximize(var, bound_num, bound_den, max)) { + assign_r(bound.get_num(), bound_num, ROUND_NOT_NEEDED); + assign_r(bound.get_den(), bound_den, ROUND_NOT_NEEDED); + bound.canonicalize(); + seq_i.assign(bound); + } + else + seq_i.assign(UNIVERSE); + } +} + +template +template +Box::Box(const Partially_Reduced_Product& dp, + Complexity_Class complexity) + : seq(), status() { + if (dp.space_dimension() > max_space_dimension()) + throw_space_dimension_overflow("Box(dp)", + "dp exceeds the maximum " + "allowed space dimension"); + Box tmp1(dp.domain1(), complexity); + Box tmp2(dp.domain2(), complexity); + tmp1.intersection_assign(tmp2); + swap(tmp1); +} + +template +inline void +Box::add_space_dimensions_and_embed(const dimension_type m) { + // Adding no dimensions is a no-op. + if (m == 0) + return; + // 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)); + assert(OK()); +} + +template +inline void +Box::add_space_dimensions_and_project(const dimension_type m) { + // Adding no dimensions is a no-op. + if (m == 0) + return; + // Add `m' new zero elements to the sequence. + seq.insert(seq.end(), m, ITV(0)); + assert(OK()); +} + +template +bool +operator==(const Box& x, const Box& 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 +bool +Box::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; + for (dimension_type i = expr_space_dim; i-- > 0; ) + switch (sgn(expr.coefficient(Variable(i))) * from_above_sign) { + case 1: + if (seq[i].upper_is_unbounded()) + return false; + break; + case 0: + // Nothing to do. + break; + case -1: + if (seq[i].lower_is_unbounded()) + return false; + break; + } + return true; +} + +template +Poly_Con_Relation +interval_relation(const ITV& i, + const Constraint::Type constraint_type, + Coefficient_traits::const_reference num, + Coefficient_traits::const_reference den) { + + if (i.is_universe()) + return Poly_Con_Relation::strictly_intersects(); + + PPL_DIRTY_TEMP0(mpq_class, bound); + assign_r(bound.get_num(), num, ROUND_NOT_NEEDED); + assign_r(bound.get_den(), den, ROUND_NOT_NEEDED); + bound.canonicalize(); + neg_assign_r(bound, bound, ROUND_NOT_NEEDED); + const bool is_lower_bound = (den > 0); + + PPL_DIRTY_TEMP0(mpq_class, bound_diff); + if (constraint_type == Constraint::EQUALITY) { + if (i.lower_is_unbounded()) { + assert(!i.upper_is_unbounded()); + 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_unbounded()) + 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(); + } + } + } + } + } + + assert(constraint_type != Constraint::EQUALITY); + if (is_lower_bound) { + if (i.lower_is_unbounded()) { + assert(!i.upper_is_unbounded()); + 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 { + 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_unbounded()) + 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_unbounded()) + 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 { + 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_unbounded()) + 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. + throw std::runtime_error("PPL internal error"); +} + +template +Poly_Con_Relation +Box::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_TEMP0(Rational_Interval, r); + PPL_DIRTY_TEMP0(Rational_Interval, t); + PPL_DIRTY_TEMP0(mpq_class, m); + r = 0; + for (dimension_type i = cg.space_dimension(); i-- > 0; ) { + const Coefficient& cg_i = cg.coefficient(Variable(i)); + if (sgn(cg_i) != 0) { + assign_r(m, cg_i, ROUND_NOT_NEEDED); + // FIXME: an add_mul_assign() method would come handy here. + t = seq[i]; + t *= m; + r += t; + } + } + + if (r.lower_is_unbounded() || r.upper_is_unbounded()) + 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 +Poly_Con_Relation +Box::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 (extract_interval_constraint(c, c_space_dim, 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_TEMP0(Rational_Interval, r); + PPL_DIRTY_TEMP0(Rational_Interval, t); + PPL_DIRTY_TEMP0(mpq_class, m); + r = 0; + for (dimension_type i = c.space_dimension(); i-- > 0; ) { + const Coefficient& c_i = c.coefficient(Variable(i)); + if (sgn(c_i) != 0) { + assign_r(m, c_i, ROUND_NOT_NEEDED); + // FIXME: an add_mul_assign() method would come handy here. + t = seq[i]; + t *= m; + r += t; + } + } + return interval_relation(r, + c.type(), + c.inhomogeneous_term()); + } + + // Quiet a compiler warning: this program point is unreachable. + throw std::runtime_error("PPL internal error"); +} + +template +Poly_Gen_Relation +Box::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()) { + for (dimension_type i = g_space_dim; i-- > 0; ) + if (g.coefficient(Variable(i)) != 0 && !seq[i].is_universe()) + return Poly_Gen_Relation::nothing(); + return Poly_Gen_Relation::subsumes(); + } + else { + assert(g.is_ray()); + for (dimension_type i = g_space_dim; i-- > 0; ) + switch (sgn(g.coefficient(Variable(i)))) { + case 1: + if (!seq[i].upper_is_unbounded()) + return Poly_Gen_Relation::nothing(); + break; + case 0: + break; + case -1: + if (!seq[i].lower_is_unbounded()) + 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_TEMP0(mpq_class, g_coord); + PPL_DIRTY_TEMP0(mpq_class, bound); + 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_unbounded()) { + 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_unbounded()) { + 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 +bool +Box::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_TEMP0(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_TEMP0(mpq_class, bound_i); + PPL_DIRTY_TEMP0(mpq_class, expr_i); + for (dimension_type i = expr_space_dim; i-- > 0; ) { + const ITV& seq_i = seq[i]; + assign_r(expr_i, expr.coefficient(Variable(i)), ROUND_NOT_NEEDED); + switch (sgn(expr_i) * maximize_sign) { + case 1: + if (seq_i.upper_is_unbounded()) + 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: + // Nothing to do. + break; + case -1: + if (seq_i.lower_is_unbounded()) + 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. + assert(is_canonical(result)); + ext_n = result.get_num(); + ext_d = result.get_den(); + included = is_included; + return true; +} + +template +bool +Box::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_TEMP0(mpq_class, g_coord); + PPL_DIRTY_TEMP(Coefficient, num); + PPL_DIRTY_TEMP(Coefficient, den); + PPL_DIRTY_TEMP(Coefficient, lcm); + PPL_DIRTY_TEMP(Coefficient, factor); + 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_unbounded()) + if (seq_i.lower_is_open()) + if (!seq_i.upper_is_unbounded()) + 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_TEMP0(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). + assert(!seq_i.upper_is_unbounded()); + 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(den, g_coord.get_den(), ROUND_NOT_NEEDED); + lcm_assign(lcm, g_divisor, den); + exact_div_assign(factor, lcm, g_divisor); + g_expr *= factor; + exact_div_assign(factor, lcm, den); + assign_r(num, g_coord.get_num(), ROUND_NOT_NEEDED); + num *= factor; + g_expr += num * Variable(i); + g_divisor = lcm; + } + g = Generator::point(g_expr, g_divisor); + return true; +} + +template +bool +Box::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 +bool +Box::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 +inline bool +Box::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.marked_empty()) + return true; + if (x.marked_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 +bool +Box::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 +dimension_type +Box::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 +bool +Box::check_empty() const { + assert(!marked_empty()); + Box& x = const_cast&>(*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 +bool +Box::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 +bool +Box::is_topologically_closed() const { + if (!ITV::info_type::store_open || is_empty()) + return true; + + for (dimension_type k = seq.size(); k-- > 0; ) + if (!seq[k].is_topologically_closed()) + return false; + return true; +} + +template +bool +Box::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 +bool +Box::is_bounded() const { + if (is_empty()) + return true; + for (dimension_type k = seq.size(); k-- > 0; ) + if (seq[k].is_unbounded()) + return false; + return true; +} + +template +bool +Box::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 +bool +Box::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 +void +Box::unconstrain(const Variables_Set& to_be_unconstrained) { + // The cylindrification wrt no dimensions is a no-op. + // This case also captures the only legal cylindrification + // of a box in a 0-dim space. + if (to_be_unconstrained.empty()) + return; + + // Dimension-compatibility check. + const dimension_type min_space_dim = to_be_unconstrained.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 + // `to_be_unconstrained' before cylindrification. + for (Variables_Set::const_iterator tbu = to_be_unconstrained.begin(), + tbu_end = to_be_unconstrained.end(); tbu != tbu_end; ++tbu) { + ITV& seq_tbu = seq[*tbu]; + if (!seq_tbu.is_empty()) + seq_tbu.assign(UNIVERSE); + else { + set_empty(); + break; + } + } + assert(OK()); +} + +template +void +Box::topological_closure_assign() { + if (!ITV::info_type::store_open || is_empty()) + return; + + for (dimension_type k = seq.size(); k-- > 0; ) + seq[k].topological_closure_assign(); +} + +template +void +Box::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]); + + assert(x.OK()); +} + +template +void +Box::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.marked_empty()) + return; + if (x.marked_empty()) { + x = y; + return; + } + + for (dimension_type k = x.seq.size(); k-- > 0; ) + x.seq[k].join_assign(y.seq[k]); + + assert(x.OK()); +} + +template +void +Box::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; + + // 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)); + 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(x.seq)); + // Update the `empty_up_to_date' flag. + if (!y.status.test_empty_up_to_date()) + reset_empty_up_to_date(); + + assert(x.OK()); +} + +template +void +Box::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; + } + assert(OK()); +} + +template +bool +Box::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(); + 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. + assert(x.OK() && x.is_empty()); + return false; + } + + // Loop index `i' is intentionally going upwards. + dimension_type i = 0; + for ( ; i < num_dims; ++i) { + if (!x.seq[i].simplify_using_context_assign(y.seq[i])) { + 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); + assert(x.OK()); + return false; + } + } + assert(x.OK()); + return true; +} + +template +void +Box::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_unbounded()) + if (y_seq_i.lower_is_unbounded() || y_seq_i.lower() < 0) + x_seq_i.lower_set(UNBOUNDED); + if (!x_seq_i.upper_is_unbounded()) + if (y_seq_i.upper_is_unbounded() || y_seq_i.upper() > 0) + x_seq_i.upper_set(UNBOUNDED); + } + assert(x.OK()); +} + +template +inline void +Box::remove_space_dimensions(const Variables_Set& to_be_removed) { + // 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 (to_be_removed.empty()) { + assert(OK()); + return; + } + + const dimension_type old_space_dim = space_dimension(); + + // Dimension-compatibility check. + const dimension_type tbr_space_dim = to_be_removed.space_dimension(); + if (old_space_dim < tbr_space_dim) + throw_dimension_incompatible("remove_space_dimensions(vs)", + tbr_space_dim); + + const dimension_type new_space_dim = old_space_dim - to_be_removed.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); + 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 tbr = to_be_removed.begin(); + Variables_Set::const_iterator tbr_end = to_be_removed.end(); + dimension_type dst = *tbr; + dimension_type src = dst + 1; + for (++tbr; tbr != tbr_end; ++tbr) { + const dimension_type tbr_next = *tbr; + // All intervals in between are moved to the left. + while (src < tbr_next) + seq[dst++].swap(seq[src++]); + ++src; + } + // Moving the remaining intervals. + while (src < old_space_dim) + seq[dst++].swap(seq[src++]); + + assert(dst == new_space_dim); + seq.resize(new_space_dim); + + assert(OK()); +} + +template +void +Box::remove_higher_space_dimensions(const dimension_type new_dim) { + // Dimension-compatibility check: the variable having + // maximum index is the one occurring last in the set. + const dimension_type old_dim = space_dimension(); + if (new_dim > old_dim) + throw_dimension_incompatible("remove_higher_space_dimensions(nd)", + new_dim); + + // 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_dim == old_dim) { + assert(OK()); + return; + } + + seq.erase(seq.begin() + new_dim, seq.end()); + assert(OK()); +} + +template +template +void +Box::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 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)) + seq[i].swap(tmp.seq[new_i]); + } + swap(tmp); + assert(OK()); +} + +template +void +Box::fold_space_dimensions(const Variables_Set& to_be_folded, + const Variable var) { + const dimension_type space_dim = space_dimension(); + // `var' should be one of the dimensions of the box. + if (var.space_dimension() > space_dim) + throw_dimension_incompatible("fold_space_dimensions(tbf, v)", "v", var); + + // The folding of no dimensions is a no-op. + if (to_be_folded.empty()) + return; + + // All variables in `to_be_folded' should be dimensions of the box. + if (to_be_folded.space_dimension() > space_dim) + throw_dimension_incompatible("fold_space_dimensions(tbf, ...)", + to_be_folded.space_dimension()); + + // Moreover, `var.id()' should not occur in `to_be_folded'. + if (to_be_folded.find(var.id()) != to_be_folded.end()) + throw_generic("fold_space_dimensions(tbf, v)", + "v should not occur in tbf"); + + // Note: the check for emptiness is needed for correctness. + if (!is_empty()) { + // Join the interval corresponding to variable `var' with the intervals + // corresponding to the variables in `to_be_folded'. + ITV& seq_v = seq[var.id()]; + for (Variables_Set::const_iterator i = to_be_folded.begin(), + tbf_end = to_be_folded.end(); i != tbf_end; ++i) + seq_v.join_assign(seq[*i]); + } + remove_space_dimensions(to_be_folded); +} + +template +void +Box::add_constraint_no_check(const Constraint& c) { + const dimension_type c_space_dim = c.space_dimension(); + assert(c_space_dim <= 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 (!extract_interval_constraint(c, c_space_dim, c_num_vars, c_only_var)) + throw_generic("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 + && !Box::interval_type::info_type::store_open) + throw_generic("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; + } + + 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 +void +Box::add_constraints_no_check(const Constraint_System& cs) { + 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); + assert(OK()); +} + +template +void +Box::add_congruence_no_check(const Congruence& cg) { + const dimension_type cg_space_dim = cg.space_dimension(); + assert(cg_space_dim <= 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 + // FIXME: what about intervals with restrictions? + throw_generic("add_congruence(cg)", + "cg is a nontrivial proper congruence"); + } + + 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 (!extract_interval_congruence(cg, cg_space_dim, cg_num_vars, cg_only_var)) + throw_generic("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; + } + + 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 +void +Box::add_congruences_no_check(const Congruence_System& cgs) { + 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); + assert(OK()); +} + +template +void +Box::refine_no_check(const Constraint& c) { + const dimension_type c_space_dim = c.space_dimension(); + assert(c_space_dim <= space_dimension()); + assert(!marked_empty()); + + dimension_type c_num_vars = 0; + dimension_type c_only_var = 0; + // Non-interval constraints are ignored. + // FIXME: instead of ignoring, safely use propagate_no_check() + // (i.e., ensuring that no termination problem can arise). + if (!extract_interval_constraint(c, c_space_dim, c_num_vars, c_only_var)) + 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; + } + + 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 +void +Box::refine_no_check(const Constraint_System& cs) { + 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); + assert(OK()); +} + +template +void +Box::refine_no_check(const Congruence& cg) { + assert(!marked_empty()); + + const dimension_type cg_space_dim = cg.space_dimension(); + assert(cg_space_dim <= space_dimension()); + + if (cg.is_proper_congruence()) { + // FIXME: also deal with the case of interval with restrictions. + // A proper congruences is also an interval constraint + // if and only if it is trivial. + if (cg.is_inconsistent()) + set_empty(); + return; + } + + assert(cg.is_equality()); + dimension_type cg_num_vars = 0; + dimension_type cg_only_var = 0; + // Congruences that are not interval congruences are ignored. + if (!extract_interval_congruence(cg, cg_space_dim, cg_num_vars, cg_only_var)) + return; + + if (cg_num_vars == 0) { + // Dealing with a trivial congruence. + if (cg.inhomogeneous_term() != 0) + set_empty(); + return; + } + + assert(cg_num_vars == 1); + const Coefficient& n = cg.inhomogeneous_term(); + const Coefficient& d = cg.coefficient(Variable(cg_only_var)); + add_interval_constraint_no_check(cg_only_var, Constraint::EQUALITY, n, d); +} + +template +void +Box::refine_no_check(const Congruence_System& cgs) { + 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); + assert(OK()); +} + +#if 1 // Alternative implementations for propagate_constraint_no_check. +namespace { + +inline bool +propagate_constraint_check_result(Result r, Ternary& open) { + switch (r) { + case V_NEG_OVERFLOW: + case V_POS_OVERFLOW: + case V_UNKNOWN_NEG_OVERFLOW: + case V_UNKNOWN_POS_OVERFLOW: + 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: + assert(false); + return true; + } +} + +} // namespace + +template +void +Box::propagate_constraint_no_check(const Constraint& c) { + assert(c.space_dimension() <= space_dimension()); + + typedef + typename Select_Temp_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). + dimension_type last_k = c_space_dim; + for (dimension_type k = c_space_dim; k-- > 0; ) { + if (c.coefficient(Variable(k)) != 0) { + last_k = k; + break; + } + } + if (last_k == c_space_dim) { + // 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. + assert(last_k < c_space_dim); + Result r; + Temp_Boundary_Type t_bound; + Temp_Boundary_Type t_a; + Temp_Boundary_Type t_x; + Ternary open; + for (dimension_type k = last_k+1; k-- > 0; ) { + const Coefficient& a_k = c.coefficient(Variable(k)); + int sgn_a_k = sgn(a_k); + if (sgn_a_k == 0) + continue; + if (sgn_a_k > 0) { + open = (c_type == Constraint::STRICT_INEQUALITY) ? T_YES : T_NO; + if (open == T_NO) + maybe_reset_fpu_inexact(); + 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 (dimension_type i = last_k+1; i-- > 0; ) { + if (i == k) + continue; + const Coefficient& a_i = c.coefficient(Variable(i)); + int sgn_a_i = sgn(a_i); + if (sgn_a_i == 0) + continue; + ITV& x_i = seq[i]; + if (sgn_a_i < 0) { + if (x_i.lower_is_unbounded()) + 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 { + assert(sgn_a_i > 0); + if (x_i.upper_is_unbounded()) + 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() == 1) + open = T_YES; + seq[k].lower_narrow(t_bound, open == T_YES); + reset_empty_up_to_date(); + maybe_refine_upper_1: + if (c_type != Constraint::EQUALITY) + continue; + open = T_NO; + maybe_reset_fpu_inexact(); + 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 (dimension_type i = c_space_dim; i-- > 0; ) { + if (i == k) + continue; + const Coefficient& a_i = c.coefficient(Variable(i)); + int sgn_a_i = sgn(a_i); + if (sgn_a_i == 0) + continue; + ITV& x_i = seq[i]; + if (sgn_a_i < 0) { + if (x_i.upper_is_unbounded()) + 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 { + assert(sgn_a_i > 0); + if (x_i.lower_is_unbounded()) + 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() == 1) + open = T_YES; + seq[k].upper_narrow(t_bound, open == T_YES); + reset_empty_up_to_date(); + } + else { + assert(sgn_a_k < 0); + open = (c_type == Constraint::STRICT_INEQUALITY) ? T_YES : T_NO; + if (open == T_NO) + maybe_reset_fpu_inexact(); + 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 (dimension_type i = c_space_dim; i-- > 0; ) { + if (i == k) + continue; + const Coefficient& a_i = c.coefficient(Variable(i)); + int sgn_a_i = sgn(a_i); + if (sgn_a_i == 0) + continue; + ITV& x_i = seq[i]; + if (sgn_a_i < 0) { + if (x_i.lower_is_unbounded()) + 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 { + assert(sgn_a_i > 0); + if (x_i.upper_is_unbounded()) + 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() == 1) + open = T_YES; + seq[k].upper_narrow(t_bound, open == T_YES); + reset_empty_up_to_date(); + maybe_refine_upper_2: + if (c_type != Constraint::EQUALITY) + continue; + open = T_NO; + maybe_reset_fpu_inexact(); + 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 (dimension_type i = c_space_dim; i-- > 0; ) { + if (i == k) + continue; + const Coefficient& a_i = c.coefficient(Variable(i)); + int sgn_a_i = sgn(a_i); + if (sgn_a_i == 0) + continue; + ITV& x_i = seq[i]; + if (sgn_a_i < 0) { + if (x_i.upper_is_unbounded()) + 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 { + assert(sgn_a_i > 0); + if (x_i.lower_is_unbounded()) + 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() == 1) + open = T_YES; + seq[k].lower_narrow(t_bound, open == T_YES); + reset_empty_up_to_date(); + } + next_k: + ; + } +} + +#else // Alternative implementations for propagate_constraint_no_check. + +template +void +Box::propagate_constraint_no_check(const Constraint& c) { + 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 (dimension_type i = c_space_dim; i-- > 0; ) { + k[i] = c.coefficient(Variable(i)); + ITV& p_i = p[i]; + p_i = seq[i]; + p_i.mul_assign(p_i, k[i]); + } + const Coefficient& inhomogeneous_term = c.inhomogeneous_term(); + for (dimension_type i = c_space_dim; i-- > 0; ) { + int sgn_coefficient_i = sgn(c.coefficient(Variable(i))); + if (sgn_coefficient_i == 0) + continue; + ITV q(inhomogeneous_term); + for (dimension_type j = c_space_dim; j-- > 0; ) { + if (i == j) + continue; + q.add_assign(q, p[j]); + } + q.div_assign(q, k[i]); + 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].refine_existential(rel, q); + // FIXME: could/should we exploit the return value of refine_existential, + // in case it is available? + // FIMXE: 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].is_empty()) { + set_empty(); + break; + } + } + + assert(OK()); +} + +#endif // Alternative implementations for propagate_constraint_no_check. + +template +void +Box::propagate_constraints_no_check(const Constraint_System& cs) { + assert(cs.space_dimension() <= space_dimension()); + + bool changed; + do { + Sequence copy(seq); + for (Constraint_System::const_iterator i = cs.begin(), + cs_end = cs.end(); i != cs_end; ++i) + propagate_constraint_no_check(*i); + + // Check if the client has requested abandoning all expensive + // computations. If so, the exception specified by the client + // is thrown now. + maybe_abandon(); + + changed = (copy != seq); + } while (changed); +} + +template +void +Box::affine_image(const Variable var, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator) { + // The denominator cannot be zero. + if (denominator == 0) + throw_generic("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, temp0, temp1; + expr_value.assign(expr.inhomogeneous_term()); + for (dimension_type i = expr_space_dim; i-- > 0; ) { + const Coefficient& coeff = expr.coefficient(Variable(i)); + if (coeff != 0) { + temp0.assign(coeff); + temp1.assign(seq[i]); + 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); + + assert(OK()); +} + +template +void +Box::affine_preimage(const Variable var, + const Linear_Expression& expr, + Coefficient_traits::const_reference + denominator) { + // The denominator cannot be zero. + if (denominator == 0) + throw_generic("affine_preimage(v, e, d)", "d == 0"); + + // Dimension-compatibility checks. + 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, temp0, temp1; + expr_value.assign(expr.inhomogeneous_term()); + for (dimension_type i = expr_space_dim; i-- > 0; ) { + const Coefficient& coeff = expr.coefficient(Variable(i)); + if (coeff != 0) { + temp0.assign(coeff); + temp1.assign(seq[i]); + 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); + } + assert(OK()); +} + +template +void +Box +::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_generic("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_num); + PPL_DIRTY_TEMP(Coefficient, max_den); + bool max_included; + PPL_DIRTY_TEMP(Coefficient, min_num); + PPL_DIRTY_TEMP(Coefficient, min_den); + bool min_included; + ITV& seq_v = seq[var.id()]; + if (maximize(ub_expr, max_num, max_den, max_included)) { + if (minimize(lb_expr, min_num, min_den, 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_den *= denominator; + PPL_DIRTY_TEMP0(mpq_class, q); + assign_r(q.get_num(), min_num, ROUND_NOT_NEEDED); + assign_r(q.get_den(), min_den, ROUND_NOT_NEEDED); + q.canonicalize(); + (denominator > 0) + ? seq_v.lower_set(q, !min_included) + : seq_v.upper_set(q, !min_included); + // Now make the maximum of lb_expr the upper bound. If the + // maximum is not at a box point, then inequality is strict. + max_den *= denominator; + assign_r(q.get_num(), max_num, ROUND_NOT_NEEDED); + assign_r(q.get_den(), max_den, ROUND_NOT_NEEDED); + q.canonicalize(); + (denominator > 0) + ? seq_v.upper_set(q, !max_included) + : seq_v.lower_set(q, !max_included); + } + 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_TEMP0(mpq_class, q); + max_den *= denominator; + assign_r(q.get_num(), max_num, ROUND_NOT_NEEDED); + assign_r(q.get_den(), max_den, ROUND_NOT_NEEDED); + q.canonicalize(); + if (denominator > 0) { + seq_v.lower_set(UNBOUNDED); + seq_v.upper_set(q, !max_included); + } + else { + seq_v.upper_set(UNBOUNDED); + seq_v.lower_set(q, !max_included); + } + } + } + else if (minimize(lb_expr, min_num, min_den, 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_den *= denominator; + PPL_DIRTY_TEMP0(mpq_class, q); + assign_r(q.get_num(), min_num, ROUND_NOT_NEEDED); + assign_r(q.get_den(), min_den, ROUND_NOT_NEEDED); + q.canonicalize(); + if (denominator > 0) { + seq_v.upper_set(UNBOUNDED); + seq_v.lower_set(q, !min_included); + } + else { + seq_v.lower_set(UNBOUNDED); + seq_v.upper_set(q, !min_included); + } + } + 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.upper_set(UNBOUNDED); + seq_v.lower_set(UNBOUNDED); + } + } + assert(OK()); +} + +template +void +Box +::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_generic("bounded_affine_preimage(v, lb, ub, d)", "d == 0"); + + // Dimension-compatibility checks. + // `var' should be one of the dimensions of the polyhedron. + const dimension_type var_space_dim = var.space_dimension(); + if (space_dim < var_space_dim) + throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)", + "v", var); + // The dimension of `lb_expr' and `ub_expr' should not be + // greater than the dimension of `*this'. + const dimension_type lb_space_dim = lb_expr.space_dimension(); + if (space_dim < lb_space_dim) + throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub)", + "lb", lb_expr); + const dimension_type ub_space_dim = ub_expr.space_dimension(); + if (space_dim < ub_space_dim) + throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub)", + "ub", ub_expr); + + // Any preimage of an empty polyhedron is empty. + if (marked_empty()) + return; + + 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_unbounded(); + PPL_DIRTY_TEMP0(mpq_class, q_seq_var_lower); + PPL_DIRTY_TEMP(Coefficient, num_lower); + PPL_DIRTY_TEMP(Coefficient, den_lower); + if (!unbounded_lower) { + assign_r(q_seq_var_lower, seq_var.lower(), ROUND_NOT_NEEDED); + assign_r(num_lower, q_seq_var_lower.get_num(), ROUND_NOT_NEEDED); + assign_r(den_lower, q_seq_var_lower.get_den(), ROUND_NOT_NEEDED); + if (negative_denom) + neg_assign(den_lower, den_lower); + num_lower *= pos_denominator; + seq_var.lower_set(UNBOUNDED); + } + bool open_upper = seq_var.upper_is_open(); + bool unbounded_upper = seq_var.upper_is_unbounded(); + PPL_DIRTY_TEMP0(mpq_class, q_seq_var_upper); + PPL_DIRTY_TEMP(Coefficient, num_upper); + PPL_DIRTY_TEMP(Coefficient, den_upper); + if (!unbounded_upper) { + assign_r(q_seq_var_upper, seq_var.upper(), ROUND_NOT_NEEDED); + assign_r(num_upper, q_seq_var_upper.get_num(), ROUND_NOT_NEEDED); + assign_r(den_upper, q_seq_var_upper.get_den(), ROUND_NOT_NEEDED); + if (negative_denom) + neg_assign(den_upper, den_upper); + num_upper *= pos_denominator; + seq_var.upper_set(UNBOUNDED); + } + + 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, den_lower); + revised_lb_expr *= d; + revised_lb_expr += num_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, den); + if (minimize(revised_lb_expr, num_lower, den, included)) { + den_lower *= (den * ub_var_coeff); + PPL_DIRTY_TEMP0(mpq_class, q); + assign_r(q.get_num(), num_lower, ROUND_NOT_NEEDED); + assign_r(q.get_den(), den_lower, ROUND_NOT_NEEDED); + q.canonicalize(); + open_lower |= !included; + if ((ub_var_coeff >= 0) ? !negative_denom : negative_denom) + seq_var.lower_narrow(q, open_lower); + else + seq_var.upper_narrow(q, open_lower); + 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, den_upper); + revised_ub_expr *= d; + revised_ub_expr += num_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, den); + if (maximize(revised_ub_expr, num_upper, den, included)) { + den_upper *= (den * lb_var_coeff); + PPL_DIRTY_TEMP0(mpq_class, q); + assign_r(q.get_num(), num_upper, ROUND_NOT_NEEDED); + assign_r(q.get_den(), den_upper, ROUND_NOT_NEEDED); + q.canonicalize(); + open_upper |= !included; + if ((lb_var_coeff >= 0) ? !negative_denom : negative_denom) + seq_var.upper_narrow(q, open_upper); + else + seq_var.lower_narrow(q, open_upper); + 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); + } + + assert(OK()); +} + +template +void +Box +::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_generic("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_generic("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_set(UNBOUNDED); + break; + case LESS_THAN: + seq_var.lower_set(UNBOUNDED); + if (!seq_var.upper_is_unbounded()) + seq_var.refine_existential(LESS_THAN, seq_var.upper()); + break; + case GREATER_OR_EQUAL: + seq_var.upper_set(UNBOUNDED); + break; + case GREATER_THAN: + seq_var.upper_set(UNBOUNDED); + if (!seq_var.lower_is_unbounded()) + seq_var.refine_existential(GREATER_THAN, seq_var.lower()); + break; + default: + // The EQUAL and NOT_EQUAL cases have been already dealt with. + throw std::runtime_error("PPL internal error"); + } + assert(OK()); +} + +template +void +Box +::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_generic("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_generic("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. + throw std::runtime_error("PPL internal error"); + } + + // 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_num); + PPL_DIRTY_TEMP(Coefficient, max_den); + bool max_included; + bool bound_above = maximize(denominator*var, max_num, max_den, max_included); + PPL_DIRTY_TEMP(Coefficient, min_num); + PPL_DIRTY_TEMP(Coefficient, min_den); + bool min_included; + bool bound_below = minimize(denominator*var, min_num, min_den, 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/minimim value for `var'. + PPL_DIRTY_TEMP(Linear_Expression, revised_expr); + dimension_type dim = space_dim; + PPL_DIRTY_TEMP_COEFFICIENT(d); + if (corrected_relsym == LESS_THAN || corrected_relsym == LESS_OR_EQUAL) { + if (bound_below) { + for ( ; dim > 0; dim--) { + d = min_den * expr.coefficient(Variable(dim - 1)); + revised_expr += d * Variable(dim - 1); + } + } + } + else { + if (bound_above) { + for ( ; dim > 0; dim--) { + d = max_den * expr.coefficient(Variable(dim - 1)); + revised_expr += d * Variable(dim - 1); + } + } + } + + switch (corrected_relsym) { + case LESS_THAN: + if (bound_below) + refine_with_constraint(min_num < revised_expr); + break; + case LESS_OR_EQUAL: + if (bound_below) + (min_included) + ? refine_with_constraint(min_num <= revised_expr) + : refine_with_constraint(min_num < revised_expr); + break; + case GREATER_OR_EQUAL: + if (bound_above) + (max_included) + ? refine_with_constraint(max_num >= revised_expr) + : refine_with_constraint(max_num > revised_expr); + break; + case GREATER_THAN: + if (bound_above) + refine_with_constraint(max_num > revised_expr); + break; + default: + // The EQUAL and NOT_EQUAL cases have been already dealt with. + throw std::runtime_error("PPL internal error"); + } + // If the shrunk box is empty, its preimage is empty too. + if (is_empty()) + return; + ITV& seq_v = seq[var.id()]; + seq_v.lower_set(UNBOUNDED); + seq_v.upper_set(UNBOUNDED); + assert(OK()); +} + +template +void +Box +::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_generic("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_num); + PPL_DIRTY_TEMP(Coefficient, max_den); + bool max_included; + bool max_rhs = maximize(rhs, max_num, max_den, max_included); + PPL_DIRTY_TEMP(Coefficient, min_num); + PPL_DIRTY_TEMP(Coefficient, min_den); + bool min_included; + bool min_rhs = minimize(rhs, min_num, min_den, 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; + bool has_more_than_one_var = false; + // Initialization is just to avoid an annoying warning. + dimension_type has_var_id = 0; + for ( ; lhs_space_dim > 0; --lhs_space_dim) + if (lhs.coefficient(Variable(lhs_space_dim - 1)) != 0) { + if (has_var) { + ITV& seq_i = seq[lhs_space_dim - 1]; + seq_i.lower_set(UNBOUNDED); + seq_i.upper_set(UNBOUNDED); + has_more_than_one_var = true; + } + else { + has_var = true; + has_var_id = lhs_space_dim - 1; + } + } + + if (has_more_than_one_var) { + // There is more than one dimension with non-zero coefficient, so + // we cannot have any information about the dimensions in the lhs. + // 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_var = seq[has_var_id]; + seq_var.lower_set(UNBOUNDED); + seq_var.upper_set(UNBOUNDED); + 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_TEMP0(mpq_class, q_max); + PPL_DIRTY_TEMP0(mpq_class, q_min); + if (max_rhs) { + max_num -= inhomo * max_den; + max_den *= coeff; + assign_r(q_max.get_num(), max_num, ROUND_NOT_NEEDED); + assign_r(q_max.get_den(), max_den, ROUND_NOT_NEEDED); + q_max.canonicalize(); + } + if (min_rhs) { + min_num -= inhomo * min_den; + min_den *= coeff; + assign_r(q_min.get_num(), min_num, ROUND_NOT_NEEDED); + assign_r(q_min.get_den(), min_den, 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 +ve. + switch (relsym) { + case LESS_OR_EQUAL: + seq_var.lower_set(UNBOUNDED); + max_rhs + ? seq_var.upper_set(q_max, !max_included) + : seq_var.upper_set(UNBOUNDED); + break; + case LESS_THAN: + seq_var.lower_set(UNBOUNDED); + max_rhs + ? seq_var.upper_set(q_max, true) + : seq_var.upper_set(UNBOUNDED); + break; + case EQUAL: + max_rhs + ? seq_var.upper_set(q_max, !max_included) + : seq_var.upper_set(UNBOUNDED); + min_rhs + ? seq_var.lower_set(q_min, !min_included) + : seq_var.lower_set(UNBOUNDED); + break; + case GREATER_OR_EQUAL: + seq_var.upper_set(UNBOUNDED); + min_rhs + ? seq_var.lower_set(q_min, !min_included) + : seq_var.lower_set(UNBOUNDED); + break; + case GREATER_THAN: + seq_var.upper_set(UNBOUNDED); + min_rhs + ? seq_var.lower_set(q_min, true) + : seq_var.lower_set(UNBOUNDED); + break; + default: + // The NOT_EQUAL case has been already dealt with. + throw std::runtime_error("PPL internal error"); + } + else + // The coefficient of the dimension in the lhs is -ve. + switch (relsym) { + case GREATER_OR_EQUAL: + seq_var.lower_set(UNBOUNDED); + min_rhs + ? seq_var.upper_set(q_min, !min_included) + : seq_var.upper_set(UNBOUNDED); + break; + case GREATER_THAN: + seq_var.lower_set(UNBOUNDED); + min_rhs + ? seq_var.upper_set(q_min, true) + : seq_var.upper_set(UNBOUNDED); + break; + case EQUAL: + max_rhs + ? seq_var.lower_set(q_max, !max_included) + : seq_var.lower_set(UNBOUNDED); + min_rhs + ? seq_var.upper_set(q_min, !min_included) + : seq_var.upper_set(UNBOUNDED); + break; + case LESS_OR_EQUAL: + seq_var.upper_set(UNBOUNDED); + max_rhs + ? seq_var.lower_set(q_max, !max_included) + : seq_var.lower_set(UNBOUNDED); + break; + case LESS_THAN: + seq_var.upper_set(UNBOUNDED); + max_rhs + ? seq_var.lower_set(q_max, true) + : seq_var.lower_set(UNBOUNDED); + break; + default: + // The NOT_EQUAL case has been already dealt with. + throw std::runtime_error("PPL internal error"); + } + } + + 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. + throw std::runtime_error("PPL internal error"); + } + } + assert(OK()); +} + +template +void +Box::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_generic("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 (dimension_type d = lhs_space_dim; d-- > 0; ) { + const Variable& var = Variable(d); + if (lhs.coefficient(var) != 0) { + PPL_DIRTY_TEMP(Coefficient, temp); + temp = rhs.coefficient(var) + lhs.coefficient(var); + revised_rhs -= temp * var; + revised_lhs -= temp * var; + } + } + generalized_affine_image(revised_lhs, relsym, revised_rhs); + assert(OK()); +} + +template +template +void +Box::CC76_widening_assign(const Box& 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); + + assert(OK()); +} + +template +void +Box::CC76_widening_assign(const Box& 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 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 +void +Box::get_limiting_box(const Constraint_System& cs, + Box& limiting_box) const { + const dimension_type cs_space_dim = cs.space_dimension(); + // Private method: the caller has to ensure the following. + assert(cs_space_dim <= 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 (!extract_interval_constraint(c, cs_space_dim, 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 +void +Box::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; + +#ifndef NDEBUG + { + // We assume that `y' is contained in or equal to `*this'. + const Box x_copy = *this; + const Box y_copy = y; + assert(x_copy.contains(y_copy)); + } +#endif + + // If `*this' is empty, since `*this' contains `y', `y' is empty too. + if (marked_empty()) + return; + // If `y' is empty, we return. + if (y.marked_empty()) + return; + + // 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 +void +Box::CC76_narrowing_assign(const Box& y) { + const dimension_type space_dim = space_dimension(); + + // Dimension-compatibility check. + if (space_dim != y.space_dimension()) + throw_dimension_incompatible("CC76_narrowing_assign(y)", y); + +#ifndef NDEBUG + { + // We assume that `*this' is contained in or equal to `y'. + const Box x_copy = *this; + const Box y_copy = y; + assert(y_copy.contains(x_copy)); + } +#endif + + // 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_unbounded() + && !y_i.lower_is_unbounded() + && x_i.lower() != y_i.lower()) + x_i.lower() = y_i.lower(); + if (!x_i.upper_is_unbounded() + && !y_i.upper_is_unbounded() + && x_i.upper() != y_i.upper()) + x_i.upper() = y_i.upper(); + } + assert(OK()); +} + +template +Constraint_System +Box::constraints() const { + Constraint_System cs; + const dimension_type space_dim = space_dimension(); + if (space_dim == 0) { + if (marked_empty()) + cs = Constraint_System::zero_dim_empty(); + } + else if (marked_empty()) + cs.insert(0*Variable(space_dim-1) <= -1); + else { + // KLUDGE: in the future `cs' will be constructed of the right dimension. + // For the time being, we force the dimension with the following line. + cs.insert(0*Variable(space_dim-1) <= 0); + + for (dimension_type k = 0; k < space_dim; ++k) { + bool closed = false; + PPL_DIRTY_TEMP(Coefficient, n); + PPL_DIRTY_TEMP(Coefficient, d); + if (get_lower_bound(k, closed, n, d)) { + if (closed) + cs.insert(d*Variable(k) >= n); + else + cs.insert(d*Variable(k) > n); + } + if (get_upper_bound(k, closed, n, d)) { + if (closed) + cs.insert(d*Variable(k) <= n); + else + cs.insert(d*Variable(k) < n); + } + } + } + return cs; +} + +template +Constraint_System +Box::minimized_constraints() const { + Constraint_System cs; + const dimension_type space_dim = space_dimension(); + if (space_dim == 0) { + if (marked_empty()) + cs = Constraint_System::zero_dim_empty(); + } + // Make sure emptiness is detected. + else if (is_empty()) + cs.insert(0*Variable(space_dim-1) <= -1); + else { + // KLUDGE: in the future `cs' will be constructed of the right dimension. + // For the time being, we force the dimension with the following line. + cs.insert(0*Variable(space_dim-1) <= 0); + + for (dimension_type k = 0; k < space_dim; ++k) { + bool closed = false; + PPL_DIRTY_TEMP(Coefficient, n); + PPL_DIRTY_TEMP(Coefficient, d); + if (get_lower_bound(k, closed, n, d)) { + if (closed) + // Make sure equality constraints are detected. + if (seq[k].is_singleton()) { + cs.insert(d*Variable(k) == n); + continue; + } + else + cs.insert(d*Variable(k) >= n); + else + cs.insert(d*Variable(k) > n); + } + if (get_upper_bound(k, closed, n, d)) { + if (closed) + cs.insert(d*Variable(k) <= n); + else + cs.insert(d*Variable(k) < n); + } + } + } + return cs; +} + +template +Congruence_System +Box::congruences() const { + Congruence_System cgs; + const dimension_type space_dim = space_dimension(); + if (space_dim == 0) { + if (marked_empty()) + cgs = Congruence_System::zero_dim_empty(); + } + // Make sure emptiness is detected. + else if (is_empty()) + cgs.insert((0*Variable(space_dim-1) %= -1) / 0); + else { + // KLUDGE: in the future `cgs' will be constructed of the right dimension. + // For the time being, we force the dimension with the following line. + cgs.insert(0*Variable(space_dim-1) %= 0); + + for (dimension_type k = 0; k < space_dim; ++k) { + bool closed = false; + PPL_DIRTY_TEMP(Coefficient, n); + PPL_DIRTY_TEMP(Coefficient, d); + if (get_lower_bound(k, closed, n, d) && closed) + // Make sure equality congruences are detected. + if (seq[k].is_singleton()) + cgs.insert((d*Variable(k) %= n) / 0); + } + } + return cgs; +} + +template +memory_size_type +Box::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 +std::ostream& +IO_Operators::operator<<(std::ostream& s, const Box& 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 +void +Box::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) + +template +bool +Box::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. + assert(OK()); + return true; +} + +template +void +Box::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 +void +Box +::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 +void +Box::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 +void +Box::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 +void +Box::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 +void +Box::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 +void +Box::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 +void +Box::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 +void +Box::throw_expression_too_complex(const char* method, + const Linear_Expression& e) { + using namespace IO_Operators; + std::ostringstream s; + s << "PPL::Box::" << method << ":" << std::endl + << e << " is too complex."; + throw std::invalid_argument(s.str()); +} + +template +void +Box::throw_dimension_incompatible(const char* method, + const char* name_row, + const Linear_Expression& e) const { + std::ostringstream s; + s << "PPL::Box::" << method << ":" << std::endl + << "this->space_dimension() == " << space_dimension() + << ", " << name_row << "->space_dimension() == " + << e.space_dimension() << "."; + throw std::invalid_argument(s.str()); +} + +template +void +Box::throw_generic(const char* method, const char* reason) { + std::ostringstream s; + s << "PPL::Box::" << method << ":" << std::endl + << reason; + throw std::invalid_argument(s.str()); +} + +template +void +Box::throw_space_dimension_overflow(const char* method, + const char* reason) { + std::ostringstream s; + s << "PPL::Box::" << method << ":" << std::endl + << reason; + throw std::length_error(s.str()); +} + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \relates Box */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +bool +l_m_distance_assign(Checked_Number& r, + const Box& x, const Box& 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_unbounded()) { + if (!y_i.lower_is_unbounded()) + goto pinf; + } + else if (y_i.lower_is_unbounded()) + 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); + assert(sgn(tmp1) >= 0); + Specialization::combine(tmp0, tmp1, dir); + } + // Dealing with the lower bounds. + if (x_i.upper_is_unbounded()) + if (y_i.upper_is_unbounded()) + continue; + else + goto pinf; + else if (y_i.upper_is_unbounded()) + 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); + 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 2058. */ + +/* Automatically generated from PPL source file ../src/Rational_Box.hh line 28. */ + +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_Box; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/max_space_dimension.hh line 33. */ +#include + +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::max_space_dimension()); + d = std::min(d, BD_Shape::max_space_dimension()); + d = std::min(d, BD_Shape::max_space_dimension()); + d = std::min(d, BD_Shape::max_space_dimension()); + d = std::min(d, BD_Shape::max_space_dimension()); + d = std::min(d, BD_Shape::max_space_dimension()); + d = std::min(d, BD_Shape::max_space_dimension()); + d = std::min(d, BD_Shape::max_space_dimension()); + d = std::min(d, BD_Shape::max_space_dimension()); + d = std::min(d, Octagonal_Shape::max_space_dimension()); + d = std::min(d, Octagonal_Shape::max_space_dimension()); + d = std::min(d, Octagonal_Shape::max_space_dimension()); + d = std::min(d, Octagonal_Shape::max_space_dimension()); + d = std::min(d, Octagonal_Shape::max_space_dimension()); + d = std::min(d, Octagonal_Shape::max_space_dimension()); + d = std::min(d, Octagonal_Shape::max_space_dimension()); + d = std::min(d, Octagonal_Shape::max_space_dimension()); + d = std::min(d, Octagonal_Shape::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 +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 48. */ + +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 +std::ostream& +operator<<(std::ostream& s, const Partially_Reduced_Product& dp); + +} // namespace IO_Operators + +/*! \brief + Returns true 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 false is returned. +*/ +template +bool operator==(const Partially_Reduced_Product& x, + const Partially_Reduced_Product& y); + +/*! \brief + Returns true 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 true is returned. +*/ +template +bool operator!=(const Partially_Reduced_Product& x, + const Partially_Reduced_Product& 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 +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 +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 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 +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: + C_Polyhedron, + NNC_Polyhedron, + Grid, + Octagonal_Shape, + BD_Shape, + Box. + + An object of the class Partially_Reduced_Product + 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 No_Reduction class, + then the class Partially_Reduced_Product 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 is_universe() on both components returns true. + + \par + In all the examples it is assumed that the template \c R is the + No_Reduction 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 > + 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 > 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 > 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 > 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 +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::invalid_argument + Thrown if the system of congruences is imcompatible with one of the + components. + + \exception std::length_error + Thrown if the space dimension of \p cgs 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::invalid_argument + Thrown if the system of congruences is imcompatible with one of the + components. + + \exception std::length_error + Thrown if the space dimension of \p cgs 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::invalid_argument + Thrown if the system of constraints is imcompatible with one of the + components. + + \exception std::length_error + Thrown if the space dimension of \p cs 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::invalid_argument + Thrown if the system of constraints is imcompatible with one of the + components. + + \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 + Partially_Reduced_Product(const Box& 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 + Partially_Reduced_Product(const BD_Shape& 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 + Partially_Reduced_Product(const Octagonal_Shape& 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. + /*! + Builds a product containing \p y 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 y. + The product inherits the space dimension of y. + + \param y + The product to be approximated. + + \param complexity + The complexity that will not be exceeded. + + \exception std::length_error + Thrown if the space dimension of \p y exceeds the maximum allowed + space dimension. + + The built product is independent of the order of the components of \p y. + */ + template + explicit + Partially_Reduced_Product(const Partially_Reduced_Product& 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 is_included() + if and only if one or both of \p r1 and \p r2 imply + is_included(); + \p r implies saturates() + if and only if one or both of \p r1 and \p r2 imply + saturates(); + \p r implies is_disjoint() + if and only if one or both of \p r1 and \p r2 imply + is_disjoint(); + and \p r implies nothing() + if and only if both \p r1 and \p r2 imply + strictly_intersects(). + */ + 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 = subsumes() + if and only if \p r1 = \p r2 = subsumes(); + and \p r = nothing() + if and only if one or both of \p r1 and \p r2 = nothing(); + */ + Poly_Gen_Relation relation_with(const Generator& g) const; + + /*! \brief + Returns true if and only if either of the components + of \p *this are empty. + */ + bool is_empty() const; + + /*! \brief + Returns true if and only if both of the components + of \p *this are the universe. + */ + bool is_universe() const; + + /*! \brief + Returns true 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 true 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 true if and only if a component of \p *this + is discrete. + */ + bool is_discrete() const; + + /*! \brief + Returns true if and only if a component of \p *this + is bounded. + */ + bool is_bounded() const; + + /*! \brief + Returns true 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 true 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 true 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 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 + true 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, + false 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 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 + true if the supremum value can be reached in \p this. + + \param point + When maximization succeeds, will be assigned a generator 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, + false 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 true 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 + true 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, + false 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 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 + true if the infimum value can be reached in \p this. + + \param point + When minimization succeeds, will be assigned a generator 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, + false 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 true 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 true 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 to_be_unconstrained, + assigning the result to \p *this. + + \param to_be_unconstrained + 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 to_be_removed. + */ + void unconstrain(const Variables_Set& to_be_unconstrained); + + /*! \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, true + is returned, otherwise false 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 is a real widening for all the existing reduction + // operations. When new reductions are added, this must be rechecked. + + /*! \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 must 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); + + //@} // 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 max_space_dimension(). + */ + 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 max_space_dimension(). + */ + 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 and \ref Grid_Concatenate. + + \exception std::length_error + Thrown if the concatenation would cause the vector space + to exceed dimension max_space_dimension(). + */ + void concatenate_assign(const Partially_Reduced_Product& y); + + //! Removes all the specified dimensions from the vector space. + /*! + \param to_be_removed + The set of Variable objects corresponding to the space dimensions + to be removed. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with one of the + Variable objects contained in \p to_be_removed. + */ + void remove_space_dimensions(const Variables_Set& to_be_removed); + + /*! \brief + Removes the higher dimensions of the vector space so that the + resulting space will have dimension \p new_dimension. + + \exception std::invalid_argument + Thrown if \p new_dimensions is greater than the space dimension of + \p *this. + */ + void remove_higher_space_dimensions(dimension_type new_dimension); + + /*! \brief + Remaps the dimensions of the vector space according to + a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function". + + If \p pfunc maps only some of the dimensions of \p *this then the + rest will be projected away. + + If the highest dimension mapped to by \p pfunc is higher than the + highest dimension in \p *this then the number of dimensions in \p + *this will be increased to the highest dimension mapped to by \p + pfunc. + + \param pfunc + The partial function specifying the destiny of each space + dimension. + + The template class Partial_Function must provide the following + methods. + \code + bool has_empty_codomain() const + \endcode + returns true if and only if the represented partial + function has an empty codomain (i.e., it is always undefined). + The has_empty_codomain() method will always be called + before the methods below. However, if + has_empty_codomain() returns true, 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 max_in_codomain() 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 true is returned. If \f$f\f$ is + undefined in \f$k\f$, then false 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 + 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 max_space_dimension(). + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + and var 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 to_be_folded into \p var. + /*! + \param to_be_folded + The set of Variable objects corresponding to the space dimensions + to be folded; + + \param var + The variable corresponding to the space dimension that is the + destination of the folding operation. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with \p var or with + one of the Variable objects contained in \p to_be_folded. Also + thrown if \p var is contained in \p to_be_folded. + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + var has space dimension \f$k \leq n\f$, + \p to_be_folded is a set of variables whose maximum space dimension + is also less than or equal to \f$n\f$, and \p var is not a member + of \p to_be_folded, then the space dimensions corresponding to + variables in \p to_be_folded are + \ref 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& to_be_folded, Variable var); + + //@} // Member Functions that May Modify the Dimension of the Vector Space + + friend bool operator==<>(const Partially_Reduced_Product& x, + const Partially_Reduced_Product& y); + + friend std::ostream& + Parma_Polyhedra_Library::IO_Operators:: + operator<<<>(std::ostream& s, const Partially_Reduced_Product& 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 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 true if successful, false 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 x == y, + then x.hash_code() == y.hash_code(). + */ + int32_t hash_code() const; + + //@} // Miscellaneous Member Functions + + //! Reduce. + /* + \return + true 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 true 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; + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS + //! \name Exception Throwers + //@{ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +protected: + void throw_runtime_error(const char* method) const; + void throw_invalid_argument(const char* method, const char* reason) const; + + + // Note: it has to be a static method, because it can be called inside + // constructors (before actually constructing the polyhedron object). + static void throw_space_dimension_overflow(const char* method, + const char* reason); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS + //@} // Exception Throwers +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) + +}; + +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 Domain_Product::Direct_Product will simply + be denoted by Direct_Product. +*/ +template +class Domain_Product { +public: + typedef Partially_Reduced_Product > + Direct_Product; + + typedef Partially_Reduced_Product > + Smash_Product; + + typedef Partially_Reduced_Product > + Constraints_Product; +}; + +} // namespace Parma_Polyhedra_Library + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */ + template +void swap(Parma_Polyhedra_Library::Partially_Reduced_Product& x, + Parma_Polyhedra_Library::Partially_Reduced_Product& y); + +} // namespace std + +/* 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 31. */ + +namespace Parma_Polyhedra_Library { + +template +inline dimension_type +Partially_Reduced_Product::max_space_dimension() { + return std::min(D1::max_space_dimension(), D2::max_space_dimension()); +} + +template +inline +Partially_Reduced_Product +::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"), + 0), kind), + d2(num_dimensions, kind) { + set_reduced_flag(); +} + +template +inline +Partially_Reduced_Product +::Partially_Reduced_Product(const Congruence_System& ccgs) + : d1((ccgs.space_dimension() <= max_space_dimension()) + ? ccgs + : (throw_space_dimension_overflow + ("Partially_Reduced_Product(n, k)", + "the space dimension of ccgs " + "exceeds the maximum allowed " + "space dimension"), ccgs)), + d2(ccgs) { + clear_reduced_flag(); +} + +template +inline +Partially_Reduced_Product +::Partially_Reduced_Product(Congruence_System& cgs) + : d1((cgs.space_dimension() <= max_space_dimension()) + ? const_cast(cgs) + : (throw_space_dimension_overflow + ("Partially_Reduced_Product(n, k)", + "the space dimension of cgs " + "exceeds the maximum allowed " + "space dimension"), cgs)), + d2(cgs) { + clear_reduced_flag(); +} + +template +inline +Partially_Reduced_Product +::Partially_Reduced_Product(const Constraint_System& ccs) + : d1((ccs.space_dimension() <= max_space_dimension()) + ? ccs + : (throw_space_dimension_overflow + ("Partially_Reduced_Product(n, k)", + "the space dimension of ccs " + "exceeds the maximum allowed " + "space dimension"), ccs)), + d2(ccs) { + clear_reduced_flag(); +} + +template +inline +Partially_Reduced_Product +::Partially_Reduced_Product(Constraint_System& cs) + : d1((cs.space_dimension() <= max_space_dimension()) + ? const_cast(cs) + : (throw_space_dimension_overflow + ("Partially_Reduced_Product(n, k)", + "the space dimension of cs " + "exceeds the maximum allowed " + "space dimension"), cs)), + d2(cs) { + clear_reduced_flag(); +} + +template +inline +Partially_Reduced_Product +::Partially_Reduced_Product(const C_Polyhedron& ph, + Complexity_Class complexity) + : d1((ph.space_dimension() <= max_space_dimension()) + ? ph + : (throw_space_dimension_overflow + ("Partially_Reduced_Product(n, k)", + "the space dimension of ph " + "exceeds the maximum allowed " + "space dimension"), ph), complexity), + d2(ph, complexity) { + set_reduced_flag(); +} + +template +inline +Partially_Reduced_Product +::Partially_Reduced_Product(const NNC_Polyhedron& ph, + Complexity_Class complexity) + : d1((ph.space_dimension() <= max_space_dimension()) + ? ph + : (throw_space_dimension_overflow + ("Partially_Reduced_Product(n, k)", + "the space dimension of ph " + "exceeds the maximum allowed " + "space dimension"), ph), complexity), + d2(ph, complexity) { + set_reduced_flag(); +} + +template +inline +Partially_Reduced_Product +::Partially_Reduced_Product(const Grid& gr, Complexity_Class) + : d1((gr.space_dimension() <= max_space_dimension()) + ? gr + : (throw_space_dimension_overflow + ("Partially_Reduced_Product(n, k)", + "the space dimension of gr " + "exceeds the maximum allowed " + "space dimension"), gr)), + d2(gr) { + set_reduced_flag(); +} + +template +template +inline +Partially_Reduced_Product +::Partially_Reduced_Product(const Box& box, Complexity_Class) + : d1((box.space_dimension() <= max_space_dimension()) + ? box + : (throw_space_dimension_overflow + ("Partially_Reduced_Product(n, k)", + "the space dimension of box " + "exceeds the maximum allowed " + "space dimension"), box)), + d2(box) { + set_reduced_flag(); +} + +template +template +inline +Partially_Reduced_Product +::Partially_Reduced_Product(const BD_Shape& bd, Complexity_Class) + : d1((bd.space_dimension() <= max_space_dimension()) + ? bd + : (throw_space_dimension_overflow + ("Partially_Reduced_Product(n, k)", + "the space dimension of bd " + "exceeds the maximum allowed " + "space dimension"), bd)), + d2(bd) { + set_reduced_flag(); +} + +template +template +inline +Partially_Reduced_Product +::Partially_Reduced_Product(const Octagonal_Shape& os, Complexity_Class) + : d1((os.space_dimension() <= max_space_dimension()) + ? os + : (throw_space_dimension_overflow + ("Partially_Reduced_Product(n, k)", + "the space dimension of os " + "exceeds the maximum allowed " + "space dimension"), os)), + d2(os) { + set_reduced_flag(); +} + +template +inline +Partially_Reduced_Product +::Partially_Reduced_Product(const Partially_Reduced_Product& y, + Complexity_Class) + : d1(y.d1), d2(y.d2) { + reduced = y.reduced; +} + +template +inline +Partially_Reduced_Product::~Partially_Reduced_Product() { +} + +template +inline memory_size_type +Partially_Reduced_Product::external_memory_in_bytes() const { + return d1.external_memory_in_bytes() + d2.external_memory_in_bytes(); +} + +template +inline memory_size_type +Partially_Reduced_Product::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +template +inline dimension_type +Partially_Reduced_Product::space_dimension() const { + assert(d1.space_dimension() == d2.space_dimension()); + return d1.space_dimension(); +} + +template +inline dimension_type +Partially_Reduced_Product::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 +inline void +Partially_Reduced_Product +::unconstrain(const Variable var) { + reduce(); + d1.unconstrain(var); + d2.unconstrain(var); +} + +template +inline void +Partially_Reduced_Product +::unconstrain(const Variables_Set& to_be_unconstrained) { + reduce(); + d1.unconstrain(to_be_unconstrained); + d2.unconstrain(to_be_unconstrained); +} + +template +inline void +Partially_Reduced_Product +::intersection_assign(const Partially_Reduced_Product& y) { + d1.intersection_assign(y.d1); + d2.intersection_assign(y.d2); + clear_reduced_flag(); +} + +template +inline void +Partially_Reduced_Product +::difference_assign(const Partially_Reduced_Product& y) { + reduce(); + y.reduce(); + d1.difference_assign(y.d1); + d2.difference_assign(y.d2); + clear_reduced_flag(); +} + +template +inline void +Partially_Reduced_Product +::upper_bound_assign(const Partially_Reduced_Product& y) { + reduce(); + y.reduce(); + d1.upper_bound_assign(y.d1); + d2.upper_bound_assign(y.d2); + // CHECKME: if upper_bound_assign is not a least_upper_bound + // it may not be reduced. + // clear_reduced_flag(); +} + +template +inline bool +Partially_Reduced_Product +::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; + std::swap(d1,d1_copy); + return true; +} + +template +inline void +Partially_Reduced_Product +::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); +} + +template +inline void +Partially_Reduced_Product +::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); +} + +template +inline void +Partially_Reduced_Product +::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); +} + +template +inline void +Partially_Reduced_Product +::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); +} + +template +inline void +Partially_Reduced_Product +::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); +} + +template +inline void +Partially_Reduced_Product +::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); +} + + +template +inline void +Partially_Reduced_Product +::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 +inline void +Partially_Reduced_Product +::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 +inline void +Partially_Reduced_Product +::time_elapse_assign(const Partially_Reduced_Product& y) { + reduce(); + y.reduce(); + d1.time_elapse_assign(y.d1); + d2.time_elapse_assign(y.d2); +} + +template +inline void +Partially_Reduced_Product::topological_closure_assign() { + d1.topological_closure_assign(); + d2.topological_closure_assign(); +} + +template +inline void +Partially_Reduced_Product::swap(Partially_Reduced_Product& y) { + std::swap(d1, y.d1); + std::swap(d2, y.d2); + std::swap(reduced, y.reduced); +} + +template +inline void +Partially_Reduced_Product::add_constraint(const Constraint& c) { + d1.add_constraint(c); + d2.add_constraint(c); + clear_reduced_flag(); +} + +template +inline void +Partially_Reduced_Product::refine_with_constraint(const Constraint& c) { + d1.refine_with_constraint(c); + d2.refine_with_constraint(c); + clear_reduced_flag(); +} + +template +inline void +Partially_Reduced_Product::add_congruence(const Congruence& cg) { + d1.add_congruence(cg); + d2.add_congruence(cg); + clear_reduced_flag(); +} + +template +inline void +Partially_Reduced_Product::refine_with_congruence(const Congruence& cg) { + d1.refine_with_congruence(cg); + d2.refine_with_congruence(cg); + clear_reduced_flag(); +} + +template +inline void +Partially_Reduced_Product +::add_constraints(const Constraint_System& cs) { + d1.add_constraints(cs); + d2.add_constraints(cs); + clear_reduced_flag(); +} + +template +inline void +Partially_Reduced_Product +::refine_with_constraints(const Constraint_System& cs) { + d1.refine_with_constraints(cs); + d2.refine_with_constraints(cs); + clear_reduced_flag(); +} + +template +inline void +Partially_Reduced_Product +::add_congruences(const Congruence_System& cgs) { + d1.add_congruences(cgs); + d2.add_congruences(cgs); + clear_reduced_flag(); +} + +template +inline void +Partially_Reduced_Product +::refine_with_congruences(const Congruence_System& cgs) { + d1.refine_with_congruences(cgs); + d2.refine_with_congruences(cgs); + clear_reduced_flag(); +} + +template +inline Partially_Reduced_Product& +Partially_Reduced_Product +::operator=(const Partially_Reduced_Product& y) { + d1 = y.d1; + d2 = y.d2; + reduced = y.reduced; + return *this; +} + +template +inline const D1& +Partially_Reduced_Product::domain1() const { + reduce(); + return d1; +} + +template +inline const D2& +Partially_Reduced_Product::domain2() const { + reduce(); + return d2; +} + +template +inline bool +Partially_Reduced_Product::is_empty() const { + reduce(); + return d1.is_empty() || d2.is_empty(); +} + +template +inline bool +Partially_Reduced_Product::is_universe() const { + return d1.is_universe() && d2.is_universe(); +} + +template +inline bool +Partially_Reduced_Product::is_topologically_closed() const { + reduce(); + return d1.is_topologically_closed() && d2.is_topologically_closed(); +} + +template +inline bool +Partially_Reduced_Product +::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 +inline bool +Partially_Reduced_Product::is_discrete() const { + reduce(); + return d1.is_discrete() || d2.is_discrete(); +} + +template +inline bool +Partially_Reduced_Product::is_bounded() const { + reduce(); + return d1.is_bounded() || d2.is_bounded(); +} + +template +inline bool +Partially_Reduced_Product +::bounds_from_above(const Linear_Expression& expr) const { + reduce(); + return d1.bounds_from_above(expr) || d2.bounds_from_above(expr); +} + +template +inline bool +Partially_Reduced_Product +::bounds_from_below(const Linear_Expression& expr) const { + reduce(); + return d1.bounds_from_below(expr) || d2.bounds_from_below(expr); +} + +template +inline bool +Partially_Reduced_Product::constrains(Variable var) const { + reduce(); + return d1.constrains(var) || d2.constrains(var); +} + +template +inline void +Partially_Reduced_Product +::widening_assign(const Partially_Reduced_Product& y, + unsigned* tp) { + reduce(); + y.reduce(); + d1.widening_assign(y.d1, tp); + d2.widening_assign(y.d2, tp); +} + +template +inline void +Partially_Reduced_Product +::add_space_dimensions_and_embed(dimension_type m) { + d1.add_space_dimensions_and_embed(m); + d2.add_space_dimensions_and_embed(m); +} + +template +inline void +Partially_Reduced_Product +::add_space_dimensions_and_project(dimension_type m) { + d1.add_space_dimensions_and_project(m); + d2.add_space_dimensions_and_project(m); +} + +template +inline void +Partially_Reduced_Product +::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 +inline void +Partially_Reduced_Product +::remove_space_dimensions(const Variables_Set& to_be_removed) { + d1.remove_space_dimensions(to_be_removed); + d2.remove_space_dimensions(to_be_removed); +} + +template +inline void +Partially_Reduced_Product +::remove_higher_space_dimensions(dimension_type new_dimension) { + d1.remove_higher_space_dimensions(new_dimension); + d2.remove_higher_space_dimensions(new_dimension); +} + +template +template +inline void +Partially_Reduced_Product +::map_space_dimensions(const Partial_Function& pfunc) { + d1.map_space_dimensions(pfunc); + d2.map_space_dimensions(pfunc); +} + +template +inline void +Partially_Reduced_Product +::expand_space_dimension(Variable var, dimension_type m) { + d1.expand_space_dimension(var, m); + d2.expand_space_dimension(var, m); +} + +template +inline void +Partially_Reduced_Product +::fold_space_dimensions(const Variables_Set& to_be_folded, + Variable var) { + d1.fold_space_dimensions(to_be_folded, var); + d2.fold_space_dimensions(to_be_folded, var); +} + +template +inline bool +Partially_Reduced_Product +::contains(const Partially_Reduced_Product& y) const { + reduce(); + y.reduce(); + return d1.contains(y.d1) && d2.contains(y.d2); +} + +template +inline bool +Partially_Reduced_Product +::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 +inline bool +Partially_Reduced_Product::reduce() const { + Partially_Reduced_Product& dp + = const_cast(*this); + if (dp.is_reduced()) + return false; + R r; + r.product_reduce(dp.d1, dp.d2); + set_reduced_flag(); + return true; +} + +template +inline bool +Partially_Reduced_Product::is_reduced() const { + return reduced; +} + +template +inline void +Partially_Reduced_Product::clear_reduced_flag() const { + const_cast(*this).reduced = false; +} + +template +inline void +Partially_Reduced_Product::set_reduced_flag() const { + const_cast(*this).reduced = true; +} + +PPL_OUTPUT_3_PARAM_TEMPLATE_DEFINITIONS(D1, D2, R, Partially_Reduced_Product) + +template +inline void +Partially_Reduced_Product::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 +inline int32_t +Partially_Reduced_Product::hash_code() const { + return space_dimension() & 0x7fffffff; +} + +/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */ +template +inline bool +operator==(const Partially_Reduced_Product& x, + const Partially_Reduced_Product& y) { + x.reduce(); + y.reduce(); + return x.d1 == y.d1 && x.d2 == y.d2; +} + +/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */ +template +inline bool +operator!=(const Partially_Reduced_Product& x, + const Partially_Reduced_Product& y) { + return !(x == y); +} + +/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */ +template +inline std::ostream& +IO_Operators::operator<<(std::ostream& s, const Partially_Reduced_Product& pd) { + return s << "Domain 1:\n" + << pd.d1 + << "Domain 2:\n" + << pd.d2; +} + +template +void +Partially_Reduced_Product::throw_space_dimension_overflow(const char* method, + const char* reason) { + std::ostringstream s; + s << "Partially_Reduced_Product::" << method << ":" << std::endl + << reason << "."; + throw std::length_error(s.str()); +} + +} // namespace Parma_Polyhedra_Library + +namespace Parma_Polyhedra_Library { + +template +inline +No_Reduction::No_Reduction() { +} + +template +void No_Reduction::product_reduce(D1&, D2&) { +} + +template +inline +No_Reduction::~No_Reduction() { +} + +template +inline +Smash_Reduction::Smash_Reduction() { +} + +template +inline +Smash_Reduction::~Smash_Reduction() { +} + +template +inline +Constraints_Reduction::Constraints_Reduction() { +} + +template +inline +Constraints_Reduction::~Constraints_Reduction() { +} + +} // namespace Parma_Polyhedra_Library + +/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */ +template +inline void +std::swap(Parma_Polyhedra_Library::Partially_Reduced_Product& x, + Parma_Polyhedra_Library::Partially_Reduced_Product& y) { + x.swap(y); +} + +/* 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 30. */ +#include +#include + +namespace Parma_Polyhedra_Library { + +template +template +inline +Partially_Reduced_Product +::Partially_Reduced_Product(const Partially_Reduced_Product& y, + Complexity_Class complexity) + : d1((y.space_dimension() > max_space_dimension()) + ? (throw_space_dimension_overflow + ("Partially_Reduced_Product(y)", + "the space dimension of y " + "exceeds the maximum allowed " + "space dimension"), 0) + : y.space_dimension()), + d2(y.space_dimension()) { + Partially_Reduced_Product x1(y.domain1(), complexity); + const Partially_Reduced_Product x2(y.domain2(), complexity); + x1.intersection_assign(x2); + d1.swap(x1.d1); + d2.swap(x1.d2); + /* Even if y is reduced, the built product may not be reduced as + the reduction method may have changed (i.e., S != R). */ + reduced = false; +} + +template +Constraint_System +Partially_Reduced_Product::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 +Constraint_System +Partially_Reduced_Product::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 +Congruence_System +Partially_Reduced_Product::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 +Congruence_System +Partially_Reduced_Product::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 +void +Partially_Reduced_Product +::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 +void +Partially_Reduced_Product +::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 +Poly_Gen_Relation +Partially_Reduced_Product +::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 +Poly_Con_Relation +Partially_Reduced_Product +::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 +Poly_Con_Relation +Partially_Reduced_Product +::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 +bool +Partially_Reduced_Product +::maximize(const Linear_Expression& expr, + Coefficient& sup_n, + Coefficient& sup_d, + bool& maximum) const { + // If one component is already empty, then there is no need to reduce. + if (d1.is_empty() || d2.is_empty()) + return false; + + // The product is_empty() test also reduces the product. + if (is_empty()) + return false; + 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; + 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 +bool +Partially_Reduced_Product +::minimize(const Linear_Expression& expr, + Coefficient& inf_n, + Coefficient& inf_d, + bool& minimum) const { + // If one component is already empty, then there is no need to reduce. + if (d1.is_empty() || d2.is_empty()) + return false; + + // The product is_empty() test also reduces the product. + if (is_empty()) + return false; + 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 +bool +Partially_Reduced_Product +::maximize(const Linear_Expression& expr, + Coefficient& sup_n, + Coefficient& sup_d, + bool& maximum, + Generator& pnt) const { + // If one component is already empty, then there is no need to reduce. + if (d1.is_empty() || d2.is_empty()) + return false; + + // The product is_empty() test also reduces the product. + if (is_empty()) + return false; + 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 pnt1(point()); + Generator pnt2(point()); + bool r1 = d1.maximize(expr, sup1_n, sup1_d, maximum1, pnt1); + bool r2 = d2.maximize(expr, sup2_n, sup2_d, maximum2, pnt2); + // 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; + pnt = pnt2; + 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; + pnt = pnt1; + 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; + pnt = pnt1; + } + else { + sup_n = sup2_n; + sup_d = sup2_d; + maximum = maximum2; + pnt = pnt2; + } + return true; + } + +template +bool +Partially_Reduced_Product +::minimize(const Linear_Expression& expr, + Coefficient& inf_n, + Coefficient& inf_d, + bool& minimum, + Generator& pnt) const { + // If one component is already empty, then there is no need to reduce. + if (d1.is_empty() || d2.is_empty()) + return false; + + // The product is_empty() test also reduces the product. + if (is_empty()) + return false; + 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 pnt1(point()); + Generator pnt2(point()); + bool r1 = d1.minimize(expr, inf1_n, inf1_d, minimum1, pnt1); + bool r2 = d2.minimize(expr, inf2_n, inf2_d, minimum2, pnt2); + // 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; + pnt = pnt2; + 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; + pnt = pnt1; + 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; + pnt = pnt1; + } + else { + inf_n = inf2_n; + inf_d = inf2_d; + minimum = minimum2; + pnt = pnt2; + } + return true; + } + +template +inline bool +Partially_Reduced_Product::OK() const { + if (reduced) { + Partially_Reduced_Product pd1 = *this; + Partially_Reduced_Product pd2 = *this; + /* Force pd1 reduction */ + pd1.clear_reduced_flag(); + pd1.reduce(); + if (pd1 != pd2) + return false; + } + return d1.OK() && d2.OK(); +} + +template +bool +Partially_Reduced_Product::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); + return ((s >> str) && str == "Domain" + && (s >> str) && str == "1:" + && d1.ascii_load(s) + && (s >> str) && str == "Domain" + && (s >> str) && str == "2:" + && d2.ascii_load(s)); +} + +template +void Smash_Reduction::product_reduce(D1& d1, D2& d2) { + if (d2.is_empty()) { + if (!d1.is_empty()) { + D1 new_d1(d1.space_dimension(), EMPTY); + std::swap(d1, new_d1); + } + } + else if (d1.is_empty()) { + D2 new_d2(d2.space_dimension(), EMPTY); + std::swap(d2, new_d2); + } +} + +template +void Constraints_Reduction::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 sr; + sr.product_reduce(d1, d2); + return; + } + else { + d1.refine_with_constraints(d2.minimized_constraints()); + d2.refine_with_constraints(d1.minimized_constraints()); + } +} + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Partially_Reduced_Product.defs.hh line 1592. */ + +/* 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 +class Determinate; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/Determinate.defs.hh line 31. */ +#include +#include + +namespace Parma_Polyhedra_Library { + +/*! \brief + Returns true if and only if + \p x and \p y are the same domain element. + + \relates Determinate +*/ +template +bool operator==(const Determinate& x, const Determinate& y); + +/*! \brief + Returns true if and only if + \p x and \p y are different domain elements. + + \relates Determinate +*/ +template +bool operator!=(const Determinate& x, const Determinate& y); + +namespace IO_Operators { + +//! Output operator. +/*! \relates Parma_Polyhedra_Library::Determinate */ +template +std::ostream& +operator<<(std::ostream&, const Determinate&); + +} // namespace IO_Operators + +} // namespace Parma_Polyhedra_Library + +//! Wraps a PPL class into a determinate constraint system interface. +/*! \ingroup PPL_CXX_interface */ +template +class Parma_Polyhedra_Library::Determinate { +public: + //! \name Constructors and Destructor + //@{ + + /*! \brief + Injection operator: builds the determinate constraint system element + corresponding to the base-level element \p p. + */ + Determinate(const PS& p); + + /*! \brief + Injection operator: builds the determinate constraint system element + corresponding to the base-level element represented by \p cs. + */ + Determinate(const Constraint_System& cs); + + //! \brief + //! Injection operator: builds the determinate constraint system element + //! corresponding to the base-level element represented by \p cgs. + Determinate(const Congruence_System& cgs); + + //! Copy constructor. + Determinate(const Determinate& y); + + //! Destructor. + ~Determinate(); + + //@} // Constructors and Destructor + + //! \name Member Functions that Do Not Modify the Domain Element + //@{ + + //! Returns a const reference to the embedded element. + const PS& element() const; + + /*! \brief + Returns true if and only if \p *this is the top of the + determinate constraint system (i.e., the whole vector space). + */ + bool is_top() const; + + /*! \brief + Returns true if and only if \p *this is the bottom + of the determinate constraint system. + */ + bool is_bottom() const; + + //! Returns true if and only if \p *this entails \p y. + bool definitely_entails(const Determinate& y) const; + + /*! \brief + Returns true if and only if \p *this and \p y + are equivalent. + */ + bool is_definitely_equivalent_to(const Determinate& y) const; + + /*! \brief + Returns a lower bound to the total size in bytes of the memory + occupied by \p *this. + */ + memory_size_type total_memory_in_bytes() const; + + /*! \brief + Returns a lower bound to the size in bytes of the memory + managed by \p *this. + */ + memory_size_type external_memory_in_bytes() const; + + /*! + Returns true 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. + PS& element(); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS + /*! \brief + On return from this method, the representation of \p *this + is not shared by different Determinate objects. + */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) + void mutate(); + + //! Assignment operator. + Determinate& operator=(const Determinate& y); + + //! Swaps \p *this with \p y. + void swap(Determinate& y); + + //@} // Member Functions that May Modify the Domain Element + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS + //! A function adapter for the Determinate class. + /*! \ingroup PPL_CXX_interface + It lifts a Binary_Operator_Assign function object, taking arguments + of type PS, producing the corresponding function object taking + arguments of type Determinate. + + The template parameter Binary_Operator_Assign is supposed to + implement an apply and assign function, i.e., a function + having signature void foo(PS& x, const PS& y) 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 + std::mem_fun_ref(&C_Polyhedron::intersection_assign). + */ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) + template + 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 + static Binary_Operator_Assign_Lifter + lift_op_assign(Binary_Operator_Assign op_assign); + +private: + //! The possibly shared representation of a Determinate object. + /*! \ingroup PPL_CXX_interface + By adopting the copy-on-write technique, a single + representation of the base-level object may be shared by more than + one object of the class Determinate. + */ + class Rep { + private: + /*! \brief + Count the number of references: + - 0: leaked, \p ph is non-const; + - 1: one reference, \p ph is non-const; + - > 1: more than one reference, \p ph is const. + */ + mutable unsigned long references; + + //! Private and unimplemented: assignment not allowed. + Rep& operator=(const Rep& y); + + //! Private and unimplemented: copies not allowed. + Rep(const Rep& y); + + //! Private and unimplemented: default construction not allowed. + Rep(); + + public: + //! A possibly shared base-level domain element. + PS ph; + + /*! \brief + Builds a new representation by creating a domain element + of the specified kind, in the specified vector space. + */ + Rep(dimension_type num_dimensions, Degenerate_Element kind); + + //! Builds a new representation by copying base-level element \p p. + Rep(const PS& 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 true 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==(const Determinate& x, const Determinate& y); + friend bool + operator!=(const Determinate& x, const Determinate& y); +}; + + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Determinate */ +template +void swap(Parma_Polyhedra_Library::Determinate& x, + Parma_Polyhedra_Library::Determinate& y); + +} // namespace std + +/* Automatically generated from PPL source file ../src/Determinate.inlines.hh line 1. */ +/* Determinate class implementation: inline functions. +*/ + + +#include + +namespace Parma_Polyhedra_Library { + +template +inline +Determinate::Rep::Rep(dimension_type num_dimensions, + Degenerate_Element kind) + : references(0), ph(num_dimensions, kind) { +} + +template +inline +Determinate::Rep::Rep(const PS& p) + : references(0), ph(p) { +} + +template +inline +Determinate::Rep::Rep(const Constraint_System& cs) + : references(0), ph(cs) { +} + +template +inline +Determinate::Rep::Rep(const Congruence_System& cgs) + : references(0), ph(cgs) { +} + +template +inline +Determinate::Rep::~Rep() { + assert(references == 0); +} + +template +inline void +Determinate::Rep::new_reference() const { + ++references; +} + +template +inline bool +Determinate::Rep::del_reference() const { + return --references == 0; +} + +template +inline bool +Determinate::Rep::is_shared() const { + return references > 1; +} + +template +inline memory_size_type +Determinate::Rep::external_memory_in_bytes() const { + return ph.external_memory_in_bytes(); +} + +template +inline memory_size_type +Determinate::Rep::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +template +inline +Determinate::Determinate(const PS& ph) + : prep(new Rep(ph)) { + prep->new_reference(); +} + +template +inline +Determinate::Determinate(const Constraint_System& cs) + : prep(new Rep(cs)) { + prep->new_reference(); +} + +template +inline +Determinate::Determinate(const Congruence_System& cgs) + : prep(new Rep(cgs)) { + prep->new_reference(); +} + +template +inline +Determinate::Determinate(const Determinate& y) + : prep(y.prep) { + prep->new_reference(); +} + +template +inline +Determinate::~Determinate() { + if (prep->del_reference()) + delete prep; +} + +template +inline Determinate& +Determinate::operator=(const Determinate& y) { + y.prep->new_reference(); + if (prep->del_reference()) + delete prep; + prep = y.prep; + return *this; +} + +template +inline void +Determinate::swap(Determinate& y) { + std::swap(prep, y.prep); +} + +template +inline void +Determinate::mutate() { + if (prep->is_shared()) { + Rep* new_prep = new Rep(prep->ph); + (void) prep->del_reference(); + new_prep->new_reference(); + prep = new_prep; + } +} + +template +inline const PS& +Determinate::element() const { + return prep->ph; +} + +template +inline PS& +Determinate::element() { + mutate(); + return prep->ph; +} + +template +inline void +Determinate::upper_bound_assign(const Determinate& y) { + element().upper_bound_assign(y.element()); +} + +template +inline void +Determinate::meet_assign(const Determinate& y) { + element().intersection_assign(y.element()); +} + +template +inline bool +Determinate::has_nontrivial_weakening() { + // FIXME: the following should be turned into a query to PS. This + // can be postponed until the time the ask-and-tell construction is + // revived. + return false; +} + +template +inline void +Determinate::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. + element().difference_assign(y.element()); +} + +template +inline void +Determinate::concatenate_assign(const Determinate& y) { + element().concatenate_assign(y.element()); +} + +template +inline bool +Determinate::definitely_entails(const Determinate& y) const { + return prep == y.prep || y.prep->ph.contains(prep->ph); +} + +template +inline bool +Determinate::is_definitely_equivalent_to(const Determinate& y) const { + return prep == y.prep || prep->ph == y.prep->ph; +} + +template +inline bool +Determinate::is_top() const { + return prep->ph.is_universe(); +} + +template +inline bool +Determinate::is_bottom() const { + return prep->ph.is_empty(); +} + +template +inline memory_size_type +Determinate::external_memory_in_bytes() const { + return prep->total_memory_in_bytes(); +} + +template +inline memory_size_type +Determinate::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +template +inline bool +Determinate::OK() const { + return prep->ph.OK(); +} + +namespace IO_Operators { + +/*! \relates Parma_Polyhedra_Library::Determinate */ +template +inline std::ostream& +operator<<(std::ostream& s, const Determinate& x) { + s << x.element(); + return s; +} + +} // namespace IO_Operators + +/*! \relates Determinate */ +template +inline bool +operator==(const Determinate& x, const Determinate& y) { + return x.prep == y.prep || x.prep->ph == y.prep->ph; +} + +/*! \relates Determinate */ +template +inline bool +operator!=(const Determinate& x, const Determinate& y) { + return x.prep != y.prep && x.prep->ph != y.prep->ph; +} + +template +template +inline +Determinate::Binary_Operator_Assign_Lifter:: +Binary_Operator_Assign_Lifter(Binary_Operator_Assign op_assign) + : op_assign_(op_assign) { +} + +template +template +inline void +Determinate::Binary_Operator_Assign_Lifter:: +operator()(Determinate& x, const Determinate& y) const { + op_assign_(x.element(), y.element()); +} + +template +template +inline +Determinate::Binary_Operator_Assign_Lifter +Determinate::lift_op_assign(Binary_Operator_Assign op_assign) { + return Binary_Operator_Assign_Lifter(op_assign); +} + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Determinate */ +template +inline void +swap(Parma_Polyhedra_Library::Determinate& x, + Parma_Polyhedra_Library::Determinate& y) { + x.swap(y); +} + +} // namespace std + +/* Automatically generated from PPL source file ../src/Determinate.defs.hh line 324. */ + +/* 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 +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 +class iterator_to_const; + +template +class const_iterator_to_const; + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/iterator_to_const.defs.hh line 28. */ +//#include "Ask_Tell.types.hh" +#include + +#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 read-only + iterator on the sequence of objects Container. + By using this iterator class it is not possible to modify the objects + contained in Container; rather, object modification has + to be implemented by object replacement, i.e., by using the methods + provided by Container 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 +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 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; + template friend class Powerset; + //template friend class Ask_Tell; + +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 true if and only if + \p *this and \p y are identical. + */ + bool operator==(const iterator_to_const& y) const; + + /*! \brief + Returns true 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 +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 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; + template friend class Powerset; + //template friend class Ask_Tell; + +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& 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 true if and only if + \p *this and \p y are identical. + */ + bool operator==(const const_iterator_to_const& y) const; + + /*! \brief + Returns true 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 true 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 +bool +operator==(const iterator_to_const& x, + const const_iterator_to_const& y); + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +/*! \brief + Mixed comparison operator: returns true 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 +bool +operator!=(const iterator_to_const& x, + const const_iterator_to_const& 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 +inline +iterator_to_const::iterator_to_const() + : base() { +} + +template +inline +iterator_to_const::iterator_to_const(const iterator_to_const& y) + : base(y.base) { +} + +template +inline +iterator_to_const::iterator_to_const(const Base& b) + : base(b) { +} + +template +inline typename iterator_to_const::reference +iterator_to_const::operator*() const { + return *base; +} + +template +inline typename iterator_to_const::pointer +iterator_to_const::operator->() const { + return &*base; +} + +template +inline iterator_to_const& +iterator_to_const::operator++() { + ++base; + return *this; +} + +template +inline iterator_to_const +iterator_to_const::operator++(int) { + iterator_to_const tmp = *this; + operator++(); + return tmp; +} + +template +inline iterator_to_const& +iterator_to_const::operator--() { + --base; + return *this; +} + +template +inline iterator_to_const +iterator_to_const::operator--(int) { + iterator_to_const tmp = *this; + operator--(); + return tmp; +} + +template +inline bool +iterator_to_const::operator==(const iterator_to_const& y) const { + return base == y.base; +} + +template +inline bool +iterator_to_const::operator!=(const iterator_to_const& y) const { + return !operator==(y); +} + +template +inline +const_iterator_to_const::const_iterator_to_const() + : base() { +} + +template +inline +const_iterator_to_const +::const_iterator_to_const(const const_iterator_to_const& y) + : base(y.base) { +} + +template +inline +const_iterator_to_const::const_iterator_to_const(const Base& b) + : base(b) { +} + +template +inline typename const_iterator_to_const::reference +const_iterator_to_const::operator*() const { + return *base; +} + +template +inline typename const_iterator_to_const::pointer +const_iterator_to_const::operator->() const { + return &*base; +} + +template +inline const_iterator_to_const& +const_iterator_to_const::operator++() { + ++base; + return *this; +} + +template +inline const_iterator_to_const +const_iterator_to_const::operator++(int) { + const_iterator_to_const tmp = *this; + operator++(); + return tmp; +} + +template +inline const_iterator_to_const& +const_iterator_to_const::operator--() { + --base; + return *this; +} + +template +inline const_iterator_to_const +const_iterator_to_const::operator--(int) { + const_iterator_to_const tmp = *this; + operator--(); + return tmp; +} + +template +inline bool +const_iterator_to_const +::operator==(const const_iterator_to_const& y) const { + return base == y.base; +} + +template +inline bool +const_iterator_to_const +::operator!=(const const_iterator_to_const& y) const { + return !operator==(y); +} + +template +inline +const_iterator_to_const +::const_iterator_to_const(const iterator_to_const& y) + : base(y.base) { +} + +/*! \relates const_iterator_to_const */ +template +inline bool +operator==(const iterator_to_const& x, + const const_iterator_to_const& y) { + return const_iterator_to_const(x).operator==(y); +} + +/*! \relates const_iterator_to_const */ +template +inline bool +operator!=(const iterator_to_const& x, + const const_iterator_to_const& y) { + return !(x == y); +} + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/iterator_to_const.defs.hh line 221. */ + +/* Automatically generated from PPL source file ../src/Powerset.defs.hh line 29. */ +#include +#include +#include + +namespace Parma_Polyhedra_Library { + +//! Returns true if and only if \p x and \p y are equivalent. +/*! \relates Powerset */ +template +bool +operator==(const Powerset& x, const Powerset& y); + +//! Returns true if and only if \p x and \p y are not equivalent. +/*! \relates Powerset */ +template +bool +operator!=(const Powerset& x, const Powerset& y); + +namespace IO_Operators { + +//! Output operator. +/*! \relates Parma_Polyhedra_Library::Powerset */ +template +std::ostream& +operator<<(std::ostream& s, const Powerset& 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 + powerset 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 read-only, meaning + that the disjuncts cannot be overwritten. Rather, by using the class + iterator, 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 +void +drop_subsumed(Powerset& ps, const D& d) { + for (typename Powerset::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 true if and only if the instance of D is the top + element of the domain. + \code + bool is_bottom() const + \endcode + Returns true 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 true if the instance of D definitely entails + y. Returns false if the instance may not + entail y (i.e., if the instance does not entail + y 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 + y. + \code + void meet_assign(const D& y) + \endcode + Assigns to the instance of D the meet of the instance and + y. + \code + bool OK() const + \endcode + Returns true if the instance of D is in a consistent + state, else returns false. + + 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 + s. + \code + operator==(const D& x, const D& y) + \endcode + Returns true if and only if x and + y are equivalent D's. + \code + operator!=(const D& x, const D& y) + \endcode + Returns true if and only if x and + y are different D's. +*/ +template +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 true if \p *this definitely entails \p y. + Returns false 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 true 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 true 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 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 true, \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 read-only 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 + drop_disjunct(iterator position) and + drop_disjuncts(iterator first, iterator last), + while still ensuring a correct handling of Omega-reduction. + */ + typedef iterator_to_const iterator; + + //! A bidirectional %const_iterator on the disjuncts of a Powerset element. + typedef const_iterator_to_const const_iterator; + + //! The reverse iterator type built from Powerset::iterator. + typedef std::reverse_iterator reverse_iterator; + + //! The reverse iterator type built from Powerset::const_iterator. + typedef std::reverse_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 const 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 true 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 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 true 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 + 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 true 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); +}; + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Powerset */ +template +void swap(Parma_Polyhedra_Library::Powerset& x, + Parma_Polyhedra_Library::Powerset& y); + +} // namespace std + +/* Automatically generated from PPL source file ../src/Powerset.inlines.hh line 1. */ +/* Powerset class implementation: inline functions. +*/ + + +#include +#include + +namespace Parma_Polyhedra_Library { + +template +inline typename Powerset::iterator +Powerset::begin() { + return sequence.begin(); +} + +template +inline typename Powerset::iterator +Powerset::end() { + return sequence.end(); +} + +template +inline typename Powerset::const_iterator +Powerset::begin() const { + return sequence.begin(); +} + +template +inline typename Powerset::const_iterator +Powerset::end() const { + return sequence.end(); +} + +template +inline typename Powerset::reverse_iterator +Powerset::rbegin() { + return reverse_iterator(end()); +} + +template +inline typename Powerset::reverse_iterator +Powerset::rend() { + return reverse_iterator(begin()); +} + +template +inline typename Powerset::const_reverse_iterator +Powerset::rbegin() const { + return const_reverse_iterator(end()); +} + +template +inline typename Powerset::const_reverse_iterator +Powerset::rend() const { + return const_reverse_iterator(begin()); +} + +template +inline typename Powerset::size_type +Powerset::size() const { + return sequence.size(); +} + +template +inline bool +Powerset::empty() const { + return sequence.empty(); +} + +template +inline typename Powerset::iterator +Powerset::drop_disjunct(iterator position) { + return sequence.erase(position.base); +} + +template +inline void +Powerset::drop_disjuncts(iterator first, iterator last) { + sequence.erase(first.base, last.base); +} + +template +inline void +Powerset::clear() { + sequence.clear(); +} + +template +inline +Powerset::Powerset(const Powerset& y) + : sequence(y.sequence), reduced(y.reduced) { +} + +template +inline Powerset& +Powerset::operator=(const Powerset& y) { + sequence = y.sequence; + reduced = y.reduced; + return *this; +} + +template +inline void +Powerset::swap(Powerset& y) { + std::swap(sequence, y.sequence); + std::swap(reduced, y.reduced); +} + +template +inline +Powerset::Powerset() + : sequence(), reduced(true) { +} + +template +inline +Powerset::Powerset(const D& d) + : sequence(), reduced(false) { + sequence.push_back(d); + assert(OK()); +} + +template +inline +Powerset::~Powerset() { +} + +template +inline void +Powerset::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 +inline void +Powerset::add_disjunct(const D& d) { + sequence.push_back(d); + reduced = false; +} + +/*! \relates Powerset */ +template +inline +bool operator!=(const Powerset& x, const Powerset& y) { + return !(x == y); +} + +template +inline bool +Powerset::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 +inline bool +Powerset::is_bottom() const { + // Must perform omega-reduction for correctness. + omega_reduce(); + return empty(); +} + +template +inline void +Powerset::collapse() { + if (!empty()) + collapse(sequence.begin()); +} + +template +inline void +Powerset::meet_assign(const Powerset& y) { + pairwise_apply_assign(y, std::mem_fun_ref(&D::meet_assign)); +} + +template +inline void +Powerset::upper_bound_assign(const Powerset& y) { + least_upper_bound_assign(y); +} + +template +inline bool +Powerset::upper_bound_assign_if_exact(const Powerset& y) { + least_upper_bound_assign(y); + return true; +} + +template +inline memory_size_type +Powerset::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Powerset */ +template +inline void +swap(Parma_Polyhedra_Library::Powerset& x, + Parma_Polyhedra_Library::Powerset& y) { + x.swap(y); +} + +} // namespace std + +/* Automatically generated from PPL source file ../src/Powerset.templates.hh line 1. */ +/* Powerset class implementation: non-inline template functions. +*/ + + +/* Automatically generated from PPL source file ../src/Powerset.templates.hh line 27. */ +#include +#include +#include + +namespace Parma_Polyhedra_Library { + +template +void +Powerset::collapse(const Sequence_iterator sink) { + assert(sink != sequence.end()); + D& d = *sink; + iterator x_sink = sink; + iterator next_x_sink = x_sink; + ++next_x_sink; + iterator x_end = end(); + for (const_iterator xi = next_x_sink; xi != x_end; ++xi) + d.upper_bound_assign(*xi); + // Drop the surplus disjuncts. + drop_disjuncts(next_x_sink, x_end); + + // Ensure omega-reduction. + for (iterator xi = begin(); xi != x_sink; ) + if (xi->definitely_entails(d)) + xi = drop_disjunct(xi); + else + ++xi; + + assert(OK()); +} + +template +void +Powerset::omega_reduce() const { + if (reduced) + return; + + Powerset& x = const_cast(*this); + // First remove all bottom elements. + for (iterator xi = x.begin(), x_end = x.end(); xi != x_end; ) + if (xi->is_bottom()) + xi = x.drop_disjunct(xi); + else + ++xi; + // Then remove non-maximal elements. + for (iterator xi = x.begin(); xi != x.end(); ) { + const D& xv = *xi; + bool dropping_xi = false; + for (iterator yi = x.begin(); yi != x.end(); ) + if (xi == yi) + ++yi; + else { + const D& yv = *yi; + if (yv.definitely_entails(xv)) + yi = x.drop_disjunct(yi); + else if (xv.definitely_entails(yv)) { + dropping_xi = true; + break; + } + else + ++yi; + } + if (dropping_xi) + xi = x.drop_disjunct(xi); + else + ++xi; + if (abandon_expensive_computations && xi != x.end()) { + // Hurry up! + x.collapse(xi.base); + break; + } + } + reduced = true; + assert(OK()); +} + +template +void +Powerset::collapse(const unsigned max_disjuncts) { + assert(max_disjuncts > 0); + // Omega-reduce before counting the number of disjuncts. + omega_reduce(); + size_type n = size(); + if (n > max_disjuncts) { + // Let `i' point to the last disjunct that will survive. + iterator i = begin(); + std::advance(i, max_disjuncts-1); + // This disjunct will be assigned an upper-bound of itself and of + // all the disjuncts that follow. + collapse(i.base); + } + assert(OK()); + assert(is_omega_reduced()); +} + +template +bool +Powerset::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 +bool +Powerset::is_omega_reduced() const { + if (!reduced && check_omega_reduced()) + reduced = true; + return reduced; +} + +template +typename Powerset::iterator +Powerset::add_non_bottom_disjunct_preserve_reduction(const D& d, + iterator first, + iterator last) { + assert(!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); + assert(OK()); + return first; +} + +template +bool +Powerset::definitely_entails(const Powerset& y) const { + const Powerset& 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 +bool +operator==(const Powerset& x, const Powerset& y) { + x.omega_reduce(); + y.omega_reduce(); + if (x.size() != y.size()) + return false; + // Take a copy of `y' and work with it. + Powerset yy = y; + for (typename Powerset::const_iterator xi = x.begin(), + x_end = x.end(); xi != x_end; ++xi) { + typename Powerset::iterator yyi = yy.begin(); + typename Powerset::iterator yy_end = yy.end(); + yyi = std::find(yyi, yy_end, *xi); + if (yyi == yy_end) + return false; + else + yy.drop_disjunct(yyi); + } + return true; +} + +template +template +void +Powerset::pairwise_apply_assign(const Powerset& y, + Binary_Operator_Assign op_assign) { + // Ensure omega-reduction here, since what follows has quadratic complexity. + omega_reduce(); + y.omega_reduce(); + Sequence new_sequence; + for (const_iterator xi = begin(), x_end = end(), + y_begin = y.begin(), y_end = y.end(); xi != x_end; ++xi) + for (const_iterator yi = y_begin; yi != y_end; ++yi) { + D zi = *xi; + op_assign(zi, *yi); + if (!zi.is_bottom()) + new_sequence.push_back(zi); + } + // Put the new sequence in place. + std::swap(sequence, new_sequence); + reduced = false; + assert(OK()); +} + +template +void +Powerset::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); + assert(OK()); +} + +namespace IO_Operators { + +/*! \relates Parma_Polyhedra_Library::Powerset */ +template +std::ostream& +operator<<(std::ostream& s, const Powerset& x) { + if (x.is_bottom()) + s << "false"; + else if (x.is_top()) + s << "true"; + else + for (typename Powerset::const_iterator i = x.begin(), + x_end = x.end(); i != x_end; ) { + s << "{ " << *i++ << " }"; + if (i != x_end) + s << ", "; + } + return s; +} + +} // namespace IO_Operators + +template +memory_size_type +Powerset::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 +bool +Powerset::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 453. */ + +/* Automatically generated from PPL source file ../src/Pointset_Powerset.defs.hh line 43. */ +#include +#include +#include + +//! The powerset construction instantiated on PPL pointset domains. +/*! \ingroup PPL_CXX_interface */ +/*! + \warning + At present, the supported instantiations for the + disjunct domain template \p PS are the simple pointset domains: + C_Polyhedron, + NNC_Polyhedron, + Grid, + Octagonal_Shape, + BD_Shape, + Box. +*/ +template +class Parma_Polyhedra_Library::Pointset_Powerset + : public Parma_Polyhedra_Library::Powerset + > { +public: + typedef PS element_type; + +private: + typedef Determinate CS; + typedef Powerset Base; + +public: + //! Returns the maximum space dimension a Pointset_Powerset 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 QH of the disjuncts + in the source powerset is different from PS. + + \param y + The powerset to be used to build the new powerset. + + \param complexity + The maximal complexity of any algorithms used. + */ + template + explicit Pointset_Powerset(const Pointset_Powerset& y, + Complexity_Class complexity = ANY_COMPLEXITY); + + /*! \brief + Creates a Pointset_Powerset from a product + This will be created as a single disjunct of type PS that + approximates the product. + */ + template + explicit + Pointset_Powerset(const Partially_Reduced_Product& 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 + explicit Pointset_Powerset(const Octagonal_Shape& 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 bdss exceeds the maximum + allowed space dimension. + */ + template + explicit Pointset_Powerset(const BD_Shape& 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 + explicit Pointset_Powerset(const Box& 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 true if and only if \p *this is + an empty powerset. + */ + bool is_empty() const; + + /*! \brief + Returns true if and only if \p *this + is the top element of the powerser lattice. + */ + bool is_universe() const; + + /*! \brief + Returns true if and only if all the disjuncts + in \p *this are topologically closed. + */ + bool is_topologically_closed() const; + + /*! \brief + Returns true if and only if all elements in \p *this + are bounded. + */ + bool is_bounded() const; + + //! Returns true 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 true if and only if \p *this is discrete. + bool is_discrete() const; + + /*! \brief + Returns true 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 true 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 true 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 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 + true 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, + false 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 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 + 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 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, + false 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 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 + true 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, + false 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 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 + 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 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, + false 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 true 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 really expensive! + */ + bool geometrically_covers(const Pointset_Powerset& y) const; + + /*! \brief + Returns true 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 really expensive! + */ + bool geometrically_equals(const Pointset_Powerset& y) const; + + /*! \brief + Returns true 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 true 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 true 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 x == y, + then x.hash_code() == y.hash_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 PS& 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 constraint \p c, minimizing the result. + /*! + \return + false if and only if the result is empty. + + \exception std::invalid_argument + Thrown if \p *this and \p c are topology-incompatible or + dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_constraint_and_minimize(const Constraint& c); + + //! Intersects \p *this with the constraints in \p cs. + /*! + \param cs + The constraints to intersect with. + + \exception std::invalid_argument + Thrown if \p *this and \p cs are topology-incompatible or + dimension-incompatible. + */ + void add_constraints(const Constraint_System& cs); + + /*! \brief + 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); + + /*! \brief + Intersects \p *this with the constraints in \p cs, + minimizing the result. + + \return + false if and only if the result is empty. + + \param cs + The constraints to intersect with. + + \exception std::invalid_argument + Thrown if \p *this and \p cs are topology-incompatible or + dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_constraints_and_minimize(const Constraint_System& cs); + + //! Intersects \p *this with congruence \p c. + /*! + \exception std::invalid_argument + Thrown if \p *this and congruence \p c are topology-incompatible + or dimension-incompatible. + */ + void add_congruence(const Congruence& c); + + /*! \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 congruence \p c, minimizing the result. + /*! + \return + false if and only if the result is empty. + + \exception std::invalid_argument + Thrown if \p *this and \p c are topology-incompatible or + dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_congruence_and_minimize(const Congruence& c); + + //! 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 + Intersects \p *this with the congruences in \p cs, + minimizing the result. + + \return + false if and only if the result is empty. + + \param cs + The congruences to intersect with. + + \exception std::invalid_argument + Thrown if \p *this and \p cs are topology-incompatible or + dimension-incompatible. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool add_congruences_and_minimize(const Congruence_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 to_be_unconstrained, + assigning the result to \p *this. + + \param to_be_unconstrained + 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 to_be_removed. + */ + void unconstrain(const Variables_Set& to_be_unconstrained); + + //! 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); + + //! 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, minimizing the result + and collecting all these intersections. + + \return + false if and only if the result is empty. + + \deprecated + See \ref A_Note_on_the_Implementation_of_the_Operators. + */ + bool intersection_assign_and_minimize(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 + 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 wf + and the cardinality threshold \p max_disjuncts. + + \param y + A powerset that must definitely entail \p *this; + + \param wf + The widening function to be used on polyhedra objects. It is obtained + from the corresponding widening method by using the helper function + Parma_Polyhedra_Library::widen_fun_ref. Legal values are, e.g., + widen_fun_ref(&Polyhedron::H79_widening_assign) and + widen_fun_ref(&Polyhedron::limited_H79_extrapolation_assign, cs); + + \param max_disjuncts + The maximum number of disjuncts occurring in the powerset \p *this + before 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 + void BGP99_extrapolation_assign(const Pointset_Powerset& y, + Widening wf, + unsigned max_disjuncts); + + /*! \brief + Assigns to \p *this the result of computing the + \ref pps_certificate_widening "BHZ03-widening" + between \p *this and \p y, using the widening function \p wf + certified by the convergence certificate \p Cert. + + \param y + The finite powerset computed in the previous iteration step. + It must definitely entail \p *this; + + \param wf + 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., + widen_fun_ref(&Polyhedron::H79_widening_assign) and + widen_fun_ref(&Polyhedron::limited_H79_extrapolation_assign, cs). + + \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 wf; otherwise, an extrapolation operator is + obtained. + For a description of the methods that should be provided + by \p Cert, see BHRZ03_Certificate or H79_Certificate. + */ + template + void BHZ03_widening_assign(const Pointset_Powerset& y, Widening wf); + + //@} // Space Dimension Preserving Member Functions that May Modify [...] + + //! \name Member Functions that May Modify the Dimension of the Vector Space + //@{ + + /*! \brief + The assignment operator + (\p *this and \p y can be dimension-incompatible). + */ + Pointset_Powerset& operator=(const Pointset_Powerset& y); + + /*! \brief + Conversion assignment: the type QH of the disjuncts + in the source powerset is different from PS + (\p *this and \p y can be dimension-incompatible). + */ + template + Pointset_Powerset& operator=(const Pointset_Powerset& y); + + //! Swaps \p *this with \p y. + void 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 to_be_removed + The set of Variable objects corresponding to the space dimensions + to be removed. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with one of the + Variable objects contained in \p to_be_removed. + */ + void remove_space_dimensions(const Variables_Set& to_be_removed); + + /*! \brief + Removes the higher space dimensions so that the resulting space + will have dimension \p new_dimension. + + \exception std::invalid_argument + Thrown if \p new_dimensions is greater than the space dimension + of \p *this. + */ + void remove_higher_space_dimensions(dimension_type new_dimension); + + /*! \brief + Remaps the dimensions of the vector space according to + a partial function. + + See also Polyhedron::map_space_dimensions. + */ + template + 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 max_space_dimension(). + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + and var 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 to_be_folded into \p var. + /*! + \param to_be_folded + The set of Variable objects corresponding to the space dimensions + to be folded; + + \param var + The variable corresponding to the space dimension that is the + destination of the folding operation. + + \exception std::invalid_argument + Thrown if \p *this is dimension-incompatible with \p var or with + one of the Variable objects contained in \p to_be_folded. Also + thrown if \p var is contained in \p to_be_folded. + + If \p *this has space dimension \f$n\f$, with \f$n > 0\f$, + var has space dimension \f$k \leq n\f$, + \p to_be_folded is a set of variables whose maximum space dimension + is also less than or equal to \f$n\f$, and \p var is not a member + of \p to_be_folded, then the space dimensions corresponding to + variables in \p to_be_folded are + \ref 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& to_be_folded, Variable var); + + //@} // 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 true if successful, false 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 to_be_enlarged 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 to_be_enlarged are + topology-compatible and dimension-compatible. + */ + bool intersection_preserving_enlarge_element(PS& to_be_enlarged) const; + + /*! \brief + Assigns to \p *this the result of applying the BGP99 heuristics + to \p *this and \p y, using the widening function \p wf. + */ + template + void BGP99_heuristics_assign(const Pointset_Powerset& y, Widening wf); + + //! Records in \p cert_ms the certificates for this set of disjuncts. + template + void collect_certificates(std::map& cert_ms) const; + + /*! \brief + Returns true if and only if the current set of dijsuncts + is stabilizing with respect to the multiset of certificates \p y_cert_ms. + */ + template + bool is_cert_multiset_stabilizing(const std::map& + y_cert_ms) const; + + // FIXME: here it should be enough to befriend the template constructor + // template + // Pointset_Powerset(const Pointset_Powerset&), + // but, apparently, this cannot be done. + friend class Pointset_Powerset; +}; + +namespace Parma_Polyhedra_Library { + +//! 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 r of type + std::pair\ \> + such that + - r.first is the intersection of \p p and \p q; + - r.second has the property that all its elements are + pairwise disjoint and disjoint from \p p; + - the set-theoretical union of r.first with all the + elements of r.second gives \p q (i.e., r + is the representation of a partition of \p q). + + \if Include_Implementation_Details + + See + + this paper for more information about the implementation. + \endif +*/ +template +std::pair > +linear_partition(const PS& p, const PS& q); + +/*! \brief + Returns true 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& 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 r of type + std::pair\ \> + such that + - r.first is the intersection of \p p and \p q; + - If there is a finite partition of \p q wrt \p p + the Boolean finite_partition is set to true and + r.second has the property that all its elements are + pairwise disjoint and disjoint from \p p and the set-theoretical + union of r.first with all the elements of + r.second gives \p q (i.e., r + is the representation of a partition of \p q). + - Otherwise the Boolean finite_partition is set to false + and the singleton set that contains \p q is stored in + r.secondr. +*/ +std::pair > +approximate_partition(const Grid& p, const Grid& q, bool& finite_partition); + +/*! \brief + Returns true 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& ps); + +/*! \brief + Returns true 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 PS can be converted + without precision loss into an NNC_Polyhedron; otherwise, + an incorrect result might be obtained. +*/ +template +bool +check_containment(const PS& ph, const Pointset_Powerset& 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 +Pointset_Powerset +::Pointset_Powerset(const Pointset_Powerset& 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 +::Pointset_Powerset(const Pointset_Powerset& y, + Complexity_Class); + +template <> +template <> +Pointset_Powerset +::Pointset_Powerset(const Pointset_Powerset& y, + Complexity_Class); + +template <> +template <> +Pointset_Powerset +::Pointset_Powerset(const Pointset_Powerset& y, + Complexity_Class); + +template <> +void +Pointset_Powerset +::difference_assign(const Pointset_Powerset& y); + +template <> +void +Pointset_Powerset +::difference_assign(const Pointset_Powerset& y); + +template <> +bool +Pointset_Powerset +::geometrically_covers(const Pointset_Powerset& y) const; + +template <> +bool +Pointset_Powerset +::geometrically_covers(const Pointset_Powerset& y) const; + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +//! Specializes std::swap. +/*! \relates Parma_Polyhedra_Library::Pointset_Powerset */ +template +void swap(Parma_Polyhedra_Library::Pointset_Powerset& x, + Parma_Polyhedra_Library::Pointset_Powerset& y); + +} // namespace std + +/* 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 34. */ +#include +#include + +namespace Parma_Polyhedra_Library { + +template +inline dimension_type +Pointset_Powerset::space_dimension() const { + return space_dim; +} + +template +inline dimension_type +Pointset_Powerset::max_space_dimension() { + return PS::max_space_dimension(); +} + +template +inline +Pointset_Powerset::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(PS(num_dimensions, kind))); + assert(x.OK()); +} + +template +inline +Pointset_Powerset::Pointset_Powerset(const Pointset_Powerset& y, + Complexity_Class) + : Base(y), space_dim(y.space_dim) { +} + +template +inline +Pointset_Powerset::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(PS(ph, complexity))); + x.reduced = false; + assert(OK()); +} + +template +inline +Pointset_Powerset::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(PS(ph, complexity))); + assert(OK()); +} + +template +inline +Pointset_Powerset::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(PS(gr))); + } + assert(OK()); +} + +template +template +inline +Pointset_Powerset +::Pointset_Powerset(const Partially_Reduced_Product& 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(PS(prp, complexity))); + x.reduced = false; + assert(OK()); +} + +template +template +Pointset_Powerset::Pointset_Powerset(const Box& box, + Complexity_Class) + : Base(), space_dim(box.space_dimension()) { + Pointset_Powerset& x = *this; + if (!box.is_empty()) + x.sequence.push_back(Determinate(PS(box))); + assert(OK()); +} + +template +template +Pointset_Powerset::Pointset_Powerset(const Octagonal_Shape& os, + Complexity_Class) + : Base(), space_dim(os.space_dimension()) { + Pointset_Powerset& x = *this; + if (!os.is_empty()) + x.sequence.push_back(Determinate(PS(os))); + assert(OK()); +} + +template +template +Pointset_Powerset::Pointset_Powerset(const BD_Shape& bds, + Complexity_Class) + : Base(), space_dim(bds.space_dimension()) { + Pointset_Powerset& x = *this; + if (!bds.is_empty()) + x.sequence.push_back(Determinate(PS(bds))); + assert(OK()); +} + +template +inline +Pointset_Powerset::Pointset_Powerset(const Constraint_System& cs) + : Base(Determinate(cs)), space_dim(cs.space_dimension()) { + assert(OK()); +} + +template +inline +Pointset_Powerset::Pointset_Powerset(const Congruence_System& cgs) + : Base(Determinate(cgs)), space_dim(cgs.space_dimension()) { + assert(OK()); +} + +template +inline Pointset_Powerset& +Pointset_Powerset::operator=(const Pointset_Powerset& y) { + Pointset_Powerset& x = *this; + x.Base::operator=(y); + x.space_dim = y.space_dim; + return x; +} + +template +inline void +Pointset_Powerset::swap(Pointset_Powerset& y) { + Pointset_Powerset& x = *this; + x.Base::swap(y); + std::swap(x.space_dim, y.space_dim); +} + +template +template +inline Pointset_Powerset& +Pointset_Powerset::operator=(const Pointset_Powerset& y) { + Pointset_Powerset& x = *this; + Pointset_Powerset pps(y); + x.swap(pps); + return x; +} + +template +inline void +Pointset_Powerset::intersection_assign(const Pointset_Powerset& y) { + Pointset_Powerset& x = *this; + x.pairwise_apply_assign + (y, CS::lift_op_assign(std::mem_fun_ref(&PS::intersection_assign))); +} + +template +inline bool +Pointset_Powerset +::intersection_assign_and_minimize(const Pointset_Powerset& y) { + intersection_assign(y); + return !is_empty(); +} + +template +inline void +Pointset_Powerset::time_elapse_assign(const Pointset_Powerset& y) { + Pointset_Powerset& x = *this; + x.pairwise_apply_assign + (y, CS::lift_op_assign(std::mem_fun_ref(&PS::time_elapse_assign))); +} + +template +inline bool +Pointset_Powerset +::geometrically_covers(const Pointset_Powerset& y) const { + // This code is only used when PS is an abstraction of NNC_Polyhedron. + const Pointset_Powerset xx(*this); + const Pointset_Powerset yy(y); + return xx.geometrically_covers(yy); +} + +template +inline bool +Pointset_Powerset +::geometrically_equals(const Pointset_Powerset& y) const { + // This code is only used when PS is an abstraction of NNC_Polyhedron. + const Pointset_Powerset xx(*this); + const Pointset_Powerset yy(y); + return xx.geometrically_covers(yy) && yy.geometrically_covers(xx); +} + +template <> +inline bool +Pointset_Powerset +::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 +::geometrically_equals(const Pointset_Powerset& y) const { + const Pointset_Powerset& x = *this; + return x.geometrically_covers(y) && y.geometrically_covers(x); +} + +template +inline memory_size_type +Pointset_Powerset::external_memory_in_bytes() const { + return Base::external_memory_in_bytes(); +} + +template +inline memory_size_type +Pointset_Powerset::total_memory_in_bytes() const { + return sizeof(*this) + external_memory_in_bytes(); +} + +template +inline int32_t +Pointset_Powerset::hash_code() const { + return space_dimension() & 0x7fffffff; +} + +template +inline void +Pointset_Powerset +::difference_assign(const Pointset_Powerset& y) { + // This code is only used when PS is an abstraction of NNC_Polyhedron. + Pointset_Powerset nnc_this(*this); + Pointset_Powerset nnc_y(y); + nnc_this.difference_assign(nnc_y); + *this = nnc_this; +} + +/*! \relates Pointset_Powerset */ +template +inline bool +check_containment(const PS& ph, const Pointset_Powerset& ps) { + // This code is only used when PS is an abstraction of NNC_Polyhedron. + const NNC_Polyhedron pph = NNC_Polyhedron(ph.constraints()); + const Pointset_Powerset pps(ps); + return check_containment(pph, pps); +} + +/*! \relates Pointset_Powerset */ +template <> +inline bool +check_containment(const C_Polyhedron& ph, + const Pointset_Powerset& ps) { + return check_containment(NNC_Polyhedron(ph), + Pointset_Powerset(ps)); +} + +} // namespace Parma_Polyhedra_Library + + +namespace std { + +/*! \relates Parma_Polyhedra_Library::Pointset_Powerset */ +template +inline void +swap(Parma_Polyhedra_Library::Pointset_Powerset& x, + Parma_Polyhedra_Library::Pointset_Powerset& y) { + x.swap(y); +} + +} // namespace std + +/* 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 32. */ +#include +#include +#include +#include +#include +#include + +namespace Parma_Polyhedra_Library { + +template +void +Pointset_Powerset::add_disjunct(const PS& ph) { + Pointset_Powerset& x = *this; + if (x.space_dimension() != ph.space_dimension()) { + std::ostringstream s; + s << "PPL::Pointset_Powerset::add_disjunct(ph):\n" + << "this->space_dimension() == " << x.space_dimension() << ", " + << "ph.space_dimension() == " << ph.space_dimension() << "."; + throw std::invalid_argument(s.str()); + } + x.sequence.push_back(Determinate(ph)); + x.reduced = false; + assert(x.OK()); +} + +template <> +template +Pointset_Powerset +::Pointset_Powerset(const Pointset_Powerset& y, + Complexity_Class complexity) + : Base(), space_dim(y.space_dimension()) { + Pointset_Powerset& x = *this; + for (typename Pointset_Powerset::const_iterator i = y.begin(), + y_end = y.end(); i != y_end; ++i) + x.sequence.push_back(Determinate + (NNC_Polyhedron(i->element(), 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; + + assert(x.OK()); +} + +template +template +Pointset_Powerset +::Pointset_Powerset(const Pointset_Powerset& y, + Complexity_Class complexity) + : Base(), space_dim(y.space_dimension()) { + Pointset_Powerset& x = *this; + for (typename Pointset_Powerset::const_iterator i = y.begin(), + y_end = y.end(); i != y_end; ++i) + x.sequence.push_back(Determinate(PS(i->element(), complexity))); + // Note: this might be non-reduced even when `y' is known to be + // omega-reduced, because the constructor of PS may have made + // different QH elements to become comparable. + x.reduced = false; + assert(x.OK()); +} + +template +void +Pointset_Powerset::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 new_x(x.space_dim + y.space_dim, EMPTY); + for (const_iterator xi = x.begin(), x_end = x.end(), + y_begin = y.begin(), y_end = y.end(); xi != x_end; ) { + for (const_iterator yi = y_begin; yi != y_end; ++yi) { + CS zi = *xi; + zi.concatenate_assign(*yi); + assert(!zi.is_bottom()); + new_x.sequence.push_back(zi); + } + ++xi; + if (abandon_expensive_computations && xi != x_end && y_begin != y_end) { + // Hurry up! + PS xph = xi->element(); + for (++xi; xi != x_end; ++xi) + xph.upper_bound_assign(xi->element()); + const_iterator yi = y_begin; + PS yph = yi->element(); + for (++yi; yi != y_end; ++yi) + yph.upper_bound_assign(yi->element()); + xph.concatenate_assign(yph); + x.swap(new_x); + x.add_disjunct(xph); + assert(x.OK()); + return; + } + } + x.swap(new_x); + assert(x.OK()); +} + +template +void +Pointset_Powerset::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->element().add_constraint(c); + x.reduced = false; + assert(x.OK()); +} + +template +bool +Pointset_Powerset::add_constraint_and_minimize(const Constraint& c) { + Pointset_Powerset& x = *this; + for (Sequence_iterator si = x.sequence.begin(), + s_end = x.sequence.end(); si != s_end; ) + if (!si->element().add_constraint_and_minimize(c)) + si = x.sequence.erase(si); + else { + x.reduced = false; + ++si; + } + assert(x.OK()); + return !x.empty(); +} + +template +void +Pointset_Powerset::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->element().refine_with_constraint(c); + x.reduced = false; + assert(x.OK()); +} + +template +void +Pointset_Powerset::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->element().add_constraints(cs); + x.reduced = false; + assert(x.OK()); +} + +template +bool +Pointset_Powerset:: +add_constraints_and_minimize(const Constraint_System& cs) { + Pointset_Powerset& x = *this; + for (Sequence_iterator si = x.sequence.begin(), + s_end = x.sequence.end(); si != s_end; ) + if (!si->element().add_constraints_and_minimize(cs)) + si = x.sequence.erase(si); + else { + x.reduced = false; + ++si; + } + assert(x.OK()); + return !x.empty(); +} + +template +void +Pointset_Powerset::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->element().refine_with_constraints(cs); + x.reduced = false; + assert(x.OK()); +} + +template +void +Pointset_Powerset::add_congruence(const Congruence& c) { + Pointset_Powerset& x = *this; + for (Sequence_iterator si = x.sequence.begin(), + s_end = x.sequence.end(); si != s_end; ++si) + si->element().add_congruence(c); + x.reduced = false; + assert(x.OK()); +} + +template +void +Pointset_Powerset::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->element().refine_with_congruence(cg); + x.reduced = false; + assert(x.OK()); +} + +template +bool +Pointset_Powerset::add_congruence_and_minimize(const Congruence& c) { + Pointset_Powerset& x = *this; + for (Sequence_iterator si = x.sequence.begin(), + s_end = x.sequence.end(); si != s_end; ) + if (!si->element().add_congruence_and_minimize(c)) + si = x.sequence.erase(si); + else { + x.reduced = false; + ++si; + } + assert(x.OK()); + return !x.empty(); +} + +template +void +Pointset_Powerset::add_congruences(const Congruence_System& cs) { + Pointset_Powerset& x = *this; + for (Sequence_iterator si = x.sequence.begin(), + s_end = x.sequence.end(); si != s_end; ++si) + si->element().add_congruences(cs); + x.reduced = false; + assert(x.OK()); +} + +template +void +Pointset_Powerset::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->element().refine_with_congruences(cgs); + x.reduced = false; + assert(x.OK()); +} + +template +bool +Pointset_Powerset:: +add_congruences_and_minimize(const Congruence_System& cs) { + Pointset_Powerset& x = *this; + for (Sequence_iterator si = x.sequence.begin(), + s_end = x.sequence.end(); si != s_end; ) + if (!si->element().add_congruences_and_minimize(cs)) + si = x.sequence.erase(si); + else { + x.reduced = false; + ++si; + } + assert(x.OK()); + return !x.empty(); +} + +template +void +Pointset_Powerset::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->element().unconstrain(var); + x.reduced = false; + } + assert(x.OK()); +} + +template +void +Pointset_Powerset::unconstrain(const Variables_Set& to_be_unconstrained) { + Pointset_Powerset& x = *this; + for (Sequence_iterator si = x.sequence.begin(), + s_end = x.sequence.end(); si != s_end; ++si) { + si->element().unconstrain(to_be_unconstrained); + x.reduced = false; + } + assert(x.OK()); +} + +template +void +Pointset_Powerset::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->element().add_space_dimensions_and_embed(m); + x.space_dim += m; + assert(x.OK()); +} + +template +void +Pointset_Powerset::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->element().add_space_dimensions_and_project(m); + x.space_dim += m; + assert(x.OK()); +} + +template +void +Pointset_Powerset:: +remove_space_dimensions(const Variables_Set& to_be_removed) { + Pointset_Powerset& x = *this; + Variables_Set::size_type num_removed = to_be_removed.size(); + if (num_removed > 0) { + for (Sequence_iterator si = x.sequence.begin(), + s_end = x.sequence.end(); si != s_end; ++si) { + si->element().remove_space_dimensions(to_be_removed); + x.reduced = false; + } + x.space_dim -= num_removed; + assert(x.OK()); + } +} + +template +void +Pointset_Powerset::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->element().remove_higher_space_dimensions(new_dimension); + x.reduced = false; + } + x.space_dim = new_dimension; + assert(x.OK()); + } +} + +template +template +void +Pointset_Powerset::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->element().map_space_dimensions(pfunc); + x.space_dim = s_begin->element().space_dimension(); + x.reduced = false; + } + assert(x.OK()); +} + +template +void +Pointset_Powerset::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->element().expand_space_dimension(var, m); + x.space_dim += m; + assert(x.OK()); +} + +template +void +Pointset_Powerset::fold_space_dimensions(const Variables_Set& to_be_folded, + Variable var) { + Pointset_Powerset& x = *this; + Variables_Set::size_type num_folded = to_be_folded.size(); + if (num_folded > 0) { + for (Sequence_iterator si = x.sequence.begin(), + s_end = x.sequence.end(); si != s_end; ++si) + si->element().fold_space_dimensions(to_be_folded, var); + } + x.space_dim -= num_folded; + assert(x.OK()); +} + +template +void +Pointset_Powerset::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->element().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; + } + assert(x.OK()); +} + +template +void +Pointset_Powerset::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->element().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; + } + assert(x.OK()); +} + + +template +void +Pointset_Powerset +::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->element().generalized_affine_image(lhs, relsym, rhs); + x.reduced = false; + } + assert(x.OK()); +} + +template +void +Pointset_Powerset +::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->element().generalized_affine_preimage(lhs, relsym, rhs); + x.reduced = false; + } + assert(x.OK()); +} + +template +void +Pointset_Powerset +::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->element().generalized_affine_image(var, relsym, expr, denominator); + x.reduced = false; + } + assert(x.OK()); +} + +template +void +Pointset_Powerset +::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->element().generalized_affine_preimage(var, relsym, expr, denominator); + x.reduced = false; + } + assert(x.OK()); +} + + +template +void +Pointset_Powerset +::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->element().bounded_affine_image(var, lb_expr, ub_expr, denominator); + x.reduced = false; + } + assert(x.OK()); +} + +template +void +Pointset_Powerset +::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->element().bounded_affine_preimage(var, lb_expr, ub_expr, + denominator); + x.reduced = false; + } + assert(x.OK()); +} + +template +dimension_type +Pointset_Powerset::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) { + PS pi(si->element()); + 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 +bool +Pointset_Powerset::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()->element().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->element().is_universe()) { + // Speculative omega-reduction, if it is worth. + if (x.size() > 1) { + Pointset_Powerset universe(x.space_dimension(), UNIVERSE); + Pointset_Powerset& xx = const_cast(x); + xx.swap(universe); + } + return true; + } + return false; +} + +template +bool +Pointset_Powerset::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->element().is_empty()) + return false; + return true; +} + +template +bool +Pointset_Powerset::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->element().is_discrete()) + return false; + return true; +} + +template +bool +Pointset_Powerset::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->element().is_topologically_closed()) + return false; + return true; +} + +template +bool +Pointset_Powerset::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->element().is_bounded()) + return false; + return true; +} + +template +bool +Pointset_Powerset::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::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->element().constrains(var)) + return true; + return false; +} + +template +bool +Pointset_Powerset::is_disjoint_from(const Pointset_Powerset& y) const { + const Pointset_Powerset& x = *this; + for (Sequence_const_iterator si = x.sequence.begin(), + xs_end = x.sequence.end(); si != xs_end; ++si) { + const PS& pi = si->element(); + for (Sequence_const_iterator sj = y.sequence.begin(), + ys_end = y.sequence.end(); sj != ys_end; ++sj) { + const PS& pj = sj->element(); + if (!pi.is_disjoint_from(pj)) + return false; + } + } + return true; +} + +template +void +Pointset_Powerset::topological_closure_assign() { + Pointset_Powerset& x = *this; + for (Sequence_iterator si = x.sequence.begin(), + s_end = x.sequence.end(); si != s_end; ++si) + si->element().topological_closure_assign(); + assert(x.OK()); +} + +template +bool +Pointset_Powerset +::intersection_preserving_enlarge_element(PS& to_be_enlarged) const { + // FIXME: this is just an executable specification. + const Pointset_Powerset& context = *this; + assert(context.space_dimension() == to_be_enlarged.space_dimension()); + bool nonempty_intersection = false; + // TODO: maybe use a *sorted* constraint system? + PS enlarged(context.space_dimension(), UNIVERSE); + for (Sequence_const_iterator si = context.sequence.begin(), + s_end = context.sequence.end(); si != s_end; ++si) { + PS context_i(si->element()); + context_i.intersection_assign(enlarged); + PS enlarged_i(to_be_enlarged); + nonempty_intersection + |= enlarged_i.simplify_using_context_assign(context_i); + // TODO: merge the sorted constraints of `enlarged' and `enlarged_i'? + enlarged.intersection_assign(enlarged_i); + } + to_be_enlarged.swap(enlarged); + return nonempty_intersection; +} + +template +bool +Pointset_Powerset +::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 PS& y_i = y.sequence.begin()->element(); + for (Sequence_iterator si = x.sequence.begin(), + s_end = x.sequence.end(); si != s_end; ) { + PS& x_i = si->element(); + 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->element())) + ++si; + else + // Intersection with `*si' is empty: drop the disjunct. + si = x.sequence.erase(si); + } + } + x.reduced = false; + assert(x.OK()); + return !x.sequence.empty(); +} + +template +bool +Pointset_Powerset::contains(const Pointset_Powerset& y) const { + const Pointset_Powerset& x = *this; + for (Sequence_const_iterator si = y.sequence.begin(), + ys_end = y.sequence.end(); si != ys_end; ++si) { + const PS& pi = si->element(); + bool pi_is_contained = false; + for (Sequence_const_iterator sj = x.sequence.begin(), + xs_end = x.sequence.end(); + (sj != xs_end && !pi_is_contained); ++sj) { + const PS& pj = sj->element(); + if (pj.contains(pi)) + pi_is_contained = true; + } + if (!pi_is_contained) + return false; + } + return true; +} + +template +bool +Pointset_Powerset::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(), + ys_end = y.sequence.end(); si != ys_end; ++si) { + const PS& pi = si->element(); + bool pi_is_strictly_contained = false; + for (Sequence_const_iterator sj = x.sequence.begin(), + xs_end = x.sequence.end(); + (sj != xs_end && !pi_is_strictly_contained); ++sj) { + const PS& pj = sj->element(); + if (pj.strictly_contains(pi)) + pi_is_strictly_contained = true; + } + if (!pi_is_strictly_contained) + return false; + } + return true; +} + +template +Poly_Con_Relation +Pointset_Powerset::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->element().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 +Poly_Con_Relation +Pointset_Powerset::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->element().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 +Poly_Gen_Relation +Pointset_Powerset::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->element().relation_with(g); + if (relation_i.implies(Poly_Gen_Relation::subsumes())) + return Poly_Gen_Relation::subsumes(); + } + + return Poly_Gen_Relation::nothing(); +} + +template +bool +Pointset_Powerset +::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->element().bounds_from_above(expr)) + return false; + return true; +} + +template +bool +Pointset_Powerset +::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->element().bounds_from_below(expr)) + return false; + return true; +} + +template +bool +Pointset_Powerset::maximize(const Linear_Expression& expr, + Coefficient& sup_n, + Coefficient& sup_d, + bool& maximum) const { + const Pointset_Powerset& x = *this; + x.omega_reduce(); + bool first = true; + + PPL_DIRTY_TEMP_COEFFICIENT(supt_n); + PPL_DIRTY_TEMP_COEFFICIENT(supt_d); + supt_n = 0; + supt_d = 1; + bool maxt = 0; + + PPL_DIRTY_TEMP_COEFFICIENT(supi_n); + PPL_DIRTY_TEMP_COEFFICIENT(supi_d); + supi_n = 0; + supi_d = 1; + bool maxi = 0; + + PPL_DIRTY_TEMP_COEFFICIENT(tmp); + + for (Sequence_const_iterator si = x.sequence.begin(), + s_end = x.sequence.end(); si != s_end; ++si) { + if (!si->element().maximize(expr, supi_n, supi_d, maxi)) + return false; + else + if (first) { + first = false; + supt_n = supi_n; + supt_d = supi_d; + maxt = maxi; + } + else { + tmp = (supt_n * supi_d) - (supi_n * supt_d); + if (tmp < 0) { + supt_n = supi_n; + supt_d = supi_d; + maxt = maxi; + } + else if (tmp == 0) + maxt = maxt || maxi; + } + } + sup_n = supt_n; + sup_d = supt_d; + maximum = maxt; + return true; +} + +template +bool +Pointset_Powerset::maximize(const Linear_Expression& expr, + Coefficient& sup_n, + Coefficient& sup_d, + bool& maximum, + Generator& g) const { + const Pointset_Powerset& x = *this; + x.omega_reduce(); + bool first = true; + + PPL_DIRTY_TEMP_COEFFICIENT(supt_n); + PPL_DIRTY_TEMP_COEFFICIENT(supt_d); + supt_n = 0; + supt_d = 1; + bool maxt = 0; + Generator gt = point(); + + PPL_DIRTY_TEMP_COEFFICIENT(supi_n); + PPL_DIRTY_TEMP_COEFFICIENT(supi_d); + supi_n = 0; + supi_d = 1; + bool maxi = 0; + Generator gi = 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->element().maximize(expr, supi_n, supi_d, maxi, gi)) + return false; + else + if (first) { + first = false; + supt_n = supi_n; + supt_d = supi_d; + maxt = maxi; + gt = gi; + } + else { + tmp = (supt_n * supi_d) - (supi_n * supt_d); + if (tmp < 0) { + supt_n = supi_n; + supt_d = supi_d; + maxt = maxi; + gt = gi; + } + else if (tmp == 0) { + maxt = maxt || maxi; + gt = gi; + } + } + } + sup_n = supt_n; + sup_d = supt_d; + maximum = maxt; + g = gt; + return true; +} + +template +bool +Pointset_Powerset::minimize(const Linear_Expression& expr, + Coefficient& inf_n, + Coefficient& inf_d, + bool& minimum) const { + const Pointset_Powerset& x = *this; + x.omega_reduce(); + bool first = true; + + PPL_DIRTY_TEMP_COEFFICIENT(inft_n); + PPL_DIRTY_TEMP_COEFFICIENT(inft_d); + inft_n = 0; + inft_d = 1; + bool mint = 0; + + PPL_DIRTY_TEMP_COEFFICIENT(infi_n); + PPL_DIRTY_TEMP_COEFFICIENT(infi_d); + infi_n = 0; + infi_d = 1; + bool mini = 0; + + PPL_DIRTY_TEMP_COEFFICIENT(tmp); + + for (Sequence_const_iterator si = x.sequence.begin(), + s_end = x.sequence.end(); si != s_end; ++si) { + if (!si->element().minimize(expr, infi_n, infi_d, mini)) + return false; + else + if (first) { + first = false; + inft_n = infi_n; + inft_d = infi_d; + mint = mini; + } + else { + tmp = (inft_n * infi_d) - (infi_n * inft_d); + if (tmp > 0) { + inft_n = infi_n; + inft_d = infi_d; + mint = mini; + } + else if (tmp == 0) + mint = mint || mini; + } + } + inf_n = inft_n; + inf_d = inft_d; + minimum = mint; + return true; +} + +template +bool +Pointset_Powerset::minimize(const Linear_Expression& expr, + Coefficient& inf_n, + Coefficient& inf_d, + bool& minimum, + Generator& g) const { + const Pointset_Powerset& x = *this; + x.omega_reduce(); + bool first = true; + + PPL_DIRTY_TEMP_COEFFICIENT(inft_n); + PPL_DIRTY_TEMP_COEFFICIENT(inft_d); + inft_n = 0; + inft_d = 1; + bool mint = 0; + Generator gt = point(); + + PPL_DIRTY_TEMP_COEFFICIENT(infi_n); + PPL_DIRTY_TEMP_COEFFICIENT(infi_d); + infi_n = 0; + infi_d = 1; + bool mini = 0; + Generator gi = 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->element().minimize(expr, infi_n, infi_d, mini, gi)) + return false; + else + if (first) { + first = false; + inft_n = infi_n; + inft_d = infi_d; + mint = mini; + gt = gi; + } + else { + tmp = (inft_n * infi_d) - (infi_n * inft_d); + if (tmp > 0) { + inft_n = infi_n; + inft_d = infi_d; + mint = mini; + gt = gi; + } + else if (tmp == 0) { + mint = mint || mini; + gt = gi; + } + } + } + inf_n = inft_n; + inf_d = inft_d; + minimum = mint; + g = gt; + return true; +} + +template +bool +Pointset_Powerset::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->element().contains_integer_point()) + return true; + return false; +} + +template +void +Pointset_Powerset::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 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; + PS& pi = si->element(); + Sequence_const_iterator sj = si; + unsigned sj_index = si_index; + for (++sj, ++sj_index; sj != s_end; ++sj, ++sj_index) { + if (marked[sj_index]) + continue; + const PS& pj = sj->element(); + if (pi.upper_bound_assign_if_exact(pj)) { + marked[si_index] = marked[sj_index] = true; + new_x.add_non_bottom_disjunct_preserve_reduction(pi); + ++deleted; + goto next; + } + } + next: + ; + } + iterator nx_begin = new_x.begin(); + iterator nx_end = new_x.end(); + unsigned xi_index = 0; + for (const_iterator xi = x.begin(), + x_end = x.end(); xi != x_end; ++xi, ++xi_index) + if (!marked[xi_index]) + nx_begin = new_x.add_non_bottom_disjunct_preserve_reduction(*xi, + nx_begin, + nx_end); + std::swap(x.sequence, new_x.sequence); + n -= deleted; + } while (deleted > 0); + assert(x.OK()); +} + +template +template +void +Pointset_Powerset:: +BGP99_heuristics_assign(const Pointset_Powerset& y, Widening wf) { + // `x' is the current iteration value. + Pointset_Powerset& x = *this; + +#ifndef NDEBUG + { + // We assume that `y' entails `x'. + const Pointset_Powerset x_copy = x; + const Pointset_Powerset y_copy = y; + assert(y_copy.definitely_entails(x_copy)); + } +#endif + + size_type n = x.size(); + Pointset_Powerset new_x(x.space_dim, EMPTY); + std::deque 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 PS& pi = i->element(); + const PS& pj = j->element(); + if (pi.contains(pj)) { + PS pi_copy = pi; + wf(pi_copy, pj); + new_x.add_non_bottom_disjunct_preserve_reduction(pi_copy); + marked[i_index] = true; + } + } + iterator nx_begin = new_x.begin(); + iterator nx_end = new_x.end(); + i_index = 0; + for (const_iterator i = x_begin; i != x_end; ++i, ++i_index) + if (!marked[i_index]) + nx_begin = new_x.add_non_bottom_disjunct_preserve_reduction(*i, + nx_begin, + nx_end); + std::swap(x.sequence, new_x.sequence); + assert(x.OK()); + assert(x.is_omega_reduced()); +} + +template +template +void +Pointset_Powerset:: +BGP99_extrapolation_assign(const Pointset_Powerset& y, + Widening wf, + unsigned max_disjuncts) { + // `x' is the current iteration value. + Pointset_Powerset& x = *this; + +#ifndef NDEBUG + { + // We assume that `y' entails `x'. + const Pointset_Powerset x_copy = x; + const Pointset_Powerset y_copy = y; + assert(y_copy.definitely_entails(x_copy)); + } +#endif + + x.pairwise_reduce(); + if (max_disjuncts != 0) + x.collapse(max_disjuncts); + x.BGP99_heuristics_assign(y, wf); +} + +template +template +void +Pointset_Powerset:: +collect_certificates(std::map& cert_ms) const { + const Pointset_Powerset& x = *this; + assert(x.is_omega_reduced()); + assert(cert_ms.size() == 0); + for (const_iterator i = x.begin(), end = x.end(); i != end; i++) { + Cert ph_cert(i->element()); + ++cert_ms[ph_cert]; + } +} + +template +template +bool +Pointset_Powerset:: +is_cert_multiset_stabilizing(const std::map& y_cert_ms + ) const { + typedef std::map Cert_Multiset; + Cert_Multiset x_cert_ms; + collect_certificates(x_cert_ms); + typename Cert_Multiset::const_iterator + xi = x_cert_ms.begin(), + x_cert_ms_end = x_cert_ms.end(), + yi = y_cert_ms.begin(), + 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 +template +void +Pointset_Powerset::BHZ03_widening_assign(const Pointset_Powerset& y, + Widening wf) { + // `x' is the current iteration value. + Pointset_Powerset& x = *this; + +#ifndef NDEBUG + { + // We assume that `y' entails `x'. + const Pointset_Powerset x_copy = x; + const Pointset_Powerset y_copy = y; + assert(y_copy.definitely_entails(x_copy)); + } +#endif + + // First widening technique: do nothing. + + // If `y' is the empty collection, do nothing. + assert(x.size() > 0); + if (y.size() == 0) + return; + + // Compute the poly-hull of `x'. + PS x_hull(x.space_dim, EMPTY); + for (const_iterator i = x.begin(), x_end = x.end(); i != x_end; ++i) + x_hull.upper_bound_assign(i->element()); + + // Compute the poly-hull of `y'. + PS y_hull(y.space_dim, EMPTY); + for (const_iterator i = y.begin(), y_end = y.end(); i != y_end; ++i) + y_hull.upper_bound_assign(i->element()); + // Compute the certificate for `y_hull'. + const Cert y_hull_cert(y_hull); + + // If the hull is stabilizing, do nothing. + int hull_stabilization = y_hull_cert.compare(x_hull); + if (hull_stabilization == 1) + return; + + // Multiset ordering is only useful when `y' is not a singleton. + const bool y_is_not_a_singleton = y.size() > 1; + + // The multiset certificate for `y': + // we want to be lazy about its computation. + typedef std::map Cert_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 bgp99_heuristics = x; + bgp99_heuristics.BGP99_heuristics_assign(y, wf); + + // Compute the poly-hull of `bgp99_heuristics'. + PS bgp99_heuristics_hull(x.space_dim, EMPTY); + for (const_iterator i = bgp99_heuristics.begin(), + bh_end = bgp99_heuristics.end(); i != bh_end; ++i) + bgp99_heuristics_hull.upper_bound_assign(i->element()); + + // Check for stabilization and, if successful, + // commit to the result of the extrapolation. + hull_stabilization = y_hull_cert.compare(bgp99_heuristics_hull); + if (hull_stabilization == 1) { + // The poly-hull is stabilizing. + std::swap(x, bgp99_heuristics); + return; + } + else if (hull_stabilization == 0 && y_is_not_a_singleton) { + // If not already done, compute multiset certificate for `y'. + if (!y_cert_ms_computed) { + y.collect_certificates(y_cert_ms); + y_cert_ms_computed = true; + } + if (bgp99_heuristics.is_cert_multiset_stabilizing(y_cert_ms)) { + std::swap(x, bgp99_heuristics); + return; + } + // Third widening technique: pairwise-reduction on `bgp99_heuristics'. + // Note that pairwise-reduction does not affect the computation + // of the poly-hulls, so that we only have to check the multiset + // certificate relation. + Pointset_Powerset reduced_bgp99_heuristics(bgp99_heuristics); + reduced_bgp99_heuristics.pairwise_reduce(); + if (reduced_bgp99_heuristics.is_cert_multiset_stabilizing(y_cert_ms)) { + std::swap(x, reduced_bgp99_heuristics); + return; + } + } + + // Fourth widening technique: this is applicable only when + // `y_hull' is a proper subset of `bgp99_heuristics_hull'. + if (bgp99_heuristics_hull.strictly_contains(y_hull)) { + // Compute (y_hull \widen bgp99_heuristics_hull). + PS ph = bgp99_heuristics_hull; + wf(ph, y_hull); + // Compute the difference between `ph' and `bgp99_heuristics_hull'. + ph.difference_assign(bgp99_heuristics_hull); + x.add_disjunct(ph); + return; + } + + // Fall back to the computation of the poly-hull. + Pointset_Powerset x_hull_singleton(x.space_dim, EMPTY); + x_hull_singleton.add_disjunct(x_hull); + std::swap(x, x_hull_singleton); +} + +template +void +Pointset_Powerset::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->element().ascii_dump(s); +} + +PPL_OUTPUT_TEMPLATE_DEFINITIONS(PS, Pointset_Powerset) + + template +bool +Pointset_Powerset::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) { + PS ph; + if (!ph.ascii_load(s)) + return false; + new_x.add_disjunct(ph); + } + x.swap(new_x); + + // Check invariants. + assert(x.OK()); + return true; +} + +template +bool +Pointset_Powerset::OK() const { + const Pointset_Powerset& x = *this; + for (const_iterator xi = x.begin(), x_end = x.end(); xi != x_end; ++xi) { + const PS& pi = xi->element(); + if (pi.space_dimension() != x.space_dim) { +#ifndef NDEBUG + std::cerr << "Space dimension mismatch: is " << pi.space_dimension() + << " in an element of the sequence,\nshould be " + << x.space_dim << "." + << std::endl; +#endif + return false; + } + } + return x.Base::OK(); +} + +namespace Implementation { + +namespace Pointset_Powersets { + +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Partitions polyhedron \p qq according to constraint \p c. +/*! \relates Parma_Polyhedra_Library::Pointset_Powerset + On exit, the intersection of \p qq and constraint \p c is stored + in \p qq, whereas the intersection of \p qq with the negation of \p c + is added as a new disjunct of the powerset \p r. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +void +linear_partition_aux(const Constraint& c, + PS& qq, + Pointset_Powerset& r) { + Linear_Expression le(c); + const Constraint& neg_c = c.is_strict_inequality() ? (le <= 0) : (le < 0); + NNC_Polyhedron qqq(qq); + qqq.add_constraint(neg_c); + if (!qqq.is_empty()) + r.add_disjunct(qqq); + qq.add_constraint(c); +} + +} // namespace Pointset_Powersets + +} // namespace Implementation + + +/*! \relates Pointset_Powerset */ +template +std::pair > +linear_partition(const PS& p, const PS& q) { + using Implementation::Pointset_Powersets::linear_partition_aux; + + Pointset_Powerset r(p.space_dimension(), EMPTY); + PS qq = q; + const Constraint_System& pcs = p.constraints(); + for (Constraint_System::const_iterator i = pcs.begin(), + pcs_end = pcs.end(); i != pcs_end; ++i) { + const Constraint& c = *i; + if (c.is_equality()) { + Linear_Expression le(c); + linear_partition_aux(le <= 0, qq, r); + linear_partition_aux(le >= 0, qq, r); + } + else + linear_partition_aux(c, qq, r); + } + return std::make_pair(qq, 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 28. */ +#include +#include + +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 true is returned, + otherwise false is returned. + + \relates Polyhedron +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +template +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 +bool +poly_hull_assign_if_exact(PH& p, const PH& q) { + PH phull = p; + NNC_Polyhedron nnc_p(p); + phull.poly_hull_assign(q); + std::pair > + partition = linear_partition(q, phull); + const Pointset_Powerset& s = partition.second; + typedef Pointset_Powerset::const_iterator iter; + for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i) + // The polyhedral hull is exact if and only if all the elements + // of the partition of the polyhedral hull of `p' and `q' with + // respect to `q' are included in `p' + if (!nnc_p.contains(i->element())) + return false; + p = phull; + return true; +} + +} // namespace Parma_Polyhedra_Library + +/* Automatically generated from PPL source file ../src/wrap.hh line 1. */ +/* Declaration of string wrapping function. +*/ + + +/* Automatically generated from PPL source file ../src/wrap.hh line 27. */ + +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 + + +#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 +#include + +#ifdef PPL_NO_AUTOMATIC_INITIALIZATION + #undef PPL_NO_AUTOMATIC_INITIALIZATION +#endif + +#endif diff --git a/src/ppl_header.hh b/src/ppl_header.hh new file mode 100644 index 0000000..25eab4d --- /dev/null +++ b/src/ppl_header.hh @@ -0,0 +1,113 @@ +/* This is the header file of the Parma Polyhedra Library. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_ppl_hh +#define PPL_ppl_hh 1 + +#ifdef NDEBUG +# define PPL_SAVE_NDEBUG 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" + +#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 +#include + +#ifdef PPL_NO_AUTOMATIC_INITIALIZATION + #undef PPL_NO_AUTOMATIC_INITIALIZATION +#endif + +#endif diff --git a/src/simplify.cc b/src/simplify.cc new file mode 100644 index 0000000..1dd7d57 --- /dev/null +++ b/src/simplify.cc @@ -0,0 +1,318 @@ +/* Polyhedron class implementation: simplify(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Linear_Row.defs.hh" +#include "Linear_System.defs.hh" +#include "Bit_Matrix.defs.hh" +#include "Polyhedron.defs.hh" +#include +#include + +namespace PPL = Parma_Polyhedra_Library; + +/*! + \return + The rank of \p sys. + + \param sys + The system to simplify: it will be modified; + + \param sat + The saturation matrix corresponding to \p sys. + + \p sys may be modified by swapping some of its rows and by possibly + removing some of them, if they turn out to be redundant. + + If \p sys is a system of constraints, then the rows of \p sat are + indexed by constraints and its columns are indexed by generators; + otherwise, if \p sys is a system of generators, then the rows of + \p sat are indexed by generators and its columns by constraints. + + Given a system of constraints or a system of generators, this function + simplifies it using Gauss' elimination method (to remove redundant + equalities/lines), deleting redundant inequalities/rays/points and + making back-substitution. + The explanation that follows assumes that \p sys is a system of + constraints. For the case when \p sys is a system of generators, + a similar explanation can be obtain by applying duality. + + The explanation relies on the notion of redundancy. + (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. +*/ +PPL::dimension_type +PPL::Polyhedron::simplify(Linear_System& sys, Bit_Matrix& sat) { + // This method is only applied to a well-formed system `sys'. + assert(sys.OK(true)); + assert(sys.num_columns() >= 1); + + dimension_type num_rows = sys.num_rows(); + const dimension_type num_columns = sys.num_columns(); + const dimension_type num_cols_sat = sat.num_columns(); + + // Looking for the first inequality in `sys'. + dimension_type num_lines_or_equalities = 0; + while (num_lines_or_equalities < num_rows + && sys[num_lines_or_equalities].is_line_or_equality()) + ++num_lines_or_equalities; + + // `num_saturators[i]' will contain the number of generators + // that saturate the constraint `sys[i]'. + 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::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* num_saturators = simplify_num_saturators_p; + + // Computing the number of saturators for each inequality, + // possibly identifying and swapping those that happen to be + // equalities (see Proposition above). + for (dimension_type i = num_lines_or_equalities; i < num_rows; ++i) { + if (sat[i].empty()) { + // The constraint `sys[i]' is saturated by all the generators. + // Thus, either it is already an equality or it can be transformed + // to an equality (see Proposition above). + sys[i].set_is_line_or_equality(); + // Note: simple normalization already holds. + sys[i].sign_normalize(); + // We also move it just after all the other equalities, + // so that system `sys' keeps its partial sortedness. + if (i != num_lines_or_equalities) { + std::swap(sys[i], sys[num_lines_or_equalities]); + std::swap(sat[i], sat[num_lines_or_equalities]); + std::swap(num_saturators[i], num_saturators[num_lines_or_equalities]); + } + ++num_lines_or_equalities; + // `sys' is no longer sorted. + sys.set_sorted(false); + } + else + // There exists a generator which does not saturate `sys[i]', + // so that `sys[i]' is indeed an inequality. + // We store the number of its saturators. + num_saturators[i] = num_cols_sat - sat[i].count_ones(); + } + + // At this point, all the equalities of `sys' (included those + // inequalities that we just transformed to equalities) have + // indexes between 0 and `num_lines_or_equalities' - 1, + // which is the property needed by method gauss(). + // We can simplify the system of equalities, obtaining the rank + // of `sys' as result. + const dimension_type rank = sys.gauss(num_lines_or_equalities); + + // Now the irredundant equalities of `sys' have indexes from 0 + // to `rank' - 1, whereas the equalities having indexes from `rank' + // to `num_lines_or_equalities' - 1 are all redundant. + // (The inequalities in `sys' have been left untouched.) + // The rows containing equalities are not sorted. + + if (rank < num_lines_or_equalities) { + // We identified some redundant equalities. + // Moving them at the bottom of `sys': + // - index `redundant' runs through the redundant equalities + // - index `erasing' identifies the first row that should + // be erased after this loop. + // Note that we exit the loop either because we have moved all + // redundant equalities or because we have moved all the + // inequalities. + for (dimension_type redundant = rank, + erasing = num_rows; + redundant < num_lines_or_equalities + && erasing > num_lines_or_equalities; + ) { + --erasing; + std::swap(sys[redundant], sys[erasing]); + std::swap(sat[redundant], sat[erasing]); + std::swap(num_saturators[redundant], num_saturators[erasing]); + sys.set_sorted(false); + ++redundant; + } + // Adjusting the value of `num_rows' to the number of meaningful + // rows of `sys': `num_lines_or_equalities' - `rank' is the number of + // redundant equalities moved to the bottom of `sys', which are + // no longer meaningful. + num_rows -= num_lines_or_equalities - rank; + // Adjusting the value of `num_lines_or_equalities'. + num_lines_or_equalities = rank; + } + + // Now we use the definition of redundancy (given in the Introduction) + // to remove redundant inequalities. + + // First we check the saturation rule, which provides a necessary + // condition for an inequality to be irredundant (i.e., it provides + // a sufficient condition for identifying redundant inequalities). + // Let + // num_saturators[i] = num_sat_lines[i] + num_sat_rays_or_points[i]; + // dim_lin_space = num_irred_lines; + // dim_ray_space + // = dim_vector_space - num_irred_equalities - dim_lin_space + // = num_columns - 1 - num_lines_or_equalities - dim_lin_space; + // min_sat_rays_or_points = dim_ray_space. + // + // An inequality saturated by less than `dim_ray_space' _rays/points_ + // is redundant. Thus we have the implication + // + // (num_saturators[i] - num_sat_lines[i] < dim_ray_space) + // ==> + // redundant(sys[i]). + // + // Moreover, since every line saturates all inequalities, we also have + // dim_lin_space = num_sat_lines[i] + // so that we can rewrite the condition above as follows: + // + // (num_saturators[i] < num_columns - num_lines_or_equalities - 1) + // ==> + // redundant(sys[i]). + // + const dimension_type min_saturators + = num_columns - num_lines_or_equalities - 1; + for (dimension_type i = num_lines_or_equalities; i < num_rows; ) { + if (num_saturators[i] < min_saturators) { + // The inequality `sys[i]' is redundant. + --num_rows; + std::swap(sys[i], sys[num_rows]); + std::swap(sat[i], sat[num_rows]); + std::swap(num_saturators[i], num_saturators[num_rows]); + sys.set_sorted(false); + } + else + ++i; + } + + // Now we check the independence rule. + for (dimension_type i = num_lines_or_equalities; i < num_rows; ) { + bool redundant = false; + // NOTE: in the inner loop, index `j' runs through _all_ the + // inequalities and we do not test if `sat[i]' is strictly + // contained into `sat[j]'. Experimentation has shown that this + // is faster than having `j' only run through the indexes greater + // than `i' and also doing the test `strict_subset(sat[i], + // sat[k])'. + for (dimension_type j = num_lines_or_equalities; j < num_rows; ) { + if (i == j) + // We want to compare different rows of `sys'. + ++j; + else { + // Let us recall that each generator lies on a facet of the + // polyhedron (see the Introduction). + // Given two constraints `c_1' and `c_2', if there are `m' + // generators lying on the hyper-plane corresponding to `c_1', + // the same `m' generators lie on the hyper-plane + // corresponding to `c_2', too, and there is another one lying + // on the latter but not on the former, then `c_2' is more + // restrictive than `c_1', i.e., `c_1' is redundant. + bool strict_subset; + if (subset_or_equal(sat[j], sat[i], strict_subset)) + if (strict_subset) { + // All the saturators of the inequality `sys[i]' are + // saturators of the inequality `sys[j]' too, + // and there exists at least one saturator of `sys[j]' + // which is not a saturator of `sys[i]'. + // It follows that inequality `sys[i]' is redundant. + redundant = true; + break; + } + else { + // We have `sat[j] == sat[i]'. Hence inequalities + // `sys[i]' and `sys[j]' are saturated by the same set of + // generators. Then we can remove either one of the two + // inequalities: we remove `sys[j]'. + --num_rows; + std::swap(sys[j], sys[num_rows]); + std::swap(sat[j], sat[num_rows]); + std::swap(num_saturators[j], num_saturators[num_rows]); + sys.set_sorted(false); + } + else + // If we reach this point then we know that `sat[i]' does + // not contain (and is different from) `sat[j]', so that + // `sys[i]' is not made redundant by inequality `sys[j]'. + ++j; + } + } + if (redundant) { + // The inequality `sys[i]' is redundant. + --num_rows; + std::swap(sys[i], sys[num_rows]); + std::swap(sat[i], sat[num_rows]); + std::swap(num_saturators[i], num_saturators[num_rows]); + sys.set_sorted(false); + } + else + // The inequality `sys[i]' is not redundant. + ++i; + } + + // Here we physically remove the redundant inequalities previously + // moved to the bottom of `sys' and the corresponding `sat' rows. + sys.erase_to_end(num_rows); + sys.unset_pending_rows(); + sat.rows_erase_to_end(num_rows); + // At this point the first `num_lines_or_equalities' rows of 'sys' + // represent the irredundant equalities, while the remaining rows + // (i.e., those having indexes from `num_lines_or_equalities' to + // `num_rows' - 1) represent the irredundant inequalities. +#ifndef NDEBUG + // Check if the flag is set (that of the equalities is already set). + for (dimension_type i = num_lines_or_equalities; i < num_rows; ++i) + assert(sys[i].is_ray_or_point_or_inequality()); +#endif + + // Finally, since now the sub-system (of `sys') of the irredundant + // equalities is in triangular form, we back substitute each + // variables with the expression obtained considering the equalities + // starting from the last one. + sys.back_substitute(num_lines_or_equalities); + + // The returned value is the number of irredundant equalities i.e., + // the rank of the sub-system of `sys' containing only equalities. + // (See the Introduction for definition of lineality space dimension.) + return num_lines_or_equalities; +} diff --git a/src/stdiobuf.cc b/src/stdiobuf.cc new file mode 100644 index 0000000..a0323e1 --- /dev/null +++ b/src/stdiobuf.cc @@ -0,0 +1,78 @@ +/* stdiobuf class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "stdiobuf.defs.hh" + +namespace Parma_Polyhedra_Library { + +stdiobuf::int_type +stdiobuf::uflow() { + ungetc_buf = getc(fp); + return ungetc_buf; +} + +stdiobuf::int_type +stdiobuf::underflow() { + int_type c = getc(fp); + return ungetc(c, fp); +} + +std::streamsize +stdiobuf::xsgetn(char_type* s, std::streamsize n) { + std::streamsize r = fread(s, 1, n, fp); + if (r > 0) + ungetc_buf = traits_type::to_int_type(s[r - 1]); + else + ungetc_buf = traits_type::eof(); + return r; +} + +stdiobuf::int_type +stdiobuf::pbackfail(int_type c) { + const int_type eof = traits_type::eof(); + int_type u = traits_type::eq_int_type(c, eof) ? ungetc_buf : c; + ungetc_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) { + return fwrite(s, 1, n, fp); +} + +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) ? 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..c8e87dc --- /dev/null +++ b/src/stdiobuf.defs.hh @@ -0,0 +1,110 @@ +/* stdiobuf class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_stdiobuf_defs_hh +#define PPL_stdiobuf_defs_hh 1 + +#include "stdiobuf.types.hh" +#include +#include + +class Parma_Polyhedra_Library::stdiobuf + : public std::basic_streambuf > { +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 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 ungetc_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..f9d6e8d --- /dev/null +++ b/src/stdiobuf.inlines.hh @@ -0,0 +1,35 @@ +/* stdiobuf class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_stdiobuf_inlines_hh +#define PPL_stdiobuf_inlines_hh 1 + +namespace Parma_Polyhedra_Library { + +inline +stdiobuf::stdiobuf(FILE* file) + : fp(file), ungetc_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..960aca5 --- /dev/null +++ b/src/stdiobuf.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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.icc b/src/swapping_sort.icc new file mode 100644 index 0000000..462313b --- /dev/null +++ b/src/swapping_sort.icc @@ -0,0 +1,141 @@ +/* Sorting objects for which copies cost more than swaps. -*- C++ -*- + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_swapping_sort_icc +#define PPL_swapping_sort_icc 1 + +#include +#include + +namespace { +/* + This sorting algorithm avoids (almost all) copies of objects + by performing more iter_swap's: it is meant to be used when + object copying costs much more than object swapping. + + Moreover, the algorithm always uses std:iter_swap() instead of + std::swap() so as to behave as expected when instantiated on + Linear_System::With_Bit_Matrix_iterator. Namely, using a sorting + routine that either copies objects or directly swaps them + (i.e., without calling std::iter_swap) would not be correct + when using Linear_System::With_Bit_Matrix_iterator. +*/ + +template +inline const Value_Type& +median(const Value_Type& x, const Value_Type& y, const Value_Type& z, + Compare comp) { + return comp(x, y) + ? (comp(y, z) ? y : (comp(x, z) ? z : x)) + : (comp(x, z) ? x : (comp(y, z) ? z : y)); +} + +template +Iter +swapping_partition(Iter first, Iter last, const Value_Type& pivot, + Compare comp) { + for ( ; ; ) { + while (comp(*first, pivot)) + ++first; + --last; + while (comp(pivot, *last)) + --last; + if (first < last) { + std::iter_swap(first, last); + ++first; + } + else + return first; + } +} + +template +void +swapping_insertion_sort(Iter first, Iter last, Compare comp) { + if (first == last) + return; + for (Iter i = first + 1; i != last; ++i) { + Iter current = i; + if (comp(*current, *first)) { + Iter next = current + 1; + while (current != first) + std::iter_swap(--current, --next); + } + else { + Iter previous = current - 1; + while (comp(*current, *previous)) + std::iter_swap(current--, previous--); + } + } +} + +template +void +swapping_quicksort_loop(Iter first, Iter last, Compare comp) { + const typename std::iterator_traits::difference_type threshold = 16; + while (last - first > threshold) { + // The construction of this temporary object is + // required for the correctness of the algorithm. + Iter middle = first + (last - first) / 2; + typename std::iterator_traits::value_type + pivot = median(*first, *middle, *(last - 1), comp); + Iter part_point = swapping_partition(first, last, pivot, comp); + swapping_quicksort_loop(part_point, last, comp); + last = part_point; + } +} + +template +inline void +swapping_sort(Iter first, Iter last, Compare comp) { + if (first == last) + return; + swapping_quicksort_loop(first, last, comp); + swapping_insertion_sort(first, last, comp); +} + +template +Iter +swapping_unique(Iter first, Iter last) { + if (first == last) + return last; + Iter current = first; + Iter next = current; + ++next; + while(next != last && *current != *next) { + current = next; + ++next; + } + if (next == last) + return last; + ++next; + while (next != last) { + if (*current != *next) + std::iter_swap(++current, next); + ++next; + } + return ++current; +} + +} // namespace + +#endif // !defined(PPL_swapping_sort_icc) diff --git a/src/version.cc b/src/version.cc new file mode 100644 index 0000000..1668318 --- /dev/null +++ b/src/version.cc @@ -0,0 +1,105 @@ +/* Definition of functions providing version and licensing information. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include +#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-2009 Roberto Bagnara .\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://www.cs.unipr.it/ppl/ .\n" +"\n" +"Contributors:\n" +"Roberto Bagnara, Patricia M. Hill, Enea Zaffanella, Elisa Ricci,\n" +"Abramo Bagnara, Andrea Cimino, Katy Dobson, Elena Mazzi,\n" +"Matthew Mundell, Barbara Quartieri, Enric Rodriguez Carbonell,\n" +"Alessandro Zaccagnini,\n" +"Irene Bacchi, Danilo Bonardi, Sara Bonini, Giordano Fracasso,\n" +"Maximiliano Marchesi, David Merchat, Andrea Pescetti, Angela Stazzone,\n" +"Fabio Trabucchi, 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, Costantino Medori,\n" +"Fred Mesnard, Ken Mixter, Jose Morales, Sebastian Pop, Thomas Reps,\n" +"Mooly Sagiv, Sriram Sankaranarayanan, Axel Simon, Fausto Spoto,\n" +"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..e77be78 --- /dev/null +++ b/src/version.hh.in @@ -0,0 +1,92 @@ +/* Declaration of macros and functions providing version -*- C++ -*- + and licensing information. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_version_hh +#define PPL_version_hh 1 + +//! The major number of the PPL version. +/*! \ingroup PPL_CXX_interface */ +#define PPL_VERSION_MAJOR @PPL_VERSION_MAJOR@ + +//! The minor number of the PPL version. +/*! \ingroup PPL_CXX_interface */ +#define PPL_VERSION_MINOR @PPL_VERSION_MINOR@ + +//! The revision number of the PPL version. +/*! \ingroup PPL_CXX_interface */ +#define PPL_VERSION_REVISION @PPL_VERSION_REVISION@ + +/*! \brief + The beta number of the PPL version. This is zero for official + releases and nonzero for development snapshots. + \ingroup PPL_CXX_interface +*/ +#define PPL_VERSION_BETA @PPL_VERSION_BETA@ + +//! A string containing the PPL version. +/*! \ingroup PPL_CXX_interface + Let M and m denote the numbers associated + to PPL_VERSION_MAJOR and PPL_VERSION_MINOR, respectively. The + format of PPL_VERSION is M "." m if both + PPL_VERSION_REVISION (r) and PPL_VERSION_BETA + (b)are zero, M "." m "pre" b if + PPL_VERSION_REVISION is zero and PPL_VERSION_BETA is not zero, + M "." m "." r if PPL_VERSION_REVISION is not zero and + PPL_VERSION_BETA is zero, M "." m "." r "pre" b if + neither PPL_VERSION_REVISION nor PPL_VERSION_BETA are zero. +*/ +#define PPL_VERSION "@VERSION@" + +namespace Parma_Polyhedra_Library { + +//! Returns the major number of the PPL version. +unsigned +version_major(); + +//! Returns the minor number of the PPL version. +unsigned +version_minor(); + +//! Returns the revision number of the PPL version. +unsigned +version_revision(); + +//! Returns the beta number of the PPL version. +unsigned +version_beta(); + +//! Returns a character string containing the PPL version. +const char* version(); + +//! Returns a character string containing the PPL banner. +/*! + The banner provides information about the PPL version, the licensing, + the lack of any warranty whatsoever, the C++ compiler used to build + the library, where to report bugs and where to look for further + information. +*/ +const char* banner(); + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_version_hh) diff --git a/src/wrap.cc b/src/wrap.cc new file mode 100644 index 0000000..69b20b6 --- /dev/null +++ b/src/wrap.cc @@ -0,0 +1,92 @@ +/* String wrapping helper function. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "wrap.hh" +#include + +namespace Parma_Polyhedra_Library { + +namespace IO_Operators { + +std::string +wrap_string(const std::string& src_string, + unsigned indent_depth, + unsigned preferred_first_line_length, + unsigned preferred_line_length) { + std::string dst_string; + const char *src = src_string.c_str(); + for (int line = 0; ; ++line) { + int linelen = (line == 0 + ? preferred_first_line_length + : preferred_line_length); + int last_comma = -1; + int last_space = -1; + int split_pos = -1; + int i; + for (i = 0; i <= linelen; ++i) { + if (src[i] == '\0' || src[i] == '\n') { + split_pos = i; + break; + } + if (src[i] == ',' && i < linelen) + last_comma = i; + if (isspace(src[i]) && (i == 0 || !isspace(src[i-1]))) + last_space = i; + } + if (split_pos < 0) { + if (last_comma >= 0) + split_pos = last_comma + 1; + else if (last_space >= 0) + split_pos = last_space; + else { + for ( ; src[i]; ++i) { + if (src[i] == ',') { + ++i; + break; + } + if (isspace(src[i])) + break; + } + split_pos = i; + } + } + if (split_pos > 0 && line > 0 && indent_depth > 0) + dst_string.append(indent_depth, ' '); + dst_string.append(src, split_pos); + src += split_pos; + if (isspace(*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.hh b/src/wrap.hh new file mode 100644 index 0000000..0980885 --- /dev/null +++ b/src/wrap.hh @@ -0,0 +1,59 @@ +/* Declaration of string wrapping function. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_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/tests/BD_Shape/Makefile.am b/tests/BD_Shape/Makefile.am new file mode 100644 index 0000000..1ffcdf0 --- /dev/null +++ b/tests/BD_Shape/Makefile.am @@ -0,0 +1,303 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +if VALGRIND_TESTS_ENABLED + +CHECKER = \ +$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \ +--num-callers=100 --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 \ +@extra_includes@ \ +@debug_flag@ + +LDADD = \ +$(top_builddir)/utils/libppl_utils.a \ +$(top_builddir)/tests/libppl_tests.a \ +$(top_builddir)/src/libppl.la \ +@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 \ +empty1 \ +equality1 \ +expandspacedim1 \ +foldspacedims1 \ +frombdshape1 \ +frombox1 \ +fromgensys1 \ +fromgrid1 \ +fromoctagonalshape1 \ +frompolyhedron1 \ +fromspacedim1 \ +generalizedaffineimage1 generalizedaffineimage2 \ +generalizedaffinepreimage1 generalizedaffinepreimage2 \ +generalizedaffinepreimage3 \ +geomcovers1 \ +h79widening1 \ +intersection1 \ +limitedbhmz05extrapolation1 \ +limitedcc76extrapolation1 \ +limitedh79extrapolation1 \ +mapspacedims1 \ +max_min1 max_min2 \ +maxspacedim1 \ +membytes1 \ +minconstraints1 \ +relations1 relations2 relations3 relations4 \ +removespacedims1 \ +simplifyusingcontext1 \ +timeelapse1 \ +unconstrain1 \ +universe1 \ +upperbound1 \ +upperboundifexact1 \ +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 + +empty1_SOURCES = empty1.cc + +equality1_SOURCES = equality1.cc + +expandspacedim1_SOURCES = expandspacedim1.cc + +foldspacedims1_SOURCES = foldspacedims1.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 + +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 + +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..ba32e2a --- /dev/null +++ b/tests/BD_Shape/Makefile.in @@ -0,0 +1,1559 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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) empty1$(EXEEXT) \ + equality1$(EXEEXT) expandspacedim1$(EXEEXT) \ + foldspacedims1$(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) 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) writebdshape1$(EXEEXT) +XFAIL_TESTS = +subdir = tests/BD_Shape +DIST_COMMON = $(dist_check_SCRIPTS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am_addconstraints1_OBJECTS = addconstraints1.$(OBJEXT) +addconstraints1_OBJECTS = $(am_addconstraints1_OBJECTS) +addconstraints1_LDADD = $(LDADD) +addconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_addspacedims1_OBJECTS = addspacedims1.$(OBJEXT) +addspacedims1_OBJECTS = $(am_addspacedims1_OBJECTS) +addspacedims1_LDADD = $(LDADD) +addspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_affinedimension1_OBJECTS = affinedimension1.$(OBJEXT) +affinedimension1_OBJECTS = $(am_affinedimension1_OBJECTS) +affinedimension1_LDADD = $(LDADD) +affinedimension1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_affineimage1_OBJECTS = affineimage1.$(OBJEXT) +affineimage1_OBJECTS = $(am_affineimage1_OBJECTS) +affineimage1_LDADD = $(LDADD) +affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_affineimage2_OBJECTS = affineimage2.$(OBJEXT) +affineimage2_OBJECTS = $(am_affineimage2_OBJECTS) +affineimage2_LDADD = $(LDADD) +affineimage2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_affinepreimage1_OBJECTS = affinepreimage1.$(OBJEXT) +affinepreimage1_OBJECTS = $(am_affinepreimage1_OBJECTS) +affinepreimage1_LDADD = $(LDADD) +affinepreimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_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_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_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_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_writebdshape1_OBJECTS = writebdshape1.$(OBJEXT) +writebdshape1_OBJECTS = $(am_writebdshape1_OBJECTS) +writebdshape1_LDADD = $(LDADD) +writebdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +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) $(empty1_SOURCES) \ + $(equality1_SOURCES) $(expandspacedim1_SOURCES) \ + $(foldspacedims1_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) $(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) \ + $(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) $(empty1_SOURCES) \ + $(equality1_SOURCES) $(expandspacedim1_SOURCES) \ + $(foldspacedims1_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) $(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) \ + $(writebdshape1_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +@VALGRIND_TESTS_ENABLED_FALSE@CHECKER = +@VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \ +@VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \ +@VALGRIND_TESTS_ENABLED_TRUE@--num-callers=100 --leak-resolution=high \ +@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 \ +@extra_includes@ \ +@debug_flag@ + +LDADD = \ +$(top_builddir)/utils/libppl_utils.a \ +$(top_builddir)/tests/libppl_tests.a \ +$(top_builddir)/src/libppl.la \ +@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 +@SUPPORTED_FLOAT_TRUE@FLOAT_INSTANCE = float +@SUPPORTED_DOUBLE_TRUE@DOUBLE_INSTANCE = double +@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 +empty1_SOURCES = empty1.cc +equality1_SOURCES = equality1.cc +expandspacedim1_SOURCES = expandspacedim1.cc +foldspacedims1_SOURCES = foldspacedims1.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 +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 +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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/BD_Shape/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign tests/BD_Shape/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +addconstraints1$(EXEEXT): $(addconstraints1_OBJECTS) $(addconstraints1_DEPENDENCIES) + @rm -f addconstraints1$(EXEEXT) + $(CXXLINK) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS) +addspacedims1$(EXEEXT): $(addspacedims1_OBJECTS) $(addspacedims1_DEPENDENCIES) + @rm -f addspacedims1$(EXEEXT) + $(CXXLINK) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS) +affinedimension1$(EXEEXT): $(affinedimension1_OBJECTS) $(affinedimension1_DEPENDENCIES) + @rm -f affinedimension1$(EXEEXT) + $(CXXLINK) $(affinedimension1_OBJECTS) $(affinedimension1_LDADD) $(LIBS) +affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) + @rm -f affineimage1$(EXEEXT) + $(CXXLINK) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS) +affineimage2$(EXEEXT): $(affineimage2_OBJECTS) $(affineimage2_DEPENDENCIES) + @rm -f affineimage2$(EXEEXT) + $(CXXLINK) $(affineimage2_OBJECTS) $(affineimage2_LDADD) $(LIBS) +affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES) + @rm -f affinepreimage1$(EXEEXT) + $(CXXLINK) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS) +ascii_dump_load1$(EXEEXT): $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_DEPENDENCIES) + @rm -f ascii_dump_load1$(EXEEXT) + $(CXXLINK) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS) +bgp99extrapolation1$(EXEEXT): $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_DEPENDENCIES) + @rm -f bgp99extrapolation1$(EXEEXT) + $(CXXLINK) $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_LDADD) $(LIBS) +bhmz05widening1$(EXEEXT): $(bhmz05widening1_OBJECTS) $(bhmz05widening1_DEPENDENCIES) + @rm -f bhmz05widening1$(EXEEXT) + $(CXXLINK) $(bhmz05widening1_OBJECTS) $(bhmz05widening1_LDADD) $(LIBS) +bhz03widening1$(EXEEXT): $(bhz03widening1_OBJECTS) $(bhz03widening1_DEPENDENCIES) + @rm -f bhz03widening1$(EXEEXT) + $(CXXLINK) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS) +bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES) + @rm -f bounded1$(EXEEXT) + $(CXXLINK) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS) +boundedaffineimage1$(EXEEXT): $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_DEPENDENCIES) + @rm -f boundedaffineimage1$(EXEEXT) + $(CXXLINK) $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_LDADD) $(LIBS) +boundedaffinepreimage1$(EXEEXT): $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_DEPENDENCIES) + @rm -f boundedaffinepreimage1$(EXEEXT) + $(CXXLINK) $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_LDADD) $(LIBS) +bounds1$(EXEEXT): $(bounds1_OBJECTS) $(bounds1_DEPENDENCIES) + @rm -f bounds1$(EXEEXT) + $(CXXLINK) $(bounds1_OBJECTS) $(bounds1_LDADD) $(LIBS) +cc76extrapolation1$(EXEEXT): $(cc76extrapolation1_OBJECTS) $(cc76extrapolation1_DEPENDENCIES) + @rm -f cc76extrapolation1$(EXEEXT) + $(CXXLINK) $(cc76extrapolation1_OBJECTS) $(cc76extrapolation1_LDADD) $(LIBS) +cc76narrowing1$(EXEEXT): $(cc76narrowing1_OBJECTS) $(cc76narrowing1_DEPENDENCIES) + @rm -f cc76narrowing1$(EXEEXT) + $(CXXLINK) $(cc76narrowing1_OBJECTS) $(cc76narrowing1_LDADD) $(LIBS) +closure1$(EXEEXT): $(closure1_OBJECTS) $(closure1_DEPENDENCIES) + @rm -f closure1$(EXEEXT) + $(CXXLINK) $(closure1_OBJECTS) $(closure1_LDADD) $(LIBS) +concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) + @rm -f concatenate1$(EXEEXT) + $(CXXLINK) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS) +congruences1$(EXEEXT): $(congruences1_OBJECTS) $(congruences1_DEPENDENCIES) + @rm -f congruences1$(EXEEXT) + $(CXXLINK) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS) +constrains1$(EXEEXT): $(constrains1_OBJECTS) $(constrains1_DEPENDENCIES) + @rm -f constrains1$(EXEEXT) + $(CXXLINK) $(constrains1_OBJECTS) $(constrains1_LDADD) $(LIBS) +constraints1$(EXEEXT): $(constraints1_OBJECTS) $(constraints1_DEPENDENCIES) + @rm -f constraints1$(EXEEXT) + $(CXXLINK) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS) +contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) + @rm -f contains1$(EXEEXT) + $(CXXLINK) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS) +containsintegerpoint1$(EXEEXT): $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_DEPENDENCIES) + @rm -f containsintegerpoint1$(EXEEXT) + $(CXXLINK) $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_LDADD) $(LIBS) +difference1$(EXEEXT): $(difference1_OBJECTS) $(difference1_DEPENDENCIES) + @rm -f difference1$(EXEEXT) + $(CXXLINK) $(difference1_OBJECTS) $(difference1_LDADD) $(LIBS) +discrete1$(EXEEXT): $(discrete1_OBJECTS) $(discrete1_DEPENDENCIES) + @rm -f discrete1$(EXEEXT) + $(CXXLINK) $(discrete1_OBJECTS) $(discrete1_LDADD) $(LIBS) +disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES) + @rm -f disjoint1$(EXEEXT) + $(CXXLINK) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS) +empty1$(EXEEXT): $(empty1_OBJECTS) $(empty1_DEPENDENCIES) + @rm -f empty1$(EXEEXT) + $(CXXLINK) $(empty1_OBJECTS) $(empty1_LDADD) $(LIBS) +equality1$(EXEEXT): $(equality1_OBJECTS) $(equality1_DEPENDENCIES) + @rm -f equality1$(EXEEXT) + $(CXXLINK) $(equality1_OBJECTS) $(equality1_LDADD) $(LIBS) +expandspacedim1$(EXEEXT): $(expandspacedim1_OBJECTS) $(expandspacedim1_DEPENDENCIES) + @rm -f expandspacedim1$(EXEEXT) + $(CXXLINK) $(expandspacedim1_OBJECTS) $(expandspacedim1_LDADD) $(LIBS) +foldspacedims1$(EXEEXT): $(foldspacedims1_OBJECTS) $(foldspacedims1_DEPENDENCIES) + @rm -f foldspacedims1$(EXEEXT) + $(CXXLINK) $(foldspacedims1_OBJECTS) $(foldspacedims1_LDADD) $(LIBS) +frombdshape1$(EXEEXT): $(frombdshape1_OBJECTS) $(frombdshape1_DEPENDENCIES) + @rm -f frombdshape1$(EXEEXT) + $(CXXLINK) $(frombdshape1_OBJECTS) $(frombdshape1_LDADD) $(LIBS) +frombox1$(EXEEXT): $(frombox1_OBJECTS) $(frombox1_DEPENDENCIES) + @rm -f frombox1$(EXEEXT) + $(CXXLINK) $(frombox1_OBJECTS) $(frombox1_LDADD) $(LIBS) +fromgensys1$(EXEEXT): $(fromgensys1_OBJECTS) $(fromgensys1_DEPENDENCIES) + @rm -f fromgensys1$(EXEEXT) + $(CXXLINK) $(fromgensys1_OBJECTS) $(fromgensys1_LDADD) $(LIBS) +fromgrid1$(EXEEXT): $(fromgrid1_OBJECTS) $(fromgrid1_DEPENDENCIES) + @rm -f fromgrid1$(EXEEXT) + $(CXXLINK) $(fromgrid1_OBJECTS) $(fromgrid1_LDADD) $(LIBS) +fromoctagonalshape1$(EXEEXT): $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_DEPENDENCIES) + @rm -f fromoctagonalshape1$(EXEEXT) + $(CXXLINK) $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_LDADD) $(LIBS) +frompolyhedron1$(EXEEXT): $(frompolyhedron1_OBJECTS) $(frompolyhedron1_DEPENDENCIES) + @rm -f frompolyhedron1$(EXEEXT) + $(CXXLINK) $(frompolyhedron1_OBJECTS) $(frompolyhedron1_LDADD) $(LIBS) +fromspacedim1$(EXEEXT): $(fromspacedim1_OBJECTS) $(fromspacedim1_DEPENDENCIES) + @rm -f fromspacedim1$(EXEEXT) + $(CXXLINK) $(fromspacedim1_OBJECTS) $(fromspacedim1_LDADD) $(LIBS) +generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES) + @rm -f generalizedaffineimage1$(EXEEXT) + $(CXXLINK) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS) +generalizedaffineimage2$(EXEEXT): $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_DEPENDENCIES) + @rm -f generalizedaffineimage2$(EXEEXT) + $(CXXLINK) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS) +generalizedaffinepreimage1$(EXEEXT): $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_DEPENDENCIES) + @rm -f generalizedaffinepreimage1$(EXEEXT) + $(CXXLINK) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS) +generalizedaffinepreimage2$(EXEEXT): $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_DEPENDENCIES) + @rm -f generalizedaffinepreimage2$(EXEEXT) + $(CXXLINK) $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_LDADD) $(LIBS) +generalizedaffinepreimage3$(EXEEXT): $(generalizedaffinepreimage3_OBJECTS) $(generalizedaffinepreimage3_DEPENDENCIES) + @rm -f generalizedaffinepreimage3$(EXEEXT) + $(CXXLINK) $(generalizedaffinepreimage3_OBJECTS) $(generalizedaffinepreimage3_LDADD) $(LIBS) +geomcovers1$(EXEEXT): $(geomcovers1_OBJECTS) $(geomcovers1_DEPENDENCIES) + @rm -f geomcovers1$(EXEEXT) + $(CXXLINK) $(geomcovers1_OBJECTS) $(geomcovers1_LDADD) $(LIBS) +h79widening1$(EXEEXT): $(h79widening1_OBJECTS) $(h79widening1_DEPENDENCIES) + @rm -f h79widening1$(EXEEXT) + $(CXXLINK) $(h79widening1_OBJECTS) $(h79widening1_LDADD) $(LIBS) +intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) + @rm -f intersection1$(EXEEXT) + $(CXXLINK) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS) +limitedbhmz05extrapolation1$(EXEEXT): $(limitedbhmz05extrapolation1_OBJECTS) $(limitedbhmz05extrapolation1_DEPENDENCIES) + @rm -f limitedbhmz05extrapolation1$(EXEEXT) + $(CXXLINK) $(limitedbhmz05extrapolation1_OBJECTS) $(limitedbhmz05extrapolation1_LDADD) $(LIBS) +limitedcc76extrapolation1$(EXEEXT): $(limitedcc76extrapolation1_OBJECTS) $(limitedcc76extrapolation1_DEPENDENCIES) + @rm -f limitedcc76extrapolation1$(EXEEXT) + $(CXXLINK) $(limitedcc76extrapolation1_OBJECTS) $(limitedcc76extrapolation1_LDADD) $(LIBS) +limitedh79extrapolation1$(EXEEXT): $(limitedh79extrapolation1_OBJECTS) $(limitedh79extrapolation1_DEPENDENCIES) + @rm -f limitedh79extrapolation1$(EXEEXT) + $(CXXLINK) $(limitedh79extrapolation1_OBJECTS) $(limitedh79extrapolation1_LDADD) $(LIBS) +mapspacedims1$(EXEEXT): $(mapspacedims1_OBJECTS) $(mapspacedims1_DEPENDENCIES) + @rm -f mapspacedims1$(EXEEXT) + $(CXXLINK) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS) +max_min1$(EXEEXT): $(max_min1_OBJECTS) $(max_min1_DEPENDENCIES) + @rm -f max_min1$(EXEEXT) + $(CXXLINK) $(max_min1_OBJECTS) $(max_min1_LDADD) $(LIBS) +max_min2$(EXEEXT): $(max_min2_OBJECTS) $(max_min2_DEPENDENCIES) + @rm -f max_min2$(EXEEXT) + $(CXXLINK) $(max_min2_OBJECTS) $(max_min2_LDADD) $(LIBS) +maxspacedim1$(EXEEXT): $(maxspacedim1_OBJECTS) $(maxspacedim1_DEPENDENCIES) + @rm -f maxspacedim1$(EXEEXT) + $(CXXLINK) $(maxspacedim1_OBJECTS) $(maxspacedim1_LDADD) $(LIBS) +membytes1$(EXEEXT): $(membytes1_OBJECTS) $(membytes1_DEPENDENCIES) + @rm -f membytes1$(EXEEXT) + $(CXXLINK) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS) +minconstraints1$(EXEEXT): $(minconstraints1_OBJECTS) $(minconstraints1_DEPENDENCIES) + @rm -f minconstraints1$(EXEEXT) + $(CXXLINK) $(minconstraints1_OBJECTS) $(minconstraints1_LDADD) $(LIBS) +relations1$(EXEEXT): $(relations1_OBJECTS) $(relations1_DEPENDENCIES) + @rm -f relations1$(EXEEXT) + $(CXXLINK) $(relations1_OBJECTS) $(relations1_LDADD) $(LIBS) +relations2$(EXEEXT): $(relations2_OBJECTS) $(relations2_DEPENDENCIES) + @rm -f relations2$(EXEEXT) + $(CXXLINK) $(relations2_OBJECTS) $(relations2_LDADD) $(LIBS) +relations3$(EXEEXT): $(relations3_OBJECTS) $(relations3_DEPENDENCIES) + @rm -f relations3$(EXEEXT) + $(CXXLINK) $(relations3_OBJECTS) $(relations3_LDADD) $(LIBS) +relations4$(EXEEXT): $(relations4_OBJECTS) $(relations4_DEPENDENCIES) + @rm -f relations4$(EXEEXT) + $(CXXLINK) $(relations4_OBJECTS) $(relations4_LDADD) $(LIBS) +removespacedims1$(EXEEXT): $(removespacedims1_OBJECTS) $(removespacedims1_DEPENDENCIES) + @rm -f removespacedims1$(EXEEXT) + $(CXXLINK) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS) +simplifyusingcontext1$(EXEEXT): $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_DEPENDENCIES) + @rm -f simplifyusingcontext1$(EXEEXT) + $(CXXLINK) $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_LDADD) $(LIBS) +timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES) + @rm -f timeelapse1$(EXEEXT) + $(CXXLINK) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS) +unconstrain1$(EXEEXT): $(unconstrain1_OBJECTS) $(unconstrain1_DEPENDENCIES) + @rm -f unconstrain1$(EXEEXT) + $(CXXLINK) $(unconstrain1_OBJECTS) $(unconstrain1_LDADD) $(LIBS) +universe1$(EXEEXT): $(universe1_OBJECTS) $(universe1_DEPENDENCIES) + @rm -f universe1$(EXEEXT) + $(CXXLINK) $(universe1_OBJECTS) $(universe1_LDADD) $(LIBS) +upperbound1$(EXEEXT): $(upperbound1_OBJECTS) $(upperbound1_DEPENDENCIES) + @rm -f upperbound1$(EXEEXT) + $(CXXLINK) $(upperbound1_OBJECTS) $(upperbound1_LDADD) $(LIBS) +upperboundifexact1$(EXEEXT): $(upperboundifexact1_OBJECTS) $(upperboundifexact1_DEPENDENCIES) + @rm -f upperboundifexact1$(EXEEXT) + $(CXXLINK) $(upperboundifexact1_OBJECTS) $(upperboundifexact1_LDADD) $(LIBS) +writebdshape1$(EXEEXT): $(writebdshape1_OBJECTS) $(writebdshape1_DEPENDENCIES) + @rm -f writebdshape1$(EXEEXT) + $(CXXLINK) $(writebdshape1_OBJECTS) $(writebdshape1_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addconstraints1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addspacedims1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/affinedimension1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/affineimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/affineimage2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/affinepreimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ascii_dump_load1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bgp99extrapolation1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bhmz05widening1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bhz03widening1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bounded1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/boundedaffineimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/boundedaffinepreimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bounds1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cc76extrapolation1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cc76narrowing1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/closure1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/concatenate1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/congruences1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/constrains1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/constraints1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/contains1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/containsintegerpoint1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/difference1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/discrete1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disjoint1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/empty1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/equality1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/expandspacedim1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/foldspacedims1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frombdshape1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frombox1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fromgensys1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fromgrid1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fromoctagonalshape1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frompolyhedron1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fromspacedim1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalizedaffineimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalizedaffineimage2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalizedaffinepreimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalizedaffinepreimage2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalizedaffinepreimage3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/geomcovers1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/h79widening1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/intersection1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/limitedbhmz05extrapolation1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/limitedcc76extrapolation1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/limitedh79extrapolation1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mapspacedims1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/max_min1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/max_min2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/maxspacedim1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/membytes1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minconstraints1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relations1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relations2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relations3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relations4.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/removespacedims1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplifyusingcontext1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timeelapse1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unconstrain1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/universe1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upperbound1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upperboundifexact1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/writebdshape1.Po@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; ws='[ ]'; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *$$ws$$tst$$ws*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + echo "XPASS: $$tst"; \ + ;; \ + *) \ + echo "PASS: $$tst"; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *$$ws$$tst$$ws*) \ + xfail=`expr $$xfail + 1`; \ + echo "XFAIL: $$tst"; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + echo "FAIL: $$tst"; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + echo "SKIP: $$tst"; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all tests failed"; \ + else \ + banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + skipped="($$skip tests were not run)"; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + test -z "$$skipped" || echo "$$skipped"; \ + test -z "$$report" || echo "$$report"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0; \ + else :; fi + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) \ + $(dist_check_SCRIPTS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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 + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +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 + +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 all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool ctags \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-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 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..f887c6e --- /dev/null +++ b/tests/BD_Shape/addconstraints1.cc @@ -0,0 +1,181 @@ +/* Test BD_Shape::add_constraints_and_minimize(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + Constraint_System cs; + cs.insert(A >= 0); + cs.insert(B == 5); + + TBD_Shape bds(2); + bds.add_constraints_and_minimize(cs); + + print_constraints(bds, "*** bds.add_constraints_and_minimize(cs) ***"); + + BD_Shape 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_and_minimize(cs): it is illegal to + // add a system of constraints that is not dimensional incompatible + // with the polyhedron. + Constraint_System cs; + cs.insert(x - y >= 0); + bds.add_constraints_and_minimize(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..8d44836 --- /dev/null +++ b/tests/BD_Shape/addspacedims1.cc @@ -0,0 +1,333 @@ +/* Test BD_Shape::add_space_dimensions_and_embed(): + we add two variables to a BD_Shape. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + //Variable y(1); + Variable z(2); + + TBD_Shape 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 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 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 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 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 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 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 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 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 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..bbd736d --- /dev/null +++ b/tests/BD_Shape/affinedimension1.cc @@ -0,0 +1,306 @@ +/* Test BD_Shape::affine_dimension(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + TBD_Shape 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..f5190be --- /dev/null +++ b/tests/BD_Shape/affineimage1.cc @@ -0,0 +1,442 @@ +/* Test BD_Shape::affine_image(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + TBD_Shape 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 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 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 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 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 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 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 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 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 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 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 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..9943e15 --- /dev/null +++ b/tests/BD_Shape/affineimage2.cc @@ -0,0 +1,351 @@ +/* Test BD_Shape::affine_image(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + Variable z(2); + + TBD_Shape 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 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 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 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 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 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 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 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 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 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 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 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..25ee32b --- /dev/null +++ b/tests/BD_Shape/affinepreimage1.cc @@ -0,0 +1,454 @@ +/* Test BD_Shape::affine_preimage(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + TBD_Shape 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 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 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 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 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 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 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 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 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 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 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 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 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 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_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..07c1e92 --- /dev/null +++ b/tests/BD_Shape/ascii_dump_load1.cc @@ -0,0 +1,246 @@ +/* Test BD_Shape::ascii_dump() and BD_Shape::ascii_load(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +#include "files.hh" +#include +#include + +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..b036d19 --- /dev/null +++ b/tests/BD_Shape/bgp99extrapolation1.cc @@ -0,0 +1,93 @@ +/* Test Pointset_Powerset::BGP99_extrapolation_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + typedef Pointset_Powerset 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..1e62321 --- /dev/null +++ b/tests/BD_Shape/bhmz05widening1.cc @@ -0,0 +1,343 @@ +/* Test BD_Shape::BHMZ05_widening_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + TBD_Shape 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 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 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 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 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 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 known_result(3); + known_result.add_constraint(-1 <= b-c); + known_result.add_constraint( b-c <= 1); + + bool ok = (BD_Shape(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 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 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..0b6a709 --- /dev/null +++ b/tests/BD_Shape/bhz03widening1.cc @@ -0,0 +1,76 @@ +/* Test Pointset_Powerset::BHZ03_widening_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + typedef Pointset_Powerset 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 + (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..9a84de6 --- /dev/null +++ b/tests/BD_Shape/bounded1.cc @@ -0,0 +1,96 @@ +/* Test BD_Shape::is_bounded(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + + // 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..fc722c0 --- /dev/null +++ b/tests/BD_Shape/boundedaffineimage1.cc @@ -0,0 +1,487 @@ +/* Test BD_Shape::bounded_affine_image(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + TBD_Shape 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 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 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 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 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 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 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 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 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 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 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 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 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..45f9551 --- /dev/null +++ b/tests/BD_Shape/boundedaffinepreimage1.cc @@ -0,0 +1,359 @@ +/* Test BD_Shape::bounded_affine_preimage(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + TBD_Shape 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 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 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 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 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 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 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 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 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 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 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 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; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + 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/bounds1.cc b/tests/BD_Shape/bounds1.cc new file mode 100644 index 0000000..7a552e3 --- /dev/null +++ b/tests/BD_Shape/bounds1.cc @@ -0,0 +1,272 @@ +/* Test BD_Shape::bounds_from_below() and BD_Shape::bounds_from_above(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + + TBD_Shape 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..08cdcea --- /dev/null +++ b/tests/BD_Shape/cc76extrapolation1.cc @@ -0,0 +1,488 @@ +/* Test BD_Shape::CC76_extrapolation_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + TBD_Shape 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 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 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'. + bds1 == bds2; + + BD_Shape 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'. + bds1 == bds2; + + bool ok = (BD_Shape(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 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 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 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 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 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 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..4dc2ed6 --- /dev/null +++ b/tests/BD_Shape/cc76narrowing1.cc @@ -0,0 +1,216 @@ +/* Test BD_Shape::CC76_narrowing_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + TBD_Shape 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 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 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 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 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 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..4e7a691 --- /dev/null +++ b/tests/BD_Shape/closure1.cc @@ -0,0 +1,599 @@ +/* Test shortest path closure. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +struct Edge { + unsigned int from; + unsigned int to; + unsigned long distance; +}; + +Edge hawaii[] = { + { 0, 1, 6191 }, + { 1, 0, 6191 }, + { 2, 3, 4147 }, + { 3, 2, 4147 }, + { 4, 5, 3884 }, + { 5, 4, 3884 }, + { 5, 6, 1609 }, + { 6, 5, 1609 }, + { 7, 0, 12521 }, + { 0, 7, 12521 }, + { 8, 1, 2872 }, + { 1, 8, 2872 }, + { 9, 10, 4036 }, + { 10, 9, 4036 }, + { 4, 11, 2959 }, + { 11, 4, 2959 }, + { 12, 13, 27415 }, + { 13, 12, 27415 }, + { 14, 15, 6068 }, + { 15, 14, 6068 }, + { 15, 16, 7337 }, + { 16, 15, 7337 }, + { 17, 18, 2894 }, + { 18, 17, 2894 }, + { 18, 19, 5425 }, + { 19, 18, 5425 }, + { 20, 21, 2265 }, + { 21, 20, 2265 }, + { 19, 20, 3008 }, + { 20, 19, 3008 }, + { 21, 12, 6654 }, + { 12, 21, 6654 }, + { 22, 23, 1563 }, + { 23, 22, 1563 }, + { 23, 24, 3470 }, + { 24, 23, 3470 }, + { 25, 26, 6536 }, + { 26, 25, 6536 }, + { 27, 28, 10373 }, + { 28, 27, 10373 }, + { 28, 29, 7866 }, + { 29, 28, 7866 }, + { 29, 30, 8961 }, + { 30, 29, 8961 }, + { 31, 32, 6954 }, + { 32, 31, 6954 }, + { 33, 34, 24135 }, + { 34, 33, 24135 }, + { 34, 35, 5943 }, + { 35, 34, 5943 }, + { 33, 36, 2389 }, + { 36, 33, 2389 }, + { 35, 37, 3374 }, + { 37, 35, 3374 }, + { 34, 38, 4494 }, + { 38, 34, 4494 }, + { 37, 38, 8295 }, + { 38, 37, 8295 }, + { 38, 39, 12091 }, + { 39, 38, 12091 }, + { 39, 40, 4356 }, + { 40, 39, 4356 }, + { 39, 30, 3986 }, + { 30, 39, 3986 }, + { 29, 41, 3937 }, + { 41, 29, 3937 }, + { 41, 28, 7159 }, + { 28, 41, 7159 }, + { 42, 43, 3887 }, + { 43, 42, 3887 }, + { 43, 44, 3685 }, + { 44, 43, 3685 }, + { 43, 45, 20903 }, + { 45, 43, 20903 }, + { 45, 46, 2226 }, + { 46, 45, 2226 }, + { 47, 44, 7487 }, + { 44, 47, 7487 }, + { 44, 48, 22511 }, + { 48, 44, 22511 }, + { 46, 48, 7280 }, + { 48, 46, 7280 }, + { 48, 49, 3112 }, + { 49, 48, 3112 }, + { 49, 50, 2530 }, + { 50, 49, 2530 }, + { 50, 51, 17408 }, + { 51, 50, 17408 }, + { 45, 52, 15249 }, + { 52, 45, 15249 }, + { 53, 54, 36470 }, + { 54, 53, 36470 }, + { 54, 49, 7694 }, + { 49, 54, 7694 }, + { 51, 55, 11400 }, + { 55, 51, 11400 }, + { 52, 46, 15473 }, + { 46, 52, 15473 }, + { 55, 56, 37433 }, + { 56, 55, 37433 }, + { 53, 57, 3855 }, + { 57, 53, 3855 }, + { 57, 58, 1508 }, + { 58, 57, 1508 }, + { 59, 60, 3574 }, + { 60, 59, 3574 }, + { 59, 53, 7377 }, + { 53, 59, 7377 }, + { 58, 60, 6801 }, + { 60, 58, 6801 }, + { 60, 61, 9191 }, + { 61, 60, 9191 }, + { 61, 62, 3940 }, + { 62, 61, 3940 }, + { 62, 63, 1941 }, + { 63, 62, 1941 }, + { 63, 64, 17861 }, + { 64, 63, 17861 }, + { 65, 66, 12138 }, + { 66, 65, 12138 }, + { 66, 67, 5764 }, + { 67, 66, 5764 }, + { 68, 62, 2365 }, + { 62, 68, 2365 }, + { 69, 70, 14756 }, + { 70, 69, 14756 }, + { 70, 71, 3931 }, + { 71, 70, 3931 }, + { 71, 72, 6955 }, + { 72, 71, 6955 }, + { 69, 73, 4265 }, + { 73, 69, 4265 }, + { 73, 56, 5278 }, + { 56, 73, 5278 }, + { 74, 75, 1088 }, + { 75, 74, 1088 }, + { 76, 77, 2549 }, + { 77, 76, 2549 }, + { 78, 79, 2029 }, + { 79, 78, 2029 }, + { 80, 81, 4607 }, + { 81, 80, 4607 }, + { 81, 82, 995 }, + { 82, 81, 995 }, + { 82, 83, 5708 }, + { 83, 82, 5708 }, + { 83, 84, 1015 }, + { 84, 83, 1015 }, + { 85, 86, 2592 }, + { 86, 85, 2592 }, + { 86, 75, 9272 }, + { 75, 86, 9272 }, + { 86, 87, 1549 }, + { 87, 86, 1549 }, + { 87, 88, 1155 }, + { 88, 87, 1155 }, + { 85, 84, 8375 }, + { 84, 85, 8375 }, + { 84, 89, 3022 }, + { 89, 84, 3022 }, + { 89, 90, 6455 }, + { 90, 89, 6455 }, + { 80, 91, 2912 }, + { 91, 80, 2912 }, + { 78, 92, 2087 }, + { 92, 78, 2087 }, + { 91, 76, 7736 }, + { 76, 91, 7736 }, + { 88, 85, 2143 }, + { 85, 88, 2143 }, + { 93, 8, 9507 }, + { 8, 93, 9507 }, + { 89, 88, 9385 }, + { 88, 89, 9385 }, + { 64, 65, 24795 }, + { 65, 64, 24795 }, + { 54, 94, 32035 }, + { 94, 54, 32035 }, + { 94, 56, 35025 }, + { 56, 94, 35025 }, + { 69, 95, 25243 }, + { 95, 69, 25243 }, + { 67, 96, 30757 }, + { 96, 67, 30757 }, + { 96, 97, 859 }, + { 97, 96, 859 }, + { 97, 95, 3230 }, + { 95, 97, 3230 }, + { 1, 9, 16155 }, + { 9, 1, 16155 }, + { 98, 51, 11706 }, + { 51, 98, 11706 }, + { 75, 99, 51590 }, + { 99, 75, 51590 }, + { 11, 100, 23417 }, + { 100, 11, 23417 }, + { 100, 101, 12368 }, + { 101, 100, 12368 }, + { 102, 103, 4846 }, + { 103, 102, 4846 }, + { 103, 104, 2901 }, + { 104, 103, 2901 }, + { 10, 104, 7849 }, + { 104, 10, 7849 }, + { 104, 2, 2147 }, + { 2, 104, 2147 }, + { 2, 102, 1761 }, + { 102, 2, 1761 }, + { 102, 4, 4444 }, + { 4, 102, 4444 }, + { 74, 105, 8183 }, + { 105, 74, 8183 }, + { 106, 107, 7075 }, + { 107, 106, 7075 }, + { 89, 107, 1178 }, + { 107, 89, 1178 }, + { 108, 81, 1312 }, + { 81, 108, 1312 }, + { 81, 109, 1793 }, + { 109, 81, 1793 }, + { 82, 108, 1001 }, + { 108, 82, 1001 }, + { 108, 80, 7421 }, + { 80, 108, 7421 }, + { 110, 92, 434 }, + { 92, 110, 434 }, + { 92, 79, 3285 }, + { 79, 92, 3285 }, + { 79, 99, 2706 }, + { 99, 79, 2706 }, + { 111, 78, 3052 }, + { 78, 111, 3052 }, + { 77, 111, 2036 }, + { 111, 77, 2036 }, + { 24, 25, 2634 }, + { 25, 24, 2634 }, + { 25, 21, 1832 }, + { 21, 25, 1832 }, + { 33, 112, 14461 }, + { 112, 33, 14461 }, + { 113, 114, 7998 }, + { 114, 113, 7998 }, + { 41, 115, 6937 }, + { 115, 41, 6937 }, + { 32, 116, 47595 }, + { 116, 32, 47595 }, + { 99, 117, 3887 }, + { 117, 99, 3887 }, + { 117, 118, 736 }, + { 118, 117, 736 }, + { 85, 83, 9281 }, + { 83, 85, 9281 }, + { 118, 80, 4823 }, + { 80, 118, 4823 }, + { 77, 119, 22341 }, + { 119, 77, 22341 }, + { 56, 120, 1612 }, + { 120, 56, 1612 }, + { 79, 121, 3258 }, + { 121, 79, 3258 }, + { 52, 57, 25357 }, + { 57, 52, 25357 }, + { 99, 121, 1646 }, + { 121, 99, 1646 }, + { 121, 76, 1359 }, + { 76, 121, 1359 }, + { 37, 27, 3890 }, + { 27, 37, 3890 }, + { 27, 31, 5066 }, + { 31, 27, 5066 }, + { 122, 123, 2556 }, + { 123, 122, 2556 }, + { 90, 122, 947 }, + { 122, 90, 947 }, + { 122, 124, 911 }, + { 124, 122, 911 }, + { 124, 125, 23829 }, + { 125, 124, 23829 }, + { 91, 119, 7911 }, + { 119, 91, 7911 }, +}; + +const mpq_class& +perturbate(unsigned long a) { + static mpq_class q; + q = a; + q = (q*q)/(q-1); + return q; +} + +template +void +add_edges(BD_Shape& bds, const Edge* edges, unsigned n) { + for (unsigned i = 0; i < n; ++i) { + const mpq_class& q = perturbate(edges[i].distance); + Coefficient a; + assign_r(a, q.get_den(), ROUND_NOT_NEEDED); + Coefficient b; + assign_r(b, q.get_num(), ROUND_NOT_NEEDED); + + nout << "a = " << a << "; b = " << b << endl; + + bds.add_constraint(a*Variable(edges[i].from) - a*Variable(edges[i].to) + <= b); + } +} + +bool +test01() { + BD_Shape qbds1(126); + add_edges(qbds1, hawaii, sizeof(hawaii)/sizeof(Edge)); + + TBD_Shape tbds(126); + add_edges(tbds, hawaii, sizeof(hawaii)/sizeof(Edge)); + + BD_Shape 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::is_exact; + int coefficients_digits = std::numeric_limits::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::is_exact; + int coefficients_digits = std::numeric_limits::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(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..ae7a99c --- /dev/null +++ b/tests/BD_Shape/concatenate1.cc @@ -0,0 +1,203 @@ +/* Test BD_Shape::concatenate_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + // Variable x1(0); + Variable x2(1); + Variable x3(2); + // Variable x4(3); + Variable x5(4); + Variable x6(5); + // Variable x7(6); + Variable x8(7); + Variable x9(8); + + TBD_Shape 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 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 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 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_and_minimize(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_and_minimize(B - A <= 1); + + print_constraints(bds1, "*** bds1 ***"); + print_constraints(bds2, "*** bds2 ***"); + + bds1.concatenate_assign(bds2); + + BD_Shape 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 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..22006c6 --- /dev/null +++ b/tests/BD_Shape/congruences1.cc @@ -0,0 +1,218 @@ +/* Test BD_Shape::congruences(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + + TBD_Shape bds1(2); + bds1.add_congruence((0*A %= 1) / 0); + + print_constraints(bds1, "*** bds1 ***"); + + BD_Shape 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 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 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 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 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 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 known_result(bds1); + + Congruence_System cgs = bds1.congruences(); + TBD_Shape bds2(cgs.space_dimension(), EMPTY); + bool b = bds2.add_congruences_and_minimize(cgs); + + 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 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..116d5a1 --- /dev/null +++ b/tests/BD_Shape/constrains1.cc @@ -0,0 +1,228 @@ +/* Test BD_Shape::constrains(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +#define 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..ba0d6bd --- /dev/null +++ b/tests/BD_Shape/constraints1.cc @@ -0,0 +1,196 @@ +/* Test BD_Shape::constraints(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + TBD_Shape bds1(0, EMPTY); + + BD_Shape 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 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 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 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 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 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 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..e75530f --- /dev/null +++ b/tests/BD_Shape/contains1.cc @@ -0,0 +1,183 @@ +/* Test BD_Shape::contains(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + Variable z(2); + + TBD_Shape 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; +} + +} // 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/containsintegerpoint1.cc b/tests/BD_Shape/containsintegerpoint1.cc new file mode 100644 index 0000000..c635826 --- /dev/null +++ b/tests/BD_Shape/containsintegerpoint1.cc @@ -0,0 +1,137 @@ +/* Test BD_Shape::contains_integer_point(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + Variable z(2); + + Constraint_System cs; + cs.insert(x >= 0); + cs.insert(x <= 1); + cs.insert(3*y <= 2); + cs.insert(3*y >= 1); + + BD_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; + + 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 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::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 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..78c1e8a --- /dev/null +++ b/tests/BD_Shape/difference1.cc @@ -0,0 +1,278 @@ +/* Test BD_Shape::difference_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + TBD_Shape 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 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 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 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 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 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 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 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..d4c86b2 --- /dev/null +++ b/tests/BD_Shape/discrete1.cc @@ -0,0 +1,214 @@ +/* Test BD_Shape::is_discrete(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + TBD_Shape 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..5a22e5b --- /dev/null +++ b/tests/BD_Shape/disjoint1.cc @@ -0,0 +1,195 @@ +/* Test BD_Shape::is_disjoint_from(const BD_Shape& y). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + TBD_Shape 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); +#ifndef __alpha__ + // Exception handling is broken in GCC on the Alpha. + DO_TEST(test04); +#endif + DO_TEST(test05); + DO_TEST(test06); + DO_TEST(test07); +END_MAIN diff --git a/tests/BD_Shape/empty1.cc b/tests/BD_Shape/empty1.cc new file mode 100644 index 0000000..73b47bf --- /dev/null +++ b/tests/BD_Shape/empty1.cc @@ -0,0 +1,206 @@ +/* Different ways of creating an empty BD_Shape. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + Variable z(2); + + TBD_Shape 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::is_bounded) + a = -(std::numeric_limits::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..8845be0 --- /dev/null +++ b/tests/BD_Shape/equality1.cc @@ -0,0 +1,131 @@ +/* Test BD_Shape::operator==(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + // Variable z(2); + + TBD_Shape 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..c0fec80 --- /dev/null +++ b/tests/BD_Shape/expandspacedim1.cc @@ -0,0 +1,245 @@ +/* Test BD_Shape::expand_space_dimension(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + + TBD_Shape 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..350aa55 --- /dev/null +++ b/tests/BD_Shape/foldspacedims1.cc @@ -0,0 +1,337 @@ +/* Test BD_Shape::fold_space_dimensions(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + TBD_Shape 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/frombdshape1.cc b/tests/BD_Shape/frombdshape1.cc new file mode 100644 index 0000000..53abd3c --- /dev/null +++ b/tests/BD_Shape/frombdshape1.cc @@ -0,0 +1,146 @@ +/* Test BD_Shape copy construct, construction from other + BD shapes and assignment. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + Constraint_System cs; + cs.insert(A >= 0); + cs.insert(B <= 7); + cs.insert(A - B <= 18); + TBD_Shape bds1(cs); + + TBD_Shape bds(bds1); + + BD_Shape 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 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 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 bds(bds1); + + BD_Shape known_result(cs); + + bool ok = (check_result(bds, known_result)); + + print_constraints(bds, "*** bds ***"); + + return ok; +} + +bool +test05() { + Variable A(0); + + BD_Shape 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 bds_z(bds_q); + + BD_Shape 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..88bd142 --- /dev/null +++ b/tests/BD_Shape/frombox1.cc @@ -0,0 +1,374 @@ +/* Test BD_Shape::BD_Shape(const Box&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Universe 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..f3a476e --- /dev/null +++ b/tests/BD_Shape/fromgensys1.cc @@ -0,0 +1,155 @@ +/* Test BD_Shape::BD_Shape(const Generator_System&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Generator_System gs; + TBD_Shape bds(gs); + + BD_Shape 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 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 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..ef6329d --- /dev/null +++ b/tests/BD_Shape/fromgrid1.cc @@ -0,0 +1,222 @@ +/* Test C_Polyhedron::C_Polyhedron(const Grid&) + and NNC_Polyhedron::NNC_Polyhedron(const Grid&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// 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 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 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 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 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 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 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 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 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 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..512d663 --- /dev/null +++ b/tests/BD_Shape/fromoctagonalshape1.cc @@ -0,0 +1,80 @@ +/* Test BD_Shape::BD_Shape(const Octagonal_Shape&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + Constraint_System cs; + cs.insert(A >= 0); + cs.insert(B <= 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 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 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..9c801cf --- /dev/null +++ b/tests/BD_Shape/frompolyhedron1.cc @@ -0,0 +1,64 @@ +/* Test BD_Shape::BD_Shape(const C_Polyhedron&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + Constraint_System cs; + cs.insert(A + 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 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..04de568 --- /dev/null +++ b/tests/BD_Shape/fromspacedim1.cc @@ -0,0 +1,122 @@ +/* Test BD_Shape::BD_Shape(dimension_type, Degenerate_Element). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + TBD_Shape 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..bf3a37a --- /dev/null +++ b/tests/BD_Shape/generalizedaffineimage1.cc @@ -0,0 +1,590 @@ +/* Test BD_Shape::generalized_affine_image(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + TBD_Shape 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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..9567fd9 --- /dev/null +++ b/tests/BD_Shape/generalizedaffineimage2.cc @@ -0,0 +1,517 @@ +/* Test BD_Shape::generalized_affine_image(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + TBD_Shape 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 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 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 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 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 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 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 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 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 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 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 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 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..c86bee2 --- /dev/null +++ b/tests/BD_Shape/generalizedaffinepreimage1.cc @@ -0,0 +1,476 @@ +/* Test BD_Shape::generalized_affine_preimage(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include + +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 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 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 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 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 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 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 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 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 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::is_bounded + && (std::numeric_limits::min() > -203 + || std::numeric_limits::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 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 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 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, "5.13e-6", "2.73e-6", "1.67e-6"); + + 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 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 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.98e-6", "9.26e-7", "5.25e-7"); + + 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 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..825dc49 --- /dev/null +++ b/tests/BD_Shape/generalizedaffinepreimage2.cc @@ -0,0 +1,609 @@ +/* Test BD_Shape::generalized_affine_preimage(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + Variable C(2); + + TBD_Shape 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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..bbc6950 --- /dev/null +++ b/tests/BD_Shape/generalizedaffinepreimage3.cc @@ -0,0 +1,173 @@ +/* Test BD_Shape::generalized_affine_preimage(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + 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 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..6308fce --- /dev/null +++ b/tests/BD_Shape/geomcovers1.cc @@ -0,0 +1,71 @@ +/* Test Pointset_Powerset::geometrically_covers(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + + Constraint_System cs1, cs2, cs3, cs4; + cs1.insert(x >= 0); + cs1.insert(x <= 4); + cs2.insert(x >= 4); + cs2.insert(x <= 6); + cs3.insert(x >= 1); + cs3.insert(x <= 5); + TBD_Shape bds1(cs1); + TBD_Shape bds2(cs2); + TBD_Shape bds3(cs3); + + Pointset_Powerset ps12(1, EMPTY); + ps12.add_disjunct(bds1); + ps12.add_disjunct(bds2); + + Pointset_Powerset 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..26648a4 --- /dev/null +++ b/tests/BD_Shape/h79widening1.cc @@ -0,0 +1,62 @@ +/* Test BD_Shape::H79_widening_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + TBD_Shape 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 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/intersection1.cc b/tests/BD_Shape/intersection1.cc new file mode 100644 index 0000000..44df9f6 --- /dev/null +++ b/tests/BD_Shape/intersection1.cc @@ -0,0 +1,364 @@ +/* Test BD_Shape::intersection_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + TBD_Shape 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 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 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 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 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 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 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 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 known_result(bds2); + + bds1.intersection_assign_and_minimize(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_and_minimize(bds2): it is illegal + // to apply this method to two polyhedra of different dimensions. + bds1.intersection_assign_and_minimize(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 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 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..86e0aac --- /dev/null +++ b/tests/BD_Shape/limitedbhmz05extrapolation1.cc @@ -0,0 +1,526 @@ +/* Test BD_Shape::limited_BHMZ05_extrapolation_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + Constraint_System cs1; + cs1.insert(x <= 1); + cs1.insert(y >= 4); + + Constraint_System cs2; + cs2.insert(x <= 0); + cs2.insert(y >= 5); + + TBD_Shape 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 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 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 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 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 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 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 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 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 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..8ded1fc --- /dev/null +++ b/tests/BD_Shape/limitedcc76extrapolation1.cc @@ -0,0 +1,538 @@ +/* Test BD_Shape::limited_CC76_extrapolation_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + TBD_Shape bds1(0); + TBD_Shape bds2(0); + Constraint_System cs; + + print_constraints(bds1, "*** bds1 ***"); + print_constraints(bds2, "*** bds2 ***"); + + BD_Shape 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 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 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 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 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 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 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 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 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 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 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 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..3cdc7e5 --- /dev/null +++ b/tests/BD_Shape/limitedh79extrapolation1.cc @@ -0,0 +1,70 @@ +/* Test BD_Shape::limited_H79_extrapolation_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + Constraint_System cs1; + cs1.insert(x <= 1); + cs1.insert(y >= 4); + + TBD_Shape 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 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..2862947 --- /dev/null +++ b/tests/BD_Shape/mapspacedims1.cc @@ -0,0 +1,292 @@ +/* Test BD_Shape::map_space_dimensions(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Partial_Function function; + + TBD_Shape bds(3); + + print_function(function, "*** function ***"); + print_constraints(bds, "*** bds ***"); + + bds.map_space_dimensions(function); + + BD_Shape 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 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 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 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 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 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 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 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 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..8fdf04f --- /dev/null +++ b/tests/BD_Shape/max_min1.cc @@ -0,0 +1,780 @@ +/* Test BD_Shape::maximize(const Linear_Expression&, ...) + and BD_Shape::minimize(const Linear_Expression&, ...). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x1(0); + Variable x2(1); + + 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..915035b --- /dev/null +++ b/tests/BD_Shape/max_min2.cc @@ -0,0 +1,439 @@ +/* Test BD_Shape::maximize(const Linear_Expression&, ...) + and BD_Shape::minimize(const Linear_Expression&, ...). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + TBD_Shape 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 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 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 divisor; + assign_r(divisor, 2, ROUND_NOT_NEEDED); + Checked_Number 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 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 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 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..ce478ec --- /dev/null +++ b/tests/BD_Shape/maxspacedim1.cc @@ -0,0 +1,95 @@ +/* Test BD_Shape::max_space_dimension(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + nout << BD_Shape::max_space_dimension() << " (signed char)" + << endl + << BD_Shape::max_space_dimension() << " (short)" + << endl + << BD_Shape::max_space_dimension() << " (int)" + << endl + << BD_Shape::max_space_dimension() << " (long)" + << endl + << BD_Shape::max_space_dimension() << " (long long)" + << endl +#if PPL_SUPPORTED_FLOAT + << BD_Shape::max_space_dimension() << " (float)" + << endl +#endif +#if PPL_SUPPORTED_DOUBLE + << BD_Shape::max_space_dimension() << " (double)" + << endl +#endif +#if PPL_SUPPORTED_LONG_DOUBLE + << BD_Shape::max_space_dimension() << " (long double)" + << endl +#endif + << BD_Shape::max_space_dimension() << " (mpz_class)" + << endl + << BD_Shape::max_space_dimension() << " (mpq_class)" + << endl; + + if (BD_Shape::max_space_dimension() + < BD_Shape::max_space_dimension()) + return false; + + if (BD_Shape::max_space_dimension() + < BD_Shape::max_space_dimension()) + return false; + + if (BD_Shape::max_space_dimension() + < BD_Shape::max_space_dimension()) + return false; + + if (BD_Shape::max_space_dimension() + < BD_Shape::max_space_dimension()) + return false; + +#if PPL_SUPPORTED_FLOAT && PPL_SUPPORTED_DOUBLE + if (BD_Shape::max_space_dimension() + < BD_Shape::max_space_dimension()) + return false; +#endif + +#if PPL_SUPPORTED_DOUBLE && PPL_SUPPORTED_LONG_DOUBLE + if (BD_Shape::max_space_dimension() + < BD_Shape::max_space_dimension()) + return false; +#endif + + if (2*BD_Shape::max_space_dimension() + < BD_Shape::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..89360e4 --- /dev/null +++ b/tests/BD_Shape/membytes1.cc @@ -0,0 +1,240 @@ +/* Test the total_memory_in_bytes() and external_memory_in_bytes() methods. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +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 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 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 pqbds(qbds); + + Pointset_Powerset 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..994dcc2 --- /dev/null +++ b/tests/BD_Shape/minconstraints1.cc @@ -0,0 +1,94 @@ +/* Test BD_Shape::minimized_constraints(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + TBD_Shape 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..780d9cd --- /dev/null +++ b/tests/BD_Shape/relations1.cc @@ -0,0 +1,470 @@ +/* Test BD_Shape::relation_with(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + + TBD_Shape 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..b313d20 --- /dev/null +++ b/tests/BD_Shape/relations2.cc @@ -0,0 +1,444 @@ +/* Test BD_Shape::relation_with(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + // The zero-dim universe BDS. + TBD_Shape 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..0820abf --- /dev/null +++ b/tests/BD_Shape/relations3.cc @@ -0,0 +1,461 @@ +/* Test BD_Shape::relation_with(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + Variable C(2); + + TBD_Shape 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); + } + 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)); + } + 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 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..caf275b --- /dev/null +++ b/tests/BD_Shape/relations4.cc @@ -0,0 +1,435 @@ +/* Test BD_Shape::relation_with(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + Constraint_System cs; + cs.insert(A >= 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..00d7b1c --- /dev/null +++ b/tests/BD_Shape/removespacedims1.cc @@ -0,0 +1,387 @@ +/* Remove some variables from the space. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + // Variable x1(0); + Variable x2(1); + Variable x3(2); + Variable x4(3); + Variable x5(4); + Variable x6(5); + + TBD_Shape 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 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 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 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 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 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 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 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 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 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..b0aa753 --- /dev/null +++ b/tests/BD_Shape/run_tests @@ -0,0 +1,53 @@ +#!/bin/sh + +# Run the BD_Shape tests. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/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..c10007d --- /dev/null +++ b/tests/BD_Shape/simplifyusingcontext1.cc @@ -0,0 +1,305 @@ +/* Test BD_Shape::simplify_using_context_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + TBD_Shape 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..b45bcd7 --- /dev/null +++ b/tests/BD_Shape/timeelapse1.cc @@ -0,0 +1,242 @@ +/* Test time_elapse_assign() for particular polyhedra. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + TBD_Shape 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 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 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 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 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 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..5b9c8f8 --- /dev/null +++ b/tests/BD_Shape/unconstrain1.cc @@ -0,0 +1,228 @@ +/* Test BD_Shape::unconstrain(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + TBD_Shape 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; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + 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/universe1.cc b/tests/BD_Shape/universe1.cc new file mode 100644 index 0000000..f8478bc --- /dev/null +++ b/tests/BD_Shape/universe1.cc @@ -0,0 +1,89 @@ +/* Test BD_Shape::is_universe(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + TBD_Shape 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..0fa04c4 --- /dev/null +++ b/tests/BD_Shape/upperbound1.cc @@ -0,0 +1,280 @@ +/* Test BD_Shape::upper_bound_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x1(0); + Variable x2(1); + Variable x3(2); + Variable x4(3); + + TBD_Shape 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 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 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 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 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 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 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..97bb3b5 --- /dev/null +++ b/tests/BD_Shape/upperboundifexact1.cc @@ -0,0 +1,375 @@ +/* Test BD_Shape::upper_bound_assign_if_exact(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + TBD_Shape 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/writebdshape1.cc b/tests/BD_Shape/writebdshape1.cc new file mode 100644 index 0000000..c54f52b --- /dev/null +++ b/tests/BD_Shape/writebdshape1.cc @@ -0,0 +1,126 @@ +/* Test operator<<(ostream&, const BD_Shape&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include + +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..9be42b2 --- /dev/null +++ b/tests/Box/Makefile.am @@ -0,0 +1,331 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +if VALGRIND_TESTS_ENABLED + +CHECKER = \ +$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \ +--num-callers=100 --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 \ +@extra_includes@ \ +@debug_flag@ + +LDADD = \ +$(top_builddir)/utils/libppl_utils.a \ +$(top_builddir)/tests/libppl_tests.a \ +$(top_builddir)/src/libppl.la \ +@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 \ +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 \ +refinewithcongruences1 \ +removespacedims1 \ +simplifyusingcontext1 \ +timeelapse1 \ +topclosed1 \ +unconstrain1 \ +universe1 \ +upperbound1 \ +upperboundifexact1 \ +writebox1 + +DERIVED_TESTS = \ +nnc_frompolyhedron1 + +ALL_TESTS = $(ORIGINAL_TESTS) $(DERIVED_TESTS) $(WATCHDOG_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 + +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 + +refinewithconstraint1_SOURCES = refinewithconstraint1.cc +refinewithconstraint2_SOURCES = refinewithconstraint2.cc + +refinewithconstraints1_SOURCES = refinewithconstraints1.cc + +refinewithcongruences1_SOURCES = refinewithcongruences1.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 + +writebox1_SOURCES = writebox1.cc + +refinewithconstraints2_SRCS = refinewithconstraints2.cc + +if BUILD_WATCHDOG_LIBRARY +WATCHDOG_TESTS = refinewithconstraints2 + +refinewithconstraints2_SOURCES = $(refinewithconstraints2_SRCS) +refinewithconstraints2_CPPFLAGS = \ +$(AM_CPPFLAGS) \ +-I$(top_builddir)/Watchdog \ +-I$(top_builddir)/Watchdog/src +refinewithconstraints2_LDADD = $(LDADD) $(top_builddir)/Watchdog/src/libpwl.la + +endif BUILD_WATCHDOG_LIBRARY + +# +# 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 = $(refinewithconstraints2_SRCS) + +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 + +$(top_builddir)/Watchdog/src/libpwl.la: + $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/Watchdog/src libpwl.la diff --git a/tests/Box/Makefile.in b/tests/Box/Makefile.in new file mode 100644 index 0000000..3f6f57c --- /dev/null +++ b/tests/Box/Makefile.in @@ -0,0 +1,1693 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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_4) $(am__EXEEXT_5) +subdir = tests/Box +DIST_COMMON = $(dist_check_SCRIPTS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__EXEEXT_1 = 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) 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) \ + refinewithcongruences1$(EXEEXT) removespacedims1$(EXEEXT) \ + simplifyusingcontext1$(EXEEXT) timeelapse1$(EXEEXT) \ + topclosed1$(EXEEXT) unconstrain1$(EXEEXT) universe1$(EXEEXT) \ + upperbound1$(EXEEXT) upperboundifexact1$(EXEEXT) \ + writebox1$(EXEEXT) +am__EXEEXT_2 = nnc_frompolyhedron1$(EXEEXT) +@BUILD_WATCHDOG_LIBRARY_TRUE@am__EXEEXT_3 = \ +@BUILD_WATCHDOG_LIBRARY_TRUE@ refinewithconstraints2$(EXEEXT) +am__EXEEXT_4 = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) +am__EXEEXT_5 = +am_addconstraints1_OBJECTS = addconstraints1.$(OBJEXT) +addconstraints1_OBJECTS = $(am_addconstraints1_OBJECTS) +addconstraints1_LDADD = $(LDADD) +addconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_addspacedims1_OBJECTS = addspacedims1.$(OBJEXT) +addspacedims1_OBJECTS = $(am_addspacedims1_OBJECTS) +addspacedims1_LDADD = $(LDADD) +addspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_affinedimension1_OBJECTS = affinedimension1.$(OBJEXT) +affinedimension1_OBJECTS = $(am_affinedimension1_OBJECTS) +affinedimension1_LDADD = $(LDADD) +affinedimension1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_affineimage1_OBJECTS = affineimage1.$(OBJEXT) +affineimage1_OBJECTS = $(am_affineimage1_OBJECTS) +affineimage1_LDADD = $(LDADD) +affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_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_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) --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_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_SOURCES_DIST = refinewithconstraints2.cc +am__objects_1 = \ + refinewithconstraints2-refinewithconstraints2.$(OBJEXT) +@BUILD_WATCHDOG_LIBRARY_TRUE@am_refinewithconstraints2_OBJECTS = \ +@BUILD_WATCHDOG_LIBRARY_TRUE@ $(am__objects_1) +refinewithconstraints2_OBJECTS = $(am_refinewithconstraints2_OBJECTS) +am__DEPENDENCIES_1 = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +@BUILD_WATCHDOG_LIBRARY_TRUE@refinewithconstraints2_DEPENDENCIES = \ +@BUILD_WATCHDOG_LIBRARY_TRUE@ $(am__DEPENDENCIES_1) \ +@BUILD_WATCHDOG_LIBRARY_TRUE@ $(top_builddir)/Watchdog/src/libpwl.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_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 +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +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) $(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) \ + $(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) $(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) $(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) \ + $(refinewithcongruences1_SOURCES) \ + $(refinewithconstraint1_SOURCES) \ + $(refinewithconstraint2_SOURCES) \ + $(refinewithconstraints1_SOURCES) \ + $(am__refinewithconstraints2_SOURCES_DIST) \ + $(relations1_SOURCES) $(relations2_SOURCES) \ + $(relations3_SOURCES) $(relations4_SOURCES) \ + $(removespacedims1_SOURCES) $(simplifyusingcontext1_SOURCES) \ + $(timeelapse1_SOURCES) $(topclosed1_SOURCES) \ + $(unconstrain1_SOURCES) $(universe1_SOURCES) \ + $(upperbound1_SOURCES) $(upperboundifexact1_SOURCES) \ + $(writebox1_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +@VALGRIND_TESTS_ENABLED_FALSE@CHECKER = +@VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \ +@VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \ +@VALGRIND_TESTS_ENABLED_TRUE@--num-callers=100 --leak-resolution=high \ +@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 \ +@extra_includes@ \ +@debug_flag@ + +LDADD = \ +$(top_builddir)/utils/libppl_utils.a \ +$(top_builddir)/tests/libppl_tests.a \ +$(top_builddir)/src/libppl.la \ +@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 \ +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 \ +refinewithcongruences1 \ +removespacedims1 \ +simplifyusingcontext1 \ +timeelapse1 \ +topclosed1 \ +unconstrain1 \ +universe1 \ +upperbound1 \ +upperboundifexact1 \ +writebox1 + +DERIVED_TESTS = \ +nnc_frompolyhedron1 + +ALL_TESTS = $(ORIGINAL_TESTS) $(DERIVED_TESTS) $(WATCHDOG_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 +@SUPPORTED_FLOAT_TRUE@FLOAT_INSTANCES = fl_r_oc +@SUPPORTED_DOUBLE_TRUE@DOUBLE_INSTANCES = db_r_oc +@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 +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 +refinewithconstraint1_SOURCES = refinewithconstraint1.cc +refinewithconstraint2_SOURCES = refinewithconstraint2.cc +refinewithconstraints1_SOURCES = refinewithconstraints1.cc +refinewithcongruences1_SOURCES = refinewithcongruences1.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 +writebox1_SOURCES = writebox1.cc +refinewithconstraints2_SRCS = refinewithconstraints2.cc +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_TESTS = refinewithconstraints2 +@BUILD_WATCHDOG_LIBRARY_TRUE@refinewithconstraints2_SOURCES = $(refinewithconstraints2_SRCS) +@BUILD_WATCHDOG_LIBRARY_TRUE@refinewithconstraints2_CPPFLAGS = \ +@BUILD_WATCHDOG_LIBRARY_TRUE@$(AM_CPPFLAGS) \ +@BUILD_WATCHDOG_LIBRARY_TRUE@-I$(top_builddir)/Watchdog \ +@BUILD_WATCHDOG_LIBRARY_TRUE@-I$(top_builddir)/Watchdog/src + +@BUILD_WATCHDOG_LIBRARY_TRUE@refinewithconstraints2_LDADD = $(LDADD) $(top_builddir)/Watchdog/src/libpwl.la + +# +# 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 = $(refinewithconstraints2_SRCS) +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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Box/Makefile'; \ + 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 + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +addconstraints1$(EXEEXT): $(addconstraints1_OBJECTS) $(addconstraints1_DEPENDENCIES) + @rm -f addconstraints1$(EXEEXT) + $(CXXLINK) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS) +addspacedims1$(EXEEXT): $(addspacedims1_OBJECTS) $(addspacedims1_DEPENDENCIES) + @rm -f addspacedims1$(EXEEXT) + $(CXXLINK) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS) +affinedimension1$(EXEEXT): $(affinedimension1_OBJECTS) $(affinedimension1_DEPENDENCIES) + @rm -f affinedimension1$(EXEEXT) + $(CXXLINK) $(affinedimension1_OBJECTS) $(affinedimension1_LDADD) $(LIBS) +affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) + @rm -f affineimage1$(EXEEXT) + $(CXXLINK) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS) +affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES) + @rm -f affinepreimage1$(EXEEXT) + $(CXXLINK) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS) +ascii_dump_load1$(EXEEXT): $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_DEPENDENCIES) + @rm -f ascii_dump_load1$(EXEEXT) + $(CXXLINK) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS) +bgp99extrapolation1$(EXEEXT): $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_DEPENDENCIES) + @rm -f bgp99extrapolation1$(EXEEXT) + $(CXXLINK) $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_LDADD) $(LIBS) +bhz03widening1$(EXEEXT): $(bhz03widening1_OBJECTS) $(bhz03widening1_DEPENDENCIES) + @rm -f bhz03widening1$(EXEEXT) + $(CXXLINK) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS) +bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES) + @rm -f bounded1$(EXEEXT) + $(CXXLINK) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS) +boundedaffineimage1$(EXEEXT): $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_DEPENDENCIES) + @rm -f boundedaffineimage1$(EXEEXT) + $(CXXLINK) $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_LDADD) $(LIBS) +boundedaffinepreimage1$(EXEEXT): $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_DEPENDENCIES) + @rm -f boundedaffinepreimage1$(EXEEXT) + $(CXXLINK) $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_LDADD) $(LIBS) +cc76narrowing1$(EXEEXT): $(cc76narrowing1_OBJECTS) $(cc76narrowing1_DEPENDENCIES) + @rm -f cc76narrowing1$(EXEEXT) + $(CXXLINK) $(cc76narrowing1_OBJECTS) $(cc76narrowing1_LDADD) $(LIBS) +cc76widening$(EXEEXT): $(cc76widening_OBJECTS) $(cc76widening_DEPENDENCIES) + @rm -f cc76widening$(EXEEXT) + $(CXXLINK) $(cc76widening_OBJECTS) $(cc76widening_LDADD) $(LIBS) +concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) + @rm -f concatenate1$(EXEEXT) + $(CXXLINK) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS) +congruences1$(EXEEXT): $(congruences1_OBJECTS) $(congruences1_DEPENDENCIES) + @rm -f congruences1$(EXEEXT) + $(CXXLINK) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS) +constrains1$(EXEEXT): $(constrains1_OBJECTS) $(constrains1_DEPENDENCIES) + @rm -f constrains1$(EXEEXT) + $(CXXLINK) $(constrains1_OBJECTS) $(constrains1_LDADD) $(LIBS) +constraints1$(EXEEXT): $(constraints1_OBJECTS) $(constraints1_DEPENDENCIES) + @rm -f constraints1$(EXEEXT) + $(CXXLINK) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS) +contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) + @rm -f contains1$(EXEEXT) + $(CXXLINK) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS) +containsintegerpoint1$(EXEEXT): $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_DEPENDENCIES) + @rm -f containsintegerpoint1$(EXEEXT) + $(CXXLINK) $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_LDADD) $(LIBS) +difference1$(EXEEXT): $(difference1_OBJECTS) $(difference1_DEPENDENCIES) + @rm -f difference1$(EXEEXT) + $(CXXLINK) $(difference1_OBJECTS) $(difference1_LDADD) $(LIBS) +discrete1$(EXEEXT): $(discrete1_OBJECTS) $(discrete1_DEPENDENCIES) + @rm -f discrete1$(EXEEXT) + $(CXXLINK) $(discrete1_OBJECTS) $(discrete1_LDADD) $(LIBS) +disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES) + @rm -f disjoint1$(EXEEXT) + $(CXXLINK) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS) +empty1$(EXEEXT): $(empty1_OBJECTS) $(empty1_DEPENDENCIES) + @rm -f empty1$(EXEEXT) + $(CXXLINK) $(empty1_OBJECTS) $(empty1_LDADD) $(LIBS) +equality1$(EXEEXT): $(equality1_OBJECTS) $(equality1_DEPENDENCIES) + @rm -f equality1$(EXEEXT) + $(CXXLINK) $(equality1_OBJECTS) $(equality1_LDADD) $(LIBS) +expandspacedim1$(EXEEXT): $(expandspacedim1_OBJECTS) $(expandspacedim1_DEPENDENCIES) + @rm -f expandspacedim1$(EXEEXT) + $(CXXLINK) $(expandspacedim1_OBJECTS) $(expandspacedim1_LDADD) $(LIBS) +foldspacedims1$(EXEEXT): $(foldspacedims1_OBJECTS) $(foldspacedims1_DEPENDENCIES) + @rm -f foldspacedims1$(EXEEXT) + $(CXXLINK) $(foldspacedims1_OBJECTS) $(foldspacedims1_LDADD) $(LIBS) +frombdshape1$(EXEEXT): $(frombdshape1_OBJECTS) $(frombdshape1_DEPENDENCIES) + @rm -f frombdshape1$(EXEEXT) + $(CXXLINK) $(frombdshape1_OBJECTS) $(frombdshape1_LDADD) $(LIBS) +frombox1$(EXEEXT): $(frombox1_OBJECTS) $(frombox1_DEPENDENCIES) + @rm -f frombox1$(EXEEXT) + $(CXXLINK) $(frombox1_OBJECTS) $(frombox1_LDADD) $(LIBS) +fromgensys1$(EXEEXT): $(fromgensys1_OBJECTS) $(fromgensys1_DEPENDENCIES) + @rm -f fromgensys1$(EXEEXT) + $(CXXLINK) $(fromgensys1_OBJECTS) $(fromgensys1_LDADD) $(LIBS) +fromgrid1$(EXEEXT): $(fromgrid1_OBJECTS) $(fromgrid1_DEPENDENCIES) + @rm -f fromgrid1$(EXEEXT) + $(CXXLINK) $(fromgrid1_OBJECTS) $(fromgrid1_LDADD) $(LIBS) +frompartiallyreducedproduct1$(EXEEXT): $(frompartiallyreducedproduct1_OBJECTS) $(frompartiallyreducedproduct1_DEPENDENCIES) + @rm -f frompartiallyreducedproduct1$(EXEEXT) + $(CXXLINK) $(frompartiallyreducedproduct1_OBJECTS) $(frompartiallyreducedproduct1_LDADD) $(LIBS) +frompolyhedron1$(EXEEXT): $(frompolyhedron1_OBJECTS) $(frompolyhedron1_DEPENDENCIES) + @rm -f frompolyhedron1$(EXEEXT) + $(CXXLINK) $(frompolyhedron1_OBJECTS) $(frompolyhedron1_LDADD) $(LIBS) +frompolyhedron2$(EXEEXT): $(frompolyhedron2_OBJECTS) $(frompolyhedron2_DEPENDENCIES) + @rm -f frompolyhedron2$(EXEEXT) + $(CXXLINK) $(frompolyhedron2_OBJECTS) $(frompolyhedron2_LDADD) $(LIBS) +fromspacedim1$(EXEEXT): $(fromspacedim1_OBJECTS) $(fromspacedim1_DEPENDENCIES) + @rm -f fromspacedim1$(EXEEXT) + $(CXXLINK) $(fromspacedim1_OBJECTS) $(fromspacedim1_LDADD) $(LIBS) +generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES) + @rm -f generalizedaffineimage1$(EXEEXT) + $(CXXLINK) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS) +generalizedaffineimage2$(EXEEXT): $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_DEPENDENCIES) + @rm -f generalizedaffineimage2$(EXEEXT) + $(CXXLINK) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS) +generalizedaffinepreimage1$(EXEEXT): $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_DEPENDENCIES) + @rm -f generalizedaffinepreimage1$(EXEEXT) + $(CXXLINK) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS) +geomcovers1$(EXEEXT): $(geomcovers1_OBJECTS) $(geomcovers1_DEPENDENCIES) + @rm -f geomcovers1$(EXEEXT) + $(CXXLINK) $(geomcovers1_OBJECTS) $(geomcovers1_LDADD) $(LIBS) +intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) + @rm -f intersection1$(EXEEXT) + $(CXXLINK) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS) +interval1$(EXEEXT): $(interval1_OBJECTS) $(interval1_DEPENDENCIES) + @rm -f interval1$(EXEEXT) + $(CXXLINK) $(interval1_OBJECTS) $(interval1_LDADD) $(LIBS) +limitedcc76extrapolation1$(EXEEXT): $(limitedcc76extrapolation1_OBJECTS) $(limitedcc76extrapolation1_DEPENDENCIES) + @rm -f limitedcc76extrapolation1$(EXEEXT) + $(CXXLINK) $(limitedcc76extrapolation1_OBJECTS) $(limitedcc76extrapolation1_LDADD) $(LIBS) +mapspacedims1$(EXEEXT): $(mapspacedims1_OBJECTS) $(mapspacedims1_DEPENDENCIES) + @rm -f mapspacedims1$(EXEEXT) + $(CXXLINK) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS) +max_min1$(EXEEXT): $(max_min1_OBJECTS) $(max_min1_DEPENDENCIES) + @rm -f max_min1$(EXEEXT) + $(CXXLINK) $(max_min1_OBJECTS) $(max_min1_LDADD) $(LIBS) +maxspacedim1$(EXEEXT): $(maxspacedim1_OBJECTS) $(maxspacedim1_DEPENDENCIES) + @rm -f maxspacedim1$(EXEEXT) + $(CXXLINK) $(maxspacedim1_OBJECTS) $(maxspacedim1_LDADD) $(LIBS) +membytes1$(EXEEXT): $(membytes1_OBJECTS) $(membytes1_DEPENDENCIES) + @rm -f membytes1$(EXEEXT) + $(CXXLINK) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS) +minconstraints1$(EXEEXT): $(minconstraints1_OBJECTS) $(minconstraints1_DEPENDENCIES) + @rm -f minconstraints1$(EXEEXT) + $(CXXLINK) $(minconstraints1_OBJECTS) $(minconstraints1_LDADD) $(LIBS) +nnc_frompolyhedron1$(EXEEXT): $(nnc_frompolyhedron1_OBJECTS) $(nnc_frompolyhedron1_DEPENDENCIES) + @rm -f nnc_frompolyhedron1$(EXEEXT) + $(nnc_frompolyhedron1_LINK) $(nnc_frompolyhedron1_OBJECTS) $(nnc_frompolyhedron1_LDADD) $(LIBS) +propagateconstraints1$(EXEEXT): $(propagateconstraints1_OBJECTS) $(propagateconstraints1_DEPENDENCIES) + @rm -f propagateconstraints1$(EXEEXT) + $(CXXLINK) $(propagateconstraints1_OBJECTS) $(propagateconstraints1_LDADD) $(LIBS) +propagateconstraints2$(EXEEXT): $(propagateconstraints2_OBJECTS) $(propagateconstraints2_DEPENDENCIES) + @rm -f propagateconstraints2$(EXEEXT) + $(CXXLINK) $(propagateconstraints2_OBJECTS) $(propagateconstraints2_LDADD) $(LIBS) +refinewithcongruences1$(EXEEXT): $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_DEPENDENCIES) + @rm -f refinewithcongruences1$(EXEEXT) + $(CXXLINK) $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_LDADD) $(LIBS) +refinewithconstraint1$(EXEEXT): $(refinewithconstraint1_OBJECTS) $(refinewithconstraint1_DEPENDENCIES) + @rm -f refinewithconstraint1$(EXEEXT) + $(CXXLINK) $(refinewithconstraint1_OBJECTS) $(refinewithconstraint1_LDADD) $(LIBS) +refinewithconstraint2$(EXEEXT): $(refinewithconstraint2_OBJECTS) $(refinewithconstraint2_DEPENDENCIES) + @rm -f refinewithconstraint2$(EXEEXT) + $(CXXLINK) $(refinewithconstraint2_OBJECTS) $(refinewithconstraint2_LDADD) $(LIBS) +refinewithconstraints1$(EXEEXT): $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_DEPENDENCIES) + @rm -f refinewithconstraints1$(EXEEXT) + $(CXXLINK) $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_LDADD) $(LIBS) +refinewithconstraints2$(EXEEXT): $(refinewithconstraints2_OBJECTS) $(refinewithconstraints2_DEPENDENCIES) + @rm -f refinewithconstraints2$(EXEEXT) + $(CXXLINK) $(refinewithconstraints2_OBJECTS) $(refinewithconstraints2_LDADD) $(LIBS) +relations1$(EXEEXT): $(relations1_OBJECTS) $(relations1_DEPENDENCIES) + @rm -f relations1$(EXEEXT) + $(CXXLINK) $(relations1_OBJECTS) $(relations1_LDADD) $(LIBS) +relations2$(EXEEXT): $(relations2_OBJECTS) $(relations2_DEPENDENCIES) + @rm -f relations2$(EXEEXT) + $(CXXLINK) $(relations2_OBJECTS) $(relations2_LDADD) $(LIBS) +relations3$(EXEEXT): $(relations3_OBJECTS) $(relations3_DEPENDENCIES) + @rm -f relations3$(EXEEXT) + $(CXXLINK) $(relations3_OBJECTS) $(relations3_LDADD) $(LIBS) +relations4$(EXEEXT): $(relations4_OBJECTS) $(relations4_DEPENDENCIES) + @rm -f relations4$(EXEEXT) + $(CXXLINK) $(relations4_OBJECTS) $(relations4_LDADD) $(LIBS) +removespacedims1$(EXEEXT): $(removespacedims1_OBJECTS) $(removespacedims1_DEPENDENCIES) + @rm -f removespacedims1$(EXEEXT) + $(CXXLINK) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS) +simplifyusingcontext1$(EXEEXT): $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_DEPENDENCIES) + @rm -f simplifyusingcontext1$(EXEEXT) + $(CXXLINK) $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_LDADD) $(LIBS) +timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES) + @rm -f timeelapse1$(EXEEXT) + $(CXXLINK) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS) +topclosed1$(EXEEXT): $(topclosed1_OBJECTS) $(topclosed1_DEPENDENCIES) + @rm -f topclosed1$(EXEEXT) + $(CXXLINK) $(topclosed1_OBJECTS) $(topclosed1_LDADD) $(LIBS) +unconstrain1$(EXEEXT): $(unconstrain1_OBJECTS) $(unconstrain1_DEPENDENCIES) + @rm -f unconstrain1$(EXEEXT) + $(CXXLINK) $(unconstrain1_OBJECTS) $(unconstrain1_LDADD) $(LIBS) +universe1$(EXEEXT): $(universe1_OBJECTS) $(universe1_DEPENDENCIES) + @rm -f universe1$(EXEEXT) + $(CXXLINK) $(universe1_OBJECTS) $(universe1_LDADD) $(LIBS) +upperbound1$(EXEEXT): $(upperbound1_OBJECTS) $(upperbound1_DEPENDENCIES) + @rm -f upperbound1$(EXEEXT) + $(CXXLINK) $(upperbound1_OBJECTS) $(upperbound1_LDADD) $(LIBS) +upperboundifexact1$(EXEEXT): $(upperboundifexact1_OBJECTS) $(upperboundifexact1_DEPENDENCIES) + @rm -f upperboundifexact1$(EXEEXT) + $(CXXLINK) $(upperboundifexact1_OBJECTS) $(upperboundifexact1_LDADD) $(LIBS) +writebox1$(EXEEXT): $(writebox1_OBJECTS) $(writebox1_DEPENDENCIES) + @rm -f writebox1$(EXEEXT) + $(CXXLINK) $(writebox1_OBJECTS) $(writebox1_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addconstraints1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addspacedims1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/affinedimension1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/affineimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/affinepreimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ascii_dump_load1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bgp99extrapolation1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bhz03widening1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bounded1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/boundedaffineimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/boundedaffinepreimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cc76narrowing1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cc76widening.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/concatenate1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/congruences1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/constrains1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/constraints1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/contains1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/containsintegerpoint1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/difference1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/discrete1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disjoint1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/empty1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/equality1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/expandspacedim1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/foldspacedims1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frombdshape1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frombox1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fromgensys1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fromgrid1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frompartiallyreducedproduct1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frompolyhedron1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frompolyhedron2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fromspacedim1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalizedaffineimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalizedaffineimage2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalizedaffinepreimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/geomcovers1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/intersection1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interval1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/limitedcc76extrapolation1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mapspacedims1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/max_min1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/maxspacedim1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/membytes1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minconstraints1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_frompolyhedron1-frompolyhedron1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/propagateconstraints1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/propagateconstraints2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refinewithcongruences1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refinewithconstraint1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refinewithconstraint2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refinewithconstraints1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refinewithconstraints2-refinewithconstraints2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relations1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relations2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relations3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relations4.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/removespacedims1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplifyusingcontext1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timeelapse1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/topclosed1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unconstrain1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/universe1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upperbound1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upperboundifexact1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/writebox1.Po@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +nnc_frompolyhedron1-frompolyhedron1.o: frompolyhedron1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_frompolyhedron1-frompolyhedron1.Tpo $(DEPDIR)/nnc_frompolyhedron1-frompolyhedron1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='frompolyhedron1.cc' object='nnc_frompolyhedron1-frompolyhedron1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(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 +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_frompolyhedron1-frompolyhedron1.Tpo $(DEPDIR)/nnc_frompolyhedron1-frompolyhedron1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='frompolyhedron1.cc' object='nnc_frompolyhedron1-frompolyhedron1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(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` + +refinewithconstraints2-refinewithconstraints2.o: refinewithconstraints2.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refinewithconstraints2_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT refinewithconstraints2-refinewithconstraints2.o -MD -MP -MF $(DEPDIR)/refinewithconstraints2-refinewithconstraints2.Tpo -c -o refinewithconstraints2-refinewithconstraints2.o `test -f 'refinewithconstraints2.cc' || echo '$(srcdir)/'`refinewithconstraints2.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/refinewithconstraints2-refinewithconstraints2.Tpo $(DEPDIR)/refinewithconstraints2-refinewithconstraints2.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='refinewithconstraints2.cc' object='refinewithconstraints2-refinewithconstraints2.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refinewithconstraints2_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o refinewithconstraints2-refinewithconstraints2.o `test -f 'refinewithconstraints2.cc' || echo '$(srcdir)/'`refinewithconstraints2.cc + +refinewithconstraints2-refinewithconstraints2.obj: refinewithconstraints2.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refinewithconstraints2_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT refinewithconstraints2-refinewithconstraints2.obj -MD -MP -MF $(DEPDIR)/refinewithconstraints2-refinewithconstraints2.Tpo -c -o refinewithconstraints2-refinewithconstraints2.obj `if test -f 'refinewithconstraints2.cc'; then $(CYGPATH_W) 'refinewithconstraints2.cc'; else $(CYGPATH_W) '$(srcdir)/refinewithconstraints2.cc'; fi` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/refinewithconstraints2-refinewithconstraints2.Tpo $(DEPDIR)/refinewithconstraints2-refinewithconstraints2.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='refinewithconstraints2.cc' object='refinewithconstraints2-refinewithconstraints2.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(refinewithconstraints2_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o refinewithconstraints2-refinewithconstraints2.obj `if test -f 'refinewithconstraints2.cc'; then $(CYGPATH_W) 'refinewithconstraints2.cc'; else $(CYGPATH_W) '$(srcdir)/refinewithconstraints2.cc'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; ws='[ ]'; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *$$ws$$tst$$ws*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + echo "XPASS: $$tst"; \ + ;; \ + *) \ + echo "PASS: $$tst"; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *$$ws$$tst$$ws*) \ + xfail=`expr $$xfail + 1`; \ + echo "XFAIL: $$tst"; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + echo "FAIL: $$tst"; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + echo "SKIP: $$tst"; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all tests failed"; \ + else \ + banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + skipped="($$skip tests were not run)"; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + test -z "$$skipped" || echo "$$skipped"; \ + test -z "$$report" || echo "$$report"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0; \ + else :; fi + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) \ + $(dist_check_SCRIPTS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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 + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +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 + +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 all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool ctags \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-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 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 + +$(top_builddir)/Watchdog/src/libpwl.la: + $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/Watchdog/src libpwl.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..9f8afbd --- /dev/null +++ b/tests/Box/addconstraints1.cc @@ -0,0 +1,289 @@ +/* Test Box::add_constraints(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + Constraint_System cs; + cs.insert(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..5f9741d --- /dev/null +++ b/tests/Box/addspacedims1.cc @@ -0,0 +1,332 @@ +/* Test Box::add_space_dimensions_and_embed(): + we add two variables to a Box. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + //Variable y(1); + Variable z(2); + + 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..c49ada6 --- /dev/null +++ b/tests/Box/affinedimension1.cc @@ -0,0 +1,291 @@ +/* Test Box::affine_dimension(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + 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..7bac541 --- /dev/null +++ b/tests/Box/affineimage1.cc @@ -0,0 +1,428 @@ +/* Test Box::affine_image(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + 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..fe2e88c --- /dev/null +++ b/tests/Box/affinepreimage1.cc @@ -0,0 +1,177 @@ +/* Test Box::affine_preimage(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + 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..301010a --- /dev/null +++ b/tests/Box/ascii_dump_load1.cc @@ -0,0 +1,253 @@ +/* Test Box::ascii_dump() and Box::ascii_load(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +#include "files.hh" +#include +#include + +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..2fa4678 --- /dev/null +++ b/tests/Box/bgp99extrapolation1.cc @@ -0,0 +1,85 @@ +/* Test Pointset_Powerset::BGP99_extrapolation_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + typedef Pointset_Powerset 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..852d4fb --- /dev/null +++ b/tests/Box/bhz03widening1.cc @@ -0,0 +1,78 @@ +/* Test Pointset_Powerset::BHZ03_widening_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + typedef Pointset_Powerset 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(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..cd1a3cc --- /dev/null +++ b/tests/Box/bounded1.cc @@ -0,0 +1,96 @@ +/* Test Box::is_bounded(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + + // 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..3a73c52 --- /dev/null +++ b/tests/Box/boundedaffineimage1.cc @@ -0,0 +1,515 @@ +/* Test Box::bounded_affine_image(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// 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..32ffc36 --- /dev/null +++ b/tests/Box/boundedaffinepreimage1.cc @@ -0,0 +1,518 @@ +/* Test Box::bounded_affine_preimage(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// 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..ea81304 --- /dev/null +++ b/tests/Box/cc76narrowing1.cc @@ -0,0 +1,206 @@ +/* Test Box::CC76_narrowing_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + 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..bdc79bb --- /dev/null +++ b/tests/Box/cc76widening.cc @@ -0,0 +1,86 @@ +/* Test Box::CC76_widening_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + 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; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); +END_MAIN diff --git a/tests/Box/concatenate1.cc b/tests/Box/concatenate1.cc new file mode 100644 index 0000000..1a307a7 --- /dev/null +++ b/tests/Box/concatenate1.cc @@ -0,0 +1,224 @@ +/* Test Box::concatenate_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + // Variable x1(0); + Variable x2(1); + Variable x3(2); + // Variable x4(3); + Variable x5(4); + Variable x6(5); + // Variable x7(6); + Variable x8(7); + Variable x9(8); + + 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..39158d0 --- /dev/null +++ b/tests/Box/congruences1.cc @@ -0,0 +1,382 @@ +/* Test Box::Box(const Congruence_System&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Universe 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 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); + known_result.add_constraint(A == 7); + known_result.add_constraint(B == 3); + + 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); +#ifndef __alpha__ + // Exception handling is broken in GCC on the Alpha. + DO_TEST(test14); +#endif + DO_TEST(test15); +END_MAIN diff --git a/tests/Box/constrains1.cc b/tests/Box/constrains1.cc new file mode 100644 index 0000000..675842e --- /dev/null +++ b/tests/Box/constrains1.cc @@ -0,0 +1,187 @@ +/* Test Box::constrains(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +#define 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..a532ce0 --- /dev/null +++ b/tests/Box/constraints1.cc @@ -0,0 +1,161 @@ +/* Test Box::constraints(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + 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..4fffe3f --- /dev/null +++ b/tests/Box/contains1.cc @@ -0,0 +1,176 @@ +/* Test Box::contains(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + Variable z(2); + + 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..46c46b4 --- /dev/null +++ b/tests/Box/containsintegerpoint1.cc @@ -0,0 +1,219 @@ +/* Test Box::contains_integer_point(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + Constraint_System 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..8c08e9f --- /dev/null +++ b/tests/Box/difference1.cc @@ -0,0 +1,513 @@ +/* Test Box::difference_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// 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..9f7e8be --- /dev/null +++ b/tests/Box/discrete1.cc @@ -0,0 +1,203 @@ +/* Test Box::is_discrete(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + 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..7a7d976 --- /dev/null +++ b/tests/Box/disjoint1.cc @@ -0,0 +1,188 @@ +/* Test Box::is_disjoint_from(const Box& y). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + 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..b659b4a --- /dev/null +++ b/tests/Box/empty1.cc @@ -0,0 +1,225 @@ +/* Different ways of creating an empty Box. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + Variable z(2); + + 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::is_bounded) + a = -(std::numeric_limits::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..ffd34f7 --- /dev/null +++ b/tests/Box/equality1.cc @@ -0,0 +1,130 @@ +/* Test Box::operator==(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + // Variable z(2); + + 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..cc37398 --- /dev/null +++ b/tests/Box/expandspacedim1.cc @@ -0,0 +1,231 @@ +/* Test Box::expand_space_dimension(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + + 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..7027c69 --- /dev/null +++ b/tests/Box/foldspacedims1.cc @@ -0,0 +1,268 @@ +/* Test Box::fold_space_dimensions(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + 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/frombdshape1.cc b/tests/Box/frombdshape1.cc new file mode 100644 index 0000000..669fd41 --- /dev/null +++ b/tests/Box/frombdshape1.cc @@ -0,0 +1,87 @@ +/* Test Box::Box(const BD_Shape&, Complexity_Class). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + TBD_Shape bd(2); + bd.add_constraint(x <= 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..217b86e --- /dev/null +++ b/tests/Box/frombox1.cc @@ -0,0 +1,160 @@ +/* Test Box::Box(const Box&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + 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 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..b72c07e --- /dev/null +++ b/tests/Box/fromgensys1.cc @@ -0,0 +1,181 @@ +/* Test Box::Box(const Generator_System&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Generator_System gs; + 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..e0561e7 --- /dev/null +++ b/tests/Box/fromgrid1.cc @@ -0,0 +1,511 @@ +/* Test Box::Box(const Grid&, Complexity_Class). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// 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..88de140 --- /dev/null +++ b/tests/Box/frompartiallyreducedproduct1.cc @@ -0,0 +1,136 @@ +/* Test Box::Box(const Direct_Product&, Complexity_Class). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +typedef Domain_Product::Direct_Product DProduct; +typedef Domain_Product::Smash_Product SProduct; +typedef Domain_Product::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..72134be --- /dev/null +++ b/tests/Box/frompolyhedron1.cc @@ -0,0 +1,526 @@ +/* Test Box::Box(const Polyhedron&, Complexity_Class). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// A 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. +// The resulting bounding box depends on the complexity class. +bool +test02() { + Variable x(0); + Variable y(1); + + C_Polyhedron ph(2); + ph.add_constraint(x >= y); + ph.add_constraint(y >= 0); + + TBox pbox(ph, POLYNOMIAL_COMPLEXITY); + + TBox nbox(ph); + + TBox known_nbox(2); + known_nbox.add_constraint(x >= 0); + known_nbox.add_constraint(y >= 0); + + TBox known_pbox(2); + known_pbox.add_constraint(y >= 0); + + bool ok = (nbox == known_nbox && pbox == known_pbox && pbox.contains(nbox)); + + print_constraints(ph, "*** ph ***"); + print_constraints(nbox, "*** nbox ***"); + print_constraints(pbox, "*** pbox ***"); + print_constraints(known_nbox, "*** known_nbox ***"); + print_constraints(known_pbox, "*** known_pbox ***"); + + 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_nbox(2); + known_nbox.add_constraint(3*x >= -2); + known_nbox.add_constraint(x <= 4); + known_nbox.add_constraint(y >= -10); + known_nbox.add_constraint(y <= 4); + + TBox known_pbox(2); + known_pbox.add_constraint(x <= 4); + known_pbox.add_constraint(y <= 4); + + bool ok = (nbox == known_nbox && pbox == known_pbox && pbox.contains(nbox)); + + print_constraints(ph, "*** ph ***"); + print_constraints(nbox, "*** nbox ***"); + print_constraints(pbox, "*** pbox ***"); + print_constraints(known_nbox, "*** known_nbox ***"); + print_constraints(known_pbox, "*** known_pbox ***"); + + 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_nbox(4); + known_nbox.add_constraint(3*x >= -2); + known_nbox.add_constraint(x <= 4); + known_nbox.add_constraint(y >= -10); + known_nbox.add_constraint(3*y <= 12); + known_nbox.add_constraint(3*z >= 15); + + TBox known_pbox(4); + known_pbox.add_constraint(x <= 4); + known_pbox.add_constraint(y <= 4); + known_pbox.add_constraint(z >= 5); + + bool ok = (nbox == known_nbox && pbox == known_pbox && pbox.contains(nbox)); + + print_constraints(ph, "*** ph ***"); + print_constraints(nbox, "*** nbox ***"); + print_constraints(pbox, "*** pbox ***"); + print_constraints(known_nbox, "*** known_nbox ***"); + print_constraints(known_pbox, "*** known_pbox ***"); + + 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..887b386 --- /dev/null +++ b/tests/Box/frompolyhedron2.cc @@ -0,0 +1,141 @@ +/* Test Box::Box(const NNC_Polyhedron&, Complexity_Class). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// 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); + + TBox known_nbox(4); + known_nbox.add_constraint(3*x > -2); + known_nbox.add_constraint(x <= 4); + known_nbox.add_constraint(y > -10); + known_nbox.add_constraint(y <= 4); + known_nbox.add_constraint(z >= 5); + + TBox known_pbox(4); + known_pbox.add_constraint(x <= 4); + known_pbox.add_constraint(y <= 4); + known_pbox.add_constraint(z >= 5); + + bool ok = (nbox == known_nbox && pbox == known_pbox && pbox.contains(nbox)); + + print_constraints(ph, "*** ph ***"); + print_constraints(nbox, "*** nbox ***"); + print_constraints(pbox, "*** pbox ***"); + + print_constraints(known_nbox, "*** known_nbox ***"); + print_constraints(known_pbox, "*** known_pbox ***"); + + 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); + + TBox known_nbox(2); + known_nbox.add_constraint(3*x >= -2); + known_nbox.add_constraint(x < 4); + known_nbox.add_constraint(y > -10); + known_nbox.add_constraint(y <= 4); + + TBox known_pbox(2); + known_pbox.add_constraint(x < 4); + known_pbox.add_constraint(y <= 4); + + bool ok = (nbox == known_nbox && pbox == known_pbox && pbox.contains(nbox)); + + print_constraints(ph, "*** ph ***"); + print_constraints(nbox, "*** nbox ***"); + print_constraints(pbox, "*** pbox ***"); + + print_constraints(known_nbox, "*** known_nbox ***"); + print_constraints(known_pbox, "*** known_pbox ***"); + + 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..8a33568 --- /dev/null +++ b/tests/Box/fromspacedim1.cc @@ -0,0 +1,110 @@ +/* Test Box::Box(dimension_type, Degenerate_Element). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + 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..226b9a9 --- /dev/null +++ b/tests/Box/generalizedaffineimage1.cc @@ -0,0 +1,604 @@ +/* Test Box::generalized_affine_image(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + 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..1b9adbc --- /dev/null +++ b/tests/Box/generalizedaffineimage2.cc @@ -0,0 +1,608 @@ +/* Test Box::generalized_affine_image(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + 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..b3cc004 --- /dev/null +++ b/tests/Box/generalizedaffinepreimage1.cc @@ -0,0 +1,474 @@ +/*Test Box::generalized_affine_preimage(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include + +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::is_bounded + && (std::numeric_limits::min() > -203 + || std::numeric_limits::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..48c2ce7 --- /dev/null +++ b/tests/Box/geomcovers1.cc @@ -0,0 +1,71 @@ +/* Test Pointset_Powerset::geometrically_covers(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + + Constraint_System cs1, cs2, cs3, cs4; + cs1.insert(x >= 0); + cs1.insert(x <= 4); + cs2.insert(x >= 4); + cs2.insert(x <= 6); + cs3.insert(x >= 1); + cs3.insert(x <= 5); + TBox box1(cs1); + TBox box2(cs2); + TBox box3(cs3); + + Pointset_Powerset ps12(1, EMPTY); + ps12.add_disjunct(box1); + ps12.add_disjunct(box2); + + Pointset_Powerset 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..cf2e55e --- /dev/null +++ b/tests/Box/intersection1.cc @@ -0,0 +1,441 @@ +/* Test Box::intersection_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + 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..a4342bc --- /dev/null +++ b/tests/Box/interval1.cc @@ -0,0 +1,206 @@ +/* Test Box::add_space_dimensions_and_embed(): + we add two variables to a Box. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include +#include +#include + +namespace { + +template +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_Restriction_None + > + Floating_Point_Real_Interval_Info; + + typedef Interval interval_type; +}; + +template +bool +test01() { + typename My_Interval::interval_type x; + x = 2; + typename My_Interval::interval_type two; + two = 2; + typename My_Interval::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::interval_type z(1.41420757770538330078125); + z.join_assign(1.41421949863433837890625); + + nout << "z = " << x << endl; + + return !x.is_empty() +#if PPL_CXX_SUPPORTS_IEEE_INEXACT_FLAG + && x.is_disjoint_from(1.41420757770538330078125) + && x.is_disjoint_from(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 +void +polynomial_evaluate(const std::vector& P, + const std::complex& x, + std::complex& P_x) { + // Note: the coefficient of the leading term is implicitly 1. + P_x = std::complex(N(1.0), N(0.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 +void +solve(const std::vector& P, + std::vector >& 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 > x(5); + double theta = 2*M_PI/degree; + for (int i = 0; i < degree; ++i) + x[i] = std::complex(N(cos(i*theta)), + N(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 P_x_i; + polynomial_evaluate(P, x[i], P_x_i); + std::complex d(N(1.0), N(0.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 +bool test02() { + std::vector 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 > roots; + solve(P, roots); + return true; +} + +template +bool test03() { + std::vector P(2); + // x^2 - 1 + P[1] = 0; + P[0] = -1; + std::vector > roots; + solve(P, roots); + return true; +} + +template +bool test04() { + std::vector P(2); + // x^2 - 1 + P[1] = 0; + P[0] = -1; + for (double d = 0.0; d <= 10.0; d += 1.0) { + std::complex P_x_i; + polynomial_evaluate(P, + std::complex(N(d), N(0.0)), + P_x_i); + nout << d << " " << P_x_i << endl; + } + return true; +} + +} // namespace + +BEGIN_MAIN + +#if PPL_SUPPORTED_FLOAT + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); +#endif // PPL_SUPPORTED_FLOAT + +#if PPL_SUPPORTED_DOUBLE + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); +#endif // PPL_SUPPORTED_DOUBLE + +#if PPL_SUPPORTED_LONG_DOUBLE + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); +#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..8c2bd9a --- /dev/null +++ b/tests/Box/limitedcc76extrapolation1.cc @@ -0,0 +1,316 @@ +/* Test Box::limited_CC76_extrapolation_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + 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..30a47db --- /dev/null +++ b/tests/Box/mapspacedims1.cc @@ -0,0 +1,279 @@ +/* Test Box::map_space_dimensions(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Partial_Function function; + + 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..72d6100 --- /dev/null +++ b/tests/Box/max_min1.cc @@ -0,0 +1,764 @@ +/* Test Box::maximize(const Linear_Expression&, ...) + and Box::minimize(const Linear_Expression&, ...). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x1(0); + Variable x2(1); + + 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); +#ifndef __alpha__ + // Exception handling is broken in GCC on the Alpha. + DO_TEST(test12); +#endif + 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..15696cc --- /dev/null +++ b/tests/Box/maxspacedim1.cc @@ -0,0 +1,58 @@ +/* Test Box::max_space_dimension(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + nout << Box::max_space_dimension() << " (fl_r_oc)" + << endl + << Box::max_space_dimension() << " (db_r_oc)" + << endl + << Box::max_space_dimension() << " (ld_r_oc)" + << endl + << Box::max_space_dimension() << " (rt_r_oc)" + << endl; + + if (Box::max_space_dimension() + < Box::max_space_dimension()) + return false; + + if (Box::max_space_dimension() + < Box::max_space_dimension()) + return false; + + // CHECKME: is this a valid assertion? + if (Box::max_space_dimension() + < Box::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..9a8e7a3 --- /dev/null +++ b/tests/Box/membytes1.cc @@ -0,0 +1,117 @@ +/* Test the total_memory_in_bytes() and external_memory_in_bytes() methods. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include + +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 pbox(2, EMPTY); + TBox box(2); + TBox::interval_type ix; + TBox::interval_type iy; + + for (double d = -M_PI; d <= M_PI; d += 0.01) { + ix.assign(EMPTY); + ix.join_assign(d-0.015); + ix.join_assign(d+0.015); + + iy.assign(EMPTY); + iy.join_assign(sin(d-0.015)); + iy.join_assign(sin(d+0.015)); + + 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..13e5946 --- /dev/null +++ b/tests/Box/minconstraints1.cc @@ -0,0 +1,94 @@ +/* Test Box::minimized_constraints(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + 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..10eb157 --- /dev/null +++ b/tests/Box/propagateconstraints1.cc @@ -0,0 +1,210 @@ +/* Test Box::propagate_constraints(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + Constraint_System cs; + cs.insert(A >= 0); + cs.insert(B >= 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..afb6c64 --- /dev/null +++ b/tests/Box/propagateconstraints2.cc @@ -0,0 +1,449 @@ +/* Test Box::propagate_constraints(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +struct Edge { + unsigned int from; + unsigned int to; + unsigned long distance; +}; + +Edge hawaii[] = { + { 0, 1, 6191 }, + { 1, 0, 6191 }, + { 2, 3, 4147 }, + { 3, 2, 4147 }, + { 4, 5, 3884 }, + { 5, 4, 3884 }, + { 5, 6, 1609 }, + { 6, 5, 1609 }, + { 7, 0, 12521 }, + { 0, 7, 12521 }, + { 8, 1, 2872 }, + { 1, 8, 2872 }, + { 9, 10, 4036 }, + { 10, 9, 4036 }, + { 4, 11, 2959 }, + { 11, 4, 2959 }, + { 12, 13, 27415 }, + { 13, 12, 27415 }, + { 14, 15, 6068 }, + { 15, 14, 6068 }, + { 15, 16, 7337 }, + { 16, 15, 7337 }, + { 17, 18, 2894 }, + { 18, 17, 2894 }, + { 18, 19, 5425 }, + { 19, 18, 5425 }, + { 20, 21, 2265 }, + { 21, 20, 2265 }, + { 19, 20, 3008 }, + { 20, 19, 3008 }, + { 21, 12, 6654 }, + { 12, 21, 6654 }, + { 22, 23, 1563 }, + { 23, 22, 1563 }, + { 23, 24, 3470 }, + { 24, 23, 3470 }, + { 25, 26, 6536 }, + { 26, 25, 6536 }, + { 27, 28, 10373 }, + { 28, 27, 10373 }, + { 28, 29, 7866 }, + { 29, 28, 7866 }, + { 29, 30, 8961 }, + { 30, 29, 8961 }, + { 31, 32, 6954 }, + { 32, 31, 6954 }, + { 33, 34, 24135 }, + { 34, 33, 24135 }, + { 34, 35, 5943 }, + { 35, 34, 5943 }, + { 33, 36, 2389 }, + { 36, 33, 2389 }, + { 35, 37, 3374 }, + { 37, 35, 3374 }, + { 34, 38, 4494 }, + { 38, 34, 4494 }, + { 37, 38, 8295 }, + { 38, 37, 8295 }, + { 38, 39, 12091 }, + { 39, 38, 12091 }, + { 39, 40, 4356 }, + { 40, 39, 4356 }, + { 39, 30, 3986 }, + { 30, 39, 3986 }, + { 29, 41, 3937 }, + { 41, 29, 3937 }, + { 41, 28, 7159 }, + { 28, 41, 7159 }, + { 42, 43, 3887 }, + { 43, 42, 3887 }, + { 43, 44, 3685 }, + { 44, 43, 3685 }, + { 43, 45, 20903 }, + { 45, 43, 20903 }, + { 45, 46, 2226 }, + { 46, 45, 2226 }, + { 47, 44, 7487 }, + { 44, 47, 7487 }, + { 44, 48, 22511 }, + { 48, 44, 22511 }, + { 46, 48, 7280 }, + { 48, 46, 7280 }, + { 48, 49, 3112 }, + { 49, 48, 3112 }, + { 49, 50, 2530 }, + { 50, 49, 2530 }, + { 50, 51, 17408 }, + { 51, 50, 17408 }, + { 45, 52, 15249 }, + { 52, 45, 15249 }, + { 53, 54, 36470 }, + { 54, 53, 36470 }, + { 54, 49, 7694 }, + { 49, 54, 7694 }, + { 51, 55, 11400 }, + { 55, 51, 11400 }, + { 52, 46, 15473 }, + { 46, 52, 15473 }, + { 55, 56, 37433 }, + { 56, 55, 37433 }, + { 53, 57, 3855 }, + { 57, 53, 3855 }, + { 57, 58, 1508 }, + { 58, 57, 1508 }, + { 59, 60, 3574 }, + { 60, 59, 3574 }, + { 59, 53, 7377 }, + { 53, 59, 7377 }, + { 58, 60, 6801 }, + { 60, 58, 6801 }, + { 60, 61, 9191 }, + { 61, 60, 9191 }, + { 61, 62, 3940 }, + { 62, 61, 3940 }, + { 62, 63, 1941 }, + { 63, 62, 1941 }, + { 63, 64, 17861 }, + { 64, 63, 17861 }, + { 65, 66, 12138 }, + { 66, 65, 12138 }, + { 66, 67, 5764 }, + { 67, 66, 5764 }, + { 68, 62, 2365 }, + { 62, 68, 2365 }, + { 69, 70, 14756 }, + { 70, 69, 14756 }, + { 70, 71, 3931 }, + { 71, 70, 3931 }, + { 71, 72, 6955 }, + { 72, 71, 6955 }, + { 69, 73, 4265 }, + { 73, 69, 4265 }, + { 73, 56, 5278 }, + { 56, 73, 5278 }, + { 74, 75, 1088 }, + { 75, 74, 1088 }, + { 76, 77, 2549 }, + { 77, 76, 2549 }, + { 78, 79, 2029 }, + { 79, 78, 2029 }, + { 80, 81, 4607 }, + { 81, 80, 4607 }, + { 81, 82, 995 }, + { 82, 81, 995 }, + { 82, 83, 5708 }, + { 83, 82, 5708 }, + { 83, 84, 1015 }, + { 84, 83, 1015 }, + { 85, 86, 2592 }, + { 86, 85, 2592 }, + { 86, 75, 9272 }, + { 75, 86, 9272 }, + { 86, 87, 1549 }, + { 87, 86, 1549 }, + { 87, 88, 1155 }, + { 88, 87, 1155 }, + { 85, 84, 8375 }, + { 84, 85, 8375 }, + { 84, 89, 3022 }, + { 89, 84, 3022 }, + { 89, 90, 6455 }, + { 90, 89, 6455 }, + { 80, 91, 2912 }, + { 91, 80, 2912 }, + { 78, 92, 2087 }, + { 92, 78, 2087 }, + { 91, 76, 7736 }, + { 76, 91, 7736 }, + { 88, 85, 2143 }, + { 85, 88, 2143 }, + { 93, 8, 9507 }, + { 8, 93, 9507 }, + { 89, 88, 9385 }, + { 88, 89, 9385 }, + { 64, 65, 24795 }, + { 65, 64, 24795 }, + { 54, 94, 32035 }, + { 94, 54, 32035 }, + { 94, 56, 35025 }, + { 56, 94, 35025 }, + { 69, 95, 25243 }, + { 95, 69, 25243 }, + { 67, 96, 30757 }, + { 96, 67, 30757 }, + { 96, 97, 859 }, + { 97, 96, 859 }, + { 97, 95, 3230 }, + { 95, 97, 3230 }, + { 1, 9, 16155 }, + { 9, 1, 16155 }, + { 98, 51, 11706 }, + { 51, 98, 11706 }, + { 75, 99, 51590 }, + { 99, 75, 51590 }, + { 11, 100, 23417 }, + { 100, 11, 23417 }, + { 100, 101, 12368 }, + { 101, 100, 12368 }, + { 102, 103, 4846 }, + { 103, 102, 4846 }, + { 103, 104, 2901 }, + { 104, 103, 2901 }, + { 10, 104, 7849 }, + { 104, 10, 7849 }, + { 104, 2, 2147 }, + { 2, 104, 2147 }, + { 2, 102, 1761 }, + { 102, 2, 1761 }, + { 102, 4, 4444 }, + { 4, 102, 4444 }, + { 74, 105, 8183 }, + { 105, 74, 8183 }, + { 106, 107, 7075 }, + { 107, 106, 7075 }, + { 89, 107, 1178 }, + { 107, 89, 1178 }, + { 108, 81, 1312 }, + { 81, 108, 1312 }, + { 81, 109, 1793 }, + { 109, 81, 1793 }, + { 82, 108, 1001 }, + { 108, 82, 1001 }, + { 108, 80, 7421 }, + { 80, 108, 7421 }, + { 110, 92, 434 }, + { 92, 110, 434 }, + { 92, 79, 3285 }, + { 79, 92, 3285 }, + { 79, 99, 2706 }, + { 99, 79, 2706 }, + { 111, 78, 3052 }, + { 78, 111, 3052 }, + { 77, 111, 2036 }, + { 111, 77, 2036 }, + { 24, 25, 2634 }, + { 25, 24, 2634 }, + { 25, 21, 1832 }, + { 21, 25, 1832 }, + { 33, 112, 14461 }, + { 112, 33, 14461 }, + { 113, 114, 7998 }, + { 114, 113, 7998 }, + { 41, 115, 6937 }, + { 115, 41, 6937 }, + { 32, 116, 47595 }, + { 116, 32, 47595 }, + { 99, 117, 3887 }, + { 117, 99, 3887 }, + { 117, 118, 736 }, + { 118, 117, 736 }, + { 85, 83, 9281 }, + { 83, 85, 9281 }, + { 118, 80, 4823 }, + { 80, 118, 4823 }, + { 77, 119, 22341 }, + { 119, 77, 22341 }, + { 56, 120, 1612 }, + { 120, 56, 1612 }, + { 79, 121, 3258 }, + { 121, 79, 3258 }, + { 52, 57, 25357 }, + { 57, 52, 25357 }, + { 99, 121, 1646 }, + { 121, 99, 1646 }, + { 121, 76, 1359 }, + { 76, 121, 1359 }, + { 37, 27, 3890 }, + { 27, 37, 3890 }, + { 27, 31, 5066 }, + { 31, 27, 5066 }, + { 122, 123, 2556 }, + { 123, 122, 2556 }, + { 90, 122, 947 }, + { 122, 90, 947 }, + { 122, 124, 911 }, + { 124, 122, 911 }, + { 124, 125, 23829 }, + { 125, 124, 23829 }, + { 91, 119, 7911 }, + { 119, 91, 7911 }, +}; + +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 +void +propagate_edges(Box& 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; + assign_r(a, q.get_den(), ROUND_NOT_NEEDED); + Coefficient b; + assign_r(b, q.get_num(), ROUND_NOT_NEEDED); + + 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() ***"); + + bool ok = check_result(tbox, qbox2, "18.36", "2.83", "2.79"); + + 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_F16(test01); + DO_TEST(test02); + DO_TEST(test03); +END_MAIN diff --git a/tests/Box/refinewithcongruences1.cc b/tests/Box/refinewithcongruences1.cc new file mode 100644 index 0000000..e453498 --- /dev/null +++ b/tests/Box/refinewithcongruences1.cc @@ -0,0 +1,387 @@ +/* Test Box::refine_with_congruences(const Congruence_System&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Universe 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(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 ignored when congruences + // are added to the box. + cgs.insert((A + B %= 0) / 0); + cgs.insert(C %= 7); + + TBox box(cgs); + + Rational_Box known_result(3); + known_result.add_constraint(A == 7); + known_result.add_constraint(B == 3); + + 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(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..a126dcd --- /dev/null +++ b/tests/Box/refinewithconstraint1.cc @@ -0,0 +1,158 @@ +/* Test Box::refine_with_constraint(const Constraint&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + 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 +// FIXME: see corresponding fixme in Box::refine_no_check(c). +// Temporarily set to always fail: this is meant to be a test for +// constraint propagation, rather than syntactical refinement. +// DO_TEST_F8(test01); + DO_TEST_F(test01); +// FIXME: see corresponding fixme in Box::refine_no_check(c). +// Temporarily set to always fail: this is meant to be a test for +// constraint propagation, rather than syntactical refinement. +// DO_TEST(test02); + DO_TEST_F(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..3cbbd70 --- /dev/null +++ b/tests/Box/refinewithconstraint2.cc @@ -0,0 +1,80 @@ +/* Test Box::refine_with_constraint(const Constraint&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +struct 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_Restriction_None + > +Unsigned_Integer_Closed_Interval_Info; + +typedef Interval +Unsigned_Integer_Closed_Interval; + +typedef Box 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..6003bdd --- /dev/null +++ b/tests/Box/refinewithconstraints1.cc @@ -0,0 +1,427 @@ +/* Test Box::refine_with_constraints(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + Constraint_System cs; + cs.insert(A >= 0); + cs.insert(B == 5); + + 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..545517f --- /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-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include "pwl.hh" +#include + +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::is_exact + && !std::numeric_limits::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_Watchdog_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::is_exact + && !std::numeric_limits::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_Watchdog_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..d2386ee --- /dev/null +++ b/tests/Box/relations1.cc @@ -0,0 +1,464 @@ +/* Test Box::relation_with(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + + 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..fd1650e --- /dev/null +++ b/tests/Box/relations2.cc @@ -0,0 +1,441 @@ +/* Test Box::relation_with(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + // The zero-dim universe BDS. + 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..94384e3 --- /dev/null +++ b/tests/Box/relations3.cc @@ -0,0 +1,401 @@ +/* Test Box::relation_with(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + Constraint_System cs(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..1367591 --- /dev/null +++ b/tests/Box/relations4.cc @@ -0,0 +1,488 @@ +/* Test Box::relation_with(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + Constraint_System cs(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); + } + 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); +#ifndef __alpha__ + // Exception handling is broken in GCC on the Alpha. + DO_TEST(test19); +#endif + DO_TEST(test20); +END_MAIN diff --git a/tests/Box/removespacedims1.cc b/tests/Box/removespacedims1.cc new file mode 100644 index 0000000..0d364e4 --- /dev/null +++ b/tests/Box/removespacedims1.cc @@ -0,0 +1,355 @@ +/* Remove some variables from the space. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + // Variable x1(0); + Variable x2(1); + Variable x3(2); + Variable x4(3); + Variable x5(4); + Variable x6(5); + + 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..05e7404 --- /dev/null +++ b/tests/Box/run_tests @@ -0,0 +1,53 @@ +#!/bin/sh + +# Run the Box tests. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/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..a47f9d9 --- /dev/null +++ b/tests/Box/simplifyusingcontext1.cc @@ -0,0 +1,305 @@ +/* Test Box::simplify_using_context_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + 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..2611071 --- /dev/null +++ b/tests/Box/timeelapse1.cc @@ -0,0 +1,206 @@ +/* Test Box::time_elapse_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + 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..610867c --- /dev/null +++ b/tests/Box/topclosed1.cc @@ -0,0 +1,205 @@ +/* Test Box::is_topologically_closed(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +/* 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..edee431 --- /dev/null +++ b/tests/Box/unconstrain1.cc @@ -0,0 +1,225 @@ +/* Test Box::unconstrain(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + 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; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + 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/universe1.cc b/tests/Box/universe1.cc new file mode 100644 index 0000000..3667c0a --- /dev/null +++ b/tests/Box/universe1.cc @@ -0,0 +1,86 @@ +/* Test Box::is_universe(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + 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..bcab71d --- /dev/null +++ b/tests/Box/upperbound1.cc @@ -0,0 +1,266 @@ +/* Test Box::upper_bound_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x1(0); + Variable x2(1); + Variable x3(2); + Variable x4(3); + + TBox box1(5); + box1.add_constraint(x1 <= 5); + box1.add_constraint(x2 <= -1); + box1.add_constraint(x1 -x2 <= 10); + + TBox box2(5); + box2.add_constraint(x1 <= 2); + box2.add_constraint(x4 <= 7); + box2.add_constraint(x1 - x2 <= 20); + box2.add_constraint(x4 - x3 <= 3); + + print_constraints(box1, "*** box1 ***"); + print_constraints(box2, "*** box2 ***"); + + box1.upper_bound_assign(box2); + + Rational_Box known_result(5); + known_result.add_constraint(x1 <= 5); + known_result.add_constraint(x1 - x2 <= 20); + + 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); + box1.add_constraint(x - y <= 1); + + TBox box2(3); + box2.add_constraint(y - x <= -1); + 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); + 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(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); + box1.add_constraint(x - y <= 1); + + TBox box2(2); + box2.add_constraint(y - x <= -1); + 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); + box1.add_constraint(A - B <= 1); + + TBox box2(2); + box2.add_constraint(B - A <= -1); + box2.add_constraint(A <= 3); + box2.add_constraint(-B <= 5); + + print_constraints(box1, "*** box1 ***"); + print_constraints(box2, "*** box2 ***"); + + box1.upper_bound_assign(box2); + + Rational_Box 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(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 x(0); + Variable y(1); + + TBox box1(2); + box1.add_constraint(x >= y); + + TBox box2(3); + + try { + // This is an invalid use of method + // Box::upper_bound_assign(box2): it is illegal + // to apply the 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 +test07() { + 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 +test08() { + 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; +} + +} // namespace + +BEGIN_MAIN +// CHECKME: why test from 1 to 7 are commented out? +// 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..b70c507 --- /dev/null +++ b/tests/Box/upperboundifexact1.cc @@ -0,0 +1,310 @@ +/* Test BD_Shape::upper_bound_assign_if_exact(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + 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/writebox1.cc b/tests/Box/writebox1.cc new file mode 100644 index 0000000..b500d92 --- /dev/null +++ b/tests/Box/writebox1.cc @@ -0,0 +1,75 @@ +/* Test operator<<(ostream&, const Box&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + 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/Grid/Makefile.am b/tests/Grid/Makefile.am new file mode 100644 index 0000000..1722c09 --- /dev/null +++ b/tests/Grid/Makefile.am @@ -0,0 +1,305 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +# USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +if VALGRIND_TESTS_ENABLED + +CHECKER = \ +$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \ +--num-callers=100 --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 \ +@extra_includes@ \ +@debug_flag@ + +LDADD = \ +$(top_builddir)/utils/libppl_utils.a \ +$(top_builddir)/tests/libppl_tests.a \ +$(top_builddir)/src/libppl.la \ +@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 \ +coveringbox1 coveringbox2 \ +discrete1 \ +disjoint1 \ +equals1 \ +expandspacedim1 \ +foldspacedims1 \ +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\ +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 + +equals1_SOURCES = equals1.cc + +expandspacedim1_SOURCES = expandspacedim1.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 + +coveringbox1_SOURCES = coveringbox1.cc +coveringbox2_SOURCES = coveringbox2.cc + +grid1_SOURCES = grid1.cc +grid2_SOURCES = grid2.cc +grid3_SOURCES = grid3.cc + +griddifference1_SOURCES = griddifference1.cc + +intersection1_SOURCES = intersection1.cc + +isempty1_SOURCES = isempty1.cc + +isuniverse1_SOURCES = isuniverse1.cc + +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 + +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 \ +ascii_dump_load7.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..5cd39e0 --- /dev/null +++ b/tests/Grid/Makefile.in @@ -0,0 +1,1914 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +# USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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) coveringbox1$(EXEEXT) \ + coveringbox2$(EXEEXT) discrete1$(EXEEXT) disjoint1$(EXEEXT) \ + equals1$(EXEEXT) expandspacedim1$(EXEEXT) \ + foldspacedims1$(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) \ + writecongruencesystem$(EXEEXT) +XFAIL_TESTS = +check_PROGRAMS = $(am__EXEEXT_1) +subdir = tests/Grid +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__EXEEXT_1 = addcongruence1$(EXEEXT) addcongruences1$(EXEEXT) \ + addconstraint1$(EXEEXT) addconstraints1$(EXEEXT) \ + addgenerator1$(EXEEXT) addgenerators1$(EXEEXT) \ + addspacedims1$(EXEEXT) affinedim1$(EXEEXT) \ + affineimage1$(EXEEXT) affineimage2$(EXEEXT) \ + affinepreimage1$(EXEEXT) affinepreimage2$(EXEEXT) \ + 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) coveringbox1$(EXEEXT) \ + coveringbox2$(EXEEXT) discrete1$(EXEEXT) disjoint1$(EXEEXT) \ + equals1$(EXEEXT) expandspacedim1$(EXEEXT) \ + foldspacedims1$(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) \ + writecongruencesystem$(EXEEXT) +am_addcongruence1_OBJECTS = addcongruence1.$(OBJEXT) +addcongruence1_OBJECTS = $(am_addcongruence1_OBJECTS) +addcongruence1_LDADD = $(LDADD) +addcongruence1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_addcongruences1_OBJECTS = addcongruences1.$(OBJEXT) +addcongruences1_OBJECTS = $(am_addcongruences1_OBJECTS) +addcongruences1_LDADD = $(LDADD) +addcongruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_addconstraint1_OBJECTS = addconstraint1.$(OBJEXT) +addconstraint1_OBJECTS = $(am_addconstraint1_OBJECTS) +addconstraint1_LDADD = $(LDADD) +addconstraint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_addconstraints1_OBJECTS = addconstraints1.$(OBJEXT) +addconstraints1_OBJECTS = $(am_addconstraints1_OBJECTS) +addconstraints1_LDADD = $(LDADD) +addconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_addgenerator1_OBJECTS = addgenerator1.$(OBJEXT) +addgenerator1_OBJECTS = $(am_addgenerator1_OBJECTS) +addgenerator1_LDADD = $(LDADD) +addgenerator1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_addgenerators1_OBJECTS = addgenerators1.$(OBJEXT) +addgenerators1_OBJECTS = $(am_addgenerators1_OBJECTS) +addgenerators1_LDADD = $(LDADD) +addgenerators1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_addspacedims1_OBJECTS = addspacedims1.$(OBJEXT) +addspacedims1_OBJECTS = $(am_addspacedims1_OBJECTS) +addspacedims1_LDADD = $(LDADD) +addspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_affinedim1_OBJECTS = affinedim1.$(OBJEXT) +affinedim1_OBJECTS = $(am_affinedim1_OBJECTS) +affinedim1_LDADD = $(LDADD) +affinedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_affineimage1_OBJECTS = affineimage1.$(OBJEXT) +affineimage1_OBJECTS = $(am_affineimage1_OBJECTS) +affineimage1_LDADD = $(LDADD) +affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_affineimage2_OBJECTS = affineimage2.$(OBJEXT) +affineimage2_OBJECTS = $(am_affineimage2_OBJECTS) +affineimage2_LDADD = $(LDADD) +affineimage2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_affinepreimage1_OBJECTS = affinepreimage1.$(OBJEXT) +affinepreimage1_OBJECTS = $(am_affinepreimage1_OBJECTS) +affinepreimage1_LDADD = $(LDADD) +affinepreimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_affinepreimage2_OBJECTS = affinepreimage2.$(OBJEXT) +affinepreimage2_OBJECTS = $(am_affinepreimage2_OBJECTS) +affinepreimage2_LDADD = $(LDADD) +affinepreimage2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_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_coveringbox1_OBJECTS = coveringbox1.$(OBJEXT) +coveringbox1_OBJECTS = $(am_coveringbox1_OBJECTS) +coveringbox1_LDADD = $(LDADD) +coveringbox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_coveringbox2_OBJECTS = coveringbox2.$(OBJEXT) +coveringbox2_OBJECTS = $(am_coveringbox2_OBJECTS) +coveringbox2_LDADD = $(LDADD) +coveringbox2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_discrete1_OBJECTS = discrete1.$(OBJEXT) +discrete1_OBJECTS = $(am_discrete1_OBJECTS) +discrete1_LDADD = $(LDADD) +discrete1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_disjoint1_OBJECTS = disjoint1.$(OBJEXT) +disjoint1_OBJECTS = $(am_disjoint1_OBJECTS) +disjoint1_LDADD = $(LDADD) +disjoint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_equals1_OBJECTS = equals1.$(OBJEXT) +equals1_OBJECTS = $(am_equals1_OBJECTS) +equals1_LDADD = $(LDADD) +equals1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_expandspacedim1_OBJECTS = expandspacedim1.$(OBJEXT) +expandspacedim1_OBJECTS = $(am_expandspacedim1_OBJECTS) +expandspacedim1_LDADD = $(LDADD) +expandspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_foldspacedims1_OBJECTS = foldspacedims1.$(OBJEXT) +foldspacedims1_OBJECTS = $(am_foldspacedims1_OBJECTS) +foldspacedims1_LDADD = $(LDADD) +foldspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_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_writecongruencesystem_OBJECTS = writecongruencesystem.$(OBJEXT) +writecongruencesystem_OBJECTS = $(am_writecongruencesystem_OBJECTS) +writecongruencesystem_LDADD = $(LDADD) +writecongruencesystem_DEPENDENCIES = \ + $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(addcongruence1_SOURCES) $(addcongruences1_SOURCES) \ + $(addconstraint1_SOURCES) $(addconstraints1_SOURCES) \ + $(addgenerator1_SOURCES) $(addgenerators1_SOURCES) \ + $(addspacedims1_SOURCES) $(affinedim1_SOURCES) \ + $(affineimage1_SOURCES) $(affineimage2_SOURCES) \ + $(affinepreimage1_SOURCES) $(affinepreimage2_SOURCES) \ + $(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) \ + $(coveringbox1_SOURCES) $(coveringbox2_SOURCES) \ + $(discrete1_SOURCES) $(disjoint1_SOURCES) $(equals1_SOURCES) \ + $(expandspacedim1_SOURCES) $(foldspacedims1_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) \ + $(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) \ + $(coveringbox1_SOURCES) $(coveringbox2_SOURCES) \ + $(discrete1_SOURCES) $(disjoint1_SOURCES) $(equals1_SOURCES) \ + $(expandspacedim1_SOURCES) $(foldspacedims1_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) \ + $(writecongruencesystem_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +@VALGRIND_TESTS_ENABLED_FALSE@CHECKER = +@VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \ +@VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \ +@VALGRIND_TESTS_ENABLED_TRUE@--num-callers=100 --leak-resolution=high \ +@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 \ +@extra_includes@ \ +@debug_flag@ + +LDADD = \ +$(top_builddir)/utils/libppl_utils.a \ +$(top_builddir)/tests/libppl_tests.a \ +$(top_builddir)/src/libppl.la \ +@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 +equals1_SOURCES = equals1.cc +expandspacedim1_SOURCES = expandspacedim1.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 +coveringbox1_SOURCES = coveringbox1.cc +coveringbox2_SOURCES = coveringbox2.cc +grid1_SOURCES = grid1.cc +grid2_SOURCES = grid2.cc +grid3_SOURCES = grid3.cc +griddifference1_SOURCES = griddifference1.cc +intersection1_SOURCES = intersection1.cc +isempty1_SOURCES = isempty1.cc +isuniverse1_SOURCES = isuniverse1.cc +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 +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 \ +ascii_dump_load7.dat + +all: all-am + +.SUFFIXES: +.SUFFIXES: .cc .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Grid/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign tests/Grid/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +addcongruence1$(EXEEXT): $(addcongruence1_OBJECTS) $(addcongruence1_DEPENDENCIES) + @rm -f addcongruence1$(EXEEXT) + $(CXXLINK) $(addcongruence1_OBJECTS) $(addcongruence1_LDADD) $(LIBS) +addcongruences1$(EXEEXT): $(addcongruences1_OBJECTS) $(addcongruences1_DEPENDENCIES) + @rm -f addcongruences1$(EXEEXT) + $(CXXLINK) $(addcongruences1_OBJECTS) $(addcongruences1_LDADD) $(LIBS) +addconstraint1$(EXEEXT): $(addconstraint1_OBJECTS) $(addconstraint1_DEPENDENCIES) + @rm -f addconstraint1$(EXEEXT) + $(CXXLINK) $(addconstraint1_OBJECTS) $(addconstraint1_LDADD) $(LIBS) +addconstraints1$(EXEEXT): $(addconstraints1_OBJECTS) $(addconstraints1_DEPENDENCIES) + @rm -f addconstraints1$(EXEEXT) + $(CXXLINK) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS) +addgenerator1$(EXEEXT): $(addgenerator1_OBJECTS) $(addgenerator1_DEPENDENCIES) + @rm -f addgenerator1$(EXEEXT) + $(CXXLINK) $(addgenerator1_OBJECTS) $(addgenerator1_LDADD) $(LIBS) +addgenerators1$(EXEEXT): $(addgenerators1_OBJECTS) $(addgenerators1_DEPENDENCIES) + @rm -f addgenerators1$(EXEEXT) + $(CXXLINK) $(addgenerators1_OBJECTS) $(addgenerators1_LDADD) $(LIBS) +addspacedims1$(EXEEXT): $(addspacedims1_OBJECTS) $(addspacedims1_DEPENDENCIES) + @rm -f addspacedims1$(EXEEXT) + $(CXXLINK) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS) +affinedim1$(EXEEXT): $(affinedim1_OBJECTS) $(affinedim1_DEPENDENCIES) + @rm -f affinedim1$(EXEEXT) + $(CXXLINK) $(affinedim1_OBJECTS) $(affinedim1_LDADD) $(LIBS) +affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) + @rm -f affineimage1$(EXEEXT) + $(CXXLINK) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS) +affineimage2$(EXEEXT): $(affineimage2_OBJECTS) $(affineimage2_DEPENDENCIES) + @rm -f affineimage2$(EXEEXT) + $(CXXLINK) $(affineimage2_OBJECTS) $(affineimage2_LDADD) $(LIBS) +affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES) + @rm -f affinepreimage1$(EXEEXT) + $(CXXLINK) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS) +affinepreimage2$(EXEEXT): $(affinepreimage2_OBJECTS) $(affinepreimage2_DEPENDENCIES) + @rm -f affinepreimage2$(EXEEXT) + $(CXXLINK) $(affinepreimage2_OBJECTS) $(affinepreimage2_LDADD) $(LIBS) +approximatepartition1$(EXEEXT): $(approximatepartition1_OBJECTS) $(approximatepartition1_DEPENDENCIES) + @rm -f approximatepartition1$(EXEEXT) + $(CXXLINK) $(approximatepartition1_OBJECTS) $(approximatepartition1_LDADD) $(LIBS) +asciidumpload1$(EXEEXT): $(asciidumpload1_OBJECTS) $(asciidumpload1_DEPENDENCIES) + @rm -f asciidumpload1$(EXEEXT) + $(CXXLINK) $(asciidumpload1_OBJECTS) $(asciidumpload1_LDADD) $(LIBS) +asciidumpload2$(EXEEXT): $(asciidumpload2_OBJECTS) $(asciidumpload2_DEPENDENCIES) + @rm -f asciidumpload2$(EXEEXT) + $(CXXLINK) $(asciidumpload2_OBJECTS) $(asciidumpload2_LDADD) $(LIBS) +asciidumpload3$(EXEEXT): $(asciidumpload3_OBJECTS) $(asciidumpload3_DEPENDENCIES) + @rm -f asciidumpload3$(EXEEXT) + $(CXXLINK) $(asciidumpload3_OBJECTS) $(asciidumpload3_LDADD) $(LIBS) +asciidumpload4$(EXEEXT): $(asciidumpload4_OBJECTS) $(asciidumpload4_DEPENDENCIES) + @rm -f asciidumpload4$(EXEEXT) + $(CXXLINK) $(asciidumpload4_OBJECTS) $(asciidumpload4_LDADD) $(LIBS) +asciidumpload5$(EXEEXT): $(asciidumpload5_OBJECTS) $(asciidumpload5_DEPENDENCIES) + @rm -f asciidumpload5$(EXEEXT) + $(CXXLINK) $(asciidumpload5_OBJECTS) $(asciidumpload5_LDADD) $(LIBS) +asciidumpload6$(EXEEXT): $(asciidumpload6_OBJECTS) $(asciidumpload6_DEPENDENCIES) + @rm -f asciidumpload6$(EXEEXT) + $(CXXLINK) $(asciidumpload6_OBJECTS) $(asciidumpload6_LDADD) $(LIBS) +bhz03widening1$(EXEEXT): $(bhz03widening1_OBJECTS) $(bhz03widening1_DEPENDENCIES) + @rm -f bhz03widening1$(EXEEXT) + $(CXXLINK) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS) +bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES) + @rm -f bounded1$(EXEEXT) + $(CXXLINK) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS) +boundedaffineimage1$(EXEEXT): $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_DEPENDENCIES) + @rm -f boundedaffineimage1$(EXEEXT) + $(CXXLINK) $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_LDADD) $(LIBS) +boundedaffinepreimage1$(EXEEXT): $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_DEPENDENCIES) + @rm -f boundedaffinepreimage1$(EXEEXT) + $(CXXLINK) $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_LDADD) $(LIBS) +bounds1$(EXEEXT): $(bounds1_OBJECTS) $(bounds1_DEPENDENCIES) + @rm -f bounds1$(EXEEXT) + $(CXXLINK) $(bounds1_OBJECTS) $(bounds1_LDADD) $(LIBS) +certificate1$(EXEEXT): $(certificate1_OBJECTS) $(certificate1_DEPENDENCIES) + @rm -f certificate1$(EXEEXT) + $(CXXLINK) $(certificate1_OBJECTS) $(certificate1_LDADD) $(LIBS) +concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) + @rm -f concatenate1$(EXEEXT) + $(CXXLINK) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS) +congruence1$(EXEEXT): $(congruence1_OBJECTS) $(congruence1_DEPENDENCIES) + @rm -f congruence1$(EXEEXT) + $(CXXLINK) $(congruence1_OBJECTS) $(congruence1_LDADD) $(LIBS) +congruences1$(EXEEXT): $(congruences1_OBJECTS) $(congruences1_DEPENDENCIES) + @rm -f congruences1$(EXEEXT) + $(CXXLINK) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS) +congruences2$(EXEEXT): $(congruences2_OBJECTS) $(congruences2_DEPENDENCIES) + @rm -f congruences2$(EXEEXT) + $(CXXLINK) $(congruences2_OBJECTS) $(congruences2_LDADD) $(LIBS) +constraints1$(EXEEXT): $(constraints1_OBJECTS) $(constraints1_DEPENDENCIES) + @rm -f constraints1$(EXEEXT) + $(CXXLINK) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS) +contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) + @rm -f contains1$(EXEEXT) + $(CXXLINK) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS) +containsintegerpoint1$(EXEEXT): $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_DEPENDENCIES) + @rm -f containsintegerpoint1$(EXEEXT) + $(CXXLINK) $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_LDADD) $(LIBS) +coveringbox1$(EXEEXT): $(coveringbox1_OBJECTS) $(coveringbox1_DEPENDENCIES) + @rm -f coveringbox1$(EXEEXT) + $(CXXLINK) $(coveringbox1_OBJECTS) $(coveringbox1_LDADD) $(LIBS) +coveringbox2$(EXEEXT): $(coveringbox2_OBJECTS) $(coveringbox2_DEPENDENCIES) + @rm -f coveringbox2$(EXEEXT) + $(CXXLINK) $(coveringbox2_OBJECTS) $(coveringbox2_LDADD) $(LIBS) +discrete1$(EXEEXT): $(discrete1_OBJECTS) $(discrete1_DEPENDENCIES) + @rm -f discrete1$(EXEEXT) + $(CXXLINK) $(discrete1_OBJECTS) $(discrete1_LDADD) $(LIBS) +disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES) + @rm -f disjoint1$(EXEEXT) + $(CXXLINK) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS) +equals1$(EXEEXT): $(equals1_OBJECTS) $(equals1_DEPENDENCIES) + @rm -f equals1$(EXEEXT) + $(CXXLINK) $(equals1_OBJECTS) $(equals1_LDADD) $(LIBS) +expandspacedim1$(EXEEXT): $(expandspacedim1_OBJECTS) $(expandspacedim1_DEPENDENCIES) + @rm -f expandspacedim1$(EXEEXT) + $(CXXLINK) $(expandspacedim1_OBJECTS) $(expandspacedim1_LDADD) $(LIBS) +foldspacedims1$(EXEEXT): $(foldspacedims1_OBJECTS) $(foldspacedims1_DEPENDENCIES) + @rm -f foldspacedims1$(EXEEXT) + $(CXXLINK) $(foldspacedims1_OBJECTS) $(foldspacedims1_LDADD) $(LIBS) +frombdshape1$(EXEEXT): $(frombdshape1_OBJECTS) $(frombdshape1_DEPENDENCIES) + @rm -f frombdshape1$(EXEEXT) + $(CXXLINK) $(frombdshape1_OBJECTS) $(frombdshape1_LDADD) $(LIBS) +frombox1$(EXEEXT): $(frombox1_OBJECTS) $(frombox1_DEPENDENCIES) + @rm -f frombox1$(EXEEXT) + $(CXXLINK) $(frombox1_OBJECTS) $(frombox1_LDADD) $(LIBS) +fromgrid1$(EXEEXT): $(fromgrid1_OBJECTS) $(fromgrid1_DEPENDENCIES) + @rm -f fromgrid1$(EXEEXT) + $(CXXLINK) $(fromgrid1_OBJECTS) $(fromgrid1_LDADD) $(LIBS) +fromoctagonalshape1$(EXEEXT): $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_DEPENDENCIES) + @rm -f fromoctagonalshape1$(EXEEXT) + $(CXXLINK) $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_LDADD) $(LIBS) +frompolyhedron1$(EXEEXT): $(frompolyhedron1_OBJECTS) $(frompolyhedron1_DEPENDENCIES) + @rm -f frompolyhedron1$(EXEEXT) + $(CXXLINK) $(frompolyhedron1_OBJECTS) $(frompolyhedron1_LDADD) $(LIBS) +generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES) + @rm -f generalizedaffineimage1$(EXEEXT) + $(CXXLINK) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS) +generalizedaffineimage2$(EXEEXT): $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_DEPENDENCIES) + @rm -f generalizedaffineimage2$(EXEEXT) + $(CXXLINK) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS) +generalizedaffineimage3$(EXEEXT): $(generalizedaffineimage3_OBJECTS) $(generalizedaffineimage3_DEPENDENCIES) + @rm -f generalizedaffineimage3$(EXEEXT) + $(CXXLINK) $(generalizedaffineimage3_OBJECTS) $(generalizedaffineimage3_LDADD) $(LIBS) +generalizedaffinepreimage1$(EXEEXT): $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_DEPENDENCIES) + @rm -f generalizedaffinepreimage1$(EXEEXT) + $(CXXLINK) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS) +generalizedaffinepreimage2$(EXEEXT): $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_DEPENDENCIES) + @rm -f generalizedaffinepreimage2$(EXEEXT) + $(CXXLINK) $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_LDADD) $(LIBS) +generalizedaffinepreimage3$(EXEEXT): $(generalizedaffinepreimage3_OBJECTS) $(generalizedaffinepreimage3_DEPENDENCIES) + @rm -f generalizedaffinepreimage3$(EXEEXT) + $(CXXLINK) $(generalizedaffinepreimage3_OBJECTS) $(generalizedaffinepreimage3_LDADD) $(LIBS) +generator1$(EXEEXT): $(generator1_OBJECTS) $(generator1_DEPENDENCIES) + @rm -f generator1$(EXEEXT) + $(CXXLINK) $(generator1_OBJECTS) $(generator1_LDADD) $(LIBS) +generators1$(EXEEXT): $(generators1_OBJECTS) $(generators1_DEPENDENCIES) + @rm -f generators1$(EXEEXT) + $(CXXLINK) $(generators1_OBJECTS) $(generators1_LDADD) $(LIBS) +generators2$(EXEEXT): $(generators2_OBJECTS) $(generators2_DEPENDENCIES) + @rm -f generators2$(EXEEXT) + $(CXXLINK) $(generators2_OBJECTS) $(generators2_LDADD) $(LIBS) +grid1$(EXEEXT): $(grid1_OBJECTS) $(grid1_DEPENDENCIES) + @rm -f grid1$(EXEEXT) + $(CXXLINK) $(grid1_OBJECTS) $(grid1_LDADD) $(LIBS) +grid2$(EXEEXT): $(grid2_OBJECTS) $(grid2_DEPENDENCIES) + @rm -f grid2$(EXEEXT) + $(CXXLINK) $(grid2_OBJECTS) $(grid2_LDADD) $(LIBS) +grid3$(EXEEXT): $(grid3_OBJECTS) $(grid3_DEPENDENCIES) + @rm -f grid3$(EXEEXT) + $(CXXLINK) $(grid3_OBJECTS) $(grid3_LDADD) $(LIBS) +griddifference1$(EXEEXT): $(griddifference1_OBJECTS) $(griddifference1_DEPENDENCIES) + @rm -f griddifference1$(EXEEXT) + $(CXXLINK) $(griddifference1_OBJECTS) $(griddifference1_LDADD) $(LIBS) +intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) + @rm -f intersection1$(EXEEXT) + $(CXXLINK) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS) +isempty1$(EXEEXT): $(isempty1_OBJECTS) $(isempty1_DEPENDENCIES) + @rm -f isempty1$(EXEEXT) + $(CXXLINK) $(isempty1_OBJECTS) $(isempty1_LDADD) $(LIBS) +isuniverse1$(EXEEXT): $(isuniverse1_OBJECTS) $(isuniverse1_DEPENDENCIES) + @rm -f isuniverse1$(EXEEXT) + $(CXXLINK) $(isuniverse1_OBJECTS) $(isuniverse1_LDADD) $(LIBS) +limitedextrapolation1$(EXEEXT): $(limitedextrapolation1_OBJECTS) $(limitedextrapolation1_DEPENDENCIES) + @rm -f limitedextrapolation1$(EXEEXT) + $(CXXLINK) $(limitedextrapolation1_OBJECTS) $(limitedextrapolation1_LDADD) $(LIBS) +limitedextrapolation2$(EXEEXT): $(limitedextrapolation2_OBJECTS) $(limitedextrapolation2_DEPENDENCIES) + @rm -f limitedextrapolation2$(EXEEXT) + $(CXXLINK) $(limitedextrapolation2_OBJECTS) $(limitedextrapolation2_LDADD) $(LIBS) +limitedextrapolation3$(EXEEXT): $(limitedextrapolation3_OBJECTS) $(limitedextrapolation3_DEPENDENCIES) + @rm -f limitedextrapolation3$(EXEEXT) + $(CXXLINK) $(limitedextrapolation3_OBJECTS) $(limitedextrapolation3_LDADD) $(LIBS) +mapspacedims1$(EXEEXT): $(mapspacedims1_OBJECTS) $(mapspacedims1_DEPENDENCIES) + @rm -f mapspacedims1$(EXEEXT) + $(CXXLINK) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS) +maxmin1$(EXEEXT): $(maxmin1_OBJECTS) $(maxmin1_DEPENDENCIES) + @rm -f maxmin1$(EXEEXT) + $(CXXLINK) $(maxmin1_OBJECTS) $(maxmin1_LDADD) $(LIBS) +membytes1$(EXEEXT): $(membytes1_OBJECTS) $(membytes1_DEPENDENCIES) + @rm -f membytes1$(EXEEXT) + $(CXXLINK) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS) +mincongruences1$(EXEEXT): $(mincongruences1_OBJECTS) $(mincongruences1_DEPENDENCIES) + @rm -f mincongruences1$(EXEEXT) + $(CXXLINK) $(mincongruences1_OBJECTS) $(mincongruences1_LDADD) $(LIBS) +mingenerators1$(EXEEXT): $(mingenerators1_OBJECTS) $(mingenerators1_DEPENDENCIES) + @rm -f mingenerators1$(EXEEXT) + $(CXXLINK) $(mingenerators1_OBJECTS) $(mingenerators1_LDADD) $(LIBS) +outputoperator1$(EXEEXT): $(outputoperator1_OBJECTS) $(outputoperator1_DEPENDENCIES) + @rm -f outputoperator1$(EXEEXT) + $(CXXLINK) $(outputoperator1_OBJECTS) $(outputoperator1_LDADD) $(LIBS) +outputoperator2$(EXEEXT): $(outputoperator2_OBJECTS) $(outputoperator2_DEPENDENCIES) + @rm -f outputoperator2$(EXEEXT) + $(CXXLINK) $(outputoperator2_OBJECTS) $(outputoperator2_LDADD) $(LIBS) +outputoperator3$(EXEEXT): $(outputoperator3_OBJECTS) $(outputoperator3_DEPENDENCIES) + @rm -f outputoperator3$(EXEEXT) + $(CXXLINK) $(outputoperator3_OBJECTS) $(outputoperator3_LDADD) $(LIBS) +partition1$(EXEEXT): $(partition1_OBJECTS) $(partition1_DEPENDENCIES) + @rm -f partition1$(EXEEXT) + $(CXXLINK) $(partition1_OBJECTS) $(partition1_LDADD) $(LIBS) +powersetdifference1$(EXEEXT): $(powersetdifference1_OBJECTS) $(powersetdifference1_DEPENDENCIES) + @rm -f powersetdifference1$(EXEEXT) + $(CXXLINK) $(powersetdifference1_OBJECTS) $(powersetdifference1_LDADD) $(LIBS) +powersetgeometricallycovers1$(EXEEXT): $(powersetgeometricallycovers1_OBJECTS) $(powersetgeometricallycovers1_DEPENDENCIES) + @rm -f powersetgeometricallycovers1$(EXEEXT) + $(CXXLINK) $(powersetgeometricallycovers1_OBJECTS) $(powersetgeometricallycovers1_LDADD) $(LIBS) +powersetgeometricallyequals1$(EXEEXT): $(powersetgeometricallyequals1_OBJECTS) $(powersetgeometricallyequals1_DEPENDENCIES) + @rm -f powersetgeometricallyequals1$(EXEEXT) + $(CXXLINK) $(powersetgeometricallyequals1_OBJECTS) $(powersetgeometricallyequals1_LDADD) $(LIBS) +refinewithcongruences1$(EXEEXT): $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_DEPENDENCIES) + @rm -f refinewithcongruences1$(EXEEXT) + $(CXXLINK) $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_LDADD) $(LIBS) +refinewithconstraints1$(EXEEXT): $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_DEPENDENCIES) + @rm -f refinewithconstraints1$(EXEEXT) + $(CXXLINK) $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_LDADD) $(LIBS) +relations1$(EXEEXT): $(relations1_OBJECTS) $(relations1_DEPENDENCIES) + @rm -f relations1$(EXEEXT) + $(CXXLINK) $(relations1_OBJECTS) $(relations1_LDADD) $(LIBS) +relations2$(EXEEXT): $(relations2_OBJECTS) $(relations2_DEPENDENCIES) + @rm -f relations2$(EXEEXT) + $(CXXLINK) $(relations2_OBJECTS) $(relations2_LDADD) $(LIBS) +relations3$(EXEEXT): $(relations3_OBJECTS) $(relations3_DEPENDENCIES) + @rm -f relations3$(EXEEXT) + $(CXXLINK) $(relations3_OBJECTS) $(relations3_LDADD) $(LIBS) +removespacedims1$(EXEEXT): $(removespacedims1_OBJECTS) $(removespacedims1_DEPENDENCIES) + @rm -f removespacedims1$(EXEEXT) + $(CXXLINK) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS) +removespacedims2$(EXEEXT): $(removespacedims2_OBJECTS) $(removespacedims2_DEPENDENCIES) + @rm -f removespacedims2$(EXEEXT) + $(CXXLINK) $(removespacedims2_OBJECTS) $(removespacedims2_LDADD) $(LIBS) +simplifyusingcontext1$(EXEEXT): $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_DEPENDENCIES) + @rm -f simplifyusingcontext1$(EXEEXT) + $(CXXLINK) $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_LDADD) $(LIBS) +timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES) + @rm -f timeelapse1$(EXEEXT) + $(CXXLINK) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS) +topclosed1$(EXEEXT): $(topclosed1_OBJECTS) $(topclosed1_DEPENDENCIES) + @rm -f topclosed1$(EXEEXT) + $(CXXLINK) $(topclosed1_OBJECTS) $(topclosed1_LDADD) $(LIBS) +topclosure1$(EXEEXT): $(topclosure1_OBJECTS) $(topclosure1_DEPENDENCIES) + @rm -f topclosure1$(EXEEXT) + $(CXXLINK) $(topclosure1_OBJECTS) $(topclosure1_LDADD) $(LIBS) +unconstrain1$(EXEEXT): $(unconstrain1_OBJECTS) $(unconstrain1_DEPENDENCIES) + @rm -f unconstrain1$(EXEEXT) + $(CXXLINK) $(unconstrain1_OBJECTS) $(unconstrain1_LDADD) $(LIBS) +upperbound1$(EXEEXT): $(upperbound1_OBJECTS) $(upperbound1_DEPENDENCIES) + @rm -f upperbound1$(EXEEXT) + $(CXXLINK) $(upperbound1_OBJECTS) $(upperbound1_LDADD) $(LIBS) +upperbound2$(EXEEXT): $(upperbound2_OBJECTS) $(upperbound2_DEPENDENCIES) + @rm -f upperbound2$(EXEEXT) + $(CXXLINK) $(upperbound2_OBJECTS) $(upperbound2_LDADD) $(LIBS) +widening1$(EXEEXT): $(widening1_OBJECTS) $(widening1_DEPENDENCIES) + @rm -f widening1$(EXEEXT) + $(CXXLINK) $(widening1_OBJECTS) $(widening1_LDADD) $(LIBS) +widening2$(EXEEXT): $(widening2_OBJECTS) $(widening2_DEPENDENCIES) + @rm -f widening2$(EXEEXT) + $(CXXLINK) $(widening2_OBJECTS) $(widening2_LDADD) $(LIBS) +widening3$(EXEEXT): $(widening3_OBJECTS) $(widening3_DEPENDENCIES) + @rm -f widening3$(EXEEXT) + $(CXXLINK) $(widening3_OBJECTS) $(widening3_LDADD) $(LIBS) +writecongruencesystem$(EXEEXT): $(writecongruencesystem_OBJECTS) $(writecongruencesystem_DEPENDENCIES) + @rm -f writecongruencesystem$(EXEEXT) + $(CXXLINK) $(writecongruencesystem_OBJECTS) $(writecongruencesystem_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addcongruence1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addcongruences1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addconstraint1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addconstraints1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addgenerator1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addgenerators1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addspacedims1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/affinedim1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/affineimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/affineimage2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/affinepreimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/affinepreimage2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/approximatepartition1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asciidumpload1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asciidumpload2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asciidumpload3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asciidumpload4.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asciidumpload5.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asciidumpload6.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bhz03widening1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bounded1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/boundedaffineimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/boundedaffinepreimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bounds1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/certificate1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/concatenate1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/congruence1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/congruences1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/congruences2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/constraints1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/contains1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/containsintegerpoint1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coveringbox1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coveringbox2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/discrete1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disjoint1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/equals1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/expandspacedim1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/foldspacedims1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frombdshape1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frombox1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fromgrid1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fromoctagonalshape1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frompolyhedron1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalizedaffineimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalizedaffineimage2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalizedaffineimage3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalizedaffinepreimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalizedaffinepreimage2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalizedaffinepreimage3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generator1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generators1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generators2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grid1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grid2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grid3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/griddifference1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/intersection1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isempty1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isuniverse1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/limitedextrapolation1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/limitedextrapolation2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/limitedextrapolation3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mapspacedims1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/maxmin1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/membytes1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mincongruences1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mingenerators1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/outputoperator1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/outputoperator2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/outputoperator3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/partition1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/powersetdifference1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/powersetgeometricallycovers1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/powersetgeometricallyequals1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refinewithcongruences1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refinewithconstraints1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relations1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relations2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relations3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/removespacedims1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/removespacedims2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplifyusingcontext1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timeelapse1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/topclosed1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/topclosure1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unconstrain1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upperbound1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upperbound2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/widening1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/widening2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/widening3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/writecongruencesystem.Po@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; ws='[ ]'; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *$$ws$$tst$$ws*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + echo "XPASS: $$tst"; \ + ;; \ + *) \ + echo "PASS: $$tst"; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *$$ws$$tst$$ws*) \ + xfail=`expr $$xfail + 1`; \ + echo "XFAIL: $$tst"; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + echo "FAIL: $$tst"; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + echo "SKIP: $$tst"; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all tests failed"; \ + else \ + banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + skipped="($$skip tests were not run)"; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + test -z "$$skipped" || echo "$$skipped"; \ + test -z "$$report" || echo "$$report"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0; \ + else :; fi + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +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 + +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 all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool ctags \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-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 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..a17db4c --- /dev/null +++ b/tests/Grid/addcongruence1.cc @@ -0,0 +1,155 @@ +/* Test methods which add a single congruence to a grid. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +// Many cases are covered in addgenerator1, in which the known grid is +// always created with Grid::add_congruence. + +namespace { + +// Test add_congruence_and_minimize. +bool +test01() { + Variable A(0); + Variable B(1); + + Grid gr(2); + + print_congruences(gr, "*** gr ***"); + + gr.add_congruence((A + B %= 0) / 6); + + print_congruences(gr, "*** gr.add_congruence((A + B %= 0) / 6) ***"); + + gr.add_congruence_and_minimize((A + B %= 0) / 3); + + Grid known_gr(2); + known_gr.add_congruence((A + B %= 0) / 6); + + bool ok = (gr == known_gr) ; + + print_congruences(gr, + "*** gr.add_congruence_and_minimize((A + B %= 0) / 3) ***"); + + return ok; +} + +// Add to an empty grid. +bool +test02() { + Variable A(0); + Variable B(1); + Variable C(2); + + Grid gr(3, EMPTY); + + print_congruences(gr, "*** gr ***"); + + gr.add_congruence((A + B + C %= 0) / 3); + + Grid known_gr(3, EMPTY); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_congruence((A + B + C %= 0) / 3) ***"); + + return ok; +} + +// Add a congruence with less dimensions than the grid. +bool +test03() { + Variable A(0); + Variable B(1); + Variable C(2); + + Grid gr(3); + gr.add_congruence((B %= 0) / 7); + gr.add_congruence((A %= 0) / 7); + + Grid known_gr(3, EMPTY); + known_gr.add_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; +} + +// Add a congruence and minimize with less dimensions than the grid. +bool +test04() { + Variable A(0); + Variable B(1); + Variable C(2); + + Grid gr(3); + gr.add_congruence((B %= 0) / 7); + gr.add_congruence_and_minimize((A %= 0) / 7); + + Grid known_gr(3, EMPTY); + known_gr.add_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 +test05() { + 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); + DO_TEST(test05); +END_MAIN diff --git a/tests/Grid/addcongruences1.cc b/tests/Grid/addcongruences1.cc new file mode 100644 index 0000000..1bb8f26 --- /dev/null +++ b/tests/Grid/addcongruences1.cc @@ -0,0 +1,443 @@ +/* Test methods which can add multiple congruences to a grid. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +using namespace Parma_Polyhedra_Library::IO_Operators; + +namespace { + +// add_congruences +bool +test01() { + + Variable A(0); + Variable B(1); + Variable C(2); + + Congruence_System cgs; + cgs.insert((A %= 0) / 2); + cgs.insert((B == 0) / 2); + + Grid gr(2); + + print_congruences(gr, "*** gr ***"); + + gr.add_congruences(cgs); + + Grid known_gr(2); + known_gr.add_congruence((A %= 0) / 2); + known_gr.add_congruence((B == 0) / 2); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_congruences(cgs) ***"); + + return ok; +} + +// add_recycled_congruences +bool +test02() { + Variable A(0); + Variable B(1); + + Congruence_System cgs; + cgs.insert((A + B %= 0) / 2); + + Grid gr(2); + + print_congruences(gr, "*** gr ***"); + + gr.add_recycled_congruences(cgs); + + Grid known_gr(2); + known_gr.add_congruence((A + B %= 0) / 2); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_recycled_congruences(cgs) ***"); + + return ok; +} + +// add_congruences_and_minimize +bool +test03() { + Variable A(0); + Variable B(1); + + Congruence_System cgs; + cgs.insert((A %= 0) / 2); + cgs.insert(A + B == 0); + + Grid gr(2); + + print_congruences(gr, "*** gr ***"); + + gr.add_congruences_and_minimize(cgs); + + Grid known_gr(2, EMPTY); + known_gr.add_grid_generator(grid_point()); + known_gr.add_grid_generator(grid_point(2*A - 2*B)); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_congruences_and_minimize(cgs) ***"); + + return ok; +} + +// add_recycled_congruences_and_minimize +bool +test04() { + Variable A(0); + Variable B(1); + + Congruence_System cgs; + cgs.insert((B %= 0) / 2); + cgs.insert(A - B == 0); + + Grid gr(2); + + print_congruences(gr, "*** gr ***"); + + gr.add_recycled_congruences_and_minimize(cgs); + + Grid known_gr(2, EMPTY); + known_gr.add_grid_generator(grid_point()); + known_gr.add_grid_generator(grid_point(2*A + 2*B)); + + bool ok = (gr == known_gr); + + print_congruences(gr, + "*** gr.add_recycled_congruences_and_minimize(cgs) ***"); + + return ok; +} + +// add_recycled_congruences(cgs) -- space dimension exception +bool +test05() { + Variable A(0); + Variable B(1); + Variable C(2); + + Congruence_System cgs; + cgs.insert((A + B %= 0) / 2); + + Grid gr(1); + + try { + gr.add_recycled_congruences(cgs); + } + catch (const std::invalid_argument& e) { + nout << "invalid_argument: " << e.what() << endl; + return true; + } + catch (...) { + } + return false; +} + +// 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_and_minimize(cgs) -- space dimension +// exception +bool +test07() { + Variable B(1); + + Congruence_System cgs; + cgs.insert(B == 0); + + Grid gr(1); + + try { + gr.add_recycled_congruences_and_minimize(cgs); + } + catch (const std::invalid_argument& e) { + nout << "invalid_argument: " << e.what() << endl; + return true; + } + catch (...) { + } + return false; +} + +// add_recycled_congruences, empty grid. +bool +test08() { + Variable A(0); + Variable B(1); + + Congruence_System cgs; + cgs.insert((A + B %= 0) / 2); + + Grid gr(2, EMPTY); + + print_congruences(gr, "*** gr ***"); + + gr.add_recycled_congruences(cgs); + + Grid known_gr(2, EMPTY); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** add_recycled_congruences(cgs) ***"); + + return ok; +} + +// add_recycled_congruences_and_minimize, add empty system. +bool +test09() { + Variable A(0); + Variable B(1); + + Grid gr(2, EMPTY); + + print_congruences(gr, "*** gr ***"); + + gr.add_grid_generator(grid_point(3*A + B)); + + Grid known_gr = gr; + + Congruence_System cgs; + + gr.add_recycled_congruences_and_minimize(cgs); + + bool ok = (gr == known_gr); + + print_congruences(gr, + "*** gr.add_recycled_congruences_and_minimize(cgs ***"); + + return ok; +} + +// add_recycled_congruences_and_minimize, add system of single trivial +// congruence to zero dim grid. +bool +test10() { + + Grid gr(0); + + print_congruences(gr, "*** gr ***"); + + Grid known_gr = gr; + + Congruence_System cgs; + cgs.insert(Congruence::zero_dim_integrality()); + + gr.add_recycled_congruences_and_minimize(cgs); + + bool ok = (gr == known_gr); + + print_congruences(gr, + "*** gr.add_recycled_congruences_and_minimize(cgs) ***"); + + return ok; +} + +// add_recycled_congruences_and_minimize, add to empty grid. +bool +test11() { + Variable A(0); + Variable B(1); + + Grid gr(2, EMPTY); + + print_congruences(gr, "*** gr ***"); + + Grid known_gr = gr; + + Congruence_System cgs; + cgs.insert(A + B == 0); + + gr.add_recycled_congruences_and_minimize(cgs); + + bool ok = (gr == known_gr); + + print_congruences(gr, + "*** gr.add_recycled_congruences_and_minimize(cgs) ***"); + + return ok; +} + +// add_recycled_congruences_and_minimize, add empty system to grid +// with minimized generators and up to date congruences. +bool +test12() { + Variable A(0); + + Grid gr(2); + + // Ensure both systems are up to date with only generators minimal. + gr.affine_image(A, 1*A); + gr.minimized_grid_generators(); + + print_congruences(gr, "*** gr ***"); + + Congruence_System cgs; + + gr.add_recycled_congruences_and_minimize(cgs); + + Grid known_gr(2); + + bool ok = (gr == known_gr); + + print_congruences(gr, + "*** gr.add_recycled_congruences_and_minimize(cgs) ***"); + + return ok; +} + +// add_recycled_congruences_and_minimize, add empty system to grid +// with up to date congruences and generators. +bool +test13() { + Variable A(0); + + Grid gr(2); + + // Ensure both systems are just up to date. + gr.affine_image(A, 1*A); + + print_congruences(gr, "*** gr ***"); + + Congruence_System cgs; + + gr.add_recycled_congruences_and_minimize(cgs); + + Grid known_gr(2); + + bool ok = (gr == known_gr); + + print_congruences(gr, + "*** gr.add_recycled_congruences_and_minimize(cgs) ***"); + + return ok; +} + +// add_recycled_congruences_and_minimize, add congruence in 1D to +// universe grid in 2D. +bool +test14() { + Variable A(0); + Variable B(1); + + Grid gr1(2); + + Congruence_System cgs; + cgs.insert((A %= 0) / 7); + + gr1.add_recycled_congruences_and_minimize(cgs); + print_generators(gr1, "*** gr1 ***"); + print_congruences(gr1, "*** gr1 ***"); + + Grid gr2(2); + gr2.add_congruence((A %= 0) / 7); + print_generators(gr2, "*** gr2 ***"); + print_congruences(gr2, "*** gr2 ***"); + + Grid known_gr = gr2; + + bool ok = (gr1 == known_gr); + + print_congruences(gr1, "*** gr2.add_congruence_and_minimize((22*A %= 3) / 7) ***"); + + return ok; +} + +// add_recycled_congruences_and_minimize, add empty system to grid +// with minimized congruences and up to date generators. +bool +test15() { + Variable A(0); + + Grid gr(2); + gr.add_grid_generator(grid_point()); + gr.add_grid_generator_and_minimize(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_and_minimize(cgs); + + Grid known_gr(2); + + bool ok = (gr == known_gr); + + print_congruences(gr, + "*** gr.add_recycled_congruences_and_minimize(cgs) ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); +#ifndef __alpha__ + // Exception handling is broken in GCC on the Alpha. + DO_TEST(test06); +#endif + 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/addconstraint1.cc b/tests/Grid/addconstraint1.cc new file mode 100644 index 0000000..2e6dda5 --- /dev/null +++ b/tests/Grid/addconstraint1.cc @@ -0,0 +1,280 @@ +/* Test adding single constraints to grids. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// add_constraint +bool +test01() { + + Variable A(0); + Variable B(1); + + Grid gr(2); + print_congruences(gr, "*** gr ***"); + + gr.add_constraint(A == 3); + print_congruences(gr, "*** gr.add_constraint(A == 3) ***"); + + 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_constraint_and_minimize -- space dimension exception +bool +test09() { + Variable B(1); + + Grid gr(1); + + try { + gr.add_constraint_and_minimize(B == 0); + } + catch (const std::invalid_argument& e) { + nout << "invalid_argument: " << e.what() << endl; + return true; + } + catch (...) { + } + return false; +} + +// add_constraint_and_minimize -- space dimension exception +bool +test10() { + 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 +test11() { + + 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); + DO_TEST(test10); + DO_TEST(test11); +END_MAIN diff --git a/tests/Grid/addconstraints1.cc b/tests/Grid/addconstraints1.cc new file mode 100644 index 0000000..2ff037e --- /dev/null +++ b/tests/Grid/addconstraints1.cc @@ -0,0 +1,453 @@ +/* Test adding constraints to a grid. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// add_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_constraints_and_minimize(cs) +bool +test07() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + + Constraint_System cs; + cs.insert(D == 0); + cs.insert(2*A == C); + + Grid gr(4); + + print_congruences(gr, "*** gr ***"); + + gr.add_constraints_and_minimize(cs); + + Grid known_gr(4); + known_gr.add_congruence((2*A == C) / 0); + known_gr.add_congruence((D == 0) / 0); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_constraints_and_minimize(cs) ***"); + + return ok; +} + +// add_recycled_constraints +bool +test08() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + + Constraint_System cs; + cs.insert(2*D == 0); + + Grid gr(4); + + print_congruences(gr, "*** gr ***"); + + gr.add_recycled_constraints(cs); + + Grid known_gr(4); + known_gr.add_congruence((D == 0) / 0); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_recycled_constraints(cs) ***"); + + return ok; +} + +// add_recycled_constraints_and_minimize +bool +test09() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + + Constraint_System cs; + cs.insert(2*C == 6*D); + + Grid gr(4); + + print_congruences(gr, "*** gr ***"); + + gr.add_recycled_constraints_and_minimize(cs); + + Grid known_gr(4); + known_gr.add_congruence((C == 3*D) / 0); + + bool ok = (gr == known_gr); + + print_congruences(gr, + "*** gr.add_recycled_constraints_and_minimize(cs) ***"); + + return ok; +} + +// 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; +} + +// add_constraints(cs) -- space dimension exception +bool +test11() { + 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 +test12() { + 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_recycled_constraints_and_minimize(cs) -- space dimension +// exception +bool +test13() { + Variable A(0); + Variable B(1); + + Constraint_System cs; + cs.insert(A + B == 0); + + Grid gr(1); + + try { + gr.add_recycled_constraints_and_minimize(cs); + } + catch (const std::invalid_argument& e) { + nout << "invalid_argument: " << e.what() << endl; + return true; + } + catch (...) { + } + return false; +} + +// add_constraints_and_minimize(cs) -- space dimension exception +bool +test14() { + Variable A(0); + Variable B(1); + + Constraint_System cs; + cs.insert(A + B == 0); + + Grid gr(1); + + try { + gr.add_constraints_and_minimize(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 +test15() { + 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 +test16() { + 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); + DO_TEST(test13); + DO_TEST(test14); + DO_TEST(test15); + DO_TEST(test16); +END_MAIN diff --git a/tests/Grid/addgenerator1.cc b/tests/Grid/addgenerator1.cc new file mode 100644 index 0000000..329e457 --- /dev/null +++ b/tests/Grid/addgenerator1.cc @@ -0,0 +1,358 @@ +/* Test Grid::add_grid_generator*(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +// grid1.cc also tests add_grid_generator_and_minimize. + +// 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_grid_generator_and_minimize +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 + 2*B)); + + print_congruences(gr, "*** gr ***"); + + gr.add_grid_generator(grid_point(8*A + 8*B)); + + gr.add_grid_generator_and_minimize(grid_line(A)); + + Grid known_gr(2); + known_gr.add_congruence((B %= 0) / 2); + + bool ok = (gr == known_gr); + + print_congruences(gr, + "*** gr.add_grid_generator_and_minimize(grid_line(A)) ***"); + + return ok; +} + +// Add a generator to a universe grid. +bool +test07() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + + Grid gr(4); + + print_congruences(gr, "*** gr ***"); + + gr.add_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; +} + +// add_grid_generator_and_minimize, adding a generator with a divisor +// to a grid of many generators. +bool +test08() { + Variable A(0); + Variable B(1); + + Grid gr(2, EMPTY); + + gr.add_grid_generator(grid_point()); + gr.add_grid_generator(grid_point(A)); + + print_congruences(gr, "*** gr ***"); + + // Minimize the grid. + + gr.add_grid_generator_and_minimize(grid_point(B, 3)); + + Grid known_gr(2); + known_gr.add_congruence(A %= 0); + known_gr.add_congruence(3*B %= 0); + + bool ok = (gr == known_gr); + + print_congruences(gr, + "*** gr.add_grid_generator_and_minimize(grid_point(B, 3)) ***"); + + return ok; +} + +// Space dimension exception. +bool +test09() { + Variable A(0); + Variable C(2); + + Grid gr(2); + + try { + gr.add_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 +test10() { + 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 +test11() { + 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 +test12() { + 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 +test13() { + 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 +test14() { + 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); + DO_TEST(test14); +END_MAIN diff --git a/tests/Grid/addgenerators1.cc b/tests/Grid/addgenerators1.cc new file mode 100644 index 0000000..e08ffd2 --- /dev/null +++ b/tests/Grid/addgenerators1.cc @@ -0,0 +1,292 @@ +/* Test methods which can add multiple generators to a grid. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// grid1*.cc use add_grid_generators_and_minimize often. + +// 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_and_minimize -- space dimension exception. +bool +test02() { + Variable A(0); + Variable B(1); + + Grid_Generator_System gs; + gs.insert(grid_point(B)); + + Grid gr(1); + + try { + gr.add_recycled_grid_generators_and_minimize(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 +test03() { + 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 +test04() { + 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 +test05() { + 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_and_minimize -- add to the zero dim grid. +bool +test06() { + Grid_Generator_System gs; + gs.insert(grid_point()); + + Grid gr(0, EMPTY); + gr.add_recycled_grid_generators_and_minimize(gs); + + print_generators(gr, "*** gr ***"); + + Grid known_gr(0); + + bool ok = (gr == known_gr); + + print_congruences(gr, + "*** gr.add_recycled_grid_generators_and_minimize(gs) ***"); + + return ok; +} + +// add_recycled_grid_generators_and_minimize -- try add system with a +// single parameter generator to the empty grid. +bool +test07() { + Variable A(0); + + Grid_Generator_System gs; + gs.insert(parameter(A)); + + Grid gr(2, EMPTY); + + try { + gr.add_recycled_grid_generators_and_minimize(gs); + } + catch (const std::invalid_argument& e) { + nout << "invalid_argument: " << e.what() << endl; + return true; + } + catch (...) { + } + return false; +} + +// add_recycled_grid_generators_and_minimize -- add an empty system. +bool +test08() { + 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_and_minimize(gs); + + bool ok = (gr == known_gr); + + print_generators(gr, + "*** gr.add_recycled_grid_generators_and_minimize(gs) ***"); + + return ok; +} + +// add_grid_generators -- add a zero dimension universe system. +bool +test09() { + 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 +test10() { + 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_and_minimize -- add to a zero +// dimension universe grid. +bool +test11() { + Grid gr(0); + + Grid_Generator_System gs2(grid_point()); + + gr.add_recycled_grid_generators_and_minimize(gs2); + + print_generators(gr, "*** gr ***"); + + Grid known_gr(0); + + bool ok = (gr == known_gr); + + print_generators(gr, "*** gr.add_grid_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); +END_MAIN diff --git a/tests/Grid/addspacedims1.cc b/tests/Grid/addspacedims1.cc new file mode 100644 index 0000000..69b33e5 --- /dev/null +++ b/tests/Grid/addspacedims1.cc @@ -0,0 +1,531 @@ +/* Test Grid::add_space_dimensions_and_embed(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +// From congruences, adding to both congruences and generators. +bool +test01() { + Variable A(0); + Variable C(2); + Variable E(4); + + Congruence_System cgs; + cgs.insert((A + 0*C %= 0) / 2); + + Grid gr(cgs); + + print_congruences(gr, "*** gr ***"); + + gr.add_space_dimensions_and_embed(2); + + Congruence_System known_cgs; + known_cgs.insert((A + 0*E %= 0) / 2); + + Grid known_gr(known_cgs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** 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..4964ac9 --- /dev/null +++ b/tests/Grid/affinedim1.cc @@ -0,0 +1,321 @@ +/* Test Grid::affine_dimension(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Empty. +bool +test01() { + Grid gr(7, EMPTY); + + bool ok = (gr.affine_dimension() == 0); + + print_congruences(gr, "*** gr**"); + + return ok; +} + +// Zero dimension empty. +bool +test02() { + Grid gr(0, EMPTY); + + bool ok = (gr.affine_dimension() == 0); + + print_congruences(gr, "*** gr**"); + + return ok; +} + +// Zero dimension universe. +bool +test03() { + Grid gr(0); + + bool ok = (gr.affine_dimension() == 0); + + print_congruences(gr, "*** gr**"); + + return ok; +} + +// Point. +bool +test04() { + Variable A(0); + Variable B(1); + + Grid gr_gs_min(2, EMPTY); + gr_gs_min.add_grid_generator_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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..8e5139f --- /dev/null +++ b/tests/Grid/affineimage1.cc @@ -0,0 +1,389 @@ +/* Test Grid::affine_image(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Variable to be updated does not occur in expression. +bool +test01() { + Variable A(0); + Variable B(1); + Variable C(2); + + Grid gr(3); + gr.add_congruence((C == -2) / 0); + gr.add_congruence((A == 0) / 0); + + print_congruences(gr, "*** gr ***"); + + gr.affine_image(B, A + 2, 1); + + Grid known_gr(3, EMPTY); + known_gr.add_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..72a8e48 --- /dev/null +++ b/tests/Grid/affineimage2.cc @@ -0,0 +1,397 @@ +/* Test Grid::affine_image(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Denominator, with generators having a variety of divisors. +bool +test01() { + Variable A(0); + Variable B(1); + + Grid_Generator_System gs; + gs.insert(grid_point()); + gs.insert(grid_point(A, 3)); + gs.insert(grid_point(B, 2)); + + // The divisors are normalized on construction. + Grid gr(gs); + + print_generators(gr, "*** gr ***"); + + // All divisors should change, even when the coefficient of A is 0. + gr.affine_image(A, 2*A, 5); + + Grid known_gr(2, EMPTY); + known_gr.add_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_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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_F16A(test10); + DO_TEST_F16(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..d838380 --- /dev/null +++ b/tests/Grid/affinepreimage1.cc @@ -0,0 +1,428 @@ +/* Test Grid::affine_preimage(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +using namespace Parma_Polyhedra_Library::IO_Operators; + +namespace { + +// The first twelve tests mirror those in affineimage1.cc. + +// Grid defined by generators. +bool +test01() { + Variable A(0); + Variable B(1); + Variable C(2); + + Grid gr(3, EMPTY); + gr.add_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..3d94ef9 --- /dev/null +++ b/tests/Grid/affinepreimage2.cc @@ -0,0 +1,362 @@ +/* Test Grid::affine_preimage(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Denominator, with generators having a variety of divisors. +bool +test01() { + Variable A(0); + Variable B(1); + + Grid_Generator_System gs; + gs.insert(grid_point()); + gs.insert(grid_point(2*A, 15)); + gs.insert(grid_point(5*B, 10)); + + // The divisors are normalized on construction. + Grid gr(gs); + + print_generators(gr, "*** gr ***"); + + // All divisors should change, even when the coefficient of A is 0. + gr.affine_preimage(A, 2*A, 5); + + Grid known_gr(2, EMPTY); + known_gr.add_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..651e3ab --- /dev/null +++ b/tests/Grid/approximatepartition1.cc @@ -0,0 +1,101 @@ +/* Test approximate_partition(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +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 > + 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 > + 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::iterator i = (result.second).begin(); + return (i->element() == 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..ab7da3c --- /dev/null +++ b/tests/Grid/asciidumpload1.cc @@ -0,0 +1,632 @@ +/* Test Grid::ascii_dump() and Grid::ascii_load(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +#include "files.hh" +#include +#include +#include + +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..2d73426 --- /dev/null +++ b/tests/Grid/asciidumpload2.cc @@ -0,0 +1,494 @@ +/* Test Grid::ascii_dump() and Grid::ascii_load(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +#include "files.hh" +#include +#include + +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_load1.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_load1.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_load1.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_load1.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_load1.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_load1.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_load1.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_load1.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_load1.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_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); + Grid gr2; + bool ok =! gr2.ascii_load(f); + close(f); + + return ok; +} + +bool +test11() { + 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); + Grid gr2; + bool ok =! gr2.ascii_load(f); + close(f); + + return ok; +} + +bool +test12() { + 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); + Grid gr2; + bool ok =! gr2.ascii_load(f); + close(f); + + return ok; +} + +bool +test13() { + 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); + 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_load1.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..159e0c7 --- /dev/null +++ b/tests/Grid/asciidumpload3.cc @@ -0,0 +1,123 @@ +/* Test Congruence::ascii_dump() and Congruence::ascii_load(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +#include "files.hh" +#include +#include + +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..9f08ceb --- /dev/null +++ b/tests/Grid/asciidumpload4.cc @@ -0,0 +1,144 @@ +/* Test Congruence_System ascii_dump() and ascii_load(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +#include "files.hh" +#include +#include + +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..300241d --- /dev/null +++ b/tests/Grid/asciidumpload5.cc @@ -0,0 +1,154 @@ +/* Test Grid_Generator ascii_dump() and ascii_load(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +#include "files.hh" +#include +#include + +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..22e581e --- /dev/null +++ b/tests/Grid/asciidumpload6.cc @@ -0,0 +1,144 @@ +/* Test Generator_System ascii_dump() and ascii_load(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +#include "files.hh" +#include +#include + +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..602ae7a --- /dev/null +++ b/tests/Grid/bhz03widening1.cc @@ -0,0 +1,112 @@ +/* Test Pointset_Powerset::BHZ03_widening_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +using namespace Parma_Polyhedra_Library::IO_Operators; + +typedef Pointset_Powerset 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(grs1, "*** grs1 ***"); + + GSet grs2(2, EMPTY); + Grid gr2(2); + gr2.add_congruence(A %= 0); + grs2.add_disjunct(gr2); + + print_congruences(grs2, "*** grs2 ***"); + + GSet known_grs = grs2; + + grs2.BHZ03_widening_assign + (grs1, widen_fun_ref(&Grid::widening_assign)); + + bool ok = (grs2 == known_grs); + + print_congruences(grs1, "*** grs2.BHZ03_widening_assign(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(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(grs2, "*** grs2 ***"); + + Grid known_gr = gr3; + known_gr.upper_bound_assign(gr4); + + grs2.BHZ03_widening_assign + (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(grs1, "*** grs2.BHZ03_widening_assign(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..d4e315a --- /dev/null +++ b/tests/Grid/bounded1.cc @@ -0,0 +1,391 @@ +/* Test Grid::is_bounded(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Empty. +bool +test01() { + Grid gr(7, EMPTY); + + bool ok = (gr.is_bounded()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Zero dimension empty. +bool +test02() { + Grid gr(0, EMPTY); + + bool ok = (gr.is_bounded()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Zero dimension universe. +bool +test03() { + Grid gr(0); + + bool ok = (gr.is_bounded()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Point. +bool +test04() { + Variable A(0); + Variable B(1); + + Grid gr_gs_min(2, EMPTY); + gr_gs_min.add_grid_generator_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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..60176a3 --- /dev/null +++ b/tests/Grid/boundedaffineimage1.cc @@ -0,0 +1,184 @@ +/* Test Grid::bounded_affine_image(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// 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..2ee6ecc --- /dev/null +++ b/tests/Grid/boundedaffinepreimage1.cc @@ -0,0 +1,184 @@ +/* Test Grid::bounded_affine_image(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// 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..2b6fb01 --- /dev/null +++ b/tests/Grid/bounds1.cc @@ -0,0 +1,458 @@ +/* Test Grid::bounds_from_above() and Grid::bounds_from_below(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Empty. +bool +test01() { + Grid gr(7, EMPTY); + + bool ok = (gr.bounds_from_above(Linear_Expression(0)) + && gr.bounds_from_below(Linear_Expression(0))); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Zero dimension empty. +bool +test02() { + Grid gr(0, EMPTY); + + bool ok = (gr.bounds_from_above(Linear_Expression(3)) + && gr.bounds_from_below(Linear_Expression(3))); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Zero dimension universe. +bool +test03() { + Grid gr(0); + + bool ok = (gr.bounds_from_above(Linear_Expression(1)) + && gr.bounds_from_below(Linear_Expression(1))); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Point. +bool +test04() { + Variable A(0); + Variable B(1); + + Grid gr_gs_min(2, EMPTY); + gr_gs_min.add_grid_generator_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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..73aa9d1 --- /dev/null +++ b/tests/Grid/certificate1.cc @@ -0,0 +1,228 @@ +/* Test class Grid_Certificate. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +using namespace Parma_Polyhedra_Library::IO_Operators; + +namespace { + +// Compare a grid to one that is more constrained (due to equalities). +bool +test01() { + Variable A(0); + Variable B(1); + Variable C(2); + + Grid gr1(3); + gr1.add_congruence(A + C %= 0); + gr1.add_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_and_minimize(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..e0a4cf1 --- /dev/null +++ b/tests/Grid/concatenate1.cc @@ -0,0 +1,340 @@ +/* Test Grid::concatenate_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// From congruences. +bool +test01() { + Variable B(1); + Variable A(0); + + Congruence_System cgs; + cgs.insert((A %= 0) / 2); + + Grid gr1(cgs); + + print_congruences(gr1, "*** gr1 ***"); + + cgs.clear(); + cgs.insert((A %= 1) / 2); + + Grid gr2(cgs); + + print_congruences(gr2, "*** gr2 ***"); + + gr1.concatenate_assign(gr2); + + Congruence_System known_cgs; + known_cgs.insert((A %= 0) / 2); + known_cgs.insert((B %= 1) / 2); + + Grid known_gr(known_cgs); + + bool ok = (gr1 == known_gr); + + print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***"); + + return ok; +} + +// First grid empty. +bool +test02() { + Variable A(0); + Variable C(2); + + Grid gr1(2, EMPTY); + + print_congruences(gr1, "*** gr1 ***"); + + Congruence_System cgs; + cgs.insert((A + 0*C %= 0) / 2); + + Grid gr2(cgs); + + print_congruences(gr2, "*** gr2 ***"); + + gr1.concatenate_assign(gr2); + + Grid known_gr(5, EMPTY); + + bool ok = (gr1 == known_gr); + + print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***"); + + return ok; +} + +// Second grid empty. +bool +test03() { + Variable A(0); + Variable C(2); + + Congruence_System cgs; + cgs.insert((A + 0*C %= 0) / 2); + + Grid gr1(cgs); + + print_congruences(gr1, "*** gr1 ***"); + + Grid gr2(2, EMPTY); + + print_congruences(gr2, "*** gr2 ***"); + + gr1.concatenate_assign(gr2); + + Grid known_gr(5, EMPTY); + + bool ok = (gr1 == known_gr); + + print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***"); + + return ok; +} + +// First grid a universe. +bool +test04() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + + Grid gr1(1, UNIVERSE); + + Grid_Generator_System gs; + gs.insert(grid_point(A)); + gs.insert(grid_point(A + C)); + + print_generators(gr1, "*** gr1 ***"); + + Grid gr2(gs); + + print_generators(gr2, "*** gr2 ***"); + + gr1.concatenate_assign(gr2); + + Grid_Generator_System known_gs; + known_gs.insert(grid_point(B)); + known_gs.insert(grid_point(B + D)); + known_gs.insert(grid_line(A)); + + Grid known_gr(known_gs); + + bool ok = (gr1 == known_gr); + + print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***"); + + return ok; +} + +// From generators. +bool +test05() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + Variable E(4); + + Grid_Generator_System gs; + gs.insert(grid_point(A)); + gs.insert(grid_point(A + C)); + + Grid gr1(gs); + + print_generators(gr1, "*** gr1 ***"); + + gs.clear(); + gs.insert(grid_point(0*B)); + gs.insert(grid_point(B)); + + Grid gr2(gs); + + print_generators(gr2, "*** gr2 ***"); + + gr1.concatenate_assign(gr2); + + Congruence_System known_cgs; + known_cgs.insert((A == 1) / 0); + known_cgs.insert((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..d95869d --- /dev/null +++ b/tests/Grid/congruence1.cc @@ -0,0 +1,458 @@ +/* Test class Congruence. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +class Test_Congruence : public Congruence { +public: + Test_Congruence(Congruence cg) : Congruence(cg) {} + Test_Congruence(Constraint c) : Congruence(c) {} + void strong_normalize() { Congruence::strong_normalize(); } + void normalize() { Congruence::normalize(); } +}; + +// Negative inhomogeneous term. +static bool +test01() { + Variable A(0); + Variable B(1); + Variable C(2); + + Test_Congruence a((A + 2*B + 3*C %= 5) / 7); + a.strong_normalize(); + + Test_Congruence b((A %= 5 - 3*C - 2*B) / 7); + b.strong_normalize(); + + bool ok = (a == b); + + print_congruence(a, "*** a ***"); + print_congruence(b, "*** b ***"); + + return ok; +} + +// Positive inhomogeneous term. +static bool +test02() { + Variable A(0); + Variable B(1); + Variable C(2); + + Test_Congruence a((A + 2*B + 3*C %= -5) / 7); + a.strong_normalize(); + + Test_Congruence b((A %= -5 - 3*C - 2*B) / 7); + b.strong_normalize(); + + bool ok = (a == b); + + print_congruence(a, "*** a ***"); + print_congruence(b, "*** b ***"); + + return ok; +} + +// Common factors and reducible positive inhomogeneous term. +static bool +test03() { + Variable A(0); + Variable B(1); + Variable C(2); + + Test_Congruence a((16*A + 2*B + 8*C + 64 %= 0) / 4); + a.strong_normalize(); + + Test_Congruence b((16*A + 2*B %= - 64 - 8*C) / 4); + b.strong_normalize(); + + bool ok = (a == b); + + print_congruence(a, "*** a ***"); + print_congruence(b, "*** b ***"); + + return ok; +} + +// Negative first coefficient. +static bool +test04() { + Variable A(0); + Variable B(1); + Variable C(2); + + Test_Congruence a((- A + 2*B + 3*C %= 5) / 7); + a.strong_normalize(); + + Test_Congruence b((- A %= - 2*B + 5 - 3*C) / 7); + b.strong_normalize(); + + bool ok = (a == b); + + print_congruence(a, "*** a ***"); + print_congruence(b, "*** b ***"); + + return ok; +} + +// Constructed with only the %= operator. +static bool +test05() { + Variable A(0); + Variable B(1); + Variable C(2); + + Test_Congruence c(A + 4*B + 3*C %= 5); + Test_Congruence a(c); + //Test_Congruence a = (A + 4*B + 3*C %= 5); + //Test_Congruence a(A + 4*B + 3*C %= 5); + a.strong_normalize(); + + Test_Congruence b(A + 4*B %= 5 - 3*C); + b.strong_normalize(); + + bool ok = (a == b); + + print_congruence(a, "*** a ***"); + print_congruence(b, "*** b ***"); + + return ok; +} + +// Equality congruence (a modulus of 0). +static bool +test06() { + Variable A(0); + Variable B(1); + Variable C(2); + + Test_Congruence a((3*A + 24*B + 3*C %= -19) / 0); + a.strong_normalize(); + + Test_Congruence b((3*A + 24*B %= -19 - 3*C) / 0); + b.strong_normalize(); + + bool ok = (a == b); + + print_congruence(a, "*** a ***"); + print_congruence(b, "*** b ***"); + + return ok; +} + +// Constructed from a Constraint with the `/' operator. +static bool +test07() { + Variable A(0); + Variable B(1); + Variable C(2); + + Test_Congruence a((A + 4*B + 3*C == 17) / 3); + a.strong_normalize(); + + Test_Congruence b((A + 4*B == 17 - 3*C) / 3); + b.strong_normalize(); + + bool ok = (a == b); + + print_congruence(a, "*** a ***"); + print_congruence(b, "*** b ***"); + + return ok; +} + +// Constructed from a Constraint. +static bool +test08() { + Variable A(0); + Variable B(1); + Variable C(2); + + Test_Congruence a(A + 4*B + 3*C == 17); + a.strong_normalize(); + + Test_Congruence b(A + 4*B == 17 - 3*C); + b.strong_normalize(); + + bool ok = (a == b); + + print_congruence(a, "*** a ***"); + print_congruence(b, "*** b ***"); + + return ok; +} + +// Set modulus with `/='. +static bool +test09() { + Variable A(0); + Variable B(1); + Variable C(2); + + Test_Congruence a(A + 4*B + 3*C == 17); + a /= 3; + a.strong_normalize(); + + Test_Congruence b(A + 4*B == 17 - 3*C); + b /= 3; + b.strong_normalize(); + + bool ok = (a == b); + + print_congruence(a, "*** a ***"); + print_congruence(b, "*** b ***"); + + return ok; +} + +// is_tautological and is_inconsistent. +static bool +test10() { + Variable A(0); + Variable B(1); + Variable C(2); + + Test_Congruence a(0*A + 0*B + 0*C %= 17); + + bool ok = (a.is_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. +static bool +test11() { + Variable A(0); + Variable B(1); + Variable C(2); + + Test_Congruence a((A + 4*B + 3*C %= -4) / -3); + a.strong_normalize(); + + Test_Congruence b((A + 4*B %= -1 - 3*C) / -3); + b.strong_normalize(); + + bool ok = (a == b); + + print_congruence(a, "*** a ***"); + print_congruence(b, "*** b ***"); + + return ok; +} + +// Negative modulus and negative first coefficient. +static bool +test12() { + Variable 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. +static bool +test13() { + Linear_Expression le; + Test_Congruence a(le %= le); + a.strong_normalize(); + + Test_Congruence b(le %= 0); + b.strong_normalize(); + + bool ok = (a == b); + + print_congruence(a, "*** a ***"); + print_congruence(b, "*** b ***"); + + return ok; +} + +// Linear expressions on both sides. +static 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. +static 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. +static 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. +static 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..e930b73 --- /dev/null +++ b/tests/Grid/congruences1.cc @@ -0,0 +1,402 @@ +/* Test Grid::congruences(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Empty grid. +bool +test01() { + Grid gr1(7, EMPTY); + + Grid known_gr = gr1; + + Congruence_System cgs = gr1.congruences(); + + Grid gr2(cgs); + + bool ok = (gr2 == known_gr); + + print_congruences(cgs, "*** cgs ***"); + print_congruences(gr2, "*** gr2(cgs) ***"); + + return ok; +} + +// Universe grid. +bool +test02() { + Grid gr1(7); + + Grid known_gr = gr1; + + Congruence_System cgs = gr1.congruences(); + + print_congruences(cgs, "*** cgs ***"); + + Grid gr2(cgs); + + bool ok = (gr2 == known_gr); + + print_congruences(gr2, "*** gr2(cgs) ***"); + + return ok; +} + +// Zero dimension empty grid. +bool +test03() { + Grid gr1(0, EMPTY); + + Grid known_gr = gr1; + + Congruence_System cgs = gr1.congruences(); + + Grid gr2(cgs); + + bool ok = (gr2 == known_gr); + + print_congruences(cgs, "*** cgs ***"); + print_congruences(gr2, "*** gr2(cgs) ***"); + + return ok; +} + +// Zero dimension universe grid. +bool +test04() { + Grid gr1(0); + + Grid known_gr = gr1; + + Congruence_System cgs = gr1.congruences(); + + Grid gr2(cgs); + + bool ok = (gr2 == known_gr); + + print_congruences(cgs, "*** cgs ***"); + print_congruences(gr2, "*** gr2(cgs) ***"); + + return ok; +} + +// Skew grid in 3D. +bool +test05() { + Variable A(0); + Variable B(1); + + Grid gr1(3); + gr1.add_congruence((A + B %= 3) / 7); + gr1.add_congruence((A %= 0) / 5); + + Grid known_gr = gr1; + + Congruence_System cgs = gr1.congruences(); + + Grid gr2(cgs); + + bool ok = (gr2 == known_gr); + + print_congruences(cgs, "*** cgs ***"); + print_congruences(gr2, "*** gr2(cgs) ***"); + + return ok; +} + +// 3D rectilinear grid defined by generators. +bool +test06() { + Variable A(0); + Variable B(1); + + Grid gr1(3); + gr1.add_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_and_minimize(Congruence::zero_dim_false()); + + Grid known_gr = gr1; + + Grid gr2(cgs); + + bool ok = (gr2 == known_gr); + + print_congruences(cgs, "*** cgs ***"); + print_congruences(gr2, "*** gr2(cgs) ***"); + + return ok; +} + +// 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.recycling_insert(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; +} + +// 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..9c5a6a0 --- /dev/null +++ b/tests/Grid/congruences2.cc @@ -0,0 +1,336 @@ +/* Test Congruence_System::satisfies_all_congruences(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +using namespace Parma_Polyhedra_Library::IO_Operators; + +namespace { + +class Test_Congruence_System : public Congruence_System { +public: + Test_Congruence_System() : Congruence_System() {} + Test_Congruence_System(Congruence_System cgs) : Congruence_System(cgs) {} + Test_Congruence_System(Congruence cg) : Congruence_System(cg) {} + bool + satisfies_all_congruences(const Grid_Generator& g) const { + return Congruence_System::satisfies_all_congruences(g); + } +}; + +// Public constructors. +bool +test01() { + Test_Congruence_System cgs0; + + print_congruences(cgs0, "*** cgs0 ***"); + + Test_Congruence_System cgs1(cgs0); + + bool ok = (cgs1 == cgs0); + + print_congruences(cgs1, "*** cgs1(cgs0) ***"); + + if (ok) { + Variable A(0); + Variable B(1); + + Test_Congruence_System cgs2((A - 3*B %= 5) / 2); + + ok &= !(cgs2 == cgs0) && !(cgs2 == cgs1); + + print_congruences(cgs2, "*** cgs2((A - 3*B %= 5) / 2) ***"); + }; + + return ok; +} + +// operator= +bool +test02() { + Variable A(0); + Variable B(1); + Variable C(2); + + Test_Congruence_System cgs0; + + Test_Congruence_System cgs1((A - 3*B + 21*C %= 5) / 2); + + cgs0 = cgs1; + + bool ok = (cgs0 == cgs1); + + print_congruences(cgs0, "*** cgs0 ***"); + + return ok; +} + +// space_dimension +bool +test03() { + Variable A(3); + Variable B(7); + Variable C(4); + + Test_Congruence_System cgs0((A - 3*B + 21*C %= 55) / 21); + + bool ok = (cgs0.space_dimension() == 8); + + print_congruences(cgs0, "*** cgs0((A - 3*B + 21*C %= 55) / 21) ***"); + + return ok; +} + +// clear +bool +test04() { + Variable A(0); + Variable B(1); + + Test_Congruence_System cgs0((A - 3*B %= 5) / 7); + + print_congruences(cgs0, "*** cgs0 ***"); + + cgs0.clear(); + + bool ok = (cgs0.space_dimension() == 0); + + print_congruences(cgs0, "*** cgs0.clear() ***"); + + return ok; +} + +// insert +bool +test05() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + + Test_Congruence_System cgs0((A - 3*B + C - 18*D %= 5) / 7); + cgs0.insert((A %= 0) / 3); + cgs0.insert((A + B %= 3) / 5); + + dimension_type tem = cgs0.num_proper_congruences(); + bool ok = (tem == 3); + + print_congruences(cgs0, "*** cgs0.insert ***"); + + return ok; +} + +// num_[non_]equalities +bool +test06() { + Variable A(0); + Variable B(1); + Variable C(2); + + Test_Congruence_System cgs0((-A - B + 13*C %= 6) / 7); + cgs0.insert((A %= 0) / 0); + cgs0.insert((A + B %= 3) / 0); + + dimension_type neqs = cgs0.num_equalities(); + dimension_type npcgs = cgs0.num_proper_congruences(); + bool ok = (neqs == 2 && npcgs == 1); + + print_congruences(cgs0, "*** cgs0.insert ***"); + + return ok; +} + +// insert, including a row with all terms zero and an equality. +bool +test07() { + Variable A(0); + Variable B(1); + Variable C(2); + + Test_Congruence_System cgs0(0*A + 0*B %= -1); + cgs0.insert((A + 0*B %= 1) / 0); + cgs0.insert(0*A + 1*B %= 1); + + dimension_type neqs = cgs0.num_equalities(); + dimension_type npcgs = cgs0.num_proper_congruences(); + bool ok = (neqs == 1 && npcgs == 2); + + print_congruences(cgs0, "*** cgs0.insert ***"); + + return ok; +} + +/* If 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..886ab4f --- /dev/null +++ b/tests/Grid/constraints1.cc @@ -0,0 +1,353 @@ +/* Test Grid::congruences(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Empty grid. +bool +test01() { + Grid gr1(7, EMPTY); + + Grid known_gr = gr1; + + 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..f242c57 --- /dev/null +++ b/tests/Grid/contains1.cc @@ -0,0 +1,213 @@ +/* Test Grid::contains(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Grid of points containing empty grid. +bool +test01() { + Variable A(0); + + Grid_Generator_System gs; + gs.insert(grid_point(A)); + + Grid gr1(gs); + + Grid gr2(1, EMPTY); + + bool ok = (gr1.contains(gr2)); + + print_generators(gr1, "*** gr1 ***"); + print_generators(gr2, "*** gr2 ***"); + + return ok; +} + +// Empty grid and grid of points. +bool +test02() { + Variable B(1); + + Grid gr1(2, EMPTY); + + Grid_Generator_System gs; + gs.insert(grid_point()); + gs.insert(grid_point(B)); + + Grid gr2(gs); + + bool ok = (!gr1.contains(gr2)); + + print_generators(gr1, "*** gr1 ***"); + print_generators(gr2, "*** gr2 ***"); + + return ok; +} + +// Both empty. +bool +test03() { + Grid gr1(4, EMPTY); + + Grid gr2(4, EMPTY); + + bool ok = (gr1.contains(gr2)); + + print_generators(gr1, "*** gr1 ***"); + print_generators(gr2, "*** gr2 ***"); + + return ok; +} + +// Zero dimension universes. +bool +test04() { + Grid gr1(0); + + Grid gr2(0); + + bool ok = (gr1.contains(gr2)); + + print_congruences(gr1, "*** gr1 ***"); + print_congruences(gr2, "*** gr2 ***"); + + return ok; +} + +// Self containment. +bool +test05() { + Variable A(0); + Variable B(1); + Variable C(2); + + Grid gr(3); + gr.add_congruence(A - B %= 0); + gr.add_congruence(C %= 0); + + bool ok = (gr.contains(gr)); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// A grid strictly containing another. +bool +test06() { + Variable A(0); + Variable B(1); + Variable C(2); + + Grid gr1(3); + gr1.add_congruence(A - B %= 0); + gr1.add_congruence(C %= 0); + + Grid gr2(3, EMPTY); + gr2.add_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..1d5d6c7 --- /dev/null +++ b/tests/Grid/containsintegerpoint1.cc @@ -0,0 +1,289 @@ +/* Test Grid::contains_integer_point(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include + +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_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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/coveringbox1.cc b/tests/Grid/coveringbox1.cc new file mode 100644 index 0000000..9a6199b --- /dev/null +++ b/tests/Grid/coveringbox1.cc @@ -0,0 +1,346 @@ +/* Test Grid(Box& box, From_Covering_Box()). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +// This constructor is also tested via coveringbox2.cc. + +#include "ppl_test.hh" + +namespace { + +#define SPACE_DIM 2 + +// Universe box. +bool +test01() { + Rational_Box box(SPACE_DIM); + + Grid gr(box, From_Covering_Box()); + + Grid known_gr(SPACE_DIM, EMPTY); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr(box, From_Covering_Box()) ***"); + + return ok; +} + +// The box is the positive quadrant. +bool +test02() { + Variable A(0); + Variable B(1); + + Rational_Box box(SPACE_DIM); + box.add_constraint(A >= 0); + box.add_constraint(B >= 0); + + Grid gr(box, From_Covering_Box()); + + Grid known_gr(SPACE_DIM); + known_gr.add_constraint(A == 0); + known_gr.add_constraint(B == 0); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr(box, From_Covering_Box()) ***"); + + return ok; +} + +// A bounded box in 2D. +bool +test03() { + Variable A(0); + Variable B(1); + + Rational_Box box(SPACE_DIM); + box.add_constraint(3*A >= -2); + box.add_constraint(A <= 4); + box.add_constraint(B >= -10); + box.add_constraint(3*B <= 12); + + Grid gr(box, From_Covering_Box()); + + Grid known_gr(SPACE_DIM); + known_gr.add_congruence((3*A %= -2) / 14); + known_gr.add_congruence((B %= -10) / 14); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr(box, From_Covering_Box()) ***"); + + return ok; +} + +// A 3D box which is bounded in 2D. +bool +test04() { + Variable A(0); + Variable B(1); + Variable C(2); + + Rational_Box box(3); + box.add_constraint(3*A >= -2); + box.add_constraint(A <= 4); + box.add_constraint(B >= -10); + box.add_constraint(3*B <= 12); + box.add_constraint(3*C >= 15); + + Grid gr(box, From_Covering_Box()); + + Grid known_gr(3, EMPTY); + known_gr.add_grid_generator(grid_point(-2*A - 30*B + 15*C, 3)); + known_gr.add_grid_generator(grid_point(4*A - 10*B + 5*C)); + known_gr.add_grid_generator(grid_point(-2*A + 12*B + 15*C, 3)); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr(box, From_Covering_Box()) ***"); + + return ok; +} + +// Zero-dimensional box. +bool +test05() { + Rational_Box box(0); + + Grid gr(box, From_Covering_Box()); + + Grid known_gr; + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr(box, From_Covering_Box()) ***"); + + return ok; +} + +// Empty box in 2D. +bool +test06() { + Rational_Box box(2); + box.set_empty(); + + Grid gr(box, From_Covering_Box()); + + Grid known_gr(2, EMPTY); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr(box, From_Covering_Box()) ***"); + + return ok; +} + +// A box which is a point. +bool +test07() { + Variable A(0); + Variable B(1); + + Rational_Box box(2); + box.add_constraint(A == 2); + box.add_constraint(B == 4); + + Grid gr(box, From_Covering_Box()); + + Grid known_gr(2); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr(box, From_Covering_Box()) ***"); + + return ok; +} + +// Unit square. +bool +test08() { + Variable A(0); + Variable B(1); + + Rational_Box box(2); + box.add_constraint(A >= 0); + box.add_constraint(B >= 0); + box.add_constraint(A <= 1); + box.add_constraint(B <= 1); + + Grid gr(box, From_Covering_Box()); + + Congruence_System known_cgs; + known_cgs.insert(A %= 0); + known_cgs.insert(B %= 0); + + Grid known_gr(known_cgs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr(box, From_Covering_Box()) ***"); + + return ok; +} + +// Simple box with divisor. +bool +test09() { + Variable A(0); + Variable B(1); + + Rational_Box box(2); + box.add_constraint(A >= 0); + box.add_constraint(B >= 0); + box.add_constraint(2*B <= 1); + + Grid gr(box, From_Covering_Box()); + + Grid known_gr(2); + known_gr.add_constraint(A == 0); + known_gr.add_congruence(2*B %= 0); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr(box, From_Covering_Box()) ***"); + + return ok; +} + +// Box with a dimension bounded only from above. +bool +test10() { + Variable A(0); + Variable B(1); + + Rational_Box box(2); + box.add_constraint(7*A <= 3); + box.add_constraint(B >= 0); + box.add_constraint(2*B <= 1); + + Grid gr(box, From_Covering_Box()); + + Grid known_gr(2); + known_gr.add_constraint(7*A == 3); + known_gr.add_congruence(2*B %= 0); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr(box, From_Covering_Box()) ***"); + + return ok; +} + +// Box with a dimension having an open bound, where the open bound +// makes the box empty. +bool +test11() { + Variable A(0); + Variable B(1); + + Rational_Box box(2); + box.add_constraint(7*A <= 3); + box.add_constraint(B >= 0); + box.add_constraint(2*B < 1); + box.add_constraint(2*B >= 1); + + try { + Grid gr(box, From_Covering_Box()); + } + catch (const std::invalid_argument& e) { + nout << "invalid_argument: " << e.what() << endl; + return true; + } + catch (...) { + } + return false; +} + +// Zero-dimensional empty box. +bool +test12() { + Rational_Box box(0); + box.set_empty(); + + Grid gr(box, From_Covering_Box()); + + Grid known_gr(0, EMPTY); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr(box, From_Covering_Box()) ***"); + + return ok; +} + +// 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(A <= 5); + box.add_constraint(4*B >= -11); + box.add_constraint(3*B <= 12); + box.add_constraint(3*C >= 15); + box.add_constraint(3*D <= 18); + box.add_constraint(7*E >= 15); + box.add_constraint(7*F >= -15); + box.add_constraint(7*F <= 15); + + Grid gr(box, From_Covering_Box()); + + Grid known_gr(6, EMPTY); + known_gr.add_grid_generator(grid_point(-56*A - 231*B + 420*C + 504*D + 180*E - 180*F, 84)); + known_gr.add_grid_generator(parameter(17*A, 3)); + known_gr.add_grid_generator(parameter(81*B, 12)); + known_gr.add_grid_generator(parameter(30*F, 7)); + + bool ok = (gr == known_gr); + + print_generators(gr, "*** gr(box, From_Covering_Box()) ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + DO_TEST(test06); + DO_TEST(test07); + DO_TEST(test08); + DO_TEST(test09); + DO_TEST(test10); + DO_TEST(test11); + DO_TEST(test12); + DO_TEST_F16(test13); +END_MAIN diff --git a/tests/Grid/coveringbox2.cc b/tests/Grid/coveringbox2.cc new file mode 100644 index 0000000..02179ce --- /dev/null +++ b/tests/Grid/coveringbox2.cc @@ -0,0 +1,846 @@ + /* Test Grid::get_covering_box(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +using namespace Parma_Polyhedra_Library::IO_Operators; + +namespace { + +#define SPACE_DIM 2 + +// Rectilinear grid defined by points with the origin +// not a point of the grid or a point of the covering box.. +bool +test01() { + Variable A(0); + Variable B(1); + + Rational_Box box1(SPACE_DIM); + + Grid gr(SPACE_DIM, 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)); + + gr.get_covering_box(box1); + + Rational_Box known_box(SPACE_DIM); + known_box.add_constraint(A >= 0); + known_box.add_constraint(A <= 3); + known_box.add_constraint(B >= 1); + known_box.add_constraint(B <= 3); + + bool ok = (box1 == known_box); + + print_generators(gr, "*** gr ***"); + nout << "box1:" << endl << box1; + + if (ok) { + Grid tem_gr(box1, From_Covering_Box()); + Rational_Box box2(SPACE_DIM); + tem_gr.get_covering_box(box2); + + ok = (box2 == known_box); + + nout << "box2:" << endl << box2; + } + + return ok; +} + +// Skew grid. +bool +test02() { + Variable A(0); + Variable B(1); + + Rational_Box box1(SPACE_DIM); + + Grid gr(SPACE_DIM, 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)); + + gr.get_covering_box(box1); + + Rational_Box known_box(SPACE_DIM); + known_box.add_constraint(A >= 0); + known_box.add_constraint(A <= 1); + known_box.add_constraint(B >= 0); + known_box.add_constraint(B <= 1); + + bool ok = (box1 == known_box); + + print_generators(gr, "*** gr ***"); + nout << "box1:" << endl << box1; + + if (ok) { + Grid tem_gr(box1, From_Covering_Box()); + Rational_Box box2(SPACE_DIM); + tem_gr.get_covering_box(box2); + + ok = (box2 == known_box); + + nout << "box2:" << endl << box2; + } + + return ok; +} + +// Skew grid, with a divisor. +bool +test03() { + Variable A(0); + Variable B(1); + + Rational_Box box1(SPACE_DIM); + + Grid gr(SPACE_DIM, 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)); + + gr.get_covering_box(box1); + + Rational_Box known_box(SPACE_DIM); + known_box.add_constraint(2*A >= 0); + known_box.add_constraint(2*A <= 1); + known_box.add_constraint(2*B >= 0); + known_box.add_constraint(2*B <= 2); + + bool ok = (box1 == known_box); + + print_generators(gr, "*** gr ***"); + nout << "box1:" << endl << box1; + + if (ok) { + Grid tem_gr(box1, From_Covering_Box()); + Rational_Box box2(SPACE_DIM); + tem_gr.get_covering_box(box2); + + ok = (box2 == known_box); + + nout << "box2:" << endl << box2; + } + + return ok; +} + +#undef SPACE_DIM +#define SPACE_DIM 3 + +// Grid containing a line. +bool +test04() { + Variable A(0); + Variable B(1); + Variable C(2); + + Rational_Box box1(SPACE_DIM); + + Grid gr(SPACE_DIM, EMPTY); + gr.add_grid_generator(grid_point()); + gr.add_grid_generator(grid_line(A + 2*B)); + gr.add_grid_generator(grid_point(C, 2)); + + gr.get_covering_box(box1); + + Rational_Box known_box(SPACE_DIM); + known_box.add_constraint(A == 0); + known_box.add_constraint(B == 0); + known_box.add_constraint(C >= 0); + known_box.add_constraint(2*C <= 1); + + bool ok = (box1 == known_box); + + print_generators(gr, "*** gr ***"); + nout << "box1:" << endl << box1; + + if (ok) { + Grid tem_gr(box1, From_Covering_Box()); + Rational_Box box2(SPACE_DIM); + tem_gr.get_covering_box(box2); + + ok = (box2 == known_box); + + nout << "box2:" << endl << box2; + } + + return ok; +} + +// Universe grid. +bool +test05() { + Variable A(0); + Variable B(1); + Variable C(2); + + Rational_Box box1(SPACE_DIM); + + Grid gr(SPACE_DIM); + + gr.get_covering_box(box1); + + Rational_Box known_box(SPACE_DIM); + known_box.add_constraint(A == 0); + known_box.add_constraint(B == 0); + known_box.add_constraint(C == 0); + + bool ok = (box1 == known_box); + + print_congruences(gr, "*** gr ***"); + nout << "box1:" << endl << box1; + + if (ok) { + Grid tem_gr(box1, From_Covering_Box()); + Rational_Box box2(SPACE_DIM); + tem_gr.get_covering_box(box2); + + ok = (box2 == known_box); + + nout << "box2:" << endl << box2; + } + + return ok; +} + +// Grid which is a single point. +bool +test06() { + Variable A(0); + Variable B(1); + Variable C(2); + + Rational_Box box1(SPACE_DIM); + + Grid gr(SPACE_DIM, EMPTY); + gr.add_grid_generator(grid_point(16*A + 6*B - 6*C, 7)); + + gr.get_covering_box(box1); + + Rational_Box known_box(SPACE_DIM); + 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_generators(gr, "*** gr ***"); + nout << "box1:" << endl << box1; + + if (ok) { + Grid tem_gr(box1, From_Covering_Box()); + Rational_Box box2(SPACE_DIM); + tem_gr.get_covering_box(box2); + + ok = (box2 == known_box); + + nout << "box2:" << endl << box2; + } + + return ok; +} + +// Empty grid. +bool +test07() { + Variable A(0); + Variable B(1); + Variable C(2); + + Rational_Box box1(SPACE_DIM); + // Set bounds, to check that get_covering_box clears them. + box1.add_constraint(7*A >= 16); + box1.add_constraint(7*B >= 6); + box1.add_constraint(7*C >= -6); + + Grid gr(SPACE_DIM, EMPTY); + + gr.get_covering_box(box1); + + Rational_Box known_box(SPACE_DIM); + known_box.set_empty(); + + bool ok = (box1 == known_box); + + print_generators(gr, "*** gr ***"); + nout << "box1:" << endl << box1; + + if (ok) { + Grid tem_gr(box1, From_Covering_Box()); + + Rational_Box box2(SPACE_DIM); + // Set bounds, to check that get_covering_box clears them. + box2.add_constraint(3*A >= 1); + box2.add_constraint(2*B >= 2); + box2.add_constraint(C >= 3); + + tem_gr.get_covering_box(box2); + + ok = (box2 == known_box); + + nout << "box2:" << endl << box2; + } + + return ok; +} + +// A grid which get_covering_box has to minimize. +bool +test08() { + Variable A(0); + Variable B(1); + Variable C(2); + + Rational_Box box1(SPACE_DIM); + + Grid gr(SPACE_DIM, 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)); + gr.add_grid_generator(grid_point(C)); + + gr.get_covering_box(box1); + + Rational_Box known_box(SPACE_DIM); + known_box.add_constraint(A >= 0); + known_box.add_constraint(A <= 1); + known_box.add_constraint(B >= 0); + known_box.add_constraint(B <= 1); + known_box.add_constraint(C >= 0); + known_box.add_constraint(C <= 1); + + bool ok = (box1 == known_box); + + print_generators(gr, "*** gr ***"); + nout << "box1:" << endl << box1; + + if (ok) { + Grid tem_gr(box1, From_Covering_Box()); + Rational_Box box2(SPACE_DIM); + tem_gr.get_covering_box(box2); + + ok = (box2 == known_box); + + nout << "box2:" << endl << box2; + } + + return ok; +} + +// A grid defined by congruences. +bool +test09() { + Variable A(0); + Variable B(1); + Variable C(2); + + Rational_Box box1(SPACE_DIM); + + Grid gr(SPACE_DIM); + gr.add_congruence((A + 2*B %= 0) / 2); + gr.add_congruence((A %= 0) / 5); + + gr.get_covering_box(box1); + + Rational_Box known_box(SPACE_DIM); + known_box.add_constraint(A >= 0); + known_box.add_constraint(A <= 5); + known_box.add_constraint(B >= 0); + known_box.add_constraint(2*B <= 1); + known_box.add_constraint(C >= 0); + known_box.add_constraint(C <= 0); + + bool ok = (box1 == known_box); + + print_generators(gr, "*** gr ***"); + nout << "box1:" << endl << box1; + + if (ok) { + Grid tem_gr(box1, From_Covering_Box()); + Rational_Box box2(SPACE_DIM); + tem_gr.get_covering_box(box2); + + ok = (box2 == known_box); + + nout << "box2:" << endl << box2; + } + + return ok; +} + +// Grid where the only line is the final generator. +bool +test10() { + Variable A(0); + Variable B(1); + Variable C(2); + + Rational_Box box1(SPACE_DIM); + + Grid gr(SPACE_DIM, 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)); + + gr.get_covering_box(box1); + + Rational_Box known_box(SPACE_DIM); + known_box.add_constraint(A >= 0); + known_box.add_constraint(A <= 1); + known_box.add_constraint(B >= 0); + known_box.add_constraint(B <= 1); + known_box.add_constraint(C == 0); + + bool ok = (box1 == known_box); + + print_generators(gr, "*** gr ***"); + nout << "box1:" << endl << box1; + + if (ok) { + Grid tem_gr(box1, From_Covering_Box()); + Rational_Box box2(SPACE_DIM); + tem_gr.get_covering_box(box2); + + ok = (box2 == known_box); + + nout << "box2:" << endl << box2; + } + + return ok; +} + +#undef SPACE_DIM +#define SPACE_DIM 4 + +// A grid where, for a particular dimension (D), many coefficients +// between the first and last rows contribute towards the size of the +// resulting interval. +bool +test11() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + + Rational_Box box1(SPACE_DIM); + + Grid gr(SPACE_DIM, EMPTY); + gr.add_grid_generator(grid_point()); + gr.add_grid_generator(grid_point(A + 2*D)); + gr.add_grid_generator(grid_point(B + 4*D)); + gr.add_grid_generator(grid_point(C + 8*D)); + gr.add_grid_generator(grid_point(16*D)); + + gr.get_covering_box(box1); + + Rational_Box known_box(SPACE_DIM); + known_box.add_constraint(A >= 0); + known_box.add_constraint(A <= 1); + known_box.add_constraint(B >= 0); + known_box.add_constraint(B <= 1); + known_box.add_constraint(C >= 0); + known_box.add_constraint(C <= 1); + known_box.add_constraint(D >= 0); + known_box.add_constraint(D <= 2); + + bool ok = (box1 == known_box); + + print_generators(gr, "*** gr ***"); + nout << "box1:" << endl << box1; + + if (ok) { + + Grid tem_gr(box1, From_Covering_Box()); + Rational_Box box2(SPACE_DIM); + tem_gr.get_covering_box(box2); + + ok = (box2 == known_box); + + nout << "box2:" << endl << box2; + } + + return ok; +} + +// A grid where all the points have the same value in one of the +// dimensions (B). +bool +test12() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + + Rational_Box box1(SPACE_DIM); + + Grid gr(SPACE_DIM, 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)); + + gr.get_covering_box(box1); + + Rational_Box known_box(SPACE_DIM); + known_box.add_constraint(A >= 0); + known_box.add_constraint(A <= 1); + known_box.add_constraint(B >= 0); + known_box.add_constraint(C >= 0); + known_box.add_constraint(C <= 1); + known_box.add_constraint(D >= 0); + known_box.add_constraint(D <= 1); + + bool ok = (box1 == known_box); + + print_generators(gr, "*** gr ***"); + nout << "box1:" << endl << box1; + + if (ok) { + Grid tem_gr(box1, From_Covering_Box()); + Rational_Box box2(SPACE_DIM); + tem_gr.get_covering_box(box2); + + ok = (box2 == known_box); + + nout << "box2:" << endl << box2; + } + + return ok; +} + +// An empty grid defined by congruences. +bool +test13() { + Variable A(0); + Variable B(1); + Variable C(2); + + Rational_Box box1(SPACE_DIM); + // Set bounds, to check that get_covering_box clears them. + box1.add_constraint(7*A >= 1); + box1.add_constraint(7*B >= 2); + box1.add_constraint(7*C >= 3); + + Grid gr(SPACE_DIM); + gr.add_congruence((A %= 0) / 2); + gr.add_congruence((A %= 1) / 2); + + gr.get_covering_box(box1); + + Rational_Box known_box(SPACE_DIM); + known_box.set_empty(); + + bool ok = (box1 == known_box); + + print_congruences(gr, "*** gr ***"); + nout << "box1:" << endl << box1; + + if (ok) { + Grid tem_gr(box1, From_Covering_Box()); + + Rational_Box box2(SPACE_DIM); + // Set bounds, to check that get_covering_box clears them. + box2.add_constraint(7*A >= 3); + box2.add_constraint(7*B >= 1); + box2.add_constraint(7*C >= 2); + + tem_gr.get_covering_box(box2); + + ok = (box2 == known_box); + + nout << "box2:" << endl << box2; + } + + return ok; +} + +// Grid which is a single point, with a divisor, such that the +// fractions for some intervals (B and C) will be reduced before being +// assigned to the intervals. +bool +test14() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + + Rational_Box box1(SPACE_DIM); + + Grid gr(SPACE_DIM, EMPTY); + gr.add_grid_generator(grid_point(16*A + 14*B - 7*C, 7)); + + gr.get_covering_box(box1); + + Rational_Box known_box(SPACE_DIM); + known_box.add_constraint(7*A >= 16); + known_box.add_constraint(B >= 2); + known_box.add_constraint(C >= -1); + known_box.add_constraint(D >= 0); + + bool ok = (box1 == known_box); + + print_generators(gr, "*** gr ***"); + nout << "box1:" << endl << box1; + + if (ok) { + Grid tem_gr(box1, From_Covering_Box()); + Rational_Box box2(SPACE_DIM); + tem_gr.get_covering_box(box2); + + ok = (box2 == known_box); + + nout << "box2:" << endl << box2; + } + + return ok; +} + +// Many-pointed grid, with a divisor, such that the fractions for some +// intervals (B and C) will be reduced before being assigned to the +// intervals. +bool +test15() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + + Rational_Box box1(SPACE_DIM); + + Grid gr(SPACE_DIM, EMPTY); + gr.add_grid_generator(grid_point()); + gr.add_grid_generator(grid_point(A, 6)); + gr.add_grid_generator(grid_point(B, 3)); + gr.add_grid_generator(grid_point(C, 2)); + + gr.get_covering_box(box1); + + Rational_Box known_box(SPACE_DIM); + known_box.add_constraint(A >= 0); + known_box.add_constraint(6*A <= 1); + known_box.add_constraint(B >= 0); + known_box.add_constraint(3*B <= 1); + known_box.add_constraint(C >= 0); + known_box.add_constraint(2*C <= 1); + known_box.add_constraint(D >= 0); + + bool ok = (box1 == known_box); + + print_generators(gr, "*** gr ***"); + nout << "box1:" << endl << box1; + + if (ok) { + Grid tem_gr(box1, From_Covering_Box()); + Rational_Box box2(SPACE_DIM); + tem_gr.get_covering_box(box2); + + ok = (box2 == known_box); + + nout << "box2:" << endl << box2; + } + + return ok; +} + +#undef SPACE_DIM +#define SPACE_DIM 0 + +// Zero dimension empty grid. +bool +test16() { + Rational_Box box1(SPACE_DIM); + + Grid gr(SPACE_DIM, EMPTY); + + gr.get_covering_box(box1); + + Rational_Box known_box(SPACE_DIM); + known_box.set_empty(); + + bool ok = (box1 == known_box); + + print_generators(gr, "*** gr ***"); + nout << "box1:" << endl << box1; + + if (ok) { + Grid tem_gr(box1, From_Covering_Box()); + Rational_Box box2(SPACE_DIM); + tem_gr.get_covering_box(box2); + + ok = (box2 == known_box); + + nout << "box2:" << endl << box2; + } + + return ok; +} + +// Zero dimension universe grid. +bool +test17() { + Rational_Box box1(SPACE_DIM); + + Grid gr(SPACE_DIM); + + gr.get_covering_box(box1); + + Rational_Box known_box(SPACE_DIM); + + bool ok = (box1 == known_box); + + print_congruences(gr, "*** gr ***"); + nout << "box1:" << endl << box1; + + if (ok) { + Grid tem_gr(box1, From_Covering_Box()); + Rational_Box box2(SPACE_DIM); + tem_gr.get_covering_box(box2); + + ok = (box2 == known_box); + + nout << "box2:" << endl << box2; + } + + return ok; +} + +#undef SPACE_DIM +#define SPACE_DIM 2 + +// Rectilinear grid as in test01 but this time +// defined by a point and 2 parameters. +bool +test18() { + Variable A(0); + Variable B(1); + + Rational_Box box1(SPACE_DIM); + + Grid gr(SPACE_DIM, EMPTY); + gr.add_grid_generator(grid_point(B)); + gr.add_grid_generator(parameter(3*A)); + gr.add_grid_generator(parameter(3*A + 2*B)); + + gr.get_covering_box(box1); + + Rational_Box known_box(SPACE_DIM); + known_box.add_constraint(A >= 0); + known_box.add_constraint(A <= 3); + known_box.add_constraint(B >= 1); + known_box.add_constraint(B <= 3); + + bool ok = (box1 == known_box); + + print_generators(gr, "*** gr ***"); + nout << "box1:" << endl << box1; + + if (ok) { + Grid tem_gr(box1, From_Covering_Box()); + Rational_Box box2(SPACE_DIM); + tem_gr.get_covering_box(box2); + + ok = (box2 == known_box); + + nout << "box2:" << endl << box2; + } + + return ok; +} + +#undef SPACE_DIM +#define SPACE_DIM 4 + +// 4D grid defined with points and parameters. +bool +test19() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + + Rational_Box box1(SPACE_DIM); + + Grid gr(SPACE_DIM, EMPTY); + gr.add_grid_generator(grid_point(A)); + gr.add_grid_generator(grid_point(7*A)); + gr.add_grid_generator(parameter(5*B-3*A)); + gr.add_grid_generator(parameter(3*A)); + gr.add_grid_generator(grid_point(C+A)); + + gr.get_covering_box(box1); + + Rational_Box known_box(SPACE_DIM); + known_box.add_constraint(A >= 1); + known_box.add_constraint(A <= 4); + known_box.add_constraint(B >= 0); + known_box.add_constraint(B <= 5); + known_box.add_constraint(C >= 0); + known_box.add_constraint(C <= 1); + known_box.add_constraint(D >= 0); + + bool ok = (box1 == known_box); + + print_generators(gr, "*** gr ***"); + nout << "box1:" << endl << box1 << endl; + + if (ok) { + Grid tem_gr(box1, From_Covering_Box()); + Rational_Box box2(SPACE_DIM); + tem_gr.get_covering_box(box2); + + ok = (box2 == known_box); + + nout << "box2:" << endl << box2 << 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); +END_MAIN diff --git a/tests/Grid/discrete1.cc b/tests/Grid/discrete1.cc new file mode 100644 index 0000000..aaa27a7 --- /dev/null +++ b/tests/Grid/discrete1.cc @@ -0,0 +1,341 @@ +/* Test Grid::is_pointed(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Empty. +bool +test01() { + Grid gr(7, EMPTY); + + bool ok = (gr.is_discrete()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Zero dimension empty. +bool +test02() { + + Grid gr(0, EMPTY); + + bool ok = (gr.is_discrete()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Zero dimension universe. +bool +test03() { + Grid gr(0); + + bool ok = (gr.is_discrete()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Point. +bool +test04() { + Variable A(0); + Variable B(1); + + Grid gr_gs_min(2, EMPTY); + gr_gs_min.add_grid_generator_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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..42f2230 --- /dev/null +++ b/tests/Grid/disjoint1.cc @@ -0,0 +1,254 @@ +/* Test Grid::is_disjoint_from(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +using namespace Parma_Polyhedra_Library::IO_Operators; + +namespace { + +// Grid of points and empty grid. +bool +test01() { + Variable A(0); + + Grid_Generator_System gs; + gs.insert(grid_point(A)); + + Grid gr1(gs); + + Grid gr2(1, EMPTY); + + bool ok = (gr1.is_disjoint_from(gr2)); + print_congruences(gr1, "*** gr1 ***"); + print_congruences(gr2, "*** gr2 ***"); + + return ok; +} + +// Empty grid and grid of points. +bool +test02() { + Variable B(1); + + Grid gr1(2, EMPTY); + + Grid_Generator_System gs; + gs.insert(grid_point()); + gs.insert(grid_point(B)); + + Grid gr2(gs); + + bool ok = (gr1.is_disjoint_from(gr2)); + print_congruences(gr1, "*** gr1 ***"); + print_congruences(gr2, "*** gr2 ***"); + + return ok; +} + +// Both empty. +bool +test03() { + Grid gr1(4, EMPTY); + + Grid gr2(4, EMPTY); + + bool ok = (gr1.is_disjoint_from(gr2)); + print_congruences(gr1, "*** gr1 ***"); + print_congruences(gr2, "*** gr2 ***"); + + return ok; +} + +// Zero dimension universes. +bool +test04() { + Grid gr1(0); + + Grid gr2(0); + + bool ok = (!gr1.is_disjoint_from(gr2)); + print_congruences(gr1, "*** gr1 ***"); + print_congruences(gr2, "*** gr2 ***"); + + return ok; +} + +// Grid and itself. +bool +test05() { + Variable A(0); + Variable B(1); + Variable C(2); + + Grid gr(3); + gr.add_congruence(A - B %= 0); + gr.add_congruence(C %= 0); + + bool ok = (!gr.is_disjoint_from(gr)); + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Two grids which alternate AB planes along C. +bool +test06() { + Variable A(0); + Variable B(1); + Variable C(2); + + Grid gr1(3); + gr1.add_congruence(A - B %= 0); + gr1.add_congruence((C %= 0) / 2); + + Grid gr2(3, EMPTY); + gr2.add_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/equals1.cc b/tests/Grid/equals1.cc new file mode 100644 index 0000000..93233ea --- /dev/null +++ b/tests/Grid/equals1.cc @@ -0,0 +1,285 @@ +/* Test operator==(const Grid&, const Grid&) + and operator!=(const Grid&, const Grid&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Grids the same, gr defined by 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..d4a83b1 --- /dev/null +++ b/tests/Grid/expandspacedim1.cc @@ -0,0 +1,238 @@ +/* Test Grid::expand_space_dimension(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Universe. +bool +test01() { + Variable A(0); + + Grid gr(3); + print_congruences(gr, "*** gr ***"); + + gr.expand_space_dimension(A, 1); + + Grid known_gr(4); + + bool ok = (gr == known_gr); + print_congruences(gr, "*** gr.expand_space_dimension(A, 1) ***"); + + return ok; +} + +// Empty. +bool +test02() { + Variable B(1); + + Grid gr(3, EMPTY); + print_congruences(gr, "*** gr ***"); + + gr.expand_space_dimension(B, 1); + + Grid known_gr(4, EMPTY); + + bool ok = (gr == known_gr); + print_congruences(gr, "*** gr.expand_space_dimension(B, 1) ***"); + + return ok; +} + +// Trivial expansion. +bool +test03() { + Variable A(0); + Variable B(1); + + Grid gr(2); + gr.add_congruence(A %= 0); + gr.add_congruence(A + B %= 2); + + gr.expand_space_dimension(A, 0); + + Grid known_gr(2); + known_gr.add_congruence(A %= 0); + known_gr.add_congruence(A + B %= 2); + + bool ok = (gr == known_gr); + print_congruences(gr, "*** gr.expand_space_dimension(A, 0) ***"); + + return ok; +} + +// From generators, expanding one dimension. +bool +test04() { + Variable A(0); + Variable B(1); + Variable C(2); + + Grid gr(2, EMPTY); + gr.add_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..c9da38b --- /dev/null +++ b/tests/Grid/foldspacedims1.cc @@ -0,0 +1,400 @@ +/* Test Grid::fold_space_dimensions(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Universe grid. +bool +test01() { + Variable A(0); + Variable B(1); + + Grid gr(3); + print_congruences(gr, "*** gr ***"); + + Variables_Set to_fold; + to_fold.insert(A); + + gr.fold_space_dimensions(to_fold, B); + + Grid known_gr(2); + + bool ok = (gr == known_gr); + print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, B) ***"); + + return ok; +} + +// Empty grid. +bool +test02() { + Variable A(0); + Variable B(1); + + Grid gr(3, EMPTY); + print_congruences(gr, "*** gr ***"); + + Variables_Set to_fold; + to_fold.insert(A); + + gr.fold_space_dimensions(to_fold, B); + + Grid known_gr(2, EMPTY); + + bool ok = (gr == known_gr); + print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, B) ***"); + + return ok; +} + +// Trivial fold. +bool +test03() { + Variable A(0); + Variable B(1); + Variable C(2); + + Grid gr(3); + gr.add_congruence(A %= 0); + gr.add_congruence((A + B + C %= 2) / 3); + print_congruences(gr, "*** gr ***"); + + Grid known_gr = gr; + + Variables_Set to_fold; + + gr.fold_space_dimensions(to_fold, B); + + bool ok = (gr == known_gr); + print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, B) ***"); + + return ok; +} + +// Simple fold from congruences. +bool +test04() { + Variable A(0); + Variable B(1); + + Grid gr(2); + gr.add_congruence(A %= 1); + gr.add_congruence((B %= 1) / 3); + print_congruences(gr, "*** gr ***"); + + Variables_Set to_fold; + to_fold.insert(A); + + gr.fold_space_dimensions(to_fold, B); + + Grid known_gr(1); + known_gr.add_congruence(A %= 1); + + bool ok = (gr == known_gr); + print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, B) ***"); + + return ok; +} + +// Simple fold from generators. +bool +test05() { + Variable A(0); + Variable B(1); + Variable C(2); + + Grid gr(3, EMPTY); + gr.add_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/frombdshape1.cc b/tests/Grid/frombdshape1.cc new file mode 100644 index 0000000..b7e4cef --- /dev/null +++ b/tests/Grid/frombdshape1.cc @@ -0,0 +1,76 @@ +/* Test BD_Shape::BD_Shape(const C_Polyhedron&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + Constraint_System cs; + cs.insert(A - 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..e9b9cd3 --- /dev/null +++ b/tests/Grid/frombox1.cc @@ -0,0 +1,76 @@ +/* Test Grid::Grid(const Box&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + Constraint_System cs; + cs.insert(A == 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..941c30b --- /dev/null +++ b/tests/Grid/fromgrid1.cc @@ -0,0 +1,101 @@ +/* Test copy construction and assignment for grids. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// 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..aadd1cc --- /dev/null +++ b/tests/Grid/fromoctagonalshape1.cc @@ -0,0 +1,76 @@ +/* Test BD_Shape::BD_Shape(const C_Polyhedron&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + Constraint_System cs; + cs.insert(A - 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..eacdef5 --- /dev/null +++ b/tests/Grid/frompolyhedron1.cc @@ -0,0 +1,342 @@ +/* Test construction of grids from polyhedron. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Grid(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..419cc8a --- /dev/null +++ b/tests/Grid/generalizedaffineimage1.cc @@ -0,0 +1,555 @@ +/* Test Grid::generalized_affine_image(var, ...). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Simplest expression. +bool +test01() { + Variable A(0); + Variable B(1); + + Grid gr(2); + gr.add_congruence(A %= 0); + gr.add_congruence((B %= 0) / 2); + + gr.generalized_affine_image(B, 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..08aa748 --- /dev/null +++ b/tests/Grid/generalizedaffineimage2.cc @@ -0,0 +1,543 @@ +/* Test Grid::generalized_affine_image(lhs, rhs, modulus). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Tests 1 to 13 are equivalent to tests 1 to 13 in +// generalizedaffineimage1.cc. + +// Simplest expression. +bool +test01() { + Variable A(0); + Variable B(1); + + Grid gr(2); + gr.add_congruence(A %= 0); + gr.add_congruence((B %= 0) / 2); + + print_congruences(gr, "*** gr ***"); + + gr.generalized_affine_image(1*B, 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..f6806ef --- /dev/null +++ b/tests/Grid/generalizedaffineimage3.cc @@ -0,0 +1,376 @@ +/* Test Grid::generalized_affine_image(var, ...). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Simplest expression. +bool +test01() { + Variable A(0); + Variable B(1); + + Grid gr(2); + gr.add_congruence(A %= 0); + gr.add_congruence((B %= 0) / 2); + + gr.generalized_affine_image(B, 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..2c9c63e --- /dev/null +++ b/tests/Grid/generalizedaffinepreimage1.cc @@ -0,0 +1,539 @@ +/* Test Grid::generalized_affine_preimage(var, ...). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Simplest expression. +bool +test01() { + Variable A(0); + Variable B(1); + + Grid gr1(2); + gr1.add_congruence(A %= 0); + gr1.add_congruence(B %= 0); + + print_congruences(gr1, "*** gr1 ***"); + + Grid gr2 = gr1; + + // Equality expression. + gr1.generalized_affine_preimage(B, 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..cac1051 --- /dev/null +++ b/tests/Grid/generalizedaffinepreimage2.cc @@ -0,0 +1,320 @@ +/* Test Grid::generalized_affine_preimage(lhs, rhs, modulus). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Expressions both constants. +bool +test01() { + Variable A(0); + Variable B(1); + + Grid gr(2); + gr.add_congruence(A %= 0); + + print_congruences(gr, "*** gr ***"); + + gr.generalized_affine_preimage(Linear_Expression::zero(), 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..7ea5019 --- /dev/null +++ b/tests/Grid/generalizedaffinepreimage3.cc @@ -0,0 +1,461 @@ +/* Test Grid::generalized_affine_preimage(var, ...). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Simplest expression. +bool +test01() { + Variable A(0); + Variable B(1); + + Grid gr1(2); + gr1.add_congruence(A %= 0); + gr1.add_congruence(B %= 0); + + print_congruences(gr1, "*** gr1 ***"); + + // 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..91b6fc0 --- /dev/null +++ b/tests/Grid/generator1.cc @@ -0,0 +1,485 @@ +/* Test class Grid_Generator. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Point. +static bool +test01() { + Variable A(0); + Variable B(1); + Variable C(2); + + Grid_Generator a(grid_point(A + 2*B + 3*C)); + + Grid_Generator b(grid_point(3*C + A + 2*B)); + + bool ok = (a == b); + + print_generator(a, "*** a ***"); + print_generator(b, "*** b ***"); + + return ok; +} + +// Point with divisor. +static bool +test02() { + Variable A(0); + Variable B(1); + Variable C(2); + + Grid_Generator a(grid_point(A + 2*B + 3*C, 5)); + + Grid_Generator b(grid_point(15*C + 5*A + 10*B, 25)); + + bool ok = (a == b); + + print_generator(a, "*** a ***"); + print_generator(b, "*** b ***"); + + return ok; +} + +// Line. +static bool +test03() { + Variable A(0); + Variable B(1); + Variable C(2); + + Grid_Generator a(grid_line(A + 2*B + 3*C)); + + Grid_Generator b(grid_line(15*C + 5*A + 10*B)); + + bool ok = (a == b); + + print_generator(a, "*** a ***"); + print_generator(b, "*** b ***"); + + return ok; +} + +// Parameter. +static bool +test04() { + Variable A(0); + Variable B(1); + Variable C(2); + + Grid_Generator a(parameter(A + 2*B + 3*C)); + + Grid_Generator b(parameter(2*B + 2*A - A + 3*C)); + + bool ok = (a == b); + + print_generator(a, "*** a ***"); + print_generator(b, "*** b ***"); + + return ok; +} + +// Parameter with divisor. +static bool +test05() { + Variable A(0); + Variable B(1); + Variable C(2); + + Grid_Generator a(parameter(A + 2*B + 3*C, 4)); + + Grid_Generator b(parameter(6*B + 3*A + 9*C, 12)); + + bool ok = (a == b); + + print_generator(a, "*** a ***"); + print_generator(b, "*** b ***"); + + return ok; +} + +// Negative first coefficient. +static bool +test06() { + Variable A(0); + Variable B(1); + Variable C(2); + + Grid_Generator a(grid_point(- A + 2*B + 3*C, 4)); + + Grid_Generator b(grid_point(6*B - 3*A + 9*C, 12)); + + bool ok = (a == b); + + print_generator(a, "*** a ***"); + print_generator(b, "*** b ***"); + + return ok; +} + +// Construction from Generator. +static bool +test07() { + Variable A(0); + Variable B(1); + Variable C(2); + + Grid_Generator a(grid_point(- A + 2*B + 3*C, 4)); + + Grid_Generator b(grid_point(6*B - 3*A + 9*C, 12)); + + bool ok = (a == b); + + print_generator(a, "*** a ***"); + print_generator(b, "*** b ***"); + + return ok; +} + +// Construction from reference to Generator. +static bool +test08() { + Variable A(0); + Variable B(1); + Variable C(2); + + Grid_Generator g = grid_point(- A + 2*B + 3*C, 4); + Grid_Generator& g_ref = g; + + Grid_Generator a(g_ref); + + Grid_Generator b(grid_point(6*B - 3*A + 9*C, 12)); + + bool ok = (a == b); + + print_generator(a, "*** a ***"); + print_generator(b, "*** b ***"); + + return ok; +} + +// Create from empty linear expression. +static bool +test09() { + Linear_Expression le; + Grid_Generator a(grid_point(le)); + + Grid_Generator b(grid_point(le)); + + bool ok = (a == b); + + print_generator(a, "*** a ***"); + print_generator(b, "*** b ***"); + + return ok; +} + +// Parameter with negative divisor. +static 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. +static 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. +static 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. +static 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. +static 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 +static 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 +static 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 +static 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. +static 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. +static 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'. +static 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. +static 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; +} + +// Method zero_dim_point. +static bool +test22() { + Variable A(0); + Variable B(1); + Variable C(2); + + Linear_Expression le(grid_point(A - B - 2*C)); + + 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..2619508 --- /dev/null +++ b/tests/Grid/generators1.cc @@ -0,0 +1,470 @@ +/* Test Grid::generators(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Empty grid. +bool +test01() { + Grid gr1(7, EMPTY); + + Grid known_gr = gr1; + + Grid_Generator_System gs = gr1.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_and_minimize(Congruence::zero_dim_false()); + + Grid known_gr = gr1; + + Grid gr2(gs); + + bool ok = (gr2 == known_gr); + + print_generators(gr2, "*** gr2 ***"); + + return ok; +} + +// Empty grid, where updating the generators finds the grid empty. +bool +test09() { + Variable A(0); + + Grid gr1(7); + gr1.add_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.recycling_insert(gs1); + + 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.recycling_insert(ggs1); + 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..69fc15f --- /dev/null +++ b/tests/Grid/generators2.cc @@ -0,0 +1,55 @@ +/* Test class Grid_Generator_System. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// 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.recycling_insert(g); + + 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..b674b9f --- /dev/null +++ b/tests/Grid/grid1.cc @@ -0,0 +1,838 @@ +/* Test reduction and conversion of grids created from generators. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// add_grid_generator_and_minimize, one variable. +bool +test01() { + Variable A(0); + + Grid_Generator_System gs; + gs.insert(grid_point(A)); + + Grid gr(gs); + print_generators(gr, "*** gr ***"); + + gr.add_grid_generator_and_minimize(grid_point(2*A)); + + Congruence_System known_cgs; + known_cgs.insert(A %= 0); + + Grid known_gr(known_cgs); + + bool ok = (gr == known_gr); + + print_congruences(gr, + "*** gr.add_grid_generator_and_minimize(grid_point(2*A)) ***"); + + return ok; +} + +// add_grid_generator_and_minimize, two variables. +bool +test02() { + Variable A(0); + Variable B(1); + + Grid_Generator_System gs; + gs.insert(grid_point(A + B)); + + Grid gr(gs); + print_generators(gr, "*** gr ***"); + + Grid_Generator g(grid_point(A + 2*B)); + gr.add_grid_generator_and_minimize(g); + + Congruence_System known_cgs; + known_cgs.insert( 0*A + 0*B %= -1); + known_cgs.insert(( A + 0*B %= 1) / 0); + known_cgs.insert( 0*A + 1*B %= 1); + + Grid known_gr(known_cgs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_grid_generator_and_minimize(g) ***"); + + return ok; +} + +// add_grid_generators_and_minimize +bool +test03() { + Variable A(0); + Variable B(1); + + Grid_Generator_System gs; + gs.insert(grid_line(0*A + B)); + gs.insert(grid_point(3*A + 4*B)); + gs.insert(grid_point(9*A + 0*B)); + + Grid gr(2, EMPTY); + print_generators(gr, "*** gr ***"); + + gr.add_grid_generators_and_minimize(gs); + + Grid_Generator_System known_gs; + known_gs.insert(grid_line(0*A + B)); + known_gs.insert(grid_point(3*A + 4*B)); + known_gs.insert(grid_point(9*A + 0*B)); + + Grid known_gr(known_gs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_grid_generators_and_minimize(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_and_minimize(gs); + + Congruence_System known_cgs; + known_cgs.insert(( 0*A + 0*B + 0*C %= -2) / 2); + known_cgs.insert((-9*A + 6*B + 0*C %= 14) / 2); + known_cgs.insert(( 0*A - 0*B + 6*C %= 0) / 2); + + Grid known_gr(known_cgs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_grid_generators_and_minimize(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_and_minimize(gs); + + Congruence_System known_cgs; + known_cgs.insert(0*A + 0*B + 0*C %= -1); + known_cgs.insert((-2*A + 3*B + 0*C %= 7) / 0); + + Grid known_gr(known_cgs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_grid_generators_and_minimize(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_and_minimize(gs); + + Congruence_System known_cgs; + known_cgs.insert(( 0*A + 0*B + 0*C %= 15) / 15); + known_cgs.insert((-10*A + 0*B + 0*C %= 5) / 15); + known_cgs.insert(( 4*A - 6*B + 0*C %= -14) / 15); + + Grid known_gr(known_cgs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_grid_generators_and_minimize(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_and_minimize(gs); + + Congruence_System known_cgs; + known_cgs.insert(( 0*A + 0*B + 0*C %= -10) / 10); + known_cgs.insert((-2*A + 4*B + 0*C %= 9) / 10); + known_cgs.insert(( 7*A - 4*B + 5*C %= -4) / 0); + + Grid known_gr(known_cgs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_grid_generators_and_minimize(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_and_minimize(gs); + + Congruence_System known_cgs; + known_cgs.insert(A %= 0); + known_cgs.insert(B %= 0); + known_cgs.insert(C %= 0); + + Grid known_gr(known_cgs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_grid_generators_and_minimize(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_and_minimize(gs); + + Congruence_System known_cgs; + known_cgs.insert((A %= 1) / 0); + known_cgs.insert(B %= 0); + known_cgs.insert((C %= 0) / 0); + + Grid known_gr(known_cgs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_grid_generators_and_minimize(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_and_minimize(gs); + + Congruence_System known_cgs; + known_cgs.insert((A %= 1) / 0); + known_cgs.insert(B %= 0); + known_cgs.insert(C %= 0); + + Grid known_gr(known_cgs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_grid_generators_and_minimize(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_and_minimize(gs); + + Congruence_System known_cgs; + known_cgs.insert(( 0*A + 0*B + 0*C %= -1) / 1); + known_cgs.insert((-2*A + 3*B + 0*C %= 7) / 0); + + Grid known_gr(known_cgs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_grid_generators_and_minimize(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_and_minimize(gs); + + Congruence_System known_cgs; + known_cgs.insert((-4*A + 6*B + 0*C %= 1) / 0); + + Grid known_gr(known_cgs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_grid_generators_and_minimize(gs) ***"); + + return ok; +} + +// Empty grid, one dimension. +bool +test13() { + Grid gr(1, EMPTY); + + Grid known_gr(1, EMPTY); + + bool ok = (gr == known_gr); + + print_generators(gr, "*** gr(1, EMPTY) ***"); + + return ok; +} + +// Empty grid, many dimensions. +bool +test14() { + Grid gr(112, EMPTY); + + Grid known_gr(112, EMPTY); + + bool ok = (gr == known_gr); + + print_generators(gr, "*** gr(112, EMPTY) ***"); + + return ok; +} + +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_and_minimize(gs); + + Congruence_System known_cgs; + known_cgs.insert((4*A + 0*B + 0*C %= -1) / 0); + known_cgs.insert((0*A + 0*B + 4*C %= 3) / 0); + + Grid known_gr(known_cgs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_grid_generators_and_minimize(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_and_minimize(gs); + + Congruence_System known_cgs; + known_cgs.insert((C %= 0) / 0); + known_cgs.insert((-2*A + 2*B %= 1) / 3); + known_cgs.insert(( 3*A %= 0) / 3); + known_cgs.insert(( 0*A %= 3) / 3); + + Grid known_gr(known_cgs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_grid_generators_and_minimize(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_and_minimize(gs); + + Congruence_System known_cgs; + known_cgs.insert((-9*A + 6*B + 0*C %= 0) / 2); + known_cgs.insert(( 6*C %= 0) / 2); + + Grid known_gr(known_cgs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_grid_generators_and_minimize(gs) ***"); + + return ok; +} + +// Universe grid, one dimension. +bool +test18() { + Grid gr(1); + + Grid known_gr(1); + + bool ok = (gr == known_gr); + + print_generators(gr, "*** gr(1) ***"); + + return ok; +} + +// Universe grid, many dimensions. +bool +test19() { + Grid gr(21); + + Grid known_gr(21); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr(21) ***"); + + return ok; +} + +// Universe grid, zero dimensions. +bool +test20() { + Grid gr(0); + + Grid known_gr(0); + + bool ok = (gr == known_gr); + + print_generators(gr, "*** gr(0) ***"); + + return ok; +} + +// 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_and_minimize(gs); + + Congruence_System known_cgs; + + // Create coefficients with string constructors as they're too big + // for the long type. + + // 37315344498526 0 0 0 congruence, modulus = 37315344498526 + // 0 343455281759218112380 0 0 congruence, modulus = 37315344498526 + // 0 -133815138923073144612 223892066991156 0 congruence, modulus = 37315344498526 + // -22220 -31385495955559489171 93798931757298 18255 congruence, modulus = 37315344498526 + + Coefficient* tem1 = new Coefficient("37315344498526"); + known_cgs.insert(( 0*A + 0*B + 0*C %= -*tem1) / *tem1); + + Coefficient* tem2 = new Coefficient("343455281759218112380"); + known_cgs.insert(( *tem2*A + 0*B + 0*C %= 0) / *tem1); + delete tem2; + + tem2 = new Coefficient("-133815138923073144612"); + Coefficient* tem3 = new Coefficient("223892066991156"); + known_cgs.insert(( *tem2*A + *tem3*B + 0*C %= 0) / *tem1); + delete tem2; delete tem3; + + tem2 = new Coefficient("-31385495955559489171"); + tem3 = new Coefficient("93798931757298"); + known_cgs.insert(( *tem2*A + *tem3*B + 18255*C %= 22220) / *tem1); + delete tem1; delete tem2; delete tem3; + + + Grid known_gr(known_cgs); + + bool ok = (gr == known_gr); + + //print_congruences(gr, "*** gr.add_grid_generators_and_minimize(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_and_minimize(gs); + + Congruence_System known_cgs; + known_cgs.insert(( 0*A + 0*B + 0*C %= 280730) / 280730); + known_cgs.insert(( -85767*A + 108141*B + 0*C %= 70587) / 280730); + known_cgs.insert((-2309489*A + 1557137*B + 280730*C %= 1997619) / 0); + + Grid known_gr(known_cgs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_grid_generators_and_minimize(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_and_minimize(gs); + + Congruence_System known_cgs; + known_cgs.insert(( 0*A + 0*B + 0*C %= -40) / 40); + known_cgs.insert((20*A + 0*B + 0*C %= 15) / 40); + known_cgs.insert((-4*A + 32*B + 0*C %= 5) / 40); + known_cgs.insert(( 0*A + 0*B + 80*C %= 0) / 40); + + Grid known_gr(known_cgs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_grid_generators_and_minimize(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_and_minimize(gs); + + Congruence_System known_cgs; + known_cgs.insert((20*A + 0*B %= 15) / 40); + known_cgs.insert((-4*A + 32*B %= 5) / 40); + known_cgs.insert(( 80*C %= 0) / 40); + + Grid known_gr(known_cgs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_grid_generators_and_minimize(gs) ***"); + + return ok; +} + +// add_grid_generators_and_minimize, 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_and_minimize(gs); + + Congruence_System known_cgs; + known_cgs.insert(( 9*A + 0*B + 0*C + 0*D %= 0) / 27); + known_cgs.insert((-18*A + 27*B + 0*C + 0*D %= 0) / 27); + known_cgs.insert((-90*A + 135*B + 27*C + 0*D %= 27) / 27); + known_cgs.insert((-17*A + 25*B + 6*C + D %= 7) / 27); + + Grid known_gr(known_cgs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_grid_generators_and_minimize(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_and_minimize(gs); + + Congruence_System known_cgs; + known_cgs.insert((A %= 2) / 28); + known_cgs.insert((B %= 0) / 12); + + Grid known_gr(known_cgs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_grid_generators_and_minimize(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..d62f0c2 --- /dev/null +++ b/tests/Grid/grid2.cc @@ -0,0 +1,633 @@ +/* Test reduction and conversion of grids created from congruences. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// add_congruence_and_minimize, one dimension. +bool +test01() { + Variable A(0); + + Congruence_System cgs; + cgs.insert((A %= 0) / 2); + + Grid gr(cgs); + + Congruence cg(A %= 0); + print_congruences(gr, "*** gr ***"); + gr.add_congruence_and_minimize(cg); + + Grid_Generator_System known_gs; + known_gs.insert(grid_point(0*A)); + known_gs.insert(grid_point(2*A)); + + Grid known_gr(known_gs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_congruence_and_minimize(cg) ***"); + + return ok; +} + +// add_congruence_and_minimize, two dimensions. +bool +test02() { + Variable A(0); + Variable B(1); + + Congruence_System cgs; + cgs.insert((A - 3*B %= 4) / 5); + + Grid gr(cgs); + + Congruence cg((2*A - B %= 3) / 4); + print_congruences(gr, "*** gr ***"); + gr.add_congruence_and_minimize(cg); + + Grid_Generator_System known_gs; + known_gs.insert(grid_point(0*A - 15*B, 5)); + known_gs.insert(grid_point( A + 27*B, 5)); + known_gs.insert(grid_point(0*A + 85*B, 5)); + + Grid known_gr(known_gs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_congruence_and_minimize(cg) ***"); + + return ok; +} + +// add_congruences_and_minimize, one dimension. +bool +test03() { + Variable A(0); + + Congruence_System cgs; + cgs.insert((A %= 0) / 3); + + Grid gr(1); + print_congruences(gr, "*** gr ***"); + gr.add_congruences_and_minimize(cgs); + + Grid_Generator_System known_gs; + known_gs.insert(grid_point(0*A)); + known_gs.insert(grid_point(3*A)); + + Grid known_gr(known_gs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_congruences_and_minimize(cgs) ***"); + + return ok; +} + +// add_congruences_and_minimize, one dimension with factors. +bool +test04() { + Variable A(0); + + Congruence_System cgs; + cgs.insert((A %= 7) / 3); + + Grid gr(1); + print_congruences(gr, "*** gr ***"); + gr.add_congruences_and_minimize(cgs); + + Grid_Generator_System known_gs; + known_gs.insert(grid_point(1*A)); + known_gs.insert(grid_point(4*A)); + + Grid known_gr(known_gs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_recycled_congruences(cgs) ***"); + + return ok; +} + +// add_congruences_and_minimize, two dimensions. +bool +test05() { + Variable A(0); + Variable B(1); + + Congruence_System cgs; + cgs.insert((A - B %= 0) / 3); + + Grid gr(2); + gr.add_congruences_and_minimize(cgs); + + Grid_Generator_System known_gs; + known_gs.insert(grid_point()); + known_gs.insert(grid_point(3*A)); + known_gs.insert(grid_point(3*B)); + known_gs.insert(grid_line(A + B)); + + Grid known_gr(known_gs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_congruences_and_minimize(cgs) ***"); + + return ok; +} + +bool +test06() { + Variable A(0); + Variable B(1); + Variable C(2); + + Congruence_System cgs; + cgs.insert(A %= 0); + cgs.insert(A + B %= 0); + cgs.insert(A + B + C %= 0); + + Grid gr(3); + print_congruences(gr, "*** gr ***"); + gr.add_congruences_and_minimize(cgs); + + Grid_Generator_System known_gs; + known_gs.insert(grid_point()); + known_gs.insert(grid_point(A)); + known_gs.insert(grid_point(B)); + known_gs.insert(grid_point(C)); + + Grid known_gr(known_gs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_congruences_and_minimize(cgs) ***"); + + return ok; +} + +bool +test07() { + Variable A(0); + Variable B(1); + Variable C(2); + + Congruence_System cgs; + cgs.insert( -A %= 64); + cgs.insert(-6*A + B + 0*C %= -8); + cgs.insert( 3*A + 2*B + C %= -4); + + Grid gr(3); + print_congruences(gr, "*** gr ***"); + gr.add_congruences_and_minimize(cgs); + + Grid_Generator_System known_gs; + known_gs.insert(grid_point()); + known_gs.insert(grid_point(A)); + known_gs.insert(grid_point(B)); + known_gs.insert(grid_point(C)); + + Grid known_gr(known_gs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_recycled_congruences(cgs) ***"); + + return ok; +} + +// Adding a false equality. +bool +test08() { + Variable A(0); + + Congruence_System cgs; + cgs.insert((0*A %= -1) / 0); + cgs.insert(( A %= -1) / 2); + + Grid gr(3); + print_congruences(gr, "*** gr ***"); + gr.add_congruences_and_minimize(cgs); + + Grid known_gr(3, EMPTY); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_congruences_and_minimize(cgs) ***"); + + return ok; + } + +bool +test09() { + Variable A(0); + Variable B(1); + Variable C(2); + + Congruence_System cgs; + cgs.insert((A %= 0) / 2); + cgs.insert(( B %= 0) / 2); + cgs.insert((A + B + C %= 0) / 2); + + Grid gr(3); + print_congruences(gr, "*** gr ***"); + gr.add_congruences_and_minimize(cgs); + + Grid_Generator_System known_gs; + known_gs.insert(grid_point()); + known_gs.insert(grid_point(2*A)); + known_gs.insert(grid_point(2*B)); + known_gs.insert(grid_point(2*C)); + + Grid known_gr(known_gs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_congruences_and_minimize(cgs) ***"); + + return ok; +} + +bool +test10() { + Variable A(0); + Variable B(1); + Variable C(2); + + Congruence_System cgs; + cgs.insert((A + 2*B + C %= -2) / 5); + cgs.insert(( 3*B %= 0) / 5); + cgs.insert(( B %= 0) / 5); + cgs.insert(( 3*C %= -4) / 5); + cgs.insert(( 3*B + C %= -3) / 5); + + Grid gr(3); + print_congruences(gr, "*** gr ***"); + gr.add_congruences_and_minimize(cgs); + + Grid_Generator_System known_gs; + known_gs.insert(grid_point( A - 3*C)); + known_gs.insert(grid_point(6*A - 3*C)); + known_gs.insert(grid_point( A + 5*B - 3*C)); + known_gs.insert(grid_point( A + 2*C)); + + Grid known_gr(known_gs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_congruences_and_minimize(cgs) ***"); + + return ok; +} + +bool +test11() { + Variable A(0); + Variable B(1); + Variable C(2); + + Congruence_System cgs; + cgs.insert((3*A %= -2) / 5); + cgs.insert(( B + 2*C %= 0) / 5); + cgs.insert(( 2*B + 3*C %= -3) / 5); + + Grid gr(3); + print_congruences(gr, "*** gr ***"); + gr.add_congruences_and_minimize(cgs); + + Grid_Generator_System known_gs; + known_gs.insert(grid_point(-2*A - 3*B - 6*C, 3)); + known_gs.insert(grid_point( 3*A - 3*B - 6*C, 3)); + known_gs.insert(grid_point(-2*A + 12*B - 6*C, 3)); + known_gs.insert(grid_point(-2*A - 3*B + 9*C, 3)); + + Grid known_gr(known_gs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_congruences_and_minimize(cgs) ***"); + + return ok; +} + +bool +test12() { + Variable A(0); + Variable B(1); + Variable C(2); + + Congruence_System cgs; + cgs.insert((A %= 1) / 0); + cgs.insert((B %= 1) / 0); + cgs.insert((C %= 1) / 0); + + Grid gr(3); + print_congruences(gr, "*** gr ***"); + gr.add_congruences_and_minimize(cgs); + + Grid_Generator_System known_gs; + known_gs.insert(grid_point(A + B + C)); + + Grid known_gr(known_gs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_congruences_and_minimize(cgs) ***"); + + return ok; +} + +bool +test13() { + Variable A(0); + Variable B(1); + Variable C(2); + + Congruence_System cgs; + cgs.insert((A %= 1) / 0); + cgs.insert(B %= 1); + cgs.insert((C %= 1) / 0); + + Grid gr(3); + print_congruences(gr, "*** gr ***"); + gr.add_congruences_and_minimize(cgs); + + Grid_Generator_System known_gs; + known_gs.insert(grid_point(A + C)); + known_gs.insert(grid_point(A + B + C)); + + Grid known_gr(known_gs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_congruences_and_minimize(cgs) ***"); + + return ok; +} + +// An empty grid constructed from congruences. +bool +test14() { + Variable C(2); + + Congruence_System cgs; + cgs.insert((C %= 2) / 5); + cgs.insert((C %= 3) / 5); + + Grid gr(3); + print_congruences(gr, "*** gr ***"); + gr.add_congruences_and_minimize(cgs); + + Grid known_gr(3, EMPTY); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_congruences_and_minimize(cgs) ***"); + + return ok; +} + +// Adding a congruence system with a capacity larger than the capacity +// of the existing system. +bool +test15() { + Variable A(0); + Variable B(1); + Variable C(2); + + Congruence_System cgs1; + cgs1.insert(B %= 2); + + Grid gr(2); + gr.add_congruences_and_minimize(cgs1); + + gr.add_space_dimensions_and_embed(1); + print_congruences(gr, "*** gr ***"); + + // gr.con_sys is likely to be expanded within capacity. + + Congruence_System cgs2; + cgs2.insert(C %= 2); + + // cgs2 is likely to now have more capacity than gr.con_sys does. + + gr.add_congruences_and_minimize(cgs2); + + Congruence_System cgs3; + cgs3.insert(B %= 2); + cgs3.insert(C %= 2); + + Grid known_gr(cgs3); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_congruences_and_minimize(cgs2) ***"); + + return ok; +} + +// Zero dimension empty grid. + +bool +test16() { + Congruence_System cgs; + cgs.insert(Congruence::zero_dim_false()); + + Grid gr(cgs); + + Grid known_gr(0, EMPTY); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr(cgs) ***"); + + return ok; +} + +// Zero dimension universe grid. +bool +test17() { + Congruence_System cgs; + cgs.insert(Congruence::zero_dim_integrality()); + + Grid gr(cgs); + + Grid known_gr(0); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr(cgs) ***"); + + return ok; +} + +// add_recycled_congruence, add empty system to zero dimension +// universe. +bool +test18() { + Grid gr(0); + + Congruence_System cgs; + gr.add_recycled_congruences(cgs); + + Grid known_gr(0); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_recycled_congruences(cgs) ***"); + + return ok; +} + +// add_recycled_congruence, zero dimension empty. +bool +test19() { + Grid gr(0); + + Congruence_System cgs; + cgs.insert(Congruence::zero_dim_false()); + print_congruences(gr, "*** gr ***"); + + gr.add_recycled_congruences(cgs); + + Grid known_gr(0, EMPTY); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.add_recycled_congruences(cgs) ***"); + + return ok; +} + +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_and_minimize(cgs); + + Grid_Generator_System known_gs; + known_gs.insert(grid_point(-2*A + 0*B + 7*C, 3)); + known_gs.insert(grid_point( 1*A + 0*B + C, 3)); + known_gs.insert(grid_point(-2*A + 9*B + 7*C, 3)); + known_gs.insert(grid_point(-2*A + 0*B + 16*C, 3)); + + Grid known_gr(known_gs); + + bool ok = (gr == known_gr); + + print_generators(gr, "*** gr.add_congruences_and_minimize(cgs) ***"); + + return ok; +} + +// 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_and_minimize(cgs); + + bool ok = (gr.OK(true) && gr.OK(false)); + print_generators(gr, "*** gr.add_congruences_and_minimize(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..36a5732 --- /dev/null +++ b/tests/Grid/grid3.cc @@ -0,0 +1,274 @@ +/* Test construction of grids from constraints. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Grid(cs) +bool +test01() { + Variable A(0); + Variable B(1); + + 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..3a7de1f --- /dev/null +++ b/tests/Grid/griddifference1.cc @@ -0,0 +1,349 @@ +/* Test Grid::difference_assign() (a.k.a. Grid::difference_assign()). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Simple grids. +bool +test01() { + Variable A(0); + + Grid gr1(1); + gr1.add_congruence(A %= 0); + print_congruences(gr1, "*** gr1 ***"); + + Grid gr2(1); + gr2.add_congruence((A %= 0) / 2); + + gr1.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..535aecd --- /dev/null +++ b/tests/Grid/intersection1.cc @@ -0,0 +1,520 @@ +/* Test Grid::intersection_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Simple grids, one dimensions. +bool +test01() { + Variable A(0); + + Congruence_System cgs1; + cgs1.insert((A %= 1) / 2); + + Congruence_System cgs2; + cgs2.insert((A %= 0) / 3); + + Grid gr1(cgs1); + print_congruences(gr1, "*** gr1 ***"); + Grid gr2(cgs2); + print_congruences(gr2, "*** gr2 ***"); + + gr1.intersection_assign(gr2); + + Congruence_System known_cgs; + known_cgs.insert((A %= 3) / 6); + + Grid known_gr(known_cgs); + + bool ok = (gr1 == known_gr); + + print_congruences(gr1, "*** gr.intersection_assign(gr2) ***"); + + return ok; +} + +// Simple grids, many dimensions. +bool +test02() { + Variable A(0); + Variable B(1); + Variable C(2); + + Congruence_System cgs1; + cgs1.insert((A + 0*C %= 0) / 2); + + Congruence_System cgs2; + cgs2.insert((B + 0*C %= 0) / 2); + + Grid gr1(cgs1); + print_congruences(gr1, "*** gr1 ***"); + Grid gr2(cgs2); + print_congruences(gr2, "*** gr2 ***"); + + gr1.intersection_assign(gr2); + + Congruence_System known_cgs; + known_cgs.insert((A + 0*C %= 0) / 2); + known_cgs.insert((B %= 0) / 2); + + Grid known_gr(known_cgs); + + bool ok = (gr1 == known_gr); + + print_congruences(gr1, "*** gr.intersection_assign(gr2) ***"); + + return ok; +} + +// First grid empty. +bool +test03() { + Variable A(0); + Variable B(1); + Variable C(2); + + Congruence_System cgs; + cgs.insert((B + 0*C %= 0) / 2); + + Grid gr1(3, EMPTY); + print_congruences(gr1, "*** gr1 ***"); + Grid gr2(cgs); + print_congruences(gr2, "*** gr2 ***"); + + gr1.intersection_assign(gr2); + + Grid known_gr(3, EMPTY); + + bool ok = (gr1 == known_gr); + + print_congruences(gr1, "*** gr.intersection_assign(gr2) ***"); + + return ok; +} + +// Second grid empty. +bool +test04() { + Variable A(0); + Variable B(1); + Variable C(2); + + Congruence_System cgs; + cgs.insert((B + 0*C %= 0) / 2); + + Grid gr1(cgs); + print_congruences(gr1, "*** gr1 ***"); + Grid gr2(3, EMPTY); + print_congruences(gr2, "*** gr2 ***"); + + gr1.intersection_assign(gr2); + + Grid known_gr(3, EMPTY); + + bool ok = (gr1 == known_gr); + + print_congruences(gr1, "*** gr1.intersection_assign(gr2) ***"); + + return ok; +} + +// First grid universe. +bool +test05() { + Variable A(0); + Variable B(1); + Variable C(2); + + Congruence_System cgs; + cgs.insert((5*A + 3*B + C %= 7) / 9); + + Grid gr1(3, UNIVERSE); + print_congruences(gr1, "*** gr1 ***"); + Grid gr2(cgs); + print_congruences(gr2, "*** gr2 ***"); + + gr1.intersection_assign(gr2); + + Congruence_System known_cgs; + known_cgs.insert((5*A + 3*B + C %= 7) / 9); + + Grid known_gr(known_cgs); + + bool ok = (gr1 == known_gr); + + print_congruences(gr1, "*** gr1.intersection_assign(gr2) ***"); + + return ok; +} + +// Second grid universe. +bool +test06() { + Variable B(1); + Variable C(2); + + Congruence_System cgs; + cgs.insert((2*B + 2*C %= 1) / 3); + + Grid gr1(cgs); + print_congruences(gr1, "*** gr1 ***"); + Grid gr2(3, UNIVERSE); + print_congruences(gr2, "*** gr2 ***"); + + gr1.intersection_assign(gr2); + + Congruence_System known_cgs; + known_cgs.insert((2*B + 2*C %= 1) / 3); + + Grid known_gr(known_cgs); + + bool ok = (gr1 == known_gr); + + print_congruences(gr1, "*** gr1.intersection_assign(gr2) ***"); + + return ok; +} + +// Zero dimension grids. + +bool +test07() { + Congruence_System cgs; + Linear_Expression le; + cgs.insert((le %= le) / 1); // (0 %= 0) / 1 + + Grid gr1(cgs); + print_congruences(gr1, "*** gr1 ***"); + Grid gr2(0, UNIVERSE); + print_congruences(gr2, "*** gr2 ***"); + + gr1.intersection_assign(gr2); + + Grid known_gr(cgs); + + bool ok = (gr1 == known_gr); + + print_congruences(gr1, "*** gr1.intersection_assign(gr2) ***"); + + return ok; +} + +// Many dimensioned grids from generators. +bool +test08() { + Variable A(0); + Variable B(1); + Variable C(2); + + Grid_Generator_System gs1; + gs1.insert(grid_point(A + C)); + gs1.insert(grid_line(C)); + + Grid_Generator_System gs2; + gs2.insert(grid_point(A)); + gs2.insert(grid_point(A + B)); + + Grid gr1(gs1); + print_generators(gr1, "*** gr1 ***"); + + Grid gr2(3, EMPTY); + gr2.add_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; +} + +// intersection_assign_and_minimize: Simple grids, one dimension. +bool +test10() { + Variable A(0); + Variable B(1); + Variable C(2); + + Congruence_System cgs1; + cgs1.insert((A + 0*C %= 0) / 2); + + Congruence_System cgs2; + cgs2.insert((2*A + 0*C %= 0) / 2); + + Grid gr1(cgs1); + print_congruences(gr1, "*** gr1 ***"); + Grid gr2(cgs2); + print_congruences(gr2, "*** gr2 ***"); + + gr1.intersection_assign_and_minimize(gr2); + + Congruence_System known_cgs; + known_cgs.insert((A + 0*C %= 0) / 2); + known_cgs.insert((2*A %= 0) / 2); + + Grid known_gr(known_cgs); + + bool ok = (gr1 == known_gr); + + print_congruences(gr1, "*** gr1.intersection_assign_and_minimize(gr2) ***"); + + return ok; +} + +// intersection_assign_and_minimize: First grid empty. +bool +test11() { + Variable A(0); + Variable B(1); + Variable C(2); + + Congruence_System cgs; + cgs.insert((A + B + C %= 0) / 2); + + Grid gr1(3, EMPTY); + print_congruences(gr1, "*** gr1 ***"); + Grid gr2(cgs); + + gr1.intersection_assign_and_minimize(gr2); + + Grid known_gr(3, EMPTY); + + bool ok = (gr1 == known_gr); + + print_congruences(gr1, "*** gr1.intersection_assign_and_minimize(gr2) ***"); + + return ok; +} + +// intersection_assign_and_minimize: Second grid empty. +bool +test12() { + Variable A(0); + Variable B(1); + Variable C(2); + + Congruence_System cgs; + cgs.insert((A + B + C %= 0) / 2); + + Grid gr1(cgs); + print_congruences(gr1, "*** gr1 ***"); + Grid gr2(3, EMPTY); + + gr1.intersection_assign_and_minimize(gr2); + + Grid known_gr(3, EMPTY); + + bool ok = (gr1 == known_gr); + + print_congruences(gr1, "*** gr1.intersection_assign_and_minimize(gr2) ***"); + + return ok; +} + +// intersection_assign_and_minimize: First grid universe. +bool +test13() { + Variable A(0); + Variable B(1); + Variable C(2); + + Congruence_System cgs; + cgs.insert(( A + B + C %= 7) / 9); + cgs.insert((5*A + 3*B + C %= 7) / 9); + + Grid gr1(3, UNIVERSE); + print_congruences(gr1, "*** gr1 ***"); + Grid gr2(cgs); + + gr1.intersection_assign_and_minimize(gr2); + + Congruence_System known_cgs; + known_cgs.insert(( A + B + C %= 7) / 9); + known_cgs.insert((5*A + 3*B + C %= 7) / 9); + + Grid known_gr(known_cgs); + + bool ok = (gr1 == known_gr); + + print_congruences(gr1, "*** gr1.intersection_assign_and_minimize(gr2) ***"); + + return ok; +} + +// intersection_assign_and_minimize: Second grid universe. +bool +test14() { + Variable A(0); + Variable B(1); + Variable C(2); + + Congruence_System cgs; + cgs.insert((2*B + 2*C %= 1) / 3); + cgs.insert((2*B %= 1) / 3); + + Grid gr1(cgs); + print_congruences(gr1, "*** gr1 ***"); + Grid gr2(3, UNIVERSE); + + gr1.intersection_assign_and_minimize(gr2); + + Congruence_System known_cgs; + known_cgs.insert((2*B + 2*C %= 1) / 3); + known_cgs.insert((2*B %= 1) / 3); + + Grid known_gr(known_cgs); + + bool ok = (gr1 == known_gr); + + print_congruences(gr1, "*** gr1.intersection_assign_and_minimize(gr2) ***"); + + return ok; +} + +// intersection_assign_and_minimize: Zero dimension grids. +bool +test15() { + Grid gr1(0); + print_congruences(gr1, "*** gr1 ***"); + Grid gr2(0); + print_congruences(gr2, "*** gr2 ***"); + + gr1.intersection_assign_and_minimize(gr2); + + Grid known_gr(0); + + bool ok = (gr1 == known_gr); + + print_congruences(gr1, "*** gr1.intersection_assign_and_minimize(gr2) ***"); + + return ok; +} + +// intersection_assign_and_minimize: Many dimension grids from generators. +bool +test16() { + Variable A(0); + Variable B(1); + Variable C(2); + + Grid_Generator_System gs1; + gs1.insert(grid_point(A + C)); + gs1.insert(grid_point(A + 2*C)); + + Grid_Generator_System gs2; + gs2.insert(grid_point(A)); + gs2.insert(grid_point(A + B)); + + Grid gr1(gs1); + print_generators(gr1, "*** gr1 ***"); + + Grid gr2(3, EMPTY); + gr2.add_grid_generators(gs2); + print_generators(gr2, "*** gr2 ***"); + + gr1.intersection_assign_and_minimize(gr2); + + Congruence_System known_cgs; + known_cgs.insert((C == 0) / 0); + known_cgs.insert((A == 1) / 0); + known_cgs.insert((B == 0) / 0); + + Grid known_gr(known_cgs); + + bool ok = (gr1 == known_gr); + + print_generators(gr1, "*** gr1.intersection_assign_and_minimize(gr2) ***"); + + return ok; +} + +// Both empty and both not in minimal form. +bool +test17() { + 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.intersection_assign_and_minimize(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); + DO_TEST(test17); +END_MAIN diff --git a/tests/Grid/isempty1.cc b/tests/Grid/isempty1.cc new file mode 100644 index 0000000..a8d9bb6 --- /dev/null +++ b/tests/Grid/isempty1.cc @@ -0,0 +1,293 @@ +/* Test Grid::is_empty(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// One dimension. +bool +test01() { + Grid gr(1, EMPTY); + + bool ok = (gr.is_empty()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Many dimensions. +bool +test02() { + Grid gr(6, EMPTY); + + bool ok = (gr.is_empty()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Zero dimension empty. +bool +test03() { + Grid gr(0, EMPTY); + + bool ok = (gr.is_empty()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Zero dimension universe. +bool +test04() { + Grid gr(0); + + bool ok = (!gr.is_empty()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Universe grid. + +bool +test05() { + Grid gr(2); + + bool ok = (!gr.is_empty()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Grid of congruences. +bool +test06() { + Variable A(0); + Variable B(1); + Variable C(2); + + Congruence_System cgs; + cgs.insert((A + B + C %= 0) / 3); + + Grid gr(cgs); + + bool ok = (!gr.is_empty()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Empty grid of congruences. +bool +test07() { + Variable C(2); + + Congruence_System cgs; + cgs.insert((0*C %= 4) / 3); + + Grid gr(cgs); + + bool ok = (gr.is_empty()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Grid of generators. +bool +test08() { + Variable A(0); + Variable E(4); + Grid_Generator_System gs; + gs.insert(grid_point(A + 3*E)); + + Grid gr(gs); + + bool ok = (!gr.is_empty()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Universe grid of generators. +bool +test09() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + Variable E(4); + + Grid_Generator_System gs; + gs.insert(grid_point(A + 3*E)); + gs.insert(grid_line(A)); + gs.insert(grid_line(B)); + gs.insert(grid_line(C)); + gs.insert(grid_line(D)); + gs.insert(grid_line(E)); + + Grid gr(5); + gr.add_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..650e53e --- /dev/null +++ b/tests/Grid/isuniverse1.cc @@ -0,0 +1,321 @@ +/* Test Grid::is_universe(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// One dimension. +bool +test01() { + Grid gr(1); + + bool ok = (gr.is_universe()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Many dimensions. + +bool +test02() { + Grid gr(6); + + bool ok = (gr.is_universe()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Zero dimension universe. + +bool +test03() { + Grid gr(0); + + bool ok = (gr.is_universe()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Zero dimension empty. + +bool +test04() { + Grid gr(0, EMPTY); + + bool ok = (!gr.is_universe()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Empty grid. + +bool +test05() { + Grid gr(2, EMPTY); + + bool ok = (!gr.is_universe()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Grid of congruences. + +bool +test06() { + Variable A(0); + Variable B(1); + Variable C(2); + + Congruence_System cgs; + cgs.insert((A + B + C %= 0) / 3); + + Grid gr(cgs); + + bool ok = (!gr.is_universe()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Universe grid of congruences. + +bool +test07() { + Variable C(2); + + Congruence_System cgs; + cgs.insert((0*C %= 6) / 3); + + Grid gr(cgs); + + bool ok = (gr.is_universe()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Grid of generators. + +bool +test08() { + Variable A(0); + Variable E(4); + + Grid_Generator_System gs; + gs.insert(grid_point(A + 3*E)); + + Grid gr(gs); + + bool ok = (!gr.is_universe()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Universe grid of generators. +bool +test09() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + Variable E(4); + + Grid_Generator_System gs; + gs.insert(grid_point(A + 3*E)); + gs.insert(grid_line(A)); + gs.insert(grid_line(B)); + gs.insert(grid_line(C)); + gs.insert(grid_line(D)); + gs.insert(grid_line(E)); + + Grid gr(gs); + + bool ok = (gr.is_universe()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Minimized congruences. +bool +test10() { + Variable A(0); + Variable B(1); + Variable C(2); + + Congruence_System cgs; + cgs.insert((A + B + C %= 0) / 3); + + Grid gr(cgs); + + // Minimize the congruences. + gr.minimized_congruences(); + + bool ok = (!gr.is_universe()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Minimized universe congruences. +bool +test11() { + Variable C(2); + + Congruence_System cgs; + cgs.insert((0*C %= 3) / 3); + + Grid gr(cgs); + + // Minimize the congruences. + gr.minimized_congruences(); + + bool ok = (gr.is_universe()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Minimized universe congruences. +bool +test12() { + Variable C(2); + + Congruence_System cgs; + cgs.insert((0*C %= 4) / 2); + + Grid gr(cgs); + + // Minimize the congruences. + gr.minimized_congruences(); + + bool ok = (gr.is_universe()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Universe after remove_space_dimensions. + +bool +test13() { + Variable A(0); + Variable C(2); + + Congruence_System cgs; + cgs.insert((A + 0*C %= 4) / 2); + + Grid gr(cgs); + + Variables_Set vars; + vars.insert(A); + + gr.remove_space_dimensions(vars); + + // Minimize the congruences. + gr.minimized_congruences(); + + bool ok = (gr.is_universe()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Empty from a simple constraint. + +bool +test14() { + Variable C(2); + + Congruence_System cgs; + cgs.insert(0*C == 0); + + Grid gr(cgs); + + // Minimize the congruences. + gr.minimized_congruences(); + + bool ok = (gr.is_universe()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Congruences before minimization, where a point is required to +// determine that the grid is a strict subset of the universe. + +bool +test15() { + Variable A(0); + + Congruence_System cgs; + cgs.insert(A == 3); + + Grid gr(cgs); + + bool ok = (!gr.is_universe()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + DO_TEST(test06); + DO_TEST(test07); + DO_TEST(test08); + DO_TEST(test09); + DO_TEST(test10); + DO_TEST(test11); + DO_TEST(test12); + DO_TEST(test13); + DO_TEST(test14); + DO_TEST(test15); +END_MAIN diff --git a/tests/Grid/limitedextrapolation1.cc b/tests/Grid/limitedextrapolation1.cc new file mode 100644 index 0000000..fd32433 --- /dev/null +++ b/tests/Grid/limitedextrapolation1.cc @@ -0,0 +1,494 @@ +/* Test Grid::limited_congruence_extrapolation_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Initially empty. +bool +test01() { + Variable A(0); + + Grid gr1(2, EMPTY); + print_congruences(gr1, "*** gr1 ***"); + + Grid gr2(2); + gr2.add_congruence(A %= 0); + print_congruences(gr2, "*** gr2 ***"); + + Congruence_System cgs((A %= 0) / 2); + + Grid known_gr = gr2; + + gr2.limited_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..bb159fc --- /dev/null +++ b/tests/Grid/limitedextrapolation2.cc @@ -0,0 +1,498 @@ +/* Test Grid::limited_generator_extrapolation_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +// 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..16fe600 --- /dev/null +++ b/tests/Grid/limitedextrapolation3.cc @@ -0,0 +1,498 @@ +/* Test Grid::limited_extrapolation_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +// 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..c2f018d --- /dev/null +++ b/tests/Grid/mapspacedims1.cc @@ -0,0 +1,313 @@ +/* Test Grid::map_space_dimensions(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Empty grid, empty mapping. +bool +test01() { + Partial_Function function; + + Grid gr(3, EMPTY); + print_congruences(gr, "*** gr ***"); + + gr.map_space_dimensions(function); + + Grid known_gr(0, EMPTY); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.map_space_dimensions(function) ***"); + + return ok; +} + +// Mapping all dimensions. +bool +test02() { + Variable A(0); + Variable B(1); + Variable C(2); + + Partial_Function function; + function.insert(0, 2); + function.insert(2, 0); + function.insert(1, 1); + + Grid_Generator_System gs; + gs.insert(grid_point(2*C)); + gs.insert(grid_point(4*C)); + gs.insert(grid_point(A)); + + Grid gr(gs); + print_generators(gr, "*** gr ***"); + + gr.map_space_dimensions(function); + + Grid_Generator_System known_gs; + known_gs.insert(grid_point(2*A)); + known_gs.insert(grid_point(4*A)); + known_gs.insert(grid_point(C)); + + Grid known_gr(known_gs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.map_space_dimensions(function) ***"); + + return ok; +} + +// Mapping all dimensions, with overlap. +bool +test03() { + Variable A(0); + Variable B(1); + Variable C(2); + + Partial_Function function; + function.insert(0, 1); + function.insert(2, 0); + + Grid_Generator_System gs; + gs.insert(grid_point()); + gs.insert(grid_point(2*A)); + gs.insert(grid_line(A - C)); + + Grid gr(gs); + print_generators(gr, "*** gr ***"); + + gr.map_space_dimensions(function); + + Grid_Generator_System known_gs; + known_gs.insert(grid_point()); + known_gs.insert(grid_point(2*B)); + known_gs.insert(grid_line(B - A)); + Grid known_gr(known_gs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.map_space_dimensions(function) ***"); + + return ok; +} + +// Mapping more dimensions than there are in the grid. +bool +test04() { + Variable A(0); + Variable B(1); + Variable C(2); + + Partial_Function function; + function.insert(2, 0); + function.insert(3, 2); + function.insert(4, 1); + + Grid_Generator_System gs; + gs.insert(grid_point()); + gs.insert(grid_point(A)); + gs.insert(grid_point(B)); + + Grid gr(gs); + print_generators(gr, "*** gr ***"); + + gr.map_space_dimensions(function); + + Grid_Generator_System known_gs; + known_gs.insert(grid_point(0*C)); + Grid known_gr(known_gs); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.map_space_dimensions(function) ***"); + + return ok; +} + +// Mapping all dimensions to themselves. +bool +test05() { + Variable A(0); + Variable B(1); + + Partial_Function function; + function.insert(0, 0); + function.insert(1, 1); + + Grid_Generator_System gs; + gs.insert(grid_point()); + gs.insert(grid_point(A)); + gs.insert(grid_point(B)); + gs.insert(grid_point(A + B)); + + Grid gr(gs); + print_generators(gr, "*** gr ***"); + Grid known_gr(gr); + + gr.map_space_dimensions(function); + + bool ok = (gr == known_gr); + + print_congruences(gr, "*** gr.map_space_dimensions(function) ***"); + + return ok; +} + +// Mapping all additional dimensions (in the mapping) to themselves. +bool +test06() { + Variable A(0); + Variable B(1); + + Partial_Function function; + function.insert(0, 1); + function.insert(1, 0); + function.insert(2, 2); + function.insert(3, 3); + + Grid_Generator_System gs; + gs.insert(grid_point()); + gs.insert(grid_point(A)); + gs.insert(grid_point(2*B)); + gs.insert(grid_point(A + 2*B)); + + Grid gr(gs); + print_generators(gr, "*** gr ***"); + + gr.map_space_dimensions(function); + + Grid known_gr(4, EMPTY); + known_gr.add_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..92f2521 --- /dev/null +++ b/tests/Grid/maxmin1.cc @@ -0,0 +1,518 @@ +/* Test Grid::maximize(const Linear_Expression&, ...) + and Grid::minimize(const Linear_Expression&, ...). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include + +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_and_minimize(grid_point(3*A + 2*B, 3)); + print_generators(gr_gs_min, "*** gr_gs_min ***"); + + Grid gr_gs_needs_min(2, EMPTY); + gr_gs_needs_min.add_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_and_minimize(grid_line(B)); + print_generators(gr_gs_min, "*** gr_gs_min ***"); + + Grid gr_gs_needs_min(2, EMPTY); + gr_gs_needs_min.add_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_and_minimize(grid_line(2*A + B)); + print_generators(gr_gs_min, "*** gr_gs_min ***"); + + Grid gr_gs_needs_min(2, EMPTY); + gr_gs_needs_min.add_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_and_minimize(grid_line(A + 2*B)); + print_generators(gr_gs_min, "*** gr_gs_min ***"); + + Grid gr_gs_needs_min(2, EMPTY); + gr_gs_needs_min.add_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_and_minimize(grid_point(A + 2*B)); + print_generators(gr_gs_min, "*** gr_gs_min ***"); + + Grid gr_gs_needs_min(2, EMPTY); + gr_gs_needs_min.add_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_and_minimize(grid_line(B)); + print_generators(gr_gs_min, "*** gr_gs_min ***"); + + Grid gr_gs_needs_min(2, EMPTY); + gr_gs_needs_min.add_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_and_minimize(grid_point(B + C)); + print_generators(gr_gs_min, "*** gr_gs_min ***"); + + Grid gr_gs_needs_min(3, EMPTY); + gr_gs_needs_min.add_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_and_minimize(grid_line(A - 2*B)); + print_generators(gr_gs_min, "*** gr_gs_min ***"); + + Grid gr_gs_needs_min(3, EMPTY); + gr_gs_needs_min.add_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_and_minimize(grid_point(7*A - 11*B + 19*F)); + print_generators(gr_gs_min, "*** gr_gs_min ***"); + + Grid gr_gs_needs_min(6, EMPTY); + gr_gs_needs_min.add_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..e609278 --- /dev/null +++ b/tests/Grid/membytes1.cc @@ -0,0 +1,276 @@ +/* Test Grid::total_memory_in_bytes() and + Grid::external_memory_in_bytes(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +void +add_congruence(Grid& gr, const Congruence& cg) { + const memory_size_type gr_memory_before = gr.total_memory_in_bytes(); + const memory_size_type cg_memory = cg.total_memory_in_bytes(); + gr.add_congruence(cg); + const memory_size_type gr_memory_after = gr.total_memory_in_bytes(); + nout << gr_memory_before + << " + " << cg_memory + << " -> " << gr_memory_after + << endl; +} + +void +add_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 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 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 pgr2(gr2); + + Pointset_Powerset 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..ad7096f --- /dev/null +++ b/tests/Grid/mincongruences1.cc @@ -0,0 +1,221 @@ +/* Test Grid::minimized_congruences(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +using namespace Parma_Polyhedra_Library::IO_Operators; + +namespace { + +// Empty grid. +bool +test01() { + Grid gr1(4, EMPTY); + print_congruences(gr1, "*** gr1 ***"); + + Grid known_gr = gr1; + + Congruence_System cgs = gr1.minimized_congruences(); + + Grid gr2(cgs); + + bool ok = (gr2 == known_gr); + + print_congruences(gr2, "*** gr2(cgs) ***"); + + return ok; +} + +// Universe grid. +bool +test02() { + Grid gr1(6); + + Grid known_gr = gr1; + + Congruence_System cgs = gr1.minimized_congruences(); + + Grid gr2(cgs); + + bool ok = (gr2 == known_gr); + + print_congruences(gr2, "*** gr2(cgs) ***"); + + return ok; +} + +// Zero dimension empty grid. +bool +test03() { + Grid gr1(0, EMPTY); + print_congruences(gr1, "*** gr1 ***"); + + Grid known_gr = gr1; + + Congruence_System cgs = gr1.minimized_congruences(); + + 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..761d498 --- /dev/null +++ b/tests/Grid/mingenerators1.cc @@ -0,0 +1,240 @@ +/* Test Grid::minimized_grid_generators(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Empty grid. +bool +test01() { + Grid gr1(17, EMPTY); + print_generators(gr1, "*** gr1 ***"); + + Grid known_gr = gr1; + + Grid_Generator_System gs = gr1.minimized_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_and_minimize(Congruence::zero_dim_false()); + print_congruences(gr1, "*** gr1 ***"); + + Grid known_gr = gr1; + + Grid gr2(gs); + + bool ok = (known_gr == gr2); + + print_generators(gr2, "*** gr2(gs) ***"); + + return ok; +} + +// Empty grid, where updating the generators finds the grid empty. +bool +test09() { + Variable C(2); + + Grid gr1(4); + gr1.add_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..2c0a385 --- /dev/null +++ b/tests/Grid/outputoperator1.cc @@ -0,0 +1,140 @@ +/* Test IO_Operators::operator<<(s, gr). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include + +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..74e2d86 --- /dev/null +++ b/tests/Grid/outputoperator2.cc @@ -0,0 +1,99 @@ +/* Test Grid_Generator IO operators. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include + +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..5679fdc --- /dev/null +++ b/tests/Grid/outputoperator3.cc @@ -0,0 +1,90 @@ +/* Test Grid_Generator_System IO operators. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include + +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..3b30f1d --- /dev/null +++ b/tests/Grid/partition1.cc @@ -0,0 +1,99 @@ +/* Test Pointset_Powerset. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +#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& r) { + const Coefficient& c_modulus = c.modulus(); + const Coefficient& c_inhomogeneous_term = c.inhomogeneous_term(); + Linear_Expression le(c); + 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); + if (qqq.add_congruence_and_minimize((le+i %= 0) / c_modulus)) + r.add_disjunct(qqq); + } + qq.add_congruence(c); +} + +/*! \relates Pointset_Powerset */ +std::pair > +partition(const Grid& p, const Grid& q) { + Pointset_Powerset 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 >(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 > + 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..ba067a7 --- /dev/null +++ b/tests/Grid/powersetdifference1.cc @@ -0,0 +1,314 @@ +/* Test Pointset_Powerset. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + + +bool +test01() { + Variable x(0); + Variable y(1); + + Grid p(2); + p.add_congruence(x %= 0); + p.add_congruence(y %= 0); + + Pointset_Powerset ps(2, EMPTY); + ps.add_disjunct(p); + + Grid q(2); + q.add_congruence((x %= 1) / 3); + q.add_congruence((y %= 1) / 2); + + Pointset_Powerset 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 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 ps(2, EMPTY); + ps.add_disjunct(p); + + Grid q(2); + q.add_constraint(x == 1); + + Pointset_Powerset 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::iterator i = ps.begin(); + return (i->element() == known_gr); +} + +bool +test03() { + Variable x(0); + Variable y(1); + + Grid p(2); + p.add_constraint(x == 0); + + Pointset_Powerset ps(2, EMPTY); + ps.add_disjunct(p); + + Grid q(2); + q.add_congruence(x %= 1); + + Pointset_Powerset 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 ps(2, EMPTY); + ps.add_disjunct(p); + + Grid q(2); + q.add_congruence(y %= 0); + + Pointset_Powerset 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::iterator i = ps.begin(); + return (i->element() == known_gr); +} + +bool +test05() { + Variable x(0); + Variable y(1); + + Pointset_Powerset ps(2, EMPTY); + + Grid q(2); + q.add_congruence(y %= 0); + + Pointset_Powerset 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 ps(2, EMPTY); + ps.add_disjunct(p); + + Pointset_Powerset 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::iterator i = ps.begin(); + return (i->element() == known_gr); +} + +bool +test07() { + Variable x(0); + Variable y(1); + + Grid p(2); + p.add_congruence(y %= 0); + + Pointset_Powerset ps(2, EMPTY); + ps.add_disjunct(p); + + Pointset_Powerset 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::iterator i = ps.begin(); + return (i->element() == 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 ps(2, EMPTY); + ps.add_disjunct(p); + + Grid q(2); + q.add_congruence((x %= 1) / 3); + q.add_congruence((y %= 1) / 2); + + Pointset_Powerset 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 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 ps(2, EMPTY); + ps.add_disjunct(p); + + Grid q(2); + q.add_congruence((x %= 0) / 0); + + Pointset_Powerset 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..5920ead --- /dev/null +++ b/tests/Grid/powersetgeometricallycovers1.cc @@ -0,0 +1,180 @@ +/* Test Pointset_Powerset. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + + +bool +test01() { + Variable x(0); + Variable y(1); + + Grid p(2); + p.add_congruence(x %= 0); + + Pointset_Powerset ps(2, EMPTY); + ps.add_disjunct(p); + + Grid q(2); + q.add_congruence((x %= 1) / 3); + + Pointset_Powerset 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 ps(2, EMPTY); + ps.add_disjunct(p); + + Grid q(2); + q.add_constraint(x == 1); + + Pointset_Powerset 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 ps(2, EMPTY); + ps.add_disjunct(p); + + Grid q(2); + q.add_congruence(y %= 0); + + Pointset_Powerset 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 ps(2, EMPTY); + + Grid q(2); + q.add_congruence(y %= 0); + + Pointset_Powerset 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 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 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 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 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..8b32d06 --- /dev/null +++ b/tests/Grid/powersetgeometricallyequals1.cc @@ -0,0 +1,113 @@ +/* Test Pointset_Powerset. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + + +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 ps(2, EMPTY); + ps.add_disjunct(p1); + ps.add_disjunct(p2); + + Grid q(2); + q.add_congruence(x %= 0); + + Pointset_Powerset 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 ps(2, EMPTY); + ps.add_disjunct(p1); + ps.add_disjunct(p2); + + Grid q(2); + q.add_congruence(x %= 0); + + Pointset_Powerset 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 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 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..8017acd --- /dev/null +++ b/tests/Grid/refinewithcongruences1.cc @@ -0,0 +1,210 @@ +/* Test refine_with_congruence() and refine_with_congruences(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +using namespace Parma_Polyhedra_Library::IO_Operators; + +namespace { + +// 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..bc0183e --- /dev/null +++ b/tests/Grid/refinewithconstraints1.cc @@ -0,0 +1,207 @@ +/* Test refine_with_constraint() and refine_with_constraints(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +using namespace Parma_Polyhedra_Library::IO_Operators; + +namespace { + +// 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..d75b8cf --- /dev/null +++ b/tests/Grid/relations1.cc @@ -0,0 +1,366 @@ +/* Test Grid::relation_with(g). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Empty grid and point. +bool +test01() { + Variable A(0); + + Grid gr(2, EMPTY); + print_congruences(gr, "*** gr ***"); + + bool ok = (gr.relation_with(grid_point(A)) == Poly_Gen_Relation::nothing()); + + return ok; +} + +// Universe and point. +bool +test02() { + Variable A(0); + + Grid gr(2); + print_congruences(gr, "*** gr ***"); + + bool ok = (gr.relation_with(grid_point(A)) == Poly_Gen_Relation::subsumes()); + + return ok; +} + +// Lined grid and point. +bool +test03() { + Variable A(0); + Variable B(1); + + Grid_Generator_System gs; + gs.insert(grid_point()); + gs.insert(grid_point(B)); + gs.insert(grid_line(A)); + + Grid gr(gs); + print_congruences(gr, "*** gr ***"); + + bool ok + = (gr.relation_with(grid_point(A + B)) == Poly_Gen_Relation::subsumes()); + + return ok; +} + +// Equality and point. +bool +test04() { + Variable A(0); + + Grid gr(2); + gr.add_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..ca650c8 --- /dev/null +++ b/tests/Grid/relations2.cc @@ -0,0 +1,423 @@ +/* Test Grid::relation_with(cg). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// A proper congruence and a disjoint point. +bool +test01() { + Variable A(0); + Variable B(1); + + Grid gr(2, EMPTY); + gr.add_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..275ecdc --- /dev/null +++ b/tests/Grid/relations3.cc @@ -0,0 +1,462 @@ +/* Test Grid::relation_with(const Constraint&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// A 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; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + 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/removespacedims1.cc b/tests/Grid/removespacedims1.cc new file mode 100644 index 0000000..8d3cda0 --- /dev/null +++ b/tests/Grid/removespacedims1.cc @@ -0,0 +1,349 @@ +/* Test Grid::remove_space_dimensions(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// 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_and_minimize(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_and_minimize(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_and_minimize(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..7a7c9f7 --- /dev/null +++ b/tests/Grid/removespacedims2.cc @@ -0,0 +1,279 @@ +/* Test Grid::remove_higher_space_dimensions(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// From congruences. +bool +test01() { + Variable 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_and_minimize(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_and_minimize(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..9959d7d --- /dev/null +++ b/tests/Grid/simplifyusingcontext1.cc @@ -0,0 +1,500 @@ +/* Test Grid::simplify_using_context_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + 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_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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..c1cae9f --- /dev/null +++ b/tests/Grid/timeelapse1.cc @@ -0,0 +1,340 @@ +/* Test Grid::time_elapse_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Zero dimension. +bool +test01() { + Grid gr1(0); + print_generators(gr1, "*** gr1 ***"); + Grid gr2(0); + print_generators(gr2, "*** gr2 ***"); + + gr1.time_elapse_assign(gr2); + + Grid known_gr(0); + + bool ok = (gr1 == known_gr); + + print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***"); + + return ok; +} + +// Zero dimension, second grid empty. +bool +test02() { + Grid gr1(0); + print_generators(gr1, "*** gr1 ***"); + Grid gr2(0, EMPTY); + print_generators(gr2, "*** gr2 ***"); + + gr1.time_elapse_assign(gr2); + + Grid known_gr(0, EMPTY); + + bool ok = (gr1 == known_gr); + + print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***"); + + return ok; +} + +// First grid empty. +bool +test03() { + Variable A(0); + + Grid gr1(4, EMPTY); + print_generators(gr1, "*** gr1 ***"); + + Grid gr2(4); + gr2.add_congruence(A %= 3); + print_congruences(gr2, "*** gr2 ***"); + + gr1.time_elapse_assign(gr2); + + Grid known_gr(4, EMPTY); + + bool ok = (gr1 == known_gr); + + print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***"); + + return ok; +} + +// Second grid empty. +bool +test04() { + Variable A(0); + + Grid gr1(4); + gr1.add_congruence(A %= 3); + print_congruences(gr1, "*** gr1 ***"); + + Grid gr2(4, EMPTY); + print_generators(gr2, "*** gr2 ***"); + + gr1.time_elapse_assign(gr2); + + Grid known_gr(4, EMPTY); + + bool ok = (gr1 == known_gr); + + print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***"); + + return ok; +} + +// Second grid a single point at the origin. +bool +test05() { + Variable A(0); + Variable B(1); + + Grid gr1(2); + gr1.add_congruence(A + 2*B %= 0); + print_congruences(gr1, "*** gr1 ***"); + + Grid gr2(2, EMPTY); + gr2.add_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..9a62ad9 --- /dev/null +++ b/tests/Grid/topclosed1.cc @@ -0,0 +1,336 @@ +/* Test Grid::is_topologically_closed(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Empty. +bool +test01() { + Grid gr(7, EMPTY); + + bool ok = (gr.is_topologically_closed()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Zero dimension empty. + +bool +test02() { + Grid gr(0, EMPTY); + + bool ok = (gr.is_topologically_closed()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Zero dimension universe. + +bool +test03() { + Grid gr(0); + + bool ok = (gr.is_topologically_closed()); + + print_congruences(gr, "*** gr ***"); + + return ok; +} + +// Point. + +bool +test04() { + Variable A(0); + Variable B(1); + + Grid gr_gs_min(2, EMPTY); + gr_gs_min.add_grid_generator_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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..aba1dd7 --- /dev/null +++ b/tests/Grid/topclosure1.cc @@ -0,0 +1,93 @@ +/* Test Grid::topological_closure_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Empty. +bool +test01() { + Grid gr(6, EMPTY); + print_generators(gr, "*** gr ***"); + + Grid known_gr = gr; + + gr.topological_closure_assign(); + + bool ok = (gr == known_gr); + + print_generators(gr, "*** gr.topological_closure_assign() ***"); + + return ok; +} + +// Universe +bool +test02() { + Grid gr(5); + print_generators(gr, "*** gr ***"); + + Grid known_gr = gr; + + gr.topological_closure_assign(); + + bool ok = (gr == known_gr); + + print_generators(gr, "*** gr.topological_closure_assign() ***"); + + return ok; +} + +bool +test03() { + Variable A(0); + Variable B(1); + Variable C(2); + + Grid_Generator_System gs; + gs.insert(grid_point(0*C)); + gs.insert(grid_line(A)); + gs.insert(grid_line(B)); + gs.insert(parameter(-C)); + + Grid gr(gs); + print_generators(gr, "*** gr ***"); + + Grid known_gr = gr; + + gr.topological_closure_assign(); + + bool ok = (gr == known_gr); + + print_generators(gr, "*** gr.topological_closure_assign() ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); +END_MAIN diff --git a/tests/Grid/unconstrain1.cc b/tests/Grid/unconstrain1.cc new file mode 100644 index 0000000..cefb65a --- /dev/null +++ b/tests/Grid/unconstrain1.cc @@ -0,0 +1,229 @@ +/* Test Grid::unconstrain(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + 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; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + 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/upperbound1.cc b/tests/Grid/upperbound1.cc new file mode 100644 index 0000000..93e25ba --- /dev/null +++ b/tests/Grid/upperbound1.cc @@ -0,0 +1,334 @@ +/* Test Grid::upper_bound_assign() + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Two grids each with one point and two lines +bool +test01() { + Variable B(1); + Variable C(2); + + Grid_Generator_System gs1; + gs1.insert(grid_point(C)); + + Grid_Generator_System gs2; + gs2.insert(grid_point(B + 0*C)); + + Grid gr1(gs1); + print_generators(gr1, "*** gr1 ***"); + Grid gr2(gs2); + print_generators(gr2, "*** gr2 ***"); + + gr1.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..4ef1965 --- /dev/null +++ b/tests/Grid/upperbound2.cc @@ -0,0 +1,340 @@ +/* Test Grid::upper_bound_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + Variable C(2); + + 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..6fa90d6 --- /dev/null +++ b/tests/Grid/widening1.cc @@ -0,0 +1,597 @@ +/* Test Grid::congruence_widening_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Initially empty. +bool +test01() { + Variable A(0); + + Grid gr1(2, EMPTY); + + print_congruences(gr1, "*** gr1 ***"); + + Grid gr2(2); + gr2.add_congruence(A %= 0); + + print_congruences(gr2, "*** gr2 ***"); + + Grid known_gr = gr2; + + gr2.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..4fb49a4 --- /dev/null +++ b/tests/Grid/widening2.cc @@ -0,0 +1,485 @@ +/* Test Grid::generator_widening_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Initially empty. +bool +test01() { + Variable A(0); + + Grid gr1(2, EMPTY); + + print_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..36a6411 --- /dev/null +++ b/tests/Grid/widening3.cc @@ -0,0 +1,314 @@ +/* Test Grid::widening_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Initially empty. +bool +test01() { + Variable A(0); + + Grid gr1(2, EMPTY); + + print_congruences(gr1, "*** gr1 ***"); + + Grid gr2(2); + gr2.add_congruence(A %= 0); + + print_congruences(gr2, "*** gr2 ***"); + + Grid known_gr = gr2; + + gr2.widening_assign(gr1); + + bool ok = (gr2 == known_gr); + + print_congruences(gr2, "*** gr2.widening_assign(gr1) ***"); + + return ok; +} + +// 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/writecongruencesystem.cc b/tests/Grid/writecongruencesystem.cc new file mode 100644 index 0000000..b82f8b0 --- /dev/null +++ b/tests/Grid/writecongruencesystem.cc @@ -0,0 +1,62 @@ +/* Test operator<<(std::ostream&, const Congruence_System&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include + +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..14fcfff --- /dev/null +++ b/tests/MIP_Problem/Makefile.am @@ -0,0 +1,108 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +if VALGRIND_TESTS_ENABLED + +CHECKER = \ +$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \ +--num-callers=100 --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 \ +@extra_includes@ \ +@debug_flag@ + +LDADD = \ +$(top_builddir)/utils/libppl_utils.a \ +$(top_builddir)/tests/libppl_tests.a \ +$(top_builddir)/src/libppl.la \ +@extra_libraries@ + +TESTS = \ +ascii_dump_load1 \ +exceptions1 \ +mipproblem1 \ +mipproblem3 + +XFAIL_TESTS = + +BUGS = + +# +# Sources for the tests +# + +ascii_dump_load1_SOURCES = ascii_dump_load1.cc + +exceptions1_SOURCES = exceptions1.cc + +mipproblem1_SOURCES = mipproblem1.cc + +mipproblem2_SRCS = mipproblem2.cc + +mipproblem3_SOURCES = mipproblem3.cc + +if BUILD_WATCHDOG_LIBRARY +WATCHDOG_TESTS = mipproblem2 + +mipproblem2_SOURCES = $(mipproblem2_SRCS) +mipproblem2_CPPFLAGS = \ +$(AM_CPPFLAGS) \ +-I$(top_builddir)/Watchdog \ +-I$(top_builddir)/Watchdog/src +mipproblem2_LDADD = $(LDADD) $(top_builddir)/Watchdog/src/libpwl.la + +endif BUILD_WATCHDOG_LIBRARY + +check_PROGRAMS = \ +$(TESTS) \ +$(WATCHDOG_TESTS) \ +$(BUGS) + +EXTRA_DIST = $(mipproblem2_SRCS) + +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 + +$(top_builddir)/Watchdog/src/libpwl.la: + $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/Watchdog/src libpwl.la diff --git a/tests/MIP_Problem/Makefile.in b/tests/MIP_Problem/Makefile.in new file mode 100644 index 0000000..75c38f9 --- /dev/null +++ b/tests/MIP_Problem/Makefile.in @@ -0,0 +1,753 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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) mipproblem3$(EXEEXT) +XFAIL_TESTS = +check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) +subdir = tests/MIP_Problem +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__EXEEXT_1 = ascii_dump_load1$(EXEEXT) exceptions1$(EXEEXT) \ + mipproblem1$(EXEEXT) mipproblem3$(EXEEXT) +@BUILD_WATCHDOG_LIBRARY_TRUE@am__EXEEXT_2 = mipproblem2$(EXEEXT) +am__EXEEXT_3 = +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_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_SOURCES_DIST = mipproblem2.cc +am__objects_1 = mipproblem2-mipproblem2.$(OBJEXT) +@BUILD_WATCHDOG_LIBRARY_TRUE@am_mipproblem2_OBJECTS = \ +@BUILD_WATCHDOG_LIBRARY_TRUE@ $(am__objects_1) +mipproblem2_OBJECTS = $(am_mipproblem2_OBJECTS) +am__DEPENDENCIES_1 = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +@BUILD_WATCHDOG_LIBRARY_TRUE@mipproblem2_DEPENDENCIES = \ +@BUILD_WATCHDOG_LIBRARY_TRUE@ $(am__DEPENDENCIES_1) \ +@BUILD_WATCHDOG_LIBRARY_TRUE@ $(top_builddir)/Watchdog/src/libpwl.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 +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(ascii_dump_load1_SOURCES) $(exceptions1_SOURCES) \ + $(mipproblem1_SOURCES) $(mipproblem2_SOURCES) \ + $(mipproblem3_SOURCES) +DIST_SOURCES = $(ascii_dump_load1_SOURCES) $(exceptions1_SOURCES) \ + $(mipproblem1_SOURCES) $(am__mipproblem2_SOURCES_DIST) \ + $(mipproblem3_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +@VALGRIND_TESTS_ENABLED_FALSE@CHECKER = +@VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \ +@VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \ +@VALGRIND_TESTS_ENABLED_TRUE@--num-callers=100 --leak-resolution=high \ +@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 \ +@extra_includes@ \ +@debug_flag@ + +LDADD = \ +$(top_builddir)/utils/libppl_utils.a \ +$(top_builddir)/tests/libppl_tests.a \ +$(top_builddir)/src/libppl.la \ +@extra_libraries@ + +BUGS = + +# +# Sources for the tests +# +ascii_dump_load1_SOURCES = ascii_dump_load1.cc +exceptions1_SOURCES = exceptions1.cc +mipproblem1_SOURCES = mipproblem1.cc +mipproblem2_SRCS = mipproblem2.cc +mipproblem3_SOURCES = mipproblem3.cc +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_TESTS = mipproblem2 +@BUILD_WATCHDOG_LIBRARY_TRUE@mipproblem2_SOURCES = $(mipproblem2_SRCS) +@BUILD_WATCHDOG_LIBRARY_TRUE@mipproblem2_CPPFLAGS = \ +@BUILD_WATCHDOG_LIBRARY_TRUE@$(AM_CPPFLAGS) \ +@BUILD_WATCHDOG_LIBRARY_TRUE@-I$(top_builddir)/Watchdog \ +@BUILD_WATCHDOG_LIBRARY_TRUE@-I$(top_builddir)/Watchdog/src + +@BUILD_WATCHDOG_LIBRARY_TRUE@mipproblem2_LDADD = $(LDADD) $(top_builddir)/Watchdog/src/libpwl.la +EXTRA_DIST = $(mipproblem2_SRCS) +MOSTLYCLEANFILES = \ +ascii_dump_load1.dat + +all: all-am + +.SUFFIXES: +.SUFFIXES: .cc .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/MIP_Problem/Makefile'; \ + 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 + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +ascii_dump_load1$(EXEEXT): $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_DEPENDENCIES) + @rm -f ascii_dump_load1$(EXEEXT) + $(CXXLINK) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS) +exceptions1$(EXEEXT): $(exceptions1_OBJECTS) $(exceptions1_DEPENDENCIES) + @rm -f exceptions1$(EXEEXT) + $(CXXLINK) $(exceptions1_OBJECTS) $(exceptions1_LDADD) $(LIBS) +mipproblem1$(EXEEXT): $(mipproblem1_OBJECTS) $(mipproblem1_DEPENDENCIES) + @rm -f mipproblem1$(EXEEXT) + $(CXXLINK) $(mipproblem1_OBJECTS) $(mipproblem1_LDADD) $(LIBS) +mipproblem2$(EXEEXT): $(mipproblem2_OBJECTS) $(mipproblem2_DEPENDENCIES) + @rm -f mipproblem2$(EXEEXT) + $(CXXLINK) $(mipproblem2_OBJECTS) $(mipproblem2_LDADD) $(LIBS) +mipproblem3$(EXEEXT): $(mipproblem3_OBJECTS) $(mipproblem3_DEPENDENCIES) + @rm -f mipproblem3$(EXEEXT) + $(CXXLINK) $(mipproblem3_OBJECTS) $(mipproblem3_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ascii_dump_load1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exceptions1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mipproblem1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mipproblem2-mipproblem2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mipproblem3.Po@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mipproblem2-mipproblem2.o: mipproblem2.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mipproblem2_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT mipproblem2-mipproblem2.o -MD -MP -MF $(DEPDIR)/mipproblem2-mipproblem2.Tpo -c -o mipproblem2-mipproblem2.o `test -f 'mipproblem2.cc' || echo '$(srcdir)/'`mipproblem2.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/mipproblem2-mipproblem2.Tpo $(DEPDIR)/mipproblem2-mipproblem2.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mipproblem2.cc' object='mipproblem2-mipproblem2.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mipproblem2_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o mipproblem2-mipproblem2.o `test -f 'mipproblem2.cc' || echo '$(srcdir)/'`mipproblem2.cc + +mipproblem2-mipproblem2.obj: mipproblem2.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mipproblem2_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT mipproblem2-mipproblem2.obj -MD -MP -MF $(DEPDIR)/mipproblem2-mipproblem2.Tpo -c -o mipproblem2-mipproblem2.obj `if test -f 'mipproblem2.cc'; then $(CYGPATH_W) 'mipproblem2.cc'; else $(CYGPATH_W) '$(srcdir)/mipproblem2.cc'; fi` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/mipproblem2-mipproblem2.Tpo $(DEPDIR)/mipproblem2-mipproblem2.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mipproblem2.cc' object='mipproblem2-mipproblem2.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mipproblem2_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o mipproblem2-mipproblem2.obj `if test -f 'mipproblem2.cc'; then $(CYGPATH_W) 'mipproblem2.cc'; else $(CYGPATH_W) '$(srcdir)/mipproblem2.cc'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; ws='[ ]'; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *$$ws$$tst$$ws*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + echo "XPASS: $$tst"; \ + ;; \ + *) \ + echo "PASS: $$tst"; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *$$ws$$tst$$ws*) \ + xfail=`expr $$xfail + 1`; \ + echo "XFAIL: $$tst"; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + echo "FAIL: $$tst"; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + echo "SKIP: $$tst"; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all tests failed"; \ + else \ + banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + skipped="($$skip tests were not run)"; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + test -z "$$skipped" || echo "$$skipped"; \ + test -z "$$report" || echo "$$report"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0; \ + else :; fi + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +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 + +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 all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool ctags \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-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 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 + +$(top_builddir)/Watchdog/src/libpwl.la: + $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/Watchdog/src libpwl.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..decfce7 --- /dev/null +++ b/tests/MIP_Problem/ascii_dump_load1.cc @@ -0,0 +1,417 @@ +/* Test MIP_Problem::ascii_dump() and MIP_Problem::ascii_load(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +#include "files.hh" +#include +#include + +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..1662ef3 --- /dev/null +++ b/tests/MIP_Problem/exceptions1.cc @@ -0,0 +1,510 @@ +/* Test that the right exceptions are thrown in case of incorrect uses. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + 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 +#ifndef __alpha__ + // Exception handling is broken in GCC on the Alpha. + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + 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); +#endif +END_MAIN diff --git a/tests/MIP_Problem/mipproblem1.cc b/tests/MIP_Problem/mipproblem1.cc new file mode 100644 index 0000000..22e14ba --- /dev/null +++ b/tests/MIP_Problem/mipproblem1.cc @@ -0,0 +1,1698 @@ +/* Test the MIP_Problem class. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable 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); + Generator pg_kr = point(2*X21 + 44*X39); + if (pg != pg_kr) + return false; + + // 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..aad13b0 --- /dev/null +++ b/tests/MIP_Problem/mipproblem2.cc @@ -0,0 +1,168 @@ +/* Test the MIP_Problem class with instances that require a watchdog timer. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include "pwl.hh" +#include + +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_Watchdog_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; + } + catch (const std::overflow_error& e) { + abandon_expensive_computations = 0; + if (std::numeric_limits::is_integer + && std::numeric_limits::is_bounded + && std::numeric_limits::radix == 2 + && std::numeric_limits::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..b072bdc --- /dev/null +++ b/tests/MIP_Problem/mipproblem3.cc @@ -0,0 +1,899 @@ +/* Test the MIP_Problem class. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + // 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("25300281663413827294061918339864663381194581220517764794612669753428792445999418361495047962679640561898384733039601488923726092173224184608376674992592313740189678034570795170558363467761652042654970959809093133570250935428086587327262919456144944542601257064044846194041676826903812816523290938580750782913463467636686848")) + || 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/Makefile.am b/tests/Makefile.am new file mode 100644 index 0000000..40f075a --- /dev/null +++ b/tests/Makefile.am @@ -0,0 +1,59 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +SUBDIRS = \ +. \ +Powerset \ +Partially_Reduced_Product \ +Box \ +MIP_Problem \ +Octagonal_Shape \ +BD_Shape \ +Polyhedron \ +Grid +#Ask_Tell + +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 \ +Partial_Function.cc + +LDADD = \ +$(top_builddir)/src/libppl.la \ +libppl_tests.a \ +@extra_libraries@ + +noinst_HEADERS = \ +ppl_test.hh \ +Partial_Function.defs.hh \ +Partial_Function.inlines.hh \ +Partial_Function.types.hh \ +Random_Number_Generator.defs.hh \ +Random_Number_Generator.inlines.hh \ +Random_Number_Generator.types.hh + +EXTRA_DIST = valgrind_suppressions diff --git a/tests/Makefile.in b/tests/Makefile.in new file mode 100644 index 0000000..65727a5 --- /dev/null +++ b/tests/Makefile.in @@ -0,0 +1,711 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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 = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +ARFLAGS = cru +libppl_tests_a_AR = $(AR) $(ARFLAGS) +libppl_tests_a_LIBADD = +am_libppl_tests_a_OBJECTS = files.$(OBJEXT) ppl_test.$(OBJEXT) \ + Partial_Function.$(OBJEXT) +libppl_tests_a_OBJECTS = $(am_libppl_tests_a_OBJECTS) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libppl_tests_a_SOURCES) +DIST_SOURCES = $(libppl_tests_a_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-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 uninstall-recursive +HEADERS = $(noinst_HEADERS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +SUBDIRS = \ +. \ +Powerset \ +Partially_Reduced_Product \ +Box \ +MIP_Problem \ +Octagonal_Shape \ +BD_Shape \ +Polyhedron \ +Grid + +#Ask_Tell +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 \ +Partial_Function.cc + +LDADD = \ +$(top_builddir)/src/libppl.la \ +libppl_tests.a \ +@extra_libraries@ + +noinst_HEADERS = \ +ppl_test.hh \ +Partial_Function.defs.hh \ +Partial_Function.inlines.hh \ +Partial_Function.types.hh \ +Random_Number_Generator.defs.hh \ +Random_Number_Generator.inlines.hh \ +Random_Number_Generator.types.hh + +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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign tests/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-checkLIBRARIES: + -test -z "$(check_LIBRARIES)" || rm -f $(check_LIBRARIES) +libppl_tests.a: $(libppl_tests_a_OBJECTS) $(libppl_tests_a_DEPENDENCIES) + -rm -f libppl_tests.a + $(libppl_tests_a_AR) libppl_tests.a $(libppl_tests_a_OBJECTS) $(libppl_tests_a_LIBADD) + $(RANLIB) libppl_tests.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Partial_Function.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/files.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_test.Po@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(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. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_LIBRARIES) +check: check-recursive +all-am: Makefile $(HEADERS) +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-checkLIBRARIES clean-generic clean-libtool \ + mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-exec-am: + +install-html: install-html-recursive + +install-info: install-info-recursive + +install-man: + +install-pdf: install-pdf-recursive + +install-ps: install-ps-recursive + +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: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ + install-strip + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-checkLIBRARIES \ + clean-generic clean-libtool ctags ctags-recursive 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-recursive \ + 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..7cbe4ba --- /dev/null +++ b/tests/Octagonal_Shape/Makefile.am @@ -0,0 +1,303 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +if VALGRIND_TESTS_ENABLED + +CHECKER = \ +$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \ +--num-callers=100 --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 \ +@extra_includes@ \ +@debug_flag@ + +LDADD = \ +$(top_builddir)/utils/libppl_utils.a \ +$(top_builddir)/tests/libppl_tests.a \ +$(top_builddir)/src/libppl.la \ +@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 \ +empty1 \ +expandspacedim1 \ +foldspacedims1 \ +frombdshape1 \ +frombox1 \ +fromgensys1 \ +fromgrid1 \ +fromoctagonalshape1 \ +frompolyhedron1 \ +fromspacedim1 \ +generalizedaffineimage1 \ +generalizedaffineimage2 \ +generalizedaffineimage3 \ +generalizedaffineimage4 \ +generalizedaffineimage5 \ +generalizedaffinepreimage1 \ +generalizedaffinepreimage2 \ +generalizedaffinepreimage3 \ +generalizedaffinepreimage4 \ +intersection1 \ +limitedbhmz05extrapolation1 \ +limitedcc76extrapolation1 \ +mapspacedims1 \ +max_min1 \ +max_min2 \ +maxspacedim1 \ +membytes1 \ +minconstraints1 \ +relatwithcons1 \ +relatwithcons2 \ +relatwithcons3 \ +relatwithgen1 \ +removespacedims1 \ +simplifyusingcontext1 \ +timeelapse1 \ +unconstrain1 \ +universe1 \ +upperbound1 \ +upperboundifexact1 \ +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 + +empty1_SOURCES = empty1.cc + +expandspacedim1_SOURCES = expandspacedim1.cc + +foldspacedims1_SOURCES = foldspacedims1.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 + +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 + +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..2c8d19b --- /dev/null +++ b/tests/Octagonal_Shape/Makefile.in @@ -0,0 +1,1561 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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) empty1$(EXEEXT) \ + expandspacedim1$(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) 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) \ + writeoctagon1$(EXEEXT) +XFAIL_TESTS = +subdir = tests/Octagonal_Shape +DIST_COMMON = $(dist_check_SCRIPTS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am_addspacedims1_OBJECTS = addspacedims1.$(OBJEXT) +addspacedims1_OBJECTS = $(am_addspacedims1_OBJECTS) +addspacedims1_LDADD = $(LDADD) +addspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_affinedimension1_OBJECTS = affinedimension1.$(OBJEXT) +affinedimension1_OBJECTS = $(am_affinedimension1_OBJECTS) +affinedimension1_LDADD = $(LDADD) +affinedimension1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_affineimage1_OBJECTS = affineimage1.$(OBJEXT) +affineimage1_OBJECTS = $(am_affineimage1_OBJECTS) +affineimage1_LDADD = $(LDADD) +affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_affineimage2_OBJECTS = affineimage2.$(OBJEXT) +affineimage2_OBJECTS = $(am_affineimage2_OBJECTS) +affineimage2_LDADD = $(LDADD) +affineimage2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_affinepreimage1_OBJECTS = affinepreimage1.$(OBJEXT) +affinepreimage1_OBJECTS = $(am_affinepreimage1_OBJECTS) +affinepreimage1_LDADD = $(LDADD) +affinepreimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_affinepreimage2_OBJECTS = affinepreimage2.$(OBJEXT) +affinepreimage2_OBJECTS = $(am_affinepreimage2_OBJECTS) +affinepreimage2_LDADD = $(LDADD) +affinepreimage2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_ascii_dump_load1_OBJECTS = ascii_dump_load1.$(OBJEXT) +ascii_dump_load1_OBJECTS = $(am_ascii_dump_load1_OBJECTS) +ascii_dump_load1_LDADD = $(LDADD) +ascii_dump_load1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_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_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_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_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_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 +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +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) $(empty1_SOURCES) \ + $(expandspacedim1_SOURCES) $(foldspacedims1_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) $(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) \ + $(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) $(empty1_SOURCES) \ + $(expandspacedim1_SOURCES) $(foldspacedims1_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) $(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) \ + $(writeoctagon1_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +@VALGRIND_TESTS_ENABLED_FALSE@CHECKER = +@VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \ +@VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \ +@VALGRIND_TESTS_ENABLED_TRUE@--num-callers=100 --leak-resolution=high \ +@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 \ +@extra_includes@ \ +@debug_flag@ + +LDADD = \ +$(top_builddir)/utils/libppl_utils.a \ +$(top_builddir)/tests/libppl_tests.a \ +$(top_builddir)/src/libppl.la \ +@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 +@SUPPORTED_FLOAT_TRUE@FLOAT_INSTANCE = float +@SUPPORTED_DOUBLE_TRUE@DOUBLE_INSTANCE = double +@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 +empty1_SOURCES = empty1.cc +expandspacedim1_SOURCES = expandspacedim1.cc +foldspacedims1_SOURCES = foldspacedims1.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 +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 +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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Octagonal_Shape/Makefile'; \ + 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 + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +addspacedims1$(EXEEXT): $(addspacedims1_OBJECTS) $(addspacedims1_DEPENDENCIES) + @rm -f addspacedims1$(EXEEXT) + $(CXXLINK) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS) +affinedimension1$(EXEEXT): $(affinedimension1_OBJECTS) $(affinedimension1_DEPENDENCIES) + @rm -f affinedimension1$(EXEEXT) + $(CXXLINK) $(affinedimension1_OBJECTS) $(affinedimension1_LDADD) $(LIBS) +affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) + @rm -f affineimage1$(EXEEXT) + $(CXXLINK) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS) +affineimage2$(EXEEXT): $(affineimage2_OBJECTS) $(affineimage2_DEPENDENCIES) + @rm -f affineimage2$(EXEEXT) + $(CXXLINK) $(affineimage2_OBJECTS) $(affineimage2_LDADD) $(LIBS) +affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES) + @rm -f affinepreimage1$(EXEEXT) + $(CXXLINK) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS) +affinepreimage2$(EXEEXT): $(affinepreimage2_OBJECTS) $(affinepreimage2_DEPENDENCIES) + @rm -f affinepreimage2$(EXEEXT) + $(CXXLINK) $(affinepreimage2_OBJECTS) $(affinepreimage2_LDADD) $(LIBS) +ascii_dump_load1$(EXEEXT): $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_DEPENDENCIES) + @rm -f ascii_dump_load1$(EXEEXT) + $(CXXLINK) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS) +bhmz05widening1$(EXEEXT): $(bhmz05widening1_OBJECTS) $(bhmz05widening1_DEPENDENCIES) + @rm -f bhmz05widening1$(EXEEXT) + $(CXXLINK) $(bhmz05widening1_OBJECTS) $(bhmz05widening1_LDADD) $(LIBS) +bhz03widening1$(EXEEXT): $(bhz03widening1_OBJECTS) $(bhz03widening1_DEPENDENCIES) + @rm -f bhz03widening1$(EXEEXT) + $(CXXLINK) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS) +bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES) + @rm -f bounded1$(EXEEXT) + $(CXXLINK) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS) +boundedaffineimage1$(EXEEXT): $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_DEPENDENCIES) + @rm -f boundedaffineimage1$(EXEEXT) + $(CXXLINK) $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_LDADD) $(LIBS) +boundedaffinepreimage1$(EXEEXT): $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_DEPENDENCIES) + @rm -f boundedaffinepreimage1$(EXEEXT) + $(CXXLINK) $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_LDADD) $(LIBS) +bounds1$(EXEEXT): $(bounds1_OBJECTS) $(bounds1_DEPENDENCIES) + @rm -f bounds1$(EXEEXT) + $(CXXLINK) $(bounds1_OBJECTS) $(bounds1_LDADD) $(LIBS) +cc76extrapolation1$(EXEEXT): $(cc76extrapolation1_OBJECTS) $(cc76extrapolation1_DEPENDENCIES) + @rm -f cc76extrapolation1$(EXEEXT) + $(CXXLINK) $(cc76extrapolation1_OBJECTS) $(cc76extrapolation1_LDADD) $(LIBS) +cc76narrowing1$(EXEEXT): $(cc76narrowing1_OBJECTS) $(cc76narrowing1_DEPENDENCIES) + @rm -f cc76narrowing1$(EXEEXT) + $(CXXLINK) $(cc76narrowing1_OBJECTS) $(cc76narrowing1_LDADD) $(LIBS) +chinainit$(EXEEXT): $(chinainit_OBJECTS) $(chinainit_DEPENDENCIES) + @rm -f chinainit$(EXEEXT) + $(CXXLINK) $(chinainit_OBJECTS) $(chinainit_LDADD) $(LIBS) +concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) + @rm -f concatenate1$(EXEEXT) + $(CXXLINK) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS) +congruences1$(EXEEXT): $(congruences1_OBJECTS) $(congruences1_DEPENDENCIES) + @rm -f congruences1$(EXEEXT) + $(CXXLINK) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS) +constrains1$(EXEEXT): $(constrains1_OBJECTS) $(constrains1_DEPENDENCIES) + @rm -f constrains1$(EXEEXT) + $(CXXLINK) $(constrains1_OBJECTS) $(constrains1_LDADD) $(LIBS) +constraints1$(EXEEXT): $(constraints1_OBJECTS) $(constraints1_DEPENDENCIES) + @rm -f constraints1$(EXEEXT) + $(CXXLINK) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS) +contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) + @rm -f contains1$(EXEEXT) + $(CXXLINK) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS) +containsintegerpoint1$(EXEEXT): $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_DEPENDENCIES) + @rm -f containsintegerpoint1$(EXEEXT) + $(CXXLINK) $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_LDADD) $(LIBS) +difference1$(EXEEXT): $(difference1_OBJECTS) $(difference1_DEPENDENCIES) + @rm -f difference1$(EXEEXT) + $(CXXLINK) $(difference1_OBJECTS) $(difference1_LDADD) $(LIBS) +discrete1$(EXEEXT): $(discrete1_OBJECTS) $(discrete1_DEPENDENCIES) + @rm -f discrete1$(EXEEXT) + $(CXXLINK) $(discrete1_OBJECTS) $(discrete1_LDADD) $(LIBS) +disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES) + @rm -f disjoint1$(EXEEXT) + $(CXXLINK) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS) +empty1$(EXEEXT): $(empty1_OBJECTS) $(empty1_DEPENDENCIES) + @rm -f empty1$(EXEEXT) + $(CXXLINK) $(empty1_OBJECTS) $(empty1_LDADD) $(LIBS) +expandspacedim1$(EXEEXT): $(expandspacedim1_OBJECTS) $(expandspacedim1_DEPENDENCIES) + @rm -f expandspacedim1$(EXEEXT) + $(CXXLINK) $(expandspacedim1_OBJECTS) $(expandspacedim1_LDADD) $(LIBS) +foldspacedims1$(EXEEXT): $(foldspacedims1_OBJECTS) $(foldspacedims1_DEPENDENCIES) + @rm -f foldspacedims1$(EXEEXT) + $(CXXLINK) $(foldspacedims1_OBJECTS) $(foldspacedims1_LDADD) $(LIBS) +frombdshape1$(EXEEXT): $(frombdshape1_OBJECTS) $(frombdshape1_DEPENDENCIES) + @rm -f frombdshape1$(EXEEXT) + $(CXXLINK) $(frombdshape1_OBJECTS) $(frombdshape1_LDADD) $(LIBS) +frombox1$(EXEEXT): $(frombox1_OBJECTS) $(frombox1_DEPENDENCIES) + @rm -f frombox1$(EXEEXT) + $(CXXLINK) $(frombox1_OBJECTS) $(frombox1_LDADD) $(LIBS) +fromgensys1$(EXEEXT): $(fromgensys1_OBJECTS) $(fromgensys1_DEPENDENCIES) + @rm -f fromgensys1$(EXEEXT) + $(CXXLINK) $(fromgensys1_OBJECTS) $(fromgensys1_LDADD) $(LIBS) +fromgrid1$(EXEEXT): $(fromgrid1_OBJECTS) $(fromgrid1_DEPENDENCIES) + @rm -f fromgrid1$(EXEEXT) + $(CXXLINK) $(fromgrid1_OBJECTS) $(fromgrid1_LDADD) $(LIBS) +fromoctagonalshape1$(EXEEXT): $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_DEPENDENCIES) + @rm -f fromoctagonalshape1$(EXEEXT) + $(CXXLINK) $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_LDADD) $(LIBS) +frompolyhedron1$(EXEEXT): $(frompolyhedron1_OBJECTS) $(frompolyhedron1_DEPENDENCIES) + @rm -f frompolyhedron1$(EXEEXT) + $(CXXLINK) $(frompolyhedron1_OBJECTS) $(frompolyhedron1_LDADD) $(LIBS) +fromspacedim1$(EXEEXT): $(fromspacedim1_OBJECTS) $(fromspacedim1_DEPENDENCIES) + @rm -f fromspacedim1$(EXEEXT) + $(CXXLINK) $(fromspacedim1_OBJECTS) $(fromspacedim1_LDADD) $(LIBS) +generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES) + @rm -f generalizedaffineimage1$(EXEEXT) + $(CXXLINK) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS) +generalizedaffineimage2$(EXEEXT): $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_DEPENDENCIES) + @rm -f generalizedaffineimage2$(EXEEXT) + $(CXXLINK) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS) +generalizedaffineimage3$(EXEEXT): $(generalizedaffineimage3_OBJECTS) $(generalizedaffineimage3_DEPENDENCIES) + @rm -f generalizedaffineimage3$(EXEEXT) + $(CXXLINK) $(generalizedaffineimage3_OBJECTS) $(generalizedaffineimage3_LDADD) $(LIBS) +generalizedaffineimage4$(EXEEXT): $(generalizedaffineimage4_OBJECTS) $(generalizedaffineimage4_DEPENDENCIES) + @rm -f generalizedaffineimage4$(EXEEXT) + $(CXXLINK) $(generalizedaffineimage4_OBJECTS) $(generalizedaffineimage4_LDADD) $(LIBS) +generalizedaffineimage5$(EXEEXT): $(generalizedaffineimage5_OBJECTS) $(generalizedaffineimage5_DEPENDENCIES) + @rm -f generalizedaffineimage5$(EXEEXT) + $(CXXLINK) $(generalizedaffineimage5_OBJECTS) $(generalizedaffineimage5_LDADD) $(LIBS) +generalizedaffinepreimage1$(EXEEXT): $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_DEPENDENCIES) + @rm -f generalizedaffinepreimage1$(EXEEXT) + $(CXXLINK) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS) +generalizedaffinepreimage2$(EXEEXT): $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_DEPENDENCIES) + @rm -f generalizedaffinepreimage2$(EXEEXT) + $(CXXLINK) $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_LDADD) $(LIBS) +generalizedaffinepreimage3$(EXEEXT): $(generalizedaffinepreimage3_OBJECTS) $(generalizedaffinepreimage3_DEPENDENCIES) + @rm -f generalizedaffinepreimage3$(EXEEXT) + $(CXXLINK) $(generalizedaffinepreimage3_OBJECTS) $(generalizedaffinepreimage3_LDADD) $(LIBS) +generalizedaffinepreimage4$(EXEEXT): $(generalizedaffinepreimage4_OBJECTS) $(generalizedaffinepreimage4_DEPENDENCIES) + @rm -f generalizedaffinepreimage4$(EXEEXT) + $(CXXLINK) $(generalizedaffinepreimage4_OBJECTS) $(generalizedaffinepreimage4_LDADD) $(LIBS) +intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) + @rm -f intersection1$(EXEEXT) + $(CXXLINK) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS) +limitedbhmz05extrapolation1$(EXEEXT): $(limitedbhmz05extrapolation1_OBJECTS) $(limitedbhmz05extrapolation1_DEPENDENCIES) + @rm -f limitedbhmz05extrapolation1$(EXEEXT) + $(CXXLINK) $(limitedbhmz05extrapolation1_OBJECTS) $(limitedbhmz05extrapolation1_LDADD) $(LIBS) +limitedcc76extrapolation1$(EXEEXT): $(limitedcc76extrapolation1_OBJECTS) $(limitedcc76extrapolation1_DEPENDENCIES) + @rm -f limitedcc76extrapolation1$(EXEEXT) + $(CXXLINK) $(limitedcc76extrapolation1_OBJECTS) $(limitedcc76extrapolation1_LDADD) $(LIBS) +mapspacedims1$(EXEEXT): $(mapspacedims1_OBJECTS) $(mapspacedims1_DEPENDENCIES) + @rm -f mapspacedims1$(EXEEXT) + $(CXXLINK) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS) +max_min1$(EXEEXT): $(max_min1_OBJECTS) $(max_min1_DEPENDENCIES) + @rm -f max_min1$(EXEEXT) + $(CXXLINK) $(max_min1_OBJECTS) $(max_min1_LDADD) $(LIBS) +max_min2$(EXEEXT): $(max_min2_OBJECTS) $(max_min2_DEPENDENCIES) + @rm -f max_min2$(EXEEXT) + $(CXXLINK) $(max_min2_OBJECTS) $(max_min2_LDADD) $(LIBS) +maxspacedim1$(EXEEXT): $(maxspacedim1_OBJECTS) $(maxspacedim1_DEPENDENCIES) + @rm -f maxspacedim1$(EXEEXT) + $(CXXLINK) $(maxspacedim1_OBJECTS) $(maxspacedim1_LDADD) $(LIBS) +membytes1$(EXEEXT): $(membytes1_OBJECTS) $(membytes1_DEPENDENCIES) + @rm -f membytes1$(EXEEXT) + $(CXXLINK) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS) +minconstraints1$(EXEEXT): $(minconstraints1_OBJECTS) $(minconstraints1_DEPENDENCIES) + @rm -f minconstraints1$(EXEEXT) + $(CXXLINK) $(minconstraints1_OBJECTS) $(minconstraints1_LDADD) $(LIBS) +relatwithcons1$(EXEEXT): $(relatwithcons1_OBJECTS) $(relatwithcons1_DEPENDENCIES) + @rm -f relatwithcons1$(EXEEXT) + $(CXXLINK) $(relatwithcons1_OBJECTS) $(relatwithcons1_LDADD) $(LIBS) +relatwithcons2$(EXEEXT): $(relatwithcons2_OBJECTS) $(relatwithcons2_DEPENDENCIES) + @rm -f relatwithcons2$(EXEEXT) + $(CXXLINK) $(relatwithcons2_OBJECTS) $(relatwithcons2_LDADD) $(LIBS) +relatwithcons3$(EXEEXT): $(relatwithcons3_OBJECTS) $(relatwithcons3_DEPENDENCIES) + @rm -f relatwithcons3$(EXEEXT) + $(CXXLINK) $(relatwithcons3_OBJECTS) $(relatwithcons3_LDADD) $(LIBS) +relatwithgen1$(EXEEXT): $(relatwithgen1_OBJECTS) $(relatwithgen1_DEPENDENCIES) + @rm -f relatwithgen1$(EXEEXT) + $(CXXLINK) $(relatwithgen1_OBJECTS) $(relatwithgen1_LDADD) $(LIBS) +removespacedims1$(EXEEXT): $(removespacedims1_OBJECTS) $(removespacedims1_DEPENDENCIES) + @rm -f removespacedims1$(EXEEXT) + $(CXXLINK) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS) +simplifyusingcontext1$(EXEEXT): $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_DEPENDENCIES) + @rm -f simplifyusingcontext1$(EXEEXT) + $(CXXLINK) $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_LDADD) $(LIBS) +timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES) + @rm -f timeelapse1$(EXEEXT) + $(CXXLINK) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS) +unconstrain1$(EXEEXT): $(unconstrain1_OBJECTS) $(unconstrain1_DEPENDENCIES) + @rm -f unconstrain1$(EXEEXT) + $(CXXLINK) $(unconstrain1_OBJECTS) $(unconstrain1_LDADD) $(LIBS) +universe1$(EXEEXT): $(universe1_OBJECTS) $(universe1_DEPENDENCIES) + @rm -f universe1$(EXEEXT) + $(CXXLINK) $(universe1_OBJECTS) $(universe1_LDADD) $(LIBS) +upperbound1$(EXEEXT): $(upperbound1_OBJECTS) $(upperbound1_DEPENDENCIES) + @rm -f upperbound1$(EXEEXT) + $(CXXLINK) $(upperbound1_OBJECTS) $(upperbound1_LDADD) $(LIBS) +upperboundifexact1$(EXEEXT): $(upperboundifexact1_OBJECTS) $(upperboundifexact1_DEPENDENCIES) + @rm -f upperboundifexact1$(EXEEXT) + $(CXXLINK) $(upperboundifexact1_OBJECTS) $(upperboundifexact1_LDADD) $(LIBS) +writeoctagon1$(EXEEXT): $(writeoctagon1_OBJECTS) $(writeoctagon1_DEPENDENCIES) + @rm -f writeoctagon1$(EXEEXT) + $(CXXLINK) $(writeoctagon1_OBJECTS) $(writeoctagon1_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addspacedims1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/affinedimension1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/affineimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/affineimage2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/affinepreimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/affinepreimage2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ascii_dump_load1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bhmz05widening1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bhz03widening1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bounded1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/boundedaffineimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/boundedaffinepreimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bounds1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cc76extrapolation1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cc76narrowing1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chinainit.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/concatenate1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/congruences1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/constrains1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/constraints1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/contains1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/containsintegerpoint1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/difference1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/discrete1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disjoint1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/empty1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/expandspacedim1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/foldspacedims1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frombdshape1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frombox1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fromgensys1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fromgrid1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fromoctagonalshape1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frompolyhedron1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fromspacedim1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalizedaffineimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalizedaffineimage2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalizedaffineimage3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalizedaffineimage4.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalizedaffineimage5.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalizedaffinepreimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalizedaffinepreimage2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalizedaffinepreimage3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalizedaffinepreimage4.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/intersection1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/limitedbhmz05extrapolation1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/limitedcc76extrapolation1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mapspacedims1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/max_min1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/max_min2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/maxspacedim1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/membytes1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minconstraints1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relatwithcons1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relatwithcons2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relatwithcons3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relatwithgen1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/removespacedims1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplifyusingcontext1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timeelapse1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unconstrain1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/universe1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upperbound1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upperboundifexact1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/writeoctagon1.Po@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; ws='[ ]'; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *$$ws$$tst$$ws*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + echo "XPASS: $$tst"; \ + ;; \ + *) \ + echo "PASS: $$tst"; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *$$ws$$tst$$ws*) \ + xfail=`expr $$xfail + 1`; \ + echo "XFAIL: $$tst"; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + echo "FAIL: $$tst"; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + echo "SKIP: $$tst"; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all tests failed"; \ + else \ + banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + skipped="($$skip tests were not run)"; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + test -z "$$skipped" || echo "$$skipped"; \ + test -z "$$report" || echo "$$report"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0; \ + else :; fi + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) \ + $(dist_check_SCRIPTS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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 + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +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 + +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 all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool ctags \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-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 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..769e667 --- /dev/null +++ b/tests/Octagonal_Shape/addspacedims1.cc @@ -0,0 +1,234 @@ +/* Test Octagonal_Shape::add_space_dimensions_and_embed() and + Octagonal_Shape::add_space_dimensions_and_project(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); +// Variable y(1); +// Variable z(2); + Variable w(3); + + 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 known_result(4); + known_result.add_constraint(x <= 2); + known_result.add_constraint(w <= 2); + + bool ok = (Octagonal_Shape(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 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(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 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(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..8baf253 --- /dev/null +++ b/tests/Octagonal_Shape/affinedimension1.cc @@ -0,0 +1,305 @@ +/* Test Octagonal_Shape::affine_dimension(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + 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..4d3cf65 --- /dev/null +++ b/tests/Octagonal_Shape/affineimage1.cc @@ -0,0 +1,520 @@ +/* Test Octagonal_Shape::affine_image(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + 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 known_result(3); + known_result.add_constraint(y <= 2); + known_result.add_constraint(x - y == 0); + + bool ok = (Octagonal_Shape(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 known_result(3); + known_result.add_constraint(y <= 2); + known_result.add_constraint(x + y == 0); + + bool ok = (Octagonal_Shape(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 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(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 known_result(3); + known_result.add_constraint(y <= 2); + known_result.add_constraint(x == 4); + + bool ok = (Octagonal_Shape(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 known_result(oc1); + + oc1.affine_image(x, x); + + bool ok = (Octagonal_Shape(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 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(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 known_result(3); + known_result.add_constraint(x <= 2); + known_result.add_constraint(y - x == 0); + + bool ok = (Octagonal_Shape(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 known_result(3); + known_result.add_constraint(x <= 2); + known_result.add_constraint(y - x == 1); + + bool ok = (Octagonal_Shape(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 known_result(2); + known_result.add_constraint(A >= 3); + known_result.add_constraint(B >= 0); + + bool ok = (Octagonal_Shape(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 known_result(2, EMPTY); + + bool ok = (Octagonal_Shape(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 known_result(2); + known_result.add_constraint(2*A <= -1); + known_result.add_constraint(2*A >= -3); + known_result.add_constraint(B >= 4); + + 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 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(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; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + DO_TEST(test06); + DO_TEST(test07); + DO_TEST(test08); + DO_TEST(test09); +#ifndef __alpha__ + // Exception handling is broken in GCC on the Alpha. + DO_TEST(test10); +#endif + 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/affineimage2.cc b/tests/Octagonal_Shape/affineimage2.cc new file mode 100644 index 0000000..1e39bd1 --- /dev/null +++ b/tests/Octagonal_Shape/affineimage2.cc @@ -0,0 +1,553 @@ +/* Test Octagonal_Shape::affine_image(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + Variable C(2); + + 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 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(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 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(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 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(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 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(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 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(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 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 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(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 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 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 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 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 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 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 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 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 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 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..c21cf4e --- /dev/null +++ b/tests/Octagonal_Shape/affinepreimage1.cc @@ -0,0 +1,293 @@ +/* Test Octagonal_Shape::affine_preimage(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + 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 known_result(3); + known_result.add_constraint(y <= 2); + + bool ok = (Octagonal_Shape(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 known_result(2); + known_result.add_constraint(B >= 0); + + bool ok = (Octagonal_Shape(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 known_result(2); + known_result.add_constraint(A >= 1); + known_result.add_constraint(B >= 0); + + bool ok = (Octagonal_Shape(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 known_result(2); + known_result.add_constraint(A >= 2); + + bool ok = (Octagonal_Shape(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 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(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 known_result(2, EMPTY); + + bool ok = (Octagonal_Shape(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_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..31220e5 --- /dev/null +++ b/tests/Octagonal_Shape/affinepreimage2.cc @@ -0,0 +1,425 @@ +/* Test Octagonal_Shape::affine_preimage(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + Variable C(2); + + 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 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(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 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(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 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(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 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(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 known_result(3); + known_result.add_constraint(B >= 0); + known_result.add_constraint(C >= 0); + + bool ok = (Octagonal_Shape(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 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 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(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 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(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 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 known_result(3); + known_result.add_constraint(A <= -1); + known_result.add_constraint(B <= 0); + + bool ok = (Octagonal_Shape(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 known_result(3); + known_result.add_constraint(B <= 0); + known_result.add_constraint(C >= 0); + + bool ok = (Octagonal_Shape(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 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(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 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 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..ade4320 --- /dev/null +++ b/tests/Octagonal_Shape/ascii_dump_load1.cc @@ -0,0 +1,330 @@ +/* Test Octagonal_Shape::ascii_dump() and Octagonal_Shape::ascii_load(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +#include "files.hh" +#include +#include + +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..d91e066 --- /dev/null +++ b/tests/Octagonal_Shape/bhmz05widening1.cc @@ -0,0 +1,708 @@ +/* Test Octagonal_Shape::BHMZ05_widening_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + 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 known_result(2); + known_result.add_constraint(x - y <= 2); + + bool ok = (Octagonal_Shape(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 known_result; + + bool ok = (Octagonal_Shape(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 known_result(2); + known_result.add_constraint(B >= 0); + + bool ok = (Octagonal_Shape(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 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(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 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(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 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(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 known_result(5); + known_result.add_constraint(B + C >= 11); + known_result.add_constraint(C + D >= 12); + + bool ok = (Octagonal_Shape(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 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(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 known_result(oc1); + + oc1.BHMZ05_widening_assign(oc2); + + bool ok = (Octagonal_Shape(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 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(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 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(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 known_result(3, EMPTY); + + bool ok = (Octagonal_Shape(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 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(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 known_result(2); + known_result.add_constraint(B >= 0); + known_result.add_constraint(A >= 1); + +#undef TOKENS +#define TOKENS 5 + + bool ok = (Octagonal_Shape(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 known_result(2); + known_result.add_constraint(x - y <= 2); + + bool ok = (Octagonal_Shape(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 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(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..23f7ba7 --- /dev/null +++ b/tests/Octagonal_Shape/bhz03widening1.cc @@ -0,0 +1,76 @@ +/* Test Pointset_Powerset::BHZ03_widening_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + typedef Pointset_Powerset 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 + (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..1446f78 --- /dev/null +++ b/tests/Octagonal_Shape/bounded1.cc @@ -0,0 +1,130 @@ +/* Test Octagonal_Shape::is_bounded(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + + // 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); +END_MAIN diff --git a/tests/Octagonal_Shape/boundedaffineimage1.cc b/tests/Octagonal_Shape/boundedaffineimage1.cc new file mode 100644 index 0000000..5052e61 --- /dev/null +++ b/tests/Octagonal_Shape/boundedaffineimage1.cc @@ -0,0 +1,604 @@ +/* Test Octagonal_Shape::bounded_affine_image(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + 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 known_result(2, EMPTY); + + bool ok = (Octagonal_Shape(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 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(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 known_result(2, EMPTY); + + oct.bounded_affine_image(A, Linear_Expression(3), Linear_Expression(7), -1); + + bool ok = (Octagonal_Shape(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 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(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 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(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 known_result(2, EMPTY); + + oct.bounded_affine_image(A, Linear_Expression(3), -A+2); + + bool ok = (Octagonal_Shape(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 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(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 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(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 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 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(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 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(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 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(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 known_result(oct); + + oct.bounded_affine_image(A, A, A); + + bool ok = (Octagonal_Shape(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); +#ifndef __alpha__ + // Exception handling is broken in GCC on the Alpha. + DO_TEST(test16); + DO_TEST(test17); +#endif + 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..931a4e7 --- /dev/null +++ b/tests/Octagonal_Shape/boundedaffinepreimage1.cc @@ -0,0 +1,572 @@ +/* Test Octagonal_Shape::bounded_affine_preimage(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + 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 known_result(2, EMPTY); + + oct.bounded_affine_preimage(A, Linear_Expression(7), Linear_Expression(3)); + + bool ok = (Octagonal_Shape(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 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(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 known_result(2, EMPTY); + + oct.bounded_affine_preimage(A, Linear_Expression(3), Linear_Expression(7), + -1); + + bool ok = (Octagonal_Shape(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 known_result(2, EMPTY); + + oct.bounded_affine_preimage(A, Linear_Expression(7), + Linear_Expression(3), -1); + + bool ok = (Octagonal_Shape(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 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(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 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(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 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(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 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(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 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 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 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 known_result(oct); + + oct.bounded_affine_preimage(A, A, A); + + bool ok = (Octagonal_Shape(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 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 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..bd26a6d --- /dev/null +++ b/tests/Octagonal_Shape/bounds1.cc @@ -0,0 +1,311 @@ +/* Test OctagonalShape::bounds_from_below() and + Octagonal_Shape::bounds_from_above(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + + 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..12dd772 --- /dev/null +++ b/tests/Octagonal_Shape/cc76extrapolation1.cc @@ -0,0 +1,519 @@ +/* Test Octagonal_Shape::CC76_extrapolation_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + 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 known_result(2); + known_result.add_constraint(x <= 1); + known_result.add_constraint(x - y <= 2); + + bool ok = (Octagonal_Shape(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 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(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 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(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 known_result(0); + + bool ok = (Octagonal_Shape(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 known_result(2, EMPTY); + + bool ok = (Octagonal_Shape(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 known_result(2); + known_result.add_constraint(A - B >= -2); + known_result.add_constraint(B - A >= 1); + + bool ok = (Octagonal_Shape(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 known_result(2); + + bool ok = (Octagonal_Shape(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 known_result(3); + known_result.add_constraint(B >= 1); + known_result.add_constraint(C - B <= 2); + + bool ok = (Octagonal_Shape(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 known_result(2); + known_result.add_constraint(x <= 1); + known_result.add_constraint(x - y <= 2); + + bool ok = (Octagonal_Shape(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 known_result(2); + known_result.add_constraint(B >= 0); + known_result.add_constraint(A >= 1); + +#undef TOKENS +#define TOKENS 6 + + bool ok = (Octagonal_Shape(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 known_result(2); + known_result.add_constraint(x - y <= 2); + known_result.add_constraint(x <= 1); + + bool ok = (Octagonal_Shape(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 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(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 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(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); +#ifndef __alpha__ + // Exception handling is broken in GCC on the Alpha. + DO_TEST(test10); +#endif + 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..e6ceb63 --- /dev/null +++ b/tests/Octagonal_Shape/cc76narrowing1.cc @@ -0,0 +1,264 @@ +/* Test Octagonal_Shape::CC76_narrowing_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + 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 known_result(3, EMPTY); + + bool ok = (Octagonal_Shape(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 known_result(0, EMPTY); + + oc1.CC76_narrowing_assign(oc2); + + bool ok = (Octagonal_Shape(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 known_result(2); + + bool ok = (Octagonal_Shape(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 known_result(0, EMPTY); + + oc1.CC76_narrowing_assign(oc2); + + bool ok = (Octagonal_Shape(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 known_result(0); + + oc1.CC76_narrowing_assign(oc2); + + bool ok = (Octagonal_Shape(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 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(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 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(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 known_result(2, EMPTY); + + bool ok = (Octagonal_Shape(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..288e28d --- /dev/null +++ b/tests/Octagonal_Shape/chinainit.cc @@ -0,0 +1,75 @@ +/* Simulate the initialization phase of the China analyzer. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +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..ef298ce --- /dev/null +++ b/tests/Octagonal_Shape/concatenate1.cc @@ -0,0 +1,282 @@ +/* Test Octagonal_Shape::concatenate_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x1(0); + Variable x2(1); + Variable x3(2); + Variable x4(3); + Variable x5(4); + Variable x6(5); + Variable x7(6); + Variable x8(7); + Variable x9(8); + + 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 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(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 known_result(2, EMPTY); + + bool ok = (Octagonal_Shape(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 known_result(2, EMPTY); + + bool ok = (Octagonal_Shape(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 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(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 known_result(4); + + bool ok = (Octagonal_Shape(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 known_result(oc1); + + bool ok = (Octagonal_Shape(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 known_result(0, EMPTY); + + bool ok = (Octagonal_Shape(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 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(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..9897a7a --- /dev/null +++ b/tests/Octagonal_Shape/congruences1.cc @@ -0,0 +1,249 @@ +/* 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-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + + TOctagonal_Shape oct1(2); + oct1.add_congruence((0*A %= 1) / 0); + + print_constraints(oct1, "*** oct1 ***"); + + Octagonal_Shape 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(oct2) == known_result); + + print_congruences(cgs, "*** cgs ***"); + + return ok; +} + +bool +test02() { + TOctagonal_Shape oct1(3, EMPTY); + + print_constraints(oct1, "*** oct1 ***"); + + Octagonal_Shape known_result(oct1); + + Congruence_System cgs = oct1.congruences(); + TOctagonal_Shape oct2(cgs); + + bool ok = (Octagonal_Shape(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 known_result(oct1); + + Congruence_System cgs = oct1.congruences(); + TOctagonal_Shape oct2(3); + oct2.add_congruences(cgs); + + bool ok = (Octagonal_Shape(oct2) == known_result); + + print_constraints(oct2, "*** oct2 ***"); + + return ok; +} + +bool +test04() { + TOctagonal_Shape oct1(0, EMPTY); + + print_constraints(oct1, "*** oct1 ***"); + + Octagonal_Shape 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(oct2) == known_result); + + print_congruences(cgs, "*** cgs ***"); + + return ok; +} + +bool +test05() { + TOctagonal_Shape oct1(0); + + print_constraints(oct1, "*** oct1 ***"); + + Octagonal_Shape known_result(oct1); + + Congruence_System cgs = oct1.congruences(); + TOctagonal_Shape oct2(cgs); + + bool ok = (Octagonal_Shape(oct2) == known_result); + + print_congruences(cgs, "*** cgs ***"); + + return ok; +} + +// CHECKME: is this a duplicate of test03? (was testing *_and_minimize) +bool +test06() { + Variable x(0); + Variable y(1); + Variable z(2); + + TOctagonal_Shape oct1(3); + oct1.add_congruence((x %= 1) / 0); + bool b1 = !oct1.is_empty(); + + print_constraints(oct1, "*** oct1 ***"); + + Octagonal_Shape known_result(oct1); + + Congruence_System cgs = oct1.congruences(); + TOctagonal_Shape oct2(3); + oct2.add_congruences(cgs); + bool b2 = !oct2.is_empty(); + + bool ok = b1 && b2 && (Octagonal_Shape(oct2) == known_result); + + print_constraints(oct2, "*** oct2 ***"); + + return ok; +} + +// CHECKME: is this a duplicate of test02? (was testing *_and_minimize) +bool +test07() { + TOctagonal_Shape oct1(0, EMPTY); + + print_constraints(oct1, "*** oct1 ***"); + + Octagonal_Shape known_result(oct1); + + Congruence_System cgs = oct1.congruences(); + TOctagonal_Shape oct2(cgs.space_dimension(), EMPTY); + oct2.add_congruences(cgs); + bool b = !oct2.is_empty(); + + bool ok = !b && (Octagonal_Shape(oct2) == known_result); + + print_congruences(cgs, "*** cgs ***"); + + return ok; +} + +bool +test08() { + 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 known_result(oct1); + + Congruence_System cgs = oct1.congruences(); + TOctagonal_Shape oct2(3); + oct2.refine_with_congruences(cgs); + + bool ok = (Octagonal_Shape(oct2) == known_result); + + print_constraints(oct2, "*** oct2 ***"); + + return ok; +} + +bool +test09() { + Variable x(0); + Variable y(1); + + TOctagonal_Shape oct1(2); + oct1.refine_with_congruence((x + y %= 3) / 0); + + print_constraints(oct1, "*** oct1 ***"); + + Octagonal_Shape known_result(oct1); + + Congruence_System cgs = oct1.congruences(); + + TOctagonal_Shape oct2(2); + oct2.refine_with_congruences(cgs); + + bool ok = (Octagonal_Shape(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); + DO_TEST(test08); + DO_TEST(test09); +END_MAIN + diff --git a/tests/Octagonal_Shape/constrains1.cc b/tests/Octagonal_Shape/constrains1.cc new file mode 100644 index 0000000..8eff3cc --- /dev/null +++ b/tests/Octagonal_Shape/constrains1.cc @@ -0,0 +1,231 @@ +/* Test Octagonal_Shape::constrains(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +#define 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..d3f5e65 --- /dev/null +++ b/tests/Octagonal_Shape/constraints1.cc @@ -0,0 +1,375 @@ +/* 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-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + + TOctagonal_Shape oct1(2); + oct1.add_constraint(0*A == 1); + + print_constraints(oct1, "*** oct1 ***"); + + Octagonal_Shape known_result(oct1); + + Constraint_System cs = oct1.constraints(); + TOctagonal_Shape oct2(cs); + + print_constraints(oct2, "*** oct2 ***"); + + bool ok = (Octagonal_Shape(oct2) == known_result); + + print_constraints(cs, "*** cs ***"); + + return ok; +} + +bool +test02() { + TOctagonal_Shape oct1(3, EMPTY); + + print_constraints(oct1, "*** oct1 ***"); + + Octagonal_Shape known_result(oct1); + + Constraint_System cs = oct1.constraints(); + TOctagonal_Shape oct2(cs); + + bool ok = (Octagonal_Shape(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 known_result(oct1); + + Constraint_System cs = oct1.constraints(); + TOctagonal_Shape oct2(cs); + + bool ok = (Octagonal_Shape(oct2) == known_result); + + print_constraints(cs, "*** cs ***"); + + return ok; +} + +bool +test04() { + TOctagonal_Shape oct1(0, EMPTY); + + print_constraints(oct1, "*** oct1 ***"); + + Octagonal_Shape known_result(oct1); + + Constraint_System cs = oct1.constraints(); + TOctagonal_Shape oct2(cs.space_dimension(), EMPTY); + + + bool ok = (Octagonal_Shape(oct2) == known_result); + + print_constraints(cs, "*** cs ***"); + + return ok; +} + +bool +test05() { + TOctagonal_Shape oct1(0); + + print_constraints(oct1, "*** oct1 ***"); + + Octagonal_Shape known_result(oct1); + + Constraint_System cs = oct1.constraints(); + TOctagonal_Shape oct2(cs); + + bool ok = (Octagonal_Shape(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 known_result(oct1); + + Constraint_System cs = oct1.constraints(); + TOctagonal_Shape oct2(cs); + + bool ok = (Octagonal_Shape(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 known_result(oct1); + + Constraint_System cs = oct1.constraints(); + TOctagonal_Shape oct2(cs); + + bool ok = (Octagonal_Shape(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 known_result(oct1); + + Constraint_System cs = oct1.constraints(); + TOctagonal_Shape oct2(cs); + + bool ok = (Octagonal_Shape(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 known_result(oct1); + + Constraint_System cs = oct1.constraints(); + TOctagonal_Shape oct2(cs); + + bool ok = (Octagonal_Shape(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 known_result(oct1); + + Constraint_System cs = oct1.constraints(); + TOctagonal_Shape oct2(cs); + + bool ok = (Octagonal_Shape(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 known_result(oct1); + + Constraint_System cs = oct1.constraints(); + TOctagonal_Shape oct2(cs); + + bool ok = (Octagonal_Shape(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 known_result(oct2); + + bool ok = (Octagonal_Shape(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 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 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..2f93dd3 --- /dev/null +++ b/tests/Octagonal_Shape/contains1.cc @@ -0,0 +1,349 @@ +/* Test Octagonal_Shape::contains(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + 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(0); + + print_constraints(oc1, "*** oc1 ***"); + + TOctagonal_Shape oc2(0, EMPTY); + + print_constraints(oc2, "*** oc2 ***"); + + bool contained = oc1.contains(oc2); + + nout << "*** oc1.contains(oc2) ***" << endl; + nout << (contained ? "true" : "false") << endl; + + return 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; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + 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/containsintegerpoint1.cc b/tests/Octagonal_Shape/containsintegerpoint1.cc new file mode 100644 index 0000000..a8c6bdd --- /dev/null +++ b/tests/Octagonal_Shape/containsintegerpoint1.cc @@ -0,0 +1,198 @@ +/* Test Octagonal_Shape::contains_integer_point(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + Constraint_System cs; + cs.insert(x >= 0); + cs.insert(x <= 1); + cs.insert(3*y <= 2); + cs.insert(3*y >= 1); + + Octagonal_Shape 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 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::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 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 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..bce8453 --- /dev/null +++ b/tests/Octagonal_Shape/difference1.cc @@ -0,0 +1,260 @@ +/* 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-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + 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 known_result(2, EMPTY); + + bool ok = (Octagonal_Shape(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 known_result(0, EMPTY); + + bool ok = (Octagonal_Shape(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 known_result(1); + known_result.add_constraint(A >= 0); + known_result.add_constraint(A <= 7); + + bool ok = (Octagonal_Shape(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 known_result(oct1); + + oct1.difference_assign(oct2); + + bool ok = (Octagonal_Shape(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 known_result(4, EMPTY); + + oc1.difference_assign(oc2); + + bool ok = (Octagonal_Shape(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 known_result(2, EMPTY); + print_constraints(oct2, "*** oct2 ***"); + + oct1.difference_assign(oct2); + + bool ok = (Octagonal_Shape(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 known_result(2); + known_result.add_constraint(A + B <= 1); + + oct1.difference_assign(oct2); + + bool ok = (Octagonal_Shape(oct1) == known_result); + + print_constraints(oct1, "*** oct1.difference_assign(oct2) ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); +#ifndef __alpha__ + // Exception handling is broken in GCC on the Alpha. + DO_TEST(test04); +#endif + 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..62b9e50 --- /dev/null +++ b/tests/Octagonal_Shape/discrete1.cc @@ -0,0 +1,212 @@ +/* Test Octagonal_Shape::is_discrete(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + 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..4535d0d --- /dev/null +++ b/tests/Octagonal_Shape/disjoint1.cc @@ -0,0 +1,192 @@ +/* Test Polyhedron::is_disjoint_from(const Octagonal_Shape& y). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + 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); +#ifndef __alpha__ + // Exception handling is broken in GCC on the Alpha. + DO_TEST(test06); +#endif + DO_TEST(test07); +END_MAIN diff --git a/tests/Octagonal_Shape/empty1.cc b/tests/Octagonal_Shape/empty1.cc new file mode 100644 index 0000000..0eac6b3 --- /dev/null +++ b/tests/Octagonal_Shape/empty1.cc @@ -0,0 +1,130 @@ +/* Test Octagonal_Shape::is_empty() . + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + 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..124ed9b --- /dev/null +++ b/tests/Octagonal_Shape/expandspacedim1.cc @@ -0,0 +1,294 @@ +/* Test Octagonal_Shape::expand_space_dimension(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + + 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..5f2bac4 --- /dev/null +++ b/tests/Octagonal_Shape/foldspacedims1.cc @@ -0,0 +1,441 @@ +/* Test Octagonal_Shape::fold_space_dimensions(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + 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 known_result(2); + + bool ok = (Octagonal_Shape(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 known_result(2, EMPTY); + + bool ok = (Octagonal_Shape(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 known_result(3); + known_result.add_constraint(A >= 0); + known_result.add_constraint(A - C <= 2); + + bool ok = (Octagonal_Shape(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 known_result(1); + known_result.add_constraint(A >= 1); + known_result.add_constraint(A <= 12); + + bool ok = (Octagonal_Shape(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 known_result(1); + known_result.add_constraint(A >= 1); + known_result.add_constraint(A <= 15); + + bool ok = (Octagonal_Shape(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 known_result(2); + known_result.add_constraint(A >= 0); + known_result.add_constraint(A - B <= 2); + + bool ok = (Octagonal_Shape(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 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(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 known_result(2, EMPTY); + + bool ok = (Octagonal_Shape(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 known_result(1, EMPTY); + + bool ok = (Octagonal_Shape(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 known_result(1, EMPTY); + + bool ok = (Octagonal_Shape(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/frombdshape1.cc b/tests/Octagonal_Shape/frombdshape1.cc new file mode 100644 index 0000000..549b052 --- /dev/null +++ b/tests/Octagonal_Shape/frombdshape1.cc @@ -0,0 +1,54 @@ +/* Test BD_Shape::BD_Shape(const C_Polyhedron&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + Constraint_System cs; + cs.insert(A - 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 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..8b455a9 --- /dev/null +++ b/tests/Octagonal_Shape/frombox1.cc @@ -0,0 +1,357 @@ +/* Test Octagonal_Shape::Octagonal_Shape(const Box&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Universe 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..70b173e --- /dev/null +++ b/tests/Octagonal_Shape/fromgensys1.cc @@ -0,0 +1,270 @@ +/* Test Octagonal_Shape::Octagonal_Shape(const Generator_System&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Generator_System gs; + TOctagonal_Shape oct(gs); + + Octagonal_Shape known_result(0, EMPTY); + + bool ok = (Octagonal_Shape(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 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(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 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(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 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(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 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(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 known_result(4); + known_result.add_constraint(C == 0); + + bool ok = (Octagonal_Shape(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 known_result(4); + known_result.add_constraint(B == 0); + known_result.add_constraint(C == 0); + + bool ok = (Octagonal_Shape(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..987b0d9 --- /dev/null +++ b/tests/Octagonal_Shape/fromgrid1.cc @@ -0,0 +1,201 @@ +/* Test C_Polyhedron::C_Polyhedron(const Grid&) + and NNC_Polyhedron::NNC_Polyhedron(const Grid&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// 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 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 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 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 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 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 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 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 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..5eaf44f --- /dev/null +++ b/tests/Octagonal_Shape/fromoctagonalshape1.cc @@ -0,0 +1,132 @@ +/* Test Octagonal_Shape copy construct, construction from other + Octagonal shapes and assignment. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + Constraint_System cs; + cs.insert(A + 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 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 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 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 os(os1); + + Octagonal_Shape 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..7045135 --- /dev/null +++ b/tests/Octagonal_Shape/frompolyhedron1.cc @@ -0,0 +1,244 @@ +/* Test Octagonal_Shape::Octagonal_Shape(const C_Polyhedron&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + Constraint_System cs; + cs.insert(A + 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 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 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 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 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 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 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 known_result(2); + known_result.add_constraint(A <= 0); + known_result.add_constraint(B == -2); + + bool ok = (Octagonal_Shape(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 known_result(2, EMPTY); + + bool ok = (oct1 == oct2 + && Octagonal_Shape(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..20b323a --- /dev/null +++ b/tests/Octagonal_Shape/fromspacedim1.cc @@ -0,0 +1,122 @@ +/* Test Octagonal_Shape::Octagonal_Shape(dimension_type, Degenerate_Element). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + 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..75cec03 --- /dev/null +++ b/tests/Octagonal_Shape/generalizedaffineimage1.cc @@ -0,0 +1,603 @@ +/* Test Octagonal_Shape::generalized_affine_image(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + 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 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(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 known_result(oct); + + oct.generalized_affine_image(A, EQUAL, A + 2); + + known_result.affine_image(A, A + 2); + + bool ok = (Octagonal_Shape(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 known_result(2, EMPTY); + + oct.generalized_affine_image(A, LESS_OR_EQUAL, B + 1); + + bool ok = (Octagonal_Shape(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 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(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 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(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 known_result(2 , EMPTY); + + oct.generalized_affine_image(y, LESS_OR_EQUAL, Linear_Expression(2)); + + bool ok = (Octagonal_Shape(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 known_result(oct); + + oct.generalized_affine_image(x, EQUAL, Linear_Expression(6)); + + bool ok = (Octagonal_Shape(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 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(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 known_result(oct); + known_result.affine_image(B, Linear_Expression(5)); + + oct.generalized_affine_image(B, EQUAL, Linear_Expression(5)); + + bool ok = (Octagonal_Shape(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 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(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 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(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 known_result(oct); + known_result.affine_image(C, C + 1); + + oct.generalized_affine_image(C, EQUAL, C + 1); + + bool ok = (Octagonal_Shape(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 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(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 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(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 known_result(oct); + known_result.affine_image(B, C + 3); + + oct.generalized_affine_image(B, EQUAL, C + 3); + + bool ok = (Octagonal_Shape(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 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(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 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(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 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(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 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(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 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(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..2f23b7e --- /dev/null +++ b/tests/Octagonal_Shape/generalizedaffineimage2.cc @@ -0,0 +1,356 @@ +/* Test Octagonal_Shape::generalized_affine_image(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + 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 known_result(2, EMPTY); + + oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2); + + bool ok = (Octagonal_Shape(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 known_result(oct); + + oct.generalized_affine_image(e1, EQUAL, e2); + + bool ok = (Octagonal_Shape(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 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(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 known_result(oct); + known_result.affine_image(A, Linear_Expression(-1)); + + oct.generalized_affine_image(e1, EQUAL, e2); + + bool ok = (Octagonal_Shape(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 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(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 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(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 known_result(oct); + known_result.affine_image(C, A + 1); + + oct.generalized_affine_image(e1, EQUAL, e2); + + bool ok = (Octagonal_Shape(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 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(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 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(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 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(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 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(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..a62f328 --- /dev/null +++ b/tests/Octagonal_Shape/generalizedaffineimage3.cc @@ -0,0 +1,595 @@ +/* Test Octagonal_Shape::generalized_affine_image(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + 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 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(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 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(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 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(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 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(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 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 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(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 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(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 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(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 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(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 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(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 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(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 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(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); +#ifndef __alpha__ + // Exception handling is broken in GCC on the Alpha. + DO_TEST(test11); + DO_TEST(test12); + DO_TEST(test13); + DO_TEST(test14); + DO_TEST(test15); + DO_TEST(test16); + DO_TEST(test17); + DO_TEST(test18); +#endif + 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..3fca8d9 --- /dev/null +++ b/tests/Octagonal_Shape/generalizedaffineimage4.cc @@ -0,0 +1,380 @@ +/* Test Octagonal_Shape::generalized_affine_image(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + 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 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(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 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 known_result(2); + + oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2); + + bool ok = (Octagonal_Shape(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 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 known_result(2); + + oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2); + + bool ok = (Octagonal_Shape(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 known_result(3); + known_result.add_constraint(A <= 1);; + + oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2); + + bool ok = (Octagonal_Shape(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 known_result(3); + known_result.add_constraint(A <= 1); + + oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2); + + bool ok = (Octagonal_Shape(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 known_result(3); + + oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2); + + bool ok = (Octagonal_Shape(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 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(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 known_result(3, EMPTY); + + oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2); + + bool ok = (Octagonal_Shape(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 known_result(3); + known_result.add_constraint(B <= 1); + + oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2); + + bool ok = (Octagonal_Shape(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 known_result(3); + known_result.add_constraint(B <= 1); + + oct.generalized_affine_image(e1, EQUAL, e2); + + bool ok = (Octagonal_Shape(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..0a3efb1 --- /dev/null +++ b/tests/Octagonal_Shape/generalizedaffineimage5.cc @@ -0,0 +1,343 @@ +/* Test Octagonal_Shape::generalized_affine_image(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + Variable C(2); + + 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 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 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 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 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 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 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 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 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 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 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..7f6f979 --- /dev/null +++ b/tests/Octagonal_Shape/generalizedaffinepreimage1.cc @@ -0,0 +1,617 @@ +/* Test Octagonal_Shape::generalized_affine_preimage(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include + +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 known_result(2); + known_result.add_constraint(2*A == 1); + + bool ok = (Octagonal_Shape(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 known_result(2, EMPTY); + + bool ok = (Octagonal_Shape(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 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 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 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 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 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 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 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::is_bounded + && (std::numeric_limits::min() > -203 + || std::numeric_limits::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 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 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 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 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 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 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 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 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(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 known_result(3, EMPTY); + + oct.generalized_affine_preimage(B, EQUAL, 3*A+2); + + bool ok = (Octagonal_Shape(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 known_result(2); + known_result.add_constraint(B <= 3); + + bool ok = (Octagonal_Shape(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 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..7d06fed --- /dev/null +++ b/tests/Octagonal_Shape/generalizedaffinepreimage2.cc @@ -0,0 +1,622 @@ +/* Test Octagonal_Shape::generalized_affine_preimage(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + Variable z(2); + + 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 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 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 known_result(2, EMPTY); + + oct.generalized_affine_preimage(A, GREATER_OR_EQUAL, -B + 3, 5); + + bool ok = (Octagonal_Shape(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 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(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 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(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 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(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 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(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 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(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 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(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 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(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 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(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 known_result(2); + known_result.add_constraint(A <= 3); + + oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2); + + bool ok = (Octagonal_Shape(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 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(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 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(oct) == known_result); + + print_constraints(oct, + "*** oct.generalized_affine_preimage(-C + B - 2, " + "LESS_OR_EQUAL, B + 1) ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN +#ifndef __alpha__ + // Exception handling is broken in GCC on the Alpha. + DO_TEST(test01); +#endif + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + 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..98b5afb --- /dev/null +++ b/tests/Octagonal_Shape/generalizedaffinepreimage3.cc @@ -0,0 +1,620 @@ +/* Test Octagonal_Shape::generalized_affine_preimage(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + Variable C(2); + + 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 known_result(3); + + oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2); + + bool ok = (Octagonal_Shape(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 known_result(2); + known_result.add_constraint(B >= -4); + + oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2); + + bool ok = (Octagonal_Shape(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 known_result(2, EMPTY); + + oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2); + + bool ok = (Octagonal_Shape(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 known_result(3); + + oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2); + + bool ok = (Octagonal_Shape(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 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(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 known_result(4, EMPTY); + + oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2); + + bool ok = (Octagonal_Shape(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 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(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 known_result(2, EMPTY); + + oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2); + + bool ok = (Octagonal_Shape(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 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(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 known_result(2, EMPTY); + + oct.generalized_affine_preimage(A, LESS_OR_EQUAL, B + 2); + + bool ok = (Octagonal_Shape(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 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(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 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(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 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 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(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 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(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 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(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 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); +#ifndef __alpha__ + // Exception handling is broken in GCC on the Alpha. + DO_TEST(test04); +#endif + DO_TEST(test05); + 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..2ef3c60 --- /dev/null +++ b/tests/Octagonal_Shape/generalizedaffinepreimage4.cc @@ -0,0 +1,637 @@ +/* Test Octagonal_Shape::generalized_affine_preimage(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + Variable C(2); + + 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 known_result(3, EMPTY); + + oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2); + + bool ok = (Octagonal_Shape(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 known_result(2); + known_result.add_constraint(A <= -1); + + oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2); + + bool ok = (Octagonal_Shape(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 known_result(4); + known_result.add_constraint(B <= 1); + + oct.generalized_affine_preimage(e1, EQUAL, e2); + + bool ok = (Octagonal_Shape(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 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(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 known_result(4); + + oct.generalized_affine_preimage(e1, EQUAL, e2); + + bool ok = (Octagonal_Shape(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/intersection1.cc b/tests/Octagonal_Shape/intersection1.cc new file mode 100644 index 0000000..2ad9fdb --- /dev/null +++ b/tests/Octagonal_Shape/intersection1.cc @@ -0,0 +1,376 @@ +/* Test Octagonal_Shape::intersection_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + 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 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(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 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(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 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(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 known_result(3, EMPTY); + + oc1.intersection_assign(oc2); + + bool ok = (Octagonal_Shape(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 known_result(0, EMPTY); + + oc1.intersection_assign(oc2); + + bool ok = (Octagonal_Shape(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 known_result(0); + + oc1.intersection_assign(oc2); + + bool ok = (Octagonal_Shape(oc1) == known_result); + + print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***"); + + return ok; +} + +// CHECKME: is this now duplicating test01? +// (was originally testing *_and_minimize) +bool +test07() { + 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 ***"); + + oc1.intersection_assign(oc2); + + Constraint_System cs; + cs.insert(x <= 3); + cs.insert(-y <= -2); + cs.insert(x - y <= 4); + cs.insert(x + y <= 6); + + Octagonal_Shape known_result(3); + known_result.add_constraints(cs); + + bool ok = (Octagonal_Shape(oc1) == known_result); + + print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***"); + + return ok; +} + +bool +test08() { + 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; +} + +// CHECKME: is this now duplicating test08? +// (was originally testing *_and_minimize) +bool +test09() { + Variable x(0); + Variable y(1); + + TOctagonal_Shape oc1(7); + + TOctagonal_Shape oc2(15); + + 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 +test10() { + 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 known_result(3, EMPTY); + + oc1.intersection_assign(oc2); + + bool ok = (Octagonal_Shape(oc1) == known_result); + + print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***"); + + return ok; +} + +bool +test11() { + 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 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(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); + DO_TEST(test10); + DO_TEST(test11); +END_MAIN diff --git a/tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc b/tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc new file mode 100644 index 0000000..4ca8ddb --- /dev/null +++ b/tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc @@ -0,0 +1,339 @@ +/* Test Octagonal_Shape::limited_BHMZ05_extrapolation_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + Constraint_System cs1; + cs1.insert(x >= 0); + cs1.insert(x <= 1); + cs1.insert(y == 0); + + 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 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(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 known_result(1); + known_result.add_constraint(x >= 0); + known_result.add_constraint(x <= 1); + + bool ok = (Octagonal_Shape(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 known_result(0, EMPTY); + + bool ok = (Octagonal_Shape(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 known_result(3, EMPTY); + + bool ok = (Octagonal_Shape(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 known_result(3); + known_result.add_constraint(A - B <= 1); + + bool ok = (Octagonal_Shape(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 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(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..ce37303 --- /dev/null +++ b/tests/Octagonal_Shape/limitedcc76extrapolation1.cc @@ -0,0 +1,660 @@ +/* Test Octagonal_Shape::limited_CC76_extrapolation_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + Constraint_System cs1; + cs1.insert(x <= 1); + cs1.insert(y >= 4); + 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 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(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 known_result(0); + + bool ok = (Octagonal_Shape(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 known_result(2); + known_result.add_constraint(A == -2); + + bool ok = (Octagonal_Shape(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 known_result(2); + + + bool ok = (Octagonal_Shape(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 known_result(3); + known_result.add_constraint(A <= 5); + known_result.add_constraint(B >= 1); + + bool ok = (Octagonal_Shape(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 known_result(2); + known_result.add_constraint(B >= 1); + + bool ok = (Octagonal_Shape(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 known_result(2); + known_result.add_constraint(B >= 1); + known_result.add_constraint(A - B <= 6); + + bool ok = (Octagonal_Shape(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 known_result(2, EMPTY); + + bool ok = (Octagonal_Shape(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 known_result(2); + known_result.add_constraint(A <= 4); + known_result.add_constraint(B >= 1); + + bool ok = (Octagonal_Shape(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 known_result(4); + known_result.add_constraint(A <= 4); + known_result.add_constraint(C - D == 5); + + bool ok = (Octagonal_Shape(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 known_result(2); + known_result.add_constraint(A <= 4); + known_result.add_constraint(B >= 1); + + bool ok = (Octagonal_Shape(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 known_result(2, EMPTY); + + bool ok = (Octagonal_Shape(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 known_result(3); + known_result.add_constraint(C <= 4); + known_result.add_constraint(B >= 2); + + bool ok = (Octagonal_Shape(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 known_result(3, EMPTY); + + bool ok = (Octagonal_Shape(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 known_result(3); + known_result.add_constraint(A - B <= 1); + + bool ok = (Octagonal_Shape(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..88d824f --- /dev/null +++ b/tests/Octagonal_Shape/mapspacedims1.cc @@ -0,0 +1,254 @@ +/* Test Octagonal_Shape::map_space_dimensions(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Partial_Function function; + + TOctagonal_Shape oc1(3); + + print_function(function, "*** function ***"); + print_constraints(oc1, "*** oc1 ***"); + + oc1.map_space_dimensions(function); + + Octagonal_Shape known_result; + + bool ok = (Octagonal_Shape(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 known_result(0, EMPTY); + + bool ok = (Octagonal_Shape(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 known_result(2, EMPTY); + + bool ok = (Octagonal_Shape(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 known_result(2); + known_result.add_constraint(x == 1); + known_result.add_constraint(y - x <= 3); + + bool ok = (Octagonal_Shape(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 known_result(1); + known_result.add_constraint(x <= 4); + + bool ok = (Octagonal_Shape(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 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(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 known_result; + + bool ok = (Octagonal_Shape(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 known_result(3, EMPTY); + + oc1.map_space_dimensions(function); + + bool ok = (Octagonal_Shape(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..c0915ac --- /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-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x1(0); + Variable x2(1); + + 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 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 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..60cadea --- /dev/null +++ b/tests/Octagonal_Shape/max_min2.cc @@ -0,0 +1,310 @@ +/* Test Octagonal_Shape::maximize(const Linear_Expression&, ...) + and Octagonal_Shape::minimize(const Linear_Expression&, ...). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + 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..e49dfdf --- /dev/null +++ b/tests/Octagonal_Shape/maxspacedim1.cc @@ -0,0 +1,98 @@ +/* Test Octagonal_Shape::max_space_dimension(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + nout << Octagonal_Shape::max_space_dimension() + << " (signed char)" + << endl + << Octagonal_Shape::max_space_dimension() << " (short)" + << endl + << Octagonal_Shape::max_space_dimension() << " (int)" + << endl + << Octagonal_Shape::max_space_dimension() << " (long)" + << endl + << Octagonal_Shape::max_space_dimension() << " (long long)" + << endl +#if PPL_SUPPORTED_FLOAT + << Octagonal_Shape::max_space_dimension() << " (float)" + << endl +#endif +#if PPL_SUPPORTED_DOUBLE + << Octagonal_Shape::max_space_dimension() << " (double)" + << endl +#endif +#if PPL_SUPPORTED_LONG_DOUBLE + << Octagonal_Shape::max_space_dimension() + << " (long double)" + << endl +#endif + << Octagonal_Shape::max_space_dimension() << " (mpz_class)" + << endl + << Octagonal_Shape::max_space_dimension() << " (mpq_class)" + << endl; + + if (Octagonal_Shape::max_space_dimension() + < Octagonal_Shape::max_space_dimension()) + return false; + + if (Octagonal_Shape::max_space_dimension() + < Octagonal_Shape::max_space_dimension()) + return false; + + if (Octagonal_Shape::max_space_dimension() + < Octagonal_Shape::max_space_dimension()) + return false; + + if (Octagonal_Shape::max_space_dimension() + < Octagonal_Shape::max_space_dimension()) + return false; + +#if PPL_SUPPORTED_FLOAT && PPL_SUPPORTED_DOUBLE + if (Octagonal_Shape::max_space_dimension() + < Octagonal_Shape::max_space_dimension()) + return false; +#endif + +#if PPL_SUPPORTED_DOUBLE && PPL_SUPPORTED_LONG_DOUBLE + if (Octagonal_Shape::max_space_dimension() + < Octagonal_Shape::max_space_dimension()) + return false; +#endif + + if (2*Octagonal_Shape::max_space_dimension() + < Octagonal_Shape::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..8246c8e --- /dev/null +++ b/tests/Octagonal_Shape/membytes1.cc @@ -0,0 +1,232 @@ +/* Test the total_memory_in_bytes() and external_memory_in_bytes() methods. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +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 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 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 pqoct(qoct); + + Pointset_Powerset 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..abf41a2 --- /dev/null +++ b/tests/Octagonal_Shape/minconstraints1.cc @@ -0,0 +1,134 @@ +/* Test Octagonal_Shape::minimized_constraints(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + 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..5487743 --- /dev/null +++ b/tests/Octagonal_Shape/relatwithcons1.cc @@ -0,0 +1,595 @@ +/* Test Octagonal_Shape::relation_with(c). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + 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..b763558 --- /dev/null +++ b/tests/Octagonal_Shape/relatwithcons2.cc @@ -0,0 +1,475 @@ +/* Test Octagonal_Shape::relation_with(c). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + // The zero-dim universe 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); + } + 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 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 %= 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..221c394 --- /dev/null +++ b/tests/Octagonal_Shape/relatwithcons3.cc @@ -0,0 +1,508 @@ +/* Test Octagonal_Shape::relation_with(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + Constraint_System cs; + cs.insert(A >= 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..b75a697 --- /dev/null +++ b/tests/Octagonal_Shape/relatwithgen1.cc @@ -0,0 +1,495 @@ +/* Test Octagonal_Shape::relation_with(g): we verify that a generator + is not subsumed by an empty octagon. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + + 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)); + } + 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..78c10c5 --- /dev/null +++ b/tests/Octagonal_Shape/removespacedims1.cc @@ -0,0 +1,374 @@ +/* Remove the higher variables from the space. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x2(1); + + TOctagonal_Shape oct1(3); + oct1.add_constraint(x2 <= 3); + + print_constraints(oct1, "*** oct1 ***"); + + oct1.remove_higher_space_dimensions(2); + + Octagonal_Shape known_result(2); + known_result.add_constraint(x2 <= 3); + + bool ok = (Octagonal_Shape(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 known_result(4); + known_result.add_constraint(x2 <= 2); + + bool ok = (Octagonal_Shape(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 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(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 known_result(7, EMPTY); + + bool ok = (Octagonal_Shape(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 known_result(0, EMPTY); + + bool ok = (Octagonal_Shape(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 known_result(oc); + + bool ok = (Octagonal_Shape(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 known_result(oc); + + bool ok = (Octagonal_Shape(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 known_result(oct1); + + bool ok = (Octagonal_Shape(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 known_result(0, UNIVERSE); + + bool ok = (Octagonal_Shape(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 known_result(0, UNIVERSE); + + bool ok = (Octagonal_Shape(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..bf55f87 --- /dev/null +++ b/tests/Octagonal_Shape/run_tests @@ -0,0 +1,53 @@ +#!/bin/sh + +# Run the Octagonal_Shape tests. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/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..2763d75 --- /dev/null +++ b/tests/Octagonal_Shape/simplifyusingcontext1.cc @@ -0,0 +1,339 @@ +/* Test Octagonal_Shape::simplify_using_context_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + 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..5bbcc1d --- /dev/null +++ b/tests/Octagonal_Shape/timeelapse1.cc @@ -0,0 +1,371 @@ +/* Test time_elapse_assign() for particular polyhedra. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + 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 known_result(2, EMPTY); + + bool ok = (Octagonal_Shape(oc1) == known_result) && + (Octagonal_Shape(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 known_result(2); + known_result.add_constraint(x >= 0); + known_result.add_constraint(y >= 0); + + bool ok = (Octagonal_Shape(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 known_result(2); + known_result.add_constraint(y >= 1); + + bool ok = (Octagonal_Shape(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 known_result(oc2); + + bool ok = (Octagonal_Shape(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 known_result(3); + + bool ok = (Octagonal_Shape(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 known_result(3, EMPTY); + + bool ok = (Octagonal_Shape(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 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(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 known_result(3, EMPTY); + + bool ok = (Octagonal_Shape(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 known_result(6); + + bool ok = (Octagonal_Shape(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..da6ea1d --- /dev/null +++ b/tests/Octagonal_Shape/unconstrain1.cc @@ -0,0 +1,231 @@ +/* Test Octagonal_Shape::unconstrain(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + 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; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + DO_TEST(test06); +#ifndef __alpha__ + // Exception handling is broken in GCC on the Alpha. + DO_TEST(test07); +#endif + DO_TEST(test08); + DO_TEST(test09); +END_MAIN diff --git a/tests/Octagonal_Shape/universe1.cc b/tests/Octagonal_Shape/universe1.cc new file mode 100644 index 0000000..f974ae7 --- /dev/null +++ b/tests/Octagonal_Shape/universe1.cc @@ -0,0 +1,111 @@ +/* Test Octagonal_Shape::is_universe(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + Variable z(2); + + 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..dec2285 --- /dev/null +++ b/tests/Octagonal_Shape/upperbound1.cc @@ -0,0 +1,390 @@ +/* Test Octagonal_Shape::poly_hull_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x1(0); + Variable x2(1); + + 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 known_result(2); + known_result.add_constraint(x1 - x2 <= 3); + + bool ok = (Octagonal_Shape(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 known_result(2); + known_result.add_constraint(x1 + x2 >= 1); + + bool ok = (Octagonal_Shape(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 known_result(5); + known_result.add_constraint(x1 <= 5); + known_result.add_constraint(x1 - x2 <= 20); + + bool ok = (Octagonal_Shape(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 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(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 known_result(oct2); + + bool ok = (Octagonal_Shape(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 known_result(cs1); + + bool ok = (Octagonal_Shape(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 known_result; + + bool ok = (Octagonal_Shape(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 known_result(8); + + bool ok = (Octagonal_Shape(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 known_result(3); + known_result.add_constraint(x1 <= 2); + known_result.add_constraint(x1 + x2 <= 2); + + bool ok = (Octagonal_Shape(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 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(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..350fb9a --- /dev/null +++ b/tests/Octagonal_Shape/upperboundifexact1.cc @@ -0,0 +1,386 @@ +/* Test Octagonal_Shape::upper_bound_assign_if_exact(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + 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 octs1(2, UNIVERSE); + octs1.add_constraint(x >= -2); + octs1.add_constraint(x <= -1); + octs1.add_constraint(y >= 0); + octs1.add_constraint(y <= 2); + + print_constraints(octs1, "*** octs1 ***"); + + TOctagonal_Shape octs2(2, UNIVERSE); + octs2.add_constraint(x >= 1); + octs2.add_constraint(x <= 2); + octs2.add_constraint(y >= 0); + octs2.add_constraint(y <= 2); + + print_constraints(octs2, "*** octs2 ***"); + + TOctagonal_Shape known_result(octs1); + + bool ok = !octs1.upper_bound_assign_if_exact(octs2); + ok &= (octs1 == known_result); + + print_constraints(octs1, "*** octs1.upper_bound_assign_if_exact(octs2) ***"); + + return ok; +} + +bool +test03() { + Variable x(0); + Variable y(1); + + TOctagonal_Shape octs1(2, UNIVERSE); + octs1.add_constraint(x >= -2); + octs1.add_constraint(x <= 0); + octs1.add_constraint(y >= 0); + octs1.add_constraint(y <= 2); + + print_constraints(octs1, "*** octs1 ***"); + + TOctagonal_Shape octs2(2, UNIVERSE); + octs2.add_constraint(x >= 0); + octs2.add_constraint(x <= 2); + octs2.add_constraint(y >= 0); + octs2.add_constraint(y <= 2); + + print_constraints(octs2, "*** octs2 ***"); + + 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 = octs1.upper_bound_assign_if_exact(octs2); + ok &= (octs1 == known_result); + + print_constraints(octs1, "*** octs1.upper_bound_assign_if_exact(octs2) ***"); + + return ok; +} + +bool +test04() { + Variable x(0); + Variable y(1); + + TOctagonal_Shape octs1(2, UNIVERSE); + octs1.add_constraint(x == 0); + octs1.add_constraint(y == 0); + + print_constraints(octs1, "*** octs1 ***"); + + TOctagonal_Shape octs2(2, UNIVERSE); + octs2.add_constraint(x >= 0); + octs2.add_constraint(x <= 2); + octs2.add_constraint(y >= -2); + octs2.add_constraint(y <= 2); + + print_constraints(octs2, "*** octs2 ***"); + + TOctagonal_Shape known_result(octs2); + + bool ok = octs1.upper_bound_assign_if_exact(octs2); + ok &= (octs1 == known_result); + + print_constraints(octs1, "*** octs1.upper_bound_assign_if_exact(octs2) ***"); + + return ok; +} + +bool +test05() { + Variable x(0); + Variable y(1); + + TOctagonal_Shape octs1(2, UNIVERSE); + octs1.add_constraint(x >= 0); + octs1.add_constraint(y == 0); + + print_constraints(octs1, "*** octs1 ***"); + + TOctagonal_Shape octs2(2, UNIVERSE); + octs2.add_constraint(x >= 0); + octs2.add_constraint(y >= 2); + octs2.add_constraint(y <= 4); + + print_constraints(octs2, "*** octs2 ***"); + + TOctagonal_Shape known_result(octs1); + + bool ok = !octs1.upper_bound_assign_if_exact(octs2); + ok &= (octs1 == known_result); + + print_constraints(octs1, "*** octs1.upper_bound_assign_if_exact(octs2) ***"); + + return ok; +} + +bool +test06() { + Variable x(0); + Variable y(1); + + TOctagonal_Shape octs1(2, UNIVERSE); + octs1.add_constraint(x == y); + + print_constraints(octs1, "*** octs1 ***"); + + TOctagonal_Shape octs2(2, UNIVERSE); + octs2.add_constraint(x == 0); + + print_constraints(octs2, "*** octs2 ***"); + + TOctagonal_Shape known_result(octs1); + + bool ok = !octs1.upper_bound_assign_if_exact(octs2); + ok &= (octs1 == known_result); + + print_constraints(octs1, "*** octs1.upper_bound_assign_if_exact(octs2) ***"); + + return ok; +} + +bool +test07() { + Variable x(0); + Variable y(1); + + TOctagonal_Shape octs1(2, UNIVERSE); + octs1.add_constraint(x >= y); + + print_constraints(octs1, "*** octs1 ***"); + + TOctagonal_Shape octs2(2, UNIVERSE); + octs2.add_constraint(x >= 0); + + print_constraints(octs2, "*** octs2 ***"); + + TOctagonal_Shape known_result(octs1); + + bool ok = !octs1.upper_bound_assign_if_exact(octs2); + ok &= (octs1 == known_result); + + print_constraints(octs1, "*** octs1.upper_bound_assign_if_exact(octs2) ***"); + + return ok; +} + +bool +test08() { + Variable x(0); + Variable y(1); + + TOctagonal_Shape octs1(2, UNIVERSE); + octs1.add_constraint(x >= y); + + print_constraints(octs1, "*** octs1 ***"); + + TOctagonal_Shape octs2(2, UNIVERSE); + octs2.add_constraint(x <= y); + + print_constraints(octs2, "*** octs2 ***"); + + TOctagonal_Shape known_result(2, UNIVERSE); + + bool ok = octs1.upper_bound_assign_if_exact(octs2); + ok &= (octs1 == known_result); + + print_constraints(octs1, "*** octs1.upper_bound_assign_if_exact(octs2) ***"); + + 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 octs1(octs); + octs1.add_constraint(z <= 3); + + print_constraints(octs1, "*** octs1 ***"); + + TOctagonal_Shape octs2(octs); + octs2.add_constraint(x - y <= 1); + + TOctagonal_Shape known_result(octs); + + C_Polyhedron ph1(octs1); + C_Polyhedron ph2(octs2); + + 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 = octs1.upper_bound_assign_if_exact(octs2); + + ok &= (octs1 == octs); + + print_constraints(octs1, "*** octs1.upper_bound_assign_if_exact(octs2) ***"); + + 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 octs1(octs); + octs1.add_constraint(x - y <= 2); + + print_constraints(octs1, "*** octs1 ***"); + + TOctagonal_Shape octs2(octs); + octs2.add_constraint(z - w <= 2); + + TOctagonal_Shape known_result(octs); + + bool ok = octs1.upper_bound_assign_if_exact(octs2); + ok &= (octs1 == octs); + + print_constraints(octs1, "*** octs1.upper_bound_assign_if_exact(octs2) ***"); + + 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; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + 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/writeoctagon1.cc b/tests/Octagonal_Shape/writeoctagon1.cc new file mode 100644 index 0000000..8f86868 --- /dev/null +++ b/tests/Octagonal_Shape/writeoctagon1.cc @@ -0,0 +1,210 @@ +/* Test operator<<(ostream&, const Octagonal_Shape&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +using namespace IO_Operators; + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + 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 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 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/Partial_Function.cc b/tests/Partial_Function.cc new file mode 100644 index 0000000..06e7e4e --- /dev/null +++ b/tests/Partial_Function.cc @@ -0,0 +1,80 @@ +/* Implementation of class Partial_Function (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl.hh" +#include "Partial_Function.defs.hh" +#include +#include + +namespace Parma_Polyhedra_Library { + +namespace Test { + +void +Partial_Function::insert(dim_t x, dim_t y) { + std::pair stat = map.insert(Map::value_type(x, y)); + if (!stat.second) + throw std::runtime_error("Partial_Function::insert(x, y) called" + " with `x' already in domain"); + if (y > max) + max = y; +} + +Partial_Function::dim_t +Partial_Function::max_in_codomain() const { + if (has_empty_codomain()) + throw std::runtime_error("Partial_Function::max_in_codomain() called" + " when has_empty_codomain()"); + return max; +} + +bool +Partial_Function::maps(dim_t x, dim_t& y) const { + if (has_empty_codomain()) + throw std::runtime_error("Partial_Function::maps() called" + " when has_empty_codomain()"); + Map::const_iterator i = map.find(x); + if (i != map.end()) { + y = (*i).second; + return true; + } + else + return false; +} + +void +Partial_Function::print(std::ostream& s) const { + using namespace Parma_Polyhedra_Library::IO_Operators; + + if (has_empty_codomain()) + s << "empty" << std::endl; + else + for (Map::const_iterator i = map.begin(), + map_end = map.end(); i != map_end; ++i) + s << Variable((*i).first) << " --> " + << Variable((*i).second) + << std::endl; +} + +} // namespace Test + +} // namespace Parma_Polyhedra_Library diff --git a/tests/Partial_Function.defs.hh b/tests/Partial_Function.defs.hh new file mode 100644 index 0000000..bf197d5 --- /dev/null +++ b/tests/Partial_Function.defs.hh @@ -0,0 +1,61 @@ +/* Partial_Function class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Partial_Function_defs_hh +#define PPL_Partial_Function_defs_hh 1 + +#include "Partial_Function.types.hh" +#include +#include +#include + +namespace Parma_Polyhedra_Library { + +namespace Test { + +class Partial_Function { +private: + typedef size_t dim_t; + +public: + Partial_Function(); + bool has_empty_codomain() const; + dim_t max_in_codomain() const; + bool maps(dim_t i, dim_t& j) const; + + void print(std::ostream& s) const; + + void insert(dim_t x, dim_t y); + +private: + typedef std::map > Map; + Map map; + dim_t max; +}; + +} // namespace Test + +} // namespace Parma_Polyhedra_Library + +#include "Partial_Function.inlines.hh" + +#endif // !defined(PPL_Partial_Function_defs_hh) diff --git a/tests/Partial_Function.inlines.hh b/tests/Partial_Function.inlines.hh new file mode 100644 index 0000000..664d0a8 --- /dev/null +++ b/tests/Partial_Function.inlines.hh @@ -0,0 +1,44 @@ +/* Partial_Function class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Partial_Function_inlines_hh +#define PPL_Partial_Function_inlines_hh 1 + +namespace Parma_Polyhedra_Library { + +namespace Test { + +inline +Partial_Function::Partial_Function() + : max(0) { +} + +inline bool +Partial_Function::has_empty_codomain() const { + return map.empty(); +} + +} // namespace Test + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Partial_Function_inlines_hh) diff --git a/tests/Partial_Function.types.hh b/tests/Partial_Function.types.hh new file mode 100644 index 0000000..d1822d2 --- /dev/null +++ b/tests/Partial_Function.types.hh @@ -0,0 +1,25 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +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 { + +namespace Test { + +class Partial_Function; + +} // namespace Test + +} // namespace Parma_Polyhedra_Library + +#endif // !defined(PPL_Partial_Function_types_hh) diff --git a/tests/Partially_Reduced_Product/Makefile.am b/tests/Partially_Reduced_Product/Makefile.am new file mode 100644 index 0000000..0279540 --- /dev/null +++ b/tests/Partially_Reduced_Product/Makefile.am @@ -0,0 +1,91 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +# USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +if VALGRIND_TESTS_ENABLED + +CHECKER = \ +$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \ +--num-callers=100 --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 \ +@extra_includes@ \ +@debug_flag@ + +LDADD = \ +$(top_builddir)/utils/libppl_utils.a \ +$(top_builddir)/tests/libppl_tests.a \ +$(top_builddir)/src/libppl.la \ +@extra_libraries@ + +TESTS = \ +asciidumpload1 \ +directproduct1 directproduct2 directproduct3 directproduct4 \ +directproduct5 directproduct6 \ +partiallyreducedproduct1 partiallyreducedproduct2 partiallyreducedproduct3 \ +partiallyreducedproduct4 + +XFAIL_TESTS = + +# +# Sources for the tests +# + +asciidumpload1_SOURCES = asciidumpload1.cc + +directproduct1_SOURCES = directproduct1.cc +directproduct2_SOURCES = directproduct2.cc +directproduct3_SOURCES = directproduct3.cc +directproduct4_SOURCES = directproduct4.cc +directproduct5_SOURCES = directproduct5.cc +directproduct6_SOURCES = directproduct6.cc + +partiallyreducedproduct1_SOURCES = partiallyreducedproduct1.cc +partiallyreducedproduct2_SOURCES = partiallyreducedproduct2.cc +partiallyreducedproduct3_SOURCES = partiallyreducedproduct3.cc +partiallyreducedproduct4_SOURCES = partiallyreducedproduct4.cc + +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..24158a2 --- /dev/null +++ b/tests/Partially_Reduced_Product/Makefile.in @@ -0,0 +1,815 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +# USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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 = asciidumpload1$(EXEEXT) directproduct1$(EXEEXT) \ + directproduct2$(EXEEXT) directproduct3$(EXEEXT) \ + directproduct4$(EXEEXT) directproduct5$(EXEEXT) \ + directproduct6$(EXEEXT) partiallyreducedproduct1$(EXEEXT) \ + partiallyreducedproduct2$(EXEEXT) \ + partiallyreducedproduct3$(EXEEXT) \ + partiallyreducedproduct4$(EXEEXT) +XFAIL_TESTS = +check_PROGRAMS = $(am__EXEEXT_1) +subdir = tests/Partially_Reduced_Product +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__EXEEXT_1 = asciidumpload1$(EXEEXT) directproduct1$(EXEEXT) \ + directproduct2$(EXEEXT) directproduct3$(EXEEXT) \ + directproduct4$(EXEEXT) directproduct5$(EXEEXT) \ + directproduct6$(EXEEXT) partiallyreducedproduct1$(EXEEXT) \ + partiallyreducedproduct2$(EXEEXT) \ + partiallyreducedproduct3$(EXEEXT) \ + partiallyreducedproduct4$(EXEEXT) +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_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_directproduct2_OBJECTS = directproduct2.$(OBJEXT) +directproduct2_OBJECTS = $(am_directproduct2_OBJECTS) +directproduct2_LDADD = $(LDADD) +directproduct2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_directproduct3_OBJECTS = directproduct3.$(OBJEXT) +directproduct3_OBJECTS = $(am_directproduct3_OBJECTS) +directproduct3_LDADD = $(LDADD) +directproduct3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_directproduct4_OBJECTS = directproduct4.$(OBJEXT) +directproduct4_OBJECTS = $(am_directproduct4_OBJECTS) +directproduct4_LDADD = $(LDADD) +directproduct4_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_directproduct5_OBJECTS = directproduct5.$(OBJEXT) +directproduct5_OBJECTS = $(am_directproduct5_OBJECTS) +directproduct5_LDADD = $(LDADD) +directproduct5_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_directproduct6_OBJECTS = directproduct6.$(OBJEXT) +directproduct6_OBJECTS = $(am_directproduct6_OBJECTS) +directproduct6_LDADD = $(LDADD) +directproduct6_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_partiallyreducedproduct1_OBJECTS = \ + partiallyreducedproduct1.$(OBJEXT) +partiallyreducedproduct1_OBJECTS = \ + $(am_partiallyreducedproduct1_OBJECTS) +partiallyreducedproduct1_LDADD = $(LDADD) +partiallyreducedproduct1_DEPENDENCIES = \ + $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_partiallyreducedproduct2_OBJECTS = \ + partiallyreducedproduct2.$(OBJEXT) +partiallyreducedproduct2_OBJECTS = \ + $(am_partiallyreducedproduct2_OBJECTS) +partiallyreducedproduct2_LDADD = $(LDADD) +partiallyreducedproduct2_DEPENDENCIES = \ + $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_partiallyreducedproduct3_OBJECTS = \ + partiallyreducedproduct3.$(OBJEXT) +partiallyreducedproduct3_OBJECTS = \ + $(am_partiallyreducedproduct3_OBJECTS) +partiallyreducedproduct3_LDADD = $(LDADD) +partiallyreducedproduct3_DEPENDENCIES = \ + $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_partiallyreducedproduct4_OBJECTS = \ + partiallyreducedproduct4.$(OBJEXT) +partiallyreducedproduct4_OBJECTS = \ + $(am_partiallyreducedproduct4_OBJECTS) +partiallyreducedproduct4_LDADD = $(LDADD) +partiallyreducedproduct4_DEPENDENCIES = \ + $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(asciidumpload1_SOURCES) $(directproduct1_SOURCES) \ + $(directproduct2_SOURCES) $(directproduct3_SOURCES) \ + $(directproduct4_SOURCES) $(directproduct5_SOURCES) \ + $(directproduct6_SOURCES) $(partiallyreducedproduct1_SOURCES) \ + $(partiallyreducedproduct2_SOURCES) \ + $(partiallyreducedproduct3_SOURCES) \ + $(partiallyreducedproduct4_SOURCES) +DIST_SOURCES = $(asciidumpload1_SOURCES) $(directproduct1_SOURCES) \ + $(directproduct2_SOURCES) $(directproduct3_SOURCES) \ + $(directproduct4_SOURCES) $(directproduct5_SOURCES) \ + $(directproduct6_SOURCES) $(partiallyreducedproduct1_SOURCES) \ + $(partiallyreducedproduct2_SOURCES) \ + $(partiallyreducedproduct3_SOURCES) \ + $(partiallyreducedproduct4_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +@VALGRIND_TESTS_ENABLED_FALSE@CHECKER = +@VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \ +@VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \ +@VALGRIND_TESTS_ENABLED_TRUE@--num-callers=100 --leak-resolution=high \ +@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 \ +@extra_includes@ \ +@debug_flag@ + +LDADD = \ +$(top_builddir)/utils/libppl_utils.a \ +$(top_builddir)/tests/libppl_tests.a \ +$(top_builddir)/src/libppl.la \ +@extra_libraries@ + + +# +# Sources for the tests +# +asciidumpload1_SOURCES = asciidumpload1.cc +directproduct1_SOURCES = directproduct1.cc +directproduct2_SOURCES = directproduct2.cc +directproduct3_SOURCES = directproduct3.cc +directproduct4_SOURCES = directproduct4.cc +directproduct5_SOURCES = directproduct5.cc +directproduct6_SOURCES = directproduct6.cc +partiallyreducedproduct1_SOURCES = partiallyreducedproduct1.cc +partiallyreducedproduct2_SOURCES = partiallyreducedproduct2.cc +partiallyreducedproduct3_SOURCES = partiallyreducedproduct3.cc +partiallyreducedproduct4_SOURCES = partiallyreducedproduct4.cc +MOSTLYCLEANFILES = \ +ascii_dump_load1.dat + +all: all-am + +.SUFFIXES: +.SUFFIXES: .cc .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Partially_Reduced_Product/Makefile'; \ + 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 + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +asciidumpload1$(EXEEXT): $(asciidumpload1_OBJECTS) $(asciidumpload1_DEPENDENCIES) + @rm -f asciidumpload1$(EXEEXT) + $(CXXLINK) $(asciidumpload1_OBJECTS) $(asciidumpload1_LDADD) $(LIBS) +directproduct1$(EXEEXT): $(directproduct1_OBJECTS) $(directproduct1_DEPENDENCIES) + @rm -f directproduct1$(EXEEXT) + $(CXXLINK) $(directproduct1_OBJECTS) $(directproduct1_LDADD) $(LIBS) +directproduct2$(EXEEXT): $(directproduct2_OBJECTS) $(directproduct2_DEPENDENCIES) + @rm -f directproduct2$(EXEEXT) + $(CXXLINK) $(directproduct2_OBJECTS) $(directproduct2_LDADD) $(LIBS) +directproduct3$(EXEEXT): $(directproduct3_OBJECTS) $(directproduct3_DEPENDENCIES) + @rm -f directproduct3$(EXEEXT) + $(CXXLINK) $(directproduct3_OBJECTS) $(directproduct3_LDADD) $(LIBS) +directproduct4$(EXEEXT): $(directproduct4_OBJECTS) $(directproduct4_DEPENDENCIES) + @rm -f directproduct4$(EXEEXT) + $(CXXLINK) $(directproduct4_OBJECTS) $(directproduct4_LDADD) $(LIBS) +directproduct5$(EXEEXT): $(directproduct5_OBJECTS) $(directproduct5_DEPENDENCIES) + @rm -f directproduct5$(EXEEXT) + $(CXXLINK) $(directproduct5_OBJECTS) $(directproduct5_LDADD) $(LIBS) +directproduct6$(EXEEXT): $(directproduct6_OBJECTS) $(directproduct6_DEPENDENCIES) + @rm -f directproduct6$(EXEEXT) + $(CXXLINK) $(directproduct6_OBJECTS) $(directproduct6_LDADD) $(LIBS) +partiallyreducedproduct1$(EXEEXT): $(partiallyreducedproduct1_OBJECTS) $(partiallyreducedproduct1_DEPENDENCIES) + @rm -f partiallyreducedproduct1$(EXEEXT) + $(CXXLINK) $(partiallyreducedproduct1_OBJECTS) $(partiallyreducedproduct1_LDADD) $(LIBS) +partiallyreducedproduct2$(EXEEXT): $(partiallyreducedproduct2_OBJECTS) $(partiallyreducedproduct2_DEPENDENCIES) + @rm -f partiallyreducedproduct2$(EXEEXT) + $(CXXLINK) $(partiallyreducedproduct2_OBJECTS) $(partiallyreducedproduct2_LDADD) $(LIBS) +partiallyreducedproduct3$(EXEEXT): $(partiallyreducedproduct3_OBJECTS) $(partiallyreducedproduct3_DEPENDENCIES) + @rm -f partiallyreducedproduct3$(EXEEXT) + $(CXXLINK) $(partiallyreducedproduct3_OBJECTS) $(partiallyreducedproduct3_LDADD) $(LIBS) +partiallyreducedproduct4$(EXEEXT): $(partiallyreducedproduct4_OBJECTS) $(partiallyreducedproduct4_DEPENDENCIES) + @rm -f partiallyreducedproduct4$(EXEEXT) + $(CXXLINK) $(partiallyreducedproduct4_OBJECTS) $(partiallyreducedproduct4_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asciidumpload1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/directproduct1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/directproduct2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/directproduct3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/directproduct4.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/directproduct5.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/directproduct6.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/partiallyreducedproduct1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/partiallyreducedproduct2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/partiallyreducedproduct3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/partiallyreducedproduct4.Po@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; ws='[ ]'; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *$$ws$$tst$$ws*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + echo "XPASS: $$tst"; \ + ;; \ + *) \ + echo "PASS: $$tst"; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *$$ws$$tst$$ws*) \ + xfail=`expr $$xfail + 1`; \ + echo "XFAIL: $$tst"; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + echo "FAIL: $$tst"; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + echo "SKIP: $$tst"; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all tests failed"; \ + else \ + banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + skipped="($$skip tests were not run)"; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + test -z "$$skipped" || echo "$$skipped"; \ + test -z "$$report" || echo "$$report"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0; \ + else :; fi + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +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 + +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 all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool ctags \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-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 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/asciidumpload1.cc b/tests/Partially_Reduced_Product/asciidumpload1.cc new file mode 100644 index 0000000..f3453d6 --- /dev/null +++ b/tests/Partially_Reduced_Product/asciidumpload1.cc @@ -0,0 +1,239 @@ +/* Test Direct_Product ascii_dump() and ascii_load(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +#include "files.hh" +#include +#include + +using std::string; +using std::fstream; +using std::ios_base; + +typedef Domain_Product::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/directproduct1.cc b/tests/Partially_Reduced_Product/directproduct1.cc new file mode 100644 index 0000000..9658131 --- /dev/null +++ b/tests/Partially_Reduced_Product/directproduct1.cc @@ -0,0 +1,555 @@ +/* Test Direct_Product. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +using namespace Parma_Polyhedra_Library::IO_Operators; + +// #define PH_IS_FIRST + +// ONE AND ONLY ONE OF THESE MUST BE 1 +#define NNC_Poly_Class 1 +#define C_Poly_Class 0 +#define BD_Shape_Class 0 +#define Octagonal_Shape_Class 0 +#define Box_Class 0 + +#if Box_Class +typedef TBox Poly; +#endif + +#if Octagonal_Shape_Class +typedef TOctagonal_Shape Poly; +#endif + +#if BD_Shape_Class +typedef TBD_Shape Poly; +#endif + +#if NNC_Poly_Class +typedef NNC_Polyhedron Poly; +#endif + +#if C_Poly_Class +typedef C_Polyhedron Poly; +#endif + +#ifdef PH_IS_FIRST +typedef Domain_Product::Direct_Product Product; +#else +typedef Domain_Product::Direct_Product Product; +#endif + +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 dp1(3); + + Product dp2(3, EMPTY); + + 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(); +} + +// Product(cgs), refine_with_congruence(cg) +bool +test03() { + Variable A(0); + + const Congruence_System cgs((A == 0) / 0); + + Product dp1(cgs); + + Product dp2(1); + dp2.refine_with_congruence((A == 0) / 0); + + bool ok = (dp1 == dp2); + + print_congruences(dp1, "*** dp1 congruences ***"); + print_constraints(dp1, "*** dp1 constraints ***"); + print_constraints(dp1.minimized_constraints(), "*** dp1 minimized_constraints ***"); + print_congruences(dp2, "*** dp2 congruences ***"); + print_constraints(dp2, "*** dp2 constraints ***"); + + return ok && dp1.OK() && dp2.OK(); +} + +// Product(cgs), domain1(), domain2() +bool +test04() { + Variable A(0); + + Congruence_System cgs((A %= 0) / 4); + + Product dp(1); + dp.refine_with_congruence((A %= 0) / 4); + + Poly known_ph(1); + + Grid known_gr(1); + known_gr.refine_with_congruence((A %= 0) / 4); + +#ifdef PH_IS_FIRST + bool ok = (dp.domain2() == known_gr + && dp.domain1() == known_ph); +#else + bool ok = (dp.domain1() == known_gr + && dp.domain2() == known_ph); +#endif + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok && dp.OK(); +} + +// Product(cs), refine_with_constraint(c) +bool +test05() { + Variable A(0); + + const Constraint_System cs(A == 0); + + Product dp1(cs); + + Product dp2(1); + dp2.refine_with_constraint(static_cast(A == 0)); + + 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(); +} + +// Product(cs), refine_with_congruence(c) +bool +test06() { + Variable A(0); + + Constraint_System cs(A == 9); + + Product dp1(cs); + + Product dp2(1); + dp2.refine_with_constraint(A == 9); + + Grid known_gr(1); + known_gr.refine_with_congruence((A %= 9) / 0); + +#ifdef PH_IS_FIRST + bool ok = (dp1 == dp2 && dp1.domain2() == known_gr); +#else + bool ok = (dp1 == dp2 && dp1.domain1() == known_gr); +#endif + + 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(); +} + +// Product(bounding_box) +bool +test07() { + 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(); +} + +// operator= +bool +test08() { + Variable A(0); + Variable B(1); + + Constraint_System cs(A + B >= 9); + + Product dp1(2); + dp1.refine_with_constraints(cs); + dp1.refine_with_congruence((A %= 9) / 19); + + Product dp2 = dp1; + + 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(); +} + +// Copy constructor. +bool +test09() { + Variable A(0); + Variable C(2); + + Product dp1(3); + dp1.refine_with_constraint(A - C == 0); + + Product dp2(dp1); + + 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(); +} + +// congruences() +bool +test10() { + 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 +test11() { + 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(); +} + +// constraints() +bool +test12() { + 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); + + Poly ph(dp.space_dimension()); + ph.refine_with_constraints(dp.constraints()); + + Poly 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 +test13() { + 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); + + Poly ph(dp.space_dimension()); + ph.refine_with_constraints(dp.minimized_constraints()); + + Poly 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(); +} + +// Product(c_polyhedron). +bool +test14() { + Variable A(0); + + const Constraint_System cs(A == 0); + + C_Polyhedron ph(cs); + + Product dp1(ph); + + Product dp2(1); + dp2.refine_with_congruence((A %= 0) / 0); + + 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(); +} + +// Product(nnc_polyhedron). +bool +test15() { + Variable A(0); + + const Constraint_System cs(A > 0); + + NNC_Polyhedron ph(cs); + + Product dp1(ph); + + Product dp2(1); + dp2.refine_with_constraint(A > 0); + + 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(); +} + +// Product(grid). +bool +test16() { + Variable A(0); + + const Congruence_System cgs(A %= 0); + + Grid gr(cgs); + + Product dp1(gr); + + Product dp2(1); + dp2.refine_with_congruence((A %= 0) / 1); + + 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(); +} + +// Product(box). +bool +test17() { + Variable A(0); + + const Constraint_System cs(A > 0); + + TBox box(cs); + + Product dp1(box); + + Product dp2(1); + dp2.refine_with_constraint(A > 0); + + 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(); +} + +// Product(bds). +bool +test18() { + Variable A(0); + Variable B(1); + + Constraint_System cs(A >= 0); + cs.insert(2*A - 2*B >= 5); + + TBD_Shape bd(cs); + + Product dp1(bd); + + Product dp2(2); + dp2.refine_with_constraint(A >= 0); + dp2.refine_with_constraint(2*A - 2*B >= 5); + + 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(); +} + +// Product(os). +bool +test19() { + Variable A(0); + Variable B(1); + + Constraint_System cs(A >= 0); + cs.insert(2*A + 2*B >= 5); + + TOctagonal_Shape os(cs); + + Product dp1(os); + + Product dp2(2); + dp2.refine_with_constraint(A >= 0); + dp2.refine_with_constraint(2*A + 2*B >= 5); + + 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(); +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + 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(test19); +END_MAIN diff --git a/tests/Partially_Reduced_Product/directproduct2.cc b/tests/Partially_Reduced_Product/directproduct2.cc new file mode 100644 index 0000000..c300792 --- /dev/null +++ b/tests/Partially_Reduced_Product/directproduct2.cc @@ -0,0 +1,471 @@ +/* Test Direct_Product. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +using namespace Parma_Polyhedra_Library::IO_Operators; + +#define PH_IS_FIRST + +// ONE AND ONLY ONE OF THESE MUST BE 1 +#define NNC_Poly_Class 1 +#define C_Poly_Class 0 +#define BD_Shape_Class 0 +#define Octagonal_Shape_Class 0 +#define Box_Class 0 + +#if Box_Class +typedef TBox Poly; +#endif + +#if Octagonal_Shape_Class +typedef TOctagonal_Shape Poly; +#endif + +#if BD_Shape_Class +typedef BD_Shape Poly; +#endif + +#if NNC_Poly_Class +typedef NNC_Polyhedron Poly; +#endif + +#if C_Poly_Class +typedef C_Polyhedron Poly; +#endif + +#ifdef PH_IS_FIRST +typedef Domain_Product::Direct_Product Product; +#else +typedef Domain_Product::Direct_Product Product; +#endif + +namespace { + +// is_empty() where both domain objects have points. +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); + + bool ok = !dp.is_empty(); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// is_empty() where one domain object is empty. +bool +test02() { + Variable A(0); + + Product dp(3); + + dp.refine_with_congruence((A %= 0) / 2); + dp.refine_with_congruence((A %= 1) / 2); + + bool ok = dp.is_empty(); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// is_empty() where both domain objects are empty. +bool +test03() { + Variable A(0); + + Product dp(3); + dp.refine_with_constraint(A == 1); + dp.refine_with_constraint(A == 3); + + bool ok = dp.is_empty(); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// is_universe() where both domain objects are empty. +bool +test04() { + Product dp(3, EMPTY); + + bool ok = !dp.is_universe(); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// is_universe() where one domain object is universe. +bool +test05() { + Variable A(0); + + Product dp(3); + dp.refine_with_congruence((A %= 0) / 2); + dp.refine_with_congruence((A %= 1) / 2); + + bool ok = !dp.is_universe(); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// is_universe() where both domain objects are universe. +bool +test06() { + Product dp(3); + + bool ok = dp.is_universe(); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// is_topologically_closed() where the NNC Polyhedron is topologically +// open. +bool +test07() { + Variable A(0); + + Product dp(3); + dp.refine_with_constraint(A < 3); + dp.refine_with_congruence((A %= 0) / 3); + +#if NNC_Poly_Class || Box_Class + bool ok = !dp.is_topologically_closed(); +#else + dp.refine_with_constraint(A <= 3); + bool ok = dp.is_topologically_closed(); +#endif + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// is_topologically_closed() where the Polyhedron is topologically +// closed. +bool +test08() { + Variable A(0); + + Product dp(3); + dp.refine_with_constraint(A <= 3); + dp.refine_with_congruence((A %= 0) / 3); + + bool ok = dp.is_topologically_closed(); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// is_topologically_closed() where the Polyhedron is topologically +// open and the intersection is closed. +bool +test09() { + Variable A(0); + + Product dp(3); + dp.refine_with_congruence((A %= 0) / 4); + dp.refine_with_constraint(A < 3); + +#if NNC_Poly_Class + bool ok = !dp.is_topologically_closed(); +#else + dp.refine_with_constraint(A <= 2); + + bool ok = dp.is_topologically_closed(); +#endif + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// is_disjoint_from(dp), due to the Polyhedra. +bool +test10() { + Variable B(1); + + Product dp1(12); + Product dp2(12); + dp1.refine_with_constraint(B < 2); + dp2.refine_with_constraint(B > 3); + bool ok = dp1.is_disjoint_from(dp2); + + print_congruences(dp1, "*** dp1 congruences ***"); + print_constraints(dp1, "*** dp1 constraints ***"); + print_congruences(dp2, "*** dp2 congruences ***"); + print_constraints(dp2, "*** dp2 constraints ***"); + + return ok; +} + +// is_disjoint_from(dp), due to the Grids. +bool +test11() { + Variable A(0); + + Product dp1(3); + dp1.refine_with_congruence((A %= 0) / 7); + + Product dp2(3); + dp2.refine_with_congruence((A %= 1) / 7); + + bool ok = dp1.is_disjoint_from(dp2); + + print_congruences(dp1, "*** dp1 congruences ***"); + print_constraints(dp1, "*** dp1 constraints ***"); + print_congruences(dp2, "*** dp2 congruences ***"); + print_constraints(dp2, "*** dp2 constraints ***"); + + return ok; +} + +// is_disjoint_from(dp), due to either. +bool +test12() { + Variable A(0); + + Product dp1(3); + dp1.refine_with_congruence((A %= 0) / 7); + Product dp2(3); + dp2.refine_with_congruence((A %= 1) / 7); + dp1.refine_with_constraint(A < 3); + dp2.refine_with_constraint(A > 3); + + bool ok = dp1.is_disjoint_from(dp2); + + print_congruences(dp1, "*** dp1 congruences ***"); + print_constraints(dp1, "*** dp1 constraints ***"); + print_congruences(dp2, "*** dp2 congruences ***"); + print_constraints(dp2, "*** dp2 constraints ***"); + + return ok; +} + +// is_disjoint_from(dp), due to both. +bool +test13() { + Variable A(0); + + Product dp1(3); + dp1.refine_with_congruence((A %= 1) / 7); + Product dp2(3); + dp2.refine_with_congruence((A %= 1) / 14); + dp1.refine_with_constraint(A < 6); + dp2.refine_with_constraint(A > 3); + + bool ok = !dp1.is_disjoint_from(dp2); + + print_congruences(dp1, "*** dp1 congruences ***"); + print_constraints(dp1, "*** dp1 constraints ***"); + print_congruences(dp2, "*** dp2 congruences ***"); + print_constraints(dp2, "*** dp2 constraints ***"); + + return ok; +} + +// is_disjoint_from(dp), due to the intersection of the entire direct +// products (i.e. the dp1 and dp2 polyhedron components intersect, as +// do the grid components). +bool +test14() { + Variable A(0); + Variable B(1); + + Product dp1(2); + dp1.refine_with_constraint(A <= 4); + dp1.refine_with_constraint(A >= 0); + dp1.refine_with_constraint(A - B <= 0); + dp1.refine_with_constraint(A - B >= 2); + dp1.refine_with_congruence((A %= 0) / 2); + dp1.refine_with_congruence((A %= 0) / 4); + + Product dp2(2); + dp2.refine_with_constraint(A <= 4); + dp2.refine_with_constraint(A <= 0); + dp2.refine_with_constraint(A + B >= 4); + dp2.refine_with_constraint(A + B <= 6); + // Same grid as dp1. + dp2.refine_with_congruence((A %= 0) / 2); + dp2.refine_with_congruence((A %= 0) / 4); + +#if Box_Class + bool ok = !dp1.is_disjoint_from(dp2); +#else + bool ok = dp1.is_disjoint_from(dp2); +#endif + + print_congruences(dp1, "*** dp1 congruences ***"); + print_constraints(dp1, "*** dp1 constraints ***"); + print_congruences(dp2, "*** dp2 congruences ***"); + print_constraints(dp2, "*** dp2 constraints ***"); + + return ok; +} + +// is_discrete(), due to grid. +bool +test15() { + Variable A(0); + Variable B(1); + Variable C(2); + + Product dp(3); + dp.refine_with_constraint(A == 1); + dp.refine_with_constraint(B == 2); + dp.refine_with_constraint(C <= 3); + dp.refine_with_congruence((C %= 0) / 3); + + bool ok = dp.is_discrete(); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// is_discrete(), due to polyhedron. +bool +test16() { + Variable A(0); + Variable B(1); + + Product dp(2); + dp.refine_with_constraint(A <= 3); + dp.refine_with_constraint(A >= 3); + dp.refine_with_constraint(B == 0); + + bool ok = dp.is_discrete(); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// is_discrete() is false, as the components are not discrete +// although the intersection is discrete.. +bool +test17() { + Variable A(0); + Variable B(1); + + Product dp(3); + dp.refine_with_congruence((A - B %= 0) / 0); + dp.refine_with_constraint(B >= 0); + dp.refine_with_constraint(B <= 0); + + bool ok = !dp.is_discrete(); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// is_bounded(), due to polyhedron. +bool +test18() { + Variable A(0); + Variable B(1); + + Product dp(2); + dp.refine_with_congruence((A %= 1) / 3); + dp.refine_with_constraint(A > 1); + dp.refine_with_constraint(A < 4); + dp.refine_with_constraint(B > 1); + dp.refine_with_constraint(B < 4); + + bool ok = dp.is_bounded(); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// is_bounded(), due to grid. +bool +test19() { + Variable A(0); + Variable B(1); + + Product dp(2); + dp.refine_with_congruence((A %= 0) / 0); + dp.refine_with_congruence((B %= 0) / 0); + dp.refine_with_constraint(B <= 0); + + bool ok = dp.is_bounded(); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp 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); + 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/Partially_Reduced_Product/directproduct3.cc b/tests/Partially_Reduced_Product/directproduct3.cc new file mode 100644 index 0000000..6baf47e --- /dev/null +++ b/tests/Partially_Reduced_Product/directproduct3.cc @@ -0,0 +1,722 @@ +/* Test Direct_Product. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +#define PH_IS_FIRST + +// ONE AND ONLY ONE OF THESE MUST BE 1 +#define NNC_Poly_Class 1 +#define C_Poly_Class 0 +#define BD_Shape_Class 0 +#define Octagonal_Shape_Class 0 +#define Box_Class 0 + +#if Box_Class +typedef TBox Poly; +#endif + +#if Octagonal_Shape_Class +typedef TOctagonal_Shape Poly; +#endif + +#if BD_Shape_Class +typedef BD_Shape Poly; +#endif + +#if NNC_Poly_Class +typedef NNC_Polyhedron Poly; +#endif + +#if C_Poly_Class +typedef C_Polyhedron Poly; +#endif + +#ifdef PH_IS_FIRST +typedef Domain_Product::Direct_Product Product; +#else +typedef Domain_Product::Direct_Product Product; +#endif + +namespace { + +// space_dimension() +bool +test01() { + Variable A(0); + Variable E(4); + +#if NNC_Poly_Class + Constraint_System cs(A + E < 9); +#else + Constraint_System cs(A + E <= 9); +#endif + + Product dp(5); + dp.refine_with_constraints(cs); + + bool ok = (dp.space_dimension() == 5); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + + +// affine_dimension() +bool +test02() { + Variable A(0); + Variable B(1); + Variable C(2); + + Product dp(3); +#if Box_Class + dp.refine_with_constraint(A <= 9); + dp.refine_with_constraint(A >= 9); +#else + dp.refine_with_constraint(A - C >= 9); + dp.refine_with_constraint(A - C <= 9); +#endif + dp.refine_with_constraint(B >= 2); + + bool ok; + +#ifdef PH_IS_FIRST + ok = (dp.domain2().affine_dimension() == 3 + && dp.domain1().affine_dimension() == 2); +#else + ok = (dp.domain1().affine_dimension() == 2 + && dp.domain2().affine_dimension() == 3); +#endif + ok = (ok && dp.affine_dimension() == 2); + + if (!ok) + return false; + + dp.refine_with_constraint(C == 4); + dp.refine_with_constraint(B == 2); + +#ifdef PH_IS_FIRST + ok = (dp.domain2().affine_dimension() == 1 + && dp.domain1().affine_dimension() == 0); +#else + ok = (dp.domain1().affine_dimension() == 1 + && dp.domain2().affine_dimension() == 0); +#endif + + ok &= (ok && dp.affine_dimension() == 0); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// contains() +bool +test03() { + Variable A(0); + + Product dp1(1); + dp1.refine_with_constraint(A <= 3); + dp1.refine_with_congruence((A %= 3) / 2); + + Product dp2(1); + dp2.refine_with_constraint(A <= 3); + dp2.refine_with_congruence(A %= 3); + + bool ok1 = !dp1.contains(dp2); + + dp2.refine_with_congruence((A %= 1) / 4); + + bool ok2 = dp1.contains(dp2); + + dp1.refine_with_congruence((A == 1) / 0); + dp2.refine_with_constraint(A <= 2); + dp2.refine_with_constraint(A >= -1); + dp2.refine_with_congruence((A %= 1) / 3); + + bool ok3 = !dp1.contains(dp2); + + print_constraints(dp1, "*** dp1 constraints ***"); + print_congruences(dp1, "*** dp1 congruences ***"); + + return ok1 && ok2 && ok3; +} + +// strictly_contains() +bool +test04() { + Variable A(0); + + Product dp1(1); + dp1.refine_with_constraint(A <= 2); + dp1.refine_with_congruence(A %= 0); + + Product dp2(1); + dp2.refine_with_constraint(A <= 1); + dp2.refine_with_congruence(A %= 0); + + bool ok1 = dp1.strictly_contains(dp2); + + dp1.refine_with_constraint(A <= 1); + dp2.refine_with_congruence((A %= 1) /2); + + bool ok2 = dp1.strictly_contains(dp2); + + dp1.refine_with_congruence((A %= 1) /2); + + bool ok3 = !dp1.strictly_contains(dp2); + + print_congruences(dp1, "*** dp1 congruences ***"); + print_constraints(dp1, "*** dp1 constraints ***"); + print_congruences(dp2, "*** dp2 congruences ***"); + print_constraints(dp2, "*** dp2 constraints ***"); + + return ok1 && ok2 && ok3; +} + +// intersection_assign() +bool +test05() { + Variable A(0); + Variable B(1); + + Product dp1(3); + dp1.refine_with_constraint(A >= 0); + dp1.refine_with_congruence((A %= 0) / 2); + + Product dp2(3); + dp2.refine_with_constraint(A <= 0); + dp2.refine_with_congruence((A %= 0) / 7); + + dp1.intersection_assign(dp2); + + Product known_dp(3); + known_dp.refine_with_congruence((A %= 0) / 14); + known_dp.refine_with_constraint(A >= 0); + known_dp.refine_with_constraint(A <= 0); + + bool ok = (dp1 == known_dp); + + if (!ok) { + print_congruences(dp1, "*** dp1 congruences ***"); + print_constraints(dp1, "*** dp1 constraints ***"); + print_congruences(dp2, "*** dp2 congruences ***"); + print_constraints(dp2, "*** dp2 constraints ***"); + return ok; + } + + dp1.refine_with_constraint(B <= 1); + dp2.refine_with_constraint(B >= 1); + dp1.intersection_assign(dp2); + ok = !dp1.is_empty(); + + if (!ok) { + print_congruences(dp1, "*** dp1 congruences ***"); + print_constraints(dp1, "*** dp1 constraints ***"); + print_congruences(dp2, "*** dp2 congruences ***"); + print_constraints(dp2, "*** dp2 constraints ***"); + return ok; + } + + dp2.refine_with_constraint(B >= 2); + dp1.intersection_assign(dp2); + ok = dp1.is_empty(); + + if (!ok) { + print_congruences(dp1, "*** dp1 congruences ***"); + print_constraints(dp1, "*** dp1 constraints ***"); + print_congruences(dp2, "*** dp2 congruences ***"); + print_constraints(dp2, "*** dp2 constraints ***"); + } + + return ok; +} + +// upper_bound_assign(dp2) +bool +test06() { + Variable A(0); + Variable B(1); + + Constraint_System cs(A == 9); + + Product dp1(cs); + + Product dp2(1); + dp2.refine_with_constraint(A == 19); + + dp1.upper_bound_assign(dp2); + + Product known_dp(1); + known_dp.refine_with_constraint(A >= 9); + known_dp.refine_with_constraint(A <= 19); + known_dp.refine_with_congruence((A %= 9) / 10); + + bool ok = (dp1 == known_dp); + + print_congruences(dp1, "*** dp1 congruences ***"); + print_constraints(dp1, "*** dp1 constraints ***"); + print_congruences(dp2, "*** dp2 congruences ***"); + print_constraints(dp2, "*** dp2 constraints ***"); + + return ok; +} + +// upper_bound_assign_if_exact() +bool +test07() { + Variable A(0); + Variable B(1); + + Product dp1(3); + dp1.refine_with_constraint(B == 0); + + Product dp2(3); + dp2.refine_with_constraint(B == 0); + dp2.refine_with_constraint(A == 8); + + dp1.upper_bound_assign_if_exact(dp2); + + Product known_dp(3); + known_dp.refine_with_constraint(B == 0); + + bool ok = (dp1 == known_dp); + + print_congruences(dp1, "*** dp1 congruences ***"); + print_constraints(dp1, "*** dp1 constraints ***"); + print_congruences(dp2, "*** dp2 congruences ***"); + print_constraints(dp2, "*** dp2 constraints ***"); + + return ok; +} + +// difference_assign() +bool +test08() { + Variable A(0); + Variable B(1); + + Product dp1(3, UNIVERSE); + dp1.refine_with_constraint(A >= 0); + dp1.refine_with_congruence((A - B %= 0) / 2); + + Product dp2(3); + dp2.refine_with_constraint(A >= 3); + dp2.refine_with_congruence((A - B %= 0) / 4); + + dp1.difference_assign(dp2); + Product known_dp(3); + known_dp.refine_with_constraint(A >= 0); + known_dp.refine_with_constraint(A < 3); + known_dp.refine_with_congruence((A - B %= 2) / 4); + + bool ok = (dp1 == known_dp); + + print_congruences(dp1, "*** dp1 congruences ***"); + print_constraints(dp1, "*** dp1 constraints ***"); + print_congruences(dp2, "*** dp2 congruences ***"); + print_constraints(dp2, "*** dp2 constraints ***"); + + return ok; +} + +// add_space_dimensions_and_embed() +bool +test09() { + Variable A(0); + Variable B(1); + + Product dp1(2); + dp1.refine_with_constraint(A >= 0); + dp1.refine_with_congruence((A %= 0) / 2); + + dp1.add_space_dimensions_and_embed(3); + + Product known_dp(5); + known_dp.refine_with_congruence((A %= 0) / 2); + known_dp.refine_with_constraint(A >= 0); + + bool ok = (dp1 == known_dp); + + print_congruences(dp1, "*** dp1 congruences ***"); + print_constraints(dp1, "*** dp1 constraints ***"); + + return ok; +} + +// add_space_dimensions_and_project() +bool +test10() { + Variable A(0); + Variable B(1); + Variable C(2); + + Product dp1(2); + dp1.refine_with_constraint(A >= 0); + dp1.refine_with_congruence((A %= 0) / 2); + + dp1.add_space_dimensions_and_project(1); + + Product known_dp(3); + known_dp.refine_with_congruence((A %= 0) / 2); + known_dp.refine_with_constraint(A >= 0); + known_dp.refine_with_constraint(C == 0); + + bool ok = (dp1 == known_dp); + + print_congruences(dp1, "*** dp1 congruences ***"); + print_constraints(dp1, "*** dp1 constraints ***"); + + return ok; +} + +// concatenate_assign() +bool +test11() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + + Product dp1(2); + dp1.refine_with_constraint(A >= 0); + dp1.refine_with_congruence((A %= 0) / 2); + + Product dp2(2); + dp2.refine_with_constraint(A <= 1); + dp2.refine_with_constraint(B >= 0); + + dp1.concatenate_assign(dp2); + + Product known_dp(4); + known_dp.refine_with_constraint(A >= 0); + known_dp.refine_with_congruence((A %= 0) / 2); + known_dp.refine_with_constraint(C <= 1); + known_dp.refine_with_constraint(D >= 0); + + bool ok = (dp1 == known_dp); + + print_congruences(dp1, "*** dp1 congruences ***"); + print_constraints(dp1, "*** dp1 constraints ***"); + print_congruences(dp2, "*** dp2 congruences ***"); + print_constraints(dp2, "*** dp2 constraints ***"); + + return ok; +} + +// remove_space_dimensions() +bool +test12() { + Variable A(0); + Variable C(2); + Variable D(3); + + Product dp(4); + dp.refine_with_constraint(A >= 0); + dp.refine_with_congruence((A %= 0) / 2); + dp.refine_with_congruence((A - C %= 0) / 2); + + Variables_Set vars; + vars.insert(C); + vars.insert(D); + + dp.remove_space_dimensions(vars); + + Product known_dp(2); + known_dp.refine_with_constraint(A >= 0); + known_dp.refine_with_congruence((A %= 0) / 2); + + bool ok = (dp == known_dp); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp ***"); + + return ok; +} + +// remove_higher_space_dimensions() +bool +test13() { + Variable A(0); + Variable C(2); + Variable D(3); + + Product dp(4); + dp.refine_with_constraint(A >= 0); + dp.refine_with_congruence((A %= 0) / 2); + dp.refine_with_congruence((A - C %= 0) / 2); + + dp.remove_higher_space_dimensions(2); + + Product known_dp(2); + known_dp.refine_with_constraint(A >= 0); + known_dp.refine_with_congruence((A %= 0) / 2); + + bool ok = (dp == known_dp); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// map_space_dimensions() +bool +test14() { + Variable A(0); + Variable B(1); + + Product dp(2); + dp.refine_with_constraint(A >= 0); + dp.refine_with_congruence((A - B %= 0) / 2); + + Partial_Function function; + function.insert(0, 1); + function.insert(1, 0); + + dp.map_space_dimensions(function); + + Product known_dp(2); + known_dp.refine_with_constraint(B >= 0); + known_dp.refine_with_congruence((B - A %= 0) / 2); + + bool ok = (dp == known_dp); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// expand_space_dimension() +bool + test15() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + + Product dp(3); + dp.refine_with_congruence((A + B %= 2) / 7); + dp.refine_with_constraint(A >= 0); + + dp.expand_space_dimension(A, 1); + + Product known_dp(4); + known_dp.refine_with_congruence((A + B %= 2) / 7); + known_dp.refine_with_congruence((D + B %= 2) / 7); + known_dp.refine_with_constraint(A >= 0); + known_dp.refine_with_constraint(D >= 0); + + bool ok = (dp == known_dp); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// fold_space_dimensions() +bool +test16() { + Variable A(0); + Variable B(1); + Variable C(2); + + Product dp(3); + dp.refine_with_congruence((A %= 2) / 7); + dp.refine_with_congruence((B %= 2) / 14); + dp.refine_with_congruence((C %= 2) / 21); + dp.refine_with_constraint(A <= 5); + dp.refine_with_constraint(B <= 10); + dp.refine_with_constraint(C <= 0); + dp.refine_with_constraint(C >= 0); + + Variables_Set to_fold; + to_fold.insert(A); + to_fold.insert(C); + + dp.fold_space_dimensions(to_fold, B); + + Product known_dp(1); + known_dp.refine_with_congruence((A %= 2) / 7); + known_dp.refine_with_constraint(A <= 10); + + bool ok = (dp == known_dp); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// time_elapse_assign(y) +bool +test17() { + Variable A(0); + Variable B(1); + Variable C(2); + + Product dp1(3); + dp1.refine_with_constraint(A >= 0); + dp1.refine_with_constraint(B >= 0); + dp1.refine_with_constraint(A + B >= 3); + dp1.refine_with_constraint(2*A - B == 0); + dp1.refine_with_constraint(3*A + C == 0); + dp1.refine_with_congruence(3*A %= 0); + + Product dp2(3); + dp2.refine_with_constraint(7*C == 4); + dp2.refine_with_constraint(7*B == -1); + dp2.refine_with_constraint(7*A == 3); + + dp1.time_elapse_assign(dp2); + + Product known_dp(3); + known_dp.refine_with_constraint(5*A - 13*B - 7*C == 0); + known_dp.refine_with_constraint(3*A + C >= 0); + known_dp.refine_with_constraint(A + B >= 3); + known_dp.refine_with_constraint(4*A - 3*C >= 13); + known_dp.refine_with_congruence((65*A - B %= 0) / 7); + known_dp.refine_with_congruence(21*A %= 0); + known_dp.refine_with_constraint(A >= 0); + + bool ok = (dp1 == known_dp); + + print_congruences(dp1, "*** dp1.time_elapse_assign(dp1) congruences ***"); + print_constraints(dp1, "*** dp1.time_elapse_assign(dp1) constraints ***"); + print_congruences(dp2, "*** dp2.time_elapse_assign(dp2) congruences ***"); + print_constraints(dp2, "*** dp2.time_elapse_assign(dp2) constraints ***"); + + return ok; +} + +// topological_closure_assign +bool +test18() { + Variable A(0); + Variable B(1); + Variable C(2); + + Product dp(3); + dp.refine_with_constraint(B >= 0); + dp.refine_with_constraint(4*A + C == 0); + dp.refine_with_constraint(2*A - B == 0); + dp.refine_with_congruence(4*A %= 0); + dp.refine_with_constraint(A > 0); + + dp.topological_closure_assign(); + + Product known_dp(3); + known_dp.refine_with_constraint(B >= 0); + known_dp.refine_with_constraint(4*A + C == 0); + known_dp.refine_with_constraint(2*A - B == 0); + known_dp.refine_with_congruence(4*A %= 0); + known_dp.refine_with_constraint(A >= 0); + + bool ok = (dp.is_topologically_closed() && dp == known_dp); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// widening_assign +bool +test19() { + Variable A(0); + Variable B(1); + Variable C(2); + + Product dp_prev(3); + dp_prev.refine_with_constraint(C == 0); + dp_prev.refine_with_constraint(A - B >= 1); + dp_prev.refine_with_constraint(A <= 2); + dp_prev.refine_with_constraint(B >= 0); + dp_prev.refine_with_congruence((B %= 0) / 2); + dp_prev.refine_with_congruence(3*A %= 0); + + print_congruences(dp_prev, "*** dp_prev congruences ***"); + print_constraints(dp_prev, "*** dp_prev constraints ***"); + + Product dp(3); + dp.refine_with_constraint(C == 0); + dp.refine_with_constraint(A <= 2); + dp.refine_with_constraint(B >= 0); + dp.refine_with_constraint(2*A - B >= 2); + dp.refine_with_constraint(B >= 0); + dp.refine_with_congruence(6*A %= 0); + dp.refine_with_congruence((B %= 0) / 2); + + dp.upper_bound_assign(dp_prev); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + dp.widening_assign(dp_prev); + + Product known_dp(3); + known_dp.refine_with_constraint(C == 0); + known_dp.refine_with_constraint(A <= 2); + known_dp.refine_with_constraint(B >= 0); + known_dp.refine_with_congruence((B %= 0) / 2); + + bool ok = (dp == known_dp); + + print_congruences(dp, "*** dp.widening_assign(dp_prev) congruences ***"); + print_constraints(dp, "*** dp.widening_assign(dp_prev) constraints ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + DO_TEST(test06); +#if C_Poly_Class + DO_TEST_F8A(test07); +#else + DO_TEST(test07); +#endif + 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_F8(test17); + DO_TEST(test18); + DO_TEST(test19); +END_MAIN diff --git a/tests/Partially_Reduced_Product/directproduct4.cc b/tests/Partially_Reduced_Product/directproduct4.cc new file mode 100644 index 0000000..3571a26 --- /dev/null +++ b/tests/Partially_Reduced_Product/directproduct4.cc @@ -0,0 +1,358 @@ +/* Test Direct_Product. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +#define PH_IS_FIRST + +// ONE AND ONLY ONE OF THESE MUST BE 1 +#define NNC_Poly_Class 1 +#define C_Poly_Class 0 +#define BD_Shape_Class 0 +#define Octagonal_Shape_Class 0 +#define Box_Class 0 + +#if Box_Class +typedef TBox Poly; +#endif + +#if Octagonal_Shape_Class +typedef TOctagonal_Shape Poly; +#endif + +#if BD_Shape_Class +typedef BD_Shape Poly; +#endif + +#if NNC_Poly_Class +typedef NNC_Polyhedron Poly; +#endif + +#if C_Poly_Class +typedef C_Polyhedron Poly; +#endif + +#ifdef PH_IS_FIRST +typedef Domain_Product::Direct_Product Product; +#else +typedef Domain_Product::Direct_Product Product; +#endif + +namespace { + +// affine_image() +bool +test01() { + Variable A(0); + Variable B(1); + Variable C(2); + + Product dp(3); + dp.refine_with_congruence((B %= 2) / 14); + dp.refine_with_constraint(A <= 5); + dp.refine_with_constraint(B <= 10); + + dp.affine_image(A, B + C); + + Product known_dp(3); + known_dp.refine_with_congruence((B %= 2) / 14); + known_dp.refine_with_constraint(A - B - C == 0); + known_dp.refine_with_constraint(A - C <= 10); + known_dp.refine_with_constraint(B <= 10); + + bool ok = (dp == known_dp); + + print_constraints(dp, "*** dp constraints ***"); + print_congruences(dp, "*** dp congruences ***"); + + return ok; +} + +// affine_preimage() +bool +test02() { + Variable A(0); + Variable B(1); + + Product dp(3); + dp.refine_with_constraint(A - B == 0); + dp.refine_with_congruence((A %= 0) / 3); + + dp.affine_preimage(A, B); + + Product known_dp(3); + known_dp.refine_with_congruence((B %= 0) / 3); + + bool ok = (dp == known_dp); + + print_constraints(dp, "*** dp constraints ***"); + print_congruences(dp, "*** dp congruences ***"); + + return ok; +} + +#if !Box_Class +// generalized_affine_image(v, EQUAL, e) +bool +test03() { + Variable A(0); + Variable B(1); + + Product dp(3); + dp.refine_with_congruence(A %= 0); + dp.refine_with_congruence((A + B %= 0) / 2); + dp.refine_with_constraint(B >= 0); + dp.refine_with_constraint(A - B >= 0); + + Linear_Expression le(A+2); + + dp.generalized_affine_image(A, EQUAL, le); + + Product known_dp(3); + known_dp.refine_with_congruence(A %= 0); + known_dp.refine_with_congruence((A + B %= 0) / 2); + known_dp.refine_with_constraint(B >= 0); + known_dp.refine_with_constraint(A - B >= 2); + + bool ok = (dp == known_dp); + + print_constraints(dp, "*** dp constraints ***"); + print_congruences(dp, "*** dp congruences ***"); + + return ok; +} + +// generalized_affine_image(v, EQUAL, e, d) +bool +test04() { + Variable A(0); + Variable B(1); + + Product dp(3); + dp.refine_with_congruence(A %= 0); + dp.refine_with_congruence((A + B %= 0) / 2); + dp.refine_with_constraint(A >= 3); + + dp.generalized_affine_image(B, EQUAL, A + 1, 2); + + Product known_dp(3); + known_dp.refine_with_constraint(A - 2*B == -1); + known_dp.refine_with_congruence(A %= 0); + known_dp.refine_with_constraint(A >= 3); + known_dp.refine_with_constraint(B >= 2); + + bool ok = (dp == known_dp); + + print_constraints(dp, "*** dp constraints ***"); + print_congruences(dp, "*** dp congruences ***"); + + return ok; +} + +// generalized_affine_preimage(v, GREATER_OR_EQUAL, e) +bool +test05() { + Variable A(0); + Variable B(1); + + Product dp(3); + dp.refine_with_constraint(A >= 0); + dp.refine_with_constraint(A <= 4); + dp.refine_with_constraint(B <= 5); + dp.refine_with_constraint(A <= B); + dp.refine_with_congruence(A %= B); + + dp.generalized_affine_preimage(B, GREATER_OR_EQUAL, A+2); + + Product known_dp(3); + known_dp.refine_with_constraint(0 <= A); + known_dp.refine_with_constraint(A <= 3); + + bool ok = (dp == known_dp); + + print_constraints(dp, "*** dp constraints ***"); + print_congruences(dp, "*** dp congruences ***"); + + return ok; +} + +// generalized_affine_preimage(v, EQUAL, e, d), +bool +test06() { + Variable A(0); + Variable B(1); + Variable C(2); + + Product dp(3); + dp.refine_with_congruence(A %= 0); + dp.refine_with_congruence((B %= 0) / 2); + + dp.generalized_affine_preimage(B, EQUAL, A + B, 1); + + Product known_dp(3); + known_dp.refine_with_congruence((A + B %= 0) / 2); + known_dp.refine_with_congruence(A %= 0); + + bool ok = (dp == known_dp); + + print_constraints(dp, "*** dp constraints ***"); + print_congruences(dp, "*** dp congruences ***"); + + return ok; +} + +// generalized_affine_image(lhs, relsym, rhs) +bool +test07() { + Variable A(0); + Variable B(1); + + Product dp(3); + dp.refine_with_congruence(A %= 0); + dp.refine_with_constraint(B >= 0); + dp.refine_with_constraint(A - B >= 1); + + dp.generalized_affine_image(Linear_Expression(2), LESS_OR_EQUAL, A + B); + + Product known_dp(3); + known_dp.refine_with_congruence(A %= 0); + known_dp.refine_with_constraint(B >= 0); + known_dp.refine_with_constraint(A - B >= 1); + known_dp.refine_with_constraint(2 <= A + B); + + bool ok = (dp == known_dp); + + print_constraints(dp, "*** dp constraints ***"); + print_congruences(dp, "*** dp congruences ***"); + + return ok; +} + +// generalized_affine_image(lhs, EQUAL, rhs), +// refine_with_congruences(cgs) +bool +test08() { + Variable A(0); + Variable B(1); + + Congruence_System cs; + cs.insert((A %= 0) / 1); + cs.insert((B %= 0) / 2); + + Product dp(2); + dp.refine_with_congruences(cs); + dp.refine_with_constraint(A <= 3); + + dp.generalized_affine_image(A + 2*B, EQUAL, A - B); + + Product known_dp(2); + known_dp.refine_with_congruence((A + 2*B %= 0) / 1); + + bool ok = (dp == known_dp); + + print_constraints(dp, "*** dp constraints ***"); + print_congruences(dp, "*** dp congruences ***"); + + return ok; +} + +// generalized_affine_preimage(lhs, relsym, rhs), refine_with_constraints(cs) +bool +test09() { + 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 dp(3); + dp.refine_with_constraints(cs); + dp.refine_with_congruence(A %= B); + + dp.generalized_affine_preimage(1*B, GREATER_OR_EQUAL, A+2); + + Product known_dp(3); + known_dp.refine_with_constraint(0 <= A); + known_dp.refine_with_constraint(A <= 3); + + bool ok = (dp == known_dp); + + print_constraints(dp, "*** dp constraints ***"); + print_congruences(dp, "*** dp congruences ***"); + + return ok; +} + +// generalized_affine_preimage(lhs, EQUAL, rhs) +bool +test10() { + Variable A(0); + Variable B(1); + Variable C(2); + + Product dp(3); + dp.refine_with_constraint(A - B == 1); + + dp.generalized_affine_preimage(A - B, EQUAL, 2*A - 2*B); + + Product known_dp(3); + known_dp.refine_with_congruence((2*A - 2*B %= 1) / 0); + +#if BD_Shape_Class || Octagonal_Shape_Class + #ifdef PH_IS_FIRST + bool ok = (dp.domain2() == known_dp.domain2() + && dp.domain1().is_universe()); + #else + bool ok = (dp.domain1() == known_dp.domain1() + && dp.domain2().is_universe()); + #endif +#else + bool ok = (dp == known_dp); +#endif + + + print_constraints(dp, "*** dp constraints ***"); + print_congruences(dp, "*** dp congruences ***"); + + return ok; +} +#endif + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); +#if !Box_Class + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + DO_TEST(test06); + DO_TEST(test07); + DO_TEST(test08); + DO_TEST(test09); + DO_TEST(test10); +#endif +END_MAIN diff --git a/tests/Partially_Reduced_Product/directproduct5.cc b/tests/Partially_Reduced_Product/directproduct5.cc new file mode 100644 index 0000000..49ae152 --- /dev/null +++ b/tests/Partially_Reduced_Product/directproduct5.cc @@ -0,0 +1,601 @@ +/* Test Grid::congruences(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +using namespace IO_Operators; + +// ONE AND ONLY ONE OF THESE MUST BE 1 +#define NNC_Poly_Class 1 +#define C_Poly_Class 0 +#define BD_Shape_Class 0 +#define Octagonal_Shape_Class 0 +#define Box_Class 0 + +#if Box_Class +typedef TBox Poly; +#endif + +#if Octagonal_Shape_Class +typedef TOctagonal_Shape Poly; +#endif + +#if BD_Shape_Class +typedef BD_Shape Poly; +#endif + +#if NNC_Poly_Class +typedef NNC_Polyhedron Poly; +#endif + +#if C_Poly_Class +typedef C_Polyhedron Poly; +#endif + +#ifdef PH_IS_FIRST +typedef Domain_Product::Direct_Product Product; +#else +typedef Domain_Product::Direct_Product Product; +#endif + +namespace { + +// refine_with_constraints +bool +test01() { + + Variable A(0); + Variable B(1); + Variable C(2); + + Constraint_System cs; + cs.insert(A >= 0); + cs.insert(B == 0); + + Product dp(2); + + print_constraints(dp, "*** dp constraints ***"); + print_congruences(dp, "*** dp congruences ***"); + + dp.refine_with_constraints(cs); + + Product known_dp(2); + known_dp.refine_with_constraint(A >= 0); + known_dp.refine_with_constraint(B == 0); + + bool ok = (dp == known_dp); + + print_constraints(dp, "*** dp constraints ***"); + print_congruences(dp, "*** dp congruences ***"); + + return ok; +} + +// refine_with_constraints +bool +test02() { + Variable A(0); + Variable B(1); + + Constraint_System cs; + cs.insert(A + B <= 0); + + Product dp(2); + + print_constraints(dp, "*** dp constraints ***"); + print_congruences(dp, "*** dp congruences ***"); + + dp.refine_with_constraints(cs); + + Product known_dp(2); + known_dp.refine_with_constraint(A + B <= 0); + + bool ok = (dp == known_dp); + + print_constraints(dp, "*** dp constraints ***"); + print_congruences(dp, "*** dp congruences ***"); + + return ok; +} + +// refine_with_constraints +bool +test03() { + Variable A(0); + Variable B(1); + + Constraint_System cs; + cs.insert(A >= 0); + cs.insert(A + B == 0); + + Product dp(2); + + print_constraints(dp, "*** dp constraints ***"); + print_congruences(dp, "*** dp congruences ***"); + + dp.refine_with_constraints(cs); + bool ok = !dp.is_empty(); + + Product known_dp(2); + known_dp.refine_with_constraint(A >= 0); + known_dp.refine_with_constraint(A + B == 0); + + ok = ok && (dp == known_dp); + + return ok; +} + +// refine_with_constraints +bool +test04() { + Variable A(0); + Variable B(1); + + Constraint_System cs; + cs.insert(B >= 0); + cs.insert(A - B == 0); + + Product dp(2); + + print_constraints(dp, "*** dp constraints ***"); + print_congruences(dp, "*** dp congruences ***"); + + dp.refine_with_constraints(cs); + bool ok = !dp.is_empty(); + + Product known_dp(2); + known_dp.refine_with_constraint(B >= 0); + known_dp.refine_with_constraint(A - B == 0); + + ok = ok && (dp == known_dp); + + print_constraints(dp, "*** dp constraints ***"); + print_congruences(dp, "*** dp congruences ***"); + + return ok; +} + +// refine_with_congruences +bool +test05() { + + 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 +test06() { + Variable A(0); + Variable B(1); + + Congruence_System cgs; + cgs.insert((A %= 0) / 2); + cgs.insert(A + B == 0); + + Product dp(2); + + print_constraints(dp, "*** dp constraints ***"); + print_congruences(dp, "*** dp congruences ***"); + + dp.refine_with_congruences(cgs); + bool ok = !dp.is_empty(); + + Product known_dp(2); + known_dp.refine_with_congruence((A %= 0) / 2); + known_dp.refine_with_constraint(A + B == 0); + + ok = 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 + 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 + B %= 0) / 2); + + bool ok = (dp == known_dp); + + print_constraints(dp, "*** dp constraints ***"); + print_congruences(dp, "*** dp congruences ***"); + + return ok; +} + +// refine_with_congruences +bool +test08() { + Variable A(0); + Variable B(1); + + Congruence_System cgs; + cgs.insert((B %= 0) / 2); + cgs.insert(A - B == 0); + + Product dp(2); + + print_constraints(dp, "*** dp constraints ***"); + print_congruences(dp, "*** dp congruences ***"); + + dp.refine_with_congruences(cgs); + bool ok = !dp.is_empty(); + + Product known_dp(2); + known_dp.refine_with_congruence((B %= 0) / 2); + known_dp.refine_with_constraint(A - B == 0); + + ok = ok &&(dp == known_dp); + + print_constraints(dp, "*** dp constraints ***"); + print_congruences(dp, "*** dp congruences ***"); + + return ok; +} + +#if !Box_Class +// relation_with a generator +bool +test09() { + 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 +test10() { + 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 +test11() { + 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; +} +#endif + +#if !Octagonal_Shape_Class && !BD_Shape_Class && !Box_Class +// A product in 3D; relation_with a constraint. +bool +test12() { + 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); +#ifdef PH_IS_FIRST + bool okdp1 = (rel1 == Poly_Con_Relation::is_included()); + bool okdp2 = (rel2 == Poly_Con_Relation::strictly_intersects()); +#else + bool okdp1 = (rel1 == Poly_Con_Relation::strictly_intersects()); + bool okdp2 = (rel2 == Poly_Con_Relation::is_included()); +#endif + + 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 +test13() { + 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 +test14() { + 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 +test15() { + 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 +test16() { + 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); +#ifdef PH_IS_FIRST + bool okdp1 = (rel1 == Poly_Con_Relation::strictly_intersects()); + bool okdp2 = (rel2 == Poly_Con_Relation::is_included()); +#else + bool okdp1 = (rel2 == Poly_Con_Relation::strictly_intersects()); + bool okdp2 = (rel1 == Poly_Con_Relation::is_included()); +#endif + + 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 +test17() { + 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; +} +#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); +#if !Box_Class + DO_TEST(test09); + DO_TEST(test10); + DO_TEST(test11); +#endif +#if !BD_Shape_Class && !Octagonal_Shape_Class && !Box_Class + DO_TEST(test12); + DO_TEST(test13); + DO_TEST(test14); + DO_TEST(test15); + DO_TEST(test16); + DO_TEST(test17); +#endif +END_MAIN diff --git a/tests/Partially_Reduced_Product/directproduct6.cc b/tests/Partially_Reduced_Product/directproduct6.cc new file mode 100644 index 0000000..bb6d5f6 --- /dev/null +++ b/tests/Partially_Reduced_Product/directproduct6.cc @@ -0,0 +1,700 @@ +/* Test Grid::congruences(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . + +Tests bounds_from_above(), bounds_from_below(), maximize() and minimize() +for the product domains */ + +#include "ppl_test.hh" + +#define PH_IS_FIRST + +// ONE AND ONLY ONE OF THESE MUST BE 1 +#define NNC_Poly_Class 1 +#define C_Poly_Class 0 +#define BD_Shape_Class 0 +#define Octagonal_Shape_Class 0 +#define Box_Class 0 + +#if Box_Class +typedef TBox Poly; +#endif + +#if Octagonal_Shape_Class +typedef TOctagonal_Shape Poly; +#endif + +#if BD_Shape_Class +typedef BD_Shape Poly; +#endif + +#if NNC_Poly_Class +typedef NNC_Polyhedron Poly; +#endif + +#if C_Poly_Class +typedef C_Polyhedron Poly; +#endif + +#ifdef PH_IS_FIRST +typedef Domain_Product::Direct_Product Product; +#else +typedef Domain_Product::Direct_Product Product; +#endif + +namespace { + +// Empty. +bool +test01() { + Product dp(7, EMPTY); + + bool ok = (dp.bounds_from_above(Linear_Expression(0)) + && dp.bounds_from_below(Linear_Expression(0))); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// Zero dimension empty. +bool +test02() { + Product dp(0, EMPTY); + + bool ok = (dp.bounds_from_above(Linear_Expression(3)) + && dp.bounds_from_below(Linear_Expression(3))); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// Zero dimension universe. +bool +test03() { + Product dp(0); + + bool ok = (dp.bounds_from_above(Linear_Expression(1)) + && dp.bounds_from_below(Linear_Expression(1))); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// Point. +bool +test04() { + Variable A(0); + Variable B(1); + + Product dp(2); + dp.refine_with_constraint(A == 1); + dp.refine_with_constraint(3*B == 2); + + Linear_Expression le = A + B; + bool ok = dp.bounds_from_above(le) + && dp.bounds_from_below(le); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// only one component is bounded. +bool +test05() { + Variable A(0); + Variable B(1); + + Product dp(2); +#if Box_Class + dp.refine_with_constraint(A >= 1); + dp.refine_with_constraint(A <= 1); + dp.refine_with_constraint(B >= 1); + dp.refine_with_constraint(B <= 0); +#else + dp.refine_with_constraint(A - B >= 1); + dp.refine_with_constraint(A - B <= 1); +#endif + dp.refine_with_congruence(3*B %= 2); + + Linear_Expression le = A - B; + bool ok = dp.bounds_from_above(le) + && dp.bounds_from_below(le); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// Line and neither component is bounded. +bool +test06() { + Variable A(0); + Variable B(1); + + Product dp(2); + dp.refine_with_constraint(B == 1); + + Linear_Expression le = 2*A - B; + + bool ok = !dp.bounds_from_above(le) + && !dp.bounds_from_below(le); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// Empty. maximize() and minimize() +bool +test07() { + Product dp(7, EMPTY); + + Coefficient extr_n; + Coefficient extr_d; + bool dummy; + + bool ok = (!dp.maximize(Linear_Expression(0), extr_n, extr_d, dummy)); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// Zero dimension empty. +bool +test08() { + Product dp(0, EMPTY); + + Coefficient extr_n; + Coefficient extr_d; + bool dummy; + Generator pnt(point()); + + bool ok = !dp.maximize(Linear_Expression(0), extr_n, extr_d, dummy) + && !dp.maximize(Linear_Expression(0), extr_n, extr_d, dummy, pnt); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// Zero dimension universe. +bool +test09() { + Product dp(0); + + Coefficient extr_n, extr_d; + bool dummy; + Generator pnt(point()); + + bool ok = dp.maximize(Linear_Expression(0), extr_n, extr_d, dummy) + && dp.maximize(Linear_Expression(0), extr_n, extr_d, dummy, pnt); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// Point. +bool +test10() { + Variable A(0); + Variable B(1); + + Product dp(2); + dp.refine_with_constraint(A == 1); + dp.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 = dp.maximize(le, max_n, max_d, max) + && dp.minimize(le, min_n, min_d, min) + && dp.maximize(le, max_n, max_d, max, pnt_max) + && dp.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(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// only one component is bounded. +bool +test11() { + Variable A(0); + Variable B(1); + + Product dp(2); +#if Box_Class + dp.refine_with_constraint(A >= 2); + dp.refine_with_constraint(A <= 2); + dp.refine_with_constraint(B >= 1); + dp.refine_with_constraint(B <= 1); +#else + dp.refine_with_constraint(A - B >= 1); + dp.refine_with_constraint(A - B <= 1); +#endif + dp.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 = dp.maximize(le, max_n, max_d, max) + && dp.minimize(le, min_n, min_d, min) + && dp.maximize(le, max_n, max_d, max, pnt_max) + && dp.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(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// Line and neither component is bounded. +bool +test12() { + Variable A(0); + Variable B(1); + + Product dp(2); + dp.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 = !dp.maximize(le, max_n, max_d, max) + && !dp.minimize(le, min_n, min_d, min) + && !dp.maximize(le, max_n, max_d, max, pnt_max) + && !dp.minimize(le, min_n, min_d, min, pnt_min); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// only one component is strictly bounded. +bool +test13() { + Variable A(0); + Variable B(1); + + Product dp(2); + +#if NNC_Poly_Class + dp.refine_with_constraint(A - B > 0); + dp.refine_with_constraint(A - B < 1); +#else +#if !Box_Class + dp.refine_with_constraint(A - B >= 0); + dp.refine_with_constraint(A - B <= 1); +#else + dp.refine_with_constraint(A >= 2); + dp.refine_with_constraint(A <= 2); + dp.refine_with_constraint(B <= 2); + dp.refine_with_constraint(B >= 1); +#endif +#endif + dp.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 = dp.maximize(le, max_n, max_d, max) + && dp.minimize(le, min_n, min_d, min) + && dp.maximize(le, max_n, max_d, max, pnt_max) + && dp.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(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp 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 dp(3); + dp.refine_with_congruence((A == 0) / 0); + dp.refine_with_congruence((B == 0) / 0); + dp.refine_with_congruence((C == -2) / 0); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + dp.bounded_affine_image(A, 7-B, B+3); + + Product known_dp(3); + known_dp.refine_with_constraint(C == -2); + known_dp.refine_with_constraint(B == 0); + known_dp.refine_with_constraint(A <= 3); + known_dp.refine_with_constraint(A - B >= 7); + + bool ok = (dp == known_dp); + + print_congruences(dp, + "*** dp.bounded_affine_image(A, 7-B, B+3) congruences ***"); + print_constraints(dp, + "*** dp.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 dp(3); + dp.refine_with_constraint(A == 0); + dp.refine_with_constraint(A == 1); + dp.refine_with_constraint(C == -2); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + dp.bounded_affine_image(A, 7-B, B+3); + + Product known_dp(3, EMPTY); + + bool ok = (dp == known_dp); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// Non-empty product. bounded_affine_preimage/3 +bool +test16() { + Variable A(0); + Variable B(1); + Variable C(2); + + Product dp(3); + dp.refine_with_congruence((A == 0) / 0); + dp.refine_with_congruence((B == 0) / 0); + dp.refine_with_congruence((C == -2) / 0); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + dp.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_dp(3); + known_dp.refine_with_constraints(cs); + + bool ok = (dp == known_dp); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} + +// Empty product. bounded_affine_preimage/3 +bool +test17() { + Variable A(0); + Variable B(1); + Variable C(2); + + Product dp(3); + dp.refine_with_constraint(A == 0); + dp.refine_with_constraint(A == 1); + dp.refine_with_constraint(C == -2); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + dp.bounded_affine_preimage(A, 7-B, B+3); + + Product known_dp(3, EMPTY); + + bool ok = (dp == known_dp); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + + return ok; +} +#endif + +typedef Domain_Product::Direct_Product TBox_Grid; +typedef Domain_Product::Direct_Product Grid_TBox; +typedef Domain_Product::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 pdp(ph, POLYNOMIAL_COMPLEXITY); + + TBox_Grid ndp(ph); + + TBox_Grid known_ndp(2); + known_ndp.refine_with_constraint(3*x >= -2); + known_ndp.refine_with_constraint(x <= 4); + known_ndp.refine_with_constraint(y >= -10); + known_ndp.refine_with_constraint(y <= 4); + + TBox_Grid known_pdp(2); + known_pdp.refine_with_constraint(x <= 4); + known_pdp.refine_with_constraint(y <= 4); + + bool ok = (ndp == known_ndp && pdp == known_pdp && pdp.contains(ndp)); + + print_constraints(ph, "*** ph ***"); + print_constraints(ndp, "*** ndp ***"); + print_congruences(ndp, "*** ndp ***"); + print_constraints(pdp, "*** pdp ***"); + print_congruences(pdp, "*** pdp ***"); + + 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 dp(src, POLYNOMIAL_COMPLEXITY); + + NNCPoly_Grid dp1(src); + + NNCPoly_Grid known_dp(1); + known_dp.refine_with_constraint(A >= 0); + + bool ok = (dp == known_dp && dp1 == known_dp); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + print_congruences(dp1, "*** dp1 congruences ***"); + print_constraints(dp1, "*** dp1 constraints ***"); + + return ok && dp.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 dp(src, POLYNOMIAL_COMPLEXITY); + + NNCPoly_Grid dp1(src); + + NNCPoly_Grid known_dp(1); + known_dp.refine_with_constraint(A >= 0); + known_dp.refine_with_congruence(A %= 0); + + bool ok = (dp == known_dp && dp1 == known_dp); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + print_congruences(dp1, "*** dp1 congruences ***"); + print_constraints(dp1, "*** dp1 constraints ***"); + + return ok && dp.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 dp(src, POLYNOMIAL_COMPLEXITY); + + NNCPoly_Grid dp1(src); + + NNCPoly_Grid known_dp(1); + known_dp.refine_with_constraint(A >= 0); + known_dp.refine_with_congruence(A %= 0); + + bool ok = (dp == known_dp && dp1 == known_dp); + + print_congruences(dp, "*** dp congruences ***"); + print_constraints(dp, "*** dp constraints ***"); + print_congruences(dp1, "*** dp1 congruences ***"); + print_constraints(dp1, "*** dp1 constraints ***"); + + return ok && dp.OK(); +} + +// Attempt to construct a product with too many dimensions. +bool +test22() { + try { + // This is an invalid use of the constructor of a product: + // it is illegal to (try to) build a product with a dimensions + // greater than max_space_dimension(). + NNCPoly_Grid pg(NNCPoly_Grid::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; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + 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); +END_MAIN diff --git a/tests/Partially_Reduced_Product/partiallyreducedproduct1.cc b/tests/Partially_Reduced_Product/partiallyreducedproduct1.cc new file mode 100644 index 0000000..563d7a0 --- /dev/null +++ b/tests/Partially_Reduced_Product/partiallyreducedproduct1.cc @@ -0,0 +1,845 @@ +/* Test Partially_Reduced_Product<>. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +using namespace Parma_Polyhedra_Library::IO_Operators; + +#define PH_IS_NNC +// #define PH_IS_FIRST + +#ifdef PH_IS_NNC +typedef NNC_Polyhedron Poly; +#else +typedef C_Polyhedron Poly; +#endif + +#ifdef PH_IS_FIRST +typedef Domain_Product::Direct_Product DProduct; +typedef Domain_Product::Smash_Product SProduct; +typedef Domain_Product::Constraints_Product CProduct; +#else +typedef Domain_Product::Direct_Product DProduct; +typedef Domain_Product::Smash_Product SProduct; +typedef Domain_Product::Constraints_Product CProduct; +#endif + +namespace { + +// Product(dims, type); == and != +bool +test01() { + Variable A(0); + + SProduct sp1(3); + SProduct sp2(3, EMPTY); + CProduct cp1(3); + CProduct cp2(3); + cp2.refine_with_constraint(A == 0); + + bool ok = (sp1 != sp2 && cp1 != cp2); + + if (!ok) + return false; + + sp1.refine_with_congruence((A %= 0) / 4); + sp1.refine_with_congruence((A %= 1) / 4); + + cp1.refine_with_constraint(A >= 0); + cp1.refine_with_constraint(A <= 0); + + ok = (sp1 == sp2 && cp1 == cp2); + + ok = ok && sp1.OK() && sp2.OK() && cp1.OK() && cp2.OK(); + + print_congruences(sp1, "*** sp1 congruences ***"); + print_constraints(sp1, "*** sp1 constraints ***"); + print_congruences(cp1, "*** cp1 congruences ***"); + print_constraints(cp1, "*** cp1 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; + CProduct cp1(2); + cp1.refine_with_constraints(cs); + cp1.refine_with_constraint(A >= 9); + cp1.refine_with_constraint(A <= 9); + CProduct cp2 = cp1; + + bool ok = (sp1 == sp2 && cp1 == cp2); + + ok = ok && sp1.OK() && sp2.OK() && cp1.OK() && cp2.OK(); + + print_congruences(sp1, "*** sp1 congruences ***"); + print_constraints(sp1, "*** sp1 constraints ***"); + print_congruences(cp1, "*** cp1 congruences ***"); + print_constraints(cp1, "*** cp1 constraints ***"); + + return ok; +} + +// Copy constructor. +bool +test03() { + Variable A(0); + Variable B(2); + + Constraint_System cs(A - B == 0); + + SProduct sp1(cs); + sp1.refine_with_congruence((A %= 9) / 19); + sp1.refine_with_congruence((A %= 8) / 19); + SProduct sp2(sp1); + CProduct cp1(cs); + cp1.refine_with_constraint(A >= 9); + cp1.refine_with_constraint(A <= 9); + CProduct cp2(cp1); + + bool ok = (sp1 == sp2 && cp1 == cp2); + + ok = ok && sp1.OK() && sp2.OK() && cp1.OK() && cp2.OK(); + + print_congruences(sp1, "*** sp1 congruences ***"); + print_constraints(sp1, "*** sp1 constraints ***"); + print_congruences(cp1, "*** cp1 congruences ***"); + print_constraints(cp1, "*** cp1 constraints ***"); + + return ok; +} + +// affine_dimension() +bool +test04() { + Variable A(0); + Variable B(1); + Variable C(2); + + Constraint_System cs; + cs.insert(A - C <= 9); + cs.insert(A - C >= 9); + cs.insert(B == 2); + + SProduct sp(3); + sp.refine_with_constraints(cs); + CProduct cp(3); + cp.refine_with_constraints(cs); + + bool ok = (sp.affine_dimension() == 1 + && cp.affine_dimension() == 1 + && sp.domain1().affine_dimension() == 2 + && sp.domain2().affine_dimension() == 1 + && cp.domain1().affine_dimension() == 1 + && cp.domain2().affine_dimension() == 1); + + ok = ok && sp.OK() && cp.OK(); + + print_congruences(sp, "*** sp congruences ***"); + print_constraints(sp, "*** sp constraints ***"); + print_congruences(cp, "*** cp congruences ***"); + print_constraints(cp, "*** cp constraints ***"); + + return ok; +} + +// congruences() +bool +test05() { + Variable A(0); + Variable B(1); + Variable C(2); + + Constraint_System cs1; + cs1.insert(A - C <= 8); + cs1.insert(A - C >= 9); + Constraint_System cs2; + cs2.insert(A - C <= 9); + cs2.insert(A - C >= 9); + + SProduct sp(3); + sp.refine_with_constraints(cs1); + CProduct cp(3); + cp.refine_with_constraints(cs2); + + DProduct known_dp1(3, EMPTY); + DProduct known_dp2(3); + known_dp2.refine_with_constraint(A - C == 9); + + DProduct dp1(3); + dp1.refine_with_congruences(sp.congruences()); + DProduct dp2(3); + dp2.refine_with_congruences(cp.congruences()); + + bool ok = (dp1 == known_dp1 && dp2 == known_dp2); + + ok = ok && sp.OK() && cp.OK(); + + print_congruences(sp, "*** sp congruences ***"); + print_constraints(sp, "*** sp constraints ***"); + print_congruences(cp, "*** cp congruences ***"); + print_constraints(cp, "*** cp constraints ***"); + + return ok; +} + +// minimized_congruences() +bool +test06() { + Variable A(0); + Variable B(1); + Variable C(2); + + Constraint_System cs1; + cs1.insert(A - C <= 8); + cs1.insert(A - C >= 9); + Constraint_System cs2; + cs2.insert(A - C <= 9); + cs2.insert(A - C >= 9); + + + SProduct sp(3); + sp.refine_with_constraints(cs1); + CProduct cp(3); + cp.refine_with_constraints(cs2); + + DProduct known_dp1(3, EMPTY); + DProduct known_dp2(3); + known_dp2.refine_with_constraint(A - C == 9); + + DProduct dp1(3); + dp1.refine_with_congruences(sp.minimized_congruences()); + DProduct dp2(3); + dp2.refine_with_congruences(cp.minimized_congruences()); + + bool ok = (dp1 == known_dp1 && dp2 == known_dp2); + + ok = ok && sp.OK() && cp.OK(); + + print_congruences(sp, "*** sp congruences ***"); + print_constraints(sp, "*** sp constraints ***"); + print_congruences(cp, "*** cp congruences ***"); + print_constraints(cp, "*** cp constraints ***"); + + return ok; +} + +// constraints() +bool +test07() { + Variable A(0); + Variable B(1); + Variable C(2); + +#ifdef PH_IS_NNC + Constraint c(A > 9); +#else + Constraint c(A >= 9); +#endif + + SProduct sp(3); + sp.refine_with_congruence((B + C %= 3) / 0); + sp.refine_with_constraint(c); + sp.refine_with_constraint(A <= 8); + CProduct cp(3); + cp.refine_with_congruence((B + C %= 3) / 0); + cp.refine_with_constraint(c); + cp.refine_with_constraint(B <= 11); + cp.refine_with_constraint(B >= 11); + + DProduct dp1(sp.space_dimension()); + DProduct dp2(cp.space_dimension()); + + dp1.refine_with_constraints(sp.constraints()); + dp2.refine_with_constraints(cp.constraints()); + + DProduct known_dp1(sp.space_dimension(), EMPTY); + DProduct known_dp2(sp.space_dimension()); + known_dp2.refine_with_constraint(C == -8); + known_dp2.refine_with_constraint(c); + known_dp2.refine_with_constraint(B == 11); + + bool ok = (dp1 == known_dp1 && dp2 == known_dp2); + + ok = ok && sp.OK() && cp.OK(); + + print_congruences(sp, "*** sp congruences ***"); + print_constraints(sp, "*** sp constraints ***"); + print_congruences(cp, "*** cp congruences ***"); + print_constraints(cp, "*** cp constraints ***"); + + return ok; +} + +// minimized_constraints() +bool +test08() { + Variable A(0); + Variable B(1); + Variable C(2); + +#ifdef PH_IS_NNC + Constraint c(A > 9); +#else + Constraint c(A >= 9); +#endif + + SProduct sp(3); + sp.refine_with_congruence((B + C %= 3) / 0); + sp.refine_with_constraint(c); + sp.refine_with_constraint(A <= 8); + CProduct cp(3); + cp.refine_with_congruence((B + C %= 3) / 0); + cp.refine_with_constraint(c); + cp.refine_with_constraint(B <= 11); + cp.refine_with_constraint(B >= 11); + + DProduct dp1(sp.space_dimension()); + DProduct dp2(cp.space_dimension()); + + dp1.refine_with_constraints(sp.minimized_constraints()); + dp2.refine_with_constraints(cp.minimized_constraints()); + + DProduct known_dp1(sp.space_dimension(), EMPTY); + DProduct known_dp2(sp.space_dimension()); + known_dp2.refine_with_constraint(C == -8); + known_dp2.refine_with_constraint(c); + known_dp2.refine_with_constraint(B == 11); + + bool ok = (dp1 == known_dp1 && dp2 == known_dp2); + + ok = ok && sp.OK() && cp.OK(); + + print_congruences(sp, "*** sp congruences ***"); + print_constraints(sp, "*** sp constraints ***"); + print_congruences(cp, "*** cp congruences ***"); + print_constraints(cp, "*** cp constraints ***"); + + return ok; +} + +// is_empty() where both domain objects have points. +bool +test09() { + Variable A(0); + Variable B(1); + Variable C(2); + + SProduct sp(3); + sp.refine_with_congruence(A %= 9); + sp.refine_with_congruence(B + C %= 3); + + bool smash_ok = !sp.is_empty(); + + smash_ok = smash_ok && sp.OK(); + + CProduct cp(3); + cp.refine_with_congruence(A %= 9); + cp.refine_with_congruence(B + C %= 3); + + bool cons_ok = !cp.is_empty(); + + cons_ok = cons_ok && cp.OK(); + + print_congruences(sp, "*** sp congruences ***"); + print_constraints(sp, "*** sp constraints ***"); + print_congruences(cp, "*** cp congruences ***"); + print_constraints(cp, "*** cp constraints ***"); + + return smash_ok && cons_ok; +} + +// is_empty(). +bool +test10() { + Variable A(0); + + SProduct sp(3); + sp.refine_with_constraint(A <= 1); + sp.refine_with_constraint(A >= 3); + + bool smash_ok = sp.is_empty(); + smash_ok = smash_ok && sp.OK(); + + CProduct cp(3); + cp.refine_with_constraint(A >= 1); + cp.refine_with_constraint(A <= 1); + cp.refine_with_congruence((A %= 3) / 0); + + bool cons_ok = cp.is_empty(); + cons_ok = cons_ok && cp.OK(); + + print_congruences(sp, "*** sp congruences ***"); + print_constraints(sp, "*** sp constraints ***"); + print_congruences(cp, "*** cp congruences ***"); + print_constraints(cp, "*** cp constraints ***"); + + return smash_ok && cons_ok; +} + +// is_topologically_closed(). +bool +test11() { + Variable A(0); + + SProduct sp(3); + bool smash_ok; + CProduct cp(3); + bool cons_ok; +#ifdef PH_IS_NNC + sp.refine_with_constraint(A < 3); + cp.refine_with_constraint(A < 3); + + smash_ok = !sp.is_topologically_closed(); + cons_ok = !cp.is_topologically_closed(); +#else + sp.refine_with_constraint(A <= 3); + cp.refine_with_constraint(A <= 3); + + smash_ok = sp.is_topologically_closed(); + cons_ok = cp.is_topologically_closed(); +#endif + smash_ok = smash_ok && sp.OK(); + cons_ok = cons_ok && cp.OK(); + + if (!smash_ok || !cons_ok) { + print_congruences(sp, "*** sp congruences non-empty ***"); + print_constraints(sp, "*** sp constraints non-empty ***"); + print_congruences(cp, "*** cp congruences non-empty ***"); + print_constraints(cp, "*** cp constraints non-empty ***"); + return false; + } + + sp.refine_with_congruence((A %= 0) / 2); + sp.refine_with_congruence((A %= 1) / 2); +#ifdef PH_IS_NNC + cp.refine_with_congruence((A %= 2) / 0); +#else + cp.refine_with_congruence((A %= 2) / 0); +#endif + + smash_ok = sp.is_topologically_closed(); + cons_ok = cp.is_topologically_closed(); + smash_ok = smash_ok && sp.OK(); + cons_ok = cons_ok && cp.OK(); + + print_congruences(sp, "*** sp congruences ***"); + print_constraints(sp, "*** sp constraints ***"); + print_congruences(cp, "*** cp congruences ***"); + print_constraints(cp, "*** cp constraints ***"); + + return smash_ok && cons_ok; +} + +// is_disjoint_from(). +bool +test12() { + Variable B(1); + + SProduct sp1(4); + sp1.refine_with_constraint(B <= 3); + sp1.refine_with_constraint(B >= 3); + + SProduct sp2(4); + sp2.refine_with_congruence((B %= 1) / 3); + + bool ok = !sp1.is_disjoint_from(sp2); + ok = ok && sp1.OK() && sp2.OK(); + + print_congruences(sp1, "*** sp1 congruences ***"); + print_constraints(sp1, "*** sp1 constraints ***"); + print_congruences(sp2, "*** sp2 congruences ***"); + print_constraints(sp2, "*** sp2 constraints ***"); + + if (!ok) + return false; + + CProduct cp1(4); + cp1.refine_with_constraint(B <= 3); + cp1.refine_with_constraint(B >= 3); + + CProduct cp2(4); + cp2.refine_with_congruence((B %= 1) / 3); + + ok = cp1.is_disjoint_from(cp2); + ok = ok && cp1.OK() && cp2.OK(); + + print_congruences(cp1, "*** cp1 congruences ***"); + print_constraints(cp1, "*** cp1 constraints ***"); + print_congruences(cp2, "*** cp2 congruences ***"); + print_constraints(cp2, "*** cp2 constraints ***"); + + return ok; +} + +// is_bounded(). +bool +test13() { + 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 ***"); + + if (!ok) + return false; + + CProduct cp(2); + cp.refine_with_constraint(A >= 1); + cp.refine_with_constraint(A <= 1); + cp.refine_with_congruence((A %= 1) / 3); + cp.refine_with_congruence((B %= 1) / 0); + + ok = cp.is_bounded(); + ok = ok && cp.OK(); + + print_congruences(cp, "*** cp congruences ***"); + print_constraints(cp, "*** cp constraints ***"); + + return ok; +} + +// ok(), not reduced. +bool +test14() { + 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.OK(); + +#if PH_IS_FIRST + print_constraints(sp.domain1().constraints(), + "*** sp,domain1() constraints ***"); + print_congruences(sp.domain2().congruences(), + "*** sp,domain2() congruences ***"); +#else + print_congruences(sp.domain1().congruences(), + "*** sp,domain1() congruences ***"); + print_constraints(sp.domain2().constraints(), + "*** sp,domain2() constraints ***"); +#endif + + if (!ok) + return false; + + CProduct cp(2); + cp.refine_with_constraint(A >= 1); + cp.refine_with_constraint(A <= 1); + cp.refine_with_congruence((A %= 1) / 3); + cp.refine_with_congruence((B %= 1) / 0); + + ok = cp.OK(); + +#if PH_IS_FIRST + print_constraints(cp.domain1().constraints(), + "*** cp,domain1() constraints ***"); + print_congruences(cp.domain2().congruences(), + "*** cp,domain2() congruences ***"); +#else + print_congruences(cp.domain1().congruences(), + "*** cp,domain1() congruences ***"); + print_constraints(cp.domain2().constraints(), + "*** cp,domain2() constraints ***"); +#endif + + return ok; +} + +// ok(), is reduced. +bool +test15() { + 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(); + + if (!ok) { + print_constraints(sp_cs, "*** sp.constraints(); ***"); + return false; + } + + Grid sp_gr(sp_cs); + ok = sp_gr.is_empty(); + +#if PH_IS_FIRST + print_constraints(sp.domain1().constraints(), + "*** sp.domain1() constraints ***"); + print_congruences(sp.domain2().congruences(), + "*** sp.domain2() congruences ***"); +#else + print_congruences(sp.domain1().congruences(), + "*** sp.domain1() congruences ***"); + print_constraints(sp.domain2().constraints(), + "*** sp.domain2() constraints ***"); +#endif + + if (!ok) + return false; + + CProduct cp(2); + cp.refine_with_constraint(A >= 1); + cp.refine_with_constraint(A <= 1); + cp.refine_with_congruence((A %= 1) / 3); + cp.refine_with_congruence((B %= 1) / 0); + + // reduce the product + Constraint_System cp_cs = sp.constraints(); + + ok = cp.OK(); + + if (!ok) { + print_constraints(cp_cs, "*** cp.constraints(); ***"); + return false; + } + + Grid cp_gr(cp_cs); + ok = (cp_gr.affine_dimension() == 0); + +#if PH_IS_FIRST + print_constraints(cp.domain1().constraints(), + "*** cp.domain1() constraints ***"); + print_congruences(cp.domain2().congruences(), + "*** cp.domain2() congruences ***"); +#else + print_congruences(cp.domain1().congruences(), + "*** cp.domain1() congruences ***"); + print_constraints(cp.domain2().constraints(), + "*** cp.domain2() constraints ***"); +#endif + + return ok; +} + +// Building from inequality constraints() +bool +test16() { + 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 +test17() { + 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); + CProduct cp(cgs2); + + + bool ok = sp.OK() && cp.OK(); + + print_congruences(sp, "*** sp congruences ***"); + print_constraints(sp, "*** sp constraints ***"); + print_congruences(cp, "*** cp congruences ***"); + print_constraints(cp, "*** cp constraints ***"); + + return ok; +} + +// refine_with_congruences +bool +test18() { + 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); + CProduct cp(2); + + sp.refine_with_congruences(cgs); + cp.refine_with_congruences(cgs); + + Grid gr(cgs); + + SProduct known_sp(gr); + CProduct known_cp(gr); + + bool ok = (sp == known_sp && cp == known_cp); + + print_constraints(sp, "*** sp constraints ***"); + print_congruences(sp, "*** sp congruences ***"); + print_constraints(cp, "*** cp constraints ***"); + print_congruences(cp, "*** cp congruences ***"); + + return ok; +} + +// add_recycled_congruences +bool +test19() { + Variable A(0); + Variable B(1); + + Congruence_System cgs; + cgs.insert((A + B %= 0) / 2); + cgs.insert((A %= 0) / 0); + + SProduct sp(2); + CProduct cp(2); + + Congruence_System cgs_copy = cgs; + Congruence_System cgs_copy2 = cgs; + + sp.add_recycled_congruences(cgs); + cp.add_recycled_congruences(cgs_copy); + + Grid gr(cgs_copy2); + + SProduct known_sp(gr); + CProduct known_cp(gr); + + bool ok = (sp == known_sp && cp == known_cp); + + print_constraints(sp, "*** sp constraints ***"); + print_congruences(sp, "*** sp congruences ***"); + print_constraints(cp, "*** cp constraints ***"); + print_congruences(cp, "*** cp congruences ***"); + + return ok; +} + +// add_recycled_congruences +bool +test20() { + 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); + + SProduct sp(2); + CProduct cp(2); + + Congruence_System cgs_copy = cgs; + Congruence_System cgs_copy2 = cgs; + + sp.add_recycled_congruences(cgs); + cp.add_recycled_congruences(cgs_copy); + + Grid gr(cgs_copy2); + + SProduct known_sp(gr); + CProduct known_cp(gr); + + bool ok = (sp == known_sp && cp == known_cp); + + print_constraints(sp, "*** sp constraints ***"); + print_congruences(sp, "*** sp congruences ***"); + print_constraints(cp, "*** cp constraints ***"); + print_congruences(cp, "*** cp 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); + 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/Partially_Reduced_Product/partiallyreducedproduct2.cc b/tests/Partially_Reduced_Product/partiallyreducedproduct2.cc new file mode 100644 index 0000000..3713e7a --- /dev/null +++ b/tests/Partially_Reduced_Product/partiallyreducedproduct2.cc @@ -0,0 +1,960 @@ +/* Test Partially_Reduced_Product<>. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +#define PH_IS_NNC +// #define PH_IS_FIRST + +#ifdef PH_IS_NNC +typedef NNC_Polyhedron Poly; +#else +typedef C_Polyhedron Poly; +#endif + +#ifdef PH_IS_FIRST +typedef Domain_Product::Smash_Product SProduct; +typedef Domain_Product::Constraints_Product CProduct; +#else +typedef Domain_Product::Smash_Product SProduct; +typedef Domain_Product::Constraints_Product CProduct; +#endif + +namespace { + +// Tests 1-10 are for just the Smash_Product domains. + +// space_dimension() +bool +test01() { + Variable A(0); + Variable E(4); + +#ifdef PH_IS_NNC + Constraint_System cs(A + E < 9); +#else + Constraint_System cs(A + E <= 9); +#endif + + 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 +test02() { + 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 +test03() { + 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 +test04() { + 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 +test05() { + 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 +test06() { + 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 +test07() { + 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 +test08() { + 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 +test09() { + 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 +test10() { + 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; +} + +// Tests 11-20 are for just the Constraints_Product domain. + +// space_dimension() +bool +test11() { + Variable A(0); + Variable E(4); + + Constraint_System cs; + cs.insert(A + E <= 9); + cs.insert(A + E >= 9); + + CProduct 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; +} + +// affine_dimension() +bool +test12() { + Variable A(0); + Variable B(1); + Variable C(2); + + CProduct cp(3); + cp.refine_with_constraint(A - C <= 9); + cp.refine_with_constraint(A - C >= 9); + cp.refine_with_constraint(B >= 2); + + bool cons_ok = cp.space_dimension() == 3; + cons_ok = cons_ok && cp.affine_dimension() == 2; + + if (cons_ok) { + cp.refine_with_constraint(A - B >= 4); + cp.refine_with_constraint(A - B <= 4); + + cons_ok = cons_ok && cp.affine_dimension() == 1; + } + + print_congruences(cp, "*** cp congruences ***"); + print_constraints(cp, "*** cp constraints ***"); + + return cons_ok; +} + +// contains() +bool +test13() { + Variable A(0); + + CProduct cp1(1); + cp1.refine_with_constraint(A <= 3); + cp1.refine_with_congruence((A %= 1) / 2); + + CProduct cp2(1); + cp2.refine_with_constraint(A <= 2); + cp2.refine_with_constraint(A >= 2); + cp2.refine_with_congruence((A %= 1) / 4); + + bool cons_ok1 = cp1.contains(cp2) && cp1.strictly_contains(cp2); + + print_constraints(cp1, "*** cp1 constraints ***"); + print_congruences(cp1, "*** cp1 congruences ***"); + + if (!cons_ok1) + return cons_ok1; + + CProduct cp3(1); + cp3.refine_with_constraint(A <= 3); + cp3.refine_with_congruence((A %= 1) / 0); + + CProduct cp4(1); + cp4.refine_with_constraint(A == 1); + + bool cons_ok2 = cp3.contains(cp4) && !cp3.strictly_contains(cp4); + + print_constraints(cp3, "*** cp3 constraints ***"); + print_congruences(cp3, "*** cp3 congruences ***"); + + if (!cons_ok2) + return cons_ok2; + + CProduct cp5(1); + cp5.refine_with_constraint(A <= 3); + cp5.refine_with_constraint(A >= 4); + cp5.refine_with_congruence((A %= 1) / 2); + cp5.refine_with_congruence((A %= 0) / 2); + + CProduct cp6(1, EMPTY); + + bool cons_ok3 = cp5.contains(cp6) && !cp5.strictly_contains(cp6); + + print_constraints(cp5, "*** cp5 constraints ***"); + print_congruences(cp5, "*** cp5 congruences ***"); + + return cons_ok3; +} + +// intersection_assign() +bool +test14() { + Variable A(0); + Variable B(1); + + CProduct cp1(3); + cp1.refine_with_constraint(A >= 0); + cp1.refine_with_congruence((A %= 0) / 2); + + CProduct cp2(3); + cp2.refine_with_constraint(A <= 0); + cp2.refine_with_congruence((A %= 0) / 2); + + cp1.intersection_assign(cp2); + + CProduct known_cp(3); + known_cp.refine_with_constraint(A == 0); + known_cp.refine_with_congruence((A %= 0) / 2); + + bool cons_ok1 = (cp1 == known_cp); + if (!cons_ok1) { + print_congruences(cp1, "*** cp1 congruences ***"); + print_constraints(cp1, "*** cp1 constraints ***"); + print_congruences(cp2, "*** cp2 congruences ***"); + print_constraints(cp2, "*** cp2 constraints ***"); + return cons_ok1; + } + + cp2.refine_with_constraint(A >= 1); + cp1.intersection_assign(cp2); + + known_cp.refine_with_constraint(A == 1); + + bool cons_ok2 = (cp1 == known_cp); + + print_congruences(cp1, "*** cp1 congruences ***"); + print_constraints(cp1, "*** cp1 constraints ***"); + print_congruences(cp2, "*** cp2 congruences ***"); + print_constraints(cp2, "*** cp2 constraints ***"); + + return cons_ok2; +} + +// upper_bound_assign(cp2) +bool +test15() { + Variable A(0); + + CProduct cp(1); + cp.refine_with_constraint(A <= 18); + cp.refine_with_constraint(A >= 18); + + CProduct cp1(cp); + + CProduct cp2(1); + cp2.refine_with_congruence((A %= 18) / 20); + + cp1.upper_bound_assign(cp2); + + CProduct known_cp(1); + known_cp.refine_with_congruence((A %= 18) / 20); + + bool cons_ok = (cp1 == known_cp); + + print_congruences(cp1, "*** cp1 congruences ***"); + print_constraints(cp1, "*** cp1 constraints ***"); + + if (!cons_ok) { + return false; + } + + cp2.upper_bound_assign(cp1); + + cons_ok = (cp2 == known_cp); + + print_congruences(cp2, "*** cp2 congruences ***"); + print_constraints(cp2, "*** cp2 constraints ***"); + + return cons_ok; +} + +// upper_bound_assign_if_exact() +bool +test16() { + Variable A(0); + Variable B(1); + + CProduct cp(3); + cp.refine_with_congruence((A %= 0) / 2); + cp.refine_with_congruence((B %= 0) / 2); + + CProduct cp1(cp); + + CProduct cp2(3); + cp2.refine_with_congruence((A %= 1) / 3); + cp2.refine_with_congruence((B %= 1) / 3); + + bool cons_ok = (!cp1.upper_bound_assign_if_exact(cp2) + && !cp2.upper_bound_assign_if_exact(cp1)); + + if (!cons_ok) { + print_congruences(cp1, "*** cp1 congruences ub exact ***"); + print_constraints(cp1, "*** cp1 constraints ub exact ***"); + print_congruences(cp2, "*** cp2 congruences ub exact ***"); + print_constraints(cp2, "*** cp2 constraints ub exact ***"); + return false; + } + + cons_ok = (cp == cp1); + + print_congruences(cp1, "*** cp1 congruences ***"); + print_constraints(cp1, "*** cp1 constraints ***"); + print_congruences(cp2, "*** cp2 congruences ***"); + print_constraints(cp2, "*** cp2 constraints ***"); + + if (!cons_ok) + return false; + + cp1.refine_with_congruence((B %= 1) / 2); + + cp2.refine_with_constraint(B >= 1); + cp2.refine_with_constraint(B <= 1); + + cons_ok = cp1.upper_bound_assign_if_exact(cp2) + && cp2.upper_bound_assign_if_exact(cp1); + + if (!cons_ok) + return false; + + CProduct known_cp(3); + known_cp.refine_with_congruence((B %= 1) / 0); + known_cp.refine_with_congruence((A %= 1) / 3); + + cons_ok = (cp1 == known_cp) && (cp2 == known_cp); + + print_congruences(cp1, "*** cp1 congruences ***"); + print_constraints(cp1, "*** cp1 constraints ***"); + print_congruences(cp2, "*** cp2 congruences ***"); + print_constraints(cp2, "*** cp2 constraints ***"); + + return (cons_ok); +} + +// difference_assign(cp2) +bool +test17() { + Variable A(0); + Variable B(1); + + CProduct cp(1); + cp.refine_with_constraint(A <= 18); + cp.refine_with_constraint(A >= 18); + + CProduct cp1(cp); + + CProduct cp2(1); + cp2.refine_with_congruence((A %= 18) / 20); + + cp1.difference_assign(cp2); + + bool cons_ok = cp1.is_empty(); + + print_congruences(cp1, "*** cp1 congruences ***"); + print_constraints(cp1, "*** cp1 constraints ***"); + + if (!cons_ok) + return false; + + cp2.difference_assign(cp1); + + CProduct known_cp(1); + known_cp.refine_with_congruence((A %= 18) / 20); + + cons_ok = (cp2 == known_cp); + + print_congruences(cp2, "*** cp2 congruences ***"); + print_constraints(cp2, "*** cp2 constraints ***"); + + return cons_ok; +} + +// time_elapse_assign(y) +bool +test18() { + Variable A(0); + Variable B(1); + Variable C(2); + + CProduct cp1(3); + cp1.refine_with_constraint(A >= 0); + cp1.refine_with_constraint(B >= 0); + cp1.refine_with_constraint(A + B >= 3); + cp1.refine_with_constraint(2*A - B == 0); + cp1.refine_with_constraint(3*A + C == 0); + cp1.refine_with_congruence(3*A %= 0); + + CProduct cp2(3); + cp2.refine_with_constraint(7*C == 4); + cp2.refine_with_constraint(7*B == -1); + cp2.refine_with_constraint(7*A == 3); + + cp1.time_elapse_assign(cp2); + + CProduct known_cp(3); + known_cp.refine_with_constraint(5*A - 13*B - 7*C == 0); + known_cp.refine_with_constraint(3*A + C >= 0); + known_cp.refine_with_constraint(A + B >= 3); + known_cp.refine_with_constraint(4*A - 3*C >= 13); + known_cp.refine_with_congruence((65*A - B %= 0) / 7); + known_cp.refine_with_congruence(21*A %= 0); + + bool cons_ok = (cp1 == known_cp); + + print_congruences(cp1, "*** cp1.time_elapse_assign(cp2) congruences ***"); + print_constraints(cp1, "*** cp1.time_elapse_assign(cp2) constraints ***"); + print_congruences(cp2, "*** cp2.time_elapse_assign(cp2) congruences ***"); + print_constraints(cp2, "*** cp2.time_elapse_assign(cp2) constraints ***"); + + return cons_ok; +} + +// topological_closure_assign +bool +test19() { + Variable A(0); + Variable B(1); + Variable C(2); + + CProduct cp(3); + cp.refine_with_constraint(B >= 0); + cp.refine_with_constraint(3*A + C == 0); + cp.refine_with_constraint(2*A - B == 0); + cp.refine_with_congruence(3*A %= 0); +#ifdef PH_IS_NNC + cp.refine_with_constraint(A > 0); +#else + cp.refine_with_constraint(A >= 0); +#endif + + print_congruences(cp, "*** cp congruences ***"); + print_constraints(cp, "*** cp constraints ***"); + + cp.topological_closure_assign(); + + CProduct known_cp(3); + known_cp.refine_with_constraint(B >= 0); + known_cp.refine_with_constraint(3*A + C == 0); + known_cp.refine_with_constraint(2*A - B == 0); + known_cp.refine_with_congruence(3*A %= 0); + known_cp.refine_with_constraint(A >= 0); + + bool cons_ok = (cp == known_cp); + + print_congruences(cp, "*** cp congruences ***"); + print_constraints(cp, "*** cp constraints ***"); + + return cons_ok; +} + +// widening_assign +bool +test20() { + Variable A(0); + Variable B(1); + Variable C(2); + + CProduct cp_prev(3); + cp_prev.refine_with_constraint(C == 0); + cp_prev.refine_with_constraint(A - B >= 1); + cp_prev.refine_with_constraint(A <= 2); + cp_prev.refine_with_constraint(B >= 0); + cp_prev.refine_with_congruence((B %= 0) / 2); + cp_prev.refine_with_congruence(3*A %= 0); + + print_congruences(cp_prev, "*** cp_prev congruences ***"); + print_constraints(cp_prev, "*** cp_prev constraints ***"); + + CProduct cp(3); + cp.refine_with_constraint(C == 0); + cp.refine_with_constraint(A <= 2); + cp.refine_with_constraint(B >= 0); + cp.refine_with_constraint(2*A - B >= 2); + cp.refine_with_constraint(B >= 0); + cp.refine_with_congruence(6*A %= 0); + cp.refine_with_congruence((B %= 0) / 2); + + cp.upper_bound_assign(cp_prev); + + print_congruences(cp, "*** cp congruences ***"); + print_constraints(cp, "*** cp constraints ***"); + + cp.widening_assign(cp_prev); + + CProduct known_cp(3); + known_cp.refine_with_constraint(C == 0); + known_cp.refine_with_constraint(A <= 2); + known_cp.refine_with_constraint(B >= 0); + known_cp.refine_with_congruence((B %= 0) / 2); + + bool cons_ok = (cp == known_cp); + + print_congruences(cp, "*** cp.widening_assign(cp_prev) congruences ***"); + print_constraints(cp, "*** cp.widening_assign(cp_prev) constraints ***"); + + return cons_ok; +} + +// time_elapse_assign(y) where the initial products are not reduced +// and only one component of the second product is empty. +bool +test21() { + Variable A(0); + + CProduct cp1(1); + cp1.refine_with_constraint(A == A); + + CProduct cp2(1); + cp2.refine_with_constraint(A >= 1); + cp2.refine_with_constraint(A <= 0); + + cp1.time_elapse_assign(cp2); + + CProduct known_cp(1, EMPTY); + + bool cons_ok = cp1.OK() && (cp1 == known_cp); + + print_congruences(cp1, "*** cp1.time_elapse_assign(cp2) congruences ***"); + print_constraints(cp1, "*** cp1.time_elapse_assign(cp2) constraints ***"); + + print_congruences(cp2, "*** cp2 congruences ***"); + print_constraints(cp2, "*** cp2 constraints ***"); + + return cons_ok; +} + +// time_elapse_assign(y) where the initial products are not reduced +// and the second product has non-intersecting single point components. +bool +test22() { + Variable A(0); + + + CProduct cp1(1); + + print_congruences(cp1, "*** cp1 congruences ***"); + print_constraints(cp1, "*** cp1 constraints ***"); + + Grid gr(1); + gr.refine_with_congruence((A %= 0)/ 2); + + CProduct cp2(gr); + + cp2.refine_with_constraint(A >= 1); + cp2.refine_with_constraint(A <= 1); + + cp1.time_elapse_assign(cp2); + + CProduct known_cp(1, EMPTY); + + bool cons_ok = cp1.OK() && (cp1 == known_cp); + + print_congruences(cp1, "*** cp1.time_elapse_assign(cp2) congruences ***"); + print_constraints(cp1, "*** cp1.time_elapse_assign(cp2) constraints ***"); + + print_congruences(cp2, "*** cp2 congruences ***"); + print_constraints(cp2, "*** cp2 constraints ***"); + + return cons_ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + DO_TEST(test06); + DO_TEST(test07); + DO_TEST_F8(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_F8(test18); + DO_TEST(test19); + DO_TEST(test20); + DO_TEST(test21); + DO_TEST(test22); +END_MAIN diff --git a/tests/Partially_Reduced_Product/partiallyreducedproduct3.cc b/tests/Partially_Reduced_Product/partiallyreducedproduct3.cc new file mode 100644 index 0000000..e65d49d --- /dev/null +++ b/tests/Partially_Reduced_Product/partiallyreducedproduct3.cc @@ -0,0 +1,755 @@ +/* Test Partially_Reduced_Product<>. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +using namespace Parma_Polyhedra_Library::IO_Operators; + +#define PH_IS_NNC +// #define PH_IS_FIRST + +#ifdef PH_IS_NNC +typedef NNC_Polyhedron Poly; +#else +typedef C_Polyhedron Poly; +#endif + +#ifdef PH_IS_FIRST +typedef Domain_Product::Direct_Product DProduct; +typedef Domain_Product::Smash_Product SProduct; +typedef Domain_Product::Constraints_Product CProduct; +#else +typedef Domain_Product::Direct_Product DProduct; +typedef Domain_Product::Smash_Product SProduct; +typedef Domain_Product::Constraints_Product CProduct; +#endif + +namespace { + +// relation_with a generator +bool +test01() { + Variable A(0); + Variable B(1); + + Generator pnt(point(A + B)); + + SProduct sp(2); + sp.refine_with_constraint(A >= 1); + sp.refine_with_constraint(A <= 1); + CProduct cp(2); + cp.refine_with_constraint(A >= 1); + cp.refine_with_constraint(A <= 1); + + bool smash_ok = Poly_Gen_Relation::subsumes() == sp.relation_with(pnt); + bool cons_ok = Poly_Gen_Relation::subsumes() == cp.relation_with(pnt); + + if (!smash_ok) { + print_constraints(sp, "*** sp constraints subsumes ***"); + print_congruences(sp, "*** sp congruences subsumes ***"); + return false; + } + + if (!cons_ok) { + print_constraints(cp, "*** cp constraints subsumes ***"); + print_congruences(cp, "*** cp congruences subsumes ***"); + return false; + } + + sp.refine_with_congruence((A %= 0) / 2); + cp.refine_with_congruence((A %= 0) / 2); + + smash_ok = Poly_Gen_Relation::nothing() == sp.relation_with(pnt); + cons_ok = Poly_Gen_Relation::nothing() == cp.relation_with(pnt); + + print_constraints(sp, "*** sp constraints nothing ***"); + print_congruences(sp, "*** sp congruences nothing ***"); + print_constraints(cp, "*** cp constraints nothing ***"); + print_congruences(cp, "*** cp congruences nothing ***"); + + return smash_ok && cons_ok; +} + +// Empty smash product; relation_with a constraint. +bool +test02() { + Variable A(0); + Variable B(1); + + SProduct sp(2); + sp.refine_with_constraint(A >= 1); + sp.refine_with_constraint(A <= 1); + sp.refine_with_congruence((A %= 2) / 0); + + bool ok = (sp.relation_with(B == 0) + == (Poly_Con_Relation::is_included() + && Poly_Con_Relation::is_disjoint() + && Poly_Con_Relation::saturates()) + && sp.relation_with(B >= 0) + == (Poly_Con_Relation::is_included() + && Poly_Con_Relation::is_disjoint() + && Poly_Con_Relation::saturates())); + + print_constraints(sp, "*** sp constraints ***"); + print_congruences(sp, "*** sp congruences ***"); + + return ok; +} + +// Empty constraints product; relation_with a constraint. +bool +test03() { + Variable A(0); + Variable B(1); + + CProduct cp(2); + cp.refine_with_constraint(A >= 1); + cp.refine_with_constraint(A <= 1); + cp.refine_with_congruence((A %= 0) / 2); + + bool ok = (cp.relation_with(B == 0) + == (Poly_Con_Relation::is_included() + && Poly_Con_Relation::is_disjoint() + && Poly_Con_Relation::saturates()) + && cp.relation_with(B >= 0) + == (Poly_Con_Relation::is_included() + && Poly_Con_Relation::is_disjoint() + && Poly_Con_Relation::saturates())); + + print_constraints(cp, "*** cp constraints ***"); + print_congruences(cp, "*** cp congruences ***"); + + return ok; +} + +// Non-empty smash product; relation_with a constraint. +bool +test04() { + Variable A(0); + Variable B(1); + Variable C(2); + + SProduct sp(3); + sp.refine_with_constraint(3*A + 3*B + C == 7); + sp.refine_with_constraint(3*A - C >= 2); + sp.refine_with_congruence(6*A + 3*B %= 0); + + bool ok = (sp.relation_with(A + B + C == 0) + == Poly_Con_Relation::nothing() + && sp.relation_with(A + B == 0) + == Poly_Con_Relation::nothing() + && sp.relation_with(A == 0) + == Poly_Con_Relation::nothing() + && sp.relation_with(Linear_Expression(0) == 0) + == (Poly_Con_Relation::is_included() + && Poly_Con_Relation::saturates()) + && sp.relation_with(2*A + B >= 3) + == Poly_Con_Relation::is_included() + && sp.relation_with(3*A + 3*B + C >= 7) + == (Poly_Con_Relation::is_included() + && Poly_Con_Relation::saturates()) + && sp.relation_with(3*A - C <= 3) + == (Poly_Con_Relation::nothing())); + + print_constraints(sp, "*** sp constraints ***"); + print_congruences(sp, "*** sp congruences ***"); + + return ok; +} + +// A non-empty constraints product; relation_with a constraint. +bool +test05() { + Variable A(0); + Variable B(1); + Variable C(2); + + CProduct cp(3); + cp.refine_with_constraint(3*A + 3*B + C >= 7); + cp.refine_with_constraint(3*A + 3*B + C <= 7); + cp.refine_with_constraint(3*A - C >= 2); + cp.refine_with_congruence(6*A + 3*B %= 0); + + bool ok = (cp.relation_with(A + B + C == 0) + == Poly_Con_Relation::nothing() + && cp.relation_with(A + B == 0) + == Poly_Con_Relation::nothing() + && cp.relation_with(A == 0) + == Poly_Con_Relation::nothing() + && cp.relation_with(Linear_Expression(0) == 0) + == (Poly_Con_Relation::is_included() + && Poly_Con_Relation::saturates()) + && cp.relation_with(2*A + B >= 3) + == Poly_Con_Relation::is_included() + && cp.relation_with(3*A + 3*B + C >= 7) + == (Poly_Con_Relation::is_included() + && Poly_Con_Relation::saturates()) + && cp.relation_with(3*A - C <= 3) + == (Poly_Con_Relation::nothing())); + + print_constraints(cp, "*** cp constraints ***"); + print_congruences(cp, "*** cp congruences ***"); + + return ok; +} + +// Non-empty smash product; relation_with a congruence. +bool +test06() { + Variable A(0); + Variable B(1); + Variable C(2); + + SProduct sp(3); + sp.refine_with_constraint(3*A + 3*B + C == 7); + sp.refine_with_constraint(3*A - C >= 2); + sp.refine_with_congruence(6*A + 3*B %= 0); + + Poly_Con_Relation rel1 = sp.relation_with(A + B + C %= 0); + Poly_Con_Relation rel2 = sp.relation_with(A + B %= 0); + Poly_Con_Relation rel3 = sp.relation_with(A %= 0); + Poly_Con_Relation rel4 = sp.relation_with(Linear_Expression(0) %= 0); + Poly_Con_Relation rel5 = sp.relation_with(2*A + B %= 3); + Poly_Con_Relation rel6 = sp.relation_with(3*A + 3*B + C %= 7); + Poly_Con_Relation rel7 = sp.relation_with(3*A - C %= 3); + bool ok = (rel1 == Poly_Con_Relation::nothing() + && rel2 == Poly_Con_Relation::nothing() + && rel3 == Poly_Con_Relation::nothing() + && rel4 == (Poly_Con_Relation::is_included() + && Poly_Con_Relation::saturates()) + && rel5 == Poly_Con_Relation::nothing() + && rel6 == (Poly_Con_Relation::is_included() + && Poly_Con_Relation::saturates()) + && rel7 == (Poly_Con_Relation::is_included())); + + nout << "sp.relation_with(A + B + C %= 0) == " << rel1 << endl; + nout << "sp.relation_with(A + B %= 0) == " << rel2 << endl; + nout << "sp.relation_with(A %= 0) == " << rel3 << endl; + nout << "sp.relation_with(Linear_Expression(0) %= 0) == " << rel4 << endl; + nout << "sp.relation_with(2*A + B %= 3) == " << rel5 << endl; + nout << "sp.relation_with(3*A + 3*B + C %= 7) == " << rel6 << endl; + nout << "sp.relation_with(3*A - C %= 3) == " << rel7 << endl; + print_constraints(sp, "*** sp constraints ***"); + print_congruences(sp, "*** sp congruences ***"); + + return ok; +} + +// A non-empty constraints product; relation_with a congruence. +bool +test07() { + Variable A(0); + Variable B(1); + Variable C(2); + + CProduct cp(3); + cp.refine_with_constraint(3*A + 3*B + C >= 7); + cp.refine_with_constraint(3*A + 3*B + C <= 7); + cp.refine_with_constraint(3*A - C >= 2); + cp.refine_with_congruence(6*A + 3*B %= 0); + + Poly_Con_Relation rel1 = cp.relation_with(A + B + C %= 0); + Poly_Con_Relation rel2 = cp.relation_with(A + B %= 0); + Poly_Con_Relation rel3 = cp.relation_with(A %= 0); + Poly_Con_Relation rel4 = cp.relation_with(Linear_Expression(0) %= 0); + Poly_Con_Relation rel5 = cp.relation_with(2*A + B %= 3); + Poly_Con_Relation rel6 = cp.relation_with(3*A + 3*B + C %= 7); + Poly_Con_Relation rel7 = cp.relation_with(3*A - C %= 3); + bool ok = (rel1 == Poly_Con_Relation::nothing() + && rel2 == Poly_Con_Relation::nothing() + && rel3 == Poly_Con_Relation::nothing() + && rel4 == (Poly_Con_Relation::is_included() + && Poly_Con_Relation::saturates()) + && rel5 == Poly_Con_Relation::nothing() + && rel6 == (Poly_Con_Relation::is_included() + && Poly_Con_Relation::saturates()) + && rel7 == (Poly_Con_Relation::is_included())); + + nout << "cp.relation_with(A + B + C %= 0) == " << rel1 << endl; + nout << "cp.relation_with(A + B %= 0) == " << rel2 << endl; + nout << "cp.relation_with(A %= 0) == " << rel3 << endl; + nout << "cp.relation_with(Linear_Expression(0) %= 0) == " << rel4 << endl; + nout << "cp.relation_with(2*A + B %= 3) == " << rel5 << endl; + nout << "cp.relation_with(3*A + 3*B + C %= 7) == " << rel6 << endl; + nout << "cp.relation_with(3*A - C %= 3) == " << rel7 << endl; + print_constraints(cp, "*** cp constraints ***"); + print_congruences(cp, "*** cp congruences ***"); + + return ok; +} + +// Smash product; bounds_from_above() and bounds_from_below() when bounded. +bool +test08() { + Variable A(0); + Variable B(1); + + SProduct sp(2); + sp.refine_with_constraint(A >= 1); + sp.refine_with_constraint(A <= 1); + sp.refine_with_congruence((A %= 2) / 0); + + Linear_Expression le = A + B; + bool ok = sp.bounds_from_above(le) + && sp.bounds_from_below(le); + + print_congruences(sp, "*** sp congruences ***"); + print_constraints(sp, "*** sp constraints ***"); + + return ok; +} + +// Constraints product; bounds_from_above() and bounds_from_below() +// when bounded. +bool + test09() { + Variable A(0); + Variable B(1); + + CProduct cp(2); + cp.refine_with_constraint(A >= 1); + cp.refine_with_constraint(A <= 1); + cp.refine_with_congruence((A %= 0) / 2); + + Linear_Expression le = A + B; + bool ok = cp.bounds_from_above(le) + && cp.bounds_from_below(le); + + print_congruences(cp, "*** cp congruences ***"); + print_constraints(cp, "*** cp constraints ***"); + + return ok; +} + +// Smash product; bounds_from_above() and bounds_from_below() +// when not bounded. +bool +test10() { + Variable A(0); + Variable B(1); + + SProduct sp(2); + sp.refine_with_constraint(A >= 1); + sp.refine_with_constraint(A <= 1); + sp.refine_with_congruence((A %= 0) / 2); + + Linear_Expression le = 2*A - B; + + bool ok = !sp.bounds_from_above(le) + && !sp.bounds_from_below(le); + + print_congruences(sp, "*** sp congruences ***"); + print_constraints(sp, "*** sp constraints ***"); + + return ok; +} + +// Constraints product; bounds_from_above() and bounds_from_below() +// when it is not bounded. +bool +test11() { + Variable A(0); + Variable B(1); + + SProduct sp(2); + sp.refine_with_constraint(A >= 1); + sp.refine_with_constraint(A <= 1); + sp.refine_with_congruence((A %= 1) / 2); + + Linear_Expression le = 2*A - B; + + bool ok = !sp.bounds_from_above(le) + && !sp.bounds_from_below(le); + + print_congruences(sp, "*** sp congruences ***"); + print_constraints(sp, "*** sp constraints ***"); + + return ok; +} + +// Smash product; maximize() and minimize() when bounded. +bool +test12() { + Variable A(0); + Variable B(1); + + SProduct sp(2); + sp.refine_with_constraint(A + B >= 1); + sp.refine_with_constraint(A + B <= 1); + sp.refine_with_congruence(B %= 0); + sp.refine_with_congruence((3*A %= 2) / 5); + + 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 = sp.maximize(le, max_n, max_d, max) + && sp.minimize(le, min_n, min_d, min) + && sp.maximize(le, max_n, max_d, max, pnt_max) + && sp.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(sp, "*** sp congruences ***"); + print_constraints(sp, "*** sp constraints ***"); + + return ok; +} + +// Constraints product; maximize() and minimize() when bounded. +bool +test13() { + Variable A(0); + Variable B(1); + + CProduct cp(2); + cp.refine_with_constraint(A + B >= 1); + cp.refine_with_constraint(A + B <= 1); + cp.refine_with_congruence(B %= 0); + + 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 = cp.maximize(le, max_n, max_d, max) + && cp.minimize(le, min_n, min_d, min) + && cp.maximize(le, max_n, max_d, max, pnt_max) + && cp.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 ***"); + + if (!ok) { + print_congruences(cp, "*** cp congruences non-empty product ***"); + print_constraints(cp, "*** cp constraints non-empty product ***"); + return false; + } + + cp.refine_with_congruence((3*A %= 2) / 3); + + ok = !cp.maximize(le, max_n, max_d, max) + && !cp.minimize(le, min_n, min_d, min) + && !cp.maximize(le, max_n, max_d, max, pnt_max) + && !cp.minimize(le, min_n, min_d, min, pnt_min); + + print_congruences(cp, "*** cp congruences empty product ***"); + print_constraints(cp, "*** cp constraints empty product ***"); + + return ok; +} + +// Smash and constraints product; maximize() and minimize() +// when not bounded. +bool +test14() { + Variable A(0); + Variable B(1); + + SProduct sp(2); + sp.refine_with_constraint(B >= 1); + sp.refine_with_constraint(B <= 2); + sp.refine_with_congruence((B %= 3) / 5); + + CProduct cp(2); + cp.refine_with_constraint(B >= 1); + cp.refine_with_constraint(B <= 2); + cp.refine_with_congruence((B %= 3) / 5); + + 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 smash_ok = !sp.maximize(le, max_n, max_d, max) + && !sp.minimize(le, min_n, min_d, min) + && !sp.maximize(le, max_n, max_d, max, pnt_max) + && !sp.minimize(le, min_n, min_d, min, pnt_min); + + bool cons_ok = !cp.maximize(le, max_n, max_d, max) + && !cp.minimize(le, min_n, min_d, min) + && !cp.maximize(le, max_n, max_d, max, pnt_max) + && !cp.minimize(le, min_n, min_d, min, pnt_min); + + print_constraints(sp, "*** sp constraints ***"); + print_constraints(sp, "*** sp constraints ***"); + print_congruences(cp, "*** cp congruences ***"); + print_congruences(cp, "*** cp congruences ***"); + + return smash_ok && cons_ok; +} + +// Smash product; bounded_affine_image/3 +bool +test15() { + Variable A(0); + Variable B(1); + Variable C(2); + + SProduct sp(3); + sp.refine_with_congruence((A == 0) / 0); + sp.refine_with_congruence((B == 0) / 0); + sp.refine_with_congruence((C == -2) / 0); + + print_congruences(sp, "*** sp congruences ***"); + print_constraints(sp, "*** sp constraints ***"); + + sp.bounded_affine_image(A, 7-B, B+3); + + SProduct known_sp(3); + known_sp.refine_with_constraint(C == -2); + known_sp.refine_with_constraint(B == 0); + known_sp.refine_with_constraint(A <= 3); + known_sp.refine_with_constraint(A + B >= 7); + + bool ok = (sp == known_sp); + + print_congruences(sp, "*** sp congruences ***"); + print_constraints(sp, "*** sp constraints ***"); + + return ok; +} + +// Constraints product; bounded_affine_image/3. +bool +test16() { + Variable A(0); + Variable B(1); + Variable C(2); + + CProduct cp(3); + cp.refine_with_constraint(A >= 0); + cp.refine_with_constraint(A <= 0); + cp.refine_with_constraint(B >= 0); + cp.refine_with_constraint(B <= 0); + cp.refine_with_congruence((C == -2) / 0); + + print_congruences(cp, "*** cp congruences ***"); + print_constraints(cp, "*** cp constraints ***"); + + cp.bounded_affine_image(A, 7-B, B+3); + + CProduct known_cp(3); + known_cp.refine_with_constraint(C == -2); + known_cp.refine_with_constraint(B == 0); + known_cp.refine_with_constraint(A <= 3); + known_cp.refine_with_constraint(A + B >= 7); + + bool ok = (cp == known_cp); + + print_congruences(cp, "*** cp congruences ***"); + print_constraints(cp, "*** cp constraints ***"); + + return ok; +} + +// Smash product; bounded_affine_preimage/3. +bool +test17() { + Variable A(0); + Variable B(1); + Variable C(2); + + SProduct sp(3); + sp.refine_with_congruence((A == 0) / 0); + sp.refine_with_congruence((B == 0) / 0); + sp.refine_with_congruence((C == -2) / 0); + + print_congruences(sp, "*** sp congruences ***"); + print_constraints(sp, "*** sp constraints ***"); + + sp.bounded_affine_preimage(A, 7-B, B+3); + + Constraint_System cs; + cs.insert(C == -2); + cs.insert(B == 0); + cs.insert(C >= 3); + + SProduct known_sp(3); + known_sp.refine_with_constraints(cs); + + bool ok = (sp == known_sp); + + print_congruences(sp, "*** sp congruences ***"); + print_constraints(sp, "*** sp constraints ***"); + + return ok; +} + +// Constraints product; bounded_affine_preimage/3. +bool +test18() { + Variable A(0); + Variable B(1); + Variable C(2); + + CProduct cp(3); + cp.refine_with_constraint(A >= 0); + cp.refine_with_constraint(A <= 0); + cp.refine_with_constraint(B >= 0); + cp.refine_with_constraint(B <= 0); + cp.refine_with_congruence((C == -2) / 0); + + print_congruences(cp, "*** cp congruences ***"); + print_constraints(cp, "*** cp constraints ***"); + + cp.bounded_affine_preimage(A, 7-B, B+3); + + Constraint_System cs; + cs.insert(C == -2); + cs.insert(B == 0); + cs.insert(C >= 3); + + CProduct known_cp(3); + known_cp.refine_with_constraints(cs); + + bool ok = (cp == known_cp); + + print_congruences(cp, "*** cp congruences ***"); + print_constraints(cp, "*** cp constraints ***"); + + return ok; +} + +// concatenate_assign() +bool +test19() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + + SProduct sp1(2); + sp1.refine_with_constraint(A >= 0); + sp1.refine_with_congruence((A %= 0) / 2); + + // Make sure sp1 is reduced; + (void) sp1.is_topologically_closed(); + + SProduct sp2(2); + // Make sure sp2 is not reduced; + sp2.refine_with_constraint(A <= 1); + sp2.refine_with_constraint(A >= 2); + sp2.refine_with_constraint(B >= 0); + + sp1.concatenate_assign(sp2); + + SProduct known_sp(4, EMPTY); + + bool ok = (sp1 == known_sp) && sp1.OK(); + + print_congruences(sp1, "*** sp1 congruences ***"); + print_constraints(sp1, "*** sp1 constraints ***"); + print_congruences(sp2, "*** sp2 congruences ***"); + print_constraints(sp2, "*** sp2 constraints ***"); + + return ok; +} + +bool +test20() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + + CProduct cp1(2); + cp1.refine_with_constraint(A >= 0); + cp1.refine_with_congruence((A %= 0) / 2); + + // Make sure cp1 is reduced; + (void) cp1.is_topologically_closed(); + + CProduct cp2(2); + // Make sure cp2 is not reduced; + cp2.refine_with_constraint(A <= 1); + cp2.refine_with_constraint(A >= 1); + cp2.refine_with_constraint(B >= 0); + + cp1.concatenate_assign(cp2); + + CProduct known_cp(4); + known_cp.refine_with_constraint(A >= 0); + known_cp.refine_with_congruence((A %= 0) / 2); + known_cp.refine_with_constraint(C == 1); + known_cp.refine_with_constraint(D >= 0); + + bool ok = (cp1 == known_cp) && cp1.OK(); + + print_congruences(cp1, "*** cp1 congruences ***"); + print_constraints(cp1, "*** cp1 constraints ***"); + print_congruences(cp2, "*** cp2 congruences ***"); + print_constraints(cp2, "*** cp2 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); + 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/Partially_Reduced_Product/partiallyreducedproduct4.cc b/tests/Partially_Reduced_Product/partiallyreducedproduct4.cc new file mode 100644 index 0000000..9c7780f --- /dev/null +++ b/tests/Partially_Reduced_Product/partiallyreducedproduct4.cc @@ -0,0 +1,278 @@ +/* Test Partially_Reduced_Product<>. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +using namespace Parma_Polyhedra_Library::IO_Operators; + +// #define PH_IS_NNC +// #define PH_IS_FIRST + +// #define PH_IS_BOX + +#ifdef PH_IS_NNC +#define PH_IS_BOX_OR_NNC +#endif +#ifdef PH_IS_BOX +#define PH_IS_BOX_OR_NNC +#endif + +#ifdef PH_IS_BOX +typedef TBox Poly; +#else +#ifdef PH_IS_NNC +typedef NNC_Polyhedron Poly; +#else +typedef C_Polyhedron Poly; +#endif +#endif + +#ifdef PH_IS_FIRST +typedef Domain_Product::Direct_Product DProduct; +typedef Domain_Product::Smash_Product SProduct; +typedef Domain_Product::Constraints_Product CProduct; +#else +typedef Domain_Product::Direct_Product DProduct; +typedef Domain_Product::Smash_Product SProduct; +typedef Domain_Product::Constraints_Product CProduct; +#endif + +namespace { + +// remove_higher_dimensions() +// The initial product is empty with 1 space dimension +// and this dimension is removed. +bool +test01() { + Variable A(0); + + SProduct sp1(1); + CProduct cp1(1); + Constraint_System cs; + cs.insert(A >= 1); + cs.insert(A <= 0); + sp1.refine_with_constraints(cs); + cp1.refine_with_constraints(cs); + SProduct sp2(sp1); + CProduct cp2(cp1); + + bool ok1s = (sp1 == sp2 && sp2.is_empty()); + if (!ok1s || !sp1.OK()) { + print_congruences(sp1, "*** after == check: sp1 congruences ***"); + print_constraints(sp1, "*** after == check: sp1 constraints ***"); + return false; + } + + bool ok1 = (cp1 == cp2 && cp2.is_empty()); + if (!ok1 || !cp1.OK()) { + print_congruences(cp1, "*** after == check: cp1 congruences ***"); + print_constraints(cp1, "*** after == check: cp1 constraints ***"); + return false; + } + + sp1.remove_higher_space_dimensions(0); + + if (!sp1.OK()) { + print_congruences(sp1, "*** remove all dimensions: sp1 congruences ***"); + print_constraints(sp1, "*** remove all dimensions: sp1 constraints ***"); + return false; + } + + cp1.remove_higher_space_dimensions(0); + + bool ok = cp1.OK(); + + print_congruences(cp1, "*** remove all dimensions: cp1 congruences ***"); + print_constraints(cp1, "*** remove all dimensions: cp1 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); + + SProduct sp1(1); + CProduct cp1(1); + Constraint_System cs1; + cs1.insert(A >= 1); + cs1.insert(A <= 0); + sp1.refine_with_constraints(cs1); + cp1.refine_with_constraints(cs1); + + SProduct sp2(1); + CProduct cp2(1); + Constraint_System cs2; + cs2.insert(A == 1); + sp2.refine_with_constraints(cs2); + cp2.refine_with_constraints(cs2); + + SProduct sp1_copy(sp1); + CProduct cp1_copy(cp1); + + sp1.upper_bound_assign(sp2); + cp1.upper_bound_assign(cp2); + + if (!sp1.OK()) { + print_congruences(sp1, "*** after ok check: sp1 congruences ***"); + print_constraints(sp1, "*** after ok check: sp1 constraints ***"); + return false; + } + + bool ok = cp1.OK(); + + print_congruences(cp1, "*** after OK() check: cp1 congruences ***"); + print_constraints(cp1, "*** after OK() check: cp1 constraints ***"); + + return ok; +} + +// refine_with_constraints() and refine_with_congruences() +bool +test03() { + Variable A(0); + Variable B(1); + + SProduct sp(2); + CProduct cp(2); + Constraint_System cs; + cs.insert(A >= 1); + cs.insert(A <= 6); + sp.refine_with_constraints(cs); + cp.refine_with_constraints(cs); + + SProduct known_sp(sp); + CProduct known_cp(cp); + + 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); + sp.refine_with_constraint(A > 2); + sp.refine_with_constraint(B >= 2); + sp.refine_with_congruence((B %= 2) / 4); + sp.refine_with_congruence((A + B %= 6) / 0); + cp.refine_with_constraint(A > 2); + cp.refine_with_constraint(B >= 2); + cp.refine_with_congruence((B %= 2) / 4); + cp.refine_with_congruence((A + B %= 6) / 0); + + bool ok = sp.OK() && cp.OK(); + +#ifdef PH_IS_BOX_OR_NNC + known_sp.refine_with_constraint(A > 2); +#else + known_sp.refine_with_constraint(A >= 2); +#endif + known_sp.refine_with_constraint(B >= 2); + known_sp.refine_with_congruence((B %= 2) / 4); + known_sp.refine_with_congruence((A + B %= 6) / 0); +#ifdef PH_IS_BOX_OR_NNC + known_cp.refine_with_constraint(A > 2); +#else + known_cp.refine_with_constraint(A >= 2); +#endif + known_cp.refine_with_constraint(B >= 2); + known_cp.refine_with_congruence((B %= 2) / 4); + known_cp.refine_with_congruence((A + B %= 6) / 0); + + ok = ok && sp == known_sp && cp == known_cp; + + print_congruences(sp, "*** after ok check: sp congruences ***"); + print_constraints(sp, "*** after ok check: sp constraints ***"); + + print_congruences(cp, "*** after ok check: cp congruences ***"); + print_constraints(cp, "*** after ok check: cp constraints ***"); + + return ok; +} + +// refine_with_constraints() and refine_with_congruences() +bool +test04() { + Variable A(0); + Variable B(1); + + SProduct sp(2); + CProduct cp(2); + Constraint_System cs; + cs.insert(A >= 1); + cs.insert(A <= 6); + sp.refine_with_constraints(cs); + cp.refine_with_constraints(cs); + + SProduct known_sp(sp); + CProduct known_cp(cp); + + 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); + sp.refine_with_constraints(cs1); + sp.refine_with_congruences(cgs1); + cp.refine_with_constraints(cs1); + cp.refine_with_congruences(cgs1); + + bool ok = sp.OK() && cp.OK(); + +#ifdef PH_IS_BOX_OR_NNC + known_sp.refine_with_constraint(A > 2); +#else + known_sp.refine_with_constraint(A >= 2); +#endif + known_sp.refine_with_constraint(B >= 2); + known_sp.refine_with_congruence((B %= 2) / 4); + known_sp.refine_with_congruence((A + B %= 6) / 0); +#ifdef PH_IS_BOX_OR_NNC + known_cp.refine_with_constraint(A > 2); +#else + known_cp.refine_with_constraint(A >= 2); +#endif + known_cp.refine_with_constraint(B >= 2); + known_cp.refine_with_congruence((B %= 2) / 4); + known_cp.refine_with_congruence((A + B %= 6) / 0); + + ok = ok && sp == known_sp && cp == known_cp; + + print_congruences(sp, "*** after ok check: sp congruences ***"); + print_constraints(sp, "*** after ok check: sp constraints ***"); + + print_congruences(cp, "*** after ok check: cp congruences ***"); + print_constraints(cp, "*** after ok check: cp constraints ***"); + + return 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..b7994d4 --- /dev/null +++ b/tests/Polyhedron/Makefile.am @@ -0,0 +1,692 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +if VALGRIND_TESTS_ENABLED + +CHECKER = \ +$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \ +--num-callers=100 --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 \ +@extra_includes@ \ +@debug_flag@ + +LDADD = \ +$(top_builddir)/utils/libppl_utils.a \ +$(top_builddir)/tests/libppl_tests.a \ +$(top_builddir)/src/libppl.la \ +@extra_libraries@ + +ORIGINAL_TESTS = \ +hybrid \ +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 \ +dualhypercubes \ +empty1 \ +equals1 \ +exceptions1 exceptions2 exceptions3 \ +expandspacedim1 expandspacedim2 \ +foldspacedims1 foldspacedims2 \ +frombdshape1 \ +frombox1 frombox2 \ +fromgrid1 \ +fromoctagonalshape1 \ +generalizedaffineimage1 generalizedaffineimage2 \ +generalizedaffinepreimage1 generalizedaffinepreimage2 \ +generators1 \ +geomcovers1 \ +h79widening1 h79widening2 \ +intersection1 \ +simplifyusingcontext1 \ +limitedbhrz03extrapolation1 \ +limitedh79extrapolation1 \ +linearpartition1 \ +linearexpression1 \ +linearsystem1 \ +mapspacedims1 \ +matrix1 \ +max_min1 \ +maxspacedim1 \ +mc91 \ +membytes1 \ +memory2 \ +minconstraints1 minconstraints2 \ +mingenerators1 mingenerators2 \ +nncminimize1 nncminimize2 \ +numberinput1 \ +onepoint \ +permute \ +polydifference1 polydifference2 \ +polyhull1 polyhull2 \ +polyhullifexact1 polyhullifexact2 \ +randphull1 \ +refinewithconstraint1 \ +refinewithconstraints1 \ +refinewithcongruence1 \ +refinewithcongruences1 \ +relations1 relations2 relations3 \ +removespacedims1 removespacedims2 \ +smm1 \ +timeelapse1 timeelapse2 \ +topclosed1 \ +topclosure1 \ +unconstrain1 \ +universe1 universe2 \ +variablesset1 \ +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_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_writepolyhedron1 + +# +# Sources for the tests +# + +hybrid_SOURCES = hybrid.cc + +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 + +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 + +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 + +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 + +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 +randphull1_LDADD = $(LDADD) -lm + +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 + +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 + +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_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_randphull1_LDADD = $(LDADD) -lm + +nnc_relations1_SOURCES = relations1.cc +nnc_relations1_CXXFLAGS = $(DERIVED_CXXFLAGS) +nnc_relations2_SOURCES = relations2.cc +nnc_relations2_CXXFLAGS = $(DERIVED_CXXFLAGS) + +nnc_removespacedims1_SOURCES = removespacedims1.cc +nnc_removespacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS) + +nnc_smm1_SOURCES = smm1.cc +nnc_smm1_CXXFLAGS = $(DERIVED_CXXFLAGS) + +nnc_timeelapse1_SOURCES = timeelapse1.cc +nnc_timeelapse1_CXXFLAGS = $(DERIVED_CXXFLAGS) + +nnc_unconstrain1_SOURCES = unconstrain1.cc +nnc_unconstrain1_CXXFLAGS = $(DERIVED_CXXFLAGS) + +nnc_universe1_SOURCES = universe1.cc +nnc_universe1_CXXFLAGS = $(DERIVED_CXXFLAGS) + +nnc_writepolyhedron1_SOURCES = writepolyhedron1.cc +nnc_writepolyhedron1_CXXFLAGS = $(DERIVED_CXXFLAGS) + +# +# Sources for the special tests. +# + +memory1_SRCS = memory1.cc + +watchdog1_SRCS = watchdog1.cc + +if !VALGRIND_TESTS_ENABLED +VALGRIND_BRITTLE_TESTS = memory1 + +memory1_SOURCES = $(memory1_SRCS) + +endif !VALGRIND_TESTS_ENABLED + + +if BUILD_WATCHDOG_LIBRARY +WATCHDOG_TESTS = watchdog1 + +watchdog1_SOURCES = $(watchdog1_SRCS) +watchdog1_CPPFLAGS = \ +$(AM_CPPFLAGS) \ +-I$(top_builddir)/Watchdog \ +-I$(top_builddir)/Watchdog/src +watchdog1_LDADD = $(LDADD) $(top_builddir)/Watchdog/src/libpwl.la + +endif BUILD_WATCHDOG_LIBRARY + +TESTS = \ +$(ORIGINAL_TESTS) \ +$(DERIVED_TESTS) \ +$(VALGRIND_BRITTLE_TESTS) \ +$(WATCHDOG_TESTS) + +XFAIL_TESTS = + +check_PROGRAMS = $(TESTS) $(BUGS) + +EXTRA_DIST = $(memory1_SRCS) $(watchdog1_SRCS) + +BUGS = + +MOSTLYCLEANFILES = \ +ascii_dump_load1.dat \ +ascii_dump_load2.dat \ +ascii_dump_load3.dat \ +matrix1.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 + +$(top_builddir)/Watchdog/src/libpwl.la: + $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/Watchdog/src libpwl.la diff --git a/tests/Polyhedron/Makefile.in b/tests/Polyhedron/Makefile.in new file mode 100644 index 0000000..c4ad6a8 --- /dev/null +++ b/tests/Polyhedron/Makefile.in @@ -0,0 +1,4684 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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) $(am__EXEEXT_3) \ + $(am__EXEEXT_4) +XFAIL_TESTS = +check_PROGRAMS = $(am__EXEEXT_5) $(am__EXEEXT_6) +subdir = tests/Polyhedron +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__EXEEXT_1 = hybrid$(EXEEXT) 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) dualhypercubes$(EXEEXT) empty1$(EXEEXT) \ + equals1$(EXEEXT) exceptions1$(EXEEXT) exceptions2$(EXEEXT) \ + exceptions3$(EXEEXT) expandspacedim1$(EXEEXT) \ + expandspacedim2$(EXEEXT) foldspacedims1$(EXEEXT) \ + foldspacedims2$(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) intersection1$(EXEEXT) \ + simplifyusingcontext1$(EXEEXT) \ + limitedbhrz03extrapolation1$(EXEEXT) \ + limitedh79extrapolation1$(EXEEXT) linearpartition1$(EXEEXT) \ + linearexpression1$(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) numberinput1$(EXEEXT) onepoint$(EXEEXT) \ + permute$(EXEEXT) polydifference1$(EXEEXT) \ + polydifference2$(EXEEXT) polyhull1$(EXEEXT) polyhull2$(EXEEXT) \ + polyhullifexact1$(EXEEXT) polyhullifexact2$(EXEEXT) \ + randphull1$(EXEEXT) refinewithconstraint1$(EXEEXT) \ + refinewithconstraints1$(EXEEXT) refinewithcongruence1$(EXEEXT) \ + refinewithcongruences1$(EXEEXT) relations1$(EXEEXT) \ + relations2$(EXEEXT) relations3$(EXEEXT) \ + removespacedims1$(EXEEXT) removespacedims2$(EXEEXT) \ + smm1$(EXEEXT) timeelapse1$(EXEEXT) timeelapse2$(EXEEXT) \ + topclosed1$(EXEEXT) topclosure1$(EXEEXT) unconstrain1$(EXEEXT) \ + universe1$(EXEEXT) universe2$(EXEEXT) variablesset1$(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_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_writepolyhedron1$(EXEEXT) +@VALGRIND_TESTS_ENABLED_FALSE@am__EXEEXT_3 = memory1$(EXEEXT) +@BUILD_WATCHDOG_LIBRARY_TRUE@am__EXEEXT_4 = watchdog1$(EXEEXT) +am__EXEEXT_5 = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \ + $(am__EXEEXT_4) +am__EXEEXT_6 = +am_addcongruence1_OBJECTS = addcongruence1.$(OBJEXT) +addcongruence1_OBJECTS = $(am_addcongruence1_OBJECTS) +addcongruence1_LDADD = $(LDADD) +addcongruence1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_addcongruences1_OBJECTS = addcongruences1.$(OBJEXT) +addcongruences1_OBJECTS = $(am_addcongruences1_OBJECTS) +addcongruences1_LDADD = $(LDADD) +addcongruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_addconstraint1_OBJECTS = addconstraint1.$(OBJEXT) +addconstraint1_OBJECTS = $(am_addconstraint1_OBJECTS) +addconstraint1_LDADD = $(LDADD) +addconstraint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_addconstraints1_OBJECTS = addconstraints1.$(OBJEXT) +addconstraints1_OBJECTS = $(am_addconstraints1_OBJECTS) +addconstraints1_LDADD = $(LDADD) +addconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_addconstraints2_OBJECTS = addconstraints2.$(OBJEXT) +addconstraints2_OBJECTS = $(am_addconstraints2_OBJECTS) +addconstraints2_LDADD = $(LDADD) +addconstraints2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_addgenerator1_OBJECTS = addgenerator1.$(OBJEXT) +addgenerator1_OBJECTS = $(am_addgenerator1_OBJECTS) +addgenerator1_LDADD = $(LDADD) +addgenerator1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_addgenerator2_OBJECTS = addgenerator2.$(OBJEXT) +addgenerator2_OBJECTS = $(am_addgenerator2_OBJECTS) +addgenerator2_LDADD = $(LDADD) +addgenerator2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_addgenerators1_OBJECTS = addgenerators1.$(OBJEXT) +addgenerators1_OBJECTS = $(am_addgenerators1_OBJECTS) +addgenerators1_LDADD = $(LDADD) +addgenerators1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_addgenerators2_OBJECTS = addgenerators2.$(OBJEXT) +addgenerators2_OBJECTS = $(am_addgenerators2_OBJECTS) +addgenerators2_LDADD = $(LDADD) +addgenerators2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_addspacedims1_OBJECTS = addspacedims1.$(OBJEXT) +addspacedims1_OBJECTS = $(am_addspacedims1_OBJECTS) +addspacedims1_LDADD = $(LDADD) +addspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_addspacedims2_OBJECTS = addspacedims2.$(OBJEXT) +addspacedims2_OBJECTS = $(am_addspacedims2_OBJECTS) +addspacedims2_LDADD = $(LDADD) +addspacedims2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_affineimage1_OBJECTS = affineimage1.$(OBJEXT) +affineimage1_OBJECTS = $(am_affineimage1_OBJECTS) +affineimage1_LDADD = $(LDADD) +affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_affineimage2_OBJECTS = affineimage2.$(OBJEXT) +affineimage2_OBJECTS = $(am_affineimage2_OBJECTS) +affineimage2_LDADD = $(LDADD) +affineimage2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_affinepreimage1_OBJECTS = affinepreimage1.$(OBJEXT) +affinepreimage1_OBJECTS = $(am_affinepreimage1_OBJECTS) +affinepreimage1_LDADD = $(LDADD) +affinepreimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_affinetrans_OBJECTS = affinetrans.$(OBJEXT) +affinetrans_OBJECTS = $(am_affinetrans_OBJECTS) +affinetrans_LDADD = $(LDADD) +affinetrans_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_append1_OBJECTS = append1.$(OBJEXT) +append1_OBJECTS = $(am_append1_OBJECTS) +append1_LDADD = $(LDADD) +append1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_append2_OBJECTS = append2.$(OBJEXT) +append2_OBJECTS = $(am_append2_OBJECTS) +append2_LDADD = $(LDADD) +append2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_ascii_dump_load1_OBJECTS = ascii_dump_load1.$(OBJEXT) +ascii_dump_load1_OBJECTS = $(am_ascii_dump_load1_OBJECTS) +ascii_dump_load1_LDADD = $(LDADD) +ascii_dump_load1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_ascii_dump_load2_OBJECTS = ascii_dump_load2.$(OBJEXT) +ascii_dump_load2_OBJECTS = $(am_ascii_dump_load2_OBJECTS) +ascii_dump_load2_LDADD = $(LDADD) +ascii_dump_load2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_ascii_dump_load3_OBJECTS = ascii_dump_load3.$(OBJEXT) +ascii_dump_load3_OBJECTS = $(am_ascii_dump_load3_OBJECTS) +ascii_dump_load3_LDADD = $(LDADD) +ascii_dump_load3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_bgp99extrapolation1_OBJECTS = bgp99extrapolation1.$(OBJEXT) +bgp99extrapolation1_OBJECTS = $(am_bgp99extrapolation1_OBJECTS) +bgp99extrapolation1_LDADD = $(LDADD) +bgp99extrapolation1_DEPENDENCIES = \ + $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_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_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_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__memory1_SOURCES_DIST = memory1.cc +am__objects_1 = memory1.$(OBJEXT) +@VALGRIND_TESTS_ENABLED_FALSE@am_memory1_OBJECTS = $(am__objects_1) +memory1_OBJECTS = $(am_memory1_OBJECTS) +memory1_LDADD = $(LDADD) +memory1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_memory2_OBJECTS = memory2.$(OBJEXT) +memory2_OBJECTS = $(am_memory2_OBJECTS) +memory2_LDADD = $(LDADD) +memory2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_minconstraints1_OBJECTS = minconstraints1.$(OBJEXT) +minconstraints1_OBJECTS = $(am_minconstraints1_OBJECTS) +minconstraints1_LDADD = $(LDADD) +minconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_minconstraints2_OBJECTS = minconstraints2.$(OBJEXT) +minconstraints2_OBJECTS = $(am_minconstraints2_OBJECTS) +minconstraints2_LDADD = $(LDADD) +minconstraints2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_mingenerators1_OBJECTS = mingenerators1.$(OBJEXT) +mingenerators1_OBJECTS = $(am_mingenerators1_OBJECTS) +mingenerators1_LDADD = $(LDADD) +mingenerators1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_mingenerators2_OBJECTS = mingenerators2.$(OBJEXT) +mingenerators2_OBJECTS = $(am_mingenerators2_OBJECTS) +mingenerators2_LDADD = $(LDADD) +mingenerators2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_nnc_addcongruence1_OBJECTS = \ + nnc_addcongruence1-addcongruence1.$(OBJEXT) +nnc_addcongruence1_OBJECTS = $(am_nnc_addcongruence1_OBJECTS) +nnc_addcongruence1_LDADD = $(LDADD) +nnc_addcongruence1_DEPENDENCIES = \ + $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +nnc_addcongruence1_LINK = $(LIBTOOL) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_disjoint1_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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) --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) +am__DEPENDENCIES_1 = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +nnc_randphull1_DEPENDENCIES = $(am__DEPENDENCIES_1) +nnc_randphull1_LINK = $(LIBTOOL) --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) --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) --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) --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) --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) --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) --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) --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) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_universe1_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) --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_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_DEPENDENCIES = $(am__DEPENDENCIES_1) +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_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_SOURCES_DIST = watchdog1.cc +am__objects_2 = watchdog1-watchdog1.$(OBJEXT) +@BUILD_WATCHDOG_LIBRARY_TRUE@am_watchdog1_OBJECTS = $(am__objects_2) +watchdog1_OBJECTS = $(am_watchdog1_OBJECTS) +@BUILD_WATCHDOG_LIBRARY_TRUE@watchdog1_DEPENDENCIES = \ +@BUILD_WATCHDOG_LIBRARY_TRUE@ $(am__DEPENDENCIES_1) \ +@BUILD_WATCHDOG_LIBRARY_TRUE@ $(top_builddir)/Watchdog/src/libpwl.la +am_writeconsys1_OBJECTS = writeconsys1.$(OBJEXT) +writeconsys1_OBJECTS = $(am_writeconsys1_OBJECTS) +writeconsys1_LDADD = $(LDADD) +writeconsys1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_writegensys1_OBJECTS = writegensys1.$(OBJEXT) +writegensys1_OBJECTS = $(am_writegensys1_OBJECTS) +writegensys1_LDADD = $(LDADD) +writegensys1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_writepolyhedron1_OBJECTS = writepolyhedron1.$(OBJEXT) +writepolyhedron1_OBJECTS = $(am_writepolyhedron1_OBJECTS) +writepolyhedron1_LDADD = $(LDADD) +writepolyhedron1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_writepolyhedron2_OBJECTS = writepolyhedron2.$(OBJEXT) +writepolyhedron2_OBJECTS = $(am_writepolyhedron2_OBJECTS) +writepolyhedron2_LDADD = $(LDADD) +writepolyhedron2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_writerelation1_OBJECTS = writerelation1.$(OBJEXT) +writerelation1_OBJECTS = $(am_writerelation1_OBJECTS) +writerelation1_LDADD = $(LDADD) +writerelation1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +am_writevariable1_OBJECTS = writevariable1.$(OBJEXT) +writevariable1_OBJECTS = $(am_writevariable1_OBJECTS) +writevariable1_LDADD = $(LDADD) +writevariable1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \ + $(top_builddir)/tests/libppl_tests.a \ + $(top_builddir)/src/libppl.la +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(addcongruence1_SOURCES) $(addcongruences1_SOURCES) \ + $(addconstraint1_SOURCES) $(addconstraints1_SOURCES) \ + $(addconstraints2_SOURCES) $(addgenerator1_SOURCES) \ + $(addgenerator2_SOURCES) $(addgenerators1_SOURCES) \ + $(addgenerators2_SOURCES) $(addspacedims1_SOURCES) \ + $(addspacedims2_SOURCES) $(affineimage1_SOURCES) \ + $(affineimage2_SOURCES) $(affinepreimage1_SOURCES) \ + $(affinetrans_SOURCES) $(append1_SOURCES) $(append2_SOURCES) \ + $(ascii_dump_load1_SOURCES) $(ascii_dump_load2_SOURCES) \ + $(ascii_dump_load3_SOURCES) $(bgp99extrapolation1_SOURCES) \ + $(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) \ + $(dualhypercubes_SOURCES) $(empty1_SOURCES) $(equals1_SOURCES) \ + $(exceptions1_SOURCES) $(exceptions2_SOURCES) \ + $(exceptions3_SOURCES) $(expandspacedim1_SOURCES) \ + $(expandspacedim2_SOURCES) $(foldspacedims1_SOURCES) \ + $(foldspacedims2_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) $(memory1_SOURCES) \ + $(memory2_SOURCES) $(minconstraints1_SOURCES) \ + $(minconstraints2_SOURCES) $(mingenerators1_SOURCES) \ + $(mingenerators2_SOURCES) $(nnc_addcongruence1_SOURCES) \ + $(nnc_addcongruences1_SOURCES) $(nnc_addconstraint1_SOURCES) \ + $(nnc_addconstraints1_SOURCES) $(nnc_addgenerator1_SOURCES) \ + $(nnc_addgenerators1_SOURCES) $(nnc_addspacedims1_SOURCES) \ + $(nnc_affineimage1_SOURCES) $(nnc_affinepreimage1_SOURCES) \ + $(nnc_affinetrans_SOURCES) $(nnc_append1_SOURCES) \ + $(nnc_append2_SOURCES) $(nnc_ascii_dump_load1_SOURCES) \ + $(nnc_ascii_dump_load2_SOURCES) \ + $(nnc_bgp99extrapolation1_SOURCES) \ + $(nnc_bhrz03widening1_SOURCES) $(nnc_bhrz03widening2_SOURCES) \ + $(nnc_bounded1_SOURCES) $(nnc_boundedaffineimage1_SOURCES) \ + $(nnc_boundedaffinepreimage1_SOURCES) \ + $(nnc_boundedbhrz03extrapolation1_SOURCES) \ + $(nnc_boundedh79extrapolation1_SOURCES) $(nnc_bounds1_SOURCES) \ + $(nnc_concatenate1_SOURCES) $(nnc_congruences1_SOURCES) \ + $(nnc_constrains1_SOURCES) $(nnc_constraints1_SOURCES) \ + $(nnc_contains1_SOURCES) $(nnc_containsintegerpoint1_SOURCES) \ + $(nnc_disjoint1_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_writepolyhedron1_SOURCES) \ + $(nncminimize1_SOURCES) $(nncminimize2_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) \ + $(timeelapse1_SOURCES) $(timeelapse2_SOURCES) \ + $(topclosed1_SOURCES) $(topclosure1_SOURCES) \ + $(unconstrain1_SOURCES) $(universe1_SOURCES) \ + $(universe2_SOURCES) $(variablesset1_SOURCES) \ + $(watchdog1_SOURCES) $(writeconsys1_SOURCES) \ + $(writegensys1_SOURCES) $(writepolyhedron1_SOURCES) \ + $(writepolyhedron2_SOURCES) $(writerelation1_SOURCES) \ + $(writevariable1_SOURCES) +DIST_SOURCES = $(addcongruence1_SOURCES) $(addcongruences1_SOURCES) \ + $(addconstraint1_SOURCES) $(addconstraints1_SOURCES) \ + $(addconstraints2_SOURCES) $(addgenerator1_SOURCES) \ + $(addgenerator2_SOURCES) $(addgenerators1_SOURCES) \ + $(addgenerators2_SOURCES) $(addspacedims1_SOURCES) \ + $(addspacedims2_SOURCES) $(affineimage1_SOURCES) \ + $(affineimage2_SOURCES) $(affinepreimage1_SOURCES) \ + $(affinetrans_SOURCES) $(append1_SOURCES) $(append2_SOURCES) \ + $(ascii_dump_load1_SOURCES) $(ascii_dump_load2_SOURCES) \ + $(ascii_dump_load3_SOURCES) $(bgp99extrapolation1_SOURCES) \ + $(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) \ + $(dualhypercubes_SOURCES) $(empty1_SOURCES) $(equals1_SOURCES) \ + $(exceptions1_SOURCES) $(exceptions2_SOURCES) \ + $(exceptions3_SOURCES) $(expandspacedim1_SOURCES) \ + $(expandspacedim2_SOURCES) $(foldspacedims1_SOURCES) \ + $(foldspacedims2_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) \ + $(am__memory1_SOURCES_DIST) $(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_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_writepolyhedron1_SOURCES) \ + $(nncminimize1_SOURCES) $(nncminimize2_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) \ + $(timeelapse1_SOURCES) $(timeelapse2_SOURCES) \ + $(topclosed1_SOURCES) $(topclosure1_SOURCES) \ + $(unconstrain1_SOURCES) $(universe1_SOURCES) \ + $(universe2_SOURCES) $(variablesset1_SOURCES) \ + $(am__watchdog1_SOURCES_DIST) $(writeconsys1_SOURCES) \ + $(writegensys1_SOURCES) $(writepolyhedron1_SOURCES) \ + $(writepolyhedron2_SOURCES) $(writerelation1_SOURCES) \ + $(writevariable1_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +@VALGRIND_TESTS_ENABLED_FALSE@CHECKER = +@VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \ +@VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \ +@VALGRIND_TESTS_ENABLED_TRUE@--num-callers=100 --leak-resolution=high \ +@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 \ +@extra_includes@ \ +@debug_flag@ + +LDADD = \ +$(top_builddir)/utils/libppl_utils.a \ +$(top_builddir)/tests/libppl_tests.a \ +$(top_builddir)/src/libppl.la \ +@extra_libraries@ + +ORIGINAL_TESTS = \ +hybrid \ +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 \ +dualhypercubes \ +empty1 \ +equals1 \ +exceptions1 exceptions2 exceptions3 \ +expandspacedim1 expandspacedim2 \ +foldspacedims1 foldspacedims2 \ +frombdshape1 \ +frombox1 frombox2 \ +fromgrid1 \ +fromoctagonalshape1 \ +generalizedaffineimage1 generalizedaffineimage2 \ +generalizedaffinepreimage1 generalizedaffinepreimage2 \ +generators1 \ +geomcovers1 \ +h79widening1 h79widening2 \ +intersection1 \ +simplifyusingcontext1 \ +limitedbhrz03extrapolation1 \ +limitedh79extrapolation1 \ +linearpartition1 \ +linearexpression1 \ +linearsystem1 \ +mapspacedims1 \ +matrix1 \ +max_min1 \ +maxspacedim1 \ +mc91 \ +membytes1 \ +memory2 \ +minconstraints1 minconstraints2 \ +mingenerators1 mingenerators2 \ +nncminimize1 nncminimize2 \ +numberinput1 \ +onepoint \ +permute \ +polydifference1 polydifference2 \ +polyhull1 polyhull2 \ +polyhullifexact1 polyhullifexact2 \ +randphull1 \ +refinewithconstraint1 \ +refinewithconstraints1 \ +refinewithcongruence1 \ +refinewithcongruences1 \ +relations1 relations2 relations3 \ +removespacedims1 removespacedims2 \ +smm1 \ +timeelapse1 timeelapse2 \ +topclosed1 \ +topclosure1 \ +unconstrain1 \ +universe1 universe2 \ +variablesset1 \ +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_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_writepolyhedron1 + + +# +# Sources for the tests +# +hybrid_SOURCES = hybrid.cc +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 +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 +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 +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 +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 +randphull1_LDADD = $(LDADD) -lm +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 +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 +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_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_randphull1_LDADD = $(LDADD) -lm +nnc_relations1_SOURCES = relations1.cc +nnc_relations1_CXXFLAGS = $(DERIVED_CXXFLAGS) +nnc_relations2_SOURCES = relations2.cc +nnc_relations2_CXXFLAGS = $(DERIVED_CXXFLAGS) +nnc_removespacedims1_SOURCES = removespacedims1.cc +nnc_removespacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS) +nnc_smm1_SOURCES = smm1.cc +nnc_smm1_CXXFLAGS = $(DERIVED_CXXFLAGS) +nnc_timeelapse1_SOURCES = timeelapse1.cc +nnc_timeelapse1_CXXFLAGS = $(DERIVED_CXXFLAGS) +nnc_unconstrain1_SOURCES = unconstrain1.cc +nnc_unconstrain1_CXXFLAGS = $(DERIVED_CXXFLAGS) +nnc_universe1_SOURCES = universe1.cc +nnc_universe1_CXXFLAGS = $(DERIVED_CXXFLAGS) +nnc_writepolyhedron1_SOURCES = writepolyhedron1.cc +nnc_writepolyhedron1_CXXFLAGS = $(DERIVED_CXXFLAGS) + +# +# Sources for the special tests. +# +memory1_SRCS = memory1.cc +watchdog1_SRCS = watchdog1.cc +@VALGRIND_TESTS_ENABLED_FALSE@VALGRIND_BRITTLE_TESTS = memory1 +@VALGRIND_TESTS_ENABLED_FALSE@memory1_SOURCES = $(memory1_SRCS) +@BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_TESTS = watchdog1 +@BUILD_WATCHDOG_LIBRARY_TRUE@watchdog1_SOURCES = $(watchdog1_SRCS) +@BUILD_WATCHDOG_LIBRARY_TRUE@watchdog1_CPPFLAGS = \ +@BUILD_WATCHDOG_LIBRARY_TRUE@$(AM_CPPFLAGS) \ +@BUILD_WATCHDOG_LIBRARY_TRUE@-I$(top_builddir)/Watchdog \ +@BUILD_WATCHDOG_LIBRARY_TRUE@-I$(top_builddir)/Watchdog/src + +@BUILD_WATCHDOG_LIBRARY_TRUE@watchdog1_LDADD = $(LDADD) $(top_builddir)/Watchdog/src/libpwl.la +EXTRA_DIST = $(memory1_SRCS) $(watchdog1_SRCS) +BUGS = +MOSTLYCLEANFILES = \ +ascii_dump_load1.dat \ +ascii_dump_load2.dat \ +ascii_dump_load3.dat \ +matrix1.dat \ +linearsystem1.dat \ +writegensys1.dat \ +writepolyhedron1.dat \ +writepolyhedron2.dat \ +writevariable1.dat + +all: all-am + +.SUFFIXES: +.SUFFIXES: .cc .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Polyhedron/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign tests/Polyhedron/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +addcongruence1$(EXEEXT): $(addcongruence1_OBJECTS) $(addcongruence1_DEPENDENCIES) + @rm -f addcongruence1$(EXEEXT) + $(CXXLINK) $(addcongruence1_OBJECTS) $(addcongruence1_LDADD) $(LIBS) +addcongruences1$(EXEEXT): $(addcongruences1_OBJECTS) $(addcongruences1_DEPENDENCIES) + @rm -f addcongruences1$(EXEEXT) + $(CXXLINK) $(addcongruences1_OBJECTS) $(addcongruences1_LDADD) $(LIBS) +addconstraint1$(EXEEXT): $(addconstraint1_OBJECTS) $(addconstraint1_DEPENDENCIES) + @rm -f addconstraint1$(EXEEXT) + $(CXXLINK) $(addconstraint1_OBJECTS) $(addconstraint1_LDADD) $(LIBS) +addconstraints1$(EXEEXT): $(addconstraints1_OBJECTS) $(addconstraints1_DEPENDENCIES) + @rm -f addconstraints1$(EXEEXT) + $(CXXLINK) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS) +addconstraints2$(EXEEXT): $(addconstraints2_OBJECTS) $(addconstraints2_DEPENDENCIES) + @rm -f addconstraints2$(EXEEXT) + $(CXXLINK) $(addconstraints2_OBJECTS) $(addconstraints2_LDADD) $(LIBS) +addgenerator1$(EXEEXT): $(addgenerator1_OBJECTS) $(addgenerator1_DEPENDENCIES) + @rm -f addgenerator1$(EXEEXT) + $(CXXLINK) $(addgenerator1_OBJECTS) $(addgenerator1_LDADD) $(LIBS) +addgenerator2$(EXEEXT): $(addgenerator2_OBJECTS) $(addgenerator2_DEPENDENCIES) + @rm -f addgenerator2$(EXEEXT) + $(CXXLINK) $(addgenerator2_OBJECTS) $(addgenerator2_LDADD) $(LIBS) +addgenerators1$(EXEEXT): $(addgenerators1_OBJECTS) $(addgenerators1_DEPENDENCIES) + @rm -f addgenerators1$(EXEEXT) + $(CXXLINK) $(addgenerators1_OBJECTS) $(addgenerators1_LDADD) $(LIBS) +addgenerators2$(EXEEXT): $(addgenerators2_OBJECTS) $(addgenerators2_DEPENDENCIES) + @rm -f addgenerators2$(EXEEXT) + $(CXXLINK) $(addgenerators2_OBJECTS) $(addgenerators2_LDADD) $(LIBS) +addspacedims1$(EXEEXT): $(addspacedims1_OBJECTS) $(addspacedims1_DEPENDENCIES) + @rm -f addspacedims1$(EXEEXT) + $(CXXLINK) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS) +addspacedims2$(EXEEXT): $(addspacedims2_OBJECTS) $(addspacedims2_DEPENDENCIES) + @rm -f addspacedims2$(EXEEXT) + $(CXXLINK) $(addspacedims2_OBJECTS) $(addspacedims2_LDADD) $(LIBS) +affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) + @rm -f affineimage1$(EXEEXT) + $(CXXLINK) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS) +affineimage2$(EXEEXT): $(affineimage2_OBJECTS) $(affineimage2_DEPENDENCIES) + @rm -f affineimage2$(EXEEXT) + $(CXXLINK) $(affineimage2_OBJECTS) $(affineimage2_LDADD) $(LIBS) +affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES) + @rm -f affinepreimage1$(EXEEXT) + $(CXXLINK) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS) +affinetrans$(EXEEXT): $(affinetrans_OBJECTS) $(affinetrans_DEPENDENCIES) + @rm -f affinetrans$(EXEEXT) + $(CXXLINK) $(affinetrans_OBJECTS) $(affinetrans_LDADD) $(LIBS) +append1$(EXEEXT): $(append1_OBJECTS) $(append1_DEPENDENCIES) + @rm -f append1$(EXEEXT) + $(CXXLINK) $(append1_OBJECTS) $(append1_LDADD) $(LIBS) +append2$(EXEEXT): $(append2_OBJECTS) $(append2_DEPENDENCIES) + @rm -f append2$(EXEEXT) + $(CXXLINK) $(append2_OBJECTS) $(append2_LDADD) $(LIBS) +ascii_dump_load1$(EXEEXT): $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_DEPENDENCIES) + @rm -f ascii_dump_load1$(EXEEXT) + $(CXXLINK) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS) +ascii_dump_load2$(EXEEXT): $(ascii_dump_load2_OBJECTS) $(ascii_dump_load2_DEPENDENCIES) + @rm -f ascii_dump_load2$(EXEEXT) + $(CXXLINK) $(ascii_dump_load2_OBJECTS) $(ascii_dump_load2_LDADD) $(LIBS) +ascii_dump_load3$(EXEEXT): $(ascii_dump_load3_OBJECTS) $(ascii_dump_load3_DEPENDENCIES) + @rm -f ascii_dump_load3$(EXEEXT) + $(CXXLINK) $(ascii_dump_load3_OBJECTS) $(ascii_dump_load3_LDADD) $(LIBS) +bgp99extrapolation1$(EXEEXT): $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_DEPENDENCIES) + @rm -f bgp99extrapolation1$(EXEEXT) + $(CXXLINK) $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_LDADD) $(LIBS) +bgp99extrapolation2$(EXEEXT): $(bgp99extrapolation2_OBJECTS) $(bgp99extrapolation2_DEPENDENCIES) + @rm -f bgp99extrapolation2$(EXEEXT) + $(CXXLINK) $(bgp99extrapolation2_OBJECTS) $(bgp99extrapolation2_LDADD) $(LIBS) +bhrz03widening1$(EXEEXT): $(bhrz03widening1_OBJECTS) $(bhrz03widening1_DEPENDENCIES) + @rm -f bhrz03widening1$(EXEEXT) + $(CXXLINK) $(bhrz03widening1_OBJECTS) $(bhrz03widening1_LDADD) $(LIBS) +bhrz03widening2$(EXEEXT): $(bhrz03widening2_OBJECTS) $(bhrz03widening2_DEPENDENCIES) + @rm -f bhrz03widening2$(EXEEXT) + $(CXXLINK) $(bhrz03widening2_OBJECTS) $(bhrz03widening2_LDADD) $(LIBS) +bhrz03widening3$(EXEEXT): $(bhrz03widening3_OBJECTS) $(bhrz03widening3_DEPENDENCIES) + @rm -f bhrz03widening3$(EXEEXT) + $(CXXLINK) $(bhrz03widening3_OBJECTS) $(bhrz03widening3_LDADD) $(LIBS) +bhz03widening1$(EXEEXT): $(bhz03widening1_OBJECTS) $(bhz03widening1_DEPENDENCIES) + @rm -f bhz03widening1$(EXEEXT) + $(CXXLINK) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS) +bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES) + @rm -f bounded1$(EXEEXT) + $(CXXLINK) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS) +boundedaffineimage1$(EXEEXT): $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_DEPENDENCIES) + @rm -f boundedaffineimage1$(EXEEXT) + $(CXXLINK) $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_LDADD) $(LIBS) +boundedaffinepreimage1$(EXEEXT): $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_DEPENDENCIES) + @rm -f boundedaffinepreimage1$(EXEEXT) + $(CXXLINK) $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_LDADD) $(LIBS) +boundedbhrz03extrapolation1$(EXEEXT): $(boundedbhrz03extrapolation1_OBJECTS) $(boundedbhrz03extrapolation1_DEPENDENCIES) + @rm -f boundedbhrz03extrapolation1$(EXEEXT) + $(CXXLINK) $(boundedbhrz03extrapolation1_OBJECTS) $(boundedbhrz03extrapolation1_LDADD) $(LIBS) +boundedh79extrapolation1$(EXEEXT): $(boundedh79extrapolation1_OBJECTS) $(boundedh79extrapolation1_DEPENDENCIES) + @rm -f boundedh79extrapolation1$(EXEEXT) + $(CXXLINK) $(boundedh79extrapolation1_OBJECTS) $(boundedh79extrapolation1_LDADD) $(LIBS) +bounds1$(EXEEXT): $(bounds1_OBJECTS) $(bounds1_DEPENDENCIES) + @rm -f bounds1$(EXEEXT) + $(CXXLINK) $(bounds1_OBJECTS) $(bounds1_LDADD) $(LIBS) +cnncconversion1$(EXEEXT): $(cnncconversion1_OBJECTS) $(cnncconversion1_DEPENDENCIES) + @rm -f cnncconversion1$(EXEEXT) + $(CXXLINK) $(cnncconversion1_OBJECTS) $(cnncconversion1_LDADD) $(LIBS) +concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) + @rm -f concatenate1$(EXEEXT) + $(CXXLINK) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS) +congruences1$(EXEEXT): $(congruences1_OBJECTS) $(congruences1_DEPENDENCIES) + @rm -f congruences1$(EXEEXT) + $(CXXLINK) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS) +constrains1$(EXEEXT): $(constrains1_OBJECTS) $(constrains1_DEPENDENCIES) + @rm -f constrains1$(EXEEXT) + $(CXXLINK) $(constrains1_OBJECTS) $(constrains1_LDADD) $(LIBS) +constraints1$(EXEEXT): $(constraints1_OBJECTS) $(constraints1_DEPENDENCIES) + @rm -f constraints1$(EXEEXT) + $(CXXLINK) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS) +contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) + @rm -f contains1$(EXEEXT) + $(CXXLINK) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS) +contains2$(EXEEXT): $(contains2_OBJECTS) $(contains2_DEPENDENCIES) + @rm -f contains2$(EXEEXT) + $(CXXLINK) $(contains2_OBJECTS) $(contains2_LDADD) $(LIBS) +containsintegerpoint1$(EXEEXT): $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_DEPENDENCIES) + @rm -f containsintegerpoint1$(EXEEXT) + $(CXXLINK) $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_LDADD) $(LIBS) +disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES) + @rm -f disjoint1$(EXEEXT) + $(CXXLINK) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS) +disjoint2$(EXEEXT): $(disjoint2_OBJECTS) $(disjoint2_DEPENDENCIES) + @rm -f disjoint2$(EXEEXT) + $(CXXLINK) $(disjoint2_OBJECTS) $(disjoint2_LDADD) $(LIBS) +dualhypercubes$(EXEEXT): $(dualhypercubes_OBJECTS) $(dualhypercubes_DEPENDENCIES) + @rm -f dualhypercubes$(EXEEXT) + $(CXXLINK) $(dualhypercubes_OBJECTS) $(dualhypercubes_LDADD) $(LIBS) +empty1$(EXEEXT): $(empty1_OBJECTS) $(empty1_DEPENDENCIES) + @rm -f empty1$(EXEEXT) + $(CXXLINK) $(empty1_OBJECTS) $(empty1_LDADD) $(LIBS) +equals1$(EXEEXT): $(equals1_OBJECTS) $(equals1_DEPENDENCIES) + @rm -f equals1$(EXEEXT) + $(CXXLINK) $(equals1_OBJECTS) $(equals1_LDADD) $(LIBS) +exceptions1$(EXEEXT): $(exceptions1_OBJECTS) $(exceptions1_DEPENDENCIES) + @rm -f exceptions1$(EXEEXT) + $(CXXLINK) $(exceptions1_OBJECTS) $(exceptions1_LDADD) $(LIBS) +exceptions2$(EXEEXT): $(exceptions2_OBJECTS) $(exceptions2_DEPENDENCIES) + @rm -f exceptions2$(EXEEXT) + $(CXXLINK) $(exceptions2_OBJECTS) $(exceptions2_LDADD) $(LIBS) +exceptions3$(EXEEXT): $(exceptions3_OBJECTS) $(exceptions3_DEPENDENCIES) + @rm -f exceptions3$(EXEEXT) + $(CXXLINK) $(exceptions3_OBJECTS) $(exceptions3_LDADD) $(LIBS) +expandspacedim1$(EXEEXT): $(expandspacedim1_OBJECTS) $(expandspacedim1_DEPENDENCIES) + @rm -f expandspacedim1$(EXEEXT) + $(CXXLINK) $(expandspacedim1_OBJECTS) $(expandspacedim1_LDADD) $(LIBS) +expandspacedim2$(EXEEXT): $(expandspacedim2_OBJECTS) $(expandspacedim2_DEPENDENCIES) + @rm -f expandspacedim2$(EXEEXT) + $(CXXLINK) $(expandspacedim2_OBJECTS) $(expandspacedim2_LDADD) $(LIBS) +foldspacedims1$(EXEEXT): $(foldspacedims1_OBJECTS) $(foldspacedims1_DEPENDENCIES) + @rm -f foldspacedims1$(EXEEXT) + $(CXXLINK) $(foldspacedims1_OBJECTS) $(foldspacedims1_LDADD) $(LIBS) +foldspacedims2$(EXEEXT): $(foldspacedims2_OBJECTS) $(foldspacedims2_DEPENDENCIES) + @rm -f foldspacedims2$(EXEEXT) + $(CXXLINK) $(foldspacedims2_OBJECTS) $(foldspacedims2_LDADD) $(LIBS) +frombdshape1$(EXEEXT): $(frombdshape1_OBJECTS) $(frombdshape1_DEPENDENCIES) + @rm -f frombdshape1$(EXEEXT) + $(CXXLINK) $(frombdshape1_OBJECTS) $(frombdshape1_LDADD) $(LIBS) +frombox1$(EXEEXT): $(frombox1_OBJECTS) $(frombox1_DEPENDENCIES) + @rm -f frombox1$(EXEEXT) + $(CXXLINK) $(frombox1_OBJECTS) $(frombox1_LDADD) $(LIBS) +frombox2$(EXEEXT): $(frombox2_OBJECTS) $(frombox2_DEPENDENCIES) + @rm -f frombox2$(EXEEXT) + $(CXXLINK) $(frombox2_OBJECTS) $(frombox2_LDADD) $(LIBS) +fromgrid1$(EXEEXT): $(fromgrid1_OBJECTS) $(fromgrid1_DEPENDENCIES) + @rm -f fromgrid1$(EXEEXT) + $(CXXLINK) $(fromgrid1_OBJECTS) $(fromgrid1_LDADD) $(LIBS) +fromoctagonalshape1$(EXEEXT): $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_DEPENDENCIES) + @rm -f fromoctagonalshape1$(EXEEXT) + $(CXXLINK) $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_LDADD) $(LIBS) +generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES) + @rm -f generalizedaffineimage1$(EXEEXT) + $(CXXLINK) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS) +generalizedaffineimage2$(EXEEXT): $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_DEPENDENCIES) + @rm -f generalizedaffineimage2$(EXEEXT) + $(CXXLINK) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS) +generalizedaffinepreimage1$(EXEEXT): $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_DEPENDENCIES) + @rm -f generalizedaffinepreimage1$(EXEEXT) + $(CXXLINK) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS) +generalizedaffinepreimage2$(EXEEXT): $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_DEPENDENCIES) + @rm -f generalizedaffinepreimage2$(EXEEXT) + $(CXXLINK) $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_LDADD) $(LIBS) +generators1$(EXEEXT): $(generators1_OBJECTS) $(generators1_DEPENDENCIES) + @rm -f generators1$(EXEEXT) + $(CXXLINK) $(generators1_OBJECTS) $(generators1_LDADD) $(LIBS) +geomcovers1$(EXEEXT): $(geomcovers1_OBJECTS) $(geomcovers1_DEPENDENCIES) + @rm -f geomcovers1$(EXEEXT) + $(CXXLINK) $(geomcovers1_OBJECTS) $(geomcovers1_LDADD) $(LIBS) +h79widening1$(EXEEXT): $(h79widening1_OBJECTS) $(h79widening1_DEPENDENCIES) + @rm -f h79widening1$(EXEEXT) + $(CXXLINK) $(h79widening1_OBJECTS) $(h79widening1_LDADD) $(LIBS) +h79widening2$(EXEEXT): $(h79widening2_OBJECTS) $(h79widening2_DEPENDENCIES) + @rm -f h79widening2$(EXEEXT) + $(CXXLINK) $(h79widening2_OBJECTS) $(h79widening2_LDADD) $(LIBS) +hybrid$(EXEEXT): $(hybrid_OBJECTS) $(hybrid_DEPENDENCIES) + @rm -f hybrid$(EXEEXT) + $(CXXLINK) $(hybrid_OBJECTS) $(hybrid_LDADD) $(LIBS) +intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) + @rm -f intersection1$(EXEEXT) + $(CXXLINK) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS) +limitedbhrz03extrapolation1$(EXEEXT): $(limitedbhrz03extrapolation1_OBJECTS) $(limitedbhrz03extrapolation1_DEPENDENCIES) + @rm -f limitedbhrz03extrapolation1$(EXEEXT) + $(CXXLINK) $(limitedbhrz03extrapolation1_OBJECTS) $(limitedbhrz03extrapolation1_LDADD) $(LIBS) +limitedh79extrapolation1$(EXEEXT): $(limitedh79extrapolation1_OBJECTS) $(limitedh79extrapolation1_DEPENDENCIES) + @rm -f limitedh79extrapolation1$(EXEEXT) + $(CXXLINK) $(limitedh79extrapolation1_OBJECTS) $(limitedh79extrapolation1_LDADD) $(LIBS) +linearexpression1$(EXEEXT): $(linearexpression1_OBJECTS) $(linearexpression1_DEPENDENCIES) + @rm -f linearexpression1$(EXEEXT) + $(CXXLINK) $(linearexpression1_OBJECTS) $(linearexpression1_LDADD) $(LIBS) +linearpartition1$(EXEEXT): $(linearpartition1_OBJECTS) $(linearpartition1_DEPENDENCIES) + @rm -f linearpartition1$(EXEEXT) + $(CXXLINK) $(linearpartition1_OBJECTS) $(linearpartition1_LDADD) $(LIBS) +linearsystem1$(EXEEXT): $(linearsystem1_OBJECTS) $(linearsystem1_DEPENDENCIES) + @rm -f linearsystem1$(EXEEXT) + $(CXXLINK) $(linearsystem1_OBJECTS) $(linearsystem1_LDADD) $(LIBS) +mapspacedims1$(EXEEXT): $(mapspacedims1_OBJECTS) $(mapspacedims1_DEPENDENCIES) + @rm -f mapspacedims1$(EXEEXT) + $(CXXLINK) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS) +matrix1$(EXEEXT): $(matrix1_OBJECTS) $(matrix1_DEPENDENCIES) + @rm -f matrix1$(EXEEXT) + $(CXXLINK) $(matrix1_OBJECTS) $(matrix1_LDADD) $(LIBS) +max_min1$(EXEEXT): $(max_min1_OBJECTS) $(max_min1_DEPENDENCIES) + @rm -f max_min1$(EXEEXT) + $(CXXLINK) $(max_min1_OBJECTS) $(max_min1_LDADD) $(LIBS) +maxspacedim1$(EXEEXT): $(maxspacedim1_OBJECTS) $(maxspacedim1_DEPENDENCIES) + @rm -f maxspacedim1$(EXEEXT) + $(CXXLINK) $(maxspacedim1_OBJECTS) $(maxspacedim1_LDADD) $(LIBS) +mc91$(EXEEXT): $(mc91_OBJECTS) $(mc91_DEPENDENCIES) + @rm -f mc91$(EXEEXT) + $(CXXLINK) $(mc91_OBJECTS) $(mc91_LDADD) $(LIBS) +membytes1$(EXEEXT): $(membytes1_OBJECTS) $(membytes1_DEPENDENCIES) + @rm -f membytes1$(EXEEXT) + $(CXXLINK) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS) +memory1$(EXEEXT): $(memory1_OBJECTS) $(memory1_DEPENDENCIES) + @rm -f memory1$(EXEEXT) + $(CXXLINK) $(memory1_OBJECTS) $(memory1_LDADD) $(LIBS) +memory2$(EXEEXT): $(memory2_OBJECTS) $(memory2_DEPENDENCIES) + @rm -f memory2$(EXEEXT) + $(CXXLINK) $(memory2_OBJECTS) $(memory2_LDADD) $(LIBS) +minconstraints1$(EXEEXT): $(minconstraints1_OBJECTS) $(minconstraints1_DEPENDENCIES) + @rm -f minconstraints1$(EXEEXT) + $(CXXLINK) $(minconstraints1_OBJECTS) $(minconstraints1_LDADD) $(LIBS) +minconstraints2$(EXEEXT): $(minconstraints2_OBJECTS) $(minconstraints2_DEPENDENCIES) + @rm -f minconstraints2$(EXEEXT) + $(CXXLINK) $(minconstraints2_OBJECTS) $(minconstraints2_LDADD) $(LIBS) +mingenerators1$(EXEEXT): $(mingenerators1_OBJECTS) $(mingenerators1_DEPENDENCIES) + @rm -f mingenerators1$(EXEEXT) + $(CXXLINK) $(mingenerators1_OBJECTS) $(mingenerators1_LDADD) $(LIBS) +mingenerators2$(EXEEXT): $(mingenerators2_OBJECTS) $(mingenerators2_DEPENDENCIES) + @rm -f mingenerators2$(EXEEXT) + $(CXXLINK) $(mingenerators2_OBJECTS) $(mingenerators2_LDADD) $(LIBS) +nnc_addcongruence1$(EXEEXT): $(nnc_addcongruence1_OBJECTS) $(nnc_addcongruence1_DEPENDENCIES) + @rm -f nnc_addcongruence1$(EXEEXT) + $(nnc_addcongruence1_LINK) $(nnc_addcongruence1_OBJECTS) $(nnc_addcongruence1_LDADD) $(LIBS) +nnc_addcongruences1$(EXEEXT): $(nnc_addcongruences1_OBJECTS) $(nnc_addcongruences1_DEPENDENCIES) + @rm -f nnc_addcongruences1$(EXEEXT) + $(nnc_addcongruences1_LINK) $(nnc_addcongruences1_OBJECTS) $(nnc_addcongruences1_LDADD) $(LIBS) +nnc_addconstraint1$(EXEEXT): $(nnc_addconstraint1_OBJECTS) $(nnc_addconstraint1_DEPENDENCIES) + @rm -f nnc_addconstraint1$(EXEEXT) + $(nnc_addconstraint1_LINK) $(nnc_addconstraint1_OBJECTS) $(nnc_addconstraint1_LDADD) $(LIBS) +nnc_addconstraints1$(EXEEXT): $(nnc_addconstraints1_OBJECTS) $(nnc_addconstraints1_DEPENDENCIES) + @rm -f nnc_addconstraints1$(EXEEXT) + $(nnc_addconstraints1_LINK) $(nnc_addconstraints1_OBJECTS) $(nnc_addconstraints1_LDADD) $(LIBS) +nnc_addgenerator1$(EXEEXT): $(nnc_addgenerator1_OBJECTS) $(nnc_addgenerator1_DEPENDENCIES) + @rm -f nnc_addgenerator1$(EXEEXT) + $(nnc_addgenerator1_LINK) $(nnc_addgenerator1_OBJECTS) $(nnc_addgenerator1_LDADD) $(LIBS) +nnc_addgenerators1$(EXEEXT): $(nnc_addgenerators1_OBJECTS) $(nnc_addgenerators1_DEPENDENCIES) + @rm -f nnc_addgenerators1$(EXEEXT) + $(nnc_addgenerators1_LINK) $(nnc_addgenerators1_OBJECTS) $(nnc_addgenerators1_LDADD) $(LIBS) +nnc_addspacedims1$(EXEEXT): $(nnc_addspacedims1_OBJECTS) $(nnc_addspacedims1_DEPENDENCIES) + @rm -f nnc_addspacedims1$(EXEEXT) + $(nnc_addspacedims1_LINK) $(nnc_addspacedims1_OBJECTS) $(nnc_addspacedims1_LDADD) $(LIBS) +nnc_affineimage1$(EXEEXT): $(nnc_affineimage1_OBJECTS) $(nnc_affineimage1_DEPENDENCIES) + @rm -f nnc_affineimage1$(EXEEXT) + $(nnc_affineimage1_LINK) $(nnc_affineimage1_OBJECTS) $(nnc_affineimage1_LDADD) $(LIBS) +nnc_affinepreimage1$(EXEEXT): $(nnc_affinepreimage1_OBJECTS) $(nnc_affinepreimage1_DEPENDENCIES) + @rm -f nnc_affinepreimage1$(EXEEXT) + $(nnc_affinepreimage1_LINK) $(nnc_affinepreimage1_OBJECTS) $(nnc_affinepreimage1_LDADD) $(LIBS) +nnc_affinetrans$(EXEEXT): $(nnc_affinetrans_OBJECTS) $(nnc_affinetrans_DEPENDENCIES) + @rm -f nnc_affinetrans$(EXEEXT) + $(nnc_affinetrans_LINK) $(nnc_affinetrans_OBJECTS) $(nnc_affinetrans_LDADD) $(LIBS) +nnc_append1$(EXEEXT): $(nnc_append1_OBJECTS) $(nnc_append1_DEPENDENCIES) + @rm -f nnc_append1$(EXEEXT) + $(nnc_append1_LINK) $(nnc_append1_OBJECTS) $(nnc_append1_LDADD) $(LIBS) +nnc_append2$(EXEEXT): $(nnc_append2_OBJECTS) $(nnc_append2_DEPENDENCIES) + @rm -f nnc_append2$(EXEEXT) + $(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) + @rm -f nnc_ascii_dump_load1$(EXEEXT) + $(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) + @rm -f nnc_ascii_dump_load2$(EXEEXT) + $(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) + @rm -f nnc_bgp99extrapolation1$(EXEEXT) + $(nnc_bgp99extrapolation1_LINK) $(nnc_bgp99extrapolation1_OBJECTS) $(nnc_bgp99extrapolation1_LDADD) $(LIBS) +nnc_bhrz03widening1$(EXEEXT): $(nnc_bhrz03widening1_OBJECTS) $(nnc_bhrz03widening1_DEPENDENCIES) + @rm -f nnc_bhrz03widening1$(EXEEXT) + $(nnc_bhrz03widening1_LINK) $(nnc_bhrz03widening1_OBJECTS) $(nnc_bhrz03widening1_LDADD) $(LIBS) +nnc_bhrz03widening2$(EXEEXT): $(nnc_bhrz03widening2_OBJECTS) $(nnc_bhrz03widening2_DEPENDENCIES) + @rm -f nnc_bhrz03widening2$(EXEEXT) + $(nnc_bhrz03widening2_LINK) $(nnc_bhrz03widening2_OBJECTS) $(nnc_bhrz03widening2_LDADD) $(LIBS) +nnc_bounded1$(EXEEXT): $(nnc_bounded1_OBJECTS) $(nnc_bounded1_DEPENDENCIES) + @rm -f nnc_bounded1$(EXEEXT) + $(nnc_bounded1_LINK) $(nnc_bounded1_OBJECTS) $(nnc_bounded1_LDADD) $(LIBS) +nnc_boundedaffineimage1$(EXEEXT): $(nnc_boundedaffineimage1_OBJECTS) $(nnc_boundedaffineimage1_DEPENDENCIES) + @rm -f nnc_boundedaffineimage1$(EXEEXT) + $(nnc_boundedaffineimage1_LINK) $(nnc_boundedaffineimage1_OBJECTS) $(nnc_boundedaffineimage1_LDADD) $(LIBS) +nnc_boundedaffinepreimage1$(EXEEXT): $(nnc_boundedaffinepreimage1_OBJECTS) $(nnc_boundedaffinepreimage1_DEPENDENCIES) + @rm -f nnc_boundedaffinepreimage1$(EXEEXT) + $(nnc_boundedaffinepreimage1_LINK) $(nnc_boundedaffinepreimage1_OBJECTS) $(nnc_boundedaffinepreimage1_LDADD) $(LIBS) +nnc_boundedbhrz03extrapolation1$(EXEEXT): $(nnc_boundedbhrz03extrapolation1_OBJECTS) $(nnc_boundedbhrz03extrapolation1_DEPENDENCIES) + @rm -f nnc_boundedbhrz03extrapolation1$(EXEEXT) + $(CXXLINK) $(nnc_boundedbhrz03extrapolation1_OBJECTS) $(nnc_boundedbhrz03extrapolation1_LDADD) $(LIBS) +nnc_boundedh79extrapolation1$(EXEEXT): $(nnc_boundedh79extrapolation1_OBJECTS) $(nnc_boundedh79extrapolation1_DEPENDENCIES) + @rm -f nnc_boundedh79extrapolation1$(EXEEXT) + $(nnc_boundedh79extrapolation1_LINK) $(nnc_boundedh79extrapolation1_OBJECTS) $(nnc_boundedh79extrapolation1_LDADD) $(LIBS) +nnc_bounds1$(EXEEXT): $(nnc_bounds1_OBJECTS) $(nnc_bounds1_DEPENDENCIES) + @rm -f nnc_bounds1$(EXEEXT) + $(nnc_bounds1_LINK) $(nnc_bounds1_OBJECTS) $(nnc_bounds1_LDADD) $(LIBS) +nnc_concatenate1$(EXEEXT): $(nnc_concatenate1_OBJECTS) $(nnc_concatenate1_DEPENDENCIES) + @rm -f nnc_concatenate1$(EXEEXT) + $(nnc_concatenate1_LINK) $(nnc_concatenate1_OBJECTS) $(nnc_concatenate1_LDADD) $(LIBS) +nnc_congruences1$(EXEEXT): $(nnc_congruences1_OBJECTS) $(nnc_congruences1_DEPENDENCIES) + @rm -f nnc_congruences1$(EXEEXT) + $(nnc_congruences1_LINK) $(nnc_congruences1_OBJECTS) $(nnc_congruences1_LDADD) $(LIBS) +nnc_constrains1$(EXEEXT): $(nnc_constrains1_OBJECTS) $(nnc_constrains1_DEPENDENCIES) + @rm -f nnc_constrains1$(EXEEXT) + $(nnc_constrains1_LINK) $(nnc_constrains1_OBJECTS) $(nnc_constrains1_LDADD) $(LIBS) +nnc_constraints1$(EXEEXT): $(nnc_constraints1_OBJECTS) $(nnc_constraints1_DEPENDENCIES) + @rm -f nnc_constraints1$(EXEEXT) + $(nnc_constraints1_LINK) $(nnc_constraints1_OBJECTS) $(nnc_constraints1_LDADD) $(LIBS) +nnc_contains1$(EXEEXT): $(nnc_contains1_OBJECTS) $(nnc_contains1_DEPENDENCIES) + @rm -f nnc_contains1$(EXEEXT) + $(nnc_contains1_LINK) $(nnc_contains1_OBJECTS) $(nnc_contains1_LDADD) $(LIBS) +nnc_containsintegerpoint1$(EXEEXT): $(nnc_containsintegerpoint1_OBJECTS) $(nnc_containsintegerpoint1_DEPENDENCIES) + @rm -f nnc_containsintegerpoint1$(EXEEXT) + $(nnc_containsintegerpoint1_LINK) $(nnc_containsintegerpoint1_OBJECTS) $(nnc_containsintegerpoint1_LDADD) $(LIBS) +nnc_disjoint1$(EXEEXT): $(nnc_disjoint1_OBJECTS) $(nnc_disjoint1_DEPENDENCIES) + @rm -f nnc_disjoint1$(EXEEXT) + $(nnc_disjoint1_LINK) $(nnc_disjoint1_OBJECTS) $(nnc_disjoint1_LDADD) $(LIBS) +nnc_empty1$(EXEEXT): $(nnc_empty1_OBJECTS) $(nnc_empty1_DEPENDENCIES) + @rm -f nnc_empty1$(EXEEXT) + $(nnc_empty1_LINK) $(nnc_empty1_OBJECTS) $(nnc_empty1_LDADD) $(LIBS) +nnc_equals1$(EXEEXT): $(nnc_equals1_OBJECTS) $(nnc_equals1_DEPENDENCIES) + @rm -f nnc_equals1$(EXEEXT) + $(nnc_equals1_LINK) $(nnc_equals1_OBJECTS) $(nnc_equals1_LDADD) $(LIBS) +nnc_exceptions1$(EXEEXT): $(nnc_exceptions1_OBJECTS) $(nnc_exceptions1_DEPENDENCIES) + @rm -f nnc_exceptions1$(EXEEXT) + $(nnc_exceptions1_LINK) $(nnc_exceptions1_OBJECTS) $(nnc_exceptions1_LDADD) $(LIBS) +nnc_exceptions3$(EXEEXT): $(nnc_exceptions3_OBJECTS) $(nnc_exceptions3_DEPENDENCIES) + @rm -f nnc_exceptions3$(EXEEXT) + $(nnc_exceptions3_LINK) $(nnc_exceptions3_OBJECTS) $(nnc_exceptions3_LDADD) $(LIBS) +nnc_expandspacedim1$(EXEEXT): $(nnc_expandspacedim1_OBJECTS) $(nnc_expandspacedim1_DEPENDENCIES) + @rm -f nnc_expandspacedim1$(EXEEXT) + $(nnc_expandspacedim1_LINK) $(nnc_expandspacedim1_OBJECTS) $(nnc_expandspacedim1_LDADD) $(LIBS) +nnc_foldspacedims1$(EXEEXT): $(nnc_foldspacedims1_OBJECTS) $(nnc_foldspacedims1_DEPENDENCIES) + @rm -f nnc_foldspacedims1$(EXEEXT) + $(nnc_foldspacedims1_LINK) $(nnc_foldspacedims1_OBJECTS) $(nnc_foldspacedims1_LDADD) $(LIBS) +nnc_frombdshape1$(EXEEXT): $(nnc_frombdshape1_OBJECTS) $(nnc_frombdshape1_DEPENDENCIES) + @rm -f nnc_frombdshape1$(EXEEXT) + $(nnc_frombdshape1_LINK) $(nnc_frombdshape1_OBJECTS) $(nnc_frombdshape1_LDADD) $(LIBS) +nnc_frombox1$(EXEEXT): $(nnc_frombox1_OBJECTS) $(nnc_frombox1_DEPENDENCIES) + @rm -f nnc_frombox1$(EXEEXT) + $(nnc_frombox1_LINK) $(nnc_frombox1_OBJECTS) $(nnc_frombox1_LDADD) $(LIBS) +nnc_fromgrid1$(EXEEXT): $(nnc_fromgrid1_OBJECTS) $(nnc_fromgrid1_DEPENDENCIES) + @rm -f nnc_fromgrid1$(EXEEXT) + $(nnc_fromgrid1_LINK) $(nnc_fromgrid1_OBJECTS) $(nnc_fromgrid1_LDADD) $(LIBS) +nnc_fromoctagonalshape1$(EXEEXT): $(nnc_fromoctagonalshape1_OBJECTS) $(nnc_fromoctagonalshape1_DEPENDENCIES) + @rm -f nnc_fromoctagonalshape1$(EXEEXT) + $(nnc_fromoctagonalshape1_LINK) $(nnc_fromoctagonalshape1_OBJECTS) $(nnc_fromoctagonalshape1_LDADD) $(LIBS) +nnc_generalizedaffineimage1$(EXEEXT): $(nnc_generalizedaffineimage1_OBJECTS) $(nnc_generalizedaffineimage1_DEPENDENCIES) + @rm -f nnc_generalizedaffineimage1$(EXEEXT) + $(nnc_generalizedaffineimage1_LINK) $(nnc_generalizedaffineimage1_OBJECTS) $(nnc_generalizedaffineimage1_LDADD) $(LIBS) +nnc_generalizedaffinepreimage1$(EXEEXT): $(nnc_generalizedaffinepreimage1_OBJECTS) $(nnc_generalizedaffinepreimage1_DEPENDENCIES) + @rm -f nnc_generalizedaffinepreimage1$(EXEEXT) + $(nnc_generalizedaffinepreimage1_LINK) $(nnc_generalizedaffinepreimage1_OBJECTS) $(nnc_generalizedaffinepreimage1_LDADD) $(LIBS) +nnc_generators1$(EXEEXT): $(nnc_generators1_OBJECTS) $(nnc_generators1_DEPENDENCIES) + @rm -f nnc_generators1$(EXEEXT) + $(nnc_generators1_LINK) $(nnc_generators1_OBJECTS) $(nnc_generators1_LDADD) $(LIBS) +nnc_geomcovers1$(EXEEXT): $(nnc_geomcovers1_OBJECTS) $(nnc_geomcovers1_DEPENDENCIES) + @rm -f nnc_geomcovers1$(EXEEXT) + $(nnc_geomcovers1_LINK) $(nnc_geomcovers1_OBJECTS) $(nnc_geomcovers1_LDADD) $(LIBS) +nnc_h79widening1$(EXEEXT): $(nnc_h79widening1_OBJECTS) $(nnc_h79widening1_DEPENDENCIES) + @rm -f nnc_h79widening1$(EXEEXT) + $(nnc_h79widening1_LINK) $(nnc_h79widening1_OBJECTS) $(nnc_h79widening1_LDADD) $(LIBS) +nnc_intersection1$(EXEEXT): $(nnc_intersection1_OBJECTS) $(nnc_intersection1_DEPENDENCIES) + @rm -f nnc_intersection1$(EXEEXT) + $(nnc_intersection1_LINK) $(nnc_intersection1_OBJECTS) $(nnc_intersection1_LDADD) $(LIBS) +nnc_limitedbhrz03extrapolation1$(EXEEXT): $(nnc_limitedbhrz03extrapolation1_OBJECTS) $(nnc_limitedbhrz03extrapolation1_DEPENDENCIES) + @rm -f nnc_limitedbhrz03extrapolation1$(EXEEXT) + $(nnc_limitedbhrz03extrapolation1_LINK) $(nnc_limitedbhrz03extrapolation1_OBJECTS) $(nnc_limitedbhrz03extrapolation1_LDADD) $(LIBS) +nnc_limitedh79extrapolation1$(EXEEXT): $(nnc_limitedh79extrapolation1_OBJECTS) $(nnc_limitedh79extrapolation1_DEPENDENCIES) + @rm -f nnc_limitedh79extrapolation1$(EXEEXT) + $(nnc_limitedh79extrapolation1_LINK) $(nnc_limitedh79extrapolation1_OBJECTS) $(nnc_limitedh79extrapolation1_LDADD) $(LIBS) +nnc_linearpartition1$(EXEEXT): $(nnc_linearpartition1_OBJECTS) $(nnc_linearpartition1_DEPENDENCIES) + @rm -f nnc_linearpartition1$(EXEEXT) + $(nnc_linearpartition1_LINK) $(nnc_linearpartition1_OBJECTS) $(nnc_linearpartition1_LDADD) $(LIBS) +nnc_mapspacedims1$(EXEEXT): $(nnc_mapspacedims1_OBJECTS) $(nnc_mapspacedims1_DEPENDENCIES) + @rm -f nnc_mapspacedims1$(EXEEXT) + $(nnc_mapspacedims1_LINK) $(nnc_mapspacedims1_OBJECTS) $(nnc_mapspacedims1_LDADD) $(LIBS) +nnc_max_min1$(EXEEXT): $(nnc_max_min1_OBJECTS) $(nnc_max_min1_DEPENDENCIES) + @rm -f nnc_max_min1$(EXEEXT) + $(nnc_max_min1_LINK) $(nnc_max_min1_OBJECTS) $(nnc_max_min1_LDADD) $(LIBS) +nnc_mc91$(EXEEXT): $(nnc_mc91_OBJECTS) $(nnc_mc91_DEPENDENCIES) + @rm -f nnc_mc91$(EXEEXT) + $(nnc_mc91_LINK) $(nnc_mc91_OBJECTS) $(nnc_mc91_LDADD) $(LIBS) +nnc_membytes1$(EXEEXT): $(nnc_membytes1_OBJECTS) $(nnc_membytes1_DEPENDENCIES) + @rm -f nnc_membytes1$(EXEEXT) + $(nnc_membytes1_LINK) $(nnc_membytes1_OBJECTS) $(nnc_membytes1_LDADD) $(LIBS) +nnc_minconstraints1$(EXEEXT): $(nnc_minconstraints1_OBJECTS) $(nnc_minconstraints1_DEPENDENCIES) + @rm -f nnc_minconstraints1$(EXEEXT) + $(nnc_minconstraints1_LINK) $(nnc_minconstraints1_OBJECTS) $(nnc_minconstraints1_LDADD) $(LIBS) +nnc_mingenerators1$(EXEEXT): $(nnc_mingenerators1_OBJECTS) $(nnc_mingenerators1_DEPENDENCIES) + @rm -f nnc_mingenerators1$(EXEEXT) + $(nnc_mingenerators1_LINK) $(nnc_mingenerators1_OBJECTS) $(nnc_mingenerators1_LDADD) $(LIBS) +nnc_onepoint$(EXEEXT): $(nnc_onepoint_OBJECTS) $(nnc_onepoint_DEPENDENCIES) + @rm -f nnc_onepoint$(EXEEXT) + $(nnc_onepoint_LINK) $(nnc_onepoint_OBJECTS) $(nnc_onepoint_LDADD) $(LIBS) +nnc_permute$(EXEEXT): $(nnc_permute_OBJECTS) $(nnc_permute_DEPENDENCIES) + @rm -f nnc_permute$(EXEEXT) + $(nnc_permute_LINK) $(nnc_permute_OBJECTS) $(nnc_permute_LDADD) $(LIBS) +nnc_polydifference1$(EXEEXT): $(nnc_polydifference1_OBJECTS) $(nnc_polydifference1_DEPENDENCIES) + @rm -f nnc_polydifference1$(EXEEXT) + $(nnc_polydifference1_LINK) $(nnc_polydifference1_OBJECTS) $(nnc_polydifference1_LDADD) $(LIBS) +nnc_polyhull1$(EXEEXT): $(nnc_polyhull1_OBJECTS) $(nnc_polyhull1_DEPENDENCIES) + @rm -f nnc_polyhull1$(EXEEXT) + $(nnc_polyhull1_LINK) $(nnc_polyhull1_OBJECTS) $(nnc_polyhull1_LDADD) $(LIBS) +nnc_polyhullifexact1$(EXEEXT): $(nnc_polyhullifexact1_OBJECTS) $(nnc_polyhullifexact1_DEPENDENCIES) + @rm -f nnc_polyhullifexact1$(EXEEXT) + $(nnc_polyhullifexact1_LINK) $(nnc_polyhullifexact1_OBJECTS) $(nnc_polyhullifexact1_LDADD) $(LIBS) +nnc_randphull1$(EXEEXT): $(nnc_randphull1_OBJECTS) $(nnc_randphull1_DEPENDENCIES) + @rm -f nnc_randphull1$(EXEEXT) + $(nnc_randphull1_LINK) $(nnc_randphull1_OBJECTS) $(nnc_randphull1_LDADD) $(LIBS) +nnc_relations1$(EXEEXT): $(nnc_relations1_OBJECTS) $(nnc_relations1_DEPENDENCIES) + @rm -f nnc_relations1$(EXEEXT) + $(nnc_relations1_LINK) $(nnc_relations1_OBJECTS) $(nnc_relations1_LDADD) $(LIBS) +nnc_relations2$(EXEEXT): $(nnc_relations2_OBJECTS) $(nnc_relations2_DEPENDENCIES) + @rm -f nnc_relations2$(EXEEXT) + $(nnc_relations2_LINK) $(nnc_relations2_OBJECTS) $(nnc_relations2_LDADD) $(LIBS) +nnc_removespacedims1$(EXEEXT): $(nnc_removespacedims1_OBJECTS) $(nnc_removespacedims1_DEPENDENCIES) + @rm -f nnc_removespacedims1$(EXEEXT) + $(nnc_removespacedims1_LINK) $(nnc_removespacedims1_OBJECTS) $(nnc_removespacedims1_LDADD) $(LIBS) +nnc_simplifyusingcontext1$(EXEEXT): $(nnc_simplifyusingcontext1_OBJECTS) $(nnc_simplifyusingcontext1_DEPENDENCIES) + @rm -f nnc_simplifyusingcontext1$(EXEEXT) + $(nnc_simplifyusingcontext1_LINK) $(nnc_simplifyusingcontext1_OBJECTS) $(nnc_simplifyusingcontext1_LDADD) $(LIBS) +nnc_smm1$(EXEEXT): $(nnc_smm1_OBJECTS) $(nnc_smm1_DEPENDENCIES) + @rm -f nnc_smm1$(EXEEXT) + $(nnc_smm1_LINK) $(nnc_smm1_OBJECTS) $(nnc_smm1_LDADD) $(LIBS) +nnc_timeelapse1$(EXEEXT): $(nnc_timeelapse1_OBJECTS) $(nnc_timeelapse1_DEPENDENCIES) + @rm -f nnc_timeelapse1$(EXEEXT) + $(nnc_timeelapse1_LINK) $(nnc_timeelapse1_OBJECTS) $(nnc_timeelapse1_LDADD) $(LIBS) +nnc_unconstrain1$(EXEEXT): $(nnc_unconstrain1_OBJECTS) $(nnc_unconstrain1_DEPENDENCIES) + @rm -f nnc_unconstrain1$(EXEEXT) + $(nnc_unconstrain1_LINK) $(nnc_unconstrain1_OBJECTS) $(nnc_unconstrain1_LDADD) $(LIBS) +nnc_universe1$(EXEEXT): $(nnc_universe1_OBJECTS) $(nnc_universe1_DEPENDENCIES) + @rm -f nnc_universe1$(EXEEXT) + $(nnc_universe1_LINK) $(nnc_universe1_OBJECTS) $(nnc_universe1_LDADD) $(LIBS) +nnc_writepolyhedron1$(EXEEXT): $(nnc_writepolyhedron1_OBJECTS) $(nnc_writepolyhedron1_DEPENDENCIES) + @rm -f nnc_writepolyhedron1$(EXEEXT) + $(nnc_writepolyhedron1_LINK) $(nnc_writepolyhedron1_OBJECTS) $(nnc_writepolyhedron1_LDADD) $(LIBS) +nncminimize1$(EXEEXT): $(nncminimize1_OBJECTS) $(nncminimize1_DEPENDENCIES) + @rm -f nncminimize1$(EXEEXT) + $(CXXLINK) $(nncminimize1_OBJECTS) $(nncminimize1_LDADD) $(LIBS) +nncminimize2$(EXEEXT): $(nncminimize2_OBJECTS) $(nncminimize2_DEPENDENCIES) + @rm -f nncminimize2$(EXEEXT) + $(CXXLINK) $(nncminimize2_OBJECTS) $(nncminimize2_LDADD) $(LIBS) +numberinput1$(EXEEXT): $(numberinput1_OBJECTS) $(numberinput1_DEPENDENCIES) + @rm -f numberinput1$(EXEEXT) + $(CXXLINK) $(numberinput1_OBJECTS) $(numberinput1_LDADD) $(LIBS) +onepoint$(EXEEXT): $(onepoint_OBJECTS) $(onepoint_DEPENDENCIES) + @rm -f onepoint$(EXEEXT) + $(CXXLINK) $(onepoint_OBJECTS) $(onepoint_LDADD) $(LIBS) +permute$(EXEEXT): $(permute_OBJECTS) $(permute_DEPENDENCIES) + @rm -f permute$(EXEEXT) + $(CXXLINK) $(permute_OBJECTS) $(permute_LDADD) $(LIBS) +polydifference1$(EXEEXT): $(polydifference1_OBJECTS) $(polydifference1_DEPENDENCIES) + @rm -f polydifference1$(EXEEXT) + $(CXXLINK) $(polydifference1_OBJECTS) $(polydifference1_LDADD) $(LIBS) +polydifference2$(EXEEXT): $(polydifference2_OBJECTS) $(polydifference2_DEPENDENCIES) + @rm -f polydifference2$(EXEEXT) + $(CXXLINK) $(polydifference2_OBJECTS) $(polydifference2_LDADD) $(LIBS) +polyhull1$(EXEEXT): $(polyhull1_OBJECTS) $(polyhull1_DEPENDENCIES) + @rm -f polyhull1$(EXEEXT) + $(CXXLINK) $(polyhull1_OBJECTS) $(polyhull1_LDADD) $(LIBS) +polyhull2$(EXEEXT): $(polyhull2_OBJECTS) $(polyhull2_DEPENDENCIES) + @rm -f polyhull2$(EXEEXT) + $(CXXLINK) $(polyhull2_OBJECTS) $(polyhull2_LDADD) $(LIBS) +polyhullifexact1$(EXEEXT): $(polyhullifexact1_OBJECTS) $(polyhullifexact1_DEPENDENCIES) + @rm -f polyhullifexact1$(EXEEXT) + $(CXXLINK) $(polyhullifexact1_OBJECTS) $(polyhullifexact1_LDADD) $(LIBS) +polyhullifexact2$(EXEEXT): $(polyhullifexact2_OBJECTS) $(polyhullifexact2_DEPENDENCIES) + @rm -f polyhullifexact2$(EXEEXT) + $(CXXLINK) $(polyhullifexact2_OBJECTS) $(polyhullifexact2_LDADD) $(LIBS) +randphull1$(EXEEXT): $(randphull1_OBJECTS) $(randphull1_DEPENDENCIES) + @rm -f randphull1$(EXEEXT) + $(CXXLINK) $(randphull1_OBJECTS) $(randphull1_LDADD) $(LIBS) +refinewithcongruence1$(EXEEXT): $(refinewithcongruence1_OBJECTS) $(refinewithcongruence1_DEPENDENCIES) + @rm -f refinewithcongruence1$(EXEEXT) + $(CXXLINK) $(refinewithcongruence1_OBJECTS) $(refinewithcongruence1_LDADD) $(LIBS) +refinewithcongruences1$(EXEEXT): $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_DEPENDENCIES) + @rm -f refinewithcongruences1$(EXEEXT) + $(CXXLINK) $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_LDADD) $(LIBS) +refinewithconstraint1$(EXEEXT): $(refinewithconstraint1_OBJECTS) $(refinewithconstraint1_DEPENDENCIES) + @rm -f refinewithconstraint1$(EXEEXT) + $(CXXLINK) $(refinewithconstraint1_OBJECTS) $(refinewithconstraint1_LDADD) $(LIBS) +refinewithconstraints1$(EXEEXT): $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_DEPENDENCIES) + @rm -f refinewithconstraints1$(EXEEXT) + $(CXXLINK) $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_LDADD) $(LIBS) +relations1$(EXEEXT): $(relations1_OBJECTS) $(relations1_DEPENDENCIES) + @rm -f relations1$(EXEEXT) + $(CXXLINK) $(relations1_OBJECTS) $(relations1_LDADD) $(LIBS) +relations2$(EXEEXT): $(relations2_OBJECTS) $(relations2_DEPENDENCIES) + @rm -f relations2$(EXEEXT) + $(CXXLINK) $(relations2_OBJECTS) $(relations2_LDADD) $(LIBS) +relations3$(EXEEXT): $(relations3_OBJECTS) $(relations3_DEPENDENCIES) + @rm -f relations3$(EXEEXT) + $(CXXLINK) $(relations3_OBJECTS) $(relations3_LDADD) $(LIBS) +removespacedims1$(EXEEXT): $(removespacedims1_OBJECTS) $(removespacedims1_DEPENDENCIES) + @rm -f removespacedims1$(EXEEXT) + $(CXXLINK) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS) +removespacedims2$(EXEEXT): $(removespacedims2_OBJECTS) $(removespacedims2_DEPENDENCIES) + @rm -f removespacedims2$(EXEEXT) + $(CXXLINK) $(removespacedims2_OBJECTS) $(removespacedims2_LDADD) $(LIBS) +simplifyusingcontext1$(EXEEXT): $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_DEPENDENCIES) + @rm -f simplifyusingcontext1$(EXEEXT) + $(CXXLINK) $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_LDADD) $(LIBS) +smm1$(EXEEXT): $(smm1_OBJECTS) $(smm1_DEPENDENCIES) + @rm -f smm1$(EXEEXT) + $(CXXLINK) $(smm1_OBJECTS) $(smm1_LDADD) $(LIBS) +timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES) + @rm -f timeelapse1$(EXEEXT) + $(CXXLINK) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS) +timeelapse2$(EXEEXT): $(timeelapse2_OBJECTS) $(timeelapse2_DEPENDENCIES) + @rm -f timeelapse2$(EXEEXT) + $(CXXLINK) $(timeelapse2_OBJECTS) $(timeelapse2_LDADD) $(LIBS) +topclosed1$(EXEEXT): $(topclosed1_OBJECTS) $(topclosed1_DEPENDENCIES) + @rm -f topclosed1$(EXEEXT) + $(CXXLINK) $(topclosed1_OBJECTS) $(topclosed1_LDADD) $(LIBS) +topclosure1$(EXEEXT): $(topclosure1_OBJECTS) $(topclosure1_DEPENDENCIES) + @rm -f topclosure1$(EXEEXT) + $(CXXLINK) $(topclosure1_OBJECTS) $(topclosure1_LDADD) $(LIBS) +unconstrain1$(EXEEXT): $(unconstrain1_OBJECTS) $(unconstrain1_DEPENDENCIES) + @rm -f unconstrain1$(EXEEXT) + $(CXXLINK) $(unconstrain1_OBJECTS) $(unconstrain1_LDADD) $(LIBS) +universe1$(EXEEXT): $(universe1_OBJECTS) $(universe1_DEPENDENCIES) + @rm -f universe1$(EXEEXT) + $(CXXLINK) $(universe1_OBJECTS) $(universe1_LDADD) $(LIBS) +universe2$(EXEEXT): $(universe2_OBJECTS) $(universe2_DEPENDENCIES) + @rm -f universe2$(EXEEXT) + $(CXXLINK) $(universe2_OBJECTS) $(universe2_LDADD) $(LIBS) +variablesset1$(EXEEXT): $(variablesset1_OBJECTS) $(variablesset1_DEPENDENCIES) + @rm -f variablesset1$(EXEEXT) + $(CXXLINK) $(variablesset1_OBJECTS) $(variablesset1_LDADD) $(LIBS) +watchdog1$(EXEEXT): $(watchdog1_OBJECTS) $(watchdog1_DEPENDENCIES) + @rm -f watchdog1$(EXEEXT) + $(CXXLINK) $(watchdog1_OBJECTS) $(watchdog1_LDADD) $(LIBS) +writeconsys1$(EXEEXT): $(writeconsys1_OBJECTS) $(writeconsys1_DEPENDENCIES) + @rm -f writeconsys1$(EXEEXT) + $(CXXLINK) $(writeconsys1_OBJECTS) $(writeconsys1_LDADD) $(LIBS) +writegensys1$(EXEEXT): $(writegensys1_OBJECTS) $(writegensys1_DEPENDENCIES) + @rm -f writegensys1$(EXEEXT) + $(CXXLINK) $(writegensys1_OBJECTS) $(writegensys1_LDADD) $(LIBS) +writepolyhedron1$(EXEEXT): $(writepolyhedron1_OBJECTS) $(writepolyhedron1_DEPENDENCIES) + @rm -f writepolyhedron1$(EXEEXT) + $(CXXLINK) $(writepolyhedron1_OBJECTS) $(writepolyhedron1_LDADD) $(LIBS) +writepolyhedron2$(EXEEXT): $(writepolyhedron2_OBJECTS) $(writepolyhedron2_DEPENDENCIES) + @rm -f writepolyhedron2$(EXEEXT) + $(CXXLINK) $(writepolyhedron2_OBJECTS) $(writepolyhedron2_LDADD) $(LIBS) +writerelation1$(EXEEXT): $(writerelation1_OBJECTS) $(writerelation1_DEPENDENCIES) + @rm -f writerelation1$(EXEEXT) + $(CXXLINK) $(writerelation1_OBJECTS) $(writerelation1_LDADD) $(LIBS) +writevariable1$(EXEEXT): $(writevariable1_OBJECTS) $(writevariable1_DEPENDENCIES) + @rm -f writevariable1$(EXEEXT) + $(CXXLINK) $(writevariable1_OBJECTS) $(writevariable1_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addcongruence1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addcongruences1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addconstraint1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addconstraints1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addconstraints2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addgenerator1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addgenerator2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addgenerators1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addgenerators2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addspacedims1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addspacedims2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/affineimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/affineimage2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/affinepreimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/affinetrans.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/append1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/append2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ascii_dump_load1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ascii_dump_load2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ascii_dump_load3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bgp99extrapolation1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bgp99extrapolation2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bhrz03widening1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bhrz03widening2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bhrz03widening3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bhz03widening1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bounded1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/boundedaffineimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/boundedaffinepreimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/boundedbhrz03extrapolation1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/boundedh79extrapolation1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bounds1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cnncconversion1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/concatenate1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/congruences1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/constrains1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/constraints1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/contains1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/contains2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/containsintegerpoint1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disjoint1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disjoint2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dualhypercubes.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/empty1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/equals1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exceptions1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exceptions2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exceptions3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/expandspacedim1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/expandspacedim2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/foldspacedims1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/foldspacedims2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frombdshape1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frombox1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frombox2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fromgrid1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fromoctagonalshape1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalizedaffineimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalizedaffineimage2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalizedaffinepreimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalizedaffinepreimage2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generators1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/geomcovers1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/h79widening1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/h79widening2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hybrid.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/intersection1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/limitedbhrz03extrapolation1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/limitedh79extrapolation1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/linearexpression1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/linearpartition1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/linearsystem1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mapspacedims1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matrix1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/max_min1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/maxspacedim1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mc91.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/membytes1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memory1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memory2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minconstraints1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minconstraints2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mingenerators1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mingenerators2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_addcongruence1-addcongruence1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_addcongruences1-addcongruences1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_addconstraint1-addconstraint1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_addconstraints1-addconstraints1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_addgenerator1-addgenerator1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_addgenerators1-addgenerators1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_addspacedims1-addspacedims1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_affineimage1-affineimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_affinetrans-affinetrans.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_append1-append1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_append2-append2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_bounded1-bounded1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_bounds1-bounds1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_concatenate1-concatenate1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_congruences1-congruences1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_constrains1-constrains1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_constraints1-constraints1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_contains1-contains1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_containsintegerpoint1-containsintegerpoint1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_disjoint1-disjoint1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_empty1-empty1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_equals1-equals1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_exceptions1-exceptions1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_exceptions3-exceptions3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_frombdshape1-frombdshape1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_frombox1-frombox1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_fromgrid1-fromgrid1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_fromoctagonalshape1-fromoctagonalshape1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_generators1-generators1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_geomcovers1-geomcovers1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_h79widening1-h79widening1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_intersection1-intersection1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_linearpartition1-linearpartition1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_max_min1-max_min1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_mc91-mc91.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_membytes1-membytes1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_minconstraints1-minconstraints1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_mingenerators1-mingenerators1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_onepoint-onepoint.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_permute-permute.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_polydifference1-polydifference1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_polyhull1-polyhull1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_polyhullifexact1-polyhullifexact1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_randphull1-randphull1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_relations1-relations1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_relations2-relations2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_removespacedims1-removespacedims1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_simplifyusingcontext1-simplifyusingcontext1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_smm1-smm1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_timeelapse1-timeelapse1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_unconstrain1-unconstrain1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_universe1-universe1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nncminimize1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nncminimize2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/numberinput1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/onepoint.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/permute.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/polydifference1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/polydifference2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/polyhull1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/polyhull2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/polyhullifexact1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/polyhullifexact2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/randphull1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refinewithcongruence1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refinewithcongruences1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refinewithconstraint1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refinewithconstraints1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relations1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relations2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relations3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/removespacedims1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/removespacedims2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplifyusingcontext1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smm1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timeelapse1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timeelapse2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/topclosed1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/topclosure1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unconstrain1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/universe1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/universe2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variablesset1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/watchdog1-watchdog1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/writeconsys1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/writegensys1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/writepolyhedron1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/writepolyhedron2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/writerelation1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/writevariable1.Po@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +nnc_addcongruence1-addcongruence1.o: addcongruence1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo $(DEPDIR)/nnc_addcongruence1-addcongruence1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addcongruence1.cc' object='nnc_addcongruence1-addcongruence1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruence1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addcongruence1-addcongruence1.o `test -f 'addcongruence1.cc' || echo '$(srcdir)/'`addcongruence1.cc + +nnc_addcongruence1-addcongruence1.obj: addcongruence1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo $(DEPDIR)/nnc_addcongruence1-addcongruence1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addcongruence1.cc' object='nnc_addcongruence1-addcongruence1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruence1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addcongruence1-addcongruence1.obj `if test -f 'addcongruence1.cc'; then $(CYGPATH_W) 'addcongruence1.cc'; else $(CYGPATH_W) '$(srcdir)/addcongruence1.cc'; fi` + +nnc_addcongruences1-addcongruences1.o: addcongruences1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo $(DEPDIR)/nnc_addcongruences1-addcongruences1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addcongruences1.cc' object='nnc_addcongruences1-addcongruences1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruences1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addcongruences1-addcongruences1.o `test -f 'addcongruences1.cc' || echo '$(srcdir)/'`addcongruences1.cc + +nnc_addcongruences1-addcongruences1.obj: addcongruences1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo $(DEPDIR)/nnc_addcongruences1-addcongruences1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addcongruences1.cc' object='nnc_addcongruences1-addcongruences1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruences1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addcongruences1-addcongruences1.obj `if test -f 'addcongruences1.cc'; then $(CYGPATH_W) 'addcongruences1.cc'; else $(CYGPATH_W) '$(srcdir)/addcongruences1.cc'; fi` + +nnc_addconstraint1-addconstraint1.o: addconstraint1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo $(DEPDIR)/nnc_addconstraint1-addconstraint1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addconstraint1.cc' object='nnc_addconstraint1-addconstraint1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraint1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addconstraint1-addconstraint1.o `test -f 'addconstraint1.cc' || echo '$(srcdir)/'`addconstraint1.cc + +nnc_addconstraint1-addconstraint1.obj: addconstraint1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo $(DEPDIR)/nnc_addconstraint1-addconstraint1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addconstraint1.cc' object='nnc_addconstraint1-addconstraint1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraint1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addconstraint1-addconstraint1.obj `if test -f 'addconstraint1.cc'; then $(CYGPATH_W) 'addconstraint1.cc'; else $(CYGPATH_W) '$(srcdir)/addconstraint1.cc'; fi` + +nnc_addconstraints1-addconstraints1.o: addconstraints1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo $(DEPDIR)/nnc_addconstraints1-addconstraints1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addconstraints1.cc' object='nnc_addconstraints1-addconstraints1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addconstraints1-addconstraints1.o `test -f 'addconstraints1.cc' || echo '$(srcdir)/'`addconstraints1.cc + +nnc_addconstraints1-addconstraints1.obj: addconstraints1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo $(DEPDIR)/nnc_addconstraints1-addconstraints1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addconstraints1.cc' object='nnc_addconstraints1-addconstraints1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addconstraints1-addconstraints1.obj `if test -f 'addconstraints1.cc'; then $(CYGPATH_W) 'addconstraints1.cc'; else $(CYGPATH_W) '$(srcdir)/addconstraints1.cc'; fi` + +nnc_addgenerator1-addgenerator1.o: addgenerator1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo $(DEPDIR)/nnc_addgenerator1-addgenerator1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addgenerator1.cc' object='nnc_addgenerator1-addgenerator1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerator1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addgenerator1-addgenerator1.o `test -f 'addgenerator1.cc' || echo '$(srcdir)/'`addgenerator1.cc + +nnc_addgenerator1-addgenerator1.obj: addgenerator1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo $(DEPDIR)/nnc_addgenerator1-addgenerator1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addgenerator1.cc' object='nnc_addgenerator1-addgenerator1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerator1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addgenerator1-addgenerator1.obj `if test -f 'addgenerator1.cc'; then $(CYGPATH_W) 'addgenerator1.cc'; else $(CYGPATH_W) '$(srcdir)/addgenerator1.cc'; fi` + +nnc_addgenerators1-addgenerators1.o: addgenerators1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo $(DEPDIR)/nnc_addgenerators1-addgenerators1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addgenerators1.cc' object='nnc_addgenerators1-addgenerators1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addgenerators1-addgenerators1.o `test -f 'addgenerators1.cc' || echo '$(srcdir)/'`addgenerators1.cc + +nnc_addgenerators1-addgenerators1.obj: addgenerators1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo $(DEPDIR)/nnc_addgenerators1-addgenerators1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addgenerators1.cc' object='nnc_addgenerators1-addgenerators1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addgenerators1-addgenerators1.obj `if test -f 'addgenerators1.cc'; then $(CYGPATH_W) 'addgenerators1.cc'; else $(CYGPATH_W) '$(srcdir)/addgenerators1.cc'; fi` + +nnc_addspacedims1-addspacedims1.o: addspacedims1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo $(DEPDIR)/nnc_addspacedims1-addspacedims1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addspacedims1.cc' object='nnc_addspacedims1-addspacedims1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addspacedims1-addspacedims1.o `test -f 'addspacedims1.cc' || echo '$(srcdir)/'`addspacedims1.cc + +nnc_addspacedims1-addspacedims1.obj: addspacedims1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo $(DEPDIR)/nnc_addspacedims1-addspacedims1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='addspacedims1.cc' object='nnc_addspacedims1-addspacedims1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addspacedims1-addspacedims1.obj `if test -f 'addspacedims1.cc'; then $(CYGPATH_W) 'addspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/addspacedims1.cc'; fi` + +nnc_affineimage1-affineimage1.o: affineimage1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_affineimage1-affineimage1.Tpo $(DEPDIR)/nnc_affineimage1-affineimage1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='affineimage1.cc' object='nnc_affineimage1-affineimage1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affineimage1-affineimage1.o `test -f 'affineimage1.cc' || echo '$(srcdir)/'`affineimage1.cc + +nnc_affineimage1-affineimage1.obj: affineimage1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_affineimage1-affineimage1.Tpo $(DEPDIR)/nnc_affineimage1-affineimage1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='affineimage1.cc' object='nnc_affineimage1-affineimage1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affineimage1-affineimage1.obj `if test -f 'affineimage1.cc'; then $(CYGPATH_W) 'affineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/affineimage1.cc'; fi` + +nnc_affinepreimage1-affinepreimage1.o: affinepreimage1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo $(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='affinepreimage1.cc' object='nnc_affinepreimage1-affinepreimage1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affinepreimage1-affinepreimage1.o `test -f 'affinepreimage1.cc' || echo '$(srcdir)/'`affinepreimage1.cc + +nnc_affinepreimage1-affinepreimage1.obj: affinepreimage1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo $(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='affinepreimage1.cc' object='nnc_affinepreimage1-affinepreimage1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affinepreimage1-affinepreimage1.obj `if test -f 'affinepreimage1.cc'; then $(CYGPATH_W) 'affinepreimage1.cc'; else $(CYGPATH_W) '$(srcdir)/affinepreimage1.cc'; fi` + +nnc_affinetrans-affinetrans.o: affinetrans.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_affinetrans-affinetrans.Tpo $(DEPDIR)/nnc_affinetrans-affinetrans.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='affinetrans.cc' object='nnc_affinetrans-affinetrans.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinetrans_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affinetrans-affinetrans.o `test -f 'affinetrans.cc' || echo '$(srcdir)/'`affinetrans.cc + +nnc_affinetrans-affinetrans.obj: affinetrans.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_affinetrans-affinetrans.Tpo $(DEPDIR)/nnc_affinetrans-affinetrans.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='affinetrans.cc' object='nnc_affinetrans-affinetrans.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinetrans_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affinetrans-affinetrans.obj `if test -f 'affinetrans.cc'; then $(CYGPATH_W) 'affinetrans.cc'; else $(CYGPATH_W) '$(srcdir)/affinetrans.cc'; fi` + +nnc_append1-append1.o: append1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_append1-append1.Tpo $(DEPDIR)/nnc_append1-append1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='append1.cc' object='nnc_append1-append1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_append1-append1.o `test -f 'append1.cc' || echo '$(srcdir)/'`append1.cc + +nnc_append1-append1.obj: append1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_append1-append1.Tpo $(DEPDIR)/nnc_append1-append1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='append1.cc' object='nnc_append1-append1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_append1-append1.obj `if test -f 'append1.cc'; then $(CYGPATH_W) 'append1.cc'; else $(CYGPATH_W) '$(srcdir)/append1.cc'; fi` + +nnc_append2-append2.o: append2.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_append2-append2.Tpo $(DEPDIR)/nnc_append2-append2.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='append2.cc' object='nnc_append2-append2.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_append2-append2.o `test -f 'append2.cc' || echo '$(srcdir)/'`append2.cc + +nnc_append2-append2.obj: append2.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_append2-append2.Tpo $(DEPDIR)/nnc_append2-append2.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='append2.cc' object='nnc_append2-append2.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_append2-append2.obj `if test -f 'append2.cc'; then $(CYGPATH_W) 'append2.cc'; else $(CYGPATH_W) '$(srcdir)/append2.cc'; fi` + +nnc_ascii_dump_load1-ascii_dump_load1.o: ascii_dump_load1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo $(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ascii_dump_load1.cc' object='nnc_ascii_dump_load1-ascii_dump_load1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_ascii_dump_load1-ascii_dump_load1.o `test -f 'ascii_dump_load1.cc' || echo '$(srcdir)/'`ascii_dump_load1.cc + +nnc_ascii_dump_load1-ascii_dump_load1.obj: ascii_dump_load1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo $(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ascii_dump_load1.cc' object='nnc_ascii_dump_load1-ascii_dump_load1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_ascii_dump_load1-ascii_dump_load1.obj `if test -f 'ascii_dump_load1.cc'; then $(CYGPATH_W) 'ascii_dump_load1.cc'; else $(CYGPATH_W) '$(srcdir)/ascii_dump_load1.cc'; fi` + +nnc_ascii_dump_load2-ascii_dump_load2.o: ascii_dump_load2.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo $(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ascii_dump_load2.cc' object='nnc_ascii_dump_load2-ascii_dump_load2.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_ascii_dump_load2-ascii_dump_load2.o `test -f 'ascii_dump_load2.cc' || echo '$(srcdir)/'`ascii_dump_load2.cc + +nnc_ascii_dump_load2-ascii_dump_load2.obj: ascii_dump_load2.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo $(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ascii_dump_load2.cc' object='nnc_ascii_dump_load2-ascii_dump_load2.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_ascii_dump_load2-ascii_dump_load2.obj `if test -f 'ascii_dump_load2.cc'; then $(CYGPATH_W) 'ascii_dump_load2.cc'; else $(CYGPATH_W) '$(srcdir)/ascii_dump_load2.cc'; fi` + +nnc_bgp99extrapolation1-bgp99extrapolation1.o: bgp99extrapolation1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo $(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='bgp99extrapolation1.cc' object='nnc_bgp99extrapolation1-bgp99extrapolation1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bgp99extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bgp99extrapolation1-bgp99extrapolation1.o `test -f 'bgp99extrapolation1.cc' || echo '$(srcdir)/'`bgp99extrapolation1.cc + +nnc_bgp99extrapolation1-bgp99extrapolation1.obj: bgp99extrapolation1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo $(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='bgp99extrapolation1.cc' object='nnc_bgp99extrapolation1-bgp99extrapolation1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bgp99extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bgp99extrapolation1-bgp99extrapolation1.obj `if test -f 'bgp99extrapolation1.cc'; then $(CYGPATH_W) 'bgp99extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/bgp99extrapolation1.cc'; fi` + +nnc_bhrz03widening1-bhrz03widening1.o: bhrz03widening1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo $(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='bhrz03widening1.cc' object='nnc_bhrz03widening1-bhrz03widening1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bhrz03widening1-bhrz03widening1.o `test -f 'bhrz03widening1.cc' || echo '$(srcdir)/'`bhrz03widening1.cc + +nnc_bhrz03widening1-bhrz03widening1.obj: bhrz03widening1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo $(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='bhrz03widening1.cc' object='nnc_bhrz03widening1-bhrz03widening1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bhrz03widening1-bhrz03widening1.obj `if test -f 'bhrz03widening1.cc'; then $(CYGPATH_W) 'bhrz03widening1.cc'; else $(CYGPATH_W) '$(srcdir)/bhrz03widening1.cc'; fi` + +nnc_bhrz03widening2-bhrz03widening2.o: bhrz03widening2.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo $(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='bhrz03widening2.cc' object='nnc_bhrz03widening2-bhrz03widening2.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bhrz03widening2-bhrz03widening2.o `test -f 'bhrz03widening2.cc' || echo '$(srcdir)/'`bhrz03widening2.cc + +nnc_bhrz03widening2-bhrz03widening2.obj: bhrz03widening2.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo $(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='bhrz03widening2.cc' object='nnc_bhrz03widening2-bhrz03widening2.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bhrz03widening2-bhrz03widening2.obj `if test -f 'bhrz03widening2.cc'; then $(CYGPATH_W) 'bhrz03widening2.cc'; else $(CYGPATH_W) '$(srcdir)/bhrz03widening2.cc'; fi` + +nnc_bounded1-bounded1.o: bounded1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_bounded1-bounded1.Tpo $(DEPDIR)/nnc_bounded1-bounded1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='bounded1.cc' object='nnc_bounded1-bounded1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounded1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bounded1-bounded1.o `test -f 'bounded1.cc' || echo '$(srcdir)/'`bounded1.cc + +nnc_bounded1-bounded1.obj: bounded1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_bounded1-bounded1.Tpo $(DEPDIR)/nnc_bounded1-bounded1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='bounded1.cc' object='nnc_bounded1-bounded1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounded1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bounded1-bounded1.obj `if test -f 'bounded1.cc'; then $(CYGPATH_W) 'bounded1.cc'; else $(CYGPATH_W) '$(srcdir)/bounded1.cc'; fi` + +nnc_boundedaffineimage1-boundedaffineimage1.o: boundedaffineimage1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo $(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='boundedaffineimage1.cc' object='nnc_boundedaffineimage1-boundedaffineimage1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedaffineimage1-boundedaffineimage1.o `test -f 'boundedaffineimage1.cc' || echo '$(srcdir)/'`boundedaffineimage1.cc + +nnc_boundedaffineimage1-boundedaffineimage1.obj: boundedaffineimage1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo $(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='boundedaffineimage1.cc' object='nnc_boundedaffineimage1-boundedaffineimage1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedaffineimage1-boundedaffineimage1.obj `if test -f 'boundedaffineimage1.cc'; then $(CYGPATH_W) 'boundedaffineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedaffineimage1.cc'; fi` + +nnc_boundedaffinepreimage1-boundedaffinepreimage1.o: boundedaffinepreimage1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo $(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='boundedaffinepreimage1.cc' object='nnc_boundedaffinepreimage1-boundedaffinepreimage1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedaffinepreimage1-boundedaffinepreimage1.o `test -f 'boundedaffinepreimage1.cc' || echo '$(srcdir)/'`boundedaffinepreimage1.cc + +nnc_boundedaffinepreimage1-boundedaffinepreimage1.obj: boundedaffinepreimage1.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedaffinepreimage1-boundedaffinepreimage1.obj -MD -MP -MF $(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo -c -o nnc_boundedaffinepreimage1-boundedaffinepreimage1.obj `if test -f 'boundedaffinepreimage1.cc'; then $(CYGPATH_W) 'boundedaffinepreimage1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedaffinepreimage1.cc'; fi` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo $(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='boundedaffinepreimage1.cc' object='nnc_boundedaffinepreimage1-boundedaffinepreimage1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedaffinepreimage1-boundedaffinepreimage1.obj `if test -f 'boundedaffinepreimage1.cc'; then $(CYGPATH_W) 'boundedaffinepreimage1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedaffinepreimage1.cc'; fi` + +nnc_boundedh79extrapolation1-boundedh79extrapolation1.o: boundedh79extrapolation1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo $(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='boundedh79extrapolation1.cc' object='nnc_boundedh79extrapolation1-boundedh79extrapolation1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedh79extrapolation1-boundedh79extrapolation1.o `test -f 'boundedh79extrapolation1.cc' || echo '$(srcdir)/'`boundedh79extrapolation1.cc + +nnc_boundedh79extrapolation1-boundedh79extrapolation1.obj: boundedh79extrapolation1.cc +@am__fastdepCXX_TRUE@ $(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)/boundedh79extrapolation1.cc'; fi` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo $(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='boundedh79extrapolation1.cc' object='nnc_boundedh79extrapolation1-boundedh79extrapolation1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedh79extrapolation1-boundedh79extrapolation1.obj `if test -f 'boundedh79extrapolation1.cc'; then $(CYGPATH_W) 'boundedh79extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedh79extrapolation1.cc'; fi` + +nnc_bounds1-bounds1.o: bounds1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_bounds1-bounds1.Tpo $(DEPDIR)/nnc_bounds1-bounds1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='bounds1.cc' object='nnc_bounds1-bounds1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounds1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bounds1-bounds1.o `test -f 'bounds1.cc' || echo '$(srcdir)/'`bounds1.cc + +nnc_bounds1-bounds1.obj: bounds1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_bounds1-bounds1.Tpo $(DEPDIR)/nnc_bounds1-bounds1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='bounds1.cc' object='nnc_bounds1-bounds1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounds1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bounds1-bounds1.obj `if test -f 'bounds1.cc'; then $(CYGPATH_W) 'bounds1.cc'; else $(CYGPATH_W) '$(srcdir)/bounds1.cc'; fi` + +nnc_concatenate1-concatenate1.o: concatenate1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_concatenate1-concatenate1.Tpo $(DEPDIR)/nnc_concatenate1-concatenate1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='concatenate1.cc' object='nnc_concatenate1-concatenate1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_concatenate1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_concatenate1-concatenate1.o `test -f 'concatenate1.cc' || echo '$(srcdir)/'`concatenate1.cc + +nnc_concatenate1-concatenate1.obj: concatenate1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_concatenate1-concatenate1.Tpo $(DEPDIR)/nnc_concatenate1-concatenate1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='concatenate1.cc' object='nnc_concatenate1-concatenate1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_concatenate1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_concatenate1-concatenate1.obj `if test -f 'concatenate1.cc'; then $(CYGPATH_W) 'concatenate1.cc'; else $(CYGPATH_W) '$(srcdir)/concatenate1.cc'; fi` + +nnc_congruences1-congruences1.o: congruences1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_congruences1-congruences1.Tpo $(DEPDIR)/nnc_congruences1-congruences1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='congruences1.cc' object='nnc_congruences1-congruences1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_congruences1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_congruences1-congruences1.o `test -f 'congruences1.cc' || echo '$(srcdir)/'`congruences1.cc + +nnc_congruences1-congruences1.obj: congruences1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_congruences1-congruences1.Tpo $(DEPDIR)/nnc_congruences1-congruences1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='congruences1.cc' object='nnc_congruences1-congruences1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_congruences1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_congruences1-congruences1.obj `if test -f 'congruences1.cc'; then $(CYGPATH_W) 'congruences1.cc'; else $(CYGPATH_W) '$(srcdir)/congruences1.cc'; fi` + +nnc_constrains1-constrains1.o: constrains1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_constrains1-constrains1.Tpo $(DEPDIR)/nnc_constrains1-constrains1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='constrains1.cc' object='nnc_constrains1-constrains1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(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 +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_constrains1-constrains1.Tpo $(DEPDIR)/nnc_constrains1-constrains1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='constrains1.cc' object='nnc_constrains1-constrains1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(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 +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_constraints1-constraints1.Tpo $(DEPDIR)/nnc_constraints1-constraints1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='constraints1.cc' object='nnc_constraints1-constraints1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_constraints1-constraints1.o `test -f 'constraints1.cc' || echo '$(srcdir)/'`constraints1.cc + +nnc_constraints1-constraints1.obj: constraints1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_constraints1-constraints1.Tpo $(DEPDIR)/nnc_constraints1-constraints1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='constraints1.cc' object='nnc_constraints1-constraints1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_constraints1-constraints1.obj `if test -f 'constraints1.cc'; then $(CYGPATH_W) 'constraints1.cc'; else $(CYGPATH_W) '$(srcdir)/constraints1.cc'; fi` + +nnc_contains1-contains1.o: contains1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_contains1-contains1.Tpo $(DEPDIR)/nnc_contains1-contains1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='contains1.cc' object='nnc_contains1-contains1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_contains1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_contains1-contains1.o `test -f 'contains1.cc' || echo '$(srcdir)/'`contains1.cc + +nnc_contains1-contains1.obj: contains1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_contains1-contains1.Tpo $(DEPDIR)/nnc_contains1-contains1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='contains1.cc' object='nnc_contains1-contains1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_contains1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_contains1-contains1.obj `if test -f 'contains1.cc'; then $(CYGPATH_W) 'contains1.cc'; else $(CYGPATH_W) '$(srcdir)/contains1.cc'; fi` + +nnc_containsintegerpoint1-containsintegerpoint1.o: containsintegerpoint1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_containsintegerpoint1-containsintegerpoint1.Tpo $(DEPDIR)/nnc_containsintegerpoint1-containsintegerpoint1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='containsintegerpoint1.cc' object='nnc_containsintegerpoint1-containsintegerpoint1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(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 +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_containsintegerpoint1-containsintegerpoint1.Tpo $(DEPDIR)/nnc_containsintegerpoint1-containsintegerpoint1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='containsintegerpoint1.cc' object='nnc_containsintegerpoint1-containsintegerpoint1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(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 +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_disjoint1-disjoint1.Tpo $(DEPDIR)/nnc_disjoint1-disjoint1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='disjoint1.cc' object='nnc_disjoint1-disjoint1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_disjoint1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_disjoint1-disjoint1.o `test -f 'disjoint1.cc' || echo '$(srcdir)/'`disjoint1.cc + +nnc_disjoint1-disjoint1.obj: disjoint1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_disjoint1-disjoint1.Tpo $(DEPDIR)/nnc_disjoint1-disjoint1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='disjoint1.cc' object='nnc_disjoint1-disjoint1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_disjoint1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_disjoint1-disjoint1.obj `if test -f 'disjoint1.cc'; then $(CYGPATH_W) 'disjoint1.cc'; else $(CYGPATH_W) '$(srcdir)/disjoint1.cc'; fi` + +nnc_empty1-empty1.o: empty1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_empty1-empty1.Tpo $(DEPDIR)/nnc_empty1-empty1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='empty1.cc' object='nnc_empty1-empty1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_empty1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_empty1-empty1.o `test -f 'empty1.cc' || echo '$(srcdir)/'`empty1.cc + +nnc_empty1-empty1.obj: empty1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_empty1-empty1.Tpo $(DEPDIR)/nnc_empty1-empty1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='empty1.cc' object='nnc_empty1-empty1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_empty1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_empty1-empty1.obj `if test -f 'empty1.cc'; then $(CYGPATH_W) 'empty1.cc'; else $(CYGPATH_W) '$(srcdir)/empty1.cc'; fi` + +nnc_equals1-equals1.o: equals1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_equals1-equals1.Tpo $(DEPDIR)/nnc_equals1-equals1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='equals1.cc' object='nnc_equals1-equals1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_equals1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_equals1-equals1.o `test -f 'equals1.cc' || echo '$(srcdir)/'`equals1.cc + +nnc_equals1-equals1.obj: equals1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_equals1-equals1.Tpo $(DEPDIR)/nnc_equals1-equals1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='equals1.cc' object='nnc_equals1-equals1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_equals1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_equals1-equals1.obj `if test -f 'equals1.cc'; then $(CYGPATH_W) 'equals1.cc'; else $(CYGPATH_W) '$(srcdir)/equals1.cc'; fi` + +nnc_exceptions1-exceptions1.o: exceptions1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_exceptions1-exceptions1.Tpo $(DEPDIR)/nnc_exceptions1-exceptions1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='exceptions1.cc' object='nnc_exceptions1-exceptions1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_exceptions1-exceptions1.o `test -f 'exceptions1.cc' || echo '$(srcdir)/'`exceptions1.cc + +nnc_exceptions1-exceptions1.obj: exceptions1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_exceptions1-exceptions1.Tpo $(DEPDIR)/nnc_exceptions1-exceptions1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='exceptions1.cc' object='nnc_exceptions1-exceptions1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_exceptions1-exceptions1.obj `if test -f 'exceptions1.cc'; then $(CYGPATH_W) 'exceptions1.cc'; else $(CYGPATH_W) '$(srcdir)/exceptions1.cc'; fi` + +nnc_exceptions3-exceptions3.o: exceptions3.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_exceptions3-exceptions3.Tpo $(DEPDIR)/nnc_exceptions3-exceptions3.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='exceptions3.cc' object='nnc_exceptions3-exceptions3.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions3_CXXFLAGS) $(CXXFLAGS) -c -o nnc_exceptions3-exceptions3.o `test -f 'exceptions3.cc' || echo '$(srcdir)/'`exceptions3.cc + +nnc_exceptions3-exceptions3.obj: exceptions3.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_exceptions3-exceptions3.Tpo $(DEPDIR)/nnc_exceptions3-exceptions3.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='exceptions3.cc' object='nnc_exceptions3-exceptions3.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions3_CXXFLAGS) $(CXXFLAGS) -c -o nnc_exceptions3-exceptions3.obj `if test -f 'exceptions3.cc'; then $(CYGPATH_W) 'exceptions3.cc'; else $(CYGPATH_W) '$(srcdir)/exceptions3.cc'; fi` + +nnc_expandspacedim1-expandspacedim1.o: expandspacedim1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo $(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='expandspacedim1.cc' object='nnc_expandspacedim1-expandspacedim1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_expandspacedim1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_expandspacedim1-expandspacedim1.o `test -f 'expandspacedim1.cc' || echo '$(srcdir)/'`expandspacedim1.cc + +nnc_expandspacedim1-expandspacedim1.obj: expandspacedim1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo $(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='expandspacedim1.cc' object='nnc_expandspacedim1-expandspacedim1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_expandspacedim1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_expandspacedim1-expandspacedim1.obj `if test -f 'expandspacedim1.cc'; then $(CYGPATH_W) 'expandspacedim1.cc'; else $(CYGPATH_W) '$(srcdir)/expandspacedim1.cc'; fi` + +nnc_foldspacedims1-foldspacedims1.o: foldspacedims1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo $(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='foldspacedims1.cc' object='nnc_foldspacedims1-foldspacedims1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_foldspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_foldspacedims1-foldspacedims1.o `test -f 'foldspacedims1.cc' || echo '$(srcdir)/'`foldspacedims1.cc + +nnc_foldspacedims1-foldspacedims1.obj: foldspacedims1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo $(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='foldspacedims1.cc' object='nnc_foldspacedims1-foldspacedims1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_foldspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_foldspacedims1-foldspacedims1.obj `if test -f 'foldspacedims1.cc'; then $(CYGPATH_W) 'foldspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/foldspacedims1.cc'; fi` + +nnc_frombdshape1-frombdshape1.o: frombdshape1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_frombdshape1-frombdshape1.Tpo $(DEPDIR)/nnc_frombdshape1-frombdshape1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='frombdshape1.cc' object='nnc_frombdshape1-frombdshape1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(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 +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_frombdshape1-frombdshape1.Tpo $(DEPDIR)/nnc_frombdshape1-frombdshape1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='frombdshape1.cc' object='nnc_frombdshape1-frombdshape1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(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 +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_frombox1-frombox1.Tpo $(DEPDIR)/nnc_frombox1-frombox1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='frombox1.cc' object='nnc_frombox1-frombox1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(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 +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_frombox1-frombox1.Tpo $(DEPDIR)/nnc_frombox1-frombox1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='frombox1.cc' object='nnc_frombox1-frombox1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(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 +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_fromgrid1-fromgrid1.Tpo $(DEPDIR)/nnc_fromgrid1-fromgrid1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='fromgrid1.cc' object='nnc_fromgrid1-fromgrid1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(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 +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_fromgrid1-fromgrid1.Tpo $(DEPDIR)/nnc_fromgrid1-fromgrid1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='fromgrid1.cc' object='nnc_fromgrid1-fromgrid1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(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 +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_fromoctagonalshape1-fromoctagonalshape1.Tpo $(DEPDIR)/nnc_fromoctagonalshape1-fromoctagonalshape1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='fromoctagonalshape1.cc' object='nnc_fromoctagonalshape1-fromoctagonalshape1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(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 +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_fromoctagonalshape1-fromoctagonalshape1.Tpo $(DEPDIR)/nnc_fromoctagonalshape1-fromoctagonalshape1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='fromoctagonalshape1.cc' object='nnc_fromoctagonalshape1-fromoctagonalshape1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(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 +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo $(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='generalizedaffineimage1.cc' object='nnc_generalizedaffineimage1-generalizedaffineimage1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generalizedaffineimage1-generalizedaffineimage1.o `test -f 'generalizedaffineimage1.cc' || echo '$(srcdir)/'`generalizedaffineimage1.cc + +nnc_generalizedaffineimage1-generalizedaffineimage1.obj: generalizedaffineimage1.cc +@am__fastdepCXX_TRUE@ $(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)/generalizedaffineimage1.cc'; fi` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo $(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='generalizedaffineimage1.cc' object='nnc_generalizedaffineimage1-generalizedaffineimage1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generalizedaffineimage1-generalizedaffineimage1.obj `if test -f 'generalizedaffineimage1.cc'; then $(CYGPATH_W) 'generalizedaffineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/generalizedaffineimage1.cc'; fi` + +nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.o: generalizedaffinepreimage1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo $(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='generalizedaffinepreimage1.cc' object='nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.o `test -f 'generalizedaffinepreimage1.cc' || echo '$(srcdir)/'`generalizedaffinepreimage1.cc + +nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.obj: generalizedaffinepreimage1.cc +@am__fastdepCXX_TRUE@ $(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) '$(srcdir)/generalizedaffinepreimage1.cc'; fi` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo $(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='generalizedaffinepreimage1.cc' object='nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.obj `if test -f 'generalizedaffinepreimage1.cc'; then $(CYGPATH_W) 'generalizedaffinepreimage1.cc'; else $(CYGPATH_W) '$(srcdir)/generalizedaffinepreimage1.cc'; fi` + +nnc_generators1-generators1.o: generators1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_generators1-generators1.Tpo $(DEPDIR)/nnc_generators1-generators1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='generators1.cc' object='nnc_generators1-generators1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generators1-generators1.o `test -f 'generators1.cc' || echo '$(srcdir)/'`generators1.cc + +nnc_generators1-generators1.obj: generators1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_generators1-generators1.Tpo $(DEPDIR)/nnc_generators1-generators1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='generators1.cc' object='nnc_generators1-generators1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generators1-generators1.obj `if test -f 'generators1.cc'; then $(CYGPATH_W) 'generators1.cc'; else $(CYGPATH_W) '$(srcdir)/generators1.cc'; fi` + +nnc_geomcovers1-geomcovers1.o: geomcovers1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo $(DEPDIR)/nnc_geomcovers1-geomcovers1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='geomcovers1.cc' object='nnc_geomcovers1-geomcovers1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_geomcovers1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_geomcovers1-geomcovers1.o `test -f 'geomcovers1.cc' || echo '$(srcdir)/'`geomcovers1.cc + +nnc_geomcovers1-geomcovers1.obj: geomcovers1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo $(DEPDIR)/nnc_geomcovers1-geomcovers1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='geomcovers1.cc' object='nnc_geomcovers1-geomcovers1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_geomcovers1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_geomcovers1-geomcovers1.obj `if test -f 'geomcovers1.cc'; then $(CYGPATH_W) 'geomcovers1.cc'; else $(CYGPATH_W) '$(srcdir)/geomcovers1.cc'; fi` + +nnc_h79widening1-h79widening1.o: h79widening1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_h79widening1-h79widening1.Tpo $(DEPDIR)/nnc_h79widening1-h79widening1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='h79widening1.cc' object='nnc_h79widening1-h79widening1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_h79widening1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_h79widening1-h79widening1.o `test -f 'h79widening1.cc' || echo '$(srcdir)/'`h79widening1.cc + +nnc_h79widening1-h79widening1.obj: h79widening1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_h79widening1-h79widening1.Tpo $(DEPDIR)/nnc_h79widening1-h79widening1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='h79widening1.cc' object='nnc_h79widening1-h79widening1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_h79widening1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_h79widening1-h79widening1.obj `if test -f 'h79widening1.cc'; then $(CYGPATH_W) 'h79widening1.cc'; else $(CYGPATH_W) '$(srcdir)/h79widening1.cc'; fi` + +nnc_intersection1-intersection1.o: intersection1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_intersection1-intersection1.Tpo $(DEPDIR)/nnc_intersection1-intersection1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='intersection1.cc' object='nnc_intersection1-intersection1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_intersection1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_intersection1-intersection1.o `test -f 'intersection1.cc' || echo '$(srcdir)/'`intersection1.cc + +nnc_intersection1-intersection1.obj: intersection1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_intersection1-intersection1.Tpo $(DEPDIR)/nnc_intersection1-intersection1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='intersection1.cc' object='nnc_intersection1-intersection1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_intersection1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_intersection1-intersection1.obj `if test -f 'intersection1.cc'; then $(CYGPATH_W) 'intersection1.cc'; else $(CYGPATH_W) '$(srcdir)/intersection1.cc'; fi` + +nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.o: limitedbhrz03extrapolation1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo $(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='limitedbhrz03extrapolation1.cc' object='nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedbhrz03extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.o `test -f 'limitedbhrz03extrapolation1.cc' || echo '$(srcdir)/'`limitedbhrz03extrapolation1.cc + +nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.obj: limitedbhrz03extrapolation1.cc +@am__fastdepCXX_TRUE@ $(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 $(CYGPATH_W) '$(srcdir)/limitedbhrz03extrapolation1.cc'; fi` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo $(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='limitedbhrz03extrapolation1.cc' object='nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedbhrz03extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.obj `if test -f 'limitedbhrz03extrapolation1.cc'; then $(CYGPATH_W) 'limitedbhrz03extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/limitedbhrz03extrapolation1.cc'; fi` + +nnc_limitedh79extrapolation1-limitedh79extrapolation1.o: limitedh79extrapolation1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo $(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='limitedh79extrapolation1.cc' object='nnc_limitedh79extrapolation1-limitedh79extrapolation1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_limitedh79extrapolation1-limitedh79extrapolation1.o `test -f 'limitedh79extrapolation1.cc' || echo '$(srcdir)/'`limitedh79extrapolation1.cc + +nnc_limitedh79extrapolation1-limitedh79extrapolation1.obj: limitedh79extrapolation1.cc +@am__fastdepCXX_TRUE@ $(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)/limitedh79extrapolation1.cc'; fi` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo $(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='limitedh79extrapolation1.cc' object='nnc_limitedh79extrapolation1-limitedh79extrapolation1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_limitedh79extrapolation1-limitedh79extrapolation1.obj `if test -f 'limitedh79extrapolation1.cc'; then $(CYGPATH_W) 'limitedh79extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/limitedh79extrapolation1.cc'; fi` + +nnc_linearpartition1-linearpartition1.o: linearpartition1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo $(DEPDIR)/nnc_linearpartition1-linearpartition1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='linearpartition1.cc' object='nnc_linearpartition1-linearpartition1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_linearpartition1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_linearpartition1-linearpartition1.o `test -f 'linearpartition1.cc' || echo '$(srcdir)/'`linearpartition1.cc + +nnc_linearpartition1-linearpartition1.obj: linearpartition1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo $(DEPDIR)/nnc_linearpartition1-linearpartition1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='linearpartition1.cc' object='nnc_linearpartition1-linearpartition1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_linearpartition1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_linearpartition1-linearpartition1.obj `if test -f 'linearpartition1.cc'; then $(CYGPATH_W) 'linearpartition1.cc'; else $(CYGPATH_W) '$(srcdir)/linearpartition1.cc'; fi` + +nnc_mapspacedims1-mapspacedims1.o: mapspacedims1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo $(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mapspacedims1.cc' object='nnc_mapspacedims1-mapspacedims1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mapspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mapspacedims1-mapspacedims1.o `test -f 'mapspacedims1.cc' || echo '$(srcdir)/'`mapspacedims1.cc + +nnc_mapspacedims1-mapspacedims1.obj: mapspacedims1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo $(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mapspacedims1.cc' object='nnc_mapspacedims1-mapspacedims1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mapspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mapspacedims1-mapspacedims1.obj `if test -f 'mapspacedims1.cc'; then $(CYGPATH_W) 'mapspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/mapspacedims1.cc'; fi` + +nnc_max_min1-max_min1.o: max_min1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_max_min1-max_min1.Tpo $(DEPDIR)/nnc_max_min1-max_min1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='max_min1.cc' object='nnc_max_min1-max_min1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_max_min1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_max_min1-max_min1.o `test -f 'max_min1.cc' || echo '$(srcdir)/'`max_min1.cc + +nnc_max_min1-max_min1.obj: max_min1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_max_min1-max_min1.Tpo $(DEPDIR)/nnc_max_min1-max_min1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='max_min1.cc' object='nnc_max_min1-max_min1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_max_min1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_max_min1-max_min1.obj `if test -f 'max_min1.cc'; then $(CYGPATH_W) 'max_min1.cc'; else $(CYGPATH_W) '$(srcdir)/max_min1.cc'; fi` + +nnc_mc91-mc91.o: mc91.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_mc91-mc91.Tpo $(DEPDIR)/nnc_mc91-mc91.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mc91.cc' object='nnc_mc91-mc91.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mc91_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mc91-mc91.o `test -f 'mc91.cc' || echo '$(srcdir)/'`mc91.cc + +nnc_mc91-mc91.obj: mc91.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_mc91-mc91.Tpo $(DEPDIR)/nnc_mc91-mc91.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mc91.cc' object='nnc_mc91-mc91.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mc91_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mc91-mc91.obj `if test -f 'mc91.cc'; then $(CYGPATH_W) 'mc91.cc'; else $(CYGPATH_W) '$(srcdir)/mc91.cc'; fi` + +nnc_membytes1-membytes1.o: membytes1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_membytes1-membytes1.Tpo $(DEPDIR)/nnc_membytes1-membytes1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='membytes1.cc' object='nnc_membytes1-membytes1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_membytes1-membytes1.o `test -f 'membytes1.cc' || echo '$(srcdir)/'`membytes1.cc + +nnc_membytes1-membytes1.obj: membytes1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_membytes1-membytes1.Tpo $(DEPDIR)/nnc_membytes1-membytes1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='membytes1.cc' object='nnc_membytes1-membytes1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_membytes1-membytes1.obj `if test -f 'membytes1.cc'; then $(CYGPATH_W) 'membytes1.cc'; else $(CYGPATH_W) '$(srcdir)/membytes1.cc'; fi` + +nnc_minconstraints1-minconstraints1.o: minconstraints1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo $(DEPDIR)/nnc_minconstraints1-minconstraints1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='minconstraints1.cc' object='nnc_minconstraints1-minconstraints1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_minconstraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_minconstraints1-minconstraints1.o `test -f 'minconstraints1.cc' || echo '$(srcdir)/'`minconstraints1.cc + +nnc_minconstraints1-minconstraints1.obj: minconstraints1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo $(DEPDIR)/nnc_minconstraints1-minconstraints1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='minconstraints1.cc' object='nnc_minconstraints1-minconstraints1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_minconstraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_minconstraints1-minconstraints1.obj `if test -f 'minconstraints1.cc'; then $(CYGPATH_W) 'minconstraints1.cc'; else $(CYGPATH_W) '$(srcdir)/minconstraints1.cc'; fi` + +nnc_mingenerators1-mingenerators1.o: mingenerators1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo $(DEPDIR)/nnc_mingenerators1-mingenerators1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mingenerators1.cc' object='nnc_mingenerators1-mingenerators1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mingenerators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mingenerators1-mingenerators1.o `test -f 'mingenerators1.cc' || echo '$(srcdir)/'`mingenerators1.cc + +nnc_mingenerators1-mingenerators1.obj: mingenerators1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo $(DEPDIR)/nnc_mingenerators1-mingenerators1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mingenerators1.cc' object='nnc_mingenerators1-mingenerators1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mingenerators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mingenerators1-mingenerators1.obj `if test -f 'mingenerators1.cc'; then $(CYGPATH_W) 'mingenerators1.cc'; else $(CYGPATH_W) '$(srcdir)/mingenerators1.cc'; fi` + +nnc_onepoint-onepoint.o: onepoint.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_onepoint-onepoint.Tpo $(DEPDIR)/nnc_onepoint-onepoint.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='onepoint.cc' object='nnc_onepoint-onepoint.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_onepoint_CXXFLAGS) $(CXXFLAGS) -c -o nnc_onepoint-onepoint.o `test -f 'onepoint.cc' || echo '$(srcdir)/'`onepoint.cc + +nnc_onepoint-onepoint.obj: onepoint.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_onepoint-onepoint.Tpo $(DEPDIR)/nnc_onepoint-onepoint.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='onepoint.cc' object='nnc_onepoint-onepoint.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_onepoint_CXXFLAGS) $(CXXFLAGS) -c -o nnc_onepoint-onepoint.obj `if test -f 'onepoint.cc'; then $(CYGPATH_W) 'onepoint.cc'; else $(CYGPATH_W) '$(srcdir)/onepoint.cc'; fi` + +nnc_permute-permute.o: permute.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_permute-permute.Tpo $(DEPDIR)/nnc_permute-permute.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='permute.cc' object='nnc_permute-permute.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_permute_CXXFLAGS) $(CXXFLAGS) -c -o nnc_permute-permute.o `test -f 'permute.cc' || echo '$(srcdir)/'`permute.cc + +nnc_permute-permute.obj: permute.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_permute-permute.Tpo $(DEPDIR)/nnc_permute-permute.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='permute.cc' object='nnc_permute-permute.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_permute_CXXFLAGS) $(CXXFLAGS) -c -o nnc_permute-permute.obj `if test -f 'permute.cc'; then $(CYGPATH_W) 'permute.cc'; else $(CYGPATH_W) '$(srcdir)/permute.cc'; fi` + +nnc_polydifference1-polydifference1.o: polydifference1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_polydifference1-polydifference1.Tpo $(DEPDIR)/nnc_polydifference1-polydifference1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='polydifference1.cc' object='nnc_polydifference1-polydifference1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polydifference1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_polydifference1-polydifference1.o `test -f 'polydifference1.cc' || echo '$(srcdir)/'`polydifference1.cc + +nnc_polydifference1-polydifference1.obj: polydifference1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_polydifference1-polydifference1.Tpo $(DEPDIR)/nnc_polydifference1-polydifference1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='polydifference1.cc' object='nnc_polydifference1-polydifference1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polydifference1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_polydifference1-polydifference1.obj `if test -f 'polydifference1.cc'; then $(CYGPATH_W) 'polydifference1.cc'; else $(CYGPATH_W) '$(srcdir)/polydifference1.cc'; fi` + +nnc_polyhull1-polyhull1.o: polyhull1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_polyhull1-polyhull1.Tpo $(DEPDIR)/nnc_polyhull1-polyhull1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='polyhull1.cc' object='nnc_polyhull1-polyhull1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhull1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_polyhull1-polyhull1.o `test -f 'polyhull1.cc' || echo '$(srcdir)/'`polyhull1.cc + +nnc_polyhull1-polyhull1.obj: polyhull1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_polyhull1-polyhull1.Tpo $(DEPDIR)/nnc_polyhull1-polyhull1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='polyhull1.cc' object='nnc_polyhull1-polyhull1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhull1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_polyhull1-polyhull1.obj `if test -f 'polyhull1.cc'; then $(CYGPATH_W) 'polyhull1.cc'; else $(CYGPATH_W) '$(srcdir)/polyhull1.cc'; fi` + +nnc_polyhullifexact1-polyhullifexact1.o: polyhullifexact1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_polyhullifexact1-polyhullifexact1.Tpo $(DEPDIR)/nnc_polyhullifexact1-polyhullifexact1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='polyhullifexact1.cc' object='nnc_polyhullifexact1-polyhullifexact1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(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 +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_polyhullifexact1-polyhullifexact1.Tpo $(DEPDIR)/nnc_polyhullifexact1-polyhullifexact1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='polyhullifexact1.cc' object='nnc_polyhullifexact1-polyhullifexact1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(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 +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_randphull1-randphull1.Tpo $(DEPDIR)/nnc_randphull1-randphull1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='randphull1.cc' object='nnc_randphull1-randphull1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_randphull1-randphull1.o `test -f 'randphull1.cc' || echo '$(srcdir)/'`randphull1.cc + +nnc_randphull1-randphull1.obj: randphull1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_randphull1-randphull1.Tpo $(DEPDIR)/nnc_randphull1-randphull1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='randphull1.cc' object='nnc_randphull1-randphull1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_randphull1-randphull1.obj `if test -f 'randphull1.cc'; then $(CYGPATH_W) 'randphull1.cc'; else $(CYGPATH_W) '$(srcdir)/randphull1.cc'; fi` + +nnc_relations1-relations1.o: relations1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_relations1-relations1.Tpo $(DEPDIR)/nnc_relations1-relations1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='relations1.cc' object='nnc_relations1-relations1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_relations1-relations1.o `test -f 'relations1.cc' || echo '$(srcdir)/'`relations1.cc + +nnc_relations1-relations1.obj: relations1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_relations1-relations1.Tpo $(DEPDIR)/nnc_relations1-relations1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='relations1.cc' object='nnc_relations1-relations1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_relations1-relations1.obj `if test -f 'relations1.cc'; then $(CYGPATH_W) 'relations1.cc'; else $(CYGPATH_W) '$(srcdir)/relations1.cc'; fi` + +nnc_relations2-relations2.o: relations2.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_relations2-relations2.Tpo $(DEPDIR)/nnc_relations2-relations2.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='relations2.cc' object='nnc_relations2-relations2.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_relations2-relations2.o `test -f 'relations2.cc' || echo '$(srcdir)/'`relations2.cc + +nnc_relations2-relations2.obj: relations2.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_relations2-relations2.Tpo $(DEPDIR)/nnc_relations2-relations2.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='relations2.cc' object='nnc_relations2-relations2.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_relations2-relations2.obj `if test -f 'relations2.cc'; then $(CYGPATH_W) 'relations2.cc'; else $(CYGPATH_W) '$(srcdir)/relations2.cc'; fi` + +nnc_removespacedims1-removespacedims1.o: removespacedims1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo $(DEPDIR)/nnc_removespacedims1-removespacedims1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='removespacedims1.cc' object='nnc_removespacedims1-removespacedims1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_removespacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_removespacedims1-removespacedims1.o `test -f 'removespacedims1.cc' || echo '$(srcdir)/'`removespacedims1.cc + +nnc_removespacedims1-removespacedims1.obj: removespacedims1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo $(DEPDIR)/nnc_removespacedims1-removespacedims1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='removespacedims1.cc' object='nnc_removespacedims1-removespacedims1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_removespacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_removespacedims1-removespacedims1.obj `if test -f 'removespacedims1.cc'; then $(CYGPATH_W) 'removespacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/removespacedims1.cc'; fi` + +nnc_simplifyusingcontext1-simplifyusingcontext1.o: simplifyusingcontext1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_simplifyusingcontext1-simplifyusingcontext1.Tpo $(DEPDIR)/nnc_simplifyusingcontext1-simplifyusingcontext1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='simplifyusingcontext1.cc' object='nnc_simplifyusingcontext1-simplifyusingcontext1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(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 +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_simplifyusingcontext1-simplifyusingcontext1.Tpo $(DEPDIR)/nnc_simplifyusingcontext1-simplifyusingcontext1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='simplifyusingcontext1.cc' object='nnc_simplifyusingcontext1-simplifyusingcontext1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(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 +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_smm1-smm1.Tpo $(DEPDIR)/nnc_smm1-smm1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='smm1.cc' object='nnc_smm1-smm1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_smm1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_smm1-smm1.o `test -f 'smm1.cc' || echo '$(srcdir)/'`smm1.cc + +nnc_smm1-smm1.obj: smm1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_smm1-smm1.Tpo $(DEPDIR)/nnc_smm1-smm1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='smm1.cc' object='nnc_smm1-smm1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_smm1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_smm1-smm1.obj `if test -f 'smm1.cc'; then $(CYGPATH_W) 'smm1.cc'; else $(CYGPATH_W) '$(srcdir)/smm1.cc'; fi` + +nnc_timeelapse1-timeelapse1.o: timeelapse1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo $(DEPDIR)/nnc_timeelapse1-timeelapse1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='timeelapse1.cc' object='nnc_timeelapse1-timeelapse1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_timeelapse1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_timeelapse1-timeelapse1.o `test -f 'timeelapse1.cc' || echo '$(srcdir)/'`timeelapse1.cc + +nnc_timeelapse1-timeelapse1.obj: timeelapse1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo $(DEPDIR)/nnc_timeelapse1-timeelapse1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='timeelapse1.cc' object='nnc_timeelapse1-timeelapse1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_timeelapse1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_timeelapse1-timeelapse1.obj `if test -f 'timeelapse1.cc'; then $(CYGPATH_W) 'timeelapse1.cc'; else $(CYGPATH_W) '$(srcdir)/timeelapse1.cc'; fi` + +nnc_unconstrain1-unconstrain1.o: unconstrain1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_unconstrain1-unconstrain1.Tpo $(DEPDIR)/nnc_unconstrain1-unconstrain1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='unconstrain1.cc' object='nnc_unconstrain1-unconstrain1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(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 +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_unconstrain1-unconstrain1.Tpo $(DEPDIR)/nnc_unconstrain1-unconstrain1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='unconstrain1.cc' object='nnc_unconstrain1-unconstrain1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(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 +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_universe1-universe1.Tpo $(DEPDIR)/nnc_universe1-universe1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='universe1.cc' object='nnc_universe1-universe1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_universe1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_universe1-universe1.o `test -f 'universe1.cc' || echo '$(srcdir)/'`universe1.cc + +nnc_universe1-universe1.obj: universe1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_universe1-universe1.Tpo $(DEPDIR)/nnc_universe1-universe1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='universe1.cc' object='nnc_universe1-universe1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_universe1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_universe1-universe1.obj `if test -f 'universe1.cc'; then $(CYGPATH_W) 'universe1.cc'; else $(CYGPATH_W) '$(srcdir)/universe1.cc'; fi` + +nnc_writepolyhedron1-writepolyhedron1.o: writepolyhedron1.cc +@am__fastdepCXX_TRUE@ $(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 +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo $(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='writepolyhedron1.cc' object='nnc_writepolyhedron1-writepolyhedron1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_writepolyhedron1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_writepolyhedron1-writepolyhedron1.o `test -f 'writepolyhedron1.cc' || echo '$(srcdir)/'`writepolyhedron1.cc + +nnc_writepolyhedron1-writepolyhedron1.obj: writepolyhedron1.cc +@am__fastdepCXX_TRUE@ $(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` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo $(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='writepolyhedron1.cc' object='nnc_writepolyhedron1-writepolyhedron1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_writepolyhedron1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_writepolyhedron1-writepolyhedron1.obj `if test -f 'writepolyhedron1.cc'; then $(CYGPATH_W) 'writepolyhedron1.cc'; else $(CYGPATH_W) '$(srcdir)/writepolyhedron1.cc'; fi` + +watchdog1-watchdog1.o: watchdog1.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(watchdog1_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT watchdog1-watchdog1.o -MD -MP -MF $(DEPDIR)/watchdog1-watchdog1.Tpo -c -o watchdog1-watchdog1.o `test -f 'watchdog1.cc' || echo '$(srcdir)/'`watchdog1.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/watchdog1-watchdog1.Tpo $(DEPDIR)/watchdog1-watchdog1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='watchdog1.cc' object='watchdog1-watchdog1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(watchdog1_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o watchdog1-watchdog1.o `test -f 'watchdog1.cc' || echo '$(srcdir)/'`watchdog1.cc + +watchdog1-watchdog1.obj: watchdog1.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(watchdog1_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT watchdog1-watchdog1.obj -MD -MP -MF $(DEPDIR)/watchdog1-watchdog1.Tpo -c -o watchdog1-watchdog1.obj `if test -f 'watchdog1.cc'; then $(CYGPATH_W) 'watchdog1.cc'; else $(CYGPATH_W) '$(srcdir)/watchdog1.cc'; fi` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/watchdog1-watchdog1.Tpo $(DEPDIR)/watchdog1-watchdog1.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='watchdog1.cc' object='watchdog1-watchdog1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(watchdog1_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o watchdog1-watchdog1.obj `if test -f 'watchdog1.cc'; then $(CYGPATH_W) 'watchdog1.cc'; else $(CYGPATH_W) '$(srcdir)/watchdog1.cc'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; ws='[ ]'; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *$$ws$$tst$$ws*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + echo "XPASS: $$tst"; \ + ;; \ + *) \ + echo "PASS: $$tst"; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *$$ws$$tst$$ws*) \ + xfail=`expr $$xfail + 1`; \ + echo "XFAIL: $$tst"; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + echo "FAIL: $$tst"; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + echo "SKIP: $$tst"; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all tests failed"; \ + else \ + banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + skipped="($$skip tests were not run)"; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + test -z "$$skipped" || echo "$$skipped"; \ + test -z "$$report" || echo "$$report"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0; \ + else :; fi + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +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 + +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 all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool ctags \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-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 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 + +$(top_builddir)/Watchdog/src/libpwl.la: + $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/Watchdog/src libpwl.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..d376b1d --- /dev/null +++ b/tests/Polyhedron/addcongruence1.cc @@ -0,0 +1,230 @@ +/* Test Polyhedron::add_congruence(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.add_congruence(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); + bool b = ph.add_congruence_and_minimize((B == 5) / 0); + + 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); + bool b = ph.add_congruence_and_minimize((A == -1) / 0); + + 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); + bool b = ph.add_congruence_and_minimize((Linear_Expression(0) %= 1) / 2); + + 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); + + bool b = + ph.add_congruence_and_minimize((Linear_Expression::zero() %= 0) / 2); + + 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 ***"); + + bool b = + ph.add_congruence_and_minimize((Linear_Expression::zero() %= 1) / 0); + + 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..5377a5a --- /dev/null +++ b/tests/Polyhedron/addcongruences1.cc @@ -0,0 +1,250 @@ +/* Test Polyhedron::add_congruences(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + Generator_System gs; + gs.insert(point()); + gs.insert(ray(x)); + gs.insert(ray(x + y)); + + Congruence_System cgs; + cgs.insert(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_and_minimize(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_and_minimize(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..61b1520 --- /dev/null +++ b/tests/Polyhedron/addconstraint1.cc @@ -0,0 +1,106 @@ +/* Test Polyhedron::add_constraint(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + NNC_Polyhedron ph1(2); + ph1.add_constraint(A >= 0); + ph1.add_constraint(B == 5); + + print_constraints(ph1, "*** ph1 ***"); + + C_Polyhedron ph2(2); + for (Constraint_System::const_iterator i = ph1.constraints().begin(), + cs_end = ph1.constraints().end(); i != cs_end; ++i) + ph2.add_constraint(*i); + + C_Polyhedron known_result(2); + known_result.add_constraint(A >= 0); + known_result.add_constraint(B == 5); + + bool ok = (ph2 == known_result); + + print_constraints(ph2, "*** ph2 ***"); + + return ok; +} + +bool +test02() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2, EMPTY); + + print_constraints(ph, "*** ph ***"); + + C_Polyhedron known_result(ph); + + ph.add_constraint(A == B); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** after ph.add_constraint(A == B) ***"); + + return ok; +} + +bool +test03() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.add_constraint(A >= 0); + ph.add_constraint(A <= 2); + ph.add_constraint(A >= -1); + + print_constraints(ph, "*** ph ***"); + + ph.add_constraint_and_minimize(B >= 1); + + C_Polyhedron known_result(2); + known_result.add_constraint(A >= 0); + known_result.add_constraint(A <= 2); + known_result.add_constraint(B >= 1); + + bool ok = (ph == known_result); + + print_constraints(ph, + "*** after ph.add_constraint_and_minimize(B >= 1) ***"); + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); +END_MAIN diff --git a/tests/Polyhedron/addconstraints1.cc b/tests/Polyhedron/addconstraints1.cc new file mode 100644 index 0000000..5c3d4ce --- /dev/null +++ b/tests/Polyhedron/addconstraints1.cc @@ -0,0 +1,363 @@ +/* Test Polyhedron::add_constrains(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + // For const-correctness, making a copy is required. + Constraint_System cs1 = Constraint_System::zero_dim_empty(); + C_Polyhedron ph1; + ph1.add_constraints_and_minimize(cs1); + + Constraint_System cs2; + cs2.insert(Linear_Expression::zero() >= 7); + C_Polyhedron ph2; + ph2.add_constraints_and_minimize(cs2); + + Constraint_System cs3; + cs3.insert(Linear_Expression::zero() >= -3); + C_Polyhedron ph3; + ph3.add_constraints_and_minimize(cs3); + + C_Polyhedron empty_result(0, EMPTY); + C_Polyhedron univ_result; + + bool ok = (ph1 == empty_result + && ph2 == empty_result + && ph3 == univ_result); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + print_constraints(ph3, "*** ph3 ***"); + print_constraints(empty_result, "*** empty_result ***"); + print_constraints(univ_result, "*** univ_result ***"); + + return ok; +} + +bool +test02() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.add_constraint(A >= 0); + ph.add_constraint(B >= 0); + + Constraint_System cs; + + print_constraints(ph, "*** ph ***"); + print_constraints(cs, "*** cs ***"); + + C_Polyhedron known_result(ph); + + ph.add_constraints(cs); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** ph ***"); + + return ok; +} + +bool +test03() { + Variable x(0); + Variable y(1); + + Constraint_System cs1; + cs1.insert(x + y >= 0); + C_Polyhedron ph(cs1); + + print_constraints(ph, "*** ph ***"); + + Linear_Expression e(1); + Constraint_System cs2; + cs2.insert(e == 0); + ph.add_constraints(cs2); + + C_Polyhedron known_result(2, EMPTY); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** after ph.add_constraints(cs2) ***"); + + return ok; +} + +bool +test04() { + Variable x(0); + + C_Polyhedron ph(3); + ph.add_constraint(x >= 1); + + print_constraints(ph, "*** ph ***"); + + Constraint_System cs; + + C_Polyhedron computed_result(ph); + + computed_result.add_constraints_and_minimize(cs); + + bool ok = (computed_result == ph); + + print_constraints(computed_result, + "*** after add_constraints_and_minimize ***"); + + return ok; +} + +bool +test05() { + Variable x(0); + + C_Polyhedron ph(3, EMPTY); + + Constraint_System cs; + cs.insert(x >= 4); + + print_constraints(ph, "*** ph ***"); + print_constraints(cs, "*** cs ***"); + + ph.add_constraints_and_minimize(cs); + + C_Polyhedron computed_result(3, EMPTY); + + bool ok = (ph == computed_result); + + print_constraints(ph, "*** after add_constraints_and_minimize(cs) ***"); + + return ok; +} + +bool +test06() { + Variable x(0); + Variable y(1); + + C_Polyhedron ph(3); + + Constraint_System cs; + cs.insert(x >= 4); + cs.insert(x - y >= 0); + + print_constraints(ph, "*** ph ***"); + print_constraints(cs, "*** cs ***"); + + ph.add_constraints_and_minimize(cs); + + C_Polyhedron known_result(3); + known_result.add_constraint(x >= 4); + known_result.add_constraint(x - y >= 0); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** after add_constraints_and_minimize(cs) ***"); + + return ok; +} + +bool +test07() { + Variable x(0); + Variable y(1); + + C_Polyhedron ph(3); + ph.add_constraint(y >= 1); + + Constraint_System cs; + cs.insert(x >= 0); + cs.insert(y <= 0); + + print_constraints(ph, "*** ph ***"); + print_constraints(cs, "*** cs ***"); + + ph.add_constraints_and_minimize(cs); + + C_Polyhedron known_result(3, EMPTY); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** after add_constraints_and_minimize(cs) ***"); + + return ok; +} + +bool +test08() { + C_Polyhedron ph; + ph.add_constraint(Linear_Expression(-2) >= 0); + + Constraint_System cs; + cs.insert(Linear_Expression(-1) >= 0); + + print_constraints(ph, "*** ph ***"); + print_constraints(cs, "*** cs ***"); + + ph.add_constraints(cs); + + C_Polyhedron known_result(0, EMPTY); + + bool ok = (known_result == ph); + + print_constraints(ph, "*** after add_constraints ***"); + + return ok; +} + +bool +test09() { + Variable x(0); + Variable y(1); + + Generator_System gs; + gs.insert(point()); + gs.insert(ray(x)); + gs.insert(ray(x + y)); + + C_Polyhedron ph(gs); + + Constraint_System cs; + cs.insert(x <= 3); + + print_generators(ph, "*** ph ***"); + print_constraints(cs, "*** cs ***"); + + ph.add_constraints(cs); + + C_Polyhedron known_result(2); + known_result.add_constraint(y >= 0); + known_result.add_constraint(x - y >= 0); + known_result.add_constraint(x <= 3); + + bool ok = (known_result == ph); + + print_constraints(ph, "*** after add_constraints ***"); + + return ok; +} + +bool +test10() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1(2, EMPTY); + + Constraint_System cs; + cs.insert(A - B >= 0); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(cs, "*** cs ***"); + + ph1.add_constraints(cs); + + C_Polyhedron known_result(2, EMPTY); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after ph1.add_constraints(cs) ***"); + + return ok; +} + +bool +test11() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.generators(); + ph.add_constraint(A >= 0); + C_Polyhedron copy_ph(ph); + + Constraint_System cs1; + cs1.insert(A == 0); + cs1.insert(B >= 0); + Constraint_System cs2(cs1); + + ph.add_constraints(cs1); + copy_ph.add_constraints_and_minimize(cs2); + + bool ok = (ph == copy_ph); + + print_constraints(ph, "*** after ph.add_constraints(cs1) ***"); + print_constraints(ph, + "*** after copy_ph.add_constraints_and_minimize(cs2) ***"); + return ok; +} + +bool +test12() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1(2, EMPTY); + ph1.add_generator(point()); + ph1.constraints(); + ph1.add_generator(line(A + B)); + C_Polyhedron copy_ph1 = ph1; + + C_Polyhedron ph2(2, EMPTY); + ph2.add_generator(point()); + ph2.constraints(); + ph2.add_generator(ray(A)); + ph2.add_generator(ray(B)); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + Constraint_System cs1 = ph2.constraints(); + Constraint_System cs2 = ph2.constraints(); + + ph1.add_constraints(cs1); + copy_ph1.add_constraints_and_minimize(cs2); + + bool ok = (ph1 == copy_ph1); + + print_constraints(ph1, "*** after add_constraints_assign ***"); + print_constraints(copy_ph1, + "*** after add_constraints_and_minimize ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + DO_TEST(test06); + DO_TEST(test07); + DO_TEST(test08); + DO_TEST(test09); + DO_TEST(test10); + DO_TEST(test11); + DO_TEST(test12); +END_MAIN diff --git a/tests/Polyhedron/addconstraints2.cc b/tests/Polyhedron/addconstraints2.cc new file mode 100644 index 0000000..6d4800d --- /dev/null +++ b/tests/Polyhedron/addconstraints2.cc @@ -0,0 +1,93 @@ +/* Test Polyhedron::add_constrains(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1(2); + ph1.add_constraint(A - B >= 0); + ph1.add_constraint(B >= 0); + + NNC_Polyhedron ph2(1); + ph2.add_constraint(A == 0); + + Constraint_System cs = ph2.constraints(); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(cs, "*** cs ***"); + + ph1.add_constraints_and_minimize(cs); + + C_Polyhedron known_result(2); + known_result.add_constraint(A == 0); + known_result.add_constraint(B == 0); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after ph1.add_constraints_and_minimize(cs) ***"); + + return ok; +} + +bool +test02() { + Variable A(0); + Variable B(1); + + NNC_Polyhedron ph1(2); + ph1.add_constraint(A >= 0); + ph1.add_constraint(B >= 0); + + Constraint_System cs = ph1.constraints(); + + C_Polyhedron ph2(3); + ph2.add_constraint(A <= 2); + + print_constraints(cs, "*** cs ***"); + print_constraints(ph2, "*** ph2 ***"); + + ph2.add_constraints_and_minimize(cs); + + C_Polyhedron known_result(3); + known_result.add_constraint(A >= 0); + known_result.add_constraint(A <= 2); + known_result.add_constraint(B >= 0); + + bool ok = (ph2 == known_result); + + print_constraints(ph2, "*** ph2 ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); +END_MAIN diff --git a/tests/Polyhedron/addgenerator1.cc b/tests/Polyhedron/addgenerator1.cc new file mode 100644 index 0000000..58fc971 --- /dev/null +++ b/tests/Polyhedron/addgenerator1.cc @@ -0,0 +1,118 @@ +/* Test Polyhedron::add_generator(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + Generator_System gs; + gs.insert(point()); + gs.insert(point(A + 2*B)); + gs.insert(point(A + B)); + gs.insert(point(2*A + 2*B)); + C_Polyhedron ph(gs); + + print_generators(ph, "*** ph ***"); + + ph.add_generator_and_minimize(ray(A)); + + Generator_System known_gs; + known_gs.insert(point()); + known_gs.insert(point(A + 2*B)); + known_gs.insert(ray(A)); + C_Polyhedron known_result(known_gs); + + bool ok = (ph == known_result); + + print_generators(ph, + "*** after ph.add_generator_and_minimize(ray(A)) ***"); + + return ok; +} + +bool +test02() { + Variable A(0); + Variable B(1); + Variable C(2); + + C_Polyhedron ph_empty(2, EMPTY); + Generator_System gs1 = ph_empty.generators(); + assert(gs1.space_dimension() == ph_empty.space_dimension()); + + gs1.insert(point()); + gs1.insert(ray(A)); + C_Polyhedron ph1(gs1); + + print_generators(ph1, "*** ph1 ***"); + + C_Polyhedron known_result1(2); + known_result1.add_constraint(A >= 0); + known_result1.add_constraint(B == 0); + + Generator_System gs2 = ph_empty.generators(); + assert(gs2.space_dimension() == ph_empty.space_dimension()); + + gs2.insert(point(C)); + gs2.insert(line(C)); + gs2.insert(ray(A)); + C_Polyhedron ph2(gs2); + + print_generators(ph2, "*** ph2 ***"); + + C_Polyhedron known_result2(3); + known_result2.add_constraint(A >= 0); + known_result2.add_constraint(B == 0); + + bool ok = (ph1 == known_result1 && ph2 == known_result2); + + return ok; +} + +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..656f07c --- /dev/null +++ b/tests/Polyhedron/addgenerator2.cc @@ -0,0 +1,129 @@ +/* Test Polyhedron::add_generator(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + Generator_System gs; + gs.insert(point()); + gs.insert(ray(A)); + gs.insert(line(B)); + NNC_Polyhedron ph1(gs); + + print_generators(ph1, "*** ph1 ***"); + + C_Polyhedron ph2(2, EMPTY); + ph2.add_generator(point(-A)); + + print_generators(ph2, "*** ph2 ***"); + + const Generator_System& gs1 = ph1.minimized_generators(); + for (Generator_System::const_iterator i = gs1.begin(), + gs1_end = gs1.end(); i != gs1_end; ++i) + ph2.add_generator(*i); + + C_Polyhedron known_result(2); + known_result.add_constraint(A >= -1); + + bool ok = (ph2 == known_result); + + print_generators(ph2, "*** after ph2add_generator(*i) ***"); + + return ok; +} + +bool +test02() { + Variable A(0); + Variable B(1); + + Generator_System gs; + gs.insert(point(A + B)); + NNC_Polyhedron ph1(gs); + + print_generators(ph1, "*** ph1 ***"); + + C_Polyhedron ph2(2, EMPTY); + + print_generators(ph2, "*** ph2 ***"); + + const Generator_System& gs1 = ph1.minimized_generators(); + for (Generator_System::const_iterator i = gs1.begin(), + gs1_end = gs1.end(); i != gs1_end; ++i) + ph2.add_generator(*i); + + C_Polyhedron known_result(2); + known_result.add_constraint(A == 1); + known_result.add_constraint(B == 1); + + bool ok = (ph2 == known_result); + + print_generators(ph2, "*** after ph2.add_generator(*i) ***"); + + return ok; +} + +bool +test03() { + Variable A(0); + Variable B(1); + + Generator_System gs; + gs.insert(closure_point(3*A, 2)); + gs.insert(point(7*A, 4)); + gs.insert(ray(A - B)); + + print_generators(gs, "*** gs ***"); + + C_Polyhedron ph(2, EMPTY); + + for (Generator_System::const_iterator i = gs.begin(), + gs_end = gs.end(); i != gs_end; ++i) + if (!(*i).is_closure_point()) + ph.add_generator(*i); + + Generator_System gs_known; + gs_known.insert(point(7*A + 0*B, 4)); + gs_known.insert(ray(A - B)); + C_Polyhedron known_result(gs_known); + + bool ok = (ph == known_result); + + print_generators(gs, "*** gs ***"); + print_generators(ph, "*** ph ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); +END_MAIN diff --git a/tests/Polyhedron/addgenerators1.cc b/tests/Polyhedron/addgenerators1.cc new file mode 100644 index 0000000..46f69b7 --- /dev/null +++ b/tests/Polyhedron/addgenerators1.cc @@ -0,0 +1,355 @@ +/* Test Polyhedron::add_generators(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + Generator_System gs1; + gs1.insert(point(x)); + gs1.insert(point(y)); + gs1.insert(line(x)); + C_Polyhedron ph1(gs1); + + print_generators(ph1, "*** before ***"); + + Generator_System gs2; + gs2.insert(point()); + + ph1.add_generators_and_minimize(gs2); + + C_Polyhedron known_result(2, EMPTY); + known_result.add_generator(point()); + known_result.add_generator(point(y)); + known_result.add_generator(line(x)); + + bool ok = (ph1 == known_result); + + print_generators(ph1, "*** add_generators_and_minimize ***"); + + return ok; +} + +bool +test02() { + Variable x(0); + + C_Polyhedron ph1(2, EMPTY); + + print_generators(ph1, "*** before ***"); + + Generator_System gs; + gs.insert(point()); + gs.insert(line(x)); + + ph1.add_generators(gs); + + C_Polyhedron known_result(2, EMPTY); + known_result.add_generator(point()); + known_result.add_generator(line(x)); + + bool ok = (ph1 == known_result); + + print_generators(ph1, "*** add_generators ***"); + + return ok; +} + +bool +test03() { + C_Polyhedron ph; + ph.add_generator(point()); + + print_generators(ph, "*** ph ***"); + + Generator_System gs; + gs.insert(point()); + + print_generators(gs, "*** gs ***"); + + ph.add_generators_and_minimize(gs); + + C_Polyhedron known_result; + + bool ok = (ph == known_result); + + print_generators(ph, "*** after add_generators ***"); + + return ok; +} + +bool +test04() { + Variable x(0); + Variable y(1); + + C_Polyhedron ph(2); + ph.add_constraint(x >= 1); + ph.add_constraint(x <= 0); + + print_constraints(ph, "*** ph ***"); + + Generator_System gs; + gs.insert(ray(x)); + gs.insert(point()); + + print_generators(gs, "*** gs ***"); + + ph.add_generators(gs); + + C_Polyhedron known_result(2); + known_result.add_constraint(y == 0); + known_result.add_constraint(x >= 0); + + bool ok = (ph == known_result); + + print_generators(ph, "*** after add_generators ***"); + + return ok; +} + +bool +test05() { + Variable x(0); + Variable y(1); + + C_Polyhedron ph(2); + ph.add_constraint(x >= 0); + ph.add_constraint(x <= -1); + + print_constraints(ph, "*** ph ***"); + + Generator_System gs; + gs.insert(ray(x + y)); + gs.insert(point()); + + print_generators(gs, "*** gs ***"); + + ph.add_generators_and_minimize(gs); + + Generator_System gs_known_result; + gs_known_result.insert(point()); + gs_known_result.insert(ray(x + y)); + C_Polyhedron known_result(gs_known_result); + + bool ok = (ph == known_result); + + print_generators(ph, "*** after add_generators_and_minimize ***"); + + return ok; +} + +bool +test06() { + Variable x(0); + Variable y(1); + + Generator_System gs1; + gs1.insert(ray(x + y)); + gs1.insert(point()); + + C_Polyhedron ph(gs1); + + print_generators(ph, "*** ph ***"); + + Generator_System gs2; + gs2.insert(ray(x)); + gs2.insert(point()); + + print_generators(gs2, "*** gs2 ***"); + + ph.add_generators(gs2); + + C_Polyhedron known_result(2, EMPTY); + known_result.add_generator(point()); + known_result.add_generator(ray(x)); + known_result.add_generator(ray(x + y)); + + bool ok = (ph == known_result); + + print_generators(ph, "*** after add_generators ***"); + + return ok; +} + +bool +test07() { + Variable A(0); + + C_Polyhedron ph(2); + ph.add_constraint(A >= 3); + + print_constraints(ph, "*** ph ***"); + + C_Polyhedron known_result(ph); + + Generator_System gs; + ph.add_generators_and_minimize(gs); + + bool ok = (ph == known_result); + + print_generators(ph, "*** after ph .add_generators_and_minimize(gs) ***"); + + return ok; +} + +bool +test08() { + C_Polyhedron ph(0, EMPTY); + + print_generators(ph, "*** ph ***"); + + Generator_System gs; + gs.insert(point()); + + print_generators(gs, "*** gs ***"); + + ph.add_generators(gs); + + C_Polyhedron known_result; + + bool ok = (ph == known_result); + + print_generators(ph, "*** after ph.add_generators(gs); ***"); + + return ok; +} + +bool +test09() { + Variable A(0); + + C_Polyhedron ph(2); + ph.generators(); + ph.add_constraint(A >= 0); + C_Polyhedron copy_ph(ph); + + Generator_System gs1; + gs1.insert(point()); + gs1.insert(ray(-A)); + Generator_System gs2(gs1); + + ph.add_generators(gs1); + copy_ph.add_generators_and_minimize(gs2); + + bool ok = (ph == copy_ph); + + print_generators(ph, "*** after ph.add_generators(gs1) ***"); + print_generators(ph, + "*** after copy_ph.add_generators_and_minimize(gs2) ***"); + + return ok; +} + +bool +test10() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1(2, EMPTY); + ph1.add_generator(point()); + ph1.constraints(); + ph1.add_generator(line(A + B)); + C_Polyhedron copy_ph1 = ph1; + + C_Polyhedron ph2(2, EMPTY); + ph2.add_generator(point()); + ph2.constraints(); + ph2.add_generator(ray(A)); + ph2.add_generator(ray(B)); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + Generator_System gs1 = ph2.generators(); + Generator_System gs2 = ph2.generators(); + + ph1.add_generators(gs1); + copy_ph1.add_generators_and_minimize(gs2); + + bool ok = (ph1 == copy_ph1); + + print_generators(ph1, "*** after add_generators_assign ***"); + print_generators(copy_ph1, + "*** after add_generators_and_minimize ***"); + + return ok; +} + +bool +test11() { + C_Polyhedron ph(1, EMPTY); + Generator_System gs(point()); + + print_generators(gs, "*** gs ***"); + + ph.add_generators(gs); + + C_Polyhedron known_result(1, EMPTY); + known_result.add_generator(point()); + + bool ok = (ph == known_result); + + print_generators(ph, "*** add_generators_and_minimize ***"); + + return ok; +} + +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..7315f7b --- /dev/null +++ b/tests/Polyhedron/addgenerators2.cc @@ -0,0 +1,137 @@ +/* Test Polyhedron::add_generators(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + Generator_System gs1; + gs1.insert(closure_point()); + gs1.insert(closure_point(4*x)); + gs1.insert(closure_point(4*y)); + gs1.insert(closure_point(4*x + 4*y)); + gs1.insert(point(2*x)); + gs1.insert(point(4*x + y)); + gs1.insert(point(x + 4*y)); + gs1.insert(point(3*y)); + + NNC_Polyhedron ph(gs1); + + print_generators(ph, "*** ph ***"); + + Generator_System gs2; + gs2.insert(point()); + gs2.insert(point(4*x)); + gs2.insert(point(4*y)); + gs2.insert(point(4*x + 4*y)); + + ph.add_generators_and_minimize(gs2); + + Generator_System gs3; + gs3.insert(point()); + gs3.insert(point(4*x)); + gs3.insert(point(4*y)); + gs3.insert(point(4*x + 4*y)); + + NNC_Polyhedron known_result(gs3); + + C_Polyhedron closed_ph(ph); + C_Polyhedron closed_known_result(known_result); + + bool ok = (ph == known_result + && closed_ph == closed_known_result); + + print_generators(ph, "*** after add_generators_and_minimize(gs) ***"); + print_generators(closed_ph, "*** closed_ph ***"); + + return ok; +} + +bool +test02() { + Variable x(0); + Variable y(1); + Variable z(2); + + NNC_Polyhedron ph1(3, EMPTY); + + ph1.add_generator(point(x)); + + Generator_System gs; + gs.insert(point(1*x + 0*y + 0*z)); + NNC_Polyhedron known_result(gs); + + bool ok = (ph1 == known_result); + + print_generators(ph1, "*** ph1 ***"); + print_generators(known_result, "*** known_result ***"); + + return ok; +} + +bool +test03() { + Variable A(0); + Variable B(1); + + Generator_System gs1; + gs1.insert(point(A + B)); + gs1.insert(closure_point()); + gs1.insert(ray(A)); + gs1.insert(ray(B)); + NNC_Polyhedron ph1(gs1); + + print_generators(ph1, "*** ph1 ***"); + + ph1.topological_closure_assign(); + Generator_System gs2 = ph1.minimized_generators(); + + print_generators(gs2, "*** gs2 ***"); + + C_Polyhedron ph2(2, EMPTY); + ph2.add_generators_and_minimize(gs2); + + print_constraints(ph2, "*** ph2 ***"); + + C_Polyhedron known_result(2); + known_result.add_constraint(A >= 0); + known_result.add_constraint(B >= 0); + + bool ok = (ph2 == known_result); + + print_generators(known_result, "*** known_result ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); +END_MAIN diff --git a/tests/Polyhedron/addspacedims1.cc b/tests/Polyhedron/addspacedims1.cc new file mode 100644 index 0000000..56c34b5 --- /dev/null +++ b/tests/Polyhedron/addspacedims1.cc @@ -0,0 +1,201 @@ +/* Test Polyhedron::add_space_dimensions_and_project() + and Polyhedron::add_space_dimensions_and_embed(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + Generator_System gs; + gs.insert(point()); + gs.insert(point(x)); + gs.insert(point(y)); + gs.insert(point(x + y)); + + C_Polyhedron ph(gs); + + print_generators(ph, "*** ph ***"); + + ph.add_space_dimensions_and_project(1); + + C_Polyhedron known_result(3, EMPTY); + known_result.add_generator(point()); + known_result.add_generator(point(x)); + known_result.add_generator(point(y)); + known_result.add_generator(point(x + y)); + + bool ok = (ph == known_result); + + print_generators(ph, "*** after add_space_dimensions_and_project ***"); + + return ok; +} + +bool +test02() { + C_Polyhedron ph(3, EMPTY); + + print_constraints(ph, "*** ph ***"); + + C_Polyhedron computed_result1(ph); + C_Polyhedron computed_result2(ph); + + computed_result1.add_space_dimensions_and_project(4); + computed_result2.add_space_dimensions_and_embed(4); + + C_Polyhedron known_result(7, EMPTY); + + bool ok = (computed_result1 == known_result + && computed_result2 == known_result); + + print_constraints(computed_result1, "*** computed_result1 ***"); + print_constraints(computed_result2, "*** computed_result2 ***"); + + return ok; +} + +bool +test03() { + Variable x(0); + Variable y(1); + Variable z(2); + Variable u(3); + Variable v(4); + Variable w(5); + + Generator_System gs; + gs.insert(point()); + gs.insert(ray(x + y)); + + C_Polyhedron ph(gs); + + print_generators(ph, "*** ph ***"); + + Constraint_System cs = ph.constraints(); + + ph.add_space_dimensions_and_embed(2); + + print_generators(ph, "*** after add_space_dimensions_and_embed(2) ***"); + + ph.add_space_dimensions_and_embed(2); + + C_Polyhedron known_result(6, EMPTY); + known_result.add_generator(point()); + known_result.add_generator(ray(x + y)); + known_result.add_generator(line(z)); + known_result.add_generator(line(u)); + known_result.add_generator(line(v)); + known_result.add_generator(line(w)); + + bool ok = (ph == known_result); + + print_generators(ph, "*** ph ***"); + + return ok; +} + +bool +test04() { + C_Polyhedron ph1; + + print_generators(ph1, "*** ph1 ***"); + + ph1.add_space_dimensions_and_project(3); + + print_generators(ph1, "*** after add_space_dimensions_and_project(3) ***"); + + C_Polyhedron ph2; + Constraint_System cs = ph2.constraints(); + + print_generators(ph2, "*** ph2 ***"); + + ph2.add_space_dimensions_and_project(3); + + bool ok = (ph1 == ph2); + + print_generators(ph2, "*** after add_space_dimensions_and_project(3) ***"); + + return ok; +} + +bool +test05() { + Variable C(2); + + C_Polyhedron ph(2); + + print_constraints(ph, "*** ph ***"); + + ph.add_space_dimensions_and_project(1); + + C_Polyhedron known_result(3); + known_result.add_constraint(C == 0); + + bool ok = (ph == known_result); + + print_constraints(ph, + "*** after ph.add_space_dimensions_and_project(1) ***"); + + return ok; +} + +bool +test06() { + Variable A(0); + + C_Polyhedron ph1(2); + ph1.add_constraint(A >= 0); + ph1.add_constraint(A <= 2); + + C_Polyhedron ph2(ph1); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + ph1.add_space_dimensions_and_embed(0); + ph2.add_space_dimensions_and_project(0); + + bool ok = (ph1 == ph2); + + print_constraints(ph1, + "*** after ph1.add_space_dimensions_and_embed(0) ***"); + print_constraints(ph2, + "*** after ph2.add_space_dimensions_and_project(0) ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + DO_TEST(test06); +END_MAIN diff --git a/tests/Polyhedron/addspacedims2.cc b/tests/Polyhedron/addspacedims2.cc new file mode 100644 index 0000000..0725642 --- /dev/null +++ b/tests/Polyhedron/addspacedims2.cc @@ -0,0 +1,248 @@ +/* Test Polyhedron::add_space_dimensions_and_project() + and Polyhedron::add_space_dimensions_and_embed(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + Variable z(2); + Variable w(3); + + Constraint_System cs; + cs.insert(x > 2); + cs.insert(y > 2); + cs.insert(x < 6); + cs.insert(y < 6); + + NNC_Polyhedron ph(cs); + + ph.generators(); + + print_constraints(ph, "*** ph ***"); + print_generators(ph, "*** ph ***"); + + ph.add_space_dimensions_and_project(2); + + NNC_Polyhedron known_result(4); + known_result.add_constraint(z == 0); + known_result.add_constraint(w == 0); + known_result.add_constraint(x > 2); + known_result.add_constraint(y > 2); + known_result.add_constraint(x < 6); + known_result.add_constraint(y < 6); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** after add_space_dimensions_and_project ***"); + print_generators(ph, "*** after add_space_dimensions_and_project ***"); + + return ok; +} + +bool +test02() { + Variable x(0); + + NNC_Polyhedron ph1(1); + + ph1.add_constraint(x > 1); + ph1.add_constraint(x < 5); + + print_constraints(ph1, "*** ph1 ***"); + + ph1.add_space_dimensions_and_embed(2); + + Generator_System gs; + gs.insert(point(2*x)); + gs.insert(closure_point(x)); + gs.insert(closure_point(5*x)); + + NNC_Polyhedron ph2(gs); + + print_generators(ph2, "*** ph2 ***"); + + ph2.add_space_dimensions_and_embed(2); + + bool ok = (ph1 == ph2); + + print_constraints(ph1, "*** ph1 after add_space_dimensions_and_embed ***"); + print_generators(ph2, "*** ph2 after add_space_dimensions_and_embed ***"); + + return ok; +} + +bool +test03() { + Variable x(0); + + NNC_Polyhedron ph1(1); + + ph1.add_constraint(x > -3); + ph1.add_constraint(x < 3); + + print_constraints(ph1, "*** ph1 ***"); + + ph1.add_space_dimensions_and_project(2); + + Generator_System gs; + gs.insert(point()); + gs.insert(closure_point(-3*x)); + gs.insert(closure_point(3*x)); + + NNC_Polyhedron ph2(gs); + + print_generators(ph2, "*** ph2 ***"); + + ph2.add_space_dimensions_and_project(2); + + bool ok = (ph1 == ph2); + + print_constraints(ph1, "*** ph1 after add_space_dimensions_and_embed ***"); + print_generators(ph2, "*** ph2 after add_space_dimensions_and_embed ***"); + + return ok; +} + +bool +test04() { + Variable A(0); + + NNC_Polyhedron ph(1, EMPTY); + ph.add_generator(point(A)); + ph.add_generator(closure_point()); + ph.add_generator(closure_point(3*A)); + + print_generators(ph, "*** ph ***"); + + ph.add_space_dimensions_and_embed(1); + + NNC_Polyhedron known_result(2); + known_result.add_constraint(A > 0); + known_result.add_constraint(A < 3); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** after ph.add_space_dimensions_and_embed(1) ***"); + print_generators(ph, "*** after ph.add_space_dimensions_and_embed(1) ***"); + + return ok; +} + +bool +test05() { + Variable A(0); + Variable B(1); + + Generator_System gs1; + gs1.insert(point(A)); + NNC_Polyhedron ph(gs1); + + Generator_System gs2; + gs2.insert(point(A)); + gs2.insert(ray(A)); + ph.add_generators(gs2); + + print_generators(ph, "*** ph ***"); + + ph.add_space_dimensions_and_embed(1); + + Generator_System known_gs; + known_gs.insert(point(A)); + known_gs.insert(line(B)); + known_gs.insert(ray(A)); + NNC_Polyhedron known_result(known_gs); + + bool ok = (ph == known_result); + + print_generators(ph, "*** ph ***"); + + return ok; +} + +bool +test06() { + Variable A(0); + Variable B(1); + + Generator_System gs1; + gs1.insert(point(A + B)); + gs1.insert(closure_point()); + gs1.insert(ray(A)); + gs1.insert(ray(B)); + NNC_Polyhedron ph1(gs1); + + ph1.minimized_constraints(); + + print_constraints(ph1, "*** ph1 ***"); + print_generators(ph1, "*** ph1 ***"); + + ph1.add_space_dimensions_and_embed(1); + + NNC_Polyhedron known_result(3); + known_result.add_constraint(A > 0); + known_result.add_constraint(B > 0); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, + "*** after ph1.add_space_dimensions_and_embed(1) ***"); + print_generators(ph1, "*** after ph1.add_space_dimensions_and_embed(1) ***"); + + return ok; +} + +bool +test07() { + Variable A(0); + + C_Polyhedron ph1(2); + ph1.add_constraint(A >= 0); + ph1.add_constraint(A <= 2); + + // This will change the size of the rows, but not their capacity. + ph1.add_space_dimensions_and_embed(1); + + // Assigning the polyhedron to itself: + // this used to recompute the row capacity based on row size, + // without actually increasing the capacity of the rows, + // leading to an inconsistent state. + ph1 = ph1; + + return ph1.OK(); +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + DO_TEST(test06); + DO_TEST(test07); +END_MAIN diff --git a/tests/Polyhedron/affineimage1.cc b/tests/Polyhedron/affineimage1.cc new file mode 100644 index 0000000..c833a0c --- /dev/null +++ b/tests/Polyhedron/affineimage1.cc @@ -0,0 +1,265 @@ +/* Test Polyhedron::affine_image(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + Variable C(2); + + C_Polyhedron ph(3); + ph.add_constraint(C == -2); + ph.add_constraint(A == 0); + + print_constraints(ph, "*** ph ***"); + + ph.affine_image(B, A+2, 1); + + C_Polyhedron known_result(3, EMPTY); + known_result.add_generator(point(2*B - 2*C)); + + bool ok = (ph == known_result); + + print_generators(ph, "*** ph after ph.affine_image(B, A+2, 1) ***"); + + return ok; +} + +bool +test02() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.add_constraint(A >= B); + ph.add_constraint(B >= 0); + ph.add_constraint(A <= 3); + + print_constraints(ph, "*** ph ***"); + + ph.affine_image(A, A+B+1); + + C_Polyhedron known_result(2); + known_result.add_constraint(A -2*B - 1 >= 0); + known_result.add_constraint(B >= 0); + known_result.add_constraint(A - B <= 4); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** ph after ph.affine_image(A, A+B+1) ***"); + + return ok; +} + +bool +test03() { + Variable A(0); + Variable B(1); + + Generator_System gs; + gs.insert(point()); + gs.insert(ray(A)); + gs.insert(ray(B)); + C_Polyhedron ph(gs); + + print_generators(ph, "*** ph ***"); + + ph.affine_image(A, A + 1, 2); + + C_Polyhedron known_result(2); + known_result.add_constraint(2*A >= 1); + known_result.add_constraint(B >= 0); + + bool ok = (ph == known_result); + + print_generators(ph, "*** after ph.affine_image(A, A + 1, 2) ***"); + + return ok; +} + +bool +test04() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2, EMPTY); + ph.add_generator(point(A)); + + print_constraints(ph, "*** ph ***"); + + ph.affine_image(A, B+2, -3); + + C_Polyhedron known_result(2, EMPTY); + known_result.add_generator(point(-2*A, 3)); + + bool ok = (ph == known_result); + + print_generators(ph, "*** ph after ph.affine_image(A, B+2, -3) ***"); + + return ok; +} + +bool +test05() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.add_constraint(A >= 2); + ph.add_constraint(A <= 3); + ph.add_constraint(B >= 1); + ph.add_constraint(2*A >= B); + + print_constraints(ph, "*** ph ***"); + + ph.affine_image(B, A-B+2, -3); + + C_Polyhedron known_result(2, EMPTY); + known_result.add_generator(point(2*A)); + known_result.add_generator(point(2*A - B)); + known_result.add_generator(point(9*A + B, 3)); + known_result.add_generator(point(9*A - 4*B, 3)); + + bool ok = (ph == known_result); + + print_generators(ph, "*** ph after ph.affine_image(B, A-B+2, -3) ***"); + + return ok; +} + +bool +test06() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1(2, EMPTY); + + print_constraints(ph1, "*** ph1 ***"); + + ph1.affine_image(A, 2*A + B + 1); + + C_Polyhedron known_result(2, EMPTY); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after ph1.affine_image(A, 2*A + B + 1) ***"); + + return ok; +} + +bool +test07() { + Variable A(0); + Variable B(1); + + Generator_System gs; + gs.insert(point()); + gs.insert(point(A)); + gs.insert(point(B)); + gs.insert(point(A + B)); + C_Polyhedron ph(gs); + + print_generators(ph, "*** ph ***"); + + ph.affine_image(A, -A - 1, -1); + + Generator_System known_gs; + known_gs.insert(point(A)); + known_gs.insert(point(2*A)); + known_gs.insert(point(A + B)); + known_gs.insert(point(2*A + B)); + C_Polyhedron known_result(known_gs); + + bool ok = (ph == known_result); + + print_generators(ph, "*** after ph.affine_image(A, -A - 1, -1) ***"); + + return ok; +} + +bool +test08() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.generators(); + ph.add_constraint(A >= 0); + ph.add_constraint(B >= 0); + C_Polyhedron copy_ph(ph); + + print_constraints(ph, "*** ph ***"); + + ph.affine_image(A, A + 1); + copy_ph.affine_image(A, -A - 1, -1); + + bool ok = (ph == copy_ph); + + print_generators(ph, "*** after ph.affine_image(A, A + 1) ***"); + print_generators(copy_ph, + "*** after copy_ph.affine_image(A, -A - 1, -1) ***"); + + return ok; +} + +bool +test09() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.generators(); + ph.add_constraint(A >= 0); + ph.add_constraint(B >= 0); + C_Polyhedron copy_ph(ph); + + print_constraints(ph, "*** ph ***"); + + ph.affine_image(B, A + 1); + copy_ph.affine_image(B, -A - 1, -1); + + bool ok = (ph == copy_ph); + + print_generators(ph, "*** after ph.affine_image(B, A + 1) ***"); + print_generators(copy_ph, + "*** after copy_ph.affine_image(B, -A - 1, -1) ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + DO_TEST(test06); + DO_TEST(test07); + DO_TEST(test08); + DO_TEST(test09); +END_MAIN diff --git a/tests/Polyhedron/affineimage2.cc b/tests/Polyhedron/affineimage2.cc new file mode 100644 index 0000000..f97854d --- /dev/null +++ b/tests/Polyhedron/affineimage2.cc @@ -0,0 +1,74 @@ +/* Test Polyhedron::affine_image(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +void +aux_test01(std::ostream& s, const Variable& v) { + s << char('i' + v.id()); +} + +bool +test01() { + Variable i(0); + Variable j(1); + + // Install the alternate output function. + Variable::set_output_function(aux_test01); + + NNC_Polyhedron p1(2); + p1.add_constraint(j == 0); + p1.add_constraint(i >= 0); + + NNC_Polyhedron p2(2); + p2.add_constraint(j == 0); + p2.add_constraint(-i > 0); + + print_constraints(p1, "*** p1 ***"); + print_constraints(p2, "*** p2 ***"); + + p1.affine_image(j, i+2); + p2.affine_image(j, i); + + print_constraints(p1, "*** p1.affine_image(j, i+2) ***"); + print_constraints(p2, "*** p2.affine_image(j, i) ***"); + + p1.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..f57d766 --- /dev/null +++ b/tests/Polyhedron/affinepreimage1.cc @@ -0,0 +1,437 @@ +/* Test Polyhedron::affine_preimage(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + Generator_System gs; + gs.insert(point()); + gs.insert(ray(A + B)); + gs.insert(point(A)); + + C_Polyhedron ph(gs); + + print_generators(ph, "*** ph ***"); + + ph.affine_preimage(A, A+2); + + Generator_System gs_known_result; + gs_known_result.insert(point(-2*A)); + gs_known_result.insert(ray(A + B)); + gs_known_result.insert(point(-A)); + + C_Polyhedron known_result(gs_known_result); + + bool ok = (ph == known_result); + + print_generators(ph, "*** ph after ph.affine_preimage(A, A+2) ***"); + + return ok; +} + +bool +test02() { + Variable A(0); + Variable B(1); + Variable C(2); + + C_Polyhedron ph(3); + ph.add_constraint(A + C == 0); + ph.add_constraint(A + B >= 0); + ph.add_constraint(A + B - 1 >= 0); + + print_constraints(ph, "*** ph ***"); + + ph.affine_preimage(A, A + B); + + C_Polyhedron known_result(3); + known_result.add_constraint(A + B + C == 0); + known_result.add_constraint(A + 2*B >= 0); + known_result.add_constraint(A + 2*B -1 >= 0); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** ph after ph.affine_preimage(A, A+B) ***"); + + return ok; +} + +bool +test03() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.add_constraint(A >= 0); + ph.add_constraint(B >= 0); + ph.add_constraint(A + B - 3 >= 0); + + print_constraints(ph, "*** ph ***"); + + ph.affine_preimage(A, B+1); + + C_Polyhedron known_result(2, EMPTY); + known_result.add_generator(point(B)); + known_result.add_generator(line(A)); + known_result.add_generator(ray(B)); + + bool ok = (ph == known_result); + + print_generators(ph, "*** ph after ph.affine_preimage(A, B+2) ***"); + + return ok; +} + +bool +test04() { + Variable x(0); + Variable y(1); + + Generator_System gs; + gs.insert(point(x + y)); + gs.insert(ray(x + 2*y)); + gs.insert(ray(x)); + + C_Polyhedron ph(gs); + + print_generators(ph, "*** ph ***"); + + ph.affine_preimage(x, y+1); + + C_Polyhedron known_result(2); + known_result.add_constraint(y >= 1); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** after affine_preimage(x, y+1) ***"); + + return ok; +} + +bool +test05() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.add_constraint(A >= 2); + ph.add_constraint(B >= 0); + + print_constraints(ph, "*** ph ***"); + + ph.affine_preimage(A, A + 1, 2); + + C_Polyhedron known_result(2); + known_result.add_constraint(A >= 3); + known_result.add_constraint(B >= 0); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** after ph.affine_preimage(A, A + 1, 2) ***"); + + return ok; +} + +bool +test06() { + Variable A(0); + Variable B(1); + C_Polyhedron ph(2); + ph.add_constraint(A >= 0); + ph.add_constraint(B >= 2); + + print_constraints(ph, "*** ph ***"); + + ph.affine_preimage(B, A + 1, 2); + + C_Polyhedron known_result(2); + known_result.add_constraint(A >= 3); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** after ph.affine_preimage(B, A + 1, 2) ***"); + + return ok; +} + +bool +test07() { + Variable A(0); + Variable B(1); + + Generator_System gs; + gs.insert(point()); + gs.insert(ray(A)); + gs.insert(ray(A + B)); + C_Polyhedron ph(gs); + + print_generators(ph, "*** ph ***"); + + ph.affine_preimage(B, A - B, -1); + + C_Polyhedron known_result(2); + known_result.add_constraint(A - B <= 0); + known_result.add_constraint(2*A - B >= 0); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** after ph.affine_preimage(B, A - B, -1) ***"); + + return ok; +} + +bool +test08() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2, EMPTY); + + print_constraints(ph, "*** ph ***"); + + ph.affine_preimage(A, 2*A +B + 1); + + C_Polyhedron known_result(2, EMPTY); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** after ph.affine_preimage(A, 2*A + B + 1) ***"); + + return ok; +} + +bool +test09() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.add_constraint(A >= 0); + ph.add_constraint(B >= 0); + ph.add_constraint(A <= 1); + ph.add_constraint(B <= 1); + + ph.affine_preimage(A, -A - 1, -1); + + C_Polyhedron known_result(2); + known_result.add_constraint(A <= 0); + known_result.add_constraint(B <= 1); + known_result.add_constraint(A >= -1); + known_result.add_constraint(B >= 0); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** after ph.affine_preimage(A, -A - 1, -1) ***"); + + return ok; +} + +bool +test10() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.add_constraint(A >= 0); + ph.add_constraint(B >= 0); + ph.add_constraint(A <= 1); + ph.add_constraint(B <= 1); + + print_constraints(ph, "*** ph ***"); + + ph.affine_preimage(B, -A - 1, -1); + + C_Polyhedron known_result(2); + known_result.add_constraint(A == 0); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** after ph.affine_preimage(B, -A - 1, -1) ***"); + + return ok; +} + +bool +test11() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.generators(); + ph.add_constraint(A >= 0); + ph.add_constraint(B >= 0); + C_Polyhedron copy_ph(ph); + + print_constraints(ph, "*** ph ***"); + + ph.affine_preimage(A, A + 1); + copy_ph.affine_preimage(A, -A - 1, -1); + + bool ok = (ph == copy_ph); + + print_generators(ph, "*** after ph.affine_preimage(A, A + 1) ***"); + print_generators(copy_ph, + "*** after copy_ph.affine_preimage(A, -A - 1, -1) ***"); + return ok; +} + +bool +test12() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.generators(); + ph.add_constraint(A >= 0); + ph.add_constraint(B >= 0); + C_Polyhedron copy_ph(ph); + + print_constraints(ph, "*** ph ***"); + + ph.affine_preimage(B, A + 1); + copy_ph.affine_preimage(B, -A - 1, -1); + + bool ok = (ph == copy_ph); + + print_generators(ph, "*** after ph.affine_preimage(B, A + 1) ***"); + print_generators(copy_ph, + "*** after copy_ph.affine_preimage(B, -A - 1, -1) ***"); + return ok; +} + +bool +test13() { + Variable A(0); + Variable B(1); + + Generator_System gs; + gs.insert(point()); + gs.insert(ray(A + B)); + gs.insert(point(A)); + + C_Polyhedron ph(gs); + + print_generators(ph, "*** ph ***"); + + ph.affine_preimage(B, Linear_Expression(1)); + + Generator_System gs_known_result; + gs_known_result.insert(point(A)); + gs_known_result.insert(point(2*A)); + gs_known_result.insert(line(B)); + + C_Polyhedron known_result(gs_known_result); + + bool ok = (ph == known_result); + + print_generators(ph, "*** ph after ph.affine_preimage(B, 1) ***"); + + return ok; +} + +bool +test14() { + Variable A(0); + Variable B(1); + + Generator_System gs; + gs.insert(point()); + gs.insert(point(0*A + 3*B)); + gs.insert(point(3*A + 0*B)); + gs.insert(point(3*A + 3*B)); + + C_Polyhedron ph(gs); + + C_Polyhedron known_result = ph; + + print_generators(ph, "*** ph before ph.affine_image(A, A + 2*B + 4) ***"); + + ph.affine_image(A, A + 2*B + 4); + + print_generators(ph, "*** ph after ph.affine_image(A, A + 2*B + 4) ***"); + + ph.affine_preimage(A, A + 2*B + 4); + + bool ok = (ph == known_result); + + print_generators(ph, "*** ph after ph.affine_preimage(A, A + 2*B + 4) ***"); + + return ok; +} + +bool +test15() { + Variable A(0); + Variable B(1); + + Generator_System gs; + gs.insert(point()); + gs.insert(point(0*A + 3*B)); + gs.insert(point(3*A + 0*B)); + gs.insert(point(3*A + 3*B)); + + C_Polyhedron ph(gs); + + print_generators(ph, "*** ph before ph.affine_image(A, B) ***"); + + ph.affine_image(A, B); + + print_generators(ph, "*** ph after ph.affine_image(A, B) ***"); + + ph.affine_preimage(A, B); + + C_Polyhedron known_result(2); + known_result.add_constraint(B >= 0); + known_result.add_constraint(B <= 3); + + bool ok = (ph == known_result); + + print_generators(ph, "*** ph after ph.affine_preimage(A, B) ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + DO_TEST(test06); + DO_TEST(test07); + DO_TEST(test08); + DO_TEST(test09); + DO_TEST(test10); + DO_TEST(test11); + DO_TEST(test12); + DO_TEST(test13); + DO_TEST(test14); + DO_TEST(test15); +END_MAIN diff --git a/tests/Polyhedron/affinetrans.cc b/tests/Polyhedron/affinetrans.cc new file mode 100644 index 0000000..1186d45 --- /dev/null +++ b/tests/Polyhedron/affinetrans.cc @@ -0,0 +1,81 @@ +/* Use of the functions affine_image and affine_preimage. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + Generator_System gs; + gs.insert(point(0*x + 0*y)); + gs.insert(point(0*x + 3*y)); + gs.insert(point(3*x + 0*y)); + gs.insert(point(3*x + 3*y)); + C_Polyhedron ph(gs); + + Linear_Expression expr = x + 4; + + C_Polyhedron p1(ph); + + print_generators(p1, "*** p1 ***"); + + p1.affine_image(x, expr); + + C_Polyhedron p2(ph); + + print_generators(p2, "*** p2 ***"); + + p2.affine_preimage(x, expr); + + Generator_System gs1_known_result; + gs1_known_result.insert(point(4*x + 0*y)); + gs1_known_result.insert(point(4*x + 3*y)); + gs1_known_result.insert(point(7*x + 0*y)); + gs1_known_result.insert(point(7*x + 3*y)); + C_Polyhedron p1_known_result(gs1_known_result); + + Generator_System gs2_known_result; + gs2_known_result.insert(point(-4*x + 0*y)); + gs2_known_result.insert(point(-4*x + 3*y)); + gs2_known_result.insert(point(-1*x + 0*y)); + gs2_known_result.insert(point(-1*x + 3*y)); + C_Polyhedron p2_known_result(gs2_known_result); + + bool ok = (p1 == p1_known_result && p2 == p2_known_result); + + print_generators(p1 ,"*** p1 ***"); + print_generators(p1_known_result, "*** p1_known_result ***"); + print_generators(p2 ,"*** p2 ***"); + print_generators(p2_known_result, "*** p2_known_result ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); +END_MAIN diff --git a/tests/Polyhedron/append1.cc b/tests/Polyhedron/append1.cc new file mode 100644 index 0000000..54c92ab --- /dev/null +++ b/tests/Polyhedron/append1.cc @@ -0,0 +1,112 @@ +/* An example of iteration to a post-fixpoint. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +void +shift_rename_add(const C_Polyhedron& p, + dimension_type offset, + C_Polyhedron& q) { + C_Polyhedron r(offset); + r.concatenate_assign(p); + q.intersection_assign(r); +} + +} // namespace + +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..8c4b6ea --- /dev/null +++ b/tests/Polyhedron/append2.cc @@ -0,0 +1,131 @@ +/* An example of iteration to a post-fixpoint. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +void +shift_rename_add(const C_Polyhedron& p, + dimension_type offset, + C_Polyhedron& q) { + C_Polyhedron r(offset); + r.concatenate_assign(p); + q.intersection_assign(r); +} + +void +append_init(C_Polyhedron& base, C_Polyhedron& induct, C_Polyhedron& expect, + dimension_type& offset, unsigned int& arity, + unsigned int& num_vars) { + offset = 3; + arity = 3; + num_vars = 6; + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + Variable E(4); + Variable F(5); + + // This is the base case: + // append(A,B,C) :- A = [], B = C. + base.add_space_dimensions_and_embed(3); + base.add_constraint(A == 0); + base.add_constraint(B >= 0); + base.add_constraint(C == B); + + print_constraints(base, "*** base ***"); + + // This is the inductive case: + // append(A,B,C) :- A = [X|D], B = E, C = [X|F], append(D,E,F). + induct.add_space_dimensions_and_embed(6); + induct.add_constraint(A + F == C + D); + induct.add_constraint(B == E); + induct.add_constraint(C + D >= A); + induct.add_constraint(D >= 0); + induct.add_constraint(B >= 0); + induct.add_constraint(A >= D + 1); + + print_constraints(induct, "*** inductive ***"); + + expect.add_space_dimensions_and_embed(3); + expect.add_constraint(A + B == C); + expect.add_constraint(B >= 0); + expect.add_constraint(C >= B); +} + +void +fix_point(C_Polyhedron& start, C_Polyhedron& induct, C_Polyhedron& finish, + dimension_type offset, unsigned int arity, unsigned int num_vars) { + // Initialize the fixpoint iteration. + C_Polyhedron current = start; + + print_constraints(current, "*** start ***"); + + // Contains the polyhedron computed at the previous iteration. + C_Polyhedron previous; + do { + previous = current; + current = induct; + shift_rename_add(previous, offset, current); + + print_constraints(current, "*** after shift_rename_add ***"); + + Variables_Set dimensions_to_remove; + for (unsigned int i = num_vars-1 ; i >= arity; --i ) + dimensions_to_remove.insert(Variable(i)); + current.remove_space_dimensions(dimensions_to_remove); + + print_constraints(current, "*** after remove_space_dimensions ***"); + + current.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..c98955d --- /dev/null +++ b/tests/Polyhedron/ascii_dump_load1.cc @@ -0,0 +1,601 @@ +/* Test Polyhedron::ascii_dump() and Polyhedron::ascii_load(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +#include "files.hh" +#include +#include + +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..4271fb4 --- /dev/null +++ b/tests/Polyhedron/ascii_dump_load2.cc @@ -0,0 +1,138 @@ +/* Test Polyhedron::ascii_dump() and Polyhedron::ascii_load(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +#include "files.hh" +#include +#include + +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..c907a65 --- /dev/null +++ b/tests/Polyhedron/ascii_dump_load3.cc @@ -0,0 +1,433 @@ +/* Test Polyhedron::ascii_dump() and Polyhedron::ascii_load(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +#include "files.hh" +#include +#include + +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..3258f30 --- /dev/null +++ b/tests/Polyhedron/bgp99extrapolation1.cc @@ -0,0 +1,159 @@ +/* Test Pointset_Powerset::BGP99_extrapolation_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include + +namespace { + +const C_Polyhedron& +aux1_test01(unsigned n) { + Variable x(0); + Variable y(1); + + static std::vector 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 +aux2_test01(unsigned n) { + Pointset_Powerset 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 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 Sn = aux2_test01(n); + + nout << "S" << n << " = " << Sn << endl; + + Sn.BGP99_extrapolation_assign + (T, widen_fun_ref(&Polyhedron::H79_widening_assign), 2); + + nout << "T" << n << " = " << Sn << endl; + + if (Sn.definitely_entails(T)) + converged = true; + else + std::swap(Sn, T); + } + + return !converged; +} + +} // 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..b5d56a6 --- /dev/null +++ b/tests/Polyhedron/bgp99extrapolation2.cc @@ -0,0 +1,255 @@ +/* Test Pointset_Powerset::BGP99_extrapolation_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include + +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 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 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 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 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 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 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..7257723 --- /dev/null +++ b/tests/Polyhedron/bhrz03widening1.cc @@ -0,0 +1,754 @@ +/* Test Polyhedron::BHRZ03_widening_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + Variable C(2); + + Generator_System gs1; + gs1.insert(point()); + gs1.insert(point(A)); + gs1.insert(point(B)); + gs1.insert(point(A + B)); + gs1.insert(point(C)); + gs1.insert(point(A + C)); + gs1.insert(point(B + C)); + gs1.insert(point(A + B + C)); + C_Polyhedron ph1(gs1); + + C_Polyhedron ph1_copy(ph1); + + Generator_System gs2; + gs2.insert(point(0*C)); + gs2.insert(point(A)); + gs2.insert(point(B)); + gs2.insert(point(A + B)); + C_Polyhedron ph2(gs2); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + ph1.BHRZ03_widening_assign(ph2); + + bool ok = (ph1 == ph1_copy); + + print_constraints(ph1, "*** after BHRZ03_widening_assign ***"); + + return ok; +} + +bool +test02() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1(2); + ph1.add_constraint(A >= 0); + + C_Polyhedron ph1_copy(ph1); + + C_Polyhedron ph2(2); + ph2.add_constraint(A >= 0); + ph2.add_constraint(B >= 0); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + ph1.BHRZ03_widening_assign(ph2); + + bool ok = (ph1 == ph1_copy); + + print_constraints(ph1, "*** after BHRZ03_widening_assign ***"); + + return ok; +} + +bool +test03() { + Variable A(0); + Variable B(1); + + Generator_System gs1; + gs1.insert(point()); + gs1.insert(point(2*A)); + gs1.insert(point(2*B)); + + C_Polyhedron ph1(gs1); + C_Polyhedron ph1_copy(ph1); + + Generator_System gs2; + gs2.insert(point()); + gs2.insert(point(A)); + gs2.insert(point(B)); + gs2.insert(point(A + B)); + C_Polyhedron ph2(gs2); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + ph1.BHRZ03_widening_assign(ph2); + + bool ok = (ph1 == ph1_copy); + + print_constraints(ph1, "*** after BHRZ03_widening_assign ***"); + + return ok; +} + +bool +test04() { + Variable A(0); + Variable B(1); + + Generator_System gs1; + gs1.insert(point(2*A)); + gs1.insert(closure_point(A+B)); + gs1.insert(closure_point(3*A+B)); + NNC_Polyhedron ph1(gs1); + + Generator_System gs2; + gs2.insert(point(2*A)); + gs2.insert(closure_point(B)); + gs2.insert(closure_point(4*A+B)); + NNC_Polyhedron ph2(gs2); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + ph2.BHRZ03_widening_assign(ph1); + + NNC_Polyhedron known_result(2); + known_result.add_constraint(B >= 0); + known_result.add_constraint(B < 1); + + bool ok = (ph2 == known_result); + + print_constraints(ph2, "*** after BHRZ03_widening_assign ***"); + + return ok; +} + +bool +test05() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1(2); + ph1.add_constraint(A - B >= 0); + ph1.add_constraint(A + B <= 2); + ph1.add_constraint(B >= 0); + + C_Polyhedron ph2(2); + ph2.add_constraint(2*A - B >= 0); + ph2.add_constraint(B >= 0); + ph2.add_constraint(2*A + B <= 4); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + ph2.BHRZ03_widening_assign(ph1); + + C_Polyhedron known_result(2); + known_result.add_constraint(2*A + B >= 0); + known_result.add_constraint(2*A - B <= 4); + known_result.add_constraint(B >= 0); + + bool ok = (ph2 == known_result); + + print_constraints(ph2, "*** after BHRZ03_widening_assign ***"); + + return ok; +} + +bool +test06() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1(2); + ph1.add_constraint(A >= 0); + ph1.add_constraint(A - B <= 0); + + C_Polyhedron ph2(2); + ph2.add_constraint(A >= 0); + ph2.add_constraint(2*A - B <= 0); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + ph1.BHRZ03_widening_assign(ph2); + + C_Polyhedron known_result(2); + known_result.add_constraint(B >= 0); + known_result.add_constraint(A >= 0); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after BHRZ03_widening_assign ***"); + + return ok; +} + +bool +test07() { + Variable A(0); + Variable B(1); + Variable C(2); + + Generator_System gs1; + gs1.insert(point()); + gs1.insert(ray(A)); + gs1.insert(ray(B)); + gs1.insert(ray(A + 4*B + 2*C)); + C_Polyhedron ph1(gs1); + + Generator_System gs2; + gs2.insert(point()); + gs2.insert(ray(A)); + gs2.insert(ray(B)); + gs2.insert(ray(A + 2*B + 4*C)); + C_Polyhedron ph2(gs2); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + ph2.BHRZ03_widening_assign(ph1); + + C_Polyhedron known_result(3); + known_result.add_constraint(A >= 0); + known_result.add_constraint(B >= 0); + known_result.add_constraint(C >= 0); + + bool ok = (ph2 == known_result); + + print_constraints(ph2, "*** after BHRZ03_widening_assign ***"); + + return ok; +} + +bool +test08() { + Variable A(0); + Variable B(1); + Variable C(2); + + Generator_System gs1; + gs1.insert(point()); + gs1.insert(line(A)); + gs1.insert(ray(B)); + gs1.insert(ray(A + B + C)); + C_Polyhedron ph1(gs1); + + Generator_System gs2; + gs2.insert(point()); + gs2.insert(line(A)); + gs2.insert(ray(B)); + gs2.insert(ray(A + B + 2*C)); + C_Polyhedron ph2(gs2); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + ph2.BHRZ03_widening_assign(ph1); + + C_Polyhedron known_result(3); + known_result.add_constraint(B >= 0); + known_result.add_constraint(C >= 0); + + bool ok = (ph2 == known_result); + + print_constraints(ph2, "*** after BHRZ03_widening_assign ***"); + + return ok; +} + +const Generator_System& +aux1_test09() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + Variable E(4); + + static Generator_System gs; + static bool initialized = false; + if (!initialized) { + gs.insert(point()); + gs.insert(ray(C)); + gs.insert(ray(D)); + gs.insert(ray(E)); + gs.insert(ray(A + D)); + gs.insert(ray(A + B + E)); + initialized = true; + } + return gs; +} + +C_Polyhedron +aux2_test09(unsigned n) { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + Variable E(4); + + C_Polyhedron ph(aux1_test09()); + n += 2; + ph.add_generator(ray(A + (n-1)*B + E)); + if (n % 2 == 0) { + // Even. + unsigned m = n / 2; + ph.add_generator(ray(m*B + E)); + ph.add_generator(ray(A + (m-1)*B + D)); + } + else { + // Odd. + ph.add_generator(ray(n*B + 2*E)); + ph.add_generator(ray(2*A + (n-2)*B + 2*D)); + } + return ph; +} + +bool +test09() { + // Chain condition for widenings: + // for each increasing chain of descriptions p_0, p_1, ..., p_i, ..., + // the sequence q_0, q_1, ..., q_i, ... defined by q_0 = p_0 and + // for each i >= 1, q_i = q_{i-1} \nabla p_i is ultimately stationary. + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + Variable E(4); + + // Initialization: set q_0. + C_Polyhedron q_i_minus_1 = aux2_test09(0); + + for (unsigned i = 1; i <= 100; ++i) { + print_generators(q_i_minus_1.generators(), + "*** Result of the previous iteration ***"); + + C_Polyhedron p_i = aux2_test09(i); + print_generators(p_i.generators(), "*** New stuff ***"); + + C_Polyhedron q_i = q_i_minus_1; + q_i.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..dbc633d --- /dev/null +++ b/tests/Polyhedron/bhrz03widening2.cc @@ -0,0 +1,261 @@ +/* Test Polyhedron::BHRZ03_widening_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + Generator_System gs1; + gs1.insert(point()); + gs1.insert(ray(B)); + gs1.insert(ray(-A + B)); + C_Polyhedron ph1(gs1); + + Generator_System gs2; + gs2.insert(point()); + gs2.insert(ray(B)); + gs2.insert(ray(-A - B)); + C_Polyhedron ph2(gs2); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + ph2.BHRZ03_widening_assign(ph1); + + C_Polyhedron known_result(2); + known_result.add_constraint(A <= 0); + + bool ok = (ph2 == known_result); + + print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***"); + + return ok; +} + +bool +test02() { + Variable A(0); + Variable B(1); + + Generator_System gs1; + gs1.insert(point()); + gs1.insert(ray(-A)); + gs1.insert(ray(-A - B)); + C_Polyhedron ph1(gs1); + + Generator_System gs2; + gs2.insert(point()); + gs2.insert(ray(-A)); + gs2.insert(ray(A - B)); + C_Polyhedron ph2(gs2); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + ph2.BHRZ03_widening_assign(ph1); + + C_Polyhedron known_result(2); + known_result.add_constraint(B <= 0); + + bool ok = (ph2 == known_result); + + print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***"); + + return ok; +} + +bool +test03() { + Variable A(0); + Variable B(1); + + Generator_System gs1; + gs1.insert(point()); + gs1.insert(ray(-B)); + gs1.insert(ray(A - B)); + C_Polyhedron ph1(gs1); + + Generator_System gs2; + gs2.insert(point()); + gs2.insert(ray(-B)); + gs2.insert(ray(A + B)); + C_Polyhedron ph2(gs2); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + ph2.BHRZ03_widening_assign(ph1); + + C_Polyhedron known_result(2); + known_result.add_constraint(A >= 0); + + bool ok = (ph2 == known_result); + + print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***"); + + return ok; +} + +bool +test04() { + Variable A(0); + Variable B(1); + + Generator_System gs1; + gs1.insert(point()); + gs1.insert(ray(-A)); + gs1.insert(ray(-A + B)); + C_Polyhedron ph1(gs1); + + Generator_System gs2; + gs2.insert(point()); + gs2.insert(ray(-A)); + gs2.insert(ray(A + B)); + C_Polyhedron ph2(gs2); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + ph2.BHRZ03_widening_assign(ph1); + + C_Polyhedron known_result(2); + known_result.add_constraint(B >= 0); + + bool ok = (ph2 == known_result); + + print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***"); + + return ok; +} + +bool +test05() { + Variable A(0); + Variable B(1); + + Generator_System gs1; + gs1.insert(point()); + gs1.insert(ray(-B)); + gs1.insert(ray(-A - B)); + C_Polyhedron ph1(gs1); + + Generator_System gs2; + gs2.insert(point()); + gs2.insert(ray(-B)); + gs2.insert(ray(-A + B)); + C_Polyhedron ph2(gs2); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + ph2.BHRZ03_widening_assign(ph1); + + C_Polyhedron known_result(2); + known_result.add_constraint(A <= 0); + + bool ok = (ph2 == known_result); + + print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***"); + + return ok; +} + +bool +test06() { + Variable A(0); + Variable B(1); + + Generator_System gs1; + gs1.insert(point()); + gs1.insert(ray(A)); + gs1.insert(ray(A - B)); + C_Polyhedron ph1(gs1); + + Generator_System gs2; + gs2.insert(point()); + gs2.insert(ray(A)); + gs2.insert(ray(-A - B)); + C_Polyhedron ph2(gs2); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + ph2.BHRZ03_widening_assign(ph1); + + C_Polyhedron known_result(2); + known_result.add_constraint(B <= 0); + + bool ok = (ph2 == known_result); + + print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***"); + + return ok; +} + +bool +test07() { + Variable A(0); + Variable B(1); + + Generator_System gs1; + gs1.insert(point()); + gs1.insert(ray(B)); + gs1.insert(ray(A + B)); + C_Polyhedron ph1(gs1); + + Generator_System gs2; + gs2.insert(point()); + gs2.insert(ray(B)); + gs2.insert(ray(A - B)); + C_Polyhedron ph2(gs2); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + ph2.BHRZ03_widening_assign(ph1); + + C_Polyhedron known_result(2); + known_result.add_constraint(A >= 0); + + bool ok = (ph2 == known_result); + + print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + DO_TEST(test06); + DO_TEST(test07); +END_MAIN diff --git a/tests/Polyhedron/bhrz03widening3.cc b/tests/Polyhedron/bhrz03widening3.cc new file mode 100644 index 0000000..c436a75 --- /dev/null +++ b/tests/Polyhedron/bhrz03widening3.cc @@ -0,0 +1,646 @@ +/* Test Polyhedron::BHRZ03_widening_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + NNC_Polyhedron ph1(2); + ph1.add_constraint(B >= 0); + ph1.add_constraint(A + B > 0); + ph1.add_constraint(A - B < 1); + + NNC_Polyhedron ph2(2); + ph2.add_constraint(B >= 0); + ph2.add_constraint(A > 0); + ph2.add_constraint(A < 1); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + ph1.BHRZ03_widening_assign(ph2); + + NNC_Polyhedron known_result(2); + known_result.add_constraint(B >= 0); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after BHRZ03_widening_assign ***"); + + return ok; +} + +bool +test02() { + Variable A(0); + Variable B(1); + Variable C(2); + + Generator_System gs1; + gs1.insert(point(A)); + gs1.insert(closure_point()); + gs1.insert(ray(A)); + gs1.insert(ray(B)); + gs1.insert(ray(A + B + 2*C)); + NNC_Polyhedron ph1(gs1); + + Generator_System gs2; + gs2.insert(point(A)); + gs2.insert(closure_point()); + gs2.insert(ray(A)); + gs2.insert(ray(B)); + gs2.insert(ray(A + B + C)); + NNC_Polyhedron ph2(gs2); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + ph1.BHRZ03_widening_assign(ph2); + + NNC_Polyhedron known_result(3); + known_result.add_constraint(A > 0); + known_result.add_constraint(B >= 0); + known_result.add_constraint(C >= 0); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after BHRZ03_widening_assign ***"); + + return ok; +} + +Generator_System +aux1_test03(const Coefficient& half_side) { + // Square. + Variable A(0); + Variable B(1); + Generator_System gs; + gs.insert(point(half_side*A + half_side*B)); + gs.insert(point(half_side*A - half_side*B)); + gs.insert(point(-half_side*A - half_side*B)); + gs.insert(point(-half_side*A + half_side*B)); + return gs; +} + +Generator_System +aux2_test03(const Coefficient& half_diagonal) { + // Rhombus. + Variable A(0); + Variable B(1); + Generator_System gs; + gs.insert(point(half_diagonal*A)); + gs.insert(point(half_diagonal*B)); + gs.insert(point(-half_diagonal*A)); + gs.insert(point(-half_diagonal*B)); + return gs; +} + +C_Polyhedron +aux3_test03(unsigned n) { + + Coefficient half_diagonal = 2; + for (unsigned i = n / 8; i-- > 0; ) { + half_diagonal *= 2; + } + Coefficient half_side = half_diagonal; + + Generator_System gs; + if (n % 8 < 4) { + half_side /= 2; + gs = aux1_test03(half_side); + Generator_System gs2 = aux2_test03(half_diagonal); + Generator_System::const_iterator gi = gs2.begin(); + for (int i = n % 8; i-- > 0; ) + gs.insert(*gi++); + } + else { + gs = aux2_test03(half_diagonal); + Generator_System gs2 = aux1_test03(half_side); + Generator_System::const_iterator gi = gs2.begin(); + for (int i = n % 8 - 4; i-- > 0; ) + gs.insert(*gi++); + } + C_Polyhedron ph = C_Polyhedron(gs); + + return ph; +} + +bool +test03() { + // Chain condition for widenings: + // for each increasing chain of descriptions p_0, p_1, ..., p_i, ..., + // the sequence q_0, q_1, ..., q_i, ... defined by q_0 = p_0 and + // for each i >= 1, q_i = q_{i-1} \nabla p_i is ultimately stationary. + + // Initialization: set q_0. + C_Polyhedron q_i_minus_1 = aux3_test03(0); + + for (unsigned i = 1; i <= 100; ++i) { + print_generators(q_i_minus_1.generators(), + "*** Result of the previous iteration ***"); + + C_Polyhedron p_i = aux3_test03(i); + print_generators(p_i.generators(), "*** New stuff ***"); + + C_Polyhedron q_i = q_i_minus_1; + q_i.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. + const Coefficient& d1 = p1.divisor(); + const Coefficient& d2 = p2.divisor(); + Linear_Expression expr = d2 * Linear_Expression(p1); + expr += d1 * Linear_Expression(p2); + // The divisor for the average is 2 * d1 * d2. + // by carefully taking a smaller divisor, we obtain a point + // that won't be redundant in the polyhedron. + // NOTE: I am not *sure* this dirty kludge of using such + // a magic number will always succeed. + return point((magic_number+1)*expr, magic_number*2*d1*d2); +} + +Generator_System +aux3_test04(const Generator_System& gs, unsigned magic_number) { + // Double generators. + Generator_System new_gs; + Generator_System::const_iterator i = gs.begin(); + Generator_System::const_iterator gs_end = gs.end(); + while (true) { + const Generator& g = *i; + new_gs.insert(g); + ++i; + if (i != gs_end) + new_gs.insert(aux2_test04(g, *i, magic_number)); + else { + // Split the last segment. + Generator_System::const_iterator gs_begin = gs.begin(); + new_gs.insert(aux2_test04(g, *gs_begin, magic_number)); + break; + } + } + return new_gs; +} + +C_Polyhedron +aux4_test04(unsigned n) { + + unsigned needed_vertices = n + 4; + + unsigned magic_number = 1; + unsigned magic_factor = 4; + Generator_System gs = aux1_test04(); + unsigned gs_vertices = 4; + + while (gs_vertices * 2 <= needed_vertices) { + magic_number *= magic_factor; + gs = aux3_test04(gs, magic_number); + gs_vertices *= 2; + } + + if (gs_vertices < needed_vertices) { + magic_number *= magic_factor; + Generator_System gs2 = aux3_test04(gs, magic_number); + Generator_System::const_iterator gs2_i = gs2.begin(); + for ( ; gs_vertices < needed_vertices; ++gs_vertices) { + // Skip the even indexed vertices of gs2. + ++gs2_i; + // Add the odd indexed vertices of gs2. + gs.insert(*gs2_i++); + } + } + + C_Polyhedron ph = C_Polyhedron(gs); + return ph; +} + +bool +test04() { + // Chain condition for widenings: + // for each increasing chain of descriptions p_0, p_1, ..., p_i, ..., + // the sequence q_0, q_1, ..., q_i, ... defined by q_0 = p_0 and + // for each i >= 1, q_i = q_{i-1} \nabla p_i is ultimately stationary. + + // Initialization: set q_0. + C_Polyhedron q_i_minus_1 = aux4_test04(0); + + for (unsigned i = 1; i <= 100; ++i) { + print_generators(q_i_minus_1.generators(), + "*** Result of the previous iteration ***"); + + C_Polyhedron p_i = aux4_test04(i); + print_generators(p_i.generators(), "*** New stuff ***"); + + C_Polyhedron q_i = q_i_minus_1; + q_i.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 expr; + expr += Linear_Expression(r1); + expr += Linear_Expression(r2); + // NOTE: I am not *sure* this dirty kludge of using such + // a magic number will always succeed. + expr *= magic_number + 1; + expr -= C; + return ray(expr); +} + +Generator_System +aux3_test05(const Generator_System& gs, unsigned magic_number) { + // Double generators. + Generator_System new_gs; + Generator_System::const_iterator i = gs.begin(); + Generator_System::const_iterator gs_end = gs.end(); + while (true) { + const Generator& g = *i; + new_gs.insert(g); + ++i; + if (i != gs_end) + new_gs.insert(aux2_test05(g, *i, magic_number)); + else { + // Split the last facet. + Generator_System::const_iterator gs_begin = gs.begin(); + new_gs.insert(aux2_test05(g, *gs_begin, magic_number)); + break; + } + } + return new_gs; +} + +C_Polyhedron +aux4_test05(unsigned n) { + unsigned needed_facets = n + 4; + unsigned magic_number = 1; + unsigned magic_factor = 4; + Generator_System gs = aux1_test05(); + unsigned gs_facets = 4; + + while (gs_facets * 2 <= needed_facets) { + magic_number *= magic_factor; + gs = aux3_test05(gs, magic_number); + gs_facets *= 2; + } + + if (gs_facets < needed_facets) { + magic_number *= magic_factor; + Generator_System gs2 = aux3_test05(gs, magic_number); + Generator_System::const_iterator gs2_i = gs2.begin(); + for ( ; gs_facets < needed_facets; ++gs_facets) { + // Skip the even indexed facets of gs2. + ++gs2_i; + // Add the odd indexed facets of gs2. + gs.insert(*gs2_i++); + } + } + gs.insert(point()); + C_Polyhedron ph = C_Polyhedron(gs); + return ph; +} + +bool +test05() { + // Chain condition for widenings: + // for each increasing chain of descriptions p_0, p_1, ..., p_i, ..., + // the sequence q_0, q_1, ..., q_i, ... defined by q_0 = p_0 and + // for each i >= 1, q_i = q_{i-1} \nabla p_i is ultimately stationary. + // Variable A(0); + Variable B(1); + Variable C(2); + + // Initialization: set q_0. + C_Polyhedron q_i_minus_1 = aux4_test05(0); + + for (unsigned i = 1; i <= 100; ++i) { + print_generators(q_i_minus_1, "*** Result of the previous iteration ***"); + + C_Polyhedron p_i = aux4_test05(i); + print_generators(p_i, "*** New stuff ***"); + + C_Polyhedron q_i = q_i_minus_1; + q_i.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..59f9ecd --- /dev/null +++ b/tests/Polyhedron/bhz03widening1.cc @@ -0,0 +1,723 @@ +/* Test Pointset_Powerset::BHZ03_widening_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include + +namespace { + +using namespace Parma_Polyhedra_Library::IO_Operators; + +const C_Polyhedron& +aux1_test01(unsigned n) { + Variable x(0); + Variable y(1); + + static std::vector 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 +aux2_test01(unsigned n) { + Pointset_Powerset 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 T = aux2_test01(0); + + nout << "T0 = " << T << endl; + + bool converged = false; + for (unsigned n = 1; !converged && n <= 20; ++n) { + Pointset_Powerset Sn = aux2_test01(n); + + nout << "S" << n << " = " << Sn << endl; + + Sn.upper_bound_assign(T); + Sn.BHZ03_widening_assign + (T, widen_fun_ref(&Polyhedron::H79_widening_assign)); + + nout << "T" << n << " = " << Sn << endl; + + if (Sn.definitely_entails(T)) + converged = true; + else + std::swap(Sn, T); + } + + return converged; +} + +bool +test02() { + Variable A(0); + Variable B(1); + + C_Polyhedron p(2); + C_Polyhedron q(2); + C_Polyhedron r(2); + C_Polyhedron s(2); + p.add_constraint(A >= 1); + p.add_constraint(B == 0); + q.add_constraint(A >= 2); + q.add_constraint(A <= 7); + q.add_constraint(B == 1); + r.add_constraint(A >= 3); + r.add_constraint(A <= 8); + r.add_constraint(B == 1); + s.add_constraint(A >= 1); + s.add_constraint(A <= 6); + s.add_constraint(B == 1); + Pointset_Powerset P(2, EMPTY); + P.add_disjunct(p); + P.add_disjunct(q); + P.add_disjunct(r); + P.add_disjunct(s); + Pointset_Powerset Q(2, EMPTY); + Q.add_disjunct(p); + Q.add_disjunct(q); + Q.add_disjunct(s); + + nout << "P = " << P << endl + << "Q = " << Q << endl; + + Pointset_Powerset old_P = P; + P.BHZ03_widening_assign + (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 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 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 old_T2 = T2; + T2.BHZ03_widening_assign + (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 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 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 +aux2_test04(unsigned n) { + Pointset_Powerset 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 T = aux2_test04(0); + + nout << "T0 = " << T << endl; + + bool converged = false; + for (unsigned n = 1; !converged && n <= 20; ++n) { + Pointset_Powerset Sn = aux2_test04(n); + + nout << "S" << n << " = " << Sn << endl; + + Sn.upper_bound_assign(T); + Sn.BHZ03_widening_assign + (T, widen_fun_ref(&Polyhedron::H79_widening_assign)); + + nout << "T" << n << " = " << Sn << endl; + + if (Sn.definitely_entails(T)) + converged = true; + else + std::swap(Sn, T); + } + + return converged; +} + +bool +test05() { + Variable A(0); + Variable B(1); + + C_Polyhedron p(2); + C_Polyhedron q(2); + C_Polyhedron r(2); + C_Polyhedron s(2); + p.add_constraint(A >= 1); + p.add_constraint(B == 0); + q.add_constraint(A >= 2); + q.add_constraint(A <= 7); + q.add_constraint(B == 1); + r.add_constraint(A >= 3); + r.add_constraint(A <= 8); + r.add_constraint(B == 1); + s.add_constraint(A >= 1); + s.add_constraint(A <= 6); + s.add_constraint(B == 1); + Pointset_Powerset P(2, EMPTY); + P.add_disjunct(p); + P.add_disjunct(q); + P.add_disjunct(r); + P.add_disjunct(s); + Pointset_Powerset Q(2, EMPTY); + Q.add_disjunct(p); + Q.add_disjunct(q); + Q.add_disjunct(s); + + nout << "P = " << P << endl + << "Q = " << Q << endl; + + Pointset_Powerset old_P = P; + P.BHZ03_widening_assign + (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 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 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 old_T2 = T2; + T2.BHZ03_widening_assign + (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 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 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 T2(2, EMPTY); + T2.add_disjunct(q1); + T2.add_disjunct(q2); + T2.add_disjunct(q3); + + nout << "T1 = " << T1 << endl + << "T2 = " << T2 << endl; + + Pointset_Powerset old_T2 = T2; + T2.BHZ03_widening_assign + (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 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 T2(2, EMPTY); + T2.add_disjunct(q1); + T2.add_disjunct(q2); + T2.add_disjunct(q3); + + nout << "T1 = " << T1 << endl + << "T2 = " << T2 << endl; + + Pointset_Powerset old_T2 = T2; + T2.BHZ03_widening_assign + (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 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 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 old_T2 = T2; + T2.BHZ03_widening_assign + (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 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..d5de1c4 --- /dev/null +++ b/tests/Polyhedron/bounded1.cc @@ -0,0 +1,106 @@ +/* Test Polyhedron::is_bounded(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + // This is a non-bounded polyhedron. + C_Polyhedron ph1(2); + ph1.add_constraint(x >= 0); + + print_constraints(ph1, "*** ph1 ***"); + + return !ph1.is_bounded(); +} + +bool +test02() { + Variable x(0); + Variable y(1); + + // This is a bounded polyhedron (it is a square); + C_Polyhedron ph2(2); + ph2.add_constraint(x >= 2); + ph2.add_constraint(y >= 2); + ph2.add_constraint(x <= 4); + ph2.add_constraint(y <= 4); + + print_constraints(ph2, "*** ph2 ***"); + + return ph2.is_bounded(); +} + +bool +test03() { + Variable x(0); + Variable y(1); + + // This is a universal, zero-dimensional polyhedron. + C_Polyhedron ph3; + + print_constraints(ph3, "*** ph3 ***"); + + return ph3.is_bounded(); +} + +bool +test04() { + Variable x(0); + Variable y(1); + + // This is an empty, zero-dimensional polyhedron. + C_Polyhedron ph4; + ph4.add_constraint(Linear_Expression(-3) >= 0); + + print_constraints(ph4, "*** ph4 ***"); + + return ph4.is_bounded(); +} + +bool +test05() { + Variable x(0); + Variable y(1); + + // This is an empty polyhedron. + C_Polyhedron ph5(4, EMPTY); + + print_constraints(ph5, "*** ph5 ***"); + + return ph5.is_bounded(); +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); +END_MAIN diff --git a/tests/Polyhedron/boundedaffineimage1.cc b/tests/Polyhedron/boundedaffineimage1.cc new file mode 100644 index 0000000..224884f --- /dev/null +++ b/tests/Polyhedron/boundedaffineimage1.cc @@ -0,0 +1,249 @@ +/* Test Polyhedron::bounded_affine_image(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.add_constraint(A >= 0); + ph.add_constraint(A <= 4); + ph.add_constraint(B >= 0); + ph.add_constraint(B <= 4); + ph.add_constraint(A - B <= 2); + ph.add_constraint(A - B >= -2); + + print_constraints(ph, "*** ph ***"); + + C_Polyhedron kr1 = ph; + C_Polyhedron kr2 = ph; + + ph.bounded_affine_image(A, 7-B, B+3); + + kr1.generalized_affine_image(A, GREATER_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_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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..df67778 --- /dev/null +++ b/tests/Polyhedron/boundedaffinepreimage1.cc @@ -0,0 +1,124 @@ +/* Test Polyhedron::bounded_affine_preimage(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.add_constraint(A >= 0); + ph.add_constraint(A <= 4); + ph.add_constraint(B >= 0); + ph.add_constraint(B <= 4); + ph.add_constraint(A - B <= 2); + ph.add_constraint(A - B >= -2); + + print_constraints(ph, "*** ph ***"); + + // A longer way of computing the bounded affine preimage below. + C_Polyhedron known_result(ph); + known_result.add_space_dimensions_and_embed(1); + known_result.add_constraint(7-A <= B); + known_result.add_constraint(B <= A+3); + Variables_Set var_set; + var_set.insert(B); + known_result.remove_space_dimensions(var_set); + + ph.bounded_affine_preimage(B, 7-A, A+3); + + bool ok = (ph == known_result); + + print_generators(ph, "*** ph.bounded_affine_preimage(B, 7-A, A+3) ***"); + + return ok; +} + +bool +test02() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.add_constraint(A >= 0); + ph.add_constraint(A <= 4); + ph.add_constraint(B >= 0); + ph.add_constraint(B <= 4); + ph.add_constraint(A - B <= 2); + ph.add_constraint(A - B >= -2); + + print_constraints(ph, "*** ph ***"); + + // A longer way of computing the bounded affine preimage below. + C_Polyhedron known_result(ph); + known_result.add_space_dimensions_and_embed(1); + Variable C(2); + known_result.add_constraint(7 - 3*A + 2*C <= B); + known_result.add_constraint(B <= C + 5*A - 3); + Variables_Set var_set; + var_set.insert(B); + known_result.remove_space_dimensions(var_set); + + ph.bounded_affine_preimage(B, 7-3*A+2*B, B+5*A-3); + + bool ok = (ph == known_result); + + print_generators(ph, "*** " + "ph.bounded_affine_preimage(B, 7-3*A+2*B, B+5*A-3) ***"); + + return ok; +} + +bool +test03() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.add_constraint(A >= 0); + ph.add_constraint(A <= 4); + ph.add_constraint(A == B); + + print_constraints(ph, "*** ph ***"); + + ph.bounded_affine_preimage(A, B+5, A-3); + + C_Polyhedron known_result(2, EMPTY); + + bool ok = (ph == known_result); + + print_generators(ph, "*** ph.bounded_affine_preimage(A, B+5, A-3) ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST_F8(test02); + DO_TEST(test03); +END_MAIN diff --git a/tests/Polyhedron/boundedbhrz03extrapolation1.cc b/tests/Polyhedron/boundedbhrz03extrapolation1.cc new file mode 100644 index 0000000..eeb3ed0 --- /dev/null +++ b/tests/Polyhedron/boundedbhrz03extrapolation1.cc @@ -0,0 +1,152 @@ +/* Test Polyhedron::bounded_BHRZ03_extrapolation_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +#define PROPAGATION_STEPS 1 +#define NUMBER_OF_TOKENS 1 + +namespace { + +void +aux_test01(std::ostream& s, const Variable& v) { + s << char('i' + v.id()); +} + +bool +test01() { + Variable::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..c5b0010 --- /dev/null +++ b/tests/Polyhedron/boundedh79extrapolation1.cc @@ -0,0 +1,74 @@ +/* Test Polyhedron::bounded_H79_extrapolation_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + C_Polyhedron ph1(2); + ph1.add_constraint(x-3 >= 0); + ph1.add_constraint(x-3 <= 1); + ph1.add_constraint(y >= 0); + ph1.add_constraint(y <= 1); + + print_constraints(ph1, "*** ph1 ***"); + + C_Polyhedron ph2(2); + ph2.add_constraint(2*x-5 >= 0); + ph2.add_constraint(x-3 <= 1); + ph2.add_constraint(2*y+3 >= 0); + ph2.add_constraint(2*y-5 <= 0); + + print_constraints(ph2, "*** ph2 ***"); + + Constraint_System cs; + cs.insert(x >= y); + + print_constraints(cs, "*** cs ***"); + + ph2.bounded_H79_extrapolation_assign(ph1, cs); + + C_Polyhedron known_result(2); + known_result.add_constraint(x >= 2); + known_result.add_constraint(x <= 4); + known_result.add_constraint(y >= -2); + known_result.add_constraint(x >= y); + + bool ok = (ph2 == known_result); + + print_constraints(ph2, + "*** after ph2.bounded_H79_extrapolation_assign(ph1, cs) " + "***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST_F8A(test01); +END_MAIN diff --git a/tests/Polyhedron/bounds1.cc b/tests/Polyhedron/bounds1.cc new file mode 100644 index 0000000..b3cdb63 --- /dev/null +++ b/tests/Polyhedron/bounds1.cc @@ -0,0 +1,64 @@ +/* Test Polyhedron::bounds_from_below() and Polyhedron::bounds_from_above(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + + C_Polyhedron ph1; + C_Polyhedron ph2(2, EMPTY); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + bool ok = ph1.bounds_from_above(Linear_Expression(3)) + && ph2.bounds_from_below(A); + + return ok; +} + +bool +test02() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.add_constraint(A >= 1); + ph.add_constraint(B >= 1); + + print_constraints(ph, "*** ph ***"); + + bool ok = !ph.bounds_from_above(A + B) && ph.bounds_from_below(A + B); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); +END_MAIN diff --git a/tests/Polyhedron/cnncconversion1.cc b/tests/Polyhedron/cnncconversion1.cc new file mode 100644 index 0000000..c69c638 --- /dev/null +++ b/tests/Polyhedron/cnncconversion1.cc @@ -0,0 +1,153 @@ +/* Test conversions between C_Polyhedron and NNC_Polyhedron. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1(2); + ph1.add_constraint(A - B >= 0); + ph1.add_constraint(A >= 0); + + print_constraints(ph1, "*** ph1 ***"); + + NNC_Polyhedron ph2(ph1); + + NNC_Polyhedron known_result(2); + known_result.add_constraint(A - B >= 0); + known_result.add_constraint(A >= 0); + + bool ok = (ph2 == known_result); + + print_constraints(ph2, "*** ph2 ***"); + + return ok; +} + +bool +test02() { + Variable x(0); + Variable y(1); + + NNC_Polyhedron ph1(3); + ph1.add_constraint(x >= 5); + ph1.add_constraint(y > x - 3); + + print_constraints(ph1, "*** ph1 ***"); + + C_Polyhedron ph2(ph1); + + print_constraints(ph2, "*** ph2 ***"); + + C_Polyhedron known_result(3); + known_result.add_constraint(x >= 5); + known_result.add_constraint(y >= x - 3); + + return ph2 == known_result; +} + +bool +test03() { + Variable A(0); + Variable B(1); + + NNC_Polyhedron ph1(2); + ph1.add_constraint(A < 2); + ph1.add_constraint(B > 0); + ph1.add_constraint(A - B > 0); + + print_constraints(ph1, "*** ph1 ***"); + + C_Polyhedron ph2(ph1); + + print_constraints(ph2, "*** ph2 ***"); + + C_Polyhedron known_result(2); + known_result.add_constraint(A <= 2); + known_result.add_constraint(B >= 0); + known_result.add_constraint(A - B >= 0); + + return ph2 == known_result; +} + +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..e468d9e --- /dev/null +++ b/tests/Polyhedron/concatenate1.cc @@ -0,0 +1,283 @@ +/* Test Polyhedron::concatenate_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + Variable z(2); + Variable w(3); + Constraint_System cs1; + cs1.insert(x >= 0); + cs1.insert(y >= 0); + cs1.insert(x - y >= 0); + C_Polyhedron ph(cs1); + + print_constraints(ph, "*** ph before ***"); + + Constraint_System cs2; + cs2.insert(x >= 1); + cs2.insert(y >= 1); + cs2.insert(x - y >= -1); + C_Polyhedron qh(cs2); + + C_Polyhedron copy_ph = ph; + + ph.concatenate_assign(qh); + + copy_ph.add_space_dimensions_and_embed(2); + copy_ph.add_constraint(z >= 1); + copy_ph.add_constraint(w >= 1); + copy_ph.add_constraint(z - w >= -1); + + bool ok = (ph == copy_ph); + + print_constraints(ph, "*** concatenate_assign ***"); + print_constraints(copy_ph, "*** embed + renaming + insert ***"); + + return ok; +} + +bool +test02() { + Variable x(0); + Variable y(1); + + C_Polyhedron ph(2, EMPTY); + + print_constraints(ph, "*** ph ***"); + + Constraint_System cs; + cs.insert(x >= y); + cs.insert(x >= 2); + C_Polyhedron qh(cs); + + print_constraints(qh, "*** qh ***"); + + ph.concatenate_assign(qh); + + C_Polyhedron known_result(4, EMPTY); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** after concatenate_assign(qh) ***"); + + return ok; +} + +bool +test03() { + Variable x(0); + Variable y(1); + + C_Polyhedron ph; + + print_constraints(ph, "*** ph ***"); + + Constraint_System cs; + cs.insert(x - 3 >= y); + cs.insert(y >= 0); + C_Polyhedron qh(cs); + + print_constraints(qh, "*** qh ***"); + + ph.concatenate_assign(qh); + + bool ok = (ph == qh); + + print_constraints(ph, "*** after concatenate_assign(qh) ***"); + + return ok; +} + +bool +test04() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + + Generator_System gs1; + gs1.insert(point()); + gs1.insert(point(2*A)); + gs1.insert(point(2*B)); + gs1.insert(point(2*A + 2*B)); + C_Polyhedron ph1(gs1); + + Generator_System gs2; + gs2.insert(point(2*A)); + gs2.insert(point(2*A + 3*B)); + C_Polyhedron ph2(gs2); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + ph1.concatenate_assign(ph2); + + C_Polyhedron known_result(4); + known_result.add_constraint(A >= 0); + known_result.add_constraint(B >= 0); + known_result.add_constraint(A <= 2); + known_result.add_constraint(B <= 2); + known_result.add_constraint(C == 2); + known_result.add_constraint(D >= 0); + known_result.add_constraint(D <= 3); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after concatenate_assign(ph2) ***"); + + return ok; +} + +bool +test05() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1(2); + ph1.add_constraint(B >= 0); + ph1.add_constraint(A - B >= 0); + + C_Polyhedron ph2; + + C_Polyhedron known_result(ph1); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + ph1.concatenate_assign(ph2); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after ph1.concatenate_assign(ph2) ***"); + + return ok; +} + +bool +test06() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1(1); + ph1.generators(); + ph1.add_constraint(A >= 0); + + C_Polyhedron ph2(1); + ph2.generators(); + ph2.add_constraint(A == 2); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + ph1.concatenate_assign(ph2); + + C_Polyhedron known_result(2); + known_result.add_constraint(A >= 0); + known_result.add_constraint(B == 2); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after ph1.concatenate_assign(ph2) ***"); + + return ok; +} + +bool +test07() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1(1, EMPTY); + ph1.add_generator(point()); + ph1.constraints(); + ph1.add_generator(ray(A)); + + C_Polyhedron ph2(1, EMPTY); + ph2.add_generator(point(2*A)); + ph2.constraints(); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + ph1.concatenate_assign(ph2); + + C_Polyhedron known_result(2); + known_result.add_constraint(A >= 0); + known_result.add_constraint(B == 2); + + bool ok = (ph1 == known_result); + + print_generators(ph1, "*** after ph1.concatenate_assign(ph2) ***"); + + return ok; +} + +bool +test08() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1(1); + ph1.add_constraint(A >= 0); + ph1.add_constraint(-A >= -2); + ph1.generators(); + ph1.add_generator(point(0*A)); + ph1.add_generator(point(2*A)); + + C_Polyhedron ph2(1, EMPTY); + ph2.add_generator(point(10*A)); + + print_constraints(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + ph1.concatenate_assign(ph2); + + C_Polyhedron known_result(2); + known_result.add_constraint(A >= 0); + known_result.add_constraint(-A >= -2); + known_result.add_constraint(B == 10); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after ph1.concatenate_assign(ph2) ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + DO_TEST(test06); + DO_TEST(test07); + DO_TEST(test08); +END_MAIN diff --git a/tests/Polyhedron/congruences1.cc b/tests/Polyhedron/congruences1.cc new file mode 100644 index 0000000..aefb9ce --- /dev/null +++ b/tests/Polyhedron/congruences1.cc @@ -0,0 +1,364 @@ +/* Test C_Polyhedron(Congruence_System&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Empty 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..e89b08e --- /dev/null +++ b/tests/Polyhedron/constrains1.cc @@ -0,0 +1,232 @@ +/* Test Polyhedron::constrains(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +#define 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_and_minimize(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..b247412 --- /dev/null +++ b/tests/Polyhedron/constraints1.cc @@ -0,0 +1,165 @@ +/* Test Polyhedron::constraints(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + + C_Polyhedron ph1(2); + ph1.add_constraint(0*A == 1); + + print_constraints(ph1, "*** 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_and_minimize(A >= 0); + ph.add_constraint(B >= 0); + + print_constraints(ph, "*** ph ***"); + + Constraint_System cs = ph.constraints(); + cs.insert(A >= B); + + print_constraints(cs, "*** cs ***"); + + C_Polyhedron known_result(2); + known_result.add_constraint(A >= 0); + known_result.add_constraint(B >= 0); + known_result.add_constraint(A >= B); + + return C_Polyhedron(cs) == known_result; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + DO_TEST(test06); +END_MAIN diff --git a/tests/Polyhedron/contains1.cc b/tests/Polyhedron/contains1.cc new file mode 100644 index 0000000..b397842 --- /dev/null +++ b/tests/Polyhedron/contains1.cc @@ -0,0 +1,114 @@ +/* Test Polyhedron::contains(const Polyhedron&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + C_Polyhedron segment(2); + segment.add_constraint(x >= 0); + segment.add_constraint(x <= 1); + segment.add_constraint(y == 0); + + print_constraints(segment, "*** segment constraints ***"); + print_generators(segment, "*** segment generators ***"); + + C_Polyhedron halfline(2); + halfline.add_constraint(x >= 0); + halfline.add_constraint(y == 0); + + print_constraints(halfline, "*** halfline constraints ***"); + print_generators(halfline, "*** halfline generators ***"); + + bool segment_includes_halfline = segment.contains(halfline); + + nout << "segment "; + if (segment_includes_halfline) + nout << "includes "; + else + nout << "does not include "; + nout << "or is equal to halfline" << endl; + + bool halfline_includes_segment = halfline.contains(segment); + + nout << "halfline "; + if (halfline_includes_segment) + nout << "includes "; + else + nout << "does not include "; + nout << "or is equal to segment" << endl; + + return halfline_includes_segment && !segment_includes_halfline; +} + +bool +test02() { + Variable x(0); + Variable y(1); + + Constraint_System cs; + cs.insert(x + 0*y >= 2); + C_Polyhedron p_half_space(cs); + + print_constraints(p_half_space, "*** p_half_space constraints ***"); + print_generators(p_half_space, "*** p_half_space generators ***"); + + Generator_System gs; + gs.insert(point(2*x)); + gs.insert(line(x+y)); + C_Polyhedron p_line(gs); + + print_constraints(p_line, "*** p_line constraints ***"); + print_generators(p_line, "*** p_line generators ***"); + + bool p_half_space_includes_p_line = p_half_space.contains(p_line); + + nout << "p_half_space "; + if (p_half_space_includes_p_line) + nout << "includes "; + else + nout << "does not include "; + nout << "or is equal to p_line" << endl; + + bool p_line_includes_p_half_space = p_line.contains(p_half_space); + + nout << "p_line "; + if (p_line_includes_p_half_space) + nout << "includes "; + else + nout << "does not include "; + nout << "or is equal to p_half_space" << endl; + + return !p_line_includes_p_half_space && !p_half_space_includes_p_line; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); +END_MAIN diff --git a/tests/Polyhedron/contains2.cc b/tests/Polyhedron/contains2.cc new file mode 100644 index 0000000..ff55eec --- /dev/null +++ b/tests/Polyhedron/contains2.cc @@ -0,0 +1,176 @@ +/* Test NNC_Polyhedron::contains(const Polyhedron&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + // Building a square without vertices. + Constraint_System cs; + cs.insert(x >= 0); + cs.insert(x <= 1); + cs.insert(y >= 0); + cs.insert(y <= 1); + cs.insert(x + y > 0); + cs.insert(x + y < 2); + cs.insert(x - y < 1); + cs.insert(x - y > -1); + + NNC_Polyhedron ph1(cs); + + // Building an equivalent square. + Generator_System gs; + gs.insert(closure_point()); + gs.insert(closure_point(x)); + gs.insert(closure_point(y)); + gs.insert(closure_point(x + y)); + gs.insert(point(x, 10)); + gs.insert(point(y, 10)); + gs.insert(point(x + 10*y, 10)); + gs.insert(point(10*x + y, 10)); + + NNC_Polyhedron ph2(gs); + + bool ok = ph1.contains(ph2); + + return ok; +} + +bool +test02() { + Variable A(0); + Variable B(1); + + NNC_Polyhedron ph1(2); + ph1.add_constraint(A > 0); + ph1.add_constraint(B > 0); + + Generator_System gs2; + gs2.insert(point()); + gs2.insert(line(A + B)); + NNC_Polyhedron ph2(gs2); + + print_constraints(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + bool ok = !ph1.contains(ph2); + + return ok; +} + +bool +test03() { + Variable A(0); + Variable B(1); + + Constraint_System cs; + cs.insert(A >= B); + cs.insert(B >= 0); + C_Polyhedron ph1(cs); + C_Polyhedron ph2(ph1); + ph2.add_constraint(A == B); + + bool ok = ph1.contains(ph2); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + return ok; +} + +bool +test04() { + Variable A(0); + Variable B(1); + + Constraint_System cs; + cs.insert(A >= B); + cs.insert(B >= 0); + NNC_Polyhedron ph1(cs); + NNC_Polyhedron ph2(ph1); + ph2.add_constraint(A > B); + + bool ok = ph1.strictly_contains(ph2); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + return ok; +} + +bool +test05() { + Variable A(0); + Variable B(1); + + Constraint_System cs1; + cs1.insert(A >= B); + cs1.insert(B >= 0); + C_Polyhedron ph1(cs1); + Constraint_System cs2; + cs2.insert(A >= B); + cs2.insert(A <= 0); + C_Polyhedron ph2(cs2); + + bool ok = (ph1 != ph2); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + return ok; +} + +bool +test06() { + Variable A(0); + Variable B(1); + + Constraint_System cs; + cs.insert(A >= 0); + cs.insert(B >= 0); + NNC_Polyhedron ph1(cs); + NNC_Polyhedron ph2(ph1); + ph2.add_constraint(A > 0); + + bool ok = ph1.strictly_contains(ph2); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + DO_TEST(test06); +END_MAIN diff --git a/tests/Polyhedron/containsintegerpoint1.cc b/tests/Polyhedron/containsintegerpoint1.cc new file mode 100644 index 0000000..3fba78b --- /dev/null +++ b/tests/Polyhedron/containsintegerpoint1.cc @@ -0,0 +1,175 @@ +/* Test C_Polyhedron::contains_integer_point(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + Constraint_System 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..164d9eb --- /dev/null +++ b/tests/Polyhedron/disjoint1.cc @@ -0,0 +1,145 @@ +/* Test Polyhedron::is_disjoint_from(const Polyhedron& y). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1(2); + ph1.add_constraint(B == 0); + ph1.add_constraint(A >= 1); + ph1.add_constraint(A <= 2); + + C_Polyhedron ph2(2); + ph2.add_constraint(A == 0); + ph2.add_constraint(B >= 1); + ph2.add_constraint(B <= 2); + + bool ok = ph1.is_disjoint_from(ph2); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + return ok; +} + +C_Polyhedron +half_strip(const Generator& p, const Linear_Expression& e) { + assert(p.is_point()); + + Linear_Expression e1(p); + e1 += 3*Variable(0); + + Generator_System gs; + gs.insert(p); + gs.insert(ray(e)); + gs.insert(point(e1, p.divisor())); + C_Polyhedron ph(gs); + return ph; +} + +bool +test02() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1 = half_strip(point(A + B), B); + + C_Polyhedron ph2(2, EMPTY); + ph2.add_generator(point(2*A + B)); + ph2.add_generator(point(4*A + 3*B)); + ph2.add_generator(ray(A - B)); + + bool disjoint = ph1.is_disjoint_from(ph2); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + return !disjoint; +} + +bool +test03() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1 = half_strip(point(A + B), B); + C_Polyhedron ph2 = half_strip(point(4*A + B), B); + + bool disjoint = ph1.is_disjoint_from(ph2); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + return !disjoint; +} + +bool +test04() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1 = half_strip(point(A + B), B); + C_Polyhedron ph2 = half_strip(point(A + B), -B); + + bool disjoint = ph1.is_disjoint_from(ph2); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + return !disjoint; +} + +bool +test05() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1 = half_strip(point(), B); + + C_Polyhedron ph2(2, EMPTY); + ph2.add_generator(point(2*A - 2*B)); + ph2.add_generator(point(-2*A + 2*B)); + ph2.add_generator(ray(-A - B)); + + bool disjoint = ph1.is_disjoint_from(ph2); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + return !disjoint; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); +END_MAIN diff --git a/tests/Polyhedron/disjoint2.cc b/tests/Polyhedron/disjoint2.cc new file mode 100644 index 0000000..b68c1c9 --- /dev/null +++ b/tests/Polyhedron/disjoint2.cc @@ -0,0 +1,132 @@ +/* Test Polyhedron::is_disjoint_from(const Polyhedron& y). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +NNC_Polyhedron +half_strip(const Generator& p, + const Linear_Expression& e, + bool closed = true) { + assert((p.is_point() && closed) || (p.is_closure_point() && ! closed)); + + Linear_Expression e1(p); + e1 += 3*Variable(0); + + Generator_System gs; + gs.insert(p); + gs.insert(ray(e)); + if (closed) + gs.insert(point(e1, p.divisor())); + else { + gs.insert(closure_point(e1, p.divisor())); + e1 -= Variable(0); + e1 += e.coefficient(Variable(1)) * p.divisor() * Variable(1); + gs.insert(point(e1)); + } + NNC_Polyhedron ph(gs); + return ph; +} + +bool +test01() { + Variable A(0); + Variable B(1); + + NNC_Polyhedron ph1 = half_strip(point(A + B), B); + + NNC_Polyhedron ph2(2, EMPTY); + ph2.add_generator(point(3*A + B)); + ph2.add_generator(closure_point(2*A + B)); + ph2.add_generator(closure_point(4*A + 3*B)); + ph2.add_generator(ray(A - B)); + + bool disjoint = ph1.is_disjoint_from(ph2); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + return !disjoint; +} + +bool +test02() { + Variable A(0); + Variable B(1); + + NNC_Polyhedron ph1 = half_strip(point(A + B), B); + NNC_Polyhedron ph2 = half_strip(closure_point(4*A + B), B, false); + + bool disjoint = ph1.is_disjoint_from(ph2); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + return disjoint; +} + +bool +test03() { + Variable A(0); + Variable B(1); + + NNC_Polyhedron ph1 = half_strip(point(A + B), B); + NNC_Polyhedron ph2 = half_strip(closure_point(A + B), -B, false); + + bool disjoint = ph1.is_disjoint_from(ph2); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + return disjoint; +} + +bool +test04() { + Variable A(0); + Variable B(1); + + NNC_Polyhedron ph1 = half_strip(point(), B); + + NNC_Polyhedron ph2(2, EMPTY); + ph2.add_generator(point(-2*A - 2*B)); + ph2.add_generator(closure_point(2*A - 2*B)); + ph2.add_generator(closure_point(-2*A + 2*B)); + ph2.add_generator(ray(-A - B)); + + bool disjoint = ph1.is_disjoint_from(ph2); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + return disjoint; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); +END_MAIN diff --git a/tests/Polyhedron/dualhypercubes.cc b/tests/Polyhedron/dualhypercubes.cc new file mode 100644 index 0000000..c0f08d6 --- /dev/null +++ b/tests/Polyhedron/dualhypercubes.cc @@ -0,0 +1,391 @@ +/* Exploit smf when computing the intersection of NNC dual hypercubes. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include "timings.hh" +#include +#include + +// 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& 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& 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 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, 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..c489331 --- /dev/null +++ b/tests/Polyhedron/empty1.cc @@ -0,0 +1,50 @@ +/* Different ways of creating an empty polyhedron. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + // This is the easy way to create + // the empty polyhedron in the zero-dimension space. + C_Polyhedron ph1(0, EMPTY); + + // This is a more convoluted way of doing the same thing + // using an empty system of generators. + Generator_System gs; + C_Polyhedron ph2(gs); + + bool ok = (ph1 == ph2 && ph1.is_empty() && ph2.is_empty()); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); +END_MAIN diff --git a/tests/Polyhedron/equals1.cc b/tests/Polyhedron/equals1.cc new file mode 100644 index 0000000..345409b --- /dev/null +++ b/tests/Polyhedron/equals1.cc @@ -0,0 +1,61 @@ +/* Test operator==(const Polyhedron&, const Polyhedron&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1(2); + ph1.add_constraint(100*A-100*B <= 0); + ph1.add_constraint(-100*A <= -300); + ph1.add_constraint(-100*B <= -300); + ph1.add_constraint(100*A <= 30400); + ph1.add_constraint(100*B <= 30400); + ph1.add_constraint(-258*A+209*B <= 7093); + ph1.add_constraint(258*A-209*B <= 8907); + ph1.add_constraint(151*A-214*B <= 5393); + ph1.add_constraint(-151*A+214*B <= 10606); + + C_Polyhedron ph2(2); + ph2.add_constraint(258*A - 209*B >= -7093); + ph2.add_constraint(151*A - 214*B >= -10606); + ph2.add_constraint(A >= 3); + ph2.add_constraint(-A + B >= 0); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + bool ok = (ph1 == ph2); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST_F32(test01); +END_MAIN diff --git a/tests/Polyhedron/exceptions1.cc b/tests/Polyhedron/exceptions1.cc new file mode 100644 index 0000000..a4c577d --- /dev/null +++ b/tests/Polyhedron/exceptions1.cc @@ -0,0 +1,1461 @@ +/* Test that the right exceptions are thrown in case of incorrect uses. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + Variable z(2); + + 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 function + // C_Polyhedron::intersection_assign_and_minimize(ph2): it is illegal + // to apply this function to two polyhedra of different dimensions. + ph1.intersection_assign_and_minimize(ph2); + } + 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 polyhedron 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_and_minimize(gs): it is illegal + // to add a system of generator that is not dimension-compatible + // with the polyhedron. + Generator_System gs; + gs.insert(point(w)); + ph.add_generators_and_minimize(gs); + } + 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_and_minimize(cs): it is illegal to + // add a system of constraints that is not dimensional incompatible + // with the polyhedron. + Constraint_System cs; + cs.insert(x - y >= 0); + ph.add_constraints_and_minimize(cs); + } + 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_and_minimize(gs): it is illegal + // to apply this function with a system of generators with no + // points to an empty polyhedron. + Generator_System gs; + gs.insert(line(x)); + gs.insert(line(y)); + ph.add_generators_and_minimize(gs); + } + 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_and_minimize(gs)': it is illegal to + // add a system of generators that does not contain points + // to an empty polyhedron. + ph.add_generators_and_minimize(gs); + } + 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 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..faa5fb9 --- /dev/null +++ b/tests/Polyhedron/exceptions2.cc @@ -0,0 +1,912 @@ +/* Test that the right exceptions are thrown in case of incorrect uses. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + Constraint_System 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_and_minimize(cs): it is illegal to add a system of + // constraints that contains strict-inequalities to a closed polyhedron. + ph.add_constraints_and_minimize(cs); + } + 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_and_minimize(gs): it is illegal to add a + // system of generators that contains closure-points to a closed + // polyhedron. + ph.add_generators_and_minimize(gs); + } + 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_and_minimize': it is illegal to apply + // to a closed polyhedron and a non-closed polyhedron. + ph1.intersection_assign_and_minimize(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_and_minimize(gs)': it is illegal to + // add a system of generators that does not contain points + // to an empty zero-dimensional polyhedron. + ph.add_generators_and_minimize(gs); + } + 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. + ph1.swap(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); +#ifndef __alpha__ + // Exception handling is broken in GCC on the Alpha. + DO_TEST(test19); +#endif + 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..b8d784f --- /dev/null +++ b/tests/Polyhedron/exceptions3.cc @@ -0,0 +1,234 @@ +/* Test that the right exceptions are thrown in case of incorrect uses. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + 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..7593460 --- /dev/null +++ b/tests/Polyhedron/expandspacedim1.cc @@ -0,0 +1,268 @@ +/* Test Polyhedron::expand_space_dimension(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Test with a universe polyhedron. +bool +test01() { + Variable A(0); + + C_Polyhedron ph1(3); + + print_constraints(ph1, "*** ph1 ***"); + + ph1.expand_space_dimension(A, 1); + + C_Polyhedron known_result(4); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after ph1.expand_space_dimension(A, 1) ***"); + + return ok; +} + +// Test with an empty polyhedron. +bool +test02() { + // Variable A(0); + Variable B(1); + + C_Polyhedron ph1(3, EMPTY); + + print_constraints(ph1, "*** ph1 ***"); + + ph1.expand_space_dimension(B, 1); + + C_Polyhedron known_result(4, EMPTY); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after ph1.expand_space_dimension(B, 1) ***"); + + return ok; +} + +// Test trivial expansion. +bool +test03() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + Variable E(4); + + C_Polyhedron ph1(2); + ph1.add_constraint(A >= 0); + ph1.add_constraint(A + B <= 2); + + print_constraints(ph1, "*** ph1 ***"); + + ph1.expand_space_dimension(A, 0); + + C_Polyhedron known_result(2); + known_result.add_constraint(A >= 0); + known_result.add_constraint(A + B <= 2); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after ph1.expand_space_dimension(A, 0) ***"); + + return ok; +} + +// Test with given generators. +bool +test04() { + Variable A(0); + Variable B(1); + Variable C(2); + + C_Polyhedron ph1(2, EMPTY); + ph1.add_generator(point(A)); + ph1.add_generator(point(A + B)); + ph1.add_generator(point(B)); + + print_generators(ph1, "*** ph1 ***"); + + ph1.expand_space_dimension(A, 1); + + C_Polyhedron known_result(3, EMPTY); + known_result.add_generator(point(A + C)); + known_result.add_generator(point(A + B)); + known_result.add_generator(point(A + B + C)); + known_result.add_generator(point(B)); + known_result.add_generator(point(B + C)); + + bool ok = (ph1 == known_result); + + print_generators(ph1, "*** after ph1.expand_space_dimension(A, 1) ***"); + + return ok; +} + +// Test with given constraints. +bool +test05() { + Variable A(0); + Variable B(1); + Variable C(2); + + C_Polyhedron ph1(2); + ph1.add_constraint(A >= 0); + ph1.add_constraint(A + B <= 2); + + print_constraints(ph1, "*** ph1 ***"); + + ph1.expand_space_dimension(A, 1); + + C_Polyhedron known_result(3); + known_result.add_constraint(A >= 0); + known_result.add_constraint(A + B <= 2); + known_result.add_constraint(C >= 0); + known_result.add_constraint(C + B <= 2); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after ph1.expand_space_dimension(A, 1) ***"); + + return ok; +} + +// Test using constraints expanding 2 dimensions. +bool +test06() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + + C_Polyhedron ph1(2); + ph1.add_constraint(A >= 0); + ph1.add_constraint(A + B <= 2); + + print_constraints(ph1, "*** ph1 ***"); + + ph1.expand_space_dimension(A, 2); + + C_Polyhedron known_result(4); + known_result.add_constraint(A >= 0); + known_result.add_constraint(A + B <= 2); + known_result.add_constraint(C >= 0); + known_result.add_constraint(C + B <= 2); + known_result.add_constraint(D >= 0); + known_result.add_constraint(D + B <= 2); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after ph1.expand_space_dimension(A, 2) ***"); + + return ok; +} + +// Test using constraints with equality constraint. +bool +test07() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + Variable E(4); + + C_Polyhedron ph1(3); + ph1.add_constraint(A <= 1); + ph1.add_constraint(C == 1); + ph1.add_constraint(A + B >= 1); + ph1.add_constraint(B <= 1); + + print_constraints(ph1, "*** ph1 ***"); + + ph1.expand_space_dimension(A, 1); + ph1.expand_space_dimension(C, 1); + + C_Polyhedron known_result(5); + known_result.add_constraint(A <= 1); + known_result.add_constraint(A + B >= 1); + known_result.add_constraint(C == 1); + known_result.add_constraint(E == 1); + known_result.add_constraint(B <= 1); + known_result.add_constraint(D <= 1); + known_result.add_constraint(D + B >= 1); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, + "*** after ph1.expand_space_dimension(A, 1);" + " ph1.expand_space_dimension(C, 1) ***"); + + return ok; +} + +// Test as given in [GopanDMDRS04] on page 519. +bool +test08() { + Variable A(0); + Variable B(1); + Variable C(2); + + C_Polyhedron ph1(2, EMPTY); + ph1.add_generator(point(A + 2*B)); + ph1.add_generator(point(A + 3*B)); + ph1.add_generator(point(A + 4*B)); + + print_generators(ph1, "*** ph1 ***"); + + ph1.expand_space_dimension(B, 1); + + C_Polyhedron known_result(3, EMPTY); + known_result.add_generator(point(A + 2*B + 2*C)); + known_result.add_generator(point(A + 2*B + 3*C)); + known_result.add_generator(point(A + 2*B + 4*C)); + known_result.add_generator(point(A + 3*B + 2*C)); + known_result.add_generator(point(A + 3*B + 3*C)); + known_result.add_generator(point(A + 3*B + 4*C)); + known_result.add_generator(point(A + 4*B + 2*C)); + known_result.add_generator(point(A + 4*B + 3*C)); + known_result.add_generator(point(A + 4*B + 4*C)); + + bool ok = (ph1 == known_result); + + print_generators(ph1, "*** after ph1.expand_space_dimension(A, 2) ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + DO_TEST(test06); + DO_TEST(test07); + DO_TEST(test08); +END_MAIN diff --git a/tests/Polyhedron/expandspacedim2.cc b/tests/Polyhedron/expandspacedim2.cc new file mode 100644 index 0000000..d24da01 --- /dev/null +++ b/tests/Polyhedron/expandspacedim2.cc @@ -0,0 +1,102 @@ +/* Test Polyhedron::expand_space_dimension(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Test using constraints for NNC polyhedron. +bool +test01() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + + NNC_Polyhedron ph1(2); + ph1.add_constraint(A - B > 2); + ph1.add_constraint(A + 2*B < 6); + ph1.add_constraint(B < 6); + + print_constraints(ph1, "*** ph1 ***"); + + ph1.expand_space_dimension(B, 2); + + NNC_Polyhedron known_result(4); + known_result.add_constraint(A - B > 2); + known_result.add_constraint(A + 2*B < 6); + known_result.add_constraint(B < 6); + known_result.add_constraint(A - C > 2); + known_result.add_constraint(A + 2*C < 6); + known_result.add_constraint(C < 6); + known_result.add_constraint(A - D > 2); + known_result.add_constraint(A + 2*D < 6); + known_result.add_constraint(D < 6); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after ph1.expand_space_dimension(B, 2) ***"); + + return ok; +} + +// Test using generators for NNC polyhedron. +bool +test02() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + + NNC_Polyhedron ph1(2, EMPTY); + ph1.add_generator(point(A)); + ph1.add_generator(closure_point(A + B)); + ph1.add_generator(ray(A - B)); + + print_generators(ph1, "*** ph1 ***"); + + ph1.expand_space_dimension(A, 2); + + NNC_Polyhedron known_result(4, EMPTY); + known_result.add_generator(point(A + C + D)); + known_result.add_generator(ray(A -B + C + D)); + known_result.add_generator(closure_point(A + C + 2*D)); + known_result.add_generator(closure_point(A + 2*C + D)); + known_result.add_generator(closure_point(A + 2*C + 2*D)); + known_result.add_generator(closure_point(A + B + C + D)); + known_result.add_generator(closure_point(2*A + C + D)); + known_result.add_generator(closure_point(2*A + C + 2*D)); + known_result.add_generator(closure_point(2*A + 2*C + D)); + + bool ok = (ph1 == known_result); + + print_generators(ph1, "*** after ph1.expand_space_dimension(A, 2) ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); +END_MAIN diff --git a/tests/Polyhedron/foldspacedims1.cc b/tests/Polyhedron/foldspacedims1.cc new file mode 100644 index 0000000..6acfd22 --- /dev/null +++ b/tests/Polyhedron/foldspacedims1.cc @@ -0,0 +1,336 @@ +/* Test Polyhedron::fold_space_dimensions(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Test with a universe polyhedron. +bool +test01() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1(3); + + print_generators(ph1, "*** ph1 ***"); + + // This is the set of the variables that we want to fold. + Variables_Set to_fold; + to_fold.insert(A); + + ph1.fold_space_dimensions(to_fold, B); + + C_Polyhedron known_result(2); + + bool ok = (ph1 == known_result); + + print_generators(ph1, "*** after folding {A} into B ***"); + + return ok; +} + +// Test with an empty polyhedron. +bool +test02() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1(3, EMPTY); + + print_constraints(ph1, "*** ph1 ***"); + + // This is the set of the variables that we want to fold. + Variables_Set to_fold; + to_fold.insert(A); + + ph1.fold_space_dimensions(to_fold, B); + + C_Polyhedron known_result(2, EMPTY); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after folding {A} into B ***"); + + return ok; +} + +// Trivial fold. +bool +test03() { + Variable A(0); + Variable B(1); + Variable C(2); + + C_Polyhedron ph1(3); + ph1.add_constraint(A >= 0); + ph1.add_constraint(A + B + C <= 2); + + print_constraints(ph1, "*** ph1 ***"); + + // This is the set of the variables that we want to fold. + Variables_Set to_fold; + + ph1.fold_space_dimensions(to_fold, B); + + C_Polyhedron known_result(3); + known_result.add_constraint(A >= 0); + known_result.add_constraint(A + B + C <= 2); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after folding {} into B ***"); + + return ok; +} + +// Test as given in [GopanDMDRS04] on page 519. +bool +test04() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1(2); + ph1.add_constraint(A >= 1); + ph1.add_constraint(A <= 3); + ph1.add_constraint(B >= 7); + ph1.add_constraint(B <= 12); + + print_constraints(ph1, "*** ph1 ***"); + + // This is the set of the variables that we want to fold. + Variables_Set to_fold; + to_fold.insert(A); + + ph1.fold_space_dimensions(to_fold, B); + + C_Polyhedron known_result(1); + known_result.add_constraint(A >= 1); + known_result.add_constraint(A <= 12); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after folding {A} into B ***"); + + return ok; +} + +// Test that takes the expected result of the expand operation +// example given in [GopanDMDRS04] on page 519 and folds it to recover +// the unexpanded polyhedron. +bool +test05() { + Variable A(0); + Variable B(1); + Variable C(2); + + C_Polyhedron ph1(3, EMPTY); + ph1.add_generator(point(A + 2*B + 2*C)); + ph1.add_generator(point(A + 2*B + 3*C)); + ph1.add_generator(point(A + 2*B + 4*C)); + ph1.add_generator(point(A + 3*B + 2*C)); + ph1.add_generator(point(A + 3*B + 3*C)); + ph1.add_generator(point(A + 3*B + 4*C)); + ph1.add_generator(point(A + 4*B + 2*C)); + ph1.add_generator(point(A + 4*B + 3*C)); + ph1.add_generator(point(A + 4*B + 4*C)); + + print_generators(ph1, "*** ph1 ***"); + + // This is the set of the variables that we want to fold. + Variables_Set to_fold; + to_fold.insert(C); + + ph1.fold_space_dimensions(to_fold, B); + + C_Polyhedron known_result(2, EMPTY); + known_result.add_generator(point(A + 2*B)); + known_result.add_generator(point(A + 3*B)); + known_result.add_generator(point(A + 4*B)); + + bool ok = (ph1 == known_result); + + print_generators(ph1, "*** after folding {C} into B ***"); + + return ok; +} + +// Test folding several dimensions into a higher dimension. +bool +test06() { + Variable A(0); + Variable B(1); + Variable C(2); + + C_Polyhedron ph1(3); + ph1.add_constraint(A >= 1); + ph1.add_constraint(A <= 3); + ph1.add_constraint(B >= 7); + ph1.add_constraint(B <= 12); + ph1.add_constraint(C == 15); + + print_constraints(ph1, "*** ph1 ***"); + + // This is the set of the variables that we want to fold. + Variables_Set to_fold; + to_fold.insert(A); + to_fold.insert(B); + + ph1.fold_space_dimensions(to_fold, C); + + C_Polyhedron known_result(1); + known_result.add_constraint(A >= 1); + known_result.add_constraint(A <= 15); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after folding {A,B} into C ***"); + + return ok; +} + +// Test fold_space_dimensions() when there are rays. +bool +test07() { + Variable A(0); + Variable B(1); + Variable C(2); + + C_Polyhedron ph1(3, EMPTY); + ph1.add_generator(point(A)); + ph1.add_generator(ray(A + B)); + ph1.add_generator(ray(A + 2*C)); + + print_generators(ph1, "*** ph1 ***"); + + // This is the set of the variables that we want to fold. + Variables_Set to_fold; + to_fold.insert(C); + + ph1.fold_space_dimensions(to_fold, B); + + C_Polyhedron known_result(2, EMPTY); + known_result.add_generator(point(A)); + known_result.add_generator(ray(A)); + known_result.add_generator(ray(A + B)); + known_result.add_generator(ray(A + 2*B)); + + bool ok = (ph1 == known_result); + + print_generators(ph1, "*** after folding {C} into B ***"); + + return ok; +} + +// Test folding dimensions into a lower dimension. +bool +test08() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + + C_Polyhedron ph1(4); + ph1.add_constraint(A >= 0); + ph1.add_constraint(A + B <= 2); + ph1.add_constraint(C >= 0); + ph1.add_constraint(C + B <= 2); + ph1.add_constraint(D >= 0); + ph1.add_constraint(D + B <= 2); + + print_constraints(ph1, "*** ph1 ***"); + + // This is the set of the variables that we want to fold. + Variables_Set to_fold; + to_fold.insert(C); + to_fold.insert(D); + + ph1.fold_space_dimensions(to_fold, A); + + C_Polyhedron known_result(2); + known_result.add_constraint(A >= 0); + known_result.add_constraint(A + B <= 2); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after folding {C,D} into A ***"); + + return ok; +} + +// Test folding dimensions into an intermediate dimension. +bool +test09() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + + C_Polyhedron ph1(4); + ph1.add_constraint(A >= 0); + ph1.add_constraint(B >= 0); + ph1.add_constraint(A + B <= 2); + ph1.add_constraint(C >= 0); + ph1.add_constraint(C + B <= 2); + ph1.add_constraint(D >= 0); + ph1.add_constraint(D + B <= 2); + + print_constraints(ph1, "*** ph1 ***"); + + // This is the set of the variables that we want to fold. + Variables_Set to_fold; + to_fold.insert(B); + to_fold.insert(D); + + ph1.fold_space_dimensions(to_fold, C); + + C_Polyhedron known_result(2); + known_result.add_constraint(A >= 0); + known_result.add_constraint(A <= 2); + known_result.add_constraint(B >= 0); + known_result.add_constraint(B <= 2); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after folding {B,D} into C ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + // test06() only fails when using C_Polyhedron and 8 bit coefficients. +#ifdef DERIVED_TEST + DO_TEST(test06); +#else + DO_TEST_F8(test06); +#endif // !defined(DERIVED_TEST) + DO_TEST(test07); + DO_TEST(test08); + DO_TEST(test09); +END_MAIN diff --git a/tests/Polyhedron/foldspacedims2.cc b/tests/Polyhedron/foldspacedims2.cc new file mode 100644 index 0000000..64ccb50 --- /dev/null +++ b/tests/Polyhedron/foldspacedims2.cc @@ -0,0 +1,230 @@ +/* Test Polyhedron::fold_space_dimensions() for non-closed polyhedra. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Test with an empty polyhedron. +bool +test01() { + Variable A(0); + Variable B(1); + + NNC_Polyhedron ph1(3, EMPTY); + + print_constraints(ph1, "*** ph1 ***"); + + // This is the set of the variables that we want to fold. + Variables_Set to_fold; + to_fold.insert(A); + + ph1.fold_space_dimensions(to_fold, B); + + NNC_Polyhedron known_result(2, EMPTY); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after folding {A} into B ***"); + + return ok; +} + +// Trivial fold. +bool +test02() { + Variable A(0); + Variable B(1); + Variable C(2); + + NNC_Polyhedron ph1(3); + ph1.add_constraint(A >= 0); + ph1.add_constraint(A + B + C < 2); + + print_constraints(ph1, "*** ph1 ***"); + + // This is the set of the variables that we want to fold. + Variables_Set to_fold; + + ph1.fold_space_dimensions(to_fold, B); + + NNC_Polyhedron known_result(3); + known_result.add_constraint(A >= 0); + known_result.add_constraint(A + B + C < 2); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after folding {} into B ***"); + + return ok; +} + +// Test as given in [GopanDMDRS04] on page 519 but with strict constraints. +bool +test03() { + Variable A(0); + Variable B(1); + + NNC_Polyhedron ph1(2); + ph1.add_constraint(A > 1); + ph1.add_constraint(A < 3); + ph1.add_constraint(B > 7); + ph1.add_constraint(B < 12); + + print_constraints(ph1, "*** ph1 ***"); + + // This is the set of the variables that we want to fold. + Variables_Set to_fold; + to_fold.insert(A); + + ph1.fold_space_dimensions(to_fold, B); + + NNC_Polyhedron known_result(1); + known_result.add_constraint(A > 1); + known_result.add_constraint(A < 12); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after folding {A} into B ***"); + + return ok; +} + +// Test folding several dimensions into a higher dimension. +bool +test04() { + Variable A(0); + Variable B(1); + Variable C(2); + + NNC_Polyhedron ph1(3); + ph1.add_constraint(A > 1); + ph1.add_constraint(A <= 3); + ph1.add_constraint(B > 7); + ph1.add_constraint(B < 12); + ph1.add_constraint(C == 15); + + print_constraints(ph1, "*** ph1 ***"); + + // This is the set of the variables that we want to fold. + Variables_Set to_fold; + to_fold.insert(A); + to_fold.insert(B); + + ph1.fold_space_dimensions(to_fold, C); + + NNC_Polyhedron known_result(1); + known_result.add_constraint(A > 1); + known_result.add_constraint(A <= 15); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after folding {A,B} into C ***"); + + return ok; +} + +// Test folding dimensions into a lower dimension. +bool +test05() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + + NNC_Polyhedron ph1(4); + ph1.add_constraint(A > 0); + ph1.add_constraint(A + B < 2); + ph1.add_constraint(C > 0); + ph1.add_constraint(C + B < 2); + ph1.add_constraint(D > 0); + ph1.add_constraint(D + B <= 2); + + print_constraints(ph1, "*** ph1 ***"); + + // This is the set of the variables that we want to fold. + Variables_Set to_fold; + to_fold.insert(C); + to_fold.insert(D); + + ph1.fold_space_dimensions(to_fold, A); + + NNC_Polyhedron known_result(2); + known_result.add_constraint(A > 0); + known_result.add_constraint(A + B <= 2); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after folding {C,D} into A ***"); + + return ok; +} + +// Test folding dimensions into an intermediate dimension. +bool +test06() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + + NNC_Polyhedron ph1(4); + ph1.add_constraint(A >= 0); + ph1.add_constraint(B > 0); + ph1.add_constraint(A + B <= 2); + ph1.add_constraint(C > 0); + ph1.add_constraint(C + B <= 2); + ph1.add_constraint(D > 0); + ph1.add_constraint(D + B <= 2); + + print_constraints(ph1, "*** ph1 ***"); + + // This is the set of the variables that we want to fold. + Variables_Set to_fold; + to_fold.insert(B); + to_fold.insert(D); + + ph1.fold_space_dimensions(to_fold, C); + + NNC_Polyhedron known_result(2); + known_result.add_constraint(A >= 0); + known_result.add_constraint(A < 2); + known_result.add_constraint(B > 0); + known_result.add_constraint(B < 2); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after folding {B,D} into C ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST_F8(test03); + DO_TEST(test04); + DO_TEST(test05); + DO_TEST(test06); +END_MAIN diff --git a/tests/Polyhedron/frombdshape1.cc b/tests/Polyhedron/frombdshape1.cc new file mode 100644 index 0000000..02c2d4d --- /dev/null +++ b/tests/Polyhedron/frombdshape1.cc @@ -0,0 +1,56 @@ +/* Test BD_Shape::BD_Shape(const C_Polyhedron&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + Constraint_System cs; + cs.insert(A - 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..45faec3 --- /dev/null +++ b/tests/Polyhedron/frombox1.cc @@ -0,0 +1,258 @@ +/* Test C_Polyhedron::C_Polyhedron(const Box&) + and NNC_Polyhedron::NNC_Polyhedron(const Box&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// 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..8ea1084 --- /dev/null +++ b/tests/Polyhedron/frombox2.cc @@ -0,0 +1,111 @@ +/* Test NNC_Polyhedron::NNC_Polyhedron(const Box&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// 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..d2fb6a0 --- /dev/null +++ b/tests/Polyhedron/fromgrid1.cc @@ -0,0 +1,201 @@ +/* Test C_Polyhedron::C_Polyhedron(const Grid&) + and NNC_Polyhedron::NNC_Polyhedron(const Grid&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// 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..1fbd140 --- /dev/null +++ b/tests/Polyhedron/fromoctagonalshape1.cc @@ -0,0 +1,55 @@ +/* Test BD_Shape::BD_Shape(const C_Polyhedron&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + Constraint_System cs; + cs.insert(A + 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..00446b8 --- /dev/null +++ b/tests/Polyhedron/generalizedaffineimage1.cc @@ -0,0 +1,268 @@ +/* Test Polyhedron::generalized_affine_image(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.add_constraint(A >= 0); + ph.add_constraint(A <= 4); + ph.add_constraint(B <= 5); + ph.add_constraint(A <= B); + + print_constraints(ph, "*** ph ***"); + + ph.generalized_affine_image(B, GREATER_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..bc30241 --- /dev/null +++ b/tests/Polyhedron/generalizedaffineimage2.cc @@ -0,0 +1,559 @@ +/* Test Polyhedron::generalized_affine_image(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + NNC_Polyhedron ph(2, EMPTY); + ph.add_generator(point(A + B)); + ph.add_generator(closure_point(2*A)); + ph.add_generator(closure_point(2*A + 2*B)); + ph.add_generator(closure_point(3*A + B)); + + print_constraints(ph, "*** ph ***"); + + ph.generalized_affine_image(B, LESS_THAN, B+2); + + NNC_Polyhedron known_result(2, EMPTY); + known_result.add_generator(point(A)); + known_result.add_generator(closure_point(A + 3*B)); + known_result.add_generator(closure_point(2*A + 4*B)); + known_result.add_generator(closure_point(3*A + 3*B)); + known_result.add_generator(ray(-B)); + + bool ok = (ph == known_result); + + print_generators(ph, "*** ph after " + "ph.generalized_affine_image(B, LESS_THAN, B+2) ***"); + + return ok; +} + +bool +test02() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.add_constraint(A >= 0); + ph.add_constraint(A <= 4); + ph.add_constraint(B <= 5); + ph.add_constraint(A <= B); + + print_constraints(ph, "*** ph ***"); + + C_Polyhedron ph2 = ph; + + ph.generalized_affine_image(B, GREATER_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, PPLGT, A + B + 1) ***"); + + return ok; +} + +bool +test09() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.add_constraint(B >= 0); + ph.add_constraint(A >= 1); + + C_Polyhedron known_result(ph); + + print_constraints(ph, "*** ph ***"); + + ph.generalized_affine_image(Linear_Expression(2), EQUAL, A + B); + + known_result.add_constraint(A + B == 2); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** after ph.generalized_affine_image" + "(Linear_Expression(2), EQUAL, A + B) ***"); + + return ok; +} + +bool +test10() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.add_constraint(B >= 0); + ph.add_constraint(A - B >= 1); + + C_Polyhedron known_result(ph); + + print_constraints(ph, "*** ph ***"); + + ph.generalized_affine_image(Linear_Expression(2), + GREATER_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..bd47681 --- /dev/null +++ b/tests/Polyhedron/generalizedaffinepreimage1.cc @@ -0,0 +1,123 @@ +/* Test Polyhedron::generalized_affine_preimage(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.add_constraint(A >= 0); + ph.add_constraint(A <= 4); + ph.add_constraint(B <= 5); + ph.add_constraint(A <= B); + + print_constraints(ph, "*** ph ***"); + + ph.generalized_affine_preimage(B, GREATER_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..b457966 --- /dev/null +++ b/tests/Polyhedron/generalizedaffinepreimage2.cc @@ -0,0 +1,63 @@ +/* Test Polyhedron::generalized_affine_preimage(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + NNC_Polyhedron ph(2, EMPTY); + ph.add_generator(point(A + B)); + ph.add_generator(closure_point(2*A)); + ph.add_generator(closure_point(2*A + 2*B)); + ph.add_generator(closure_point(3*A + B)); + + print_constraints(ph, "*** ph ***"); + + // A longer way of computing the generalized affine preimage below. + NNC_Polyhedron known_result(ph); + known_result.add_space_dimensions_and_embed(1); + Variable C(2); + known_result.add_constraint(B < C+2); + Variables_Set vset; + vset.insert(B); + known_result.remove_space_dimensions(vset); + + ph.generalized_affine_preimage(B, LESS_THAN, B+2); + + bool ok = (ph == known_result); + + print_generators(ph, "*** ph after " + "ph.generalized_affine_preimage(B, LESS_THAN, B+2) ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); +END_MAIN diff --git a/tests/Polyhedron/generators1.cc b/tests/Polyhedron/generators1.cc new file mode 100644 index 0000000..d5c495f --- /dev/null +++ b/tests/Polyhedron/generators1.cc @@ -0,0 +1,234 @@ +/* Test the construction of a polyhedron using generators. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + Generator_System gs; + gs.insert(point(x + y, -1)); + + C_Polyhedron ph(gs); + + print_generators(ph, "*** ph ***"); + + Constraint_System cs = ph.constraints(); + + C_Polyhedron known_result(2); + known_result.add_constraint(x == -1); + known_result.add_constraint(y == -1); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** ph constraints ***"); + print_generators(ph, "*** ph generators ***"); + + return ok; +} + +bool +test02() { + Variable x(0); + Variable y(1); + + Constraint_System cs; + cs.insert(x + y >= 2); + cs.insert(x + y <= 1); + + C_Polyhedron known_result(cs); + + const Generator_System& gs = known_result.generators(); + + print_generators(gs, "*** gs ***"); + + C_Polyhedron ph(gs); + + bool ok = (gs.space_dimension() == known_result.space_dimension() + && gs.begin() == gs.end() + && ph == known_result); + + print_generators(ph, "*** ph ***"); + + return ok; +} + +bool +test03() { + Variable A(0); + + C_Polyhedron ph1(2, EMPTY); + + C_Polyhedron ph2(0); + + C_Polyhedron ph3(2); + ph3.add_constraint(A >= 1); + ph3.add_constraint(A <= -1); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + print_generators(ph3, "*** ph3 ***"); + + Generator_System gs1 = ph1.generators(); + Generator_System gs2 = ph2.generators(); + Generator_System gs3 = ph3.generators(); + + Generator_System known_result2; + known_result2.insert(point()); + + bool ok = (gs1.begin() == gs1.end() + && C_Polyhedron(gs2) == C_Polyhedron(known_result2) + && gs3.begin() == gs3.end()); + + print_generators(gs1, "*** gs1 ***"); + print_generators(gs2, "*** gs2 ***"); + print_generators(gs3, "*** gs3 ***"); + + return ok; +} + +bool +test04() { + const Generator_System gs; + + C_Polyhedron ph(gs); + + C_Polyhedron known_result(0, EMPTY); + + bool ok = (ph == known_result); + + print_generators(ph, "*** ph ***"); + + return ok; +} + +bool +test05() { + Generator_System gs1; + gs1.insert(point()); + + C_Polyhedron ph1(gs1); + C_Polyhedron known_result(ph1); + + print_generators(ph1, "*** ph1 ***"); + + const Generator_System gs2 = ph1.generators(); + + C_Polyhedron ph2(gs2); + + bool ok = (ph2 == known_result); + + print_generators(ph2, "*** ph2 ***"); + + return ok; +} + +bool +test06() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1(2); + ph1.generators(); + ph1.add_constraint(A >= 0); + ph1.add_constraint(B >= 0); + + C_Polyhedron known_result(ph1); + + Generator_System gs = ph1.generators(); + C_Polyhedron ph2(gs); + + bool ok = (ph2 == known_result); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + print_generators(gs, "*** gs ***"); + + return ok; +} + +bool +test07() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1(2, EMPTY); + ph1.add_generator(point()); + ph1.constraints(); + ph1.add_generator(ray(A)); + ph1.add_generator(ray(B)); + + C_Polyhedron known_result(ph1); + + Generator_System gs = ph1.generators(); + C_Polyhedron ph2(gs); + + bool ok = (ph2 == known_result); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + print_generators(gs, "*** gs ***"); + + return ok; +} + +bool +test08() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2, EMPTY); + ph.add_generator(point()); + ph.add_generator_and_minimize(ray(A)); + ph.add_generator(ray(B)); + + print_generators(ph, "*** ph ***"); + + Generator_System gs = ph.generators(); + gs.insert(point(A)); + gs.insert(point(B)); + + print_generators(gs, "*** gs ***"); + + C_Polyhedron known_result(2); + known_result.add_constraint(A >= 0); + known_result.add_constraint(B >= 0); + + return (C_Polyhedron(gs) == known_result); +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + DO_TEST(test06); + DO_TEST(test07); + DO_TEST(test08); +END_MAIN diff --git a/tests/Polyhedron/geomcovers1.cc b/tests/Polyhedron/geomcovers1.cc new file mode 100644 index 0000000..56dc11d --- /dev/null +++ b/tests/Polyhedron/geomcovers1.cc @@ -0,0 +1,60 @@ +/* Test Pointset_Powerset::geometrically_covers(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + + Constraint_System cs1, cs2, cs3, cs4; + cs1.insert(x >= 0); + cs1.insert(x <= 4); + cs2.insert(x >= 4); + cs2.insert(x <= 6); + cs3.insert(x >= 1); + cs3.insert(x <= 5); + C_Polyhedron ph1(cs1), ph2(cs2), ph3(cs3); + + Pointset_Powerset ps12(1, EMPTY); + ps12.add_disjunct(ph1); + ps12.add_disjunct(ph2); + + Pointset_Powerset 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..f6cda15 --- /dev/null +++ b/tests/Polyhedron/h79widening1.cc @@ -0,0 +1,245 @@ +/* Test Polyhedron::H79_widening_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + C_Polyhedron ph1(2); + ph1.add_constraint(x >= 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..e4ee108 --- /dev/null +++ b/tests/Polyhedron/h79widening2.cc @@ -0,0 +1,63 @@ +/* Test Polyhedron::H79_widening_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// This is the example of Figure 3 in [BagnaraRZH02TR]. +bool +test01() { + Variable A(0); + + NNC_Polyhedron ph1(1); + ph1.add_constraint(A > 0); + ph1.add_constraint(A < 2); + + NNC_Polyhedron ph4(1); + ph4.add_constraint(4*A >= 1); + ph4.add_constraint(4*A <= 3); + + NNC_Polyhedron ph = ph4; + ph.intersection_assign_and_minimize(ph1); + // At this point, ph and ph4 are two different representations + // of the same NNC polyhedron. + + print_constraints(ph4, "*** ph4 ***"); + print_constraints(ph, "*** ph ***"); + + NNC_Polyhedron known_result(ph4); + + ph.H79_widening_assign(ph4); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** after H79_widening_assign ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); +END_MAIN diff --git a/tests/Polyhedron/hybrid.cc b/tests/Polyhedron/hybrid.cc new file mode 100644 index 0000000..fc4894a --- /dev/null +++ b/tests/Polyhedron/hybrid.cc @@ -0,0 +1,870 @@ + +/* Test three examples for linear hybrid systems. + These are based on the examples in HalbwachsPR94 + and HalbwachsPR97 papers. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + + // 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 elaspe 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& ps, const NNC_Polyhedron& ph) { + + Pointset_Powerset ps_result(ps.space_dimension(), EMPTY); + for (Pointset_Powerset::const_iterator i = ps.begin(), + ps_end = ps.end(); i != ps_end; ++i) { + NNC_Polyhedron di = i->element(); + 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& ps, Variable var, + const Linear_Expression& expr, + Coefficient_traits::const_reference denominator + = Coefficient_one()) { + Pointset_Powerset ps_result(ps.space_dimension(), EMPTY); + for (Pointset_Powerset::iterator i = ps.begin(), + ps_end = ps.end(); i != ps_end; ++i) { + NNC_Polyhedron phi = i->element(); + 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& ps, + NNC_Polyhedron& ph) { + Pointset_Powerset ps_result(ps.space_dimension(), EMPTY); + for (Pointset_Powerset::iterator i = ps.begin(), + ps_end = ps.end(); i != ps_end; ++i) { + NNC_Polyhedron phi = i->element(); + 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& ps1, + Pointset_Powerset& ps2) { + for (Pointset_Powerset::iterator i = ps2.begin(), + ps2_end = ps2.end(); i != ps2_end; ++i) { + bool is_contained = false; + NNC_Polyhedron ph2 = i->element(); + for (Pointset_Powerset::iterator j = ps1.begin(), + ps1_end = ps1.end(); j != ps1_end; ++j) { + NNC_Polyhedron ph1 = j->element(); + 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 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 + ph_t1 = Pointset_Powerset(6, EMPTY); + Pointset_Powerset + ph_t2 = Pointset_Powerset(6, EMPTY); + + Pointset_Powerset + ph_idle_prev = Pointset_Powerset(6, EMPTY); + Pointset_Powerset + ph_t1_prev = Pointset_Powerset(6, EMPTY); + Pointset_Powerset + ph_t2_prev = Pointset_Powerset(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 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 + // (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..7b8a2c3 --- /dev/null +++ b/tests/Polyhedron/intersection1.cc @@ -0,0 +1,517 @@ +/* Testing Polyhedron::intersection_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Intersection of an icosahedron with a column. +bool +test01() { + Variable x(0); + Variable y(1); + Variable z(2); + + C_Polyhedron icosahedron(3); + icosahedron.add_constraint(4*x - 2*y - z + 14 >= 0); + icosahedron.add_constraint(4*x + 2*y - z + 2 >= 0); + icosahedron.add_constraint(x + y - 1 >= 0); + icosahedron.add_constraint(x + y + 2*z - 5 >= 0); + icosahedron.add_constraint(x + 1 >= 0); + icosahedron.add_constraint(x + z - 1 >= 0); + icosahedron.add_constraint(2*x + y -2*z + 7 >= 0); + icosahedron.add_constraint(x - y + 2*z + 1 >= 0); + icosahedron.add_constraint(x - y + 5 >= 0); + icosahedron.add_constraint(2*x - y - 2*z + 13 >= 0); + icosahedron.add_constraint(-2*x - y + 2*z + 1 >= 0); + icosahedron.add_constraint(-x + y - 1 >= 0); + icosahedron.add_constraint(-x + y -2*z + 7 >= 0); + icosahedron.add_constraint(-4*x + 2*y + z - 4 >= 0); + icosahedron.add_constraint(-2*x + y + 2*z - 5 >= 0); + icosahedron.add_constraint(-x + 1 >= 0); + icosahedron.add_constraint(-x - z + 5 >= 0); + icosahedron.add_constraint(-4*x - 2*y + z + 8 >= 0); + icosahedron.add_constraint(-x - y + 5 >= 0); + icosahedron.add_constraint(-x - y -2*z +13 >= 0); + + C_Polyhedron column(3); + column.add_constraint(y >= 2); + column.add_constraint(y <= 4); + column.add_constraint(x >= 0); + column.add_constraint(x <= 1); + + C_Polyhedron computed_result = icosahedron; + computed_result.intersection_assign_and_minimize(column); + + C_Polyhedron known_result(3); + known_result.add_constraint(-4*x - 2*y + z >= -8); + known_result.add_constraint(-4*x + 2*y + z >= 4); + known_result.add_constraint(-2*x - y + 2*z >= -1); + known_result.add_constraint(-2*x + y + 2*z >= 5); + known_result.add_constraint(-x - y - 2*z >= -13); + known_result.add_constraint(-x - z >= -5); + known_result.add_constraint(-x >= -1); + known_result.add_constraint(-x + y - 2*z >= -7); + known_result.add_constraint(-y >= -4); + known_result.add_constraint(y >= 2); + known_result.add_constraint(x >= 0); + + bool ok = (computed_result == known_result); + + print_constraints(icosahedron, "*** icosahedron ***"); + print_constraints(column, "*** column ***"); + print_constraints(computed_result, "*** computed_result ***"); + 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_and_minimize(hyper_space_above); + + if (ok + && aux_test02(computed_result) != ph_nv[i].num_points_above) + ok = false; + + print_constraints(hyper_space_above, "*** hyper_space_above ***"); + print_generators(computed_result, "*** computed_result ***"); + + // Below. + C_Polyhedron hyper_space_below(3); + hyper_space_below.add_constraint(z <= ph_nv[i].plane_height); + + computed_result = pyramid; + computed_result.intersection_assign_and_minimize(hyper_space_below); + + if (ok + && aux_test02(computed_result) != ph_nv[i].num_points_below) + ok = false; + + print_constraints(hyper_space_below, "*** hyper_space_below ***"); + print_generators(computed_result, "*** computed_result ***"); + + } + return ok; +} + +bool +test03() { + Variable x(0); + Variable y(1); + + C_Polyhedron ph1(2); + ph1.add_constraint(x - y >= 0); + ph1.add_constraint(x - y <= 1); + + print_constraints(ph1, "*** ph1 ***"); + + C_Polyhedron ph2(2); + ph2.add_constraint(x >= 0); + ph2.add_constraint(y >= 0); + ph2.add_constraint(x <= 1); + ph2.add_constraint(y <= 1); + + print_constraints(ph2, "*** ph2 ***"); + + C_Polyhedron computed_result = ph1; + + computed_result.intersection_assign(ph2); + + C_Polyhedron known_result(2); + known_result.add_constraint(y >= 0); + known_result.add_constraint(x - y >= 0); + known_result.add_constraint(x <= 1); + + bool ok = (computed_result == known_result); + + print_constraints(computed_result, "*** after intersection_assign ***"); + + return ok; +} + +bool +test04() { + Variable x(0); + Variable y(1); + + C_Polyhedron ph1(2); + ph1.add_constraint(x >= y); + ph1.add_constraint(x >= 0); + + C_Polyhedron ph2(2, EMPTY); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + C_Polyhedron computed_result1(ph1); + computed_result1.intersection_assign_and_minimize(ph2); + + Constraint_System cs_computed_result2 = ph1.constraints(); + C_Polyhedron computed_result2(cs_computed_result2); + computed_result2.intersection_assign(ph2); + + C_Polyhedron known_result(2, EMPTY); + + bool ok = (computed_result1 == known_result + && computed_result2 == known_result); + + print_constraints(computed_result1, + "*** after intersection_assign_and_minimize ***"); + print_constraints(computed_result2, "*** after intersection_assign ***"); + + return ok; +} + +bool +test05() { + Variable x(0); + Variable y(1); + + C_Polyhedron ph1(2); + ph1.add_constraint(x >= y); + + C_Polyhedron ph2(2, EMPTY); + ph2.add_generator(point()); + ph2.add_generator(line(x)); + ph2.add_generator(ray(y)); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + ph1.intersection_assign_and_minimize(ph2); + + C_Polyhedron known_result(2); + known_result.add_constraint(y >= 0); + known_result.add_constraint(x >= y); + + bool ok = (known_result == ph1); + + print_constraints(ph1, "*** after intersection_assign_and_minimize ***"); + + return ok; +} + +bool +test06() { + Variable x(0); + Variable y(1); + + Generator_System gs1; + gs1.insert(point()); + gs1.insert(point(3*x)); + gs1.insert(point(3*y)); + gs1.insert(point(3*x+ 3*y)); + C_Polyhedron ph1(gs1); + + Generator_System gs2; + gs2.insert(point(x)); + gs2.insert(point(4*x)); + gs2.insert(point(x + 3*y)); + gs2.insert(point(4*x+ 3*y)); + C_Polyhedron ph2(gs2); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + ph1.intersection_assign(ph2); + + C_Polyhedron known_result(2, EMPTY); + known_result.add_generator(point(x)); + known_result.add_generator(point(3*x)); + known_result.add_generator(point(x + 3*y)); + known_result.add_generator(point(3*x + 3*y)); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after intersection_assign ***"); + + return ok; +} + +bool +aux_test07(C_Polyhedron& ph1, + const C_Polyhedron& ph2, + // Note intentional call-by-value! + C_Polyhedron known_result) { + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + ph1.intersection_assign_and_minimize(ph2); + + print_generators(ph1, "*** after intersection_assign ***"); + + return ph1 == known_result; +} + +bool +test07() { + Variable x(0); + Variable y(1); + + C_Polyhedron ph1_1(2); + ph1_1.add_constraint(x >= 0); + ph1_1.add_constraint(y >= 0); + ph1_1.add_constraint(x <= 2); + ph1_1.add_constraint(y <= 2); + C_Polyhedron ph1_2(ph1_1); + + C_Polyhedron ph2_1(2); + ph2_1.add_constraint(x+y <= 0); + ph2_1.add_constraint(x+y >= 2); + C_Polyhedron ph2_2(ph2_1); + C_Polyhedron ph2_3(ph2_1); + C_Polyhedron ph2_4(ph2_1); + + bool ok = aux_test07(ph1_1, ph2_1, ph2_1) + && aux_test07(ph2_2, ph1_2, ph2_2) + && aux_test07(ph2_3, ph2_4, ph2_3); + + return ok; +} + +bool +test08() { + Variable A(0); + + C_Polyhedron ph1(2, EMPTY); + C_Polyhedron ph2(2); + ph2.add_constraint(A == 0); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + C_Polyhedron known_result(ph1); + + ph1.intersection_assign_and_minimize(ph2); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, + "*** after ph1.intersection_assign_and_minimize(ph2) ***"); + + return ok; +} + +bool +test09() { + C_Polyhedron ph1; + C_Polyhedron ph2(0, EMPTY); + ph2.add_generator(point()); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + C_Polyhedron known_result = ph1; + + ph1.intersection_assign_and_minimize(ph2); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, + "*** after ph1.intersection_assign_and_minimize(ph2) ***"); + + return ok; +} + +bool +test10() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1(2, EMPTY); + C_Polyhedron ph2(2); + ph2.add_constraint(A - B >= 0); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + C_Polyhedron known_result(ph1); + + ph1.intersection_assign(ph2); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after ph1.intersection_assign(ph2) ***"); + + return ok; +} + +bool +test11() { + C_Polyhedron ph1; + C_Polyhedron ph2; + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + C_Polyhedron known_result(ph1); + + ph1.intersection_assign(ph2); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after ph1.intersection_assign(ph2) ***"); + + return ok; +} + +bool +test12() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1(2); + ph1.generators(); + ph1.add_constraint(A == B); + C_Polyhedron copy_ph1 = ph1; + + C_Polyhedron ph2(2); + ph2.generators(); + ph2.add_constraint(A >= B + 1); + C_Polyhedron copy_ph2 = ph2; + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + ph1.intersection_assign(ph2); + copy_ph1.intersection_assign_and_minimize(copy_ph2); + + bool ok = (ph1 == copy_ph1); + + print_constraints(ph1, "*** after intersection_assign ***"); + print_constraints(copy_ph1, + "*** after intersection_assign_and_minimize ***"); + + return ok; +} + +bool +test13() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1(2, EMPTY); + ph1.add_generator(point()); + ph1.constraints(); + ph1.add_generator(line(A + B)); + C_Polyhedron copy_ph1 = ph1; + + C_Polyhedron ph2(2, EMPTY); + ph2.add_generator(point()); + ph2.constraints(); + ph2.add_generator(ray(A)); + ph2.add_generator(ray(B)); + + C_Polyhedron copy_ph2 = ph2; + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + ph1.intersection_assign(ph2); + copy_ph1.intersection_assign_and_minimize(copy_ph2); + + bool ok = (ph1 == copy_ph1); + + print_constraints(ph1, "*** after intersection_assign ***"); + print_constraints(copy_ph1, + "*** after intersection_assign_and_minimize ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(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..07033a7 --- /dev/null +++ b/tests/Polyhedron/limitedbhrz03extrapolation1.cc @@ -0,0 +1,67 @@ +/* Test Polyhedron::limited_BHRZ03_extrapolation_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +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..7d5e5cd --- /dev/null +++ b/tests/Polyhedron/limitedh79extrapolation1.cc @@ -0,0 +1,273 @@ +/* Test Polyhedron::limited_H79_extrapolation_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + Constraint_System cs1; + cs1.insert(x >= 0); + cs1.insert(x <= 1); + cs1.insert(y >= 0); + cs1.insert(x - y >= 0); + + C_Polyhedron ph1(cs1); + + print_constraints(ph1, "*** ph1 ***"); + + Constraint_System cs2; + cs2.insert(x >= 0); + cs2.insert(x <= 2); + cs2.insert(y >= 0); + cs2.insert(x - y >= 0); + + C_Polyhedron ph2(cs2); + + print_constraints(ph2, "*** ph2 ***"); + + Constraint_System cs; + cs.insert(x >= 0); + cs.insert(y >= 0); + cs.insert(x <= 5); + cs.insert(y <= 5); + + print_constraints(cs, "*** cs ***"); + + C_Polyhedron computed_result = ph2; + computed_result.limited_H79_extrapolation_assign(ph1, cs); + + C_Polyhedron known_result(2); + known_result.add_constraint(x - y >= 0); + known_result.add_constraint(y >= 0); + known_result.add_constraint(x <= 5); + + print_constraints(computed_result, + "*** after limited_H79_extrapolation_assign ***"); + + return computed_result == known_result; +} + +bool +test02() { + Variable x(0); + Variable y(1); + + Constraint_System cs1; + cs1.insert(x >= 0); + cs1.insert(x <= 1); + cs1.insert(y == 0); + + C_Polyhedron ph1(cs1); + + print_constraints(ph1, "*** ph1 ***"); + + Constraint_System cs2; + cs2.insert(x <= 2); + cs2.insert(y >= 0); + cs2.insert(y <= x); + + C_Polyhedron ph2(cs2); + + print_constraints(ph2, "*** ph2 ***"); + + Constraint_System cs; + cs.insert(y <= -1); + cs.insert(x <= 5); + + print_constraints(cs, "*** cs ***"); + + C_Polyhedron computed_result = ph2; + computed_result.limited_H79_extrapolation_assign(ph1, cs); + + C_Polyhedron known_result = ph2; + known_result.add_generator(point(5*x)); + known_result.add_generator(point(5*x + 5*y)); + + print_constraints(computed_result, + "*** after limited_H79_extrapolation_assign ***"); + + return computed_result == known_result; +} + +bool +test03() { + Variable x(0); + + Constraint_System cs1; + cs1.insert(x >= 0); + cs1.insert(x <= 1); + C_Polyhedron ph1(cs1); + + print_constraints(ph1, "*** ph1 ***"); + + Constraint_System cs2; + cs2.insert(x == 0); + C_Polyhedron ph2(cs2); + + print_constraints(ph2, "*** ph2 ***"); + + Constraint_System cs; + cs.insert(x >= 0); + + print_constraints(cs, "*** cs ***"); + + C_Polyhedron computed_result = ph1; + computed_result.limited_H79_extrapolation_assign(ph2, cs); + + C_Polyhedron known_result(cs); + + print_constraints(computed_result, + "*** after limited_H79_extrapolation_assign ***"); + + return computed_result == known_result; +} + +bool +test04() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1(2, EMPTY); + + C_Polyhedron ph2(2); + ph2.add_constraint(B >= 0); + ph2.add_constraint(A - B >= 0); + ph2.add_constraint(A <= 2); + + Constraint_System cs; + cs.insert(B <= 4); + + C_Polyhedron known_result(ph2); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + print_constraints(cs, "*** cs ***"); + + ph2.limited_H79_extrapolation_assign(ph1, cs); + + bool ok = (ph2 == known_result); + + print_constraints(ph2, + "*** after ph2.limited_H79_extrapolation_assign(ph1, cs)" + " ***"); + return ok; +} + +bool +test05() { + Variable B(1); + + C_Polyhedron ph1(2, EMPTY); + + C_Polyhedron ph2(2, EMPTY); + + Constraint_System cs; + cs.insert(B <= 4); + + C_Polyhedron known_result(ph2); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + print_constraints(cs, "*** cs ***"); + + ph2.limited_H79_extrapolation_assign(ph1, cs); + + bool ok = (ph2 == known_result); + + print_constraints(ph2, + "*** after ph2.limited_H79_extrapolation_assign(ph1, cs)" + " ***"); + return ok; +} + +bool +test06() { + C_Polyhedron ph1; + + C_Polyhedron ph2; + + Constraint_System cs; + cs.insert(Linear_Expression(2) <= 4); + + C_Polyhedron known_result(ph2); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + print_constraints(cs, "*** cs ***"); + + ph2.limited_H79_extrapolation_assign(ph1, cs); + + bool ok = (ph2 == known_result); + + print_constraints(ph2, + "*** after ph2.limited_H79_extrapolation_assign(ph1, cs)" + " ***"); + return ok; +} + +bool +test07() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1(2); + ph1.add_constraint(A >= 2); + ph1.add_constraint(A <= -2); + ph1.add_constraint(B == 0); + C_Polyhedron ph2(2); + ph1.add_constraint(A >= 2); + + Constraint_System cs; + cs.insert(B <= 4); + + C_Polyhedron known_result(ph2); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + print_constraints(cs, "*** cs ***"); + + ph2.limited_H79_extrapolation_assign(ph1, cs); + + bool ok = (ph2 == known_result); + + print_constraints(ph2, + "*** after ph2.limited_H79_extrapolation_assign(ph1, cs)" + " ***"); + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + DO_TEST(test06); + DO_TEST(test07); +END_MAIN diff --git a/tests/Polyhedron/linearexpression1.cc b/tests/Polyhedron/linearexpression1.cc new file mode 100644 index 0000000..b980221 --- /dev/null +++ b/tests/Polyhedron/linearexpression1.cc @@ -0,0 +1,137 @@ +/* Testing Linear_Expression. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +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..879bda0 --- /dev/null +++ b/tests/Polyhedron/linearpartition1.cc @@ -0,0 +1,331 @@ +/* Test linear_partition(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +aux_test01(const C_Polyhedron& p, + const C_Polyhedron& q, + const std::pair >& 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& 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::const_iterator iter; + for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i) { + const NNC_Polyhedron& a = i->element(); + // All elements of `s' must be disjoint from `p'. + if (!a.is_disjoint_from(nnc_p)) + return false; + iter j = i; + for (++j; j != s_end; ++j) { + const NNC_Polyhedron& b = j->element(); + // All elements of `s' must be pairwise disjoint. + if (!a.is_disjoint_from(b)) + return false; + } + the_union.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 > + 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 >& 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& 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::const_iterator iter; + for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i) { + const NNC_Polyhedron& a = i->element(); + // All elements of `s' must be disjoint from `p'. + if (!a.is_disjoint_from(nnc_p)) + return false; + iter j = i; + for (++j; j != s_end; ++j) { + const NNC_Polyhedron& b = j->element(); + // All elements of `s' must be pairwise disjoint. + if (!a.is_disjoint_from(b)) + return false; + } + the_union.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 > + 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 >& 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& 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::const_iterator iter; + for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i) { + const NNC_Polyhedron& a = i->element(); + // All elements of `s' must be disjoint from `p'. + if (!a.is_disjoint_from(nnc_p)) + return false; + iter j = i; + for (++j; j != s_end; ++j) { + const NNC_Polyhedron& b = j->element(); + // All elements of `s' must be pairwise disjoint. + if (!a.is_disjoint_from(b)) + return false; + } + the_union.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 > + 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 +Pointset_Powerset +aux_test04(const PH& ph) { + std::pair > 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 p_c = aux_test04(p); + + nout << "complement(p) = " << p_c << endl; + + Pointset_Powerset 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 q_c = aux_test04(q); + + nout << "complement(q) = " << q_c << endl; + + Pointset_Powerset 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..33260c1 --- /dev/null +++ b/tests/Polyhedron/linearsystem1.cc @@ -0,0 +1,104 @@ +/* Test some functionality of class Linear_System. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include "files.hh" +#include + +namespace { + +bool +test01() { + const char* data_file = "linearsystem1.dat"; + + Variable A(0); + Variable B(1); + +#if 0 + // Using this seed and the checked 8-bit integer coefficients, + // the random number generator produces the minimum value during + // the following computations. + unsigned long problematic_seed = 1141853716; + Random_Number_Generator rng(problematic_seed); +#else + Random_Number_Generator rng; +#endif + +#define ROWS 7 +#define COLS 3 + + Linear_System ls1(NOT_NECESSARILY_CLOSED); + for (dimension_type rowi = 0; rowi < ROWS; ++rowi) { + Linear_Row row(COLS, + Linear_Row::Flags(NOT_NECESSARILY_CLOSED, + Linear_Row::RAY_OR_POINT_OR_INEQUALITY)); + for (dimension_type col = 0; col < COLS; ++col) { + rng.get(row[col], 0); + // The following workaround is to avoid trivial positive overflows + // when using bounded coefficients. + if (std::numeric_limits::is_bounded + && row[col] == std::numeric_limits::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. + ++row[col]; + } + + row.strong_normalize(); + ls1.insert(row); + + using std::fstream; + using std::ios_base; + fstream f; + open(f, data_file, ios_base::out); + ls1.ascii_dump(f); + close(f); + + open(f, data_file, ios_base::in); + Linear_System ls2(NECESSARILY_CLOSED); + ls2.ascii_load(f); + close(f); + + if (ls1 == ls2) + continue; + + nout << "Linear_System::ascii_dump/load test failed." << endl + << "m1.ascii_dump() gives" << endl; + ls1.ascii_dump(nout); + nout << "m2.ascii_dump() gives" << endl; + ls2.ascii_dump(nout); + + return false; + } + return true; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); +END_MAIN diff --git a/tests/Polyhedron/mapspacedims1.cc b/tests/Polyhedron/mapspacedims1.cc new file mode 100644 index 0000000..7810647 --- /dev/null +++ b/tests/Polyhedron/mapspacedims1.cc @@ -0,0 +1,481 @@ +/* Test Polyhedron::map_space_dimensions(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Partial_Function function; + + C_Polyhedron ph1(3); + + print_function(function, "*** function ***"); + print_constraints(ph1, "*** ph1 ***"); + + ph1.map_space_dimensions(function); + + C_Polyhedron known_result; + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after ph1.map_space_dimensions(function) ***"); + + return ok; +} + +bool +test02() { + Partial_Function function; + + C_Polyhedron ph1(3, EMPTY); + + print_function(function, "*** function ***"); + print_constraints(ph1, "*** ph1 ***"); + + ph1.map_space_dimensions(function); + + C_Polyhedron known_result(0, EMPTY); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after ph1.map_space_dimensions(function) ***"); + + return ok; +} + +bool +test03() { + Variable A(0); + Variable B(1); + Variable C(2); + + Partial_Function function; + function.insert(0, 2); + function.insert(2, 0); + function.insert(1, 1); + + Generator_System gs; + gs.insert(point(2*C)); + gs.insert(line(A + B)); + gs.insert(ray(A + C)); + + C_Polyhedron ph1(gs); + + print_function(function, "*** function ***"); + print_generators(ph1, "*** ph1 ***"); + + ph1.map_space_dimensions(function); + + Generator_System known_gs; + known_gs.insert(point(2*A)); + known_gs.insert(line(C + B)); + known_gs.insert(ray(C + A)); + C_Polyhedron known_result(known_gs); + + bool ok = (ph1 == known_result); + + print_generators(ph1, "*** after ph1.map_space_dimensions(function) ***"); + + return ok; +} + +bool +test04() { + Variable A(0); + Variable B(1); + Variable C(2); + + Partial_Function function; + function.insert(0, 1); + function.insert(2, 0); + + Generator_System gs; + gs.insert(point()); + gs.insert(ray(A + B)); + gs.insert(ray(A - C)); + + C_Polyhedron ph1(gs); + + print_function(function, "*** function ***"); + print_generators(ph1, "*** ph1 ***"); + + ph1.map_space_dimensions(function); + + Generator_System known_gs; + known_gs.insert(point()); + known_gs.insert(ray(B)); + known_gs.insert(ray(B - A)); + C_Polyhedron known_result(known_gs); + + bool ok = (ph1 == known_result); + + print_generators(ph1, "*** after ph1.map_space_dimensions(function) ***"); + + return ok; +} + +bool +test05() { + Variable A(0); + Variable B(1); + + Partial_Function function; + function.insert(2, 0); + function.insert(3, 2); + function.insert(4, 1); + + Generator_System gs; + gs.insert(point()); + gs.insert(ray(A)); + gs.insert(ray(B)); + + C_Polyhedron ph1(gs); + + print_function(function, "*** function ***"); + print_generators(ph1, "*** ph1 ***"); + + ph1.map_space_dimensions(function); + + C_Polyhedron known_result(3, EMPTY); + known_result.add_generator(point()); + + bool ok = (ph1 == known_result); + + print_generators(ph1, "*** after ph1.map_space_dimensions(function) ***"); + + return ok; +} + +bool +test06() { + Variable A(0); + Variable B(1); + + Partial_Function function; + function.insert(0, 0); + function.insert(1, 1); + + Generator_System gs; + gs.insert(point()); + gs.insert(point(A)); + gs.insert(point(B)); + gs.insert(point(A + B)); + + C_Polyhedron ph1(gs); + C_Polyhedron known_result(ph1); + + print_function(function, "*** function ***"); + print_generators(ph1, "*** ph1 ***"); + + ph1.map_space_dimensions(function); + + bool ok = (ph1 == known_result); + + print_generators(ph1, "*** after ph1.map_space_dimensions(function) ***"); + + return ok; +} + +bool +test07() { + Variable A(0); + Variable B(1); + + Partial_Function function; + function.insert(0, 1); + function.insert(1, 0); + function.insert(2, 2); + function.insert(3, 3); + + Generator_System gs; + gs.insert(point()); + gs.insert(point(A)); + gs.insert(point(2*B)); + gs.insert(point(A + 2*B)); + + C_Polyhedron ph1(gs); + + print_function(function, "*** function ***"); + print_generators(ph1, "*** ph1 ***"); + + ph1.map_space_dimensions(function); + + C_Polyhedron known_result(4, EMPTY); + known_result.add_generator(point()); + known_result.add_generator(point(B)); + known_result.add_generator(point(2*A)); + known_result.add_generator(point(2*A + B)); + + bool ok = (ph1 == known_result); + + print_generators(ph1, "*** after ph1.map_space_dimensions(function) ***"); + + return ok; +} + +bool +test08() { + Variable A(0); + Variable B(1); + + Partial_Function function; + function.insert(0, 0); + function.insert(2, 1); + function.insert(3, 2); + + Generator_System gs; + gs.insert(point()); + gs.insert(point(A)); + gs.insert(ray(B)); + gs.insert(ray(A + B)); + + C_Polyhedron ph1(gs); + + print_function(function, "*** function ***"); + print_generators(ph1, "*** ph1 ***"); + + ph1.map_space_dimensions(function); + + C_Polyhedron known_result(3, EMPTY); + known_result.add_generator(point()); + known_result.add_generator(ray(A)); + + bool ok = (ph1 == known_result); + + print_generators(ph1, "*** after ph1.map_space_dimensions(function) ***"); + + return ok; +} + +bool +test09() { + Partial_Function function; + function.insert(0, 1); + function.insert(1, 0); + + C_Polyhedron ph1(3, EMPTY); + + print_function(function, "*** function ***"); + print_constraints(ph1, "*** ph1 ***"); + + ph1.map_space_dimensions(function); + + C_Polyhedron known_result(2, EMPTY); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after ph1.map_space_dimensions(function) ***"); + + return ok; +} + +bool +test10() { + Variable x(0); + Variable y(1); + Variable z(2); + + Partial_Function rotate_right; + rotate_right.insert(0, 1); + rotate_right.insert(1, 2); + rotate_right.insert(2, 0); + + Partial_Function rotate_left; + rotate_left.insert(0, 2); + rotate_left.insert(1, 0); + rotate_left.insert(2, 1); + + C_Polyhedron ph(3); + ph.add_constraint(-4*x - 2*y + z >= -8); + ph.add_constraint(-4*x + 2*y + z >= 4); + ph.add_constraint(-2*x - y + 2*z >= -1); + ph.add_constraint(-2*x + y + 2*z >= 5); + ph.add_constraint(-x - y - 2*z >= -13); + ph.add_constraint(-x - z >= -5); + ph.add_constraint(-x >= -1); + ph.add_constraint(-x + y - 2*z >= -7); + ph.add_constraint(-y >= -4); + ph.add_constraint(y >= 2); + ph.add_constraint(x >= 0); + + print_constraints(ph, "*** ph ***"); + print_function(rotate_right, "*** rotate_right ***"); + print_function(rotate_left, "*** rotate_left ***"); + + C_Polyhedron rs[4]; + rs[0] = ph; + + print_constraints(rs[0], "*** rs[0] ***"); + + for (int i = 1; i <= 3; ++i) { + rs[i] = rs[i-1]; + rs[i].map_space_dimensions(rotate_right); + + print_constraints(rs[i], "*** rs[i] ***"); + + } + + C_Polyhedron ls[4]; + ls[3] = ph; + + print_constraints(ls[3], "*** ls[3] ***"); + + for (int i = 2; i >= 0; --i) { + ls[i] = ls[i+1]; + // Force generators to be up-to-date, for a change. + (void) ls[i].generators(); + ls[i].map_space_dimensions(rotate_left); + + print_constraints(ls[i], "*** ls[i] ***"); + + } + + for (int i = 0; i <= 3; ++i) + if (rs[i] != ls[i]) { + nout << "rs[" << i << "] != ls[" << i << "]" << endl; + return false; + } + + return true; +} + +bool +test11() { + Variable A(0); + Variable B(1); + Variable C(2); + + C_Polyhedron ph(3); + ph.add_constraint(A >= 2); + ph.add_constraint(B >= 1); + ph.add_constraint(C >= 0); + + Partial_Function rotate_right; + rotate_right.insert(0, 1); + rotate_right.insert(1, 2); + rotate_right.insert(2, 0); + + print_constraints(ph, "*** ph ***"); + print_function(rotate_right, "*** rotate_right ***"); + + ph.map_space_dimensions(rotate_right); + + C_Polyhedron known_result(3); + known_result.add_constraint(A >= 0); + known_result.add_constraint(B >= 2); + known_result.add_constraint(C >= 1); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** after ph.map_space_dimensions(rotate_right) ***"); + + return ok; +} + +bool +test12() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.add_constraint(-A + B == 0); + + Partial_Function rotate_right; + rotate_right.insert(0, 1); + rotate_right.insert(1, 0); + + print_constraints(ph, "*** ph ***"); + print_function(rotate_right, "*** rotate_right ***"); + + ph.map_space_dimensions(rotate_right); + + C_Polyhedron known_result(2); + known_result.add_constraint(A == B); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** after ph.map_space_dimensions(rotate_right) ***"); + + return ok; +} + +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..2a7776a --- /dev/null +++ b/tests/Polyhedron/matrix1.cc @@ -0,0 +1,71 @@ +/* Test some functionality of class Matrix. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include "files.hh" +#include + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + Random_Number_Generator r; + const char* data_file = "matrix1.dat"; + + for (dimension_type num_rows = 0; num_rows <= 3; ++num_rows) + for (dimension_type num_cols = 0; num_cols <= 3; ++num_cols) { + Matrix m1(num_rows, num_cols); + for (dimension_type row = 0; row < num_rows; ++row) + for (dimension_type col = 0; col < num_cols; ++col) + r.get(m1[row][col], 0); + + 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 m2; + m2.ascii_load(f); + close(f); + + if (m1 != m2) { + + nout << "Matrix::ascii_dump/load test failed." << endl + << "m1.ascii_dump() gives" << endl; + m1.ascii_dump(nout); + nout << "m2.ascii_dump() gives" << endl; + m2.ascii_dump(nout); + + return false; + } + } + return true; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); +END_MAIN diff --git a/tests/Polyhedron/max_min1.cc b/tests/Polyhedron/max_min1.cc new file mode 100644 index 0000000..c8da74b --- /dev/null +++ b/tests/Polyhedron/max_min1.cc @@ -0,0 +1,181 @@ +/* Test Polyhedron::maximize(const Linear_Expression&, ...) + and Polyhedron::minimize(const Linear_Expression&, ...). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x1(0); + Variable x2(1); + + C_Polyhedron ph(2); + ph.add_constraint(-2*x1-x2 >= -5); + ph.add_constraint(4*x1-4*x2 >= -5); + ph.add_constraint(x1 >= 0); + ph.add_constraint(x2 >= 0); + + print_constraints(ph, "*** ph ***"); + + Coefficient num; + Coefficient den; + bool included; + Generator g(point()); + bool ok = ph.maximize(x1-2*x2, num, den, included, g) + && num == 5 && den == 2 && included + && g.is_point() + && g.coefficient(x1) == 5 && g.coefficient(x2) == 0 + && g.divisor() == 2; + + nout << (included ? "maximum" : "supremum") << " = " << num; + if (den != 1) + nout << "/" << den; + nout << " @ "; + print_generator(g); + nout << endl; + + if (!ok) + return false; + + ok = ph.minimize(x1-2*x2, num, den, included, g) + && num == -15 && den == 4 && included + && g.is_point() + && g.coefficient(x1) == 5 && g.coefficient(x2) == 10 + && g.divisor() == 4; + + nout << (included ? "minimum" : "infimum") << " = " << num; + if (den != 1) + nout << "/" << den; + nout << " @ "; + print_generator(g); + nout << endl; + + return ok; +} + +bool +test02() { + Variable x1(0); + Variable x2(1); + Variable x3(2); + + C_Polyhedron ph(3); + ph.add_constraint(-x1-x2-x3 >= -100); + ph.add_constraint(-10*x1-4*x2-5*x3 >= -600); + ph.add_constraint(-x1-x2-3*x3 >= -150); + ph.add_constraint(x1 >= 0); + ph.add_constraint(x2 >= 0); + ph.add_constraint(x3 >= 0); + + print_constraints(ph, "*** ph ***"); + + Coefficient num; + Coefficient den; + bool included; + Generator g(point()); + bool ok = ph.maximize(-10*x1-6*x2-4*x3+4, num, den, included, g) + && num == 4 && den == 1 && included + && g.is_point() + && g.coefficient(x1) == 0 + && g.coefficient(x2) == 0 + && g.coefficient(x3) == 0 + && g.divisor() == 1; + + nout << (included ? "maximum" : "supremum") << " = " << num; + if (den != 1) + nout << "/" << den; + nout << " @ "; + print_generator(g); + nout << endl; + + if (!ok) + return false; + + ok = ph.minimize(-10*x1-6*x2-4*x3+4, num, den, included, g) + && num == -2188 && den == 3 && included + && g.is_point() + && g.coefficient(x1) == 100 + && g.coefficient(x2) == 200 + && g.coefficient(x3) == 0 + && g.divisor() == 3; + + nout << (included ? "minimum" : "infimum") << " = " << num; + if (den != 1) + nout << "/" << den; + nout << " @ "; + print_generator(g); + nout << endl; + + return ok; +} + +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; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST_F8(test02); + DO_TEST(test03); +END_MAIN diff --git a/tests/Polyhedron/maxspacedim1.cc b/tests/Polyhedron/maxspacedim1.cc new file mode 100644 index 0000000..56ba3fa --- /dev/null +++ b/tests/Polyhedron/maxspacedim1.cc @@ -0,0 +1,136 @@ +/* Test the *::max_space_dimension() methods. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +#define 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) +#else +#define test01_DO_WRD_FLOAT(WRD) +#endif +#if PPL_SUPPORTED_DOUBLE +#define test01_DO_WRD_DOUBLE(WRD) test01_DO_CLASS(WRD) +#else +#define test01_DO_WRD_DOUBLE(WRD) +#endif +#if PPL_SUPPORTED_LONG_DOUBLE +#define test01_DO_WRD_LONG_DOUBLE(WRD) test01_DO_CLASS(WRD) +#else +#define test01_DO_WRD_LONG_DOUBLE(WRD) +#endif + +#define test01_DO_WRD(WRD) \ + test01_DO_CLASS(WRD); \ + test01_DO_CLASS(WRD); \ + test01_DO_CLASS(WRD); \ + test01_DO_CLASS(WRD); \ + test01_DO_CLASS(WRD); \ + test01_DO_CLASS(WRD); \ + 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::max_space_dimension() << endl; \ + if (CONSTR::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) +#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) +#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) +#else +#define test01_DO_CONSTR_WRD_LONG_DOUBLE(CONSTR, WRD) +#endif + +#define test01_DO_CONSTR_WRD(CONSTR, WRD) \ + test01_DO_CONSTR_CLASS(CONSTR, WRD); \ + test01_DO_CONSTR_CLASS(CONSTR, WRD); \ + test01_DO_CONSTR_CLASS(CONSTR, WRD); \ + test01_DO_CONSTR_CLASS(CONSTR, WRD); \ + test01_DO_CONSTR_CLASS(CONSTR, WRD); \ + test01_DO_CONSTR_CLASS(CONSTR, WRD); \ + 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..1e71ab9 --- /dev/null +++ b/tests/Polyhedron/mc91.cc @@ -0,0 +1,117 @@ +/* Test the Pointset_Powerset construction with McCarthy's 91 function. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + typedef Pointset_Powerset 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 b1(2); + b1.concatenate_assign(previous); + b1.add_space_dimensions_and_embed(2); + current.intersection_assign(b1); + Pointset_Powerset 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 + (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 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..f46f64b --- /dev/null +++ b/tests/Polyhedron/membytes1.cc @@ -0,0 +1,291 @@ +/* Test the total_memory_in_bytes() and external_memory_in_bytes() methods. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +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 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 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 pqh(qh); + + Pointset_Powerset 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..b14c94d --- /dev/null +++ b/tests/Polyhedron/memory1.cc @@ -0,0 +1,219 @@ +/* Test the allocation error recovery facility of the library. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/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 +#include +#include +#include + +#ifdef PPL_HAVE_SYS_TYPES_H +# include +#endif + +#ifdef PPL_HAVE_SYS_TIME_H +# include +#endif + +#ifdef PPL_HAVE_SYS_RESOURCE_H +// This should be included after and so as to make +// sure we have the definitions for, e.g., `ru_utime'. +# include +#endif + +#ifdef PPL_HAVE_UNISTD_H +# include +#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 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 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..1e5d629 --- /dev/null +++ b/tests/Polyhedron/memory2.cc @@ -0,0 +1,258 @@ +/* Test the allocation error recovery facility of the library. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include +#include +#include + +// 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* matrix = new Matrix(2, 5); + // We will get here only if no exception is thrown: + // this happens when using native coefficients. + delete matrix; + } + catch (const std::bad_alloc&) { + nout << "std::bad_alloc caught" << endl; + fail_if_leaked(); + } + catch (...) { + nout << "exception different from std::bad_alloc caught" << endl; + fail_if_leaked(); + } +} + +enum Threshold { Malloc, Realloc }; + +void +test_every_allocation(const dimension_type d, const Threshold threshold) { + // Run once without checking so as to allow for the allocation of + // statically allocated coefficients. + bool dry_run = true; + unsigned long k = ULONG_MAX; + bool go_ahead; + do { + nout << "**************** k = " << k << " ****************" << endl; + if (dry_run) + nout << "*************** dry run ***************" << endl; + go_ahead = dry_run; + if (threshold == Malloc) + reset_allocators(k, ULONG_MAX); + else + reset_allocators(ULONG_MAX, k); + try { + C_Polyhedron ph(d); + ph.add_constraint(Variable(0) == ULONG_MAX); + for (dimension_type i = 1; i < d; ++i) + ph.add_constraint(Variable(i) == ULONG_MAX*Variable(i-1)); + + (void) ph.minimized_generators(); + } + catch (const std::bad_alloc&) { + nout << "std::bad_alloc caught" << endl; + fail_if_leaked(); + go_ahead = true; + ++k; + } + catch (...) { + nout << "exception different from std::bad_alloc caught" << endl; + fail_if_leaked(); + // Notice that we do not go ahead if we did not catch a bad_alloc. + } + if (dry_run) { + dry_run = false; + k = 0; + } + } while (go_ahead); +} + +void +test2() { + nout << "test2()" << endl; + test_every_allocation(5, Malloc); +} + +void +test3() { + nout << "test3()" << endl; + test_every_allocation(10, Realloc); +} + + +} // namespace + +#define IGNORE_OVERFLOWS(fun) \ + try { \ + fun; \ + } \ + catch (const std::overflow_error&) { \ + } + +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..1a7e654 --- /dev/null +++ b/tests/Polyhedron/minconstraints1.cc @@ -0,0 +1,77 @@ +/* Test Polyhedron::minimized_constraints(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1(2); + ph1.add_constraint(A >= 0); + ph1.add_constraint(B >= 0); + ph1.add_constraint(A + B >= -2); + ph1.add_constraint(A >= -3); + + const Constraint_System cs = ph1.minimized_constraints(); + + C_Polyhedron ph2(cs); + C_Polyhedron known_result(2); + known_result.add_constraint(A >= 0); + known_result.add_constraint(B >= 0); + + bool ok = (known_result == ph2); + + print_constraints(ph2, "*** ph2 ***"); + + return ok; +} + +bool +test02() { + C_Polyhedron ph1(2, EMPTY); + + print_constraints(ph1, "*** ph1 ***"); + + C_Polyhedron known_result; + known_result = ph1; + + Constraint_System cs = ph1.minimized_constraints(); + + C_Polyhedron ph2(cs); + + bool ok = (ph2 == known_result); + + print_constraints(cs, "*** cs ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); +END_MAIN diff --git a/tests/Polyhedron/minconstraints2.cc b/tests/Polyhedron/minconstraints2.cc new file mode 100644 index 0000000..c8c5807 --- /dev/null +++ b/tests/Polyhedron/minconstraints2.cc @@ -0,0 +1,70 @@ +/* Test Polyhedron::minimized_constraints(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include + +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..c057233 --- /dev/null +++ b/tests/Polyhedron/mingenerators1.cc @@ -0,0 +1,85 @@ +/* Test Polyhedron::minimized_generators(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + Generator_System gs1; + gs1.insert(point()); + gs1.insert(point(B)); + gs1.insert(line(A)); + gs1.insert(ray(B)); + gs1.insert(ray(A + B)); + gs1.insert(ray(-A + B)); + + C_Polyhedron ph1(gs1); + + const Generator_System gs2 = ph1.minimized_generators(); + + print_generators(gs2, "*** gs2 ***"); + + C_Polyhedron ph2(gs2); + Generator_System known_gs; + known_gs.insert(point()); + known_gs.insert(line(A)); + known_gs.insert(ray(B)); + C_Polyhedron known_result(known_gs); + + bool ok = (ph2 == known_result); + + print_generators(ph2, "*** ph2 ***"); + + return ok; +} + +bool +test02() { + C_Polyhedron ph1(2, EMPTY); + + print_generators(ph1, "*** ph1 ***"); + + C_Polyhedron known_result = ph1; + + Generator_System gs = ph1.minimized_generators(); + + C_Polyhedron ph2(2, EMPTY); + ph2.add_generators(gs); + + bool ok = (ph2 == known_result); + + print_generators(gs, "*** gs ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); +END_MAIN diff --git a/tests/Polyhedron/mingenerators2.cc b/tests/Polyhedron/mingenerators2.cc new file mode 100644 index 0000000..692356d --- /dev/null +++ b/tests/Polyhedron/mingenerators2.cc @@ -0,0 +1,48 @@ +/* Test Polyhedron::minimized_generators(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + NNC_Polyhedron ph1; + + Generator_System gs = ph1.minimized_generators(); + + NNC_Polyhedron ph2(gs); + + bool ok = (ph1 == ph2); + + print_generators(ph1, "*** ph1 ***"); + print_generators(gs, "*** gs ***"); + print_generators(ph2, "*** ph2 ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); +END_MAIN diff --git a/tests/Polyhedron/nncminimize1.cc b/tests/Polyhedron/nncminimize1.cc new file mode 100644 index 0000000..db3e230 --- /dev/null +++ b/tests/Polyhedron/nncminimize1.cc @@ -0,0 +1,379 @@ +/* Test minimization of NNC polyhedra. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + // Building a square. + Constraint_System cs; + cs.insert(x >= 0); + cs.insert(x <= 6); + cs.insert(y >= 0); + cs.insert(y <= 6); + + NNC_Polyhedron ph(cs); + + nout << "Topologically closed square" << endl; + print_constraints(ph.constraints(), "*** ph constraints ***"); + print_generators(ph.generators(), "*** ph generators ***"); + + // Removing all the vertices using strict inequalities. + cs.clear(); + cs.insert(x + y > 0); + cs.insert(x + y < 12); + cs.insert(x - y < 6); + cs.insert(x - y > -6); + + ph.add_constraints_and_minimize(cs); + + nout << "After vertices removal:" << endl; + print_constraints(ph.constraints(), "*** ph constraints ***"); + print_generators(ph.generators(), "*** ph generators ***"); + + ph.minimized_generators(); + + Generator_System gs; + gs.insert(closure_point()); + gs.insert(closure_point(6*x)); + gs.insert(closure_point(6*y)); + gs.insert(closure_point(6*x + 6*y)); + gs.insert(point(3*x)); + gs.insert(point(3*y)); + gs.insert(point(3*x + 6*y)); + gs.insert(point(6*x + 3*y)); + + NNC_Polyhedron known_result(gs); + + bool ok = (ph == known_result); + + const Generator_System& min_gs = ph.minimized_generators(); + bool ok1 = (std::distance(min_gs.begin(), min_gs.end()) == 8); + + nout << "After NNC minimization:" << endl; + print_constraints(ph.constraints(), "*** ph constraints ***"); + print_generators(ph.generators(), "*** ph generators ***"); + + return ok && ok1; +} + +bool +test02() { + Variable x(0); + Variable y(1); + + // Building a square. + Constraint_System cs; + cs.insert(x >= 0); + cs.insert(x <= 1); + cs.insert(y >= 0); + cs.insert(y <= 1); + + NNC_Polyhedron ph(cs); + + nout << "Topologically closed square" << endl; + print_constraints(ph.constraints(), "*** ph constraints ***"); + print_generators(ph.generators(), "*** ph generators ***"); + + // Removing all the vertices using strict inequalities. + cs.clear(); + cs.insert(x + y > 0); + cs.insert(x + y < 2); + cs.insert(x - y < 1); + cs.insert(x - y > -1); + + ph.add_constraints_and_minimize(cs); + + nout << "After vertices removal:" << endl; + print_constraints(ph.constraints(), "*** ph constraints ***"); + print_generators(ph.generators(), "*** ph generators ***"); + + ph.minimized_generators(); + + Generator_System gs; + gs.insert(closure_point()); + gs.insert(closure_point(x)); + gs.insert(closure_point(y)); + gs.insert(closure_point(x + y)); + gs.insert(point(x, 10)); + gs.insert(point(y, 10)); + gs.insert(point(x + 10*y, 10)); + gs.insert(point(10*x + y, 10)); + + NNC_Polyhedron known_result(gs); + + bool ok = (ph == known_result); + + const Generator_System& min_gs = ph.minimized_generators(); + bool ok1 = (std::distance(min_gs.begin(), min_gs.end()) == 8); + + nout << "After NNC minimization:" << endl; + print_constraints(ph.constraints(), "*** ph constraints ***"); + print_generators(ph.generators(), "*** ph generators ***"); + nout << endl; + nout << "known result" << endl; + print_constraints(known_result.constraints(), "*** known constraints ***"); + print_generators(known_result.generators(), "*** known generators ***"); + + return ok && ok1; +} + +bool +test03() { + Variable x(0); + Variable y(1); + + // Building a square. + Constraint_System cs; + cs.insert(x >= 0); + cs.insert(x <= 1); + cs.insert(y >= 0); + cs.insert(y <= 1); + + NNC_Polyhedron ph(cs); + + nout << "Topologically closed square" << endl; + print_constraints(ph.constraints(), "*** ph constraints ***"); + print_generators(ph.generators(), "*** ph generators ***"); + + // Removing all the vertices using strict inequalities. + cs.clear(); + cs.insert(x + y > 0); + cs.insert(x + y < 2); + cs.insert(x - y < 1); + cs.insert(x - y > -1); + + ph.add_constraints_and_minimize(cs); + + nout << "After vertices removal:" << endl; + print_constraints(ph.constraints(), "*** ph constraints ***"); + print_generators(ph.generators(), "*** ph generators ***"); + + Generator_System gs; + gs.insert(point(x + y, 4)); + gs.insert(point(x + 5*y, 4)); + gs.insert(point(5*x + y, 4)); + gs.insert(point(5*x + 5*y, 4)); + + NNC_Polyhedron ph2(gs); + + ph.intersection_assign(ph2); + + nout << "After intersection:" << endl; + print_constraints(ph.constraints(), "*** ph constraints ***"); + print_generators(ph.generators(), "*** ph generators ***"); + + ph.minimized_generators(); + + gs.clear(); + gs.insert(closure_point(x + y)); + gs.insert(point(x + y, 4)); + gs.insert(point(x + 4*y, 4)); + gs.insert(point(4*x + y, 4)); + NNC_Polyhedron known_result(gs); + + bool ok = (ph == known_result); + + const Generator_System& min_gs = ph.minimized_generators(); + bool ok1 = (std::distance(min_gs.begin(), min_gs.end()) == 4); + + nout << "After NNC minimization:" << endl; + print_constraints(ph.constraints(), "*** ph constraints ***"); + print_generators(ph.generators(), "*** ph generators ***"); + + return ok && ok1; +} + +bool +test04() { + Variable x(0); + Variable y(1); + + // Building an open square. + Generator_System gs; + gs.insert(closure_point()); + gs.insert(closure_point(15*x)); + gs.insert(closure_point(15*y)); + gs.insert(closure_point(15*x + 15*y)); + + // All of these points, but a (any) single one of them, are redundant. + gs.insert(point(3*x + 3*y)); + gs.insert(point(6*x + y)); + gs.insert(point(9*x + y)); + gs.insert(point(12*x + 3*y)); + gs.insert(point(3*x + 12*y)); + gs.insert(point(6*x + 14*y)); + gs.insert(point(9*x + 14*y)); + gs.insert(point(12*x + 12*y)); + gs.insert(point(x + 6*y)); + gs.insert(point(x + 9*y)); + gs.insert(point(14*x + 6*y)); + gs.insert(point(14*x + 9*y)); + + NNC_Polyhedron ph(gs); + + nout << endl << "Before NNC minimization:" << endl; + print_constraints(ph.constraints(), "*** ph constraints ***"); + print_generators(ph.generators(), "*** ph generators ***"); + + ph.minimized_constraints(); + + nout << endl << "After NNC minimization:" << endl; + print_constraints(ph.constraints(), "*** ph constraints ***"); + print_generators(ph.generators(), "*** ph generators ***"); + + gs.clear(); + gs.insert(closure_point()); + gs.insert(closure_point(15*x)); + gs.insert(closure_point(15*y)); + gs.insert(closure_point(15*x + 15*y)); + gs.insert(point(x + y)); + + NNC_Polyhedron known_result(gs); + bool ok = (ph == known_result); + + const Generator_System& min_gs = ph.minimized_generators(); + bool ok1 = (std::distance(min_gs.begin(), min_gs.end()) == 5); + + print_constraints(ph.constraints(), "*** ph constraints ***"); + print_generators(ph.generators(), "*** ph generators ***"); + + print_constraints(known_result.constraints(), + "*** known_result constraints ***"); + print_generators(known_result.generators(), + "*** known_result generators ***"); + return ok && ok1; +} + +bool +test05() { + Variable x(0); + + Constraint_System cs; + cs.insert(x > 0); + cs.insert(x < 2); + + NNC_Polyhedron ph1(cs); + + cs.clear(); + cs.insert(x > 2); + cs.insert(x < 3); + + NNC_Polyhedron ph2(cs); + + ph1.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..baf500d --- /dev/null +++ b/tests/Polyhedron/nncminimize2.cc @@ -0,0 +1,80 @@ +/* Test NNC_Polyhedron::ph.minimized_generators(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + Variable E(4); + + NNC_Polyhedron ph(5, EMPTY); + ph.add_generator(point(52131*A + 11369*B - 483036*C - 776212*D - 401649*E)); + ph.add_generator(point(-80461*A + 86836*B + 88698*C - 269590*D + 951545*E)); + ph.add_generator(point(215169*A - 42532*B + 234755*C + 705077*D - 632177*E)); + ph.add_generator(point(-294493*A - 44546*B + 861680*C + 344228*D + 224283*E)); + ph.add_generator(point(-158536*A + 273936*B - 854715*C - 151614*D + 382491*E)); + ph.add_generator(point(-207881*A - 205091*B - 385540*C + 729319*D + 483915*E)); + ph.add_generator(point(-1084*A + 2507*B - 28428*C + 1882*D - 999590*E)); + + ph.add_generator(point(450943*A - 416394*B + 883*C + 680432*D - 400345*E)); + ph.add_generator(point(-483589*A - 16983*B - 824243*C + 106969*D - 273921*E)); + ph.add_generator(point(554952*A - 155460*B - 572886*C - 91530*D + 575571*E)); + ph.ascii_dump(vnout); + vnout << endl; + + const Generator_System& gs = ph.minimized_generators(); + ph.ascii_dump(vnout); + vnout << endl; + + if (!ph.OK()) + return false; + + bool ok = true; + unsigned num_points = 0; + for (Generator_System::const_iterator i = gs.begin(), gs_end = gs.end(); + i != gs_end; + ++i) { + using namespace IO_Operators; + nout << *i << endl; + if (i->type() != Generator::POINT) { + nout << "i->type() == " << i->type() << endl; + ok = false; + } + ++num_points; + } + + nout << "points = " << num_points << endl; + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST_F64(test01); +END_MAIN diff --git a/tests/Polyhedron/numberinput1.cc b/tests/Polyhedron/numberinput1.cc new file mode 100644 index 0000000..42d8f15 --- /dev/null +++ b/tests/Polyhedron/numberinput1.cc @@ -0,0 +1,341 @@ +/* Test number input. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include +#include +#include + +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 == VC_NAN) + return; + Extended_Number_Policy::handle_result(r); +} + +bool +aux_test(std::string input_string, + std::string expected_output, + std::string expected_residual, + Result expected_result) { + std::stringstream input_stream(input_string); + Checked_Number value; + Result result = input(value, input_stream, ROUND_UP); + std::string residual; + getline(input_stream, residual, '\0'); + std::stringstream output_stream; + output_stream << value; + std::string output = output_stream.str(); + + bool ok = (result == expected_result + && residual == expected_residual + && output == expected_output); + + nout << "input = \"" << input_string << "\"" + << endl + << "expected result = " << expected_result + << ", actual result = " << result + << endl + << "expected value = \"" << expected_output << "\"" + << ", actual value = \"" << output << "\"" + << endl + << "expected residual = \"" << expected_residual << "\"" + << ", actual residual = \"" << residual << "\"" + << endl; + + return ok; +} + +// Testing symbols. +bool +test01() { + return aux_test("inf", "+inf", "", V_EQ) + && aux_test("InF", "+inf", "", V_EQ) + && aux_test("+inF", "+inf", "", V_EQ) + && aux_test("-InF", "-inf", "", V_EQ) + && aux_test("-InFinity", "-inf", "inity", V_EQ) + && aux_test("Inf7", "+inf", "7", V_EQ) + && aux_test("nan", "nan", "", VC_NAN) + && aux_test("NAN", "nan", "", VC_NAN) + && aux_test("Nan", "nan", "", VC_NAN); +} + +// Testing symbols with trailing input and errors. +bool +test02() { + return aux_test("nAn+", "nan", "+", VC_NAN) + && aux_test("naN/", "nan", "/", VC_NAN) + && aux_test("nAN/0", "nan", "/0", VC_NAN) + && aux_test("nAN/-3", "nan", "/-3", VC_NAN) + && aux_test("inF/3", "+inf", "/3", V_EQ) + && aux_test("Inf/-3", "+inf", "/-3", V_EQ) + && aux_test("-inf/-3", "-inf", "/-3", V_EQ) + && aux_test("-NAn", "nan", "NAn", V_CVT_STR_UNK); +} + +// Testing integers. +bool +test03() { + return aux_test(" - 2", "nan", " 2", V_CVT_STR_UNK) + && aux_test("15", "15", "", V_EQ) + && aux_test("34976098", "34976098", "", V_EQ) + && aux_test("34976098349760983497609834976098", + "34976098349760983497609834976098", "", V_EQ) + && aux_test("3/-inf", "nan", "", V_CVT_STR_UNK) + && aux_test("+77", "77", "", V_EQ) + && aux_test("-77", "-77", "", V_EQ) + && aux_test("-7777777777777777777777777", + "-7777777777777777777777777", "", V_EQ) + && aux_test("-77 ", "-77", " ", V_EQ) + && aux_test("-77 ", "-77", " ", V_EQ) + && aux_test("-77ab", "-77", "ab", V_EQ) + && aux_test("-77,33", "-77", ",33", V_EQ) + && aux_test(" - 2", "nan", " 2", V_CVT_STR_UNK); +} + +// Testing fractions. +bool +test04() { + return aux_test("71.3", "713/10", "", V_EQ) + && aux_test("0.123456", "1929/15625", "", V_EQ) + && aux_test("12345678910111213141516.12345678910111213141516", + "308641972752780328537903086419727527803285379/25000000000000000000000", + "", V_EQ) + && aux_test("0.123456 101", "1929/15625", " 101", V_EQ) + && aux_test("0.123456 101", "1929/15625", " 101", V_EQ) + && aux_test("0.123456 ", "1929/15625", " ", V_EQ) + && aux_test(".333", "nan", ".333", V_CVT_STR_UNK); +} + +// Testing exponent. +bool +test05() { + return aux_test("15e1", "150", "", V_EQ) + && aux_test("15*^8", "1500000000", "", V_EQ) + && aux_test("1*^009", "1000000000", "", V_EQ) + && aux_test("15*^111", + "15000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "", V_EQ) + && aux_test("151515e+1", "1515150", "", V_EQ) + && aux_test("151515151515151515e+1", "1515151515151515150", "", V_EQ) + && aux_test("9200e-2", "92", "", V_EQ) + && aux_test("15*^7e4", "150000000", "e4", V_EQ) + && aux_test("15*^6/", "nan", "", V_CVT_STR_UNK) + && aux_test("9200e", "nan", "", V_CVT_STR_UNK) + && aux_test("9200ea", "nan", "a", V_CVT_STR_UNK) + && aux_test("9200*^", "nan", "", V_CVT_STR_UNK) + && aux_test("9200*^b", "nan", "b", V_CVT_STR_UNK) + // Exponent and fraction. + && aux_test("5.3e3", "5300", "", V_EQ) + && aux_test("2.2e-1", "11/50", "", V_EQ) + && aux_test("5.33333*^-4", "533333/1000000000", "", V_EQ) + && aux_test("-2.20001*^+3", "-220001/100", "", V_EQ) + && aux_test("7.e", "nan", "", V_CVT_STR_UNK) + && aux_test("7.0 e3", "7", " e3", V_EQ); +} + +// Testing exponent size limit. +bool +test06() { + std::stringstream ss; + ss << "1e" << (LONG_MAX / 10) + 1 << "0"; + std::stringstream ss2; + ss2 << "1e" << (LONG_MAX / 10) << (LONG_MAX % 10) + 1; + return aux_test(ss.str(), "nan", "", V_CVT_STR_UNK) + && aux_test(ss2.str(), "nan", "", V_CVT_STR_UNK); +} + +// Testing hexadecimals. +bool +test07() { + return aux_test("0x", "nan", "", V_CVT_STR_UNK) + && aux_test("0xx", "nan", "x", V_CVT_STR_UNK) + && aux_test("0x0.f", "15/16", "", V_EQ) + && aux_test("0x.f", "15/16", "", V_EQ) + && aux_test("0x.f*^1", "15", "", V_EQ) + && aux_test("0x-f", "nan", "-f", V_CVT_STR_UNK) + && aux_test("0xfa", "250", "", V_EQ) + && aux_test("-0xfa", "-250", "", V_EQ) + && aux_test("-0x000000000000000000000000fa", "-250", "", V_EQ) + && aux_test("-0xfaz", "-250", "z", V_EQ) + && aux_test("-0xfa .", "-250", " .", V_EQ) + && aux_test("0xfa0xfa", "4000", "xfa", V_EQ) + && aux_test("0x0b123", "45347", "", V_EQ); +} + +// Testing hexadecimals fractions and exponents. +bool +test08() { + return + // Fraction. + aux_test("0xfa.a", "2005/8", "", V_EQ) + && aux_test("0xfa.ay", "2005/8", "y", V_EQ) + && aux_test("-0xfa.", "-250", "", V_EQ) + // Exponent. + && aux_test("0x1e2", "482", "", V_EQ) + && aux_test("0x1*^2", "256", "", V_EQ) + && aux_test("0x1*^2-1", "256", "-1", V_EQ) + // Fraction and exponent. + && aux_test("0x0.1*^3", "256", "", V_EQ) + && aux_test("-0x29382a093589c501594f729e672567.2f09f342582b4598*^-2", + "-493504168323155221903720496056512238754896365637429427/590295810358705651712", + "", V_EQ) + && aux_test("-0x29382a093589c501594f729e672567.2f09f342582b4598*^-20", + "-493504168323155221903720496056512238754896365637429427/2787593149816327892691964784081045188247552", + "", V_EQ) + && aux_test("-0x29382a093589c501594f729e672567.2f09f342582b4598*^-20b", + "-493504168323155221903720496056512238754896365637429427/2787593149816327892691964784081045188247552", + "b", V_EQ) + && aux_test("0x0.1*^3 -0", "256", " -0", V_EQ); +} + +// Testing bases. +bool +test09() { + return aux_test("3^^", "nan", "", V_CVT_STR_UNK) + && aux_test("3^^z", "nan", "z", V_CVT_STR_UNK) + && aux_test("^^3", "nan", "^^3", V_CVT_STR_UNK) + && aux_test("3^^1", "1", "", V_EQ) + && aux_test("2^^0", "0", "", V_EQ) + && aux_test("2^^1", "1", "", V_EQ) + && aux_test("2^^10", "2", "", V_EQ) + && aux_test("2^^11", "3", "", V_EQ) + && aux_test("36^^z", "35", "", V_EQ) + && aux_test("36^^yz", "1259", "", V_EQ) + && aux_test("36^^xyz", "44027", "", V_EQ) + && aux_test("37^^2", "nan", "^2", V_CVT_STR_UNK) + && aux_test("37^^1.1", "nan", "^1.1", V_CVT_STR_UNK) + && aux_test("2^^113", "3", "3", V_EQ) + && aux_test("2^^11 3", "3", " 3", V_EQ) + && aux_test("3^^e2", "nan", "e2", V_CVT_STR_UNK); +} + +// Testing bases with fractions and exponents. +bool +test10() { + return + // Fraction. + aux_test("2^^11.1", "7/2", "", V_EQ) + && aux_test("2^^11.1a", "7/2", "a", V_EQ) + && aux_test("2^^11.1.", "7/2", ".", V_EQ) + && aux_test("2^^11.1 ", "7/2", " ", V_EQ) + // Exponent. + && aux_test("10^^2e3", "2000", "", V_EQ) + && aux_test("8^^2e3", "1024", "", V_EQ) + && aux_test("8^^2e38", "41538374868278621028243970633760768", "", V_EQ) + && aux_test("8^^2e3e", "1024", "e", V_EQ) + // Fraction and exponent. + && aux_test("8^^2.1e3", "1088", "", V_EQ) + && aux_test("8^^20402543.120347e7", "9073863231288", "", V_EQ) + && aux_test("8^^2.18e3", "17/8", "8e3", V_EQ); +} + +// Testing denominators. +bool +test11() { + return aux_test("15/0", "nan", "", VC_NAN) + && aux_test("15/1", "15", "", V_EQ) + && aux_test("15/3", "5", "", V_EQ) + && aux_test("15/-3", "-5", "", V_EQ) + && aux_test("15/3f", "5", "f", V_EQ); +} + +// Testing denominators with fractions and exponents. +bool +test12() { + return + // Fraction. + aux_test("27.9/3.1", "9", "", V_EQ) + && aux_test("27.9/3.1=9", "9", "=9", V_EQ) + // Exponent. + && aux_test("15/30e-1", "5", "", V_EQ) + && aux_test("27e3/30e-1", "9000", "", V_EQ) + && aux_test("15*^-3/29e2", "3/580000", "", V_EQ) + && aux_test("15/30e-1,2", "5", ",2", V_EQ) + && aux_test("15/30e-1.2", "5", ".2", V_EQ) + // Exponent and fraction. + && aux_test("27.9e3/30e-1", "9300", "", V_EQ) + && aux_test("27.9e3/30e-1/2", "9300", "/2", V_EQ) + && aux_test("27.9e3/30e-1^^", "9300", "^^", V_EQ); +} + +// Testing denominators with hexadecimals and bases. +bool +test13() { + return + // Hexadecimal. + aux_test("0xf/0x3", "5", "", V_EQ) + && aux_test("3048227.23429e3/0x230abc43", + "304822723429/58790611500", "", V_EQ) + && aux_test("0xf/0x3g", "5", "g", V_EQ) + // Base. + && aux_test("16^^f/4^^3.0e0*^3", "5", "*^3", V_EQ); +} + +// LARGE_NUM has 14057 digits. +#define LARGE_NUM "29382093589501594796725672938209358950159472967256372938209358950159472967256729382093589501594729672567293820935899501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729611972567293820935899501594729672567229382093589501594292729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567299382093589501594072967256729382093589501594729672567293820935895015947296725672938209358950159472967256729383333332093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567" + +// Testing a very large number. +bool +test14() { + return aux_test(LARGE_NUM, LARGE_NUM, "", V_EQ); +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test03); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + DO_TEST(test06); + DO_TEST(test07); + DO_TEST(test08); + DO_TEST(test09); + DO_TEST(test10); + DO_TEST(test11); + DO_TEST(test12); + DO_TEST(test13); + DO_TEST(test14); +END_MAIN diff --git a/tests/Polyhedron/onepoint.cc b/tests/Polyhedron/onepoint.cc new file mode 100644 index 0000000..1e39b87 --- /dev/null +++ b/tests/Polyhedron/onepoint.cc @@ -0,0 +1,56 @@ +/* Creation of a one-point polyhedron. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + Variable z(2); + + C_Polyhedron ph(3, EMPTY); + ph.add_generator(point(-1000*x - 9*y, 16)); + + print_generators(ph, "*** generators ***"); + print_constraints(ph, "*** constraints ***"); + + C_Polyhedron known_result(3); + known_result.add_constraint(2*x == -125); + known_result.add_constraint(16*y == -9); + known_result.add_constraint(z == 0); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** ph ***"); + print_constraints(known_result, "*** known_result ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST_F8(test01); +END_MAIN diff --git a/tests/Polyhedron/permute.cc b/tests/Polyhedron/permute.cc new file mode 100644 index 0000000..eb67d08 --- /dev/null +++ b/tests/Polyhedron/permute.cc @@ -0,0 +1,222 @@ +/* An example of iteration to a post-fixpoint. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +void +shift_rename_add(const C_Polyhedron& p, + dimension_type offset, + C_Polyhedron& q) { + C_Polyhedron r(offset); + r.concatenate_assign(p); + q.intersection_assign(r); +} + +void +append_init(C_Polyhedron& base, C_Polyhedron& induct, C_Polyhedron& expect, + dimension_type& offset, unsigned int& arity) { + offset = 3; + arity = 3; + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + Variable E(4); + Variable F(5); + + // This is the base case: + // append(A,B,C) :- A = [], B = C. + base.add_space_dimensions_and_embed(3); + base.add_constraint(A == 0); + base.add_constraint(B >= 0); + base.add_constraint(C == B); + + print_constraints(base, "*** base ***"); + + // This is the inductive case: + // append(A,B,C) :- A = [X|D], B = E, C = [X|F], append(D,E,F). + induct.add_space_dimensions_and_embed(6); + induct.add_constraint(A + F == C + D); + induct.add_constraint(B == E); + induct.add_constraint(C + D >= A); + induct.add_constraint(D >= 0); + induct.add_constraint(B >= 0); + induct.add_constraint(A >= D + 1); + + print_constraints(induct, "*** inductive ***"); + + expect.add_space_dimensions_and_embed(3); + expect.add_constraint(A + B == C); + expect.add_constraint(B >= 0); + expect.add_constraint(C >= B); +} + +void +fix_point(C_Polyhedron& start, C_Polyhedron& induct, C_Polyhedron& finish, + dimension_type offset, unsigned int arity) { + // Initialize the fixpoint iteration. + C_Polyhedron current = start; + + print_constraints(current, "*** start ***"); + + // Contains the polyhedron computed at the previous iteration. + C_Polyhedron previous; + do { + previous = current; + current = induct; + shift_rename_add(previous, offset, current); + + print_constraints(current, "*** after shift_rename_add ***"); + + Variables_Set dimensions_to_remove; + dimension_type current_dim; + current_dim = current.space_dimension(); + for (dimension_type i = current_dim-1 ; i >= arity; --i ) + dimensions_to_remove.insert(Variable(i)); + current.remove_space_dimensions(dimensions_to_remove); + + print_constraints(current, "*** after remove_space_dimensions ***"); + + current.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..bce43fa --- /dev/null +++ b/tests/Polyhedron/polydifference1.cc @@ -0,0 +1,205 @@ +/* Test Polyhedron::difference_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + Generator_System gs1; + gs1.insert(point(0*x + 0*y)); + gs1.insert(point(4*x + 0*y)); + gs1.insert(point(2*x + 2*y)); + + C_Polyhedron ph1(gs1); + + print_generators(ph1, "*** ph1 ***"); + + Generator_System gs2; + gs2.insert(point(0*x + 3*y)); + gs2.insert(point(4*x + 3*y)); + gs2.insert(point(2*x + 1*y)); + + C_Polyhedron ph2(gs2); + + print_generators(ph2, "*** ph2 ***"); + + C_Polyhedron computed_result = ph1; + + computed_result.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..26be53a --- /dev/null +++ b/tests/Polyhedron/polydifference2.cc @@ -0,0 +1,175 @@ +/* Test Polyhedron::difference_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + Generator_System gs1; + gs1.insert(point(0*x + 0*y)); + gs1.insert(point(0*x + 3*y)); + gs1.insert(point(3*x + 0*y)); + gs1.insert(point(3*x + 3*y)); + + NNC_Polyhedron ph1(gs1); + + print_constraints(ph1, "*** ph1 ***"); + + Constraint_System cs2; + cs2.insert(1*x + 0*y == 0); + + NNC_Polyhedron ph2(cs2); + + print_constraints(ph2, "*** ph2 ***"); + + NNC_Polyhedron computed_result = ph1; + + computed_result.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..b097649 --- /dev/null +++ b/tests/Polyhedron/polyhull1.cc @@ -0,0 +1,399 @@ +/* Test Polyhedron::upper_bound_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + Generator_System gs1; + gs1.insert(point()); + gs1.insert(ray(x)); + gs1.insert(ray(y)); + + C_Polyhedron ph1(gs1); + + print_generators(ph1, "*** ph1 ***"); + + Generator_System gs2; + gs2.insert(point(-x + y)); + gs2.insert(point(x + y)); + gs2.insert(point(3*x)); + + C_Polyhedron ph2(gs2); + + print_generators(ph2, "*** ph2 ***"); + + C_Polyhedron computed_result = ph1; + + computed_result.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..b667d4b --- /dev/null +++ b/tests/Polyhedron/polyhull2.cc @@ -0,0 +1,58 @@ +/* Test Polyhedron::upper_bound_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable i(0); + Variable j(1); + + NNC_Polyhedron p1(2); + p1.add_constraint(j == 0); + p1.add_constraint(i >= 0); + p1.add_constraint(j-i == 2); + + NNC_Polyhedron p2(2); + p2.add_constraint(j == 0); + p2.add_constraint(-i > 0); + p2.add_constraint(j-i == 0); + + print_constraints(p1, "*** p1 ***"); + print_constraints(p2, "*** p2 ***"); + + p1.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..3b9c1d2 --- /dev/null +++ b/tests/Polyhedron/polyhullifexact1.cc @@ -0,0 +1,464 @@ +/* Test Polyhedron::upper_bound_assign_if_exact(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + C_Polyhedron ph_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..1c77f4f --- /dev/null +++ b/tests/Polyhedron/polyhullifexact2.cc @@ -0,0 +1,318 @@ +/* Test NNC_Polyhedron::upper_bound_assign_if_exact(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + + 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; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + 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/randphull1.cc b/tests/Polyhedron/randphull1.cc new file mode 100644 index 0000000..a46819d --- /dev/null +++ b/tests/Polyhedron/randphull1.cc @@ -0,0 +1,198 @@ +/* Compute poly-hulls of random polytopes. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include +#include + +#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)); + if (!ph.add_generator_and_minimize(point(cx*x + cy*y + cz*z))) + 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& theta, + std::vector& 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 theta(dimension-1); + std::vector 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(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..34c43be --- /dev/null +++ b/tests/Polyhedron/refinewithcongruence1.cc @@ -0,0 +1,105 @@ +/* Test Polyhedron::refine_with_congruence(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + Variable C(2); + + 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..94998d5 --- /dev/null +++ b/tests/Polyhedron/refinewithcongruences1.cc @@ -0,0 +1,336 @@ +/* Test Polyhedron::refine_with_congruences(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.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..f3afa5e --- /dev/null +++ b/tests/Polyhedron/refinewithconstraint1.cc @@ -0,0 +1,108 @@ +/* Test Polyhedron::refine_with_constraint(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + NNC_Polyhedron ph1(2); + ph1.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..e037f44 --- /dev/null +++ b/tests/Polyhedron/refinewithconstraints1.cc @@ -0,0 +1,322 @@ +/* Test Polyhedron::refine_with_constraints(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.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..b9b39f8 --- /dev/null +++ b/tests/Polyhedron/relations1.cc @@ -0,0 +1,484 @@ +/* Test Polyhedron::relation_with(g) and Polyhedron::relation_with(c). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +using namespace IO_Operators; + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + Constraint_System cs; + cs.insert(2*x - y >= 0); + cs.insert(y >= 0); + C_Polyhedron ph(cs); + print_constraints(ph, "*** ph ***"); + + Generator g = ray(x + y); + print_generator(g, "*** g ***"); + + Poly_Gen_Relation rel = ph.relation_with(g); + + Poly_Gen_Relation known_rel = Poly_Gen_Relation::subsumes(); + bool ok = (rel == known_rel); + + nout << "ph.relation_with(r(A + B)) == " << rel << endl; + + return ok; +} + +bool +test02() { + Variable x(0); + + C_Polyhedron ph(2, EMPTY); + print_constraints(ph, "*** ph ***"); + + Generator g = point(x); + print_generator(g, "*** g ***"); + + Poly_Gen_Relation rel = ph.relation_with(g); + + Poly_Gen_Relation known_rel = Poly_Gen_Relation::nothing(); + bool ok = (rel == known_rel); + + nout << "ph.relation_with(v(A)) == " << rel << endl; + + return ok; +} + +bool +test03() { + C_Polyhedron ph; + print_constraints(ph, "*** ph ***"); + + Generator g = point(); + print_generator(g, "*** g ***"); + + Poly_Gen_Relation rel = ph.relation_with(g); + + Poly_Gen_Relation known_rel = Poly_Gen_Relation::subsumes(); + bool ok = (rel == known_rel); + + nout << "ph.relation_with(v()) == " << rel << endl; + + return ok; +} + +bool +test04() { + Variable x(0); + Variable y(1); + + Generator_System gs; + gs.insert(point()); + gs.insert(ray(y)); + gs.insert(line(x)); + C_Polyhedron ph(gs); + print_generators(ph, "*** ph ***"); + + Generator g = point(x + y); + print_generator(g, "*** g ***"); + + Poly_Gen_Relation rel = ph.relation_with(g); + + Poly_Gen_Relation known_rel = Poly_Gen_Relation::subsumes(); + bool ok = (rel == known_rel); + + nout << "ph.relation_with(v(A + B)) == " << rel << endl; + + return ok; +} + +bool +test05() { + Variable A(0); + Variable B(1); + + Generator_System gs; + gs.insert(point(1*A + 1*B)); + C_Polyhedron ph(gs); + print_generators(ph, "*** ph ***"); + + Poly_Con_Relation rel = ph.relation_with(A >= 0); + + Poly_Con_Relation known_rel = Poly_Con_Relation::is_included(); + bool ok = (rel == known_rel); + + nout << "ph.relation_with(A >= 0) == " << rel << endl; + + return ok; +} + +bool +test06() { + Variable y(1); + + C_Polyhedron ph(2, EMPTY); + print_generators(ph, "*** ph ***"); + + Constraint c(y >= 0); + print_constraint(c, "*** c ***"); + + Poly_Con_Relation rel = ph.relation_with(c); + + Poly_Con_Relation known_rel = Poly_Con_Relation::saturates() + && Poly_Con_Relation::is_included() + && Poly_Con_Relation::is_disjoint(); + bool ok = (rel == known_rel); + + nout << "ph.relation_with(c) == " << rel << endl; + + return ok; +} + +bool +test07() { + Poly_Con_Relation rel = Poly_Con_Relation::nothing(); + Poly_Con_Relation known_result = Poly_Con_Relation::nothing(); + + C_Polyhedron ph; + print_generators(ph, "*** ph ***"); + + // A false inequality constraint. + Constraint c_false1(Linear_Expression(-1) >= 0); + print_constraint(c_false1, "*** c_false1 ***"); + + rel = ph.relation_with(c_false1); + + nout << "ph.relation_with(c_false1) == " << rel << endl; + + known_result = Poly_Con_Relation::is_disjoint(); + bool ok = (rel == known_result); + + // A false equality constraint. + Constraint c_false2(Linear_Expression(5) == -2); + print_constraint(c_false2, "*** c_false2 ***"); + + rel = ph.relation_with(c_false2); + + nout << "ph.relation_with(c_false2) == " << rel << endl; + + known_result = Poly_Con_Relation::is_disjoint(); + bool ok1 = (rel == known_result); + + // A saturated inequality. + Constraint c_saturated1(Linear_Expression(3) >= 3); + print_constraint(c_saturated1, "*** c_saturated1 ***"); + + rel = ph.relation_with(c_saturated1); + + nout << "ph.relation_with(c_saturated1) == " << rel << endl; + + known_result = Poly_Con_Relation::saturates() + && Poly_Con_Relation::is_included(); + bool ok2 = (rel == known_result); + + // A saturated equality. + Constraint c_saturated2(Linear_Expression(1) == 1); + print_constraint(c_saturated2, "*** c_saturated2 ***"); + + rel = ph.relation_with(c_saturated2); + + nout << "ph.relation_with(c_saturated2) == " << rel << endl; + + known_result = Poly_Con_Relation::saturates() + && Poly_Con_Relation::is_included(); + bool ok3 = (rel == known_result); + + // A satisfied inequality which is not saturated. + Constraint c_satisfied(Linear_Expression(7) >= 5); + print_constraint(c_satisfied, "*** c_satisfied ***"); + + rel = ph.relation_with(c_satisfied); + + nout << "ph.relation_with(c_satisfied) == " << rel << endl; + + known_result = Poly_Con_Relation::is_included(); + bool ok4 = (rel == known_result); + + return ok && ok1 && ok2 && ok3 && ok4; +} + +bool +test08() { + Variable x(0); + Variable y(1); + + Constraint_System cs; + cs.insert(x + y >= 1); + cs.insert(y >= 5); + + C_Polyhedron ph(cs); + + print_generators(ph, "*** ph ***"); + + // An equality constraint non-intersecting the polyhedron. + Constraint c(y == -1); + + print_constraint(c, "*** c ***"); + + Poly_Con_Relation rel = ph.relation_with(c); + + nout << "ph.relation_with(c) == " << rel << endl; + + Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint(); + return (rel == known_result); +} + +bool +test09() { + // The zero-dim universe polyhedron. + C_Polyhedron ph; + Poly_Con_Relation rel = ph.relation_with(Linear_Expression(0) > 0); + + print_generators(ph, "*** ph ***"); + nout << "ph.relation_with(0 > 0) == " << rel << endl; + + Poly_Con_Relation known_result = Poly_Con_Relation::saturates() + && Poly_Con_Relation::is_disjoint(); + + return rel == known_result; +} + +bool +test10() { + // The zero-dim universe polyhedron. + C_Polyhedron ph; + Poly_Con_Relation rel = ph.relation_with(Linear_Expression(0) > 1); + + print_generators(ph, "*** ph ***"); + nout << "ph.relation_with(0 > 1) == " << rel << endl; + + Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint(); + + return rel == known_result; +} + +bool +test11() { + // The zero-dim universe polyhedron. + C_Polyhedron ph; + Poly_Con_Relation rel = ph.relation_with(Linear_Expression(1) > 0); + + print_generators(ph, "*** ph ***"); + nout << "ph.relation_with(1 > 0) == " << rel << endl; + + Poly_Con_Relation known_result = Poly_Con_Relation::is_included(); + + return rel == known_result; +} + +bool +test12() { + // An empty polyhedron. + C_Polyhedron ph(1); + ph.add_constraint(Linear_Expression(0) >= 1); + Variable A(0); + Poly_Con_Relation rel = ph.relation_with(A > 0); + + print_generators(ph, "*** ph ***"); + nout << "ph.relation_with(A > 0) == " << rel << endl; + + Poly_Con_Relation known_result = Poly_Con_Relation::saturates() + && Poly_Con_Relation::is_included() + && Poly_Con_Relation::is_disjoint(); + + return rel == known_result; +} + +bool +test13() { + Variable A(0); + Variable B(1); + Constraint_System cs(A + B == 3); + C_Polyhedron ph(cs); + + Poly_Con_Relation rel = ph.relation_with(A + B > 3); + + print_generators(ph, "*** ph ***"); + nout << "ph.relation_with(A + B > 3) == " << rel << endl; + + Poly_Con_Relation known_result = Poly_Con_Relation::saturates() + && Poly_Con_Relation::is_disjoint(); + + return rel == known_result; +} + +bool +test14() { + Variable A(0); + Variable B(1); + Constraint_System cs(A + B <= 3); + C_Polyhedron ph(cs); + + Poly_Con_Relation rel = ph.relation_with(A + B > 3); + + print_generators(ph, "*** ph ***"); + nout << "ph.relation_with(A + B > 3) == " << rel << endl; + + Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint(); + + return rel == known_result; +} + +bool +test15() { + Variable A(0); + Variable B(1); + Constraint_System cs; + cs.insert(A >= 1); + cs.insert(B >= 0); + cs.insert(A + B <= 3); + C_Polyhedron ph(cs); + + Poly_Con_Relation rel = ph.relation_with(A + 2*B < 10); + + print_generators(ph, "*** ph ***"); + nout << "ph.relation_with(A + 2*B < 10) == " << rel << endl; + + Poly_Con_Relation known_result = Poly_Con_Relation::is_included(); + + return rel == known_result; +} + +bool +test16() { + Variable A(0); + Variable B(1); + Constraint_System cs; + cs.insert(A >= 1); + cs.insert(B >= 0); + cs.insert(A + B <= 3); + C_Polyhedron ph(cs); + + Poly_Con_Relation rel = ph.relation_with(A + B > 1); + + print_generators(ph, "*** ph ***"); + nout << "ph.relation_with(A + B > 1) == " << rel << endl; + + Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects(); + + return rel == known_result; +} + +bool +test17() { + Variable A(0); + + C_Polyhedron ph(2); + ph.add_constraint(A == 0); + + Poly_Gen_Relation rel = ph.relation_with(point(2*A)); + + print_generators(ph, "*** ph ***"); + nout << "ph.relation_with(point(2*A)) == " << rel << endl; + + Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing(); + + return rel == known_result; +} + +bool +test18() { + Variable A(0); + Variable B(1); + + Generator_System gs; + gs.insert(point(A + 0*B)); + gs.insert(point(3*A)); + C_Polyhedron ph(gs); + + print_generators(ph, "*** ph ***"); + + Poly_Con_Relation rel = ph.relation_with(B == 0); + + Poly_Con_Relation known_rel = Poly_Con_Relation::saturates() + && Poly_Con_Relation::is_included(); + + bool ok = (rel == known_rel); + + nout << "ph.relation_with(B == 0) == " << rel << endl; + + return ok; +} + +bool +test19() { + Variable A(0); + + C_Polyhedron ph(2); + ph.add_constraint(A >= 0); + + Poly_Gen_Relation rel = ph.relation_with(ray(-A)); + + print_constraints(ph, "*** ph ***"); + nout << "ph.relation_with(ray(-A)) == " << rel << endl; + + Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing(); + return rel == known_result; +} + +bool +test20() { + Variable A(0); + + C_Polyhedron ph(2); + ph.add_constraint(A >= 0); + + Poly_Gen_Relation rel = ph.relation_with(line(A)); + + print_constraints(ph, "*** ph ***"); + nout << "ph.relation_with(line(A)) == " << rel << endl; + + Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing(); + return rel == known_result; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + DO_TEST(test06); + DO_TEST(test07); + DO_TEST(test08); + DO_TEST(test09); + DO_TEST(test10); + DO_TEST(test11); + DO_TEST(test12); + DO_TEST(test13); + DO_TEST(test14); + DO_TEST(test15); + DO_TEST(test16); + DO_TEST(test17); + DO_TEST(test18); + DO_TEST(test19); + DO_TEST(test20); +END_MAIN diff --git a/tests/Polyhedron/relations2.cc b/tests/Polyhedron/relations2.cc new file mode 100644 index 0000000..91782d7 --- /dev/null +++ b/tests/Polyhedron/relations2.cc @@ -0,0 +1,226 @@ +/* Test Polyhedron::relation_with(c) and Polyhedron::relation_with(g). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +using namespace IO_Operators; + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + Generator_System gs1; + gs1.insert(point()); + gs1.insert(line(A + B)); + C_Polyhedron ph1(gs1); + + Generator_System gs2; + gs2.insert(ray(A)); + gs2.insert(point(B)); + gs2.insert(point(-B)); + C_Polyhedron ph2(gs2); + + Poly_Con_Relation rel1 = ph1.relation_with(A == 0); + Poly_Con_Relation rel2 = ph2.relation_with(A == 0); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + nout << "ph1.relation_with(A == 0) == " << rel1 << endl; + nout << "ph2.relation_with(A == 0) == " << rel2 << endl; + + Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects(); + return rel1 == known_result && rel2 == known_result; +} + +bool +test02() { + Variable A(0); + Variable B(1); + + Generator_System gs; + gs.insert(point(A)); + gs.insert(line(B)); + C_Polyhedron ph(gs); + + Poly_Con_Relation rel = ph.relation_with(B > 0); + + print_generators(ph, "*** ph ***"); + nout << "ph.relation_with(B > 0) == " << rel << endl; + + Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects(); + return rel == known_result; +} + +bool +test03() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.generators(); + ph.add_constraint(A >= 2); + ph.add_constraint(B == 0); + + Poly_Gen_Relation rel = ph.relation_with(ray(A + B)); + + Poly_Gen_Relation known_rel = Poly_Gen_Relation::nothing(); + + bool ok = (rel == known_rel); + + print_constraints(ph, "*** ph ***"); + nout << "ph.relation_with(ray(A + B)) == " << rel << endl; + + return ok; +} + +bool +test04() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2, EMPTY); + ph.add_generator(point()); + ph.constraints(); + ph.add_generator(ray(A)); + ph.add_generator(ray(B)); + + Poly_Con_Relation rel = ph.relation_with(A == 0); + + Poly_Con_Relation known_rel = Poly_Con_Relation::strictly_intersects(); + + bool ok = (rel == known_rel); + + print_constraints(ph, "*** ph ***"); + nout << "ph.relation_with(A == 0) == " << rel << endl; + + return ok; +} + +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..49bd8d7 --- /dev/null +++ b/tests/Polyhedron/relations3.cc @@ -0,0 +1,316 @@ +/* Test Polyhedron::relation_with(c) and Polyhedron::relation_with(g). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +using namespace IO_Operators; + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + NNC_Polyhedron ph(2); + ph.add_constraint(A - B > 0); + ph.add_constraint(B >= 0); + + Poly_Gen_Relation rel1 = ph.relation_with(point(B)); + Poly_Gen_Relation rel2 = ph.relation_with(point(-B)); + + print_generators(ph, "*** ph ***"); + nout << "ph.relation_with(point(B)) == " << rel1 << endl; + nout << "ph.relation_with(point(-B)) == " << rel2 << endl; + + Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing(); + return rel1 == known_result && rel2 == known_result; +} + +bool +test02() { + Variable A(0); + Variable B(1); + + NNC_Polyhedron ph1(2, EMPTY); + ph1.add_generator(point(A + B)); + + Poly_Con_Relation rel = ph1.relation_with(A - B == 0); + Poly_Con_Relation known_rel = Poly_Con_Relation::saturates() + && Poly_Con_Relation::is_included(); + + bool ok = (rel == known_rel); + + print_generators(ph1, "*** ph1 ***"); + nout << "ph1.relation_with(A - B == 0) = " << rel << endl; + + return ok; +} + +bool +test03() { + Variable A(0); + Variable B(1); + + Generator_System gs; + gs.insert(point()); + gs.insert(ray(A)); + gs.insert(line(B)); + + NNC_Polyhedron ph1(gs); + + Poly_Con_Relation rel = ph1.relation_with(A >= 1); + Poly_Con_Relation known_rel = Poly_Con_Relation::strictly_intersects(); + + bool ok = (rel == known_rel); + + print_generators(ph1, "*** ph1 ***"); + nout << "ph1.relation_with(A >= 1) = " << rel << endl; + + return ok; +} + +bool +test04() { + Variable A(0); + Variable B(1); + + Generator_System gs; + gs.insert(line(A)); + gs.insert(ray(B)); + gs.insert(point()); + NNC_Polyhedron ph1(gs); + + Poly_Con_Relation rel = ph1.relation_with(A > 1); + Poly_Con_Relation known_rel = Poly_Con_Relation::strictly_intersects(); + + bool ok = (rel == known_rel); + + print_generators(ph1, "*** ph1 ***"); + nout << "ph1.relation_with(A > 1) = " << rel << endl; + + return ok; +} + +bool +test05() { + Variable A(0); + Variable B(1); + + Generator_System gs; + gs.insert(line(B)); + gs.insert(point()); + gs.insert(ray(A)); + NNC_Polyhedron ph(gs); + Generator_System gs1; + for (Generator_System::const_iterator i = ph.generators().begin(), + gs_end = ph.generators().end(); i != gs_end; ++i) + if (!(*i).is_closure_point()) + gs.insert(*i); + C_Polyhedron ph1(gs); + + Poly_Con_Relation rel = ph1.relation_with(B >= 1); + Poly_Con_Relation known_rel = Poly_Con_Relation::strictly_intersects(); + + bool ok = (rel == known_rel); + + print_generators(ph1, "*** ph1 ***"); + nout << "ph1.relation_with(B >= 1) = " << rel << endl; + + return ok; +} + +bool +test06() { + Variable A(0); + Variable B(1); + + Generator_System gs; + gs.insert(point(A)); + NNC_Polyhedron ph(gs); + + C_Polyhedron ph1(2); + ph1.add_constraint(A == 1); + ph1.add_constraint(B == 1); + Generator_System gs1; + for (Generator_System::const_iterator i = ph.generators().begin(), + gs_end = ph.generators().end(); i != gs_end; ++i) + if (!(*i).is_closure_point()) + gs1.insert(*i); + ph1.add_generators(gs1); + + Poly_Con_Relation rel = ph1.relation_with(B == 1); + Poly_Con_Relation known_rel = Poly_Con_Relation::strictly_intersects(); + + bool ok = (rel == known_rel); + + print_generators(ph1, "*** ph1 ***"); + nout << "ph1.relation_with(B == 1) = " << rel << endl; + + return ok; +} + +bool +test07() { + Variable A(0); + Variable B(1); + + Generator_System gs; + gs.insert(ray(B)); + gs.insert(point(-A)); + C_Polyhedron ph1(gs); + ph1.generators(); + + Poly_Con_Relation rel = ph1.relation_with(B <= 0); + Poly_Con_Relation known_rel = Poly_Con_Relation::strictly_intersects(); + + bool ok = (rel == known_rel); + + print_generators(ph1, "*** ph1 ***"); + nout << "ph1.relation_with(B <= 0) = " << rel << endl; + + return ok; +} + +bool +test08() { + Variable A(0); + Variable B(1); + + Generator_System gs; + gs.insert(point(A + B)); + gs.insert(point(-A + B)); + C_Polyhedron ph1(gs); + ph1.generators(); + + Poly_Con_Relation rel = ph1.relation_with(A >= 0); + Poly_Con_Relation known_rel = Poly_Con_Relation::strictly_intersects(); + + bool ok = (rel == known_rel); + + print_generators(ph1, "*** ph1 ***"); + nout << "ph1.relation_with(A >= 0) = " << rel << endl; + + return ok; +} + +bool +test09() { + Variable A(0); + Variable B(1); + + Generator_System gs; + gs.insert(point(-A)); + gs.insert(ray(-B)); + gs.insert(ray(A + B)); + NNC_Polyhedron ph1(gs); + ph1.generators(); + + Poly_Con_Relation rel = ph1.relation_with(B < 0); + Poly_Con_Relation known_rel = Poly_Con_Relation::strictly_intersects(); + + bool ok = (rel == known_rel); + + print_generators(ph1, "*** ph1 ***"); + nout << "ph1.relation_with(B < 0) = " << rel << endl; + + return ok; +} + +bool +test10() { + Variable A(0); + Variable B(1); + + Generator_System gs; + gs.insert(ray(A)); + gs.insert(ray(A + B)); + gs.insert(point(-B)); + NNC_Polyhedron ph1(gs); + ph1.generators(); + + Poly_Con_Relation rel = ph1.relation_with(A < 0); + Poly_Con_Relation known_rel = Poly_Con_Relation::is_disjoint(); + + bool ok = (rel == known_rel); + + print_generators(ph1, "*** ph1 ***"); + nout << "ph1.relation_with(A < 0) = " << rel << endl; + + return ok; +} + +bool +test11() { + Variable A(0); + Variable B(1); + + NNC_Polyhedron ph(2); + ph.add_constraint(A == 0); + ph.add_constraint(B == 0); + + Poly_Gen_Relation rel = ph.relation_with(closure_point(A)); + + print_constraints(ph, "*** ph ***"); + nout << "ph.relation_with(line(A)) == " << rel << endl; + + Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing(); + return rel == known_result; +} + +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..026b6b4 --- /dev/null +++ b/tests/Polyhedron/removespacedims1.cc @@ -0,0 +1,298 @@ +/* Removing space dimensions from a polyhedron. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + Variable z(2); + Variable w(3); + Generator_System gs; + gs.insert(point(0*x + y +0*z + 2*w)); + C_Polyhedron ph(gs); + + print_generators(ph, "*** ph ***"); + + // This is the set of the variables that we want to remove. + Variables_Set to_be_removed; + to_be_removed.insert(y); + to_be_removed.insert(z); + ph.remove_space_dimensions(to_be_removed); + + Generator_System known_result_gs; + known_result_gs.insert(point(0*x +2*y)); + C_Polyhedron known_result(known_result_gs); + + bool ok = (known_result == ph); + + print_generators(ph, "*** ph ***"); + print_generators(known_result, "*** known_result ***"); + + return ok; +} + +bool +test02() { + Generator_System gs; + + // Creating 10 points. + for (int i = 0; i < 10; i++) { + Linear_Expression e; + for (int j = 0; j < 10; j++) + e += (10*i + j) * Variable(j); + gs.insert(point(e)); + } + + C_Polyhedron ph(gs); + + print_generators(ph, "*** before ***"); + + // This is the set of the variables that we want to remove. + Variables_Set to_be_removed; + to_be_removed.insert(Variable(0)); + to_be_removed.insert(Variable(5)); + to_be_removed.insert(Variable(3)); + to_be_removed.insert(Variable(4)); + to_be_removed.insert(Variable(8)); + + ph.remove_space_dimensions(to_be_removed); + + // Useless, but much clearer. + gs.clear(); + + Variable a(0); + Variable b(1); + Variable c(2); + Variable d(3); + Variable e(4); + + Linear_Expression expr01 = (1*a + 2*b + 6*c + 7*d + 9*e); + Linear_Expression expr10 = 10 * (a + b + c + d + e); + + for (int i = 0; i < 10; i++) { + Linear_Expression expr = i * expr10 + expr01; + gs.insert(point(expr)); + } + + C_Polyhedron known_result(gs); + + bool ok = (ph == known_result); + + print_generators(ph, "*** after ***"); + print_generators(known_result, "*** known_result ***"); + + return ok; +} + +bool +test03() { + Variable y(1); + Variable z(2); + Variable w(6); + + // This is the set of the variables that we want to remove. + Variables_Set to_be_removed; + to_be_removed.insert(y); + to_be_removed.insert(z); + to_be_removed.insert(w); + + // A 10-dim space, empty polyhedron. + C_Polyhedron ph(10, EMPTY); + ph.remove_space_dimensions(to_be_removed); + + // A 7-dim space, empty polyhedron. + C_Polyhedron known_result(7, EMPTY); + + bool ok = (known_result == ph); + + print_constraints(ph, "*** ph ***"); + print_constraints(known_result, "*** known_result ***"); + + return ok; +} + +bool +test04() { + Variable x(0); + Variable y(1); + Variable z(2); + Variable w(3); + + Generator_System gs; + gs.insert(point(x + y + 2*z - w)); + + C_Polyhedron ph(gs); + + print_generators(ph, "*** ph ***"); + + ph.remove_higher_space_dimensions(2); + + Generator_System gs_known_result; + gs_known_result.insert(point(x + y)); + C_Polyhedron known_result(gs_known_result); + + bool ok = (ph == known_result); + + print_generators(ph, "*** after remove_higher_space_dimensions(2) ***"); + + return ok; +} + +bool +test05() { + C_Polyhedron ph(4, EMPTY); + + print_constraints(ph, "*** ph ***"); + + ph.remove_higher_space_dimensions(0); + + C_Polyhedron known_result(0, EMPTY); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** ph after remove_higher_space_dimensions(0) ***"); + + return ok; +} + +bool +test06() { + Variable x(0); + Variable y(1); + Variable z(2); + + C_Polyhedron ph1(3); + ph1.add_constraint(x >= 3); + ph1.add_constraint(x - y >= 0); + + print_constraints(ph1, "*** ph1 ***"); + + C_Polyhedron ph2 = ph1; + + print_constraints(ph2, "*** ph2 ***"); + + // This is the set of the variables that we want to remove. + Variables_Set to_be_removed; + to_be_removed.insert(y); + to_be_removed.insert(z); + to_be_removed.insert(x); + + ph1.remove_space_dimensions(to_be_removed); + ph2.remove_higher_space_dimensions(0); + + bool ok = (ph1 == ph2); + + print_generators(ph1, "*** ph1 after remove_space_dimensions ***"); + print_generators(ph2, "*** ph2 after remove_higher_space_dimensions ***"); + + return ok; +} + +bool +test07() { + Variable A(0); + Generator_System gs; + gs.insert(point()); + gs.insert(ray(A)); + C_Polyhedron ph(gs); + ph.add_constraint(A >= 2); + + print_constraints(ph, "*** ph ***"); + + C_Polyhedron known_result(ph); + + // This is the set of the variables that we want to remove. + Variables_Set to_be_removed; + + ph.remove_space_dimensions(to_be_removed); + + bool ok = (ph == known_result); + + print_constraints(ph, + "*** after ph.remove_space_dimensions(to_be_removed) ***"); + + return ok; +} + +bool +test08() { + Variable A(0); + + C_Polyhedron ph(2); + ph.add_constraint(A >= 3); + + print_constraints(ph, "*** ph ***"); + + C_Polyhedron known_result(ph); + + ph.remove_higher_space_dimensions(2); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** after ph.remove_higher_space_dimensions(2) ***"); + + return ok; +} + +bool +test09() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2, EMPTY); + ph.add_generator(point(2*A + B, 4)); + + print_constraints(ph, "*** ph ***"); + + ph.remove_higher_space_dimensions(1); + + C_Polyhedron known_result(1, EMPTY); + known_result.add_generator(point(A, 2)); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** after ph.remove_higher_space_dimensions(1) ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); +#ifdef DERIVED_TEST + DO_TEST_F8A(test02); +#else + DO_TEST_F8(test02); +#endif // !defined(DERIVED_TEST) + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + DO_TEST(test06); + DO_TEST(test07); + DO_TEST(test08); + DO_TEST(test09); +END_MAIN diff --git a/tests/Polyhedron/removespacedims2.cc b/tests/Polyhedron/removespacedims2.cc new file mode 100644 index 0000000..c9dec0b --- /dev/null +++ b/tests/Polyhedron/removespacedims2.cc @@ -0,0 +1,66 @@ +/* Removing space dimensions form an NNC polyhedron. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + Variable z(2); + + NNC_Polyhedron ph1(4); + + ph1.add_constraint(x - y == 3); + ph1.add_constraint(z > x + 4); + ph1.add_constraint(y < 6); + + print_constraints(ph1, "*** ph1 ***"); + + NNC_Polyhedron ph2(ph1); + + ph1.remove_higher_space_dimensions(1); + + // This is the set of the variables that we want to remove. + Variables_Set to_be_removed; + to_be_removed.insert(y); + to_be_removed.insert(z); + to_be_removed.insert(Variable(3)); + + ph2.remove_space_dimensions(to_be_removed); + + bool ok = (ph1 == ph2); + + print_constraints(ph1, "*** after remove_higher_space_dimensions(1) ***"); + print_constraints(ph2, + "*** after remove_space_dimensions(to_be_removed) ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); +END_MAIN diff --git a/tests/Polyhedron/simplifyusingcontext1.cc b/tests/Polyhedron/simplifyusingcontext1.cc new file mode 100644 index 0000000..6007190 --- /dev/null +++ b/tests/Polyhedron/simplifyusingcontext1.cc @@ -0,0 +1,488 @@ +/* Test Polyhedron::simplify_using_context_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + Variable z(2); + + C_Polyhedron 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..7e2a123 --- /dev/null +++ b/tests/Polyhedron/smm1.cc @@ -0,0 +1,151 @@ +/* SEND + MORE = MONEY. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace 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(nout, "\n")); + nout << "Solution generators" << endl; + const Generator_System& gs = ph.generators(); + std::copy(gs.begin(), gs.end(), + std::ostream_iterator(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/timeelapse1.cc b/tests/Polyhedron/timeelapse1.cc new file mode 100644 index 0000000..21fa488 --- /dev/null +++ b/tests/Polyhedron/timeelapse1.cc @@ -0,0 +1,250 @@ +/* Test Polyhedron::time_elapse_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + C_Polyhedron ph1(2); + ph1.add_constraint(x >= 1); + ph1.add_constraint(x <= 3); + ph1.add_constraint(y >= 1); + ph1.add_constraint(y <= 3); + + C_Polyhedron ph2(2); + ph2.add_constraint(y == 5); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + ph1.time_elapse_assign(ph2); + + C_Polyhedron known_result(2, EMPTY); + known_result.add_generator(point(y)); + known_result.add_generator(ray(y)); + known_result.add_generator(line(x)); + + bool ok = (ph1 == known_result); + + print_generators(ph1, "*** ph1_time_elapse_assign(ph2) ***"); + + return ok; +} + +bool +test02() { + C_Polyhedron ph1(0, EMPTY); + C_Polyhedron ph2; + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + ph1.time_elapse_assign(ph2); + + C_Polyhedron ph3(2, EMPTY); + C_Polyhedron ph4(2); + + print_constraints(ph3, "*** ph3 ***"); + print_constraints(ph4, "*** ph4 ***"); + + ph3.time_elapse_assign(ph4); + + C_Polyhedron ph5(2); + C_Polyhedron ph6(2, EMPTY); + + print_constraints(ph5, "*** ph5 ***"); + print_constraints(ph6, "*** ph6 ***"); + + ph5.time_elapse_assign(ph6); + + bool ok = ph1.is_empty() && ph3.is_empty() && ph5.is_empty(); + + print_generators(ph1, "*** ph1_time_elapse_assign(ph2) ***"); + print_generators(ph3, "*** ph3_time_elapse_assign(ph4) ***"); + print_generators(ph5, "*** ph5_time_elapse_assign(ph6) ***"); + + return ok; +} + +bool +test03() { + Variable A(0); + Variable B(1); + + Generator_System gs1; + gs1.insert(point(A)); + gs1.insert(point(A + B)); + C_Polyhedron ph1(gs1); + + Generator_System gs2; + gs2.insert(point(0*B)); + C_Polyhedron ph2(gs2); + + print_generators(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + C_Polyhedron known_result(ph1); + + ph1.time_elapse_assign(ph2); + + bool ok = (ph1 == known_result); + + print_generators(ph1, "*** ph1 ***"); + + return ok; +} + +bool +test04() { + C_Polyhedron ph1; + C_Polyhedron ph2(0, EMPTY); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + ph1.time_elapse_assign(ph2); + + C_Polyhedron known_result(0, EMPTY); + + bool ok = (ph1 == known_result); + + print_constraints(ph1, "*** after ph1.time_elapse_assign(ph2) ***"); + + return ok; +} + +bool +test05() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph1(2); + ph1.generators(); + ph1.add_constraint(A == 0); + ph1.add_constraint(B == 0); + + C_Polyhedron ph2(2); + ph2.generators(); + ph2.add_constraint(A == 2); + ph2.add_constraint(B == 2); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + ph1.time_elapse_assign(ph2); + + C_Polyhedron ph3(2, EMPTY); + ph3.add_generator(point()); + ph3.constraints(); + + C_Polyhedron ph4(2, EMPTY); + ph4.add_generator(point(2*A + 2*B)); + + print_generators(ph3, "*** ph3 ***"); + print_generators(ph4, "*** ph4 ***"); + + ph3.time_elapse_assign(ph4); + + bool ok = (ph1 == ph3); + + print_generators(ph1, "*** after ph1.time_elapse_assign(ph2) ***"); + print_generators(ph3, "*** after ph3.time_elapse_assign(ph4) ***"); + + return ok; +} + +bool +test06() { + Variable x(0); + Variable y(1); + + C_Polyhedron ph1(2); + + ph1.add_constraint(x >= 0); + ph1.add_constraint(y >= 0); + ph1.add_constraint(x + y - 2 <= 0); + + C_Polyhedron ph2(2); + + ph2.add_constraint(x == -1); + ph2.add_constraint(y == -1); + + Pointset_Powerset 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 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 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..affe7a5 --- /dev/null +++ b/tests/Polyhedron/timeelapse2.cc @@ -0,0 +1,132 @@ +/* Test time_elapse_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable x(0); + Variable y(1); + + NNC_Polyhedron ph1(2); + + ph1.add_constraint(x >= 0); + ph1.add_constraint(y >= 0); + ph1.add_constraint(x + y - 2 <= 0); + + NNC_Polyhedron ph2(2); + + ph2.add_constraint(x > 2); + ph2.add_constraint(x < 4); + ph2.add_constraint(y == 3); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + ph1.time_elapse_assign(ph2); + + Generator_System known_gs; + known_gs.insert(point()); + known_gs.insert(point(2*x)); + known_gs.insert(point(2*y)); + known_gs.insert(ray(2*x + 3*y)); + known_gs.insert(ray(4*x + 3*y)); + + NNC_Polyhedron known_result(known_gs); + + bool ok = (ph1 == known_result); + + print_generators(ph1, "*** ph1_time_elapse_assign(ph2) ***"); + + return ok; +} + +bool +test02() { + Variable x(0); + Variable y(1); + + Constraint_System cs1; + cs1.insert(x > 3); + cs1.insert(y > 3); + NNC_Polyhedron ph(cs1); + + NNC_Polyhedron ph1(ph); + + Generator_System gs; + gs.insert(point(x + y)); + NNC_Polyhedron ph2(gs); + + print_constraints(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + ph1.time_elapse_assign(ph2); + + bool ok = (ph1 == ph); + + print_generators(ph1, "*** ph1_time_elapse_assign(ph2) ***"); + + return ok; +} + +bool +test03() { + Variable x(0); + Variable y(1); + + NNC_Polyhedron ph1(2); + ph1.add_constraint(x == 3); + ph1.add_constraint(y > 2); + + NNC_Polyhedron ph2(2); + ph2.add_constraint(x > 3); + ph2.add_constraint(y > 2); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + ph1.time_elapse_assign(ph2); + + Generator_System gs; + gs.insert(closure_point(3*x + 2*y)); + gs.insert(point(3*x + 3*y)); + gs.insert(ray(y)); + gs.insert(ray(x)); + + NNC_Polyhedron known_result(gs); + + bool ok = (ph1 == known_result); + + print_generators(ph1, "*** ph1_time_elapse_assign(ph2) ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); +END_MAIN diff --git a/tests/Polyhedron/topclosed1.cc b/tests/Polyhedron/topclosed1.cc new file mode 100644 index 0000000..03ae6e4 --- /dev/null +++ b/tests/Polyhedron/topclosed1.cc @@ -0,0 +1,95 @@ +/* Test Polyhedron::is_topologically_closed(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + + C_Polyhedron ph1(1); + ph1.add_constraint(A >= 0); + + NNC_Polyhedron ph2(2, EMPTY); + + NNC_Polyhedron ph3; + + bool ok = ph1.is_topologically_closed() + && ph2.is_topologically_closed() + && ph3.is_topologically_closed(); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + print_constraints(ph3, "*** ph3 ***"); + + return ok; +} + +bool +test02() { + Variable A(0); + + NNC_Polyhedron ph1(1, EMPTY); + + Generator_System gs1; + gs1.insert(point(A)); + gs1.insert(closure_point()); + gs1.insert(closure_point(A)); + ph1.add_generators_and_minimize(gs1); + + bool ok = !ph1.is_topologically_closed(); + + print_generators(ph1, "*** ph1 ***"); + + return ok; +} + +bool +test03() { + Variable A(0); + Variable B(1); + + Generator_System gs; + gs.insert(point(0*B)); + gs.insert(closure_point(-A)); + gs.insert(closure_point(A)); + gs.insert(line(A)); + + NNC_Polyhedron ph(gs); + + bool ok = ph.is_topologically_closed(); + + print_constraints(ph, "*** ph ***"); + print_generators(ph, "*** ph ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); +END_MAIN diff --git a/tests/Polyhedron/topclosure1.cc b/tests/Polyhedron/topclosure1.cc new file mode 100644 index 0000000..5f9ae48 --- /dev/null +++ b/tests/Polyhedron/topclosure1.cc @@ -0,0 +1,160 @@ +/* Test Polyhedron::topological_closure_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + NNC_Polyhedron ph1(2); + ph1.add_constraint(A > 1); + ph1.add_constraint(A - B > 0); + Generator_System gs; + gs.insert(point(2*A)); + gs.insert(closure_point(A + B)); + gs.insert(ray(-B)); + gs.insert(ray(A + B)); + NNC_Polyhedron ph2(gs); + + print_constraints(ph1, "*** ph1 ***"); + print_generators(ph2, "*** ph2 ***"); + + ph1.topological_closure_assign(); + ph2.topological_closure_assign(); + + bool ok = (ph1 == ph2); + + print_constraints(ph1, "*** after ph1.topological_closure_assign() ***"); + print_generators(ph2, "*** after ph2.topological_closure_assign() ***"); + + return ok; +} + +bool +test02() { + NNC_Polyhedron ph1; + NNC_Polyhedron ph2(2, EMPTY); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + + NNC_Polyhedron known_result1 = ph1; + NNC_Polyhedron known_result2 = ph2; + + ph1.topological_closure_assign(); + ph2.topological_closure_assign(); + + bool ok = (ph1 == known_result1 && ph2 == known_result2); + + print_constraints(ph1, "*** after ph1.topological_closure_assign() ***"); + print_constraints(ph2, "*** after ph2.topological_closure_assign() ***"); + + return ok; +} + +bool +test03() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2); + ph.add_constraint(A - B == 0); + ph.add_constraint(A >= 0); + + C_Polyhedron known_result(ph); + + print_constraints(ph, "*** ph ***"); + + ph.topological_closure_assign(); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** after ph.topological_closure_assign() ***"); + + return ok; +} + +bool +test04() { + Variable A(0); + Variable B(1); + + NNC_Polyhedron ph(2); + ph.generators(); + ph.add_constraint(A > 0); + ph.add_constraint(A == B); + + print_constraints(ph, "*** ph ***"); + + ph.topological_closure_assign(); + + NNC_Polyhedron known_result(2); + known_result.add_constraint(A >= 0); + known_result.add_constraint(A == B); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** after ph.topological_closure_assign() ***"); + + return ok; +} + +bool +test05() { + Variable A(0); + Variable B(1); + + NNC_Polyhedron ph(2, EMPTY); + ph.add_generator(point(A)); + ph.constraints(); + ph.add_generator(closure_point()); + ph.add_generator(ray(A)); + ph.add_generator(ray(B)); + + print_generators(ph, "*** ph ***"); + + ph.topological_closure_assign(); + + NNC_Polyhedron known_result(2); + known_result.add_constraint(A >= 0); + known_result.add_constraint(B >= 0); + + bool ok = (ph == known_result); + + print_constraints(ph, "*** after ph.topological_closure_assign() ***"); + + return ok; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); +END_MAIN diff --git a/tests/Polyhedron/unconstrain1.cc b/tests/Polyhedron/unconstrain1.cc new file mode 100644 index 0000000..ecf121b --- /dev/null +++ b/tests/Polyhedron/unconstrain1.cc @@ -0,0 +1,228 @@ +/* Test Polyhedron::unconstrain(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2, 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; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + 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/universe1.cc b/tests/Polyhedron/universe1.cc new file mode 100644 index 0000000..b21c200 --- /dev/null +++ b/tests/Polyhedron/universe1.cc @@ -0,0 +1,164 @@ +/* Test Polyhedron::is_universe(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + C_Polyhedron ph(3); + print_constraints(ph, "*** ph ***"); + + bool universe = ph.is_universe(); + + nout << "*** ph.is_universe() ***" + << endl + << (universe ? "true" : "false") + << endl; + + return universe; +} + +bool +test02() { + Variable x(0); + Variable z(2); + + C_Polyhedron ph(3); + ph.add_constraint(x >= z); + ph.add_constraint(z == 3); + + print_constraints(ph, "*** ph ***"); + + bool universe = ph.is_universe(); + + nout << "*** ph.is_universe() ***" + << endl + << (universe ? "true" : "false") + << endl; + + return !universe; +} + +bool +test03() { + Variable x(0); + Variable y(1); + + C_Polyhedron ph(2); + ph.add_constraint(y == 0); + ph.add_constraint(x >= 1); + ph.add_constraint(x <= 3); + + Constraint_System cs = ph.constraints(); + print_constraints(ph, "*** ph ***"); + + bool universe = ph.is_universe(); + + nout << "*** ph.is_universe() ***" + << endl + << (universe ? "true" : "false") + << endl; + + return !universe; +} + +bool +test04() { + Variable x(0); + Variable y(1); + + C_Polyhedron ph(3); + ph.add_constraint(x >= 1); + ph.add_constraint(y >= 1); + ph.add_constraint(x <= 4); + ph.add_constraint(y <= 4); + + Constraint_System cs = ph.constraints(); + print_constraints(ph, "*** ph ***"); + + bool universe = ph.is_universe(); + + nout << "*** ph.is_universe() ***" + << endl + << (universe ? "true" : "false") + << endl; + + return !universe; +} + +bool +test05() { + Variable x(0); + Variable y(1); + Variable z(2); + + C_Polyhedron ph(3); + ph.add_constraint(x - y - z >= 0); + + print_constraints(ph, "*** ph ***"); + + bool universe = ph.is_universe(); + + nout << "*** ph.is_universe() ***" + << endl + << (universe ? "true" : "false") + << endl; + + return !universe; +} + +bool +test06() { + Variable x(0); + Variable y(1); + + Generator_System gs; + gs.insert(point()); + gs.insert(ray(-x)); + gs.insert(ray(x + y)); + gs.insert(ray(x - y)); + + C_Polyhedron ph(gs); + print_generators(ph, "*** ph ***"); + + bool universe = ph.is_universe(); + + nout << "*** ph.is_universe() ***" + << endl + << (universe ? "true" : "false") + << endl; + + return universe; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); + DO_TEST(test02); + DO_TEST(test03); + DO_TEST(test04); + DO_TEST(test05); + DO_TEST(test06); +END_MAIN diff --git a/tests/Polyhedron/universe2.cc b/tests/Polyhedron/universe2.cc new file mode 100644 index 0000000..e47783a --- /dev/null +++ b/tests/Polyhedron/universe2.cc @@ -0,0 +1,79 @@ +/* Test the function is_universe() for a NNC_polyhedron. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + NNC_Polyhedron ph1(4); + NNC_Polyhedron ph2(3); + NNC_Polyhedron ph3(3); + + ph2.add_constraint(Linear_Expression(1) > 0); + ph3.add_constraint(Linear_Expression(1) < 0); + + Constraint_System cs; + NNC_Polyhedron ph4(cs); + + print_constraints(ph1, "*** ph1 ***"); + print_constraints(ph2, "*** ph2 ***"); + print_constraints(ph3, "*** ph3 ***"); + print_constraints(ph4, "*** ph4 ***"); + + bool universe1 = ph1.is_universe(); + + nout << "*** ph1.is_universe() ***" + << endl + << (universe1 ? "true" : "false") + << endl; + + bool universe2 = ph2.is_universe(); + + nout << "*** ph2.is_universe() ***" + << endl + << (universe2 ? "true" : "false") + << endl; + + bool universe3 = ph3.is_universe(); + + nout << "*** ph3.is_universe() ***" + << endl + << (universe3 ? "true" : "false") + << endl; + + bool universe4 = ph4.is_universe(); + + nout << "*** ph4.is_universe() ***" + << endl + << (universe4 ? "true" : "false") + << endl; + + return universe1 && universe2 && !universe3 && universe4; +} + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); +END_MAIN diff --git a/tests/Polyhedron/variablesset1.cc b/tests/Polyhedron/variablesset1.cc new file mode 100644 index 0000000..c9f399c --- /dev/null +++ b/tests/Polyhedron/variablesset1.cc @@ -0,0 +1,159 @@ +/* Test the Variables_Set class. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + Variable C(2); + Variable D(3); + Variable E(4); + 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..270bc52 --- /dev/null +++ b/tests/Polyhedron/watchdog1.cc @@ -0,0 +1,129 @@ +/* Test the timeout facility of the library. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include "pwl.hh" +#include "timings.hh" + +namespace { + +void +compute_open_hypercube_generators(dimension_type dimension) { + NNC_Polyhedron hypercube(dimension); + for (dimension_type i = 0; i < dimension; ++i) { + Variable x(i); + hypercube.add_constraint(x > 0); + hypercube.add_constraint(x < 1); + } + (void) hypercube.generators(); +} + +class Timeout : virtual public std::exception, + public Parma_Polyhedra_Library::Throwable { +public: + const char* what() const throw() { + return "Timeout in watchdog1.cc"; + } + + void throw_me() const { + throw *this; + } + + int priority() const { + return 0; + } + + Timeout() { + } + + ~Timeout() throw() { + } +}; + +Timeout t; + +bool +timed_compute_open_hypercube_generators(dimension_type dimension, + int hundredth_secs) { + try { + Parma_Watchdog_Library::Watchdog + w(hundredth_secs, abandon_expensive_computations, t); + + start_clock(); + + compute_open_hypercube_generators(dimension); + abandon_expensive_computations = 0; + return true; + } + catch (const Timeout& e) { + abandon_expensive_computations = 0; + nout << e.what() << " after "; + print_clock(nout); + nout << " s" << endl; + return false; + } + catch (...) { + exit(1); + } + // Should never get here. + return false; +} + +} // namespace + +#define INIT_TIME 20 + +int +main() TRY { + set_handlers(); + + // Find a dimension that cannot be computed with a INIT_TIME timeout. + dimension_type dimension = 0; + do { + ++dimension; + nout << "Trying dimension " << dimension << endl; + } while (timed_compute_open_hypercube_generators(dimension, INIT_TIME)); + + // Now find an upper bound to the time necessary to compute it. + int upper_bound = INIT_TIME; + do { + upper_bound *= 2; + nout << "Trying upper bound " << upper_bound << endl; + } while (!timed_compute_open_hypercube_generators(dimension, upper_bound)); + + // Search the "exact" time. + int lower_bound = upper_bound/2; + do { + int test_time = (lower_bound+upper_bound)/2; + nout << "Probing " << test_time << endl; + if (timed_compute_open_hypercube_generators(dimension, test_time)) + upper_bound = test_time; + else + lower_bound = test_time; + } while (upper_bound-lower_bound > 4); + + nout << "Estimated time for dimension " << dimension + << ": " << (lower_bound+upper_bound)/2 << " 100th of sec" << endl; + + return 0; +} +CATCH diff --git a/tests/Polyhedron/writeconsys1.cc b/tests/Polyhedron/writeconsys1.cc new file mode 100644 index 0000000..fdcf5bf --- /dev/null +++ b/tests/Polyhedron/writeconsys1.cc @@ -0,0 +1,82 @@ +/* Test operator<<(std::ostream&, const Constraint_System&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +using namespace IO_Operators; + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + + 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..7930580 --- /dev/null +++ b/tests/Polyhedron/writegensys1.cc @@ -0,0 +1,89 @@ +/* Test operator<<(std::ostream&, const Generator_System&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +using namespace IO_Operators; + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + 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..dc88f1d --- /dev/null +++ b/tests/Polyhedron/writepolyhedron1.cc @@ -0,0 +1,69 @@ +/* Test operator<<(std::ostream&, const Polyhedron&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +using namespace IO_Operators; + +namespace { + +bool +test01() { + Variable A(0); + Variable B(1); + 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..258a57f --- /dev/null +++ b/tests/Polyhedron/writepolyhedron2.cc @@ -0,0 +1,66 @@ +/* Test operator<<(std::ostream&, const Polyhedron&). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +using namespace IO_Operators; + +namespace { + +bool +test01() { + Variable 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..16fd12e --- /dev/null +++ b/tests/Polyhedron/writerelation1.cc @@ -0,0 +1,108 @@ +/* Test operator<<(std::ostream& s, const Poly_Con_Relation& r) + and operator<<(std::ostream& s, const Poly_Gen_Relation& r). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + 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..3b05a0c --- /dev/null +++ b/tests/Polyhedron/writevariable1.cc @@ -0,0 +1,103 @@ +/* Test operator<<(std::ostream& s, Variable v) + and the related machinery. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include "files.hh" +#include +#include + +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..076811e --- /dev/null +++ b/tests/Powerset/Makefile.am @@ -0,0 +1,191 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +# USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +if VALGRIND_TESTS_ENABLED + +CHECKER = \ +$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \ +--num-callers=100 --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 \ +@extra_includes@ \ +@debug_flag@ + +LDADD = \ +$(top_builddir)/utils/libppl_utils.a \ +$(top_builddir)/tests/libppl_tests.a \ +$(top_builddir)/src/libppl.la \ +@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..1ea3f23 --- /dev/null +++ b/tests/Powerset/Makefile.in @@ -0,0 +1,1175 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +# USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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.am $(srcdir)/Makefile.in +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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__EXEEXT_1 = 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_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 +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +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) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +@VALGRIND_TESTS_ENABLED_FALSE@CHECKER = +@VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \ +@VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \ +@VALGRIND_TESTS_ENABLED_TRUE@--num-callers=100 --leak-resolution=high \ +@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 \ +@extra_includes@ \ +@debug_flag@ + +LDADD = \ +$(top_builddir)/utils/libppl_utils.a \ +$(top_builddir)/tests/libppl_tests.a \ +$(top_builddir)/src/libppl.la \ +@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 .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Powerset/Makefile'; \ + 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 + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +addcongruences1$(EXEEXT): $(addcongruences1_OBJECTS) $(addcongruences1_DEPENDENCIES) + @rm -f addcongruences1$(EXEEXT) + $(CXXLINK) $(addcongruences1_OBJECTS) $(addcongruences1_LDADD) $(LIBS) +addconstraints1$(EXEEXT): $(addconstraints1_OBJECTS) $(addconstraints1_DEPENDENCIES) + @rm -f addconstraints1$(EXEEXT) + $(CXXLINK) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS) +affinedimension1$(EXEEXT): $(affinedimension1_OBJECTS) $(affinedimension1_DEPENDENCIES) + @rm -f affinedimension1$(EXEEXT) + $(CXXLINK) $(affinedimension1_OBJECTS) $(affinedimension1_LDADD) $(LIBS) +affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) + @rm -f affineimage1$(EXEEXT) + $(CXXLINK) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS) +affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES) + @rm -f affinepreimage1$(EXEEXT) + $(CXXLINK) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS) +bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES) + @rm -f bounded1$(EXEEXT) + $(CXXLINK) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS) +bounds1$(EXEEXT): $(bounds1_OBJECTS) $(bounds1_DEPENDENCIES) + @rm -f bounds1$(EXEEXT) + $(CXXLINK) $(bounds1_OBJECTS) $(bounds1_LDADD) $(LIBS) +closed1$(EXEEXT): $(closed1_OBJECTS) $(closed1_DEPENDENCIES) + @rm -f closed1$(EXEEXT) + $(CXXLINK) $(closed1_OBJECTS) $(closed1_LDADD) $(LIBS) +closure1$(EXEEXT): $(closure1_OBJECTS) $(closure1_DEPENDENCIES) + @rm -f closure1$(EXEEXT) + $(CXXLINK) $(closure1_OBJECTS) $(closure1_LDADD) $(LIBS) +collapse1$(EXEEXT): $(collapse1_OBJECTS) $(collapse1_DEPENDENCIES) + @rm -f collapse1$(EXEEXT) + $(CXXLINK) $(collapse1_OBJECTS) $(collapse1_LDADD) $(LIBS) +concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) + @rm -f concatenate1$(EXEEXT) + $(CXXLINK) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS) +contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) + @rm -f contains1$(EXEEXT) + $(CXXLINK) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS) +containsintegerpoint1$(EXEEXT): $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_DEPENDENCIES) + @rm -f containsintegerpoint1$(EXEEXT) + $(CXXLINK) $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_LDADD) $(LIBS) +difference1$(EXEEXT): $(difference1_OBJECTS) $(difference1_DEPENDENCIES) + @rm -f difference1$(EXEEXT) + $(CXXLINK) $(difference1_OBJECTS) $(difference1_LDADD) $(LIBS) +discrete1$(EXEEXT): $(discrete1_OBJECTS) $(discrete1_DEPENDENCIES) + @rm -f discrete1$(EXEEXT) + $(CXXLINK) $(discrete1_OBJECTS) $(discrete1_LDADD) $(LIBS) +disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES) + @rm -f disjoint1$(EXEEXT) + $(CXXLINK) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS) +disjunct1$(EXEEXT): $(disjunct1_OBJECTS) $(disjunct1_DEPENDENCIES) + @rm -f disjunct1$(EXEEXT) + $(CXXLINK) $(disjunct1_OBJECTS) $(disjunct1_LDADD) $(LIBS) +empty1$(EXEEXT): $(empty1_OBJECTS) $(empty1_DEPENDENCIES) + @rm -f empty1$(EXEEXT) + $(CXXLINK) $(empty1_OBJECTS) $(empty1_LDADD) $(LIBS) +entails1$(EXEEXT): $(entails1_OBJECTS) $(entails1_DEPENDENCIES) + @rm -f entails1$(EXEEXT) + $(CXXLINK) $(entails1_OBJECTS) $(entails1_LDADD) $(LIBS) +equals1$(EXEEXT): $(equals1_OBJECTS) $(equals1_DEPENDENCIES) + @rm -f equals1$(EXEEXT) + $(CXXLINK) $(equals1_OBJECTS) $(equals1_LDADD) $(LIBS) +frombdshape1$(EXEEXT): $(frombdshape1_OBJECTS) $(frombdshape1_DEPENDENCIES) + @rm -f frombdshape1$(EXEEXT) + $(CXXLINK) $(frombdshape1_OBJECTS) $(frombdshape1_LDADD) $(LIBS) +frombox1$(EXEEXT): $(frombox1_OBJECTS) $(frombox1_DEPENDENCIES) + @rm -f frombox1$(EXEEXT) + $(CXXLINK) $(frombox1_OBJECTS) $(frombox1_LDADD) $(LIBS) +fromcongruences1$(EXEEXT): $(fromcongruences1_OBJECTS) $(fromcongruences1_DEPENDENCIES) + @rm -f fromcongruences1$(EXEEXT) + $(CXXLINK) $(fromcongruences1_OBJECTS) $(fromcongruences1_LDADD) $(LIBS) +fromconstraints1$(EXEEXT): $(fromconstraints1_OBJECTS) $(fromconstraints1_DEPENDENCIES) + @rm -f fromconstraints1$(EXEEXT) + $(CXXLINK) $(fromconstraints1_OBJECTS) $(fromconstraints1_LDADD) $(LIBS) +fromgrid1$(EXEEXT): $(fromgrid1_OBJECTS) $(fromgrid1_DEPENDENCIES) + @rm -f fromgrid1$(EXEEXT) + $(CXXLINK) $(fromgrid1_OBJECTS) $(fromgrid1_LDADD) $(LIBS) +fromoctagonalshape1$(EXEEXT): $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_DEPENDENCIES) + @rm -f fromoctagonalshape1$(EXEEXT) + $(CXXLINK) $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_LDADD) $(LIBS) +frompolyhedron1$(EXEEXT): $(frompolyhedron1_OBJECTS) $(frompolyhedron1_DEPENDENCIES) + @rm -f frompolyhedron1$(EXEEXT) + $(CXXLINK) $(frompolyhedron1_OBJECTS) $(frompolyhedron1_LDADD) $(LIBS) +fromspacedimension1$(EXEEXT): $(fromspacedimension1_OBJECTS) $(fromspacedimension1_DEPENDENCIES) + @rm -f fromspacedimension1$(EXEEXT) + $(CXXLINK) $(fromspacedimension1_OBJECTS) $(fromspacedimension1_LDADD) $(LIBS) +intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) + @rm -f intersection1$(EXEEXT) + $(CXXLINK) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS) +maxmin1$(EXEEXT): $(maxmin1_OBJECTS) $(maxmin1_DEPENDENCIES) + @rm -f maxmin1$(EXEEXT) + $(CXXLINK) $(maxmin1_OBJECTS) $(maxmin1_LDADD) $(LIBS) +meet1$(EXEEXT): $(meet1_OBJECTS) $(meet1_DEPENDENCIES) + @rm -f meet1$(EXEEXT) + $(CXXLINK) $(meet1_OBJECTS) $(meet1_LDADD) $(LIBS) +membytes1$(EXEEXT): $(membytes1_OBJECTS) $(membytes1_DEPENDENCIES) + @rm -f membytes1$(EXEEXT) + $(CXXLINK) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS) +powerset1$(EXEEXT): $(powerset1_OBJECTS) $(powerset1_DEPENDENCIES) + @rm -f powerset1$(EXEEXT) + $(CXXLINK) $(powerset1_OBJECTS) $(powerset1_LDADD) $(LIBS) +reduce1$(EXEEXT): $(reduce1_OBJECTS) $(reduce1_DEPENDENCIES) + @rm -f reduce1$(EXEEXT) + $(CXXLINK) $(reduce1_OBJECTS) $(reduce1_LDADD) $(LIBS) +refinewith1$(EXEEXT): $(refinewith1_OBJECTS) $(refinewith1_DEPENDENCIES) + @rm -f refinewith1$(EXEEXT) + $(CXXLINK) $(refinewith1_OBJECTS) $(refinewith1_LDADD) $(LIBS) +relationwith1$(EXEEXT): $(relationwith1_OBJECTS) $(relationwith1_DEPENDENCIES) + @rm -f relationwith1$(EXEEXT) + $(CXXLINK) $(relationwith1_OBJECTS) $(relationwith1_LDADD) $(LIBS) +simplifyusingcontext1$(EXEEXT): $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_DEPENDENCIES) + @rm -f simplifyusingcontext1$(EXEEXT) + $(CXXLINK) $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_LDADD) $(LIBS) +size1$(EXEEXT): $(size1_OBJECTS) $(size1_DEPENDENCIES) + @rm -f size1$(EXEEXT) + $(CXXLINK) $(size1_OBJECTS) $(size1_LDADD) $(LIBS) +spacedims1$(EXEEXT): $(spacedims1_OBJECTS) $(spacedims1_DEPENDENCIES) + @rm -f spacedims1$(EXEEXT) + $(CXXLINK) $(spacedims1_OBJECTS) $(spacedims1_LDADD) $(LIBS) +universe1$(EXEEXT): $(universe1_OBJECTS) $(universe1_DEPENDENCIES) + @rm -f universe1$(EXEEXT) + $(CXXLINK) $(universe1_OBJECTS) $(universe1_LDADD) $(LIBS) +upperbound1$(EXEEXT): $(upperbound1_OBJECTS) $(upperbound1_DEPENDENCIES) + @rm -f upperbound1$(EXEEXT) + $(CXXLINK) $(upperbound1_OBJECTS) $(upperbound1_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addcongruences1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addconstraints1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/affinedimension1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/affineimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/affinepreimage1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bounded1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bounds1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/closed1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/closure1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/collapse1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/concatenate1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/contains1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/containsintegerpoint1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/difference1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/discrete1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disjoint1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disjunct1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/empty1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/entails1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/equals1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frombdshape1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frombox1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fromcongruences1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fromconstraints1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fromgrid1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fromoctagonalshape1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frompolyhedron1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fromspacedimension1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/intersection1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/maxmin1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meet1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/membytes1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/powerset1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reduce1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refinewith1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relationwith1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplifyusingcontext1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/size1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spacedims1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/universe1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upperbound1.Po@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; ws='[ ]'; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *$$ws$$tst$$ws*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + echo "XPASS: $$tst"; \ + ;; \ + *) \ + echo "PASS: $$tst"; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *$$ws$$tst$$ws*) \ + xfail=`expr $$xfail + 1`; \ + echo "XFAIL: $$tst"; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + echo "FAIL: $$tst"; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + echo "SKIP: $$tst"; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all tests failed"; \ + else \ + banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + skipped="($$skip tests were not run)"; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + test -z "$$skipped" || echo "$$skipped"; \ + test -z "$$report" || echo "$$report"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0; \ + else :; fi + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +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 + +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 all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool ctags \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-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 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..6729156 --- /dev/null +++ b/tests/Powerset/addcongruences1.cc @@ -0,0 +1,67 @@ +/* Test Pointset_Powerset::add_congruence(). + Pointset_Powerset::add_congruences(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of C polyhedra: add_congruence(). +bool +test01() { + Variable x(0); + Congruence cg = (Linear_Expression(0) %= 0); + Pointset_Powerset 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 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..f324447 --- /dev/null +++ b/tests/Powerset/addconstraints1.cc @@ -0,0 +1,65 @@ +/* Test Pointset_Powerset::add_constraint(). + Pointset_Powerset::add_constraints(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of C polyhedra: add_constraint(). +bool +test01() { + Variable x(0); + Constraint c = (x >= 0); + Pointset_Powerset ps(1, EMPTY); + ps.add_disjunct(C_Polyhedron(1)); + ps.add_constraint(c); + Constraint c1 = (x >= 1); + bool ok = ps.add_constraint_and_minimize(c1); + + 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 ps(1, EMPTY); + ps.add_disjunct(C_Polyhedron(1)); + ps.add_constraints(cs); + cs.insert(x <= 3); + bool ok = ps.add_constraints_and_minimize(cs); + cs.insert(x <= 2); + ok &= !ps.add_constraints_and_minimize(cs); + + 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..08f3c47 --- /dev/null +++ b/tests/Powerset/affinedimension1.cc @@ -0,0 +1,138 @@ +/* Test Pointset_Powerset::affine_dimension(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of C polyhedra: affine_dimension(). +bool +test01() { + Variable x(0); + Variable y(1); + Variable z(1); + Pointset_Powerset 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::const_iterator i = c_ps.begin(); + C_Polyhedron phi = i->element(); + i++; + C_Polyhedron phi1 = i->element(); + + 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::const_iterator j = c_ps.begin(); + C_Polyhedron phj = j->element(); + j++; + C_Polyhedron phj1 = j->element(); + + 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 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::const_iterator i = c_ps.begin(); + NNC_Polyhedron phi = i->element(); + i++; + NNC_Polyhedron phi1 = i->element(); + + 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::const_iterator j = c_ps.begin(); + NNC_Polyhedron phj = j->element(); + j++; + NNC_Polyhedron phj1 = j->element(); + + 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..28b4789 --- /dev/null +++ b/tests/Powerset/affineimage1.cc @@ -0,0 +1,239 @@ +/* Test Pointset_Powerset::affine_image(), + Pointset_Powerset::generalized_affine_image(), + Pointset_Powerset::bounded_affine_image(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of polyhedra: affine_image(). +bool +test01() { + Variable x(0); + Variable y(1); + Pointset_Powerset 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::const_iterator i = c_ps.begin(); + C_Polyhedron phi = i->element(); + i++; + C_Polyhedron phi1 = i->element(); + + 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 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 ps2(ps1); + ps2.affine_image(x, 2*x+1, 2); + + print_constraints(ps1, "*** ps1 ***"); + print_constraints(ps2, "*** ps2 ***"); + + ps1.intersection_assign(ps2); + + Pointset_Powerset 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 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_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::const_iterator i = c_ps.begin(); + C_Polyhedron phi = i->element(); + i++; + C_Polyhedron phi1 = i->element(); + + 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_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::const_iterator i = c_ps.begin(); + C_Polyhedron phi = i->element(); + i++; + C_Polyhedron phi1 = i->element(); + + 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..f2da7f9 --- /dev/null +++ b/tests/Powerset/affinepreimage1.cc @@ -0,0 +1,171 @@ +/* Test Pointset_Powerset::affine_preimage(), + Pointset_Powerset::generalized_affine_preimage(), + Pointset_Powerset::bounded_affine_preimage(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of C polyhedra: affine_preimage(). +bool +test01() { + Variable x(0); + Variable y(1); + Pointset_Powerset 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::const_iterator i = c_ps.begin(); + C_Polyhedron phi = i->element(); + i++; + C_Polyhedron phi1 = i->element(); + + 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_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::const_iterator i = c_ps.begin(); + C_Polyhedron phi = i->element(); + i++; + C_Polyhedron phi1 = i->element(); + + 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_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::const_iterator i = c_ps.begin(); + C_Polyhedron phi = i->element(); + i++; + C_Polyhedron phi1 = i->element(); + + 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..bb34cf6 --- /dev/null +++ b/tests/Powerset/bounded1.cc @@ -0,0 +1,77 @@ +/* Test Pointset_Powerset::is_bounded(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of C polyhedra: is_bounded(). +bool +test01() { + Pointset_Powerset 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 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 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..6fe5b6e --- /dev/null +++ b/tests/Powerset/bounds1.cc @@ -0,0 +1,96 @@ +/* Test Pointset_Powerset::bounds_from_above(), + Pointset_Powerset::bounds_from_below(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of C polyhedra: bounds_from_above(), bounds_from_below(). +bool +test01() { + Pointset_Powerset 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 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 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..5638391 --- /dev/null +++ b/tests/Powerset/closed1.cc @@ -0,0 +1,99 @@ +/* Test Pointset_Powerset::is_topologically_closed(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of C polyhedra: is_topologically_closed(). +bool +test01() { + Pointset_Powerset 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 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 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 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..11ec938 --- /dev/null +++ b/tests/Powerset/closure1.cc @@ -0,0 +1,58 @@ +/* Test Pointset_Powerset::topological_closure_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of C polyhedra: topological_closure_assign(). + +bool +test01() { + Variable x(0); + Pointset_Powerset 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 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..63b0ae1 --- /dev/null +++ b/tests/Powerset/collapse1.cc @@ -0,0 +1,94 @@ +/* Test Pointset_Powerset::collapse(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of polyhedra: collapse(). +bool +test01() { + Variable x(0); + Pointset_Powerset 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_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 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 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..33479d5 --- /dev/null +++ b/tests/Powerset/concatenate1.cc @@ -0,0 +1,74 @@ +/* Test Pointset_Powerset::concatenate(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of polyhedra: concatenate_assign(). +bool +test01() { + Variable x(0); + Pointset_Powerset 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 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..8aa4de1 --- /dev/null +++ b/tests/Powerset/contains1.cc @@ -0,0 +1,108 @@ +/* Test Pointset_Powerset::contains(), + Pointset_Powerset::strictly_contains(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of C polyhedra: contains(), strictly_contains(). +bool +test01() { + Pointset_Powerset ps1(1, EMPTY); + + Pointset_Powerset 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_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_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..dab4cd6 --- /dev/null +++ b/tests/Powerset/containsintegerpoint1.cc @@ -0,0 +1,131 @@ +/* Test Pointset_Powerset::contains_integer_point(), + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of C polyhedra: contains_integer_point() returns false. +bool +test01() { + Variable x(0); + Variable y(1); + + Pointset_Powerset 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 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 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 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 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..8f14491 --- /dev/null +++ b/tests/Powerset/difference1.cc @@ -0,0 +1,150 @@ +/* Test Pointset_Powerset::difference_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of C polyhedra: difference_assign(). +bool +test01() { + Variable x(0); + Variable y(1); + Pointset_Powerset c_ps1(2, UNIVERSE); + + Pointset_Powerset 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_ps1(2, UNIVERSE); + + Pointset_Powerset 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 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 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 difference = cross; + difference.difference_assign(squares); + + nout << "cross - squares = " << difference << endl; + + Pointset_Powerset intersection = difference; + intersection.meet_assign(squares); + + nout << "(cross - squares) inters squares = " << intersection << endl; + + // When using Pointset_Powerset, intersection will be + // empty. When using Pointset_Powerset, + // intersection will consist of objects of affine dimension at most 1. + bool ok1 = true; + for (Pointset_Powerset::const_iterator + i = intersection.begin(), in_end = intersection.end(); + i != in_end; ++i) + if (i->element().affine_dimension() > 1) { + nout << "intersection contains " << i->element() << "," << endl + << "which is of affine dimension greater than 1" << endl; + ok1 = false; + } + + Pointset_Powerset re_union = difference; + re_union.upper_bound_assign(squares); + + nout << "(cross - squares) union squares = " << re_union << endl; + re_union.pairwise_reduce(); + nout << " = " << 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..91e83bd --- /dev/null +++ b/tests/Powerset/discrete1.cc @@ -0,0 +1,79 @@ +/* Test Pointset_Powerset::is_discrete(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of C polyhedra: is_discrete(). +bool +test01() { + Pointset_Powerset 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 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 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..2b69ffc --- /dev/null +++ b/tests/Powerset/disjoint1.cc @@ -0,0 +1,116 @@ +/* Test Pointset_Powerset::is_disjoint_from(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of C polyhedra: is_disjoint_from(). +bool +test01() { + Pointset_Powerset ps1(0, EMPTY); + + Pointset_Powerset 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 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 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 ps1(1, EMPTY); + + Pointset_Powerset 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..8eea208 --- /dev/null +++ b/tests/Powerset/disjunct1.cc @@ -0,0 +1,310 @@ +/* Test Pointset_Powerset::add_disjunct(). + Pointset_Powerset::drop_disjunct(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of C polyhedra: add_disjunct(). +bool +test01() { + Variable x(0); + Constraint_System cs; + Pointset_Powerset 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_ps(c_ps); + + Pointset_Powerset::const_iterator c_i = c_ps.begin(); + C_Polyhedron c_phi = c_i->element(); + print_constraints(c_phi, "*** c_phi ***"); + Pointset_Powerset::const_iterator nnc_i = nnc_ps.begin(); + NNC_Polyhedron nnc_phi = nnc_i->element(); + 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_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_ps(nnc_ps); + + Pointset_Powerset::const_iterator c_i = c_ps.begin(); + C_Polyhedron c_phi = c_i->element(); + print_constraints(c_phi, "*** c_phi ***"); + Pointset_Powerset::const_iterator nnc_i = nnc_ps.begin(); + NNC_Polyhedron nnc_phi = nnc_i->element(); + 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_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_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::const_iterator i = c_ps.begin(); + C_Polyhedron phi = i->element(); + i++; + C_Polyhedron phi1 = i->element(); + + 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 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::const_iterator i = pps_box.begin(); + TBox pps_boxi = i->element(); + i++; + TBox pps_boxi1 = i->element(); + + 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 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 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 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::const_iterator i = pps_box.begin(); + TBox pps_boxi = i->element(); + i++; + TBox pps_boxi1 = i->element(); + + 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 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..fa60538 --- /dev/null +++ b/tests/Powerset/empty1.cc @@ -0,0 +1,141 @@ +/* Test Pointset_Powerset::is_empty(), + Pointset_Powerset::empty(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of C polyhedra: empty(). +bool +test01() { + Variable x(0); + Pointset_Powerset 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_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_ps(1, EMPTY); + Constraint_System cs; + + cs.insert(x >= 0); + cs.insert(x <= 2); + c_ps.add_disjunct(C_Polyhedron(cs)); + + Pointset_Powerset c_ps1(1, EMPTY); + c_ps.swap(c_ps1); + + bool ok = (c_ps.empty() && !c_ps1.empty()); + return ok; +} + +// Powerset of C polyhedra: is_empty(). +bool +test03() { + Pointset_Powerset 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 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 pps_box(1, EMPTY); + Constraint_System cs; + + cs.insert(x >= 0); + cs.insert(x <= 2); + pps_box.add_disjunct(TBox(cs)); + + Pointset_Powerset pps_box1; + pps_box1 = pps_box; + + bool ok = !pps_box.empty(); + return ok; +} + +// Powerset of boxes: empty(). +bool +test06() { + Variable x(0); + Pointset_Powerset pps_box(1, EMPTY); + Constraint_System cs; + + cs.insert(x >= 0); + cs.insert(x <= 2); + pps_box.add_disjunct(TBox(cs)); + + Pointset_Powerset pps_box1(1, EMPTY); + pps_box.swap(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..b1953d0 --- /dev/null +++ b/tests/Powerset/entails1.cc @@ -0,0 +1,72 @@ +/* Test Pointset_Powerset::definitely_entails(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of polyhedra: definitely_entails(). +bool +test01() { + Variable x(0); + Pointset_Powerset c_ps(1, EMPTY); + Constraint_System cs; + cs.insert(x >= 0); + c_ps.add_disjunct(C_Polyhedron(cs)); + + Pointset_Powerset 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 pps_box(1, EMPTY); + Constraint_System cs; + cs.insert(x >= 0); + pps_box.add_disjunct(TBox(cs)); + + Pointset_Powerset 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..9f74b56 --- /dev/null +++ b/tests/Powerset/equals1.cc @@ -0,0 +1,78 @@ +/* Test Pointset_Powerset::equals(), + Pointset_Powerset::geometrically_equals(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// geometrically_equals(). +bool +test01() { + Variable x(0); + Pointset_Powerset pps_box(1); + Constraint_System cs; + cs.insert(x >= 5); + cs.insert(x <= 3); + pps_box.add_constraints(cs); + + Pointset_Powerset 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 pps_box(1); + Constraint_System cs; + cs.insert(x >= 5); + cs.insert(x >= 8); + pps_box.add_constraints(cs); + + Pointset_Powerset 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..cfa896b --- /dev/null +++ b/tests/Powerset/frombdshape1.cc @@ -0,0 +1,424 @@ +/* Test Pointset_Powerset::Pointset_Powerset(BD_Shape), + Pointset_Powerset::Pointset_Powerset(Pointset_Powerset(BD_Shape)). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// 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 pps(bds); + + Pointset_Powerset 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::const_iterator i = pps.begin(); + C_Polyhedron phi = i->element(); + 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 pps(bds); + + Pointset_Powerset 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 pps_bds(bds, POLYNOMIAL_COMPLEXITY); + + // The complexity should be ignored. + Pointset_Powerset pps(pps_bds, POLYNOMIAL_COMPLEXITY); + + Pointset_Powerset known_pps(2); + known_pps.add_constraint(x == 1); + known_pps.add_constraint(y <= 0); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator j = pps.begin(); + C_Polyhedron phj = j->element(); + 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 pps1(bds); + Pointset_Powerset pps2(4, EMPTY); + pps2.add_disjunct(bds); + + bool ok = (pps1 == pps2); + + Pointset_Powerset::const_iterator i = pps1.begin(); + TBD_Shape bdsi = i->element(); + print_constraints(bdsi, "*** bdsi ***"); + Pointset_Powerset::const_iterator i2 = pps2.begin(); + TBD_Shape bdsi2 = i2->element(); + 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 pps(bds); + + Pointset_Powerset 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 pps_bds(bds, POLYNOMIAL_COMPLEXITY); + + // The complexity should be ignored. + Pointset_Powerset pps(pps_bds, POLYNOMIAL_COMPLEXITY); + + Pointset_Powerset known_pps(2); + known_pps.add_constraint(x == 1); + known_pps.add_constraint(y <= 0); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator j = pps.begin(); + TBD_Shape bdsj = j->element(); + 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 pps(bds); + + Pointset_Powerset 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::const_iterator i = pps.begin(); + TOctagonal_Shape osi = i->element(); + 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 pps(bds); + + Pointset_Powerset 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 pps_bd(bd, POLYNOMIAL_COMPLEXITY); + + // The complexity should be ignored. + Pointset_Powerset pps(pps_bd, POLYNOMIAL_COMPLEXITY); + + Pointset_Powerset known_pps(2); + known_pps.add_constraint(x == 1); + known_pps.add_constraint(y == 0); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator i_os = pps.begin(); + TOctagonal_Shape osi = i_os->element(); + 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 pps(bds); + + Pointset_Powerset known_pps(2); + known_pps.add_constraint(x == 0); + known_pps.add_constraint(y >= 0); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator i = pps.begin(); + TBox phi = i->element(); + 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 pps(bds); + + Pointset_Powerset 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 pps_bd(bd, POLYNOMIAL_COMPLEXITY); + + // The complexity should be ignored. + Pointset_Powerset pps(pps_bd, POLYNOMIAL_COMPLEXITY); + + Pointset_Powerset known_pps(2); + known_pps.add_constraint(x == 1); + known_pps.add_constraint(y == 0); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator i_box = pps.begin(); + TBox boxi = i_box->element(); + 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 pps(bds); + + Pointset_Powerset known_pps(2); + known_pps.add_congruence((x %= 0) / 0); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator i = pps.begin(); + Grid phi = i->element(); + 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 pps(bds); + + Pointset_Powerset 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 pps_bd(bd, POLYNOMIAL_COMPLEXITY); + + Pointset_Powerset::const_iterator i_bd = pps_bd.begin(); + TBD_Shape bdi = i_bd->element(); + print_constraints(bdi, "*** bdi ***"); + + // The complexity should be ignored. + Pointset_Powerset pps(pps_bd, POLYNOMIAL_COMPLEXITY); + + Pointset_Powerset known_pps(2); + known_pps.add_constraint(x == 1); + known_pps.add_constraint(y == 0); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator i_gr = pps.begin(); + Grid gri = i_gr->element(); + 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..2921678 --- /dev/null +++ b/tests/Powerset/frombox1.cc @@ -0,0 +1,420 @@ +/* Test Pointset_Powerset::Pointset_Powerset(Box), + Pointset_Powerset::Pointset_Powerset(Pointset_Powerset(Box)). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// 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 pps(box); + + Pointset_Powerset 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::const_iterator i = pps.begin(); + C_Polyhedron phi = i->element(); + 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 pps(box); + + Pointset_Powerset 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 pps_box(box, POLYNOMIAL_COMPLEXITY); + + // The complexity should be ignored. + Pointset_Powerset pps(pps_box, POLYNOMIAL_COMPLEXITY); + + Pointset_Powerset known_pps(2); + known_pps.add_constraint(x == 1); + known_pps.add_constraint(y <= 0); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator j = pps.begin(); + C_Polyhedron phj = j->element(); + 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 pps(box, POLYNOMIAL_COMPLEXITY); + + Pointset_Powerset known_pps(2); + known_pps.add_constraint(x >= 0); + known_pps.add_constraint(y >= 0); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator i = pps.begin(); + TBD_Shape bdsi = i->element(); + 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 pps(box); + + Pointset_Powerset 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 pps_box(box, POLYNOMIAL_COMPLEXITY); + + // The complexity should be ignored. + Pointset_Powerset pps(pps_box, POLYNOMIAL_COMPLEXITY); + + Pointset_Powerset known_pps(2); + known_pps.add_constraint(x >= 1); + known_pps.add_constraint(y <= 0); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator i_bds = pps.begin(); + TBD_Shape bdsi = i_bds->element(); + 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 pps(box, POLYNOMIAL_COMPLEXITY); + + Pointset_Powerset known_pps(2); + known_pps.add_constraint(x >= 0); + known_pps.add_constraint(y >= 0); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator i = pps.begin(); + TOctagonal_Shape osi = i->element(); + 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 pps(box); + + Pointset_Powerset 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 pps_box(box, POLYNOMIAL_COMPLEXITY); + + // The complexity should be ignored. + Pointset_Powerset pps(pps_box, POLYNOMIAL_COMPLEXITY); + + Pointset_Powerset known_pps(2); + known_pps.add_constraint(x >= 1); + known_pps.add_constraint(y <= 0); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator i_os = pps.begin(); + TOctagonal_Shape osi = i_os->element(); + 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 pps1(box); + Pointset_Powerset pps2(4, EMPTY); + pps2.add_disjunct(box); + + bool ok = (pps1 == pps2); + + print_constraints(box, "*** box ***"); + Pointset_Powerset::const_iterator i = pps1.begin(); + TBox boxi = i->element(); + print_constraints(boxi, "*** boxi ***"); + Pointset_Powerset::const_iterator i2 = pps2.begin(); + TBox boxi2 = i2->element(); + 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 pps(box); + + Pointset_Powerset 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 pps_box(box, POLYNOMIAL_COMPLEXITY); + + // The complexity should be ignored. + Pointset_Powerset pps(pps_box, POLYNOMIAL_COMPLEXITY); + + Pointset_Powerset known_pps(2); + known_pps.add_constraint(x == 1); + known_pps.add_constraint(y <= 0); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator j = pps.begin(); + TBox boxj = j->element(); + 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 pps(box); + + Pointset_Powerset known_pps(2); + known_pps.add_constraint(2*x == 1); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator i = pps.begin(); + Grid phi = i->element(); + 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 pps(box); + + Pointset_Powerset 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 pps_box(box, POLYNOMIAL_COMPLEXITY); + + Pointset_Powerset::const_iterator i_box = pps_box.begin(); + TBox boxi = i_box->element(); + print_constraints(boxi, "*** boxi ***"); + + // The complexity should be ignored. + Pointset_Powerset pps(pps_box, POLYNOMIAL_COMPLEXITY); + + Pointset_Powerset known_pps(2); + known_pps.add_constraint(x == 1); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator i_gr = pps.begin(); + Grid gri = i_gr->element(); + 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..a83d752 --- /dev/null +++ b/tests/Powerset/fromcongruences1.cc @@ -0,0 +1,77 @@ +/* Test Pointset_Powerset:: + Pointset_Powerset(Congruence_System). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Congruence_System cs; + Pointset_Powerset 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 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 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..bfe4c94 --- /dev/null +++ b/tests/Powerset/fromconstraints1.cc @@ -0,0 +1,179 @@ +/* Test Pointset_Powerset::Pointset_Powerset(Constraint_System). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Construct powerset of polyhedra from a 0 dimension empty constraint system. +bool +test01() { + Constraint_System cs = Constraint_System::zero_dim_empty(); + Pointset_Powerset 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 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 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 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 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 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 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 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 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 ps(cs); + + return ps.OK() && ps.space_dimension() == 1; +} + +// Construct powerset of products from a 0-dim inconsistent constraint system. + typedef Domain_Product::Constraints_Product CProduct; +bool +test11() { + Constraint_System cs = Constraint_System::zero_dim_empty(); + Pointset_Powerset 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 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); +END_MAIN diff --git a/tests/Powerset/fromgrid1.cc b/tests/Powerset/fromgrid1.cc new file mode 100644 index 0000000..e8f5fc3 --- /dev/null +++ b/tests/Powerset/fromgrid1.cc @@ -0,0 +1,434 @@ +/* Test Pointset_Powerset::Pointset_Powerset(Grid), + Pointset_Powerset::Pointset_Powerset(Pointset_Powerset(Grid)). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// 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 pps(grid); + + Pointset_Powerset known_pps(2); + + known_pps.add_constraint(2*x == 1); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator i = pps.begin(); + C_Polyhedron phi = i->element(); + 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 pps(grid); + + Pointset_Powerset 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 pps_gr(grid); + + Pointset_Powerset pps(pps_gr); + + Pointset_Powerset known_pps(2); + + known_pps.add_constraint(2*x == 1); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator i = pps.begin(); + C_Polyhedron phi = i->element(); + 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 pps(gr); + + Pointset_Powerset known_pps(2); + known_pps.add_constraint(2*x == 1); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator i = pps.begin(); + TBD_Shape bdsi = i->element(); + 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 pps(gr); + + Pointset_Powerset 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 pps_gr(gr); + + Pointset_Powerset pps(pps_gr); + + Pointset_Powerset known_pps(2); + + known_pps.add_constraint(2*x == 1); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator i = pps.begin(); + TBD_Shape bdsi = i->element(); + 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 pps(gr); + + Pointset_Powerset known_pps(2); + known_pps.add_constraint(2*x == 1); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator i = pps.begin(); + TOctagonal_Shape osi = i->element(); + 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 pps(gr); + + Pointset_Powerset 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 pps_gr(gr); + + Pointset_Powerset pps(pps_gr); + + Pointset_Powerset known_pps(2); + + known_pps.add_constraint(2*x == 1); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator i = pps.begin(); + TOctagonal_Shape osi = i->element(); + 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 pps(gr); + + Pointset_Powerset known_pps(2); + known_pps.add_constraint(2*x == 1); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator i = pps.begin(); + TBox phi = i->element(); + 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 pps(gr); + + Pointset_Powerset 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 pps_gr(gr); + + Pointset_Powerset pps(pps_gr); + + Pointset_Powerset known_pps(2); + + known_pps.add_constraint(2*x == 1); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator i = pps.begin(); + TBox boxi = i->element(); + 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 pps1(gr); + Pointset_Powerset pps2(4, EMPTY); + pps2.add_disjunct(gr); + + bool ok = (pps1 == pps2); + + print_congruences(gr, "*** gr ***"); + Pointset_Powerset::const_iterator i = pps1.begin(); + Grid gri = i->element(); + print_congruences(gri, "*** gri ***"); + Pointset_Powerset::const_iterator i2 = pps2.begin(); + Grid gri2 = i2->element(); + 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 pps(gr); + + Pointset_Powerset 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 pps_gr(grid); + + Pointset_Powerset pps(pps_gr); + + Pointset_Powerset known_pps(2); + + known_pps.add_constraint(2*x == 1); + known_pps.add_congruence(y %= 0); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator i = pps.begin(); + Grid gri = i->element(); + 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 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. + bool top_closed = pps_gr.is_topologically_closed(); + + Pointset_Powerset pps(pps_gr); + + // pps is not omega reduced. + bool ok = (pps.size() == 2); + + Pointset_Powerset known_pps(2); + + ok = ok && (pps == known_pps) && pps.OK(); + + Pointset_Powerset::const_iterator i = pps.begin(); + NNC_Polyhedron phi = i->element(); + 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..5368a85 --- /dev/null +++ b/tests/Powerset/fromoctagonalshape1.cc @@ -0,0 +1,431 @@ +/* Test Pointset_Powerset::Pointset_Powerset(BD_Shape), + Pointset_Powerset::Pointset_Powerset(Pointset_Powerset(BD_Shape)). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// 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 pps(os); + + Pointset_Powerset 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::const_iterator i = pps.begin(); + C_Polyhedron phi = i->element(); + 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 pps(os); + + Pointset_Powerset 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 pps_os(os, POLYNOMIAL_COMPLEXITY); + + // The complexity should be ignored. + Pointset_Powerset pps(pps_os, POLYNOMIAL_COMPLEXITY); + + Pointset_Powerset known_pps(2); + known_pps.add_constraint(x == 1); + known_pps.add_constraint(y <= 0); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator j = pps.begin(); + C_Polyhedron phj = j->element(); + 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 pps(os); + + Pointset_Powerset 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::const_iterator i = pps.begin(); + TBD_Shape bdsi = i->element(); + 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 pps(os); + + Pointset_Powerset 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 pps_os(os, POLYNOMIAL_COMPLEXITY); + + // The complexity should be ignored. + Pointset_Powerset pps(pps_os, POLYNOMIAL_COMPLEXITY); + + Pointset_Powerset known_pps(2); + known_pps.add_constraint(x == 1); + known_pps.add_constraint(y == 0); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator i_bds = pps.begin(); + TBD_Shape bdsi = i_bds->element(); + 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 pps1(os); + Pointset_Powerset pps2(4, EMPTY); + pps2.add_disjunct(os); + + bool ok = (pps1 == pps2); + + Pointset_Powerset::const_iterator i = pps1.begin(); + TOctagonal_Shape osi = i->element(); + print_constraints(osi, "*** osi ***"); + Pointset_Powerset::const_iterator i2 = pps2.begin(); + TOctagonal_Shape osi2 = i2->element(); + 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 pps(os); + + Pointset_Powerset 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 pps_os(os, POLYNOMIAL_COMPLEXITY); + + // The complexity should be ignored. + Pointset_Powerset pps(pps_os, POLYNOMIAL_COMPLEXITY); + + Pointset_Powerset known_pps(2); + known_pps.add_constraint(x == 1); + known_pps.add_constraint(y <= 0); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator j = pps.begin(); + TOctagonal_Shape osj = j->element(); + 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 pps(os, POLYNOMIAL_COMPLEXITY); + + Pointset_Powerset 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::const_iterator i = pps.begin(); + TBox phi = i->element(); + 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 pps(os); + + Pointset_Powerset 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 pps_os(os, POLYNOMIAL_COMPLEXITY); + + // The complexity should be ignored. + Pointset_Powerset pps(pps_os, POLYNOMIAL_COMPLEXITY); + + Pointset_Powerset known_pps(2); + known_pps.add_constraint(x == 1); + known_pps.add_constraint(y == 0); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator i_box = pps.begin(); + TBox boxi = i_box->element(); + 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 pps(os, POLYNOMIAL_COMPLEXITY); + + Pointset_Powerset known_pps(2); + known_pps.add_constraint(x - y == 3); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator i = pps.begin(); + Grid phi = i->element(); + 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 pps(os); + + Pointset_Powerset 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 pps_os(os, POLYNOMIAL_COMPLEXITY); + + Pointset_Powerset::const_iterator i_os = pps_os.begin(); + TOctagonal_Shape osi = i_os->element(); + print_constraints(osi, "*** osi ***"); + + // The complexity should be ignored. + Pointset_Powerset pps(pps_os, POLYNOMIAL_COMPLEXITY); + + Pointset_Powerset known_pps(2); + known_pps.add_constraint(x == 1); + known_pps.add_constraint(y == 0); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator i_gr = pps.begin(); + Grid gri = i_gr->element(); + 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..283f4f4 --- /dev/null +++ b/tests/Powerset/frompolyhedron1.cc @@ -0,0 +1,758 @@ +/* Test Pointset_Powerset::Pointset_Powerset(C_Polyhedron), + Pointset_Powerset::Pointset_Powerset(NNC_Polyhedron). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Constructs the powerset of polyhedra from an empty polyhedron. +bool +test01() { + C_Polyhedron c_ph(0, EMPTY); + Pointset_Powerset 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_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_pps1(c_ph); + Pointset_Powerset c_pps2(4, EMPTY); + c_pps2.add_disjunct(c_ph); + + Pointset_Powerset nnc_pps1(c_ph); + Pointset_Powerset nnc_pps2(4, EMPTY); + nnc_pps2.add_disjunct(nnc_ph); + + bool ok = (c_pps1 == c_pps2 && nnc_pps1 == nnc_pps2); + + Pointset_Powerset::const_iterator c_i = c_pps1.begin(); + C_Polyhedron c_phi = c_i->element(); + print_constraints(c_phi, "*** c_phi ***"); + Pointset_Powerset::const_iterator nnc_i = nnc_pps1.begin(); + NNC_Polyhedron nnc_phi = nnc_i->element(); + 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_pps1(nnc_ph); + Pointset_Powerset c_pps2(4, EMPTY); + c_pps2.add_disjunct(c_ph); + + Pointset_Powerset nnc_pps1(nnc_ph); + Pointset_Powerset nnc_pps2(4, EMPTY); + nnc_pps2.add_disjunct(nnc_ph); + + bool ok = (c_pps1 == c_pps2 && nnc_pps1 == nnc_pps2); + + Pointset_Powerset::const_iterator c_i = c_pps1.begin(); + C_Polyhedron c_phi = c_i->element(); + print_constraints(c_phi, "*** c_phi ***"); + Pointset_Powerset::const_iterator nnc_i = nnc_pps1.begin(); + NNC_Polyhedron nnc_phi = nnc_i->element(); + 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 pps_c(ph); + + Pointset_Powerset pps(pps_c); + + Pointset_Powerset known_pps(2); + + known_pps.add_constraint(2*x == 1); + known_pps.add_constraint(y >= 0); + + bool ok = (pps == known_pps); + + Pointset_Powerset::const_iterator i = pps.begin(); + NNC_Polyhedron phi = i->element(); + 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 pps(2); + + pps.add_constraint(x >= 1); + pps.add_constraint(x <= 1); + pps.add_constraint(y >= 0); + + Pointset_Powerset pps1(pps, POLYNOMIAL_COMPLEXITY); + + Pointset_Powerset::const_iterator i1 = pps.begin(); + C_Polyhedron phi1 = i1->element(); + print_constraints(phi1, "*** phi1 ***"); + + pps.OK(); + + Pointset_Powerset::const_iterator i = pps.begin(); + C_Polyhedron phi = i->element(); + 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 pps(ph); + Pointset_Powerset::const_iterator i = pps.begin(); + TBD_Shape bdsi = i->element(); + + BD_Shape 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 pps1(ph1, POLYNOMIAL_COMPLEXITY); + Pointset_Powerset::const_iterator i1 = pps1.begin(); + TBD_Shape bdsi1 = i1->element(); + + BD_Shape 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::const_iterator i_ok = pps.begin(); + TBD_Shape bdsi_ok = i_ok->element(); + Pointset_Powerset::const_iterator i1_ok = pps1.begin(); + TBD_Shape bdsi1_ok = i1_ok->element(); + + 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 pps(ph); + // With the polynomial complexity, the built powerset is non-empty. + Pointset_Powerset pps1(ph1, POLYNOMIAL_COMPLEXITY); + + BD_Shape known_bds1(4); + known_bds1.add_constraint(3*x >= 2); + known_bds1.add_constraint(z >= 1); + + Pointset_Powerset::const_iterator i1 = pps1.begin(); + TBD_Shape bdsi1 = i1->element(); + + 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 pps(ph); + + Pointset_Powerset 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 pps1_c(ph1, POLYNOMIAL_COMPLEXITY); + Pointset_Powerset pps2_c(ph2); + + Pointset_Powerset pps1(pps1_c, POLYNOMIAL_COMPLEXITY); + Pointset_Powerset pps2(pps2_c); + + Pointset_Powerset known_pps1(2); + known_pps1.add_constraint(2*x >= 1); + known_pps1.add_constraint(y >= 0); + Pointset_Powerset 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::const_iterator i1 = pps1.begin(); + TBD_Shape bdsi1 = i1->element(); + print_constraints(bdsi1, "*** bdsi1 ***"); + + Pointset_Powerset::const_iterator i2 = pps2.begin(); + TBD_Shape bdsi2 = i2->element(); + 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 pps(ph); + Pointset_Powerset::const_iterator i = pps.begin(); + TOctagonal_Shape osi = i->element(); + + Octagonal_Shape 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 pps1(ph1, POLYNOMIAL_COMPLEXITY); + Pointset_Powerset::const_iterator i1 = pps1.begin(); + TOctagonal_Shape osi1 = i1->element(); + + Octagonal_Shape 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::const_iterator i_ok = pps.begin(); + TOctagonal_Shape osi_ok = i_ok->element(); + Pointset_Powerset::const_iterator i1_ok = pps1.begin(); + TOctagonal_Shape osi1_ok = i1_ok->element(); + + 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 pps(ph); + // With the polynomial complexity, the built powerset is non-empty. + Pointset_Powerset pps1(ph1, POLYNOMIAL_COMPLEXITY); + + Octagonal_Shape known_os1(4); + known_os1.add_constraint(3*x >= 2); + known_os1.add_constraint(z >= 1); + + Pointset_Powerset::const_iterator i1 = pps1.begin(); + TOctagonal_Shape osi1 = i1->element(); + + 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 pps(ph); + + Pointset_Powerset 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 pps1_c(ph1, POLYNOMIAL_COMPLEXITY); + Pointset_Powerset pps2_c(ph2); + + Pointset_Powerset pps1(pps1_c, POLYNOMIAL_COMPLEXITY); + Pointset_Powerset pps2(pps2_c); + + Pointset_Powerset known_pps1(2); + known_pps1.add_constraint(2*x >= 1); + known_pps1.add_constraint(y >= 0); + Pointset_Powerset 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::const_iterator i1 = pps1.begin(); + TOctagonal_Shape osi1 = i1->element(); + print_constraints(osi1, "*** osi1 ***"); + + Pointset_Powerset::const_iterator i2 = pps2.begin(); + TOctagonal_Shape osi2 = i2->element(); + 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(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 pps(ph); + // With the polynomial complexity, implied equalities are not found. + Pointset_Powerset pps1(ph1, POLYNOMIAL_COMPLEXITY); + + Pointset_Powerset known_pps(4); + known_pps.add_constraint(x == 2); + known_pps.add_constraint(z == 1); + Pointset_Powerset known_pps1(4); + known_pps1.add_constraint(x >= 2); + known_pps1.add_constraint(z >= 1); + + bool ok = (pps == known_pps && pps1 == known_pps1); + + Pointset_Powerset::const_iterator i = pps.begin(); + TBox boxi = i->element(); + print_constraints(boxi, "*** boxi ***"); + Pointset_Powerset::const_iterator i1 = pps1.begin(); + TBox boxi1 = i1->element(); + print_constraints(boxi1, "*** boxi1 ***"); + + 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(z >= 1); + ph.add_constraint(x + z <= 2); + + // NOTE: taking a copy of ph so that ph1 is not affected by + // the construction of pps (which minimizes ph and detects emptiness). + C_Polyhedron ph1(ph); + + // With the default complexity, the built powerset is empty. + Pointset_Powerset pps(ph); + // With the polynomial complexity, the built powerset is non-empty. + Pointset_Powerset pps1(ph1, POLYNOMIAL_COMPLEXITY); + + Pointset_Powerset known_pps(4, EMPTY); + Pointset_Powerset known_pps1(4); + known_pps1.add_constraint(x >= 2); + known_pps1.add_constraint(z >= 1); + + bool ok = (pps == known_pps && pps1 == known_pps1); + + if (ok) { + // Here it is safe to dereference pps1.begin(). + Pointset_Powerset::const_iterator i1 = pps1.begin(); + TBox boxi1 = i1->element(); + print_constraints(boxi1, "*** boxi1 ***"); + } + + 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 pps(ph); + + Pointset_Powerset 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 pps1_c(ph1, POLYNOMIAL_COMPLEXITY); + Pointset_Powerset pps2_c(ph2); + + Pointset_Powerset pps1(pps1_c, POLYNOMIAL_COMPLEXITY); + Pointset_Powerset pps2(pps2_c); + + Pointset_Powerset known_pps1(2); + known_pps1.add_constraint(2*x >= 1); + known_pps1.add_constraint(y >= 0); + Pointset_Powerset 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::const_iterator i1 = pps1.begin(); + TBox boxi1 = i1->element(); + print_constraints(boxi1, "*** boxi1 ***"); + + Pointset_Powerset::const_iterator i2 = pps2.begin(); + TBox boxi2 = i2->element(); + print_constraints(boxi2, "*** boxi2 ***"); + + 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 pps(ph); + // With the polynomial complexity, no implied equalities are found. + Pointset_Powerset pps1(ph1, POLYNOMIAL_COMPLEXITY); + + Pointset_Powerset known_pps(4); + known_pps.add_congruence((x %= 2) / 0); + known_pps.add_congruence((z %= 1) / 0); + Pointset_Powerset known_pps1(4); + + bool ok = (pps == known_pps && pps1 == known_pps1); + + Pointset_Powerset::const_iterator i = pps.begin(); + Grid gri = i->element(); + print_congruences(gri, "*** gri ***"); + Pointset_Powerset::const_iterator i1 = pps1.begin(); + Grid gri1 = i1->element(); + 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(4); + ph1.add_constraint(x >= 2); + ph1.add_constraint(z >= 1); + ph1.add_constraint(x + z <= 2); + + // With the default complexity, the built powerset is empty. + Pointset_Powerset pps(ph); + // With the polynomial complexity, the built powerset is the universe. + Pointset_Powerset pps1(ph1, POLYNOMIAL_COMPLEXITY); + + Pointset_Powerset known_pps(4, EMPTY); + Pointset_Powerset known_pps1(4); + + bool ok = (pps == known_pps && pps1 == known_pps1); + + Pointset_Powerset::const_iterator i1 = pps1.begin(); + Grid gri1 = i1->element(); + 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 pps(ph); + + Pointset_Powerset 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 pps1_c(ph1, POLYNOMIAL_COMPLEXITY); + Pointset_Powerset pps2_c(ph2); + + Pointset_Powerset pps1(pps1_c, POLYNOMIAL_COMPLEXITY); + Pointset_Powerset pps2(pps2_c); + + Pointset_Powerset known_pps1(2); + Pointset_Powerset 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::const_iterator i1 = pps1.begin(); + Grid gri1 = i1->element(); + print_congruences(gri1, "*** gri1 ***"); + + Pointset_Powerset::const_iterator i2 = pps2.begin(); + Grid gri2 = i2->element(); + 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..e211f97 --- /dev/null +++ b/tests/Powerset/fromspacedimension1.cc @@ -0,0 +1,101 @@ +/* Test Pointset_Powerset:: + Pointset_Powerset(dimension_type, Degenerate_Element). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Pointset_Powerset ps(0, EMPTY); + + bool ok = (ps.OK() && ps.is_empty() && ps.space_dimension() == 0); + + return ok; +} + +bool +test02() { + Pointset_Powerset ps(0, UNIVERSE); + + bool ok = (ps.OK() && ps.is_universe() && ps.space_dimension() == 0); + + return ok; +} + +bool +test03() { + Pointset_Powerset ps(4, EMPTY); + + bool ok = (ps.OK() && ps.is_empty() && ps.space_dimension() == 4); + + return ok; +} + +bool +test04() { + Pointset_Powerset ps(4, UNIVERSE); + + bool ok = (ps.OK() && ps.is_universe() && ps.space_dimension() == 4); + + return ok; +} + +bool +test05() { + Pointset_Powerset 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 ps(cs); + + print_constraints(ps, "*** ps ***"); + + return ps.OK(); +} + +bool +test07() { + Pointset_Powerset 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..6ba6a2a --- /dev/null +++ b/tests/Powerset/intersection1.cc @@ -0,0 +1,103 @@ +/* Test Pointset_Powerset::intersection_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of C polyhedra: intersection_assign(). +bool +test01() { + Variable x(0); + Pointset_Powerset 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_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_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_and_minimize(). +bool +test02() { + Variable x(0); + Pointset_Powerset 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_ps1(1, EMPTY); + + cs.clear(); + cs.insert(x >= 1); + cs.insert(x <= 3); + c_ps1.add_disjunct(C_Polyhedron(cs)); + + bool ok = c_ps.intersection_assign_and_minimize(c_ps1); + + cs.clear(); + cs.insert(x >= 1); + cs.insert(x <= 2); + Pointset_Powerset 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_ps2(1, EMPTY); + cs.clear(); + cs.insert(x == 4); + c_ps2.add_disjunct(C_Polyhedron(cs)); + + bool ok3 = !c_ps2.intersection_assign_and_minimize(c_ps1); + + 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..b1a351f --- /dev/null +++ b/tests/Powerset/maxmin1.cc @@ -0,0 +1,396 @@ +/* Test Pointset_Powerset::maximize(). + Pointset_Powerset::minimize(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of C polyhedra: maximize(). +bool +test01() { + Pointset_Powerset ps(0, EMPTY); + Coefficient num; + Coefficient den; + bool included; + Generator g(point()); + Linear_Expression LE; + bool ok = ps.maximize(LE, num, den, included) + && num == 0 && den == 1 && !included; + ok = ok && ps.maximize(LE, num, den, included, g) + && num == 0 && den == 1 && !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; + Coefficient max_d; + bool max_included; + Generator max_g(point()); + Pointset_Powerset 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; + Coefficient den; + bool included; + Generator g(point()); + Pointset_Powerset 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; + Coefficient den; + bool included; + Generator g(point()); + Pointset_Powerset ps(1, EMPTY); + + bool ok = ps.maximize(LE, num, den, included) + && num == 0 && den == 1 && !included; + ok = ok && ps.maximize(LE, num, den, included, g) + && num == 0 && den == 1 && !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); + + return ok; +} + +// Powerset of C polyhedra: minimize(). +bool +test05() { + Linear_Expression LE; + Coefficient num; + Coefficient den; + bool included; + Generator g(point()); + Pointset_Powerset ps(0, EMPTY); + + bool 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; + + 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; + Coefficient min_d; + bool min_included; + Generator min_g(point()); + + Pointset_Powerset 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; + Coefficient den; + bool included; + Generator g(point()); + Pointset_Powerset 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; + Coefficient den; + bool included; + Generator g(point()); + Pointset_Powerset ps(1, EMPTY); + + bool 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; + + + if (!ok) + return false; + + ps.add_disjunct(C_Polyhedron(1)); + ok = !ps.minimize(LE, num, den, included, g); + + 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..9706f16 --- /dev/null +++ b/tests/Powerset/meet1.cc @@ -0,0 +1,94 @@ +/* Test Pointset_Powerset::meet_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of C polyhedra: meet_assign(). +bool +test01() { + Variable x(0); + Pointset_Powerset 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_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_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 pps_box(1, EMPTY); + Constraint_System cs; + + cs.insert(x >= 0); + cs.insert(x <= 2); + pps_box.add_disjunct(TBox(cs)); + + Pointset_Powerset 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 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..b3c2142 --- /dev/null +++ b/tests/Powerset/membytes1.cc @@ -0,0 +1,68 @@ +/* Test Pointset_Powerset::total_memory_in_bytes(). + Pointset_Powerset::external_memory_in_bytes(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of C polyhedra: total_memory_in_bytes() and +// external_memory_in_bytes(). +bool +test01() { + Pointset_Powerset 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 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..8cc7b34 --- /dev/null +++ b/tests/Powerset/powerset1.cc @@ -0,0 +1,177 @@ +/* Test Powerset. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Uses every public Powerset method. +bool +test01() { + typedef Powerset PS; + + Variable A(0); + + PS ps1; + ps1.add_disjunct(FCAIBVP(A)); + + PS ps2 = ps1; + + if (ps2 != ps1 || !(ps2 == ps1)) + return false; + + using IO_Operators::operator<<; + nout << "ps1:" << endl << ps1 << endl; + + FCAIBVP d(A); + PS 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 (PS::iterator i = ps3.begin(); i != ps3.end(); ++i) + ++count; + if (count != 1) + return false; + + // Constant iterator. + count = 0; + for (PS::const_iterator i = ps3.begin(); i != ps3.end(); ++i) + ++count; + if (count != 1) + return false; + + // Reverse iterator. + count = 0; + for (PS::reverse_iterator i = ps3.rbegin(); i != ps3.rend(); ++i) + ++count; + if (count != 1) + return false; + + // Constant reverse iterator. + count = 0; + for (PS::const_reverse_iterator i = ps3.rbegin(), + ps3_rend = ps3.rend(); i != ps3_rend; ++i) + ++count; + if (count != 1) + return false; + + ps2 = ps3; + PS 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; + + ps3.swap(ps2); + ps3.swap(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 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 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..00cbfdc --- /dev/null +++ b/tests/Powerset/reduce1.cc @@ -0,0 +1,80 @@ +/* Test Pointset_Powerset::omega_reduce(). + Pointset_Powerset::pairwise_reduce(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of polyhedra: omega_reduce(). +bool +test01() { + Variable x(0); + Pointset_Powerset 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 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..d8fad83 --- /dev/null +++ b/tests/Powerset/refinewith1.cc @@ -0,0 +1,224 @@ +/* Test Pointset_Powerset::refine_with_constraint(). + Pointset_Powerset::refine_with_constraints(). + Pointset_Powerset::refine_with_congruence(). + Pointset_Powerset::refine_with_congruences(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// 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 pps(4, EMPTY); + + pps.add_disjunct(ph1); + pps.add_disjunct(ph2); + + Pointset_Powerset 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::const_iterator i = pps.begin(); + C_Polyhedron phi = i->element(); + print_constraints(phi, "*** phi ***"); + i++; + C_Polyhedron phi1 = i->element(); + 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 pps(4, EMPTY); + + pps.add_disjunct(ph1); + pps.add_disjunct(ph2); + + Pointset_Powerset 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::const_iterator i = pps.begin(); + C_Polyhedron phi = i->element(); + 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 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 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 pps(4, EMPTY); + + pps.add_disjunct(ph1); + pps.add_disjunct(ph2); + + Pointset_Powerset 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::const_iterator i = pps.begin(); + NNC_Polyhedron phi = i->element(); + print_constraints(phi, "*** phi ***"); + i++; + NNC_Polyhedron phi1 = i->element(); + 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..0a97e02 --- /dev/null +++ b/tests/Powerset/relationwith1.cc @@ -0,0 +1,277 @@ +/* Test Pointset_Powerset::relation_with(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of C polyhedra: relation_with(). +bool +test01() { + Variable x(0); + Constraint c = (x == 0); + Pointset_Powerset 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 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 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 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 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 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 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 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 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 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..4863e6f --- /dev/null +++ b/tests/Powerset/simplifyusingcontext1.cc @@ -0,0 +1,458 @@ +/* Test Pointset_Powerset::simplify_using_context_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +bool +test01() { + Variable i(0); + Variable j(1); + Variable k(2); + + C_Polyhedron ph(3, EMPTY); + Pointset_Powerset ps1(3, EMPTY); + Pointset_Powerset 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 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 ps1(3, EMPTY); + Pointset_Powerset 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 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 ps1(3, EMPTY); + Pointset_Powerset 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 known_result(3, EMPTY); + + ps1.simplify_using_context_assign(ps2); + + bool ok = (ps1 == known_result); + + for (Pointset_Powerset::const_iterator it = ps1.begin(), + ps1_end = ps1.end(); it != ps1_end; ++it) + print_constraints(it->element()); + + return ok; +} + +bool +test04() { + Variable i(0); + Variable j(1); + Variable k(2); + + C_Polyhedron ph(3, EMPTY); + Pointset_Powerset ps1(3, EMPTY); + Pointset_Powerset 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 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::const_iterator it = ps1.begin(), + ps1_end = ps1.end(); it != ps1_end; ++it) + print_constraints(it->element()); + + return ok; +} + +bool +test05() { + Variable i(0); + Variable j(1); + Variable k(2); + + C_Polyhedron ph(3, EMPTY); + Pointset_Powerset ps1(3, EMPTY); + Pointset_Powerset 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 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::const_iterator it = ps1.begin(), + ps1_end = ps1.end(); it != ps1_end; ++it) + print_constraints(it->element()); + + return ok; +} + +bool +test06() { + Variable i(0); + Variable j(1); + Variable k(2); + + C_Polyhedron ph(3, EMPTY); + Pointset_Powerset ps1(3, EMPTY); + Pointset_Powerset 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 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::const_iterator it = ps1.begin(), + ps1_end = ps1.end(); it != ps1_end; ++it) + print_constraints(it->element()); + + return ok; +} + +bool +test07() { + Variable i(0); + Variable j(1); + + C_Polyhedron ph(2, EMPTY); + Pointset_Powerset ps1(2, EMPTY); + Pointset_Powerset 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 known_result(2, UNIVERSE); + + ps1.simplify_using_context_assign(ps2); + + bool ok = (ps1 == known_result); + + for (Pointset_Powerset::const_iterator it = ps1.begin(), + ps1_end = ps1.end(); it != ps1_end; ++it) + print_constraints(it->element()); + + return ok; +} + +bool +test08() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2, EMPTY); + Pointset_Powerset ps1(2, EMPTY); + Pointset_Powerset 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 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::const_iterator i = ps1.begin(), + iend = ps1.end(); i != iend; ++i) + print_constraints(i->element()); + + return ok; +} + +bool +test09() { + Variable A(0); + Variable B(1); + + C_Polyhedron ph(2, EMPTY); + Pointset_Powerset ps1(2, EMPTY); + Pointset_Powerset 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::const_iterator i = ps1.begin(), + iend = ps1.end(); i != iend; ++i) { + print_constraints(i->element()); + 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::const_iterator i = ps2.begin(), + iend = ps2.end(); i != iend; ++i) { + print_constraints(i->element()); + nout << "\n"; + } + + Pointset_Powerset known_result(ps1); + + ps1.simplify_using_context_assign(ps2); + + bool ok = (ps1 == known_result); + + for (Pointset_Powerset::const_iterator i = ps1.begin(), + iend = ps1.end(); i != iend; ++i) { + print_constraints(i->element()); + 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_F8A(test09); +END_MAIN diff --git a/tests/Powerset/size1.cc b/tests/Powerset/size1.cc new file mode 100644 index 0000000..9e650f2 --- /dev/null +++ b/tests/Powerset/size1.cc @@ -0,0 +1,74 @@ +/* Test Pointset_Powerset::size(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of C polyhedra: size(). +bool +test01() { + Variable x(0); + Pointset_Powerset 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 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..df0ccbc --- /dev/null +++ b/tests/Powerset/spacedims1.cc @@ -0,0 +1,212 @@ +/* Test Pointset_Powerset::add_space_dimensions(), + Pointset_Powerset::remove_higher_space_dimensions(), + Pointset_Powerset::remove_space_dimensions(), + Pointset_Powerset::expand_space_dimensions(), + Pointset_Powerset::fold_space_dimensions(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// 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 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 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 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 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 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 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 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 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 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..6b160ff --- /dev/null +++ b/tests/Powerset/universe1.cc @@ -0,0 +1,103 @@ +/* Test Pointset_Powerset::is_universe(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of C polyhedra: is_universe(). +bool +test01() { + Pointset_Powerset 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 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 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 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..c340e36 --- /dev/null +++ b/tests/Powerset/upperbound1.cc @@ -0,0 +1,163 @@ +/* Test Pointset_Powerset::upper_bound_assign(), + Pointset_Powerset::least_upper_bound_assign(). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" + +namespace { + +// Powerset of C polyhedra: least_upper_bound_assign(). +bool +test01() { + Variable x(0); + Pointset_Powerset 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_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_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_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_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_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 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 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 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 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 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 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..e1eaca7 --- /dev/null +++ b/tests/README @@ -0,0 +1,115 @@ +Copyright (C) 2001-2009 Roberto Bagnara +See below for the copying conditions. + +How To Use the Test Programs (If You Really Want To Use Them) +============================================================= + +The programs in this directory are part of the test suite of the Parma +Polyhedra Library (PPL). They have various origins: + +1) some have been written to test the expressivity of the library; +2) some have been written to reproduce bugs that have now been fixed; +3) some have been written in order to increase the proportion of the + library's code exercised by test suite. + +Regardless of their origin, they are only used for the regression +testing of the library. For this reason, we do not pay much attention +to them; we simply keep adding new tests to the test suite and, once +in, they stay there forever. Despite any defects, they serve this +purpose well. + +On the other hand, in order to get an idea of how to use the PPL, +several new users have found it convenient to take one of these test +programs, change it a bit, and then try to compile it. If you want to +do something similar, here is some advice that may help you get +something working and completely self-contained in a matter of +minutes: + +a) Replace the line + + #include "ppl_test.hh" + + with + + #include + +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-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.2 or +any later version published by the Free Software Foundation; with no +Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. +The license is included, in various formats, in the `doc' subdirectory +of each distribution of the PPL in files called `fdl.*'. + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 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 are called `gpl.*'. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +If you have not received a copy of one or both the above mentioned +licenses along with the PPL, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . diff --git a/tests/Random_Number_Generator.defs.hh b/tests/Random_Number_Generator.defs.hh new file mode 100644 index 0000000..3784792 --- /dev/null +++ b/tests/Random_Number_Generator.defs.hh @@ -0,0 +1,46 @@ +/* Random_Number_Generator class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Random_Number_Generator_defs_hh +#define PPL_Random_Number_Generator_defs_hh 1 + +namespace Parma_Polyhedra_Library { + +class Random_Number_Generator { +public: + Random_Number_Generator(); + + explicit Random_Number_Generator(unsigned long seed); + + template + 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..fc41416 --- /dev/null +++ b/tests/Random_Number_Generator.inlines.hh @@ -0,0 +1,92 @@ +/* Random_Number_Generator class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_Random_Number_Generator_inlines_hh +#define PPL_Random_Number_Generator_inlines_hh 1 + +#include + +namespace Parma_Polyhedra_Library { + +namespace Implementation { +namespace Random_Numbers { + +template +class Random_Number_Generator_Aux { +public: + Random_Number_Generator_Aux(unsigned int max_bits) { + if (std::numeric_limits::is_bounded) { + assign_r(zmin, std::numeric_limits::min(), ROUND_NOT_NEEDED); + assign_r(zrange, std::numeric_limits::max(), ROUND_NOT_NEEDED); + zrange -= zmin; + ++zrange; + } + else if (std::numeric_limits::is_signed) { + zmin = 1; + zmin <<= (max_bits - 1); + zmin = -zmin; + } + else { + assign_r(zmin, std::numeric_limits::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 +inline void +Random_Number_Generator::get(T& x, unsigned int info) { + using Implementation::Random_Numbers::Random_Number_Generator_Aux; + used(info); + static Random_Number_Generator_Aux aux(max_bits); + mpz_class n; + if (std::numeric_limits::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..4db552d --- /dev/null +++ b/tests/Random_Number_Generator.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PPL_Random_Number_Generator_types_hh +#define PPL_Random_Number_Generator_types_hh 1 + +namespace Parma_Polyhedra_Library { + +class Random_Number_Generator; + +} + +#endif // !defined(PPL_Random_Number_Generator_types_hh) diff --git a/tests/files.cc b/tests/files.cc new file mode 100644 index 0000000..6605fb2 --- /dev/null +++ b/tests/files.cc @@ -0,0 +1,50 @@ +/* Definition of simple helper functions to open and close files. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "files.hh" +#include +#include +#include + +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..1cb6bb9 --- /dev/null +++ b/tests/files.hh @@ -0,0 +1,35 @@ +/* Declaration of simple helper functions to open and close files. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_files_hh +#define PPL_files_hh 1 + +#include +#include + +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..04a5047 --- /dev/null +++ b/tests/ppl_test.cc @@ -0,0 +1,429 @@ +/* Implementation of utility functions used in test programs. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "ppl_test.hh" +#include +#include +#include +#include +#ifdef PPL_HAVE_FENV_H +#include +#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); +} + +#ifdef HAVE_SIGINFO_T +void +fpe_handler(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(PWL_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 + } + exit(1); +} +#endif // defined(HAVE_SIGINFO_T) + +} // namespace + +namespace Parma_Polyhedra_Library { + +namespace Test { + +void +set_handlers() { +#ifdef HAVE_SIGINFO_T + struct sigaction action; + action.sa_sigaction = fpe_handler; + sigemptyset(&action.sa_mask); + action.sa_flags = SA_SIGINFO; + if (sigaction(SIGFPE, &action, NULL) != 0) { + std::cerr << "sigaction() failed" + << std::endl; + abort(); + } +#endif // defined(HAVE_SIGINFO_T) + + std::set_unexpected(unexpected_exception_handler); + std::set_terminate(uncaught_exception_handler); +} + +bool +check_distance(const Checked_Number& d, + const char* max_d_s, const char* d_name) { + Checked_Number + 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::max()) + nout << ">" << std::numeric_limits::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& computed_result, + const BD_Shape& 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 r_d; + rectilinear_distance_assign(r_d, known_result, computed_result, ROUND_UP); + Checked_Number e_d; + euclidean_distance_assign(e_d, known_result, computed_result, ROUND_UP); + Checked_Number 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& computed, + const Checked_Number& 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 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 = Variable(*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); +} + +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::Test::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..4ee3370 --- /dev/null +++ b/tests/ppl_test.hh @@ -0,0 +1,1186 @@ +/* Header file for test programs. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_ppl_test_hh +#define PPL_ppl_test_hh 1 + +#include "ppl_header.hh" +#include "Partial_Function.defs.hh" +#include "Random_Number_Generator.defs.hh" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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; \ + std::list failed_tests; + +#define END_MAIN \ + if (failed_tests.empty()) \ + return 0; \ + else { \ + std::cerr << "failed tests: "; \ + std::copy(failed_tests.begin(), failed_tests.end(), \ + std::ostream_iterator(std::cerr, " ")); \ + std::cerr << std::endl; \ + return 1; \ + } \ +} \ +catch (const std::overflow_error& e) { \ + std::cerr << "arithmetic overflow (" << e.what() << ")" \ + << std::endl; \ + exit(1); \ +} \ +catch (const std::exception& e) { \ + std::cerr << "std::exception caught: " \ + << e.what() << " (type == " << typeid(e).name() << ")" \ + << std::endl; \ + exit(1); \ +} + +#define ANNOUNCE_TEST(test) \ + nout << "\n=== " #test " ===" << 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) \ + failed_tests.push_back(#test); + +#define DO_TEST_OVERFLOW(test) \ + ANNOUNCE_TEST(test); \ + RUN_TEST(test); \ + if (succeeded || !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); + +#if PPL_COEFFICIENT_BITS == 0 + +#define DO_TEST_F64(test) DO_TEST(test) +#define DO_TEST_F64A(test) DO_TEST(test) +#define DO_TEST_F32(test) DO_TEST(test) +#define DO_TEST_F32A(test) DO_TEST(test) +#define DO_TEST_F16(test) DO_TEST(test) +#define DO_TEST_F16A(test) DO_TEST(test) +#define DO_TEST_F8(test) DO_TEST(test) +#define DO_TEST_F8A(test) DO_TEST(test) + +#define DO_TEST_F64_MAY_OVERFLOW_IF_INEXACT(test, shape) DO_TEST(test) +#define DO_TEST_F64A_MAY_OVERFLOW_IF_INEXACT(test, shape) DO_TEST(test) +#define DO_TEST_F32_MAY_OVERFLOW_IF_INEXACT(test, shape) DO_TEST(test) +#define DO_TEST_F32A_MAY_OVERFLOW_IF_INEXACT(test, shape) DO_TEST(test) +#define DO_TEST_F16_MAY_OVERFLOW_IF_INEXACT(test, shape) DO_TEST(test) +#define DO_TEST_F16A_MAY_OVERFLOW_IF_INEXACT(test, shape) DO_TEST(test) +#define DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT(test, shape) DO_TEST(test) +#define DO_TEST_F8A_MAY_OVERFLOW_IF_INEXACT(test, shape) DO_TEST(test) + +#elif PPL_COEFFICIENT_BITS == 64 + +#ifdef NDEBUG + +#define DO_TEST_F64(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F64A(test) DO_TEST(test) +#define DO_TEST_F32(test) DO_TEST(test) +#define DO_TEST_F32A(test) DO_TEST(test) +#define DO_TEST_F16(test) DO_TEST(test) +#define DO_TEST_F16A(test) DO_TEST(test) +#define DO_TEST_F8(test) DO_TEST(test) +#define DO_TEST_F8A(test) DO_TEST(test) + +#define DO_TEST_F64_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F64A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) +#define DO_TEST_F32_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) +#define DO_TEST_F32A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) +#define DO_TEST_F16_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) +#define DO_TEST_F16A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) +#define DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) +#define DO_TEST_F8A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) + +#else // PPL_COEFFICIENT_BITS == 64 && !defined(NDEBUG) + +#define DO_TEST_F64(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F64A(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F32(test) DO_TEST(test) +#define DO_TEST_F32A(test) DO_TEST(test) +#define DO_TEST_F16(test) DO_TEST(test) +#define DO_TEST_F16A(test) DO_TEST(test) +#define DO_TEST_F8(test) DO_TEST(test) +#define DO_TEST_F8A(test) DO_TEST(test) + +#define DO_TEST_F64_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F64A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F32_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) +#define DO_TEST_F32A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) +#define DO_TEST_F16_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) +#define DO_TEST_F16A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) +#define DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) +#define DO_TEST_F8A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) + +#endif // !defined(NDEBUG) + +#elif PPL_COEFFICIENT_BITS == 32 + +#ifdef NDEBUG + +#define DO_TEST_F64(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F64A(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F32(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F32A(test) DO_TEST(test) +#define DO_TEST_F16(test) DO_TEST(test) +#define DO_TEST_F16A(test) DO_TEST(test) +#define DO_TEST_F8(test) DO_TEST(test) +#define DO_TEST_F8A(test) DO_TEST(test) + +#define DO_TEST_F64_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F64A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F32_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F32A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) +#define DO_TEST_F16_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) +#define DO_TEST_F16A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) +#define DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) +#define DO_TEST_F8A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) + +#else // PPL_COEFFICIENT_BITS == 32 && !defined(NDEBUG) + +#define DO_TEST_F64(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F64A(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F32(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F32A(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F16(test) DO_TEST(test) +#define DO_TEST_F16A(test) DO_TEST(test) +#define DO_TEST_F8(test) DO_TEST(test) +#define DO_TEST_F8A(test) DO_TEST(test) + +#define DO_TEST_F64_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F64A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F32_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F32A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F16_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) +#define DO_TEST_F16A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) +#define DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) +#define DO_TEST_F8A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) + +#endif // !defined(NDEBUG) + +#elif PPL_COEFFICIENT_BITS == 16 + +#ifdef NDEBUG + +#define DO_TEST_F64(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F64A(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F32(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F32A(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F16(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F16A(test) DO_TEST(test) +#define DO_TEST_F8(test) DO_TEST(test) +#define DO_TEST_F8A(test) DO_TEST(test) + +#define DO_TEST_F64_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F64A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F32_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F32A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F16_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F16A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) +#define DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) +#define DO_TEST_F8A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) + +#else // PPL_COEFFICIENT_BITS == 16 && !defined(NDEBUG) + +#define DO_TEST_F64(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F64A(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F32(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F32A(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F16(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F16A(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F8(test) DO_TEST(test) +#define DO_TEST_F8A(test) DO_TEST(test) + +#define DO_TEST_F64_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F64A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F32_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F32A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F16_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F16A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) +#define DO_TEST_F8A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) + +#endif // !defined(NDEBUG) + +#elif PPL_COEFFICIENT_BITS == 8 + +#ifdef NDEBUG + +#define DO_TEST_F64(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F64A(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F32(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F32A(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F16(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F16A(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F8(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F8A(test) DO_TEST(test) + +#define DO_TEST_F64_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F64A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F32_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F32A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F16_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F16A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F8A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape) + +#else // PPL_COEFFICIENT_BITS == 8 && !defined(NDEBUG) + +#define DO_TEST_F64(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F64A(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F32(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F32A(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F16(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F16A(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F8(test) DO_TEST_OVERFLOW(test) +#define DO_TEST_F8A(test) DO_TEST_OVERFLOW(test) + +#define DO_TEST_F64_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F64A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F32_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F32A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F16_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F16A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) +#define DO_TEST_F8A_MAY_OVERFLOW_IF_INEXACT(test, shape) \ + DO_TEST_OVERFLOW(test) + +#endif // !defined(NDEBUG) + +#endif // PPL_COEFFICIENT_BITS == 8 + + +// Turn s into a string: PPL_TEST_STR(x + y) => "x + y". +#define PPL_TEST_STR(s) #s + +// Turn the expansion of s into a string: PPL_TEST_XSTR(x) => "s expanded". +#define PPL_TEST_XSTR(s) PPL_TEST_STR(s) + + +#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 + +// 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; + +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 +} + +template > +class nullbuf : public std::basic_streambuf { +protected: + virtual typename Traits::int_type overflow(typename Traits::int_type c) { + return Traits::not_eof(c); + } +}; + +template > +class noisy_ostream : public std::basic_ostream { +private: + nullbuf black_hole; + +public: + noisy_ostream(const std::basic_ostream& os, + const char* environment_variable) + : std::basic_ostream(check_noisy(environment_variable) + ? os.rdbuf() + : &black_hole) { + } +}; + +static noisy_ostream nout(std::cout, "PPL_NOISY_TESTS"); +static noisy_ostream 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); +}; + +typedef Interval_Restriction_None + > +Floating_Real_Open_Interval_Info; + +typedef Interval fl_r_oc; +typedef Interval db_r_oc; +typedef Interval 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_Restriction_None + > +Rational_Real_Open_Interval_Info; + +typedef Interval rt_r_oc; + +//! The incarnation of Box under test. +typedef Box TBox; + +//! The incarnation of BD_Shape under test. +typedef BD_Shape TBD_Shape; + +//! The incarnation of Octagonal_Shape under test. +typedef Octagonal_Shape TOctagonal_Shape; + +template +inline bool +has_exact_coefficient_type(const Shape&) { + return std::numeric_limits::is_exact; +} + +template +inline bool +has_exact_coefficient_type(const Box&) { + return std::numeric_limits::is_exact; +} + +bool +check_distance(const Checked_Number& d, + const char* max_d_s, const char* d_name); + +template +bool +check_result_i(const BD_Shape& computed_result, + const BD_Shape& known_result, + const char* max_r_d_s, + const char* max_e_d_s, + const char* max_l_d_s) { + BD_Shape 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 + << 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 + << endl; + return false; + } + + Checked_Number r_d; + rectilinear_distance_assign(r_d, known_result, q_computed_result, ROUND_UP); + Checked_Number e_d; + euclidean_distance_assign(e_d, known_result, q_computed_result, ROUND_UP); + Checked_Number 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 + << endl; + } + return ok; +} + +template +bool +check_result(const BD_Shape& computed_result, + const BD_Shape& known_result, + const char* max_r_d_s, + const char* max_e_d_s, + const char* max_l_d_s) { + return std::numeric_limits::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 +bool +check_result(const BD_Shape& computed_result, + const BD_Shape& 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; + } +} + +template +bool +check_result(const BD_Shape& computed_result, + const BD_Shape& known_result) { + return std::numeric_limits::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& computed_result, + const BD_Shape& known_result); + +template +bool +check_result_i(const Octagonal_Shape& computed_result, + const Octagonal_Shape& known_result, + const char* max_r_d_s, + const char* max_e_d_s, + const char* max_l_d_s) { + Octagonal_Shape 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 + << 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 + << endl; + return false; + } + + Checked_Number r_d; + rectilinear_distance_assign(r_d, known_result, q_computed_result, ROUND_UP); + Checked_Number e_d; + euclidean_distance_assign(e_d, known_result, q_computed_result, ROUND_UP); + Checked_Number 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 + << endl; + } + return ok; +} + +template +bool +check_result(const Octagonal_Shape& computed_result, + const Octagonal_Shape& known_result, + const char* max_r_d_s, + const char* max_e_d_s, + const char* max_l_d_s) { + return std::numeric_limits::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& computed_result, + const Octagonal_Shape& known_result, + const char*, + const char*, + const char*) { + return check_result_i(computed_result, known_result, + 0, 0, 0); +} + +template +bool +check_result(const Octagonal_Shape& computed_result, + const Octagonal_Shape& known_result) { + return std::numeric_limits::is_integer + ? check_result_i(computed_result, known_result, "+inf", "+inf", "+inf") + : check_result_i(computed_result, known_result, 0, 0, 0); +} + + +template +bool +check_result_i(const Box& 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 + << 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 + << 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)) + << endl; + } + } + return false; + } + + Checked_Number r_d; + rectilinear_distance_assign(r_d, known_result, q_computed_result, ROUND_UP); + Checked_Number e_d; + euclidean_distance_assign(e_d, known_result, q_computed_result, ROUND_UP); + Checked_Number 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 + << endl; + } + return ok; +} + +template +bool +check_result(const Box& 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::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 +bool +check_result(const Box& computed_result, + const 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; + } +} + +template +bool +check_result(const Box& computed_result, + const Rational_Box& known_result) { + return std::numeric_limits::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& computed, + const Checked_Number& 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 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())); + std::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())); + std::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); + +template +void +print_constraints(const Box& 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 +void +print_constraints(const BD_Shape& 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 +void +print_constraints(const Octagonal_Shape& 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 +void +print_constraints(const Pointset_Powerset& 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 +void +print_congruences(const Pointset_Powerset& 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 +void +print_constraints(const Pointset_Ask_Tell& 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 +void +print_constraints(const Partially_Reduced_Product& pd, + const std::string& intro = "", + std::ostream& s = nout) { + print_constraints(pd.constraints(), intro, s); +} + +template +void +print_congruences(const Partially_Reduced_Product& pd, + const std::string& intro = "", + std::ostream& s = nout) { + print_congruences(pd.congruences(), intro, s); +} + +void +print_function(const Parma_Polyhedra_Library::Test::Partial_Function& function, + const std::string& intro = "", + std::ostream& s = nout); + +} // namespace Test + +} // namespace Parma_Polyhedra_Library + +#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..95c5058 --- /dev/null +++ b/utils/Makefile.am @@ -0,0 +1,60 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +AM_CPPFLAGS = @extra_includes@ + +noinst_LIBRARIES = libppl_utils.a +libppl_utils_a_SOURCES = \ +timings.hh \ +timings.cc + +dist_noinst_SCRIPTS = \ +build_header.in \ +text2cxxarray.in \ +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..a129d7b --- /dev/null +++ b/utils/Makefile.in @@ -0,0 +1,601 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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 = $(dist_noinst_SCRIPTS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +libppl_utils_a_AR = $(AR) $(ARFLAGS) +libppl_utils_a_LIBADD = +am_libppl_utils_a_OBJECTS = timings.$(OBJEXT) +libppl_utils_a_OBJECTS = $(am_libppl_utils_a_OBJECTS) +SCRIPTS = $(dist_noinst_SCRIPTS) $(noinst_SCRIPTS) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libppl_utils_a_SOURCES) +DIST_SOURCES = $(libppl_utils_a_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign utils/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign utils/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +libppl_utils.a: $(libppl_utils_a_OBJECTS) $(libppl_utils_a_DEPENDENCIES) + -rm -f libppl_utils.a + $(libppl_utils_a_AR) libppl_utils.a $(libppl_utils_a_OBJECTS) $(libppl_utils_a_LIBADD) + $(RANLIB) libppl_utils.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timings.Po@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) $(SCRIPTS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +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 + +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 all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES ctags dist-hook distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-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 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..9a5d353 --- /dev/null +++ b/utils/build_header.in @@ -0,0 +1,102 @@ +#! @PERL@ +# -*- Perl -*- +# @generated_automatically@ + +eval 'case $# in 0) exec @PERL@ -S "$0";; *) exec @PERL@ -S "$0" "$@";; esac' + if 0; + +# Builds a self-contained C++ header file by performing recursive inclusion. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +use strict; +use warnings; +use Getopt::Long; + +sub filter($$$$); +sub filter($$$$) { + my ($file, $dirs, $level, $files) = @_; + return if (exists($$files{$file})); + $$files{$file} = undef; + my $fh; + open $fh, $file or die "Cannot open $file"; + my $comment = 0; + my $copyright = 0; + my $print_from = 1; + while (my $line = <$fh>) { + my $iname; + if (($iname) = ($line =~ '^\s*#include\s+"([^"]+)"\s*\n$')) { + my $lineno = $.; + my $ifile; + foreach my $idir (@$dirs) { + $ifile = $idir . '/' . $iname; + last if -e $ifile; + } + filter($ifile, $dirs, $level+1, $files); + $print_from = 1; + next; + } + if ($level > 0) { + if ($print_from) { + print "/* Automatically generated from PPL source file $file line $.. */\n"; + $print_from = 0; + } + next if ($line =~ '^\s*#ifndef\s+PPL_[A-Za-z0-9_]+_hh\s*$'); + next if ($line =~ '^\s*#define\s+PPL_[A-Za-z0-9_]+_hh(\s+1)?\s*$'); + next if ($line =~ '^\s*#endif\s*//\s*!defined\(PPL_[A-Za-z0-9_]+_hh\)\s*$'); + if ($line =~ '/\*') { + $comment = 1; + } + if ($comment && $line =~ 'Copyright.*Roberto Bagnara ') { + $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..8be8ae1 --- /dev/null +++ b/utils/cm_cleaner.sh @@ -0,0 +1,37 @@ +#!/bin/sh + +# Erases all files listed in the cutting markers found on stdin. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +CUTTING_MARKER_PREFIX="%<--%<--%<-- " + +while IFS= read -r line +do + case "$line" in + $CUTTING_MARKER_PREFIX*) + read dummy file < +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +CUTTING_MARKER_PREFIX="%<--%<--%<-- " + +open="false" + +while IFS= read -r line +do + case "$line" in + $CUTTING_MARKER_PREFIX*) + read dummy file <> "$file" + open="true" + ;; + *) + [ $open = "true" ] && echo "$line" >&3 + ;; + esac +done diff --git a/utils/text2cxxarray.in b/utils/text2cxxarray.in new file mode 100644 index 0000000..4cde7c2 --- /dev/null +++ b/utils/text2cxxarray.in @@ -0,0 +1,61 @@ +#! @PERL@ +# -*- Perl -*- +# @configure_input@ + +eval 'case $# in 0) exec @PERL@ -S "$0";; *) exec @PERL@ -S "$0" "$@";; esac' + if 0; + +# Convert an ASCII text into the declaration of a C++ array. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +use Getopt::Long; + +sub usage { + print STDERR < \$array_name, + 'help|h' => \&usage, +) || usage(); + +print "extern const char* const $array_name" . "[] = {\n"; +while (<>) { + chop; + s/\\/\\\\/g; + s/\t/\\t/g; + s/\"/\\"/g; + print " \"$_\",\n"; +} +print " 0"; +print "};\n"; diff --git a/utils/timings.cc b/utils/timings.cc new file mode 100644 index 0000000..399a533 --- /dev/null +++ b/utils/timings.cc @@ -0,0 +1,102 @@ +/* Definitions of simple functions for printing timings. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "timings.hh" +#include +#include +#include +#include +#include +#include +#include + +#ifdef PPL_HAVE_SYS_TIME_H +# include +#endif + +#ifdef PPL_HAVE_SYS_RESOURCE_H +// This should be included after and so as to make +// sure we have the definitions for, e.g., `ru_utime'. +# include +#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 defined(PPL_HAVE_DECL_GETRUSAGE) && defined(PPL_HAVE_TIMEVAL) + struct rusage rsg; + if (getrusage(RUSAGE_SELF, &rsg) != 0) { + cerr << "getrusage failed: " << strerror(errno) << endl; + exit(1); + } + else + saved_ru_utime = rsg.ru_utime; +#endif +} + +void +print_clock(ostream& s) { +#if defined(PPL_HAVE_DECL_GETRUSAGE) && defined(PPL_HAVE_TIMEVAL) + struct rusage rsg; + if (getrusage(RUSAGE_SELF, &rsg) != 0) { + cerr << "getrusage failed: " << strerror(errno) << endl; + exit(1); + } + else { + time_t current_secs = rsg.ru_utime.tv_sec; + time_t current_usecs = rsg.ru_utime.tv_usec; + time_t saved_secs = saved_ru_utime.tv_sec; + time_t saved_usecs = saved_ru_utime.tv_usec; + time_t secs; + time_t hsecs; + secs = current_secs - saved_secs; + if (current_usecs < saved_usecs) { + hsecs = (((1000000 + current_usecs) - saved_usecs) + 5000) / 10000; + if (hsecs < 100) + --secs; + else + hsecs = 0; + } + else { + hsecs = ((current_usecs - saved_usecs) + 5000) / 10000; + if (hsecs == 100) { + ++secs; + hsecs = 0; + } + } + assert(hsecs >= 0 && hsecs < 100 && secs >= 0); + int fill_char = s.fill(); + s << secs << "." << setfill('0') << setw(2) << hsecs; + 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..0613670 --- /dev/null +++ b/utils/timings.hh @@ -0,0 +1,31 @@ +/* Declaration of simple functions for printing timings. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PPL_timings_hh +#define PPL_timings_hh 1 + +#include + +void start_clock(); +void print_clock(std::ostream& s); + +#endif // !defined(PPL_timings_hh) -- 2.7.4

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Ì*P~JRXM%hbl2m zZ`vkjWRKdnGuJDCnYchVNbGoa<}p*v{(hCDgS9-^rULGXks>N#3kphGn6m?)R z0%Do#G3{4Wx>wnlr&Ew1a@?F|zxvX>%D}oRPLG=brI{QPYr47_P*{5U+zjYYozxR5 z$pe{0D68bjLMb96ItA$;kI!q&0?J^kyqM8tup@}wQRmvi7H}xIjLIV^F6b$`or4Tb z1TTdXcx9tk663+gQ4kPx&8=%{XRNad19?j~vBIXh`&8%-SEIy=QdhC=(KD~U;^0Rm zP*Bpl7>*Ov2|qS{!Z_hlc+o&)a#A*E1-s5?NqY^Wj|b;?=Bt?}C3)gTDK@b;N0P%D zbO}~W9h%jH+bew!vLm{uLE-iEOr2M@az;tck0YsIM4kA!+#A@KFa_6A9ofeEgSJ!B zX^!>W212|O6J+K&Kwp_0M1^PDYf`s9l>PF`xi7hq?6|mNSOtGz`o`>ca;AdKfuQ%~ z43#s7(5+}>X@ybhD(Ap?fvB2G?VF7l{lV}(axi9oq(R(!w*4km`}^(p%r;!16`FZR zZN5)RX^vkpERIq~0_>Cr3h2rru~74(P(mHsK6-=Z9cdxB3!#0){0N|+>Rt55>^l-Y zUb*xZL(3!6u-lLc+1w55Rw)ZLS9$PkClX*ZjLXJ&| z?EGT4TfevZiC`Yp>3Av-(^P`NUEn4N$a<>Np4n2Fg_T~W$phQf4sM$jz3152c8mMA zttBu9BdO+T8|)g3;TU^{gdMPT;Dy54Vb=}q!^Q2@HTJR%8lrU}J3LN9G&)~9>oDk# z+p7=m{2lBPPSRC=bDdn;AhLhd2N*=_@ml`do1cFE=7;ZHZ8+gNZY14cFD$VIu@VKL zxz$?-DC1hjC*IXNu_es?enn$JQF!6twEuKK5Xm zRlNSNy8JslM?8!Y{vibA>{^{TT&%gg@|E!z8e)Y>A|N8Y`?O$c{*B}4tL!sy?*oKAHK6|G|gYXef_6D{>u*?Ym6uO?yGPA^5^ei@OR&Y)cEX(1BUk+yamw);BkN^G)emD5z>#tvb|LqU|>${)-@Ll)|Km7QIZ@x$3 v{}hn(FaPo9Z~x^h{G)3A`2ElS`^^vE+Fjva-~8~$|Lgw+A0-)ab-fz^QVurI literal 0 HcmV?d00001 diff --git a/doc/ppl-user-java-interface-0.10.2-html.tar.gz b/doc/ppl-user-java-interface-0.10.2-html.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..11eae5ac85a2fc4f7bcc2a35f995c6f095a56af0 GIT binary patch literal 166033 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%0DrpD^Rq} zK*eYX#?a7D>4+$x@sKo?`2>Ra8j7C~p!(G!6*n11N_s0sf*rAb+Q!%$l*L6H*Qv1j zlQj|}$__`OsmKB|qMPYhE4`yt#3(zJVGA`24rZq#{mIagYCsuOM{z0zb}tZ2T?M%* zYnZl!>56h5(Cnfa`ZP}uES$KP5U+*5#hB{txr2C-2B_LKHa3f9*p^`#w9uI|$UB@M zFRc@#43U5?!Ht_c47X z@7Fz}N;1%#<6U+3+0hZwb>&TNDX1%S5h4bK=4-E{0ksNce--i@-M=DC4GXR4(p5e- zzLL&B{0EkR=#d7qDo{bHdP42N{AtqfChjDiC8Jzcb%YWoqAEw&kS0P zv?#&(D)O!jdJ+D1H5V#Xy3a#+;3Ur|C1Ro&3`(dXdZmsq4LK-jGZoVz{FSu(-CXJ* z6NEKMuo^S1>zVpq$zT$Fmuf^OCI83LoHf~qFJvIr#u#2v5}{QnOOvo1=Sji}62zoF z3K}80Hqgc(f=l({(R#@KWQfI$Sssj0C2|-m8PJa>$U;+2bS(8TI;&!XB>siZhHPsf ztH8c2k0vRI%~+A^Ak0-pYi+xy?zE(M;mcsBWn@qJp_o`~eKzb1Goc^>63U{KHye`bsi=&!UJ3yVI9wS5CA3J*C0l3om4muK@)U06qNWlSqvwH7Jr6^& z{`ENT-yGyO@wbR2DFZ+&Y{5J;;`wrGq+?nI zN$9LlDazXEPbVn`Lf)sF0_aDxF=|jYWNjP!_QHNf;&!UpUa>B^{xaX4st zNDao~==Z038178gX|*Yq2}m5i2h}=NKCGg;@su06^ncSO+)ibLDR6Jt4HfrEQTHi^ zU1D$|mQPAC=mRcSc@{;GW+@=FWISPQ#SKsehVdX9wkf!(sC*8vV|n|rK!3&_=Y8SR z#oA3rGOcJd+KQ$rFC~)Bv9;~>5oh!)T;4H(&&C zwQag&heiS|4aTU10=(7JA&SWYQ)ojjClJsMyEHTj1Ncc*hfEwL6ep0_$dD<_WLySG zmZ+0U(PI6#L`07u#Vz7$^zVB3kbV-i!z3$y5pPU*iq3+DOazk=_r@cBDljcrWviM& z@#$1g^+I+j;)(d=e6MjmlgOwBpp;`q-xv9?#Z;+|*Ps*0jzbJ~O^mL+0$$n6<(q1D%1L`Xz2#=&%0Dg@%Ktmaqi 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®C&$N;PbG!C%9BF_R6Npf*351FZu(7qv`}Y9LGF#y2Uhu)N%{#5~E^grx z=w`}KHSH_Nb&!nGZhn=nTuybRp zp9!zLq3nb=L2>4r>v_*?FR9?Uo~)eNx}uklU$&k}aP8XVC(0T+{P3gMqnf#)Z`m2V zQMrYk1f6!`_~X+=0--y-o16Bp%+g6MU|Gy<<*-2YoP?AAXYWdT9LJID_xTk<&S16+ z$jYWD>flUu0)5O;i=ExxK6Zdb0Rm6kGx9N#TvfS^{_jgthb37~+3DNK2D;lR*`gQ> zzKBN#Bkt7)vtD34A=0p9CcU&mlzFZltxT!RELTq&iTPCMn&ysHsC2S0uTW+-GGaUE zg7c;XTGI6+5QY#)MqKPc03-Cg*^s#F0L#a|C7Um2T;b~K?r~DYojDn?DGE+8j)G8`TF87R z3FQC>5sLsRSK4b4?Bnm(>ey9J^U$M}zpCH8bg)MoYZ0x~VE;`eeeW(b7(*S|$a zFTzN0^)I55GY~Q!2xrj$$82OM3`s8g$i|G2T2v>RgcN4OtMw%&tkr@+;cnXc~EC>wVZPxpiVETbkuc) zq&|XJeI$V^Jg%#zS94XPq@AcYI8g`8-^EPPVO71+g9#z?pocx6un9q~9BPRJM0_3q zqCc$?qFQrm&FR_Z>bU=H|kEZS120@wI!1&x-JmX#W z0b!kJLGQXf|A^H2phWZGzcZ1y9}-m$ISix?PwgAsxdCD1BaB?tQ;K|uBkqMrP>%-E zXCYrfn)N!Y*I|+D@{w$KM)x7vm$?p&RUgKwMwVh9CFUY0lO!vDGKP=enG5R0zFUQw zz57z#_>GQ#)2W#pO0+^~DO7QGTD&IEj+qLpb<7)iaDMY{QT(*=tHVHvlTY$Q_2EVD zwFX3b#;Qq?Ib5hmq+}IGIGtzp^qmSd9eAdv%v8;md|tFCUfQQ`<9JiIzHU}COrA_V zL&3W}QNL1<7k4^S_PhCP=RfDUSe?w!XyIhz`7+^3|2~nYOkXO(Q$?z*7O#5t;QVc# z3I%8By;DncB}sGMSqC#xHC0m~)SH@ETs9`Nk>G#O8!@XxLFK_n4NdAlvn5IH3;C8Z zX#`lN;$O>2YF=rQ>J7E!RLo3`N8MCMHmd{Hj?r(Wubp%J&UbTWo$8I}~hii;#H}?2N&&BEuR7+%2g&BQkrQypXs?N*Xu=1GN+N3rg5U7X@5)`?|4$oHI_fVJHpFOe8wYTKg3`(%SsJAe@`OL8*Y1=hY4bsNAjgRVDhD zDZ%@heh`o2uS;OjN&d>7v~hUVK?QZotT5S=;^!+^QYc(KvVLOyOM@0#P1>&G<4@ys z{%N*pOf;yHwPR2H-a*6Aw{<4b+EJ=b5hcFZjC;zbz%cT;K%wg)>P0$YpQ}sIBiM5Q zmOyF0_Yd$kOe2f+dC-_pWm8J{8*I3OzqP!JCbRa{0pXe)&WVS+CAr)gB8v)hSBa6$ z;&^I8R`p@bapq#!ELNTiEBgxDquUo~DLiJ@?j8xa(6FQSnf0Ur~O6HaJ=_dmHs zKAV$96-*Ab_dHDAJB>msPPSacv-L~7XI=T565GtWvU#WF^y)CTlI3fF+Iwd+T0SRW z^T2ZkF9jg|Q>SI?E=q(VtqI}=M$tgV?`*L<^|^SvG@ zk&EN5RDnF)JMM1O2~4m-ct3Y2=@Y^GeH;sj`w zBB&+%12oMyHQgxVb(F@NQ?=9lpwhQqW|9^Axy7!Fd1œ`)D))&8AU;Mdod%pql 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

kc&7bf%w6VX9x27AQP27>hA`uPDJe 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 z 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%0A_+0#^p5SSbPLNGZ6YAVv`g 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 literal 0 HcmV?d00001 diff --git a/Watchdog/doc/pwl.sty b/Watchdog/doc/pwl.sty new file mode 100644 index 0000000..7757db4 --- /dev/null +++ b/Watchdog/doc/pwl.sty @@ -0,0 +1,178 @@ +%% LaTeX package providing macros for typesetting the PWL manuals. +%% Copyright (C) 2001-2009 Roberto Bagnara +%% +%% This file is part of the Parma Watchdog Library (PWL). +%% +%% The PWL is free software; you can redistribute it and/or modify it +%% under the terms of the GNU General Public License as published by the +%% Free Software Foundation; either version 3 of the License, or (at your +%% option) any later version. +%% +%% The PWL is distributed in the hope that it will be useful, but WITHOUT +%% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +%% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +%% for more details. +%% +%% You should have received a copy of the GNU General Public License +%% along with this program; if not, write to the Free Software Foundation, +%% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +%% +%% For the most up-to-date information see the Parma Watchdog Library +%% site: http://www.cs.unipr.it/pwl/ . + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{pwl} +\RequirePackage{amsmath} +\RequirePackage{amssymb} + +%% Calligraphic alphabet +\newcommand*{\cA}{\ensuremath{\mathcal{A}}} +\newcommand*{\cB}{\ensuremath{\mathcal{B}}} +\newcommand*{\cC}{\ensuremath{\mathcal{C}}} +\newcommand*{\cD}{\ensuremath{\mathcal{D}}} +\newcommand*{\cE}{\ensuremath{\mathcal{E}}} +\newcommand*{\cF}{\ensuremath{\mathcal{F}}} +\newcommand*{\cG}{\ensuremath{\mathcal{G}}} +\newcommand*{\cH}{\ensuremath{\mathcal{H}}} +\newcommand*{\cI}{\ensuremath{\mathcal{I}}} +\newcommand*{\cJ}{\ensuremath{\mathcal{J}}} +\newcommand*{\cK}{\ensuremath{\mathcal{K}}} +\newcommand*{\cL}{\ensuremath{\mathcal{L}}} +\newcommand*{\cM}{\ensuremath{\mathcal{M}}} +\newcommand*{\cN}{\ensuremath{\mathcal{N}}} +\newcommand*{\cO}{\ensuremath{\mathcal{O}}} +\newcommand*{\cP}{\ensuremath{\mathcal{P}}} +\newcommand*{\cQ}{\ensuremath{\mathcal{Q}}} +\newcommand*{\cR}{\ensuremath{\mathcal{R}}} +\newcommand*{\cS}{\ensuremath{\mathcal{S}}} +\newcommand*{\cT}{\ensuremath{\mathcal{T}}} +\newcommand*{\cU}{\ensuremath{\mathcal{U}}} +\newcommand*{\cV}{\ensuremath{\mathcal{V}}} +\newcommand*{\cW}{\ensuremath{\mathcal{W}}} +\newcommand*{\cX}{\ensuremath{\mathcal{X}}} +\newcommand*{\cY}{\ensuremath{\mathcal{Y}}} +\newcommand*{\cZ}{\ensuremath{\mathcal{Z}}} + +%% Special letters denoting sets and algebras. +\providecommand*{\Nset}{\mathbb{N}} % Naturals +\newcommand*{\extNset}{\mathbb{N}_\infty} % Extended naturals +\providecommand*{\Oset}{\mathbb{O}} % Ordinals +\providecommand*{\Qset}{\mathbb{Q}} % Rationals +\providecommand*{\Rset}{\mathbb{R}} % Reals +\providecommand*{\nonnegRset}{\mathbb{R}_{\scriptscriptstyle{+}}} + % Non-negative reals +\newcommand*{\extRset}{\Rset_\infty} % Extended reals +\providecommand*{\Zset}{\mathbb{Z}} % Integers +\providecommand*{\CPset}{\mathbb{CP}} % Closed polyhedra +\providecommand*{\Pset}{\mathbb{P}} % (NNC) polyhedra +\providecommand*{\Sset}{\mathbb{S}} % Reals or rationals + +%% Grid notation +\providecommand*{\Gset}{\mathbb{G}} % Grid +\providecommand*{\cg}{\mathord{\mathrm{cg}}} % Congruence +\newcommand*{\gcon}{\mathop{\mathrm{gcon}}\nolimits} + % Grid from congruence system +\newcommand*{\ggen}{\mathop{\mathrm{ggen}}\nolimits} + % Grid from generator system + +%% Function notation +\newcommand*{\fund}[3]{\mathord{#1}\colon#2\rightarrow#3} +\newcommand*{\pard}[3]{\mathord{#1}\colon#2\rightarrowtail#3} + +%% Relation notation +\newcommand*{\reld}[3]{\mathord{#1}\subseteq#2\times#3} + +%% Set theory. +\renewcommand*{\emptyset}{\mathord{\varnothing}} +\newcommand*{\sseq}{\subseteq} +\newcommand*{\sseqf}{\mathrel{\subseteq_\mathrm{f}}} +\newcommand*{\sslt}{\subset} +\newcommand*{\Sseq}{\supseteq} +\newcommand*{\Ssgt}{\supset} +\newcommand*{\inters}{\cap} +\newcommand*{\setdiff}{\setminus} +\newcommand*{\union}{\cup} +\newcommand*{\card}{\mathop{\#}\nolimits} +\newcommand*{\sset}[2]{{\renewcommand*{\arraystretch}{1.2} + \left\{\,#1 \,\left|\, + \begin{array}{@{}l@{}}#2\end{array} + \right. \,\right\}}} +\newcommand*{\meet}{\mathbin{\otimes}} +\newcommand*{\join}{\mathbin{\oplus}} + +%% Logic notation. +\newcommand*{\entails}{\mathrel{\vdash}} +\newcommand*{\sentails}{\mathrel{\Vdash}} +\newcommand*{\Nentails}{\mathrel{\nvdash}} +\newcommand*{\Nsentails}{\mathrel{\nVdash}} +\newcommand*{\entailss}[1]{\mathrel{\vdash_{#1}}} +\newcommand*{\Entailss}[1]{\mathrel{\dashv_{#1}}} +\newcommand*{\sentailss}[1]{\mathrel{\Vdash_{#1}}} +\newcommand*{\Nentailss}[1]{\mathrel{\nvdash_{#1}}} +\newcommand*{\bigland}{\mathop{\bigwedge}\limits} +\newcommand*{\biglor}{\mathop{\bigvee}\limits} +\newcommand*{\piff}{\mathrel{\leftrightarrow}} +\newcommand*{\pimplies}{\mathrel{\rightarrow}} +\newcommand*{\pimplied}{\mathrel{\leftarrow}} +\newcommand*{\st}{\mathrel{.}} +\newcommand*{\itc}{\mathrel{:}} + +%% Integer division and reminder binary operators. +\newcommand*{\bdiv}{\mathbin{\mathrm{div}}} +\newcommand*{\brem}{\mathbin{\mathrm{rem}}} + + +%% True and false +\newcommand*{\false}{\mathord{\textbf{\textup{0}}}} +\newcommand*{\true}{\mathord{\textbf{\textup{1}}}} + +%% Things that hold by definition. +\newcommand*{\defrel}[1]{\mathrel{\buildrel \mathrm{def} \over {#1}}} +\newcommand*{\defeq}{\defrel{=}} +\newcommand*{\defiff}{\defrel{\Longleftrightarrow}} + +% Arbitrary relation symbol. +\newcommand*{\relsym}{\mathrel{\bowtie}} +\newcommand*{\relsyms}[1]{\mathrel{\bowtie_{#1}}} + +% Vectors. +\renewcommand*{\vec}[1]{\mathchoice{\mbox{\boldmath$\displaystyle#1$}} +{\mbox{\boldmath$\textstyle#1$}} +{\mbox{\boldmath$\scriptstyle#1$}} +{\mbox{\boldmath$\scriptscriptstyle#1$}}} + +\newcommand*{\vect}[1]{\vec{#1}} + +% Matrix functions. +\newcommand*{\transpose}{\mathrm{T}} + +% Hulls. +\newcommand*{\linearhull}{\mathop{\mathrm{linear.hull}}} +\newcommand*{\conichull}{\mathop{\mathrm{conic.hull}}} +\newcommand*{\affinehull}{\mathop{\mathrm{affine.hull}}} +\newcommand*{\convexhull}{\mathop{\mathrm{convex.hull}}} +\newcommand*{\NNChull}{\mathop{\mathrm{nnc.hull}}} +\newcommand*{\inthull}{\mathop{\mathrm{int.hull}}} +\newcommand*{\intaffinehull}{\mathop{\mathrm{int.affine.hull}}} + +% Polyhedron functions. +\newcommand*{\prank}{\mathop{\mathrm{rank}}} +\newcommand*{\pdim}{\mathop{\mathrm{dim}}} +\newcommand*{\linspace}{\mathop{\mathrm{lin.space}}} +\newcommand*{\cone}{\mathop{\mathrm{cone}}} + +% Widening +\newcommand*{\widen}{\mathrel{\nabla}} + +% Powerset notation +\newcommand*{\pnonredmap}{\mathop{\Omega^{\scriptscriptstyle\sseq}_{\scriptscriptstyle {\CPset_n}}}\nolimits} +\newcommand*{\pnonredmapi}[1]{\mathop{\Omega^{\scriptscriptstyle\sseq}_{\scriptscriptstyle {\CPset_{#1}}}}\nolimits} +\newcommand*{\nonredmap}{\mathop{\Omega^{\scriptscriptstyle\entails}_{\scriptscriptstyle D}}\nolimits} + +\newcommand*{\wpf}{\mathop{\wp_\mathrm{f}}\nolimits} +\newcommand*{\wpfn}[2]{\mathord{\wp_\mathrm{fn}^{\scriptscriptstyle #2}}(#1)} + +\newcommand*{\smallP}{{\scriptscriptstyle\mathrm{P}}} +\newcommand*{\entailsP}{\entailss{\smallP}} +\newcommand*{\NentailsP}{\Nentailss{\smallP}} +\newcommand*{\sentailsP}{\sentailss{\smallP}} diff --git a/Watchdog/doc/user.doxyconf-html.in b/Watchdog/doc/user.doxyconf-html.in new file mode 100644 index 0000000..e6cedfb --- /dev/null +++ b/Watchdog/doc/user.doxyconf-html.in @@ -0,0 +1,255 @@ +# Doxyfile 1.5.7.1 + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +DOXYFILE_ENCODING = UTF-8 +PROJECT_NAME = PWL +PROJECT_NUMBER = @VERSION@ +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 = +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = NO +OPTIMIZE_FOR_FORTRAN = NO +OPTIMIZE_OUTPUT_VHDL = NO +BUILTIN_STL_SUPPORT = NO +CPP_CLI_SUPPORT = NO +SIP_SUPPORT = NO +IDL_PROPERTY_SUPPORT = YES +DISTRIBUTE_GROUP_DOC = NO +SUBGROUPING = YES +TYPEDEF_HIDES_STRUCT = NO +SYMBOL_CACHE_SIZE = 0 +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = NO +EXTRACT_PRIVATE = 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 +INLINE_INFO = YES +SORT_MEMBER_DOCS = NO +SORT_BRIEF_DOCS = NO +SORT_GROUP_NAMES = NO +SORT_BY_SCOPE_NAME = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 5 +SHOW_USED_FILES = YES +SHOW_DIRECTORIES = NO +SHOW_FILES = YES +SHOW_NAMESPACES = YES +FILE_VERSION_FILTER = +LAYOUT_FILE = +#--------------------------------------------------------------------------- +# 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 = ../src/pwl.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 +#--------------------------------------------------------------------------- +# 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 = pwl-user-@VERSION@-html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +HTML_DYNAMIC_SECTIONS = NO +GENERATE_DOCSET = NO +DOCSET_FEEDNAME = "Doxygen generated docs" +DOCSET_BUNDLE_ID = org.doxygen.Project +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 +QHG_LOCATION = +DISABLE_INDEX = NO +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = YES +TREEVIEW_WIDTH = 250 +FORMULA_FONTSIZE = 10 +#--------------------------------------------------------------------------- +# 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 = pwl +LATEX_HEADER = @srcdir@/user.tex +PDF_HYPERLINKS = YES +USE_PDFLATEX = YES +LATEX_BATCHMODE = YES +LATEX_HIDE_INDICES = NO +#--------------------------------------------------------------------------- +# 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 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 = PWL_OUTPUT_DECLARATIONS +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = pwl-user-@VERSION@-html.tag +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = @PERL@ +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = NO +MSCGEN_PATH = +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = YES +DOT_FONTNAME = FreeSans +DOT_FONTSIZE = 10 +DOT_FONTPATH = +CLASS_GRAPH = YES +COLLABORATION_GRAPH = NO +GROUP_GRAPHS = YES +UML_LOOK = NO +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 +DOT_PATH = +DOTFILE_DIRS = +DOT_GRAPH_MAX_NODES = 50 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO diff --git a/Watchdog/doc/user.doxyconf-latex.in b/Watchdog/doc/user.doxyconf-latex.in new file mode 100644 index 0000000..dca6afc --- /dev/null +++ b/Watchdog/doc/user.doxyconf-latex.in @@ -0,0 +1,255 @@ +# Doxyfile 1.5.7.1 + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +DOXYFILE_ENCODING = UTF-8 +PROJECT_NAME = PWL +PROJECT_NUMBER = @VERSION@ +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 = +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = NO +OPTIMIZE_FOR_FORTRAN = NO +OPTIMIZE_OUTPUT_VHDL = NO +BUILTIN_STL_SUPPORT = NO +CPP_CLI_SUPPORT = NO +SIP_SUPPORT = NO +IDL_PROPERTY_SUPPORT = YES +DISTRIBUTE_GROUP_DOC = NO +SUBGROUPING = YES +TYPEDEF_HIDES_STRUCT = NO +SYMBOL_CACHE_SIZE = 0 +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = NO +EXTRACT_PRIVATE = 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 +INLINE_INFO = YES +SORT_MEMBER_DOCS = NO +SORT_BRIEF_DOCS = NO +SORT_GROUP_NAMES = NO +SORT_BY_SCOPE_NAME = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 5 +SHOW_USED_FILES = YES +SHOW_DIRECTORIES = NO +SHOW_FILES = YES +SHOW_NAMESPACES = YES +FILE_VERSION_FILTER = +LAYOUT_FILE = +#--------------------------------------------------------------------------- +# 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 = ../src/pwl.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 +#--------------------------------------------------------------------------- +# 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 = pwl-user-@VERSION@-html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +HTML_DYNAMIC_SECTIONS = NO +GENERATE_DOCSET = NO +DOCSET_FEEDNAME = "Doxygen generated docs" +DOCSET_BUNDLE_ID = org.doxygen.Project +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 +QHG_LOCATION = +DISABLE_INDEX = NO +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = YES +TREEVIEW_WIDTH = 250 +FORMULA_FONTSIZE = 10 +#--------------------------------------------------------------------------- +# 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 = pwl +LATEX_HEADER = @srcdir@/user.tex +PDF_HYPERLINKS = YES +USE_PDFLATEX = YES +LATEX_BATCHMODE = YES +LATEX_HIDE_INDICES = NO +#--------------------------------------------------------------------------- +# 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 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 = PWL_OUTPUT_DECLARATIONS +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = @PERL@ +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = NO +MSCGEN_PATH = +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = YES +DOT_FONTNAME = FreeSans +DOT_FONTSIZE = 10 +DOT_FONTPATH = +CLASS_GRAPH = YES +COLLABORATION_GRAPH = NO +GROUP_GRAPHS = YES +UML_LOOK = NO +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 +DOT_PATH = +DOTFILE_DIRS = +DOT_GRAPH_MAX_NODES = 50 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO diff --git a/Watchdog/doc/user.tex b/Watchdog/doc/user.tex new file mode 100644 index 0000000..d6f41aa --- /dev/null +++ b/Watchdog/doc/user.tex @@ -0,0 +1,120 @@ +% Copyright (C) 2001-2009 Roberto Bagnara +% +% This document describes the Parma Watchdog Library (PWL). +% +% 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 PWL in files called `fdl.*'. +% +% The PWL is free software; you can redistribute it and/or modify it +% under the terms of the GNU General Public License as published by the +% Free Software Foundation; either version 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 PWL in +% files are called `gpl.*'. +% +% The PWL is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +% for more details. +% +% For the most up-to-date information see the Parma Watchdog Library +% site: http://www.cs.unipr.it/pwl/ . + +\documentclass[a4paper]{article} +\nonstopmode +\usepackage{a4wide} +\usepackage{makeidx} +\usepackage{fancyhdr} +\usepackage{graphicx} +\usepackage{float} +\usepackage{alltt} +\usepackage{doxygen} +\usepackage{times} +\ifx\pdfoutput\undefined +\usepackage[ps2pdf, + pagebackref=true, + colorlinks=true, + linkcolor=blue + ]{hyperref} +\usepackage{pspicture} +\else +\usepackage[pdftex, + pagebackref=true, + colorlinks=true, + linkcolor=blue + ]{hyperref} +\fi +\usepackage{pwl} +\makeindex +\setcounter{tocdepth}{1} +\renewcommand{\footrulewidth}{0.4pt} + +\rfoot[\fancyplain{}{\scriptsize The Parma Watchdog Library User's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/pwl/} for more information.}]{} +\lfoot[]{\fancyplain{}{\scriptsize The Parma Watchdog Library User's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/pwl/} for more information.}} + +\begin{document} +\title{ +The Parma Watchdog Library \\ +User's Manual\thanks{This work + has been partly supported by: + University of Parma's FIL scientific research project (ex 60\%) + ``Pure and Applied Mathematics''; + MURST project + ``Automatic Program Certification by Abstract Interpretation''; + MURST project + ``Abstract Interpretation, Type Systems and Control-Flow Analysis''; + MURST project + ``Automatic Aggregate- and Number-Reasoning for Computing: from + Decision Algorithms to Constraint Programming with Multisets, + Sets, and Maps''; + MURST project + ``Constraint Based Verification of Reactive Systems''; + MURST project + ``Abstract Interpretation: Design and Applications''. + } \\ +(version $projectnumber) +} +\author{ +Roberto Bagnara\thanks{bagnara@cs.unipr.it, + Department of Mathematics, University of Parma, Italy.} +} +\maketitle + +\newpage +Copyright \copyright\ 2001--2009 Roberto Bagnara (bagnara@cs.unipr.it). + +This document describes the Parma Watchdog Library (PWL). + +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 PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +\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 PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +For the most up-to-date information see the Parma Watchdog Library +site: +\begin{center} +\href{http://www.cs.unipr.it/pwl/}{\tt http://www.cs.unipr.it/pwl/} +\end{center} + +\pagenumbering{roman} +\tableofcontents +\pagenumbering{arabic} diff --git a/Watchdog/install-sh b/Watchdog/install-sh new file mode 100755 index 0000000..a5897de --- /dev/null +++ b/Watchdog/install-sh @@ -0,0 +1,519 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2006-12-25.00 + +# 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 + 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 + 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 + trap '(exit $?); exit' 1 2 13 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 starting with `-'. + case $src in + -*) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=$dst_arg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $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-writeable 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 -z "$d" && 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-end: "$" +# End: diff --git a/Watchdog/ltmain.sh b/Watchdog/ltmain.sh new file mode 100644 index 0000000..b36c4ad --- /dev/null +++ b/Watchdog/ltmain.sh @@ -0,0 +1,8406 @@ +# Generated from ltmain.m4sh. + +# ltmain.sh (GNU libtool) 2.2.6 +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 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 +# --tag=TAG use configuration variables from tag TAG +# -v, --verbose print informational messages (default) +# --version print version information +# -h, --help print short or long 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. +# 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.2.6 +# automake: $automake_version +# autoconf: $autoconf_version +# +# Report bugs to . + +PROGRAM=ltmain.sh +PACKAGE=libtool +VERSION=2.2.6 +TIMESTAMP="" +package_revision=1.3012 + +# 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 + +# NLS nuisances: We save the old values to restore during execute mode. +# Only set LANG and LC_ALL to C if already set. +# These must not be set unconditionally because not all systems understand +# e.g. LANG=C (notably SCO). +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 + +$lt_unset CDPATH + + + + + +: ${CP="cp -f"} +: ${ECHO="echo"} +: ${EGREP="/usr/bin/grep -E"} +: ${FGREP="/usr/bin/grep -F"} +: ${GREP="/usr/bin/grep"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SED="/opt/local/bin/gsed"} +: ${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_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 "X${1}" | $Xsed -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 "X${1}" | $Xsed -e "$basename"` +} + +# Generated shell functions inserted here. + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + +# The name of this program: +# In the unlikely event $progname began with a '-', it would play havoc with +# func_echo (imagine progname=-n), so we prepend ./ in that case: +func_dirname_and_basename "$progpath" +progname=$func_basename_result +case $progname in + -*) progname=./$progname ;; +esac + +# 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=: + 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' + +# 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${mode+: }$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_error arg... +# Echo program name prefixed message to standard error. +func_error () +{ + $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2 +} + +# func_warning arg... +# Echo program name prefixed warning message to standard error. +func_warning () +{ + $opt_warning && $ECHO "$progname${mode+: }$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 "X$my_directory_path" | $Xsed -e "$dirname"` + done + my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e '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 "X$my_tmpdir" | $Xsed +} + + +# 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 "X$1" | $Xsed -e "$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 "X$1" | $Xsed \ + -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_version +# Echo version message to standard output and exit. +func_version () +{ + $SED -n '/^# '$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 () +{ + $SED -n '/^# Usage:/,/# -h/ { + s/^# // + s/^# *$// + s/\$progname/'$progname'/ + p + }' < "$progpath" + $ECHO + $ECHO "run \`$progname --help | more' for full usage" + exit $? +} + +# func_help +# Echo long help message to standard output and exit. +func_help () +{ + $SED -n '/^# Usage:/,/# Report bugs to/ { + 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 --version) 2>/dev/null |$SED 1q`"'/ + s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ + p + }' < "$progpath" + exit $? +} + +# func_missing_arg argname +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + func_error "missing argument for $1" + exit_cmd=exit +} + +exit_cmd=: + + + + + +# Check that we have a working $ECHO. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then + # Yippee, $ECHO works! + : +else + # Restart under the correct shell, and then maybe $ECHO will work. + exec $SHELL "$progpath" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat </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 +} + +# Parse options once, thoroughly. This comes as soon as possible in +# the script to make things like `libtool --version' happen quickly. +{ + + # 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 + + # Parse non-mode specific arguments: + while test "$#" -gt 0; do + opt="$1" + shift + + case $opt in + --config) func_config ;; + + --debug) preserve_args="$preserve_args $opt" + func_echo "enabling shell trace mode" + opt_debug='set -x' + $opt_debug + ;; + + -dlopen) test "$#" -eq 0 && func_missing_arg "$opt" && break + execute_dlfiles="$execute_dlfiles $1" + shift + ;; + + --dry-run | -n) opt_dry_run=: ;; + --features) func_features ;; + --finish) mode="finish" ;; + + --mode) test "$#" -eq 0 && func_missing_arg "$opt" && break + case $1 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 + + mode="$1" + shift + ;; + + --preserve-dup-deps) + opt_duplicate_deps=: ;; + + --quiet|--silent) preserve_args="$preserve_args $opt" + opt_silent=: + ;; + + --verbose| -v) preserve_args="$preserve_args $opt" + opt_silent=false + ;; + + --tag) test "$#" -eq 0 && func_missing_arg "$opt" && break + preserve_args="$preserve_args $opt $1" + func_enable_tag "$1" # tagname is set here + shift + ;; + + # Separate optargs to long options: + -dlopen=*|--mode=*|--tag=*) + func_opt_split "$opt" + set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"} + shift + ;; + + -\?|-h) func_usage ;; + --help) opt_help=: ;; + --version) func_version ;; + + -*) func_fatal_help "unrecognized option \`$opt'" ;; + + *) nonopt="$opt" + break + ;; + esac + done + + + 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_duplicate_deps + ;; + esac + + # Having warned about all mis-specified options, bail out if + # anything was wrong. + $exit_cmd $EXIT_FAILURE +} + +# 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 +} + + +## ----------- ## +## Main. ## +## ----------- ## + +$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 + + test -z "$mode" && func_fatal_error "error: you must specify a MODE." + + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$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=$mode' for more information." +} + + +# 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_ltwrapper_scriptname_result="" + if func_ltwrapper_executable_p "$1"; then + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" + fi +} + +# 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_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_quote_for_eval "$arg" + CC_quoted="$CC_quoted $func_quote_for_eval_result" + done + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_quote_for_eval "$arg" + CC_quoted="$CC_quoted $func_quote_for_eval_result" + done + case "$@ " in + " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + 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 <?"'"'"' &()|`$[]' \ + && 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 "X$srcfile" | $Xsed -e 's%^.*/%%' -e '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 + removelist="$removelist $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + removelist="$removelist $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + 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 + command="$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 + command="$command -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + command="$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 "$mode" = compile && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $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 building PIC objects only + -prefer-non-pic try to building 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 + +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 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 + -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 + +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 \`$mode'" + ;; + esac + + $ECHO + $ECHO "Try \`$progname --help' for more information about other modes." + + exit $? +} + + # Now that we've collected a possible --mode arg, show help if necessary + $opt_help && func_mode_help + + +# 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 $execute_dlfiles; do + test -f "$file" \ + || func_fatal_help "\`$file' is not a file" + + dir= + case $file in + *.la) + # 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 + dir="$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 + -*) ;; + *) + # 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_quote_for_eval "$file" + args="$args $func_quote_for_eval_result" + 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 "$mode" = execute && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $opt_debug + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + 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" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_silent && exit $EXIT_SUCCESS + + $ECHO "X----------------------------------------------------------------------" | $Xsed + $ECHO "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + $ECHO + $ECHO "If you ever happen to want to link against installed libraries" + $ECHO "in a given directory, LIBDIR, you must either use libtool, and" + $ECHO "specify the full pathname of the library, or use the \`-LLIBDIR'" + $ECHO "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + $ECHO " - add LIBDIR to the \`$shlibpath_var' environment variable" + $ECHO " during execution" + fi + if test -n "$runpath_var"; then + $ECHO " - add LIBDIR to the \`$runpath_var' environment variable" + $ECHO " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + $ECHO " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + $ECHO + + $ECHO "See any operating system documentation about shared libraries for" + 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 "X----------------------------------------------------------------------" | $Xsed + exit $EXIT_SUCCESS +} + +test "$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. + $ECHO "X$nonopt" | $GREP shtool >/dev/null; 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" + install_prog="$install_prog$func_quote_for_eval_result" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + case " $install_prog " in + *[\\\ /]cp\ *) ;; + *) prev=$arg ;; + esac + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + install_prog="$install_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 -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. + staticlibs="$staticlibs $file" + ;; + + *.la) + # 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 "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir="$func_dirname_result" + dir="$dir$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -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 "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "X$relink_command" | $Xsed -e "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_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" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + 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 "X$lib" | $Xsed -e '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 "X$relink_command" | $Xsed -e '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 "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + 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_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $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 "$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 + +/* 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 "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_verbose "extracting global C symbols from \`$progfile'" + $opt_dry_run || eval "$NM $progfile | $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" + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + 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 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; +" + case $host in + *cygwin* | *mingw* | *cegcc* ) + $ECHO >> "$output_objdir/$my_dlsyms" "\ +/* DATA imports from DLLs on WIN32 con't be const, because + runtime relocations are performed -- see ld's documentation + on pseudo-relocs. */" + lt_dlsym_const= ;; + *osf5*) + echo >> "$output_objdir/$my_dlsyms" "\ +/* This system does not cope well with relocations in const data */" + lt_dlsym_const= ;; + *) + lt_dlsym_const=const ;; + esac + + $ECHO >> "$output_objdir/$my_dlsyms" "\ +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) ;; + *) symtab_cflags="$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 "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "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 "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "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. +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 + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | + $SED -n -e ' + 1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $opt_debug + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?' + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + 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 | $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 | $NL2SP` + done + + func_extract_archives_result="$my_oldobjs" +} + + + +# func_emit_wrapper_part1 [arg=no] +# +# Emit the first part of a libtool wrapper script on stdout. +# For more information, see the description associated with +# func_emit_wrapper(), below. +func_emit_wrapper_part1 () +{ + func_emit_wrapper_part1_arg1=no + if test -n "$1" ; then + func_emit_wrapper_part1_arg1=$1 + fi + + $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. +Xsed='${SED} -e 1s/^X//' +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 + ECHO=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$ECHO works! + : + else + # Restart under the correct shell, and then maybe \$ECHO will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $ECHO "\ + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + done +" +} +# end: func_emit_wrapper_part1 + +# func_emit_wrapper_part2 [arg=no] +# +# Emit the second part of a libtool wrapper script on stdout. +# For more information, see the description associated with +# func_emit_wrapper(), below. +func_emit_wrapper_part2 () +{ + func_emit_wrapper_part2_arg1=no + if test -n "$1" ; then + func_emit_wrapper_part2_arg1=$1 + fi + + $ECHO "\ + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_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 \"X\$thisdir\" | \$Xsed -e '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" + + # 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 \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 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\ +" +} +# end: func_emit_wrapper_part2 + + +# 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=no + if test -n "$1" ; then + func_emit_wrapper_arg1=$1 + fi + + # split this up so that func_emit_cwrapperexe_src + # can call each part independently. + func_emit_wrapper_part1 "${func_emit_wrapper_arg1}" + func_emit_wrapper_part2 "${func_emit_wrapper_arg1}" +} + + +# func_to_host_path arg +# +# Convert paths to host format when used with build tools. +# Intended for use with "native" mingw (where libtool itself +# is running under the msys shell), or in the following cross- +# build environments: +# $build $host +# mingw (msys) mingw [e.g. native] +# cygwin mingw +# *nix + wine mingw +# where wine is equipped with the `winepath' executable. +# In the native mingw case, the (msys) shell automatically +# converts paths for any non-msys applications it launches, +# but that facility isn't available from inside the cwrapper. +# Similar accommodations are necessary for $host mingw and +# $build cygwin. Calling this function does no harm for other +# $host/$build combinations not listed above. +# +# ARG is the path (on $build) that should be converted to +# the proper representation for $host. The result is stored +# in $func_to_host_path_result. +func_to_host_path () +{ + func_to_host_path_result="$1" + if test -n "$1" ; then + case $host in + *mingw* ) + lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + case $build in + *mingw* ) # actually, msys + # awkward: cmd appends spaces to result + lt_sed_strip_trailing_spaces="s/[ ]*\$//" + func_to_host_path_tmp1=`( cmd //c echo "$1" |\ + $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` + func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + *cygwin* ) + func_to_host_path_tmp1=`cygpath -w "$1"` + func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + * ) + # 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_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null` + if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then + func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + $SED -e "$lt_sed_naive_backslashify"` + else + # Allow warning below. + func_to_host_path_result="" + fi + ;; + esac + if test -z "$func_to_host_path_result" ; then + func_error "Could not determine host path corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_path_result="$1" + fi + ;; + esac + fi +} +# end: func_to_host_path + +# func_to_host_pathlist arg +# +# Convert pathlists to host format when used with build tools. +# See func_to_host_path(), above. This function supports the +# following $build/$host combinations (but does no harm for +# combinations not listed here): +# $build $host +# mingw (msys) mingw [e.g. native] +# cygwin mingw +# *nix + wine mingw +# +# 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. +# +# ARG is a pathlist (on $build) that should be converted to +# the proper representation on $host. The result is stored +# in $func_to_host_pathlist_result. +func_to_host_pathlist () +{ + func_to_host_pathlist_result="$1" + if test -n "$1" ; then + case $host in + *mingw* ) + lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + # 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_to_host_pathlist_tmp2="$1" + # Once set for this call, this variable should not be + # reassigned. It is used in tha fallback case. + func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\ + $SED -e 's|^:*||' -e 's|:*$||'` + case $build in + *mingw* ) # Actually, msys. + # Awkward: cmd appends spaces to result. + lt_sed_strip_trailing_spaces="s/[ ]*\$//" + func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\ + $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + *cygwin* ) + func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"` + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + * ) + # unfortunately, winepath doesn't convert pathlists + func_to_host_pathlist_result="" + func_to_host_pathlist_oldIFS=$IFS + IFS=: + for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do + IFS=$func_to_host_pathlist_oldIFS + if test -n "$func_to_host_pathlist_f" ; then + func_to_host_path "$func_to_host_pathlist_f" + if test -n "$func_to_host_path_result" ; then + if test -z "$func_to_host_pathlist_result" ; then + func_to_host_pathlist_result="$func_to_host_path_result" + else + func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result" + fi + fi + fi + IFS=: + done + IFS=$func_to_host_pathlist_oldIFS + ;; + esac + if test -z "$func_to_host_pathlist_result" ; then + func_error "Could not determine the host path(s) corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This may break if $1 contains DOS-style drive + # specifications. The fix is not to complicate the expression + # below, but for the user to provide a working wine installation + # with winepath so that path translation in the cross-to-mingw + # case works properly. + lt_replace_pathsep_nix_to_dos="s|:|;|g" + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\ + $SED -e "$lt_replace_pathsep_nix_to_dos"` + fi + # Now, add the leading and trailing path separators back + case "$1" in + :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result" + ;; + esac + case "$1" in + *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;" + ;; + esac + ;; + esac + fi +} +# end: func_to_host_pathlist + +# 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 < +#include +#ifdef _MSC_VER +# include +# include +# include +# define setmode _setmode +#else +# include +# include +# ifdef __CYGWIN__ +# include +# define HAVE_SETENV +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#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 + +#ifdef _MSC_VER +# define S_IXUSR _S_IEXEC +# define stat _stat +# ifndef _INTPTR_T_DEFINED +# define intptr_t int +# endif +#endif + +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# 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 */ + +#ifdef __CYGWIN__ +# define FOPEN_WB "wb" +#endif + +#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) + +#undef LTWRAPPER_DEBUGPRINTF +#if defined DEBUGWRAPPER +# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args +static void +ltwrapper_debugprintf (const char *fmt, ...) +{ + va_list args; + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); +} +#else +# define LTWRAPPER_DEBUGPRINTF(args) +#endif + +const char *program_name = NULL; + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +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_fatal (const char *message, ...); +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_opt_process_env_set (const char *arg); +void lt_opt_process_env_prepend (const char *arg); +void lt_opt_process_env_append (const char *arg); +int lt_split_name_value (const char *arg, char** name, char** value); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); + +static const char *script_text_part1 = +EOF + + func_emit_wrapper_part1 yes | + $SED -e 's/\([\\"]\)/\\\1/g' \ + -e 's/^/ "/' -e 's/$/\\n"/' + echo ";" + cat <"))); + for (i = 0; i < newargc; i++) + { + LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d] : %s\n", i, (newargz[i] ? newargz[i] : ""))); + } + +EOF + + case $host_os in + mingw*) + cat <<"EOF" + /* execv doesn't actually work on mingw as expected on unix */ + rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz); + if (rval == -1) + { + /* failed to start process */ + LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, 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 ("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; + + LTWRAPPER_DEBUGPRINTF (("(check_executable) : %s\n", + path ? (*path ? path : "EMPTY!") : "NULL!")); + 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; + + LTWRAPPER_DEBUGPRINTF (("(make_executable) : %s\n", + path ? (*path ? path : "EMPTY!") : "NULL!")); + 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; + + LTWRAPPER_DEBUGPRINTF (("(find_executable) : %s\n", + wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!")); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +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) + { + LTWRAPPER_DEBUGPRINTF (("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 + { + char *errstr = strerror (errno); + lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal ("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; +} + +static void +lt_error_core (int exit_status, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); +} + +void +lt_setenv (const char *name, const char *value) +{ + LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n", + (name ? name : ""), + (value ? 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; +} + +int +lt_split_name_value (const char *arg, char** name, char** value) +{ + const char *p; + int len; + if (!arg || !*arg) + return 1; + + p = strchr (arg, (int)'='); + + if (!p) + return 1; + + *value = xstrdup (++p); + + len = strlen (arg) - strlen (*value); + *name = XMALLOC (char, len); + strncpy (*name, arg, len-1); + (*name)[len - 1] = '\0'; + + return 0; +} + +void +lt_opt_process_env_set (const char *arg) +{ + char *name = NULL; + char *value = NULL; + + if (lt_split_name_value (arg, &name, &value) != 0) + { + XFREE (name); + XFREE (value); + lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg); + } + + lt_setenv (name, value); + XFREE (name); + XFREE (value); +} + +void +lt_opt_process_env_prepend (const char *arg) +{ + char *name = NULL; + char *value = NULL; + char *new_value = NULL; + + if (lt_split_name_value (arg, &name, &value) != 0) + { + XFREE (name); + XFREE (value); + lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg); + } + + new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + XFREE (name); + XFREE (value); +} + +void +lt_opt_process_env_append (const char *arg) +{ + char *name = NULL; + char *value = NULL; + char *new_value = NULL; + + if (lt_split_name_value (arg, &name, &value) != 0) + { + XFREE (name); + XFREE (value); + lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg); + } + + new_value = lt_extend_str (getenv (name), value, 1); + lt_setenv (name, new_value); + XFREE (new_value); + XFREE (name); + XFREE (value); +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + (name ? name : ""), + (value ? 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) +{ + LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + (name ? name : ""), + (value ? 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 +} +# end: func_emit_cwrapperexe_src + +# 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 + 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 + 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 + dlfiles="$dlfiles $arg" + else + dlprefiles="$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 "*) ;; + *) deplibs="$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 +# moreargs="$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 + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + 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 "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + weak) + weak_libs="$weak_libs $arg" + prev= + continue + ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + compiler_flags="$compiler_flags $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$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 + ;; + + -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" + dir=$func_stripname_result + if test -z "$dir"; 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 + # 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 "*) ;; + *) + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs="$deplibs 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 + deplibs="$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) + compiler_flags="$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) + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) new_inherited_linker_flags="$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_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$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" + arg="$arg $wl$func_quote_for_eval_result" + compiler_flags="$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" + arg="$arg $wl$func_quote_for_eval_result" + compiler_flags="$compiler_flags $wl$func_quote_for_eval_result" + linker_flags="$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" + ;; + + # -64, -mips[0-9] enable 64-bit mode on the SGI compiler + # -r[0-9][0-9]* specifies the processor on the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler + # +DA*, +DD* enable 64-bit mode on the HP compiler + # -q* pass through compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* pass through architecture-specific + # compiler args for GCC + # -F/path gives path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC + # @file GCC response files + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + func_append compile_command " $arg" + func_append finalize_command " $arg" + compiler_flags="$compiler_flags $arg" + continue + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + *.$objext) + # A standard object. + objs="$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 + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + 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. + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles="$dlfiles $arg" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles="$dlprefiles $arg" + prev= + else + deplibs="$deplibs $arg" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + 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 \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + func_dirname "$output" "/" "" + output_objdir="$func_dirname_result$objdir" + # 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_duplicate_deps ; then + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + libs="$libs $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$pre_post_deps $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + 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= + case $lib in + *.la) func_source "$lib" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"` + case " $weak_libs " in + *" $deplib_base "*) ;; + *) deplibs="$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) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + compiler_flags="$compiler_flags $deplib" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) new_inherited_linker_flags="$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 "*) ;; + * ) new_inherited_linker_flags="$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" + newlib_search_path="$newlib_search_path $func_stripname_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" + newlib_search_path="$newlib_search_path $func_stripname_result" + ;; + *) + func_warning "\`-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + func_stripname '-R' '' "$deplib" + dir=$func_stripname_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) lib="$deplib" ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # 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 \"X$deplib\"" 2>/dev/null | $Xsed -e 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. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + + if test "$found" = yes || test -f "$lib"; then : + else + 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 "X$inherited_linker_flags" | $Xsed -e '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 "*) ;; + *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e '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" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" + 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_duplicate_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + if test -z "$linklib"; then + 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. + dlprefiles="$dlprefiles $lib $dependency_libs" + else + newdlfiles="$newdlfiles $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + 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 "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library \`$lib' was moved." + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$libdir" + absdir="$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + fi + fi # $installed = yes + 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 + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" + fi + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + newlib_search_path="$newlib_search_path $func_stripname_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_duplicate_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$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:"*) ;; + *) temp_rpath="$temp_rpath$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc*) + # No point in relinking DLLs because paths are not encoded + notinst_deplibs="$notinst_deplibs $lib" + need_relink=no + ;; + *) + if test "$installed" = no; then + notinst_deplibs="$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 "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + 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 "$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$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && + test "$hardcode_minus_L" != yes && + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes && + 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:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + $ECHO + $ECHO "*** Warning: This system can not link to static lib archive $lib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + $ECHO "*** But as you try to build a module library, libtool will still create " + $ECHO "*** a static module, that should work as long as the dlopening application" + $ECHO "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + $ECHO + $ECHO "*** However, this would only work if libtool was able to extract symbol" + $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" + $ECHO "*** not find such a program. So, this module is probably useless." + $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + *) temp_deplibs="$temp_deplibs $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path="$newlib_search_path $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + if $opt_duplicate_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + case $deplib in + -L*) path="$deplib" ;; + *.la) + 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 + compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" + linker_flags="$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 "X $new_inherited_linker_flags" | $Xsed -e '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 "*) ;; + *) lib_search_path="$lib_search_path $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + tmp_libs="$tmp_libs $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + 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" + objs="$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!" + libobjs="$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 + 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|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) + 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. + verstring="$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" + libobjs="$libobjs $symfileobj" + test "X$libobjs" = "X " && libobjs= + + if test "$mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.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 + removelist="$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 + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"` + # deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"` + # dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) dlfiles="$dlfiles $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) dlprefiles="$dlprefiles $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs="$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 + deplibs="$deplibs -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $ECHO + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have" + $ECHO "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + newdeplibs="$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 "*) + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval "\$ECHO \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $ECHO + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have" + $ECHO "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \ + -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"` + done + fi + if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' | + $GREP . >/dev/null; then + $ECHO + if test "X$deplibs_check_method" = "Xnone"; then + $ECHO "*** Warning: inter-library dependencies are not supported in this platform." + else + $ECHO "*** Warning: inter-library dependencies are not known to be supported." + fi + $ECHO "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e '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 "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO "X $deplibs" | $Xsed -e '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 "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + deplibs="$new_libs" + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath="$dep_rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + 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 + linknames="$linknames $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$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" + delfiles="$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 cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + func_len " $cmd" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + func_show_eval "$cmd" 'exit $?' + 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 "X$include_expsyms" | $Xsed | $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 + delfiles="$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 "*) ;; + *) + tmp_deplibs="$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" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + libobjs="$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\" + linker_flags="$linker_flags $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$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 + output_la=`$ECHO "X$output" | $Xsed -e "$basename"` + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + 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 + $ECHO "$obj" >> $output + done + $ECHO ')' >> $output + delfiles="$delfiles $output" + 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 + $ECHO "$obj" >> $output + done + delfiles="$delfiles $output" + output=$firstobj\"$file_list_spec$output\" + 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. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$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~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + if test -n "$last_robj"; then + eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" + fi + delfiles="$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 "$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 "X$include_expsyms" | $Xsed | $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 + delfiles="$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" + generated="$generated $gentop" + + func_extract_archives $gentop $dlprefiles + libobjs="$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 "$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 "$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 "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + 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 "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e '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]) + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e '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 "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + compile_command="$compile_command $compile_deplibs" + finalize_command="$finalize_command $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) dllsearchpath="$dllsearchpath:$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + 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 + *cygwin* | *mingw* ) + if test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + *cegcc) + # Disable wrappers for cegcc, we are cross compiling anyway. + wrappers_required=no + ;; + *) + 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 "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + # 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 + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + 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 "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + # 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 "X$relink_command" | $Xsed -e "$sed_quote_subst"` + fi + + # Quote $ECHO for shipping. + if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then + case $progpath in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; + *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; + esac + qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if 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 + oldobjs="$oldobjs $symfileobj" + fi + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $addlibs + oldobjs="$oldobjs $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $dlprefiles + oldobjs="$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" + generated="$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" + oldobjs="$oldobjs $gentop/$newobj" + ;; + *) oldobjs="$oldobjs $obj" ;; + esac + done + fi + 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 + 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 "X$relink_command" | $Xsed -e "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + # Only create the output if not a dry run. + $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" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + newdependency_libs="$newdependency_libs $libdir/$name" + ;; + *) newdependency_libs="$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" + newdlfiles="$newdlfiles $libdir/$name" + ;; + *) newdlfiles="$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" + newdlprefiles="$newdlprefiles $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 + newdlfiles="$newdlfiles $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles="$newdlprefiles $abs" + done + dlprefiles="$newdlprefiles" + fi + $RM $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + 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 "$mode" = link || test "$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) RM="$RM $arg"; rmforce=yes ;; + -*) RM="$RM $arg" ;; + *) files="$files $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + origobjdir="$objdir" + for file in $files; do + func_dirname "$file" "" "." + dir="$func_dirname_result" + if test "X$dir" = X.; then + objdir="$origobjdir" + else + objdir="$dir/$origobjdir" + fi + func_basename "$file" + name="$func_basename_result" + test "$mode" = uninstall && objdir="$dir" + + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then + case " $rmdirs " in + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $objdir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + + case "$mode" in + clean) + case " $library_names " in + # " " in the beginning catches empty $dlname + *" $dlname "*) ;; + *) rmfiles="$rmfiles $objdir/$dlname" ;; + esac + test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + 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 + rmfiles="$rmfiles $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && + test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$mode" = clean ; then + noexename=$name + case $file in + *.exe) + 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 + rmfiles="$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 + rmfiles="$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 + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles="$rmfiles $objdir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + objdir="$origobjdir" + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +{ test "$mode" = uninstall || test "$mode" = clean; } && + func_mode_uninstall ${1+"$@"} + +test -z "$mode" && { + help="$generic_help" + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode \`$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/Watchdog/m4/Makefile.am b/Watchdog/m4/Makefile.am new file mode 100644 index 0000000..6d725b4 --- /dev/null +++ b/Watchdog/m4/Makefile.am @@ -0,0 +1,37 @@ +# Automake source file for the Parma Watchdog Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Watchdog Library (PWL). +# +# The PWL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PWL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . */ + +# M4 macro files to be used by the client applications with Autoconf. +m4datadir = $(datadir)/aclocal +m4data_DATA = + +# M4 macro files for internal use. +m4macros = \ +lib-ld.m4 \ +lib-link.m4 \ +libtool.m4 \ +ltoptions.m4 \ +ltsugar.m4 \ +ltversion.m4 \ +lt~obsolete.m4 + +EXTRA_DIST = $(m4macros) $(m4data_DATA) diff --git a/Watchdog/m4/Makefile.in b/Watchdog/m4/Makefile.in new file mode 100644 index 0000000..d34be4d --- /dev/null +++ b/Watchdog/m4/Makefile.in @@ -0,0 +1,406 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Watchdog Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Watchdog Library (PWL). +# +# The PWL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PWL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . */ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(m4datadir)" +m4dataDATA_INSTALL = $(INSTALL_DATA) +DATA = $(m4data_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VALGRIND = @VALGRIND@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +datadir = @datadir@ +datarootdir = @datarootdir@ +debug_flag = @debug_flag@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# M4 macro files to be used by the client applications with Autoconf. +m4datadir = $(datadir)/aclocal +m4data_DATA = + +# M4 macro files for internal use. +m4macros = \ +lib-ld.m4 \ +lib-link.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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign m4/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign m4/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-m4dataDATA: $(m4data_DATA) + @$(NORMAL_INSTALL) + test -z "$(m4datadir)" || $(MKDIR_P) "$(DESTDIR)$(m4datadir)" + @list='$(m4data_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(m4dataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(m4datadir)/$$f'"; \ + $(m4dataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(m4datadir)/$$f"; \ + done + +uninstall-m4dataDATA: + @$(NORMAL_UNINSTALL) + @list='$(m4data_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(m4datadir)/$$f'"; \ + rm -f "$(DESTDIR)$(m4datadir)/$$f"; \ + done +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(m4datadir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-m4dataDATA + +install-dvi: install-dvi-am + +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 + +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 \ + 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 \ + 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/Watchdog/m4/lib-ld.m4 b/Watchdog/m4/lib-ld.m4 new file mode 100644 index 0000000..96c4e2c --- /dev/null +++ b/Watchdog/m4/lib-ld.m4 @@ -0,0 +1,110 @@ +# lib-ld.m4 serial 3 (gettext-0.13) +dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl Subroutines of libtool.m4, +dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision +dnl with libtool.m4. + +dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. +AC_DEFUN([AC_LIB_PROG_LD_GNU], +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by GCC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]* | [A-Za-z]:[\\/]*)] + [re_direlt='/[^/][^/]*/\.\./'] + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(acl_cv_path_LD, +[if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break ;; + *) + test "$with_gnu_ld" != yes && break ;; + esac + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$acl_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT($LD) +else + AC_MSG_RESULT(no) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_LIB_PROG_LD_GNU +]) diff --git a/Watchdog/m4/lib-link.m4 b/Watchdog/m4/lib-link.m4 new file mode 100644 index 0000000..ea0b0c4 --- /dev/null +++ b/Watchdog/m4/lib-link.m4 @@ -0,0 +1,553 @@ +# lib-link.m4 serial 6 (gettext-0.14.3) +dnl Copyright (C) 2001-2005 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_PREREQ(2.50) + +dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and +dnl augments the CPPFLAGS variable. +AC_DEFUN([AC_LIB_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + ac_cv_lib[]Name[]_libs="$LIB[]NAME" + ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" + ac_cv_lib[]Name[]_cppflags="$INC[]NAME" + ]) + LIB[]NAME="$ac_cv_lib[]Name[]_libs" + LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" + INC[]NAME="$ac_cv_lib[]Name[]_cppflags" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the + dnl results of this search when this library appears as a dependency. + HAVE_LIB[]NAME=yes + undefine([Name]) + undefine([NAME]) +]) + +dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) +dnl searches for libname and the libraries corresponding to explicit and +dnl implicit dependencies, together with the specified include files and +dnl the ability to compile and link the specified testcode. If found, it +dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and +dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and +dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs +dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. +AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + + dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + + dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, + dnl because if the user has installed lib[]Name and not disabled its use + dnl via --without-lib[]Name-prefix, he wants to use it. + ac_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + + AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ + ac_save_LIBS="$LIBS" + LIBS="$LIBS $LIB[]NAME" + AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) + LIBS="$ac_save_LIBS" + ]) + if test "$ac_cv_lib[]Name" = yes; then + HAVE_LIB[]NAME=yes + AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) + AC_MSG_CHECKING([how to link with lib[]$1]) + AC_MSG_RESULT([$LIB[]NAME]) + else + HAVE_LIB[]NAME=no + dnl If $LIB[]NAME didn't lead to a usable library, we don't need + dnl $INC[]NAME either. + CPPFLAGS="$ac_save_CPPFLAGS" + LIB[]NAME= + LTLIB[]NAME= + fi + AC_SUBST([HAVE_LIB]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + undefine([Name]) + undefine([NAME]) +]) + +dnl Determine the platform dependent parameters needed to use rpath: +dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator, +dnl hardcode_direct, hardcode_minus_L. +AC_DEFUN([AC_LIB_RPATH], +[ + dnl Tell automake >= 1.10 to complain if config.rpath is missing. + m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) + AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS + AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld + AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host + AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir + AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + ]) + wl="$acl_cv_wl" + libext="$acl_cv_libext" + shlibext="$acl_cv_shlibext" + hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + hardcode_direct="$acl_cv_hardcode_direct" + hardcode_minus_L="$acl_cv_hardcode_minus_L" + dnl Determine whether the user wants rpath handling at all. + AC_ARG_ENABLE(rpath, + [ --disable-rpath do not hardcode runtime library paths], + :, enable_rpath=yes) +]) + +dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. +AC_DEFUN([AC_LIB_LINKFLAGS_BODY], +[ + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_LIB_ARG_WITH([lib$1-prefix], +[ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib + --without-lib$1-prefix don't search for lib$1 in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi +]) + dnl Search the library and its dependencies in $additional_libdir and + dnl $LDFLAGS. Using breadth-first-seach. + LIB[]NAME= + LTLIB[]NAME= + INC[]NAME= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='$1 $2' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + dnl See if it was already located by an earlier AC_LIB_LINKFLAGS + dnl or AC_LIB_HAVE_LINKFLAGS call. + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" + else + dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined + dnl that this library doesn't exist. So just drop it. + : + fi + else + dnl Search the library lib$name in $additional_libdir and $LDFLAGS + dnl and the already constructed $LIBNAME/$LTLIBNAME. + found_dir= + found_la= + found_so= + found_a= + if test $use_additional = yes; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + found_dir="$additional_libdir" + found_so="$additional_libdir/lib$name.$shlibext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + else + if test -f "$additional_libdir/lib$name.$libext"; then + found_dir="$additional_libdir" + found_a="$additional_libdir/lib$name.$libext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + found_dir="$dir" + found_so="$dir/lib$name.$shlibext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + else + if test -f "$dir/lib$name.$libext"; then + found_dir="$dir" + found_a="$dir/lib$name.$libext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + dnl Found the library. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + dnl Linking with a shared library. We attempt to hardcode its + dnl directory into the executable's runpath, unless it's the + dnl standard /usr/lib. + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then + dnl No hardcoding is needed. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + dnl The hardcoding into $LIBNAME is system dependent. + if test "$hardcode_direct" = yes; then + dnl Using DIR/libNAME.so during linking hardcodes DIR into the + dnl resulting binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + dnl Rely on "-L$found_dir". + dnl But don't add it if it's already contained in the LDFLAGS + dnl or the already constructed $LIBNAME + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" + fi + if test "$hardcode_minus_L" != no; then + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH + dnl here, because this doesn't fit in flags passed to the + dnl compiler. So give up. No hardcoding. This affects only + dnl very old systems. + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + dnl Linking with a static library. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" + else + dnl We shouldn't come here, but anyway it's good to have a + dnl fallback. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" + fi + fi + dnl Assume the include files are nearby. + additional_includedir= + case "$found_dir" in + */lib | */lib/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + dnl Potentially add $additional_includedir to $INCNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's /usr/local/include and we are using GCC on Linux, + dnl 3. if it's already present in $CPPFLAGS or the already + dnl constructed $INCNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INC[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $INCNAME. + INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + dnl Look for dependencies. + if test -n "$found_la"; then + dnl Read the .la file. It defines the variables + dnl dlname, library_names, old_library, dependency_libs, current, + dnl age, revision, installed, dlopen, dlpreopen, libdir. + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + dnl We use only dependency_libs. + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's /usr/local/lib and we are using GCC on Linux, + dnl 3. if it's already present in $LDFLAGS or the already + dnl constructed $LIBNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LIBNAME. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LTLIBNAME. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + dnl Handle this in the next round. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + dnl Handle this in the next round. Throw away the .la's + dnl directory; it is already contained in a preceding -L + dnl option. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + dnl Most likely an immediate library name. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" + ;; + esac + done + fi + else + dnl Didn't find the library; assume it is in the system directories + dnl known to the linker and runtime loader. (All the system + dnl directories known to the linker should also be known to the + dnl runtime loader, otherwise the system is severely misconfigured.) + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$hardcode_libdir_separator"; then + dnl Weird platform: only the last -rpath option counts, the user must + dnl pass all path elements in one option. We can arrange that for a + dnl single library, but not when more than one $LIBNAMEs are used. + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" + done + dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl. + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + else + dnl The -rpath options are cumulative. + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + dnl When using libtool, the option that works for both libraries and + dnl executables is -R. The -R options are cumulative. + for found_dir in $ltrpathdirs; do + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" + done + fi +]) + +dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, +dnl unless already present in VAR. +dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes +dnl contains two or three consecutive elements that belong together. +AC_DEFUN([AC_LIB_APPENDTOVAR], +[ + for element in [$2]; do + haveit= + for x in $[$1]; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + [$1]="${[$1]}${[$1]:+ }$element" + fi + done +]) diff --git a/Watchdog/m4/libtool.m4 b/Watchdog/m4/libtool.m4 new file mode 100644 index 0000000..39ba996 --- /dev/null +++ b/Watchdog/m4/libtool.m4 @@ -0,0 +1,7357 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008 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 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 56 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_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 + +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 "X$cc_temp" | $Xsed -e 's%.*/%%' -e "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 +_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_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])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 +_LT_PROG_ECHO_BACKSLASH + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +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' + +# 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_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 "X$][$1" | $Xsed -e "$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: +# +# ='`$ECHO "X$" | $Xsed -e "$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' + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$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 "X\\\\\$\$var"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Fix-up fallback echo if it was mangled by the above quoting rules. +case \$lt_ECHO in +*'\\\[$]0 --fallback-echo"')dnl " + lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\` + ;; +esac + +_LT_OUTPUT_LIBTOOL_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]) +cat >"$CONFIG_LT" <<_LTEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate a libtool stub with the current configuration. + +lt_cl_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AS_SHELL_SANITIZE +_AS_PREPARE + +exec AS_MESSAGE_FD>&1 +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 ." + +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) 2008 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. +if test "$no_create" != yes; then + 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) +fi +])# 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 '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + _LT_PROG_XSI_SHELLFNS + + sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + 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)], + [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 + + +# _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([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)]) +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], []) + + +# _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 test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 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" + ]) + 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" != ":"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES +# -------------------------- +# 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 + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + _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=echo + _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 +# ----------------------- +# 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. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +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 "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_SHELL_INIT + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[_LT_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$lt_ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +ECHO=${lt_ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then + # Yippee, $ECHO works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat <<_LT_EOF +[$]* +_LT_EOF + exit 0 +fi + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test -z "$lt_ECHO"; then + if test "X${echo_test_string+set}" != Xset; then + # find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if { echo_test_string=`eval $cmd`; } 2>/dev/null && + { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null + then + break + fi + done + fi + + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : + else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$ECHO" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + ECHO='print -r' + elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + ECHO='printf %s\n' + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + ECHO="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + ECHO=echo + fi + fi + fi + fi + fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +lt_ECHO=$ECHO +if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(lt_ECHO) +]) +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], + [An echo program that does not interpret backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _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 __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*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 + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + 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_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[AC_CHECK_TOOL(AR, ar, false) +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1]) + +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 \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi +_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_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:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test x"[$]$2" = xyes; then + 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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -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; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + 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"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ + = "XX$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 __oline__ "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#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 + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + 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:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_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 +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 + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` + else + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # 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; } +}'` + sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` +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 + 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 + 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.so + # instead of lib.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=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) + 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="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${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 + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[123]]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[[3-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + 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 + 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], + [shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + + # 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;/^$/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 + 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 + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + 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 + 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 + 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([], [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@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 + +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 &1 /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 + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + 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 + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +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 Linux ELF. +linux* | k*bsd*-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_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_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. + AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :) + 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:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:__oline__: $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:__oline__: 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_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +AC_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 + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + _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([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};"\ +" /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 + + # 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 +#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. */ +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_save_LIBS="$LIBS" + lt_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_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -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 + +_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_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)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) +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)= + ;; + 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 + ;; + 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) + 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*) + # IBM XL 8.0 on PPC + _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*) + # 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' + ;; + + 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 + 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) + 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' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # 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*) + # IBM XL C 8.0/Fortran 10.1 on PPC + _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)='-Wl,' + ;; + *Sun\ F*) + # 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)='' + ;; + 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*) + _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@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac +AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) + +# +# 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@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]) + +# +# 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_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' + 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 + 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")) && ([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*) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] +], [ + 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_flag_spec_ld, $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 + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_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 + *\ [[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.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +_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 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(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/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + + 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 + ;; + + 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) + 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= + 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; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # 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; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + xl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + 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; $ECHO \"$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*) + # 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)= + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_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 $compiler_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 $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' + 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 $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 + ;; + + 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 $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 + + 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 + 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")) && ([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 + _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 $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; 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 + _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' + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _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. + _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 `$ECHO "X$deplibs" | $Xsed -e '\''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(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + 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 + ;; + + freebsd1*) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_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 -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 -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_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 -a "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${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_flag_spec_ld, $1)='+b $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 -a "$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 -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_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' + ;; + *) + _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 $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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. + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + AC_LINK_IFELSE(int foo(void) {}, + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + ) + LDFLAGS="$save_LDFLAGS" + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -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" && $ECHO "X-set_version $verstring" | $Xsed` -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" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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" && $ECHO "X-set_version $verstring" | $Xsed` -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} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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" && $ECHO "X-set_version $verstring" | $Xsed` -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 "X-set_version $verstring" | $Xsed` -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 ${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 ${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_MSG_CHECKING([whether -lc should be explicitly linked in]) + $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_TAGVAR(archive_cmds_need_lc, $1)=no + else + _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* + AC_MSG_RESULT([$_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_flag_spec_ld], [1], + [[If ld is used when linking, flag to hardcode $libdir into a binary + during linking. This must work even if $libdir does not exist]]) +_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([], [fix_srcfile_path], [1], + [Fix the shell variable $srcfile for the compiler]) +_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([], [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_PROG_CXX +# ------------ +# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++ +# compiler, we have our own version here. +m4_defun([_LT_PROG_CXX], +[ +pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes]) +AC_PROG_CXX +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_CXX + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_CXX], []) + + +# _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], +[AC_REQUIRE([_LT_PROG_CXX])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl + +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_flag_spec_ld, $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(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_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + compiler=$CC + _LT_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 -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_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 "\-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 + _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 $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; 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 + _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' + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _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 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*) + # _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(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 + ;; + 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 + ;; + + freebsd[[12]]*) + # 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*) + ;; + + 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; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_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; $ECHO "X$list" | $Xsed' + ;; + *) + 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 -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_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" && $ECHO "X-set_version $verstring" | $Xsed` -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 -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -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) + 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; $ECHO "X$list" | $Xsed' + + _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 | $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 | $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 | $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 | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 will 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; $ECHO \"$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=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + xl*) + # 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; $ECHO \"$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='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_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=echo + 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" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -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" && $ECHO "X-set_version $verstring" | $Xsed` -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 "X-set_version $verstring" | $Xsed` -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=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + 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" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${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 "\-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*) + # 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='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_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 -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 -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_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 "\-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(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 + 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_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 +# 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 +]) +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 $p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p in + -L* | -R*) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_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 + ;; + + *.$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 + +# 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*) + # 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_PROG_F77 +# ------------ +# Since AC_PROG_F77 is broken, in that it returns the empty string +# if there is no fortran compiler, we have our own version here. +m4_defun([_LT_PROG_F77], +[ +pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes]) +AC_PROG_F77 +if test -z "$F77" || test "X$F77" = "Xno"; then + _lt_disable_F77=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_F77 + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_F77], []) + + +# _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_REQUIRE([_LT_PROG_F77])dnl +AC_LANG_PUSH(Fortran 77) + +_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_flag_spec_ld, $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(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 + CC=${F77-"f77"} + 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" +fi # test "$_lt_disable_F77" != yes + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_PROG_FC +# ----------- +# Since AC_PROG_FC is broken, in that it returns the empty string +# if there is no fortran compiler, we have our own version here. +m4_defun([_LT_PROG_FC], +[ +pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes]) +AC_PROG_FC +if test -z "$FC" || test "X$FC" = "Xno"; then + _lt_disable_FC=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_FC + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_FC], []) + + +# _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_REQUIRE([_LT_PROG_FC])dnl +AC_LANG_PUSH(Fortran) + +_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_flag_spec_ld, $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(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 + CC=${FC-"f95"} + 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" +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_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +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 + +## 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" +])# _LT_LANG_GCJ_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_GCC=$GCC +GCC= +CC=${RC-"windres"} +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" +])# _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_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_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"}, \ + = c,a/b,, \ + && 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_XSI_SHELLFNS +# --------------------- +# Bourne and XSI compatible variants of some useful shell functions. +m4_defun([_LT_PROG_XSI_SHELLFNS], +[case $xsi_shell in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# 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 () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac +} + +# func_basename file +func_basename () +{ + func_basename_result="${1##*/}" +} + +# 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 () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}" +} + +# 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_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}"} +} + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=${1%%=*} + func_opt_split_arg=${1#*=} +} + +# func_lo2o object +func_lo2o () +{ + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=${1%.*}.lo +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=$(( $[*] )) +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=${#1} +} + +_LT_EOF + ;; + *) # Bourne compatible functions. + cat << \_LT_EOF >> "$cfgfile" + +# 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 () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "X${1}" | $Xsed -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 file +func_basename () +{ + func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +} + +dnl func_dirname_and_basename +dnl A portable version of this function is already defined in general.m4sh +dnl so there is no need for it here. + +# 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 "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; + esac +} + +# sed scripts: +my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q' +my_sed_long_arg='1s/^-[[^=]]*=//' + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` + func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` +} + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'` +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "$[@]"` +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len` +} + +_LT_EOF +esac + +case $lt_shell_append in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$[1]+=\$[2]" +} +_LT_EOF + ;; + *) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$[1]=\$$[1]\$[2]" +} + +_LT_EOF + ;; + esac +]) diff --git a/Watchdog/m4/ltoptions.m4 b/Watchdog/m4/ltoptions.m4 new file mode 100644 index 0000000..34151a3 --- /dev/null +++ b/Watchdog/m4/ltoptions.m4 @@ -0,0 +1,368 @@ +# Helper functions for option handling. -*- 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 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], [0], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [0], [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], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [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/Watchdog/m4/ltsugar.m4 b/Watchdog/m4/ltsugar.m4 new file mode 100644 index 0000000..9000a05 --- /dev/null +++ b/Watchdog/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/Watchdog/m4/ltversion.m4 b/Watchdog/m4/ltversion.m4 new file mode 100644 index 0000000..b8e154f --- /dev/null +++ b/Watchdog/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. + +# Generated from ltversion.in. + +# serial 3012 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.2.6]) +m4_define([LT_PACKAGE_REVISION], [1.3012]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.2.6' +macro_revision='1.3012' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) diff --git a/Watchdog/m4/lt~obsolete.m4 b/Watchdog/m4/lt~obsolete.m4 new file mode 100644 index 0000000..637bb20 --- /dev/null +++ b/Watchdog/m4/lt~obsolete.m4 @@ -0,0 +1,92 @@ +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007 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 4 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_RC], [AC_DEFUN([AC_LIBTOOL_RC])]) +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])]) diff --git a/Watchdog/missing b/Watchdog/missing new file mode 100755 index 0000000..1c8ff70 --- /dev/null +++ b/Watchdog/missing @@ -0,0 +1,367 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2006-05-10.23 + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006 +# Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: +sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' +sed_minuso='s/.* -o \([^ ]*\).*/\1/p' + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case $1 in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + autom4te touch the output file, or create a stub one + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + +esac + +# Now exit if we have it, but it failed. Also exit now if we +# don't have it and --version was passed (most likely to detect +# the program). +case $1 in + lex|yacc) + # Not GNU programs, they don't have --version. + ;; + + tar) + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + exit 1 + fi + ;; + + *) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + # Could not run --version or --help. This is probably someone + # running `$TOOL --version' or `$TOOL --help' to check whether + # $TOOL exists and not knowing $TOOL uses missing. + exit 1 + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case $1 in + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case $f in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te) + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if test ! -f y.tab.h; then + echo >y.tab.h + fi + if test ! -f y.tab.c; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if test ! -f lex.yy.c; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit 1 + fi + ;; + + makeinfo) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + # The file to touch is that specified with -o ... + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -z "$file"; then + # ... or it is the one specified with @setfilename ... + infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n ' + /^@setfilename/{ + s/.* \([^ ]*\) *$/\1/ + p + q + }' $infile` + # ... or it is derived from the source name (dir/f.texi becomes f.info) + test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info + fi + # If the file does not exist, the user really needs makeinfo; + # let's fail without touching anything. + test -f $file || exit 1 + touch $file + ;; + + tar) + shift + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar "$@" && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar "$@" && exit 0 + fi + firstarg="$1" + if shift; then + case $firstarg in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + case $firstarg in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/Watchdog/mkinstalldirs b/Watchdog/mkinstalldirs new file mode 100755 index 0000000..ef7e16f --- /dev/null +++ b/Watchdog/mkinstalldirs @@ -0,0 +1,161 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy + +scriptversion=2006-05-11.19 + +# Original author: Noah Friedman +# Created: 1993-05-16 +# Public domain. +# +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +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 ." + +# process command line arguments +while test $# -gt 0 ; do + case $1 in + -h | --help | --h*) # -h for help + echo "$usage" + exit $? + ;; + -m) # -m PERM arg + shift + test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } + dirmode=$1 + shift + ;; + --version) + echo "$0 $scriptversion" + exit $? + ;; + --) # stop option processing + shift + break + ;; + -*) # unknown option + echo "$usage" 1>&2 + exit 1 + ;; + *) # first non-opt arg + break + ;; + esac +done + +for file +do + if test -d "$file"; then + shift + else + break + fi +done + +case $# in + 0) exit 0 ;; +esac + +# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and +# mkdir -p a/c at the same time, both will detect that a is missing, +# one will create a, then the other will try to create a and die with +# a "File exists" error. This is a problem when calling mkinstalldirs +# from a parallel make. We use --version in the probe to restrict +# ourselves to GNU mkdir, which is thread-safe. +case $dirmode in + '') + if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + test -d ./-p && rmdir ./-p + test -d ./--version && rmdir ./--version + fi + ;; + *) + if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && + test ! -d ./--version; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + else + # Clean up after NextStep and OpenStep mkdir. + for d in ./-m ./-p ./--version "./$dirmode"; + do + test -d $d && rmdir $d + done + fi + ;; +esac + +for file +do + case $file in + /*) pathcomp=/ ;; + *) pathcomp= ;; + esac + oIFS=$IFS + IFS=/ + set fnord $file + shift + IFS=$oIFS + + for d + do + test "x$d" = x && continue + + pathcomp=$pathcomp$d + case $pathcomp in + -*) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + else + if test ! -z "$dirmode"; then + echo "chmod $dirmode $pathcomp" + lasterr= + chmod "$dirmode" "$pathcomp" || lasterr=$? + + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi + fi + fi + + pathcomp=$pathcomp/ + done +done + +exit $errstatus + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/Watchdog/pwl-config.h.in b/Watchdog/pwl-config.h.in new file mode 100644 index 0000000..44a54ee --- /dev/null +++ b/Watchdog/pwl-config.h.in @@ -0,0 +1,84 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the declaration of `getenv', and to 0 if you don't. + */ +#undef PWL_HAVE_DECL_GETENV + +/* Define to 1 if you have the header file. */ +#undef PWL_HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef PWL_HAVE_FENV_H + +/* Define to 1 if you have the header file. */ +#undef PWL_HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef PWL_HAVE_MEMORY_H + +/* Define to 1 if you have the `setitimer' function. */ +#undef HAVE_SETITIMER + +/* Define to 1 if the system has the type `siginfo_t'. */ +#undef HAVE_SIGINFO_T + +/* Define to 1 if you have the header file. */ +#undef PWL_HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef PWL_HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef PWL_HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef PWL_HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef PWL_HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef PWL_HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#undef PWL_HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef PWL_HAVE_UNISTD_H + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#undef LT_OBJDIR + +/* Assertions are disabled when this is defined */ +#undef NDEBUG + +/* Define to the address where bug reports for this package should be sent. */ +#undef PWL_PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PWL_PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PWL_PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PWL_PACKAGE_TARNAME + +/* Define to the version of this package. */ +#undef PWL_PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef PWL_STDC_HEADERS + +/* Define to 1 if you can safely include both and . */ +#undef PWL_TIME_WITH_SYS_TIME + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + + +#ifdef PWL_NDEBUG +# define NDEBUG PWL_NDEBUG +#endif + diff --git a/Watchdog/pwl-config.sed b/Watchdog/pwl-config.sed new file mode 100644 index 0000000..960a73e --- /dev/null +++ b/Watchdog/pwl-config.sed @@ -0,0 +1,21 @@ +s/\([^A-Z_]\)HAVE_DECL_GETENV/\1PWL_HAVE_DECL_GETENV/g +s/\([^A-Z_]\)HAVE_DLFCN_H/\1PWL_HAVE_DLFCN_H/g +s/\([^A-Z_]\)HAVE_FENV_H/\1PWL_HAVE_FENV_H/g +s/\([^A-Z_]\)HAVE_INTTYPES_H/\1PWL_HAVE_INTTYPES_H/g +s/\([^A-Z_]\)HAVE_MEMORY_H/\1PWL_HAVE_MEMORY_H/g +s/\([^A-Z_]\)HAVE_SETITIMER_H/\1PWL_HAVE_SETITIMER_H/g +s/\([^A-Z_]\)HAVE_STDINT_H/\1PWL_HAVE_STDINT_H/g +s/\([^A-Z_]\)HAVE_STDLIB_H/\1PWL_HAVE_STDLIB_H/g +s/\([^A-Z_]\)HAVE_STRINGS_H/\1PWL_HAVE_STRINGS_H/g +s/\([^A-Z_]\)HAVE_STRING_H/\1PWL_HAVE_STRING_H/g +s/\([^A-Z_]\)HAVE_SYS_STAT_H/\1PWL_HAVE_SYS_STAT_H/g +s/\([^A-Z_]\)HAVE_SYS_TIME_H/\1PWL_HAVE_SYS_TIME_H/g +s/\([^A-Z_]\)HAVE_SYS_TYPES_H/\1PWL_HAVE_SYS_TYPES_H/g +s/\([^A-Z_]\)HAVE_UNISTD_H/\1PWL_HAVE_UNISTD_H/g +s/\([^A-Z_]\)PACKAGE_BUGREPORT/\1PWL_PACKAGE_BUGREPORT/g +s/\([^A-Z_]\)PACKAGE_NAME/\1PWL_PACKAGE_NAME/g +s/\([^A-Z_]\)PACKAGE_STRING/\1PWL_PACKAGE_STRING/g +s/\([^A-Z_]\)PACKAGE_TARNAME/\1PWL_PACKAGE_TARNAME/g +s/\([^A-Z_]\)PACKAGE_VERSION/\1PWL_PACKAGE_VERSION/g +s/\([^A-Z_]\)STDC_HEADERS/\1PWL_STDC_HEADERS/g +s/\([^A-Z_]\)TIME_WITH_SYS_TIME/\1PWL_TIME_WITH_SYS_TIME/g diff --git a/Watchdog/src/Doubly_Linked_Object.defs.hh b/Watchdog/src/Doubly_Linked_Object.defs.hh new file mode 100644 index 0000000..fd00eef --- /dev/null +++ b/Watchdog/src/Doubly_Linked_Object.defs.hh @@ -0,0 +1,64 @@ +/* Doubly_Linked_Object class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Watchdog Library (PWL). + +The PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PWL_Doubly_Linked_Object_defs_hh +#define PWL_Doubly_Linked_Object_defs_hh 1 + +#include "Doubly_Linked_Object.types.hh" +#include "EList.types.hh" +#include "EList_Iterator.types.hh" + +//! A (base) class for doubly linked objects. +class Parma_Watchdog_Library::Doubly_Linked_Object { +public: + //! Default constructor. + Doubly_Linked_Object(); + + //! Creates a chain element with forward link \p f and backward link \p b. + Doubly_Linked_Object(Doubly_Linked_Object* f, Doubly_Linked_Object* b); + + //! Inserts \p y before \p *this. + void insert_before(Doubly_Linked_Object& y); + + //! Inserts \p y after \p *this. + void insert_after(Doubly_Linked_Object& y); + + //! Erases \p *this from the chain and returns a pointer to the next element. + Doubly_Linked_Object* erase(); + + //! Erases \p *this from the chain. + ~Doubly_Linked_Object(); + +private: + //! Forward link. + Doubly_Linked_Object* next; + + //! Backward link. + Doubly_Linked_Object* prev; + + template friend class EList; + template friend class EList_Iterator; +}; + +#include "Doubly_Linked_Object.inlines.hh" + +#endif // !defined(PWL_Doubly_Linked_Object_defs_hh) diff --git a/Watchdog/src/Doubly_Linked_Object.inlines.hh b/Watchdog/src/Doubly_Linked_Object.inlines.hh new file mode 100644 index 0000000..cd6210a --- /dev/null +++ b/Watchdog/src/Doubly_Linked_Object.inlines.hh @@ -0,0 +1,69 @@ +/* Doubly_Linked_Object class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Watchdog Library (PWL). + +The PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PWL_Doubly_Linked_Object_inlines_hh +#define PWL_Doubly_Linked_Object_inlines_hh 1 + +namespace Parma_Watchdog_Library { + +inline +Doubly_Linked_Object::Doubly_Linked_Object() { +} + +inline +Doubly_Linked_Object::Doubly_Linked_Object(Doubly_Linked_Object* f, + Doubly_Linked_Object* b) + : next(f), + prev(b) { +} + +inline void +Doubly_Linked_Object::insert_before(Doubly_Linked_Object& y) { + y.next = this; + y.prev = prev; + prev->next = &y; + prev = &y; +} + +inline void +Doubly_Linked_Object::insert_after(Doubly_Linked_Object& y) { + y.next = next; + y.prev = this; + next->prev = &y; + next = &y; +} + +inline Doubly_Linked_Object* +Doubly_Linked_Object::erase() { + next->prev = prev; + prev->next = next; + return next; +} + +inline +Doubly_Linked_Object::~Doubly_Linked_Object() { + erase(); +} + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_Doubly_Linked_Object_inlines_hh) diff --git a/Watchdog/src/Doubly_Linked_Object.types.hh b/Watchdog/src/Doubly_Linked_Object.types.hh new file mode 100644 index 0000000..3d0387c --- /dev/null +++ b/Watchdog/src/Doubly_Linked_Object.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PWL_Doubly_Linked_Object_types_hh +#define PWL_Doubly_Linked_Object_types_hh 1 + +namespace Parma_Watchdog_Library { + +class Doubly_Linked_Object; + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_Doubly_Linked_Object_types_hh) diff --git a/Watchdog/src/EList.defs.hh b/Watchdog/src/EList.defs.hh new file mode 100644 index 0000000..e16ceb0 --- /dev/null +++ b/Watchdog/src/EList.defs.hh @@ -0,0 +1,87 @@ +/* EList class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Watchdog Library (PWL). + +The PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PWL_EList_defs_hh +#define PWL_EList_defs_hh 1 + +#include "EList.types.hh" +#include "EList_Iterator.defs.hh" + +/*! \brief + A simple kind of embedded list (i.e., a doubly linked objects + where the links are embedded in the objects themselves). +*/ +template +class Parma_Watchdog_Library::EList : private Doubly_Linked_Object { +public: + //! A const iterator to traverse the list. + typedef EList_Iterator Const_Iterator; + + //! A non-const iterator to traverse the list. + typedef EList_Iterator 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 true if and only if the list is empty. + bool empty() const; + + //! Returns an iterator pointing to the beginning of the list. + Iterator begin(); + + //! Returns an iterator pointing one past the last element in the list. + Iterator end(); + + //! Returns a const iterator pointing to the beginning of the list. + Const_Iterator begin() const; + + //! Returns a const iterator pointing one past the last element in the list. + Const_Iterator end() const; + + //! Checks if all the invariants are satisfied. + bool OK() const; +}; + +#include "EList.inlines.hh" + +#endif // !defined(PWL_EList_defs_hh) diff --git a/Watchdog/src/EList.inlines.hh b/Watchdog/src/EList.inlines.hh new file mode 100644 index 0000000..28a3a61 --- /dev/null +++ b/Watchdog/src/EList.inlines.hh @@ -0,0 +1,112 @@ +/* EList class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Watchdog Library (PWL). + +The PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PWL_EList_inlines_hh +#define PWL_EList_inlines_hh 1 + +namespace Parma_Watchdog_Library { + +template +inline +EList::EList() + : Doubly_Linked_Object(this, this) { +} + +template +inline void +EList::push_front(T& obj) { + next->insert_before(obj); +} + +template +inline void +EList::push_back(T& obj) { + prev->insert_after(obj); +} + +template +inline typename EList::Iterator +EList::insert(Iterator position, T& obj) { + position->insert_before(obj); + return Iterator(&obj); +} + +template +inline typename EList::Iterator +EList::begin() { + return Iterator(next); +} + +template +inline typename EList::Iterator +EList::end() { + return Iterator(this); +} + +template +inline typename EList::Const_Iterator +EList::begin() const { + return Const_Iterator(next); +} + +template +inline typename EList::Const_Iterator +EList::end() const { + return Const_Iterator(const_cast*>(this)); +} + +template +inline bool +EList::empty() const { + return begin() == end(); +} + +template +inline typename EList::Iterator +EList::erase(Iterator position) { + assert(!empty()); + return Iterator(position->erase()); +} + +template +inline +EList::~EList() { + // Erase and deallocate all the elements. + for (Iterator i = begin(), lend = end(), next; i != lend; i = next) { + next = erase(i); + delete &*i; + } +} + +template +inline bool +EList::OK() const { + for (Const_Iterator i = begin(), lend = end(); i != lend; ++i) + if (!i->OK()) + return false; + + return true; +} + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_EList_inlines_hh) diff --git a/Watchdog/src/EList.types.hh b/Watchdog/src/EList.types.hh new file mode 100644 index 0000000..7239f98 --- /dev/null +++ b/Watchdog/src/EList.types.hh @@ -0,0 +1,22 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PWL_EList_types_hh +#define PWL_EList_types_hh 1 + +namespace Parma_Watchdog_Library { + +template +class EList; + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_EList_types_hh) diff --git a/Watchdog/src/EList_Iterator.defs.hh b/Watchdog/src/EList_Iterator.defs.hh new file mode 100644 index 0000000..8c593fa --- /dev/null +++ b/Watchdog/src/EList_Iterator.defs.hh @@ -0,0 +1,83 @@ +/* EList_Iterator class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Watchdog Library (PWL). + +The PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PWL_EList_Iterator_defs_hh +#define PWL_EList_Iterator_defs_hh 1 + +#include "EList_Iterator.types.hh" +#include "Doubly_Linked_Object.types.hh" + +namespace Parma_Watchdog_Library { + +//! Returns true if and only if \p x and \p y are equal. +template +bool operator==(const EList_Iterator& x, const EList_Iterator& y); + +//! Returns true if and only if \p x and \p y are different. +template +bool operator!=(const EList_Iterator& x, const EList_Iterator& y); + +} // namespace Parma_Watchdog_Library + +//! A class providing iterators for embedded lists. +template +class Parma_Watchdog_Library::EList_Iterator { +public: + //! Constructs an iterator pointing to nothing. + EList_Iterator(); + + //! Constructs an iterator pointing to \p p. + explicit EList_Iterator(Doubly_Linked_Object* p); + + //! Changes \p *this so that it points to \p p. + EList_Iterator& operator=(Doubly_Linked_Object* p); + + //! Indirect member selector. + T* operator->(); + + //! Dereference operator. + T& operator*(); + + //! Preincrement operator. + EList_Iterator& operator++(); + + //! Postincrement operator. + EList_Iterator operator++(int); + + //! Predecrement operator. + EList_Iterator& operator--(); + + //! Postdecrement operator. + EList_Iterator operator--(int); + +private: + //! Embedded pointer. + Doubly_Linked_Object* ptr; + + friend bool operator==(const EList_Iterator& x, const EList_Iterator& y); + + friend bool operator!=(const EList_Iterator& x, const EList_Iterator& y); +}; + +#include "EList_Iterator.inlines.hh" + +#endif // !defined(PWL_EList_Iterator_defs_hh) diff --git a/Watchdog/src/EList_Iterator.inlines.hh b/Watchdog/src/EList_Iterator.inlines.hh new file mode 100644 index 0000000..b35cf4a --- /dev/null +++ b/Watchdog/src/EList_Iterator.inlines.hh @@ -0,0 +1,104 @@ +/* EList_Iterator class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Watchdog Library (PWL). + +The PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PWL_EList_Iterator_inlines_hh +#define PWL_EList_Iterator_inlines_hh 1 + +#include "Doubly_Linked_Object.defs.hh" + +namespace Parma_Watchdog_Library { + +template +inline +EList_Iterator::EList_Iterator() { +} + +template +inline +EList_Iterator::EList_Iterator(Doubly_Linked_Object* p) + : ptr(p) { +} + +template +inline EList_Iterator& +EList_Iterator::operator=(Doubly_Linked_Object* p) { + ptr = p; + return *this; +} + +template +inline T* +EList_Iterator::operator->() { + return static_cast(ptr); +} + +template +inline T& +EList_Iterator::operator*() { + return *operator->(); +} + +template +inline EList_Iterator& +EList_Iterator::operator++() { + ptr = ptr->next; + return *this; +} + +template +inline EList_Iterator +EList_Iterator::operator++(int) { + EList_Iterator tmp = *this; + ++*this; + return tmp; +} + +template +inline EList_Iterator& +EList_Iterator::operator--() { + ptr = ptr->prev; + return *this; +} + +template +inline EList_Iterator +EList_Iterator::operator--(int) { + EList_Iterator tmp = *this; + --*this; + return tmp; +} + +template +inline bool +operator==(const EList_Iterator& x, const EList_Iterator& y) { + return x.ptr == y.ptr; +} + +template +inline bool +operator!=(const EList_Iterator& x, const EList_Iterator& y) { + return x.ptr != y.ptr; +} + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_EList_Iterator_inlines_hh) diff --git a/Watchdog/src/EList_Iterator.types.hh b/Watchdog/src/EList_Iterator.types.hh new file mode 100644 index 0000000..d0d2c04 --- /dev/null +++ b/Watchdog/src/EList_Iterator.types.hh @@ -0,0 +1,22 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PWL_EList_Iterator_types_hh +#define PWL_EList_Iterator_types_hh 1 + +namespace Parma_Watchdog_Library { + +template +class EList_Iterator; + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_EList_Iterator_types_hh) diff --git a/Watchdog/src/Handler.defs.hh b/Watchdog/src/Handler.defs.hh new file mode 100644 index 0000000..1a58d20 --- /dev/null +++ b/Watchdog/src/Handler.defs.hh @@ -0,0 +1,90 @@ +/* Handler and derived classes' declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Watchdog Library (PWL). + +The PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PWL_Handler_defs_hh +#define PWL_Handler_defs_hh 1 + +#include "Handler.types.hh" + +//! Abstract base class for handlers of the watchdog events. +class Parma_Watchdog_Library::Handler { +public: + //! Does the job. + virtual void act() const = 0; + + //! Virtual destructor. + virtual ~Handler(); +}; + +//! A kind of Handler that installs a flag onto a flag-holder. +/*! + The template class Handler_Flag is an handler whose + job is to install a flag onto an holder 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 Flag* to an entity of type + Flag_Base*. + 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 +class Parma_Watchdog_Library::Handler_Flag : virtual public Handler { +public: + //! Constructor with a given function. + Handler_Flag(const Flag_Base* volatile& holder, Flag& flag); + + //! Does its job: installs the flag onto the holder, if a flag with + //! an higher priority has not already been installed. + void act() const; + +private: + // declare holder as reference to volatile pointer to const Flag_Base + const Flag_Base* volatile& h; + Flag& f; +}; + +//! A kind of Handler calling a given function. +class Parma_Watchdog_Library::Handler_Function : virtual public Handler { +public: + //! Constructor with a given function. + Handler_Function(void (*function)()); + + //! Does its job: calls the embedded function. + void act() const; + +private: + //! Pointer to the embedded function. + void (*f)(); +}; + +#include "Handler.inlines.hh" + +#endif // !defined(PWL_Handler_defs_hh) diff --git a/Watchdog/src/Handler.inlines.hh b/Watchdog/src/Handler.inlines.hh new file mode 100644 index 0000000..87a0ecd --- /dev/null +++ b/Watchdog/src/Handler.inlines.hh @@ -0,0 +1,57 @@ +/* Handler and derived classes' implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Watchdog Library (PWL). + +The PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PWL_Handler_inlines_hh +#define PWL_Handler_inlines_hh 1 + +namespace Parma_Watchdog_Library { + +inline +Handler::~Handler() { +} + +template +Handler_Flag::Handler_Flag(const Flag_Base* volatile& holder, + Flag& flag) + : h(holder), f(flag) { +} + +template +void +Handler_Flag::act() const { + if (h == 0 || static_cast(*h).priority() < f.priority()) + h = &f; +} + +inline +Handler_Function::Handler_Function(void (*function)()) + : f(function) { +} + +inline void +Handler_Function::act() const { + (*f)(); +} + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_Handler_inlines_hh) diff --git a/Watchdog/src/Handler.types.hh b/Watchdog/src/Handler.types.hh new file mode 100644 index 0000000..37e92da --- /dev/null +++ b/Watchdog/src/Handler.types.hh @@ -0,0 +1,26 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PWL_Handler_types_hh +#define PWL_Handler_types_hh 1 + +namespace Parma_Watchdog_Library { + +class Handler; + +template +class Handler_Flag; + +class Handler_Function; + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_Handler_types_hh) diff --git a/Watchdog/src/Makefile.am b/Watchdog/src/Makefile.am new file mode 100644 index 0000000..ef8b667 --- /dev/null +++ b/Watchdog/src/Makefile.am @@ -0,0 +1,150 @@ +# Automake source file for the Parma Watchdog Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Watchdog Library (PWL). +# +# The PWL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PWL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . */ + +# The ordering of the following list *matters*! +INCLUDE_FILES = \ +Doubly_Linked_Object.types.hh \ +EList.types.hh \ +EList_Iterator.types.hh \ +Handler.types.hh \ +Pending_Element.types.hh \ +Pending_List.types.hh \ +Time.types.hh \ +Watchdog.types.hh \ +Handler.defs.hh \ +Handler.inlines.hh \ +Time.defs.hh \ +Time.inlines.hh \ +Doubly_Linked_Object.defs.hh \ +Doubly_Linked_Object.inlines.hh \ +EList_Iterator.defs.hh \ +EList_Iterator.inlines.hh \ +EList.defs.hh \ +EList.inlines.hh \ +Pending_Element.defs.hh \ +Pending_Element.inlines.hh \ +Pending_List.defs.hh \ +Pending_List.inlines.hh \ +Watchdog.defs.hh \ +Watchdog.inlines.hh + +SOURCE_FILES = \ +$(INCLUDE_FILES) \ +Pending_Element.cc \ +Pending_List.cc \ +Time.cc \ +Watchdog.cc + +EXTRA_DIST = \ +$(SOURCE_FILES) \ +pwl_header.hh + +# Libtool -version-info for libpwl.la. +# +# 1. Start with version information of `0:0:0' for each Libtool library. +# +# 2. Update the version information only immediately before a public +# release of your software. More frequent updates are unnecessary, +# and only guarantee that the current interface number gets larger +# faster. +# +# 3. If the library source code has changed at all since the last +# update, then increment REVISION (`C:R:A' becomes `C:r+1:A'). +# +# 4. If any interfaces have been added, removed, or changed since the +# last update, increment CURRENT, and set REVISION to 0. +# +# 5. If any interfaces have been added since the last public release, +# then increment AGE. +# +# 6. If any interfaces have been removed since the last public release, +# then set AGE to 0. +# +# PWL release (with PPL release) -version-info +# 0.1 0.4 0:0:0 +# 0.2 0.5 1:0:0 +# 0.3 0.6 2:0:0 +# 0.4 0.7 3:0:0 +# 0.4 0.8 3:0:0 +# 0.5 0.9 3:0:0 +# 0.6 0.10 4:0:0 +# 0.7 0.10.1 4:0:0 +# 0.7 0.10.2 4:0:0 + +LIBPWL_LT_CURRENT = 4 +LIBPWL_LT_REVISION = 0 +LIBPWL_LT_AGE = 0 + +lib_LTLIBRARIES = libpwl.la +libpwl_la_SOURCES = $(SOURCE_FILES) + +if NO_UNDEFINED + +NO_UNDEFINED_FLAG = -no-undefined + +endif NO_UNDEFINED + +libpwl_la_LDFLAGS = \ +$(NO_UNDEFINED_FLAG) \ +-version-info $(LIBPWL_LT_CURRENT):$(LIBPWL_LT_REVISION):$(LIBPWL_LT_AGE) + +include_HEADERS = pwl.hh + +nodist_noinst_HEADERS = pwl_include_files.hh + +pwl_include_files.hh: $(INCLUDE_FILES) Makefile + rm -f $@ + for file in $(INCLUDE_FILES); \ + do \ + printf "#include \"%s\"\n" $$file >>$@; \ + done + +if HAVE_PERL + +pwl.hh: $(top_builddir)/pwl-config.h pwl_header.hh pwl_include_files.hh $(top_builddir)/utils/build_header + $(top_builddir)/utils/build_header \ + -I $(top_builddir) -I $(top_builddir)/src \ + $(top_srcdir)/src/pwl_header.hh >$@ + +else !HAVE_PERL + +pwl.hh: pwl.hh.dist + cp -f $< $@ + +endif !HAVE_PERL + +BUILT_SOURCES = \ +$(include_HEADERS) \ +$(nodist_noinst_HEADERS) + +# pwl.hh is not distributed. +# pwl.hh.dist, which is distributed, is a copy of pwl.hh. +dist-hook: + mv -f $(distdir)/pwl.hh $(distdir)/pwl.hh.dist + +CLEANFILES = $(BUILT_SOURCES) + +$(top_builddir)/utils/build_header: + $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils build_header + +$(top_builddir)/pwl-config.h: + $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir) pwl-config.h diff --git a/Watchdog/src/Makefile.in b/Watchdog/src/Makefile.in new file mode 100644 index 0000000..4283c7c --- /dev/null +++ b/Watchdog/src/Makefile.in @@ -0,0 +1,659 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Watchdog Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Watchdog Library (PWL). +# +# The PWL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PWL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . */ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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 = src +DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" +libLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(lib_LTLIBRARIES) +libpwl_la_LIBADD = +am__objects_1 = +am__objects_2 = $(am__objects_1) Pending_Element.lo Pending_List.lo \ + Time.lo Watchdog.lo +am_libpwl_la_OBJECTS = $(am__objects_2) +libpwl_la_OBJECTS = $(am_libpwl_la_OBJECTS) +libpwl_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(libpwl_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libpwl_la_SOURCES) +DIST_SOURCES = $(libpwl_la_SOURCES) +includeHEADERS_INSTALL = $(INSTALL_HEADER) +HEADERS = $(include_HEADERS) $(nodist_noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VALGRIND = @VALGRIND@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +datadir = @datadir@ +datarootdir = @datarootdir@ +debug_flag = @debug_flag@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# The ordering of the following list *matters*! +INCLUDE_FILES = \ +Doubly_Linked_Object.types.hh \ +EList.types.hh \ +EList_Iterator.types.hh \ +Handler.types.hh \ +Pending_Element.types.hh \ +Pending_List.types.hh \ +Time.types.hh \ +Watchdog.types.hh \ +Handler.defs.hh \ +Handler.inlines.hh \ +Time.defs.hh \ +Time.inlines.hh \ +Doubly_Linked_Object.defs.hh \ +Doubly_Linked_Object.inlines.hh \ +EList_Iterator.defs.hh \ +EList_Iterator.inlines.hh \ +EList.defs.hh \ +EList.inlines.hh \ +Pending_Element.defs.hh \ +Pending_Element.inlines.hh \ +Pending_List.defs.hh \ +Pending_List.inlines.hh \ +Watchdog.defs.hh \ +Watchdog.inlines.hh + +SOURCE_FILES = \ +$(INCLUDE_FILES) \ +Pending_Element.cc \ +Pending_List.cc \ +Time.cc \ +Watchdog.cc + +EXTRA_DIST = \ +$(SOURCE_FILES) \ +pwl_header.hh + + +# Libtool -version-info for libpwl.la. +# +# 1. Start with version information of `0:0:0' for each Libtool library. +# +# 2. Update the version information only immediately before a public +# release of your software. More frequent updates are unnecessary, +# and only guarantee that the current interface number gets larger +# faster. +# +# 3. If the library source code has changed at all since the last +# update, then increment REVISION (`C:R:A' becomes `C:r+1:A'). +# +# 4. If any interfaces have been added, removed, or changed since the +# last update, increment CURRENT, and set REVISION to 0. +# +# 5. If any interfaces have been added since the last public release, +# then increment AGE. +# +# 6. If any interfaces have been removed since the last public release, +# then set AGE to 0. +# +# PWL release (with PPL release) -version-info +# 0.1 0.4 0:0:0 +# 0.2 0.5 1:0:0 +# 0.3 0.6 2:0:0 +# 0.4 0.7 3:0:0 +# 0.4 0.8 3:0:0 +# 0.5 0.9 3:0:0 +# 0.6 0.10 4:0:0 +# 0.7 0.10.1 4:0:0 +# 0.7 0.10.2 4:0:0 +LIBPWL_LT_CURRENT = 4 +LIBPWL_LT_REVISION = 0 +LIBPWL_LT_AGE = 0 +lib_LTLIBRARIES = libpwl.la +libpwl_la_SOURCES = $(SOURCE_FILES) +@NO_UNDEFINED_TRUE@NO_UNDEFINED_FLAG = -no-undefined +libpwl_la_LDFLAGS = \ +$(NO_UNDEFINED_FLAG) \ +-version-info $(LIBPWL_LT_CURRENT):$(LIBPWL_LT_REVISION):$(LIBPWL_LT_AGE) + +include_HEADERS = pwl.hh +nodist_noinst_HEADERS = pwl_include_files.hh +BUILT_SOURCES = \ +$(include_HEADERS) \ +$(nodist_noinst_HEADERS) + +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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ + else :; fi; \ + done + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libpwl.la: $(libpwl_la_OBJECTS) $(libpwl_la_DEPENDENCIES) + $(libpwl_la_LINK) -rpath $(libdir) $(libpwl_la_OBJECTS) $(libpwl_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Pending_Element.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Pending_List.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Time.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Watchdog.Plo@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-includeHEADERS: $(include_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" + @list='$(include_HEADERS)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \ + $(includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \ + done + +uninstall-includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(include_HEADERS)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \ + rm -f "$(DESTDIR)$(includedir)/$$f"; \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-includeHEADERS + +install-dvi: install-dvi-am + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-am + +install-info: install-info-am + +install-man: + +install-pdf: install-pdf-am + +install-ps: 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-includeHEADERS uninstall-libLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES clean-libtool ctags dist-hook distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-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 uninstall uninstall-am uninstall-includeHEADERS \ + uninstall-libLTLIBRARIES + + +pwl_include_files.hh: $(INCLUDE_FILES) Makefile + rm -f $@ + for file in $(INCLUDE_FILES); \ + do \ + printf "#include \"%s\"\n" $$file >>$@; \ + done + +@HAVE_PERL_TRUE@pwl.hh: $(top_builddir)/pwl-config.h pwl_header.hh pwl_include_files.hh $(top_builddir)/utils/build_header +@HAVE_PERL_TRUE@ $(top_builddir)/utils/build_header \ +@HAVE_PERL_TRUE@ -I $(top_builddir) -I $(top_builddir)/src \ +@HAVE_PERL_TRUE@ $(top_srcdir)/src/pwl_header.hh >$@ + +@HAVE_PERL_FALSE@pwl.hh: pwl.hh.dist +@HAVE_PERL_FALSE@ cp -f $< $@ + +# pwl.hh is not distributed. +# pwl.hh.dist, which is distributed, is a copy of pwl.hh. +dist-hook: + mv -f $(distdir)/pwl.hh $(distdir)/pwl.hh.dist + +$(top_builddir)/utils/build_header: + $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils build_header + +$(top_builddir)/pwl-config.h: + $(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir) pwl-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/Watchdog/src/Pending_Element.cc b/Watchdog/src/Pending_Element.cc new file mode 100644 index 0000000..51e2274 --- /dev/null +++ b/Watchdog/src/Pending_Element.cc @@ -0,0 +1,32 @@ +/* Pending_Element class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Watchdog Library (PWL). + +The PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Pending_Element.defs.hh" + +namespace PWL = Parma_Watchdog_Library; + +bool +PWL::Pending_Element::OK() const { + return d.OK(); +} diff --git a/Watchdog/src/Pending_Element.defs.hh b/Watchdog/src/Pending_Element.defs.hh new file mode 100644 index 0000000..f7cdae1 --- /dev/null +++ b/Watchdog/src/Pending_Element.defs.hh @@ -0,0 +1,75 @@ +/* Pending_Element class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Watchdog Library (PWL). + +The PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PWL_Pending_Element_defs_hh +#define PWL_Pending_Element_defs_hh 1 + +#include "Pending_Element.types.hh" +#include "Doubly_Linked_Object.defs.hh" +#include "Time.defs.hh" +#include "Handler.types.hh" + +//! A class for pending watchdog events with embedded links. +/*! + Each pending watchdog event is characterized by a deadline (a positive + time interval), an associated handler that will be invoked upon event + expiration, and a Boolean flag that indicates whether the event has already + expired or not. +*/ +class Parma_Watchdog_Library::Pending_Element : public Doubly_Linked_Object { +public: + //! Constructs an element with the given attributes. + Pending_Element(const Time& deadline, + const Handler& handler, + bool& expired_flag); + + //! Modifies \p *this so that it has the given attributes. + void assign(const Time& deadline, + const Handler& handler, + bool& expired_flag); + + //! Returns the deadline of the event. + const Time& deadline() const; + + //! Returns the handler associated to the event. + const Handler& handler() const; + + //! Returns a reference to the "event-expired" flag. + bool& expired_flag() const; + + //! Checks if all the invariants are satisfied. + bool OK() const; + +private: + //! The deadline of the event. + Time d; + + //! A pointer to the handler associated to the event. + const Handler* p_h; + + //! A pointer to a flag saying whether the event has already expired or not. + bool* p_f; +}; + +#include "Pending_Element.inlines.hh" + +#endif // !defined(PWL_Pending_Element_defs_hh) diff --git a/Watchdog/src/Pending_Element.inlines.hh b/Watchdog/src/Pending_Element.inlines.hh new file mode 100644 index 0000000..9eedc09 --- /dev/null +++ b/Watchdog/src/Pending_Element.inlines.hh @@ -0,0 +1,63 @@ +/* Pending_Element class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Watchdog Library (PWL). + +The PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PWL_Pending_Element_inlines_hh +#define PWL_Pending_Element_inlines_hh 1 + +namespace Parma_Watchdog_Library { + +inline +Pending_Element::Pending_Element(const Time& deadline, + const Handler& handler, + bool& expired_flag) + : d(deadline), p_h(&handler), p_f(&expired_flag) { + assert(OK()); +} + +inline void +Pending_Element::assign(const Time& deadline, + const Handler& handler, + bool& expired_flag) { + d = deadline; + p_h = &handler; + p_f = &expired_flag; + assert(OK()); +} + +inline const Time& +Pending_Element::deadline() const { + return d; +} + +inline const Handler& +Pending_Element::handler() const { + return *p_h; +} + +inline bool& +Pending_Element::expired_flag() const { + return *p_f; +} + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_Pending_Element_inlines_hh) diff --git a/Watchdog/src/Pending_Element.types.hh b/Watchdog/src/Pending_Element.types.hh new file mode 100644 index 0000000..b9d7188 --- /dev/null +++ b/Watchdog/src/Pending_Element.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PWL_Pending_Element_types_hh +#define PWL_Pending_Element_types_hh 1 + +namespace Parma_Watchdog_Library { + +class Pending_Element; + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_Pending_Element_types_hh) diff --git a/Watchdog/src/Pending_List.cc b/Watchdog/src/Pending_List.cc new file mode 100644 index 0000000..0ff7708 --- /dev/null +++ b/Watchdog/src/Pending_List.cc @@ -0,0 +1,75 @@ +/* Pending_List class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Watchdog Library (PWL). + +The PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Pending_List.defs.hh" +#include + +namespace PWL = Parma_Watchdog_Library; + +PWL::Pending_List::Iterator +PWL::Pending_List::insert(const Time& deadline, + const Handler& handler, + bool& expired_flag) { + Iterator position = active_list.begin(); + for (Iterator active_list_end = active_list.end(); + position != active_list_end && position->deadline() < deadline; + ++position) + ; + Iterator ppe; + // Only allocate a new element if the free list is empty. + if (free_list.empty()) + ppe = new Pending_Element(deadline, handler, expired_flag); + else { + ppe = free_list.begin(); + free_list.erase(ppe); + ppe->assign(deadline, handler, expired_flag); + } + Iterator r = active_list.insert(position, *ppe); + assert(OK()); + return r; +} + +bool +PWL::Pending_List::OK() const { + if (!active_list.OK()) + return false; + + if (!free_list.OK()) + return false; + + Time t(0); + for (EList::Const_Iterator i = active_list.begin(), + active_list_end = active_list.end(); i != active_list_end; ++i) { + const Time& d = i->deadline(); + if (t > d) { +#ifndef NDEBUG + std::cerr << "The active list is not sorted!" + << std::endl; +#endif + return false; + } + t = d; + } + return true; +} diff --git a/Watchdog/src/Pending_List.defs.hh b/Watchdog/src/Pending_List.defs.hh new file mode 100644 index 0000000..7b4f532 --- /dev/null +++ b/Watchdog/src/Pending_List.defs.hh @@ -0,0 +1,74 @@ +/* Pending_List class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Watchdog Library (PWL). + +The PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PWL_Pending_List_defs_hh +#define PWL_Pending_List_defs_hh 1 + +#include "Pending_List.types.hh" +#include "Pending_Element.defs.hh" +#include "EList.defs.hh" +#include "Time.types.hh" +#include "Handler.types.hh" + +//! An ordered list for recording pending watchdog events. +class Parma_Watchdog_Library::Pending_List { +public: + //! A non-const iterator to traverse the list. + typedef EList::Iterator Iterator; + + //! Constructs an empty list. + Pending_List(); + + //! Destructor. + ~Pending_List(); + + //! Inserts a new Pending_Element object with the given attributes. + Iterator insert(const Time& deadline, + const Handler& handler, + bool& expired_flag); + + /*! \brief + Removes the element pointed to by \p position, returning + an iterator pointing to the next element, if any, or end(), otherwise. + */ + Iterator erase(Iterator position); + + //! Returns true 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 active_list; + EList free_list; +}; + +#include "Pending_List.inlines.hh" + +#endif // !defined(PWL_Pending_List_defs_hh) diff --git a/Watchdog/src/Pending_List.inlines.hh b/Watchdog/src/Pending_List.inlines.hh new file mode 100644 index 0000000..e38f894 --- /dev/null +++ b/Watchdog/src/Pending_List.inlines.hh @@ -0,0 +1,65 @@ +/* Pending_List class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Watchdog Library (PWL). + +The PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PWL_Pending_List_inlines_hh +#define PWL_Pending_List_inlines_hh 1 + +namespace Parma_Watchdog_Library { + +inline +Pending_List::Pending_List() + : active_list(), + free_list() { + assert(OK()); +} + +inline +Pending_List::~Pending_List() { +} + +inline Pending_List::Iterator +Pending_List::begin() { + return active_list.begin(); +} + +inline Pending_List::Iterator +Pending_List::end() { + return active_list.end(); +} + +inline bool +Pending_List::empty() const { + return active_list.empty(); +} + +inline Pending_List::Iterator +Pending_List::erase(Iterator position) { + assert(!empty()); + Iterator next = active_list.erase(position); + free_list.push_back(*position); + assert(OK()); + return next; +} + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_Pending_List_inlines_hh) diff --git a/Watchdog/src/Pending_List.types.hh b/Watchdog/src/Pending_List.types.hh new file mode 100644 index 0000000..3f77f1f --- /dev/null +++ b/Watchdog/src/Pending_List.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PWL_Pending_List_types_hh +#define PWL_Pending_List_types_hh 1 + +namespace Parma_Watchdog_Library { + +class Pending_List; + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_Pending_List_types_hh) diff --git a/Watchdog/src/Time.cc b/Watchdog/src/Time.cc new file mode 100644 index 0000000..94a5be7 --- /dev/null +++ b/Watchdog/src/Time.cc @@ -0,0 +1,32 @@ +/* Time class implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Watchdog Library (PWL). + +The PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Time.defs.hh" + +namespace PWL = Parma_Watchdog_Library; + +bool +PWL::Time::OK() const { + return microsecs < 1000000; +} diff --git a/Watchdog/src/Time.defs.hh b/Watchdog/src/Time.defs.hh new file mode 100644 index 0000000..d817e40 --- /dev/null +++ b/Watchdog/src/Time.defs.hh @@ -0,0 +1,111 @@ +/* Time class declaration. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Watchdog Library (PWL). + +The PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PWL_Time_defs_hh +#define PWL_Time_defs_hh 1 + +#include "Time.types.hh" + +namespace Parma_Watchdog_Library { + +//! Returns true if and only if \p x and \p y are equal. +bool operator==(const Time& x, const Time& y); + +//! Returns true if and only if \p x and \p y are different. +bool operator!=(const Time& x, const Time& y); + +//! Returns true if and only if \p x is shorter than \p y. +bool operator<(const Time& x, const Time& y); + +/*! \brief + Returns true if and only if \p x is shorter than + or equal to \p y. +*/ +bool operator<=(const Time& x, const Time& y); + +//! Returns true if and only if \p x is longer than \p y. +bool operator>(const Time& x, const Time& y); + +/*! \brief + Returns true if and only if \p x is longer than + or equal to \p y. +*/ +bool operator>=(const Time& x, const Time& y); + +//! Returns the sum of \p x and \p y. +Time operator+(const Time& x, const Time& y); + +/*! \brief + Returns the difference of \p x and \p y or the null interval, + if \p x is shorter than \p y. +*/ +Time operator-(const Time& x, const Time& y); + +} // namespace Parma_Watchdog_Library + +//! A class for representing and manipulating positive time intervals. +class Parma_Watchdog_Library::Time { +public: + //! Zero seconds. + Time(); + + //! Constructor taking a number of hundredths of a second. + explicit Time(unsigned long hundredths_of_a_second); + + //! Constructor with seconds and microseconds. + Time(unsigned long s, unsigned long m); + + /*! \brief + Returns the number of whole seconds contained in the represented + time interval. + */ + unsigned long seconds() const; + + /*! \brief + Returns the number of microseconds that, when added to the number + of seconds returned by seconds(), give the represent time interval. + */ + unsigned long microseconds() const; + + //! Adds \p y to \p *this. + Time& operator+=(const Time& y); + + /*! \brief + Subtracts \p y from \p *this; if \p *this is shorter than \p y, + \p *this is set to the null interval. + */ + Time& operator-=(const Time& y); + + //! Checks if all the invariants are satisfied. + bool OK() const; + +private: + //! Number of seconds. + unsigned long secs; + + //! Number of microseconds. + unsigned long microsecs; +}; + +#include "Time.inlines.hh" + +#endif // !defined(PWL_Time_defs_hh) diff --git a/Watchdog/src/Time.inlines.hh b/Watchdog/src/Time.inlines.hh new file mode 100644 index 0000000..c761d36 --- /dev/null +++ b/Watchdog/src/Time.inlines.hh @@ -0,0 +1,144 @@ +/* Time class implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Watchdog Library (PWL). + +The PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PWL_Time_inlines_hh +#define PWL_Time_inlines_hh 1 + +#include + +namespace Parma_Watchdog_Library { + +inline +Time::Time() + : secs(0), microsecs(0) { + assert(OK()); +} + +inline +Time::Time(unsigned long hundredths_of_a_second) + : secs(hundredths_of_a_second / 100), + microsecs((hundredths_of_a_second % 100) * 10000) { + assert(OK()); +} + +inline +Time::Time(unsigned long s, unsigned long m) + : secs(s), + microsecs(m) { + if (microsecs >= 1000000) { + secs += microsecs / 1000000; + microsecs %= 1000000; + } + assert(OK()); +} + +inline unsigned long +Time::seconds() const { + return secs; +} + +inline unsigned long +Time::microseconds() const { + return microsecs; +} + +inline Time& +Time::operator+=(const Time& y) { + unsigned long r_secs = secs + y.secs; + unsigned long r_microsecs = microsecs + y.microsecs; + if (r_microsecs >= 1000000) { + ++r_secs; + r_microsecs %= 1000000; + } + secs = r_secs; + microsecs = r_microsecs; + assert(OK()); + return *this; +} + +inline Time& +Time::operator-=(const Time& y) { + long r_secs = secs - y.secs; + long r_microsecs = microsecs - y.microsecs; + if (r_microsecs < 0) { + --r_secs; + r_microsecs += 1000000; + } + if (r_secs < 0) + r_secs = r_microsecs = 0; + secs = r_secs; + microsecs = r_microsecs; + assert(OK()); + return *this; +} + +inline Time +operator+(const Time& x, const Time& y) { + Time z = x; + z += y; + return z; +} + +inline Time +operator-(const Time& x, const Time& y) { + Time z = x; + z -= y; + return z; +} + +inline bool +operator==(const Time& x, const Time& y) { + assert(x.OK() && y.OK()); + return x.seconds() == y.seconds() && y.microseconds() == y.microseconds(); +} + +inline bool +operator!=(const Time& x, const Time& y) { + assert(x.OK() && y.OK()); + return !(x == y); +} + +inline bool +operator<(const Time& x, const Time& y) { + assert(x.OK() && y.OK()); + return x.seconds() < y.seconds() + || (x.seconds() == y.seconds() && x.microseconds() < y.microseconds()); +} + +inline bool +operator<=(const Time& x, const Time& y) { + return x < y || x == y; +} + +inline bool +operator>(const Time& x, const Time& y) { + return y < x; +} + +inline bool +operator>=(const Time& x, const Time& y) { + return y <= x; +} + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_Time_inlines_hh) diff --git a/Watchdog/src/Time.types.hh b/Watchdog/src/Time.types.hh new file mode 100644 index 0000000..8d11ae2 --- /dev/null +++ b/Watchdog/src/Time.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PWL_Time_types_hh +#define PWL_Time_types_hh 1 + +namespace Parma_Watchdog_Library { + +class Time; + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_Time_types_hh) diff --git a/Watchdog/src/Watchdog.cc b/Watchdog/src/Watchdog.cc new file mode 100644 index 0000000..21c0dab --- /dev/null +++ b/Watchdog/src/Watchdog.cc @@ -0,0 +1,252 @@ +/* Watchdog and associated classes' implementation (non-inline functions). + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Watchdog Library (PWL). + +The PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include + +#include "Watchdog.defs.hh" + +#include +#include +#include +#include +#include +#include + +#ifdef PWL_TIME_WITH_SYS_TIME +# include +# include +#else +# ifdef PWL_HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif + +// Cygwin only supports ITIMER_REAL. +// Profiling does not work on programs that use the ITIMER_PROF timer. +#if defined(__CYGWIN__) || defined(PWL_PROFILING) +#define THE_TIMER ITIMER_REAL +#define THE_SIGNAL SIGALRM +#else +#define THE_TIMER ITIMER_PROF +#define THE_SIGNAL SIGPROF +#endif + +namespace PWL = Parma_Watchdog_Library; + +using std::cerr; +using std::endl; + +// Pass this to getitimer(). +itimerval PWL::Watchdog::current_timer_status; + +// Pass this to setitimer(). +itimerval PWL::Watchdog::signal_once; + +// Last time value we set the timer to. +PWL::Time PWL::Watchdog::last_time_requested; + +// Records the time elapsed since last fresh start. +PWL::Time PWL::Watchdog::time_so_far; + +// The ordered queue of pending watchdog events. +PWL::Pending_List PWL::Watchdog::pending; + +// Whether the alarm clock is running. +volatile bool PWL::Watchdog::alarm_clock_running = false; + +// Whether we are changing data which are also changed by the signal handler. +volatile bool PWL::Watchdog::in_critical_section = false; + +namespace { + +void +throw_syscall_error(const char* syscall_name) { + throw std::runtime_error(std::string(syscall_name) + strerror(errno)); +} + +void +my_getitimer(int which, struct itimerval* value) { + if (getitimer(which, value) != 0) + throw_syscall_error("getitimer"); +} + +void +my_setitimer(int which, + const struct itimerval* value, struct itimerval* ovalue) { + if (setitimer(which, value, ovalue) != 0) + throw_syscall_error("setitimer"); +} + +void +my_sigaction(int signum, + const struct sigaction* act, struct sigaction* oldact) { + if (sigaction(signum, act, oldact) != 0) + throw_syscall_error("sigaction"); +} + +} // namespace + +void +PWL::Watchdog::get_timer(Time& time) { + my_getitimer(THE_TIMER, ¤t_timer_status); + time = Time(current_timer_status.it_value.tv_sec, + current_timer_status.it_value.tv_usec); +} + +void +PWL::Watchdog::set_timer(const Time& time) { + if (time.seconds() == 0 && time.microseconds() == 0) + throw std::runtime_error("PWL internal error"); + last_time_requested = time; + signal_once.it_value.tv_sec = time.seconds(); + signal_once.it_value.tv_usec = time.microseconds(); + my_setitimer(THE_TIMER, &signal_once, 0); +} + +void +PWL::Watchdog::stop_timer() { + signal_once.it_value.tv_sec = 0; + signal_once.it_value.tv_usec = 0; + my_setitimer(THE_TIMER, &signal_once, 0); +} + +void +PWL::Watchdog::handle_timeout(int) { + if (in_critical_section) + reschedule(); + else { + time_so_far += last_time_requested; + if (!pending.empty()) { + Pending_List::Iterator i = pending.begin(); + do { + i->handler().act(); + i->expired_flag() = true; + i = pending.erase(i); + } while (i != pending.end() && i->deadline() <= time_so_far); + if (pending.empty()) + alarm_clock_running = false; + else + set_timer((*pending.begin()).deadline() - time_so_far); + } + else + alarm_clock_running = false; + } +} + +void +PWL::PWL_handle_timeout(int signum) { + PWL::Watchdog::handle_timeout(signum); +} + +PWL::Pending_List::Iterator +PWL::Watchdog::new_watchdog_event(int units, + const Handler& handler, + bool& expired_flag) { + assert(units > 0); + Pending_List::Iterator position; + Time deadline(units); + if (!alarm_clock_running) { + position = pending.insert(deadline, handler, expired_flag); + time_so_far = Time(0); + set_timer(deadline); + alarm_clock_running = true; + } + else { + Time time_to_shoot; + get_timer(time_to_shoot); + Time elapsed_time(last_time_requested); + elapsed_time -= time_to_shoot; + Time current_time(time_so_far); + current_time += elapsed_time; + Time real_deadline(deadline); + real_deadline += current_time; + position = pending.insert(real_deadline, handler, expired_flag); + if (deadline < time_to_shoot) { + time_so_far = current_time; + set_timer(deadline); + } + } + return position; +} + +void +PWL::Watchdog::remove_watchdog_event(Pending_List::Iterator position) { + assert(!pending.empty()); + if (position == pending.begin()) { + Pending_List::Iterator next = position; + ++next; + if (next != pending.end()) { + Time first_deadline(position->deadline()); + Time next_deadline(next->deadline()); + if (first_deadline != next_deadline) { + Time time_to_shoot; + get_timer(time_to_shoot); + Time elapsed_time(last_time_requested); + elapsed_time -= time_to_shoot; + time_so_far += elapsed_time; + next_deadline -= first_deadline; + time_to_shoot += next_deadline; + set_timer(time_to_shoot); + } + } + else { + stop_timer(); + alarm_clock_running = false; + } + } + pending.erase(position); +} + +PWL::Watchdog::~Watchdog() { + if (!expired) { + in_critical_section = true; + remove_watchdog_event(pending_position); + in_critical_section = false; + } + delete &handler; +} + +void +PWL::Watchdog::initialize() { + signal_once.it_interval.tv_sec = 0; + signal_once.it_interval.tv_usec = 0; + + sigset_t mask; + sigemptyset(&mask); + + struct sigaction s; + s.sa_handler = PWL_handle_timeout; + s.sa_mask = mask; + s.sa_flags = 0; // Was SA_ONESHOT: why? + + my_sigaction(THE_SIGNAL, &s, 0); +} + +void +PWL::Watchdog::finalize() { +} + +PWL::Time PWL::Watchdog::reschedule_time(1); + +unsigned int PWL::Init::count = 0; diff --git a/Watchdog/src/Watchdog.defs.hh b/Watchdog/src/Watchdog.defs.hh new file mode 100644 index 0000000..733c355 --- /dev/null +++ b/Watchdog/src/Watchdog.defs.hh @@ -0,0 +1,139 @@ +/* Watchdog and associated classes' declaration and inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Watchdog Library (PWL). + +The PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PWL_Watchdog_defs_hh +#define PWL_Watchdog_defs_hh 1 + +#include "Watchdog.types.hh" +#include "Time.defs.hh" +#include "Handler.types.hh" +#include "Pending_List.defs.hh" +#include + +#ifdef PWL_HAVE_SYS_TIME_H +# include +#endif + +namespace Parma_Watchdog_Library { + +// Set linkage now to declare it friend later. +extern "C" void PWL_handle_timeout(int signum); + +//! A watchdog timer. +class Watchdog { +public: + template + Watchdog(int units, const Flag_Base* volatile& holder, Flag& flag); + + Watchdog(int units, void (*function)()); + ~Watchdog(); + + +private: + friend class Init; + static void initialize(); + static void finalize(); + + bool expired; + const Handler& handler; + Pending_List::Iterator pending_position; + +private: + // Just to prevent their use. + Watchdog(const Watchdog&); + Watchdog& operator=(const Watchdog&); + + // Pass this to getitimer(). + static itimerval current_timer_status; + + // Get the timer value. + static void get_timer(Time& time); + + // Pass this to setitimer(). + static itimerval signal_once; + + // Last time value we set the timer to. + static Time last_time_requested; + + // Set the timer value. + static void set_timer(const Time& time); + + // Stops the timer. + static void stop_timer(); + + // Quick reschedule to avoid race conditions. + static void reschedule(); + + // Used by the above. + static Time reschedule_time; + + // Records the time elapsed since last fresh start. + static Time time_so_far; + + //! The ordered queue of pending watchdog events. + static Pending_List pending; + + //! The actual signal handler. + static void handle_timeout(int); + + // Handle the addition of a new watchdog event. + static Pending_List::Iterator new_watchdog_event(int units, + const Handler& handler, + bool& expired_flag); + + // Handle the removal of a watchdog event. + void remove_watchdog_event(Pending_List::Iterator position); + + // Whether the alarm clock is running. + static volatile bool alarm_clock_running; + + // Whether we are changing data that is also changed by the signal handler. + static volatile bool in_critical_section; + + friend void PWL_handle_timeout(int signum); +}; + +class Init { +private: + //! Count the number of objects created. + static unsigned int count; + +public: + //! Initializes the PWL. + Init(); + + //! Finalizes the PWL. + ~Init(); +}; + +} // namespace Parma_Watchdog_Library + +#include "Watchdog.inlines.hh" + +namespace { + +Parma_Watchdog_Library::Init Parma_Watchdog_Library_initializer; + +} // namespace + +#endif // !defined(PWL_Watchdog_defs_hh) + diff --git a/Watchdog/src/Watchdog.inlines.hh b/Watchdog/src/Watchdog.inlines.hh new file mode 100644 index 0000000..0938216 --- /dev/null +++ b/Watchdog/src/Watchdog.inlines.hh @@ -0,0 +1,80 @@ +/* Watchdog and associated classes' implementation: inline functions. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Watchdog Library (PWL). + +The PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PWL_Watchdog_inlines_hh +#define PWL_Watchdog_inlines_hh 1 + +#include + +#include "Handler.defs.hh" + +namespace Parma_Watchdog_Library { + +inline void +Watchdog::reschedule() { + set_timer(reschedule_time); +} + +template +Watchdog::Watchdog(int units, const Flag_Base* volatile& holder, Flag& flag) + : expired(false), + handler(*new Handler_Flag(holder, flag)) { + if (units <= 0) + throw std::invalid_argument("Watchdog constructor called with a" + " non-positive number of time units"); + in_critical_section = true; + pending_position = new_watchdog_event(units, handler, expired); + in_critical_section = false; +} + +inline +Watchdog::Watchdog(int units, void (*function)()) + : expired(false), handler(*new Handler_Function(function)) { + if (units <= 0) + throw std::invalid_argument("Watchdog constructor called with a" + " non-positive number of time units"); + in_critical_section = true; + pending_position = new_watchdog_event(units, handler, expired); + in_critical_section = false; +} + +inline +Init::Init() { + // Only when the first Init object is constructed... + if (count++ == 0) { + // ... the library is initialized. + Watchdog::initialize(); + } +} + +inline +Init::~Init() { + // Only when the last Init object is destroyed... + if (--count == 0) { + // ... the library is finalized. + Watchdog::finalize(); + } +} + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_Watchdog_inlines_hh) diff --git a/Watchdog/src/Watchdog.types.hh b/Watchdog/src/Watchdog.types.hh new file mode 100644 index 0000000..fc5f84c --- /dev/null +++ b/Watchdog/src/Watchdog.types.hh @@ -0,0 +1,21 @@ +/* Copyright (C) 2001-2009 Roberto Bagnara + +This file is free software; as a special exception the author gives +unlimited permission to copy and/or distribute it, with or without +modifications, as long as this notice is preserved. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. */ + +#ifndef PWL_Watchdog_types_hh +#define PWL_Watchdog_types_hh 1 + +namespace Parma_Watchdog_Library { + class Watchdog; + class Flag; + class Init; +} + +#endif // !defined(PWL_Watchdog_types_hh) diff --git a/Watchdog/src/pwl.hh.dist b/Watchdog/src/pwl.hh.dist new file mode 100644 index 0000000..45d9cff --- /dev/null +++ b/Watchdog/src/pwl.hh.dist @@ -0,0 +1,1348 @@ +/* This is the header file of the Parma Watchdog Library. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Watchdog Library (PWL). + +The PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PWL_pwl_hh +#define PWL_pwl_hh 1 + +#ifdef NDEBUG +# define PWL_SAVE_NDEBUG 1 +# undef NDEBUG +#endif + +// Automatically generated from PPL source file ../pwl-config.h line 1 +/* config.h. Generated from config.h.in by configure. */ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the declaration of `getenv', and to 0 if you don't. + */ +#define PWL_HAVE_DECL_GETENV 0 + +/* Define to 1 if you have the header file. */ +#define PWL_HAVE_DLFCN_H 1 + +/* Define to 1 if you have the header file. */ +#define PWL_HAVE_FENV_H 1 + +/* Define to 1 if you have the header file. */ +#define PWL_HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define PWL_HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `setitimer' function. */ +#define HAVE_SETITIMER 1 + +/* Define to 1 if the system has the type `siginfo_t'. */ +#define HAVE_SIGINFO_T 1 + +/* Define to 1 if you have the header file. */ +#define PWL_HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define PWL_HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define PWL_HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define PWL_HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define PWL_HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define PWL_HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#define PWL_HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define PWL_HAVE_UNISTD_H 1 + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#define LT_OBJDIR ".libs/" + +/* Assertions are disabled when this is defined */ +#define NDEBUG 1 + +/* Define to the address where bug reports for this package should be sent. */ +#define PWL_PACKAGE_BUGREPORT "bagnara@cs.unipr.it" + +/* Define to the full name of this package. */ +#define PWL_PACKAGE_NAME "the Parma Watchdog Library" + +/* Define to the full name and version of this package. */ +#define PWL_PACKAGE_STRING "the Parma Watchdog Library 0.7" + +/* Define to the one symbol short name of this package. */ +#define PWL_PACKAGE_TARNAME "pwl" + +/* Define to the version of this package. */ +#define PWL_PACKAGE_VERSION "0.7" + +/* Define to 1 if you have the ANSI C header files. */ +#define PWL_STDC_HEADERS 1 + +/* Define to 1 if you can safely include both and . */ +#define PWL_TIME_WITH_SYS_TIME 1 + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + + +#ifdef PWL_NDEBUG +# define NDEBUG 1 +#endif + +// Automatically generated from PPL source file ../src/Doubly_Linked_Object.types.hh line 1 + +#ifndef PWL_Doubly_Linked_Object_types_hh +#define PWL_Doubly_Linked_Object_types_hh 1 + +namespace Parma_Watchdog_Library { + +class Doubly_Linked_Object; + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_Doubly_Linked_Object_types_hh) +// Automatically generated from PPL source file ../src/EList.types.hh line 1 + +#ifndef PWL_EList_types_hh +#define PWL_EList_types_hh 1 + +namespace Parma_Watchdog_Library { + +template +class EList; + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_EList_types_hh) +// Automatically generated from PPL source file ../src/EList_Iterator.types.hh line 1 + +#ifndef PWL_EList_Iterator_types_hh +#define PWL_EList_Iterator_types_hh 1 + +namespace Parma_Watchdog_Library { + +template +class EList_Iterator; + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_EList_Iterator_types_hh) +// Automatically generated from PPL source file ../src/Handler.types.hh line 1 + +#ifndef PWL_Handler_types_hh +#define PWL_Handler_types_hh 1 + +namespace Parma_Watchdog_Library { + +class Handler; + +template +class Handler_Flag; + +class Handler_Function; + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_Handler_types_hh) +// Automatically generated from PPL source file ../src/Pending_Element.types.hh line 1 + +#ifndef PWL_Pending_Element_types_hh +#define PWL_Pending_Element_types_hh 1 + +namespace Parma_Watchdog_Library { + +class Pending_Element; + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_Pending_Element_types_hh) +// Automatically generated from PPL source file ../src/Pending_List.types.hh line 1 + +#ifndef PWL_Pending_List_types_hh +#define PWL_Pending_List_types_hh 1 + +namespace Parma_Watchdog_Library { + +class Pending_List; + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_Pending_List_types_hh) +// Automatically generated from PPL source file ../src/Time.types.hh line 1 + +#ifndef PWL_Time_types_hh +#define PWL_Time_types_hh 1 + +namespace Parma_Watchdog_Library { + +class Time; + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_Time_types_hh) +// Automatically generated from PPL source file ../src/Watchdog.types.hh line 1 + +#ifndef PWL_Watchdog_types_hh +#define PWL_Watchdog_types_hh 1 + +namespace Parma_Watchdog_Library { + class Watchdog; + class Flag; + class Init; +} + +#endif // !defined(PWL_Watchdog_types_hh) +// Automatically generated from PPL source file ../src/Handler.defs.hh line 1 +/* Handler and derived classes' declaration. +*/ + +#ifndef PWL_Handler_defs_hh +#define PWL_Handler_defs_hh 1 + +// Automatically generated from PPL source file ../src/Handler.defs.hh line 27 + +//! Abstract base class for handlers of the watchdog events. +class Parma_Watchdog_Library::Handler { +public: + //! Does the job. + virtual void act() const = 0; + + //! Virtual destructor. + virtual ~Handler(); +}; + +//! A kind of Handler that installs a flag onto a flag-holder. +/*! + The template class Handler_Flag is an handler whose + job is to install a flag onto an holder 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 Flag* to an entity of type + Flag_Base*. + 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 +class Parma_Watchdog_Library::Handler_Flag : virtual public Handler { +public: + //! Constructor with a given function. + Handler_Flag(const Flag_Base* volatile& holder, Flag& flag); + + //! Does its job: installs the flag onto the holder, if a flag with + //! an higher priority has not already been installed. + void act() const; + +private: + // declare holder as reference to volatile pointer to const Flag_Base + const Flag_Base* volatile& h; + Flag& f; +}; + +//! A kind of Handler calling a given function. +class Parma_Watchdog_Library::Handler_Function : virtual public Handler { +public: + //! Constructor with a given function. + Handler_Function(void (*function)()); + + //! Does its job: calls the embedded function. + void act() const; + +private: + //! Pointer to the embedded function. + void (*f)(); +}; + +// Automatically generated from PPL source file ../src/Handler.inlines.hh line 1 +/* Handler and derived classes' implementation: inline functions. +*/ + +#ifndef PWL_Handler_inlines_hh +#define PWL_Handler_inlines_hh 1 + +namespace Parma_Watchdog_Library { + +inline +Handler::~Handler() { +} + +template +Handler_Flag::Handler_Flag(const Flag_Base* volatile& holder, + Flag& flag) + : h(holder), f(flag) { +} + +template +void +Handler_Flag::act() const { + if (h == 0 || static_cast(*h).priority() < f.priority()) + h = &f; +} + +inline +Handler_Function::Handler_Function(void (*function)()) + : f(function) { +} + +inline void +Handler_Function::act() const { + (*f)(); +} + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_Handler_inlines_hh) +// Automatically generated from PPL source file ../src/Handler.defs.hh line 89 + +#endif // !defined(PWL_Handler_defs_hh) +// Automatically generated from PPL source file ../src/Time.defs.hh line 1 +/* Time class declaration. +*/ + +#ifndef PWL_Time_defs_hh +#define PWL_Time_defs_hh 1 + +// Automatically generated from PPL source file ../src/Time.defs.hh line 27 + +namespace Parma_Watchdog_Library { + +//! Returns true if and only if \p x and \p y are equal. +bool operator==(const Time& x, const Time& y); + +//! Returns true if and only if \p x and \p y are different. +bool operator!=(const Time& x, const Time& y); + +//! Returns true if and only if \p x is shorter than \p y. +bool operator<(const Time& x, const Time& y); + +/*! \brief + Returns true if and only if \p x is shorter than + or equal to \p y. +*/ +bool operator<=(const Time& x, const Time& y); + +//! Returns true if and only if \p x is longer than \p y. +bool operator>(const Time& x, const Time& y); + +/*! \brief + Returns true if and only if \p x is longer than + or equal to \p y. +*/ +bool operator>=(const Time& x, const Time& y); + +//! Returns the sum of \p x and \p y. +Time operator+(const Time& x, const Time& y); + +/*! \brief + Returns the difference of \p x and \p y or the null interval, + if \p x is shorter than \p y. +*/ +Time operator-(const Time& x, const Time& y); + +} // namespace Parma_Watchdog_Library + +//! A class for representing and manipulating positive time intervals. +class Parma_Watchdog_Library::Time { +public: + //! Zero seconds. + Time(); + + //! Constructor taking a number of hundredths of a second. + explicit Time(unsigned long hundredths_of_a_second); + + //! Constructor with seconds and microseconds. + Time(unsigned long s, unsigned long m); + + /*! \brief + Returns the number of whole seconds contained in the represented + time interval. + */ + unsigned long seconds() const; + + /*! \brief + Returns the number of microseconds that, when added to the number + of seconds returned by seconds(), give the represent time interval. + */ + unsigned long microseconds() const; + + //! Adds \p y to \p *this. + Time& operator+=(const Time& y); + + /*! \brief + Subtracts \p y from \p *this; if \p *this is shorter than \p y, + \p *this is set to the null interval. + */ + Time& operator-=(const Time& y); + + //! Checks if all the invariants are satisfied. + bool OK() const; + +private: + //! Number of seconds. + unsigned long secs; + + //! Number of microseconds. + unsigned long microsecs; +}; + +// Automatically generated from PPL source file ../src/Time.inlines.hh line 1 +/* Time class implementation: inline functions. +*/ + +#ifndef PWL_Time_inlines_hh +#define PWL_Time_inlines_hh 1 + +#include + +namespace Parma_Watchdog_Library { + +inline +Time::Time() + : secs(0), microsecs(0) { + assert(OK()); +} + +inline +Time::Time(unsigned long hundredths_of_a_second) + : secs(hundredths_of_a_second / 100), + microsecs((hundredths_of_a_second % 100) * 10000) { + assert(OK()); +} + +inline +Time::Time(unsigned long s, unsigned long m) + : secs(s), + microsecs(m) { + if (microsecs >= 1000000) { + secs += microsecs / 1000000; + microsecs %= 1000000; + } + assert(OK()); +} + +inline unsigned long +Time::seconds() const { + return secs; +} + +inline unsigned long +Time::microseconds() const { + return microsecs; +} + +inline Time& +Time::operator+=(const Time& y) { + unsigned long r_secs = secs + y.secs; + unsigned long r_microsecs = microsecs + y.microsecs; + if (r_microsecs >= 1000000) { + ++r_secs; + r_microsecs %= 1000000; + } + secs = r_secs; + microsecs = r_microsecs; + assert(OK()); + return *this; +} + +inline Time& +Time::operator-=(const Time& y) { + long r_secs = secs - y.secs; + long r_microsecs = microsecs - y.microsecs; + if (r_microsecs < 0) { + --r_secs; + r_microsecs += 1000000; + } + if (r_secs < 0) + r_secs = r_microsecs = 0; + secs = r_secs; + microsecs = r_microsecs; + assert(OK()); + return *this; +} + +inline Time +operator+(const Time& x, const Time& y) { + Time z = x; + z += y; + return z; +} + +inline Time +operator-(const Time& x, const Time& y) { + Time z = x; + z -= y; + return z; +} + +inline bool +operator==(const Time& x, const Time& y) { + assert(x.OK() && y.OK()); + return x.seconds() == y.seconds() && y.microseconds() == y.microseconds(); +} + +inline bool +operator!=(const Time& x, const Time& y) { + assert(x.OK() && y.OK()); + return !(x == y); +} + +inline bool +operator<(const Time& x, const Time& y) { + assert(x.OK() && y.OK()); + return x.seconds() < y.seconds() + || (x.seconds() == y.seconds() && x.microseconds() < y.microseconds()); +} + +inline bool +operator<=(const Time& x, const Time& y) { + return x < y || x == y; +} + +inline bool +operator>(const Time& x, const Time& y) { + return y < x; +} + +inline bool +operator>=(const Time& x, const Time& y) { + return y <= x; +} + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_Time_inlines_hh) +// Automatically generated from PPL source file ../src/Time.defs.hh line 110 + +#endif // !defined(PWL_Time_defs_hh) +// Automatically generated from PPL source file ../src/Doubly_Linked_Object.defs.hh line 1 +/* Doubly_Linked_Object class declaration. +*/ + +#ifndef PWL_Doubly_Linked_Object_defs_hh +#define PWL_Doubly_Linked_Object_defs_hh 1 + +// Automatically generated from PPL source file ../src/Doubly_Linked_Object.defs.hh line 29 + +//! A (base) class for doubly linked objects. +class Parma_Watchdog_Library::Doubly_Linked_Object { +public: + //! Default constructor. + Doubly_Linked_Object(); + + //! Creates a chain element with forward link \p f and backward link \p b. + Doubly_Linked_Object(Doubly_Linked_Object* f, Doubly_Linked_Object* b); + + //! Inserts \p y before \p *this. + void insert_before(Doubly_Linked_Object& y); + + //! Inserts \p y after \p *this. + void insert_after(Doubly_Linked_Object& y); + + //! Erases \p *this from the chain and returns a pointer to the next element. + Doubly_Linked_Object* erase(); + + //! Erases \p *this from the chain. + ~Doubly_Linked_Object(); + +private: + //! Forward link. + Doubly_Linked_Object* next; + + //! Backward link. + Doubly_Linked_Object* prev; + + template friend class EList; + template friend class EList_Iterator; +}; + +// Automatically generated from PPL source file ../src/Doubly_Linked_Object.inlines.hh line 1 +/* Doubly_Linked_Object class implementation: inline functions. +*/ + +#ifndef PWL_Doubly_Linked_Object_inlines_hh +#define PWL_Doubly_Linked_Object_inlines_hh 1 + +namespace Parma_Watchdog_Library { + +inline +Doubly_Linked_Object::Doubly_Linked_Object() { +} + +inline +Doubly_Linked_Object::Doubly_Linked_Object(Doubly_Linked_Object* f, + Doubly_Linked_Object* b) + : next(f), + prev(b) { +} + +inline void +Doubly_Linked_Object::insert_before(Doubly_Linked_Object& y) { + y.next = this; + y.prev = prev; + prev->next = &y; + prev = &y; +} + +inline void +Doubly_Linked_Object::insert_after(Doubly_Linked_Object& y) { + y.next = next; + y.prev = this; + next->prev = &y; + next = &y; +} + +inline Doubly_Linked_Object* +Doubly_Linked_Object::erase() { + next->prev = prev; + prev->next = next; + return next; +} + +inline +Doubly_Linked_Object::~Doubly_Linked_Object() { + erase(); +} + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_Doubly_Linked_Object_inlines_hh) +// Automatically generated from PPL source file ../src/Doubly_Linked_Object.defs.hh line 63 + +#endif // !defined(PWL_Doubly_Linked_Object_defs_hh) +// Automatically generated from PPL source file ../src/EList_Iterator.defs.hh line 1 +/* EList_Iterator class declaration. +*/ + +#ifndef PWL_EList_Iterator_defs_hh +#define PWL_EList_Iterator_defs_hh 1 + +// Automatically generated from PPL source file ../src/EList_Iterator.defs.hh line 28 + +namespace Parma_Watchdog_Library { + +//! Returns true if and only if \p x and \p y are equal. +template +bool operator==(const EList_Iterator& x, const EList_Iterator& y); + +//! Returns true if and only if \p x and \p y are different. +template +bool operator!=(const EList_Iterator& x, const EList_Iterator& y); + +} // namespace Parma_Watchdog_Library + +//! A class providing iterators for embedded lists. +template +class Parma_Watchdog_Library::EList_Iterator { +public: + //! Constructs an iterator pointing to nothing. + EList_Iterator(); + + //! Constructs an iterator pointing to \p p. + explicit EList_Iterator(Doubly_Linked_Object* p); + + //! Changes \p *this so that it points to \p p. + EList_Iterator& operator=(Doubly_Linked_Object* p); + + //! Indirect member selector. + T* operator->(); + + //! Dereference operator. + T& operator*(); + + //! Preincrement operator. + EList_Iterator& operator++(); + + //! Postincrement operator. + EList_Iterator operator++(int); + + //! Predecrement operator. + EList_Iterator& operator--(); + + //! Postdecrement operator. + EList_Iterator operator--(int); + +private: + //! Embedded pointer. + Doubly_Linked_Object* ptr; + + friend bool operator==(const EList_Iterator& x, const EList_Iterator& y); + + friend bool operator!=(const EList_Iterator& x, const EList_Iterator& y); +}; + +// Automatically generated from PPL source file ../src/EList_Iterator.inlines.hh line 1 +/* EList_Iterator class implementation: inline functions. +*/ + +#ifndef PWL_EList_Iterator_inlines_hh +#define PWL_EList_Iterator_inlines_hh 1 + +// Automatically generated from PPL source file ../src/EList_Iterator.inlines.hh line 27 + +namespace Parma_Watchdog_Library { + +template +inline +EList_Iterator::EList_Iterator() { +} + +template +inline +EList_Iterator::EList_Iterator(Doubly_Linked_Object* p) + : ptr(p) { +} + +template +inline EList_Iterator& +EList_Iterator::operator=(Doubly_Linked_Object* p) { + ptr = p; + return *this; +} + +template +inline T* +EList_Iterator::operator->() { + return static_cast(ptr); +} + +template +inline T& +EList_Iterator::operator*() { + return *operator->(); +} + +template +inline EList_Iterator& +EList_Iterator::operator++() { + ptr = ptr->next; + return *this; +} + +template +inline EList_Iterator +EList_Iterator::operator++(int) { + EList_Iterator tmp = *this; + ++*this; + return tmp; +} + +template +inline EList_Iterator& +EList_Iterator::operator--() { + ptr = ptr->prev; + return *this; +} + +template +inline EList_Iterator +EList_Iterator::operator--(int) { + EList_Iterator tmp = *this; + --*this; + return tmp; +} + +template +inline bool +operator==(const EList_Iterator& x, const EList_Iterator& y) { + return x.ptr == y.ptr; +} + +template +inline bool +operator!=(const EList_Iterator& x, const EList_Iterator& y) { + return x.ptr != y.ptr; +} + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_EList_Iterator_inlines_hh) +// Automatically generated from PPL source file ../src/EList_Iterator.defs.hh line 82 + +#endif // !defined(PWL_EList_Iterator_defs_hh) +// Automatically generated from PPL source file ../src/EList.defs.hh line 1 +/* EList class declaration. +*/ + +#ifndef PWL_EList_defs_hh +#define PWL_EList_defs_hh 1 + +// Automatically generated from PPL source file ../src/EList.defs.hh line 28 + +/*! \brief + A simple kind of embedded list (i.e., a doubly linked objects + where the links are embedded in the objects themselves). +*/ +template +class Parma_Watchdog_Library::EList : private Doubly_Linked_Object { +public: + //! A const iterator to traverse the list. + typedef EList_Iterator Const_Iterator; + + //! A non-const iterator to traverse the list. + typedef EList_Iterator 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 true if and only if the list is empty. + bool empty() const; + + //! Returns an iterator pointing to the beginning of the list. + Iterator begin(); + + //! Returns an iterator pointing one past the last element in the list. + Iterator end(); + + //! Returns a const iterator pointing to the beginning of the list. + Const_Iterator begin() const; + + //! Returns a const iterator pointing one past the last element in the list. + Const_Iterator end() const; + + //! Checks if all the invariants are satisfied. + bool OK() const; +}; + +// Automatically generated from PPL source file ../src/EList.inlines.hh line 1 +/* EList class implementation: inline functions. +*/ + +#ifndef PWL_EList_inlines_hh +#define PWL_EList_inlines_hh 1 + +namespace Parma_Watchdog_Library { + +template +inline +EList::EList() + : Doubly_Linked_Object(this, this) { +} + +template +inline void +EList::push_front(T& obj) { + next->insert_before(obj); +} + +template +inline void +EList::push_back(T& obj) { + prev->insert_after(obj); +} + +template +inline typename EList::Iterator +EList::insert(Iterator position, T& obj) { + position->insert_before(obj); + return Iterator(&obj); +} + +template +inline typename EList::Iterator +EList::begin() { + return Iterator(next); +} + +template +inline typename EList::Iterator +EList::end() { + return Iterator(this); +} + +template +inline typename EList::Const_Iterator +EList::begin() const { + return Const_Iterator(next); +} + +template +inline typename EList::Const_Iterator +EList::end() const { + return Const_Iterator(const_cast*>(this)); +} + +template +inline bool +EList::empty() const { + return begin() == end(); +} + +template +inline typename EList::Iterator +EList::erase(Iterator position) { + assert(!empty()); + return Iterator(position->erase()); +} + +template +inline +EList::~EList() { + // Erase and deallocate all the elements. + for (Iterator i = begin(), lend = end(), next; i != lend; i = next) { + next = erase(i); + delete &*i; + } +} + +template +inline bool +EList::OK() const { + for (Const_Iterator i = begin(), lend = end(); i != lend; ++i) + if (!i->OK()) + return false; + + return true; +} + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_EList_inlines_hh) +// Automatically generated from PPL source file ../src/EList.defs.hh line 86 + +#endif // !defined(PWL_EList_defs_hh) +// Automatically generated from PPL source file ../src/Pending_Element.defs.hh line 1 +/* Pending_Element class declaration. +*/ + +#ifndef PWL_Pending_Element_defs_hh +#define PWL_Pending_Element_defs_hh 1 + +// Automatically generated from PPL source file ../src/Pending_Element.defs.hh line 30 + +//! A class for pending watchdog events with embedded links. +/*! + Each pending watchdog event is characterized by a deadline (a positive + time interval), an associated handler that will be invoked upon event + expiration, and a Boolean flag that indicates whether the event has already + expired or not. +*/ +class Parma_Watchdog_Library::Pending_Element : public Doubly_Linked_Object { +public: + //! Constructs an element with the given attributes. + Pending_Element(const Time& deadline, + const Handler& handler, + bool& expired_flag); + + //! Modifies \p *this so that it has the given attributes. + void assign(const Time& deadline, + const Handler& handler, + bool& expired_flag); + + //! Returns the deadline of the event. + const Time& deadline() const; + + //! Returns the handler associated to the event. + const Handler& handler() const; + + //! Returns a reference to the "event-expired" flag. + bool& expired_flag() const; + + //! Checks if all the invariants are satisfied. + bool OK() const; + +private: + //! The deadline of the event. + Time d; + + //! A pointer to the handler associated to the event. + const Handler* p_h; + + //! A pointer to a flag saying whether the event has already expired or not. + bool* p_f; +}; + +// Automatically generated from PPL source file ../src/Pending_Element.inlines.hh line 1 +/* Pending_Element class implementation: inline functions. +*/ + +#ifndef PWL_Pending_Element_inlines_hh +#define PWL_Pending_Element_inlines_hh 1 + +namespace Parma_Watchdog_Library { + +inline +Pending_Element::Pending_Element(const Time& deadline, + const Handler& handler, + bool& expired_flag) + : d(deadline), p_h(&handler), p_f(&expired_flag) { + assert(OK()); +} + +inline void +Pending_Element::assign(const Time& deadline, + const Handler& handler, + bool& expired_flag) { + d = deadline; + p_h = &handler; + p_f = &expired_flag; + assert(OK()); +} + +inline const Time& +Pending_Element::deadline() const { + return d; +} + +inline const Handler& +Pending_Element::handler() const { + return *p_h; +} + +inline bool& +Pending_Element::expired_flag() const { + return *p_f; +} + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_Pending_Element_inlines_hh) +// Automatically generated from PPL source file ../src/Pending_Element.defs.hh line 74 + +#endif // !defined(PWL_Pending_Element_defs_hh) +// Automatically generated from PPL source file ../src/Pending_List.defs.hh line 1 +/* Pending_List class declaration. +*/ + +#ifndef PWL_Pending_List_defs_hh +#define PWL_Pending_List_defs_hh 1 + +// Automatically generated from PPL source file ../src/Pending_List.defs.hh line 31 + +//! An ordered list for recording pending watchdog events. +class Parma_Watchdog_Library::Pending_List { +public: + //! A non-const iterator to traverse the list. + typedef EList::Iterator Iterator; + + //! Constructs an empty list. + Pending_List(); + + //! Destructor. + ~Pending_List(); + + //! Inserts a new Pending_Element object with the given attributes. + Iterator insert(const Time& deadline, + const Handler& handler, + bool& expired_flag); + + /*! \brief + Removes the element pointed to by \p position, returning + an iterator pointing to the next element, if any, or end(), otherwise. + */ + Iterator erase(Iterator position); + + //! Returns true 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 active_list; + EList free_list; +}; + +// Automatically generated from PPL source file ../src/Pending_List.inlines.hh line 1 +/* Pending_List class implementation: inline functions. +*/ + +#ifndef PWL_Pending_List_inlines_hh +#define PWL_Pending_List_inlines_hh 1 + +namespace Parma_Watchdog_Library { + +inline +Pending_List::Pending_List() + : active_list(), + free_list() { + assert(OK()); +} + +inline +Pending_List::~Pending_List() { +} + +inline Pending_List::Iterator +Pending_List::begin() { + return active_list.begin(); +} + +inline Pending_List::Iterator +Pending_List::end() { + return active_list.end(); +} + +inline bool +Pending_List::empty() const { + return active_list.empty(); +} + +inline Pending_List::Iterator +Pending_List::erase(Iterator position) { + assert(!empty()); + Iterator next = active_list.erase(position); + free_list.push_back(*position); + assert(OK()); + return next; +} + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_Pending_List_inlines_hh) +// Automatically generated from PPL source file ../src/Pending_List.defs.hh line 73 + +#endif // !defined(PWL_Pending_List_defs_hh) +// Automatically generated from PPL source file ../src/Watchdog.defs.hh line 1 +/* Watchdog and associated classes' declaration and inline functions. +*/ + +#ifndef PWL_Watchdog_defs_hh +#define PWL_Watchdog_defs_hh 1 + +// Automatically generated from PPL source file ../src/Watchdog.defs.hh line 30 +#include + +#ifdef PWL_HAVE_SYS_TIME_H +# include +#endif + +namespace Parma_Watchdog_Library { + +// Set linkage now to declare it friend later. +extern "C" void PWL_handle_timeout(int signum); + +//! A watchdog timer. +class Watchdog { +public: + template + Watchdog(int units, const Flag_Base* volatile& holder, Flag& flag); + + Watchdog(int units, void (*function)()); + ~Watchdog(); + + +private: + friend class Init; + static void initialize(); + static void finalize(); + + bool expired; + const Handler& handler; + Pending_List::Iterator pending_position; + +private: + // Just to prevent their use. + Watchdog(const Watchdog&); + Watchdog& operator=(const Watchdog&); + + // Pass this to getitimer(). + static itimerval current_timer_status; + + // Get the timer value. + static void get_timer(Time& time); + + // Pass this to setitimer(). + static itimerval signal_once; + + // Last time value we set the timer to. + static Time last_time_requested; + + // Set the timer value. + static void set_timer(const Time& time); + + // Stops the timer. + static void stop_timer(); + + // Quick reschedule to avoid race conditions. + static void reschedule(); + + // Used by the above. + static Time reschedule_time; + + // Records the time elapsed since last fresh start. + static Time time_so_far; + + //! The ordered queue of pending watchdog events. + static Pending_List pending; + + //! The actual signal handler. + static void handle_timeout(int); + + // Handle the addition of a new watchdog event. + static Pending_List::Iterator new_watchdog_event(int units, + const Handler& handler, + bool& expired_flag); + + // Handle the removal of a watchdog event. + void remove_watchdog_event(Pending_List::Iterator position); + + // Whether the alarm clock is running. + static volatile bool alarm_clock_running; + + // Whether we are changing data that is also changed by the signal handler. + static volatile bool in_critical_section; + + friend void PWL_handle_timeout(int signum); +}; + +class Init { +private: + //! Count the number of objects created. + static unsigned int count; + +public: + //! Initializes the PWL. + Init(); + + //! Finalizes the PWL. + ~Init(); +}; + +} // namespace Parma_Watchdog_Library + +// Automatically generated from PPL source file ../src/Watchdog.inlines.hh line 1 +/* Watchdog and associated classes' implementation: inline functions. +*/ + +#ifndef PWL_Watchdog_inlines_hh +#define PWL_Watchdog_inlines_hh 1 + +#include + +// Automatically generated from PPL source file ../src/Watchdog.inlines.hh line 29 + +namespace Parma_Watchdog_Library { + +inline void +Watchdog::reschedule() { + set_timer(reschedule_time); +} + +template +Watchdog::Watchdog(int units, const Flag_Base* volatile& holder, Flag& flag) + : expired(false), + handler(*new Handler_Flag(holder, flag)) { + if (units <= 0) + throw std::invalid_argument("Watchdog constructor called with a" + " non-positive number of time units"); + in_critical_section = true; + pending_position = new_watchdog_event(units, handler, expired); + in_critical_section = false; +} + +inline +Watchdog::Watchdog(int units, void (*function)()) + : expired(false), handler(*new Handler_Function(function)) { + if (units <= 0) + throw std::invalid_argument("Watchdog constructor called with a" + " non-positive number of time units"); + in_critical_section = true; + pending_position = new_watchdog_event(units, handler, expired); + in_critical_section = false; +} + +inline +Init::Init() { + // Only when the first Init object is constructed... + if (count++ == 0) { + // ... the library is initialized. + Watchdog::initialize(); + } +} + +inline +Init::~Init() { + // Only when the last Init object is destroyed... + if (--count == 0) { + // ... the library is finalized. + Watchdog::finalize(); + } +} + +} // namespace Parma_Watchdog_Library + +#endif // !defined(PWL_Watchdog_inlines_hh) +// Automatically generated from PPL source file ../src/Watchdog.defs.hh line 131 + +namespace { + +Parma_Watchdog_Library::Init Parma_Watchdog_Library_initializer; + +} // namespace + +#endif // !defined(PWL_Watchdog_defs_hh) + + +#ifdef PWL_SAVE_NDEBUG +# ifndef NDEBUG +# define NDEBUG 1 +# endif +# undef PWL_SAVE_NDEBUG +#else +# ifdef NDEBUG +# undef NDEBUG +# endif +#endif +#include + +#endif diff --git a/Watchdog/src/pwl_header.hh b/Watchdog/src/pwl_header.hh new file mode 100644 index 0000000..d0d9700 --- /dev/null +++ b/Watchdog/src/pwl_header.hh @@ -0,0 +1,46 @@ +/* This is the header file of the Parma Watchdog Library. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Watchdog Library (PWL). + +The PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PWL_pwl_hh +#define PWL_pwl_hh 1 + +#ifdef NDEBUG +# define PWL_SAVE_NDEBUG 1 +# undef NDEBUG +#endif + +#include "pwl-config.h" +#include "pwl_include_files.hh" + +#ifdef PWL_SAVE_NDEBUG +# ifndef NDEBUG +# define NDEBUG 1 +# endif +# undef PWL_SAVE_NDEBUG +#else +# ifdef NDEBUG +# undef NDEBUG +# endif +#endif +#include + +#endif diff --git a/Watchdog/tests/Makefile.am b/Watchdog/tests/Makefile.am new file mode 100644 index 0000000..e235e98 --- /dev/null +++ b/Watchdog/tests/Makefile.am @@ -0,0 +1,72 @@ +# Automake source file for the Parma Watchdog Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Watchdog Library (PWL). +# +# The PWL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PWL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . */ + +if VALGRIND_TESTS_ENABLED + +CHECKER = \ +$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \ +--num-callers=100 --leak-resolution=high \ +--suppressions=$(srcdir)/valgrind_suppressions + +else !VALGRIND_TESTS_ENABLED + +CHECKER = + +endif !VALGRIND_TESTS_ENABLED + +TESTS_ENVIRONMENT = $(CHECKER) + +AM_CPPFLAGS = \ +-I.. \ +-I../src \ +@debug_flag@ + +check_LIBRARIES = libpwl_tests.a + +libpwl_tests_a_SOURCES = \ +pwl_test.cc + +LDADD = \ +../src/libpwl.la \ +libpwl_tests.a \ +-lm + +noinst_HEADERS = \ +pwl_test.hh + +EXTRA_DIST = valgrind_suppressions + +TESTS = \ +simple1 + +XFAIL_TESTS = + +# +# Sources for the tests +# + +simple1_SOURCES = simple1.cc + +check_PROGRAMS = $(TESTS) + +../src/libpwl.la: + $(MAKE) $(AM_MAKEFLAGS) -C ../src libpwl.la diff --git a/Watchdog/tests/Makefile.in b/Watchdog/tests/Makefile.in new file mode 100644 index 0000000..4465648 --- /dev/null +++ b/Watchdog/tests/Makefile.in @@ -0,0 +1,594 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Watchdog Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Watchdog Library (PWL). +# +# The PWL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PWL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . */ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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 = simple1$(EXEEXT) +XFAIL_TESTS = +check_PROGRAMS = $(am__EXEEXT_1) +subdir = tests +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +ARFLAGS = cru +libpwl_tests_a_AR = $(AR) $(ARFLAGS) +libpwl_tests_a_LIBADD = +am_libpwl_tests_a_OBJECTS = pwl_test.$(OBJEXT) +libpwl_tests_a_OBJECTS = $(am_libpwl_tests_a_OBJECTS) +am__EXEEXT_1 = simple1$(EXEEXT) +am_simple1_OBJECTS = simple1.$(OBJEXT) +simple1_OBJECTS = $(am_simple1_OBJECTS) +simple1_LDADD = $(LDADD) +simple1_DEPENDENCIES = ../src/libpwl.la libpwl_tests.a +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libpwl_tests_a_SOURCES) $(simple1_SOURCES) +DIST_SOURCES = $(libpwl_tests_a_SOURCES) $(simple1_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VALGRIND = @VALGRIND@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +datadir = @datadir@ +datarootdir = @datarootdir@ +debug_flag = @debug_flag@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +@VALGRIND_TESTS_ENABLED_FALSE@CHECKER = +@VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \ +@VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \ +@VALGRIND_TESTS_ENABLED_TRUE@--num-callers=100 --leak-resolution=high \ +@VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(srcdir)/valgrind_suppressions + +TESTS_ENVIRONMENT = $(CHECKER) +AM_CPPFLAGS = \ +-I.. \ +-I../src \ +@debug_flag@ + +check_LIBRARIES = libpwl_tests.a +libpwl_tests_a_SOURCES = \ +pwl_test.cc + +LDADD = \ +../src/libpwl.la \ +libpwl_tests.a \ +-lm + +noinst_HEADERS = \ +pwl_test.hh + +EXTRA_DIST = valgrind_suppressions + +# +# Sources for the tests +# +simple1_SOURCES = simple1.cc +all: all-am + +.SUFFIXES: +.SUFFIXES: .cc .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign tests/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-checkLIBRARIES: + -test -z "$(check_LIBRARIES)" || rm -f $(check_LIBRARIES) +libpwl_tests.a: $(libpwl_tests_a_OBJECTS) $(libpwl_tests_a_DEPENDENCIES) + -rm -f libpwl_tests.a + $(libpwl_tests_a_AR) libpwl_tests.a $(libpwl_tests_a_OBJECTS) $(libpwl_tests_a_LIBADD) + $(RANLIB) libpwl_tests.a + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +simple1$(EXEEXT): $(simple1_OBJECTS) $(simple1_DEPENDENCIES) + @rm -f simple1$(EXEEXT) + $(CXXLINK) $(simple1_OBJECTS) $(simple1_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pwl_test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple1.Po@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; ws='[ ]'; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *$$ws$$tst$$ws*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + echo "XPASS: $$tst"; \ + ;; \ + *) \ + echo "PASS: $$tst"; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *$$ws$$tst$$ws*) \ + xfail=`expr $$xfail + 1`; \ + echo "XFAIL: $$tst"; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + echo "FAIL: $$tst"; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + echo "SKIP: $$tst"; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all tests failed"; \ + else \ + banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + skipped="($$skip tests were not run)"; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + test -z "$$skipped" || echo "$$skipped"; \ + test -z "$$report" || echo "$$report"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0; \ + else :; fi + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-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 + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +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 + +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 all all-am check check-TESTS check-am clean \ + clean-checkLIBRARIES clean-checkPROGRAMS clean-generic \ + clean-libtool ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-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 uninstall uninstall-am + + +../src/libpwl.la: + $(MAKE) $(AM_MAKEFLAGS) -C ../src libpwl.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/Watchdog/tests/pwl_test.cc b/Watchdog/tests/pwl_test.cc new file mode 100644 index 0000000..f328518 --- /dev/null +++ b/Watchdog/tests/pwl_test.cc @@ -0,0 +1,144 @@ +/* Implementation of utility functions used in test programs. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Watchdog Library (PWL). + +The PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "pwl_test.hh" +#include +#include +#include +#include +#ifdef PWL_HAVE_FENV_H +#include +#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); +} + +#ifdef HAVE_SIGINFO_T +void +fpe_handler(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(PWL_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 + } + exit(1); +} +#endif // defined(HAVE_SIGINFO_T) + +} // namespace + +namespace Parma_Watchdog_Library { + +namespace Test { + +#ifdef HAVE_SIGINFO_T +void +set_handlers() { + struct sigaction action; + action.sa_sigaction = fpe_handler; + sigemptyset(&action.sa_mask); + action.sa_flags = SA_SIGINFO; + if (sigaction(SIGFPE, &action, NULL) != 0) { + std::cerr << "sigaction() failed" + << std::endl; + abort(); + } +#endif // defined(HAVE_SIGINFO_T) + + std::set_unexpected(unexpected_exception_handler); + std::set_terminate(uncaught_exception_handler); +} + +} // namespace Test + +} // namespace Parma_Watchdog_Library diff --git a/Watchdog/tests/pwl_test.hh b/Watchdog/tests/pwl_test.hh new file mode 100644 index 0000000..0d35090 --- /dev/null +++ b/Watchdog/tests/pwl_test.hh @@ -0,0 +1,205 @@ +/* Header file for test programs. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Watchdog Library (PWL). + +The PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#ifndef PWL_pwl_test_hh +#define PWL_pwl_test_hh 1 + +#include "pwl.hh" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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; \ + std::list failed_tests; + +#define END_MAIN \ + if (failed_tests.empty()) \ + return 0; \ + else { \ + std::cerr << "failed tests: "; \ + std::copy(failed_tests.begin(), failed_tests.end(), \ + std::ostream_iterator(std::cerr, " ")); \ + std::cerr << std::endl; \ + return 1; \ + } \ +} \ +catch (const std::overflow_error& e) { \ + std::cerr << "arithmetic overflow (" << e.what() << ")" \ + << std::endl; \ + exit(1); \ +} \ +catch (const std::exception& e) { \ + std::cerr << "std::exception caught: " \ + << e.what() << " (type == " << typeid(e).name() << ")" \ + << std::endl; \ + exit(1); \ +} + +#define ANNOUNCE_TEST(test) \ + nout << "\n=== " #test " ===" << 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) \ + failed_tests.push_back(#test); + +#define DO_TEST_OVERFLOW(test) \ + ANNOUNCE_TEST(test); \ + RUN_TEST(test); \ + if (succeeded || !overflow) \ + failed_tests.push_back(#test); + +// Turn s into a string: PWL_TEST_STR(x + y) => "x + y". +#define PWL_TEST_STR(s) #s + +// Turn the expansion of s into a string: PWL_TEST_XSTR(x) => "s expanded". +#define PWL_TEST_XSTR(s) PWL_TEST_STR(s) + + +namespace Parma_Watchdog_Library { + +namespace Test { + +static bool +check_noisy(const char* +#if PWL_HAVE_DECL_GETENV || NOISY || VERY_NOISY + environment_variable +#endif + ) { +#if PWL_HAVE_DECL_GETENV + return getenv(environment_variable) != 0; +#else +#if NOISY + if (strcmp(environment_variable, "PWL_NOISY_TESTS") == 0) + return true; +#endif +#if VERY_NOISY + if (strcmp(environment_variable, "PWL_VERY_NOISY_TESTS") == 0) + return true; +#endif + return false; +#endif +} + +template > +class nullbuf : public std::basic_streambuf { +protected: + virtual typename Traits::int_type overflow(typename Traits::int_type c) { + return Traits::not_eof(c); + } +}; + +template > +class noisy_ostream : public std::basic_ostream { +private: + nullbuf black_hole; + +public: + noisy_ostream(const std::basic_ostream& os, + const char* environment_variable) + : std::basic_ostream(check_noisy(environment_variable) + ? os.rdbuf() + : &black_hole) { + } +}; + +static noisy_ostream nout(std::cout, "PWL_NOISY_TESTS"); +static noisy_ostream vnout(std::cout, "PWL_VERY_NOISY_TESTS"); + +void +set_handlers(); + +} // namespace Test + +} // namespace Parma_Watchdog_Library + +// These using directive and declaration are just to avoid the +// corresponding namespace qualifications in all the tests. +using namespace Parma_Watchdog_Library; +using namespace Parma_Watchdog_Library::Test; +using std::endl; + +#endif // !defined(PWL_pwl_test_hh) diff --git a/Watchdog/tests/simple1.cc b/Watchdog/tests/simple1.cc new file mode 100644 index 0000000..d6b9fa7 --- /dev/null +++ b/Watchdog/tests/simple1.cc @@ -0,0 +1,71 @@ +/* Some simple tests for the basic functionality of the PWL. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Watchdog Library (PWL). + +The PWL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PWL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include "pwl_test.hh" + +namespace { + +volatile bool interrupt = false; + +void +do_interrupt() { + interrupt = true; +} + +bool +test01() { + const int hundredth_secs = 10; + try { + bool ok; + { + Watchdog w(hundredth_secs, do_interrupt); + nout << ((float) hundredth_secs)/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; + } + catch (...) { + return false; + } + // Should never get here. + return false; +} + + +} // namespace + +BEGIN_MAIN + DO_TEST(test01); +END_MAIN diff --git a/Watchdog/tests/valgrind_suppressions b/Watchdog/tests/valgrind_suppressions new file mode 100644 index 0000000..094660b --- /dev/null +++ b/Watchdog/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/Watchdog/utils/Makefile.am b/Watchdog/utils/Makefile.am new file mode 100644 index 0000000..8ee0a3f --- /dev/null +++ b/Watchdog/utils/Makefile.am @@ -0,0 +1,45 @@ +# Automake source file for the Parma Watchdog Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Watchdog Library (PWL). +# +# The PWL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PWL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . */ + +dist_noinst_SCRIPTS = \ +build_header.in + +noinst_SCRIPTS = \ +build_header + +# Even if the scripts listed in noinst_SCRIPTS are not distributed +# (only the corresponding *.in files are), we need them to actually +# generating the distribution. Using dist-hook is the best solution +# we came up with to obtain this effect. +dist-hook: $(noinst_SCRIPTS) + +generated_automatically = Generated automatically: \ +do not modify; modify the .in file instead. + +do_subst = $(SED) -e 's,[@]PERL[@],$(PERL),g' \ + -e 's,[@]generated_automatically[@],$(generated_automatically),g' + +build_header: build_header.in + $(do_subst) < $(srcdir)/build_header.in > build_header + chmod +x build_header + +CLEANFILES = $(noinst_SCRIPTS) diff --git a/Watchdog/utils/Makefile.in b/Watchdog/utils/Makefile.in new file mode 100644 index 0000000..a262436 --- /dev/null +++ b/Watchdog/utils/Makefile.in @@ -0,0 +1,390 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Watchdog Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Watchdog Library (PWL). +# +# The PWL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PWL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . */ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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 = $(dist_noinst_SCRIPTS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SCRIPTS = $(dist_noinst_SCRIPTS) $(noinst_SCRIPTS) +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VALGRIND = @VALGRIND@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +datadir = @datadir@ +datarootdir = @datarootdir@ +debug_flag = @debug_flag@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +dist_noinst_SCRIPTS = \ +build_header.in + +noinst_SCRIPTS = \ +build_header + +generated_automatically = Generated automatically: \ +do not modify; modify the .in file instead. + +do_subst = $(SED) -e 's,[@]PERL[@],$(PERL),g' \ + -e 's,[@]generated_automatically[@],$(generated_automatically),g' + +CLEANFILES = $(noinst_SCRIPTS) +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign utils/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign utils/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am +check: check-am +all-am: Makefile $(SCRIPTS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +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 + +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 \ + dist-hook distclean distclean-generic distclean-libtool \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-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 \ + 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 +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Watchdog/utils/build_header.in b/Watchdog/utils/build_header.in new file mode 100644 index 0000000..0f242d6 --- /dev/null +++ b/Watchdog/utils/build_header.in @@ -0,0 +1,102 @@ +#! @PERL@ +# -*- Perl -*- +# @generated_automatically@ + +eval 'case $# in 0) exec @PERL@ -S "$0";; *) exec @PERL@ -S "$0" "$@";; esac' + if 0; + +# Builds a self-contained C++ header file by performing recursive inclusion. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +use strict; +use warnings; +use Getopt::Long; + +sub filter($$$$); +sub filter($$$$) { + my ($file, $dirs, $level, $files) = @_; + return if (exists($$files{$file})); + $$files{$file} = undef; + my $fh; + open $fh, $file or die "Cannot open $file"; + my $comment = 0; + my $copyright = 0; + my $print_from = 1; + while (my $line = <$fh>) { + my $iname; + if (($iname) = ($line =~ '^\s*#include\s+"([^"]+)"\s*\n$')) { + my $lineno = $.; + my $ifile; + foreach my $idir (@$dirs) { + $ifile = $idir . '/' . $iname; + last if -e $ifile; + } + filter($ifile, $dirs, $level+1, $files); + $print_from = 1; + next; + } + if ($level > 0) { + if ($print_from) { + print "// Automatically generated from PPL source file $file line $.\n"; + $print_from = 0; + } + next if ($line =~ '^\s*#ifndef\s+PPL_[A-Za-z0-9_]+_hh\s*$'); + next if ($line =~ '^\s*#define\s+PPL_[A-Za-z0-9_]+_hh(\s+1)?\s*$'); + next if ($line =~ '^\s*#endif\s*//\s*!defined\(PPL_[A-Za-z0-9_]+_hh\)\s*$'); + if ($line =~ '/\*') { + $comment = 1; + } + if ($comment && $line =~ 'Copyright.*Roberto Bagnara ') { + $copyright = 1; + print "*/\n" unless $line =~ '/\*'; + } + if ($line =~ '\*/') { + $comment = 0; + if ($copyright) { + $copyright = 0; + next; + } + } + next if $copyright; + } + print $line; + } + close $fh; + +} + + +my @dirs; + +unless (GetOptions("I=s" => \@dirs) && @ARGV == 1) { + print STDERR "Usage: $0 [-I dir]... file\n"; + exit; +} +my $file = $ARGV[0]; + +my ($dir, $name) = ($file =~ '^(?:(.*)/)?([^/]+)$'); +$dir = '.' unless defined($dir); +unshift @dirs, $dir; + +my %files; + +filter($file, \@dirs, 0, \%files); diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..1ed770c --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,7556 @@ +# generated automatically by aclocal 1.10.1 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 2008 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_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(AC_AUTOCONF_VERSION, [2.63],, +[m4_warning([this file was generated for autoconf 2.63. +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'.])]) + +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- + +# serial 52 AC_PROG_LIBTOOL + + +# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) +# ----------------------------------------------------------- +# If this macro is not defined by Autoconf, define it here. +m4_ifdef([AC_PROVIDE_IFELSE], + [], + [m4_define([AC_PROVIDE_IFELSE], + [m4_ifdef([AC_PROVIDE_$1], + [$2], [$3])])]) + + +# AC_PROG_LIBTOOL +# --------------- +AC_DEFUN([AC_PROG_LIBTOOL], +[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl +dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX +dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. + AC_PROVIDE_IFELSE([AC_PROG_CXX], + [AC_LIBTOOL_CXX], + [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX + ])]) +dnl And a similar setup for Fortran 77 support + AC_PROVIDE_IFELSE([AC_PROG_F77], + [AC_LIBTOOL_F77], + [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 +])]) + +dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. +dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run +dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. + AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [ifdef([AC_PROG_GCJ], + [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([A][M_PROG_GCJ], + [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([LT_AC_PROG_GCJ], + [define([LT_AC_PROG_GCJ], + defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) +])])# AC_PROG_LIBTOOL + + +# _AC_PROG_LIBTOOL +# ---------------- +AC_DEFUN([_AC_PROG_LIBTOOL], +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl +AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl +AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl +AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +# Prevent multiple expansion +define([AC_PROG_LIBTOOL], []) +])# _AC_PROG_LIBTOOL + + +# AC_LIBTOOL_SETUP +# ---------------- +AC_DEFUN([AC_LIBTOOL_SETUP], +[AC_PREREQ(2.50)dnl +AC_REQUIRE([AC_ENABLE_SHARED])dnl +AC_REQUIRE([AC_ENABLE_STATIC])dnl +AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl +AC_REQUIRE([AC_PROG_NM])dnl + +AC_REQUIRE([AC_PROG_LN_S])dnl +AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! +AC_REQUIRE([AC_OBJEXT])dnl +AC_REQUIRE([AC_EXEEXT])dnl +dnl +AC_LIBTOOL_SYS_MAX_CMD_LEN +AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +AC_LIBTOOL_OBJDIR + +AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +_LT_AC_PROG_ECHO_BACKSLASH + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e 1s/^X//' +[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] + +# Same as above, but do not quote variable references. +[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +AC_CHECK_TOOL(AR, ar, false) +AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_CHECK_TOOL(STRIP, strip, :) + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + AC_PATH_MAGIC + fi + ;; +esac + +_LT_REQUIRED_DARWIN_CHECKS + +AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +enable_win32_dll=yes, enable_win32_dll=no) + +AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +AC_ARG_WITH([pic], + [AC_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) +test -z "$pic_mode" && pic_mode=default + +# Use C for the default configuration in the libtool script +tagname= +AC_LIBTOOL_LANG_C_CONFIG +_LT_AC_TAGCONFIG +])# AC_LIBTOOL_SETUP + + +# _LT_AC_SYS_COMPILER +# ------------------- +AC_DEFUN([_LT_AC_SYS_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_AC_SYS_COMPILER + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +AC_DEFUN([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` +]) + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +AC_DEFUN([_LT_COMPILER_BOILERPLATE], +[AC_REQUIRE([LT_AC_PROG_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. +AC_DEFUN([_LT_LINKER_BOILERPLATE], +[AC_REQUIRE([LT_AC_PROG_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 +# -------------------------- +# Check for some things on darwin +AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + + 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. + echo "int foo(void){return 1;}" > conftest.c + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib ${wl}-single_module conftest.c + if test -f libconftest.dylib; then + lt_cv_apple_cc_single_mod=yes + rm -rf libconftest.dylib* + fi + rm conftest.c + 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" + ]) + case $host_os in + rhapsody* | darwin1.[[0123]]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) + # 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" != ":"; then + _lt_dsymutil="~$DSYMUTIL \$lib || :" + else + _lt_dsymutil= + fi + ;; + esac +]) + +# _LT_AC_SYS_LIBPATH_AIX +# ---------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +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 "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_AC_SYS_LIBPATH_AIX + + +# _LT_AC_SHELL_INIT(ARG) +# ---------------------- +AC_DEFUN([_LT_AC_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_AC_SHELL_INIT + + +# _LT_AC_PROG_ECHO_BACKSLASH +# -------------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], +[_LT_AC_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +echo=${ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null 2>&1 && unset CDPATH + +if test -z "$ECHO"; then +if test "X${echo_test_string+set}" != Xset; then +# find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if (echo_test_string=`eval $cmd`) 2>/dev/null && + echo_test_string=`eval $cmd` && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(ECHO) +])])# _LT_AC_PROG_ECHO_BACKSLASH + + +# _LT_AC_LOCK +# ----------- +AC_DEFUN([_LT_AC_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*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*) + libsuff=64 + 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*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + 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* + ;; + +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw* | *-*-pw32*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; + ]) +esac + +need_locks="$enable_libtool_lock" + +])# _LT_AC_LOCK + + +# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], +[AC_REQUIRE([LT_AC_PROG_SED]) +AC_CACHE_CHECK([$1], [$2], + [$2=no + ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + 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:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $rm conftest* +]) + +if test x"[$]$2" = xyes; then + ifelse([$5], , :, [$5]) +else + ifelse([$6], , :, [$6]) +fi +])# AC_LIBTOOL_COMPILER_OPTION + + +# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ------------------------------------------------------------ +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], +[AC_REQUIRE([LT_AC_PROG_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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $rm -r conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + ifelse([$4], , :, [$4]) +else + ifelse([$5], , :, [$5]) +fi +])# AC_LIBTOOL_LINKER_OPTION + + +# AC_LIBTOOL_SYS_MAX_CMD_LEN +# -------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], +[# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + 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 + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + teststring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + 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 +])# AC_LIBTOOL_SYS_MAX_CMD_LEN + + +# _LT_AC_CHECK_DLFCN +# ------------------ +AC_DEFUN([_LT_AC_CHECK_DLFCN], +[AC_CHECK_HEADERS(dlfcn.h)dnl +])# _LT_AC_CHECK_DLFCN + + +# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# --------------------------------------------------------------------- +AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + exit (status); +}] +EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_AC_TRY_DLOPEN_SELF + + +# AC_LIBTOOL_DLOPEN_SELF +# ---------------------- +AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-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_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +])# AC_LIBTOOL_DLOPEN_SELF + + +# AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) +# --------------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler +AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + 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:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* +]) +])# AC_LIBTOOL_PROG_CC_C_O + + +# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) +# ----------------------------------------- +# Check to see if we can do hard links to lock some files if needed +AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], +[AC_REQUIRE([_LT_AC_LOCK])dnl + +hard_links="nottested" +if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS + + +# AC_LIBTOOL_OBJDIR +# ----------------- +AC_DEFUN([AC_LIBTOOL_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +])# AC_LIBTOOL_OBJDIR + + +# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) +# ---------------------------------------------- +# Check hardcoding attributes. +AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_AC_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ + test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \ + test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_AC_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_AC_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_AC_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH + + +# AC_LIBTOOL_SYS_LIB_STRIP +# ------------------------ +AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], +[striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) +fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +])# AC_LIBTOOL_SYS_LIB_STRIP + + +# AC_LIBTOOL_SYS_DYNAMIC_LINKER +# ----------------------------- +# PORTME Fill in your ld.so characteristics +AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +m4_if($1,[],[ +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$lt_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e 's/;/ /g'` + else + lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # 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; } +}'` + sys_lib_search_path_spec=`echo $lt_search_path_spec` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[[4-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + 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 + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[123]]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[[3-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + + # 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;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $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 + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +AC_CACHE_VAL([lt_cv_sys_lib_search_path_spec], +[lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec"]) +sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +AC_CACHE_VAL([lt_cv_sys_lib_dlsearch_path_spec], +[lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec"]) +sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi +])# AC_LIBTOOL_SYS_DYNAMIC_LINKER + + +# _LT_AC_TAGCONFIG +# ---------------- +AC_DEFUN([_LT_AC_TAGCONFIG], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_ARG_WITH([tags], + [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], + [include additional configurations @<:@automatic@:>@])], + [tagnames="$withval"]) + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + AC_MSG_WARN([output file `$ofile' does not exist]) + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) + else + AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) + fi + fi + if test -z "$LTCFLAGS"; then + eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in + "") ;; + *) AC_MSG_ERROR([invalid tag name: $tagname]) + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + AC_MSG_ERROR([tag name \"$tagname\" already exists]) + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_LIBTOOL_LANG_CXX_CONFIG + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + AC_LIBTOOL_LANG_F77_CONFIG + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + AC_LIBTOOL_LANG_GCJ_CONFIG + else + tagname="" + fi + ;; + + RC) + AC_LIBTOOL_LANG_RC_CONFIG + ;; + + *) + AC_MSG_ERROR([Unsupported tag name: $tagname]) + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + AC_MSG_ERROR([unable to update list of available tagged configurations.]) + fi +fi +])# _LT_AC_TAGCONFIG + + +# AC_LIBTOOL_DLOPEN +# ----------------- +# enable checks for dlopen support +AC_DEFUN([AC_LIBTOOL_DLOPEN], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_DLOPEN + + +# AC_LIBTOOL_WIN32_DLL +# -------------------- +# declare package support for building win32 DLLs +AC_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_WIN32_DLL + + +# AC_ENABLE_SHARED([DEFAULT]) +# --------------------------- +# implement the --enable-shared flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_SHARED], +[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([shared], + [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]AC_ENABLE_SHARED_DEFAULT) +])# AC_ENABLE_SHARED + + +# AC_DISABLE_SHARED +# ----------------- +# set the default shared flag to --disable-shared +AC_DEFUN([AC_DISABLE_SHARED], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no) +])# AC_DISABLE_SHARED + + +# AC_ENABLE_STATIC([DEFAULT]) +# --------------------------- +# implement the --enable-static flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_STATIC], +[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([static], + [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]AC_ENABLE_STATIC_DEFAULT) +])# AC_ENABLE_STATIC + + +# AC_DISABLE_STATIC +# ----------------- +# set the default static flag to --disable-static +AC_DEFUN([AC_DISABLE_STATIC], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no) +])# AC_DISABLE_STATIC + + +# AC_ENABLE_FAST_INSTALL([DEFAULT]) +# --------------------------------- +# implement the --enable-fast-install flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_FAST_INSTALL], +[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([fast-install], + [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) +])# AC_ENABLE_FAST_INSTALL + + +# AC_DISABLE_FAST_INSTALL +# ----------------------- +# set the default to --disable-fast-install +AC_DEFUN([AC_DISABLE_FAST_INSTALL], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no) +])# AC_DISABLE_FAST_INSTALL + + +# AC_LIBTOOL_PICMODE([MODE]) +# -------------------------- +# implement the --with-pic flag +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +AC_DEFUN([AC_LIBTOOL_PICMODE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +pic_mode=ifelse($#,1,$1,default) +])# AC_LIBTOOL_PICMODE + + +# AC_PROG_EGREP +# ------------- +# This is predefined starting with Autoconf 2.54, so this conditional +# definition can be removed once we require Autoconf 2.54 or later. +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], +[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], + [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi]) + EGREP=$ac_cv_prog_egrep + AC_SUBST([EGREP]) +])]) + + +# AC_PATH_TOOL_PREFIX +# ------------------- +# find a file program which can recognize shared library +AC_DEFUN([AC_PATH_TOOL_PREFIX], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="ifelse([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&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@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +])# AC_PATH_TOOL_PREFIX + + +# AC_PATH_MAGIC +# ------------- +# find a file program which can recognize a shared library +AC_DEFUN([AC_PATH_MAGIC], +[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# AC_PATH_MAGIC + + +# AC_PROG_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([AC_PROG_LD], +[AC_ARG_WITH([gnu-ld], + [AC_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no]) +AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /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 + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +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 + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +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 Linux ELF. +linux* | k*bsd*-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=unknown + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown +])# AC_DEPLIBS_CHECK_METHOD + + +# AC_PROG_NM +# ---------- +# find the pathname to a BSD-compatible name lister +AC_DEFUN([AC_PROG_NM], +[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi]) +NM="$lt_cv_path_NM" +])# AC_PROG_NM + + +# AC_CHECK_LIBM +# ------------- +# check for math library +AC_DEFUN([AC_CHECK_LIBM], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +])# AC_CHECK_LIBM + + +# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl convenience library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-convenience to the configure arguments. Note that +# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, +# it is assumed to be `libltdl'. LIBLTDL will be prefixed with +# '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/' +# (note the single quotes!). If your package is not flat and you're not +# using automake, define top_builddir and top_srcdir appropriately in +# the Makefiles. +AC_DEFUN([AC_LIBLTDL_CONVENIENCE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_CONVENIENCE + + +# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl installable library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-install to the configure arguments. Note that +# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, +# and an installed libltdl is not found, it is assumed to be `libltdl'. +# LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and top_srcdir +# appropriately in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN([AC_LIBLTDL_INSTALLABLE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, lt_dlinit, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + LTDLINCL= + fi + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_INSTALLABLE + + +# AC_LIBTOOL_CXX +# -------------- +# enable support for C++ libraries +AC_DEFUN([AC_LIBTOOL_CXX], +[AC_REQUIRE([_LT_AC_LANG_CXX]) +])# AC_LIBTOOL_CXX + + +# _LT_AC_LANG_CXX +# --------------- +AC_DEFUN([_LT_AC_LANG_CXX], +[AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([_LT_AC_PROG_CXXCPP]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) +])# _LT_AC_LANG_CXX + +# _LT_AC_PROG_CXXCPP +# ------------------ +AC_DEFUN([_LT_AC_PROG_CXXCPP], +[ +AC_REQUIRE([AC_PROG_CXX]) +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +fi +])# _LT_AC_PROG_CXXCPP + +# AC_LIBTOOL_F77 +# -------------- +# enable support for Fortran 77 libraries +AC_DEFUN([AC_LIBTOOL_F77], +[AC_REQUIRE([_LT_AC_LANG_F77]) +])# AC_LIBTOOL_F77 + + +# _LT_AC_LANG_F77 +# --------------- +AC_DEFUN([_LT_AC_LANG_F77], +[AC_REQUIRE([AC_PROG_F77]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) +])# _LT_AC_LANG_F77 + + +# AC_LIBTOOL_GCJ +# -------------- +# enable support for GCJ libraries +AC_DEFUN([AC_LIBTOOL_GCJ], +[AC_REQUIRE([_LT_AC_LANG_GCJ]) +])# AC_LIBTOOL_GCJ + + +# _LT_AC_LANG_GCJ +# --------------- +AC_DEFUN([_LT_AC_LANG_GCJ], +[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], + [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], + [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], + [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) +])# _LT_AC_LANG_GCJ + + +# AC_LIBTOOL_RC +# ------------- +# enable support for Windows resource files +AC_DEFUN([AC_LIBTOOL_RC], +[AC_REQUIRE([LT_AC_PROG_RC]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) +])# AC_LIBTOOL_RC + + +# AC_LIBTOOL_LANG_C_CONFIG +# ------------------------ +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) +AC_DEFUN([_LT_AC_LANG_C_CONFIG], +[lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF + +# Report which library types will actually be built +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case $host_os in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +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]) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_C_CONFIG + + +# AC_LIBTOOL_LANG_CXX_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) +AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], +[AC_LANG_PUSH(C++) +AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([_LT_AC_PROG_CXXCPP]) + +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(allow_undefined_flag, $1)= +_LT_AC_TAGVAR(always_export_symbols, $1)=no +_LT_AC_TAGVAR(archive_expsym_cmds, $1)= +_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_direct, $1)=no +_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= +_LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_AC_TAGVAR(hardcode_automatic, $1)=no +_LT_AC_TAGVAR(module_cmds, $1)= +_LT_AC_TAGVAR(module_expsym_cmds, $1)= +_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_AC_TAGVAR(no_undefined_flag, $1)= +_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= +_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Dependencies to place before and after the object being linked: +_LT_AC_TAGVAR(predep_objects, $1)= +_LT_AC_TAGVAR(postdep_objects, $1)= +_LT_AC_TAGVAR(predeps, $1)= +_LT_AC_TAGVAR(postdeps, $1)= +_LT_AC_TAGVAR(compiler_lib_search_path, $1)= +_LT_AC_TAGVAR(compiler_lib_search_dirs, $1)= + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# 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_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + $as_unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + $as_unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' +else + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + AC_PROG_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +_LT_AC_TAGVAR(ld_shlibs, $1)=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + 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_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + darwin* | rhapsody*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + if test "$GXX" = yes ; then + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_AC_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_AC_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_AC_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}" + if test "$lt_cv_apple_cc_single_mod" != "yes"; then + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + _LT_AC_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 + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + freebsd[[12]]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + freebsd-elf*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + ;; + gnu*) + ;; + hpux9*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) ;; + *) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + interix[[3-9]]*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + linux* | k*bsd*-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_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc*) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_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; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + m88k*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + openbsd2*) + # C++ shared libraries are fairly broken + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd='echo' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + osf3*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ + $rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_AC_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_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + # So that behaviour is only enabled if SCOABSPATH is set to a + # non-empty value in the environment. Most likely only useful for + # creating official distributions of packages. + # This is a hack until libtool officially supports absolute path + # names for shared libraries. + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +esac +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_AC_TAGVAR(GCC, $1)="$GXX" +_LT_AC_TAGVAR(LD, $1)="$LD" + +AC_LIBTOOL_POSTDEP_PREDEP($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +])# AC_LIBTOOL_LANG_CXX_CONFIG + +# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) +# ------------------------------------ +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <&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_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC*) + # 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_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac +]) +case " $_LT_AC_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac +])# AC_LIBTOOL_POSTDEP_PREDEP + +# AC_LIBTOOL_LANG_F77_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG], [_LT_AC_LANG_F77_CONFIG(F77)]) +AC_DEFUN([_LT_AC_LANG_F77_CONFIG], +[AC_REQUIRE([AC_PROG_F77]) +AC_LANG_PUSH(Fortran 77) + +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(allow_undefined_flag, $1)= +_LT_AC_TAGVAR(always_export_symbols, $1)=no +_LT_AC_TAGVAR(archive_expsym_cmds, $1)= +_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_direct, $1)=no +_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= +_LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(hardcode_automatic, $1)=no +_LT_AC_TAGVAR(module_cmds, $1)= +_LT_AC_TAGVAR(module_expsym_cmds, $1)= +_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_AC_TAGVAR(no_undefined_flag, $1)= +_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= +_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="\ + subroutine t + 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_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${F77-"f77"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) + +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case $host_os in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; +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_AC_TAGVAR(GCC, $1)="$G77" +_LT_AC_TAGVAR(LD, $1)="$LD" + +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_F77_CONFIG + + +# AC_LIBTOOL_LANG_GCJ_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG], [_LT_AC_LANG_GCJ_CONFIG(GCJ)]) +AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG], +[AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# 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_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${GCJ-"gcj"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds + +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_RESTORE +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_GCJ_CONFIG + + +# AC_LIBTOOL_LANG_RC_CONFIG +# ------------------------- +# Ensure that the configuration vars for the Windows resource compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG], [_LT_AC_LANG_RC_CONFIG(RC)]) +AC_DEFUN([_LT_AC_LANG_RC_CONFIG], +[AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${RC-"windres"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_RESTORE +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_RC_CONFIG + + +# AC_LIBTOOL_CONFIG([TAGNAME]) +# ---------------------------- +# If TAGNAME is not passed, then create an initial libtool script +# with a default configuration from the untagged config vars. Otherwise +# add code to config.status for appending the configuration named by +# TAGNAME from the matching tagged config vars. +AC_DEFUN([AC_LIBTOOL_CONFIG], +[# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + _LT_AC_TAGVAR(compiler, $1) \ + _LT_AC_TAGVAR(CC, $1) \ + _LT_AC_TAGVAR(LD, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_static, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) \ + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1) \ + _LT_AC_TAGVAR(thread_safe_flag_spec, $1) \ + _LT_AC_TAGVAR(whole_archive_flag_spec, $1) \ + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) \ + _LT_AC_TAGVAR(old_archive_cmds, $1) \ + _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) \ + _LT_AC_TAGVAR(predep_objects, $1) \ + _LT_AC_TAGVAR(postdep_objects, $1) \ + _LT_AC_TAGVAR(predeps, $1) \ + _LT_AC_TAGVAR(postdeps, $1) \ + _LT_AC_TAGVAR(compiler_lib_search_path, $1) \ + _LT_AC_TAGVAR(compiler_lib_search_dirs, $1) \ + _LT_AC_TAGVAR(archive_cmds, $1) \ + _LT_AC_TAGVAR(archive_expsym_cmds, $1) \ + _LT_AC_TAGVAR(postinstall_cmds, $1) \ + _LT_AC_TAGVAR(postuninstall_cmds, $1) \ + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) \ + _LT_AC_TAGVAR(allow_undefined_flag, $1) \ + _LT_AC_TAGVAR(no_undefined_flag, $1) \ + _LT_AC_TAGVAR(export_symbols_cmds, $1) \ + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) \ + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) \ + _LT_AC_TAGVAR(hardcode_libdir_separator, $1) \ + _LT_AC_TAGVAR(hardcode_automatic, $1) \ + _LT_AC_TAGVAR(module_cmds, $1) \ + _LT_AC_TAGVAR(module_expsym_cmds, $1) \ + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) \ + _LT_AC_TAGVAR(fix_srcfile_path, $1) \ + _LT_AC_TAGVAR(exclude_expsyms, $1) \ + _LT_AC_TAGVAR(include_expsyms, $1); do + + case $var in + _LT_AC_TAGVAR(old_archive_cmds, $1) | \ + _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) | \ + _LT_AC_TAGVAR(archive_cmds, $1) | \ + _LT_AC_TAGVAR(archive_expsym_cmds, $1) | \ + _LT_AC_TAGVAR(module_cmds, $1) | \ + _LT_AC_TAGVAR(module_expsym_cmds, $1) | \ + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) | \ + _LT_AC_TAGVAR(export_symbols_cmds, $1) | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\[$]0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\[$]0 --fallback-echo"[$]/[$]0 --fallback-echo"/'` + ;; + esac + +ifelse([$1], [], + [cfgfile="${ofile}T" + trap "$rm \"$cfgfile\"; exit 1" 1 2 15 + $rm -f "$cfgfile" + AC_MSG_NOTICE([creating $ofile])], + [cfgfile="$ofile"]) + + cat <<__EOF__ >> "$cfgfile" +ifelse([$1], [], +[#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e 1s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG], +[# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) + +# Is the compiler the GNU C compiler? +with_gcc=$_LT_AC_TAGVAR(GCC, $1) + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_[]_LT_AC_TAGVAR(LD, $1) + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) + +# Commands used to build and install a shared archive. +archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) +archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) +module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) + +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_dirs, $1) + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to yes if exported symbols are required. +always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) + +# The commands to list exported symbols. +export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) + +# Symbols that must always be exported. +include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) + +ifelse([$1],[], +[# ### END LIBTOOL CONFIG], +[# ### END LIBTOOL TAG CONFIG: $tagname]) + +__EOF__ + +ifelse([$1],[], [ + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +]) +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi +])# AC_LIBTOOL_CONFIG + + +# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl + +_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI + + +# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +# --------------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], +[AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([LT_AC_PROG_SED]) +AC_REQUIRE([AC_PROG_NM]) +AC_REQUIRE([AC_OBJEXT]) +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +linux* | k*bsd*-gnu) + if test "$host_cpu" = ia64; then + symcode='[[ABCDGIRSTW]]' + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext < $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 < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[[]] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -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 +]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + + +# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) +# --------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], +[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_static, $1)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) + ifelse([$1],[CXX],[ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + 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_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + icpc* | ecpc*) + # Intel C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler. + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + 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_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + hpux9* | hpux10* | hpux11*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + newsos6) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + linux* | k*bsd*-gnu) + case $cc_basename in + icc* | ecc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + esac + ;; + esac + ;; + + osf3* | osf4* | osf5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then + AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], + _LT_AC_TAGVAR(lt_cv_prog_compiler_pic_works, $1), + [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +# +# Check to make sure the static flag actually works. +# +wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\" +AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_AC_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) +]) + + +# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) +# ------------------------------------ +# See if the linker supports building shared libraries. +AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +ifelse([$1],[CXX],[ + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + 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 + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + ;; + *) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + _LT_AC_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] +],[ + runpath_var= + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)= + _LT_AC_TAGVAR(archive_expsym_cmds, $1)= + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown + _LT_AC_TAGVAR(hardcode_automatic, $1)=no + _LT_AC_TAGVAR(module_cmds, $1)= + _LT_AC_TAGVAR(module_expsym_cmds, $1)= + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_AC_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_AC_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_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= + # Just being paranoid about ensuring that cc_basename is set. + _LT_CC_BASENAME([$compiler]) + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + interix[[3-9]]*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | k*bsd*-gnu) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_AC_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; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + *) + tmp_sharedflag='-shared' ;; + esac + _LT_AC_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test $supports_anon_versioning = yes; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + 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 + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|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_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + # see comment about different semantics on the GNU ld section + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + bsdi[[45]]*) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_AC_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_AC_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_AC_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_AC_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}" + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi + ;; + + dgux*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + if test "$GCC" = yes; then + wlarc='${wl}' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + wlarc='' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine 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_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +# +# Do we need to explicitly link libc? +# +case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_AC_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $rm conftest* + 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_AC_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) + then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac + fi + ;; +esac +])# AC_LIBTOOL_PROG_LD_SHLIBS + + +# _LT_AC_FILE_LTDLL_C +# ------------------- +# Be careful that the start marker always follows a newline. +AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ +])# _LT_AC_FILE_LTDLL_C + + +# _LT_AC_TAGVAR(VARNAME, [TAGNAME]) +# --------------------------------- +AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) + + +# old names +AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) +AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) +AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) +AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) +AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) + +# This is just to silence aclocal about the macro not being used +ifelse([AC_DISABLE_FAST_INSTALL]) + +AC_DEFUN([LT_AC_PROG_GCJ], +[AC_CHECK_TOOL(GCJ, gcj, no) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS) +]) + +AC_DEFUN([LT_AC_PROG_RC], +[AC_CHECK_TOOL(RC, windres, no) +]) + + +# Cheap backport of AS_EXECUTABLE_P and required macros +# from Autoconf 2.59; we should not use $as_executable_p directly. + +# _AS_TEST_PREPARE +# ---------------- +m4_ifndef([_AS_TEST_PREPARE], +[m4_defun([_AS_TEST_PREPARE], +[if test -x / >/dev/null 2>&1; then + as_executable_p='test -x' +else + as_executable_p='test -f' +fi +])])# _AS_TEST_PREPARE + +# AS_EXECUTABLE_P +# --------------- +# Check whether a file is executable. +m4_ifndef([AS_EXECUTABLE_P], +[m4_defun([AS_EXECUTABLE_P], +[AS_REQUIRE([_AS_TEST_PREPARE])dnl +$as_executable_p $1[]dnl +])])# AS_EXECUTABLE_P + +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +# LT_AC_PROG_SED +# -------------- +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +AC_DEFUN([LT_AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if AS_EXECUTABLE_P(["$as_dir/$lt_ac_prog$ac_exec_ext"]); then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +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]) +]) + +# Copyright (C) 2002, 2003, 2005, 2006, 2007 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.10' +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.10.1], [], + [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 AC_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.10.1])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(AC_AUTOCONF_VERSION)]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 8 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])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, 2000, 2001, 2002, 2003, 2004, 2005, 2006 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 9 + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], 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'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +#serial 3 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # 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"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 13 + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.60])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], +[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], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [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) +AM_PROG_INSTALL_SH +AM_PROG_INSTALL_STRIP +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl +]) +]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_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, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"} +AC_SUBST(install_sh)]) + +# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 3 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_MKDIR_P +# --------------- +# Check for `mkdir -p'. +AC_DEFUN([AM_PROG_MKDIR_P], +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 3 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_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, 1997, 2000, 2001, 2003, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006 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]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of `v7', `ustar', or `pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. +AM_MISSING_PROG([AMTAR], [tar]) +m4_if([$1], [v7], + [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /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_cxx_attribute_weak.m4]) +m4_include([m4/ac_cxx_double_binary_format.m4]) +m4_include([m4/ac_cxx_double_exact_output.m4]) +m4_include([m4/ac_cxx_flexible_arrays.m4]) +m4_include([m4/ac_cxx_float_binary_format.m4]) +m4_include([m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4]) +m4_include([m4/ac_cxx_proper_long_double.m4]) +m4_include([m4/ac_cxx_remainder_bug.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/lib-ld.m4]) +m4_include([m4/lib-link.m4]) +m4_include([m4/lib-prefix.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]) diff --git a/compile b/compile new file mode 100755 index 0000000..1b1d232 --- /dev/null +++ b/compile @@ -0,0 +1,142 @@ +#! /bin/sh +# Wrapper for compilers which do not understand `-c -o'. + +scriptversion=2005-05-14.22 + +# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +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 . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; +esac + +ofile= +cfile= +eat= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as `compile cc -o foo foo.c'. + # So we strip `-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no `-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # `.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'` + +# Create the lock directory. +# Note: use `[/.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/config.guess b/config.guess new file mode 100755 index 0000000..f0f0d36 --- /dev/null +++ b/config.guess @@ -0,0 +1,1529 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Free Software Foundation, Inc. + +timestamp='2008-09-28' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner . +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 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@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + 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 __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo 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'` + exit ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* 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 + + 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:*:[456]) + 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 + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep __LP64__ >/dev/null + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:[3456]*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + EM64T | authenticamd | genuineintel) + 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 ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + arm*:Linux:*:*) + 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-gnu + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^CPU/{ + s: ::g + p + }'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^CPU/{ + s: ::g + p + }'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo or32-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-gnu + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^LIBC/{ + s: ::g + p + }'`" + test x"${LIBC}" != x && { + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit + } + test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@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 ;; + 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 + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#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 + 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 +# 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 < 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..357d000 --- /dev/null +++ b/config.h.in @@ -0,0 +1,393 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + + +/* 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 `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 header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_FENV_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_GETOPT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_GLPK_GLPK_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_GLPK_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_IEEEFP_H + +/* Define to 1 if you have the 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 header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `setitimer' function. */ +#undef HAVE_SETITIMER + +/* Define to 1 if the system has the type `siginfo_t'. */ +#undef HAVE_SIGINFO_T + +/* Define to 1 if you have the header file. */ +#undef HAVE_SIGNAL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_RESOURCE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the 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 `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 header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if `_mp_alloc' is member of `__mpz_struct'. */ +#undef HAVE___MPZ_STRUCT__MP_ALLOC + +/* Define to 1 if `_mp_d' is member of `__mpz_struct'. */ +#undef HAVE___MPZ_STRUCT__MP_D + +/* Define to 1 if `_mp_size' is member of `__mpz_struct'. */ +#undef HAVE___MPZ_STRUCT__MP_SIZE + +/* 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 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 + +/* Not zero if C++ supports exact output for doubles. */ +#undef PPL_CXX_DOUBLE_EXACT_OUTPUT + +/* The binary format of C++ floats, if supported; undefined otherwise. */ +#undef PPL_CXX_FLOAT_BINARY_FORMAT + +/* Not zero if C++ supports exact output for floats. */ +#undef PPL_CXX_FLOAT_EXACT_OUTPUT + +/* Not zero if the C++ compiler has the remainder bug. */ +#undef PPL_CXX_HAS_REMAINDER_BUG + +/* 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 C++ supports exact output for long doubles. */ +#undef PPL_CXX_LONG_DOUBLE_EXACT_OUTPUT + +/* 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 C++ compiler supports flexible arrays. */ +#undef PPL_CXX_SUPPORTS_FLEXIBLE_ARRAYS + +/* 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 + +/* Defined if floating point arithmetics may use the 387 unit. */ +#undef PPL_FPMATH_MAY_USE_387 + +/* Defined if floating point arithmetics 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 + +/* Defined if the Parma Watchdog Library is enabled. */ +#undef PPL_WATCHDOG_LIBRARY_ENABLED + +/* 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 + + +#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 is included before is + (even indirectly) included. Moreover we need to define + __STDC_LIMIT_MACROS before the first inclusion of + 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 +#endif + +#ifdef PPL_HAVE_INTTYPES_H +# include +#endif + 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 , 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 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=/' <. Submit a context +# diff and a properly formatted ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ + uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | 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 \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | mt \ + | msp430 \ + | nios | nios2 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | score \ + | sh | sh[1234] | sh[24]a | 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 | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | 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-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | 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-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | 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 + ;; + 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 + ;; + 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) + 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'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + 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 + ;; + 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-/'` + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + 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) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + 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 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tile*) + basic_machine=tile-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 + ;; + 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[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -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 + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/configure b/configure new file mode 100755 index 0000000..4f3dfc2 --- /dev/null +++ b/configure @@ -0,0 +1,35459 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.63 for the Parma Polyhedra Library 0.10.2. +# +# Report bugs to . +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008 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 + + + + +# PATH needs CR +# 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_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 +if (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 + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +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. +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); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# Required to use basename. +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 + + +# Name of the executable. +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'` + +# CDPATH. +$as_unset CDPATH + + +if test "x$CONFIG_SHELL" = x; then + if (eval ":") 2>/dev/null; then + as_have_required=yes +else + as_have_required=no +fi + + if test $as_have_required = yes && (eval ": +(as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=\$LINENO + as_lineno_2=\$LINENO + test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && + test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } +") 2> /dev/null; then + : +else + as_candidate_shells= + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + case $as_dir in + /*) + for as_base in sh bash ksh sh5; do + as_candidate_shells="$as_candidate_shells $as_dir/$as_base" + done;; + esac +done +IFS=$as_save_IFS + + + for as_shell in $as_candidate_shells $SHELL; do + # Try only shells that exist, to save several forks. + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { ("$as_shell") 2> /dev/null <<\_ASEOF +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 + + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { "$as_shell" 2> /dev/null <<\_ASEOF +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_func_return () { + (exit $1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = "$1" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test $exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } + +_ASEOF +}; then + break +fi + +fi + + done + + if test "x$CONFIG_SHELL" != x; then + for as_var in BASH_ENV ENV + do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + done + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + + if test $as_have_required = no; then + echo This script requires a shell more modern than all the + echo shells that I found on your system. Please install a + echo modern shell, or manually run the script under such a + echo shell if you do have one. + { (exit 1); exit 1; } +fi + + +fi + +fi + + + +(eval "as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0") || { + echo No shell found that supports shell functions. + echo Please tell bug-autoconf@gnu.org about your system, + echo including any error possibly output before this message. + echo This can help us improve future autoconf versions. + echo Configuration will now proceed without shell functions. +} + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. 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 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +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 -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +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=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# 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'" + + + + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$lt_ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','` + ;; +esac + +ECHO=${lt_ECHO-echo} +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then + # Yippee, $ECHO works! + : +else + # Restart under the correct shell. + exec $SHELL "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <<_LT_EOF +$* +_LT_EOF + exit 0 +fi + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test -z "$lt_ECHO"; then + if test "X${echo_test_string+set}" != Xset; then + # find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if { echo_test_string=`eval $cmd`; } 2>/dev/null && + { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null + then + break + fi + done + fi + + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : + else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$ECHO" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + ECHO='print -r' + elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} + else + # Try using printf. + ECHO='printf %s\n' + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + ECHO="$CONFIG_SHELL $0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$CONFIG_SHELL $0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do + if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "$0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} + else + # Oops. We lost completely, so just stick with echo. + ECHO=echo + fi + fi + fi + fi + fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +lt_ECHO=$ECHO +if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then + lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" +fi + + + + +exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Identity of this package. +PACKAGE_NAME='the Parma Polyhedra Library' +PACKAGE_TARNAME='ppl' +PACKAGE_VERSION='0.10.2' +PACKAGE_STRING='the Parma Polyhedra Library 0.10.2' +PACKAGE_BUGREPORT='ppl-devel@cs.unipr.it' + +ac_unique_file="src/Polyhedron_public.cc" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +enable_option_checking=no +ac_subst_vars='LTLIBOBJS +LIBOBJS +mlgmp_dir +ocamlc_root +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 +lt_ECHO +RANLIB +AR +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 +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 +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 +OCAMLOPT +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_PPL_LPSOL_FALSE +BUILD_PPL_LPSOL_TRUE +BUILD_PPL_LCDD_FALSE +BUILD_PPL_LCDD_TRUE +subdirs +BUILD_WATCHDOG_LIBRARY_FALSE +BUILD_WATCHDOG_LIBRARY_TRUE +LTLIBGMPXX +LIBGMPXX +LTLIBGMP +LIBGMP +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 +CPP +HAVE_PERL_FALSE +HAVE_PERL_TRUE +PERL +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_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 +GCC_FALSE +GCC_TRUE +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +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__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_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +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_gnu_ld +enable_rpath +with_libgmp_prefix +with_libgmpxx_prefix +enable_watchdog +enable_ppl_lcdd +enable_ppl_lpsol +enable_interfaces +with_java +with_mlgmp +enable_instantiations +enable_valgrind_tests +enable_check +enable_shared +enable_static +with_pic +enable_fast_install +enable_libtool_lock +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CXX +CXXFLAGS +CCC +CXXCPP +CPP +M4' +ac_subdirs_all='Watchdog' + +# 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=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_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + 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_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + 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_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + 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_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + 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_echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + 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_echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2 + { (exit 1); exit 1; }; } ;; + *) $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_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; } +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 + $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + { $as_echo "$as_me: error: working directory cannot be determined" >&2 + { (exit 1); exit 1; }; } +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 + { (exit 1); exit 1; }; } + + +# 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_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 + { (exit 1); exit 1; }; } + 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 0.10.2 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 0.10.2:";; + 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] + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --enable-debugging compile with debugging information + --enable-profiling compile for profiling + --enable-coverage compile for test coverage + --enable-assertions check run-time assertions + --enable-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 arithmetics + --enable-pch use precompiled headers, if available + --enable-coefficients=TYPE + select the type of the coefficients + --disable-rpath do not hardcode runtime library paths + --enable-watchdog build also the Parma Watchdog Library + --enable-ppl_lcdd build the ppl_lcdd program + --enable-ppl_lpsol build the ppl_lpsol program + --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-gnu-ld assume the C compiler uses GNU ld default=no + --with-libgmp-prefix[=DIR] search for libgmp in DIR/include and DIR/lib + --without-libgmp-prefix don't search for libgmp in includedir and libdir + --with-libgmpxx-prefix[=DIR] search for libgmpxx in DIR/include and DIR/lib + --without-libgmpxx-prefix don't search for libgmpxx in includedir and libdir + --with-java=DIR use the Java SDK installed in DIR + --with-mlgmp=DIR use the ML GMP package installed in DIR + --with-pic try to use only PIC/non-PIC objects [default=use + both] + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + 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 . +_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 0.10.2 +generated by GNU Autoconf 2.63 + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 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 +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 0.10.2, which was +generated by GNU Autoconf 2.63. 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) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$ac_configure_args1 '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + ac_configure_args="$ac_configure_args '$ac_arg'" + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: 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 + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + 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:$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= ;; #( + *) $as_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 + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + 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 + cat <<\_ASBOX +## ------------------- ## +## File substitutions. ## +## ------------------- ## +_ASBOX + 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 + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + 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'; { (exit 1); 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 + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + ac_site_file1=$CONFIG_SITE +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 -r "$ac_site_file"; then + { $as_echo "$as_me:$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" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { $as_echo "$as_me:$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:$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:$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:$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:$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:$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:$LINENO: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:$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. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:$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_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + + + + + + + + + + + + + + + + + + + + + + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +# Minimum Autoconf version required. + + +# Make sure the sources are there. + + +# 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_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 +$as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} + { (exit 1); exit 1; }; } +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_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 +$as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} + { (exit 1); exit 1; }; } + +{ $as_echo "$as_me:$LINENO: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if test "${ac_cv_build+set}" = set; 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_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +$as_echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 +$as_echo "$as_me: error: invalid value of canonical build" >&2;} + { (exit 1); exit 1; }; };; +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:$LINENO: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if test "${ac_cv_host+set}" = set; 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_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} + { (exit 1); exit 1; }; } +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 +$as_echo "$as_me: error: invalid value of canonical host" >&2;} + { (exit 1); exit 1; }; };; +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.10' + +# 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:$LINENO: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; 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 { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$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:$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:$LINENO: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + { { $as_echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&5 +$as_echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&2;} + { (exit 1); exit 1; }; } + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + { { $as_echo "$as_me:$LINENO: error: newly created file is older than distributed files! +Check your system clock" >&5 +$as_echo "$as_me: error: newly created file is older than distributed files! +Check your system clock" >&2;} + { (exit 1); exit 1; }; } +fi +{ $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# 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` + +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { $as_echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +{ $as_echo "$as_me:$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 test "${ac_cv_path_mkdir+set}" = set; 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 + { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$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 + + 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. + test -d ./--version && rmdir ./--version + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:$LINENO: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac + +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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AWK+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:$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:$LINENO: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:$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 { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; 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:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:$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 + +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_echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 +$as_echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} + { (exit 1); exit 1; }; } + 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='0.10.2' + + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"} + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_STRIP+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:$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:$LINENO: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:$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:$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" + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. + +AMTAR=${AMTAR-"${am_missing_run}tar"} + + +{ $as_echo "$as_me:$LINENO: checking how to create a ustar tar archive" >&5 +$as_echo_n "checking how to create a ustar tar archive... " >&6; } +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar plaintar pax cpio none' +_am_tools=${am_cv_prog_tar_ustar-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + { 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 &5 + ($am__untar &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 test "${am_cv_prog_tar_ustar+set}" = set; then + $as_echo_n "(cached) " >&6 +else + am_cv_prog_tar_ustar=$_am_tool +fi + +{ $as_echo "$as_me:$LINENO: result: $am_cv_prog_tar_ustar" >&5 +$as_echo "$am_cv_prog_tar_ustar" >&6; } + + + + + + + + +# 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 abd 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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:$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:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:$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:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:$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:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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:$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:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:$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:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:$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:$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:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } + +# Provide some information about the compiler. +$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.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:$LINENO: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; 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 + +{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +if test -z "$ac_file"; then + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } +fi + +ac_exeext=$ac_cv_exeext + +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } + fi + fi +fi +{ $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +{ $as_echo "$as_me:$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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + +rm -f conftest$ac_cv_exeext +{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if test "${ac_cv_objext+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; 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:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:$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 test "${ac_cv_c_compiler_gnu+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + 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:$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:$LINENO: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +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:$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:$LINENO: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* 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" + 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_c89=$ac_arg +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +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:$LINENO: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:$LINENO: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +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 +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:$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 +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi + + +{ $as_echo "$as_me:$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='\' +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:$LINENO: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; 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'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:$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:$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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifndef __INTEL_COMPILER +choke me +#endif + +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + ICC=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { $as_echo "$as_me:$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 + +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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CXX+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:$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:$LINENO: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:$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:$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:$LINENO: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +{ $as_echo "$as_me:$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 test "${ac_cv_cxx_compiler_gnu+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + 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:$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:$LINENO: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if test "${ac_cv_prog_cxx_g+set}" = set; 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cxx_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CXXFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cxx_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +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:$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:$LINENO: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; 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'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:$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:$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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifndef __INTEL_COMPILER +choke me +#endif + +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + ICPC=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { $as_echo "$as_me:$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 + +{ $as_echo "$as_me:$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 test "${ac_cv_path_GREP+set}" = set; 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" + { test -f "$ac_path_GREP" && $as_test_x "$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 + ac_count=`expr $ac_count + 1` + 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_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:$LINENO: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if test "${ac_cv_path_FGREP+set}" = set; 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" + { test -f "$ac_path_FGREP" && $as_test_x "$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 + ac_count=`expr $ac_count + 1` + 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_echo "$as_me:$LINENO: error: no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +{ $as_echo "$as_me:$LINENO: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if test "${ac_cv_path_EGREP+set}" = set; 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" + { test -f "$ac_path_EGREP" && $as_test_x "$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 + ac_count=`expr $ac_count + 1` + 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_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:$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 test "${ac_cv_path_SED+set}" = set; 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 + $as_unset ac_script || 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" + { test -f "$ac_path_SED" && $as_test_x "$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 + ac_count=`expr $ac_count + 1` + 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_echo "$as_me:$LINENO: error: no acceptable sed could be found in \$PATH" >&5 +$as_echo "$as_me: error: no acceptable sed could be found in \$PATH" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:$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:$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 test "${ac_cv_prog_CXXCPP+set}" = set; 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 to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:$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 to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +{ $as_echo "$as_me:$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 { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; 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:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; 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 { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$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:$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' + + +# Compilation flags. + +COMP_FLAGS="" +OPT_FLAGS="" + +enableval=yes +{ $as_echo "$as_me:$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:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + OPT_FLAGS="-g" + ;; +no) + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ;; +*) + { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-debugging, needs yes or no" >&5 +$as_echo "$as_me: error: bad value ${enableval} for --enable-debugging, needs yes or no" >&2;} + { (exit 1); exit 1; }; } + ;; +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:$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:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + OPT_FLAGS="-g" + COMP_FLAGS="$COMP_FLAGS -pg -DPPL_PROFILING=1" + ;; +no) + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ;; +*) + { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-profiling, needs yes or no" >&5 +$as_echo "$as_me: error: bad value ${enableval} for --enable-profiling, needs yes or no" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +enableval=no +{ $as_echo "$as_me:$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:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + OPT_FLAGS="-g" + COMP_FLAGS="$COMP_FLAGS -fprofile-arcs -ftest-coverage" + ;; +no) + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ;; +*) + { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-coverage, needs yes or no" >&5 +$as_echo "$as_me: error: bad value ${enableval} for --enable-coverage, needs yes or no" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +enableval=no +{ $as_echo "$as_me:$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:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + ;; +no) + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ;; +*) + { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-assertions, needs yes or no" >&5 +$as_echo "$as_me: error: bad value ${enableval} for --enable-assertions, needs yes or no" >&2;} + { (exit 1); exit 1; }; } + ;; +esac +enable_assertions=${enableval} + +enableval=no +{ $as_echo "$as_me:$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:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + ;; +no) + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ;; +*) + { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-more-assertions, needs yes or no" >&5 +$as_echo "$as_me: error: bad value ${enableval} for --enable-more-assertions, needs yes or no" >&2;} + { (exit 1); exit 1; }; } + ;; +esac +enable_more_assertions=${enableval} + +if test x"$enable_more_assertions" = xyes +then + enable_assertions=yes + +cat >>confdefs.h <<\_ACEOF +#define PPL_ABI_BREAKING_EXTRA_DEBUG 1 +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define _GLIBCXX_DEBUG 1 +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define _GLIBCXX_DEBUG_PEDANTIC 1 +_ACEOF + +fi + +if test x"$enable_assertions" = xno +then + +cat >>confdefs.h <<\_ACEOF +#define PPL_NDEBUG 1 +_ACEOF + + debug_flag="-DNDEBUG=1" +fi + + if test x"$enable_assertions" = xyes; then + ASSERTIONS_ENABLED_TRUE= + ASSERTIONS_ENABLED_FALSE='#' +else + ASSERTIONS_ENABLED_TRUE='#' + ASSERTIONS_ENABLED_FALSE= +fi + + + +arch=no +enableval=standard +{ $as_echo "$as_me:$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:$LINENO: result: sspeed" >&5 +$as_echo "sspeed" >&6; } + OPT_FLAGS="$OPT_FLAGS -O3 -fomit-frame-pointer" + arch=yes + ;; +speed) + { $as_echo "$as_me:$LINENO: result: speed" >&5 +$as_echo "speed" >&6; } + OPT_FLAGS="$OPT_FLAGS -O3" + arch=yes + ;; +size) + { $as_echo "$as_me:$LINENO: result: size" >&5 +$as_echo "size" >&6; } + OPT_FLAGS="$OPT_FLAGS -Os" + arch=yes + ;; +standard | yes) + { $as_echo "$as_me:$LINENO: result: standard" >&5 +$as_echo "standard" >&6; } + OPT_FLAGS="$OPT_FLAGS -O2" + ;; +mild) + { $as_echo "$as_me:$LINENO: result: mild" >&5 +$as_echo "mild" >&6; } + OPT_FLAGS="$OPT_FLAGS -O1" + ;; +zero) + { $as_echo "$as_me:$LINENO: result: zero" >&5 +$as_echo "zero" >&6; } + OPT_FLAGS="$OPT_FLAGS -O0" + ;; +no) + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ;; +*) + { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-optimization, needs sspeed, speed, size, standard, mild, zero, yes or no" >&5 +$as_echo "$as_me: error: bad value ${enableval} for --enable-optimization, needs sspeed, speed, size, standard, mild, zero, yes or no" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +enableval=$arch +{ $as_echo "$as_me:$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:$LINENO: result: $m" >&5 +$as_echo "$m" >&6; } + OPT_FLAGS="$OPT_FLAGS -march=$m" + ;; + *) + { $as_echo "$as_me:$LINENO: result: default" >&5 +$as_echo "default" >&6; } + ;; + esac + ;; +no) + { $as_echo "$as_me:$LINENO: result: default" >&5 +$as_echo "default" >&6; } + ;; +*) + { $as_echo "$as_me:$LINENO: result: $enableval" >&5 +$as_echo "$enableval" >&6; } + OPT_FLAGS="$OPT_FLAGS -march=$enableval" + ;; +esac + +enableval=default +fpmath_may_use_387=yes +fpmath_may_use_sse=yes +{ $as_echo "$as_me:$LINENO: checking whether to select specific floating point arithmetics" >&5 +$as_echo_n "checking whether to select specific floating point arithmetics... " >&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:$LINENO: result: sse" >&5 +$as_echo "sse" >&6; } + OPT_FLAGS="$OPT_FLAGS -msse -mfpmath=sse" + # The SSE instruction set only supports single precision arithmetics: + # double and extended precision arithmetics is still done using 387. + ;; +sse2) + { $as_echo "$as_me:$LINENO: result: sse2" >&5 +$as_echo "sse2" >&6; } + OPT_FLAGS="$OPT_FLAGS -msse2 -mfpmath=sse" + # SSE2 still does not support extended precision arithmetics. + ;; +387) + { $as_echo "$as_me:$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:$LINENO: result: sse+387" >&5 +$as_echo "sse+387" >&6; } + OPT_FLAGS="$OPT_FLAGS -msse -mfpmath=sse,387" + ;; +sse2+387) + { $as_echo "$as_me:$LINENO: result: sse2+387" >&5 +$as_echo "sse2+387" >&6; } + OPT_FLAGS="$OPT_FLAGS -msse2 -mfpmath=sse,387" + ;; +default) + { $as_echo "$as_me:$LINENO: result: default" >&5 +$as_echo "default" >&6; } + ;; +no) + { $as_echo "$as_me:$LINENO: result: default" >&5 +$as_echo "default" >&6; } + ;; +*) + { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-fpmath, needs sse, sse2, 387, sse+387, sse2+387, default or no" >&5 +$as_echo "$as_me: error: bad value ${enableval} for --enable-fpmath, needs sse, sse2, 387, sse+387, sse2+387, default or no" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +if test x"$fpmath_may_use_387" = xyes +then + +cat >>confdefs.h <<\_ACEOF +#define PPL_FPMATH_MAY_USE_387 1 +_ACEOF + +fi + +if test x"$fpmath_may_use_sse" = xyes +then + +cat >>confdefs.h <<\_ACEOF +#define PPL_FPMATH_MAY_USE_SSE 1 +_ACEOF + +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 + OPT_FLAGS="$OPT_FLAGS -frounding-math" + fi +fi + +enableval=no +{ $as_echo "$as_me:$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:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + COMP_FLAGS="$COMP_FLAGS -Winvalid-pch" + ;; +no) + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ;; +*) + { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-pch, needs yes or no" >&5 +$as_echo "$as_me: error: bad value ${enableval} for --enable-pch, needs yes or no" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + if test x"$enableval" = xyes; then + USE_PRECOMPILED_HEADERS_TRUE= + USE_PRECOMPILED_HEADERS_FALSE='#' +else + USE_PRECOMPILED_HEADERS_TRUE='#' + USE_PRECOMPILED_HEADERS_FALSE= +fi + + +CFLAGS="$COMP_FLAGS $OPT_FLAGS $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 + ;; +darwin*) + darwin=yes + ;; +mingw*) + mingw=yes + ;; +solaris*) + solaris=yes + ;; +*) + ;; +esac + + if test x$cygwin = xyes; then + HOST_OS_CYGWIN_TRUE= + HOST_OS_CYGWIN_FALSE='#' +else + HOST_OS_CYGWIN_TRUE='#' + HOST_OS_CYGWIN_FALSE= +fi + + if test x$darwin = xyes; then + HOST_OS_DARWIN_TRUE= + HOST_OS_DARWIN_FALSE='#' +else + HOST_OS_DARWIN_TRUE='#' + HOST_OS_DARWIN_FALSE= +fi + + if test x$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:$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:$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:$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:$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:$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:$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:$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:$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:$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:$LINENO: result: GMP mpz" >&5 +$as_echo "GMP mpz" >&6; } + coefficient_kind=unbounded + coefficient_bits=0 + coefficient_mnemonic=mpz + ;; +*) + { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-coefficients, checked-int32, checked-int64, checked-int16, checked-int8, mpz, native-int32, native-int64, native-int16 or native-int8" >&5 +$as_echo "$as_me: error: bad value ${enableval} for --enable-coefficients, checked-int32, checked-int64, checked-int16, checked-int8, mpz, native-int32, native-int64, native-int16 or native-int8" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + + if test x"$coefficient_kind" = xnative; then + USE_NATIVE_INTEGERS_TRUE= + USE_NATIVE_INTEGERS_FALSE='#' +else + USE_NATIVE_INTEGERS_TRUE='#' + USE_NATIVE_INTEGERS_FALSE= +fi + + if test x"$coefficient_kind" = xchecked; then + USE_CHECKED_INTEGERS_TRUE= + USE_CHECKED_INTEGERS_FALSE='#' +else + USE_CHECKED_INTEGERS_TRUE='#' + USE_CHECKED_INTEGERS_FALSE= +fi + + if test x"$coefficient_kind" = xunbounded; then + USE_GMP_INTEGERS_TRUE= + USE_GMP_INTEGERS_FALSE='#' +else + USE_GMP_INTEGERS_TRUE='#' + USE_GMP_INTEGERS_FALSE= +fi + + if test x"$coefficient_bits" = x8; then + USE_INT8_TRUE= + USE_INT8_FALSE='#' +else + USE_INT8_TRUE='#' + USE_INT8_FALSE= +fi + + if test x"$coefficient_bits" = x16; then + USE_INT16_TRUE= + USE_INT16_FALSE='#' +else + USE_INT16_TRUE='#' + USE_INT16_FALSE= +fi + + if test x"$coefficient_bits" = x32; then + USE_INT32_TRUE= + USE_INT32_FALSE='#' +else + USE_INT32_TRUE='#' + USE_INT32_FALSE= +fi + + if test x"$coefficient_bits" = x64; then + USE_INT64_TRUE= + USE_INT64_FALSE='#' +else + USE_INT64_TRUE='#' + USE_INT64_FALSE= +fi + + + +if test x"$coefficient_kind" = xnative +then + coefficient_type="Parma_Polyhedra_Library::Checked_Number" + +cat >>confdefs.h <<_ACEOF +#define PPL_COEFFICIENT_TYPE $coefficient_type +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PPL_COEFFICIENT_BITS $coefficient_bits +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define PPL_NATIVE_INTEGERS 1 +_ACEOF + +elif test x"$coefficient_kind" = xchecked +then + coefficient_type="Parma_Polyhedra_Library::Checked_Number" + cat >>confdefs.h <<_ACEOF +#define PPL_COEFFICIENT_TYPE $coefficient_type +_ACEOF + + cat >>confdefs.h <<_ACEOF +#define PPL_COEFFICIENT_BITS $coefficient_bits +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define PPL_CHECKED_INTEGERS 1 +_ACEOF + +elif test x"$coefficient_kind" = xunbounded +then + cat >>confdefs.h <<\_ACEOF +#define PPL_COEFFICIENT_TYPE mpz_class +_ACEOF + + cat >>confdefs.h <<\_ACEOF +#define PPL_COEFFICIENT_BITS 0 +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define PPL_GMP_INTEGERS 1 +_ACEOF + +fi + +# Allow additions to C and C++ compilation flags. + + +# Check whether --with-cflags was given. +if test "${with_cflags+set}" = set; then + withval=$with_cflags; CFLAGS="$CFLAGS $with_cflags" +fi + + + +# Check whether --with-cxxflags was given. +if test "${with_cxxflags+set}" = set; then + withval=$with_cxxflags; CXXFLAGS="$CXXFLAGS $with_cxxflags" +fi + + +# 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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_PERL+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:$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:$LINENO: result: $PERL" >&5 +$as_echo "$PERL" >&6; } +else + { $as_echo "$as_me:$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 + + +# 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:$LINENO: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if test "${ac_cv_c_const+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset cs; + /* 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. */ + char *t; + 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 saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_c_const=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_c_const=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +cat >>confdefs.h <<\_ACEOF +#define const /**/ +_ACEOF + +fi + +{ $as_echo "$as_me:$LINENO: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if test "${ac_cv_c_inline+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_c_inline=$ac_kw +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +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:$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:$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 test "${ac_cv_prog_CPP+set}" = set; 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 to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:$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 to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_header_stdc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#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 +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +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 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + eval "$as_ac_Header=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + { $as_echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5 +$as_echo_n "checking whether byte ordering is bigendian... " >&6; } +if test "${ac_cv_c_bigendian+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_c_bigendian=unknown + # See if we're dealing with a universal compiler. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifndef __APPLE_CC__ + not a universal capable compiler + #endif + typedef int dummy; + +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + + # Check for potential -arch flags. It is not universal unless + # there are some -arch flags. Note that *ppc* also matches + # ppc64. This check is also rather less than ideal. + case "${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}" in #( + *-arch*ppc*|*-arch*i386*|*-arch*x86_64*) ac_cv_c_bigendian=universal;; + esac +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + #include + +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 +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + # It does; now see whether it defined to BIG_ENDIAN or not. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + #include + +int +main () +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_c_bigendian=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_c_bigendian=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + # It does; now see whether it defined to _BIG_ENDIAN or not. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef _BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_c_bigendian=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_c_bigendian=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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 +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then + ac_cv_c_bigendian=yes + fi + if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi + fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$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 +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_bigendian=no +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 + +( exit $ac_status ) +ac_cv_c_bigendian=yes +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + + fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5 +$as_echo "$ac_cv_c_bigendian" >&6; } + case $ac_cv_c_bigendian in #( + yes) + cat >>confdefs.h <<\_ACEOF +#define WORDS_BIGENDIAN 1 +_ACEOF +;; #( + no) + ;; #( + universal) + +cat >>confdefs.h <<\_ACEOF +#define AC_APPLE_UNIVERSAL_BUILD 1 +_ACEOF + + ;; #( + *) + { { $as_echo "$as_me:$LINENO: error: unknown endianness + presetting ac_cv_c_bigendian=no (or yes) will help" >&5 +$as_echo "$as_me: error: unknown endianness + presetting ac_cv_c_bigendian=no (or yes) will help" >&2;} + { (exit 1); exit 1; }; } ;; + esac + + + { $as_echo "$as_me:$LINENO: checking for typeof syntax and keyword spelling" >&5 +$as_echo_n "checking for typeof syntax and keyword spelling... " >&6; } +if test "${ac_cv_c_typeof+set}" = set; 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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 +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_c_typeof=$ac_kw +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +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:$LINENO: result: $ac_cv_c_typeof" >&5 +$as_echo "$ac_cv_c_typeof" >&6; } + if test $ac_cv_c_typeof != no; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_TYPEOF 1 +_ACEOF + + 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:$LINENO: checking size of char" >&5 +$as_echo_n "checking size of char... " >&6; } +if test "${ac_cv_sizeof_char+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (char))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (char))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (char))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (char))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + 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 + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (char))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_char=$ac_lo;; +'') if test "$ac_cv_type_char" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (char) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (char) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_char=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +static long int longval () { return (long int) (sizeof (char)); } +static unsigned long int ulongval () { return (long int) (sizeof (char)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (char))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (char)))) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (char)))) + 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 +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_char=`cat conftest.val` +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 + +( exit $ac_status ) +if test "$ac_cv_type_char" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (char) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (char) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_char=0 + fi +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.val +fi +{ $as_echo "$as_me:$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:$LINENO: checking size of short" >&5 +$as_echo_n "checking size of short... " >&6; } +if test "${ac_cv_sizeof_short+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (short))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (short))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (short))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (short))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + 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 + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (short))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_short=$ac_lo;; +'') if test "$ac_cv_type_short" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (short) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (short) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_short=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +static long int longval () { return (long int) (sizeof (short)); } +static unsigned long int ulongval () { return (long int) (sizeof (short)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (short))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (short)))) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (short)))) + 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 +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_short=`cat conftest.val` +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 + +( exit $ac_status ) +if test "$ac_cv_type_short" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (short) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (short) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_short=0 + fi +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.val +fi +{ $as_echo "$as_me:$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:$LINENO: checking size of int" >&5 +$as_echo_n "checking size of int... " >&6; } +if test "${ac_cv_sizeof_int+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (int))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (int))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (int))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (int))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + 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 + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (int))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_int=$ac_lo;; +'') if test "$ac_cv_type_int" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (int) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (int) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_int=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +static long int longval () { return (long int) (sizeof (int)); } +static unsigned long int ulongval () { return (long int) (sizeof (int)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (int))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (int)))) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (int)))) + 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 +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_int=`cat conftest.val` +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 + +( exit $ac_status ) +if test "$ac_cv_type_int" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (int) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (int) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_int=0 + fi +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.val +fi +{ $as_echo "$as_me:$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:$LINENO: checking size of long" >&5 +$as_echo_n "checking size of long... " >&6; } +if test "${ac_cv_sizeof_long+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + 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 + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_long=$ac_lo;; +'') if test "$ac_cv_type_long" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (long) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (long) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_long=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +static long int longval () { return (long int) (sizeof (long)); } +static unsigned long int ulongval () { return (long int) (sizeof (long)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (long))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (long)))) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (long)))) + 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 +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_long=`cat conftest.val` +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 + +( exit $ac_status ) +if test "$ac_cv_type_long" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (long) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (long) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_long=0 + fi +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.val +fi +{ $as_echo "$as_me:$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:$LINENO: checking size of long long" >&5 +$as_echo_n "checking size of long long... " >&6; } +if test "${ac_cv_sizeof_long_long+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long long))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long long))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long long))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long long))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + 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 + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long long))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_long_long=$ac_lo;; +'') if test "$ac_cv_type_long_long" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (long long) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (long long) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_long_long=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +static long int longval () { return (long int) (sizeof (long long)); } +static unsigned long int ulongval () { return (long int) (sizeof (long long)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (long long))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (long long)))) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (long long)))) + 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 +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_long_long=`cat conftest.val` +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 + +( exit $ac_status ) +if test "$ac_cv_type_long_long" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (long long) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (long long) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_long_long=0 + fi +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.val +fi +{ $as_echo "$as_me:$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:$LINENO: checking size of size_t" >&5 +$as_echo_n "checking size of size_t... " >&6; } +if test "${ac_cv_sizeof_size_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (size_t))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (size_t))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (size_t))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (size_t))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + 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 + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (size_t))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_size_t=$ac_lo;; +'') if test "$ac_cv_type_size_t" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (size_t) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (size_t) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_size_t=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +static long int longval () { return (long int) (sizeof (size_t)); } +static unsigned long int ulongval () { return (long int) (sizeof (size_t)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (size_t))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (size_t)))) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (size_t)))) + 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 +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_size_t=`cat conftest.val` +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 + +( exit $ac_status ) +if test "$ac_cv_type_size_t" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (size_t) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (size_t) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_size_t=0 + fi +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.val +fi +{ $as_echo "$as_me:$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:$LINENO: checking size of float" >&5 +$as_echo_n "checking size of float... " >&6; } +if test "${ac_cv_sizeof_float+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (float))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (float))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (float))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (float))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + 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 + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (float))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_float=$ac_lo;; +'') if test "$ac_cv_type_float" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (float) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (float) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_float=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +static long int longval () { return (long int) (sizeof (float)); } +static unsigned long int ulongval () { return (long int) (sizeof (float)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (float))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (float)))) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (float)))) + 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 +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_float=`cat conftest.val` +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 + +( exit $ac_status ) +if test "$ac_cv_type_float" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (float) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (float) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_float=0 + fi +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.val +fi +{ $as_echo "$as_me:$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:$LINENO: checking size of double" >&5 +$as_echo_n "checking size of double... " >&6; } +if test "${ac_cv_sizeof_double+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (double))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (double))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (double))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (double))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + 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 + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (double))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_double=$ac_lo;; +'') if test "$ac_cv_type_double" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (double) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (double) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_double=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +static long int longval () { return (long int) (sizeof (double)); } +static unsigned long int ulongval () { return (long int) (sizeof (double)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (double))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (double)))) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (double)))) + 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 +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_double=`cat conftest.val` +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 + +( exit $ac_status ) +if test "$ac_cv_type_double" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (double) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (double) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_double=0 + fi +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.val +fi +{ $as_echo "$as_me:$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:$LINENO: checking size of long double" >&5 +$as_echo_n "checking size of long double... " >&6; } +if test "${ac_cv_sizeof_long_double+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long double))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long double))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long double))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long double))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + 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 + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long double))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_long_double=$ac_lo;; +'') if test "$ac_cv_type_long_double" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (long double) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (long double) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_long_double=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +static long int longval () { return (long int) (sizeof (long double)); } +static unsigned long int ulongval () { return (long int) (sizeof (long double)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (long double))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (long double)))) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (long double)))) + 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 +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_long_double=`cat conftest.val` +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 + +( exit $ac_status ) +if test "$ac_cv_type_long_double" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (long double) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (long double) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_long_double=0 + fi +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.val +fi +{ $as_echo "$as_me:$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 (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:$LINENO: checking size of int*" >&5 +$as_echo_n "checking size of int*... " >&6; } +if test "${ac_cv_sizeof_intp+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (int*))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (int*))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (int*))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (int*))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + 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 + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (int*))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_intp=$ac_lo;; +'') if test "$ac_cv_type_intp" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (int*) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (int*) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_intp=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +static long int longval () { return (long int) (sizeof (int*)); } +static unsigned long int ulongval () { return (long int) (sizeof (int*)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (int*))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (int*)))) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (int*)))) + 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 +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_intp=`cat conftest.val` +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 + +( exit $ac_status ) +if test "$ac_cv_type_intp" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (int*) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (int*) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_intp=0 + fi +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.val +fi +{ $as_echo "$as_me:$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:$LINENO: checking size of fp" >&5 +$as_echo_n "checking size of fp... " >&6; } +if test "${ac_cv_sizeof_fp+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +typedef int *(*fp)(); + +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (fp))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +typedef int *(*fp)(); + +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (fp))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +typedef int *(*fp)(); + +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (fp))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +typedef int *(*fp)(); + +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (fp))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + 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 + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +typedef int *(*fp)(); + +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (fp))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_fp=$ac_lo;; +'') if test "$ac_cv_type_fp" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (fp) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (fp) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_fp=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +typedef int *(*fp)(); + +static long int longval () { return (long int) (sizeof (fp)); } +static unsigned long int ulongval () { return (long int) (sizeof (fp)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (fp))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (fp)))) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (fp)))) + 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 +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_fp=`cat conftest.val` +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 + +( exit $ac_status ) +if test "$ac_cv_type_fp" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (fp) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (fp) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_fp=0 + fi +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.val +fi +{ $as_echo "$as_me:$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 + + + +# 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 + + +# Check for the possibility to control the FPU. + + +ac_save_LIBS="$LIBS" +LIBS="$LIBS -lm" +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` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$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:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ------------------------------------ ## +## Report this to ppl-devel@cs.unipr.it ## +## ------------------------------------ ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +{ $as_echo "$as_me:$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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#if i386 || (sparc && defined(HAVE_IEEEFP_H)) + +int +main() { + return 0; +} + +#else + + choke me + +#endif + +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + ac_cv_can_control_fpu=1 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { $as_echo "$as_me:$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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#if i386 + +int +main() { + return 0; +} + +#elif defined(HAVE_FENV_H) + +# include + +# 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 +check() { + 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 (*fun)() = check; + +int main() { + if (fesetround(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 (fesetround(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 (*fun)(); +} + +# endif + +#elif sparc && defined(HAVE_IEEEFP_H) + +int +main() { + return 0; +} + +#else + + choke me + +#endif + +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + ac_cv_can_control_fpu=1 +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 + +( exit $ac_status ) +{ $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ac_cv_can_control_fpu=0 +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +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 + +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 + +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:$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:$LINENO: result: assuming not" >&5 +$as_echo "assuming not" >&6; } + ac_cxx_provides_proper_long_double=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include + +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 +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + ac_cxx_provides_proper_long_double=yes +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 + +( exit $ac_status ) +{ $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ac_cxx_provides_proper_long_double=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext 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:$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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#ifdef HAVE_STDINT_H +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#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::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 +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +cat >>confdefs.h <<\_ACEOF +#define PPL_CXX_FLOAT_BINARY_FORMAT PPL_FLOAT_IEEE754_SINGLE +_ACEOF + + ac_cxx_float_binary_format="IEEE754 Single Precision" +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 + +( exit $ac_status ) +ac_cxx_float_binary_format=unknown +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + + +{ $as_echo "$as_me:$LINENO: result: $ac_cxx_float_binary_format" >&5 +$as_echo "$ac_cxx_float_binary_format" >&6; } + + +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:$LINENO: checking whether C++ provides exact output for floats" >&5 +$as_echo_n "checking whether C++ provides exact output for floats... " >&6; } + +if test "$cross_compiling" = yes; then + { $as_echo "$as_me:$LINENO: result: assuming not" >&5 +$as_echo "assuming not" >&6; } + ac_cxx_float_exact_output=0 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#ifdef HAVE_STDINT_H +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#endif +#include + +/* 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 + +bool +check(float value, const char* text) { + std::ostringstream ss; + ss.precision(10000); + ss << value; + return ss.str() == text; +} + +#if SIZEOF_FLOAT == 4 + +float +convert(uint32_t x) { + union { + float value; + uint32_t word; + } u; + + u.word = x; + return u.value; +} + +#if PPL_CXX_FLOAT_BINARY_FORMAT == PPL_FLOAT_IEEE754_SINGLE + +int +main() { + if (check(convert(0xaaacccaaU), + "-3.069535185924732179074680971098132431507110595703125e-13") + && check(convert(0xcccaaaccU), + "-106255968") + && check(convert(0x00000001U), + "1.40129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125e-45") + && check(convert(0x80000001U), + "-1.40129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125e-45")) + return 0; + else + return 1; +} + +#else // PPL_CXX_FLOAT_BINARY_FORMAT != FLOAT_IEEE754_SINGLE + +int +main() { + return 1; +} + +#endif // PPL_CXX_FLOAT_BINARY_FORMAT != FLOAT_IEEE754_SINGLE + +#else // SIZEOF_FLOAT != 4 + +int +main() { + return 1; +} + +#endif // SIZEOF_FLOAT != 4 + +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + ac_cxx_float_exact_output=1 +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 + +( exit $ac_status ) +{ $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ac_cxx_float_exact_output=0 +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + + + +cat >>confdefs.h <<_ACEOF +#define PPL_CXX_FLOAT_EXACT_OUTPUT $ac_cxx_float_exact_output +_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" + + +if test x"$ac_cxx_float_binary_format" = x"unknown" || test $ac_cxx_float_exact_output = 0 || 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:$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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#ifdef HAVE_STDINT_H +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#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::is_iec559 + && (convert(0xaaacccaaUL, 0xacccaaacUL) + == -4.018242396032647085467373664662028399901175154542925376476863248797653889888945947404163925979898721593782464256360719269163883854613473748830842329884157359816532025640075051481726120707111709993717456369512975427023957197464411926714771905463723621065863511603311053477227687835693359375e-103 + && convert(0xcccaaaccUL, 0xcaaacccaUL) + == -85705035845709846787631445265530356117787053916987832397725696.0 + && convert(0x00000000UL, 0x00000001UL) + == 4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625e-324 + && convert(0x80000000UL, 0x00000001UL) + == -4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625e-324)) + return 0; + else + return 1; +} + +#else // SIZEOF_DOUBLE != 8 + +int +main() { + return 1; +} + +#endif // SIZEOF_DOUBLE != 8 + +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +cat >>confdefs.h <<\_ACEOF +#define PPL_CXX_DOUBLE_BINARY_FORMAT PPL_FLOAT_IEEE754_DOUBLE +_ACEOF + + ac_cxx_double_binary_format="IEEE754 Double Precision" +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 + +( exit $ac_status ) +ac_cxx_double_binary_format=unknown +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + + +{ $as_echo "$as_me:$LINENO: result: $ac_cxx_double_binary_format" >&5 +$as_echo "$ac_cxx_double_binary_format" >&6; } + + + +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:$LINENO: checking whether C++ provides exact output for doubles" >&5 +$as_echo_n "checking whether C++ provides exact output for doubles... " >&6; } + +if test "$cross_compiling" = yes; then + { $as_echo "$as_me:$LINENO: result: assuming not" >&5 +$as_echo "assuming not" >&6; } + ac_cxx_double_exact_output=0 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#ifdef HAVE_STDINT_H +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#endif +#include + +/* 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 + +bool +check(double value, const char* text) { + std::ostringstream ss; + ss.precision(10000); + ss << value; + return ss.str() == text; +} + +#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; +} + +#if PPL_CXX_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_DOUBLE + +int +main() { + if (check(convert(0xaaacccaaUL, 0xacccaaacUL), + "-4.018242396032647085467373664662028399901175154542925376476863248797653889888945947404163925979898721593782464256360719269163883854613473748830842329884157359816532025640075051481726120707111709993717456369512975427023957197464411926714771905463723621065863511603311053477227687835693359375e-103") + && check(convert(0xcccaaaccUL, 0xcaaacccaUL), + "-85705035845709846787631445265530356117787053916987832397725696") + && check(convert(0x00000000UL, 0x00000001UL), + "4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625e-324") + && check(convert(0x80000000UL, 0x00000001UL), + "-4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625e-324")) + return 0; + else + return 1; +} + +#else // PPL_CXX_DOUBLE_BINARY_FORMAT != PPL_FLOAT_IEEE754_DOUBLE + +int +main() { + return 1; +} + +#endif // PPL_CXX_DOUBLE_BINARY_FORMAT != PPL_FLOAT_IEEE754_DOUBLE + +#else // SIZEOF_DOUBLE != 8 + +int +main() { + return 1; +} + +#endif // SIZEOF_DOUBLE != 8 + +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + ac_cxx_double_exact_output=1 +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 + +( exit $ac_status ) +{ $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ac_cxx_double_exact_output=0 +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + + + +cat >>confdefs.h <<_ACEOF +#define PPL_CXX_DOUBLE_EXACT_OUTPUT $ac_cxx_double_exact_output +_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" + + +if test x"$ac_cxx_double_binary_format" = x"unknown" || test $ac_cxx_double_exact_output = 0 || 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:$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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#ifdef HAVE_STDINT_H +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#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::is_iec559 + && (convert(0xaaacccaaUL, 0xacccaaacccaaacccULL) + == -23475151196235330448360987288488448023604990597437922665537894499317141030270831473500040521309097782521743811281100731620612303910141158923283064807755815684643856544564541670181998003713114595098650350075763370916908460284838902787487703020001649220669684278577319085319204471093693972621987808779314674903648668236688723332999785552894845325917244897920804830290985291535343986477508649100409893486651507134071296739623686984014433965803259868867855465109457220731656260670349710137932272802677796915669809481885196101414678015638835049035133835457854893845093496950772367562664955830097293678125205138879788670490610650322134182370990336443894886171520732434535881085387893610114822547025980969387956199048733969351859470324032549906964255557877860343871346618951696178837035563054101786829980983909935265617095747543882856776297861197958453847978446679149969948882161264279705948735019353220550905117946051015070744207453853343171175921378515361160726195198161165083475968.0L + && convert(0xcccaaaccUL, 0xcaaacccaaacccaaaULL) + == -3.234349908433673569788362433758236701401379200386310478070230491201716094576208088733092209352711081763530973139439402754721006217889031902309566905344106766697050593355851405189694125966100801537593811320493850579152938679705465870788684523518541806158791408378718596936132854683425581754205242594614192465876640102628432246897674583649745467641139234207139584810101868772915312454075582265240687184279243861217351667059920878236164506473261797703393981510799228030778152399657445848839855361831637014754038570644257393307922665529947406582062857348101442206039278033447012163028384634753160589791458287895963629514043345016273218385584012204321293761500625038828699451659598873739820939586314044735551522599884065690704853850058509917597610804664086074437219778400030370474948166770867639885264893441594112815147445129222900623635467542926999246959939000796968650036727515644358583656635086409945418378371210848857160579105176395869221692977516017583375976424496977231821652434877830409470264872173686708172667000681514442371517343085468923465834742925914605731609765839631967460042791316319023971980691582832232860491668014341598553021017317450989919240909832141247027104138677882497144506317212033031539627613710631490195651235049780490963461514410018833968072513381369320107740021476622121320911875995678620145217379068502893509758814753434218746970000807381369855297087472398985134583394635298304301976743682254755898799853471470973139487587740504614698965906370516694512439128548402418825952236144896863935402725154209604537541130862513767786738372717442238281296070010302255703329785136750848608510805269562580550421695335686256291415407706167513127610045830074144232174636354465520547408627155363076530824695464544496846799567213412195115628936631295933321590908845288558910694118404555858629368018552451467994715743285452343185080572139353967831950470208768524113647528966442712608411306460439403733081312454377815407740431356862292588345515142587184008493066353603658341268923669196617183622259532802077159684815974630350730226266887950469523895272137382682818583664766982004756872470359454855421231861600855405622250180301557001727658100463825721179482988287599820459238518127671242515104954727268296043840120459189992322364113432317376499876615018647681005294400890426164141474245830847447887800872845238979407896829797297990804023745291564182356173092302630416583955274584512411637160723327887646112927503049935866004964114798241035087343318592736488780742013424329479787548324846879335440582948017481856461250014099199025874264395426269044157577172368261822794071985989844785134561848837459343219269316428175168803982908920457749528709425299296467325603578851955843550406474402944350694486492967809731047663564513772408591390180588458110788180950470244902062953534590109356800048878919144043979000989724521292698054747484439706733411566872999353418986588749568995482953622089499726327807058708520455805869817259837526415584189633013162307753166636151833127563746069733440228640737257520299330767346391011026088684503955941755171481192133779119344715318224728775697330484860348152872987113995597980243907204928634355356748752501217143216601222634344211757170284222785899530754663487291354339744025299042982320199789070467212765859078265587040664859899997109073649635056953085131587344086263213972132295294758682559609365238437544701417284297826732242650999654640698637095193178119502815643930373741504018967640638120546136857104880094633373762586018322104925768619990210092851075031033451925224377383389610824173203445111896055901190132142204139463967556738295382942065540228560332044410017389129348710403201272349054427064370609913529996988445571571382916349536222256815467149849706750571813156961918737343978667568453623162377198802996342528197935118265696537928993634621119483415202847968129550048667353312481509419740177690982818603515625e-1634L + && convert(0x00000000UL, 0x0000000000000001ULL) + == 3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587346566858083349053123705193988703983308587839946322501468602459466376586870456423634710242397194658860357568067134477982764219736292817751295560536845761267846647908517463250923736039512722781415953366096399444403402117053488448021977763604437908687623249034116909294550532283554604255016471048510990155249694820376175072774521597924829264164672829379224834378522148847524461653340453140898534938901079999466084995792940867082225167898092626332284133633537230365710606672711016101696986908545526816093446785575823545286456670464909287063062587561930219192839574686079732400741932670792586584247903252601714502511652018733705556477669856403061671860988301022089008752404238293812121415758527179547281628232710885994458574715033852877595426024800791719981955344151916599003503828822200355665967958771090937688409231050763744882094456320484272716122798149836361660589595209083576887254232532955229749892640550762959438241278496193819382077545905461172547961340469817691165676094261320725727312607482937653140421619686103059529199421431937449566099337396063075218302243845475341677972462038126626903408167086517545386382155008956065955410392914952623927880847159533184535486666480480563407531428385329300522477684217050951264747454635754866214784941542315111038630684391425212439304190584122374222972284606537485052464648655369719099026760518287560996997210778473066980129427427439517032390964791367678221749630975419713438139162678878555999177528450882748046538588177447270306738234898502976902853001364550405227287093940058325788585457368654991956265863050083472087623066020903378919489920975190829421602010382039477772083400661519154972695436582305021910908576692048173534958894170976763084807837402813849227540942073315401115262334876815962087441302256558438912500607230205782013083674113023497612445214795170983848687988348203289441256908755565216081815151205638893112562415329084456934095146184469290901166110634875590164835606941629407489774379792739804674764243483912084691871769225446506284310565309190872477286255925383528545036360550854226919571246361133225904820301916588317084377712259367894846411294822587075835486985645510829880528578782698412556249274522235061092454342386202327120407827540333914613192189174315884136688019435966273663470431440443032136411775605030601436837063972690330417475187330200911967500496761618122614796452937124070398703890868915527051490465736745397764941094879479649438162576614346948652085308024696358256756585794568493319042053882843808180358787110774418075478801186519577416271896383169835708225636584654568643702618602433548938163720732772538345454513065011540675765510656970500413537205370067924880209217363407323673368448004904408413977741706965494247040799786451861822188473571257556819433284087486023676249467869483631380473856486239547015603318322612783652068699798539400406637311682731115340677841660240710431551140370410375585572939303084073843540702120551963050514959945741359169911676575478403279380112020347348292538150798320452794842427526501796852911863108178276638472320237870082862271763396195139513712303136194366021540830531456910584048372546025177765140460207112923151923176402146752868221966889915381596481253160696822260723194259521813054303457222367967929268763072892355278854714278243863110783067060124459039315528176840304931522813148745824350892130595015198002557204332483215551447097512510076223364801202888087635650654634946887232727623906459076670227108634162319210357007273369354657187569046394884895083794103531835959613994575377897775525461977464747518162975010091463561925032742645594645800581600698347817023194379921397347681150492687237349021564206463096138703201250277757980410772647014391579144424375252519766764670458008515297647624144814453496069685127439800629552075692648608681506879044376428977463175175205181547958459515159074701285838493694034007662410100183533141516684185460758175066481561018901133031951042099053297118837448984443230856642737606478787880285299903521855025612413471034466624171559209077538498475106811294029060334271803320566493935024621719717684804443351866946690525266060758332190531807232565501890293754259590947433140384335366973398816899253698302119916142891631005349335372158005779944529176735887193980409288474621694590303098552382376969442365186023130985507823617670051191889015351479659778676132449671642015059540438237303922903056079068344635440276772565425944329927654906262952475555750912023879424636021462043321631428365675851865654901693474343411406220907550090045689588323936814675126103464401223728058185048320475251266882875299120582253090033177883674432343812734123922042926554908548231473285349572210962289889800994026533629321464700552029391517293055196218065667251276237490129206098414338903210942488902792253924667941082273267563528653863343443486495762400409978995985052082310730277076965242846278402568285187365588876653245423047205943478612931964211293489374119565751486787204884502307512372923973119191125614068756094526892783321688030310900558025683455451898487401139315290743477461921025987905332236299398859448938742087487316288730711068752763449392366897236258997091176996253284306687635454361862179407191652155243650619571720232128624130785404930566805029233271375546253313287446285812219961565022654510373870581648214791139170870970509074158721967633425471550515801498191107216277620692347014234913527385812164834475002007099402122991439542783981984927181300669603290190495106195784248531299740262706106798338573523977365240941293695214188675632715447081372252551022981921251125675131839210074132286029621443262127145872022404314258219255606415280218445074654034790115075558513374422753617188198385931164810182817002794172279803028202086567081267453349341345496389239379776494419022301042067986600501045466950004057134726934147691678031986698845370299987067384407310337433828116514830745374490760171672152978595040351405572526523026051215093709900567873568385242574546385008567738263951532676549294356417565797771595638496719149577804216291892125541055147173723744991756669672459021375111288754125372918394417976243093028214703329386031799313949535161343892720409046065009958980978947997662545514664194262097665297242612367968766000629174655887090824363583653843658980277566031286429628476318572915045823895805826010132712977834418613468288832988547377174550796802573148684253294172285056777826927377158058647145403557721233512002495437339413998842782599710186215723437958154275340509811072349041046483806284608873394275718878590418692809288333423522781240698974441829879303794241455852776713321354870647251094720675572322788447908778778892116234131617608416732280987493141331884927860259324392781255786150891859203497212615916404999097067778739914857961305884934678762043515521190581898256624635957830927811421154992139986999936203631149852372802564314896151749326404428772008250428569338329698161850171265411426708113723558325059062871506712838460986031147060351491506316012532538793354499545667009527573810892048004652452452139688789392912938251888341298122235232861138733903153560967292104241190946350516769769305030762386908399592555043192236069279491224465826684203312081255431851756341234566913972589390601558650830437402045595207689996159597545711808203688318112918947661662115802919578636403430323041610018063696707221249826383715263388850307418469423973486747009233945036220901518185766942733836846126816638158345048782728241251279820310193223512959111029884002230571688216854282257873218631744450950552327428952538149545262779889824399028513132208638633070602135522752076661567872472325125674291268881849101416382703647451428232847993332157180794015036365361645888146355749366150209085457189187232786399585879941680370348141105404742298452497895369287193974496140445677301271403589665822911096832952021181343571136957607816318342755770560406569920261633966403484121679869542684843686908354373688437968683525723666121485947946747887572716360800696442816474113593466106089204179554677145374582437962664618883018628687510079511252556002241788346284019750863992283906513572325918053464080643521532154825074820239077990779007069588034029619562190416747359712884084324521598678178890186409451480686781733176824920276835002477523486093586963733155424491897575495851549527034538337694314953057164019215026670773910997443279760005290641511584707193226351271670439775141076552632736166117611394934325673743882365518318561208941552931629125136799711574578916741023587251428998946963182411650554404206416336487418656105333038545773960190949602850096208569085230228708894874577523512558281973392961263921656163963369388411763476388625952406901518273413037068643383550282962237729195901788599392876651086599849223994259145259240479384380657803498058719062529007339428316229997756899857712116922758683071707472935574499244978419788171338468471751125303860911589289400806637202920429489919870263415951660888975434827304297451362325052693482001524843171229078467910537913138115458626612024970730899515114301915281613929239329351501049859225274564107846818112938339161308943153205117651716380468462296193882444293370484368530096898812778973178284912798550245246063411918482638261694029245273291646707331594675213428158755273882438357960245064051015888918541801139771619743221405037797285669481455810653320008904215997597975907391512026214020012010134707536774227636477580918167507850485197065326391091171451763751237612739498468510009055480025096015985581769370179656781151306565952590101977398335185042637681982306448413722177895665290302796223004198526079143104070007874540548221582347389579e-4951L + && convert(0x80000000UL, 0x0000000000000001ULL) + == 3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587346566858083349053123705193988703983308587839946322501468602459466376586870456423634710242397194658860357568067134477982764219736292817751295560536845761267846647908517463250923736039512722781415953366096399444403402117053488448021977763604437908687623249034116909294550532283554604255016471048510990155249694820376175072774521597924829264164672829379224834378522148847524461653340453140898534938901079999466084995792940867082225167898092626332284133633537230365710606672711016101696986908545526816093446785575823545286456670464909287063062587561930219192839574686079732400741932670792586584247903252601714502511652018733705556477669856403061671860988301022089008752404238293812121415758527179547281628232710885994458574715033852877595426024800791719981955344151916599003503828822200355665967958771090937688409231050763744882094456320484272716122798149836361660589595209083576887254232532955229749892640550762959438241278496193819382077545905461172547961340469817691165676094261320725727312607482937653140421619686103059529199421431937449566099337396063075218302243845475341677972462038126626903408167086517545386382155008956065955410392914952623927880847159533184535486666480480563407531428385329300522477684217050951264747454635754866214784941542315111038630684391425212439304190584122374222972284606537485052464648655369719099026760518287560996997210778473066980129427427439517032390964791367678221749630975419713438139162678878555999177528450882748046538588177447270306738234898502976902853001364550405227287093940058325788585457368654991956265863050083472087623066020903378919489920975190829421602010382039477772083400661519154972695436582305021910908576692048173534958894170976763084807837402813849227540942073315401115262334876815962087441302256558438912500607230205782013083674113023497612445214795170983848687988348203289441256908755565216081815151205638893112562415329084456934095146184469290901166110634875590164835606941629407489774379792739804674764243483912084691871769225446506284310565309190872477286255925383528545036360550854226919571246361133225904820301916588317084377712259367894846411294822587075835486985645510829880528578782698412556249274522235061092454342386202327120407827540333914613192189174315884136688019435966273663470431440443032136411775605030601436837063972690330417475187330200911967500496761618122614796452937124070398703890868915527051490465736745397764941094879479649438162576614346948652085308024696358256756585794568493319042053882843808180358787110774418075478801186519577416271896383169835708225636584654568643702618602433548938163720732772538345454513065011540675765510656970500413537205370067924880209217363407323673368448004904408413977741706965494247040799786451861822188473571257556819433284087486023676249467869483631380473856486239547015603318322612783652068699798539400406637311682731115340677841660240710431551140370410375585572939303084073843540702120551963050514959945741359169911676575478403279380112020347348292538150798320452794842427526501796852911863108178276638472320237870082862271763396195139513712303136194366021540830531456910584048372546025177765140460207112923151923176402146752868221966889915381596481253160696822260723194259521813054303457222367967929268763072892355278854714278243863110783067060124459039315528176840304931522813148745824350892130595015198002557204332483215551447097512510076223364801202888087635650654634946887232727623906459076670227108634162319210357007273369354657187569046394884895083794103531835959613994575377897775525461977464747518162975010091463561925032742645594645800581600698347817023194379921397347681150492687237349021564206463096138703201250277757980410772647014391579144424375252519766764670458008515297647624144814453496069685127439800629552075692648608681506879044376428977463175175205181547958459515159074701285838493694034007662410100183533141516684185460758175066481561018901133031951042099053297118837448984443230856642737606478787880285299903521855025612413471034466624171559209077538498475106811294029060334271803320566493935024621719717684804443351866946690525266060758332190531807232565501890293754259590947433140384335366973398816899253698302119916142891631005349335372158005779944529176735887193980409288474621694590303098552382376969442365186023130985507823617670051191889015351479659778676132449671642015059540438237303922903056079068344635440276772565425944329927654906262952475555750912023879424636021462043321631428365675851865654901693474343411406220907550090045689588323936814675126103464401223728058185048320475251266882875299120582253090033177883674432343812734123922042926554908548231473285349572210962289889800994026533629321464700552029391517293055196218065667251276237490129206098414338903210942488902792253924667941082273267563528653863343443486495762400409978995985052082310730277076965242846278402568285187365588876653245423047205943478612931964211293489374119565751486787204884502307512372923973119191125614068756094526892783321688030310900558025683455451898487401139315290743477461921025987905332236299398859448938742087487316288730711068752763449392366897236258997091176996253284306687635454361862179407191652155243650619571720232128624130785404930566805029233271375546253313287446285812219961565022654510373870581648214791139170870970509074158721967633425471550515801498191107216277620692347014234913527385812164834475002007099402122991439542783981984927181300669603290190495106195784248531299740262706106798338573523977365240941293695214188675632715447081372252551022981921251125675131839210074132286029621443262127145872022404314258219255606415280218445074654034790115075558513374422753617188198385931164810182817002794172279803028202086567081267453349341345496389239379776494419022301042067986600501045466950004057134726934147691678031986698845370299987067384407310337433828116514830745374490760171672152978595040351405572526523026051215093709900567873568385242574546385008567738263951532676549294356417565797771595638496719149577804216291892125541055147173723744991756669672459021375111288754125372918394417976243093028214703329386031799313949535161343892720409046065009958980978947997662545514664194262097665297242612367968766000629174655887090824363583653843658980277566031286429628476318572915045823895805826010132712977834418613468288832988547377174550796802573148684253294172285056777826927377158058647145403557721233512002495437339413998842782599710186215723437958154275340509811072349041046483806284608873394275718878590418692809288333423522781240698974441829879303794241455852776713321354870647251094720675572322788447908778778892116234131617608416732280987493141331884927860259324392781255786150891859203497212615916404999097067778739914857961305884934678762043515521190581898256624635957830927811421154992139986999936203631149852372802564314896151749326404428772008250428569338329698161850171265411426708113723558325059062871506712838460986031147060351491506316012532538793354499545667009527573810892048004652452452139688789392912938251888341298122235232861138733903153560967292104241190946350516769769305030762386908399592555043192236069279491224465826684203312081255431851756341234566913972589390601558650830437402045595207689996159597545711808203688318112918947661662115802919578636403430323041610018063696707221249826383715263388850307418469423973486747009233945036220901518185766942733836846126816638158345048782728241251279820310193223512959111029884002230571688216854282257873218631744450950552327428952538149545262779889824399028513132208638633070602135522752076661567872472325125674291268881849101416382703647451428232847993332157180794015036365361645888146355749366150209085457189187232786399585879941680370348141105404742298452497895369287193974496140445677301271403589665822911096832952021181343571136957607816318342755770560406569920261633966403484121679869542684843686908354373688437968683525723666121485947946747887572716360800696442816474113593466106089204179554677145374582437962664618883018628687510079511252556002241788346284019750863992283906513572325918053464080643521532154825074820239077990779007069588034029619562190416747359712884084324521598678178890186409451480686781733176824920276835002477523486093586963733155424491897575495851549527034538337694314953057164019215026670773910997443279760005290641511584707193226351271670439775141076552632736166117611394934325673743882365518318561208941552931629125136799711574578916741023587251428998946963182411650554404206416336487418656105333038545773960190949602850096208569085230228708894874577523512558281973392961263921656163963369388411763476388625952406901518273413037068643383550282962237729195901788599392876651086599849223994259145259240479384380657803498058719062529007339428316229997756899857712116922758683071707472935574499244978419788171338468471751125303860911589289400806637202920429489919870263415951660888975434827304297451362325052693482001524843171229078467910537913138115458626612024970730899515114301915281613929239329351501049859225274564107846818112938339161308943153205117651716380468462296193882444293370484368530096898812778973178284912798550245246063411918482638261694029245273291646707331594675213428158755273882438357960245064051015888918541801139771619743221405037797285669481455810653320008904215997597975907391512026214020012010134707536774227636477580918167507850485197065326391091171451763751237612739498468510009055480025096015985581769370179656781151306565952590101977398335185042637681982306448413722177895665290302796223004198526079143104070007874540548221582347389579e-4951L)) + return 0; + else + return 1; +} + +#else // SIZEOF_LONG_DOUBLE != 12 + +int +main() { + return 1; +} + +#endif // SIZEOF_LONG_DOUBLE != 12 + +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +cat >>confdefs.h <<\_ACEOF +#define PPL_CXX_LONG_DOUBLE_BINARY_FORMAT PPL_FLOAT_INTEL_DOUBLE_EXTENDED +_ACEOF + + ac_cxx_long_double_binary_format="Intel Double-Extended" +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 + +( exit $ac_status ) +ac_cxx_long_double_binary_format=unknown +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + + +if test x"$ac_cxx_long_double_binary_format" = x"unknown" +then +if test "$cross_compiling" = yes; then + ac_cxx_long_double_binary_format=unknown +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#ifdef HAVE_STDINT_H +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#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::is_iec559 + && (convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL) + == -8.55855653885100434741341853993902633367349104766375354667159377718342093894815477326286823233135691805519944470138219932524951165689852082013017904043605683486724317550972746307400400204571080045247416605879743573136814766221652651396476675668866980798618379071105211750397249729982891787041148520384572930274879267722158826932337019191713973025403784448443813348692062209940856126724493492803365972504505177354875652033856070760087261648660638833868952644144747756799606849182265604546917705495630867683634260396102823982577953799017062698102242357552179655099799114234932578035799185560231199083485854936098752376968393647581458407558794412029383325763638562788717260040049064497131924995762524305159587498016677454321953274959044696323291625045478494472581264819229447771276640446297211105522340278216491094195598543872903469867733674572559977106495016037365144714092305087690135013719347274733034998868445412589677425060095799279101903473205374412225289846468374532481297065712317082077938035156602646698351182648104255704218634101302925067087078955133405900007044267209898310644310904503791609310204530573463263951434586894153990739119187567218316060343579381319744970284036645819031296341711196622764674251739340075981861518157380656135644972541894187627902651874054588734732906342927804126694032667794810086817870907476586539935233288396561987441453006798066121939082312783518917156845604116991071351557087417820814737448930366014934139649936714605919733198611573267554373841805458030152706709963798138766665437195696286204333504023648063774567253657433115103351104190986192714072985487851579415615609526545777708652951405409847708647802254957197551148967040887700676749608935220270768342493900689974647088468653016844028721111482484905641458435567969469008688175230469940968306817582881926746422674891155765989419578280531847369896579997902056370886853884911608932917273377526774091310024267948445090595150848945937264274298230316059283748541372546998570685254364147022857127106166375807928861080771495427281772909457414476961102929683460150380091022216902985688084496718499522925736236100966839490544989265028487132166444183820209811985298620037327410566483546092567386575203772065259924817078378553423445114795887961447486917127608105936488957460696218995227900239169698156532097505472359601263421630872600694896078087993492528322817946497772710008837719609909497752428441503174822795185219988589528998338631725113908025553153842511443825016809012668839505492083731555461826355018782953670089090573806418379608917728933789667567839232807208925449602517595541397929042673972541764273293287457694772131268012143158809453627483947788463130353101911401667613659585055576869155534998835800762122080588150495103765874874613454517177121048246498282285280904742153700877576028449241385429235777250684782328183787286276152331338688335510090441008799792147837436640030059474106105829612076012626498555138419516242851436828131901668517305064107076254421670883938440896580435257206350630093337919967881954501164988008085285088049681541452106188312639266136685237513628484410146475880276899689323468288129178652504797093820419402611691354199968499448738482587415636727937353639264845197813295922091561637504736126720760129127710879063043647425297778439069116811334073539456451043564046959839163407469915211595468718792531664679340442279513006653831781499155674396529973036072198720572542914738630057353297633085013244779323578115668031532144051510758240504037804690564298890171218568053886450388507561335540224075309922339483204122333658701871584147135738144358394867585372134490396264937274938848938884293776466212293402264641368524174512841804801230279990820989956713963566987970818315606031084417487965298373510594915942429581446481759482857537804431542098380533075194397625795605337047384493682506827547173206735463795863376044170821429161475172513429888642402089329334654087406739184258619435041737233405001461505889892578125e-1644L + && convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL) + == -124514581107511552210796456934966803687304842980295573828954497922493752983397188814711304411560018580965744046315133789985274208017368151964100284400784216106649187287727268989948309893335776137201236307422254490384994342132786695251856340822607539332337741185911979986209464222776112117543477310592395735321641016191765613924234896253051931334188353106422231052895112533426462965071195000083346118845388851222468275853899619767858364593491745895616655921022591572983370616010095670881627966440183912948095715866505356803258659518882310562527709556367822539262111581385341941163873435919341717170180065638145777392282815973491833042960716493005101610346003273833563515742996380936304245423639950200211170835546053201980835724318930743625600269679260909350277600256315069013053332133830043213033329696436217829598890872375814523266366034383531514035947792389939922899745714167418517458817088636450662300503353562047987996978943856662174717195437379600755109302771921946748859230686543872.0L + && convert(0x0000000000000000ULL, 0x0000000000000001ULL) + == 6.475175119438025110924438958227646552499569338034681009689884389197039540124119371017671491276649940255878141476848119676587219886382542046685110071972617983042792710751334934416734625638471740239448526505553990391455556252171148068070822034688256982476272828789103028357337561348031062386564592639826226991907907867663262065711211583064657196068308332845234453069760526489447660964579313751403402631804350039948870075255648713368066117879403155766713303467434937062409411685215137607333139422843835051668983567167196802642952353504079714347103860537782893700215521168667711042950610021881513627986429461700433339201935397498825184335385514892844339930852967838448682125502304114122153045946465463084764110174478737044335312389661483639210553943411476544786261397875064191451226767614625892790369961415069606980007080502788648919975916801878222002252381723047230971876570995428821219281596547633023538783137183646396952831530551068683419596735374086746290525867996216905323365319885172609956827625511036332478353228947631880050684559150608318986521540136061273771493390412784756552103897518527764158778759333880714882279633323826397312375406927039446525306447838514371503654987855172306307584155459826707095909617752526800401326990828721633726770440915439092677906646798573524199116648264206920451160133635071361773812121716528178148240720783226736549623736135274990309138143183248371959875978805027500928693808073336955752759088442865600075199888998323880643549670055505421362435108572732087322982027187772459231228989472372951864321099261878781084330252988333921362998963303722431059741968763452406953835015120533773385289904710843628402700274702870474073825248828889984994284607604847211794221210729913159829014217168004461049532662696542913183628157199561641949923936629368992856621383084545327636972265542355341749855663020004887316835216156767223053799811067258913808469994232607858854524064432145775922144535701236468985705212977045479489515690009388923625580685788707605877343857669170894656797423368490329407251160393356048820607085089069025413584269816739747211239513550414383117508826763143512862006497058041145296097892917999935577053234252698691933792724753682184537682835562829938630004838384363944243137622864918257474256280127291116965050600178120477720784742184205376195975831677721764740044536624645764471381571452381830125398765152083287483110279394697855915713981939970684599199594863007230624076786139617554631450734995190081932187616814234632738778224433256463738346435274905710925581106061273840975592931761266799265587765468946764337085192369358316298457450008809428586921504743730873895710474614480003727146162349858333291516552162545370312200390841588309480973274631646273597390249477746657131891196482398670118797910098918899689482196956660638225731960693542763964302308999692957091061300183648329785182793301407267200046383043005236759977387601407769110383295729918654520937785586390633157020347632812108728638589813282569529576769367173324764085285705308312954957401558247168739931446569422818723482471097374362105279278558570746278168331596903799527959001674856155564619821407044799720020620642233246057848236476047540762849788325435630592420194490443539428990899488655890183886788650518595542180257939200539645041808387760238189562428351774632440622618056913137499820021924733173668036806485733443567039613866037176155955253827548473360440517049422696075501183292573063250613021167503858561082238374439193413231472608072888733326512853287806773389073299297372760244397355791502004654458118728037510329034120643030182346716011974996719598934277635297762958837247389366909763367493682299430362668996193935405226221180280462691353912282455701759810037116439968883639596108926413528826200502511551071661541071241892319070812994269518086385295992381025957172992399312141414210235547707008555590049509294048331178258885645254295737834927590332773105843826797756540039810295021699037788228205072146738094320261980823252096852875670591366194556595549470362090317233349128160475626293246538430039226463877253517855062981890058712415866578727694362877805078594115939049922697215689139042884475829798201399221843339843144334329750976265054375898637087619406776357862341599539585772173362569929723217313856218610739079911693928395573354107695207924389443047735986097057117102761647398583746704066222192489628491579241861512228457942727677656217068060304063431859444999092873095546808035894071193872676924207893595051334067870866978585241063298399448801664979503576258730853137762656715932674584878408765074348715350808211160488037567370082449596914044378631384351574514574407266268601518418121140639017772950755439822352142605465639756330937185434812776437455170052704254873689525989445652781559474644227537684964321625946200647347726100468875445797592291192363724641100602571723960104389727561487616213893880158699261565353860394268412519478250755882121502350855777548987354957187611364644347783460623918569790357712078708030071729862147204119062003145783057657964335620490686654777775857772417230654005669380137272188650104502859563282535642734533430567287319498304528915876638370296607209654727246810120749147011579846007686876872348978767610197018167444101532656500699586407674404325249380187066956228877621206281130141035339929259895087216809976356039304176324615051223863642132987493989282096132023719628675179659793099441124234181354583082636306115430335248256636595542753063577946177399294336318459611754831189657065079679934928129113295189411660749306226747061753316760480290760846421347557553607185254462514991634789163215592554565288625021429064594217444034435094635489801294636044217141894128608560200837942901104014713783039046587228833888032709513732700101667002833885010142407620233438106861087062055906874872893491133678484259720820886397724438939944326449942516696628683510030426237257765426269532595248183289611602373952305073827029425838481007443361481172033664199893614932623554378101313353925699162767581809444174957293532641034112367163940472496454826645496608268491435975330754792022473413254641635309131365360013914909519963236046952897089347016136738984133133790874101143168691022141918967797877476450100585067348766183224990814253610763592974731784263832853675045343246533254966131311531411068478710429786791811404658680805588105768518292098129259164151153126615341498379324353953450723874092401152015787628879390603785057522375088322779364007018433582543673090990833352296302290390165336647355242365982903670648563727239283547241202029021901993493453231407543942533374303128855544718854681133818703717309615999563617026069360208156393214924333856037726771259857931298487909006782987195926835910537279213582905667384935745871483880724959685377284455451325009389359115356341859747548302075715614439876712304113995679250907454883895302396632381653230532032695481751231940062856024456656381220713413431325444483757534262449339675147214243079144598658808202548926312120596697863356554722348114194969409174072455372221354826189882023922524876054935905929454258925505387898039528329076689551108932342856243697999637938228068665595345855978215420274558562368590236467711884770512666328306756286559348574636272916414332349992225277379071952095234443041820054854970323931404077610323730988914889188356127533914074856107086479831584739755622106834971368997334246432264012757261628954213626177797127289818357558926591911175376134554737367672941224416966599144520688033032388494464597481600684233179969688713377153969107014820586500187890028419759966629125896903859724482018551567368459339437282027473163713630554370146518281068049701849575089743432349308849281456182745027011845653626290780738299181305772482001250991761047543344790454625943156085044661103576512523366161351099640751135385148305913987889008698009234370941891346098306437937661227172386506980636903743541285235605780167216008920828610842066522096589500420940606405692664109905063234866117077516308694175709123219476283230290207497555159467149979347020209673500496651023554475005053991295374430728524771212435107382664318842703197811901075027036703041419315229156263279708865064004473392401710817533040210152757966691416471836361498546249180866049039738294265863864925406135752428537159880132061042828090772733103561437021070938835520484987564784902357826645006185384847299711513042558913116550679842981785737713725790045128094411676264858573201529073678073396387519268373798582548263868592119666097381189255247190641352195443081432945981901223716745712543744847146503012460085216148335807619624528396069010370871981642712755932969484501155184487454597846375782598809708096893645439856478634508146859065978179351007580744928974114529788215226484601824974140107352758776378993800008479463640459773788106039221647527915619638375897279653946867057366337834721265500081035695372958187077367633848426351345959537644131255393886949828040966112768013745671476622221973172299021322723830684345054818157484501760113734299662298242039459694484074671808880126261963999301400833575366587220239180443885948634911432672454909578479586976064598126633177835011824812040440090529736915436564330317784343260941419199007994565556336195654994767768391641843167291242587882400091208124348669996343070061026732554587428779976439512259161737036335847682346728539549778493388870528102969822923976454022477322075204905420377823800876540724560782242540043358494305758648390071388556142954991440895026034342297754624387472732697423260211014731729196139172514053952591428247887383243344755389104496037975360677224765591211970382212225942797592005272680787386239303946689423293709148965999400795905073756697025967564396661027489606337872152854151887574400979150870295978066773059913103141338094206140446153595784659696116999451265627049162745281492831846033865707908304944975732574637090102130752860241496159897720566523711477673910492376257245019657271734451417565932034846341070093018262777507790026122302775680179025723685230883459924631462602175535978001836273235741164283034661871238537285831967107455175175353583907073921428e-4966L + && convert(0x8000000000000000ULL, 0x0000000000000001ULL) + == -6.475175119438025110924438958227646552499569338034681009689884389197039540124119371017671491276649940255878141476848119676587219886382542046685110071972617983042792710751334934416734625638471740239448526505553990391455556252171148068070822034688256982476272828789103028357337561348031062386564592639826226991907907867663262065711211583064657196068308332845234453069760526489447660964579313751403402631804350039948870075255648713368066117879403155766713303467434937062409411685215137607333139422843835051668983567167196802642952353504079714347103860537782893700215521168667711042950610021881513627986429461700433339201935397498825184335385514892844339930852967838448682125502304114122153045946465463084764110174478737044335312389661483639210553943411476544786261397875064191451226767614625892790369961415069606980007080502788648919975916801878222002252381723047230971876570995428821219281596547633023538783137183646396952831530551068683419596735374086746290525867996216905323365319885172609956827625511036332478353228947631880050684559150608318986521540136061273771493390412784756552103897518527764158778759333880714882279633323826397312375406927039446525306447838514371503654987855172306307584155459826707095909617752526800401326990828721633726770440915439092677906646798573524199116648264206920451160133635071361773812121716528178148240720783226736549623736135274990309138143183248371959875978805027500928693808073336955752759088442865600075199888998323880643549670055505421362435108572732087322982027187772459231228989472372951864321099261878781084330252988333921362998963303722431059741968763452406953835015120533773385289904710843628402700274702870474073825248828889984994284607604847211794221210729913159829014217168004461049532662696542913183628157199561641949923936629368992856621383084545327636972265542355341749855663020004887316835216156767223053799811067258913808469994232607858854524064432145775922144535701236468985705212977045479489515690009388923625580685788707605877343857669170894656797423368490329407251160393356048820607085089069025413584269816739747211239513550414383117508826763143512862006497058041145296097892917999935577053234252698691933792724753682184537682835562829938630004838384363944243137622864918257474256280127291116965050600178120477720784742184205376195975831677721764740044536624645764471381571452381830125398765152083287483110279394697855915713981939970684599199594863007230624076786139617554631450734995190081932187616814234632738778224433256463738346435274905710925581106061273840975592931761266799265587765468946764337085192369358316298457450008809428586921504743730873895710474614480003727146162349858333291516552162545370312200390841588309480973274631646273597390249477746657131891196482398670118797910098918899689482196956660638225731960693542763964302308999692957091061300183648329785182793301407267200046383043005236759977387601407769110383295729918654520937785586390633157020347632812108728638589813282569529576769367173324764085285705308312954957401558247168739931446569422818723482471097374362105279278558570746278168331596903799527959001674856155564619821407044799720020620642233246057848236476047540762849788325435630592420194490443539428990899488655890183886788650518595542180257939200539645041808387760238189562428351774632440622618056913137499820021924733173668036806485733443567039613866037176155955253827548473360440517049422696075501183292573063250613021167503858561082238374439193413231472608072888733326512853287806773389073299297372760244397355791502004654458118728037510329034120643030182346716011974996719598934277635297762958837247389366909763367493682299430362668996193935405226221180280462691353912282455701759810037116439968883639596108926413528826200502511551071661541071241892319070812994269518086385295992381025957172992399312141414210235547707008555590049509294048331178258885645254295737834927590332773105843826797756540039810295021699037788228205072146738094320261980823252096852875670591366194556595549470362090317233349128160475626293246538430039226463877253517855062981890058712415866578727694362877805078594115939049922697215689139042884475829798201399221843339843144334329750976265054375898637087619406776357862341599539585772173362569929723217313856218610739079911693928395573354107695207924389443047735986097057117102761647398583746704066222192489628491579241861512228457942727677656217068060304063431859444999092873095546808035894071193872676924207893595051334067870866978585241063298399448801664979503576258730853137762656715932674584878408765074348715350808211160488037567370082449596914044378631384351574514574407266268601518418121140639017772950755439822352142605465639756330937185434812776437455170052704254873689525989445652781559474644227537684964321625946200647347726100468875445797592291192363724641100602571723960104389727561487616213893880158699261565353860394268412519478250755882121502350855777548987354957187611364644347783460623918569790357712078708030071729862147204119062003145783057657964335620490686654777775857772417230654005669380137272188650104502859563282535642734533430567287319498304528915876638370296607209654727246810120749147011579846007686876872348978767610197018167444101532656500699586407674404325249380187066956228877621206281130141035339929259895087216809976356039304176324615051223863642132987493989282096132023719628675179659793099441124234181354583082636306115430335248256636595542753063577946177399294336318459611754831189657065079679934928129113295189411660749306226747061753316760480290760846421347557553607185254462514991634789163215592554565288625021429064594217444034435094635489801294636044217141894128608560200837942901104014713783039046587228833888032709513732700101667002833885010142407620233438106861087062055906874872893491133678484259720820886397724438939944326449942516696628683510030426237257765426269532595248183289611602373952305073827029425838481007443361481172033664199893614932623554378101313353925699162767581809444174957293532641034112367163940472496454826645496608268491435975330754792022473413254641635309131365360013914909519963236046952897089347016136738984133133790874101143168691022141918967797877476450100585067348766183224990814253610763592974731784263832853675045343246533254966131311531411068478710429786791811404658680805588105768518292098129259164151153126615341498379324353953450723874092401152015787628879390603785057522375088322779364007018433582543673090990833352296302290390165336647355242365982903670648563727239283547241202029021901993493453231407543942533374303128855544718854681133818703717309615999563617026069360208156393214924333856037726771259857931298487909006782987195926835910537279213582905667384935745871483880724959685377284455451325009389359115356341859747548302075715614439876712304113995679250907454883895302396632381653230532032695481751231940062856024456656381220713413431325444483757534262449339675147214243079144598658808202548926312120596697863356554722348114194969409174072455372221354826189882023922524876054935905929454258925505387898039528329076689551108932342856243697999637938228068665595345855978215420274558562368590236467711884770512666328306756286559348574636272916414332349992225277379071952095234443041820054854970323931404077610323730988914889188356127533914074856107086479831584739755622106834971368997334246432264012757261628954213626177797127289818357558926591911175376134554737367672941224416966599144520688033032388494464597481600684233179969688713377153969107014820586500187890028419759966629125896903859724482018551567368459339437282027473163713630554370146518281068049701849575089743432349308849281456182745027011845653626290780738299181305772482001250991761047543344790454625943156085044661103576512523366161351099640751135385148305913987889008698009234370941891346098306437937661227172386506980636903743541285235605780167216008920828610842066522096589500420940606405692664109905063234866117077516308694175709123219476283230290207497555159467149979347020209673500496651023554475005053991295374430728524771212435107382664318842703197811901075027036703041419315229156263279708865064004473392401710817533040210152757966691416471836361498546249180866049039738294265863864925406135752428537159880132061042828090772733103561437021070938835520484987564784902357826645006185384847299711513042558913116550679842981785737713725790045128094411676264858573201529073678073396387519268373798582548263868592119666097381189255247190641352195443081432945981901223716745712543744847146503012460085216148335807619624528396069010370871981642712755932969484501155184487454597846375782598809708096893645439856478634508146859065978179351007580744928974114529788215226484601824974140107352758776378993800008479463640459773788106039221647527915619638375897279653946867057366337834721265500081035695372958187077367633848426351345959537644131255393886949828040966112768013745671476622221973172299021322723830684345054818157484501760113734299662298242039459694484074671808880126261963999301400833575366587220239180443885948634911432672454909578479586976064598126633177835011824812040440090529736915436564330317784343260941419199007994565556336195654994767768391641843167291242587882400091208124348669996343070061026732554587428779976439512259161737036335847682346728539549778493388870528102969822923976454022477322075204905420377823800876540724560782242540043358494305758648390071388556142954991440895026034342297754624387472732697423260211014731729196139172514053952591428247887383243344755389104496037975360677224765591211970382212225942797592005272680787386239303946689423293709148965999400795905073756697025967564396661027489606337872152854151887574400979150870295978066773059913103141338094206140446153595784659696116999451265627049162745281492831846033865707908304944975732574637090102130752860241496159897720566523711477673910492376257245019657271734451417565932034846341070093018262777507790026122302775680179025723685230883459924631462602175535978001836273235741164283034661871238537285831967107455175175353583907073921428e-4966L)) + 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 +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +cat >>confdefs.h <<\_ACEOF +#define PPL_CXX_LONG_DOUBLE_BINARY_FORMAT PPL_FLOAT_IEEE754_QUAD +_ACEOF + + ac_cxx_long_double_binary_format="IEEE754 Quad Precision" +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 + +( exit $ac_status ) +ac_cxx_long_double_binary_format=unknown +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi + +if test x"$ac_cxx_long_double_binary_format" = x"unknown" +then +if test "$cross_compiling" = yes; then + ac_cxx_long_double_binary_format=unknown +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#ifdef HAVE_STDINT_H +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#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::is_iec559 + && (convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL) + == -7.6048540943660203383375998875878002021755137452856942966991187375790618225432711954682137529456970686263412309600617913197560145993931792374946076061175594550915924955313391528566777352996816141138550473090399783817652516896553304678788796532976847530386107750759127004897950996937530751872097675156395937218234460013748219954603465088115161828048215763754331575034447236689765045674584188927116128770082933362914567237187017530082528540058002631800274192146485961758366625476271676375489358478966148719270989233284454992652229565352739884432045036085427546783826745250197623257802129011015273728848161395367551745780868250488191368846207890422268873532651627591649389757751752362072212699309947970918940313250863861141479770240104635553035870698789854752554391365757900620463269938427975381635241159694500569550818398323639621243086116154792038064941523448921284117826015673798399008555604372098051095571652170081985843614541956756469168604624857938653843172027861680499952062356914208628014745759010068414302636374017506453133466034362025545080555878082849488386388633197121003201192243150535143329731394874806398663589117246866205872431804204733617792317769570293754056793574570217834482046448788177551912250351735294891953434051815332631157674735614138641122106756749236824504094008852401427746414294902929999820878756040223246586814590339767277305131757114819123212897500810087015748205562614251410818122967399030151040544000563841334553718469935435435467196184665715776274355094471974036803615388313095637066824428688301387559074204015990782977635088047810891072724763113879034313256582868462323549141603475107584159170279311985555035822254439699354641467841523895459190280971487264907972306090449968125859834702627544039374770757804202780369083049631377117943503836158566134919890165392965694050010089785271180956974707841066789578714463804030217977213138932711313311673101336981407798868338574571646697479192174043005729926344062133712267722538847635563454980776602355539986984320762864338177037919835721981686778834558429264194379257521818498431326991615024245632036376472844033831041082865649867453234086495085785897620758602105639344460383483879837994732204331335249564434458633345708439547881275060781028856140511029543559841701048277393119691261302356763314623124427357421753631218361407626116820986377721964654181839884670481278855478057996766639496909094607181503284084821580817995489740980323820218685313435967428474842973086612053963343516426226771094376179468881265734324847319127862733279299033951360912038720313525324094079916937921290391173035983474894312808532257620563284126400481460163180987618432784215807933623038747129658746767737999870125917269554155887740155308886259497202672935871853706835670467770080598813171256855182510726902033818328368569915805303784312301890212694874227119220544172084552511408717615136830401766455214293141216171050374325461714383991698910564587610624980490526840861990674615172112493813749497898151186927777122955666180439323595468816129418014664347852590958362752922841159054568358354108159485566264221008508127941168192513144760720303715640604755054290633421601734103622748053919536319416025380484868142967373186019970714662893713233834399238357795019603619284595839414945178963942707310299674873908104634979966232181071013259653467885733418936194081202149071958107062125873498848807502257018093517304220495114497635240876547262237411350327960679115197531609627900227913193653254580253539005743563270152329126178570329413401577715075363838562221558204219798925982825556469998988615897432425107152113543617151738802778259560442930074253918797315241708532198010528564246933829811859278710445896556638416265987381678070434371355795025956293319362293063591248665429733880825207421011852020394068840244110140622151494488609575671090387230241296949998536132398625008053543954239573998167556201366323875845409929752349853515625e-1644L + && convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL) + == -99658331877181425640389193712445288804009112642407197633229907048864350192381814628233384153539524368748305269642704450459572458913058829202094408933558533552137589226430537671503754737153845553845646099179512540696038707395491223325946106007770844660381340028079827237033670900446083793353682761885084154898636897779677124010119288945740273072415898996441722571487815052387317025675191665761918119006431828756780493604546658949166486641354783002536071366287780290680620995991797712341457334946893188786269086688063732222194404683551757689083590842400866213237312413463207537587813396338061744078437770542720749055069473347142994267706326342325536219464867910547533482061181116137767384001927599515332824741827726661184966512254203502805790565338206862173475388342339711722457620964017690492860707751327158273522191943184085888284707357024653025991470473697475045491586713324994056478341556198451786713470909185879382607340766256394396819602885198511409676789226542867632933493115191296.0L + && convert(0x0000000000000000ULL, 0x0000000000000001ULL) + == 3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587346566858083349053123705193988703983308587839946322501468602459466376586870456423634710242397194658860357568067134477982764219736292817751295560536845761267846647908517463250923736039512722781415953366096399444403402117053488448021977763604437908687623249034116909294550532283554604255016471048510990155249694820376175072774521597924829264164672829379224834378522148847524461653340453140898534938901079999466084995792940867082225167898092626332284133633537230365710606672711016101696986908545526816093446785575823545286456670464909287063062587561930219192839574686079732400741932670792586584247903252601714502511652018733705556477669856403061671860988301022089008752404238293812121415758527179547281628232710885994458574715033852877595426024800791719981955344151916599003503828822200355665967958771090937688409231050763744882094456320484272716122798149836361660589595209083576887254232532955229749892640550762959438241278496193819382077545905461172547961340469817691165676094261320725727312607482937653140421619686103059529199421431937449566099337396063075218302243845475341677972462038126626903408167086517545386382155008956065955410392914952623927880847159533184535486666480480563407531428385329300522477684217050951264747454635754866214784941542315111038630684391425212439304190584122374222972284606537485052464648655369719099026760518287560996997210778473066980129427427439517032390964791367678221749630975419713438139162678878555999177528450882748046538588177447270306738234898502976902853001364550405227287093940058325788585457368654991956265863050083472087623066020903378919489920975190829421602010382039477772083400661519154972695436582305021910908576692048173534958894170976763084807837402813849227540942073315401115262334876815962087441302256558438912500607230205782013083674113023497612445214795170983848687988348203289441256908755565216081815151205638893112562415329084456934095146184469290901166110634875590164835606941629407489774379792739804674764243483912084691871769225446506284310565309190872477286255925383528545036360550854226919571246361133225904820301916588317084377712259367894846411294822587075835486985645510829880528578782698412556249274522235061092454342386202327120407827540333914613192189174315884136688019435966273663470431440443032136411775605030601436837063972690330417475187330200911967500496761618122614796452937124070398703890868915527051490465736745397764941094879479649438162576614346948652085308024696358256756585794568493319042053882843808180358787110774418075478801186519577416271896383169835708225636584654568643702618602433548938163720732772538345454513065011540675765510656970500413537205370067924880209217363407323673368448004904408413977741706965494247040799786451861822188473571257556819433284087486023676249467869483631380473856486239547015603318322612783652068699798539400406637311682731115340677841660240710431551140370410375585572939303084073843540702120551963050514959945741359169911676575478403279380112020347348292538150798320452794842427526501796852911863108178276638472320237870082862271763396195139513712303136194366021540830531456910584048372546025177765140460207112923151923176402146752868221966889915381596481253160696822260723194259521813054303457222367967929268763072892355278854714278243863110783067060124459039315528176840304931522813148745824350892130595015198002557204332483215551447097512510076223364801202888087635650654634946887232727623906459076670227108634162319210357007273369354657187569046394884895083794103531835959613994575377897775525461977464747518162975010091463561925032742645594645800581600698347817023194379921397347681150492687237349021564206463096138703201250277757980410772647014391579144424375252519766764670458008515297647624144814453496069685127439800629552075692648608681506879044376428977463175175205181547958459515159074701285838493694034007662410100183533141516684185460758175066481561018901133031951042099053297118837448984443230856642737606478787880285299903521855025612413471034466624171559209077538498475106811294029060334271803320566493935024621719717684804443351866946690525266060758332190531807232565501890293754259590947433140384335366973398816899253698302119916142891631005349335372158005779944529176735887193980409288474621694590303098552382376969442365186023130985507823617670051191889015351479659778676132449671642015059540438237303922903056079068344635440276772565425944329927654906262952475555750912023879424636021462043321631428365675851865654901693474343411406220907550090045689588323936814675126103464401223728058185048320475251266882875299120582253090033177883674432343812734123922042926554908548231473285349572210962289889800994026533629321464700552029391517293055196218065667251276237490129206098414338903210942488902792253924667941082273267563528653863343443486495762400409978995985052082310730277076965242846278402568285187365588876653245423047205943478612931964211293489374119565751486787204884502307512372923973119191125614068756094526892783321688030310900558025683455451898487401139315290743477461921025987905332236299398859448938742087487316288730711068752763449392366897236258997091176996253284306687635454361862179407191652155243650619571720232128624130785404930566805029233271375546253313287446285812219961565022654510373870581648214791139170870970509074158721967633425471550515801498191107216277620692347014234913527385812164834475002007099402122991439542783981984927181300669603290190495106195784248531299740262706106798338573523977365240941293695214188675632715447081372252551022981921251125675131839210074132286029621443262127145872022404314258219255606415280218445074654034790115075558513374422753617188198385931164810182817002794172279803028202086567081267453349341345496389239379776494419022301042067986600501045466950004057134726934147691678031986698845370299987067384407310337433828116514830745374490760171672152978595040351405572526523026051215093709900567873568385242574546385008567738263951532676549294356417565797771595638496719149577804216291892125541055147173723744991756669672459021375111288754125372918394417976243093028214703329386031799313949535161343892720409046065009958980978947997662545514664194262097665297242612367968766000629174655887090824363583653843658980277566031286429628476318572915045823895805826010132712977834418613468288832988547377174550796802573148684253294172285056777826927377158058647145403557721233512002495437339413998842782599710186215723437958154275340509811072349041046483806284608873394275718878590418692809288333423522781240698974441829879303794241455852776713321354870647251094720675572322788447908778778892116234131617608416732280987493141331884927860259324392781255786150891859203497212615916404999097067778739914857961305884934678762043515521190581898256624635957830927811421154992139986999936203631149852372802564314896151749326404428772008250428569338329698161850171265411426708113723558325059062871506712838460986031147060351491506316012532538793354499545667009527573810892048004652452452139688789392912938251888341298122235232861138733903153560967292104241190946350516769769305030762386908399592555043192236069279491224465826684203312081255431851756341234566913972589390601558650830437402045595207689996159597545711808203688318112918947661662115802919578636403430323041610018063696707221249826383715263388850307418469423973486747009233945036220901518185766942733836846126816638158345048782728241251279820310193223512959111029884002230571688216854282257873218631744450950552327428952538149545262779889824399028513132208638633070602135522752076661567872472325125674291268881849101416382703647451428232847993332157180794015036365361645888146355749366150209085457189187232786399585879941680370348141105404742298452497895369287193974496140445677301271403589665822911096832952021181343571136957607816318342755770560406569920261633966403484121679869542684843686908354373688437968683525723666121485947946747887572716360800696442816474113593466106089204179554677145374582437962664618883018628687510079511252556002241788346284019750863992283906513572325918053464080643521532154825074820239077990779007069588034029619562190416747359712884084324521598678178890186409451480686781733176824920276835002477523486093586963733155424491897575495851549527034538337694314953057164019215026670773910997443279760005290641511584707193226351271670439775141076552632736166117611394934325673743882365518318561208941552931629125136799711574578916741023587251428998946963182411650554404206416336487418656105333038545773960190949602850096208569085230228708894874577523512558281973392961263921656163963369388411763476388625952406901518273413037068643383550282962237729195901788599392876651086599849223994259145259240479384380657803498058719062529007339428316229997756899857712116922758683071707472935574499244978419788171338468471751125303860911589289400806637202920429489919870263415951660888975434827304297451362325052693482001524843171229078467910537913138115458626612024970730899515114301915281613929239329351501049859225274564107846818112938339161308943153205117651716380468462296193882444293370484368530096898812778973178284912798550245246063411918482638261694029245273291646707331594675213428158755273882438357960245064051015888918541801139771619743221405037797285669481455810653320008904215997597975907391512026214020012010134707536774227636477580918167507850485197065326391091171451763751237612739498468510009055480025096015985581769370179656781151306565952590101977398335185042637681982306448413722177895665290302796223004198526079143104070007874540548221582347389579e-4951L + && convert(0x8000000000000000ULL, 0x0000000000000001ULL) + == 3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587346566858083349053123705193988703983308587839946322501468602459466376586870456423634710242397194658860357568067134477982764219736292817751295560536845761267846647908517463250923736039512722781415953366096399444403402117053488448021977763604437908687623249034116909294550532283554604255016471048510990155249694820376175072774521597924829264164672829379224834378522148847524461653340453140898534938901079999466084995792940867082225167898092626332284133633537230365710606672711016101696986908545526816093446785575823545286456670464909287063062587561930219192839574686079732400741932670792586584247903252601714502511652018733705556477669856403061671860988301022089008752404238293812121415758527179547281628232710885994458574715033852877595426024800791719981955344151916599003503828822200355665967958771090937688409231050763744882094456320484272716122798149836361660589595209083576887254232532955229749892640550762959438241278496193819382077545905461172547961340469817691165676094261320725727312607482937653140421619686103059529199421431937449566099337396063075218302243845475341677972462038126626903408167086517545386382155008956065955410392914952623927880847159533184535486666480480563407531428385329300522477684217050951264747454635754866214784941542315111038630684391425212439304190584122374222972284606537485052464648655369719099026760518287560996997210778473066980129427427439517032390964791367678221749630975419713438139162678878555999177528450882748046538588177447270306738234898502976902853001364550405227287093940058325788585457368654991956265863050083472087623066020903378919489920975190829421602010382039477772083400661519154972695436582305021910908576692048173534958894170976763084807837402813849227540942073315401115262334876815962087441302256558438912500607230205782013083674113023497612445214795170983848687988348203289441256908755565216081815151205638893112562415329084456934095146184469290901166110634875590164835606941629407489774379792739804674764243483912084691871769225446506284310565309190872477286255925383528545036360550854226919571246361133225904820301916588317084377712259367894846411294822587075835486985645510829880528578782698412556249274522235061092454342386202327120407827540333914613192189174315884136688019435966273663470431440443032136411775605030601436837063972690330417475187330200911967500496761618122614796452937124070398703890868915527051490465736745397764941094879479649438162576614346948652085308024696358256756585794568493319042053882843808180358787110774418075478801186519577416271896383169835708225636584654568643702618602433548938163720732772538345454513065011540675765510656970500413537205370067924880209217363407323673368448004904408413977741706965494247040799786451861822188473571257556819433284087486023676249467869483631380473856486239547015603318322612783652068699798539400406637311682731115340677841660240710431551140370410375585572939303084073843540702120551963050514959945741359169911676575478403279380112020347348292538150798320452794842427526501796852911863108178276638472320237870082862271763396195139513712303136194366021540830531456910584048372546025177765140460207112923151923176402146752868221966889915381596481253160696822260723194259521813054303457222367967929268763072892355278854714278243863110783067060124459039315528176840304931522813148745824350892130595015198002557204332483215551447097512510076223364801202888087635650654634946887232727623906459076670227108634162319210357007273369354657187569046394884895083794103531835959613994575377897775525461977464747518162975010091463561925032742645594645800581600698347817023194379921397347681150492687237349021564206463096138703201250277757980410772647014391579144424375252519766764670458008515297647624144814453496069685127439800629552075692648608681506879044376428977463175175205181547958459515159074701285838493694034007662410100183533141516684185460758175066481561018901133031951042099053297118837448984443230856642737606478787880285299903521855025612413471034466624171559209077538498475106811294029060334271803320566493935024621719717684804443351866946690525266060758332190531807232565501890293754259590947433140384335366973398816899253698302119916142891631005349335372158005779944529176735887193980409288474621694590303098552382376969442365186023130985507823617670051191889015351479659778676132449671642015059540438237303922903056079068344635440276772565425944329927654906262952475555750912023879424636021462043321631428365675851865654901693474343411406220907550090045689588323936814675126103464401223728058185048320475251266882875299120582253090033177883674432343812734123922042926554908548231473285349572210962289889800994026533629321464700552029391517293055196218065667251276237490129206098414338903210942488902792253924667941082273267563528653863343443486495762400409978995985052082310730277076965242846278402568285187365588876653245423047205943478612931964211293489374119565751486787204884502307512372923973119191125614068756094526892783321688030310900558025683455451898487401139315290743477461921025987905332236299398859448938742087487316288730711068752763449392366897236258997091176996253284306687635454361862179407191652155243650619571720232128624130785404930566805029233271375546253313287446285812219961565022654510373870581648214791139170870970509074158721967633425471550515801498191107216277620692347014234913527385812164834475002007099402122991439542783981984927181300669603290190495106195784248531299740262706106798338573523977365240941293695214188675632715447081372252551022981921251125675131839210074132286029621443262127145872022404314258219255606415280218445074654034790115075558513374422753617188198385931164810182817002794172279803028202086567081267453349341345496389239379776494419022301042067986600501045466950004057134726934147691678031986698845370299987067384407310337433828116514830745374490760171672152978595040351405572526523026051215093709900567873568385242574546385008567738263951532676549294356417565797771595638496719149577804216291892125541055147173723744991756669672459021375111288754125372918394417976243093028214703329386031799313949535161343892720409046065009958980978947997662545514664194262097665297242612367968766000629174655887090824363583653843658980277566031286429628476318572915045823895805826010132712977834418613468288832988547377174550796802573148684253294172285056777826927377158058647145403557721233512002495437339413998842782599710186215723437958154275340509811072349041046483806284608873394275718878590418692809288333423522781240698974441829879303794241455852776713321354870647251094720675572322788447908778778892116234131617608416732280987493141331884927860259324392781255786150891859203497212615916404999097067778739914857961305884934678762043515521190581898256624635957830927811421154992139986999936203631149852372802564314896151749326404428772008250428569338329698161850171265411426708113723558325059062871506712838460986031147060351491506316012532538793354499545667009527573810892048004652452452139688789392912938251888341298122235232861138733903153560967292104241190946350516769769305030762386908399592555043192236069279491224465826684203312081255431851756341234566913972589390601558650830437402045595207689996159597545711808203688318112918947661662115802919578636403430323041610018063696707221249826383715263388850307418469423973486747009233945036220901518185766942733836846126816638158345048782728241251279820310193223512959111029884002230571688216854282257873218631744450950552327428952538149545262779889824399028513132208638633070602135522752076661567872472325125674291268881849101416382703647451428232847993332157180794015036365361645888146355749366150209085457189187232786399585879941680370348141105404742298452497895369287193974496140445677301271403589665822911096832952021181343571136957607816318342755770560406569920261633966403484121679869542684843686908354373688437968683525723666121485947946747887572716360800696442816474113593466106089204179554677145374582437962664618883018628687510079511252556002241788346284019750863992283906513572325918053464080643521532154825074820239077990779007069588034029619562190416747359712884084324521598678178890186409451480686781733176824920276835002477523486093586963733155424491897575495851549527034538337694314953057164019215026670773910997443279760005290641511584707193226351271670439775141076552632736166117611394934325673743882365518318561208941552931629125136799711574578916741023587251428998946963182411650554404206416336487418656105333038545773960190949602850096208569085230228708894874577523512558281973392961263921656163963369388411763476388625952406901518273413037068643383550282962237729195901788599392876651086599849223994259145259240479384380657803498058719062529007339428316229997756899857712116922758683071707472935574499244978419788171338468471751125303860911589289400806637202920429489919870263415951660888975434827304297451362325052693482001524843171229078467910537913138115458626612024970730899515114301915281613929239329351501049859225274564107846818112938339161308943153205117651716380468462296193882444293370484368530096898812778973178284912798550245246063411918482638261694029245273291646707331594675213428158755273882438357960245064051015888918541801139771619743221405037797285669481455810653320008904215997597975907391512026214020012010134707536774227636477580918167507850485197065326391091171451763751237612739498468510009055480025096015985581769370179656781151306565952590101977398335185042637681982306448413722177895665290302796223004198526079143104070007874540548221582347389579e-4951L)) + return 0; + else + return 1; +} + +#else // SIZEOF_LONG_DOUBLE != 16 + +int +main() { + return 1; +} + +#endif // SIZEOF_LONG_DOUBLE != 16 + +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +cat >>confdefs.h <<\_ACEOF +#define PPL_CXX_LONG_DOUBLE_BINARY_FORMAT PPL_FLOAT_INTEL_DOUBLE_EXTENDED +_ACEOF + + ac_cxx_long_double_binary_format="Intel Double-Extended" +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 + +( exit $ac_status ) +ac_cxx_long_double_binary_format=unknown +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi + +if test x"$ac_cxx_long_double_binary_format" = x"unknown" +then +if test "$cross_compiling" = yes; then + ac_cxx_long_double_binary_format=unknown +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#ifdef HAVE_STDINT_H +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#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::is_iec559 + && (convert(0xaaacccaaUL, 0xacccaaacUL) + == -4.018242396032647085467373664662028399901175154542925376476863248797653889888945947404163925979898721593782464256360719269163883854613473748830842329884157359816532025640075051481726120707111709993717456369512975427023957197464411926714771905463723621065863511603311053477227687835693359375e-103L + && convert(0xcccaaaccUL, 0xcaaacccaUL) + == -85705035845709846787631445265530356117787053916987832397725696.0L + && convert(0x00000000UL, 0x00000001UL) + == 4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625e-324L + && convert(0x80000000UL, 0x00000001UL) + == -4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625e-324L)) + return 0; + else + return 1; +} + +#else // SIZEOF_LONG_DOUBLE != 8 + +int +main() { + return 1; +} + +#endif // SIZEOF_LONG_DOUBLE != 8 + +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +cat >>confdefs.h <<\_ACEOF +#define PPL_CXX_LONG_DOUBLE_BINARY_FORMAT PPL_FLOAT_IEEE754_DOUBLE +_ACEOF + + ac_cxx_long_double_binary_format="IEEE754 Double Precision" +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 + +( exit $ac_status ) +ac_cxx_long_double_binary_format=unknown +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi + +{ $as_echo "$as_me:$LINENO: result: $ac_cxx_long_double_binary_format" >&5 +$as_echo "$ac_cxx_long_double_binary_format" >&6; } + + + +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:$LINENO: checking whether C++ provides exact output for long doubles" >&5 +$as_echo_n "checking whether C++ provides exact output for long doubles... " >&6; } + +if test "$cross_compiling" = yes; then + { $as_echo "$as_me:$LINENO: result: assuming not" >&5 +$as_echo "assuming not" >&6; } + ac_cxx_long_double_exact_output=0 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#ifdef HAVE_STDINT_H +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#endif +#include + +/* 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 + +bool +check(long double value, const char* text) { + std::ostringstream ss; + ss.precision(10000); + ss << value; + return ss.str() == text; +} + +#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; +} + +#if PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_INTEL_DOUBLE_EXTENDED + +int +main() { + if (check(convert(0xaaacccaaUL, 0xacccaaacccaaacccULL), + "-23475151196235330448360987288488448023604990597437922665537894499317141030270831473500040521309097782521743811281100731620612303910141158923283064807755815684643856544564541670181998003713114595098650350075763370916908460284838902787487703020001649220669684278577319085319204471093693972621987808779314674903648668236688723332999785552894845325917244897920804830290985291535343986477508649100409893486651507134071296739623686984014433965803259868867855465109457220731656260670349710137932272802677796915669809481885196101414678015638835049035133835457854893845093496950772367562664955830097293678125205138879788670490610650322134182370990336443894886171520732434535881085387893610114822547025980969387956199048733969351859470324032549906964255557877860343871346618951696178837035563054101786829980983909935265617095747543882856776297861197958453847978446679149969948882161264279705948735019353220550905117946051015070744207453853343171175921378515361160726195198161165083475968") + && check(convert(0xcccaaaccUL, 0xcaaacccaaacccaaaULL), + "-3.234349908433673569788362433758236701401379200386310478070230491201716094576208088733092209352711081763530973139439402754721006217889031902309566905344106766697050593355851405189694125966100801537593811320493850579152938679705465870788684523518541806158791408378718596936132854683425581754205242594614192465876640102628432246897674583649745467641139234207139584810101868772915312454075582265240687184279243861217351667059920878236164506473261797703393981510799228030778152399657445848839855361831637014754038570644257393307922665529947406582062857348101442206039278033447012163028384634753160589791458287895963629514043345016273218385584012204321293761500625038828699451659598873739820939586314044735551522599884065690704853850058509917597610804664086074437219778400030370474948166770867639885264893441594112815147445129222900623635467542926999246959939000796968650036727515644358583656635086409945418378371210848857160579105176395869221692977516017583375976424496977231821652434877830409470264872173686708172667000681514442371517343085468923465834742925914605731609765839631967460042791316319023971980691582832232860491668014341598553021017317450989919240909832141247027104138677882497144506317212033031539627613710631490195651235049780490963461514410018833968072513381369320107740021476622121320911875995678620145217379068502893509758814753434218746970000807381369855297087472398985134583394635298304301976743682254755898799853471470973139487587740504614698965906370516694512439128548402418825952236144896863935402725154209604537541130862513767786738372717442238281296070010302255703329785136750848608510805269562580550421695335686256291415407706167513127610045830074144232174636354465520547408627155363076530824695464544496846799567213412195115628936631295933321590908845288558910694118404555858629368018552451467994715743285452343185080572139353967831950470208768524113647528966442712608411306460439403733081312454377815407740431356862292588345515142587184008493066353603658341268923669196617183622259532802077159684815974630350730226266887950469523895272137382682818583664766982004756872470359454855421231861600855405622250180301557001727658100463825721179482988287599820459238518127671242515104954727268296043840120459189992322364113432317376499876615018647681005294400890426164141474245830847447887800872845238979407896829797297990804023745291564182356173092302630416583955274584512411637160723327887646112927503049935866004964114798241035087343318592736488780742013424329479787548324846879335440582948017481856461250014099199025874264395426269044157577172368261822794071985989844785134561848837459343219269316428175168803982908920457749528709425299296467325603578851955843550406474402944350694486492967809731047663564513772408591390180588458110788180950470244902062953534590109356800048878919144043979000989724521292698054747484439706733411566872999353418986588749568995482953622089499726327807058708520455805869817259837526415584189633013162307753166636151833127563746069733440228640737257520299330767346391011026088684503955941755171481192133779119344715318224728775697330484860348152872987113995597980243907204928634355356748752501217143216601222634344211757170284222785899530754663487291354339744025299042982320199789070467212765859078265587040664859899997109073649635056953085131587344086263213972132295294758682559609365238437544701417284297826732242650999654640698637095193178119502815643930373741504018967640638120546136857104880094633373762586018322104925768619990210092851075031033451925224377383389610824173203445111896055901190132142204139463967556738295382942065540228560332044410017389129348710403201272349054427064370609913529996988445571571382916349536222256815467149849706750571813156961918737343978667568453623162377198802996342528197935118265696537928993634621119483415202847968129550048667353312481509419740177690982818603515625e-1634") + && check(convert(0x00000000UL, 0x0000000000000001ULL), + "3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587346566858083349053123705193988703983308587839946322501468602459466376586870456423634710242397194658860357568067134477982764219736292817751295560536845761267846647908517463250923736039512722781415953366096399444403402117053488448021977763604437908687623249034116909294550532283554604255016471048510990155249694820376175072774521597924829264164672829379224834378522148847524461653340453140898534938901079999466084995792940867082225167898092626332284133633537230365710606672711016101696986908545526816093446785575823545286456670464909287063062587561930219192839574686079732400741932670792586584247903252601714502511652018733705556477669856403061671860988301022089008752404238293812121415758527179547281628232710885994458574715033852877595426024800791719981955344151916599003503828822200355665967958771090937688409231050763744882094456320484272716122798149836361660589595209083576887254232532955229749892640550762959438241278496193819382077545905461172547961340469817691165676094261320725727312607482937653140421619686103059529199421431937449566099337396063075218302243845475341677972462038126626903408167086517545386382155008956065955410392914952623927880847159533184535486666480480563407531428385329300522477684217050951264747454635754866214784941542315111038630684391425212439304190584122374222972284606537485052464648655369719099026760518287560996997210778473066980129427427439517032390964791367678221749630975419713438139162678878555999177528450882748046538588177447270306738234898502976902853001364550405227287093940058325788585457368654991956265863050083472087623066020903378919489920975190829421602010382039477772083400661519154972695436582305021910908576692048173534958894170976763084807837402813849227540942073315401115262334876815962087441302256558438912500607230205782013083674113023497612445214795170983848687988348203289441256908755565216081815151205638893112562415329084456934095146184469290901166110634875590164835606941629407489774379792739804674764243483912084691871769225446506284310565309190872477286255925383528545036360550854226919571246361133225904820301916588317084377712259367894846411294822587075835486985645510829880528578782698412556249274522235061092454342386202327120407827540333914613192189174315884136688019435966273663470431440443032136411775605030601436837063972690330417475187330200911967500496761618122614796452937124070398703890868915527051490465736745397764941094879479649438162576614346948652085308024696358256756585794568493319042053882843808180358787110774418075478801186519577416271896383169835708225636584654568643702618602433548938163720732772538345454513065011540675765510656970500413537205370067924880209217363407323673368448004904408413977741706965494247040799786451861822188473571257556819433284087486023676249467869483631380473856486239547015603318322612783652068699798539400406637311682731115340677841660240710431551140370410375585572939303084073843540702120551963050514959945741359169911676575478403279380112020347348292538150798320452794842427526501796852911863108178276638472320237870082862271763396195139513712303136194366021540830531456910584048372546025177765140460207112923151923176402146752868221966889915381596481253160696822260723194259521813054303457222367967929268763072892355278854714278243863110783067060124459039315528176840304931522813148745824350892130595015198002557204332483215551447097512510076223364801202888087635650654634946887232727623906459076670227108634162319210357007273369354657187569046394884895083794103531835959613994575377897775525461977464747518162975010091463561925032742645594645800581600698347817023194379921397347681150492687237349021564206463096138703201250277757980410772647014391579144424375252519766764670458008515297647624144814453496069685127439800629552075692648608681506879044376428977463175175205181547958459515159074701285838493694034007662410100183533141516684185460758175066481561018901133031951042099053297118837448984443230856642737606478787880285299903521855025612413471034466624171559209077538498475106811294029060334271803320566493935024621719717684804443351866946690525266060758332190531807232565501890293754259590947433140384335366973398816899253698302119916142891631005349335372158005779944529176735887193980409288474621694590303098552382376969442365186023130985507823617670051191889015351479659778676132449671642015059540438237303922903056079068344635440276772565425944329927654906262952475555750912023879424636021462043321631428365675851865654901693474343411406220907550090045689588323936814675126103464401223728058185048320475251266882875299120582253090033177883674432343812734123922042926554908548231473285349572210962289889800994026533629321464700552029391517293055196218065667251276237490129206098414338903210942488902792253924667941082273267563528653863343443486495762400409978995985052082310730277076965242846278402568285187365588876653245423047205943478612931964211293489374119565751486787204884502307512372923973119191125614068756094526892783321688030310900558025683455451898487401139315290743477461921025987905332236299398859448938742087487316288730711068752763449392366897236258997091176996253284306687635454361862179407191652155243650619571720232128624130785404930566805029233271375546253313287446285812219961565022654510373870581648214791139170870970509074158721967633425471550515801498191107216277620692347014234913527385812164834475002007099402122991439542783981984927181300669603290190495106195784248531299740262706106798338573523977365240941293695214188675632715447081372252551022981921251125675131839210074132286029621443262127145872022404314258219255606415280218445074654034790115075558513374422753617188198385931164810182817002794172279803028202086567081267453349341345496389239379776494419022301042067986600501045466950004057134726934147691678031986698845370299987067384407310337433828116514830745374490760171672152978595040351405572526523026051215093709900567873568385242574546385008567738263951532676549294356417565797771595638496719149577804216291892125541055147173723744991756669672459021375111288754125372918394417976243093028214703329386031799313949535161343892720409046065009958980978947997662545514664194262097665297242612367968766000629174655887090824363583653843658980277566031286429628476318572915045823895805826010132712977834418613468288832988547377174550796802573148684253294172285056777826927377158058647145403557721233512002495437339413998842782599710186215723437958154275340509811072349041046483806284608873394275718878590418692809288333423522781240698974441829879303794241455852776713321354870647251094720675572322788447908778778892116234131617608416732280987493141331884927860259324392781255786150891859203497212615916404999097067778739914857961305884934678762043515521190581898256624635957830927811421154992139986999936203631149852372802564314896151749326404428772008250428569338329698161850171265411426708113723558325059062871506712838460986031147060351491506316012532538793354499545667009527573810892048004652452452139688789392912938251888341298122235232861138733903153560967292104241190946350516769769305030762386908399592555043192236069279491224465826684203312081255431851756341234566913972589390601558650830437402045595207689996159597545711808203688318112918947661662115802919578636403430323041610018063696707221249826383715263388850307418469423973486747009233945036220901518185766942733836846126816638158345048782728241251279820310193223512959111029884002230571688216854282257873218631744450950552327428952538149545262779889824399028513132208638633070602135522752076661567872472325125674291268881849101416382703647451428232847993332157180794015036365361645888146355749366150209085457189187232786399585879941680370348141105404742298452497895369287193974496140445677301271403589665822911096832952021181343571136957607816318342755770560406569920261633966403484121679869542684843686908354373688437968683525723666121485947946747887572716360800696442816474113593466106089204179554677145374582437962664618883018628687510079511252556002241788346284019750863992283906513572325918053464080643521532154825074820239077990779007069588034029619562190416747359712884084324521598678178890186409451480686781733176824920276835002477523486093586963733155424491897575495851549527034538337694314953057164019215026670773910997443279760005290641511584707193226351271670439775141076552632736166117611394934325673743882365518318561208941552931629125136799711574578916741023587251428998946963182411650554404206416336487418656105333038545773960190949602850096208569085230228708894874577523512558281973392961263921656163963369388411763476388625952406901518273413037068643383550282962237729195901788599392876651086599849223994259145259240479384380657803498058719062529007339428316229997756899857712116922758683071707472935574499244978419788171338468471751125303860911589289400806637202920429489919870263415951660888975434827304297451362325052693482001524843171229078467910537913138115458626612024970730899515114301915281613929239329351501049859225274564107846818112938339161308943153205117651716380468462296193882444293370484368530096898812778973178284912798550245246063411918482638261694029245273291646707331594675213428158755273882438357960245064051015888918541801139771619743221405037797285669481455810653320008904215997597975907391512026214020012010134707536774227636477580918167507850485197065326391091171451763751237612739498468510009055480025096015985581769370179656781151306565952590101977398335185042637681982306448413722177895665290302796223004198526079143104070007874540548221582347389579e-4951") + && check(convert(0x80000000UL, 0x0000000000000001ULL), + "3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587346566858083349053123705193988703983308587839946322501468602459466376586870456423634710242397194658860357568067134477982764219736292817751295560536845761267846647908517463250923736039512722781415953366096399444403402117053488448021977763604437908687623249034116909294550532283554604255016471048510990155249694820376175072774521597924829264164672829379224834378522148847524461653340453140898534938901079999466084995792940867082225167898092626332284133633537230365710606672711016101696986908545526816093446785575823545286456670464909287063062587561930219192839574686079732400741932670792586584247903252601714502511652018733705556477669856403061671860988301022089008752404238293812121415758527179547281628232710885994458574715033852877595426024800791719981955344151916599003503828822200355665967958771090937688409231050763744882094456320484272716122798149836361660589595209083576887254232532955229749892640550762959438241278496193819382077545905461172547961340469817691165676094261320725727312607482937653140421619686103059529199421431937449566099337396063075218302243845475341677972462038126626903408167086517545386382155008956065955410392914952623927880847159533184535486666480480563407531428385329300522477684217050951264747454635754866214784941542315111038630684391425212439304190584122374222972284606537485052464648655369719099026760518287560996997210778473066980129427427439517032390964791367678221749630975419713438139162678878555999177528450882748046538588177447270306738234898502976902853001364550405227287093940058325788585457368654991956265863050083472087623066020903378919489920975190829421602010382039477772083400661519154972695436582305021910908576692048173534958894170976763084807837402813849227540942073315401115262334876815962087441302256558438912500607230205782013083674113023497612445214795170983848687988348203289441256908755565216081815151205638893112562415329084456934095146184469290901166110634875590164835606941629407489774379792739804674764243483912084691871769225446506284310565309190872477286255925383528545036360550854226919571246361133225904820301916588317084377712259367894846411294822587075835486985645510829880528578782698412556249274522235061092454342386202327120407827540333914613192189174315884136688019435966273663470431440443032136411775605030601436837063972690330417475187330200911967500496761618122614796452937124070398703890868915527051490465736745397764941094879479649438162576614346948652085308024696358256756585794568493319042053882843808180358787110774418075478801186519577416271896383169835708225636584654568643702618602433548938163720732772538345454513065011540675765510656970500413537205370067924880209217363407323673368448004904408413977741706965494247040799786451861822188473571257556819433284087486023676249467869483631380473856486239547015603318322612783652068699798539400406637311682731115340677841660240710431551140370410375585572939303084073843540702120551963050514959945741359169911676575478403279380112020347348292538150798320452794842427526501796852911863108178276638472320237870082862271763396195139513712303136194366021540830531456910584048372546025177765140460207112923151923176402146752868221966889915381596481253160696822260723194259521813054303457222367967929268763072892355278854714278243863110783067060124459039315528176840304931522813148745824350892130595015198002557204332483215551447097512510076223364801202888087635650654634946887232727623906459076670227108634162319210357007273369354657187569046394884895083794103531835959613994575377897775525461977464747518162975010091463561925032742645594645800581600698347817023194379921397347681150492687237349021564206463096138703201250277757980410772647014391579144424375252519766764670458008515297647624144814453496069685127439800629552075692648608681506879044376428977463175175205181547958459515159074701285838493694034007662410100183533141516684185460758175066481561018901133031951042099053297118837448984443230856642737606478787880285299903521855025612413471034466624171559209077538498475106811294029060334271803320566493935024621719717684804443351866946690525266060758332190531807232565501890293754259590947433140384335366973398816899253698302119916142891631005349335372158005779944529176735887193980409288474621694590303098552382376969442365186023130985507823617670051191889015351479659778676132449671642015059540438237303922903056079068344635440276772565425944329927654906262952475555750912023879424636021462043321631428365675851865654901693474343411406220907550090045689588323936814675126103464401223728058185048320475251266882875299120582253090033177883674432343812734123922042926554908548231473285349572210962289889800994026533629321464700552029391517293055196218065667251276237490129206098414338903210942488902792253924667941082273267563528653863343443486495762400409978995985052082310730277076965242846278402568285187365588876653245423047205943478612931964211293489374119565751486787204884502307512372923973119191125614068756094526892783321688030310900558025683455451898487401139315290743477461921025987905332236299398859448938742087487316288730711068752763449392366897236258997091176996253284306687635454361862179407191652155243650619571720232128624130785404930566805029233271375546253313287446285812219961565022654510373870581648214791139170870970509074158721967633425471550515801498191107216277620692347014234913527385812164834475002007099402122991439542783981984927181300669603290190495106195784248531299740262706106798338573523977365240941293695214188675632715447081372252551022981921251125675131839210074132286029621443262127145872022404314258219255606415280218445074654034790115075558513374422753617188198385931164810182817002794172279803028202086567081267453349341345496389239379776494419022301042067986600501045466950004057134726934147691678031986698845370299987067384407310337433828116514830745374490760171672152978595040351405572526523026051215093709900567873568385242574546385008567738263951532676549294356417565797771595638496719149577804216291892125541055147173723744991756669672459021375111288754125372918394417976243093028214703329386031799313949535161343892720409046065009958980978947997662545514664194262097665297242612367968766000629174655887090824363583653843658980277566031286429628476318572915045823895805826010132712977834418613468288832988547377174550796802573148684253294172285056777826927377158058647145403557721233512002495437339413998842782599710186215723437958154275340509811072349041046483806284608873394275718878590418692809288333423522781240698974441829879303794241455852776713321354870647251094720675572322788447908778778892116234131617608416732280987493141331884927860259324392781255786150891859203497212615916404999097067778739914857961305884934678762043515521190581898256624635957830927811421154992139986999936203631149852372802564314896151749326404428772008250428569338329698161850171265411426708113723558325059062871506712838460986031147060351491506316012532538793354499545667009527573810892048004652452452139688789392912938251888341298122235232861138733903153560967292104241190946350516769769305030762386908399592555043192236069279491224465826684203312081255431851756341234566913972589390601558650830437402045595207689996159597545711808203688318112918947661662115802919578636403430323041610018063696707221249826383715263388850307418469423973486747009233945036220901518185766942733836846126816638158345048782728241251279820310193223512959111029884002230571688216854282257873218631744450950552327428952538149545262779889824399028513132208638633070602135522752076661567872472325125674291268881849101416382703647451428232847993332157180794015036365361645888146355749366150209085457189187232786399585879941680370348141105404742298452497895369287193974496140445677301271403589665822911096832952021181343571136957607816318342755770560406569920261633966403484121679869542684843686908354373688437968683525723666121485947946747887572716360800696442816474113593466106089204179554677145374582437962664618883018628687510079511252556002241788346284019750863992283906513572325918053464080643521532154825074820239077990779007069588034029619562190416747359712884084324521598678178890186409451480686781733176824920276835002477523486093586963733155424491897575495851549527034538337694314953057164019215026670773910997443279760005290641511584707193226351271670439775141076552632736166117611394934325673743882365518318561208941552931629125136799711574578916741023587251428998946963182411650554404206416336487418656105333038545773960190949602850096208569085230228708894874577523512558281973392961263921656163963369388411763476388625952406901518273413037068643383550282962237729195901788599392876651086599849223994259145259240479384380657803498058719062529007339428316229997756899857712116922758683071707472935574499244978419788171338468471751125303860911589289400806637202920429489919870263415951660888975434827304297451362325052693482001524843171229078467910537913138115458626612024970730899515114301915281613929239329351501049859225274564107846818112938339161308943153205117651716380468462296193882444293370484368530096898812778973178284912798550245246063411918482638261694029245273291646707331594675213428158755273882438357960245064051015888918541801139771619743221405037797285669481455810653320008904215997597975907391512026214020012010134707536774227636477580918167507850485197065326391091171451763751237612739498468510009055480025096015985581769370179656781151306565952590101977398335185042637681982306448413722177895665290302796223004198526079143104070007874540548221582347389579e-4951")) + return 0; + else + return 1; +} + +#else // PPL_CXX_LONG_DOUBLE_BINARY_FORMAT != FLOAT_INTEL_DOUBLE_EXTENDED + +int +main() { + return 1; +} + +#endif // PPL_CXX_LONG_DOUBLE_BINARY_FORMAT != FLOAT_INTEL_DOUBLE_EXTENDED + +#elif 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; +} + +#if PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_QUAD + +int +main() { + if (check(convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL), + "-8.55855653885100434741341853993902633367349104766375354667159377718342093894815477326286823233135691805519944470138219932524951165689852082013017904043605683486724317550972746307400400204571080045247416605879743573136814766221652651396476675668866980798618379071105211750397249729982891787041148520384572930274879267722158826932337019191713973025403784448443813348692062209940856126724493492803365972504505177354875652033856070760087261648660638833868952644144747756799606849182265604546917705495630867683634260396102823982577953799017062698102242357552179655099799114234932578035799185560231199083485854936098752376968393647581458407558794412029383325763638562788717260040049064497131924995762524305159587498016677454321953274959044696323291625045478494472581264819229447771276640446297211105522340278216491094195598543872903469867733674572559977106495016037365144714092305087690135013719347274733034998868445412589677425060095799279101903473205374412225289846468374532481297065712317082077938035156602646698351182648104255704218634101302925067087078955133405900007044267209898310644310904503791609310204530573463263951434586894153990739119187567218316060343579381319744970284036645819031296341711196622764674251739340075981861518157380656135644972541894187627902651874054588734732906342927804126694032667794810086817870907476586539935233288396561987441453006798066121939082312783518917156845604116991071351557087417820814737448930366014934139649936714605919733198611573267554373841805458030152706709963798138766665437195696286204333504023648063774567253657433115103351104190986192714072985487851579415615609526545777708652951405409847708647802254957197551148967040887700676749608935220270768342493900689974647088468653016844028721111482484905641458435567969469008688175230469940968306817582881926746422674891155765989419578280531847369896579997902056370886853884911608932917273377526774091310024267948445090595150848945937264274298230316059283748541372546998570685254364147022857127106166375807928861080771495427281772909457414476961102929683460150380091022216902985688084496718499522925736236100966839490544989265028487132166444183820209811985298620037327410566483546092567386575203772065259924817078378553423445114795887961447486917127608105936488957460696218995227900239169698156532097505472359601263421630872600694896078087993492528322817946497772710008837719609909497752428441503174822795185219988589528998338631725113908025553153842511443825016809012668839505492083731555461826355018782953670089090573806418379608917728933789667567839232807208925449602517595541397929042673972541764273293287457694772131268012143158809453627483947788463130353101911401667613659585055576869155534998835800762122080588150495103765874874613454517177121048246498282285280904742153700877576028449241385429235777250684782328183787286276152331338688335510090441008799792147837436640030059474106105829612076012626498555138419516242851436828131901668517305064107076254421670883938440896580435257206350630093337919967881954501164988008085285088049681541452106188312639266136685237513628484410146475880276899689323468288129178652504797093820419402611691354199968499448738482587415636727937353639264845197813295922091561637504736126720760129127710879063043647425297778439069116811334073539456451043564046959839163407469915211595468718792531664679340442279513006653831781499155674396529973036072198720572542914738630057353297633085013244779323578115668031532144051510758240504037804690564298890171218568053886450388507561335540224075309922339483204122333658701871584147135738144358394867585372134490396264937274938848938884293776466212293402264641368524174512841804801230279990820989956713963566987970818315606031084417487965298373510594915942429581446481759482857537804431542098380533075194397625795605337047384493682506827547173206735463795863376044170821429161475172513429888642402089329334654087406739184258619435041737233405001461505889892578125e-1644") + && check(convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL), + "-124514581107511552210796456934966803687304842980295573828954497922493752983397188814711304411560018580965744046315133789985274208017368151964100284400784216106649187287727268989948309893335776137201236307422254490384994342132786695251856340822607539332337741185911979986209464222776112117543477310592395735321641016191765613924234896253051931334188353106422231052895112533426462965071195000083346118845388851222468275853899619767858364593491745895616655921022591572983370616010095670881627966440183912948095715866505356803258659518882310562527709556367822539262111581385341941163873435919341717170180065638145777392282815973491833042960716493005101610346003273833563515742996380936304245423639950200211170835546053201980835724318930743625600269679260909350277600256315069013053332133830043213033329696436217829598890872375814523266366034383531514035947792389939922899745714167418517458817088636450662300503353562047987996978943856662174717195437379600755109302771921946748859230686543872") + && check(convert(0x0000000000000000ULL, 0x0000000000000001ULL), + "6.475175119438025110924438958227646552499569338034681009689884389197039540124119371017671491276649940255878141476848119676587219886382542046685110071972617983042792710751334934416734625638471740239448526505553990391455556252171148068070822034688256982476272828789103028357337561348031062386564592639826226991907907867663262065711211583064657196068308332845234453069760526489447660964579313751403402631804350039948870075255648713368066117879403155766713303467434937062409411685215137607333139422843835051668983567167196802642952353504079714347103860537782893700215521168667711042950610021881513627986429461700433339201935397498825184335385514892844339930852967838448682125502304114122153045946465463084764110174478737044335312389661483639210553943411476544786261397875064191451226767614625892790369961415069606980007080502788648919975916801878222002252381723047230971876570995428821219281596547633023538783137183646396952831530551068683419596735374086746290525867996216905323365319885172609956827625511036332478353228947631880050684559150608318986521540136061273771493390412784756552103897518527764158778759333880714882279633323826397312375406927039446525306447838514371503654987855172306307584155459826707095909617752526800401326990828721633726770440915439092677906646798573524199116648264206920451160133635071361773812121716528178148240720783226736549623736135274990309138143183248371959875978805027500928693808073336955752759088442865600075199888998323880643549670055505421362435108572732087322982027187772459231228989472372951864321099261878781084330252988333921362998963303722431059741968763452406953835015120533773385289904710843628402700274702870474073825248828889984994284607604847211794221210729913159829014217168004461049532662696542913183628157199561641949923936629368992856621383084545327636972265542355341749855663020004887316835216156767223053799811067258913808469994232607858854524064432145775922144535701236468985705212977045479489515690009388923625580685788707605877343857669170894656797423368490329407251160393356048820607085089069025413584269816739747211239513550414383117508826763143512862006497058041145296097892917999935577053234252698691933792724753682184537682835562829938630004838384363944243137622864918257474256280127291116965050600178120477720784742184205376195975831677721764740044536624645764471381571452381830125398765152083287483110279394697855915713981939970684599199594863007230624076786139617554631450734995190081932187616814234632738778224433256463738346435274905710925581106061273840975592931761266799265587765468946764337085192369358316298457450008809428586921504743730873895710474614480003727146162349858333291516552162545370312200390841588309480973274631646273597390249477746657131891196482398670118797910098918899689482196956660638225731960693542763964302308999692957091061300183648329785182793301407267200046383043005236759977387601407769110383295729918654520937785586390633157020347632812108728638589813282569529576769367173324764085285705308312954957401558247168739931446569422818723482471097374362105279278558570746278168331596903799527959001674856155564619821407044799720020620642233246057848236476047540762849788325435630592420194490443539428990899488655890183886788650518595542180257939200539645041808387760238189562428351774632440622618056913137499820021924733173668036806485733443567039613866037176155955253827548473360440517049422696075501183292573063250613021167503858561082238374439193413231472608072888733326512853287806773389073299297372760244397355791502004654458118728037510329034120643030182346716011974996719598934277635297762958837247389366909763367493682299430362668996193935405226221180280462691353912282455701759810037116439968883639596108926413528826200502511551071661541071241892319070812994269518086385295992381025957172992399312141414210235547707008555590049509294048331178258885645254295737834927590332773105843826797756540039810295021699037788228205072146738094320261980823252096852875670591366194556595549470362090317233349128160475626293246538430039226463877253517855062981890058712415866578727694362877805078594115939049922697215689139042884475829798201399221843339843144334329750976265054375898637087619406776357862341599539585772173362569929723217313856218610739079911693928395573354107695207924389443047735986097057117102761647398583746704066222192489628491579241861512228457942727677656217068060304063431859444999092873095546808035894071193872676924207893595051334067870866978585241063298399448801664979503576258730853137762656715932674584878408765074348715350808211160488037567370082449596914044378631384351574514574407266268601518418121140639017772950755439822352142605465639756330937185434812776437455170052704254873689525989445652781559474644227537684964321625946200647347726100468875445797592291192363724641100602571723960104389727561487616213893880158699261565353860394268412519478250755882121502350855777548987354957187611364644347783460623918569790357712078708030071729862147204119062003145783057657964335620490686654777775857772417230654005669380137272188650104502859563282535642734533430567287319498304528915876638370296607209654727246810120749147011579846007686876872348978767610197018167444101532656500699586407674404325249380187066956228877621206281130141035339929259895087216809976356039304176324615051223863642132987493989282096132023719628675179659793099441124234181354583082636306115430335248256636595542753063577946177399294336318459611754831189657065079679934928129113295189411660749306226747061753316760480290760846421347557553607185254462514991634789163215592554565288625021429064594217444034435094635489801294636044217141894128608560200837942901104014713783039046587228833888032709513732700101667002833885010142407620233438106861087062055906874872893491133678484259720820886397724438939944326449942516696628683510030426237257765426269532595248183289611602373952305073827029425838481007443361481172033664199893614932623554378101313353925699162767581809444174957293532641034112367163940472496454826645496608268491435975330754792022473413254641635309131365360013914909519963236046952897089347016136738984133133790874101143168691022141918967797877476450100585067348766183224990814253610763592974731784263832853675045343246533254966131311531411068478710429786791811404658680805588105768518292098129259164151153126615341498379324353953450723874092401152015787628879390603785057522375088322779364007018433582543673090990833352296302290390165336647355242365982903670648563727239283547241202029021901993493453231407543942533374303128855544718854681133818703717309615999563617026069360208156393214924333856037726771259857931298487909006782987195926835910537279213582905667384935745871483880724959685377284455451325009389359115356341859747548302075715614439876712304113995679250907454883895302396632381653230532032695481751231940062856024456656381220713413431325444483757534262449339675147214243079144598658808202548926312120596697863356554722348114194969409174072455372221354826189882023922524876054935905929454258925505387898039528329076689551108932342856243697999637938228068665595345855978215420274558562368590236467711884770512666328306756286559348574636272916414332349992225277379071952095234443041820054854970323931404077610323730988914889188356127533914074856107086479831584739755622106834971368997334246432264012757261628954213626177797127289818357558926591911175376134554737367672941224416966599144520688033032388494464597481600684233179969688713377153969107014820586500187890028419759966629125896903859724482018551567368459339437282027473163713630554370146518281068049701849575089743432349308849281456182745027011845653626290780738299181305772482001250991761047543344790454625943156085044661103576512523366161351099640751135385148305913987889008698009234370941891346098306437937661227172386506980636903743541285235605780167216008920828610842066522096589500420940606405692664109905063234866117077516308694175709123219476283230290207497555159467149979347020209673500496651023554475005053991295374430728524771212435107382664318842703197811901075027036703041419315229156263279708865064004473392401710817533040210152757966691416471836361498546249180866049039738294265863864925406135752428537159880132061042828090772733103561437021070938835520484987564784902357826645006185384847299711513042558913116550679842981785737713725790045128094411676264858573201529073678073396387519268373798582548263868592119666097381189255247190641352195443081432945981901223716745712543744847146503012460085216148335807619624528396069010370871981642712755932969484501155184487454597846375782598809708096893645439856478634508146859065978179351007580744928974114529788215226484601824974140107352758776378993800008479463640459773788106039221647527915619638375897279653946867057366337834721265500081035695372958187077367633848426351345959537644131255393886949828040966112768013745671476622221973172299021322723830684345054818157484501760113734299662298242039459694484074671808880126261963999301400833575366587220239180443885948634911432672454909578479586976064598126633177835011824812040440090529736915436564330317784343260941419199007994565556336195654994767768391641843167291242587882400091208124348669996343070061026732554587428779976439512259161737036335847682346728539549778493388870528102969822923976454022477322075204905420377823800876540724560782242540043358494305758648390071388556142954991440895026034342297754624387472732697423260211014731729196139172514053952591428247887383243344755389104496037975360677224765591211970382212225942797592005272680787386239303946689423293709148965999400795905073756697025967564396661027489606337872152854151887574400979150870295978066773059913103141338094206140446153595784659696116999451265627049162745281492831846033865707908304944975732574637090102130752860241496159897720566523711477673910492376257245019657271734451417565932034846341070093018262777507790026122302775680179025723685230883459924631462602175535978001836273235741164283034661871238537285831967107455175175353583907073921428e-4966") + && check(convert(0x8000000000000000ULL, 0x0000000000000001ULL), + "-6.475175119438025110924438958227646552499569338034681009689884389197039540124119371017671491276649940255878141476848119676587219886382542046685110071972617983042792710751334934416734625638471740239448526505553990391455556252171148068070822034688256982476272828789103028357337561348031062386564592639826226991907907867663262065711211583064657196068308332845234453069760526489447660964579313751403402631804350039948870075255648713368066117879403155766713303467434937062409411685215137607333139422843835051668983567167196802642952353504079714347103860537782893700215521168667711042950610021881513627986429461700433339201935397498825184335385514892844339930852967838448682125502304114122153045946465463084764110174478737044335312389661483639210553943411476544786261397875064191451226767614625892790369961415069606980007080502788648919975916801878222002252381723047230971876570995428821219281596547633023538783137183646396952831530551068683419596735374086746290525867996216905323365319885172609956827625511036332478353228947631880050684559150608318986521540136061273771493390412784756552103897518527764158778759333880714882279633323826397312375406927039446525306447838514371503654987855172306307584155459826707095909617752526800401326990828721633726770440915439092677906646798573524199116648264206920451160133635071361773812121716528178148240720783226736549623736135274990309138143183248371959875978805027500928693808073336955752759088442865600075199888998323880643549670055505421362435108572732087322982027187772459231228989472372951864321099261878781084330252988333921362998963303722431059741968763452406953835015120533773385289904710843628402700274702870474073825248828889984994284607604847211794221210729913159829014217168004461049532662696542913183628157199561641949923936629368992856621383084545327636972265542355341749855663020004887316835216156767223053799811067258913808469994232607858854524064432145775922144535701236468985705212977045479489515690009388923625580685788707605877343857669170894656797423368490329407251160393356048820607085089069025413584269816739747211239513550414383117508826763143512862006497058041145296097892917999935577053234252698691933792724753682184537682835562829938630004838384363944243137622864918257474256280127291116965050600178120477720784742184205376195975831677721764740044536624645764471381571452381830125398765152083287483110279394697855915713981939970684599199594863007230624076786139617554631450734995190081932187616814234632738778224433256463738346435274905710925581106061273840975592931761266799265587765468946764337085192369358316298457450008809428586921504743730873895710474614480003727146162349858333291516552162545370312200390841588309480973274631646273597390249477746657131891196482398670118797910098918899689482196956660638225731960693542763964302308999692957091061300183648329785182793301407267200046383043005236759977387601407769110383295729918654520937785586390633157020347632812108728638589813282569529576769367173324764085285705308312954957401558247168739931446569422818723482471097374362105279278558570746278168331596903799527959001674856155564619821407044799720020620642233246057848236476047540762849788325435630592420194490443539428990899488655890183886788650518595542180257939200539645041808387760238189562428351774632440622618056913137499820021924733173668036806485733443567039613866037176155955253827548473360440517049422696075501183292573063250613021167503858561082238374439193413231472608072888733326512853287806773389073299297372760244397355791502004654458118728037510329034120643030182346716011974996719598934277635297762958837247389366909763367493682299430362668996193935405226221180280462691353912282455701759810037116439968883639596108926413528826200502511551071661541071241892319070812994269518086385295992381025957172992399312141414210235547707008555590049509294048331178258885645254295737834927590332773105843826797756540039810295021699037788228205072146738094320261980823252096852875670591366194556595549470362090317233349128160475626293246538430039226463877253517855062981890058712415866578727694362877805078594115939049922697215689139042884475829798201399221843339843144334329750976265054375898637087619406776357862341599539585772173362569929723217313856218610739079911693928395573354107695207924389443047735986097057117102761647398583746704066222192489628491579241861512228457942727677656217068060304063431859444999092873095546808035894071193872676924207893595051334067870866978585241063298399448801664979503576258730853137762656715932674584878408765074348715350808211160488037567370082449596914044378631384351574514574407266268601518418121140639017772950755439822352142605465639756330937185434812776437455170052704254873689525989445652781559474644227537684964321625946200647347726100468875445797592291192363724641100602571723960104389727561487616213893880158699261565353860394268412519478250755882121502350855777548987354957187611364644347783460623918569790357712078708030071729862147204119062003145783057657964335620490686654777775857772417230654005669380137272188650104502859563282535642734533430567287319498304528915876638370296607209654727246810120749147011579846007686876872348978767610197018167444101532656500699586407674404325249380187066956228877621206281130141035339929259895087216809976356039304176324615051223863642132987493989282096132023719628675179659793099441124234181354583082636306115430335248256636595542753063577946177399294336318459611754831189657065079679934928129113295189411660749306226747061753316760480290760846421347557553607185254462514991634789163215592554565288625021429064594217444034435094635489801294636044217141894128608560200837942901104014713783039046587228833888032709513732700101667002833885010142407620233438106861087062055906874872893491133678484259720820886397724438939944326449942516696628683510030426237257765426269532595248183289611602373952305073827029425838481007443361481172033664199893614932623554378101313353925699162767581809444174957293532641034112367163940472496454826645496608268491435975330754792022473413254641635309131365360013914909519963236046952897089347016136738984133133790874101143168691022141918967797877476450100585067348766183224990814253610763592974731784263832853675045343246533254966131311531411068478710429786791811404658680805588105768518292098129259164151153126615341498379324353953450723874092401152015787628879390603785057522375088322779364007018433582543673090990833352296302290390165336647355242365982903670648563727239283547241202029021901993493453231407543942533374303128855544718854681133818703717309615999563617026069360208156393214924333856037726771259857931298487909006782987195926835910537279213582905667384935745871483880724959685377284455451325009389359115356341859747548302075715614439876712304113995679250907454883895302396632381653230532032695481751231940062856024456656381220713413431325444483757534262449339675147214243079144598658808202548926312120596697863356554722348114194969409174072455372221354826189882023922524876054935905929454258925505387898039528329076689551108932342856243697999637938228068665595345855978215420274558562368590236467711884770512666328306756286559348574636272916414332349992225277379071952095234443041820054854970323931404077610323730988914889188356127533914074856107086479831584739755622106834971368997334246432264012757261628954213626177797127289818357558926591911175376134554737367672941224416966599144520688033032388494464597481600684233179969688713377153969107014820586500187890028419759966629125896903859724482018551567368459339437282027473163713630554370146518281068049701849575089743432349308849281456182745027011845653626290780738299181305772482001250991761047543344790454625943156085044661103576512523366161351099640751135385148305913987889008698009234370941891346098306437937661227172386506980636903743541285235605780167216008920828610842066522096589500420940606405692664109905063234866117077516308694175709123219476283230290207497555159467149979347020209673500496651023554475005053991295374430728524771212435107382664318842703197811901075027036703041419315229156263279708865064004473392401710817533040210152757966691416471836361498546249180866049039738294265863864925406135752428537159880132061042828090772733103561437021070938835520484987564784902357826645006185384847299711513042558913116550679842981785737713725790045128094411676264858573201529073678073396387519268373798582548263868592119666097381189255247190641352195443081432945981901223716745712543744847146503012460085216148335807619624528396069010370871981642712755932969484501155184487454597846375782598809708096893645439856478634508146859065978179351007580744928974114529788215226484601824974140107352758776378993800008479463640459773788106039221647527915619638375897279653946867057366337834721265500081035695372958187077367633848426351345959537644131255393886949828040966112768013745671476622221973172299021322723830684345054818157484501760113734299662298242039459694484074671808880126261963999301400833575366587220239180443885948634911432672454909578479586976064598126633177835011824812040440090529736915436564330317784343260941419199007994565556336195654994767768391641843167291242587882400091208124348669996343070061026732554587428779976439512259161737036335847682346728539549778493388870528102969822923976454022477322075204905420377823800876540724560782242540043358494305758648390071388556142954991440895026034342297754624387472732697423260211014731729196139172514053952591428247887383243344755389104496037975360677224765591211970382212225942797592005272680787386239303946689423293709148965999400795905073756697025967564396661027489606337872152854151887574400979150870295978066773059913103141338094206140446153595784659696116999451265627049162745281492831846033865707908304944975732574637090102130752860241496159897720566523711477673910492376257245019657271734451417565932034846341070093018262777507790026122302775680179025723685230883459924631462602175535978001836273235741164283034661871238537285831967107455175175353583907073921428e-4966")) + return 0; + else + return 1; +} + +#elif PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_INTEL_DOUBLE_EXTENDED + +int +main() { + if (check(convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL), + "-7.6048540943660203383375998875878002021755137452856942966991187375790618225432711954682137529456970686263412309600617913197560145993931792374946076061175594550915924955313391528566777352996816141138550473090399783817652516896553304678788796532976847530386107750759127004897950996937530751872097675156395937218234460013748219954603465088115161828048215763754331575034447236689765045674584188927116128770082933362914567237187017530082528540058002631800274192146485961758366625476271676375489358478966148719270989233284454992652229565352739884432045036085427546783826745250197623257802129011015273728848161395367551745780868250488191368846207890422268873532651627591649389757751752362072212699309947970918940313250863861141479770240104635553035870698789854752554391365757900620463269938427975381635241159694500569550818398323639621243086116154792038064941523448921284117826015673798399008555604372098051095571652170081985843614541956756469168604624857938653843172027861680499952062356914208628014745759010068414302636374017506453133466034362025545080555878082849488386388633197121003201192243150535143329731394874806398663589117246866205872431804204733617792317769570293754056793574570217834482046448788177551912250351735294891953434051815332631157674735614138641122106756749236824504094008852401427746414294902929999820878756040223246586814590339767277305131757114819123212897500810087015748205562614251410818122967399030151040544000563841334553718469935435435467196184665715776274355094471974036803615388313095637066824428688301387559074204015990782977635088047810891072724763113879034313256582868462323549141603475107584159170279311985555035822254439699354641467841523895459190280971487264907972306090449968125859834702627544039374770757804202780369083049631377117943503836158566134919890165392965694050010089785271180956974707841066789578714463804030217977213138932711313311673101336981407798868338574571646697479192174043005729926344062133712267722538847635563454980776602355539986984320762864338177037919835721981686778834558429264194379257521818498431326991615024245632036376472844033831041082865649867453234086495085785897620758602105639344460383483879837994732204331335249564434458633345708439547881275060781028856140511029543559841701048277393119691261302356763314623124427357421753631218361407626116820986377721964654181839884670481278855478057996766639496909094607181503284084821580817995489740980323820218685313435967428474842973086612053963343516426226771094376179468881265734324847319127862733279299033951360912038720313525324094079916937921290391173035983474894312808532257620563284126400481460163180987618432784215807933623038747129658746767737999870125917269554155887740155308886259497202672935871853706835670467770080598813171256855182510726902033818328368569915805303784312301890212694874227119220544172084552511408717615136830401766455214293141216171050374325461714383991698910564587610624980490526840861990674615172112493813749497898151186927777122955666180439323595468816129418014664347852590958362752922841159054568358354108159485566264221008508127941168192513144760720303715640604755054290633421601734103622748053919536319416025380484868142967373186019970714662893713233834399238357795019603619284595839414945178963942707310299674873908104634979966232181071013259653467885733418936194081202149071958107062125873498848807502257018093517304220495114497635240876547262237411350327960679115197531609627900227913193653254580253539005743563270152329126178570329413401577715075363838562221558204219798925982825556469998988615897432425107152113543617151738802778259560442930074253918797315241708532198010528564246933829811859278710445896556638416265987381678070434371355795025956293319362293063591248665429733880825207421011852020394068840244110140622151494488609575671090387230241296949998536132398625008053543954239573998167556201366323875845409929752349853515625e-1644") + && check(convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL), + "-99658331877181425640389193712445288804009112642407197633229907048864350192381814628233384153539524368748305269642704450459572458913058829202094408933558533552137589226430537671503754737153845553845646099179512540696038707395491223325946106007770844660381340028079827237033670900446083793353682761885084154898636897779677124010119288945740273072415898996441722571487815052387317025675191665761918119006431828756780493604546658949166486641354783002536071366287780290680620995991797712341457334946893188786269086688063732222194404683551757689083590842400866213237312413463207537587813396338061744078437770542720749055069473347142994267706326342325536219464867910547533482061181116137767384001927599515332824741827726661184966512254203502805790565338206862173475388342339711722457620964017690492860707751327158273522191943184085888284707357024653025991470473697475045491586713324994056478341556198451786713470909185879382607340766256394396819602885198511409676789226542867632933493115191296") + && check(convert(0x0000000000000000ULL, 0x0000000000000001ULL), + "3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587346566858083349053123705193988703983308587839946322501468602459466376586870456423634710242397194658860357568067134477982764219736292817751295560536845761267846647908517463250923736039512722781415953366096399444403402117053488448021977763604437908687623249034116909294550532283554604255016471048510990155249694820376175072774521597924829264164672829379224834378522148847524461653340453140898534938901079999466084995792940867082225167898092626332284133633537230365710606672711016101696986908545526816093446785575823545286456670464909287063062587561930219192839574686079732400741932670792586584247903252601714502511652018733705556477669856403061671860988301022089008752404238293812121415758527179547281628232710885994458574715033852877595426024800791719981955344151916599003503828822200355665967958771090937688409231050763744882094456320484272716122798149836361660589595209083576887254232532955229749892640550762959438241278496193819382077545905461172547961340469817691165676094261320725727312607482937653140421619686103059529199421431937449566099337396063075218302243845475341677972462038126626903408167086517545386382155008956065955410392914952623927880847159533184535486666480480563407531428385329300522477684217050951264747454635754866214784941542315111038630684391425212439304190584122374222972284606537485052464648655369719099026760518287560996997210778473066980129427427439517032390964791367678221749630975419713438139162678878555999177528450882748046538588177447270306738234898502976902853001364550405227287093940058325788585457368654991956265863050083472087623066020903378919489920975190829421602010382039477772083400661519154972695436582305021910908576692048173534958894170976763084807837402813849227540942073315401115262334876815962087441302256558438912500607230205782013083674113023497612445214795170983848687988348203289441256908755565216081815151205638893112562415329084456934095146184469290901166110634875590164835606941629407489774379792739804674764243483912084691871769225446506284310565309190872477286255925383528545036360550854226919571246361133225904820301916588317084377712259367894846411294822587075835486985645510829880528578782698412556249274522235061092454342386202327120407827540333914613192189174315884136688019435966273663470431440443032136411775605030601436837063972690330417475187330200911967500496761618122614796452937124070398703890868915527051490465736745397764941094879479649438162576614346948652085308024696358256756585794568493319042053882843808180358787110774418075478801186519577416271896383169835708225636584654568643702618602433548938163720732772538345454513065011540675765510656970500413537205370067924880209217363407323673368448004904408413977741706965494247040799786451861822188473571257556819433284087486023676249467869483631380473856486239547015603318322612783652068699798539400406637311682731115340677841660240710431551140370410375585572939303084073843540702120551963050514959945741359169911676575478403279380112020347348292538150798320452794842427526501796852911863108178276638472320237870082862271763396195139513712303136194366021540830531456910584048372546025177765140460207112923151923176402146752868221966889915381596481253160696822260723194259521813054303457222367967929268763072892355278854714278243863110783067060124459039315528176840304931522813148745824350892130595015198002557204332483215551447097512510076223364801202888087635650654634946887232727623906459076670227108634162319210357007273369354657187569046394884895083794103531835959613994575377897775525461977464747518162975010091463561925032742645594645800581600698347817023194379921397347681150492687237349021564206463096138703201250277757980410772647014391579144424375252519766764670458008515297647624144814453496069685127439800629552075692648608681506879044376428977463175175205181547958459515159074701285838493694034007662410100183533141516684185460758175066481561018901133031951042099053297118837448984443230856642737606478787880285299903521855025612413471034466624171559209077538498475106811294029060334271803320566493935024621719717684804443351866946690525266060758332190531807232565501890293754259590947433140384335366973398816899253698302119916142891631005349335372158005779944529176735887193980409288474621694590303098552382376969442365186023130985507823617670051191889015351479659778676132449671642015059540438237303922903056079068344635440276772565425944329927654906262952475555750912023879424636021462043321631428365675851865654901693474343411406220907550090045689588323936814675126103464401223728058185048320475251266882875299120582253090033177883674432343812734123922042926554908548231473285349572210962289889800994026533629321464700552029391517293055196218065667251276237490129206098414338903210942488902792253924667941082273267563528653863343443486495762400409978995985052082310730277076965242846278402568285187365588876653245423047205943478612931964211293489374119565751486787204884502307512372923973119191125614068756094526892783321688030310900558025683455451898487401139315290743477461921025987905332236299398859448938742087487316288730711068752763449392366897236258997091176996253284306687635454361862179407191652155243650619571720232128624130785404930566805029233271375546253313287446285812219961565022654510373870581648214791139170870970509074158721967633425471550515801498191107216277620692347014234913527385812164834475002007099402122991439542783981984927181300669603290190495106195784248531299740262706106798338573523977365240941293695214188675632715447081372252551022981921251125675131839210074132286029621443262127145872022404314258219255606415280218445074654034790115075558513374422753617188198385931164810182817002794172279803028202086567081267453349341345496389239379776494419022301042067986600501045466950004057134726934147691678031986698845370299987067384407310337433828116514830745374490760171672152978595040351405572526523026051215093709900567873568385242574546385008567738263951532676549294356417565797771595638496719149577804216291892125541055147173723744991756669672459021375111288754125372918394417976243093028214703329386031799313949535161343892720409046065009958980978947997662545514664194262097665297242612367968766000629174655887090824363583653843658980277566031286429628476318572915045823895805826010132712977834418613468288832988547377174550796802573148684253294172285056777826927377158058647145403557721233512002495437339413998842782599710186215723437958154275340509811072349041046483806284608873394275718878590418692809288333423522781240698974441829879303794241455852776713321354870647251094720675572322788447908778778892116234131617608416732280987493141331884927860259324392781255786150891859203497212615916404999097067778739914857961305884934678762043515521190581898256624635957830927811421154992139986999936203631149852372802564314896151749326404428772008250428569338329698161850171265411426708113723558325059062871506712838460986031147060351491506316012532538793354499545667009527573810892048004652452452139688789392912938251888341298122235232861138733903153560967292104241190946350516769769305030762386908399592555043192236069279491224465826684203312081255431851756341234566913972589390601558650830437402045595207689996159597545711808203688318112918947661662115802919578636403430323041610018063696707221249826383715263388850307418469423973486747009233945036220901518185766942733836846126816638158345048782728241251279820310193223512959111029884002230571688216854282257873218631744450950552327428952538149545262779889824399028513132208638633070602135522752076661567872472325125674291268881849101416382703647451428232847993332157180794015036365361645888146355749366150209085457189187232786399585879941680370348141105404742298452497895369287193974496140445677301271403589665822911096832952021181343571136957607816318342755770560406569920261633966403484121679869542684843686908354373688437968683525723666121485947946747887572716360800696442816474113593466106089204179554677145374582437962664618883018628687510079511252556002241788346284019750863992283906513572325918053464080643521532154825074820239077990779007069588034029619562190416747359712884084324521598678178890186409451480686781733176824920276835002477523486093586963733155424491897575495851549527034538337694314953057164019215026670773910997443279760005290641511584707193226351271670439775141076552632736166117611394934325673743882365518318561208941552931629125136799711574578916741023587251428998946963182411650554404206416336487418656105333038545773960190949602850096208569085230228708894874577523512558281973392961263921656163963369388411763476388625952406901518273413037068643383550282962237729195901788599392876651086599849223994259145259240479384380657803498058719062529007339428316229997756899857712116922758683071707472935574499244978419788171338468471751125303860911589289400806637202920429489919870263415951660888975434827304297451362325052693482001524843171229078467910537913138115458626612024970730899515114301915281613929239329351501049859225274564107846818112938339161308943153205117651716380468462296193882444293370484368530096898812778973178284912798550245246063411918482638261694029245273291646707331594675213428158755273882438357960245064051015888918541801139771619743221405037797285669481455810653320008904215997597975907391512026214020012010134707536774227636477580918167507850485197065326391091171451763751237612739498468510009055480025096015985581769370179656781151306565952590101977398335185042637681982306448413722177895665290302796223004198526079143104070007874540548221582347389579e-4951") + && check(convert(0x8000000000000000ULL, 0x0000000000000001ULL), + "3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587346566858083349053123705193988703983308587839946322501468602459466376586870456423634710242397194658860357568067134477982764219736292817751295560536845761267846647908517463250923736039512722781415953366096399444403402117053488448021977763604437908687623249034116909294550532283554604255016471048510990155249694820376175072774521597924829264164672829379224834378522148847524461653340453140898534938901079999466084995792940867082225167898092626332284133633537230365710606672711016101696986908545526816093446785575823545286456670464909287063062587561930219192839574686079732400741932670792586584247903252601714502511652018733705556477669856403061671860988301022089008752404238293812121415758527179547281628232710885994458574715033852877595426024800791719981955344151916599003503828822200355665967958771090937688409231050763744882094456320484272716122798149836361660589595209083576887254232532955229749892640550762959438241278496193819382077545905461172547961340469817691165676094261320725727312607482937653140421619686103059529199421431937449566099337396063075218302243845475341677972462038126626903408167086517545386382155008956065955410392914952623927880847159533184535486666480480563407531428385329300522477684217050951264747454635754866214784941542315111038630684391425212439304190584122374222972284606537485052464648655369719099026760518287560996997210778473066980129427427439517032390964791367678221749630975419713438139162678878555999177528450882748046538588177447270306738234898502976902853001364550405227287093940058325788585457368654991956265863050083472087623066020903378919489920975190829421602010382039477772083400661519154972695436582305021910908576692048173534958894170976763084807837402813849227540942073315401115262334876815962087441302256558438912500607230205782013083674113023497612445214795170983848687988348203289441256908755565216081815151205638893112562415329084456934095146184469290901166110634875590164835606941629407489774379792739804674764243483912084691871769225446506284310565309190872477286255925383528545036360550854226919571246361133225904820301916588317084377712259367894846411294822587075835486985645510829880528578782698412556249274522235061092454342386202327120407827540333914613192189174315884136688019435966273663470431440443032136411775605030601436837063972690330417475187330200911967500496761618122614796452937124070398703890868915527051490465736745397764941094879479649438162576614346948652085308024696358256756585794568493319042053882843808180358787110774418075478801186519577416271896383169835708225636584654568643702618602433548938163720732772538345454513065011540675765510656970500413537205370067924880209217363407323673368448004904408413977741706965494247040799786451861822188473571257556819433284087486023676249467869483631380473856486239547015603318322612783652068699798539400406637311682731115340677841660240710431551140370410375585572939303084073843540702120551963050514959945741359169911676575478403279380112020347348292538150798320452794842427526501796852911863108178276638472320237870082862271763396195139513712303136194366021540830531456910584048372546025177765140460207112923151923176402146752868221966889915381596481253160696822260723194259521813054303457222367967929268763072892355278854714278243863110783067060124459039315528176840304931522813148745824350892130595015198002557204332483215551447097512510076223364801202888087635650654634946887232727623906459076670227108634162319210357007273369354657187569046394884895083794103531835959613994575377897775525461977464747518162975010091463561925032742645594645800581600698347817023194379921397347681150492687237349021564206463096138703201250277757980410772647014391579144424375252519766764670458008515297647624144814453496069685127439800629552075692648608681506879044376428977463175175205181547958459515159074701285838493694034007662410100183533141516684185460758175066481561018901133031951042099053297118837448984443230856642737606478787880285299903521855025612413471034466624171559209077538498475106811294029060334271803320566493935024621719717684804443351866946690525266060758332190531807232565501890293754259590947433140384335366973398816899253698302119916142891631005349335372158005779944529176735887193980409288474621694590303098552382376969442365186023130985507823617670051191889015351479659778676132449671642015059540438237303922903056079068344635440276772565425944329927654906262952475555750912023879424636021462043321631428365675851865654901693474343411406220907550090045689588323936814675126103464401223728058185048320475251266882875299120582253090033177883674432343812734123922042926554908548231473285349572210962289889800994026533629321464700552029391517293055196218065667251276237490129206098414338903210942488902792253924667941082273267563528653863343443486495762400409978995985052082310730277076965242846278402568285187365588876653245423047205943478612931964211293489374119565751486787204884502307512372923973119191125614068756094526892783321688030310900558025683455451898487401139315290743477461921025987905332236299398859448938742087487316288730711068752763449392366897236258997091176996253284306687635454361862179407191652155243650619571720232128624130785404930566805029233271375546253313287446285812219961565022654510373870581648214791139170870970509074158721967633425471550515801498191107216277620692347014234913527385812164834475002007099402122991439542783981984927181300669603290190495106195784248531299740262706106798338573523977365240941293695214188675632715447081372252551022981921251125675131839210074132286029621443262127145872022404314258219255606415280218445074654034790115075558513374422753617188198385931164810182817002794172279803028202086567081267453349341345496389239379776494419022301042067986600501045466950004057134726934147691678031986698845370299987067384407310337433828116514830745374490760171672152978595040351405572526523026051215093709900567873568385242574546385008567738263951532676549294356417565797771595638496719149577804216291892125541055147173723744991756669672459021375111288754125372918394417976243093028214703329386031799313949535161343892720409046065009958980978947997662545514664194262097665297242612367968766000629174655887090824363583653843658980277566031286429628476318572915045823895805826010132712977834418613468288832988547377174550796802573148684253294172285056777826927377158058647145403557721233512002495437339413998842782599710186215723437958154275340509811072349041046483806284608873394275718878590418692809288333423522781240698974441829879303794241455852776713321354870647251094720675572322788447908778778892116234131617608416732280987493141331884927860259324392781255786150891859203497212615916404999097067778739914857961305884934678762043515521190581898256624635957830927811421154992139986999936203631149852372802564314896151749326404428772008250428569338329698161850171265411426708113723558325059062871506712838460986031147060351491506316012532538793354499545667009527573810892048004652452452139688789392912938251888341298122235232861138733903153560967292104241190946350516769769305030762386908399592555043192236069279491224465826684203312081255431851756341234566913972589390601558650830437402045595207689996159597545711808203688318112918947661662115802919578636403430323041610018063696707221249826383715263388850307418469423973486747009233945036220901518185766942733836846126816638158345048782728241251279820310193223512959111029884002230571688216854282257873218631744450950552327428952538149545262779889824399028513132208638633070602135522752076661567872472325125674291268881849101416382703647451428232847993332157180794015036365361645888146355749366150209085457189187232786399585879941680370348141105404742298452497895369287193974496140445677301271403589665822911096832952021181343571136957607816318342755770560406569920261633966403484121679869542684843686908354373688437968683525723666121485947946747887572716360800696442816474113593466106089204179554677145374582437962664618883018628687510079511252556002241788346284019750863992283906513572325918053464080643521532154825074820239077990779007069588034029619562190416747359712884084324521598678178890186409451480686781733176824920276835002477523486093586963733155424491897575495851549527034538337694314953057164019215026670773910997443279760005290641511584707193226351271670439775141076552632736166117611394934325673743882365518318561208941552931629125136799711574578916741023587251428998946963182411650554404206416336487418656105333038545773960190949602850096208569085230228708894874577523512558281973392961263921656163963369388411763476388625952406901518273413037068643383550282962237729195901788599392876651086599849223994259145259240479384380657803498058719062529007339428316229997756899857712116922758683071707472935574499244978419788171338468471751125303860911589289400806637202920429489919870263415951660888975434827304297451362325052693482001524843171229078467910537913138115458626612024970730899515114301915281613929239329351501049859225274564107846818112938339161308943153205117651716380468462296193882444293370484368530096898812778973178284912798550245246063411918482638261694029245273291646707331594675213428158755273882438357960245064051015888918541801139771619743221405037797285669481455810653320008904215997597975907391512026214020012010134707536774227636477580918167507850485197065326391091171451763751237612739498468510009055480025096015985581769370179656781151306565952590101977398335185042637681982306448413722177895665290302796223004198526079143104070007874540548221582347389579e-4951")) + return 0; + else + return 1; +} + +#else // PPL_CXX_LONG_DOUBLE_BINARY_FORMAT != FLOAT_INTEL_DOUBLE_EXTENDED + +int +main() { + return 1; +} + +#endif // PPL_CXX_LONG_DOUBLE_BINARY_FORMAT != FLOAT_INTEL_DOUBLE_EXTENDED + +#elif 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; +} + +#if PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_DOUBLE + +int +main() { + if (check(convert(0xaaacccaaUL, 0xacccaaacUL), + "-4.018242396032647085467373664662028399901175154542925376476863248797653889888945947404163925979898721593782464256360719269163883854613473748830842329884157359816532025640075051481726120707111709993717456369512975427023957197464411926714771905463723621065863511603311053477227687835693359375e-103") + && check(convert(0xcccaaaccUL, 0xcaaacccaUL), + "-85705035845709846787631445265530356117787053916987832397725696") + && check(convert(0x00000000UL, 0x00000001UL), + "4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625e-324") + && check(convert(0x80000000UL, 0x00000001UL), + "-4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625e-324")) + return 0; + else + return 1; +} + +#else // PPL_CXX_LONG_DOUBLE_BINARY_FORMAT != FLOAT_IEEE754_DOUBLE + +int +main() { + return 1; +} + +#endif // PPL_CXX_LONG_DOUBLE_BINARY_FORMAT != FLOAT_IEEE754_DOUBLE + +#else // SIZEOF_LONG_DOUBLE != 8 + +int +main() { + return 1; +} + +#endif // SIZEOF_LONG_DOUBLE != 8 + +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + ac_cxx_long_double_exact_output=1 +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 + +( exit $ac_status ) +{ $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ac_cxx_long_double_exact_output=0 +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + + + +cat >>confdefs.h <<_ACEOF +#define PPL_CXX_LONG_DOUBLE_EXACT_OUTPUT $ac_cxx_long_double_exact_output +_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" + + +if test x"$ac_cxx_long_double_binary_format" = x"unknown" || test $ac_cxx_long_double_exact_output = 0 || test $ac_cv_can_control_fpu = 0 +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" + + +# Check whether the C++ run-time systems provides exact output for +# floats. +#AC_CXX_FLOAT_EXACT_OUTPUT + +# Check whether the C++ run-time systems provides exact output for +# doubles. +#AC_CXX_DOUBLE_EXACT_OUTPUT + +# Check whether the C++ run-time systems provides exact output for +# long doubles. +#AC_CXX_LONG_DOUBLE_EXACT_OUTPUT + +# Check whether the C++ compiler supports flexible 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:$LINENO: checking whether the C++ compiler supports flexible arrays" >&5 +$as_echo_n "checking whether the C++ compiler supports flexible arrays... " >&6; } +if test "$cross_compiling" = yes; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include + +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 +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + ac_cxx_supports_flexible_arrays=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ac_cxx_supports_flexible_arrays=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include + +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 +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + ac_cxx_supports_flexible_arrays=yes +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 + +( exit $ac_status ) +{ $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ac_cxx_supports_flexible_arrays=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + + +if test x"$ac_cxx_supports_flexible_arrays" = xyes +then + value=1 +else + value=0 +fi + +cat >>confdefs.h <<_ACEOF +#define PPL_CXX_SUPPORTS_FLEXIBLE_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:$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:$LINENO: result: assuming not" >&5 +$as_echo "assuming not" >&6; } + ac_cxx_supports_ieee_inexact_flag=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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 + +#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 +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + ac_cxx_supports_ieee_inexact_flag=yes +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 + +( exit $ac_status ) +{ $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ac_cxx_supports_ieee_inexact_flag=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext 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 has the remainder bug. + + +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:$LINENO: checking if the compiler has the remainder bug" >&5 +$as_echo_n "checking if the compiler has the remainder bug... " >&6; } +if test "$cross_compiling" = yes; then + { $as_echo "$as_me:$LINENO: result: assuming yes" >&5 +$as_echo "assuming yes" >&6; } + ac_cv_cxx_has_remainder_bug=yes +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include + +int minus_one(int n) { + return (n+1)*(n-1)-n*n; +} + +int p(int x, int y) { + int z = x % y; + return z; +} + +int main(int argc, char** argv) { + if (p(INT_MIN, minus_one(argc)) != 0) + return 1; + else + return 0; +} + +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ac_cv_cxx_has_remainder_bug=no +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 + +( exit $ac_status ) +{ $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + ac_cv_cxx_has_remainder_bug=yes +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + + +if test x"$ac_cv_cxx_has_remainder_bug" = xyes +then + value=1 +else + value=0 +fi + +cat >>confdefs.h <<_ACEOF +#define PPL_CXX_HAS_REMAINDER_BUG $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:$LINENO: checking whether the C++ compiler supports __attribute__ ((weak))" >&5 +$as_echo_n "checking whether the C++ compiler supports __attribute__ ((weak))... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +void +foo() __attribute__ ((weak)); + +void +foo() { +} + +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + ac_cxx_supports_attribute_weak=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { $as_echo "$as_me:$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` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$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:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ------------------------------------ ## +## Report this to ppl-devel@cs.unipr.it ## +## ------------------------------------ ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = 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++. +{ $as_echo "$as_me:$LINENO: checking whether ffs is declared" >&5 +$as_echo_n "checking whether ffs is declared... " >&6; } +if test "${ac_cv_have_decl_ffs+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#if defined(HAVE_STRINGS_H) +# include +#elif defined(HAVE_STRING_H) +# include +#endif + + +int +main () +{ +#ifndef ffs + (void) ffs; +#endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_ffs=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_ffs=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_ffs" >&5 +$as_echo "$ac_cv_have_decl_ffs" >&6; } +if test "x$ac_cv_have_decl_ffs" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FFS 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FFS 0 +_ACEOF + + +fi + + +{ $as_echo "$as_me:$LINENO: checking whether getenv is declared" >&5 +$as_echo_n "checking whether getenv is declared... " >&6; } +if test "${ac_cv_have_decl_getenv+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef getenv + (void) getenv; +#endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_getenv=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_getenv=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_getenv" >&5 +$as_echo "$ac_cv_have_decl_getenv" >&6; } +if test "x$ac_cv_have_decl_getenv" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETENV 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETENV 0 +_ACEOF + + +fi +{ $as_echo "$as_me:$LINENO: checking whether strtof is declared" >&5 +$as_echo_n "checking whether strtof is declared... " >&6; } +if test "${ac_cv_have_decl_strtof+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef strtof + (void) strtof; +#endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_strtof=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_strtof=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtof" >&5 +$as_echo "$ac_cv_have_decl_strtof" >&6; } +if test "x$ac_cv_have_decl_strtof" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRTOF 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRTOF 0 +_ACEOF + + +fi +{ $as_echo "$as_me:$LINENO: checking whether strtod is declared" >&5 +$as_echo_n "checking whether strtod is declared... " >&6; } +if test "${ac_cv_have_decl_strtod+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef strtod + (void) strtod; +#endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_strtod=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_strtod=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtod" >&5 +$as_echo "$ac_cv_have_decl_strtod" >&6; } +if test "x$ac_cv_have_decl_strtod" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRTOD 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRTOD 0 +_ACEOF + + +fi +{ $as_echo "$as_me:$LINENO: checking whether strtold is declared" >&5 +$as_echo_n "checking whether strtold is declared... " >&6; } +if test "${ac_cv_have_decl_strtold+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef strtold + (void) strtold; +#endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_strtold=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_strtold=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtold" >&5 +$as_echo "$ac_cv_have_decl_strtold" >&6; } +if test "x$ac_cv_have_decl_strtold" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRTOLD 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRTOLD 0 +_ACEOF + + +fi +{ $as_echo "$as_me:$LINENO: checking whether strtoll is declared" >&5 +$as_echo_n "checking whether strtoll is declared... " >&6; } +if test "${ac_cv_have_decl_strtoll+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef strtoll + (void) strtoll; +#endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_strtoll=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_strtoll=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtoll" >&5 +$as_echo "$ac_cv_have_decl_strtoll" >&6; } +if test "x$ac_cv_have_decl_strtoll" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRTOLL 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRTOLL 0 +_ACEOF + + +fi +{ $as_echo "$as_me:$LINENO: checking whether strtoull is declared" >&5 +$as_echo_n "checking whether strtoull is declared... " >&6; } +if test "${ac_cv_have_decl_strtoull+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef strtoull + (void) strtoull; +#endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_strtoull=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_strtoull=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtoull" >&5 +$as_echo "$ac_cv_have_decl_strtoull" >&6; } +if test "x$ac_cv_have_decl_strtoull" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRTOULL 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRTOULL 0 +_ACEOF + + +fi + + +{ $as_echo "$as_me:$LINENO: checking whether fma is declared" >&5 +$as_echo_n "checking whether fma is declared... " >&6; } +if test "${ac_cv_have_decl_fma+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef fma + (void) fma; +#endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_fma=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_fma=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_fma" >&5 +$as_echo "$ac_cv_have_decl_fma" >&6; } +if test "x$ac_cv_have_decl_fma" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FMA 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FMA 0 +_ACEOF + + +fi +{ $as_echo "$as_me:$LINENO: checking whether fmaf is declared" >&5 +$as_echo_n "checking whether fmaf is declared... " >&6; } +if test "${ac_cv_have_decl_fmaf+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef fmaf + (void) fmaf; +#endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_fmaf=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_fmaf=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_fmaf" >&5 +$as_echo "$ac_cv_have_decl_fmaf" >&6; } +if test "x$ac_cv_have_decl_fmaf" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FMAF 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FMAF 0 +_ACEOF + + +fi +{ $as_echo "$as_me:$LINENO: checking whether fmal is declared" >&5 +$as_echo_n "checking whether fmal is declared... " >&6; } +if test "${ac_cv_have_decl_fmal+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef fmal + (void) fmal; +#endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_fmal=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_fmal=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_fmal" >&5 +$as_echo "$ac_cv_have_decl_fmal" >&6; } +if test "x$ac_cv_have_decl_fmal" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FMAL 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FMAL 0 +_ACEOF + + +fi +{ $as_echo "$as_me:$LINENO: checking whether rintf is declared" >&5 +$as_echo_n "checking whether rintf is declared... " >&6; } +if test "${ac_cv_have_decl_rintf+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef rintf + (void) rintf; +#endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_rintf=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_rintf=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_rintf" >&5 +$as_echo "$ac_cv_have_decl_rintf" >&6; } +if test "x$ac_cv_have_decl_rintf" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_RINTF 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_RINTF 0 +_ACEOF + + +fi +{ $as_echo "$as_me:$LINENO: checking whether rintl is declared" >&5 +$as_echo_n "checking whether rintl is declared... " >&6; } +if test "${ac_cv_have_decl_rintl+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef rintl + (void) rintl; +#endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_rintl=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_rintl=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_rintl" >&5 +$as_echo "$ac_cv_have_decl_rintl" >&6; } +if test "x$ac_cv_have_decl_rintl" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_RINTL 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_RINTL 0 +_ACEOF + + +fi + + + +# Checks for the availability of "fast" integral types. +{ $as_echo "$as_me:$LINENO: checking for int_fast16_t" >&5 +$as_echo_n "checking for int_fast16_t... " >&6; } +if test "${ac_cv_type_int_fast16_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_type_int_fast16_t=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof (int_fast16_t)) + return 0; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof ((int_fast16_t))) + return 0; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_int_fast16_t=yes +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_int_fast16_t" >&5 +$as_echo "$ac_cv_type_int_fast16_t" >&6; } +if test "x$ac_cv_type_int_fast16_t" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_INT_FAST16_T 1 +_ACEOF + + +fi +{ $as_echo "$as_me:$LINENO: checking for int_fast32_t" >&5 +$as_echo_n "checking for int_fast32_t... " >&6; } +if test "${ac_cv_type_int_fast32_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_type_int_fast32_t=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof (int_fast32_t)) + return 0; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof ((int_fast32_t))) + return 0; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_int_fast32_t=yes +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_int_fast32_t" >&5 +$as_echo "$ac_cv_type_int_fast32_t" >&6; } +if test "x$ac_cv_type_int_fast32_t" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_INT_FAST32_T 1 +_ACEOF + + +fi +{ $as_echo "$as_me:$LINENO: checking for int_fast64_t" >&5 +$as_echo_n "checking for int_fast64_t... " >&6; } +if test "${ac_cv_type_int_fast64_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_type_int_fast64_t=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof (int_fast64_t)) + return 0; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof ((int_fast64_t))) + return 0; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_int_fast64_t=yes +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_int_fast64_t" >&5 +$as_echo "$ac_cv_type_int_fast64_t" >&6; } +if test "x$ac_cv_type_int_fast64_t" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_INT_FAST64_T 1 +_ACEOF + + +fi +{ $as_echo "$as_me:$LINENO: checking for uint_fast16_t" >&5 +$as_echo_n "checking for uint_fast16_t... " >&6; } +if test "${ac_cv_type_uint_fast16_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_type_uint_fast16_t=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof (uint_fast16_t)) + return 0; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof ((uint_fast16_t))) + return 0; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_uint_fast16_t=yes +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_uint_fast16_t" >&5 +$as_echo "$ac_cv_type_uint_fast16_t" >&6; } +if test "x$ac_cv_type_uint_fast16_t" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_UINT_FAST16_T 1 +_ACEOF + + +fi +{ $as_echo "$as_me:$LINENO: checking for uint_fast32_t" >&5 +$as_echo_n "checking for uint_fast32_t... " >&6; } +if test "${ac_cv_type_uint_fast32_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_type_uint_fast32_t=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof (uint_fast32_t)) + return 0; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof ((uint_fast32_t))) + return 0; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_uint_fast32_t=yes +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_uint_fast32_t" >&5 +$as_echo "$ac_cv_type_uint_fast32_t" >&6; } +if test "x$ac_cv_type_uint_fast32_t" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_UINT_FAST32_T 1 +_ACEOF + + +fi +{ $as_echo "$as_me:$LINENO: checking for uint_fast64_t" >&5 +$as_echo_n "checking for uint_fast64_t... " >&6; } +if test "${ac_cv_type_uint_fast64_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_type_uint_fast64_t=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof (uint_fast64_t)) + return 0; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof ((uint_fast64_t))) + return 0; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_uint_fast64_t=yes +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_uint_fast64_t" >&5 +$as_echo "$ac_cv_type_uint_fast64_t" >&6; } +if test "x$ac_cv_type_uint_fast64_t" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_UINT_FAST64_T 1 +_ACEOF + + +fi + + +# Must link everything with libm. +extra_libraries="${extra_libraries} -lm" + +# GMP library. + + + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:$LINENO: checking for ld used by GCC" >&5 +$as_echo_n "checking for ld used by GCC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:$LINENO: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if test "${acl_cv_path_LD+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break ;; + *) + test "$with_gnu_ld" != yes && break ;; + esac + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$acl_cv_path_LD" +if test -n "$LD"; then + { $as_echo "$as_me:$LINENO: result: $LD" >&5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && { { $as_echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +$as_echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +{ $as_echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if test "${acl_cv_prog_gnu_ld+set}" = set; then + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$acl_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$acl_cv_prog_gnu_ld + + + + + { $as_echo "$as_me:$LINENO: checking for shared library run path origin" >&5 +$as_echo_n "checking for shared library run path origin... " >&6; } +if test "${acl_cv_rpath+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + +fi +{ $as_echo "$as_me:$LINENO: result: $acl_cv_rpath" >&5 +$as_echo "$acl_cv_rpath" >&6; } + wl="$acl_cv_wl" + libext="$acl_cv_libext" + shlibext="$acl_cv_shlibext" + hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + hardcode_direct="$acl_cv_hardcode_direct" + hardcode_minus_L="$acl_cv_hardcode_minus_L" + # Check whether --enable-rpath was given. +if test "${enable_rpath+set}" = set; then + enableval=$enable_rpath; : +else + enable_rpath=yes +fi + + + +if test -n "$with_libgmpxx_prefix" && test -z "$with_libgmp_prefix"; then + with_libgmp_prefix="$with_libgmpxx_prefix" +else + if test -n "$with_libgmp_prefix" && test -z "$with_libgmpxx_prefix"; then + with_libgmpxx_prefix="$with_libgmp_prefix" + fi +fi + + + + + + + { $as_echo "$as_me:$LINENO: checking how to link with libgmp" >&5 +$as_echo_n "checking how to link with libgmp... " >&6; } +if test "${ac_cv_libgmp_libs+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + + + use_additional=yes + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + +# Check whether --with-libgmp-prefix was given. +if test "${with_libgmp_prefix+set}" = set; then + withval=$with_libgmp_prefix; + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi + +fi + + LIBGMP= + LTLIBGMP= + INCGMP= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='gmp ' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIBGMP="${LIBGMP}${LIBGMP:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIBGMP="${LTLIBGMP}${LTLIBGMP:+ }$value" + else + : + fi + else + found_dir= + found_la= + found_so= + found_a= + if test $use_additional = yes; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + found_dir="$additional_libdir" + found_so="$additional_libdir/lib$name.$shlibext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + else + if test -f "$additional_libdir/lib$name.$libext"; then + found_dir="$additional_libdir" + found_a="$additional_libdir/lib$name.$libext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIBGMP; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + found_dir="$dir" + found_so="$dir/lib$name.$shlibext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + else + if test -f "$dir/lib$name.$libext"; then + found_dir="$dir" + found_a="$dir/lib$name.$libext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + LTLIBGMP="${LTLIBGMP}${LTLIBGMP:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then + LIBGMP="${LIBGMP}${LIBGMP:+ }$found_so" + else + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + if test "$hardcode_direct" = yes; then + LIBGMP="${LIBGMP}${LIBGMP:+ }$found_so" + else + if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then + LIBGMP="${LIBGMP}${LIBGMP:+ }$found_so" + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + haveit= + for x in $LDFLAGS $LIBGMP; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIBGMP="${LIBGMP}${LIBGMP:+ }-L$found_dir" + fi + if test "$hardcode_minus_L" != no; then + LIBGMP="${LIBGMP}${LIBGMP:+ }$found_so" + else + LIBGMP="${LIBGMP}${LIBGMP:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + LIBGMP="${LIBGMP}${LIBGMP:+ }$found_a" + else + LIBGMP="${LIBGMP}${LIBGMP:+ }-L$found_dir -l$name" + fi + fi + additional_includedir= + case "$found_dir" in + */lib | */lib/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INCGMP; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + INCGMP="${INCGMP}${INCGMP:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + if test -n "$found_la"; then + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIBGMP; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LIBGMP="${LIBGMP}${LIBGMP:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIBGMP; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LTLIBGMP="${LTLIBGMP}${LTLIBGMP:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + LIBGMP="${LIBGMP}${LIBGMP:+ }$dep" + LTLIBGMP="${LTLIBGMP}${LTLIBGMP:+ }$dep" + ;; + esac + done + fi + else + LIBGMP="${LIBGMP}${LIBGMP:+ }-l$name" + LTLIBGMP="${LTLIBGMP}${LTLIBGMP:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$hardcode_libdir_separator"; then + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBGMP="${LIBGMP}${LIBGMP:+ }$flag" + else + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBGMP="${LIBGMP}${LIBGMP:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + for found_dir in $ltrpathdirs; do + LTLIBGMP="${LTLIBGMP}${LTLIBGMP:+ }-R$found_dir" + done + fi + + ac_cv_libgmp_libs="$LIBGMP" + ac_cv_libgmp_ltlibs="$LTLIBGMP" + ac_cv_libgmp_cppflags="$INCGMP" + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_libgmp_libs" >&5 +$as_echo "$ac_cv_libgmp_libs" >&6; } + LIBGMP="$ac_cv_libgmp_libs" + LTLIBGMP="$ac_cv_libgmp_ltlibs" + INCGMP="$ac_cv_libgmp_cppflags" + + for element in $INCGMP; do + haveit= + for x in $CPPFLAGS; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" + fi + done + + + + HAVE_LIBGMP=yes + + + + + + + + + + { $as_echo "$as_me:$LINENO: checking how to link with libgmpxx" >&5 +$as_echo_n "checking how to link with libgmpxx... " >&6; } +if test "${ac_cv_libgmpxx_libs+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + + + use_additional=yes + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + +# Check whether --with-libgmpxx-prefix was given. +if test "${with_libgmpxx_prefix+set}" = set; then + withval=$with_libgmpxx_prefix; + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi + +fi + + LIBGMPXX= + LTLIBGMPXX= + INCGMPXX= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='gmpxx gmp' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIBGMPXX="${LTLIBGMPXX}${LTLIBGMPXX:+ }$value" + else + : + fi + else + found_dir= + found_la= + found_so= + found_a= + if test $use_additional = yes; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + found_dir="$additional_libdir" + found_so="$additional_libdir/lib$name.$shlibext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + else + if test -f "$additional_libdir/lib$name.$libext"; then + found_dir="$additional_libdir" + found_a="$additional_libdir/lib$name.$libext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIBGMPXX; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + found_dir="$dir" + found_so="$dir/lib$name.$shlibext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + else + if test -f "$dir/lib$name.$libext"; then + found_dir="$dir" + found_a="$dir/lib$name.$libext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + LTLIBGMPXX="${LTLIBGMPXX}${LTLIBGMPXX:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then + LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$found_so" + else + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + if test "$hardcode_direct" = yes; then + LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$found_so" + else + if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then + LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$found_so" + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + haveit= + for x in $LDFLAGS $LIBGMPXX; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }-L$found_dir" + fi + if test "$hardcode_minus_L" != no; then + LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$found_so" + else + LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$found_a" + else + LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }-L$found_dir -l$name" + fi + fi + additional_includedir= + case "$found_dir" in + */lib | */lib/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INCGMPXX; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + INCGMPXX="${INCGMPXX}${INCGMPXX:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + if test -n "$found_la"; then + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIBGMPXX; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIBGMPXX; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LTLIBGMPXX="${LTLIBGMPXX}${LTLIBGMPXX:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$dep" + LTLIBGMPXX="${LTLIBGMPXX}${LTLIBGMPXX:+ }$dep" + ;; + esac + done + fi + else + LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }-l$name" + LTLIBGMPXX="${LTLIBGMPXX}${LTLIBGMPXX:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$hardcode_libdir_separator"; then + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$flag" + else + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + for found_dir in $ltrpathdirs; do + LTLIBGMPXX="${LTLIBGMPXX}${LTLIBGMPXX:+ }-R$found_dir" + done + fi + + ac_cv_libgmpxx_libs="$LIBGMPXX" + ac_cv_libgmpxx_ltlibs="$LTLIBGMPXX" + ac_cv_libgmpxx_cppflags="$INCGMPXX" + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_libgmpxx_libs" >&5 +$as_echo "$ac_cv_libgmpxx_libs" >&6; } + LIBGMPXX="$ac_cv_libgmpxx_libs" + LTLIBGMPXX="$ac_cv_libgmpxx_ltlibs" + INCGMPXX="$ac_cv_libgmpxx_cppflags" + + for element in $INCGMPXX; do + haveit= + for x in $CPPFLAGS; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" + fi + done + + + + HAVE_LIBGMPXX=yes + + + + +ac_save_LIBS="$LIBS" +LIBS="$LIBS $LIBGMPXX" +ac_ext=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:$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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include + +#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 +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + ac_cv_have_gmp=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { $as_echo "$as_me:$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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include +#include +#include +#include + +#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() { + 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 (gmp.h) and library (ligmp.*) version mismatch:\n" + << "header gives " << header_version << ";\n" + << "library gives " << library_version << "." << std::endl; + return 1; + } + + if (sizeof(mp_limb_t)*CHAR_BIT != GMP_LIMB_BITS + || GMP_LIMB_BITS != mp_bits_per_limb) { + std::cerr + << "GMP header (gmp.h) and library (ligmp.*) bits-per-limb mismatch:\n" + << "header gives " << __GMP_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 +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + ac_cv_have_gmp=yes +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 + +( exit $ac_status ) +{ $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ac_cv_have_gmp=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + + +have_gmp=${ac_cv_have_gmp} + +if test x"$ac_cv_have_gmp" = xyes +then + +# 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:$LINENO: checking size of mp_limb_t" >&5 +$as_echo_n "checking size of mp_limb_t... " >&6; } +if test "${ac_cv_sizeof_mp_limb_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (mp_limb_t))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (mp_limb_t))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (mp_limb_t))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (mp_limb_t))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + 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 + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (mp_limb_t))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_mp_limb_t=$ac_lo;; +'') if test "$ac_cv_type_mp_limb_t" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (mp_limb_t) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (mp_limb_t) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_mp_limb_t=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +static long int longval () { return (long int) (sizeof (mp_limb_t)); } +static unsigned long int ulongval () { return (long int) (sizeof (mp_limb_t)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (mp_limb_t))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (mp_limb_t)))) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (mp_limb_t)))) + 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 +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_mp_limb_t=`cat conftest.val` +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 + +( exit $ac_status ) +if test "$ac_cv_type_mp_limb_t" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (mp_limb_t) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (mp_limb_t) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_mp_limb_t=0 + fi +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.val +fi +{ $as_echo "$as_me:$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:$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:$LINENO: result: assuming not" >&5 +$as_echo "assuming not" >&6; } + ac_cv_gmp_supports_exceptions=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include +#include + +static void* +x_malloc(size_t) { + throw std::bad_alloc(); +} + +static void* +x_realloc(void*, size_t, size_t) { + throw std::bad_alloc(); +} + +static void +x_free(void*, size_t) { +} + +int main() { + mp_set_memory_functions(x_malloc, x_realloc, x_free); + try { + mpz_class n("3141592653589793238462643383279502884"); + } + catch (std::bad_alloc&) { + return 0; + } + return 1; +} + +_ACEOF +rm -f conftest$ac_exeext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + ac_cv_gmp_supports_exceptions=yes +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 + +( exit $ac_status ) +{ $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ac_cv_gmp_supports_exceptions=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + + +gmp_supports_exceptions=${ac_cv_gmp_supports_exceptions} +if test x"$gmp_supports_exceptions" = xyes +then + value=1 +else + value=0 +fi + +cat >>confdefs.h <<_ACEOF +#define 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 + +LIBS="$ac_save_LIBS" + +gmp_library_option="$LTLIBGMPXX" + +if test x"$have_gmp" = xno +then + { { $as_echo "$as_me:$LINENO: error: Cannot find GMP version 4.1.3 or higher. +GMP is the GNU Multi-Precision library: +see http://www.swox.com/gmp/ for more information. +When compiling the GMP library, do not forget to enable the C++ interface: +add --enable-cxx to the configuration options." >&5 +$as_echo "$as_me: error: Cannot find GMP version 4.1.3 or higher. +GMP is the GNU Multi-Precision library: +see http://www.swox.com/gmp/ for more information. +When compiling the GMP library, do not forget to enable the C++ interface: +add --enable-cxx to the configuration options." >&2;} + { (exit 1); exit 1; }; } +else + if test x"$have_gmpxx" = xno + then + { { $as_echo "$as_me:$LINENO: error: GMP compiled without enabling the C++ interface. +GMP is the GNU Multi-Precision library: +see http://www.swox.com/gmp/ for more information. +When compiling the GMP library, do not forget to enable the C++ interface: +add --enable-cxx to the configuration options." >&5 +$as_echo "$as_me: error: GMP compiled without enabling the C++ interface. +GMP is the GNU Multi-Precision library: +see http://www.swox.com/gmp/ for more information. +When compiling the GMP library, do not forget to enable the C++ interface: +add --enable-cxx to the configuration options." >&2;} + { (exit 1); exit 1; }; } + fi +fi + +{ $as_echo "$as_me:$LINENO: checking for __mpz_struct._mp_alloc" >&5 +$as_echo_n "checking for __mpz_struct._mp_alloc... " >&6; } +if test "${ac_cv_member___mpz_struct__mp_alloc+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +static __mpz_struct ac_aggr; +if (ac_aggr._mp_alloc) +return 0; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_member___mpz_struct__mp_alloc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +static __mpz_struct ac_aggr; +if (sizeof ac_aggr._mp_alloc) +return 0; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_member___mpz_struct__mp_alloc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_member___mpz_struct__mp_alloc=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 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_member___mpz_struct__mp_alloc" >&5 +$as_echo "$ac_cv_member___mpz_struct__mp_alloc" >&6; } +if test "x$ac_cv_member___mpz_struct__mp_alloc" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE___MPZ_STRUCT__MP_ALLOC 1 +_ACEOF + + +else + gmp_has_changes=yes +fi +{ $as_echo "$as_me:$LINENO: checking for __mpz_struct._mp_size" >&5 +$as_echo_n "checking for __mpz_struct._mp_size... " >&6; } +if test "${ac_cv_member___mpz_struct__mp_size+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +static __mpz_struct ac_aggr; +if (ac_aggr._mp_size) +return 0; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_member___mpz_struct__mp_size=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +static __mpz_struct ac_aggr; +if (sizeof ac_aggr._mp_size) +return 0; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_member___mpz_struct__mp_size=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_member___mpz_struct__mp_size=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 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_member___mpz_struct__mp_size" >&5 +$as_echo "$ac_cv_member___mpz_struct__mp_size" >&6; } +if test "x$ac_cv_member___mpz_struct__mp_size" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE___MPZ_STRUCT__MP_SIZE 1 +_ACEOF + + +else + gmp_has_changes=yes +fi +{ $as_echo "$as_me:$LINENO: checking for __mpz_struct._mp_d" >&5 +$as_echo_n "checking for __mpz_struct._mp_d... " >&6; } +if test "${ac_cv_member___mpz_struct__mp_d+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +static __mpz_struct ac_aggr; +if (ac_aggr._mp_d) +return 0; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_member___mpz_struct__mp_d=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +static __mpz_struct ac_aggr; +if (sizeof ac_aggr._mp_d) +return 0; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_member___mpz_struct__mp_d=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_member___mpz_struct__mp_d=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 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_member___mpz_struct__mp_d" >&5 +$as_echo "$ac_cv_member___mpz_struct__mp_d" >&6; } +if test "x$ac_cv_member___mpz_struct__mp_d" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE___MPZ_STRUCT__MP_D 1 +_ACEOF + + +else + gmp_has_changes=yes +fi + + +if test x"$gmp_has_changed" = xyes +then + { { $as_echo "$as_me:$LINENO: error: GMP HAS CHANGED: +*** The PPL exploits some implementation details of GMP that were current +*** until (at least) version 4.1.4 of GMP. You seem to be using a version +*** where these details have changed. +*** Please report this to ppl-devel@cs.unipr.it." >&5 +$as_echo "$as_me: error: GMP HAS CHANGED: +*** The PPL exploits some implementation details of GMP that were current +*** until (at least) version 4.1.4 of GMP. You seem to be using a version +*** where these details have changed. +*** Please report this to ppl-devel@cs.unipr.it." >&2;} + { (exit 1); exit 1; }; } +fi + +extra_includes="${extra_includes}${extra_includes:+ }${gmp_includes_option}" +extra_libraries="${extra_libraries}${extra_libraries:+ }${gmp_library_option}" + +# setitimer() is a strong requisite for the PWL. + +for ac_func in setitimer +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + have_setitimer=yes +else + have_setitimer=no +fi +done + + +enableval=default +{ $as_echo "$as_me:$LINENO: checking whether to build the Parma Watchdog Library" >&5 +$as_echo_n "checking whether to build the Parma Watchdog Library... " >&6; } +# Check whether --enable-watchdog was given. +if test "${enable_watchdog+set}" = set; then + enableval=$enable_watchdog; +fi + +case "${enableval}" in +yes) + if test x"$have_setitimer" = xyes + then + build_watchdog_library=yes + else + { { $as_echo "$as_me:$LINENO: error: CANNOT BUILD THE WATCHDOG LIBRARY +*** THE SYSTEM DOES NOT PROVIDE THE SETITIMER FUNCTION." >&5 +$as_echo "$as_me: error: CANNOT BUILD THE WATCHDOG LIBRARY +*** THE SYSTEM DOES NOT PROVIDE THE SETITIMER FUNCTION." >&2;} + { (exit 1); exit 1; }; } + fi + ;; +default) + build_watchdog_library=$have_setitimer + ;; +no) + build_watchdog_library=no + ;; +*) + { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-watchdog, needs yes or no" >&5 +$as_echo "$as_me: error: bad value ${enableval} for --enable-watchdog, needs yes or no" >&2;} + { (exit 1); exit 1; }; } + ;; +esac +{ $as_echo "$as_me:$LINENO: result: $build_watchdog_library" >&5 +$as_echo "$build_watchdog_library" >&6; } + if test x"$build_watchdog_library" = xyes; then + BUILD_WATCHDOG_LIBRARY_TRUE= + BUILD_WATCHDOG_LIBRARY_FALSE='#' +else + BUILD_WATCHDOG_LIBRARY_TRUE='#' + BUILD_WATCHDOG_LIBRARY_FALSE= +fi + +if test x"$build_watchdog_library" = xyes +then + +cat >>confdefs.h <<\_ACEOF +#define PPL_WATCHDOG_LIBRARY_ENABLED 1 +_ACEOF + +fi + +# Enabled or not, the Watchdog subdirectory must be configured. + + +subdirs="$subdirs Watchdog" + + +enableval=yes +{ $as_echo "$as_me:$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:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + ;; +no) + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ;; +*) + { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-ppl_lcdd, needs yes or no" >&5 +$as_echo "$as_me: error: bad value ${enableval} for --enable-ppl_lcdd, needs yes or no" >&2;} + { (exit 1); exit 1; }; } + ;; +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:$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:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + ;; +no) + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ;; +*) + { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-ppl_lpsol, needs yes or no" >&5 +$as_echo "$as_me: error: bad value ${enableval} for --enable-ppl_lpsol, needs yes or no" >&2;} + { (exit 1); exit 1; }; } + ;; +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 + + +# 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:$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_echo "$as_me:$LINENO: error: --enable-interfaces needs at least one argument chosen among ${available_interfaces}, none and all" >&5 +$as_echo "$as_me: error: --enable-interfaces needs at least one argument chosen among ${available_interfaces}, none and all" >&2;} + { (exit 1); exit 1; }; } + ;; +xnone | xno) + for interface in ${available_interfaces} + do + eval ${interface}_interface_enabled=no + done + { $as_echo "$as_me:$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:$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_echo "$as_me:$LINENO: error: unknown interface ${interface}: must be one of ${available_interfaces}" >&5 +$as_echo "$as_me: error: unknown interface ${interface}: must be one of ${available_interfaces}" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + done + # Initialize the enabled variable for each interface. + for interface in ${available_interfaces} + do + case " ${required_interfaces} " in + *\ ${interface}\ *) + eval ${interface}_interface_enabled=yes + enabled_interfaces="${enabled_interfaces}${enabled_interfaces:+ }${interface}" + ;; + *) + eval ${interface}_interface_enabled=no + ;; + esac + done + { $as_echo "$as_me:$LINENO: result: ${enabled_interfaces}" >&5 +$as_echo "${enabled_interfaces}" >&6; } + ;; +esac + +# Perl is needed to build the C++ interface. +if test x${cxx_interface_enabled} = xyes \ +&& test x"$PERL" != xno +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 + + +# Perl is needed to build the C interface. +if test x${c_interface_enabled} = xyes \ +&& test x"$PERL" != xno +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 Fedora 9 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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_JAVAC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_JAVAC="$ac_prog" + $as_echo "$as_me:$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:$LINENO: result: $JAVAC" >&5 +$as_echo "$JAVAC" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_JAVAC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_JAVAC="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:$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:$LINENO: result: $JAVAC" >&5 +$as_echo "$JAVAC" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking whether $JAVAC supports enums" >&5 +$as_echo_n "checking whether $JAVAC supports enums... " >&6; } +if test "${ac_cv_javac_supports_enums+set}" = set; then + $as_echo_n "(cached) " >&6 +else + +JAVA_TEST=Test.java +CLASS_TEST=Test.class +cat << \EOF > $JAVA_TEST +/* #line 17863 "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:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } >/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:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_JAVA+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_JAVA="$ac_prog" + $as_echo "$as_me:$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:$LINENO: result: $JAVA" >&5 +$as_echo "$JAVA" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_JAVA+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_JAVA="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:$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:$LINENO: result: $JAVA" >&5 +$as_echo "$JAVA" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_uudecode+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_uudecode="yes" + $as_echo "$as_me:$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:$LINENO: result: $uudecode" >&5 +$as_echo "$uudecode" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test x$uudecode = xyes; then +{ $as_echo "$as_me:$LINENO: checking if uudecode can decode base 64 file" >&5 +$as_echo_n "checking if uudecode can decode base 64 file... " >&6; } +if test "${ac_cv_prog_uudecode_base64+set}" = set; 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: 18054: 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:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_JAVAC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_JAVAC="$ac_prog" + $as_echo "$as_me:$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:$LINENO: result: $JAVAC" >&5 +$as_echo "$JAVAC" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_JAVAC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_JAVAC="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:$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:$LINENO: result: $JAVAC" >&5 +$as_echo "$JAVAC" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking whether $JAVAC supports enums" >&5 +$as_echo_n "checking whether $JAVAC supports enums... " >&6; } +if test "${ac_cv_javac_supports_enums+set}" = set; then + $as_echo_n "(cached) " >&6 +else + +JAVA_TEST=Test.java +CLASS_TEST=Test.class +cat << \EOF > $JAVA_TEST +/* #line 18173 "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:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } >/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:$LINENO: result: $ac_cv_javac_supports_enums" >&5 +$as_echo "$ac_cv_javac_supports_enums" >&6; } + +fi + + fi +fi +{ $as_echo "$as_me:$LINENO: checking if $JAVA works" >&5 +$as_echo_n "checking if $JAVA works... " >&6; } +if test "${ac_cv_prog_java_works+set}" = set; then + $as_echo_n "(cached) " >&6 +else + +JAVA_TEST=Test.java +CLASS_TEST=Test.class +TEST=Test +cat << \EOF > $JAVA_TEST +/* [#]line 18222 "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:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && test -s $CLASS_TEST; then + : + else + echo "configure: failed program was:" >&5 + cat $JAVA_TEST >&5 + { $as_echo "$as_me:$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:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } >/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:$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:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_JAR+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_JAR="$ac_prog" + $as_echo "$as_me:$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:$LINENO: result: $JAR" >&5 +$as_echo "$JAR" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_JAR+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_JAR="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:$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:$LINENO: result: $JAR" >&5 +$as_echo "$JAR" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$JAR" && break +done +test -n "$JAR" || JAR="no" + +fi +test "x$JAR" = xno + + +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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_JAVAH+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_JAVAH="$ac_prog" + $as_echo "$as_me:$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:$LINENO: result: $JAVAH" >&5 +$as_echo "$JAVAH" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_JAVAH+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_JAVAH="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:$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:$LINENO: result: $JAVAH" >&5 +$as_echo "$JAVAH" >&6; } +else + { $as_echo "$as_me:$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 >conftest.$ac_ext <<_ACEOF +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + + 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 >conftest.$ac_ext <<_ACEOF +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + CPPFLAGS="$ac_save_CPPFLAGS" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { $as_echo "$as_me:$LINENO: WARNING: unable to include " >&5 +$as_echo "$as_me: WARNING: unable to include " >&2;} + JAVAH=no +fi + +rm -f conftest.err conftest.$ac_ext + CPPFLAGS="$ac_save_CPPFLAGS" +fi + +rm -f conftest.err conftest.$ac_ext +fi + + 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:$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:$LINENO: result: assuming it cannot" >&5 +$as_echo "assuming it cannot" >&6; } +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + + int + main() { + if (sizeof(jlong) >= sizeof(void*)) + return 0; + else + return 1; + } + +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_jlong_can_contain_pointers=yes + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +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 + +( exit $ac_status ) +ac_jlong_can_contain_pointers=no + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext 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 + # Check for the bytecode compiler. + # 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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_OCAMLC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OCAMLC="ocamlc" + $as_echo "$as_me:$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:$LINENO: result: $OCAMLC" >&5 +$as_echo "$OCAMLC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + ocamlc_gmp="no" + if test x"$OCAMLC" = xocamlc + then + ocamlc_root=`ocamlc -where` + # Check for the bytecode version of ML GMP. + { $as_echo "$as_me:$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 ${ocamlc_root}/gmp/gmp.cma ) \ + || test -f ${mlgmp_dir}/gmp.cma; + then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + ocamlc_gmp="yes" + else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ocamlc_gmp="no" + fi + fi + # Check for the native compiler. + # 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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_OCAMLOPT+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OCAMLOPT="ocamlopt" + $as_echo "$as_me:$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:$LINENO: result: $OCAMLOPT" >&5 +$as_echo "$OCAMLOPT" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + ocamlopt_gmp="no" + if test x"$OCAMLOPT" = xocamlopt + then + ocamlopt_root=`ocamlopt -where` + # Check for the native version of ML GMP. + { $as_echo "$as_me:$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:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + ocamlopt_gmp="yes" + else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ocamlopt_gmp="no" + 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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_ciao_prolog+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_ciao_prolog="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:$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:$LINENO: result: $ciao_prolog" >&5 +$as_echo "$ciao_prolog" >&6; } +else + { $as_echo "$as_me:$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 + + if test "${ac_cv_header_ciao_prolog_h+set}" = set; then + { $as_echo "$as_me:$LINENO: checking for ciao_prolog.h" >&5 +$as_echo_n "checking for ciao_prolog.h... " >&6; } +if test "${ac_cv_header_ciao_prolog_h+set}" = set; then + $as_echo_n "(cached) " >&6 +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_ciao_prolog_h" >&5 +$as_echo "$ac_cv_header_ciao_prolog_h" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking ciao_prolog.h usability" >&5 +$as_echo_n "checking ciao_prolog.h usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking ciao_prolog.h presence" >&5 +$as_echo_n "checking ciao_prolog.h presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$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:$LINENO: WARNING: ciao_prolog.h: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: ciao_prolog.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: ciao_prolog.h: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: ciao_prolog.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: ciao_prolog.h: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: ciao_prolog.h: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: ciao_prolog.h: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: ciao_prolog.h: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: ciao_prolog.h: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: ciao_prolog.h: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: ciao_prolog.h: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: ciao_prolog.h: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: ciao_prolog.h: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: ciao_prolog.h: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: ciao_prolog.h: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: ciao_prolog.h: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ------------------------------------ ## +## Report this to ppl-devel@cs.unipr.it ## +## ------------------------------------ ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for ciao_prolog.h" >&5 +$as_echo_n "checking for ciao_prolog.h... " >&6; } +if test "${ac_cv_header_ciao_prolog_h+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_header_ciao_prolog_h=$ac_header_preproc +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_ciao_prolog_h" >&5 +$as_echo "$ac_cv_header_ciao_prolog_h" >&6; } + +fi +if test "x$ac_cv_header_ciao_prolog_h" = x""yes; then + { $as_echo "$as_me:$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 >conftest.$ac_ext <<_ACEOF +#include + +int +main() { + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ciao_prolog="" + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_GNU_PROLOG+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_GNU_PROLOG="gprolog" + $as_echo "$as_me:$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:$LINENO: result: $GNU_PROLOG" >&5 +$as_echo "$GNU_PROLOG" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test x"$GNU_PROLOG" = xgprolog + then + if test "${ac_cv_header_gprolog_h+set}" = set; then + { $as_echo "$as_me:$LINENO: checking for gprolog.h" >&5 +$as_echo_n "checking for gprolog.h... " >&6; } +if test "${ac_cv_header_gprolog_h+set}" = set; then + $as_echo_n "(cached) " >&6 +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_gprolog_h" >&5 +$as_echo "$ac_cv_header_gprolog_h" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking gprolog.h usability" >&5 +$as_echo_n "checking gprolog.h usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking gprolog.h presence" >&5 +$as_echo_n "checking gprolog.h presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$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:$LINENO: WARNING: gprolog.h: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: gprolog.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: gprolog.h: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: gprolog.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: gprolog.h: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: gprolog.h: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: gprolog.h: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: gprolog.h: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: gprolog.h: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: gprolog.h: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: gprolog.h: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: gprolog.h: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: gprolog.h: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: gprolog.h: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: gprolog.h: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: gprolog.h: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ------------------------------------ ## +## Report this to ppl-devel@cs.unipr.it ## +## ------------------------------------ ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for gprolog.h" >&5 +$as_echo_n "checking for gprolog.h... " >&6; } +if test "${ac_cv_header_gprolog_h+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_header_gprolog_h=$ac_header_preproc +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_gprolog_h" >&5 +$as_echo "$ac_cv_header_gprolog_h" >&6; } + +fi +if test "x$ac_cv_header_gprolog_h" = x""yes; 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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_sicstus_prolog+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_sicstus_prolog="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:$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:$LINENO: result: $sicstus_prolog" >&5 +$as_echo "$sicstus_prolog" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test x$sicstus_prolog != x +then + sicstus_prolog_base=$(dirname $($sicstus_prolog -f --goal "use_module(library(system)), environ('SP_APP_DIR', X), write(X), nl, halt.")) + SICSTUS_PROLOG_INCLUDE_OPTIONS="-I${sicstus_prolog_base}/include" + ac_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $SICSTUS_PROLOG_INCLUDE_OPTIONS" + ac_ext=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. + if test "${ac_cv_header_sicstus_sicstus_h+set}" = set; then + { $as_echo "$as_me:$LINENO: checking for sicstus/sicstus.h" >&5 +$as_echo_n "checking for sicstus/sicstus.h... " >&6; } +if test "${ac_cv_header_sicstus_sicstus_h+set}" = set; then + $as_echo_n "(cached) " >&6 +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_sicstus_sicstus_h" >&5 +$as_echo "$ac_cv_header_sicstus_sicstus_h" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking sicstus/sicstus.h usability" >&5 +$as_echo_n "checking sicstus/sicstus.h usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking sicstus/sicstus.h presence" >&5 +$as_echo_n "checking sicstus/sicstus.h presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$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:$LINENO: WARNING: sicstus/sicstus.h: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: sicstus/sicstus.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: sicstus/sicstus.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: sicstus/sicstus.h: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: sicstus/sicstus.h: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: sicstus/sicstus.h: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: sicstus/sicstus.h: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: sicstus/sicstus.h: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: sicstus/sicstus.h: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ------------------------------------ ## +## Report this to ppl-devel@cs.unipr.it ## +## ------------------------------------ ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for sicstus/sicstus.h" >&5 +$as_echo_n "checking for sicstus/sicstus.h... " >&6; } +if test "${ac_cv_header_sicstus_sicstus_h+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_header_sicstus_sicstus_h=$ac_header_preproc +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_sicstus_sicstus_h" >&5 +$as_echo "$ac_cv_header_sicstus_sicstus_h" >&6; } + +fi +if test "x$ac_cv_header_sicstus_sicstus_h" = x""yes; then + { $as_echo "$as_me:$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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + #include + #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:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +else + sicstus_prolog="" + { $as_echo "$as_me:$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 "swi-prolog", so it can be a program name with args. +set dummy swi-prolog; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_swi_prolog+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_swi_prolog="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:$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:$LINENO: result: $swi_prolog" >&5 +$as_echo "$swi_prolog" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test -z $swi_prolog +then + # Extract the first word of "swipl", so it can be a program name with args. +set dummy swipl; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_swi_prolog+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_swi_prolog="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:$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:$LINENO: result: $swi_prolog" >&5 +$as_echo "$swi_prolog" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test -z $swi_prolog + then + # Extract the first word of "pl", so it can be a program name with args. +set dummy pl; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_swi_prolog+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_swi_prolog="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:$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:$LINENO: result: $swi_prolog" >&5 +$as_echo "$swi_prolog" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test x$swi_prolog != x +then + swi_prolog_base=`$swi_prolog -dump-runtime-variables | grep PLBASE= | sed 's/PLBASE="\(.*\)";/\1/'` + swi_prolog_version=`$swi_prolog -dump-runtime-variables | grep PLVERSION= | sed 's/PLVERSION="\(.*\)";/\1/'` + swi_prolog_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/'` + + + # 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" + SWI_PROLOG_LD_OPTIONS="-L${swi_prolog_base}/lib/${swi_prolog_arch} ${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. + if test "${ac_cv_header_SWI_Prolog_h+set}" = set; then + { $as_echo "$as_me:$LINENO: checking for SWI-Prolog.h" >&5 +$as_echo_n "checking for SWI-Prolog.h... " >&6; } +if test "${ac_cv_header_SWI_Prolog_h+set}" = set; then + $as_echo_n "(cached) " >&6 +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_SWI_Prolog_h" >&5 +$as_echo "$ac_cv_header_SWI_Prolog_h" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking SWI-Prolog.h usability" >&5 +$as_echo_n "checking SWI-Prolog.h usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking SWI-Prolog.h presence" >&5 +$as_echo_n "checking SWI-Prolog.h presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$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:$LINENO: WARNING: SWI-Prolog.h: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: SWI-Prolog.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: SWI-Prolog.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: SWI-Prolog.h: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: SWI-Prolog.h: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: SWI-Prolog.h: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: SWI-Prolog.h: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: SWI-Prolog.h: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: SWI-Prolog.h: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ------------------------------------ ## +## Report this to ppl-devel@cs.unipr.it ## +## ------------------------------------ ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for SWI-Prolog.h" >&5 +$as_echo_n "checking for SWI-Prolog.h... " >&6; } +if test "${ac_cv_header_SWI_Prolog_h+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_header_SWI_Prolog_h=$ac_header_preproc +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_SWI_Prolog_h" >&5 +$as_echo "$ac_cv_header_SWI_Prolog_h" >&6; } + +fi +if test "x$ac_cv_header_SWI_Prolog_h" = x""yes; then + { $as_echo "$as_me:$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 >conftest.$ac_ext <<_ACEOF +#include + +int +main() { +#if !defined(PLVERSION) || PLVERSION < 50600 + choke me +#endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + swi_prolog="" + { $as_echo "$as_me:$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" + + + +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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_xsb_prolog+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_xsb_prolog="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:$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:$LINENO: result: $xsb_prolog" >&5 +$as_echo "$xsb_prolog" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_YAP_PROLOG+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$YAP_PROLOG"; then + ac_cv_prog_YAP_PROLOG="$YAP_PROLOG" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_YAP_PROLOG="yap" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +YAP_PROLOG=$ac_cv_prog_YAP_PROLOG +if test -n "$YAP_PROLOG"; then + { $as_echo "$as_me:$LINENO: result: $YAP_PROLOG" >&5 +$as_echo "$YAP_PROLOG" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test x"$YAP_PROLOG" = xyap + then + if test "${ac_cv_header_Yap_c_interface_h+set}" = set; then + { $as_echo "$as_me:$LINENO: checking for Yap/c_interface.h" >&5 +$as_echo_n "checking for Yap/c_interface.h... " >&6; } +if test "${ac_cv_header_Yap_c_interface_h+set}" = set; then + $as_echo_n "(cached) " >&6 +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_Yap_c_interface_h" >&5 +$as_echo "$ac_cv_header_Yap_c_interface_h" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking Yap/c_interface.h usability" >&5 +$as_echo_n "checking Yap/c_interface.h usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking Yap/c_interface.h presence" >&5 +$as_echo_n "checking Yap/c_interface.h presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$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:$LINENO: WARNING: Yap/c_interface.h: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: Yap/c_interface.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: Yap/c_interface.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: Yap/c_interface.h: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: Yap/c_interface.h: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: Yap/c_interface.h: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: Yap/c_interface.h: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: Yap/c_interface.h: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: Yap/c_interface.h: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ------------------------------------ ## +## Report this to ppl-devel@cs.unipr.it ## +## ------------------------------------ ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for Yap/c_interface.h" >&5 +$as_echo_n "checking for Yap/c_interface.h... " >&6; } +if test "${ac_cv_header_Yap_c_interface_h+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_header_Yap_c_interface_h=$ac_header_preproc +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_Yap_c_interface_h" >&5 +$as_echo "$ac_cv_header_Yap_c_interface_h" >&6; } + +fi +if test "x$ac_cv_header_Yap_c_interface_h" = x""yes; then + : +else + YAP_PROLOG="" +fi + + + fi +fi + +if test x${yap_prolog_interface_enabled} = xyes \ +&& test x$YAP_PROLOG = xyap +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 *any* Prolog system has 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:$LINENO: checking for GNU M4 that supports accurate traces" >&5 +$as_echo_n "checking for GNU M4 that supports accurate traces... " >&6; } +if test "${ac_cv_path_M4+set}" = set; 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" + { test -f "$ac_path_M4" && $as_test_x "$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(,mac,bug)d'nl + test -z "`$ac_path_M4 -F conftest.m4f &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_echo "$as_me:$LINENO: error: no acceptable m4 could be found in \$PATH. +GNU M4 1.4.5 or later is required; 1.4.11 is recommended" >&5 +$as_echo "$as_me: error: no acceptable m4 could be found in \$PATH. +GNU M4 1.4.5 or later is required; 1.4.11 is recommended" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_M4=$M4 +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_M4" >&5 +$as_echo "$ac_cv_path_M4" >&6; } + M4=$ac_cv_path_M4 + { $as_echo "$as_me:$LINENO: checking how m4 supports trace files" >&5 +$as_echo_n "checking how m4 supports trace files... " >&6; } +if test "${ac_cv_prog_gnu_m4_debugfile+set}" = set; 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:$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 @ BD_Shape" +di="${di} @ Octagonal_Shape @ Octagonal_Shape" +di="${di} @ Constraints_Product" +di="${di} @ Pointset_Powerset" +di="${di} @ Pointset_Powerset" +if test $ac_supported_double = 1 +then + di="${di} @ Double_Box @ BD_Shape @ Octagonal_Shape" +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 @ BD_Shape" +ai="${ai} @ BD_Shape @ BD_Shape" +ai="${ai} @ BD_Shape @ BD_Shape" +ai="${ai} @ Octagonal_Shape @ Octagonal_Shape" +ai="${ai} @ Octagonal_Shape @ Octagonal_Shape" +ai="${ai} @ Octagonal_Shape @ Octagonal_Shape" +ai="${ai} @ Polyhedron @ Grid" +ai="${ai} @ Pointset_Powerset @ Pointset_Powerset" +ai="${ai} @ Pointset_Powerset @ Pointset_Powerset" +ai="${ai} @ Pointset_Powerset @ Pointset_Powerset" +ai="${ai} @ Pointset_Powerset @ Pointset_Powerset" +ai="${ai} @ Pointset_Powerset @ Pointset_Powerset" +ai="${ai} @ Pointset_Powerset >" +ai="${ai} @ Pointset_Powerset >" +ai="${ai} @ Pointset_Powerset >" +ai="${ai} @ Pointset_Powerset >" +ai="${ai} @ Pointset_Powerset >" +ai="${ai} @ Pointset_Powerset >" +ai="${ai} @ Pointset_Powerset >" +ai="${ai} @ Pointset_Powerset >" +ai="${ai} @ Pointset_Powerset >" +ai="${ai} @ Pointset_Powerset >" +ai="${ai} @ Pointset_Powerset >" +ai="${ai} @ Pointset_Powerset >" +ai="${ai} @ Pointset_Powerset" +ai="${ai} @ Pointset_Powerset" +ai="${ai} @ Pointset_Powerset" +ai="${ai} @ Constraints_Product" +ai="${ai} @ Constraints_Product" +ai="${ai} @ Constraints_Product" +ai="${ai} @ Constraints_Product" +if test $ac_supported_float = 1 +then + ai="${ai} @ Float_Box @ BD_Shape" + ai="${ai} @ Octagonal_Shape" + ai="${ai} @ Pointset_Powerset" + ai="${ai} @ Pointset_Powerset >" + ai="${ai} @ Pointset_Powerset >" +fi +if test $ac_supported_double = 1 +then + ai="${ai} @ Double_Box @ BD_Shape" + ai="${ai} @ Octagonal_Shape" + ai="${ai} @ Pointset_Powerset" + ai="${ai} @ Pointset_Powerset >" + ai="${ai} @ Pointset_Powerset >" +fi +if test $ac_supported_long_double = 1 +then + ai="${ai} @ Long_Double_Box @ BD_Shape" + ai="${ai} @ Octagonal_Shape" + ai="${ai} @ Pointset_Powerset" + ai="${ai} @ Pointset_Powerset >" + ai="${ai} @ Pointset_Powerset >" +fi +available_instantiations=${ai} + +enableval=not_specified +{ $as_echo "$as_me:$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_echo "$as_me:$LINENO: 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}" >&5 +$as_echo "$as_me: 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}" >&2;} + { (exit 1); exit 1; }; } + ;; +xno | xnone) + enableval= + { $as_echo "$as_me:$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/>>/> >/g' -e 's/^[ ]//g' -e 's/[ ]$//g'` + # Check the specified instantiations for validity. + ac_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -I${srcdir}" + old_IFS="${IFS}" + IFS=@ + set -- ${required_instantiations} + IFS="${old_IFS}" + for instantiation + do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include "instchk.hh" + +using namespace Parma_Polyhedra_Library; + +bool valid = ${instantiation}::valid_instantiation(); + +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + valid_instantiation=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + valid_instantiation=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test x${valid_instantiation} != xyes + then + { { $as_echo "$as_me:$LINENO: error: invalid instantiation ${instantiation}" >&5 +$as_echo "$as_me: error: invalid instantiation ${instantiation}" >&2;} + { (exit 1); exit 1; }; } + 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@Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron@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@Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron@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@C_Polyhedron@NNC_Polyhedron/g' -e 's/@Polyhedron/@Polyhedron@C_Polyhedron@NNC_Polyhedron/g' -e 's/@Pointset_Powerset_Polyhedron/@Pointset_Powerset_C_Polyhedron@Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron@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@Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron@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:$LINENO: result: ${required_instantiations}" >&5 +$as_echo "${required_instantiations}" >&6; } + ;; +esac + +enableval=no +{ $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_VALGRIND+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_VALGRIND="valgrind" + $as_echo "$as_me:$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:$LINENO: result: $VALGRIND" >&5 +$as_echo "$VALGRIND" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test x"$VALGRIND" = xvalgrind + then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + enable_valgrind_tests=yes + else + { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-valgrind-tests, cannot find Valgrind" >&5 +$as_echo "$as_me: error: bad value ${enableval} for --enable-valgrind-tests, cannot find Valgrind" >&2;} + { (exit 1); exit 1; }; } + fi + ;; +no) + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + enable_valgrind_tests=no + ;; +*) + { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-valgrind-tests, needs yes or no" >&5 +$as_echo "$as_me: error: bad value ${enableval} for --enable-valgrind-tests, needs yes or no" >&2;} + { (exit 1); exit 1; }; } + ;; +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:$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:$LINENO: result: thorough" >&5 +$as_echo "thorough" >&6; } + ;; +quick) + { $as_echo "$as_me:$LINENO: result: quick" >&5 +$as_echo "quick" >&6; } + ;; +*) + { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-check, needs thorough or quick" >&5 +$as_echo "$as_me: error: bad value ${enableval} for --enable-check, needs thorough or quick" >&2;} + { (exit 1); exit 1; }; } + ;; +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:$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.2.6' +macro_revision='1.3012' + + + + + + + + + + + + + +ltmain="$ac_aux_dir/ltmain.sh" + +{ $as_echo "$as_me:$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 test "${ac_cv_path_SED+set}" = set; 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 + $as_unset ac_script || 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" + { test -f "$ac_path_SED" && $as_test_x "$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 + ac_count=`expr $ac_count + 1` + 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_echo "$as_me:$LINENO: error: no acceptable sed could be found in \$PATH" >&5 +$as_echo "$as_me: error: no acceptable sed could be found in \$PATH" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:$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:$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:$LINENO: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if test "${lt_cv_path_LD+set}" = set; 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 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && { { $as_echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +$as_echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +{ $as_echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if test "${lt_cv_prog_gnu_ld+set}" = set; 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 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:$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 test "${lt_cv_path_NM+set}" = set; 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:$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 "$ac_tool_prefix"; then + for ac_prog in "dumpbin -symbols" "link -dump -symbols" + 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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_DUMPBIN+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:$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:$LINENO: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:$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 -symbols" "link -dump -symbols" +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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:$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:$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 + + + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:$LINENO: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if test "${lt_cv_nm_interface+set}" = set; 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:21012: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:21015: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:21018: 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:$LINENO: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +{ $as_echo "$as_me:$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:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if test "${lt_cv_sys_max_cmd_len+set}" = set; 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; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + 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"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ + = "XX$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:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:$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:$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"}, \ + = c,a/b,, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +{ $as_echo "$as_me:$LINENO: result: $xsi_shell" >&5 +$as_echo "$xsi_shell" >&6; } + + +{ $as_echo "$as_me:$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:$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:$LINENO: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if test "${lt_cv_ld_reload_flag+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:$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 + 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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_OBJDUMP+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:$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:$LINENO: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:$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:$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:$LINENO: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if test "${lt_cv_deplibs_check_method+set}" = set; 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. + if ( 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 + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + 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 + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +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 Linux ELF. +linux* | k*bsd*-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:$LINENO: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AR+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + $as_echo "$as_me:$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:$LINENO: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_AR+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_AR="ar" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$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 +else + AR="$ac_cv_prog_AR" +fi + +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru + + + + + + + + + + + +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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_STRIP+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:$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:$LINENO: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:$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:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_RANLIB+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:$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:$LINENO: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:$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:$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 \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# 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:$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 test "${lt_cv_sys_global_symbol_pipe+set}" = set; 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};"\ +" /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 + + # 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:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 + (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +#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. */ +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_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -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:$LINENO: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:$LINENO: result: ok" >&5 +$as_echo "ok" >&6; } +fi + + + + + + + + + + + + + + + + + + + + + + +# 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:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line 22223 "configure"' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*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:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*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:$LINENO: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if test "${lt_cv_cc_needs_belf+set}" = set; 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + lt_cv_cc_needs_belf=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + lt_cv_cc_needs_belf=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + 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:$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 + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + 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" + + + 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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_DSYMUTIL+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:$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:$LINENO: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:$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:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_NMEDIT+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:$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:$LINENO: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:$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:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_LIPO+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:$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:$LINENO: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:$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:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_OTOOL+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:$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:$LINENO: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:$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:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_OTOOL64+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:$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:$LINENO: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:$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:$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:$LINENO: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if test "${lt_cv_apple_cc_single_mod+set}" = set; 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 test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 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:$LINENO: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + { $as_echo "$as_me:$LINENO: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if test "${lt_cv_ld_exported_symbols_list+set}" = set; 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + lt_cv_ld_exported_symbols_list=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + lt_cv_ld_exported_symbols_list=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&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" != ":"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + + +for ac_header in dlfcn.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + eval "$as_ac_Header=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + +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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CXX+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:$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:$LINENO: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:$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:$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:$LINENO: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +{ $as_echo "$as_me:$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 test "${ac_cv_cxx_compiler_gnu+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + 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:$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:$LINENO: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if test "${ac_cv_prog_cxx_g+set}" = set; 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cxx_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CXXFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cxx_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +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:$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=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 + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; 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'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:$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 + + +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:$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 test "${ac_cv_prog_CXXCPP+set}" = set; 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 to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:$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 to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +_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 + +else + _lt_caught_CXX_error=yes +fi + + + + +# 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; pic_mode="$withval" +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:$LINENO: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if test "${lt_cv_objdir+set}" = set; 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:$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 + +# Sed substitution that helps us do robust quoting. It backslashifies +# 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' + +# 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 "X$cc_temp" | $Xsed -e 's%.*/%%' -e "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:$LINENO: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if test "${lt_cv_path_MAGIC_CMD+set}" = set; 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@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:$LINENO: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if test "${lt_cv_path_MAGIC_CMD+set}" = set; 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@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:$LINENO: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:$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 + lt_prog_compiler_no_builtin_flag=' -fno-builtin' + + { $as_echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; 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:24309: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:24313: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:$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= + +{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + amigaos*) + 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' + ;; + + 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 + 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) + 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' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl*) + # IBM XL C 8.0/Fortran 10.1 on PPC + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Sun\ F*) + # 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='' + ;; + 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*) + 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:$LINENO: result: $lt_prog_compiler_pic" >&5 +$as_echo "$lt_prog_compiler_pic" >&6; } + + + + + + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:$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 test "${lt_cv_prog_compiler_pic_works+set}" = set; 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:24648: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:24652: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:$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:$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 test "${lt_cv_prog_compiler_static_works+set}" = set; 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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_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:$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:$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 test "${lt_cv_prog_compiler_c_o+set}" = set; 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:24753: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:24757: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:$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 test "${lt_cv_prog_compiler_c_o+set}" = set; 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:24808: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:24812: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:$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:$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:$LINENO: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:$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:$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_flag_spec_ld= + 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 + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + 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.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +_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 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' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + 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) + 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= + 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; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + xl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + 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; $ECHO \"$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*) + # 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= + hardcode_libdir_flag_spec_ld='-rpath $libdir' + archive_cmds='$LD -shared $libobjs $deplibs $compiler_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 $compiler_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 $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_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 $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # 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 $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = no; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + 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 + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|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. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +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 "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +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 "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + 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. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes=yes + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + whole_archive_flag_spec='' + 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=echo + 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 + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld='+b $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 -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_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 $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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. + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + cat >conftest.$ac_ext <<_ACEOF +int foo(void) {} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -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" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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" && $ECHO "X-set_version $verstring" | $Xsed` -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} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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" && $ECHO "X-set_version $verstring" | $Xsed` -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 "X-set_version $verstring" | $Xsed` -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 ${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 ${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:$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:$LINENO: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc=no + else + archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 +$as_echo "$archive_cmds_need_lc" >&6; } + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:$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 + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` + else + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # 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; } +}'` + sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` +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 + 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 + 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.so + # instead of lib.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=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) + 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="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${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 + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[3-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + 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 + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then + shlibpath_overrides_runpath=yes +fi + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + + # 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;/^$/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 + 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 + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + 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 + 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 + 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:$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:$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:$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:$LINENO: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any 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 +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_dl_dlopen=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dl_dlopen=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + { $as_echo "$as_me:$LINENO: checking for shl_load" >&5 +$as_echo_n "checking for shl_load... " >&6; } +if test "${ac_cv_func_shl_load+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define shl_load to an innocuous variant, in case declares shl_load. + For example, HP-UX 11i declares gettimeofday. */ +#define shl_load innocuous_shl_load + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shl_load (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef shl_load + +/* 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 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_shl_load || defined __stub___shl_load +choke me +#endif + +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_func_shl_load=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_shl_load=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 +$as_echo "$ac_cv_func_shl_load" >&6; } +if test "x$ac_cv_func_shl_load" = x""yes; then + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if test "${ac_cv_lib_dld_shl_load+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any 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 +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_dld_shl_load=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dld_shl_load=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$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" = x""yes; then + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + { $as_echo "$as_me:$LINENO: checking for dlopen" >&5 +$as_echo_n "checking for dlopen... " >&6; } +if test "${ac_cv_func_dlopen+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define dlopen to an innocuous variant, in case declares dlopen. + For example, HP-UX 11i declares gettimeofday. */ +#define dlopen innocuous_dlopen + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char dlopen (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef dlopen + +/* 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 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_dlopen || defined __stub___dlopen +choke me +#endif + +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_func_dlopen=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_dlopen=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 +$as_echo "$ac_cv_func_dlopen" >&6; } +if test "x$ac_cv_func_dlopen" = x""yes; then + lt_cv_dlopen="dlopen" +else + { $as_echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any 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 +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_dl_dlopen=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dl_dlopen=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { $as_echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if test "${ac_cv_lib_svld_dlopen+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any 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 +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_svld_dlopen=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_svld_dlopen=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = x""yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { $as_echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if test "${ac_cv_lib_dld_dld_link+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any 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 +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_dld_dld_link=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dld_dld_link=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$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" = x""yes; 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:$LINENO: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if test "${lt_cv_dlopen_self+set}" = set; 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 27608 "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#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 + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:$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:$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 test "${lt_cv_dlopen_self_static+set}" = set; 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 27704 "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#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 + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:$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:$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:$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:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report which library types will actually be built + { $as_echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:$LINENO: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:$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:$LINENO: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:$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:$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" + + +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_flag_spec_ld_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 +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_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + compiler=$CC + compiler_CXX=$CC + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + + 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:$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:$LINENO: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if test "${lt_cv_path_LD+set}" = set; 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 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && { { $as_echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +$as_echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +{ $as_echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if test "${lt_cv_prog_gnu_ld+set}" = set; 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 &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 -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { $as_echo "$as_me:$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. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +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 "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +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 "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + archive_cmds_need_lc_CXX=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach 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*) + # _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' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + whole_archive_flag_spec_CXX='' + link_all_deplibs_CXX=yes + 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=echo + 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 + ;; + + freebsd[12]*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + ld_shlibs_CXX=no + ;; + + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + gnu*) + ;; + + hpux9*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + 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; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + 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" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -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) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + + 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 | $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 | $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 | $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 | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 will 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; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + xl*) + # 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; $ECHO \"$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='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + 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=echo + 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" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -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" && $ECHO "X-set_version $verstring" | $Xsed` -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 "X-set_version $verstring" | $Xsed` -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=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + 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" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${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 "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The 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='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + no_undefined_flag_CXX=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + fi + + hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + 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' + ;; + *) + 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:$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 + +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p in + -L* | -R*) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX="${prev}${p}" + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX="${prev}${p}" + else + postdeps_CXX="${postdeps_CXX} ${prev}${p}" + fi + fi + ;; + + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX="$p" + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX="$p" + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$RM -f confest.$objext + +# PORTME: override above test on systems where it is broken +case $host_os in +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*) + # 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= + +{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + ;; + + amigaos*) + 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= + ;; + 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 + ;; + 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) + 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*) + # IBM XL 8.0 on PPC + 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*) + # 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:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 +$as_echo "$lt_prog_compiler_pic_CXX" >&6; } + + + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { $as_echo "$as_me:$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 test "${lt_cv_prog_compiler_pic_works_CXX+set}" = set; 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:29724: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:29728: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:$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:$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 test "${lt_cv_prog_compiler_static_works_CXX+set}" = set; 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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_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:$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:$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 test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; 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:29823: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:29827: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + { $as_echo "$as_me:$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 test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; 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:29875: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:29879: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:$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:$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:$LINENO: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:$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:$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' + 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 + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + +{ $as_echo "$as_me:$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:$LINENO: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_CXX=no + else + archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 +$as_echo "$archive_cmds_need_lc_CXX" >&6; } + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:$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 + 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 + 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.so + # instead of lib.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=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) + 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="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${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 + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[3-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + 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 + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then + shlibpath_overrides_runpath=yes +fi + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + + # 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;/^$/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 + 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 + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + 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 + 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 + 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:$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:$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:$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 + 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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_MD5SUM+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_MD5SUM="md5sum" + $as_echo "$as_me:$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:$LINENO: result: $MD5SUM" >&5 +$as_echo "$MD5SUM" >&6; } +else + { $as_echo "$as_me:$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:$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:$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` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$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:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ------------------------------------ ## +## Report this to ppl-devel@cs.unipr.it ## +## ------------------------------------ ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = 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" + { $as_echo "$as_me:$LINENO: checking whether lib_set_print_hook is declared" >&5 +$as_echo_n "checking whether lib_set_print_hook is declared... " >&6; } +if test "${ac_cv_have_decl_lib_set_print_hook+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#if defined(HAVE_GLPK_GLPK_H) +#include +#elif defined(HAVE_GLPK_H) +#include +#endif + + +int +main () +{ +#ifndef lib_set_print_hook + (void) lib_set_print_hook; +#endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_lib_set_print_hook=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_lib_set_print_hook=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_lib_set_print_hook" >&5 +$as_echo "$ac_cv_have_decl_lib_set_print_hook" >&6; } +if test "x$ac_cv_have_decl_lib_set_print_hook" = x""yes; then + +cat >>confdefs.h <<\_ACEOF +#define PPL_GLPK_HAS_LIB_SET_PRINT_HOOK 1 +_ACEOF + +fi + + { $as_echo "$as_me:$LINENO: checking for _glp_lib_print_hook" >&5 +$as_echo_n "checking for _glp_lib_print_hook... " >&6; } +if test "${ac_cv_func__glp_lib_print_hook+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define _glp_lib_print_hook to an innocuous variant, in case declares _glp_lib_print_hook. + For example, HP-UX 11i declares gettimeofday. */ +#define _glp_lib_print_hook innocuous__glp_lib_print_hook + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char _glp_lib_print_hook (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef _glp_lib_print_hook + +/* 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 _glp_lib_print_hook (); +/* 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__glp_lib_print_hook || defined __stub____glp_lib_print_hook +choke me +#endif + +int +main () +{ +return _glp_lib_print_hook (); + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_func__glp_lib_print_hook=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func__glp_lib_print_hook=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_func__glp_lib_print_hook" >&5 +$as_echo "$ac_cv_func__glp_lib_print_hook" >&6; } +if test "x$ac_cv_func__glp_lib_print_hook" = x""yes; then + +cat >>confdefs.h <<\_ACEOF +#define PPL_GLPK_HAS__GLP_LIB_PRINT_HOOK 1 +_ACEOF + +fi + + { $as_echo "$as_me:$LINENO: checking whether glp_term_out is declared" >&5 +$as_echo_n "checking whether glp_term_out is declared... " >&6; } +if test "${ac_cv_have_decl_glp_term_out+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#if defined(HAVE_GLPK_GLPK_H) +#include +#elif defined(HAVE_GLPK_H) +#include +#endif + + +int +main () +{ +#ifndef glp_term_out + (void) glp_term_out; +#endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_glp_term_out=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_glp_term_out=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_glp_term_out" >&5 +$as_echo "$ac_cv_have_decl_glp_term_out" >&6; } +if test "x$ac_cv_have_decl_glp_term_out" = x""yes; then + +cat >>confdefs.h <<\_ACEOF +#define PPL_GLPK_HAS_GLP_TERM_OUT 1 +_ACEOF + +fi + + { $as_echo "$as_me:$LINENO: checking whether glp_term_hook is declared" >&5 +$as_echo_n "checking whether glp_term_hook is declared... " >&6; } +if test "${ac_cv_have_decl_glp_term_hook+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#if defined(HAVE_GLPK_GLPK_H) +#include +#elif defined(HAVE_GLPK_H) +#include +#endif + + +int +main () +{ +#ifndef glp_term_hook + (void) glp_term_hook; +#endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_glp_term_hook=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_glp_term_hook=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_glp_term_hook" >&5 +$as_echo "$ac_cv_have_decl_glp_term_hook" >&6; } +if test "x$ac_cv_have_decl_glp_term_hook" = x""yes; then + +cat >>confdefs.h <<\_ACEOF +#define PPL_GLPK_HAS_GLP_TERM_HOOK 1 +_ACEOF + +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. +{ $as_echo "$as_me:$LINENO: checking whether RLIMIT_DATA is declared" >&5 +$as_echo_n "checking whether RLIMIT_DATA is declared... " >&6; } +if test "${ac_cv_have_decl_RLIMIT_DATA+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_SYS_RESOURCE_H +# include +#endif + + +int +main () +{ +#ifndef RLIMIT_DATA + (void) RLIMIT_DATA; +#endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_RLIMIT_DATA=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_RLIMIT_DATA=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_RLIMIT_DATA" >&5 +$as_echo "$ac_cv_have_decl_RLIMIT_DATA" >&6; } +if test "x$ac_cv_have_decl_RLIMIT_DATA" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_RLIMIT_DATA 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_RLIMIT_DATA 0 +_ACEOF + + +fi +{ $as_echo "$as_me:$LINENO: checking whether RLIMIT_RSS is declared" >&5 +$as_echo_n "checking whether RLIMIT_RSS is declared... " >&6; } +if test "${ac_cv_have_decl_RLIMIT_RSS+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_SYS_RESOURCE_H +# include +#endif + + +int +main () +{ +#ifndef RLIMIT_RSS + (void) RLIMIT_RSS; +#endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_RLIMIT_RSS=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_RLIMIT_RSS=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_RLIMIT_RSS" >&5 +$as_echo "$ac_cv_have_decl_RLIMIT_RSS" >&6; } +if test "x$ac_cv_have_decl_RLIMIT_RSS" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_RLIMIT_RSS 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_RLIMIT_RSS 0 +_ACEOF + + +fi +{ $as_echo "$as_me:$LINENO: checking whether RLIMIT_VMEM is declared" >&5 +$as_echo_n "checking whether RLIMIT_VMEM is declared... " >&6; } +if test "${ac_cv_have_decl_RLIMIT_VMEM+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_SYS_RESOURCE_H +# include +#endif + + +int +main () +{ +#ifndef RLIMIT_VMEM + (void) RLIMIT_VMEM; +#endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_RLIMIT_VMEM=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_RLIMIT_VMEM=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_RLIMIT_VMEM" >&5 +$as_echo "$ac_cv_have_decl_RLIMIT_VMEM" >&6; } +if test "x$ac_cv_have_decl_RLIMIT_VMEM" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_RLIMIT_VMEM 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_RLIMIT_VMEM 0 +_ACEOF + + +fi +{ $as_echo "$as_me:$LINENO: checking whether RLIMIT_AS is declared" >&5 +$as_echo_n "checking whether RLIMIT_AS is declared... " >&6; } +if test "${ac_cv_have_decl_RLIMIT_AS+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_SYS_RESOURCE_H +# include +#endif + + +int +main () +{ +#ifndef RLIMIT_AS + (void) RLIMIT_AS; +#endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_RLIMIT_AS=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_RLIMIT_AS=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_RLIMIT_AS" >&5 +$as_echo "$ac_cv_have_decl_RLIMIT_AS" >&6; } +if test "x$ac_cv_have_decl_RLIMIT_AS" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_RLIMIT_AS 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_RLIMIT_AS 0 +_ACEOF + + +fi + + + +{ $as_echo "$as_me:$LINENO: checking whether getrusage is declared" >&5 +$as_echo_n "checking whether getrusage is declared... " >&6; } +if test "${ac_cv_have_decl_getrusage+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_SYS_TIME_H +# include +#endif +#ifdef HAVE_SYS_RESOURCE_H +# include +#endif + + +int +main () +{ +#ifndef getrusage + (void) getrusage; +#endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_getrusage=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_getrusage=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_getrusage" >&5 +$as_echo "$ac_cv_have_decl_getrusage" >&6; } +if test "x$ac_cv_have_decl_getrusage" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETRUSAGE 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETRUSAGE 0 +_ACEOF + + +fi + + + +# Checks for typedefs, structures, and compiler characteristics. +{ $as_echo "$as_me:$LINENO: checking for timeval" >&5 +$as_echo_n "checking for timeval... " >&6; } +if test "${ac_cv_type_timeval+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_type_timeval=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof (timeval)) + return 0; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof ((timeval))) + return 0; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_timeval=yes +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_timeval" >&5 +$as_echo "$ac_cv_type_timeval" >&6; } +if test "x$ac_cv_type_timeval" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_TIMEVAL 1 +_ACEOF + + +fi + +{ $as_echo "$as_me:$LINENO: checking for siginfo_t" >&5 +$as_echo_n "checking for siginfo_t... " >&6; } +if test "${ac_cv_type_siginfo_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_type_siginfo_t=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include + + +int +main () +{ +if (sizeof (siginfo_t)) + return 0; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include + + +int +main () +{ +if (sizeof ((siginfo_t))) + return 0; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_siginfo_t=yes +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_siginfo_t" >&5 +$as_echo "$ac_cv_type_siginfo_t" >&6; } +if test "x$ac_cv_type_siginfo_t" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_SIGINFO_T 1 +_ACEOF + + +fi + + +# Check whether the IEEE inexact flag is supported and available to +# C++ programs. + +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:$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:$LINENO: result: assuming not" >&5 +$as_echo "assuming not" >&6; } + ac_cxx_supports_limiting_memory=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include + +#ifdef HAVE_SYS_TYPES_H +# include +#endif + +#ifdef HAVE_SYS_TIME_H +# include +#endif + +#ifdef HAVE_SYS_RESOURCE_H +// This should be included after and so as to make +// sure we have the definitions for, e.g., ru_utime. +# include +#endif + +#ifdef HAVE_UNISTD_H +# include +#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 +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + ac_cxx_supports_limiting_memory=yes +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 + +( exit $ac_status ) +{ $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ac_cxx_supports_limiting_memory=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext 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/Grid/Makefile tests/MIP_Problem/Makefile tests/Octagonal_Shape/Makefile tests/Partially_Reduced_Product/Makefile tests/Polyhedron/Makefile tests/Powerset/Makefile utils/Makefile m4/Makefile demos/Makefile demos/ppl_lcdd/Makefile demos/ppl_lcdd/examples/Makefile demos/ppl_lpsol/Makefile demos/ppl_lpsol/examples/Makefile doc/Makefile doc/user.doxyconf-latex doc/devref.doxyconf-latex doc/user.doxyconf-html doc/devref.doxyconf-html 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 +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:$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= ;; #( + *) $as_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 + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:$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= +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. + ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${GCC_TRUE}" && test -z "${GCC_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"GCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"GCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${DEBUGGING_ENABLED_TRUE}" && test -z "${DEBUGGING_ENABLED_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"DEBUGGING_ENABLED\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"DEBUGGING_ENABLED\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${ASSERTIONS_ENABLED_TRUE}" && test -z "${ASSERTIONS_ENABLED_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"ASSERTIONS_ENABLED\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"ASSERTIONS_ENABLED\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${USE_PRECOMPILED_HEADERS_TRUE}" && test -z "${USE_PRECOMPILED_HEADERS_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"USE_PRECOMPILED_HEADERS\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"USE_PRECOMPILED_HEADERS\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${HOST_OS_CYGWIN_TRUE}" && test -z "${HOST_OS_CYGWIN_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"HOST_OS_CYGWIN\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"HOST_OS_CYGWIN\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${HOST_OS_DARWIN_TRUE}" && test -z "${HOST_OS_DARWIN_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"HOST_OS_DARWIN\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"HOST_OS_DARWIN\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${HOST_OS_MINGW_TRUE}" && test -z "${HOST_OS_MINGW_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"HOST_OS_MINGW\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"HOST_OS_MINGW\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${HOST_OS_SOLARIS_TRUE}" && test -z "${HOST_OS_SOLARIS_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"HOST_OS_SOLARIS\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"HOST_OS_SOLARIS\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${HOST_CPU_X86_64_TRUE}" && test -z "${HOST_CPU_X86_64_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"HOST_CPU_X86_64\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"HOST_CPU_X86_64\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${NO_UNDEFINED_TRUE}" && test -z "${NO_UNDEFINED_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"NO_UNDEFINED\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"NO_UNDEFINED\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${USE_NATIVE_INTEGERS_TRUE}" && test -z "${USE_NATIVE_INTEGERS_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"USE_NATIVE_INTEGERS\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"USE_NATIVE_INTEGERS\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${USE_CHECKED_INTEGERS_TRUE}" && test -z "${USE_CHECKED_INTEGERS_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"USE_CHECKED_INTEGERS\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"USE_CHECKED_INTEGERS\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${USE_GMP_INTEGERS_TRUE}" && test -z "${USE_GMP_INTEGERS_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"USE_GMP_INTEGERS\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"USE_GMP_INTEGERS\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${USE_INT8_TRUE}" && test -z "${USE_INT8_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"USE_INT8\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"USE_INT8\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${USE_INT16_TRUE}" && test -z "${USE_INT16_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"USE_INT16\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"USE_INT16\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${USE_INT32_TRUE}" && test -z "${USE_INT32_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"USE_INT32\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"USE_INT32\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${USE_INT64_TRUE}" && test -z "${USE_INT64_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"USE_INT64\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"USE_INT64\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${HAVE_PERL_TRUE}" && test -z "${HAVE_PERL_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"HAVE_PERL\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"HAVE_PERL\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi + +if test -z "${CAN_CONTROL_FPU_TRUE}" && test -z "${CAN_CONTROL_FPU_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"CAN_CONTROL_FPU\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"CAN_CONTROL_FPU\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${SUPPORTED_FLOAT_TRUE}" && test -z "${SUPPORTED_FLOAT_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"SUPPORTED_FLOAT\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"SUPPORTED_FLOAT\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${SUPPORTED_DOUBLE_TRUE}" && test -z "${SUPPORTED_DOUBLE_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"SUPPORTED_DOUBLE\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"SUPPORTED_DOUBLE\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${SUPPORTED_LONG_DOUBLE_TRUE}" && test -z "${SUPPORTED_LONG_DOUBLE_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"SUPPORTED_LONG_DOUBLE\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"SUPPORTED_LONG_DOUBLE\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${BUILD_WATCHDOG_LIBRARY_TRUE}" && test -z "${BUILD_WATCHDOG_LIBRARY_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_WATCHDOG_LIBRARY\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"BUILD_WATCHDOG_LIBRARY\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${BUILD_PPL_LCDD_TRUE}" && test -z "${BUILD_PPL_LCDD_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_PPL_LCDD\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"BUILD_PPL_LCDD\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${BUILD_PPL_LPSOL_TRUE}" && test -z "${BUILD_PPL_LPSOL_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_PPL_LPSOL\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"BUILD_PPL_LPSOL\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${BUILD_CXX_INTERFACE_TRUE}" && test -z "${BUILD_CXX_INTERFACE_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_CXX_INTERFACE\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"BUILD_CXX_INTERFACE\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${BUILD_C_INTERFACE_TRUE}" && test -z "${BUILD_C_INTERFACE_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_C_INTERFACE\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"BUILD_C_INTERFACE\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${BUILD_JAVA_INTERFACE_TRUE}" && test -z "${BUILD_JAVA_INTERFACE_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_JAVA_INTERFACE\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"BUILD_JAVA_INTERFACE\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${HAVE_OCAMLC_TRUE}" && test -z "${HAVE_OCAMLC_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"HAVE_OCAMLC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"HAVE_OCAMLC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${HAVE_OCAMLOPT_TRUE}" && test -z "${HAVE_OCAMLOPT_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"HAVE_OCAMLOPT\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"HAVE_OCAMLOPT\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${BUILD_OCAML_INTERFACE_TRUE}" && test -z "${BUILD_OCAML_INTERFACE_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_OCAML_INTERFACE\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"BUILD_OCAML_INTERFACE\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${BUILD_CIAO_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_CIAO_PROLOG_INTERFACE_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_CIAO_PROLOG_INTERFACE\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"BUILD_CIAO_PROLOG_INTERFACE\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${BUILD_GNU_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_GNU_PROLOG_INTERFACE_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_GNU_PROLOG_INTERFACE\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"BUILD_GNU_PROLOG_INTERFACE\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${BUILD_SICSTUS_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_SICSTUS_PROLOG_INTERFACE_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_SICSTUS_PROLOG_INTERFACE\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"BUILD_SICSTUS_PROLOG_INTERFACE\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${BUILD_SWI_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_SWI_PROLOG_INTERFACE_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_SWI_PROLOG_INTERFACE\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"BUILD_SWI_PROLOG_INTERFACE\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${BUILD_XSB_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_XSB_PROLOG_INTERFACE_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_XSB_PROLOG_INTERFACE\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"BUILD_XSB_PROLOG_INTERFACE\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${BUILD_YAP_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_YAP_PROLOG_INTERFACE_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_YAP_PROLOG_INTERFACE\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"BUILD_YAP_PROLOG_INTERFACE\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${BUILD_SOME_PROLOG_INTERFACES_TRUE}" && test -z "${BUILD_SOME_PROLOG_INTERFACES_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_SOME_PROLOG_INTERFACES\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"BUILD_SOME_PROLOG_INTERFACES\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${VALGRIND_TESTS_ENABLED_TRUE}" && test -z "${VALGRIND_TESTS_ENABLED_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"VALGRIND_TESTS_ENABLED\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"VALGRIND_TESTS_ENABLED\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${THOROUGH_MAKE_CHECK_TRUE}" && test -z "${THOROUGH_MAKE_CHECK_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"THOROUGH_MAKE_CHECK\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"THOROUGH_MAKE_CHECK\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${ENABLE_SHARED_TRUE}" && test -z "${ENABLE_SHARED_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"ENABLE_SHARED\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"ENABLE_SHARED\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${ENABLE_STATIC_TRUE}" && test -z "${ENABLE_STATIC_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"ENABLE_STATIC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"ENABLE_STATIC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${HAVE_MD5SUM_TRUE}" && test -z "${HAVE_MD5SUM_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"HAVE_MD5SUM\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"HAVE_MD5SUM\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${HAVE_GLPK_TRUE}" && test -z "${HAVE_GLPK_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"HAVE_GLPK\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"HAVE_GLPK\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi + +: ${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:$LINENO: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF || ac_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} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_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 + + + + +# PATH needs CR +# 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_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 +if (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 + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +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. +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); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# Required to use basename. +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 + + +# Name of the executable. +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'` + +# CDPATH. +$as_unset CDPATH + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. 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 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +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 -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +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=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# 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 + +# 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 0.10.2, which was +generated by GNU Autoconf 2.63. 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 from templates according to the +current configuration. + +Usage: $0 [OPTION]... [FILE]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, 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 ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_version="\\ +the Parma Polyhedra Library config.status 0.10.2 +configured by $0, generated by GNU Autoconf 2.63, + with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2008 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=$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 ;; + --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"` ;; + esac + CONFIG_FILES="$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 + CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + { $as_echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; };; + --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_echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" + 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 "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`' +macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`' +enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`' +enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`' +pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`' +host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`' +host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`' +host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`' +build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`' +build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`' +build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`' +SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`' +Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`' +GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`' +EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`' +FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`' +LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`' +NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`' +LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`' +ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`' +exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`' +lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`' +reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`' +AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`' +STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`' +RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' +CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`' +compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`' +GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' +objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`' +SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`' +ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`' +need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`' +LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`' +OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`' +libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' +module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`' +fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' +need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`' +version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`' +runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`' +libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`' +soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`' +finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`' +sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`' +old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`' +striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "X$compiler_lib_search_dirs" | $Xsed -e "$delay_single_quote_subst"`' +predep_objects='`$ECHO "X$predep_objects" | $Xsed -e "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "X$postdep_objects" | $Xsed -e "$delay_single_quote_subst"`' +predeps='`$ECHO "X$predeps" | $Xsed -e "$delay_single_quote_subst"`' +postdeps='`$ECHO "X$postdeps" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "X$compiler_lib_search_path" | $Xsed -e "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "X$LD_CXX" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "X$old_archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "X$compiler_CXX" | $Xsed -e "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "X$GCC_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "X$lt_prog_compiler_no_builtin_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "X$lt_prog_compiler_wl_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "X$lt_prog_compiler_pic_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "X$lt_prog_compiler_static_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "X$lt_cv_prog_compiler_c_o_CXX" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "X$archive_cmds_need_lc_CXX" | $Xsed -e "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "X$enable_shared_with_static_runtimes_CXX" | $Xsed -e "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "X$export_dynamic_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "X$whole_archive_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "X$compiler_needs_object_CXX" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "X$old_archive_from_new_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "X$old_archive_from_expsyms_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "X$archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "X$archive_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "X$module_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "X$module_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "X$with_gnu_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "X$allow_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "X$no_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "X$hardcode_libdir_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_ld_CXX='`$ECHO "X$hardcode_libdir_flag_spec_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "X$hardcode_libdir_separator_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "X$hardcode_direct_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "X$hardcode_direct_absolute_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "X$hardcode_minus_L_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "X$hardcode_shlibpath_var_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "X$hardcode_automatic_CXX" | $Xsed -e "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "X$inherit_rpath_CXX" | $Xsed -e "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "X$link_all_deplibs_CXX" | $Xsed -e "$delay_single_quote_subst"`' +fix_srcfile_path_CXX='`$ECHO "X$fix_srcfile_path_CXX" | $Xsed -e "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "X$always_export_symbols_CXX" | $Xsed -e "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "X$export_symbols_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "X$exclude_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "X$include_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "X$prelink_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "X$file_list_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "X$hardcode_action_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "X$compiler_lib_search_dirs_CXX" | $Xsed -e "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "X$predep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "X$postdep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "X$predeps_CXX" | $Xsed -e "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "X$postdeps_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "X$compiler_lib_search_path_CXX" | $Xsed -e "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# Quote evaled strings. +for var in SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +OBJDUMP \ +deplibs_check_method \ +file_magic_cmd \ +AR \ +AR_FLAGS \ +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 \ +SHELL \ +ECHO \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_wl \ +lt_prog_compiler_pic \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +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_flag_spec_ld \ +hardcode_libdir_separator \ +fix_srcfile_path \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +finish_eval \ +old_striplib \ +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_CXX \ +compiler_CXX \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_pic_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_flag_spec_ld_CXX \ +hardcode_libdir_separator_CXX \ +fix_srcfile_path_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 "X\\\\\$\$var"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$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 \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +sys_lib_dlsearch_path_spec \ +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; do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Fix-up fallback echo if it was mangled by the above quoting rules. +case \$lt_ECHO in +*'\\\$0 --fallback-echo"') lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\` + ;; +esac + +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/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/Polyhedron/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Polyhedron/Makefile" ;; + "tests/Powerset/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Powerset/Makefile" ;; + "utils/Makefile") CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;; + "m4/Makefile") CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;; + "demos/Makefile") CONFIG_FILES="$CONFIG_FILES demos/Makefile" ;; + "demos/ppl_lcdd/Makefile") CONFIG_FILES="$CONFIG_FILES demos/ppl_lcdd/Makefile" ;; + "demos/ppl_lcdd/examples/Makefile") CONFIG_FILES="$CONFIG_FILES demos/ppl_lcdd/examples/Makefile" ;; + "demos/ppl_lpsol/Makefile") CONFIG_FILES="$CONFIG_FILES demos/ppl_lpsol/Makefile" ;; + "demos/ppl_lpsol/examples/Makefile") CONFIG_FILES="$CONFIG_FILES demos/ppl_lpsol/examples/Makefile" ;; + "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; + "doc/user.doxyconf-latex") CONFIG_FILES="$CONFIG_FILES doc/user.doxyconf-latex" ;; + "doc/devref.doxyconf-latex") CONFIG_FILES="$CONFIG_FILES doc/devref.doxyconf-latex" ;; + "doc/user.doxyconf-html") CONFIG_FILES="$CONFIG_FILES doc/user.doxyconf-html" ;; + "doc/devref.doxyconf-html") CONFIG_FILES="$CONFIG_FILES doc/devref.doxyconf-html" ;; + "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_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason 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= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || +{ + $as_echo "$as_me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +# 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=' ' +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /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 {' >"$tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } +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_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + + 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_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + 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 >>"\$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 +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$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 < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 +$as_echo "$as_me: error: could not setup config files machinery" >&2;} + { (exit 1); exit 1; }; } +_ACEOF + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +}' +fi + +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 >"$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_t=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_t"; then + break + elif $ac_last_try; then + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;} + { (exit 1); exit 1; }; } + 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 +' >$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_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 +$as_echo "$as_me: error: could not setup config headers machinery" >&2;} + { (exit 1); exit 1; }; } +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_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 +$as_echo "$as_me: error: invalid tag $ac_tag" >&2;} + { (exit 1); exit 1; }; };; + :[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="$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_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + ac_file_inputs="$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:$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 >"$tmp/stdin" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } ;; + 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" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + 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_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + 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:$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 "$tmp/subs.awk" >$tmp/out \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:$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 "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 +$as_echo "$as_me: error: could not create -" >&2;} + { (exit 1); exit 1; }; } + 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:$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"" || for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # 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"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_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 + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + 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_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + # 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 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 + +# 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 + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# 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 + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# 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 + +# 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 + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that does not interpret backslashes. +ECHO=$lt_ECHO + +# 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 + +# 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 + +# 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 + +# 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 + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# 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 + +# If ld is used when linking, flag to hardcode \$libdir into a binary +# during linking. This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using 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 + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# 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 + +# 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 '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + case $xsi_shell in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# 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 () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac +} + +# func_basename file +func_basename () +{ + func_basename_result="${1##*/}" +} + +# 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 () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}" +} + +# 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_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}"} +} + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=${1%%=*} + func_opt_split_arg=${1#*=} +} + +# func_lo2o object +func_lo2o () +{ + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=${1%.*}.lo +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=$(( $* )) +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=${#1} +} + +_LT_EOF + ;; + *) # Bourne compatible functions. + cat << \_LT_EOF >> "$cfgfile" + +# 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 () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "X${1}" | $Xsed -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 file +func_basename () +{ + func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +} + + +# 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 "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; + esac +} + +# sed scripts: +my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q' +my_sed_long_arg='1s/^-[^=]*=//' + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` + func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` +} + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'` +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "$@"` +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` +} + +_LT_EOF +esac + +case $lt_shell_append in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$1+=\$2" +} +_LT_EOF + ;; + *) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$1=\$$1\$2" +} + +_LT_EOF + ;; + esac + + + sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + 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 + +# 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 + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_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 + +# If ld is used when linking, flag to hardcode \$libdir into a binary +# during linking. This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to "yes" if using 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 + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# 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 + +# 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 + + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi + +# +# CONFIG_SUBDIRS section. +# +if test "$no_recursion" != yes; then + + # Remove --cache-file, --srcdir, and --disable-option-checking arguments + # so they do not pile up. + ac_sub_configure_args= + ac_prev= + eval "set x $ac_configure_args" + shift + for ac_arg + do + if test -n "$ac_prev"; then + ac_prev= + continue + fi + case $ac_arg in + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \ + | --c=*) + ;; + --config-cache | -C) + ;; + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + ;; + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + ;; + --disable-option-checking) + ;; + *) + case $ac_arg in + *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + ac_sub_configure_args="$ac_sub_configure_args '$ac_arg'" ;; + esac + done + + # Always prepend --prefix to ensure using the same prefix + # in subdir configurations. + ac_arg="--prefix=$prefix" + case $ac_arg in + *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args" + + # Pass --silent + if test "$silent" = yes; then + ac_sub_configure_args="--silent $ac_sub_configure_args" + fi + + # Always prepend --disable-option-checking to silence warnings, since + # different subdirs can have different --enable and --with options. + ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args" + + ac_popdir=`pwd` + for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue + + # Do not complain, so a configure script can configure whichever + # parts of a large source tree are present. + test -d "$srcdir/$ac_dir" || continue + + ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)" + $as_echo "$as_me:$LINENO: $ac_msg" >&5 + $as_echo "$ac_msg" >&6 + { as_dir="$ac_dir" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + 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_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + 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" + + # Check for guested configure; otherwise get Cygnus style configure. + if test -f "$ac_srcdir/configure.gnu"; then + ac_sub_configure=$ac_srcdir/configure.gnu + elif test -f "$ac_srcdir/configure"; then + ac_sub_configure=$ac_srcdir/configure + elif test -f "$ac_srcdir/configure.in"; then + # This should be Cygnus configure. + ac_sub_configure=$ac_aux_dir/configure + else + { $as_echo "$as_me:$LINENO: WARNING: no configuration information is in $ac_dir" >&5 +$as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} + ac_sub_configure= + fi + + # The recursion is here. + if test -n "$ac_sub_configure"; then + # Make the cache file name correct relative to the subdirectory. + case $cache_file in + [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;; + *) # Relative name. + ac_sub_cache_file=$ac_top_build_prefix$cache_file ;; + esac + + { $as_echo "$as_me:$LINENO: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 +$as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;} + # The eval makes quoting arguments work. + eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \ + --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" || + { { $as_echo "$as_me:$LINENO: error: $ac_sub_configure failed for $ac_dir" >&5 +$as_echo "$as_me: error: $ac_sub_configure failed for $ac_dir" >&2;} + { (exit 1); exit 1; }; } + fi + + cd "$ac_popdir" + done +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:$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:$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 + if test x${c_interface_enabled} = xyes + then + { { $as_echo "$as_me:$LINENO: error: PERL UNAVAILABLE: +*** CANNOT BUILD THE C_INTERFACE. +*** Perl could not be found on your system, so that the C interface cannot +*** be built. You should either disable the generation of the C interface +*** (with the \`--enable-interfaces' configure option) or add Perl to your +*** development environment: see http://www.perl.org/ for more information." >&5 +$as_echo "$as_me: error: PERL UNAVAILABLE: +*** CANNOT BUILD THE C_INTERFACE. +*** Perl could not be found on your system, so that the C interface cannot +*** be built. You should either disable the generation of the C interface +*** (with the \`--enable-interfaces' configure option) or add Perl to your +*** development environment: see http://www.perl.org/ for more information." >&2;} + { (exit 1); exit 1; }; } + else + { $as_echo "$as_me:$LINENO: WARNING: PERL UNAVAILABLE: +*** CANNOT REBUILD SOME FILES IF SOURCES ARE CHANGED. +*** Perl could not be found on your system. This is OK, if you only plan +*** to build the PPL without modifying the sources and without trying to +*** build a distribution out of a CVS working copy. If this is not the case, +*** then you need to add Perl to your development environment: +*** see http://www.perl.org/ for more information." >&5 +$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 +fi + +if test x"$coefficient_kind" = xnative +then + { $as_echo "$as_me:$LINENO: WARNING: USING NATIVE INTEGERS IS EXTREMELY DANGEROUS: +*** CONSIDER ANY RESULT YOU WILL GET FROM THE LIBRARY AS PSEUDO-RANDOM!!! +*** You have requested to use a native integral type to represent +*** coefficients. This means that arithmetic overflows will be possible +*** and will not be detected. The consequence of that is that nothing +*** can be said about the behavior of the library: whatever the +*** documentation says, it does not apply to the version of the library +*** you are about to build. Just one arithmetic overflow is enough +*** to invalidate any possible significance of the results. +*** Please, do not assume that your computation will not overflow because +*** only small coefficients are involved. Do not do it because +*** (1) coefficients may grow very rapidly depending on the polyhedra +*** computations being performed; +*** (2) the library may do internal polyhedra computations that you +*** cannot easily anticipate; +*** (3) the library has never had, among its design goals, the one of +*** trying to keep the coefficients small. +*** +*** Please, consider using a _checked_ native integral type instead." >&5 +$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..003514a --- /dev/null +++ b/configure.ac @@ -0,0 +1,1627 @@ +# Autoconf source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +# Process this file with Autoconf to produce a configure script. + +# Every other copy of the package version number gets its value from here. +AC_INIT([the Parma Polyhedra Library], [0.10.2], [ppl-devel@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 tar-ustar 1.9]) + +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([ +/* 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 is included before is + (even indirectly) included. Moreover we need to define + __STDC_LIMIT_MACROS before the first inclusion of + 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 +#endif + +#ifdef PPL_HAVE_INTTYPES_H +# include +#endif +]) + + +# 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 abd 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 + +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 + +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" + ;; +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 +fpmath_may_use_387=yes +fpmath_may_use_sse=yes +AC_MSG_CHECKING([whether to select specific floating point arithmetics]) +AC_ARG_ENABLE(fpmath, + AS_HELP_STRING([--enable-fpmath=INSTRUCTION_SET], + [select floating point arithmetics])) +case "${enableval}" in +sse) + AC_MSG_RESULT(sse) + OPT_FLAGS="$OPT_FLAGS -msse -mfpmath=sse" + # The SSE instruction set only supports single precision arithmetics: + # double and extended precision arithmetics is still done using 387. + ;; +sse2) + AC_MSG_RESULT(sse2) + OPT_FLAGS="$OPT_FLAGS -msse2 -mfpmath=sse" + # SSE2 still does not support extended precision arithmetics. + ;; +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(default) + ;; +*) + 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 arithmetics 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 arithmetics 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 + OPT_FLAGS="$OPT_FLAGS -frounding-math" + 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 + ;; +darwin*) + darwin=yes + ;; +mingw*) + mingw=yes + ;; +solaris*) + solaris=yes + ;; +*) + ;; +esac + +AM_CONDITIONAL(HOST_OS_CYGWIN, test x$cygwin = xyes) +AM_CONDITIONAL(HOST_OS_DARWIN, test x$darwin = xyes) +AM_CONDITIONAL(HOST_OS_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" + 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" + 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 and 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") + +AC_ARG_WITH(cxxflags, + AS_HELP_STRING([--with-cxxflags=XXX], + [add XXX to the options for the C++ compiler]), + CXXFLAGS="$CXXFLAGS $with_cxxflags") + +# Check for Perl. +AC_PATH_PROG([PERL], perl, no) +AC_SUBST([PERL]) +AM_CONDITIONAL(HAVE_PERL, test x"$PERL" != xno) + +# Checks for C typedefs, structures, compiler and architecture characteristics. +AC_LANG(C) +AC_C_CONST +AC_C_INLINE +AC_C_BIGENDIAN +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 (see +# http://www.cs.unipr.it/pipermail/ppl-devel/2008-August/012277.html). +AC_CHECK_SIZEOF([int*]) +AC_CHECK_SIZEOF([fp], [], [typedef int *(*fp)();]) + +# Use C++ for the remaining checks. +AC_LANG(C++) + +# Check for the possibility to control the FPU. +AC_CHECK_FPU_CONTROL + +# 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 + +# Check whether the C++ run-time systems provides exact output for +# floats. +#AC_CXX_FLOAT_EXACT_OUTPUT + +# Check whether the C++ run-time systems provides exact output for +# doubles. +#AC_CXX_DOUBLE_EXACT_OUTPUT + +# Check whether the C++ run-time systems provides exact output for +# long doubles. +#AC_CXX_LONG_DOUBLE_EXACT_OUTPUT + +# Check whether the C++ compiler supports flexible arrays. +AC_CXX_SUPPORTS_FLEXIBLE_ARRAYS + +# Check whether the IEEE inexact flag is supported in C++. +AC_CXX_SUPPORTS_IEEE_INEXACT_FLAG + +# Check whether the C++ compiler has the remainder bug. +AC_CXX_HAS_REMAINDER_BUG + +# 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 +#elif defined(HAVE_STRING_H) +# include +#endif + ]) +AC_CHECK_DECLS([getenv,strtof,strtod,strtold,strtoll,strtoull], , , [#include ]) +AC_CHECK_DECLS([fma,fmaf,fmal,rintf,rintl], , , [#include ]) + +# Checks for the availability of "fast" integral types. +AC_CHECK_TYPES([int_fast16_t,int_fast32_t,int_fast64_t,uint_fast16_t,uint_fast32_t,uint_fast64_t]) + +# Must link everything with libm. +extra_libraries="${extra_libraries} -lm" + +# GMP library. + +AC_CHECK_GMP +if test x"$have_gmp" = xno +then + AC_MSG_ERROR([Cannot find GMP version 4.1.3 or higher. +GMP is the GNU Multi-Precision library: +see http://www.swox.com/gmp/ for more information. +When compiling the GMP library, do not forget to enable the C++ interface: +add --enable-cxx to the configuration options.]) +else + if test x"$have_gmpxx" = xno + then + AC_MSG_ERROR([GMP compiled without enabling the C++ interface. +GMP is the GNU Multi-Precision library: +see http://www.swox.com/gmp/ for more information. +When compiling the GMP library, do not forget to enable the C++ interface: +add --enable-cxx to the configuration options.]) + fi +fi + +AC_CHECK_MEMBERS([__mpz_struct._mp_alloc, + __mpz_struct._mp_size, + __mpz_struct._mp_d], + , + gmp_has_changes=yes, + [#include ]) + +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@cs.unipr.it.]) +fi + +extra_includes="${extra_includes}${extra_includes:+ }${gmp_includes_option}" +extra_libraries="${extra_libraries}${extra_libraries:+ }${gmp_library_option}" + +# setitimer() is a strong requisite for the PWL. +AC_CHECK_FUNCS([setitimer], [have_setitimer=yes], [have_setitimer=no]) + +enableval=default +AC_MSG_CHECKING([whether to build the Parma Watchdog Library]) +AC_ARG_ENABLE(watchdog, + AS_HELP_STRING([--enable-watchdog], + [build also the Parma Watchdog Library])) +case "${enableval}" in +yes) + if test x"$have_setitimer" = xyes + then + build_watchdog_library=yes + else + AC_MSG_ERROR([CANNOT BUILD THE WATCHDOG LIBRARY +*** THE SYSTEM DOES NOT PROVIDE THE SETITIMER FUNCTION.]) + fi + ;; +default) + build_watchdog_library=$have_setitimer + ;; +no) + build_watchdog_library=no + ;; +*) + AC_MSG_ERROR([bad value ${enableval} for --enable-watchdog, needs yes or no]) + ;; +esac +AC_MSG_RESULT($build_watchdog_library) +AM_CONDITIONAL(BUILD_WATCHDOG_LIBRARY, test x"$build_watchdog_library" = xyes) +if test x"$build_watchdog_library" = xyes +then + AC_DEFINE(PPL_WATCHDOG_LIBRARY_ENABLED, 1, [Defined if the Parma Watchdog Library is enabled.]) +fi + +# Enabled or not, the Watchdog subdirectory must be configured. +AC_CONFIG_SUBDIRS(Watchdog) + +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) + +# 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 + +# Perl is needed to build the C++ interface. +if test x${cxx_interface_enabled} = xyes \ +&& test x"$PERL" != xno +then + build_cxx_interface=yes +fi +AM_CONDITIONAL(BUILD_CXX_INTERFACE, test x$build_cxx_interface = xyes) + +# Perl is needed to build the C interface. +if test x${c_interface_enabled} = xyes \ +&& test x"$PERL" != xno +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 Fedora 9 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 + + 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 + # Check for the bytecode compiler. + AC_CHECK_PROG(OCAMLC, ocamlc, ocamlc) + ocamlc_gmp="no" + if test x"$OCAMLC" = xocamlc + then + ocamlc_root=`ocamlc -where` + # 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 ${ocamlc_root}/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 + fi + # Check for the native compiler. + AC_CHECK_PROG(OCAMLOPT, ocamlopt, ocamlopt) + ocamlopt_gmp="no" + if test x"$OCAMLOPT" = xocamlopt + 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 +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_PROG(YAP_PROLOG, yap, yap) + if test x"$YAP_PROLOG" = xyap + then + AC_CHECK_HEADER(Yap/c_interface.h, + [], + YAP_PROLOG="") + fi +fi + +if test x${yap_prolog_interface_enabled} = xyes \ +&& test x$YAP_PROLOG = xyap +then + build_yap_prolog_interface=yes +fi +AM_CONDITIONAL(BUILD_YAP_PROLOG_INTERFACE, + test x$build_yap_prolog_interface = xyes) + +# Test if *any* Prolog system has 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 @ BD_Shape" +di="${di} @ Octagonal_Shape @ Octagonal_Shape" +di="${di} @ Constraints_Product" +di="${di} @ Pointset_Powerset" +di="${di} @ Pointset_Powerset" +if test $ac_supported_double = 1 +then + di="${di} @ Double_Box @ BD_Shape @ Octagonal_Shape" +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 @ BD_Shape" +ai="${ai} @ BD_Shape @ BD_Shape" +ai="${ai} @ BD_Shape @ BD_Shape" +ai="${ai} @ Octagonal_Shape @ Octagonal_Shape" +ai="${ai} @ Octagonal_Shape @ Octagonal_Shape" +ai="${ai} @ Octagonal_Shape @ Octagonal_Shape" +ai="${ai} @ Polyhedron @ Grid" +ai="${ai} @ Pointset_Powerset @ Pointset_Powerset" +ai="${ai} @ Pointset_Powerset @ Pointset_Powerset" +ai="${ai} @ Pointset_Powerset @ Pointset_Powerset" +ai="${ai} @ Pointset_Powerset @ Pointset_Powerset" +ai="${ai} @ Pointset_Powerset @ Pointset_Powerset" +ai="${ai} @ Pointset_Powerset >" +ai="${ai} @ Pointset_Powerset >" +ai="${ai} @ Pointset_Powerset >" +ai="${ai} @ Pointset_Powerset >" +ai="${ai} @ Pointset_Powerset >" +ai="${ai} @ Pointset_Powerset >" +ai="${ai} @ Pointset_Powerset >" +ai="${ai} @ Pointset_Powerset >" +ai="${ai} @ Pointset_Powerset >" +ai="${ai} @ Pointset_Powerset >" +ai="${ai} @ Pointset_Powerset >" +ai="${ai} @ Pointset_Powerset >" +ai="${ai} @ Pointset_Powerset" +ai="${ai} @ Pointset_Powerset" +ai="${ai} @ Pointset_Powerset" +ai="${ai} @ Constraints_Product" +ai="${ai} @ Constraints_Product" +ai="${ai} @ Constraints_Product" +ai="${ai} @ Constraints_Product" +if test $ac_supported_float = 1 +then + ai="${ai} @ Float_Box @ BD_Shape" + ai="${ai} @ Octagonal_Shape" + ai="${ai} @ Pointset_Powerset" + ai="${ai} @ Pointset_Powerset >" + ai="${ai} @ Pointset_Powerset >" +fi +if test $ac_supported_double = 1 +then + ai="${ai} @ Double_Box @ BD_Shape" + ai="${ai} @ Octagonal_Shape" + ai="${ai} @ Pointset_Powerset" + ai="${ai} @ Pointset_Powerset >" + ai="${ai} @ Pointset_Powerset >" +fi +if test $ac_supported_long_double = 1 +then + ai="${ai} @ Long_Double_Box @ BD_Shape" + ai="${ai} @ Octagonal_Shape" + ai="${ai} @ Pointset_Powerset" + ai="${ai} @ Pointset_Powerset >" + ai="${ai} @ Pointset_Powerset >" +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/>>/> >/g' -e 's/^[[ ]]//g' -e 's/[[ ]]$//g'` + # Check the specified instantiations for validity. + ac_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -I${srcdir}" + 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@Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron@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@Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron@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@C_Polyhedron@NNC_Polyhedron/g' -e 's/@Polyhedron/@Polyhedron@C_Polyhedron@NNC_Polyhedron/g' -e 's/@Pointset_Powerset_Polyhedron/@Pointset_Powerset_C_Polyhedron@Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron@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@Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron@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_INIT([dlopen]) +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 +#elif defined(HAVE_GLPK_H) +#include +#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 +#elif defined(HAVE_GLPK_H) +#include +#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 +#elif defined(HAVE_GLPK_H) +#include +#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 +#endif + ]) + +AC_CHECK_DECLS([getrusage], + , + , + [ +#ifdef HAVE_SYS_TIME_H +# include +#endif +#ifdef HAVE_SYS_RESOURCE_H +# include +#endif +]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_CHECK_TYPES([timeval]) +AC_CHECK_TYPES([siginfo_t], [], [], [[ +#include +]]) + +# Check whether the IEEE inexact flag is supported and available to +# C++ programs. +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(ocamlc_root) +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/Grid/Makefile + tests/MIP_Problem/Makefile + tests/Octagonal_Shape/Makefile + tests/Partially_Reduced_Product/Makefile + tests/Polyhedron/Makefile + tests/Powerset/Makefile + utils/Makefile + m4/Makefile + demos/Makefile + demos/ppl_lcdd/Makefile + demos/ppl_lcdd/examples/Makefile + demos/ppl_lpsol/Makefile + demos/ppl_lpsol/examples/Makefile + doc/Makefile + doc/user.doxyconf-latex + doc/devref.doxyconf-latex + doc/user.doxyconf-html + doc/devref.doxyconf-html + 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 + if test x${c_interface_enabled} = xyes + then + AC_MSG_ERROR([PERL UNAVAILABLE: +*** CANNOT BUILD THE C_INTERFACE. +*** Perl could not be found on your system, so that the C interface cannot +*** be built. You should either disable the generation of the C interface +*** (with the `--enable-interfaces' configure option) or add Perl to your +*** development environment: see http://www.perl.org/ for more information.]) + else + 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 +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..bb950be --- /dev/null +++ b/demos/Makefile.am @@ -0,0 +1,31 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/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 + +SUBDIRS = $(PPL_LCDD_SUBDIR) $(PPL_LPSOL_SUBDIR) diff --git a/demos/Makefile.in b/demos/Makefile.in new file mode 100644 index 0000000..adc14e3 --- /dev/null +++ b/demos/Makefile.in @@ -0,0 +1,603 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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.am $(srcdir)/Makefile.in +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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-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 uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = ppl_lcdd ppl_lpsol +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +@BUILD_PPL_LCDD_TRUE@PPL_LCDD_SUBDIR = ppl_lcdd +@BUILD_PPL_LPSOL_TRUE@PPL_LPSOL_SUBDIR = ppl_lpsol +SUBDIRS = $(PPL_LCDD_SUBDIR) $(PPL_LPSOL_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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign demos/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign demos/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-exec-am: + +install-html: install-html-recursive + +install-info: install-info-recursive + +install-man: + +install-pdf: install-pdf-recursive + +install-ps: install-ps-recursive + +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: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ + install-strip + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive 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-recursive \ + 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..6b72384 --- /dev/null +++ b/demos/ppl_lcdd/Makefile.am @@ -0,0 +1,132 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +SUBDIRS = examples + +AM_CPPFLAGS = \ +-I$(top_builddir) \ +-I$(top_builddir)/src \ +-I$(top_srcdir)/utils \ +@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 \ +@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) $< -lpolkag -lgmpxx -lgmp $(top_builddir)/utils/libppl_utils.a + + +polylib_lcdd.o: $(srcdir)/ppl_lcdd.cc + $(CXXCOMPILE) -c -o $@ -DUSE_POLYLIB $(srcdir)/ppl_lcdd.cc + +polylib_lcdd: polylib_lcdd.o $(top_builddir)/utils/libppl_utils.a + $(CXXLINK) $< -lpolylibgmp -lgmpxx -lgmp $(top_builddir)/utils/libppl_utils.a + +EXTRA_DIST = \ +expected_mpz \ +expected_mpz_a \ +expected_int8 \ +expected_int8_a \ +expected_int16 \ +expected_int16_a \ +expected_int32 \ +expected_int32_a \ +expected_int64 \ +expected_int64_a + +if HAVE_MD5SUM + +COEFFICIENT_MNEMONIC = @coefficient_mnemonic@ + +if ASSERTIONS_ENABLED + +TOUGH_EXAMPLES_IF_ASSERTIONS_ENABLED = \ +ccc6.ext \ +ccp6.ext \ +cut32_16.ext \ +cyclic16-10.ext \ +reg600-5_m.ext \ +cyclic17_8.ine \ +in6.ine \ +in7.ine \ +kq20_11_m.ine \ +mit31-20.ine \ +sampleh8.ine \ +trunc10.ine + +EXPECTED = expected_$(COEFFICIENT_MNEMONIC)_a + +else !ASSERTIONS_ENABLED + +EXPECTED = expected_$(COEFFICIENT_MNEMONIC) + +endif !ASSERTIONS_ENABLED + +TOUGH_EXAMPLES = \ +cp7.ext \ +cyclic25_13.ext \ +prodst62.ext \ +cp6.ine \ +mit.ine \ +mit288-281.ine \ +mit41-16.ine \ +mit708-9.ine \ +mit71-61.ine \ +mit90-86.ine \ +$(TOUGH_EXAMPLES_IF_ASSERTIONS_ENABLED) + +check-local: ppl_lcdd$(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..16656b5 --- /dev/null +++ b/demos/ppl_lcdd/Makefile.in @@ -0,0 +1,840 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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 = $(dist_man_MANS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" +binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) +PROGRAMS = $(bin_PROGRAMS) +am_ppl_lcdd_OBJECTS = ppl_lcdd.$(OBJEXT) +ppl_lcdd_OBJECTS = $(am_ppl_lcdd_OBJECTS) +ppl_lcdd_DEPENDENCIES = $(top_builddir)/src/libppl.la \ + $(top_builddir)/utils/libppl_utils.a +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(ppl_lcdd_SOURCES) +DIST_SOURCES = $(ppl_lcdd_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-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 uninstall-recursive +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(dist_man_MANS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +SUBDIRS = examples +AM_CPPFLAGS = \ +-I$(top_builddir) \ +-I$(top_builddir)/src \ +-I$(top_srcdir)/utils \ +@extra_includes@ + +ppl_lcdd_SOURCES = ppl_lcdd.cc +ppl_lcdd_LDADD = \ +$(top_builddir)/src/libppl.la \ +$(top_builddir)/utils/libppl_utils.a \ +@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 + +@HAVE_MD5SUM_TRUE@COEFFICIENT_MNEMONIC = @coefficient_mnemonic@ +@ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE@TOUGH_EXAMPLES_IF_ASSERTIONS_ENABLED = \ +@ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE@ccc6.ext \ +@ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE@ccp6.ext \ +@ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE@cut32_16.ext \ +@ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE@cyclic16-10.ext \ +@ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE@reg600-5_m.ext \ +@ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE@cyclic17_8.ine \ +@ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE@in6.ine \ +@ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE@in7.ine \ +@ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE@kq20_11_m.ine \ +@ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE@mit31-20.ine \ +@ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE@sampleh8.ine \ +@ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE@trunc10.ine + +@ASSERTIONS_ENABLED_FALSE@@HAVE_MD5SUM_TRUE@EXPECTED = expected_$(COEFFICIENT_MNEMONIC) +@ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE@EXPECTED = expected_$(COEFFICIENT_MNEMONIC)_a +@HAVE_MD5SUM_TRUE@TOUGH_EXAMPLES = \ +@HAVE_MD5SUM_TRUE@cp7.ext \ +@HAVE_MD5SUM_TRUE@cyclic25_13.ext \ +@HAVE_MD5SUM_TRUE@prodst62.ext \ +@HAVE_MD5SUM_TRUE@cp6.ine \ +@HAVE_MD5SUM_TRUE@mit.ine \ +@HAVE_MD5SUM_TRUE@mit288-281.ine \ +@HAVE_MD5SUM_TRUE@mit41-16.ine \ +@HAVE_MD5SUM_TRUE@mit708-9.ine \ +@HAVE_MD5SUM_TRUE@mit71-61.ine \ +@HAVE_MD5SUM_TRUE@mit90-86.ine \ +@HAVE_MD5SUM_TRUE@$(TOUGH_EXAMPLES_IF_ASSERTIONS_ENABLED) + +@HAVE_MD5SUM_TRUE@MOSTLYCLEANFILES = \ +@HAVE_MD5SUM_TRUE@tough_examples \ +@HAVE_MD5SUM_TRUE@obtained + +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .cc .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign demos/ppl_lcdd/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign demos/ppl_lcdd/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + if test -f $$p \ + || test -f $$p1 \ + ; then \ + f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ + else :; fi; \ + done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ + rm -f "$(DESTDIR)$(bindir)/$$f"; \ + done + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +ppl_lcdd$(EXEEXT): $(ppl_lcdd_OBJECTS) $(ppl_lcdd_DEPENDENCIES) + @rm -f ppl_lcdd$(EXEEXT) + $(CXXLINK) $(ppl_lcdd_OBJECTS) $(ppl_lcdd_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_lcdd.Po@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-man1: $(man1_MANS) $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ + else file=$$i; fi; \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 1*) ;; \ + *) ext='1' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ + done +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 1*) ;; \ + *) ext='1' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ + rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ + done + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + distdir) \ + || exit 1; \ + fi; \ + done +@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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-recursive + +install-exec-am: install-binPROGRAMS + +install-html: install-html-recursive + +install-info: install-info-recursive + +install-man: install-man1 + +install-pdf: install-pdf-recursive + +install-ps: install-ps-recursive + +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: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ + install-strip + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am check-local clean clean-binPROGRAMS \ + clean-generic clean-libtool ctags ctags-recursive 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-recursive 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) $< -lpolkag -lgmpxx -lgmp $(top_builddir)/utils/libppl_utils.a + +polylib_lcdd.o: $(srcdir)/ppl_lcdd.cc + $(CXXCOMPILE) -c -o $@ -DUSE_POLYLIB $(srcdir)/ppl_lcdd.cc + +polylib_lcdd: polylib_lcdd.o $(top_builddir)/utils/libppl_utils.a + $(CXXLINK) $< -lpolylibgmp -lgmpxx -lgmp $(top_builddir)/utils/libppl_utils.a + +@HAVE_MD5SUM_TRUE@check-local: ppl_lcdd$(EXEEXT) +@HAVE_MD5SUM_TRUE@ echo $(TOUGH_EXAMPLES) >tough_examples +@HAVE_MD5SUM_TRUE@ echo $(ECHO_N) "$(ECHO_C)" >obtained +@HAVE_MD5SUM_TRUE@ export LC_ALL=C; \ +@HAVE_MD5SUM_TRUE@ for path in $(srcdir)/examples/*.ext $(srcdir)/examples/*.ine; \ +@HAVE_MD5SUM_TRUE@ do \ +@HAVE_MD5SUM_TRUE@ file=`basename $$path`; \ +@HAVE_MD5SUM_TRUE@ $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \ +@HAVE_MD5SUM_TRUE@ echo $(ECHO_N) $$file " $(ECHO_C)" >>obtained; \ +@HAVE_MD5SUM_TRUE@ echo ppl_lcdd$(EXEEXT) $$path; \ +@HAVE_MD5SUM_TRUE@ ./ppl_lcdd$(EXEEXT) $$path | tr -d '\015' | $(TEXT_MD5SUM) \ +@HAVE_MD5SUM_TRUE@ >>obtained; \ +@HAVE_MD5SUM_TRUE@ done +@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..78df9ce --- /dev/null +++ b/demos/ppl_lcdd/examples/Makefile.am @@ -0,0 +1,135 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +EXT_FILES = \ +ccc4.ext \ +ccc5.ext \ +ccc6.ext \ +ccp4.ext \ +ccp5.ext \ +ccp6.ext \ +cp4.ext \ +cp5.ext \ +cp6.ext \ +cp7.ext \ +cube.ext \ +cut16_11.ext \ +cut32_16.ext \ +cyclic10-4.ext \ +cyclic12-6.ext \ +cyclic14-8.ext \ +cyclic16-10.ext \ +cyclic25_13.ext \ +dcube10.ext \ +dcube12.ext \ +dcube3.ext \ +dcube6.ext \ +dcube8.ext \ +irbox20-4.ext \ +irbox200-4.ext \ +mp5.ext \ +prodst62.ext \ +redcheck.ext \ +reg24-5.ext \ +reg600-5_m.ext \ +samplev1.ext \ +samplev2.ext \ +samplev3.ext \ +tsp5.ext + +INE_FILES = \ +1d.ine \ +1da.ine \ +allzero.ine \ +cp4.ine \ +cp5.ine \ +cp6.ine \ +cross10.ine \ +cross12.ine \ +cross4.ine \ +cross6.ine \ +cross8.ine \ +cube.ine \ +cube10.ine \ +cube12.ine \ +cube3.ine \ +cube6.ine \ +cube8.ine \ +cubetop.ine \ +cubocta.ine \ +cyc.ine \ +cyclic17_8.ine \ +diamond.ine \ +dodeca_m.ine \ +ex1.ine \ +grcubocta.ine \ +hexocta.ine \ +icododeca_m.ine \ +in0.ine \ +in1.ine \ +in2.ine \ +in3.ine \ +in4.ine \ +in5.ine \ +in6.ine \ +in7.ine \ +infeas.ine \ +integralpoints.ine \ +kkd18_4.ine \ +kkd27_5.ine \ +kkd38_6.ine \ +kq20_11_m.ine \ +metric40_11.ine \ +metric80_16.ine \ +mit.ine \ +mit288-281.ine \ +mit31-20.ine \ +mit41-16.ine \ +mit708-9.ine \ +mit71-61.ine \ +mit90-86.ine \ +mp5.ine \ +mp5a.ine \ +mp6.ine \ +nonfull.ine \ +origin.ine \ +project1_m.ine \ +project1res.ine \ +project2_m.ine \ +project2res.ine \ +rcubocta.ine \ +reg24-5.ine \ +rhomtria_m.ine \ +sample.ine \ +sampleh1.ine \ +sampleh2.ine \ +sampleh3.ine \ +sampleh4.ine \ +sampleh5.ine \ +sampleh6.ine \ +sampleh7.ine \ +sampleh8.ine \ +trunc10.ine \ +trunc7.ine \ +tsp5.ine + +dist_noinst_DATA = $(EXT_FILES) $(INE_FILES) diff --git a/demos/ppl_lcdd/examples/Makefile.in b/demos/ppl_lcdd/examples/Makefile.in new file mode 100644 index 0000000..ce5081d --- /dev/null +++ b/demos/ppl_lcdd/examples/Makefile.in @@ -0,0 +1,558 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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 = README $(dist_noinst_DATA) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +DATA = $(dist_noinst_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +EXT_FILES = \ +ccc4.ext \ +ccc5.ext \ +ccc6.ext \ +ccp4.ext \ +ccp5.ext \ +ccp6.ext \ +cp4.ext \ +cp5.ext \ +cp6.ext \ +cp7.ext \ +cube.ext \ +cut16_11.ext \ +cut32_16.ext \ +cyclic10-4.ext \ +cyclic12-6.ext \ +cyclic14-8.ext \ +cyclic16-10.ext \ +cyclic25_13.ext \ +dcube10.ext \ +dcube12.ext \ +dcube3.ext \ +dcube6.ext \ +dcube8.ext \ +irbox20-4.ext \ +irbox200-4.ext \ +mp5.ext \ +prodst62.ext \ +redcheck.ext \ +reg24-5.ext \ +reg600-5_m.ext \ +samplev1.ext \ +samplev2.ext \ +samplev3.ext \ +tsp5.ext + +INE_FILES = \ +1d.ine \ +1da.ine \ +allzero.ine \ +cp4.ine \ +cp5.ine \ +cp6.ine \ +cross10.ine \ +cross12.ine \ +cross4.ine \ +cross6.ine \ +cross8.ine \ +cube.ine \ +cube10.ine \ +cube12.ine \ +cube3.ine \ +cube6.ine \ +cube8.ine \ +cubetop.ine \ +cubocta.ine \ +cyc.ine \ +cyclic17_8.ine \ +diamond.ine \ +dodeca_m.ine \ +ex1.ine \ +grcubocta.ine \ +hexocta.ine \ +icododeca_m.ine \ +in0.ine \ +in1.ine \ +in2.ine \ +in3.ine \ +in4.ine \ +in5.ine \ +in6.ine \ +in7.ine \ +infeas.ine \ +integralpoints.ine \ +kkd18_4.ine \ +kkd27_5.ine \ +kkd38_6.ine \ +kq20_11_m.ine \ +metric40_11.ine \ +metric80_16.ine \ +mit.ine \ +mit288-281.ine \ +mit31-20.ine \ +mit41-16.ine \ +mit708-9.ine \ +mit71-61.ine \ +mit90-86.ine \ +mp5.ine \ +mp5a.ine \ +mp6.ine \ +nonfull.ine \ +origin.ine \ +project1_m.ine \ +project1res.ine \ +project2_m.ine \ +project2res.ine \ +rcubocta.ine \ +reg24-5.ine \ +rhomtria_m.ine \ +sample.ine \ +sampleh1.ine \ +sampleh2.ine \ +sampleh3.ine \ +sampleh4.ine \ +sampleh5.ine \ +sampleh6.ine \ +sampleh7.ine \ +sampleh8.ine \ +trunc10.ine \ +trunc7.ine \ +tsp5.ine + +dist_noinst_DATA = $(EXT_FILES) $(INE_FILES) +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign demos/ppl_lcdd/examples/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign demos/ppl_lcdd/examples/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +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 + +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 \ + 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 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 -6 8 0 8 0 8 24 -8 -4 0 8 4 8 -12 -8 -8 -4 -2 -4 12 -16 0 0 16 -4 -4 -4 8 -4 0 -10 0 -8 -2 -4 0 -12 4 -1 0 -4 0 24 6 -8 -8 -8 -2 0 1 12 0 0 8 -4 -8 4 4 0 -4 -8 2 16 0 0 -16 4 -8 -8 4 -4 0 0 2 4 8 0 8 4 8 4 2 4 -8 -12 -4 -4 -8 -4 8 2 0 -1 -2 1 +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 8 0 0 -8 0 0 8 -8 4 8 1 -8 -8 0 0 4 0 0 -4 0 0 8 -2 -4 4 0 8 0 0 0 0 8 8 0 2 0 -8 0 0 -8 -4 -4 -4 -2 8 8 0 4 4 2 -8 -4 0 1 4 -1 +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 -4 2 4 12 8 8 0 0 4 4 4 0 -4 16 2 0 8 2 4 0 4 -4 -1 0 -4 -16 -8 -6 8 8 8 2 0 1 4 0 16 -8 -4 0 -4 4 0 4 -8 -2 -8 -8 0 0 -4 8 0 4 -4 -16 0 -2 -4 8 -4 -8 4 0 4 -2 0 -8 -4 4 -4 0 0 8 6 4 -1 -6 1 +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 0 -6 24 12 -24 0 0 0 0 12 0 0 -12 24 0 0 0 12 -6 -12 -12 0 0 -12 12 0 -12 12 0 0 24 6 0 0 6 12 24 12 0 3 -24 -12 0 0 6 0 -24 24 -6 -24 -3 12 24 0 0 -4 0 0 12 0 0 0 6 0 0 12 -12 0 0 0 0 -12 -24 0 -6 0 0 0 0 12 0 4 6 0 -12 -12 0 -12 0 0 12 6 0 -1 -6 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 -4 -4 4 8 -8 0 12 -12 0 0 0 -2 8 0 2 4 16 0 12 3 0 4 -8 0 -2 0 8 -8 -6 -16 -3 4 0 8 0 0 0 4 0 -8 4 0 2 4 -4 -8 8 0 0 0 0 -4 0 -8 -2 -4 0 0 0 4 -4 0 6 0 -8 -4 -4 0 4 0 8 6 0 -1 -6 1 +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 0 0 0 0 0 -8 -4 0 -8 -2 -8 -8 -8 -4 -1 8 0 16 8 4 0 0 0 0 8 1 -8 -8 -16 0 0 0 -4 -8 0 -4 -8 -2 0 0 -4 -4 0 -8 0 0 0 8 0 2 4 8 4 8 0 8 0 0 2 12 8 4 8 -8 -2 -12 -8 -4 1 8 -1 +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 -4 -4 -4 -8 -4 -16 -2 -16 -8 -2 -4 -16 -4 -4 -1 -16 -4 -16 -8 -2 -8 -8 -8 6 16 1 12 16 16 8 4 8 12 12 16 4 24 2 8 8 8 8 4 24 8 4 12 16 16 2 -4 -24 -8 -24 -12 -16 -4 -6 -4 -16 -12 -12 -12 16 4 16 10 8 -1 -10 1 +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 -24 -48 -48 -24 -12 -24 -4 -24 -4 -12 -48 -24 -12 -24 -24 -24 -48 -12 -48 -12 -48 -48 24 48 48 24 48 48 24 48 24 48 48 24 6 24 24 24 24 24 24 12 24 24 24 12 48 12 48 48 6 24 48 24 24 3 48 24 48 48 12 24 48 48 -12 -48 -3 -24 -48 -48 -24 -8 -24 -24 -24 -48 -8 -48 -6 -24 -24 -24 -24 -12 -48 -24 -12 -24 -48 -48 -6 8 48 12 48 24 24 8 12 6 24 24 24 24 -24 -6 -24 -12 -12 1 12 -1 +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 24 48 48 24 12 24 4 24 4 12 48 24 12 24 24 24 48 12 48 12 48 48 24 48 48 24 48 48 24 48 24 48 48 24 6 24 24 24 24 24 24 12 24 24 24 12 48 12 48 48 6 24 48 24 24 3 48 24 48 48 12 24 48 48 12 48 3 24 48 48 24 8 24 24 24 48 8 48 6 24 24 24 24 12 48 24 12 24 48 48 6 8 48 12 48 24 24 8 12 6 24 24 24 24 24 6 24 12 12 1 12 1 +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 -4 -4 -4 -8 -4 -16 -2 -16 -8 -2 -4 -16 -4 -4 -1 -16 -4 -16 -8 -2 -8 -8 -8 -6 -16 -1 -12 -16 -16 -8 -4 -8 -12 -12 -16 -4 -24 -2 -8 -8 -8 -8 -4 -24 -8 -4 -12 -16 -16 -2 -4 -24 -8 -24 -12 -16 -4 -6 -4 -16 -12 -12 -12 -16 -4 -16 -10 -8 -1 -10 -1 +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 -48 -48 -48 -48 48 -48 -48 -48 -48 -24 24 -24 -24 -12 -12 24 -12 -24 24 -48 -48 -24 -12 24 -4 24 -4 12 48 24 -12 24 24 24 48 12 48 -12 48 -48 24 -48 -48 -24 48 -48 -24 -48 -24 -48 -48 -24 6 -24 -24 24 24 24 24 12 -24 -24 24 12 48 -12 48 -48 6 -24 48 -24 -24 3 48 -24 48 -48 -12 24 -48 -48 12 -48 -3 24 -48 -48 -24 8 -24 24 24 -48 8 48 -6 -24 -24 -24 -24 -12 48 -24 -12 24 -48 -48 -6 -8 -48 12 -48 -24 24 -8 -12 6 24 -24 -24 -24 -24 -6 -24 12 -12 1 -12 -1 +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 0 0 0 16 16 2 0 8 -8 -8 -8 -8 -4 -16 -16 0 4 0 0 0 -16 2 0 16 0 0 3 0 0 0 -16 0 0 -16 -16 8 16 3 8 0 0 0 0 8 0 0 16 0 0 2 -8 -8 -8 -8 -4 16 0 4 8 0 0 2 0 0 8 16 8 8 0 8 2 8 8 0 0 8 2 8 8 8 1 8 1 +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 0 0 0 0 0 -8 -4 0 -8 -2 -8 -8 -8 -4 -1 8 0 16 8 4 0 0 0 0 -8 -1 8 8 16 0 0 0 4 8 0 4 8 2 0 0 4 4 0 8 0 0 0 -8 0 -2 4 8 4 8 0 8 0 0 2 12 8 4 8 8 2 12 8 4 1 8 1 +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 16 4 -8 0 -16 -4 0 0 -16 0 -8 0 -4 0 16 -8 -32 -32 0 16 0 0 0 0 32 0 16 -2 -16 0 8 8 8 8 12 16 16 8 -4 -16 -8 -16 0 -2 -16 16 0 0 3 -16 -16 -16 0 -8 8 0 0 8 16 3 0 -16 -16 8 0 -8 0 0 16 0 32 -2 8 8 8 8 12 0 8 -4 0 -16 -16 -2 0 32 4 0 0 8 0 8 6 8 0 0 0 8 6 8 8 4 1 8 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 -2 -8 -8 4 4 0 0 0 0 0 0 0 16 4 8 8 2 8 0 4 0 -1 0 0 -8 -8 -4 0 0 0 0 0 -1 0 0 -8 0 4 0 8 4 -8 0 8 -2 4 4 0 0 0 8 0 0 8 16 8 2 0 8 4 8 8 12 4 0 2 8 0 8 4 12 2 8 8 4 1 8 1 +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 4 -2 4 4 -8 -8 -8 -8 -4 4 4 -8 -4 -16 2 -16 8 -2 4 -16 4 4 -1 -16 4 -16 8 2 -8 8 8 -6 16 1 -12 16 16 8 -4 8 -12 -12 16 -4 -24 2 8 8 8 8 4 -24 8 4 -12 16 16 2 4 24 -8 24 12 -16 4 6 -4 -16 12 12 12 16 4 16 -10 8 -1 10 1 +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 -4 2 4 12 8 8 0 0 4 4 4 0 -4 16 2 0 8 2 4 0 4 -4 -1 0 -4 -16 -8 -6 8 8 8 -2 0 -1 -4 0 -16 8 4 0 4 -4 0 -4 8 2 8 8 0 0 4 -8 0 -4 4 16 0 2 -4 8 -4 -8 4 0 4 -2 0 -8 -4 4 -4 0 0 -8 -6 -4 -1 -6 -1 +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 -8 8 8 -12 -16 8 4 8 4 -24 -24 4 -2 4 -12 8 8 8 8 -4 4 4 -8 -4 16 2 16 8 -2 4 -16 4 4 -1 16 4 16 8 2 -8 8 8 -10 -16 -1 -4 16 16 -8 4 -8 12 12 -16 4 -8 -2 8 8 8 8 -4 -8 -8 -4 -4 16 16 -2 4 -8 -8 -8 -4 0 4 -10 -4 0 -4 12 12 0 -4 0 -6 -8 -1 -6 -1 +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 2 4 4 0 0 8 8 4 4 4 0 -4 -16 -6 0 -8 2 4 0 -4 4 -1 0 -4 16 8 2 8 8 8 -2 0 -1 4 0 16 8 -4 0 -4 4 0 4 8 2 0 0 8 8 4 -8 0 -4 -4 -16 0 2 4 8 -4 -8 -4 -8 -4 -2 0 0 4 -4 4 -8 0 0 -6 -4 -1 -6 -1 +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 0 2 0 8 -2 -4 0 0 0 -1 0 4 0 8 2 0 0 0 -2 0 -1 -4 0 0 0 0 0 0 0 0 0 8 -2 4 4 4 4 4 0 8 4 -4 0 0 -2 0 8 -4 0 -4 -4 0 -2 0 -4 -4 0 0 -4 0 -4 -6 -4 -1 -6 -1 +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 0 0 0 0 -16 -16 2 0 -8 -8 -8 -8 -8 -4 16 16 0 4 0 0 0 16 2 0 16 0 0 3 0 0 0 16 0 0 16 16 8 -16 -3 8 0 0 0 0 -8 0 0 -16 0 0 -2 8 8 8 8 4 16 0 -4 8 0 0 -2 0 0 8 -16 -8 8 0 -8 2 8 -8 0 0 -8 -2 -8 8 -8 1 -8 -1 +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 8 0 2 4 0 0 0 -1 8 4 8 0 2 0 0 0 -2 0 -1 4 8 8 0 0 8 0 0 0 0 -16 2 -4 -4 -4 -4 -4 8 0 4 4 8 8 2 0 -16 0 8 4 -4 0 -2 -4 -4 4 0 0 -4 -4 -4 -6 0 -1 -6 -1 +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 0 6 -24 -12 24 0 0 0 0 12 0 0 -12 24 0 0 0 12 -6 -12 -12 0 0 -12 12 0 -12 12 0 0 24 6 0 0 6 12 24 12 0 3 -24 -12 0 0 6 0 -24 24 6 24 3 -12 -24 0 0 4 0 0 -12 0 0 0 -6 0 0 -12 12 0 0 0 0 12 24 0 6 0 0 0 0 12 0 4 6 0 -12 -12 0 -12 0 0 -12 -6 0 -1 -6 -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 -4 -4 4 8 -8 0 12 -12 0 0 0 -2 8 0 2 4 16 0 12 3 0 4 -8 0 -2 0 8 -8 6 16 3 -4 0 -8 0 0 0 -4 0 8 -4 0 -2 -4 4 8 -8 0 0 0 0 4 0 8 2 -4 0 0 0 4 -4 0 6 0 -8 -4 -4 0 -4 0 -8 -6 0 -1 -6 -1 +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 4 8 -8 -4 4 0 -12 12 0 0 -8 -2 0 0 -2 -4 8 4 0 3 8 4 0 0 -2 0 8 -8 6 8 3 4 8 0 0 -4 0 0 -4 16 0 0 2 8 -8 -4 4 0 0 0 0 -4 -8 0 -2 0 0 0 0 -4 -8 -4 6 0 -4 4 0 -4 -8 0 -4 -6 0 -1 -6 -1 +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 0 0 0 0 -8 4 0 8 -2 8 -8 8 4 -1 8 0 16 -8 -4 0 0 0 0 8 1 8 -8 -16 0 0 0 4 8 0 4 8 -2 0 0 -4 -4 0 8 0 0 0 8 0 2 -4 -8 4 -8 0 8 0 0 2 12 -8 -4 -8 -8 -2 -12 8 -4 1 -8 -1 +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 -4 -8 0 -16 4 0 0 -16 0 -8 0 4 0 -16 -8 32 32 0 16 0 0 0 0 -32 0 -16 -2 16 0 8 8 8 8 12 -16 -16 8 -4 -16 8 -16 0 -2 16 16 0 0 3 -16 16 -16 0 8 8 0 0 8 -16 -3 0 16 16 -8 0 8 0 0 -16 0 32 2 -8 -8 -8 -8 -12 0 -8 4 0 16 16 2 0 -32 4 0 0 8 0 -8 6 8 0 0 0 -8 -6 -8 8 -4 1 -8 -1 +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 0 6 -24 -12 24 0 0 0 0 -12 24 24 0 0 12 0 0 12 6 12 12 -12 12 0 0 0 12 -12 0 0 0 6 -24 0 -6 -12 0 0 -12 3 0 -12 24 0 6 0 -24 24 6 0 3 12 0 24 0 0 0 -12 0 24 4 0 6 -12 12 0 0 0 0 0 0 -12 0 -24 -6 4 0 0 0 -12 -12 0 6 0 0 12 -12 0 -12 0 0 -6 0 -1 -6 -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 0 0 0 0 0 0 16 -4 8 -8 2 -8 0 -4 0 -1 0 0 -8 8 4 0 0 0 0 0 1 0 0 8 0 4 0 8 4 8 0 8 2 -4 -4 0 0 0 8 0 0 8 -16 -8 -2 0 -8 4 -8 -8 12 -4 0 2 8 0 -8 -4 -12 -2 -8 8 -4 1 -8 -1 +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 12 8 -8 16 -16 8 4 8 4 8 4 4 16 8 12 8 24 8 16 4 -16 -4 -16 16 -8 -16 -16 -8 -16 -16 -24 16 -8 -16 16 8 -2 8 -8 -8 -8 8 8 -4 8 8 8 12 -16 4 16 16 -2 8 16 8 24 3 -16 8 16 16 4 -24 -16 -16 4 16 3 -8 -16 16 -24 -8 -8 -8 8 -16 8 -16 -2 -8 -8 8 8 -4 16 8 12 -8 -16 16 -2 8 -16 4 16 -8 -8 -8 4 -2 8 -8 -8 8 -8 -2 8 4 4 1 4 1 +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 -4 0 -1 -8 0 0 0 0 0 0 0 4 0 -1 0 -8 0 0 -4 0 -8 -4 8 0 0 -2 -4 -4 0 0 0 0 0 0 0 -8 0 2 0 0 4 0 0 -4 -4 4 2 0 0 -8 -4 -4 2 0 4 4 1 4 1 +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 -8 -4 0 -4 0 0 -2 -8 0 0 0 3 0 -8 0 0 -4 -8 0 0 4 0 3 0 0 0 -8 0 8 0 0 0 0 -16 -2 0 0 0 0 -4 0 -8 -4 0 0 0 -2 0 -16 4 0 0 0 0 4 -2 0 0 0 0 0 -2 0 4 4 1 4 1 +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 0 -6 -8 0 0 0 3 0 8 0 0 4 0 16 16 4 0 3 -8 0 0 0 0 -8 0 0 0 0 0 -6 0 0 0 0 -4 0 0 4 -8 0 0 -6 0 0 0 0 -8 0 0 4 2 0 -8 0 0 0 2 0 4 0 1 4 1 +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 8 0 0 -8 0 0 8 -8 -4 -8 -1 8 8 0 0 -4 0 0 4 0 0 -8 2 4 -4 0 -8 0 0 0 0 -8 -8 0 -2 0 -8 0 0 -8 -4 -4 -4 -2 8 8 0 4 -4 -2 8 4 0 1 4 1 +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 0 0 -4 -1 0 0 8 8 0 0 -8 8 -4 0 -1 0 0 8 0 0 0 -4 0 -8 4 -8 -2 -8 0 -4 4 0 0 0 0 0 0 -8 2 4 -8 0 0 0 0 0 -4 -2 4 0 -4 0 0 -2 4 4 0 1 4 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 -12 8 8 0 0 4 -4 -4 0 -4 16 -2 0 -8 2 -4 0 -4 4 -1 0 4 -16 8 6 8 -8 -8 -2 0 1 -4 0 16 -8 4 0 4 -4 0 -4 8 -2 -8 -8 0 0 -4 -8 0 4 4 -16 0 -2 4 -8 -4 8 -4 0 -4 2 0 -8 4 -4 4 0 0 8 -6 4 -1 6 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 -16 -16 -16 -16 -8 8 -8 -8 12 12 8 12 24 8 -16 -16 -8 12 8 4 8 4 4 16 8 12 -24 -24 8 16 4 16 12 16 48 24 16 16 8 -16 -48 -24 -48 -24 16 16 8 6 8 8 -8 -8 -8 -8 12 8 8 24 12 -16 4 -16 16 6 8 -16 -24 -24 3 -16 8 -16 16 4 24 16 16 4 -16 3 8 -16 -16 24 -8 24 -24 -24 -16 -8 16 6 -8 -8 -8 -8 12 16 24 12 8 -16 -16 6 -8 16 12 16 8 -8 -8 4 6 -8 8 -24 -24 -8 6 -8 4 12 1 4 1 +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 8 4 -1 0 0 -8 0 0 0 0 0 4 8 -1 0 0 -8 0 0 0 -4 -8 0 -4 0 2 0 0 -4 -4 0 0 0 0 0 0 -8 -2 -4 0 4 0 0 0 0 4 2 -4 0 -4 -8 0 2 -4 4 4 1 4 1 +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 -16 -8 -4 -8 -4 24 24 -4 -2 -4 12 8 8 8 8 -4 -4 -4 -8 -4 16 -2 16 -8 -2 -4 -16 -4 -4 -1 16 -4 16 -8 -2 -8 -8 -8 -10 16 1 -4 -16 -16 8 4 8 12 12 16 4 -8 2 -8 -8 -8 -8 4 -8 8 4 -4 -16 -16 2 -4 8 -8 8 4 0 -4 10 -4 0 4 -12 -12 0 4 0 -6 8 -1 6 1 +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 12 8 -8 -16 16 -8 4 8 4 8 4 4 16 8 12 -8 -24 8 16 4 -16 -4 -16 16 -8 -16 -16 -8 16 16 24 -16 8 -16 16 8 -2 8 -8 8 8 -8 -8 -4 8 8 8 12 16 4 -16 16 -2 8 -16 -8 -24 3 16 8 -16 16 4 -24 -16 -16 4 -16 3 -8 16 -16 -24 8 -8 8 -8 16 -8 -16 -2 8 8 -8 -8 -4 16 8 12 -8 16 -16 -2 -8 -16 4 16 -8 8 8 4 -2 -8 -8 8 -8 8 -2 -8 4 4 1 4 1 +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 -4 0 -1 -8 0 0 -8 0 0 -8 8 -4 -8 -1 0 -8 0 0 4 0 0 -4 0 0 -8 2 -4 4 -8 0 0 0 0 0 0 8 0 -2 0 -8 0 0 0 4 4 -4 -2 0 0 0 -4 4 -2 0 4 0 1 4 1 +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 0 0 -8 8 0 0 8 -8 -4 0 -1 -8 0 -8 0 0 0 4 0 -8 -4 -8 -2 0 -8 4 -4 0 0 0 0 8 0 8 2 -4 -8 0 0 8 8 0 -4 -2 -4 -8 4 0 8 -2 -4 4 0 1 4 1 +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 -4 0 0 8 8 4 -4 -4 0 -4 -16 6 0 8 2 -4 0 4 -4 -1 0 4 16 -8 -2 8 -8 -8 -2 0 1 4 0 -16 -8 -4 0 -4 4 0 4 8 -2 0 0 -8 -8 -4 -8 0 4 -4 16 0 -2 -4 -8 -4 8 4 -8 4 2 0 0 -4 4 -4 8 0 0 -6 4 -1 6 1 +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 -16 8 6 8 8 0 0 0 0 -4 8 8 -24 -4 0 4 0 -16 6 8 0 0 0 3 0 8 0 -16 4 8 16 16 4 0 3 8 0 0 8 0 -8 0 0 0 0 -16 6 0 0 0 0 -4 -16 -24 -4 8 0 0 6 0 -16 4 -16 8 0 0 4 -2 0 8 0 0 0 -2 0 4 4 1 4 1 +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 -4 0 16 2 8 0 0 0 3 0 -8 0 16 -4 0 0 0 4 0 3 0 0 0 0 0 -8 0 0 0 0 0 2 0 0 0 0 -4 -16 0 -12 0 0 0 2 0 0 0 -16 0 0 0 4 2 0 0 0 0 0 2 0 4 0 1 4 1 +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 0 -8 -2 4 0 0 0 -1 0 -4 0 -8 -2 0 0 0 -2 0 1 -4 0 0 0 0 0 0 0 0 0 8 2 -4 -4 -4 -4 -4 0 -8 -4 -4 0 0 2 0 -8 -4 0 4 -4 0 2 0 -4 4 0 0 4 0 4 -6 4 -1 6 1 +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 0 0 0 0 0 16 -16 8 -2 8 -8 0 0 0 0 12 8 8 -8 -4 0 4 0 -16 -2 8 0 0 0 3 0 8 0 -16 4 -8 -16 -16 4 0 3 -8 0 0 -8 0 -8 0 0 0 0 16 -2 0 0 0 0 12 -16 -8 -4 -8 0 0 -2 0 16 -4 -16 -8 0 0 4 6 0 -8 0 0 0 6 0 4 -4 1 4 1 +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 0 8 -8 0 0 -8 0 0 -8 -2 0 -8 -8 4 -1 8 8 -16 8 -8 0 0 0 -4 -8 -1 0 8 -16 0 0 0 -4 8 0 -4 8 2 -8 8 12 -4 0 -8 0 0 -8 -8 0 -2 -4 8 -4 -8 -8 0 0 -4 2 4 0 -4 8 0 2 4 4 -4 1 4 1 +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 0 -8 8 0 0 8 8 -16 -8 -2 0 -8 8 -4 -1 -8 -8 0 8 0 0 0 0 -4 -8 -1 0 -8 0 0 0 0 4 -8 0 4 8 2 8 -8 -4 12 0 -8 0 0 -8 8 -16 -2 4 8 -4 -8 -8 0 0 -4 2 4 0 4 -8 0 2 4 4 -4 1 4 1 +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 -8 8 0 -8 8 0 0 -16 -8 8 8 2 0 0 -4 0 -1 0 8 -8 -8 0 0 0 0 -4 0 -1 -8 0 -8 0 -4 0 8 -4 -8 0 8 -2 12 -4 -8 8 0 -8 0 0 0 -16 8 2 0 8 -4 -8 0 4 -4 -4 2 0 -8 8 -4 4 2 0 4 -4 1 4 1 +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 -8 0 8 -8 0 0 0 0 -8 8 2 0 0 4 0 -1 -16 -8 8 -8 8 0 0 0 -4 0 -1 -8 -16 8 0 4 0 -8 4 -8 0 8 -2 -4 12 8 -8 0 -8 0 0 0 0 -8 2 0 8 -4 -8 0 4 4 -4 2 0 -8 -8 4 4 2 0 4 -4 1 4 1 +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 2 -4 0 0 0 -1 8 -4 8 0 -2 0 0 0 -2 0 1 4 -8 -8 0 0 -8 0 0 0 0 -16 -2 4 4 4 4 4 8 0 -4 4 -8 -8 -2 0 16 0 -8 -4 -4 0 2 -4 -4 -4 0 0 4 4 4 -6 0 -1 6 1 +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 -24 12 24 0 0 0 0 -12 0 0 12 -24 0 0 0 -12 -6 12 12 0 0 -12 12 0 12 -12 0 0 24 -6 0 0 6 -12 24 -12 0 3 -24 12 0 0 -6 0 24 -24 6 -24 -3 -12 24 0 0 4 0 0 -12 0 0 0 6 0 0 12 -12 0 0 0 0 12 -24 0 -6 0 0 0 0 -12 0 -4 -6 0 -12 12 0 12 0 0 12 -6 0 -1 6 1 +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 -4 4 8 -8 0 -12 12 0 0 0 2 8 0 2 -4 16 0 -12 3 0 -4 -8 0 2 0 -8 8 6 -16 -3 -4 0 8 0 0 0 -4 0 -8 -4 0 2 4 -4 -8 8 0 0 0 0 4 0 -8 -2 4 0 0 0 -4 -4 0 -6 0 -8 4 4 0 4 0 8 -6 0 -1 6 1 +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 -4 8 -8 -4 4 0 12 -12 0 0 -8 2 0 0 -2 4 8 -4 0 3 8 -4 0 0 2 0 -8 8 6 -8 -3 4 -8 0 0 -4 0 0 -4 -16 0 0 -2 -8 8 4 -4 0 0 0 0 -4 8 0 2 0 0 0 0 4 -8 4 -6 0 -4 -4 0 4 8 0 4 -6 0 -1 6 1 +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 6 -24 12 24 0 0 0 0 12 24 -24 0 0 -12 0 0 -12 6 -12 -12 -12 12 0 0 0 -12 12 0 0 0 -6 -24 0 -6 12 0 0 12 3 0 12 24 0 -6 0 24 -24 6 0 -3 12 0 -24 0 0 0 -12 0 -24 4 0 -6 12 -12 0 0 0 0 0 0 -12 0 24 6 -4 0 0 0 12 -12 0 -6 0 0 -12 12 0 12 0 0 -6 0 -1 6 1 +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 0 0 -8 -8 4 -4 -4 0 -4 0 -2 -16 -8 2 -4 0 4 -4 -1 16 4 0 8 6 8 -8 -8 -6 0 -1 12 16 0 8 4 0 4 -4 0 -4 8 2 0 0 -8 -8 4 -8 0 -4 4 0 -16 2 -4 8 -4 -8 4 8 4 -6 0 0 12 4 -4 8 0 0 -2 -4 -1 -2 -1 +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 0 0 0 -4 -4 -4 -8 -4 0 -2 0 -8 -2 -4 -16 -12 -4 -1 0 -4 0 -8 -2 8 8 8 2 -16 -1 4 0 0 8 4 8 4 -4 16 -4 8 -2 0 0 0 0 -4 -8 -8 -4 4 0 0 -2 -4 8 0 -8 4 8 4 2 4 -8 4 4 -4 8 4 -8 -2 0 -1 -2 -1 +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 -12 -8 -8 -16 16 -8 -4 8 -4 8 -4 4 16 8 -12 8 24 8 16 4 -16 4 -16 -16 -8 16 16 8 -16 16 24 -16 8 16 -16 -8 -2 -8 8 -8 -8 8 8 -4 -8 -8 8 12 -16 -4 16 -16 -2 -8 16 -8 -24 3 -16 -8 16 -16 -4 -24 16 16 4 -16 -3 -8 16 -16 24 -8 8 -8 8 16 8 -16 2 8 8 -8 -8 4 16 -8 -12 -8 16 -16 2 -8 16 4 -16 8 -8 8 -4 -2 8 8 8 -8 8 2 -8 4 -4 1 -4 -1 +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 -4 -4 -4 -8 -4 0 -2 0 -8 -2 -4 16 4 4 -1 0 -4 0 -8 -2 -8 -8 -8 2 16 -1 -4 0 0 -8 4 -8 12 12 16 4 -8 -2 0 0 0 0 -4 -8 -8 -4 -4 0 0 -2 4 -8 -8 -8 -4 8 4 2 -4 8 -4 12 12 8 -4 8 -2 -8 -1 -2 -1 +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 -8 -2 4 0 0 0 -1 0 -4 0 -8 -2 0 0 0 -6 0 -1 -4 0 0 0 0 0 0 0 0 0 8 -2 -4 -4 -4 -4 4 16 8 4 -4 0 0 -2 0 8 -4 16 -4 4 0 -6 0 4 -4 0 0 4 0 4 -2 -4 -1 -2 -1 +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 0 2 -4 0 0 0 -1 -8 -4 -8 0 -2 0 0 0 -6 0 -1 4 -8 -8 0 0 8 0 0 0 0 0 2 4 4 4 4 -4 8 0 4 4 -8 -8 2 0 0 0 8 4 4 0 -6 -4 4 4 0 0 4 -4 4 -2 0 -1 -2 -1 +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 -4 -8 8 -4 4 0 -4 4 0 0 -8 -6 0 0 -2 -12 8 -4 0 3 8 12 0 0 -6 0 -8 8 2 8 3 -4 8 0 0 4 0 0 4 -16 0 0 2 -8 8 -4 4 0 0 0 0 4 -8 0 -2 0 0 0 0 4 8 4 2 0 -4 -4 0 4 8 0 -4 -2 0 -1 -2 -1 +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 -8 0 2 -4 0 0 -12 3 0 -4 8 0 2 0 8 -8 2 0 3 -4 0 8 0 0 0 4 0 -8 4 0 -2 4 -4 0 0 0 0 0 0 4 0 -8 2 4 0 0 0 4 4 0 2 0 0 -4 4 0 4 0 0 -2 0 -1 -2 -1 +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 0 4 -4 0 0 0 2 8 0 -6 -4 0 0 12 3 0 -4 -8 0 2 0 -8 8 2 0 3 4 0 -8 0 0 0 12 0 -8 -4 0 6 4 -4 0 0 0 0 0 0 -4 0 8 -6 -4 0 0 0 -4 4 0 2 0 0 4 12 0 4 0 0 -2 0 -1 -2 -1 +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 0 0 -2 4 -8 -4 0 3 -8 -4 0 0 2 0 8 -8 2 -8 3 4 -8 0 0 4 0 0 4 0 0 0 2 0 0 4 -4 0 0 0 0 -4 8 0 -2 0 0 0 0 -4 0 4 2 0 4 4 0 4 0 0 4 -2 0 -1 -2 -1 +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 4 0 -1 -8 0 0 0 0 0 0 0 4 0 1 0 8 0 0 -4 0 -8 -4 -8 0 0 2 4 4 0 0 0 0 0 0 0 8 0 -2 0 0 4 0 0 -4 4 -4 2 0 0 8 4 4 -2 0 4 -4 1 -4 -1 +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 4 -8 -8 0 0 4 -4 -4 0 -4 0 6 16 8 2 -4 0 -4 4 -1 -16 4 0 -8 -2 8 -8 -8 -6 0 -1 4 -16 0 8 -4 0 -4 4 0 4 8 2 -8 -8 0 0 4 -8 0 -4 12 0 16 2 4 8 -4 -8 12 0 -4 -6 0 8 4 -4 4 0 0 8 -2 -4 -1 -2 -1 +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 0 6 0 -8 2 4 0 0 0 -1 0 4 0 8 -2 0 0 0 2 0 -1 -4 0 0 0 0 -8 0 0 0 0 8 2 -4 -4 4 4 -4 0 0 4 4 0 0 2 0 8 0 0 4 4 0 2 4 -4 -4 0 0 4 4 -4 -2 0 -1 -2 -1 +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 4 0 -2 0 8 2 4 0 0 0 -1 0 4 0 -8 6 0 0 0 2 0 -1 4 0 0 0 0 -8 0 0 0 0 8 2 4 4 -4 -4 -4 0 0 4 -4 0 0 2 0 8 0 0 -4 -4 0 2 4 4 4 0 0 -4 4 4 -2 0 -1 -2 -1 +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 -8 -8 -4 0 4 0 0 -2 8 0 0 0 3 0 8 0 0 4 -8 0 0 4 0 -3 0 0 0 8 0 -8 0 0 0 0 -16 2 0 0 0 0 4 0 8 4 0 0 0 2 0 16 4 0 0 0 0 -4 -2 0 0 0 0 0 2 0 4 -4 1 -4 -1 +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 -2 -8 0 2 4 0 4 4 -1 -8 -4 8 0 -2 -8 -8 -8 2 0 -1 4 -8 8 -8 4 0 -4 -4 0 4 0 2 0 0 0 0 4 0 0 -4 4 8 -8 2 4 0 4 0 4 0 4 2 0 0 4 -4 -4 0 0 0 -2 4 -1 -2 -1 +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 -2 8 0 2 4 0 -4 -4 -1 8 -4 -8 0 -2 -8 -8 -8 2 0 -1 4 8 -8 -8 -4 0 4 4 0 -4 0 2 0 0 0 0 4 0 0 -4 4 -8 8 2 -4 0 4 0 4 0 -4 2 0 0 4 4 4 0 0 0 -2 4 -1 -2 -1 +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 -6 8 0 0 0 3 0 -8 0 0 -4 0 -16 -16 4 0 -3 -8 0 0 0 0 8 0 0 0 0 0 6 0 0 0 0 4 0 0 -4 -8 0 0 6 0 0 0 0 8 0 0 -4 2 0 8 0 0 0 -2 0 4 0 1 -4 -1 +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 -8 0 -8 0 8 24 -8 -4 0 8 4 8 -12 -8 -8 -4 -2 -4 12 -16 0 0 16 -4 -4 -4 8 -4 0 -10 0 -8 -2 -4 0 -12 4 -1 0 -4 0 24 6 -8 -8 -8 2 0 -1 -12 0 0 -8 4 8 -4 -4 0 4 8 -2 -16 0 0 16 -4 8 8 -4 4 0 0 -2 4 8 0 8 4 8 4 2 4 -8 -12 -4 -4 8 4 -8 -2 0 -1 -2 -1 +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 -2 8 0 -2 -4 0 0 0 -1 -8 4 8 -16 6 0 0 0 2 0 -1 -4 -8 8 0 0 0 0 0 0 0 0 -2 4 4 -4 -4 4 8 -8 4 4 -8 8 -2 0 0 4 8 4 4 0 2 0 -4 -4 0 0 4 0 -4 -2 4 -1 -2 -1 +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 -4 0 -1 8 0 0 8 0 0 -8 8 -4 8 1 8 -8 0 0 -4 0 0 4 0 0 -8 -2 -4 4 0 8 0 0 0 0 -8 8 0 2 0 8 0 0 8 -4 4 4 -2 8 -8 0 -4 4 2 -8 4 0 1 -4 -1 +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 8 -8 8 -8 -4 -4 -4 8 -4 0 -2 0 8 -2 -4 0 12 -4 -1 0 -4 0 8 -2 -8 -8 -8 2 0 -1 -4 0 0 -8 -4 8 4 4 0 -4 8 -2 8 -8 8 -8 -4 8 8 -4 -4 0 0 -2 -4 8 0 8 -4 0 -4 2 4 0 -4 4 4 0 4 0 -2 0 -1 -2 -1 +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 0 4 -1 0 0 8 -8 0 0 8 -8 -4 0 1 0 0 -8 0 0 0 -4 0 8 4 -8 2 8 0 4 -4 0 0 0 0 0 0 8 -2 -4 8 0 0 0 0 0 4 -2 4 0 4 0 0 2 -4 4 0 1 -4 -1 +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 16 16 16 8 8 8 8 -12 -12 8 -12 -24 8 16 16 8 -12 8 -4 8 -4 4 16 8 -12 -24 -24 8 16 4 16 -12 16 -48 24 -16 -16 -8 -16 48 24 48 24 -16 -16 -8 6 -8 -8 -8 -8 -8 -8 12 -8 -8 24 12 -16 -4 -16 -16 6 -8 -16 24 24 3 -16 -8 -16 -16 -4 24 -16 -16 4 16 -3 8 16 16 -24 -8 -24 -24 -24 16 -8 16 -6 8 8 8 8 -12 16 -24 -12 8 16 16 -6 8 -16 12 -16 -8 -8 8 -4 6 -8 -8 24 24 8 -6 8 4 -12 1 -4 -1 +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 0 -4 4 0 0 -8 2 0 0 6 4 -8 -12 0 3 8 -4 0 0 2 0 -8 8 2 -8 3 -4 8 0 0 -4 0 0 12 0 0 0 -6 0 0 4 -4 0 0 0 0 4 -8 0 6 0 0 0 0 4 0 -4 2 0 4 -4 0 12 0 0 4 -2 0 -1 -2 -1 +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 -4 4 -8 8 0 4 -4 0 0 0 -6 8 0 2 12 -16 0 -12 3 0 12 -8 0 -6 0 -8 8 2 -16 3 4 0 -8 0 0 0 4 0 8 4 0 -2 -4 4 -8 8 0 0 0 0 -4 0 8 2 4 0 0 0 -4 -4 0 2 0 8 4 4 0 -4 0 8 -2 0 -1 -2 -1 +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 -4 -1 0 0 -8 0 0 0 0 0 4 -8 1 0 0 8 0 0 0 -4 -8 0 -4 0 -2 0 0 4 4 0 0 0 0 0 0 8 2 4 0 4 0 0 0 0 -4 2 -4 0 4 8 0 -2 4 4 -4 1 -4 -1 +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 0 0 0 0 -4 -4 -4 -8 -4 0 -2 0 -8 -2 -4 16 12 4 -1 0 -4 0 -8 -2 8 8 8 2 16 -1 4 0 0 8 -4 8 -4 4 -16 4 8 -2 0 0 0 0 -4 -8 -8 -4 4 0 0 -2 4 8 0 -8 4 -8 -4 2 4 8 4 -4 4 -8 4 8 -2 0 -1 -2 -1 +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 -12 -8 -8 16 -16 8 -4 8 -4 8 -4 4 16 8 -12 -8 -24 8 16 4 -16 4 -16 -16 -8 16 16 8 16 -16 -24 16 -8 16 -16 -8 -2 -8 8 8 8 -8 -8 -4 -8 -8 8 12 16 -4 -16 -16 -2 -8 -16 8 24 3 16 -8 -16 -16 -4 -24 16 16 4 16 -3 -8 -16 16 24 8 8 8 -8 -16 -8 -16 2 -8 -8 8 8 4 16 -8 -12 -8 -16 16 2 8 16 4 -16 8 8 -8 -4 -2 -8 8 -8 8 -8 2 8 4 -4 1 -4 -1 +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 -8 -16 -2 -4 0 0 0 -1 8 4 -8 0 -2 0 0 0 2 0 -1 4 8 -8 0 0 0 0 0 0 0 0 -2 -4 -4 4 4 4 8 -8 4 -4 8 -8 -2 0 0 4 8 -4 -4 0 2 0 4 4 0 0 -4 0 4 -2 4 -1 -2 -1 +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 -8 4 0 -1 -8 0 0 8 0 0 8 -8 -4 8 1 0 8 0 0 4 0 0 -4 0 0 -8 -2 4 -4 8 0 0 0 0 0 0 -8 0 2 0 8 0 0 0 4 -4 4 -2 0 0 0 4 -4 2 0 4 0 1 -4 -1 +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 -8 0 -8 0 8 -8 24 12 0 8 4 8 -12 -8 -8 -4 -2 -4 -4 0 16 -16 0 -4 -4 -4 8 -4 0 6 0 24 -2 -4 0 -12 4 -1 0 -4 0 -8 -10 -8 -8 -8 2 0 -1 4 0 0 -8 4 8 -4 -4 0 4 8 -2 0 16 -16 0 -4 8 8 -4 -12 0 0 -2 4 8 0 8 -12 -8 4 2 4 8 4 -4 -4 -8 4 8 -2 0 -1 -2 -1 +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 -4 -1 0 0 -8 -8 0 0 -8 8 -4 0 1 -8 0 8 0 0 0 4 0 8 -4 -8 2 0 8 -4 4 0 0 0 0 8 0 -8 -2 4 8 0 0 -8 8 0 4 -2 -4 8 -4 0 -8 2 4 4 0 1 -4 -1 +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 0 0 16 16 -8 6 -8 -8 0 0 0 0 -4 -8 -8 -24 -4 0 -4 0 16 6 -8 0 0 0 3 0 -8 0 16 -4 8 -16 -16 4 0 -3 8 0 0 -8 0 8 0 0 0 0 -16 -6 0 0 0 0 4 -16 24 4 8 0 0 -6 0 16 4 16 -8 0 0 -4 -2 0 -8 0 0 0 2 0 4 -4 1 -4 -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 0 -16 2 -8 0 0 0 3 0 8 0 -16 4 0 0 0 4 0 -3 0 0 0 0 0 8 0 0 0 0 0 -2 0 0 0 0 4 -16 0 12 0 0 0 -2 0 0 0 16 0 0 0 -4 2 0 0 0 0 0 -2 0 4 0 1 -4 -1 +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 8 -8 -8 8 -4 -4 -4 8 -4 0 -2 0 8 -2 -4 0 -4 4 -1 0 -4 0 8 -2 8 8 8 2 0 -1 4 0 0 8 -4 -8 12 -12 0 4 -8 -2 8 -8 -8 8 -4 8 8 -4 4 0 0 -2 4 -8 8 8 4 0 -4 2 -4 0 4 12 -12 0 -4 0 -2 8 -1 -2 -1 +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 -8 8 8 -8 -4 -4 -4 8 -4 0 -2 0 8 -2 -4 0 4 -4 -1 0 -4 0 8 -2 8 8 8 2 0 -1 4 0 0 8 4 -8 -12 12 0 -4 -8 -2 -8 8 8 -8 -4 8 8 -4 4 0 0 -2 -4 -8 8 8 4 0 4 2 -4 0 4 -12 12 0 -4 0 -2 8 -1 -2 -1 +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 0 0 0 0 0 -16 16 -8 -2 -8 8 0 0 0 0 12 -8 -8 -8 -4 0 -4 0 16 -2 -8 0 0 0 3 0 -8 0 16 -4 -8 16 16 4 0 -3 -8 0 0 8 0 8 0 0 0 0 16 2 0 0 0 0 -12 -16 8 4 -8 0 0 2 0 -16 -4 16 8 0 0 -4 6 0 8 0 0 0 -6 0 4 4 1 -4 -1 +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 0 -8 8 0 0 -8 0 0 8 -2 0 -8 8 -4 -1 8 -8 -16 -8 8 0 0 0 -4 8 1 0 -8 16 0 0 0 -4 8 0 -4 8 -2 8 -8 -12 4 0 -8 0 0 -8 8 0 2 4 -8 -4 8 8 0 0 4 2 4 0 4 -8 0 -2 -4 4 4 1 -4 -1 +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 12 0 8 -8 0 0 8 -8 -16 8 -2 0 -8 -8 4 -1 -8 8 0 -8 0 0 0 0 -4 8 1 0 8 0 0 0 0 4 -8 0 4 8 -2 -8 8 4 -12 0 -8 0 0 -8 -8 16 2 -4 -8 -4 8 8 0 0 4 2 4 0 -4 8 0 -2 -4 4 4 1 -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 -8 8 0 8 -8 0 0 -16 8 8 -8 2 0 0 4 0 -1 0 -8 -8 8 0 0 0 0 -4 0 1 -8 0 8 0 -4 0 8 -4 8 0 8 2 -12 4 8 -8 0 -8 0 0 0 16 -8 -2 0 -8 -4 8 0 4 4 4 2 0 8 -8 4 -4 -2 0 4 4 1 -4 -1 +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 8 -8 0 -8 8 0 0 0 0 -8 -8 2 0 0 -4 0 -1 -16 8 8 8 -8 0 0 0 -4 0 1 -8 16 -8 0 4 0 -8 4 8 0 8 2 4 -12 -8 8 0 -8 0 0 0 0 8 -2 0 -8 -4 8 0 4 -4 4 2 0 8 8 -4 -4 -2 0 4 4 1 -4 -1 +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 0 0 0 0 16 0 2 16 -8 8 8 8 8 -4 0 0 0 4 0 -8 0 -16 2 16 -16 0 0 3 0 -16 0 -16 -8 0 16 16 0 -16 3 -8 0 0 0 0 8 0 0 -16 0 0 2 8 8 8 8 -4 16 0 4 -8 0 0 2 0 0 8 16 -8 -8 0 0 2 -8 -8 0 0 -8 2 -8 0 8 1 0 1 +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 4 0 0 0 0 0 8 4 16 8 -2 -8 -8 -8 -4 -1 -8 0 0 -8 -4 0 0 0 8 -8 -1 -8 -8 0 0 0 0 4 8 0 4 -8 2 0 0 4 4 0 -8 0 0 0 8 16 -2 4 -8 4 -8 0 -8 0 8 2 -4 -8 4 8 -8 2 -4 0 4 1 0 1 +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 0 -4 -1 -8 0 0 0 4 0 8 -8 0 0 -1 -8 -8 0 0 0 0 -4 0 8 4 0 -2 8 0 4 -4 0 8 0 0 0 8 0 2 4 0 0 8 0 -8 0 0 -2 4 -8 -4 0 -8 -2 4 0 0 1 0 1 +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 4 0 -1 0 0 -8 0 -4 0 -8 8 0 8 -1 -8 0 -8 0 -4 0 0 4 0 0 0 2 -4 4 0 8 0 8 0 0 0 0 8 -2 0 0 0 8 0 -4 -4 0 -2 0 -8 0 4 -4 -2 0 0 0 1 0 1 +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 -4 2 4 4 0 0 -8 -8 4 4 4 0 -4 0 2 -16 8 2 4 0 -4 4 -1 16 -4 0 -8 -6 8 8 8 -6 0 1 12 -16 0 -8 4 0 4 -4 0 -4 8 -2 0 0 8 8 -4 -8 0 4 4 0 16 -2 4 -8 -4 8 -4 8 -4 6 0 0 -12 -4 4 -8 0 0 -2 4 -1 2 1 +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 2 0 16 0 0 3 0 0 0 0 0 0 0 0 0 16 3 0 0 0 0 0 -8 0 0 -16 0 0 2 8 8 -8 -8 12 0 0 4 0 0 0 2 0 0 0 0 0 -8 0 0 -6 8 0 0 0 -8 -6 8 0 0 1 0 1 +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 -16 0 0 0 0 0 0 0 6 0 0 -8 -8 8 8 -4 0 0 24 -4 16 0 -16 0 6 0 16 0 0 3 16 0 -16 0 0 -8 0 0 0 16 3 0 16 -16 -8 0 -8 0 0 -16 0 0 6 -8 -8 8 8 -4 0 24 -4 0 16 -16 6 0 0 -4 0 0 -8 0 0 -2 8 0 0 0 -8 -2 8 0 -4 1 0 1 +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 0 0 0 0 -4 4 4 -8 -4 0 2 0 8 -2 4 -16 12 4 -1 0 4 0 8 2 8 -8 -8 2 16 1 4 0 0 -8 4 -8 4 -4 -16 -4 8 2 0 0 0 0 4 -8 8 4 4 0 0 2 4 -8 0 8 -4 8 -4 -2 4 -8 -4 -4 4 -8 -4 8 -2 0 -1 2 1 +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 0 0 0 -16 0 2 -16 8 8 8 8 8 -4 0 0 0 4 0 8 0 16 2 -16 -16 0 0 3 0 16 0 16 8 0 -16 -16 0 -16 3 8 0 0 0 0 8 0 0 -16 0 0 2 8 8 8 8 -4 -16 0 4 8 0 0 2 0 0 8 -16 8 -8 0 0 2 -8 8 0 0 -8 2 -8 0 8 1 0 1 +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 0 -16 0 0 0 0 0 0 0 -2 0 0 -8 -8 -8 -8 12 0 0 8 -4 16 0 16 0 -2 0 -16 0 0 3 16 0 16 0 0 8 0 0 0 -16 3 0 16 16 8 0 -8 0 0 -16 0 0 -2 -8 -8 -8 -8 12 0 8 -4 0 16 16 -2 0 0 4 0 0 -8 0 0 6 -8 0 0 0 -8 6 -8 0 4 1 0 1 +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 0 0 4 4 0 0 0 0 0 8 -4 16 -8 -2 8 -8 8 4 -1 -8 0 0 8 4 0 0 0 -8 -8 -1 8 -8 0 0 0 0 -4 -8 0 -4 8 2 0 0 4 4 0 8 0 0 0 8 16 -2 -4 8 4 8 0 -8 0 -8 2 -4 8 -4 -8 -8 2 -4 0 4 1 0 1 +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 4 4 0 0 0 0 0 0 0 0 4 -8 8 2 -8 0 -4 0 -1 16 0 8 -8 -4 0 0 0 -8 0 -1 0 16 8 0 -4 0 -8 -4 -8 0 8 -2 4 4 0 0 0 8 0 0 8 0 -8 2 0 8 4 8 8 -4 -4 -8 2 -8 0 -8 -4 -4 2 -8 0 4 1 0 1 +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 0 -4 4 4 -8 -4 0 2 0 8 -2 4 16 -4 -4 -1 0 4 0 8 2 -8 8 8 2 -16 1 -4 0 0 8 4 8 12 12 -16 4 -8 2 0 0 0 0 4 -8 8 4 -4 0 0 2 -4 8 -8 8 4 8 -4 -2 -4 8 4 -12 -12 -8 4 -8 -2 8 -1 2 1 +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 4 4 0 0 0 0 0 0 0 0 -4 -8 -8 2 8 0 4 0 -1 16 0 8 8 4 0 0 0 8 0 -1 0 16 8 0 4 0 8 4 -8 0 -8 -2 4 4 0 0 0 -8 0 0 -8 0 -8 2 0 -8 4 -8 -8 -4 4 8 2 -8 0 8 4 -4 2 -8 0 4 1 0 1 +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 0 4 -1 -8 0 0 0 -4 0 -8 8 0 0 -1 8 -8 0 0 0 0 4 0 8 -4 0 -2 8 0 4 -4 0 -8 0 0 0 8 0 2 -4 0 0 -8 0 -8 0 0 -2 4 8 4 0 -8 -2 4 0 0 1 0 1 +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 8 -4 0 -1 0 0 -8 0 4 0 8 -8 0 8 -1 8 0 -8 0 4 0 0 -4 0 0 0 2 -4 4 0 8 0 -8 0 0 0 0 8 -2 0 0 0 -8 0 -4 4 0 -2 0 8 0 -4 -4 -2 0 0 0 1 0 1 +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 0 0 -4 -1 8 0 0 0 -4 0 8 -8 0 0 -1 0 8 0 0 0 0 -4 0 8 4 0 -2 0 8 -4 4 0 -8 0 0 8 -8 0 2 4 0 0 -8 8 0 0 0 -2 -4 0 -4 0 0 -2 -4 0 0 1 0 1 +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 8 4 0 -1 0 0 8 0 4 0 -8 8 0 8 -1 0 0 8 0 -4 0 0 4 0 0 0 2 4 -4 8 0 0 -8 0 0 8 0 -8 -2 0 0 0 -8 8 4 -4 0 -2 -8 0 0 4 4 -2 -8 0 0 1 0 1 +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 2 0 8 -2 -4 0 0 0 -1 0 4 0 8 2 0 0 0 -6 0 1 -4 0 0 0 0 0 0 0 0 0 8 2 4 4 4 4 -4 16 -8 -4 -4 0 0 2 0 -8 -4 -16 4 4 0 6 0 4 4 0 0 -4 0 -4 -2 4 -1 2 1 +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 -4 0 -1 8 -8 0 0 4 0 0 0 0 0 -1 0 8 0 0 -4 0 8 -4 8 0 0 -2 -4 -4 0 0 0 0 0 0 0 8 0 2 0 0 -4 0 0 -4 -4 0 2 0 0 8 -4 -4 2 0 0 -4 1 0 1 +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 -8 4 -1 0 -8 8 0 4 0 0 0 0 8 -1 0 0 8 0 0 0 -4 8 0 -4 0 2 0 0 -4 -4 0 0 0 0 0 0 8 -2 -4 0 -4 0 0 0 0 0 2 -4 0 -4 8 0 2 -4 0 -4 1 0 1 +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 4 0 -1 8 8 0 0 -4 0 0 0 0 0 -1 0 8 0 0 4 0 -8 4 8 0 0 -2 -4 -4 0 0 0 0 0 0 0 8 0 2 0 0 -4 0 0 -4 4 0 2 0 0 -8 4 -4 2 0 0 -4 1 0 1 +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 8 -4 -1 0 8 8 0 -4 0 0 0 0 8 -1 0 0 8 0 0 0 4 -8 0 4 0 2 0 0 -4 -4 0 0 0 0 0 0 8 -2 4 0 -4 0 0 0 0 0 2 -4 0 4 -8 0 2 -4 0 -4 1 0 1 +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 2 -8 0 2 4 0 0 0 -1 -8 4 -8 0 2 0 0 0 -6 0 1 4 8 8 0 0 -8 0 0 0 0 0 -2 -4 -4 -4 -4 4 8 0 -4 4 8 8 -2 0 0 0 -8 -4 4 0 6 -4 4 -4 0 0 -4 4 -4 -2 0 -1 2 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 4 -8 8 -4 4 0 4 -4 0 0 -8 6 0 0 -2 12 8 4 0 3 8 -12 0 0 6 0 8 -8 2 -8 -3 -4 -8 0 0 4 0 0 4 16 0 0 -2 8 -8 4 -4 0 0 0 0 4 8 0 2 0 0 0 0 -4 8 -4 -2 0 -4 4 0 -4 -8 0 4 -2 0 -1 2 1 +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 0 0 4 -1 8 0 0 0 4 0 -8 8 0 0 -1 0 8 0 0 0 0 4 0 8 -4 0 -2 0 8 -4 4 0 8 0 0 -8 -8 0 2 -4 0 0 8 -8 0 0 0 -2 -4 0 4 0 0 -2 -4 0 0 1 0 1 +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 -2 -8 0 2 4 0 0 12 3 0 4 8 0 -2 0 -8 8 2 0 -3 -4 0 -8 0 0 0 4 0 8 4 0 2 -4 4 0 0 0 0 0 0 4 0 8 -2 -4 0 0 0 -4 4 0 -2 0 0 4 -4 0 -4 0 0 -2 0 -1 2 1 +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 -4 4 0 0 0 -2 8 0 -6 4 0 0 -12 3 0 4 -8 0 -2 0 8 -8 2 0 -3 4 0 8 0 0 0 12 0 8 -4 0 -6 -4 4 0 0 0 0 0 0 -4 0 -8 6 4 0 0 0 4 4 0 -2 0 0 -4 -12 0 -4 0 0 -2 0 -1 2 1 +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 0 -2 -4 -8 4 0 3 -8 4 0 0 -2 0 -8 8 2 8 -3 4 8 0 0 4 0 0 4 0 0 0 -2 0 0 -4 4 0 0 0 0 -4 -8 0 2 0 0 0 0 4 0 -4 -2 0 4 -4 0 -4 0 0 -4 -2 0 -1 2 1 +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 8 -4 0 -1 0 0 8 0 -4 0 8 -8 0 8 -1 0 0 8 0 4 0 0 -4 0 0 0 2 4 -4 8 0 0 8 0 0 -8 0 -8 -2 0 0 0 8 -8 4 4 0 -2 -8 0 0 -4 4 -2 -8 0 0 1 0 1 +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 4 -4 -8 -8 0 0 4 4 4 0 -4 0 -6 16 -8 2 4 0 4 -4 -1 -16 -4 0 8 2 8 8 8 -6 0 1 4 16 0 -8 -4 0 -4 4 0 4 8 -2 8 8 0 0 -4 -8 0 4 12 0 -16 -2 -4 -8 -4 8 -12 0 4 6 0 8 -4 4 -4 0 0 -8 -2 4 -1 2 1 +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 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 24 0 0 0 0 0 -6 0 0 0 0 12 0 0 -12 0 0 0 -6 0 0 0 0 0 0 0 0 -6 0 0 0 0 0 -6 0 0 0 1 0 1 +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 0 8 0 0 0 0 3 0 0 0 8 0 8 0 0 0 0 0 -2 0 0 0 0 -4 0 8 -4 0 0 0 -2 0 0 -4 0 0 0 0 0 -2 0 0 0 0 0 -2 0 0 -4 1 0 1 +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 -6 0 8 2 -4 0 0 0 -1 0 -4 0 -8 2 0 0 0 2 0 1 -4 0 0 0 0 8 0 0 0 0 8 -2 4 4 -4 -4 4 0 0 -4 4 0 0 -2 0 -8 0 0 -4 4 0 -2 4 -4 4 0 0 -4 -4 4 -2 0 -1 2 1 +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 2 0 -16 0 0 3 0 0 0 0 0 0 0 0 0 -16 3 0 0 0 0 0 -8 0 0 16 0 0 2 -8 -8 8 8 12 0 0 4 0 0 0 2 0 0 0 0 0 8 0 0 -6 -8 0 0 0 8 -6 -8 0 0 1 0 1 +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 2 0 -8 2 -4 0 0 0 -1 0 -4 0 8 -6 0 0 0 2 0 1 4 0 0 0 0 8 0 0 0 0 8 -2 -4 -4 4 4 4 0 0 -4 -4 0 0 -2 0 -8 0 0 4 -4 0 -2 4 4 -4 0 0 4 -4 -4 -2 0 -1 2 1 +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 -4 0 0 -8 12 0 0 0 0 -2 0 0 8 -24 3 0 0 0 0 0 24 0 0 0 0 3 0 0 0 24 -8 -8 8 8 0 -8 0 -2 0 0 0 0 -4 0 -8 12 0 0 0 -2 -8 0 -4 0 0 0 -8 0 -2 0 0 8 8 0 -2 0 0 -4 1 0 1 +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 0 3 0 0 0 0 0 8 0 0 0 0 0 2 0 0 0 0 -4 0 0 4 0 0 0 2 0 0 -8 0 0 0 0 0 2 0 0 0 0 0 2 0 0 -8 1 0 1 +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 2 -8 0 2 -4 0 -4 -4 -1 -8 4 8 0 2 -8 8 8 2 0 1 4 8 -8 8 4 0 -4 -4 0 4 0 -2 0 0 0 0 -4 0 0 4 4 -8 8 -2 -4 0 4 0 -4 0 -4 -2 0 0 -4 4 4 0 0 0 -2 -4 -1 2 1 +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 -4 0 0 -8 12 0 0 0 0 -2 0 0 -8 24 3 0 0 0 0 0 24 0 0 0 0 3 0 0 0 24 8 -8 -8 -8 0 8 0 -2 0 0 0 0 -4 0 -8 12 0 0 0 -2 8 0 -4 0 0 0 8 0 -2 0 0 -8 -8 0 -2 0 0 -4 1 0 1 +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 2 8 0 2 -4 0 4 4 -1 8 4 -8 0 2 -8 8 8 2 0 1 4 -8 8 8 -4 0 4 4 0 -4 0 -2 0 0 0 0 -4 0 0 4 4 8 -8 -2 4 0 4 0 -4 0 4 -2 0 0 -4 -4 -4 0 0 0 -2 -4 -1 2 1 +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 24 6 -8 0 -8 0 8 -24 8 4 0 -8 -4 -8 12 8 8 4 -2 4 -12 -16 0 0 16 -4 4 4 8 -4 0 10 0 8 -2 4 0 12 -4 -1 0 4 0 -24 -6 -8 8 8 2 0 1 -12 0 0 8 4 -8 -4 -4 0 4 8 2 16 0 0 -16 4 8 -8 4 4 0 0 2 -4 -8 0 -8 -4 8 -4 -2 4 -8 12 4 4 -8 -4 8 -2 0 -1 2 1 +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 0 -2 4 0 0 0 -1 -8 -4 8 16 -6 0 0 0 2 0 1 -4 8 -8 0 0 0 0 0 0 0 0 2 -4 -4 4 4 -4 8 8 -4 4 8 -8 2 0 0 4 -8 -4 4 0 -2 0 -4 4 0 0 -4 0 4 -2 -4 -1 2 1 +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 4 -4 8 -8 8 -8 -4 4 4 8 -4 0 2 0 -8 -2 4 0 -12 4 -1 0 4 0 -8 2 -8 8 8 2 0 1 -4 0 0 8 -4 -8 4 4 0 -4 8 2 -8 8 -8 8 4 8 -8 4 -4 0 0 2 4 -8 0 -8 4 0 4 -2 4 0 4 -4 -4 0 -4 0 -2 0 -1 2 1 +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 4 -4 0 0 -8 -2 0 0 6 -4 -8 12 0 3 8 4 0 0 -2 0 8 -8 2 8 -3 -4 -8 0 0 -4 0 0 12 0 0 0 6 0 0 -4 4 0 0 0 0 4 8 0 -6 0 0 0 0 -4 0 4 -2 0 4 4 0 -12 0 0 -4 -2 0 -1 2 1 +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 -4 4 -8 8 0 -4 4 0 0 0 6 8 0 2 -12 -16 0 12 3 0 -12 -8 0 6 0 8 -8 2 16 -3 4 0 8 0 0 0 4 0 -8 4 0 2 4 -4 8 -8 0 0 0 0 -4 0 -8 -2 -4 0 0 0 4 -4 0 -2 0 8 -4 -4 0 4 0 -8 -2 0 -1 2 1 +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 16 0 0 0 0 0 0 0 6 0 0 8 8 -8 -8 -4 0 0 24 -4 -16 0 16 0 6 0 -16 0 0 3 -16 0 16 0 0 -8 0 0 0 -16 3 0 -16 16 -8 0 -8 0 0 16 0 0 6 8 8 -8 -8 -4 0 24 -4 0 -16 16 6 0 0 -4 0 0 8 0 0 -2 -8 0 0 0 8 -2 -8 0 -4 1 0 1 +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 4 0 0 0 0 -4 4 4 -8 -4 0 2 0 8 -2 4 16 -12 -4 -1 0 4 0 8 2 8 -8 -8 2 -16 1 4 0 0 -8 -4 -8 -4 4 16 4 8 2 0 0 0 0 4 -8 8 4 4 0 0 2 -4 -8 0 8 -4 -8 4 -2 4 8 -4 4 -4 8 -4 -8 -2 0 -1 2 1 +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 -8 16 -2 4 0 0 0 -1 8 -4 -8 0 2 0 0 0 2 0 1 4 -8 8 0 0 0 0 0 0 0 0 2 4 4 -4 -4 -4 8 8 -4 -4 -8 8 2 0 0 4 -8 4 -4 0 -2 0 4 -4 0 0 4 0 -4 -2 -4 -1 2 1 +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 -10 -8 0 -8 0 8 8 -24 -12 0 -8 -4 -8 12 8 8 4 -2 4 4 0 16 -16 0 -4 4 4 8 -4 0 -6 0 -24 -2 4 0 12 -4 -1 0 4 0 8 10 -8 8 8 2 0 1 4 0 0 8 4 -8 -4 -4 0 4 8 2 0 -16 16 0 4 8 -8 4 -12 0 0 2 -4 -8 0 -8 12 -8 -4 -2 4 8 -4 4 4 8 -4 -8 -2 0 -1 2 1 +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 -24 0 0 0 6 0 0 0 0 0 0 12 0 0 -24 12 0 0 0 0 6 0 0 24 -24 3 0 0 0 0 0 -24 0 0 0 0 3 0 0 0 -24 8 24 -24 24 0 -8 0 6 0 0 0 0 12 0 -24 12 0 0 0 6 -8 0 -12 0 0 0 8 0 6 0 0 -24 24 0 6 0 0 -12 1 0 1 +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 -8 -8 8 -4 4 4 8 -4 0 2 0 -8 -2 4 0 4 -4 -1 0 4 0 -8 2 8 -8 -8 2 0 1 4 0 0 -8 -4 8 12 -12 0 4 -8 2 -8 8 8 -8 4 8 -8 4 4 0 0 2 -4 8 8 -8 -4 0 4 -2 -4 0 -4 -12 12 0 4 0 -2 -8 -1 2 1 +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 24 0 0 0 6 0 0 0 0 0 0 12 0 0 -24 12 0 0 0 0 6 0 0 -24 24 3 0 0 0 0 0 -24 0 0 0 0 3 0 0 0 -24 -8 24 24 -24 0 8 0 6 0 0 0 0 12 0 -24 12 0 0 0 6 8 0 -12 0 0 0 -8 0 6 0 0 24 -24 0 6 0 0 -12 1 0 1 +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 8 8 -8 -4 4 4 8 -4 0 2 0 -8 -2 4 0 -4 4 -1 0 4 0 -8 2 8 -8 -8 2 0 1 4 0 0 -8 4 8 -12 12 0 -4 -8 2 8 -8 -8 8 4 8 -8 4 4 0 0 2 4 8 8 -8 -4 0 -4 -2 -4 0 -4 12 -12 0 4 0 -2 -8 -1 2 1 +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 0 -4 4 4 -8 -4 0 2 0 8 -2 4 16 -4 -4 -1 0 4 0 8 2 -8 8 8 -2 16 -1 4 0 0 -8 -4 -8 -12 -12 16 -4 8 -2 0 0 0 0 -4 8 -8 -4 4 0 0 -2 -4 8 -8 8 4 8 -4 -2 -4 8 4 -12 -12 8 -4 8 2 -8 -1 2 -1 +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 2 0 8 -2 -4 0 0 0 -1 0 4 0 8 2 0 0 0 6 0 -1 4 0 0 0 0 0 0 0 0 0 -8 -2 -4 -4 -4 -4 4 -16 8 4 4 0 0 -2 0 -8 -4 -16 4 4 0 6 0 4 4 0 0 4 0 4 2 -4 -1 2 -1 +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 0 0 0 -16 0 2 -16 8 8 8 8 8 -4 0 0 0 4 0 8 0 16 2 -16 -16 0 0 3 0 16 0 16 8 0 -16 -16 0 16 -3 -8 0 0 0 0 -8 0 0 16 0 0 -2 -8 -8 -8 -8 4 16 0 -4 -8 0 0 -2 0 0 8 -16 8 -8 0 0 2 -8 8 0 0 8 -2 8 0 -8 1 0 -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 4 -8 8 -4 4 0 4 -4 0 0 -8 6 0 0 -2 12 8 4 0 3 8 -12 0 0 6 0 8 -8 -2 8 3 4 8 0 0 -4 0 0 -4 -16 0 0 2 -8 8 -4 4 0 0 0 0 -4 -8 0 -2 0 0 0 0 -4 8 -4 -2 0 -4 4 0 -4 8 0 -4 2 0 -1 2 -1 +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 -2 -8 0 2 4 0 0 12 3 0 4 8 0 -2 0 -8 8 -2 0 3 4 0 8 0 0 0 -4 0 -8 -4 0 -2 4 -4 0 0 0 0 0 0 -4 0 -8 2 -4 0 0 0 -4 4 0 -2 0 0 4 -4 0 4 0 0 2 0 -1 2 -1 +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 4 -4 0 0 -8 -2 0 0 6 -4 -8 12 0 3 8 4 0 0 -2 0 8 -8 -2 -8 3 4 8 0 0 4 0 0 -12 0 0 0 -6 0 0 4 -4 0 0 0 0 -4 -8 0 6 0 0 0 0 -4 0 4 -2 0 4 4 0 -12 0 0 4 2 0 -1 2 -1 +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 0 0 4 4 0 0 0 0 0 8 -4 16 -8 -2 8 -8 8 4 -1 -8 0 0 8 4 0 0 0 8 8 1 -8 8 0 0 0 0 4 8 0 4 -8 -2 0 0 -4 -4 0 -8 0 0 0 -8 -16 2 -4 8 4 8 0 -8 0 -8 2 -4 8 -4 -8 8 -2 4 0 -4 1 0 -1 +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 -6 0 8 2 -4 0 0 0 -1 0 -4 0 -8 2 0 0 0 -2 0 -1 4 0 0 0 0 -8 0 0 0 0 -8 2 -4 -4 4 4 -4 0 0 4 -4 0 0 2 0 -8 0 0 -4 4 0 -2 4 -4 4 0 0 4 4 -4 2 0 -1 2 -1 +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 -24 -6 8 0 8 0 8 -24 8 4 0 -8 -4 -8 12 8 8 4 -2 4 -12 -16 0 0 16 -4 4 4 8 -4 0 10 0 8 -2 4 0 12 -4 -1 0 4 0 -24 -6 -8 8 8 -2 0 -1 12 0 0 -8 -4 8 4 4 0 -4 -8 -2 -16 0 0 16 -4 -8 8 -4 -4 0 0 -2 -4 -8 0 -8 -4 8 -4 -2 4 -8 12 4 4 8 4 -8 2 0 -1 2 -1 +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 0 -2 4 0 0 0 -1 -8 -4 8 16 -6 0 0 0 -2 0 -1 4 -8 8 0 0 0 0 0 0 0 0 -2 4 4 -4 -4 4 -8 -8 4 -4 -8 8 -2 0 0 4 -8 -4 4 0 -2 0 -4 4 0 0 4 0 -4 2 4 -1 2 -1 +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 0 4 -1 -8 0 0 0 -4 0 -8 8 0 0 1 -8 8 0 0 0 0 -4 0 -8 4 0 2 -8 0 -4 4 0 8 0 0 0 -8 0 -2 -4 0 0 -8 0 -8 0 0 -2 4 8 4 0 8 2 -4 0 0 1 0 -1 +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 4 -4 8 -8 8 -8 -4 4 4 8 -4 0 2 0 -8 -2 4 0 -12 4 -1 0 4 0 -8 2 -8 8 8 -2 0 -1 4 0 0 -8 4 8 -4 -4 0 4 -8 -2 8 -8 8 -8 -4 -8 8 -4 4 0 0 -2 4 -8 0 -8 4 0 4 -2 4 0 4 -4 -4 0 4 0 2 0 -1 2 -1 +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 8 -4 0 -1 0 0 -8 0 4 0 8 -8 0 -8 1 -8 0 8 0 -4 0 0 4 0 0 0 -2 4 -4 0 -8 0 8 0 0 0 0 -8 2 0 0 0 -8 0 -4 4 0 -2 0 8 0 -4 4 2 0 0 0 1 0 -1 +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 0 0 0 0 -4 4 4 -8 -4 0 2 0 8 -2 4 -16 12 4 -1 0 4 0 8 2 8 -8 -8 -2 -16 -1 -4 0 0 8 -4 8 -4 4 16 4 -8 -2 0 0 0 0 -4 8 -8 -4 -4 0 0 -2 4 -8 0 8 -4 8 -4 -2 4 -8 -4 -4 4 8 4 -8 2 0 -1 2 -1 +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 2 0 16 0 0 3 0 0 0 0 0 0 0 0 0 -16 -3 0 0 0 0 0 8 0 0 16 0 0 -2 -8 -8 8 8 -12 0 0 -4 0 0 0 -2 0 0 0 0 0 -8 0 0 -6 8 0 0 0 8 6 -8 0 0 1 0 -1 +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 -16 0 0 0 0 0 0 0 6 0 0 -8 -8 8 8 -4 0 0 24 -4 16 0 -16 0 6 0 16 0 0 3 16 0 -16 0 0 -8 0 0 0 -16 -3 0 -16 16 8 0 8 0 0 16 0 0 -6 8 8 -8 -8 4 0 -24 4 0 -16 16 -6 0 0 -4 0 0 -8 0 0 -2 8 0 0 0 8 2 -8 0 4 1 0 -1 +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 -4 2 4 4 0 0 -8 -8 4 4 4 0 -4 0 2 -16 8 2 4 0 -4 4 -1 16 -4 0 -8 -6 8 8 8 6 0 -1 -12 16 0 8 -4 0 -4 4 0 4 -8 2 0 0 -8 -8 4 8 0 -4 -4 0 -16 2 4 -8 -4 8 -4 8 -4 6 0 0 -12 -4 4 8 0 0 2 -4 -1 2 -1 +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 4 -4 -8 -8 0 0 4 4 4 0 -4 0 -6 16 -8 2 4 0 4 -4 -1 -16 -4 0 8 2 8 8 8 6 0 -1 -4 -16 0 8 4 0 4 -4 0 -4 -8 2 -8 -8 0 0 4 8 0 -4 -12 0 16 2 -4 -8 -4 8 -12 0 4 6 0 8 -4 4 -4 0 0 8 2 -4 -1 2 -1 +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 0 0 0 0 16 0 2 16 -8 8 8 8 8 -4 0 0 0 4 0 -8 0 -16 2 16 -16 0 0 3 0 -16 0 -16 -8 0 16 16 0 16 -3 8 0 0 0 0 -8 0 0 16 0 0 -2 -8 -8 -8 -8 4 -16 0 -4 8 0 0 -2 0 0 8 16 -8 -8 0 0 2 -8 -8 0 0 8 -2 8 0 -8 1 0 -1 +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 2 -8 0 2 4 0 0 0 -1 -8 4 -8 0 2 0 0 0 6 0 -1 -4 -8 -8 0 0 8 0 0 0 0 0 2 4 4 4 4 -4 -8 0 4 -4 -8 -8 2 0 0 0 -8 -4 4 0 6 -4 4 -4 0 0 4 -4 4 2 0 -1 2 -1 +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 0 -16 0 0 0 0 0 0 0 -2 0 0 -8 -8 -8 -8 12 0 0 8 -4 16 0 16 0 -2 0 -16 0 0 3 16 0 16 0 0 8 0 0 0 16 -3 0 -16 -16 -8 0 8 0 0 16 0 0 2 8 8 8 8 -12 0 -8 4 0 -16 -16 2 0 0 4 0 0 -8 0 0 6 -8 0 0 0 8 -6 8 0 -4 1 0 -1 +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 4 0 0 0 0 0 8 4 16 8 -2 -8 -8 -8 -4 -1 -8 0 0 -8 -4 0 0 0 -8 8 1 8 8 0 0 0 0 -4 -8 0 -4 8 -2 0 0 -4 -4 0 8 0 0 0 -8 -16 2 4 -8 4 -8 0 -8 0 8 2 -4 -8 4 8 8 -2 4 0 -4 1 0 -1 +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 4 4 0 0 0 0 0 0 0 0 -4 -8 -8 2 8 0 4 0 -1 16 0 8 8 4 0 0 0 -8 0 1 0 -16 -8 0 -4 0 -8 -4 8 0 8 2 -4 -4 0 0 0 8 0 0 8 0 8 -2 0 -8 4 -8 -8 -4 4 8 2 -8 0 8 4 4 -2 8 0 -4 1 0 -1 +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 -4 4 0 0 0 -2 8 0 -6 4 0 0 -12 3 0 4 -8 0 -2 0 8 -8 -2 0 3 -4 0 -8 0 0 0 -12 0 -8 4 0 6 4 -4 0 0 0 0 0 0 4 0 8 -6 4 0 0 0 4 4 0 -2 0 0 -4 -12 0 4 0 0 2 0 -1 2 -1 +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 0 -2 -4 -8 4 0 3 -8 4 0 0 -2 0 -8 8 -2 -8 3 -4 -8 0 0 -4 0 0 -4 0 0 0 2 0 0 4 -4 0 0 0 0 4 8 0 -2 0 0 0 0 4 0 -4 -2 0 4 -4 0 -4 0 0 4 2 0 -1 2 -1 +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 -4 4 -8 8 0 -4 4 0 0 0 6 8 0 2 -12 -16 0 12 3 0 -12 -8 0 6 0 8 -8 -2 -16 3 -4 0 -8 0 0 0 -4 0 8 -4 0 -2 -4 4 -8 8 0 0 0 0 4 0 8 2 -4 0 0 0 4 -4 0 -2 0 8 -4 -4 0 -4 0 8 2 0 -1 2 -1 +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 4 4 0 0 0 0 0 0 0 0 4 -8 8 2 -8 0 -4 0 -1 16 0 8 -8 -4 0 0 0 8 0 1 0 -16 -8 0 4 0 8 4 8 0 -8 2 -4 -4 0 0 0 -8 0 0 -8 0 8 -2 0 8 4 8 8 -4 -4 -8 2 -8 0 -8 -4 4 -2 8 0 -4 1 0 -1 +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 2 8 0 2 -4 0 4 4 -1 8 4 -8 0 2 -8 8 8 -2 0 -1 -4 8 -8 -8 4 0 -4 -4 0 4 0 2 0 0 0 0 4 0 0 -4 -4 -8 8 2 4 0 4 0 -4 0 4 -2 0 0 -4 -4 -4 0 0 0 2 4 -1 2 -1 +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 0 -4 -1 -8 0 0 0 4 0 8 -8 0 0 1 8 8 0 0 0 0 4 0 -8 -4 0 2 -8 0 -4 4 0 -8 0 0 0 -8 0 -2 4 0 0 8 0 -8 0 0 -2 4 -8 -4 0 8 2 -4 0 0 1 0 -1 +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 2 -8 0 2 -4 0 -4 -4 -1 -8 4 8 0 2 -8 8 8 -2 0 -1 -4 -8 8 -8 -4 0 4 4 0 -4 0 2 0 0 0 0 4 0 0 -4 -4 8 -8 2 -4 0 4 0 -4 0 -4 -2 0 0 -4 4 4 0 0 0 2 4 -1 2 -1 +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 2 0 -8 2 -4 0 0 0 -1 0 -4 0 8 -6 0 0 0 -2 0 -1 -4 0 0 0 0 -8 0 0 0 0 -8 2 4 4 -4 -4 -4 0 0 4 4 0 0 2 0 -8 0 0 4 -4 0 -2 4 4 -4 0 0 -4 4 4 2 0 -1 2 -1 +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 4 0 -1 0 0 -8 0 -4 0 -8 8 0 -8 1 8 0 8 0 4 0 0 -4 0 0 0 -2 4 -4 0 -8 0 -8 0 0 0 0 -8 2 0 0 0 8 0 -4 -4 0 -2 0 -8 0 4 4 2 0 0 0 1 0 -1 +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 4 0 0 0 0 -4 4 4 -8 -4 0 2 0 8 -2 4 16 -12 -4 -1 0 4 0 8 2 8 -8 -8 -2 16 -1 -4 0 0 8 4 8 4 -4 -16 -4 -8 -2 0 0 0 0 -4 8 -8 -4 -4 0 0 -2 -4 -8 0 8 -4 -8 4 -2 4 8 -4 4 -4 -8 4 8 2 0 -1 2 -1 +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 0 0 4 -1 8 0 0 0 4 0 -8 8 0 0 1 0 -8 0 0 0 0 -4 0 -8 4 0 2 0 -8 4 -4 0 -8 0 0 8 8 0 -2 -4 0 0 8 -8 0 0 0 -2 -4 0 4 0 0 2 4 0 0 1 0 -1 +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 8 -4 0 -1 0 0 8 0 -4 0 8 -8 0 -8 1 0 0 -8 0 -4 0 0 4 0 0 0 -2 -4 4 -8 0 0 -8 0 0 8 0 8 2 0 0 0 8 -8 4 4 0 -2 -8 0 0 -4 -4 2 8 0 0 1 0 -1 +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 -8 -8 8 -4 4 4 8 -4 0 2 0 -8 -2 4 0 4 -4 -1 0 4 0 -8 2 8 -8 -8 -2 0 -1 -4 0 0 8 4 -8 -12 12 0 -4 8 -2 8 -8 -8 8 -4 -8 8 -4 -4 0 0 -2 -4 8 8 -8 -4 0 4 -2 -4 0 -4 -12 12 0 -4 0 2 8 -1 2 -1 +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 4 0 -1 8 8 0 0 -4 0 0 0 0 0 1 0 -8 0 0 -4 0 8 -4 -8 0 0 2 4 4 0 0 0 0 0 0 0 -8 0 -2 0 0 -4 0 0 -4 4 0 2 0 0 -8 4 4 -2 0 0 4 1 0 -1 +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 8 8 -8 -4 4 4 8 -4 0 2 0 -8 -2 4 0 -4 4 -1 0 4 0 -8 2 8 -8 -8 -2 0 -1 -4 0 0 8 -4 -8 12 -12 0 4 8 -2 -8 8 8 -8 -4 -8 8 -4 -4 0 0 -2 4 8 8 -8 -4 0 -4 -2 -4 0 -4 12 -12 0 -4 0 2 8 -1 2 -1 +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 -8 16 -2 4 0 0 0 -1 8 -4 -8 0 2 0 0 0 -2 0 -1 -4 8 -8 0 0 0 0 0 0 0 0 -2 -4 -4 4 4 4 -8 -8 4 4 8 -8 -2 0 0 4 -8 4 -4 0 -2 0 4 -4 0 0 -4 0 4 2 4 -1 2 -1 +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 8 -4 -1 0 8 8 0 -4 0 0 0 0 -8 1 0 0 -8 0 0 0 -4 8 0 -4 0 -2 0 0 4 4 0 0 0 0 0 0 -8 2 4 0 -4 0 0 0 0 0 2 -4 0 4 -8 0 -2 4 0 4 1 0 -1 +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 -4 0 -1 8 -8 0 0 4 0 0 0 0 0 1 0 -8 0 0 4 0 -8 4 -8 0 0 2 4 4 0 0 0 0 0 0 0 -8 0 -2 0 0 -4 0 0 -4 -4 0 2 0 0 8 -4 4 -2 0 0 4 1 0 -1 +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 -8 4 -1 0 -8 8 0 4 0 0 0 0 -8 1 0 0 -8 0 0 0 4 -8 0 4 0 -2 0 0 4 4 0 0 0 0 0 0 -8 2 -4 0 -4 0 0 0 0 0 2 -4 0 -4 8 0 -2 4 0 4 1 0 -1 +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 0 0 -4 -1 8 0 0 0 -4 0 8 -8 0 0 1 0 -8 0 0 0 0 4 0 -8 -4 0 2 0 -8 4 -4 0 8 0 0 -8 8 0 -2 4 0 0 -8 8 0 0 0 -2 -4 0 -4 0 0 2 4 0 0 1 0 -1 +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 10 8 0 8 0 8 8 -24 -12 0 -8 -4 -8 12 8 8 4 -2 4 4 0 16 -16 0 -4 4 4 8 -4 0 -6 0 -24 -2 4 0 12 -4 -1 0 4 0 8 10 -8 8 8 -2 0 -1 -4 0 0 -8 -4 8 4 4 0 -4 -8 -2 0 16 -16 0 -4 -8 8 -4 12 0 0 -2 -4 -8 0 -8 12 -8 -4 -2 4 8 -4 4 4 -8 4 8 2 0 -1 2 -1 +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 8 4 0 -1 0 0 8 0 4 0 -8 8 0 -8 1 0 0 -8 0 4 0 0 -4 0 0 0 -2 -4 4 -8 0 0 8 0 0 -8 0 8 2 0 0 0 -8 8 4 -4 0 -2 -8 0 0 4 -4 2 8 0 0 1 0 -1 +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 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 -24 0 0 0 0 0 6 0 0 0 0 -12 0 0 12 0 0 0 6 0 0 0 0 0 0 0 0 -6 0 0 0 0 0 6 0 0 0 1 0 -1 +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 0 8 0 0 0 0 -3 0 0 0 -8 0 -8 0 0 0 0 0 2 0 0 0 0 4 0 -8 4 0 0 0 2 0 0 -4 0 0 0 0 0 -2 0 0 0 0 0 2 0 0 4 1 0 -1 +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 2 0 -16 0 0 3 0 0 0 0 0 0 0 0 0 16 -3 0 0 0 0 0 8 0 0 -16 0 0 -2 8 8 -8 -8 -12 0 0 -4 0 0 0 -2 0 0 0 0 0 8 0 0 -6 -8 0 0 0 -8 6 8 0 0 1 0 -1 +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 -4 0 0 -8 12 0 0 0 0 -2 0 0 -8 24 3 0 0 0 0 0 24 0 0 0 0 -3 0 0 0 -24 -8 8 8 8 0 -8 0 2 0 0 0 0 4 0 8 -12 0 0 0 2 8 0 -4 0 0 0 8 0 -2 0 0 -8 -8 0 2 0 0 4 1 0 -1 +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 0 -3 0 0 0 0 0 -8 0 0 0 0 0 -2 0 0 0 0 4 0 0 -4 0 0 0 -2 0 0 -8 0 0 0 0 0 2 0 0 0 0 0 -2 0 0 8 1 0 -1 +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 -4 0 0 -8 12 0 0 0 0 -2 0 0 8 -24 3 0 0 0 0 0 24 0 0 0 0 -3 0 0 0 -24 8 8 -8 -8 0 8 0 2 0 0 0 0 4 0 8 -12 0 0 0 2 -8 0 -4 0 0 0 -8 0 -2 0 0 8 8 0 2 0 0 4 1 0 -1 +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 16 0 0 0 0 0 0 0 6 0 0 8 8 -8 -8 -4 0 0 24 -4 -16 0 16 0 6 0 -16 0 0 3 -16 0 16 0 0 -8 0 0 0 16 -3 0 16 -16 8 0 8 0 0 -16 0 0 -6 -8 -8 8 8 4 0 -24 4 0 16 -16 -6 0 0 -4 0 0 8 0 0 -2 -8 0 0 0 -8 2 8 0 4 1 0 -1 +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 24 0 0 0 6 0 0 0 0 0 0 12 0 0 -24 12 0 0 0 0 6 0 0 -24 24 3 0 0 0 0 0 -24 0 0 0 0 -3 0 0 0 24 8 -24 -24 24 0 -8 0 -6 0 0 0 0 -12 0 24 -12 0 0 0 -6 8 0 -12 0 0 0 -8 0 6 0 0 24 -24 0 -6 0 0 12 1 0 -1 +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 -24 0 0 0 6 0 0 0 0 0 0 12 0 0 -24 12 0 0 0 0 6 0 0 24 -24 3 0 0 0 0 0 -24 0 0 0 0 -3 0 0 0 24 -8 -24 24 -24 0 8 0 -6 0 0 0 0 -12 0 24 -12 0 0 0 -6 -8 0 -12 0 0 0 8 0 6 0 0 -24 24 0 -6 0 0 12 1 0 -1 +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 -16 -16 -16 -8 -8 -8 -8 12 12 -8 12 24 -8 -16 -16 -8 12 -8 4 -8 4 -4 -16 -8 12 24 24 -8 -16 -4 -16 12 -16 48 24 -16 -16 -8 -16 48 24 48 24 -16 -16 -8 6 -8 -8 -8 -8 -8 -8 12 -8 -8 24 12 -16 -4 -16 -16 6 -8 -16 24 24 3 -16 -8 -16 -16 -4 24 -16 -16 -4 -16 3 -8 -16 -16 24 8 24 24 24 -16 8 -16 6 -8 -8 -8 -8 12 -16 24 12 -8 -16 -16 6 8 -16 12 -16 -8 -8 8 -4 6 -8 -8 24 24 -8 6 -8 -4 12 1 -4 1 +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 4 0 -1 -8 0 0 0 0 0 0 0 -4 0 -1 0 -8 0 0 4 0 8 4 8 0 0 -2 -4 -4 0 0 0 0 0 0 0 -8 0 2 0 0 4 0 0 -4 4 -4 2 0 0 8 4 -4 2 0 -4 4 1 -4 1 +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 -4 -1 0 0 -8 0 0 0 0 0 -4 8 -1 0 0 -8 0 0 0 4 8 0 4 0 2 0 0 -4 -4 0 0 0 0 0 0 -8 -2 4 0 4 0 0 0 0 -4 2 -4 0 4 8 0 2 -4 -4 4 1 -4 1 +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 -4 -4 -4 -8 -4 0 -2 0 -8 -2 -4 16 4 4 -1 0 -4 0 -8 -2 -8 -8 -8 -2 -16 1 4 0 0 8 -4 8 -12 -12 -16 -4 8 2 0 0 0 0 4 8 8 4 4 0 0 2 4 -8 -8 -8 -4 8 4 2 -4 8 -4 12 12 -8 4 -8 2 8 -1 -2 1 +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 -8 -8 -4 0 4 0 0 -2 8 0 0 0 3 0 8 0 0 4 -8 0 0 -4 0 3 0 0 0 -8 0 8 0 0 0 0 16 -2 0 0 0 0 -4 0 -8 -4 0 0 0 -2 0 16 4 0 0 0 0 -4 -2 0 0 0 0 0 -2 0 -4 4 1 -4 1 +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 0 0 16 16 -8 6 -8 -8 0 0 0 0 -4 -8 -8 -24 -4 0 -4 0 16 6 -8 0 0 0 3 0 -8 0 16 -4 8 -16 -16 -4 0 3 -8 0 0 8 0 -8 0 0 0 0 16 6 0 0 0 0 -4 16 -24 -4 -8 0 0 6 0 16 4 16 -8 0 0 -4 -2 0 -8 0 0 0 -2 0 -4 4 1 -4 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 0 -16 2 -8 0 0 0 3 0 8 0 -16 4 0 0 0 -4 0 3 0 0 0 0 0 -8 0 0 0 0 0 2 0 0 0 0 -4 16 0 -12 0 0 0 2 0 0 0 16 0 0 0 -4 2 0 0 0 0 0 2 0 -4 0 1 -4 1 +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 -8 -2 4 0 0 0 -1 0 -4 0 -8 -2 0 0 0 6 0 1 4 0 0 0 0 0 0 0 0 0 -8 2 4 4 4 4 -4 -16 -8 -4 4 0 0 2 0 8 -4 16 -4 4 0 -6 0 4 -4 0 0 -4 0 -4 2 4 -1 -2 1 +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 -4 0 -1 8 0 0 8 0 0 -8 8 4 -8 -1 -8 8 0 0 4 0 0 -4 0 0 8 2 4 -4 0 -8 0 0 0 0 8 -8 0 -2 0 8 0 0 8 -4 4 4 -2 8 -8 0 -4 -4 -2 8 -4 0 1 -4 1 +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 12 0 8 -8 0 0 8 -8 -16 8 -2 0 -8 -8 4 -1 -8 8 0 -8 0 0 0 0 4 -8 -1 0 -8 0 0 0 0 -4 8 0 -4 -8 2 8 -8 -4 12 0 8 0 0 8 8 -16 -2 -4 -8 -4 8 8 0 0 4 2 4 0 -4 8 0 2 4 -4 -4 1 -4 1 +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 -4 -8 8 -4 4 0 -4 4 0 0 -8 -6 0 0 -2 -12 8 -4 0 3 8 12 0 0 -6 0 -8 8 -2 -8 -3 4 -8 0 0 -4 0 0 -4 16 0 0 -2 8 -8 4 -4 0 0 0 0 -4 8 0 2 0 0 0 0 4 8 4 2 0 -4 -4 0 4 -8 0 4 2 0 -1 -2 1 +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 0 -8 8 0 0 -8 0 0 8 -2 0 -8 8 -4 -1 8 -8 -16 -8 8 0 0 0 4 -8 -1 0 8 -16 0 0 0 4 -8 0 4 -8 2 -8 8 12 -4 0 8 0 0 8 -8 0 -2 4 -8 -4 8 8 0 0 4 2 4 0 4 -8 0 2 4 -4 -4 1 -4 1 +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 -8 4 0 -1 -8 0 0 8 0 0 8 -8 4 -8 -1 0 -8 0 0 -4 0 0 4 0 0 8 2 -4 4 -8 0 0 0 0 0 0 8 0 -2 0 8 0 0 0 4 -4 4 -2 0 0 0 4 4 -2 0 -4 0 1 -4 1 +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 -8 0 2 -4 0 0 -12 3 0 -4 8 0 2 0 8 -8 -2 0 -3 4 0 -8 0 0 0 -4 0 8 -4 0 2 -4 4 0 0 0 0 0 0 -4 0 8 -2 4 0 0 0 4 4 0 2 0 0 -4 4 0 -4 0 0 2 0 -1 -2 1 +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 0 -4 4 0 0 -8 2 0 0 6 4 -8 -12 0 3 8 -4 0 0 2 0 -8 8 -2 8 -3 4 -8 0 0 4 0 0 -12 0 0 0 6 0 0 -4 4 0 0 0 0 -4 8 0 -6 0 0 0 0 4 0 -4 2 0 4 -4 0 12 0 0 -4 2 0 -1 -2 1 +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 0 4 -1 0 0 8 -8 0 0 8 -8 4 0 -1 0 0 8 0 0 0 4 0 -8 -4 8 -2 -8 0 -4 4 0 0 0 0 0 0 -8 2 -4 8 0 0 0 0 0 4 -2 4 0 4 0 0 -2 4 -4 0 1 -4 1 +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 0 6 0 -8 2 4 0 0 0 -1 0 4 0 8 -2 0 0 0 -2 0 1 4 0 0 0 0 8 0 0 0 0 -8 -2 4 4 -4 -4 4 0 0 -4 -4 0 0 -2 0 8 0 0 4 4 0 2 4 -4 -4 0 0 -4 -4 4 2 0 -1 -2 1 +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 -2 8 0 -2 -4 0 0 0 -1 -8 4 8 -16 6 0 0 0 -2 0 1 4 8 -8 0 0 0 0 0 0 0 0 2 -4 -4 4 4 -4 -8 8 -4 -4 8 -8 2 0 0 4 8 4 4 0 2 0 -4 -4 0 0 -4 0 4 2 -4 -1 -2 1 +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 8 -8 8 -8 -4 -4 -4 8 -4 0 -2 0 8 -2 -4 0 12 -4 -1 0 -4 0 8 -2 -8 -8 -8 -2 0 1 4 0 0 8 4 -8 -4 -4 0 4 -8 2 -8 8 -8 8 4 -8 -8 4 4 0 0 2 -4 8 0 8 -4 0 -4 2 4 0 -4 4 4 0 -4 0 2 0 -1 -2 1 +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 12 8 8 16 -16 8 4 -8 4 -8 4 -4 -16 -8 12 -8 -24 -8 -16 -4 16 -4 16 16 -8 16 16 8 -16 16 24 -16 8 16 -16 -8 -2 -8 8 -8 -8 8 8 -4 -8 -8 8 12 -16 -4 16 -16 -2 -8 16 -8 -24 3 -16 -8 16 -16 -4 -24 16 16 -4 16 3 8 -16 16 -24 8 -8 8 -8 -16 -8 16 -2 -8 -8 8 8 -4 -16 8 12 8 -16 16 -2 -8 16 4 -16 8 -8 8 -4 -2 8 8 8 -8 -8 -2 8 -4 4 1 -4 1 +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 0 0 0 -4 -4 -4 -8 -4 0 -2 0 -8 -2 -4 -16 -12 -4 -1 0 -4 0 -8 -2 8 8 8 -2 16 1 -4 0 0 -8 -4 -8 -4 4 -16 4 -8 2 0 0 0 0 4 8 8 4 -4 0 0 2 -4 8 0 -8 4 8 4 2 4 -8 4 4 -4 -8 -4 8 2 0 -1 -2 1 +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 -6 8 0 0 0 3 0 -8 0 0 -4 0 -16 -16 -4 0 3 8 0 0 0 0 -8 0 0 0 0 0 -6 0 0 0 0 -4 0 0 4 8 0 0 -6 0 0 0 0 8 0 0 -4 2 0 8 0 0 0 2 0 -4 0 1 -4 1 +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 0 0 -8 -8 4 -4 -4 0 -4 0 -2 -16 -8 2 -4 0 4 -4 -1 16 4 0 8 6 8 -8 -8 6 0 1 -12 -16 0 -8 -4 0 -4 4 0 4 -8 -2 0 0 8 8 -4 8 0 4 -4 0 16 -2 -4 8 -4 -8 4 8 4 -6 0 0 12 4 -4 -8 0 0 2 4 -1 -2 1 +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 12 8 8 -16 16 -8 4 -8 4 -8 4 -4 -16 -8 12 8 24 -8 -16 -4 16 -4 16 16 -8 16 16 8 16 -16 -24 16 -8 16 -16 -8 -2 -8 8 8 8 -8 -8 -4 -8 -8 8 12 16 -4 -16 -16 -2 -8 -16 8 24 3 16 -8 -16 -16 -4 -24 16 16 -4 -16 3 8 16 -16 -24 -8 -8 -8 8 16 8 16 -2 8 8 -8 -8 -4 -16 8 12 8 16 -16 -2 8 16 4 -16 8 8 -8 -4 -2 -8 8 -8 8 8 -2 -8 -4 4 1 -4 1 +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 4 -8 -8 0 0 4 -4 -4 0 -4 0 6 16 8 2 -4 0 -4 4 -1 -16 4 0 -8 -2 8 -8 -8 6 0 1 -4 16 0 -8 4 0 4 -4 0 -4 -8 -2 8 8 0 0 -4 8 0 4 -12 0 -16 -2 4 8 -4 -8 12 0 -4 -6 0 8 4 -4 4 0 0 -8 2 4 -1 -2 1 +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 0 0 0 0 0 -16 16 -8 -2 -8 8 0 0 0 0 12 -8 -8 -8 -4 0 -4 0 16 -2 -8 0 0 0 3 0 -8 0 16 -4 -8 16 16 -4 0 3 8 0 0 -8 0 -8 0 0 0 0 -16 -2 0 0 0 0 12 16 -8 -4 8 0 0 -2 0 -16 -4 16 8 0 0 -4 6 0 8 0 0 0 6 0 -4 -4 1 -4 1 +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 0 2 -4 0 0 0 -1 -8 -4 -8 0 -2 0 0 0 6 0 1 -4 8 8 0 0 -8 0 0 0 0 0 -2 -4 -4 -4 -4 4 -8 0 -4 -4 8 8 -2 0 0 0 8 4 4 0 -6 -4 4 4 0 0 -4 4 -4 2 0 -1 -2 1 +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 8 -8 0 -8 8 0 0 0 0 -8 -8 2 0 0 -4 0 -1 -16 8 8 8 -8 0 0 0 4 0 -1 8 -16 8 0 -4 0 8 -4 -8 0 -8 -2 -4 12 8 -8 0 8 0 0 0 0 -8 2 0 -8 -4 8 0 4 -4 4 2 0 8 8 -4 4 2 0 -4 -4 1 -4 1 +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 0 4 -4 0 0 0 2 8 0 -6 -4 0 0 12 3 0 -4 -8 0 2 0 -8 8 -2 0 -3 -4 0 8 0 0 0 -12 0 8 4 0 -6 -4 4 0 0 0 0 0 0 4 0 -8 6 -4 0 0 0 -4 4 0 2 0 0 4 12 0 -4 0 0 2 0 -1 -2 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 -8 8 0 8 -8 0 0 -16 8 8 -8 2 0 0 4 0 -1 0 -8 -8 8 0 0 0 0 4 0 -1 8 0 -8 0 4 0 -8 4 -8 0 -8 -2 12 -4 -8 8 0 8 0 0 0 -16 8 2 0 -8 -4 8 0 4 4 4 2 0 8 -8 4 4 2 0 -4 -4 1 -4 1 +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 -4 -1 0 0 -8 -8 0 0 -8 8 4 0 -1 8 0 -8 0 0 0 -4 0 -8 4 8 -2 0 -8 4 -4 0 0 0 0 -8 0 8 2 4 8 0 0 -8 8 0 4 -2 -4 8 -4 0 8 -2 -4 -4 0 1 -4 1 +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 0 0 -2 4 -8 -4 0 3 -8 -4 0 0 2 0 8 -8 -2 8 -3 -4 8 0 0 -4 0 0 -4 0 0 0 -2 0 0 -4 4 0 0 0 0 4 -8 0 2 0 0 0 0 -4 0 4 2 0 4 4 0 4 0 0 -4 2 0 -1 -2 1 +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 -4 4 -8 8 0 4 -4 0 0 0 -6 8 0 2 12 -16 0 -12 3 0 12 -8 0 -6 0 -8 8 -2 16 -3 -4 0 8 0 0 0 -4 0 -8 -4 0 2 4 -4 8 -8 0 0 0 0 4 0 -8 -2 4 0 0 0 -4 -4 0 2 0 8 4 4 0 4 0 -8 2 0 -1 -2 1 +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 -2 8 0 2 4 0 -4 -4 -1 8 -4 -8 0 -2 -8 -8 -8 -2 0 1 -4 -8 8 8 4 0 -4 -4 0 4 0 -2 0 0 0 0 -4 0 0 4 -4 8 -8 -2 -4 0 4 0 4 0 -4 2 0 0 4 4 4 0 0 0 2 -4 -1 -2 1 +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 -2 -8 0 2 4 0 4 4 -1 -8 -4 8 0 -2 -8 -8 -8 -2 0 1 -4 8 -8 8 -4 0 4 4 0 -4 0 -2 0 0 0 0 -4 0 0 4 -4 -8 8 -2 4 0 4 0 4 0 4 2 0 0 4 -4 -4 0 0 0 2 -4 -1 -2 1 +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 4 0 -2 0 8 2 4 0 0 0 -1 0 4 0 -8 6 0 0 0 -2 0 1 -4 0 0 0 0 8 0 0 0 0 -8 -2 -4 -4 4 4 4 0 0 -4 4 0 0 -2 0 8 0 0 -4 -4 0 2 4 4 4 0 0 4 -4 -4 2 0 -1 -2 1 +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 0 0 0 0 -4 -4 -4 -8 -4 0 -2 0 -8 -2 -4 16 12 4 -1 0 -4 0 -8 -2 8 8 8 -2 -16 1 -4 0 0 -8 4 -8 4 -4 16 -4 -8 2 0 0 0 0 4 8 8 4 -4 0 0 2 4 8 0 -8 4 -8 -4 2 4 8 4 -4 4 8 -4 -8 2 0 -1 -2 1 +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 8 -8 -8 8 -4 -4 -4 8 -4 0 -2 0 8 -2 -4 0 -4 4 -1 0 -4 0 8 -2 8 8 8 -2 0 1 -4 0 0 -8 4 8 -12 12 0 -4 8 2 -8 8 8 -8 4 -8 -8 4 -4 0 0 2 4 -8 8 8 4 0 -4 2 -4 0 4 12 -12 0 4 0 2 -8 -1 -2 1 +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 -8 8 8 -8 -4 -4 -4 8 -4 0 -2 0 8 -2 -4 0 4 -4 -1 0 -4 0 8 -2 8 8 8 -2 0 1 -4 0 0 -8 -4 8 12 -12 0 4 8 2 8 -8 -8 8 4 -8 -8 4 -4 0 0 2 -4 -8 8 8 4 0 4 2 -4 0 4 -12 12 0 4 0 2 -8 -1 -2 1 +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 -8 -16 -2 -4 0 0 0 -1 8 4 -8 0 -2 0 0 0 -2 0 1 -4 -8 8 0 0 0 0 0 0 0 0 2 4 4 -4 -4 -4 -8 8 -4 4 -8 8 2 0 0 4 8 -4 -4 0 2 0 4 4 0 0 4 0 -4 2 -4 -1 -2 1 +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 8 0 8 0 8 -8 24 12 0 8 4 8 -12 -8 -8 -4 -2 -4 -4 0 16 -16 0 -4 -4 -4 8 -4 0 6 0 24 -2 -4 0 -12 4 -1 0 -4 0 -8 -10 -8 -8 -8 -2 0 1 -4 0 0 8 -4 -8 4 4 0 -4 -8 2 0 -16 16 0 4 -8 -8 4 12 0 0 2 4 8 0 8 -12 -8 4 2 4 8 4 -4 -4 8 -4 -8 2 0 -1 -2 1 +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 -16 -8 -4 -8 -4 24 24 -4 -2 -4 12 8 8 8 8 -4 -4 -4 -8 -4 16 -2 16 -8 -2 -4 -16 -4 -4 -1 16 -4 16 -8 -2 -8 -8 -8 10 -16 -1 4 16 16 -8 -4 -8 -12 -12 -16 -4 8 -2 8 8 8 8 -4 8 -8 -4 4 16 16 -2 -4 8 -8 8 4 0 -4 10 -4 0 4 -12 -12 0 -4 0 6 -8 -1 6 -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 16 16 16 16 8 -8 8 8 -12 -12 -8 -12 -24 -8 16 16 8 -12 -8 -4 -8 -4 -4 -16 -8 -12 24 24 -8 -16 -4 -16 -12 -16 -48 24 16 16 8 -16 -48 -24 -48 -24 16 16 8 6 8 8 -8 -8 -8 -8 12 8 8 24 12 -16 4 -16 16 6 8 -16 -24 -24 3 -16 8 -16 16 4 24 16 16 -4 16 -3 -8 16 16 -24 8 -24 24 24 16 8 -16 -6 8 8 8 8 -12 -16 -24 -12 -8 16 16 -6 -8 16 12 16 8 -8 -8 4 6 -8 8 -24 -24 8 -6 8 -4 -12 1 4 -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 -12 8 8 0 0 4 -4 -4 0 -4 16 -2 0 -8 2 -4 0 -4 4 -1 0 4 -16 8 6 8 -8 -8 2 0 -1 4 0 -16 8 -4 0 -4 4 0 4 -8 2 8 8 0 0 4 8 0 -4 -4 16 0 2 4 -8 -4 8 -4 0 -4 2 0 -8 4 -4 4 0 0 -8 6 -4 -1 6 -1 +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 0 -8 -2 4 0 0 0 -1 0 -4 0 -8 -2 0 0 0 2 0 -1 4 0 0 0 0 0 0 0 0 0 -8 -2 4 4 4 4 4 0 8 4 4 0 0 -2 0 -8 -4 0 4 -4 0 2 0 -4 4 0 0 -4 0 -4 6 -4 -1 6 -1 +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 2 -4 0 0 0 -1 8 -4 8 0 -2 0 0 0 2 0 -1 -4 8 8 0 0 8 0 0 0 0 16 2 -4 -4 -4 -4 -4 -8 0 4 -4 8 8 2 0 16 0 -8 -4 -4 0 2 -4 -4 -4 0 0 -4 -4 -4 6 0 -1 6 -1 +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 -4 0 -1 -8 0 0 0 0 0 0 0 -4 0 1 0 8 0 0 4 0 8 4 -8 0 0 2 4 4 0 0 0 0 0 0 0 8 0 -2 0 0 4 0 0 -4 -4 4 2 0 0 -8 -4 4 -2 0 -4 -4 1 4 -1 +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 -4 0 0 8 8 4 -4 -4 0 -4 -16 6 0 8 2 -4 0 4 -4 -1 0 4 16 -8 -2 8 -8 -8 2 0 -1 -4 0 16 8 4 0 4 -4 0 -4 -8 2 0 0 8 8 4 8 0 -4 4 -16 0 2 -4 -8 -4 8 4 -8 4 2 0 0 -4 4 -4 -8 0 0 6 -4 -1 6 -1 +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 8 4 -1 0 0 -8 0 0 0 0 0 -4 -8 1 0 0 8 0 0 0 4 8 0 4 0 -2 0 0 4 4 0 0 0 0 0 0 8 2 -4 0 4 0 0 0 0 4 2 -4 0 -4 -8 0 -2 4 -4 -4 1 4 -1 +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 -8 -4 0 -4 0 0 -2 -8 0 0 0 3 0 -8 0 0 -4 -8 0 0 -4 0 -3 0 0 0 8 0 -8 0 0 0 0 16 2 0 0 0 0 4 0 8 4 0 0 0 2 0 -16 4 0 0 0 0 4 -2 0 0 0 0 0 2 0 -4 -4 1 4 -1 +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 -16 8 6 8 8 0 0 0 0 -4 8 8 -24 -4 0 4 0 -16 6 8 0 0 0 3 0 8 0 -16 4 8 16 16 -4 0 -3 -8 0 0 -8 0 8 0 0 0 0 16 -6 0 0 0 0 4 16 24 4 -8 0 0 -6 0 -16 4 -16 8 0 0 4 -2 0 8 0 0 0 2 0 -4 -4 1 4 -1 +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 -4 0 16 2 8 0 0 0 3 0 -8 0 16 -4 0 0 0 -4 0 -3 0 0 0 0 0 8 0 0 0 0 0 -2 0 0 0 0 4 16 0 12 0 0 0 -2 0 0 0 -16 0 0 0 4 2 0 0 0 0 0 -2 0 -4 0 1 4 -1 +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 24 -12 -24 0 0 0 0 -12 0 0 12 -24 0 0 0 -12 -6 12 12 0 0 -12 12 0 12 -12 0 0 24 -6 0 0 6 -12 24 -12 0 3 -24 12 0 0 -6 0 24 -24 -6 24 3 12 -24 0 0 -4 0 0 12 0 0 0 -6 0 0 -12 12 0 0 0 0 -12 24 0 6 0 0 0 0 -12 0 -4 -6 0 -12 12 0 12 0 0 -12 6 0 -1 6 -1 +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 -4 4 8 -8 0 -12 12 0 0 0 2 8 0 2 -4 16 0 -12 3 0 -4 -8 0 2 0 -8 8 -6 16 3 4 0 -8 0 0 0 4 0 8 4 0 -2 -4 4 8 -8 0 0 0 0 -4 0 8 2 4 0 0 0 -4 -4 0 -6 0 -8 4 4 0 -4 0 -8 6 0 -1 6 -1 +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 0 -8 8 0 0 8 8 -16 -8 -2 0 -8 8 -4 -1 -8 -8 0 8 0 0 0 0 4 8 1 0 8 0 0 0 0 -4 8 0 -4 -8 -2 -8 8 4 -12 0 8 0 0 8 -8 16 2 4 8 -4 -8 -8 0 0 -4 2 4 0 4 -8 0 -2 -4 -4 4 1 4 -1 +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 -4 8 -8 -4 4 0 12 -12 0 0 -8 2 0 0 -2 4 8 -4 0 3 8 -4 0 0 2 0 -8 8 -6 8 3 -4 8 0 0 4 0 0 4 16 0 0 2 8 -8 -4 4 0 0 0 0 4 -8 0 -2 0 0 0 0 4 -8 4 -6 0 -4 -4 0 4 -8 0 -4 6 0 -1 6 -1 +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 0 8 -8 0 0 -8 0 0 -8 -2 0 -8 -8 4 -1 8 8 -16 8 -8 0 0 0 4 8 1 0 -8 16 0 0 0 4 -8 0 4 -8 -2 8 -8 -12 4 0 8 0 0 8 8 0 2 -4 8 -4 -8 -8 0 0 -4 2 4 0 -4 8 0 -2 -4 -4 4 1 4 -1 +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 -4 0 -1 -8 0 0 -8 0 0 -8 8 4 8 1 0 8 0 0 -4 0 0 4 0 0 8 -2 4 -4 8 0 0 0 0 0 0 -8 0 2 0 -8 0 0 0 4 4 -4 -2 0 0 0 -4 -4 2 0 -4 0 1 4 -1 +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 0 0 -4 -1 0 0 8 8 0 0 -8 8 4 0 1 0 0 -8 0 0 0 4 0 8 -4 8 2 8 0 4 -4 0 0 0 0 0 0 8 -2 4 -8 0 0 0 0 0 -4 -2 4 0 -4 0 0 2 -4 -4 0 1 4 -1 +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 -12 -8 8 -16 16 -8 -4 -8 -4 -8 -4 -4 -16 -8 -12 -8 -24 -8 -16 -4 16 4 16 -16 -8 -16 -16 -8 -16 -16 -24 16 -8 -16 16 8 -2 8 -8 -8 -8 8 8 -4 8 8 8 12 -16 4 16 16 -2 8 16 8 24 3 -16 8 16 16 4 -24 -16 -16 -4 -16 -3 8 16 -16 24 8 8 8 -8 16 -8 16 2 8 8 -8 -8 4 -16 -8 -12 8 16 -16 2 8 -16 4 16 -8 -8 -8 4 -2 8 -8 -8 8 8 2 -8 -4 -4 1 4 -1 +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 0 -6 -8 0 0 0 3 0 8 0 0 4 0 16 16 -4 0 -3 8 0 0 0 0 8 0 0 0 0 0 6 0 0 0 0 4 0 0 -4 8 0 0 6 0 0 0 0 -8 0 0 4 2 0 -8 0 0 0 -2 0 -4 0 1 4 -1 +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 -12 -8 8 16 -16 8 -4 -8 -4 -8 -4 -4 -16 -8 -12 8 24 -8 -16 -4 16 4 16 -16 -8 -16 -16 -8 16 16 24 -16 8 -16 16 8 -2 8 -8 8 8 -8 -8 -4 8 8 8 12 16 4 -16 16 -2 8 -16 -8 -24 3 16 8 -16 16 4 -24 -16 -16 -4 16 -3 8 -16 16 24 -8 8 -8 8 -16 8 16 2 -8 -8 8 8 4 -16 -8 -12 8 -16 16 2 -8 -16 4 16 -8 8 8 4 -2 -8 -8 8 -8 -8 2 8 -4 -4 1 4 -1 +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 0 0 0 0 0 16 -16 8 -2 8 -8 0 0 0 0 12 8 8 -8 -4 0 4 0 -16 -2 8 0 0 0 3 0 8 0 -16 4 -8 -16 -16 -4 0 -3 8 0 0 8 0 8 0 0 0 0 -16 2 0 0 0 0 -12 16 8 4 8 0 0 2 0 16 -4 -16 -8 0 0 4 6 0 -8 0 0 0 -6 0 -4 4 1 4 -1 +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 -8 0 8 -8 0 0 0 0 -8 8 2 0 0 4 0 -1 -16 -8 8 -8 8 0 0 0 4 0 1 8 16 -8 0 -4 0 8 -4 8 0 -8 2 4 -12 -8 8 0 8 0 0 0 0 8 -2 0 8 -4 -8 0 4 4 -4 2 0 -8 -8 4 -4 -2 0 -4 4 1 4 -1 +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 -6 24 -12 -24 0 0 0 0 12 24 -24 0 0 -12 0 0 -12 6 -12 -12 -12 12 0 0 0 -12 12 0 0 0 -6 -24 0 -6 12 0 0 12 3 0 12 24 0 -6 0 24 -24 -6 0 3 -12 0 24 0 0 0 12 0 24 -4 0 6 -12 12 0 0 0 0 0 0 12 0 -24 -6 -4 0 0 0 12 -12 0 -6 0 0 -12 12 0 -12 0 0 6 0 -1 6 -1 +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 -8 8 0 -8 8 0 0 -16 -8 8 8 2 0 0 -4 0 -1 0 8 -8 -8 0 0 0 0 4 0 1 8 0 8 0 4 0 -8 4 8 0 -8 2 -12 4 8 -8 0 8 0 0 0 16 -8 -2 0 8 -4 -8 0 4 -4 -4 2 0 -8 8 -4 -4 -2 0 -4 4 1 4 -1 +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 0 0 -8 8 0 0 8 -8 4 0 1 8 0 8 0 0 0 -4 0 8 4 8 2 0 8 -4 4 0 0 0 0 -8 0 -8 -2 -4 -8 0 0 8 8 0 -4 -2 -4 -8 4 0 -8 2 4 -4 0 1 4 -1 +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 0 0 0 0 -16 -16 2 0 -8 -8 -8 -8 -8 -4 16 16 0 4 0 0 0 16 2 0 16 0 0 3 0 0 0 16 0 0 16 16 -8 16 3 -8 0 0 0 0 8 0 0 16 0 0 2 -8 -8 -8 -8 -4 -16 0 4 -8 0 0 2 0 0 8 -16 -8 8 0 -8 2 8 -8 0 0 8 2 8 -8 8 1 -8 1 +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 4 8 0 16 -4 0 0 16 0 8 0 -4 0 16 -8 32 32 0 16 0 0 0 0 -32 0 -16 -2 16 0 8 8 8 8 12 -16 -16 8 -4 -16 8 -16 0 -2 16 16 0 0 3 -16 16 -16 0 8 8 0 0 -8 16 3 0 -16 -16 8 0 -8 0 0 16 0 -32 -2 8 8 8 8 12 0 8 -4 0 -16 -16 -2 0 -32 4 0 0 8 0 -8 6 8 0 0 0 8 6 8 -8 4 1 -8 1 +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 -8 8 8 -12 -16 8 4 8 4 -24 -24 4 -2 4 -12 8 8 8 8 -4 4 4 -8 -4 16 2 16 8 -2 4 -16 4 4 -1 16 4 16 8 2 -8 8 8 10 16 1 4 -16 -16 8 -4 8 -12 -12 16 -4 8 2 -8 -8 -8 -8 4 8 8 4 4 -16 -16 2 4 -8 -8 -8 -4 0 4 -10 -4 0 -4 12 12 0 4 0 6 8 -1 -6 1 +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 0 0 0 0 -8 4 0 8 -2 8 -8 8 4 -1 8 0 16 -8 -4 0 0 0 0 -8 -1 -8 8 16 0 0 0 -4 -8 0 -4 -8 2 0 0 4 4 0 -8 0 0 0 -8 0 -2 -4 -8 4 -8 0 8 0 0 2 12 -8 -4 -8 8 2 12 -8 4 1 -8 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 0 0 0 0 0 0 16 -4 8 -8 2 -8 0 -4 0 -1 0 0 -8 8 4 0 0 0 0 0 -1 0 0 -8 0 -4 0 -8 -4 -8 0 -8 -2 4 4 0 0 0 -8 0 0 -8 16 8 2 0 -8 4 -8 -8 12 -4 0 2 8 0 -8 -4 12 2 8 -8 4 1 -8 1 +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 0 2 0 8 -2 -4 0 0 0 -1 0 4 0 8 2 0 0 0 2 0 1 4 0 0 0 0 0 0 0 0 0 -8 2 -4 -4 -4 -4 -4 0 -8 -4 4 0 0 2 0 8 -4 0 -4 -4 0 -2 0 -4 -4 0 0 4 0 4 6 4 -1 -6 1 +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 8 0 2 4 0 0 0 -1 8 4 8 0 2 0 0 0 2 0 1 -4 -8 -8 0 0 -8 0 0 0 0 16 -2 4 4 4 4 4 -8 0 -4 -4 -8 -8 -2 0 -16 0 8 4 -4 0 -2 -4 -4 4 0 0 4 4 4 6 0 -1 -6 1 +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 2 4 4 0 0 8 8 4 4 4 0 -4 -16 -6 0 -8 2 4 0 -4 4 -1 0 -4 16 8 2 8 8 8 2 0 1 -4 0 -16 -8 4 0 4 -4 0 -4 -8 -2 0 0 -8 -8 -4 8 0 4 4 16 0 -2 4 8 -4 -8 -4 -8 -4 -2 0 0 4 -4 4 8 0 0 6 4 -1 -6 1 +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 4 8 -8 -4 4 0 -12 12 0 0 -8 -2 0 0 -2 -4 8 4 0 3 8 4 0 0 -2 0 8 -8 -6 -8 -3 -4 -8 0 0 4 0 0 4 -16 0 0 -2 -8 8 4 -4 0 0 0 0 4 8 0 2 0 0 0 0 -4 -8 -4 6 0 -4 4 0 -4 8 0 4 6 0 -1 -6 1 +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 0 -6 24 12 -24 0 0 0 0 -12 24 24 0 0 12 0 0 12 6 12 12 -12 12 0 0 0 12 -12 0 0 0 6 -24 0 -6 -12 0 0 -12 3 0 -12 24 0 6 0 -24 24 -6 0 -3 -12 0 -24 0 0 0 12 0 -24 -4 0 -6 12 -12 0 0 0 0 0 0 12 0 24 6 4 0 0 0 -12 -12 0 6 0 0 12 -12 0 12 0 0 6 0 -1 -6 1 +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 4 -2 4 4 -8 -8 -8 -8 -4 4 4 -8 -4 -16 2 -16 8 -2 4 -16 4 4 -1 -16 4 -16 8 2 -8 8 8 6 -16 -1 12 -16 -16 -8 4 -8 12 12 -16 4 24 -2 -8 -8 -8 -8 -4 24 -8 -4 12 -16 -16 -2 4 24 -8 24 12 -16 4 6 -4 -16 12 12 12 -16 -4 -16 10 -8 -1 10 -1 +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 0 0 0 16 16 2 0 8 -8 -8 -8 -8 -4 -16 -16 0 4 0 0 0 -16 2 0 16 0 0 3 0 0 0 -16 0 0 -16 -16 -8 -16 -3 -8 0 0 0 0 -8 0 0 -16 0 0 -2 8 8 8 8 4 -16 0 -4 -8 0 0 -2 0 0 8 16 8 8 0 8 2 8 8 0 0 -8 -2 -8 -8 -8 1 8 -1 +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 -16 -4 8 0 16 4 0 0 16 0 8 0 4 0 -16 -8 -32 -32 0 16 0 0 0 0 32 0 16 -2 -16 0 8 8 8 8 12 16 16 8 -4 -16 -8 -16 0 -2 -16 16 0 0 3 -16 -16 -16 0 -8 8 0 0 -8 -16 -3 0 16 16 -8 0 8 0 0 -16 0 -32 2 -8 -8 -8 -8 -12 0 -8 4 0 16 16 2 0 32 4 0 0 8 0 8 6 8 0 0 0 -8 -6 -8 -8 -4 1 8 -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 -2 -8 -8 4 4 0 0 0 0 0 0 0 16 4 8 8 2 8 0 4 0 -1 0 0 -8 -8 -4 0 0 0 0 0 1 0 0 8 0 -4 0 -8 -4 8 0 -8 2 -4 -4 0 0 0 -8 0 0 -8 -16 -8 -2 0 8 4 8 8 12 4 0 2 8 0 8 4 -12 -2 -8 -8 -4 1 8 -1 +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 48 48 48 48 -48 48 48 48 48 24 -24 24 24 12 12 -24 12 24 -24 48 48 24 12 -24 4 -24 4 -12 -48 -24 12 -24 -24 -24 -48 -12 -48 12 -48 48 24 -48 -48 -24 48 -48 -24 -48 -24 -48 -48 -24 6 -24 -24 24 24 24 24 12 -24 -24 24 12 48 -12 48 -48 6 -24 48 -24 -24 3 48 -24 48 -48 -12 24 -48 -48 -12 48 3 -24 48 48 24 -8 24 -24 -24 48 -8 -48 6 24 24 24 24 12 -48 24 12 -24 48 48 6 -8 -48 12 -48 -24 24 -8 -12 6 24 -24 -24 -24 24 6 24 -12 12 1 -12 1 +end diff --git a/demos/ppl_lcdd/examples/mit31-20.ine b/demos/ppl_lcdd/examples/mit31-20.ine new file mode 100644 index 0000000..d38798a --- /dev/null +++ b/demos/ppl_lcdd/examples/mit31-20.ine @@ -0,0 +1,34 @@ +begin +31 20 integer +1 -6 12 3 0 0 0 -12 -8 0 0 12 3 0 0 0 -6 0 1 0 +1 2 -1 2 -2 0 -4 4 -4 -2 0 2 0 1 -2 2 0 0 0 1 +1 0 -3 0 0 2 0 0 -2 0 4 0 0 -1 0 -2 0 2 0 -1 +1 0 1 -2 -2 0 0 0 0 2 0 2 0 1 -2 0 0 0 0 -1 +1 0 -3 2 -2 0 0 0 0 2 0 -2 0 1 2 0 0 0 0 -1 +1 -2 -1 0 0 2 0 0 2 0 0 0 0 -1 0 0 0 -2 0 1 +1 -2 -5 2 2 -4 4 4 0 2 -8 2 0 1 2 2 0 -4 0 1 +1 -2 3 -2 -2 0 4 4 -4 -2 0 -2 0 1 2 -2 0 0 0 1 +1 -2 -1 2 -2 0 4 -4 4 -2 0 2 0 1 -2 -2 0 0 0 1 +1 -4 1 2 2 -4 0 0 4 -2 0 -2 0 1 -2 0 0 4 0 -1 +1 -4 5 0 0 2 0 0 -2 0 -4 0 0 -1 0 2 0 2 0 -1 +1 -6 11 2 2 -4 -4 -4 -8 2 8 2 0 1 2 -2 0 -4 0 1 +1 6 12 3 0 0 0 12 8 0 0 12 3 0 0 0 6 0 1 0 +1 4 4 1 0 0 0 0 0 0 0 -4 -1 0 0 0 -4 0 -1 0 +1 2 0 -1 0 0 0 -4 0 0 0 0 -1 0 0 0 2 0 1 0 +1 2 -4 3 0 0 0 4 -8 0 0 -4 3 0 0 0 2 0 1 0 +1 0 -4 1 0 0 0 0 0 0 0 4 -1 0 0 0 0 0 -1 0 +1 0 0 -3 0 0 0 0 0 0 0 0 3 0 0 0 0 0 -1 0 +1 -2 -4 3 0 0 0 -4 8 0 0 -4 3 0 0 0 -2 0 1 0 +1 -2 0 -1 0 0 0 4 0 0 0 0 -1 0 0 0 -2 0 1 0 +1 -4 4 1 0 0 0 0 0 0 0 -4 -1 0 0 0 4 0 -1 0 +1 6 11 2 2 4 4 4 8 2 8 2 0 1 2 2 0 4 0 1 +1 4 5 0 0 -2 0 0 2 0 -4 0 0 -1 0 -2 0 -2 0 -1 +1 4 1 2 2 4 0 0 -4 -2 0 -2 0 1 -2 0 0 -4 0 -1 +1 2 3 -2 -2 0 -4 -4 4 -2 0 -2 0 1 2 2 0 0 0 1 +1 2 -1 0 0 -2 0 0 -2 0 0 0 0 -1 0 0 0 2 0 1 +1 2 -1 -2 2 0 4 -4 -4 2 0 -2 0 1 -2 2 0 0 0 1 +1 2 -5 2 2 4 -4 -4 0 2 -8 2 0 1 2 -2 0 4 0 1 +1 0 -3 -2 2 0 0 0 0 -2 0 2 0 1 2 0 0 0 0 -1 +1 0 -3 0 0 -2 0 0 2 0 4 0 0 -1 0 2 0 -2 0 -1 +1 -2 -1 -2 2 0 -4 4 4 2 0 -2 0 1 -2 -2 0 0 0 1 +end diff --git a/demos/ppl_lcdd/examples/mit41-16.ine b/demos/ppl_lcdd/examples/mit41-16.ine new file mode 100644 index 0000000..bb26798 --- /dev/null +++ b/demos/ppl_lcdd/examples/mit41-16.ine @@ -0,0 +1,44 @@ +begin +41 16 rational +1 -1 0 0 -1 0 1 0 0 0 0 0 0 0 0 0 +1 -3 2 0 1 0 -1 0 0 0 0 0 0 0 0 0 +1 1 0 -1 0 0 0 0 -1 0 0 0 0 0 0 0 +1 -1 0 -1 0 0 0 0 1 0 0 0 0 0 0 0 +1 -1 -2 1 0 0 0 0 1 0 0 0 0 0 0 0 +1 -3 2 1 0 0 0 0 -1 0 0 0 0 0 0 0 +1 1 -1 1 -1 0 0 0 0 -1 0 0 0 0 0 0 +1 1 -1 -1 1 0 0 0 0 -1 0 0 0 0 0 0 +1 1 1 -1 -1 0 0 0 0 -1 0 0 0 0 0 0 +1 -1 1 -1 -1 0 0 0 0 1 0 0 0 0 0 0 +1 -1 -1 -1 1 0 0 0 0 1 0 0 0 0 0 0 +1 -1 -1 1 -1 0 0 0 0 1 0 0 0 0 0 0 +1 -3 1 1 1 0 0 0 0 -1 0 0 0 0 0 0 +1 1 -1 0 0 0 0 0 0 0 -1 0 0 0 0 0 +1 1 1 0 -2 0 0 0 0 0 -1 0 0 0 0 0 +1 -1 -1 0 0 0 0 0 0 0 1 0 0 0 0 0 +1 -1 1 0 -2 0 0 0 0 0 1 0 0 0 0 0 +1 -3 1 0 2 0 0 0 0 0 -1 0 0 0 0 0 +1 0 0 0 -2 0 0 0 0 0 0 0 1 0 0 0 +1 -2 0 0 0 2 0 0 0 0 0 0 -1 0 0 0 +1 -4 0 0 6 -4 0 0 0 0 0 0 1 0 0 0 +1 0 0 -3 0 0 0 0 0 0 0 0 0 3 0 -1 +1 -2 0 3 -4 8 0 -4 0 0 0 -4 0 3 -2 1 +1 -2 0 -1 0 0 0 4 0 0 0 0 0 -1 -2 1 +1 -4 0 1 4 0 0 0 0 0 0 -4 0 -1 4 -1 +1 -6 0 3 12 -8 0 -12 0 0 0 12 0 3 -6 1 +1 3 2 0 1 0 1 0 0 0 0 0 0 0 0 0 +1 1 0 0 -1 0 -1 0 0 0 0 0 0 0 0 0 +1 1 -2 0 1 0 -1 0 0 0 0 0 0 0 0 0 +1 -1 -2 0 1 0 1 0 0 0 0 0 0 0 0 0 +1 3 2 1 0 0 0 0 1 0 0 0 0 0 0 0 +1 1 -2 1 0 0 0 0 -1 0 0 0 0 0 0 0 +1 3 1 1 1 0 0 0 0 1 0 0 0 0 0 0 +1 3 1 0 2 0 0 0 0 0 1 0 0 0 0 0 +1 4 0 0 6 4 0 0 0 0 0 0 1 0 0 0 +1 2 0 0 0 -2 0 0 0 0 0 0 -1 0 0 0 +1 6 0 3 12 8 0 12 0 0 0 12 0 3 6 1 +1 4 0 1 4 0 0 0 0 0 0 -4 0 -1 -4 -1 +1 2 0 -1 0 0 0 -4 0 0 0 0 0 -1 2 1 +1 2 0 3 -4 -8 0 4 0 0 0 -4 0 3 2 1 +1 0 0 1 -4 0 0 0 0 0 0 4 0 -1 0 -1 +end diff --git a/demos/ppl_lcdd/examples/mit708-9.ine b/demos/ppl_lcdd/examples/mit708-9.ine new file mode 100644 index 0000000..a30a095 --- /dev/null +++ b/demos/ppl_lcdd/examples/mit708-9.ine @@ -0,0 +1,711 @@ +begin +708 9 rational +72 0 0 -4 -4 -2 0 0 0 +216 -2 -2 -10 -12 -6 0 0 0 +192 -4 -2 -8 -8 -8 0 0 0 +288 -12 6 8 -16 -8 0 0 0 +96 -4 2 0 -4 -4 0 0 0 +144 -5 1 -4 -6 -6 0 0 0 +288 -8 -2 -10 -12 -12 0 0 0 +96 -4 2 -4 -2 -4 0 0 0 +240 -7 -1 -10 -8 -10 0 0 0 +288 -8 -2 -12 -8 -12 0 0 0 +288 -8 -2 -8 -16 -8 0 0 0 +96 -4 2 -8 0 0 0 0 0 +0 0 6 -8 4 8 0 0 0 +0 4 6 -8 0 8 0 0 0 +24 2 2 -4 -2 2 0 0 0 +864 -24 -6 -40 -16 -32 0 0 0 +24 0 0 -2 -2 2 0 0 0 +0 4 10 -16 0 24 0 0 0 +0 1 1 -4 0 12 0 0 0 +0 0 6 -16 8 40 0 0 0 +96 -4 2 -16 16 32 0 0 0 +288 -8 -2 -16 0 0 0 0 0 +96 -4 2 8 -8 8 0 0 0 +288 -8 -2 8 -24 24 0 0 0 +0 0 2 -8 8 24 0 0 0 +96 -1 -1 -4 -8 8 0 0 0 +576 -12 -6 -16 -40 16 0 0 0 +192 -4 -2 0 -16 16 0 0 0 +576 -8 -6 -24 -32 -16 0 0 0 +576 -12 -6 -20 -32 -16 0 0 0 +960 -16 -10 -40 -56 -16 0 0 0 +160 0 0 -7 -7 -6 -1 0 -1 +480 -4 -4 -21 -21 -18 -1 0 -3 +192 -4 -4 -12 -4 -8 4 2 -4 +640 -16 -8 -28 -28 -24 4 2 -4 +640 -8 -6 -28 -28 -24 0 0 -4 +192 -8 0 -8 -8 -8 4 2 0 +384 -12 -4 -16 -16 -16 4 2 0 +960 -20 -12 -42 -42 -36 4 2 -6 +240 -9 -1 -11 -9 -10 3 2 -1 +0 2 2 4 0 0 -4 -2 0 +640 -22 -4 -24 -28 -24 8 4 -4 +1920 -60 -20 -76 -84 -72 20 10 -12 +1920 -32 -22 -84 -84 -72 4 2 -12 +960 -28 -10 -44 -36 -40 8 4 -4 +1152 -36 -12 -52 -44 -48 12 6 -4 +720 -23 -7 -33 -27 -30 7 4 -3 +1920 -48 -24 -88 -72 -80 12 6 -8 +3456 -96 -40 -160 -128 -144 28 14 -16 +576 -15 -7 -26 -20 -24 4 2 -4 +384 -12 -4 -20 -12 -16 4 2 0 +336 -11 -3 -17 -11 -14 3 2 -1 +192 -8 0 -12 -4 -8 4 2 0 +0 0 0 -4 4 0 4 2 0 +0 0 2 -8 8 0 8 4 -2 +192 -12 12 -28 12 -8 20 10 -4 +192 -12 12 -20 4 -8 12 6 -2 +1920 -48 -24 -92 -60 -80 12 6 -4 +576 -15 -7 -28 -18 -24 4 2 -2 +1536 -42 -18 -76 -40 -64 12 6 -8 +384 -12 -4 -20 4 -16 4 2 -4 +1920 -60 -20 -102 18 -76 14 10 -18 +1920 -60 -20 -102 -46 -76 14 10 -2 +672 -22 -6 -37 -17 -26 5 4 -1 +640 -22 -4 -36 -16 -24 4 4 0 +960 -40 0 -64 -16 -32 8 10 0 +64 -4 4 -8 0 0 0 2 0 +0 0 8 -6 2 4 -2 2 0 +0 8 18 -8 0 8 -8 2 0 +64 36 60 -28 -4 24 -28 6 -4 +192 28 36 -20 -12 8 -20 2 -4 +96 4 4 -5 -5 -2 -3 0 -1 +64 4 6 -4 -4 0 -4 0 0 +96 0 0 -5 -5 -2 -1 0 -1 +192 -6 0 -8 12 -8 0 0 -4 +960 -30 -8 -48 -20 -40 8 4 -4 +960 -32 -8 -52 -20 -40 12 6 -4 +960 -32 -8 -52 44 -40 12 6 -20 +960 -30 -8 -48 12 -40 8 4 -12 +576 -16 -6 -28 -12 -24 4 2 -4 +208 -8 0 -8 -8 -8 4 2 -2 +160 -7 1 -5 -7 -6 3 2 -1 +192 -12 12 0 -8 -8 8 6 0 +160 -9 7 -1 -7 -6 5 4 -1 +640 -20 -4 -20 -28 -24 4 2 -4 +96 -5 3 -2 -4 -4 2 2 0 +480 -18 -2 -17 -21 -18 7 4 -3 +528 -19 -3 -20 -22 -20 8 4 -4 +1152 -36 -4 -32 -40 -48 0 2 -8 +1152 -36 -12 -48 -40 -48 8 6 -8 +192 -8 0 -4 -4 -8 4 2 -4 +192 -6 0 0 -4 -8 0 0 -4 +384 -12 -4 -8 -8 -16 4 2 -8 +1920 -48 -24 -48 -40 -80 12 6 -40 +384 -16 2 -20 -12 -16 4 4 0 +576 -24 0 -32 -16 -24 8 6 0 +432 -17 -1 -23 -13 -18 5 4 -1 +576 -28 12 -36 -12 -24 12 10 -4 +960 -52 36 -92 12 -40 52 26 -12 +0 0 4 -14 10 4 6 6 -2 +2688 -72 -32 -120 -104 -112 16 10 -8 +0 0 8 -20 12 56 -12 2 -4 +64 -4 4 -16 8 24 -4 2 0 +192 -8 0 -16 0 0 0 2 0 +64 8 16 -20 -4 24 -12 2 -4 +0 2 4 -4 0 8 -4 0 0 +288 -13 3 -12 -10 -12 6 4 -2 +336 -14 2 -15 -11 -14 7 4 -3 +96 3 1 -8 -6 4 0 0 -2 +192 12 0 -20 -12 8 4 2 -4 +0 4 8 -6 2 4 -2 2 -2 +192 -12 12 -28 28 -8 20 10 -12 +0 0 0 -4 16 0 4 2 -6 +0 0 0 -4 40 0 4 2 -12 +192 -8 0 -12 44 -8 4 2 -12 +0 0 2 0 32 0 0 0 -8 +192 -12 12 -20 300 -8 12 6 -76 +960 -40 0 -64 208 -32 8 10 -56 +2112 -72 -16 -120 120 -80 16 14 -48 +512 -16 -4 -26 6 -20 2 2 -6 +512 -16 -4 -26 -10 -20 2 2 -2 +448 -16 0 -24 -8 -16 0 2 0 +448 24 8 -68 -20 56 12 6 -20 +192 8 2 -24 -8 16 4 2 -8 +192 16 0 -36 -4 24 12 6 -12 +448 -13 -5 -23 -13 -18 3 2 -1 +0 2 -2 -4 4 0 4 2 -2 +0 0 0 -22 22 4 14 10 0 +0 0 0 -22 82 4 14 10 -30 +0 0 4 -14 34 4 6 6 -14 +480 -21 3 -20 -18 -20 8 6 -2 +480 -19 1 -16 -18 -20 4 4 -2 +1344 -52 0 -44 -52 -56 12 10 -4 +576 -22 0 -12 -24 -24 4 4 0 +768 -28 -4 -24 -32 -32 8 6 0 +768 -28 -4 40 -32 -32 -8 6 0 +576 -22 0 20 -24 -24 -4 4 0 +320 -12 0 10 -14 -12 -2 2 -2 +160 -7 1 3 -7 -6 1 2 -1 +0 2 2 -12 8 16 4 2 -4 +0 22 14 -52 16 80 12 6 -16 +192 32 16 -68 -4 88 12 6 -20 +128 18 10 -36 -8 48 4 2 -8 +64 8 8 -20 -4 24 -4 2 -4 +0 4 2 -4 4 8 0 0 -4 +0 4 8 -14 2 20 -4 2 -2 +0 1 7 -11 3 14 -3 2 -1 +0 0 8 -12 4 16 -4 2 0 +0 4 12 -20 4 32 -8 2 0 +0 0 24 -44 20 64 -16 6 0 +0 0 4 -10 6 12 -2 2 -2 +0 14 22 -44 8 64 -12 6 -8 +0 6 10 -18 2 28 -6 2 -2 +192 28 36 -52 -12 72 -36 2 -12 +96 3 3 -8 -6 4 -4 0 -2 +0 0 12 -10 6 12 -6 2 -2 +48 0 0 -3 -3 2 -1 0 -1 +192 16 24 -44 -12 72 -28 2 -12 +0 4 12 -14 2 20 -8 2 -2 +0 1 9 -11 3 14 -5 2 -1 +192 32 40 -68 -4 88 -36 6 -20 +16 1 1 -3 -1 6 -1 0 -1 +64 4 6 -12 -4 24 -8 0 -4 +0 4 12 -20 4 40 -12 2 -4 +0 0 10 -16 8 24 -8 2 0 +192 -12 12 -40 16 32 -8 6 0 +0 0 24 -34 14 44 -14 6 -2 +64 -4 4 -16 8 16 0 2 0 +0 0 4 -14 10 20 2 2 -2 +0 0 2 -2 2 4 -2 0 0 +0 0 24 -44 20 72 -20 6 -4 +0 6 10 -16 4 24 -8 2 -4 +0 1 1 -1 1 2 -1 0 -1 +0 6 18 -16 4 24 -12 2 -4 +384 0 -2 -20 -20 -8 0 0 -4 +384 -12 -4 -12 -20 -8 4 2 -4 +640 -16 -8 -20 -36 -8 4 2 -4 +1280 -6 -14 -60 -80 0 -4 2 0 +1024 -2 -10 -52 -64 0 -4 2 0 +1024 -12 -12 -48 -56 -16 0 2 -8 +384 8 -4 -24 -24 0 0 2 0 +256 4 -4 -16 -16 0 2 2 0 +1024 0 -16 -56 -56 -16 8 6 -8 +960 0 -16 -52 -52 -16 12 6 -8 +6400 -96 -72 -280 -280 -240 8 6 -40 +960 -16 -12 -42 -42 -36 2 2 -6 +3840 -48 -40 -168 -168 -144 0 2 -24 +4032 -72 -48 -178 -178 -148 10 6 -26 +1152 -20 -14 -52 -52 -40 4 2 -8 +0 2 -2 0 0 0 2 2 0 +192 -6 0 12 -8 -8 -4 0 0 +192 -4 -4 -8 -8 -8 4 2 0 +6912 -176 -88 -288 -288 -288 40 26 0 +1920 -48 -24 -80 -80 -80 10 6 0 +576 -12 -10 -24 -24 -24 6 4 0 +5760 -168 -64 -264 -216 -240 48 26 -24 +960 -48 24 -36 -36 -40 20 18 -4 +960 -44 12 -28 -36 -40 12 14 -4 +192 -12 12 4 -4 -8 4 6 -4 +960 -56 48 -20 -36 -40 28 26 -4 +640 -20 0 -4 -28 -24 -2 0 -4 +576 -24 0 -28 -12 -24 4 6 -4 +0 0 0 4 8 0 -2 0 -4 +192 -6 0 -4 12 -8 -4 0 -6 +960 -30 0 -32 -12 -40 -8 0 -6 +960 -32 0 -36 -20 -40 -4 2 -4 +640 -20 0 -28 -4 -24 -4 0 -2 +0 0 20 -4 12 8 -12 0 -2 +16 0 0 -1 -1 6 -1 0 -1 +1536 -62 0 -80 -44 -64 16 14 0 +1344 -42 -12 -64 -44 -56 12 6 -4 +2880 -90 -28 -128 -108 -120 28 14 -12 +960 -30 0 -12 -32 -40 -6 0 -8 +768 -30 0 -24 -28 -32 6 6 -4 +576 -24 0 -20 -20 -24 8 6 -4 +576 -24 0 -15 -23 -22 9 6 -5 +192 -8 0 12 -4 -8 -4 2 -4 +0 0 0 -8 8 8 4 2 0 +192 -12 12 -76 76 88 20 10 -12 +0 0 6 -28 28 40 8 4 -6 +576 -15 -7 -29 -15 -22 3 2 -1 +448 -13 -5 -25 -7 -14 3 2 -1 +512 -14 -6 -26 -14 -20 4 2 -2 +448 -13 -5 -23 -5 -18 3 2 -3 +384 -6 -4 -16 -20 -8 0 0 -4 +0 8 8 -24 8 48 0 2 -8 +96 -1 -1 0 -6 36 -4 0 -6 +192 -4 -4 12 -12 72 -4 2 -12 +0 0 0 -6 6 4 2 2 0 +384 -12 -4 -22 -6 -12 2 2 0 +1216 -31 -15 -59 -37 -50 7 4 -3 +960 -20 -16 -42 -42 -36 10 6 -6 +2304 -72 -20 -112 -64 -96 16 10 -8 +1344 -42 -12 -64 -36 -56 8 6 -6 +1152 -36 -12 -56 -32 -48 8 6 -4 +384 -12 -4 -16 -8 -16 0 2 0 +192 -6 0 -4 0 -8 -4 0 0 +912 -26 -10 -43 -31 -38 5 4 -1 +960 -27 -11 -46 -32 -40 6 4 -2 +1344 -39 -15 -66 -44 -56 10 6 -4 +4224 -120 -48 -200 -152 -176 32 18 -16 +4992 -132 -60 -240 -168 -208 32 18 -16 +3456 -96 -40 -168 -104 -144 24 14 -16 +2688 -76 -28 -128 -72 -112 16 10 -16 +960 -29 -9 -46 -28 -40 6 4 -4 +0 2 -2 12 0 0 -4 2 0 +960 -20 -20 134 -42 -36 -38 10 -6 +1920 -60 -20 148 -84 -72 -36 10 -12 +1920 -68 -12 100 -84 -72 -20 14 -12 +320 -12 0 -6 -14 -12 2 2 -2 +960 -40 0 -26 -42 -36 18 10 -6 +576 -12 -8 -22 -30 -12 2 2 -6 +576 -12 -10 -8 -24 -24 -2 4 0 +2304 -56 -32 -80 -96 -96 8 10 0 +960 -20 -20 -38 -42 -36 20 10 -6 +192 -6 0 -4 -4 -8 -2 0 -2 +0 0 0 1 1 2 -1 0 -1 +192 -8 0 -4 28 -8 -4 2 -12 +192 -8 0 -4 60 -8 -4 2 -20 +0 0 2 -4 4 16 -4 0 0 +1792 -28 -20 -80 -88 -48 0 2 -16 +384 -3 -3 -18 -20 -8 -2 0 -4 +8064 -204 -100 -384 -264 -336 48 26 -24 +1920 -48 -24 -88 -56 -80 8 6 -8 +384 -12 -4 -16 8 -16 0 2 -8 +192 -12 12 -12 -4 -8 4 6 0 +192 -12 12 -12 12 -8 4 6 -8 +192 -12 12 4 60 -8 -12 6 -28 +0 0 0 -8 8 16 0 2 0 +192 -4 -2 -4 -4 -8 0 0 -4 +192 -4 -4 16 -12 0 -4 2 0 +768 -20 -12 40 -48 0 -8 6 0 +512 -14 -6 20 -32 0 -4 2 0 +1344 -60 12 -68 -44 -56 20 18 -4 +2112 -92 12 -116 -60 -88 28 26 -4 +960 -44 12 -52 -28 -40 12 14 0 +1920 -48 -24 -72 -56 -80 8 6 -24 +96 -5 3 -4 -2 -4 0 2 0 +0 0 2 -8 24 0 8 4 -10 +0 4 4 -16 8 112 -16 2 -8 +384 -12 -4 -24 0 0 0 2 0 +0 2 -2 -4 16 0 4 2 -8 +64 -4 4 -20 20 24 4 2 -2 +128 -6 2 -20 16 16 4 2 -2 +192 -8 0 -20 12 8 4 2 0 +96 -4 0 -14 10 8 4 2 -2 +448 -20 4 -76 60 56 20 10 -12 +192 -4 -2 -4 -12 8 0 0 -4 +384 -12 -4 0 -24 16 4 2 -8 +192 -8 0 4 -12 8 4 2 -4 +192 12 20 -20 -12 8 -12 2 -4 +192 12 4 -20 -12 8 -4 2 -4 +192 76 20 -84 -12 72 -4 18 -12 +64 20 12 -28 -4 24 -4 6 -4 +64 20 44 -28 -4 24 -20 6 -4 +0 12 36 -22 2 20 -14 6 -2 +0 4 10 -8 0 8 -4 2 0 +0 4 6 -8 0 8 -2 2 0 +0 4 0 -6 2 4 2 2 -2 +0 0 4 -6 2 4 0 2 0 +192 4 2 -12 -12 0 -4 0 0 +0 8 8 -16 0 24 -4 2 0 +64 20 4 -28 -4 24 4 6 -4 +0 20 4 -24 0 24 4 6 0 +0 8 0 -8 0 8 4 2 0 +0 5 -1 -6 2 4 4 2 -2 +64 24 0 -28 -4 24 12 6 -4 +96 46 -10 -42 -6 36 18 14 -6 +32 18 -6 -14 -2 12 10 6 -2 +192 112 -40 -84 -12 72 76 38 -12 +0 6 -2 -4 0 4 4 2 0 +0 0 0 0 16 0 0 2 -8 +192 -12 12 4 28 -8 4 6 -20 +960 -40 0 38 -42 -36 2 10 -6 +960 -40 8 -20 -36 -40 4 10 -4 +192 -8 2 0 -8 -8 0 2 0 +384 -18 6 -4 -16 -16 4 6 0 +192 -8 0 8 -8 -8 0 2 0 +320 -20 20 10 -14 -12 14 10 -2 +576 -8 -6 -20 -36 24 -4 0 -12 +96 -1 -1 -4 -6 4 0 0 -2 +192 16 -8 -20 -12 8 12 6 -4 +960 12 -20 -60 -52 -8 20 10 -12 +576 -12 -8 -26 -26 -20 4 2 -4 +1920 -48 -24 -68 -100 -40 12 6 -20 +640 -16 -8 -32 -16 -24 4 2 0 +384 -12 -4 -24 0 -8 4 2 0 +192 -8 0 -36 44 24 12 6 -12 +192 -8 0 -36 76 24 12 6 -20 +128 -6 2 -20 40 16 4 2 -8 +64 -4 4 -20 60 24 4 2 -12 +0 0 2 -4 20 8 0 0 -4 +624 -21 -5 -34 -16 -24 4 4 0 +400 -12 -4 -20 -12 -16 2 2 0 +192 1 -1 -10 -12 0 -2 0 0 +640 -16 -8 -8 -40 48 0 2 -16 +1920 -48 -24 -24 -120 80 8 6 -40 +96 8 8 -22 -6 36 -10 2 -6 +0 8 8 -16 0 32 -8 2 0 +2112 -72 -16 -120 -40 -80 16 14 -8 +3456 -100 -36 -160 -120 -144 24 14 -16 +1152 -36 -12 -59 -27 -46 7 6 -3 +1920 -48 -24 -96 -32 -64 8 6 0 +640 -16 -8 -32 0 0 0 2 0 +240 -2 -2 -11 -15 10 -3 0 -5 +960 -20 -12 -32 -56 16 0 2 -16 +1920 -48 -24 216 -80 -80 -64 6 0 +384 -12 -4 32 -16 -16 -8 2 0 +320 -10 0 18 -14 -12 -6 0 -2 +192 -6 0 20 -4 -8 -8 0 -4 +320 -10 0 -14 18 -12 -2 0 -6 +32 -1 1 -4 6 20 -4 0 -2 +192 -8 0 -16 32 0 0 2 -8 +192 -8 0 -20 28 8 4 2 -4 +0 0 0 -8 28 8 4 2 -8 +0 0 0 -6 34 4 2 2 -10 +384 -12 -4 -22 2 -12 2 2 -2 +192 -12 12 28 -12 8 12 6 -4 +576 -24 0 -8 -24 -16 8 6 -8 +192 -8 0 -2 -10 -4 4 2 -2 +768 0 -8 -40 -40 -16 0 2 -8 +3840 0 -56 -200 -200 -80 24 18 -40 +384 0 -6 -20 -20 -8 4 2 -4 +768 -12 -10 -36 -36 -24 4 2 -6 +192 -8 0 -20 28 88 -12 2 -4 +64 -4 4 -20 52 200 -28 2 -12 +0 0 8 -24 72 336 -48 2 -24 +0 1 1 -2 4 40 -6 0 -4 +0 0 2 -4 12 48 -8 0 -4 +1792 -4 -20 -88 -112 0 -8 6 0 +768 4 -12 -40 -48 0 0 6 0 +192 0 -4 -10 -10 -4 2 2 -2 +96 -5 3 1 -5 -2 3 2 -1 +96 6 -2 -10 -6 4 2 2 -2 +528 9 -11 -35 -29 -2 9 6 -7 +480 38 -18 -50 -30 20 22 14 -10 +640 12 -12 -40 -40 0 8 6 0 +48 -3 3 -14 8 24 -4 2 0 +384 2 -6 -20 -24 144 4 2 -24 +192 -4 -2 -6 -10 -4 0 0 -2 +1344 -24 -16 -56 -72 -16 0 2 -16 +2880 -60 -36 -112 -152 -56 12 6 -28 +1344 -24 -16 -56 -72 -24 4 2 -12 +384 -6 -6 -12 -24 0 0 2 0 +64 -4 4 4 -4 0 4 2 0 +384 -12 -4 48 -8 -16 -16 2 -8 +192 -6 0 12 -4 -8 -6 0 -4 +576 -18 0 -23 -3 -22 -5 0 -3 +0 0 0 -22 194 4 14 10 -58 +64 -4 4 -8 96 0 0 2 -24 +0 0 10 -2 154 4 -6 0 -38 +384 -12 -4 16 -24 80 0 2 -16 +64 -2 0 8 -4 24 0 0 -4 +384 -12 -4 48 -24 144 0 2 -24 +192 -8 0 4 -12 0 4 2 0 +384 -12 -4 16 -24 16 0 2 -8 +0 0 6 1 9 2 -5 0 -3 +0 0 2 4 16 0 -4 0 -6 +1344 -56 8 -60 -44 -56 12 14 -4 +192 -4 -2 32 -4 -8 -12 0 -4 +1920 -48 -24 296 -40 -80 -104 6 -40 +192 -4 -2 24 -8 -8 -8 0 0 +960 -20 -10 114 -42 -36 -38 0 -6 +640 -16 -8 68 -28 -24 -20 2 -4 +0 10 2 -12 0 160 -20 2 0 +0 3 -1 -6 4 40 -2 2 -4 +0 8 -8 -24 24 80 8 10 -8 +0 116 -36 -80 0 80 64 38 0 +0 136 -56 -120 40 80 104 58 -40 +0 14 -6 -12 4 8 12 6 -4 +0 10 -6 -12 8 16 12 6 -8 +192 8 -8 -20 -4 88 12 6 -20 +960 0 -16 -52 -52 248 12 6 -52 +0 0 2 -4 20 80 -12 0 -4 +64 -2 0 -4 8 24 -4 0 0 +1920 -40 -20 -68 -84 -72 -2 0 -12 +576 -12 -6 -19 -23 -22 -1 0 -5 +1920 -48 -24 -72 -72 -80 4 6 -8 +192 -4 -4 4 -4 -8 -4 2 -4 +1920 -68 -12 -60 -84 -72 20 14 -12 +0 1 1 -2 4 24 -4 0 -4 +0 0 2 -4 12 32 -6 0 -4 +64 -4 4 -20 52 72 -12 2 -12 +192 -8 0 -20 28 24 -4 2 -4 +448 -16 0 -36 28 56 -12 2 -4 +288 -8 -4 -2 -18 12 2 2 -6 +192 -4 -4 12 -12 8 -4 2 -4 +192 -12 12 14 -10 -4 10 6 -2 +192 -8 0 36 -12 72 4 2 -12 +1344 -24 -16 -36 -84 120 -12 2 -36 +960 -20 -12 -20 -60 72 -4 2 -24 +640 -16 -8 -20 -36 0 4 2 -8 +576 -12 -8 -18 -34 -4 2 2 -2 +192 -4 -4 -4 -12 0 4 2 0 +192 -4 -4 -6 -10 -4 4 2 -2 +192 -4 -4 36 -4 -8 -12 2 -4 +192 -4 -4 28 -8 -8 -8 2 0 +192 -4 -4 4 -8 -8 -2 2 0 +960 -20 -20 22 -42 -36 -10 10 -6 +384 -12 -4 16 -8 -16 -8 2 -8 +576 -12 -6 0 -16 -24 -10 0 -8 +1920 -48 -24 -24 -56 -80 -16 6 -24 +1920 -48 -24 72 -40 -80 -48 6 -40 +192 -4 -2 8 -4 -8 -6 0 -4 +576 -12 -6 -15 -23 -22 -3 0 -5 +0 0 0 -8 24 80 -8 2 -8 +64 -4 4 -20 20 72 -12 2 -4 +192 -8 0 -20 12 24 -4 2 0 +192 -6 0 -12 8 8 -4 0 0 +0 0 0 -8 24 16 0 2 -8 +0 0 2 -4 20 16 -4 0 -4 +0 0 2 -4 12 24 -4 0 -4 +96 -4 0 -14 10 20 -2 2 -2 +64 -4 4 -20 52 40 -4 2 -12 +192 -12 12 -60 188 152 -28 6 -36 +0 0 14 -18 6 20 -6 4 0 +576 -8 -8 -20 -36 24 -4 2 -12 +640 -16 -8 24 -40 48 -8 2 -16 +192 -6 0 8 -12 8 0 0 -4 +640 -20 -4 16 -40 48 0 2 -16 +960 -20 -12 -4 -60 168 -12 2 -36 +640 -16 -8 24 -40 176 -8 2 -32 +640 -16 -8 56 -40 240 -8 2 -40 +960 -20 -12 28 -60 296 -20 2 -52 +192 -4 -2 12 -12 72 -4 0 -12 +1920 -48 -24 156 -100 -40 -44 6 -20 +384 -12 -4 20 -20 -8 -4 2 -4 +192 -8 0 6 -10 -4 2 2 -2 +0 0 0 8 4 0 -4 0 -2 +192 -12 12 4 12 -8 -12 6 -4 +192 -8 0 -4 4 -8 -4 2 0 +192 -6 0 -4 20 -8 -4 0 -8 +0 3 11 -9 1 10 -5 2 -1 +576 -12 -6 -16 -16 -24 -2 0 -8 +1920 -48 -24 -48 -112 32 8 6 -32 +640 -16 -8 -8 -40 16 0 2 -8 +1152 -12 -12 -52 -60 -24 -4 2 -12 +2880 -60 -36 -112 -152 -48 8 6 -32 +0 8 16 -36 12 120 -28 2 -12 +0 2 4 -8 4 40 -8 0 -4 +0 0 4 -16 16 48 -8 2 -4 +0 4 4 -16 8 48 -8 2 -8 +128 -6 2 -2 -6 -4 2 2 0 +160 -7 1 1 -9 -2 3 2 -1 +288 -8 -4 -2 -18 0 2 2 0 +768 -20 -12 8 -48 0 0 6 0 +0 8 0 0 0 96 -16 2 0 +192 4 -4 12 -12 72 -20 2 -12 +0 6 -2 12 0 48 -12 2 0 +0 12 -4 -8 0 96 -8 6 0 +192 16 -16 -12 -12 72 4 14 -12 +0 14 -10 -4 0 48 4 10 0 +640 -16 -8 32 -40 0 -8 2 0 +1920 -48 -24 104 -120 80 -24 6 -40 +1920 -48 -24 116 -108 8 -36 6 -28 +640 -16 -8 24 -40 16 -8 2 -8 +192 -4 -2 12 -12 8 -4 0 -4 +192 -4 -2 13 -11 2 -5 0 -3 +576 -12 -6 28 -36 16 -12 0 -8 +192 -4 -2 12 -12 0 -4 0 0 +192 -4 -2 18 -10 -4 -6 0 -2 +384 -12 -4 16 -24 0 0 2 0 +384 -12 -4 0 -24 0 4 2 0 +1920 -48 -24 -56 -56 -80 -8 6 -8 +0 20 4 -24 0 288 -40 6 0 +0 2 0 4 0 8 -4 0 0 +0 10 -6 -4 0 16 4 6 0 +0 14 -6 -8 0 8 8 6 0 +0 20 -4 -16 0 16 8 6 0 +0 8 2 -8 0 8 0 2 0 +0 32 0 -32 0 32 8 10 0 +48 19 -1 -21 -3 18 5 6 -3 +1152 -18 -14 -50 -62 -20 2 2 -10 +0 2 -2 -2 2 4 2 2 -2 +192 -4 -2 4 -12 40 -4 0 -8 +192 -4 -2 4 -12 24 -4 0 -6 +128 -3 -1 2 -8 16 -2 0 -4 +64 -4 4 -20 20 40 -4 2 -4 +192 -12 12 -52 36 104 -20 6 -4 +0 0 6 -12 20 40 -8 0 -4 +384 -12 -4 -24 32 64 -8 2 0 +0 0 0 -6 18 4 2 2 -6 +0 0 0 -8 20 8 4 2 -6 +0 0 8 -24 40 208 -32 2 -16 +0 0 8 -24 40 144 -24 2 -16 +0 0 8 -24 40 112 -16 2 -16 +192 -8 0 -20 60 152 -20 2 -4 +64 -4 4 -20 84 264 -36 2 -12 +960 -16 -12 -26 -42 -36 -6 2 -6 +960 -20 -12 -34 -42 -36 0 2 -6 +960 -20 -16 -18 -42 -36 -2 6 -6 +576 -8 -8 -20 -36 88 -4 2 -20 +192 132 -60 -84 -12 72 76 58 -12 +192 20 -12 -20 -12 8 12 10 -4 +96 3 -3 -6 -6 0 2 2 0 +768 16 -16 -48 -48 0 8 10 0 +96 -1 -1 0 -6 20 -4 0 -4 +0 3 5 -10 8 72 -14 0 -8 +0 4 12 -32 24 176 -32 2 -16 +192 -12 12 -60 60 152 -28 6 -4 +192 -12 12 -76 76 184 -28 10 -12 +0 0 0 0 48 0 0 2 -16 +576 -12 -8 -12 -36 24 0 2 -12 +192 -4 -4 -4 -12 8 4 2 -4 +0 0 12 -32 32 96 -16 2 -8 +0 24 -8 -24 8 16 16 10 -8 +0 52 -28 -64 40 80 48 30 -40 +192 -12 12 20 156 -8 -28 6 -60 +192 -12 12 20 380 -8 -28 6 -116 +0 0 2 4 40 0 -4 0 -12 +0 0 6 8 24 0 -8 0 -10 +0 0 8 -36 28 152 -20 6 -4 +32 -2 2 -12 8 32 -4 2 0 +0 0 2 4 4 0 -4 0 0 +0 0 6 8 8 0 -8 0 -2 +0 0 6 1 5 2 -5 0 -1 +1024 -16 -12 -48 -48 -32 4 2 -8 +1248 -23 -15 -55 -57 -42 3 2 -9 +1344 -24 -16 -58 -66 -36 2 2 -12 +1056 -21 -13 -45 -51 -30 3 2 -9 +960 -20 -12 -40 -48 -24 4 2 -8 +0 0 8 -24 24 112 -20 2 -8 +0 4 12 -32 24 144 -24 2 -16 +0 0 8 -24 24 80 -12 2 -8 +0 8 0 -8 24 80 -8 2 -24 +0 6 -2 -4 16 48 4 2 -16 +0 14 -10 -20 16 48 20 10 -16 +0 20 -12 -32 24 80 16 14 -24 +0 14 -2 -20 8 16 12 6 -8 +0 12 -4 -16 8 16 8 6 -8 +0 2 0 0 4 8 0 0 -4 +192 4 -4 -12 -4 88 4 2 -20 +96 1 -3 -4 -6 36 0 2 -6 +192 4 -12 -4 -12 72 12 10 -12 +192 -4 -4 22 -10 -4 -6 2 -2 +1344 -28 -16 -54 -62 -44 2 2 -10 +2688 -36 -28 -120 -144 -32 -8 2 -32 +640 -8 -6 -28 -36 0 -4 0 -8 +112 -1 -1 -5 -7 2 -1 0 -1 +48 2 2 -7 -3 18 -5 0 -3 +0 1 1 -2 0 8 -2 0 0 +0 12 20 -48 24 240 -48 2 -24 +4864 -80 -56 -216 -216 -176 8 6 -32 +2304 -32 -24 -104 -104 -80 0 2 -16 +1152 -24 -14 -44 -60 -24 4 2 -12 +384 -6 -4 -12 -24 24 -4 0 -8 +1728 -28 -20 -64 -104 48 -8 2 -32 +1344 -24 -16 -36 -84 88 -12 2 -28 +192 8 -8 -12 -12 8 4 6 -4 +192 48 -32 -28 -12 72 20 30 -12 +1920 -48 -24 -44 -108 8 4 6 -28 +960 -20 -12 -20 -60 40 -4 2 -16 +1344 -28 -16 -28 -84 40 -4 2 -20 +768 -14 -8 -20 -48 24 -4 0 -12 +2112 -32 -24 -68 -132 152 -20 2 -52 +192 -4 -2 -3 -11 2 -1 0 -3 +576 -12 -6 -4 -36 16 -4 0 -8 +192 -4 -2 4 -12 16 -4 0 -4 +1728 -36 -18 -59 -75 -62 -3 0 -13 +192 4 -4 -12 -12 0 4 2 0 +96 -1 -1 -3 -5 -2 -1 0 -1 +192 0 -2 -4 -12 0 -4 0 0 +960 -12 -12 -36 -60 8 -4 2 -4 +1920 -18 -26 -76 -120 0 -4 6 0 +2688 -42 -34 -116 -144 -48 4 6 -24 +864 -17 -11 -37 -43 -22 3 2 -7 +2880 -60 -36 -118 -142 -76 10 6 -26 +192 -6 0 -10 10 -4 -2 0 -2 +192 -6 0 -10 2 -4 -2 0 0 +0 0 2 -2 26 4 -2 0 -6 +192 -12 12 -40 240 32 -8 6 -56 +480 -7 -5 -12 -30 52 -8 0 -14 +0 0 4 -16 16 80 -12 2 -4 +0 4 6 -12 4 48 -12 0 -4 +1152 -36 -12 -60 -20 -40 4 6 -4 +0 2 8 -16 12 56 -12 0 -4 +0 10 16 -32 12 120 -28 0 -12 +96 9 -1 16 -6 36 -20 0 -6 +96 1 -1 0 -6 4 -4 0 -2 +416 -10 -6 -12 -24 16 4 2 -8 +192 -4 -4 6 -10 -4 -2 2 -2 +192 -4 -4 8 -12 0 -2 2 0 +0 4 -2 -3 1 2 3 2 -1 +960 -12 -12 -44 -52 -16 4 2 -8 +576 -8 -8 -28 -28 -16 4 2 -4 +0 3 5 -9 1 10 -1 2 -1 +0 3 7 -9 1 10 -3 2 -1 +1792 -16 -24 -88 -88 -48 8 6 -16 +864 -15 -11 -39 -41 -26 3 2 -7 +672 -11 -9 -31 -33 -18 3 2 -5 +960 -16 -12 -42 -50 -20 2 2 -8 +3200 -80 -40 -154 -90 -132 18 10 -6 +1920 -48 -24 -94 -46 -76 10 6 -2 +1056 -12 -12 -50 -58 -4 -2 2 -14 +960 -12 -12 -44 -52 -8 4 2 -12 +0 0 6 -20 20 56 -8 2 -6 +192 8 8 -24 -8 16 -8 2 -8 +0 3 1 -2 4 8 -2 0 -4 +0 11 1 -2 20 40 -6 0 -20 +0 0 18 -3 13 10 -13 0 -3 +400 -6 -4 -16 -20 -8 -2 0 -4 +3648 -64 -40 -144 -176 -96 -8 2 -32 +624 -8 -6 -26 -34 -4 -4 0 -8 +576 0 -6 -28 -36 0 -4 2 0 +4608 -60 -52 -200 -240 -96 -8 6 -48 +1152 -18 -14 -48 -60 -24 0 2 -12 +1920 -34 -22 -80 -92 -56 0 2 -16 +1728 -36 -22 -74 -82 -52 8 4 -14 +1344 -28 -20 -40 -80 96 8 6 -32 +576 -12 -8 -12 -36 56 0 2 -16 +528 -13 -7 -16 -30 4 4 2 -8 +192 -12 12 -48 40 80 -16 6 -8 +192 -12 12 -48 200 80 -16 6 -48 +0 0 6 -12 52 40 -8 0 -12 +0 0 2 -3 21 10 -3 0 -5 +256 -8 0 -12 12 -8 -2 0 -4 +192 -6 0 -7 13 -6 -3 0 -5 +512 -16 0 -24 0 -16 -4 0 -2 +512 -14 -6 -4 -32 0 2 2 0 +640 -16 -8 -8 -40 0 2 2 0 +960 -20 -14 -20 -60 0 2 4 0 +960 -20 -12 -4 -60 72 -12 2 -20 +960 -20 -12 -4 -60 104 -12 2 -28 +192 -12 12 20 36 -8 -28 6 0 +0 0 2 -3 5 10 -3 0 -1 +192 28 -4 -44 -4 24 20 10 -12 +64 8 0 -12 -4 8 4 2 -2 +256 14 6 -36 -16 32 4 2 -8 +48 4 6 -10 -2 20 -8 0 -4 +16 2 4 -4 0 8 -4 0 -2 +0 12 36 -28 12 56 -28 2 -12 +0 4 4 -8 0 8 0 2 0 +64 4 8 -12 -4 8 -4 2 0 +448 12 12 -36 -28 8 -12 2 -4 +1536 -22 -16 -52 -96 56 -12 0 -28 +1792 -16 -16 -88 -88 -48 0 2 -16 +384 6 -10 -20 -24 0 4 6 0 +2304 -12 -28 -104 -144 0 -8 6 0 +3840 -48 -40 -168 -200 -80 -8 2 -40 +0 0 8 -6 10 4 -2 2 -4 +0 4 8 -6 18 4 -2 2 -10 +768 -16 -10 -16 -48 24 -2 2 -12 +2304 -56 -32 -32 -144 96 8 10 -48 +1792 -48 -24 -16 -112 0 8 10 0 +2304 -56 -32 -32 -144 0 8 10 0 +192 -6 0 -7 5 -6 -3 0 -3 +448 -14 0 -19 1 -14 -5 0 -3 +576 -18 0 -24 4 -16 -8 0 -4 +192 -6 0 10 -10 -4 -2 0 -2 +256 -8 0 12 -12 -8 -4 0 -2 +512 -16 0 0 -24 -16 -2 0 -4 +192 -6 0 2 -10 -4 0 0 -2 +576 -18 0 4 -24 -16 -4 0 -8 +448 -14 0 1 -19 -14 -3 0 -5 +576 -18 0 -3 -23 -22 -3 0 -5 +192 -6 0 5 -7 -6 -3 0 -3 +192 -6 0 13 -7 -6 -5 0 -3 +64 -4 4 20 -4 24 4 2 -4 +2304 -56 -32 -96 -96 -96 16 10 0 +768 -30 0 -32 -28 -32 8 6 0 +0 1 0 0 0 0 0 0 0 +0 0 1 0 0 0 0 0 0 +0 0 0 1 0 0 0 0 0 +0 0 0 0 1 0 0 0 0 +0 0 0 0 0 1 0 0 0 +0 0 0 0 0 0 1 0 0 +0 0 0 0 0 0 0 1 0 +0 0 0 0 0 0 0 0 1 +end diff --git a/demos/ppl_lcdd/examples/mit71-61.ine b/demos/ppl_lcdd/examples/mit71-61.ine new file mode 100644 index 0000000..dcc420d --- /dev/null +++ b/demos/ppl_lcdd/examples/mit71-61.ine @@ -0,0 +1,74 @@ +begin +71 61 rational +64 -384 0 192 0 0 768 0 0 -512 0 0 0 -768 0 0 0 0 0 768 0 0 0 0 0 0 0 0 0 0 0 0 0 192 0 0 0 0 0 -384 0 0 0 0 0 0 0 0 0 0 0 64 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 2 -6 6 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 6 -6 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 2 -2 -2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 2 2 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 2 2 -2 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 -2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 2 6 6 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 -6 -6 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 4 -8 4 -8 16 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 -8 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 4 0 -4 -8 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 -4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 4 8 4 -8 -16 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 8 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 8 -8 0 0 0 -24 24 0 24 -24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -8 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 8 8 0 0 0 -24 -24 0 24 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -8 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +16 -64 0 0 0 0 96 0 0 -64 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -6 12 3 -12 -8 3 12 -6 1 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -4 4 1 0 0 -1 -4 4 -1 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -2 0 -1 4 0 -1 0 -2 1 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -2 -4 3 -4 8 3 -4 -2 1 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 -4 1 0 0 -1 4 0 -1 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 -3 0 0 3 0 0 -1 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 -4 3 4 -8 3 -4 2 1 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 -1 -4 0 -1 0 2 1 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 4 4 1 0 0 -1 -4 -4 -1 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 6 12 3 12 8 3 12 6 1 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 -8 -2 8 4 8 -4 -8 -8 8 2 -2 -2 10 -16 -4 12 8 -2 -8 2 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 -4 -2 4 0 0 0 0 4 -4 -2 2 -2 6 -4 0 -4 0 2 4 -2 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 -8 2 -8 4 8 4 8 -8 -8 2 2 -2 6 0 -4 4 -8 -2 8 -2 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 -4 2 -4 0 0 0 0 4 4 -2 -2 -2 2 4 0 -4 0 2 -4 2 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 -2 0 4 -8 -4 8 0 0 2 -2 -2 2 8 -4 4 -8 -2 0 2 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 -2 0 -4 0 4 0 0 0 2 -2 -2 2 0 4 -4 0 -2 0 2 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 4 -8 4 -8 0 0 2 2 -2 -2 8 -4 -4 8 -2 0 -2 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 -4 0 -4 0 0 0 2 2 -2 -2 0 4 4 0 -2 0 -2 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 -2 -4 0 0 0 0 -4 4 -2 2 -2 -2 4 0 4 0 2 -4 -2 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 2 4 0 0 0 0 -4 -4 -2 -2 -2 -6 -4 0 4 0 2 4 2 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 8 -2 -8 4 8 -4 -8 8 -8 2 -2 -2 -6 0 -4 -4 8 -2 8 2 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 8 2 8 4 8 4 8 8 8 2 2 -2 -10 -16 -4 -12 -8 -2 -8 -2 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 -8 -8 4 16 4 -8 -8 4 0 0 0 0 0 0 0 0 0 0 0 -8 24 8 -24 -8 -16 8 16 8 -8 0 0 4 -16 20 4 -8 -8 0 4 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 -8 -4 0 4 8 0 -4 0 0 0 0 0 0 0 0 0 0 0 -8 16 0 8 -8 0 0 -16 0 8 0 0 4 -8 -4 4 0 8 0 -4 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 -8 0 4 0 -4 0 8 -4 0 0 0 0 0 0 0 0 0 0 0 -8 8 8 -8 8 0 -8 0 -8 8 0 0 4 -8 4 -4 8 0 0 -4 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 8 -8 4 -16 4 -8 8 4 0 0 0 0 0 0 0 0 0 0 0 -8 8 -8 8 -8 16 -8 16 -8 -8 0 0 4 0 -12 4 8 -8 0 4 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 -4 0 -4 0 0 4 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 8 8 0 0 0 0 -8 0 0 4 0 -4 -4 0 0 0 4 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 -8 8 4 -16 4 8 -8 4 0 0 0 0 0 0 0 0 0 0 0 -8 -8 8 8 -8 16 8 -16 8 -8 0 0 4 0 -12 4 -8 8 0 4 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 8 0 4 0 -4 0 -8 -4 0 0 0 0 0 0 0 0 0 0 0 -8 -8 -8 -8 8 0 8 0 8 8 0 0 4 8 4 -4 -8 0 0 -4 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 8 -4 0 4 -8 0 -4 0 0 0 0 0 0 0 0 0 0 0 -8 -16 0 8 -8 0 0 16 0 8 0 0 4 8 -4 4 0 -8 0 -4 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 8 8 4 16 4 8 8 4 0 0 0 0 0 0 0 0 0 0 0 -8 -24 -8 -24 -8 -16 -8 -16 -8 -8 0 0 4 16 20 4 8 8 0 4 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 -16 8 16 -16 4 -8 32 0 0 -16 -32 0 0 32 0 -8 0 4 -16 16 8 -16 0 4 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 -8 0 0 8 -4 -8 16 0 0 0 0 0 0 -16 0 8 0 4 -8 0 0 8 0 -4 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 8 -16 0 4 -8 0 0 0 -16 32 0 0 0 0 -8 0 4 0 -16 8 0 0 4 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 -8 0 0 4 -8 0 0 0 16 0 0 0 0 0 -8 0 4 0 0 -8 0 0 4 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 8 0 0 -8 -4 -8 -16 0 0 0 0 0 0 16 0 8 0 4 8 0 0 -8 0 -4 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 16 8 16 16 4 -8 -32 0 0 -16 -32 0 0 -32 0 -8 0 4 16 16 8 16 0 4 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 8 -8 -16 16 8 -8 -16 16 32 0 -32 -16 0 16 0 0 0 0 0 0 -8 24 -8 -16 8 0 24 -64 -8 16 24 32 -8 0 -16 0 0 0 -8 24 -16 -8 8 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 8 8 -16 -16 8 8 -16 -16 32 0 32 -16 0 -16 0 0 0 0 0 0 -8 8 -8 16 -8 0 24 -32 8 -16 24 -32 8 0 16 0 0 0 -8 8 16 -8 -8 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 8 -8 0 0 -8 8 -16 16 0 0 0 16 0 -16 0 0 0 0 0 0 -8 8 8 0 -8 0 24 -16 -8 0 -24 0 8 0 16 0 0 0 -8 8 0 8 -8 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 8 8 0 0 -8 -8 -16 -16 0 0 0 16 0 16 0 0 0 0 0 0 -8 -8 8 0 8 0 24 16 8 0 -24 0 -8 0 -16 0 0 0 -8 -8 0 8 8 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 8 -8 16 -16 8 -8 -16 16 -32 0 32 -16 0 16 0 0 0 0 0 0 -8 -8 -8 16 8 0 24 32 -8 -16 24 -32 -8 0 -16 0 0 0 -8 -8 16 -8 8 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 8 8 16 16 8 8 -16 -16 -32 0 -32 -16 0 -16 0 0 0 0 0 0 -8 -24 -8 -16 -8 0 24 64 8 16 24 32 8 0 16 0 0 0 -8 -24 -16 -8 -8 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 8 -24 24 -8 0 0 0 0 0 0 -24 48 24 -24 -48 0 24 0 0 0 0 0 0 0 0 0 0 0 0 0 24 -48 -24 48 0 24 0 -24 0 0 0 0 -8 24 -24 0 0 8 0 0 0 0 +0 0 0 0 0 0 0 0 0 8 -8 -8 8 0 0 0 0 0 0 -24 16 8 8 16 0 -24 0 0 0 0 0 0 0 0 0 0 0 0 0 24 -16 -8 -16 0 -8 0 24 0 0 0 0 -8 8 8 0 0 -8 0 0 0 0 +0 0 0 0 0 0 0 0 0 8 8 -8 -8 0 0 0 0 0 0 -24 -16 -8 8 16 0 24 0 0 0 0 0 0 0 0 0 0 0 0 0 24 16 8 -16 0 -8 0 -24 0 0 0 0 -8 -8 8 0 0 8 0 0 0 0 +0 0 0 0 0 0 0 0 0 8 24 24 8 0 0 0 0 0 0 -24 -48 -24 -24 -48 0 -24 0 0 0 0 0 0 0 0 0 0 0 0 0 24 48 24 48 0 24 0 24 0 0 0 0 -8 -24 -24 0 0 -8 0 0 0 0 +0 0 0 16 -32 16 0 0 0 0 0 0 0 -64 0 128 0 -64 0 64 0 -128 0 0 64 0 0 0 0 0 0 0 0 32 -64 32 0 0 0 -64 128 0 0 -64 0 0 0 0 0 0 0 16 -32 0 16 0 0 0 0 0 0 +0 0 0 16 0 -16 0 0 0 0 0 0 0 -64 0 0 0 64 0 64 0 0 0 0 -64 0 0 0 0 0 0 0 0 32 0 -32 0 0 0 -64 0 0 0 64 0 0 0 0 0 0 0 16 0 0 -16 0 0 0 0 0 0 +0 0 0 16 32 16 0 0 0 0 0 0 0 -64 0 -128 0 -64 0 64 0 128 0 0 64 0 0 0 0 0 0 0 0 32 64 32 0 0 0 -64 -128 0 0 -64 0 0 0 0 0 0 0 16 32 0 16 0 0 0 0 0 0 +0 0 0 0 0 0 16 -32 16 -32 64 -32 0 -32 32 32 -32 0 0 80 -96 -64 16 64 0 0 0 0 0 0 0 0 0 16 -32 0 16 0 0 -64 96 32 -32 0 -32 0 0 0 0 0 0 16 -32 16 0 0 0 0 0 0 0 +0 0 0 0 0 0 16 0 -16 -32 0 32 0 -32 0 0 32 0 0 80 0 0 -16 -64 0 0 0 0 0 0 0 0 0 16 0 0 -16 0 0 -64 0 0 32 0 32 0 0 0 0 0 0 16 0 -16 0 0 0 0 0 0 0 +0 0 0 0 0 0 16 32 16 -32 -64 -32 0 -32 -32 -32 -32 0 0 80 96 64 16 64 0 0 0 0 0 0 0 0 0 16 32 0 16 0 0 -64 -96 -32 -32 0 -32 0 0 0 0 0 0 16 32 16 0 0 0 0 0 0 0 +0 32 -32 -32 32 0 -128 128 0 128 -128 0 0 192 -64 -128 0 0 0 -256 128 128 0 0 0 0 0 0 0 0 0 0 0 -64 64 0 0 0 0 160 -128 -32 0 0 0 0 0 0 0 0 0 -32 32 0 0 0 0 0 0 0 0 +0 32 32 -32 -32 0 -128 -128 0 128 128 0 0 192 64 128 0 0 0 -256 -128 -128 0 0 0 0 0 0 0 0 0 0 0 -64 -64 0 0 0 0 160 128 32 0 0 0 0 0 0 0 0 0 -32 -32 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -4 6 -4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -2 0 2 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 -2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 -2 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 4 6 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +end diff --git a/demos/ppl_lcdd/examples/mit90-86.ine b/demos/ppl_lcdd/examples/mit90-86.ine new file mode 100644 index 0000000..5bee933 --- /dev/null +++ b/demos/ppl_lcdd/examples/mit90-86.ine @@ -0,0 +1,93 @@ +begin +90 86 rational +1 -4 6 0 -3 0 0 12 0 0 0 0 0 0 -4 0 -4 0 4 0 -12 0 0 12 1 0 0 3 -6 0 -12 0 0 0 0 -12 0 12 0 0 0 0 -12 0 0 0 12 0 -12 12 12 0 0 0 12 0 0 4 -12 6 0 0 -1 -3 -4 0 0 -4 4 -12 0 0 0 4 0 0 0 0 3 0 0 -6 0 4 0 -1 +1 -4 6 0 -3 0 0 12 0 0 0 0 0 0 -4 0 4 0 -4 0 -12 0 0 -12 1 0 0 3 -6 0 12 0 0 0 0 12 0 12 0 0 0 0 -12 0 0 0 -12 0 12 -12 12 0 0 0 -12 0 0 -4 12 6 0 0 -1 -3 4 0 0 4 -4 -12 0 0 0 4 0 0 0 0 3 0 0 -6 0 4 0 -1 +1 -6 6 4 -1 4 0 4 -2 -8 0 4 0 -2 -4 0 0 0 0 0 -4 0 -8 0 1 4 4 -1 -2 0 0 -8 -2 4 0 0 8 4 0 0 0 -2 4 0 8 0 0 4 0 0 -4 0 -8 0 0 0 -8 0 0 -2 4 0 1 -1 0 0 4 0 0 4 -8 0 0 -4 -2 -2 0 4 -1 4 0 6 4 -4 -2 1 +1 -8 6 8 1 12 -4 -4 -4 -16 -4 0 -8 -4 -4 4 0 8 0 8 4 -4 0 0 1 8 8 -1 2 4 0 0 -4 0 4 0 0 -4 -4 -8 -4 4 4 8 0 4 0 0 0 0 -4 -8 0 -4 0 -4 0 0 0 -2 -8 -8 -1 1 0 4 -8 0 0 4 16 8 4 4 4 4 4 0 -1 -8 -4 -6 -8 4 4 -1 +1 -10 6 12 3 24 -12 -12 -6 -24 -20 -12 -24 -6 -4 12 4 24 4 24 12 12 24 12 1 12 12 3 6 12 12 24 -6 -12 -12 -12 -24 -12 -12 -24 -12 -6 -12 -24 -24 -12 -12 -12 -12 -12 12 24 24 12 12 12 24 4 12 6 12 24 1 3 4 12 12 -4 -4 -12 -24 -24 -12 -4 -6 -6 -12 -12 3 12 12 6 12 -4 -6 1 +1 10 6 12 3 24 12 12 6 24 20 12 24 6 4 12 4 24 4 24 12 12 24 12 1 12 12 3 6 12 12 24 6 12 12 12 24 12 12 24 12 6 12 24 24 12 12 12 12 12 12 24 24 12 12 12 24 4 12 6 12 24 1 3 4 12 12 4 4 12 24 24 12 4 6 6 12 12 3 12 12 6 12 4 6 1 +1 8 6 8 1 12 4 4 4 16 4 0 8 4 4 4 0 8 0 8 4 -4 0 0 1 8 8 -1 2 4 0 0 4 0 -4 0 0 4 4 8 4 -4 -4 -8 0 -4 0 0 0 0 -4 -8 0 -4 0 -4 0 0 0 -2 -8 -8 -1 1 0 4 -8 0 0 -4 -16 -8 -4 -4 -4 -4 -4 0 -1 -8 -4 -6 -8 -4 -4 -1 +1 8 0 6 3 18 6 6 0 0 14 12 12 0 -2 0 2 0 2 0 0 12 12 6 -1 -6 -6 3 0 0 6 12 -6 0 6 0 0 -6 -6 -12 -6 6 6 12 0 6 0 0 0 0 0 0 -12 0 -6 0 -12 -2 -6 0 6 0 1 -3 -2 -12 6 -4 -4 -6 0 -12 -6 2 0 0 -6 -12 -3 -6 -12 0 -6 -2 -6 -1 +1 6 0 2 1 10 -2 2 2 0 6 0 4 -2 -2 0 2 8 -2 -8 0 -4 4 2 -1 -6 -2 -1 0 0 -2 -4 -4 -4 -6 -4 0 -2 -6 -4 2 -4 -2 -4 0 2 -4 4 4 4 0 -8 -4 0 -2 0 4 2 2 0 -2 8 -1 -1 -2 -4 -6 0 0 2 0 4 6 -2 -2 2 -2 0 1 2 4 0 6 2 4 1 +1 6 6 4 -1 4 0 -4 2 8 0 -4 0 2 4 0 0 0 0 0 -4 0 -8 0 1 4 4 -1 -2 0 0 -8 2 -4 0 0 -8 -4 0 0 0 2 -4 0 -8 0 0 -4 0 0 -4 0 -8 0 0 0 -8 0 0 -2 4 0 1 -1 0 0 4 0 0 -4 8 0 0 4 2 2 0 -4 -1 4 0 6 4 4 2 1 +1 6 0 6 1 6 6 2 -2 0 -2 0 4 2 -2 0 -2 -8 2 8 0 -4 -4 -2 -1 -2 -6 -1 0 0 2 4 -4 4 2 4 0 -2 2 -4 -6 -4 -2 -4 0 -6 4 -4 -4 -4 0 8 4 0 2 0 -4 -2 -2 0 -6 -8 -1 -1 2 -4 -2 0 0 2 0 4 -2 -2 2 -2 6 0 1 6 4 0 2 2 4 1 +1 6 6 4 3 0 -4 12 2 8 -12 4 -8 2 4 -4 -4 -8 -4 -8 12 -4 8 -12 1 4 4 3 6 -4 -12 8 2 4 -4 -12 8 12 -4 -8 -4 2 12 -8 8 -4 -12 4 -12 -12 12 -8 8 -4 -12 -4 8 -4 -12 6 4 -8 1 3 -4 -4 4 -4 -4 12 8 -8 -4 4 2 2 -4 4 3 4 -4 6 4 4 2 1 +1 6 -2 0 3 12 0 0 -2 -8 8 12 0 -2 0 -4 0 -8 0 -8 -4 12 0 0 1 0 0 3 -2 -4 0 0 6 -4 0 -4 -8 0 0 0 0 6 0 0 -8 0 -4 -4 -4 -4 -4 -8 0 -4 0 -4 0 0 0 -2 0 -8 1 3 0 12 0 4 4 0 -8 0 0 0 -2 -2 0 12 3 0 12 -2 0 0 6 1 +1 4 -2 -4 1 8 -8 0 -4 0 8 0 0 -4 0 4 4 -8 -4 -8 4 -4 8 4 1 4 -4 -1 -6 4 -4 -8 4 0 -8 0 -16 0 8 0 -8 -4 0 0 16 8 0 0 0 0 -4 8 8 -4 4 -4 -8 -4 -4 6 4 8 -1 1 4 4 -4 0 0 0 0 0 -8 0 4 4 8 0 -1 4 -4 2 -4 0 -4 -1 +1 4 0 -2 -1 6 -6 -2 4 0 2 -4 4 -4 -2 -4 -2 8 -2 -8 0 0 -4 2 -1 -6 2 -1 0 4 2 -4 -2 0 2 -4 0 2 -2 -4 6 2 -2 4 0 -6 4 0 4 -4 0 8 4 -4 -2 4 4 2 -2 0 -2 -8 1 1 2 0 6 0 0 2 0 -4 -2 2 4 -4 6 4 1 2 0 0 -6 -2 -2 -1 +1 4 0 2 -1 2 2 -2 0 0 2 -4 -4 0 -2 4 2 0 2 0 0 0 -4 -2 -1 -2 -2 -1 0 -4 -2 -4 -2 0 2 4 0 2 -2 4 -2 2 -2 -4 0 2 -4 0 -4 4 0 0 4 4 2 -4 4 -2 2 0 2 0 1 1 -2 0 2 0 0 2 0 4 -2 2 0 0 -2 4 1 -2 0 0 -2 -2 -2 -1 +1 4 -2 0 1 4 0 0 0 -8 0 0 0 0 0 -4 0 0 0 0 -4 -4 0 0 1 0 0 -1 2 -4 0 0 4 0 0 0 8 0 0 0 0 -4 0 0 -8 0 0 0 0 0 4 0 0 4 0 4 0 0 0 -2 0 0 -1 1 0 4 0 0 0 0 8 0 0 0 0 0 0 0 -1 0 -4 2 0 0 -4 -1 +1 4 0 2 3 -2 -2 6 0 0 -10 4 -4 0 -2 0 -2 0 -2 0 0 -4 4 -6 -1 -2 -2 3 0 0 -6 4 -2 0 -2 0 0 -6 2 4 2 2 6 -4 0 -2 0 0 0 0 0 0 -4 0 6 0 -4 2 6 0 2 0 1 -3 2 4 2 4 4 -6 0 4 2 2 0 0 2 -4 -3 -2 4 0 -2 -2 -2 -1 +1 4 6 0 -3 0 0 -12 0 0 0 0 0 0 4 0 4 0 -4 0 -12 0 0 -12 1 0 0 3 -6 0 12 0 0 0 0 -12 0 -12 0 0 0 0 12 0 0 0 12 0 -12 12 12 0 0 0 -12 0 0 -4 12 6 0 0 -1 -3 4 0 0 -4 4 12 0 0 0 -4 0 0 0 0 3 0 0 -6 0 -4 0 -1 +1 4 6 0 -3 0 0 -12 0 0 0 0 0 0 4 0 -4 0 4 0 -12 0 0 12 1 0 0 3 -6 0 -12 0 0 0 0 12 0 -12 0 0 0 0 12 0 0 0 -12 0 12 -12 12 0 0 0 12 0 0 4 -12 6 0 0 -1 -3 -4 0 0 4 -4 12 0 0 0 -4 0 0 0 0 3 0 0 -6 0 -4 0 -1 +1 4 6 0 1 -4 -4 4 0 0 -4 0 -8 0 4 -4 0 -8 0 -8 4 4 0 0 1 0 0 -1 2 -4 0 0 0 0 4 0 0 4 -4 -8 -4 0 -4 8 0 4 0 0 0 0 -4 8 0 4 0 4 0 0 0 -2 0 8 -1 1 0 -4 0 0 0 -4 0 8 4 -4 0 0 4 0 -1 0 4 -6 0 -4 0 -1 +1 4 0 6 -1 -2 2 -2 -4 0 -6 -4 4 4 -2 -4 -2 -8 -2 8 0 0 -4 2 -1 2 -6 -1 0 4 2 -4 -2 0 -6 -4 0 2 6 -4 -2 2 -2 4 0 2 4 0 4 -4 0 -8 4 -4 -2 4 4 2 -2 0 6 8 1 1 2 0 -2 0 0 2 0 -4 6 2 -4 4 -2 4 1 -6 0 0 2 -2 -2 -1 +1 4 -2 4 1 0 8 0 -4 0 -8 0 0 -4 0 4 -4 -8 4 -8 4 -4 -8 -4 1 -4 4 -1 -6 4 4 8 4 0 8 0 -16 0 -8 0 8 -4 0 0 16 -8 0 0 0 0 -4 8 -8 -4 -4 -4 8 4 4 6 -4 8 -1 1 -4 4 4 0 0 0 0 0 8 0 4 4 -8 0 -1 -4 -4 2 4 0 -4 -1 +1 4 0 -6 3 6 -6 -6 0 0 2 12 -12 0 2 0 -2 0 -2 0 0 12 -12 -6 -1 6 6 3 0 0 -6 -12 -6 0 -6 0 0 6 6 12 6 6 -6 -12 0 -6 0 0 0 0 0 0 12 0 6 0 12 2 6 0 -6 0 1 -3 2 -12 -6 -4 -4 6 0 12 6 -2 0 0 6 -12 -3 6 -12 0 6 2 -6 -1 +1 2 -2 -4 -1 4 -4 0 -2 0 4 -4 0 -2 0 0 0 0 0 0 4 0 0 0 1 4 -4 -1 -2 0 0 0 2 4 4 0 0 0 4 0 -4 2 0 0 0 -4 0 4 0 0 4 0 0 0 0 0 0 0 0 -2 -4 0 1 -1 0 0 4 0 0 0 0 0 4 0 -2 -2 -4 -4 -1 -4 0 -2 4 0 2 1 +1 2 0 -6 1 2 -6 -2 -2 0 2 0 -4 2 2 0 2 -8 -2 8 0 -4 4 2 -1 2 6 -1 0 0 -2 -4 -4 4 -2 4 0 2 -2 4 6 -4 2 4 0 6 4 -4 -4 -4 0 8 -4 0 -2 0 4 2 2 0 6 -8 -1 -1 -2 -4 2 0 0 -2 0 -4 2 2 2 -2 -6 0 1 -6 4 0 -2 -2 4 1 +1 2 -2 0 3 -4 0 0 -6 8 -8 4 0 -6 0 12 0 -8 0 -8 -4 -4 0 0 1 0 0 3 -2 12 0 0 2 -12 0 4 8 0 0 0 0 2 0 0 8 0 4 -12 4 4 -4 -8 0 12 0 12 0 0 0 -2 0 -8 1 3 0 -4 0 -4 -4 0 8 0 0 0 -6 -6 0 4 3 0 -4 -2 0 0 2 1 +1 2 0 -2 -3 2 2 -6 2 0 2 0 -4 -2 -2 4 2 0 -2 0 0 0 -4 -6 -1 -2 2 3 0 -4 6 4 0 4 -2 0 0 6 -2 4 -2 0 6 4 0 -2 0 -4 0 0 0 0 4 -4 6 4 -4 2 -6 0 2 0 -1 3 -2 0 -2 4 -4 -6 0 -4 2 -2 -2 2 2 0 -3 -2 0 0 2 2 0 1 +1 2 0 -6 -3 6 -6 -6 6 0 -6 0 12 -6 -2 -12 -2 0 2 0 0 0 -12 6 -1 -6 6 3 0 12 -6 12 0 12 6 0 0 6 6 -12 6 0 6 -12 0 6 0 -12 0 0 0 0 12 12 -6 -12 -12 -2 6 0 6 0 -1 3 2 0 -6 -4 4 -6 0 12 -6 -2 -6 6 -6 0 -3 -6 0 0 6 2 0 1 +1 2 0 -2 1 -2 -2 2 2 0 -2 0 -4 -2 -2 0 -2 0 2 0 0 4 4 -2 -1 -2 2 -1 0 0 2 -4 0 -4 2 4 0 -2 2 4 2 0 -2 4 0 2 4 4 -4 -4 0 0 -4 0 2 0 4 -2 -2 0 2 0 -1 -1 2 4 -2 0 0 2 0 -4 -2 -2 -2 2 -2 0 1 -2 -4 0 2 2 0 1 +1 2 -2 0 -1 0 -4 0 2 -8 -4 -4 8 2 0 0 -4 0 -4 0 -4 0 0 4 1 0 0 -1 6 0 4 0 2 -4 -4 0 8 0 -4 8 -4 2 0 8 8 -4 0 -4 0 0 -4 0 0 0 4 0 0 -4 4 6 0 0 1 -1 -4 0 0 0 0 0 -8 8 -4 0 2 2 -4 -4 -1 0 0 -2 0 0 2 1 +1 2 0 2 -3 -2 2 -6 -2 0 2 0 -4 2 -2 4 -2 0 2 0 0 0 4 6 -1 2 -2 3 0 -4 -6 -4 0 -4 -2 0 0 6 -2 4 -2 0 6 4 0 -2 0 4 0 0 0 0 -4 -4 -6 4 4 -2 6 0 -2 0 -1 3 2 0 2 -4 4 -6 0 -4 2 -2 2 -2 2 0 -3 2 0 0 -2 2 0 1 +1 2 -2 0 -1 0 4 0 2 -8 4 -4 -8 2 0 0 4 0 4 0 -4 0 0 -4 1 0 0 -1 6 0 -4 0 2 -4 4 0 8 0 4 -8 4 2 0 -8 8 4 0 -4 0 0 -4 0 0 0 -4 0 0 4 -4 6 0 0 1 -1 4 0 0 0 0 0 -8 -8 4 0 2 2 4 -4 -1 0 0 -2 0 0 2 1 +1 2 0 2 1 -6 -2 2 -2 0 -2 0 -4 2 -2 0 2 0 -2 0 0 4 -4 2 -1 2 -2 -1 0 0 -2 4 0 4 2 -4 0 -2 2 4 2 0 -2 4 0 2 -4 -4 4 4 0 0 4 0 -2 0 -4 2 2 0 -2 0 -1 -1 -2 4 2 0 0 2 0 -4 -2 -2 2 -2 -2 0 1 2 -4 0 -2 2 0 1 +1 2 -2 4 -1 -4 4 0 -2 0 -4 -4 0 -2 0 0 0 0 0 0 4 0 0 0 1 -4 4 -1 -2 0 0 0 2 4 -4 0 0 0 -4 0 4 2 0 0 0 4 0 4 0 0 4 0 0 0 0 0 0 0 0 -2 4 0 1 -1 0 0 -4 0 0 0 0 0 -4 0 -2 -2 4 -4 -1 4 0 -2 -4 0 2 1 +1 2 -2 0 3 -4 0 0 2 -8 -8 4 0 2 0 -4 0 8 0 8 -4 -4 0 0 1 0 0 3 -2 -4 0 0 2 4 0 4 -8 0 0 0 0 2 0 0 -8 0 4 4 4 4 -4 8 0 -4 0 -4 0 0 0 -2 0 8 1 3 0 -4 0 -4 -4 0 -8 0 0 0 2 2 0 4 3 0 -4 -2 0 0 2 1 +1 2 0 -2 1 -2 2 -2 2 0 -6 0 -4 -2 2 0 -2 8 2 -8 0 -4 -4 -2 -1 6 2 -1 0 0 2 4 -4 -4 6 -4 0 2 6 4 -2 -4 2 4 0 -2 -4 4 4 4 0 -8 4 0 2 0 -4 -2 -2 0 2 8 -1 -1 2 -4 6 0 0 -2 0 -4 -6 2 -2 2 2 0 1 -2 4 0 -6 -2 4 1 +1 2 6 -4 -1 -4 0 -4 -2 -8 0 4 0 -2 4 0 0 0 0 0 -4 0 8 0 1 -4 -4 -1 -2 0 0 8 -2 4 0 0 8 -4 0 0 0 -2 -4 0 8 0 0 4 0 0 -4 0 8 0 0 0 8 0 0 -2 -4 0 1 -1 0 0 -4 0 0 -4 -8 0 0 4 -2 -2 0 4 -1 -4 0 6 -4 4 -2 1 +1 2 0 6 -3 -6 -6 -6 -6 0 -6 0 12 6 -2 -12 2 0 -2 0 0 0 12 -6 -1 6 -6 3 0 12 6 -12 0 -12 6 0 0 6 6 -12 6 0 6 -12 0 6 0 12 0 0 0 0 -12 12 6 -12 12 2 -6 0 -6 0 -1 3 -2 0 6 4 -4 -6 0 12 -6 -2 6 -6 -6 0 -3 6 0 0 -6 2 0 1 +1 2 6 -4 3 -8 -4 12 -2 -8 4 -4 -8 -2 4 -4 4 -8 4 -8 12 -4 -8 12 1 -4 -4 3 6 -4 12 -8 -2 -4 -4 12 -8 12 -4 -8 -4 -2 12 -8 -8 -4 12 -4 12 12 12 -8 -8 -4 12 -4 -8 4 12 6 -4 -8 1 3 4 -4 -4 4 4 12 -8 -8 -4 4 -2 -2 -4 -4 3 -4 -4 6 -4 4 -2 1 +1 2 6 -12 3 0 -12 -12 6 24 -4 12 -24 6 -4 12 -4 24 -4 24 12 12 -24 -12 1 -12 -12 3 6 12 -12 -24 6 12 -12 12 24 -12 -12 -24 -12 6 -12 -24 24 -12 12 12 12 12 12 24 -24 12 -12 12 -24 -4 -12 6 -12 24 1 3 -4 12 -12 4 4 -12 24 -24 -12 -4 6 6 -12 12 3 -12 12 6 -12 -4 6 1 +1 0 -2 -4 -3 4 4 0 0 0 4 0 -8 0 0 0 0 0 0 0 4 0 -8 0 1 4 -4 3 2 0 0 8 0 0 -4 4 0 0 4 -8 4 0 0 8 0 -4 -4 0 4 -4 -4 0 -8 0 0 0 8 0 0 -2 4 0 -1 -3 0 0 -4 -4 4 0 0 8 -4 0 0 0 -4 0 3 4 0 2 -4 0 0 -1 +1 0 -2 -4 -3 4 -4 0 0 0 -4 0 8 0 0 0 0 0 0 0 4 0 -8 0 1 4 -4 3 2 0 0 8 0 0 4 -4 0 0 -4 8 -4 0 0 -8 0 4 4 0 -4 4 -4 0 -8 0 0 0 8 0 0 -2 4 0 -1 -3 0 0 -4 4 -4 0 0 -8 4 0 0 0 4 0 3 4 0 2 -4 0 0 -1 +1 0 -2 -4 1 0 0 0 0 0 0 0 0 0 0 -4 -4 8 4 8 4 4 8 -4 1 4 -4 -1 -6 -4 4 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 -8 8 4 -4 4 -8 4 4 6 4 -8 -1 1 -4 -4 -4 0 0 0 0 0 0 0 0 0 0 0 -1 4 4 2 -4 0 0 -1 +1 0 0 -6 -1 2 -2 2 -4 0 6 -4 -4 4 2 -4 2 -8 2 8 0 0 4 -2 -1 -2 6 -1 0 4 -2 4 -2 0 6 -4 0 -2 -6 4 2 2 2 -4 0 -2 4 0 4 -4 0 -8 -4 -4 2 4 -4 -2 2 0 -6 8 1 1 -2 0 2 0 0 -2 0 4 -6 -2 -4 4 2 4 1 6 0 0 -2 2 -2 -1 +1 0 -2 0 1 -4 0 0 -4 8 0 0 0 -4 0 4 0 0 0 0 -4 4 0 0 1 0 0 -1 2 4 0 0 0 0 0 0 8 0 0 0 0 0 0 0 -8 0 0 0 0 0 4 0 0 -4 0 -4 0 0 0 -2 0 0 -1 1 0 -4 0 0 0 0 -8 0 0 0 4 4 0 0 -1 0 4 2 0 0 0 -1 +1 0 0 -2 -1 -2 -2 2 0 0 -2 -4 4 0 2 4 -2 0 -2 0 0 0 4 2 -1 2 2 -1 0 -4 2 4 -2 0 -2 4 0 -2 2 -4 2 2 2 4 0 -2 -4 0 -4 4 0 0 -4 4 -2 -4 -4 2 -2 0 -2 0 1 1 2 0 -2 0 0 -2 0 -4 2 -2 0 0 2 4 1 2 0 0 2 2 -2 -1 +1 0 0 -2 3 -6 2 -6 0 0 -6 4 4 0 2 0 2 0 2 0 0 -4 -4 6 -1 2 2 3 0 0 6 -4 -2 0 2 0 0 6 -2 -4 -2 2 -6 4 0 2 0 0 0 0 0 0 4 0 -6 0 4 -2 -6 0 -2 0 1 -3 -2 4 -2 4 4 6 0 -4 -2 -2 0 0 -2 -4 -3 2 4 0 2 2 -2 -1 +1 0 6 -8 1 -4 -4 -4 4 16 -4 0 -8 4 -4 4 0 8 0 8 4 -4 0 0 1 -8 -8 -1 2 4 0 0 4 0 4 0 0 -4 -4 -8 -4 -4 4 8 0 4 0 0 0 0 -4 -8 0 -4 0 -4 0 0 0 -2 8 -8 -1 1 0 4 8 0 0 4 -16 8 4 4 -4 -4 4 0 -1 8 -4 -6 8 4 -4 -1 +1 0 0 -6 -1 2 2 -2 4 0 -6 4 4 -4 -2 -4 2 -8 2 8 0 0 4 -2 -1 -2 6 -1 0 4 -2 4 2 0 -6 4 0 2 6 -4 -2 -2 -2 4 0 2 -4 0 -4 4 0 -8 -4 -4 2 4 -4 -2 2 0 -6 8 1 1 -2 0 2 0 0 2 0 -4 6 2 4 -4 -2 -4 1 6 0 0 -2 -2 2 -1 +1 0 0 -2 -1 -2 2 -2 0 0 2 4 -4 0 -2 4 -2 0 -2 0 0 0 4 2 -1 2 2 -1 0 -4 2 4 2 0 2 -4 0 2 -2 4 -2 -2 -2 -4 0 2 4 0 4 -4 0 0 -4 4 -2 -4 -4 2 -2 0 -2 0 1 1 2 0 -2 0 0 2 0 4 -2 2 0 0 -2 -4 1 2 0 0 2 -2 2 -1 +1 0 -2 4 -3 -4 -4 0 0 0 -4 0 8 0 0 0 0 0 0 0 4 0 8 0 1 -4 4 3 2 0 0 -8 0 0 4 4 0 0 -4 8 -4 0 0 -8 0 4 -4 0 4 -4 -4 0 8 0 0 0 -8 0 0 -2 -4 0 -1 -3 0 0 4 -4 4 0 0 -8 4 0 0 0 4 0 3 -4 0 2 4 0 0 -1 +1 0 0 -2 3 -6 -2 6 0 0 6 -4 -4 0 -2 0 2 0 2 0 0 -4 -4 6 -1 2 2 3 0 0 6 -4 2 0 -2 0 0 -6 2 4 2 -2 6 -4 0 -2 0 0 0 0 0 0 4 0 -6 0 4 -2 -6 0 -2 0 1 -3 -2 4 -2 -4 -4 -6 0 4 2 2 0 0 2 4 -3 2 4 0 2 -2 2 -1 +1 0 -2 0 1 -4 0 0 4 -8 0 0 0 4 0 4 0 0 0 0 -4 4 0 0 1 0 0 -1 2 4 0 0 0 0 0 0 -8 0 0 0 0 0 0 0 8 0 0 0 0 0 4 0 0 -4 0 -4 0 0 0 -2 0 0 -1 1 0 -4 0 0 0 0 8 0 0 0 -4 -4 0 0 -1 0 4 2 0 0 0 -1 +1 0 -2 4 -3 -4 4 0 0 0 4 0 -8 0 0 0 0 0 0 0 4 0 8 0 1 -4 4 3 2 0 0 -8 0 0 -4 -4 0 0 4 -8 4 0 0 8 0 -4 4 0 -4 4 -4 0 8 0 0 0 -8 0 0 -2 -4 0 -1 -3 0 0 4 4 -4 0 0 8 -4 0 0 0 -4 0 3 -4 0 2 4 0 0 -1 +1 0 0 2 -1 -6 -6 -2 -4 0 2 4 4 4 -2 -4 2 8 2 -8 0 0 4 -2 -1 6 -2 -1 0 4 -2 4 2 0 2 4 0 2 -2 -4 6 -2 -2 4 0 -6 -4 0 -4 4 0 8 -4 -4 2 4 -4 -2 2 0 2 -8 1 1 -2 0 -6 0 0 2 0 -4 -2 2 -4 4 6 -4 1 -2 0 0 6 -2 2 -1 +1 0 0 2 -1 -6 6 2 4 0 -2 -4 -4 -4 2 -4 2 8 2 -8 0 0 4 -2 -1 6 -2 -1 0 4 -2 4 -2 0 -2 -4 0 -2 2 4 -6 2 2 -4 0 6 4 0 4 -4 0 8 -4 -4 2 4 -4 -2 2 0 2 -8 1 1 -2 0 -6 0 0 -2 0 4 2 -2 4 -4 -6 4 1 -2 0 0 6 2 -2 -1 +1 0 -2 4 1 -8 0 0 0 0 0 0 0 0 0 -4 4 8 -4 8 4 4 -8 4 1 -4 4 -1 -6 -4 -4 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 -8 -8 4 4 4 8 -4 -4 6 -4 -8 -1 1 4 -4 4 0 0 0 0 0 0 0 0 0 0 0 -1 -4 4 2 4 0 0 -1 +1 0 6 -8 1 -4 4 4 -4 -16 4 0 8 -4 4 4 0 8 0 8 4 -4 0 0 1 -8 -8 -1 2 4 0 0 -4 0 -4 0 0 4 4 8 4 4 -4 -8 0 -4 0 0 0 0 -4 -8 0 -4 0 -4 0 0 0 -2 8 -8 -1 1 0 4 8 0 0 -4 16 -8 -4 -4 4 4 -4 0 -1 8 -4 -6 8 -4 4 -1 +1 -2 -2 -4 -1 4 4 0 2 0 -4 4 0 2 0 0 0 0 0 0 4 0 0 0 1 4 -4 -1 -2 0 0 0 -2 -4 -4 0 0 0 -4 0 4 -2 0 0 0 4 0 -4 0 0 4 0 0 0 0 0 0 0 0 -2 -4 0 1 -1 0 0 4 0 0 0 0 0 -4 0 2 2 4 4 -1 -4 0 -2 4 0 -2 1 +1 -2 0 -6 -3 6 6 6 -6 0 6 0 -12 6 2 -12 -2 0 2 0 0 0 -12 6 -1 -6 6 3 0 12 -6 12 0 -12 -6 0 0 -6 -6 12 -6 0 -6 12 0 -6 0 12 0 0 0 0 12 12 -6 -12 -12 -2 6 0 6 0 -1 3 2 0 -6 4 -4 6 0 -12 6 2 6 -6 6 0 -3 -6 0 0 6 -2 0 1 +1 -2 -2 0 -1 0 4 0 -2 8 4 4 -8 -2 0 0 -4 0 -4 0 -4 0 0 4 1 0 0 -1 6 0 4 0 -2 4 4 0 -8 0 4 -8 4 -2 0 -8 -8 4 0 4 0 0 -4 0 0 0 4 0 0 -4 4 6 0 0 1 -1 -4 0 0 0 0 0 8 -8 4 0 -2 -2 4 4 -1 0 0 -2 0 0 -2 1 +1 -2 0 2 -3 -2 -2 6 2 0 -2 0 4 -2 2 4 -2 0 2 0 0 0 4 6 -1 2 -2 3 0 -4 -6 -4 0 4 2 0 0 -6 2 -4 2 0 -6 -4 0 2 0 -4 0 0 0 0 -4 -4 -6 4 4 -2 6 0 -2 0 -1 3 2 0 2 4 -4 6 0 4 -2 2 -2 2 -2 0 -3 2 0 0 -2 -2 0 1 +1 -2 0 -2 -3 2 -2 6 -2 0 -2 0 4 2 2 4 2 0 -2 0 0 0 -4 -6 -1 -2 2 3 0 -4 6 4 0 -4 2 0 0 -6 2 -4 2 0 -6 -4 0 2 0 4 0 0 0 0 4 -4 6 4 -4 2 -6 0 2 0 -1 3 -2 0 -2 -4 4 6 0 4 -2 2 2 -2 -2 0 -3 -2 0 0 2 -2 0 1 +1 -2 -2 0 -1 0 -4 0 -2 8 -4 4 8 -2 0 0 4 0 4 0 -4 0 0 -4 1 0 0 -1 6 0 -4 0 -2 4 -4 0 -8 0 -4 8 -4 -2 0 8 -8 -4 0 4 0 0 -4 0 0 0 -4 0 0 4 -4 6 0 0 1 -1 4 0 0 0 0 0 8 8 -4 0 -2 -2 -4 4 -1 0 0 -2 0 0 -2 1 +1 -2 0 -2 1 -2 2 -2 -2 0 2 0 4 2 2 0 -2 0 2 0 0 4 4 -2 -1 -2 2 -1 0 0 2 -4 0 4 -2 -4 0 2 -2 -4 -2 0 2 -4 0 -2 -4 -4 4 4 0 0 -4 0 2 0 4 -2 -2 0 2 0 -1 -1 2 4 -2 0 0 -2 0 4 2 2 2 -2 2 0 1 -2 -4 0 2 -2 0 1 +1 -2 -2 0 3 -4 0 0 -2 8 8 -4 0 -2 0 -4 0 8 0 8 -4 -4 0 0 1 0 0 3 -2 -4 0 0 -2 -4 0 -4 8 0 0 0 0 -2 0 0 8 0 -4 -4 -4 -4 -4 8 0 -4 0 -4 0 0 0 -2 0 8 1 3 0 -4 0 4 4 0 8 0 0 0 -2 -2 0 -4 3 0 -4 -2 0 0 -2 1 +1 -2 6 -4 -1 -4 0 4 2 8 0 -4 0 2 -4 0 0 0 0 0 -4 0 8 0 1 -4 -4 -1 -2 0 0 8 2 -4 0 0 -8 4 0 0 0 2 4 0 -8 0 0 -4 0 0 -4 0 8 0 0 0 8 0 0 -2 -4 0 1 -1 0 0 -4 0 0 4 8 0 0 -4 2 2 0 -4 -1 -4 0 6 -4 -4 2 1 +1 -2 0 2 1 -6 2 -2 2 0 2 0 4 -2 2 0 2 0 -2 0 0 4 -4 2 -1 2 -2 -1 0 0 -2 4 0 -4 -2 4 0 2 -2 -4 -2 0 2 -4 0 -2 4 4 -4 -4 0 0 4 0 -2 0 -4 2 2 0 -2 0 -1 -1 -2 4 2 0 0 -2 0 4 2 2 -2 2 2 0 1 2 -4 0 -2 -2 0 1 +1 -2 6 -4 3 -8 4 -12 2 8 -4 4 8 2 -4 -4 4 -8 4 -8 12 -4 -8 12 1 -4 -4 3 6 -4 12 -8 2 4 4 -12 8 -12 4 8 4 2 -12 8 8 4 -12 4 -12 -12 12 -8 -8 -4 12 -4 -8 4 12 6 -4 -8 1 3 4 -4 -4 -4 -4 -12 8 8 4 -4 2 2 4 4 3 -4 -4 6 -4 -4 2 1 +1 -2 0 -6 1 2 6 2 2 0 -2 0 4 -2 -2 0 2 -8 -2 8 0 -4 4 2 -1 2 6 -1 0 0 -2 -4 4 -4 2 -4 0 -2 2 -4 -6 4 -2 -4 0 -6 -4 4 4 4 0 8 -4 0 -2 0 4 2 2 0 6 -8 -1 -1 -2 -4 2 0 0 2 0 4 -2 -2 -2 2 6 0 1 -6 4 0 -2 2 -4 1 +1 -2 0 -2 1 -2 -2 2 -2 0 6 0 4 2 -2 0 -2 8 2 -8 0 -4 -4 -2 -1 6 2 -1 0 0 2 4 4 4 -6 4 0 -2 -6 -4 2 4 -2 -4 0 2 4 -4 -4 -4 0 -8 4 0 2 0 -4 -2 -2 0 2 8 -1 -1 2 -4 6 0 0 2 0 4 6 -2 2 -2 -2 0 1 -2 4 0 -6 2 -4 1 +1 -2 -2 4 -1 -4 -4 0 2 0 4 4 0 2 0 0 0 0 0 0 4 0 0 0 1 -4 4 -1 -2 0 0 0 -2 -4 4 0 0 0 4 0 -4 -2 0 0 0 -4 0 -4 0 0 4 0 0 0 0 0 0 0 0 -2 4 0 1 -1 0 0 -4 0 0 0 0 0 4 0 2 2 -4 4 -1 4 0 -2 -4 0 -2 1 +1 -2 -2 0 3 -4 0 0 6 -8 8 -4 0 6 0 12 0 -8 0 -8 -4 -4 0 0 1 0 0 3 -2 12 0 0 -2 12 0 -4 -8 0 0 0 0 -2 0 0 -8 0 -4 12 -4 -4 -4 -8 0 12 0 12 0 0 0 -2 0 -8 1 3 0 -4 0 4 4 0 -8 0 0 0 6 6 0 -4 3 0 -4 -2 0 0 -2 1 +1 -2 0 6 -3 -6 6 6 6 0 6 0 -12 -6 2 -12 2 0 -2 0 0 0 12 -6 -1 6 -6 3 0 12 6 -12 0 12 -6 0 0 -6 -6 12 -6 0 -6 12 0 -6 0 -12 0 0 0 0 -12 12 6 -12 12 2 -6 0 -6 0 -1 3 -2 0 6 -4 4 6 0 -12 6 2 -6 6 6 0 -3 6 0 0 -6 -2 0 1 +1 -2 6 -12 3 0 12 12 -6 -24 4 -12 24 -6 4 12 -4 24 -4 24 12 12 -24 -12 1 -12 -12 3 6 12 -12 -24 -6 -12 12 -12 -24 12 12 24 12 -6 12 24 -24 12 -12 -12 -12 -12 12 24 -24 12 -12 12 -24 -4 -12 6 -12 24 1 3 -4 12 -12 -4 -4 12 -24 24 12 4 -6 -6 12 -12 3 -12 12 6 -12 4 -6 1 +1 -4 -2 -4 1 8 8 0 4 0 -8 0 0 4 0 4 4 -8 -4 -8 4 -4 8 4 1 4 -4 -1 -6 4 -4 -8 -4 0 8 0 16 0 -8 0 8 4 0 0 -16 -8 0 0 0 0 -4 8 8 -4 4 -4 -8 -4 -4 6 4 8 -1 1 4 4 -4 0 0 0 0 0 8 0 -4 -4 -8 0 -1 4 -4 2 -4 0 4 -1 +1 -4 0 -2 -1 6 6 2 -4 0 -2 4 -4 4 2 -4 -2 8 -2 -8 0 0 -4 2 -1 -6 2 -1 0 4 2 -4 2 0 -2 4 0 -2 2 4 -6 -2 2 -4 0 6 -4 0 -4 4 0 8 4 -4 -2 4 4 2 -2 0 -2 -8 1 1 2 0 6 0 0 -2 0 4 2 -2 -4 4 -6 -4 1 2 0 0 -6 2 2 -1 +1 -4 -2 0 1 4 0 0 0 8 0 0 0 0 0 -4 0 0 0 0 -4 -4 0 0 1 0 0 -1 2 -4 0 0 -4 0 0 0 -8 0 0 0 0 4 0 0 8 0 0 0 0 0 4 0 0 4 0 4 0 0 0 -2 0 0 -1 1 0 4 0 0 0 0 -8 0 0 0 0 0 0 0 -1 0 -4 2 0 0 4 -1 +1 -4 0 2 -1 2 -2 2 0 0 -2 4 4 0 2 4 2 0 2 0 0 0 -4 -2 -1 -2 -2 -1 0 -4 -2 -4 2 0 -2 -4 0 -2 2 -4 2 -2 2 4 0 -2 4 0 4 -4 0 0 4 4 2 -4 4 -2 2 0 2 0 1 1 -2 0 2 0 0 -2 0 -4 2 -2 0 0 2 -4 1 -2 0 0 -2 2 2 -1 +1 -4 0 6 -1 -2 -2 2 4 0 6 4 -4 -4 2 -4 -2 -8 -2 8 0 0 -4 2 -1 2 -6 -1 0 4 2 -4 2 0 6 4 0 -2 -6 4 2 -2 2 -4 0 -2 -4 0 -4 4 0 -8 4 -4 -2 4 4 2 -2 0 6 8 1 1 2 0 -2 0 0 -2 0 4 -6 -2 4 -4 2 -4 1 -6 0 0 2 2 2 -1 +1 -4 0 2 3 -2 2 -6 0 0 10 -4 4 0 2 0 -2 0 -2 0 0 -4 4 -6 -1 -2 -2 3 0 0 -6 4 2 0 2 0 0 6 -2 -4 -2 -2 -6 4 0 2 0 0 0 0 0 0 -4 0 6 0 -4 2 6 0 2 0 1 -3 2 4 2 -4 -4 6 0 -4 -2 -2 0 0 -2 4 -3 -2 4 0 -2 2 2 -1 +1 -4 6 0 1 -4 4 -4 0 0 4 0 8 0 -4 -4 0 -8 0 -8 4 4 0 0 1 0 0 -1 2 -4 0 0 0 0 -4 0 0 -4 4 8 4 0 4 -8 0 -4 0 0 0 0 -4 8 0 4 0 4 0 0 0 -2 0 8 -1 1 0 -4 0 0 0 4 0 -8 -4 4 0 0 -4 0 -1 0 4 -6 0 4 0 -1 +1 -4 0 -6 3 6 6 6 0 0 -2 -12 12 0 -2 0 -2 0 -2 0 0 12 -12 -6 -1 6 6 3 0 0 -6 -12 6 0 6 0 0 -6 -6 -12 -6 -6 6 12 0 6 0 0 0 0 0 0 12 0 6 0 12 2 6 0 -6 0 1 -3 2 -12 -6 4 4 -6 0 -12 -6 2 0 0 -6 12 -3 6 -12 0 6 -2 6 -1 +1 -4 -2 4 1 0 -8 0 4 0 8 0 0 4 0 4 -4 -8 4 -8 4 -4 -8 -4 1 -4 4 -1 -6 4 4 8 -4 0 -8 0 16 0 8 0 -8 4 0 0 -16 8 0 0 0 0 -4 8 -8 -4 -4 -4 8 4 4 6 -4 8 -1 1 -4 4 4 0 0 0 0 0 -8 0 -4 -4 8 0 -1 -4 -4 2 4 0 4 -1 +1 -6 0 2 1 10 2 -2 -2 0 -6 0 -4 2 2 0 2 8 -2 -8 0 -4 4 2 -1 -6 -2 -1 0 0 -2 -4 4 4 6 4 0 2 6 4 -2 4 2 4 0 -2 4 -4 -4 -4 0 -8 -4 0 -2 0 4 2 2 0 -2 8 -1 -1 -2 -4 -6 0 0 -2 0 -4 -6 2 2 -2 2 0 1 2 4 0 6 -2 -4 1 +1 -6 -2 0 3 12 0 0 2 8 -8 -12 0 2 0 -4 0 -8 0 -8 -4 12 0 0 1 0 0 3 -2 -4 0 0 -6 4 0 4 8 0 0 0 0 -6 0 0 8 0 4 4 4 4 -4 -8 0 -4 0 -4 0 0 0 -2 0 -8 1 3 0 12 0 -4 -4 0 8 0 0 0 2 2 0 -12 3 0 12 -2 0 0 -6 1 +1 -6 0 6 1 6 -6 -2 2 0 2 0 -4 -2 2 0 -2 -8 2 8 0 -4 -4 -2 -1 -2 -6 -1 0 0 2 4 4 -4 -2 -4 0 2 -2 4 6 4 2 4 0 6 -4 4 4 4 0 8 4 0 2 0 -4 -2 -2 0 -6 -8 -1 -1 2 -4 -2 0 0 -2 0 -4 2 2 -2 2 -6 0 1 6 4 0 2 -2 -4 1 +1 -6 6 4 3 0 4 -12 -2 -8 12 -4 8 -2 -4 -4 -4 -8 -4 -8 12 -4 8 -12 1 4 4 3 6 -4 -12 8 -2 -4 4 12 -8 -12 4 8 4 -2 -12 8 -8 4 12 -4 12 12 12 -8 8 -4 -12 -4 8 -4 -12 6 4 -8 1 3 -4 -4 4 4 4 -12 -8 8 4 -4 -2 -2 4 -4 3 4 -4 6 4 -4 -2 1 +1 -8 0 6 3 18 -6 -6 0 0 -14 -12 -12 0 2 0 2 0 2 0 0 12 12 6 -1 -6 -6 3 0 0 6 12 6 0 -6 0 0 6 6 12 6 -6 -6 -12 0 -6 0 0 0 0 0 0 -12 0 -6 0 -12 -2 -6 0 6 0 1 -3 -2 -12 6 4 4 6 0 12 6 -2 0 0 6 12 -3 -6 -12 0 -6 2 6 -1 +end diff --git a/demos/ppl_lcdd/examples/mp5.ext b/demos/ppl_lcdd/examples/mp5.ext new file mode 100644 index 0000000..dff1bf7 --- /dev/null +++ b/demos/ppl_lcdd/examples/mp5.ext @@ -0,0 +1,36 @@ +V-representation +begin +32 11 rational + 1 1 1 1 1 0 0 0 0 0 0 + 1 0 0 1 1 0 1 1 1 1 0 + 1 2/3 2/3 2/3 2/3 2/3 2/3 2/3 2/3 2/3 2/3 + 1 1 0 1 1 1 0 0 1 1 0 + 1 0 1 1 1 1 1 1 0 0 0 + 1 2/3 2/3 1/3 1/3 2/3 1/3 1/3 1/3 1/3 2/3 + 1 0 1 0 1 1 0 1 1 0 1 + 1 1 1 0 1 0 1 0 1 0 1 + 1 1/3 2/3 2/3 2/3 1/3 1/3 1/3 2/3 2/3 2/3 + 1 0 1 1 0 1 1 0 0 1 1 + 1 1 1 1 0 0 0 1 0 1 1 + 1 1/3 1/3 2/3 2/3 2/3 1/3 1/3 1/3 1/3 2/3 + 1 0 0 0 1 0 0 1 0 1 1 + 1 1 0 0 1 1 1 0 0 1 1 + 1 2/3 1/3 2/3 2/3 1/3 2/3 2/3 1/3 1/3 2/3 + 1 1/3 2/3 1/3 1/3 1/3 2/3 2/3 1/3 1/3 2/3 + 1 2/3 1/3 1/3 1/3 1/3 1/3 1/3 2/3 2/3 2/3 + 1 0 0 1 0 0 1 0 1 0 1 + 1 2/3 2/3 2/3 1/3 2/3 2/3 1/3 2/3 1/3 1/3 + 1 1 0 1 0 1 0 1 1 0 1 + 1 2/3 1/3 1/3 2/3 1/3 1/3 2/3 2/3 1/3 1/3 + 1 1/3 1/3 1/3 2/3 2/3 2/3 1/3 2/3 1/3 1/3 + 1 1/3 1/3 1/3 1/3 2/3 2/3 2/3 2/3 2/3 2/3 + 1 0 1 0 0 1 0 0 1 1 0 + 1 2/3 1/3 2/3 1/3 1/3 2/3 1/3 1/3 2/3 1/3 + 1 1/3 2/3 1/3 2/3 1/3 2/3 1/3 1/3 2/3 1/3 + 1 1/3 1/3 2/3 1/3 2/3 1/3 2/3 1/3 2/3 1/3 + 1 1 1 0 0 0 1 1 1 1 0 + 1 1/3 2/3 2/3 1/3 1/3 1/3 2/3 2/3 1/3 1/3 + 1 1 0 0 0 1 1 1 0 0 0 + 1 2/3 2/3 1/3 2/3 2/3 1/3 2/3 1/3 2/3 1/3 + 1 0 0 0 0 0 0 0 0 0 0 +end diff --git a/demos/ppl_lcdd/examples/mp5.ine b/demos/ppl_lcdd/examples/mp5.ine new file mode 100644 index 0000000..b901024 --- /dev/null +++ b/demos/ppl_lcdd/examples/mp5.ine @@ -0,0 +1,45 @@ +* metric polytope on 5 points +H-representation +begin +40 11 integer +2 -1 -1 0 0 -1 0 0 0 0 0 +0 1 1 0 0 -1 0 0 0 0 0 +0 -1 0 1 0 0 1 0 0 0 0 +0 1 0 1 0 0 -1 0 0 0 0 +0 -1 0 0 1 0 0 1 0 0 0 +0 1 0 0 1 0 0 -1 0 0 0 +0 0 -1 1 0 0 0 0 1 0 0 +0 0 1 -1 0 0 0 0 1 0 0 +0 0 1 1 0 0 0 0 -1 0 0 +0 0 -1 0 1 0 0 0 0 1 0 +0 0 1 0 -1 0 0 0 0 1 0 +0 0 1 0 1 0 0 0 0 -1 0 +0 0 0 1 1 0 0 0 0 0 -1 +0 0 0 1 -1 0 0 0 0 0 1 +0 0 0 -1 1 0 0 0 0 0 1 +2 0 0 0 0 -1 -1 0 -1 0 0 +0 0 0 0 0 1 1 0 -1 0 0 +0 0 0 0 0 -1 1 0 1 0 0 +0 0 0 0 0 1 -1 0 1 0 0 +2 0 0 0 0 -1 0 -1 0 -1 0 +0 0 0 0 0 1 0 1 0 -1 0 +0 0 0 0 0 -1 0 1 0 1 0 +0 0 0 0 0 1 0 -1 0 1 0 +2 0 0 0 0 0 -1 -1 0 0 -1 +0 0 0 0 0 0 -1 1 0 0 1 +0 0 0 0 0 0 1 -1 0 0 1 +0 0 0 0 0 0 1 1 0 0 -1 +2 0 0 0 0 0 0 0 -1 -1 -1 +0 0 0 0 0 0 0 0 1 -1 1 +0 0 0 0 0 0 0 0 -1 1 1 +0 0 0 0 0 0 0 0 1 1 -1 +0 -1 1 0 0 1 0 0 0 0 0 +0 1 -1 0 0 1 0 0 0 0 0 +2 -1 0 -1 0 0 -1 0 0 0 0 +0 1 0 -1 0 0 1 0 0 0 0 +2 -1 0 0 -1 0 0 -1 0 0 0 +0 1 0 0 -1 0 0 1 0 0 0 +2 0 -1 -1 0 0 0 0 -1 0 0 +2 0 -1 0 -1 0 0 0 0 -1 0 +2 0 0 -1 -1 0 0 0 0 0 -1 +end diff --git a/demos/ppl_lcdd/examples/mp5a.ine b/demos/ppl_lcdd/examples/mp5a.ine new file mode 100644 index 0000000..6e18548 --- /dev/null +++ b/demos/ppl_lcdd/examples/mp5a.ine @@ -0,0 +1,44 @@ +* metric polytope on 5 points +begin +40 11 integer +2 -1 -1 0 0 -1 0 0 0 0 0 +0 1 1 0 0 -1 0 0 0 0 0 +0 -1 0 1 0 0 1 0 0 0 0 +0 1 0 1 0 0 -1 0 0 0 0 +0 -1 0 0 1 0 0 1 0 0 0 +0 1 0 0 1 0 0 -1 0 0 0 +0 0 -1 1 0 0 0 0 1 0 0 +0 0 1 -1 0 0 0 0 1 0 0 +0 0 1 1 0 0 0 0 -1 0 0 +0 0 -1 0 1 0 0 0 0 1 0 +0 0 1 0 -1 0 0 0 0 1 0 +0 0 1 0 1 0 0 0 0 -1 0 +0 0 0 1 1 0 0 0 0 0 -1 +0 0 0 1 -1 0 0 0 0 0 1 +0 0 0 -1 1 0 0 0 0 0 1 +2 0 0 0 0 -1 -1 0 -1 0 0 +0 0 0 0 0 1 1 0 -1 0 0 +0 0 0 0 0 -1 1 0 1 0 0 +0 0 0 0 0 1 -1 0 1 0 0 +2 0 0 0 0 -1 0 -1 0 -1 0 +0 0 0 0 0 1 0 1 0 -1 0 +0 0 0 0 0 -1 0 1 0 1 0 +0 0 0 0 0 1 0 -1 0 1 0 +2 0 0 0 0 0 -1 -1 0 0 -1 +0 0 0 0 0 0 -1 1 0 0 1 +0 0 0 0 0 0 1 -1 0 0 1 +0 0 0 0 0 0 1 1 0 0 -1 +2 0 0 0 0 0 0 0 -1 -1 -1 +0 0 0 0 0 0 0 0 1 -1 1 +0 0 0 0 0 0 0 0 -1 1 1 +0 0 0 0 0 0 0 0 1 1 -1 +0 -1 1 0 0 1 0 0 0 0 0 +0 1 -1 0 0 1 0 0 0 0 0 +2 -1 0 -1 0 0 -1 0 0 0 0 +0 1 0 -1 0 0 1 0 0 0 0 +2 -1 0 0 -1 0 0 -1 0 0 0 +0 1 0 0 -1 0 0 1 0 0 0 +2 0 -1 -1 0 0 0 0 -1 0 0 +2 0 -1 0 -1 0 0 0 0 -1 0 +2 0 0 -1 -1 0 0 0 0 0 -1 +end diff --git a/demos/ppl_lcdd/examples/mp6.ine b/demos/ppl_lcdd/examples/mp6.ine new file mode 100644 index 0000000..7359781 --- /dev/null +++ b/demos/ppl_lcdd/examples/mp6.ine @@ -0,0 +1,84 @@ +* metric polytope on 6 points +begin +80 16 integer +0 1 1 0 0 0 -1 0 0 0 0 0 0 0 0 0 +0 -1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 +0 1 0 1 0 0 0 -1 0 0 0 0 0 0 0 0 +0 -1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 +0 1 0 0 1 0 0 0 -1 0 0 0 0 0 0 0 +0 -1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 +0 1 0 0 0 1 0 0 0 -1 0 0 0 0 0 0 +0 0 -1 1 0 0 0 0 0 0 1 0 0 0 0 0 +0 0 1 -1 0 0 0 0 0 0 1 0 0 0 0 0 +0 0 1 1 0 0 0 0 0 0 -1 0 0 0 0 0 +0 0 -1 0 1 0 0 0 0 0 0 1 0 0 0 0 +0 0 1 0 -1 0 0 0 0 0 0 1 0 0 0 0 +0 0 1 0 1 0 0 0 0 0 0 -1 0 0 0 0 +0 0 -1 0 0 1 0 0 0 0 0 0 1 0 0 0 +0 0 1 0 0 -1 0 0 0 0 0 0 1 0 0 0 +0 0 1 0 0 1 0 0 0 0 0 0 -1 0 0 0 +0 0 0 1 1 0 0 0 0 0 0 0 0 -1 0 0 +0 0 0 1 -1 0 0 0 0 0 0 0 0 1 0 0 +0 0 0 -1 1 0 0 0 0 0 0 0 0 1 0 0 +0 0 0 1 0 1 0 0 0 0 0 0 0 0 -1 0 +0 0 0 1 0 -1 0 0 0 0 0 0 0 0 1 0 +0 0 0 -1 0 1 0 0 0 0 0 0 0 0 1 0 +0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 -1 +0 0 0 0 -1 1 0 0 0 0 0 0 0 0 0 1 +0 0 0 0 1 -1 0 0 0 0 0 0 0 0 0 1 +2 0 0 0 0 0 -1 -1 0 0 -1 0 0 0 0 0 +0 0 0 0 0 0 1 1 0 0 -1 0 0 0 0 0 +0 0 0 0 0 0 -1 1 0 0 1 0 0 0 0 0 +0 0 0 0 0 0 1 -1 0 0 1 0 0 0 0 0 +2 0 0 0 0 0 -1 0 -1 0 0 -1 0 0 0 0 +0 0 0 0 0 0 1 0 1 0 0 -1 0 0 0 0 +0 0 0 0 0 0 -1 0 1 0 0 1 0 0 0 0 +0 0 0 0 0 0 1 0 -1 0 0 1 0 0 0 0 +2 0 0 0 0 0 -1 0 0 -1 0 0 -1 0 0 0 +0 0 0 0 0 0 -1 0 0 1 0 0 1 0 0 0 +0 0 0 0 0 0 1 0 0 1 0 0 -1 0 0 0 +0 0 0 0 0 0 1 0 0 -1 0 0 1 0 0 0 +2 0 0 0 0 0 0 -1 -1 0 0 0 0 -1 0 0 +0 0 0 0 0 0 0 -1 1 0 0 0 0 1 0 0 +0 0 0 0 0 0 0 1 -1 0 0 0 0 1 0 0 +0 0 0 0 0 0 0 1 1 0 0 0 0 -1 0 0 +2 0 0 0 0 0 0 -1 0 -1 0 0 0 0 -1 0 +0 0 0 0 0 0 0 -1 0 1 0 0 0 0 1 0 +0 0 0 0 0 0 0 1 0 -1 0 0 0 0 1 0 +0 0 0 0 0 0 0 1 0 1 0 0 0 0 -1 0 +2 0 0 0 0 0 0 0 -1 -1 0 0 0 0 0 -1 +0 0 0 0 0 0 0 0 1 -1 0 0 0 0 0 1 +0 0 0 0 0 0 0 0 -1 1 0 0 0 0 0 1 +0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 -1 +2 0 0 0 0 0 0 0 0 0 -1 -1 0 -1 0 0 +0 0 0 0 0 0 0 0 0 0 1 1 0 -1 0 0 +0 0 0 0 0 0 0 0 0 0 1 -1 0 1 0 0 +0 0 0 0 0 0 0 0 0 0 -1 1 0 1 0 0 +2 0 0 0 0 0 0 0 0 0 -1 0 -1 0 -1 0 +0 0 0 0 0 0 0 0 0 0 1 0 1 0 -1 0 +0 0 0 0 0 0 0 0 0 0 1 0 -1 0 1 0 +0 0 0 0 0 0 0 0 0 0 -1 0 1 0 1 0 +2 0 0 0 0 0 0 0 0 0 0 -1 -1 0 0 -1 +0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 -1 +0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 1 +0 0 0 0 0 0 0 0 0 0 0 -1 1 0 0 1 +2 0 0 0 0 0 0 0 0 0 0 0 0 -1 -1 -1 +0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 -1 +0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 1 +0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 1 +2 -1 -1 0 0 0 -1 0 0 0 0 0 0 0 0 0 +0 -1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 +0 1 -1 0 0 0 1 0 0 0 0 0 0 0 0 0 +2 -1 0 -1 0 0 0 -1 0 0 0 0 0 0 0 0 +0 1 0 -1 0 0 0 1 0 0 0 0 0 0 0 0 +2 -1 0 0 -1 0 0 0 -1 0 0 0 0 0 0 0 +0 1 0 0 -1 0 0 0 1 0 0 0 0 0 0 0 +2 -1 0 0 0 -1 0 0 0 -1 0 0 0 0 0 0 +0 1 0 0 0 -1 0 0 0 1 0 0 0 0 0 0 +2 0 -1 -1 0 0 0 0 0 0 -1 0 0 0 0 0 +2 0 -1 0 -1 0 0 0 0 0 0 -1 0 0 0 0 +2 0 -1 0 0 -1 0 0 0 0 0 0 -1 0 0 0 +2 0 0 -1 -1 0 0 0 0 0 0 0 0 -1 0 0 +2 0 0 -1 0 -1 0 0 0 0 0 0 0 0 -1 0 +2 0 0 0 -1 -1 0 0 0 0 0 0 0 0 0 -1 +end diff --git a/demos/ppl_lcdd/examples/nonfull.ine b/demos/ppl_lcdd/examples/nonfull.ine new file mode 100644 index 0000000..b662f47 --- /dev/null +++ b/demos/ppl_lcdd/examples/nonfull.ine @@ -0,0 +1,11 @@ +* non full-dimensional polyhedron +H-representation +begin + 6 4 integer + 2 -1 0 0 + -2 1 0 0 + 2 0 -1 0 + -1 1 0 0 + -1 0 1 0 + -1 0 0 1 +end diff --git a/demos/ppl_lcdd/examples/origin.ine b/demos/ppl_lcdd/examples/origin.ine new file mode 100644 index 0000000..a755533 --- /dev/null +++ b/demos/ppl_lcdd/examples/origin.ine @@ -0,0 +1,14 @@ +* The polytope consists of a single point, the origin. +* cddlib now works properly for this input (version 090c and up). +H-representation +begin + 7 7 integer + 0 1 0 0 0 0 0 + 0 0 1 0 0 0 0 + 0 0 0 1 0 0 0 + 0 0 0 0 1 0 0 + 0 0 0 0 0 1 0 + 0 0 0 0 0 0 1 + 0 -1 -1 -1 -1 -1 -1 +end + diff --git a/demos/ppl_lcdd/examples/prodst62.ext b/demos/ppl_lcdd/examples/prodst62.ext new file mode 100644 index 0000000..6fcd39e --- /dev/null +++ b/demos/ppl_lcdd/examples/prodst62.ext @@ -0,0 +1,3467 @@ +* Created by Alain Prodon. +* Convex hull problem and the number of facets is 168. +V-representation +begin + 3461 25 integer + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 1 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 1 0 1 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 1 1 + 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 1 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 1 0 1 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 1 1 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 1 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 1 0 1 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 1 0 1 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 1 1 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 1 1 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 1 0 1 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 1 0 1 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 1 0 1 0 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 1 0 1 0 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 1 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 1 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 1 1 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 + 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1 + 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 + 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 1 + 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 + 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 + 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 1 1 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 1 0 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 1 + 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 1 + 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 + 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 + 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 + 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 + 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 + 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 + 1 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 + 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 + 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 + 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 + 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 + 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 + 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 1 0 + 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 1 0 + 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 + 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 + 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 + 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 + 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 + 1 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 + 1 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 0 + 1 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 + 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 + 1 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 + 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 + 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 + 1 0 0 0 0 0 0 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 + 1 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 + 1 0 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 + 1 0 0 0 0 0 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 1 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 1 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 0 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 0 0 + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 1 0 + 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 1 + 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 + 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 1 0 + 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 1 0 1 0 + 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 1 0 0 + 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 + 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 1 0 + 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 + 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 + 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 + 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 + 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 + 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 + 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 + 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 + 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0 + 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0 + 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 + 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0 + 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 + 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 + 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 + 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 + 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 + 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 + 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 1 0 + 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 1 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 1 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 + 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 + 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0 + 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 + 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 + 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 + 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 1 0 1 + 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 1 0 + 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 1 0 1 0 + 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 1 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 1 0 0 0 + 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 1 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 + 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 1 + 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 + 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 + 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 1 0 1 + 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 1 + 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 1 + 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 1 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 1 0 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 1 0 0 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 1 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 1 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 1 0 0 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 1 + 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0 + 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 1 0 0 0 + 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 + 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 1 + 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0 + 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 1 0 1 0 + 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0 1 0 0 + 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 1 0 0 0 + 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 1 0 + 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 + 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 + 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 + 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 + 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 + 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 + 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 + 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 + 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 + 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 + 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 + 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 + 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 + 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 + 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 + 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 + 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 + 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 + 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 + 1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 + 1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 + 1 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 1 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 + 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 + 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 + 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 + 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 + 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 + 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 + 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 + 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0 + 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0 + 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 + 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0 + 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 + 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 + 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 + 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 + 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 + 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 + 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 1 0 + 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 + 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 + 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 + 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 1 + 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 1 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 1 0 0 0 + 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 + 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 + 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 + 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0 + 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 1 + 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 + 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 1 0 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 + 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 + 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 + 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 + 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 + 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 + 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 + 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 + 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 + 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 + 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 + 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 + 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 + 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 1 + 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 + 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 + 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 1 + 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 + 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 0 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 + 1 0 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 + 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 + 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 + 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 + 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 + 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 + 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 + 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 + 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 + 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 + 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 + 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 + 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 + 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0 + 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 + 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 + 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 + 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 + 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 + 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 1 0 0 0 + 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 + 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 + 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 + 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 + 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 + 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 + 1 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 + 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 + 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 + 1 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 + 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 + 1 0 0 0 1 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 + 1 0 0 0 1 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 + 1 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 + 1 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 + 1 0 0 0 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 + 1 0 0 0 1 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 + 1 0 0 0 1 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 + 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0 + 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 + 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 + 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0 + 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 + 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 + 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 + 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 + 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 + 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 1 0 1 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 0 1 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 + 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 + 1 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 + 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 1 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 + 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 + 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 + 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 + 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 + 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 + 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 + 1 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 + 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 + 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 + 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 + 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 + 1 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 + 1 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 + 1 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 + 1 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 1 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 + 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 + 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 + 1 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 + 1 0 0 0 1 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 + 1 0 0 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 + 1 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 1 0 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 1 0 0 0 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 + 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 1 0 0 0 + 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 + 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 + 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 + 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 + 1 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 1 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 1 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 + 1 0 0 1 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 + 1 0 0 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 1 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 + 1 0 0 1 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 + 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 + 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 + 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 + 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 + 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 1 0 + 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 0 0 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 + 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 + 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 0 0 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 + 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1 + 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 + 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 + 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 1 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 + 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 + 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 1 0 0 + 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 1 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 + 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1 0 1 + 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0 1 0 0 + 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 1 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 + 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 0 1 0 0 + 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 1 0 0 0 + 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 + 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 + 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 + 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 + 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 + 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 + 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 + 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 + 1 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0 + 1 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 + 1 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0 + 1 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 + 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 + 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 + 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 + 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 + 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 + 1 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 + 1 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 + 1 0 1 0 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 + 1 0 1 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 + 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 + 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 + 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0 + 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0 + 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 + 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 + 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0 + 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 + 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 + 1 0 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 + 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 + 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 + 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 + 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 + 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 + 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 + 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 + 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 + 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0 + 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 + 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 + 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 + 1 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 + 1 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 + 1 0 1 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 1 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 + 1 0 1 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 + 1 0 1 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 + 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 + 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 + 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 + 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 + 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 + 1 0 1 0 1 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 + 1 0 1 0 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 + 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 + 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 + 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 + 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 + 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 + 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 + 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 + 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 + 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 + 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 + 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 + 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 + 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 + 1 0 1 0 1 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 1 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 1 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 1 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 1 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 1 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 1 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 1 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 + 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 1 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 + 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 + 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 + 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 1 0 0 0 + 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 + 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 + 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 + 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 + 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 + 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1 + 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 + 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 + 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 + 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 + 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 + 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 + 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 + 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 + 1 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 + 1 1 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 + 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 + 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 + 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 + 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 + 1 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 + 1 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 + 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 + 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 + 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 + 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 + 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 + 1 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 + 1 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 + 1 1 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 1 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 + 1 1 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 + 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 + 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 + 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 + 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 + 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 + 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 + 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 + 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 + 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 + 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 + 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 + 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 + 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 + 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 + 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 + 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 + 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 + 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 + 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 + 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 + 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 + 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 + 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 + 1 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 + 1 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 1 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 + 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 + 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 + 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 + 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 + 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 + 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 + 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 + 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 + 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 + 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 + 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 + 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0 + 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 + 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 + 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 + 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 + 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 + 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 + 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 + 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 + 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 + 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 + 1 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 + 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 + 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 + 1 1 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 + 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 + 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 + 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 + 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 + 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 + 1 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 + 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 + 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 + 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 + 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 + 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 + 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 + 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 + 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 + 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 + 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 + 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 + 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 + 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 + 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 + 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 + 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 + 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0 + 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 + 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 + 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 + 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 + 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 + 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 + 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 + 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 + 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 + 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 + 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 + 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 + 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 + 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 + 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 + 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 + 1 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 1 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 + 1 1 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 + 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 + 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 + 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 + 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 + 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 + 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 + 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 + 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 + 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 + 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 + 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 + 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 + 1 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 + 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 + 1 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 + 1 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 + 1 1 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 + 1 1 0 0 1 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 + 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 + 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 + 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 + 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 + 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 + 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 + 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 + 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 + 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 + 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 + 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 + 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 + 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 + 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 + 1 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 + 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 + 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 + 1 1 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 + 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 + 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 + 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 + 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 + 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 + 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 + 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 + 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 + 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 + 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 + 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 + 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 + 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 + 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 + 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 + 1 1 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 + 1 1 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 + 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 + 1 1 0 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 + 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 + 1 1 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 1 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 1 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 1 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 + 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 + 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 + 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 + 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 + 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 + 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 + 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 + 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 + 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 + 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 + 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 + 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 + 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 + 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 + 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 + 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 + 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 + 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 + 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 + 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 + 1 1 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 1 0 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 + 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 + 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 + 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 + 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 + 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 + 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 + 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 + 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 + 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 + 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 + 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 + 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 + 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 + 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 + 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 + 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 + 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 + 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 + 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 + 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 + 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 + 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 + 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 + 1 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 + 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 + 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 + 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 + 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 + 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 + 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 + 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 + 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 + 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 + 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 + 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 + 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 + 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 + 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 + 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 + 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 + 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 + 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 + 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 + 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 + 1 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 1 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 + 1 1 0 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 + 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 + 1 1 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 1 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 + 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 + 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 1 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 + 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 1 0 0 0 + 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 + 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 + 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 + 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 + 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 + 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 + 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 + 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 + 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 + 1 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 + 1 1 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 + 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 + 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 + 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 + 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 + 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 + 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 + 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 + 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 + 1 1 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 1 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 + 1 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 + 1 1 1 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 + 1 1 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 + 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 + 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 + 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 + 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 + 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 + 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 + 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 + 1 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 1 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 1 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 + 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 + 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 + 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 + 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 + 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 + 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 + 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 + 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 + 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 + 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 + 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 + 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 + 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 + 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 + 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 + 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 + 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 + 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 + 1 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 + 1 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 + 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 + 1 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 + 1 1 1 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 1 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 + 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 + 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 1 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 + 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 + 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 + 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 + 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 + 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 + 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 + 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 + 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 + 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 + 1 1 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 1 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 + 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 + 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 + 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 + 1 1 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 1 1 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 + 1 1 1 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 + 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 + 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 + 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 + 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 + 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 + 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 + 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 + 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 + 1 1 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +end diff --git a/demos/ppl_lcdd/examples/project1_m.ine b/demos/ppl_lcdd/examples/project1_m.ine new file mode 100644 index 0000000..af7e014 --- /dev/null +++ b/demos/ppl_lcdd/examples/project1_m.ine @@ -0,0 +1,24 @@ +H-representation +begin +20 7 integer + 1 0 0 0 1 0 0 + 1 0 0 0 0 1 0 + 1 0 0 0 0 0 1 + 1 0 0 0 -1 0 0 + 1 0 0 0 0 -1 0 + 1 0 0 0 0 0 -1 + 1 1 0 0 -1 0 0 + 1 0 1 0 0 -1 0 + 1 0 0 1 0 0 -1 + 1 -1 0 0 1 0 0 + 1 0 -1 0 0 1 0 + 1 0 0 -1 0 0 1 + 2 1 1 1 -1 -1 -1 + 2 -1 1 1 1 -1 -1 + 2 1 -1 1 -1 1 -1 + 2 1 1 -1 -1 -1 1 + 2 -1 -1 1 1 1 -1 + 2 1 -1 -1 -1 1 1 + 2 -1 1 -1 1 -1 1 + 2 -1 -1 -1 1 1 1 +end diff --git a/demos/ppl_lcdd/examples/project1res.ine b/demos/ppl_lcdd/examples/project1res.ine new file mode 100644 index 0000000..d89603e --- /dev/null +++ b/demos/ppl_lcdd/examples/project1res.ine @@ -0,0 +1,18 @@ +H-representation +begin +14 4 integer + 5 -1 -1 1 + 2 0 0 1 + 5 -1 1 1 + 5 1 -1 1 + 2 1 0 0 + 5 1 1 1 + 5 1 1 -1 + 5 1 -1 -1 + 2 0 1 0 + 5 -1 1 -1 + 2 0 0 -1 + 5 -1 -1 -1 + 2 0 -1 0 + 2 -1 0 0 +end diff --git a/demos/ppl_lcdd/examples/project2_m.ine b/demos/ppl_lcdd/examples/project2_m.ine new file mode 100644 index 0000000..a71cbff --- /dev/null +++ b/demos/ppl_lcdd/examples/project2_m.ine @@ -0,0 +1,66 @@ +H-representation +begin +62 7 integer + 7 0 0 0 -3 1 -2 + 9 0 0 0 -2 -1 -3 + 7 0 0 0 -2 1 -3 + 9 0 0 0 -3 -1 -2 + 3 0 0 0 -2 3 -1 + 1 0 0 0 -2 3 1 + 5 0 0 0 -3 2 -1 + 3 0 0 0 -3 2 1 + 3 0 0 0 1 -3 2 + 1 0 0 0 1 -2 3 + 5 0 0 0 -1 -3 2 + 3 0 0 0 -1 -2 3 + -3 0 0 0 1 2 3 + -3 0 0 0 1 3 2 + -1 0 0 0 -1 2 3 + -1 0 0 0 -1 3 2 + 1 0 0 0 3 1 -2 + 5 0 0 0 2 -1 -3 + 3 0 0 0 3 -1 -2 + 3 0 0 0 2 1 -3 + -1 0 0 0 2 3 -1 + -1 0 0 0 3 2 -1 + -3 0 0 0 2 3 1 + -3 0 0 0 3 2 1 + -3 0 0 0 2 1 3 + -1 0 0 0 3 -1 2 + -1 0 0 0 2 -1 3 + -3 0 0 0 3 1 2 + 3 0 0 0 2 -3 1 + 5 0 0 0 2 -3 -1 + 1 0 0 0 3 -2 1 + 3 0 0 0 3 -2 -1 + 3 0 0 0 -1 3 -2 + 5 0 0 0 -1 2 -3 + 1 0 0 0 1 3 -2 + 3 0 0 0 1 2 -3 + 9 0 0 0 -1 -2 -3 + 9 0 0 0 -1 -3 -2 + 7 0 0 0 1 -2 -3 + 7 0 0 0 1 -3 -2 + 5 0 0 0 -3 -1 2 + 1 0 0 0 -2 1 3 + 3 0 0 0 -2 -1 3 + 3 0 0 0 -3 1 2 + 7 0 0 0 -2 -3 1 + 9 0 0 0 -2 -3 -1 + 7 0 0 0 -3 -2 1 + 9 0 0 0 -3 -2 -1 + 0 1 0 0 -1 0 0 + 0 0 1 0 0 -1 0 + 0 0 0 1 0 0 -1 + 2 -1 0 0 1 0 0 + 2 0 -1 0 0 1 0 + 2 0 0 -1 0 0 1 + -1 1 1 1 -1 -1 -1 + 1 -1 1 1 1 -1 -1 + 1 1 -1 1 -1 1 -1 + 1 1 1 -1 -1 -1 1 + 3 -1 -1 1 1 1 -1 + 3 1 -1 -1 -1 1 1 + 3 -1 1 -1 1 -1 1 + 5 -1 -1 -1 1 1 1 +end diff --git a/demos/ppl_lcdd/examples/project2res.ine b/demos/ppl_lcdd/examples/project2res.ine new file mode 100644 index 0000000..740f2aa --- /dev/null +++ b/demos/ppl_lcdd/examples/project2res.ine @@ -0,0 +1,90 @@ +H-representation +begin +86 4 integer + 9 -2 1 -1 + 16 -3 1 -2 + 20 -3 -1 -2 + 12 -3 2 -1 + 8 -3 2 1 + 8 -2 -1 3 + 4 -2 1 3 + 8 -2 3 -1 + 4 -2 3 1 + 9 -1 -2 1 + 11 -2 -2 2 + 5 -1 -1 2 + 1 -1 1 2 + 3 -2 2 2 + 1 -1 2 1 + 4 0 0 -1 + 0 0 1 0 + 8 -1 -2 3 + 12 -1 -3 2 + 0 -1 2 3 + 0 -1 3 2 + 5 1 -2 1 + 8 1 -3 2 + 4 1 -2 3 + 1 1 -1 2 + -3 1 1 2 + -4 1 2 3 + -4 1 3 2 + -3 1 2 1 + 3 2 -2 2 + -5 2 2 2 + 8 2 1 -3 + 12 2 -1 -3 + 0 2 3 -1 + -4 2 3 1 + 1 2 -1 1 + 4 3 -2 1 + 0 3 -1 2 + -3 2 1 1 + -4 3 1 2 + -4 3 2 1 + 0 1 0 0 + 0 3 2 -1 + 4 3 1 -2 + 1 2 1 -1 + 8 3 -1 -2 + 8 3 -2 -1 + 5 2 -1 -1 + 0 2 -1 3 + -4 2 1 3 + 8 2 -3 1 + 12 2 -3 -1 + 3 2 2 -2 + 11 2 -2 -2 + 1 1 2 -1 + 4 1 3 -2 + 8 1 2 -3 + 5 1 1 -2 + 9 1 -1 -2 + 16 1 -2 -3 + 16 1 -3 -2 + 9 1 -2 -1 + 12 -1 2 -3 + 8 -1 3 -2 + 20 -1 -2 -3 + 20 -1 -3 -2 + 0 0 0 1 + 4 0 -1 0 + 5 -1 2 -1 + 11 -2 2 -2 + 9 -1 1 -2 + 13 -1 -1 -2 + 19 -2 -2 -2 + 13 -1 -2 -1 + 16 -2 1 -3 + 20 -2 -1 -3 + 16 -2 -3 1 + 20 -2 -3 -1 + 12 -3 -1 2 + 8 -3 1 2 + 5 -2 1 1 + 16 -3 -2 1 + 20 -3 -2 -1 + 9 -2 -1 1 + 13 -2 -1 -1 + 4 -1 0 0 +end diff --git a/demos/ppl_lcdd/examples/rcubocta.ine b/demos/ppl_lcdd/examples/rcubocta.ine new file mode 100644 index 0000000..909db72 --- /dev/null +++ b/demos/ppl_lcdd/examples/rcubocta.ine @@ -0,0 +1,31 @@ +* Rhombicuboctahedron +H-representation +begin + 26 4 integer + 1 1 0 0 + 1 0 1 0 + 1 0 0 1 + 1 -1 0 0 + 1 0 -1 0 + 1 0 0 -1 + 2 1 1 1 + 2 -1 1 1 + 2 1 -1 1 + 2 1 1 -1 + 2 -1 -1 1 + 2 1 -1 -1 + 2 -1 1 -1 + 2 -1 -1 -1 + 3 2 2 0 + 3 0 2 2 + 3 2 0 2 + 3 -2 2 0 + 3 0 -2 2 + 3 2 0 -2 + 3 2 -2 0 + 3 0 2 -2 + 3 -2 0 2 + 3 -2 -2 0 + 3 0 -2 -2 + 3 -2 0 -2 +end diff --git a/demos/ppl_lcdd/examples/redcheck.ext b/demos/ppl_lcdd/examples/redcheck.ext new file mode 100644 index 0000000..e970c42 --- /dev/null +++ b/demos/ppl_lcdd/examples/redcheck.ext @@ -0,0 +1,11 @@ +V-representation +begin + 7 3 integer + 1 0 0 + 1 2 0 + 1 0 2 + 1 1 1 + 1 2 1 + 1 1 2 + 1 2 2 +end diff --git a/demos/ppl_lcdd/examples/reg24-5.ext b/demos/ppl_lcdd/examples/reg24-5.ext new file mode 100644 index 0000000..b755b67 --- /dev/null +++ b/demos/ppl_lcdd/examples/reg24-5.ext @@ -0,0 +1,31 @@ +* The vertices of a self-dual 4-dim regular polytope +* with 24 octahedron facets. +* We use hull option to compute all (24) facet inequalities. +V-representation +begin + 24 5 integer + 1 1 1 1 1 + 1 1 1 1 -1 + 1 1 1 -1 1 + 1 1 1 -1 -1 + 1 1 -1 1 1 + 1 1 -1 1 -1 + 1 1 -1 -1 1 + 1 1 -1 -1 -1 + 1 -1 1 1 1 + 1 -1 1 1 -1 + 1 -1 1 -1 1 + 1 -1 1 -1 -1 + 1 -1 -1 1 1 + 1 -1 -1 1 -1 + 1 -1 -1 -1 1 + 1 -1 -1 -1 -1 + 1 2 0 0 0 + 1 0 2 0 0 + 1 0 0 2 0 + 1 0 0 0 2 + 1 -2 0 0 0 + 1 0 -2 0 0 + 1 0 0 -2 0 + 1 0 0 0 -2 +end diff --git a/demos/ppl_lcdd/examples/reg24-5.ine b/demos/ppl_lcdd/examples/reg24-5.ine new file mode 100644 index 0000000..d984817 --- /dev/null +++ b/demos/ppl_lcdd/examples/reg24-5.ine @@ -0,0 +1,30 @@ +* The facets of a self-dual 4-dim regular polytope +* with 24 octahedron facets. +H-representation +begin + 24 5 integer + 1 1 1 1 1 + 1 1 1 1 -1 + 1 1 1 -1 1 + 1 1 1 -1 -1 + 1 1 -1 1 1 + 1 1 -1 1 -1 + 1 1 -1 -1 1 + 1 1 -1 -1 -1 + 1 -1 1 1 1 + 1 -1 1 1 -1 + 1 -1 1 -1 1 + 1 -1 1 -1 -1 + 1 -1 -1 1 1 + 1 -1 -1 1 -1 + 1 -1 -1 -1 1 + 1 -1 -1 -1 -1 + 1 2 0 0 0 + 1 0 2 0 0 + 1 0 0 2 0 + 1 0 0 0 2 + 1 -2 0 0 0 + 1 0 -2 0 0 + 1 0 0 -2 0 + 1 0 0 0 -2 +end diff --git a/demos/ppl_lcdd/examples/reg600-5_m.ext b/demos/ppl_lcdd/examples/reg600-5_m.ext new file mode 100644 index 0000000..4147d7f --- /dev/null +++ b/demos/ppl_lcdd/examples/reg600-5_m.ext @@ -0,0 +1,606 @@ +* The vertices of a 4-dim regular polytope with 600 vertices. +* Hull computation for finding all 120 facets. +V-representation +begin +600 5 rational +1 -47162307589214776/18014398509481984 -18014398509481984/18014398509481984 0 -6880887944635499/18014398509481984 +1 -47162307589214776/18014398509481984 -18014398509481984/18014398509481984 0 6880887944635499/18014398509481984 +1 -47162307589214776/18014398509481984 -6880887944635499/18014398509481984 -18014398509481984/18014398509481984 0 +1 -47162307589214776/18014398509481984 -6880887944635499/18014398509481984 18014398509481984/18014398509481984 0 +1 -47162307589214776/18014398509481984 0 -6880887944635499/18014398509481984 -18014398509481984/18014398509481984 +1 -47162307589214776/18014398509481984 0 -6880887944635499/18014398509481984 18014398509481984/18014398509481984 +1 -47162307589214776/18014398509481984 0 6880887944635499/18014398509481984 -18014398509481984/18014398509481984 +1 -47162307589214776/18014398509481984 0 6880887944635499/18014398509481984 18014398509481984/18014398509481984 +1 -47162307589214776/18014398509481984 6880887944635499/18014398509481984 -18014398509481984/18014398509481984 0 +1 -47162307589214776/18014398509481984 6880887944635499/18014398509481984 18014398509481984/18014398509481984 0 +1 -47162307589214776/18014398509481984 18014398509481984/18014398509481984 0 -6880887944635499/18014398509481984 +1 -47162307589214776/18014398509481984 18014398509481984/18014398509481984 0 6880887944635499/18014398509481984 +1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 +1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 +1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 +1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 +1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 +1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984 +1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 +1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984 +1 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 +1 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 +1 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 +1 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 +1 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 +1 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 +1 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 +1 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 +1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 +1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 +1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 +1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 +1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 +1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984 +1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 +1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984 +1 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 +1 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 +1 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 +1 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 +1 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 +1 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 +1 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 +1 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 +1 -20140709815984596/9007199254740992 -14573954539866394/9007199254740992 0 -5566755282423243/9007199254740992 +1 -20140709815984596/9007199254740992 -14573954539866394/9007199254740992 0 5566755282423243/9007199254740992 +1 -20140709815984596/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 0 +1 -20140709815984596/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 0 +1 -20140709815984596/9007199254740992 0 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 +1 -20140709815984596/9007199254740992 0 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 +1 -20140709815984596/9007199254740992 0 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 +1 -20140709815984596/9007199254740992 0 5566755282423243/9007199254740992 14573954539866394/9007199254740992 +1 -20140709815984596/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 0 +1 -20140709815984596/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 0 +1 -20140709815984596/9007199254740992 14573954539866394/9007199254740992 0 -5566755282423243/9007199254740992 +1 -20140709815984596/9007199254740992 14573954539866394/9007199254740992 0 5566755282423243/9007199254740992 +1 -18014398509481984/18014398509481984 -47162307589214776/18014398509481984 -6880887944635499/18014398509481984 0 +1 -18014398509481984/18014398509481984 -47162307589214776/18014398509481984 6880887944635499/18014398509481984 0 +1 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 +1 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 +1 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 +1 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992 +1 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 +1 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 +1 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 +1 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992 +1 -18014398509481984/18014398509481984 -6880887944635499/18014398509481984 0 -47162307589214776/18014398509481984 +1 -18014398509481984/18014398509481984 -6880887944635499/18014398509481984 0 47162307589214776/18014398509481984 +1 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 +1 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 +1 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 +1 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992 +1 -18014398509481984/18014398509481984 0 -47162307589214776/18014398509481984 -6880887944635499/18014398509481984 +1 -18014398509481984/18014398509481984 0 -47162307589214776/18014398509481984 6880887944635499/18014398509481984 +1 -18014398509481984/18014398509481984 0 47162307589214776/18014398509481984 -6880887944635499/18014398509481984 +1 -18014398509481984/18014398509481984 0 47162307589214776/18014398509481984 6880887944635499/18014398509481984 +1 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 +1 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 +1 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 +1 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992 +1 -18014398509481984/18014398509481984 6880887944635499/18014398509481984 0 -47162307589214776/18014398509481984 +1 -18014398509481984/18014398509481984 6880887944635499/18014398509481984 0 47162307589214776/18014398509481984 +1 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 +1 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 +1 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 +1 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992 +1 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 +1 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 +1 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 +1 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992 +1 -18014398509481984/18014398509481984 47162307589214776/18014398509481984 -6880887944635499/18014398509481984 0 +1 -18014398509481984/18014398509481984 47162307589214776/18014398509481984 6880887944635499/18014398509481984 0 +1 -14573954539866394/9007199254740992 -20140709815984596/9007199254740992 -5566755282423243/9007199254740992 0 +1 -14573954539866394/9007199254740992 -20140709815984596/9007199254740992 5566755282423243/9007199254740992 0 +1 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 +1 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 +1 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 +1 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992 +1 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 +1 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 +1 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 +1 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992 +1 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 +1 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 +1 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 0 -20140709815984596/9007199254740992 +1 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 0 20140709815984596/9007199254740992 +1 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 +1 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992 +1 -14573954539866394/9007199254740992 0 -20140709815984596/9007199254740992 -5566755282423243/9007199254740992 +1 -14573954539866394/9007199254740992 0 -20140709815984596/9007199254740992 5566755282423243/9007199254740992 +1 -14573954539866394/9007199254740992 0 20140709815984596/9007199254740992 -5566755282423243/9007199254740992 +1 -14573954539866394/9007199254740992 0 20140709815984596/9007199254740992 5566755282423243/9007199254740992 +1 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 +1 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 +1 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 0 -20140709815984596/9007199254740992 +1 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 0 20140709815984596/9007199254740992 +1 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 +1 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992 +1 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 +1 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 +1 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 +1 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992 +1 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 +1 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 +1 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 +1 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992 +1 -14573954539866394/9007199254740992 20140709815984596/9007199254740992 -5566755282423243/9007199254740992 0 +1 -14573954539866394/9007199254740992 20140709815984596/9007199254740992 5566755282423243/9007199254740992 0 +1 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 +1 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 +1 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 +1 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 +1 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 +1 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 +1 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 +1 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992 +1 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 +1 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 +1 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 +1 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992 +1 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 +1 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 +1 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 +1 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992 +1 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 +1 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 +1 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 +1 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992 +1 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 +1 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 +1 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 +1 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 +1 -6880887944635499/18014398509481984 -47162307589214776/18014398509481984 0 -18014398509481984/18014398509481984 +1 -6880887944635499/18014398509481984 -47162307589214776/18014398509481984 0 18014398509481984/18014398509481984 +1 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 +1 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 +1 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 +1 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 +1 -6880887944635499/18014398509481984 -18014398509481984/18014398509481984 -47162307589214776/18014398509481984 0 +1 -6880887944635499/18014398509481984 -18014398509481984/18014398509481984 47162307589214776/18014398509481984 0 +1 -6880887944635499/18014398509481984 0 -18014398509481984/18014398509481984 -47162307589214776/18014398509481984 +1 -6880887944635499/18014398509481984 0 -18014398509481984/18014398509481984 47162307589214776/18014398509481984 +1 -6880887944635499/18014398509481984 0 18014398509481984/18014398509481984 -47162307589214776/18014398509481984 +1 -6880887944635499/18014398509481984 0 18014398509481984/18014398509481984 47162307589214776/18014398509481984 +1 -6880887944635499/18014398509481984 18014398509481984/18014398509481984 -47162307589214776/18014398509481984 0 +1 -6880887944635499/18014398509481984 18014398509481984/18014398509481984 47162307589214776/18014398509481984 0 +1 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 +1 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 +1 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 +1 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 +1 -6880887944635499/18014398509481984 47162307589214776/18014398509481984 0 -18014398509481984/18014398509481984 +1 -6880887944635499/18014398509481984 47162307589214776/18014398509481984 0 18014398509481984/18014398509481984 +1 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 +1 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 +1 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 +1 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 +1 -5566755282423243/9007199254740992 -20140709815984596/9007199254740992 0 -14573954539866394/9007199254740992 +1 -5566755282423243/9007199254740992 -20140709815984596/9007199254740992 0 14573954539866394/9007199254740992 +1 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 +1 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 +1 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 +1 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992 +1 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -20140709815984596/9007199254740992 0 +1 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 +1 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 +1 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 +1 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992 +1 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 20140709815984596/9007199254740992 0 +1 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 +1 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 +1 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 +1 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992 +1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 +1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 +1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 +1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 +1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 +1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992 +1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 +1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992 +1 -5566755282423243/9007199254740992 0 -14573954539866394/9007199254740992 -20140709815984596/9007199254740992 +1 -5566755282423243/9007199254740992 0 -14573954539866394/9007199254740992 20140709815984596/9007199254740992 +1 -5566755282423243/9007199254740992 0 14573954539866394/9007199254740992 -20140709815984596/9007199254740992 +1 -5566755282423243/9007199254740992 0 14573954539866394/9007199254740992 20140709815984596/9007199254740992 +1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 +1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 +1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 +1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 +1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 +1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992 +1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 +1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992 +1 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 +1 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 +1 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 +1 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992 +1 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 -20140709815984596/9007199254740992 0 +1 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 +1 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 +1 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 +1 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992 +1 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 20140709815984596/9007199254740992 0 +1 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 +1 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 +1 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 +1 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992 +1 -5566755282423243/9007199254740992 20140709815984596/9007199254740992 0 -14573954539866394/9007199254740992 +1 -5566755282423243/9007199254740992 20140709815984596/9007199254740992 0 14573954539866394/9007199254740992 +1 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 +1 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 +1 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 +1 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 +1 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 +1 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 +1 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 +1 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 +1 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 +1 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 +1 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 +1 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 +1 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 +1 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 +1 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 +1 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 +1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 +1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 +1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 +1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 +1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 +1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248 +1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 +1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248 +1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 +1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 +1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 +1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 +1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 +1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248 +1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 +1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248 +1 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 +1 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 +1 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 +1 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 +1 -2 -2 0 0 +1 -2 0 -2 0 +1 -2 0 0 -2 +1 -2 0 0 2 +1 -2 0 2 0 +1 -2 2 0 0 +1 0 -47162307589214776/18014398509481984 -18014398509481984/18014398509481984 -6880887944635499/18014398509481984 +1 0 -47162307589214776/18014398509481984 -18014398509481984/18014398509481984 6880887944635499/18014398509481984 +1 0 -47162307589214776/18014398509481984 18014398509481984/18014398509481984 -6880887944635499/18014398509481984 +1 0 -47162307589214776/18014398509481984 18014398509481984/18014398509481984 6880887944635499/18014398509481984 +1 0 -20140709815984596/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 +1 0 -20140709815984596/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 +1 0 -20140709815984596/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 +1 0 -20140709815984596/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992 +1 0 -18014398509481984/18014398509481984 -6880887944635499/18014398509481984 -47162307589214776/18014398509481984 +1 0 -18014398509481984/18014398509481984 -6880887944635499/18014398509481984 47162307589214776/18014398509481984 +1 0 -18014398509481984/18014398509481984 6880887944635499/18014398509481984 -47162307589214776/18014398509481984 +1 0 -18014398509481984/18014398509481984 6880887944635499/18014398509481984 47162307589214776/18014398509481984 +1 0 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -20140709815984596/9007199254740992 +1 0 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 20140709815984596/9007199254740992 +1 0 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 -20140709815984596/9007199254740992 +1 0 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 20140709815984596/9007199254740992 +1 0 -6880887944635499/18014398509481984 -47162307589214776/18014398509481984 -18014398509481984/18014398509481984 +1 0 -6880887944635499/18014398509481984 -47162307589214776/18014398509481984 18014398509481984/18014398509481984 +1 0 -6880887944635499/18014398509481984 47162307589214776/18014398509481984 -18014398509481984/18014398509481984 +1 0 -6880887944635499/18014398509481984 47162307589214776/18014398509481984 18014398509481984/18014398509481984 +1 0 -5566755282423243/9007199254740992 -20140709815984596/9007199254740992 -14573954539866394/9007199254740992 +1 0 -5566755282423243/9007199254740992 -20140709815984596/9007199254740992 14573954539866394/9007199254740992 +1 0 -5566755282423243/9007199254740992 20140709815984596/9007199254740992 -14573954539866394/9007199254740992 +1 0 -5566755282423243/9007199254740992 20140709815984596/9007199254740992 14573954539866394/9007199254740992 +1 0 -2 -2 0 +1 0 -2 0 -2 +1 0 -2 0 2 +1 0 -2 2 0 +1 0 0 -2 -2 +1 0 0 -2 2 +1 0 0 2 -2 +1 0 0 2 2 +1 0 2 -2 0 +1 0 2 0 -2 +1 0 2 0 2 +1 0 2 2 0 +1 0 5566755282423243/9007199254740992 -20140709815984596/9007199254740992 -14573954539866394/9007199254740992 +1 0 5566755282423243/9007199254740992 -20140709815984596/9007199254740992 14573954539866394/9007199254740992 +1 0 5566755282423243/9007199254740992 20140709815984596/9007199254740992 -14573954539866394/9007199254740992 +1 0 5566755282423243/9007199254740992 20140709815984596/9007199254740992 14573954539866394/9007199254740992 +1 0 6880887944635499/18014398509481984 -47162307589214776/18014398509481984 -18014398509481984/18014398509481984 +1 0 6880887944635499/18014398509481984 -47162307589214776/18014398509481984 18014398509481984/18014398509481984 +1 0 6880887944635499/18014398509481984 47162307589214776/18014398509481984 -18014398509481984/18014398509481984 +1 0 6880887944635499/18014398509481984 47162307589214776/18014398509481984 18014398509481984/18014398509481984 +1 0 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -20140709815984596/9007199254740992 +1 0 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 20140709815984596/9007199254740992 +1 0 14573954539866394/9007199254740992 5566755282423243/9007199254740992 -20140709815984596/9007199254740992 +1 0 14573954539866394/9007199254740992 5566755282423243/9007199254740992 20140709815984596/9007199254740992 +1 0 18014398509481984/18014398509481984 -6880887944635499/18014398509481984 -47162307589214776/18014398509481984 +1 0 18014398509481984/18014398509481984 -6880887944635499/18014398509481984 47162307589214776/18014398509481984 +1 0 18014398509481984/18014398509481984 6880887944635499/18014398509481984 -47162307589214776/18014398509481984 +1 0 18014398509481984/18014398509481984 6880887944635499/18014398509481984 47162307589214776/18014398509481984 +1 0 20140709815984596/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 +1 0 20140709815984596/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 +1 0 20140709815984596/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 +1 0 20140709815984596/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992 +1 0 47162307589214776/18014398509481984 -18014398509481984/18014398509481984 -6880887944635499/18014398509481984 +1 0 47162307589214776/18014398509481984 -18014398509481984/18014398509481984 6880887944635499/18014398509481984 +1 0 47162307589214776/18014398509481984 18014398509481984/18014398509481984 -6880887944635499/18014398509481984 +1 0 47162307589214776/18014398509481984 18014398509481984/18014398509481984 6880887944635499/18014398509481984 +1 2 -2 0 0 +1 2 0 -2 0 +1 2 0 0 -2 +1 2 0 0 2 +1 2 0 2 0 +1 2 2 0 0 +1 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 +1 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 +1 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 +1 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 +1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 +1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 +1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 +1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 +1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 +1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248 +1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 +1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248 +1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 +1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 +1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 +1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 +1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 +1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248 +1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 +1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248 +1 2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 +1 2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 +1 2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 +1 2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 +1 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 +1 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 +1 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 +1 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 +1 5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 +1 5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 +1 5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 +1 5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 +1 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 +1 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 +1 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 +1 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 +1 5566755282423243/9007199254740992 -20140709815984596/9007199254740992 0 -14573954539866394/9007199254740992 +1 5566755282423243/9007199254740992 -20140709815984596/9007199254740992 0 14573954539866394/9007199254740992 +1 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 +1 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 +1 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 +1 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992 +1 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -20140709815984596/9007199254740992 0 +1 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 +1 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 +1 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 +1 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992 +1 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 20140709815984596/9007199254740992 0 +1 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 +1 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 +1 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 +1 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992 +1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 +1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 +1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 +1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 +1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 +1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992 +1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 +1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992 +1 5566755282423243/9007199254740992 0 -14573954539866394/9007199254740992 -20140709815984596/9007199254740992 +1 5566755282423243/9007199254740992 0 -14573954539866394/9007199254740992 20140709815984596/9007199254740992 +1 5566755282423243/9007199254740992 0 14573954539866394/9007199254740992 -20140709815984596/9007199254740992 +1 5566755282423243/9007199254740992 0 14573954539866394/9007199254740992 20140709815984596/9007199254740992 +1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 +1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 +1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 +1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 +1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 +1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992 +1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 +1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992 +1 5566755282423243/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 +1 5566755282423243/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 +1 5566755282423243/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 +1 5566755282423243/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992 +1 5566755282423243/9007199254740992 14573954539866394/9007199254740992 -20140709815984596/9007199254740992 0 +1 5566755282423243/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 +1 5566755282423243/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 +1 5566755282423243/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 +1 5566755282423243/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992 +1 5566755282423243/9007199254740992 14573954539866394/9007199254740992 20140709815984596/9007199254740992 0 +1 5566755282423243/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 +1 5566755282423243/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 +1 5566755282423243/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 +1 5566755282423243/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992 +1 5566755282423243/9007199254740992 20140709815984596/9007199254740992 0 -14573954539866394/9007199254740992 +1 5566755282423243/9007199254740992 20140709815984596/9007199254740992 0 14573954539866394/9007199254740992 +1 5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 +1 5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 +1 5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 +1 5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 +1 6880887944635499/18014398509481984 -47162307589214776/18014398509481984 0 -18014398509481984/18014398509481984 +1 6880887944635499/18014398509481984 -47162307589214776/18014398509481984 0 18014398509481984/18014398509481984 +1 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 +1 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 +1 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 +1 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 +1 6880887944635499/18014398509481984 -18014398509481984/18014398509481984 -47162307589214776/18014398509481984 0 +1 6880887944635499/18014398509481984 -18014398509481984/18014398509481984 47162307589214776/18014398509481984 0 +1 6880887944635499/18014398509481984 0 -18014398509481984/18014398509481984 -47162307589214776/18014398509481984 +1 6880887944635499/18014398509481984 0 -18014398509481984/18014398509481984 47162307589214776/18014398509481984 +1 6880887944635499/18014398509481984 0 18014398509481984/18014398509481984 -47162307589214776/18014398509481984 +1 6880887944635499/18014398509481984 0 18014398509481984/18014398509481984 47162307589214776/18014398509481984 +1 6880887944635499/18014398509481984 18014398509481984/18014398509481984 -47162307589214776/18014398509481984 0 +1 6880887944635499/18014398509481984 18014398509481984/18014398509481984 47162307589214776/18014398509481984 0 +1 6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 +1 6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 +1 6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 +1 6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 +1 6880887944635499/18014398509481984 47162307589214776/18014398509481984 0 -18014398509481984/18014398509481984 +1 6880887944635499/18014398509481984 47162307589214776/18014398509481984 0 18014398509481984/18014398509481984 +1 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 +1 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 +1 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 +1 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 +1 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 +1 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 +1 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 +1 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992 +1 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 +1 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 +1 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 +1 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992 +1 9007199254740992/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 +1 9007199254740992/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 +1 9007199254740992/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 +1 9007199254740992/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992 +1 9007199254740992/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 +1 9007199254740992/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 +1 9007199254740992/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 +1 9007199254740992/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992 +1 9007199254740992/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 +1 9007199254740992/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 +1 9007199254740992/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 +1 9007199254740992/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 +1 14573954539866394/9007199254740992 -20140709815984596/9007199254740992 -5566755282423243/9007199254740992 0 +1 14573954539866394/9007199254740992 -20140709815984596/9007199254740992 5566755282423243/9007199254740992 0 +1 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 +1 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 +1 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 +1 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992 +1 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 +1 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 +1 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 +1 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992 +1 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 +1 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 +1 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 0 -20140709815984596/9007199254740992 +1 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 0 20140709815984596/9007199254740992 +1 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 +1 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992 +1 14573954539866394/9007199254740992 0 -20140709815984596/9007199254740992 -5566755282423243/9007199254740992 +1 14573954539866394/9007199254740992 0 -20140709815984596/9007199254740992 5566755282423243/9007199254740992 +1 14573954539866394/9007199254740992 0 20140709815984596/9007199254740992 -5566755282423243/9007199254740992 +1 14573954539866394/9007199254740992 0 20140709815984596/9007199254740992 5566755282423243/9007199254740992 +1 14573954539866394/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 +1 14573954539866394/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 +1 14573954539866394/9007199254740992 5566755282423243/9007199254740992 0 -20140709815984596/9007199254740992 +1 14573954539866394/9007199254740992 5566755282423243/9007199254740992 0 20140709815984596/9007199254740992 +1 14573954539866394/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 +1 14573954539866394/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992 +1 14573954539866394/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 +1 14573954539866394/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 +1 14573954539866394/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 +1 14573954539866394/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992 +1 14573954539866394/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 +1 14573954539866394/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 +1 14573954539866394/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 +1 14573954539866394/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992 +1 14573954539866394/9007199254740992 20140709815984596/9007199254740992 -5566755282423243/9007199254740992 0 +1 14573954539866394/9007199254740992 20140709815984596/9007199254740992 5566755282423243/9007199254740992 0 +1 18014398509481984/18014398509481984 -47162307589214776/18014398509481984 -6880887944635499/18014398509481984 0 +1 18014398509481984/18014398509481984 -47162307589214776/18014398509481984 6880887944635499/18014398509481984 0 +1 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 +1 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 +1 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 +1 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992 +1 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 +1 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 +1 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 +1 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992 +1 18014398509481984/18014398509481984 -6880887944635499/18014398509481984 0 -47162307589214776/18014398509481984 +1 18014398509481984/18014398509481984 -6880887944635499/18014398509481984 0 47162307589214776/18014398509481984 +1 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 +1 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 +1 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 +1 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992 +1 18014398509481984/18014398509481984 0 -47162307589214776/18014398509481984 -6880887944635499/18014398509481984 +1 18014398509481984/18014398509481984 0 -47162307589214776/18014398509481984 6880887944635499/18014398509481984 +1 18014398509481984/18014398509481984 0 47162307589214776/18014398509481984 -6880887944635499/18014398509481984 +1 18014398509481984/18014398509481984 0 47162307589214776/18014398509481984 6880887944635499/18014398509481984 +1 18014398509481984/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 +1 18014398509481984/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 +1 18014398509481984/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 +1 18014398509481984/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992 +1 18014398509481984/18014398509481984 6880887944635499/18014398509481984 0 -47162307589214776/18014398509481984 +1 18014398509481984/18014398509481984 6880887944635499/18014398509481984 0 47162307589214776/18014398509481984 +1 18014398509481984/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 +1 18014398509481984/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 +1 18014398509481984/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 +1 18014398509481984/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992 +1 18014398509481984/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 +1 18014398509481984/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 +1 18014398509481984/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 +1 18014398509481984/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992 +1 18014398509481984/18014398509481984 47162307589214776/18014398509481984 -6880887944635499/18014398509481984 0 +1 18014398509481984/18014398509481984 47162307589214776/18014398509481984 6880887944635499/18014398509481984 0 +1 20140709815984596/9007199254740992 -14573954539866394/9007199254740992 0 -5566755282423243/9007199254740992 +1 20140709815984596/9007199254740992 -14573954539866394/9007199254740992 0 5566755282423243/9007199254740992 +1 20140709815984596/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 0 +1 20140709815984596/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 0 +1 20140709815984596/9007199254740992 0 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 +1 20140709815984596/9007199254740992 0 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 +1 20140709815984596/9007199254740992 0 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 +1 20140709815984596/9007199254740992 0 5566755282423243/9007199254740992 14573954539866394/9007199254740992 +1 20140709815984596/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 0 +1 20140709815984596/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 0 +1 20140709815984596/9007199254740992 14573954539866394/9007199254740992 0 -5566755282423243/9007199254740992 +1 20140709815984596/9007199254740992 14573954539866394/9007199254740992 0 5566755282423243/9007199254740992 +1 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 +1 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 +1 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 +1 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 +1 23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 +1 23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 +1 23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 +1 23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 +1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 +1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 +1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 +1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 +1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 +1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984 +1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 +1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984 +1 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 +1 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 +1 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 +1 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 +1 29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 +1 29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 +1 29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 +1 29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 +1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 +1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 +1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 +1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 +1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 +1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984 +1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 +1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984 +1 47162307589214776/18014398509481984 -18014398509481984/18014398509481984 0 -6880887944635499/18014398509481984 +1 47162307589214776/18014398509481984 -18014398509481984/18014398509481984 0 6880887944635499/18014398509481984 +1 47162307589214776/18014398509481984 -6880887944635499/18014398509481984 -18014398509481984/18014398509481984 0 +1 47162307589214776/18014398509481984 -6880887944635499/18014398509481984 18014398509481984/18014398509481984 0 +1 47162307589214776/18014398509481984 0 -6880887944635499/18014398509481984 -18014398509481984/18014398509481984 +1 47162307589214776/18014398509481984 0 -6880887944635499/18014398509481984 18014398509481984/18014398509481984 +1 47162307589214776/18014398509481984 0 6880887944635499/18014398509481984 -18014398509481984/18014398509481984 +1 47162307589214776/18014398509481984 0 6880887944635499/18014398509481984 18014398509481984/18014398509481984 +1 47162307589214776/18014398509481984 6880887944635499/18014398509481984 -18014398509481984/18014398509481984 0 +1 47162307589214776/18014398509481984 6880887944635499/18014398509481984 18014398509481984/18014398509481984 0 +1 47162307589214776/18014398509481984 18014398509481984/18014398509481984 0 -6880887944635499/18014398509481984 +1 47162307589214776/18014398509481984 18014398509481984/18014398509481984 0 6880887944635499/18014398509481984 +end diff --git a/demos/ppl_lcdd/examples/rhomtria_m.ine b/demos/ppl_lcdd/examples/rhomtria_m.ine new file mode 100644 index 0000000..26757d4 --- /dev/null +++ b/demos/ppl_lcdd/examples/rhomtria_m.ine @@ -0,0 +1,35 @@ +* Rhombic Triacontahedron +H-representation +begin +30 4 integer +14411518807585588 -22267021104472812 -8505245247627733 -13761775885668118 +14411518807585588 -22267021104472812 -8505245247627733 13761775885668118 +14411518807585588 -22267021104472812 8505245247627733 -13761775885668118 +14411518807585588 -22267021104472812 8505245247627733 13761775885668118 +14411518807585588 -13761775885668118 -22267021104472812 -8505245247627733 +14411518807585588 -13761775885668118 -22267021104472812 8505245247627733 +14411518807585588 -13761775885668118 22267021104472812 -8505245247627733 +14411518807585588 -13761775885668118 22267021104472812 8505245247627733 +14411518807585588 -8505245247627733 -13761775885668118 -22267021104472812 +14411518807585588 -8505245247627733 -13761775885668118 22267021104472812 +14411518807585588 -8505245247627733 13761775885668118 -22267021104472812 +14411518807585588 -8505245247627733 13761775885668118 22267021104472812 +3602879701896397 -6880887957245578 0 0 +3602879701896397 0 -6880887957245578 0 +3602879701896397 0 0 -6880887957245578 +3602879701896397 0 0 6880887957245578 +3602879701896397 0 6880887957245578 0 +3602879701896397 6880887957245578 0 0 +14411518807585588 8505245247627733 -13761775885668118 -22267021104472812 +14411518807585588 8505245247627733 -13761775885668118 22267021104472812 +14411518807585588 8505245247627733 13761775885668118 -22267021104472812 +14411518807585588 8505245247627733 13761775885668118 22267021104472812 +14411518807585588 13761775885668118 -22267021104472812 -8505245247627733 +14411518807585588 13761775885668118 -22267021104472812 8505245247627733 +14411518807585588 13761775885668118 22267021104472812 -8505245247627733 +14411518807585588 13761775885668118 22267021104472812 8505245247627733 +14411518807585588 22267021104472812 -8505245247627733 -13761775885668118 +14411518807585588 22267021104472812 -8505245247627733 13761775885668118 +14411518807585588 22267021104472812 8505245247627733 -13761775885668118 +14411518807585588 22267021104472812 8505245247627733 13761775885668118 +end diff --git a/demos/ppl_lcdd/examples/sample.ine b/demos/ppl_lcdd/examples/sample.ine new file mode 100644 index 0000000..452e1bf --- /dev/null +++ b/demos/ppl_lcdd/examples/sample.ine @@ -0,0 +1,11 @@ +* 3-cube +H-representation +begin + 6 4 rational + 10/3 1 0 0 + 10/3 0 1 0 + 10/3 0 0 1 + 10/3 -1 0 0 + 10/3 0 -1 0 + 10/3 0 0 -1 +end diff --git a/demos/ppl_lcdd/examples/sampleh1.ine b/demos/ppl_lcdd/examples/sampleh1.ine new file mode 100644 index 0000000..93f3df3 --- /dev/null +++ b/demos/ppl_lcdd/examples/sampleh1.ine @@ -0,0 +1,9 @@ +* a 3-D cone containing no vertices and a line +H-representation +begin + 3 4 integer + 2 -1 -1 0 + 0 1 0 0 + 0 0 1 0 +end + diff --git a/demos/ppl_lcdd/examples/sampleh2.ine b/demos/ppl_lcdd/examples/sampleh2.ine new file mode 100644 index 0000000..082026d --- /dev/null +++ b/demos/ppl_lcdd/examples/sampleh2.ine @@ -0,0 +1,7 @@ +* a hyperplane with no vertices and rays +H-representation +begin + 1 4 integer +-1 0 0 1 +end + diff --git a/demos/ppl_lcdd/examples/sampleh3.ine b/demos/ppl_lcdd/examples/sampleh3.ine new file mode 100644 index 0000000..b2ace9b --- /dev/null +++ b/demos/ppl_lcdd/examples/sampleh3.ine @@ -0,0 +1,7 @@ +* a 3-D homogeneous cone with no vertices +H-representation +begin + 2 4 integer + 0 1 1 0 + 0 0 1 0 +end diff --git a/demos/ppl_lcdd/examples/sampleh4.ine b/demos/ppl_lcdd/examples/sampleh4.ine new file mode 100644 index 0000000..f929e10 --- /dev/null +++ b/demos/ppl_lcdd/examples/sampleh4.ine @@ -0,0 +1,12 @@ +* trivial inequalities: the polyhedron is the whole space. +H-representation +begin + 6 4 integer + 0 0 0 0 + 0 0 0 0 + 0 0 0 0 + 0 0 0 0 + 0 0 0 0 + 0 0 0 0 +end + diff --git a/demos/ppl_lcdd/examples/sampleh5.ine b/demos/ppl_lcdd/examples/sampleh5.ine new file mode 100644 index 0000000..ec122d5 --- /dev/null +++ b/demos/ppl_lcdd/examples/sampleh5.ine @@ -0,0 +1,15 @@ +* test file for redundancy removal +H-representation +linearity 1 3 +begin + 8 4 integer + 0 1 0 0 + 0 0 1 0 + 0 0 0 1 + 1 -1 -1 -1 + 1 -1 -1 0 + 1 0 -1 -1 + 1 -1 0 -1 + 2 -1 -1 -1 +end + diff --git a/demos/ppl_lcdd/examples/sampleh6.ine b/demos/ppl_lcdd/examples/sampleh6.ine new file mode 100644 index 0000000..b9c93a7 --- /dev/null +++ b/demos/ppl_lcdd/examples/sampleh6.ine @@ -0,0 +1,11 @@ +* test file for forced-equality checking +H-representation +begin + 5 4 integer + 0 1 0 0 + 0 0 1 0 + 0 0 0 1 + 1 -1 -1 -1 +-1 1 1 0 +end + diff --git a/demos/ppl_lcdd/examples/sampleh7.ine b/demos/ppl_lcdd/examples/sampleh7.ine new file mode 100644 index 0000000..c4c09d2 --- /dev/null +++ b/demos/ppl_lcdd/examples/sampleh7.ine @@ -0,0 +1,19 @@ +* test file for redundancy removal +* the redundant rows are +* 3 4 5 9 10 +* LP type = 1 Seed = 123 +H-representation +begin + 10 3 integer + 0 1 0 + 0 0 1 + -10000 651 693 + -10000 697 637 + -10000 368 824 + -10000 87 725 + -10000 387 219 + -10000 430 202 + -10000 356 988 + -10000 674 979 +end + diff --git a/demos/ppl_lcdd/examples/sampleh8.ine b/demos/ppl_lcdd/examples/sampleh8.ine new file mode 100644 index 0000000..cf5f54c --- /dev/null +++ b/demos/ppl_lcdd/examples/sampleh8.ine @@ -0,0 +1,110 @@ +* test file for redundancy removal +* the redundant rows are +* 10 11 12 14 21 23 26 32 39 40 41 44 46 +* 50 51 54 56 57 59 62 63 64 69 76 77 78 +* 79 83 84 85 87 88 91 94 97 +* LP type = 1 Seed = 123 +H-representation +begin + 100 10 integer + 0 1 0 0 0 0 0 0 0 0 + 0 0 1 0 0 0 0 0 0 0 + 0 0 0 1 0 0 0 0 0 0 + 0 0 0 0 1 0 0 0 0 0 + 0 0 0 0 0 1 0 0 0 0 + 0 0 0 0 0 0 1 0 0 0 + 0 0 0 0 0 0 0 1 0 0 + 0 0 0 0 0 0 0 0 1 0 + 0 0 0 0 0 0 0 0 0 1 + -10000 651 693 84 697 637 340 368 824 663 + -10000 725 742 387 219 751 430 202 745 356 + -10000 377 674 979 167 815 988 412 676 475 + -10000 710 275 949 284 629 1 422 974 510 + -10000 692 945 725 488 271 430 724 225 726 + -10000 465 258 450 343 87 168 161 103 919 + -10000 86 79 656 493 832 514 791 506 29 + -10000 63 630 874 918 877 272 992 119 480 + -10000 598 926 42 378 288 66 927 919 99 + -10000 256 354 106 979 641 160 395 225 837 + -10000 202 388 900 471 160 751 300 731 818 + -10000 342 502 825 563 639 261 194 984 990 + -10000 266 406 364 216 448 675 145 694 866 + -10000 362 983 732 378 134 902 946 877 205 + -10000 926 125 949 888 234 630 275 707 67 + -10000 634 81 192 768 652 822 311 961 895 + -10000 983 597 743 314 696 585 367 396 826 + -10000 511 545 539 97 111 996 477 35 372 + -10000 474 103 152 753 159 120 929 161 563 + -10000 549 793 307 456 444 184 149 792 894 + -10000 839 488 917 192 168 788 959 245 25 + -10000 750 165 338 182 392 381 962 117 713 + -10000 738 827 943 507 914 814 951 663 815 + -10000 493 339 225 351 450 788 992 167 792 + -10000 174 773 247 247 180 517 445 599 596 + -10000 303 26 967 39 535 4 7 335 217 + -10000 772 173 189 291 668 191 610 677 544 + -10000 848 642 40 125 865 100 259 534 648 + -10000 501 622 398 624 118 416 30 17 236 + -10000 218 602 697 892 322 314 361 573 985 + -10000 958 856 608 492 563 478 311 614 740 + -10000 582 913 938 949 715 338 39 726 998 + -10000 521 805 708 221 624 316 24 127 322 + -10000 491 189 412 774 418 200 193 633 315 + -10000 144 679 383 447 989 939 441 631 482 + -10000 940 241 153 215 149 457 254 207 125 + -10000 80 873 207 904 684 600 940 431 825 + -10000 75 100 353 637 432 377 940 758 164 + -10000 627 721 915 710 8 786 96 17 576 + -10000 247 104 607 432 540 164 597 282 317 + -10000 553 787 881 942 152 318 44 509 518 + -10000 181 772 942 993 916 900 713 694 812 + -10000 625 26 638 261 385 196 676 717 572 + -10000 11 911 296 761 658 631 757 817 400 + -10000 964 989 879 491 490 751 490 97 405 + -10000 28 461 343 452 480 504 411 242 892 + -10000 768 746 347 352 724 487 185 767 287 + -10000 924 228 958 554 352 460 765 742 430 + -10000 737 986 499 993 721 29 821 416 813 + -10000 483 458 249 781 584 321 779 209 570 + -10000 222 166 975 53 765 256 859 469 164 + -10000 82 696 181 166 375 145 415 496 261 + -10000 540 309 526 918 439 489 846 417 775 + -10000 699 145 327 873 467 866 711 393 603 + -10000 445 668 729 224 654 970 279 789 680 + -10000 28 659 365 306 186 520 427 176 191 + -10000 919 58 859 436 105 35 560 716 14 + -10000 641 238 340 524 205 255 272 14 472 + -10000 817 22 904 782 573 847 649 100 280 + -10000 925 277 930 495 736 960 276 726 657 + -10000 336 54 357 979 941 765 593 630 286 + -10000 65 113 104 915 222 158 580 520 188 + -10000 42 617 904 414 588 857 416 94 988 + -10000 716 49 849 67 607 99 934 184 217 + -10000 458 32 500 552 108 980 255 998 935 + -10000 860 936 115 268 231 281 948 209 766 + -10000 293 330 940 570 857 421 574 481 364 + -10000 959 949 372 757 306 757 752 312 137 + -10000 769 303 737 260 187 695 946 723 433 + -10000 980 564 605 363 776 893 558 616 603 + -10000 945 23 632 820 54 677 795 616 625 + -10000 629 692 585 33 674 703 304 489 949 + -10000 52 903 723 746 692 232 917 933 211 + -10000 367 566 364 318 607 818 424 234 605 + -10000 915 305 354 829 469 447 925 188 799 + -10000 387 596 946 888 751 614 539 295 299 + -10000 969 902 10 739 289 923 808 28 151 + -10000 537 152 546 442 182 301 258 265 762 + -10000 671 288 343 199 694 391 457 947 250 + -10000 415 734 423 435 696 111 53 227 784 + -10000 800 992 720 76 40 419 608 182 683 + -10000 619 627 278 526 453 960 772 992 86 + -10000 836 623 0 21 371 4 676 964 658 + -10000 258 677 64 968 62 219 587 308 299 + -10000 224 823 258 449 575 526 908 585 405 + -10000 593 660 663 341 36 79 50 242 293 + -10000 80 761 270 460 82 133 874 559 41 + -10000 169 539 257 827 222 743 873 929 523 + -10000 403 167 259 377 76 160 749 448 902 + -10000 290 5 276 509 342 909 193 443 552 + -10000 928 326 757 405 598 765 143 833 150 +end diff --git a/demos/ppl_lcdd/examples/samplev1.ext b/demos/ppl_lcdd/examples/samplev1.ext new file mode 100644 index 0000000..b68bf9f --- /dev/null +++ b/demos/ppl_lcdd/examples/samplev1.ext @@ -0,0 +1,8 @@ +* a 1-D cone in 3D space +V-representation +begin + 2 4 integer + 1 1 0 1 + 0 0 1 0 +end + diff --git a/demos/ppl_lcdd/examples/samplev2.ext b/demos/ppl_lcdd/examples/samplev2.ext new file mode 100644 index 0000000..99ab9f6 --- /dev/null +++ b/demos/ppl_lcdd/examples/samplev2.ext @@ -0,0 +1,11 @@ +* a 1-D cone in 3D space without any vertices +V-representation +linearity 1 3 +begin + 3 4 integer + 0 0 0 1 + 1 1 0 0 + 0 1 -1 0 +end + + diff --git a/demos/ppl_lcdd/examples/samplev3.ext b/demos/ppl_lcdd/examples/samplev3.ext new file mode 100644 index 0000000..bc92ef4 --- /dev/null +++ b/demos/ppl_lcdd/examples/samplev3.ext @@ -0,0 +1,16 @@ +* test file for redundancy removal +* the redundant rows: 2 4 5 6 7 +* the implicit linearities : 8 9 +V-representation +begin + 9 3 integer + 1 0 0 + 1 2 0 + 1 0 2 + 1 1 1 + 1 2 1 + 1 1 2 + 1 2 2 + 0 1 0 + 0 -1 0 +end diff --git a/demos/ppl_lcdd/examples/trunc10.ine b/demos/ppl_lcdd/examples/trunc10.ine new file mode 100644 index 0000000..3f5bd91 --- /dev/null +++ b/demos/ppl_lcdd/examples/trunc10.ine @@ -0,0 +1,119 @@ +* delta=1/10 +* eps0=1/20 +* scut=1/40 +* pcut=1/40 +begin +112 11 integer +3 5 -5 -5 -5 -5 -5 -5 -5 -5 20 +3 -5 -5 -5 -5 -5 -5 -5 -5 -5 20 +3 0 10 0 0 0 0 0 0 0 20 +3 0 20 0 0 0 0 0 0 0 10 +3 5 20 -5 -5 -5 -5 -5 -5 -5 -5 +3 -5 20 -5 -5 -5 -5 -5 -5 -5 -5 +3 0 20 10 0 0 0 0 0 0 0 +3 0 20 0 10 0 0 0 0 0 0 +3 0 20 0 0 10 0 0 0 0 0 +3 0 20 0 0 0 10 0 0 0 0 +3 0 20 0 0 0 0 10 0 0 0 +3 0 20 0 0 0 0 0 10 0 0 +3 0 20 0 0 0 0 0 0 10 0 +3 0 0 10 0 0 0 0 0 0 20 +3 0 0 20 0 0 0 0 0 0 10 +3 5 -5 20 -5 -5 -5 -5 -5 -5 -5 +3 -5 -5 20 -5 -5 -5 -5 -5 -5 -5 +3 0 10 20 0 0 0 0 0 0 0 +3 0 0 20 10 0 0 0 0 0 0 +3 0 0 20 0 10 0 0 0 0 0 +3 0 0 20 0 0 10 0 0 0 0 +3 0 0 20 0 0 0 10 0 0 0 +3 0 0 20 0 0 0 0 10 0 0 +3 0 0 20 0 0 0 0 0 10 0 +3 0 0 0 10 0 0 0 0 0 20 +3 0 0 0 20 0 0 0 0 0 10 +3 5 -5 -5 20 -5 -5 -5 -5 -5 -5 +3 -5 -5 -5 20 -5 -5 -5 -5 -5 -5 +3 0 10 0 20 0 0 0 0 0 0 +3 0 0 10 20 0 0 0 0 0 0 +3 0 0 0 20 10 0 0 0 0 0 +3 0 0 0 20 0 10 0 0 0 0 +3 0 0 0 20 0 0 10 0 0 0 +3 0 0 0 20 0 0 0 10 0 0 +3 0 0 0 20 0 0 0 0 10 0 +3 0 0 0 0 10 0 0 0 0 20 +3 0 0 0 0 20 0 0 0 0 10 +3 5 -5 -5 -5 20 -5 -5 -5 -5 -5 +3 -5 -5 -5 -5 20 -5 -5 -5 -5 -5 +3 0 10 0 0 20 0 0 0 0 0 +3 0 0 10 0 20 0 0 0 0 0 +3 0 0 0 10 20 0 0 0 0 0 +3 0 0 0 0 20 10 0 0 0 0 +3 0 0 0 0 20 0 10 0 0 0 +3 0 0 0 0 20 0 0 10 0 0 +3 0 0 0 0 20 0 0 0 10 0 +3 0 0 0 0 0 10 0 0 0 20 +3 0 0 0 0 0 20 0 0 0 10 +3 5 -5 -5 -5 -5 20 -5 -5 -5 -5 +3 -5 -5 -5 -5 -5 20 -5 -5 -5 -5 +3 0 10 0 0 0 20 0 0 0 0 +3 0 0 10 0 0 20 0 0 0 0 +3 0 0 0 10 0 20 0 0 0 0 +3 0 0 0 0 10 20 0 0 0 0 +3 0 0 0 0 0 20 10 0 0 0 +3 0 0 0 0 0 20 0 10 0 0 +3 0 0 0 0 0 20 0 0 10 0 +3 0 0 0 0 0 0 10 0 0 20 +3 0 0 0 0 0 0 20 0 0 10 +3 5 -5 -5 -5 -5 -5 20 -5 -5 -5 +3 -5 -5 -5 -5 -5 -5 20 -5 -5 -5 +3 0 10 0 0 0 0 20 0 0 0 +3 0 0 10 0 0 0 20 0 0 0 +3 0 0 0 10 0 0 20 0 0 0 +3 0 0 0 0 10 0 20 0 0 0 +3 0 0 0 0 0 10 20 0 0 0 +3 0 0 0 0 0 0 20 10 0 0 +3 0 0 0 0 0 0 20 0 10 0 +3 0 0 0 0 0 0 0 10 0 20 +3 0 0 0 0 0 0 0 20 0 10 +3 5 -5 -5 -5 -5 -5 -5 20 -5 -5 +3 -5 -5 -5 -5 -5 -5 -5 20 -5 -5 +3 0 10 0 0 0 0 0 20 0 0 +3 0 0 10 0 0 0 0 20 0 0 +3 0 0 0 10 0 0 0 20 0 0 +3 0 0 0 0 10 0 0 20 0 0 +3 0 0 0 0 0 10 0 20 0 0 +3 0 0 0 0 0 0 10 20 0 0 +3 0 0 0 0 0 0 0 20 10 0 +3 0 0 0 0 0 0 0 0 10 20 +3 0 0 0 0 0 0 0 0 20 10 +3 5 -5 -5 -5 -5 -5 -5 -5 20 -5 +3 -5 -5 -5 -5 -5 -5 -5 -5 20 -5 +3 0 10 0 0 0 0 0 0 20 0 +3 0 0 10 0 0 0 0 0 20 0 +3 0 0 0 10 0 0 0 0 20 0 +3 0 0 0 0 10 0 0 0 20 0 +3 0 0 0 0 0 10 0 0 20 0 +3 0 0 0 0 0 0 10 0 20 0 +3 0 0 0 0 0 0 0 10 20 0 +1 10 -10 -10 -10 -10 -10 -10 -10 -10 -10 +1 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 +39 40 0 0 0 0 0 0 0 0 0 +39 -40 0 0 0 0 0 0 0 0 0 +1 0 8 0 0 0 0 0 0 0 0 +1 0 0 8 0 0 0 0 0 0 0 +1 0 0 0 8 0 0 0 0 0 0 +1 0 0 0 0 8 0 0 0 0 0 +1 0 0 0 0 0 8 0 0 0 0 +1 0 0 0 0 0 0 8 0 0 0 +1 0 0 0 0 0 0 0 8 0 0 +1 0 0 0 0 0 0 0 0 8 0 +1 0 0 0 0 0 0 0 0 0 8 +7 0 -8 0 0 0 0 0 0 0 0 +7 0 0 -8 0 0 0 0 0 0 0 +7 0 0 0 -8 0 0 0 0 0 0 +7 0 0 0 0 -8 0 0 0 0 0 +7 0 0 0 0 0 -8 0 0 0 0 +7 0 0 0 0 0 0 -8 0 0 0 +7 0 0 0 0 0 0 0 -8 0 0 +7 0 0 0 0 0 0 0 0 -8 0 +7 0 0 0 0 0 0 0 0 0 -8 +end diff --git a/demos/ppl_lcdd/examples/trunc7.ine b/demos/ppl_lcdd/examples/trunc7.ine new file mode 100644 index 0000000..8250bc0 --- /dev/null +++ b/demos/ppl_lcdd/examples/trunc7.ine @@ -0,0 +1,65 @@ +* delta=1/7 +* eps0=1/14 +* scut=1/28 +* pcut=1/28 +begin +58 8 integer +6 7 -7 -7 -7 -7 -7 28 +6 -7 -7 -7 -7 -7 -7 28 +3 0 7 0 0 0 0 14 +3 0 14 0 0 0 0 7 +6 7 28 -7 -7 -7 -7 -7 +6 -7 28 -7 -7 -7 -7 -7 +3 0 14 7 0 0 0 0 +3 0 14 0 7 0 0 0 +3 0 14 0 0 7 0 0 +3 0 14 0 0 0 7 0 +3 0 0 7 0 0 0 14 +3 0 0 14 0 0 0 7 +6 7 -7 28 -7 -7 -7 -7 +6 -7 -7 28 -7 -7 -7 -7 +3 0 7 14 0 0 0 0 +3 0 0 14 7 0 0 0 +3 0 0 14 0 7 0 0 +3 0 0 14 0 0 7 0 +3 0 0 0 7 0 0 14 +3 0 0 0 14 0 0 7 +6 7 -7 -7 28 -7 -7 -7 +6 -7 -7 -7 28 -7 -7 -7 +3 0 7 0 14 0 0 0 +3 0 0 7 14 0 0 0 +3 0 0 0 14 7 0 0 +3 0 0 0 14 0 7 0 +3 0 0 0 0 7 0 14 +3 0 0 0 0 14 0 7 +6 7 -7 -7 -7 28 -7 -7 +6 -7 -7 -7 -7 28 -7 -7 +3 0 7 0 0 14 0 0 +3 0 0 7 0 14 0 0 +3 0 0 0 7 14 0 0 +3 0 0 0 0 14 7 0 +3 0 0 0 0 0 7 14 +3 0 0 0 0 0 14 7 +6 7 -7 -7 -7 -7 28 -7 +6 -7 -7 -7 -7 -7 28 -7 +3 0 7 0 0 0 14 0 +3 0 0 7 0 0 14 0 +3 0 0 0 7 0 14 0 +3 0 0 0 0 7 14 0 +1 7 -7 -7 -7 -7 -7 -7 +1 -7 -7 -7 -7 -7 -7 -7 +27 28 0 0 0 0 0 0 +27 -28 0 0 0 0 0 0 +5 0 28 0 0 0 0 0 +5 0 0 28 0 0 0 0 +5 0 0 0 28 0 0 0 +5 0 0 0 0 28 0 0 +5 0 0 0 0 0 28 0 +5 0 0 0 0 0 0 28 +23 0 -28 0 0 0 0 0 +23 0 0 -28 0 0 0 0 +23 0 0 0 -28 0 0 0 +23 0 0 0 0 -28 0 0 +23 0 0 0 0 0 -28 0 +23 0 0 0 0 0 0 -28 +end diff --git a/demos/ppl_lcdd/examples/tsp5.ext b/demos/ppl_lcdd/examples/tsp5.ext new file mode 100644 index 0000000..b4e6874 --- /dev/null +++ b/demos/ppl_lcdd/examples/tsp5.ext @@ -0,0 +1,16 @@ +V-representation +begin +12 11 rational + 1 0 0 1 1 1 1 0 0 1 0 + 1 1 0 0 1 0 1 0 1 1 0 + 1 0 1 0 1 0 1 1 1 0 0 + 1 0 1 0 1 1 1 0 0 0 1 + 1 0 1 1 0 0 1 1 0 1 0 + 1 0 1 1 0 1 0 1 0 0 1 + 1 1 1 0 0 0 0 1 1 0 1 + 1 1 1 0 0 0 1 0 0 1 1 + 1 1 0 1 0 0 0 1 1 1 0 + 1 1 0 1 0 1 0 0 0 1 1 + 1 0 0 1 1 1 0 1 1 0 0 + 1 1 0 0 1 1 0 0 1 0 1 +end diff --git a/demos/ppl_lcdd/examples/tsp5.ine b/demos/ppl_lcdd/examples/tsp5.ine new file mode 100644 index 0000000..04563a2 --- /dev/null +++ b/demos/ppl_lcdd/examples/tsp5.ine @@ -0,0 +1,30 @@ +H-representation +linearity 5 1 2 3 4 5 +begin +25 11 rational +-2 1 1 1 1 0 0 0 0 0 0 +-2 1 0 0 0 1 1 1 0 0 0 +-3 1 1 1 0 1 1 0 1 0 0 + 1 -1 0 -1 0 0 -1 0 0 1 0 + 1 -1 -1 0 0 -1 0 0 0 0 1 + 1 -1 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 1 0 0 0 0 + 0 0 1 0 0 0 0 0 0 0 0 + 2 -1 -1 0 0 -1 0 0 0 0 0 + 1 0 0 0 0 -1 0 0 0 0 0 + 2 -1 0 0 0 -1 -1 0 0 0 0 +-1 1 0 1 0 0 1 0 0 0 0 + 0 0 0 1 0 0 0 0 0 0 0 +-1 1 1 1 0 0 0 0 0 0 0 +-2 1 1 1 0 1 1 0 0 0 0 + 2 -1 -1 -1 0 0 0 0 0 0 0 + 1 0 0 -1 0 0 0 0 0 0 0 + 2 -1 0 -1 0 0 -1 0 0 0 0 + 3 -1 -1 -1 0 -1 -1 0 0 0 0 +-1 1 0 0 0 1 1 0 0 0 0 + 0 0 0 0 0 1 0 0 0 0 0 +-1 1 1 0 0 1 0 0 0 0 0 + 1 0 -1 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 -1 0 0 0 0 + 0 1 0 0 0 0 0 0 0 0 0 +end diff --git a/demos/ppl_lcdd/expected_int16 b/demos/ppl_lcdd/expected_int16 new file mode 100644 index 0000000..281f13b --- /dev/null +++ b/demos/ppl_lcdd/expected_int16 @@ -0,0 +1,98 @@ +ccc4.ext bc96322497eecd12c4d0582ff2311cb4 - +ccc5.ext 4964babfa462514ddeb8b3b549e92982 - +ccc6.ext c458b6a2a77990c6d8fe562c9d223c2c - +ccp4.ext c57dd7951e50033fa8955810bbe273a3 - +ccp5.ext 226f386e8780b30e239586b8b2964a0d - +ccp6.ext ac5556e9e9fd1100c6b9f97384f609da - +cp4.ext c57dd7951e50033fa8955810bbe273a3 - +cp5.ext 226f386e8780b30e239586b8b2964a0d - +cp6.ext ac5556e9e9fd1100c6b9f97384f609da - +cube.ext 45f31680d2301d58a1d57c0dc09bb1f0 - +cut16_11.ext 56ec06c653436caff88819989a739b74 - +cut32_16.ext 2f524bae3b4ba2edf72f54183cb702a5 - +cyclic10-4.ext 0ddde1f99cd5b3cf899fa6778e67569e - +cyclic12-6.ext d41d8cd98f00b204e9800998ecf8427e - +cyclic14-8.ext d41d8cd98f00b204e9800998ecf8427e - +cyclic16-10.ext d41d8cd98f00b204e9800998ecf8427e - +dcube10.ext aab7857f665af827774614f090f72b51 - +dcube12.ext d2e47db88b9ea21f7fabb03c60421297 - +dcube3.ext f37f7234953ac36f582bfcad6e933397 - +dcube6.ext 09056814a1944456ce283f5839411c38 - +dcube8.ext e2ac7f22e55e7b2009d0625dd4ec724a - +irbox20-4.ext d41d8cd98f00b204e9800998ecf8427e - +irbox200-4.ext d41d8cd98f00b204e9800998ecf8427e - +mp5.ext 064e5fd8ec28e712f2c475cb19cee4e3 - +redcheck.ext 12a70972a9385cf228abe8484f68f1c6 - +reg24-5.ext 8e8fa94ededd63732112f68094fe0559 - +reg600-5_m.ext d41d8cd98f00b204e9800998ecf8427e - +samplev1.ext 0d931a85a14850fc76a3b1d5c373b917 - +samplev2.ext 6718e59a777d0ae297dbe7d6d305961a - +samplev3.ext 425b227f7720ee71af25fadbec2560b9 - +tsp5.ext e9e56d002855db0d1ba399d6cf991799 - +1d.ine 89d8b1916d823aaf7563740c09f71470 - +1da.ine 89d8b1916d823aaf7563740c09f71470 - +allzero.ine 360296f0fb93ab70b1528453d6cf02ca - +cp4.ine a868d7ab4d206871d4af3311059caa32 - +cp5.ine a329d8a17d135c38d9bbc5709a523f9a - +cross10.ine 38178216a0010320f29334df7a2f9eac - +cross12.ine 1c24d854ca16cbb6281648219c37cf0a - +cross4.ine a9bab74fd8c29016443a117b88827ca6 - +cross6.ine 3b41f0b924526fec2616f6299fe14c6f - +cross8.ine 32274fa3bd0758c81380bb305ec09d8f - +cube.ine e2498d1cd888aa8cf2762bb5a8613592 - +cube10.ine 9511f2116a3863917e7c75067ca2c2e5 - +cube12.ine a71ae423c627c68442fc2dff2b2b9e0a - +cube3.ine 4872fb1845557d484af5c09e47890ccc - +cube6.ine 59218da4f6db0b742bd18271c9d5f6da - +cube8.ine 857e4c7484b1dc5919a1629e46b856e8 - +cubetop.ine f963c1b731386d994e03975ac98b5c25 - +cubocta.ine 526a2d84e3661ead8dc6cd05c090a776 - +cyc.ine 1f3ffeef795b27e5bfc2c3de20be70f4 - +cyclic17_8.ine d41d8cd98f00b204e9800998ecf8427e - +diamond.ine a8b60aa3d60bafed0d49a05a7a260a9c - +dodeca_m.ine d41d8cd98f00b204e9800998ecf8427e - +ex1.ine 846681e0741bb57be1673b8c9170cd49 - +grcubocta.ine 49ed87ceef0f9dd80caaa7e9798886ab - +hexocta.ine 9e79ebd2ae4be939363e8a8fc9391908 - +icododeca_m.ine d41d8cd98f00b204e9800998ecf8427e - +in0.ine aee5c7fb5cdf7881c33ac3e379986b79 - +in1.ine d41d8cd98f00b204e9800998ecf8427e - +in2.ine 30fc1812a724bad238f8af157ef58729 - +in3.ine 662e46c09123c5aa87ae82a792dc3df6 - +in4.ine d41d8cd98f00b204e9800998ecf8427e - +in5.ine d41d8cd98f00b204e9800998ecf8427e - +in6.ine d41d8cd98f00b204e9800998ecf8427e - +in7.ine d41d8cd98f00b204e9800998ecf8427e - +infeas.ine 8dba32fa5e973205c7cd850bbcf5bb14 - +integralpoints.ine e8057c28540aa563ef831399d8a15654 - +kkd18_4.ine d41d8cd98f00b204e9800998ecf8427e - +kkd27_5.ine d41d8cd98f00b204e9800998ecf8427e - +kkd38_6.ine d41d8cd98f00b204e9800998ecf8427e - +kq20_11_m.ine d41d8cd98f00b204e9800998ecf8427e - +metric40_11.ine 8730ceaec3e4fe9f4155779510300011 - +metric80_16.ine 60bc723581cb4ef986f654967511b104 - +mit31-20.ine 03aef81d50c861b73302866415184106 - +mp5.ine 8730ceaec3e4fe9f4155779510300011 - +mp5a.ine 8730ceaec3e4fe9f4155779510300011 - +mp6.ine a1d322a1bf98569f129efe4774099f0a - +nonfull.ine 960129e6c4b3856ca3ebc5ed2dbb0c0e - +origin.ine 58ac995e1d9ce9dcc73d546675db0c91 - +project1_m.ine 5330d7ef41d67f29d6102ae6d961112f - +project1res.ine e2e2c0f79a34d73dfa68f44e5f3a0b76 - +project2_m.ine 629a0c15eed90e3f84307bad56301493 - +project2res.ine aaf40e2fe14795fb63f647773c0e13fe - +rcubocta.ine b75aae81c225ab7a2bcaa6217384346f - +reg24-5.ine cba2ab338cfdfd3d2374d66ce10dbca8 - +rhomtria_m.ine d41d8cd98f00b204e9800998ecf8427e - +sample.ine 1b6dfffb7025fbca392de0a359db1f01 - +sampleh1.ine 4fd28c2bca346a3fc8ab41a49ab9eede - +sampleh2.ine 4f65ae11c6bc71f613ecc33989fe760c - +sampleh3.ine 55a3fbd3f1c495a0ec66651b901f9231 - +sampleh4.ine 360296f0fb93ab70b1528453d6cf02ca - +sampleh5.ine a93fd99d5bbfc33715db65b01fc452dc - +sampleh6.ine a62303e71a549a4ae051e0a66d98bb61 - +sampleh7.ine d41d8cd98f00b204e9800998ecf8427e - +sampleh8.ine d41d8cd98f00b204e9800998ecf8427e - +trunc10.ine d41d8cd98f00b204e9800998ecf8427e - +trunc7.ine 989656d77040b040f10b241041f7c404 - +tsp5.ine 214457d06fa51e69e2edd126f66e07fc - diff --git a/demos/ppl_lcdd/expected_int16_a b/demos/ppl_lcdd/expected_int16_a new file mode 100644 index 0000000..8dbcb68 --- /dev/null +++ b/demos/ppl_lcdd/expected_int16_a @@ -0,0 +1,85 @@ +ccc4.ext bc96322497eecd12c4d0582ff2311cb4 - +ccc5.ext 4964babfa462514ddeb8b3b549e92982 - +ccp4.ext c57dd7951e50033fa8955810bbe273a3 - +ccp5.ext 226f386e8780b30e239586b8b2964a0d - +cp4.ext c57dd7951e50033fa8955810bbe273a3 - +cp5.ext 226f386e8780b30e239586b8b2964a0d - +cube.ext 45f31680d2301d58a1d57c0dc09bb1f0 - +cut16_11.ext 56ec06c653436caff88819989a739b74 - +cyclic10-4.ext d41d8cd98f00b204e9800998ecf8427e - +cyclic12-6.ext d41d8cd98f00b204e9800998ecf8427e - +cyclic14-8.ext d41d8cd98f00b204e9800998ecf8427e - +dcube10.ext aab7857f665af827774614f090f72b51 - +dcube12.ext d2e47db88b9ea21f7fabb03c60421297 - +dcube3.ext f37f7234953ac36f582bfcad6e933397 - +dcube6.ext 09056814a1944456ce283f5839411c38 - +dcube8.ext e2ac7f22e55e7b2009d0625dd4ec724a - +irbox20-4.ext d41d8cd98f00b204e9800998ecf8427e - +irbox200-4.ext d41d8cd98f00b204e9800998ecf8427e - +mp5.ext 064e5fd8ec28e712f2c475cb19cee4e3 - +redcheck.ext 12a70972a9385cf228abe8484f68f1c6 - +reg24-5.ext 8e8fa94ededd63732112f68094fe0559 - +samplev1.ext 0d931a85a14850fc76a3b1d5c373b917 - +samplev2.ext 6718e59a777d0ae297dbe7d6d305961a - +samplev3.ext 425b227f7720ee71af25fadbec2560b9 - +tsp5.ext e9e56d002855db0d1ba399d6cf991799 - +1d.ine 89d8b1916d823aaf7563740c09f71470 - +1da.ine 89d8b1916d823aaf7563740c09f71470 - +allzero.ine 360296f0fb93ab70b1528453d6cf02ca - +cp4.ine a868d7ab4d206871d4af3311059caa32 - +cp5.ine a329d8a17d135c38d9bbc5709a523f9a - +cross10.ine 38178216a0010320f29334df7a2f9eac - +cross12.ine 1c24d854ca16cbb6281648219c37cf0a - +cross4.ine a9bab74fd8c29016443a117b88827ca6 - +cross6.ine 3b41f0b924526fec2616f6299fe14c6f - +cross8.ine 32274fa3bd0758c81380bb305ec09d8f - +cube.ine e2498d1cd888aa8cf2762bb5a8613592 - +cube10.ine 9511f2116a3863917e7c75067ca2c2e5 - +cube12.ine a71ae423c627c68442fc2dff2b2b9e0a - +cube3.ine 4872fb1845557d484af5c09e47890ccc - +cube6.ine 59218da4f6db0b742bd18271c9d5f6da - +cube8.ine 857e4c7484b1dc5919a1629e46b856e8 - +cubetop.ine f963c1b731386d994e03975ac98b5c25 - +cubocta.ine 526a2d84e3661ead8dc6cd05c090a776 - +cyc.ine 1f3ffeef795b27e5bfc2c3de20be70f4 - +diamond.ine a8b60aa3d60bafed0d49a05a7a260a9c - +dodeca_m.ine d41d8cd98f00b204e9800998ecf8427e - +ex1.ine 846681e0741bb57be1673b8c9170cd49 - +grcubocta.ine 49ed87ceef0f9dd80caaa7e9798886ab - +hexocta.ine 9e79ebd2ae4be939363e8a8fc9391908 - +icododeca_m.ine d41d8cd98f00b204e9800998ecf8427e - +in0.ine aee5c7fb5cdf7881c33ac3e379986b79 - +in1.ine d41d8cd98f00b204e9800998ecf8427e - +in2.ine 30fc1812a724bad238f8af157ef58729 - +in3.ine 662e46c09123c5aa87ae82a792dc3df6 - +in4.ine d41d8cd98f00b204e9800998ecf8427e - +in5.ine d41d8cd98f00b204e9800998ecf8427e - +infeas.ine 8dba32fa5e973205c7cd850bbcf5bb14 - +integralpoints.ine d41d8cd98f00b204e9800998ecf8427e - +kkd18_4.ine d41d8cd98f00b204e9800998ecf8427e - +kkd27_5.ine d41d8cd98f00b204e9800998ecf8427e - +kkd38_6.ine d41d8cd98f00b204e9800998ecf8427e - +metric40_11.ine 8730ceaec3e4fe9f4155779510300011 - +metric80_16.ine 60bc723581cb4ef986f654967511b104 - +mp5.ine 8730ceaec3e4fe9f4155779510300011 - +mp5a.ine 8730ceaec3e4fe9f4155779510300011 - +mp6.ine a1d322a1bf98569f129efe4774099f0a - +nonfull.ine 960129e6c4b3856ca3ebc5ed2dbb0c0e - +origin.ine 58ac995e1d9ce9dcc73d546675db0c91 - +project1_m.ine 5330d7ef41d67f29d6102ae6d961112f - +project1res.ine e2e2c0f79a34d73dfa68f44e5f3a0b76 - +project2_m.ine 629a0c15eed90e3f84307bad56301493 - +project2res.ine aaf40e2fe14795fb63f647773c0e13fe - +rcubocta.ine b75aae81c225ab7a2bcaa6217384346f - +reg24-5.ine cba2ab338cfdfd3d2374d66ce10dbca8 - +rhomtria_m.ine d41d8cd98f00b204e9800998ecf8427e - +sample.ine 1b6dfffb7025fbca392de0a359db1f01 - +sampleh1.ine 4fd28c2bca346a3fc8ab41a49ab9eede - +sampleh2.ine 4f65ae11c6bc71f613ecc33989fe760c - +sampleh3.ine 55a3fbd3f1c495a0ec66651b901f9231 - +sampleh4.ine 360296f0fb93ab70b1528453d6cf02ca - +sampleh5.ine a93fd99d5bbfc33715db65b01fc452dc - +sampleh6.ine a62303e71a549a4ae051e0a66d98bb61 - +sampleh7.ine d41d8cd98f00b204e9800998ecf8427e - +trunc7.ine d41d8cd98f00b204e9800998ecf8427e - +tsp5.ine 214457d06fa51e69e2edd126f66e07fc - diff --git a/demos/ppl_lcdd/expected_int32 b/demos/ppl_lcdd/expected_int32 new file mode 100644 index 0000000..2e253f8 --- /dev/null +++ b/demos/ppl_lcdd/expected_int32 @@ -0,0 +1,98 @@ +ccc4.ext bc96322497eecd12c4d0582ff2311cb4 - +ccc5.ext 4964babfa462514ddeb8b3b549e92982 - +ccc6.ext c458b6a2a77990c6d8fe562c9d223c2c - +ccp4.ext c57dd7951e50033fa8955810bbe273a3 - +ccp5.ext 226f386e8780b30e239586b8b2964a0d - +ccp6.ext ac5556e9e9fd1100c6b9f97384f609da - +cp4.ext c57dd7951e50033fa8955810bbe273a3 - +cp5.ext 226f386e8780b30e239586b8b2964a0d - +cp6.ext ac5556e9e9fd1100c6b9f97384f609da - +cube.ext 45f31680d2301d58a1d57c0dc09bb1f0 - +cut16_11.ext 56ec06c653436caff88819989a739b74 - +cut32_16.ext 2f524bae3b4ba2edf72f54183cb702a5 - +cyclic10-4.ext 0ddde1f99cd5b3cf899fa6778e67569e - +cyclic12-6.ext d72a192a8057e34b9cd3a9ad112b6cd2 - +cyclic14-8.ext d41d8cd98f00b204e9800998ecf8427e - +cyclic16-10.ext d41d8cd98f00b204e9800998ecf8427e - +dcube10.ext aab7857f665af827774614f090f72b51 - +dcube12.ext d2e47db88b9ea21f7fabb03c60421297 - +dcube3.ext f37f7234953ac36f582bfcad6e933397 - +dcube6.ext 09056814a1944456ce283f5839411c38 - +dcube8.ext e2ac7f22e55e7b2009d0625dd4ec724a - +irbox20-4.ext d41d8cd98f00b204e9800998ecf8427e - +irbox200-4.ext d41d8cd98f00b204e9800998ecf8427e - +mp5.ext 064e5fd8ec28e712f2c475cb19cee4e3 - +redcheck.ext 12a70972a9385cf228abe8484f68f1c6 - +reg24-5.ext 8e8fa94ededd63732112f68094fe0559 - +reg600-5_m.ext d41d8cd98f00b204e9800998ecf8427e - +samplev1.ext 0d931a85a14850fc76a3b1d5c373b917 - +samplev2.ext 6718e59a777d0ae297dbe7d6d305961a - +samplev3.ext 425b227f7720ee71af25fadbec2560b9 - +tsp5.ext e9e56d002855db0d1ba399d6cf991799 - +1d.ine 89d8b1916d823aaf7563740c09f71470 - +1da.ine 89d8b1916d823aaf7563740c09f71470 - +allzero.ine 360296f0fb93ab70b1528453d6cf02ca - +cp4.ine a868d7ab4d206871d4af3311059caa32 - +cp5.ine a329d8a17d135c38d9bbc5709a523f9a - +cross10.ine 38178216a0010320f29334df7a2f9eac - +cross12.ine 1c24d854ca16cbb6281648219c37cf0a - +cross4.ine a9bab74fd8c29016443a117b88827ca6 - +cross6.ine 3b41f0b924526fec2616f6299fe14c6f - +cross8.ine 32274fa3bd0758c81380bb305ec09d8f - +cube.ine e2498d1cd888aa8cf2762bb5a8613592 - +cube10.ine 9511f2116a3863917e7c75067ca2c2e5 - +cube12.ine a71ae423c627c68442fc2dff2b2b9e0a - +cube3.ine 4872fb1845557d484af5c09e47890ccc - +cube6.ine 59218da4f6db0b742bd18271c9d5f6da - +cube8.ine 857e4c7484b1dc5919a1629e46b856e8 - +cubetop.ine f963c1b731386d994e03975ac98b5c25 - +cubocta.ine 526a2d84e3661ead8dc6cd05c090a776 - +cyc.ine 1f3ffeef795b27e5bfc2c3de20be70f4 - +cyclic17_8.ine d41d8cd98f00b204e9800998ecf8427e - +diamond.ine a8b60aa3d60bafed0d49a05a7a260a9c - +dodeca_m.ine d41d8cd98f00b204e9800998ecf8427e - +ex1.ine 846681e0741bb57be1673b8c9170cd49 - +grcubocta.ine 49ed87ceef0f9dd80caaa7e9798886ab - +hexocta.ine 9e79ebd2ae4be939363e8a8fc9391908 - +icododeca_m.ine d41d8cd98f00b204e9800998ecf8427e - +in0.ine aee5c7fb5cdf7881c33ac3e379986b79 - +in1.ine d41d8cd98f00b204e9800998ecf8427e - +in2.ine 30fc1812a724bad238f8af157ef58729 - +in3.ine 662e46c09123c5aa87ae82a792dc3df6 - +in4.ine 9e3e0e301762546a26557c8bee786732 - +in5.ine c29524500ec4656ca26c5671df46db96 - +in6.ine 1d81f92f878af596166bc64c20392e5b - +in7.ine d41d8cd98f00b204e9800998ecf8427e - +infeas.ine 8dba32fa5e973205c7cd850bbcf5bb14 - +integralpoints.ine e8057c28540aa563ef831399d8a15654 - +kkd18_4.ine d41d8cd98f00b204e9800998ecf8427e - +kkd27_5.ine d41d8cd98f00b204e9800998ecf8427e - +kkd38_6.ine d41d8cd98f00b204e9800998ecf8427e - +kq20_11_m.ine d41d8cd98f00b204e9800998ecf8427e - +metric40_11.ine 8730ceaec3e4fe9f4155779510300011 - +metric80_16.ine 60bc723581cb4ef986f654967511b104 - +mit31-20.ine 03aef81d50c861b73302866415184106 - +mp5.ine 8730ceaec3e4fe9f4155779510300011 - +mp5a.ine 8730ceaec3e4fe9f4155779510300011 - +mp6.ine a1d322a1bf98569f129efe4774099f0a - +nonfull.ine 960129e6c4b3856ca3ebc5ed2dbb0c0e - +origin.ine 58ac995e1d9ce9dcc73d546675db0c91 - +project1_m.ine 5330d7ef41d67f29d6102ae6d961112f - +project1res.ine e2e2c0f79a34d73dfa68f44e5f3a0b76 - +project2_m.ine 629a0c15eed90e3f84307bad56301493 - +project2res.ine aaf40e2fe14795fb63f647773c0e13fe - +rcubocta.ine b75aae81c225ab7a2bcaa6217384346f - +reg24-5.ine cba2ab338cfdfd3d2374d66ce10dbca8 - +rhomtria_m.ine d41d8cd98f00b204e9800998ecf8427e - +sample.ine 1b6dfffb7025fbca392de0a359db1f01 - +sampleh1.ine 4fd28c2bca346a3fc8ab41a49ab9eede - +sampleh2.ine 4f65ae11c6bc71f613ecc33989fe760c - +sampleh3.ine 55a3fbd3f1c495a0ec66651b901f9231 - +sampleh4.ine 360296f0fb93ab70b1528453d6cf02ca - +sampleh5.ine a93fd99d5bbfc33715db65b01fc452dc - +sampleh6.ine a62303e71a549a4ae051e0a66d98bb61 - +sampleh7.ine d41d8cd98f00b204e9800998ecf8427e - +sampleh8.ine d41d8cd98f00b204e9800998ecf8427e - +trunc10.ine edecfb72df1fe7f8c4849cdb3c47bfce - +trunc7.ine 989656d77040b040f10b241041f7c404 - +tsp5.ine 214457d06fa51e69e2edd126f66e07fc - diff --git a/demos/ppl_lcdd/expected_int32_a b/demos/ppl_lcdd/expected_int32_a new file mode 100644 index 0000000..afac8d7 --- /dev/null +++ b/demos/ppl_lcdd/expected_int32_a @@ -0,0 +1,85 @@ +ccc4.ext bc96322497eecd12c4d0582ff2311cb4 - +ccc5.ext 4964babfa462514ddeb8b3b549e92982 - +ccp4.ext c57dd7951e50033fa8955810bbe273a3 - +ccp5.ext 226f386e8780b30e239586b8b2964a0d - +cp4.ext c57dd7951e50033fa8955810bbe273a3 - +cp5.ext 226f386e8780b30e239586b8b2964a0d - +cube.ext 45f31680d2301d58a1d57c0dc09bb1f0 - +cut16_11.ext 56ec06c653436caff88819989a739b74 - +cyclic10-4.ext 0ddde1f99cd5b3cf899fa6778e67569e - +cyclic12-6.ext d41d8cd98f00b204e9800998ecf8427e - +cyclic14-8.ext d41d8cd98f00b204e9800998ecf8427e - +dcube10.ext aab7857f665af827774614f090f72b51 - +dcube12.ext d2e47db88b9ea21f7fabb03c60421297 - +dcube3.ext f37f7234953ac36f582bfcad6e933397 - +dcube6.ext 09056814a1944456ce283f5839411c38 - +dcube8.ext e2ac7f22e55e7b2009d0625dd4ec724a - +irbox20-4.ext d41d8cd98f00b204e9800998ecf8427e - +irbox200-4.ext d41d8cd98f00b204e9800998ecf8427e - +mp5.ext 064e5fd8ec28e712f2c475cb19cee4e3 - +redcheck.ext 12a70972a9385cf228abe8484f68f1c6 - +reg24-5.ext 8e8fa94ededd63732112f68094fe0559 - +samplev1.ext 0d931a85a14850fc76a3b1d5c373b917 - +samplev2.ext 6718e59a777d0ae297dbe7d6d305961a - +samplev3.ext 425b227f7720ee71af25fadbec2560b9 - +tsp5.ext e9e56d002855db0d1ba399d6cf991799 - +1d.ine 89d8b1916d823aaf7563740c09f71470 - +1da.ine 89d8b1916d823aaf7563740c09f71470 - +allzero.ine 360296f0fb93ab70b1528453d6cf02ca - +cp4.ine a868d7ab4d206871d4af3311059caa32 - +cp5.ine a329d8a17d135c38d9bbc5709a523f9a - +cross10.ine 38178216a0010320f29334df7a2f9eac - +cross12.ine 1c24d854ca16cbb6281648219c37cf0a - +cross4.ine a9bab74fd8c29016443a117b88827ca6 - +cross6.ine 3b41f0b924526fec2616f6299fe14c6f - +cross8.ine 32274fa3bd0758c81380bb305ec09d8f - +cube.ine e2498d1cd888aa8cf2762bb5a8613592 - +cube10.ine 9511f2116a3863917e7c75067ca2c2e5 - +cube12.ine a71ae423c627c68442fc2dff2b2b9e0a - +cube3.ine 4872fb1845557d484af5c09e47890ccc - +cube6.ine 59218da4f6db0b742bd18271c9d5f6da - +cube8.ine 857e4c7484b1dc5919a1629e46b856e8 - +cubetop.ine f963c1b731386d994e03975ac98b5c25 - +cubocta.ine 526a2d84e3661ead8dc6cd05c090a776 - +cyc.ine 1f3ffeef795b27e5bfc2c3de20be70f4 - +diamond.ine a8b60aa3d60bafed0d49a05a7a260a9c - +dodeca_m.ine d41d8cd98f00b204e9800998ecf8427e - +ex1.ine 846681e0741bb57be1673b8c9170cd49 - +grcubocta.ine 49ed87ceef0f9dd80caaa7e9798886ab - +hexocta.ine 9e79ebd2ae4be939363e8a8fc9391908 - +icododeca_m.ine d41d8cd98f00b204e9800998ecf8427e - +in0.ine aee5c7fb5cdf7881c33ac3e379986b79 - +in1.ine d41d8cd98f00b204e9800998ecf8427e - +in2.ine 30fc1812a724bad238f8af157ef58729 - +in3.ine 662e46c09123c5aa87ae82a792dc3df6 - +in4.ine d41d8cd98f00b204e9800998ecf8427e - +in5.ine d41d8cd98f00b204e9800998ecf8427e - +infeas.ine 8dba32fa5e973205c7cd850bbcf5bb14 - +integralpoints.ine d41d8cd98f00b204e9800998ecf8427e - +kkd18_4.ine d41d8cd98f00b204e9800998ecf8427e - +kkd27_5.ine d41d8cd98f00b204e9800998ecf8427e - +kkd38_6.ine d41d8cd98f00b204e9800998ecf8427e - +metric40_11.ine 8730ceaec3e4fe9f4155779510300011 - +metric80_16.ine 60bc723581cb4ef986f654967511b104 - +mp5.ine 8730ceaec3e4fe9f4155779510300011 - +mp5a.ine 8730ceaec3e4fe9f4155779510300011 - +mp6.ine a1d322a1bf98569f129efe4774099f0a - +nonfull.ine 960129e6c4b3856ca3ebc5ed2dbb0c0e - +origin.ine 58ac995e1d9ce9dcc73d546675db0c91 - +project1_m.ine 5330d7ef41d67f29d6102ae6d961112f - +project1res.ine e2e2c0f79a34d73dfa68f44e5f3a0b76 - +project2_m.ine 629a0c15eed90e3f84307bad56301493 - +project2res.ine aaf40e2fe14795fb63f647773c0e13fe - +rcubocta.ine b75aae81c225ab7a2bcaa6217384346f - +reg24-5.ine cba2ab338cfdfd3d2374d66ce10dbca8 - +rhomtria_m.ine d41d8cd98f00b204e9800998ecf8427e - +sample.ine 1b6dfffb7025fbca392de0a359db1f01 - +sampleh1.ine 4fd28c2bca346a3fc8ab41a49ab9eede - +sampleh2.ine 4f65ae11c6bc71f613ecc33989fe760c - +sampleh3.ine 55a3fbd3f1c495a0ec66651b901f9231 - +sampleh4.ine 360296f0fb93ab70b1528453d6cf02ca - +sampleh5.ine a93fd99d5bbfc33715db65b01fc452dc - +sampleh6.ine a62303e71a549a4ae051e0a66d98bb61 - +sampleh7.ine d41d8cd98f00b204e9800998ecf8427e - +trunc7.ine d41d8cd98f00b204e9800998ecf8427e - +tsp5.ine 214457d06fa51e69e2edd126f66e07fc - diff --git a/demos/ppl_lcdd/expected_int64 b/demos/ppl_lcdd/expected_int64 new file mode 100644 index 0000000..bae6f3d --- /dev/null +++ b/demos/ppl_lcdd/expected_int64 @@ -0,0 +1,98 @@ +ccc4.ext bc96322497eecd12c4d0582ff2311cb4 - +ccc5.ext 4964babfa462514ddeb8b3b549e92982 - +ccc6.ext c458b6a2a77990c6d8fe562c9d223c2c - +ccp4.ext c57dd7951e50033fa8955810bbe273a3 - +ccp5.ext 226f386e8780b30e239586b8b2964a0d - +ccp6.ext ac5556e9e9fd1100c6b9f97384f609da - +cp4.ext c57dd7951e50033fa8955810bbe273a3 - +cp5.ext 226f386e8780b30e239586b8b2964a0d - +cp6.ext ac5556e9e9fd1100c6b9f97384f609da - +cube.ext 45f31680d2301d58a1d57c0dc09bb1f0 - +cut16_11.ext 56ec06c653436caff88819989a739b74 - +cut32_16.ext 2f524bae3b4ba2edf72f54183cb702a5 - +cyclic10-4.ext 0ddde1f99cd5b3cf899fa6778e67569e - +cyclic12-6.ext d72a192a8057e34b9cd3a9ad112b6cd2 - +cyclic14-8.ext a4a97e43ad11ff98450b2a94618e373d - +cyclic16-10.ext d41d8cd98f00b204e9800998ecf8427e - +dcube10.ext aab7857f665af827774614f090f72b51 - +dcube12.ext d2e47db88b9ea21f7fabb03c60421297 - +dcube3.ext f37f7234953ac36f582bfcad6e933397 - +dcube6.ext 09056814a1944456ce283f5839411c38 - +dcube8.ext e2ac7f22e55e7b2009d0625dd4ec724a - +irbox20-4.ext 1324d63c4fe3e0902178254e768e9504 - +irbox200-4.ext eb69ce06ed90547eeb9ff98a62ce3b7e - +mp5.ext 064e5fd8ec28e712f2c475cb19cee4e3 - +redcheck.ext 12a70972a9385cf228abe8484f68f1c6 - +reg24-5.ext 8e8fa94ededd63732112f68094fe0559 - +reg600-5_m.ext d41d8cd98f00b204e9800998ecf8427e - +samplev1.ext 0d931a85a14850fc76a3b1d5c373b917 - +samplev2.ext 6718e59a777d0ae297dbe7d6d305961a - +samplev3.ext 425b227f7720ee71af25fadbec2560b9 - +tsp5.ext e9e56d002855db0d1ba399d6cf991799 - +1d.ine 89d8b1916d823aaf7563740c09f71470 - +1da.ine 89d8b1916d823aaf7563740c09f71470 - +allzero.ine 360296f0fb93ab70b1528453d6cf02ca - +cp4.ine a868d7ab4d206871d4af3311059caa32 - +cp5.ine a329d8a17d135c38d9bbc5709a523f9a - +cross10.ine 38178216a0010320f29334df7a2f9eac - +cross12.ine 1c24d854ca16cbb6281648219c37cf0a - +cross4.ine a9bab74fd8c29016443a117b88827ca6 - +cross6.ine 3b41f0b924526fec2616f6299fe14c6f - +cross8.ine 32274fa3bd0758c81380bb305ec09d8f - +cube.ine e2498d1cd888aa8cf2762bb5a8613592 - +cube10.ine 9511f2116a3863917e7c75067ca2c2e5 - +cube12.ine a71ae423c627c68442fc2dff2b2b9e0a - +cube3.ine 4872fb1845557d484af5c09e47890ccc - +cube6.ine 59218da4f6db0b742bd18271c9d5f6da - +cube8.ine 857e4c7484b1dc5919a1629e46b856e8 - +cubetop.ine f963c1b731386d994e03975ac98b5c25 - +cubocta.ine 526a2d84e3661ead8dc6cd05c090a776 - +cyc.ine 1f3ffeef795b27e5bfc2c3de20be70f4 - +cyclic17_8.ine d41d8cd98f00b204e9800998ecf8427e - +diamond.ine a8b60aa3d60bafed0d49a05a7a260a9c - +dodeca_m.ine d41d8cd98f00b204e9800998ecf8427e - +ex1.ine 846681e0741bb57be1673b8c9170cd49 - +grcubocta.ine 49ed87ceef0f9dd80caaa7e9798886ab - +hexocta.ine 9e79ebd2ae4be939363e8a8fc9391908 - +icododeca_m.ine d41d8cd98f00b204e9800998ecf8427e - +in0.ine aee5c7fb5cdf7881c33ac3e379986b79 - +in1.ine d41d8cd98f00b204e9800998ecf8427e - +in2.ine 30fc1812a724bad238f8af157ef58729 - +in3.ine 662e46c09123c5aa87ae82a792dc3df6 - +in4.ine 9e3e0e301762546a26557c8bee786732 - +in5.ine c29524500ec4656ca26c5671df46db96 - +in6.ine 1d81f92f878af596166bc64c20392e5b - +in7.ine d41d8cd98f00b204e9800998ecf8427e - +infeas.ine 8dba32fa5e973205c7cd850bbcf5bb14 - +integralpoints.ine e8057c28540aa563ef831399d8a15654 - +kkd18_4.ine d41d8cd98f00b204e9800998ecf8427e - +kkd27_5.ine d41d8cd98f00b204e9800998ecf8427e - +kkd38_6.ine d41d8cd98f00b204e9800998ecf8427e - +kq20_11_m.ine d41d8cd98f00b204e9800998ecf8427e - +metric40_11.ine 8730ceaec3e4fe9f4155779510300011 - +metric80_16.ine 60bc723581cb4ef986f654967511b104 - +mit31-20.ine 03aef81d50c861b73302866415184106 - +mp5.ine 8730ceaec3e4fe9f4155779510300011 - +mp5a.ine 8730ceaec3e4fe9f4155779510300011 - +mp6.ine a1d322a1bf98569f129efe4774099f0a - +nonfull.ine 960129e6c4b3856ca3ebc5ed2dbb0c0e - +origin.ine 58ac995e1d9ce9dcc73d546675db0c91 - +project1_m.ine 5330d7ef41d67f29d6102ae6d961112f - +project1res.ine e2e2c0f79a34d73dfa68f44e5f3a0b76 - +project2_m.ine 629a0c15eed90e3f84307bad56301493 - +project2res.ine aaf40e2fe14795fb63f647773c0e13fe - +rcubocta.ine b75aae81c225ab7a2bcaa6217384346f - +reg24-5.ine cba2ab338cfdfd3d2374d66ce10dbca8 - +rhomtria_m.ine d41d8cd98f00b204e9800998ecf8427e - +sample.ine 1b6dfffb7025fbca392de0a359db1f01 - +sampleh1.ine 4fd28c2bca346a3fc8ab41a49ab9eede - +sampleh2.ine 4f65ae11c6bc71f613ecc33989fe760c - +sampleh3.ine 55a3fbd3f1c495a0ec66651b901f9231 - +sampleh4.ine 360296f0fb93ab70b1528453d6cf02ca - +sampleh5.ine a93fd99d5bbfc33715db65b01fc452dc - +sampleh6.ine a62303e71a549a4ae051e0a66d98bb61 - +sampleh7.ine 3b9b5d0e083f6754a8a208e438159547 - +sampleh8.ine d41d8cd98f00b204e9800998ecf8427e - +trunc10.ine edecfb72df1fe7f8c4849cdb3c47bfce - +trunc7.ine 989656d77040b040f10b241041f7c404 - +tsp5.ine 214457d06fa51e69e2edd126f66e07fc - diff --git a/demos/ppl_lcdd/expected_int64_a b/demos/ppl_lcdd/expected_int64_a new file mode 100644 index 0000000..b8e517c --- /dev/null +++ b/demos/ppl_lcdd/expected_int64_a @@ -0,0 +1,85 @@ +ccc4.ext bc96322497eecd12c4d0582ff2311cb4 - +ccc5.ext 4964babfa462514ddeb8b3b549e92982 - +ccp4.ext c57dd7951e50033fa8955810bbe273a3 - +ccp5.ext 226f386e8780b30e239586b8b2964a0d - +cp4.ext c57dd7951e50033fa8955810bbe273a3 - +cp5.ext 226f386e8780b30e239586b8b2964a0d - +cube.ext 45f31680d2301d58a1d57c0dc09bb1f0 - +cut16_11.ext 56ec06c653436caff88819989a739b74 - +cyclic10-4.ext 0ddde1f99cd5b3cf899fa6778e67569e - +cyclic12-6.ext d72a192a8057e34b9cd3a9ad112b6cd2 - +cyclic14-8.ext d41d8cd98f00b204e9800998ecf8427e - +dcube10.ext aab7857f665af827774614f090f72b51 - +dcube12.ext d2e47db88b9ea21f7fabb03c60421297 - +dcube3.ext f37f7234953ac36f582bfcad6e933397 - +dcube6.ext 09056814a1944456ce283f5839411c38 - +dcube8.ext e2ac7f22e55e7b2009d0625dd4ec724a - +irbox20-4.ext d41d8cd98f00b204e9800998ecf8427e - +irbox200-4.ext d41d8cd98f00b204e9800998ecf8427e - +mp5.ext 064e5fd8ec28e712f2c475cb19cee4e3 - +redcheck.ext 12a70972a9385cf228abe8484f68f1c6 - +reg24-5.ext 8e8fa94ededd63732112f68094fe0559 - +samplev1.ext 0d931a85a14850fc76a3b1d5c373b917 - +samplev2.ext 6718e59a777d0ae297dbe7d6d305961a - +samplev3.ext 425b227f7720ee71af25fadbec2560b9 - +tsp5.ext e9e56d002855db0d1ba399d6cf991799 - +1d.ine 89d8b1916d823aaf7563740c09f71470 - +1da.ine 89d8b1916d823aaf7563740c09f71470 - +allzero.ine 360296f0fb93ab70b1528453d6cf02ca - +cp4.ine a868d7ab4d206871d4af3311059caa32 - +cp5.ine a329d8a17d135c38d9bbc5709a523f9a - +cross10.ine 38178216a0010320f29334df7a2f9eac - +cross12.ine 1c24d854ca16cbb6281648219c37cf0a - +cross4.ine a9bab74fd8c29016443a117b88827ca6 - +cross6.ine 3b41f0b924526fec2616f6299fe14c6f - +cross8.ine 32274fa3bd0758c81380bb305ec09d8f - +cube.ine e2498d1cd888aa8cf2762bb5a8613592 - +cube10.ine 9511f2116a3863917e7c75067ca2c2e5 - +cube12.ine a71ae423c627c68442fc2dff2b2b9e0a - +cube3.ine 4872fb1845557d484af5c09e47890ccc - +cube6.ine 59218da4f6db0b742bd18271c9d5f6da - +cube8.ine 857e4c7484b1dc5919a1629e46b856e8 - +cubetop.ine f963c1b731386d994e03975ac98b5c25 - +cubocta.ine 526a2d84e3661ead8dc6cd05c090a776 - +cyc.ine 1f3ffeef795b27e5bfc2c3de20be70f4 - +diamond.ine a8b60aa3d60bafed0d49a05a7a260a9c - +dodeca_m.ine d41d8cd98f00b204e9800998ecf8427e - +ex1.ine 846681e0741bb57be1673b8c9170cd49 - +grcubocta.ine 49ed87ceef0f9dd80caaa7e9798886ab - +hexocta.ine 9e79ebd2ae4be939363e8a8fc9391908 - +icododeca_m.ine d41d8cd98f00b204e9800998ecf8427e - +in0.ine aee5c7fb5cdf7881c33ac3e379986b79 - +in1.ine d41d8cd98f00b204e9800998ecf8427e - +in2.ine 30fc1812a724bad238f8af157ef58729 - +in3.ine 662e46c09123c5aa87ae82a792dc3df6 - +in4.ine 9e3e0e301762546a26557c8bee786732 - +in5.ine c29524500ec4656ca26c5671df46db96 - +infeas.ine 8dba32fa5e973205c7cd850bbcf5bb14 - +integralpoints.ine e8057c28540aa563ef831399d8a15654 - +kkd18_4.ine d41d8cd98f00b204e9800998ecf8427e - +kkd27_5.ine d41d8cd98f00b204e9800998ecf8427e - +kkd38_6.ine d41d8cd98f00b204e9800998ecf8427e - +metric40_11.ine 8730ceaec3e4fe9f4155779510300011 - +metric80_16.ine 60bc723581cb4ef986f654967511b104 - +mp5.ine 8730ceaec3e4fe9f4155779510300011 - +mp5a.ine 8730ceaec3e4fe9f4155779510300011 - +mp6.ine a1d322a1bf98569f129efe4774099f0a - +nonfull.ine 960129e6c4b3856ca3ebc5ed2dbb0c0e - +origin.ine 58ac995e1d9ce9dcc73d546675db0c91 - +project1_m.ine 5330d7ef41d67f29d6102ae6d961112f - +project1res.ine e2e2c0f79a34d73dfa68f44e5f3a0b76 - +project2_m.ine 629a0c15eed90e3f84307bad56301493 - +project2res.ine aaf40e2fe14795fb63f647773c0e13fe - +rcubocta.ine b75aae81c225ab7a2bcaa6217384346f - +reg24-5.ine cba2ab338cfdfd3d2374d66ce10dbca8 - +rhomtria_m.ine d41d8cd98f00b204e9800998ecf8427e - +sample.ine 1b6dfffb7025fbca392de0a359db1f01 - +sampleh1.ine 4fd28c2bca346a3fc8ab41a49ab9eede - +sampleh2.ine 4f65ae11c6bc71f613ecc33989fe760c - +sampleh3.ine 55a3fbd3f1c495a0ec66651b901f9231 - +sampleh4.ine 360296f0fb93ab70b1528453d6cf02ca - +sampleh5.ine a93fd99d5bbfc33715db65b01fc452dc - +sampleh6.ine a62303e71a549a4ae051e0a66d98bb61 - +sampleh7.ine 3b9b5d0e083f6754a8a208e438159547 - +trunc7.ine 989656d77040b040f10b241041f7c404 - +tsp5.ine 214457d06fa51e69e2edd126f66e07fc - diff --git a/demos/ppl_lcdd/expected_int8 b/demos/ppl_lcdd/expected_int8 new file mode 100644 index 0000000..179b90d --- /dev/null +++ b/demos/ppl_lcdd/expected_int8 @@ -0,0 +1,98 @@ +ccc4.ext bc96322497eecd12c4d0582ff2311cb4 - +ccc5.ext 4964babfa462514ddeb8b3b549e92982 - +ccc6.ext c458b6a2a77990c6d8fe562c9d223c2c - +ccp4.ext c57dd7951e50033fa8955810bbe273a3 - +ccp5.ext 226f386e8780b30e239586b8b2964a0d - +ccp6.ext ac5556e9e9fd1100c6b9f97384f609da - +cp4.ext c57dd7951e50033fa8955810bbe273a3 - +cp5.ext 226f386e8780b30e239586b8b2964a0d - +cp6.ext ac5556e9e9fd1100c6b9f97384f609da - +cube.ext 45f31680d2301d58a1d57c0dc09bb1f0 - +cut16_11.ext 56ec06c653436caff88819989a739b74 - +cut32_16.ext 2f524bae3b4ba2edf72f54183cb702a5 - +cyclic10-4.ext d41d8cd98f00b204e9800998ecf8427e - +cyclic12-6.ext d41d8cd98f00b204e9800998ecf8427e - +cyclic14-8.ext d41d8cd98f00b204e9800998ecf8427e - +cyclic16-10.ext d41d8cd98f00b204e9800998ecf8427e - +dcube10.ext aab7857f665af827774614f090f72b51 - +dcube12.ext d2e47db88b9ea21f7fabb03c60421297 - +dcube3.ext f37f7234953ac36f582bfcad6e933397 - +dcube6.ext 09056814a1944456ce283f5839411c38 - +dcube8.ext e2ac7f22e55e7b2009d0625dd4ec724a - +irbox20-4.ext d41d8cd98f00b204e9800998ecf8427e - +irbox200-4.ext d41d8cd98f00b204e9800998ecf8427e - +mp5.ext 064e5fd8ec28e712f2c475cb19cee4e3 - +redcheck.ext 12a70972a9385cf228abe8484f68f1c6 - +reg24-5.ext 8e8fa94ededd63732112f68094fe0559 - +reg600-5_m.ext d41d8cd98f00b204e9800998ecf8427e - +samplev1.ext 0d931a85a14850fc76a3b1d5c373b917 - +samplev2.ext 6718e59a777d0ae297dbe7d6d305961a - +samplev3.ext 425b227f7720ee71af25fadbec2560b9 - +tsp5.ext e9e56d002855db0d1ba399d6cf991799 - +1d.ine 89d8b1916d823aaf7563740c09f71470 - +1da.ine 89d8b1916d823aaf7563740c09f71470 - +allzero.ine 360296f0fb93ab70b1528453d6cf02ca - +cp4.ine a868d7ab4d206871d4af3311059caa32 - +cp5.ine a329d8a17d135c38d9bbc5709a523f9a - +cross10.ine 38178216a0010320f29334df7a2f9eac - +cross12.ine 1c24d854ca16cbb6281648219c37cf0a - +cross4.ine a9bab74fd8c29016443a117b88827ca6 - +cross6.ine 3b41f0b924526fec2616f6299fe14c6f - +cross8.ine 32274fa3bd0758c81380bb305ec09d8f - +cube.ine e2498d1cd888aa8cf2762bb5a8613592 - +cube10.ine 9511f2116a3863917e7c75067ca2c2e5 - +cube12.ine a71ae423c627c68442fc2dff2b2b9e0a - +cube3.ine 4872fb1845557d484af5c09e47890ccc - +cube6.ine 59218da4f6db0b742bd18271c9d5f6da - +cube8.ine 857e4c7484b1dc5919a1629e46b856e8 - +cubetop.ine f963c1b731386d994e03975ac98b5c25 - +cubocta.ine 526a2d84e3661ead8dc6cd05c090a776 - +cyc.ine d41d8cd98f00b204e9800998ecf8427e - +cyclic17_8.ine d41d8cd98f00b204e9800998ecf8427e - +diamond.ine a8b60aa3d60bafed0d49a05a7a260a9c - +dodeca_m.ine d41d8cd98f00b204e9800998ecf8427e - +ex1.ine 846681e0741bb57be1673b8c9170cd49 - +grcubocta.ine 49ed87ceef0f9dd80caaa7e9798886ab - +hexocta.ine d41d8cd98f00b204e9800998ecf8427e - +icododeca_m.ine d41d8cd98f00b204e9800998ecf8427e - +in0.ine d41d8cd98f00b204e9800998ecf8427e - +in1.ine d41d8cd98f00b204e9800998ecf8427e - +in2.ine 30fc1812a724bad238f8af157ef58729 - +in3.ine 662e46c09123c5aa87ae82a792dc3df6 - +in4.ine d41d8cd98f00b204e9800998ecf8427e - +in5.ine d41d8cd98f00b204e9800998ecf8427e - +in6.ine d41d8cd98f00b204e9800998ecf8427e - +in7.ine d41d8cd98f00b204e9800998ecf8427e - +infeas.ine 8dba32fa5e973205c7cd850bbcf5bb14 - +integralpoints.ine d41d8cd98f00b204e9800998ecf8427e - +kkd18_4.ine d41d8cd98f00b204e9800998ecf8427e - +kkd27_5.ine d41d8cd98f00b204e9800998ecf8427e - +kkd38_6.ine d41d8cd98f00b204e9800998ecf8427e - +kq20_11_m.ine d41d8cd98f00b204e9800998ecf8427e - +metric40_11.ine 8730ceaec3e4fe9f4155779510300011 - +metric80_16.ine 60bc723581cb4ef986f654967511b104 - +mit31-20.ine d41d8cd98f00b204e9800998ecf8427e - +mp5.ine 8730ceaec3e4fe9f4155779510300011 - +mp5a.ine 8730ceaec3e4fe9f4155779510300011 - +mp6.ine a1d322a1bf98569f129efe4774099f0a - +nonfull.ine 960129e6c4b3856ca3ebc5ed2dbb0c0e - +origin.ine 58ac995e1d9ce9dcc73d546675db0c91 - +project1_m.ine 5330d7ef41d67f29d6102ae6d961112f - +project1res.ine e2e2c0f79a34d73dfa68f44e5f3a0b76 - +project2_m.ine d41d8cd98f00b204e9800998ecf8427e - +project2res.ine d41d8cd98f00b204e9800998ecf8427e - +rcubocta.ine b75aae81c225ab7a2bcaa6217384346f - +reg24-5.ine cba2ab338cfdfd3d2374d66ce10dbca8 - +rhomtria_m.ine d41d8cd98f00b204e9800998ecf8427e - +sample.ine 1b6dfffb7025fbca392de0a359db1f01 - +sampleh1.ine 4fd28c2bca346a3fc8ab41a49ab9eede - +sampleh2.ine 4f65ae11c6bc71f613ecc33989fe760c - +sampleh3.ine 55a3fbd3f1c495a0ec66651b901f9231 - +sampleh4.ine 360296f0fb93ab70b1528453d6cf02ca - +sampleh5.ine a93fd99d5bbfc33715db65b01fc452dc - +sampleh6.ine a62303e71a549a4ae051e0a66d98bb61 - +sampleh7.ine d41d8cd98f00b204e9800998ecf8427e - +sampleh8.ine d41d8cd98f00b204e9800998ecf8427e - +trunc10.ine d41d8cd98f00b204e9800998ecf8427e - +trunc7.ine d41d8cd98f00b204e9800998ecf8427e - +tsp5.ine 214457d06fa51e69e2edd126f66e07fc - diff --git a/demos/ppl_lcdd/expected_int8_a b/demos/ppl_lcdd/expected_int8_a new file mode 100644 index 0000000..5e7a7d0 --- /dev/null +++ b/demos/ppl_lcdd/expected_int8_a @@ -0,0 +1,85 @@ +ccc4.ext bc96322497eecd12c4d0582ff2311cb4 - +ccc5.ext 4964babfa462514ddeb8b3b549e92982 - +ccp4.ext c57dd7951e50033fa8955810bbe273a3 - +ccp5.ext 226f386e8780b30e239586b8b2964a0d - +cp4.ext c57dd7951e50033fa8955810bbe273a3 - +cp5.ext 226f386e8780b30e239586b8b2964a0d - +cube.ext 45f31680d2301d58a1d57c0dc09bb1f0 - +cut16_11.ext d41d8cd98f00b204e9800998ecf8427e - +cyclic10-4.ext d41d8cd98f00b204e9800998ecf8427e - +cyclic12-6.ext d41d8cd98f00b204e9800998ecf8427e - +cyclic14-8.ext d41d8cd98f00b204e9800998ecf8427e - +dcube10.ext aab7857f665af827774614f090f72b51 - +dcube12.ext d2e47db88b9ea21f7fabb03c60421297 - +dcube3.ext f37f7234953ac36f582bfcad6e933397 - +dcube6.ext 09056814a1944456ce283f5839411c38 - +dcube8.ext e2ac7f22e55e7b2009d0625dd4ec724a - +irbox20-4.ext d41d8cd98f00b204e9800998ecf8427e - +irbox200-4.ext d41d8cd98f00b204e9800998ecf8427e - +mp5.ext 064e5fd8ec28e712f2c475cb19cee4e3 - +redcheck.ext 12a70972a9385cf228abe8484f68f1c6 - +reg24-5.ext 8e8fa94ededd63732112f68094fe0559 - +samplev1.ext 0d931a85a14850fc76a3b1d5c373b917 - +samplev2.ext 6718e59a777d0ae297dbe7d6d305961a - +samplev3.ext 425b227f7720ee71af25fadbec2560b9 - +tsp5.ext e9e56d002855db0d1ba399d6cf991799 - +1d.ine 89d8b1916d823aaf7563740c09f71470 - +1da.ine 89d8b1916d823aaf7563740c09f71470 - +allzero.ine 360296f0fb93ab70b1528453d6cf02ca - +cp4.ine a868d7ab4d206871d4af3311059caa32 - +cp5.ine a329d8a17d135c38d9bbc5709a523f9a - +cross10.ine 38178216a0010320f29334df7a2f9eac - +cross12.ine 1c24d854ca16cbb6281648219c37cf0a - +cross4.ine a9bab74fd8c29016443a117b88827ca6 - +cross6.ine 3b41f0b924526fec2616f6299fe14c6f - +cross8.ine 32274fa3bd0758c81380bb305ec09d8f - +cube.ine e2498d1cd888aa8cf2762bb5a8613592 - +cube10.ine 9511f2116a3863917e7c75067ca2c2e5 - +cube12.ine a71ae423c627c68442fc2dff2b2b9e0a - +cube3.ine 4872fb1845557d484af5c09e47890ccc - +cube6.ine 59218da4f6db0b742bd18271c9d5f6da - +cube8.ine 857e4c7484b1dc5919a1629e46b856e8 - +cubetop.ine f963c1b731386d994e03975ac98b5c25 - +cubocta.ine 526a2d84e3661ead8dc6cd05c090a776 - +cyc.ine d41d8cd98f00b204e9800998ecf8427e - +diamond.ine a8b60aa3d60bafed0d49a05a7a260a9c - +dodeca_m.ine d41d8cd98f00b204e9800998ecf8427e - +ex1.ine 846681e0741bb57be1673b8c9170cd49 - +grcubocta.ine d41d8cd98f00b204e9800998ecf8427e - +hexocta.ine d41d8cd98f00b204e9800998ecf8427e - +icododeca_m.ine d41d8cd98f00b204e9800998ecf8427e - +in0.ine d41d8cd98f00b204e9800998ecf8427e - +in1.ine d41d8cd98f00b204e9800998ecf8427e - +in2.ine 30fc1812a724bad238f8af157ef58729 - +in3.ine 662e46c09123c5aa87ae82a792dc3df6 - +in4.ine d41d8cd98f00b204e9800998ecf8427e - +in5.ine d41d8cd98f00b204e9800998ecf8427e - +infeas.ine 8dba32fa5e973205c7cd850bbcf5bb14 - +integralpoints.ine d41d8cd98f00b204e9800998ecf8427e - +kkd18_4.ine d41d8cd98f00b204e9800998ecf8427e - +kkd27_5.ine d41d8cd98f00b204e9800998ecf8427e - +kkd38_6.ine d41d8cd98f00b204e9800998ecf8427e - +metric40_11.ine 8730ceaec3e4fe9f4155779510300011 - +metric80_16.ine 60bc723581cb4ef986f654967511b104 - +mp5.ine 8730ceaec3e4fe9f4155779510300011 - +mp5a.ine 8730ceaec3e4fe9f4155779510300011 - +mp6.ine d41d8cd98f00b204e9800998ecf8427e - +nonfull.ine 960129e6c4b3856ca3ebc5ed2dbb0c0e - +origin.ine 58ac995e1d9ce9dcc73d546675db0c91 - +project1_m.ine 5330d7ef41d67f29d6102ae6d961112f - +project1res.ine e2e2c0f79a34d73dfa68f44e5f3a0b76 - +project2_m.ine d41d8cd98f00b204e9800998ecf8427e - +project2res.ine d41d8cd98f00b204e9800998ecf8427e - +rcubocta.ine b75aae81c225ab7a2bcaa6217384346f - +reg24-5.ine cba2ab338cfdfd3d2374d66ce10dbca8 - +rhomtria_m.ine d41d8cd98f00b204e9800998ecf8427e - +sample.ine 1b6dfffb7025fbca392de0a359db1f01 - +sampleh1.ine 4fd28c2bca346a3fc8ab41a49ab9eede - +sampleh2.ine 4f65ae11c6bc71f613ecc33989fe760c - +sampleh3.ine 55a3fbd3f1c495a0ec66651b901f9231 - +sampleh4.ine 360296f0fb93ab70b1528453d6cf02ca - +sampleh5.ine a93fd99d5bbfc33715db65b01fc452dc - +sampleh6.ine a62303e71a549a4ae051e0a66d98bb61 - +sampleh7.ine d41d8cd98f00b204e9800998ecf8427e - +trunc7.ine d41d8cd98f00b204e9800998ecf8427e - +tsp5.ine 214457d06fa51e69e2edd126f66e07fc - diff --git a/demos/ppl_lcdd/expected_mpz b/demos/ppl_lcdd/expected_mpz new file mode 100644 index 0000000..0f5701e --- /dev/null +++ b/demos/ppl_lcdd/expected_mpz @@ -0,0 +1,98 @@ +ccc4.ext bc96322497eecd12c4d0582ff2311cb4 - +ccc5.ext 4964babfa462514ddeb8b3b549e92982 - +ccc6.ext c458b6a2a77990c6d8fe562c9d223c2c - +ccp4.ext c57dd7951e50033fa8955810bbe273a3 - +ccp5.ext 226f386e8780b30e239586b8b2964a0d - +ccp6.ext ac5556e9e9fd1100c6b9f97384f609da - +cp4.ext c57dd7951e50033fa8955810bbe273a3 - +cp5.ext 226f386e8780b30e239586b8b2964a0d - +cp6.ext ac5556e9e9fd1100c6b9f97384f609da - +cube.ext 45f31680d2301d58a1d57c0dc09bb1f0 - +cut16_11.ext 56ec06c653436caff88819989a739b74 - +cut32_16.ext 2f524bae3b4ba2edf72f54183cb702a5 - +cyclic10-4.ext 0ddde1f99cd5b3cf899fa6778e67569e - +cyclic12-6.ext d72a192a8057e34b9cd3a9ad112b6cd2 - +cyclic14-8.ext a4a97e43ad11ff98450b2a94618e373d - +cyclic16-10.ext a7b2ba7c494b41e0f7faf6f34cb6ca48 - +dcube10.ext aab7857f665af827774614f090f72b51 - +dcube12.ext d2e47db88b9ea21f7fabb03c60421297 - +dcube3.ext f37f7234953ac36f582bfcad6e933397 - +dcube6.ext 09056814a1944456ce283f5839411c38 - +dcube8.ext e2ac7f22e55e7b2009d0625dd4ec724a - +irbox20-4.ext 1324d63c4fe3e0902178254e768e9504 - +irbox200-4.ext eb69ce06ed90547eeb9ff98a62ce3b7e - +mp5.ext 064e5fd8ec28e712f2c475cb19cee4e3 - +redcheck.ext 12a70972a9385cf228abe8484f68f1c6 - +reg24-5.ext 8e8fa94ededd63732112f68094fe0559 - +reg600-5_m.ext bf50ec3c18bc063d041f07259cbe0977 - +samplev1.ext 0d931a85a14850fc76a3b1d5c373b917 - +samplev2.ext 6718e59a777d0ae297dbe7d6d305961a - +samplev3.ext 425b227f7720ee71af25fadbec2560b9 - +tsp5.ext e9e56d002855db0d1ba399d6cf991799 - +1d.ine 89d8b1916d823aaf7563740c09f71470 - +1da.ine 89d8b1916d823aaf7563740c09f71470 - +allzero.ine 360296f0fb93ab70b1528453d6cf02ca - +cp4.ine a868d7ab4d206871d4af3311059caa32 - +cp5.ine a329d8a17d135c38d9bbc5709a523f9a - +cross10.ine 38178216a0010320f29334df7a2f9eac - +cross12.ine 1c24d854ca16cbb6281648219c37cf0a - +cross4.ine a9bab74fd8c29016443a117b88827ca6 - +cross6.ine 3b41f0b924526fec2616f6299fe14c6f - +cross8.ine 32274fa3bd0758c81380bb305ec09d8f - +cube.ine e2498d1cd888aa8cf2762bb5a8613592 - +cube10.ine 9511f2116a3863917e7c75067ca2c2e5 - +cube12.ine a71ae423c627c68442fc2dff2b2b9e0a - +cube3.ine 4872fb1845557d484af5c09e47890ccc - +cube6.ine 59218da4f6db0b742bd18271c9d5f6da - +cube8.ine 857e4c7484b1dc5919a1629e46b856e8 - +cubetop.ine f963c1b731386d994e03975ac98b5c25 - +cubocta.ine 526a2d84e3661ead8dc6cd05c090a776 - +cyc.ine 1f3ffeef795b27e5bfc2c3de20be70f4 - +cyclic17_8.ine 7dde598eeb61433637ff7ecd1d9689e0 - +diamond.ine a8b60aa3d60bafed0d49a05a7a260a9c - +dodeca_m.ine 4a3d6132b5a0f2ee9a65e422b520bcce - +ex1.ine 846681e0741bb57be1673b8c9170cd49 - +grcubocta.ine 49ed87ceef0f9dd80caaa7e9798886ab - +hexocta.ine 9e79ebd2ae4be939363e8a8fc9391908 - +icododeca_m.ine 8a75d6463098ed2e2160c33f6955f3ac - +in0.ine aee5c7fb5cdf7881c33ac3e379986b79 - +in1.ine bba9cb757ba441e33e0a3628fc13ed2c - +in2.ine 30fc1812a724bad238f8af157ef58729 - +in3.ine 662e46c09123c5aa87ae82a792dc3df6 - +in4.ine 9e3e0e301762546a26557c8bee786732 - +in5.ine c29524500ec4656ca26c5671df46db96 - +in6.ine 1d81f92f878af596166bc64c20392e5b - +in7.ine a5f569a088696cf71dbd23ccf5a2cca6 - +infeas.ine 8dba32fa5e973205c7cd850bbcf5bb14 - +integralpoints.ine e8057c28540aa563ef831399d8a15654 - +kkd18_4.ine 1736867592c3f53fb4d062ace63e6ba4 - +kkd27_5.ine 9c376148791743bbb9d2a6b1467b8a11 - +kkd38_6.ine 1c692bb63e7d61fad11d3b1e196eabe4 - +kq20_11_m.ine a5f569a088696cf71dbd23ccf5a2cca6 - +metric40_11.ine 8730ceaec3e4fe9f4155779510300011 - +metric80_16.ine 60bc723581cb4ef986f654967511b104 - +mit31-20.ine 03aef81d50c861b73302866415184106 - +mp5.ine 8730ceaec3e4fe9f4155779510300011 - +mp5a.ine 8730ceaec3e4fe9f4155779510300011 - +mp6.ine a1d322a1bf98569f129efe4774099f0a - +nonfull.ine 960129e6c4b3856ca3ebc5ed2dbb0c0e - +origin.ine 58ac995e1d9ce9dcc73d546675db0c91 - +project1_m.ine 5330d7ef41d67f29d6102ae6d961112f - +project1res.ine e2e2c0f79a34d73dfa68f44e5f3a0b76 - +project2_m.ine 629a0c15eed90e3f84307bad56301493 - +project2res.ine aaf40e2fe14795fb63f647773c0e13fe - +rcubocta.ine b75aae81c225ab7a2bcaa6217384346f - +reg24-5.ine cba2ab338cfdfd3d2374d66ce10dbca8 - +rhomtria_m.ine a351f4fc25819a278bdf2244f3f1c3a4 - +sample.ine 1b6dfffb7025fbca392de0a359db1f01 - +sampleh1.ine 4fd28c2bca346a3fc8ab41a49ab9eede - +sampleh2.ine 4f65ae11c6bc71f613ecc33989fe760c - +sampleh3.ine 55a3fbd3f1c495a0ec66651b901f9231 - +sampleh4.ine 360296f0fb93ab70b1528453d6cf02ca - +sampleh5.ine a93fd99d5bbfc33715db65b01fc452dc - +sampleh6.ine a62303e71a549a4ae051e0a66d98bb61 - +sampleh7.ine 3b9b5d0e083f6754a8a208e438159547 - +sampleh8.ine 8ddc3026fccbbeb3699fc6db254ff981 - +trunc10.ine edecfb72df1fe7f8c4849cdb3c47bfce - +trunc7.ine 989656d77040b040f10b241041f7c404 - +tsp5.ine 214457d06fa51e69e2edd126f66e07fc - diff --git a/demos/ppl_lcdd/expected_mpz_a b/demos/ppl_lcdd/expected_mpz_a new file mode 100644 index 0000000..561cef3 --- /dev/null +++ b/demos/ppl_lcdd/expected_mpz_a @@ -0,0 +1,85 @@ +ccc4.ext bc96322497eecd12c4d0582ff2311cb4 - +ccc5.ext 4964babfa462514ddeb8b3b549e92982 - +ccp4.ext c57dd7951e50033fa8955810bbe273a3 - +ccp5.ext 226f386e8780b30e239586b8b2964a0d - +cp4.ext c57dd7951e50033fa8955810bbe273a3 - +cp5.ext 226f386e8780b30e239586b8b2964a0d - +cube.ext 45f31680d2301d58a1d57c0dc09bb1f0 - +cut16_11.ext 56ec06c653436caff88819989a739b74 - +cyclic10-4.ext 0ddde1f99cd5b3cf899fa6778e67569e - +cyclic12-6.ext d72a192a8057e34b9cd3a9ad112b6cd2 - +cyclic14-8.ext a4a97e43ad11ff98450b2a94618e373d - +dcube10.ext aab7857f665af827774614f090f72b51 - +dcube12.ext d2e47db88b9ea21f7fabb03c60421297 - +dcube3.ext f37f7234953ac36f582bfcad6e933397 - +dcube6.ext 09056814a1944456ce283f5839411c38 - +dcube8.ext e2ac7f22e55e7b2009d0625dd4ec724a - +irbox20-4.ext 1324d63c4fe3e0902178254e768e9504 - +irbox200-4.ext eb69ce06ed90547eeb9ff98a62ce3b7e - +mp5.ext 064e5fd8ec28e712f2c475cb19cee4e3 - +redcheck.ext 12a70972a9385cf228abe8484f68f1c6 - +reg24-5.ext 8e8fa94ededd63732112f68094fe0559 - +samplev1.ext 0d931a85a14850fc76a3b1d5c373b917 - +samplev2.ext 6718e59a777d0ae297dbe7d6d305961a - +samplev3.ext 425b227f7720ee71af25fadbec2560b9 - +tsp5.ext e9e56d002855db0d1ba399d6cf991799 - +1d.ine 89d8b1916d823aaf7563740c09f71470 - +1da.ine 89d8b1916d823aaf7563740c09f71470 - +allzero.ine 360296f0fb93ab70b1528453d6cf02ca - +cp4.ine a868d7ab4d206871d4af3311059caa32 - +cp5.ine a329d8a17d135c38d9bbc5709a523f9a - +cross10.ine 38178216a0010320f29334df7a2f9eac - +cross12.ine 1c24d854ca16cbb6281648219c37cf0a - +cross4.ine a9bab74fd8c29016443a117b88827ca6 - +cross6.ine 3b41f0b924526fec2616f6299fe14c6f - +cross8.ine 32274fa3bd0758c81380bb305ec09d8f - +cube.ine e2498d1cd888aa8cf2762bb5a8613592 - +cube10.ine 9511f2116a3863917e7c75067ca2c2e5 - +cube12.ine a71ae423c627c68442fc2dff2b2b9e0a - +cube3.ine 4872fb1845557d484af5c09e47890ccc - +cube6.ine 59218da4f6db0b742bd18271c9d5f6da - +cube8.ine 857e4c7484b1dc5919a1629e46b856e8 - +cubetop.ine f963c1b731386d994e03975ac98b5c25 - +cubocta.ine 526a2d84e3661ead8dc6cd05c090a776 - +cyc.ine 1f3ffeef795b27e5bfc2c3de20be70f4 - +diamond.ine a8b60aa3d60bafed0d49a05a7a260a9c - +dodeca_m.ine 4a3d6132b5a0f2ee9a65e422b520bcce - +ex1.ine 846681e0741bb57be1673b8c9170cd49 - +grcubocta.ine 49ed87ceef0f9dd80caaa7e9798886ab - +hexocta.ine 9e79ebd2ae4be939363e8a8fc9391908 - +icododeca_m.ine 8a75d6463098ed2e2160c33f6955f3ac - +in0.ine aee5c7fb5cdf7881c33ac3e379986b79 - +in1.ine bba9cb757ba441e33e0a3628fc13ed2c - +in2.ine 30fc1812a724bad238f8af157ef58729 - +in3.ine 662e46c09123c5aa87ae82a792dc3df6 - +in4.ine 9e3e0e301762546a26557c8bee786732 - +in5.ine c29524500ec4656ca26c5671df46db96 - +infeas.ine 8dba32fa5e973205c7cd850bbcf5bb14 - +integralpoints.ine e8057c28540aa563ef831399d8a15654 - +kkd18_4.ine 1736867592c3f53fb4d062ace63e6ba4 - +kkd27_5.ine 9c376148791743bbb9d2a6b1467b8a11 - +kkd38_6.ine 1c692bb63e7d61fad11d3b1e196eabe4 - +metric40_11.ine 8730ceaec3e4fe9f4155779510300011 - +metric80_16.ine 60bc723581cb4ef986f654967511b104 - +mp5.ine 8730ceaec3e4fe9f4155779510300011 - +mp5a.ine 8730ceaec3e4fe9f4155779510300011 - +mp6.ine a1d322a1bf98569f129efe4774099f0a - +nonfull.ine 960129e6c4b3856ca3ebc5ed2dbb0c0e - +origin.ine 58ac995e1d9ce9dcc73d546675db0c91 - +project1_m.ine 5330d7ef41d67f29d6102ae6d961112f - +project1res.ine e2e2c0f79a34d73dfa68f44e5f3a0b76 - +project2_m.ine 629a0c15eed90e3f84307bad56301493 - +project2res.ine aaf40e2fe14795fb63f647773c0e13fe - +rcubocta.ine b75aae81c225ab7a2bcaa6217384346f - +reg24-5.ine cba2ab338cfdfd3d2374d66ce10dbca8 - +rhomtria_m.ine a351f4fc25819a278bdf2244f3f1c3a4 - +sample.ine 1b6dfffb7025fbca392de0a359db1f01 - +sampleh1.ine 4fd28c2bca346a3fc8ab41a49ab9eede - +sampleh2.ine 4f65ae11c6bc71f613ecc33989fe760c - +sampleh3.ine 55a3fbd3f1c495a0ec66651b901f9231 - +sampleh4.ine 360296f0fb93ab70b1528453d6cf02ca - +sampleh5.ine a93fd99d5bbfc33715db65b01fc452dc - +sampleh6.ine a62303e71a549a4ae051e0a66d98bb61 - +sampleh7.ine 3b9b5d0e083f6754a8a208e438159547 - +trunc7.ine 989656d77040b040f10b241041f7c404 - +tsp5.ine 214457d06fa51e69e2edd126f66e07fc - diff --git a/demos/ppl_lcdd/ppl_lcdd.1 b/demos/ppl_lcdd/ppl_lcdd.1 new file mode 100644 index 0000000..461c540 --- /dev/null +++ b/demos/ppl_lcdd/ppl_lcdd.1 @@ -0,0 +1,65 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.36. +.TH PPL_LCDD "1" "April 2009" "ppl_lcdd 0.10.2" "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://www.cs.unipr.it/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 . +.SH COPYRIGHT +Copyright (C) 2001\-2009 Roberto Bagnara +.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..b0d33d5 --- /dev/null +++ b/demos/ppl_lcdd/ppl_lcdd.cc @@ -0,0 +1,1344 @@ +/* A sort of clone of the cddlib test program `lcdd'. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +//#define USE_POLKA 1 +//#define USE_POLYLIB 1 + +#if (!defined(USE_PPL) && !defined(USE_POLKA) && !defined(USE_POLYLIB)) +#define USE_PPL 1 +#elif \ + (defined(USE_PPL) && defined(USE_POLKA)) \ +|| (defined(USE_PPL) && defined(USE_POLYLIB)) \ +|| (defined(USE_POLKA) && defined(USE_POLYLIB)) +#error "Exactly one among USE_PPL, USE_POLKA and USE_POLYLIB must be defined." +#endif + +#if defined(USE_PPL) + +#include "ppl.hh" + +namespace PPL = Parma_Polyhedra_Library; + +#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 6 +#error "PPL version 0.6 or following is required" +#endif + +typedef PPL::C_Polyhedron POLYHEDRON_TYPE; + +#if !PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK +extern "C" void +ppl_set_GMP_memory_allocation_functions(void) { +} +#endif + +#elif defined(USE_POLKA) + +#include +#include + +extern "C" { +#define bool polka_bool +#define true polka_true +#define false polka_false +#define POLKA_NUM 3 +#include +#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 +#include + +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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef PPL_HAVE_GETOPT_H +#include + +// 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 +// . +# include +#endif + +#ifdef PPL_HAVE_SYS_TIME_H +# include +#endif + +#ifdef PPL_HAVE_SYS_RESOURCE_H +// This should be included after and so as to make +// sure we have the definitions for, e.g., `ru_utime'. +# include +#endif + +#if defined(PPL_HAVE_SYS_RESOURCE_H) \ + && (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 .\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 = ""; + } +} + +std::istream& +input() { + assert(input_stream_p); + return *input_stream_p; +} + +const char* output_file_name = 0; +std::ostream* output_stream_p = 0; + +void +set_output(const char* file_name) { + if (output_stream_p && *output_stream_p != std::cout) + delete output_stream_p; + + if (file_name) { + output_stream_p = new std::ofstream(file_name, + std::ios_base::out + | std::ios_base::app); + if (!*output_stream_p) + fatal("cannot open output file `%s'", file_name); + output_file_name = file_name; + } + else { + output_stream_p = &std::cout; + output_file_name = ""; + } +} + +std::ostream& +output() { + assert(output_stream_p); + return *output_stream_p; +} + +} // namespace + +void +error(const char* format, ...) { + va_list ap; + va_start(ap, format); + fprintf(stderr, "%s: in `%s': ", program_name, input_file_name); + vfprintf(stderr, format, ap); + fprintf(stderr, "\n"); + va_end(ap); + exit(1); +} + +void +warning(const char* format, ...) { + va_list ap; + va_start(ap, format); + fprintf(stderr, "%s: Warning: in `%s': ", program_name, input_file_name); + vfprintf(stderr, format, ap); + fprintf(stderr, "\n"); + va_end(ap); +} + +#ifdef PPL_LCDD_SUPPORTS_LIMIT_ON_CPU_TIME + +extern "C" typedef void (*sig_handler_type)(int); + +void +set_alarm_on_cpu_time(const unsigned seconds, sig_handler_type handler) { + sigset_t mask; + sigemptyset(&mask); + + struct sigaction s; + s.sa_handler = handler; + s.sa_mask = mask; +#if defined(SA_ONESHOT) + s.sa_flags = SA_ONESHOT; +#elif defined(SA_RESETHAND) + s.sa_flags = SA_RESETHAND; +#else +# error "Either SA_ONESHOT or SA_RESETHAND must be defined." +#endif + + if (sigaction(SIGXCPU, &s, 0) != 0) + fatal("sigaction failed: %s", strerror(errno)); + + struct rlimit t; + if (getrlimit(RLIMIT_CPU, &t) != 0) + fatal("getrlimit failed: %s", strerror(errno)); + + if (seconds < t.rlim_cur) { + t.rlim_cur = seconds; + if (setrlimit(RLIMIT_CPU, &t) != 0) + fatal("setrlimit failed: %s", strerror(errno)); + } +} + +#endif // PPL_LCDD_SUPPORTS_LIMIT_ON_CPU_TIME + +#if PPL_HAVE_DECL_RLIMIT_AS + +void +limit_virtual_memory(const unsigned bytes) { + struct rlimit t; + + if (getrlimit(RLIMIT_AS, &t) != 0) + fatal("getrlimit failed: %s", strerror(errno)); + + if (bytes < t.rlim_cur) { + t.rlim_cur = bytes; + if (setrlimit(RLIMIT_AS, &t) != 0) + fatal("setrlimit failed: %s", strerror(errno)); + } +} + +#else + +void +limit_virtual_memory(unsigned) { +} + +#endif // !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; + int c = getopt_long(argc, argv, OPTION_LETTERS, long_options, + &option_index); +#else + int c = getopt(argc, argv, OPTION_LETTERS); +#endif + + if (c == EOF) + break; + + char* endptr; + long l; + switch (c) { + case 0: + break; + + case '?': + case 'h': + fprintf(stdout, usage_string, argv[0]); + exit(0); + break; + +#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 = l; + break; + +#endif // defined(PPL_LCDD_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 + max_bytes_of_virtual_memory = l*1024*1024; + break; + + case 'o': + output_file_name = optarg; + break; + + case 't': + print_timings = true; + break; + + case 'v': + verbose = true; + break; + +#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& source, + std::vector& dest, + mpz_class& denominator) { + unsigned n = source.size(); + denominator = 1; + for (unsigned i = 0; i < n; ++i) + mpz_lcm(denominator.get_mpz_t(), + denominator.get_mpz_t(), + source[i].get_den().get_mpz_t()); + for (unsigned i = 0; i < n; ++i) + dest[i] = denominator*source[i]; +} + +template +bool +guarded_read(std::istream& in, T& x) { + try { + return in >> x; + } + catch (...) { + return false; + } +} + +template +void +guarded_write(std::ostream& out, const T& x) { + bool succeeded = false; + try { + succeeded = out << x; + } + catch (...) { + } + if (!succeeded) + fatal("cannot write to output file `%s'", output_file_name); +} + +#if defined (USE_POLKA) +template <> +void +guarded_write(std::ostream& out, const pkint_t& x) { + bool succeeded = false; + try { + succeeded = out << x.rep; + } + catch (...) { + } + if (!succeeded) + fatal("cannot write to output file `%s'", output_file_name); +} +#endif + +enum Number_Type { INTEGER, RATIONAL, REAL }; + +void +read_coefficients(std::istream& in, + const Number_Type number_type, + std::vector& coefficients, + mpz_class& denominator) { + unsigned num_coefficients = coefficients.size(); + switch (number_type) { + case INTEGER: + { + for (unsigned i = 0; i < num_coefficients; ++i) + if (!guarded_read(in, coefficients[i])) + error("missing or invalid integer coefficient"); + denominator = 1; + break; + } + case RATIONAL: + { + std::vector 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 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& 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 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::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::max(), '\n'); + } + + // Tools such as `lrs' produce "*****" instead of the number of + // rows. We will accept that as valid input and compute the number + // of rows ourselves. + bool has_num_rows = false; + unsigned num_rows; + if (!guarded_read(in, s)) + error("missing number of rows"); + if (s != "*****") { + std::istringstream istr(s); + if (!guarded_read(istr, num_rows)) + error("illegal number of rows `%s' (\"*****\" would be accepted)", + s.c_str()); + has_num_rows = true; + } + + unsigned num_columns; + if (!guarded_read(in, num_columns)) + error("illegal or missing number of columns"); + unsigned space_dim = num_columns - 1; + + if (!guarded_read(in, s)) + error("missing number type"); + Number_Type number_type = INTEGER; + if (s == "integer") + number_type = INTEGER; + else if (s == "rational") + number_type = RATIONAL; + else if (s == "real") + number_type = REAL; + else + error("illegal number type `%s'", s.c_str()); + + if (verbose) { + std::cerr << "Problem dimension: "; + if (has_num_rows) + std::cerr << num_rows; + else + std::cerr << '?'; + std::cerr << " x " << num_columns + << "; number type: " << s + << std::endl; + } + +#if defined(USE_PPL) + + PPL::Constraint_System cs; + PPL::Generator_System gs; + +#elif defined(USE_POLKA) + + // Initialize polka in non-strict mode. + // 25000 is a magic number: with 22500 Polka 2.0.2 dies on + // mit31-20.ine with the error "Chernikova: out of table space". + polka_initialize(polka_false, space_dim, 25000); + // Declare and allocate a Polka matrix. + matrix_t* mat = matrix_alloc(num_rows+1, space_dim+2, polka_false); + +#elif defined(USE_POLYLIB) + + // Declare and allocate a PolyLib matrix. + Matrix* mat = Matrix_Alloc(num_rows+1, space_dim+2); + +#endif + + unsigned row = 0; + std::set::iterator linearity_end = linearity.end(); + if (rep == V) { + // The V representation allows for `space_dim' coordinates. + std::vector coefficients(space_dim); + mpz_class denominator; + bool has_a_point = false; + for (row = 0; !has_num_rows || row < num_rows; ++row) { + int vertex_marker; + if (!has_num_rows) { + // Must be prepared to read an "end" here. + if (!guarded_read(in, s)) + error("missing vertex marker"); + if (s == "end") + break; + std::istringstream istr(s); + if (!guarded_read(istr, vertex_marker) + || vertex_marker < 0 || vertex_marker > 1) + error("illegal vertex marker `%s'", s.c_str()); + } + else if (!guarded_read(in, vertex_marker) + || vertex_marker < 0 || vertex_marker > 1) + error("illegal or missing vertex marker"); + read_coefficients(in, number_type, coefficients, denominator); + +#if defined(USE_PPL) + // PPL variables have indices 0, 1, ..., space_dim-1. + PPL::Linear_Expression e; + for (unsigned j = space_dim; j-- > 0; ) + e += coefficients[j] * PPL::Variable(j); +#elif defined(USE_POLKA) + // NewPolka variables have indices 2, 3, ..., space_dim+1. + for (unsigned j = space_dim; j-- > 0; ) + pkint_set(mat->p[row][j+2], coefficients[j].get_mpz_t()); +#elif defined(USE_POLYLIB) + // PolyLib variables have indices 1, 2, ..., space_dim. + for (unsigned j = space_dim; j-- > 0; ) + value_assign(mat->p[row][j+1], coefficients[j].get_mpz_t()); +#endif + if (vertex_marker == 1) { + assert(linearity.find(row+1) == linearity_end); +#if defined(USE_PPL) + gs.insert(point(e, denominator)); +#elif defined(USE_POLKA) + // NewPolka stores the generator kind at index 0 (1 = ray/point) + // and the common denominator at index 1. + pkint_set_si(mat->p[row][0], 1); + pkint_set(mat->p[row][1], denominator.get_mpz_t()); +#elif defined(USE_POLYLIB) + // PolyLib stores the generator kind at index 0 (1 = ray/point) + // and the common denominator at index space_dim+1. + value_set_si(mat->p[row][0], 1); + value_assign(mat->p[row][space_dim+1], denominator.get_mpz_t()); +#endif + has_a_point = true; + } + else if (linearity.find(row+1) != linearity_end) { +#if defined(USE_PPL) + gs.insert(line(e)); +#elif defined(USE_POLKA) + // NewPolka stores the generator kind at index 0 (0 = line) + // and the common denominator at index 1 (0 for ray/line). + pkint_set_si(mat->p[row][0], 0); + pkint_set_si(mat->p[row][1], 0); +#elif defined(USE_POLYLIB) + // PolyLib stores the generator kind at index 0 (0 = line) + // and the common denominator at index space_dim+1 (0 for ray/line). + value_set_si(mat->p[row][0], 0); + value_set_si(mat->p[row][space_dim+1], 0); +#endif + } + else { +#if defined(USE_PPL) + gs.insert(ray(e)); +#elif defined(USE_POLKA) + // NewPolka stores the generator kind at index 0 (1 = ray/point) + // and the common denominator at index 1 (0 for ray/line). + pkint_set_si(mat->p[row][0], 1); + pkint_set_si(mat->p[row][1], 0); +#elif defined(USE_POLYLIB) + // PolyLib stores the generator kind at index 0 (1 = ray/point) + // and the common denominator at index space_dim+1 (0 for ray/line). + value_set_si(mat->p[row][0], 1); + value_set_si(mat->p[row][space_dim+1], 0); +#endif + } + } + // Every non-empty generator system must have at least one point. + if (row > 0 && !has_a_point) { +#if defined(USE_PPL) + gs.insert(PPL::point()); +#elif defined(USE_POLKA) + // Add the origin as a point. + pkint_set_si(mat->p[num_rows][0], 1); + pkint_set_si(mat->p[num_rows][1], 1); + for (unsigned j = space_dim; j-- > 0; ) + pkint_set_si(mat->p[num_rows][j+2], 0); + ++num_rows; +#elif defined(USE_POLYLIB) + // Add the origin as a point. + value_set_si(mat->p[num_rows][0], 1); + value_set_si(mat->p[num_rows][space_dim+1], 1); + for (unsigned j = space_dim; j-- > 0; ) + value_set_si(mat->p[num_rows][j+1], 0); + ++num_rows; +#endif + } + + if (verbose) { + if (!has_num_rows) + std::cerr << "Problem dimension: " << row << " x " << num_columns + << "; number type: " << s + << std::endl; + +#if defined(USE_PPL) + using namespace PPL::IO_Operators; + std::cerr << "Generator system:\n" << gs << std::endl; +#elif defined(USE_POLKA) + // Polka can only print to stdout. + printf("Generator system:\n"); + matrix_print(mat); +#elif defined(USE_POLYLIB) + fprintf(stderr, "Generator system:\n"); + Matrix_Print(stderr, 0, mat); +#endif + } + } + else { + assert(rep == H); + // The H representation stores the inhomogeneous term at index 0, + // and the variables' coefficients at indices 1, 2, ..., space_dim. + std::vector coefficients(space_dim+1); + mpz_class denominator; + for (row = 0; !has_num_rows || row < num_rows; ++row) { + if (!has_num_rows) { + // Must be prepared to read an "end" here. + std::getline(in, s); + if (!in) + error("premature end of file while seeking " + "for coefficients or `end'"); + if (s.substr(0, 2) == "end") + break; + std::istringstream istr(s); + read_coefficients(istr, number_type, coefficients, denominator); + } + else + read_coefficients(in, number_type, coefficients, denominator); + +#if defined(USE_PPL) + // PPL variables have indices 0, 1, ..., space_dim-1. + PPL::Linear_Expression e; + for (unsigned j = num_columns; j-- > 1; ) + e += coefficients[j] * PPL::Variable(j-1); + e += coefficients[0]; +#elif defined(USE_POLKA) + // NewPolka variables have indices 2, 3, ..., space_dim+1. + for (unsigned j = num_columns; j-- > 1; ) + pkint_set(mat->p[row][j+1], coefficients[j].get_mpz_t()); + // NewPolka stores the inhomogeneous term at index 1. + pkint_set(mat->p[row][1], coefficients[0].get_mpz_t()); +#elif defined(USE_POLYLIB) + // PolyLib variables have indices 1, 2, ..., space_dim. + for (unsigned j = num_columns; j-- > 1; ) + value_assign(mat->p[row][j], coefficients[j].get_mpz_t()); + // PolyLib stores the inhomogeneous term at index space_dim+1. + value_assign(mat->p[row][space_dim+1], coefficients[0].get_mpz_t()); +#endif + + if (linearity.find(row+1) != linearity_end) { +#if defined(USE_PPL) + cs.insert(e == 0); +#elif defined(USE_POLKA) + // NewPolka stores the constraint kind at index 0 (0 = equality). + pkint_set_si(mat->p[row][0], 0); +#elif defined(USE_POLYLIB) + // PolyLib stores the constraint kind at index 0 (0 = equality). + value_set_si(mat->p[row][0], 0); +#endif + } + else { +#if defined(USE_PPL) + cs.insert(e >= 0); +#elif defined(USE_POLKA) + // NewPolka stores the constraint kind at index 0 (1 = inequality). + pkint_set_si(mat->p[row][0], 1); +#elif defined(USE_POLYLIB) + // PolyLib stores the constraint kind at index 0 (1 = inequality). + value_set_si(mat->p[row][0], 1); +#endif + } + } + + if (verbose) { + if (!has_num_rows) + std::cerr << "Problem dimension: " << row << " x " << num_columns + << "; number type: " << s + << std::endl; + +#if defined(USE_PPL) + using namespace PPL::IO_Operators; + std::cerr << "Constraint system:\n" << cs << std::endl; +#elif defined(USE_POLKA) + // Polka can only print to stdout. + printf("Constraint system:\n"); + matrix_print(mat); +#elif defined(USE_POLYLIB) + fprintf(stderr, "Constraint system:\n"); + Matrix_Print(stderr, 0, mat); +#endif + } + } + + if (has_num_rows) { + if (!guarded_read(in, s)) + error("premature end of file while seeking for `end'"); + + if (s != "end") + error("`%s' found while seeking for `end'", s.c_str()); + } + + if (rep == H) { +#if defined(USE_PPL) + ph = PPL::C_Polyhedron(cs, 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 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::const_iterator j = linearity.begin(), + linearity_end = linearity.end(); j != linearity_end; ++j) { + guarded_write(out, ' '); + guarded_write(out, *j); + } + guarded_write(out, '\n'); + } + +#if defined(USE_PPL) + PPL::dimension_type space_dim = ph.space_dimension(); +#elif defined(USE_POLKA) + unsigned space_dim = poly_dimension(ph); +#elif defined(USE_POLYLIB) + unsigned space_dim = mat->NbColumns - 2; +#endif + + guarded_write(out, "begin\n"); + guarded_write(out, num_rows); + guarded_write(out, ' '); + guarded_write(out, space_dim+1); + guarded_write(out, ' '); + if (rep == H) + guarded_write(out, "integer\n"); + else + guarded_write(out, "rational\n"); + +#if defined(USE_PPL) + if (rep == H) { + const PPL::Constraint_System& cs = ph.constraints(); + for (PPL::Constraint_System::const_iterator i = cs.begin(), + cs_end = cs.end(); i != cs_end; ++i) { + const PPL::Constraint& c = *i; + guarded_write(out, c.inhomogeneous_term()); + for (PPL::dimension_type j = 0; j < space_dim; ++j) { + guarded_write(out, ' '); + guarded_write(out, c.coefficient(PPL::Variable(j))); + } + guarded_write(out, '\n'); + } + } + else { + assert(rep == V); + const PPL::Generator_System& gs = ph.generators(); + for (PPL::Generator_System::const_iterator i = gs.begin(), + gs_end = gs.end(); i != gs_end; ++i) { + const PPL::Generator& g = *i; + if (g.is_point()) { + guarded_write(out, '1'); + const PPL::Coefficient& divisor = g.divisor(); + for (PPL::dimension_type j = 0; j < space_dim; ++j) { + guarded_write(out, ' '); + if (g.coefficient(PPL::Variable(j)) == 0) + guarded_write(out, '0'); + else { + mpz_class num, den; + PPL::assign_r(num, + g.coefficient(PPL::Variable(j)), + PPL::ROUND_NOT_NEEDED); + PPL::assign_r(den, divisor, PPL::ROUND_NOT_NEEDED); + guarded_write(out, mpq_class(num, den)); + } + } + } + else { + // `g' is a ray or a line. + guarded_write(out, '0'); + for (PPL::dimension_type j = 0; j < space_dim; ++j) { + guarded_write(out, ' '); + guarded_write(out, g.coefficient(PPL::Variable(j))); + } + } + guarded_write(out, '\n'); + } + } +#elif defined(USE_POLKA) + if (rep == H) { + for (unsigned i = 0; i < num_rows; ++i) { + const pkint_t* c = mat->p[i]; + // The inhomogeneous term. + guarded_write(out, c[1]); + // The variables' coefficients. + for (unsigned j = 0; j < space_dim; ++j) { + guarded_write(out, ' '); + guarded_write(out, c[j+2]); + } + guarded_write(out, '\n'); + } + } + else { + assert(rep == V); + for (unsigned i = 0; i < num_rows; ++i) { + const pkint_t* g = mat->p[i]; + guarded_write(out, g[0]); + const pkint_t divisor = g[1]; + if (pkint_sgn(divisor) != 0) + // `g' is a point. + for (unsigned j = 0; j < space_dim; ++j) { + guarded_write(out, ' '); + if (pkint_sgn(g[j+2]) == 0) + guarded_write(out, '0'); + else + guarded_write(out, mpq_class(mpz_class(g[j+2].rep), + mpz_class(divisor.rep))); + } + else + // `g' is a ray or a line. + for (unsigned j = 0; j < space_dim; ++j) { + guarded_write(out, ' '); + guarded_write(out, g[j+2]); + } + guarded_write(out, '\n'); + } + } +#elif defined (USE_POLYLIB) + if (rep == H) { + for (unsigned i = 0; i < num_rows; ++i) { + const Value* c = mat->p[i]; + // The inhomogeneous term. + guarded_write(out, c[space_dim+1]); + // The variables' coefficients. + for (unsigned j = 0; j < space_dim; ++j) { + guarded_write(out, ' '); + guarded_write(out, c[j+1]); + } + guarded_write(out, '\n'); + } + } + else { + assert(rep == V); + for (unsigned i = 0; i < num_rows; ++i) { + const Value* g = mat->p[i]; + guarded_write(out, g[0]); + const Value& divisor = g[space_dim+1]; + if (value_sign(divisor) != 0) + // `g' is a point. + for (unsigned j = 0; j < space_dim; ++j) { + guarded_write(out, ' '); + if (value_sign(g[j+1]) == 0) + guarded_write(out, '0'); + else + guarded_write(out, mpq_class(mpz_class(g[j+1]), + mpz_class(divisor))); + } + else + // `g' is a ray or a line. + for (unsigned j = 0; j < space_dim; ++j) { + guarded_write(out, ' '); + guarded_write(out, g[j+1]); + } + guarded_write(out, '\n'); + } + } +#endif + guarded_write(out, "end\n"); + + // Flush `out'. + bool flush_succeeded = false; + try { + flush_succeeded = out.flush(); + } + catch (...) { + } + if (!flush_succeeded) + fatal("cannot write to output file `%s'", output_file_name); +} + +} // namespace + +int +main(int argc, char* argv[]) try { + program_name = argv[0]; + +#if defined(USE_PPL) + if (strcmp(PPL_VERSION, PPL::version()) != 0) + fatal("was compiled with PPL version %s, but linked with version %s", + PPL_VERSION, PPL::version()); + + if (verbose) + std::cerr << "Parma Polyhedra Library version:\n" << PPL::version() + << "\n\nParma Polyhedra Library banner:\n" << PPL::banner() + << std::endl; +#endif + + // Process command line options. + process_options(argc, argv); + +#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; + 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::max(), '\n'); + } + + +#if defined(USE_PPL) || defined(USE_POLKA) + maybe_start_clock(); +#endif + + // Compute the dual representation. + if (rep == V) { + command = V_to_H; +#if defined(USE_PPL) + ph.minimized_constraints(); +#elif defined(USE_POLKA) + poly_minimize(ph); +#endif + } + else { + command = H_to_V; +#if defined(USE_PPL) + ph.minimized_generators(); +#elif defined(USE_POLKA) + poly_minimize(ph); +#endif + } + +#if defined(USE_PPL) || defined(USE_POLKA) + maybe_print_clock(); +#endif + + // Write the result of the conversion. + if (rep == V) + write_polyhedron(output(), ph, H); + else + write_polyhedron(output(), ph, V); + +#if defined(USE_PPL) + // Check the result, if requested to do so. + if (check_file_name) { + set_input(check_file_name); + // Read the polyhedron containing the expected result. + PPL::C_Polyhedron e_ph; + Representation e_rep = read_polyhedron(input(), e_ph); + + switch (command) { + case H_to_V: + { + if (e_rep == H) + warning("checking an H-to-V conversion with an H representation"); + + // Count the number of generators of `ph'. + unsigned ph_num_generators = 0; + const PPL::Generator_System& ph_gs = ph.generators(); + for (PPL::Generator_System::const_iterator i = ph_gs.begin(), + ph_gs_end = ph_gs.end(); i != ph_gs_end; ++i) + ++ph_num_generators; + + // Count the number of generators of `e_ph'. + unsigned e_ph_num_generators = 0; + const PPL::Generator_System& e_ph_gs = e_ph.generators(); + for (PPL::Generator_System::const_iterator i = e_ph_gs.begin(), + e_ph_gs_end = e_ph_gs.end(); i != e_ph_gs_end; ++i) + ++e_ph_num_generators; + + // If the polyhedra differ, that is the problem. + if (ph != e_ph) { + if (verbose) + std::cerr << "Check failed: polyhedra differ" + << std::endl; + return 1; + } + else if (ph_num_generators != e_ph_num_generators) + // If we have different number of generators, we fail. + std::cerr << "Check failed: different number of generators:\n" + << "expected " << e_ph_num_generators + << ", obtained " << ph_num_generators + << std::endl; + break; + } + case V_to_H: + { + if (e_rep == V) + warning("checking an V-to-H conversion with a V representation"); + + // Count the number of constraints of `ph'. + unsigned ph_num_constraints = 0; + const PPL::Constraint_System& ph_cs = ph.constraints(); + for (PPL::Constraint_System::const_iterator i = ph_cs.begin(), + ph_cs_end = ph_cs.end(); i != ph_cs_end; ++i) + ++ph_num_constraints; + + // Count the number of constraints of `e_ph'. + unsigned e_ph_num_constraints = 0; + const PPL::Constraint_System& e_ph_cs = e_ph.constraints(); + for (PPL::Constraint_System::const_iterator i = e_ph_cs.begin(), + e_ph_cs_end = e_ph_cs.end(); i != e_ph_cs_end; ++i) + ++e_ph_num_constraints; + + // If the polyhedra differ, that is the problem. + if (ph != e_ph) { + if (verbose) + std::cerr << "Check failed: polyhedra differ" + << std::endl; + return 1; + } + else if (ph_num_constraints != e_ph_num_constraints) + // If we have different number of constraints, we fail. + std::cerr << "Check failed: different number of constraints:\n" + << "expected " << e_ph_num_constraints + << ", obtained " << ph_num_constraints + << std::endl; + break; + } + case None: + break; + } + } +#endif + +#if defined(USE_POLKA) + // Finalize the library. + polka_finalize(); +#endif + + return 0; +} +catch (const std::bad_alloc&) { + fatal("out of memory"); + exit(1); +} +catch (const std::overflow_error& e) { + fatal("arithmetic overflow (%s)", e.what()); + exit(1); +} +catch (...) { + fatal("internal error: please submit a bug report to ppl-devel@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..2f3e464 --- /dev/null +++ b/demos/ppl_lpsol/Makefile.am @@ -0,0 +1,310 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +SUBDIRS = examples + +EXTRA_DIST = \ +ppl_lpsol.c \ +expected_mpz \ +expected_mpz_a \ +expected_int8 \ +expected_int8_a \ +expected_int16 \ +expected_int16_a \ +expected_int32 \ +expected_int32_a \ +expected_int64 \ +expected_int64_a + +if BUILD_C_INTERFACE +if HAVE_GLPK + +AM_CPPFLAGS = \ +-I$(top_builddir)/interfaces/C \ +@extra_includes@ + +if GCC + +# We cannot use -std=c89 because of the definition of sigaction in . +AM_CFLAGS = -pedantic -std=gnu89 -Werror + +endif GCC + +bin_PROGRAMS = ppl_lpsol + +# dummy.cc serves the only purpose to force linking using the C++ compiler. +ppl_lpsol_SOURCES = \ +ppl_lpsol.c \ +dummy.cc + +ppl_lpsol_LDADD = \ +-lglpk \ +$(top_builddir)/interfaces/C/libppl_c.la \ +@extra_libraries@ + +dist_man_MANS = \ +ppl_lpsol.1 + +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 + +DO_NOT_CHECK_PROBLEMS = \ +ex12.mps \ +mas74.mps \ +mas76.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 + echo $(LP_PROBLEMS) >lp_problems + echo $(DO_NOT_CHECK_PROBLEMS) >do_not_check_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 do_not_check_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 do_not_check_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 do_not_check_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 do_not_check_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) "-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) "-r -m mas76.mps" >>obtained + -$(SIMPLEX) -r -m $(srcdir)/examples/mas76.mps >/dev/null + $(ECHO_SIMPLEX) "-r -M -c0.000123 mas76.mps" >>obtained + -$(SIMPLEX_NOCHECK) -r -M -c0.000123 $(srcdir)/examples/mas76.mps >/dev/null + $(ECHO_SIMPLEX) "-n mas76.mps" >>obtained + -$(SIMPLEX) -n $(srcdir)/examples/mas76.mps >/dev/null + $(ECHO_SIMPLEX_NOCHECK) "-r -m -c0.0000002 modglob.mps" >>obtained + -$(SIMPLEX_NOCHECK) -r -m -c0.0000002 $(srcdir)/examples/modglob.mps >/dev/null + $(ECHO_SIMPLEX_NOCHECK) "-r -M -c0.000003 modglob.mps" >>obtained + -$(SIMPLEX_NOCHECK) -r -M -c0.000003 $(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 = \ +do_not_check_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..a29f8ba --- /dev/null +++ b/demos/ppl_lpsol/Makefile.in @@ -0,0 +1,1021 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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@ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@bin_PROGRAMS = \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ ppl_lpsol$(EXEEXT) +subdir = demos/ppl_lpsol +DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" +binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) +PROGRAMS = $(bin_PROGRAMS) +am__ppl_lpsol_SOURCES_DIST = ppl_lpsol.c dummy.cc +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@am_ppl_lpsol_OBJECTS = \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ ppl_lpsol.$(OBJEXT) \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ dummy.$(OBJEXT) +ppl_lpsol_OBJECTS = $(am_ppl_lpsol_OBJECTS) +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ppl_lpsol_DEPENDENCIES = $(top_builddir)/interfaces/C/libppl_c.la +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(ppl_lpsol_SOURCES) +DIST_SOURCES = $(am__ppl_lpsol_SOURCES_DIST) +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-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 uninstall-recursive +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(dist_man_MANS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +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 + +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@AM_CPPFLAGS = \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@-I$(top_builddir)/interfaces/C \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@extra_includes@ + + +# We cannot use -std=c89 because of the definition of sigaction in . +@BUILD_C_INTERFACE_TRUE@@GCC_TRUE@@HAVE_GLPK_TRUE@AM_CFLAGS = -pedantic -std=gnu89 -Werror + +# dummy.cc serves the only purpose to force linking using the C++ compiler. +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ppl_lpsol_SOURCES = \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ppl_lpsol.c \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@dummy.cc + +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ppl_lpsol_LDADD = \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@-lglpk \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@$(top_builddir)/interfaces/C/libppl_c.la \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@extra_libraries@ + +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@dist_man_MANS = \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ppl_lpsol.1 + +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@COEFFICIENT_MNEMONIC = @coefficient_mnemonic@ +@ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@TOUGH_EXAMPLES_FOR_ENUM_IF_ASSERTIONS_ENABLED = \ +@ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@afiro.mps + +@ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@TOUGH_EXAMPLES_FOR_SIMPLEX_IF_ASSERTIONS_ENABLED = \ +@ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@opt1217.mps \ +@ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@rout.mps + +@ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@TOUGH_EXAMPLES_FOR_BB_SATISFIABILTY_IF_ASSERTIONS_ENABLED = \ +@ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@mas74.mps \ +@ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@mas76.mps \ +@ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@modglob.mps \ +@ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@noswot.mps \ +@ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@opt1217.mps \ +@ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@pk1.mps \ +@ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@rout.mps + +@ASSERTIONS_ENABLED_FALSE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@EXPECTED = expected_$(COEFFICIENT_MNEMONIC) +@ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@EXPECTED = expected_$(COEFFICIENT_MNEMONIC)_a +@ASSERTIONS_ENABLED_FALSE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@CHECK_OPTION = -c +@ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@CHECK_OPTION = +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@TOUGH_EXAMPLES_FOR_ENUM = \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@adlittle.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@blend.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@boeing1.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@boeing2.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@egout.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@kb2.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@lseu.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@markshare1.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@markshare2.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@mas74.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@mas76.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@modglob.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@noswot.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@opt1217.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@p0033.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@pk1.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@rout.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@sc105.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@sc50a.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@sc50b.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ship08l.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@$(TOUGH_EXAMPLES_FOR_ENUM_IF_ASSERTIONS_ENABLED) + +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@TOUGH_EXAMPLES_FOR_SIMPLEX = \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ship08l.mps\ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@$(TOUGH_EXAMPLES_FOR_SIMPLEX_IF_ASSERTIONS_ENABLED) + +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@TOUGH_EXAMPLES_FOR_BB_SATISFIABILITY = \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@$(TOUGH_EXAMPLES_FOR_BB_SATISFIABILTY_IF_ASSERTIONS_ENABLED) + +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@TOUGH_EXAMPLES_FOR_BB_OPTIMALITY = \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@egout.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@lseu.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@markshare1.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@markshare2.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@mas74.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@mas76.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@modglob.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@noswot.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@opt1217.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@pk1.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@rout.mps + +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@LP_PROBLEMS = \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@adlittle.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@afiro.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@bgprtr.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@blend.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@boeing1.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@boeing2.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@kb2.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@sample.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@sc105.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@sc50a.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@sc50b.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ship08l.mps + +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@DO_NOT_OUTPUT_OPTIMUM_LOCATION_PROBLEMS = \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@adlittle.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@boeing1.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@boeing2.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@rout.mps + +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@DO_NOT_CHECK_PROBLEMS = \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ex12.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@mas74.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@mas76.mps \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@modglob.mps + +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_FALSE@@HOST_OS_SOLARIS_FALSE@DIFF_COMMAND = diff -u $(srcdir)/$(EXPECTED) obtained +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_TRUE@@HOST_OS_SOLARIS_FALSE@DIFF_COMMAND = \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_TRUE@@HOST_OS_SOLARIS_FALSE@tr -d '\015' expected_optima \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_SOLARIS_TRUE@&& $(EGREP) "^Optimum value: " obtained \ +@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 \ +@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 + +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_TRUE@DIFF_COMMAND = \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_TRUE@$(EGREP) "^Optimum value: " $(srcdir)/$(EXPECTED) >expected_optima \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_TRUE@&& $(EGREP) "^Optimum value: " obtained >obtained_optima \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_TRUE@&& diff -u expected_optima obtained_optima + +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_TRUE@DIFF_COMMAND = \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_TRUE@$(EGREP) "^Optimum value: " $(srcdir)/$(EXPECTED) >expected_optima \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_TRUE@&& $(EGREP) "^Optimum value: " obtained >obtained_optima \ +@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. +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@SIMPLEX = ./ppl_lpsol$(EXEEXT) -s -p1 $(CHECK_OPTION) -oobtained +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@SIMPLEX_NOCHECK = ./ppl_lpsol$(EXEEXT) -s -p1 -oobtained +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ECHO_SIMPLEX = echo "***" $(SIMPLEX) +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ECHO_SIMPLEX_NOCHECK = echo "***" $(SIMPLEX_NOCHECK) +MOSTLYCLEANFILES = \ +do_not_check_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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign demos/ppl_lpsol/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign demos/ppl_lpsol/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + if test -f $$p \ + || test -f $$p1 \ + ; then \ + f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ + else :; fi; \ + done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ + rm -f "$(DESTDIR)$(bindir)/$$f"; \ + done + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +ppl_lpsol$(EXEEXT): $(ppl_lpsol_OBJECTS) $(ppl_lpsol_DEPENDENCIES) + @rm -f ppl_lpsol$(EXEEXT) + $(CXXLINK) $(ppl_lpsol_OBJECTS) $(ppl_lpsol_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummy.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppl_lpsol.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +.cc.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-man1: $(man1_MANS) $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ + else file=$$i; fi; \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 1*) ;; \ + *) ext='1' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ + done +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 1*) ;; \ + *) ext='1' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ + rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ + done + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + distdir) \ + || exit 1; \ + fi; \ + done +@BUILD_C_INTERFACE_FALSE@check-local: +@HAVE_GLPK_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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-recursive + +install-exec-am: install-binPROGRAMS + +install-html: install-html-recursive + +install-info: install-info-recursive + +install-man: install-man1 + +install-pdf: install-pdf-recursive + +install-ps: install-ps-recursive + +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: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ + install-strip + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am check-local clean clean-binPROGRAMS \ + clean-generic clean-libtool ctags ctags-recursive 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-recursive uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-man uninstall-man1 + + +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@check-local: ppl_lpsol$(EXEEXT) +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ echo $(ECHO_N) "$(ECHO_C)" >obtained +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ echo $(LP_PROBLEMS) >lp_problems +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ echo $(DO_NOT_CHECK_PROBLEMS) >do_not_check_problems +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ export LC_ALL=C; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ echo $(TOUGH_EXAMPLES_FOR_BB_SATISFIABILITY) >tough_examples +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -for path in $(srcdir)/examples/*.mps; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ do \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ file=`basename $$path`; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(FGREP) $$file lp_problems >/dev/null 2>&1 && continue; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(FGREP) $$file do_not_check_problems >/dev/null 2>&1 && continue; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(ECHO_SIMPLEX) "-n $$m $$file" >>obtained; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(SIMPLEX) -n $$path >/dev/null; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ done +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ echo $(TOUGH_EXAMPLES_FOR_BB_OPTIMALITY) >tough_examples +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -for path in $(srcdir)/examples/*.mps; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ do \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ file=`basename $$path`; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(FGREP) $$file lp_problems >/dev/null 2>&1 && continue; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(FGREP) $$file do_not_check_problems >/dev/null 2>&1 && continue; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ for m in -m -M; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ do \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(ECHO_SIMPLEX) "$$m $$file" >>obtained; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(SIMPLEX) $$m $$path >/dev/null; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ done \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ done +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ echo $(TOUGH_EXAMPLES_FOR_SIMPLEX) >tough_examples +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ echo $(DO_NOT_OUTPUT_OPTIMUM_LOCATION_PROBLEMS) >do_not_output_location +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -for path in $(srcdir)/examples/*.mps; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ do \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ file=`basename $$path`; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(FGREP) $$file do_not_check_problems >/dev/null 2>&1 && continue; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ verbosity=''; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(FGREP) $$file do_not_output_location >/dev/null 2>&1 && verbosity='-v 2'; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ for m in -m -M; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ do \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(ECHO_SIMPLEX) "-r $$m $$file" >>obtained; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(SIMPLEX) -r $$verbosity $$m $$path >/dev/null; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ done \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ done +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ echo $(TOUGH_EXAMPLES_FOR_ENUM) >tough_examples +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -for path in $(srcdir)/examples/*.mps; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ do \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ file=`basename $$path`; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(FGREP) $$file do_not_check_problems >/dev/null 2>&1 && continue; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ echo "*** ppl_lpsol -e -r $$m -oobtained $$file" >>obtained; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ ./ppl_lpsol$(EXEEXT) -e -r $(CHECK_OPTION) $$m -oobtained $$path >/dev/null; \ +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ done +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(ECHO_SIMPLEX) "-r -m mas74.mps" >>obtained +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -$(SIMPLEX) -r -m $(srcdir)/examples/mas74.mps >/dev/null +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(ECHO_SIMPLEX_NOCHECK) "-r -M -c0.000123 mas74.mps" >>obtained +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -$(SIMPLEX_NOCHECK) -r -M -c0.000123 $(srcdir)/examples/mas74.mps $$m >/dev/null +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(ECHO_SIMPLEX) "-n mas74.mps" >>obtained +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -$(SIMPLEX) -n $(srcdir)/examples/mas74.mps >/dev/null +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(ECHO_SIMPLEX) "-r -m mas76.mps" >>obtained +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -$(SIMPLEX) -r -m $(srcdir)/examples/mas76.mps >/dev/null +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(ECHO_SIMPLEX) "-r -M -c0.000123 mas76.mps" >>obtained +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -$(SIMPLEX_NOCHECK) -r -M -c0.000123 $(srcdir)/examples/mas76.mps >/dev/null +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(ECHO_SIMPLEX) "-n mas76.mps" >>obtained +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -$(SIMPLEX) -n $(srcdir)/examples/mas76.mps >/dev/null +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(ECHO_SIMPLEX_NOCHECK) "-r -m -c0.0000002 modglob.mps" >>obtained +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -$(SIMPLEX_NOCHECK) -r -m -c0.0000002 $(srcdir)/examples/modglob.mps >/dev/null +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(ECHO_SIMPLEX_NOCHECK) "-r -M -c0.000003 modglob.mps" >>obtained +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -$(SIMPLEX_NOCHECK) -r -M -c0.000003 $(srcdir)/examples/modglob.mps >/dev/null +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(ECHO_SIMPLEX) "-n modglob.mps" >>obtained +@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ -$(SIMPLEX) -n $(srcdir)/examples/modglob.mps >/dev/null +@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..fbf56a6 --- /dev/null +++ b/demos/ppl_lpsol/dummy.cc @@ -0,0 +1 @@ +// This file intentionally contains only this comment. diff --git a/demos/ppl_lpsol/examples/Makefile.am b/demos/ppl_lpsol/examples/Makefile.am new file mode 100644 index 0000000..f0bc3fb --- /dev/null +++ b/demos/ppl_lpsol/examples/Makefile.am @@ -0,0 +1,51 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +dist_noinst_DATA = \ +adlittle.mps \ +afiro.mps \ +bgprtr.mps \ +blend.mps \ +boeing1.mps \ +boeing2.mps \ +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..2158eb7 --- /dev/null +++ b/demos/ppl_lpsol/examples/Makefile.in @@ -0,0 +1,475 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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 = README $(dist_noinst_DATA) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +DATA = $(dist_noinst_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign demos/ppl_lpsol/examples/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign demos/ppl_lpsol/examples/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +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 + +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 \ + 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 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..cd267e5 --- /dev/null +++ b/demos/ppl_lpsol/examples/blend.mps @@ -0,0 +1,359 @@ +NAME BLEND BRUCE MURTAGHS BLENDING PROBLEM (MINIMIZE). +ROWS + E 1 + E 2 + E 3 + E 4 + E 5 + E 6 + E 7 + E 8 + E 9 + E 10 + E 11 + E 12 + E 13 + E 14 + E 15 + E 16 + E 17 + E 18 + E 19 + E 20 + E 21 + E 22 + E 23 + E 24 + E 25 + E 26 + E 27 + E 28 + E 29 + E 30 + E 31 + E 32 + E 33 + E 34 + E 35 + E 36 + E 37 + E 38 + E 39 + E 40 + E 41 + E 42 + E 43 + L 44 + L 45 + L 46 + L 47 + L 48 + L 49 + L 50 + L 51 + L 52 + L 53 + L 54 + L 55 + L 56 + L 57 + L 58 + L 59 + L 60 + L 61 + L 62 + L 63 + L 64 + L 65 + L 66 + L 67 + L 68 + L 69 + L 70 + L 71 + L 72 + L 73 + L 74 + N C +COLUMNS + 1 2 -.537 3 -.131 + 1 4 -.1155 5 -.0365 + 1 6 -.143 7 -.037 + 1 40 .003 41 .0587 + 1 42 .15 43 .302 + 1 67 1. C 3.2 + 2 1 -.2931 3 -.117 + 2 4 -.0649 5 -.1233 + 2 6 -.2217 8 -.18 + 2 39 .0042 40 .003 + 2 41 .1053 42 .185 + 2 43 .384 50 -.00862 + 2 51 -.00862 56 -.0101 + 2 57 -.0101 68 1. + 2 C 2.87 + 3 2 1. 9 -.0277 + 3 10 -.0563 11 -.199 + 3 12 -.6873 13 -.017 + 3 40 .01303 41 .0506 + 3 42 .209 43 .495 + 3 65 1. + 4 1 1. 9 -.0112 + 4 10 -.0378 11 -.1502 + 4 12 -.7953 13 -.0099 + 4 40 .01303 41 .0448 + 4 42 .185 43 .721 + 4 65 1. + 5 9 -.175 10 -.27 + 5 11 -.028 13 -.455 + 5 21 1. 40 .01303 + 5 41 .0506 42 .209 + 5 43 .495 + 6 9 -.271 10 -.3285 + 6 11 -.0255 13 -.2656 + 6 18 1. 40 .01303 + 6 41 .0506 42 .209 + 6 43 .495 + 7 9 -.2836 10 -.3285 + 7 11 -.0241 13 -.2502 + 7 17 1. 40 .01303 + 7 41 .0506 42 .209 + 7 43 .495 + 8 12 1. 14 -1. + 8 39 .0327 41 .094 + 8 42 .045 43 .793 + 8 C .0044 + 9 15 -1. 22 1. + 10 16 -1. 22 1. + 11 14 1. 15 -1. + 12 14 1. 16 -1. + 13 15 1. 17 -.0588 + 13 19 -.8145 23 -.0091 + 13 39 -.8239 40 .0081 + 13 41 -.2112 42 .387 + 13 43 1.03 69 1.3 + 13 C .07 + 14 16 1. 18 -.0404 + 14 20 -.8564 23 -.0069 + 14 39 -.7689 40 .0063 + 14 41 -.156 42 .297 + 14 43 .792 69 1. + 14 C .0378 + 15 5 1. 21 -.3321 + 15 22 -.5875 23 -.362 + 15 39 2.3 41 -.2049 + 15 42 .826 43 14.61 + 15 65 1. 70 1. + 15 C .155 + 16 6 1. 21 -.3321 + 16 22 -.5875 23 -.362 + 16 39 2.3 41 -.2049 + 16 42 .826 43 14.61 + 16 66 1. 70 1. + 16 C .155 + 17 4 1. 21 -.2414 + 17 22 -.6627 23 -.293 + 17 39 2.3 41 -.1531 + 17 42 .826 43 14.61 + 17 65 1. 70 1. + 17 C .155 + 18 21 -.2414 22 -.6627 + 18 23 -.293 28 1. + 18 39 2.3 41 -.1531 + 18 42 .826 43 14.61 + 18 70 1. C .155 + 19 5 1. 10 -.0185 + 19 13 -.0568 24 -.0806 + 19 25 -.0658 26 -.0328 + 19 27 -.4934 28 -.2922 + 19 29 -.0096 40 -.0654 + 19 41 -.2535 42 .632 + 19 43 .6807 65 1. + 19 71 1. C .0528 + 20 6 1. 10 -.0185 + 20 13 -.0568 24 -.0806 + 20 25 -.0658 26 -.0328 + 20 27 -.4934 28 -.2922 + 20 29 -.0096 40 -.0654 + 20 41 -.2535 42 .632 + 20 43 .6807 66 1. + 20 71 1. C .0528 + 21 4 1. 10 -.0184 + 21 13 -.0564 24 -.078 + 21 25 -.0655 26 -.0303 + 21 27 -.475 28 -.305 + 21 40 -.0654 41 -.2703 + 21 42 .632 43 .6807 + 21 65 1. 71 1. + 21 C .0528 + 22 3 1. 10 -.0184 + 22 13 -.0564 24 -.078 + 22 25 -.0655 26 -.0303 + 22 27 -.475 28 -.305 + 22 40 -.0654 41 -.2703 + 22 42 .632 43 .6807 + 22 65 1. 71 1. + 22 C .0528 + 23 13 .76 25 .5714 + 23 30 -1. 40 .1869 + 23 41 .2796 42 2.241 + 23 43 2.766 72 1. + 23 C .128 + 24 9 -.0571 10 -.0114 + 24 13 .6571 24 .5714 + 24 31 -1. 40 .1724 + 24 41 .2579 42 2.067 + 24 43 2.552 72 1. + 24 C .118 + 25 9 -1. 25 1. + 26 10 -1. 24 1. + 27 10 -1. 13 1. + 28 11 1. 32 -1. + 28 44 -7.95 45 -8.7 + 28 46 -3. 47 14. + 28 48 1. 49 -1. + 29 23 1. 32 -1. + 29 44 -8.84 45 -9.45 + 29 46 -3. 47 12. + 29 48 1. 49 -1. + 30 19 1. 32 -1. + 30 44 -9.43 45 -9.57 + 30 46 -3. 47 3.5 + 30 48 .233 49 -.358 + 31 20 1. 32 -1. + 31 44 -9.03 45 -9.32 + 31 46 -3. 47 3.5 + 31 48 .205 49 -.333 + 32 27 1. 32 -1. + 32 44 -9.23 45 -9.22 + 32 46 -3. 47 6. + 32 48 .381 49 -.509 + 33 30 1. 32 -1. + 33 44 -9.4 45 -9.85 + 33 46 -3. 47 2.5 + 33 48 .39 49 -.77 + 34 31 1. 32 -1. + 34 44 -9.74 45 -10.1 + 34 46 -3. 47 3.3 + 34 48 .233 49 -.58 + 35 10 1. 32 -1. + 35 44 -9.74 45 -9.9 + 35 46 -3. 47 66. + 35 48 1. 49 -1. + 36 44 -.493 45 -.165 + 36 46 1. C .0924 + 37 32 1. 44 10.03 + 37 45 10.03 47 -9.5 + 37 48 -.5 49 .5 + 37 73 .64 74 .35 + 37 C -5.36 + 38 11 1. 33 -1. + 38 50 -7.98 51 -8.58 + 38 52 -3. 53 14. + 38 54 1. 55 -1. + 39 23 1. 33 -1. + 39 50 -8.87 51 -9.33 + 39 52 -3. 53 12. + 39 54 1. 55 -1. + 40 19 1. 33 -1. + 40 50 -9.46 51 -9.45 + 40 52 -3. 53 3.5 + 40 54 .233 55 -.358 + 41 20 1. 33 -1. + 41 50 -9.06 51 -9.2 + 41 52 -3. 53 3.5 + 41 54 .205 55 -.333 + 42 27 1. 33 -1. + 42 50 -9.26 51 -9.13 + 42 52 -3. 53 6. + 42 54 .318 55 -.509 + 43 10 1. 33 -1. + 43 50 -9.77 51 -9.78 + 43 52 -3. 53 66. + 43 54 1. 55 -1. + 44 50 -.435 51 -.208 + 44 52 1. C .0924 + 45 33 1. 50 9.65 + 45 51 9.65 53 -9.5 + 45 54 -.5 55 .5 + 45 73 -.36 74 .35 + 45 C -5.08 + 46 11 1. 36 -1. + 46 56 -7.99 57 -8.59 + 46 58 -3. 59 14. + 46 60 1. 61 -1. + 47 23 1. 36 -1. + 47 56 -8.88 57 -9.34 + 47 58 -3. 59 12. + 47 60 1. 61 -1. + 48 19 1. 36 -1. + 48 56 -9.47 57 -9.46 + 48 58 -3. 59 3.5 + 48 60 .233 61 -.358 + 49 20 1. 36 -1. + 49 56 -9.07 57 -9.21 + 49 58 -3. 59 3.5 + 49 60 .205 61 -.333 + 50 27 1. 36 -1. + 50 56 -9.27 57 -9.14 + 50 58 -3. 59 6. + 50 60 .318 61 -.509 + 51 10 1. 36 -1. + 51 56 -9.78 57 -9.79 + 51 58 -3. 59 66. + 51 60 1. 61 -1. + 52 56 -.426 57 -.204 + 52 58 1. C .0924 + 53 36 1. 56 9.05 + 53 57 9.05 59 -9.5 + 53 60 -.5 61 .5 + 53 73 -.36 74 -.65 + 53 C -4.51 + 54 9 -1. 26 1. + 55 9 1. 37 -1. + 56 10 1. 37 -1. + 57 37 1. C -2.75 + 58 11 1. 38 -1. + 58 63 -14. 64 14. + 59 12 1. 38 -1. + 59 63 -.8 64 .8 + 60 38 1. 63 2. + 60 64 -3. C -4.2 + 61 4 1. 34 -1. + 62 3 1. 34 -1. + 63 34 1. 65 1. + 63 C -3.6 + 64 7 1. 35 -1. + 64 62 10.1 + 65 8 1. 35 -1. + 65 62 12.63 + 66 6 1. 35 -1. + 66 62 8.05 66 1. + 67 5 1. 35 -1. + 67 62 6.9 65 1. + 68 29 1. 35 -1. + 68 62 8.05 + 69 28 1. 35 -1. + 69 62 4.4 + 70 35 1. 62 -10.1 + 70 C -2. + 71 39 1. 41 -.325 + 72 13 1. 41 -4.153 + 73 10 1. 41 -4.316 + 74 9 1. 41 -3.814 + 75 25 1. 41 -3.808 + 76 24 1. 41 -4.44 + 77 40 -1. 41 1.42 + 77 C .04 + 78 40 1. + 79 10 -.5 13 -.5 + 79 C 3. + 80 41 -1. C .4 + 81 41 1. + 82 42 -1. C .0132 + 83 43 -1. C .01 +RHS + 65 23.26 66 5.25 + 67 26.32 68 21.05 + 69 13.45 70 2.58 + 71 10. 72 10. +ENDATA diff --git a/demos/ppl_lpsol/examples/boeing1.mps b/demos/ppl_lpsol/examples/boeing1.mps new file mode 100644 index 0000000..bbe16dd --- /dev/null +++ b/demos/ppl_lpsol/examples/boeing1.mps @@ -0,0 +1,2636 @@ +NAME BOEING1 (FLAPINTL) +ROWS + G REVENUES + G ACOCOSTS + N OBJECTIV + G SYSTDEPT + G ACMILES + G ASMILES + G PASSNGRS + G RPMILES + G LFRPMASM + G ATONMILE + G RTONMILE + G LFTNMILE + E FLAV*1 + E FLAV*2 + E FLAV*3 + E FLAV*4 + E FLAV*5 + E FLAV*6 + G LF1001S1 + G LF1002S1 + G LF1002S2 + G LF1003S1 + G LF1004S1 + G LF1004S2 + G LF1005S1 + G LF1005S2 + G LF1105S1 + G LF1105S2 + G LF1006S1 + G LF1006S2 + G LF1007S1 + G LF1007S2 + G LF1008S1 + G LF1008S2 + G LF1008S3 + G LF1009S1 + G LF1009S2 + G LF1010S1 + G LF1011S1 + G LF1011S2 + G LF1012S1 + G LF1013S1 + G LF1013S2 + G LF1014S1 + G LF1014S2 + G LF1015S1 + G LF1015S2 + G LF1016S1 + G LF1016S2 + G LF1017S1 + G LF1017S2 + G LF1018S1 + G LF1018S2 + G LF1019S1 + G LF1019S2 + G LF1020S1 + G LF1021S1 + G LF1022S1 + G LF1022S2 + G LF1022S3 + G LF1023S1 + G LF1023S2 + G LF1023S3 + G LF1026S1 + G LF1026S2 + G LF1026S3 + G LF1027S1 + G LF1027S2 + G LF1027S3 + G LF1028S1 + G LF1028S2 + G LF1028S3 + G LF1029S1 + G LF1029S2 + G LF1029S3 + G LF1029S4 + G LF1029S5 + G LF1030S1 + G LF1030S2 + G LF1030S3 + G LF1030S4 + G LF1032S1 + G LF1032S2 + G LF1032S3 + G LF1032S4 + G LF1032S5 + G LF1033S1 + G LF1033S2 + G LF1033S3 + G LF1034S1 + G LF1034S2 + G LF1035S1 + G LF1035S2 + G LF1036S1 + G LF1036S2 + G LF1037S1 + G LF1037S2 + G LF1038S1 + G LF1039S1 + G LF1040S1 + G LF1040S2 + G LF1041S1 + G LF1042S1 + G LF1043S1 + G LF1044S1 + G LF1046S1 + G LF1046S2 + G LF1047S1 + G LF1047S2 + G LF1047S3 + G LF1050S1 + G LF1050S2 + G LF1051S1 + L NOPTLON0 + G NOPTLON1 + L NOPTTYO0 + G NOPTTYO1 + L DMBOSHNL + L DMBOSLAX + L DMBOSSEA + L DMBOSSFO + L DMBOSTPE + L DMBOSTYO + L DMBOSYUL + L DMBOSYVR + L DMBOSYWG + L DMBOSYYZ + L DMBUROAK + L DMBURSEA + L DMBURSFO + L DMHNLLAX + L DMHNLLON + L DMHNLPAR + L DMHNLSEA + L DMHNLSFO + L DMHNLYVR + L DMLASSEA + L DMLASYVR + L DMLAXOAK + L DMLAXSEA + L DMLAXSFO + L DMLAXTPE + L DMLAXTYO + L DMLAXYVR + L DMLONPAR + L DMLONSEA + L DMLONYVR + L DMOAKONT + L DMOAKSEA + L DMONTSFO + L DMONTSEA + L DMPARSEA + L DMPARYVR + L DMRNOSEA + L DMRNOYVR + L DMSEASFO + L DMSEATPE + L DMSEATYO + L DMSEAYVR + L DMSFOTPE + L DMSFOTYO + L DMSFOYVR + L DMTPETYO + L DMTPEYVR + L DMTYOYVR + L DMYULYVR + L DMYULYWG + L DMYULYYZ + L DMYVRYWG + L DMYVRYYZ + L DMYWGYYZ + L DMBOSOAK + L DMBOSBUR + L DMBOSONT + L DMBURYVR + L DMBURTYO + L DMBURTPE + L DMBURHNL + L DMHNLOAK + L DMHNLONT + L DMHNLYWG + L DMHNLYYZ + L DMHNLYUL + L DMLASTYO + L DMLASTPE + L DMLAXLON + L DMLAXPAR + L DMBURLON + L DMBURPAR + L DMLONONT + L DMLONOAK + L DMOAKPAR + L DMOAKTYO + L DMOAKTPE + L DMONTPAR + L DMONTTYO + L DMONTTPE + L DMPARSFO + L DMRNOTYO + L DMRNOTPE + L DMTPEYWG + L DMTPEYYZ + L DMTPEYUL + L DMTYOYUL + L DMTYOYYZ + L DMTYOYWG + E DMSFOOAK + E DMLAXBUR + E DMLAXONT + G MSBOSHNL + G MSBOSSEA + G MSBOSSFO + G MSBOSYUL + G MSBOSYVR + G MSBOSYWG + G MSBOSYYZ + G MSBUROAK + G MSBURSEA + G MSBURSFO + G MSHNLLAX + G MSHNLSEA + G MSHNLSFO + G MSHNLYVR + G MSLASSEA + G MSLASYVR + G MSLAXOAK + G MSLAXSEA + G MSLAXSFO + G MSLAXTPE + G MSLAXYVR + G MSLONPAR + G MSLONSEA + L MSLONYVR + G MSOAKONT + G MSOAKSEA + G MSONTSFO + G MSONTSEA + L MSPARSEA + G MSRNOSEA + G MSRNOYVR + G MSSEASFO + G MSSEATPE + G MSSEATYO + G MSSEAYVR + G MSSFOYVR + G MSTPETYO + G MSYULYVR + G MSYULYWG + G MSYULYYZ + G MSYVRYWG + G MSYVRYYZ + G MSYWGYYZ + G MSBOSOAK + G MSHNLOAK + G MSLAXLON + G P1044X32 + G P1047X54 + G P1032X76 + G P1033X54 + G P1036X43 + G P1040X43 + G P1042X32 + G P1032X75 + G P1040X42 + G P1016X43 + G P1003X32 + G P1004X43 + G P1105X43 + G P1047X23 + G P1001X32 + G P1002X43 + G P1007X43 + G P1002X42 + G P1022X23 + G P1019X43 + G P1021X32 + G P1105X32 + G P1017X43 + G P1046X23 + G P1008X53 + G P1009X43 + G P1011X42 + G P1012X32 + G P1017X42 + G P1026X23 + G P1027X23 + G P1029X24 + G P1030X24 + G P1050X32 + G P1004X32 + G P1008X54 + G P1011X43 + G P1029X23 + G P1030X23 + G P1047X34 + G P1051X23 + G P1027X25 + G P1029X27 + G P1030X26 + G P1008X52 + G P1009X42 + G P1029X25 + G P1013X32 + G P1014X32 + G P1017X32 + G P1015X43 + G P1013X42 + G P1015X42 + G P1050X42 + G P1018X43 + G P1020X32 + G P1008X34 + G P1011X23 + G P1015X23 + G P1016X23 + G P1028X32 + G P1029X43 + G P1030X43 + G P1002X32 + G P1008X32 + G P1009X32 + G P1010X32 + G P1018X32 + G P1019X32 + G P1023X32 + G P1029X45 + G P1032X23 + G P1008X42 + G P1029X35 + G P1032X63 + G P1033X42 + G P1034X42 + G P1036X32 + G P1032X64 + G P1033X43 + G P1037X42 + G P1039X32 + G P1032X65 + G P1034X43 + G P1037X43 + G P1040X32 + G P1041X32 + G P1032X34 + G P1033X23 + G P1035X23 + G P1032X35 + G P1034X23 + G P1035X24 + G P1032X45 + G P1035X34 + G P1037X23 + G P1038X23 +COLUMNS + PBOSHNL0 REVENUES .23519 OBJECTIV -.23519 + PBOSHNL0 PASSNGRS 1. RPMILES 5.16595 + PBOSHNL0 LFRPMASM -5.16595 DMBOSHNL 1. + PBOSHNL0 LF1007S1 -1. LF1007S2 -1. + PBOSHNL1 REVENUES .23519 OBJECTIV -.23519 + PBOSHNL1 PASSNGRS 1. RPMILES 5.59035 + PBOSHNL1 LFRPMASM -5.59035 DMBOSHNL 1. + PBOSHNL1 LF1047S1 -1. LF1047S2 -1. + PBOSHNL1 LF1047S3 -1. + PBOSHNL7 REVENUES -.02469 OBJECTIV .02469 + PBOSHNL7 PASSNGRS -1. DMBOSHNL 1. + PBOSHNL7 DMBOSSEA -1. DMHNLSEA -1. + PBOSHNL8 REVENUES -.02665 OBJECTIV .02665 + PBOSHNL8 PASSNGRS -1. DMBOSHNL 1. + PBOSHNL8 DMBOSYVR -1. DMHNLYVR -1. + PBOSLAX0 REVENUES .13092 OBJECTIV -.13092 + PBOSLAX0 PASSNGRS 1. RPMILES 3.02542 + PBOSLAX0 LFRPMASM -3.02542 DMBOSLAX 1. + PBOSLAX0 LF1046S1 -1. LF1046S2 -1. + PBOSLAX1 REVENUES .13092 OBJECTIV -.13092 + PBOSLAX1 PASSNGRS 1. RPMILES 3.03697 + PBOSLAX1 LFRPMASM -3.03697 DMBOSLAX 1. + PBOSLAX1 LF1047S2 -1. LF1047S3 -1. + PBOSLAX7 REVENUES -.03462 OBJECTIV .03462 + PBOSLAX7 PASSNGRS -1. DMBOSLAX 1. + PBOSLAX7 DMBOSSFO -1. DMLAXSFO -1. + PBOSSEA0 REVENUES .12596 OBJECTIV -.12596 + PBOSSEA0 PASSNGRS 1. RPMILES 2.48884 + PBOSSEA0 LFRPMASM -2.48884 DMBOSSEA 1. + PBOSSEA0 LF1007S1 -1. + PBOSSEA1 REVENUES .12596 OBJECTIV -.12596 + PBOSSEA1 PASSNGRS 1. RPMILES 2.78679 + PBOSSEA1 LFRPMASM -2.78679 DMBOSSEA 1. + PBOSSEA1 LF1032S1 -1. LF1032S2 -1. + PBOSSEA1 LF1032S3 -1. LF1032S4 -1. + PBOSSEA1 LF1032S5 -1. + PBOSSEA2 REVENUES .12596 OBJECTIV -.12596 + PBOSSEA2 PASSNGRS 1. RPMILES 2.48884 + PBOSSEA2 LFRPMASM -2.48884 DMBOSSEA 1. + PBOSSEA2 LF1043S1 -1. + PBOSSFO0 REVENUES .13481 OBJECTIV -.13481 + PBOSSFO0 PASSNGRS 1. RPMILES 2.69845 + PBOSSFO0 LFRPMASM -2.69845 DMBOSSFO 1. + PBOSSFO0 P1044X32 -1. LF1044S1 -1. + PBOSSFO1 REVENUES .13481 OBJECTIV -.13481 + PBOSSFO1 PASSNGRS 1. RPMILES 2.69845 + PBOSSFO1 LFRPMASM -2.69845 DMBOSSFO 1. + PBOSSFO1 P1047X54 -1. LF1047S3 -1. + PBOSTPE1 REVENUES -.05629 OBJECTIV .05629 + PBOSTPE1 PASSNGRS -1. DMBOSTPE 1. + PBOSTPE1 DMBOSSEA -1. DMSEATPE -1. + PBOSTPE2 REVENUES -.0528 OBJECTIV .0528 + PBOSTPE2 PASSNGRS -1. DMBOSTPE 1. + PBOSTPE2 DMBOSYVR -1. DMTPEYVR -1. + PBOSTYO1 REVENUES -.04525 OBJECTIV .04525 + PBOSTYO1 PASSNGRS -1. DMBOSTYO 1. + PBOSTYO1 DMBOSSEA -1. DMSEATYO -1. + PBOSTYO2 REVENUES -.04206 OBJECTIV .04206 + PBOSTYO2 PASSNGRS -1. DMBOSTYO 1. + PBOSTYO2 DMBOSYVR -1. DMTYOYVR -1. + PBOSYUL0 REVENUES .02799 OBJECTIV -.02799 + PBOSYUL0 PASSNGRS 1. RPMILES .25418 + PBOSYUL0 LFRPMASM -.25418 DMBOSYUL 1. + PBOSYUL0 P1032X76 -1. LF1032S5 -1. + PBOSYUL1 REVENUES .02799 OBJECTIV -.02799 + PBOSYUL1 PASSNGRS 1. RPMILES .25418 + PBOSYUL1 LFRPMASM -.25418 DMBOSYUL 1. + PBOSYUL1 P1033X54 -1. LF1033S3 -1. + PBOSYUL2 REVENUES .02799 OBJECTIV -.02799 + PBOSYUL2 PASSNGRS 1. RPMILES .25418 + PBOSYUL2 LFRPMASM -.25418 DMBOSYUL 1. + PBOSYUL2 P1036X43 -1. LF1036S2 -1. + PBOSYUL3 REVENUES .02799 OBJECTIV -.02799 + PBOSYUL3 PASSNGRS 1. RPMILES .25418 + PBOSYUL3 LFRPMASM -.25418 DMBOSYUL 1. + PBOSYUL3 P1040X43 -1. LF1040S2 -1. + PBOSYUL4 REVENUES .02799 OBJECTIV -.02799 + PBOSYUL4 PASSNGRS 1. RPMILES .25418 + PBOSYUL4 LFRPMASM -.25418 DMBOSYUL 1. + PBOSYUL4 P1042X32 -1. LF1042S1 -1. + PBOSYVR0 REVENUES .12674 OBJECTIV -.12674 + PBOSYVR0 PASSNGRS 1. RPMILES 2.66058 + PBOSYVR0 LFRPMASM -2.66058 DMBOSYVR 1. + PBOSYVR0 LF1032S2 -1. LF1032S3 -1. + PBOSYVR0 LF1032S4 -1. LF1032S5 -1. + PBOSYVR1 REVENUES .12674 OBJECTIV -.12674 + PBOSYVR1 PASSNGRS 1. RPMILES 2.5415 + PBOSYVR1 LFRPMASM -2.5415 DMBOSYVR 1. + PBOSYVR1 LF1033S1 -1. LF1033S2 -1. + PBOSYVR1 LF1033S3 -1. + PBOSYVR2 REVENUES .12674 OBJECTIV -.12674 + PBOSYVR2 PASSNGRS 1. RPMILES 2.54144 + PBOSYVR2 LFRPMASM -2.54144 DMBOSYVR 1. + PBOSYVR2 LF1036S1 -1. LF1036S2 -1. + PBOSYWG0 REVENUES .07408 OBJECTIV -.07408 + PBOSYWG0 PASSNGRS 1. RPMILES 1.50255 + PBOSYWG0 LFRPMASM -1.50255 DMBOSYWG 1. + PBOSYWG0 LF1032S3 -1. LF1032S4 -1. + PBOSYWG0 LF1032S5 -1. + PBOSYWG1 REVENUES .07408 OBJECTIV -.07408 + PBOSYWG1 PASSNGRS 1. RPMILES 1.38348 + PBOSYWG1 LFRPMASM -1.38348 DMBOSYWG 1. + PBOSYWG1 LF1033S2 -1. LF1033S3 -1. + PBOSYWG7 REVENUES -.01789 OBJECTIV .01789 + PBOSYWG7 PASSNGRS -1. DMBOSYWG 1. + PBOSYWG7 DMBOSYUL -1. DMYULYWG -1. + PBOSYYZ0 REVENUES .03418 OBJECTIV -.03418 + PBOSYYZ0 PASSNGRS 1. RPMILES .56879 + PBOSYYZ0 LFRPMASM -.56879 DMBOSYYZ 1. + PBOSYYZ0 P1032X75 -1. LF1032S4 -1. + PBOSYYZ0 LF1032S5 -1. + PBOSYYZ1 REVENUES .03418 OBJECTIV -.03418 + PBOSYYZ1 PASSNGRS 1. RPMILES .56879 + PBOSYYZ1 LFRPMASM -.56879 DMBOSYYZ 1. + PBOSYYZ1 P1040X42 -1. LF1040S1 -1. + PBOSYYZ1 LF1040S2 -1. + PBUROAK0 REVENUES .03032 OBJECTIV -.03032 + PBUROAK0 PASSNGRS 1. RPMILES .32608 + PBUROAK0 LFRPMASM -.32608 DMBUROAK 1. + PBUROAK0 LF1005S1 -1. + PBUROAK1 REVENUES .03032 OBJECTIV -.03032 + PBUROAK1 PASSNGRS 1. RPMILES .32608 + PBUROAK1 LFRPMASM -.32608 DMBUROAK 1. + PBUROAK1 LF1014S2 -1. + PBURSEA0 REVENUES .05527 OBJECTIV -.05527 + PBURSEA0 PASSNGRS 1. RPMILES .9975 + PBURSEA0 LFRPMASM -.9975 DMBURSEA 1. + PBURSEA0 LF1014S1 -1. LF1014S2 -1. + PBURSEA1 REVENUES .05527 OBJECTIV -.05527 + PBURSEA1 PASSNGRS 1. RPMILES 1.00605 + PBURSEA1 LFRPMASM -1.00605 DMBURSEA 1. + PBURSEA1 LF1016S1 -1. LF1016S2 -1. + PBURSFO0 REVENUES .03033 OBJECTIV -.03033 + PBURSFO0 PASSNGRS 1. RPMILES .32657 + PBURSFO0 LFRPMASM -.32657 DMBURSFO 1. + PBURSFO0 P1016X43 -1. LF1016S2 -1. + PHNLLAX0 REVENUES .12871 OBJECTIV -.12871 + PHNLLAX0 PASSNGRS 1. RPMILES 2.55338 + PHNLLAX0 LFRPMASM -2.55338 DMHNLLAX 1. + PHNLLAX0 P1003X32 -1. LF1003S1 -1. + PHNLLAX1 REVENUES .12871 OBJECTIV -.12871 + PHNLLAX1 PASSNGRS 1. RPMILES 2.55338 + PHNLLAX1 LFRPMASM -2.55338 DMHNLLAX 1. + PHNLLAX1 P1004X43 -1. LF1004S2 -1. + PHNLLAX2 REVENUES .12871 OBJECTIV -.12871 + PHNLLAX2 PASSNGRS 1. RPMILES 2.55338 + PHNLLAX2 LFRPMASM -2.55338 DMHNLLAX 1. + PHNLLAX2 P1105X43 -1. LF1105S2 -1. + PHNLLAX3 REVENUES .12871 OBJECTIV -.12871 + PHNLLAX3 PASSNGRS 1. RPMILES 2.55338 + PHNLLAX3 LFRPMASM -2.55338 DMHNLLAX 1. + PHNLLAX3 P1047X23 -1. LF1047S1 -1. + PHNLLON0 REVENUES .32504 OBJECTIV -.32504 + PHNLLON0 PASSNGRS 1. RPMILES 7.41547 + PHNLLON0 LFRPMASM -7.41547 DMHNLLON 1. + PHNLLON0 LF1022S1 -1. LF1022S2 -1. + PHNLLON6 REVENUES -.03143 OBJECTIV .03143 + PHNLLON6 PASSNGRS -1. DMHNLLON 1. + PHNLLON6 DMHNLSEA -1. DMLONSEA -1. + PHNLPAR0 REVENUES .3343 OBJECTIV -.3343 + PHNLPAR0 PASSNGRS 1. RPMILES 7.64184 + PHNLPAR0 LFRPMASM -7.64184 DMHNLPAR 1. + PHNLPAR0 LF1022S1 -1. LF1022S2 -1. + PHNLPAR0 LF1022S3 -1. + PHNLPAR6 REVENUES -.03166 OBJECTIV .03166 + PHNLPAR6 PASSNGRS -1. DMHNLPAR 1. + PHNLPAR6 DMHNLSEA -1. DMPARSEA -1. + PHNLSEA0 REVENUES .13391 OBJECTIV -.13391 + PHNLSEA0 PASSNGRS 1. RPMILES 2.67711 + PHNLSEA0 LFRPMASM -2.67711 DMHNLSEA 1. + PHNLSEA0 P1001X32 -1. LF1001S1 -1. + PHNLSEA1 REVENUES .13391 OBJECTIV -.13391 + PHNLSEA1 PASSNGRS 1. RPMILES 2.67711 + PHNLSEA1 LFRPMASM -2.67711 DMHNLSEA 1. + PHNLSEA1 P1002X43 -1. LF1002S2 -1. + PHNLSEA2 REVENUES .13391 OBJECTIV -.13391 + PHNLSEA2 PASSNGRS 1. RPMILES 2.67711 + PHNLSEA2 LFRPMASM -2.67711 DMHNLSEA 1. + PHNLSEA2 P1007X43 -1. LF1007S2 -1. + PHNLSFO0 REVENUES .12174 OBJECTIV -.12174 + PHNLSFO0 PASSNGRS 1. RPMILES 2.8919 + PHNLSFO0 LFRPMASM -2.8919 DMHNLSFO 1. + PHNLSFO0 LF1004S1 -1. LF1004S2 -1. + PHNLSFO1 REVENUES .12174 OBJECTIV -.12174 + PHNLSFO1 PASSNGRS 1. RPMILES 2.8919 + PHNLSFO1 LFRPMASM -2.8919 DMHNLSFO 1. + PHNLSFO1 LF1047S1 -1. LF1047S2 -1. + PHNLSFO7 REVENUES -.0377 OBJECTIV .0377 + PHNLSFO7 PASSNGRS -1. DMHNLSFO 1. + PHNLSFO7 DMHNLLAX -1. DMLAXSFO -1. + PHNLYVR0 REVENUES .1351 OBJECTIV -.1351 + PHNLYVR0 PASSNGRS 1. RPMILES 2.80333 + PHNLYVR0 LFRPMASM -2.80333 DMHNLYVR 1. + PHNLYVR0 P1002X42 -1. LF1002S1 -1. + PHNLYVR0 LF1002S2 -1. + PHNLYVR1 REVENUES .1351 OBJECTIV -.1351 + PHNLYVR1 PASSNGRS 1. RPMILES 2.70531 + PHNLYVR1 LFRPMASM -2.70531 DMHNLYVR 1. + PHNLYVR1 P1022X23 -1. LF1022S1 -1. + PHNLYVR7 REVENUES -.01809 OBJECTIV .01809 + PHNLYVR7 PASSNGRS -1. DMHNLYVR 1. + PHNLYVR7 DMHNLSEA -1. DMSEAYVR -1. + PLASSEA0 REVENUES .05205 OBJECTIV -.05205 + PLASSEA0 PASSNGRS 1. RPMILES .86771 + PLASSEA0 LFRPMASM -.86771 DMLASSEA 1. + PLASSEA0 P1019X43 -1. LF1019S2 -1. + PLASSEA1 REVENUES .05205 OBJECTIV -.05205 + PLASSEA1 PASSNGRS 1. RPMILES .86771 + PLASSEA1 LFRPMASM -.86771 DMLASSEA 1. + PLASSEA1 P1021X32 -1. LF1021S1 -1. + PLASYVR0 REVENUES .05774 OBJECTIV -.05774 + PLASYVR0 PASSNGRS 1. RPMILES .99393 + PLASYVR0 LFRPMASM -.99393 DMLASYVR 1. + PLASYVR0 LF1019S1 -1. LF1019S2 -1. + PLASYVR6 REVENUES -.01359 OBJECTIV .01359 + PLASYVR6 PASSNGRS -1. DMLASYVR 1. + PLASYVR6 DMLASSEA -1. DMSEAYVR -1. + PLAXOAK0 REVENUES .03072 OBJECTIV -.03072 + PLAXOAK0 PASSNGRS 1. RPMILES .33855 + PLAXOAK0 LFRPMASM -.33855 DMLAXOAK 1. + PLAXOAK0 P1105X32 -1. LF1105S1 -1. + PLAXOAK1 REVENUES .03072 OBJECTIV -.03072 + PLAXOAK1 PASSNGRS 1. RPMILES .33855 + PLAXOAK1 LFRPMASM -.33855 DMLAXOAK 1. + PLAXOAK1 P1017X43 -1. LF1017S2 -1. + PLAXOAK2 REVENUES .03072 OBJECTIV -.03072 + PLAXOAK2 PASSNGRS 1. RPMILES .33855 + PLAXOAK2 LFRPMASM -.33855 DMLAXOAK 1. + PLAXOAK2 P1046X23 -1. LF1046S1 -1. + PLAXSEA0 REVENUES .05607 OBJECTIV -.05607 + PLAXSEA0 PASSNGRS 1. RPMILES 1.01801 + PLAXSEA0 LFRPMASM -1.01801 DMLAXSEA 1. + PLAXSEA0 P1008X53 -1. LF1008S2 -1. + PLAXSEA0 LF1008S3 -1. + PLAXSEA1 REVENUES .05607 OBJECTIV -.05607 + PLAXSEA1 PASSNGRS 1. RPMILES .95575 + PLAXSEA1 LFRPMASM -.95575 DMLAXSEA 1. + PLAXSEA1 P1009X43 -1. LF1009S2 -1. + PLAXSEA2 REVENUES .05607 OBJECTIV -.05607 + PLAXSEA2 PASSNGRS 1. RPMILES 1.01801 + PLAXSEA2 LFRPMASM -1.01801 DMLAXSEA 1. + PLAXSEA2 P1011X42 -1. LF1011S1 -1. + PLAXSEA2 LF1011S2 -1. + PLAXSEA3 REVENUES .05607 OBJECTIV -.05607 + PLAXSEA3 PASSNGRS 1. RPMILES .95575 + PLAXSEA3 LFRPMASM -.95575 DMLAXSEA 1. + PLAXSEA3 P1012X32 -1. LF1012S1 -1. + PLAXSEA4 REVENUES .05607 OBJECTIV -.05607 + PLAXSEA4 PASSNGRS 1. RPMILES 1.00997 + PLAXSEA4 LFRPMASM -1.00997 DMLAXSEA 1. + PLAXSEA4 P1017X42 -1. LF1017S1 -1. + PLAXSEA4 LF1017S2 -1. + PLAXSEA5 REVENUES .05607 OBJECTIV -.05607 + PLAXSEA5 PASSNGRS 1. RPMILES .95575 + PLAXSEA5 LFRPMASM -.95575 DMLAXSEA 1. + PLAXSEA5 P1026X23 -1. LF1026S1 -1. + PLAXSEA6 REVENUES .05607 OBJECTIV -.05607 + PLAXSEA6 PASSNGRS 1. RPMILES .95575 + PLAXSEA6 LFRPMASM -.95575 DMLAXSEA 1. + PLAXSEA6 P1027X23 -1. LF1027S1 -1. + PLAXSEA7 REVENUES .05607 OBJECTIV -.05607 + PLAXSEA7 PASSNGRS 1. RPMILES 1.01801 + PLAXSEA7 LFRPMASM -1.01801 DMLAXSEA 1. + PLAXSEA7 P1029X24 -1. LF1029S1 -1. + PLAXSEA7 LF1029S2 -1. + PLAXSEA8 REVENUES .05607 OBJECTIV -.05607 + PLAXSEA8 PASSNGRS 1. RPMILES 1.01801 + PLAXSEA8 LFRPMASM -1.01801 DMLAXSEA 1. + PLAXSEA8 P1030X24 -1. LF1030S1 -1. + PLAXSEA8 LF1030S2 -1. + PLAXSEA9 REVENUES .05607 OBJECTIV -.05607 + PLAXSEA9 PASSNGRS 1. RPMILES .95575 + PLAXSEA9 LFRPMASM -.95575 DMLAXSEA 1. + PLAXSEA9 P1050X32 -1. LF1050S1 -1. + PLAXSFO0 REVENUES .03072 OBJECTIV -.03072 + PLAXSFO0 PASSNGRS 1. RPMILES .33852 + PLAXSFO0 LFRPMASM -.33852 DMLAXSFO 1. + PLAXSFO0 P1004X32 -1. LF1004S1 -1. + PLAXSFO1 REVENUES .03072 OBJECTIV -.03072 + PLAXSFO1 PASSNGRS 1. RPMILES .33852 + PLAXSFO1 LFRPMASM -.33852 DMLAXSFO 1. + PLAXSFO1 P1008X54 -1. LF1008S3 -1. + PLAXSFO2 REVENUES .03072 OBJECTIV -.03072 + PLAXSFO2 PASSNGRS 1. RPMILES .33852 + PLAXSFO2 LFRPMASM -.33852 DMLAXSFO 1. + PLAXSFO2 P1011X43 -1. LF1011S2 -1. + PLAXSFO3 REVENUES .03072 OBJECTIV -.03072 + PLAXSFO3 PASSNGRS 1. RPMILES .33852 + PLAXSFO3 LFRPMASM -.33852 DMLAXSFO 1. + PLAXSFO3 P1029X23 -1. LF1029S1 -1. + PLAXSFO4 REVENUES .03072 OBJECTIV -.03072 + PLAXSFO4 PASSNGRS 1. RPMILES .33852 + PLAXSFO4 LFRPMASM -.33852 DMLAXSFO 1. + PLAXSFO4 P1030X23 -1. LF1030S1 -1. + PLAXSFO5 REVENUES .03072 OBJECTIV -.03072 + PLAXSFO5 PASSNGRS 1. RPMILES .33852 + PLAXSFO5 LFRPMASM -.33852 DMLAXSFO 1. + PLAXSFO5 P1047X34 -1. LF1047S2 -1. + PLAXSFO6 REVENUES .03072 OBJECTIV -.03072 + PLAXSFO6 PASSNGRS 1. RPMILES .33852 + PLAXSFO6 LFRPMASM -.33852 DMLAXSFO 1. + PLAXSFO6 P1051X23 -1. LF1051S1 -1. + PLAXTPE0 REVENUES .30609 OBJECTIV -.30609 + PLAXTPE0 PASSNGRS 1. RPMILES 7.05137 + PLAXTPE0 LFRPMASM -7.05137 DMLAXTPE 1. + PLAXTPE0 P1027X25 -1. LF1027S1 -1. + PLAXTPE0 LF1027S2 -1. LF1027S3 -1. + PLAXTPE1 REVENUES .30609 OBJECTIV -.30609 + PLAXTPE1 PASSNGRS 1. RPMILES 7.14547 + PLAXTPE1 LFRPMASM -7.14547 DMLAXTPE 1. + PLAXTPE1 P1029X27 -1. LF1029S1 -1. + PLAXTPE1 LF1029S2 -1. LF1029S3 -1. + PLAXTPE1 LF1029S4 -1. LF1029S5 -1. + PLAXTPE2 REVENUES .30609 OBJECTIV -.30609 + PLAXTPE2 PASSNGRS 1. RPMILES 7.11364 + PLAXTPE2 LFRPMASM -7.11364 DMLAXTPE 1. + PLAXTPE2 P1030X26 -1. LF1030S1 -1. + PLAXTPE2 LF1030S2 -1. LF1030S3 -1. + PLAXTPE2 LF1030S4 -1. + PLAXTPE8 REVENUES -.02571 OBJECTIV .02571 + PLAXTPE8 PASSNGRS -1. DMLAXTPE 1. + PLAXTPE8 DMLAXSEA -1. DMSEATPE -1. + PLAXTYO0 REVENUES .2516 OBJECTIV -.2516 + PLAXTYO0 PASSNGRS 1. RPMILES 5.74891 + PLAXTYO0 LFRPMASM -5.74891 DMLAXTYO 1. + PLAXTYO0 LF1027S1 -1. LF1027S2 -1. + PLAXTYO1 REVENUES .2516 OBJECTIV -.2516 + PLAXTYO1 PASSNGRS 1. RPMILES 5.843 + PLAXTYO1 LFRPMASM -5.843 DMLAXTYO 1. + PLAXTYO1 LF1029S1 -1. LF1029S2 -1. + PLAXTYO1 LF1029S3 -1. LF1029S4 -1. + PLAXTYO2 REVENUES .2516 OBJECTIV -.2516 + PLAXTYO2 PASSNGRS 1. RPMILES 5.81118 + PLAXTYO2 LFRPMASM -5.81118 DMLAXTYO 1. + PLAXTYO2 LF1030S1 -1. LF1030S2 -1. + PLAXTYO2 LF1030S3 -1. + PLAXTYO8 REVENUES -.0273 OBJECTIV .0273 + PLAXTYO8 PASSNGRS -1. DMLAXTYO 1. + PLAXTYO8 DMLAXSEA -1. DMSEATYO -1. + PLAXYVR0 REVENUES .06181 OBJECTIV -.06181 + PLAXYVR0 PASSNGRS 1. RPMILES 1.14422 + PLAXYVR0 LFRPMASM -1.14422 DMLAXYVR 1. + PLAXYVR0 P1008X52 -1. LF1008S1 -1. + PLAXYVR0 LF1008S2 -1. LF1008S3 -1. + PLAXYVR1 REVENUES .06181 OBJECTIV -.06181 + PLAXYVR1 PASSNGRS 1. RPMILES 1.08196 + PLAXYVR1 LFRPMASM -1.08196 DMLAXYVR 1. + PLAXYVR1 P1009X42 -1. LF1009S1 -1. + PLAXYVR1 LF1009S2 -1. + PLAXYVR2 REVENUES .06181 OBJECTIV -.06181 + PLAXYVR2 PASSNGRS 1. RPMILES 1.14422 + PLAXYVR2 LFRPMASM -1.14422 DMLAXYVR 1. + PLAXYVR2 P1029X25 -1. LF1029S1 -1. + PLAXYVR2 LF1029S2 -1. LF1029S3 -1. + PLONPAR0 REVENUES .02622 OBJECTIV -.02622 + PLONPAR0 PASSNGRS 1. RPMILES .22636 + PLONPAR0 LFRPMASM -.22636 DMLONPAR 1. + PLONPAR0 LF1022S3 -1. + PLONPAR1 REVENUES .02622 OBJECTIV -.02622 + PLONPAR1 PASSNGRS 1. RPMILES .22636 + PLONPAR1 LFRPMASM -.22636 DMLONPAR 1. + PLONPAR1 LF1023S3 -1. + PLONPAR2 REVENUES .02622 OBJECTIV -.02622 + PLONPAR2 PASSNGRS 1. RPMILES .22636 + PLONPAR2 LFRPMASM -.22636 DMLONPAR 1. + PLONPAR2 LF1026S3 -1. + PLONSEA0 REVENUES .22255 OBJECTIV -.22255 + PLONSEA0 PASSNGRS 1. RPMILES 4.78646 + PLONSEA0 LFRPMASM -4.78646 DMLONSEA 1. + PLONSEA0 LF1023S2 -1. + PLONSEA1 REVENUES .22255 OBJECTIV -.22255 + PLONSEA1 PASSNGRS 1. RPMILES 4.78646 + PLONSEA1 LFRPMASM -4.78646 DMLONSEA 1. + PLONSEA1 LF1026S2 -1. + PLONYVR0 REVENUES .21935 OBJECTIV -.21935 + PLONYVR0 PASSNGRS 1. RPMILES 4.71017 + PLONYVR0 LFRPMASM -4.71017 DMLONYVR 1. + PLONYVR0 LF1022S2 -1. + PLONYVR1 REVENUES .21935 OBJECTIV -.21935 + PLONYVR1 PASSNGRS 1. RPMILES 4.91267 + PLONYVR1 LFRPMASM -4.91267 DMLONYVR 1. + PLONYVR1 LF1023S1 -1. LF1023S2 -1. + PLONYVR7 REVENUES -.02248 OBJECTIV .02248 + PLONYVR7 PASSNGRS -1. DMLONYVR 1. + PLONYVR7 DMLONSEA -1. DMSEAYVR -1. + POAKONT0 REVENUES .03148 OBJECTIV -.03148 + POAKONT0 PASSNGRS 1. RPMILES .36196 + POAKONT0 LFRPMASM -.36196 DMOAKONT 1. + POAKONT0 LF1006S1 -1. + POAKONT1 REVENUES .03148 OBJECTIV -.03148 + POAKONT1 PASSNGRS 1. RPMILES .36196 + POAKONT1 LFRPMASM -.36196 DMOAKONT 1. + POAKONT1 LF1013S2 -1. + POAKSEA0 REVENUES .04311 OBJECTIV -.04311 + POAKSEA0 PASSNGRS 1. RPMILES .67142 + POAKSEA0 LFRPMASM -.67142 DMOAKSEA 1. + POAKSEA0 P1013X32 -1. LF1013S1 -1. + POAKSEA1 REVENUES .04311 OBJECTIV -.04311 + POAKSEA1 PASSNGRS 1. RPMILES .67142 + POAKSEA1 LFRPMASM -.67142 DMOAKSEA 1. + POAKSEA1 P1014X32 -1. LF1014S1 -1. + POAKSEA2 REVENUES .04311 OBJECTIV -.04311 + POAKSEA2 PASSNGRS 1. RPMILES .67142 + POAKSEA2 LFRPMASM -.67142 DMOAKSEA 1. + POAKSEA2 P1017X32 -1. LF1017S1 -1. + PONTSFO0 REVENUES .03152 OBJECTIV -.03152 + PONTSFO0 PASSNGRS 1. RPMILES .36328 + PONTSFO0 LFRPMASM -.36328 DMONTSFO 1. + PONTSFO0 P1015X43 -1. LF1015S2 -1. + PONTSEA0 REVENUES .05614 OBJECTIV -.05614 + PONTSEA0 PASSNGRS 1. RPMILES 1.03338 + PONTSEA0 LFRPMASM -1.03338 DMONTSEA 1. + PONTSEA0 P1013X42 -1. LF1013S1 -1. + PONTSEA0 LF1013S2 -1. + PONTSEA1 REVENUES .05614 OBJECTIV -.05614 + PONTSEA1 PASSNGRS 1. RPMILES 1.04277 + PONTSEA1 LFRPMASM -1.04277 DMONTSEA 1. + PONTSEA1 P1015X42 -1. LF1015S1 -1. + PONTSEA1 LF1015S2 -1. + PONTSEA2 REVENUES .05614 OBJECTIV -.05614 + PONTSEA2 PASSNGRS 1. RPMILES 1.00139 + PONTSEA2 LFRPMASM -1.00139 DMONTSEA 1. + PONTSEA2 P1050X42 -1. LF1050S1 -1. + PONTSEA2 LF1050S2 -1. + PPARSEA0 REVENUES .23205 OBJECTIV -.23205 + PPARSEA0 PASSNGRS 1. RPMILES 5.01282 + PPARSEA0 LFRPMASM -5.01282 DMPARSEA 1. + PPARSEA0 LF1023S2 -1. LF1023S3 -1. + PPARSEA1 REVENUES .23205 OBJECTIV -.23205 + PPARSEA1 PASSNGRS 1. RPMILES 5.01282 + PPARSEA1 LFRPMASM -5.01282 DMPARSEA 1. + PPARSEA1 LF1026S2 -1. LF1026S3 -1. + PPARYVR0 REVENUES .22885 OBJECTIV -.22885 + PPARYVR0 PASSNGRS 1. RPMILES 4.93653 + PPARYVR0 LFRPMASM -4.93653 DMPARYVR 1. + PPARYVR0 LF1022S2 -1. LF1022S3 -1. + PPARYVR1 REVENUES .22885 OBJECTIV -.22885 + PPARYVR1 PASSNGRS 1. RPMILES 5.13904 + PPARYVR1 LFRPMASM -5.13904 DMPARYVR 1. + PPARYVR1 LF1023S1 -1. LF1023S2 -1. + PPARYVR1 LF1023S3 -1. + PPARYVR7 REVENUES -.02247 OBJECTIV .02247 + PPARYVR7 PASSNGRS -1. DMPARYVR 1. + PPARYVR7 DMPARSEA -1. DMSEAYVR -1. + PRNOSEA0 REVENUES .0382 OBJECTIV -.0382 + PRNOSEA0 PASSNGRS 1. RPMILES .56374 + PRNOSEA0 LFRPMASM -.56374 DMRNOSEA 1. + PRNOSEA0 P1018X43 -1. LF1018S2 -1. + PRNOSEA1 REVENUES .0382 OBJECTIV -.0382 + PRNOSEA1 PASSNGRS 1. RPMILES .56374 + PRNOSEA1 LFRPMASM -.56374 DMRNOSEA 1. + PRNOSEA1 P1020X32 -1. LF1020S1 -1. + PRNOYVR0 REVENUES .04394 OBJECTIV -.04394 + PRNOYVR0 PASSNGRS 1. RPMILES .68996 + PRNOYVR0 LFRPMASM -.68996 DMRNOYVR 1. + PRNOYVR0 LF1018S1 -1. LF1018S2 -1. + PSEASFO0 REVENUES .04347 OBJECTIV -.04347 + PSEASFO0 PASSNGRS 1. RPMILES .67949 + PSEASFO0 LFRPMASM -.67949 DMSEASFO 1. + PSEASFO0 P1008X34 -1. LF1008S2 -1. + PSEASFO1 REVENUES .04347 OBJECTIV -.04347 + PSEASFO1 PASSNGRS 1. RPMILES .67949 + PSEASFO1 LFRPMASM -.67949 DMSEASFO 1. + PSEASFO1 P1011X23 -1. LF1011S1 -1. + PSEASFO2 REVENUES .04347 OBJECTIV -.04347 + PSEASFO2 PASSNGRS 1. RPMILES .67949 + PSEASFO2 LFRPMASM -.67949 DMSEASFO 1. + PSEASFO2 P1015X23 -1. LF1015S1 -1. + PSEASFO3 REVENUES .04347 OBJECTIV -.04347 + PSEASFO3 PASSNGRS 1. RPMILES .67949 + PSEASFO3 LFRPMASM -.67949 DMSEASFO 1. + PSEASFO3 P1016X23 -1. LF1016S1 -1. + PSEASFO4 REVENUES .04347 OBJECTIV -.04347 + PSEASFO4 PASSNGRS 1. RPMILES .67949 + PSEASFO4 LFRPMASM -.67949 DMSEASFO 1. + PSEASFO4 P1028X32 -1. LF1028S1 -1. + PSEASFO5 REVENUES .04347 OBJECTIV -.04347 + PSEASFO5 PASSNGRS 1. RPMILES .67949 + PSEASFO5 LFRPMASM -.67949 DMSEASFO 1. + PSEASFO5 P1029X43 -1. LF1029S2 -1. + PSEASFO6 REVENUES .04347 OBJECTIV -.04347 + PSEASFO6 PASSNGRS 1. RPMILES .67949 + PSEASFO6 LFRPMASM -.67949 DMSEASFO 1. + PSEASFO6 P1030X43 -1. LF1030S2 -1. + PSEATPE0 REVENUES .27573 OBJECTIV -.27573 + PSEATPE0 PASSNGRS 1. RPMILES 6.09563 + PSEATPE0 LFRPMASM -6.09563 DMSEATPE 1. + PSEATPE0 LF1027S2 -1. LF1027S3 -1. + PSEATPE1 REVENUES .27573 OBJECTIV -.27573 + PSEATPE1 PASSNGRS 1. RPMILES 6.09563 + PSEATPE1 LFRPMASM -6.09563 DMSEATPE 1. + PSEATPE1 LF1028S2 -1. LF1028S3 -1. + PSEATPE2 REVENUES .27573 OBJECTIV -.27573 + PSEATPE2 PASSNGRS 1. RPMILES 6.12746 + PSEATPE2 LFRPMASM -6.12746 DMSEATPE 1. + PSEATPE2 LF1029S3 -1. LF1029S4 -1. + PSEATPE2 LF1029S5 -1. + PSEATPE3 REVENUES .27573 OBJECTIV -.27573 + PSEATPE3 PASSNGRS 1. RPMILES 6.09563 + PSEATPE3 LFRPMASM -6.09563 DMSEATPE 1. + PSEATPE3 LF1030S3 -1. LF1030S4 -1. + PSEATYO0 REVENUES .22283 OBJECTIV -.22283 + PSEATYO0 PASSNGRS 1. RPMILES 4.79317 + PSEATYO0 LFRPMASM -4.79317 DMSEATYO 1. + PSEATYO0 LF1027S2 -1. + PSEATYO1 REVENUES .22283 OBJECTIV -.22283 + PSEATYO1 PASSNGRS 1. RPMILES 4.79317 + PSEATYO1 LFRPMASM -4.79317 DMSEATYO 1. + PSEATYO1 LF1028S2 -1. + PSEATYO2 REVENUES .22283 OBJECTIV -.22283 + PSEATYO2 PASSNGRS 1. RPMILES 4.825 + PSEATYO2 LFRPMASM -4.825 DMSEATYO 1. + PSEATYO2 LF1029S3 -1. LF1029S4 -1. + PSEATYO3 REVENUES .22283 OBJECTIV -.22283 + PSEATYO3 PASSNGRS 1. RPMILES 4.79317 + PSEATYO3 LFRPMASM -4.79317 DMSEATYO 1. + PSEATYO3 LF1030S3 -1. + PSEAYVR0 REVENUES .01928 OBJECTIV -.01928 + PSEAYVR0 PASSNGRS 1. RPMILES .12622 + PSEAYVR0 LFRPMASM -.12622 DMSEAYVR 1. + PSEAYVR0 P1002X32 -1. LF1002S1 -1. + PSEAYVR1 REVENUES .01928 OBJECTIV -.01928 + PSEAYVR1 PASSNGRS 1. RPMILES .12622 + PSEAYVR1 LFRPMASM -.12622 DMSEAYVR 1. + PSEAYVR1 P1008X32 -1. LF1008S1 -1. + PSEAYVR2 REVENUES .01928 OBJECTIV -.01928 + PSEAYVR2 PASSNGRS 1. RPMILES .12622 + PSEAYVR2 LFRPMASM -.12622 DMSEAYVR 1. + PSEAYVR2 P1009X32 -1. LF1009S1 -1. + PSEAYVR3 REVENUES .01928 OBJECTIV -.01928 + PSEAYVR3 PASSNGRS 1. RPMILES .12622 + PSEAYVR3 LFRPMASM -.12622 DMSEAYVR 1. + PSEAYVR3 P1010X32 -1. LF1010S1 -1. + PSEAYVR4 REVENUES .01928 OBJECTIV -.01928 + PSEAYVR4 PASSNGRS 1. RPMILES .12622 + PSEAYVR4 LFRPMASM -.12622 DMSEAYVR 1. + PSEAYVR4 P1018X32 -1. LF1018S1 -1. + PSEAYVR5 REVENUES .01928 OBJECTIV -.01928 + PSEAYVR5 PASSNGRS 1. RPMILES .12622 + PSEAYVR5 LFRPMASM -.12622 DMSEAYVR 1. + PSEAYVR5 P1019X32 -1. LF1019S1 -1. + PSEAYVR6 REVENUES .01928 OBJECTIV -.01928 + PSEAYVR6 PASSNGRS 1. RPMILES .12622 + PSEAYVR6 LFRPMASM -.12622 DMSEAYVR 1. + PSEAYVR6 P1023X32 -1. LF1023S1 -1. + PSEAYVR7 REVENUES .01928 OBJECTIV -.01928 + PSEAYVR7 PASSNGRS 1. RPMILES .12622 + PSEAYVR7 LFRPMASM -.12622 DMSEAYVR 1. + PSEAYVR7 P1029X45 -1. LF1029S3 -1. + PSEAYVR8 REVENUES .01928 OBJECTIV -.01928 + PSEAYVR8 PASSNGRS 1. RPMILES .12622 + PSEAYVR8 LFRPMASM -.12622 DMSEAYVR 1. + PSEAYVR8 P1032X23 -1. LF1032S1 -1. + PSFOTPE0 REVENUES .29218 OBJECTIV -.29218 + PSFOTPE0 PASSNGRS 1. RPMILES 6.77512 + PSFOTPE0 LFRPMASM -6.77512 DMSFOTPE 1. + PSFOTPE0 LF1028S1 -1. LF1028S2 -1. + PSFOTPE0 LF1028S3 -1. + PSFOTPE1 REVENUES .29218 OBJECTIV -.29218 + PSFOTPE1 PASSNGRS 1. RPMILES 6.80694 + PSFOTPE1 LFRPMASM -6.80694 DMSFOTPE 1. + PSFOTPE1 LF1029S2 -1. LF1029S3 -1. + PSFOTPE1 LF1029S4 -1. LF1029S5 -1. + PSFOTPE2 REVENUES .29218 OBJECTIV -.29218 + PSFOTPE2 PASSNGRS 1. RPMILES 6.77512 + PSFOTPE2 LFRPMASM -6.77512 DMSFOTPE 1. + PSFOTPE2 LF1030S2 -1. LF1030S3 -1. + PSFOTPE2 LF1030S4 -1. + PSFOTPE8 REVENUES -.02702 OBJECTIV .02702 + PSFOTPE8 PASSNGRS -1. DMSFOTPE 1. + PSFOTPE8 DMSEASFO -1. DMSEATPE -1. + PSFOTYO0 REVENUES .2378 OBJECTIV -.2378 + PSFOTYO0 PASSNGRS 1. RPMILES 5.47265 + PSFOTYO0 LFRPMASM -5.47265 DMSFOTYO 1. + PSFOTYO0 LF1028S1 -1. LF1028S2 -1. + PSFOTYO1 REVENUES .2378 OBJECTIV -.2378 + PSFOTYO1 PASSNGRS 1. RPMILES 5.50448 + PSFOTYO1 LFRPMASM -5.50448 DMSFOTYO 1. + PSFOTYO1 LF1029S2 -1. LF1029S3 -1. + PSFOTYO1 LF1029S4 -1. + PSFOTYO2 REVENUES .2378 OBJECTIV -.2378 + PSFOTYO2 PASSNGRS 1. RPMILES 5.47265 + PSFOTYO2 LFRPMASM -5.47265 DMSFOTYO 1. + PSFOTYO2 LF1030S2 -1. LF1030S3 -1. + PSFOTYO8 REVENUES -.0285 OBJECTIV .0285 + PSFOTYO8 PASSNGRS -1. DMSFOTYO 1. + PSFOTYO8 DMSEASFO -1. DMSEATYO -1. + PSFOYVR0 REVENUES .04898 OBJECTIV -.04898 + PSFOYVR0 PASSNGRS 1. RPMILES .8057 + PSFOYVR0 LFRPMASM -.8057 DMSFOYVR 1. + PSFOYVR0 P1008X42 -1. LF1008S1 -1. + PSFOYVR0 LF1008S2 -1. + PSFOYVR1 REVENUES .04898 OBJECTIV -.04898 + PSFOYVR1 PASSNGRS 1. RPMILES .8057 + PSFOYVR1 LFRPMASM -.8057 DMSFOYVR 1. + PSFOYVR1 P1029X35 -1. LF1029S2 -1. + PSFOYVR1 LF1029S3 -1. + PTPETYO0 REVENUES .07188 OBJECTIV -.07188 + PTPETYO0 PASSNGRS 1. RPMILES 1.30247 + PTPETYO0 LFRPMASM -1.30247 DMTPETYO 1. + PTPETYO0 LF1027S3 -1. + PTPETYO1 REVENUES .07188 OBJECTIV -.07188 + PTPETYO1 PASSNGRS 1. RPMILES 1.30247 + PTPETYO1 LFRPMASM -1.30247 DMTPETYO 1. + PTPETYO1 LF1028S3 -1. + PTPETYO2 REVENUES .07188 OBJECTIV -.07188 + PTPETYO2 PASSNGRS 1. RPMILES 1.30247 + PTPETYO2 LFRPMASM -1.30247 DMTPETYO 1. + PTPETYO2 LF1029S5 -1. + PTPETYO3 REVENUES .07188 OBJECTIV -.07188 + PTPETYO3 PASSNGRS 1. RPMILES 1.30247 + PTPETYO3 LFRPMASM -1.30247 DMTPETYO 1. + PTPETYO3 LF1030S4 -1. + PTPEYVR0 REVENUES .27146 OBJECTIV -.27146 + PTPEYVR0 PASSNGRS 1. RPMILES 6.00125 + PTPEYVR0 LFRPMASM -6.00125 DMTPEYVR 1. + PTPEYVR0 LF1029S4 -1. LF1029S5 -1. + PTYOYVR0 REVENUES .21887 OBJECTIV -.21887 + PTYOYVR0 PASSNGRS 1. RPMILES 4.69878 + PTYOYVR0 LFRPMASM -4.69878 DMTYOYVR 1. + PTYOYVR0 LF1029S4 -1. + PYULYVR0 REVENUES .11677 OBJECTIV -.11677 + PYULYVR0 PASSNGRS 1. RPMILES 2.4064 + PYULYVR0 LFRPMASM -2.4064 DMYULYVR 1. + PYULYVR0 P1032X63 -1. LF1032S2 -1. + PYULYVR0 LF1032S3 -1. LF1032S4 -1. + PYULYVR1 REVENUES .11677 OBJECTIV -.11677 + PYULYVR1 PASSNGRS 1. RPMILES 2.28733 + PYULYVR1 LFRPMASM -2.28733 DMYULYVR 1. + PYULYVR1 P1033X42 -1. LF1033S1 -1. + PYULYVR1 LF1033S2 -1. + PYULYVR2 REVENUES .11677 OBJECTIV -.11677 + PYULYVR2 PASSNGRS 1. RPMILES 2.39258 + PYULYVR2 LFRPMASM -2.39258 DMYULYVR 1. + PYULYVR2 P1034X42 -1. LF1034S1 -1. + PYULYVR2 LF1034S2 -1. + PYULYVR3 REVENUES .11677 OBJECTIV -.11677 + PYULYVR3 PASSNGRS 1. RPMILES 2.28726 + PYULYVR3 LFRPMASM -2.28726 DMYULYVR 1. + PYULYVR3 P1036X32 -1. LF1036S1 -1. + PYULYWG0 REVENUES .06398 OBJECTIV -.06398 + PYULYWG0 PASSNGRS 1. RPMILES 1.24837 + PYULYWG0 LFRPMASM -1.24837 DMYULYWG 1. + PYULYWG0 P1032X64 -1. LF1032S3 -1. + PYULYWG0 LF1032S4 -1. + PYULYWG1 REVENUES .06398 OBJECTIV -.06398 + PYULYWG1 PASSNGRS 1. RPMILES 1.1293 + PYULYWG1 LFRPMASM -1.1293 DMYULYWG 1. + PYULYWG1 P1033X43 -1. LF1033S2 -1. + PYULYWG2 REVENUES .06398 OBJECTIV -.06398 + PYULYWG2 PASSNGRS 1. RPMILES 1.24837 + PYULYWG2 LFRPMASM -1.24837 DMYULYWG 1. + PYULYWG2 P1037X42 -1. LF1037S1 -1. + PYULYWG2 LF1037S2 -1. + PYULYWG3 REVENUES .06398 OBJECTIV -.06398 + PYULYWG3 PASSNGRS 1. RPMILES 1.1293 + PYULYWG3 LFRPMASM -1.1293 DMYULYWG 1. + PYULYWG3 P1039X32 -1. LF1039S1 -1. + PYULYYZ0 REVENUES .02995 OBJECTIV -.02995 + PYULYYZ0 PASSNGRS 1. RPMILES .31461 + PYULYYZ0 LFRPMASM -.31461 DMYULYYZ 1. + PYULYYZ0 P1032X65 -1. LF1032S4 -1. + PYULYYZ1 REVENUES .02995 OBJECTIV -.02995 + PYULYYZ1 PASSNGRS 1. RPMILES .31461 + PYULYYZ1 LFRPMASM -.31461 DMYULYYZ 1. + PYULYYZ1 P1034X43 -1. LF1034S2 -1. + PYULYYZ2 REVENUES .02995 OBJECTIV -.02995 + PYULYYZ2 PASSNGRS 1. RPMILES .31461 + PYULYYZ2 LFRPMASM -.31461 DMYULYYZ 1. + PYULYYZ2 P1037X43 -1. LF1037S2 -1. + PYULYYZ3 REVENUES .02995 OBJECTIV -.02995 + PYULYYZ3 PASSNGRS 1. RPMILES .31461 + PYULYYZ3 LFRPMASM -.31461 DMYULYYZ 1. + PYULYYZ3 P1040X32 -1. LF1040S1 -1. + PYULYYZ4 REVENUES .02995 OBJECTIV -.02995 + PYULYYZ4 PASSNGRS 1. RPMILES .31461 + PYULYYZ4 LFRPMASM -.31461 DMYULYYZ 1. + PYULYYZ4 P1041X32 -1. LF1041S1 -1. + PYVRYWG0 REVENUES .06529 OBJECTIV -.06529 + PYVRYWG0 PASSNGRS 1. RPMILES 1.15803 + PYVRYWG0 LFRPMASM -1.15803 DMYVRYWG 1. + PYVRYWG0 P1032X34 -1. LF1032S2 -1. + PYVRYWG1 REVENUES .06529 OBJECTIV -.06529 + PYVRYWG1 PASSNGRS 1. RPMILES 1.15803 + PYVRYWG1 LFRPMASM -1.15803 DMYVRYWG 1. + PYVRYWG1 P1033X23 -1. LF1033S1 -1. + PYVRYWG2 REVENUES .06529 OBJECTIV -.06529 + PYVRYWG2 PASSNGRS 1. RPMILES 1.15803 + PYVRYWG2 LFRPMASM -1.15803 DMYVRYWG 1. + PYVRYWG2 P1035X23 -1. LF1035S1 -1. + PYVRYYZ0 REVENUES .10723 OBJECTIV -.10723 + PYVRYYZ0 PASSNGRS 1. RPMILES 2.09179 + PYVRYYZ0 LFRPMASM -2.09179 DMYVRYYZ 1. + PYVRYYZ0 P1032X35 -1. LF1032S2 -1. + PYVRYYZ0 LF1032S3 -1. + PYVRYYZ1 REVENUES .10723 OBJECTIV -.10723 + PYVRYYZ1 PASSNGRS 1. RPMILES 2.07796 + PYVRYYZ1 LFRPMASM -2.07796 DMYVRYYZ 1. + PYVRYYZ1 P1034X23 -1. LF1034S1 -1. + PYVRYYZ2 REVENUES .10723 OBJECTIV -.10723 + PYVRYYZ2 PASSNGRS 1. RPMILES 2.09179 + PYVRYYZ2 LFRPMASM -2.09179 DMYVRYYZ 1. + PYVRYYZ2 P1035X24 -1. LF1035S1 -1. + PYVRYYZ2 LF1035S2 -1. + PYWGYYZ0 REVENUES .05507 OBJECTIV -.05507 + PYWGYYZ0 PASSNGRS 1. RPMILES .93376 + PYWGYYZ0 LFRPMASM -.93376 DMYWGYYZ 1. + PYWGYYZ0 P1032X45 -1. LF1032S3 -1. + PYWGYYZ1 REVENUES .05507 OBJECTIV -.05507 + PYWGYYZ1 PASSNGRS 1. RPMILES .93376 + PYWGYYZ1 LFRPMASM -.93376 DMYWGYYZ 1. + PYWGYYZ1 P1035X34 -1. LF1035S2 -1. + PYWGYYZ2 REVENUES .05507 OBJECTIV -.05507 + PYWGYYZ2 PASSNGRS 1. RPMILES .93376 + PYWGYYZ2 LFRPMASM -.93376 DMYWGYYZ 1. + PYWGYYZ2 P1037X23 -1. LF1037S1 -1. + PYWGYYZ3 REVENUES .05507 OBJECTIV -.05507 + PYWGYYZ3 PASSNGRS 1. RPMILES .93376 + PYWGYYZ3 LFRPMASM -.93376 DMYWGYYZ 1. + PYWGYYZ3 P1038X23 -1. LF1038S1 -1. + PBOSOAK0 REVENUES .13432 OBJECTIV -.13432 + PBOSOAK0 PASSNGRS 1. RPMILES 2.68687 + PBOSOAK0 LFRPMASM -2.68687 DMBOSOAK 1. + PBOSOAK0 LF1046S2 -1. + PBOSOAK6 REVENUES -.01157 OBJECTIV .01157 + PBOSOAK6 PASSNGRS -1. DMBOSOAK 1. + PBOSOAK6 DMBOSSFO -1. DMSFOOAK -1. + PBOSBUR1 REVENUES -.03469 OBJECTIV .03469 + PBOSBUR1 PASSNGRS -1. DMBOSBUR 1. + PBOSBUR1 DMBOSSFO -1. DMBURSFO -1. + PBOSBUR2 REVENUES -.04664 OBJECTIV .04664 + PBOSBUR2 PASSNGRS -2. DMBOSBUR 1. + PBOSBUR2 DMBOSSFO -1. DMLAXSFO -1. + PBOSBUR2 DMLAXBUR -1. + PBOSONT1 REVENUES -.03725 OBJECTIV .03725 + PBOSONT1 PASSNGRS -1. DMBOSONT 1. + PBOSONT1 DMBOSSFO -1. DMONTSFO -1. + PBOSONT2 REVENUES -.04996 OBJECTIV .04996 + PBOSONT2 PASSNGRS -2. DMBOSONT 1. + PBOSONT2 DMBOSSFO -1. DMLAXSFO -1. + PBOSONT2 DMLAXONT -1. + PBURYVR1 REVENUES -.01353 OBJECTIV .01353 + PBURYVR1 PASSNGRS -1. DMBURYVR 1. + PBURYVR1 DMBURSEA -1. DMSEAYVR -1. + PBURTYO1 REVENUES -.02686 OBJECTIV .02686 + PBURTYO1 PASSNGRS -1. DMBURTYO 1. + PBURTYO1 DMBURSEA -1. DMSEATYO -1. + PBURTPE1 REVENUES -.02529 OBJECTIV .02529 + PBURTPE1 PASSNGRS -1. DMBURTPE 1. + PBURTPE1 DMBURSEA -1. DMSEATPE -1. + PBURHNL0 REVENUES .12896 OBJECTIV -.12896 + PBURHNL0 PASSNGRS 1. RPMILES 2.55929 + PBURHNL0 LFRPMASM -2.55929 DMBURHNL 1. + PBURHNL0 LF1005S2 -1. + PBURHNL6 REVENUES -.01132 OBJECTIV .01132 + PBURHNL6 PASSNGRS -1. DMBURHNL 1. + PBURHNL6 DMLAXBUR -1. DMHNLLAX -1. + PHNLOAK0 REVENUES .12225 OBJECTIV -.12225 + PHNLOAK0 PASSNGRS 1. RPMILES 2.88537 + PHNLOAK0 LFRPMASM -2.88537 DMHNLOAK 1. + PHNLOAK0 LF1005S1 -1. LF1005S2 -1. + PHNLOAK1 REVENUES .12225 OBJECTIV -.12225 + PHNLOAK1 PASSNGRS 1. RPMILES 2.89192 + PHNLOAK1 LFRPMASM -2.89192 DMHNLOAK 1. + PHNLOAK1 LF1105S1 -1. LF1105S2 -1. + PHNLOAK2 REVENUES .12225 OBJECTIV -.12225 + PHNLOAK2 PASSNGRS 1. RPMILES 2.96093 + PHNLOAK2 LFRPMASM -2.96093 DMHNLOAK 1. + PHNLOAK2 LF1006S1 -1. LF1006S2 -1. + PHNLOAK8 REVENUES -.03719 OBJECTIV .03719 + PHNLOAK8 PASSNGRS -1. DMHNLOAK 1. + PHNLOAK8 DMHNLLAX -1. DMLAXOAK -1. + PHNLONT0 REVENUES .13063 OBJECTIV -.13063 + PHNLONT0 PASSNGRS 1. RPMILES 2.59897 + PHNLONT0 LFRPMASM -2.59897 DMHNLONT 1. + PHNLONT0 LF1006S2 -1. + PHNLONT6 REVENUES -.0116 OBJECTIV .0116 + PHNLONT6 PASSNGRS -1. DMHNLONT 1. + PHNLONT6 DMHNLLAX -1. DMLAXONT -1. + PHNLYWG1 REVENUES -.01893 OBJECTIV .01893 + PHNLYWG1 PASSNGRS -1. DMHNLYWG 1. + PHNLYWG1 DMHNLYVR -1. DMYVRYWG -1. + PHNLYYZ1 REVENUES -.02585 OBJECTIV .02585 + PHNLYYZ1 PASSNGRS -1. DMHNLYYZ 1. + PHNLYYZ1 DMHNLYVR -1. DMYVRYYZ -1. + PHNLYUL1 REVENUES -.02429 OBJECTIV .02429 + PHNLYUL1 PASSNGRS -1. DMHNLYUL 1. + PHNLYUL1 DMHNLYVR -1. DMYULYVR -1. + PLASTYO1 REVENUES -.02076 OBJECTIV .02076 + PLASTYO1 PASSNGRS -1. DMLASTYO 1. + PLASTYO1 DMLASSEA -1. DMSEATYO -1. + PLASTPE1 REVENUES -.01956 OBJECTIV .01956 + PLASTPE1 PASSNGRS -1. DMLASTPE 1. + PLASTPE1 DMLASSEA -1. DMSEATPE -1. + PLAXLON0 REVENUES .25019 OBJECTIV -.25019 + PLAXLON0 PASSNGRS 1. RPMILES 5.7422 + PLAXLON0 LFRPMASM -5.7422 DMLAXLON 1. + PLAXLON0 LF1026S1 -1. LF1026S2 -1. + PLAXLON6 REVENUES -.02843 OBJECTIV .02843 + PLAXLON6 PASSNGRS -1. DMLAXLON 1. + PLAXLON6 DMLAXSEA -1. DMLONSEA -1. + PLAXLON7 REVENUES -.03096 OBJECTIV .03096 + PLAXLON7 PASSNGRS -1. DMLAXLON 1. + PLAXLON7 DMLAXYVR -1. DMLONYVR -1. + PLAXPAR0 REVENUES .25943 OBJECTIV -.25943 + PLAXPAR0 PASSNGRS 1. RPMILES 5.96857 + PLAXPAR0 LFRPMASM -5.96857 DMLAXPAR 1. + PLAXPAR0 LF1026S1 -1. LF1026S2 -1. + PLAXPAR0 LF1026S3 -1. + PLAXPAR6 REVENUES -.02868 OBJECTIV .02868 + PLAXPAR6 PASSNGRS -1. DMLAXPAR 1. + PLAXPAR6 DMLAXSEA -1. DMPARSEA -1. + PLAXPAR7 REVENUES -.03123 OBJECTIV .03123 + PLAXPAR7 PASSNGRS -1. DMLAXPAR 1. + PLAXPAR7 DMLAXYVR -1. DMPARYVR -1. + PBURLON1 REVENUES -.02834 OBJECTIV .02834 + PBURLON1 PASSNGRS -1. DMBURLON 1. + PBURLON1 DMBURSEA -1. DMLONSEA -1. + PBURPAR1 REVENUES -.02859 OBJECTIV .02859 + PBURPAR1 PASSNGRS -1. DMBURPAR 1. + PBURPAR1 DMBURSEA -1. DMPARSEA -1. + PLONONT1 REVENUES -.02984 OBJECTIV .02984 + PLONONT1 PASSNGRS -1. DMLONONT 1. + PLONONT1 DMLONSEA -1. DMONTSEA -1. + PLONOAK1 REVENUES -.0197 OBJECTIV .0197 + PLONOAK1 PASSNGRS -1. DMLONOAK 1. + PLONOAK1 DMLONSEA -1. DMOAKSEA -1. + POAKPAR1 REVENUES -.0198 OBJECTIV .0198 + POAKPAR1 PASSNGRS -1. DMOAKPAR 1. + POAKPAR1 DMOAKSEA -1. DMPARSEA -1. + POAKTYO1 REVENUES -.028 OBJECTIV .028 + POAKTYO1 PASSNGRS -1. DMOAKTYO 1. + POAKTYO1 DMOAKSEA -1. DMSEATYO -1. + POAKTPE1 REVENUES -.02654 OBJECTIV .02654 + POAKTPE1 PASSNGRS -1. DMOAKTPE 1. + POAKTPE1 DMOAKSEA -1. DMSEATPE -1. + PONTPAR1 REVENUES -.03012 OBJECTIV .03012 + PONTPAR1 PASSNGRS -1. DMONTPAR 1. + PONTPAR1 DMONTSEA -1. DMPARSEA -1. + PONTTYO1 REVENUES -.02605 OBJECTIV .02605 + PONTTYO1 PASSNGRS -1. DMONTTYO 1. + PONTTYO1 DMONTSEA -1. DMSEATYO -1. + PONTTPE1 REVENUES -.02451 OBJECTIV .02451 + PONTTPE1 PASSNGRS -1. DMONTTPE 1. + PONTTPE1 DMONTSEA -1. DMSEATPE -1. + PPARSFO1 REVENUES -.01968 OBJECTIV .01968 + PPARSFO1 PASSNGRS -1. DMPARSFO 1. + PPARSFO1 DMPARSEA -1. DMSEASFO -1. + PRNOTYO1 REVENUES -.02132 OBJECTIV .02132 + PRNOTYO1 PASSNGRS -1. DMRNOTYO 1. + PRNOTYO1 DMRNOSEA -1. DMSEATYO -1. + PRNOTPE1 REVENUES -.0202 OBJECTIV .0202 + PRNOTPE1 PASSNGRS -1. DMRNOTPE 1. + PRNOTPE1 DMRNOSEA -1. DMSEATPE -1. + PTPEYWG1 REVENUES -.03219 OBJECTIV .03219 + PTPEYWG1 PASSNGRS -1. DMTPEYWG 1. + PTPEYWG1 DMTPEYVR -1. DMYVRYWG -1. + PTPEYYZ1 REVENUES -.04208 OBJECTIV .04208 + PTPEYYZ1 PASSNGRS -1. DMTPEYYZ 1. + PTPEYYZ1 DMTPEYVR -1. DMYVRYYZ -1. + PTPEYUL1 REVENUES -.05292 OBJECTIV .05292 + PTPEYUL1 PASSNGRS -1. DMTPEYUL 1. + PTPEYUL1 DMTPEYVR -1. DMYULYVR -1. + PTYOYUL1 REVENUES -.0427 OBJECTIV .0427 + PTYOYUL1 PASSNGRS -1. DMTYOYUL 1. + PTYOYUL1 DMTYOYVR -1. DMYULYVR -1. + PTYOYYZ1 REVENUES -.03452 OBJECTIV .03452 + PTYOYYZ1 PASSNGRS -1. DMTYOYYZ 1. + PTYOYYZ1 DMTYOYVR -1. DMYVRYYZ -1. + PTYOYWG1 REVENUES -.02803 OBJECTIV .02803 + PTYOYWG1 PASSNGRS -1. DMTYOYWG 1. + PTYOYWG1 DMTYOYVR -1. DMYVRYWG -1. + PLAXONT0 REVENUES .01351 OBJECTIV -.01351 + PLAXONT0 PASSNGRS 1. RPMILES .04564 + PLAXONT0 LFRPMASM -.04564 DMLAXONT 1. + PLAXONT0 LF1050S2 -1. + GRDTIMO1 FLAV*1 1. ACOCOSTS .457 + GRDTIMO1 OBJECTIV .457 + GRDTIMN1 FLAV*1 1. ACOCOSTS -.13333 + GRDTIMN1 OBJECTIV -.13333 + GRDTIMO2 FLAV*2 1. ACOCOSTS .318 + GRDTIMO2 OBJECTIV .318 + GRDTIMN2 FLAV*2 1. ACOCOSTS -.10692 + GRDTIMN2 OBJECTIV -.10692 + GRDTIMO3 FLAV*3 1. ACOCOSTS .206 + GRDTIMO3 OBJECTIV .206 + GRDTIMN3 FLAV*3 1. + GRDTIMO4 FLAV*4 1. ACOCOSTS .25 + GRDTIMO4 OBJECTIV .25 + GRDTIMN4 FLAV*4 1. + GRDTIMO5 FLAV*5 1. ACOCOSTS .163 + GRDTIMO5 OBJECTIV .163 + GRDTIMN5 FLAV*5 1. + GRDTIMO6 FLAV*6 1. ACOCOSTS .095 + GRDTIMO6 OBJECTIV .095 + GRDTIMN6 FLAV*6 1. + N1001AC1 ACOCOSTS 14.0062 OBJECTIV 14.0062 + N1001AC1 SYSTDEPT 1. ACMILES 2.67711 + N1001AC1 ASMILES 1086.90576 LFRPMASM 760.834032 + N1001AC1 FLAV*1 5.53037 LF1001S1 284. + N1001AC1 MSHNLSEA 1. P1001X32 67. + N1001AC2 ACOCOSTS 10.44277 OBJECTIV 10.44277 + N1001AC2 SYSTDEPT 1. ACMILES 2.67711 + N1001AC2 ASMILES 690.69434 LFRPMASM 483.486038 + N1001AC2 FLAV*2 5.5491 LF1001S1 180. + N1001AC2 MSHNLSEA 1. P1001X32 67. + N1001AC3 ACOCOSTS 7.65023 OBJECTIV 7.65023 + N1001AC3 SYSTDEPT 1. ACMILES 2.67711 + N1001AC3 ASMILES 492.58813 LFRPMASM 344.811691 + N1001AC3 FLAV*3 5.74745 LF1001S1 128. + N1001AC3 MSHNLSEA 1. P1001X32 67. + N1002AC1 ACOCOSTS 16.89049 OBJECTIV 16.89049 + N1002AC1 SYSTDEPT 2. ACMILES 2.80333 + N1002AC1 ASMILES 1138.1499 LFRPMASM 796.70493 + N1002AC1 FLAV*1 6.41046 LF1002S1 243. + N1002AC1 LF1002S2 284. MSSEAYVR 1. + N1002AC1 MSHNLYVR 1. MSHNLSEA 1. + N1002AC1 P1002X32 109. P1002X42 40. + N1002AC1 P1002X43 67. + N1002AC2 ACOCOSTS 12.39107 OBJECTIV 12.39107 + N1002AC2 SYSTDEPT 2. ACMILES 2.80333 + N1002AC2 ASMILES 723.25806 LFRPMASM 506.280642 + N1002AC2 FLAV*2 6.35099 LF1002S1 154. + N1002AC2 LF1002S2 180. MSSEAYVR 1. + N1002AC2 MSHNLYVR 1. MSHNLSEA 1. + N1002AC2 P1002X32 109. P1002X42 40. + N1002AC2 P1002X43 67. + N1002AC3 ACOCOSTS 8.97425 OBJECTIV 8.97425 + N1002AC3 SYSTDEPT 2. ACMILES 2.80333 + N1002AC3 ASMILES 515.81177 LFRPMASM 361.068239 + N1002AC3 FLAV*3 6.41862 LF1002S1 110. + N1002AC3 LF1002S2 128. MSSEAYVR 1. + N1002AC3 MSHNLYVR 1. MSHNLSEA 1. + N1002AC3 P1002X32 109. P1002X42 40. + N1002AC3 P1002X43 67. + N1003AC1 ACOCOSTS 13.46672 OBJECTIV 13.46672 + N1003AC1 SYSTDEPT 1. ACMILES 2.55338 + N1003AC1 ASMILES 1036.67114 LFRPMASM 725.669798 + N1003AC1 FLAV*1 5.30481 LF1003S1 243. + N1003AC1 MSHNLLAX 1. P1003X32 118. + N1003AC2 ACOCOSTS 10.03075 OBJECTIV 10.03075 + N1003AC2 SYSTDEPT 1. ACMILES 2.55338 + N1003AC2 ASMILES 658.77124 LFRPMASM 461.139868 + N1003AC2 FLAV*2 5.31883 LF1003S1 154. + N1003AC2 MSHNLLAX 1. P1003X32 118. + N1003AC3 ACOCOSTS 7.34337 OBJECTIV 7.34337 + N1003AC3 SYSTDEPT 1. ACMILES 2.55338 + N1003AC3 ASMILES 469.82129 LFRPMASM 328.874903 + N1003AC3 FLAV*3 5.50122 LF1003S1 110. + N1003AC3 MSHNLLAX 1. P1003X32 118. + N1004AC1 ACOCOSTS 17.27667 OBJECTIV 17.27667 + N1004AC1 SYSTDEPT 2. ACMILES 2.8919 + N1004AC1 ASMILES 1174.11182 LFRPMASM 821.878274 + N1004AC1 FLAV*1 6.57193 LF1004S1 243. + N1004AC1 LF1004S2 243. MSLAXSFO 1. + N1004AC1 MSHNLSFO 1. MSHNLLAX 1. + N1004AC1 P1004X32 168. P1004X43 118. + N1004AC2 ACOCOSTS 12.68603 OBJECTIV 12.68603 + N1004AC2 SYSTDEPT 2. ACMILES 2.8919 + N1004AC2 ASMILES 746.11035 LFRPMASM 522.277245 + N1004AC2 FLAV*2 6.51583 LF1004S1 154. + N1004AC2 LF1004S2 154. MSLAXSFO 1. + N1004AC2 MSHNLSFO 1. MSHNLLAX 1. + N1004AC2 P1004X32 168. P1004X43 118. + N1004AC3 ACOCOSTS 9.19391 OBJECTIV 9.19391 + N1004AC3 SYSTDEPT 2. ACMILES 2.8919 + N1004AC3 ASMILES 532.10986 LFRPMASM 372.476902 + N1004AC3 FLAV*3 6.59488 LF1004S1 110. + N1004AC3 LF1004S2 110. MSLAXSFO 1. + N1004AC3 MSHNLSFO 1. MSHNLLAX 1. + N1004AC3 P1004X32 168. P1004X43 118. + N1005AC3 ACOCOSTS 9.1777 OBJECTIV 9.1777 + N1005AC3 SYSTDEPT 2. ACMILES 2.88537 + N1005AC3 ASMILES 530.90723 LFRPMASM 371.635061 + N1005AC3 FLAV*3 6.58188 LF1005S1 128. + N1005AC3 LF1005S2 128. MSBUROAK 1. + N1005AC3 MSHNLOAK 1. + N1105AC3 ACOCOSTS 9.19396 OBJECTIV 9.19396 + N1105AC3 SYSTDEPT 2. ACMILES 2.89192 + N1105AC3 ASMILES 532.11377 LFRPMASM 372.479639 + N1105AC3 FLAV*3 6.59493 LF1105S1 128. + N1105AC3 LF1105S2 110. MSLAXOAK 1. + N1105AC3 MSHNLOAK 1. MSHNLLAX 1. + N1105AC3 P1105X32 46. P1105X43 118. + N1006AC3 ACOCOSTS 9.3651 OBJECTIV 9.3651 + N1006AC3 SYSTDEPT 2. ACMILES 2.96093 + N1006AC3 ASMILES 544.81104 LFRPMASM 381.367728 + N1006AC3 FLAV*3 6.73225 LF1006S1 128. + N1006AC3 LF1006S2 128. MSOAKONT 1. + N1006AC3 MSHNLOAK 1. + N1007AC1 ACOCOSTS 27.19154 OBJECTIV 27.19154 + N1007AC1 SYSTDEPT 2. ACMILES 5.16595 + N1007AC1 ASMILES 2097.37598 LFRPMASM 1468.163186 + N1007AC1 FLAV*1 10.71753 LF1007S1 284. + N1007AC1 LF1007S2 284. MSBOSSEA 1. + N1007AC1 MSBOSHNL 1. MSHNLSEA 1. + N1007AC1 P1007X43 67. + N1007AC2 ACOCOSTS 20.25861 OBJECTIV 20.25861 + N1007AC2 SYSTDEPT 2. ACMILES 5.16595 + N1007AC2 ASMILES 1332.81494 LFRPMASM 932.970458 + N1007AC2 FLAV*2 10.74784 LF1007S1 180. + N1007AC2 LF1007S2 180. MSBOSSEA 1. + N1007AC2 MSBOSHNL 1. MSHNLSEA 1. + N1007AC2 P1007X43 67. + N1007AC3 ACOCOSTS 14.83356 OBJECTIV 14.83356 + N1007AC3 SYSTDEPT 2. ACMILES 5.16595 + N1007AC3 ASMILES 950.53516 LFRPMASM 665.374612 + N1007AC3 FLAV*3 11.12024 LF1007S1 128. + N1007AC3 LF1007S2 128. MSBOSSEA 1. + N1007AC3 MSBOSHNL 1. MSHNLSEA 1. + N1007AC3 P1007X43 67. + N1008AC1 ACOCOSTS 11.99082 OBJECTIV 11.99082 + N1008AC1 SYSTDEPT 3. ACMILES 1.14422 + N1008AC1 ASMILES 464.55518 LFRPMASM 325.188626 + N1008AC1 FLAV*1 4.03592 LF1008S1 243. + N1008AC1 LF1008S2 243. LF1008S3 243. + N1008AC1 MSSEAYVR 1. MSSFOYVR 1. + N1008AC1 MSLAXYVR 1. MSSEASFO 1. + N1008AC1 MSLAXSEA 1. MSLAXSFO 1. + N1008AC1 P1008X32 109. P1008X42 71. + N1008AC1 P1008X52 77. P1008X34 170. + N1008AC1 P1008X53 139. P1008X54 168. + N1008AC2 ACOCOSTS 8.39427 OBJECTIV 8.39427 + N1008AC2 SYSTDEPT 3. ACMILES 1.14422 + N1008AC2 ASMILES 295.20972 LFRPMASM 206.646804 + N1008AC2 FLAV*2 3.8304 LF1008S1 154. + N1008AC2 LF1008S2 154. LF1008S3 154. + N1008AC2 MSSEAYVR 1. MSSFOYVR 1. + N1008AC2 MSLAXYVR 1. MSSEASFO 1. + N1008AC2 MSLAXSEA 1. MSLAXSFO 1. + N1008AC2 P1008X32 109. P1008X42 71. + N1008AC2 P1008X52 77. P1008X34 170. + N1008AC2 P1008X53 139. P1008X54 168. + N1008AC3 ACOCOSTS 5.87068 OBJECTIV 5.87068 + N1008AC3 SYSTDEPT 3. ACMILES 1.14422 + N1008AC3 ASMILES 210.53731 LFRPMASM 147.376117 + N1008AC3 FLAV*3 3.53701 LF1008S1 110. + N1008AC3 LF1008S2 110. LF1008S3 110. + N1008AC3 MSSEAYVR 1. MSSFOYVR 1. + N1008AC3 MSLAXYVR 1. MSSEASFO 1. + N1008AC3 MSLAXSEA 1. MSLAXSFO 1. + N1008AC3 P1008X32 109. P1008X42 71. + N1008AC3 P1008X52 77. P1008X34 170. + N1008AC3 P1008X53 139. P1008X54 168. + N1008AC4 ACOCOSTS 3.99147 OBJECTIV 3.99147 + N1008AC4 SYSTDEPT 3. ACMILES 1.14422 + N1008AC4 ASMILES 109.84555 LFRPMASM 76.891885 + N1008AC4 FLAV*4 3.40841 LF1008S1 57. + N1008AC4 LF1008S2 57. LF1008S3 57. + N1008AC4 MSSEAYVR 1. MSSFOYVR 1. + N1008AC4 MSLAXYVR 1. MSSEASFO 1. + N1008AC4 MSLAXSEA 1. MSLAXSFO 1. + N1008AC4 P1008X32 109. P1008X42 71. + N1008AC4 P1008X52 77. P1008X34 170. + N1008AC4 P1008X53 139. P1008X54 168. + N1008AC5 ACOCOSTS 4.41133 OBJECTIV 4.41133 + N1008AC5 SYSTDEPT 3. ACMILES 1.14422 + N1008AC5 ASMILES 141.8838 LFRPMASM 99.31866 + N1008AC5 FLAV*5 3.42334 LF1008S1 74. + N1008AC5 LF1008S2 74. LF1008S3 74. + N1008AC5 MSSEAYVR 1. MSSFOYVR 1. + N1008AC5 MSLAXYVR 1. MSSEASFO 1. + N1008AC5 MSLAXSEA 1. MSLAXSFO 1. + N1008AC5 P1008X32 109. P1008X42 71. + N1008AC5 P1008X52 77. P1008X34 170. + N1008AC5 P1008X53 139. P1008X54 168. + N1008AC6 ACOCOSTS 3.43737 OBJECTIV 3.43737 + N1008AC6 SYSTDEPT 3. ACMILES 1.14422 + N1008AC6 ASMILES 108.70131 LFRPMASM 76.090917 + N1008AC6 FLAV*6 3.59515 LF1008S1 56. + N1008AC6 LF1008S2 56. LF1008S3 56. + N1008AC6 MSSEAYVR 1. MSSFOYVR 1. + N1008AC6 MSLAXYVR 1. MSSEASFO 1. + N1008AC6 MSLAXSEA 1. MSLAXSFO 1. + N1008AC6 P1008X32 109. P1008X42 71. + N1008AC6 P1008X52 77. P1008X34 170. + N1008AC6 P1008X53 139. P1008X54 168. + N1009AC1 ACOCOSTS 9.38535 OBJECTIV 9.38535 + N1009AC1 SYSTDEPT 2. ACMILES 1.08196 + N1009AC1 ASMILES 439.27612 LFRPMASM 307.493284 + N1009AC1 FLAV*1 3.27241 LF1009S1 243. + N1009AC1 LF1009S2 243. MSSEAYVR 1. + N1009AC1 MSLAXYVR 1. MSLAXSEA 1. + N1009AC1 P1009X32 109. P1009X42 77. + N1009AC1 P1009X43 139. + N1009AC2 ACOCOSTS 6.65893 OBJECTIV 6.65893 + N1009AC2 SYSTDEPT 2. ACMILES 1.08196 + N1009AC2 ASMILES 279.14575 LFRPMASM 195.402025 + N1009AC2 FLAV*2 3.14753 LF1009S1 154. + N1009AC2 LF1009S2 154. MSSEAYVR 1. + N1009AC2 MSLAXYVR 1. MSLAXSEA 1. + N1009AC2 P1009X32 109. P1009X42 77. + N1009AC2 P1009X43 139. + N1009AC3 ACOCOSTS 4.70526 OBJECTIV 4.70526 + N1009AC3 SYSTDEPT 2. ACMILES 1.08196 + N1009AC3 ASMILES 199.08081 LFRPMASM 139.356567 + N1009AC3 FLAV*3 2.9931 LF1009S1 110. + N1009AC3 LF1009S2 110. MSSEAYVR 1. + N1009AC3 MSLAXYVR 1. MSLAXSEA 1. + N1009AC3 P1009X32 109. P1009X42 77. + N1009AC3 P1009X43 139. + N1009AC4 ACOCOSTS 3.27055 OBJECTIV 3.27055 + N1009AC4 SYSTDEPT 2. ACMILES 1.08196 + N1009AC4 ASMILES 103.86824 LFRPMASM 72.707768 + N1009AC4 FLAV*4 2.90163 LF1009S1 57. + N1009AC4 LF1009S2 57. MSSEAYVR 1. + N1009AC4 MSLAXYVR 1. MSLAXSEA 1. + N1009AC4 P1009X32 109. P1009X42 77. + N1009AC4 P1009X43 139. + N1009AC5 ACOCOSTS 3.58556 OBJECTIV 3.58556 + N1009AC5 SYSTDEPT 2. ACMILES 1.08196 + N1009AC5 ASMILES 134.16312 LFRPMASM 93.914184 + N1009AC5 FLAV*5 2.92913 LF1009S1 74. + N1009AC5 LF1009S2 74. MSSEAYVR 1. + N1009AC5 MSLAXYVR 1. MSLAXSEA 1. + N1009AC5 P1009X32 109. P1009X42 77. + N1009AC5 P1009X43 139. + N1010AC1 ACOCOSTS 2.8843 OBJECTIV 2.8843 + N1010AC1 SYSTDEPT 1. ACMILES .12622 + N1010AC1 ASMILES 51.24359 LFRPMASM 35.870513 + N1010AC1 FLAV*1 .88009 LF1010S1 243. + N1010AC1 MSSEAYVR 1. P1010X32 109. + N1010AC2 ACOCOSTS 1.9483 OBJECTIV 1.9483 + N1010AC2 SYSTDEPT 1. ACMILES .12622 + N1010AC2 ASMILES 32.56366 LFRPMASM 22.794562 + N1010AC2 FLAV*2 .80189 LF1010S1 154. + N1010AC2 MSSEAYVR 1. P1010X32 109. + N1010AC3 ACOCOSTS 1.32401 OBJECTIV 1.32401 + N1010AC3 SYSTDEPT 1. ACMILES .12622 + N1010AC3 ASMILES 23.22369 LFRPMASM 16.256583 + N1010AC3 FLAV*3 .67117 LF1010S1 110. + N1010AC3 MSSEAYVR 1. P1010X32 109. + N1010AC4 ACOCOSTS .84307 OBJECTIV .84307 + N1010AC4 SYSTDEPT 1. ACMILES .12622 + N1010AC4 ASMILES 12.11671 LFRPMASM 8.481697 + N1010AC4 FLAV*4 .6329 LF1010S1 57. + N1010AC4 MSSEAYVR 1. P1010X32 109. + N1010AC5 ACOCOSTS .95496 OBJECTIV .95496 + N1010AC5 SYSTDEPT 1. ACMILES .12622 + N1010AC5 ASMILES 15.65075 LFRPMASM 10.955525 + N1010AC5 FLAV*5 .62384 LF1010S1 74. + N1010AC5 MSSEAYVR 1. P1010X32 109. + N1010AC6 ACOCOSTS .67624 OBJECTIV .67624 + N1010AC6 SYSTDEPT 1. ACMILES .12622 + N1010AC6 ASMILES 11.9905 LFRPMASM 8.39335 + N1010AC6 FLAV*6 .61067 LF1010S1 56. + N1010AC6 MSSEAYVR 1. P1010X32 109. + N1011AC1 ACOCOSTS 9.10651 OBJECTIV 9.10651 + N1011AC1 SYSTDEPT 2. ACMILES 1.01801 + N1011AC1 ASMILES 413.31152 LFRPMASM 289.318064 + N1011AC1 FLAV*1 3.15583 LF1011S1 243. + N1011AC1 LF1011S2 243. MSSEASFO 1. + N1011AC1 MSLAXSEA 1. MSLAXSFO 1. + N1011AC1 P1011X23 170. P1011X42 139. + N1011AC1 P1011X43 168. + N1011AC2 ACOCOSTS 6.44597 OBJECTIV 6.44597 + N1011AC2 SYSTDEPT 2. ACMILES 1.01801 + N1011AC2 ASMILES 262.64624 LFRPMASM 183.852368 + N1011AC2 FLAV*2 3.02851 LF1011S1 154. + N1011AC2 LF1011S2 154. MSSEASFO 1. + N1011AC2 MSLAXSEA 1. MSLAXSFO 1. + N1011AC2 P1011X23 170. P1011X42 139. + N1011AC2 P1011X43 168. + N1011AC3 ACOCOSTS 4.54666 OBJECTIV 4.54666 + N1011AC3 SYSTDEPT 2. ACMILES 1.01801 + N1011AC3 ASMILES 187.31361 LFRPMASM 131.119527 + N1011AC3 FLAV*3 2.86584 LF1011S1 110. + N1011AC3 LF1011S2 110. MSSEASFO 1. + N1011AC3 MSLAXSEA 1. MSLAXSFO 1. + N1011AC3 P1011X23 170. P1011X42 139. + N1011AC3 P1011X43 168. + N1011AC4 ACOCOSTS 3.1484 OBJECTIV 3.1484 + N1011AC4 SYSTDEPT 2. ACMILES 1.01801 + N1011AC4 ASMILES 97.72881 LFRPMASM 68.410167 + N1011AC4 FLAV*4 2.77551 LF1011S1 57. + N1011AC4 LF1011S2 57. MSSEASFO 1. + N1011AC4 MSLAXSEA 1. MSLAXSFO 1. + N1011AC4 P1011X23 170. P1011X42 139. + N1011AC4 P1011X43 168. + N1011AC5 ACOCOSTS 3.45638 OBJECTIV 3.45638 + N1011AC5 SYSTDEPT 2. ACMILES 1.01801 + N1011AC5 ASMILES 126.23305 LFRPMASM 88.363135 + N1011AC5 FLAV*5 2.7995 LF1011S1 74. + N1011AC5 LF1011S2 74. MSSEASFO 1. + N1011AC5 MSLAXSEA 1. MSLAXSFO 1. + N1011AC5 P1011X23 170. P1011X42 139. + N1011AC5 P1011X43 168. + N1011AC6 ACOCOSTS 2.76114 OBJECTIV 2.76114 + N1011AC6 SYSTDEPT 2. ACMILES 1.01801 + N1011AC6 ASMILES 96.7108 LFRPMASM 67.69756 + N1011AC6 FLAV*6 2.98447 LF1011S1 56. + N1011AC6 LF1011S2 56. MSSEASFO 1. + N1011AC6 MSLAXSEA 1. MSLAXSFO 1. + N1011AC6 P1011X23 170. P1011X42 139. + N1011AC6 P1011X43 168. + N1012AC1 ACOCOSTS 6.50105 OBJECTIV 6.50105 + N1012AC1 SYSTDEPT 1. ACMILES .95575 + N1012AC1 ASMILES 388.03247 LFRPMASM 271.622729 + N1012AC1 FLAV*1 2.39232 LF1012S1 243. + N1012AC1 MSLAXSEA 1. P1012X32 139. + N1012AC2 ACOCOSTS 4.71063 OBJECTIV 4.71063 + N1012AC2 SYSTDEPT 1. ACMILES .95575 + N1012AC2 ASMILES 246.58224 LFRPMASM 172.607568 + N1012AC2 FLAV*2 2.34564 LF1012S1 154. + N1012AC2 MSLAXSEA 1. P1012X32 139. + N1012AC3 ACOCOSTS 3.38125 OBJECTIV 3.38125 + N1012AC3 SYSTDEPT 1. ACMILES .95575 + N1012AC3 ASMILES 175.85712 LFRPMASM 123.099984 + N1012AC3 FLAV*3 2.32193 LF1012S1 110. + N1012AC3 MSLAXSEA 1. P1012X32 139. + N1012AC4 ACOCOSTS 2.42747 OBJECTIV 2.42747 + N1012AC4 SYSTDEPT 1. ACMILES .95575 + N1012AC4 ASMILES 91.7515 LFRPMASM 64.22605 + N1012AC4 FLAV*4 2.26873 LF1012S1 57. + N1012AC4 MSLAXSEA 1. P1012X32 139. + N1012AC5 MSLAXSEA 1. P1012X32 139. + N1012AC5 ASMILES 118.51237 LFRPMASM 82.958659 + N1012AC5 FLAV*5 2.30529 SYSTDEPT 1. + N1012AC5 ACMILES .95575 ACOCOSTS 2.6306 + N1012AC5 OBJECTIV 2.6306 LF1012S1 74. + N1013AC3 ACOCOSTS 4.58479 OBJECTIV 4.58479 + N1013AC3 SYSTDEPT 2. ACMILES 1.03338 + N1013AC3 ASMILES 190.14275 LFRPMASM 133.099925 + N1013AC3 FLAV*3 2.89643 LF1013S1 128. + N1013AC3 LF1013S2 128. MSOAKSEA 1. + N1013AC3 MSONTSEA 1. MSOAKONT 1. + N1013AC3 P1013X32 43. P1013X42 25. + N1013AC4 ACOCOSTS 3.17776 OBJECTIV 3.17776 + N1013AC4 SYSTDEPT 2. ACMILES 1.03338 + N1013AC4 ASMILES 99.20493 LFRPMASM 69.443451 + N1013AC4 FLAV*4 2.80583 LF1013S1 67. + N1013AC4 LF1013S2 67. MSOAKSEA 1. + N1013AC4 MSONTSEA 1. MSOAKONT 1. + N1013AC4 P1013X32 43. P1013X42 25. + N1013AC5 ACOCOSTS 3.48744 OBJECTIV 3.48744 + N1013AC5 SYSTDEPT 2. ACMILES 1.03338 + N1013AC5 ASMILES 128.13968 LFRPMASM 89.697776 + N1013AC5 FLAV*5 2.83067 LF1013S1 86. + N1013AC5 LF1013S2 86. MSOAKSEA 1. + N1013AC5 MSONTSEA 1. MSOAKONT 1. + N1013AC5 P1013X32 43. P1013X42 25. + N1013AC6 ACOCOSTS 2.78943 OBJECTIV 2.78943 + N1013AC6 SYSTDEPT 2. ACMILES 1.03338 + N1013AC6 ASMILES 98.17149 LFRPMASM 68.720043 + N1013AC6 FLAV*6 3.01988 LF1013S1 66. + N1013AC6 LF1013S2 66. MSOAKSEA 1. + N1013AC6 MSONTSEA 1. MSOAKONT 1. + N1013AC6 P1013X32 43. P1013X42 25. + N1014AC3 ACOCOSTS 4.4958 OBJECTIV 4.4958 + N1014AC3 SYSTDEPT 2. ACMILES .9975 + N1014AC3 ASMILES 183.53999 LFRPMASM 128.477993 + N1014AC3 FLAV*3 2.82502 LF1014S1 128. + N1014AC3 LF1014S2 128. MSOAKSEA 1. + N1014AC3 MSBURSEA 1. MSBUROAK 1. + N1014AC3 P1014X32 43. + N1014AC4 ACOCOSTS 3.10922 OBJECTIV 3.10922 + N1014AC4 SYSTDEPT 2. ACMILES .9975 + N1014AC4 ASMILES 95.75999 LFRPMASM 67.031993 + N1014AC4 FLAV*4 2.73507 LF1014S1 67. + N1014AC4 LF1014S2 67. MSOAKSEA 1. + N1014AC4 MSBURSEA 1. MSBUROAK 1. + N1014AC4 P1014X32 43. + N1014AC5 ACOCOSTS 3.41495 OBJECTIV 3.41495 + N1014AC5 SYSTDEPT 2. ACMILES .9975 + N1014AC5 ASMILES 123.68999 LFRPMASM 86.582993 + N1014AC5 FLAV*5 2.75793 LF1014S1 86. + N1014AC5 LF1014S2 86. MSOAKSEA 1. + N1014AC5 MSBURSEA 1. MSBUROAK 1. + N1014AC5 P1014X32 43. + N1014AC6 ACOCOSTS 2.7234 OBJECTIV 2.7234 + N1014AC6 SYSTDEPT 2. ACMILES .9975 + N1014AC6 ASMILES 94.7625 LFRPMASM 66.33375 + N1014AC6 FLAV*6 2.93724 LF1014S1 66. + N1014AC6 LF1014S2 66. MSOAKSEA 1. + N1014AC6 MSBURSEA 1. MSBUROAK 1. + N1014AC6 P1014X32 43. + N1015AC3 ACOCOSTS 4.60806 OBJECTIV 4.60806 + N1015AC3 SYSTDEPT 2. ACMILES 1.04277 + N1015AC3 ASMILES 191.86919 LFRPMASM 134.308433 + N1015AC3 FLAV*3 2.91511 LF1015S1 110. + N1015AC3 LF1015S2 128. MSSEASFO 1. + N1015AC3 MSONTSEA 1. MSONTSFO 1. + N1015AC3 P1015X23 170. P1015X42 25. + N1015AC3 P1015X43 69. + N1015AC4 ACOCOSTS 3.19568 OBJECTIV 3.19568 + N1015AC4 SYSTDEPT 2. ACMILES 1.04277 + N1015AC4 ASMILES 100.10562 LFRPMASM 70.073934 + N1015AC4 FLAV*4 2.82434 LF1015S1 57. + N1015AC4 LF1015S2 67. MSSEASFO 1. + N1015AC4 MSONTSEA 1. MSONTSFO 1. + N1015AC4 P1015X23 170. P1015X42 25. + N1015AC4 P1015X43 69. + N1015AC5 ACOCOSTS 3.50639 OBJECTIV 3.50639 + N1015AC5 SYSTDEPT 2. ACMILES 1.04277 + N1015AC5 ASMILES 129.30312 LFRPMASM 90.512184 + N1015AC5 FLAV*5 2.84969 LF1015S1 74. + N1015AC5 LF1015S2 86. MSSEASFO 1. + N1015AC5 MSONTSEA 1. MSONTSFO 1. + N1015AC5 P1015X23 170. P1015X42 25. + N1015AC5 P1015X43 69. + N1015AC6 ACOCOSTS 2.80669 OBJECTIV 2.80669 + N1015AC6 SYSTDEPT 2. ACMILES 1.04277 + N1015AC6 ASMILES 99.06287 LFRPMASM 69.344009 + N1015AC6 FLAV*6 3.04149 LF1015S1 56. + N1015AC6 LF1015S2 66. MSSEASFO 1. + N1015AC6 MSONTSEA 1. MSONTSFO 1. + N1015AC6 P1015X23 170. P1015X42 25. + N1015AC6 P1015X43 69. + N1016AC3 ACOCOSTS 4.51701 OBJECTIV 4.51701 + N1016AC3 SYSTDEPT 2. ACMILES 1.00605 + N1016AC3 ASMILES 185.11406 LFRPMASM 129.579842 + N1016AC3 FLAV*3 2.84205 LF1016S1 110. + N1016AC3 LF1016S2 128. MSSEASFO 1. + N1016AC3 MSBURSEA 1. MSBURSFO 1. + N1016AC3 P1016X23 170. P1016X43 81. + N1016AC4 ACOCOSTS 3.12556 OBJECTIV 3.12556 + N1016AC4 SYSTDEPT 2. ACMILES 1.00605 + N1016AC4 ASMILES 96.58124 LFRPMASM 67.606868 + N1016AC4 FLAV*4 2.75194 LF1016S1 57. + N1016AC4 LF1016S2 67. MSSEASFO 1. + N1016AC4 MSBURSEA 1. MSBURSFO 1. + N1016AC4 P1016X23 170. P1016X43 81. + N1016AC5 ACOCOSTS 3.43223 OBJECTIV 3.43223 + N1016AC5 SYSTDEPT 2. ACMILES 1.00605 + N1016AC5 ASMILES 124.75075 LFRPMASM 87.325525 + N1016AC5 FLAV*5 2.77527 LF1016S1 74. + N1016AC5 LF1016S2 86. MSSEASFO 1. + N1016AC5 MSBURSEA 1. MSBURSFO 1. + N1016AC5 P1016X23 170. P1016X43 81. + N1016AC6 ACOCOSTS 2.73914 OBJECTIV 2.73914 + N1016AC6 SYSTDEPT 2. ACMILES 1.00605 + N1016AC6 ASMILES 95.57518 LFRPMASM 66.902626 + N1016AC6 FLAV*6 2.95694 LF1016S1 56. + N1016AC6 LF1016S2 66. MSSEASFO 1. + N1016AC6 MSBURSEA 1. MSBURSFO 1. + N1016AC6 P1016X23 170. P1016X43 81. + N1017AC3 ACOCOSTS 4.52672 OBJECTIV 4.52672 + N1017AC3 SYSTDEPT 2. ACMILES 1.00997 + N1017AC3 ASMILES 185.8343 LFRPMASM 130.08401 + N1017AC3 FLAV*3 2.84984 LF1017S1 128. + N1017AC3 LF1017S2 128. MSOAKSEA 1. + N1017AC3 MSLAXSEA 1. MSLAXOAK 1. + N1017AC3 P1017X32 43. P1017X42 139. + N1017AC3 P1017X43 46. + N1017AC4 ACOCOSTS 3.13304 OBJECTIV 3.13304 + N1017AC4 SYSTDEPT 2. ACMILES 1.00997 + N1017AC4 ASMILES 96.95699 LFRPMASM 67.869893 + N1017AC4 FLAV*4 2.75966 LF1017S1 67. + N1017AC4 LF1017S2 67. MSOAKSEA 1. + N1017AC4 MSLAXSEA 1. MSLAXOAK 1. + N1017AC4 P1017X32 43. P1017X42 139. + N1017AC4 P1017X43 46. + N1017AC5 ACOCOSTS 3.44014 OBJECTIV 3.44014 + N1017AC5 SYSTDEPT 2. ACMILES 1.00997 + N1017AC5 ASMILES 125.23611 LFRPMASM 87.665277 + N1017AC5 FLAV*5 2.78321 LF1017S1 86. + N1017AC5 LF1017S2 86. MSOAKSEA 1. + N1017AC5 MSLAXSEA 1. MSLAXOAK 1. + N1017AC5 P1017X32 43. P1017X42 139. + N1017AC5 P1017X43 46. + N1017AC6 ACOCOSTS 2.74634 OBJECTIV 2.74634 + N1017AC6 SYSTDEPT 2. ACMILES 1.00997 + N1017AC6 ASMILES 95.94705 LFRPMASM 67.162935 + N1017AC6 FLAV*6 2.96596 LF1017S1 66. + N1017AC6 LF1017S2 66. MSOAKSEA 1. + N1017AC6 MSLAXSEA 1. MSLAXOAK 1. + N1017AC6 P1017X32 43. P1017X42 139. + N1017AC6 P1017X43 46. + N1018AC1 ACOCOSTS 7.67623 OBJECTIV 7.67623 + N1018AC1 SYSTDEPT 2. ACMILES .68996 + N1018AC1 ASMILES 280.12378 LFRPMASM 196.086646 + N1018AC1 FLAV*1 2.5578 LF1018S1 243. + N1018AC1 LF1018S2 243. MSSEAYVR 1. + N1018AC1 MSRNOYVR 1. MSRNOSEA 1. + N1018AC1 P1018X32 109. P1018X43 85. + N1018AC2 ACOCOSTS 5.35357 OBJECTIV 5.35357 + N1018AC2 SYSTDEPT 2. ACMILES .68996 + N1018AC2 ASMILES 178.00974 LFRPMASM 124.606818 + N1018AC2 FLAV*2 2.41802 LF1018S1 154. + N1018AC2 LF1018S2 154. MSSEAYVR 1. + N1018AC2 MSRNOYVR 1. MSRNOSEA 1. + N1018AC2 P1018X32 109. P1018X43 85. + N1018AC3 ACOCOSTS 3.7331 OBJECTIV 3.7331 + N1018AC3 SYSTDEPT 2. ACMILES .68996 + N1018AC3 ASMILES 126.95268 LFRPMASM 88.866876 + N1018AC3 FLAV*3 2.21302 LF1018S1 110. + N1018AC3 LF1018S2 110. MSSEAYVR 1. + N1018AC3 MSRNOYVR 1. MSRNOSEA 1. + N1018AC3 P1018X32 109. P1018X43 85. + N1018AC4 ACOCOSTS 2.52182 OBJECTIV 2.52182 + N1018AC4 SYSTDEPT 2. ACMILES .68996 + N1018AC4 ASMILES 66.23618 LFRPMASM 46.365326 + N1018AC4 FLAV*4 2.1286 LF1018S1 57. + N1018AC4 LF1018S2 57. MSSEAYVR 1. + N1018AC4 MSRNOYVR 1. MSRNOSEA 1. + N1018AC4 P1018X32 109. P1018X43 85. + N1018AC5 ACOCOSTS 2.79372 OBJECTIV 2.79372 + N1018AC5 SYSTDEPT 2. ACMILES .68996 + N1018AC5 ASMILES 85.55505 LFRPMASM 59.888535 + N1018AC5 FLAV*5 2.13455 LF1018S1 74. + N1018AC5 LF1018S2 74. MSSEAYVR 1. + N1018AC5 MSRNOYVR 1. MSRNOSEA 1. + N1018AC5 P1018X32 109. P1018X43 85. + N1018AC6 ACOCOSTS 2.15753 OBJECTIV 2.15753 + N1018AC6 SYSTDEPT 2. ACMILES .68996 + N1018AC6 ASMILES 65.54617 LFRPMASM 45.882319 + N1018AC6 FLAV*6 2.22898 LF1018S1 56. + N1018AC6 LF1018S2 56. MSSEAYVR 1. + N1018AC6 MSRNOYVR 1. MSRNOSEA 1. + N1018AC6 P1018X32 109. P1018X43 85. + N1019AC1 ACOCOSTS 9.00153 OBJECTIV 9.00153 + N1019AC1 SYSTDEPT 2. ACMILES .99393 + N1019AC1 ASMILES 403.53516 LFRPMASM 282.474612 + N1019AC1 FLAV*1 3.11193 LF1019S1 243. + N1019AC1 LF1019S2 243. MSSEAYVR 1. + N1019AC1 MSLASYVR 1. MSLASSEA 1. + N1019AC1 P1019X32 109. P1019X43 110. + N1019AC2 ACOCOSTS 6.36578 OBJECTIV 6.36578 + N1019AC2 SYSTDEPT 2. ACMILES .99393 + N1019AC2 ASMILES 256.43359 LFRPMASM 179.503513 + N1019AC2 FLAV*2 2.9837 LF1019S1 154. + N1019AC2 LF1019S2 154. MSSEAYVR 1. + N1019AC2 MSLASYVR 1. MSLASSEA 1. + N1019AC2 P1019X32 109. P1019X43 110. + N1019AC3 ACOCOSTS 4.48694 OBJECTIV 4.48694 + N1019AC3 SYSTDEPT 2. ACMILES .99393 + N1019AC3 ASMILES 182.88293 LFRPMASM 128.018051 + N1019AC3 FLAV*3 2.81792 LF1019S1 110. + N1019AC3 LF1019S2 110. MSSEAYVR 1. + N1019AC3 MSLASYVR 1. MSLASSEA 1. + N1019AC3 P1019X32 109. P1019X43 110. + N1019AC4 ACOCOSTS 3.1024 OBJECTIV 3.1024 + N1019AC4 SYSTDEPT 2. ACMILES .99393 + N1019AC4 ASMILES 95.41718 LFRPMASM 66.792026 + N1019AC4 FLAV*4 2.72803 LF1019S1 57. + N1019AC4 LF1019S2 57. MSSEAYVR 1. + N1019AC4 MSLASYVR 1. MSLASSEA 1. + N1019AC4 P1019X32 109. P1019X43 110. + N1019AC5 ACOCOSTS 3.40774 OBJECTIV 3.40774 + N1019AC5 SYSTDEPT 2. ACMILES .99393 + N1019AC5 ASMILES 123.24718 LFRPMASM 86.273026 + N1019AC5 FLAV*5 2.75069 LF1019S1 74. + N1019AC5 LF1019S2 74. MSSEAYVR 1. + N1019AC5 MSLASYVR 1. MSLASSEA 1. + N1019AC5 P1019X32 109. P1019X43 110. + N1020AC1 ACOCOSTS 4.79193 OBJECTIV 4.79193 + N1020AC1 SYSTDEPT 1. ACMILES .56374 + N1020AC1 ASMILES 228.88037 LFRPMASM 160.216259 + N1020AC1 FLAV*1 1.67771 LF1020S1 243. + N1020AC1 MSRNOSEA 1. P1020X32 85. + N1020AC2 ACOCOSTS 3.40527 OBJECTIV 3.40527 + N1020AC2 SYSTDEPT 1. ACMILES .56374 + N1020AC2 ASMILES 145.44612 LFRPMASM 101.812284 + N1020AC2 FLAV*2 1.61613 LF1020S1 154. + N1020AC2 MSRNOSEA 1. P1020X32 85. + N1020AC3 ACOCOSTS 2.40909 OBJECTIV 2.40909 + N1020AC3 SYSTDEPT 1. ACMILES .56374 + N1020AC3 ASMILES 103.72899 LFRPMASM 72.610293 + N1020AC3 FLAV*3 1.54185 LF1020S1 110. + N1020AC3 MSRNOSEA 1. P1020X32 85. + N1020AC4 ACOCOSTS 1.67875 OBJECTIV 1.67875 + N1020AC4 SYSTDEPT 1. ACMILES .56374 + N1020AC4 ASMILES 54.11951 LFRPMASM 37.883657 + N1020AC4 FLAV*4 1.4957 LF1020S1 57. + N1020AC4 MSRNOSEA 1. P1020X32 85. + N1020AC5 ACOCOSTS 1.83876 OBJECTIV 1.83876 + N1020AC5 SYSTDEPT 1. ACMILES .56374 + N1020AC5 ASMILES 69.90431 LFRPMASM 48.933017 + N1020AC5 FLAV*5 1.51071 LF1020S1 74. + N1020AC5 MSRNOSEA 1. P1020X32 85. + N1020AC6 ACOCOSTS 1.48129 OBJECTIV 1.48129 + N1020AC6 SYSTDEPT 1. ACMILES .56374 + N1020AC6 ASMILES 53.55576 LFRPMASM 37.489032 + N1020AC6 FLAV*6 1.6183 LF1020S1 56. + N1020AC6 MSRNOSEA 1. P1020X32 85. + N1021AC1 ACOCOSTS 6.11723 OBJECTIV 6.11723 + N1021AC1 SYSTDEPT 1. ACMILES .86771 + N1021AC1 ASMILES 352.2915 LFRPMASM 246.60405 + N1021AC1 FLAV*1 2.23184 LF1021S1 243. + N1021AC1 MSLASSEA 1. P1021X32 110. + N1021AC2 ACOCOSTS 4.41748 OBJECTIV 4.41748 + N1021AC2 SYSTDEPT 1. ACMILES .86771 + N1021AC2 ASMILES 223.87006 LFRPMASM 156.709042 + N1021AC2 FLAV*2 2.18181 LF1021S1 154. + N1021AC2 MSLASSEA 1. P1021X32 110. + N1021AC3 ACOCOSTS 3.16293 OBJECTIV 3.16293 + N1021AC3 SYSTDEPT 1. ACMILES .86771 + N1021AC3 ASMILES 159.65924 LFRPMASM 111.761468 + N1021AC3 FLAV*3 2.14675 LF1021S1 110. + N1021AC3 MSLASSEA 1. P1021X32 110. + N1021AC4 ACOCOSTS 2.25933 OBJECTIV 2.25933 + N1021AC4 SYSTDEPT 1. ACMILES .86771 + N1021AC4 ASMILES 83.30049 LFRPMASM 58.310343 + N1021AC4 FLAV*4 2.09513 LF1021S1 57. + N1021AC4 MSLASSEA 1. P1021X32 110. + N1021AC5 ACOCOSTS 2.45278 OBJECTIV 2.45278 + N1021AC5 SYSTDEPT 1. ACMILES .86771 + N1021AC5 ASMILES 107.59644 LFRPMASM 75.317508 + N1021AC5 FLAV*5 2.12685 LF1021S1 74. + N1021AC5 MSLASSEA 1. P1021X32 110. + N1022AC1 ACOCOSTS 40.32039 OBJECTIV 40.32039 + N1022AC1 SYSTDEPT 3. ACMILES 7.64184 + N1022AC1 ASMILES 3102.58496 LFRPMASM 2171.809472 + N1022AC1 FLAV*1 15.88107 LF1022S1 284. + N1022AC1 LF1022S2 284. LF1022S3 284. + N1022AC1 NOPTLON1 2. NOPTLON0 2. + N1022AC1 MSHNLYVR 1. MSLONYVR 1. + N1022AC1 MSLONPAR 1. P1022X23 40. + N1023AC1 ACOCOSTS 29.4082 OBJECTIV 29.4082 + N1023AC1 SYSTDEPT 3. ACMILES 5.13904 + N1023AC1 ASMILES 2086.44897 LFRPMASM 1460.514279 + N1023AC1 FLAV*1 11.31847 LF1023S1 243. + N1023AC1 LF1023S2 243. LF1023S3 284. + N1023AC1 NOPTLON1 2. NOPTLON0 2. + N1023AC1 MSSEAYVR 1. MSLONYVR 1. + N1023AC1 MSLONSEA 1. MSPARSEA 1. + N1023AC1 MSLONPAR 1. P1023X32 109. + N1026AC1 ACOCOSTS 33.02493 OBJECTIV 33.02493 + N1026AC1 SYSTDEPT 3. ACMILES 5.96857 + N1026AC1 ASMILES 2423.23682 LFRPMASM 1696.265774 + N1026AC1 FLAV*1 12.8307 LF1026S1 243. + N1026AC1 LF1026S2 243. LF1026S3 284. + N1026AC1 NOPTLON1 2. NOPTLON0 2. + N1026AC1 MSLAXSEA 1. MSLAXLON 1. + N1026AC1 MSLONSEA 1. MSPARSEA 1. + N1026AC1 MSLONPAR 1. P1026X23 139. + N1027AC1 ACOCOSTS 37.74599 OBJECTIV 37.74599 + N1027AC1 SYSTDEPT 3. ACMILES 7.05137 + N1027AC1 ASMILES 2862.85791 LFRPMASM 2004.000537 + N1027AC1 FLAV*1 14.80466 LF1027S1 243. + N1027AC1 LF1027S2 263. LF1027S3 284. + N1027AC1 NOPTTYO1 2. NOPTTYO0 2. + N1027AC1 MSLAXSEA 1. MSLAXTPE 1. + N1027AC1 MSSEATYO 1. MSSEATPE 1. + N1027AC1 MSTPETYO 1. P1027X23 139. + N1027AC1 P1027X25 18. + N1028AC1 ACOCOSTS 36.5415 OBJECTIV 36.5415 + N1028AC1 SYSTDEPT 3. ACMILES 6.77512 + N1028AC1 ASMILES 2750.69678 LFRPMASM 1925.487746 + N1028AC1 FLAV*1 14.30104 LF1028S1 243. + N1028AC1 LF1028S2 263. LF1028S3 284. + N1028AC1 NOPTTYO1 2. NOPTTYO0 2. + N1028AC1 MSSEASFO 1. MSSEATYO 1. + N1028AC1 MSSEATPE 1. MSTPETYO 1. + N1028AC1 P1028X32 170. + N1029AC1 ACOCOSTS 42.82423 OBJECTIV 42.82423 + N1029AC1 SYSTDEPT 5. ACMILES 7.14547 + N1029AC1 ASMILES 2901.05981 LFRPMASM 2030.741867 + N1029AC1 FLAV*1 16.27618 LF1029S1 243. + N1029AC1 LF1029S2 243. LF1029S3 243. + N1029AC1 LF1029S4 304. LF1029S5 284. + N1029AC1 NOPTTYO1 2. NOPTTYO0 2. + N1029AC1 MSLAXSFO 1. MSLAXSEA 1. + N1029AC1 MSLAXYVR 1. MSLAXTPE 1. + N1029AC1 MSSEASFO 1. MSSFOYVR 1. + N1029AC1 MSSEAYVR 1. MSSEATYO 1. + N1029AC1 MSSEATPE 1. MSTPETYO 1. + N1029AC1 P1029X23 168. P1029X24 139. + N1029AC1 P1029X25 77. P1029X27 18. + N1029AC1 P1029X43 170. P1029X35 71. + N1029AC1 P1029X45 109. + N1030AC1 ACOCOSTS 40.35146 OBJECTIV 40.35146 + N1030AC1 SYSTDEPT 4. ACMILES 7.11364 + N1030AC1 ASMILES 2888.13794 LFRPMASM 2021.696558 + N1030AC1 FLAV*1 15.56816 LF1030S1 243. + N1030AC1 LF1030S2 243. LF1030S3 263. + N1030AC1 LF1030S4 284. NOPTTYO1 2. + N1030AC1 NOPTTYO0 2. MSLAXSFO 1. + N1030AC1 MSLAXSEA 1. MSLAXTPE 1. + N1030AC1 MSSEASFO 1. MSSEATYO 1. + N1030AC1 MSSEATPE 1. MSTPETYO 1. + N1030AC1 P1030X23 168. P1030X24 139. + N1030AC1 P1030X26 18. P1030X43 170. + N1032AC1 ACOCOSTS 23.8204 OBJECTIV 23.8204 + N1032AC1 SYSTDEPT 5. ACMILES 2.78679 + N1032AC1 ASMILES 1131.43799 LFRPMASM 792.006593 + N1032AC1 FLAV*1 8.33032 LF1032S1 243. + N1032AC1 LF1032S2 284. LF1032S3 284. + N1032AC1 LF1032S4 284. LF1032S5 243. + N1032AC1 MSSEAYVR 1. MSBOSSEA 1. + N1032AC1 MSYVRYWG 1. MSYVRYYZ 1. + N1032AC1 MSYULYVR 1. MSBOSYVR 1. + N1032AC1 MSYWGYYZ 1. MSYULYWG 1. + N1032AC1 MSBOSYWG 1. MSYULYYZ 1. + N1032AC1 MSBOSYYZ 1. MSBOSYUL 1. + N1032AC1 P1032X23 109. P1032X34 89. + N1032AC1 P1032X35 76. P1032X63 44. + N1032AC1 P1032X45 83. P1032X64 99. + N1032AC1 P1032X65 130. P1032X75 85. + N1032AC1 P1032X76 115. + N1032AC2 ACOCOSTS 16.92001 OBJECTIV 16.92001 + N1032AC2 SYSTDEPT 5. ACMILES 2.78679 + N1032AC2 ASMILES 718.99268 LFRPMASM 503.294876 + N1032AC2 FLAV*2 8.02122 LF1032S1 154. + N1032AC2 LF1032S2 180. LF1032S3 180. + N1032AC2 LF1032S4 180. LF1032S5 154. + N1032AC2 MSSEAYVR 1. MSBOSSEA 1. + N1032AC2 MSYVRYWG 1. MSYVRYYZ 1. + N1032AC2 MSYULYVR 1. MSBOSYVR 1. + N1032AC2 MSYWGYYZ 1. MSYULYWG 1. + N1032AC2 MSBOSYWG 1. MSYULYYZ 1. + N1032AC2 MSBOSYYZ 1. MSBOSYUL 1. + N1032AC2 P1032X23 109. P1032X34 89. + N1032AC2 P1032X35 76. P1032X63 44. + N1032AC2 P1032X45 83. P1032X64 99. + N1032AC2 P1032X65 130. P1032X75 85. + N1032AC2 P1032X76 115. + N1032AC3 ACOCOSTS 11.96625 OBJECTIV 11.96625 + N1032AC3 SYSTDEPT 5. ACMILES 2.78679 + N1032AC3 ASMILES 512.76978 LFRPMASM 358.938846 + N1032AC3 FLAV*3 7.64572 LF1032S1 110. + N1032AC3 LF1032S2 128. LF1032S3 128. + N1032AC3 LF1032S4 128. LF1032S5 110. + N1032AC3 MSSEAYVR 1. MSBOSSEA 1. + N1032AC3 MSYVRYWG 1. MSYVRYYZ 1. + N1032AC3 MSYULYVR 1. MSBOSYVR 1. + N1032AC3 MSYWGYYZ 1. MSYULYWG 1. + N1032AC3 MSBOSYWG 1. MSYULYYZ 1. + N1032AC3 MSBOSYYZ 1. MSBOSYUL 1. + N1032AC3 P1032X23 109. P1032X34 89. + N1032AC3 P1032X35 76. P1032X63 44. + N1032AC3 P1032X45 83. P1032X64 99. + N1032AC3 P1032X65 130. P1032X75 85. + N1032AC3 P1032X76 115. + N1032AC4 ACOCOSTS 8.33277 OBJECTIV 8.33277 + N1032AC4 SYSTDEPT 5. ACMILES 2.78679 + N1032AC4 ASMILES 267.53198 LFRPMASM 187.272386 + N1032AC4 FLAV*4 7.41556 LF1032S1 57. + N1032AC4 LF1032S2 67. LF1032S3 67. + N1032AC4 LF1032S4 67. LF1032S5 57. + N1032AC4 MSSEAYVR 1. MSBOSSEA 1. + N1032AC4 MSYVRYWG 1. MSYVRYYZ 1. + N1032AC4 MSYULYVR 1. MSBOSYVR 1. + N1032AC4 MSYWGYYZ 1. MSYULYWG 1. + N1032AC4 MSBOSYWG 1. MSYULYYZ 1. + N1032AC4 MSBOSYYZ 1. MSBOSYUL 1. + N1032AC4 P1032X23 109. P1032X34 89. + N1032AC4 P1032X35 76. P1032X63 44. + N1032AC4 P1032X45 83. P1032X64 99. + N1032AC4 P1032X65 130. P1032X75 85. + N1032AC4 P1032X76 115. + N1032AC5 ACOCOSTS 9.12932 OBJECTIV 9.12932 + N1032AC5 SYSTDEPT 5. ACMILES 2.78679 + N1032AC5 ASMILES 345.56226 LFRPMASM 241.893582 + N1032AC5 FLAV*5 7.48883 LF1032S1 74. + N1032AC5 LF1032S2 86. LF1032S3 86. + N1032AC5 LF1032S4 86. LF1032S5 74. + N1032AC5 MSSEAYVR 1. MSBOSSEA 1. + N1032AC5 MSYVRYWG 1. MSYVRYYZ 1. + N1032AC5 MSYULYVR 1. MSBOSYVR 1. + N1032AC5 MSYWGYYZ 1. MSYULYWG 1. + N1032AC5 MSBOSYWG 1. MSYULYYZ 1. + N1032AC5 MSBOSYYZ 1. MSBOSYUL 1. + N1032AC5 P1032X23 109. P1032X34 89. + N1032AC5 P1032X35 76. P1032X63 44. + N1032AC5 P1032X45 83. P1032X64 99. + N1032AC5 P1032X65 130. P1032X75 85. + N1032AC5 P1032X76 115. + N1033AC1 ACOCOSTS 18.08295 OBJECTIV 18.08295 + N1033AC1 SYSTDEPT 3. ACMILES 2.5415 + N1033AC1 ASMILES 1031.8501 LFRPMASM 722.29507 + N1033AC1 FLAV*1 6.58316 LF1033S1 284. + N1033AC1 LF1033S2 284. LF1033S3 243. + N1033AC1 MSYVRYWG 1. MSYULYVR 1. + N1033AC1 MSBOSYVR 1. MSYULYWG 1. + N1033AC1 MSBOSYWG 1. MSBOSYUL 1. + N1033AC1 P1033X23 89. P1033X42 44. + N1033AC1 P1033X43 99. P1033X54 115. + N1033AC2 ACOCOSTS 13.0472 OBJECTIV 13.0472 + N1033AC2 SYSTDEPT 3. ACMILES 2.5415 + N1033AC2 ASMILES 655.70752 LFRPMASM 458.995264 + N1033AC2 FLAV*2 6.43074 LF1033S1 180. + N1033AC2 LF1033S2 180. LF1033S3 154. + N1033AC2 MSYVRYWG 1. MSYULYVR 1. + N1033AC2 MSBOSYVR 1. MSYULYWG 1. + N1033AC2 MSBOSYWG 1. MSBOSYUL 1. + N1033AC2 P1033X23 89. P1033X42 44. + N1033AC2 P1033X43 99. P1033X54 115. + N1033AC3 ACOCOSTS 9.33593 OBJECTIV 9.33593 + N1033AC3 SYSTDEPT 3. ACMILES 2.5415 + N1033AC3 ASMILES 467.63647 LFRPMASM 327.345529 + N1033AC3 FLAV*3 6.31759 LF1033S1 128. + N1033AC3 LF1033S2 128. LF1033S3 110. + N1033AC3 MSYVRYWG 1. MSYULYVR 1. + N1033AC3 MSBOSYVR 1. MSYULYWG 1. + N1033AC3 MSBOSYWG 1. MSBOSYUL 1. + N1033AC3 P1033X23 89. P1033X42 44. + N1033AC3 P1033X43 99. P1033X54 115. + N1033AC4 ACOCOSTS 6.66027 OBJECTIV 6.66027 + N1033AC4 SYSTDEPT 3. ACMILES 2.5415 + N1033AC4 ASMILES 243.98424 LFRPMASM 170.788968 + N1033AC4 FLAV*4 6.16384 LF1033S1 67. + N1033AC4 LF1033S2 67. LF1033S3 57. + N1033AC4 MSYVRYWG 1. MSYULYVR 1. + N1033AC4 MSBOSYVR 1. MSYULYWG 1. + N1033AC4 MSBOSYWG 1. MSBOSYUL 1. + N1033AC4 P1033X23 89. P1033X42 44. + N1033AC4 P1033X43 99. P1033X54 115. + N1033AC5 ACOCOSTS 7.23383 OBJECTIV 7.23383 + N1033AC5 SYSTDEPT 3. ACMILES 2.5415 + N1033AC5 ASMILES 315.14624 LFRPMASM 220.602368 + N1033AC5 FLAV*5 6.25562 LF1033S1 86. + N1033AC5 LF1033S2 86. LF1033S3 74. + N1033AC5 MSYVRYWG 1. MSYULYVR 1. + N1033AC5 MSBOSYVR 1. MSYULYWG 1. + N1033AC5 MSBOSYWG 1. MSBOSYUL 1. + N1033AC5 P1033X23 89. P1033X42 44. + N1033AC5 P1033X43 99. P1033X54 115. + N1034AC1 ACOCOSTS 15.09963 OBJECTIV 15.09963 + N1034AC1 SYSTDEPT 2. ACMILES 2.39258 + N1034AC1 ASMILES 971.38599 LFRPMASM 679.970193 + N1034AC1 FLAV*1 5.66166 LF1034S1 284. + N1034AC1 LF1034S2 284. MSYVRYYZ 1. + N1034AC1 MSYULYVR 1. MSYULYYZ 1. + N1034AC1 P1034X23 76. P1034X42 44. + N1034AC1 P1034X43 130. + N1034AC2 ACOCOSTS 11.02328 OBJECTIV 11.02328 + N1034AC2 SYSTDEPT 2. ACMILES 2.39258 + N1034AC2 ASMILES 617.28467 LFRPMASM 432.099269 + N1034AC2 FLAV*2 5.58658 LF1034S1 180. + N1034AC2 LF1034S2 180. MSYVRYYZ 1. + N1034AC2 MSYULYVR 1. MSYULYYZ 1. + N1034AC2 P1034X23 76. P1034X42 44. + N1034AC2 P1034X43 130. + N1034AC3 ACOCOSTS 7.95559 OBJECTIV 7.95559 + N1034AC3 SYSTDEPT 2. ACMILES 2.39258 + N1034AC3 ASMILES 440.23389 LFRPMASM 308.163723 + N1034AC3 FLAV*3 5.60122 LF1034S1 128. + N1034AC3 LF1034S2 128. MSYVRYYZ 1. + N1034AC3 MSYULYVR 1. MSYULYYZ 1. + N1034AC3 P1034X23 76. P1034X42 44. + N1034AC3 P1034X43 130. + N1035AC1 ACOCOSTS 13.78819 OBJECTIV 13.78819 + N1035AC1 SYSTDEPT 2. ACMILES 2.09179 + N1035AC1 ASMILES 849.26563 LFRPMASM 594.485941 + N1035AC1 FLAV*1 5.11333 LF1035S1 284. + N1035AC1 LF1035S2 284. MSYVRYWG 1. + N1035AC1 MSYVRYYZ 1. MSYWGYYZ 1. + N1035AC1 P1035X23 89. P1035X24 76. + N1035AC1 P1035X34 83. + N1035AC2 ACOCOSTS 10.02165 OBJECTIV 10.02165 + N1035AC2 SYSTDEPT 2. ACMILES 2.09179 + N1035AC2 ASMILES 539.68115 LFRPMASM 377.776805 + N1035AC2 FLAV*2 5.02682 LF1035S1 180. + N1035AC2 LF1035S2 180. MSYVRYWG 1. + N1035AC2 MSYVRYYZ 1. MSYWGYYZ 1. + N1035AC2 P1035X23 89. P1035X24 76. + N1035AC2 P1035X34 83. + N1035AC3 ACOCOSTS 7.20963 OBJECTIV 7.20963 + N1035AC3 SYSTDEPT 2. ACMILES 2.09179 + N1035AC3 ASMILES 384.88867 LFRPMASM 269.422069 + N1035AC3 FLAV*3 5.00266 LF1035S1 128. + N1035AC3 LF1035S2 128. MSYVRYWG 1. + N1035AC3 MSYVRYYZ 1. MSYWGYYZ 1. + N1035AC3 P1035X23 89. P1035X24 76. + N1035AC3 P1035X34 83. + N1035AC4 ACOCOSTS 5.19931 OBJECTIV 5.19931 + N1035AC4 SYSTDEPT 2. ACMILES 2.09179 + N1035AC4 ASMILES 200.81155 LFRPMASM 140.568085 + N1035AC4 FLAV*4 4.893 LF1035S1 67. + N1035AC4 LF1035S2 67. MSYVRYWG 1. + N1035AC4 MSYVRYYZ 1. MSYWGYYZ 1. + N1035AC4 P1035X23 89. P1035X24 76. + N1035AC4 P1035X34 83. + N1035AC5 ACOCOSTS 5.62541 OBJECTIV 5.62541 + N1035AC5 SYSTDEPT 2. ACMILES 2.09179 + N1035AC5 ASMILES 259.38159 LFRPMASM 181.567113 + N1035AC5 FLAV*5 4.97605 LF1035S1 86. + N1035AC5 LF1035S2 86. MSYVRYWG 1. + N1035AC5 MSYVRYYZ 1. MSYWGYYZ 1. + N1035AC5 P1035X23 89. P1035X24 76. + N1035AC5 P1035X34 83. + N1036AC1 ACOCOSTS 15.74868 OBJECTIV 15.74868 + N1036AC1 SYSTDEPT 2. ACMILES 2.54144 + N1036AC1 ASMILES 1031.82446 LFRPMASM 722.277122 + N1036AC1 FLAV*1 5.93304 LF1036S1 284. + N1036AC1 LF1036S2 243. MSYULYVR 1. + N1036AC1 MSBOSYVR 1. MSBOSYUL 1. + N1036AC1 P1036X32 44. P1036X43 115. + N1036AC2 ACOCOSTS 11.51899 OBJECTIV 11.51899 + N1036AC2 SYSTDEPT 2. ACMILES 2.54144 + N1036AC2 ASMILES 655.69141 LFRPMASM 458.983987 + N1036AC2 FLAV*2 5.86362 LF1036S1 180. + N1036AC2 LF1036S2 154. MSYULYVR 1. + N1036AC2 MSBOSYVR 1. MSBOSYUL 1. + N1036AC2 P1036X32 44. P1036X43 115. + N1036AC3 ACOCOSTS 8.32477 OBJECTIV 8.32477 + N1036AC3 SYSTDEPT 2. ACMILES 2.54144 + N1036AC3 ASMILES 467.62476 LFRPMASM 327.337332 + N1036AC3 FLAV*3 5.89746 LF1036S1 128. + N1036AC3 LF1036S2 110. MSYULYVR 1. + N1036AC3 MSBOSYVR 1. MSBOSYUL 1. + N1036AC3 P1036X32 44. P1036X43 115. + N1037AC4 ACOCOSTS 3.5884 OBJECTIV 3.5884 + N1037AC4 SYSTDEPT 2. ACMILES 1.24837 + N1037AC4 ASMILES 119.84406 LFRPMASM 83.890842 + N1037AC4 FLAV*4 3.2298 LF1037S1 67. + N1037AC4 LF1037S2 67. MSYWGYYZ 1. + N1037AC4 MSYULYWG 1. MSYULYYZ 1. + N1037AC4 P1037X23 83. P1037X42 99. + N1037AC4 P1037X43 130. + N1037AC5 ACOCOSTS 3.92172 OBJECTIV 3.92172 + N1037AC5 SYSTDEPT 2. ACMILES 1.24837 + N1037AC5 ASMILES 154.79855 LFRPMASM 108.358985 + N1037AC5 FLAV*5 3.26646 LF1037S1 86. + N1037AC5 LF1037S2 86. MSYWGYYZ 1. + N1037AC5 MSYULYWG 1. MSYULYYZ 1. + N1037AC5 P1037X23 83. P1037X42 99. + N1037AC5 P1037X43 130. + N1038AC4 ACOCOSTS 2.38548 OBJECTIV 2.38548 + N1038AC4 SYSTDEPT 1. ACMILES .93376 + N1038AC4 ASMILES 89.64105 LFRPMASM 62.748735 + N1038AC4 FLAV*4 2.22538 LF1038S1 67. + N1038AC4 MSYWGYYZ 1. P1038X23 83. + N1038AC5 ACOCOSTS 2.5862 OBJECTIV 2.5862 + N1038AC5 SYSTDEPT 1. ACMILES .93376 + N1038AC5 ASMILES 115.78636 LFRPMASM 81.050452 + N1038AC5 FLAV*5 2.26073 LF1038S1 86. + N1038AC5 MSYWGYYZ 1. P1038X23 83. + N1039AC4 ACOCOSTS 2.75896 OBJECTIV 2.75896 + N1039AC4 SYSTDEPT 1. ACMILES 1.1293 + N1039AC4 ASMILES 108.41281 LFRPMASM 75.888967 + N1039AC4 FLAV*4 2.61098 LF1039S1 67. + N1039AC4 MSYULYWG 1. P1039X32 99. + N1039AC5 ACOCOSTS 2.98119 OBJECTIV 2.98119 + N1039AC5 SYSTDEPT 1. ACMILES 1.1293 + N1039AC5 ASMILES 140.03325 LFRPMASM 98.023275 + N1039AC5 FLAV*5 2.65709 LF1039S1 86. + N1039AC5 MSYULYWG 1. P1039X32 99. + N1040AC4 ACOCOSTS 2.29039 OBJECTIV 2.29039 + N1040AC4 SYSTDEPT 2. ACMILES .56879 + N1040AC4 ASMILES 54.60388 LFRPMASM 38.222716 + N1040AC4 FLAV*4 1.88965 LF1040S1 67. + N1040AC4 LF1040S2 57. MSYULYYZ 1. + N1040AC4 MSBOSYYZ 1. MSBOSYUL 1. + N1040AC4 P1040X32 130. P1040X42 85. + N1040AC4 P1040X43 115. + N1040AC5 ACOCOSTS 2.54896 OBJECTIV 2.54896 + N1040AC5 SYSTDEPT 2. ACMILES .56879 + N1040AC5 ASMILES 70.53 LFRPMASM 49.371 + N1040AC5 FLAV*5 1.88894 LF1040S1 86. + N1040AC5 LF1040S2 74. MSYULYYZ 1. + N1040AC5 MSBOSYYZ 1. MSBOSYUL 1. + N1040AC5 P1040X32 130. P1040X42 85. + N1040AC5 P1040X43 115. + N1040AC6 ACOCOSTS 1.93457 OBJECTIV 1.93457 + N1040AC6 SYSTDEPT 2. ACMILES .56879 + N1040AC6 ASMILES 54.0351 LFRPMASM 37.82457 + N1040AC6 FLAV*6 1.94992 LF1040S1 66. + N1040AC6 LF1040S2 56. MSYULYYZ 1. + N1040AC6 MSBOSYYZ 1. MSBOSYUL 1. + N1040AC6 P1040X32 130. P1040X42 85. + N1040AC6 P1040X43 115. + N1041AC4 ACOCOSTS 1.20291 OBJECTIV 1.20291 + N1041AC4 SYSTDEPT 1. ACMILES .31461 + N1041AC4 ASMILES 30.20299 LFRPMASM 21.142093 + N1041AC4 FLAV*4 1.00442 LF1041S1 67. + N1041AC4 MSYULYYZ 1. P1041X32 130. + N1041AC5 ACOCOSTS 1.33552 OBJECTIV 1.33552 + N1041AC5 SYSTDEPT 1. ACMILES .31461 + N1041AC5 ASMILES 39.01219 LFRPMASM 27.308533 + N1041AC5 FLAV*5 1.00572 LF1041S1 86. + N1041AC5 MSYULYYZ 1. P1041X32 130. + N1041AC6 ACOCOSTS 1.02289 OBJECTIV 1.02289 + N1041AC6 SYSTDEPT 1. ACMILES .31461 + N1041AC6 ASMILES 29.88837 LFRPMASM 20.921859 + N1041AC6 FLAV*6 1.04456 LF1041S1 66. + N1041AC6 MSYULYYZ 1. P1041X32 130. + N1042AC4 ACOCOSTS 1.08748 OBJECTIV 1.08748 + N1042AC4 SYSTDEPT 1. ACMILES .25418 + N1042AC4 ASMILES 24.40089 LFRPMASM 17.080623 + N1042AC4 FLAV*4 .88524 LF1042S1 57. + N1042AC4 MSBOSYUL 1. P1042X32 115. + N1042AC5 ACOCOSTS 1.21344 OBJECTIV 1.21344 + N1042AC5 SYSTDEPT 1. ACMILES .25418 + N1042AC5 ASMILES 31.51784 LFRPMASM 22.062488 + N1042AC5 FLAV*5 .88321 LF1042S1 74. + N1042AC5 MSBOSYUL 1. P1042X32 115. + N1042AC6 ACOCOSTS .91168 OBJECTIV .91168 + N1042AC6 SYSTDEPT 1. ACMILES .25418 + N1042AC6 ASMILES 24.14673 LFRPMASM 16.902711 + N1042AC6 FLAV*6 .90537 LF1042S1 56. + N1042AC6 MSBOSYUL 1. P1042X32 115. + N1043AC1 ACOCOSTS 13.18536 OBJECTIV 13.18536 + N1043AC1 SYSTDEPT 1. ACMILES 2.48884 + N1043AC1 ASMILES 1010.47021 LFRPMASM 707.329147 + N1043AC1 FLAV*1 5.18716 LF1043S1 284. + N1043AC1 MSBOSSEA 1. + N1043AC2 ACOCOSTS 9.81585 OBJECTIV 9.81585 + N1043AC2 SYSTDEPT 1. ACMILES 2.48884 + N1043AC2 ASMILES 642.12134 LFRPMASM 449.484938 + N1043AC2 FLAV*2 5.19874 LF1043S1 180. + N1043AC2 MSBOSSEA 1. + N1043AC3 ACOCOSTS 7.18333 OBJECTIV 7.18333 + N1043AC3 SYSTDEPT 1. ACMILES 2.48884 + N1043AC3 ASMILES 457.94702 LFRPMASM 320.562914 + N1043AC3 FLAV*3 5.3728 LF1043S1 128. + N1043AC3 MSBOSSEA 1. + N1044AC1 ACOCOSTS 14.09924 OBJECTIV 14.09924 + N1044AC1 SYSTDEPT 1. ACMILES 2.69845 + N1044AC1 ASMILES 1095.56982 LFRPMASM 766.898874 + N1044AC1 FLAV*1 5.56927 LF1044S1 243. + N1044AC1 MSBOSSFO 1. P1044X32 73. + N1044AC2 ACOCOSTS 10.51384 OBJECTIV 10.51384 + N1044AC2 SYSTDEPT 1. ACMILES 2.69845 + N1044AC2 ASMILES 696.19995 LFRPMASM 487.339965 + N1044AC2 FLAV*2 5.58881 LF1044S1 154. + N1044AC2 MSBOSSFO 1. P1044X32 73. + N1044AC3 ACOCOSTS 7.70315 OBJECTIV 7.70315 + N1044AC3 SYSTDEPT 1. ACMILES 2.69845 + N1044AC3 ASMILES 496.51465 LFRPMASM 347.560255 + N1044AC3 FLAV*3 5.78991 LF1044S1 110. + N1044AC3 MSBOSSFO 1. P1044X32 73. + N1046AC3 ACOCOSTS 9.52503 OBJECTIV 9.52503 + N1046AC3 SYSTDEPT 2. ACMILES 3.02542 + N1046AC3 ASMILES 556.67676 LFRPMASM 389.673732 + N1046AC3 FLAV*3 6.86058 LF1046S1 128. + N1046AC3 LF1046S2 128. MSLAXOAK 1. + N1046AC3 MSBOSOAK 1. P1046X23 46. + N1047AC1 ACOCOSTS 31.37592 OBJECTIV 31.37592 + N1047AC1 SYSTDEPT 3. ACMILES 5.59035 + N1047AC1 ASMILES 2269.68188 LFRPMASM 1588.777316 + N1047AC1 FLAV*1 12.14121 LF1047S1 243. + N1047AC1 LF1047S2 243. LF1047S3 243. + N1047AC1 MSHNLLAX 1. MSHNLSFO 1. + N1047AC1 MSBOSHNL 1. MSLAXSFO 1. + N1047AC1 MSBOSSFO 1. P1047X23 118. + N1047AC1 P1047X34 168. P1047X54 73. + N1047AC2 ACOCOSTS 23.19986 OBJECTIV 23.19986 + N1047AC2 SYSTDEPT 3. ACMILES 5.59035 + N1047AC2 ASMILES 1442.30981 LFRPMASM 1009.616867 + N1047AC2 FLAV*2 12.10464 LF1047S1 154. + N1047AC2 LF1047S2 154. LF1047S3 154. + N1047AC2 MSHNLLAX 1. MSHNLSFO 1. + N1047AC2 MSBOSHNL 1. MSLAXSFO 1. + N1047AC2 MSBOSSFO 1. P1047X23 118. + N1047AC2 P1047X34 168. P1047X54 73. + N1047AC3 ACOCOSTS 16.89706 OBJECTIV 16.89706 + N1047AC3 SYSTDEPT 3. ACMILES 5.59035 + N1047AC3 ASMILES 1028.62451 LFRPMASM 720.037157 + N1047AC3 FLAV*3 12.3848 LF1047S1 110. + N1047AC3 LF1047S2 110. LF1047S3 110. + N1047AC3 MSHNLLAX 1. MSHNLSFO 1. + N1047AC3 MSBOSHNL 1. MSLAXSFO 1. + N1047AC3 MSBOSSFO 1. P1047X23 118. + N1047AC3 P1047X34 168. P1047X54 73. + N1050AC3 ACOCOSTS 4.50544 OBJECTIV 4.50544 + N1050AC3 SYSTDEPT 2. ACMILES 1.00139 + N1050AC3 ASMILES 184.25568 LFRPMASM 128.978976 + N1050AC3 FLAV*3 2.83276 LF1050S1 110. + N1050AC3 LF1050S2 128. MSLAXSEA 1. + N1050AC3 MSONTSEA 1. P1050X32 139. + N1050AC3 P1050X42 25. + N1050AC4 ACOCOSTS 3.11665 OBJECTIV 3.11665 + N1050AC4 SYSTDEPT 2. ACMILES 1.00139 + N1050AC4 ASMILES 96.13336 LFRPMASM 67.293352 + N1050AC4 FLAV*4 2.74274 LF1050S1 57. + N1050AC4 LF1050S2 67. MSLAXSEA 1. + N1050AC4 MSONTSEA 1. P1050X32 139. + N1050AC4 P1050X42 25. + N1050AC5 ACOCOSTS 3.42281 OBJECTIV 3.42281 + N1050AC5 SYSTDEPT 2. ACMILES 1.00139 + N1050AC5 ASMILES 124.1723 LFRPMASM 86.92061 + N1050AC5 FLAV*5 2.76582 LF1050S1 74. + N1050AC5 LF1050S2 86. MSLAXSEA 1. + N1050AC5 MSONTSEA 1. P1050X32 139. + N1050AC5 P1050X42 25. + N1051AC1 ACOCOSTS 3.80996 OBJECTIV 3.80996 + N1051AC1 SYSTDEPT 1. ACMILES .33852 + N1051AC1 ASMILES 137.44067 LFRPMASM 96.208469 + N1051AC1 FLAV*1 1.26713 LF1051S1 243. + N1051AC1 MSLAXSFO 1. P1051X23 168. + N1051AC2 ACOCOSTS 2.65528 OBJECTIV 2.65528 + N1051AC2 SYSTDEPT 1. ACMILES .33852 + N1051AC2 ASMILES 87.33911 LFRPMASM 61.137377 + N1051AC2 FLAV*2 1.19699 LF1051S1 154. + N1051AC2 MSLAXSFO 1. P1051X23 168. + N1051AC3 ACOCOSTS 1.85054 OBJECTIV 1.85054 + N1051AC3 SYSTDEPT 1. ACMILES .33852 + N1051AC3 ASMILES 62.28839 LFRPMASM 43.601873 + N1051AC3 FLAV*3 1.09366 LF1051S1 110. + N1051AC3 MSLAXSFO 1. P1051X23 168. + N1051AC4 ACOCOSTS 1.24858 OBJECTIV 1.24858 + N1051AC4 SYSTDEPT 1. ACMILES .33852 + N1051AC4 ASMILES 32.49829 LFRPMASM 22.748803 + N1051AC4 FLAV*4 1.05157 LF1051S1 57. + N1051AC4 MSLAXSFO 1. P1051X23 168. + N1051AC5 ACOCOSTS 1.38382 OBJECTIV 1.38382 + N1051AC5 SYSTDEPT 1. ACMILES .33852 + N1051AC5 ASMILES 41.97696 LFRPMASM 29.383872 + N1051AC5 FLAV*5 1.05419 LF1051S1 74. + N1051AC5 MSLAXSFO 1. P1051X23 168. + N1051AC6 ACOCOSTS 1.06688 OBJECTIV 1.06688 + N1051AC6 SYSTDEPT 1. ACMILES .33852 + N1051AC6 ASMILES 32.15976 LFRPMASM 22.511832 + N1051AC6 FLAV*6 1.09962 LF1051S1 56. + N1051AC6 MSLAXSFO 1. P1051X23 168. +RHS + RHS1 SYSTDEPT 200. FLAV*1 10.5 + RHS1 FLAV*2 13.65 FLAV*3 23.5 + RHS1 FLAV*4 21.75 FLAV*5 21.75 + RHS1 FLAV*6 24.3 DMBOSHNL 12. + RHS1 DMBOSLAX 14. DMBOSSEA 45. + RHS1 DMBOSSFO 122. DMBOSTPE 1. + RHS1 DMBOSTYO 3. DMBOSYUL 676. + RHS1 DMBOSYVR 26. DMBOSYWG 37. + RHS1 DMBOSYYZ 215. DMBUROAK 27. + RHS1 DMBURSEA 52. DMBURSFO 271. + RHS1 DMHNLLAX 297. DMHNLLON 5. + RHS1 DMHNLPAR 1. DMHNLSEA 112. + RHS1 DMHNLSFO 35. DMHNLYVR 67. + RHS1 DMLASSEA 370. DMLASYVR 37. + RHS1 DMLAXOAK 78. DMLAXSEA 813. + RHS1 DMLAXSFO 2952. DMLAXTPE 31. + RHS1 DMLAXTYO 41. DMLAXYVR 193. + RHS1 DMLONPAR 2. DMLONSEA 92. + RHS1 DMLONYVR 51. DMOAKONT 13. + RHS1 DMOAKSEA 110. DMONTSFO 173. + RHS1 DMONTSEA 42. DMPARSEA 36. + RHS1 DMPARYVR 24. DMRNOSEA 284. + RHS1 DMRNOYVR 67. DMSEASFO 1417. + RHS1 DMSEATPE 47. DMSEATYO 114. + RHS1 DMSEAYVR 547. DMSFOTPE 6. + RHS1 DMSFOTYO 17. DMSFOYVR 298. + RHS1 DMTPETYO 111. DMTPEYVR 17. + RHS1 DMTYOYVR 42. DMYULYVR 262. + RHS1 DMYULYWG 413. DMYULYYZ 2612. + RHS1 DMYVRYWG 375. DMYVRYYZ 318. + RHS1 DMYWGYYZ 278. DMBOSOAK 11. + RHS1 DMBOSBUR 7. DMBOSONT 4. + RHS1 DMBURYVR 26. DMBURTYO 2. + RHS1 DMBURTPE 1. DMBURHNL 11. + RHS1 DMHNLOAK 24. DMHNLONT 16. + RHS1 DMHNLYWG 3. DMHNLYYZ 24. + RHS1 DMHNLYUL 40. DMLASTYO 5. + RHS1 DMLASTPE 1. DMLAXLON 13. + RHS1 DMLAXPAR 8. DMBURLON 1. + RHS1 DMBURPAR 1. DMLONONT 1. + RHS1 DMLONOAK 1. DMOAKPAR 2. + RHS1 DMOAKTYO 7. DMOAKTPE 2. + RHS1 DMONTPAR 2. DMONTTYO 2. + RHS1 DMONTTPE 1. DMPARSFO 2. + RHS1 DMRNOTYO 5. DMRNOTPE 2. + RHS1 DMTPEYWG 21. DMTPEYYZ 13. + RHS1 DMTPEYUL 6. DMTYOYUL 7. + RHS1 DMTYOYYZ 17. DMTYOYWG 25. + RHS1 MSBOSHNL 1. MSBOSSEA 1. + RHS1 MSBOSSFO 2. MSBOSYUL 7. + RHS1 MSBOSYVR 1. MSBOSYWG 1. + RHS1 MSBOSYYZ 3. MSBUROAK 1. + RHS1 MSBURSEA 1. MSBURSFO 4. + RHS1 MSHNLLAX 3. MSHNLSEA 2. + RHS1 MSHNLSFO 1. MSHNLYVR 2. + RHS1 MSLASSEA 4. MSLASYVR 1. + RHS1 MSLAXOAK 2. MSLAXSEA 7. + RHS1 MSLAXSFO 21. MSLAXTPE 2. + RHS1 MSLAXYVR 3. MSLONPAR 1. + RHS1 MSLONSEA 1. MSLONYVR 1. + RHS1 MSOAKONT 1. MSOAKSEA 3. + RHS1 MSONTSFO 3. MSONTSEA 2. + RHS1 MSPARSEA 1. MSRNOSEA 4. + RHS1 MSRNOYVR 1. MSSEASFO 10. + RHS1 MSSEATPE 1. MSSEATYO 1. + RHS1 MSSEAYVR 6. MSSFOYVR 5. + RHS1 MSTPETYO 1. MSYULYVR 7. + RHS1 MSYULYWG 5. MSYULYYZ 24. + RHS1 MSYVRYWG 5. MSYVRYYZ 5. + RHS1 MSYWGYYZ 4. MSBOSOAK 1. + RHS1 MSHNLOAK 1. MSLAXLON 1. + RHS1 NOPTLON0 4. NOPTLON1 2. + RHS1 NOPTTYO0 4. NOPTTYO1 2. +RANGES + RANGE1 DMBOSHNL 2. DMBOSLAX 2. + RANGE1 DMBOSSEA 5. DMBOSSFO 13. + RANGE1 DMBOSTPE 1. DMBOSTYO 3. + RANGE1 DMBOSYUL 68. DMBOSYVR 3. + RANGE1 DMBOSYWG 4. DMBOSYYZ 22. + RANGE1 DMBUROAK 3. DMBURSEA 6. + RANGE1 DMBURSFO 28. DMHNLLAX 30. + RANGE1 DMHNLLON 5. DMHNLPAR 1. + RANGE1 DMHNLSEA 12. DMHNLSFO 4. + RANGE1 DMHNLYVR 7. DMLASSEA 38. + RANGE1 DMLASYVR 4. DMLAXOAK 8. + RANGE1 DMLAXSEA 82. DMLAXSFO 296. + RANGE1 DMLAXTPE 4. DMLAXTYO 5. + RANGE1 DMLAXYVR 20. DMLONPAR 2. + RANGE1 DMLONSEA 10. DMLONYVR 6. + RANGE1 DMOAKONT 2. DMOAKSEA 12. + RANGE1 DMONTSFO 18. DMONTSEA 5. + RANGE1 DMPARSEA 4. DMPARYVR 3. + RANGE1 DMRNOSEA 29. DMRNOYVR 7. + RANGE1 DMSEASFO 142. DMSEATPE 5. + RANGE1 DMSEATYO 12. DMSEAYVR 55. + RANGE1 DMSFOTPE 6. DMSFOTYO 2. + RANGE1 DMSFOYVR 30. DMTPETYO 12. + RANGE1 DMTPEYVR 2. DMTYOYVR 5. + RANGE1 DMYULYVR 27. DMYULYWG 42. + RANGE1 DMYULYYZ 262. DMYVRYWG 38. + RANGE1 DMYVRYYZ 32. DMYWGYYZ 28. + RANGE1 DMBOSOAK 2. DMBOSBUR 7. + RANGE1 DMBOSONT 4. DMBURYVR 3. + RANGE1 DMBURTYO 2. DMBURTPE 1. + RANGE1 DMBURHNL 2. DMHNLOAK 3. + RANGE1 DMHNLONT 2. DMHNLYWG 3. + RANGE1 DMHNLYYZ 3. DMHNLYUL 5. + RANGE1 DMLASTYO 5. DMLASTPE 1. + RANGE1 DMLAXLON 2. DMLAXPAR 8. + RANGE1 DMBURLON 1. DMBURPAR 1. + RANGE1 DMLONONT 1. DMLONOAK 1. + RANGE1 DMOAKPAR 2. DMOAKTYO 7. + RANGE1 DMOAKTPE 2. DMONTPAR 2. + RANGE1 DMONTTYO 2. DMONTTPE 1. + RANGE1 DMPARSFO 2. DMRNOTYO 5. + RANGE1 DMRNOTPE 2. DMTPEYWG 3. + RANGE1 DMTPEYYZ 2. DMTPEYUL 6. + RANGE1 DMTYOYUL 7. DMTYOYYZ 2. + RANGE1 DMTYOYWG 3. +BOUNDS + LO INTBOU GRDTIMN1 -105. + UP INTBOU GRDTIMN1 0. + LO INTBOU GRDTIMN2 -91. + UP INTBOU GRDTIMN2 0. + LO INTBOU GRDTIMN3 -47. + UP INTBOU GRDTIMN3 0. + LO INTBOU GRDTIMN4 -43.5 + UP INTBOU GRDTIMN4 0. + LO INTBOU GRDTIMN5 -87. + UP INTBOU GRDTIMN5 0. + LO INTBOU GRDTIMN6 -81. + UP INTBOU GRDTIMN6 0. + UP INTBOU N1001AC1 3. + UP INTBOU N1001AC2 3. + UP INTBOU N1001AC3 3. + UP INTBOU N1002AC1 3. + UP INTBOU N1002AC2 3. + UP INTBOU N1002AC3 3. + UP INTBOU N1003AC1 4. + UP INTBOU N1003AC2 4. + UP INTBOU N1003AC3 4. + UP INTBOU N1004AC1 4. + UP INTBOU N1004AC2 4. + UP INTBOU N1004AC3 4. + UP INTBOU N1005AC3 2. + UP INTBOU N1105AC3 1. + UP INTBOU N1006AC3 2. + UP INTBOU N1007AC1 2. + UP INTBOU N1007AC2 2. + UP INTBOU N1007AC3 2. + UP INTBOU N1008AC1 7. + UP INTBOU N1008AC2 7. + UP INTBOU N1008AC3 7. + UP INTBOU N1008AC4 7. + UP INTBOU N1008AC5 7. + UP INTBOU N1008AC6 7. + UP INTBOU N1009AC1 7. + UP INTBOU N1009AC2 7. + UP INTBOU N1009AC3 7. + UP INTBOU N1009AC4 7. + UP INTBOU N1009AC5 7. + UP INTBOU N1010AC1 7. + UP INTBOU N1010AC2 7. + UP INTBOU N1010AC3 7. + UP INTBOU N1010AC4 7. + UP INTBOU N1010AC5 7. + UP INTBOU N1010AC6 7. + UP INTBOU N1011AC1 7. + UP INTBOU N1011AC2 7. + UP INTBOU N1011AC3 7. + UP INTBOU N1011AC4 7. + UP INTBOU N1011AC5 7. + UP INTBOU N1011AC6 7. + UP INTBOU N1012AC1 7. + UP INTBOU N1012AC2 7. + UP INTBOU N1012AC3 7. + UP INTBOU N1012AC4 7. + UP INTBOU N1012AC5 7. + UP INTBOU N1013AC3 4. + UP INTBOU N1013AC4 4. + UP INTBOU N1013AC5 4. + UP INTBOU N1013AC6 4. + UP INTBOU N1014AC3 4. + UP INTBOU N1014AC4 4. + UP INTBOU N1014AC5 4. + UP INTBOU N1014AC6 4. + UP INTBOU N1015AC3 4. + UP INTBOU N1015AC4 4. + UP INTBOU N1015AC5 4. + UP INTBOU N1015AC6 4. + UP INTBOU N1016AC3 4. + UP INTBOU N1016AC4 4. + UP INTBOU N1016AC5 4. + UP INTBOU N1016AC6 4. + UP INTBOU N1017AC3 4. + UP INTBOU N1017AC4 4. + UP INTBOU N1017AC5 4. + UP INTBOU N1017AC6 4. + UP INTBOU N1018AC1 7. + UP INTBOU N1018AC2 7. + UP INTBOU N1018AC3 7. + UP INTBOU N1018AC4 7. + UP INTBOU N1018AC5 7. + UP INTBOU N1018AC6 7. + UP INTBOU N1019AC1 7. + UP INTBOU N1019AC2 7. + UP INTBOU N1019AC3 7. + UP INTBOU N1019AC4 7. + UP INTBOU N1019AC5 7. + UP INTBOU N1020AC1 7. + UP INTBOU N1020AC2 7. + UP INTBOU N1020AC3 7. + UP INTBOU N1020AC4 7. + UP INTBOU N1020AC5 7. + UP INTBOU N1020AC6 7. + UP INTBOU N1021AC1 7. + UP INTBOU N1021AC2 7. + UP INTBOU N1021AC3 7. + UP INTBOU N1021AC4 7. + UP INTBOU N1021AC5 7. + UP INTBOU N1022AC1 1. + UP INTBOU N1023AC1 1. + UP INTBOU N1026AC1 1. + UP INTBOU N1027AC1 1. + UP INTBOU N1028AC1 1. + UP INTBOU N1029AC1 1. + UP INTBOU N1030AC1 1. + UP INTBOU N1032AC1 1. + UP INTBOU N1032AC2 1. + UP INTBOU N1032AC3 1. + UP INTBOU N1032AC4 1. + UP INTBOU N1032AC5 1. + UP INTBOU N1033AC1 5. + UP INTBOU N1033AC2 5. + UP INTBOU N1033AC3 5. + UP INTBOU N1033AC4 5. + UP INTBOU N1033AC5 5. + UP INTBOU N1034AC1 5. + UP INTBOU N1034AC2 5. + UP INTBOU N1034AC3 5. + UP INTBOU N1035AC1 5. + UP INTBOU N1035AC2 5. + UP INTBOU N1035AC3 5. + UP INTBOU N1035AC4 5. + UP INTBOU N1035AC5 5. + UP INTBOU N1036AC1 5. + UP INTBOU N1036AC2 5. + UP INTBOU N1036AC3 5. + UP INTBOU N1037AC4 5. + UP INTBOU N1037AC5 5. + UP INTBOU N1038AC4 10. + UP INTBOU N1038AC5 10. + UP INTBOU N1039AC4 7. + UP INTBOU N1039AC5 7. + UP INTBOU N1040AC4 10. + UP INTBOU N1040AC5 10. + UP INTBOU N1040AC6 10. + UP INTBOU N1041AC4 20. + UP INTBOU N1041AC5 20. + UP INTBOU N1041AC6 20. + UP INTBOU N1042AC4 20. + UP INTBOU N1042AC5 20. + UP INTBOU N1042AC6 20. + UP INTBOU N1043AC1 3. + UP INTBOU N1043AC2 3. + UP INTBOU N1043AC3 3. + UP INTBOU N1044AC1 3. + UP INTBOU N1044AC2 3. + UP INTBOU N1044AC3 3. + UP INTBOU N1046AC3 2. + UP INTBOU N1047AC1 1. + UP INTBOU N1047AC2 1. + UP INTBOU N1047AC3 1. + UP INTBOU N1050AC3 5. + UP INTBOU N1050AC4 5. + UP INTBOU N1050AC5 5. + UP INTBOU N1051AC1 20. + UP INTBOU N1051AC2 20. + UP INTBOU N1051AC3 20. + UP INTBOU N1051AC4 20. + UP INTBOU N1051AC5 20. + UP INTBOU N1051AC6 20. +ENDATA diff --git a/demos/ppl_lpsol/examples/boeing2.mps b/demos/ppl_lpsol/examples/boeing2.mps new file mode 100644 index 0000000..254aed7 --- /dev/null +++ b/demos/ppl_lpsol/examples/boeing2.mps @@ -0,0 +1,970 @@ +NAME BOEING2 +ROWS + G REVENUES + G ACOCOSTS + N OBJECTIV + L FUELAVAL + G SYSTDEPT + G ACMILES + G ASMILES + G PASSNGRS + G RPMILES + G LFRPMASM + G ATONMILE + G RTONMILE + G LFTNMILE + E FLAV*1 + E FLAV*2 + E FLAV*3 + E FLAV*4 + G LF1003S1 + G LF1003B1 + G LF1003C1 + G LF1005S1 + G LF1005B1 + G LF1005C1 + G LF1011S1 + G LF1011S2 + G LF1011B1 + G LF1011B2 + G LF1011C1 + G LF1011C2 + G LF1013S1 + G LF1013S2 + G LF1013B1 + G LF1013B2 + G LF1013C1 + G LF1013C2 + G LF1015S1 + G LF1015B1 + G LF1015C1 + G LF1017S1 + G LF1017B1 + G LF1017C1 + G LF1019S1 + G LF1019S2 + G LF1019B1 + G LF1019B2 + G LF1019C1 + G LF1019C2 + G LF1021S1 + G LF1021B1 + G LF1021C1 + G LF1002S1 + G LF1002B1 + G LF1002C1 + G LF1004S1 + G LF1004B1 + G LF1004C1 + G LF1006S1 + G LF1006S2 + G LF1006B1 + G LF1006B2 + G LF1006C1 + G LF1006C2 + G LF1008S1 + G LF1008S2 + G LF1008B1 + G LF1008B2 + G LF1008C1 + G LF1008C2 + G LF1010S1 + G LF1010S2 + G LF1010S3 + G LF1010B1 + G LF1010B2 + G LF1010B3 + G LF1010C1 + G LF1010C2 + G LF1010C3 + G LF1012S1 + G LF1012B1 + G LF1012C1 + G LF1014S1 + G LF1014S2 + G LF1014B1 + G LF1014B2 + G LF1014C1 + G LF1014C2 + G LF1100S1 + G LF1100S2 + G LF1100S3 + G LF1100S4 + G LF1100S5 + G LF1100B1 + G LF1100B2 + G LF1100B3 + G LF1100B4 + G LF1100B5 + G LF1100C1 + G LF1100C2 + G LF1100C3 + G LF1100C4 + G LF1100C5 + G LF1102S1 + G LF1102S2 + G LF1102S3 + G LF1102S4 + G LF1102B1 + G LF1102B2 + G LF1102B3 + G LF1102B4 + G LF1102C1 + G LF1102C2 + G LF1102C3 + G LF1102C4 + G LF1200S1 + G LF1200B1 + G LF1200C1 + G LF1201S1 + G LF1201B1 + G LF1201C1 + G NOPTCLE0 + G CONTBOS1 + G CONTBOS2 + G CONTBOS3 + G CONTBOS4 + G CONTORD1 + G CONTORD2 + G CONTORD3 + G CONTORD4 + G CONTLGA2 + G CONTLGA4 + G CONTCLE1 + G CONTCLE2 + G CONTCLE3 + G CONTCLE4 + L DMBOSORD + L DMBOSLGA + L DMBOSCLE + L DMORDBOS + L DMORDLGA + L DMORDCLE + L DMLGABOS + L DMLGAORD + L DMLGACLE + L DMCLEBOS + L DMCLEORD + L DMCLELGA + G MSBOSORD + G MSBOSLGA + G MSBOSCLE + G MSORDBOS + G MSORDLGA + G MSORDCLE + G MSLGABOS + G MSLGAORD + G MSLGACLE + G MSCLEBOS + G MSCLEORD + G MSCLELGA + L DCBOSORD + L DCBOSCLE + L DCORDBOS + L DCORDLGA + L DCLGAORD + L DCLGACLE + L DCCLELGA + G MCORDBOS + G MCLGAORD +COLUMNS + PBOSORD0 REVENUES .075 OBJECTIV -.075 + PBOSORD0 PASSNGRS 1. RPMILES .86441 + PBOSORD0 LFRPMASM -.86441 DMBOSORD 1. + PBOSORD0 LF1003S1 -1. + PBOSORD1 REVENUES .075 OBJECTIV -.075 + PBOSORD1 PASSNGRS 1. RPMILES .87605 + PBOSORD1 LFRPMASM -.87605 DMBOSORD 1. + PBOSORD1 LF1011S1 -1. LF1011S2 -1. + PBOSORD2 REVENUES .075 OBJECTIV -.075 + PBOSORD2 PASSNGRS 1. RPMILES .91637 + PBOSORD2 LFRPMASM -.91637 DMBOSORD 1. + PBOSORD2 LF1013S1 -1. LF1013S2 -1. + PBOSORD3 REVENUES .075 OBJECTIV -.075 + PBOSORD3 PASSNGRS 1. RPMILES .91722 + PBOSORD3 LFRPMASM -.91722 DMBOSORD 1. + PBOSORD3 LF1100S1 -1. LF1100S2 -1. + PBOSORD3 LF1100S3 -1. + PBOSORD4 REVENUES .075 OBJECTIV -.075 + PBOSORD4 PASSNGRS 1. RPMILES .87605 + PBOSORD4 LFRPMASM -.87605 DMBOSORD 1. + PBOSORD4 LF1102S1 -1. LF1102S2 -1. + PBOSLGA0 REVENUES .027 OBJECTIV -.027 + PBOSLGA0 PASSNGRS 1. RPMILES .18557 + PBOSLGA0 LFRPMASM -.18557 DMBOSLGA 1. + PBOSLGA0 LF1013S1 -1. + PBOSLGA1 REVENUES .027 OBJECTIV -.027 + PBOSLGA1 PASSNGRS 1. RPMILES .18557 + PBOSLGA1 LFRPMASM -.18557 DMBOSLGA 1. + PBOSLGA1 LF1100S1 -1. + PBOSLGA2 REVENUES .027 OBJECTIV -.027 + PBOSLGA2 PASSNGRS 1. RPMILES 1.60685 + PBOSLGA2 LFRPMASM -1.60685 DMBOSLGA 1. + PBOSLGA2 LF1102S1 -1. LF1102S2 -1. + PBOSLGA2 LF1102S3 -1. + PBOSLGA3 REVENUES .027 OBJECTIV -.027 + PBOSLGA3 PASSNGRS 1. RPMILES .18557 + PBOSLGA3 LFRPMASM -.18557 DMBOSLGA 1. + PBOSLGA3 LF1200S1 -1. + PBOSCLE0 REVENUES .053 OBJECTIV -.053 + PBOSCLE0 PASSNGRS 1. RPMILES .56156 + PBOSCLE0 LFRPMASM -.56156 DMBOSCLE 1. + PBOSCLE0 LF1005S1 -1. + PBOSCLE1 REVENUES .053 OBJECTIV -.053 + PBOSCLE1 PASSNGRS 1. RPMILES .56156 + PBOSCLE1 LFRPMASM -.56156 DMBOSCLE 1. + PBOSCLE1 LF1011S1 -1. + PBOSCLE2 REVENUES .053 OBJECTIV -.053 + PBOSCLE2 PASSNGRS 1. RPMILES .60273 + PBOSCLE2 LFRPMASM -.60273 DMBOSCLE 1. + PBOSCLE2 LF1100S1 -1. LF1100S2 -1. + PBOSCLE3 REVENUES .053 OBJECTIV -.053 + PBOSCLE3 PASSNGRS 1. RPMILES .56156 + PBOSCLE3 LFRPMASM -.56156 DMBOSCLE 1. + PBOSCLE3 LF1102S1 -1. + PORDBOS0 REVENUES .075 OBJECTIV -.075 + PORDBOS0 PASSNGRS 1. RPMILES .87605 + PORDBOS0 LFRPMASM -.87605 DMORDBOS 1. + PORDBOS0 LF1006S1 -1. LF1006S2 -1. + PORDBOS1 REVENUES .075 OBJECTIV -.075 + PORDBOS1 PASSNGRS 1. RPMILES .91637 + PORDBOS1 LFRPMASM -.91637 DMORDBOS 1. + PORDBOS1 LF1008S1 -1. LF1008S2 -1. + PORDBOS2 REVENUES .075 OBJECTIV -.075 + PORDBOS2 PASSNGRS 1. RPMILES .91722 + PORDBOS2 LFRPMASM -.91722 DMORDBOS 1. + PORDBOS2 LF1010S1 -1. LF1010S2 -1. + PORDBOS2 LF1010S3 -1. + PORDBOS3 REVENUES .075 OBJECTIV -.075 + PORDBOS3 PASSNGRS 1. RPMILES .87605 + PORDBOS3 LFRPMASM -.87605 DMORDBOS 1. + PORDBOS3 LF1100S4 -1. LF1100S5 -1. + PORDBOS4 REVENUES .075 OBJECTIV -.075 + PORDBOS4 PASSNGRS 1. RPMILES .91637 + PORDBOS4 LFRPMASM -.91637 DMORDBOS 1. + PORDBOS4 LF1102S3 -1. LF1102S4 -1. + PORDLGA0 REVENUES .068 OBJECTIV -.068 + PORDLGA0 PASSNGRS 1. RPMILES .7308 + PORDLGA0 LFRPMASM -.7308 DMORDLGA 1. + PORDLGA0 LF1004S1 -1. + PORDLGA1 REVENUES .068 OBJECTIV -.068 + PORDLGA1 PASSNGRS 1. RPMILES .7308 + PORDLGA1 LFRPMASM -.7308 DMORDLGA 1. + PORDLGA1 LF1008S1 -1. + PORDLGA2 REVENUES .068 OBJECTIV -.068 + PORDLGA2 PASSNGRS 1. RPMILES .73165 + PORDLGA2 LFRPMASM -.73165 DMORDLGA 1. + PORDLGA2 LF1010S1 -1. LF1010S2 -1. + PORDLGA3 REVENUES .068 OBJECTIV -.068 + PORDLGA3 PASSNGRS 1. RPMILES .7308 + PORDLGA3 LFRPMASM -.7308 DMORDLGA 1. + PORDLGA3 LF1102S3 -1. + PORDCLE0 REVENUES .035 OBJECTIV -.035 + PORDCLE0 PASSNGRS 1. RPMILES .3145 + PORDCLE0 LFRPMASM -.3145 DMORDCLE 1. + PORDCLE0 LF1002S1 -1. + PORDCLE1 REVENUES .035 OBJECTIV -.035 + PORDCLE1 PASSNGRS 1. RPMILES .3145 + PORDCLE1 LFRPMASM -.3145 DMORDCLE 1. + PORDCLE1 LF1006S1 -1. + PORDCLE2 REVENUES .035 OBJECTIV -.035 + PORDCLE2 PASSNGRS 1. RPMILES .3145 + PORDCLE2 LFRPMASM -.3145 DMORDCLE 1. + PORDCLE2 LF1010S1 -1. + PORDCLE3 REVENUES .035 OBJECTIV -.035 + PORDCLE3 PASSNGRS 1. RPMILES .3145 + PORDCLE3 LFRPMASM -.3145 DMORDCLE 1. + PORDCLE3 LF1100S4 -1. + PLGABOS0 REVENUES .027 OBJECTIV -.027 + PLGABOS0 PASSNGRS 1. RPMILES .18557 + PLGABOS0 LFRPMASM -.18557 DMLGABOS 1. + PLGABOS0 LF1008S2 -1. + PLGABOS1 REVENUES .027 OBJECTIV -.027 + PLGABOS1 PASSNGRS 1. RPMILES .18557 + PLGABOS1 LFRPMASM -.18557 DMLGABOS 1. + PLGABOS1 LF1010S3 -1. + PLGABOS2 REVENUES .027 OBJECTIV -.027 + PLGABOS2 PASSNGRS 1. RPMILES .18557 + PLGABOS2 LFRPMASM -.18557 DMLGABOS 1. + PLGABOS2 LF1014S2 -1. + PLGABOS3 REVENUES .027 OBJECTIV -.027 + PLGABOS3 PASSNGRS 1. RPMILES 1.6077 + PLGABOS3 LFRPMASM -1.6077 DMLGABOS 1. + PLGABOS3 LF1100S2 -1. LF1100S3 -1. + PLGABOS3 LF1100S4 -1. LF1100S5 -1. + PLGABOS4 REVENUES .027 OBJECTIV -.027 + PLGABOS4 PASSNGRS 1. RPMILES .18557 + PLGABOS4 LFRPMASM -.18557 DMLGABOS 1. + PLGABOS4 LF1102S4 -1. + PLGABOS5 REVENUES .027 OBJECTIV -.027 + PLGABOS5 PASSNGRS 1. RPMILES .18557 + PLGABOS5 LFRPMASM -.18557 DMLGABOS 1. + PLGABOS5 LF1201S1 -1. + PLGAORD0 REVENUES .068 OBJECTIV -.068 + PLGAORD0 PASSNGRS 1. RPMILES .7308 + PLGAORD0 LFRPMASM -.7308 DMLGAORD 1. + PLGAORD0 LF1013S2 -1. + PLGAORD1 REVENUES .068 OBJECTIV -.068 + PLGAORD1 PASSNGRS 1. RPMILES .7308 + PLGAORD1 LFRPMASM -.7308 DMLGAORD 1. + PLGAORD1 LF1017S1 -1. + PLGAORD2 REVENUES .068 OBJECTIV -.068 + PLGAORD2 PASSNGRS 1. RPMILES .73165 + PLGAORD2 LFRPMASM -.73165 DMLGAORD 1. + PLGAORD2 LF1019S1 -1. LF1019S2 -1. + PLGAORD3 REVENUES .068 OBJECTIV -.068 + PLGAORD3 PASSNGRS 1. RPMILES .73165 + PLGAORD3 LFRPMASM -.73165 DMLGAORD 1. + PLGAORD3 LF1100S2 -1. LF1100S3 -1. + PLGACLE0 REVENUES .037 OBJECTIV -.037 + PLGACLE0 PASSNGRS 1. RPMILES .41715 + PLGACLE0 LFRPMASM -.41715 DMLGACLE 1. + PLGACLE0 LF1015S1 -1. + PLGACLE1 REVENUES .037 OBJECTIV -.037 + PLGACLE1 PASSNGRS 1. RPMILES .41715 + PLGACLE1 LFRPMASM -.41715 DMLGACLE 1. + PLGACLE1 LF1019S1 -1. + PLGACLE2 REVENUES .037 OBJECTIV -.037 + PLGACLE2 PASSNGRS 1. RPMILES .41715 + PLGACLE2 LFRPMASM -.41715 DMLGACLE 1. + PLGACLE2 LF1100S2 -1. + PCLEBOS0 REVENUES .053 OBJECTIV -.053 + PCLEBOS0 PASSNGRS 1. RPMILES .56156 + PCLEBOS0 LFRPMASM -.56156 DMCLEBOS 1. + PCLEBOS0 LF1006S2 -1. + PCLEBOS1 REVENUES .053 OBJECTIV -.053 + PCLEBOS1 PASSNGRS 1. RPMILES .60273 + PCLEBOS1 LFRPMASM -.60273 DMCLEBOS 1. + PCLEBOS1 LF1010S2 -1. LF1010S3 -1. + PCLEBOS2 REVENUES .053 OBJECTIV -.053 + PCLEBOS2 PASSNGRS 1. RPMILES .60273 + PCLEBOS2 LFRPMASM -.60273 DMCLEBOS 1. + PCLEBOS2 LF1014S1 -1. LF1014S2 -1. + PCLEBOS3 REVENUES .053 OBJECTIV -.053 + PCLEBOS3 PASSNGRS 1. RPMILES .56156 + PCLEBOS3 LFRPMASM -.56156 DMCLEBOS 1. + PCLEBOS3 LF1100S5 -1. + PCLEBOS4 REVENUES .053 OBJECTIV -.053 + PCLEBOS4 PASSNGRS 1. RPMILES 1.23087 + PCLEBOS4 LFRPMASM -1.23087 DMCLEBOS 1. + PCLEBOS4 LF1102S2 -1. LF1102S3 -1. + PCLEBOS4 LF1102S4 -1. + PCLEORD0 REVENUES .035 OBJECTIV -.035 + PCLEORD0 PASSNGRS 1. RPMILES .3145 + PCLEORD0 LFRPMASM -.3145 DMCLEORD 1. + PCLEORD0 LF1011S2 -1. + PCLEORD1 REVENUES .035 OBJECTIV -.035 + PCLEORD1 PASSNGRS 1. RPMILES .3145 + PCLEORD1 LFRPMASM -.3145 DMCLEORD 1. + PCLEORD1 LF1019S2 -1. + PCLEORD2 REVENUES .035 OBJECTIV -.035 + PCLEORD2 PASSNGRS 1. RPMILES .3145 + PCLEORD2 LFRPMASM -.3145 DMCLEORD 1. + PCLEORD2 LF1021S1 -1. + PCLEORD3 REVENUES .035 OBJECTIV -.035 + PCLEORD3 PASSNGRS 1. RPMILES .3145 + PCLEORD3 LFRPMASM -.3145 DMCLEORD 1. + PCLEORD3 LF1100S3 -1. + PCLEORD4 REVENUES .035 OBJECTIV -.035 + PCLEORD4 PASSNGRS 1. RPMILES .3145 + PCLEORD4 LFRPMASM -.3145 DMCLEORD 1. + PCLEORD4 LF1102S2 -1. + PCLELGA0 REVENUES .037 OBJECTIV -.037 + PCLELGA0 PASSNGRS 1. RPMILES .41715 + PCLELGA0 LFRPMASM -.41715 DMCLELGA 1. + PCLELGA0 LF1010S2 -1. + PCLELGA1 REVENUES .037 OBJECTIV -.037 + PCLELGA1 PASSNGRS 1. RPMILES .41715 + PCLELGA1 LFRPMASM -.41715 DMCLELGA 1. + PCLELGA1 LF1012S1 -1. + PCLELGA2 REVENUES .037 OBJECTIV -.037 + PCLELGA2 PASSNGRS 1. RPMILES .41715 + PCLELGA2 LFRPMASM -.41715 DMCLELGA 1. + PCLELGA2 LF1014S1 -1. + PCLELGA3 REVENUES .037 OBJECTIV -.037 + PCLELGA3 PASSNGRS 1. RPMILES 1.0453 + PCLELGA3 LFRPMASM -1.0453 DMCLELGA 1. + PCLELGA3 LF1102S2 -1. LF1102S3 -1. + BBOSORD0 REVENUES .75 OBJECTIV -.75 + BBOSORD0 RTONMILE .86441 LFTNMILE -.86441 + BBOSORD0 DCBOSORD 1. LF1003B1 -1. + BBOSORD1 REVENUES .75 OBJECTIV -.75 + BBOSORD1 RTONMILE .87605 LFTNMILE -.87605 + BBOSORD1 DCBOSORD 1. LF1011B1 -1. + BBOSORD1 LF1011B2 -1. + BBOSCLE0 REVENUES .53 OBJECTIV -.53 + BBOSCLE0 RTONMILE .56156 LFTNMILE -.56156 + BBOSCLE0 DCBOSCLE 1. LF1005B1 -1. + BBOSCLE1 REVENUES .53 OBJECTIV -.53 + BBOSCLE1 RTONMILE .56156 LFTNMILE -.56156 + BBOSCLE1 DCBOSCLE 1. LF1011B1 -1. + BORDBOS0 REVENUES .75 OBJECTIV -.75 + BORDBOS0 RTONMILE .87605 LFTNMILE -.87605 + BORDBOS0 DCORDBOS 1. LF1006B1 -1. + BORDBOS0 LF1006B2 -1. + CBOSORD0 REVENUES .75 OBJECTIV -.75 + CBOSORD0 RTONMILE .86441 LFTNMILE -.86441 + CBOSORD0 DCBOSORD 1. LF1003C1 -1. + CBOSORD1 REVENUES .75 OBJECTIV -.75 + CBOSORD1 RTONMILE .87605 LFTNMILE -.87605 + CBOSORD1 DCBOSORD 1. LF1011C1 -1. + CBOSORD1 LF1011C2 -1. + CBOSORD2 REVENUES .75 OBJECTIV -.75 + CBOSORD2 RTONMILE .91637 LFTNMILE -.91637 + CBOSORD2 DCBOSORD 1. LF1013C1 -1. + CBOSORD2 LF1013C2 -1. + CBOSORD3 REVENUES .75 OBJECTIV -.75 + CBOSORD3 RTONMILE .91722 LFTNMILE -.91722 + CBOSORD3 DCBOSORD 1. LF1100C1 -1. + CBOSORD3 LF1100C2 -1. LF1100C3 -1. + CBOSORD4 REVENUES .75 OBJECTIV -.75 + CBOSORD4 RTONMILE .87605 LFTNMILE -.87605 + CBOSORD4 DCBOSORD 1. LF1102C1 -1. + CBOSORD4 LF1102C2 -1. + CBOSCLE0 REVENUES .53 OBJECTIV -.53 + CBOSCLE0 RTONMILE .56156 LFTNMILE -.56156 + CBOSCLE0 DCBOSCLE 1. LF1005C1 -1. + CBOSCLE1 REVENUES .53 OBJECTIV -.53 + CBOSCLE1 RTONMILE .56156 LFTNMILE -.56156 + CBOSCLE1 DCBOSCLE 1. LF1011C1 -1. + CBOSCLE2 REVENUES .53 OBJECTIV -.53 + CBOSCLE2 RTONMILE .60273 LFTNMILE -.60273 + CBOSCLE2 DCBOSCLE 1. LF1100C1 -1. + CBOSCLE2 LF1100C2 -1. + CBOSCLE3 REVENUES .53 OBJECTIV -.53 + CBOSCLE3 RTONMILE .56156 LFTNMILE -.56156 + CBOSCLE3 DCBOSCLE 1. LF1102C1 -1. + CORDBOS0 REVENUES .75 OBJECTIV -.75 + CORDBOS0 RTONMILE .87605 LFTNMILE -.87605 + CORDBOS0 DCORDBOS 1. LF1006C1 -1. + CORDBOS0 LF1006C2 -1. + CORDBOS1 REVENUES .75 OBJECTIV -.75 + CORDBOS1 RTONMILE .91637 LFTNMILE -.91637 + CORDBOS1 DCORDBOS 1. LF1008C1 -1. + CORDBOS1 LF1008C2 -1. + CORDBOS2 REVENUES .75 OBJECTIV -.75 + CORDBOS2 RTONMILE .91722 LFTNMILE -.91722 + CORDBOS2 DCORDBOS 1. LF1010C1 -1. + CORDBOS2 LF1010C2 -1. LF1010C3 -1. + CORDBOS3 REVENUES .75 OBJECTIV -.75 + CORDBOS3 RTONMILE .87605 LFTNMILE -.87605 + CORDBOS3 DCORDBOS 1. LF1100C4 -1. + CORDBOS3 LF1100C5 -1. + CORDBOS4 REVENUES .75 OBJECTIV -.75 + CORDBOS4 RTONMILE .91637 LFTNMILE -.91637 + CORDBOS4 DCORDBOS 1. LF1102C3 -1. + CORDBOS4 LF1102C4 -1. + CORDLGA0 REVENUES .68 OBJECTIV -.68 + CORDLGA0 RTONMILE .7308 LFTNMILE -.7308 + CORDLGA0 DCORDLGA 1. LF1004C1 -1. + CORDLGA1 REVENUES .68 OBJECTIV -.68 + CORDLGA1 RTONMILE .7308 LFTNMILE -.7308 + CORDLGA1 DCORDLGA 1. LF1008C1 -1. + CORDLGA2 REVENUES .68 OBJECTIV -.68 + CORDLGA2 RTONMILE .73165 LFTNMILE -.73165 + CORDLGA2 DCORDLGA 1. LF1010C1 -1. + CORDLGA2 LF1010C2 -1. + CORDLGA3 REVENUES .68 OBJECTIV -.68 + CORDLGA3 RTONMILE .7308 LFTNMILE -.7308 + CORDLGA3 DCORDLGA 1. LF1102C3 -1. + CLGAORD0 REVENUES .68 OBJECTIV -.68 + CLGAORD0 RTONMILE .7308 LFTNMILE -.7308 + CLGAORD0 DCLGAORD 1. LF1013C2 -1. + CLGAORD1 REVENUES .68 OBJECTIV -.68 + CLGAORD1 RTONMILE .7308 LFTNMILE -.7308 + CLGAORD1 DCLGAORD 1. LF1017C1 -1. + CLGAORD2 REVENUES .68 OBJECTIV -.68 + CLGAORD2 RTONMILE .73165 LFTNMILE -.73165 + CLGAORD2 DCLGAORD 1. LF1019C1 -1. + CLGAORD2 LF1019C2 -1. + CLGAORD3 REVENUES .68 OBJECTIV -.68 + CLGAORD3 RTONMILE .73165 LFTNMILE -.73165 + CLGAORD3 DCLGAORD 1. LF1100C2 -1. + CLGAORD3 LF1100C3 -1. + CLGACLE0 REVENUES .37 OBJECTIV -.37 + CLGACLE0 RTONMILE .41715 LFTNMILE -.41715 + CLGACLE0 DCLGACLE 1. LF1015C1 -1. + CLGACLE1 REVENUES .37 OBJECTIV -.37 + CLGACLE1 RTONMILE .41715 LFTNMILE -.41715 + CLGACLE1 DCLGACLE 1. LF1019C1 -1. + CLGACLE2 REVENUES .37 OBJECTIV -.37 + CLGACLE2 RTONMILE .41715 LFTNMILE -.41715 + CLGACLE2 DCLGACLE 1. LF1100C2 -1. + CCLELGA0 REVENUES .37 OBJECTIV -.37 + CCLELGA0 RTONMILE .41715 LFTNMILE -.41715 + CCLELGA0 DCCLELGA 1. LF1010C2 -1. + CCLELGA1 REVENUES .37 OBJECTIV -.37 + CCLELGA1 RTONMILE .41715 LFTNMILE -.41715 + CCLELGA1 DCCLELGA 1. LF1012C1 -1. + CCLELGA2 REVENUES .37 OBJECTIV -.37 + CCLELGA2 RTONMILE .41715 LFTNMILE -.41715 + CCLELGA2 DCCLELGA 1. LF1014C1 -1. + CCLELGA3 REVENUES .37 OBJECTIV -.37 + CCLELGA3 RTONMILE 1.0453 LFTNMILE -1.0453 + CCLELGA3 DCCLELGA 1. LF1102C2 -1. + CCLELGA3 LF1102C3 -1. + GRDTIMO1 FLAV*1 1. ACOCOSTS .65 + GRDTIMO1 OBJECTIV .65 + GRDTIMN1 FLAV*1 1. ACOCOSTS -.05 + GRDTIMN1 OBJECTIV -.05 + GRDTIMO2 FLAV*2 1. ACOCOSTS .275 + GRDTIMO2 OBJECTIV .275 + GRDTIMN2 FLAV*2 1. ACOCOSTS -.02889 + GRDTIMN2 OBJECTIV -.02889 + GRDTIMN3 FLAV*3 1. ACOCOSTS -.03611 + GRDTIMN3 OBJECTIV -.03611 + GRDTIMN4 FLAV*4 1. ACOCOSTS -.01333 + GRDTIMN4 OBJECTIV -.01333 + N1003AC1 ACOCOSTS .01 OBJECTIV .01 + N1003AC1 FUELAVAL 7.98429 SYSTDEPT 1. + N1003AC1 ACMILES .86441 ASMILES 351.81396 + N1003AC1 LFRPMASM 211.088376 FLAV*1 2.32729 + N1003AC1 ATONMILE 25.93224 LFTNMILE 12.96612 + N1003AC1 LF1003S1 305. LF1003B1 12. + N1003AC1 CONTBOS1 1. CONTORD1 -1. + N1003AC1 MSBOSORD 1. + N1003AC2 ACOCOSTS .02 OBJECTIV .02 + N1003AC2 FUELAVAL 2.51914 SYSTDEPT 1. + N1003AC2 ACMILES .86441 ASMILES 113.23743 + N1003AC2 LFRPMASM 67.942458 FLAV*2 2.10966 + N1003AC2 LF1003S1 98. CONTBOS2 1. + N1003AC2 CONTORD2 -1. MSBOSORD 1. + N1003AC3 ACOCOSTS .03 OBJECTIV .03 + N1003AC3 FUELAVAL 3.15178 SYSTDEPT 1. + N1003AC3 ACMILES .86441 FLAV*3 2.10966 + N1003AC3 ATONMILE 34.57631 LFTNMILE 17.288155 + N1003AC3 LF1003C1 30. CONTBOS3 1. + N1003AC3 CONTORD3 -1. + N1003AC4 ACOCOSTS .04 OBJECTIV .04 + N1003AC4 FUELAVAL 1.99337 SYSTDEPT 1. + N1003AC4 ACMILES .86441 FLAV*4 2.10966 + N1003AC4 ATONMILE 12.96612 LFTNMILE 6.48306 + N1003AC4 LF1003C1 11.25 CONTBOS4 1. + N1003AC4 CONTORD4 -1. + N1005AC1 ACOCOSTS 4.04337 OBJECTIV 4.04337 + N1005AC1 FUELAVAL 5.83404 SYSTDEPT 1. + N1005AC1 ACMILES .56156 ASMILES 228.55299 + N1005AC1 LFRPMASM 137.131794 FLAV*1 1000. + N1005AC1 ATONMILE 16.84665 LFTNMILE 8.423325 + N1005AC1 LF1005S1 305. LF1005B1 12. + N1005AC1 NOPTCLE0 1. CONTBOS1 1. + N1005AC1 CONTCLE1 -1. MSBOSCLE 1. + N1005AC2 ACOCOSTS 1.60964 OBJECTIV 1.60964 + N1005AC2 FUELAVAL 1.82258 SYSTDEPT 1. + N1005AC2 ACMILES .56156 ASMILES 73.56374 + N1005AC2 LFRPMASM 44.138244 FLAV*2 2000. + N1005AC2 LF1005S1 98. NOPTCLE0 1. + N1005AC2 CONTBOS2 1. CONTCLE2 -1. + N1005AC2 MSBOSCLE 1. + N1005AC3 ACOCOSTS 1.93119 OBJECTIV 1.93119 + N1005AC3 FUELAVAL 2.27351 SYSTDEPT 1. + N1005AC3 ACMILES .56156 FLAV*3 3000. + N1005AC3 ATONMILE 22.4622 LFTNMILE 11.2311 + N1005AC3 LF1005C1 30. NOPTCLE0 1. + N1005AC3 CONTBOS3 1. CONTCLE3 -1. + N1005AC4 ACOCOSTS 1.34618 OBJECTIV 1.34618 + N1005AC4 FUELAVAL 1.41795 SYSTDEPT 1. + N1005AC4 ACMILES .56156 FLAV*4 1500. + N1005AC4 ATONMILE 8.42333 LFTNMILE 4.211665 + N1005AC4 LF1005C1 11.25 NOPTCLE0 1. + N1005AC4 CONTBOS4 1. CONTCLE4 -1. + N1011AC1 ACOCOSTS 1.1 OBJECTIV 1.1 + N1011AC1 FUELAVAL 9.91398 SYSTDEPT 2. + N1011AC1 ACMILES .87605 ASMILES 356.55371 + N1011AC1 LFRPMASM 213.932226 FLAV*1 25. + N1011AC1 ATONMILE 26.2816 LFTNMILE 13.1408 + N1011AC1 LF1011S1 305. LF1011S2 305. + N1011AC1 LF1011B1 12. LF1011B2 12. + N1011AC1 NOPTCLE0 2. CONTBOS1 1. + N1011AC1 CONTORD1 -1. MSBOSCLE 1. + N1011AC1 MSBOSORD 1. MSCLEORD 1. + N1011AC2 ACOCOSTS 1.2 OBJECTIV 1.2 + N1011AC2 FUELAVAL 3.07692 SYSTDEPT 2. + N1011AC2 ACMILES .87605 ASMILES 114.76299 + N1011AC2 LFRPMASM 68.857794 FLAV*2 25. + N1011AC2 LF1011S1 98. LF1011S2 98. + N1011AC2 NOPTCLE0 2. CONTBOS2 1. + N1011AC2 CONTORD2 -1. MSBOSCLE 1. + N1011AC2 MSBOSORD 1. MSCLEORD 1. + N1011AC3 ACOCOSTS 1.3 OBJECTIV 1.3 + N1011AC3 FUELAVAL 3.83055 SYSTDEPT 2. + N1011AC3 ACMILES .87605 FLAV*3 26. + N1011AC3 ATONMILE 35.04214 LFTNMILE 17.52107 + N1011AC3 LF1011C1 30. LF1011C2 30. + N1011AC3 NOPTCLE0 2. CONTBOS3 1. + N1011AC3 CONTORD3 -1. + N1011AC4 ACOCOSTS 2.34647 OBJECTIV 2.34647 + N1011AC4 FUELAVAL 2.3665 SYSTDEPT 2. + N1011AC4 ACMILES .87605 FLAV*4 27. + N1011AC4 ATONMILE 13.1408 LFTNMILE 6.5704 + N1011AC4 LF1011C1 11.25 LF1011C2 11.25 + N1011AC4 NOPTCLE0 2. CONTBOS4 1. + N1011AC4 CONTORD4 -1. + N1013AC2 ACOCOSTS 2.36783 OBJECTIV 2.36783 + N1013AC2 FUELAVAL 3.16965 SYSTDEPT 2. + N1013AC2 ACMILES .91637 ASMILES 120.04449 + N1013AC2 LFRPMASM 72.026694 FLAV*2 2.65943 + N1013AC2 LF1013S1 98. LF1013S2 98. + N1013AC2 CONTBOS2 1. CONTORD2 -1. + N1013AC2 MSBOSLGA 1. MSBOSORD 1. + N1013AC2 MSLGAORD 1. + N1013AC4 ACOCOSTS 1.90292 OBJECTIV 1.90292 + N1013AC4 FUELAVAL 2.4431 SYSTDEPT 2. + N1013AC4 ACMILES .91637 FLAV*4 2.65943 + N1013AC4 ATONMILE 13.74556 LFTNMILE 6.87278 + N1013AC4 LF1013C1 11.25 LF1013C2 11.25 + N1013AC4 CONTBOS4 1. CONTORD4 -1. + N1013AC4 MCLGAORD 1. + N1015AC2 ACOCOSTS 1.36416 OBJECTIV 1.36416 + N1015AC2 FUELAVAL 1.49045 SYSTDEPT 1. + N1015AC2 ACMILES .41715 ASMILES 54.64705 + N1015AC2 LFRPMASM 32.78823 FLAV*2 1.25093 + N1015AC2 LF1015S1 98. NOPTCLE0 1. + N1015AC2 CONTLGA2 1. CONTCLE2 -1. + N1015AC2 MSLGACLE 1. + N1015AC4 ACOCOSTS 1.14401 OBJECTIV 1.14401 + N1015AC4 FUELAVAL 1.14359 SYSTDEPT 1. + N1015AC4 ACMILES .41715 FLAV*4 1.25093 + N1015AC4 ATONMILE 6.25729 LFTNMILE 3.128645 + N1015AC4 LF1015C1 11.25 NOPTCLE0 1. + N1015AC4 CONTLGA4 1. CONTCLE4 -1. + N1017AC2 ACOCOSTS 1.64736 OBJECTIV 1.64736 + N1017AC2 FUELAVAL 2.21183 SYSTDEPT 1. + N1017AC2 ACMILES .7308 ASMILES 95.73444 + N1017AC2 LFRPMASM 57.440664 FLAV*2 1.85313 + N1017AC2 LF1017S1 98. CONTLGA2 1. + N1017AC2 CONTORD2 -1. MSLGAORD 1. + N1017AC4 ACOCOSTS 1.33312 OBJECTIV 1.33312 + N1017AC4 FUELAVAL 1.73951 SYSTDEPT 1. + N1017AC4 ACMILES .7308 FLAV*4 1.85313 + N1017AC4 ATONMILE 10.96196 LFTNMILE 5.48098 + N1017AC4 LF1017C1 11.25 CONTLGA4 1. + N1017AC4 CONTORD4 -1. MCLGAORD 1. + N1019AC2 ACOCOSTS 2.55381 OBJECTIV 2.55381 + N1019AC2 FUELAVAL 2.7448 SYSTDEPT 2. + N1019AC2 ACMILES .73165 ASMILES 95.8463 + N1019AC2 LFRPMASM 57.50778 FLAV*2 2.30477 + N1019AC2 LF1019S1 98. LF1019S2 98. + N1019AC2 NOPTCLE0 2. CONTLGA2 1. + N1019AC2 CONTORD2 -1. MSLGACLE 1. + N1019AC2 MSLGAORD 1. MSCLEORD 1. + N1019AC4 ACOCOSTS 2.14431 OBJECTIV 2.14431 + N1019AC4 FUELAVAL 2.09214 SYSTDEPT 2. + N1019AC4 ACMILES .73165 FLAV*4 2.30477 + N1019AC4 ATONMILE 10.97477 LFTNMILE 5.487385 + N1019AC4 LF1019C1 11.25 LF1019C2 11.25 + N1019AC4 NOPTCLE0 2. CONTLGA4 1. + N1019AC4 CONTORD4 -1. MCLGAORD 1. + N1021AC1 ACOCOSTS 3.12679 OBJECTIV 3.12679 + N1021AC1 FUELAVAL 4.07994 SYSTDEPT 1. + N1021AC1 ACMILES .3145 ASMILES 128.00075 + N1021AC1 LFRPMASM 76.80045 FLAV*1 1.34295 + N1021AC1 ATONMILE 9.43495 LFTNMILE 4.717475 + N1021AC1 LF1021S1 305. LF1021B1 12. + N1021AC1 NOPTCLE0 1. CONTCLE1 1. + N1021AC1 CONTORD1 -1. MSCLEORD 1. + N1021AC2 ACOCOSTS 1.18965 OBJECTIV 1.18965 + N1021AC2 FUELAVAL 1.25435 SYSTDEPT 1. + N1021AC2 ACMILES .3145 ASMILES 41.19926 + N1021AC2 LFRPMASM 24.719556 FLAV*2 1.05384 + N1021AC2 LF1021S1 98. NOPTCLE0 1. + N1021AC2 CONTCLE2 1. CONTORD2 -1. + N1021AC2 MSCLEORD 1. + N1021AC3 ACOCOSTS 1.42472 OBJECTIV 1.42472 + N1021AC3 FUELAVAL 1.55704 SYSTDEPT 1. + N1021AC3 ACMILES .3145 FLAV*3 1.05384 + N1021AC3 ATONMILE 12.57993 LFTNMILE 6.289965 + N1021AC3 LF1021C1 30. NOPTCLE0 1. + N1021AC3 CONTCLE3 1. CONTORD3 -1. + N1021AC4 ACOCOSTS 1.0003 OBJECTIV 1.0003 + N1021AC4 FUELAVAL .94855 SYSTDEPT 1. + N1021AC4 ACMILES .3145 FLAV*4 1.05384 + N1021AC4 ATONMILE 4.71747 LFTNMILE 2.358735 + N1021AC4 LF1021C1 11.25 NOPTCLE0 1. + N1021AC4 CONTCLE4 1. CONTORD4 -1. + N1002AC1 ACOCOSTS 3.12679 OBJECTIV 3.12679 + N1002AC1 FUELAVAL 4.07994 SYSTDEPT 1. + N1002AC1 ACMILES .3145 ASMILES 128.00075 + N1002AC1 LFRPMASM 76.80045 FLAV*1 1.34295 + N1002AC1 ATONMILE 9.43495 LFTNMILE 4.717475 + N1002AC1 LF1002S1 305. LF1002B1 12. + N1002AC1 NOPTCLE0 1. CONTORD1 1. + N1002AC1 CONTCLE1 -1. MSORDCLE 1. + N1002AC2 ACOCOSTS 1.18965 OBJECTIV 1.18965 + N1002AC2 FUELAVAL 1.25435 SYSTDEPT 1. + N1002AC2 ACMILES .3145 ASMILES 41.19926 + N1002AC2 LFRPMASM 24.719556 FLAV*2 1.05384 + N1002AC2 LF1002S1 98. NOPTCLE0 1. + N1002AC2 CONTORD2 1. CONTCLE2 -1. + N1002AC2 MSORDCLE 1. + N1002AC3 ACOCOSTS 1.42472 OBJECTIV 1.42472 + N1002AC3 FUELAVAL 1.55704 SYSTDEPT 1. + N1002AC3 ACMILES .3145 FLAV*3 1.05384 + N1002AC3 ATONMILE 12.57993 LFTNMILE 6.289965 + N1002AC3 LF1002C1 30. NOPTCLE0 1. + N1002AC3 CONTORD3 1. CONTCLE3 -1. + N1002AC4 ACOCOSTS 1.0003 OBJECTIV 1.0003 + N1002AC4 FUELAVAL .94855 SYSTDEPT 1. + N1002AC4 ACMILES .3145 FLAV*4 1.05384 + N1002AC4 ATONMILE 4.71747 LFTNMILE 2.358735 + N1002AC4 LF1002C1 11.25 NOPTCLE0 1. + N1002AC4 CONTORD4 1. CONTCLE4 -1. + N1004AC2 ACOCOSTS 1.64736 OBJECTIV 1.64736 + N1004AC2 FUELAVAL 2.21183 SYSTDEPT 1. + N1004AC2 ACMILES .7308 ASMILES 95.73444 + N1004AC2 LFRPMASM 57.440664 FLAV*2 1.85313 + N1004AC2 LF1004S1 98. CONTORD2 1. + N1004AC2 CONTLGA2 -1. MSORDLGA 1. + N1004AC4 ACOCOSTS 1.33312 OBJECTIV 1.33312 + N1004AC4 FUELAVAL 1.73951 SYSTDEPT 1. + N1004AC4 ACMILES .7308 FLAV*4 1.85313 + N1004AC4 ATONMILE 10.96196 LFTNMILE 5.48098 + N1004AC4 LF1004C1 11.25 CONTORD4 1. + N1004AC4 CONTLGA4 -1. + N1006AC1 ACOCOSTS 7.17016 OBJECTIV 7.17016 + N1006AC1 FUELAVAL 9.91398 SYSTDEPT 2. + N1006AC1 ACMILES .87605 ASMILES 356.55371 + N1006AC1 LFRPMASM 213.932226 FLAV*1 3.12813 + N1006AC1 ATONMILE 26.2816 LFTNMILE 13.1408 + N1006AC1 LF1006S1 305. LF1006S2 305. + N1006AC1 LF1006B1 12. LF1006B2 12. + N1006AC1 NOPTCLE0 2. CONTORD1 1. + N1006AC1 CONTBOS1 -1. MSORDCLE 1. + N1006AC1 MSORDBOS 1. MSCLEBOS 1. + N1006AC2 ACOCOSTS 2.79929 OBJECTIV 2.79929 + N1006AC2 FUELAVAL 3.07692 SYSTDEPT 2. + N1006AC2 ACMILES .87605 ASMILES 114.76299 + N1006AC2 LFRPMASM 68.857794 FLAV*2 2.58202 + N1006AC2 LF1006S1 98. LF1006S2 98. + N1006AC2 NOPTCLE0 2. CONTORD2 1. + N1006AC2 CONTBOS2 -1. MSORDCLE 1. + N1006AC2 MSORDBOS 1. MSCLEBOS 1. + N1006AC3 ACOCOSTS 3.35591 OBJECTIV 3.35591 + N1006AC3 FUELAVAL 3.83055 SYSTDEPT 2. + N1006AC3 ACMILES .87605 FLAV*3 2.58202 + N1006AC3 ATONMILE 35.04214 LFTNMILE 17.52107 + N1006AC3 LF1006C1 30. LF1006C2 30. + N1006AC3 NOPTCLE0 2. CONTORD3 1. + N1006AC3 CONTBOS3 -1. MCORDBOS 1. + N1006AC4 ACOCOSTS 2.34647 OBJECTIV 2.34647 + N1006AC4 FUELAVAL 2.3665 SYSTDEPT 2. + N1006AC4 ACMILES .87605 FLAV*4 2.58202 + N1006AC4 ATONMILE 13.1408 LFTNMILE 6.5704 + N1006AC4 LF1006C1 11.25 LF1006C2 11.25 + N1006AC4 NOPTCLE0 2. CONTORD4 1. + N1006AC4 CONTBOS4 -1. MCORDBOS 1. + N1008AC2 ACOCOSTS 2.36783 OBJECTIV 2.36783 + N1008AC2 FUELAVAL 3.16965 SYSTDEPT 2. + N1008AC2 ACMILES .91637 ASMILES 120.04449 + N1008AC2 LFRPMASM 72.026694 FLAV*2 2.65943 + N1008AC2 LF1008S1 98. LF1008S2 98. + N1008AC2 CONTORD2 1. CONTBOS2 -1. + N1008AC2 MSORDLGA 1. MSORDBOS 1. + N1008AC2 MSLGABOS 1. + N1008AC4 ACOCOSTS 1.90292 OBJECTIV 1.90292 + N1008AC4 FUELAVAL 2.4431 SYSTDEPT 2. + N1008AC4 ACMILES .91637 FLAV*4 2.65943 + N1008AC4 ATONMILE 13.74556 LFTNMILE 6.87278 + N1008AC4 LF1008C1 11.25 LF1008C2 11.25 + N1008AC4 CONTORD4 1. CONTBOS4 -1. + N1008AC4 MCORDBOS 1. + N1010AC2 ACOCOSTS 3.27428 OBJECTIV 3.27428 + N1010AC2 FUELAVAL 3.70262 SYSTDEPT 3. + N1010AC2 ACMILES .91722 ASMILES 120.15637 + N1010AC2 LFRPMASM 72.093822 FLAV*2 3.11107 + N1010AC2 LF1010S1 98. LF1010S2 98. + N1010AC2 LF1010S3 98. NOPTCLE0 2. + N1010AC2 CONTORD2 1. CONTBOS2 -1. + N1010AC2 MSORDCLE 1. MSORDLGA 1. + N1010AC2 MSORDBOS 1. MSCLELGA 1. + N1010AC2 MSCLEBOS 1. MSLGABOS 1. + N1010AC4 ACOCOSTS 2.71411 OBJECTIV 2.71411 + N1010AC4 FUELAVAL 2.79573 SYSTDEPT 3. + N1010AC4 ACMILES .91722 FLAV*4 3.11107 + N1010AC4 ATONMILE 13.75836 LFTNMILE 6.87918 + N1010AC4 LF1010C1 11.25 LF1010C2 11.25 + N1010AC4 LF1010C3 11.25 NOPTCLE0 2. + N1010AC4 CONTORD4 1. CONTBOS4 -1. + N1010AC4 MCORDBOS 1. + N1012AC2 ACOCOSTS 1.36416 OBJECTIV 1.36416 + N1012AC2 FUELAVAL 1.49045 SYSTDEPT 1. + N1012AC2 ACMILES .41715 ASMILES 54.64705 + N1012AC2 LFRPMASM 32.78823 FLAV*2 1.25093 + N1012AC2 LF1012S1 98. NOPTCLE0 1. + N1012AC2 CONTCLE2 1. CONTLGA2 -1. + N1012AC2 MSCLELGA 1. + N1012AC4 ACOCOSTS 1.14401 OBJECTIV 1.14401 + N1012AC4 FUELAVAL 1.14359 SYSTDEPT 1. + N1012AC4 ACMILES .41715 FLAV*4 1.25093 + N1012AC4 ATONMILE 6.25729 LFTNMILE 3.128645 + N1012AC4 LF1012C1 11.25 NOPTCLE0 1. + N1012AC4 CONTCLE4 1. CONTLGA4 -1. + N1014AC2 ACOCOSTS 2.08463 OBJECTIV 2.08463 + N1014AC2 FUELAVAL 2.44827 SYSTDEPT 2. + N1014AC2 ACMILES .60273 ASMILES 78.95706 + N1014AC2 LFRPMASM 47.374236 FLAV*2 2.05723 + N1014AC2 LF1014S1 98. LF1014S2 98. + N1014AC2 NOPTCLE0 1. CONTCLE2 1. + N1014AC2 CONTBOS2 -1. MSCLELGA 1. + N1014AC2 MSCLEBOS 1. MSLGABOS 1. + N1014AC4 ACOCOSTS 1.71382 OBJECTIV 1.71382 + N1014AC4 FUELAVAL 1.84718 SYSTDEPT 2. + N1014AC4 ACMILES .60273 FLAV*4 2.05723 + N1014AC4 ATONMILE 9.04089 LFTNMILE 4.520445 + N1014AC4 LF1014C1 11.25 LF1014C2 11.25 + N1014AC4 NOPTCLE0 1. CONTCLE4 1. + N1014AC4 CONTBOS4 -1. + N1100AC2 ACOCOSTS 6.07357 OBJECTIV 6.07357 + N1100AC2 FUELAVAL 6.77953 SYSTDEPT 5. + N1100AC2 ACMILES 1.79328 ASMILES 234.91937 + N1100AC2 LFRPMASM 140.951622 FLAV*2 5.69309 + N1100AC2 LF1100S1 98. LF1100S2 98. + N1100AC2 LF1100S3 98. LF1100S4 98. + N1100AC2 LF1100S5 98. NOPTCLE0 4. + N1100AC2 MSBOSLGA 1. MSBOSCLE 1. + N1100AC2 MSBOSORD 1. MSLGACLE 1. + N1100AC2 MSLGAORD 1. MSLGABOS 1. + N1100AC2 MSCLEORD 1. MSORDCLE 1. + N1100AC2 MSORDBOS 1. MSCLEBOS 1. + N1100AC4 ACOCOSTS 5.06059 OBJECTIV 5.06059 + N1100AC4 FUELAVAL 5.16223 SYSTDEPT 5. + N1100AC4 ACMILES 1.79328 FLAV*4 5.69309 + N1100AC4 ATONMILE 26.89915 LFTNMILE 13.449575 + N1100AC4 LF1100C1 11.25 LF1100C2 11.25 + N1100AC4 LF1100C3 11.25 LF1100C4 11.25 + N1100AC4 LF1100C5 11.25 NOPTCLE0 4. + N1100AC4 MCLGAORD 1. MCORDBOS 1. + N1102AC2 ACOCOSTS 5.16712 OBJECTIV 5.16712 + N1102AC2 FUELAVAL 6.24657 SYSTDEPT 4. + N1102AC2 ACMILES 1.79242 ASMILES 234.80756 + N1102AC2 LFRPMASM 140.884536 FLAV*2 5.24145 + N1102AC2 LF1102S1 98. LF1102S2 98. + N1102AC2 LF1102S3 98. LF1102S4 98. + N1102AC2 NOPTCLE0 2. MSBOSCLE 1. + N1102AC2 MSBOSORD 1. MSBOSLGA 1. + N1102AC2 MSCLEORD 1. MSCLELGA 1. + N1102AC2 MSCLEBOS 1. MSORDLGA 1. + N1102AC2 MSORDBOS 1. MSLGABOS 1. + N1102AC4 ACOCOSTS 4.24939 OBJECTIV 4.24939 + N1102AC4 FUELAVAL 4.8096 SYSTDEPT 4. + N1102AC4 ACMILES 1.79242 FLAV*4 5.24145 + N1102AC4 ATONMILE 26.88635 LFTNMILE 13.443175 + N1102AC4 LF1102C1 11.25 LF1102C2 11.25 + N1102AC4 LF1102C3 11.25 LF1102C4 11.25 + N1102AC4 NOPTCLE0 2. MCORDBOS 1. + N1200AC2 ACOCOSTS .72047 OBJECTIV .72047 + N1200AC2 FUELAVAL .95782 SYSTDEPT 1. + N1200AC2 ACMILES .18557 ASMILES 24.31007 + N1200AC2 LFRPMASM 14.586042 FLAV*2 .8063 + N1200AC2 LF1200S1 98. CONTBOS2 1. + N1200AC2 CONTLGA2 -1. MSBOSLGA 1. + N1200AC4 ACOCOSTS .5698 OBJECTIV .5698 + N1200AC4 FUELAVAL .70359 SYSTDEPT 1. + N1200AC4 ACMILES .18557 FLAV*4 .8063 + N1200AC4 ATONMILE 2.7836 LFTNMILE 1.3918 + N1200AC4 LF1200C1 11.25 CONTBOS4 1. + N1200AC4 CONTLGA4 -1. + N1201AC2 ACOCOSTS .72047 OBJECTIV .72047 + N1201AC2 FUELAVAL .95782 SYSTDEPT 1. + N1201AC2 ACMILES .18557 ASMILES 24.31007 + N1201AC2 LFRPMASM 14.586042 FLAV*2 .8063 + N1201AC2 LF1201S1 98. CONTLGA2 1. + N1201AC2 CONTBOS2 -1. MSLGABOS 1. + N1201AC4 ACOCOSTS .5698 OBJECTIV .5698 + N1201AC4 FUELAVAL .70359 SYSTDEPT 1. + N1201AC4 ACMILES .18557 FLAV*4 .8063 + N1201AC4 ATONMILE 2.7836 LFTNMILE 1.3918 + N1201AC4 LF1201C1 11.25 CONTLGA4 1. + N1201AC4 CONTBOS4 -1. +RHS + RHS1 FUELAVAL 100000. PASSNGRS 9431. + RHS1 SYSTDEPT 50. FLAV*1 30. + RHS1 FLAV*2 45. DMBOSORD 302. + RHS1 DMBOSLGA 2352. DMBOSCLE 142. + RHS1 DMORDBOS 302. DMORDLGA 515. + RHS1 DMORDCLE 619. DMLGABOS 2743. + RHS1 DMLGAORD 712. DMLGACLE 517. + RHS1 DMCLEBOS 131. DMCLEORD 712. + RHS1 DMCLELGA 409. MSBOSORD 3. + RHS1 MSBOSLGA 7. MSBOSCLE 1. + RHS1 MSORDBOS 3. MSORDLGA 4. + RHS1 MSORDCLE 5. MSLGABOS 7. + RHS1 MSLGAORD 5. MSLGACLE 4. + RHS1 MSCLEBOS 1. MSCLEORD 6. + RHS1 MSCLELGA 3. MCORDBOS 1. + RHS1 MCLGAORD 2. DCBOSORD 12. + RHS1 DCBOSCLE 16. DCORDBOS 24. + RHS1 DCORDLGA 13. DCLGAORD 45. + RHS1 DCLGACLE 16. DCCLELGA 5. + RHS1 NOPTCLE0 24. +RANGES + RANGE1 DMBOSORD 61. DMBOSLGA 471. + RANGE1 DMBOSCLE 29. DMORDBOS 61. + RANGE1 DMORDLGA 103. DMORDCLE 124. + RANGE1 DMLGABOS 549. DMLGAORD 143. + RANGE1 DMLGACLE 104. DMCLEBOS 27. + RANGE1 DMCLEORD 143. DMCLELGA 82. + RANGE1 DCBOSORD 12. DCBOSCLE 3.2 + RANGE1 DCORDBOS 4.8 DCORDLGA 2.6 + RANGE1 DCLGAORD 9. DCLGACLE 3.2 + RANGE1 DCCLELGA 5. +BOUNDS + LO INTBOU GRDTIMN1 -100. + UP INTBOU GRDTIMN1 0. + LO INTBOU GRDTIMN2 -90. + UP INTBOU GRDTIMN2 0. + LO INTBOU GRDTIMN3 -45. + UP INTBOU GRDTIMN3 0. + LO INTBOU GRDTIMN4 -45. + UP INTBOU GRDTIMN4 0. + UP INTBOU N1003AC1 7. + UP INTBOU N1003AC2 7. + UP INTBOU N1003AC3 2. + UP INTBOU N1003AC4 2. + UP INTBOU N1005AC1 7. + UP INTBOU N1005AC2 7. + UP INTBOU N1005AC3 2. + UP INTBOU N1005AC4 2. + UP INTBOU N1011AC1 7. + UP INTBOU N1011AC2 7. + UP INTBOU N1011AC3 2. + UP INTBOU N1011AC4 2. + UP INTBOU N1013AC2 14. + UP INTBOU N1013AC4 2. + UP INTBOU N1015AC2 7. + UP INTBOU N1015AC4 2. + UP INTBOU N1017AC2 7. + UP INTBOU N1017AC4 2. + UP INTBOU N1019AC2 7. + UP INTBOU N1019AC4 2. + UP INTBOU N1021AC1 7. + UP INTBOU N1021AC2 7. + UP INTBOU N1021AC3 2. + UP INTBOU N1021AC4 2. + UP INTBOU N1002AC1 7. + UP INTBOU N1002AC2 7. + UP INTBOU N1002AC3 2. + UP INTBOU N1002AC4 2. + UP INTBOU N1004AC2 7. + UP INTBOU N1004AC4 2. + UP INTBOU N1006AC1 7. + UP INTBOU N1006AC2 7. + UP INTBOU N1006AC3 2. + UP INTBOU N1006AC4 2. + UP INTBOU N1008AC2 14. + UP INTBOU N1008AC4 2. + UP INTBOU N1010AC2 14. + UP INTBOU N1010AC4 2. + UP INTBOU N1012AC2 7. + UP INTBOU N1012AC4 2. + UP INTBOU N1014AC2 14. + UP INTBOU N1014AC4 2. + UP INTBOU N1100AC2 7. + UP INTBOU N1100AC4 7. + UP INTBOU N1102AC2 7. + UP INTBOU N1102AC4 7. + UP INTBOU N1200AC2 14. + UP INTBOU N1200AC4 7. + UP INTBOU N1201AC2 14. + UP INTBOU N1201AC4 7. +ENDATA diff --git a/demos/ppl_lpsol/examples/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..125f3d9 --- /dev/null +++ b/demos/ppl_lpsol/examples/ex1.mps @@ -0,0 +1,19 @@ +NAME from_lp_file +ROWS + N r_000000 + L C1 + L r_000002 +COLUMNS + MARK0000 'MARKER' 'INTORG' + x1 r_000000 1 + x1 C1 2 + x1 r_000002 -4 + x2 r_000000 -2 + x2 C1 1 + x2 r_000002 4 + MARK0001 'MARKER' 'INTEND' +RHS + RHS C1 5 + RHS r_000002 5 +BOUNDS +ENDATA diff --git a/demos/ppl_lpsol/examples/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..fa3cffe --- /dev/null +++ b/demos/ppl_lpsol/examples/sample.mps @@ -0,0 +1,22 @@ +* Problem: sample +* Rows: 3 +* Columns: 3 +* Non-zeros: 12 +* +NAME sample +ROWS + N R______0 + L p + L q + L r +COLUMNS + x1 R______0 -10 r 2 + q 10 p 1 + x2 R______0 -6 r 2 + q 4 p 1 + x3 R______0 -4 r 6 + q 5 p 1 +RHS + p 100 q 600 + r 300 +ENDATA diff --git a/demos/ppl_lpsol/examples/sc105.mps b/demos/ppl_lpsol/examples/sc105.mps new file mode 100644 index 0000000..4de391e --- /dev/null +++ b/demos/ppl_lpsol/examples/sc105.mps @@ -0,0 +1,296 @@ +NAME SC105 +ROWS + N MAXIM + L ROW00001 + L ROW00002 + L ROW00003 + E ROW00004 + E ROW00005 + E ROW00006 + E ROW00007 + L ROW00008 + L ROW00009 + L ROW00010 + L ROW00011 + L ROW00012 + L ROW00013 + E ROW00014 + E ROW00015 + E ROW00016 + E ROW00017 + E ROW00018 + L ROW00019 + L ROW00020 + L ROW00021 + L ROW00022 + L ROW00023 + L ROW00024 + E ROW00025 + E ROW00026 + E ROW00027 + E ROW00028 + E ROW00029 + L ROW00030 + L ROW00031 + L ROW00032 + L ROW00033 + L ROW00034 + L ROW00035 + E ROW00036 + E ROW00037 + E ROW00038 + E ROW00039 + E ROW00040 + L ROW00041 + L ROW00042 + L ROW00043 + L ROW00044 + L ROW00045 + L ROW00046 + E ROW00047 + E ROW00048 + E ROW00049 + E ROW00050 + E ROW00051 + L ROW00052 + L ROW00053 + L ROW00054 + L ROW00055 + L ROW00056 + L ROW00057 + E ROW00058 + E ROW00059 + E ROW00060 + E ROW00061 + E ROW00062 + L ROW00063 + L ROW00064 + L ROW00065 + L ROW00066 + L ROW00067 + L ROW00068 + E ROW00069 + E ROW00070 + E ROW00071 + E ROW00072 + E ROW00073 + L ROW00074 + L ROW00075 + L ROW00076 + L ROW00077 + L ROW00078 + L ROW00079 + E ROW00080 + E ROW00081 + E ROW00082 + E ROW00083 + E ROW00084 + L ROW00085 + L ROW00086 + L ROW00087 + L ROW00088 + L ROW00089 + L ROW00090 + E ROW00091 + E ROW00092 + E ROW00093 + E ROW00094 + E ROW00095 + L ROW00096 + L ROW00097 + L ROW00098 + L ROW00099 + L ROW00100 + L ROW00101 + E ROW00102 + L ROW00103 + L ROW00104 + L ROW00105 +COLUMNS + COL00001 ROW00001 2. ROW00002 1. + COL00001 ROW00005 -1. + COL00002 ROW00001 1. ROW00002 2. + COL00002 ROW00006 -1. + COL00003 ROW00001 1.5 ROW00002 1.5 + COL00003 ROW00007 -1. + COL00004 MAXIM -1. ROW00004 1. + COL00004 ROW00014 1.1 + COL00005 ROW00004 -1. ROW00013 1. + COL00005 ROW00015 1. + COL00006 ROW00005 1. ROW00008 -1. + COL00006 ROW00016 -1. + COL00007 ROW00006 1. ROW00009 -1. + COL00007 ROW00017 -1. + COL00008 ROW00007 1. ROW00010 -1. + COL00008 ROW00018 -1. + COL00009 ROW00008 1. ROW00011 -1. + COL00010 ROW00009 1. ROW00012 -1. + COL00011 ROW00010 1. ROW00013 -1. + COL00012 ROW00011 2. ROW00012 1. + COL00012 ROW00016 -1. + COL00013 ROW00011 1. ROW00012 2. + COL00013 ROW00017 -1. + COL00014 ROW00011 1.5 ROW00012 1.5 + COL00014 ROW00018 -1. + COL00015 ROW00014 -1. ROW00015 1. + COL00015 ROW00025 1.1 + COL00016 ROW00015 -1. ROW00024 1. + COL00016 ROW00026 1. + COL00017 ROW00016 1. ROW00019 -1. + COL00017 ROW00027 -1. + COL00018 ROW00017 1. ROW00020 -1. + COL00018 ROW00028 -1. + COL00019 ROW00018 1. ROW00021 -1. + COL00019 ROW00029 -1. + COL00020 ROW00019 1. ROW00022 -1. + COL00021 ROW00020 1. ROW00023 -1. + COL00022 ROW00021 1. ROW00024 -1. + COL00023 ROW00022 2. ROW00023 1. + COL00023 ROW00027 -1. + COL00024 ROW00022 1. ROW00023 2. + COL00024 ROW00028 -1. + COL00025 ROW00022 1.5 ROW00023 1.5 + COL00025 ROW00029 -1. + COL00026 ROW00025 -1. ROW00026 1. + COL00026 ROW00036 1.1 + COL00027 ROW00026 -1. ROW00035 1. + COL00027 ROW00037 1. + COL00028 ROW00027 1. ROW00030 -1. + COL00028 ROW00038 -1. + COL00029 ROW00028 1. ROW00031 -1. + COL00029 ROW00039 -1. + COL00030 ROW00029 1. ROW00032 -1. + COL00030 ROW00040 -1. + COL00031 ROW00030 1. ROW00033 -1. + COL00032 ROW00031 1. ROW00034 -1. + COL00033 ROW00032 1. ROW00035 -1. + COL00034 ROW00033 2. ROW00034 1. + COL00034 ROW00038 -1. + COL00035 ROW00033 1. ROW00034 2. + COL00035 ROW00039 -1. + COL00036 ROW00033 1.5 ROW00034 1.5 + COL00036 ROW00040 -1. + COL00037 ROW00036 -1. ROW00037 1. + COL00037 ROW00047 1.1 + COL00038 ROW00037 -1. ROW00046 1. + COL00038 ROW00048 1. + COL00039 ROW00038 1. ROW00041 -1. + COL00039 ROW00049 -1. + COL00040 ROW00039 1. ROW00042 -1. + COL00040 ROW00050 -1. + COL00041 ROW00040 1. ROW00043 -1. + COL00041 ROW00051 -1. + COL00042 ROW00041 1. ROW00044 -1. + COL00043 ROW00042 1. ROW00045 -1. + COL00044 ROW00043 1. ROW00046 -1. + COL00045 ROW00044 2. ROW00045 1. + COL00045 ROW00049 -1. + COL00046 ROW00044 1. ROW00045 2. + COL00046 ROW00050 -1. + COL00047 ROW00044 1.5 ROW00045 1.5 + COL00047 ROW00051 -1. + COL00048 ROW00047 -1. ROW00048 1. + COL00048 ROW00058 1.1 + COL00049 ROW00048 -1. ROW00057 1. + COL00049 ROW00059 1. + COL00050 ROW00049 1. ROW00052 -1. + COL00050 ROW00060 -1. + COL00051 ROW00050 1. ROW00053 -1. + COL00051 ROW00061 -1. + COL00052 ROW00051 1. ROW00054 -1. + COL00052 ROW00062 -1. + COL00053 ROW00052 1. ROW00055 -1. + COL00054 ROW00053 1. ROW00056 -1. + COL00055 ROW00054 1. ROW00057 -1. + COL00056 ROW00055 2. ROW00056 1. + COL00056 ROW00060 -1. + COL00057 ROW00055 1. ROW00056 2. + COL00057 ROW00061 -1. + COL00058 ROW00055 1.5 ROW00056 1.5 + COL00058 ROW00062 -1. + COL00059 ROW00058 -1. ROW00059 1. + COL00059 ROW00069 1.1 + COL00060 ROW00059 -1. ROW00068 1. + COL00060 ROW00070 1. + COL00061 ROW00060 1. ROW00063 -1. + COL00061 ROW00071 -1. + COL00062 ROW00061 1. ROW00064 -1. + COL00062 ROW00072 -1. + COL00063 ROW00062 1. ROW00065 -1. + COL00063 ROW00073 -1. + COL00064 ROW00063 1. ROW00066 -1. + COL00065 ROW00064 1. ROW00067 -1. + COL00066 ROW00065 1. ROW00068 -1. + COL00067 ROW00066 2. ROW00067 1. + COL00067 ROW00071 -1. + COL00068 ROW00066 1. ROW00067 2. + COL00068 ROW00072 -1. + COL00069 ROW00066 1.5 ROW00067 1.5 + COL00069 ROW00073 -1. + COL00070 ROW00069 -1. ROW00070 1. + COL00070 ROW00080 1.1 + COL00071 ROW00070 -1. ROW00079 1. + COL00071 ROW00081 1. + COL00072 ROW00071 1. ROW00074 -1. + COL00072 ROW00082 -1. + COL00073 ROW00072 1. ROW00075 -1. + COL00073 ROW00083 -1. + COL00074 ROW00073 1. ROW00076 -1. + COL00074 ROW00084 -1. + COL00075 ROW00074 1. ROW00077 -1. + COL00076 ROW00075 1. ROW00078 -1. + COL00077 ROW00076 1. ROW00079 -1. + COL00078 ROW00077 2. ROW00078 1. + COL00078 ROW00082 -1. + COL00079 ROW00077 1. ROW00078 2. + COL00079 ROW00083 -1. + COL00080 ROW00077 1.5 ROW00078 1.5 + COL00080 ROW00084 -1. + COL00081 ROW00080 -1. ROW00081 1. + COL00081 ROW00091 1.1 + COL00082 ROW00081 -1. ROW00090 1. + COL00082 ROW00092 1. + COL00083 ROW00082 1. ROW00085 -1. + COL00083 ROW00093 -1. + COL00084 ROW00083 1. ROW00086 -1. + COL00084 ROW00094 -1. + COL00085 ROW00084 1. ROW00087 -1. + COL00085 ROW00095 -1. + COL00086 ROW00085 1. ROW00088 -1. + COL00087 ROW00086 1. ROW00089 -1. + COL00088 ROW00087 1. ROW00090 -1. + COL00089 ROW00088 2. ROW00089 1. + COL00089 ROW00093 -1. + COL00090 ROW00088 1. ROW00089 2. + COL00090 ROW00094 -1. + COL00091 ROW00088 1.5 ROW00089 1.5 + COL00091 ROW00095 -1. + COL00092 ROW00091 -1. ROW00092 1. + COL00092 ROW00102 1.1 + COL00093 ROW00092 -1. ROW00101 1. + COL00094 ROW00093 1. ROW00096 -1. + COL00095 ROW00094 1. ROW00097 -1. + COL00096 ROW00095 1. ROW00098 -1. + COL00097 ROW00096 1. ROW00099 -1. + COL00098 ROW00097 1. ROW00100 -1. + COL00099 ROW00098 1. ROW00101 -1. + COL00100 ROW00099 2. ROW00100 1. + COL00100 ROW00103 -.8 ROW00104 .1 + COL00101 ROW00099 1. ROW00100 2. + COL00101 ROW00103 .1 ROW00104 -.8 + COL00102 ROW00099 1.5 ROW00100 1.5 + COL00102 ROW00103 .15 ROW00104 .15 + COL00102 ROW00105 -1. + COL00103 ROW00102 -1. ROW00105 1. +RHS + CONST ROW00001 200. ROW00002 100. + CONST ROW00011 200. ROW00012 100. + CONST ROW00022 200. ROW00023 100. + CONST ROW00033 200. ROW00034 100. + CONST ROW00044 200. ROW00045 100. + CONST ROW00055 200. ROW00056 100. + CONST ROW00066 200. ROW00067 100. + CONST ROW00077 200. ROW00078 100. + CONST ROW00088 200. ROW00089 100. + CONST ROW00099 200. ROW00100 100. +ENDATA diff --git a/demos/ppl_lpsol/examples/sc50a.mps b/demos/ppl_lpsol/examples/sc50a.mps new file mode 100644 index 0000000..a59623f --- /dev/null +++ b/demos/ppl_lpsol/examples/sc50a.mps @@ -0,0 +1,141 @@ +NAME SC50A +ROWS + N MAXIM + L ROW00001 + L ROW00002 + L ROW00003 + E ROW00004 + E ROW00005 + E ROW00006 + E ROW00007 + L ROW00008 + L ROW00009 + L ROW00010 + L ROW00011 + L ROW00012 + L ROW00013 + E ROW00014 + E ROW00015 + E ROW00016 + E ROW00017 + E ROW00018 + L ROW00019 + L ROW00020 + L ROW00021 + L ROW00022 + L ROW00023 + L ROW00024 + E ROW00025 + E ROW00026 + E ROW00027 + E ROW00028 + E ROW00029 + L ROW00030 + L ROW00031 + L ROW00032 + L ROW00033 + L ROW00034 + L ROW00035 + E ROW00036 + E ROW00037 + E ROW00038 + E ROW00039 + E ROW00040 + L ROW00041 + L ROW00042 + L ROW00043 + L ROW00044 + L ROW00045 + L ROW00046 + E ROW00047 + L ROW00048 + L ROW00049 + L ROW00050 +COLUMNS + COL00001 ROW00001 2. ROW00002 1. + COL00001 ROW00005 -1. + COL00002 ROW00001 1. ROW00002 2. + COL00002 ROW00006 -1. + COL00003 ROW00001 1.5 ROW00002 1.5 + COL00003 ROW00007 -1. + COL00004 MAXIM -1. ROW00004 1. + COL00004 ROW00014 1.1 + COL00005 ROW00004 -1. ROW00013 1. + COL00005 ROW00015 1. + COL00006 ROW00005 1. ROW00008 -1. + COL00006 ROW00016 -1. + COL00007 ROW00006 1. ROW00009 -1. + COL00007 ROW00017 -1. + COL00008 ROW00007 1. ROW00010 -1. + COL00008 ROW00018 -1. + COL00009 ROW00008 1. ROW00011 -1. + COL00010 ROW00009 1. ROW00012 -1. + COL00011 ROW00010 1. ROW00013 -1. + COL00012 ROW00011 2. ROW00012 1. + COL00012 ROW00016 -1. + COL00013 ROW00011 1. ROW00012 2. + COL00013 ROW00017 -1. + COL00014 ROW00011 1.5 ROW00012 1.5 + COL00014 ROW00018 -1. + COL00015 ROW00014 -1. ROW00015 1. + COL00015 ROW00025 1.1 + COL00016 ROW00015 -1. ROW00024 1. + COL00016 ROW00026 1. + COL00017 ROW00016 1. ROW00019 -1. + COL00017 ROW00027 -1. + COL00018 ROW00017 1. ROW00020 -1. + COL00018 ROW00028 -1. + COL00019 ROW00018 1. ROW00021 -1. + COL00019 ROW00029 -1. + COL00020 ROW00019 1. ROW00022 -1. + COL00021 ROW00020 1. ROW00023 -1. + COL00022 ROW00021 1. ROW00024 -1. + COL00023 ROW00022 2. ROW00023 1. + COL00023 ROW00027 -1. + COL00024 ROW00022 1. ROW00023 2. + COL00024 ROW00028 -1. + COL00025 ROW00022 1.5 ROW00023 1.5 + COL00025 ROW00029 -1. + COL00026 ROW00025 -1. ROW00026 1. + COL00026 ROW00036 1.1 + COL00027 ROW00026 -1. ROW00035 1. + COL00027 ROW00037 1. + COL00028 ROW00027 1. ROW00030 -1. + COL00028 ROW00038 -1. + COL00029 ROW00028 1. ROW00031 -1. + COL00029 ROW00039 -1. + COL00030 ROW00029 1. ROW00032 -1. + COL00030 ROW00040 -1. + COL00031 ROW00030 1. ROW00033 -1. + COL00032 ROW00031 1. ROW00034 -1. + COL00033 ROW00032 1. ROW00035 -1. + COL00034 ROW00033 2. ROW00034 1. + COL00034 ROW00038 -1. + COL00035 ROW00033 1. ROW00034 2. + COL00035 ROW00039 -1. + COL00036 ROW00033 1.5 ROW00034 1.5 + COL00036 ROW00040 -1. + COL00037 ROW00036 -1. ROW00037 1. + COL00037 ROW00047 1.1 + COL00038 ROW00037 -1. ROW00046 1. + COL00039 ROW00038 1. ROW00041 -1. + COL00040 ROW00039 1. ROW00042 -1. + COL00041 ROW00040 1. ROW00043 -1. + COL00042 ROW00041 1. ROW00044 -1. + COL00043 ROW00042 1. ROW00045 -1. + COL00044 ROW00043 1. ROW00046 -1. + COL00045 ROW00044 2. ROW00045 1. + COL00045 ROW00048 -.8 ROW00049 .1 + COL00046 ROW00044 1. ROW00045 2. + COL00046 ROW00048 .1 ROW00049 -.8 + COL00047 ROW00044 1.5 ROW00045 1.5 + COL00047 ROW00048 .15 ROW00049 .15 + COL00047 ROW00050 -1. + COL00048 ROW00047 -1. ROW00050 1. +RHS + CONST ROW00001 170. ROW00002 130. + CONST ROW00011 170. ROW00012 130. + CONST ROW00022 170. ROW00023 130. + CONST ROW00033 170. ROW00034 130. + CONST ROW00044 170. ROW00045 130. +ENDATA diff --git a/demos/ppl_lpsol/examples/sc50b.mps b/demos/ppl_lpsol/examples/sc50b.mps new file mode 100644 index 0000000..8d517ef --- /dev/null +++ b/demos/ppl_lpsol/examples/sc50b.mps @@ -0,0 +1,127 @@ +NAME SC50B +ROWS + N MAXIM + L ROW00001 + L ROW00002 + L ROW00003 + E ROW00004 + E ROW00005 + E ROW00006 + E ROW00007 + L ROW00008 + L ROW00009 + L ROW00010 + L ROW00011 + L ROW00012 + L ROW00013 + E ROW00014 + E ROW00015 + E ROW00016 + E ROW00017 + E ROW00018 + L ROW00019 + L ROW00020 + L ROW00021 + L ROW00022 + L ROW00023 + L ROW00024 + E ROW00025 + E ROW00026 + E ROW00027 + E ROW00028 + E ROW00029 + L ROW00030 + L ROW00031 + L ROW00032 + L ROW00033 + L ROW00034 + L ROW00035 + E ROW00036 + E ROW00037 + E ROW00038 + E ROW00039 + E ROW00040 + L ROW00041 + L ROW00042 + L ROW00043 + L ROW00044 + L ROW00045 + L ROW00046 + E ROW00047 + L ROW00048 + L ROW00049 + L ROW00050 +COLUMNS + COL00001 ROW00001 3. ROW00005 -1. + COL00002 ROW00001 3. ROW00006 -1. + COL00003 ROW00001 3. ROW00007 -1. + COL00004 MAXIM -1. ROW00004 1. + COL00004 ROW00014 1.1 + COL00005 ROW00004 -1. ROW00012 .4 + COL00005 ROW00013 .6 ROW00015 1. + COL00006 ROW00005 1. ROW00008 -1. + COL00006 ROW00016 -1. + COL00007 ROW00006 1. ROW00009 -1. + COL00007 ROW00017 -1. + COL00008 ROW00007 1. ROW00010 -1. + COL00008 ROW00018 -1. + COL00009 ROW00008 1. ROW00011 -1. + COL00010 ROW00009 1. ROW00012 -1. + COL00011 ROW00010 1. ROW00013 -1. + COL00012 ROW00011 3. ROW00016 -1. + COL00013 ROW00011 3. ROW00017 -1. + COL00014 ROW00011 3. ROW00018 -1. + COL00015 ROW00014 -1. ROW00015 1. + COL00015 ROW00025 1.1 + COL00016 ROW00015 -1. ROW00023 .4 + COL00016 ROW00024 .6 ROW00026 1. + COL00017 ROW00016 1. ROW00019 -1. + COL00017 ROW00027 -1. + COL00018 ROW00017 1. ROW00020 -1. + COL00018 ROW00028 -1. + COL00019 ROW00018 1. ROW00021 -1. + COL00019 ROW00029 -1. + COL00020 ROW00019 1. ROW00022 -1. + COL00021 ROW00020 1. ROW00023 -1. + COL00022 ROW00021 1. ROW00024 -1. + COL00023 ROW00022 3. ROW00027 -1. + COL00024 ROW00022 3. ROW00028 -1. + COL00025 ROW00022 3. ROW00029 -1. + COL00026 ROW00025 -1. ROW00026 1. + COL00026 ROW00036 1.1 + COL00027 ROW00026 -1. ROW00034 .4 + COL00027 ROW00035 .6 ROW00037 1. + COL00028 ROW00027 1. ROW00030 -1. + COL00028 ROW00038 -1. + COL00029 ROW00028 1. ROW00031 -1. + COL00029 ROW00039 -1. + COL00030 ROW00029 1. ROW00032 -1. + COL00030 ROW00040 -1. + COL00031 ROW00030 1. ROW00033 -1. + COL00032 ROW00031 1. ROW00034 -1. + COL00033 ROW00032 1. ROW00035 -1. + COL00034 ROW00033 3. ROW00038 -1. + COL00035 ROW00033 3. ROW00039 -1. + COL00036 ROW00033 3. ROW00040 -1. + COL00037 ROW00036 -1. ROW00037 1. + COL00037 ROW00047 1.1 + COL00038 ROW00037 -1. ROW00045 .4 + COL00038 ROW00046 .6 + COL00039 ROW00038 1. ROW00041 -1. + COL00040 ROW00039 1. ROW00042 -1. + COL00041 ROW00040 1. ROW00043 -1. + COL00042 ROW00041 1. ROW00044 -1. + COL00043 ROW00042 1. ROW00045 -1. + COL00044 ROW00043 1. ROW00046 -1. + COL00045 ROW00044 3. ROW00048 -.7 + COL00046 ROW00044 3. ROW00048 .3 + COL00046 ROW00049 -1. + COL00047 ROW00044 3. ROW00048 .3 + COL00047 ROW00050 -1. + COL00048 ROW00047 -1. ROW00049 .4 + COL00048 ROW00050 .6 +RHS + CONST ROW00001 300. ROW00011 300. + CONST ROW00022 300. ROW00033 300. + CONST ROW00044 300. +ENDATA diff --git a/demos/ppl_lpsol/examples/ship08l.mps b/demos/ppl_lpsol/examples/ship08l.mps new file mode 100644 index 0000000..afb09b8 --- /dev/null +++ b/demos/ppl_lpsol/examples/ship08l.mps @@ -0,0 +1,9547 @@ +NAME SHIP08L +ROWS + N COST + G REGMIN + L REGMAX + G OVRMIN + L OVRMAX + G REGMIN01 + G REGMIN02 + E REGMIN03 + G REGMIN04 + E REGMIN05 + E REGMIN06 + E REGMIN07 + E REGMIN08 + L REGMAX01 + L REGMAX02 + L REGMAX04 + G OVRMIN01 + G OVRMIN02 + E OVRMIN03 + G OVRMIN04 + E OVRMIN05 + E OVRMIN06 + E OVRMIN07 + E OVRMIN08 + L OVRMAX01 + L OVRMAX02 + L OVRMAX04 + L TRAN0101 + L TRAN0102 + L TRAN0103 + L TRAN0104 + L TRAN0105 + L TRAN0106 + L TRAN0107 + L TRAN0108 + L TRAN0201 + L TRAN0202 + L TRAN0203 + L TRAN0204 + L TRAN0205 + L TRAN0206 + L TRAN0207 + L TRAN0208 + L TRAN0301 + L TRAN0302 + L TRAN0303 + L TRAN0304 + L TRAN0305 + L TRAN0306 + L TRAN0307 + L TRAN0308 + L TRAN0401 + L TRAN0402 + L TRAN0403 + L TRAN0404 + L TRAN0405 + L TRAN0406 + L TRAN0407 + L TRAN0408 + L TRAN0501 + L TRAN0502 + L TRAN0503 + L TRAN0504 + L TRAN0505 + L TRAN0506 + L TRAN0507 + L TRAN0508 + L TRAN0601 + L TRAN0602 + L TRAN0603 + L TRAN0604 + L TRAN0605 + L TRAN0606 + L TRAN0607 + L TRAN0608 + L TRAN0701 + L TRAN0702 + L TRAN0703 + L TRAN0704 + L TRAN0705 + L TRAN0706 + L TRAN0707 + L TRAN0708 + L TRAN0801 + L TRAN0802 + L TRAN0803 + L TRAN0804 + L TRAN0805 + L TRAN0806 + L TRAN0807 + L TRAN0808 + E BAL0101 + E BAL0102 + E BAL0103 + E BAL0104 + E BAL0105 + E BAL0106 + E BAL0107 + E BAL0108 + E BAL0109 + E BAL0110 + E BAL0111 + E BAL0112 + E BAL0113 + E BAL0114 + E BAL0115 + E BAL0116 + E BAL0117 + E BAL0118 + E BAL0119 + E BAL0120 + E BAL0121 + E BAL0122 + E BAL0123 + E BAL0124 + E BAL0125 + E BAL0126 + E BAL0127 + E BAL0128 + E BAL0129 + E BAL0130 + E BAL0131 + E BAL0132 + E BAL0133 + E BAL0134 + E BAL0135 + E BAL0136 + E BAL0137 + E BAL0138 + E BAL0139 + E BAL0140 + E BAL0141 + E BAL0142 + E BAL0143 + E BAL0144 + E BAL0145 + E BAL0146 + E BAL0147 + E BAL0148 + E BAL0149 + E BAL0150 + E BAL0151 + E BAL0152 + E BAL0153 + E BAL0154 + E BAL0155 + E BAL0156 + E BAL0157 + E BAL0158 + E BAL0159 + E BAL0160 + E BAL0161 + E BAL0162 + E BAL0163 + E BAL0164 + E BAL0165 + E BAL0166 + E BAL0167 + E BAL0168 + E BAL0169 + E BAL0170 + E BAL0171 + E BAL0172 + E BAL0173 + E BAL0174 + E BAL0175 + E BAL0176 + E BAL0177 + E BAL0178 + E BAL0179 + E BAL0180 + E BAL0181 + E BAL0182 + E BAL0183 + E BAL0184 + E BAL0185 + E BAL0186 + E BAL0201 + E BAL0202 + E BAL0203 + E BAL0204 + E BAL0205 + E BAL0206 + E BAL0207 + E BAL0208 + E BAL0209 + E BAL0210 + E BAL0211 + E BAL0212 + E BAL0213 + E BAL0214 + E BAL0215 + E BAL0216 + E BAL0217 + E BAL0218 + E BAL0219 + E BAL0220 + E BAL0221 + E BAL0222 + E BAL0223 + E BAL0224 + E BAL0225 + E BAL0226 + E BAL0227 + E BAL0228 + E BAL0229 + E BAL0230 + E BAL0231 + E BAL0232 + E BAL0233 + E BAL0234 + E BAL0235 + E BAL0236 + E BAL0237 + E BAL0238 + E BAL0239 + E BAL0240 + E BAL0241 + E BAL0242 + E BAL0243 + E BAL0244 + E BAL0245 + E BAL0246 + E BAL0247 + E BAL0248 + E BAL0249 + E BAL0250 + E BAL0251 + E BAL0252 + E BAL0253 + E BAL0254 + E BAL0255 + E BAL0256 + E BAL0257 + E BAL0258 + E BAL0259 + E BAL0260 + E BAL0261 + E BAL0262 + E BAL0263 + E BAL0264 + E BAL0265 + E BAL0266 + E BAL0267 + E BAL0268 + E BAL0269 + E BAL0270 + E BAL0271 + E BAL0272 + E BAL0273 + E BAL0274 + E BAL0275 + E BAL0276 + E BAL0277 + E BAL0278 + E BAL0279 + E BAL0280 + E BAL0281 + E BAL0282 + E BAL0283 + E BAL0284 + E BAL0285 + E BAL0286 + E BAL0301 + E BAL0302 + E BAL0303 + E BAL0304 + E BAL0305 + E BAL0306 + E BAL0307 + E BAL0308 + E BAL0309 + E BAL0310 + E BAL0311 + E BAL0312 + E BAL0313 + E BAL0314 + E BAL0315 + E BAL0316 + E BAL0317 + E BAL0318 + E BAL0319 + E BAL0320 + E BAL0321 + E BAL0322 + E BAL0323 + E BAL0324 + E BAL0325 + E BAL0326 + E BAL0327 + E BAL0328 + E BAL0329 + E BAL0330 + E BAL0331 + E BAL0332 + E BAL0333 + E BAL0334 + E BAL0335 + E BAL0336 + E BAL0337 + E BAL0338 + E BAL0339 + E BAL0340 + E BAL0341 + E BAL0342 + E BAL0343 + E BAL0344 + E BAL0345 + E BAL0346 + E BAL0347 + E BAL0348 + E BAL0349 + E BAL0350 + E BAL0351 + E BAL0352 + E BAL0353 + E BAL0354 + E BAL0355 + E BAL0356 + E BAL0357 + E BAL0358 + E BAL0359 + E BAL0360 + E BAL0361 + E BAL0362 + E BAL0363 + E BAL0364 + E BAL0365 + E BAL0366 + E BAL0367 + E BAL0368 + E BAL0369 + E BAL0370 + E BAL0371 + E BAL0372 + E BAL0373 + E BAL0374 + E BAL0375 + E BAL0376 + E BAL0377 + E BAL0378 + E BAL0379 + E BAL0380 + E BAL0381 + E BAL0382 + E BAL0383 + E BAL0384 + E BAL0385 + E BAL0386 + E BAL0401 + E BAL0402 + E BAL0403 + E BAL0404 + E BAL0405 + E BAL0406 + E BAL0407 + E BAL0408 + E BAL0409 + E BAL0410 + E BAL0411 + E BAL0412 + E BAL0413 + E BAL0414 + E BAL0415 + E BAL0416 + E BAL0417 + E BAL0418 + E BAL0419 + E BAL0420 + E BAL0421 + E BAL0422 + E BAL0423 + E BAL0424 + E BAL0425 + E BAL0426 + E BAL0427 + E BAL0428 + E BAL0429 + E BAL0430 + E BAL0431 + E BAL0432 + E BAL0433 + E BAL0434 + E BAL0435 + E BAL0436 + E BAL0437 + E BAL0438 + E BAL0439 + E BAL0440 + E BAL0441 + E BAL0442 + E BAL0443 + E BAL0444 + E BAL0445 + E BAL0446 + E BAL0447 + E BAL0448 + E BAL0449 + E BAL0450 + E BAL0451 + E BAL0452 + E BAL0453 + E BAL0454 + E BAL0455 + E BAL0456 + E BAL0457 + E BAL0458 + E BAL0459 + E BAL0460 + E BAL0461 + E BAL0462 + E BAL0463 + E BAL0464 + E BAL0465 + E BAL0466 + E BAL0467 + E BAL0468 + E BAL0469 + E BAL0470 + E BAL0471 + E BAL0472 + E BAL0473 + E BAL0474 + E BAL0475 + E BAL0476 + E BAL0477 + E BAL0478 + E BAL0479 + E BAL0480 + E BAL0481 + E BAL0482 + E BAL0483 + E BAL0484 + E BAL0485 + E BAL0486 + E BAL0501 + E BAL0502 + E BAL0503 + E BAL0504 + E BAL0505 + E BAL0506 + E BAL0507 + E BAL0508 + E BAL0509 + E BAL0510 + E BAL0511 + E BAL0512 + E BAL0513 + E BAL0514 + E BAL0515 + E BAL0516 + E BAL0517 + E BAL0518 + E BAL0519 + E BAL0520 + E BAL0521 + E BAL0522 + E BAL0523 + E BAL0524 + E BAL0525 + E BAL0526 + E BAL0527 + E BAL0528 + E BAL0529 + E BAL0530 + E BAL0531 + E BAL0532 + E BAL0533 + E BAL0534 + E BAL0535 + E BAL0536 + E BAL0537 + E BAL0538 + E BAL0539 + E BAL0540 + E BAL0541 + E BAL0542 + E BAL0543 + E BAL0544 + E BAL0545 + E BAL0546 + E BAL0547 + E BAL0548 + E BAL0549 + E BAL0550 + E BAL0551 + E BAL0552 + E BAL0553 + E BAL0554 + E BAL0555 + E BAL0556 + E BAL0557 + E BAL0558 + E BAL0559 + E BAL0560 + E BAL0561 + E BAL0562 + E BAL0563 + E BAL0564 + E BAL0565 + E BAL0566 + E BAL0567 + E BAL0568 + E BAL0569 + E BAL0570 + E BAL0571 + E BAL0572 + E BAL0573 + E BAL0574 + E BAL0575 + E BAL0576 + E BAL0577 + E BAL0578 + E BAL0579 + E BAL0580 + E BAL0581 + E BAL0582 + E BAL0583 + E BAL0584 + E BAL0585 + E BAL0586 + E BAL0601 + E BAL0602 + E BAL0603 + E BAL0604 + E BAL0605 + E BAL0606 + E BAL0607 + E BAL0608 + E BAL0609 + E BAL0610 + E BAL0611 + E BAL0612 + E BAL0613 + E BAL0614 + E BAL0615 + E BAL0616 + E BAL0617 + E BAL0618 + E BAL0619 + E BAL0620 + E BAL0621 + E BAL0622 + E BAL0623 + E BAL0624 + E BAL0625 + E BAL0626 + E BAL0627 + E BAL0628 + E BAL0629 + E BAL0630 + E BAL0631 + E BAL0632 + E BAL0633 + E BAL0634 + E BAL0635 + E BAL0636 + E BAL0637 + E BAL0638 + E BAL0639 + E BAL0640 + E BAL0641 + E BAL0642 + E BAL0643 + E BAL0644 + E BAL0645 + E BAL0646 + E BAL0647 + E BAL0648 + E BAL0649 + E BAL0650 + E BAL0651 + E BAL0652 + E BAL0653 + E BAL0654 + E BAL0655 + E BAL0656 + E BAL0657 + E BAL0658 + E BAL0659 + E BAL0660 + E BAL0661 + E BAL0662 + E BAL0663 + E BAL0664 + E BAL0665 + E BAL0666 + E BAL0667 + E BAL0668 + E BAL0669 + E BAL0670 + E BAL0671 + E BAL0672 + E BAL0673 + E BAL0674 + E BAL0675 + E BAL0676 + E BAL0677 + E BAL0678 + E BAL0679 + E BAL0680 + E BAL0681 + E BAL0682 + E BAL0683 + E BAL0684 + E BAL0685 + E BAL0686 + E BAL0701 + E BAL0702 + E BAL0703 + E BAL0704 + E BAL0705 + E BAL0706 + E BAL0707 + E BAL0708 + E BAL0709 + E BAL0710 + E BAL0711 + E BAL0712 + E BAL0713 + E BAL0714 + E BAL0715 + E BAL0716 + E BAL0717 + E BAL0718 + E BAL0719 + E BAL0720 + E BAL0721 + E BAL0722 + E BAL0723 + E BAL0724 + E BAL0725 + E BAL0726 + E BAL0727 + E BAL0728 + E BAL0729 + E BAL0730 + E BAL0731 + E BAL0732 + E BAL0733 + E BAL0734 + E BAL0735 + E BAL0736 + E BAL0737 + E BAL0738 + E BAL0739 + E BAL0740 + E BAL0741 + E BAL0742 + E BAL0743 + E BAL0744 + E BAL0745 + E BAL0746 + E BAL0747 + E BAL0748 + E BAL0749 + E BAL0750 + E BAL0751 + E BAL0752 + E BAL0753 + E BAL0754 + E BAL0755 + E BAL0756 + E BAL0757 + E BAL0758 + E BAL0759 + E BAL0760 + E BAL0761 + E BAL0762 + E BAL0763 + E BAL0764 + E BAL0765 + E BAL0766 + E BAL0767 + E BAL0768 + E BAL0769 + E BAL0770 + E BAL0771 + E BAL0772 + E BAL0773 + E BAL0774 + E BAL0775 + E BAL0776 + E BAL0777 + E BAL0778 + E BAL0779 + E BAL0780 + E BAL0781 + E BAL0782 + E BAL0783 + E BAL0784 + E BAL0785 + E BAL0786 + E BAL0801 + E BAL0802 + E BAL0803 + E BAL0804 + E BAL0805 + E BAL0806 + E BAL0807 + E BAL0808 + E BAL0809 + E BAL0810 + E BAL0811 + E BAL0812 + E BAL0813 + E BAL0814 + E BAL0815 + E BAL0816 + E BAL0817 + E BAL0818 + E BAL0819 + E BAL0820 + E BAL0821 + E BAL0822 + E BAL0823 + E BAL0824 + E BAL0825 + E BAL0826 + E BAL0827 + E BAL0828 + E BAL0829 + E BAL0830 + E BAL0831 + E BAL0832 + E BAL0833 + E BAL0834 + E BAL0835 + E BAL0836 + E BAL0837 + E BAL0838 + E BAL0839 + E BAL0840 + E BAL0841 + E BAL0842 + E BAL0843 + E BAL0844 + E BAL0845 + E BAL0846 + E BAL0847 + E BAL0848 + E BAL0849 + E BAL0850 + E BAL0851 + E BAL0852 + E BAL0853 + E BAL0854 + E BAL0855 + E BAL0856 + E BAL0857 + E BAL0858 + E BAL0859 + E BAL0860 + E BAL0861 + E BAL0862 + E BAL0863 + E BAL0864 + E BAL0865 + E BAL0866 + E BAL0867 + E BAL0868 + E BAL0869 + E BAL0870 + E BAL0871 + E BAL0872 + E BAL0873 + E BAL0874 + E BAL0875 + E BAL0876 + E BAL0877 + E BAL0878 + E BAL0879 + E BAL0880 + E BAL0881 + E BAL0882 + E BAL0883 + E BAL0884 + E BAL0885 + E BAL0886 +COLUMNS + PREG0101 COST 4862. REGMIN .0210855 + PREG0101 REGMAX .0210855 REGMIN01 .0210855 + PREG0101 REGMAX01 .0210855 TRAN0101 -1. + PREG0101 BAL0101 1. + PREG0102 COST 4688. REGMIN .0175461 + PREG0102 REGMAX .0175461 REGMIN01 .0175461 + PREG0102 REGMAX01 .0175461 TRAN0201 -1. + PREG0102 BAL0201 1. + PREG0103 COST 4872. REGMIN .0175461 + PREG0103 REGMAX .0175461 REGMIN01 .0175461 + PREG0103 REGMAX01 .0175461 TRAN0301 -1. + PREG0103 BAL0301 1. + PREG0105 COST 4655. REGMIN .0175461 + PREG0105 REGMAX .0175461 REGMIN01 .0175461 + PREG0105 REGMAX01 .0175461 TRAN0501 -1. + PREG0105 BAL0501 1. + PREG0202 COST 4196. REGMIN .0187961 + PREG0202 REGMAX .0187961 REGMIN02 .0187961 + PREG0202 REGMAX02 .0187961 TRAN0202 -1. + PREG0202 BAL0202 1. + PREG0203 COST 4338. REGMIN .0328947 + PREG0203 REGMAX .0328947 REGMIN02 .0328947 + PREG0203 REGMAX02 .0328947 TRAN0302 -1. + PREG0203 BAL0302 1. + PREG0205 COST 4283. REGMIN .0112105 + PREG0205 REGMAX .0112105 REGMIN02 .0112105 + PREG0205 REGMAX02 .0112105 TRAN0502 -1. + PREG0205 BAL0502 1. + PREG0207 COST 4156. REGMIN .0131579 + PREG0207 REGMAX .0131579 REGMIN02 .0131579 + PREG0207 REGMAX02 .0131579 TRAN0702 -1. + PREG0207 BAL0702 1. + PREG0401 COST 4691. REGMIN .0175461 + PREG0401 REGMAX .0175461 REGMIN04 .0175461 + PREG0401 REGMAX04 .0175461 TRAN0104 -1. + PREG0401 BAL0104 1. + PREG0402 COST 4669. REGMIN .0181711 + PREG0402 REGMAX .0181711 REGMIN04 .0181711 + PREG0402 REGMAX04 .0181711 TRAN0204 -1. + PREG0402 BAL0204 1. + PREG0404 COST 6724. REGMIN .0263158 + PREG0404 REGMAX .0263158 REGMIN04 .0263158 + PREG0404 REGMAX04 .0263158 TRAN0404 -1. + PREG0404 BAL0404 1. + PREG0405 COST 4615. REGMIN .0181711 + PREG0405 REGMAX .0181711 REGMIN04 .0181711 + PREG0405 REGMAX04 .0181711 TRAN0504 -1. + PREG0405 BAL0504 1. + PREG0406 COST 4148. REGMIN .0181711 + PREG0406 REGMAX .0181711 REGMIN04 .0181711 + PREG0406 REGMAX04 .0181711 TRAN0604 -1. + PREG0406 BAL0604 1. + PREG0408 COST 6411. REGMIN .0239211 + PREG0408 REGMAX .0239211 REGMIN04 .0239211 + PREG0408 REGMAX04 .0239211 TRAN0804 -1. + PREG0408 BAL0804 1. + POVR0101 COST 6552. OVRMIN 3.205 + POVR0101 OVRMAX 3.205 OVRMIN01 3.205 + POVR0101 OVRMAX01 3.205 TRAN0101 -1. + POVR0101 BAL0101 1. + POVR0102 COST 6351. OVRMIN 2.667 + POVR0102 OVRMAX 2.667 OVRMIN01 2.667 + POVR0102 OVRMAX01 2.667 TRAN0201 -1. + POVR0102 BAL0201 1. + POVR0103 COST 6554. OVRMIN 2.667 + POVR0103 OVRMAX 2.667 OVRMIN01 2.667 + POVR0103 OVRMAX01 2.667 TRAN0301 -1. + POVR0103 BAL0301 1. + POVR0105 COST 6325. OVRMIN 2.667 + POVR0105 OVRMAX 2.667 OVRMIN01 2.667 + POVR0105 OVRMAX01 2.667 TRAN0501 -1. + POVR0105 BAL0501 1. + POVR0202 COST 5756. OVRMIN 2.857 + POVR0202 OVRMAX 2.857 OVRMIN02 2.857 + POVR0202 OVRMAX02 2.857 TRAN0202 -1. + POVR0202 BAL0202 1. + POVR0203 COST 6777. OVRMIN 5. + POVR0203 OVRMAX 5. OVRMIN02 5. + POVR0203 OVRMAX02 5. TRAN0302 -1. + POVR0203 BAL0302 1. + POVR0205 COST 5844. OVRMIN 1.704 + POVR0205 OVRMAX 1.704 OVRMIN02 1.704 + POVR0205 OVRMAX02 1.704 TRAN0502 -1. + POVR0205 BAL0502 1. + POVR0207 COST 5673. OVRMIN 2. + POVR0207 OVRMAX 2. OVRMIN02 2. + POVR0207 OVRMAX02 2. TRAN0702 -1. + POVR0207 BAL0702 1. + POVR0401 COST 5794. OVRMIN 2.667 + POVR0401 OVRMAX 2.667 OVRMIN04 2.667 + POVR0401 OVRMAX04 2.667 TRAN0104 -1. + POVR0401 BAL0104 1. + POVR0402 COST 5787. OVRMIN 2.762 + POVR0402 OVRMAX 2.762 OVRMIN04 2.762 + POVR0402 OVRMAX04 2.762 TRAN0204 -1. + POVR0402 BAL0204 1. + POVR0404 COST 8111. OVRMIN 4. + POVR0404 OVRMAX 4. OVRMIN04 4. + POVR0404 OVRMAX04 4. TRAN0404 -1. + POVR0404 BAL0404 1. + POVR0405 COST 5721. OVRMIN 2.762 + POVR0405 OVRMAX 2.762 OVRMIN04 2.762 + POVR0405 OVRMAX04 2.762 TRAN0504 -1. + POVR0405 BAL0504 1. + POVR0406 COST 5303. OVRMIN 2.762 + POVR0406 OVRMAX 2.762 OVRMIN04 2.762 + POVR0406 OVRMAX04 2.762 TRAN0604 -1. + POVR0406 BAL0604 1. + SH010201 COST 323.73 TRAN0102 1. + SH010201 BAL0102 -1. BAL0101 1. + SH010301 COST 124.26 TRAN0103 1. + SH010301 BAL0103 -1. BAL0101 1. + SH010401 COST 226.72 TRAN0104 1. + SH010401 BAL0104 -1. BAL0101 1. + SH010501 COST 258.33 TRAN0105 1. + SH010501 BAL0105 -1. BAL0101 1. + SH010601 COST 137.34 TRAN0106 1. + SH010601 BAL0152 -1. BAL0101 1. + SH010801 COST 155.87 TRAN0108 1. + SH010801 BAL0183 -1. BAL0101 1. + SH010102 COST 516.66 TRAN0101 1. + SH010102 BAL0101 -1. BAL0102 1. + SH010302 COST 454.53 TRAN0103 1. + SH010302 BAL0103 -1. BAL0102 1. + SH010402 COST 667.08 TRAN0104 1. + SH010402 BAL0104 -1. BAL0102 1. + SH010502 COST 807.69 TRAN0105 1. + SH010502 BAL0105 -1. BAL0102 1. + SH010602 COST 412.02 TRAN0106 1. + SH010602 BAL0152 -1. BAL0102 1. + SH010802 COST 567.89 TRAN0108 1. + SH010802 BAL0183 -1. BAL0102 1. + SH010103 COST 267.05 TRAN0101 1. + SH010103 BAL0101 -1. BAL0103 1. + SH010203 COST 516.66 TRAN0102 1. + SH010203 BAL0102 -1. BAL0103 1. + SH010403 COST 400.03 TRAN0104 1. + SH010403 BAL0104 -1. BAL0103 1. + SH010503 COST 309.56 TRAN0105 1. + SH010503 BAL0105 -1. BAL0103 1. + SH010603 COST 98.1 TRAN0106 1. + SH010603 BAL0152 -1. BAL0103 1. + SH010803 COST 277.95 TRAN0108 1. + SH010803 BAL0183 -1. BAL0103 1. + SH010104 COST 189.66 TRAN0101 1. + SH010104 BAL0101 -1. BAL0104 1. + SH010204 COST 548.27 TRAN0102 1. + SH010204 BAL0102 -1. BAL0104 1. + SH010304 COST 264.87 TRAN0103 1. + SH010304 BAL0103 -1. BAL0104 1. + SH010504 COST 347.71 TRAN0105 1. + SH010504 BAL0105 -1. BAL0104 1. + SH010604 COST 267.05 TRAN0106 1. + SH010604 BAL0152 -1. BAL0104 1. + SH010704 COST 293.21 TRAN0107 1. + SH010704 BAL0164 -1. BAL0104 1. + SH010804 COST 63.22 TRAN0108 1. + SH010804 BAL0183 -1. BAL0104 1. + SH010105 COST 294.3 TRAN0101 1. + SH010105 BAL0101 -1. BAL0105 1. + SH010205 COST 562.44 TRAN0102 1. + SH010205 BAL0102 -1. BAL0105 1. + SH010305 COST 309.56 TRAN0103 1. + SH010305 BAL0103 -1. BAL0105 1. + SH010405 COST 310.65 TRAN0104 1. + SH010405 BAL0104 -1. BAL0105 1. + SH010605 COST 355.34 TRAN0106 1. + SH010605 BAL0152 -1. BAL0105 1. + SH010705 COST 364.06 TRAN0107 1. + SH010705 BAL0164 -1. BAL0105 1. + SH010805 COST 295.39 TRAN0108 1. + SH010805 BAL0183 -1. BAL0105 1. + SH010106 COST 216.91 TRAN0101 1. + SH010106 BAL0101 -1. BAL0106 1. + SH010206 COST 454.53 TRAN0102 1. + SH010206 BAL0102 -1. BAL0106 1. + SH010306 COST 232.17 TRAN0103 1. + SH010306 BAL0103 -1. BAL0106 1. + SH010406 COST 238.71 TRAN0104 1. + SH010406 BAL0104 -1. BAL0106 1. + SH010506 COST 274.68 TRAN0105 1. + SH010506 BAL0105 -1. BAL0106 1. + SH010606 COST 224.54 TRAN0106 1. + SH010606 BAL0152 -1. BAL0106 1. + SH010706 COST 218. TRAN0107 1. + SH010706 BAL0164 -1. BAL0106 1. + SH010806 COST 164.59 TRAN0108 1. + SH010806 BAL0183 -1. BAL0106 1. + SH010107 COST 22.89 TRAN0101 1. + SH010107 BAL0101 -1. BAL0107 1. + SH010207 COST 318.28 TRAN0102 1. + SH010207 BAL0102 -1. BAL0107 1. + SH010307 COST 135.16 TRAN0103 1. + SH010307 BAL0103 -1. BAL0107 1. + SH010407 COST 225.63 TRAN0104 1. + SH010407 BAL0104 -1. BAL0107 1. + SH010507 COST 249.61 TRAN0105 1. + SH010507 BAL0105 -1. BAL0107 1. + SH010607 COST 136.25 TRAN0106 1. + SH010607 BAL0152 -1. BAL0107 1. + SH010707 COST 252.88 TRAN0107 1. + SH010707 BAL0164 -1. BAL0107 1. + SH010807 COST 168.95 TRAN0108 1. + SH010807 BAL0183 -1. BAL0107 1. + SH010108 COST 71.94 TRAN0101 1. + SH010108 BAL0101 -1. BAL0108 1. + SH010208 COST 409.84 TRAN0102 1. + SH010208 BAL0102 -1. BAL0108 1. + SH010308 COST 153.69 TRAN0103 1. + SH010308 BAL0103 -1. BAL0108 1. + SH010408 COST 269.23 TRAN0104 1. + SH010408 BAL0104 -1. BAL0108 1. + SH010508 COST 198.38 TRAN0105 1. + SH010508 BAL0105 -1. BAL0108 1. + SH010608 COST 180.94 TRAN0106 1. + SH010608 BAL0152 -1. BAL0108 1. + SH010808 COST 203.83 TRAN0108 1. + SH010808 BAL0183 -1. BAL0108 1. + SH010109 COST 150.42 TRAN0101 1. + SH010109 BAL0101 -1. BAL0109 1. + SH010209 COST 417.47 TRAN0102 1. + SH010209 BAL0102 -1. BAL0109 1. + SH010309 COST 183.12 TRAN0103 1. + SH010309 BAL0103 -1. BAL0109 1. + SH010409 COST 275.77 TRAN0104 1. + SH010409 BAL0104 -1. BAL0109 1. + SH010509 COST 260.51 TRAN0105 1. + SH010509 BAL0105 -1. BAL0109 1. + SH010709 COST 213.64 TRAN0107 1. + SH010709 BAL0164 -1. BAL0109 1. + SH010809 COST 211.46 TRAN0108 1. + SH010809 BAL0183 -1. BAL0109 1. + SH010110 COST 269.23 TRAN0101 1. + SH010110 BAL0101 -1. BAL0110 1. + SH010210 COST 172.22 TRAN0102 1. + SH010210 BAL0102 -1. BAL0110 1. + SH010310 COST 261.6 TRAN0103 1. + SH010310 BAL0103 -1. BAL0110 1. + SH010410 COST 391.31 TRAN0104 1. + SH010410 BAL0104 -1. BAL0110 1. + SH010510 COST 419.65 TRAN0105 1. + SH010510 BAL0105 -1. BAL0110 1. + SH010610 COST 245.25 TRAN0106 1. + SH010610 BAL0152 -1. BAL0110 1. + SH010810 COST 332.45 TRAN0108 1. + SH010810 BAL0183 -1. BAL0110 1. + SH010111 COST 115.54 TRAN0101 1. + SH010111 BAL0101 -1. BAL0111 1. + SH010211 COST 539.55 TRAN0102 1. + SH010211 BAL0102 -1. BAL0111 1. + SH010311 COST 270.32 TRAN0103 1. + SH010311 BAL0103 -1. BAL0111 1. + SH010411 COST 151.51 TRAN0104 1. + SH010411 BAL0104 -1. BAL0111 1. + SH010511 COST 371.69 TRAN0105 1. + SH010511 BAL0105 -1. BAL0111 1. + SH010611 COST 213.64 TRAN0106 1. + SH010611 BAL0152 -1. BAL0111 1. + SH010811 COST 111.18 TRAN0108 1. + SH010811 BAL0183 -1. BAL0111 1. + SH010112 COST 95.92 TRAN0101 1. + SH010112 BAL0101 -1. BAL0112 1. + SH010212 COST 369.51 TRAN0102 1. + SH010212 BAL0102 -1. BAL0112 1. + SH010312 COST 159.14 TRAN0103 1. + SH010312 BAL0103 -1. BAL0112 1. + SH010412 COST 218. TRAN0104 1. + SH010412 BAL0104 -1. BAL0112 1. + SH010512 COST 291.03 TRAN0105 1. + SH010512 BAL0105 -1. BAL0112 1. + SH010612 COST 158.05 TRAN0106 1. + SH010612 BAL0152 -1. BAL0112 1. + SH010812 COST 159.14 TRAN0108 1. + SH010812 BAL0183 -1. BAL0112 1. + SH010114 COST 154.78 TRAN0101 1. + SH010114 BAL0101 -1. BAL0114 1. + SH010214 COST 449.08 TRAN0102 1. + SH010214 BAL0102 -1. BAL0114 1. + SH010314 COST 213.64 TRAN0103 1. + SH010314 BAL0103 -1. BAL0114 1. + SH010414 COST 216.91 TRAN0104 1. + SH010414 BAL0104 -1. BAL0114 1. + SH010514 COST 383.68 TRAN0105 1. + SH010514 BAL0105 -1. BAL0114 1. + SH010614 COST 204.92 TRAN0106 1. + SH010614 BAL0152 -1. BAL0114 1. + SH010814 COST 137.34 TRAN0108 1. + SH010814 BAL0183 -1. BAL0114 1. + SH010115 COST 330.27 TRAN0101 1. + SH010115 BAL0101 -1. BAL0115 1. + SH010215 COST 173.31 TRAN0102 1. + SH010215 BAL0102 -1. BAL0115 1. + SH010315 COST 255.06 TRAN0103 1. + SH010315 BAL0103 -1. BAL0115 1. + SH010415 COST 518.84 TRAN0104 1. + SH010415 BAL0104 -1. BAL0115 1. + SH010515 COST 433.82 TRAN0105 1. + SH010515 BAL0105 -1. BAL0115 1. + SH010615 COST 204.92 TRAN0106 1. + SH010615 BAL0152 -1. BAL0115 1. + SH010815 COST 406.57 TRAN0108 1. + SH010815 BAL0183 -1. BAL0115 1. + SH010116 COST 172.22 TRAN0101 1. + SH010116 BAL0101 -1. BAL0116 1. + SH010216 COST 305.2 TRAN0102 1. + SH010216 BAL0102 -1. BAL0116 1. + SH010316 COST 247.43 TRAN0103 1. + SH010316 BAL0103 -1. BAL0116 1. + SH010416 COST 312.83 TRAN0104 1. + SH010416 BAL0104 -1. BAL0116 1. + SH010516 COST 347.71 TRAN0105 1. + SH010516 BAL0105 -1. BAL0116 1. + SH010616 COST 142.79 TRAN0106 1. + SH010616 BAL0152 -1. BAL0116 1. + SH010816 COST 223.45 TRAN0108 1. + SH010816 BAL0183 -1. BAL0116 1. + SH010117 COST 164.59 TRAN0101 1. + SH010117 BAL0101 -1. BAL0117 1. + SH010217 COST 550.45 TRAN0102 1. + SH010217 BAL0102 -1. BAL0117 1. + SH010317 COST 298.66 TRAN0103 1. + SH010317 BAL0103 -1. BAL0117 1. + SH010417 COST 62.13 TRAN0104 1. + SH010417 BAL0104 -1. BAL0117 1. + SH010517 COST 324.82 TRAN0105 1. + SH010517 BAL0105 -1. BAL0117 1. + SH010717 COST 321.55 TRAN0107 1. + SH010717 BAL0164 -1. BAL0117 1. + SH010817 COST 29.43 TRAN0108 1. + SH010817 BAL0183 -1. BAL0117 1. + SH010118 COST 190.75 TRAN0101 1. + SH010118 BAL0101 -1. BAL0118 1. + SH010218 COST 393.49 TRAN0102 1. + SH010218 BAL0102 -1. BAL0118 1. + SH010318 COST 294.3 TRAN0103 1. + SH010318 BAL0103 -1. BAL0118 1. + SH010418 COST 167.86 TRAN0104 1. + SH010418 BAL0104 -1. BAL0118 1. + SH010518 COST 443.63 TRAN0105 1. + SH010518 BAL0105 -1. BAL0118 1. + SH010618 COST 383.68 TRAN0106 1. + SH010618 BAL0152 -1. BAL0118 1. + SH010818 COST 112.27 TRAN0108 1. + SH010818 BAL0183 -1. BAL0118 1. + SH010119 COST 270.32 TRAN0101 1. + SH010119 BAL0101 -1. BAL0119 1. + SH010219 COST 748.83 TRAN0102 1. + SH010219 BAL0102 -1. BAL0119 1. + SH010319 COST 345.53 TRAN0103 1. + SH010319 BAL0103 -1. BAL0119 1. + SH010419 COST 173.31 TRAN0104 1. + SH010419 BAL0104 -1. BAL0119 1. + SH010519 COST 226.72 TRAN0105 1. + SH010519 BAL0105 -1. BAL0119 1. + SH010619 COST 376.05 TRAN0106 1. + SH010619 BAL0152 -1. BAL0119 1. + SH010819 COST 107.91 TRAN0108 1. + SH010819 BAL0183 -1. BAL0119 1. + SH010120 COST 223.45 TRAN0101 1. + SH010120 BAL0101 -1. BAL0120 1. + SH010220 COST 744.47 TRAN0102 1. + SH010220 BAL0102 -1. BAL0120 1. + SH010320 COST 323.73 TRAN0103 1. + SH010320 BAL0103 -1. BAL0120 1. + SH010420 COST 123.17 TRAN0104 1. + SH010420 BAL0104 -1. BAL0120 1. + SH010520 COST 317.19 TRAN0105 1. + SH010520 BAL0105 -1. BAL0120 1. + SH010820 COST 137.34 TRAN0108 1. + SH010820 BAL0183 -1. BAL0120 1. + SH010121 COST 439.27 TRAN0101 1. + SH010121 BAL0101 -1. BAL0121 1. + SH010221 COST 401.12 TRAN0102 1. + SH010221 BAL0102 -1. BAL0121 1. + SH010321 COST 486.14 TRAN0103 1. + SH010321 BAL0103 -1. BAL0121 1. + SH010421 COST 348.8 TRAN0104 1. + SH010421 BAL0104 -1. BAL0121 1. + SH010521 COST 599.5 TRAN0105 1. + SH010521 BAL0105 -1. BAL0121 1. + SH010821 COST 348.8 TRAN0108 1. + SH010821 BAL0183 -1. BAL0121 1. + SH010122 COST 270.32 TRAN0101 1. + SH010122 BAL0101 -1. BAL0122 1. + SH010222 COST 630.02 TRAN0102 1. + SH010222 BAL0102 -1. BAL0122 1. + SH010322 COST 325.91 TRAN0103 1. + SH010322 BAL0103 -1. BAL0122 1. + SH010422 COST 244.16 TRAN0104 1. + SH010422 BAL0104 -1. BAL0122 1. + SH010522 COST 195.11 TRAN0105 1. + SH010522 BAL0105 -1. BAL0122 1. + SH010622 COST 337.9 TRAN0106 1. + SH010622 BAL0152 -1. BAL0122 1. + SH010822 COST 151.51 TRAN0108 1. + SH010822 BAL0183 -1. BAL0122 1. + SH010123 COST 255.06 TRAN0101 1. + SH010123 BAL0101 -1. BAL0123 1. + SH010223 COST 589.69 TRAN0102 1. + SH010223 BAL0102 -1. BAL0123 1. + SH010323 COST 312.83 TRAN0103 1. + SH010323 BAL0103 -1. BAL0123 1. + SH010423 COST 182.03 TRAN0104 1. + SH010423 BAL0104 -1. BAL0123 1. + SH010523 COST 180.94 TRAN0105 1. + SH010523 BAL0105 -1. BAL0123 1. + SH010823 COST 151.51 TRAN0108 1. + SH010823 BAL0183 -1. BAL0123 1. + SH010124 COST 1565.24 TRAN0101 1. + SH010124 BAL0101 -1. BAL0124 1. + SH010125 COST 421.83 TRAN0101 1. + SH010125 BAL0101 -1. BAL0125 1. + SH010225 COST 465.43 TRAN0102 1. + SH010225 BAL0102 -1. BAL0125 1. + SH010325 COST 556.99 TRAN0103 1. + SH010325 BAL0103 -1. BAL0125 1. + SH010425 COST 379.32 TRAN0104 1. + SH010425 BAL0104 -1. BAL0125 1. + SH010525 COST 616.94 TRAN0105 1. + SH010525 BAL0105 -1. BAL0125 1. + SH010625 COST 439.27 TRAN0106 1. + SH010625 BAL0152 -1. BAL0125 1. + SH010825 COST 332.45 TRAN0108 1. + SH010825 BAL0183 -1. BAL0125 1. + SH010426 COST 294.3 TRAN0104 1. + SH010426 BAL0104 -1. BAL0126 1. + SH010127 COST 255.06 TRAN0101 1. + SH010127 BAL0101 -1. BAL0127 1. + SH010227 COST 309.56 TRAN0102 1. + SH010227 BAL0102 -1. BAL0127 1. + SH010327 COST 315.01 TRAN0103 1. + SH010327 BAL0103 -1. BAL0127 1. + SH010427 COST 365.15 TRAN0104 1. + SH010427 BAL0104 -1. BAL0127 1. + SH010527 COST 412.02 TRAN0105 1. + SH010527 BAL0105 -1. BAL0127 1. + SH010627 COST 292.12 TRAN0106 1. + SH010627 BAL0152 -1. BAL0127 1. + SH010827 COST 274.68 TRAN0108 1. + SH010827 BAL0183 -1. BAL0127 1. + SH010128 COST 264.87 TRAN0101 1. + SH010128 BAL0101 -1. BAL0128 1. + SH010228 COST 620.21 TRAN0102 1. + SH010228 BAL0102 -1. BAL0128 1. + SH010328 COST 322.64 TRAN0103 1. + SH010328 BAL0103 -1. BAL0128 1. + SH010428 COST 321.55 TRAN0104 1. + SH010428 BAL0104 -1. BAL0128 1. + SH010528 COST 111.18 TRAN0105 1. + SH010528 BAL0105 -1. BAL0128 1. + SH010628 COST 284.49 TRAN0106 1. + SH010628 BAL0152 -1. BAL0128 1. + SH010728 COST 116.63 TRAN0107 1. + SH010728 BAL0164 -1. BAL0128 1. + SH010828 COST 276.86 TRAN0108 1. + SH010828 BAL0183 -1. BAL0128 1. + SH010129 COST 243.07 TRAN0101 1. + SH010129 BAL0101 -1. BAL0129 1. + SH010229 COST 505.76 TRAN0102 1. + SH010229 BAL0102 -1. BAL0129 1. + SH010329 COST 262.69 TRAN0103 1. + SH010329 BAL0103 -1. BAL0129 1. + SH010429 COST 216.91 TRAN0104 1. + SH010429 BAL0104 -1. BAL0129 1. + SH010529 COST 468.7 TRAN0105 1. + SH010529 BAL0105 -1. BAL0129 1. + SH010629 COST 284.49 TRAN0106 1. + SH010629 BAL0152 -1. BAL0129 1. + SH010829 COST 156.96 TRAN0108 1. + SH010829 BAL0183 -1. BAL0129 1. + SH010130 COST 507.94 TRAN0101 1. + SH010130 BAL0101 -1. BAL0130 1. + SH010230 COST 475.24 TRAN0102 1. + SH010230 BAL0102 -1. BAL0130 1. + SH010330 COST 570.07 TRAN0103 1. + SH010330 BAL0103 -1. BAL0130 1. + SH010430 COST 331.36 TRAN0104 1. + SH010430 BAL0104 -1. BAL0130 1. + SH010530 COST 486.14 TRAN0105 1. + SH010530 BAL0105 -1. BAL0130 1. + SH010830 COST 416.38 TRAN0108 1. + SH010830 BAL0183 -1. BAL0130 1. + SH010131 COST 120.99 TRAN0101 1. + SH010131 BAL0101 -1. BAL0131 1. + SH010231 COST 382.59 TRAN0102 1. + SH010231 BAL0102 -1. BAL0131 1. + SH010331 COST 119.9 TRAN0103 1. + SH010331 BAL0103 -1. BAL0131 1. + SH010431 COST 275.77 TRAN0104 1. + SH010431 BAL0104 -1. BAL0131 1. + SH010531 COST 334.63 TRAN0105 1. + SH010531 BAL0105 -1. BAL0131 1. + SH010631 COST 122.08 TRAN0106 1. + SH010631 BAL0152 -1. BAL0131 1. + SH010831 COST 243.07 TRAN0108 1. + SH010831 BAL0183 -1. BAL0131 1. + SH010132 COST 325.91 TRAN0101 1. + SH010132 BAL0101 -1. BAL0132 1. + SH010232 COST 521.02 TRAN0102 1. + SH010232 BAL0102 -1. BAL0132 1. + SH010332 COST 461.07 TRAN0103 1. + SH010332 BAL0103 -1. BAL0132 1. + SH010432 COST 171.13 TRAN0104 1. + SH010432 BAL0104 -1. BAL0132 1. + SH010532 COST 427.28 TRAN0105 1. + SH010532 BAL0105 -1. BAL0132 1. + SH010832 COST 196.2 TRAN0108 1. + SH010832 BAL0183 -1. BAL0132 1. + SH010133 COST 537.37 TRAN0101 1. + SH010133 BAL0101 -1. BAL0133 1. + SH010233 COST 436. TRAN0102 1. + SH010233 BAL0102 -1. BAL0133 1. + SH010333 COST 591.87 TRAN0103 1. + SH010333 BAL0103 -1. BAL0133 1. + SH010433 COST 485.05 TRAN0104 1. + SH010433 BAL0104 -1. BAL0133 1. + SH010533 COST 687.79 TRAN0105 1. + SH010533 BAL0105 -1. BAL0133 1. + SH010833 COST 415.29 TRAN0108 1. + SH010833 BAL0183 -1. BAL0133 1. + SH010134 COST 420.74 TRAN0101 1. + SH010134 BAL0101 -1. BAL0134 1. + SH010234 COST 713.95 TRAN0102 1. + SH010234 BAL0102 -1. BAL0134 1. + SH010334 COST 548.27 TRAN0103 1. + SH010334 BAL0103 -1. BAL0134 1. + SH010434 COST 229.99 TRAN0104 1. + SH010434 BAL0104 -1. BAL0134 1. + SH010534 COST 480.69 TRAN0105 1. + SH010534 BAL0105 -1. BAL0134 1. + SH010834 COST 286.67 TRAN0108 1. + SH010834 BAL0183 -1. BAL0134 1. + SH010135 COST 502.49 TRAN0101 1. + SH010135 BAL0101 -1. BAL0135 1. + SH010235 COST 485.05 TRAN0102 1. + SH010235 BAL0102 -1. BAL0135 1. + SH010335 COST 410.93 TRAN0103 1. + SH010335 BAL0103 -1. BAL0135 1. + SH010435 COST 132.98 TRAN0104 1. + SH010435 BAL0104 -1. BAL0135 1. + SH010535 COST 469.79 TRAN0105 1. + SH010535 BAL0105 -1. BAL0135 1. + SH010835 COST 256.15 TRAN0108 1. + SH010835 BAL0183 -1. BAL0135 1. + SH010136 COST 223.45 TRAN0101 1. + SH010136 BAL0101 -1. BAL0136 1. + SH010236 COST 488.32 TRAN0102 1. + SH010236 BAL0102 -1. BAL0136 1. + SH010336 COST 115.54 TRAN0103 1. + SH010336 BAL0103 -1. BAL0136 1. + SH010436 COST 403.3 TRAN0104 1. + SH010436 BAL0104 -1. BAL0136 1. + SH010536 COST 377.14 TRAN0105 1. + SH010536 BAL0105 -1. BAL0136 1. + SH010636 COST 119.9 TRAN0106 1. + SH010636 BAL0152 -1. BAL0136 1. + SH010836 COST 349.89 TRAN0108 1. + SH010836 BAL0183 -1. BAL0136 1. + SH010137 COST 100.28 TRAN0101 1. + SH010137 BAL0101 -1. BAL0137 1. + SH010237 COST 372.78 TRAN0102 1. + SH010237 BAL0102 -1. BAL0137 1. + SH010337 COST 172.22 TRAN0103 1. + SH010337 BAL0103 -1. BAL0137 1. + SH010437 COST 331.36 TRAN0104 1. + SH010437 BAL0104 -1. BAL0137 1. + SH010537 COST 198.38 TRAN0105 1. + SH010537 BAL0105 -1. BAL0137 1. + SH010637 COST 211.46 TRAN0106 1. + SH010637 BAL0152 -1. BAL0137 1. + SH010837 COST 274.68 TRAN0108 1. + SH010837 BAL0183 -1. BAL0137 1. + SH010138 COST 148.24 TRAN0101 1. + SH010138 BAL0101 -1. BAL0138 1. + SH010238 COST 265.96 TRAN0102 1. + SH010238 BAL0102 -1. BAL0138 1. + SH010338 COST 103.55 TRAN0103 1. + SH010338 BAL0103 -1. BAL0138 1. + SH010438 COST 335.72 TRAN0104 1. + SH010438 BAL0104 -1. BAL0138 1. + SH010538 COST 303.02 TRAN0105 1. + SH010538 BAL0105 -1. BAL0138 1. + SH010638 COST 42.51 TRAN0106 1. + SH010638 BAL0152 -1. BAL0138 1. + SH010738 COST 235.44 TRAN0107 1. + SH010738 BAL0164 -1. BAL0138 1. + SH010838 COST 258.33 TRAN0108 1. + SH010838 BAL0183 -1. BAL0138 1. + SH010139 COST 141.7 TRAN0101 1. + SH010139 BAL0101 -1. BAL0139 1. + SH010239 COST 369.51 TRAN0102 1. + SH010239 BAL0102 -1. BAL0139 1. + SH010339 COST 174.4 TRAN0103 1. + SH010339 BAL0103 -1. BAL0139 1. + SH010439 COST 271.41 TRAN0104 1. + SH010439 BAL0104 -1. BAL0139 1. + SH010539 COST 467.61 TRAN0105 1. + SH010539 BAL0105 -1. BAL0139 1. + SH010639 COST 222.36 TRAN0106 1. + SH010639 BAL0152 -1. BAL0139 1. + SH010839 COST 183.12 TRAN0108 1. + SH010839 BAL0183 -1. BAL0139 1. + SH010140 COST 179.85 TRAN0101 1. + SH010140 BAL0101 -1. BAL0140 1. + SH010240 COST 412.02 TRAN0102 1. + SH010240 BAL0102 -1. BAL0140 1. + SH010340 COST 112.27 TRAN0103 1. + SH010340 BAL0103 -1. BAL0140 1. + SH010440 COST 323.73 TRAN0104 1. + SH010440 BAL0104 -1. BAL0140 1. + SH010540 COST 240.89 TRAN0105 1. + SH010540 BAL0105 -1. BAL0140 1. + SH010640 COST 142.79 TRAN0106 1. + SH010640 BAL0152 -1. BAL0140 1. + SH010840 COST 298.66 TRAN0108 1. + SH010840 BAL0183 -1. BAL0140 1. + SH010141 COST 213.64 TRAN0101 1. + SH010141 BAL0101 -1. BAL0141 1. + SH010241 COST 327. TRAN0102 1. + SH010241 BAL0102 -1. BAL0141 1. + SH010341 COST 163.5 TRAN0103 1. + SH010341 BAL0103 -1. BAL0141 1. + SH010441 COST 353.16 TRAN0104 1. + SH010441 BAL0104 -1. BAL0141 1. + SH010541 COST 401.12 TRAN0105 1. + SH010541 BAL0105 -1. BAL0141 1. + SH010641 COST 109. TRAN0106 1. + SH010641 BAL0152 -1. BAL0141 1. + SH010841 COST 325.91 TRAN0108 1. + SH010841 BAL0183 -1. BAL0141 1. + SH010142 COST 98.1 TRAN0101 1. + SH010142 BAL0101 -1. BAL0142 1. + SH010242 COST 451.26 TRAN0102 1. + SH010242 BAL0102 -1. BAL0142 1. + SH010342 COST 174.4 TRAN0103 1. + SH010342 BAL0103 -1. BAL0142 1. + SH010442 COST 212.55 TRAN0104 1. + SH010442 BAL0104 -1. BAL0142 1. + SH010542 COST 393.49 TRAN0105 1. + SH010542 BAL0105 -1. BAL0142 1. + SH010642 COST 175.49 TRAN0106 1. + SH010642 BAL0152 -1. BAL0142 1. + SH010842 COST 165.68 TRAN0108 1. + SH010842 BAL0183 -1. BAL0142 1. + SH010143 COST 173.31 TRAN0101 1. + SH010143 BAL0101 -1. BAL0143 1. + SH010243 COST 430.55 TRAN0102 1. + SH010243 BAL0102 -1. BAL0143 1. + SH010343 COST 27.25 TRAN0103 1. + SH010343 BAL0103 -1. BAL0143 1. + SH010443 COST 322.64 TRAN0104 1. + SH010443 BAL0104 -1. BAL0143 1. + SH010543 COST 281.22 TRAN0105 1. + SH010543 BAL0105 -1. BAL0143 1. + SH010643 COST 109. TRAN0106 1. + SH010643 BAL0152 -1. BAL0143 1. + SH010743 COST 262.69 TRAN0107 1. + SH010743 BAL0164 -1. BAL0143 1. + SH010843 COST 295.39 TRAN0108 1. + SH010843 BAL0183 -1. BAL0143 1. + SH010144 COST 173.31 TRAN0101 1. + SH010144 BAL0101 -1. BAL0144 1. + SH010244 COST 413.11 TRAN0102 1. + SH010244 BAL0102 -1. BAL0144 1. + SH010344 COST 139.52 TRAN0103 1. + SH010344 BAL0103 -1. BAL0144 1. + SH010444 COST 340.08 TRAN0104 1. + SH010444 BAL0104 -1. BAL0144 1. + SH010544 COST 337.9 TRAN0105 1. + SH010544 BAL0105 -1. BAL0144 1. + SH010644 COST 97.01 TRAN0106 1. + SH010644 BAL0152 -1. BAL0144 1. + SH010844 COST 324.82 TRAN0108 1. + SH010844 BAL0183 -1. BAL0144 1. + SH010145 COST 187.48 TRAN0101 1. + SH010145 BAL0101 -1. BAL0145 1. + SH010245 COST 475.24 TRAN0102 1. + SH010245 BAL0102 -1. BAL0145 1. + SH010345 COST 175.49 TRAN0103 1. + SH010345 BAL0103 -1. BAL0145 1. + SH010445 COST 318.28 TRAN0104 1. + SH010445 BAL0104 -1. BAL0145 1. + SH010545 COST 255.06 TRAN0105 1. + SH010545 BAL0105 -1. BAL0145 1. + SH010645 COST 208.19 TRAN0106 1. + SH010645 BAL0152 -1. BAL0145 1. + SH010745 COST 214.73 TRAN0107 1. + SH010745 BAL0164 -1. BAL0145 1. + SH010845 COST 332.45 TRAN0108 1. + SH010845 BAL0183 -1. BAL0145 1. + SH010146 COST 267.05 TRAN0101 1. + SH010146 BAL0101 -1. BAL0146 1. + SH010246 COST 297.57 TRAN0102 1. + SH010246 BAL0102 -1. BAL0146 1. + SH010346 COST 240.89 TRAN0103 1. + SH010346 BAL0103 -1. BAL0146 1. + SH010446 COST 487.23 TRAN0104 1. + SH010446 BAL0104 -1. BAL0146 1. + SH010546 COST 468.7 TRAN0105 1. + SH010546 BAL0105 -1. BAL0146 1. + SH010646 COST 280.13 TRAN0106 1. + SH010646 BAL0152 -1. BAL0146 1. + SH010846 COST 488.32 TRAN0108 1. + SH010846 BAL0183 -1. BAL0146 1. + SH010147 COST 119.9 TRAN0101 1. + SH010147 BAL0101 -1. BAL0147 1. + SH010247 COST 406.57 TRAN0102 1. + SH010247 BAL0102 -1. BAL0147 1. + SH010347 COST 173.31 TRAN0103 1. + SH010347 BAL0103 -1. BAL0147 1. + SH010447 COST 298.66 TRAN0104 1. + SH010447 BAL0104 -1. BAL0147 1. + SH010547 COST 253.97 TRAN0105 1. + SH010547 BAL0105 -1. BAL0147 1. + SH010647 COST 158.05 TRAN0106 1. + SH010647 BAL0152 -1. BAL0147 1. + SH010847 COST 265.96 TRAN0108 1. + SH010847 BAL0183 -1. BAL0147 1. + SH010148 COST 103.55 TRAN0101 1. + SH010148 BAL0101 -1. BAL0148 1. + SH010248 COST 369.51 TRAN0102 1. + SH010248 BAL0102 -1. BAL0148 1. + SH010348 COST 149.33 TRAN0103 1. + SH010348 BAL0103 -1. BAL0148 1. + SH010448 COST 250.7 TRAN0104 1. + SH010448 BAL0104 -1. BAL0148 1. + SH010548 COST 269.23 TRAN0105 1. + SH010548 BAL0105 -1. BAL0148 1. + SH010648 COST 125.35 TRAN0106 1. + SH010648 BAL0152 -1. BAL0148 1. + SH010848 COST 212.55 TRAN0108 1. + SH010848 BAL0183 -1. BAL0148 1. + SH010149 COST 358.61 TRAN0101 1. + SH010149 BAL0101 -1. BAL0149 1. + SH010249 COST 583.15 TRAN0102 1. + SH010249 BAL0102 -1. BAL0149 1. + SH010349 COST 361.88 TRAN0103 1. + SH010349 BAL0103 -1. BAL0149 1. + SH010449 COST 415.29 TRAN0104 1. + SH010449 BAL0104 -1. BAL0149 1. + SH010549 COST 165.68 TRAN0105 1. + SH010549 BAL0105 -1. BAL0149 1. + SH010649 COST 368.42 TRAN0106 1. + SH010649 BAL0152 -1. BAL0149 1. + SH010749 COST 146.06 TRAN0107 1. + SH010749 BAL0164 -1. BAL0149 1. + SH010849 COST 444.72 TRAN0108 1. + SH010849 BAL0183 -1. BAL0149 1. + SH010150 COST 262.69 TRAN0101 1. + SH010150 BAL0101 -1. BAL0150 1. + SH010250 COST 667.08 TRAN0102 1. + SH010250 BAL0102 -1. BAL0150 1. + SH010350 COST 268.14 TRAN0103 1. + SH010350 BAL0103 -1. BAL0150 1. + SH010450 COST 397.85 TRAN0104 1. + SH010450 BAL0104 -1. BAL0150 1. + SH010550 COST 256.15 TRAN0105 1. + SH010550 BAL0105 -1. BAL0150 1. + SH010750 COST 149.33 TRAN0107 1. + SH010750 BAL0164 -1. BAL0150 1. + SH010850 COST 442.54 TRAN0108 1. + SH010850 BAL0183 -1. BAL0150 1. + SH010151 COST 361.88 TRAN0101 1. + SH010151 BAL0101 -1. BAL0151 1. + SH010251 COST 599.5 TRAN0102 1. + SH010251 BAL0102 -1. BAL0151 1. + SH010351 COST 371.69 TRAN0103 1. + SH010351 BAL0103 -1. BAL0151 1. + SH010451 COST 368.42 TRAN0104 1. + SH010451 BAL0104 -1. BAL0151 1. + SH010551 COST 134.07 TRAN0105 1. + SH010551 BAL0105 -1. BAL0151 1. + SH010751 COST 107.91 TRAN0107 1. + SH010751 BAL0164 -1. BAL0151 1. + SH010851 COST 466.52 TRAN0108 1. + SH010851 BAL0183 -1. BAL0151 1. + SH010152 COST 122.08 TRAN0101 1. + SH010152 BAL0101 -1. BAL0152 1. + SH010252 COST 327. TRAN0102 1. + SH010252 BAL0102 -1. BAL0152 1. + SH010352 COST 89.38 TRAN0103 1. + SH010352 BAL0103 -1. BAL0152 1. + SH010452 COST 350.98 TRAN0104 1. + SH010452 BAL0104 -1. BAL0152 1. + SH010552 COST 321.55 TRAN0105 1. + SH010552 BAL0105 -1. BAL0152 1. + SH010852 COST 275.77 TRAN0108 1. + SH010852 BAL0183 -1. BAL0152 1. + SH010153 COST 391.31 TRAN0101 1. + SH010153 BAL0101 -1. BAL0153 1. + SH010253 COST 693.24 TRAN0102 1. + SH010253 BAL0102 -1. BAL0153 1. + SH010353 COST 354.25 TRAN0103 1. + SH010353 BAL0103 -1. BAL0153 1. + SH010453 COST 449.08 TRAN0104 1. + SH010453 BAL0104 -1. BAL0153 1. + SH010553 COST 200.56 TRAN0105 1. + SH010553 BAL0105 -1. BAL0153 1. + SH010653 COST 391.31 TRAN0106 1. + SH010653 BAL0152 -1. BAL0153 1. + SH010753 COST 159.14 TRAN0107 1. + SH010753 BAL0164 -1. BAL0153 1. + SH010853 COST 439.27 TRAN0108 1. + SH010853 BAL0183 -1. BAL0153 1. + SH010154 COST 201.65 TRAN0101 1. + SH010154 BAL0101 -1. BAL0154 1. + SH010254 COST 485.05 TRAN0102 1. + SH010254 BAL0102 -1. BAL0154 1. + SH010354 COST 236.53 TRAN0103 1. + SH010354 BAL0103 -1. BAL0154 1. + SH010454 COST 373.87 TRAN0104 1. + SH010454 BAL0104 -1. BAL0154 1. + SH010554 COST 232.17 TRAN0105 1. + SH010554 BAL0105 -1. BAL0154 1. + SH010654 COST 221.27 TRAN0106 1. + SH010654 BAL0152 -1. BAL0154 1. + SH010854 COST 438.18 TRAN0108 1. + SH010854 BAL0183 -1. BAL0154 1. + SH010155 COST 303.02 TRAN0101 1. + SH010155 BAL0101 -1. BAL0155 1. + SH010255 COST 522.11 TRAN0102 1. + SH010255 BAL0102 -1. BAL0155 1. + SH010355 COST 306.29 TRAN0103 1. + SH010355 BAL0103 -1. BAL0155 1. + SH010455 COST 320.46 TRAN0104 1. + SH010455 BAL0104 -1. BAL0155 1. + SH010555 COST 167.86 TRAN0105 1. + SH010555 BAL0105 -1. BAL0155 1. + SH010655 COST 316.1 TRAN0106 1. + SH010655 BAL0152 -1. BAL0155 1. + SH010755 COST 116.63 TRAN0107 1. + SH010755 BAL0164 -1. BAL0155 1. + SH010855 COST 320.46 TRAN0108 1. + SH010855 BAL0183 -1. BAL0155 1. + SH010156 COST 425.1 TRAN0101 1. + SH010156 BAL0101 -1. BAL0156 1. + SH010256 COST 631.11 TRAN0102 1. + SH010256 BAL0102 -1. BAL0156 1. + SH010356 COST 332.45 TRAN0103 1. + SH010356 BAL0103 -1. BAL0156 1. + SH010456 COST 397.85 TRAN0104 1. + SH010456 BAL0104 -1. BAL0156 1. + SH010556 COST 148.24 TRAN0105 1. + SH010556 BAL0105 -1. BAL0156 1. + SH010656 COST 369.51 TRAN0106 1. + SH010656 BAL0152 -1. BAL0156 1. + SH010756 COST 132.98 TRAN0107 1. + SH010756 BAL0164 -1. BAL0156 1. + SH010856 COST 389.13 TRAN0108 1. + SH010856 BAL0183 -1. BAL0156 1. + SH010157 COST 284.49 TRAN0101 1. + SH010157 BAL0101 -1. BAL0157 1. + SH010257 COST 566.8 TRAN0102 1. + SH010257 BAL0102 -1. BAL0157 1. + SH010357 COST 316.1 TRAN0103 1. + SH010357 BAL0103 -1. BAL0157 1. + SH010457 COST 255.06 TRAN0104 1. + SH010457 BAL0104 -1. BAL0157 1. + SH010557 COST 183.12 TRAN0105 1. + SH010557 BAL0105 -1. BAL0157 1. + SH010657 COST 347.71 TRAN0106 1. + SH010657 BAL0152 -1. BAL0157 1. + SH010757 COST 161.32 TRAN0107 1. + SH010757 BAL0164 -1. BAL0157 1. + SH010857 COST 251.79 TRAN0108 1. + SH010857 BAL0183 -1. BAL0157 1. + SH010158 COST 320.46 TRAN0101 1. + SH010158 BAL0101 -1. BAL0158 1. + SH010258 COST 567.89 TRAN0102 1. + SH010258 BAL0102 -1. BAL0158 1. + SH010358 COST 303.02 TRAN0103 1. + SH010358 BAL0103 -1. BAL0158 1. + SH010458 COST 373.87 TRAN0104 1. + SH010458 BAL0104 -1. BAL0158 1. + SH010558 COST 22.89 TRAN0105 1. + SH010558 BAL0105 -1. BAL0158 1. + SH010658 COST 355.34 TRAN0106 1. + SH010658 BAL0152 -1. BAL0158 1. + SH010758 COST 74.12 TRAN0107 1. + SH010758 BAL0164 -1. BAL0158 1. + SH010858 COST 276.86 TRAN0108 1. + SH010858 BAL0183 -1. BAL0158 1. + SH010159 COST 224.54 TRAN0101 1. + SH010159 BAL0101 -1. BAL0159 1. + SH010259 COST 542.82 TRAN0102 1. + SH010259 BAL0102 -1. BAL0159 1. + SH010359 COST 259.42 TRAN0103 1. + SH010359 BAL0103 -1. BAL0159 1. + SH010459 COST 265.96 TRAN0104 1. + SH010459 BAL0104 -1. BAL0159 1. + SH010559 COST 173.31 TRAN0105 1. + SH010559 BAL0105 -1. BAL0159 1. + SH010659 COST 323.73 TRAN0106 1. + SH010659 BAL0152 -1. BAL0159 1. + SH010759 COST 114.45 TRAN0107 1. + SH010759 BAL0164 -1. BAL0159 1. + SH010859 COST 277.95 TRAN0108 1. + SH010859 BAL0183 -1. BAL0159 1. + SH010160 COST 284.49 TRAN0101 1. + SH010160 BAL0101 -1. BAL0160 1. + SH010260 COST 599.5 TRAN0102 1. + SH010260 BAL0102 -1. BAL0160 1. + SH010360 COST 308.47 TRAN0103 1. + SH010360 BAL0103 -1. BAL0160 1. + SH010460 COST 340.08 TRAN0104 1. + SH010460 BAL0104 -1. BAL0160 1. + SH010560 COST 147.15 TRAN0105 1. + SH010560 BAL0105 -1. BAL0160 1. + SH010660 COST 352.07 TRAN0106 1. + SH010660 BAL0152 -1. BAL0160 1. + SH010760 COST 95.92 TRAN0107 1. + SH010760 BAL0164 -1. BAL0160 1. + SH010860 COST 325.91 TRAN0108 1. + SH010860 BAL0183 -1. BAL0160 1. + SH010163 COST 289.94 TRAN0101 1. + SH010163 BAL0101 -1. BAL0163 1. + SH010263 COST 538.46 TRAN0102 1. + SH010263 BAL0102 -1. BAL0163 1. + SH010363 COST 312.83 TRAN0103 1. + SH010363 BAL0103 -1. BAL0163 1. + SH010463 COST 402.21 TRAN0104 1. + SH010463 BAL0104 -1. BAL0163 1. + SH010563 COST 165.68 TRAN0105 1. + SH010563 BAL0105 -1. BAL0163 1. + SH010663 COST 343.35 TRAN0106 1. + SH010663 BAL0152 -1. BAL0163 1. + SH010763 COST 135.16 TRAN0107 1. + SH010763 BAL0164 -1. BAL0163 1. + SH010863 COST 436. TRAN0108 1. + SH010863 BAL0183 -1. BAL0163 1. + SH010164 COST 216.91 TRAN0101 1. + SH010164 BAL0101 -1. BAL0164 1. + SH010264 COST 573.34 TRAN0102 1. + SH010264 BAL0102 -1. BAL0164 1. + SH010364 COST 243.07 TRAN0103 1. + SH010364 BAL0103 -1. BAL0164 1. + SH010464 COST 366.24 TRAN0104 1. + SH010464 BAL0104 -1. BAL0164 1. + SH010564 COST 63.22 TRAN0105 1. + SH010564 BAL0105 -1. BAL0164 1. + SH010664 COST 345.53 TRAN0106 1. + SH010664 BAL0152 -1. BAL0164 1. + SH010864 COST 272.5 TRAN0108 1. + SH010864 BAL0183 -1. BAL0164 1. + SH010165 COST 470.88 TRAN0101 1. + SH010165 BAL0101 -1. BAL0165 1. + SH010265 COST 334.63 TRAN0102 1. + SH010265 BAL0102 -1. BAL0165 1. + SH010365 COST 550.45 TRAN0103 1. + SH010365 BAL0103 -1. BAL0165 1. + SH010465 COST 422.92 TRAN0104 1. + SH010465 BAL0104 -1. BAL0165 1. + SH010565 COST 658.36 TRAN0105 1. + SH010565 BAL0105 -1. BAL0165 1. + SH010865 COST 452.35 TRAN0108 1. + SH010865 BAL0183 -1. BAL0165 1. + SH010166 COST 610.4 TRAN0101 1. + SH010166 BAL0101 -1. BAL0166 1. + SH010266 COST 282.31 TRAN0102 1. + SH010266 BAL0102 -1. BAL0166 1. + SH010366 COST 630.02 TRAN0103 1. + SH010366 BAL0103 -1. BAL0166 1. + SH010466 COST 606.04 TRAN0104 1. + SH010466 BAL0104 -1. BAL0166 1. + SH010566 COST 773.9 TRAN0105 1. + SH010566 BAL0105 -1. BAL0166 1. + SH010866 COST 610.4 TRAN0108 1. + SH010866 BAL0183 -1. BAL0166 1. + SH010167 COST 463.25 TRAN0101 1. + SH010167 BAL0101 -1. BAL0167 1. + SH010267 COST 252.88 TRAN0102 1. + SH010267 BAL0102 -1. BAL0167 1. + SH010367 COST 537.37 TRAN0103 1. + SH010367 BAL0103 -1. BAL0167 1. + SH010467 COST 498.13 TRAN0104 1. + SH010467 BAL0104 -1. BAL0167 1. + SH010567 COST 658.36 TRAN0105 1. + SH010567 BAL0105 -1. BAL0167 1. + SH010867 COST 499.22 TRAN0108 1. + SH010867 BAL0183 -1. BAL0167 1. + SH010168 COST 647.46 TRAN0101 1. + SH010168 BAL0101 -1. BAL0168 1. + SH010268 COST 436. TRAN0102 1. + SH010268 BAL0102 -1. BAL0168 1. + SH010368 COST 610.4 TRAN0103 1. + SH010368 BAL0103 -1. BAL0168 1. + SH010468 COST 765.18 TRAN0104 1. + SH010468 BAL0104 -1. BAL0168 1. + SH010568 COST 1031.14 TRAN0105 1. + SH010568 BAL0105 -1. BAL0168 1. + SH010868 COST 818.59 TRAN0108 1. + SH010868 BAL0183 -1. BAL0168 1. + SH010169 COST 587.51 TRAN0101 1. + SH010169 BAL0101 -1. BAL0169 1. + SH010269 COST 240.89 TRAN0102 1. + SH010269 BAL0102 -1. BAL0169 1. + SH010369 COST 555.9 TRAN0103 1. + SH010369 BAL0103 -1. BAL0169 1. + SH010469 COST 677.98 TRAN0104 1. + SH010469 BAL0104 -1. BAL0169 1. + SH010569 COST 704.14 TRAN0105 1. + SH010569 BAL0105 -1. BAL0169 1. + SH010869 COST 717.22 TRAN0108 1. + SH010869 BAL0183 -1. BAL0169 1. + SH010171 COST 479.6 TRAN0101 1. + SH010171 BAL0101 -1. BAL0171 1. + SH010371 COST 571.16 TRAN0103 1. + SH010371 BAL0103 -1. BAL0171 1. + SH010471 COST 567.89 TRAN0104 1. + SH010471 BAL0104 -1. BAL0171 1. + SH010571 COST 633.29 TRAN0105 1. + SH010571 BAL0105 -1. BAL0171 1. + SH010671 COST 426.19 TRAN0106 1. + SH010671 BAL0152 -1. BAL0171 1. + SH010771 COST 767.36 TRAN0107 1. + SH010771 BAL0164 -1. BAL0171 1. + SH010871 COST 580.97 TRAN0108 1. + SH010871 BAL0183 -1. BAL0171 1. + SH010172 COST 639.83 TRAN0101 1. + SH010172 BAL0101 -1. BAL0172 1. + SH010272 COST 591.87 TRAN0102 1. + SH010272 BAL0102 -1. BAL0172 1. + SH010372 COST 672.53 TRAN0103 1. + SH010372 BAL0103 -1. BAL0172 1. + SH010472 COST 621.3 TRAN0104 1. + SH010472 BAL0104 -1. BAL0172 1. + SH010572 COST 831.67 TRAN0105 1. + SH010572 BAL0105 -1. BAL0172 1. + SH010872 COST 621.3 TRAN0108 1. + SH010872 BAL0183 -1. BAL0172 1. + SH010173 COST 425.1 TRAN0101 1. + SH010173 BAL0101 -1. BAL0173 1. + SH010273 COST 397.85 TRAN0102 1. + SH010273 BAL0102 -1. BAL0173 1. + SH010373 COST 368.42 TRAN0103 1. + SH010373 BAL0103 -1. BAL0173 1. + SH010473 COST 498.13 TRAN0104 1. + SH010473 BAL0104 -1. BAL0173 1. + SH010573 COST 614.76 TRAN0105 1. + SH010573 BAL0105 -1. BAL0173 1. + SH010673 COST 332.45 TRAN0106 1. + SH010673 BAL0152 -1. BAL0173 1. + SH010873 COST 549.36 TRAN0108 1. + SH010873 BAL0183 -1. BAL0173 1. + SH010174 COST 597.32 TRAN0101 1. + SH010174 BAL0101 -1. BAL0174 1. + SH010274 COST 228.9 TRAN0102 1. + SH010274 BAL0102 -1. BAL0174 1. + SH010374 COST 621.3 TRAN0103 1. + SH010374 BAL0103 -1. BAL0174 1. + SH010474 COST 694.33 TRAN0104 1. + SH010474 BAL0104 -1. BAL0174 1. + SH010574 COST 798.97 TRAN0105 1. + SH010574 BAL0105 -1. BAL0174 1. + SH010874 COST 674.71 TRAN0108 1. + SH010874 BAL0183 -1. BAL0174 1. + SH010275 COST 603.86 TRAN0102 1. + SH010275 BAL0102 -1. BAL0175 1. + SH010176 COST 503.58 TRAN0101 1. + SH010176 BAL0101 -1. BAL0176 1. + SH010276 COST 437.09 TRAN0102 1. + SH010276 BAL0102 -1. BAL0176 1. + SH010376 COST 439.27 TRAN0103 1. + SH010376 BAL0103 -1. BAL0176 1. + SH010476 COST 686.7 TRAN0104 1. + SH010476 BAL0104 -1. BAL0176 1. + SH010576 COST 686.7 TRAN0105 1. + SH010576 BAL0105 -1. BAL0176 1. + SH010676 COST 415.29 TRAN0106 1. + SH010676 BAL0152 -1. BAL0176 1. + SH010876 COST 846.93 TRAN0108 1. + SH010876 BAL0183 -1. BAL0176 1. + SH010177 COST 474.15 TRAN0101 1. + SH010177 BAL0101 -1. BAL0177 1. + SH010277 COST 296.48 TRAN0102 1. + SH010277 BAL0102 -1. BAL0177 1. + SH010377 COST 502.49 TRAN0103 1. + SH010377 BAL0103 -1. BAL0177 1. + SH010477 COST 437.09 TRAN0104 1. + SH010477 BAL0104 -1. BAL0177 1. + SH010577 COST 610.4 TRAN0105 1. + SH010577 BAL0105 -1. BAL0177 1. + SH010877 COST 348.8 TRAN0108 1. + SH010877 BAL0183 -1. BAL0177 1. + SH010178 COST 829.49 TRAN0101 1. + SH010178 BAL0101 -1. BAL0178 1. + SH010278 COST 481.78 TRAN0102 1. + SH010278 BAL0102 -1. BAL0178 1. + SH010378 COST 853.47 TRAN0103 1. + SH010378 BAL0103 -1. BAL0178 1. + SH010478 COST 746.65 TRAN0104 1. + SH010478 BAL0104 -1. BAL0178 1. + SH010578 COST 958.11 TRAN0105 1. + SH010578 BAL0105 -1. BAL0178 1. + SH010878 COST 834.94 TRAN0108 1. + SH010878 BAL0183 -1. BAL0178 1. + SH010179 COST 779.35 TRAN0101 1. + SH010179 BAL0101 -1. BAL0179 1. + SH010279 COST 293.21 TRAN0102 1. + SH010279 BAL0102 -1. BAL0179 1. + SH010379 COST 753.19 TRAN0103 1. + SH010379 BAL0103 -1. BAL0179 1. + SH010479 COST 784.8 TRAN0104 1. + SH010479 BAL0104 -1. BAL0179 1. + SH010879 COST 769.54 TRAN0108 1. + SH010879 BAL0183 -1. BAL0179 1. + SH010180 COST 345.53 TRAN0101 1. + SH010180 BAL0101 -1. BAL0180 1. + SH010280 COST 430.55 TRAN0102 1. + SH010280 BAL0102 -1. BAL0180 1. + SH010380 COST 476.33 TRAN0103 1. + SH010380 BAL0103 -1. BAL0180 1. + SH010480 COST 407.66 TRAN0104 1. + SH010480 BAL0104 -1. BAL0180 1. + SH010580 COST 550.45 TRAN0105 1. + SH010580 BAL0105 -1. BAL0180 1. + SH010880 COST 261.6 TRAN0108 1. + SH010880 BAL0183 -1. BAL0180 1. + SH010182 COST 634.38 TRAN0101 1. + SH010182 BAL0101 -1. BAL0182 1. + SH010282 COST 358.61 TRAN0102 1. + SH010282 BAL0102 -1. BAL0182 1. + SH010382 COST 713.95 TRAN0103 1. + SH010382 BAL0103 -1. BAL0182 1. + SH010482 COST 769.54 TRAN0104 1. + SH010482 BAL0104 -1. BAL0182 1. + SH010582 COST 1250.23 TRAN0105 1. + SH010582 BAL0105 -1. BAL0182 1. + SH010882 COST 853.47 TRAN0108 1. + SH010882 BAL0183 -1. BAL0182 1. + SH010183 COST 192.93 TRAN0101 1. + SH010183 BAL0101 -1. BAL0183 1. + SH010283 COST 566.8 TRAN0102 1. + SH010283 BAL0102 -1. BAL0183 1. + SH010383 COST 296.48 TRAN0103 1. + SH010383 BAL0103 -1. BAL0183 1. + SH010483 COST 64.31 TRAN0104 1. + SH010483 BAL0104 -1. BAL0183 1. + SH010583 COST 378.23 TRAN0105 1. + SH010583 BAL0105 -1. BAL0183 1. + SH010683 COST 270.32 TRAN0106 1. + SH010683 BAL0152 -1. BAL0183 1. + SH010184 COST 331.36 TRAN0101 1. + SH010184 BAL0101 -1. BAL0184 1. + SH010284 COST 209.28 TRAN0102 1. + SH010284 BAL0102 -1. BAL0184 1. + SH010384 COST 396.76 TRAN0103 1. + SH010384 BAL0103 -1. BAL0184 1. + SH010484 COST 403.3 TRAN0104 1. + SH010484 BAL0104 -1. BAL0184 1. + SH010584 COST 534.1 TRAN0105 1. + SH010584 BAL0105 -1. BAL0184 1. + SH010684 COST 332.45 TRAN0106 1. + SH010684 BAL0152 -1. BAL0184 1. + SH010884 COST 422.92 TRAN0108 1. + SH010884 BAL0183 -1. BAL0184 1. + SH020201 COST 368.28 TRAN0202 1. + SH020201 BAL0202 -1. BAL0201 1. + SH020301 COST 141.36 TRAN0203 1. + SH020301 BAL0203 -1. BAL0201 1. + SH020401 COST 257.92 TRAN0204 1. + SH020401 BAL0204 -1. BAL0201 1. + SH020501 COST 293.88 TRAN0205 1. + SH020501 BAL0205 -1. BAL0201 1. + SH020601 COST 156.24 TRAN0206 1. + SH020601 BAL0252 -1. BAL0201 1. + SH020801 COST 177.32 TRAN0208 1. + SH020801 BAL0283 -1. BAL0201 1. + SH020102 COST 587.76 TRAN0201 1. + SH020102 BAL0201 -1. BAL0202 1. + SH020302 COST 517.08 TRAN0203 1. + SH020302 BAL0203 -1. BAL0202 1. + SH020402 COST 758.88 TRAN0204 1. + SH020402 BAL0204 -1. BAL0202 1. + SH020502 COST 918.84 TRAN0205 1. + SH020502 BAL0205 -1. BAL0202 1. + SH020602 COST 468.72 TRAN0206 1. + SH020602 BAL0252 -1. BAL0202 1. + SH020802 COST 646.04 TRAN0208 1. + SH020802 BAL0283 -1. BAL0202 1. + SH020103 COST 303.8 TRAN0201 1. + SH020103 BAL0201 -1. BAL0203 1. + SH020203 COST 587.76 TRAN0202 1. + SH020203 BAL0202 -1. BAL0203 1. + SH020403 COST 455.08 TRAN0204 1. + SH020403 BAL0204 -1. BAL0203 1. + SH020503 COST 352.16 TRAN0205 1. + SH020503 BAL0205 -1. BAL0203 1. + SH020603 COST 111.6 TRAN0206 1. + SH020603 BAL0252 -1. BAL0203 1. + SH020803 COST 316.2 TRAN0208 1. + SH020803 BAL0283 -1. BAL0203 1. + SH020104 COST 215.76 TRAN0201 1. + SH020104 BAL0201 -1. BAL0204 1. + SH020204 COST 623.72 TRAN0202 1. + SH020204 BAL0202 -1. BAL0204 1. + SH020304 COST 301.32 TRAN0203 1. + SH020304 BAL0203 -1. BAL0204 1. + SH020504 COST 395.56 TRAN0205 1. + SH020504 BAL0205 -1. BAL0204 1. + SH020604 COST 303.8 TRAN0206 1. + SH020604 BAL0252 -1. BAL0204 1. + SH020704 COST 333.56 TRAN0207 1. + SH020704 BAL0264 -1. BAL0204 1. + SH020804 COST 71.92 TRAN0208 1. + SH020804 BAL0283 -1. BAL0204 1. + SH020105 COST 334.8 TRAN0201 1. + SH020105 BAL0201 -1. BAL0205 1. + SH020205 COST 639.84 TRAN0202 1. + SH020205 BAL0202 -1. BAL0205 1. + SH020305 COST 352.16 TRAN0203 1. + SH020305 BAL0203 -1. BAL0205 1. + SH020405 COST 353.4 TRAN0204 1. + SH020405 BAL0204 -1. BAL0205 1. + SH020605 COST 404.24 TRAN0206 1. + SH020605 BAL0252 -1. BAL0205 1. + SH020705 COST 414.16 TRAN0207 1. + SH020705 BAL0264 -1. BAL0205 1. + SH020805 COST 336.04 TRAN0208 1. + SH020805 BAL0283 -1. BAL0205 1. + SH020106 COST 246.76 TRAN0201 1. + SH020106 BAL0201 -1. BAL0206 1. + SH020206 COST 517.08 TRAN0202 1. + SH020206 BAL0202 -1. BAL0206 1. + SH020306 COST 264.12 TRAN0203 1. + SH020306 BAL0203 -1. BAL0206 1. + SH020406 COST 271.56 TRAN0204 1. + SH020406 BAL0204 -1. BAL0206 1. + SH020506 COST 312.48 TRAN0205 1. + SH020506 BAL0205 -1. BAL0206 1. + SH020606 COST 255.44 TRAN0206 1. + SH020606 BAL0252 -1. BAL0206 1. + SH020706 COST 248. TRAN0207 1. + SH020706 BAL0264 -1. BAL0206 1. + SH020806 COST 187.24 TRAN0208 1. + SH020806 BAL0283 -1. BAL0206 1. + SH020107 COST 26.04 TRAN0201 1. + SH020107 BAL0201 -1. BAL0207 1. + SH020207 COST 362.08 TRAN0202 1. + SH020207 BAL0202 -1. BAL0207 1. + SH020307 COST 153.76 TRAN0203 1. + SH020307 BAL0203 -1. BAL0207 1. + SH020407 COST 256.68 TRAN0204 1. + SH020407 BAL0204 -1. BAL0207 1. + SH020507 COST 283.96 TRAN0205 1. + SH020507 BAL0205 -1. BAL0207 1. + SH020607 COST 155. TRAN0206 1. + SH020607 BAL0252 -1. BAL0207 1. + SH020707 COST 287.68 TRAN0207 1. + SH020707 BAL0264 -1. BAL0207 1. + SH020807 COST 192.2 TRAN0208 1. + SH020807 BAL0283 -1. BAL0207 1. + SH020108 COST 81.84 TRAN0201 1. + SH020108 BAL0201 -1. BAL0208 1. + SH020208 COST 466.24 TRAN0202 1. + SH020208 BAL0202 -1. BAL0208 1. + SH020308 COST 174.84 TRAN0203 1. + SH020308 BAL0203 -1. BAL0208 1. + SH020408 COST 306.28 TRAN0204 1. + SH020408 BAL0204 -1. BAL0208 1. + SH020508 COST 225.68 TRAN0205 1. + SH020508 BAL0205 -1. BAL0208 1. + SH020608 COST 205.84 TRAN0206 1. + SH020608 BAL0252 -1. BAL0208 1. + SH020808 COST 231.88 TRAN0208 1. + SH020808 BAL0283 -1. BAL0208 1. + SH020109 COST 171.12 TRAN0201 1. + SH020109 BAL0201 -1. BAL0209 1. + SH020209 COST 474.92 TRAN0202 1. + SH020209 BAL0202 -1. BAL0209 1. + SH020309 COST 208.32 TRAN0203 1. + SH020309 BAL0203 -1. BAL0209 1. + SH020409 COST 313.72 TRAN0204 1. + SH020409 BAL0204 -1. BAL0209 1. + SH020509 COST 296.36 TRAN0205 1. + SH020509 BAL0205 -1. BAL0209 1. + SH020709 COST 243.04 TRAN0207 1. + SH020709 BAL0264 -1. BAL0209 1. + SH020809 COST 240.56 TRAN0208 1. + SH020809 BAL0283 -1. BAL0209 1. + SH020110 COST 306.28 TRAN0201 1. + SH020110 BAL0201 -1. BAL0210 1. + SH020210 COST 195.92 TRAN0202 1. + SH020210 BAL0202 -1. BAL0210 1. + SH020310 COST 297.6 TRAN0203 1. + SH020310 BAL0203 -1. BAL0210 1. + SH020410 COST 445.16 TRAN0204 1. + SH020410 BAL0204 -1. BAL0210 1. + SH020510 COST 477.4 TRAN0205 1. + SH020510 BAL0205 -1. BAL0210 1. + SH020610 COST 279. TRAN0206 1. + SH020610 BAL0252 -1. BAL0210 1. + SH020810 COST 378.2 TRAN0208 1. + SH020810 BAL0283 -1. BAL0210 1. + SH020111 COST 131.44 TRAN0201 1. + SH020111 BAL0201 -1. BAL0211 1. + SH020211 COST 613.8 TRAN0202 1. + SH020211 BAL0202 -1. BAL0211 1. + SH020311 COST 307.52 TRAN0203 1. + SH020311 BAL0203 -1. BAL0211 1. + SH020411 COST 172.36 TRAN0204 1. + SH020411 BAL0204 -1. BAL0211 1. + SH020511 COST 422.84 TRAN0205 1. + SH020511 BAL0205 -1. BAL0211 1. + SH020611 COST 243.04 TRAN0206 1. + SH020611 BAL0252 -1. BAL0211 1. + SH020811 COST 126.48 TRAN0208 1. + SH020811 BAL0283 -1. BAL0211 1. + SH020112 COST 109.12 TRAN0201 1. + SH020112 BAL0201 -1. BAL0212 1. + SH020212 COST 420.36 TRAN0202 1. + SH020212 BAL0202 -1. BAL0212 1. + SH020312 COST 181.04 TRAN0203 1. + SH020312 BAL0203 -1. BAL0212 1. + SH020412 COST 248. TRAN0204 1. + SH020412 BAL0204 -1. BAL0212 1. + SH020512 COST 331.08 TRAN0205 1. + SH020512 BAL0205 -1. BAL0212 1. + SH020612 COST 179.8 TRAN0206 1. + SH020612 BAL0252 -1. BAL0212 1. + SH020812 COST 181.04 TRAN0208 1. + SH020812 BAL0283 -1. BAL0212 1. + SH020114 COST 176.08 TRAN0201 1. + SH020114 BAL0201 -1. BAL0214 1. + SH020214 COST 510.88 TRAN0202 1. + SH020214 BAL0202 -1. BAL0214 1. + SH020314 COST 243.04 TRAN0203 1. + SH020314 BAL0203 -1. BAL0214 1. + SH020414 COST 246.76 TRAN0204 1. + SH020414 BAL0204 -1. BAL0214 1. + SH020514 COST 436.48 TRAN0205 1. + SH020514 BAL0205 -1. BAL0214 1. + SH020614 COST 233.12 TRAN0206 1. + SH020614 BAL0252 -1. BAL0214 1. + SH020814 COST 156.24 TRAN0208 1. + SH020814 BAL0283 -1. BAL0214 1. + SH020115 COST 375.72 TRAN0201 1. + SH020115 BAL0201 -1. BAL0215 1. + SH020215 COST 197.16 TRAN0202 1. + SH020215 BAL0202 -1. BAL0215 1. + SH020315 COST 290.16 TRAN0203 1. + SH020315 BAL0203 -1. BAL0215 1. + SH020415 COST 590.24 TRAN0204 1. + SH020415 BAL0204 -1. BAL0215 1. + SH020515 COST 493.52 TRAN0205 1. + SH020515 BAL0205 -1. BAL0215 1. + SH020615 COST 233.12 TRAN0206 1. + SH020615 BAL0252 -1. BAL0215 1. + SH020815 COST 462.52 TRAN0208 1. + SH020815 BAL0283 -1. BAL0215 1. + SH020116 COST 195.92 TRAN0201 1. + SH020116 BAL0201 -1. BAL0216 1. + SH020216 COST 347.2 TRAN0202 1. + SH020216 BAL0202 -1. BAL0216 1. + SH020316 COST 281.48 TRAN0203 1. + SH020316 BAL0203 -1. BAL0216 1. + SH020416 COST 355.88 TRAN0204 1. + SH020416 BAL0204 -1. BAL0216 1. + SH020516 COST 395.56 TRAN0205 1. + SH020516 BAL0205 -1. BAL0216 1. + SH020616 COST 162.44 TRAN0206 1. + SH020616 BAL0252 -1. BAL0216 1. + SH020816 COST 254.2 TRAN0208 1. + SH020816 BAL0283 -1. BAL0216 1. + SH020117 COST 187.24 TRAN0201 1. + SH020117 BAL0201 -1. BAL0217 1. + SH020217 COST 626.2 TRAN0202 1. + SH020217 BAL0202 -1. BAL0217 1. + SH020317 COST 339.76 TRAN0203 1. + SH020317 BAL0203 -1. BAL0217 1. + SH020417 COST 70.68 TRAN0204 1. + SH020417 BAL0204 -1. BAL0217 1. + SH020517 COST 369.52 TRAN0205 1. + SH020517 BAL0205 -1. BAL0217 1. + SH020717 COST 365.8 TRAN0207 1. + SH020717 BAL0264 -1. BAL0217 1. + SH020817 COST 33.48 TRAN0208 1. + SH020817 BAL0283 -1. BAL0217 1. + SH020118 COST 217. TRAN0201 1. + SH020118 BAL0201 -1. BAL0218 1. + SH020218 COST 447.64 TRAN0202 1. + SH020218 BAL0202 -1. BAL0218 1. + SH020318 COST 334.8 TRAN0203 1. + SH020318 BAL0203 -1. BAL0218 1. + SH020418 COST 190.96 TRAN0204 1. + SH020418 BAL0204 -1. BAL0218 1. + SH020518 COST 504.68 TRAN0205 1. + SH020518 BAL0205 -1. BAL0218 1. + SH020618 COST 436.48 TRAN0206 1. + SH020618 BAL0252 -1. BAL0218 1. + SH020818 COST 127.72 TRAN0208 1. + SH020818 BAL0283 -1. BAL0218 1. + SH020119 COST 307.52 TRAN0201 1. + SH020119 BAL0201 -1. BAL0219 1. + SH020219 COST 851.88 TRAN0202 1. + SH020219 BAL0202 -1. BAL0219 1. + SH020319 COST 393.08 TRAN0203 1. + SH020319 BAL0203 -1. BAL0219 1. + SH020419 COST 197.16 TRAN0204 1. + SH020419 BAL0204 -1. BAL0219 1. + SH020519 COST 257.92 TRAN0205 1. + SH020519 BAL0205 -1. BAL0219 1. + SH020619 COST 427.8 TRAN0206 1. + SH020619 BAL0252 -1. BAL0219 1. + SH020819 COST 122.76 TRAN0208 1. + SH020819 BAL0283 -1. BAL0219 1. + SH020120 COST 254.2 TRAN0201 1. + SH020120 BAL0201 -1. BAL0220 1. + SH020220 COST 846.92 TRAN0202 1. + SH020220 BAL0202 -1. BAL0220 1. + SH020320 COST 368.28 TRAN0203 1. + SH020320 BAL0203 -1. BAL0220 1. + SH020420 COST 140.12 TRAN0204 1. + SH020420 BAL0204 -1. BAL0220 1. + SH020520 COST 360.84 TRAN0205 1. + SH020520 BAL0205 -1. BAL0220 1. + SH020820 COST 156.24 TRAN0208 1. + SH020820 BAL0283 -1. BAL0220 1. + SH020121 COST 499.72 TRAN0201 1. + SH020121 BAL0201 -1. BAL0221 1. + SH020221 COST 456.32 TRAN0202 1. + SH020221 BAL0202 -1. BAL0221 1. + SH020321 COST 553.04 TRAN0203 1. + SH020321 BAL0203 -1. BAL0221 1. + SH020421 COST 396.8 TRAN0204 1. + SH020421 BAL0204 -1. BAL0221 1. + SH020521 COST 682. TRAN0205 1. + SH020521 BAL0205 -1. BAL0221 1. + SH020821 COST 396.8 TRAN0208 1. + SH020821 BAL0283 -1. BAL0221 1. + SH020122 COST 307.52 TRAN0201 1. + SH020122 BAL0201 -1. BAL0222 1. + SH020222 COST 716.72 TRAN0202 1. + SH020222 BAL0202 -1. BAL0222 1. + SH020322 COST 370.76 TRAN0203 1. + SH020322 BAL0203 -1. BAL0222 1. + SH020422 COST 277.76 TRAN0204 1. + SH020422 BAL0204 -1. BAL0222 1. + SH020522 COST 221.96 TRAN0205 1. + SH020522 BAL0205 -1. BAL0222 1. + SH020622 COST 384.4 TRAN0206 1. + SH020622 BAL0252 -1. BAL0222 1. + SH020822 COST 172.36 TRAN0208 1. + SH020822 BAL0283 -1. BAL0222 1. + SH020123 COST 290.16 TRAN0201 1. + SH020123 BAL0201 -1. BAL0223 1. + SH020223 COST 670.84 TRAN0202 1. + SH020223 BAL0202 -1. BAL0223 1. + SH020323 COST 355.88 TRAN0203 1. + SH020323 BAL0203 -1. BAL0223 1. + SH020423 COST 207.08 TRAN0204 1. + SH020423 BAL0204 -1. BAL0223 1. + SH020523 COST 205.84 TRAN0205 1. + SH020523 BAL0205 -1. BAL0223 1. + SH020823 COST 172.36 TRAN0208 1. + SH020823 BAL0283 -1. BAL0223 1. + SH020124 COST 1780.64 TRAN0201 1. + SH020124 BAL0201 -1. BAL0224 1. + SH020125 COST 479.88 TRAN0201 1. + SH020125 BAL0201 -1. BAL0225 1. + SH020225 COST 529.48 TRAN0202 1. + SH020225 BAL0202 -1. BAL0225 1. + SH020325 COST 633.64 TRAN0203 1. + SH020325 BAL0203 -1. BAL0225 1. + SH020425 COST 431.52 TRAN0204 1. + SH020425 BAL0204 -1. BAL0225 1. + SH020525 COST 701.84 TRAN0205 1. + SH020525 BAL0205 -1. BAL0225 1. + SH020625 COST 499.72 TRAN0206 1. + SH020625 BAL0252 -1. BAL0225 1. + SH020825 COST 378.2 TRAN0208 1. + SH020825 BAL0283 -1. BAL0225 1. + SH020426 COST 334.8 TRAN0204 1. + SH020426 BAL0204 -1. BAL0226 1. + SH020127 COST 290.16 TRAN0201 1. + SH020127 BAL0201 -1. BAL0227 1. + SH020227 COST 352.16 TRAN0202 1. + SH020227 BAL0202 -1. BAL0227 1. + SH020327 COST 358.36 TRAN0203 1. + SH020327 BAL0203 -1. BAL0227 1. + SH020427 COST 415.4 TRAN0204 1. + SH020427 BAL0204 -1. BAL0227 1. + SH020527 COST 468.72 TRAN0205 1. + SH020527 BAL0205 -1. BAL0227 1. + SH020627 COST 332.32 TRAN0206 1. + SH020627 BAL0252 -1. BAL0227 1. + SH020827 COST 312.48 TRAN0208 1. + SH020827 BAL0283 -1. BAL0227 1. + SH020128 COST 301.32 TRAN0201 1. + SH020128 BAL0201 -1. BAL0228 1. + SH020228 COST 705.56 TRAN0202 1. + SH020228 BAL0202 -1. BAL0228 1. + SH020328 COST 367.04 TRAN0203 1. + SH020328 BAL0203 -1. BAL0228 1. + SH020428 COST 365.8 TRAN0204 1. + SH020428 BAL0204 -1. BAL0228 1. + SH020528 COST 126.48 TRAN0205 1. + SH020528 BAL0205 -1. BAL0228 1. + SH020628 COST 323.64 TRAN0206 1. + SH020628 BAL0252 -1. BAL0228 1. + SH020728 COST 132.68 TRAN0207 1. + SH020728 BAL0264 -1. BAL0228 1. + SH020828 COST 314.96 TRAN0208 1. + SH020828 BAL0283 -1. BAL0228 1. + SH020129 COST 276.52 TRAN0201 1. + SH020129 BAL0201 -1. BAL0229 1. + SH020229 COST 575.36 TRAN0202 1. + SH020229 BAL0202 -1. BAL0229 1. + SH020329 COST 298.84 TRAN0203 1. + SH020329 BAL0203 -1. BAL0229 1. + SH020429 COST 246.76 TRAN0204 1. + SH020429 BAL0204 -1. BAL0229 1. + SH020529 COST 533.2 TRAN0205 1. + SH020529 BAL0205 -1. BAL0229 1. + SH020629 COST 323.64 TRAN0206 1. + SH020629 BAL0252 -1. BAL0229 1. + SH020829 COST 178.56 TRAN0208 1. + SH020829 BAL0283 -1. BAL0229 1. + SH020130 COST 577.84 TRAN0201 1. + SH020130 BAL0201 -1. BAL0230 1. + SH020230 COST 540.64 TRAN0202 1. + SH020230 BAL0202 -1. BAL0230 1. + SH020330 COST 648.52 TRAN0203 1. + SH020330 BAL0203 -1. BAL0230 1. + SH020430 COST 376.96 TRAN0204 1. + SH020430 BAL0204 -1. BAL0230 1. + SH020530 COST 553.04 TRAN0205 1. + SH020530 BAL0205 -1. BAL0230 1. + SH020830 COST 473.68 TRAN0208 1. + SH020830 BAL0283 -1. BAL0230 1. + SH020131 COST 137.64 TRAN0201 1. + SH020131 BAL0201 -1. BAL0231 1. + SH020231 COST 435.24 TRAN0202 1. + SH020231 BAL0202 -1. BAL0231 1. + SH020331 COST 136.4 TRAN0203 1. + SH020331 BAL0203 -1. BAL0231 1. + SH020431 COST 313.72 TRAN0204 1. + SH020431 BAL0204 -1. BAL0231 1. + SH020531 COST 380.68 TRAN0205 1. + SH020531 BAL0205 -1. BAL0231 1. + SH020631 COST 138.88 TRAN0206 1. + SH020631 BAL0252 -1. BAL0231 1. + SH020831 COST 276.52 TRAN0208 1. + SH020831 BAL0283 -1. BAL0231 1. + SH020132 COST 370.76 TRAN0201 1. + SH020132 BAL0201 -1. BAL0232 1. + SH020232 COST 592.72 TRAN0202 1. + SH020232 BAL0202 -1. BAL0232 1. + SH020332 COST 524.52 TRAN0203 1. + SH020332 BAL0203 -1. BAL0232 1. + SH020432 COST 194.68 TRAN0204 1. + SH020432 BAL0204 -1. BAL0232 1. + SH020532 COST 486.08 TRAN0205 1. + SH020532 BAL0205 -1. BAL0232 1. + SH020832 COST 223.2 TRAN0208 1. + SH020832 BAL0283 -1. BAL0232 1. + SH020133 COST 611.32 TRAN0201 1. + SH020133 BAL0201 -1. BAL0233 1. + SH020233 COST 496. TRAN0202 1. + SH020233 BAL0202 -1. BAL0233 1. + SH020333 COST 673.32 TRAN0203 1. + SH020333 BAL0203 -1. BAL0233 1. + SH020433 COST 551.8 TRAN0204 1. + SH020433 BAL0204 -1. BAL0233 1. + SH020533 COST 782.44 TRAN0205 1. + SH020533 BAL0205 -1. BAL0233 1. + SH020833 COST 472.44 TRAN0208 1. + SH020833 BAL0283 -1. BAL0233 1. + SH020134 COST 478.64 TRAN0201 1. + SH020134 BAL0201 -1. BAL0234 1. + SH020234 COST 812.2 TRAN0202 1. + SH020234 BAL0202 -1. BAL0234 1. + SH020334 COST 623.72 TRAN0203 1. + SH020334 BAL0203 -1. BAL0234 1. + SH020434 COST 261.64 TRAN0204 1. + SH020434 BAL0204 -1. BAL0234 1. + SH020534 COST 546.84 TRAN0205 1. + SH020534 BAL0205 -1. BAL0234 1. + SH020834 COST 326.12 TRAN0208 1. + SH020834 BAL0283 -1. BAL0234 1. + SH020135 COST 571.64 TRAN0201 1. + SH020135 BAL0201 -1. BAL0235 1. + SH020235 COST 551.8 TRAN0202 1. + SH020235 BAL0202 -1. BAL0235 1. + SH020335 COST 467.48 TRAN0203 1. + SH020335 BAL0203 -1. BAL0235 1. + SH020435 COST 151.28 TRAN0204 1. + SH020435 BAL0204 -1. BAL0235 1. + SH020535 COST 534.44 TRAN0205 1. + SH020535 BAL0205 -1. BAL0235 1. + SH020835 COST 291.4 TRAN0208 1. + SH020835 BAL0283 -1. BAL0235 1. + SH020136 COST 254.2 TRAN0201 1. + SH020136 BAL0201 -1. BAL0236 1. + SH020236 COST 555.52 TRAN0202 1. + SH020236 BAL0202 -1. BAL0236 1. + SH020336 COST 131.44 TRAN0203 1. + SH020336 BAL0203 -1. BAL0236 1. + SH020436 COST 458.8 TRAN0204 1. + SH020436 BAL0204 -1. BAL0236 1. + SH020536 COST 429.04 TRAN0205 1. + SH020536 BAL0205 -1. BAL0236 1. + SH020636 COST 136.4 TRAN0206 1. + SH020636 BAL0252 -1. BAL0236 1. + SH020836 COST 398.04 TRAN0208 1. + SH020836 BAL0283 -1. BAL0236 1. + SH020137 COST 114.08 TRAN0201 1. + SH020137 BAL0201 -1. BAL0237 1. + SH020237 COST 424.08 TRAN0202 1. + SH020237 BAL0202 -1. BAL0237 1. + SH020337 COST 195.92 TRAN0203 1. + SH020337 BAL0203 -1. BAL0237 1. + SH020437 COST 376.96 TRAN0204 1. + SH020437 BAL0204 -1. BAL0237 1. + SH020537 COST 225.68 TRAN0205 1. + SH020537 BAL0205 -1. BAL0237 1. + SH020637 COST 240.56 TRAN0206 1. + SH020637 BAL0252 -1. BAL0237 1. + SH020837 COST 312.48 TRAN0208 1. + SH020837 BAL0283 -1. BAL0237 1. + SH020138 COST 168.64 TRAN0201 1. + SH020138 BAL0201 -1. BAL0238 1. + SH020238 COST 302.56 TRAN0202 1. + SH020238 BAL0202 -1. BAL0238 1. + SH020338 COST 117.8 TRAN0203 1. + SH020338 BAL0203 -1. BAL0238 1. + SH020438 COST 381.92 TRAN0204 1. + SH020438 BAL0204 -1. BAL0238 1. + SH020538 COST 344.72 TRAN0205 1. + SH020538 BAL0205 -1. BAL0238 1. + SH020638 COST 48.36 TRAN0206 1. + SH020638 BAL0252 -1. BAL0238 1. + SH020738 COST 267.84 TRAN0207 1. + SH020738 BAL0264 -1. BAL0238 1. + SH020838 COST 293.88 TRAN0208 1. + SH020838 BAL0283 -1. BAL0238 1. + SH020139 COST 161.2 TRAN0201 1. + SH020139 BAL0201 -1. BAL0239 1. + SH020239 COST 420.36 TRAN0202 1. + SH020239 BAL0202 -1. BAL0239 1. + SH020339 COST 198.4 TRAN0203 1. + SH020339 BAL0203 -1. BAL0239 1. + SH020439 COST 308.76 TRAN0204 1. + SH020439 BAL0204 -1. BAL0239 1. + SH020539 COST 531.96 TRAN0205 1. + SH020539 BAL0205 -1. BAL0239 1. + SH020639 COST 252.96 TRAN0206 1. + SH020639 BAL0252 -1. BAL0239 1. + SH020839 COST 208.32 TRAN0208 1. + SH020839 BAL0283 -1. BAL0239 1. + SH020140 COST 204.6 TRAN0201 1. + SH020140 BAL0201 -1. BAL0240 1. + SH020240 COST 468.72 TRAN0202 1. + SH020240 BAL0202 -1. BAL0240 1. + SH020340 COST 127.72 TRAN0203 1. + SH020340 BAL0203 -1. BAL0240 1. + SH020440 COST 368.28 TRAN0204 1. + SH020440 BAL0204 -1. BAL0240 1. + SH020540 COST 274.04 TRAN0205 1. + SH020540 BAL0205 -1. BAL0240 1. + SH020640 COST 162.44 TRAN0206 1. + SH020640 BAL0252 -1. BAL0240 1. + SH020840 COST 339.76 TRAN0208 1. + SH020840 BAL0283 -1. BAL0240 1. + SH020141 COST 243.04 TRAN0201 1. + SH020141 BAL0201 -1. BAL0241 1. + SH020241 COST 372. TRAN0202 1. + SH020241 BAL0202 -1. BAL0241 1. + SH020341 COST 186. TRAN0203 1. + SH020341 BAL0203 -1. BAL0241 1. + SH020441 COST 401.76 TRAN0204 1. + SH020441 BAL0204 -1. BAL0241 1. + SH020541 COST 456.32 TRAN0205 1. + SH020541 BAL0205 -1. BAL0241 1. + SH020641 COST 124. TRAN0206 1. + SH020641 BAL0252 -1. BAL0241 1. + SH020841 COST 370.76 TRAN0208 1. + SH020841 BAL0283 -1. BAL0241 1. + SH020142 COST 111.6 TRAN0201 1. + SH020142 BAL0201 -1. BAL0242 1. + SH020242 COST 513.36 TRAN0202 1. + SH020242 BAL0202 -1. BAL0242 1. + SH020342 COST 198.4 TRAN0203 1. + SH020342 BAL0203 -1. BAL0242 1. + SH020442 COST 241.8 TRAN0204 1. + SH020442 BAL0204 -1. BAL0242 1. + SH020542 COST 447.64 TRAN0205 1. + SH020542 BAL0205 -1. BAL0242 1. + SH020642 COST 199.64 TRAN0206 1. + SH020642 BAL0252 -1. BAL0242 1. + SH020842 COST 188.48 TRAN0208 1. + SH020842 BAL0283 -1. BAL0242 1. + SH020143 COST 197.16 TRAN0201 1. + SH020143 BAL0201 -1. BAL0243 1. + SH020243 COST 489.8 TRAN0202 1. + SH020243 BAL0202 -1. BAL0243 1. + SH020343 COST 31. TRAN0203 1. + SH020343 BAL0203 -1. BAL0243 1. + SH020443 COST 367.04 TRAN0204 1. + SH020443 BAL0204 -1. BAL0243 1. + SH020543 COST 319.92 TRAN0205 1. + SH020543 BAL0205 -1. BAL0243 1. + SH020643 COST 124. TRAN0206 1. + SH020643 BAL0252 -1. BAL0243 1. + SH020743 COST 298.84 TRAN0207 1. + SH020743 BAL0264 -1. BAL0243 1. + SH020843 COST 336.04 TRAN0208 1. + SH020843 BAL0283 -1. BAL0243 1. + SH020144 COST 197.16 TRAN0201 1. + SH020144 BAL0201 -1. BAL0244 1. + SH020244 COST 469.96 TRAN0202 1. + SH020244 BAL0202 -1. BAL0244 1. + SH020344 COST 158.72 TRAN0203 1. + SH020344 BAL0203 -1. BAL0244 1. + SH020444 COST 386.88 TRAN0204 1. + SH020444 BAL0204 -1. BAL0244 1. + SH020544 COST 384.4 TRAN0205 1. + SH020544 BAL0205 -1. BAL0244 1. + SH020644 COST 110.36 TRAN0206 1. + SH020644 BAL0252 -1. BAL0244 1. + SH020844 COST 369.52 TRAN0208 1. + SH020844 BAL0283 -1. BAL0244 1. + SH020145 COST 213.28 TRAN0201 1. + SH020145 BAL0201 -1. BAL0245 1. + SH020245 COST 540.64 TRAN0202 1. + SH020245 BAL0202 -1. BAL0245 1. + SH020345 COST 199.64 TRAN0203 1. + SH020345 BAL0203 -1. BAL0245 1. + SH020445 COST 362.08 TRAN0204 1. + SH020445 BAL0204 -1. BAL0245 1. + SH020545 COST 290.16 TRAN0205 1. + SH020545 BAL0205 -1. BAL0245 1. + SH020645 COST 236.84 TRAN0206 1. + SH020645 BAL0252 -1. BAL0245 1. + SH020745 COST 244.28 TRAN0207 1. + SH020745 BAL0264 -1. BAL0245 1. + SH020845 COST 378.2 TRAN0208 1. + SH020845 BAL0283 -1. BAL0245 1. + SH020146 COST 303.8 TRAN0201 1. + SH020146 BAL0201 -1. BAL0246 1. + SH020246 COST 338.52 TRAN0202 1. + SH020246 BAL0202 -1. BAL0246 1. + SH020346 COST 274.04 TRAN0203 1. + SH020346 BAL0203 -1. BAL0246 1. + SH020446 COST 554.28 TRAN0204 1. + SH020446 BAL0204 -1. BAL0246 1. + SH020546 COST 533.2 TRAN0205 1. + SH020546 BAL0205 -1. BAL0246 1. + SH020646 COST 318.68 TRAN0206 1. + SH020646 BAL0252 -1. BAL0246 1. + SH020846 COST 555.52 TRAN0208 1. + SH020846 BAL0283 -1. BAL0246 1. + SH020147 COST 136.4 TRAN0201 1. + SH020147 BAL0201 -1. BAL0247 1. + SH020247 COST 462.52 TRAN0202 1. + SH020247 BAL0202 -1. BAL0247 1. + SH020347 COST 197.16 TRAN0203 1. + SH020347 BAL0203 -1. BAL0247 1. + SH020447 COST 339.76 TRAN0204 1. + SH020447 BAL0204 -1. BAL0247 1. + SH020547 COST 288.92 TRAN0205 1. + SH020547 BAL0205 -1. BAL0247 1. + SH020647 COST 179.8 TRAN0206 1. + SH020647 BAL0252 -1. BAL0247 1. + SH020847 COST 302.56 TRAN0208 1. + SH020847 BAL0283 -1. BAL0247 1. + SH020148 COST 117.8 TRAN0201 1. + SH020148 BAL0201 -1. BAL0248 1. + SH020248 COST 420.36 TRAN0202 1. + SH020248 BAL0202 -1. BAL0248 1. + SH020348 COST 169.88 TRAN0203 1. + SH020348 BAL0203 -1. BAL0248 1. + SH020448 COST 285.2 TRAN0204 1. + SH020448 BAL0204 -1. BAL0248 1. + SH020548 COST 306.28 TRAN0205 1. + SH020548 BAL0205 -1. BAL0248 1. + SH020648 COST 142.6 TRAN0206 1. + SH020648 BAL0252 -1. BAL0248 1. + SH020848 COST 241.8 TRAN0208 1. + SH020848 BAL0283 -1. BAL0248 1. + SH020149 COST 407.96 TRAN0201 1. + SH020149 BAL0201 -1. BAL0249 1. + SH020249 COST 663.4 TRAN0202 1. + SH020249 BAL0202 -1. BAL0249 1. + SH020349 COST 411.68 TRAN0203 1. + SH020349 BAL0203 -1. BAL0249 1. + SH020449 COST 472.44 TRAN0204 1. + SH020449 BAL0204 -1. BAL0249 1. + SH020549 COST 188.48 TRAN0205 1. + SH020549 BAL0205 -1. BAL0249 1. + SH020649 COST 419.12 TRAN0206 1. + SH020649 BAL0252 -1. BAL0249 1. + SH020749 COST 166.16 TRAN0207 1. + SH020749 BAL0264 -1. BAL0249 1. + SH020849 COST 505.92 TRAN0208 1. + SH020849 BAL0283 -1. BAL0249 1. + SH020150 COST 298.84 TRAN0201 1. + SH020150 BAL0201 -1. BAL0250 1. + SH020250 COST 758.88 TRAN0202 1. + SH020250 BAL0202 -1. BAL0250 1. + SH020350 COST 305.04 TRAN0203 1. + SH020350 BAL0203 -1. BAL0250 1. + SH020450 COST 452.6 TRAN0204 1. + SH020450 BAL0204 -1. BAL0250 1. + SH020550 COST 291.4 TRAN0205 1. + SH020550 BAL0205 -1. BAL0250 1. + SH020750 COST 169.88 TRAN0207 1. + SH020750 BAL0264 -1. BAL0250 1. + SH020850 COST 503.44 TRAN0208 1. + SH020850 BAL0283 -1. BAL0250 1. + SH020151 COST 411.68 TRAN0201 1. + SH020151 BAL0201 -1. BAL0251 1. + SH020251 COST 682. TRAN0202 1. + SH020251 BAL0202 -1. BAL0251 1. + SH020351 COST 422.84 TRAN0203 1. + SH020351 BAL0203 -1. BAL0251 1. + SH020451 COST 419.12 TRAN0204 1. + SH020451 BAL0204 -1. BAL0251 1. + SH020551 COST 152.52 TRAN0205 1. + SH020551 BAL0205 -1. BAL0251 1. + SH020751 COST 122.76 TRAN0207 1. + SH020751 BAL0264 -1. BAL0251 1. + SH020851 COST 530.72 TRAN0208 1. + SH020851 BAL0283 -1. BAL0251 1. + SH020152 COST 138.88 TRAN0201 1. + SH020152 BAL0201 -1. BAL0252 1. + SH020252 COST 372. TRAN0202 1. + SH020252 BAL0202 -1. BAL0252 1. + SH020352 COST 101.68 TRAN0203 1. + SH020352 BAL0203 -1. BAL0252 1. + SH020452 COST 399.28 TRAN0204 1. + SH020452 BAL0204 -1. BAL0252 1. + SH020552 COST 365.8 TRAN0205 1. + SH020552 BAL0205 -1. BAL0252 1. + SH020852 COST 313.72 TRAN0208 1. + SH020852 BAL0283 -1. BAL0252 1. + SH020153 COST 445.16 TRAN0201 1. + SH020153 BAL0201 -1. BAL0253 1. + SH020253 COST 788.64 TRAN0202 1. + SH020253 BAL0202 -1. BAL0253 1. + SH020353 COST 403. TRAN0203 1. + SH020353 BAL0203 -1. BAL0253 1. + SH020453 COST 510.88 TRAN0204 1. + SH020453 BAL0204 -1. BAL0253 1. + SH020553 COST 228.16 TRAN0205 1. + SH020553 BAL0205 -1. BAL0253 1. + SH020653 COST 445.16 TRAN0206 1. + SH020653 BAL0252 -1. BAL0253 1. + SH020753 COST 181.04 TRAN0207 1. + SH020753 BAL0264 -1. BAL0253 1. + SH020853 COST 499.72 TRAN0208 1. + SH020853 BAL0283 -1. BAL0253 1. + SH020154 COST 229.4 TRAN0201 1. + SH020154 BAL0201 -1. BAL0254 1. + SH020254 COST 551.8 TRAN0202 1. + SH020254 BAL0202 -1. BAL0254 1. + SH020354 COST 269.08 TRAN0203 1. + SH020354 BAL0203 -1. BAL0254 1. + SH020454 COST 425.32 TRAN0204 1. + SH020454 BAL0204 -1. BAL0254 1. + SH020554 COST 264.12 TRAN0205 1. + SH020554 BAL0205 -1. BAL0254 1. + SH020654 COST 251.72 TRAN0206 1. + SH020654 BAL0252 -1. BAL0254 1. + SH020854 COST 498.48 TRAN0208 1. + SH020854 BAL0283 -1. BAL0254 1. + SH020155 COST 344.72 TRAN0201 1. + SH020155 BAL0201 -1. BAL0255 1. + SH020255 COST 593.96 TRAN0202 1. + SH020255 BAL0202 -1. BAL0255 1. + SH020355 COST 348.44 TRAN0203 1. + SH020355 BAL0203 -1. BAL0255 1. + SH020455 COST 364.56 TRAN0204 1. + SH020455 BAL0204 -1. BAL0255 1. + SH020555 COST 190.96 TRAN0205 1. + SH020555 BAL0205 -1. BAL0255 1. + SH020655 COST 359.6 TRAN0206 1. + SH020655 BAL0252 -1. BAL0255 1. + SH020755 COST 132.68 TRAN0207 1. + SH020755 BAL0264 -1. BAL0255 1. + SH020855 COST 364.56 TRAN0208 1. + SH020855 BAL0283 -1. BAL0255 1. + SH020156 COST 483.6 TRAN0201 1. + SH020156 BAL0201 -1. BAL0256 1. + SH020256 COST 717.96 TRAN0202 1. + SH020256 BAL0202 -1. BAL0256 1. + SH020356 COST 378.2 TRAN0203 1. + SH020356 BAL0203 -1. BAL0256 1. + SH020456 COST 452.6 TRAN0204 1. + SH020456 BAL0204 -1. BAL0256 1. + SH020556 COST 168.64 TRAN0205 1. + SH020556 BAL0205 -1. BAL0256 1. + SH020656 COST 420.36 TRAN0206 1. + SH020656 BAL0252 -1. BAL0256 1. + SH020756 COST 151.28 TRAN0207 1. + SH020756 BAL0264 -1. BAL0256 1. + SH020856 COST 442.68 TRAN0208 1. + SH020856 BAL0283 -1. BAL0256 1. + SH020157 COST 323.64 TRAN0201 1. + SH020157 BAL0201 -1. BAL0257 1. + SH020257 COST 644.8 TRAN0202 1. + SH020257 BAL0202 -1. BAL0257 1. + SH020357 COST 359.6 TRAN0203 1. + SH020357 BAL0203 -1. BAL0257 1. + SH020457 COST 290.16 TRAN0204 1. + SH020457 BAL0204 -1. BAL0257 1. + SH020557 COST 208.32 TRAN0205 1. + SH020557 BAL0205 -1. BAL0257 1. + SH020657 COST 395.56 TRAN0206 1. + SH020657 BAL0252 -1. BAL0257 1. + SH020757 COST 183.52 TRAN0207 1. + SH020757 BAL0264 -1. BAL0257 1. + SH020857 COST 286.44 TRAN0208 1. + SH020857 BAL0283 -1. BAL0257 1. + SH020158 COST 364.56 TRAN0201 1. + SH020158 BAL0201 -1. BAL0258 1. + SH020258 COST 646.04 TRAN0202 1. + SH020258 BAL0202 -1. BAL0258 1. + SH020358 COST 344.72 TRAN0203 1. + SH020358 BAL0203 -1. BAL0258 1. + SH020458 COST 425.32 TRAN0204 1. + SH020458 BAL0204 -1. BAL0258 1. + SH020558 COST 26.04 TRAN0205 1. + SH020558 BAL0205 -1. BAL0258 1. + SH020658 COST 404.24 TRAN0206 1. + SH020658 BAL0252 -1. BAL0258 1. + SH020758 COST 84.32 TRAN0207 1. + SH020758 BAL0264 -1. BAL0258 1. + SH020858 COST 314.96 TRAN0208 1. + SH020858 BAL0283 -1. BAL0258 1. + SH020159 COST 255.44 TRAN0201 1. + SH020159 BAL0201 -1. BAL0259 1. + SH020259 COST 617.52 TRAN0202 1. + SH020259 BAL0202 -1. BAL0259 1. + SH020359 COST 295.12 TRAN0203 1. + SH020359 BAL0203 -1. BAL0259 1. + SH020459 COST 302.56 TRAN0204 1. + SH020459 BAL0204 -1. BAL0259 1. + SH020559 COST 197.16 TRAN0205 1. + SH020559 BAL0205 -1. BAL0259 1. + SH020659 COST 368.28 TRAN0206 1. + SH020659 BAL0252 -1. BAL0259 1. + SH020759 COST 130.2 TRAN0207 1. + SH020759 BAL0264 -1. BAL0259 1. + SH020859 COST 316.2 TRAN0208 1. + SH020859 BAL0283 -1. BAL0259 1. + SH020160 COST 323.64 TRAN0201 1. + SH020160 BAL0201 -1. BAL0260 1. + SH020260 COST 682. TRAN0202 1. + SH020260 BAL0202 -1. BAL0260 1. + SH020360 COST 350.92 TRAN0203 1. + SH020360 BAL0203 -1. BAL0260 1. + SH020460 COST 386.88 TRAN0204 1. + SH020460 BAL0204 -1. BAL0260 1. + SH020560 COST 167.4 TRAN0205 1. + SH020560 BAL0205 -1. BAL0260 1. + SH020660 COST 400.52 TRAN0206 1. + SH020660 BAL0252 -1. BAL0260 1. + SH020760 COST 109.12 TRAN0207 1. + SH020760 BAL0264 -1. BAL0260 1. + SH020860 COST 370.76 TRAN0208 1. + SH020860 BAL0283 -1. BAL0260 1. + SH020163 COST 329.84 TRAN0201 1. + SH020163 BAL0201 -1. BAL0263 1. + SH020263 COST 612.56 TRAN0202 1. + SH020263 BAL0202 -1. BAL0263 1. + SH020363 COST 355.88 TRAN0203 1. + SH020363 BAL0203 -1. BAL0263 1. + SH020463 COST 457.56 TRAN0204 1. + SH020463 BAL0204 -1. BAL0263 1. + SH020563 COST 188.48 TRAN0205 1. + SH020563 BAL0205 -1. BAL0263 1. + SH020663 COST 390.6 TRAN0206 1. + SH020663 BAL0252 -1. BAL0263 1. + SH020763 COST 153.76 TRAN0207 1. + SH020763 BAL0264 -1. BAL0263 1. + SH020863 COST 496. TRAN0208 1. + SH020863 BAL0283 -1. BAL0263 1. + SH020164 COST 246.76 TRAN0201 1. + SH020164 BAL0201 -1. BAL0264 1. + SH020264 COST 652.24 TRAN0202 1. + SH020264 BAL0202 -1. BAL0264 1. + SH020364 COST 276.52 TRAN0203 1. + SH020364 BAL0203 -1. BAL0264 1. + SH020464 COST 416.64 TRAN0204 1. + SH020464 BAL0204 -1. BAL0264 1. + SH020564 COST 71.92 TRAN0205 1. + SH020564 BAL0205 -1. BAL0264 1. + SH020664 COST 393.08 TRAN0206 1. + SH020664 BAL0252 -1. BAL0264 1. + SH020864 COST 310. TRAN0208 1. + SH020864 BAL0283 -1. BAL0264 1. + SH020165 COST 535.68 TRAN0201 1. + SH020165 BAL0201 -1. BAL0265 1. + SH020265 COST 380.68 TRAN0202 1. + SH020265 BAL0202 -1. BAL0265 1. + SH020365 COST 626.2 TRAN0203 1. + SH020365 BAL0203 -1. BAL0265 1. + SH020465 COST 481.12 TRAN0204 1. + SH020465 BAL0204 -1. BAL0265 1. + SH020565 COST 748.96 TRAN0205 1. + SH020565 BAL0205 -1. BAL0265 1. + SH020865 COST 514.6 TRAN0208 1. + SH020865 BAL0283 -1. BAL0265 1. + SH020166 COST 694.4 TRAN0201 1. + SH020166 BAL0201 -1. BAL0266 1. + SH020266 COST 321.16 TRAN0202 1. + SH020266 BAL0202 -1. BAL0266 1. + SH020366 COST 716.72 TRAN0203 1. + SH020366 BAL0203 -1. BAL0266 1. + SH020466 COST 689.44 TRAN0204 1. + SH020466 BAL0204 -1. BAL0266 1. + SH020566 COST 880.4 TRAN0205 1. + SH020566 BAL0205 -1. BAL0266 1. + SH020866 COST 694.4 TRAN0208 1. + SH020866 BAL0283 -1. BAL0266 1. + SH020167 COST 527. TRAN0201 1. + SH020167 BAL0201 -1. BAL0267 1. + SH020267 COST 287.68 TRAN0202 1. + SH020267 BAL0202 -1. BAL0267 1. + SH020367 COST 611.32 TRAN0203 1. + SH020367 BAL0203 -1. BAL0267 1. + SH020467 COST 566.68 TRAN0204 1. + SH020467 BAL0204 -1. BAL0267 1. + SH020567 COST 748.96 TRAN0205 1. + SH020567 BAL0205 -1. BAL0267 1. + SH020867 COST 567.92 TRAN0208 1. + SH020867 BAL0283 -1. BAL0267 1. + SH020168 COST 736.56 TRAN0201 1. + SH020168 BAL0201 -1. BAL0268 1. + SH020268 COST 496. TRAN0202 1. + SH020268 BAL0202 -1. BAL0268 1. + SH020368 COST 694.4 TRAN0203 1. + SH020368 BAL0203 -1. BAL0268 1. + SH020468 COST 870.48 TRAN0204 1. + SH020468 BAL0204 -1. BAL0268 1. + SH020568 COST 1173.04 TRAN0205 1. + SH020568 BAL0205 -1. BAL0268 1. + SH020868 COST 931.24 TRAN0208 1. + SH020868 BAL0283 -1. BAL0268 1. + SH020169 COST 668.36 TRAN0201 1. + SH020169 BAL0201 -1. BAL0269 1. + SH020269 COST 274.04 TRAN0202 1. + SH020269 BAL0202 -1. BAL0269 1. + SH020369 COST 632.4 TRAN0203 1. + SH020369 BAL0203 -1. BAL0269 1. + SH020469 COST 771.28 TRAN0204 1. + SH020469 BAL0204 -1. BAL0269 1. + SH020569 COST 801.04 TRAN0205 1. + SH020569 BAL0205 -1. BAL0269 1. + SH020869 COST 815.92 TRAN0208 1. + SH020869 BAL0283 -1. BAL0269 1. + SH020171 COST 545.6 TRAN0201 1. + SH020171 BAL0201 -1. BAL0271 1. + SH020371 COST 649.76 TRAN0203 1. + SH020371 BAL0203 -1. BAL0271 1. + SH020471 COST 646.04 TRAN0204 1. + SH020471 BAL0204 -1. BAL0271 1. + SH020571 COST 720.44 TRAN0205 1. + SH020571 BAL0205 -1. BAL0271 1. + SH020671 COST 484.84 TRAN0206 1. + SH020671 BAL0252 -1. BAL0271 1. + SH020771 COST 872.96 TRAN0207 1. + SH020771 BAL0264 -1. BAL0271 1. + SH020871 COST 660.92 TRAN0208 1. + SH020871 BAL0283 -1. BAL0271 1. + SH020172 COST 727.88 TRAN0201 1. + SH020172 BAL0201 -1. BAL0272 1. + SH020272 COST 673.32 TRAN0202 1. + SH020272 BAL0202 -1. BAL0272 1. + SH020372 COST 765.08 TRAN0203 1. + SH020372 BAL0203 -1. BAL0272 1. + SH020472 COST 706.8 TRAN0204 1. + SH020472 BAL0204 -1. BAL0272 1. + SH020572 COST 946.12 TRAN0205 1. + SH020572 BAL0205 -1. BAL0272 1. + SH020872 COST 706.8 TRAN0208 1. + SH020872 BAL0283 -1. BAL0272 1. + SH020173 COST 483.6 TRAN0201 1. + SH020173 BAL0201 -1. BAL0273 1. + SH020273 COST 452.6 TRAN0202 1. + SH020273 BAL0202 -1. BAL0273 1. + SH020373 COST 419.12 TRAN0203 1. + SH020373 BAL0203 -1. BAL0273 1. + SH020473 COST 566.68 TRAN0204 1. + SH020473 BAL0204 -1. BAL0273 1. + SH020573 COST 699.36 TRAN0205 1. + SH020573 BAL0205 -1. BAL0273 1. + SH020673 COST 378.2 TRAN0206 1. + SH020673 BAL0252 -1. BAL0273 1. + SH020873 COST 624.96 TRAN0208 1. + SH020873 BAL0283 -1. BAL0273 1. + SH020174 COST 679.52 TRAN0201 1. + SH020174 BAL0201 -1. BAL0274 1. + SH020274 COST 260.4 TRAN0202 1. + SH020274 BAL0202 -1. BAL0274 1. + SH020374 COST 706.8 TRAN0203 1. + SH020374 BAL0203 -1. BAL0274 1. + SH020474 COST 789.88 TRAN0204 1. + SH020474 BAL0204 -1. BAL0274 1. + SH020574 COST 908.92 TRAN0205 1. + SH020574 BAL0205 -1. BAL0274 1. + SH020874 COST 767.56 TRAN0208 1. + SH020874 BAL0283 -1. BAL0274 1. + SH020275 COST 686.96 TRAN0202 1. + SH020275 BAL0202 -1. BAL0275 1. + SH020176 COST 572.88 TRAN0201 1. + SH020176 BAL0201 -1. BAL0276 1. + SH020276 COST 497.24 TRAN0202 1. + SH020276 BAL0202 -1. BAL0276 1. + SH020376 COST 499.72 TRAN0203 1. + SH020376 BAL0203 -1. BAL0276 1. + SH020476 COST 781.2 TRAN0204 1. + SH020476 BAL0204 -1. BAL0276 1. + SH020576 COST 781.2 TRAN0205 1. + SH020576 BAL0205 -1. BAL0276 1. + SH020676 COST 472.44 TRAN0206 1. + SH020676 BAL0252 -1. BAL0276 1. + SH020876 COST 963.48 TRAN0208 1. + SH020876 BAL0283 -1. BAL0276 1. + SH020177 COST 539.4 TRAN0201 1. + SH020177 BAL0201 -1. BAL0277 1. + SH020277 COST 337.28 TRAN0202 1. + SH020277 BAL0202 -1. BAL0277 1. + SH020377 COST 571.64 TRAN0203 1. + SH020377 BAL0203 -1. BAL0277 1. + SH020477 COST 497.24 TRAN0204 1. + SH020477 BAL0204 -1. BAL0277 1. + SH020577 COST 694.4 TRAN0205 1. + SH020577 BAL0205 -1. BAL0277 1. + SH020877 COST 396.8 TRAN0208 1. + SH020877 BAL0283 -1. BAL0277 1. + SH020178 COST 943.64 TRAN0201 1. + SH020178 BAL0201 -1. BAL0278 1. + SH020278 COST 548.08 TRAN0202 1. + SH020278 BAL0202 -1. BAL0278 1. + SH020378 COST 970.92 TRAN0203 1. + SH020378 BAL0203 -1. BAL0278 1. + SH020478 COST 849.4 TRAN0204 1. + SH020478 BAL0204 -1. BAL0278 1. + SH020578 COST 1089.96 TRAN0205 1. + SH020578 BAL0205 -1. BAL0278 1. + SH020878 COST 949.84 TRAN0208 1. + SH020878 BAL0283 -1. BAL0278 1. + SH020179 COST 886.6 TRAN0201 1. + SH020179 BAL0201 -1. BAL0279 1. + SH020279 COST 333.56 TRAN0202 1. + SH020279 BAL0202 -1. BAL0279 1. + SH020379 COST 856.84 TRAN0203 1. + SH020379 BAL0203 -1. BAL0279 1. + SH020479 COST 892.8 TRAN0204 1. + SH020479 BAL0204 -1. BAL0279 1. + SH020879 COST 875.44 TRAN0208 1. + SH020879 BAL0283 -1. BAL0279 1. + SH020180 COST 393.08 TRAN0201 1. + SH020180 BAL0201 -1. BAL0280 1. + SH020280 COST 489.8 TRAN0202 1. + SH020280 BAL0202 -1. BAL0280 1. + SH020380 COST 541.88 TRAN0203 1. + SH020380 BAL0203 -1. BAL0280 1. + SH020480 COST 463.76 TRAN0204 1. + SH020480 BAL0204 -1. BAL0280 1. + SH020580 COST 626.2 TRAN0205 1. + SH020580 BAL0205 -1. BAL0280 1. + SH020880 COST 297.6 TRAN0208 1. + SH020880 BAL0283 -1. BAL0280 1. + SH020182 COST 721.68 TRAN0201 1. + SH020182 BAL0201 -1. BAL0282 1. + SH020282 COST 407.96 TRAN0202 1. + SH020282 BAL0202 -1. BAL0282 1. + SH020382 COST 812.2 TRAN0203 1. + SH020382 BAL0203 -1. BAL0282 1. + SH020482 COST 875.44 TRAN0204 1. + SH020482 BAL0204 -1. BAL0282 1. + SH020582 COST 1422.28 TRAN0205 1. + SH020582 BAL0205 -1. BAL0282 1. + SH020882 COST 970.92 TRAN0208 1. + SH020882 BAL0283 -1. BAL0282 1. + SH020183 COST 219.48 TRAN0201 1. + SH020183 BAL0201 -1. BAL0283 1. + SH020283 COST 644.8 TRAN0202 1. + SH020283 BAL0202 -1. BAL0283 1. + SH020383 COST 337.28 TRAN0203 1. + SH020383 BAL0203 -1. BAL0283 1. + SH020483 COST 73.16 TRAN0204 1. + SH020483 BAL0204 -1. BAL0283 1. + SH020583 COST 430.28 TRAN0205 1. + SH020583 BAL0205 -1. BAL0283 1. + SH020683 COST 307.52 TRAN0206 1. + SH020683 BAL0252 -1. BAL0283 1. + SH020184 COST 376.96 TRAN0201 1. + SH020184 BAL0201 -1. BAL0284 1. + SH020284 COST 238.08 TRAN0202 1. + SH020284 BAL0202 -1. BAL0284 1. + SH020384 COST 451.36 TRAN0203 1. + SH020384 BAL0203 -1. BAL0284 1. + SH020484 COST 458.8 TRAN0204 1. + SH020484 BAL0204 -1. BAL0284 1. + SH020584 COST 607.6 TRAN0205 1. + SH020584 BAL0205 -1. BAL0284 1. + SH020684 COST 378.2 TRAN0206 1. + SH020684 BAL0252 -1. BAL0284 1. + SH020884 COST 481.12 TRAN0208 1. + SH020884 BAL0283 -1. BAL0284 1. + SH030201 COST 368.28 TRAN0302 1. + SH030201 BAL0302 -1. BAL0301 1. + SH030301 COST 141.36 TRAN0303 1. + SH030301 BAL0303 -1. BAL0301 1. + SH030401 COST 257.92 TRAN0304 1. + SH030401 BAL0304 -1. BAL0301 1. + SH030501 COST 293.88 TRAN0305 1. + SH030501 BAL0305 -1. BAL0301 1. + SH030601 COST 156.24 TRAN0306 1. + SH030601 BAL0352 -1. BAL0301 1. + SH030801 COST 177.32 TRAN0308 1. + SH030801 BAL0383 -1. BAL0301 1. + SH030102 COST 587.76 TRAN0301 1. + SH030102 BAL0301 -1. BAL0302 1. + SH030302 COST 517.08 TRAN0303 1. + SH030302 BAL0303 -1. BAL0302 1. + SH030402 COST 758.88 TRAN0304 1. + SH030402 BAL0304 -1. BAL0302 1. + SH030502 COST 918.84 TRAN0305 1. + SH030502 BAL0305 -1. BAL0302 1. + SH030602 COST 468.72 TRAN0306 1. + SH030602 BAL0352 -1. BAL0302 1. + SH030802 COST 646.04 TRAN0308 1. + SH030802 BAL0383 -1. BAL0302 1. + SH030103 COST 303.8 TRAN0301 1. + SH030103 BAL0301 -1. BAL0303 1. + SH030203 COST 587.76 TRAN0302 1. + SH030203 BAL0302 -1. BAL0303 1. + SH030403 COST 455.08 TRAN0304 1. + SH030403 BAL0304 -1. BAL0303 1. + SH030503 COST 352.16 TRAN0305 1. + SH030503 BAL0305 -1. BAL0303 1. + SH030603 COST 111.6 TRAN0306 1. + SH030603 BAL0352 -1. BAL0303 1. + SH030803 COST 316.2 TRAN0308 1. + SH030803 BAL0383 -1. BAL0303 1. + SH030104 COST 215.76 TRAN0301 1. + SH030104 BAL0301 -1. BAL0304 1. + SH030204 COST 623.72 TRAN0302 1. + SH030204 BAL0302 -1. BAL0304 1. + SH030304 COST 301.32 TRAN0303 1. + SH030304 BAL0303 -1. BAL0304 1. + SH030504 COST 395.56 TRAN0305 1. + SH030504 BAL0305 -1. BAL0304 1. + SH030604 COST 303.8 TRAN0306 1. + SH030604 BAL0352 -1. BAL0304 1. + SH030704 COST 333.56 TRAN0307 1. + SH030704 BAL0364 -1. BAL0304 1. + SH030804 COST 71.92 TRAN0308 1. + SH030804 BAL0383 -1. BAL0304 1. + SH030105 COST 334.8 TRAN0301 1. + SH030105 BAL0301 -1. BAL0305 1. + SH030205 COST 639.84 TRAN0302 1. + SH030205 BAL0302 -1. BAL0305 1. + SH030305 COST 352.16 TRAN0303 1. + SH030305 BAL0303 -1. BAL0305 1. + SH030405 COST 353.4 TRAN0304 1. + SH030405 BAL0304 -1. BAL0305 1. + SH030605 COST 404.24 TRAN0306 1. + SH030605 BAL0352 -1. BAL0305 1. + SH030705 COST 414.16 TRAN0307 1. + SH030705 BAL0364 -1. BAL0305 1. + SH030805 COST 336.04 TRAN0308 1. + SH030805 BAL0383 -1. BAL0305 1. + SH030106 COST 246.76 TRAN0301 1. + SH030106 BAL0301 -1. BAL0306 1. + SH030206 COST 517.08 TRAN0302 1. + SH030206 BAL0302 -1. BAL0306 1. + SH030306 COST 264.12 TRAN0303 1. + SH030306 BAL0303 -1. BAL0306 1. + SH030406 COST 271.56 TRAN0304 1. + SH030406 BAL0304 -1. BAL0306 1. + SH030506 COST 312.48 TRAN0305 1. + SH030506 BAL0305 -1. BAL0306 1. + SH030606 COST 255.44 TRAN0306 1. + SH030606 BAL0352 -1. BAL0306 1. + SH030706 COST 248. TRAN0307 1. + SH030706 BAL0364 -1. BAL0306 1. + SH030806 COST 187.24 TRAN0308 1. + SH030806 BAL0383 -1. BAL0306 1. + SH030107 COST 26.04 TRAN0301 1. + SH030107 BAL0301 -1. BAL0307 1. + SH030207 COST 362.08 TRAN0302 1. + SH030207 BAL0302 -1. BAL0307 1. + SH030307 COST 153.76 TRAN0303 1. + SH030307 BAL0303 -1. BAL0307 1. + SH030407 COST 256.68 TRAN0304 1. + SH030407 BAL0304 -1. BAL0307 1. + SH030507 COST 283.96 TRAN0305 1. + SH030507 BAL0305 -1. BAL0307 1. + SH030607 COST 155. TRAN0306 1. + SH030607 BAL0352 -1. BAL0307 1. + SH030707 COST 287.68 TRAN0307 1. + SH030707 BAL0364 -1. BAL0307 1. + SH030807 COST 192.2 TRAN0308 1. + SH030807 BAL0383 -1. BAL0307 1. + SH030108 COST 81.84 TRAN0301 1. + SH030108 BAL0301 -1. BAL0308 1. + SH030208 COST 466.24 TRAN0302 1. + SH030208 BAL0302 -1. BAL0308 1. + SH030308 COST 174.84 TRAN0303 1. + SH030308 BAL0303 -1. BAL0308 1. + SH030408 COST 306.28 TRAN0304 1. + SH030408 BAL0304 -1. BAL0308 1. + SH030508 COST 225.68 TRAN0305 1. + SH030508 BAL0305 -1. BAL0308 1. + SH030608 COST 205.84 TRAN0306 1. + SH030608 BAL0352 -1. BAL0308 1. + SH030808 COST 231.88 TRAN0308 1. + SH030808 BAL0383 -1. BAL0308 1. + SH030109 COST 171.12 TRAN0301 1. + SH030109 BAL0301 -1. BAL0309 1. + SH030209 COST 474.92 TRAN0302 1. + SH030209 BAL0302 -1. BAL0309 1. + SH030309 COST 208.32 TRAN0303 1. + SH030309 BAL0303 -1. BAL0309 1. + SH030409 COST 313.72 TRAN0304 1. + SH030409 BAL0304 -1. BAL0309 1. + SH030509 COST 296.36 TRAN0305 1. + SH030509 BAL0305 -1. BAL0309 1. + SH030709 COST 243.04 TRAN0307 1. + SH030709 BAL0364 -1. BAL0309 1. + SH030809 COST 240.56 TRAN0308 1. + SH030809 BAL0383 -1. BAL0309 1. + SH030110 COST 306.28 TRAN0301 1. + SH030110 BAL0301 -1. BAL0310 1. + SH030210 COST 195.92 TRAN0302 1. + SH030210 BAL0302 -1. BAL0310 1. + SH030310 COST 297.6 TRAN0303 1. + SH030310 BAL0303 -1. BAL0310 1. + SH030410 COST 445.16 TRAN0304 1. + SH030410 BAL0304 -1. BAL0310 1. + SH030510 COST 477.4 TRAN0305 1. + SH030510 BAL0305 -1. BAL0310 1. + SH030610 COST 279. TRAN0306 1. + SH030610 BAL0352 -1. BAL0310 1. + SH030810 COST 378.2 TRAN0308 1. + SH030810 BAL0383 -1. BAL0310 1. + SH030111 COST 131.44 TRAN0301 1. + SH030111 BAL0301 -1. BAL0311 1. + SH030211 COST 613.8 TRAN0302 1. + SH030211 BAL0302 -1. BAL0311 1. + SH030311 COST 307.52 TRAN0303 1. + SH030311 BAL0303 -1. BAL0311 1. + SH030411 COST 172.36 TRAN0304 1. + SH030411 BAL0304 -1. BAL0311 1. + SH030511 COST 422.84 TRAN0305 1. + SH030511 BAL0305 -1. BAL0311 1. + SH030611 COST 243.04 TRAN0306 1. + SH030611 BAL0352 -1. BAL0311 1. + SH030811 COST 126.48 TRAN0308 1. + SH030811 BAL0383 -1. BAL0311 1. + SH030112 COST 109.12 TRAN0301 1. + SH030112 BAL0301 -1. BAL0312 1. + SH030212 COST 420.36 TRAN0302 1. + SH030212 BAL0302 -1. BAL0312 1. + SH030312 COST 181.04 TRAN0303 1. + SH030312 BAL0303 -1. BAL0312 1. + SH030412 COST 248. TRAN0304 1. + SH030412 BAL0304 -1. BAL0312 1. + SH030512 COST 331.08 TRAN0305 1. + SH030512 BAL0305 -1. BAL0312 1. + SH030612 COST 179.8 TRAN0306 1. + SH030612 BAL0352 -1. BAL0312 1. + SH030812 COST 181.04 TRAN0308 1. + SH030812 BAL0383 -1. BAL0312 1. + SH030114 COST 176.08 TRAN0301 1. + SH030114 BAL0301 -1. BAL0314 1. + SH030214 COST 510.88 TRAN0302 1. + SH030214 BAL0302 -1. BAL0314 1. + SH030314 COST 243.04 TRAN0303 1. + SH030314 BAL0303 -1. BAL0314 1. + SH030414 COST 246.76 TRAN0304 1. + SH030414 BAL0304 -1. BAL0314 1. + SH030514 COST 436.48 TRAN0305 1. + SH030514 BAL0305 -1. BAL0314 1. + SH030614 COST 233.12 TRAN0306 1. + SH030614 BAL0352 -1. BAL0314 1. + SH030814 COST 156.24 TRAN0308 1. + SH030814 BAL0383 -1. BAL0314 1. + SH030115 COST 375.72 TRAN0301 1. + SH030115 BAL0301 -1. BAL0315 1. + SH030215 COST 197.16 TRAN0302 1. + SH030215 BAL0302 -1. BAL0315 1. + SH030315 COST 290.16 TRAN0303 1. + SH030315 BAL0303 -1. BAL0315 1. + SH030415 COST 590.24 TRAN0304 1. + SH030415 BAL0304 -1. BAL0315 1. + SH030515 COST 493.52 TRAN0305 1. + SH030515 BAL0305 -1. BAL0315 1. + SH030615 COST 233.12 TRAN0306 1. + SH030615 BAL0352 -1. BAL0315 1. + SH030815 COST 462.52 TRAN0308 1. + SH030815 BAL0383 -1. BAL0315 1. + SH030116 COST 195.92 TRAN0301 1. + SH030116 BAL0301 -1. BAL0316 1. + SH030216 COST 347.2 TRAN0302 1. + SH030216 BAL0302 -1. BAL0316 1. + SH030316 COST 281.48 TRAN0303 1. + SH030316 BAL0303 -1. BAL0316 1. + SH030416 COST 355.88 TRAN0304 1. + SH030416 BAL0304 -1. BAL0316 1. + SH030516 COST 395.56 TRAN0305 1. + SH030516 BAL0305 -1. BAL0316 1. + SH030616 COST 162.44 TRAN0306 1. + SH030616 BAL0352 -1. BAL0316 1. + SH030816 COST 254.2 TRAN0308 1. + SH030816 BAL0383 -1. BAL0316 1. + SH030117 COST 187.24 TRAN0301 1. + SH030117 BAL0301 -1. BAL0317 1. + SH030217 COST 626.2 TRAN0302 1. + SH030217 BAL0302 -1. BAL0317 1. + SH030317 COST 339.76 TRAN0303 1. + SH030317 BAL0303 -1. BAL0317 1. + SH030417 COST 70.68 TRAN0304 1. + SH030417 BAL0304 -1. BAL0317 1. + SH030517 COST 369.52 TRAN0305 1. + SH030517 BAL0305 -1. BAL0317 1. + SH030717 COST 365.8 TRAN0307 1. + SH030717 BAL0364 -1. BAL0317 1. + SH030817 COST 33.48 TRAN0308 1. + SH030817 BAL0383 -1. BAL0317 1. + SH030118 COST 217. TRAN0301 1. + SH030118 BAL0301 -1. BAL0318 1. + SH030218 COST 447.64 TRAN0302 1. + SH030218 BAL0302 -1. BAL0318 1. + SH030318 COST 334.8 TRAN0303 1. + SH030318 BAL0303 -1. BAL0318 1. + SH030418 COST 190.96 TRAN0304 1. + SH030418 BAL0304 -1. BAL0318 1. + SH030518 COST 504.68 TRAN0305 1. + SH030518 BAL0305 -1. BAL0318 1. + SH030618 COST 436.48 TRAN0306 1. + SH030618 BAL0352 -1. BAL0318 1. + SH030818 COST 127.72 TRAN0308 1. + SH030818 BAL0383 -1. BAL0318 1. + SH030119 COST 307.52 TRAN0301 1. + SH030119 BAL0301 -1. BAL0319 1. + SH030219 COST 851.88 TRAN0302 1. + SH030219 BAL0302 -1. BAL0319 1. + SH030319 COST 393.08 TRAN0303 1. + SH030319 BAL0303 -1. BAL0319 1. + SH030419 COST 197.16 TRAN0304 1. + SH030419 BAL0304 -1. BAL0319 1. + SH030519 COST 257.92 TRAN0305 1. + SH030519 BAL0305 -1. BAL0319 1. + SH030619 COST 427.8 TRAN0306 1. + SH030619 BAL0352 -1. BAL0319 1. + SH030819 COST 122.76 TRAN0308 1. + SH030819 BAL0383 -1. BAL0319 1. + SH030120 COST 254.2 TRAN0301 1. + SH030120 BAL0301 -1. BAL0320 1. + SH030220 COST 846.92 TRAN0302 1. + SH030220 BAL0302 -1. BAL0320 1. + SH030320 COST 368.28 TRAN0303 1. + SH030320 BAL0303 -1. BAL0320 1. + SH030420 COST 140.12 TRAN0304 1. + SH030420 BAL0304 -1. BAL0320 1. + SH030520 COST 360.84 TRAN0305 1. + SH030520 BAL0305 -1. BAL0320 1. + SH030820 COST 156.24 TRAN0308 1. + SH030820 BAL0383 -1. BAL0320 1. + SH030121 COST 499.72 TRAN0301 1. + SH030121 BAL0301 -1. BAL0321 1. + SH030221 COST 456.32 TRAN0302 1. + SH030221 BAL0302 -1. BAL0321 1. + SH030321 COST 553.04 TRAN0303 1. + SH030321 BAL0303 -1. BAL0321 1. + SH030421 COST 396.8 TRAN0304 1. + SH030421 BAL0304 -1. BAL0321 1. + SH030521 COST 682. TRAN0305 1. + SH030521 BAL0305 -1. BAL0321 1. + SH030821 COST 396.8 TRAN0308 1. + SH030821 BAL0383 -1. BAL0321 1. + SH030122 COST 307.52 TRAN0301 1. + SH030122 BAL0301 -1. BAL0322 1. + SH030222 COST 716.72 TRAN0302 1. + SH030222 BAL0302 -1. BAL0322 1. + SH030322 COST 370.76 TRAN0303 1. + SH030322 BAL0303 -1. BAL0322 1. + SH030422 COST 277.76 TRAN0304 1. + SH030422 BAL0304 -1. BAL0322 1. + SH030522 COST 221.96 TRAN0305 1. + SH030522 BAL0305 -1. BAL0322 1. + SH030622 COST 384.4 TRAN0306 1. + SH030622 BAL0352 -1. BAL0322 1. + SH030822 COST 172.36 TRAN0308 1. + SH030822 BAL0383 -1. BAL0322 1. + SH030123 COST 290.16 TRAN0301 1. + SH030123 BAL0301 -1. BAL0323 1. + SH030223 COST 670.84 TRAN0302 1. + SH030223 BAL0302 -1. BAL0323 1. + SH030323 COST 355.88 TRAN0303 1. + SH030323 BAL0303 -1. BAL0323 1. + SH030423 COST 207.08 TRAN0304 1. + SH030423 BAL0304 -1. BAL0323 1. + SH030523 COST 205.84 TRAN0305 1. + SH030523 BAL0305 -1. BAL0323 1. + SH030823 COST 172.36 TRAN0308 1. + SH030823 BAL0383 -1. BAL0323 1. + SH030124 COST 1780.64 TRAN0301 1. + SH030124 BAL0301 -1. BAL0324 1. + SH030125 COST 479.88 TRAN0301 1. + SH030125 BAL0301 -1. BAL0325 1. + SH030225 COST 529.48 TRAN0302 1. + SH030225 BAL0302 -1. BAL0325 1. + SH030325 COST 633.64 TRAN0303 1. + SH030325 BAL0303 -1. BAL0325 1. + SH030425 COST 431.52 TRAN0304 1. + SH030425 BAL0304 -1. BAL0325 1. + SH030525 COST 701.84 TRAN0305 1. + SH030525 BAL0305 -1. BAL0325 1. + SH030625 COST 499.72 TRAN0306 1. + SH030625 BAL0352 -1. BAL0325 1. + SH030825 COST 378.2 TRAN0308 1. + SH030825 BAL0383 -1. BAL0325 1. + SH030426 COST 334.8 TRAN0304 1. + SH030426 BAL0304 -1. BAL0326 1. + SH030127 COST 290.16 TRAN0301 1. + SH030127 BAL0301 -1. BAL0327 1. + SH030227 COST 352.16 TRAN0302 1. + SH030227 BAL0302 -1. BAL0327 1. + SH030327 COST 358.36 TRAN0303 1. + SH030327 BAL0303 -1. BAL0327 1. + SH030427 COST 415.4 TRAN0304 1. + SH030427 BAL0304 -1. BAL0327 1. + SH030527 COST 468.72 TRAN0305 1. + SH030527 BAL0305 -1. BAL0327 1. + SH030627 COST 332.32 TRAN0306 1. + SH030627 BAL0352 -1. BAL0327 1. + SH030827 COST 312.48 TRAN0308 1. + SH030827 BAL0383 -1. BAL0327 1. + SH030128 COST 301.32 TRAN0301 1. + SH030128 BAL0301 -1. BAL0328 1. + SH030228 COST 705.56 TRAN0302 1. + SH030228 BAL0302 -1. BAL0328 1. + SH030328 COST 367.04 TRAN0303 1. + SH030328 BAL0303 -1. BAL0328 1. + SH030428 COST 365.8 TRAN0304 1. + SH030428 BAL0304 -1. BAL0328 1. + SH030528 COST 126.48 TRAN0305 1. + SH030528 BAL0305 -1. BAL0328 1. + SH030628 COST 323.64 TRAN0306 1. + SH030628 BAL0352 -1. BAL0328 1. + SH030728 COST 132.68 TRAN0307 1. + SH030728 BAL0364 -1. BAL0328 1. + SH030828 COST 314.96 TRAN0308 1. + SH030828 BAL0383 -1. BAL0328 1. + SH030129 COST 276.52 TRAN0301 1. + SH030129 BAL0301 -1. BAL0329 1. + SH030229 COST 575.36 TRAN0302 1. + SH030229 BAL0302 -1. BAL0329 1. + SH030329 COST 298.84 TRAN0303 1. + SH030329 BAL0303 -1. BAL0329 1. + SH030429 COST 246.76 TRAN0304 1. + SH030429 BAL0304 -1. BAL0329 1. + SH030529 COST 533.2 TRAN0305 1. + SH030529 BAL0305 -1. BAL0329 1. + SH030629 COST 323.64 TRAN0306 1. + SH030629 BAL0352 -1. BAL0329 1. + SH030829 COST 178.56 TRAN0308 1. + SH030829 BAL0383 -1. BAL0329 1. + SH030130 COST 577.84 TRAN0301 1. + SH030130 BAL0301 -1. BAL0330 1. + SH030230 COST 540.64 TRAN0302 1. + SH030230 BAL0302 -1. BAL0330 1. + SH030330 COST 648.52 TRAN0303 1. + SH030330 BAL0303 -1. BAL0330 1. + SH030430 COST 376.96 TRAN0304 1. + SH030430 BAL0304 -1. BAL0330 1. + SH030530 COST 553.04 TRAN0305 1. + SH030530 BAL0305 -1. BAL0330 1. + SH030830 COST 473.68 TRAN0308 1. + SH030830 BAL0383 -1. BAL0330 1. + SH030131 COST 137.64 TRAN0301 1. + SH030131 BAL0301 -1. BAL0331 1. + SH030231 COST 435.24 TRAN0302 1. + SH030231 BAL0302 -1. BAL0331 1. + SH030331 COST 136.4 TRAN0303 1. + SH030331 BAL0303 -1. BAL0331 1. + SH030431 COST 313.72 TRAN0304 1. + SH030431 BAL0304 -1. BAL0331 1. + SH030531 COST 380.68 TRAN0305 1. + SH030531 BAL0305 -1. BAL0331 1. + SH030631 COST 138.88 TRAN0306 1. + SH030631 BAL0352 -1. BAL0331 1. + SH030831 COST 276.52 TRAN0308 1. + SH030831 BAL0383 -1. BAL0331 1. + SH030132 COST 370.76 TRAN0301 1. + SH030132 BAL0301 -1. BAL0332 1. + SH030232 COST 592.72 TRAN0302 1. + SH030232 BAL0302 -1. BAL0332 1. + SH030332 COST 524.52 TRAN0303 1. + SH030332 BAL0303 -1. BAL0332 1. + SH030432 COST 194.68 TRAN0304 1. + SH030432 BAL0304 -1. BAL0332 1. + SH030532 COST 486.08 TRAN0305 1. + SH030532 BAL0305 -1. BAL0332 1. + SH030832 COST 223.2 TRAN0308 1. + SH030832 BAL0383 -1. BAL0332 1. + SH030133 COST 611.32 TRAN0301 1. + SH030133 BAL0301 -1. BAL0333 1. + SH030233 COST 496. TRAN0302 1. + SH030233 BAL0302 -1. BAL0333 1. + SH030333 COST 673.32 TRAN0303 1. + SH030333 BAL0303 -1. BAL0333 1. + SH030433 COST 551.8 TRAN0304 1. + SH030433 BAL0304 -1. BAL0333 1. + SH030533 COST 782.44 TRAN0305 1. + SH030533 BAL0305 -1. BAL0333 1. + SH030833 COST 472.44 TRAN0308 1. + SH030833 BAL0383 -1. BAL0333 1. + SH030134 COST 478.64 TRAN0301 1. + SH030134 BAL0301 -1. BAL0334 1. + SH030234 COST 812.2 TRAN0302 1. + SH030234 BAL0302 -1. BAL0334 1. + SH030334 COST 623.72 TRAN0303 1. + SH030334 BAL0303 -1. BAL0334 1. + SH030434 COST 261.64 TRAN0304 1. + SH030434 BAL0304 -1. BAL0334 1. + SH030534 COST 546.84 TRAN0305 1. + SH030534 BAL0305 -1. BAL0334 1. + SH030834 COST 326.12 TRAN0308 1. + SH030834 BAL0383 -1. BAL0334 1. + SH030135 COST 571.64 TRAN0301 1. + SH030135 BAL0301 -1. BAL0335 1. + SH030235 COST 551.8 TRAN0302 1. + SH030235 BAL0302 -1. BAL0335 1. + SH030335 COST 467.48 TRAN0303 1. + SH030335 BAL0303 -1. BAL0335 1. + SH030435 COST 151.28 TRAN0304 1. + SH030435 BAL0304 -1. BAL0335 1. + SH030535 COST 534.44 TRAN0305 1. + SH030535 BAL0305 -1. BAL0335 1. + SH030835 COST 291.4 TRAN0308 1. + SH030835 BAL0383 -1. BAL0335 1. + SH030136 COST 254.2 TRAN0301 1. + SH030136 BAL0301 -1. BAL0336 1. + SH030236 COST 555.52 TRAN0302 1. + SH030236 BAL0302 -1. BAL0336 1. + SH030336 COST 131.44 TRAN0303 1. + SH030336 BAL0303 -1. BAL0336 1. + SH030436 COST 458.8 TRAN0304 1. + SH030436 BAL0304 -1. BAL0336 1. + SH030536 COST 429.04 TRAN0305 1. + SH030536 BAL0305 -1. BAL0336 1. + SH030636 COST 136.4 TRAN0306 1. + SH030636 BAL0352 -1. BAL0336 1. + SH030836 COST 398.04 TRAN0308 1. + SH030836 BAL0383 -1. BAL0336 1. + SH030137 COST 114.08 TRAN0301 1. + SH030137 BAL0301 -1. BAL0337 1. + SH030237 COST 424.08 TRAN0302 1. + SH030237 BAL0302 -1. BAL0337 1. + SH030337 COST 195.92 TRAN0303 1. + SH030337 BAL0303 -1. BAL0337 1. + SH030437 COST 376.96 TRAN0304 1. + SH030437 BAL0304 -1. BAL0337 1. + SH030537 COST 225.68 TRAN0305 1. + SH030537 BAL0305 -1. BAL0337 1. + SH030637 COST 240.56 TRAN0306 1. + SH030637 BAL0352 -1. BAL0337 1. + SH030837 COST 312.48 TRAN0308 1. + SH030837 BAL0383 -1. BAL0337 1. + SH030138 COST 168.64 TRAN0301 1. + SH030138 BAL0301 -1. BAL0338 1. + SH030238 COST 302.56 TRAN0302 1. + SH030238 BAL0302 -1. BAL0338 1. + SH030338 COST 117.8 TRAN0303 1. + SH030338 BAL0303 -1. BAL0338 1. + SH030438 COST 381.92 TRAN0304 1. + SH030438 BAL0304 -1. BAL0338 1. + SH030538 COST 344.72 TRAN0305 1. + SH030538 BAL0305 -1. BAL0338 1. + SH030638 COST 48.36 TRAN0306 1. + SH030638 BAL0352 -1. BAL0338 1. + SH030738 COST 267.84 TRAN0307 1. + SH030738 BAL0364 -1. BAL0338 1. + SH030838 COST 293.88 TRAN0308 1. + SH030838 BAL0383 -1. BAL0338 1. + SH030139 COST 161.2 TRAN0301 1. + SH030139 BAL0301 -1. BAL0339 1. + SH030239 COST 420.36 TRAN0302 1. + SH030239 BAL0302 -1. BAL0339 1. + SH030339 COST 198.4 TRAN0303 1. + SH030339 BAL0303 -1. BAL0339 1. + SH030439 COST 308.76 TRAN0304 1. + SH030439 BAL0304 -1. BAL0339 1. + SH030539 COST 531.96 TRAN0305 1. + SH030539 BAL0305 -1. BAL0339 1. + SH030639 COST 252.96 TRAN0306 1. + SH030639 BAL0352 -1. BAL0339 1. + SH030839 COST 208.32 TRAN0308 1. + SH030839 BAL0383 -1. BAL0339 1. + SH030140 COST 204.6 TRAN0301 1. + SH030140 BAL0301 -1. BAL0340 1. + SH030240 COST 468.72 TRAN0302 1. + SH030240 BAL0302 -1. BAL0340 1. + SH030340 COST 127.72 TRAN0303 1. + SH030340 BAL0303 -1. BAL0340 1. + SH030440 COST 368.28 TRAN0304 1. + SH030440 BAL0304 -1. BAL0340 1. + SH030540 COST 274.04 TRAN0305 1. + SH030540 BAL0305 -1. BAL0340 1. + SH030640 COST 162.44 TRAN0306 1. + SH030640 BAL0352 -1. BAL0340 1. + SH030840 COST 339.76 TRAN0308 1. + SH030840 BAL0383 -1. BAL0340 1. + SH030141 COST 243.04 TRAN0301 1. + SH030141 BAL0301 -1. BAL0341 1. + SH030241 COST 372. TRAN0302 1. + SH030241 BAL0302 -1. BAL0341 1. + SH030341 COST 186. TRAN0303 1. + SH030341 BAL0303 -1. BAL0341 1. + SH030441 COST 401.76 TRAN0304 1. + SH030441 BAL0304 -1. BAL0341 1. + SH030541 COST 456.32 TRAN0305 1. + SH030541 BAL0305 -1. BAL0341 1. + SH030641 COST 124. TRAN0306 1. + SH030641 BAL0352 -1. BAL0341 1. + SH030841 COST 370.76 TRAN0308 1. + SH030841 BAL0383 -1. BAL0341 1. + SH030142 COST 111.6 TRAN0301 1. + SH030142 BAL0301 -1. BAL0342 1. + SH030242 COST 513.36 TRAN0302 1. + SH030242 BAL0302 -1. BAL0342 1. + SH030342 COST 198.4 TRAN0303 1. + SH030342 BAL0303 -1. BAL0342 1. + SH030442 COST 241.8 TRAN0304 1. + SH030442 BAL0304 -1. BAL0342 1. + SH030542 COST 447.64 TRAN0305 1. + SH030542 BAL0305 -1. BAL0342 1. + SH030642 COST 199.64 TRAN0306 1. + SH030642 BAL0352 -1. BAL0342 1. + SH030842 COST 188.48 TRAN0308 1. + SH030842 BAL0383 -1. BAL0342 1. + SH030143 COST 197.16 TRAN0301 1. + SH030143 BAL0301 -1. BAL0343 1. + SH030243 COST 489.8 TRAN0302 1. + SH030243 BAL0302 -1. BAL0343 1. + SH030343 COST 31. TRAN0303 1. + SH030343 BAL0303 -1. BAL0343 1. + SH030443 COST 367.04 TRAN0304 1. + SH030443 BAL0304 -1. BAL0343 1. + SH030543 COST 319.92 TRAN0305 1. + SH030543 BAL0305 -1. BAL0343 1. + SH030643 COST 124. TRAN0306 1. + SH030643 BAL0352 -1. BAL0343 1. + SH030743 COST 298.84 TRAN0307 1. + SH030743 BAL0364 -1. BAL0343 1. + SH030843 COST 336.04 TRAN0308 1. + SH030843 BAL0383 -1. BAL0343 1. + SH030144 COST 197.16 TRAN0301 1. + SH030144 BAL0301 -1. BAL0344 1. + SH030244 COST 469.96 TRAN0302 1. + SH030244 BAL0302 -1. BAL0344 1. + SH030344 COST 158.72 TRAN0303 1. + SH030344 BAL0303 -1. BAL0344 1. + SH030444 COST 386.88 TRAN0304 1. + SH030444 BAL0304 -1. BAL0344 1. + SH030544 COST 384.4 TRAN0305 1. + SH030544 BAL0305 -1. BAL0344 1. + SH030644 COST 110.36 TRAN0306 1. + SH030644 BAL0352 -1. BAL0344 1. + SH030844 COST 369.52 TRAN0308 1. + SH030844 BAL0383 -1. BAL0344 1. + SH030145 COST 213.28 TRAN0301 1. + SH030145 BAL0301 -1. BAL0345 1. + SH030245 COST 540.64 TRAN0302 1. + SH030245 BAL0302 -1. BAL0345 1. + SH030345 COST 199.64 TRAN0303 1. + SH030345 BAL0303 -1. BAL0345 1. + SH030445 COST 362.08 TRAN0304 1. + SH030445 BAL0304 -1. BAL0345 1. + SH030545 COST 290.16 TRAN0305 1. + SH030545 BAL0305 -1. BAL0345 1. + SH030645 COST 236.84 TRAN0306 1. + SH030645 BAL0352 -1. BAL0345 1. + SH030745 COST 244.28 TRAN0307 1. + SH030745 BAL0364 -1. BAL0345 1. + SH030845 COST 378.2 TRAN0308 1. + SH030845 BAL0383 -1. BAL0345 1. + SH030146 COST 303.8 TRAN0301 1. + SH030146 BAL0301 -1. BAL0346 1. + SH030246 COST 338.52 TRAN0302 1. + SH030246 BAL0302 -1. BAL0346 1. + SH030346 COST 274.04 TRAN0303 1. + SH030346 BAL0303 -1. BAL0346 1. + SH030446 COST 554.28 TRAN0304 1. + SH030446 BAL0304 -1. BAL0346 1. + SH030546 COST 533.2 TRAN0305 1. + SH030546 BAL0305 -1. BAL0346 1. + SH030646 COST 318.68 TRAN0306 1. + SH030646 BAL0352 -1. BAL0346 1. + SH030846 COST 555.52 TRAN0308 1. + SH030846 BAL0383 -1. BAL0346 1. + SH030147 COST 136.4 TRAN0301 1. + SH030147 BAL0301 -1. BAL0347 1. + SH030247 COST 462.52 TRAN0302 1. + SH030247 BAL0302 -1. BAL0347 1. + SH030347 COST 197.16 TRAN0303 1. + SH030347 BAL0303 -1. BAL0347 1. + SH030447 COST 339.76 TRAN0304 1. + SH030447 BAL0304 -1. BAL0347 1. + SH030547 COST 288.92 TRAN0305 1. + SH030547 BAL0305 -1. BAL0347 1. + SH030647 COST 179.8 TRAN0306 1. + SH030647 BAL0352 -1. BAL0347 1. + SH030847 COST 302.56 TRAN0308 1. + SH030847 BAL0383 -1. BAL0347 1. + SH030148 COST 117.8 TRAN0301 1. + SH030148 BAL0301 -1. BAL0348 1. + SH030248 COST 420.36 TRAN0302 1. + SH030248 BAL0302 -1. BAL0348 1. + SH030348 COST 169.88 TRAN0303 1. + SH030348 BAL0303 -1. BAL0348 1. + SH030448 COST 285.2 TRAN0304 1. + SH030448 BAL0304 -1. BAL0348 1. + SH030548 COST 306.28 TRAN0305 1. + SH030548 BAL0305 -1. BAL0348 1. + SH030648 COST 142.6 TRAN0306 1. + SH030648 BAL0352 -1. BAL0348 1. + SH030848 COST 241.8 TRAN0308 1. + SH030848 BAL0383 -1. BAL0348 1. + SH030149 COST 407.96 TRAN0301 1. + SH030149 BAL0301 -1. BAL0349 1. + SH030249 COST 663.4 TRAN0302 1. + SH030249 BAL0302 -1. BAL0349 1. + SH030349 COST 411.68 TRAN0303 1. + SH030349 BAL0303 -1. BAL0349 1. + SH030449 COST 472.44 TRAN0304 1. + SH030449 BAL0304 -1. BAL0349 1. + SH030549 COST 188.48 TRAN0305 1. + SH030549 BAL0305 -1. BAL0349 1. + SH030649 COST 419.12 TRAN0306 1. + SH030649 BAL0352 -1. BAL0349 1. + SH030749 COST 166.16 TRAN0307 1. + SH030749 BAL0364 -1. BAL0349 1. + SH030849 COST 505.92 TRAN0308 1. + SH030849 BAL0383 -1. BAL0349 1. + SH030150 COST 298.84 TRAN0301 1. + SH030150 BAL0301 -1. BAL0350 1. + SH030250 COST 758.88 TRAN0302 1. + SH030250 BAL0302 -1. BAL0350 1. + SH030350 COST 305.04 TRAN0303 1. + SH030350 BAL0303 -1. BAL0350 1. + SH030450 COST 452.6 TRAN0304 1. + SH030450 BAL0304 -1. BAL0350 1. + SH030550 COST 291.4 TRAN0305 1. + SH030550 BAL0305 -1. BAL0350 1. + SH030750 COST 169.88 TRAN0307 1. + SH030750 BAL0364 -1. BAL0350 1. + SH030850 COST 503.44 TRAN0308 1. + SH030850 BAL0383 -1. BAL0350 1. + SH030151 COST 411.68 TRAN0301 1. + SH030151 BAL0301 -1. BAL0351 1. + SH030251 COST 682. TRAN0302 1. + SH030251 BAL0302 -1. BAL0351 1. + SH030351 COST 422.84 TRAN0303 1. + SH030351 BAL0303 -1. BAL0351 1. + SH030451 COST 419.12 TRAN0304 1. + SH030451 BAL0304 -1. BAL0351 1. + SH030551 COST 152.52 TRAN0305 1. + SH030551 BAL0305 -1. BAL0351 1. + SH030751 COST 122.76 TRAN0307 1. + SH030751 BAL0364 -1. BAL0351 1. + SH030851 COST 530.72 TRAN0308 1. + SH030851 BAL0383 -1. BAL0351 1. + SH030152 COST 138.88 TRAN0301 1. + SH030152 BAL0301 -1. BAL0352 1. + SH030252 COST 372. TRAN0302 1. + SH030252 BAL0302 -1. BAL0352 1. + SH030352 COST 101.68 TRAN0303 1. + SH030352 BAL0303 -1. BAL0352 1. + SH030452 COST 399.28 TRAN0304 1. + SH030452 BAL0304 -1. BAL0352 1. + SH030552 COST 365.8 TRAN0305 1. + SH030552 BAL0305 -1. BAL0352 1. + SH030852 COST 313.72 TRAN0308 1. + SH030852 BAL0383 -1. BAL0352 1. + SH030153 COST 445.16 TRAN0301 1. + SH030153 BAL0301 -1. BAL0353 1. + SH030253 COST 788.64 TRAN0302 1. + SH030253 BAL0302 -1. BAL0353 1. + SH030353 COST 403. TRAN0303 1. + SH030353 BAL0303 -1. BAL0353 1. + SH030453 COST 510.88 TRAN0304 1. + SH030453 BAL0304 -1. BAL0353 1. + SH030553 COST 228.16 TRAN0305 1. + SH030553 BAL0305 -1. BAL0353 1. + SH030653 COST 445.16 TRAN0306 1. + SH030653 BAL0352 -1. BAL0353 1. + SH030753 COST 181.04 TRAN0307 1. + SH030753 BAL0364 -1. BAL0353 1. + SH030853 COST 499.72 TRAN0308 1. + SH030853 BAL0383 -1. BAL0353 1. + SH030154 COST 229.4 TRAN0301 1. + SH030154 BAL0301 -1. BAL0354 1. + SH030254 COST 551.8 TRAN0302 1. + SH030254 BAL0302 -1. BAL0354 1. + SH030354 COST 269.08 TRAN0303 1. + SH030354 BAL0303 -1. BAL0354 1. + SH030454 COST 425.32 TRAN0304 1. + SH030454 BAL0304 -1. BAL0354 1. + SH030554 COST 264.12 TRAN0305 1. + SH030554 BAL0305 -1. BAL0354 1. + SH030654 COST 251.72 TRAN0306 1. + SH030654 BAL0352 -1. BAL0354 1. + SH030854 COST 498.48 TRAN0308 1. + SH030854 BAL0383 -1. BAL0354 1. + SH030155 COST 344.72 TRAN0301 1. + SH030155 BAL0301 -1. BAL0355 1. + SH030255 COST 593.96 TRAN0302 1. + SH030255 BAL0302 -1. BAL0355 1. + SH030355 COST 348.44 TRAN0303 1. + SH030355 BAL0303 -1. BAL0355 1. + SH030455 COST 364.56 TRAN0304 1. + SH030455 BAL0304 -1. BAL0355 1. + SH030555 COST 190.96 TRAN0305 1. + SH030555 BAL0305 -1. BAL0355 1. + SH030655 COST 359.6 TRAN0306 1. + SH030655 BAL0352 -1. BAL0355 1. + SH030755 COST 132.68 TRAN0307 1. + SH030755 BAL0364 -1. BAL0355 1. + SH030855 COST 364.56 TRAN0308 1. + SH030855 BAL0383 -1. BAL0355 1. + SH030156 COST 483.6 TRAN0301 1. + SH030156 BAL0301 -1. BAL0356 1. + SH030256 COST 717.96 TRAN0302 1. + SH030256 BAL0302 -1. BAL0356 1. + SH030356 COST 378.2 TRAN0303 1. + SH030356 BAL0303 -1. BAL0356 1. + SH030456 COST 452.6 TRAN0304 1. + SH030456 BAL0304 -1. BAL0356 1. + SH030556 COST 168.64 TRAN0305 1. + SH030556 BAL0305 -1. BAL0356 1. + SH030656 COST 420.36 TRAN0306 1. + SH030656 BAL0352 -1. BAL0356 1. + SH030756 COST 151.28 TRAN0307 1. + SH030756 BAL0364 -1. BAL0356 1. + SH030856 COST 442.68 TRAN0308 1. + SH030856 BAL0383 -1. BAL0356 1. + SH030157 COST 323.64 TRAN0301 1. + SH030157 BAL0301 -1. BAL0357 1. + SH030257 COST 644.8 TRAN0302 1. + SH030257 BAL0302 -1. BAL0357 1. + SH030357 COST 359.6 TRAN0303 1. + SH030357 BAL0303 -1. BAL0357 1. + SH030457 COST 290.16 TRAN0304 1. + SH030457 BAL0304 -1. BAL0357 1. + SH030557 COST 208.32 TRAN0305 1. + SH030557 BAL0305 -1. BAL0357 1. + SH030657 COST 395.56 TRAN0306 1. + SH030657 BAL0352 -1. BAL0357 1. + SH030757 COST 183.52 TRAN0307 1. + SH030757 BAL0364 -1. BAL0357 1. + SH030857 COST 286.44 TRAN0308 1. + SH030857 BAL0383 -1. BAL0357 1. + SH030158 COST 364.56 TRAN0301 1. + SH030158 BAL0301 -1. BAL0358 1. + SH030258 COST 646.04 TRAN0302 1. + SH030258 BAL0302 -1. BAL0358 1. + SH030358 COST 344.72 TRAN0303 1. + SH030358 BAL0303 -1. BAL0358 1. + SH030458 COST 425.32 TRAN0304 1. + SH030458 BAL0304 -1. BAL0358 1. + SH030558 COST 26.04 TRAN0305 1. + SH030558 BAL0305 -1. BAL0358 1. + SH030658 COST 404.24 TRAN0306 1. + SH030658 BAL0352 -1. BAL0358 1. + SH030758 COST 84.32 TRAN0307 1. + SH030758 BAL0364 -1. BAL0358 1. + SH030858 COST 314.96 TRAN0308 1. + SH030858 BAL0383 -1. BAL0358 1. + SH030159 COST 255.44 TRAN0301 1. + SH030159 BAL0301 -1. BAL0359 1. + SH030259 COST 617.52 TRAN0302 1. + SH030259 BAL0302 -1. BAL0359 1. + SH030359 COST 295.12 TRAN0303 1. + SH030359 BAL0303 -1. BAL0359 1. + SH030459 COST 302.56 TRAN0304 1. + SH030459 BAL0304 -1. BAL0359 1. + SH030559 COST 197.16 TRAN0305 1. + SH030559 BAL0305 -1. BAL0359 1. + SH030659 COST 368.28 TRAN0306 1. + SH030659 BAL0352 -1. BAL0359 1. + SH030759 COST 130.2 TRAN0307 1. + SH030759 BAL0364 -1. BAL0359 1. + SH030859 COST 316.2 TRAN0308 1. + SH030859 BAL0383 -1. BAL0359 1. + SH030160 COST 323.64 TRAN0301 1. + SH030160 BAL0301 -1. BAL0360 1. + SH030260 COST 682. TRAN0302 1. + SH030260 BAL0302 -1. BAL0360 1. + SH030360 COST 350.92 TRAN0303 1. + SH030360 BAL0303 -1. BAL0360 1. + SH030460 COST 386.88 TRAN0304 1. + SH030460 BAL0304 -1. BAL0360 1. + SH030560 COST 167.4 TRAN0305 1. + SH030560 BAL0305 -1. BAL0360 1. + SH030660 COST 400.52 TRAN0306 1. + SH030660 BAL0352 -1. BAL0360 1. + SH030760 COST 109.12 TRAN0307 1. + SH030760 BAL0364 -1. BAL0360 1. + SH030860 COST 370.76 TRAN0308 1. + SH030860 BAL0383 -1. BAL0360 1. + SH030163 COST 329.84 TRAN0301 1. + SH030163 BAL0301 -1. BAL0363 1. + SH030263 COST 612.56 TRAN0302 1. + SH030263 BAL0302 -1. BAL0363 1. + SH030363 COST 355.88 TRAN0303 1. + SH030363 BAL0303 -1. BAL0363 1. + SH030463 COST 457.56 TRAN0304 1. + SH030463 BAL0304 -1. BAL0363 1. + SH030563 COST 188.48 TRAN0305 1. + SH030563 BAL0305 -1. BAL0363 1. + SH030663 COST 390.6 TRAN0306 1. + SH030663 BAL0352 -1. BAL0363 1. + SH030763 COST 153.76 TRAN0307 1. + SH030763 BAL0364 -1. BAL0363 1. + SH030863 COST 496. TRAN0308 1. + SH030863 BAL0383 -1. BAL0363 1. + SH030164 COST 246.76 TRAN0301 1. + SH030164 BAL0301 -1. BAL0364 1. + SH030264 COST 652.24 TRAN0302 1. + SH030264 BAL0302 -1. BAL0364 1. + SH030364 COST 276.52 TRAN0303 1. + SH030364 BAL0303 -1. BAL0364 1. + SH030464 COST 416.64 TRAN0304 1. + SH030464 BAL0304 -1. BAL0364 1. + SH030564 COST 71.92 TRAN0305 1. + SH030564 BAL0305 -1. BAL0364 1. + SH030664 COST 393.08 TRAN0306 1. + SH030664 BAL0352 -1. BAL0364 1. + SH030864 COST 310. TRAN0308 1. + SH030864 BAL0383 -1. BAL0364 1. + SH030165 COST 535.68 TRAN0301 1. + SH030165 BAL0301 -1. BAL0365 1. + SH030265 COST 380.68 TRAN0302 1. + SH030265 BAL0302 -1. BAL0365 1. + SH030365 COST 626.2 TRAN0303 1. + SH030365 BAL0303 -1. BAL0365 1. + SH030465 COST 481.12 TRAN0304 1. + SH030465 BAL0304 -1. BAL0365 1. + SH030565 COST 748.96 TRAN0305 1. + SH030565 BAL0305 -1. BAL0365 1. + SH030865 COST 514.6 TRAN0308 1. + SH030865 BAL0383 -1. BAL0365 1. + SH030166 COST 694.4 TRAN0301 1. + SH030166 BAL0301 -1. BAL0366 1. + SH030266 COST 321.16 TRAN0302 1. + SH030266 BAL0302 -1. BAL0366 1. + SH030366 COST 716.72 TRAN0303 1. + SH030366 BAL0303 -1. BAL0366 1. + SH030466 COST 689.44 TRAN0304 1. + SH030466 BAL0304 -1. BAL0366 1. + SH030566 COST 880.4 TRAN0305 1. + SH030566 BAL0305 -1. BAL0366 1. + SH030866 COST 694.4 TRAN0308 1. + SH030866 BAL0383 -1. BAL0366 1. + SH030167 COST 527. TRAN0301 1. + SH030167 BAL0301 -1. BAL0367 1. + SH030267 COST 287.68 TRAN0302 1. + SH030267 BAL0302 -1. BAL0367 1. + SH030367 COST 611.32 TRAN0303 1. + SH030367 BAL0303 -1. BAL0367 1. + SH030467 COST 566.68 TRAN0304 1. + SH030467 BAL0304 -1. BAL0367 1. + SH030567 COST 748.96 TRAN0305 1. + SH030567 BAL0305 -1. BAL0367 1. + SH030867 COST 567.92 TRAN0308 1. + SH030867 BAL0383 -1. BAL0367 1. + SH030168 COST 736.56 TRAN0301 1. + SH030168 BAL0301 -1. BAL0368 1. + SH030268 COST 496. TRAN0302 1. + SH030268 BAL0302 -1. BAL0368 1. + SH030368 COST 694.4 TRAN0303 1. + SH030368 BAL0303 -1. BAL0368 1. + SH030468 COST 870.48 TRAN0304 1. + SH030468 BAL0304 -1. BAL0368 1. + SH030568 COST 1173.04 TRAN0305 1. + SH030568 BAL0305 -1. BAL0368 1. + SH030868 COST 931.24 TRAN0308 1. + SH030868 BAL0383 -1. BAL0368 1. + SH030169 COST 668.36 TRAN0301 1. + SH030169 BAL0301 -1. BAL0369 1. + SH030269 COST 274.04 TRAN0302 1. + SH030269 BAL0302 -1. BAL0369 1. + SH030369 COST 632.4 TRAN0303 1. + SH030369 BAL0303 -1. BAL0369 1. + SH030469 COST 771.28 TRAN0304 1. + SH030469 BAL0304 -1. BAL0369 1. + SH030569 COST 801.04 TRAN0305 1. + SH030569 BAL0305 -1. BAL0369 1. + SH030869 COST 815.92 TRAN0308 1. + SH030869 BAL0383 -1. BAL0369 1. + SH030171 COST 545.6 TRAN0301 1. + SH030171 BAL0301 -1. BAL0371 1. + SH030371 COST 649.76 TRAN0303 1. + SH030371 BAL0303 -1. BAL0371 1. + SH030471 COST 646.04 TRAN0304 1. + SH030471 BAL0304 -1. BAL0371 1. + SH030571 COST 720.44 TRAN0305 1. + SH030571 BAL0305 -1. BAL0371 1. + SH030671 COST 484.84 TRAN0306 1. + SH030671 BAL0352 -1. BAL0371 1. + SH030771 COST 872.96 TRAN0307 1. + SH030771 BAL0364 -1. BAL0371 1. + SH030871 COST 660.92 TRAN0308 1. + SH030871 BAL0383 -1. BAL0371 1. + SH030172 COST 727.88 TRAN0301 1. + SH030172 BAL0301 -1. BAL0372 1. + SH030272 COST 673.32 TRAN0302 1. + SH030272 BAL0302 -1. BAL0372 1. + SH030372 COST 765.08 TRAN0303 1. + SH030372 BAL0303 -1. BAL0372 1. + SH030472 COST 706.8 TRAN0304 1. + SH030472 BAL0304 -1. BAL0372 1. + SH030572 COST 946.12 TRAN0305 1. + SH030572 BAL0305 -1. BAL0372 1. + SH030872 COST 706.8 TRAN0308 1. + SH030872 BAL0383 -1. BAL0372 1. + SH030173 COST 483.6 TRAN0301 1. + SH030173 BAL0301 -1. BAL0373 1. + SH030273 COST 452.6 TRAN0302 1. + SH030273 BAL0302 -1. BAL0373 1. + SH030373 COST 419.12 TRAN0303 1. + SH030373 BAL0303 -1. BAL0373 1. + SH030473 COST 566.68 TRAN0304 1. + SH030473 BAL0304 -1. BAL0373 1. + SH030573 COST 699.36 TRAN0305 1. + SH030573 BAL0305 -1. BAL0373 1. + SH030673 COST 378.2 TRAN0306 1. + SH030673 BAL0352 -1. BAL0373 1. + SH030873 COST 624.96 TRAN0308 1. + SH030873 BAL0383 -1. BAL0373 1. + SH030174 COST 679.52 TRAN0301 1. + SH030174 BAL0301 -1. BAL0374 1. + SH030274 COST 260.4 TRAN0302 1. + SH030274 BAL0302 -1. BAL0374 1. + SH030374 COST 706.8 TRAN0303 1. + SH030374 BAL0303 -1. BAL0374 1. + SH030474 COST 789.88 TRAN0304 1. + SH030474 BAL0304 -1. BAL0374 1. + SH030574 COST 908.92 TRAN0305 1. + SH030574 BAL0305 -1. BAL0374 1. + SH030874 COST 767.56 TRAN0308 1. + SH030874 BAL0383 -1. BAL0374 1. + SH030275 COST 686.96 TRAN0302 1. + SH030275 BAL0302 -1. BAL0375 1. + SH030176 COST 572.88 TRAN0301 1. + SH030176 BAL0301 -1. BAL0376 1. + SH030276 COST 497.24 TRAN0302 1. + SH030276 BAL0302 -1. BAL0376 1. + SH030376 COST 499.72 TRAN0303 1. + SH030376 BAL0303 -1. BAL0376 1. + SH030476 COST 781.2 TRAN0304 1. + SH030476 BAL0304 -1. BAL0376 1. + SH030576 COST 781.2 TRAN0305 1. + SH030576 BAL0305 -1. BAL0376 1. + SH030676 COST 472.44 TRAN0306 1. + SH030676 BAL0352 -1. BAL0376 1. + SH030876 COST 963.48 TRAN0308 1. + SH030876 BAL0383 -1. BAL0376 1. + SH030177 COST 539.4 TRAN0301 1. + SH030177 BAL0301 -1. BAL0377 1. + SH030277 COST 337.28 TRAN0302 1. + SH030277 BAL0302 -1. BAL0377 1. + SH030377 COST 571.64 TRAN0303 1. + SH030377 BAL0303 -1. BAL0377 1. + SH030477 COST 497.24 TRAN0304 1. + SH030477 BAL0304 -1. BAL0377 1. + SH030577 COST 694.4 TRAN0305 1. + SH030577 BAL0305 -1. BAL0377 1. + SH030877 COST 396.8 TRAN0308 1. + SH030877 BAL0383 -1. BAL0377 1. + SH030178 COST 943.64 TRAN0301 1. + SH030178 BAL0301 -1. BAL0378 1. + SH030278 COST 548.08 TRAN0302 1. + SH030278 BAL0302 -1. BAL0378 1. + SH030378 COST 970.92 TRAN0303 1. + SH030378 BAL0303 -1. BAL0378 1. + SH030478 COST 849.4 TRAN0304 1. + SH030478 BAL0304 -1. BAL0378 1. + SH030578 COST 1089.96 TRAN0305 1. + SH030578 BAL0305 -1. BAL0378 1. + SH030878 COST 949.84 TRAN0308 1. + SH030878 BAL0383 -1. BAL0378 1. + SH030179 COST 886.6 TRAN0301 1. + SH030179 BAL0301 -1. BAL0379 1. + SH030279 COST 333.56 TRAN0302 1. + SH030279 BAL0302 -1. BAL0379 1. + SH030379 COST 856.84 TRAN0303 1. + SH030379 BAL0303 -1. BAL0379 1. + SH030479 COST 892.8 TRAN0304 1. + SH030479 BAL0304 -1. BAL0379 1. + SH030879 COST 875.44 TRAN0308 1. + SH030879 BAL0383 -1. BAL0379 1. + SH030180 COST 393.08 TRAN0301 1. + SH030180 BAL0301 -1. BAL0380 1. + SH030280 COST 489.8 TRAN0302 1. + SH030280 BAL0302 -1. BAL0380 1. + SH030380 COST 541.88 TRAN0303 1. + SH030380 BAL0303 -1. BAL0380 1. + SH030480 COST 463.76 TRAN0304 1. + SH030480 BAL0304 -1. BAL0380 1. + SH030580 COST 626.2 TRAN0305 1. + SH030580 BAL0305 -1. BAL0380 1. + SH030880 COST 297.6 TRAN0308 1. + SH030880 BAL0383 -1. BAL0380 1. + SH030182 COST 721.68 TRAN0301 1. + SH030182 BAL0301 -1. BAL0382 1. + SH030282 COST 407.96 TRAN0302 1. + SH030282 BAL0302 -1. BAL0382 1. + SH030382 COST 812.2 TRAN0303 1. + SH030382 BAL0303 -1. BAL0382 1. + SH030482 COST 875.44 TRAN0304 1. + SH030482 BAL0304 -1. BAL0382 1. + SH030582 COST 1422.28 TRAN0305 1. + SH030582 BAL0305 -1. BAL0382 1. + SH030882 COST 970.92 TRAN0308 1. + SH030882 BAL0383 -1. BAL0382 1. + SH030183 COST 219.48 TRAN0301 1. + SH030183 BAL0301 -1. BAL0383 1. + SH030283 COST 644.8 TRAN0302 1. + SH030283 BAL0302 -1. BAL0383 1. + SH030383 COST 337.28 TRAN0303 1. + SH030383 BAL0303 -1. BAL0383 1. + SH030483 COST 73.16 TRAN0304 1. + SH030483 BAL0304 -1. BAL0383 1. + SH030583 COST 430.28 TRAN0305 1. + SH030583 BAL0305 -1. BAL0383 1. + SH030683 COST 307.52 TRAN0306 1. + SH030683 BAL0352 -1. BAL0383 1. + SH030184 COST 376.96 TRAN0301 1. + SH030184 BAL0301 -1. BAL0384 1. + SH030284 COST 238.08 TRAN0302 1. + SH030284 BAL0302 -1. BAL0384 1. + SH030384 COST 451.36 TRAN0303 1. + SH030384 BAL0303 -1. BAL0384 1. + SH030484 COST 458.8 TRAN0304 1. + SH030484 BAL0304 -1. BAL0384 1. + SH030584 COST 607.6 TRAN0305 1. + SH030584 BAL0305 -1. BAL0384 1. + SH030684 COST 378.2 TRAN0306 1. + SH030684 BAL0352 -1. BAL0384 1. + SH030884 COST 481.12 TRAN0308 1. + SH030884 BAL0383 -1. BAL0384 1. + SH040201 COST 299.97 TRAN0402 1. + SH040201 BAL0402 -1. BAL0401 1. + SH040301 COST 115.14 TRAN0403 1. + SH040301 BAL0403 -1. BAL0401 1. + SH040401 COST 210.08 TRAN0404 1. + SH040401 BAL0404 -1. BAL0401 1. + SH040501 COST 239.37 TRAN0405 1. + SH040501 BAL0405 -1. BAL0401 1. + SH040601 COST 127.26 TRAN0406 1. + SH040601 BAL0452 -1. BAL0401 1. + SH040801 COST 144.43 TRAN0408 1. + SH040801 BAL0483 -1. BAL0401 1. + SH040102 COST 478.74 TRAN0401 1. + SH040102 BAL0401 -1. BAL0402 1. + SH040302 COST 421.17 TRAN0403 1. + SH040302 BAL0403 -1. BAL0402 1. + SH040402 COST 618.12 TRAN0404 1. + SH040402 BAL0404 -1. BAL0402 1. + SH040502 COST 748.41 TRAN0405 1. + SH040502 BAL0405 -1. BAL0402 1. + SH040602 COST 381.78 TRAN0406 1. + SH040602 BAL0452 -1. BAL0402 1. + SH040802 COST 526.21 TRAN0408 1. + SH040802 BAL0483 -1. BAL0402 1. + SH040103 COST 247.45 TRAN0401 1. + SH040103 BAL0401 -1. BAL0403 1. + SH040203 COST 478.74 TRAN0402 1. + SH040203 BAL0402 -1. BAL0403 1. + SH040403 COST 370.67 TRAN0404 1. + SH040403 BAL0404 -1. BAL0403 1. + SH040503 COST 286.84 TRAN0405 1. + SH040503 BAL0405 -1. BAL0403 1. + SH040603 COST 90.9 TRAN0406 1. + SH040603 BAL0452 -1. BAL0403 1. + SH040803 COST 257.55 TRAN0408 1. + SH040803 BAL0483 -1. BAL0403 1. + SH040104 COST 175.74 TRAN0401 1. + SH040104 BAL0401 -1. BAL0404 1. + SH040204 COST 508.03 TRAN0402 1. + SH040204 BAL0402 -1. BAL0404 1. + SH040304 COST 245.43 TRAN0403 1. + SH040304 BAL0403 -1. BAL0404 1. + SH040504 COST 322.19 TRAN0405 1. + SH040504 BAL0405 -1. BAL0404 1. + SH040604 COST 247.45 TRAN0406 1. + SH040604 BAL0452 -1. BAL0404 1. + SH040704 COST 271.69 TRAN0407 1. + SH040704 BAL0464 -1. BAL0404 1. + SH040804 COST 58.58 TRAN0408 1. + SH040804 BAL0483 -1. BAL0404 1. + SH040105 COST 272.7 TRAN0401 1. + SH040105 BAL0401 -1. BAL0405 1. + SH040205 COST 521.16 TRAN0402 1. + SH040205 BAL0402 -1. BAL0405 1. + SH040305 COST 286.84 TRAN0403 1. + SH040305 BAL0403 -1. BAL0405 1. + SH040405 COST 287.85 TRAN0404 1. + SH040405 BAL0404 -1. BAL0405 1. + SH040605 COST 329.26 TRAN0406 1. + SH040605 BAL0452 -1. BAL0405 1. + SH040705 COST 337.34 TRAN0407 1. + SH040705 BAL0464 -1. BAL0405 1. + SH040805 COST 273.71 TRAN0408 1. + SH040805 BAL0483 -1. BAL0405 1. + SH040106 COST 200.99 TRAN0401 1. + SH040106 BAL0401 -1. BAL0406 1. + SH040206 COST 421.17 TRAN0402 1. + SH040206 BAL0402 -1. BAL0406 1. + SH040306 COST 215.13 TRAN0403 1. + SH040306 BAL0403 -1. BAL0406 1. + SH040406 COST 221.19 TRAN0404 1. + SH040406 BAL0404 -1. BAL0406 1. + SH040506 COST 254.52 TRAN0405 1. + SH040506 BAL0405 -1. BAL0406 1. + SH040606 COST 208.06 TRAN0406 1. + SH040606 BAL0452 -1. BAL0406 1. + SH040706 COST 202. TRAN0407 1. + SH040706 BAL0464 -1. BAL0406 1. + SH040806 COST 152.51 TRAN0408 1. + SH040806 BAL0483 -1. BAL0406 1. + SH040107 COST 21.21 TRAN0401 1. + SH040107 BAL0401 -1. BAL0407 1. + SH040207 COST 294.92 TRAN0402 1. + SH040207 BAL0402 -1. BAL0407 1. + SH040307 COST 125.24 TRAN0403 1. + SH040307 BAL0403 -1. BAL0407 1. + SH040407 COST 209.07 TRAN0404 1. + SH040407 BAL0404 -1. BAL0407 1. + SH040507 COST 231.29 TRAN0405 1. + SH040507 BAL0405 -1. BAL0407 1. + SH040607 COST 126.25 TRAN0406 1. + SH040607 BAL0452 -1. BAL0407 1. + SH040707 COST 234.32 TRAN0407 1. + SH040707 BAL0464 -1. BAL0407 1. + SH040807 COST 156.55 TRAN0408 1. + SH040807 BAL0483 -1. BAL0407 1. + SH040108 COST 66.66 TRAN0401 1. + SH040108 BAL0401 -1. BAL0408 1. + SH040208 COST 379.76 TRAN0402 1. + SH040208 BAL0402 -1. BAL0408 1. + SH040308 COST 142.41 TRAN0403 1. + SH040308 BAL0403 -1. BAL0408 1. + SH040408 COST 249.47 TRAN0404 1. + SH040408 BAL0404 -1. BAL0408 1. + SH040508 COST 183.82 TRAN0405 1. + SH040508 BAL0405 -1. BAL0408 1. + SH040608 COST 167.66 TRAN0406 1. + SH040608 BAL0452 -1. BAL0408 1. + SH040808 COST 188.87 TRAN0408 1. + SH040808 BAL0483 -1. BAL0408 1. + SH040109 COST 139.38 TRAN0401 1. + SH040109 BAL0401 -1. BAL0409 1. + SH040209 COST 386.83 TRAN0402 1. + SH040209 BAL0402 -1. BAL0409 1. + SH040309 COST 169.68 TRAN0403 1. + SH040309 BAL0403 -1. BAL0409 1. + SH040409 COST 255.53 TRAN0404 1. + SH040409 BAL0404 -1. BAL0409 1. + SH040509 COST 241.39 TRAN0405 1. + SH040509 BAL0405 -1. BAL0409 1. + SH040709 COST 197.96 TRAN0407 1. + SH040709 BAL0464 -1. BAL0409 1. + SH040809 COST 195.94 TRAN0408 1. + SH040809 BAL0483 -1. BAL0409 1. + SH040110 COST 249.47 TRAN0401 1. + SH040110 BAL0401 -1. BAL0410 1. + SH040210 COST 159.58 TRAN0402 1. + SH040210 BAL0402 -1. BAL0410 1. + SH040310 COST 242.4 TRAN0403 1. + SH040310 BAL0403 -1. BAL0410 1. + SH040410 COST 362.59 TRAN0404 1. + SH040410 BAL0404 -1. BAL0410 1. + SH040510 COST 388.85 TRAN0405 1. + SH040510 BAL0405 -1. BAL0410 1. + SH040610 COST 227.25 TRAN0406 1. + SH040610 BAL0452 -1. BAL0410 1. + SH040810 COST 308.05 TRAN0408 1. + SH040810 BAL0483 -1. BAL0410 1. + SH040111 COST 107.06 TRAN0401 1. + SH040111 BAL0401 -1. BAL0411 1. + SH040211 COST 499.95 TRAN0402 1. + SH040211 BAL0402 -1. BAL0411 1. + SH040311 COST 250.48 TRAN0403 1. + SH040311 BAL0403 -1. BAL0411 1. + SH040411 COST 140.39 TRAN0404 1. + SH040411 BAL0404 -1. BAL0411 1. + SH040511 COST 344.41 TRAN0405 1. + SH040511 BAL0405 -1. BAL0411 1. + SH040611 COST 197.96 TRAN0406 1. + SH040611 BAL0452 -1. BAL0411 1. + SH040811 COST 103.02 TRAN0408 1. + SH040811 BAL0483 -1. BAL0411 1. + SH040112 COST 88.88 TRAN0401 1. + SH040112 BAL0401 -1. BAL0412 1. + SH040212 COST 342.39 TRAN0402 1. + SH040212 BAL0402 -1. BAL0412 1. + SH040312 COST 147.46 TRAN0403 1. + SH040312 BAL0403 -1. BAL0412 1. + SH040412 COST 202. TRAN0404 1. + SH040412 BAL0404 -1. BAL0412 1. + SH040512 COST 269.67 TRAN0405 1. + SH040512 BAL0405 -1. BAL0412 1. + SH040612 COST 146.45 TRAN0406 1. + SH040612 BAL0452 -1. BAL0412 1. + SH040812 COST 147.46 TRAN0408 1. + SH040812 BAL0483 -1. BAL0412 1. + SH040114 COST 143.42 TRAN0401 1. + SH040114 BAL0401 -1. BAL0414 1. + SH040214 COST 416.12 TRAN0402 1. + SH040214 BAL0402 -1. BAL0414 1. + SH040314 COST 197.96 TRAN0403 1. + SH040314 BAL0403 -1. BAL0414 1. + SH040414 COST 200.99 TRAN0404 1. + SH040414 BAL0404 -1. BAL0414 1. + SH040514 COST 355.52 TRAN0405 1. + SH040514 BAL0405 -1. BAL0414 1. + SH040614 COST 189.88 TRAN0406 1. + SH040614 BAL0452 -1. BAL0414 1. + SH040814 COST 127.26 TRAN0408 1. + SH040814 BAL0483 -1. BAL0414 1. + SH040115 COST 306.03 TRAN0401 1. + SH040115 BAL0401 -1. BAL0415 1. + SH040215 COST 160.59 TRAN0402 1. + SH040215 BAL0402 -1. BAL0415 1. + SH040315 COST 236.34 TRAN0403 1. + SH040315 BAL0403 -1. BAL0415 1. + SH040415 COST 480.76 TRAN0404 1. + SH040415 BAL0404 -1. BAL0415 1. + SH040515 COST 401.98 TRAN0405 1. + SH040515 BAL0405 -1. BAL0415 1. + SH040615 COST 189.88 TRAN0406 1. + SH040615 BAL0452 -1. BAL0415 1. + SH040815 COST 376.73 TRAN0408 1. + SH040815 BAL0483 -1. BAL0415 1. + SH040116 COST 159.58 TRAN0401 1. + SH040116 BAL0401 -1. BAL0416 1. + SH040216 COST 282.8 TRAN0402 1. + SH040216 BAL0402 -1. BAL0416 1. + SH040316 COST 229.27 TRAN0403 1. + SH040316 BAL0403 -1. BAL0416 1. + SH040416 COST 289.87 TRAN0404 1. + SH040416 BAL0404 -1. BAL0416 1. + SH040516 COST 322.19 TRAN0405 1. + SH040516 BAL0405 -1. BAL0416 1. + SH040616 COST 132.31 TRAN0406 1. + SH040616 BAL0452 -1. BAL0416 1. + SH040816 COST 207.05 TRAN0408 1. + SH040816 BAL0483 -1. BAL0416 1. + SH040117 COST 152.51 TRAN0401 1. + SH040117 BAL0401 -1. BAL0417 1. + SH040217 COST 510.05 TRAN0402 1. + SH040217 BAL0402 -1. BAL0417 1. + SH040317 COST 276.74 TRAN0403 1. + SH040317 BAL0403 -1. BAL0417 1. + SH040417 COST 57.57 TRAN0404 1. + SH040417 BAL0404 -1. BAL0417 1. + SH040517 COST 300.98 TRAN0405 1. + SH040517 BAL0405 -1. BAL0417 1. + SH040717 COST 297.95 TRAN0407 1. + SH040717 BAL0464 -1. BAL0417 1. + SH040817 COST 27.27 TRAN0408 1. + SH040817 BAL0483 -1. BAL0417 1. + SH040118 COST 176.75 TRAN0401 1. + SH040118 BAL0401 -1. BAL0418 1. + SH040218 COST 364.61 TRAN0402 1. + SH040218 BAL0402 -1. BAL0418 1. + SH040318 COST 272.7 TRAN0403 1. + SH040318 BAL0403 -1. BAL0418 1. + SH040418 COST 155.54 TRAN0404 1. + SH040418 BAL0404 -1. BAL0418 1. + SH040518 COST 411.07 TRAN0405 1. + SH040518 BAL0405 -1. BAL0418 1. + SH040618 COST 355.52 TRAN0406 1. + SH040618 BAL0452 -1. BAL0418 1. + SH040818 COST 104.03 TRAN0408 1. + SH040818 BAL0483 -1. BAL0418 1. + SH040119 COST 250.48 TRAN0401 1. + SH040119 BAL0401 -1. BAL0419 1. + SH040219 COST 693.87 TRAN0402 1. + SH040219 BAL0402 -1. BAL0419 1. + SH040319 COST 320.17 TRAN0403 1. + SH040319 BAL0403 -1. BAL0419 1. + SH040419 COST 160.59 TRAN0404 1. + SH040419 BAL0404 -1. BAL0419 1. + SH040519 COST 210.08 TRAN0405 1. + SH040519 BAL0405 -1. BAL0419 1. + SH040619 COST 348.45 TRAN0406 1. + SH040619 BAL0452 -1. BAL0419 1. + SH040819 COST 99.99 TRAN0408 1. + SH040819 BAL0483 -1. BAL0419 1. + SH040120 COST 207.05 TRAN0401 1. + SH040120 BAL0401 -1. BAL0420 1. + SH040220 COST 689.83 TRAN0402 1. + SH040220 BAL0402 -1. BAL0420 1. + SH040320 COST 299.97 TRAN0403 1. + SH040320 BAL0403 -1. BAL0420 1. + SH040420 COST 114.13 TRAN0404 1. + SH040420 BAL0404 -1. BAL0420 1. + SH040520 COST 293.91 TRAN0405 1. + SH040520 BAL0405 -1. BAL0420 1. + SH040820 COST 127.26 TRAN0408 1. + SH040820 BAL0483 -1. BAL0420 1. + SH040121 COST 407.03 TRAN0401 1. + SH040121 BAL0401 -1. BAL0421 1. + SH040221 COST 371.68 TRAN0402 1. + SH040221 BAL0402 -1. BAL0421 1. + SH040321 COST 450.46 TRAN0403 1. + SH040321 BAL0403 -1. BAL0421 1. + SH040421 COST 323.2 TRAN0404 1. + SH040421 BAL0404 -1. BAL0421 1. + SH040521 COST 555.5 TRAN0405 1. + SH040521 BAL0405 -1. BAL0421 1. + SH040821 COST 323.2 TRAN0408 1. + SH040821 BAL0483 -1. BAL0421 1. + SH040122 COST 250.48 TRAN0401 1. + SH040122 BAL0401 -1. BAL0422 1. + SH040222 COST 583.78 TRAN0402 1. + SH040222 BAL0402 -1. BAL0422 1. + SH040322 COST 301.99 TRAN0403 1. + SH040322 BAL0403 -1. BAL0422 1. + SH040422 COST 226.24 TRAN0404 1. + SH040422 BAL0404 -1. BAL0422 1. + SH040522 COST 180.79 TRAN0405 1. + SH040522 BAL0405 -1. BAL0422 1. + SH040622 COST 313.1 TRAN0406 1. + SH040622 BAL0452 -1. BAL0422 1. + SH040822 COST 140.39 TRAN0408 1. + SH040822 BAL0483 -1. BAL0422 1. + SH040123 COST 236.34 TRAN0401 1. + SH040123 BAL0401 -1. BAL0423 1. + SH040223 COST 546.41 TRAN0402 1. + SH040223 BAL0402 -1. BAL0423 1. + SH040323 COST 289.87 TRAN0403 1. + SH040323 BAL0403 -1. BAL0423 1. + SH040423 COST 168.67 TRAN0404 1. + SH040423 BAL0404 -1. BAL0423 1. + SH040523 COST 167.66 TRAN0405 1. + SH040523 BAL0405 -1. BAL0423 1. + SH040823 COST 140.39 TRAN0408 1. + SH040823 BAL0483 -1. BAL0423 1. + SH040124 COST 1450.36 TRAN0401 1. + SH040124 BAL0401 -1. BAL0424 1. + SH040125 COST 390.87 TRAN0401 1. + SH040125 BAL0401 -1. BAL0425 1. + SH040225 COST 431.27 TRAN0402 1. + SH040225 BAL0402 -1. BAL0425 1. + SH040325 COST 516.11 TRAN0403 1. + SH040325 BAL0403 -1. BAL0425 1. + SH040425 COST 351.48 TRAN0404 1. + SH040425 BAL0404 -1. BAL0425 1. + SH040525 COST 571.66 TRAN0405 1. + SH040525 BAL0405 -1. BAL0425 1. + SH040625 COST 407.03 TRAN0406 1. + SH040625 BAL0452 -1. BAL0425 1. + SH040825 COST 308.05 TRAN0408 1. + SH040825 BAL0483 -1. BAL0425 1. + SH040426 COST 272.7 TRAN0404 1. + SH040426 BAL0404 -1. BAL0426 1. + SH040127 COST 236.34 TRAN0401 1. + SH040127 BAL0401 -1. BAL0427 1. + SH040227 COST 286.84 TRAN0402 1. + SH040227 BAL0402 -1. BAL0427 1. + SH040327 COST 291.89 TRAN0403 1. + SH040327 BAL0403 -1. BAL0427 1. + SH040427 COST 338.35 TRAN0404 1. + SH040427 BAL0404 -1. BAL0427 1. + SH040527 COST 381.78 TRAN0405 1. + SH040527 BAL0405 -1. BAL0427 1. + SH040627 COST 270.68 TRAN0406 1. + SH040627 BAL0452 -1. BAL0427 1. + SH040827 COST 254.52 TRAN0408 1. + SH040827 BAL0483 -1. BAL0427 1. + SH040128 COST 245.43 TRAN0401 1. + SH040128 BAL0401 -1. BAL0428 1. + SH040228 COST 574.69 TRAN0402 1. + SH040228 BAL0402 -1. BAL0428 1. + SH040328 COST 298.96 TRAN0403 1. + SH040328 BAL0403 -1. BAL0428 1. + SH040428 COST 297.95 TRAN0404 1. + SH040428 BAL0404 -1. BAL0428 1. + SH040528 COST 103.02 TRAN0405 1. + SH040528 BAL0405 -1. BAL0428 1. + SH040628 COST 263.61 TRAN0406 1. + SH040628 BAL0452 -1. BAL0428 1. + SH040728 COST 108.07 TRAN0407 1. + SH040728 BAL0464 -1. BAL0428 1. + SH040828 COST 256.54 TRAN0408 1. + SH040828 BAL0483 -1. BAL0428 1. + SH040129 COST 225.23 TRAN0401 1. + SH040129 BAL0401 -1. BAL0429 1. + SH040229 COST 468.64 TRAN0402 1. + SH040229 BAL0402 -1. BAL0429 1. + SH040329 COST 243.41 TRAN0403 1. + SH040329 BAL0403 -1. BAL0429 1. + SH040429 COST 200.99 TRAN0404 1. + SH040429 BAL0404 -1. BAL0429 1. + SH040529 COST 434.3 TRAN0405 1. + SH040529 BAL0405 -1. BAL0429 1. + SH040629 COST 263.61 TRAN0406 1. + SH040629 BAL0452 -1. BAL0429 1. + SH040829 COST 145.44 TRAN0408 1. + SH040829 BAL0483 -1. BAL0429 1. + SH040130 COST 470.66 TRAN0401 1. + SH040130 BAL0401 -1. BAL0430 1. + SH040230 COST 440.36 TRAN0402 1. + SH040230 BAL0402 -1. BAL0430 1. + SH040330 COST 528.23 TRAN0403 1. + SH040330 BAL0403 -1. BAL0430 1. + SH040430 COST 307.04 TRAN0404 1. + SH040430 BAL0404 -1. BAL0430 1. + SH040530 COST 450.46 TRAN0405 1. + SH040530 BAL0405 -1. BAL0430 1. + SH040830 COST 385.82 TRAN0408 1. + SH040830 BAL0483 -1. BAL0430 1. + SH040131 COST 112.11 TRAN0401 1. + SH040131 BAL0401 -1. BAL0431 1. + SH040231 COST 354.51 TRAN0402 1. + SH040231 BAL0402 -1. BAL0431 1. + SH040331 COST 111.1 TRAN0403 1. + SH040331 BAL0403 -1. BAL0431 1. + SH040431 COST 255.53 TRAN0404 1. + SH040431 BAL0404 -1. BAL0431 1. + SH040531 COST 310.07 TRAN0405 1. + SH040531 BAL0405 -1. BAL0431 1. + SH040631 COST 113.12 TRAN0406 1. + SH040631 BAL0452 -1. BAL0431 1. + SH040831 COST 225.23 TRAN0408 1. + SH040831 BAL0483 -1. BAL0431 1. + SH040132 COST 301.99 TRAN0401 1. + SH040132 BAL0401 -1. BAL0432 1. + SH040232 COST 482.78 TRAN0402 1. + SH040232 BAL0402 -1. BAL0432 1. + SH040332 COST 427.23 TRAN0403 1. + SH040332 BAL0403 -1. BAL0432 1. + SH040432 COST 158.57 TRAN0404 1. + SH040432 BAL0404 -1. BAL0432 1. + SH040532 COST 395.92 TRAN0405 1. + SH040532 BAL0405 -1. BAL0432 1. + SH040832 COST 181.8 TRAN0408 1. + SH040832 BAL0483 -1. BAL0432 1. + SH040133 COST 497.93 TRAN0401 1. + SH040133 BAL0401 -1. BAL0433 1. + SH040233 COST 404. TRAN0402 1. + SH040233 BAL0402 -1. BAL0433 1. + SH040333 COST 548.43 TRAN0403 1. + SH040333 BAL0403 -1. BAL0433 1. + SH040433 COST 449.45 TRAN0404 1. + SH040433 BAL0404 -1. BAL0433 1. + SH040533 COST 637.31 TRAN0405 1. + SH040533 BAL0405 -1. BAL0433 1. + SH040833 COST 384.81 TRAN0408 1. + SH040833 BAL0483 -1. BAL0433 1. + SH040134 COST 389.86 TRAN0401 1. + SH040134 BAL0401 -1. BAL0434 1. + SH040234 COST 661.55 TRAN0402 1. + SH040234 BAL0402 -1. BAL0434 1. + SH040334 COST 508.03 TRAN0403 1. + SH040334 BAL0403 -1. BAL0434 1. + SH040434 COST 213.11 TRAN0404 1. + SH040434 BAL0404 -1. BAL0434 1. + SH040534 COST 445.41 TRAN0405 1. + SH040534 BAL0405 -1. BAL0434 1. + SH040834 COST 265.63 TRAN0408 1. + SH040834 BAL0483 -1. BAL0434 1. + SH040135 COST 465.61 TRAN0401 1. + SH040135 BAL0401 -1. BAL0435 1. + SH040235 COST 449.45 TRAN0402 1. + SH040235 BAL0402 -1. BAL0435 1. + SH040335 COST 380.77 TRAN0403 1. + SH040335 BAL0403 -1. BAL0435 1. + SH040435 COST 123.22 TRAN0404 1. + SH040435 BAL0404 -1. BAL0435 1. + SH040535 COST 435.31 TRAN0405 1. + SH040535 BAL0405 -1. BAL0435 1. + SH040835 COST 237.35 TRAN0408 1. + SH040835 BAL0483 -1. BAL0435 1. + SH040136 COST 207.05 TRAN0401 1. + SH040136 BAL0401 -1. BAL0436 1. + SH040236 COST 452.48 TRAN0402 1. + SH040236 BAL0402 -1. BAL0436 1. + SH040336 COST 107.06 TRAN0403 1. + SH040336 BAL0403 -1. BAL0436 1. + SH040436 COST 373.7 TRAN0404 1. + SH040436 BAL0404 -1. BAL0436 1. + SH040536 COST 349.46 TRAN0405 1. + SH040536 BAL0405 -1. BAL0436 1. + SH040636 COST 111.1 TRAN0406 1. + SH040636 BAL0452 -1. BAL0436 1. + SH040836 COST 324.21 TRAN0408 1. + SH040836 BAL0483 -1. BAL0436 1. + SH040137 COST 92.92 TRAN0401 1. + SH040137 BAL0401 -1. BAL0437 1. + SH040237 COST 345.42 TRAN0402 1. + SH040237 BAL0402 -1. BAL0437 1. + SH040337 COST 159.58 TRAN0403 1. + SH040337 BAL0403 -1. BAL0437 1. + SH040437 COST 307.04 TRAN0404 1. + SH040437 BAL0404 -1. BAL0437 1. + SH040537 COST 183.82 TRAN0405 1. + SH040537 BAL0405 -1. BAL0437 1. + SH040637 COST 195.94 TRAN0406 1. + SH040637 BAL0452 -1. BAL0437 1. + SH040837 COST 254.52 TRAN0408 1. + SH040837 BAL0483 -1. BAL0437 1. + SH040138 COST 137.36 TRAN0401 1. + SH040138 BAL0401 -1. BAL0438 1. + SH040238 COST 246.44 TRAN0402 1. + SH040238 BAL0402 -1. BAL0438 1. + SH040338 COST 95.95 TRAN0403 1. + SH040338 BAL0403 -1. BAL0438 1. + SH040438 COST 311.08 TRAN0404 1. + SH040438 BAL0404 -1. BAL0438 1. + SH040538 COST 280.78 TRAN0405 1. + SH040538 BAL0405 -1. BAL0438 1. + SH040638 COST 39.39 TRAN0406 1. + SH040638 BAL0452 -1. BAL0438 1. + SH040738 COST 218.16 TRAN0407 1. + SH040738 BAL0464 -1. BAL0438 1. + SH040838 COST 239.37 TRAN0408 1. + SH040838 BAL0483 -1. BAL0438 1. + SH040139 COST 131.3 TRAN0401 1. + SH040139 BAL0401 -1. BAL0439 1. + SH040239 COST 342.39 TRAN0402 1. + SH040239 BAL0402 -1. BAL0439 1. + SH040339 COST 161.6 TRAN0403 1. + SH040339 BAL0403 -1. BAL0439 1. + SH040439 COST 251.49 TRAN0404 1. + SH040439 BAL0404 -1. BAL0439 1. + SH040539 COST 433.29 TRAN0405 1. + SH040539 BAL0405 -1. BAL0439 1. + SH040639 COST 206.04 TRAN0406 1. + SH040639 BAL0452 -1. BAL0439 1. + SH040839 COST 169.68 TRAN0408 1. + SH040839 BAL0483 -1. BAL0439 1. + SH040140 COST 166.65 TRAN0401 1. + SH040140 BAL0401 -1. BAL0440 1. + SH040240 COST 381.78 TRAN0402 1. + SH040240 BAL0402 -1. BAL0440 1. + SH040340 COST 104.03 TRAN0403 1. + SH040340 BAL0403 -1. BAL0440 1. + SH040440 COST 299.97 TRAN0404 1. + SH040440 BAL0404 -1. BAL0440 1. + SH040540 COST 223.21 TRAN0405 1. + SH040540 BAL0405 -1. BAL0440 1. + SH040640 COST 132.31 TRAN0406 1. + SH040640 BAL0452 -1. BAL0440 1. + SH040840 COST 276.74 TRAN0408 1. + SH040840 BAL0483 -1. BAL0440 1. + SH040141 COST 197.96 TRAN0401 1. + SH040141 BAL0401 -1. BAL0441 1. + SH040241 COST 303. TRAN0402 1. + SH040241 BAL0402 -1. BAL0441 1. + SH040341 COST 151.5 TRAN0403 1. + SH040341 BAL0403 -1. BAL0441 1. + SH040441 COST 327.24 TRAN0404 1. + SH040441 BAL0404 -1. BAL0441 1. + SH040541 COST 371.68 TRAN0405 1. + SH040541 BAL0405 -1. BAL0441 1. + SH040641 COST 101. TRAN0406 1. + SH040641 BAL0452 -1. BAL0441 1. + SH040841 COST 301.99 TRAN0408 1. + SH040841 BAL0483 -1. BAL0441 1. + SH040142 COST 90.9 TRAN0401 1. + SH040142 BAL0401 -1. BAL0442 1. + SH040242 COST 418.14 TRAN0402 1. + SH040242 BAL0402 -1. BAL0442 1. + SH040342 COST 161.6 TRAN0403 1. + SH040342 BAL0403 -1. BAL0442 1. + SH040442 COST 196.95 TRAN0404 1. + SH040442 BAL0404 -1. BAL0442 1. + SH040542 COST 364.61 TRAN0405 1. + SH040542 BAL0405 -1. BAL0442 1. + SH040642 COST 162.61 TRAN0406 1. + SH040642 BAL0452 -1. BAL0442 1. + SH040842 COST 153.52 TRAN0408 1. + SH040842 BAL0483 -1. BAL0442 1. + SH040143 COST 160.59 TRAN0401 1. + SH040143 BAL0401 -1. BAL0443 1. + SH040243 COST 398.95 TRAN0402 1. + SH040243 BAL0402 -1. BAL0443 1. + SH040343 COST 25.25 TRAN0403 1. + SH040343 BAL0403 -1. BAL0443 1. + SH040443 COST 298.96 TRAN0404 1. + SH040443 BAL0404 -1. BAL0443 1. + SH040543 COST 260.58 TRAN0405 1. + SH040543 BAL0405 -1. BAL0443 1. + SH040643 COST 101. TRAN0406 1. + SH040643 BAL0452 -1. BAL0443 1. + SH040743 COST 243.41 TRAN0407 1. + SH040743 BAL0464 -1. BAL0443 1. + SH040843 COST 273.71 TRAN0408 1. + SH040843 BAL0483 -1. BAL0443 1. + SH040144 COST 160.59 TRAN0401 1. + SH040144 BAL0401 -1. BAL0444 1. + SH040244 COST 382.79 TRAN0402 1. + SH040244 BAL0402 -1. BAL0444 1. + SH040344 COST 129.28 TRAN0403 1. + SH040344 BAL0403 -1. BAL0444 1. + SH040444 COST 315.12 TRAN0404 1. + SH040444 BAL0404 -1. BAL0444 1. + SH040544 COST 313.1 TRAN0405 1. + SH040544 BAL0405 -1. BAL0444 1. + SH040644 COST 89.89 TRAN0406 1. + SH040644 BAL0452 -1. BAL0444 1. + SH040844 COST 300.98 TRAN0408 1. + SH040844 BAL0483 -1. BAL0444 1. + SH040145 COST 173.72 TRAN0401 1. + SH040145 BAL0401 -1. BAL0445 1. + SH040245 COST 440.36 TRAN0402 1. + SH040245 BAL0402 -1. BAL0445 1. + SH040345 COST 162.61 TRAN0403 1. + SH040345 BAL0403 -1. BAL0445 1. + SH040445 COST 294.92 TRAN0404 1. + SH040445 BAL0404 -1. BAL0445 1. + SH040545 COST 236.34 TRAN0405 1. + SH040545 BAL0405 -1. BAL0445 1. + SH040645 COST 192.91 TRAN0406 1. + SH040645 BAL0452 -1. BAL0445 1. + SH040745 COST 198.97 TRAN0407 1. + SH040745 BAL0464 -1. BAL0445 1. + SH040845 COST 308.05 TRAN0408 1. + SH040845 BAL0483 -1. BAL0445 1. + SH040146 COST 247.45 TRAN0401 1. + SH040146 BAL0401 -1. BAL0446 1. + SH040246 COST 275.73 TRAN0402 1. + SH040246 BAL0402 -1. BAL0446 1. + SH040346 COST 223.21 TRAN0403 1. + SH040346 BAL0403 -1. BAL0446 1. + SH040446 COST 451.47 TRAN0404 1. + SH040446 BAL0404 -1. BAL0446 1. + SH040546 COST 434.3 TRAN0405 1. + SH040546 BAL0405 -1. BAL0446 1. + SH040646 COST 259.57 TRAN0406 1. + SH040646 BAL0452 -1. BAL0446 1. + SH040846 COST 452.48 TRAN0408 1. + SH040846 BAL0483 -1. BAL0446 1. + SH040147 COST 111.1 TRAN0401 1. + SH040147 BAL0401 -1. BAL0447 1. + SH040247 COST 376.73 TRAN0402 1. + SH040247 BAL0402 -1. BAL0447 1. + SH040347 COST 160.59 TRAN0403 1. + SH040347 BAL0403 -1. BAL0447 1. + SH040447 COST 276.74 TRAN0404 1. + SH040447 BAL0404 -1. BAL0447 1. + SH040547 COST 235.33 TRAN0405 1. + SH040547 BAL0405 -1. BAL0447 1. + SH040647 COST 146.45 TRAN0406 1. + SH040647 BAL0452 -1. BAL0447 1. + SH040847 COST 246.44 TRAN0408 1. + SH040847 BAL0483 -1. BAL0447 1. + SH040148 COST 95.95 TRAN0401 1. + SH040148 BAL0401 -1. BAL0448 1. + SH040248 COST 342.39 TRAN0402 1. + SH040248 BAL0402 -1. BAL0448 1. + SH040348 COST 138.37 TRAN0403 1. + SH040348 BAL0403 -1. BAL0448 1. + SH040448 COST 232.3 TRAN0404 1. + SH040448 BAL0404 -1. BAL0448 1. + SH040548 COST 249.47 TRAN0405 1. + SH040548 BAL0405 -1. BAL0448 1. + SH040648 COST 116.15 TRAN0406 1. + SH040648 BAL0452 -1. BAL0448 1. + SH040848 COST 196.95 TRAN0408 1. + SH040848 BAL0483 -1. BAL0448 1. + SH040149 COST 332.29 TRAN0401 1. + SH040149 BAL0401 -1. BAL0449 1. + SH040249 COST 540.35 TRAN0402 1. + SH040249 BAL0402 -1. BAL0449 1. + SH040349 COST 335.32 TRAN0403 1. + SH040349 BAL0403 -1. BAL0449 1. + SH040449 COST 384.81 TRAN0404 1. + SH040449 BAL0404 -1. BAL0449 1. + SH040549 COST 153.52 TRAN0405 1. + SH040549 BAL0405 -1. BAL0449 1. + SH040649 COST 341.38 TRAN0406 1. + SH040649 BAL0452 -1. BAL0449 1. + SH040749 COST 135.34 TRAN0407 1. + SH040749 BAL0464 -1. BAL0449 1. + SH040849 COST 412.08 TRAN0408 1. + SH040849 BAL0483 -1. BAL0449 1. + SH040150 COST 243.41 TRAN0401 1. + SH040150 BAL0401 -1. BAL0450 1. + SH040250 COST 618.12 TRAN0402 1. + SH040250 BAL0402 -1. BAL0450 1. + SH040350 COST 248.46 TRAN0403 1. + SH040350 BAL0403 -1. BAL0450 1. + SH040450 COST 368.65 TRAN0404 1. + SH040450 BAL0404 -1. BAL0450 1. + SH040550 COST 237.35 TRAN0405 1. + SH040550 BAL0405 -1. BAL0450 1. + SH040750 COST 138.37 TRAN0407 1. + SH040750 BAL0464 -1. BAL0450 1. + SH040850 COST 410.06 TRAN0408 1. + SH040850 BAL0483 -1. BAL0450 1. + SH040151 COST 335.32 TRAN0401 1. + SH040151 BAL0401 -1. BAL0451 1. + SH040251 COST 555.5 TRAN0402 1. + SH040251 BAL0402 -1. BAL0451 1. + SH040351 COST 344.41 TRAN0403 1. + SH040351 BAL0403 -1. BAL0451 1. + SH040451 COST 341.38 TRAN0404 1. + SH040451 BAL0404 -1. BAL0451 1. + SH040551 COST 124.23 TRAN0405 1. + SH040551 BAL0405 -1. BAL0451 1. + SH040751 COST 99.99 TRAN0407 1. + SH040751 BAL0464 -1. BAL0451 1. + SH040851 COST 432.28 TRAN0408 1. + SH040851 BAL0483 -1. BAL0451 1. + SH040152 COST 113.12 TRAN0401 1. + SH040152 BAL0401 -1. BAL0452 1. + SH040252 COST 303. TRAN0402 1. + SH040252 BAL0402 -1. BAL0452 1. + SH040352 COST 82.82 TRAN0403 1. + SH040352 BAL0403 -1. BAL0452 1. + SH040452 COST 325.22 TRAN0404 1. + SH040452 BAL0404 -1. BAL0452 1. + SH040552 COST 297.95 TRAN0405 1. + SH040552 BAL0405 -1. BAL0452 1. + SH040852 COST 255.53 TRAN0408 1. + SH040852 BAL0483 -1. BAL0452 1. + SH040153 COST 362.59 TRAN0401 1. + SH040153 BAL0401 -1. BAL0453 1. + SH040253 COST 642.36 TRAN0402 1. + SH040253 BAL0402 -1. BAL0453 1. + SH040353 COST 328.25 TRAN0403 1. + SH040353 BAL0403 -1. BAL0453 1. + SH040453 COST 416.12 TRAN0404 1. + SH040453 BAL0404 -1. BAL0453 1. + SH040553 COST 185.84 TRAN0405 1. + SH040553 BAL0405 -1. BAL0453 1. + SH040653 COST 362.59 TRAN0406 1. + SH040653 BAL0452 -1. BAL0453 1. + SH040753 COST 147.46 TRAN0407 1. + SH040753 BAL0464 -1. BAL0453 1. + SH040853 COST 407.03 TRAN0408 1. + SH040853 BAL0483 -1. BAL0453 1. + SH040154 COST 186.85 TRAN0401 1. + SH040154 BAL0401 -1. BAL0454 1. + SH040254 COST 449.45 TRAN0402 1. + SH040254 BAL0402 -1. BAL0454 1. + SH040354 COST 219.17 TRAN0403 1. + SH040354 BAL0403 -1. BAL0454 1. + SH040454 COST 346.43 TRAN0404 1. + SH040454 BAL0404 -1. BAL0454 1. + SH040554 COST 215.13 TRAN0405 1. + SH040554 BAL0405 -1. BAL0454 1. + SH040654 COST 205.03 TRAN0406 1. + SH040654 BAL0452 -1. BAL0454 1. + SH040854 COST 406.02 TRAN0408 1. + SH040854 BAL0483 -1. BAL0454 1. + SH040155 COST 280.78 TRAN0401 1. + SH040155 BAL0401 -1. BAL0455 1. + SH040255 COST 483.79 TRAN0402 1. + SH040255 BAL0402 -1. BAL0455 1. + SH040355 COST 283.81 TRAN0403 1. + SH040355 BAL0403 -1. BAL0455 1. + SH040455 COST 296.94 TRAN0404 1. + SH040455 BAL0404 -1. BAL0455 1. + SH040555 COST 155.54 TRAN0405 1. + SH040555 BAL0405 -1. BAL0455 1. + SH040655 COST 292.9 TRAN0406 1. + SH040655 BAL0452 -1. BAL0455 1. + SH040755 COST 108.07 TRAN0407 1. + SH040755 BAL0464 -1. BAL0455 1. + SH040855 COST 296.94 TRAN0408 1. + SH040855 BAL0483 -1. BAL0455 1. + SH040156 COST 393.9 TRAN0401 1. + SH040156 BAL0401 -1. BAL0456 1. + SH040256 COST 584.79 TRAN0402 1. + SH040256 BAL0402 -1. BAL0456 1. + SH040356 COST 308.05 TRAN0403 1. + SH040356 BAL0403 -1. BAL0456 1. + SH040456 COST 368.65 TRAN0404 1. + SH040456 BAL0404 -1. BAL0456 1. + SH040556 COST 137.36 TRAN0405 1. + SH040556 BAL0405 -1. BAL0456 1. + SH040656 COST 342.39 TRAN0406 1. + SH040656 BAL0452 -1. BAL0456 1. + SH040756 COST 123.22 TRAN0407 1. + SH040756 BAL0464 -1. BAL0456 1. + SH040856 COST 360.57 TRAN0408 1. + SH040856 BAL0483 -1. BAL0456 1. + SH040157 COST 263.61 TRAN0401 1. + SH040157 BAL0401 -1. BAL0457 1. + SH040257 COST 525.2 TRAN0402 1. + SH040257 BAL0402 -1. BAL0457 1. + SH040357 COST 292.9 TRAN0403 1. + SH040357 BAL0403 -1. BAL0457 1. + SH040457 COST 236.34 TRAN0404 1. + SH040457 BAL0404 -1. BAL0457 1. + SH040557 COST 169.68 TRAN0405 1. + SH040557 BAL0405 -1. BAL0457 1. + SH040657 COST 322.19 TRAN0406 1. + SH040657 BAL0452 -1. BAL0457 1. + SH040757 COST 149.48 TRAN0407 1. + SH040757 BAL0464 -1. BAL0457 1. + SH040857 COST 233.31 TRAN0408 1. + SH040857 BAL0483 -1. BAL0457 1. + SH040158 COST 296.94 TRAN0401 1. + SH040158 BAL0401 -1. BAL0458 1. + SH040258 COST 526.21 TRAN0402 1. + SH040258 BAL0402 -1. BAL0458 1. + SH040358 COST 280.78 TRAN0403 1. + SH040358 BAL0403 -1. BAL0458 1. + SH040458 COST 346.43 TRAN0404 1. + SH040458 BAL0404 -1. BAL0458 1. + SH040558 COST 21.21 TRAN0405 1. + SH040558 BAL0405 -1. BAL0458 1. + SH040658 COST 329.26 TRAN0406 1. + SH040658 BAL0452 -1. BAL0458 1. + SH040758 COST 68.68 TRAN0407 1. + SH040758 BAL0464 -1. BAL0458 1. + SH040858 COST 256.54 TRAN0408 1. + SH040858 BAL0483 -1. BAL0458 1. + SH040159 COST 208.06 TRAN0401 1. + SH040159 BAL0401 -1. BAL0459 1. + SH040259 COST 502.98 TRAN0402 1. + SH040259 BAL0402 -1. BAL0459 1. + SH040359 COST 240.38 TRAN0403 1. + SH040359 BAL0403 -1. BAL0459 1. + SH040459 COST 246.44 TRAN0404 1. + SH040459 BAL0404 -1. BAL0459 1. + SH040559 COST 160.59 TRAN0405 1. + SH040559 BAL0405 -1. BAL0459 1. + SH040659 COST 299.97 TRAN0406 1. + SH040659 BAL0452 -1. BAL0459 1. + SH040759 COST 106.05 TRAN0407 1. + SH040759 BAL0464 -1. BAL0459 1. + SH040859 COST 257.55 TRAN0408 1. + SH040859 BAL0483 -1. BAL0459 1. + SH040160 COST 263.61 TRAN0401 1. + SH040160 BAL0401 -1. BAL0460 1. + SH040260 COST 555.5 TRAN0402 1. + SH040260 BAL0402 -1. BAL0460 1. + SH040360 COST 285.83 TRAN0403 1. + SH040360 BAL0403 -1. BAL0460 1. + SH040460 COST 315.12 TRAN0404 1. + SH040460 BAL0404 -1. BAL0460 1. + SH040560 COST 136.35 TRAN0405 1. + SH040560 BAL0405 -1. BAL0460 1. + SH040660 COST 326.23 TRAN0406 1. + SH040660 BAL0452 -1. BAL0460 1. + SH040760 COST 88.88 TRAN0407 1. + SH040760 BAL0464 -1. BAL0460 1. + SH040860 COST 301.99 TRAN0408 1. + SH040860 BAL0483 -1. BAL0460 1. + SH040163 COST 268.66 TRAN0401 1. + SH040163 BAL0401 -1. BAL0463 1. + SH040263 COST 498.94 TRAN0402 1. + SH040263 BAL0402 -1. BAL0463 1. + SH040363 COST 289.87 TRAN0403 1. + SH040363 BAL0403 -1. BAL0463 1. + SH040463 COST 372.69 TRAN0404 1. + SH040463 BAL0404 -1. BAL0463 1. + SH040563 COST 153.52 TRAN0405 1. + SH040563 BAL0405 -1. BAL0463 1. + SH040663 COST 318.15 TRAN0406 1. + SH040663 BAL0452 -1. BAL0463 1. + SH040763 COST 125.24 TRAN0407 1. + SH040763 BAL0464 -1. BAL0463 1. + SH040863 COST 404. TRAN0408 1. + SH040863 BAL0483 -1. BAL0463 1. + SH040164 COST 200.99 TRAN0401 1. + SH040164 BAL0401 -1. BAL0464 1. + SH040264 COST 531.26 TRAN0402 1. + SH040264 BAL0402 -1. BAL0464 1. + SH040364 COST 225.23 TRAN0403 1. + SH040364 BAL0403 -1. BAL0464 1. + SH040464 COST 339.36 TRAN0404 1. + SH040464 BAL0404 -1. BAL0464 1. + SH040564 COST 58.58 TRAN0405 1. + SH040564 BAL0405 -1. BAL0464 1. + SH040664 COST 320.17 TRAN0406 1. + SH040664 BAL0452 -1. BAL0464 1. + SH040864 COST 252.5 TRAN0408 1. + SH040864 BAL0483 -1. BAL0464 1. + SH040165 COST 436.32 TRAN0401 1. + SH040165 BAL0401 -1. BAL0465 1. + SH040265 COST 310.07 TRAN0402 1. + SH040265 BAL0402 -1. BAL0465 1. + SH040365 COST 510.05 TRAN0403 1. + SH040365 BAL0403 -1. BAL0465 1. + SH040465 COST 391.88 TRAN0404 1. + SH040465 BAL0404 -1. BAL0465 1. + SH040565 COST 610.04 TRAN0405 1. + SH040565 BAL0405 -1. BAL0465 1. + SH040865 COST 419.15 TRAN0408 1. + SH040865 BAL0483 -1. BAL0465 1. + SH040166 COST 565.6 TRAN0401 1. + SH040166 BAL0401 -1. BAL0466 1. + SH040266 COST 261.59 TRAN0402 1. + SH040266 BAL0402 -1. BAL0466 1. + SH040366 COST 583.78 TRAN0403 1. + SH040366 BAL0403 -1. BAL0466 1. + SH040466 COST 561.56 TRAN0404 1. + SH040466 BAL0404 -1. BAL0466 1. + SH040566 COST 717.1 TRAN0405 1. + SH040566 BAL0405 -1. BAL0466 1. + SH040866 COST 565.6 TRAN0408 1. + SH040866 BAL0483 -1. BAL0466 1. + SH040167 COST 429.25 TRAN0401 1. + SH040167 BAL0401 -1. BAL0467 1. + SH040267 COST 234.32 TRAN0402 1. + SH040267 BAL0402 -1. BAL0467 1. + SH040367 COST 497.93 TRAN0403 1. + SH040367 BAL0403 -1. BAL0467 1. + SH040467 COST 461.57 TRAN0404 1. + SH040467 BAL0404 -1. BAL0467 1. + SH040567 COST 610.04 TRAN0405 1. + SH040567 BAL0405 -1. BAL0467 1. + SH040867 COST 462.58 TRAN0408 1. + SH040867 BAL0483 -1. BAL0467 1. + SH040168 COST 599.94 TRAN0401 1. + SH040168 BAL0401 -1. BAL0468 1. + SH040268 COST 404. TRAN0402 1. + SH040268 BAL0402 -1. BAL0468 1. + SH040368 COST 565.6 TRAN0403 1. + SH040368 BAL0403 -1. BAL0468 1. + SH040468 COST 709.02 TRAN0404 1. + SH040468 BAL0404 -1. BAL0468 1. + SH040568 COST 955.46 TRAN0405 1. + SH040568 BAL0405 -1. BAL0468 1. + SH040868 COST 758.51 TRAN0408 1. + SH040868 BAL0483 -1. BAL0468 1. + SH040169 COST 544.39 TRAN0401 1. + SH040169 BAL0401 -1. BAL0469 1. + SH040269 COST 223.21 TRAN0402 1. + SH040269 BAL0402 -1. BAL0469 1. + SH040369 COST 515.1 TRAN0403 1. + SH040369 BAL0403 -1. BAL0469 1. + SH040469 COST 628.22 TRAN0404 1. + SH040469 BAL0404 -1. BAL0469 1. + SH040569 COST 652.46 TRAN0405 1. + SH040569 BAL0405 -1. BAL0469 1. + SH040869 COST 664.58 TRAN0408 1. + SH040869 BAL0483 -1. BAL0469 1. + SH040171 COST 444.4 TRAN0401 1. + SH040171 BAL0401 -1. BAL0471 1. + SH040371 COST 529.24 TRAN0403 1. + SH040371 BAL0403 -1. BAL0471 1. + SH040471 COST 526.21 TRAN0404 1. + SH040471 BAL0404 -1. BAL0471 1. + SH040571 COST 586.81 TRAN0405 1. + SH040571 BAL0405 -1. BAL0471 1. + SH040671 COST 394.91 TRAN0406 1. + SH040671 BAL0452 -1. BAL0471 1. + SH040771 COST 711.04 TRAN0407 1. + SH040771 BAL0464 -1. BAL0471 1. + SH040871 COST 538.33 TRAN0408 1. + SH040871 BAL0483 -1. BAL0471 1. + SH040172 COST 592.87 TRAN0401 1. + SH040172 BAL0401 -1. BAL0472 1. + SH040272 COST 548.43 TRAN0402 1. + SH040272 BAL0402 -1. BAL0472 1. + SH040372 COST 623.17 TRAN0403 1. + SH040372 BAL0403 -1. BAL0472 1. + SH040472 COST 575.7 TRAN0404 1. + SH040472 BAL0404 -1. BAL0472 1. + SH040572 COST 770.63 TRAN0405 1. + SH040572 BAL0405 -1. BAL0472 1. + SH040872 COST 575.7 TRAN0408 1. + SH040872 BAL0483 -1. BAL0472 1. + SH040173 COST 393.9 TRAN0401 1. + SH040173 BAL0401 -1. BAL0473 1. + SH040273 COST 368.65 TRAN0402 1. + SH040273 BAL0402 -1. BAL0473 1. + SH040373 COST 341.38 TRAN0403 1. + SH040373 BAL0403 -1. BAL0473 1. + SH040473 COST 461.57 TRAN0404 1. + SH040473 BAL0404 -1. BAL0473 1. + SH040573 COST 569.64 TRAN0405 1. + SH040573 BAL0405 -1. BAL0473 1. + SH040673 COST 308.05 TRAN0406 1. + SH040673 BAL0452 -1. BAL0473 1. + SH040873 COST 509.04 TRAN0408 1. + SH040873 BAL0483 -1. BAL0473 1. + SH040174 COST 553.48 TRAN0401 1. + SH040174 BAL0401 -1. BAL0474 1. + SH040274 COST 212.1 TRAN0402 1. + SH040274 BAL0402 -1. BAL0474 1. + SH040374 COST 575.7 TRAN0403 1. + SH040374 BAL0403 -1. BAL0474 1. + SH040474 COST 643.37 TRAN0404 1. + SH040474 BAL0404 -1. BAL0474 1. + SH040574 COST 740.33 TRAN0405 1. + SH040574 BAL0405 -1. BAL0474 1. + SH040874 COST 625.19 TRAN0408 1. + SH040874 BAL0483 -1. BAL0474 1. + SH040275 COST 559.54 TRAN0402 1. + SH040275 BAL0402 -1. BAL0475 1. + SH040176 COST 466.62 TRAN0401 1. + SH040176 BAL0401 -1. BAL0476 1. + SH040276 COST 405.01 TRAN0402 1. + SH040276 BAL0402 -1. BAL0476 1. + SH040376 COST 407.03 TRAN0403 1. + SH040376 BAL0403 -1. BAL0476 1. + SH040476 COST 636.3 TRAN0404 1. + SH040476 BAL0404 -1. BAL0476 1. + SH040576 COST 636.3 TRAN0405 1. + SH040576 BAL0405 -1. BAL0476 1. + SH040676 COST 384.81 TRAN0406 1. + SH040676 BAL0452 -1. BAL0476 1. + SH040876 COST 784.77 TRAN0408 1. + SH040876 BAL0483 -1. BAL0476 1. + SH040177 COST 439.35 TRAN0401 1. + SH040177 BAL0401 -1. BAL0477 1. + SH040277 COST 274.72 TRAN0402 1. + SH040277 BAL0402 -1. BAL0477 1. + SH040377 COST 465.61 TRAN0403 1. + SH040377 BAL0403 -1. BAL0477 1. + SH040477 COST 405.01 TRAN0404 1. + SH040477 BAL0404 -1. BAL0477 1. + SH040577 COST 565.6 TRAN0405 1. + SH040577 BAL0405 -1. BAL0477 1. + SH040877 COST 323.2 TRAN0408 1. + SH040877 BAL0483 -1. BAL0477 1. + SH040178 COST 768.61 TRAN0401 1. + SH040178 BAL0401 -1. BAL0478 1. + SH040278 COST 446.42 TRAN0402 1. + SH040278 BAL0402 -1. BAL0478 1. + SH040378 COST 790.83 TRAN0403 1. + SH040378 BAL0403 -1. BAL0478 1. + SH040478 COST 691.85 TRAN0404 1. + SH040478 BAL0404 -1. BAL0478 1. + SH040578 COST 887.79 TRAN0405 1. + SH040578 BAL0405 -1. BAL0478 1. + SH040878 COST 773.66 TRAN0408 1. + SH040878 BAL0483 -1. BAL0478 1. + SH040179 COST 722.15 TRAN0401 1. + SH040179 BAL0401 -1. BAL0479 1. + SH040279 COST 271.69 TRAN0402 1. + SH040279 BAL0402 -1. BAL0479 1. + SH040379 COST 697.91 TRAN0403 1. + SH040379 BAL0403 -1. BAL0479 1. + SH040479 COST 727.2 TRAN0404 1. + SH040479 BAL0404 -1. BAL0479 1. + SH040879 COST 713.06 TRAN0408 1. + SH040879 BAL0483 -1. BAL0479 1. + SH040180 COST 320.17 TRAN0401 1. + SH040180 BAL0401 -1. BAL0480 1. + SH040280 COST 398.95 TRAN0402 1. + SH040280 BAL0402 -1. BAL0480 1. + SH040380 COST 441.37 TRAN0403 1. + SH040380 BAL0403 -1. BAL0480 1. + SH040480 COST 377.74 TRAN0404 1. + SH040480 BAL0404 -1. BAL0480 1. + SH040580 COST 510.05 TRAN0405 1. + SH040580 BAL0405 -1. BAL0480 1. + SH040880 COST 242.4 TRAN0408 1. + SH040880 BAL0483 -1. BAL0480 1. + SH040182 COST 587.82 TRAN0401 1. + SH040182 BAL0401 -1. BAL0482 1. + SH040282 COST 332.29 TRAN0402 1. + SH040282 BAL0402 -1. BAL0482 1. + SH040382 COST 661.55 TRAN0403 1. + SH040382 BAL0403 -1. BAL0482 1. + SH040482 COST 713.06 TRAN0404 1. + SH040482 BAL0404 -1. BAL0482 1. + SH040582 COST 1158.47 TRAN0405 1. + SH040582 BAL0405 -1. BAL0482 1. + SH040882 COST 790.83 TRAN0408 1. + SH040882 BAL0483 -1. BAL0482 1. + SH040183 COST 178.77 TRAN0401 1. + SH040183 BAL0401 -1. BAL0483 1. + SH040283 COST 525.2 TRAN0402 1. + SH040283 BAL0402 -1. BAL0483 1. + SH040383 COST 274.72 TRAN0403 1. + SH040383 BAL0403 -1. BAL0483 1. + SH040483 COST 59.59 TRAN0404 1. + SH040483 BAL0404 -1. BAL0483 1. + SH040583 COST 350.47 TRAN0405 1. + SH040583 BAL0405 -1. BAL0483 1. + SH040683 COST 250.48 TRAN0406 1. + SH040683 BAL0452 -1. BAL0483 1. + SH040184 COST 307.04 TRAN0401 1. + SH040184 BAL0401 -1. BAL0484 1. + SH040284 COST 193.92 TRAN0402 1. + SH040284 BAL0402 -1. BAL0484 1. + SH040384 COST 367.64 TRAN0403 1. + SH040384 BAL0403 -1. BAL0484 1. + SH040484 COST 373.7 TRAN0404 1. + SH040484 BAL0404 -1. BAL0484 1. + SH040584 COST 494.9 TRAN0405 1. + SH040584 BAL0405 -1. BAL0484 1. + SH040684 COST 308.05 TRAN0406 1. + SH040684 BAL0452 -1. BAL0484 1. + SH040884 COST 391.88 TRAN0408 1. + SH040884 BAL0483 -1. BAL0484 1. + SH050201 COST 490.05 TRAN0502 1. + SH050201 BAL0502 -1. BAL0501 1. + SH050301 COST 188.1 TRAN0503 1. + SH050301 BAL0503 -1. BAL0501 1. + SH050401 COST 343.2 TRAN0504 1. + SH050401 BAL0504 -1. BAL0501 1. + SH050501 COST 391.05 TRAN0505 1. + SH050501 BAL0505 -1. BAL0501 1. + SH050601 COST 207.9 TRAN0506 1. + SH050601 BAL0552 -1. BAL0501 1. + SH050801 COST 235.95 TRAN0508 1. + SH050801 BAL0583 -1. BAL0501 1. + SH050102 COST 782.1 TRAN0501 1. + SH050102 BAL0501 -1. BAL0502 1. + SH050302 COST 688.05 TRAN0503 1. + SH050302 BAL0503 -1. BAL0502 1. + SH050402 COST 1009.8 TRAN0504 1. + SH050402 BAL0504 -1. BAL0502 1. + SH050502 COST 1222.65 TRAN0505 1. + SH050502 BAL0505 -1. BAL0502 1. + SH050602 COST 623.7 TRAN0506 1. + SH050602 BAL0552 -1. BAL0502 1. + SH050802 COST 859.65 TRAN0508 1. + SH050802 BAL0583 -1. BAL0502 1. + SH050103 COST 404.25 TRAN0501 1. + SH050103 BAL0501 -1. BAL0503 1. + SH050203 COST 782.1 TRAN0502 1. + SH050203 BAL0502 -1. BAL0503 1. + SH050403 COST 605.55 TRAN0504 1. + SH050403 BAL0504 -1. BAL0503 1. + SH050503 COST 468.6 TRAN0505 1. + SH050503 BAL0505 -1. BAL0503 1. + SH050603 COST 148.5 TRAN0506 1. + SH050603 BAL0552 -1. BAL0503 1. + SH050803 COST 420.75 TRAN0508 1. + SH050803 BAL0583 -1. BAL0503 1. + SH050104 COST 287.1 TRAN0501 1. + SH050104 BAL0501 -1. BAL0504 1. + SH050204 COST 829.95 TRAN0502 1. + SH050204 BAL0502 -1. BAL0504 1. + SH050304 COST 400.95 TRAN0503 1. + SH050304 BAL0503 -1. BAL0504 1. + SH050504 COST 526.35 TRAN0505 1. + SH050504 BAL0505 -1. BAL0504 1. + SH050604 COST 404.25 TRAN0506 1. + SH050604 BAL0552 -1. BAL0504 1. + SH050704 COST 443.85 TRAN0507 1. + SH050704 BAL0564 -1. BAL0504 1. + SH050804 COST 95.7 TRAN0508 1. + SH050804 BAL0583 -1. BAL0504 1. + SH050105 COST 445.5 TRAN0501 1. + SH050105 BAL0501 -1. BAL0505 1. + SH050205 COST 851.4 TRAN0502 1. + SH050205 BAL0502 -1. BAL0505 1. + SH050305 COST 468.6 TRAN0503 1. + SH050305 BAL0503 -1. BAL0505 1. + SH050405 COST 470.25 TRAN0504 1. + SH050405 BAL0504 -1. BAL0505 1. + SH050605 COST 537.9 TRAN0506 1. + SH050605 BAL0552 -1. BAL0505 1. + SH050705 COST 551.1 TRAN0507 1. + SH050705 BAL0564 -1. BAL0505 1. + SH050805 COST 447.15 TRAN0508 1. + SH050805 BAL0583 -1. BAL0505 1. + SH050106 COST 328.35 TRAN0501 1. + SH050106 BAL0501 -1. BAL0506 1. + SH050206 COST 688.05 TRAN0502 1. + SH050206 BAL0502 -1. BAL0506 1. + SH050306 COST 351.45 TRAN0503 1. + SH050306 BAL0503 -1. BAL0506 1. + SH050406 COST 361.35 TRAN0504 1. + SH050406 BAL0504 -1. BAL0506 1. + SH050506 COST 415.8 TRAN0505 1. + SH050506 BAL0505 -1. BAL0506 1. + SH050606 COST 339.9 TRAN0506 1. + SH050606 BAL0552 -1. BAL0506 1. + SH050706 COST 330. TRAN0507 1. + SH050706 BAL0564 -1. BAL0506 1. + SH050806 COST 249.15 TRAN0508 1. + SH050806 BAL0583 -1. BAL0506 1. + SH050107 COST 34.65 TRAN0501 1. + SH050107 BAL0501 -1. BAL0507 1. + SH050207 COST 481.8 TRAN0502 1. + SH050207 BAL0502 -1. BAL0507 1. + SH050307 COST 204.6 TRAN0503 1. + SH050307 BAL0503 -1. BAL0507 1. + SH050407 COST 341.55 TRAN0504 1. + SH050407 BAL0504 -1. BAL0507 1. + SH050507 COST 377.85 TRAN0505 1. + SH050507 BAL0505 -1. BAL0507 1. + SH050607 COST 206.25 TRAN0506 1. + SH050607 BAL0552 -1. BAL0507 1. + SH050707 COST 382.8 TRAN0507 1. + SH050707 BAL0564 -1. BAL0507 1. + SH050807 COST 255.75 TRAN0508 1. + SH050807 BAL0583 -1. BAL0507 1. + SH050108 COST 108.9 TRAN0501 1. + SH050108 BAL0501 -1. BAL0508 1. + SH050208 COST 620.4 TRAN0502 1. + SH050208 BAL0502 -1. BAL0508 1. + SH050308 COST 232.65 TRAN0503 1. + SH050308 BAL0503 -1. BAL0508 1. + SH050408 COST 407.55 TRAN0504 1. + SH050408 BAL0504 -1. BAL0508 1. + SH050508 COST 300.3 TRAN0505 1. + SH050508 BAL0505 -1. BAL0508 1. + SH050608 COST 273.9 TRAN0506 1. + SH050608 BAL0552 -1. BAL0508 1. + SH050808 COST 308.55 TRAN0508 1. + SH050808 BAL0583 -1. BAL0508 1. + SH050109 COST 227.7 TRAN0501 1. + SH050109 BAL0501 -1. BAL0509 1. + SH050209 COST 631.95 TRAN0502 1. + SH050209 BAL0502 -1. BAL0509 1. + SH050309 COST 277.2 TRAN0503 1. + SH050309 BAL0503 -1. BAL0509 1. + SH050409 COST 417.45 TRAN0504 1. + SH050409 BAL0504 -1. BAL0509 1. + SH050509 COST 394.35 TRAN0505 1. + SH050509 BAL0505 -1. BAL0509 1. + SH050709 COST 323.4 TRAN0507 1. + SH050709 BAL0564 -1. BAL0509 1. + SH050809 COST 320.1 TRAN0508 1. + SH050809 BAL0583 -1. BAL0509 1. + SH050110 COST 407.55 TRAN0501 1. + SH050110 BAL0501 -1. BAL0510 1. + SH050210 COST 260.7 TRAN0502 1. + SH050210 BAL0502 -1. BAL0510 1. + SH050310 COST 396. TRAN0503 1. + SH050310 BAL0503 -1. BAL0510 1. + SH050410 COST 592.35 TRAN0504 1. + SH050410 BAL0504 -1. BAL0510 1. + SH050510 COST 635.25 TRAN0505 1. + SH050510 BAL0505 -1. BAL0510 1. + SH050610 COST 371.25 TRAN0506 1. + SH050610 BAL0552 -1. BAL0510 1. + SH050810 COST 503.25 TRAN0508 1. + SH050810 BAL0583 -1. BAL0510 1. + SH050111 COST 174.9 TRAN0501 1. + SH050111 BAL0501 -1. BAL0511 1. + SH050211 COST 816.75 TRAN0502 1. + SH050211 BAL0502 -1. BAL0511 1. + SH050311 COST 409.2 TRAN0503 1. + SH050311 BAL0503 -1. BAL0511 1. + SH050411 COST 229.35 TRAN0504 1. + SH050411 BAL0504 -1. BAL0511 1. + SH050511 COST 562.65 TRAN0505 1. + SH050511 BAL0505 -1. BAL0511 1. + SH050611 COST 323.4 TRAN0506 1. + SH050611 BAL0552 -1. BAL0511 1. + SH050811 COST 168.3 TRAN0508 1. + SH050811 BAL0583 -1. BAL0511 1. + SH050112 COST 145.2 TRAN0501 1. + SH050112 BAL0501 -1. BAL0512 1. + SH050212 COST 559.35 TRAN0502 1. + SH050212 BAL0502 -1. BAL0512 1. + SH050312 COST 240.9 TRAN0503 1. + SH050312 BAL0503 -1. BAL0512 1. + SH050412 COST 330. TRAN0504 1. + SH050412 BAL0504 -1. BAL0512 1. + SH050512 COST 440.55 TRAN0505 1. + SH050512 BAL0505 -1. BAL0512 1. + SH050612 COST 239.25 TRAN0506 1. + SH050612 BAL0552 -1. BAL0512 1. + SH050812 COST 240.9 TRAN0508 1. + SH050812 BAL0583 -1. BAL0512 1. + SH050114 COST 234.3 TRAN0501 1. + SH050114 BAL0501 -1. BAL0514 1. + SH050214 COST 679.8 TRAN0502 1. + SH050214 BAL0502 -1. BAL0514 1. + SH050314 COST 323.4 TRAN0503 1. + SH050314 BAL0503 -1. BAL0514 1. + SH050414 COST 328.35 TRAN0504 1. + SH050414 BAL0504 -1. BAL0514 1. + SH050514 COST 580.8 TRAN0505 1. + SH050514 BAL0505 -1. BAL0514 1. + SH050614 COST 310.2 TRAN0506 1. + SH050614 BAL0552 -1. BAL0514 1. + SH050814 COST 207.9 TRAN0508 1. + SH050814 BAL0583 -1. BAL0514 1. + SH050115 COST 499.95 TRAN0501 1. + SH050115 BAL0501 -1. BAL0515 1. + SH050215 COST 262.35 TRAN0502 1. + SH050215 BAL0502 -1. BAL0515 1. + SH050315 COST 386.1 TRAN0503 1. + SH050315 BAL0503 -1. BAL0515 1. + SH050415 COST 785.4 TRAN0504 1. + SH050415 BAL0504 -1. BAL0515 1. + SH050515 COST 656.7 TRAN0505 1. + SH050515 BAL0505 -1. BAL0515 1. + SH050615 COST 310.2 TRAN0506 1. + SH050615 BAL0552 -1. BAL0515 1. + SH050815 COST 615.45 TRAN0508 1. + SH050815 BAL0583 -1. BAL0515 1. + SH050116 COST 260.7 TRAN0501 1. + SH050116 BAL0501 -1. BAL0516 1. + SH050216 COST 462. TRAN0502 1. + SH050216 BAL0502 -1. BAL0516 1. + SH050316 COST 374.55 TRAN0503 1. + SH050316 BAL0503 -1. BAL0516 1. + SH050416 COST 473.55 TRAN0504 1. + SH050416 BAL0504 -1. BAL0516 1. + SH050516 COST 526.35 TRAN0505 1. + SH050516 BAL0505 -1. BAL0516 1. + SH050616 COST 216.15 TRAN0506 1. + SH050616 BAL0552 -1. BAL0516 1. + SH050816 COST 338.25 TRAN0508 1. + SH050816 BAL0583 -1. BAL0516 1. + SH050117 COST 249.15 TRAN0501 1. + SH050117 BAL0501 -1. BAL0517 1. + SH050217 COST 833.25 TRAN0502 1. + SH050217 BAL0502 -1. BAL0517 1. + SH050317 COST 452.1 TRAN0503 1. + SH050317 BAL0503 -1. BAL0517 1. + SH050417 COST 94.05 TRAN0504 1. + SH050417 BAL0504 -1. BAL0517 1. + SH050517 COST 491.7 TRAN0505 1. + SH050517 BAL0505 -1. BAL0517 1. + SH050717 COST 486.75 TRAN0507 1. + SH050717 BAL0564 -1. BAL0517 1. + SH050817 COST 44.55 TRAN0508 1. + SH050817 BAL0583 -1. BAL0517 1. + SH050118 COST 288.75 TRAN0501 1. + SH050118 BAL0501 -1. BAL0518 1. + SH050218 COST 595.65 TRAN0502 1. + SH050218 BAL0502 -1. BAL0518 1. + SH050318 COST 445.5 TRAN0503 1. + SH050318 BAL0503 -1. BAL0518 1. + SH050418 COST 254.1 TRAN0504 1. + SH050418 BAL0504 -1. BAL0518 1. + SH050518 COST 671.55 TRAN0505 1. + SH050518 BAL0505 -1. BAL0518 1. + SH050618 COST 580.8 TRAN0506 1. + SH050618 BAL0552 -1. BAL0518 1. + SH050818 COST 169.95 TRAN0508 1. + SH050818 BAL0583 -1. BAL0518 1. + SH050119 COST 409.2 TRAN0501 1. + SH050119 BAL0501 -1. BAL0519 1. + SH050219 COST 1133.55 TRAN0502 1. + SH050219 BAL0502 -1. BAL0519 1. + SH050319 COST 523.05 TRAN0503 1. + SH050319 BAL0503 -1. BAL0519 1. + SH050419 COST 262.35 TRAN0504 1. + SH050419 BAL0504 -1. BAL0519 1. + SH050519 COST 343.2 TRAN0505 1. + SH050519 BAL0505 -1. BAL0519 1. + SH050619 COST 569.25 TRAN0506 1. + SH050619 BAL0552 -1. BAL0519 1. + SH050819 COST 163.35 TRAN0508 1. + SH050819 BAL0583 -1. BAL0519 1. + SH050120 COST 338.25 TRAN0501 1. + SH050120 BAL0501 -1. BAL0520 1. + SH050220 COST 1126.95 TRAN0502 1. + SH050220 BAL0502 -1. BAL0520 1. + SH050320 COST 490.05 TRAN0503 1. + SH050320 BAL0503 -1. BAL0520 1. + SH050420 COST 186.45 TRAN0504 1. + SH050420 BAL0504 -1. BAL0520 1. + SH050520 COST 480.15 TRAN0505 1. + SH050520 BAL0505 -1. BAL0520 1. + SH050820 COST 207.9 TRAN0508 1. + SH050820 BAL0583 -1. BAL0520 1. + SH050121 COST 664.95 TRAN0501 1. + SH050121 BAL0501 -1. BAL0521 1. + SH050221 COST 607.2 TRAN0502 1. + SH050221 BAL0502 -1. BAL0521 1. + SH050321 COST 735.9 TRAN0503 1. + SH050321 BAL0503 -1. BAL0521 1. + SH050421 COST 528. TRAN0504 1. + SH050421 BAL0504 -1. BAL0521 1. + SH050521 COST 907.5 TRAN0505 1. + SH050521 BAL0505 -1. BAL0521 1. + SH050821 COST 528. TRAN0508 1. + SH050821 BAL0583 -1. BAL0521 1. + SH050122 COST 409.2 TRAN0501 1. + SH050122 BAL0501 -1. BAL0522 1. + SH050222 COST 953.7 TRAN0502 1. + SH050222 BAL0502 -1. BAL0522 1. + SH050322 COST 493.35 TRAN0503 1. + SH050322 BAL0503 -1. BAL0522 1. + SH050422 COST 369.6 TRAN0504 1. + SH050422 BAL0504 -1. BAL0522 1. + SH050522 COST 295.35 TRAN0505 1. + SH050522 BAL0505 -1. BAL0522 1. + SH050622 COST 511.5 TRAN0506 1. + SH050622 BAL0552 -1. BAL0522 1. + SH050822 COST 229.35 TRAN0508 1. + SH050822 BAL0583 -1. BAL0522 1. + SH050123 COST 386.1 TRAN0501 1. + SH050123 BAL0501 -1. BAL0523 1. + SH050223 COST 892.65 TRAN0502 1. + SH050223 BAL0502 -1. BAL0523 1. + SH050323 COST 473.55 TRAN0503 1. + SH050323 BAL0503 -1. BAL0523 1. + SH050423 COST 275.55 TRAN0504 1. + SH050423 BAL0504 -1. BAL0523 1. + SH050523 COST 273.9 TRAN0505 1. + SH050523 BAL0505 -1. BAL0523 1. + SH050823 COST 229.35 TRAN0508 1. + SH050823 BAL0583 -1. BAL0523 1. + SH050124 COST 2369.4 TRAN0501 1. + SH050124 BAL0501 -1. BAL0524 1. + SH050125 COST 638.55 TRAN0501 1. + SH050125 BAL0501 -1. BAL0525 1. + SH050225 COST 704.55 TRAN0502 1. + SH050225 BAL0502 -1. BAL0525 1. + SH050325 COST 843.15 TRAN0503 1. + SH050325 BAL0503 -1. BAL0525 1. + SH050425 COST 574.2 TRAN0504 1. + SH050425 BAL0504 -1. BAL0525 1. + SH050525 COST 933.9 TRAN0505 1. + SH050525 BAL0505 -1. BAL0525 1. + SH050625 COST 664.95 TRAN0506 1. + SH050625 BAL0552 -1. BAL0525 1. + SH050825 COST 503.25 TRAN0508 1. + SH050825 BAL0583 -1. BAL0525 1. + SH050426 COST 445.5 TRAN0504 1. + SH050426 BAL0504 -1. BAL0526 1. + SH050127 COST 386.1 TRAN0501 1. + SH050127 BAL0501 -1. BAL0527 1. + SH050227 COST 468.6 TRAN0502 1. + SH050227 BAL0502 -1. BAL0527 1. + SH050327 COST 476.85 TRAN0503 1. + SH050327 BAL0503 -1. BAL0527 1. + SH050427 COST 552.75 TRAN0504 1. + SH050427 BAL0504 -1. BAL0527 1. + SH050527 COST 623.7 TRAN0505 1. + SH050527 BAL0505 -1. BAL0527 1. + SH050627 COST 442.2 TRAN0506 1. + SH050627 BAL0552 -1. BAL0527 1. + SH050827 COST 415.8 TRAN0508 1. + SH050827 BAL0583 -1. BAL0527 1. + SH050128 COST 400.95 TRAN0501 1. + SH050128 BAL0501 -1. BAL0528 1. + SH050228 COST 938.85 TRAN0502 1. + SH050228 BAL0502 -1. BAL0528 1. + SH050328 COST 488.4 TRAN0503 1. + SH050328 BAL0503 -1. BAL0528 1. + SH050428 COST 486.75 TRAN0504 1. + SH050428 BAL0504 -1. BAL0528 1. + SH050528 COST 168.3 TRAN0505 1. + SH050528 BAL0505 -1. BAL0528 1. + SH050628 COST 430.65 TRAN0506 1. + SH050628 BAL0552 -1. BAL0528 1. + SH050728 COST 176.55 TRAN0507 1. + SH050728 BAL0564 -1. BAL0528 1. + SH050828 COST 419.1 TRAN0508 1. + SH050828 BAL0583 -1. BAL0528 1. + SH050129 COST 367.95 TRAN0501 1. + SH050129 BAL0501 -1. BAL0529 1. + SH050229 COST 765.6 TRAN0502 1. + SH050229 BAL0502 -1. BAL0529 1. + SH050329 COST 397.65 TRAN0503 1. + SH050329 BAL0503 -1. BAL0529 1. + SH050429 COST 328.35 TRAN0504 1. + SH050429 BAL0504 -1. BAL0529 1. + SH050529 COST 709.5 TRAN0505 1. + SH050529 BAL0505 -1. BAL0529 1. + SH050629 COST 430.65 TRAN0506 1. + SH050629 BAL0552 -1. BAL0529 1. + SH050829 COST 237.6 TRAN0508 1. + SH050829 BAL0583 -1. BAL0529 1. + SH050130 COST 768.9 TRAN0501 1. + SH050130 BAL0501 -1. BAL0530 1. + SH050230 COST 719.4 TRAN0502 1. + SH050230 BAL0502 -1. BAL0530 1. + SH050330 COST 862.95 TRAN0503 1. + SH050330 BAL0503 -1. BAL0530 1. + SH050430 COST 501.6 TRAN0504 1. + SH050430 BAL0504 -1. BAL0530 1. + SH050530 COST 735.9 TRAN0505 1. + SH050530 BAL0505 -1. BAL0530 1. + SH050830 COST 630.3 TRAN0508 1. + SH050830 BAL0583 -1. BAL0530 1. + SH050131 COST 183.15 TRAN0501 1. + SH050131 BAL0501 -1. BAL0531 1. + SH050231 COST 579.15 TRAN0502 1. + SH050231 BAL0502 -1. BAL0531 1. + SH050331 COST 181.5 TRAN0503 1. + SH050331 BAL0503 -1. BAL0531 1. + SH050431 COST 417.45 TRAN0504 1. + SH050431 BAL0504 -1. BAL0531 1. + SH050531 COST 506.55 TRAN0505 1. + SH050531 BAL0505 -1. BAL0531 1. + SH050631 COST 184.8 TRAN0506 1. + SH050631 BAL0552 -1. BAL0531 1. + SH050831 COST 367.95 TRAN0508 1. + SH050831 BAL0583 -1. BAL0531 1. + SH050132 COST 493.35 TRAN0501 1. + SH050132 BAL0501 -1. BAL0532 1. + SH050232 COST 788.7 TRAN0502 1. + SH050232 BAL0502 -1. BAL0532 1. + SH050332 COST 697.95 TRAN0503 1. + SH050332 BAL0503 -1. BAL0532 1. + SH050432 COST 259.05 TRAN0504 1. + SH050432 BAL0504 -1. BAL0532 1. + SH050532 COST 646.8 TRAN0505 1. + SH050532 BAL0505 -1. BAL0532 1. + SH050832 COST 297. TRAN0508 1. + SH050832 BAL0583 -1. BAL0532 1. + SH050133 COST 813.45 TRAN0501 1. + SH050133 BAL0501 -1. BAL0533 1. + SH050233 COST 660. TRAN0502 1. + SH050233 BAL0502 -1. BAL0533 1. + SH050333 COST 895.95 TRAN0503 1. + SH050333 BAL0503 -1. BAL0533 1. + SH050433 COST 734.25 TRAN0504 1. + SH050433 BAL0504 -1. BAL0533 1. + SH050533 COST 1041.15 TRAN0505 1. + SH050533 BAL0505 -1. BAL0533 1. + SH050833 COST 628.65 TRAN0508 1. + SH050833 BAL0583 -1. BAL0533 1. + SH050134 COST 636.9 TRAN0501 1. + SH050134 BAL0501 -1. BAL0534 1. + SH050234 COST 1080.75 TRAN0502 1. + SH050234 BAL0502 -1. BAL0534 1. + SH050334 COST 829.95 TRAN0503 1. + SH050334 BAL0503 -1. BAL0534 1. + SH050434 COST 348.15 TRAN0504 1. + SH050434 BAL0504 -1. BAL0534 1. + SH050534 COST 727.65 TRAN0505 1. + SH050534 BAL0505 -1. BAL0534 1. + SH050834 COST 433.95 TRAN0508 1. + SH050834 BAL0583 -1. BAL0534 1. + SH050135 COST 760.65 TRAN0501 1. + SH050135 BAL0501 -1. BAL0535 1. + SH050235 COST 734.25 TRAN0502 1. + SH050235 BAL0502 -1. BAL0535 1. + SH050335 COST 622.05 TRAN0503 1. + SH050335 BAL0503 -1. BAL0535 1. + SH050435 COST 201.3 TRAN0504 1. + SH050435 BAL0504 -1. BAL0535 1. + SH050535 COST 711.15 TRAN0505 1. + SH050535 BAL0505 -1. BAL0535 1. + SH050835 COST 387.75 TRAN0508 1. + SH050835 BAL0583 -1. BAL0535 1. + SH050136 COST 338.25 TRAN0501 1. + SH050136 BAL0501 -1. BAL0536 1. + SH050236 COST 739.2 TRAN0502 1. + SH050236 BAL0502 -1. BAL0536 1. + SH050336 COST 174.9 TRAN0503 1. + SH050336 BAL0503 -1. BAL0536 1. + SH050436 COST 610.5 TRAN0504 1. + SH050436 BAL0504 -1. BAL0536 1. + SH050536 COST 570.9 TRAN0505 1. + SH050536 BAL0505 -1. BAL0536 1. + SH050636 COST 181.5 TRAN0506 1. + SH050636 BAL0552 -1. BAL0536 1. + SH050836 COST 529.65 TRAN0508 1. + SH050836 BAL0583 -1. BAL0536 1. + SH050137 COST 151.8 TRAN0501 1. + SH050137 BAL0501 -1. BAL0537 1. + SH050237 COST 564.3 TRAN0502 1. + SH050237 BAL0502 -1. BAL0537 1. + SH050337 COST 260.7 TRAN0503 1. + SH050337 BAL0503 -1. BAL0537 1. + SH050437 COST 501.6 TRAN0504 1. + SH050437 BAL0504 -1. BAL0537 1. + SH050537 COST 300.3 TRAN0505 1. + SH050537 BAL0505 -1. BAL0537 1. + SH050637 COST 320.1 TRAN0506 1. + SH050637 BAL0552 -1. BAL0537 1. + SH050837 COST 415.8 TRAN0508 1. + SH050837 BAL0583 -1. BAL0537 1. + SH050138 COST 224.4 TRAN0501 1. + SH050138 BAL0501 -1. BAL0538 1. + SH050238 COST 402.6 TRAN0502 1. + SH050238 BAL0502 -1. BAL0538 1. + SH050338 COST 156.75 TRAN0503 1. + SH050338 BAL0503 -1. BAL0538 1. + SH050438 COST 508.2 TRAN0504 1. + SH050438 BAL0504 -1. BAL0538 1. + SH050538 COST 458.7 TRAN0505 1. + SH050538 BAL0505 -1. BAL0538 1. + SH050638 COST 64.35 TRAN0506 1. + SH050638 BAL0552 -1. BAL0538 1. + SH050738 COST 356.4 TRAN0507 1. + SH050738 BAL0564 -1. BAL0538 1. + SH050838 COST 391.05 TRAN0508 1. + SH050838 BAL0583 -1. BAL0538 1. + SH050139 COST 214.5 TRAN0501 1. + SH050139 BAL0501 -1. BAL0539 1. + SH050239 COST 559.35 TRAN0502 1. + SH050239 BAL0502 -1. BAL0539 1. + SH050339 COST 264. TRAN0503 1. + SH050339 BAL0503 -1. BAL0539 1. + SH050439 COST 410.85 TRAN0504 1. + SH050439 BAL0504 -1. BAL0539 1. + SH050539 COST 707.85 TRAN0505 1. + SH050539 BAL0505 -1. BAL0539 1. + SH050639 COST 336.6 TRAN0506 1. + SH050639 BAL0552 -1. BAL0539 1. + SH050839 COST 277.2 TRAN0508 1. + SH050839 BAL0583 -1. BAL0539 1. + SH050140 COST 272.25 TRAN0501 1. + SH050140 BAL0501 -1. BAL0540 1. + SH050240 COST 623.7 TRAN0502 1. + SH050240 BAL0502 -1. BAL0540 1. + SH050340 COST 169.95 TRAN0503 1. + SH050340 BAL0503 -1. BAL0540 1. + SH050440 COST 490.05 TRAN0504 1. + SH050440 BAL0504 -1. BAL0540 1. + SH050540 COST 364.65 TRAN0505 1. + SH050540 BAL0505 -1. BAL0540 1. + SH050640 COST 216.15 TRAN0506 1. + SH050640 BAL0552 -1. BAL0540 1. + SH050840 COST 452.1 TRAN0508 1. + SH050840 BAL0583 -1. BAL0540 1. + SH050141 COST 323.4 TRAN0501 1. + SH050141 BAL0501 -1. BAL0541 1. + SH050241 COST 495. TRAN0502 1. + SH050241 BAL0502 -1. BAL0541 1. + SH050341 COST 247.5 TRAN0503 1. + SH050341 BAL0503 -1. BAL0541 1. + SH050441 COST 534.6 TRAN0504 1. + SH050441 BAL0504 -1. BAL0541 1. + SH050541 COST 607.2 TRAN0505 1. + SH050541 BAL0505 -1. BAL0541 1. + SH050641 COST 165. TRAN0506 1. + SH050641 BAL0552 -1. BAL0541 1. + SH050841 COST 493.35 TRAN0508 1. + SH050841 BAL0583 -1. BAL0541 1. + SH050142 COST 148.5 TRAN0501 1. + SH050142 BAL0501 -1. BAL0542 1. + SH050242 COST 683.1 TRAN0502 1. + SH050242 BAL0502 -1. BAL0542 1. + SH050342 COST 264. TRAN0503 1. + SH050342 BAL0503 -1. BAL0542 1. + SH050442 COST 321.75 TRAN0504 1. + SH050442 BAL0504 -1. BAL0542 1. + SH050542 COST 595.65 TRAN0505 1. + SH050542 BAL0505 -1. BAL0542 1. + SH050642 COST 265.65 TRAN0506 1. + SH050642 BAL0552 -1. BAL0542 1. + SH050842 COST 250.8 TRAN0508 1. + SH050842 BAL0583 -1. BAL0542 1. + SH050143 COST 262.35 TRAN0501 1. + SH050143 BAL0501 -1. BAL0543 1. + SH050243 COST 651.75 TRAN0502 1. + SH050243 BAL0502 -1. BAL0543 1. + SH050343 COST 41.25 TRAN0503 1. + SH050343 BAL0503 -1. BAL0543 1. + SH050443 COST 488.4 TRAN0504 1. + SH050443 BAL0504 -1. BAL0543 1. + SH050543 COST 425.7 TRAN0505 1. + SH050543 BAL0505 -1. BAL0543 1. + SH050643 COST 165. TRAN0506 1. + SH050643 BAL0552 -1. BAL0543 1. + SH050743 COST 397.65 TRAN0507 1. + SH050743 BAL0564 -1. BAL0543 1. + SH050843 COST 447.15 TRAN0508 1. + SH050843 BAL0583 -1. BAL0543 1. + SH050144 COST 262.35 TRAN0501 1. + SH050144 BAL0501 -1. BAL0544 1. + SH050244 COST 625.35 TRAN0502 1. + SH050244 BAL0502 -1. BAL0544 1. + SH050344 COST 211.2 TRAN0503 1. + SH050344 BAL0503 -1. BAL0544 1. + SH050444 COST 514.8 TRAN0504 1. + SH050444 BAL0504 -1. BAL0544 1. + SH050544 COST 511.5 TRAN0505 1. + SH050544 BAL0505 -1. BAL0544 1. + SH050644 COST 146.85 TRAN0506 1. + SH050644 BAL0552 -1. BAL0544 1. + SH050844 COST 491.7 TRAN0508 1. + SH050844 BAL0583 -1. BAL0544 1. + SH050145 COST 283.8 TRAN0501 1. + SH050145 BAL0501 -1. BAL0545 1. + SH050245 COST 719.4 TRAN0502 1. + SH050245 BAL0502 -1. BAL0545 1. + SH050345 COST 265.65 TRAN0503 1. + SH050345 BAL0503 -1. BAL0545 1. + SH050445 COST 481.8 TRAN0504 1. + SH050445 BAL0504 -1. BAL0545 1. + SH050545 COST 386.1 TRAN0505 1. + SH050545 BAL0505 -1. BAL0545 1. + SH050645 COST 315.15 TRAN0506 1. + SH050645 BAL0552 -1. BAL0545 1. + SH050745 COST 325.05 TRAN0507 1. + SH050745 BAL0564 -1. BAL0545 1. + SH050845 COST 503.25 TRAN0508 1. + SH050845 BAL0583 -1. BAL0545 1. + SH050146 COST 404.25 TRAN0501 1. + SH050146 BAL0501 -1. BAL0546 1. + SH050246 COST 450.45 TRAN0502 1. + SH050246 BAL0502 -1. BAL0546 1. + SH050346 COST 364.65 TRAN0503 1. + SH050346 BAL0503 -1. BAL0546 1. + SH050446 COST 737.55 TRAN0504 1. + SH050446 BAL0504 -1. BAL0546 1. + SH050546 COST 709.5 TRAN0505 1. + SH050546 BAL0505 -1. BAL0546 1. + SH050646 COST 424.05 TRAN0506 1. + SH050646 BAL0552 -1. BAL0546 1. + SH050846 COST 739.2 TRAN0508 1. + SH050846 BAL0583 -1. BAL0546 1. + SH050147 COST 181.5 TRAN0501 1. + SH050147 BAL0501 -1. BAL0547 1. + SH050247 COST 615.45 TRAN0502 1. + SH050247 BAL0502 -1. BAL0547 1. + SH050347 COST 262.35 TRAN0503 1. + SH050347 BAL0503 -1. BAL0547 1. + SH050447 COST 452.1 TRAN0504 1. + SH050447 BAL0504 -1. BAL0547 1. + SH050547 COST 384.45 TRAN0505 1. + SH050547 BAL0505 -1. BAL0547 1. + SH050647 COST 239.25 TRAN0506 1. + SH050647 BAL0552 -1. BAL0547 1. + SH050847 COST 402.6 TRAN0508 1. + SH050847 BAL0583 -1. BAL0547 1. + SH050148 COST 156.75 TRAN0501 1. + SH050148 BAL0501 -1. BAL0548 1. + SH050248 COST 559.35 TRAN0502 1. + SH050248 BAL0502 -1. BAL0548 1. + SH050348 COST 226.05 TRAN0503 1. + SH050348 BAL0503 -1. BAL0548 1. + SH050448 COST 379.5 TRAN0504 1. + SH050448 BAL0504 -1. BAL0548 1. + SH050548 COST 407.55 TRAN0505 1. + SH050548 BAL0505 -1. BAL0548 1. + SH050648 COST 189.75 TRAN0506 1. + SH050648 BAL0552 -1. BAL0548 1. + SH050848 COST 321.75 TRAN0508 1. + SH050848 BAL0583 -1. BAL0548 1. + SH050149 COST 542.85 TRAN0501 1. + SH050149 BAL0501 -1. BAL0549 1. + SH050249 COST 882.75 TRAN0502 1. + SH050249 BAL0502 -1. BAL0549 1. + SH050349 COST 547.8 TRAN0503 1. + SH050349 BAL0503 -1. BAL0549 1. + SH050449 COST 628.65 TRAN0504 1. + SH050449 BAL0504 -1. BAL0549 1. + SH050549 COST 250.8 TRAN0505 1. + SH050549 BAL0505 -1. BAL0549 1. + SH050649 COST 557.7 TRAN0506 1. + SH050649 BAL0552 -1. BAL0549 1. + SH050749 COST 221.1 TRAN0507 1. + SH050749 BAL0564 -1. BAL0549 1. + SH050849 COST 673.2 TRAN0508 1. + SH050849 BAL0583 -1. BAL0549 1. + SH050150 COST 397.65 TRAN0501 1. + SH050150 BAL0501 -1. BAL0550 1. + SH050250 COST 1009.8 TRAN0502 1. + SH050250 BAL0502 -1. BAL0550 1. + SH050350 COST 405.9 TRAN0503 1. + SH050350 BAL0503 -1. BAL0550 1. + SH050450 COST 602.25 TRAN0504 1. + SH050450 BAL0504 -1. BAL0550 1. + SH050550 COST 387.75 TRAN0505 1. + SH050550 BAL0505 -1. BAL0550 1. + SH050750 COST 226.05 TRAN0507 1. + SH050750 BAL0564 -1. BAL0550 1. + SH050850 COST 669.9 TRAN0508 1. + SH050850 BAL0583 -1. BAL0550 1. + SH050151 COST 547.8 TRAN0501 1. + SH050151 BAL0501 -1. BAL0551 1. + SH050251 COST 907.5 TRAN0502 1. + SH050251 BAL0502 -1. BAL0551 1. + SH050351 COST 562.65 TRAN0503 1. + SH050351 BAL0503 -1. BAL0551 1. + SH050451 COST 557.7 TRAN0504 1. + SH050451 BAL0504 -1. BAL0551 1. + SH050551 COST 202.95 TRAN0505 1. + SH050551 BAL0505 -1. BAL0551 1. + SH050751 COST 163.35 TRAN0507 1. + SH050751 BAL0564 -1. BAL0551 1. + SH050851 COST 706.2 TRAN0508 1. + SH050851 BAL0583 -1. BAL0551 1. + SH050152 COST 184.8 TRAN0501 1. + SH050152 BAL0501 -1. BAL0552 1. + SH050252 COST 495. TRAN0502 1. + SH050252 BAL0502 -1. BAL0552 1. + SH050352 COST 135.3 TRAN0503 1. + SH050352 BAL0503 -1. BAL0552 1. + SH050452 COST 531.3 TRAN0504 1. + SH050452 BAL0504 -1. BAL0552 1. + SH050552 COST 486.75 TRAN0505 1. + SH050552 BAL0505 -1. BAL0552 1. + SH050852 COST 417.45 TRAN0508 1. + SH050852 BAL0583 -1. BAL0552 1. + SH050153 COST 592.35 TRAN0501 1. + SH050153 BAL0501 -1. BAL0553 1. + SH050253 COST 1049.4 TRAN0502 1. + SH050253 BAL0502 -1. BAL0553 1. + SH050353 COST 536.25 TRAN0503 1. + SH050353 BAL0503 -1. BAL0553 1. + SH050453 COST 679.8 TRAN0504 1. + SH050453 BAL0504 -1. BAL0553 1. + SH050553 COST 303.6 TRAN0505 1. + SH050553 BAL0505 -1. BAL0553 1. + SH050653 COST 592.35 TRAN0506 1. + SH050653 BAL0552 -1. BAL0553 1. + SH050753 COST 240.9 TRAN0507 1. + SH050753 BAL0564 -1. BAL0553 1. + SH050853 COST 664.95 TRAN0508 1. + SH050853 BAL0583 -1. BAL0553 1. + SH050154 COST 305.25 TRAN0501 1. + SH050154 BAL0501 -1. BAL0554 1. + SH050254 COST 734.25 TRAN0502 1. + SH050254 BAL0502 -1. BAL0554 1. + SH050354 COST 358.05 TRAN0503 1. + SH050354 BAL0503 -1. BAL0554 1. + SH050454 COST 565.95 TRAN0504 1. + SH050454 BAL0504 -1. BAL0554 1. + SH050554 COST 351.45 TRAN0505 1. + SH050554 BAL0505 -1. BAL0554 1. + SH050654 COST 334.95 TRAN0506 1. + SH050654 BAL0552 -1. BAL0554 1. + SH050854 COST 663.3 TRAN0508 1. + SH050854 BAL0583 -1. BAL0554 1. + SH050155 COST 458.7 TRAN0501 1. + SH050155 BAL0501 -1. BAL0555 1. + SH050255 COST 790.35 TRAN0502 1. + SH050255 BAL0502 -1. BAL0555 1. + SH050355 COST 463.65 TRAN0503 1. + SH050355 BAL0503 -1. BAL0555 1. + SH050455 COST 485.1 TRAN0504 1. + SH050455 BAL0504 -1. BAL0555 1. + SH050555 COST 254.1 TRAN0505 1. + SH050555 BAL0505 -1. BAL0555 1. + SH050655 COST 478.5 TRAN0506 1. + SH050655 BAL0552 -1. BAL0555 1. + SH050755 COST 176.55 TRAN0507 1. + SH050755 BAL0564 -1. BAL0555 1. + SH050855 COST 485.1 TRAN0508 1. + SH050855 BAL0583 -1. BAL0555 1. + SH050156 COST 643.5 TRAN0501 1. + SH050156 BAL0501 -1. BAL0556 1. + SH050256 COST 955.35 TRAN0502 1. + SH050256 BAL0502 -1. BAL0556 1. + SH050356 COST 503.25 TRAN0503 1. + SH050356 BAL0503 -1. BAL0556 1. + SH050456 COST 602.25 TRAN0504 1. + SH050456 BAL0504 -1. BAL0556 1. + SH050556 COST 224.4 TRAN0505 1. + SH050556 BAL0505 -1. BAL0556 1. + SH050656 COST 559.35 TRAN0506 1. + SH050656 BAL0552 -1. BAL0556 1. + SH050756 COST 201.3 TRAN0507 1. + SH050756 BAL0564 -1. BAL0556 1. + SH050856 COST 589.05 TRAN0508 1. + SH050856 BAL0583 -1. BAL0556 1. + SH050157 COST 430.65 TRAN0501 1. + SH050157 BAL0501 -1. BAL0557 1. + SH050257 COST 858. TRAN0502 1. + SH050257 BAL0502 -1. BAL0557 1. + SH050357 COST 478.5 TRAN0503 1. + SH050357 BAL0503 -1. BAL0557 1. + SH050457 COST 386.1 TRAN0504 1. + SH050457 BAL0504 -1. BAL0557 1. + SH050557 COST 277.2 TRAN0505 1. + SH050557 BAL0505 -1. BAL0557 1. + SH050657 COST 526.35 TRAN0506 1. + SH050657 BAL0552 -1. BAL0557 1. + SH050757 COST 244.2 TRAN0507 1. + SH050757 BAL0564 -1. BAL0557 1. + SH050857 COST 381.15 TRAN0508 1. + SH050857 BAL0583 -1. BAL0557 1. + SH050158 COST 485.1 TRAN0501 1. + SH050158 BAL0501 -1. BAL0558 1. + SH050258 COST 859.65 TRAN0502 1. + SH050258 BAL0502 -1. BAL0558 1. + SH050358 COST 458.7 TRAN0503 1. + SH050358 BAL0503 -1. BAL0558 1. + SH050458 COST 565.95 TRAN0504 1. + SH050458 BAL0504 -1. BAL0558 1. + SH050558 COST 34.65 TRAN0505 1. + SH050558 BAL0505 -1. BAL0558 1. + SH050658 COST 537.9 TRAN0506 1. + SH050658 BAL0552 -1. BAL0558 1. + SH050758 COST 112.2 TRAN0507 1. + SH050758 BAL0564 -1. BAL0558 1. + SH050858 COST 419.1 TRAN0508 1. + SH050858 BAL0583 -1. BAL0558 1. + SH050159 COST 339.9 TRAN0501 1. + SH050159 BAL0501 -1. BAL0559 1. + SH050259 COST 821.7 TRAN0502 1. + SH050259 BAL0502 -1. BAL0559 1. + SH050359 COST 392.7 TRAN0503 1. + SH050359 BAL0503 -1. BAL0559 1. + SH050459 COST 402.6 TRAN0504 1. + SH050459 BAL0504 -1. BAL0559 1. + SH050559 COST 262.35 TRAN0505 1. + SH050559 BAL0505 -1. BAL0559 1. + SH050659 COST 490.05 TRAN0506 1. + SH050659 BAL0552 -1. BAL0559 1. + SH050759 COST 173.25 TRAN0507 1. + SH050759 BAL0564 -1. BAL0559 1. + SH050859 COST 420.75 TRAN0508 1. + SH050859 BAL0583 -1. BAL0559 1. + SH050160 COST 430.65 TRAN0501 1. + SH050160 BAL0501 -1. BAL0560 1. + SH050260 COST 907.5 TRAN0502 1. + SH050260 BAL0502 -1. BAL0560 1. + SH050360 COST 466.95 TRAN0503 1. + SH050360 BAL0503 -1. BAL0560 1. + SH050460 COST 514.8 TRAN0504 1. + SH050460 BAL0504 -1. BAL0560 1. + SH050560 COST 222.75 TRAN0505 1. + SH050560 BAL0505 -1. BAL0560 1. + SH050660 COST 532.95 TRAN0506 1. + SH050660 BAL0552 -1. BAL0560 1. + SH050760 COST 145.2 TRAN0507 1. + SH050760 BAL0564 -1. BAL0560 1. + SH050860 COST 493.35 TRAN0508 1. + SH050860 BAL0583 -1. BAL0560 1. + SH050163 COST 438.9 TRAN0501 1. + SH050163 BAL0501 -1. BAL0563 1. + SH050263 COST 815.1 TRAN0502 1. + SH050263 BAL0502 -1. BAL0563 1. + SH050363 COST 473.55 TRAN0503 1. + SH050363 BAL0503 -1. BAL0563 1. + SH050463 COST 608.85 TRAN0504 1. + SH050463 BAL0504 -1. BAL0563 1. + SH050563 COST 250.8 TRAN0505 1. + SH050563 BAL0505 -1. BAL0563 1. + SH050663 COST 519.75 TRAN0506 1. + SH050663 BAL0552 -1. BAL0563 1. + SH050763 COST 204.6 TRAN0507 1. + SH050763 BAL0564 -1. BAL0563 1. + SH050863 COST 660. TRAN0508 1. + SH050863 BAL0583 -1. BAL0563 1. + SH050164 COST 328.35 TRAN0501 1. + SH050164 BAL0501 -1. BAL0564 1. + SH050264 COST 867.9 TRAN0502 1. + SH050264 BAL0502 -1. BAL0564 1. + SH050364 COST 367.95 TRAN0503 1. + SH050364 BAL0503 -1. BAL0564 1. + SH050464 COST 554.4 TRAN0504 1. + SH050464 BAL0504 -1. BAL0564 1. + SH050564 COST 95.7 TRAN0505 1. + SH050564 BAL0505 -1. BAL0564 1. + SH050664 COST 523.05 TRAN0506 1. + SH050664 BAL0552 -1. BAL0564 1. + SH050864 COST 412.5 TRAN0508 1. + SH050864 BAL0583 -1. BAL0564 1. + SH050165 COST 712.8 TRAN0501 1. + SH050165 BAL0501 -1. BAL0565 1. + SH050265 COST 506.55 TRAN0502 1. + SH050265 BAL0502 -1. BAL0565 1. + SH050365 COST 833.25 TRAN0503 1. + SH050365 BAL0503 -1. BAL0565 1. + SH050465 COST 640.2 TRAN0504 1. + SH050465 BAL0504 -1. BAL0565 1. + SH050565 COST 996.6 TRAN0505 1. + SH050565 BAL0505 -1. BAL0565 1. + SH050865 COST 684.75 TRAN0508 1. + SH050865 BAL0583 -1. BAL0565 1. + SH050166 COST 924. TRAN0501 1. + SH050166 BAL0501 -1. BAL0566 1. + SH050266 COST 427.35 TRAN0502 1. + SH050266 BAL0502 -1. BAL0566 1. + SH050366 COST 953.7 TRAN0503 1. + SH050366 BAL0503 -1. BAL0566 1. + SH050466 COST 917.4 TRAN0504 1. + SH050466 BAL0504 -1. BAL0566 1. + SH050566 COST 1171.5 TRAN0505 1. + SH050566 BAL0505 -1. BAL0566 1. + SH050866 COST 924. TRAN0508 1. + SH050866 BAL0583 -1. BAL0566 1. + SH050167 COST 701.25 TRAN0501 1. + SH050167 BAL0501 -1. BAL0567 1. + SH050267 COST 382.8 TRAN0502 1. + SH050267 BAL0502 -1. BAL0567 1. + SH050367 COST 813.45 TRAN0503 1. + SH050367 BAL0503 -1. BAL0567 1. + SH050467 COST 754.05 TRAN0504 1. + SH050467 BAL0504 -1. BAL0567 1. + SH050567 COST 996.6 TRAN0505 1. + SH050567 BAL0505 -1. BAL0567 1. + SH050867 COST 755.7 TRAN0508 1. + SH050867 BAL0583 -1. BAL0567 1. + SH050168 COST 980.1 TRAN0501 1. + SH050168 BAL0501 -1. BAL0568 1. + SH050268 COST 660. TRAN0502 1. + SH050268 BAL0502 -1. BAL0568 1. + SH050368 COST 924. TRAN0503 1. + SH050368 BAL0503 -1. BAL0568 1. + SH050468 COST 1158.3 TRAN0504 1. + SH050468 BAL0504 -1. BAL0568 1. + SH050568 COST 1560.9 TRAN0505 1. + SH050568 BAL0505 -1. BAL0568 1. + SH050868 COST 1239.15 TRAN0508 1. + SH050868 BAL0583 -1. BAL0568 1. + SH050169 COST 889.35 TRAN0501 1. + SH050169 BAL0501 -1. BAL0569 1. + SH050269 COST 364.65 TRAN0502 1. + SH050269 BAL0502 -1. BAL0569 1. + SH050369 COST 841.5 TRAN0503 1. + SH050369 BAL0503 -1. BAL0569 1. + SH050469 COST 1026.3 TRAN0504 1. + SH050469 BAL0504 -1. BAL0569 1. + SH050569 COST 1065.9 TRAN0505 1. + SH050569 BAL0505 -1. BAL0569 1. + SH050869 COST 1085.7 TRAN0508 1. + SH050869 BAL0583 -1. BAL0569 1. + SH050171 COST 726. TRAN0501 1. + SH050171 BAL0501 -1. BAL0571 1. + SH050371 COST 864.6 TRAN0503 1. + SH050371 BAL0503 -1. BAL0571 1. + SH050471 COST 859.65 TRAN0504 1. + SH050471 BAL0504 -1. BAL0571 1. + SH050571 COST 958.65 TRAN0505 1. + SH050571 BAL0505 -1. BAL0571 1. + SH050671 COST 645.15 TRAN0506 1. + SH050671 BAL0552 -1. BAL0571 1. + SH050771 COST 1161.6 TRAN0507 1. + SH050771 BAL0564 -1. BAL0571 1. + SH050871 COST 879.45 TRAN0508 1. + SH050871 BAL0583 -1. BAL0571 1. + SH050172 COST 968.55 TRAN0501 1. + SH050172 BAL0501 -1. BAL0572 1. + SH050272 COST 895.95 TRAN0502 1. + SH050272 BAL0502 -1. BAL0572 1. + SH050372 COST 1018.05 TRAN0503 1. + SH050372 BAL0503 -1. BAL0572 1. + SH050472 COST 940.5 TRAN0504 1. + SH050472 BAL0504 -1. BAL0572 1. + SH050572 COST 1258.95 TRAN0505 1. + SH050572 BAL0505 -1. BAL0572 1. + SH050872 COST 940.5 TRAN0508 1. + SH050872 BAL0583 -1. BAL0572 1. + SH050173 COST 643.5 TRAN0501 1. + SH050173 BAL0501 -1. BAL0573 1. + SH050273 COST 602.25 TRAN0502 1. + SH050273 BAL0502 -1. BAL0573 1. + SH050373 COST 557.7 TRAN0503 1. + SH050373 BAL0503 -1. BAL0573 1. + SH050473 COST 754.05 TRAN0504 1. + SH050473 BAL0504 -1. BAL0573 1. + SH050573 COST 930.6 TRAN0505 1. + SH050573 BAL0505 -1. BAL0573 1. + SH050673 COST 503.25 TRAN0506 1. + SH050673 BAL0552 -1. BAL0573 1. + SH050873 COST 831.6 TRAN0508 1. + SH050873 BAL0583 -1. BAL0573 1. + SH050174 COST 904.2 TRAN0501 1. + SH050174 BAL0501 -1. BAL0574 1. + SH050274 COST 346.5 TRAN0502 1. + SH050274 BAL0502 -1. BAL0574 1. + SH050374 COST 940.5 TRAN0503 1. + SH050374 BAL0503 -1. BAL0574 1. + SH050474 COST 1051.05 TRAN0504 1. + SH050474 BAL0504 -1. BAL0574 1. + SH050574 COST 1209.45 TRAN0505 1. + SH050574 BAL0505 -1. BAL0574 1. + SH050874 COST 1021.35 TRAN0508 1. + SH050874 BAL0583 -1. BAL0574 1. + SH050275 COST 914.1 TRAN0502 1. + SH050275 BAL0502 -1. BAL0575 1. + SH050176 COST 762.3 TRAN0501 1. + SH050176 BAL0501 -1. BAL0576 1. + SH050276 COST 661.65 TRAN0502 1. + SH050276 BAL0502 -1. BAL0576 1. + SH050376 COST 664.95 TRAN0503 1. + SH050376 BAL0503 -1. BAL0576 1. + SH050476 COST 1039.5 TRAN0504 1. + SH050476 BAL0504 -1. BAL0576 1. + SH050576 COST 1039.5 TRAN0505 1. + SH050576 BAL0505 -1. BAL0576 1. + SH050676 COST 628.65 TRAN0506 1. + SH050676 BAL0552 -1. BAL0576 1. + SH050876 COST 1282.05 TRAN0508 1. + SH050876 BAL0583 -1. BAL0576 1. + SH050177 COST 717.75 TRAN0501 1. + SH050177 BAL0501 -1. BAL0577 1. + SH050277 COST 448.8 TRAN0502 1. + SH050277 BAL0502 -1. BAL0577 1. + SH050377 COST 760.65 TRAN0503 1. + SH050377 BAL0503 -1. BAL0577 1. + SH050477 COST 661.65 TRAN0504 1. + SH050477 BAL0504 -1. BAL0577 1. + SH050577 COST 924. TRAN0505 1. + SH050577 BAL0505 -1. BAL0577 1. + SH050877 COST 528. TRAN0508 1. + SH050877 BAL0583 -1. BAL0577 1. + SH050178 COST 1255.65 TRAN0501 1. + SH050178 BAL0501 -1. BAL0578 1. + SH050278 COST 729.3 TRAN0502 1. + SH050278 BAL0502 -1. BAL0578 1. + SH050378 COST 1291.95 TRAN0503 1. + SH050378 BAL0503 -1. BAL0578 1. + SH050478 COST 1130.25 TRAN0504 1. + SH050478 BAL0504 -1. BAL0578 1. + SH050578 COST 1450.35 TRAN0505 1. + SH050578 BAL0505 -1. BAL0578 1. + SH050878 COST 1263.9 TRAN0508 1. + SH050878 BAL0583 -1. BAL0578 1. + SH050179 COST 1179.75 TRAN0501 1. + SH050179 BAL0501 -1. BAL0579 1. + SH050279 COST 443.85 TRAN0502 1. + SH050279 BAL0502 -1. BAL0579 1. + SH050379 COST 1140.15 TRAN0503 1. + SH050379 BAL0503 -1. BAL0579 1. + SH050479 COST 1188. TRAN0504 1. + SH050479 BAL0504 -1. BAL0579 1. + SH050879 COST 1164.9 TRAN0508 1. + SH050879 BAL0583 -1. BAL0579 1. + SH050180 COST 523.05 TRAN0501 1. + SH050180 BAL0501 -1. BAL0580 1. + SH050280 COST 651.75 TRAN0502 1. + SH050280 BAL0502 -1. BAL0580 1. + SH050380 COST 721.05 TRAN0503 1. + SH050380 BAL0503 -1. BAL0580 1. + SH050480 COST 617.1 TRAN0504 1. + SH050480 BAL0504 -1. BAL0580 1. + SH050580 COST 833.25 TRAN0505 1. + SH050580 BAL0505 -1. BAL0580 1. + SH050880 COST 396. TRAN0508 1. + SH050880 BAL0583 -1. BAL0580 1. + SH050182 COST 960.3 TRAN0501 1. + SH050182 BAL0501 -1. BAL0582 1. + SH050282 COST 542.85 TRAN0502 1. + SH050282 BAL0502 -1. BAL0582 1. + SH050382 COST 1080.75 TRAN0503 1. + SH050382 BAL0503 -1. BAL0582 1. + SH050482 COST 1164.9 TRAN0504 1. + SH050482 BAL0504 -1. BAL0582 1. + SH050582 COST 1892.55 TRAN0505 1. + SH050582 BAL0505 -1. BAL0582 1. + SH050882 COST 1291.95 TRAN0508 1. + SH050882 BAL0583 -1. BAL0582 1. + SH050183 COST 292.05 TRAN0501 1. + SH050183 BAL0501 -1. BAL0583 1. + SH050283 COST 858. TRAN0502 1. + SH050283 BAL0502 -1. BAL0583 1. + SH050383 COST 448.8 TRAN0503 1. + SH050383 BAL0503 -1. BAL0583 1. + SH050483 COST 97.35 TRAN0504 1. + SH050483 BAL0504 -1. BAL0583 1. + SH050583 COST 572.55 TRAN0505 1. + SH050583 BAL0505 -1. BAL0583 1. + SH050683 COST 409.2 TRAN0506 1. + SH050683 BAL0552 -1. BAL0583 1. + SH050184 COST 501.6 TRAN0501 1. + SH050184 BAL0501 -1. BAL0584 1. + SH050284 COST 316.8 TRAN0502 1. + SH050284 BAL0502 -1. BAL0584 1. + SH050384 COST 600.6 TRAN0503 1. + SH050384 BAL0503 -1. BAL0584 1. + SH050484 COST 610.5 TRAN0504 1. + SH050484 BAL0504 -1. BAL0584 1. + SH050584 COST 808.5 TRAN0505 1. + SH050584 BAL0505 -1. BAL0584 1. + SH050684 COST 503.25 TRAN0506 1. + SH050684 BAL0552 -1. BAL0584 1. + SH050884 COST 640.2 TRAN0508 1. + SH050884 BAL0583 -1. BAL0584 1. + SH060201 COST 365.31 TRAN0602 1. + SH060201 BAL0602 -1. BAL0601 1. + SH060301 COST 140.22 TRAN0603 1. + SH060301 BAL0603 -1. BAL0601 1. + SH060401 COST 255.84 TRAN0604 1. + SH060401 BAL0604 -1. BAL0601 1. + SH060501 COST 291.51 TRAN0605 1. + SH060501 BAL0605 -1. BAL0601 1. + SH060601 COST 154.98 TRAN0606 1. + SH060601 BAL0652 -1. BAL0601 1. + SH060801 COST 175.89 TRAN0608 1. + SH060801 BAL0683 -1. BAL0601 1. + SH060102 COST 583.02 TRAN0601 1. + SH060102 BAL0601 -1. BAL0602 1. + SH060302 COST 512.91 TRAN0603 1. + SH060302 BAL0603 -1. BAL0602 1. + SH060402 COST 752.76 TRAN0604 1. + SH060402 BAL0604 -1. BAL0602 1. + SH060502 COST 911.43 TRAN0605 1. + SH060502 BAL0605 -1. BAL0602 1. + SH060602 COST 464.94 TRAN0606 1. + SH060602 BAL0652 -1. BAL0602 1. + SH060802 COST 640.83 TRAN0608 1. + SH060802 BAL0683 -1. BAL0602 1. + SH060103 COST 301.35 TRAN0601 1. + SH060103 BAL0601 -1. BAL0603 1. + SH060203 COST 583.02 TRAN0602 1. + SH060203 BAL0602 -1. BAL0603 1. + SH060403 COST 451.41 TRAN0604 1. + SH060403 BAL0604 -1. BAL0603 1. + SH060503 COST 349.32 TRAN0605 1. + SH060503 BAL0605 -1. BAL0603 1. + SH060603 COST 110.7 TRAN0606 1. + SH060603 BAL0652 -1. BAL0603 1. + SH060803 COST 313.65 TRAN0608 1. + SH060803 BAL0683 -1. BAL0603 1. + SH060104 COST 214.02 TRAN0601 1. + SH060104 BAL0601 -1. BAL0604 1. + SH060204 COST 618.69 TRAN0602 1. + SH060204 BAL0602 -1. BAL0604 1. + SH060304 COST 298.89 TRAN0603 1. + SH060304 BAL0603 -1. BAL0604 1. + SH060504 COST 392.37 TRAN0605 1. + SH060504 BAL0605 -1. BAL0604 1. + SH060604 COST 301.35 TRAN0606 1. + SH060604 BAL0652 -1. BAL0604 1. + SH060704 COST 330.87 TRAN0607 1. + SH060704 BAL0664 -1. BAL0604 1. + SH060804 COST 71.34 TRAN0608 1. + SH060804 BAL0683 -1. BAL0604 1. + SH060105 COST 332.1 TRAN0601 1. + SH060105 BAL0601 -1. BAL0605 1. + SH060205 COST 634.68 TRAN0602 1. + SH060205 BAL0602 -1. BAL0605 1. + SH060305 COST 349.32 TRAN0603 1. + SH060305 BAL0603 -1. BAL0605 1. + SH060405 COST 350.55 TRAN0604 1. + SH060405 BAL0604 -1. BAL0605 1. + SH060605 COST 400.98 TRAN0606 1. + SH060605 BAL0652 -1. BAL0605 1. + SH060705 COST 410.82 TRAN0607 1. + SH060705 BAL0664 -1. BAL0605 1. + SH060805 COST 333.33 TRAN0608 1. + SH060805 BAL0683 -1. BAL0605 1. + SH060106 COST 244.77 TRAN0601 1. + SH060106 BAL0601 -1. BAL0606 1. + SH060206 COST 512.91 TRAN0602 1. + SH060206 BAL0602 -1. BAL0606 1. + SH060306 COST 261.99 TRAN0603 1. + SH060306 BAL0603 -1. BAL0606 1. + SH060406 COST 269.37 TRAN0604 1. + SH060406 BAL0604 -1. BAL0606 1. + SH060506 COST 309.96 TRAN0605 1. + SH060506 BAL0605 -1. BAL0606 1. + SH060606 COST 253.38 TRAN0606 1. + SH060606 BAL0652 -1. BAL0606 1. + SH060706 COST 246. TRAN0607 1. + SH060706 BAL0664 -1. BAL0606 1. + SH060806 COST 185.73 TRAN0608 1. + SH060806 BAL0683 -1. BAL0606 1. + SH060107 COST 25.83 TRAN0601 1. + SH060107 BAL0601 -1. BAL0607 1. + SH060207 COST 359.16 TRAN0602 1. + SH060207 BAL0602 -1. BAL0607 1. + SH060307 COST 152.52 TRAN0603 1. + SH060307 BAL0603 -1. BAL0607 1. + SH060407 COST 254.61 TRAN0604 1. + SH060407 BAL0604 -1. BAL0607 1. + SH060507 COST 281.67 TRAN0605 1. + SH060507 BAL0605 -1. BAL0607 1. + SH060607 COST 153.75 TRAN0606 1. + SH060607 BAL0652 -1. BAL0607 1. + SH060707 COST 285.36 TRAN0607 1. + SH060707 BAL0664 -1. BAL0607 1. + SH060807 COST 190.65 TRAN0608 1. + SH060807 BAL0683 -1. BAL0607 1. + SH060108 COST 81.18 TRAN0601 1. + SH060108 BAL0601 -1. BAL0608 1. + SH060208 COST 462.48 TRAN0602 1. + SH060208 BAL0602 -1. BAL0608 1. + SH060308 COST 173.43 TRAN0603 1. + SH060308 BAL0603 -1. BAL0608 1. + SH060408 COST 303.81 TRAN0604 1. + SH060408 BAL0604 -1. BAL0608 1. + SH060508 COST 223.86 TRAN0605 1. + SH060508 BAL0605 -1. BAL0608 1. + SH060608 COST 204.18 TRAN0606 1. + SH060608 BAL0652 -1. BAL0608 1. + SH060808 COST 230.01 TRAN0608 1. + SH060808 BAL0683 -1. BAL0608 1. + SH060109 COST 169.74 TRAN0601 1. + SH060109 BAL0601 -1. BAL0609 1. + SH060209 COST 471.09 TRAN0602 1. + SH060209 BAL0602 -1. BAL0609 1. + SH060309 COST 206.64 TRAN0603 1. + SH060309 BAL0603 -1. BAL0609 1. + SH060409 COST 311.19 TRAN0604 1. + SH060409 BAL0604 -1. BAL0609 1. + SH060509 COST 293.97 TRAN0605 1. + SH060509 BAL0605 -1. BAL0609 1. + SH060709 COST 241.08 TRAN0607 1. + SH060709 BAL0664 -1. BAL0609 1. + SH060809 COST 238.62 TRAN0608 1. + SH060809 BAL0683 -1. BAL0609 1. + SH060110 COST 303.81 TRAN0601 1. + SH060110 BAL0601 -1. BAL0610 1. + SH060210 COST 194.34 TRAN0602 1. + SH060210 BAL0602 -1. BAL0610 1. + SH060310 COST 295.2 TRAN0603 1. + SH060310 BAL0603 -1. BAL0610 1. + SH060410 COST 441.57 TRAN0604 1. + SH060410 BAL0604 -1. BAL0610 1. + SH060510 COST 473.55 TRAN0605 1. + SH060510 BAL0605 -1. BAL0610 1. + SH060610 COST 276.75 TRAN0606 1. + SH060610 BAL0652 -1. BAL0610 1. + SH060810 COST 375.15 TRAN0608 1. + SH060810 BAL0683 -1. BAL0610 1. + SH060111 COST 130.38 TRAN0601 1. + SH060111 BAL0601 -1. BAL0611 1. + SH060211 COST 608.85 TRAN0602 1. + SH060211 BAL0602 -1. BAL0611 1. + SH060311 COST 305.04 TRAN0603 1. + SH060311 BAL0603 -1. BAL0611 1. + SH060411 COST 170.97 TRAN0604 1. + SH060411 BAL0604 -1. BAL0611 1. + SH060511 COST 419.43 TRAN0605 1. + SH060511 BAL0605 -1. BAL0611 1. + SH060611 COST 241.08 TRAN0606 1. + SH060611 BAL0652 -1. BAL0611 1. + SH060811 COST 125.46 TRAN0608 1. + SH060811 BAL0683 -1. BAL0611 1. + SH060112 COST 108.24 TRAN0601 1. + SH060112 BAL0601 -1. BAL0612 1. + SH060212 COST 416.97 TRAN0602 1. + SH060212 BAL0602 -1. BAL0612 1. + SH060312 COST 179.58 TRAN0603 1. + SH060312 BAL0603 -1. BAL0612 1. + SH060412 COST 246. TRAN0604 1. + SH060412 BAL0604 -1. BAL0612 1. + SH060512 COST 328.41 TRAN0605 1. + SH060512 BAL0605 -1. BAL0612 1. + SH060612 COST 178.35 TRAN0606 1. + SH060612 BAL0652 -1. BAL0612 1. + SH060812 COST 179.58 TRAN0608 1. + SH060812 BAL0683 -1. BAL0612 1. + SH060114 COST 174.66 TRAN0601 1. + SH060114 BAL0601 -1. BAL0614 1. + SH060214 COST 506.76 TRAN0602 1. + SH060214 BAL0602 -1. BAL0614 1. + SH060314 COST 241.08 TRAN0603 1. + SH060314 BAL0603 -1. BAL0614 1. + SH060414 COST 244.77 TRAN0604 1. + SH060414 BAL0604 -1. BAL0614 1. + SH060514 COST 432.96 TRAN0605 1. + SH060514 BAL0605 -1. BAL0614 1. + SH060614 COST 231.24 TRAN0606 1. + SH060614 BAL0652 -1. BAL0614 1. + SH060814 COST 154.98 TRAN0608 1. + SH060814 BAL0683 -1. BAL0614 1. + SH060115 COST 372.69 TRAN0601 1. + SH060115 BAL0601 -1. BAL0615 1. + SH060215 COST 195.57 TRAN0602 1. + SH060215 BAL0602 -1. BAL0615 1. + SH060315 COST 287.82 TRAN0603 1. + SH060315 BAL0603 -1. BAL0615 1. + SH060415 COST 585.48 TRAN0604 1. + SH060415 BAL0604 -1. BAL0615 1. + SH060515 COST 489.54 TRAN0605 1. + SH060515 BAL0605 -1. BAL0615 1. + SH060615 COST 231.24 TRAN0606 1. + SH060615 BAL0652 -1. BAL0615 1. + SH060815 COST 458.79 TRAN0608 1. + SH060815 BAL0683 -1. BAL0615 1. + SH060116 COST 194.34 TRAN0601 1. + SH060116 BAL0601 -1. BAL0616 1. + SH060216 COST 344.4 TRAN0602 1. + SH060216 BAL0602 -1. BAL0616 1. + SH060316 COST 279.21 TRAN0603 1. + SH060316 BAL0603 -1. BAL0616 1. + SH060416 COST 353.01 TRAN0604 1. + SH060416 BAL0604 -1. BAL0616 1. + SH060516 COST 392.37 TRAN0605 1. + SH060516 BAL0605 -1. BAL0616 1. + SH060616 COST 161.13 TRAN0606 1. + SH060616 BAL0652 -1. BAL0616 1. + SH060816 COST 252.15 TRAN0608 1. + SH060816 BAL0683 -1. BAL0616 1. + SH060117 COST 185.73 TRAN0601 1. + SH060117 BAL0601 -1. BAL0617 1. + SH060217 COST 621.15 TRAN0602 1. + SH060217 BAL0602 -1. BAL0617 1. + SH060317 COST 337.02 TRAN0603 1. + SH060317 BAL0603 -1. BAL0617 1. + SH060417 COST 70.11 TRAN0604 1. + SH060417 BAL0604 -1. BAL0617 1. + SH060517 COST 366.54 TRAN0605 1. + SH060517 BAL0605 -1. BAL0617 1. + SH060717 COST 362.85 TRAN0607 1. + SH060717 BAL0664 -1. BAL0617 1. + SH060817 COST 33.21 TRAN0608 1. + SH060817 BAL0683 -1. BAL0617 1. + SH060118 COST 215.25 TRAN0601 1. + SH060118 BAL0601 -1. BAL0618 1. + SH060218 COST 444.03 TRAN0602 1. + SH060218 BAL0602 -1. BAL0618 1. + SH060318 COST 332.1 TRAN0603 1. + SH060318 BAL0603 -1. BAL0618 1. + SH060418 COST 189.42 TRAN0604 1. + SH060418 BAL0604 -1. BAL0618 1. + SH060518 COST 500.61 TRAN0605 1. + SH060518 BAL0605 -1. BAL0618 1. + SH060618 COST 432.96 TRAN0606 1. + SH060618 BAL0652 -1. BAL0618 1. + SH060818 COST 126.69 TRAN0608 1. + SH060818 BAL0683 -1. BAL0618 1. + SH060119 COST 305.04 TRAN0601 1. + SH060119 BAL0601 -1. BAL0619 1. + SH060219 COST 845.01 TRAN0602 1. + SH060219 BAL0602 -1. BAL0619 1. + SH060319 COST 389.91 TRAN0603 1. + SH060319 BAL0603 -1. BAL0619 1. + SH060419 COST 195.57 TRAN0604 1. + SH060419 BAL0604 -1. BAL0619 1. + SH060519 COST 255.84 TRAN0605 1. + SH060519 BAL0605 -1. BAL0619 1. + SH060619 COST 424.35 TRAN0606 1. + SH060619 BAL0652 -1. BAL0619 1. + SH060819 COST 121.77 TRAN0608 1. + SH060819 BAL0683 -1. BAL0619 1. + SH060120 COST 252.15 TRAN0601 1. + SH060120 BAL0601 -1. BAL0620 1. + SH060220 COST 840.09 TRAN0602 1. + SH060220 BAL0602 -1. BAL0620 1. + SH060320 COST 365.31 TRAN0603 1. + SH060320 BAL0603 -1. BAL0620 1. + SH060420 COST 138.99 TRAN0604 1. + SH060420 BAL0604 -1. BAL0620 1. + SH060520 COST 357.93 TRAN0605 1. + SH060520 BAL0605 -1. BAL0620 1. + SH060820 COST 154.98 TRAN0608 1. + SH060820 BAL0683 -1. BAL0620 1. + SH060121 COST 495.69 TRAN0601 1. + SH060121 BAL0601 -1. BAL0621 1. + SH060221 COST 452.64 TRAN0602 1. + SH060221 BAL0602 -1. BAL0621 1. + SH060321 COST 548.58 TRAN0603 1. + SH060321 BAL0603 -1. BAL0621 1. + SH060421 COST 393.6 TRAN0604 1. + SH060421 BAL0604 -1. BAL0621 1. + SH060521 COST 676.5 TRAN0605 1. + SH060521 BAL0605 -1. BAL0621 1. + SH060821 COST 393.6 TRAN0608 1. + SH060821 BAL0683 -1. BAL0621 1. + SH060122 COST 305.04 TRAN0601 1. + SH060122 BAL0601 -1. BAL0622 1. + SH060222 COST 710.94 TRAN0602 1. + SH060222 BAL0602 -1. BAL0622 1. + SH060322 COST 367.77 TRAN0603 1. + SH060322 BAL0603 -1. BAL0622 1. + SH060422 COST 275.52 TRAN0604 1. + SH060422 BAL0604 -1. BAL0622 1. + SH060522 COST 220.17 TRAN0605 1. + SH060522 BAL0605 -1. BAL0622 1. + SH060622 COST 381.3 TRAN0606 1. + SH060622 BAL0652 -1. BAL0622 1. + SH060822 COST 170.97 TRAN0608 1. + SH060822 BAL0683 -1. BAL0622 1. + SH060123 COST 287.82 TRAN0601 1. + SH060123 BAL0601 -1. BAL0623 1. + SH060223 COST 665.43 TRAN0602 1. + SH060223 BAL0602 -1. BAL0623 1. + SH060323 COST 353.01 TRAN0603 1. + SH060323 BAL0603 -1. BAL0623 1. + SH060423 COST 205.41 TRAN0604 1. + SH060423 BAL0604 -1. BAL0623 1. + SH060523 COST 204.18 TRAN0605 1. + SH060523 BAL0605 -1. BAL0623 1. + SH060823 COST 170.97 TRAN0608 1. + SH060823 BAL0683 -1. BAL0623 1. + SH060124 COST 1766.28 TRAN0601 1. + SH060124 BAL0601 -1. BAL0624 1. + SH060125 COST 476.01 TRAN0601 1. + SH060125 BAL0601 -1. BAL0625 1. + SH060225 COST 525.21 TRAN0602 1. + SH060225 BAL0602 -1. BAL0625 1. + SH060325 COST 628.53 TRAN0603 1. + SH060325 BAL0603 -1. BAL0625 1. + SH060425 COST 428.04 TRAN0604 1. + SH060425 BAL0604 -1. BAL0625 1. + SH060525 COST 696.18 TRAN0605 1. + SH060525 BAL0605 -1. BAL0625 1. + SH060625 COST 495.69 TRAN0606 1. + SH060625 BAL0652 -1. BAL0625 1. + SH060825 COST 375.15 TRAN0608 1. + SH060825 BAL0683 -1. BAL0625 1. + SH060426 COST 332.1 TRAN0604 1. + SH060426 BAL0604 -1. BAL0626 1. + SH060127 COST 287.82 TRAN0601 1. + SH060127 BAL0601 -1. BAL0627 1. + SH060227 COST 349.32 TRAN0602 1. + SH060227 BAL0602 -1. BAL0627 1. + SH060327 COST 355.47 TRAN0603 1. + SH060327 BAL0603 -1. BAL0627 1. + SH060427 COST 412.05 TRAN0604 1. + SH060427 BAL0604 -1. BAL0627 1. + SH060527 COST 464.94 TRAN0605 1. + SH060527 BAL0605 -1. BAL0627 1. + SH060627 COST 329.64 TRAN0606 1. + SH060627 BAL0652 -1. BAL0627 1. + SH060827 COST 309.96 TRAN0608 1. + SH060827 BAL0683 -1. BAL0627 1. + SH060128 COST 298.89 TRAN0601 1. + SH060128 BAL0601 -1. BAL0628 1. + SH060228 COST 699.87 TRAN0602 1. + SH060228 BAL0602 -1. BAL0628 1. + SH060328 COST 364.08 TRAN0603 1. + SH060328 BAL0603 -1. BAL0628 1. + SH060428 COST 362.85 TRAN0604 1. + SH060428 BAL0604 -1. BAL0628 1. + SH060528 COST 125.46 TRAN0605 1. + SH060528 BAL0605 -1. BAL0628 1. + SH060628 COST 321.03 TRAN0606 1. + SH060628 BAL0652 -1. BAL0628 1. + SH060728 COST 131.61 TRAN0607 1. + SH060728 BAL0664 -1. BAL0628 1. + SH060828 COST 312.42 TRAN0608 1. + SH060828 BAL0683 -1. BAL0628 1. + SH060129 COST 274.29 TRAN0601 1. + SH060129 BAL0601 -1. BAL0629 1. + SH060229 COST 570.72 TRAN0602 1. + SH060229 BAL0602 -1. BAL0629 1. + SH060329 COST 296.43 TRAN0603 1. + SH060329 BAL0603 -1. BAL0629 1. + SH060429 COST 244.77 TRAN0604 1. + SH060429 BAL0604 -1. BAL0629 1. + SH060529 COST 528.9 TRAN0605 1. + SH060529 BAL0605 -1. BAL0629 1. + SH060629 COST 321.03 TRAN0606 1. + SH060629 BAL0652 -1. BAL0629 1. + SH060829 COST 177.12 TRAN0608 1. + SH060829 BAL0683 -1. BAL0629 1. + SH060130 COST 573.18 TRAN0601 1. + SH060130 BAL0601 -1. BAL0630 1. + SH060230 COST 536.28 TRAN0602 1. + SH060230 BAL0602 -1. BAL0630 1. + SH060330 COST 643.29 TRAN0603 1. + SH060330 BAL0603 -1. BAL0630 1. + SH060430 COST 373.92 TRAN0604 1. + SH060430 BAL0604 -1. BAL0630 1. + SH060530 COST 548.58 TRAN0605 1. + SH060530 BAL0605 -1. BAL0630 1. + SH060830 COST 469.86 TRAN0608 1. + SH060830 BAL0683 -1. BAL0630 1. + SH060131 COST 136.53 TRAN0601 1. + SH060131 BAL0601 -1. BAL0631 1. + SH060231 COST 431.73 TRAN0602 1. + SH060231 BAL0602 -1. BAL0631 1. + SH060331 COST 135.3 TRAN0603 1. + SH060331 BAL0603 -1. BAL0631 1. + SH060431 COST 311.19 TRAN0604 1. + SH060431 BAL0604 -1. BAL0631 1. + SH060531 COST 377.61 TRAN0605 1. + SH060531 BAL0605 -1. BAL0631 1. + SH060631 COST 137.76 TRAN0606 1. + SH060631 BAL0652 -1. BAL0631 1. + SH060831 COST 274.29 TRAN0608 1. + SH060831 BAL0683 -1. BAL0631 1. + SH060132 COST 367.77 TRAN0601 1. + SH060132 BAL0601 -1. BAL0632 1. + SH060232 COST 587.94 TRAN0602 1. + SH060232 BAL0602 -1. BAL0632 1. + SH060332 COST 520.29 TRAN0603 1. + SH060332 BAL0603 -1. BAL0632 1. + SH060432 COST 193.11 TRAN0604 1. + SH060432 BAL0604 -1. BAL0632 1. + SH060532 COST 482.16 TRAN0605 1. + SH060532 BAL0605 -1. BAL0632 1. + SH060832 COST 221.4 TRAN0608 1. + SH060832 BAL0683 -1. BAL0632 1. + SH060133 COST 606.39 TRAN0601 1. + SH060133 BAL0601 -1. BAL0633 1. + SH060233 COST 492. TRAN0602 1. + SH060233 BAL0602 -1. BAL0633 1. + SH060333 COST 667.89 TRAN0603 1. + SH060333 BAL0603 -1. BAL0633 1. + SH060433 COST 547.35 TRAN0604 1. + SH060433 BAL0604 -1. BAL0633 1. + SH060533 COST 776.13 TRAN0605 1. + SH060533 BAL0605 -1. BAL0633 1. + SH060833 COST 468.63 TRAN0608 1. + SH060833 BAL0683 -1. BAL0633 1. + SH060134 COST 474.78 TRAN0601 1. + SH060134 BAL0601 -1. BAL0634 1. + SH060234 COST 805.65 TRAN0602 1. + SH060234 BAL0602 -1. BAL0634 1. + SH060334 COST 618.69 TRAN0603 1. + SH060334 BAL0603 -1. BAL0634 1. + SH060434 COST 259.53 TRAN0604 1. + SH060434 BAL0604 -1. BAL0634 1. + SH060534 COST 542.43 TRAN0605 1. + SH060534 BAL0605 -1. BAL0634 1. + SH060834 COST 323.49 TRAN0608 1. + SH060834 BAL0683 -1. BAL0634 1. + SH060135 COST 567.03 TRAN0601 1. + SH060135 BAL0601 -1. BAL0635 1. + SH060235 COST 547.35 TRAN0602 1. + SH060235 BAL0602 -1. BAL0635 1. + SH060335 COST 463.71 TRAN0603 1. + SH060335 BAL0603 -1. BAL0635 1. + SH060435 COST 150.06 TRAN0604 1. + SH060435 BAL0604 -1. BAL0635 1. + SH060535 COST 530.13 TRAN0605 1. + SH060535 BAL0605 -1. BAL0635 1. + SH060835 COST 289.05 TRAN0608 1. + SH060835 BAL0683 -1. BAL0635 1. + SH060136 COST 252.15 TRAN0601 1. + SH060136 BAL0601 -1. BAL0636 1. + SH060236 COST 551.04 TRAN0602 1. + SH060236 BAL0602 -1. BAL0636 1. + SH060336 COST 130.38 TRAN0603 1. + SH060336 BAL0603 -1. BAL0636 1. + SH060436 COST 455.1 TRAN0604 1. + SH060436 BAL0604 -1. BAL0636 1. + SH060536 COST 425.58 TRAN0605 1. + SH060536 BAL0605 -1. BAL0636 1. + SH060636 COST 135.3 TRAN0606 1. + SH060636 BAL0652 -1. BAL0636 1. + SH060836 COST 394.83 TRAN0608 1. + SH060836 BAL0683 -1. BAL0636 1. + SH060137 COST 113.16 TRAN0601 1. + SH060137 BAL0601 -1. BAL0637 1. + SH060237 COST 420.66 TRAN0602 1. + SH060237 BAL0602 -1. BAL0637 1. + SH060337 COST 194.34 TRAN0603 1. + SH060337 BAL0603 -1. BAL0637 1. + SH060437 COST 373.92 TRAN0604 1. + SH060437 BAL0604 -1. BAL0637 1. + SH060537 COST 223.86 TRAN0605 1. + SH060537 BAL0605 -1. BAL0637 1. + SH060637 COST 238.62 TRAN0606 1. + SH060637 BAL0652 -1. BAL0637 1. + SH060837 COST 309.96 TRAN0608 1. + SH060837 BAL0683 -1. BAL0637 1. + SH060138 COST 167.28 TRAN0601 1. + SH060138 BAL0601 -1. BAL0638 1. + SH060238 COST 300.12 TRAN0602 1. + SH060238 BAL0602 -1. BAL0638 1. + SH060338 COST 116.85 TRAN0603 1. + SH060338 BAL0603 -1. BAL0638 1. + SH060438 COST 378.84 TRAN0604 1. + SH060438 BAL0604 -1. BAL0638 1. + SH060538 COST 341.94 TRAN0605 1. + SH060538 BAL0605 -1. BAL0638 1. + SH060638 COST 47.97 TRAN0606 1. + SH060638 BAL0652 -1. BAL0638 1. + SH060738 COST 265.68 TRAN0607 1. + SH060738 BAL0664 -1. BAL0638 1. + SH060838 COST 291.51 TRAN0608 1. + SH060838 BAL0683 -1. BAL0638 1. + SH060139 COST 159.9 TRAN0601 1. + SH060139 BAL0601 -1. BAL0639 1. + SH060239 COST 416.97 TRAN0602 1. + SH060239 BAL0602 -1. BAL0639 1. + SH060339 COST 196.8 TRAN0603 1. + SH060339 BAL0603 -1. BAL0639 1. + SH060439 COST 306.27 TRAN0604 1. + SH060439 BAL0604 -1. BAL0639 1. + SH060539 COST 527.67 TRAN0605 1. + SH060539 BAL0605 -1. BAL0639 1. + SH060639 COST 250.92 TRAN0606 1. + SH060639 BAL0652 -1. BAL0639 1. + SH060839 COST 206.64 TRAN0608 1. + SH060839 BAL0683 -1. BAL0639 1. + SH060140 COST 202.95 TRAN0601 1. + SH060140 BAL0601 -1. BAL0640 1. + SH060240 COST 464.94 TRAN0602 1. + SH060240 BAL0602 -1. BAL0640 1. + SH060340 COST 126.69 TRAN0603 1. + SH060340 BAL0603 -1. BAL0640 1. + SH060440 COST 365.31 TRAN0604 1. + SH060440 BAL0604 -1. BAL0640 1. + SH060540 COST 271.83 TRAN0605 1. + SH060540 BAL0605 -1. BAL0640 1. + SH060640 COST 161.13 TRAN0606 1. + SH060640 BAL0652 -1. BAL0640 1. + SH060840 COST 337.02 TRAN0608 1. + SH060840 BAL0683 -1. BAL0640 1. + SH060141 COST 241.08 TRAN0601 1. + SH060141 BAL0601 -1. BAL0641 1. + SH060241 COST 369. TRAN0602 1. + SH060241 BAL0602 -1. BAL0641 1. + SH060341 COST 184.5 TRAN0603 1. + SH060341 BAL0603 -1. BAL0641 1. + SH060441 COST 398.52 TRAN0604 1. + SH060441 BAL0604 -1. BAL0641 1. + SH060541 COST 452.64 TRAN0605 1. + SH060541 BAL0605 -1. BAL0641 1. + SH060641 COST 123. TRAN0606 1. + SH060641 BAL0652 -1. BAL0641 1. + SH060841 COST 367.77 TRAN0608 1. + SH060841 BAL0683 -1. BAL0641 1. + SH060142 COST 110.7 TRAN0601 1. + SH060142 BAL0601 -1. BAL0642 1. + SH060242 COST 509.22 TRAN0602 1. + SH060242 BAL0602 -1. BAL0642 1. + SH060342 COST 196.8 TRAN0603 1. + SH060342 BAL0603 -1. BAL0642 1. + SH060442 COST 239.85 TRAN0604 1. + SH060442 BAL0604 -1. BAL0642 1. + SH060542 COST 444.03 TRAN0605 1. + SH060542 BAL0605 -1. BAL0642 1. + SH060642 COST 198.03 TRAN0606 1. + SH060642 BAL0652 -1. BAL0642 1. + SH060842 COST 186.96 TRAN0608 1. + SH060842 BAL0683 -1. BAL0642 1. + SH060143 COST 195.57 TRAN0601 1. + SH060143 BAL0601 -1. BAL0643 1. + SH060243 COST 485.85 TRAN0602 1. + SH060243 BAL0602 -1. BAL0643 1. + SH060343 COST 30.75 TRAN0603 1. + SH060343 BAL0603 -1. BAL0643 1. + SH060443 COST 364.08 TRAN0604 1. + SH060443 BAL0604 -1. BAL0643 1. + SH060543 COST 317.34 TRAN0605 1. + SH060543 BAL0605 -1. BAL0643 1. + SH060643 COST 123. TRAN0606 1. + SH060643 BAL0652 -1. BAL0643 1. + SH060743 COST 296.43 TRAN0607 1. + SH060743 BAL0664 -1. BAL0643 1. + SH060843 COST 333.33 TRAN0608 1. + SH060843 BAL0683 -1. BAL0643 1. + SH060144 COST 195.57 TRAN0601 1. + SH060144 BAL0601 -1. BAL0644 1. + SH060244 COST 466.17 TRAN0602 1. + SH060244 BAL0602 -1. BAL0644 1. + SH060344 COST 157.44 TRAN0603 1. + SH060344 BAL0603 -1. BAL0644 1. + SH060444 COST 383.76 TRAN0604 1. + SH060444 BAL0604 -1. BAL0644 1. + SH060544 COST 381.3 TRAN0605 1. + SH060544 BAL0605 -1. BAL0644 1. + SH060644 COST 109.47 TRAN0606 1. + SH060644 BAL0652 -1. BAL0644 1. + SH060844 COST 366.54 TRAN0608 1. + SH060844 BAL0683 -1. BAL0644 1. + SH060145 COST 211.56 TRAN0601 1. + SH060145 BAL0601 -1. BAL0645 1. + SH060245 COST 536.28 TRAN0602 1. + SH060245 BAL0602 -1. BAL0645 1. + SH060345 COST 198.03 TRAN0603 1. + SH060345 BAL0603 -1. BAL0645 1. + SH060445 COST 359.16 TRAN0604 1. + SH060445 BAL0604 -1. BAL0645 1. + SH060545 COST 287.82 TRAN0605 1. + SH060545 BAL0605 -1. BAL0645 1. + SH060645 COST 234.93 TRAN0606 1. + SH060645 BAL0652 -1. BAL0645 1. + SH060745 COST 242.31 TRAN0607 1. + SH060745 BAL0664 -1. BAL0645 1. + SH060845 COST 375.15 TRAN0608 1. + SH060845 BAL0683 -1. BAL0645 1. + SH060146 COST 301.35 TRAN0601 1. + SH060146 BAL0601 -1. BAL0646 1. + SH060246 COST 335.79 TRAN0602 1. + SH060246 BAL0602 -1. BAL0646 1. + SH060346 COST 271.83 TRAN0603 1. + SH060346 BAL0603 -1. BAL0646 1. + SH060446 COST 549.81 TRAN0604 1. + SH060446 BAL0604 -1. BAL0646 1. + SH060546 COST 528.9 TRAN0605 1. + SH060546 BAL0605 -1. BAL0646 1. + SH060646 COST 316.11 TRAN0606 1. + SH060646 BAL0652 -1. BAL0646 1. + SH060846 COST 551.04 TRAN0608 1. + SH060846 BAL0683 -1. BAL0646 1. + SH060147 COST 135.3 TRAN0601 1. + SH060147 BAL0601 -1. BAL0647 1. + SH060247 COST 458.79 TRAN0602 1. + SH060247 BAL0602 -1. BAL0647 1. + SH060347 COST 195.57 TRAN0603 1. + SH060347 BAL0603 -1. BAL0647 1. + SH060447 COST 337.02 TRAN0604 1. + SH060447 BAL0604 -1. BAL0647 1. + SH060547 COST 286.59 TRAN0605 1. + SH060547 BAL0605 -1. BAL0647 1. + SH060647 COST 178.35 TRAN0606 1. + SH060647 BAL0652 -1. BAL0647 1. + SH060847 COST 300.12 TRAN0608 1. + SH060847 BAL0683 -1. BAL0647 1. + SH060148 COST 116.85 TRAN0601 1. + SH060148 BAL0601 -1. BAL0648 1. + SH060248 COST 416.97 TRAN0602 1. + SH060248 BAL0602 -1. BAL0648 1. + SH060348 COST 168.51 TRAN0603 1. + SH060348 BAL0603 -1. BAL0648 1. + SH060448 COST 282.9 TRAN0604 1. + SH060448 BAL0604 -1. BAL0648 1. + SH060548 COST 303.81 TRAN0605 1. + SH060548 BAL0605 -1. BAL0648 1. + SH060648 COST 141.45 TRAN0606 1. + SH060648 BAL0652 -1. BAL0648 1. + SH060848 COST 239.85 TRAN0608 1. + SH060848 BAL0683 -1. BAL0648 1. + SH060149 COST 404.67 TRAN0601 1. + SH060149 BAL0601 -1. BAL0649 1. + SH060249 COST 658.05 TRAN0602 1. + SH060249 BAL0602 -1. BAL0649 1. + SH060349 COST 408.36 TRAN0603 1. + SH060349 BAL0603 -1. BAL0649 1. + SH060449 COST 468.63 TRAN0604 1. + SH060449 BAL0604 -1. BAL0649 1. + SH060549 COST 186.96 TRAN0605 1. + SH060549 BAL0605 -1. BAL0649 1. + SH060649 COST 415.74 TRAN0606 1. + SH060649 BAL0652 -1. BAL0649 1. + SH060749 COST 164.82 TRAN0607 1. + SH060749 BAL0664 -1. BAL0649 1. + SH060849 COST 501.84 TRAN0608 1. + SH060849 BAL0683 -1. BAL0649 1. + SH060150 COST 296.43 TRAN0601 1. + SH060150 BAL0601 -1. BAL0650 1. + SH060250 COST 752.76 TRAN0602 1. + SH060250 BAL0602 -1. BAL0650 1. + SH060350 COST 302.58 TRAN0603 1. + SH060350 BAL0603 -1. BAL0650 1. + SH060450 COST 448.95 TRAN0604 1. + SH060450 BAL0604 -1. BAL0650 1. + SH060550 COST 289.05 TRAN0605 1. + SH060550 BAL0605 -1. BAL0650 1. + SH060750 COST 168.51 TRAN0607 1. + SH060750 BAL0664 -1. BAL0650 1. + SH060850 COST 499.38 TRAN0608 1. + SH060850 BAL0683 -1. BAL0650 1. + SH060151 COST 408.36 TRAN0601 1. + SH060151 BAL0601 -1. BAL0651 1. + SH060251 COST 676.5 TRAN0602 1. + SH060251 BAL0602 -1. BAL0651 1. + SH060351 COST 419.43 TRAN0603 1. + SH060351 BAL0603 -1. BAL0651 1. + SH060451 COST 415.74 TRAN0604 1. + SH060451 BAL0604 -1. BAL0651 1. + SH060551 COST 151.29 TRAN0605 1. + SH060551 BAL0605 -1. BAL0651 1. + SH060751 COST 121.77 TRAN0607 1. + SH060751 BAL0664 -1. BAL0651 1. + SH060851 COST 526.44 TRAN0608 1. + SH060851 BAL0683 -1. BAL0651 1. + SH060152 COST 137.76 TRAN0601 1. + SH060152 BAL0601 -1. BAL0652 1. + SH060252 COST 369. TRAN0602 1. + SH060252 BAL0602 -1. BAL0652 1. + SH060352 COST 100.86 TRAN0603 1. + SH060352 BAL0603 -1. BAL0652 1. + SH060452 COST 396.06 TRAN0604 1. + SH060452 BAL0604 -1. BAL0652 1. + SH060552 COST 362.85 TRAN0605 1. + SH060552 BAL0605 -1. BAL0652 1. + SH060852 COST 311.19 TRAN0608 1. + SH060852 BAL0683 -1. BAL0652 1. + SH060153 COST 441.57 TRAN0601 1. + SH060153 BAL0601 -1. BAL0653 1. + SH060253 COST 782.28 TRAN0602 1. + SH060253 BAL0602 -1. BAL0653 1. + SH060353 COST 399.75 TRAN0603 1. + SH060353 BAL0603 -1. BAL0653 1. + SH060453 COST 506.76 TRAN0604 1. + SH060453 BAL0604 -1. BAL0653 1. + SH060553 COST 226.32 TRAN0605 1. + SH060553 BAL0605 -1. BAL0653 1. + SH060653 COST 441.57 TRAN0606 1. + SH060653 BAL0652 -1. BAL0653 1. + SH060753 COST 179.58 TRAN0607 1. + SH060753 BAL0664 -1. BAL0653 1. + SH060853 COST 495.69 TRAN0608 1. + SH060853 BAL0683 -1. BAL0653 1. + SH060154 COST 227.55 TRAN0601 1. + SH060154 BAL0601 -1. BAL0654 1. + SH060254 COST 547.35 TRAN0602 1. + SH060254 BAL0602 -1. BAL0654 1. + SH060354 COST 266.91 TRAN0603 1. + SH060354 BAL0603 -1. BAL0654 1. + SH060454 COST 421.89 TRAN0604 1. + SH060454 BAL0604 -1. BAL0654 1. + SH060554 COST 261.99 TRAN0605 1. + SH060554 BAL0605 -1. BAL0654 1. + SH060654 COST 249.69 TRAN0606 1. + SH060654 BAL0652 -1. BAL0654 1. + SH060854 COST 494.46 TRAN0608 1. + SH060854 BAL0683 -1. BAL0654 1. + SH060155 COST 341.94 TRAN0601 1. + SH060155 BAL0601 -1. BAL0655 1. + SH060255 COST 589.17 TRAN0602 1. + SH060255 BAL0602 -1. BAL0655 1. + SH060355 COST 345.63 TRAN0603 1. + SH060355 BAL0603 -1. BAL0655 1. + SH060455 COST 361.62 TRAN0604 1. + SH060455 BAL0604 -1. BAL0655 1. + SH060555 COST 189.42 TRAN0605 1. + SH060555 BAL0605 -1. BAL0655 1. + SH060655 COST 356.7 TRAN0606 1. + SH060655 BAL0652 -1. BAL0655 1. + SH060755 COST 131.61 TRAN0607 1. + SH060755 BAL0664 -1. BAL0655 1. + SH060855 COST 361.62 TRAN0608 1. + SH060855 BAL0683 -1. BAL0655 1. + SH060156 COST 479.7 TRAN0601 1. + SH060156 BAL0601 -1. BAL0656 1. + SH060256 COST 712.17 TRAN0602 1. + SH060256 BAL0602 -1. BAL0656 1. + SH060356 COST 375.15 TRAN0603 1. + SH060356 BAL0603 -1. BAL0656 1. + SH060456 COST 448.95 TRAN0604 1. + SH060456 BAL0604 -1. BAL0656 1. + SH060556 COST 167.28 TRAN0605 1. + SH060556 BAL0605 -1. BAL0656 1. + SH060656 COST 416.97 TRAN0606 1. + SH060656 BAL0652 -1. BAL0656 1. + SH060756 COST 150.06 TRAN0607 1. + SH060756 BAL0664 -1. BAL0656 1. + SH060856 COST 439.11 TRAN0608 1. + SH060856 BAL0683 -1. BAL0656 1. + SH060157 COST 321.03 TRAN0601 1. + SH060157 BAL0601 -1. BAL0657 1. + SH060257 COST 639.6 TRAN0602 1. + SH060257 BAL0602 -1. BAL0657 1. + SH060357 COST 356.7 TRAN0603 1. + SH060357 BAL0603 -1. BAL0657 1. + SH060457 COST 287.82 TRAN0604 1. + SH060457 BAL0604 -1. BAL0657 1. + SH060557 COST 206.64 TRAN0605 1. + SH060557 BAL0605 -1. BAL0657 1. + SH060657 COST 392.37 TRAN0606 1. + SH060657 BAL0652 -1. BAL0657 1. + SH060757 COST 182.04 TRAN0607 1. + SH060757 BAL0664 -1. BAL0657 1. + SH060857 COST 284.13 TRAN0608 1. + SH060857 BAL0683 -1. BAL0657 1. + SH060158 COST 361.62 TRAN0601 1. + SH060158 BAL0601 -1. BAL0658 1. + SH060258 COST 640.83 TRAN0602 1. + SH060258 BAL0602 -1. BAL0658 1. + SH060358 COST 341.94 TRAN0603 1. + SH060358 BAL0603 -1. BAL0658 1. + SH060458 COST 421.89 TRAN0604 1. + SH060458 BAL0604 -1. BAL0658 1. + SH060558 COST 25.83 TRAN0605 1. + SH060558 BAL0605 -1. BAL0658 1. + SH060658 COST 400.98 TRAN0606 1. + SH060658 BAL0652 -1. BAL0658 1. + SH060758 COST 83.64 TRAN0607 1. + SH060758 BAL0664 -1. BAL0658 1. + SH060858 COST 312.42 TRAN0608 1. + SH060858 BAL0683 -1. BAL0658 1. + SH060159 COST 253.38 TRAN0601 1. + SH060159 BAL0601 -1. BAL0659 1. + SH060259 COST 612.54 TRAN0602 1. + SH060259 BAL0602 -1. BAL0659 1. + SH060359 COST 292.74 TRAN0603 1. + SH060359 BAL0603 -1. BAL0659 1. + SH060459 COST 300.12 TRAN0604 1. + SH060459 BAL0604 -1. BAL0659 1. + SH060559 COST 195.57 TRAN0605 1. + SH060559 BAL0605 -1. BAL0659 1. + SH060659 COST 365.31 TRAN0606 1. + SH060659 BAL0652 -1. BAL0659 1. + SH060759 COST 129.15 TRAN0607 1. + SH060759 BAL0664 -1. BAL0659 1. + SH060859 COST 313.65 TRAN0608 1. + SH060859 BAL0683 -1. BAL0659 1. + SH060160 COST 321.03 TRAN0601 1. + SH060160 BAL0601 -1. BAL0660 1. + SH060260 COST 676.5 TRAN0602 1. + SH060260 BAL0602 -1. BAL0660 1. + SH060360 COST 348.09 TRAN0603 1. + SH060360 BAL0603 -1. BAL0660 1. + SH060460 COST 383.76 TRAN0604 1. + SH060460 BAL0604 -1. BAL0660 1. + SH060560 COST 166.05 TRAN0605 1. + SH060560 BAL0605 -1. BAL0660 1. + SH060660 COST 397.29 TRAN0606 1. + SH060660 BAL0652 -1. BAL0660 1. + SH060760 COST 108.24 TRAN0607 1. + SH060760 BAL0664 -1. BAL0660 1. + SH060860 COST 367.77 TRAN0608 1. + SH060860 BAL0683 -1. BAL0660 1. + SH060163 COST 327.18 TRAN0601 1. + SH060163 BAL0601 -1. BAL0663 1. + SH060263 COST 607.62 TRAN0602 1. + SH060263 BAL0602 -1. BAL0663 1. + SH060363 COST 353.01 TRAN0603 1. + SH060363 BAL0603 -1. BAL0663 1. + SH060463 COST 453.87 TRAN0604 1. + SH060463 BAL0604 -1. BAL0663 1. + SH060563 COST 186.96 TRAN0605 1. + SH060563 BAL0605 -1. BAL0663 1. + SH060663 COST 387.45 TRAN0606 1. + SH060663 BAL0652 -1. BAL0663 1. + SH060763 COST 152.52 TRAN0607 1. + SH060763 BAL0664 -1. BAL0663 1. + SH060863 COST 492. TRAN0608 1. + SH060863 BAL0683 -1. BAL0663 1. + SH060164 COST 244.77 TRAN0601 1. + SH060164 BAL0601 -1. BAL0664 1. + SH060264 COST 646.98 TRAN0602 1. + SH060264 BAL0602 -1. BAL0664 1. + SH060364 COST 274.29 TRAN0603 1. + SH060364 BAL0603 -1. BAL0664 1. + SH060464 COST 413.28 TRAN0604 1. + SH060464 BAL0604 -1. BAL0664 1. + SH060564 COST 71.34 TRAN0605 1. + SH060564 BAL0605 -1. BAL0664 1. + SH060664 COST 389.91 TRAN0606 1. + SH060664 BAL0652 -1. BAL0664 1. + SH060864 COST 307.5 TRAN0608 1. + SH060864 BAL0683 -1. BAL0664 1. + SH060165 COST 531.36 TRAN0601 1. + SH060165 BAL0601 -1. BAL0665 1. + SH060265 COST 377.61 TRAN0602 1. + SH060265 BAL0602 -1. BAL0665 1. + SH060365 COST 621.15 TRAN0603 1. + SH060365 BAL0603 -1. BAL0665 1. + SH060465 COST 477.24 TRAN0604 1. + SH060465 BAL0604 -1. BAL0665 1. + SH060565 COST 742.92 TRAN0605 1. + SH060565 BAL0605 -1. BAL0665 1. + SH060865 COST 510.45 TRAN0608 1. + SH060865 BAL0683 -1. BAL0665 1. + SH060166 COST 688.8 TRAN0601 1. + SH060166 BAL0601 -1. BAL0666 1. + SH060266 COST 318.57 TRAN0602 1. + SH060266 BAL0602 -1. BAL0666 1. + SH060366 COST 710.94 TRAN0603 1. + SH060366 BAL0603 -1. BAL0666 1. + SH060466 COST 683.88 TRAN0604 1. + SH060466 BAL0604 -1. BAL0666 1. + SH060566 COST 873.3 TRAN0605 1. + SH060566 BAL0605 -1. BAL0666 1. + SH060866 COST 688.8 TRAN0608 1. + SH060866 BAL0683 -1. BAL0666 1. + SH060167 COST 522.75 TRAN0601 1. + SH060167 BAL0601 -1. BAL0667 1. + SH060267 COST 285.36 TRAN0602 1. + SH060267 BAL0602 -1. BAL0667 1. + SH060367 COST 606.39 TRAN0603 1. + SH060367 BAL0603 -1. BAL0667 1. + SH060467 COST 562.11 TRAN0604 1. + SH060467 BAL0604 -1. BAL0667 1. + SH060567 COST 742.92 TRAN0605 1. + SH060567 BAL0605 -1. BAL0667 1. + SH060867 COST 563.34 TRAN0608 1. + SH060867 BAL0683 -1. BAL0667 1. + SH060168 COST 730.62 TRAN0601 1. + SH060168 BAL0601 -1. BAL0668 1. + SH060268 COST 492. TRAN0602 1. + SH060268 BAL0602 -1. BAL0668 1. + SH060368 COST 688.8 TRAN0603 1. + SH060368 BAL0603 -1. BAL0668 1. + SH060468 COST 863.46 TRAN0604 1. + SH060468 BAL0604 -1. BAL0668 1. + SH060568 COST 1163.58 TRAN0605 1. + SH060568 BAL0605 -1. BAL0668 1. + SH060868 COST 923.73 TRAN0608 1. + SH060868 BAL0683 -1. BAL0668 1. + SH060169 COST 662.97 TRAN0601 1. + SH060169 BAL0601 -1. BAL0669 1. + SH060269 COST 271.83 TRAN0602 1. + SH060269 BAL0602 -1. BAL0669 1. + SH060369 COST 627.3 TRAN0603 1. + SH060369 BAL0603 -1. BAL0669 1. + SH060469 COST 765.06 TRAN0604 1. + SH060469 BAL0604 -1. BAL0669 1. + SH060569 COST 794.58 TRAN0605 1. + SH060569 BAL0605 -1. BAL0669 1. + SH060869 COST 809.34 TRAN0608 1. + SH060869 BAL0683 -1. BAL0669 1. + SH060171 COST 541.2 TRAN0601 1. + SH060171 BAL0601 -1. BAL0671 1. + SH060371 COST 644.52 TRAN0603 1. + SH060371 BAL0603 -1. BAL0671 1. + SH060471 COST 640.83 TRAN0604 1. + SH060471 BAL0604 -1. BAL0671 1. + SH060571 COST 714.63 TRAN0605 1. + SH060571 BAL0605 -1. BAL0671 1. + SH060671 COST 480.93 TRAN0606 1. + SH060671 BAL0652 -1. BAL0671 1. + SH060771 COST 865.92 TRAN0607 1. + SH060771 BAL0664 -1. BAL0671 1. + SH060871 COST 655.59 TRAN0608 1. + SH060871 BAL0683 -1. BAL0671 1. + SH060172 COST 722.01 TRAN0601 1. + SH060172 BAL0601 -1. BAL0672 1. + SH060272 COST 667.89 TRAN0602 1. + SH060272 BAL0602 -1. BAL0672 1. + SH060372 COST 758.91 TRAN0603 1. + SH060372 BAL0603 -1. BAL0672 1. + SH060472 COST 701.1 TRAN0604 1. + SH060472 BAL0604 -1. BAL0672 1. + SH060572 COST 938.49 TRAN0605 1. + SH060572 BAL0605 -1. BAL0672 1. + SH060872 COST 701.1 TRAN0608 1. + SH060872 BAL0683 -1. BAL0672 1. + SH060173 COST 479.7 TRAN0601 1. + SH060173 BAL0601 -1. BAL0673 1. + SH060273 COST 448.95 TRAN0602 1. + SH060273 BAL0602 -1. BAL0673 1. + SH060373 COST 415.74 TRAN0603 1. + SH060373 BAL0603 -1. BAL0673 1. + SH060473 COST 562.11 TRAN0604 1. + SH060473 BAL0604 -1. BAL0673 1. + SH060573 COST 693.72 TRAN0605 1. + SH060573 BAL0605 -1. BAL0673 1. + SH060673 COST 375.15 TRAN0606 1. + SH060673 BAL0652 -1. BAL0673 1. + SH060873 COST 619.92 TRAN0608 1. + SH060873 BAL0683 -1. BAL0673 1. + SH060174 COST 674.04 TRAN0601 1. + SH060174 BAL0601 -1. BAL0674 1. + SH060274 COST 258.3 TRAN0602 1. + SH060274 BAL0602 -1. BAL0674 1. + SH060374 COST 701.1 TRAN0603 1. + SH060374 BAL0603 -1. BAL0674 1. + SH060474 COST 783.51 TRAN0604 1. + SH060474 BAL0604 -1. BAL0674 1. + SH060574 COST 901.59 TRAN0605 1. + SH060574 BAL0605 -1. BAL0674 1. + SH060874 COST 761.37 TRAN0608 1. + SH060874 BAL0683 -1. BAL0674 1. + SH060275 COST 681.42 TRAN0602 1. + SH060275 BAL0602 -1. BAL0675 1. + SH060176 COST 568.26 TRAN0601 1. + SH060176 BAL0601 -1. BAL0676 1. + SH060276 COST 493.23 TRAN0602 1. + SH060276 BAL0602 -1. BAL0676 1. + SH060376 COST 495.69 TRAN0603 1. + SH060376 BAL0603 -1. BAL0676 1. + SH060476 COST 774.9 TRAN0604 1. + SH060476 BAL0604 -1. BAL0676 1. + SH060576 COST 774.9 TRAN0605 1. + SH060576 BAL0605 -1. BAL0676 1. + SH060676 COST 468.63 TRAN0606 1. + SH060676 BAL0652 -1. BAL0676 1. + SH060876 COST 955.71 TRAN0608 1. + SH060876 BAL0683 -1. BAL0676 1. + SH060177 COST 535.05 TRAN0601 1. + SH060177 BAL0601 -1. BAL0677 1. + SH060277 COST 334.56 TRAN0602 1. + SH060277 BAL0602 -1. BAL0677 1. + SH060377 COST 567.03 TRAN0603 1. + SH060377 BAL0603 -1. BAL0677 1. + SH060477 COST 493.23 TRAN0604 1. + SH060477 BAL0604 -1. BAL0677 1. + SH060577 COST 688.8 TRAN0605 1. + SH060577 BAL0605 -1. BAL0677 1. + SH060877 COST 393.6 TRAN0608 1. + SH060877 BAL0683 -1. BAL0677 1. + SH060178 COST 936.03 TRAN0601 1. + SH060178 BAL0601 -1. BAL0678 1. + SH060278 COST 543.66 TRAN0602 1. + SH060278 BAL0602 -1. BAL0678 1. + SH060378 COST 963.09 TRAN0603 1. + SH060378 BAL0603 -1. BAL0678 1. + SH060478 COST 842.55 TRAN0604 1. + SH060478 BAL0604 -1. BAL0678 1. + SH060578 COST 1081.17 TRAN0605 1. + SH060578 BAL0605 -1. BAL0678 1. + SH060878 COST 942.18 TRAN0608 1. + SH060878 BAL0683 -1. BAL0678 1. + SH060179 COST 879.45 TRAN0601 1. + SH060179 BAL0601 -1. BAL0679 1. + SH060279 COST 330.87 TRAN0602 1. + SH060279 BAL0602 -1. BAL0679 1. + SH060379 COST 849.93 TRAN0603 1. + SH060379 BAL0603 -1. BAL0679 1. + SH060479 COST 885.6 TRAN0604 1. + SH060479 BAL0604 -1. BAL0679 1. + SH060879 COST 868.38 TRAN0608 1. + SH060879 BAL0683 -1. BAL0679 1. + SH060180 COST 389.91 TRAN0601 1. + SH060180 BAL0601 -1. BAL0680 1. + SH060280 COST 485.85 TRAN0602 1. + SH060280 BAL0602 -1. BAL0680 1. + SH060380 COST 537.51 TRAN0603 1. + SH060380 BAL0603 -1. BAL0680 1. + SH060480 COST 460.02 TRAN0604 1. + SH060480 BAL0604 -1. BAL0680 1. + SH060580 COST 621.15 TRAN0605 1. + SH060580 BAL0605 -1. BAL0680 1. + SH060880 COST 295.2 TRAN0608 1. + SH060880 BAL0683 -1. BAL0680 1. + SH060182 COST 715.86 TRAN0601 1. + SH060182 BAL0601 -1. BAL0682 1. + SH060282 COST 404.67 TRAN0602 1. + SH060282 BAL0602 -1. BAL0682 1. + SH060382 COST 805.65 TRAN0603 1. + SH060382 BAL0603 -1. BAL0682 1. + SH060482 COST 868.38 TRAN0604 1. + SH060482 BAL0604 -1. BAL0682 1. + SH060582 COST 1410.81 TRAN0605 1. + SH060582 BAL0605 -1. BAL0682 1. + SH060882 COST 963.09 TRAN0608 1. + SH060882 BAL0683 -1. BAL0682 1. + SH060183 COST 217.71 TRAN0601 1. + SH060183 BAL0601 -1. BAL0683 1. + SH060283 COST 639.6 TRAN0602 1. + SH060283 BAL0602 -1. BAL0683 1. + SH060383 COST 334.56 TRAN0603 1. + SH060383 BAL0603 -1. BAL0683 1. + SH060483 COST 72.57 TRAN0604 1. + SH060483 BAL0604 -1. BAL0683 1. + SH060583 COST 426.81 TRAN0605 1. + SH060583 BAL0605 -1. BAL0683 1. + SH060683 COST 305.04 TRAN0606 1. + SH060683 BAL0652 -1. BAL0683 1. + SH060184 COST 373.92 TRAN0601 1. + SH060184 BAL0601 -1. BAL0684 1. + SH060284 COST 236.16 TRAN0602 1. + SH060284 BAL0602 -1. BAL0684 1. + SH060384 COST 447.72 TRAN0603 1. + SH060384 BAL0603 -1. BAL0684 1. + SH060484 COST 455.1 TRAN0604 1. + SH060484 BAL0604 -1. BAL0684 1. + SH060584 COST 602.7 TRAN0605 1. + SH060584 BAL0605 -1. BAL0684 1. + SH060684 COST 375.15 TRAN0606 1. + SH060684 BAL0652 -1. BAL0684 1. + SH060884 COST 477.24 TRAN0608 1. + SH060884 BAL0683 -1. BAL0684 1. + SH070201 COST 323.73 TRAN0702 1. + SH070201 BAL0702 -1. BAL0701 1. + SH070301 COST 124.26 TRAN0703 1. + SH070301 BAL0703 -1. BAL0701 1. + SH070401 COST 226.72 TRAN0704 1. + SH070401 BAL0704 -1. BAL0701 1. + SH070501 COST 258.33 TRAN0705 1. + SH070501 BAL0705 -1. BAL0701 1. + SH070601 COST 137.34 TRAN0706 1. + SH070601 BAL0752 -1. BAL0701 1. + SH070801 COST 155.87 TRAN0708 1. + SH070801 BAL0783 -1. BAL0701 1. + SH070102 COST 516.66 TRAN0701 1. + SH070102 BAL0701 -1. BAL0702 1. + SH070302 COST 454.53 TRAN0703 1. + SH070302 BAL0703 -1. BAL0702 1. + SH070402 COST 667.08 TRAN0704 1. + SH070402 BAL0704 -1. BAL0702 1. + SH070502 COST 807.69 TRAN0705 1. + SH070502 BAL0705 -1. BAL0702 1. + SH070602 COST 412.02 TRAN0706 1. + SH070602 BAL0752 -1. BAL0702 1. + SH070802 COST 567.89 TRAN0708 1. + SH070802 BAL0783 -1. BAL0702 1. + SH070103 COST 267.05 TRAN0701 1. + SH070103 BAL0701 -1. BAL0703 1. + SH070203 COST 516.66 TRAN0702 1. + SH070203 BAL0702 -1. BAL0703 1. + SH070403 COST 400.03 TRAN0704 1. + SH070403 BAL0704 -1. BAL0703 1. + SH070503 COST 309.56 TRAN0705 1. + SH070503 BAL0705 -1. BAL0703 1. + SH070603 COST 98.1 TRAN0706 1. + SH070603 BAL0752 -1. BAL0703 1. + SH070803 COST 277.95 TRAN0708 1. + SH070803 BAL0783 -1. BAL0703 1. + SH070104 COST 189.66 TRAN0701 1. + SH070104 BAL0701 -1. BAL0704 1. + SH070204 COST 548.27 TRAN0702 1. + SH070204 BAL0702 -1. BAL0704 1. + SH070304 COST 264.87 TRAN0703 1. + SH070304 BAL0703 -1. BAL0704 1. + SH070504 COST 347.71 TRAN0705 1. + SH070504 BAL0705 -1. BAL0704 1. + SH070604 COST 267.05 TRAN0706 1. + SH070604 BAL0752 -1. BAL0704 1. + SH070704 COST 293.21 TRAN0707 1. + SH070704 BAL0764 -1. BAL0704 1. + SH070804 COST 63.22 TRAN0708 1. + SH070804 BAL0783 -1. BAL0704 1. + SH070105 COST 294.3 TRAN0701 1. + SH070105 BAL0701 -1. BAL0705 1. + SH070205 COST 562.44 TRAN0702 1. + SH070205 BAL0702 -1. BAL0705 1. + SH070305 COST 309.56 TRAN0703 1. + SH070305 BAL0703 -1. BAL0705 1. + SH070405 COST 310.65 TRAN0704 1. + SH070405 BAL0704 -1. BAL0705 1. + SH070605 COST 355.34 TRAN0706 1. + SH070605 BAL0752 -1. BAL0705 1. + SH070705 COST 364.06 TRAN0707 1. + SH070705 BAL0764 -1. BAL0705 1. + SH070805 COST 295.39 TRAN0708 1. + SH070805 BAL0783 -1. BAL0705 1. + SH070106 COST 216.91 TRAN0701 1. + SH070106 BAL0701 -1. BAL0706 1. + SH070206 COST 454.53 TRAN0702 1. + SH070206 BAL0702 -1. BAL0706 1. + SH070306 COST 232.17 TRAN0703 1. + SH070306 BAL0703 -1. BAL0706 1. + SH070406 COST 238.71 TRAN0704 1. + SH070406 BAL0704 -1. BAL0706 1. + SH070506 COST 274.68 TRAN0705 1. + SH070506 BAL0705 -1. BAL0706 1. + SH070606 COST 224.54 TRAN0706 1. + SH070606 BAL0752 -1. BAL0706 1. + SH070706 COST 218. TRAN0707 1. + SH070706 BAL0764 -1. BAL0706 1. + SH070806 COST 164.59 TRAN0708 1. + SH070806 BAL0783 -1. BAL0706 1. + SH070107 COST 22.89 TRAN0701 1. + SH070107 BAL0701 -1. BAL0707 1. + SH070207 COST 318.28 TRAN0702 1. + SH070207 BAL0702 -1. BAL0707 1. + SH070307 COST 135.16 TRAN0703 1. + SH070307 BAL0703 -1. BAL0707 1. + SH070407 COST 225.63 TRAN0704 1. + SH070407 BAL0704 -1. BAL0707 1. + SH070507 COST 249.61 TRAN0705 1. + SH070507 BAL0705 -1. BAL0707 1. + SH070607 COST 136.25 TRAN0706 1. + SH070607 BAL0752 -1. BAL0707 1. + SH070707 COST 252.88 TRAN0707 1. + SH070707 BAL0764 -1. BAL0707 1. + SH070807 COST 168.95 TRAN0708 1. + SH070807 BAL0783 -1. BAL0707 1. + SH070108 COST 71.94 TRAN0701 1. + SH070108 BAL0701 -1. BAL0708 1. + SH070208 COST 409.84 TRAN0702 1. + SH070208 BAL0702 -1. BAL0708 1. + SH070308 COST 153.69 TRAN0703 1. + SH070308 BAL0703 -1. BAL0708 1. + SH070408 COST 269.23 TRAN0704 1. + SH070408 BAL0704 -1. BAL0708 1. + SH070508 COST 198.38 TRAN0705 1. + SH070508 BAL0705 -1. BAL0708 1. + SH070608 COST 180.94 TRAN0706 1. + SH070608 BAL0752 -1. BAL0708 1. + SH070808 COST 203.83 TRAN0708 1. + SH070808 BAL0783 -1. BAL0708 1. + SH070109 COST 150.42 TRAN0701 1. + SH070109 BAL0701 -1. BAL0709 1. + SH070209 COST 417.47 TRAN0702 1. + SH070209 BAL0702 -1. BAL0709 1. + SH070309 COST 183.12 TRAN0703 1. + SH070309 BAL0703 -1. BAL0709 1. + SH070409 COST 275.77 TRAN0704 1. + SH070409 BAL0704 -1. BAL0709 1. + SH070509 COST 260.51 TRAN0705 1. + SH070509 BAL0705 -1. BAL0709 1. + SH070709 COST 213.64 TRAN0707 1. + SH070709 BAL0764 -1. BAL0709 1. + SH070809 COST 211.46 TRAN0708 1. + SH070809 BAL0783 -1. BAL0709 1. + SH070110 COST 269.23 TRAN0701 1. + SH070110 BAL0701 -1. BAL0710 1. + SH070210 COST 172.22 TRAN0702 1. + SH070210 BAL0702 -1. BAL0710 1. + SH070310 COST 261.6 TRAN0703 1. + SH070310 BAL0703 -1. BAL0710 1. + SH070410 COST 391.31 TRAN0704 1. + SH070410 BAL0704 -1. BAL0710 1. + SH070510 COST 419.65 TRAN0705 1. + SH070510 BAL0705 -1. BAL0710 1. + SH070610 COST 245.25 TRAN0706 1. + SH070610 BAL0752 -1. BAL0710 1. + SH070810 COST 332.45 TRAN0708 1. + SH070810 BAL0783 -1. BAL0710 1. + SH070111 COST 115.54 TRAN0701 1. + SH070111 BAL0701 -1. BAL0711 1. + SH070211 COST 539.55 TRAN0702 1. + SH070211 BAL0702 -1. BAL0711 1. + SH070311 COST 270.32 TRAN0703 1. + SH070311 BAL0703 -1. BAL0711 1. + SH070411 COST 151.51 TRAN0704 1. + SH070411 BAL0704 -1. BAL0711 1. + SH070511 COST 371.69 TRAN0705 1. + SH070511 BAL0705 -1. BAL0711 1. + SH070611 COST 213.64 TRAN0706 1. + SH070611 BAL0752 -1. BAL0711 1. + SH070811 COST 111.18 TRAN0708 1. + SH070811 BAL0783 -1. BAL0711 1. + SH070112 COST 95.92 TRAN0701 1. + SH070112 BAL0701 -1. BAL0712 1. + SH070212 COST 369.51 TRAN0702 1. + SH070212 BAL0702 -1. BAL0712 1. + SH070312 COST 159.14 TRAN0703 1. + SH070312 BAL0703 -1. BAL0712 1. + SH070412 COST 218. TRAN0704 1. + SH070412 BAL0704 -1. BAL0712 1. + SH070512 COST 291.03 TRAN0705 1. + SH070512 BAL0705 -1. BAL0712 1. + SH070612 COST 158.05 TRAN0706 1. + SH070612 BAL0752 -1. BAL0712 1. + SH070812 COST 159.14 TRAN0708 1. + SH070812 BAL0783 -1. BAL0712 1. + SH070114 COST 154.78 TRAN0701 1. + SH070114 BAL0701 -1. BAL0714 1. + SH070214 COST 449.08 TRAN0702 1. + SH070214 BAL0702 -1. BAL0714 1. + SH070314 COST 213.64 TRAN0703 1. + SH070314 BAL0703 -1. BAL0714 1. + SH070414 COST 216.91 TRAN0704 1. + SH070414 BAL0704 -1. BAL0714 1. + SH070514 COST 383.68 TRAN0705 1. + SH070514 BAL0705 -1. BAL0714 1. + SH070614 COST 204.92 TRAN0706 1. + SH070614 BAL0752 -1. BAL0714 1. + SH070814 COST 137.34 TRAN0708 1. + SH070814 BAL0783 -1. BAL0714 1. + SH070115 COST 330.27 TRAN0701 1. + SH070115 BAL0701 -1. BAL0715 1. + SH070215 COST 173.31 TRAN0702 1. + SH070215 BAL0702 -1. BAL0715 1. + SH070315 COST 255.06 TRAN0703 1. + SH070315 BAL0703 -1. BAL0715 1. + SH070415 COST 518.84 TRAN0704 1. + SH070415 BAL0704 -1. BAL0715 1. + SH070515 COST 433.82 TRAN0705 1. + SH070515 BAL0705 -1. BAL0715 1. + SH070615 COST 204.92 TRAN0706 1. + SH070615 BAL0752 -1. BAL0715 1. + SH070815 COST 406.57 TRAN0708 1. + SH070815 BAL0783 -1. BAL0715 1. + SH070116 COST 172.22 TRAN0701 1. + SH070116 BAL0701 -1. BAL0716 1. + SH070216 COST 305.2 TRAN0702 1. + SH070216 BAL0702 -1. BAL0716 1. + SH070316 COST 247.43 TRAN0703 1. + SH070316 BAL0703 -1. BAL0716 1. + SH070416 COST 312.83 TRAN0704 1. + SH070416 BAL0704 -1. BAL0716 1. + SH070516 COST 347.71 TRAN0705 1. + SH070516 BAL0705 -1. BAL0716 1. + SH070616 COST 142.79 TRAN0706 1. + SH070616 BAL0752 -1. BAL0716 1. + SH070816 COST 223.45 TRAN0708 1. + SH070816 BAL0783 -1. BAL0716 1. + SH070117 COST 164.59 TRAN0701 1. + SH070117 BAL0701 -1. BAL0717 1. + SH070217 COST 550.45 TRAN0702 1. + SH070217 BAL0702 -1. BAL0717 1. + SH070317 COST 298.66 TRAN0703 1. + SH070317 BAL0703 -1. BAL0717 1. + SH070417 COST 62.13 TRAN0704 1. + SH070417 BAL0704 -1. BAL0717 1. + SH070517 COST 324.82 TRAN0705 1. + SH070517 BAL0705 -1. BAL0717 1. + SH070717 COST 321.55 TRAN0707 1. + SH070717 BAL0764 -1. BAL0717 1. + SH070817 COST 29.43 TRAN0708 1. + SH070817 BAL0783 -1. BAL0717 1. + SH070118 COST 190.75 TRAN0701 1. + SH070118 BAL0701 -1. BAL0718 1. + SH070218 COST 393.49 TRAN0702 1. + SH070218 BAL0702 -1. BAL0718 1. + SH070318 COST 294.3 TRAN0703 1. + SH070318 BAL0703 -1. BAL0718 1. + SH070418 COST 167.86 TRAN0704 1. + SH070418 BAL0704 -1. BAL0718 1. + SH070518 COST 443.63 TRAN0705 1. + SH070518 BAL0705 -1. BAL0718 1. + SH070618 COST 383.68 TRAN0706 1. + SH070618 BAL0752 -1. BAL0718 1. + SH070818 COST 112.27 TRAN0708 1. + SH070818 BAL0783 -1. BAL0718 1. + SH070119 COST 270.32 TRAN0701 1. + SH070119 BAL0701 -1. BAL0719 1. + SH070219 COST 748.83 TRAN0702 1. + SH070219 BAL0702 -1. BAL0719 1. + SH070319 COST 345.53 TRAN0703 1. + SH070319 BAL0703 -1. BAL0719 1. + SH070419 COST 173.31 TRAN0704 1. + SH070419 BAL0704 -1. BAL0719 1. + SH070519 COST 226.72 TRAN0705 1. + SH070519 BAL0705 -1. BAL0719 1. + SH070619 COST 376.05 TRAN0706 1. + SH070619 BAL0752 -1. BAL0719 1. + SH070819 COST 107.91 TRAN0708 1. + SH070819 BAL0783 -1. BAL0719 1. + SH070120 COST 223.45 TRAN0701 1. + SH070120 BAL0701 -1. BAL0720 1. + SH070220 COST 744.47 TRAN0702 1. + SH070220 BAL0702 -1. BAL0720 1. + SH070320 COST 323.73 TRAN0703 1. + SH070320 BAL0703 -1. BAL0720 1. + SH070420 COST 123.17 TRAN0704 1. + SH070420 BAL0704 -1. BAL0720 1. + SH070520 COST 317.19 TRAN0705 1. + SH070520 BAL0705 -1. BAL0720 1. + SH070820 COST 137.34 TRAN0708 1. + SH070820 BAL0783 -1. BAL0720 1. + SH070121 COST 439.27 TRAN0701 1. + SH070121 BAL0701 -1. BAL0721 1. + SH070221 COST 401.12 TRAN0702 1. + SH070221 BAL0702 -1. BAL0721 1. + SH070321 COST 486.14 TRAN0703 1. + SH070321 BAL0703 -1. BAL0721 1. + SH070421 COST 348.8 TRAN0704 1. + SH070421 BAL0704 -1. BAL0721 1. + SH070521 COST 599.5 TRAN0705 1. + SH070521 BAL0705 -1. BAL0721 1. + SH070821 COST 348.8 TRAN0708 1. + SH070821 BAL0783 -1. BAL0721 1. + SH070122 COST 270.32 TRAN0701 1. + SH070122 BAL0701 -1. BAL0722 1. + SH070222 COST 630.02 TRAN0702 1. + SH070222 BAL0702 -1. BAL0722 1. + SH070322 COST 325.91 TRAN0703 1. + SH070322 BAL0703 -1. BAL0722 1. + SH070422 COST 244.16 TRAN0704 1. + SH070422 BAL0704 -1. BAL0722 1. + SH070522 COST 195.11 TRAN0705 1. + SH070522 BAL0705 -1. BAL0722 1. + SH070622 COST 337.9 TRAN0706 1. + SH070622 BAL0752 -1. BAL0722 1. + SH070822 COST 151.51 TRAN0708 1. + SH070822 BAL0783 -1. BAL0722 1. + SH070123 COST 255.06 TRAN0701 1. + SH070123 BAL0701 -1. BAL0723 1. + SH070223 COST 589.69 TRAN0702 1. + SH070223 BAL0702 -1. BAL0723 1. + SH070323 COST 312.83 TRAN0703 1. + SH070323 BAL0703 -1. BAL0723 1. + SH070423 COST 182.03 TRAN0704 1. + SH070423 BAL0704 -1. BAL0723 1. + SH070523 COST 180.94 TRAN0705 1. + SH070523 BAL0705 -1. BAL0723 1. + SH070823 COST 151.51 TRAN0708 1. + SH070823 BAL0783 -1. BAL0723 1. + SH070124 COST 1565.24 TRAN0701 1. + SH070124 BAL0701 -1. BAL0724 1. + SH070125 COST 421.83 TRAN0701 1. + SH070125 BAL0701 -1. BAL0725 1. + SH070225 COST 465.43 TRAN0702 1. + SH070225 BAL0702 -1. BAL0725 1. + SH070325 COST 556.99 TRAN0703 1. + SH070325 BAL0703 -1. BAL0725 1. + SH070425 COST 379.32 TRAN0704 1. + SH070425 BAL0704 -1. BAL0725 1. + SH070525 COST 616.94 TRAN0705 1. + SH070525 BAL0705 -1. BAL0725 1. + SH070625 COST 439.27 TRAN0706 1. + SH070625 BAL0752 -1. BAL0725 1. + SH070825 COST 332.45 TRAN0708 1. + SH070825 BAL0783 -1. BAL0725 1. + SH070426 COST 294.3 TRAN0704 1. + SH070426 BAL0704 -1. BAL0726 1. + SH070127 COST 255.06 TRAN0701 1. + SH070127 BAL0701 -1. BAL0727 1. + SH070227 COST 309.56 TRAN0702 1. + SH070227 BAL0702 -1. BAL0727 1. + SH070327 COST 315.01 TRAN0703 1. + SH070327 BAL0703 -1. BAL0727 1. + SH070427 COST 365.15 TRAN0704 1. + SH070427 BAL0704 -1. BAL0727 1. + SH070527 COST 412.02 TRAN0705 1. + SH070527 BAL0705 -1. BAL0727 1. + SH070627 COST 292.12 TRAN0706 1. + SH070627 BAL0752 -1. BAL0727 1. + SH070827 COST 274.68 TRAN0708 1. + SH070827 BAL0783 -1. BAL0727 1. + SH070128 COST 264.87 TRAN0701 1. + SH070128 BAL0701 -1. BAL0728 1. + SH070228 COST 620.21 TRAN0702 1. + SH070228 BAL0702 -1. BAL0728 1. + SH070328 COST 322.64 TRAN0703 1. + SH070328 BAL0703 -1. BAL0728 1. + SH070428 COST 321.55 TRAN0704 1. + SH070428 BAL0704 -1. BAL0728 1. + SH070528 COST 111.18 TRAN0705 1. + SH070528 BAL0705 -1. BAL0728 1. + SH070628 COST 284.49 TRAN0706 1. + SH070628 BAL0752 -1. BAL0728 1. + SH070728 COST 116.63 TRAN0707 1. + SH070728 BAL0764 -1. BAL0728 1. + SH070828 COST 276.86 TRAN0708 1. + SH070828 BAL0783 -1. BAL0728 1. + SH070129 COST 243.07 TRAN0701 1. + SH070129 BAL0701 -1. BAL0729 1. + SH070229 COST 505.76 TRAN0702 1. + SH070229 BAL0702 -1. BAL0729 1. + SH070329 COST 262.69 TRAN0703 1. + SH070329 BAL0703 -1. BAL0729 1. + SH070429 COST 216.91 TRAN0704 1. + SH070429 BAL0704 -1. BAL0729 1. + SH070529 COST 468.7 TRAN0705 1. + SH070529 BAL0705 -1. BAL0729 1. + SH070629 COST 284.49 TRAN0706 1. + SH070629 BAL0752 -1. BAL0729 1. + SH070829 COST 156.96 TRAN0708 1. + SH070829 BAL0783 -1. BAL0729 1. + SH070130 COST 507.94 TRAN0701 1. + SH070130 BAL0701 -1. BAL0730 1. + SH070230 COST 475.24 TRAN0702 1. + SH070230 BAL0702 -1. BAL0730 1. + SH070330 COST 570.07 TRAN0703 1. + SH070330 BAL0703 -1. BAL0730 1. + SH070430 COST 331.36 TRAN0704 1. + SH070430 BAL0704 -1. BAL0730 1. + SH070530 COST 486.14 TRAN0705 1. + SH070530 BAL0705 -1. BAL0730 1. + SH070830 COST 416.38 TRAN0708 1. + SH070830 BAL0783 -1. BAL0730 1. + SH070131 COST 120.99 TRAN0701 1. + SH070131 BAL0701 -1. BAL0731 1. + SH070231 COST 382.59 TRAN0702 1. + SH070231 BAL0702 -1. BAL0731 1. + SH070331 COST 119.9 TRAN0703 1. + SH070331 BAL0703 -1. BAL0731 1. + SH070431 COST 275.77 TRAN0704 1. + SH070431 BAL0704 -1. BAL0731 1. + SH070531 COST 334.63 TRAN0705 1. + SH070531 BAL0705 -1. BAL0731 1. + SH070631 COST 122.08 TRAN0706 1. + SH070631 BAL0752 -1. BAL0731 1. + SH070831 COST 243.07 TRAN0708 1. + SH070831 BAL0783 -1. BAL0731 1. + SH070132 COST 325.91 TRAN0701 1. + SH070132 BAL0701 -1. BAL0732 1. + SH070232 COST 521.02 TRAN0702 1. + SH070232 BAL0702 -1. BAL0732 1. + SH070332 COST 461.07 TRAN0703 1. + SH070332 BAL0703 -1. BAL0732 1. + SH070432 COST 171.13 TRAN0704 1. + SH070432 BAL0704 -1. BAL0732 1. + SH070532 COST 427.28 TRAN0705 1. + SH070532 BAL0705 -1. BAL0732 1. + SH070832 COST 196.2 TRAN0708 1. + SH070832 BAL0783 -1. BAL0732 1. + SH070133 COST 537.37 TRAN0701 1. + SH070133 BAL0701 -1. BAL0733 1. + SH070233 COST 436. TRAN0702 1. + SH070233 BAL0702 -1. BAL0733 1. + SH070333 COST 591.87 TRAN0703 1. + SH070333 BAL0703 -1. BAL0733 1. + SH070433 COST 485.05 TRAN0704 1. + SH070433 BAL0704 -1. BAL0733 1. + SH070533 COST 687.79 TRAN0705 1. + SH070533 BAL0705 -1. BAL0733 1. + SH070833 COST 415.29 TRAN0708 1. + SH070833 BAL0783 -1. BAL0733 1. + SH070134 COST 420.74 TRAN0701 1. + SH070134 BAL0701 -1. BAL0734 1. + SH070234 COST 713.95 TRAN0702 1. + SH070234 BAL0702 -1. BAL0734 1. + SH070334 COST 548.27 TRAN0703 1. + SH070334 BAL0703 -1. BAL0734 1. + SH070434 COST 229.99 TRAN0704 1. + SH070434 BAL0704 -1. BAL0734 1. + SH070534 COST 480.69 TRAN0705 1. + SH070534 BAL0705 -1. BAL0734 1. + SH070834 COST 286.67 TRAN0708 1. + SH070834 BAL0783 -1. BAL0734 1. + SH070135 COST 502.49 TRAN0701 1. + SH070135 BAL0701 -1. BAL0735 1. + SH070235 COST 485.05 TRAN0702 1. + SH070235 BAL0702 -1. BAL0735 1. + SH070335 COST 410.93 TRAN0703 1. + SH070335 BAL0703 -1. BAL0735 1. + SH070435 COST 132.98 TRAN0704 1. + SH070435 BAL0704 -1. BAL0735 1. + SH070535 COST 469.79 TRAN0705 1. + SH070535 BAL0705 -1. BAL0735 1. + SH070835 COST 256.15 TRAN0708 1. + SH070835 BAL0783 -1. BAL0735 1. + SH070136 COST 223.45 TRAN0701 1. + SH070136 BAL0701 -1. BAL0736 1. + SH070236 COST 488.32 TRAN0702 1. + SH070236 BAL0702 -1. BAL0736 1. + SH070336 COST 115.54 TRAN0703 1. + SH070336 BAL0703 -1. BAL0736 1. + SH070436 COST 403.3 TRAN0704 1. + SH070436 BAL0704 -1. BAL0736 1. + SH070536 COST 377.14 TRAN0705 1. + SH070536 BAL0705 -1. BAL0736 1. + SH070636 COST 119.9 TRAN0706 1. + SH070636 BAL0752 -1. BAL0736 1. + SH070836 COST 349.89 TRAN0708 1. + SH070836 BAL0783 -1. BAL0736 1. + SH070137 COST 100.28 TRAN0701 1. + SH070137 BAL0701 -1. BAL0737 1. + SH070237 COST 372.78 TRAN0702 1. + SH070237 BAL0702 -1. BAL0737 1. + SH070337 COST 172.22 TRAN0703 1. + SH070337 BAL0703 -1. BAL0737 1. + SH070437 COST 331.36 TRAN0704 1. + SH070437 BAL0704 -1. BAL0737 1. + SH070537 COST 198.38 TRAN0705 1. + SH070537 BAL0705 -1. BAL0737 1. + SH070637 COST 211.46 TRAN0706 1. + SH070637 BAL0752 -1. BAL0737 1. + SH070837 COST 274.68 TRAN0708 1. + SH070837 BAL0783 -1. BAL0737 1. + SH070138 COST 148.24 TRAN0701 1. + SH070138 BAL0701 -1. BAL0738 1. + SH070238 COST 265.96 TRAN0702 1. + SH070238 BAL0702 -1. BAL0738 1. + SH070338 COST 103.55 TRAN0703 1. + SH070338 BAL0703 -1. BAL0738 1. + SH070438 COST 335.72 TRAN0704 1. + SH070438 BAL0704 -1. BAL0738 1. + SH070538 COST 303.02 TRAN0705 1. + SH070538 BAL0705 -1. BAL0738 1. + SH070638 COST 42.51 TRAN0706 1. + SH070638 BAL0752 -1. BAL0738 1. + SH070738 COST 235.44 TRAN0707 1. + SH070738 BAL0764 -1. BAL0738 1. + SH070838 COST 258.33 TRAN0708 1. + SH070838 BAL0783 -1. BAL0738 1. + SH070139 COST 141.7 TRAN0701 1. + SH070139 BAL0701 -1. BAL0739 1. + SH070239 COST 369.51 TRAN0702 1. + SH070239 BAL0702 -1. BAL0739 1. + SH070339 COST 174.4 TRAN0703 1. + SH070339 BAL0703 -1. BAL0739 1. + SH070439 COST 271.41 TRAN0704 1. + SH070439 BAL0704 -1. BAL0739 1. + SH070539 COST 467.61 TRAN0705 1. + SH070539 BAL0705 -1. BAL0739 1. + SH070639 COST 222.36 TRAN0706 1. + SH070639 BAL0752 -1. BAL0739 1. + SH070839 COST 183.12 TRAN0708 1. + SH070839 BAL0783 -1. BAL0739 1. + SH070140 COST 179.85 TRAN0701 1. + SH070140 BAL0701 -1. BAL0740 1. + SH070240 COST 412.02 TRAN0702 1. + SH070240 BAL0702 -1. BAL0740 1. + SH070340 COST 112.27 TRAN0703 1. + SH070340 BAL0703 -1. BAL0740 1. + SH070440 COST 323.73 TRAN0704 1. + SH070440 BAL0704 -1. BAL0740 1. + SH070540 COST 240.89 TRAN0705 1. + SH070540 BAL0705 -1. BAL0740 1. + SH070640 COST 142.79 TRAN0706 1. + SH070640 BAL0752 -1. BAL0740 1. + SH070840 COST 298.66 TRAN0708 1. + SH070840 BAL0783 -1. BAL0740 1. + SH070141 COST 213.64 TRAN0701 1. + SH070141 BAL0701 -1. BAL0741 1. + SH070241 COST 327. TRAN0702 1. + SH070241 BAL0702 -1. BAL0741 1. + SH070341 COST 163.5 TRAN0703 1. + SH070341 BAL0703 -1. BAL0741 1. + SH070441 COST 353.16 TRAN0704 1. + SH070441 BAL0704 -1. BAL0741 1. + SH070541 COST 401.12 TRAN0705 1. + SH070541 BAL0705 -1. BAL0741 1. + SH070641 COST 109. TRAN0706 1. + SH070641 BAL0752 -1. BAL0741 1. + SH070841 COST 325.91 TRAN0708 1. + SH070841 BAL0783 -1. BAL0741 1. + SH070142 COST 98.1 TRAN0701 1. + SH070142 BAL0701 -1. BAL0742 1. + SH070242 COST 451.26 TRAN0702 1. + SH070242 BAL0702 -1. BAL0742 1. + SH070342 COST 174.4 TRAN0703 1. + SH070342 BAL0703 -1. BAL0742 1. + SH070442 COST 212.55 TRAN0704 1. + SH070442 BAL0704 -1. BAL0742 1. + SH070542 COST 393.49 TRAN0705 1. + SH070542 BAL0705 -1. BAL0742 1. + SH070642 COST 175.49 TRAN0706 1. + SH070642 BAL0752 -1. BAL0742 1. + SH070842 COST 165.68 TRAN0708 1. + SH070842 BAL0783 -1. BAL0742 1. + SH070143 COST 173.31 TRAN0701 1. + SH070143 BAL0701 -1. BAL0743 1. + SH070243 COST 430.55 TRAN0702 1. + SH070243 BAL0702 -1. BAL0743 1. + SH070343 COST 27.25 TRAN0703 1. + SH070343 BAL0703 -1. BAL0743 1. + SH070443 COST 322.64 TRAN0704 1. + SH070443 BAL0704 -1. BAL0743 1. + SH070543 COST 281.22 TRAN0705 1. + SH070543 BAL0705 -1. BAL0743 1. + SH070643 COST 109. TRAN0706 1. + SH070643 BAL0752 -1. BAL0743 1. + SH070743 COST 262.69 TRAN0707 1. + SH070743 BAL0764 -1. BAL0743 1. + SH070843 COST 295.39 TRAN0708 1. + SH070843 BAL0783 -1. BAL0743 1. + SH070144 COST 173.31 TRAN0701 1. + SH070144 BAL0701 -1. BAL0744 1. + SH070244 COST 413.11 TRAN0702 1. + SH070244 BAL0702 -1. BAL0744 1. + SH070344 COST 139.52 TRAN0703 1. + SH070344 BAL0703 -1. BAL0744 1. + SH070444 COST 340.08 TRAN0704 1. + SH070444 BAL0704 -1. BAL0744 1. + SH070544 COST 337.9 TRAN0705 1. + SH070544 BAL0705 -1. BAL0744 1. + SH070644 COST 97.01 TRAN0706 1. + SH070644 BAL0752 -1. BAL0744 1. + SH070844 COST 324.82 TRAN0708 1. + SH070844 BAL0783 -1. BAL0744 1. + SH070145 COST 187.48 TRAN0701 1. + SH070145 BAL0701 -1. BAL0745 1. + SH070245 COST 475.24 TRAN0702 1. + SH070245 BAL0702 -1. BAL0745 1. + SH070345 COST 175.49 TRAN0703 1. + SH070345 BAL0703 -1. BAL0745 1. + SH070445 COST 318.28 TRAN0704 1. + SH070445 BAL0704 -1. BAL0745 1. + SH070545 COST 255.06 TRAN0705 1. + SH070545 BAL0705 -1. BAL0745 1. + SH070645 COST 208.19 TRAN0706 1. + SH070645 BAL0752 -1. BAL0745 1. + SH070745 COST 214.73 TRAN0707 1. + SH070745 BAL0764 -1. BAL0745 1. + SH070845 COST 332.45 TRAN0708 1. + SH070845 BAL0783 -1. BAL0745 1. + SH070146 COST 267.05 TRAN0701 1. + SH070146 BAL0701 -1. BAL0746 1. + SH070246 COST 297.57 TRAN0702 1. + SH070246 BAL0702 -1. BAL0746 1. + SH070346 COST 240.89 TRAN0703 1. + SH070346 BAL0703 -1. BAL0746 1. + SH070446 COST 487.23 TRAN0704 1. + SH070446 BAL0704 -1. BAL0746 1. + SH070546 COST 468.7 TRAN0705 1. + SH070546 BAL0705 -1. BAL0746 1. + SH070646 COST 280.13 TRAN0706 1. + SH070646 BAL0752 -1. BAL0746 1. + SH070846 COST 488.32 TRAN0708 1. + SH070846 BAL0783 -1. BAL0746 1. + SH070147 COST 119.9 TRAN0701 1. + SH070147 BAL0701 -1. BAL0747 1. + SH070247 COST 406.57 TRAN0702 1. + SH070247 BAL0702 -1. BAL0747 1. + SH070347 COST 173.31 TRAN0703 1. + SH070347 BAL0703 -1. BAL0747 1. + SH070447 COST 298.66 TRAN0704 1. + SH070447 BAL0704 -1. BAL0747 1. + SH070547 COST 253.97 TRAN0705 1. + SH070547 BAL0705 -1. BAL0747 1. + SH070647 COST 158.05 TRAN0706 1. + SH070647 BAL0752 -1. BAL0747 1. + SH070847 COST 265.96 TRAN0708 1. + SH070847 BAL0783 -1. BAL0747 1. + SH070148 COST 103.55 TRAN0701 1. + SH070148 BAL0701 -1. BAL0748 1. + SH070248 COST 369.51 TRAN0702 1. + SH070248 BAL0702 -1. BAL0748 1. + SH070348 COST 149.33 TRAN0703 1. + SH070348 BAL0703 -1. BAL0748 1. + SH070448 COST 250.7 TRAN0704 1. + SH070448 BAL0704 -1. BAL0748 1. + SH070548 COST 269.23 TRAN0705 1. + SH070548 BAL0705 -1. BAL0748 1. + SH070648 COST 125.35 TRAN0706 1. + SH070648 BAL0752 -1. BAL0748 1. + SH070848 COST 212.55 TRAN0708 1. + SH070848 BAL0783 -1. BAL0748 1. + SH070149 COST 358.61 TRAN0701 1. + SH070149 BAL0701 -1. BAL0749 1. + SH070249 COST 583.15 TRAN0702 1. + SH070249 BAL0702 -1. BAL0749 1. + SH070349 COST 361.88 TRAN0703 1. + SH070349 BAL0703 -1. BAL0749 1. + SH070449 COST 415.29 TRAN0704 1. + SH070449 BAL0704 -1. BAL0749 1. + SH070549 COST 165.68 TRAN0705 1. + SH070549 BAL0705 -1. BAL0749 1. + SH070649 COST 368.42 TRAN0706 1. + SH070649 BAL0752 -1. BAL0749 1. + SH070749 COST 146.06 TRAN0707 1. + SH070749 BAL0764 -1. BAL0749 1. + SH070849 COST 444.72 TRAN0708 1. + SH070849 BAL0783 -1. BAL0749 1. + SH070150 COST 262.69 TRAN0701 1. + SH070150 BAL0701 -1. BAL0750 1. + SH070250 COST 667.08 TRAN0702 1. + SH070250 BAL0702 -1. BAL0750 1. + SH070350 COST 268.14 TRAN0703 1. + SH070350 BAL0703 -1. BAL0750 1. + SH070450 COST 397.85 TRAN0704 1. + SH070450 BAL0704 -1. BAL0750 1. + SH070550 COST 256.15 TRAN0705 1. + SH070550 BAL0705 -1. BAL0750 1. + SH070750 COST 149.33 TRAN0707 1. + SH070750 BAL0764 -1. BAL0750 1. + SH070850 COST 442.54 TRAN0708 1. + SH070850 BAL0783 -1. BAL0750 1. + SH070151 COST 361.88 TRAN0701 1. + SH070151 BAL0701 -1. BAL0751 1. + SH070251 COST 599.5 TRAN0702 1. + SH070251 BAL0702 -1. BAL0751 1. + SH070351 COST 371.69 TRAN0703 1. + SH070351 BAL0703 -1. BAL0751 1. + SH070451 COST 368.42 TRAN0704 1. + SH070451 BAL0704 -1. BAL0751 1. + SH070551 COST 134.07 TRAN0705 1. + SH070551 BAL0705 -1. BAL0751 1. + SH070751 COST 107.91 TRAN0707 1. + SH070751 BAL0764 -1. BAL0751 1. + SH070851 COST 466.52 TRAN0708 1. + SH070851 BAL0783 -1. BAL0751 1. + SH070152 COST 122.08 TRAN0701 1. + SH070152 BAL0701 -1. BAL0752 1. + SH070252 COST 327. TRAN0702 1. + SH070252 BAL0702 -1. BAL0752 1. + SH070352 COST 89.38 TRAN0703 1. + SH070352 BAL0703 -1. BAL0752 1. + SH070452 COST 350.98 TRAN0704 1. + SH070452 BAL0704 -1. BAL0752 1. + SH070552 COST 321.55 TRAN0705 1. + SH070552 BAL0705 -1. BAL0752 1. + SH070852 COST 275.77 TRAN0708 1. + SH070852 BAL0783 -1. BAL0752 1. + SH070153 COST 391.31 TRAN0701 1. + SH070153 BAL0701 -1. BAL0753 1. + SH070253 COST 693.24 TRAN0702 1. + SH070253 BAL0702 -1. BAL0753 1. + SH070353 COST 354.25 TRAN0703 1. + SH070353 BAL0703 -1. BAL0753 1. + SH070453 COST 449.08 TRAN0704 1. + SH070453 BAL0704 -1. BAL0753 1. + SH070553 COST 200.56 TRAN0705 1. + SH070553 BAL0705 -1. BAL0753 1. + SH070653 COST 391.31 TRAN0706 1. + SH070653 BAL0752 -1. BAL0753 1. + SH070753 COST 159.14 TRAN0707 1. + SH070753 BAL0764 -1. BAL0753 1. + SH070853 COST 439.27 TRAN0708 1. + SH070853 BAL0783 -1. BAL0753 1. + SH070154 COST 201.65 TRAN0701 1. + SH070154 BAL0701 -1. BAL0754 1. + SH070254 COST 485.05 TRAN0702 1. + SH070254 BAL0702 -1. BAL0754 1. + SH070354 COST 236.53 TRAN0703 1. + SH070354 BAL0703 -1. BAL0754 1. + SH070454 COST 373.87 TRAN0704 1. + SH070454 BAL0704 -1. BAL0754 1. + SH070554 COST 232.17 TRAN0705 1. + SH070554 BAL0705 -1. BAL0754 1. + SH070654 COST 221.27 TRAN0706 1. + SH070654 BAL0752 -1. BAL0754 1. + SH070854 COST 438.18 TRAN0708 1. + SH070854 BAL0783 -1. BAL0754 1. + SH070155 COST 303.02 TRAN0701 1. + SH070155 BAL0701 -1. BAL0755 1. + SH070255 COST 522.11 TRAN0702 1. + SH070255 BAL0702 -1. BAL0755 1. + SH070355 COST 306.29 TRAN0703 1. + SH070355 BAL0703 -1. BAL0755 1. + SH070455 COST 320.46 TRAN0704 1. + SH070455 BAL0704 -1. BAL0755 1. + SH070555 COST 167.86 TRAN0705 1. + SH070555 BAL0705 -1. BAL0755 1. + SH070655 COST 316.1 TRAN0706 1. + SH070655 BAL0752 -1. BAL0755 1. + SH070755 COST 116.63 TRAN0707 1. + SH070755 BAL0764 -1. BAL0755 1. + SH070855 COST 320.46 TRAN0708 1. + SH070855 BAL0783 -1. BAL0755 1. + SH070156 COST 425.1 TRAN0701 1. + SH070156 BAL0701 -1. BAL0756 1. + SH070256 COST 631.11 TRAN0702 1. + SH070256 BAL0702 -1. BAL0756 1. + SH070356 COST 332.45 TRAN0703 1. + SH070356 BAL0703 -1. BAL0756 1. + SH070456 COST 397.85 TRAN0704 1. + SH070456 BAL0704 -1. BAL0756 1. + SH070556 COST 148.24 TRAN0705 1. + SH070556 BAL0705 -1. BAL0756 1. + SH070656 COST 369.51 TRAN0706 1. + SH070656 BAL0752 -1. BAL0756 1. + SH070756 COST 132.98 TRAN0707 1. + SH070756 BAL0764 -1. BAL0756 1. + SH070856 COST 389.13 TRAN0708 1. + SH070856 BAL0783 -1. BAL0756 1. + SH070157 COST 284.49 TRAN0701 1. + SH070157 BAL0701 -1. BAL0757 1. + SH070257 COST 566.8 TRAN0702 1. + SH070257 BAL0702 -1. BAL0757 1. + SH070357 COST 316.1 TRAN0703 1. + SH070357 BAL0703 -1. BAL0757 1. + SH070457 COST 255.06 TRAN0704 1. + SH070457 BAL0704 -1. BAL0757 1. + SH070557 COST 183.12 TRAN0705 1. + SH070557 BAL0705 -1. BAL0757 1. + SH070657 COST 347.71 TRAN0706 1. + SH070657 BAL0752 -1. BAL0757 1. + SH070757 COST 161.32 TRAN0707 1. + SH070757 BAL0764 -1. BAL0757 1. + SH070857 COST 251.79 TRAN0708 1. + SH070857 BAL0783 -1. BAL0757 1. + SH070158 COST 320.46 TRAN0701 1. + SH070158 BAL0701 -1. BAL0758 1. + SH070258 COST 567.89 TRAN0702 1. + SH070258 BAL0702 -1. BAL0758 1. + SH070358 COST 303.02 TRAN0703 1. + SH070358 BAL0703 -1. BAL0758 1. + SH070458 COST 373.87 TRAN0704 1. + SH070458 BAL0704 -1. BAL0758 1. + SH070558 COST 22.89 TRAN0705 1. + SH070558 BAL0705 -1. BAL0758 1. + SH070658 COST 355.34 TRAN0706 1. + SH070658 BAL0752 -1. BAL0758 1. + SH070758 COST 74.12 TRAN0707 1. + SH070758 BAL0764 -1. BAL0758 1. + SH070858 COST 276.86 TRAN0708 1. + SH070858 BAL0783 -1. BAL0758 1. + SH070159 COST 224.54 TRAN0701 1. + SH070159 BAL0701 -1. BAL0759 1. + SH070259 COST 542.82 TRAN0702 1. + SH070259 BAL0702 -1. BAL0759 1. + SH070359 COST 259.42 TRAN0703 1. + SH070359 BAL0703 -1. BAL0759 1. + SH070459 COST 265.96 TRAN0704 1. + SH070459 BAL0704 -1. BAL0759 1. + SH070559 COST 173.31 TRAN0705 1. + SH070559 BAL0705 -1. BAL0759 1. + SH070659 COST 323.73 TRAN0706 1. + SH070659 BAL0752 -1. BAL0759 1. + SH070759 COST 114.45 TRAN0707 1. + SH070759 BAL0764 -1. BAL0759 1. + SH070859 COST 277.95 TRAN0708 1. + SH070859 BAL0783 -1. BAL0759 1. + SH070160 COST 284.49 TRAN0701 1. + SH070160 BAL0701 -1. BAL0760 1. + SH070260 COST 599.5 TRAN0702 1. + SH070260 BAL0702 -1. BAL0760 1. + SH070360 COST 308.47 TRAN0703 1. + SH070360 BAL0703 -1. BAL0760 1. + SH070460 COST 340.08 TRAN0704 1. + SH070460 BAL0704 -1. BAL0760 1. + SH070560 COST 147.15 TRAN0705 1. + SH070560 BAL0705 -1. BAL0760 1. + SH070660 COST 352.07 TRAN0706 1. + SH070660 BAL0752 -1. BAL0760 1. + SH070760 COST 95.92 TRAN0707 1. + SH070760 BAL0764 -1. BAL0760 1. + SH070860 COST 325.91 TRAN0708 1. + SH070860 BAL0783 -1. BAL0760 1. + SH070163 COST 289.94 TRAN0701 1. + SH070163 BAL0701 -1. BAL0763 1. + SH070263 COST 538.46 TRAN0702 1. + SH070263 BAL0702 -1. BAL0763 1. + SH070363 COST 312.83 TRAN0703 1. + SH070363 BAL0703 -1. BAL0763 1. + SH070463 COST 402.21 TRAN0704 1. + SH070463 BAL0704 -1. BAL0763 1. + SH070563 COST 165.68 TRAN0705 1. + SH070563 BAL0705 -1. BAL0763 1. + SH070663 COST 343.35 TRAN0706 1. + SH070663 BAL0752 -1. BAL0763 1. + SH070763 COST 135.16 TRAN0707 1. + SH070763 BAL0764 -1. BAL0763 1. + SH070863 COST 436. TRAN0708 1. + SH070863 BAL0783 -1. BAL0763 1. + SH070164 COST 216.91 TRAN0701 1. + SH070164 BAL0701 -1. BAL0764 1. + SH070264 COST 573.34 TRAN0702 1. + SH070264 BAL0702 -1. BAL0764 1. + SH070364 COST 243.07 TRAN0703 1. + SH070364 BAL0703 -1. BAL0764 1. + SH070464 COST 366.24 TRAN0704 1. + SH070464 BAL0704 -1. BAL0764 1. + SH070564 COST 63.22 TRAN0705 1. + SH070564 BAL0705 -1. BAL0764 1. + SH070664 COST 345.53 TRAN0706 1. + SH070664 BAL0752 -1. BAL0764 1. + SH070864 COST 272.5 TRAN0708 1. + SH070864 BAL0783 -1. BAL0764 1. + SH070165 COST 470.88 TRAN0701 1. + SH070165 BAL0701 -1. BAL0765 1. + SH070265 COST 334.63 TRAN0702 1. + SH070265 BAL0702 -1. BAL0765 1. + SH070365 COST 550.45 TRAN0703 1. + SH070365 BAL0703 -1. BAL0765 1. + SH070465 COST 422.92 TRAN0704 1. + SH070465 BAL0704 -1. BAL0765 1. + SH070565 COST 658.36 TRAN0705 1. + SH070565 BAL0705 -1. BAL0765 1. + SH070865 COST 452.35 TRAN0708 1. + SH070865 BAL0783 -1. BAL0765 1. + SH070166 COST 610.4 TRAN0701 1. + SH070166 BAL0701 -1. BAL0766 1. + SH070266 COST 282.31 TRAN0702 1. + SH070266 BAL0702 -1. BAL0766 1. + SH070366 COST 630.02 TRAN0703 1. + SH070366 BAL0703 -1. BAL0766 1. + SH070466 COST 606.04 TRAN0704 1. + SH070466 BAL0704 -1. BAL0766 1. + SH070566 COST 773.9 TRAN0705 1. + SH070566 BAL0705 -1. BAL0766 1. + SH070866 COST 610.4 TRAN0708 1. + SH070866 BAL0783 -1. BAL0766 1. + SH070167 COST 463.25 TRAN0701 1. + SH070167 BAL0701 -1. BAL0767 1. + SH070267 COST 252.88 TRAN0702 1. + SH070267 BAL0702 -1. BAL0767 1. + SH070367 COST 537.37 TRAN0703 1. + SH070367 BAL0703 -1. BAL0767 1. + SH070467 COST 498.13 TRAN0704 1. + SH070467 BAL0704 -1. BAL0767 1. + SH070567 COST 658.36 TRAN0705 1. + SH070567 BAL0705 -1. BAL0767 1. + SH070867 COST 499.22 TRAN0708 1. + SH070867 BAL0783 -1. BAL0767 1. + SH070168 COST 647.46 TRAN0701 1. + SH070168 BAL0701 -1. BAL0768 1. + SH070268 COST 436. TRAN0702 1. + SH070268 BAL0702 -1. BAL0768 1. + SH070368 COST 610.4 TRAN0703 1. + SH070368 BAL0703 -1. BAL0768 1. + SH070468 COST 765.18 TRAN0704 1. + SH070468 BAL0704 -1. BAL0768 1. + SH070568 COST 1031.14 TRAN0705 1. + SH070568 BAL0705 -1. BAL0768 1. + SH070868 COST 818.59 TRAN0708 1. + SH070868 BAL0783 -1. BAL0768 1. + SH070169 COST 587.51 TRAN0701 1. + SH070169 BAL0701 -1. BAL0769 1. + SH070269 COST 240.89 TRAN0702 1. + SH070269 BAL0702 -1. BAL0769 1. + SH070369 COST 555.9 TRAN0703 1. + SH070369 BAL0703 -1. BAL0769 1. + SH070469 COST 677.98 TRAN0704 1. + SH070469 BAL0704 -1. BAL0769 1. + SH070569 COST 704.14 TRAN0705 1. + SH070569 BAL0705 -1. BAL0769 1. + SH070869 COST 717.22 TRAN0708 1. + SH070869 BAL0783 -1. BAL0769 1. + SH070171 COST 479.6 TRAN0701 1. + SH070171 BAL0701 -1. BAL0771 1. + SH070371 COST 571.16 TRAN0703 1. + SH070371 BAL0703 -1. BAL0771 1. + SH070471 COST 567.89 TRAN0704 1. + SH070471 BAL0704 -1. BAL0771 1. + SH070571 COST 633.29 TRAN0705 1. + SH070571 BAL0705 -1. BAL0771 1. + SH070671 COST 426.19 TRAN0706 1. + SH070671 BAL0752 -1. BAL0771 1. + SH070771 COST 767.36 TRAN0707 1. + SH070771 BAL0764 -1. BAL0771 1. + SH070871 COST 580.97 TRAN0708 1. + SH070871 BAL0783 -1. BAL0771 1. + SH070172 COST 639.83 TRAN0701 1. + SH070172 BAL0701 -1. BAL0772 1. + SH070272 COST 591.87 TRAN0702 1. + SH070272 BAL0702 -1. BAL0772 1. + SH070372 COST 672.53 TRAN0703 1. + SH070372 BAL0703 -1. BAL0772 1. + SH070472 COST 621.3 TRAN0704 1. + SH070472 BAL0704 -1. BAL0772 1. + SH070572 COST 831.67 TRAN0705 1. + SH070572 BAL0705 -1. BAL0772 1. + SH070872 COST 621.3 TRAN0708 1. + SH070872 BAL0783 -1. BAL0772 1. + SH070173 COST 425.1 TRAN0701 1. + SH070173 BAL0701 -1. BAL0773 1. + SH070273 COST 397.85 TRAN0702 1. + SH070273 BAL0702 -1. BAL0773 1. + SH070373 COST 368.42 TRAN0703 1. + SH070373 BAL0703 -1. BAL0773 1. + SH070473 COST 498.13 TRAN0704 1. + SH070473 BAL0704 -1. BAL0773 1. + SH070573 COST 614.76 TRAN0705 1. + SH070573 BAL0705 -1. BAL0773 1. + SH070673 COST 332.45 TRAN0706 1. + SH070673 BAL0752 -1. BAL0773 1. + SH070873 COST 549.36 TRAN0708 1. + SH070873 BAL0783 -1. BAL0773 1. + SH070174 COST 597.32 TRAN0701 1. + SH070174 BAL0701 -1. BAL0774 1. + SH070274 COST 228.9 TRAN0702 1. + SH070274 BAL0702 -1. BAL0774 1. + SH070374 COST 621.3 TRAN0703 1. + SH070374 BAL0703 -1. BAL0774 1. + SH070474 COST 694.33 TRAN0704 1. + SH070474 BAL0704 -1. BAL0774 1. + SH070574 COST 798.97 TRAN0705 1. + SH070574 BAL0705 -1. BAL0774 1. + SH070874 COST 674.71 TRAN0708 1. + SH070874 BAL0783 -1. BAL0774 1. + SH070275 COST 603.86 TRAN0702 1. + SH070275 BAL0702 -1. BAL0775 1. + SH070176 COST 503.58 TRAN0701 1. + SH070176 BAL0701 -1. BAL0776 1. + SH070276 COST 437.09 TRAN0702 1. + SH070276 BAL0702 -1. BAL0776 1. + SH070376 COST 439.27 TRAN0703 1. + SH070376 BAL0703 -1. BAL0776 1. + SH070476 COST 686.7 TRAN0704 1. + SH070476 BAL0704 -1. BAL0776 1. + SH070576 COST 686.7 TRAN0705 1. + SH070576 BAL0705 -1. BAL0776 1. + SH070676 COST 415.29 TRAN0706 1. + SH070676 BAL0752 -1. BAL0776 1. + SH070876 COST 846.93 TRAN0708 1. + SH070876 BAL0783 -1. BAL0776 1. + SH070177 COST 474.15 TRAN0701 1. + SH070177 BAL0701 -1. BAL0777 1. + SH070277 COST 296.48 TRAN0702 1. + SH070277 BAL0702 -1. BAL0777 1. + SH070377 COST 502.49 TRAN0703 1. + SH070377 BAL0703 -1. BAL0777 1. + SH070477 COST 437.09 TRAN0704 1. + SH070477 BAL0704 -1. BAL0777 1. + SH070577 COST 610.4 TRAN0705 1. + SH070577 BAL0705 -1. BAL0777 1. + SH070877 COST 348.8 TRAN0708 1. + SH070877 BAL0783 -1. BAL0777 1. + SH070178 COST 829.49 TRAN0701 1. + SH070178 BAL0701 -1. BAL0778 1. + SH070278 COST 481.78 TRAN0702 1. + SH070278 BAL0702 -1. BAL0778 1. + SH070378 COST 853.47 TRAN0703 1. + SH070378 BAL0703 -1. BAL0778 1. + SH070478 COST 746.65 TRAN0704 1. + SH070478 BAL0704 -1. BAL0778 1. + SH070578 COST 958.11 TRAN0705 1. + SH070578 BAL0705 -1. BAL0778 1. + SH070878 COST 834.94 TRAN0708 1. + SH070878 BAL0783 -1. BAL0778 1. + SH070179 COST 779.35 TRAN0701 1. + SH070179 BAL0701 -1. BAL0779 1. + SH070279 COST 293.21 TRAN0702 1. + SH070279 BAL0702 -1. BAL0779 1. + SH070379 COST 753.19 TRAN0703 1. + SH070379 BAL0703 -1. BAL0779 1. + SH070479 COST 784.8 TRAN0704 1. + SH070479 BAL0704 -1. BAL0779 1. + SH070879 COST 769.54 TRAN0708 1. + SH070879 BAL0783 -1. BAL0779 1. + SH070180 COST 345.53 TRAN0701 1. + SH070180 BAL0701 -1. BAL0780 1. + SH070280 COST 430.55 TRAN0702 1. + SH070280 BAL0702 -1. BAL0780 1. + SH070380 COST 476.33 TRAN0703 1. + SH070380 BAL0703 -1. BAL0780 1. + SH070480 COST 407.66 TRAN0704 1. + SH070480 BAL0704 -1. BAL0780 1. + SH070580 COST 550.45 TRAN0705 1. + SH070580 BAL0705 -1. BAL0780 1. + SH070880 COST 261.6 TRAN0708 1. + SH070880 BAL0783 -1. BAL0780 1. + SH070182 COST 634.38 TRAN0701 1. + SH070182 BAL0701 -1. BAL0782 1. + SH070282 COST 358.61 TRAN0702 1. + SH070282 BAL0702 -1. BAL0782 1. + SH070382 COST 713.95 TRAN0703 1. + SH070382 BAL0703 -1. BAL0782 1. + SH070482 COST 769.54 TRAN0704 1. + SH070482 BAL0704 -1. BAL0782 1. + SH070582 COST 1250.23 TRAN0705 1. + SH070582 BAL0705 -1. BAL0782 1. + SH070882 COST 853.47 TRAN0708 1. + SH070882 BAL0783 -1. BAL0782 1. + SH070183 COST 192.93 TRAN0701 1. + SH070183 BAL0701 -1. BAL0783 1. + SH070283 COST 566.8 TRAN0702 1. + SH070283 BAL0702 -1. BAL0783 1. + SH070383 COST 296.48 TRAN0703 1. + SH070383 BAL0703 -1. BAL0783 1. + SH070483 COST 64.31 TRAN0704 1. + SH070483 BAL0704 -1. BAL0783 1. + SH070583 COST 378.23 TRAN0705 1. + SH070583 BAL0705 -1. BAL0783 1. + SH070683 COST 270.32 TRAN0706 1. + SH070683 BAL0752 -1. BAL0783 1. + SH070184 COST 331.36 TRAN0701 1. + SH070184 BAL0701 -1. BAL0784 1. + SH070284 COST 209.28 TRAN0702 1. + SH070284 BAL0702 -1. BAL0784 1. + SH070384 COST 396.76 TRAN0703 1. + SH070384 BAL0703 -1. BAL0784 1. + SH070484 COST 403.3 TRAN0704 1. + SH070484 BAL0704 -1. BAL0784 1. + SH070584 COST 534.1 TRAN0705 1. + SH070584 BAL0705 -1. BAL0784 1. + SH070684 COST 332.45 TRAN0706 1. + SH070684 BAL0752 -1. BAL0784 1. + SH070884 COST 422.92 TRAN0708 1. + SH070884 BAL0783 -1. BAL0784 1. + SH080201 COST 513.81 TRAN0802 1. + SH080201 BAL0802 -1. BAL0801 1. + SH080301 COST 197.22 TRAN0803 1. + SH080301 BAL0803 -1. BAL0801 1. + SH080401 COST 359.84 TRAN0804 1. + SH080401 BAL0804 -1. BAL0801 1. + SH080501 COST 410.01 TRAN0805 1. + SH080501 BAL0805 -1. BAL0801 1. + SH080601 COST 217.98 TRAN0806 1. + SH080601 BAL0852 -1. BAL0801 1. + SH080801 COST 247.39 TRAN0808 1. + SH080801 BAL0883 -1. BAL0801 1. + SH080102 COST 820.02 TRAN0801 1. + SH080102 BAL0801 -1. BAL0802 1. + SH080302 COST 721.41 TRAN0803 1. + SH080302 BAL0803 -1. BAL0802 1. + SH080402 COST 1058.76 TRAN0804 1. + SH080402 BAL0804 -1. BAL0802 1. + SH080502 COST 1281.93 TRAN0805 1. + SH080502 BAL0805 -1. BAL0802 1. + SH080602 COST 653.94 TRAN0806 1. + SH080602 BAL0852 -1. BAL0802 1. + SH080802 COST 901.33 TRAN0808 1. + SH080802 BAL0883 -1. BAL0802 1. + SH080103 COST 423.85 TRAN0801 1. + SH080103 BAL0801 -1. BAL0803 1. + SH080203 COST 820.02 TRAN0802 1. + SH080203 BAL0802 -1. BAL0803 1. + SH080403 COST 634.91 TRAN0804 1. + SH080403 BAL0804 -1. BAL0803 1. + SH080503 COST 491.32 TRAN0805 1. + SH080503 BAL0805 -1. BAL0803 1. + SH080603 COST 155.7 TRAN0806 1. + SH080603 BAL0852 -1. BAL0803 1. + SH080803 COST 441.15 TRAN0808 1. + SH080803 BAL0883 -1. BAL0803 1. + SH080104 COST 301.02 TRAN0801 1. + SH080104 BAL0801 -1. BAL0804 1. + SH080204 COST 870.19 TRAN0802 1. + SH080204 BAL0802 -1. BAL0804 1. + SH080304 COST 420.39 TRAN0803 1. + SH080304 BAL0803 -1. BAL0804 1. + SH080504 COST 551.87 TRAN0805 1. + SH080504 BAL0805 -1. BAL0804 1. + SH080604 COST 423.85 TRAN0806 1. + SH080604 BAL0852 -1. BAL0804 1. + SH080704 COST 465.37 TRAN0807 1. + SH080704 BAL0864 -1. BAL0804 1. + SH080804 COST 100.34 TRAN0808 1. + SH080804 BAL0883 -1. BAL0804 1. + SH080105 COST 467.1 TRAN0801 1. + SH080105 BAL0801 -1. BAL0805 1. + SH080205 COST 892.68 TRAN0802 1. + SH080205 BAL0802 -1. BAL0805 1. + SH080305 COST 491.32 TRAN0803 1. + SH080305 BAL0803 -1. BAL0805 1. + SH080405 COST 493.05 TRAN0804 1. + SH080405 BAL0804 -1. BAL0805 1. + SH080605 COST 563.98 TRAN0806 1. + SH080605 BAL0852 -1. BAL0805 1. + SH080705 COST 577.82 TRAN0807 1. + SH080705 BAL0864 -1. BAL0805 1. + SH080805 COST 468.83 TRAN0808 1. + SH080805 BAL0883 -1. BAL0805 1. + SH080106 COST 344.27 TRAN0801 1. + SH080106 BAL0801 -1. BAL0806 1. + SH080206 COST 721.41 TRAN0802 1. + SH080206 BAL0802 -1. BAL0806 1. + SH080306 COST 368.49 TRAN0803 1. + SH080306 BAL0803 -1. BAL0806 1. + SH080406 COST 378.87 TRAN0804 1. + SH080406 BAL0804 -1. BAL0806 1. + SH080506 COST 435.96 TRAN0805 1. + SH080506 BAL0805 -1. BAL0806 1. + SH080606 COST 356.38 TRAN0806 1. + SH080606 BAL0852 -1. BAL0806 1. + SH080706 COST 346. TRAN0807 1. + SH080706 BAL0864 -1. BAL0806 1. + SH080806 COST 261.23 TRAN0808 1. + SH080806 BAL0883 -1. BAL0806 1. + SH080107 COST 36.33 TRAN0801 1. + SH080107 BAL0801 -1. BAL0807 1. + SH080207 COST 505.16 TRAN0802 1. + SH080207 BAL0802 -1. BAL0807 1. + SH080307 COST 214.52 TRAN0803 1. + SH080307 BAL0803 -1. BAL0807 1. + SH080407 COST 358.11 TRAN0804 1. + SH080407 BAL0804 -1. BAL0807 1. + SH080507 COST 396.17 TRAN0805 1. + SH080507 BAL0805 -1. BAL0807 1. + SH080607 COST 216.25 TRAN0806 1. + SH080607 BAL0852 -1. BAL0807 1. + SH080707 COST 401.36 TRAN0807 1. + SH080707 BAL0864 -1. BAL0807 1. + SH080807 COST 268.15 TRAN0808 1. + SH080807 BAL0883 -1. BAL0807 1. + SH080108 COST 114.18 TRAN0801 1. + SH080108 BAL0801 -1. BAL0808 1. + SH080208 COST 650.48 TRAN0802 1. + SH080208 BAL0802 -1. BAL0808 1. + SH080308 COST 243.93 TRAN0803 1. + SH080308 BAL0803 -1. BAL0808 1. + SH080408 COST 427.31 TRAN0804 1. + SH080408 BAL0804 -1. BAL0808 1. + SH080508 COST 314.86 TRAN0805 1. + SH080508 BAL0805 -1. BAL0808 1. + SH080608 COST 287.18 TRAN0806 1. + SH080608 BAL0852 -1. BAL0808 1. + SH080808 COST 323.51 TRAN0808 1. + SH080808 BAL0883 -1. BAL0808 1. + SH080109 COST 238.74 TRAN0801 1. + SH080109 BAL0801 -1. BAL0809 1. + SH080209 COST 662.59 TRAN0802 1. + SH080209 BAL0802 -1. BAL0809 1. + SH080309 COST 290.64 TRAN0803 1. + SH080309 BAL0803 -1. BAL0809 1. + SH080409 COST 437.69 TRAN0804 1. + SH080409 BAL0804 -1. BAL0809 1. + SH080509 COST 413.47 TRAN0805 1. + SH080509 BAL0805 -1. BAL0809 1. + SH080709 COST 339.08 TRAN0807 1. + SH080709 BAL0864 -1. BAL0809 1. + SH080809 COST 335.62 TRAN0808 1. + SH080809 BAL0883 -1. BAL0809 1. + SH080110 COST 427.31 TRAN0801 1. + SH080110 BAL0801 -1. BAL0810 1. + SH080210 COST 273.34 TRAN0802 1. + SH080210 BAL0802 -1. BAL0810 1. + SH080310 COST 415.2 TRAN0803 1. + SH080310 BAL0803 -1. BAL0810 1. + SH080410 COST 621.07 TRAN0804 1. + SH080410 BAL0804 -1. BAL0810 1. + SH080510 COST 666.05 TRAN0805 1. + SH080510 BAL0805 -1. BAL0810 1. + SH080610 COST 389.25 TRAN0806 1. + SH080610 BAL0852 -1. BAL0810 1. + SH080810 COST 527.65 TRAN0808 1. + SH080810 BAL0883 -1. BAL0810 1. + SH080111 COST 183.38 TRAN0801 1. + SH080111 BAL0801 -1. BAL0811 1. + SH080211 COST 856.35 TRAN0802 1. + SH080211 BAL0802 -1. BAL0811 1. + SH080311 COST 429.04 TRAN0803 1. + SH080311 BAL0803 -1. BAL0811 1. + SH080411 COST 240.47 TRAN0804 1. + SH080411 BAL0804 -1. BAL0811 1. + SH080511 COST 589.93 TRAN0805 1. + SH080511 BAL0805 -1. BAL0811 1. + SH080611 COST 339.08 TRAN0806 1. + SH080611 BAL0852 -1. BAL0811 1. + SH080811 COST 176.46 TRAN0808 1. + SH080811 BAL0883 -1. BAL0811 1. + SH080112 COST 152.24 TRAN0801 1. + SH080112 BAL0801 -1. BAL0812 1. + SH080212 COST 586.47 TRAN0802 1. + SH080212 BAL0802 -1. BAL0812 1. + SH080312 COST 252.58 TRAN0803 1. + SH080312 BAL0803 -1. BAL0812 1. + SH080412 COST 346. TRAN0804 1. + SH080412 BAL0804 -1. BAL0812 1. + SH080512 COST 461.91 TRAN0805 1. + SH080512 BAL0805 -1. BAL0812 1. + SH080612 COST 250.85 TRAN0806 1. + SH080612 BAL0852 -1. BAL0812 1. + SH080812 COST 252.58 TRAN0808 1. + SH080812 BAL0883 -1. BAL0812 1. + SH080114 COST 245.66 TRAN0801 1. + SH080114 BAL0801 -1. BAL0814 1. + SH080214 COST 712.76 TRAN0802 1. + SH080214 BAL0802 -1. BAL0814 1. + SH080314 COST 339.08 TRAN0803 1. + SH080314 BAL0803 -1. BAL0814 1. + SH080414 COST 344.27 TRAN0804 1. + SH080414 BAL0804 -1. BAL0814 1. + SH080514 COST 608.96 TRAN0805 1. + SH080514 BAL0805 -1. BAL0814 1. + SH080614 COST 325.24 TRAN0806 1. + SH080614 BAL0852 -1. BAL0814 1. + SH080814 COST 217.98 TRAN0808 1. + SH080814 BAL0883 -1. BAL0814 1. + SH080115 COST 524.19 TRAN0801 1. + SH080115 BAL0801 -1. BAL0815 1. + SH080215 COST 275.07 TRAN0802 1. + SH080215 BAL0802 -1. BAL0815 1. + SH080315 COST 404.82 TRAN0803 1. + SH080315 BAL0803 -1. BAL0815 1. + SH080415 COST 823.48 TRAN0804 1. + SH080415 BAL0804 -1. BAL0815 1. + SH080515 COST 688.54 TRAN0805 1. + SH080515 BAL0805 -1. BAL0815 1. + SH080615 COST 325.24 TRAN0806 1. + SH080615 BAL0852 -1. BAL0815 1. + SH080815 COST 645.29 TRAN0808 1. + SH080815 BAL0883 -1. BAL0815 1. + SH080116 COST 273.34 TRAN0801 1. + SH080116 BAL0801 -1. BAL0816 1. + SH080216 COST 484.4 TRAN0802 1. + SH080216 BAL0802 -1. BAL0816 1. + SH080316 COST 392.71 TRAN0803 1. + SH080316 BAL0803 -1. BAL0816 1. + SH080416 COST 496.51 TRAN0804 1. + SH080416 BAL0804 -1. BAL0816 1. + SH080516 COST 551.87 TRAN0805 1. + SH080516 BAL0805 -1. BAL0816 1. + SH080616 COST 226.63 TRAN0806 1. + SH080616 BAL0852 -1. BAL0816 1. + SH080816 COST 354.65 TRAN0808 1. + SH080816 BAL0883 -1. BAL0816 1. + SH080117 COST 261.23 TRAN0801 1. + SH080117 BAL0801 -1. BAL0817 1. + SH080217 COST 873.65 TRAN0802 1. + SH080217 BAL0802 -1. BAL0817 1. + SH080317 COST 474.02 TRAN0803 1. + SH080317 BAL0803 -1. BAL0817 1. + SH080417 COST 98.61 TRAN0804 1. + SH080417 BAL0804 -1. BAL0817 1. + SH080517 COST 515.54 TRAN0805 1. + SH080517 BAL0805 -1. BAL0817 1. + SH080717 COST 510.35 TRAN0807 1. + SH080717 BAL0864 -1. BAL0817 1. + SH080817 COST 46.71 TRAN0808 1. + SH080817 BAL0883 -1. BAL0817 1. + SH080118 COST 302.75 TRAN0801 1. + SH080118 BAL0801 -1. BAL0818 1. + SH080218 COST 624.53 TRAN0802 1. + SH080218 BAL0802 -1. BAL0818 1. + SH080318 COST 467.1 TRAN0803 1. + SH080318 BAL0803 -1. BAL0818 1. + SH080418 COST 266.42 TRAN0804 1. + SH080418 BAL0804 -1. BAL0818 1. + SH080518 COST 704.11 TRAN0805 1. + SH080518 BAL0805 -1. BAL0818 1. + SH080618 COST 608.96 TRAN0806 1. + SH080618 BAL0852 -1. BAL0818 1. + SH080818 COST 178.19 TRAN0808 1. + SH080818 BAL0883 -1. BAL0818 1. + SH080119 COST 429.04 TRAN0801 1. + SH080119 BAL0801 -1. BAL0819 1. + SH080219 COST 1188.51 TRAN0802 1. + SH080219 BAL0802 -1. BAL0819 1. + SH080319 COST 548.41 TRAN0803 1. + SH080319 BAL0803 -1. BAL0819 1. + SH080419 COST 275.07 TRAN0804 1. + SH080419 BAL0804 -1. BAL0819 1. + SH080519 COST 359.84 TRAN0805 1. + SH080519 BAL0805 -1. BAL0819 1. + SH080619 COST 596.85 TRAN0806 1. + SH080619 BAL0852 -1. BAL0819 1. + SH080819 COST 171.27 TRAN0808 1. + SH080819 BAL0883 -1. BAL0819 1. + SH080120 COST 354.65 TRAN0801 1. + SH080120 BAL0801 -1. BAL0820 1. + SH080220 COST 1181.59 TRAN0802 1. + SH080220 BAL0802 -1. BAL0820 1. + SH080320 COST 513.81 TRAN0803 1. + SH080320 BAL0803 -1. BAL0820 1. + SH080420 COST 195.49 TRAN0804 1. + SH080420 BAL0804 -1. BAL0820 1. + SH080520 COST 503.43 TRAN0805 1. + SH080520 BAL0805 -1. BAL0820 1. + SH080820 COST 217.98 TRAN0808 1. + SH080820 BAL0883 -1. BAL0820 1. + SH080121 COST 697.19 TRAN0801 1. + SH080121 BAL0801 -1. BAL0821 1. + SH080221 COST 636.64 TRAN0802 1. + SH080221 BAL0802 -1. BAL0821 1. + SH080321 COST 771.58 TRAN0803 1. + SH080321 BAL0803 -1. BAL0821 1. + SH080421 COST 553.6 TRAN0804 1. + SH080421 BAL0804 -1. BAL0821 1. + SH080521 COST 951.5 TRAN0805 1. + SH080521 BAL0805 -1. BAL0821 1. + SH080821 COST 553.6 TRAN0808 1. + SH080821 BAL0883 -1. BAL0821 1. + SH080122 COST 429.04 TRAN0801 1. + SH080122 BAL0801 -1. BAL0822 1. + SH080222 COST 999.94 TRAN0802 1. + SH080222 BAL0802 -1. BAL0822 1. + SH080322 COST 517.27 TRAN0803 1. + SH080322 BAL0803 -1. BAL0822 1. + SH080422 COST 387.52 TRAN0804 1. + SH080422 BAL0804 -1. BAL0822 1. + SH080522 COST 309.67 TRAN0805 1. + SH080522 BAL0805 -1. BAL0822 1. + SH080622 COST 536.3 TRAN0806 1. + SH080622 BAL0852 -1. BAL0822 1. + SH080822 COST 240.47 TRAN0808 1. + SH080822 BAL0883 -1. BAL0822 1. + SH080123 COST 404.82 TRAN0801 1. + SH080123 BAL0801 -1. BAL0823 1. + SH080223 COST 935.93 TRAN0802 1. + SH080223 BAL0802 -1. BAL0823 1. + SH080323 COST 496.51 TRAN0803 1. + SH080323 BAL0803 -1. BAL0823 1. + SH080423 COST 288.91 TRAN0804 1. + SH080423 BAL0804 -1. BAL0823 1. + SH080523 COST 287.18 TRAN0805 1. + SH080523 BAL0805 -1. BAL0823 1. + SH080823 COST 240.47 TRAN0808 1. + SH080823 BAL0883 -1. BAL0823 1. + SH080124 COST 2484.28 TRAN0801 1. + SH080124 BAL0801 -1. BAL0824 1. + SH080125 COST 669.51 TRAN0801 1. + SH080125 BAL0801 -1. BAL0825 1. + SH080225 COST 738.71 TRAN0802 1. + SH080225 BAL0802 -1. BAL0825 1. + SH080325 COST 884.03 TRAN0803 1. + SH080325 BAL0803 -1. BAL0825 1. + SH080425 COST 602.04 TRAN0804 1. + SH080425 BAL0804 -1. BAL0825 1. + SH080525 COST 979.18 TRAN0805 1. + SH080525 BAL0805 -1. BAL0825 1. + SH080625 COST 697.19 TRAN0806 1. + SH080625 BAL0852 -1. BAL0825 1. + SH080825 COST 527.65 TRAN0808 1. + SH080825 BAL0883 -1. BAL0825 1. + SH080426 COST 467.1 TRAN0804 1. + SH080426 BAL0804 -1. BAL0826 1. + SH080127 COST 404.82 TRAN0801 1. + SH080127 BAL0801 -1. BAL0827 1. + SH080227 COST 491.32 TRAN0802 1. + SH080227 BAL0802 -1. BAL0827 1. + SH080327 COST 499.97 TRAN0803 1. + SH080327 BAL0803 -1. BAL0827 1. + SH080427 COST 579.55 TRAN0804 1. + SH080427 BAL0804 -1. BAL0827 1. + SH080527 COST 653.94 TRAN0805 1. + SH080527 BAL0805 -1. BAL0827 1. + SH080627 COST 463.64 TRAN0806 1. + SH080627 BAL0852 -1. BAL0827 1. + SH080827 COST 435.96 TRAN0808 1. + SH080827 BAL0883 -1. BAL0827 1. + SH080128 COST 420.39 TRAN0801 1. + SH080128 BAL0801 -1. BAL0828 1. + SH080228 COST 984.37 TRAN0802 1. + SH080228 BAL0802 -1. BAL0828 1. + SH080328 COST 512.08 TRAN0803 1. + SH080328 BAL0803 -1. BAL0828 1. + SH080428 COST 510.35 TRAN0804 1. + SH080428 BAL0804 -1. BAL0828 1. + SH080528 COST 176.46 TRAN0805 1. + SH080528 BAL0805 -1. BAL0828 1. + SH080628 COST 451.53 TRAN0806 1. + SH080628 BAL0852 -1. BAL0828 1. + SH080728 COST 185.11 TRAN0807 1. + SH080728 BAL0864 -1. BAL0828 1. + SH080828 COST 439.42 TRAN0808 1. + SH080828 BAL0883 -1. BAL0828 1. + SH080129 COST 385.79 TRAN0801 1. + SH080129 BAL0801 -1. BAL0829 1. + SH080229 COST 802.72 TRAN0802 1. + SH080229 BAL0802 -1. BAL0829 1. + SH080329 COST 416.93 TRAN0803 1. + SH080329 BAL0803 -1. BAL0829 1. + SH080429 COST 344.27 TRAN0804 1. + SH080429 BAL0804 -1. BAL0829 1. + SH080529 COST 743.9 TRAN0805 1. + SH080529 BAL0805 -1. BAL0829 1. + SH080629 COST 451.53 TRAN0806 1. + SH080629 BAL0852 -1. BAL0829 1. + SH080829 COST 249.12 TRAN0808 1. + SH080829 BAL0883 -1. BAL0829 1. + SH080130 COST 806.18 TRAN0801 1. + SH080130 BAL0801 -1. BAL0830 1. + SH080230 COST 754.28 TRAN0802 1. + SH080230 BAL0802 -1. BAL0830 1. + SH080330 COST 904.79 TRAN0803 1. + SH080330 BAL0803 -1. BAL0830 1. + SH080430 COST 525.92 TRAN0804 1. + SH080430 BAL0804 -1. BAL0830 1. + SH080530 COST 771.58 TRAN0805 1. + SH080530 BAL0805 -1. BAL0830 1. + SH080830 COST 660.86 TRAN0808 1. + SH080830 BAL0883 -1. BAL0830 1. + SH080131 COST 192.03 TRAN0801 1. + SH080131 BAL0801 -1. BAL0831 1. + SH080231 COST 607.23 TRAN0802 1. + SH080231 BAL0802 -1. BAL0831 1. + SH080331 COST 190.3 TRAN0803 1. + SH080331 BAL0803 -1. BAL0831 1. + SH080431 COST 437.69 TRAN0804 1. + SH080431 BAL0804 -1. BAL0831 1. + SH080531 COST 531.11 TRAN0805 1. + SH080531 BAL0805 -1. BAL0831 1. + SH080631 COST 193.76 TRAN0806 1. + SH080631 BAL0852 -1. BAL0831 1. + SH080831 COST 385.79 TRAN0808 1. + SH080831 BAL0883 -1. BAL0831 1. + SH080132 COST 517.27 TRAN0801 1. + SH080132 BAL0801 -1. BAL0832 1. + SH080232 COST 826.94 TRAN0802 1. + SH080232 BAL0802 -1. BAL0832 1. + SH080332 COST 731.79 TRAN0803 1. + SH080332 BAL0803 -1. BAL0832 1. + SH080432 COST 271.61 TRAN0804 1. + SH080432 BAL0804 -1. BAL0832 1. + SH080532 COST 678.16 TRAN0805 1. + SH080532 BAL0805 -1. BAL0832 1. + SH080832 COST 311.4 TRAN0808 1. + SH080832 BAL0883 -1. BAL0832 1. + SH080133 COST 852.89 TRAN0801 1. + SH080133 BAL0801 -1. BAL0833 1. + SH080233 COST 692. TRAN0802 1. + SH080233 BAL0802 -1. BAL0833 1. + SH080333 COST 939.39 TRAN0803 1. + SH080333 BAL0803 -1. BAL0833 1. + SH080433 COST 769.85 TRAN0804 1. + SH080433 BAL0804 -1. BAL0833 1. + SH080533 COST 1091.63 TRAN0805 1. + SH080533 BAL0805 -1. BAL0833 1. + SH080833 COST 659.13 TRAN0808 1. + SH080833 BAL0883 -1. BAL0833 1. + SH080134 COST 667.78 TRAN0801 1. + SH080134 BAL0801 -1. BAL0834 1. + SH080234 COST 1133.15 TRAN0802 1. + SH080234 BAL0802 -1. BAL0834 1. + SH080334 COST 870.19 TRAN0803 1. + SH080334 BAL0803 -1. BAL0834 1. + SH080434 COST 365.03 TRAN0804 1. + SH080434 BAL0804 -1. BAL0834 1. + SH080534 COST 762.93 TRAN0805 1. + SH080534 BAL0805 -1. BAL0834 1. + SH080834 COST 454.99 TRAN0808 1. + SH080834 BAL0883 -1. BAL0834 1. + SH080135 COST 797.53 TRAN0801 1. + SH080135 BAL0801 -1. BAL0835 1. + SH080235 COST 769.85 TRAN0802 1. + SH080235 BAL0802 -1. BAL0835 1. + SH080335 COST 652.21 TRAN0803 1. + SH080335 BAL0803 -1. BAL0835 1. + SH080435 COST 211.06 TRAN0804 1. + SH080435 BAL0804 -1. BAL0835 1. + SH080535 COST 745.63 TRAN0805 1. + SH080535 BAL0805 -1. BAL0835 1. + SH080835 COST 406.55 TRAN0808 1. + SH080835 BAL0883 -1. BAL0835 1. + SH080136 COST 354.65 TRAN0801 1. + SH080136 BAL0801 -1. BAL0836 1. + SH080236 COST 775.04 TRAN0802 1. + SH080236 BAL0802 -1. BAL0836 1. + SH080336 COST 183.38 TRAN0803 1. + SH080336 BAL0803 -1. BAL0836 1. + SH080436 COST 640.1 TRAN0804 1. + SH080436 BAL0804 -1. BAL0836 1. + SH080536 COST 598.58 TRAN0805 1. + SH080536 BAL0805 -1. BAL0836 1. + SH080636 COST 190.3 TRAN0806 1. + SH080636 BAL0852 -1. BAL0836 1. + SH080836 COST 555.33 TRAN0808 1. + SH080836 BAL0883 -1. BAL0836 1. + SH080137 COST 159.16 TRAN0801 1. + SH080137 BAL0801 -1. BAL0837 1. + SH080237 COST 591.66 TRAN0802 1. + SH080237 BAL0802 -1. BAL0837 1. + SH080337 COST 273.34 TRAN0803 1. + SH080337 BAL0803 -1. BAL0837 1. + SH080437 COST 525.92 TRAN0804 1. + SH080437 BAL0804 -1. BAL0837 1. + SH080537 COST 314.86 TRAN0805 1. + SH080537 BAL0805 -1. BAL0837 1. + SH080637 COST 335.62 TRAN0806 1. + SH080637 BAL0852 -1. BAL0837 1. + SH080837 COST 435.96 TRAN0808 1. + SH080837 BAL0883 -1. BAL0837 1. + SH080138 COST 235.28 TRAN0801 1. + SH080138 BAL0801 -1. BAL0838 1. + SH080238 COST 422.12 TRAN0802 1. + SH080238 BAL0802 -1. BAL0838 1. + SH080338 COST 164.35 TRAN0803 1. + SH080338 BAL0803 -1. BAL0838 1. + SH080438 COST 532.84 TRAN0804 1. + SH080438 BAL0804 -1. BAL0838 1. + SH080538 COST 480.94 TRAN0805 1. + SH080538 BAL0805 -1. BAL0838 1. + SH080638 COST 67.47 TRAN0806 1. + SH080638 BAL0852 -1. BAL0838 1. + SH080738 COST 373.68 TRAN0807 1. + SH080738 BAL0864 -1. BAL0838 1. + SH080838 COST 410.01 TRAN0808 1. + SH080838 BAL0883 -1. BAL0838 1. + SH080139 COST 224.9 TRAN0801 1. + SH080139 BAL0801 -1. BAL0839 1. + SH080239 COST 586.47 TRAN0802 1. + SH080239 BAL0802 -1. BAL0839 1. + SH080339 COST 276.8 TRAN0803 1. + SH080339 BAL0803 -1. BAL0839 1. + SH080439 COST 430.77 TRAN0804 1. + SH080439 BAL0804 -1. BAL0839 1. + SH080539 COST 742.17 TRAN0805 1. + SH080539 BAL0805 -1. BAL0839 1. + SH080639 COST 352.92 TRAN0806 1. + SH080639 BAL0852 -1. BAL0839 1. + SH080839 COST 290.64 TRAN0808 1. + SH080839 BAL0883 -1. BAL0839 1. + SH080140 COST 285.45 TRAN0801 1. + SH080140 BAL0801 -1. BAL0840 1. + SH080240 COST 653.94 TRAN0802 1. + SH080240 BAL0802 -1. BAL0840 1. + SH080340 COST 178.19 TRAN0803 1. + SH080340 BAL0803 -1. BAL0840 1. + SH080440 COST 513.81 TRAN0804 1. + SH080440 BAL0804 -1. BAL0840 1. + SH080540 COST 382.33 TRAN0805 1. + SH080540 BAL0805 -1. BAL0840 1. + SH080640 COST 226.63 TRAN0806 1. + SH080640 BAL0852 -1. BAL0840 1. + SH080840 COST 474.02 TRAN0808 1. + SH080840 BAL0883 -1. BAL0840 1. + SH080141 COST 339.08 TRAN0801 1. + SH080141 BAL0801 -1. BAL0841 1. + SH080241 COST 519. TRAN0802 1. + SH080241 BAL0802 -1. BAL0841 1. + SH080341 COST 259.5 TRAN0803 1. + SH080341 BAL0803 -1. BAL0841 1. + SH080441 COST 560.52 TRAN0804 1. + SH080441 BAL0804 -1. BAL0841 1. + SH080541 COST 636.64 TRAN0805 1. + SH080541 BAL0805 -1. BAL0841 1. + SH080641 COST 173. TRAN0806 1. + SH080641 BAL0852 -1. BAL0841 1. + SH080841 COST 517.27 TRAN0808 1. + SH080841 BAL0883 -1. BAL0841 1. + SH080142 COST 155.7 TRAN0801 1. + SH080142 BAL0801 -1. BAL0842 1. + SH080242 COST 716.22 TRAN0802 1. + SH080242 BAL0802 -1. BAL0842 1. + SH080342 COST 276.8 TRAN0803 1. + SH080342 BAL0803 -1. BAL0842 1. + SH080442 COST 337.35 TRAN0804 1. + SH080442 BAL0804 -1. BAL0842 1. + SH080542 COST 624.53 TRAN0805 1. + SH080542 BAL0805 -1. BAL0842 1. + SH080642 COST 278.53 TRAN0806 1. + SH080642 BAL0852 -1. BAL0842 1. + SH080842 COST 262.96 TRAN0808 1. + SH080842 BAL0883 -1. BAL0842 1. + SH080143 COST 275.07 TRAN0801 1. + SH080143 BAL0801 -1. BAL0843 1. + SH080243 COST 683.35 TRAN0802 1. + SH080243 BAL0802 -1. BAL0843 1. + SH080343 COST 43.25 TRAN0803 1. + SH080343 BAL0803 -1. BAL0843 1. + SH080443 COST 512.08 TRAN0804 1. + SH080443 BAL0804 -1. BAL0843 1. + SH080543 COST 446.34 TRAN0805 1. + SH080543 BAL0805 -1. BAL0843 1. + SH080643 COST 173. TRAN0806 1. + SH080643 BAL0852 -1. BAL0843 1. + SH080743 COST 416.93 TRAN0807 1. + SH080743 BAL0864 -1. BAL0843 1. + SH080843 COST 468.83 TRAN0808 1. + SH080843 BAL0883 -1. BAL0843 1. + SH080144 COST 275.07 TRAN0801 1. + SH080144 BAL0801 -1. BAL0844 1. + SH080244 COST 655.67 TRAN0802 1. + SH080244 BAL0802 -1. BAL0844 1. + SH080344 COST 221.44 TRAN0803 1. + SH080344 BAL0803 -1. BAL0844 1. + SH080444 COST 539.76 TRAN0804 1. + SH080444 BAL0804 -1. BAL0844 1. + SH080544 COST 536.3 TRAN0805 1. + SH080544 BAL0805 -1. BAL0844 1. + SH080644 COST 153.97 TRAN0806 1. + SH080644 BAL0852 -1. BAL0844 1. + SH080844 COST 515.54 TRAN0808 1. + SH080844 BAL0883 -1. BAL0844 1. + SH080145 COST 297.56 TRAN0801 1. + SH080145 BAL0801 -1. BAL0845 1. + SH080245 COST 754.28 TRAN0802 1. + SH080245 BAL0802 -1. BAL0845 1. + SH080345 COST 278.53 TRAN0803 1. + SH080345 BAL0803 -1. BAL0845 1. + SH080445 COST 505.16 TRAN0804 1. + SH080445 BAL0804 -1. BAL0845 1. + SH080545 COST 404.82 TRAN0805 1. + SH080545 BAL0805 -1. BAL0845 1. + SH080645 COST 330.43 TRAN0806 1. + SH080645 BAL0852 -1. BAL0845 1. + SH080745 COST 340.81 TRAN0807 1. + SH080745 BAL0864 -1. BAL0845 1. + SH080845 COST 527.65 TRAN0808 1. + SH080845 BAL0883 -1. BAL0845 1. + SH080146 COST 423.85 TRAN0801 1. + SH080146 BAL0801 -1. BAL0846 1. + SH080246 COST 472.29 TRAN0802 1. + SH080246 BAL0802 -1. BAL0846 1. + SH080346 COST 382.33 TRAN0803 1. + SH080346 BAL0803 -1. BAL0846 1. + SH080446 COST 773.31 TRAN0804 1. + SH080446 BAL0804 -1. BAL0846 1. + SH080546 COST 743.9 TRAN0805 1. + SH080546 BAL0805 -1. BAL0846 1. + SH080646 COST 444.61 TRAN0806 1. + SH080646 BAL0852 -1. BAL0846 1. + SH080846 COST 775.04 TRAN0808 1. + SH080846 BAL0883 -1. BAL0846 1. + SH080147 COST 190.3 TRAN0801 1. + SH080147 BAL0801 -1. BAL0847 1. + SH080247 COST 645.29 TRAN0802 1. + SH080247 BAL0802 -1. BAL0847 1. + SH080347 COST 275.07 TRAN0803 1. + SH080347 BAL0803 -1. BAL0847 1. + SH080447 COST 474.02 TRAN0804 1. + SH080447 BAL0804 -1. BAL0847 1. + SH080547 COST 403.09 TRAN0805 1. + SH080547 BAL0805 -1. BAL0847 1. + SH080647 COST 250.85 TRAN0806 1. + SH080647 BAL0852 -1. BAL0847 1. + SH080847 COST 422.12 TRAN0808 1. + SH080847 BAL0883 -1. BAL0847 1. + SH080148 COST 164.35 TRAN0801 1. + SH080148 BAL0801 -1. BAL0848 1. + SH080248 COST 586.47 TRAN0802 1. + SH080248 BAL0802 -1. BAL0848 1. + SH080348 COST 237.01 TRAN0803 1. + SH080348 BAL0803 -1. BAL0848 1. + SH080448 COST 397.9 TRAN0804 1. + SH080448 BAL0804 -1. BAL0848 1. + SH080548 COST 427.31 TRAN0805 1. + SH080548 BAL0805 -1. BAL0848 1. + SH080648 COST 198.95 TRAN0806 1. + SH080648 BAL0852 -1. BAL0848 1. + SH080848 COST 337.35 TRAN0808 1. + SH080848 BAL0883 -1. BAL0848 1. + SH080149 COST 569.17 TRAN0801 1. + SH080149 BAL0801 -1. BAL0849 1. + SH080249 COST 925.55 TRAN0802 1. + SH080249 BAL0802 -1. BAL0849 1. + SH080349 COST 574.36 TRAN0803 1. + SH080349 BAL0803 -1. BAL0849 1. + SH080449 COST 659.13 TRAN0804 1. + SH080449 BAL0804 -1. BAL0849 1. + SH080549 COST 262.96 TRAN0805 1. + SH080549 BAL0805 -1. BAL0849 1. + SH080649 COST 584.74 TRAN0806 1. + SH080649 BAL0852 -1. BAL0849 1. + SH080749 COST 231.82 TRAN0807 1. + SH080749 BAL0864 -1. BAL0849 1. + SH080849 COST 705.84 TRAN0808 1. + SH080849 BAL0883 -1. BAL0849 1. + SH080150 COST 416.93 TRAN0801 1. + SH080150 BAL0801 -1. BAL0850 1. + SH080250 COST 1058.76 TRAN0802 1. + SH080250 BAL0802 -1. BAL0850 1. + SH080350 COST 425.58 TRAN0803 1. + SH080350 BAL0803 -1. BAL0850 1. + SH080450 COST 631.45 TRAN0804 1. + SH080450 BAL0804 -1. BAL0850 1. + SH080550 COST 406.55 TRAN0805 1. + SH080550 BAL0805 -1. BAL0850 1. + SH080750 COST 237.01 TRAN0807 1. + SH080750 BAL0864 -1. BAL0850 1. + SH080850 COST 702.38 TRAN0808 1. + SH080850 BAL0883 -1. BAL0850 1. + SH080151 COST 574.36 TRAN0801 1. + SH080151 BAL0801 -1. BAL0851 1. + SH080251 COST 951.5 TRAN0802 1. + SH080251 BAL0802 -1. BAL0851 1. + SH080351 COST 589.93 TRAN0803 1. + SH080351 BAL0803 -1. BAL0851 1. + SH080451 COST 584.74 TRAN0804 1. + SH080451 BAL0804 -1. BAL0851 1. + SH080551 COST 212.79 TRAN0805 1. + SH080551 BAL0805 -1. BAL0851 1. + SH080751 COST 171.27 TRAN0807 1. + SH080751 BAL0864 -1. BAL0851 1. + SH080851 COST 740.44 TRAN0808 1. + SH080851 BAL0883 -1. BAL0851 1. + SH080152 COST 193.76 TRAN0801 1. + SH080152 BAL0801 -1. BAL0852 1. + SH080252 COST 519. TRAN0802 1. + SH080252 BAL0802 -1. BAL0852 1. + SH080352 COST 141.86 TRAN0803 1. + SH080352 BAL0803 -1. BAL0852 1. + SH080452 COST 557.06 TRAN0804 1. + SH080452 BAL0804 -1. BAL0852 1. + SH080552 COST 510.35 TRAN0805 1. + SH080552 BAL0805 -1. BAL0852 1. + SH080852 COST 437.69 TRAN0808 1. + SH080852 BAL0883 -1. BAL0852 1. + SH080153 COST 621.07 TRAN0801 1. + SH080153 BAL0801 -1. BAL0853 1. + SH080253 COST 1100.28 TRAN0802 1. + SH080253 BAL0802 -1. BAL0853 1. + SH080353 COST 562.25 TRAN0803 1. + SH080353 BAL0803 -1. BAL0853 1. + SH080453 COST 712.76 TRAN0804 1. + SH080453 BAL0804 -1. BAL0853 1. + SH080553 COST 318.32 TRAN0805 1. + SH080553 BAL0805 -1. BAL0853 1. + SH080653 COST 621.07 TRAN0806 1. + SH080653 BAL0852 -1. BAL0853 1. + SH080753 COST 252.58 TRAN0807 1. + SH080753 BAL0864 -1. BAL0853 1. + SH080853 COST 697.19 TRAN0808 1. + SH080853 BAL0883 -1. BAL0853 1. + SH080154 COST 320.05 TRAN0801 1. + SH080154 BAL0801 -1. BAL0854 1. + SH080254 COST 769.85 TRAN0802 1. + SH080254 BAL0802 -1. BAL0854 1. + SH080354 COST 375.41 TRAN0803 1. + SH080354 BAL0803 -1. BAL0854 1. + SH080454 COST 593.39 TRAN0804 1. + SH080454 BAL0804 -1. BAL0854 1. + SH080554 COST 368.49 TRAN0805 1. + SH080554 BAL0805 -1. BAL0854 1. + SH080654 COST 351.19 TRAN0806 1. + SH080654 BAL0852 -1. BAL0854 1. + SH080854 COST 695.46 TRAN0808 1. + SH080854 BAL0883 -1. BAL0854 1. + SH080155 COST 480.94 TRAN0801 1. + SH080155 BAL0801 -1. BAL0855 1. + SH080255 COST 828.67 TRAN0802 1. + SH080255 BAL0802 -1. BAL0855 1. + SH080355 COST 486.13 TRAN0803 1. + SH080355 BAL0803 -1. BAL0855 1. + SH080455 COST 508.62 TRAN0804 1. + SH080455 BAL0804 -1. BAL0855 1. + SH080555 COST 266.42 TRAN0805 1. + SH080555 BAL0805 -1. BAL0855 1. + SH080655 COST 501.7 TRAN0806 1. + SH080655 BAL0852 -1. BAL0855 1. + SH080755 COST 185.11 TRAN0807 1. + SH080755 BAL0864 -1. BAL0855 1. + SH080855 COST 508.62 TRAN0808 1. + SH080855 BAL0883 -1. BAL0855 1. + SH080156 COST 674.7 TRAN0801 1. + SH080156 BAL0801 -1. BAL0856 1. + SH080256 COST 1001.67 TRAN0802 1. + SH080256 BAL0802 -1. BAL0856 1. + SH080356 COST 527.65 TRAN0803 1. + SH080356 BAL0803 -1. BAL0856 1. + SH080456 COST 631.45 TRAN0804 1. + SH080456 BAL0804 -1. BAL0856 1. + SH080556 COST 235.28 TRAN0805 1. + SH080556 BAL0805 -1. BAL0856 1. + SH080656 COST 586.47 TRAN0806 1. + SH080656 BAL0852 -1. BAL0856 1. + SH080756 COST 211.06 TRAN0807 1. + SH080756 BAL0864 -1. BAL0856 1. + SH080856 COST 617.61 TRAN0808 1. + SH080856 BAL0883 -1. BAL0856 1. + SH080157 COST 451.53 TRAN0801 1. + SH080157 BAL0801 -1. BAL0857 1. + SH080257 COST 899.6 TRAN0802 1. + SH080257 BAL0802 -1. BAL0857 1. + SH080357 COST 501.7 TRAN0803 1. + SH080357 BAL0803 -1. BAL0857 1. + SH080457 COST 404.82 TRAN0804 1. + SH080457 BAL0804 -1. BAL0857 1. + SH080557 COST 290.64 TRAN0805 1. + SH080557 BAL0805 -1. BAL0857 1. + SH080657 COST 551.87 TRAN0806 1. + SH080657 BAL0852 -1. BAL0857 1. + SH080757 COST 256.04 TRAN0807 1. + SH080757 BAL0864 -1. BAL0857 1. + SH080857 COST 399.63 TRAN0808 1. + SH080857 BAL0883 -1. BAL0857 1. + SH080158 COST 508.62 TRAN0801 1. + SH080158 BAL0801 -1. BAL0858 1. + SH080258 COST 901.33 TRAN0802 1. + SH080258 BAL0802 -1. BAL0858 1. + SH080358 COST 480.94 TRAN0803 1. + SH080358 BAL0803 -1. BAL0858 1. + SH080458 COST 593.39 TRAN0804 1. + SH080458 BAL0804 -1. BAL0858 1. + SH080558 COST 36.33 TRAN0805 1. + SH080558 BAL0805 -1. BAL0858 1. + SH080658 COST 563.98 TRAN0806 1. + SH080658 BAL0852 -1. BAL0858 1. + SH080758 COST 117.64 TRAN0807 1. + SH080758 BAL0864 -1. BAL0858 1. + SH080858 COST 439.42 TRAN0808 1. + SH080858 BAL0883 -1. BAL0858 1. + SH080159 COST 356.38 TRAN0801 1. + SH080159 BAL0801 -1. BAL0859 1. + SH080259 COST 861.54 TRAN0802 1. + SH080259 BAL0802 -1. BAL0859 1. + SH080359 COST 411.74 TRAN0803 1. + SH080359 BAL0803 -1. BAL0859 1. + SH080459 COST 422.12 TRAN0804 1. + SH080459 BAL0804 -1. BAL0859 1. + SH080559 COST 275.07 TRAN0805 1. + SH080559 BAL0805 -1. BAL0859 1. + SH080659 COST 513.81 TRAN0806 1. + SH080659 BAL0852 -1. BAL0859 1. + SH080759 COST 181.65 TRAN0807 1. + SH080759 BAL0864 -1. BAL0859 1. + SH080859 COST 441.15 TRAN0808 1. + SH080859 BAL0883 -1. BAL0859 1. + SH080160 COST 451.53 TRAN0801 1. + SH080160 BAL0801 -1. BAL0860 1. + SH080260 COST 951.5 TRAN0802 1. + SH080260 BAL0802 -1. BAL0860 1. + SH080360 COST 489.59 TRAN0803 1. + SH080360 BAL0803 -1. BAL0860 1. + SH080460 COST 539.76 TRAN0804 1. + SH080460 BAL0804 -1. BAL0860 1. + SH080560 COST 233.55 TRAN0805 1. + SH080560 BAL0805 -1. BAL0860 1. + SH080660 COST 558.79 TRAN0806 1. + SH080660 BAL0852 -1. BAL0860 1. + SH080760 COST 152.24 TRAN0807 1. + SH080760 BAL0864 -1. BAL0860 1. + SH080860 COST 517.27 TRAN0808 1. + SH080860 BAL0883 -1. BAL0860 1. + SH080163 COST 460.18 TRAN0801 1. + SH080163 BAL0801 -1. BAL0863 1. + SH080263 COST 854.62 TRAN0802 1. + SH080263 BAL0802 -1. BAL0863 1. + SH080363 COST 496.51 TRAN0803 1. + SH080363 BAL0803 -1. BAL0863 1. + SH080463 COST 638.37 TRAN0804 1. + SH080463 BAL0804 -1. BAL0863 1. + SH080563 COST 262.96 TRAN0805 1. + SH080563 BAL0805 -1. BAL0863 1. + SH080663 COST 544.95 TRAN0806 1. + SH080663 BAL0852 -1. BAL0863 1. + SH080763 COST 214.52 TRAN0807 1. + SH080763 BAL0864 -1. BAL0863 1. + SH080863 COST 692. TRAN0808 1. + SH080863 BAL0883 -1. BAL0863 1. + SH080164 COST 344.27 TRAN0801 1. + SH080164 BAL0801 -1. BAL0864 1. + SH080264 COST 909.98 TRAN0802 1. + SH080264 BAL0802 -1. BAL0864 1. + SH080364 COST 385.79 TRAN0803 1. + SH080364 BAL0803 -1. BAL0864 1. + SH080464 COST 581.28 TRAN0804 1. + SH080464 BAL0804 -1. BAL0864 1. + SH080564 COST 100.34 TRAN0805 1. + SH080564 BAL0805 -1. BAL0864 1. + SH080664 COST 548.41 TRAN0806 1. + SH080664 BAL0852 -1. BAL0864 1. + SH080864 COST 432.5 TRAN0808 1. + SH080864 BAL0883 -1. BAL0864 1. + SH080165 COST 747.36 TRAN0801 1. + SH080165 BAL0801 -1. BAL0865 1. + SH080265 COST 531.11 TRAN0802 1. + SH080265 BAL0802 -1. BAL0865 1. + SH080365 COST 873.65 TRAN0803 1. + SH080365 BAL0803 -1. BAL0865 1. + SH080465 COST 671.24 TRAN0804 1. + SH080465 BAL0804 -1. BAL0865 1. + SH080565 COST 1044.92 TRAN0805 1. + SH080565 BAL0805 -1. BAL0865 1. + SH080865 COST 717.95 TRAN0808 1. + SH080865 BAL0883 -1. BAL0865 1. + SH080166 COST 968.8 TRAN0801 1. + SH080166 BAL0801 -1. BAL0866 1. + SH080266 COST 448.07 TRAN0802 1. + SH080266 BAL0802 -1. BAL0866 1. + SH080366 COST 999.94 TRAN0803 1. + SH080366 BAL0803 -1. BAL0866 1. + SH080466 COST 961.88 TRAN0804 1. + SH080466 BAL0804 -1. BAL0866 1. + SH080566 COST 1228.3 TRAN0805 1. + SH080566 BAL0805 -1. BAL0866 1. + SH080866 COST 968.8 TRAN0808 1. + SH080866 BAL0883 -1. BAL0866 1. + SH080167 COST 735.25 TRAN0801 1. + SH080167 BAL0801 -1. BAL0867 1. + SH080267 COST 401.36 TRAN0802 1. + SH080267 BAL0802 -1. BAL0867 1. + SH080367 COST 852.89 TRAN0803 1. + SH080367 BAL0803 -1. BAL0867 1. + SH080467 COST 790.61 TRAN0804 1. + SH080467 BAL0804 -1. BAL0867 1. + SH080567 COST 1044.92 TRAN0805 1. + SH080567 BAL0805 -1. BAL0867 1. + SH080867 COST 792.34 TRAN0808 1. + SH080867 BAL0883 -1. BAL0867 1. + SH080168 COST 1027.62 TRAN0801 1. + SH080168 BAL0801 -1. BAL0868 1. + SH080268 COST 692. TRAN0802 1. + SH080268 BAL0802 -1. BAL0868 1. + SH080368 COST 968.8 TRAN0803 1. + SH080368 BAL0803 -1. BAL0868 1. + SH080468 COST 1214.46 TRAN0804 1. + SH080468 BAL0804 -1. BAL0868 1. + SH080568 COST 1636.58 TRAN0805 1. + SH080568 BAL0805 -1. BAL0868 1. + SH080868 COST 1299.23 TRAN0808 1. + SH080868 BAL0883 -1. BAL0868 1. + SH080169 COST 932.47 TRAN0801 1. + SH080169 BAL0801 -1. BAL0869 1. + SH080269 COST 382.33 TRAN0802 1. + SH080269 BAL0802 -1. BAL0869 1. + SH080369 COST 882.3 TRAN0803 1. + SH080369 BAL0803 -1. BAL0869 1. + SH080469 COST 1076.06 TRAN0804 1. + SH080469 BAL0804 -1. BAL0869 1. + SH080569 COST 1117.58 TRAN0805 1. + SH080569 BAL0805 -1. BAL0869 1. + SH080869 COST 1138.34 TRAN0808 1. + SH080869 BAL0883 -1. BAL0869 1. + SH080171 COST 761.2 TRAN0801 1. + SH080171 BAL0801 -1. BAL0871 1. + SH080371 COST 906.52 TRAN0803 1. + SH080371 BAL0803 -1. BAL0871 1. + SH080471 COST 901.33 TRAN0804 1. + SH080471 BAL0804 -1. BAL0871 1. + SH080571 COST 1005.13 TRAN0805 1. + SH080571 BAL0805 -1. BAL0871 1. + SH080671 COST 676.43 TRAN0806 1. + SH080671 BAL0852 -1. BAL0871 1. + SH080771 COST 1217.92 TRAN0807 1. + SH080771 BAL0864 -1. BAL0871 1. + SH080871 COST 922.09 TRAN0808 1. + SH080871 BAL0883 -1. BAL0871 1. + SH080172 COST 1015.51 TRAN0801 1. + SH080172 BAL0801 -1. BAL0872 1. + SH080272 COST 939.39 TRAN0802 1. + SH080272 BAL0802 -1. BAL0872 1. + SH080372 COST 1067.41 TRAN0803 1. + SH080372 BAL0803 -1. BAL0872 1. + SH080472 COST 986.1 TRAN0804 1. + SH080472 BAL0804 -1. BAL0872 1. + SH080572 COST 1319.99 TRAN0805 1. + SH080572 BAL0805 -1. BAL0872 1. + SH080872 COST 986.1 TRAN0808 1. + SH080872 BAL0883 -1. BAL0872 1. + SH080173 COST 674.7 TRAN0801 1. + SH080173 BAL0801 -1. BAL0873 1. + SH080273 COST 631.45 TRAN0802 1. + SH080273 BAL0802 -1. BAL0873 1. + SH080373 COST 584.74 TRAN0803 1. + SH080373 BAL0803 -1. BAL0873 1. + SH080473 COST 790.61 TRAN0804 1. + SH080473 BAL0804 -1. BAL0873 1. + SH080573 COST 975.72 TRAN0805 1. + SH080573 BAL0805 -1. BAL0873 1. + SH080673 COST 527.65 TRAN0806 1. + SH080673 BAL0852 -1. BAL0873 1. + SH080873 COST 871.92 TRAN0808 1. + SH080873 BAL0883 -1. BAL0873 1. + SH080174 COST 948.04 TRAN0801 1. + SH080174 BAL0801 -1. BAL0874 1. + SH080274 COST 363.3 TRAN0802 1. + SH080274 BAL0802 -1. BAL0874 1. + SH080374 COST 986.1 TRAN0803 1. + SH080374 BAL0803 -1. BAL0874 1. + SH080474 COST 1102.01 TRAN0804 1. + SH080474 BAL0804 -1. BAL0874 1. + SH080574 COST 1268.09 TRAN0805 1. + SH080574 BAL0805 -1. BAL0874 1. + SH080874 COST 1070.87 TRAN0808 1. + SH080874 BAL0883 -1. BAL0874 1. + SH080275 COST 958.42 TRAN0802 1. + SH080275 BAL0802 -1. BAL0875 1. + SH080176 COST 799.26 TRAN0801 1. + SH080176 BAL0801 -1. BAL0876 1. + SH080276 COST 693.73 TRAN0802 1. + SH080276 BAL0802 -1. BAL0876 1. + SH080376 COST 697.19 TRAN0803 1. + SH080376 BAL0803 -1. BAL0876 1. + SH080476 COST 1089.9 TRAN0804 1. + SH080476 BAL0804 -1. BAL0876 1. + SH080576 COST 1089.9 TRAN0805 1. + SH080576 BAL0805 -1. BAL0876 1. + SH080676 COST 659.13 TRAN0806 1. + SH080676 BAL0852 -1. BAL0876 1. + SH080876 COST 1344.21 TRAN0808 1. + SH080876 BAL0883 -1. BAL0876 1. + SH080177 COST 752.55 TRAN0801 1. + SH080177 BAL0801 -1. BAL0877 1. + SH080277 COST 470.56 TRAN0802 1. + SH080277 BAL0802 -1. BAL0877 1. + SH080377 COST 797.53 TRAN0803 1. + SH080377 BAL0803 -1. BAL0877 1. + SH080477 COST 693.73 TRAN0804 1. + SH080477 BAL0804 -1. BAL0877 1. + SH080577 COST 968.8 TRAN0805 1. + SH080577 BAL0805 -1. BAL0877 1. + SH080877 COST 553.6 TRAN0808 1. + SH080877 BAL0883 -1. BAL0877 1. + SH080178 COST 1316.53 TRAN0801 1. + SH080178 BAL0801 -1. BAL0878 1. + SH080278 COST 764.66 TRAN0802 1. + SH080278 BAL0802 -1. BAL0878 1. + SH080378 COST 1354.59 TRAN0803 1. + SH080378 BAL0803 -1. BAL0878 1. + SH080478 COST 1185.05 TRAN0804 1. + SH080478 BAL0804 -1. BAL0878 1. + SH080578 COST 1520.67 TRAN0805 1. + SH080578 BAL0805 -1. BAL0878 1. + SH080878 COST 1325.18 TRAN0808 1. + SH080878 BAL0883 -1. BAL0878 1. + SH080179 COST 1236.95 TRAN0801 1. + SH080179 BAL0801 -1. BAL0879 1. + SH080279 COST 465.37 TRAN0802 1. + SH080279 BAL0802 -1. BAL0879 1. + SH080379 COST 1195.43 TRAN0803 1. + SH080379 BAL0803 -1. BAL0879 1. + SH080479 COST 1245.6 TRAN0804 1. + SH080479 BAL0804 -1. BAL0879 1. + SH080879 COST 1221.38 TRAN0808 1. + SH080879 BAL0883 -1. BAL0879 1. + SH080180 COST 548.41 TRAN0801 1. + SH080180 BAL0801 -1. BAL0880 1. + SH080280 COST 683.35 TRAN0802 1. + SH080280 BAL0802 -1. BAL0880 1. + SH080380 COST 756.01 TRAN0803 1. + SH080380 BAL0803 -1. BAL0880 1. + SH080480 COST 647.02 TRAN0804 1. + SH080480 BAL0804 -1. BAL0880 1. + SH080580 COST 873.65 TRAN0805 1. + SH080580 BAL0805 -1. BAL0880 1. + SH080880 COST 415.2 TRAN0808 1. + SH080880 BAL0883 -1. BAL0880 1. + SH080182 COST 1006.86 TRAN0801 1. + SH080182 BAL0801 -1. BAL0882 1. + SH080282 COST 569.17 TRAN0802 1. + SH080282 BAL0802 -1. BAL0882 1. + SH080382 COST 1133.15 TRAN0803 1. + SH080382 BAL0803 -1. BAL0882 1. + SH080482 COST 1221.38 TRAN0804 1. + SH080482 BAL0804 -1. BAL0882 1. + SH080582 COST 1984.31 TRAN0805 1. + SH080582 BAL0805 -1. BAL0882 1. + SH080882 COST 1354.59 TRAN0808 1. + SH080882 BAL0883 -1. BAL0882 1. + SH080183 COST 306.21 TRAN0801 1. + SH080183 BAL0801 -1. BAL0883 1. + SH080283 COST 899.6 TRAN0802 1. + SH080283 BAL0802 -1. BAL0883 1. + SH080383 COST 470.56 TRAN0803 1. + SH080383 BAL0803 -1. BAL0883 1. + SH080483 COST 102.07 TRAN0804 1. + SH080483 BAL0804 -1. BAL0883 1. + SH080583 COST 600.31 TRAN0805 1. + SH080583 BAL0805 -1. BAL0883 1. + SH080683 COST 429.04 TRAN0806 1. + SH080683 BAL0852 -1. BAL0883 1. + SH080184 COST 525.92 TRAN0801 1. + SH080184 BAL0801 -1. BAL0884 1. + SH080284 COST 332.16 TRAN0802 1. + SH080284 BAL0802 -1. BAL0884 1. + SH080384 COST 629.72 TRAN0803 1. + SH080384 BAL0803 -1. BAL0884 1. + SH080484 COST 640.1 TRAN0804 1. + SH080484 BAL0804 -1. BAL0884 1. + SH080584 COST 847.7 TRAN0805 1. + SH080584 BAL0805 -1. BAL0884 1. + SH080684 COST 527.65 TRAN0806 1. + SH080684 BAL0852 -1. BAL0884 1. + SH080884 COST 671.24 TRAN0808 1. + SH080884 BAL0883 -1. BAL0884 1. + TRSH0101 COST 78. TRAN0101 -1. + TRSH0102 COST 78. TRAN0201 -1. + TRSH0103 COST 78. TRAN0301 -1. + TRSH0104 COST 101.5 TRAN0401 -1. + TRSH0105 COST 78. TRAN0501 -1. + TRSH0106 COST 78. TRAN0601 -1. + TRSH0107 COST 78. TRAN0701 -1. + TRSH0108 COST 101.5 TRAN0801 -1. + TRSH0201 COST 78. TRAN0102 -1. + TRSH0202 COST 78. TRAN0202 -1. + TRSH0203 COST 78. TRAN0302 -1. + TRSH0204 COST 101.5 TRAN0402 -1. + TRSH0205 COST 78. TRAN0502 -1. + TRSH0206 COST 78. TRAN0602 -1. + TRSH0207 COST 78. TRAN0702 -1. + TRSH0208 COST 101.5 TRAN0802 -1. + TRSH0301 COST 78. TRAN0103 -1. + TRSH0302 COST 78. TRAN0203 -1. + TRSH0303 COST 78. TRAN0303 -1. + TRSH0304 COST 101.5 TRAN0403 -1. + TRSH0305 COST 78. TRAN0503 -1. + TRSH0306 COST 78. TRAN0603 -1. + TRSH0307 COST 78. TRAN0703 -1. + TRSH0308 COST 101.5 TRAN0803 -1. + TRSH0401 COST 78. TRAN0104 -1. + TRSH0402 COST 78. TRAN0204 -1. + TRSH0403 COST 78. TRAN0304 -1. + TRSH0404 COST 101.5 TRAN0404 -1. + TRSH0405 COST 78. TRAN0504 -1. + TRSH0406 COST 78. TRAN0604 -1. + TRSH0407 COST 78. TRAN0704 -1. + TRSH0408 COST 101.5 TRAN0804 -1. + TRSH0501 COST 78. TRAN0105 -1. + TRSH0502 COST 78. TRAN0205 -1. + TRSH0503 COST 78. TRAN0305 -1. + TRSH0504 COST 101.5 TRAN0405 -1. + TRSH0505 COST 78. TRAN0505 -1. + TRSH0506 COST 78. TRAN0605 -1. + TRSH0507 COST 78. TRAN0705 -1. + TRSH0508 COST 101.5 TRAN0805 -1. + TRSH0601 COST 78. TRAN0106 -1. + TRSH0602 COST 78. TRAN0206 -1. + TRSH0603 COST 78. TRAN0306 -1. + TRSH0604 COST 101.5 TRAN0406 -1. + TRSH0605 COST 78. TRAN0506 -1. + TRSH0606 COST 78. TRAN0606 -1. + TRSH0607 COST 78. TRAN0706 -1. + TRSH0608 COST 101.5 TRAN0806 -1. + TRSH0701 COST 78. TRAN0107 -1. + TRSH0702 COST 78. TRAN0207 -1. + TRSH0703 COST 78. TRAN0307 -1. + TRSH0704 COST 101.5 TRAN0407 -1. + TRSH0705 COST 78. TRAN0507 -1. + TRSH0706 COST 78. TRAN0607 -1. + TRSH0707 COST 78. TRAN0707 -1. + TRSH0708 COST 101.5 TRAN0807 -1. + TRSH0801 COST 78. TRAN0108 -1. + TRSH0802 COST 78. TRAN0208 -1. + TRSH0803 COST 78. TRAN0308 -1. + TRSH0804 COST 101.5 TRAN0408 -1. + TRSH0805 COST 78. TRAN0508 -1. + TRSH0806 COST 78. TRAN0608 -1. + TRSH0807 COST 78. TRAN0708 -1. + TRSH0808 COST 101.5 TRAN0808 -1. +RHS + RHS REGMAX 7. OVRMAX 126. + RHS REGMAX01 3. REGMAX02 3. + RHS REGMAX04 3. OVRMAX01 48. + RHS OVRMAX02 48. OVRMAX04 30. + RHS BAL0102 .105342 BAL0104 .316026 + RHS BAL0106 .263355 BAL0107 1.15876 + RHS BAL0108 .948077 BAL0109 .421368 + RHS BAL0110 .57938 BAL0111 .632051 + RHS BAL0112 .526709 BAL0114 .421368 + RHS BAL0115 1.21143 BAL0116 .948077 + RHS BAL0117 1.05342 BAL0118 .421368 + RHS BAL0119 .684722 BAL0120 1.15876 + RHS BAL0121 1.10609 BAL0122 .684722 + RHS BAL0123 .57938 BAL0124 .0526709 + RHS BAL0125 .684722 BAL0126 .210684 + RHS BAL0127 .316026 BAL0128 .895406 + RHS BAL0129 .474038 BAL0130 .842735 + RHS BAL0131 .57938 BAL0132 1.00075 + RHS BAL0133 1.15876 BAL0134 1.05342 + RHS BAL0135 .632051 BAL0136 .368697 + RHS BAL0137 1.94882 BAL0138 1.79081 + RHS BAL0139 .368697 BAL0140 1.10609 + RHS BAL0141 .737393 BAL0142 .263355 + RHS BAL0143 1.52746 BAL0144 .895406 + RHS BAL0145 1.36944 BAL0146 .895406 + RHS BAL0147 .632051 BAL0148 .526709 + RHS BAL0149 .368697 BAL0150 .526709 + RHS BAL0151 .421368 BAL0153 1.00075 + RHS BAL0154 .421368 BAL0155 1.10609 + RHS BAL0156 .790064 BAL0157 .684722 + RHS BAL0158 2.0015 BAL0159 1.21143 + RHS BAL0160 1.21143 BAL0163 .526709 + RHS BAL0165 .210684 BAL0166 .263355 + RHS BAL0167 .210684 BAL0168 .105342 + RHS BAL0169 .158013 BAL0171 .948077 + RHS BAL0172 .210684 BAL0173 .158013 + RHS BAL0174 .105342 BAL0175 .210684 + RHS BAL0176 .0526709 BAL0177 1.00075 + RHS BAL0178 .842735 BAL0179 .105342 + RHS BAL0180 .263355 BAL0182 .316026 + RHS BAL0184 .316026 BAL0201 .130917 + RHS BAL0202 .261834 BAL0204 .785501 + RHS BAL0206 1.17825 BAL0207 3.79659 + RHS BAL0208 2.74925 BAL0209 1.571 + RHS BAL0210 2.09467 BAL0211 1.96375 + RHS BAL0212 1.83284 BAL0214 1.70192 + RHS BAL0215 6.15309 BAL0216 2.09467 + RHS BAL0217 2.09467 BAL0218 1.571 + RHS BAL0219 3.01109 BAL0220 3.01109 + RHS BAL0221 3.142 BAL0222 2.22559 + RHS BAL0223 2.22559 BAL0224 .130917 + RHS BAL0225 1.30917 BAL0226 .523667 + RHS BAL0227 1.17825 BAL0228 1.571 + RHS BAL0229 1.30917 BAL0230 1.571 + RHS BAL0231 1.571 BAL0232 1.96375 + RHS BAL0233 2.74925 BAL0234 2.09467 + RHS BAL0235 1.30917 BAL0236 .654584 + RHS BAL0237 3.66567 BAL0238 3.142 + RHS BAL0239 1.571 BAL0240 1.70192 + RHS BAL0241 1.17825 BAL0242 1.30917 + RHS BAL0243 4.18934 BAL0244 1.17825 + RHS BAL0245 2.22559 BAL0246 2.09467 + RHS BAL0247 1.44009 BAL0248 1.04733 + RHS BAL0249 .654584 BAL0250 .785501 + RHS BAL0251 .523667 BAL0253 2.22559 + RHS BAL0254 .654584 BAL0255 1.83284 + RHS BAL0256 1.571 BAL0257 1.30917 + RHS BAL0258 3.27292 BAL0259 2.3565 + RHS BAL0260 1.83284 BAL0263 .785501 + RHS BAL0265 .916418 BAL0266 .916418 + RHS BAL0267 .785501 BAL0268 .261834 + RHS BAL0269 .654584 BAL0271 3.27292 + RHS BAL0272 .392751 BAL0273 1.04733 + RHS BAL0274 .523667 BAL0275 .523667 + RHS BAL0276 .392751 BAL0277 3.53475 + RHS BAL0278 2.09467 BAL0279 .392751 + RHS BAL0280 .654584 BAL0282 1.04733 + RHS BAL0284 1.30917 BAL0302 .067364 + RHS BAL0307 .471548 BAL0308 .404184 + RHS BAL0309 .134728 BAL0310 1.48201 + RHS BAL0311 .067364 BAL0312 .067364 + RHS BAL0315 7.94895 BAL0316 .202092 + RHS BAL0321 .134728 BAL0327 .875732 + RHS BAL0329 .134728 BAL0331 .269456 + RHS BAL0333 .269456 BAL0336 .875732 + RHS BAL0337 .875732 BAL0338 .134728 + RHS BAL0339 .134728 BAL0340 .33682 + RHS BAL0341 .538912 BAL0342 .067364 + RHS BAL0343 3.70502 BAL0344 1.54937 + RHS BAL0345 .404184 BAL0346 3.03138 + RHS BAL0347 .404184 BAL0348 .067364 + RHS BAL0354 .067364 BAL0355 .134728 + RHS BAL0358 .067364 BAL0365 .134728 + RHS BAL0366 1.34728 BAL0367 .404184 + RHS BAL0368 1.75146 BAL0369 1.88619 + RHS BAL0371 5.72594 BAL0372 .67364 + RHS BAL0373 3.70502 BAL0374 1.95356 + RHS BAL0375 .269456 BAL0376 1.61674 + RHS BAL0377 1.41464 BAL0378 2.22301 + RHS BAL0379 3.16611 BAL0382 11.8561 + RHS BAL0384 1.34728 BAL0502 .135821 + RHS BAL0504 .543284 BAL0506 .543284 + RHS BAL0507 2.5806 BAL0508 2.03731 + RHS BAL0509 .814925 BAL0510 2.85224 + RHS BAL0511 1.08657 BAL0512 1.22239 + RHS BAL0514 1.35821 BAL0515 5.70448 + RHS BAL0516 3.12388 BAL0517 1.49403 + RHS BAL0518 1.35821 BAL0519 1.22239 + RHS BAL0520 1.35821 BAL0521 6.24776 + RHS BAL0522 .950746 BAL0523 1.08657 + RHS BAL0525 2.71642 BAL0526 .407463 + RHS BAL0527 1.90149 BAL0528 2.17313 + RHS BAL0529 1.76567 BAL0530 1.22239 + RHS BAL0531 1.49403 BAL0532 1.62985 + RHS BAL0533 3.39552 BAL0534 2.03731 + RHS BAL0535 .814925 BAL0536 .407463 + RHS BAL0537 3.39552 BAL0538 2.5806 + RHS BAL0539 1.08657 BAL0540 2.98806 + RHS BAL0541 1.49403 BAL0542 .679104 + RHS BAL0543 4.07463 BAL0544 .814925 + RHS BAL0545 3.2597 BAL0546 4.34627 + RHS BAL0547 2.03731 BAL0548 1.90149 + RHS BAL0549 .543284 BAL0550 1.90149 + RHS BAL0551 .407463 BAL0552 .135821 + RHS BAL0553 1.22239 BAL0554 .950746 + RHS BAL0555 3.2597 BAL0556 .950746 + RHS BAL0557 1.49403 BAL0558 3.66716 + RHS BAL0559 2.5806 BAL0560 2.17313 + RHS BAL0563 1.62985 BAL0565 1.35821 + RHS BAL0566 .679104 BAL0567 1.35821 + RHS BAL0568 .407463 BAL0569 .679104 + RHS BAL0571 4.21045 BAL0572 .679104 + RHS BAL0573 .950746 BAL0574 .679104 + RHS BAL0575 .271642 BAL0576 .407463 + RHS BAL0577 4.61791 BAL0578 2.03731 + RHS BAL0579 .407463 BAL0580 .543284 + RHS BAL0582 1.22239 BAL0584 1.62985 + RHS BAL0604 .0460795 BAL0606 .153598 + RHS BAL0607 .122879 BAL0608 .291837 + RHS BAL0609 .184318 BAL0610 .307197 + RHS BAL0611 .291837 BAL0612 .0614393 + RHS BAL0614 .445435 BAL0615 .368636 + RHS BAL0616 .0614393 BAL0617 .138238 + RHS BAL0618 .122879 BAL0619 .307197 + RHS BAL0620 .215038 BAL0621 .522234 + RHS BAL0622 .153598 BAL0623 .383996 + RHS BAL0625 .383996 BAL0626 .0460795 + RHS BAL0627 .0614393 BAL0628 .368636 + RHS BAL0629 .122879 BAL0630 .0614393 + RHS BAL0631 .0767991 BAL0632 .153598 + RHS BAL0633 .353276 BAL0634 .245757 + RHS BAL0635 .0460795 BAL0636 .0307197 + RHS BAL0637 .583673 BAL0638 .368636 + RHS BAL0639 .0767991 BAL0640 .122879 + RHS BAL0641 .0767991 BAL0642 .0767991 + RHS BAL0643 .215038 BAL0644 .0460795 + RHS BAL0645 .491514 BAL0646 .261117 + RHS BAL0647 .184318 BAL0648 .184318 + RHS BAL0649 .138238 BAL0650 .107519 + RHS BAL0651 .184318 BAL0653 .568314 + RHS BAL0654 .0614393 BAL0655 .552954 + RHS BAL0656 .276477 BAL0657 .153598 + RHS BAL0658 .552954 BAL0659 .460795 + RHS BAL0660 .460795 BAL0663 .138238 + RHS BAL0665 .107519 BAL0666 .0767991 + RHS BAL0667 .0614393 BAL0668 .0614393 + RHS BAL0669 .0614393 BAL0671 .414715 + RHS BAL0672 .107519 BAL0673 .0767991 + RHS BAL0674 .0307197 BAL0676 .0767991 + RHS BAL0677 .138238 BAL0678 .291837 + RHS BAL0679 .0460795 BAL0680 .0460795 + RHS BAL0682 .0614393 BAL0684 .168958 + RHS BAL0706 .125786 BAL0707 .330189 + RHS BAL0708 .188679 BAL0709 .125786 + RHS BAL0710 .235849 BAL0711 .235849 + RHS BAL0712 .141509 BAL0714 .204403 + RHS BAL0715 .471698 BAL0716 .172956 + RHS BAL0717 .204403 BAL0718 .235849 + RHS BAL0719 .393082 BAL0720 .408805 + RHS BAL0721 .361635 BAL0722 .188679 + RHS BAL0723 .220126 BAL0725 .0786164 + RHS BAL0726 .0786164 BAL0727 .0943396 + RHS BAL0728 .267296 BAL0729 .157233 + RHS BAL0730 .393082 BAL0731 .220126 + RHS BAL0732 .188679 BAL0733 .204403 + RHS BAL0734 .172956 BAL0735 .157233 + RHS BAL0736 .0943396 BAL0737 .408805 + RHS BAL0738 .707547 BAL0739 .141509 + RHS BAL0740 .110063 BAL0741 .157233 + RHS BAL0742 .125786 BAL0743 .283019 + RHS BAL0744 .235849 BAL0745 .471698 + RHS BAL0746 .220126 BAL0747 .125786 + RHS BAL0748 .141509 BAL0749 .188679 + RHS BAL0750 .235849 BAL0751 .251572 + RHS BAL0753 .707547 BAL0754 .172956 + RHS BAL0755 .314465 BAL0756 .424528 + RHS BAL0757 .204403 BAL0758 .896226 + RHS BAL0759 .220126 BAL0760 .550314 + RHS BAL0763 .220126 BAL0765 .0786164 + RHS BAL0766 .0628931 BAL0767 .0628931 + RHS BAL0768 .0471698 BAL0769 .0314465 + RHS BAL0771 .0943396 BAL0772 .0628931 + RHS BAL0773 .0943396 BAL0774 .0157233 + RHS BAL0776 .0471698 BAL0777 .0786164 + RHS BAL0778 .141509 BAL0779 .0314465 + RHS BAL0780 .0471698 BAL0782 .0786164 + RHS BAL0784 .157233 +ENDATA diff --git a/demos/ppl_lpsol/examples/unboundedmin.mps b/demos/ppl_lpsol/examples/unboundedmin.mps new file mode 100644 index 0000000..059a663 --- /dev/null +++ b/demos/ppl_lpsol/examples/unboundedmin.mps @@ -0,0 +1,19 @@ +NAME from_lp_file +ROWS + N r_000000 + L C1 + L r_000002 +COLUMNS + MARK0000 'MARKER' 'INTORG' + x1 r_000000 1 + x1 C1 2 + x1 r_000002 -4 + x2 r_000000 -2 + x2 C1 -1 + x2 r_000002 -4 + MARK0001 'MARKER' 'INTEND' +RHS + RHS C1 0 + RHS r_000002 0 +BOUNDS +ENDATA diff --git a/demos/ppl_lpsol/expected_int16 b/demos/ppl_lpsol/expected_int16 new file mode 100644 index 0000000..7076bbb --- /dev/null +++ b/demos/ppl_lpsol/expected_int16 @@ -0,0 +1,973 @@ +*** ./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 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: 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 +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: 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 boeing1.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -c -oobtained -r -M boeing1.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -c -oobtained -r -m boeing2.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -c -oobtained -r -M boeing2.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: 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 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: 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: Negative 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 -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 -c -oobtained -r -m mas76.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -c -oobtained -r -M -c0.000123 mas76.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 -oobtained -r -m -c0.0000002 modglob.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000003 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..cca3c23 --- /dev/null +++ b/demos/ppl_lpsol/expected_int16_a @@ -0,0 +1,181 @@ +*** ./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 boeing1.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -M boeing1.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -m boeing2.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -M boeing2.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: 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 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: 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 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 mas76.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000123 mas76.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -n mas76.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.0000002 modglob.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000003 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..3a2a5af --- /dev/null +++ b/demos/ppl_lpsol/expected_int32 @@ -0,0 +1,993 @@ +*** ./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 mip.mps +Feasible problem. +*** ./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: 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: 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 boeing1.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -c -oobtained -r -M boeing1.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -c -oobtained -r -m boeing2.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -c -oobtained -r -M boeing2.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: 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 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: 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: 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: Negative 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 -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 -c -oobtained -r -m mas76.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -c -oobtained -r -M -c0.000123 mas76.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 -oobtained -r -m -c0.0000002 modglob.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000003 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..c3e054b --- /dev/null +++ b/demos/ppl_lpsol/expected_int32_a @@ -0,0 +1,205 @@ +*** ./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: 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 boeing1.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -M boeing1.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -m boeing2.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -M boeing2.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: 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 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: 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 +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 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 mas76.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000123 mas76.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -n mas76.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.0000002 modglob.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000003 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..8b65b5d --- /dev/null +++ b/demos/ppl_lpsol/expected_int64 @@ -0,0 +1,993 @@ +*** ./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 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: 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 +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 boeing1.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -c -oobtained -r -M boeing1.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -c -oobtained -r -m boeing2.mps +PPL error code -6: Negative overflow. +*** ./ppl_lpsol -s -p1 -c -oobtained -r -M boeing2.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: 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 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: Negative 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 -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 -c -oobtained -r -m mas76.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -c -oobtained -r -M -c0.000123 mas76.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 -oobtained -r -m -c0.0000002 modglob.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000003 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..37567e6 --- /dev/null +++ b/demos/ppl_lpsol/expected_int64_a @@ -0,0 +1,205 @@ +*** ./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 boeing1.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -M boeing1.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -m boeing2.mps +PPL error code -6: Negative overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -M boeing2.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: 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 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 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 mas76.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000123 mas76.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -n mas76.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.0000002 modglob.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000003 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..a88577c --- /dev/null +++ b/demos/ppl_lpsol/expected_int8 @@ -0,0 +1,177 @@ +*** ./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 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: Positive 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 boeing1.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -c -oobtained -r -M boeing1.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -c -oobtained -r -m boeing2.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -c -oobtained -r -M boeing2.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 +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 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: 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 +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 -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 -c -oobtained -r -m mas76.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -c -oobtained -r -M -c0.000123 mas76.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 -oobtained -r -m -c0.0000002 modglob.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000003 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..170281a --- /dev/null +++ b/demos/ppl_lpsol/expected_int8_a @@ -0,0 +1,159 @@ +*** ./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 boeing1.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -M boeing1.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -m boeing2.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -M boeing2.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 +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 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 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 mas76.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000123 mas76.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -n mas76.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.0000002 modglob.mps +PPL error code -6: Positive overflow. +*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000003 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..b73f377 --- /dev/null +++ b/demos/ppl_lpsol/expected_mpz @@ -0,0 +1,5109 @@ +*** ./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 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 = 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 -c -oobtained -r -M blend.mps +Unbounded problem. +*** ./ppl_lpsol -s -p1 -c -oobtained -r -m boeing1.mps +Optimum value: -335.2135675 +*** ./ppl_lpsol -s -p1 -c -oobtained -r -M boeing1.mps +Optimum value: 286.9746573 +*** ./ppl_lpsol -s -p1 -c -oobtained -r -m boeing2.mps +Optimum value: -315.018728 +*** ./ppl_lpsol -s -p1 -c -oobtained -r -M boeing2.mps +Optimum value: -73.36896911 +*** ./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.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 -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 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.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 -c -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 -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 -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.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 = 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 = 1 +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 = 1 +x94 = 0 +x95 = 0 +x96 = 1 +x97 = 0 +x98 = 0 +x99 = 0 +x100 = 0 +x101 = 0 +x102 = 0 +x103 = 0 +x104 = 0 +x105 = 1 +x106 = 0 +x107 = 0 +x108 = 0 +x109 = 0 +x110 = 0 +x111 = 0 +x112 = 0 +x113 = 0 +x114 = 0 +x115 = 0 +x116 = 0 +x117 = 1 +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 = 1 +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 -c -oobtained -n mas74.mps +Feasible problem. +*** ./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.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 -c -oobtained -r -M -c0.000123 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 -c -oobtained -n mas76.mps +Feasible problem. +*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.0000002 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.2785997 +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.611303 +x33 = 0 +x34 = 0 +x35 = 0 +x36 = 2780.728439 +x37 = 0 +x38 = 0 +x39 = 0 +x40 = 889.0673526 +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.685932 +x60 = 0 +x61 = 0 +x62 = 838.4627168 +x63 = 0 +x64 = 126.3594424 +x65 = 0 +x66 = 204.7049903 +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.68699 +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.05121355718 +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.03579089998 +x250 = 0 +x251 = 0.5115737544 +x252 = 0 +x253 = 0.0681659426 +x254 = 0 +x255 = 0.3658594156 +x256 = 0 +x257 = 0.09942590275 +x258 = 0 +x259 = 0.1457785589 +x260 = 0 +x261 = 0.05113398226 +x262 = 0 +x263 = 0.0677838342 +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.00822909266 +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.099854 +x304 = 1198.5 +x305 = 2188.799805 +x306 = 594.4 +x307 = 51.4 +x308 = 75.6 +x309 = 563.099854 +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.000003 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.099854 +x366 = 1198.5 +x367 = 2188.799805 +x368 = 594.4 +x369 = 51.4 +x370 = 75.6 +x371 = 563.099854 +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..7418253 --- /dev/null +++ b/demos/ppl_lpsol/expected_mpz_a @@ -0,0 +1,3518 @@ +*** ./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 boeing1.mps +Optimum value: -335.2135675 +*** ./ppl_lpsol -s -p1 -oobtained -r -M boeing1.mps +Optimum value: 286.9746573 +*** ./ppl_lpsol -s -p1 -oobtained -r -m boeing2.mps +Optimum value: -315.018728 +*** ./ppl_lpsol -s -p1 -oobtained -r -M boeing2.mps +Optimum value: -73.36896911 +*** ./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 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 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 = 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 = 1 +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 = 1 +x94 = 0 +x95 = 0 +x96 = 1 +x97 = 0 +x98 = 0 +x99 = 0 +x100 = 0 +x101 = 0 +x102 = 0 +x103 = 0 +x104 = 0 +x105 = 1 +x106 = 0 +x107 = 0 +x108 = 0 +x109 = 0 +x110 = 0 +x111 = 0 +x112 = 0 +x113 = 0 +x114 = 0 +x115 = 0 +x116 = 0 +x117 = 1 +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 = 1 +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 -n mas74.mps +Feasible problem. +*** ./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 -c0.000123 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 -n mas76.mps +Feasible problem. +*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.0000002 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.2785997 +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.611303 +x33 = 0 +x34 = 0 +x35 = 0 +x36 = 2780.728439 +x37 = 0 +x38 = 0 +x39 = 0 +x40 = 889.0673526 +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.685932 +x60 = 0 +x61 = 0 +x62 = 838.4627168 +x63 = 0 +x64 = 126.3594424 +x65 = 0 +x66 = 204.7049903 +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.68699 +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.05121355718 +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.03579089998 +x250 = 0 +x251 = 0.5115737544 +x252 = 0 +x253 = 0.0681659426 +x254 = 0 +x255 = 0.3658594156 +x256 = 0 +x257 = 0.09942590275 +x258 = 0 +x259 = 0.1457785589 +x260 = 0 +x261 = 0.05113398226 +x262 = 0 +x263 = 0.0677838342 +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.00822909266 +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.099854 +x304 = 1198.5 +x305 = 2188.799805 +x306 = 594.4 +x307 = 51.4 +x308 = 75.6 +x309 = 563.099854 +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.000003 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.099854 +x366 = 1198.5 +x367 = 2188.799805 +x368 = 594.4 +x369 = 51.4 +x370 = 75.6 +x371 = 563.099854 +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/ppl_lpsol.1 b/demos/ppl_lpsol/ppl_lpsol.1 new file mode 100644 index 0000000..5374c6e --- /dev/null +++ b/demos/ppl_lpsol/ppl_lpsol.1 @@ -0,0 +1,97 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.36. +.TH PPL_LPSOL "1" "April 2009" "ppl_lpsol 0.10.2" "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; +optima are checked +with a tolerance of THRESHOLD (default 1e\-09) +.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://www.cs.unipr.it/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\-2009 Roberto Bagnara +.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..935cf9b --- /dev/null +++ b/demos/ppl_lpsol/ppl_lpsol.c @@ -0,0 +1,1393 @@ +/* Solve linear programming problems by either vertex/point enumeration + or the primal simplex algorithm. + Copyright (C) 2001-2009 Roberto Bagnara + +This file is part of the Parma Polyhedra Library (PPL). + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . */ + +#include +#include "ppl_c.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(PPL_HAVE_GLPK_GLPK_H) +#include +#elif defined(PPL_HAVE_GLPK_H) +#include +#endif + +#ifdef PPL_HAVE_GETOPT_H +# include + +/* 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 + . */ +# include +#endif + +#ifdef PPL_HAVE_SIGNAL_H +# include +#endif + +#ifdef PPL_HAVE_SYS_TIME_H +# include +#endif + +#ifdef PPL_HAVE_SYS_RESOURCE_H +/* This should be included after and so as to make + sure we have the definitions for, e.g., `ru_utime'. */ +# include +#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) \ + && (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; optima are checked\n" \ + " with a tolerance of THRESHOLD (default %.10g)\n" \ + " -i, --incremental solves the problem incrementally\n" \ + " -m, --min minimizes the objective function\n" \ + " -M, --max maximizes the objective function (default)\n" +#define USAGE_STRING1 \ + " -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" \ + " -e, --enumerate use the (expensive!) enumeration method\n" +#define USAGE_STRING2 \ + " -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 .\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); +} + +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); +} + +#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_TIMINGS + + 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 + 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 hsecs; + if (current_usecs < saved_usecs) { + hsecs = (((1000000 + current_usecs) - saved_usecs) + 5000) / 10000; + secs = (current_secs - saved_secs) -1; + } + else { + hsecs = ((current_usecs - saved_usecs) + 5000) / 10000; + secs = current_secs - saved_secs; + } + assert(hsecs >= 0 && hsecs < 100 && secs >= 0); + fprintf(f, "%d.%.2d", secs, hsecs); + } +} + +#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_HAVE_DECL_RLIMIT_AS + +void +limit_virtual_memory(unsigned bytes) { + struct rlimit t; + + if (getrlimit(RLIMIT_AS, &t) != 0) + fatal("getrlimit failed: %s", strerror(errno)); + + if (bytes < t.rlim_cur) { + t.rlim_cur = bytes; + if (setrlimit(RLIMIT_AS, &t) != 0) + fatal("setrlimit failed: %s", strerror(errno)); + } +} + +#else + +void +limit_virtual_memory(unsigned bytes ATTRIBUTE_UNUSED) { +} + +#endif /* !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 LPX* glpk_lp; +static int glpk_lp_problem_kind; +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; + if (!check_results) + return; + + /* Disable GLPK output. */ + lpx_set_int_parm(glpk_lp, LPX_K_MSGLEV, 0); + + if (no_mip || glpk_lp_problem_kind == LPX_LP) + treat_as_lp = 1; + + lpx_set_obj_dir(glpk_lp, (maximize ? LPX_MAX : LPX_MIN)); + + if (treat_as_lp) { + /* Set the problem class to LP: MIP problems are thus treated as + LP ones. */ + lpx_set_class(glpk_lp, LPX_LP); + lpx_simplex(glpk_lp); + glpk_status = lpx_get_status(glpk_lp); + } + else { + /* MIP case. */ + lpx_intopt(glpk_lp); + glpk_status = lpx_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 == LPX_NOFEAS || glpk_status == LPX_I_NOFEAS)) + || (ppl_status == PPL_MIP_PROBLEM_STATUS_UNBOUNDED + && (glpk_status == LPX_UNBND || glpk_status == LPX_I_UNDEF)) + || (ppl_status == PPL_MIP_PROBLEM_STATUS_OPTIMIZED + && ((glpk_status == LPX_OPT || glpk_status == LPX_I_OPT) + /* If no_optimization is enabled, check if the problem is + unbounded for GLPK. */ + || (no_optimization && (glpk_status == LPX_UNBND + || glpk_status == LPX_I_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 LPX_NOFEAS: + glpk_status_string = "unfeasible"; + break; + case LPX_UNBND: + glpk_status_string = "unbounded"; + break; + case LPX_OPT: + glpk_status_string = "optimizable"; + break; + case LPX_I_NOFEAS: + glpk_status_string = "unfeasible"; + break; + case LPX_I_OPT: + glpk_status_string = "optimizable"; + break; + case LPX_I_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 ? lpx_get_obj_val(glpk_lp) + : lpx_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 %.10g," + " not %.10g", glpk_optimum_value, ppl_optimum_value); + check_results_failed = 1; + } + } + return; +} + + +static const char* +variable_output_function(ppl_dimension_type var) { + const char* name = lpx_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 LPX_FR: + break; + + case LPX_LO: + mpz_mul(tmp_z, den_lcm, mpq_numref(rational_lb)); + mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_lb)); + mpz_neg(tmp_z, tmp_z); + ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z); + ppl_Linear_Expression_add_to_inhomogeneous(ppl_le, ppl_coeff); + ppl_new_Constraint(&ppl_c, ppl_le, PPL_CONSTRAINT_TYPE_GREATER_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 LPX_UP: + mpz_mul(tmp_z, den_lcm, mpq_numref(rational_ub)); + mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_ub)); + mpz_neg(tmp_z, tmp_z); + ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z); + ppl_Linear_Expression_add_to_inhomogeneous(ppl_le, ppl_coeff); + ppl_new_Constraint(&ppl_c, ppl_le, + PPL_CONSTRAINT_TYPE_LESS_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 LPX_DB: + ppl_new_Linear_Expression_from_Linear_Expression(&ppl_le2, ppl_le); + + mpz_mul(tmp_z, den_lcm, mpq_numref(rational_lb)); + mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_lb)); + mpz_neg(tmp_z, tmp_z); + ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z); + ppl_Linear_Expression_add_to_inhomogeneous(ppl_le, ppl_coeff); + ppl_new_Constraint(&ppl_c, ppl_le, PPL_CONSTRAINT_TYPE_GREATER_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 LPX_FX: + mpz_mul(tmp_z, den_lcm, mpq_numref(rational_lb)); + mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_lb)); + mpz_neg(tmp_z, tmp_z); + ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z); + ppl_Linear_Expression_add_to_inhomogeneous(ppl_le, ppl_coeff); + ppl_new_Constraint(&ppl_c, ppl_le, + PPL_CONSTRAINT_TYPE_EQUAL); + if (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 empty; + int unbounded; + int included; + int ok; + + /* 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); + return 0; + } + + 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); + return 0; + } + + /* Check whether the problem is unbounded. */ + unbounded = maximize + ? !ppl_Polyhedron_bounds_from_above(ppl_ph, ppl_objective_le) + : !ppl_Polyhedron_bounds_from_below(ppl_ph, ppl_objective_le); + +#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); + return 0; + } + + ok = 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); + + if (!ok) + fatal("internal error"); + + ppl_delete_Polyhedron(ppl_ph); + +#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 (!included) + fatal("internal error"); + + return 1; +} + +static int +solve_with_simplex(ppl_const_Constraint_System_t cs, + ppl_const_Linear_Expression_t objective, + ppl_Coefficient_t optimum_n, + ppl_Coefficient_t optimum_d, + ppl_Generator_t point) { + ppl_MIP_Problem_t ppl_mip; + 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); + return 0; + } + 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); + return 0; + } + else if (status == PPL_MIP_PROBLEM_STATUS_UNBOUNDED) { + if (verbosity >= 1) + fprintf(output_file, "Unbounded problem.\n"); + maybe_check_results(status, 0.0); + return 0; + } + 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); + return 1; + } + else + fatal("internal error"); + + /* This is just to avoid a compiler warning. */ + return 0; +} + +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; + +#ifdef PPL_LPSOL_SUPPORTS_TIMINGS + + if (print_timings) + start_clock(); + +#endif /* defined(PPL_LPSOL_SUPPORTS_TIMINGS) */ + + if (verbosity == 0) { + /* FIXME: find a way to suppress output from lpx_read_mps. */ + } + + glpk_lp = lpx_read_mps(file_name); + + if (glpk_lp == NULL) + 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_problem_kind = lpx_get_class(glpk_lp); + if (glpk_lp_problem_kind == LPX_MIP && !no_mip && !use_simplex) + fatal("the enumeration solving method can not handle MIP problems"); + + dimension = lpx_get_num_cols(glpk_lp); + + /* Read variables constrained to be integer. */ + if (glpk_lp_problem_kind == LPX_MIP && !no_mip && use_simplex) { + if (verbosity >= 4) + fprintf(output_file, "Integer variables:\n"); + glpk_lp_num_int = lpx_get_num_int(glpk_lp); + integer_variables = (ppl_dimension_type*) + malloc((glpk_lp_num_int + 1)*sizeof(ppl_dimension_type)); + for (i = 0, j = 0; i < dimension; ++i) + if (lpx_get_col_kind(glpk_lp, i+1) == LPX_IV) { + 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 = lpx_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 = lpx_get_mat_row(glpk_lp, row, coefficient_index, coefficient_value); + for (i = 1; i <= nz; ++i) { + mpq_set_d(rational_coefficient[i], coefficient_value[i]); + /* Update den_lcm. */ + mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_coefficient[i])); + } + lpx_get_row_bnds(glpk_lp, row, &type, &lb, &ub); + mpq_set_d(rational_lb, lb); + mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_lb)); + mpq_set_d(rational_ub, ub); + mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_ub)); + + ppl_new_Linear_Expression_with_dimension(&ppl_le, dimension); + + for (i = 1; i <= nz; ++i) { + mpz_mul(tmp_z, den_lcm, mpq_numref(rational_coefficient[i])); + mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_coefficient[i])); + ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z); + ppl_Linear_Expression_add_to_coefficient(ppl_le, coefficient_index[i]-1, + ppl_coeff); + } + + add_constraints(ppl_le, type, rational_lb, rational_ub, den_lcm, ppl_cs); + + ppl_delete_Linear_Expression(ppl_le); + } + + free(coefficient_value); + for (i = 1; i <= dimension; ++i) + mpq_clear(rational_coefficient[i]); + free(rational_coefficient); + free(coefficient_index); + +#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) { + lpx_get_col_bnds(glpk_lp, column, &type, &lb, &ub); + + mpq_set_d(rational_lb, lb); + mpq_set_d(rational_ub, ub); + + /* Initialize the least common multiple computation. */ + mpz_set_si(den_lcm, 1); + mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_lb)); + mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_ub)); + + ppl_new_Linear_Expression_with_dimension(&ppl_le, dimension); + ppl_assign_Coefficient_from_mpz_t(ppl_coeff, den_lcm); + ppl_Linear_Expression_add_to_coefficient(ppl_le, column-1, ppl_coeff); + + add_constraints(ppl_le, type, rational_lb, rational_ub, den_lcm, ppl_cs); + + ppl_delete_Linear_Expression(ppl_le); + } + + mpq_clear(rational_ub); + mpq_clear(rational_lb); + + /* Deal with the objective function. */ + objective = (mpq_t*) malloc((dimension+1)*sizeof(mpq_t)); + + /* Initialize the least common multiple computation. */ + mpz_set_si(den_lcm, 1); + + mpq_init(objective[0]); + mpq_set_d(objective[0], lpx_get_obj_coef(glpk_lp, 0)); + for (i = 1; i <= dimension; ++i) { + mpq_init(objective[i]); + mpq_set_d(objective[i], lpx_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); + /* The inhomogeneous term is completely useless for our purpose. */ + for (i = 1; i <= dimension; ++i) { + mpz_mul(tmp_z, den_lcm, mpq_numref(objective[i])); + mpz_divexact(tmp_z, tmp_z, mpq_denref(objective[i])); + ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z); + ppl_Linear_Expression_add_to_coefficient(ppl_objective_le, i-1, ppl_coeff); + } + + if (verbosity >= 4) { + fprintf(output_file, "Objective function:\n"); + ppl_io_fprint_Linear_Expression(output_file, ppl_objective_le); + } + + for (i = 0; i <= dimension; ++i) + mpq_clear(objective[i]); + free(objective); + + if (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_problem_kind == LPX_MIP) + 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); + + lpx_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/depcomp b/depcomp new file mode 100755 index 0000000..e5f9736 --- /dev/null +++ b/depcomp @@ -0,0 +1,589 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2007-03-29.01 + +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007 Free Software +# Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by `PROGRAMS ARGS'. + object Object file output by `PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputing dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## 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 -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the `deleted header file' problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' ' +' < "$tmpdepfile" | +## Some versions of gcc put a space before the `:'. On the theory +## that the space means something, we add a space to the output as +## well. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like `#:fec' to the end of the + # dependency line. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> $depfile + echo >> $depfile + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> $depfile + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts `$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + 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 -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Intel's C compiler understands `-MD -MF file'. However on + # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # ICC 7.0 will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want: + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + # ICC 7.1 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using \ : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | + sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +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. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + 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 -eq 0; then : + else + 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,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" + # Add `dependent.h:' lines. + sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile" + else + echo "#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. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + # With Tru64 cc, shared objects can also be used to make a + # static library. This mechanism is used in libtool 1.4 series to + # handle both shared and static libraries in a single compilation. + # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. + # + # With libtool 1.5 this exception was removed, and libtool now + # generates 2 separate objects for the 2 libraries. These two + # compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 + tmpdepfile2=$dir$base.o.d # libtool 1.5 + tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 + tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.o.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + tmpdepfile4=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for `:' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. + "$@" $dashmflag | + sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +' < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no + for arg in "$@"; do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix="`echo $object | sed 's/^.*\././'`" + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' ' +' | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E | + sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o, + # because we must use -o when running libtool. + "$@" || exit $? + IFS=" " + for arg + do + case "$arg" in + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" + echo " " >> "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 0000000..ab02148 --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,1637 @@ +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . + +# All the documentation in docdir. +docdir = @docdir@ +htmldir = $(docdir) +pdfdir = $(docdir) +psdir = $(docdir) +txtdir = $(docdir) + +DOXYGEN = doxygen +INSTALLDOX = ./installdox -q + +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) + +##### Library Core Manuals (C++ Interface) ##### + +USER_CORE_HTML_MANUAL = ppl-user-@VERSION@-html.tar.gz +DEVREF_CORE_HTML_MANUAL = ppl-devref-@VERSION@-html.tar.gz + +USER_CORE_PDF_MANUAL = ppl-user-@VERSION@.pdf +DEVREF_CORE_PDF_MANUAL = ppl-devref-@VERSION@.pdf + +USER_CORE_PS_MANUAL = ppl-user-@VERSION@.ps.gz +DEVREF_CORE_PS_MANUAL = ppl-devref-@VERSION@.ps.gz + +USER_CORE_HTML_DIR = ppl-user-@VERSION@-html +DEVREF_CORE_HTML_DIR = ppl-devref-@VERSION@-html + +DOX_LICENCE_FILES = \ +gpl.dox \ +fdl.dox + +DOX_FILES = \ +$(DOX_LICENCE_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) + +##### Configuration Independent Language Interface Manuals ##### + +# C Language Interface Manuals + +USER_C_INTERFACE_HTML_MANUAL = \ +ppl-user-c-interface-@VERSION@-html.tar.gz +DEVREF_C_INTERFACE_HTML_MANUAL = \ +ppl-devref-c-interface-@VERSION@-html.tar.gz + +USER_C_INTERFACE_PDF_MANUAL = \ +ppl-user-c-interface-@VERSION@.pdf +DEVREF_C_INTERFACE_PDF_MANUAL = \ +ppl-devref-c-interface-@VERSION@.pdf + +USER_C_INTERFACE_PS_MANUAL = \ +ppl-user-c-interface-@VERSION@.ps.gz +DEVREF_C_INTERFACE_PS_MANUAL = \ +ppl-devref-c-interface-@VERSION@.ps.gz + +USER_C_INTERFACE_HTML_DIR = \ +ppl-user-c-interface-@VERSION@-html +DEVREF_C_INTERFACE_HTML_DIR = \ +ppl-devref-c-interface-@VERSION@-html + +COMMON_C_INTERFACE_STUFF = \ +$(DOX_LICENCE_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 + +# Prolog Language Interface Manuals + +USER_PROLOG_INTERFACE_HTML_MANUAL = \ +ppl-user-prolog-interface-@VERSION@-html.tar.gz +DEVREF_PROLOG_INTERFACE_HTML_MANUAL = \ +ppl-devref-prolog-interface-@VERSION@-html.tar.gz + +USER_PROLOG_INTERFACE_PDF_MANUAL = \ +ppl-user-prolog-interface-@VERSION@.pdf +DEVREF_PROLOG_INTERFACE_PDF_MANUAL = \ +ppl-devref-prolog-interface-@VERSION@.pdf + +USER_PROLOG_INTERFACE_PS_MANUAL = \ +ppl-user-prolog-interface-@VERSION@.ps.gz +DEVREF_PROLOG_INTERFACE_PS_MANUAL = \ +ppl-devref-prolog-interface-@VERSION@.ps.gz + +USER_PROLOG_INTERFACE_HTML_DIR = \ +ppl-user-prolog-interface-@VERSION@-html +DEVREF_PROLOG_INTERFACE_HTML_DIR = \ +ppl-devref-prolog-interface-@VERSION@-html + +USER_PROLOG_INTERFACE_STUFF = \ +$(DOX_LICENCE_FILES) \ +user-language-interface.tex \ +ppl.sty \ +../interfaces/Prolog/Prolog_interface.dox + +DEVREF_PROLOG_INTERFACE_STUFF = \ +$(DOX_LICENCE_FILES) \ +devref-language-interface.tex \ +ppl.sty \ +../interfaces/Prolog/Prolog_interface.dox \ +../interfaces/Prolog/ppl_prolog_common.defs.hh \ +../interfaces/Prolog/ppl_prolog_common.inlines.hh \ +../interfaces/Prolog/ppl_prolog_common.cc + +# OCaml Language Interface Manuals + +USER_OCAML_INTERFACE_HTML_MANUAL = \ +ppl-user-ocaml-interface-@VERSION@-html.tar.gz +DEVREF_OCAML_INTERFACE_HTML_MANUAL = \ +ppl-devref-ocaml-interface-@VERSION@-html.tar.gz + +USER_OCAML_INTERFACE_PDF_MANUAL = \ +ppl-user-ocaml-interface-@VERSION@.pdf +DEVREF_OCAML_INTERFACE_PDF_MANUAL = \ +ppl-devref-ocaml-interface-@VERSION@.pdf + +USER_OCAML_INTERFACE_PS_MANUAL = \ +ppl-user-ocaml-interface-@VERSION@.ps.gz +DEVREF_OCAML_INTERFACE_PS_MANUAL = \ +ppl-devref-ocaml-interface-@VERSION@.ps.gz + +USER_OCAML_INTERFACE_HTML_DIR = \ +ppl-user-ocaml-interface-@VERSION@-html +DEVREF_OCAML_INTERFACE_HTML_DIR = \ +ppl-devref-ocaml-interface-@VERSION@-html + +USER_OCAML_INTERFACE_STUFF = \ +$(DOX_LICENCE_FILES) \ +user-language-interface.tex \ +ppl.sty \ +../interfaces/OCaml/OCaml_interface.dox \ +../interfaces/OCaml/ppl_ocaml_globals.mli + +DEVREF_OCAML_INTERFACE_STUFF = \ +$(DOX_LICENCE_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 + +# Java Language Interface Manuals + +USER_JAVA_INTERFACE_HTML_MANUAL = \ +ppl-user-java-interface-@VERSION@-html.tar.gz +DEVREF_JAVA_INTERFACE_HTML_MANUAL = \ +ppl-devref-java-interface-@VERSION@-html.tar.gz + +USER_JAVA_INTERFACE_PDF_MANUAL = \ +ppl-user-java-interface-@VERSION@.pdf +DEVREF_JAVA_INTERFACE_PDF_MANUAL = \ +ppl-devref-java-interface-@VERSION@.pdf + +USER_JAVA_INTERFACE_PS_MANUAL = \ +ppl-user-java-interface-@VERSION@.ps.gz +DEVREF_JAVA_INTERFACE_PS_MANUAL = \ +ppl-devref-java-interface-@VERSION@.ps.gz + +USER_JAVA_INTERFACE_HTML_DIR = \ +ppl-user-java-interface-@VERSION@-html +DEVREF_JAVA_INTERFACE_HTML_DIR = \ +ppl-devref-java-interface-@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_LICENCE_FILES) \ +user-language-interface.tex \ +ppl.sty \ +$(JAVA_INTERFACE_JAVA_FILES) + +DEVREF_JAVA_INTERFACE_STUFF = \ +$(DOX_LICENCE_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 Language Interface Manuals ##### + +# Configuration Dependent C Language Interface Manuals. +if BUILD_C_INTERFACE + +USER_CONFIGURED_C_INTERFACE_HTML_MANUAL = \ +ppl-user-configured-c-interface-@VERSION@-html.tar.gz +DEVREF_CONFIGURED_C_INTERFACE_HTML_MANUAL = \ +ppl-devref-configured-c-interface-@VERSION@-html.tar.gz + +USER_CONFIGURED_C_INTERFACE_PDF_MANUAL = \ +ppl-user-configured-c-interface-@VERSION@.pdf +DEVREF_CONFIGURED_C_INTERFACE_PDF_MANUAL = \ +ppl-devref-configured-c-interface-@VERSION@.pdf + +USER_CONFIGURED_C_INTERFACE_PS_MANUAL = \ +ppl-user-configured-c-interface-@VERSION@.ps.gz +DEVREF_CONFIGURED_C_INTERFACE_PS_MANUAL = \ +ppl-devref-configured-c-interface-@VERSION@.ps.gz + +USER_CONFIGURED_C_INTERFACE_HTML_DIR = \ +ppl-user-configured-c-interface-@VERSION@-html +DEVREF_CONFIGURED_C_INTERFACE_HTML_DIR = \ +ppl-devref-configured-c-interface-@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 + + +# Configuration Dependent Prolog Language Interface Manuals +if BUILD_SOME_PROLOG_INTERFACES + +USER_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL = \ +ppl-user-configured-prolog-interface-@VERSION@-html.tar.gz +DEVREF_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL = \ +ppl-devref-configured-prolog-interface-@VERSION@-html.tar.gz + +USER_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL = \ +ppl-user-configured-prolog-interface-@VERSION@.pdf +DEVREF_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL = \ +ppl-devref-configured-prolog-interface-@VERSION@.pdf + +USER_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL = \ +ppl-user-configured-prolog-interface-@VERSION@.ps.gz +DEVREF_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL = \ +ppl-devref-configured-prolog-interface-@VERSION@.ps.gz + +USER_CONFIGURED_PROLOG_INTERFACE_HTML_DIR = \ +ppl-user-configured-prolog-interface-@VERSION@-html +DEVREF_CONFIGURED_PROLOG_INTERFACE_HTML_DIR = \ +ppl-devref-configured-prolog-interface-@VERSION@-html + +USER_CONFIGURED_PROLOG_INTERFACE_STUFF = \ +$(DOX_LICENCE_FILES) \ +user-language-interface.tex \ +ppl.sty \ +$(top_builddir)/interfaces/Prolog/Prolog_configured_interface.dox + +DEVREF_CONFIGURED_PROLOG_INTERFACE_STUFF = \ +$(DOX_LICENCE_FILES) \ +devref-language-interface.tex \ +ppl.sty \ +$(top_builddir)/interfaces/Prolog/Prolog_configured_interface.dox \ +../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 + + +# Configuration Dependent OCaml Language Interface Manuals. +if BUILD_OCAML_INTERFACE + +USER_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL = \ +ppl-user-configured-ocaml-interface-@VERSION@-html.tar.gz +DEVREF_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL = \ +ppl-devref-configured-ocaml-interface-@VERSION@-html.tar.gz + +USER_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL = \ +ppl-user-configured-ocaml-interface-@VERSION@.pdf +DEVREF_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL = \ +ppl-devref-configured-ocaml-interface-@VERSION@.pdf + +USER_CONFIGURED_OCAML_INTERFACE_PS_MANUAL = \ +ppl-user-configured-ocaml-interface-@VERSION@.ps.gz +DEVREF_CONFIGURED_OCAML_INTERFACE_PS_MANUAL = \ +ppl-devref-configured-ocaml-interface-@VERSION@.ps.gz + +USER_CONFIGURED_OCAML_INTERFACE_HTML_DIR = \ +ppl-user-configured-ocaml-interface-@VERSION@-html +DEVREF_CONFIGURED_OCAML_INTERFACE_HTML_DIR = \ +ppl-devref-configured-ocaml-interface-@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 + +# Configuration Dependent Java Language Interface Manuals. +if BUILD_JAVA_INTERFACE + +USER_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL = \ +ppl-user-configured-java-interface-@VERSION@-html.tar.gz +DEVREF_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL = \ +ppl-devref-configured-java-interface-@VERSION@-html.tar.gz + +USER_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL = \ +ppl-user-configured-java-interface-@VERSION@.pdf +DEVREF_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL = \ +ppl-devref-configured-java-interface-@VERSION@.pdf + +USER_CONFIGURED_JAVA_INTERFACE_PS_MANUAL = \ +ppl-user-configured-java-interface-@VERSION@.ps.gz +DEVREF_CONFIGURED_JAVA_INTERFACE_PS_MANUAL = \ +ppl-devref-configured-java-interface-@VERSION@.ps.gz + +USER_CONFIGURED_JAVA_INTERFACE_HTML_DIR = \ +ppl-user-configured-java-interface-@VERSION@-html +DEVREF_CONFIGURED_JAVA_INTERFACE_HTML_DIR = \ +ppl-devref-configured-java-interface-@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 + +# Installation and uninstallation of HTML documentation. +install-html: + for ball in $(INSTALL_HTML_DOCS); do \ + test -f $$ball || test -f $(srcdir)/$$ball || $(MAKE) $$ball; \ + dir=`basename $$ball .tar.gz`; \ + $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$dir; \ + gunzip -c `if test -f $$ball; then echo .; else echo $(srcdir); fi`/$$ball | tar xf - ; \ + 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 || $(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. +install-ps: + $(mkinstalldirs) $(DESTDIR)$(psdir) + for file in $(INSTALL_PS_DOCS); do \ + test -f $$file || test -f $(srcdir)/$$file || $(MAKE) $$file; \ + $(INSTALL_DATA) `if test -f $$file; then echo .; else echo $(srcdir); fi`/$$file $(DESTDIR)$(psdir)/$$file; \ + done + +installdirs-ps: + $(mkinstalldirs) $(DESTDIR)$(psdir) + +uninstall-ps: + 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) $< + +devref.latex-dir: devref.doxyconf-latex $(DEVREF_CORE_STUFF) + rm -rf $@ + $(TEX_ENV) $(DOXYGEN) $< + +ppl-user-@VERSION@.pdf: user.latex-dir + $(TEX_ENV) make -C $< refman.pdf && mv -f $|ppl-user-@VERSION@-html.tag=../ppl-user-@VERSION@-html.tag|' + +SED_DEVREF_HTML_OPTION = $(SED_HTML_OPTION) \ +-e 's||ppl-devref-@VERSION@-html.tag=../ppl-devref-@VERSION@-html.tag|' + +SED_USER_LATEX_OPTION = \ +$(SED_LATEX_OPTION) \ +-e 's///' + +SED_DEVREF_LATEX_OPTION = \ +$(SED_LATEX_OPTION) \ +-e 's///' + +# C Language Interface Targets + +SED_C_OPTION = \ + -e 's//C/' \ + -e 's//c-interface/' \ + -e 's///' + +SED_C_INPUT_USER = \ +../interfaces/C/ppl_c_version.h \ +$(srcdir)/../interfaces/C/ppl_c_header.h \ +$(srcdir)/../interfaces/C/C_interface.dox \ +$(srcdir)/gpl.dox $(srcdir)/fdl.dox + +SED_C_INPUT_DEVREF = \ +../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 \ +$(srcdir)/gpl.dox $(srcdir)/fdl.dox + +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||'"$(SED_C_INPUT_USER)"'|' \ + $< > 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||'"$(SED_C_INPUT_DEVREF)"'|' \ + $< > Doxyfile.devref-c-interface-latex + $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-c-interface-latex + +ppl-user-c-interface-@VERSION@.pdf: user-c-interface.latex-dir + $(TEX_ENV) make -C $< refman.pdf && mv -f $ user-c-interface.tex + $(SED) $(SED_C_OPTION) $(SED_USER_HTML_OPTION) \ + -e 's||'"$(SED_C_INPUT_USER)"'|' \ + $< > Doxyfile.user-c-interface-html + $(TEX_ENV) $(DOXYGEN) Doxyfile.user-c-interface-html + (cd $@; $(INSTALLDOX) \ + -l $(USER_CORE_HTML_DIR).tag@../$(USER_CORE_HTML_DIR)) + +ppl-devref-c-interface-@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||'"$(SED_C_INPUT_DEVREF)"'|' \ + $< > Doxyfile.devref-c-interface-html + $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-c-interface-html + (cd $@; $(INSTALLDOX) \ + -l $(DEVREF_CORE_HTML_DIR).tag@../$(DEVREF_CORE_HTML_DIR)) + +# (System Independent) Prolog Language Interface Targets + +SED_PROLOG_OPTION = \ + -e 's//Prolog/' \ + -e 's//prolog-interface/' \ + -e 's///' + +SED_PROLOG_INPUT_USER = \ +$(srcdir)/../interfaces/Prolog/Prolog_interface.dox \ +$(srcdir)/gpl.dox $(srcdir)/fdl.dox + +SED_PROLOG_INPUT_DEVREF = \ +$(srcdir)/../interfaces/Prolog/Prolog_interface.dox \ +$(srcdir)/../interfaces/Prolog/ppl_prolog_common.defs.hh \ +$(srcdir)/../interfaces/Prolog/ppl_prolog_common.inlines.hh \ +$(srcdir)/../interfaces/Prolog/ppl_prolog_common.cc \ +$(srcdir)/gpl.dox $(srcdir)/fdl.dox + +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||'"$(SED_PROLOG_INPUT_USER)"'|' \ + $< > 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||'"$(SED_PROLOG_INPUT_DEVREF)"'|' \ + $< > Doxyfile.devref-prolog-interface-latex + $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-prolog-interface-latex + +ppl-user-prolog-interface-@VERSION@.pdf: user-prolog-interface.latex-dir + $(TEX_ENV) make -C $< refman.pdf && mv -f $ user-prolog-interface.tex + $(SED) $(SED_PROLOG_OPTION) $(SED_USER_HTML_OPTION) \ + -e 's||'"$(SED_PROLOG_INPUT_USER)"'|' \ + $< > Doxyfile.user-prolog-interface-html + $(TEX_ENV) $(DOXYGEN) Doxyfile.user-prolog-interface-html + (cd $@; $(INSTALLDOX) \ + -l $(USER_CORE_HTML_DIR).tag@../$(USER_CORE_HTML_DIR)) + +ppl-devref-prolog-interface-@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||'"$(SED_PROLOG_INPUT_DEVREF)"'|' \ + $< > Doxyfile.devref-prolog-interface-html + $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-prolog-interface-html + (cd $@; $(INSTALLDOX) \ + -l $(DEVREF_CORE_HTML_DIR).tag@../$(DEVREF_CORE_HTML_DIR)) + +# OCaml Language Interface Targets + +SED_OCAML_OPTION = \ + -e 's//OCaml/' \ + -e 's//ocaml-interface/' \ + -e 's//\\usepackage{ocamldoc}/' + +SED_OCAML_INPUT_USER = \ +$(srcdir)/../interfaces/OCaml/OCaml_interface.dox \ +$(srcdir)/gpl.dox $(srcdir)/fdl.dox + +SED_OCAML_INPUT_DEVREF = \ +$(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 \ +$(srcdir)/gpl.dox $(srcdir)/fdl.dox + +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||'"$(SED_OCAML_INPUT_USER)"'|' \ + $< > 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||'"$(SED_OCAML_INPUT_DEVREF)"'|' \ + $< > 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-@VERSION@.pdf: user-ocaml-interface.latex-dir + $(TEX_ENV) make -C $< refman.pdf && mv -f $ user-ocaml-interface.tex + $(SED) $(SED_OCAML_OPTION) $(SED_USER_HTML_OPTION) \ + -e 's||'"$(SED_OCAML_INPUT_USER)"'|' \ + $< > Doxyfile.user-ocaml-interface-html + $(TEX_ENV) $(DOXYGEN) Doxyfile.user-ocaml-interface-html + (cd $@; $(INSTALLDOX) \ + -l $(USER_CORE_HTML_DIR).tag@../$(USER_CORE_HTML_DIR)) + mkdir $@/ocamldoc + ocamldoc $(OCAMLDOC_HTML_OPTIONS) -d $@/ocamldoc \ + $(srcdir)/../interfaces/OCaml/ppl_ocaml_globals.mli + +ppl-devref-ocaml-interface-@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||'"$(SED_OCAML_INPUT_DEVREF)"'|' \ + $< > Doxyfile.devref-ocaml-interface-html + $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-ocaml-interface-html + (cd $@; $(INSTALLDOX) \ + -l $(DEVREF_CORE_HTML_DIR).tag@../$(DEVREF_CORE_HTML_DIR)) + mkdir $@/ocamldoc + ocamldoc $(OCAMLDOC_HTML_OPTIONS) -d $@/ocamldoc \ + $(srcdir)/../interfaces/OCaml/ppl_ocaml_globals.mli + +# Java Language Interface Targets + +SED_JAVA_OPTION = \ + -e 's//Java/' \ + -e 's//java-interface/' \ + -e 's///' + +SED_JAVA_INPUT_USER = \ +$(srcdir)/../interfaces/Java/parma_polyhedra_library \ +$(srcdir)/gpl.dox $(srcdir)/fdl.dox + +SED_JAVA_INPUT_DEVREF = \ +$(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 \ +$(srcdir)/gpl.dox $(srcdir)/fdl.dox + +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||'"$(SED_JAVA_INPUT_USER)"'|' \ + $< > 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||'"$(SED_JAVA_INPUT_DEVREF)"'|' \ + $< > Doxyfile.devref-java-interface-latex + $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-java-interface-latex + +ppl-user-java-interface-@VERSION@.pdf: user-java-interface.latex-dir + $(TEX_ENV) make -C $< refman.pdf && mv -f $ user-java-interface.tex + $(SED) $(SED_JAVA_OPTION) $(SED_USER_HTML_OPTION) \ + -e 's||'"$(SED_JAVA_INPUT_USER)"'|' \ + $< > Doxyfile.user-java-interface-html + $(TEX_ENV) $(DOXYGEN) Doxyfile.user-java-interface-html + (cd $@; $(INSTALLDOX) \ + -l $(USER_CORE_HTML_DIR).tag@../$(USER_CORE_HTML_DIR)) + +ppl-devref-java-interface-@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||'"$(SED_JAVA_INPUT_DEVREF)"'|' \ + $< > Doxyfile.devref-java-interface-html + $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-java-interface-html + (cd $@; $(INSTALLDOX) \ + -l $(DEVREF_CORE_HTML_DIR).tag@../$(DEVREF_CORE_HTML_DIR)) + +############################################################################ + +##### Configuration Dependent Language Interface Targets ##### + +# Configuration-Dependent C Language Interface Targets +if BUILD_C_INTERFACE + +SED_CONFIGURED_C_OPTION = \ + -e 's//Configured C/' \ + -e 's//configured-c-interface/' \ + -e 's///' + +SED_CONFIGURED_C_INPUT_USER = \ +$(srcdir)/../interfaces/C/C_interface.dox \ +../interfaces/C/ppl_c.h \ +$(srcdir)/gpl.dox $(srcdir)/fdl.dox + +SED_CONFIGURED_C_INPUT_DEVREF = \ +$(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 \ +$(srcdir)/gpl.dox $(srcdir)/fdl.dox +# 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||'"$(SED_CONFIGURED_C_INPUT_USER)"'|' \ + $< > 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||'"$(SED_CONFIGURED_C_INPUT_DEVREF)"'|' \ + $< > Doxyfile.devref-configured-c-interface-latex + $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-c-interface-latex + +ppl-user-configured-c-interface-@VERSION@.pdf: \ +user-configured-c-interface.latex-dir + $(TEX_ENV) make -C $< refman.pdf && mv -f $ user-configured-c-interface.tex + $(SED) $(SED_CONFIGURED_C_OPTION) $(SED_USER_HTML_OPTION) \ + -e 's||'"$(SED_CONFIGURED_C_INPUT_USER)"'|' \ + $< > Doxyfile.user-configured-c-interface-html + $(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-c-interface-html + (cd $@; $(INSTALLDOX) \ + -l $(USER_CORE_HTML_DIR).tag@../$(USER_CORE_HTML_DIR)) + +ppl-devref-configured-c-interface-@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||'"$(SED_CONFIGURED_C_INPUT_DEVREF)"'|' \ + $< > Doxyfile.devref-configured-c-interface-html + $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-c-interface-html + (cd $@; $(INSTALLDOX) \ + -l $(DEVREF_CORE_HTML_DIR).tag@../$(DEVREF_CORE_HTML_DIR)) + +endif BUILD_C_INTERFACE + +# Configuration-Dependent Prolog Language Interface Targets +if BUILD_SOME_PROLOG_INTERFACES + +SED_CONFIGURED_PROLOG_OPTION = \ + -e 's//Configured Prolog/' \ + -e 's//configured-prolog-interface/' \ + -e 's///' + +SED_CONFIGURED_PROLOG_INPUT_USER = \ +../interfaces/Prolog/Prolog_configured_interface.dox \ +$(srcdir)/gpl.dox $(srcdir)/fdl.dox + +SED_CONFIGURED_PROLOG_INPUT_DEVREF = \ +../interfaces/Prolog/Prolog_configured_interface.dox \ +$(srcdir)/../interfaces/Prolog/ppl_prolog_common.defs.hh \ +$(srcdir)/../interfaces/Prolog/ppl_prolog_common.inlines.hh \ +$(srcdir)/../interfaces/Prolog/ppl_prolog_common.cc \ +$(srcdir)/gpl.dox $(srcdir)/fdl.dox +# 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||'"$(SED_CONFIGURED_PROLOG_INPUT_USER)"'|' \ + $< > 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||'"$(SED_CONFIGURED_PROLOG_INPUT_DEVREF)"'|' \ + $< > Doxyfile.devref-configured-prolog-interface-latex + $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-prolog-interface-latex + +ppl-user-configured-prolog-interface-@VERSION@.pdf: \ +user-configured-prolog-interface.latex-dir + $(TEX_ENV) make -C $< refman.pdf && mv -f $ user-configured-prolog-interface.tex + $(SED) $(SED_CONFIGURED_PROLOG_OPTION) $(SED_USER_HTML_OPTION) \ + -e 's||'"$(SED_CONFIGURED_PROLOG_INPUT_USER)"'|' \ + $< > Doxyfile.user-configured-prolog-interface-html + $(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-prolog-interface-html + (cd $@; $(INSTALLDOX) \ + -l $(USER_CORE_HTML_DIR).tag@../$(USER_CORE_HTML_DIR)) + +ppl-devref-configured-prolog-interface-@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||'"$(SED_CONFIGURED_PROLOG_INPUT_DEVREF)"'|' \ + $< > Doxyfile.devref-configured-prolog-interface-html + $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-prolog-interface-html + (cd $@; $(INSTALLDOX) \ + -l $(DEVREF_CORE_HTML_DIR).tag@../$(DEVREF_CORE_HTML_DIR)) + +endif BUILD_SOME_PROLOG_INTERFACES + +# Configuration-Dependent OCaml Language Interface Targets +if BUILD_OCAML_INTERFACE + +SED_CONFIGURED_OCAML_OPTION = \ + -e 's//Configured OCaml/' \ + -e 's//configured-ocaml-interface/' \ + -e 's//\\usepackage{ocamldoc}/' + +SED_CONFIGURED_OCAML_INPUT_USER = \ +$(srcdir)/../interfaces/OCaml/OCaml_interface.dox \ +$(srcdir)/gpl.dox $(srcdir)/fdl.dox + +SED_CONFIGURED_OCAML_INPUT_DEVREF = \ +$(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 \ +$(srcdir)/gpl.dox $(srcdir)/fdl.dox + +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||'"$(SED_CONFIGURED_OCAML_INPUT_USER)"'|' \ + $< > 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||'"$(SED_CONFIGURED_OCAML_INPUT_DEVREF)"'|' \ + $< > 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-@VERSION@.pdf: \ +user-configured-ocaml-interface.latex-dir + $(TEX_ENV) make -C $< refman.pdf && mv -f $ user-configured-ocaml-interface.tex + $(SED) $(SED_CONFIGURED_OCAML_OPTION) $(SED_USER_HTML_OPTION) \ + -e 's||'"$(SED_CONFIGURED_OCAML_INPUT_USER)"'|' \ + $< > Doxyfile.user-configured-ocaml-interface-html + $(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-ocaml-interface-html + (cd $@; $(INSTALLDOX) \ + -l $(USER_CORE_HTML_DIR).tag@../$(USER_CORE_HTML_DIR)) + mkdir $@/ocamldoc + ocamldoc $(OCAMLDOC_HTML_OPTIONS) -d $@/ocamldoc \ + ../interfaces/OCaml/ppl_ocaml.mli + +ppl-devref-configured-ocaml-interface-@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||'"$(SED_CONFIGURED_OCAML_INPUT_DEVREF)"'|' \ + $< > Doxyfile.devref-configured-ocaml-interface-html + $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-ocaml-interface-html + (cd $@; $(INSTALLDOX) \ + -l $(DEVREF_CORE_HTML_DIR).tag@../$(DEVREF_CORE_HTML_DIR)) + 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//Configured Java/' \ + -e 's//configured-java-interface/' \ + -e 's///' + +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||'"$(SED_CONFIGURED_JAVA_INPUT_USER)"'|' \ + $< > 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||'"$(SED_CONFIGURED_JAVA_INPUT_DEVREF)"'|' \ + $< > 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-@VERSION@.pdf: \ +user-configured-java-interface.latex-dir + $(TEX_ENV) make -C $< refman.pdf && mv -f $ user-configured-java-interface.tex + $(SED) $(SED_CONFIGURED_JAVA_OPTION) $(SED_USER_HTML_OPTION) \ + -e 's||'"$(SED_CONFIGURED_JAVA_INPUT_USER)"'|' \ + $< > 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 + (cd $@; $(INSTALLDOX) \ + -l $(USER_CORE_HTML_DIR).tag@../$(USER_CORE_HTML_DIR)) + +ppl-devref-configured-java-interface-@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||'"$(SED_CONFIGURED_JAVA_INPUT_DEVREF)"'|' \ + $< > 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 + (cd $@; $(INSTALLDOX) \ + -l $(DEVREF_CORE_HTML_DIR).tag@../$(DEVREF_CORE_HTML_DIR)) + +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= \ +$(DIST_DOCS) \ +$(DOX_FILES) \ +README.doc \ +devref-language-interface.tex \ +devref.tex \ +fdl.tex \ +gpl.tex \ +interfaces-html.sed \ +interfaces-latex.sed \ +ppl.sty \ +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..087bbbd --- /dev/null +++ b/doc/Makefile.in @@ -0,0 +1,2150 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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. + +@SET_MAKE@ + +# Automake source file for the Parma Polyhedra Library. +# Copyright (C) 2001-2009 Roberto Bagnara +# +# This file is part of the Parma Polyhedra Library (PPL). +# +# The PPL is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# The PPL is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +# +# For the most up-to-date information see the Parma Polyhedra Library +# site: http://www.cs.unipr.it/ppl/ . +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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 = $(dist_man_MANS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in \ + $(srcdir)/devref-language-interface.doxyconf.in \ + $(srcdir)/devref.doxyconf-html.in \ + $(srcdir)/devref.doxyconf-latex.in \ + $(srcdir)/user-language-interface.doxyconf.in \ + $(srcdir)/user.doxyconf-html.in \ + $(srcdir)/user.doxyconf-latex.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_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_cxx_attribute_weak.m4 \ + $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \ + $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \ + $(top_srcdir)/m4/ac_cxx_float_exact_output.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_long_double_exact_output.m4 \ + $(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \ + $(top_srcdir)/m4/ac_cxx_remainder_bug.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/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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)/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 +SOURCES = +DIST_SOURCES = +man1dir = $(mandir)/man1 +am__installdirs = "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man3dir)" +man3dir = $(mandir)/man3 +NROFF = nroff +MANS = $(dist_man_MANS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +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@ +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@ +LIBGMP = @LIBGMP@ +LIBGMPXX = @LIBGMPXX@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBGMP = @LTLIBGMP@ +LTLIBGMPXX = @LTLIBGMPXX@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +MAKEINFO = @MAKEINFO@ +MD5SUM = @MD5SUM@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLC = @OCAMLC@ +OCAMLOPT = @OCAMLOPT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PPL_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_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@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +mlgmp_dir = @mlgmp_dir@ +ocamlc_root = @ocamlc_root@ +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@ +subdirs = @subdirs@ +swi_prolog = @swi_prolog@ +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@ +txtdir = $(docdir) +DOXYGEN = doxygen +INSTALLDOX = ./installdox -q +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) + + +##### Library Core Manuals (C++ Interface) ##### +USER_CORE_HTML_MANUAL = ppl-user-@VERSION@-html.tar.gz +DEVREF_CORE_HTML_MANUAL = ppl-devref-@VERSION@-html.tar.gz +USER_CORE_PDF_MANUAL = ppl-user-@VERSION@.pdf +DEVREF_CORE_PDF_MANUAL = ppl-devref-@VERSION@.pdf +USER_CORE_PS_MANUAL = ppl-user-@VERSION@.ps.gz +DEVREF_CORE_PS_MANUAL = ppl-devref-@VERSION@.ps.gz +USER_CORE_HTML_DIR = ppl-user-@VERSION@-html +DEVREF_CORE_HTML_DIR = ppl-devref-@VERSION@-html +DOX_LICENCE_FILES = \ +gpl.dox \ +fdl.dox + +DOX_FILES = \ +$(DOX_LICENCE_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) + + +##### Configuration Independent Language Interface Manuals ##### + +# C Language Interface Manuals +USER_C_INTERFACE_HTML_MANUAL = \ +ppl-user-c-interface-@VERSION@-html.tar.gz + +DEVREF_C_INTERFACE_HTML_MANUAL = \ +ppl-devref-c-interface-@VERSION@-html.tar.gz + +USER_C_INTERFACE_PDF_MANUAL = \ +ppl-user-c-interface-@VERSION@.pdf + +DEVREF_C_INTERFACE_PDF_MANUAL = \ +ppl-devref-c-interface-@VERSION@.pdf + +USER_C_INTERFACE_PS_MANUAL = \ +ppl-user-c-interface-@VERSION@.ps.gz + +DEVREF_C_INTERFACE_PS_MANUAL = \ +ppl-devref-c-interface-@VERSION@.ps.gz + +USER_C_INTERFACE_HTML_DIR = \ +ppl-user-c-interface-@VERSION@-html + +DEVREF_C_INTERFACE_HTML_DIR = \ +ppl-devref-c-interface-@VERSION@-html + +COMMON_C_INTERFACE_STUFF = \ +$(DOX_LICENCE_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 + + +# Prolog Language Interface Manuals +USER_PROLOG_INTERFACE_HTML_MANUAL = \ +ppl-user-prolog-interface-@VERSION@-html.tar.gz + +DEVREF_PROLOG_INTERFACE_HTML_MANUAL = \ +ppl-devref-prolog-interface-@VERSION@-html.tar.gz + +USER_PROLOG_INTERFACE_PDF_MANUAL = \ +ppl-user-prolog-interface-@VERSION@.pdf + +DEVREF_PROLOG_INTERFACE_PDF_MANUAL = \ +ppl-devref-prolog-interface-@VERSION@.pdf + +USER_PROLOG_INTERFACE_PS_MANUAL = \ +ppl-user-prolog-interface-@VERSION@.ps.gz + +DEVREF_PROLOG_INTERFACE_PS_MANUAL = \ +ppl-devref-prolog-interface-@VERSION@.ps.gz + +USER_PROLOG_INTERFACE_HTML_DIR = \ +ppl-user-prolog-interface-@VERSION@-html + +DEVREF_PROLOG_INTERFACE_HTML_DIR = \ +ppl-devref-prolog-interface-@VERSION@-html + +USER_PROLOG_INTERFACE_STUFF = \ +$(DOX_LICENCE_FILES) \ +user-language-interface.tex \ +ppl.sty \ +../interfaces/Prolog/Prolog_interface.dox + +DEVREF_PROLOG_INTERFACE_STUFF = \ +$(DOX_LICENCE_FILES) \ +devref-language-interface.tex \ +ppl.sty \ +../interfaces/Prolog/Prolog_interface.dox \ +../interfaces/Prolog/ppl_prolog_common.defs.hh \ +../interfaces/Prolog/ppl_prolog_common.inlines.hh \ +../interfaces/Prolog/ppl_prolog_common.cc + + +# OCaml Language Interface Manuals +USER_OCAML_INTERFACE_HTML_MANUAL = \ +ppl-user-ocaml-interface-@VERSION@-html.tar.gz + +DEVREF_OCAML_INTERFACE_HTML_MANUAL = \ +ppl-devref-ocaml-interface-@VERSION@-html.tar.gz + +USER_OCAML_INTERFACE_PDF_MANUAL = \ +ppl-user-ocaml-interface-@VERSION@.pdf + +DEVREF_OCAML_INTERFACE_PDF_MANUAL = \ +ppl-devref-ocaml-interface-@VERSION@.pdf + +USER_OCAML_INTERFACE_PS_MANUAL = \ +ppl-user-ocaml-interface-@VERSION@.ps.gz + +DEVREF_OCAML_INTERFACE_PS_MANUAL = \ +ppl-devref-ocaml-interface-@VERSION@.ps.gz + +USER_OCAML_INTERFACE_HTML_DIR = \ +ppl-user-ocaml-interface-@VERSION@-html + +DEVREF_OCAML_INTERFACE_HTML_DIR = \ +ppl-devref-ocaml-interface-@VERSION@-html + +USER_OCAML_INTERFACE_STUFF = \ +$(DOX_LICENCE_FILES) \ +user-language-interface.tex \ +ppl.sty \ +../interfaces/OCaml/OCaml_interface.dox \ +../interfaces/OCaml/ppl_ocaml_globals.mli + +DEVREF_OCAML_INTERFACE_STUFF = \ +$(DOX_LICENCE_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 + + +# Java Language Interface Manuals +USER_JAVA_INTERFACE_HTML_MANUAL = \ +ppl-user-java-interface-@VERSION@-html.tar.gz + +DEVREF_JAVA_INTERFACE_HTML_MANUAL = \ +ppl-devref-java-interface-@VERSION@-html.tar.gz + +USER_JAVA_INTERFACE_PDF_MANUAL = \ +ppl-user-java-interface-@VERSION@.pdf + +DEVREF_JAVA_INTERFACE_PDF_MANUAL = \ +ppl-devref-java-interface-@VERSION@.pdf + +USER_JAVA_INTERFACE_PS_MANUAL = \ +ppl-user-java-interface-@VERSION@.ps.gz + +DEVREF_JAVA_INTERFACE_PS_MANUAL = \ +ppl-devref-java-interface-@VERSION@.ps.gz + +USER_JAVA_INTERFACE_HTML_DIR = \ +ppl-user-java-interface-@VERSION@-html + +DEVREF_JAVA_INTERFACE_HTML_DIR = \ +ppl-devref-java-interface-@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_LICENCE_FILES) \ +user-language-interface.tex \ +ppl.sty \ +$(JAVA_INTERFACE_JAVA_FILES) + +DEVREF_JAVA_INTERFACE_STUFF = \ +$(DOX_LICENCE_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 Language Interface Manuals ##### + +# Configuration Dependent C Language Interface Manuals. +@BUILD_C_INTERFACE_TRUE@USER_CONFIGURED_C_INTERFACE_HTML_MANUAL = \ +@BUILD_C_INTERFACE_TRUE@ppl-user-configured-c-interface-@VERSION@-html.tar.gz + +@BUILD_C_INTERFACE_TRUE@DEVREF_CONFIGURED_C_INTERFACE_HTML_MANUAL = \ +@BUILD_C_INTERFACE_TRUE@ppl-devref-configured-c-interface-@VERSION@-html.tar.gz + +@BUILD_C_INTERFACE_TRUE@USER_CONFIGURED_C_INTERFACE_PDF_MANUAL = \ +@BUILD_C_INTERFACE_TRUE@ppl-user-configured-c-interface-@VERSION@.pdf + +@BUILD_C_INTERFACE_TRUE@DEVREF_CONFIGURED_C_INTERFACE_PDF_MANUAL = \ +@BUILD_C_INTERFACE_TRUE@ppl-devref-configured-c-interface-@VERSION@.pdf + +@BUILD_C_INTERFACE_TRUE@USER_CONFIGURED_C_INTERFACE_PS_MANUAL = \ +@BUILD_C_INTERFACE_TRUE@ppl-user-configured-c-interface-@VERSION@.ps.gz + +@BUILD_C_INTERFACE_TRUE@DEVREF_CONFIGURED_C_INTERFACE_PS_MANUAL = \ +@BUILD_C_INTERFACE_TRUE@ppl-devref-configured-c-interface-@VERSION@.ps.gz + +@BUILD_C_INTERFACE_TRUE@USER_CONFIGURED_C_INTERFACE_HTML_DIR = \ +@BUILD_C_INTERFACE_TRUE@ppl-user-configured-c-interface-@VERSION@-html + +@BUILD_C_INTERFACE_TRUE@DEVREF_CONFIGURED_C_INTERFACE_HTML_DIR = \ +@BUILD_C_INTERFACE_TRUE@ppl-devref-configured-c-interface-@VERSION@-html + +@BUILD_C_INTERFACE_TRUE@USER_CONFIGURED_C_INTERFACE_STUFF = \ +@BUILD_C_INTERFACE_TRUE@$(COMMON_C_INTERFACE_STUFF) \ +@BUILD_C_INTERFACE_TRUE@$(top_builddir)/interfaces/C/ppl_c.h + +@BUILD_C_INTERFACE_TRUE@DEVREF_CONFIGURED_C_INTERFACE_STUFF = \ +@BUILD_C_INTERFACE_TRUE@$(COMMON_C_INTERFACE_STUFF) \ +@BUILD_C_INTERFACE_TRUE@$(top_builddir)/interfaces/C/ppl_c.h \ +@BUILD_C_INTERFACE_TRUE@../interfaces/C/ppl_c_implementation_common.defs.hh \ +@BUILD_C_INTERFACE_TRUE@../interfaces/C/ppl_c_implementation_common.inlines.hh \ +@BUILD_C_INTERFACE_TRUE@../interfaces/C/ppl_c_implementation_common.cc + + +# Configuration Dependent Prolog Language Interface Manuals +@BUILD_SOME_PROLOG_INTERFACES_TRUE@USER_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL = \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-configured-prolog-interface-@VERSION@-html.tar.gz + +@BUILD_SOME_PROLOG_INTERFACES_TRUE@DEVREF_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL = \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-configured-prolog-interface-@VERSION@-html.tar.gz + +@BUILD_SOME_PROLOG_INTERFACES_TRUE@USER_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL = \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-configured-prolog-interface-@VERSION@.pdf + +@BUILD_SOME_PROLOG_INTERFACES_TRUE@DEVREF_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL = \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-configured-prolog-interface-@VERSION@.pdf + +@BUILD_SOME_PROLOG_INTERFACES_TRUE@USER_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL = \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-configured-prolog-interface-@VERSION@.ps.gz + +@BUILD_SOME_PROLOG_INTERFACES_TRUE@DEVREF_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL = \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-configured-prolog-interface-@VERSION@.ps.gz + +@BUILD_SOME_PROLOG_INTERFACES_TRUE@USER_CONFIGURED_PROLOG_INTERFACE_HTML_DIR = \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-configured-prolog-interface-@VERSION@-html + +@BUILD_SOME_PROLOG_INTERFACES_TRUE@DEVREF_CONFIGURED_PROLOG_INTERFACE_HTML_DIR = \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-configured-prolog-interface-@VERSION@-html + +@BUILD_SOME_PROLOG_INTERFACES_TRUE@USER_CONFIGURED_PROLOG_INTERFACE_STUFF = \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@$(DOX_LICENCE_FILES) \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@user-language-interface.tex \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl.sty \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@$(top_builddir)/interfaces/Prolog/Prolog_configured_interface.dox + +@BUILD_SOME_PROLOG_INTERFACES_TRUE@DEVREF_CONFIGURED_PROLOG_INTERFACE_STUFF = \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@$(DOX_LICENCE_FILES) \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@devref-language-interface.tex \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl.sty \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@$(top_builddir)/interfaces/Prolog/Prolog_configured_interface.dox \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/ppl_prolog_common.defs.hh \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/ppl_prolog_common.inlines.hh \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/ppl_prolog_common.cc \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@$(top_builddir)/interfaces/Prolog/ppl_prolog_domains.hh \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@$(top_builddir)/interfaces/Prolog/ppl_prolog_domains.cc.stamp + + +# Configuration Dependent OCaml Language Interface Manuals. +@BUILD_OCAML_INTERFACE_TRUE@USER_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL = \ +@BUILD_OCAML_INTERFACE_TRUE@ppl-user-configured-ocaml-interface-@VERSION@-html.tar.gz + +@BUILD_OCAML_INTERFACE_TRUE@DEVREF_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL = \ +@BUILD_OCAML_INTERFACE_TRUE@ppl-devref-configured-ocaml-interface-@VERSION@-html.tar.gz + +@BUILD_OCAML_INTERFACE_TRUE@USER_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL = \ +@BUILD_OCAML_INTERFACE_TRUE@ppl-user-configured-ocaml-interface-@VERSION@.pdf + +@BUILD_OCAML_INTERFACE_TRUE@DEVREF_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL = \ +@BUILD_OCAML_INTERFACE_TRUE@ppl-devref-configured-ocaml-interface-@VERSION@.pdf + +@BUILD_OCAML_INTERFACE_TRUE@USER_CONFIGURED_OCAML_INTERFACE_PS_MANUAL = \ +@BUILD_OCAML_INTERFACE_TRUE@ppl-user-configured-ocaml-interface-@VERSION@.ps.gz + +@BUILD_OCAML_INTERFACE_TRUE@DEVREF_CONFIGURED_OCAML_INTERFACE_PS_MANUAL = \ +@BUILD_OCAML_INTERFACE_TRUE@ppl-devref-configured-ocaml-interface-@VERSION@.ps.gz + +@BUILD_OCAML_INTERFACE_TRUE@USER_CONFIGURED_OCAML_INTERFACE_HTML_DIR = \ +@BUILD_OCAML_INTERFACE_TRUE@ppl-user-configured-ocaml-interface-@VERSION@-html + +@BUILD_OCAML_INTERFACE_TRUE@DEVREF_CONFIGURED_OCAML_INTERFACE_HTML_DIR = \ +@BUILD_OCAML_INTERFACE_TRUE@ppl-devref-configured-ocaml-interface-@VERSION@-html + +@BUILD_OCAML_INTERFACE_TRUE@USER_CONFIGURED_OCAML_INTERFACE_STUFF = \ +@BUILD_OCAML_INTERFACE_TRUE@$(USER_OCAML_INTERFACE_STUFF) \ +@BUILD_OCAML_INTERFACE_TRUE@$(top_builddir)/interfaces/OCaml/ppl_ocaml.mli + +@BUILD_OCAML_INTERFACE_TRUE@DEVREF_CONFIGURED_OCAML_INTERFACE_STUFF = \ +@BUILD_OCAML_INTERFACE_TRUE@$(DEVREF_OCAML_INTERFACE_STUFF) \ +@BUILD_OCAML_INTERFACE_TRUE@$(top_builddir)/interfaces/OCaml/ppl_ocaml.mli + + +# Configuration Dependent Java Language Interface Manuals. +@BUILD_JAVA_INTERFACE_TRUE@USER_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL = \ +@BUILD_JAVA_INTERFACE_TRUE@ppl-user-configured-java-interface-@VERSION@-html.tar.gz + +@BUILD_JAVA_INTERFACE_TRUE@DEVREF_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL = \ +@BUILD_JAVA_INTERFACE_TRUE@ppl-devref-configured-java-interface-@VERSION@-html.tar.gz + +@BUILD_JAVA_INTERFACE_TRUE@USER_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL = \ +@BUILD_JAVA_INTERFACE_TRUE@ppl-user-configured-java-interface-@VERSION@.pdf + +@BUILD_JAVA_INTERFACE_TRUE@DEVREF_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL = \ +@BUILD_JAVA_INTERFACE_TRUE@ppl-devref-configured-java-interface-@VERSION@.pdf + +@BUILD_JAVA_INTERFACE_TRUE@USER_CONFIGURED_JAVA_INTERFACE_PS_MANUAL = \ +@BUILD_JAVA_INTERFACE_TRUE@ppl-user-configured-java-interface-@VERSION@.ps.gz + +@BUILD_JAVA_INTERFACE_TRUE@DEVREF_CONFIGURED_JAVA_INTERFACE_PS_MANUAL = \ +@BUILD_JAVA_INTERFACE_TRUE@ppl-devref-configured-java-interface-@VERSION@.ps.gz + +@BUILD_JAVA_INTERFACE_TRUE@USER_CONFIGURED_JAVA_INTERFACE_HTML_DIR = \ +@BUILD_JAVA_INTERFACE_TRUE@ppl-user-configured-java-interface-@VERSION@-html + +@BUILD_JAVA_INTERFACE_TRUE@DEVREF_CONFIGURED_JAVA_INTERFACE_HTML_DIR = \ +@BUILD_JAVA_INTERFACE_TRUE@ppl-devref-configured-java-interface-@VERSION@-html + +@BUILD_JAVA_INTERFACE_TRUE@USER_CONFIGURED_JAVA_INTERFACE_STUFF = \ +@BUILD_JAVA_INTERFACE_TRUE@$(USER_JAVA_INTERFACE_STUFF) + +@BUILD_JAVA_INTERFACE_TRUE@DEVREF_CONFIGURED_JAVA_INTERFACE_STUFF = \ +@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. +@BUILD_C_INTERFACE_TRUE@INSTALL_C_INTERFACE_HTML_DOCS = $(USER_C_INTERFACE_HTML_MANUAL) +@BUILD_C_INTERFACE_TRUE@INSTALL_C_INTERFACE_PDF_DOCS = $(USER_C_INTERFACE_PDF_MANUAL) +@BUILD_C_INTERFACE_TRUE@INSTALL_C_INTERFACE_PS_DOCS = $(USER_C_INTERFACE_PS_MANUAL) +@BUILD_JAVA_INTERFACE_TRUE@INSTALL_JAVA_INTERFACE_HTML_DOCS = $(USER_JAVA_INTERFACE_HTML_MANUAL) +@BUILD_JAVA_INTERFACE_TRUE@INSTALL_JAVA_INTERFACE_PDF_DOCS = $(USER_JAVA_INTERFACE_PDF_MANUAL) +@BUILD_JAVA_INTERFACE_TRUE@INSTALL_JAVA_INTERFACE_PS_DOCS = $(USER_JAVA_INTERFACE_PS_MANUAL) +@BUILD_OCAML_INTERFACE_TRUE@INSTALL_OCAML_INTERFACE_HTML_DOCS = $(USER_OCAML_INTERFACE_HTML_MANUAL) +@BUILD_OCAML_INTERFACE_TRUE@INSTALL_OCAML_INTERFACE_PDF_DOCS = $(USER_OCAML_INTERFACE_PDF_MANUAL) +@BUILD_OCAML_INTERFACE_TRUE@INSTALL_OCAML_INTERFACE_PS_DOCS = $(USER_OCAML_INTERFACE_PS_MANUAL) +@BUILD_SOME_PROLOG_INTERFACES_TRUE@INSTALL_PROLOG_INTERFACE_HTML_DOCS = $(USER_PROLOG_INTERFACE_HTML_MANUAL) +@BUILD_SOME_PROLOG_INTERFACES_TRUE@INSTALL_PROLOG_INTERFACE_PDF_DOCS = $(USER_PROLOG_INTERFACE_PDF_MANUAL) +@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) + +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-user-@VERSION@-html.tag=../ppl-user-@VERSION@-html.tag|' + +SED_DEVREF_HTML_OPTION = $(SED_HTML_OPTION) \ +-e 's||ppl-devref-@VERSION@-html.tag=../ppl-devref-@VERSION@-html.tag|' + +SED_USER_LATEX_OPTION = \ +$(SED_LATEX_OPTION) \ +-e 's///' + +SED_DEVREF_LATEX_OPTION = \ +$(SED_LATEX_OPTION) \ +-e 's///' + + +# C Language Interface Targets +SED_C_OPTION = \ + -e 's//C/' \ + -e 's//c-interface/' \ + -e 's///' + +SED_C_INPUT_USER = \ +../interfaces/C/ppl_c_version.h \ +$(srcdir)/../interfaces/C/ppl_c_header.h \ +$(srcdir)/../interfaces/C/C_interface.dox \ +$(srcdir)/gpl.dox $(srcdir)/fdl.dox + +SED_C_INPUT_DEVREF = \ +../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 \ +$(srcdir)/gpl.dox $(srcdir)/fdl.dox + + +# (System Independent) Prolog Language Interface Targets +SED_PROLOG_OPTION = \ + -e 's//Prolog/' \ + -e 's//prolog-interface/' \ + -e 's///' + +SED_PROLOG_INPUT_USER = \ +$(srcdir)/../interfaces/Prolog/Prolog_interface.dox \ +$(srcdir)/gpl.dox $(srcdir)/fdl.dox + +SED_PROLOG_INPUT_DEVREF = \ +$(srcdir)/../interfaces/Prolog/Prolog_interface.dox \ +$(srcdir)/../interfaces/Prolog/ppl_prolog_common.defs.hh \ +$(srcdir)/../interfaces/Prolog/ppl_prolog_common.inlines.hh \ +$(srcdir)/../interfaces/Prolog/ppl_prolog_common.cc \ +$(srcdir)/gpl.dox $(srcdir)/fdl.dox + + +# OCaml Language Interface Targets +SED_OCAML_OPTION = \ + -e 's//OCaml/' \ + -e 's//ocaml-interface/' \ + -e 's//\\usepackage{ocamldoc}/' + +SED_OCAML_INPUT_USER = \ +$(srcdir)/../interfaces/OCaml/OCaml_interface.dox \ +$(srcdir)/gpl.dox $(srcdir)/fdl.dox + +SED_OCAML_INPUT_DEVREF = \ +$(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 \ +$(srcdir)/gpl.dox $(srcdir)/fdl.dox + +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//Java/' \ + -e 's//java-interface/' \ + -e 's///' + +SED_JAVA_INPUT_USER = \ +$(srcdir)/../interfaces/Java/parma_polyhedra_library \ +$(srcdir)/gpl.dox $(srcdir)/fdl.dox + +SED_JAVA_INPUT_DEVREF = \ +$(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 \ +$(srcdir)/gpl.dox $(srcdir)/fdl.dox + + +############################################################################ + +##### Configuration Dependent Language Interface Targets ##### + +# Configuration-Dependent C Language Interface Targets +@BUILD_C_INTERFACE_TRUE@SED_CONFIGURED_C_OPTION = \ +@BUILD_C_INTERFACE_TRUE@ -e 's//Configured C/' \ +@BUILD_C_INTERFACE_TRUE@ -e 's//configured-c-interface/' \ +@BUILD_C_INTERFACE_TRUE@ -e 's///' + +@BUILD_C_INTERFACE_TRUE@SED_CONFIGURED_C_INPUT_USER = \ +@BUILD_C_INTERFACE_TRUE@$(srcdir)/../interfaces/C/C_interface.dox \ +@BUILD_C_INTERFACE_TRUE@../interfaces/C/ppl_c.h \ +@BUILD_C_INTERFACE_TRUE@$(srcdir)/gpl.dox $(srcdir)/fdl.dox + +@BUILD_C_INTERFACE_TRUE@SED_CONFIGURED_C_INPUT_DEVREF = \ +@BUILD_C_INTERFACE_TRUE@$(srcdir)/../interfaces/C/C_interface.dox \ +@BUILD_C_INTERFACE_TRUE@../interfaces/C/ppl_c.h \ +@BUILD_C_INTERFACE_TRUE@$(srcdir)/../interfaces/C/ppl_c_implementation_common.cc \ +@BUILD_C_INTERFACE_TRUE@$(srcdir)/../interfaces/C/ppl_c_implementation_common.defs.hh \ +@BUILD_C_INTERFACE_TRUE@$(srcdir)/../interfaces/C/ppl_c_implementation_common.inlines.hh \ +@BUILD_C_INTERFACE_TRUE@$(srcdir)/gpl.dox $(srcdir)/fdl.dox + + +# Configuration-Dependent Prolog Language Interface Targets +@BUILD_SOME_PROLOG_INTERFACES_TRUE@SED_CONFIGURED_PROLOG_OPTION = \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ -e 's//Configured Prolog/' \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ -e 's//configured-prolog-interface/' \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ -e 's///' + +@BUILD_SOME_PROLOG_INTERFACES_TRUE@SED_CONFIGURED_PROLOG_INPUT_USER = \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/Prolog_configured_interface.dox \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@$(srcdir)/gpl.dox $(srcdir)/fdl.dox + +@BUILD_SOME_PROLOG_INTERFACES_TRUE@SED_CONFIGURED_PROLOG_INPUT_DEVREF = \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/Prolog_configured_interface.dox \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@$(srcdir)/../interfaces/Prolog/ppl_prolog_common.defs.hh \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@$(srcdir)/../interfaces/Prolog/ppl_prolog_common.inlines.hh \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@$(srcdir)/../interfaces/Prolog/ppl_prolog_common.cc \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@$(srcdir)/gpl.dox $(srcdir)/fdl.dox + + +# Configuration-Dependent OCaml Language Interface Targets +@BUILD_OCAML_INTERFACE_TRUE@SED_CONFIGURED_OCAML_OPTION = \ +@BUILD_OCAML_INTERFACE_TRUE@ -e 's//Configured OCaml/' \ +@BUILD_OCAML_INTERFACE_TRUE@ -e 's//configured-ocaml-interface/' \ +@BUILD_OCAML_INTERFACE_TRUE@ -e 's//\\usepackage{ocamldoc}/' + +@BUILD_OCAML_INTERFACE_TRUE@SED_CONFIGURED_OCAML_INPUT_USER = \ +@BUILD_OCAML_INTERFACE_TRUE@$(srcdir)/../interfaces/OCaml/OCaml_interface.dox \ +@BUILD_OCAML_INTERFACE_TRUE@$(srcdir)/gpl.dox $(srcdir)/fdl.dox + +@BUILD_OCAML_INTERFACE_TRUE@SED_CONFIGURED_OCAML_INPUT_DEVREF = \ +@BUILD_OCAML_INTERFACE_TRUE@$(srcdir)/../interfaces/OCaml/OCaml_interface.dox \ +@BUILD_OCAML_INTERFACE_TRUE@$(srcdir)/../interfaces/OCaml/ppl_ocaml_common.cc \ +@BUILD_OCAML_INTERFACE_TRUE@$(srcdir)/../interfaces/OCaml/ppl_ocaml_common.defs.hh \ +@BUILD_OCAML_INTERFACE_TRUE@$(srcdir)/../interfaces/OCaml/ppl_ocaml_common.inlines.hh \ +@BUILD_OCAML_INTERFACE_TRUE@$(srcdir)/gpl.dox $(srcdir)/fdl.dox + + +# Configuration-Dependent Java Language Interface Targets +@BUILD_JAVA_INTERFACE_TRUE@SED_CONFIGURED_JAVA_OPTION = \ +@BUILD_JAVA_INTERFACE_TRUE@ -e 's//Configured Java/' \ +@BUILD_JAVA_INTERFACE_TRUE@ -e 's//configured-java-interface/' \ +@BUILD_JAVA_INTERFACE_TRUE@ -e 's///' + +@BUILD_JAVA_INTERFACE_TRUE@SED_CONFIGURED_JAVA_INPUT_USER = \ +@BUILD_JAVA_INTERFACE_TRUE@$(SED_JAVA_INPUT_USER) \ +@BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library + +@BUILD_JAVA_INTERFACE_TRUE@SED_CONFIGURED_JAVA_INPUT_DEVREF = \ +@BUILD_JAVA_INTERFACE_TRUE@$(SED_JAVA_INPUT_DEVREF) \ +@BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library + +EXTRA_DIST = \ +$(DIST_DOCS) \ +$(DOX_FILES) \ +README.doc \ +devref-language-interface.tex \ +devref.tex \ +fdl.tex \ +gpl.tex \ +interfaces-html.sed \ +interfaces-latex.sed \ +ppl.sty \ +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 \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign doc/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +user.doxyconf-latex: $(top_builddir)/config.status $(srcdir)/user.doxyconf-latex.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +devref.doxyconf-latex: $(top_builddir)/config.status $(srcdir)/devref.doxyconf-latex.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +user.doxyconf-html: $(top_builddir)/config.status $(srcdir)/user.doxyconf-html.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +devref.doxyconf-html: $(top_builddir)/config.status $(srcdir)/devref.doxyconf-html.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +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: $(man1_MANS) $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ + else file=$$i; fi; \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 1*) ;; \ + *) ext='1' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ + done +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 1*) ;; \ + *) ext='1' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ + rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ + done +install-man3: $(man3_MANS) $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man3dir)" || $(MKDIR_P) "$(DESTDIR)$(man3dir)" + @list='$(man3_MANS) $(dist_man3_MANS) $(nodist_man3_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.3*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ + else file=$$i; fi; \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 3*) ;; \ + *) ext='3' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst"; \ + done +uninstall-man3: + @$(NORMAL_UNINSTALL) + @list='$(man3_MANS) $(dist_man3_MANS) $(nodist_man3_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.3*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 3*) ;; \ + *) ext='3' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " rm -f '$(DESTDIR)$(man3dir)/$$inst'"; \ + rm -f "$(DESTDIR)$(man3dir)/$$inst"; \ + done +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +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 $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(MANS) +installdirs: installdirs-local + for dir in "$(DESTDIR)$(man1dir)" "$(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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-data-local install-man + +install-dvi: install-dvi-am + +install-exec-am: + +install-info: install-info-am + +install-man: install-man1 install-man3 + +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 \ + 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 \ + 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 || $(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 || $(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. +install-ps: + $(mkinstalldirs) $(DESTDIR)$(psdir) + for file in $(INSTALL_PS_DOCS); do \ + test -f $$file || test -f $(srcdir)/$$file || $(MAKE) $$file; \ + $(INSTALL_DATA) `if test -f $$file; then echo .; else echo $(srcdir); fi`/$$file $(DESTDIR)$(psdir)/$$file; \ + done + +installdirs-ps: + $(mkinstalldirs) $(DESTDIR)$(psdir) + +uninstall-ps: + 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) $< + +devref.latex-dir: devref.doxyconf-latex $(DEVREF_CORE_STUFF) + rm -rf $@ + $(TEX_ENV) $(DOXYGEN) $< + +ppl-user-@VERSION@.pdf: user.latex-dir + $(TEX_ENV) make -C $< refman.pdf && mv -f $ user-c-interface.tex + $(SED) $(SED_C_OPTION) $(SED_USER_LATEX_OPTION) \ + -e 's||'"$(SED_C_INPUT_USER)"'|' \ + $< > 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||'"$(SED_C_INPUT_DEVREF)"'|' \ + $< > Doxyfile.devref-c-interface-latex + $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-c-interface-latex + +ppl-user-c-interface-@VERSION@.pdf: user-c-interface.latex-dir + $(TEX_ENV) make -C $< refman.pdf && mv -f $ user-c-interface.tex + $(SED) $(SED_C_OPTION) $(SED_USER_HTML_OPTION) \ + -e 's||'"$(SED_C_INPUT_USER)"'|' \ + $< > Doxyfile.user-c-interface-html + $(TEX_ENV) $(DOXYGEN) Doxyfile.user-c-interface-html + (cd $@; $(INSTALLDOX) \ + -l $(USER_CORE_HTML_DIR).tag@../$(USER_CORE_HTML_DIR)) + +ppl-devref-c-interface-@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||'"$(SED_C_INPUT_DEVREF)"'|' \ + $< > Doxyfile.devref-c-interface-html + $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-c-interface-html + (cd $@; $(INSTALLDOX) \ + -l $(DEVREF_CORE_HTML_DIR).tag@../$(DEVREF_CORE_HTML_DIR)) + +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||'"$(SED_PROLOG_INPUT_USER)"'|' \ + $< > 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||'"$(SED_PROLOG_INPUT_DEVREF)"'|' \ + $< > Doxyfile.devref-prolog-interface-latex + $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-prolog-interface-latex + +ppl-user-prolog-interface-@VERSION@.pdf: user-prolog-interface.latex-dir + $(TEX_ENV) make -C $< refman.pdf && mv -f $ user-prolog-interface.tex + $(SED) $(SED_PROLOG_OPTION) $(SED_USER_HTML_OPTION) \ + -e 's||'"$(SED_PROLOG_INPUT_USER)"'|' \ + $< > Doxyfile.user-prolog-interface-html + $(TEX_ENV) $(DOXYGEN) Doxyfile.user-prolog-interface-html + (cd $@; $(INSTALLDOX) \ + -l $(USER_CORE_HTML_DIR).tag@../$(USER_CORE_HTML_DIR)) + +ppl-devref-prolog-interface-@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||'"$(SED_PROLOG_INPUT_DEVREF)"'|' \ + $< > Doxyfile.devref-prolog-interface-html + $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-prolog-interface-html + (cd $@; $(INSTALLDOX) \ + -l $(DEVREF_CORE_HTML_DIR).tag@../$(DEVREF_CORE_HTML_DIR)) + +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||'"$(SED_OCAML_INPUT_USER)"'|' \ + $< > 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||'"$(SED_OCAML_INPUT_DEVREF)"'|' \ + $< > 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-@VERSION@.pdf: user-ocaml-interface.latex-dir + $(TEX_ENV) make -C $< refman.pdf && mv -f $ user-ocaml-interface.tex + $(SED) $(SED_OCAML_OPTION) $(SED_USER_HTML_OPTION) \ + -e 's||'"$(SED_OCAML_INPUT_USER)"'|' \ + $< > Doxyfile.user-ocaml-interface-html + $(TEX_ENV) $(DOXYGEN) Doxyfile.user-ocaml-interface-html + (cd $@; $(INSTALLDOX) \ + -l $(USER_CORE_HTML_DIR).tag@../$(USER_CORE_HTML_DIR)) + mkdir $@/ocamldoc + ocamldoc $(OCAMLDOC_HTML_OPTIONS) -d $@/ocamldoc \ + $(srcdir)/../interfaces/OCaml/ppl_ocaml_globals.mli + +ppl-devref-ocaml-interface-@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||'"$(SED_OCAML_INPUT_DEVREF)"'|' \ + $< > Doxyfile.devref-ocaml-interface-html + $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-ocaml-interface-html + (cd $@; $(INSTALLDOX) \ + -l $(DEVREF_CORE_HTML_DIR).tag@../$(DEVREF_CORE_HTML_DIR)) + 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||'"$(SED_JAVA_INPUT_USER)"'|' \ + $< > 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||'"$(SED_JAVA_INPUT_DEVREF)"'|' \ + $< > Doxyfile.devref-java-interface-latex + $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-java-interface-latex + +ppl-user-java-interface-@VERSION@.pdf: user-java-interface.latex-dir + $(TEX_ENV) make -C $< refman.pdf && mv -f $ user-java-interface.tex + $(SED) $(SED_JAVA_OPTION) $(SED_USER_HTML_OPTION) \ + -e 's||'"$(SED_JAVA_INPUT_USER)"'|' \ + $< > Doxyfile.user-java-interface-html + $(TEX_ENV) $(DOXYGEN) Doxyfile.user-java-interface-html + (cd $@; $(INSTALLDOX) \ + -l $(USER_CORE_HTML_DIR).tag@../$(USER_CORE_HTML_DIR)) + +ppl-devref-java-interface-@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||'"$(SED_JAVA_INPUT_DEVREF)"'|' \ + $< > Doxyfile.devref-java-interface-html + $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-java-interface-html + (cd $@; $(INSTALLDOX) \ + -l $(DEVREF_CORE_HTML_DIR).tag@../$(DEVREF_CORE_HTML_DIR)) +# FIXME add generated files + +@BUILD_C_INTERFACE_TRUE@user-configured-c-interface.latex-dir: \ +@BUILD_C_INTERFACE_TRUE@user-language-interface.doxyconf \ +@BUILD_C_INTERFACE_TRUE@$(USER_CONFIGURED_C_INTERFACE_STUFF) +@BUILD_C_INTERFACE_TRUE@ rm -rf $@ +@BUILD_C_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_C_OPTION) \ +@BUILD_C_INTERFACE_TRUE@ $(srcdir)/user-language-interface.tex \ +@BUILD_C_INTERFACE_TRUE@ > user-configured-c-interface.tex +@BUILD_C_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_C_OPTION) $(SED_USER_LATEX_OPTION) \ +@BUILD_C_INTERFACE_TRUE@ -e 's||'"$(SED_CONFIGURED_C_INPUT_USER)"'|' \ +@BUILD_C_INTERFACE_TRUE@ $< > Doxyfile.user-configured-c-interface-latex +@BUILD_C_INTERFACE_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-c-interface-latex + +@BUILD_C_INTERFACE_TRUE@devref-configured-c-interface.latex-dir: \ +@BUILD_C_INTERFACE_TRUE@devref-language-interface.doxyconf \ +@BUILD_C_INTERFACE_TRUE@$(DEVREF_CONFIGURED_C_INTERFACE_STUFF) +@BUILD_C_INTERFACE_TRUE@ rm -rf $@ +@BUILD_C_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_C_OPTION) \ +@BUILD_C_INTERFACE_TRUE@ $(srcdir)/devref-language-interface.tex \ +@BUILD_C_INTERFACE_TRUE@ > devref-configured-c-interface.tex +@BUILD_C_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_C_OPTION) $(SED_DEVREF_LATEX_OPTION) \ +@BUILD_C_INTERFACE_TRUE@ -e 's||'"$(SED_CONFIGURED_C_INPUT_DEVREF)"'|' \ +@BUILD_C_INTERFACE_TRUE@ $< > Doxyfile.devref-configured-c-interface-latex +@BUILD_C_INTERFACE_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-c-interface-latex + +@BUILD_C_INTERFACE_TRUE@ppl-user-configured-c-interface-@VERSION@.pdf: \ +@BUILD_C_INTERFACE_TRUE@user-configured-c-interface.latex-dir +@BUILD_C_INTERFACE_TRUE@ $(TEX_ENV) make -C $< refman.pdf && mv -f $ user-configured-c-interface.tex +@BUILD_C_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_C_OPTION) $(SED_USER_HTML_OPTION) \ +@BUILD_C_INTERFACE_TRUE@ -e 's||'"$(SED_CONFIGURED_C_INPUT_USER)"'|' \ +@BUILD_C_INTERFACE_TRUE@ $< > Doxyfile.user-configured-c-interface-html +@BUILD_C_INTERFACE_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-c-interface-html +@BUILD_C_INTERFACE_TRUE@ (cd $@; $(INSTALLDOX) \ +@BUILD_C_INTERFACE_TRUE@ -l $(USER_CORE_HTML_DIR).tag@../$(USER_CORE_HTML_DIR)) + +@BUILD_C_INTERFACE_TRUE@ppl-devref-configured-c-interface-@VERSION@-html: \ +@BUILD_C_INTERFACE_TRUE@devref-language-interface.doxyconf \ +@BUILD_C_INTERFACE_TRUE@$(DEVREF_CONFIGURED_C_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR) +@BUILD_C_INTERFACE_TRUE@ rm -rf $@ +@BUILD_C_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_C_OPTION) \ +@BUILD_C_INTERFACE_TRUE@ $(srcdir)/devref-language-interface.tex \ +@BUILD_C_INTERFACE_TRUE@ > devref-configured-c-interface.tex +@BUILD_C_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_C_OPTION) $(SED_DEVREF_HTML_OPTION) \ +@BUILD_C_INTERFACE_TRUE@ -e 's||'"$(SED_CONFIGURED_C_INPUT_DEVREF)"'|' \ +@BUILD_C_INTERFACE_TRUE@ $< > Doxyfile.devref-configured-c-interface-html +@BUILD_C_INTERFACE_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-c-interface-html +@BUILD_C_INTERFACE_TRUE@ (cd $@; $(INSTALLDOX) \ +@BUILD_C_INTERFACE_TRUE@ -l $(DEVREF_CORE_HTML_DIR).tag@../$(DEVREF_CORE_HTML_DIR)) +# FIXME: add appropriate generated files. + +@BUILD_SOME_PROLOG_INTERFACES_TRUE@user-configured-prolog-interface.latex-dir: \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@user-language-interface.doxyconf \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@$(USER_CONFIGURED_PROLOG_INTERFACE_STUFF) +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ rm -rf $@ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(SED) $(SED_CONFIGURED_PROLOG_OPTION) \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(srcdir)/user-language-interface.tex \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ > user-configured-prolog-interface.tex +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(SED) $(SED_CONFIGURED_PROLOG_OPTION) $(SED_USER_LATEX_OPTION) \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ -e 's||'"$(SED_CONFIGURED_PROLOG_INPUT_USER)"'|' \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ $< > Doxyfile.user-configured-prolog-interface-latex +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-prolog-interface-latex + +@BUILD_SOME_PROLOG_INTERFACES_TRUE@devref-configured-prolog-interface.latex-dir: \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@devref-language-interface.doxyconf \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@$(DEVREF_CONFIGURED_PROLOG_INTERFACE_STUFF) +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ rm -rf $@ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(SED) $(SED_CONFIGURED_PROLOG_OPTION) \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(srcdir)/devref-language-interface.tex \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ > devref-configured-prolog-interface.tex +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(SED) $(SED_CONFIGURED_PROLOG_OPTION) $(SED_DEVREF_LATEX_OPTION) \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ -e 's||'"$(SED_CONFIGURED_PROLOG_INPUT_DEVREF)"'|' \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ $< > Doxyfile.devref-configured-prolog-interface-latex +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-prolog-interface-latex + +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-configured-prolog-interface-@VERSION@.pdf: \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@user-configured-prolog-interface.latex-dir +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(TEX_ENV) make -C $< refman.pdf && mv -f $ user-configured-prolog-interface.tex +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(SED) $(SED_CONFIGURED_PROLOG_OPTION) $(SED_USER_HTML_OPTION) \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ -e 's||'"$(SED_CONFIGURED_PROLOG_INPUT_USER)"'|' \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ $< > Doxyfile.user-configured-prolog-interface-html +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-prolog-interface-html +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ (cd $@; $(INSTALLDOX) \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ -l $(USER_CORE_HTML_DIR).tag@../$(USER_CORE_HTML_DIR)) + +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-configured-prolog-interface-@VERSION@-html: \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@devref-language-interface.doxyconf \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@$(DEVREF_CONFIGURED_PROLOG_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR) +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ rm -rf $@ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(SED) $(SED_CONFIGURED_PROLOG_OPTION) \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(srcdir)/devref-language-interface.tex \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ > devref-configured-prolog-interface.tex +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(SED) $(SED_CONFIGURED_PROLOG_OPTION) $(SED_DEVREF_HTML_OPTION) \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ -e 's||'"$(SED_CONFIGURED_PROLOG_INPUT_DEVREF)"'|' \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ $< > Doxyfile.devref-configured-prolog-interface-html +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-prolog-interface-html +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ (cd $@; $(INSTALLDOX) \ +@BUILD_SOME_PROLOG_INTERFACES_TRUE@ -l $(DEVREF_CORE_HTML_DIR).tag@../$(DEVREF_CORE_HTML_DIR)) + +@BUILD_OCAML_INTERFACE_TRUE@user-configured-ocaml-interface.latex-dir: \ +@BUILD_OCAML_INTERFACE_TRUE@user-language-interface.doxyconf \ +@BUILD_OCAML_INTERFACE_TRUE@$(USER_CONFIGURED_OCAML_INTERFACE_STUFF) +@BUILD_OCAML_INTERFACE_TRUE@ rm -rf $@ +@BUILD_OCAML_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_OCAML_OPTION) \ +@BUILD_OCAML_INTERFACE_TRUE@ $(srcdir)/user-language-interface.tex \ +@BUILD_OCAML_INTERFACE_TRUE@ > user-configured-ocaml-interface.tex +@BUILD_OCAML_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_OCAML_OPTION) $(SED_USER_LATEX_OPTION) \ +@BUILD_OCAML_INTERFACE_TRUE@ -e 's||'"$(SED_CONFIGURED_OCAML_INPUT_USER)"'|' \ +@BUILD_OCAML_INTERFACE_TRUE@ $< > Doxyfile.user-configured-ocaml-interface-latex +@BUILD_OCAML_INTERFACE_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-ocaml-interface-latex +@BUILD_OCAML_INTERFACE_TRUE@ ocamldoc $(OCAMLDOC_LATEX_OPTIONS) -o $@/ocamldoc.tex \ +@BUILD_OCAML_INTERFACE_TRUE@ ../interfaces/OCaml/ppl_ocaml.mli + +@BUILD_OCAML_INTERFACE_TRUE@devref-configured-ocaml-interface.latex-dir: \ +@BUILD_OCAML_INTERFACE_TRUE@devref-language-interface.doxyconf \ +@BUILD_OCAML_INTERFACE_TRUE@$(DEVREF_CONFIGURED_OCAML_INTERFACE_STUFF) +@BUILD_OCAML_INTERFACE_TRUE@ rm -rf $@ +@BUILD_OCAML_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_OCAML_OPTION) \ +@BUILD_OCAML_INTERFACE_TRUE@ $(srcdir)/devref-language-interface.tex \ +@BUILD_OCAML_INTERFACE_TRUE@ > devref-configured-ocaml-interface.tex +@BUILD_OCAML_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_OCAML_OPTION) $(SED_DEVREF_LATEX_OPTION) \ +@BUILD_OCAML_INTERFACE_TRUE@ -e 's||'"$(SED_CONFIGURED_OCAML_INPUT_DEVREF)"'|' \ +@BUILD_OCAML_INTERFACE_TRUE@ $< > Doxyfile.devref-configured-ocaml-interface-latex +@BUILD_OCAML_INTERFACE_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-ocaml-interface-latex +@BUILD_OCAML_INTERFACE_TRUE@ ocamldoc $(OCAMLDOC_LATEX_OPTIONS) -o $@/ocamldoc.tex \ +@BUILD_OCAML_INTERFACE_TRUE@ ../interfaces/OCaml/ppl_ocaml.mli + +@BUILD_OCAML_INTERFACE_TRUE@ppl-user-configured-ocaml-interface-@VERSION@.pdf: \ +@BUILD_OCAML_INTERFACE_TRUE@user-configured-ocaml-interface.latex-dir +@BUILD_OCAML_INTERFACE_TRUE@ $(TEX_ENV) make -C $< refman.pdf && mv -f $ user-configured-ocaml-interface.tex +@BUILD_OCAML_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_OCAML_OPTION) $(SED_USER_HTML_OPTION) \ +@BUILD_OCAML_INTERFACE_TRUE@ -e 's||'"$(SED_CONFIGURED_OCAML_INPUT_USER)"'|' \ +@BUILD_OCAML_INTERFACE_TRUE@ $< > Doxyfile.user-configured-ocaml-interface-html +@BUILD_OCAML_INTERFACE_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-ocaml-interface-html +@BUILD_OCAML_INTERFACE_TRUE@ (cd $@; $(INSTALLDOX) \ +@BUILD_OCAML_INTERFACE_TRUE@ -l $(USER_CORE_HTML_DIR).tag@../$(USER_CORE_HTML_DIR)) +@BUILD_OCAML_INTERFACE_TRUE@ mkdir $@/ocamldoc +@BUILD_OCAML_INTERFACE_TRUE@ ocamldoc $(OCAMLDOC_HTML_OPTIONS) -d $@/ocamldoc \ +@BUILD_OCAML_INTERFACE_TRUE@ ../interfaces/OCaml/ppl_ocaml.mli + +@BUILD_OCAML_INTERFACE_TRUE@ppl-devref-configured-ocaml-interface-@VERSION@-html: \ +@BUILD_OCAML_INTERFACE_TRUE@devref-language-interface.doxyconf \ +@BUILD_OCAML_INTERFACE_TRUE@$(DEVREF_CONFIGURED_OCAML_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR) +@BUILD_OCAML_INTERFACE_TRUE@ rm -rf $@ +@BUILD_OCAML_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_OCAML_OPTION) \ +@BUILD_OCAML_INTERFACE_TRUE@ $(srcdir)/devref-language-interface.tex \ +@BUILD_OCAML_INTERFACE_TRUE@ > devref-configured-ocaml-interface.tex +@BUILD_OCAML_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_OCAML_OPTION) $(SED_DEVREF_HTML_OPTION) \ +@BUILD_OCAML_INTERFACE_TRUE@ -e 's||'"$(SED_CONFIGURED_OCAML_INPUT_DEVREF)"'|' \ +@BUILD_OCAML_INTERFACE_TRUE@ $< > Doxyfile.devref-configured-ocaml-interface-html +@BUILD_OCAML_INTERFACE_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-ocaml-interface-html +@BUILD_OCAML_INTERFACE_TRUE@ (cd $@; $(INSTALLDOX) \ +@BUILD_OCAML_INTERFACE_TRUE@ -l $(DEVREF_CORE_HTML_DIR).tag@../$(DEVREF_CORE_HTML_DIR)) +@BUILD_OCAML_INTERFACE_TRUE@ mkdir $@/ocamldoc +@BUILD_OCAML_INTERFACE_TRUE@ ocamldoc $(OCAMLDOC_HTML_OPTIONS) -d $@/ocamldoc \ +@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) + +@BUILD_JAVA_INTERFACE_TRUE@user-configured-java-interface.latex-dir: \ +@BUILD_JAVA_INTERFACE_TRUE@user-language-interface.doxyconf \ +@BUILD_JAVA_INTERFACE_TRUE@$(USER_CONFIGURED_JAVA_INTERFACE_STUFF) +@BUILD_JAVA_INTERFACE_TRUE@ rm -rf $@ +@BUILD_JAVA_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_JAVA_OPTION) \ +@BUILD_JAVA_INTERFACE_TRUE@ $(srcdir)/user-language-interface.tex \ +@BUILD_JAVA_INTERFACE_TRUE@ > user-configured-java-interface.tex +@BUILD_JAVA_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_JAVA_OPTION) $(SED_USER_LATEX_OPTION) \ +@BUILD_JAVA_INTERFACE_TRUE@ -e 's||'"$(SED_CONFIGURED_JAVA_INPUT_USER)"'|' \ +@BUILD_JAVA_INTERFACE_TRUE@ $< > Doxyfile.user-configured-java-interface-latex +@BUILD_JAVA_INTERFACE_TRUE@ echo "HIDE_UNDOC_MEMBERS = NO" \ +@BUILD_JAVA_INTERFACE_TRUE@ >> Doxyfile.user-configured-java-interface-latex +@BUILD_JAVA_INTERFACE_TRUE@ echo "EXCLUDE_PATTERNS = */Fake_Class_for_Doxygen*" \ +@BUILD_JAVA_INTERFACE_TRUE@ >> Doxyfile.user-configured-java-interface-latex +@BUILD_JAVA_INTERFACE_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-java-interface-latex + +@BUILD_JAVA_INTERFACE_TRUE@devref-configured-java-interface.latex-dir: \ +@BUILD_JAVA_INTERFACE_TRUE@devref-language-interface.doxyconf \ +@BUILD_JAVA_INTERFACE_TRUE@$(DEVREF_CONFIGURED_JAVA_INTERFACE_STUFF) +@BUILD_JAVA_INTERFACE_TRUE@ rm -rf $@ +@BUILD_JAVA_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_JAVA_OPTION) \ +@BUILD_JAVA_INTERFACE_TRUE@ $(srcdir)/devref-language-interface.tex \ +@BUILD_JAVA_INTERFACE_TRUE@ > devref-configured-java-interface.tex +@BUILD_JAVA_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_JAVA_OPTION) $(SED_DEVREF_LATEX_OPTION) \ +@BUILD_JAVA_INTERFACE_TRUE@ -e 's||'"$(SED_CONFIGURED_JAVA_INPUT_DEVREF)"'|' \ +@BUILD_JAVA_INTERFACE_TRUE@ $< > Doxyfile.devref-configured-java-interface-latex +@BUILD_JAVA_INTERFACE_TRUE@ echo "EXCLUDE_PATTERNS = */Fake_Class_for_Doxygen*" \ +@BUILD_JAVA_INTERFACE_TRUE@ >> Doxyfile.devref-configured-java-interface-latex +@BUILD_JAVA_INTERFACE_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-java-interface-latex + +@BUILD_JAVA_INTERFACE_TRUE@ppl-user-configured-java-interface-@VERSION@.pdf: \ +@BUILD_JAVA_INTERFACE_TRUE@user-configured-java-interface.latex-dir +@BUILD_JAVA_INTERFACE_TRUE@ $(TEX_ENV) make -C $< refman.pdf && mv -f $ user-configured-java-interface.tex +@BUILD_JAVA_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_JAVA_OPTION) $(SED_USER_HTML_OPTION) \ +@BUILD_JAVA_INTERFACE_TRUE@ -e 's||'"$(SED_CONFIGURED_JAVA_INPUT_USER)"'|' \ +@BUILD_JAVA_INTERFACE_TRUE@ $< > Doxyfile.user-configured-java-interface-html +@BUILD_JAVA_INTERFACE_TRUE@ echo "HIDE_UNDOC_MEMBERS = NO" \ +@BUILD_JAVA_INTERFACE_TRUE@ >> Doxyfile.user-configured-java-interface-html +@BUILD_JAVA_INTERFACE_TRUE@ echo "EXCLUDE_PATTERNS = */Fake_Class_for_Doxygen*" \ +@BUILD_JAVA_INTERFACE_TRUE@ >> Doxyfile.user-configured-java-interface-html +@BUILD_JAVA_INTERFACE_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-java-interface-html +@BUILD_JAVA_INTERFACE_TRUE@ (cd $@; $(INSTALLDOX) \ +@BUILD_JAVA_INTERFACE_TRUE@ -l $(USER_CORE_HTML_DIR).tag@../$(USER_CORE_HTML_DIR)) + +@BUILD_JAVA_INTERFACE_TRUE@ppl-devref-configured-java-interface-@VERSION@-html: \ +@BUILD_JAVA_INTERFACE_TRUE@devref-language-interface.doxyconf \ +@BUILD_JAVA_INTERFACE_TRUE@$(DEVREF_CONFIGURED_JAVA_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR) +@BUILD_JAVA_INTERFACE_TRUE@ rm -rf $@ +@BUILD_JAVA_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_JAVA_OPTION) \ +@BUILD_JAVA_INTERFACE_TRUE@ $(srcdir)/devref-language-interface.tex \ +@BUILD_JAVA_INTERFACE_TRUE@ > devref-configured-java-interface.tex +@BUILD_JAVA_INTERFACE_TRUE@ $(SED) $(SED_CONFIGURED_JAVA_OPTION) $(SED_DEVREF_HTML_OPTION) \ +@BUILD_JAVA_INTERFACE_TRUE@ -e 's||'"$(SED_CONFIGURED_JAVA_INPUT_DEVREF)"'|' \ +@BUILD_JAVA_INTERFACE_TRUE@ $< > Doxyfile.devref-configured-java-interface-html +@BUILD_JAVA_INTERFACE_TRUE@ echo "EXCLUDE_PATTERNS = */Fake_Class_for_Doxygen*" \ +@BUILD_JAVA_INTERFACE_TRUE@ >> Doxyfile.devref-configured-java-interface-html +@BUILD_JAVA_INTERFACE_TRUE@ $(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-java-interface-html +@BUILD_JAVA_INTERFACE_TRUE@ (cd $@; $(INSTALLDOX) \ +@BUILD_JAVA_INTERFACE_TRUE@ -l $(DEVREF_CORE_HTML_DIR).tag@../$(DEVREF_CORE_HTML_DIR)) + +############################################################################ + +# 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..57f95ff --- /dev/null +++ b/doc/README.doc @@ -0,0 +1,164 @@ +Copyright (C) 2001-2009 Roberto Bagnara +See below for the copying conditions. + +How To Get (More) PPL Documentation +=================================== + +Do you have all the documentation you need? If you don't or if you are +unsure, the following is for you. + +There are two versions of the Parma Polyhedra Library's documentation: + + + a `user' manual, containing all and only the information needed by + people wishing to use the library; + + a `devref' (developer reference) manual, also containing details + about the library implementation. + +Each of these versions can be obtained in several formats: + + + a PDF file suitable for browsing on the screen; + + a (gzipped) PostScript file suitable for printing; + + a (tarred and gzipped) collection of HTML pages suitable for browsing. + + +The Documentation You May Already Have +====================================== + +First of all, you may already have some documentation and all you need +to do is to find it. + +If you have downloaded a source (tar or zip) archive for PPL version +X.Y.Z, you will find in the doc subdirectory the following set of user +manuals: + + ppl-user-X.Y.Z.pdf + ppl-user-X.Y.Z.ps.gz + +If you have installed a binary RPM package, then you have the same set +of manuals. You can find them with the command `rpm -ql ppl' which +will print, among other things, something like + + /usr/share/doc/ppl-X.Y.Z + /usr/share/doc/ppl-X.Y.Z/README + /usr/share/doc/ppl-X.Y.Z/ppl-user-X.Y.Z.pdf + /usr/share/doc/ppl-X.Y.Z/ppl-user-X.Y.Z.ps.gz + + +The Documentation You May Download +================================== + +If you are using the latest released version of the library, you will +find all the documentation in all formats at +http://www.cs.unipr.it/ppl/Documentation/ . + + +The Documentation You May Build Yourself +======================================== + +When all else fails (which is the case, for example, when you are +using a 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@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://www.cs.unipr.it/ppl/Download/Git +[2] http://www.doxygen.org/ +[3] http://www.research.att.com/sw/tools/graphviz/ + + +-------- + +Copyright (C) 2001-2009 Roberto Bagnara + +This document describes the Parma Polyhedra Library (PPL). + +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.2 or +any later version published by the Free Software Foundation; with no +Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. +The license is included, in various formats, in the `doc' subdirectory +of each distribution of the PPL in files called `fdl.*'. + +The PPL is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 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 are called `gpl.*'. + +The PPL is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +If you have not received a copy of one or both the above mentioned +licenses along with the PPL, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. + +For the most up-to-date information see the Parma Polyhedra Library +site: http://www.cs.unipr.it/ppl/ . diff --git a/doc/definitions.dox b/doc/definitions.dox new file mode 100644 index 0000000..e493e03 --- /dev/null +++ b/doc/definitions.dox @@ -0,0 +1,4679 @@ +// Copyright (C) 2001-2009 Roberto Bagnara +// +// This document describes the Parma Polyhedra Library (PPL). +// +// Permission is granted to copy, distribute and/or modify this document +// under the terms of the GNU Free Documentation License, Version 1.1 or +// any later version published by the Free Software Foundation; with no +// Invariant Sections, with no Front-Cover Texts, and with no Back-Cover +// Texts. +// +// The PPL is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. +// +// The PPL is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// For the most up-to-date information see the Parma Polyhedra Library +// site: http://www.cs.unipr.it/ppl/ + +/*! + \defgroup PPL_CXX_interface C++ Language Interface + \brief + The core implementation of the Parma Polyhedra Library + is written in C++. + + See Namespace, Hierarchical and Compound indexes + for additional information about each single data type. +*/ + +/*! \mainpage General Information on the PPL +\section preamble The Main Features + +The Parma Polyhedra Library (PPL) is a modern C++ library for the +manipulation of numerical information that can be represented by +points in some \f$n\f$-dimensional vector space. For instance, one of +the key domains the PPL supports is that of rational convex polyhedra +(Section \ref convex_polys). Such domains +are employed in several systems for the analysis and verification of +hardware and software components, with applications spanning +imperative, functional and logic programming languages, synchronous +languages and synchronization protocols, real-time and hybrid systems. +Even though the PPL library is not meant to target a particular +problem, the design of its interface has been largely influenced by +the needs of the above class of applications. That is the reason why +the library implements a few operators that are more or less specific +to static analysis applications, while lacking some other operators +that might be useful when working, e.g., in the field of computational +geometry. + +The main features of the library are the following: +- it is user friendly: + you write x + 2*y + 5*z \<= 7 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 andthe 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 semantic geometric descriptor 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 simple classes: + - \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\ \endlink, + - \link Parma_Polyhedra_Library::Octagonal_Shape \c Octagonal_Shape\ \endlink, + - \link Parma_Polyhedra_Library::Box \c Box\ \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, + signed char, \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 compound classes, can be constructed +(also recursively) from all the GDs classes. +These include: + - \link Parma_Polyhedra_Library::Pointset_Powerset \c Pointset_Powerset\ \endlink, + - \link Parma_Polyhedra_Library::Partially_Reduced_Product Partially_Reduced_Product\ \endlink, + +where \c PS, \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 syntactic geometric descriptor is for defining, modifying +and inspecting a semantic GD. There are three kinds of +syntactic GDs: basic GDs, constraint GDs and +generator GDs. +Some of these are generic and some specific. +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 best upward approximation +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 generic PPL operations. + + +\subsection Generic_Operations_on_Semantic_Geometric_Descriptors Generic Operations on Semantic Geometric Descriptors + +